2012年12月31日月曜日

ipレベルで支那からのアクセスを遮断

packageのnginxの場合、GeoIPが入ってないので使用したい場合はリコンパイルが必要。
それが面倒な場合は、支那のipアドレスをチェックしてiptablesで弾く方法もある。

iptablesが入ってなければ入れる

# Debian系
sudo apt-get install iptables
# RedHat系
sudo yum install iptables

怪しいアクセスのipアドレスから情報を取得

whois 124.237.121.117
...
inetnum:        124.236.0.0 - 124.239.255.255
netname:        CHINANET-HE
descr:          CHINANET hebei province network
descr:          China Telecom
descr:          No.31,jingrong street
descr:          Beijing 100032
country:        CN
...

遮断

sudo iptables -I INPUT -s 124.236.0.0/14 -j DROP

確認

sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  0.0.236.124.broad.sj.he.dynamic.163data.com.cn/14  anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

sudo iptables-save 
# Generated by iptables-save v1.4.12 on Wed Dec 19 16:12:42 2012
*filter
:INPUT ACCEPT [225:28595]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [156:236264]
-A INPUT -s 124.236.0.0/14 -j DROP
COMMIT
# Completed on Wed Dec 19 16:12:42 2012


2012年12月17日月曜日

aws-sdk for ruby

rubyでaws simpledbにアクセスする


require 'rubygems'
require 'aws-sdk'

sdb = AWS::SimpleDB.new(                                                                                                                                      
                   :access_key_id => 'XXX',
                   :secret_access_key => 'XXX'
                   )
domain = sdb.domains['domain']
items = AWS::SimpleDB::ItemCollection.new(domain)

items.each do |item|
  p item.attributes.to_h
end

2012年12月13日木曜日

朝鮮猿のアクセスを遮断

Yetiっていうbotがうざいくらいに徘徊してくる。
これNHNのbot。朝鮮botにアクセスされるのは気色悪さこの上ないのでブロックする。

whoisで朝鮮botのipアドレスから情報を調べる

whois 119.235.237.85
...
inetnum:        119.235.237.0 - 119.235.237.255
...

レンジは 119.235.237.0/24 であることが判明。

nginxのdenyに設定

http {
...
# fuck off NHN
deny 119.235.237.0/24;
...
}
コメント重要。どこをdenyにしたか一目瞭然。

2012年12月12日水曜日

geoipで支那朝鮮からのアクセスを遮断

nginxでgeoipを設定する

支那や朝鮮からのアクセスを遮断したい場合、ipアドレスを都度確認してdenyしてまわるのは面倒。
国単位である程度絞れるgeoip便利。
debianの場合。
nginxにgeoip_moduleが組み込まれてなければ、--with_geoip_moduleを付けて再構築する必要あり。

geoipツールインストール

sudo apt-get install libgeoip1 geoip-bin geoip-database 

最新のDBをダウンロード

cd /usr/share/GeoIP
sudo mv -i GeoIP.dat{,.orig}
sudo sh -c 'curl http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz | gzip -cd > GeoIP.dat'

nginx.conf修正

