Absolute Playing! RSSフィード

2011-12-13

Googleから為替レートをJSONで取得する方法

仕事で為替レートを扱う必要があったのでちょっと調べてみました。
海外にあるAPIは有料だったり、Yahooファイナンスからゴニョゴニョするのもコード見たらめんどくさそうだ・・・とか思ってたらGoogle先生にステキなAPIを見つけました。

http://www.google.com/ig/calculator?hl=ja&q=変換前の通貨=?変換後の通貨
// 1アメリカドル を日本円に
http://www.google.com/ig/calculator?hl=ja&q=1USD=?JPY

PHPで書くとこんな感じで使えます。APIレスポンスのままだとjson_decode()が文字列パースに失敗してたのでkey値を「"」で囲ってます(ダサイ・・)。

<?php
$data = file_get_contents('http://www.google.com/ig/calculator?hl=en&q=1USD=?JPY');
$data = str_replace(array('lhs', 'rhs', 'error', 'icc'), array('"lhs"', '"rhs"', '"error"', '"icc"'), $data);

$json = json_decode($data, true);
$yen  = preg_replace("/[^0-9.]+/", '', $json['rhs']);
var_dump($yen);

ファイナンスサイトから頑張ってゴニョゴニョするよりも楽なのでオススメです。

追記

ブコメでid:reasonofreasonから「ダブルクオーテーションで囲まれてないから囲む必要があるということなのだろうか。」というコメントをもらったので補足しておきます。json_decodeはJSON記法を厳密にチェックするのでkey値もクォーテーションで囲んでないとパースしてくれないのです。型チェックは甘いくせにこういう所は厳密だったりするPHPなのでした。

参考リンク

2011-12-09

Twigをもっと活用しよう :Symfony Advent Calender 2011 JP - 9日目 -

Symfony Advent Calendar JP 2011 : ATND 9日目の記事です。

Symfony2.0.7が昨日リリースされましたね。今回のアップデートで個人的に熱かったのはSymfony2にバンドルされるTwigのバージョンがv1.1.2からv1.4.0へアップグレードされた所です。Twigは便利な機能もいっぱいありますのでこの機会に紹介したいと思います。

for

お馴染みのループに使う構文です。一般的な使い方はこうです。

<ul>
    {% for item in article %}
        <li>{{ item.title }}</li>
    {% endfor %}
</ul>

もちろん配列の添字にもアクセスできます。

<ul>
    {% for key, item in article %}
        <li>{{ key }}:{{ item.title }}</li>
    {% endfor %}
</ul>

「..」というオペレータを使えば連続した値の定義が可能です。range関数も別途定義されています。

{% for i in 0..10 %}
    * {{ i }}
{% endfor %}

文字列でも大丈夫。

{% for letter in 'a'..'z' %}
    * {{ letter }}
{% endfor %}

ループ中の状態を表す変数として「loop」が用意されています。使い勝手はSmartyのiterationと同じです。

loop.indexループした回数(1から始まる)
loop.index0ループした回数(0から始まる)
loop.revindexループした回数(最後からカウント、1から始まる)
loop.revindex0ループした回数(最後からカウント、0から始まる)
loop.first最初の要素のときtrueを返す
loop.last最後の要素のときtrueを返す
loop.length配列の長さを返す
loop.parentネストしてるループのとき、上階層のループ要素を取得

バージョン1.2からfor構文の中でif修飾子が使えるようになりました。修飾子好きとしては見逃せません。

<ul>
    {% for item in article if item.isPublic == 0 %}
        <li>{{ item.title }}</li>
    {% endfor %}
</ul>

set

Smartyでいうassignです。変数に値をセットできます。

{% set foo = 'foo' %}

配列も勿論OKです。Twigはperlrubyのように配列は「[]」、ハッシュ連想配列)は「{}」を配列リテラルに使います。

{% set num = [1, 2, 3] %}
{% set str = {'foo': 'bar', 'hoge': 'fuga'} %}

文字列の連結は「~」(チルダ)を使います。

{% set foo = 'foo' ~ 'bar' %}

複数の変数を同時に定義することもできます。

{% set foo, bar = 'foo', 'bar' %}

複数の行をキャプチャすることもできます。{% endset %}を使いましょう。

{% set foo %}
  <div id="pagination">
    ...
  </div>
{% endset %}

spaceless

spacelessタグで囲ったHTMLから空白文字を取り除いてくれます。JavaScriptと連携するときに便利そうです。

