hamacoの日記

どうでもいい日常をたれながす日記だと思う

SSHでログインしようとしたらサーバが変わったとエラーがでた

サーバを再インストールした後、SSHでログインしようとしたら以下の様なエラーがでて困った。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
.
.
RSA host key for rdev.jp has changed and you have requested strict checking.
Host key verification failed.

普段は~/.ssh/known_hostsをvimで開いて該当箇所消したりしてたんだけど、なにやらコマンドで出来るらしいのでやってみた。

known_hosts内の情報検索

以下のコマンドを実行すると、対象のIPのデータがknown_hostsにあると1行でてくる。

% ssh-keygen -F 203.0.113.1
# Host 203.0.113.1 found: line 5 type RSA
203.0.113.1 ssh-rsa AAAA......

known_hostsから該当ホストの情報削除

データを削除したい場合は-Rをオプションに付けてやれば良いみたい。

% ssh-keygen -R 203.0.113.1

ただ、.ssh/configに書いてあるHostの名前からだと動かないっぽい。これはSSHでアクセスする時点でHostNameの値に置き換わってからknown_hostsに登録されるからしょうがないのかなー。

Sabelを試しつつバッチ処理を作ってみる (PHP Advent Calendar jp 2010 Day 19)

こんにちは、PHP Advent Calendar 2010 19日担当のhamacoです。
昨日はid:heavenshellさんの「Introduction of Net_KyotoTycoon_Rest」でした。

CodeIgniterネタがありみたいなので、今日はSabelネタでいきたいと思います。前日からの紹介にもSabelの開発者って書かれてたしね。
インストールしてブラウザで見るのだと、Apacheの設定とか面倒なので今回は全てコンソールで完結できるようにバッチ処理を作ってみたいと思います。

とりあえず動くまで

今回はとりあえず使ってみようと言うことで、アプリケーションの直下にSabelを置くことにして、パスを通したりとかそういった面倒なことは飛ばします。

% mkdir /path/to/application
% cd /path/to/application
% svn co http://www.php-framework.org/svn/sabel/trunk Sabel
% SABEL_HOME=./Sabel Sabel/bin/sabel

これで、アプリケーションが動く状態になりました。

バッチ用のアクション作成とか

Sabelのアプリケーション設置が終わったら、次はバッチが動くようにします。
まず、バッチ用のモジュールディレクトリを作成しテキトーなプログラムを置きます。

% mkdir -p app/batch/{controllers,views}
% vim app/batch/controllers/Sample.php
<?php

class Batch_Controllers_Sample extends Sabel_Controller_Page
{
  public function index()
  {
    dump("Hello Batch World!!");
  }
}

次に、ルーティングの設定をしてbatchモジュール以下にアクセスできるようにします。
以下をconfig/Map.phpのconfigureメソッドの一番上に貼り付けて下さい。

$this->route("batch")
       ->uri("batch/:controller/:action")
       ->module("batch")
       ->defaults(array(
         ":controller" => "index",
         ":action"     => "index")
       );

バッチ処理の実行

% php /path/to/application/sabel.php "batch/sample"

================================================
string(19) "Hello Batch World!!"
================================================

ここまでで気付いている人もいるかも知れませんが、Sabelはバッチ処理で特別な処理を行なう必要がない為、普通のアクションもコンソールから実行できます。

% php /path/to/application/sabel.php "index/index"

================================================
string(13) "Hello World!!"
================================================

これを利用して、コンソールから実行した時だけ強制的にmemcachedとかのキャッシュを更新できるようにしたりして、キャッシュが切れた時にアクセスが重たくならないようにしたりとかに使えるかもしれません(私は使ったことないですが)。

ちょっと問題が

ただ、コンソールから普通のアクションを叩けるという事は、そのままだと逆にバッチ処理用のプログラムがブラウザからアクセスできてしまうという事になってしまいます。
f:id:hamaco:20101219010046p:image:h480

これは、config/Map.php内でコンソール専用のルーティングを用意することで対応できます。
先程のルーティングを以下の様に変えると、コンソールからアクセスした時だけのルーティングが作れます。

if (is_cli() === true) {
  $this->route("batch")
         ->uri("batch/:controller/:action")
         ->module("batch")
         ->defaults(array(
           ":controller" => "index",
           ":action"     => "index")
         );
}

