Linux の設定とか

昔は研究室のメインマシンとして使っていた Linux も、遠ざかってはや 6年… すっかり忘れてしまった。
でも鯖を立てるにあたって色々不便なので調べたりしたことをメモにする。
Ubuntu Server の固有の話も混ざっていると思うので、注意すること。

zsh の設定ファイルは、~/.zshenv になる。この中で ZDOTDIR を指定しても、ログインシェルでは適用されないので、source で読み込んでおくおと。

export ZDOTDIR=hogehoge
source $ZDOTDIR/.zshenv

最近は、LANG だけ設定しておけば他のロケール設定も勝手に変えてくれる。
あと便利なロケールとして、C.UTF-8 というのが登場したらしい。基本英語になるけど、UTF-8 の文字コードも認識してくれる。

今、自分のサーバに入っているロケールは、locale -a で見ることができる。
入れられるロケールは、/usr/share/i18n/SUPPORTED に記載されている。
特に、昔の設定ファイルを引っ張りだすと、ロケールの呼び名が変わっていることがあるので、たまにチェックする。

vim を入れただけでは、vi で起動しないので、alias することを忘れないようにする。

自宅にサーバを立てる 第3弾

Local Area Network
Local Area Network

一応、DMZ を設けてみた。
右図みたいな感じ。
詳しい設定は秘密だよ。

  • DB として、mysql をインストール。
    • mysql_secure_installation で初期設定。
    • test database はいらない
    • root の remote login は off にしても、ssh コンソールからは普通に使える
  • localhost のユーザー用DBを作る。
    • 権限付与。不要な権限を削除。そして適用。
      grant all privileges on databasename.* to username@localhost identified by "password";
      revoke all privileges on test.* from username@localhost;
      flush privileges;
    • で、該当ユーザーになって、
      mysql -u username(アカウント名と同じなら省略可) -p
      create database databasename;

      とすれば DB 自体は作成完了。
  • ヨソから DB の出力を持ってきた場合は、
    mysql databasename -p < sqlfile

外から sql 叩くのに、ssh の口を空けないためには、phpmyadmin とかを入れると良い。
apt-get installphpmyadmin
dbconfig-common yes

その後、/etc/phpmyadmin/apache.conf で /phpmyadmin を alias している行を任意のディレクトリへ変更すること。
また、最近のアップデートを当てたところ、/usr/share/phpmyadmin のディレクティブに Allow from 行を記載しないとアクセスできなくなってしまった。なんでやねん。

おまけ。
WordPress を移設した場合にも使える SQL 文集。 → WordPressで使える知ってると便利な13のSQL文 | Web活メモ帳
WordPress のリビジョン削除 → WordPress でリビジョンと自動保存を簡単に停止する方法 | ウェブル

自鯖のwebサーバ化

我が家のLAN
我が家のLAN

我が家では、web 公開にあたり、DMZ を設けたので、もはや左の構成では動作していないが、まぁ参考まで。

下記は、自鯖の公開にあたり修正中のメモ。

php 動かす。

a2enmod php5

ドメインで飛んできた時に、ユーザーディレクトリを DocumentRoot にする

具体的には、http://www.hadacchi.com/ で、/home/user/public_html を DocumentRoot として動作させる
VirtualHost または VirtualDocumentRoot あたりで Alias するらしい
ただし、DNS で引けないとダメ。

DNS サーバを立てる。

bind9 の設定

…前職では、職場のローカル DNS の管理してたのになぁ; さっぱり覚えとらん
master ファイルの名前の付け方は、自由にできるらしい。
最近は named.conf から import するのが主流っぽい。

bash は糞面倒くさいので、zsh 入れる。

ローカルの .zsh/.zshrc が動かないので改行コードを置換する。
vi しかエディタいれてなくて、tr は苦手なので vi で置換する。
vi::何かを改行に置換 - そらまめ備忘録 で C-v C-m で ^M を入力できることを知る。

named-checkconf が通っても、普通に起動しないことがあるので注意。例えばファイル名の指定ミスとか。

zone ファイルは、1 ファイル内に複数 zone を記載してもいいはずなのに、うまく動かなかったので、ちゃんと zone 毎に分ける。

例えば、192.168.1.1 に DNS もやってくれる R があったとして、192.168.1.2 = ns.hadacchi.com なる DNS を立てる時、
named.conf.local では次のように記載し、

zone "hadacchi.com" {
    type master
    file "hadacchi.db"
}
zone "1.168.192.in-addr.arpa" {
    type master
    file "1.168.192.db"
}

各 zone ファイルでは、

