ThinkPad USB トラックポイントキーボード(55Y9024)を買った

ThinkPadトラックポイントの魅力に取り憑かれたので、仕事で使用しているデスクトップPC用キーボードもトラックポイント付きにしてみた。
型番は55Y9024で価格は6,000円前後。

X201sとの比較


違い

一部キーが大きい

ESCとDELETEキーのサイズが2倍くらいにサイズアップ。
それに伴いInsertの位置やFキーの位置が変更に。
ESCはよく使うキーなので、自分としては押しやすくなってGood。
人によっては結構気になりそう。

キータッチが硬め

これは本家の方が好み。
だけどそこまで気にならず。

困った点

トラックポイントが純正ドライバでうまく動かない……

ドライバの最新版はVer1.07の模様。
lenovo: http://support.lenovo.com/en_US/detail.page?LegacyDocID=MIGR-73235

しかし、このドライバを使用しても一部のアプリケーションではスクロールしてくれない……。
いろいろ調べてみたら、WheelBallというソフトウェアを使うと問題なく動いてくれるそう。
WheelBall: http://kamigaki.la.coocan.jp/wheelball.htm

本家ドライバの方がスクロールの挙動がぬるぬるしてて好きなので、是非とも更新していただきたいですね。

ThinkPad使いには必須

価格もそこまで高くなく、かなり軽いので持ち運びも便利。
トラックポイントに慣れ過ぎて、マウスを使うのが億劫だ!というThinkPad使いの皆様にはお勧めです。

レノボ・ジャパン ThinkPad USB トラックポイントキーボード(日本語) 55Y9024

レノボ・ジャパン ThinkPad USB トラックポイントキーボード(日本語) 55Y9024

ファイルやディレクトリをツリー表示してくれるVimプラグイン「THE NERD Tree」

IDE環境からVimに移るときにネックだったのが、ディレクトリやファイルのツリー表示がない事だったんですが、なんとその悩みを解決してくれるプラグインがあるそうで。
インストールして試してみました。

インストール

NeoBundle使ってるなら.vimrcに以下の記述を追加でOK

NeoBundle 'scrooloose/nerdtree' 

それ以外の場合はGitHubのリポジトリのREADMEを参照のこと。

使い方

Vimを起動して以下のコマンドを入力すればツリーが表示される。

:NERDTree

ツリー上での詳しい使い方はVim起動中に以下のコマンドで閲覧可能。

:help NERD_tree.txt

自分が主に使うコマンドはこれくらい。

o ディレクトリを展開 or ファイルを開く
t ファイルを新しいタブで開く
u ディレクトリをカレントに指定
C 指定ディレクトリをカレントディレクトリに指定
F ディレクトリのみ表示
I 隠しファイルの表示を切り替え
q NERDTreeを閉じる

便利だけど毎回「:NERDTree」とは打ってられない

nmapとかでキーバインド設定したほうが良いですね。

Vimプラグイン管理をするためにNeoBundleを使ってみた

Vimプラグイン管理プラグインであるNeoBundleを使ってみた。
.vimrcや.vimなどのdotfilesはGitHubで管理しているので、submoduleとして導入。

導入方法

git clone git@github.com:ユーザー/dotfiles
cd dotfiles
git submodule add https://github.com/Shougo/neobundle.vim.git .vim/bundle/neobundle.vim

.vimrcに追記すること

set nocompatible
filetype off

if has('vim_starting')
  set runtimepath+=~/.vim/bundle/neobundle.vim/
endif

call neobundle#rc(expand('~/.vim/bundle/'))

NeoBundle 'インストールしたいプラグイン'

filetype plugin indent on

