Promptを使ってiPadからsshを試す

最近iPadを購入したので技術者らしくsshクライアントを探してみた。


Google先生に聞いてみたら、Prompt(\600)がなかなかよさそうとのことだったので、さっそくインストール。

試しにさくらVPSを登録してみた。

公開鍵認証を使っている場合は少し手間がかかる。

以下手順


1. 普段iPadを同期しているPCでssh鍵を生成(設定を行った環境はmacbook)
ターミナルを開いて
ssh-keygen -t rsa
パスフレーズが聞かれるので任意のパスフレーズを入力


2.PCからさくらVPSにログインして作成した公開鍵を登録
ログインしたユーザのホームディレクトリの.sshディレクトリ以下にあるauthorized_keysを開く
vi ~/.ssh/authorized_keys
作成した公開鍵をauthorized_keysに追記
追記が完了したらVPSからログアウト


3.作成した秘密鍵iTunes経由でiPadに転送
デフォルトだとホームディレクトリの.sshディレクトリの下にある
~./.ssh/id_rsa

iPadを接続してiTunesを起動し、iPadに入っているアプリ一覧を表示するタブに移動
下の方にPromptの項目があるので、「追加」をクリックして秘密鍵iPadに転送


4.iPadでPromptを起動し、サーバ情報を入力
ログイン画面に表示される鍵マークをクリックすると秘密鍵が表示されるので選択
後は登録したパスフレーズを入力すればサーバにログインできる


これでiPadでの開発が可能に。
今回はiPadでログインできるところまでしか確認していないので開発環境として有用かどうかは不明。
とりあえずソフトウェアキーボードの場合、キーボードの表示だけで画面が半分埋れてしまうのでかなり見づらいのが正直なところ。
Bluetoothキーボードが欲しくなった。

Vimプラグインのインストールいろいろ

はじめに

作業効率アップのために、vimをカスタマイズする

参考サイト:

vimプラグインでよりよいコーディングを

vimに欠かせない3つのプラグイン

最新版のvimをインストール

まずは古いのをアンインストール

yum -y remove vim vim-enhanced

ダウンロード

cd /tmp
wget ftp://ftp.vim.org/pub/vim/unix/vim-7.3.tar.bz2 && wget ftp://ftp.jp.vim.org/pub/vim/extra/vim-7.2-extra.tar.gz && wget ftp://ftp.vim.org/pub/vim/extra/vim-7.2-lang.tar.gz

ncursesが必要なのであらかじめインストール

yum -y install ncurses-devel

コンパイル&インストール

tar jxvf vim-7.3.tar.bz2 && tar zxvf vim-7.2-extra.tar.gz &&tar zxvf vim-7.2-lang.tar.gz
mv vim72 vim73/
cd vim73
cd src
./configure --enable-multibyte \
--with-features=huge \
--disable-selinux \
--prefix='/usr/local/vim-7.3'
make && make install


実行ファイルは/usr/local/vim-7.3/bin/vimにあるのでaliasを設定する

vim ~/.zshrc
alias vi=/usr/local/vim-7.3/bin/vim


参考サイト:

CentOSにVim最新版をインストールする

vim-pathogenのインストール

インストール

cd ~
ls -1A > .gitignore
vi .gitignore
  .vimは削除

git init
git submodule add git://github.com/tpope/vim-pathogen.git .vim/

mkdir .vim/bundle

vimrcに以下を記述
vim .vimrc
    " .vim/bundle/plugin_nameを読み込むようにする
    call pathogen#runtime_append_all_bundles()

    " .vim/bunle/plugin_nameのヘルプを読み込めるようにする
    call pathogen#helptags()

参考サイト:

vimプラグインの管理をpathogen.vimにした

vim-refのインストール

vインストール

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

phpマニュアルのダウンロード(Many HTML files)

wget http://jp2.php.net/get/php_manual_ja.tar.gz/from/jp.php.net/mirror
tar vfzx php_manual_ja.tar.gz
mv php-chunked-xhtml phpmanual

vimrcにマニュアルのパスを追加

vim .vimrc
    let g:ref_phpmanual_path = $HOME . '/phpmanual'


マニュアルを見るにはw3mが必要らしいのでインストール

yum install w3m
yum install w3m-img


使い方

:Ref phpmanual echo
でechoのリファレンス

