2013年04月25日
タイトルは釣りです。
免責
公式に公開されているものではないので、むやみに使わないでください。
何かしらのアプリケーションで利用する場合は当然、問い合わせなどをして許可を得るべきです。
本題
Ginger というサービスが先ごろ公開されてまして、一言で言うと「空気読んで誤訳を直してくれるサービス」って感じです。
細かいニュアンスとかをよしなに修正してくれて、エレガントな英語 に変換してくれるらしい!すばらしいサービスですね。
いまのところは、ブラウザの拡張機能が主であとは Windows の Office 向けのものがあるようです。
で、
ブラウザか・・・有料でいいからVim版が欲しい・・・ : 「もう前置詞に迷わない」──「ネイティブレベル」の英語が書ける英文チェッカー「Ginger」日本上陸 - ITmedia ニュース itmedia.co.jp/news/articles/…
— Yoshiki Shibukawa (@shibukawa) April 24, 2013
当然こういう意見があるわけですね。
Web API あればいいのになーっておもったら、https://gist.github.com/koron/5454500 とか早速あったりしました。
というわけで、
http://services.gingersoftware.com/Ginger/correct/json/GingerTheText?lang=US&clientVersion=2.0&apiKey={api_key}&text={text}
という感じでアクセスすると、特に修正することがなければ
{
"LightGingerTheTextResult" : []
}
というような JSON が。
修正する必要があれば
{
"LightGingerTheTextResult" : [
{
"ShouldReplace" : true,
"Mistakes" : [
{
"Definition" : "trying something to find out about it",
"CanAddToDict" : false,
"To" : 3,
"From" : 0
}
],
"LrnFrg" : null,
"UXFrgTo" : 3,
"LrnFrgOrigIndxs" : [],
"UXFrgFrom" : 0,
"Type" : 1,
"TopLrnCatId" : 45,
"Confidence" : 4,
"To" : 3,
"From" : 0,
"Suggestions" : [
{
"LrnCatId" : 45,
"Text" : "Test"
}
]
}
]
}
というような JSON が返ってくることがわかります。
これは簡単にコマンドラインからアクセスできそうですね...!!
というわけで書いてみました。
#!/usr/bin/env perl use strict; use warnings; use JSON; use URI; use LWP::Simple; use String::Diff qw(diff); use Term::ANSIColor qw(color); use Pod::Usage qw(pod2usage); my $api_base_url = 'http://services.gingersoftware.com/Ginger/correct/json/GingerTheText'; my $api_key = '6ae0c3a0-afdc-4532-a810-82ded0054236'; # This API key must not be used pod2usage(1) unless @ARGV; my $text = join ' ', @ARGV; main: { my $uri = URI->new($api_base_url); $uri->query_form({ lang => 'US', clientVersion => '2.0', apiKey => $api_key, text => $text, }); my $res = decode_json get($uri); print STDERR JSON->new->pretty->encode($res) if $ENV{DEBUG}; unless (@{ $res->{LightGingerTheTextResult} }) { print "Good English :)\n"; exit; } my $fixed_text = $text; my $gap = 0; for my $rs (@{ $res->{LightGingerTheTextResult} }) { my $from = $rs->{From}; my $to = $rs->{To} || 0; my $suggest = $rs->{Suggestions}[0]{Text}; $to -= $from if $to; substr($fixed_text, $from + $gap, $to + 1) = $suggest; $gap += length($suggest) - 1 - $to; } my $diff = diff "$text\n", "$fixed_text\n", ( remove_open => color('black on_red'), remove_close => color('reset'), append_open => color('black on_green'), append_close => color('reset'), ); print "From: $diff->[0]"; print "To : $diff->[1]"; } exit; __END__ =head1 NAME ginger - Yet another spell checker =head1 SYNOPSIS ginger <write your any Engrish> =head1 AUTHOR xaicron E<lt>xaicron {at} cpan.orgE<gt> =head1 COPYRIGHT Copyright 2012 - xaicron =head1 LICENSE This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO L<< http://www.getginger.jp/ >>
これを ginger とかで保存して実行すると以下のようになります。
これでエレガントな英語がかけるようになりますね!!
まとめ
@mattn_jp さんが vim プラグインを書く。
2013年04月19日
4/17 に日本オラクルで開催された MySQL Casual #04 で話して来ました。
当日のスライドは以下になります。
http://xaicron.github.io/mysqlcasual-04/
ちょいとまだ作り始めたばっかりで微妙なところも多々あるんですが、mysqlenv のレポジトリは以下になります。
https://github.com/xaicron/mysqlenv
当日の様子
- @saisa6153 さん
- SQLドリル面白そうだった。
- というか実際にペンで書き込んでるの!?ってなってびっくりした。
- @kenjiskywalker さん
- けんじおじさん全然おじさんじゃなかったし、騙された気分
- コンテンツ力に嫉妬した
- @yoku0825 さん
- インデックスショットガン!!!
- 5.6系でなんの変化もなくて悲しい話だった
- @matsukena さん
- 5.6.10 をサービスインさせた人柱トーク
- レプリケーション関連テーブルがぶっ壊れるとか /usr/my.cnf とか罠い
- @yoshi_ken さん
- 5.6 から入った InnoDB 全文検索の話
- スペース区切りじゃないとできない → よろしいならば分かち書きだがカッコ良かった。
- INSERT の性能は mroonga に劣るけど、SELECT が何故か爆速でなぜだろうとなっている
- @kamipo さん
- 息を吸う用にストレージエンジンを書く話がカッコ良すぎてしびれた。
- mysqlcasual() 関数欲しい。
- @tagomoris さん
- O/R Mapper dis から始まって自分のプロダクトの宣伝に入ってさすがでした。
- そしてプロダクトの名前かぶってるとかいうネタを被せてきて怖かった。
- @do_aki さん
- さすがの殿堂入り。
- mysql_config_editor がザルすぎて吹いた
- @meijik さん
- お金を払うと私がサポートします
- おばさんの話
- じゃんけん負けました><
という感じで今回もとても濃くて楽しかった!!!
mysqlenv について
前日に @shim0mura さんが 全く同じ物を github にあげていて、ビール吹きました。
当日は実に和気あいあいとした雰囲気の中、夜道の危険性について語り合いました。
ちなむと、mysql-build に件の shim0mura さんが環境変数からビルドオプションを指定できるようにしていたり、さっそく kamipo さんが昨日出たばっかりの mysql 5.6.11 に対応していたりしているので、進化していますね!
おわりに
@myfinder++, Oracle++
そして @yut148++ (たい焼き的な意味で)
今回はかなり挑戦的なイベント運営でしたが、入れなかったひとが 1人だけど言う奇跡的な流れでした。
ただし、やはり水曜というだけあって飲みに行く人がぜんぜんいなくて、いろいろ話しできなかったのが残念やも!
というわけで、次回は @yoshi_ken さんの成果報告を楽しみにしております。
2013年04月18日
新卒向けなんたらカレンダーの X日目です。
そもそも homebrew 使ってない
まず Xcode を入れる必要がある。Xcode は App Store からインストールして、 Preference → Downloads → Components → Command Line Tools をインストール。
そしたらおもむろに以下のコマンドを打つ
$ ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
おしまい。
sl
$ brew install sl
必須コマンド。
zsh
$ brew install --disable-etcdir zsh
OS X は PATH をゴニョゴニョやられてむかつくので /etc/zshenv を読まないように --disable-etcdir 付きでインストール。
zsh-completions
$ brew install zsh-completions
zsh-completions はインストール後に
$ echo 'fpath=(/usr/local/share/zsh-completions $fpath)' >> ~/.zshrc $ source ~/.zshrc $ rm -f ~/.zcompdump; compinit
しておく
tmux
$ brew install tmux
手元では tmux、サーバーでは screen 派。
でも実際凝ったことやろうとすると screen じゃないとできないことが多々あるのでいかがなものか。
reattach-to-user-namespace
$ brew install reattach-to-user-namespace
tmux つかったときにこれを通さないと pbcopy や pbpaste が使えなくて死ぬ。OS X で tmux を使うのは苦行か。
set -g default-command reattach-to-user-namespace -l zsh
とかを ~/.tmux.conf に書く。
gnu-tar
$ brew install --default-names gnu-tar
デフォルトの tar が腐っているので、gnu-tar をインストール。普通にやると gtar になってしまうので、--default-names 付きで。
tree
$ brew install tree
なんかデフォで入ってない
watch
$ brew install watch
なんかデフォで入ってない
colordiff
$ brew install colordiff
diff は色付きで見たいじゃんすか!
あとは .zshrc とかで
alias diff='colordiff' alias less='less -R'
とかでしておけばよい
htop-osx
OS X の top は糞すぎるので htop を入れる。
$ brew install htop-osx
pstree
Linux と違って ps auxf が使えず tree 表示できないので入れる。
$ brew install pstree
the_silver_searcher
$ brew install the_silver_searcher
the_silver_searcher は ack を超速くしたやつで ag コマンドがインストールされる。銀だからね。使い方は ack と一緒。
groff
$ brew tap homebrew/dupes $ brew install groff
OS X のデフォルトだとマルチバイト扱えないので入れておく
vim
$ brew install vim
自分は vim 派
lv
$ brew install lv
実際のところ less で事足りていた!
git
$ brew install git
最近版を使いたいのです!
tig
$ brew install tig
git の CLI ブラウザー。たまに使う。
hub
$ brew install hub
git コマンドを github フレンドリーにするラッパー。hub clone -p author/project ぐらいしか使ってないけど一応。
wget
$ brew install wget
なくても生きていけるけど、あったらあったでよい。
sqlite
$ brew install sqlite
新し目のやつ使いたい。
memcached
$ brew install memcached
ほぼアプリのテスト時に立ち上げる専用
redis
$ brew install redis
最近は立ち上げるとどーかんとロゴが出るのですかさず Ctrl-C してる。
dnsmasq
$ brew install dnsmasq
たまーに *.foo.bar 見たいなドメインを解決したいときにローカル dns サーバーとして利用。
ngrep
$ brew install ngrep
ゆるふわに HTTP を解析したいとき用。
cmake
$ brew install cmake
最近のソフトウェアは cmake が必要なことが多いんですってよ奥さん!
node
$ brew intall node
あんまり詳しくないので brew でいれているけど、詳しい人に聞いたほうがいいかもしれない!
python
$ brew intall python
あんまり詳しくないので brew でいれているけど、詳しい人に聞いたほうがいいかもしれない!
おわりに
あとは煮るなり焼くなりお好きにどうぞ。
rbenv とか plenv とかは自力で $HOME 配下に入れて使ってる感じなのでいれてません!あとは mysql とかは最近は mysqlenv っての作ったのでそれつかってますが brew install mysql でもいいと思います。
おかしいなとおもったら
$ brew doctor
または
$ rm -rf /usr/local/Cellar /usr/local/.git && brew cleanup
すれば最初からやり直せる。
Happy brewing life!
2013年04月17日
実際は 3つぐらいしかないです。
Cinnamon の Minilla 化で @shiba_yu36 先生がハマっていたのでここに記す。
ちなむと、Minilla の現在の HEAD (cb3fc97d4e) で試しているのであり、今後は修正される可能性が大いにあります。
migrate 編
0. とりあえずブランチ切りましょう
いつでもあの頃に戻りたい。みんなそう思っている。
# Minilla 化される直前の commit からブランチを作成 $ git checkout -b minilize 0bf8634
あとは、何かあったら以下のコマンドで元通りです。
$ git reset && git checkout . && git clean -df
1. ディレクトリ名とモジュール名が一致していない
git repository では全部小文字なんだけど実際のモジュールは大文字だったわ〜って場合は動かないので気をつけましょう。
$ cd ../ $ mv cinnamon Cinnamon $ cd Cinnamon
または、minil.toml というファイルに name を書くという手もあります。というかこっちが順当な技です。
$ echo 'name = "Cinnamon"' >> minil.toml
2. M::B 使ってて LICENSE ファイルを commit していない
LICENSE がファイルが commit されていない場合はちょいとうまくいきません。あとで直しますが、とりあえず M::B の場合は先に LICENSE ファイル作りましょう。
あとは、Software::License が入ってないと動かないので先に入れましょう。
$ perl Build.PL $ ./Build distmeta $ ./Build manifest
と、思ってたんだけど直したんだったこれ!!
というわけで Cinnamon はディレクトリ名変えただけで行けました。
3. Makefile.PL 使ってた場合
あとで書く
release 編
Minila の HEAD を cpanm の最近版をつかって --with-recommends でインストールしておくと捗る。
$ cpanm --devel App::cpanminus $ cd /path/to/Minila $ cpanm --installdeps --with-recommends .
あと、CPAN::Uplader が .pause を要求するのでこれに
user YourName pass YourPassword
と書いておく。
が、自分的には password は書きたくなくて毎回聞いてほしい派なのであとで出来るようにするかも。
そしたらリリースしたいやつのところで
$ minil relase
するとエディターが開く
{{$NEXT}}
0.01 XXXXXX
- XXXXX
みたいになっているのを
{{$NEXT}}
- XXXXX
0.01 XXXXXX
- XXXXX
とかすれば OK。バージョンを手で入れたり日付入れたりしなくてよい。
以上。
2013年04月12日
@naoya_ito さんに lingr で
naoya_ito: 日付処理するときはいまも変わらず DateTime ですか? http://xaicron.github.io/hokkaodo.pm-09/ これに日付周りが載ってなかった・・・
って言われたので、追記しました。
http://xaicron.github.io/hokkaodo.pm-09/#47
らへんになります。
更にいうと例外処理周りもすっかり抜け落ちてまして、まぁやれやれですね。というわけで、
http://yappo.github.io/talks/20130329-perlcasual7-exception/#/title
にリンクしておきましたのでこちらをご覧ください。
あと、@hirose31 さんに
あいほ〜んでみれないよ〜
って言われたので、適当にやっつけました。
そして今気づいたんですが、s/hokkaodo/hokkaido/ ですね。でももう公開しちゃったからいいや...
2013年04月05日
http://blog.livedoor.jp/xaicron/archives/54444878.html
これでどういう感じで調べたのかというのをなんとなく書いてみます。
Changes を見る
まず、なにはともあれ Changes を確認します。自分はよく metacpan を利用しているので、
https://metacpan.org/source/KROKI/Cache-Memcached-Fast-0.20/Changes
らへんをさらっとみます。
または、Pod::Cpandoc というモジュールをインストールすると cpandoc というコマンドが利用可能になるので
$ cpandoc -c Cache::Memcached::Fast
などとしても良いです。
そんなこんなで以下の様な内容が読み取れます
0.20 2013-04-03
- finally fix magic.t failure. Magic handling introduced in
0.18 wasn't correct until this release. Upgrade if you use
Perl 'tie' feature or its derivatives like Readonly.
Changes since 0.19:
Fix RT#57150, RT#67106: magic.t failure. Thanks to
<listposter@...> for instructions on how to reproduce the
problem.
Fix RT#77254: typo in POD documentation. Tnanks to Alex
<alex112358@...>.
Fix RT#81782: Unnecessary string eval in constructor. Thanks
to Andrew Holland for the patch.
ここで RT#57150 とか出て来ました。これは何でしょうか?
もちろん twitter の RT (Re-tweet) ではありません。実は CPAN にはバグトラッカーがあって、RT (Request Tracker) *1 というのを利用しているのでそれの名前です。
つまり、これはバグのチケット番号です。以下の URL にアクセスすると詳細がみられます。
https://rt.cpan.org/Ticket/Display.html?id=57150
でもいちいちこんなの手打ちできないので自分は bookmarklet 使ってます。
(function() {
var id = prompt("Please enter RT ticket id");
if (!id) { return; }
location.href = "https://rt.cpan.org/Ticket/Display.html?id=" + id;
})()
と、みせかけて詳細見るのめんどいですね。
コードの diff を見る
ぶっちゃけ、いきなり diff 見るのが早い。百聞は一見に如かず。
というわけで、metacpan で diff を見ましょう。
https://metacpan.org/release/Cache-Memcached-Fast
のページに行って、Tools のドロップダウンリストから比較したいバージョンを指定しましょう。
そうすると、以下の様な画面になるので、好きなだけ diff を見られます。やった!
というわけで、晴れて以下の様なコードが追加されているっぽいことがわかりますね。
+/* + When SvPV() is called on a magic SV the result of mg_get() is cached + in PV slot. Since we pass around pointers to this storage we have + to avoid value refetch and reallocation that would happen if + mg_get() is called again. Because any magic SV may be put to the + argument list more than once we create a temporal copies of them, + thus braking possible ties and ensuring that every argument is + fetched exactly once. +*/ +static inline +char * +SvPV_stable_storage(SV *sv, STRLEN *lp) +{ + if (SvGAMAGIC(sv)) + sv = sv_2mortal(newSVsv(sv)); + + return SvPV(sv, *lp); +}
SvGAMAGIC を調べる
これはまぁ、SV に magic があるかどうかとかを調べるマクロなんですが、実際になにやっているのかよくわからんちんですね。
perl のソースは見ることがよくあるので、手元に大体おいてあります。ない人は今すぐ wget !
まぁどうせ sv.h に定義してあると思うけど、とりあえず ack してみます。
$ ack SvGAMAGIC *.h sv.h 899:=for apidoc Am|U32|SvGAMAGIC|SV* sv 912:#define SvGAMAGIC(sv) (SvGMAGICAL(sv) || SvAMAGIC(sv))
912 行目にありました。
で、適当にマクロを追っていくと最終的に
#define SVs_GMG 0x00200000 /* has magical get method */
が立っているかを調べている事がわかります。
これが立っていると、SV を取得する前になんかする Hook があるという事になる模様です。詳しくは
https://github.com/gfx/YAPC-Asia-2009-gfx
を御覧ください。
結論
というわけで、magic ついてるような値を Cache::Memcached::Fast に通常は入れないので、特に急いで上げる必要がないという判断です。
ちなみに、SvGAMAGIC() の呼び出しが増えていますが、せいぜいナノ秒単位の差でしょうから何も気にすることはありません。
どちらかと言うと、ドキュメントの typo が直ったことが、version 0.20 の見どころかもしれませんね!
まとめ
metacpan 便利。
あと、metacpan の RSS を取るとか、twitter で @cpan_new をフォローするとか、lingr で perl_jp に join するなどすれば、リアルタイムで CPAN モジュールの更新を追えてあら便利ですね。
更新内容がよくわからなかったら気軽に質問するとよいですね。
2013年04月04日
実に3年ぶりに Cache::Memcached::Fast がリリースされました。
更新内容は、key に MAGIC があるような SV を渡した時におかしくなっていたものを修正したというもので、SvGAMAGIC() という MAGIC のチェックをするコードが追加されています。
23:33 xaicron: SvGAMAGIC(sv) の呼び出しが増えてるのか 23:35 tokuhirom: SvGAMAGIC ってなんだっけ 23:36 xaicron: わかんないw 23:37 xaicron: これって key に MAGIC 入ってるような値渡してると変になるってことなのかな? 23:40 tokuhirom: そういうバグをなおした、って話だろね 23:41 tokuhirom: 要するに、速度は劣化するが magic を考慮するようになった 23:41 tokuhirom: というコードですね 23:42 xaicron: ですね 23:42 xaicron: なので、upgrade する必要はなさそうだ 23:42 tokuhirom: agree 23:42 tokuhirom: 現状うごいてて問題ないならアップグレードする必要はない 23:43 xaicron: すね
ということになりますので、急いでアップグレードする必要は無さそうです。
