2011年12月16日金曜日

screenをやめてtmuxへ

どうも、俺@残業中です。

流行りモノの好きな俺はscreenをやめてtmuxへ移行することにしました。
とは言うものの、もうだいぶ前からある仮想端末ソフトみたいですが、、^^;

色んなブログを参考にしましたが、結局インストールして使ってみて、screenとtmuxとで大きな差がある感じはしません。
何よりも重宝されるdetach&attachが両方備わってる訳ですし。
tmuxだけで言うと
・コピペのバッファを複数利用できる
・画面分割がしやすい(paneという。縦横関わらず)
・動作が軽い(メモリ消費も少ないらしい)
・旬なやつ
というメリットがあります。

ではインストール、設定めもめもです。
※僕の端末はMac OSX(lion)ですので、Mac用のインストールメモも含まれてます。

まずMacな人はXcodeをインストールします。
http://developer.apple.com/xcode/
を参考に、インストール方法については省略します。

次にMacPortsをインストールします。これはMacなエンジニアにとっては結構便利なツールです。
http://www.macports.org/index.php
から自分の環境に合ったパッケージファイルをDLし、そのdmgファイルを実行して下さい。
僕はMacPorts-2-1.0.3-10.7-Lion.dmgを落としました。
あとはインストーラに従うだけです。
インストールが完了したら、ターミナルで環境設定を編集します。
僕はzshを使っているので

$ vim ~/.zshrc
--------------------------
export PATH=/opt/local/bin:/opt/local/sbin:$PATH
export MATHPATH=/opt/local/man:$MANPATH
とします。bashの人も同じですね。
設定を読み込みます。

$ source ~/.zshrc
次に設定ができたか確認します。

$ port version
Version: 2.0.3
OKです。
まずは使う前に更新を確認します。

$ sudo port selfupdate
勝手に更新してくれます。

では早速tmuxをインストールしましょう!

$ sudo port install tmux
これで勝手にインストールしてくれます。yumみたいなもんですね。
インストールが終わったら

$ tmux
と打つだけで仮想端末が立ち上がり、まるでscreenのように!!
screenと同じく
$ exit
で終了します。


$ tmux list-session
でセッション一覧が見れます。平たくdetach、attachされた端末のことです。セッション番号:ウィンドウ数や起動日時が表示されます。
セッション番号を参考にし
$ tmux attach -t セッション番号
でアタッチできます。

tmuxはデフォルトでCtrl-bがプレフィックスになっているので、何かコマンドを打つ場合はまずCtrl-bを打つことが基本です。※もちろん設定で変えられますが、僕は基本に忠実にやってます!
tmuxを起動してからは、screenと同様にウインドウ分割(pane)やコピーモードへ移行、windowの生成など色々できます。

Ctrl-b ? ショートカット一覧
Ctrl-b d デタッチ
Ctrl-b w ウィンドウ一覧
Ctrl-b c ウィンドウ生成
Ctrl-b n 次のウィンドウへ
Ctrl-b p 前のウィンドウへ
Ctrl-b : コマンドモードへ
Ctrl-b [ コピーモード開始
Ctrl-b Ctrl-Space コピーモードでのコピー開始
Ctrl-b ESC-w コピーモードでのコピー終了
Ctrl-b ] コピーデータの貼付け
Ctrl-b q ペインのインジケータ(番号?)を表示
Ctrl-b t 時計表示(いらんw)
Ctrl-b % ウインドウを左右ペインへ分割
Ctrl-b " ウインドウを上下ペインへ分割
Ctrl-b o アクティブなペインの移動(次のペインへ移動)
Ctrl-b x ペインの破棄
Ctrl-b Space ペインレイアウトの変更(左右、上下)
Ctrl-b : resize-pane -U 数字 上部ペインのサイズ変更
Ctrl-b : resize-pane -D 数字 下部ペインのサイズ変更
Ctrl-b : resize-pane -L 数字 左ペインのサイズ変更
Ctrl-b : resize-pane -R 数字 右ペインのサイズ変更
メインで使うコマンドはこのくらいでしょうか。
あとは~/.tmux.confを編集して使いやすくします。


$ vim ~/.tmux.conf
--------------------------------
# コピーモードのキーバインドをviのように
# Spaceでコピー開始、Enterでコピー終了になります
set-window-option -g mode-keys vi

# 縦分割、横分割をviのキーバインドのように
bind s split-window -v
bind v split-window -h

# 分割画面への移動をviのキーバインドのように
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
僕はこんな感じにしました。
tmuxを使ってみる-なんでもつくるとか参考になります。


さぁ、これで快適なtmuxライフを送れますね!

以上でぇぇえぇす。


2011年12月9日金曜日

sshを公開鍵認証にする(複数ホスト対応)

どうも、俺@仕事中です。忙しいです><

社内でもssh管理は「鍵認証にしよう!」ということで、今日はその対応方法についてめもです。
パスワード接続だとちょっと不安ですしね。

まずはサーバ上でnew_userというログインユーザを作ります。(既存のもので対応する場合は必要なし)
<サーバ>
# useradd -d /home/new_user -s /bin/zsh -g goup_name new_user


次にOPEN-SSLで鍵ファイルを作成します。公開鍵はサーバ上に、秘密鍵はクライアントに置きます。
作成する場所はどちらでも構いませんが、分かりやすいので今回はクライアント側で作ることにします。
<クライアント>
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa):
そのままEnterでも良いが、複数ホストに対応する場合はファイル名を変えたほうが良いので今回は「id_rsa.hostA」と打ちます。
Enter passphrase (empty for no passphrase):
パスフレーズを入力(必要ない場合はそのままEnter)
Enter same passphrase again:
再度パスフレーズ入力
これでファイルが2つ生成されるはずです。
・id_rsa.hostA 秘密鍵。クライアントの.ssh以下へ置く。
・id_rsa.hostA.pub 公開鍵。サーバの.ssh以下へ置く。

では公開鍵をサーバへFTPなどで持って行き、該当のユーザ(この例ではnew_user)の.sshディレクトリ以下へ保存しておきます。説明は省略。
またその内容をauthorized_keysファイルへ追記します。
<サーバ>
$ cat id_rsa.hostA.pub >> ~/.ssh/authorized_keys
とりあえずここでSSHの鍵認証が可能です。
あとはセキュリティのため、サーバのsshd_configの設定を変更し、パスワードによるログインができなくしましょう。
<サーバ>
# cd /etc/ssh
# cp sshd_config sshd_config.bak // バックアップを取る
# vim /etc/ssh/sshd_config
---------------------------------
# 以下3つはコメントアウトのままでもデフォルトで問題ない
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# noに変更する!
PasswordAuthentication no
これでOK。
設定を反映させます。
<サーバ>
# /etc/init.d/sshd restart
これでパスワードによるログインはできなくなり、公開鍵でのログインができるようになりました。

ちなみに接続方法は
<クライアント>
$ ssh new_user@hostA -i ~/.ssh/id_rsa.hostA
になります。鍵ファイルにパスフレーズを設定している場合は、入力を求められます。

ただしこの方法だと、管理する複数のホストで鍵認証する場合、都度「-i オプション」で鍵ファイルを明示的に指定しなければいけません。面倒です。
なので.ssh/configに設定を書いておき、楽しちゃいましょう。

<クライアント>
$ vim ~/.ssh/config
---------------------------------
Host serverA
  # HostNameはドメインまたはIPアドレス
  HostName hostA.com
  Port 22
  User new_user
  IdentityFile ~/.ssh/id_rsa.hostA

