Programming」カテゴリーアーカイブ

はてブの仕様が変わってる

はてなブックマークでブックマークするためのページのURLが、
以前は

http://b.hatena.ne.jp/entry/{$url_enc}

だったのが

http://b.hatena.ne.jp/add?mode=confirm&title={$title_enc}&url={$url_enc}

になったみたい。

前のURLだとエラー出てた。

Gitの勉強がしたい

プログラマのSNSといえばGitHubなんて話もあるくらい、世間ではバージョン管理を超えたコミュニケーションツールとしてGitが流行ってたりしているようですが、その輪の中に入るためにはGitのいろはを知らなきゃならんと。
そう思い立ったので入門書を買ってきて読み始めました。

買ったのはこちら、『入門git』。
いくつかのレビューを見て一番お勧めされていたので買ってみました。

入門git 入門git

オーム社  
売り上げランキング : 3894
おすすめ平均 5つ星のうち 4.8

Amazonで詳しく見る

説明が飛ぶことが多くて全体像が把握しづらく、経験の浅い人には前半は読みにくそうだと感じましたけど、最後まで読めば全体像も見えて理解できてくるのかも。

VisualStudioのツールチップが英語で表示されてしまう

Intellisense
VisualStudioで関数を途中まで入力したり、Ctrl+Shitf+Spaceを押したりするとツールチップで表示されるヒントのことを Intellisense と呼ぶそうですが、VisualStudio 2008 SP1を入れていると、これが英語になってしまうという問題がありました。
同ソフトを入れていると、2005や2010でも同様に英語になってしまうようです。

以下から修正プログラムをインストールすることで直りました。

テンプレートエンジンTwigを使ってみた

PHPのテンプレートエンジンの中で最も有名なSmartyの開発陣が作ったというTwigを使ってみました。

Twigを知った切っ掛けは、以前参加したモダンPHP勉強会 #2
ここで発表された内容とほぼ同じことが、以下のサイトに書かれているので参考にしました。

Twigに修飾子を追加する

さきほど紹介したTwigですが、Smartyのように、変数を出力するときに何かしらの処理を加えて出力することができます。
例えば、

{{ 'TWIG'|lower }}

このように書けば、小文字に変換して表示できます。
この lower の部分を自分で自作する方法について書きます。

と言ってもとても簡単でした。参考にしたのはこちらのページ。

今回は数字に対し、3桁区切りでカンマを入れる修飾子 number を作ってみます。
3桁区切りでカンマを入れる関数は、PHPには標準で搭載されています。number_format() という関数です。
まずこれを使って、こういう関数を作りました。

function twig_number_format($str) {
  return (is_int($str)) ? number_format($str) : $str;
}

次に、これを修飾子として登録します。

$twig->addFilter('number', new Twig_Filter_Function('twig_number_format'));

これで完了です。

{{ '1234567'|number }}

と書いて表示させてみましょう。

ぶっちゃけ、これだけでもOKです。

$twig->addFilter('number', new Twig_Filter_Function('number_format'));

ファイルをドラッグ&ドロップするときにソートする

Windowsって昔からエクスプローラとかからファイルを選んでドラッグ&ドロップすると、エクスプローラに表示されているのとは違う順番でコピーされますよね。
普段は問題ないんですけど、これが問題になるパターンがいくつかあって、例えばアプリケーションにファイルを登録するときに、でたらめな順番で登録されてしまいます。
CDのライティングソフトとか、登録された順番に書き込んだりするので、これだと都合が悪かったりします。
また、コピー時に順番がばらばらということは、コピー先のファイルの作成日時を示すタイムスタンプもバラバラになってしまいます。
最近よくあるUSBメモリ内の音楽や動画を再生してくれるプレイヤーなどでは、ファイル名順ではなく、作成日時順で再生したりするので、これがバラバラだと不便です。

そこで、一度アプリケーションを中継することで、名前順にソートしてドラッグ&ドロップするためのプログラムを作りました。
まずこのアプリケーションを起動して、ウィンドウの中にファイルをドラッグ&ドロップします。
するとドロップされたファイルが名前順でソートされるので、それらのファイルを選択して、再び本来ドロップしたいアプリケーションに向けてドラッグしてください。

以下がそのプログラムです。SourceForge.JPに登録してあります。
とても単純なプログラムですが、一応修正BSDライセンスでソースコードも公開しました。

このプログラムはVisual C# 2010で作りました。動作には.NET Framework 3.5が必要です。
WindowsVista以前の方は、WindowsUpdateなどからインストールしてから使ってください。

おまけの機能としては、Ctrl + A で全選択と、Ctrl + C でクリップボードにコピーができるようになっています。
Deleteキーを押すとフォーカスされたファイルがリストから削除されます。
実ファイルの削除や切り取りはできません。