http {
...
    geoip_country /usr/share/GeoIP/GeoIP.dat;
    map $geoip_country_code $allowed_country {
        default  yes;
        CN no; 
        KR no;
        TW no;
    }
...

反映

sudo /etc/init.d/nginx configtest && sudo /etc/init.d/reload

2012年12月8日土曜日

ubuntu 12.04 に nginx をインストールする

ubuntu 12.04に最新のnginxをインストールする

環境

cat /etc/issue.net 
Ubuntu 12.04.1 LTS

uname -m 
x86_64

source.listにnginx repository追加

cat /etc/apt/sources.list.d/nginx.list 
deb http://nginx.org/packages/ubuntu/ quantal nginx
deb-src http://nginx.org/packages/ubuntu/ quantal nginx 

gpg keyインストール

curl http://nginx.org/keys/nginx_signing.key | sudo apt-key add -

nginxインストール

sudo apt-get update
apt-cache show nginx
Package: nginx
Version: 1.2.5-1~quantal
Architecture: amd64
Maintainer: Sergey Budnevitch <sb nginx.com="nginx.com">
Installed-Size: 903
Depends: libc6 (>= 2.14), libpcre3 (>= 8.10), libssl1.0.0 (>= 1.0.0), zlib1g (>= 1:1.1.4), lsb-base, adduser
Provides: httpd
Homepage: http://nginx.org
Priority: optional
Section: httpd
Filename: pool/nginx/n/nginx/nginx_1.2.5-1~quantal_amd64.deb
Size: 414310
SHA256: 2324bef695695d3f95effe0856bfa7634fa57146bac396b2c6132032ce10a1b2
SHA1: 3862cf4cde4a8712bce39c66d0b347e36559b803
MD5sum: 6b68b8d2aad83c024fc67083e20e95bf
Description: HTTP and reverse proxy server, as well as a mail proxy server
 written by Igor Sysoev
...
sudo apt-get install nginx


2012年12月4日火曜日

ruby update file

rubyでファイルを更新する場合

少し悩んだのでメモ。
テンポラリファイルを作って上書きをする手法

require 'tempfile'

orignal_file = '/var/tmp/original'
# オリジナルファイルのstatを取得
orignal_file_stat = File::stat(orignal_file)

basename = "sample"
# tempファイル作成
temp_file = Tempfile.new(basename, "/dev/shm")
# tempファイルのmode変更(デフォルト 0600)
File::chmod(orignal_file_stat.mode, temp_file.path)
# コンテンツ書き込み
temp_file.puts "contents"
# bufferを吐き出す
temp_file.flush
# diskへ書き込む
temp_file.fsync
# 移動(closeの前に移動する)
FileUtils.mv(temp_file.path, orignal_file)
# 閉じる(移動前に閉じるとGCで消される可能性有)
temp_file.close

ruby File.rename

rubyでファイルを移動する場合File.renameを使いますが、これデバイスを跨ぐと使えません。
/dev/shm にファイルを作って /usr/local/var/tmp に移動する場合エラーになる。
その場合は、File.moveを使用と書いてあったけど、ruby1.8以降では非推奨でFileUtils.mvを使用とのこと。



2012年11月28日水曜日

jetpack と xmlrpc 競合

wordpressのpluginを片っ端からインストールしていたらxmlrpcの戻り値(xml)がおかしくなりパースエラーが起きていた。
どうもjetpackの何かと競合しているようだったので一旦jetpackをdisableにしたら正常に戻った。
jetpackで提供しているrest apiを利用する様に変更した方がjetpackの便利ツールが使えて良さそう。

と、wordpressに書かずにbloggerに書く。

2012年11月21日水曜日

CloudFlare

無料のCDNってあるのかな?って調べたらあった。
CloudFlare

dnsのゾーンを変更するので、ここ登録してればそもそも aws route53 を使わなくてもOKだな。
ドメイン取って無料hostingでwordpressを動かしてcdnも無料でって凄い便利な時代になった。

--
cloudflareを通すと js の読み込み順が変更される感じがする。

2012年11月18日日曜日

日本語ドメイン

お名前.comの広告にやられて、470円で日本語ドメインを取得した。

日本語ドメインって punycode ってのに変換して dns 設定をやる必要があるの初めて知った。
変換はここで -> http://punycode.jp/ 

以前からawsを使っているので、ns は route53 を使うことにしてコンテンツは無料のホスティングを探してたら広告出ない、良いのがあったのでここを使う。

http://freehostingnoads.net

wordpress系はauto installerがあるのでさくっと設置完了。

とりあえず、wordpressに自動で2ちゃんの記事のパースをpostするようにしてみた。

 470円で独自ドメインサービスが開始できるのは安い。 一昔前なら考えられない。

2012年10月12日金曜日

2ちゃんのdatファイルをパースしてまとめるスクリプト

2ちゃんのdatファイルをパースするrubyスクリプト作成

https://github.com/psychobilly/site-ruby/blob/master/2chparser.rb


  • レス(>>¥d+)を元記事の直下に表示
  • urlリンクを変換(画像なら imgタグを追加等)



2012年10月11日木曜日

アカウントのコピー


アカウント名 = xxx

コピー元での作業


grep xxx /etc/passwd | sed "s/:x:/:$(sudo grep xxx /etc/shadow | awk -F: '{print $2}' | sed -e 's/\$/\\\$/g' | sed -e 's/\//\\\//g'):/"
結果を保持する

コピー先での作業

1. shadowファイルを無効化
sudo pwunconv
2. passwdファイル編集(コピー元でのコマンド出力を貼り付ける)
sudo vipw
3. shadowファイルを有効化
sudo pwconv
4. home diretory作成
mkdir /home/xxx && chmod xxx /home/xxx

2012年10月9日火曜日

nginx proxy: configを書き換えないでbackend serverをs-in/s-outする


このモジュールで出来る?

ngx_http_upstream_round_robin.patch:
Patch against bulit-in load balancer, which adds ability to control
status of the backend servers ("alive" / "down") on-the-fly without
modifications in nginx configuration.

http://labs.frickle.com/nginx_ngx_supervisord/README

2012年9月26日水曜日

debian6にsnmpdをインストール

debian5とdebian6ではsnmpdのパッケージの構成が変わりすんなりと移行がで
きない。
snmpwalkすると以下のエラーが大量に出る

Cannot adopt OID in ...

mibファイルが足りないようで snmp-mibs-downloader をインストールしたら
解決した。

まとめ
sudo apt-get install -y snmp snmpd snmp-mibs-downloader


test



--
My Emacs Files At GitHub

2012年9月11日火曜日

aws ec2インスタンスをリモートから再起動

ec2のインスタンスがcpu100%で張り付くことが多くなってきた。
構成見直すべきなのだけど繋がらなくなったら仕事中でもcliで再起動が出来ると良いなと思い調べた。
手順はこんな感じ

ツールのインストール

$ curl -O http://s3.amazonaws.com/ec2-downloads/ec2-api-tools.zip && unzip ec2-downloads/ec2-api-tools.zip
$ ln -s ec2-api-tools-1.5.6.1 ~/ec2-api-tools

setup

$ mkdir ~/.ec2
# 鍵と証明書をコピー
$ cp pk-xxx.pem cert-xxx.pem ~/.ec2/
$ chmod go-rwx ~/.ec2/*.pem
$ cat <<EOF >> ~/.bachrc
# AWS EC2
export JAVA_HOME=/usr/lib/jvm/java-1.6.0-openjdk
export EC2_PRIVATE_KEY=~/.ec2/pk-xxx.pem
export EC2_CERT=~/.ec2/cert-xxx.pem
export EC2_HOME=~/ec2-api-tools
# エンドポイントをTokyo リージョンにしておく
export EC2_URL=https://ec2.ap-northeast-1.amazonaws.com

export PATH=$EC2_HOME/bin:$PATH
EOF
$ . ~/.bachrc

region一覧を表示

$ ec2-describe-regions
REGION  eu-west-1       ec2.eu-west-1.amazonaws.com
REGION  sa-east-1       ec2.sa-east-1.amazonaws.com
REGION  us-east-1       ec2.us-east-1.amazonaws.com
REGION  ap-northeast-1  ec2.ap-northeast-1.amazonaws.com
REGION  us-west-2       ec2.us-west-2.amazonaws.com
REGION  us-west-1       ec2.us-west-1.amazonaws.com
REGION  ap-southeast-1  ec2.ap-southeast-1.amazonaws.com

インスタンス一覧表示

$ ec2-describe-instances
...

インスタンス再起動

$ ec2-reboot-instances -v インスタンス名
...
REQUEST ID      xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxxx

状態確認

$ ec2-describe-instance-status インスタンス名
INSTANCE       インスタンス名      ap-northeast-1b running 16      ok      ok      active  
SYSTEMSTATUS    reachability    passed  
INSTANCESTATUS  reachability    passed  


ruby framework

rubyのframework、何が一番使い勝手が良いのか色々と手を出してみた。
使ったことがあるのはrailsのみだったので、projectの雛形自動生成ができたりする機能は欲しいのだけど、railsほど大きくなくて良い。
sinatra単体だと小さすぎる。

良いのがあった、padrino
sinatraベースなのだけど、雛形生成ツールがあったりrailsのみしか触ったこと無い人間には取っ付き易い構成になっている。

project作成サンプル

padrino g project hooligans -t shoulda -e haml -c sass -s jquery -d sequel -b -a mysql2

管理画面作成

cd hooligans
padrino g admin
bundle install
padrino rake sq:migrate:auto

起動

padrino start

2012年9月6日木曜日

emacsでwindow-systemとversionを判定する

emacsのwindow systemをバージョンでフォントの設定を変更するlisp 

  • carbon emacs等から起動する場合は window-system に値が入る 
  • iterm上で起動する場合は window-system は nil 

window-systemに入る値はM-x emacs-versionで確認できる サンプル
GNU Emacs 23.3.1 (x86_64-apple-darwin, NS apple-appkit-1038.35) of 2011-03-10 on black.porkrind.org
この場合は ns が window-system にセットされている

 init.elに以下を追加する
(cond
 ((or (eq window-system 'ns) (eq window-system 'mac))
  (when (>= emacs-major-version 23)
    (set-face-attribute 'default nil
   :family "monaco"
   :height 140)
    (set-fontset-font
     (frame-parameter nil 'font)
     'japanese-jisx0208
     '("Hiragino Maru Gothic Pro" . "iso10646-1"))
    (set-fontset-font
     (frame-parameter nil 'font)
     'japanese-jisx0212
     '("Hiragino Maru Gothic Pro" . "iso10646-1"))
    (set-fontset-font
     (frame-parameter nil 'font)
     'mule-unicode-0100-24ff
     '("monaco" . "iso10646-1"))
    (setq face-font-rescale-alist
   '(("^-apple-hiragino.*" . 1.2)
     (".*osaka-bold.*" . 1.2)
     (".*osaka-medium.*" . 1.2)
     (".*courier-bold-.*-mac-roman" . 1.0)
     (".*monaco cy-bold-.*-mac-cyrillic" . 0.9)
     (".*monaco-bold-.*-mac-roman" . 0.9)
     ("-cdac$" . 1.3)
     )))))

2012年8月20日月曜日

linuxのmemory cachedを開放する

sysctl -w vm.drop_caches=3

数値の意味は、
1 = ページキャッシュ解放
2 = ダーティキャッシュ、inode解放
3 = ページキャッシュとダーティキャッシュ、inode解放

2012年8月5日日曜日

ntpdate設定

centosで時刻同期
sudo yum install ntpdate
cat <<EOF >> /etc/ntp/step-tickers
server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp
EOF
sudo /etc/init.d/ntpdate start
sudo chkconfig ntpdate on

iptablesで80と443を許可する

centosはデフォルトでは80,443はiptablesで弾く(設定されてない)ので設定を入れる /etc/sysconfig/iptables の編集
-A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW --dport 443 -j ACCEPT
iptables再起動
sudo /etc/init.d/iptables restart

2012年7月24日火曜日

2012年7月18日水曜日

セルモーター下さい



あなたのバイクのセルモーターを僕に下さい。
何故にセルを使わない?

2012年7月14日土曜日

virtualboxのvmにディスク追加

vmのdiskが溢れそうになったので追加する。 ストレージ > IDEコントローラ > ハードディスクの追加 で適当なボリュームを作成。 vmを起動してdmesgで割り当てられたデバイス名を確認
dmesg | grep Attached
...
[    0.885807] sd 0:0:1:0: [sdb] Attached SCSI disk
fdiskでパーティション作成(男の1パーティション)
sudo fdsik /dev/sdb
ファイルシステム初期化 男の1パーティションなのでsdb1がfdiskの操作できている
sudo mkfd.ext4 /dev/sdb1
fstab編集してmount
sudo sh -c "cat <<EOF >> /etc/fstab
/dev/sdb /path/to/xxx               ext4    errors=remount-ro 0       1
EOF
"
sudo mkdir /path/to/xxx
sudo mount -a
df
...
/dev/sdb              10321208   1910284   7886636  20% /path/to/xxx

2012年7月8日日曜日

nginx build

awsのamiにnginxをsource buildするために手持ちのcentosでbuildテスト。

インストールスクリプト
https://github.com/psychobilly/nginx/blob/master/centos/nginx-source-build


/usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.2.2
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-file-aio --with-http_addition_module --with-http_geoip_module --with-http_gzip_static_module --with-http_image_filter_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_stub_status_module --with-http_ssl_module --with-http_sub_module --with-http_xslt_module --with-ipv6 --with-sha1=/usr/include/openssl --with-md5=/usr/include/openssl --add-module=/var/tmp/nginx/modules/ngx_devel_kit --add-module=/var/tmp/nginx/modules/chunkin-nginx-module --add-module=/var/tmp/nginx/modules/echo-nginx-module --add-module=/var/tmp/nginx/modules/lua-nginx-module --add-module=/var/tmp/nginx/modules/headers-more-nginx-module --add-module=/var/tmp/nginx/modules/nginx-upstream-fair

2012年7月7日土曜日

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

閉じた環境でipアドレスを付け替えたりするとsshの認証で文句言われて面倒

ssh 10.x.x.x
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
3d:97:51:10:7e:35:73:95:36:df:b4:a2:78:c3:80:57.
Please contact your system administrator.
Add correct host key in /home/xxx/.ssh/known_hosts to get rid of this message.
Offending key in /home/xxx/.ssh/known_hosts:22
RSA host key for 10.x.x.x has changed and you have requested strict checking.
Host key verification failed.

そんなときは ~/.ssh/config に以下を追加しておけばok

cat <<EOF >> ~/.ssh/config
Host 10.*
  UserKnownHostsFile /dev/null

2012年6月21日木曜日

dpkg --configure -a

debianで未設定のパッケージを再設定する

dpkg --configure -a

2012年6月16日土曜日

2012年5月31日木曜日

php で var_dump が使えない

var_dumpでdebugしようとしたら何も出力されない。 なんでだ~と /etc/php5/cli/php.ini を眺めてたら、あった
disable_functions = var_dump, print_r
これか

2012年5月3日木曜日

死ぬまでに一度は訪れたい、寺門ジモンの「取材拒否の店」55店総まとめ - NAVER まとめ

死ぬまでに一度は訪れたい、寺門ジモンの「取材拒否の店」55店総まとめ - NAVER まとめ
これは行ってみたいところばかり。


なんとなく、個人的に好きな店を幾つか羅列してみる。


光家(ラーメン)
家系ラーメンだけど比較的あっさりしていて癖になる味
















まえだや(ジンギスカン)
ラム肉旨い!と初めて思わせてくれた店。臭い無し、島ラッキョウも絶品















アルペンジロー(スープカレー)
コクが凄い。















聖林館(ピザ)
塩加減が絶妙。
















萬来亭(中華)
上海焼きそばが逸品。店員は無愛想。


















awsにredisをインストール

curl -O http://redis.googlecode.com/files/redis-2.4.13.tar.gz
tar xvzf redis-2.4.13.tar.gz
cd redis-2.4.13
make
sudo mkdir /etc/redis /var/lib/redis
sudo cp src/redis-server src/redis-cli /usr/local/bin
sudo cp redis.conf /etc/redis
sudo emacs /etc/redis/redis.conf
curl -O https://raw.github.com/gist/257849/9f1e627e0b7dbe68882fa2b7bdb1b2b263522004/redis-server
emacs redis-server
sudo mv -i  redis-server  /etc/init.d/
sudo chmod +x /etc/init.d/redis-server
sudo chkconfig --add redis-server
chkconfig --level 345 redis-server on
sudo chkconfig --level 345 redis-server on
sudo vi /etc/sysctl.conf
sudo sysctl vm.overcommit_memory=1
sudo service redis-server start

2012年4月19日木曜日

emacs tramp のセッション切れ

emacs trampでリモートファイルを編集中にネットワークが切れてしまった場
合、trampのバッファをkillして再度読み込み直せば復活する。
trampバッファのサンプル

*tramp/scp hostname*

今まではemacsを終了させて再度接続させていた。


2012年4月11日水曜日

apt tips

timeoutの設定

apt.confに Acquire::http::Timeout 120;

postfix install時などにでるインタラクティブモードを抑える
環境変数を設定

DEBIAN_FRONTEND=noninteractive

2012年3月25日日曜日

new openshift

openshiftが新しくなっていた。
cliコマンドがrhcコマンド一つに集約されて、cname対応もしていた様なので、早速試してみた。

sudo gem install rhc
rhc app add-alias --alias meteors.psychobil.ly -a  -l -p

2012年3月16日金曜日

dotcloud push

dotcloudのソース管理
dotcloudはgit repositoryは提供して無いけど、gitの機能を使うので新規にrepositoryを立てるかどうするか
悩んだ末に dropbox で補完することにした。
dropboxのcliインストールはこちら

cd ~/Dropbox/private
cp -r /path/to/dotcloud_apps .
cd dotcloud_apps
git init
git add .
git commit -am 'first commit'
dotcloud push dotcloud_apps .

# dropbox 同期
dropboxy.py start

2012年3月14日水曜日

多段ssh

tar cf - /tmp/src | ssh -A 中継サーバ1 ssh -A 中継サーバ2 ssh -A 中継サーバ3 ssh コピー先サーバ  "(cd /tmp; tar xfp -)"


2012年3月10日土曜日

apache forward proxy

社内から外への接続用メモ

$ sudo apt-get install apache2
$ sudo a2enmod proxy
$ sudo a2enmod proxy_ftp
$ sudo a2enmod proxy_http
$ cat /etc/apache2/mods-enabled/proxy.conf 
# -*- mode:apache -*-
<ifmodule mod_proxy.c>
    Listen 8081

    ErrorLog      /var/log/apache2/proxy_error.log
    Customlog     /var/log/apache2/proxy.log combined

    ProxyRequests On

    <proxy *>
        AddDefaultCharset off
        Order deny,allow
        Deny from all
        Allow from 172
    </Proxy>

    ProxyVia On
</IfModule>
$ sudo /etc/init.d/apache2 restart

2012年3月9日金曜日

2012年3月6日火曜日

blogサイト選定

gooとniftyのblog規約は厳しい。
fc2最強。

find2ch

2hcの記事検索結果を返すapiを作ろうとgoogleの検索apiを調べてみたら何だか使えないので、find.2ch.netをhtmlパースしてthread一覧を抽出するスクリプトを書いた。
# 例外処理は省略

#!/usr/bin/ruby
# -*- coding: utf-8 -*-

$KCODE = 'u'
 
require 'rubygems'
require 'open-uri'
require 'nkf'
require 'uri'

require 'pp'

SEARCH_URL = 'http://find.2ch.net'

class ThreadModel
  attr_accessor :url, :dat, :thread_number, :title, :current_cursor, :board_url, :board_name
  def initialize(url, dat, thread_number, title, current_cursor, board_url, board_name)
    @url = url
    @dat = dat
    @thread_number = thread_number
    @title = title
    @current_cursor = current_cursor
    @board_url = board_url
    @board_name = board_name
  end
end

def search2chThread(keyword, options={})
  unless keyword ; return false ; end

  unless options[:count]
    options[:count] = 100
  end
  unless options[:offset]
    options[:offset] = 0
  end

  open("#{SEARCH_URL}?STR=#{URI.encode(NKF::nkf('-e', keyword))}&COUNT=#{options[:count]}&OFFSET=#{options[:offset]}&SCEND=A&SORT=MODIFIED&TYPE=TITLE&BBS=ALL").read.each do |line|
    line = NKF::nkf('-wxm0Z0', line.strip)
    if /^
\s*(.+?)<\/a>\s*\((\d+)\).*?(.+?)<\/a>/.match(line)
url, title, current_cursor, board_url, board_name = $1, $2, $3, $4, $5
url.gsub!(/^(http:\/\/.+?\/test\/read.cgi\/.+?\/\d+?)\/.*$/, '\1/')
dat = url.gsub(/^(http:\/\/.+?)\/test\/read.cgi\/(.+?)\/(\d+?)\/.*$/, '\1/\2/dat/\3.dat')
thread_number = url.gsub(/^(http:\/\/.+?)\/test\/read.cgi\/(.+?)\/(\d+?)\/.*$/, '\3')
t = ThreadModel.new(url, dat, thread_number, title, current_cursor, board_url, board_name)
p t
end
end

end

if __FILE__ == $0
search2chThread('原発', :count=> 10, :offset=> 2)
end

__END__

2012年3月4日日曜日

samurai



samurai(笑)

emacs23 + anthy

emacsでanthyを使うメモ

$ sudo apt-get install scim-bridge-el 
$ sudo apt-get install anthy-el
$ cat <<EOF >> ~/.emacs.d/init.el
(load-library "anthy")
EOF

獣兵衛忍風帖











2012年3月3日土曜日

google apis

話題のプライバシポリシー変更。依存し過ぎで抜けられないgoogleサービス。

google apiのconsole urlが分からなかったのでメモ

https://code.google.com/apis/console/b/0/?pli=1

2012年2月29日水曜日

amazon affiliate

エロくローラーに貼るamazon associate(affiliate)をjsonで扱えてキャッシュ出来るrailsのcontrollerを作った。
app/controllerに置いて、Gemfileに gem 'amazon-ecs' を書いて、適当なパスをroutes.rbに書けば動くはず。
# 長ったらしい自慰行為ソースコードと説明文より動く実践コードってなかなか探しても無いものである。

sample
http://krewmen-psychobilly.rhcloud.com/api/0.7/get/affiliate/amazon?callback=callback
# -*- coding: utf-8 -*-
require 'rubygems'
require 'amazon/ecs'
require 'rakuten'
require 'pp'
require 'cgi'

class AffiliateController < ApplicationController

  def amazon

    @code = 200
    @message = nil
    @items = nil
    @max_pages = (params[:max_pages] =~ /^[0-9]+$/)?params[:max_pages]:1
    @max_images = (params[:max_images] =~ /^[0-9]+$/)?params[:max_images]:nil

    begin

      @items = Rails.cache.read("items_#{@max_pages}")
      unless @items
        @items = []

        Amazon::Ecs.options = {
          :associate_tag => 'xxx-22',
          :AWS_access_key_id => 'xxx',
          :AWS_secret_key => 'xxx',
          :country => :jp,
        }

        image_count = 0
        @max_pages.to_i.times do |page|

          res = Amazon::Ecs.item_search("検索キーワード", {:item_page => page + 1, :search_index => "DVD", :response_group => 'Medium', :sort => 'salesrank'})

          res.items.each do |item|
            if @max_images and @max_images.to_i <= image_count
              break
            end
            image_count += 1
            image = item.get("LargeImage/URL")
            if image
              @items.push({
                            :title  => item.get("ItemAttributes/Title"),
                            :actor  => item.get("ItemAttributes/Actor"),
                            :simage => item.get("SmallImage/URL"),
                            :mimage => item.get("MediumImage/URL"),
                            :image  => item.get("LargeImage/URL"),
                            :url    =>CGI::unescape(item.get("DetailPageURL"))
                          })
            end
          end

        end

        # 5min
        Rails.cache.write("items_#{@max_pages}", @items, :expires_in => 300)

      end

    rescue => err
      p err.to_s
      @code = 500
      @message = err.to_s
    end

    render :json => {:header => {:code => @code, :message => @message}, :body => {:items => @items}}, :callback => params[:callback]

  end

end

2012年2月24日金曜日

Amazon Linux AMIにjenkinsをインストール

loginとインストール環境
$ slogin xx-xx-xx-xx-xx.amazonaws.com
$ cat /etc/issue
Amazon Linux AMI release 2011.09
Kernel \r on an \m


repository追加とインストール
$ sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
$ sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
$ sudo yum install jenkins


確認
$ id jenkins
uid=221(jenkins) gid=497(jenkins) groups=497(jenkins)


config修正
$ sudo diff -c /etc/sysconfig/{jenkins.orig,jenkins}
*** /etc/sysconfig/jenkins.orig 2012-02-24 04:50:06.269101765 +0000
--- /etc/sysconfig/jenkins      2012-02-13 19:19:59.000000000 +0000
***************
*** 16,22 ****
  # Java executable to run Jenkins
  # When left empty, we'll try to find the suitable Java.
  #
! JENKINS_JAVA_CMD="/usr/bin/java"
  
  ## Type:        string
  ## Default:     "jenkins"
--- 16,22 ----
  # Java executable to run Jenkins
  # When left empty, we'll try to find the suitable Java.
  #
! JENKINS_JAVA_CMD=""
  
  ## Type:        string
  ## Default:     "jenkins"


起動
$ sudo service jenkins start
Starting Jenkins                                           [  OK  ]



2012年2月14日火曜日

dropbox cli

CLI環境でdropboxを使う(install)する方法

インストール環境
$ uname -a
Linux $hostnaem 2.6.32-5-amd64 #1 SMP Thu Nov 3 03:41:26 UTC 2011 x86_64 GNU/Linux
$ cat /etc/issue
Debian GNU/Linux 6.0 \n \l

ツールのインストール
$ test -d ${HOME}/bin || mkdir ${HOME}/bin
$ cd ${HOME}/bin
$ wget -O dropbox.py https://www.dropbox.com/download?dl=packages/dropbox.py
$ chmod +x dropbox.py
$ sudo apt-get install python-gpgme
# lennyの場合は python-pyme をインストール

dropbox(daemon)のインストール
$ dropbox.py start --install
$ ls -ld ${HOME}/.dropbox*

dropbox起動
$ dropbox.py start
To link this computer to a dropbox account, visit the following url:
https://www.dropbox.com/cli_link?host_id=00000000000000000000000000000000&cl=ja

リポジトリ同期開始
daemon起動時に出力されたURL(上記)にアクセスしてログイン(または登録)をすれば、${HOME}/Dropbox/ へ同期が開始される

2012年1月31日火曜日

乱数

bashで乱数を作るメモ
参考

sample
$ od -vAn -N4 -tu4 < /dev/urandom | tr -d ' '
3439490300

2012年1月19日木曜日

[rails] `activate': can't activate rack

新しいrailsアプリを作ろうとしたらこんなエラーが出る。

$ rails new myapp --skip-active-record
/usr/lib/ruby/1.8/rubygems.rb:233:in `activate': can't activate rack (~> 1.3.5, runtime) for ["actionpack-3.1.3", "rails-3.1.3"], already activated rack-1.4.0 for ["rack-cache-1.1", "actionpack-3.1.3", "rails-3.1.3"] (Gem::LoadError)
 from /usr/lib/ruby/1.8/rubygems.rb:249:in `activate'
 from /usr/lib/ruby/1.8/rubygems.rb:248:in `each'
 from /usr/lib/ruby/1.8/rubygems.rb:248:in `activate'
 from /usr/lib/ruby/1.8/rubygems.rb:249:in `activate'
 from /usr/lib/ruby/1.8/rubygems.rb:248:in `each'
 from /usr/lib/ruby/1.8/rubygems.rb:248:in `activate'
 from /usr/lib/ruby/1.8/rubygems.rb:1082:in `gem'
 from /var/lib/gems/1.8/bin/rails:18

そんなときはrackを消してしまえ〜
$ sudo gem uninstall rack -v 1.4.0

You have requested to uninstall the gem:
 rack-1.4.0
rack-mount-0.8.3 depends on [rack (>= 1.0.0)]
actionpack-3.2.0.rc2 depends on [rack (~> 1.4.0)]
sprockets-2.0.3 depends on [rack (~> 1.0)]
sprockets-2.1.2 depends on [rack (~> 1.0)]
rack-test-0.6.1 depends on [rack (>= 1.0)]
rack-cache-1.1 depends on [rack (>= 0.4)]
rack-ssl-1.3.2 depends on [rack (>= 0)]
If you remove this gems, one or more dependencies will not be met.
Continue with Uninstall? [Yn]  y
Successfully uninstalled rack-1.4.0

2012年1月15日日曜日

npm private repository 構築 couchdb 編

npm private repository の構築。
構築には先ずcouchdbのインストールが必要ですが、これが曲者。iriscouchってのインストールしておけば大凡大丈夫なのでこちらをインストールすれば嵌らずに済む。

iriscouch install on debian
$ sudo apt-get install make gcc zlib1g-dev libssl-dev rake
$ sudo git clone git://github.com/iriscouch/build-couchdb /usr/local/couchdb
$ cd /usr/local/couchdb
$ sudo git submodule init
$ sudo git submodule update
$ sudo rake

2012年1月10日火曜日

siege(stress tool)を使う

ab(apache bench)だと物足りなく、jMeterだと面倒で、なにか良さげなのは無いかと探していたら発見。
siege

install
$ sudo apt-get install siege

generate config
$ siege.config
$ grep -v -E "(^#|^$)" $HOME/.siegerc
logfile = $(HOME)/siege/siege.log
verbose = true
show-logfile = true
logging = true
protocol = HTTP/1.0
chunked = true
connection = close
concurrent = 15
file = $HOME/url.lst
delay = 1
internet = true
benchmark = true
accept-encoding = gzip
spinner = true

execute
$ siege -r 10

** SIEGE 2.66
** Preparing 15 concurrent users for battle.
The server is now under siege...
 .
 .
HTTP/1.1 200   0.03 secs:     103 bytes ==> /
HTTP/1.1 200   0.37 secs:      64 bytes ==> /
HTTP/1.1 200   0.01 secs:      51 bytes ==> /
 .
 .
done.                                                                                                                                                        Transactions:                     150 hits
Availability:                 100.00 %
Elapsed time:                   2.98 secs
Data transferred:               0.01 MB
Response time:                  0.27 secs
Transaction rate:              50.34 trans/sec
Throughput:                     0.00 MB/sec
Concurrency:                   13.80
Successful transactions:         150
Failed transactions:               0
Longest transaction:            0.88
Shortest transaction:           0.01
 

stress tool まとめ
http://www.softwareqatest.com/qatweb1.html

2012年1月6日金曜日

nginx debug #1

nginx -s reload をすると core を吐く現象が。
debugオプションを付けてrecompileしgdb で探る。

execution environment
$ uname -a
Linux hostname 2.6.26-2-amd64 #1 SMP Wed Sep 21 03:36:44 UTC 2011 x86_64 GNU/Linux

nginx version & compile options
$ /usr/local/nginx/sbin/nginx -V
nginx: nginx version: nginx/1.0.10
nginx: TLS SNI support enabled
nginx: configure arguments: \
--with-debug \
--prefix=/usr/local/nginx \
--conf-path=/usr/local/nginx/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--lock-path=/usr/local/nginx/var/lock/nginx.lock \
--pid-path=/usr/local/nginx/var/run/nginx.pid \
--with-http_addition_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_geoip_module \
--with-http_gzip_static_module \
--with-http_image_filter_module \
--with-http_random_index_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_sub_module \
--with-http_xslt_module \
--with-ipv6 \
--with-sha1=/usr/include/openssl \
--with-md5=/usr/include/openssl \
--add-module=/var/tmp/debug-nginx-1.0.10/debian/modules/ngx_devel_kit \
--add-module=/var/tmp/debug-nginx-1.0.10/debian/modules/chunkin-nginx-module \
--add-module=/var/tmp/debug-nginx-1.0.10/debian/modules/echo-nginx-module \
--add-module=/var/tmp/debug-nginx-1.0.10/debian/modules/headers-more-nginx-module \
--add-module=/var/tmp/debug-nginx-1.0.10/debian/modules/healthcheck_nginx_upstreams \
--add-module=/var/tmp/debug-nginx-1.0.10/debian/modules/lua-nginx-module \
--add-module=/var/tmp/debug-nginx-1.0.10/debian/modules/nginx-upstream-fair \
--without-http_uwsgi_module \
--without-http_scgi_module \
--http-proxy-temp-path=/usr/local/nginx/cache/proxy_temp \
--http-fastcgi-temp-path=/usr/local/nginx/cache/fastcgi_temp \
--http-client-body-temp-path=/usr/local/nginx/cache/client_body_temp


nginx.conf
worker_processes 4;
pid /usr/local/nginx/var/run/nginx.pid;
worker_rlimit_core  500M;
working_directory   /var/tmp;

events {
    worker_connections 3000;
    use epoll;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 0;
    server_tokens off;

    include /usr/local/nginx/etc/nginx/mime.types;
    default_type text/plain;
    include /usr/local/nginx/etc/nginx/proxy_params;

    log_format custom '$remote_addr - $remote_user $time_local "$request" $status $bytes_sent "$http_referer" "$http_user_agent" "$http_cookie" $request_time\
 $upstream_response_time';
    access_log /var/log/nginx/access.log custom;
    error_log  /var/log/nginx/error.log debug;

    include /usr/local/nginx/etc/nginx/conf.d/*.conf;
    include /usr/local/nginx/etc/nginx/sites-enabled/*;
}

dump a core
$ nginx
$ nginx -s reload
$ stat /var/tmp/core
  File: `/var/tmp/core'
  Size: 2617344         Blocks: 4608       IO Block: 4096   regular file
Device: 801h/2049d      Inode: 295019      Links: 1
Access: (0600/-rw-------)  Uid: (   33/www-data)   Gid: (   33/www-data)
Access: 2012-01-06 12:04:09.000000000 +0900
Modify: 2012-01-06 12:39:29.000000000 +0900
Change: 2012-01-06 12:39:29.000000000 +0900

syslog, error.log
==> /var/log/syslog <==
Jan  6 12:00:16 hostname kernel: [ 7968.550937] nginx[29042]: segfault at 18 ip 425609 sp 7fffd8f51d10 error 6 in nginx[400000+115000]

==> /var/log/nginx/error.log <==
2012/01/06 12:00:16 [alert] 29041#0: worker process 29042 exited on signal 11 (core dumped)
debug with gdb
$ sudo gdb /usr/local/nginx/sbin/nginx /var/tmp/core
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu"...

warning: Can't read pathname for load map: Input/output error.
Reading symbols from /lib/libpthread.so.0...done.
Loaded symbols for /lib/libpthread.so.0
Reading symbols from /lib/libcrypt.so.1...done.
Loaded symbols for /lib/libcrypt.so.1
Reading symbols from /lib/libm.so.6...done.
Loaded symbols for /lib/libm.so.6
Reading symbols from /usr/lib/liblua5.1.so.0...done.
Loaded symbols for /usr/lib/liblua5.1.so.0
Reading symbols from /usr/lib/libpcre.so.3...done.
Loaded symbols for /usr/lib/libpcre.so.3
Reading symbols from /usr/lib/libssl.so.0.9.8...done.
Loaded symbols for /usr/lib/libssl.so.0.9.8
Reading symbols from /usr/lib/libcrypto.so.0.9.8...done.
Loaded symbols for /usr/lib/libcrypto.so.0.9.8
Reading symbols from /lib/libdl.so.2...done.
Loaded symbols for /lib/libdl.so.2
Reading symbols from /usr/lib/libz.so.1...done.
Loaded symbols for /usr/lib/libz.so.1
Reading symbols from /usr/lib/libxml2.so.2...done.
Loaded symbols for /usr/lib/libxml2.so.2
Reading symbols from /usr/lib/libxslt.so.1...done.
Loaded symbols for /usr/lib/libxslt.so.1
Reading symbols from /usr/lib/libexslt.so.0...done.
Loaded symbols for /usr/lib/libexslt.so.0
Reading symbols from /usr/lib/libgd.so.2...done.
Loaded symbols for /usr/lib/libgd.so.2
Reading symbols from /usr/lib/libGeoIP.so.1...done.
Loaded symbols for /usr/lib/libGeoIP.so.1
Reading symbols from /lib/libc.so.6...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld-linux-x86-64.so.2...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Reading symbols from /usr/lib/libgcrypt.so.11...done.
Loaded symbols for /usr/lib/libgcrypt.so.11
Reading symbols from /usr/lib/libjpeg.so.62...done.
Loaded symbols for /usr/lib/libjpeg.so.62
Reading symbols from /usr/lib/libfreetype.so.6...done.
Loaded symbols for /usr/lib/libfreetype.so.6
Reading symbols from /usr/lib/libpng12.so.0...done.
Loaded symbols for /usr/lib/libpng12.so.0
Reading symbols from /usr/lib/libgpg-error.so.0...done.
Loaded symbols for /usr/lib/libgpg-error.so.0
Reading symbols from /lib/libnss_compat.so.2...done.
Loaded symbols for /lib/libnss_compat.so.2
Reading symbols from /lib/libnsl.so.1...done.
Loaded symbols for /lib/libnsl.so.1
Reading symbols from /lib/libnss_nis.so.2...done.
Loaded symbols for /lib/libnss_nis.so.2
Reading symbols from /lib/libnss_files.so.2...done.
Loaded symbols for /lib/libnss_files.so.2
Reading symbols from /lib/libnss_dns.so.2...done.
Loaded symbols for /lib/libnss_dns.so.2
Reading symbols from /lib/libresolv.so.2...done.
Loaded symbols for /lib/libresolv.so.2
Core was generated by `nginx: worker process is shu'.
Program terminated with signal 11, Segmentation fault.
[New process 5749]
#0  0x00000000004259b1 in ngx_rbtree_min (node=0x0, sentinel=0x728d00) at src/core/ngx_rbtree.h:75
75          while (node->left != sentinel) {
(gdb) backtrace full
#0  0x00000000004259b1 in ngx_rbtree_min (node=0x0, sentinel=0x728d00) at src/core/ngx_rbtree.h:75
No locals.
#1  0x00000000004254ff in ngx_rbtree_delete (tree=0x729710, node=0x9dc8c0) at src/core/ngx_rbtree.c:178
        red = 10170528
        root = (ngx_rbtree_node_t **) 0x729710
        sentinel = (ngx_rbtree_node_t *) 0x728d00
        subst = (ngx_rbtree_node_t *) 0xa07f08
        temp = (ngx_rbtree_node_t *) 0x2
        w = (ngx_rbtree_node_t *) 0x4f066cf1
#2  0x00000000004ccb5b in ngx_event_del_timer (ev=0x9dc898) at src/event/ngx_event_timer.h:43
No locals.
#3  0x00000000004cdb1b in ngx_http_healthcheck_clear_events (log=0x9c8e28)
    at /var/tmp/debug-nginx-1.0.10/debian/modules/healthcheck_nginx_upstreams/ngx_http_healthcheck_module.c:669
        i = 0
#4  0x00000000004cd91b in ngx_http_healthcheck_try_for_ownership (event=0x9dca30)
    at /var/tmp/debug-nginx-1.0.10/debian/modules/healthcheck_nginx_upstreams/ngx_http_healthcheck_module.c:627
        stat = (ngx_http_healthcheck_status_t *) 0x9dc998
        i_own_it = 10341864
#5  0x000000000043ab9a in ngx_event_expire_timers () at src/event/ngx_event_timer.c:149
        ev = (ngx_event_t *) 0x9dca30
        node = (ngx_rbtree_node_t *) 0x9dca58
        root = (ngx_rbtree_node_t *) 0x9dc928
        sentinel = (ngx_rbtree_node_t *) 0x728d00
#6  0x0000000000438988 in ngx_process_events_and_timers (cycle=0x9c8e10) at src/event/ngx_event.c:261
        flags = 1
        timer = 779
        delta = 779
#7  0x0000000000444ff3 in ngx_worker_process_cycle (cycle=0x9c8e10, data=0x0) at src/os/unix/ngx_process_cycle.c:801
        i = 3000
        c = (ngx_connection_t *) 0x7f2be4b34010
#8  0x0000000000441e92 in ngx_spawn_process (cycle=0x9c8e10, proc=0x444e49 , data=0x0, name=0x4f0a9e "worker process", respawn=-3)
    at src/os/unix/ngx_process.c:196
        on = 1
        pid = 0
        s = 3
#9  0x0000000000443ef0 in ngx_start_worker_processes (cycle=0x9c8e10, n=4, type=-3) at src/os/unix/ngx_process_cycle.c:360
        i = 3
        ch = {command = 1, pid = 5748, slot = 2, fd = 11}
#10 0x00000000004435e0 in ngx_master_process_cycle (cycle=0x9c8e10) at src/os/unix/ngx_process_cycle.c:136
        title = 0x9f7776 "master process /usr/local/nginx/sbin/nginx"
        p = (u_char *) 0x9f77a0 ""
        size = 43
        i = 1
        n = 0
        sigio = 10260008
        set = {__val = {0 }}
        itv = {it_interval = {tv_sec = 0, tv_usec = 7425080}, it_value = {tv_sec = 8, tv_usec = 34}}
        live = 0
        delay = 0
        ls = (ngx_listening_t *) 0x5
        ccf = (ngx_core_conf_t *) 0x9c9db0
#11 0x00000000004158c9 in main (argc=1, argv=0x7fff14e61b68) at src/core/nginx.c:405
        i = 62
        log = (ngx_log_t *) 0x726b00
        cycle = (ngx_cycle_t *) 0x9c8e10
        init_cycle = {conf_ctx = 0x0, pool = 0x9c8370, log = 0x726b00, new_log = {log_level = 0, file = 0x0, connection = 0, handler = 0, data = 0x0, 
    action = 0x0}, files = 0x0, free_connections = 0x0, free_connection_n = 0, reusable_connections_queue = {prev = 0x0, next = 0x0}, listening = {
    elts = 0x0, nelts = 0, size = 0, nalloc = 0, pool = 0x0}, pathes = {elts = 0x0, nelts = 0, size = 0, nalloc = 0, pool = 0x0}, open_files = {last = 0x0, 
    part = {elts = 0x0, nelts = 0, next = 0x0}, size = 0, nalloc = 0, pool = 0x0}, shared_memory = {last = 0x0, part = {elts = 0x0, nelts = 0, next = 0x0}, 
    size = 0, nalloc = 0, pool = 0x0}, connection_n = 0, files_n = 0, connections = 0x0, read_events = 0x0, write_events = 0x0, old_cycle = 0x0, 
  conf_file = {len = 37, data = 0x4ece50 "/usr/local/nginx/etc/nginx/nginx.conf"}, conf_param = {len = 0, data = 0x0}, conf_prefix = {len = 27, 
    data = 0x4ece50 "/usr/local/nginx/etc/nginx/nginx.conf"}, prefix = {len = 17, data = 0x4ece3c "/usr/local/nginx/"}, lock_file = {len = 0, data = 0x0}, 
  hostname = {len = 0, data = 0x0}}
        ccf = (ngx_core_conf_t *) 0x9c9db0
(gdb) 
bug?
#0  0x00000000004259b1 in ngx_rbtree_min (node=0x0, sentinel=0x728d00) at src/core/ngx_rbtree.h:75
75          while (node->left != sentinel) {