Host serverB
  HostName hostB.com
  Port 22
  User foo_user
  IdentityFile ~/.ssh/id_rsa.hostB

Host serverC
  HostName xxx.xxx.xxx.xxx
  Port 22
  User bar_user
  IdentityFile ~/.ssh/id_rsa.hostC
こんな感じです。
これであれば、例えばhostB.comへ接続する場合
<クライアント>

$ ssh serverB
と打つだけで、
・hostB.comへ
・foo_userで
・22番ポートで
・~/.ssh/id_rsa.hostBの秘密鍵を使って
接続を試みてくれます。

楽チンですねーー!以上でぇぇぇええぇす。

2011年12月1日木曜日

WebSocketも対応したリバースプロキシ!

どうも、俺@仕事中です。

どうしてもリバースプロキシ経由でNode.jsを動かしたかったのですが、ApacheやNginxだとWebSocket
をリバースプロキシしてくれない!
という訳で、解決策を探してたら簡単に見つかりました。
node-http-proxy https://github.com/nodejitsu/node-http-proxy

使い方もいたってシンプル。
インストール
$ npm install http-proxy

ソースを書く
$ vim /path/to/app.js

------------------------------
var proxy = require('http-proxy');
proxy.createServer({
  router: {
    'myserver.com': 'toserver.jp:8088'
  }
}).listen(3033);
myserver.comの3033番ポートで動くNodeプログラムです。

起動させる
$ node app.js

接続確認する
$ telnet myserver.com 3033

これでtoserver.jpの8088番ポートへ通信しにいってくれます。
もちろんWebSocketもOK!


以上デェぇぇエス。


2011年11月12日土曜日

NSNumberとNSValueとCGRect,CGPoint,CGSIzeについて

どうも、俺@家帰っても勉強中です。
Objective-CでNSNumberとNSValueという不思議なクラスにぶち当たりました。

NSNumberは数値を表すオブジェクト型で、プリミティブなintやNSIntegerとは少し意味合いが違います。
つまりintとNSIntegerはイコールですが、NSNumberはイコールではありません。
使い方は
int i = 10;
NSInteger i = 10;
NSNumber *i = 10;
のようになります。
使いどころですが、例えばオブジェクト型で数値を表現したい場合はNSNumberを、そうでない場合はintやNSIntegerを使いましょう!というそのままなのですが、
具体的には、NSArrayなどに格納できる要素はオブジェクト型である必要があります。
NSArrayやNSMutableArrayにどうしても数値を格納する必要があれば、NSNumberを使えばOKです。

int i =10;
NSNumber *num = [NSNumber numberWithInt: i];
としてやればintをNSNumber型に変換できます。
他にも
NSNumber *num = [NSNumber numberWithFloat: 10.0f];
のような使い方もできます。
逆にNSNumber型をint型として取り出すには
int i = [num intValue];
でOKです。

またNSValueですが、これはCGRectやCGPoint、CGSizeなど構造体を表すオブジェクト(NSObjectを継承していない)を扱う場合に利用します。
CGRectとかCGPointなどはクラスの引数の型などに設定できないんですね。あとは上の例のように、NSArrayの要素として追加したい場合など。
CGrect rect = CGRectMake(0, 0, 100, 100);
NSValue *val = [NSValue valueWIthCGRect:rct];
CGPoint point = CGPointMake(100, 100);
NSValue *val = [NSValue valueWIthCGPoint:point];
CGSize size = CGSizeMake(100, 100);
NSValue *val = [NSValue valueWIthCGSIze:size];
こんな感じです。

逆にNSValue型のオブジェクトからCGRectなどを取り出す場合は
CGRect rect = [val CGRectValue];
CGPoint point = [val CGPointValue];
CGSize size = [val CGSizeValue];
使い方はNSNumberの場合とほとんど一緒です。


以上でぇぇぇぇす。

2011年11月11日金曜日

設定されたSSL鍵にパスフレーズが設定されているかどうか

どうも、俺@アプリ開発中です。
今日は、利用しているSSLの鍵にパスフレーズが設定されているかどうかを調べる方法についてめもめも。

例えば、apacheを再起動しなければならなくなった場合
そのapacheはSSL設定がされており、https:// なWEBサーバであると、再起動かけたとき

# /usr/local/apache2/bin/apachectl restart
Enter pass phrase for /path/to/ssl.key: 
のようにパスフレーズを求められて、
apacheが停止したところで止まってしまい、起動出来なくなってしまいます。これはエライコッチャ!

こんな場合は、事前にSSL鍵にパスフレーズが設定されているかどうかチェックしておきましょう。
まず、apacheのSSL設定ファイル(通常はhttpd-ssl.confかな)にあるSSLCertificateKeyFileを見て、SSL鍵パスを確認します。

# cat /usr/local/apache2/conf/extra/httpd-ssl.conf | grep SSLCertificateKeyFile
SSLCertificateKeyFile "/usr/local/apache2/conf/ssl/ssl.key"
例えばこのように出力されて、鍵ファイルのパスがわかります。

このファイルを openssl コマンドでパスフレーズ設定されているかどうか確認します。
# openssl rsa -in /usr/local/apache2/conf/ssl/ssl.key
とコマンドを打って
・パスフレーズ設定されている場合
Enter pass phrase for /usr/local/apache2/conf/ssl/ssl.key:
これは要注意です!

・パスフレーズ設定されていない場合
Writing RSA key
----- BEGIN RSA PRIVATE KEY -----
LKDFopa99yjkfslkKgudkdf...
のように鍵ファイルを表示できれば設定されていません!


これで、apache再起動時に焦ることもなくなりますね。
僕は、開発環境でパスフレーズ設定されたapacheを再起動してしまい、「あれぇ」となった事があります。

ちなみにパスフレーズ設定されたSSL証明書鍵のパスフレーズを解除してしまう方法ですが、(セキュリティ的に危ないので本番サーバとかでは要検討!)

// バックアップを取る
# cp ssl.key ssl.key.bak

// パスフレーズ解除
# openssl rsa -in ssl.key -out new_ssl.key
Enter pass phrase for ssl.key: // ここでパスフレーズを入力
です。
new_ssl.keyというパスフレーズの設定されていないSSL証明書鍵が出来ました。


以上でぇぇぇぇす。

2011年11月10日木曜日

UIView UILayout UITextViewを角丸にする

どうも、俺@アプリ開発中です。
今日はタイトル通り「UIView」「UILayout」「UITextView」の角を丸く描画する方法についてめもめもです。

まず、ヘッダファイルで

#import <QuartzCore/QuartzCore.h>
とQuartzCore.frameworkをインポートします。
別のサイトとかではQuartzCore.frameworkを追加して、とかあるのですが僕の環境ではそんなことしなくても普通に使えました。
なぜだ。(XCode4.2)
次に対象のオブジェクトに対し

UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
btn.frame = CGRectMake(100, 100, 50, 50);
[btn setTitle:@"test" forState:UIControlStateNormal];

// 角丸の処理
[[btn layer] setCornerRadius:5.0f];

// または
// btn.layer.cornerRadius = 5.0f;
こんな感じです。
UILayoutやUITextViewでも同様に作れます。


以上でぇぇぇえす。

2011年11月9日水曜日

Objective-Cでprivateメソッドを定義したい

どうも、俺です。
ようやくobjective-c(cocoa)な話題です。