$TTL 86400
$ORIGIN hadacchi.com.  ; @ means $ORIGIN
@       IN      SOA     ns.hadacchi.com.       test.hadacchi.com.    (
        2012032701 ; serial
        86400      ; refresh
        1200       ; retry
        2419200    ; expire
        1200 )     ; minimum
        IN      NS      ns          ; NS is name server which defined as A record
        IN      A       192.168.1.2 ; short for above label
ns      IN      A       192.168.1.2 ; A record
www     IN      CNAME   ns          ; CNAME is alias

とか

$TTL 86400
$ORIGIN 1.168.192.in-addr.arpa.
@       IN      SOA     ns.hadacchi.com.       test.hadacchi.com     (
        2012032701 ; serial
        86400      ; refresh
        1200       ; retry
        2419200    ; expire
        1200 )     ; minimum
2       IN      PTR     ns.hadacchi.com.

とかいう感じ。

キャッシュは、named.conf.options で

options {
        directory "/var/cache/named";

        forwarders {
                192.168.1.1;
        };

        auth-nxdomain no;    # conform to RFC1035
        listen-on-v6 { any; };
};

とか。

PC に LAN 内の DNS を参照させる。

まず、自分で立てた DNS 自身が外のエントリよりも自分の持つエントリを優先するように設定。
DHCP を動かしている場合、DNS 設定も一緒に配信されてしまうので、クライアント側で弾く。
Ubuntu の場合、/etc/dhcp/etc/dhcp3 の下に
dhclient.conf というファイルがあるので、その中のrequest 行でDNSに関する記述をコメントアウトする。

request subnet-mask, broadcast-address, time-offset, routers,
#       domain-name, domain-name-servers, domain-search, host-name,
        netbios-name-servers, netbios-scope, interface-mtu,
        rfc3442-classless-static-routes, ntp-servers,
        dhcp6.domain-search, dhcp6.fqdn,
        dhcp6.name-servers, dhcp6.sntp-servers;

で、/etc/resolv.conf を書き換える

domain hadacchi.com
search hadacchi.com
nameserver 192.168.x.x
nameserver 192.168.x.1 # 元々の記述

それから、networking を restart

/etc/init.d/networking restart

これで、名前を引けるようになる。

自分の PC が参照する DNS をサーバにすれば、その PC からアクセスした時だけ hadacchi.com をローカルサーバに飛ばすことができるので、テスト用に良い。

VirtualHost の設定。

VirtualDocumentRoot と違って、静的に書くことになる。
しかし、他人に鯖を貸すことはあったとしても、web I/F で自動受付とかはやらないと思うので、これでいこう。
/etc/apache2/sites-available にある default を コピーして、hadacchi とでもしておく。
hadacchi を編集して、ドメイン名とドキュメントルートを追記する。

# Other diretive

<VirtualHost *:80>
    ServerAdmin mail@domain.com
    DocumentRoot /home/user/path
    ServerName subdomain.domain.com
</VirtualHost>

これで、subdomain.domain.com でアクセスされた時には、/home/user/path をドキュメントルートとして表示し、他のアクセスでは /var/www など元のドキュメントルートを表示されるよう設定できる。
この時、追加した内容を元の記述より上に記載すると、IP アドレスでアクセスされた時に subdomain 用のドキュメントルートが表示されるので注意。

www を外向けに空ける。

FTPS を外に向けて空ける

切れたセッションに再接続するために、screen を入れようと検索していたら、tmux を知る。

Terminal Multiplexer(tmux)の紹介|サイバーエージェント 公式エンジニアブログ
とか、
時代はGNU screenからtmuxへ - Dマイナー志向
が詳しい。上のリンクの設定では、 h の設定が重複しているので注意。

会社でも使えそうな、Windows 上での仮想デスクトップソフトを発見した。

Windowsに仮想デスクトップを設定、拡張機能も便利「VirtuaWin 4.3」
で紹介されている、VirtuaWin - Virtual Desktops for Windows が便利。
最初は、窓の杜 - 【REVIEW】WindowsのデスクトップをAndroid風に操作できるようにする「Blacksmith」で紹介されているソフトを試してみた。
このソフト、ランチャもついているのは良いのだが…
hotkey の変更ができないことと、一部のアプリケーションが全仮想デスクトップ上に残ることが不便なため、使うのを止めた。
今のところ、上の VirtuaWin は、Windows 7 SP1 では、問題なく動作しているので、しばらくこれを使うつもり。

妻のおばあちゃんがくれた、かえりちりめんがすげー美味い。貪り食っていたら、妻からキレられた。でもうまいし。

Ubuntu Server のインストール

