Practice of Programming

プログラム とか Linuxとかの話題

Perl で WebSocket クライアント

こんなんで良いかなぁ。

#!/usr/bin/perl

use strict;
use warnings;

use POSIX ":sys_wait_h";
use Protocol::WebSocket::Handshake::Client;
use Protocol::WebSocket::Frame;
use IO::Socket;
use open ':utf8';
use open ':std';

$| = 1;

run();

sub run {
  my $s = IO::Socket::INET->new(PeerAddr => '127.0.0.1', PeerPort => 50000, Proto => 'tcp');

  if ($s->connected) {
    my $hc = Protocol::WebSocket::Handshake::Client->new(url => 'ws://127.0.0.1:50000');
    my $parent_pid = $$;
    print $s $hc->to_string;

    if (my $pid = fork()) {
      # parent process
      warn "parent:" . $parent_pid;
      warn "child :" . $pid;
      local @SIG{qw/INT TERM ALRM/} = (sub { client_exit($s); }) x 3;

      while (my $msg = <STDIN>) {
        if (waitpid (-1, WNOHANG)) {
          warn "child($pid) is gone (server is down ?)";
          client_exit($s)
        }
        last unless $msg;
        chomp($msg);

        my $frame = Protocol::WebSocket::Frame->new($msg);
        print $s $frame->to_string;
      }
      # close connection.
      client_exit($s);
    } elsif (defined $pid) {
      # child process
      close STDOUT; close STDIN; close STDERR;
      while (my $l = $s->getline) {
        print $l;
      }
      # send INT signal to parent process.
      kill 2, $parent_pid;
    }
  }
}

sub client_exit {
  my $s = shift;
  if ($s->connected) {
    # close connection
    print $s "\xFF\x00";
    close $s
  }
  if (my $child_pid = wait -1, WNOHANG) {
    kill 9, $child_pid;
  }
  exit;
}

STDINで入力したのを、127.0.0.1:50000に立てたサーバに送るだけです。

podの原文に=begin original =end originalを挿入する関数

perlのドキュメントを翻訳する際に原文残す場合は、該当部分を =begin original 〜 =end original で囲むことが推奨されています。以下みたいな感じ。

=begin original

原文

=end original

翻訳

手で書くのは面倒なので、以下のような関数作ってます。

(defun oi ()
  (interactive)
  (insert "=begin original\n\n")
  (search-forward-regexp "^\n")
  (goto-char (match-beginning 0))
  (insert "\n=end original\n")
)

これで、原文の先頭にて、Alt-x oi って打てば、次の開業までを =begin original 〜 =end original で囲ってくれます。

MMM for multiple cluster

These days, I'm using MMM(Multi-Master Replication Manager).
MMM is for the cluster which has one writer role and some reader roles.
If you have some master databases, you have to separate configuration file for their master databases like the following:

mmm_mond_cluster1.conf
mmm_mond_cluster2.conf

And you have to use command like this:

# mmm_control @cluster1 show
# mmm_control @cluster2 show

mmm_mond must be ran for each cluster. So, you must specify pid file and port(write them in monitord configuration) and set CLUSTER variable in each mmm_monitord init script.


You must write same number of init script as number of clusters.

/etc/init.d/mysql-mmm-monitor_cluster1
/etc/init.d/mysql-mmm-monitor_cluster2

Their difference is only the value of CLUSTER variable.

Check the following.

Gnomeを捨て、OpenBoxに変えてみた

compizも楽しかったけど、4GBメモリ積んでて通常作業でSwapも結構使っちゃうので、もういいや。
懐かしのblackboxにしようかと思ったけど、さすがに、数年間メンテされてないし、古すぎ感があるので、別のものを試してみた。
なお、Ubuntu 10.04の話です。


最初、Fluxboxを試したのだが、どうにもグラフィックが重い(特にデュアルディスプレイ)。で、他のものを物色していたところ、OpenBoxが目に止まり、何週間か使ってみていますが、かなり良い感じです。

こんにちは、Openbox

Openbox も Blackboxからforkされて作られたが、3.0からは全部rewriteされたそうだ。blackboxC++だが、openboxはC。
ちなみに、下記にX window manger の比較がある。
http://en.wikipedia.org/wiki/Comparison_of_X_window_managers

ショートカットキーの設定

Openbox の configは、 ~/.config/openbox/rc.xml にある。ここで、キーボードショートカットの設定ができる。まだ、ちゃんとできてないけど、結構柔軟そう。