objective-cで自作クラスを作り、javaやphpのようにprivateなメソッドを定義したい!という時のめもめもです。
objective-cは基本的には定義されたメソッドはpublicになってしまいます。
面倒なのであえてprivateなメソッドにする必要もなさそうですが。

ちなみにprivateなプロパティは

// MyClass.h
@interface MyClass: NSObject
{
 @private
   id hoge;
}
-(void)methodA;
@end
のような形で定義できちゃいます。

privateなメソッドを定義するには、カテゴリを使って何とか実装できます。、、なので面倒です。

// MyClass.m
@interface MyClass () // ←が無名カテゴリの定義
-(void) privateMethod;
@end

@implemention MyClass
// ここにクラスの実装を行う。
// privateMethodもここに作成する。
-(void) prrivateMethod
{
  // メソッドの内容
}
@end
こんな感じです。
MyClasss.hに変更を食わえる必要はありません。

Objective-Cにprivateメソッドの仕組みが組み込まれてないんでしょうね。
なんか冗長な気がするので、どうしてもprivateじゃないとアカン!という場合でなければ使わなくても良いかなと思いました。
アプリ開発とかでもあまり大規模開発になることもなさそうですし。

以上でぇぇぇぇぇぇぇす。

2011年11月2日水曜日

macのターミナルでvimのdeleteがおかしい時

どうも、俺です。
お久しぶりです。ブログに書くようなネタがなかったのでしばらく更新できませんでした。。

今日はmacを使っててターミナルからvimを開いてdeleteキーを押すと「^?」が出る人へ、対処法メモです。


$ vim ~/.vimrc
-------------------
" 以下を追加
noremap! ^? ^H
とりあえず、.vimrcをこのようにすれば直ります!直るはずです。
^?はCtrl+vを押したあとdeleteキー。
^HはCtrl+vを押した後Ctrl+hキー。

最近はmacで仕事しております。iphoneアプリ開発とかしてるので、そのうちObjective-C関連のネタも書くようになれればいいなー。

以上でぇぇえぇす。

2011年9月13日火曜日

fsockopenでhttps://へ接続したいとき

どうも、久しぶりです。俺@残業中です。

今日はphpのfsockeopen()の使い方注意をメモメモ。
httpsな外部サイトへfsockopen()したいときは

fsockopen('www.example.com', 443, $errono, $errstr, $timeout);
では接続できません。
サーバ側から

<!DOCTYPE HTML PUBLIC “-//IETF//DTD HTML 2.0//EN”>

<html><head><title>400 Bad Request</title></head><body><h1>Bad Request</h1><p>Your browser sent a request that this server could not understand.<br />
Reason: You’re speaking plain HTTP to an SSL-enabled server port.<br />
Instead use the HTTPS scheme to access this URL, please.<br />
とかで帰ってきます。
fsockopen()でhttps://なサイトへ接続するときは

fsockopen('ssl://www.example.com', 443, $errno, $errstr, $timeout);
としましょう。

あ、ちなみにphpはopensslが利用可能な環境でインストールされている必要がありますよ。

 ./configure --with-openssl


以上でぇぇえっぇす。

2011年8月3日水曜日

muninで独自プラグインを作成

どうも、俺@終業前です。

今日はmuninで独自のデータを取得する方法についてめもめも。
すごく簡単です。
例としてDB(MySQL)からとあるテーブル(fooテーブルとbarテーブル)の総件数をロギングしたいと思います。

まずmuninのプラグインのあるディレクトリに実行ファイルを作成します。
このファイルはシェルスクリプトでもphpスクリプトでも何でも構いません。決められた引数に対して決められた値を返せれば良いです。
yumでインストールした場合は、/usr/share/munin/plugins 以下になります。
# cd /usr/share/munin/plugins
# vim table_count
当然このファイルには実行権限を付けておいてください。
# chmod +x table_count

基本的には
1)引数「config」を与えられたときに値を返す(グラフ情報)
2)引数なしで実行されたときに値を返す(実際の値)
のように作成します。
他にも引数はいくつかありますが、特にMuninプラグインの作り方:ククログに詳しく書かれてありましたので参考にしてください。

引数「autoconf」と引数「suggest」についてとても参考になりました。
今回はこれらは割愛します。

まず引数「config」の時の処理を書きます。
# vim table_count
----------------------------------------
#!/bin/sh

if [ "$1" = "config" ]; then
  echo 'graph_title table count' # グラフのタイトル。
  echo 'graph_args --base 1000 -l 0' # 何も気にせず書く。
  echo 'graph_vlabel adfit_database_info' # グラフのラベル。y軸のとこに出ます。
  echo 'graph_category other' # グラフのカテゴリ。一覧のHTMLで表示されるカテゴリ。DiskとかNetworkとかOtherとかProcessesとかのやつ。
  echo 'graph_info Database data info.' # グラフの情報。詳細ページの下の方に出る。

  echo 'foo.label total foo' # fooテーブルの件数についてのラベル。
  echo 'foo.draw LINE2' # 線グラフという意。他にもAREAやSTACKがある、らしい。
  echo 'foo.info total foo table count.' # ラベルfooに対する説明。

  echo 'bar.label bar table count' # barテーブルの件数についてのラベル。
  echo 'bar.draw LINE2' # 線グラフという意。他にもAREAやSTACKがある、らしい。
  echo 'bar.info total bar table count.' # ラベルfooに対する説明。
  exit 0
fi

引き続き、引数なしで実行された時の処理を書きます。
# vim table_count
----------------------------------
echo -n "foo.value "
/path/to/mysql databasename -u username -e 'SELECT COUNT(*) FROM foo' | awk 'NR==4 { print }' | sed -e "s/ //g"

echo -n "bar.value "
/path/to/mysql databasename -u username -e 'SELECT COUNT(*) FROM bar' | awk 'NR==4 { print }' | sed -e "s/ //g"
かなりぶきっちょな書き方ですみません。もっとスマートな方法あるかも知れません。

これを実行プラグインのシンボリックリンクがあるディレクトリに、同じくシンボリックリンクを貼ります。
yumでインストールした場合は、/etc/munin/plugins になります。
# ln -s /usr/share/munin/plugins/table_count /etc/munin/plugins

最後にmunin-nodeを再起動して完了です。
# /etc/init.d/munin-node restart


これでグラフが描画されるはずです。
以上でぇぇぇぇぇぇぇぇす。

2011年7月27日水曜日

javascriptでurlエンコードしたものをphpでデコードする

どうも、俺@仕事中です。
相変わらずNodeやってます。

Node側でユーザの入力データを受け取り、それをphpへ渡すような事をする場合は
javascriptで入力データをURLエンコードしてphpでデコードを行う必要が出てきます。

javascriptには
escape(str);
encodeURI(str);
encodeURIComponent(str);
の3つエンコード関数があり
phpには
urldecode($str);
rawurldecode($str);
の2つデコード関数があります。

どうやらそれぞれエンコード/デコードのアルゴリズムが違うらしく
全くデータの受け渡しが出来なかったので、どれとどれの組み合わせだったらうまく動作するのか確認しようかな
と思ってたところ、やってくれてる方がいらっしゃいました。

JavaScriptとPHPのURLエンコード【JavaScript,PHP】:Programming Magic

このサイトを参考にして、javascriptでは
encodeURIComponent(str)
してからphpへ送り、
phpでは
rawurldecode($str);
すれば正しく受け渡しができました。感謝!!
逆の場合でも同じですね。