ドハマりしたので、メモ。

  • USB メモリに焼いた Ubuntu server 11.10 からインストーラを起動したが、USB キーボード&マウスを認識しない
    → PS/2 キーボードは認識した。
  • Ubuntu server インストール後、Ubuntuが起動せず、busybox が起動する。
    エラーメッセージを見るに、HDD を認識していないような…?
    mount: Mounting /dev/disk/by-uuid/{なんかUUIDっぽい文字列} on /root failed: Device or resource busy
    RAID コントローラを積んでいない M/B (E45m1-I DELUXE) を使っているにも関わらず、
    One or more drives containing Serial ATA RAID configurations have been found. Do you wish to activate these RAID devices?
    などと表示されることと関連があるような予感がする。
    → HDD を前に使っていた時の RAID の array 構成情報が残っていることが原因かも? web の情報によれば、array 構成情報が残っていることにより、OS インストーラが正しく動作しないことがあるようだ。
    解決方法は、その RAID を構成したコントローラ上で、array を削除するなど。
  • sources.list が変
    Ubuntu Sources List Generator で作成。
    Ubuntu Branches の全て、Ubuntu Updates の Security と Updates、Canonical、Extras を選択。
  • 何故か、BIOS のスプラッシュ画面以外が出力されない。具体的には、grub4 での kernel 選択の画面から出力されない…
  • WLAN で、何故か AP とアソシエートできない。wpa-ssid の値をダブルクォートで括ってないからだろうか…?今度ためす。

自作PC 2号

E45M1-I DELUXE in ISK-100

先の記事で書いていた通り、

が届いた。

ケースは、作りがいいのか悪いのか…
HDD を取り付けするブラケットの部分が 4 本のネジで固定されていて、M/Bの背面の作りや HDD の形状に合わせて、向きを変えることができる。で、このネジを金属製のシャーシに取り付け、締めたところ、空回りした… ハイ、ネジ穴死んだー! 自作は 2 台目なものの、パーツの取扱なんて山ほどやっている私だが、こんなの初めてだーよ。
ケースが狭いのは前評判から分かっていたので、特に深く言及はしない。コードの取り回しはそれなりに苦労した。

マザボは、色々あった。
SATA ケーブルで、いつも取り外しが固いと思っていたコードを使ってみたところ、コネクタが抜けた。SATA コネクタが抜けた時のあの絶望感は凄い。戻そうと思って頑張ってみたけど、結局電極が曲がって折れてしまい、戻らなかった。まぁ、2台しか内蔵 HDD をインストールできないケースに、5 つもついている SATA コネクタは不要なので、問題ないことにする。
BIOS が GUI 仕様で、マウスが利く。マウスを使える BIOS は初めてだったので、驚いてしまった。
USB キーボード/マウス + Ubuntu Server インストールディスク on USB メモリ の組み合わせでインストールしようとしたら、上手くインストールできなかった。BIOS まではキーもマウスも動くのに、Ubuntu に入ると効かなかった。原因は調査中。どこかから PS/2 キーボードとマウスを調達するしかないか。

E45M1-I DELUXE in ISK-100
E45M1-I DELUXE in ISK-100

ISK-100
ISK-100

で、とりあえず HW だけインストールしたので写真を撮った。
インストールディスクから USB デバイスを認識しないのだけど、どうしようかしら…

Android カスタマイズ

Android のメモリを増量(?)する.
compcache 使ってもイマイチだったので,マニアックなことをしてみることにした.

前提.
root 化済. (rooted phone)
過去記事では Android 1.6 に戻しているが,その後に Android 2.2 にまた戻している.
カスタム ROM として, CyanogenMod-6.1.0-DS を導入済.
操作する PC は Windows 7 Prof. SP1 で, ADK とか adb は導入済. (adb version 1.0.26)

やること概略

hboot 書き換え.
kernel 変更.

###用意するもの

  • rootが取れていて, recovery を書き換え済な HT-03a .ない人は,手順書/Recoveryの変更 | Android Custom Cookbookとか見てやれば,なんとかなると思う.
  • Android SDK を導入済で, android-sdk-windows (win の場合) の tools と platform-tools に path を通した PC . Android マーケットのツールから root を取った人は,導入してないかも知れない. eclipse なんて複雑で重いソフトはいらない.全部 DOS で叩く.
  • microSD -> SD なるアダプタ.だいたいの microSD にアダプタはついてくるので,手元にあると思う.
  • SD カードが差さる,カードリーダ/ライタ.持ってない場合は,必ず,最初に下記の手順を全部読んで,必要なデータを microSD に入れておくこと.それでも,必ず何か入れるべきものを漏らすので,素直に用意しといた方がいいけど.

具体的手順