:Ref alc word
で英辞朗の検索ができる

php関数の上でShift+kを押すとその場で調べられる

参考サイト:

ref.vimを入れてみた

unite.vimのインストール

インストール

git clone git://github.com/Shougo/unite.vim.git
mv unite.vim .vim/bundle


使い方

現在のディレクトリのファイルの一覧を表示
Unite file -buffer-name=files

最近開いたファイルを表示
Unite file_mru

カレントディレクトリで絞り込んだ最近開いたファイルを表示
UniteWithCurrentDir file_mru

neocomplcache.vimのインストール

インストール

git clone git://github.com/Shougo/neocomplcache.git
mv neocomplcache .vim/bundle

.vimrcに以下を記述

vmi .vimrc
    let g:neocomplcache_enable_at_startup = 1

補完機能がつく

入れるだけで動くので便利


参考サイト:

neocomplcache.vim インストールメモ

vim-quickrunのインストール

インストール

git clone https://github.com/ujihisa/quickrun.git
mv uickrun/ .vim/bundle/

プログラムを作成中に「\r」とすると、その場で実行してくれる

はずが…

「許可がありません」と表示されうまく動かなかった

とりあえずインストール方法だけ載せておく


参考サイト:

vim-quickrunを使って高速開発

neco-lookのインストール

wget 'http://www.vim.org/scripts/download_script.php?src_id=14993' -O neco-look.zip
unzip neco-look.zip
rm neco-look.zip 
mv neco-look-1.1/ .vim/bundle/


参考サイト:

Hack #208: 英語を正確に素早く入力する


まとめ

とりあえず効率化できると言われるプラグインを色々インストールした

インストールはできたもののまだまだ使いこなせてない状態

これから少しづつカスタマイズしていこう

VMWareToolsのインストール

仮想マシンにVMWareToolsをインストール(CentOS5.5)


導入によるメリット
・グラフィックパフォーマンス向上
・マウス操作のパフォーマンス向上


メニューバーから「VMWareToolsのインストール」を選択後

mount /dev/cdrom /media
cd /tmp
tar zxf /media VMwareTools-7.7.6-203138.tar.gz
cd vmware-tools-distrib
./vmware-install.pl


参考にさせていただいたサイト:VMware Server による仮想化(8) − VMware tools のインストール

キーボード配列の変更方法

仮想マシンとしてCentOSをインストールしたらキーボード配列が違ったので修正(CentOS 5.5)

vi /etc/sysconfig/keyboard


日本語キーボードの場合

KEYBOARDTYPE="pc"
KEYTABLE="jp106"


英字キーボードの場合

KEYBOARDTYPE="pc"
KEYTABLE="us-acentos"


参考にさせていただいたサイト:CentOSでキーボード配列の変更

symfonyからTwitter Streaming APIを使ってつぶやきを保存してみる

TwitterのStreaming APIを利用する機会があったのでメモしておきます。
symfonyのバージョンは1.4.8、ORMはPropelを用いました)


参考URL:Twtter Streaming API(filter)を使ったサンプルプログラム


上記ブログに記載されていたサンプルプログラムを参考にさせていただいて、symfonyでつぶやきを保存する機能を作ってみました。

Streaming APIについて

Twitter API 仕様書 日本語訳 第五十版 (2010年8月12日版)によると、現在のところ、誰でも使えるStreamingAPIとしては