以上でぇぇえっぇぇす。

2011年7月19日火曜日

socket.ioをv0.6.xからv0.7.xへ変更する

どうも、俺@仕事中です。

socket.ioのv0.7.xが出てたという噂を聞きつけて早速
# npm update socket.io
しちゃったら、途端にnodeアプリが動作しなくなっちゃいました。
そこで、socket.ioのv0.7.xの仕様変更、特にメッセージ送受信部分について簡単にめもめもします。
まぁ、、socket.io : github : Migrating 0.6 to 0.7からの引用です。
※express上で動作させているものとします。


■ソケットの生成
・サーバ側
var io = require("socket.io").listen(app);
io.sockets.on('connection', function(socket) {
   console.log('接続されました');
});

・クライアント側
var socket = io.connect('http://node.server.com:3000');
すでにv0.6.xと実装が異なります。

■メッセージ送受信
・サーバ側
io.sockets.on('connection', function(socket) {
  socket.on('message', function(data) {
    // 受信処理
  });
});

・クライアント側
var socket = io.connect('http://node.server.com:3000');
socket.send(data);
// または
socket.json.send(data, [callback]);
v0.7.xからは socket.json.send() により明示的にJSONへ変換するように指定できるようになりました。(省略可)
それ以前は自動的にJSONへ変換がかかっていたので、それを変換する/しないが指定できるようになった形です。
callbackでは、送信後の処理を記述できます。(送達確認処理)

■メッセージ送受信(カスタムイベント)
v0.7.xからはメッセージやり取りに開発者の指定するカスタムイベントによって送受信できるようになりました。
・サーバ側
socket.on('custom event', function(data) {
  // custom eventを受け取ったときの処理
});

・クライアント側
socket.emit(custom event, data, [callback]);


■サーバからのメッセージ送信
・サーバ側
// 自分自身へ送る
socket.emit('custom response', data);
// 自分以外全員へ送る
socket.broadcast.emit('custom response', data);
// 自分を含む全員へ送る
io.sockets.emit('custom response', data);

ちなみにこれらemit()でサーバから送られたデータをクライアント側で受け取る場合は、第1引数に指定されたイベント名でなければ受信できません。
・クライアント側
socket.on('custom response', function(data) {
  // 受け取ったときの処理
});

v0.6.xのようにクライアント側で
socket.on('message', function(data) {
});
で受け取る場合は、サーバ側の送信部分は
socket.send(data);
socket.broadcast.send(data);
io.sockets.send(data);
のように記述すればOKです。

また特定のソケットセッションに対し送信することもできるようになりました。
・サーバ側
io.sockets.socket(<session id>).send(data);
io.sockets.socket(<session id>).emit('custom response', data);
<session id>は任意のセッションIDです。

セッションIDはv0.6.xまではsocket.sessionIdで取得していましたが、v0.7.xからはsocket.idで取得できるようになりました。



以上でぇぇぇぇぇす。

2011年7月15日金曜日

node.jsで自作モジュールの作り方

どうも、俺@昼ごはんは鯛の刺身を食べました。

さて、nodeでモジュールを作る方法についてメモメモです。
nodeは本日v0.5.1がリリースされたとこですね。

nodeで言う「モジュール」というのはjavaやphpなどでいう「クラス」みたいなものです。
でも実態はjavascriptなので、中身は関数群というか関数オブジェクトのかたまりですね。
参考)http://nodejs.org/docs/v0.5.1/api/modules.html#modules
commonsJSの仕様にのっとって利用します。

利用するフレームワークはexpressとします。
サンプルとしてよくある人間クラス(Person)を作ります。
hello()メソッドで"hello!"と、myName()メソッドで自分の名前を出力します。
Person.js
var Person = function(name) {
  this.name = name;
  this.hello = function() {
    console.log("hello");
  };
  this.myName = function() {
    console.log(this.name);
  };
};
module.exports = Person;
module.exportsは、モジュール全体を関数化(オブジェクト化)する時に利用します。
ちなみにjavascriptのprototypeを使うパターンでも同じです。
var Person = function(name) {
  this.name = name;
};
Person.prototype.hello = function() {
  console.log("hello");
};
Person.prototype.myName = function() {
  console.log(this.name);
};
module.exports = Person;

app.js
var Person = require("/path/to/Person");
var p = new Person("koexuka");
p.hello();  // "hello!"
p.myName();  // "koexuka"
です。


またはもう一つやり方があり
Person.js
exports.setName = function(name) {
  this.name = name;
};
exports.hello = function() {
  console.log("hello!");
};
exports.myName = function() {
  console.log(this.name);
};

app.js
var p = require("/path/to/Person");
p.setName("koexuka");
p.hello();  // "hello!"
p.myName();  // "koexuka"
です。
こちらの方が少し簡略ですね。


以上でぇぇぇえぇぇぇぇす。

2011年7月14日木曜日

使いどころが分からないUnixコマンド

どうも、俺@仕事中です。

今日はどういう使い方をしたら良いか分からないUnixコマンドの紹介です。
$ talk username
talkコマンド。
同サーバにログインしているusernameとチャットをすることができます。
ちなみに別ホストにいるユーザに対しては
$ talk username@ホスト名
です。
チャットを終了する場合は<Ctrl>+dです。
ただしtalkdデーモンが起動している必要があります。これまたマニアックなデーモンですね。
今時、便利なメッセンジャーアプリが多くありますし、電話もありますし。。
全ての通信手段が利用不可になり、サーバ上でやり取りをするしかない場合は使えるかもしれません。


続いて
$ time cmd
timeコマンド。cmdは実行コマンドです。
引数に指定したコマンドの開始~終了までの実行時間を測定します。
どんなベンチマークで使うのでしょう。。



以上でぇぇぇぇぇす。

2011年7月7日木曜日

javascriptでスマホのタッチ(タップ)イベントを取得する

どうも、俺@仕事中です。お久しぶりです。
最近はクライアントjavascriptを書いたり、nodeを書いたり、やたらjavascriptばかりイジっています。

今日はスマホブラウザ(iphoneやandroid)でタッチ(タップ)に対するイベントをjavascriptで取得する方法をめもめもします。

// 1)ontouchstart
document.getElementsByTagName("body").item(0).ontouchstart = function() {
  alert("touchされたよ");
};
// 2)ontouchmove
document.getElementsByTagName("body").item(0).ontouchmove = function() {
  alert("touchされて移動してるよ");
};
// 3)ontouchend
document.getElementsByTagName("body").item(0).ontouchend = function() {
  alert("touchが終わったよ");
};
jQueryだともっと楽に書けます。
ちなみにiphoneのsafariだと確実に動作しますが、androidはGalaxySでしか確認していません。
が、新しいandroid端末であればほぼ大丈夫だと思います。

以上でぇぇえぇぇえす。

2011年5月31日火曜日

iptablesを使ってパケットの中継

どうも、俺@仕事中です。

今日はiptablesを使ってパケットを中継させたいと思います。
例えばapacheにプロキシ機能がありますが、それをiptablesを使ってやるというような事です。
サーバ移行などで、移行中でも稼働させたい場合などで使えますね。

例では
旧サーバ(192.168.0.10)の8088ポートをプロキシとして、
新サーバ(192.168.0.11)の80ポートへ中継しそれを返す場合です。
# iptables -t nat -A PREROUTING -p tcp --dport 8088 -j DNAT --to 192.168.0.11:80
この設定は、旧サーバ側のnatを使い、そのパケットを新サーバへ転送前(PREROUTING)に中継(DNAT)します。
-p プロトコル
--dport 向かってきたポート
--to 中継先サーバ:ポート

