サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
大谷翔平
yoshifumi.hateblo.jp
有名な 「15 Exercises for Learning a new Programming Language」でPythonの練習。1問目。 fork を使ったバージョン #!/usr/bin/env python2.5 import os import sys import signal import time pid = os.fork() if pid == 0: i = 1 while True: print i time.sleep(1) i = i + 1 sys.exit() else: while True: c = sys.stdin.read(1) if c == ' ': os.kill( pid, signal.SIGTERM ) sys.exit() Thread を使ったバージョン #!/usr/bin/env python2.5 import sys i
Linux上のワーキングコピーをTortoiseSVN と、コマンドライン版を両方使って作業すると、ワーキングコピーが勝手に新しいバージョンのフォーマットになってしまう。その結果以下のようなメッセージが出てくる。 This client is too old to work with working copyこの場合は、change-svn-wc-format.py というスクリプトでバージョンをダウングレードできる。 http://svn.apache.org/repos/asf/subversion/trunk/tools/client-side/change-svn-wc-format.py バージョンを1.4にしたいときは、使い方は以下のとおり $ python change-svn-wc-format.py /path/to/the/working/copy 1.4消えてしまうと
Postfixには、ウィルススキャン や アンチSPAM などをフィルターコンテンツフィルターという方法でプラグインできる。 その際に、amavisd-newや自分で作ったカスタムフィルターなどを組み合わせたいときには、複数のコンテンツフィルターを併せて設定すればよい。 カスタムのコンテンツフィルターを追加したいときには、Perlで書かれたトランスペアレントなコンテンツフィルター smtpprox を使うと便利。 今回はsmtpprox を2つ設定した場合の設定手順のログ。 最終的には以下のような感じ。 +-----------+ +----------------+ +-------------+ |Postfix:25 |=>|my_filter1:10024|=>|Postfix:10025|=> +-----------+ +----------------+ +---------
今までの非同期レプリケーションでは、同期完了前にマスターが死んだ場合に、データのロストが起きるが、MySQL5.5から導入された Semisynchronous Replication(半同期?)を使うと、スレーブ側のバイナリログの更新までが同期で行われるのでデータのロストの可能性がぐっと減る。今回はMySQL5.5.5_m3 というバージョンを使って検証した。 OSは、CentOS5.5-64bit。RPMはOracle のサイトからダウンロード。 MySQL-client-5.5.5_m3-1.rhel5.x86_64.rpm MySQL-server-5.5.5_m3-1.rhel5.x86_64.rpm MySQL-devel-5.5.5_m3-1.rhel5.x86_64.rpm MySQL-shared-compat-5.5.5_m3-1.rhel5.x86_64.rpmテスト
準備 SSLProxyEngine On #httpsのURLに転送ではなくてリバースプロキシーする場合には、Onにしておく RewriteEngine On #必ずOnにしておく RewriteLog "logs/rewrite_log" #デバッグに非常に便利 (/var/log/httpd/rewrite_log) RewriteLogLevel 9 #9が最高。ログが多すぎるときは1に。デバッグが終わったらコメントアウトしておく 条件文 GETリクエストで、/foo または /bar へのアクセスで、クエリーの中にABCが入っていたら。(NCは大文字・小文字区別しない。ORはOR条件) RewriteCond %{REQUEST_METHOD} GET RewriteCond %{REQUEST_URI} ^/foo$ [OR] RewriteCond %{REQUEST_URI}
自分用メモ。 #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <netdb.h> #include <string.h> #include <unistd.h> #include <ctype.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/ioctl.h> #include <sys/param.h> #include <sys/sysctl.h> #include <arpa/inet.h> #include <net/if.h> #include <net/if_arp.h> #include <net/route.h> #include <netinet/in.h> #include <netinet/if_ether
現状の確認 [root@centos5 ~]# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited max nice (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 4096 max locked memory (kbytes, -l) 32 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 max rt priority (-r) 0 stack size (kbytes, -s) 10240 cpu time
MySQL5.1からは、自作のストレージエンジンや自作の関数用のAPIが公開されている。 自作のストレージエンジンは気軽には作れないと思うが、自作の関数については検討の価値ありだと思う。 その際に役立つかもしれないデバッグ環境の構築メモ。 その前に、ここ の手順で、ソースを取得してデバッグオプション付きでMySQLをビルドしておく。 gdbでデバッグするには、下記のライブラリが「not stripped」でなければならない。そうじゃない場合は、glibcの再コンパイルが必要。CentOS5は「not stripped」なので問題ない。 # file -L /lib/libthread_db.so.1 /lib/libthread_db.so.1: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), for GNU/Lin
GeoIPを使えばできる。 インストール方法 CentOS # yum -y install GeoIP-devel GeoIP-data Ubuntu $ sudo apt-get install geoip-binperlからも使いたい場合は以下も。 # perl -MCPAN -e "install Geo::IP" 使い方 # geoiplookup www.yahoo.com GeoIP Country Edition: US, United States # perl -MGeo::IP -e 'print Geo::IP->new(GEOIP_STANDARD)->country_code_by_addr("123.123.123.123");' CN # perl -MGeo::IP -e 'print Geo::IP->new(GEOIP_STANDARD)->count
Pythonのお勉強を兼ねて、先日 Cで書いた C言語でprefork型のデーモンを書く(3): デーモン化 - Sleepless geek in Seattle をPythonに移植してみた。 条件分岐、ループ、関数定義、ファイル操作、fork、wait、シグナルハンドラ、連想配列、などなど短いプログラムだけど、いろいろな要素が入っているのでなかなか良いサンプルになった。 #!/usr/bin/env python import os import sys import signal import time MAX_CHILDREN=16 PID_FILE='/var/run/my_prefork_daemon.pid' hash_children={} def main(): #デーモン化 daemonize() #プロセスIDを書いておく write_pid() #シグナルハンドラ
CentOS5.1 上の Apache2.2のサンプル。libapreq2 を使用。 libapreq2 のインストールには、あらかじめEPELレポジトリの追加が必要。 # rpm -ivh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-1.noarch.rpm # yum install libapreq2-devel mod_mypost の作成 # apxs -g -n mypost # cd mypost # make # make install/etc/httpd/conf.d/mod_mypost.conf を以下のように作成 LoadModule mypost_module modules/mod_mypost.so <Location /mypost> SetHandler mypost
「Keepalived + LVS + CentOS4 でロードバランサー(DSR) - Sleepless geek in Seattle」あたりで、Keepalived を使ったCentOS のロードバランスは簡単にできるようになったが、Windows Server の設定はどうやるんだろうと調べてみたら、こんな素敵なエントリ を見つけた。 Windows Server 2008 上にこの通りの設定をやってみたがうまく行かない。どうやら、上記のエントリでは、Windows Server 2003 でのみ動作するようだ。 Windows Server 2000, 2003, 2008 でやり方がそれぞれ違うことが分かったのでここにログを残そう。 loopback インタフェースの追加(2000, 2003, 2008 共通) 概要を書くと、 新しいデバイスの追加 -> ネットワーク アダ
Cでハッシュテーブルを使いたくなったので、調べてみたら APR(Apache Portability Runtime) のハッシュテーブルのパフォーマンスが良いらしい。名前的に移植性も良さそうな気がする。 簡単な使い方を兼ねたサンプルをメモがわりに残す。プラットフォームはCentOS5.2。 #include <stdio.h> #include <string.h> #include <apr_hash.h> #define MAX_KEY_LENGTH 512 #define MAX_VAL_LENGTH 512 static apr_pool_t* pool; static apr_hash_t* hash; main(){ //おまじない apr_initialize(); apr_pool_create(&pool, NULL); hash = apr_hash_make(poo
prefork して、シグナルで綺麗に終了できるようになったので次はデーモン化する。デーモンをkill しやすいように プロセスIDをファイルに書いておくwrite_pid()関数と、デーモン化関数daemonize()を追加している。 my_prefork_daemon.c デーモン化の処理が入ったバージョンのソース #include <stdlib.h> #include <stdio.h> #include <string.h> #include <apr_hash.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <sys/wait.h> #include <signal.h> #define MAX_CHILDREN 16 //子プロセスの数 #define PID_FILE
1つの親プロセスとたくさんの子プロセスという構成。親プロセスに SIGTERM を送ると、すべての子プロセスをきれいに終了させた後で終了するようにシグナルハンドラを追加したサンプル。 my_prefork_signal.c シグナルハンドラ付きのソース #include <stdio.h> #include <string.h> #include <apr_hash.h> #include <sys/types.h> #include <unistd.h> #include <sys/wait.h> #include <signal.h> #define MAX_CHILDREN 16 //子プロセスの数 void kill_all_children(int); void signal_handler(int); // 子プロセスの管理にハッシュテーブルを使う static apr_poo
Cで書かれた prefork デーモン(daemon)のちょうど良いサンプルが見つからなかったので自分で書く。 ちょうど良いお手本がないので PerlのソースをCに移植した。 プラットフォームはCentOS5.2。 my_prefork.c ただの prefork のサンプル(デーモン化はしていない) #include <stdio.h> #include <string.h> #include <apr_hash.h> #include <sys/types.h> #include <unistd.h> #include <sys/wait.h> #define MAX_CHILDREN 16 //子プロセスの数 int main(void){ // 子プロセスの管理にハッシュテーブルを使う apr_pool_t* pool; apr_hash_t* hChildren; apr_ini
Google App Engine を Ubuntu8.04 上にセットアップしたときのメモ。本当に5分でできちゃうのですごく拍子抜けだった。(CentOS 5はPythonのバージョンが2.4.3なので、駄目かもしれない。) Download と インストール http://code.google.com/appengine/downloads.html から、Linux用のSDKをダウンロードして解凍。 $ cd ~ $ wget http://googleappengine.googlecode.com/files/google_appengine_1.1.7.zip $ unzip google_appengine_1.1.7.zip HeloWorld アプリケーションの作成 helloworld という名前でディレクトリを作成して、以後はこの中にファイルを作成していく。 $ c
Ubuntu というかDebian系では、Apacheモジュールの設定方法がRedhat系と若干ことなるのでメモ。 Debian系 /etc/apache2/mods-available 利用可能な(有効になっていない)モジュールの設定ファイルが入っている /etc/apache2/mods-enabled 有効化されたモジュールの設定ファイルのシンボリックリンクが入っている /etc/apache2/sites-available 利用可能な(有効になっていない)VirtualHostの設定ファイルが入っている /etc/apache2/sites-enabled 有効化されたVirtualHostの設定ファイルのシンボリックリンクが入っている つまり有効化したいときには、そのシンボリックリンクを ***-enabled の中に作成し、不要になったら、そのシンボリックリンクを削除する。
コマネチ大学数学科のような深夜番組を予約録画していると時々時間がずれていて非常に悲しいことになる。 かといって毎日番組表をチェックするのもめんどくさい。 そこで、Web::Scraper のお試しも兼ねて、番組表を見やすく加工して自分宛にメールするようにしてみた。(Web::Scraper は指定したWEBページの特定の部分を簡単に取り出すことができるライブラリ) http://tv.goo.ne.jp/ などはとても見やすいので、このサイトの番組表を使うことにした。 大まかな処理の流れとしては、プログラムに日付とキーワードを渡してやると、その日付の番組表の部分を抜き出し、自分の指定したキーワード部分を強調表示させた形でメールする、というもの。 必要なライブラリのインストール方法 以下のようにあらかじめライブラリをインストールしておく。 # cpan -i モジュール名 # cpan -i
Perl のワンライナーで、-a オプション(AWK風に使える)を使って以前書いた、「 いらないデーモンの一括削除 - Sleepless geek in Seattle」 を改良した。 いらないデーモンを指定して削除するのではなく、必要なデーモンを指定してそれ以外を削除するようにした。 以下を実行すると、atd crond iptables network postfix snmpd snmptrapd sshd syslog sysstat 以外のデーモンが、chkconfig の一覧から削除される。 # chkconfig --list|perl -anle '`chkconfig --del $F[0]` unless $F[0]=~m/^(atd|crond|iptables|network|postfix|snmpd|snmptrapd|sshd|syslog|sysstat)
CentOSの場合 install rpmforgeのレポジトリが入っていない人は以下の手順で追加 # wget http://dag.wieers.com/packages/rpmforge-release/rpmforge-release-0.3.6-1.el5.rf.i386.rpm # rpm -Uhv rpmforge-release-0.3.6-1.el5.rf.i386.rpm# yum install libevent memcached php-pecl-memcache 設定 /etc/php.ini を以下のように編集 session.save_handler = memcache session.save_path = "memcached.example.com:11211"/etc/sysconfig/memcached を以下のように適当に編集する。 PORT
http://asp.mi.hama-med.ac.jp/web/ のソースをほとんどそのままコピー。これを元に改造していく。 いつものように、 # apxs -g -n myoutputfilter mod_myoutputfilter.conf LoadModule myoutputfilter_module modules/mod_myoutputfilter.so SetOutputFilter MYOUTPUTFILTER myoutputfilter.c (本当に何もしないバージョン) #include "httpd.h" #include "http_config.h" #include "http_log.h" #include "apr_strings.h" #include "apr_general.h" #include "util_filter.h" #includ
Linuxサーバーを簡単にクラスタ化できるdrbdのインストールメモ。OSはCentOS4.5を使用。 インストール yum -y install drbd続いて、drbdのkernelモジュールのインストール yum -y install kernel-module-drbdこれだと、kernel-module-drbd が、kernelのバージョンが異なるものがインストールされてしまった。( modprobe drbd でエラーが出る。) uname -a すると、 「2.6.9-55.EL」なのに、インストールされるのは、「kernel-module-drbd-2.6.9-42.EL-0.7.21-1.c4」のように、「2.6.9-42」用のものがインストールされてしまい、kernelモジュールがロードされずにdrbdが起動できない。 そのため、 yum search kernel-
複数行にまたがる文字列置き換え 例: 以下から <select name="timezone"> <option value="a">... <option value="b">... <option value="c">... </select> ここまでをfooに置き換える。 以下は置き換えない。 <select name="other"> <option value="a">... <option value="b">... <option value="c">... </select>以下のスクリプトでok perl -p -0777 -i.bak -e "s#<select name=\"timezone\"([^(</select)]|.)*?</select>#foo#s;s/\.htm/.php/g;" test.txt --- <div> abc </div> def <
routeコマンドで追加した場合、リブート時に消えてしまう。設定ファイルに書くことで、毎回設定される。 /etc/sysconfig/network-scripts/route-DEVICE名のファイルに静的ルーティングを書いておく。 cat << 'HERE_EOF' > /etc/sysconfig/network-scripts/route-eth1 GATEWAY0=10.10.31.11 NETMASK0=255.255.255.255 ADDRESS0=10.10.31.100 HERE_EOF参照: 404 Not Found と思ったらうまくいかない。どうやら以下のように設定するとうまくいった。 /etc/sysconfig/network-scripts/route-eth0 192.168.100.0/24 via 10.0.0.201以下で確認。 # service
CDを入れて以下を実行。 # dd if=/dev/cdrom of=foo.isoまたは、以下のようにすれば、終了した際にメールが来る。 # dd if=/dev/cdrom of=foo.iso 2>&1 | mail メールアドレス -s "done."または、以下のようにすれば、終了した際にビープ音が鳴る。 とりあえず30回くらい鳴る。 # dd if=/dev/cdrom of=foo.iso ; perl -e 'while($i++<30){$|=1; print "\a"; select undef, undef, undef, 0.5 ;}'
iSCSI などを使うときはJumbo Frame化することでパフォーマンスアップが期待できる。 ただし、サーバー、クライアント、経由するSwitchやルータすべてが Jumbo Frame に対応していなければパケットは破棄されて到達できない。 一時的な設定変更であれば、以下のコマンドでその場で変更可能。 # ifconfig eth0 mtu 9000 # ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:12:3F:3F:08:75 inet addr:10.0.7.199 Bcast:10.0.255.255 Mask:255.255.0.0 inet6 addr: fe80::212:3fff:fe3f:875/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:9000 Metric:
メーリングリスト等でメールアドレスのサンプルで使うドメインは、 example.com と相場は決まっているけど、 http://www.example.com/ を見ると以下のように書いてある。 You have reached this web page by typing "example.com", "example.net", or "example.org" into your web browser. These domain names are reserved for use in documentation and are not available for registration. See RFC 2606, Section 3. ついでに、RFC2606 を見てみると、TLDとして以下の4つが予約されているのがわかって興味深かった。 .test 既存または新規のD
CentOS5.1で、setuidされたPerlのCGIを実行したところ、見慣れないエラーが出て失敗する。 Can’t do setuid (cannot exec sperl)ググったところ、どうやら、CentOSに付属されているperlでは、setuidされたCGIは実行できず、別途、setuid用のperlをインストールする必要があるとのこと。 インストールは簡単で以下のとおり。 # yum install perl-suidperlそして、CGIの1行目は、 #!/usr/bin/perlではなくて、 #!/usr/bin/suidperlにする。 ついでに、おまじないも書いておくと吉。 $< = $>; $( = $) = 0;
次のページ
このページを最初にブックマークしてみませんか?
『yoshifumi1975's diary』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く