2013年04月25日

タイトルは釣りです。

免責

公式に公開されているものではないので、むやみに使わないでください。

何かしらのアプリケーションで利用する場合は当然、問い合わせなどをして許可を得るべきです。

本題

Ginger というサービスが先ごろ公開されてまして、一言で言うと「空気読んで誤訳を直してくれるサービス」って感じです。

細かいニュアンスとかをよしなに修正してくれて、エレガントな英語 に変換してくれるらしい!すばらしいサービスですね。

いまのところは、ブラウザの拡張機能が主であとは Windows の Office 向けのものがあるようです。

で、

当然こういう意見があるわけですね。

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 とかで保存して実行すると以下のようになります。

https://lh5.googleusercontent.com/-XtFWXbU8FSA/UXg-aAFdm9I/AAAAAAAABMQ/ptq0WkRvsAE/w454-h98/e04fbc8062cca3768e9859e7e8d1c769.png

これでエレガントな英語がかけるようになりますね!!

まとめ

@mattn_jp さんが vim プラグインを書く。



xaicron at 05:52コメント(0)トラックバック(0)Perl   はてなブックマーク  はてなブックマーク数

2013年04月19日

4/17 に日本オラクルで開催された MySQL Casual #04 で話して来ました。

当日のスライドは以下になります。

http://xaicron.github.io/mysqlcasual-04/

ちょいとまだ作り始めたばっかりで微妙なところも多々あるんですが、mysqlenv のレポジトリは以下になります。

https://github.com/xaicron/mysqlenv

当日の様子

https://lh4.googleusercontent.com/-IJ1nmgTYadU/UXAsvI2KsCI/AAAAAAAABL8/W5tpfsYcoTI/s656/mysqlcasual-04_001.png

  • @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 さんの成果報告を楽しみにしております。



xaicron at 13:39コメント(0)トラックバック(0)MySQL   はてなブックマーク  はてなブックマーク数

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!



xaicron at 01:10コメント(0)トラックバック(0)Mac   はてなブックマーク  はてなブックマーク数

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。バージョンを手で入れたり日付入れたりしなくてよい。

以上。



xaicron at 17:18コメント(0)トラックバック(0)Perl   はてなブックマーク  はてなブックマーク数

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/ ですね。でももう公開しちゃったからいいや...



xaicron at 04:42コメント(0)トラックバック(0)Perl   はてなブックマーク  はてなブックマーク数

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 のドロップダウンリストから比較したいバージョンを指定しましょう。

https://lh6.googleusercontent.com/-2RbpmohwtM0/UV38FbDb5NI/AAAAAAAABLg/YBBw4n16pu4/s444/choose.png

そうすると、以下の様な画面になるので、好きなだけ diff を見られます。やった!

https://lh6.googleusercontent.com/-gexHVr9YgtM/UV38E9d6XxI/AAAAAAAABLc/9fwK4GNTp5Y/s808/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88+2013-04-05+6.56.58.png

というわけで、晴れて以下の様なコードが追加されているっぽいことがわかりますね。

+/*
+  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 モジュールの更新を追えてあら便利ですね。

更新内容がよくわからなかったら気軽に質問するとよいですね。



xaicron at 07:31コメント(0)トラックバック(0)Perl   はてなブックマーク  はてなブックマーク数

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: すね

ということになりますので、急いでアップグレードする必要は無さそうです。



xaicron at 23:49コメント(0)トラックバック(0)Perl   はてなブックマーク  はてなブックマーク数
プロフィール

Perlが少しだけ出来る気になってます。
JavaScriptはよくわかりません。
Rubyもちんぷんかんぷんです。
Pythonは難しいです。
ActionScript勘弁してください。
Javaあばばばばば。
低級言語できません。

github
記事検索
ラノベ
コミック
フィギュア
Bru-ray / DVD
  • ライブドアブログ