次にDNATで新サーバへ中継したパケットの戻りを旧サーバで受け取り処理する処理です。
#iptables -t nat -A POSTROUTING -d 192.168.0.11 -p tcp -j SNAT --to 192.168.0.10:8088
新サーバからのアドレス送信元を旧サーバへSNATします。

あとは保存しておきましょう。
# /sbin/service iptables save
 # /sbin/service iptables restart


以上でぇぇえぇぇす。午後からも仕事がんばるで。

2011年5月27日金曜日

screenでattachできない!

どうも、俺@始業しました。

ちょうど先ほど、会社端末から開発サーバ(Linux)へSSH接続しいつものように
$ screen -rU
と既存のscreenに対しアタッチしようとしたのですが、なぜかアタッチできない現象に襲われました。

滅多にない事だとは思いますが、こんなときは
$ screen -D screen番号
で強制的にdetachしてその後attachしちゃいましょう!

ちなみにscreenにはマルチモードというのがあって、アタッチされている仮想端末に対し
$ screen -x -rU screen番号
とすれば複数のターミナルから同じ仮想端末環境へアタッチできる。
2つの画面から同じ端末の内容を操作&閲覧できるよ。
今回のようにアタッチ出来ない場合もマルチモードで接続してからデタッチできるかも。


以上でぇぇぇぇぇえぇす!

2011年5月20日金曜日

FreeBSDでの自動起動設定

どうも、俺@残業中です。

今日は少しマニアックはFreeBSDで自動起動設定をする際のメモメモです。

他一般的なLinux(CentOSとか)だと
/etc/rc.local/起動.sh を設置
または
# /sbin/chkconfig --add [サービス名]
# /sbin/chkconfig [サービス名] on
とかでいいんですが。

FreeBSDの場合はOS起動時にまず /etc/defaults/rc.conf 設定ファイルを読みサービスを起動させます。
次に /etc/rc.conf を読みます。

自作起動スクリプトは
/usr/local/etc/rc.d/起動.sh
を置いてればOkでーーーーーーす!


以上でぇぇぇえぇぇぇす。

2011年4月15日金曜日

CentOS5にcairoインストールでハマる

どうも、俺@ハマってばっかりです。

CentOS5にrrdtoolをソースからインストールする場合、色んなパッケージも一緒にインストールする必要があります。
yumで一発インストールすればすべて解決なので、そんな便利な物使えない時ってありますよね。。。いや、なくてもソースからconfigureオプション指定してキチっとインストールしたい場合ありますよね。

rrdtoolをインストールする際にはざっと
・zlib
・libpng
・freetype-2
・fontconfig
・libpango
・libcairo
・libpixman
が必要になります。他にもgdとかも必要かな。

今日はその中のcairoをインストールする際にハマったのでメモメモ。
./configureコマンドで
configure: error: pixman >= 0.10.0 is required
と出てしまい、「こりゃpixmanってやつインストしなあかんねんな」と思いpixmanをググって探します。
pixman-0.20.2あったので
# wget http://cairographics.org/releases/pixman-0.20.2.tar.gz
 # tar zxvf pixman-0.20.2.tar.gz
 # cd pixman-0.20.2
 # ./configure
 # make
 # make install
でインストしました。
# ls /usr/local/lib
libpixman-1.a
libpixman-1.la
libpixman-1.so
libpixman-1.so.0
libpixman-1.so.0.20.2
ちゃんとインストされてます。
# cd /path/to/cairo
 # ./configure
configure: error: pixman >= 0.10.0 is required
あれれ!?また同じエラーが、、

pixmanライブラリを認識していないでは?と思い
# vim /etc/ld.so.conf
------------------------------
/usr/local/lib

# ldconfig
としてもダメ。
# ./configure --libdir=/usr/local/lib
としてもダメ。



そんな時は
# export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/local/share/pkgconfig:/usr/lib/pkgconfig:/usr/share/lib/pkgconfig
としてみてください。
きっと解決するはず。
詳しくはman pkg-configに。


以上でぇぇえぇす。

2011年4月13日水曜日

CentOS4.3にnode.jsをインストールする

どうも、俺@お仕事中です。
忘れないうちにメモメモします。

CentOS4.3にnode.js(0.4.2)をインストールした時少しハマりました。
まずは本体をDL。
# wget 'http://nodejs.org/dist/node-v0.4.2.tar.gz'
次に解凍しいつものやつ。
# tar zxvf node-v0.4.2.tar.gz
# cd node-v0.4.2
# ./configure
まずここでズッコけました。