基本的には,とりあたまさんのおぼえがき: HT-03Aでまだまだ戦う (RAM増量編)を適用するだけ.
ただし,単に rooted なだけでは,fastboot が動作しないため,ちょっとハマる.
というか, fastboot を調べる所から,ハマる.
なので,具体的に書く.

  1. 手順書/SPL変更手順 | Android Custom Cookbook の通り,update.Engineering-SPL-HBOOT-1.33.2005-signed.zip をSDカードへコピー.
  2. 一旦電源を落としてから,Home+電源ボタンで,リカバリーモードに入る.
  3. RA のバージョンに依るけど, backup っぽい選択肢を選ぶ→ nandroid の backup っぽいのを選ぶ.
    hadacchi の導入している 1.7.0 の場合,
    [Backup/Restore] -> [Nand backup] -> Homeを押して実行
  4. 結構時間をかけて終わったら,さっきコピーしたzipを適用する.
    flash zip っぽいのを選ぶ.
    hadacchiの場合,
    [Flash zip from sdcard] -> [update.Engineering-SPL-HBOOT-1.] -> Homeで実行
  5. Home+戻るボタンで,reboot させる.トップメニューからの reboot では正しく反映されない.
  6. またリカバリーモードに入るので,[Power off] -> Home
  7. microSD へ, hboot-1.33.0013d.img と radio-2.22.27.08.img をコピー
  8. microSD を HT-03a に差して,ボリュームダウン+電源ボタンで起動
  9. USB で PC と接続する
  10. 戻るボタンで fastboot モードに入る
  11. コマンドプロンプトでとりあたまさんのおぼえがき: HT-03Aでまだまだ戦う (RAM増量編)にある hboot と radio の img を置いたフォルダに移動し,
    fastboot flash radio radio-2.22.27.08.img
    fastboot flash hboot hboot-1.33.0013d.img
    fastboot reboot-bootloader

    を実行.
  12. 同様に,
    fastboot erase system -w
    fastboot erase boot

    して端末の menu ボタンで電源断.
  13. microSD へ,とりあたまさんのおぼえがき: HT-03Aでまだまだ戦う (RAM増量編)にある Kernel 2.6.35.11 とやらをコピー.
  14. Home+電源 ボタンでリカバリーモード起動
  15. バックアップした nandroid のリストア.
    hadacchi の場合,
    [Backup/Restore] -> Nand restore -> なんかバージョンを選ぶ -> Home
  16. kernel 2.6.35.11 の zip を適用.
    hadacchi の場合,
    [Flash zip from sdcard] -> [boot-cm_2635.11_ds_32b_radio270] -> Home
  17. 再起動しておしまい.
    hadacchi の場合,
    [Reboot system now] -> Home

関係ないけど知ったこと

CM6.0 導入端末で,/sd-ext を書き込みできるよう / をremountしてからsd-extにuserinit.shを入れても,次回起動時に消される.
対処法として考えられるのは,init.dに入れてしまうことだが,なぜかcompcacheのサイズは変更されなかった.
adb shellで,compcache start <size>(KB単位) とすれば,サイズは変更できる.

FTPサーバでディレクトリ一覧を表示させない

ProFTPDの場合。
.ftpaccess を表示させたくないディレクトリへ作成。
ファイルの中身はこんな感じ。

<Limit DIRS>
    DenyAll
</Limit>

ただしこの設定を行なうと、親フォルダからそのディレクトリ自体を表示できなくなる。
Windows 標準の FTP クライアントの場合、
cd -- 不可
put -- 可能
具体的には、
put hogehoge.txt invisible_dir/hogehoge.txt
のように名前を直接指定して転送すれば、転送は可能。

twitterのspammerのfollowが多い

級にspammerが来始めたので,なんか炎上してた人をフォローしたせいか,大手画像サイトとかをフォローしたせいだろうなぁ.
で,私のfollowerリストから更に他の人に飛び火すると悪いので(もう遅いかも知れんが…),一旦非公開アカウントにしました.
spammerの自己紹介や行動には,一目見て分かるほど特徴が沢山あるので,非公開にしているうちに,自動blockするスクリプトを作ることにした.
これまでの経験上,誰かが私をfollowするのは,頻度が高くても1人/週程度なので,1週間を目処に解決を目指そう.

前提

  • 今借りているレンタルサバ上でwebに溢れているサンプルコードを動かそうとすると,モジュールが足りない
  • pythonのモジュールは,同じディレクトリに置けば動かんこともないが,twitter関係の操作に必要なモジュールを1から入れようとすると,依存関係のため入れるべきモジュールが多い上,それぞれのimport文に対応するよう配置しないといけないので大変すぎる.
  • 自宅PCは最近は1~2回/週しか立ち上げないので,それではspammerのやりたい放題