とりあえずβ版ということで、公開してみますので、どうぞよろしく。

Androidアプリ開発に挑戦してみる

Androidアプリを開発するにあたって、まずはAmazonで一番評判の良さそうな本を探しました。
買ったのは「Google Android アプリ開発ガイド 第2版」という本。

Google Androidアプリ開発ガイド Google Androidアプリ開発ガイド

秀和システム  
売り上げランキング : 256246
おすすめ平均 5つ星のうち 4.2

Amazonで詳しく見る

買ってざっと見てみた感じですと、Androidアプリ開発からマーケットへの登録まで一通り網羅してあり、初めてAndroidアプリを開発するにはちょうどいいかなという感じです。
ここまでしっかりと基本を網羅してある本は珍しく、書店で見た他の本と比べてもよい感じです。
ただ、JavaやEclipseについては最低限しか載ってないので、そちらが不得手な方は別に専門書を買った方がいいと思います。
それから、基本しか載ってないので、アプリをある程度自由に作れるようになったら、応用的なTipsが載っている本などを買う必要があるでしょう。

自分はJavaは昔少しだけ触ったことがありますが、C#に慣れてしまってからはそちらばかり。
EclipseもVisual Studioに比べるとどうも使い慣れなくて、大学の授業でしか触ったことがありませんでした。
なので、この本だけで開発に挑むのは無謀かなという気がしないでもないのですが、躓くまで進めてみようと思い、環境構築を始めました。

そして、本書第一章の環境構築からサンプルの動作までで、予想通り躓いて何時間も悩んだので、この記事を書くことにしました。^^;
ここでは、本書の通りに実行して、僕の躓きを再現し、乗り越えるための情報を記します。
より詳しい情報は、本を買って調べて下さい。

Amazonの商品のおすすめ度を取得する

Amazonの広告を貼るとき、そのHTMLコードは、Amazonアソシエイト公式サイトから直接もらってくるか、Product Advertising APIを使って得た商品データを元に自分でデザインした書式で書くかの二種類があります。

今まで後者の方法を利用したサービスで、G-Toolsというサイトを利用させていただいていたのですが、Product Advertising APIの仕様変更により、おすすめ度の情報が取って来られなくなってしまいました。
おすすめ度が無いと、ぱっと見その商品の評価が伝わりにくいですし、見栄え的にも見劣りします。

そこで、一般のAmazonのページからおすすめ度の情報を取ってくるスクリプトを書きました。
APIが用意されているのにサイトから取ってくると言うのはスマートではありませんし、APIから外された理由を考慮せずにおすすめ度の情報をとり続けることには問題があるかもしれませんが。
それらの点を頭の隅に置いた上で、以下のようなコードを書きましたので、必要な方は参考にして下さい。

// おすすめ度を取得する関数
function get_average_rating($uri) {
    $average_rating = array('value' => '', 'v' => '', 'image' => '');
    $src = trim(mb_convert_encoding(file_get_contents(preg_replace("/\/\w+?\-22\/$/", "/", $uri)), "UTF-8", "SJIS"));
    if (preg_match('/s_star_(\d_\d) " title="5つ星のうち (\d\.\d)"/mui', $src, $match)) {
        $average_rating['v'] = str_replace("_", "-", $match[1]);
        $average_rating['value'] = $match[2];
    }
    if ($average_rating['v']) {
        $average_rating['image'] = "http://g-images.amazon.com/images/G/01/detail/stars-".$average_rating['v'].".gif";
    }
    return $average_rating;
}

一応補足しておくと、引数の $uri は商品ページのURLで、戻り値の配列は $average_rating['value'] がおすすめ値、 $average_rating['image'] がそれを表す星画像のURLです。

なお、久しぶりにPHPで書きました。:D

サーバーでのパスワードの取り扱いについて

これは僕が学部3年のときに習ったことなのだけど、案外知らない人が多い気がしたので、ここに記しておくことにします。

ユーザーがログインするタイプのサービスを作るとき、パスワードを設定することはよくあります。
サーバーでログインの認証を行うためには、ユーザーが入力したパスワードが正しいかどうかを、プログラムの中で判定しなければなりません。
が、このとき単純な文字列比較で認証をしている人はいませんか?

万が一サーバー内の情報が流出した場合を考えると、パスワードをソースファイルの中に直に書いたり、あるいはデータベースの中にそのまま保存したりするのはとても危険です。
また、サーバー管理者が、ユーザーが設定したパスワードを容易に見ることができてしまうというのも、ユーザーとして気持ちいいものではありません。

ではどうするか。