Pythonのバージョンが2.4以上でないとconfigureできないようです。
# python -V
Python 2.3.4
ズッコケた場合は、各々の環境に合わせてインストールされているPythonのバージョンを上げてください。
僕の環境では古いバイナリをアンインストールし、新しいバージョンのものをソースから再インストールしました。
# python -V
Python 2.7
次にmake。
# ./configure 
# make
ここでまたズッコけました。
/mnt/src/node-v0.4.2/deps/v8/src/platform-linux.cc:587: error: `PR_SET_NAME' was not declared in this scope
/mnt/src/node-v0.4.2/deps/v8/src/platform-linux.cc:587: warning: unused variable 'PR_SET_NAME'
scons: *** [obj/release/platform-linux.o] Error 1
scons: building terminated because of errors.
Waf: Leaving directory `/mnt/src/node-v0.4.2/build'
Build failed:  -> task failed (err #2): 
        {task: libv8.a SConstruct -> libv8.a}
make: *** [program] エラー 1
この 'PR_SET_NAME' というのが問題らしいのですが、この記述があるものをコメントアウトしちゃいます。
# grep -r 'PR_SET_NAME' *
deps/v8/src/platform-linux.cc://  prctl(PR_SET_NAME, thread->name(), 0, 0, 0);
src/platform_linux.cc://  prctl(PR_SET_NAME, process_title);
2ファイル出てきたので両方とも該当行をコメントアウトします。
これでインストールはスムーズにいくはずです。
# make
# make install
おわり!


以上でぇぇぇぇえぇぇぇぇえぇす。

2011年4月1日金曜日

iptablesでipマスカレード設定

どうも、俺@週末です。

iptablesを使ってipマスカレードの設定めもめも。
ローカル回線しかないLinuxサーバでもきちんとデフォルトゲートウェイの設定をしてあげれば、ローカルサーバからグローバルのデータを取得することは出来ます。

・グローバルサーバ(192.168.0.10:ゲートウェイとなる)ローカル回線とグローバル回線
・ローカルサーバ(192.168.0.11) ローカル回線のみ
とします。

まずグローバル側の設定から始めましょう。
// グローバルサーバ
# iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
普通はこんな感じ。
// グローバルサーバ
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE -s 192.168.0.0/24
# iptables -L -t nat
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
[root@ss79 cadox]# iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  192.168.1.0/24       anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ふむふむ、ちゃんと設定されている。
次に転送設定。
// グローバルサーバ
# iptables -P FORWARD ACCEPT
# service iptables save
かなりザックリですが。。
// グローバルサーバ やり方は色々ありますが、、
# vim /etc/sysctl.conf
----------------------------------
net.ipv4.ip_forward = 1

# sysctl -p
または
// グローバルサーバ
echo 1 > /proc/sys/net/ipv4/ip_forward
など。。

次にローカルサーバ側でデフォルトゲートウェイの設定を行います。
// ローカルサーバ
# route add default gw 192.168.0.10
# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     *               255.255.255.0   U     0      0        0 eth1
xxx.xxx.xx.xx   *               255.255.0.0     U     0      0        0 eth1
default         192.168.0.10    0.0.0.0         UG    0      0        0 eth1 // ←できてる
再起動しても設定がリセットされないように
// ローカルサーバ
# vim /etc/sysconfig/network
----------------------------
GATEWAY=192.168.0.10 # ←追加
これでOK!

以上でぇぇぇえっぇぇす。

2011年3月18日金曜日

postgresqlでSELECTした結果でUPDATEをかける

どうも、俺@仕事中です。

postgresqlでSELECTした結果を利用してUPDATE(更新)をかける方法についてメモメモ。

dbname=# select * from table_a;
 id | name | ref_id 
----+------+--------
  1 | xxx  |     10
  2 | xxx  |     11
  3 | xxx  |     12
(3 rows)

dbname=#
dbname=# select * from table_b;
 id | name 
----+------
 10 | aaa
 11 | bbb
 12 | ccc
(3 rows)
テーブルはこういう状態だとします。
期待する結果は
dbname=# select * from table_a;
 id | name | ref_id 
----+------+--------
  1 | aaa  |     10
  2 | bbb  |     11
  3 | ccc  |     12
(3 rows)
table_bのnameでtable_aのnameを更新したい場合。

dbname=# UPDATE table_a
 SET name = foo.name
 FROM (SELECT * FROM table_b) AS foo
WHERE a.ref_id = foo.id;
これで出来ます!


以上でぇぇぇぇぇぇぇえぇす。

2011年3月9日水曜日

apacheのリバースプロキシでSSL接続しちゃう

どうも、俺@仕事中です。

またまたハマりました。
タイトル通り、apache(2系)のリバースプロキシ機能を使ってローカル内のapacheにSSL接続しようと思ってハマりました。
ググったらたくさん参考資料出てくるんですけどね、、

イメージは
クライアントブラウザ →(SSL)→ Proxyサーバ[192.168.10.10] →(SSL)→ ローカルapacheサーバ[192.168.10.11]
です。

まずapacheをインストールする際に mod_proxyとmod_ssl、mod_proxy_connectが有効になっていないといけません。(多分、、)
# /usr/local/apache2/bin/httpd -l
で上記のモジュールが出てくれば問題ありませんが、なければapacheをインストールし直しましょう。
# ./configure --enable-module=so --with-included-apr --enable-proxy --enable-ssl --enable-proxy-connect
オプションは環境に合わせて変えてください。
# make && make install

では、まずhttpd.confでリバースプロキシの設定しましょう。
# vim /usr/local/apache2/conf/httpd.conf
----------------------------------------------
# 以下を追加
ProxyRequests off
ProxyPass / http://192.168.10.11/
ProxyPassReverse /http://192.168.10.11/
ProxyPassReverseCookieDomain mydomain local-domain
ProxyPassReverseCookiePath / /
<Proxy *>
 order deny,allow
 deny from all
 allow from xxx.xxx.xxx.0/24 ....# あとは適当に
</Proxy>
リバースプロキシだけの設定では以上です。

これからSSLの設定を行いましょう。
※証明書の作り方は以前(opensslを使って秘密鍵と証明書の作成)も書いたのでそちらも参照ください。

オレオレ証明書作ります。
まず、CA秘密鍵作成
# openssl genrsa -rand /var/log/messages -out ca.key 1024
-randオプションはランダムなデータを作成する元となるファイルを適当に選択。
次にCA証明書の署名要求作成
# openss req -new -key ca.key -out ca.csr
ここは色々質問されますが、内容は割愛します。
では次に証明書発行
# openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt
これでCA証明書まで完成です。

次はサーバ用証明書を作成しましょう。
まずサーバ用秘密鍵を作ります
# openssl genrsa -rand /var/log/maillog -out server.key 1024
↑と一緒ですね。
次にサーバ証明書の署名要求を作ります
# openssl req -new -key server.key -out server.csr
これも↑と一緒。
次にシリアルを記述した適当なファイルを作成
# echo 01 > ca.serial
では証明書を発行しちゃいましょう
# openssl x509 -req -days 3650 -CA ca.crt -CAkey ca.key -in server.csr -out server.crt
出来ました!

これを適当な場所へコピー(移動)します。
# cp server.crt /usr/local/apache2/conf/ssl/server.crt # ←サーバ証明書
 # cp server.key /usr/local/apache2/conf/ssl/server.key # ←サーバ秘密鍵
ふぅ。


最後にapacheの設定です。
# vim /usr/local/apache2/conf/httpd.conf
-----------------------------------------------
<IfModule mod_ssl.c>
 Include conf/ssl.conf
</IfModule>

 # vim /usr/local/apache2/conf/ssl.conf (必要な部分のみ抜粋)
----------------------------------------
Listen 443
<VirtualHost _default_:443>
SSLCertificateFile /usr/local/apache2/conf/ssl/server.crt
SSLCertificateKeyFile /usr/local/apache2/conf/ssl/server.key
<VirtualHost>

#SSLCACertificatePath /usr/local/apache2/conf/ssl.crt いらない!?
#SSLCACertificateFile /usr/local/apache2/conf/ssl-bundle.crt いらない!?

#SSLVerifyClient require いらない。クライアントの認証が必要であれば付ける
#SSLVerifyDepth 1 いらない

SSLProxyEngine on
ProxyPass / https://192.168.10.11/ # ローカルのapacheが例えば4444ポートでSSLを動かしてる場合は ProxyPass / https://192.168.10.11:4444/ね
ProxyPassReverse / https://192.168.10.11/ # こっちも ProxyPassReverse / https://192.168.10.11:4444/ね
出来ましたー!!

起動!!
# /usr/local/apache2/bin/httpd -k start -DSSL
たぶんパスフレーズ聞かれるので応えてあげてね。
ちなみにパスフレーズを聞かれるのが面倒な人は
# vim /usr/local/apache2/conf/ssl.conf
----------------------------------------------
SSLPassPhraseDialog exec:/usr/local/apache2/bin/pp-exec
# パスフレーズを入力するためのダイアログタイプ。builtin(デフォルト)またはexec。
で、
# vim /usr/local/apache2/bin/pp-exec
------------------------------------------
#!/bin/sh
echo "パスフレーズ"
だぜ!



以上でぇぇぇぇぇぇぇぇぇぇぇす。

2011年3月8日火曜日

phpインストール時にlibxml2を除外する

どうも、俺@おもいっきり残業中です。

php(ver.5.3.5)をインストールしてて、libxml2関連のエラーが出る場合。
※makeしたときにエラーが出ました。

configure: error: libxml2 version 2.6.10 or greater required.
僕の場合はこんな感じでしたが、いかんせんサーバが古いため試行錯誤した結果、libxml2を再インストール(またはアップデート)することを諦めた人へ。。。

簡単な話が、configureオプションでlibxml2を外してやればいいのです。

# vim /usr/local/src/php-5.3.5/conf.sh
----------------------------------------------
#!/bin/sh
./configure --with-apxs2=/usr/local/apache2/bin/apxs --enable-mbstring --enable-zend-multibyte --with-pgsql=/usr/local/pgsql --with-pdo-pgsql=/usr/local/pgsql --enable-sockets --disable-libxml --disable-dom --disable-simplexml --disable-xml --disable-xmlreader --disable-xmlwriter --without-pear
普段のオプションに加えて
--disable-libxml --disable-dom --disable-simplexml --disable-xml --disable-xmlreader --disable-xmlwriter --without-pear
これらを追加してやればmakeできます!!

ただし、phpのlibxml(xml)関連、DOM関連、PEARがインストールされませんのであしからず!


以上でぇぇぇえぇす。

2011年2月25日金曜日

PHPとpostgresqlでテーブル一覧を取得

どうも、オレ@始業しましたです。

忘れないうちにメモメモ。
DBがpostgreSQLでphpからテーブル一覧を取得するためのクエリについて。
postgreSQLのバージョンは7.4.12ですが、おそらく他のバージョンでも大丈夫かな?(未確認)
PHPのバージョンは5以上です。
<?php
$pdo = new PDO('pgsql:host=localhost;port=5432;dbname=dbname;user=username;password=password');
$sql = 'select pg_statio_user_tables.relname
from pg_catalog.pg_class,pg_catalog.pg_statio_user_tables
where relkind='r'
and pg_catalog.pg_statio_user_tables.relid=pg_catalog.pg_class.relfilenode';
$stmt = $pdo->query($sql);
var_dump($stmt->fetchAll());
連想配列(fetchAll()した結果)でテーブル一覧が取得できます。
ただし、作った覚えのないテーブルも含まれているので要注意。

ちなみに、MySQLだと簡単で
<?php
$sql = 'show tables';
$stmt = $pdo->query($sql);
var_dump($stmt->fetchAll());
です。

以上でぇぇぇす。

2011年2月23日水曜日

vimでバックスペースが効かない

どうも、俺@残業中です。

いつも忘れるので備忘録。
vimでバックスペースを入れても無反応 or DELETE状態になってる場合。
■対策1
.vimrcを編集
$ vim ~/.vimrc
--------------------
noremap ^? ^H
noremap! ^? ^H
noremap  ^H
noremap!  ^H
を追加。
^?はインサートモードでCtrl + v + BackSpace
^HはインサートモードでCtrl + v + Ctrl + h

■対策2
sttyを設定
$ stty -a
erase = ^H
があることを確認。
もしなければ、
stty erase ^H
を設定する。


これでも出来なければまたググってくださぁぁぁあぁぁい。

2011年2月16日水曜日

innotopを使う

どうも、オレ@仕事中です。

オデの日記::mytopを使うに続きまして、innotopの利用です。

今回参考にさせてもらったサイトはThe Programmer’s Guide to the Parallel World::MySQL: innotopとサンプリングです。ありがとうございます。

まずinnotop(source forge)から本体をDLします。
# wget 'http://downloads.sourceforge.net/project/innotop/innotop/1.6.0/innotop-1.6.0.zip?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Finnotop%2F&ts=1297835567&use_mirror=jaist'
解凍し、インストールします。
# unzip innotop-1.6.0.zip
 # cd innotop-1.6.0
 # perl Makefile.PL
 # make install
ちなみに、僕の環境ではここでまたperlモジュールのエラーが出ました。
なのでまたもやcpan利用します。
# cpan install Time::HiRes
 # make install
これでOK。

初回実行時に色々設定を質問されます。
# innotop
You have not defined any database connections.
Choose a name for the connection.  It cannot contain whitespace, colons or semicolons.

Enter a name:  ここは何でもOK
----------------------------------------------------------------------
Typical DSN strings look like
   DBI:mysql:;host=hostname;port=port
The db and port are optional and can usually be omitted.
If you specify 'mysql_read_default_group=mysql' many options can be read
from your mysql options files (~/.my.cnf, /etc/my.cnf).

Enter a DSN string:  DBI:mysql:database=DatabaseName;host=hostname;port=portのような形で入力
何も指定しない場合はDBI:mysql:;; かな
失敗したらユーザのホームディレクトリに~/.innotop/というディレクトリがあるので
丸ごと削除で再度設定できる&~/.innotop/innotop.iniを書き換える事で修正可能です。

# innotop -d 秒間
のようにして利用できます。
mytopよりinnotopの方が見やすいと思いました。

以上でぇぇぇえぇす。

mytopを使う

どうも、オレ@仕事中です。

今日はMySQLの実行状況を確認できるmytopというツールの紹介します。
また後でinnotopについても書く(予定)です。
Unixコマンドのtopをmysql版にしたようなものです。

まず上記のサイトからtarボールをDLし解凍します。
# wget 'http://jeremy.zawodny.com/mysql/mytop/mytop-1.6.tar.gz'
# tar zxvf mytop-1.6.tar.gz
# cd mytop-1.6
次にインストールです。

# perl Makefile.pl
ここで以下のようなエラーでる場合
Warning: prerequisite DBD::mysql 1 not found.
Warning: prerequisite Term::ReadKey 2.1.not found.
cpanモジュールでインストールしましょう。

# cpan install DBD::mysql # 該当サーバでMySQLサービスを停止させておいてね!
 # cpan install Term::ReadKey
これでOK!
ではインストール。ドキュメント通りにやります。

# make
 # make test
 # make install
これでインストール完了です。

あとは実行するのみ。
# mytop -s1 -hlocalhost -uUserName -pPassword
-s は表示間隔(秒)です。

ちなみに、MySQLバージョン5以上の場合はmytopソース内の「SHOW STATUS」を「SHOW GLOBAL STATUS」に書き換える必要があります。

MySQL on localhost (5.0.41)                                                                                                                                                                                                         up 0+00:14:17 [14:33:46]
 Queries: 81.0   qps:    0 Slow:     0.0         Se/In/Up/De(%):    00/00/00/00 
             qps now:    0 Slow qps: 0.0  Threads:    1 (   1/   0) 00/00/00/00 
 Key Efficiency: 100.0%  Bps in/out:   0.2/ 14.4   Now in/out:   8.4/ 1.1k

      Id      User         Host/IP         DB      Time    Cmd Query or State                                                                                                                                                                 
      --      ----         -------         --      ----    --- ----------                                                                                                                                                                               
       5      root       localhost       test         0  Query show full processlist
実行中スレッドが黄色、接続のみのスレッドが白、システムに関するスレッドが緑色です。

内容は
Queries: 発行されたクエリの総数
 qps: 秒間の平均クエリ数
 Slow: スロークエリ総数
 Se/In/Up/De: select、Insert、Update、Delete分の比率
 qps now: 現在の秒間平均クエリ数
 Slow qps: 現在の秒間平均スロークエリ数
 Threads: スレッド数(アクティブスレッド数/総スレッドキャッシュ数)
 Key Efficiency: ky_bufferヒット数
 Bps in/out: 合計のデータ転送速度(bytes/sec)
 Now in/out: 現在のデータ転送量(bits/sec)

FLATzブログ::mytopの使い方を参考にさせてもらいました。

以上どぇぇぇえす。

2011年2月9日水曜日

javascriptでsleepみたいな事やりたい

どうも、俺@残業中です。

javascriptでsleep();、、そんなものはございません><

ただし、似たようなものでwindow.setInterval(func, millisec);があります。
例えば現在時刻をリアルタイムに表示させるには
<div id="nowtime"></div>
<script type="text/javascript">
  window.setInterval(setTimer, 1000);
  function setTimer() {
    var nowdate = new Date();
    var year = nowdate.getFullYear();
    var mon  = nowdate.getMonth() + 1;
    var day  = nowdate.getDate();
    var hour = nowdate.getHours();
    var min  = nowdate.getMinutes();
    var sec  = nowdate.getSeconds();

    var elem = document.getElementById("nowtime");
    elem.innerHTML = year + "年" + mon + "月" + day + "日" + " " + hour + "時" + min + "時" + sec + "秒"; 
  }
</script>
でできちゃいますよ!
間違ってもwhile(true)とかで無限ループさせないようにね!

以上でぇぇぇぇす。

2011年2月1日火曜日

PPTPサーバ構築

どうも、俺@仕事中です。

docomoのGalaxyTab+ポケットwifiルーターを1円で購入(月額5,000円くらい)したので、休みの日にネットブック持ち歩かず優雅にGalaxyTabを持ち歩くことにしました。
突然の障害はGalaxyTabからsvn接続で対応!と計画中です。(かなり操作しづらいけど)
androidの「connectbot」というアプリがsshクライアントとして利用できます。

なのでVPNサーバ(PPTP)を構築することにしました。
超簡単です。
OSはCentOS4.3です。

まずpppをインストール。http://ppp.samba.org/から最新のソースをDLしておく
# wget 'ftp://ftp.samba.org/pub/ppp/ppp-2.4.5.tar.gz'
# tar zxvf ppp-2.4.5.tar.gz
# cd ppp-2.4.5
# ./configure
# make && make install
これでよし。

次にpptpdを最新ソースからインストール。
# wget 'http://sourceforge.net/projects/poptop/files/pptpd/pptpd-1.3.4/pptpd-1.3.4.tar.gz/download'
# tar zxvf pptpd-1.3.4.tar.gz
# cd pptpd-1.3.4
# ./configure
# make && make install
これでよし。

次は設定ファイルを修正します。
まずは/etc/pptpd.conf
# vim /etc/pptpd.conf
------------------------------
 option /etc/ppp/options.pptpd
 localip 192.168.0.15 PPTPサーバのローカルIP
 remoteip 192.168.0.110-131 # クライアントに割り振られるローカルIP。ローカルネットワーク内の問題なさそうな範囲でOK

次は/etc/ppp/options.pptpd
# vim /etc/ppp/options.pptpd
------------------------------
lock
noauth
nobsdcomp
nodeflate
idle 0
maxfail 0
# 書いたほうが良いかもしれない
# name servername
# ms-dns 192.168.0.1 ←クライアントへ通知するDNSサーバアドレス
どこかのサイトを参考にさせてもらいました。(どこだったか忘れちゃいました><)

次は/etc/ppp/chap-secrets
# vim /etc/ppp/chap-secrets
------------------------------
# Secrets for authentication using CHAP
# client    server  secret          IP addresses
UserName * "Password" *
UserNameとPasswordにログインするユーザ名、パスワードを設定します。

もうちょいです。ルーティングの設定。
# vim /etc/sysctl.conf
-------------------------------
# net.ipv4.ip_forward = 0 コメントアウト
net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
この設定で反映させます。
# sysctl -p

ここまで来たらpptpdサーバを起動させます。
/sbin/service pptpd start


あとはGalaxyTabなどのクライアントからVPN接続(PPTP)するだけ!
L2TP版でもやったけど、上手く行かなかったので、、、また今度試してみます><

以上どぇぇぇえぇぇぇぇぇえぇぇす。

2011年1月5日水曜日

nmapを使う

新年明けましておめでとうございます。
本年もよろしくお願いします(`・ω・´)

今日はnmapの使い方めもめもです。
このツール、すごく便利でかつ怖いですね。使う際は慎重に!

まずはTCPスキャン。
# nmap -sT localhost

Starting nmap 3.70 ( http://www.insecure.org/nmap/ ) at 2011-01-05 16:28 JST
Interesting ports on localhost.localdomain (127.0.0.1):
(The 1655 ports scanned but not shown below are in state: closed)
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
80/tcp open http
873/tcp open rsync
3306/tcp open mysql

Nmap run completed -- 1 IP address (1 host up) scanned in 0.285 seconds
これは自サーバ内でのポートスキャン結果です。
ポートを絞って行う場合は
# nmap -sT localhost -p 80-3306

Starting nmap 3.70 ( http://www.insecure.org/nmap/ ) at 2011-01-05 16:31 JST
Interesting ports on localhost.localdomain (127.0.0.1):
(The 3224 ports scanned but not shown below are in state: closed)
PORT STATE SERVICE
80/tcp open http
873/tcp open rsync
3306/tcp open mysql

Nmap run completed -- 1 IP address (1 host up) scanned in 0.243 seconds
80番ポートから3306番ポートまででTCPパケットを送り、どのサービスが動作しているか確認できます。

次にローカルネットワーク内(192.168.60.0/24)でPINGスキャンしてみます。
# nmap -sP 192.168.60.0/24

Starting nmap 3.70 ( http://www.insecure.org/nmap/ ) at 2011-01-05 16:37 JST
Host 192.168.60.0 seems to be a subnet broadcast address (returned 8 extra pings).
Host 192.168.60.1 appears to be up.
MAC Address: 00:06:5B:24:A2:A0 (Dell Computer)
Host 192.168.60.2 appears to be up.
MAC Address: 00:07:40:97:9A:C7 (Melco)
Host 192.168.60.10 appears to be up.
MAC Address: 78:CA:39:F9:6A:D3 (Unknown)
Host 192.168.60.11 appears to be up.
.
.
.
(中略)
MAC Address: 00:80:F0:33:42:47 (Panasonic Communications Co.)
Host 192.168.60.255 seems to be a subnet broadcast address (returned 14 extra pings).
Nmap run completed -- 256 IP addresses (46 hosts up) scanned in 3.250 seconds
ネットワーク内でどのホストが生きている/死んでるを確認するとき便利ですね。

UPDパケットで確認するときは(snmpd/udpデーモンの確認など)
# nmap -sU localhost

Starting nmap 3.70 ( http://www.insecure.org/nmap/ ) at 2011-01-05 16:39 JST
Interesting ports on localhost.localdomain (127.0.0.1):
(The 1477 ports scanned but not shown below are in state: closed)
PORT STATE SERVICE
123/udp open|filtered ntp

Nmap run completed -- 1 IP address (1 host up) scanned in 1.475 seconds
で確認できます。

実際にどのようなサービスが起動しているか確認するには
# nmap -sS -sV 192.168.60.214 -p 21-80,110,3306,5432

Starting nmap 3.70 ( http://www.insecure.org/nmap/ ) at 2011-01-05 16:43 JST
Interesting ports on 192.168.60.214:
(The 58 ports scanned but not shown below are in state: closed)
PORT STATE SERVICE VERSION
21/tcp open ftp ProFTPD 1.3.0
22/tcp open ssh OpenSSH 3.1p1 (protocol 1.99)
23/tcp open telnet Linux telnetd
25/tcp open smtp Postfix smtpd
80/tcp open http Apache httpd 2.2.13 ((Unix) PHP/5.3.3)
MAC Address: 0A:00:00:00:00:0D (Unknown)

Nmap run completed -- 1 IP address (1 host up) scanned in 5.353 seconds
あらら、丸分かり。
-sSはステルススキャン。TCP接続をフルで行わないので早い?のかな。half-openスキャニングと言うらしい。対象のサーバにログを残さなない場合は多い。※root権限
-sVはサービスを確認する。が付けなくてもrootで動かせばサービス確認できると思います。


以上どぇぇぇす。