①public_timelineを取得し続けるsample
http://stream.twitter.com/1/statuses/sample.format
(format = json or xml


②フィルターを使って絞り込んだつぶやきを取得できるfilter
http://stream.twitter.com/1/statuses/filter.json
(こちらはjsonのみ)

の2種類が利用できます。


今回はfilterを使って特定のハッシュタグ(#twitter)を含むつぶやきを取得するプログラムを作成しました。

つぶやきを保存するためのTweetモデル作成

まずはschema.ymlにDBのテーブル構造を記述します。

今回はステータスID、本文、ユーザ名、つぶやき時刻を保存してみます。

vi config/schema.yml

propel:
  tweet:
    id: ~
    id_str: { type: varchar(64), index: unique }  #ステータスID
    text: { type: varchar(140) }                      #本文
    screen_name: { type: varchar(15) }                #ユーザ名
    created_at: { type: TIMESTAMP }                   #つぶやき時刻


DB構築&モデルの作成

symfony propel:build --all --no-confirmation

これでつぶやき保存用のモデルが作成されました。

Streaming APIを利用するタスクを作成

つぶやき取得用のタスクを作成

symfony generate:task tweet:get  

lib/task/tweetGetTask.class.phpが作成されます。

参考URL:symfonyからmailを送る


sf_root_dir/configディレクトリにapp.ymlを作成し、twitterに関する設定項目を記述しておきます。

vi config/app.yml
all:
  twitter_id: "TwitterID"
  twitter_pw: "Password"
  twitter_stream_url: "http://stream.twitter.com/1/statuses/filter.json"
  twitter_keyword: "twitter"


作成されたタスクを編集します。

vi lib/task/terrtGetTask.class.php

<?php

class tweetGetTask extends sfBaseTask
{
  protected function configure()
  {
    // // add your own arguments here
    // $this->addArguments(array(
    //   new sfCommandArgument('my_arg', sfCommandArgument::REQUIRED, 'My argument'),
    // ));

    $this->addOptions(array(
      new sfCommandOption('application', null, sfCommandOption::PARAMETER_REQUIRED, 'The application name', 'frontend'),
      new sfCommandOption('env', null, sfCommandOption::PARAMETER_REQUIRED, 'The environment', 'dev'),
      new sfCommandOption('connection', null, sfCommandOption::PARAMETER_REQUIRED, 'The connection name', 'propel'),
      // add your own options here
    ));

    $this->namespace        = 'tweet';
    $this->name             = 'get';
    $this->briefDescription = '';
    $this->detailedDescription = <<<EOF
The [tweet:get|INFO] task does things.
Call it with:

  [php symfony tweet:get|INFO]
EOF;
  }

  protected function execute($arguments = array(), $options = array())
  {
    // initialize the database connection
    $databaseManager = new sfDatabaseManager($this->configuration);
    $connection = $databaseManager->getDatabase($options['connection'])->getConnection();

    // add your code here
    $ctx = stream_context_create(
        array(
            'http' => array(
                'method' => 'POST',
                'header' => "Authorization: Basic " . base64_encode(sfConfig::get("app_twitter_id").':'.sfConfig::get("app_twitter_pw")) . "\r\n" .
                            "Content-type: application/x-www-form-urlencoded\r\n",
                'content' => http_build_query(array('track' => sfConfig::get("app_twitter_keyword")))
            )
        )
    );

    $stream = fopen(sfConfig::get("app_twitter_stream_url"), 'r', false, $ctx);

    while ($json = fgets($stream)) {
        $tweet = json_decode($json, true);
        
        if(!isset($tweet['entities']['hashtags'][0])) continue;   //ハッシュタグがない場合は次のつぶやきへ

        //ハッシュタグがtwitterかチェック
        if(strcmp($tweet['entities']['hashtags'][0]['text'], sfConfig::get("app_twitter_keyword")) == 0) {
            //テーブルに登録済みかチェック
            if(TweetPeer::getTweetByStatusId($tweet['id_str'])) continue;
            
            //つぶやきを保存
            $tw = new Tweet();
            $tw->setIdStr($tweet['id_str']);
            $tw->setText($tweet['text']);
            $tw->setScreenName($tweet['user']['screen_name']);
            $tw->setCreatedAt(date("Y-m-d H:i:s", strtotime($tweet['created_ at'])));
            $tw->save();
        }
    }

    fclose($stream);
  }
}


モデルにstatusIdが登録済みかをチェックするメソッドを作成

vi lib/model/TweetPeer.php

<?php
class TweetPeer extends BaseTweetPeer {

    public static function getTweetByStatusId($statusId)
    {
        $c = new Criteria();
        $c->add(self::ID_STR, $statusId);
        return self::doSelectOne($c);
    }

}


タスクを実行

symfony tweet:get 


タスクを実行すると、Streaming APIを用いて「#twitter」に関するつぶやきをリアルタイムに保存し続けます。

つまづいた点など

タスクからsfConfig::get()を利用する方法

最初、twitterの設定をapp.ymlに記述して、タスクからsfConfig::get()で読み込ませようとしたところ、うまく読み込みができませんでした。
タスクの初期設定の際に、application名を指定する必要があるようです。

new sfCommandOption('application'〜)の第5引数でapplication名を指定

    $this->addOptions(array(
      new sfCommandOption('application', null, sfCommandOption::PARAMETER_REQUIRED, 'The application name', 'frontend'),
      new sfCommandOption('env', null, sfCommandOption::PARAMETER_REQUIRED, 'The environment', 'dev'),
      new sfCommandOption('connection', null, sfCommandOption::PARAMETER_REQUIRED, 'The connection name', 'propel'),
      // add your own options here
    ));

参考URL:Taskにも時々application名を指定してあげる

created_atの保存方法

created_atをそのまま保存する場合、日本時間になっていないため9時間ずれた値が保存されてしまいます。
strtotimeで時刻変換をすることで正しく登録されます。

$tw->setCreatedAt(date("Y-m-d H:i:s", strtotime($tweet['created_ at'])));

参考URL:
日時表示を日本時間(JST)に変更

PHPでTwitterの時刻を変換する方法

filterに関して

今回、filterの引数として利用したtrackに関する注意事項(仕様書から引用)

track=キーワードのリスト
指定したキーワードを含む public な情報を取得する
この API を使うことで、(契約なしで)最大 200 キーワードを追いかけることができる
[最大 10000 キーワードを追いかけ可能な "restricted track" 契約、最大 200000 キーワードを追いかけ可能な "partner track" 契約も用意されている]
(キーワードの大文字、小文字は区別しない。複数のキーワードを指定した場合は、指定したキーワードがどれか1つでも含まれていれば、取得対象になる)

例えば、キーワードに twitter を指定した場合、前後が空白文字で区切られた
TWITTER
twitter
"Twitter"
twitter.
#twitter
@twitter
といった「語(token)」を含む発言を取得することができる。ただし、
TwitterTracker
http://www.twitter.com
のようにキーワードの前後に別の文字が存在する「語」に関しては、取得対象(キーワードマッチング対象)にはならない

追跡対象のキーワードをコンマ区切りで指定する。指定するキーワードは1バイト以上30バイト以内とする
(訳者注: キーワードに指定可能な文字は英数字のみ。記号やマルチバイト文字には未対応)

ハッシュタグ検索の場合、#をキーワードに含める必要はありません。

MAMPを使ってsymfonyの開発環境を作ろう

macsymfonyを用いたローカル開発環境を用意する際の手順メモです。

MAMPsymfonyをインストール

まずはMAMPをダウンロード


次に、macにデフォルトで入っているphpのバックアップ

sudo mv /usr/bin/php /usr/bin/php-old

MAMPphpシンボリックリンクを作成(今回はphp5.2を使用)

sudo ln -s /Applications/MAMP/bin/php5.2/bin/php /usr/bin/php

PHP5.3を用いる場合は、

sudo ln -s /Applications/MAMP/bin/php5.3/bin/php /usr/bin/php


pearも同様にバックアップとシンボリックリンクを作成

sudo mv /usr/bin/pear /usr/bin/pear-old
sudo ln -s /Applications/MAMP/bin/php5.2/bin/pear /usr/bin/pear

PHP5.3を用いる場合は

sudo ln -s /Applications/MAMP/bin/php5.3/bin/pear /usr/bin/pear


PEARsymfonyチャネルを追加

pear channel-discover pear.symfony-project.com

pear: command not found
php: Permission denied

このようなエラーが出た場合は、pearphpの権限を変更する必要がある

sudo chmod 774 /Applications/MAMP/bin/php5.2/bin/pear
sudo chmod 774 /Applications/MAMP/bin/php5.2/bin/php

参考URL:PEAR Not Found


symfonyインストール

pear install symfony/symfony


symfonyコマンドを利用可能にするため、シンボリックリンクを作成

sudo ln -s /Applications/MAMP/bin/php5/bin/symfony /usr/bin/symfony


インストール確認

symfony -V
symfony version 1.4.8


これでphp5.2環境にsymfonyのインストールができました。


参考URL:OS X: How to Install Symfony into MAMP

symfonyサンプルプロジェクトの作成

次に、サンプルとしてsymfonyプロジェクトを作成してみましょう。


macのSiteディレクトリにtestディレクトリを作成します。

cd Sites
mkdir test
cd test


プロジェクトの作成

symfony generate:project test --orm=Propel

ormをPropelに設定する場合、symfony1.4ではormオプションを付けます。


フロントエンドの作成

symfony generate:app frontend


ブラウザからアクセスできるようにhttpd.confを編集します。
sfフォルダへのパスを通さないと正しくデフォルトの画面が表示されません。

vi /Applications/MAMP/conf/apache/httpd.conf
<VirtualHost *:8888>
  DocumentRoot "/Users/apple/Sites/test/web"
  DirectoryIndex index.php
  <Directory "/Users/apple/Sites/test/web">
    AllowOverride All
    Allow from All
  </Directory>

  Alias /sf /Applications/MAMP/bin/php5/lib/php/data/symfony/web/sf
  <Directory "/Applications/MAMP/bin/php5/lib/php/data/symfony/web">
    AllowOverride All
    Allow from All
  </Directory>
</VirtualHost>


MAMPでサーバを再起動

これでブラウザからアクセスすればデフォルトの画面が表示されます。


参考URL:Macでローカル開発サーバ ( MAMP +バーチャルホスト)

Subversionリポジトリ管理をする場合の初期設定

rm -rf cache/* log/*
svn add *
svn propedit svn:ignore cache

cacheとlog内のファイルを無視するように設定します

svn propeditを実行しようとしたところ以下のようなエラーが発生する場合は環境変数を追加する

svn: None of the environment variables SVN_EDITOR, VISUAL or EDITOR are set, and no 'editor-cmd' run-time configuration option was found


.profileにsvn用エディタの環境変数を追加

vi ~/.profile
export SVN_EDITOR=vim

.profileを再読み込み

source .profile

参考URL:How To Set SVN_EDITOR Environment Variable To Vim

svn propedit svn:ignore cache
*

svn propedit svn:ignore log
*

参考URL:Jobeet

mysqlの設定

MAMPphpMyAdmin設定

ターミナルからmysqlコマンドを使えるようにシンボリックリンクを貼る

ln -s /Applications/MAMP/Library/bin/mysql /usr/bin/mysql
ln -s /Applications/MAMP/Library/bin/mysqladmin /usr/bin/mysqladmin


MAMPmysqlにアクセス(デフォルトでのrootのパスワードはroot)

mysql -u root -p


パスワードをなしにする場合

SET PASSWORD FOR root@localhost=PASSWORD('');

参考URL:MAMPのMySQLサーバに接続したいよ(Terminalで


mysqlのパスワードを変更した後に、MAMPのスタートページにアクセスしようとしたところ、
Error: Could not connect to MySQL server!
というエラーが


MAMPの設定ファイルを変更してみたものの、パスワードなしのrootの場合、ページが正しく表示されませんでした。


rootとは別に管理ユーザを追加する

GRANT ALL PRIVILEGES ON *.* TO 管理ユーザ名@localhost IDENTIFIED BY 'パスワード' WITH GRANT OPTION;


MAMPの設定ファイルを変更する

vi /Applications/MAMP/bin/mamp/index.php
$link = @mysql_connect(':/Applications/MAMP/tmp/mysql/mysql.sock', '管理ユーザ名', 'パスワード');

vi /Applications/MAMP/bin/phpMyAdmin/config.inc.php
$cfg['Servers'][$i]['user'] = '管理ユーザ名'; 
$cfg['Servers'][$i]['password'] = 'パスワー ド';


MAMPの再起動


これでMAMPphpmyadminにアクセスできました。


参考URL:LeopardにMAMPを入れた時のメモ

mysqlデフォルト文字コード設定

mysqladmin -uroot create test

というように、mysqladminを用いてDBを作成しようとしたところ、文字コードがデフォルトのlatin1となってしまい、日本語が文字化けしてしまうという事態に


MAMPに用意されているmy.cnfのサンプルファイルをリネームしてコピー

cp /Applications/MAMP/Library/share/mysql/my-small.cnf /Application/MAMP/db/mysql/my.cnf

文字コードの指定を追加

vi /Application/MAMP/db/mysql/my.cnf
[mysqld]
default-character-set=utf8
skip-character-set-client-handshake

[mysql]
default-character-set=utf8


MAMPを再起動


これでデフォルトの文字コードがutf8になりました。


参考URL:
MAMPのmy.cnf



以上で、MAMPを使ったsymfonyの開発環境が用意できました。


他にも必要な設定が見つかった場合は、適宜ブログに追加していこうと思います。