これで、コンソールからしかアクセスできないbatchモジュールを作ることが出来ました。後はモデル使ったりとか色々やってみて色々なバッチ処理を作ってみて下さい。

まとめ

バッチ処理とかいいつつ、普通にHello Worldしてるだけとか。
Sabel使ってる人見たことないので役に立つかどうか分からないですが、少しでも興味を持ってくれたら試しにSabelを使ってみて感想とかくれると嬉しいなー。
他にも色々やってみたい場合Sabel PHPフレームワークを見るとか、Sabelの開発者にTwitterとかで聞いてみるとかしてみると良いんじゃないでしょうか?
Sabelのバージョンが最新ではないですが、codereposPhwittrというTwitterクローンがあるのでそちらを参考にしてみるとSabelがどんな感じのものなのか分かって良いかもしれません。Sabelの開発者自身がサンプルになるように作っているので、それなりにSabelの機能を使用しているはずです。

明日の担当は@omoonさんです。よろしくお願いしますー。

Sabel_Mailを使ってGmailからメールを送る

特に難しいことはないですが、最近2回ほどPHP+Gmailの単語を見た気がするので。

$user = "hamanaka.kazuhiro@gmail.com";
$config = array(
	"host" => "ssl://smtp.gmail.com",
	"auth" => "login",
	"user" => $user,
	"password" => "Gmailのパスワード",
);
$sender = new Sabel_Mail_Sender_Smtp($config);

$mail = new Sabel_Mail("ISO-2022-JP");
$mail->setSender($sender);
$mail->setFrom($user, "hamaco");
$mail->setTo("test@example1.jp");
$mail->setSubject("Sabelからのテストメール");
$mail->setBody("Sabel_Mailを使ったGmailからのメール送信テストです");
$mail->send();

こんな感じでhostにssl://を付ければ普通にSSL/TLSを使ってGmailでメール送れます。

PHP5.3で非推奨になった機能や関数をざっくりあぶり出すワンライナー(Sabel版)

via. http://d.hatena.ne.jp/shimooka/20100727/1280198801:title=

Sabelでもやってみた。