つーことで,新たな常時起動しているサバを用意するか,コードをある程度自作する必要があることが分かった.
とか思考を全部書いていくと時間が足りないので結論だけ書く.
Google AppEngineでpythonコードを動かすか,標準モジュールだけでpythonコードを動かすかの両睨みができる方法を取ることにする.
具体的には,標準モジュールだけでTwitter APIを操作できるようにしながらも,GAEの開発環境は用意し呼出し部は2パターン作った.

で,cronを使うよりも,twitterでfollowされる度に飛んでくる通知メールをGMailで受け取って,それをトリガーに動作させてみたいと思い,GAEに挑戦することにした.
追記: GAEだもの,GMail くらい直接触れるでしょ,なんて思い込みがあったが,触れないことが分かった.オーノー

GAEについて

pythonしか試していないのでpythonのことを書く.
Google AppEngine より,登録してSDKを落とす.
Windows版はmsiファイル,Linux版はただのzipファイル.
Win版は,C:\Program Files (x86)\Google\google_appengineへインストールされる.Linux版は,unzipして展開するだけ.
python2.5.x でないと動かない.

$ python (PATH)dev_appserver.py demos/guestbook

と実行すれば,サンプルが動作する.

guestbookと同じように,app.yamlとそこから呼び出されるpyファイルを配置すればOK.
制限をかけたい場合は,app.yamlの制限したいscriptを定義しているscript行の下あたりに,login: required (Googleアカウントでログインしてないとダメ) とか, login: admin (GAEの該当プロジェクトの管理者権限がないとダメ) とか書く.
GAEへアップロードするには,

$ python appcfg.py update project_name

とかする.
アクセス先は GAE の dashboard の application settings にあるが,http://application_name.appspot.com とかだと思う.
サンプルみたいに wsgiref.handlers.CGIHandler().run(application) で呼び出してもいいが,デバッグしたい時は,from google.appengine.ext.webapp import utilとインポートしておいて,util.run_wsgi_app(application)とすると,ブラウザ上にデバッグメッセージが表示される.
どうせ開発環境では,dev_appserver.pyを呼び出している窓にも同じメッセージが表示されるけど.
詳しくは,ユーティリティ関数 - Google App Engine - Google Codeとかを参照のこと.
あと,simplejsonとか,ちょっと欲しいモジュールは入っていたりするけど,oauthtwitterとかニッチなのはない.
外部ファイルからクラスをインポートしたい時は,同じフォルダにpyファイルを置いてimportすれば,開発環境では動く.GAE上では試してないので不明.

twitterAPIについて

仕様がよく変わるので,公式の最新のもの(英語)Documentation | Twitter Developersの REST API を見た方が早い.
BASIC認証はもう使えないらしいので,OAuth認証を使う覚悟をする.
情報取得系はGETで叩き,情報更新系はPOSTで叩くRESTful I/F.
応答はJSONかXML.
アクセストークンの発行が死ぬほど面倒くさいので,頑張る.私は,やる夫と Python で学ぶ Twitter の OAuth - YoshioriのBlogを参考にした.
どうせReadもWriteもやりたくなるので,Read/Writeは少なくともつけておく.
QUERYをトークンをキーに符号化したものを署名としてHTTPヘッダへ埋め込み,肝心のQUERYは上記の通りGETかPOSTで投げるので,二重に必要なことを忘れない.

で,上に記載のやる夫と Python で学ぶ Twitter の OAuth - YoshioriのBlogのソースコードを改変して作ったのがこんなクラス → py_twit.py 更新しました → twit_oauth.py
無駄に書いてるimportとかはそのうち消します.
なお,screen_nameをuser_idとする場合,idは文字列で渡すこと.
また,statuses/updateは同じ発言を2回書くと403を返す,など応答については各々調べること.

あんま関係ないが,pythonのこと調べてると,大学時代の同級生がたいてい出てくるので,よくビビる.
今回の案件では,コードの美しさというよく分からん評価軸について語っていたので,反映しなかった.

weblogの記事をSQL叩いて修正

前のblogが,何故か管理者ページから更新できなくなってしまったので,mysqlを勉強した.

update db_name set key=value where condition1;

where句で指定するエントリの特定キーだけアップデートできるんだ,と分かって安心した.
レンタルサーバ上で日本語の修正をするのは面倒そうだが,公開/非公開とか,日付変更とかなら問題ない.
日本語修正する場合は,ファイルからのリダイレクトでコマンド実行してやれば,なんとかなりそうな気がする.