{% spaceless %}
    <div>
        <strong>foo</strong>
    </div>
{% endspaceless %}

{# 出力: be <div><strong>foo</strong></div> #}

バージョン1.1からタグレベルでの空白文字の制御が可能になりました。trimを実行したいタグの左右に「-」(ハイフン)をつけて利用します。

{% set value = 'no spaces' %}
{#- No leading/trailing whitespace -#}
{%- if true -%}
    {{- value -}}
{%- endif -%}

{# 出力: 'no spaces' #}

左右どちらかだけtrimする、という細かい制御もできます。

{% set value = 'no spaces' %}
<li>    {{ value -}}    </li>

{# 出力: '<li>    no spaces</li>' #}

divisibleby

割り切れる場合にtrueを返します。%演算子で余りが0(a % 3 == 0)と同じ動きです。

{% if loop.index is divisibleby(3) %}
    ...
{% endif %}

constant

TwigからControllerやEntityで定義しているconstの値にアクセスできます。名前空間から記述する必要があります。あとTwigのデフォルト仕様で文字列をescapeしてくれるのでバックスラッシュは2つ重ねで記述する必要があります。

Controllerに下記のようにconst定義をします。

<?php
namespace Acme\DemoBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Acme\DemoBundle\Form\ContactType;

// these import the "@Route" and "@Template" annotations
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;

class DemoController extends Controller
{
    const DEFAULT_LIMIT = 10;
    ...
}

Twigからはこのようにしてアクセスが可能になります。

{{ constant('Acme\\DemoBundle\\Controller\\DemoController::DEFAULT_LIMIT') }}

sameas

いわゆる「===」と同じです。値だけではなく型チェックもします。

{% set foo = "1" %}
{% if foo is sameas(1) %}
  check ok.
{% else %}
  check ng.
{% endif %}

{# 出力: 'check ng.' #}

Twigは拡張も書けるので、自作すれば何でもできてしまいます。ただビルトインされてる機能も必要最小限は組み込まれているので拡張書く前に公式マニュアル見直してみると良いかもしれません。

それではみなさんより良いTwigライフをお送りください!明日は@さんです!

2011-12-02

「全文検索エンジンgroongaを囲む夕べ 2」に参加してきました

全文検索エンジンgroongaを囲む夕べ 2 #groonga : ATNDに参加してきました。

全文検索エンジンとしてgroongaを業務に導入しようとしているので情報を求めて参加したんですがいろいろと参考になる情報がたくさん聞けました。会場はVOYAGE GROUPさんのオフィスだったんですがやたらカッコよかったです。

Ustreamアーカイブも公開されていますので参加できなかった人も安心ですね。
Ustream.tv: ユーザー gunyarakun: groongaを語る夕べ #2 November 29, 2011 12:18 PM, groongaを語る夕べ #2 November 29, 2011 12:18 PM. 会議

勉強会の内容はgroongaの開発者の方々が過去、現状、将来について熱く語る、というものでした。
勉強会レポートはno titleがすごくまとまってます。メモ凄すぎ。

以下、自分のメモから発表タイトルごとにざっと感想をまとめていきます

groonga村

株式会社クリアコードの須藤(すとう)さんの発表でした。

発表資料は下記で公開されているので詳細はご確認ください。
http://www.clear-code.com/archives/groonga-night-2-introduction/groonga-village.pdf

groonga自体はライブラリ(libgroonga)であり、他のソフトウェアからgroongaを使う実装の状況についての解説がメインでした。libgroongaの構成とソフトウェアがどうやってgroongaにアクセスしてるのかが図になってて理解しやすかったです。

村の住人は現在のところ5人のようです。

「libgroongaがhttpプロトコル喋れるのに、なんでnode.js対応のnnrooga(ぬるんが)を何故作ってるんですか?」という質問がありました。

回答は「自前のイベント実装がイマイチ、websocketとの相性が良さそうだから」とのことでした。確かにwebsocketとは相性良さそう。将来httpプロトコルを介したgroongaとの通信はnode.js経由が標準になるかもしれないですね。

あとgroongaが実際に採用されているサイトとして下記が挙げられてました。導入していて掲載OKな会社募集中だそうです。

groongaの開発者も募集されていました。開発するほど時間取れなさそうですが、暇を見つけてちまちまとコードは読んでみたいです。

新年と収穫の祭り

有限会社未来検索ブラジルの森大二郎さんの発表でした。個人的に今回一番面白かったです。

groongaの前身となるSennaの開発経緯から始まり現在に至るまでの過程、groongaで将来やってみたいことについての発表でした。

発表資料は下記で公開されています。
http://groonga.org/ja/publication/presentation/groonga-night-2-newyear-harvest.pdf

索引の動的構築にとにかくこだわってきたが、静的構築にも対応させているそうです。

静的構築ができるようになるとオフラインでの構築が有利になるのは当然ですが、他にもmroongaでalter tableができるようになったり、Sedueのプラグインになったりとメリットも多いとのことでした。

groongaに将来実装していきたい機能として語られていた索引の圧縮方式を参照頻度に応じて圧縮率を変えてデータ量を効率化させる、とかデータ分布に応じてカラム構造をgroongaが最適化してくれるスキーマレス機能、などはどうやって実現するんだろうと興味津々でした。

mroonga

mroonga(むるんが)はgroongaをMySQLから利用できるソフトウェアです。いわゆるtritonnの後継ですね。SpiderやVPの作者の斯波さんの発表でした。

発表資料はslideshareで公開されています。
http://www.slideshare.net/Kentoku/introducing-mroonga-20111129

まずmroongaの読み方が「むるんが」であることを初めて知りました。バージョン1.10からパッケージ名もmroongaになっていたのでこれから「むるんが」って言う人が増えていくんでしょうか。

発表内容はこの1年間でのmroongaに実装された機能を中心に紹介していき、今後もいろいろ実装しますよ、という話でした。ラッパーモードなどは面白いアイデアですよね。個人的にはレプリカ作って並べれば検索エンジンとしては十分な気がしています。ただInnoDBじゃないとトランザクションが、、、みたいな話はよくありそうなのでユーザニーズにマッチしてると思います。

懇親会に出られなかったので2点ほど質問したかったことを備忘録としてメモっておきます。

1点目はタンデム構成(ex. mroonga + libgroongaのhttpプロトコル)の場合、マルチカラムインデックスで利用しているカラムを更新するとインデックスの整合性がとれなくなってしまう、と説明されていたところです。回避方法としてはタンデム構成のいずれかのマルチカラムを対象にした検索を諦めるしかないのか、という点です。対象カラムに対する更新が発生することがわかっている場合はmroongaのはカラム単位でFULLTEXTで貼っておけば、libgroongaではmatch_columnsでマルチカラム検索できると思います。ただmroonga側はできなくなっちゃいます。

2点目は全文検索用パーサーカスタマイズができるんですがカラム単位で異なるパーサー指定はOKなのか?という点です。

ここまで書いてて思ったけど自分で試せばよい気がしてきました。

最後に話されてましたがMariaDBへのバンドルが決まったそうです。これかなり凄いことだと思います。MariaDBにのってるストレージエンジンってAria、XtraDB、PBXTなどサードパーティの有名どころが大抵入ってます。これらにgroongaが追加されるってことになります。

Geographical Searching

(追記)発表資料がアップされていました。

http://groonga.org/ja/publication/presentation/groonga-night-2-geographical-searching.pdf

ぐるなびの塩畑さんの発表でした。groongaを導入した経緯から現在の運用状況までをシンプルにまとめて話しされていました。ぐるなびは位置情報検索も重視しているようでgroongaというよりはgeoSearch寄りの話がメインでした。

距離計算のロジックとgroongaに組み込まれてるgeo系の関数の話をセットで話しされてたんですが、geo_distance(方形近似)は知ってたんですが、geo_distance2(球面近似)、geo_distance3(ヒュベニの距離計算式)の2つの関数は知りませんでした。マニュアル読み直してみるとこっそり書いてありました。

geo_distance() 関数は、point1に指定した座標とpoint2に指定した座標の間の距離(近似値)を求めます。 geo_distance()の他に、距離計算アルゴリズムの異なる、geo_distance2()、geo_distance3()が使用できます。それぞれ、長方形近似、球面近似、ヒュベニの距離計算式によって距離を算出します。

ぐるなびのレストラン54万件に対する位置情報検索のベンチマークにも触れられていて、groonga(チューニング済み)を導入して90%の速度向上(0.34s → 0.03s)を実現したそうです。

groonga with PostgreSQL

フォルシアの奥野さんの発表でした。正直PostgreSQLは触ったことないのであんまりわからず。。鋭意対応させてます!というのとPostgreSQL9.1から実装されたFDWを使ってgroongaを利用するライブラリを作成していて年内にはアルファ版をリリースしたい、と宣言されていました。

現状公開されているライブラリの名前がtextsearch_groongaという名前だったんですが、他ライブラリと合わせてproonga(ぷるんが)とかにして欲しいと思いました。

mroongaベンチマーク

再び須藤さんの発表でした。英語データをサンプルにしてMyISAMInnoDB FTS、mroonga、mroonga + innodbでの4つで全文検索ベンチマークを公開されていました。Wikipediaの英語版データとかを利用されたんでしょうか。比較した速度は全文検索、位置情報検索、更新性能の3つの観点からそれぞれグラフを作成されていました。全文検索はgroongaの圧勝、位置情報検索はMyISAMに若干及ばず、更新性能はgroongaの圧勝、という結果でした。位置情報検索はMyISAMは専用インデックスでやってるがgroongaは既存のインデックスを効率よく使って僅差という結果だそうです。ラッパーモードは更新性能自体はInnoDBのままなので即時反映させて検索、というのはやっぱり難しいようです。

mroongaの未サポート機能

再び斯波さんの発表でした。発表資料は以下になります。
http://www.slideshare.net/Kentoku/mroonga-unsupported-feature20111129

未サポート機能をリストアップされてそれぞれ解説されていました。気になったのは0跨ぎの緯度経度問題です。今携わってるフォートラベルというサイトは海外施設がいっぱいあったりするので。。。

groonga開発予報

未来検索ブラジルの矢田さんの発表でした。発表資料は以下にあります。
http://groonga.org/ja/publication/presentation/groonga-night-2-the-future.pdf

groonga 1.2.8で実装されているダブル配列の話を中心に3種類のインデックスタイプ(パトリシアトライ、ハッシュテーブル、ダブル配列)のメリット・デメリットの解説でした。ダブル配列は更新頻度は少ないが参照は多め、というサービスに向いてるんじゃないかということでした。将来像で言われていたハッシュテーブルの構築最適化は今よりパフォーマンス上がりそうなので期待しています。

2011-10-27

Symfony2でControllerやTemplateから現在のルーティング名を取得するやり方

最近Symfony2でガリガリコード書いてるので備忘録がてらブログをひさびさに更新していこうと思います。
テンプレートで自分のルーティング名で分岐したい(ex. class="current"つけたい)、ということがよくありそうなので調べてみました。

結論から言うと、Symfony2がrequestとして処理して渡してくれてるので簡単にできます。
あと、タイトルで言ってるルーティング名とはrouting.ymlで定義する名前のことです。

blog: ←これ
    pattern:  /blog/
    defaults: { _controller: BlogBundle:Default:index }

Controllerでのやり方

引数に $_route 渡すだけです。

<?php
namespace Blog\Bundle\BlogBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

public function indexAction($_route)
{
    // code...
}

Template(twig)でのやり方

app.requestの中に入ってます。

{{ app.request.attributes.get('_route') }}

2011-07-29

Startup Meets Designに参加してきました

Startup Meets Design ~デザインでサービス体験を向上させるには〜 | Open Network Lab(オープンネットワークラボ)
http://onlab.jp/blog/archives/2011/07/startup-meets-design.html

昨日開催されたStartup Meets Designに参加枠を頂けたので参加してきました。話の主題はUXでした。ユーザエクスペリエンス。覚えてることを備忘録としてメモします。

  • シリコンバレーはデザインに重きを置いて他サービスとの差別化を図っている
  • アーリーアダプタじゃない普通の人たちはテクノロジーよりデザイン・UIが練られた方を利用する
  • スマホアプリを利用するシーンで安全面に気を使ってないのではないか(safety first)
  • モバイルはスピードが最重要
  • UXに優れたアプリの3つの法則(探さない、書かない、溜めない)
  • 新しいUXは非接触になるのでは(高さ、湿度などセンサーを利用したアプリ
  • UXの学ぶ上で「誰のためのデザイン?」という本は一読の価値あり
  • ONLでは実際にユーザテストする際、テスターに感じたことを声に出してもらってテストしている
  • 技術者にデザイン(UX)に興味を持たせるには実際にサービスを作ってユーザの反応を見せること

プレゼン中にUXの優れたさまざまなサイトやアプリが紹介されてたのでこちらも忘れないようにメモ。知らないアプリもいっぱいあったので暇なときにいじってみようと思います。

RSSリーダー

航空券検索

プロフィールサービス

Q&Aサービス

位置情報サービス

写真共有

写真デコレーション

写真食べ物

その他