Thinkpadのボリュームボタンがそのままだと効かないので、ショートカットに割り当てています。以下のようになります。

    <keybind key="XF86AudioRaiseVolume">
      <action name="Execute">
        <command>amixer sset Master,0 1+</command>
      </action>
    </keybind>
    <keybind key="XF86AudioLowerVolume">
      <action name="Execute">
       <command>amixer sset Master,0 1-</command>
      </action>
    </keybind>

"XF86AudioLowerVolume"のようなキーボードの名前を調べるときは、xev コマンドを使います。

バイバイ gdm

gdmも捨てることにしました。 wdm にしました。若干野暮ったい。xdmよりはマシっていうくらい。
SLIMが良い感じに見えるんだけど、どうも動かない。


shutdown 時は root の ID/Password で、halt を選ぶ。


(追記)iwaimさんに教えてもらって、LXDMにしました。こっちのがいいですね。

タスクバーアプリケーション(tint2)

Openboxは見た目、Blackboxより何も無い感じなので、以下のページを参考にアプリケーションを入れるといいかも。
http://openbox.org/wiki/Help:Contents#Cool_programs_to_run_with_Openbox


tint2はタスクバー用のアプリケーションです。packageからではなく、ソースからインストールしました。最新であれば、always on top が可能なので。

panel_layer = top
strut_policy = follow_size

という設定を~/config/tint2/tint2rcに書けばOKです。
ノートPCであれば、battery関係もon にしておけば良いかと。


tintwizard.py というGUIアプリでも設定可能です。起動後にファイルをopenしてから、設定を変更します。
起動時に自動でconfigファイルを読み込んくれません。


tintwizard
http://code.google.com/p/tintwizard/

※make とかは不要。実行ファイルをパスの通ったところにコピーするだけ

デュアルディスプレイ

gnomeのディスプレイ設定もないので、デュアルディスプレイの設定は、xrandr を直接叩くスクリプトを作りました。
例えば、こんな感じ。

#!/bin/sh

xrandr  --output LVDS1 --mode 1440x900  --pos 0x150  --output VGA1  --mode 1680x1050 --pos 1440x0 --rotate left

※最初 --left-of や --right-of を使っていたのだが、 最大化時に問題が出たので変えました(これは、OpenBox と tint2を使ったときに、tint2の上にかぶさってしまうという問題回避のためですが)
外付けのディスプレイを外す時は、

#!/bin/sh

xrandr  --output LVDS1 --mode 1440x900 --output VGA1  --off

こんな感じ。


LVDS1 とか、VGA1 とかの名前と解像度は、xrandr をオプションなしで実行すればわかります。

bluetooth

blueman ていうパッケージがありますので、それを入れるといいです。

% blueman-applet

で、システムトレイに現れます。

ボリュームコントロール

tint2 の other projects に上がっていた物を入れました。
http://softwarebakery.com/maato/volumeicon.html

これは、ソースからインストール。volumeicon コマンドで、それっぽいのがシステムトレイに出てきます。

nm-applet (ネットワーク接続管理用アプレット) がWifiのパスワードを覚えてくれない

ずっと解決できずにいたのですが、gnome-keyring-daemon のlocaleをCに変更することで直りました。
autostart.sh に

LC_ALL=C gnome-keyring-daemon &

としておけばOK。

自動起動用script、 autostart.sh

~/.config/openbox/autostart.sh にスタートアップのアプリケーションを書きます。必要最低限のために以下くらいをいれています。

# キーボードのスピード調節
xset r rate 200 70
# タスクバー
tint2 &
# keyring (日本語だとnetwork-managerがパスワードを保存してくれなかった)
LC_ALL=C gnome-keyring-daemon &
# ネットワークマネージャー
nm-applet &
# ボリューム
volumeicon &
# bluetooth
blueman-applet &
# 更新チェッカー
update-notifier &
# 壁紙設定(Esetrootとか、なんでもいいけど)
hsetroot -tile ~/path/to/picture/file.jpg   &

network-manager & nm-applet の代わりに wicd & wicd-gtk というのを組み合わせでもOK。
ただし、wicdは、VPNGUI設定はない。

メニューの編集

僕は、ショートカット厨なので、右クリックメニューはあんまり使わないのですが、ショートカットに割り当てるほどは使わないアプリケーションはメニューに入れます。
~/.config/openbox/menu.xml に書くのですが、obmenu(packageにあり) というGUIアプリケーションがあるので、それを使ったほうがいいでしょう。

その他微調整とか

右クリックメニューから、ObConfてのを選ぶと、テーマとか、マウスの設定とか、いろいろ選べます。

その後

なかなか調子良いです。ようやく落ち着いた。

日本語入力メソッド Sekkaのインストール

sekka は kiyokaさんが作っている日本語入力メソッドです。下記参照。
http://oldtype.sumibi.org/show-page/Sekka