if neobundle#exists_not_installed_bundles()
  echomsg 'Not installed bundles : ' .
  \ string(neobundle#get_not_installed_bundle_names())
  echomsg 'Please execute ":NeoBundleInstall" command.'
endif

使い方

vimを開いて:NeoBundleInstallと入力すると、プラグインをまとめてインストールしてくれる。
未installのプラグインがあれば、起動時に以下のような通知をしてくれる。

Not installed bundles : ['プラグイン名']
Please execute ":NeoBundleInstall" command.

インストールしたプラグインがgit管理対象となってしまう

NeoBundleInstallでインストールしたプラグインは~/.vim/bundle配下に配置される。
GitHubにpushする気がない場合は.gitignoreを作成してnebundle.vim以外は管理対象外にしたほうが良い。

.vim/bundle/*
!.vim/bundle/neobundle.vim

プロキシ環境でgit://が使えない場合

git以外のプロトコルを指定可能。
.vimrc内でNeoBundleを記述する前に以下の1行を挿入。

let g:neobundle_default_git_protocol='https'
※httpsを使う場合の例

便利ですね

新しくVim環境作るのがかなり億劫だったんですが、GitHub&NeoBundleを使えばcloneしてvim開いて:NeoBundleInstallするだけなのでとても便利。

CentOS5.8にrbenv+ruby1.9.3+rails+sqlite3をインストール

CentOS5.8にRuby on Railsの環境を作成したのでメモ。
gitがインストールされている前提。

sqlite3のインストール

sudo yum install sqlite-devel
sudo yum install sqlite3

rbenvのインストール

git clone git://github.com/sstephenson/rbenv.git .rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
source ~/.bashrc

ruby-buildのインストール

mkdir -p ~/.rbenv/plugins
cd ~/.rbenv/plugins
git clone git://github.com/sstephenson/ruby-build.git

rubyのインストール

rbenv install 1.9.3-p194
rbenv rehash
rbenv global 1.9.3-p194

railsのインストール

gem install rails
rbenv rehash

後はrails newでプロジェクトを作成したり、Gemfileを編集してbundle installしたり、rails generateしたり、rails server実行して試しにアクセスしてみたり。

どこどこJPを使ってみた

位置情報が欲しいなーということで、この前海外のサービスであるGeoIPについて調査したが、どうやら日本製のものもあるらしいので調べてみた。

どこどこJP

IPアドレスDBを提供する日本のサービス。
位置情報はもちろん、情報の正確度や法人からのアクセスであれば企業情報も取得可能。
これらの情報を取得するには、APIを用いて指定URLにアクセスを行う。
金額は初期費用¥50,250+¥10,250~(リクエスト数に応じて金額UP)
ただし、個人利用&非商用利用であれば無料。

APIの種類

  • Javascript API
    • scriptタグを指定するだけで、アクセスしてきたIPの情報を取得可能。
    • Cookieを利用してAPIサーバのリクエスト回数を抑えると良い。(方法はこちら)
  • REST API
    • URLにapiキーとIPアドレスと指定しリクエストを行う。
    • フォーマットはxmlとjsonのみ。
    • 1リクエスト1IP。
  • リクエスト情報取得API
    • タグを貼ったページのアクセス数を、日別、月別、都道府県別などの区分で取得することが出来る。
    • フォーマットはxmlとjsonのみ。

REST APIでJSON形式のデータ取得をしてみる

まず個人利用登録して非商用利用のAPIキーを作成。
以下の様なperlソースを書いて実行。

#!/usr/bin/env perl

use strict;
use warnings;

use LWP::UserAgent;
use URI;
use JSON qw(decode_json);
use Encode;
use utf8;

sub get_docodoco_data {

    my $ipadr = shift;

    my $uri = make_request_uri($ipadr);
    my $ua = LWP::UserAgent->new;
    my $res = $ua->get($uri);

    die "Error: ". $res->status_line if $res->is_error;
    my $json = $res->content;
    my $ref = decode_json(encode_utf8($json));

    return $ref;
}

sub make_request_uri {

    my $ipadr = shift;

    my $base_uri = 'http://api.docodoco.jp/v3/search';
    my $api_key1 = 'APIキー1';
    my $api_key2 = 'APIキー2';
    my $format   = 'json';
    my $charset  = 'utf8';

    my $uri = URI->new($base_uri);
    my $params = {
        key1 => $api_key1,
        key2 => $api_key2,
        ipadr => $ipadr,
        format => $format,
        charset => $charset
    };
    $uri->query_form(%$params);

    return $uri;
}

my $ipadr = shift;
die "Error: 引数がないぞ" unless defined $ipadr;

my $docodoco = get_docodoco_data($ipadr);

print "CountryCode : " . $docodoco->{CountryCode} . "\n";
print "CountryAName: " . $docodoco->{CountryAName} . "\n";
print "CountryJName: " . $docodoco->{CountryJName} . "\n";
print "PrefCode    : " . $docodoco->{PrefCode} . "\n";
print "PrefAName   : " . $docodoco->{PrefAName} . "\n";
print "PrefJName   : " . $docodoco->{PrefJName} . "\n";
print "PrefCF      : " . $docodoco->{PrefCF} . "\n";
print "CityAName   : " . $docodoco->{CityAName} . "\n";
print "CityJName   : " . $docodoco->{CityJName} . "\n";
print "CityCF      : " . $docodoco->{CityCF} . "\n";
print "CityLatitude: " . $docodoco->{CityLatitude} . "\n";
print "CityLongtude: " . $docodoco->{CityLongtude} . "\n";

結果は以下のとおり。

CountryCode : JP
CountryAName: japan
CountryJName: 日本
PrefCode    : 13
PrefAName   : tokyo
PrefJName   : 東京
PrefCF      : 00
CityAName   : shinjuku-ku
CityJName   : 新宿区
CityCF      : 00
CityLatitude: 35.69390
CityLongtude: 139.70343

get_docodoco_dataというサブルーチン名にセンスの無さが伺えるが気にしない。
CF値が高いと信頼性も高いとのこと。
なので上記の結果は日本からのアクセスである、としか分からなかったという事ですね。

レスポンスタイムの計測

上記ソースとは別に、テキストファイルに書かれたIP一覧をリクエストをするというソースを書いて実行したところ、1件当たり20msec~30msecの時間がかかった。
計算上では1万件のログを処理しようとすると3~5分くらいかかる。
(公式では平均すると300msec以内と書かれているのは危険係数込みかな)

GeoIPとの比較

GeoIPではJapanとしか分からないIPでも、どこどこJPでは日本/東京/新宿区と詳細に取得出来ることが多々ある。
海外のIP(主にUS)だとまったく逆の結果になる。
メインターゲットが日本なのであればどこどこJPを使うべきだなぁー。

bashはwhile内の処理が子プロセス扱いになる

bashは、while文の中でexitを実行してもシェル自体は終了せず、whileを抜けるだけになる。
while内は小プロセスとして扱われるらしい。
サンプルコードは以下。

#!/bin/bash

cat << END >> animal_list
cat
dog
alligator
END

cat animal_list | while read animal
do
    echo $animal

    if [ $animal = "dog" ]; then
        echo "中断!"
        exit 1
    fi
done

echo "だが終わってない"

exit 0

上記コードを実行するとこうなる。

cat
dog
中断!
だが終わってない

なので、中断したい場合はwhileを抜けた後に、以下の様な判断する必要がある。

if [ $? -eq 1 ]; then
  exit 1
fi

また、for文内だと子プロセス扱いにならない。

#!/bin/bash

animal_list=("cat" "dog" "alligator")

for animal in ${animal_list[@]}
do
    echo $animal

    if [ $animal = "dog" ]; then
        echo "中止!"
        exit 1
    fi
done

echo "だが終わってない"

exit 0

上記コードの実行結果はこちら。

cat
dog
中止!

はまった…。

IPアドレスから位置情報を取得する

訪問者の位置情報が知りたい

Webサイトにどの地域からアクセスがあるか知りたいなーという話が周りでちらほらと出ていたのですが、会員登録制ではないしFBと連携している訳でもないのでソーシャルグラフの情報も取得できないという状況。
なので精度は落ちますが、IPアドレスから大体の位置を割り出せるサービスを探して見ることに。

GeoIP Database

ちょちょっと探してみたところ、GeoIP Databasesというサービスを発見。
位置情報DBはローカルに保存し、その情報をAPI経由で検索・取得するという方式。
メインターゲットはUSっぽいので、取得できる位置情報にはUS onlyな情報もある。
(郵便番号、Metro Code、Area Codeなど…)

位置情報DBには有償版と無償版があり、精度は勿論有償版のほうが高い。

試してみる

とりあえず無償版の位置情報DBで試して見ることに。

C,Java,Perl,PHP,Rubyなど主要言語のAPIは準備されている
今回は個人的な趣味でPerlAPIを選択。
PerlAPIには2種類あり、違いは以下の通り。

  • Geo::IP Module
    • 動作は速いが、Cのライブラリを事前にインストールする必要がある
  • Geo::IP::PurePerl Module
    • 動作は遅いが、Cのライブラリをインストールする必要なし

速度が欲しいのでGeo::IPを選択。

インストール手順

まずはCライブラリを取得

cd /tmp
wget http://www.maxmind.com/download/geoip/api/c/GeoIP.tar.gz

解凍してインストール

tar xvzf ./GeoIP.tar.gz
cd GeoIP-1.4.8
./configure
make
make check
make install

CPAN経由でGeo::IPをインストール

cpanm -v Geo::IP

位置情報DBを取得

cd /tmp
wget http://www.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
gzip -d ./GeoLiteCity.dat.gz

試してみる

ソース

#!/usr/bin/env perl

use strict;
use warnings;
use Geo::IP;

my $gi = Geo::IP->open("/tmp/GeoLiteCity.dat", GEOIP_STANDARD);
my $record = $gi->record_by_name("google.com");

print "country_code  : ", $record->country_code, "\n";
print "country_code3 : ", $record->country_code3, "\n";
print "country_name  : ", $record->country_name, "\n";
print "region        : ", $record->region, "\n";
print "region_name   : ", $record->region_name, "\n";
print "city          : ", $record->city, "\n";
print "postal_code   : ", $record->postal_code, "\n";
print "latitude      : ", $record->latitude, "\n";
print "longitude     : ", $record->longitude, "\n";
print "time_zone     : ", $record->time_zone, "\n";
print "area_code     : ", $record->area_code, "\n";
print "continent_code: ", $record->continent_code, "\n";
print "metro_code    : ", $record->metro_code, "\n";

実行結果

country_code  : US
country_code3 : USA
country_name  : United States
region        : CA
region_name   : California
city          : Mountain View
postal_code   : 94043
latitude      : 37.4192
longitude     : -122.0574
time_zone     : America/Los_Angeles
area_code     : 650
continent_code: NA
metro_code    : 807

感想

  • ローカルに位置情報DBをDLするので、データローカリティ的な意味で早い。
  • 位置情報DBが毎月更新されるらしいので、運用するには定期更新バッチを作成する必要はある。
  • 地名がローマ字なのはUSのサービスだから仕方ないとはいえ微妙。
  • ログの分析軸として位置情報は大変有用なので、導入する価値は大いにあると思う。