find . -iname \*.php -print0 | xargs -0 grep -wE 'define_syslog_variables|register_globals|register_long_arrays|safe_mode|magic_quotes_gpc|magic_quotes_runtime|magic_quotes_sybase|(call_user_method|call_user_method_array|define_syslog_variables|dl|ereg|ereg_replace|eregi|eregi_replace|set_magic_quotes_runtime|session_register|session_unregister|session_is_registered|set_socket_blocking|split|spliti|sql_regcase|mysql_db_query|mysql_escape_string)\(|\$[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*\{[0-9]+\}|(= *& *new)'
./generator/generator.php:      if ($item{0} === "." && $item !== ".htaccess") continue;
./generator/skeleton/en/lib/form/html/date/Base.php:      $char = $yearRange{0};
./generator/skeleton/en/lib/Paginator.php:        if (preg_match('/^[A-Z]/', $key{0}) === 1 && strpos($key, "_") !== false) {
./generator/skeleton/en/tasks/Fixture.php:        if ($dir{0} !== "/") {  // relative path
./sabel/annotation/Reader.php:        $quote = $v{0};
./sabel/db/ibase/Metadata.php:      if ($default{0} === "'") {
./sabel/db/pgsql/Metadata.php:        if ($default{0} === "'") {
./sabel/functions/core.php:      $str{0} = strtolower($str{0});
./sabel/mail/mime/Decoded.php:    if ($str{0} === '"') {
./sabel/mail/MimeDecode.php:        $quote = $value{0};
./sabel/map/config/Route.php:      if ($name{0} !== ":") {
./sabel/util/fileSystem/Base.php:      return ($path{0} === "/");
./sabel/util/FileSystem.php:      if ($ignoreDotFiles && $item{0} === ".") continue;
./sabel/util/FileSystem.php:      if ($ignoreDotFiles && $item{0} === ".") continue;
./sabel/util/FileSystem.php:      if ($ignoreDotFiles && $item{0} === ".") continue;
./sabel/util/String.php:  public function split($length = 1)
./sabel/Validator.php:    if ($m{0} === "-") {
./sabel/xml/Query.php:    if ($path{0} === "@") {
./sabel/xml/Query.php:      $first  = $_value{0};
./Test/Util/String.php:    $array  = $string->split();
./Test/Util/String.php:    $array  = $string->split();

SymfonyとかZend Frameworkもそうっぽいけど、文字列のアクセスが基本的に引っかかってますねー。

eskk.vimをMacで使ってみた

最近急激に進化していて、ある程度常用出来そうになってきてたのでここしばらくeskk.vimを使ってみています。
Windowsでは特にskkimeと上手く使い分けるのに困らなかったのですが、MacだとAquaSKKとの使い分けが良く分からなくてeskk.vimを使うのを半分諦めていたのですが、なんかできたような気がするのでメモかねてブログに残してみる。

eskk.vim導入

eskk.vimの導入は特に面倒なこともなく、ここから普通にDLしてきてruntimepath上に配置するだけで動きます。
自分はpathogen.vimを使っているので、~/.vim/bundles/ で git cloneして気が向いた時にpullしながら使用しています。

pathogen.vimを使っていないのであれば、

function update_eskkvim() {
  wget -qO - http://github.com/tyru/eskk.vim/tarball/master | tar -xzC ~/.vim --strip-components=1
}

こんな感じのを.zshrcにでも書いておいて気が向いた時にupdate_eskkvimを実行すればいいんじゃないでしょうか?

eskk.vimの設定

設定も特に面倒なことはないと思います。自分はとりあえず以下のように設定しています。

if has('vim_starting')
	let g:eskk_dictionary = '~/.skk-jisyo'

	if has('mac')
		let g:eskk_large_dictionary = "~/Library/Application\ Support/AquaSKK/SKK-JISYO.L"
	elseif has('win32') || has('win64')
		let g:eskk_large_dictionary = "~/SKK_JISYO.L"
	else
	endif
endif

let g:eskk_debug = 0
let g:eskk_egg_like_newline = 1
let g:eskk_revert_henkan_style = "okuri"
let g:eskk_enable_completion = 0

Vimを起動後に.vimrcを再読み込みとかしなければここまで書かなくてよいのですが、eskk.vimが辞書の設定を文字列からオブジェクト?ディクショナリ?に変更してしまうので、再読み込みした時にエラーがでないようにifでくくっています。
オプションが違っていたり、もっとシンプルに書けたり、補完有効にしてると現在問題あるので無効化したりしました。

eskk.vim以外の設定

Windowsで使っている場合は、.vimrcに以下を追加すればskkimeに邪魔されることもなくeskk.vimが使えるようになるはずです。
これ書いてる時点で設定してあるWindowsがないので、明日にでも確認してみます。

set imdisable

Macの場合は.vimrcでなく、MacVimにフォーカス当てた状態でメニューバーのAquaSKKから直接入力モードにチェックを入れてやればAquaSKKに邪魔されることもなくeskk.vimが動くようになります。
自分はこの設定をまったくしらなかったので、しばらくの間eskk.vimを使う為だけにTerminalのvimで遊んだりしていました。
Terminalのvimは元々TerminalがAquaSKKを無視ぶっちぎるので気にしなくて大丈夫です。

終わり

完全にskkime&AquaSKKを使っている人にしか役に立ちそうにない内容になってしまった。
まあ、MSIMEとかATOKことえりGoogle IMEなんかを使っているような人はeskk.vimを使ってみる前にskkimeとかAquaSKKとかを使うべきだと思いますよ。
今の所は圧倒的にskkimeとかAquaSKKのが安定しているので……

auto-fu.zsh入れてみた

zshで自動補完ができるようになるらしいので、使ってみたメモ。
http://d.hatena.ne.jp/hchbaw/20100526/1274886125のサイトを見ながらファイルDLと.zshrcに1行追加すれば自動補完が使えるようになりました。
自分は

setopt no_auto_remove_slash

を設定していたので/がダブってしまったので上記部分をコメントアウトしました。
たったこれだけで入力中に勝手に補完候補が表示されるので一々候補見るためにTabキーを押す必要がないのでだいぶ楽になりました。
ただ、上のサイトのアニメーションgifだとlsのオプションも補完されているけど、自分の環境だと34(33) to many matches...と出てしまうのでその部分を調べてどうにかすれば目的達成かな〜
これiPadで書いてみたんですが、思っていたよりもiPadの入力は使いやすいですね。

ref.vimを入れてみた

最近php.netを見ると英語で表示されるようになってしまったり、一々ブラウザにフォーカス当てたり、一度入力した関数名をもう一度入力するのが面倒になってきたのでref.vimを導入してみました。

ref.vimのインストール

http://github.com/thinca/vim-refにあるので、DownloadsページからDLするかgitコマンドで取ってくるだけですぐに使えます。
今回は特に理由はないですが、gitコマンドで取ってきます。

% git clone http://github.com/thinca/vim-ref.git

取ってきたら、後は$HOME/.vimディレクトリに中身を放り込めばref.vimが動くようになります。

phpmanualのDL&設定

これだけだとref.vimは動きますが、PHPのマニュアルを見ることができないのでその設定もします。
phpmanualを見る為には、マニュアルのHTMLファイルをローカルに置いておかないといけません。
http://jp2.php.net/download-docs.phpから日本語のMany HTML filesをDLして自分の好きな場所に置きます。
自分はPC毎に毎回DLするのが面倒だったのでDropbox/phpmanualの中に入れました。
DLが終わったら.vimrcに以下の1行を追加しましょう。

let g:ref_phpmanual_path = $HOME . '/Dropbox/phpmanual'

phpmanualを見るのに、w3m等のテキストブラウザが必要なようなので、もし入っていない場合インストールします。
elinks / w3m / links / lynxの順にコマンドがあるかどうか調べているようなのでこのうちのどれかが入っていれば大丈夫なはずです。
Macにはどれも入っていなかったので、macportsからw3mをインストールしました。

% sudo port install w3m

これで、PHPファイルを編集中に調べたい関数の上でS-kを押すだけでウィンドウが分割されてマニュアルを見ることが出来るようになります。
もしくは、:Ref phpmanual {command}でも見れます。

他にも

perl / python / erlangのマニュアルが見れたり、alcで検索できたりするのでPHP使ってなくてもとりあえず入れてみるといいんじゃないでしょうか?

第6回XOOPS Cubeサタデーラボ 開催

最近毎月開催しているXOOPS Cube サタデーラボが今月22日(土)に開催されます。まだまだ参加可能なのでもしXOOPSに興味があって来れる方は是非来て下さい。
懇親会費アップの許可がでたので今月から懇親会費そのままで、食事が豪華になる予定ですので是非!!

5月22日(土曜)17時より当社ミーティングスペースにて、第6回XOOPS Cubeサタデーラボを開催いたします。

今回のゲストスピーカーは下記の方達です。

○ohwada氏
XOOPS用モジュールをいくつも開発・公開されているohwada氏には、webphotoやweblinksなどご自身で開発されたモジュールについて話していただく予定です。

○株式会社RYUS argon
弊社のargonには、XOOPS CubeのiPhone対応テーマについて話して頂きます。

参加申込はこちらからお願いします。

Googleリーダー + RSS Flash gを試してみた

最近iPhone関係のブログとかでRSSの話があると、ほぼ100%がGoogleリーダー関係のアプリの話ばかりなので久しぶりにGoogleリーダーを試してみました。

とりあえず、RSS Flash gには画像のキャッシュ機能があるらしいので購入。

はじめはLDRのフィードをインポートしてみたんだけど、何かする度にブラウザが数分止まって何もできなくて常用出来るRSSリーダーじゃ無いので、AeroReaderで見ると面倒なEngadgetとかの画像が見たい奴だけLDRから移して試すことに。

何回かアプリを使ってみての感想ですが、
良い所

  • 一つのボタン押し続けるだけで最後までアイテムを見れる
  • 画像がキャッシュされるので画像付きのフィードでもサクサク読める
  • Instapaperやはてブとの連携がある

悪い所

  • ボタンが多くて小さいので押しにくい
  • ボタンの挙動が次の未読・前のアイテムで動きがわかりにくい
  • フィードがあまり見やすくない
  • アイテムの移動時に一瞬真っ白になって待たされてる感がある

といった、画像がキャッシュされてサクサク見れるメリット以上にデメリットのが多すぎてストレスが溜まるのですぐ削除してしまいました。というか、デメリットの大半はAeroReaderに慣れてなければ全然問題ない気がしますね。

まだ他にもGoogleリーダーのアプリで画像キャッシュがあるのがいくつかあるようなので次はそれを試してみようかなー。次試すとしたらBylineですかね。

iPhoneで長文書いてみましたが、これだいぶ疲れますね。特に予測変換がおバカ過ぎて辛いです。