sekka のインストールは下記のとおりです
http://oldtype.sumibi.org/show-page/Sekka.Setup

とりあえず僕の環境(Ubuntu 10.04)では...

以下の追加パッケージをインストール。

依存するモノの場所は、

rubygems をインストール。

% ruby1.9.1 setup.rb --prefix=/usr/local/rubygems1.5.0

tokyocabinetrubyのライブラリをインストール(1行で)。

% GEM_HOME=/usr/local/rubygems1.5.0  RUBYLIB=/usr/local/rubygems1.5.0/lib/ 
 /usr/local/rubygems1.5.0/bin/gem1.9.1 install tokyocabinet 
 -- --with-tokyocabinet-dir=/usr/local/tokyocabinet

Sekkaのインストール(1行で)。

% GEM_HOME=/usr/local/rubygems1.5.0  RUBYLIB=/usr/local/rubygems1.5.0/lib/
  /usr/local/rubygems1.5.0/bin/gem1.9.1 install sekka  

無事インストール完了。

sekka の起動(1行で)。

% GEM_HOME=/usr/local/rubygems1.5.0  RUBYLIB=/usr/local/rubygems1.5.0/lib/ 
 /usr/local/rubygems1.5.0/bin/sekka-server  

辞書作成か何かで時間かかるので、その間にEmacsの設定。
と言っても、以下を追加するだけ。

(push "/usr/local/rubygems1.5.0/gems/sekka-0.8.2/emacs/" load-path)
(require 'sekka)
;;(setq sekka-sticky-shift t)  ;; sticky-shiftを使用する場合、この行を有効にする
(global-sekka-mode 1)

これで、とりあえず動きます。

以下、Sekkaで書いた文章になります。

以前、sumibi を入れていたのですが。変換が遅いなどの理由で使わなくなっていました。
そこで、同じ作者のkiyoka さんのsekka を使ってみようかと思ったしだいです。

しかし、これ普通の人がすらすら使うのはかなり厳しそう。
僕がSKKを使ったことがないからだと思うけど、大分難しい。
訓練が必要ですね…

しばらく使ってみようかと思います。
馴れたら結構、速く打てるのだろうか…。

一文節ずつ変換というのがまず慣れるのに時間がかかりそうです。
sumibiみたいに後で選べたら良いんだけどなぁ…

Applications

I bought Motorola xt720 about 2 months ago.
My using applications are the following.

Applications

  • LinkPush
  • LauncherPro
    • Alternative HOME application.
    • Enable to resize widgets.
    • LauncherPro has some widgets(If you pay money). I like calendar & Twitter widgets.
  • Tasker
  • APNdroid
    • used by Tasker
  • EasyTether Lite
    • Enable to tether with USB connection without rooted.
  • DroidWing FREE
    • Dictionary
  • Google Sky Map
    • In Tokyo, Sky has a few stars ...
  • ASTRO File Manger
    • File Manager.
  • ASTRO SMB Module
    • Samba module for ASTRO File Manager.
  • Advanced Task Killer
    • Task Manager
  • Barcode Scanner
    • To scan QR code.
  • NewsRob
  • MoreLocale 2
    • to change locale.
  • Nimbuzz
  • Kindle
  • Dropbox
  • かけ〜ぼ
    • Household account book. easy to record.
  • Palmoroid
    • for FX

Widgets/Status

  • World Forecast Clock Widget
    • I like Today's wether widgets. It costs 2 column normaly, but LauncherPro can resize it.
  • Cliph Weather
    • I like 1x4 widgets
  • BatteryIndicator
    • Inform battery use more detailed.
  • Quick Settings
  • aDataConMon
    • Notify APN status.
  • APN OnOff
  • Calendar Pad

オンライン番号

あっ、下書きのつもりだったのに、保存しちゃってたw

Skypeのオンライン番号を取得すると、発信者番号を表示できるとのことだったので、試しにやってみました。
僕は、もともとSkypeの月額料金を払ってます。固定電話に実質無制限にかけられるというやつ。
それに入っていると、オンライン番号は割引で取得できます。3ヶ月で、1500円くらい。33%オフのようです。

んで、結果なんですが。

電話への発信

willcomに電話しても表示されず。通知不可能とか出てきます。
auに電話した場合、表示されるものの、オンライン番号と関係ない番号。そのうえ、二つの番号が交互に表示されるという謎な感じになりました。

電話からの着信

オンライン番号への電話。固定電話からも、携帯電話からも可能。Skypeにかかります。

通話転送

通話転送を設定していると、Skypeがオフの時に、他の電話へ転送してくれます。
発信元がわかりませんでしたが、willcomだからかも?