2010-11-01

CoffeeScriptインストール

前回何気なく触っていた node.js 界隈が盛り上がっているぽい。
WebSocket 周りはもうちょっと仕様が落ち着いてから確認するとして、
中でも個人的に食指の動いたのが、CoffeeScript 。
javascript を生成するミニマムDSLを提供してくれます。
詳細は参考サイトにて。

前回の cygwin + node.js の残念さのリベンジ兼ねて
忘れないよう現状のインストールメモ(参考サイトの劣化コピー)。

1. cygwin インストール
  • devel -> gcc-g++
  • devel -> git
  • devel -> make
  • devel -> openssl
  • devel -> pkg-config
  • devel -> zlib-devel
  • python -> python
  • editor -> vim
  • Net -> curl
 2. node.js

mkdir ~/src
cd ~/src
git clone git://github.com/ry/node.git
cd node
git fetch --all
git tag
git checkout v0.2.4
./configure --prefix=~/.nodejs
make
make install

export PATH=$PATH:~/.nodejs/bin

  • v0.3.0 で ./configure しようとするが途中で止まるので断念。 autoconf 入れるだけでは駄目っぽい。 
  • node -v すると v0.2.2 って返ってくるけども...?
3. npm インストール

vim /etc/resolv.conf
----
nameserver 8.8.8.8
nameserver 8.8.4.4
----

cd ~/src
git clone git://github.com/isaacs/npm.git
cd npm
make
make link



4. CoffeeScript インストール

cd ~/src
npm install coffee-script
git clone git://github.com/jashkenas/coffee-script.git
cake test



動いた!


5. vim 環境整備


cd ~/src
git clone git://github.com/tpope/vim-pathogen.git

mkdir -p  ~/.vim/autoload
cp -r ./vim-pathogen/autoload ~/.vim/autoload

mkdir ~/.vim/bundle
cd ~/.vim/bundle
git clone git://github.com/kchmck/vim-coffee-script.git
git clone git://github.com/thinca/vim-quickrun.git vim-quickrun
git clone git://github.com/tyru/stickykey.vim.git
vim ~/.vim/bundle/vim-coffee-script/ftplugin/coffee.vim の最後に追記。
----
function! JavaScriptUnderScoreBecomesCamelCase()
  if matchstr(getline('.'), '.', col('.')-2) =~ '\w'
    return "\(stickykey-shift)"
  else
    return '_'
  endif
endfunction!

imap _ JavaScriptUnderScoreBecomesCamelCase()
----
 

  • [vim] :set paste するとインデントが崩れないで貼り付けられる。:set nopaste でモードを元に戻す。
6. おまけ
Cygwin Bash Shell (cmd.exe) の規定値設定変更



フォント
  MSゴシック
  フォントサイズ:12
レイアウト
  画面バッファ幅:100
  ウィンドウ幅:100
  ウィンドウ高さ:100


7. 参考サイト

2010-08-06

プロダクトとしてのWave終了のお知らせ

各所で Google Wave 開発中止の報道が流れています。
Complete Guide のなんちゃって翻訳を行っていた身として、
感謝のエントリー。

Google 自身も、もともと「Surprise us」というくらい
何に使っていいか分からない状態でのサービス提供。

入力した内容を多言語にリアルタイム翻訳したり、
XMLで表現できるものなら、何でも同時編集できるという
クラウドサービスのパワーと技術的な可能性を感じるプロダクトでした。

イチ利用者として、プロダクトのポテンシャルに
発想が追いつかなかったわけですが、
私にとってはオンラインに戻るキッカケとなったサービスで、
普段の生活では、接点の無さそうな方々と知り合いになれ
夢のようなヒトトキでした。そして夢はまだ続いています。

 最近興味の引いたコンテンツは、
成果物としての「UX」とはなにかを考えよう (@yhassy)
など、どこに向かうか楽しみな wave も出てきており、
参加型プレスリリースの新しい形かなと期待していました。
# 今や、「それ buzzで(ry 」ですかね。

サービスとしては、プロトコルが主な興味で「バージョン管理されたドキュメント」という側面と
「ロボットやガジェットAPIによる拡張性」という側面に
特に注目していました。


Operational Transformation (日本語訳:@noriyo)は関数型言語の流行もあって、
使いやすい実装が出てくるのを期待します(他力本願モード)。
(というか、欲しいので勉強しなきゃ。)
 
ともあれ、開発終了はプロダクトとしての Wave なので、
思想は受け継がれ、他のサービスに生き続けることでしょう。
# リファレンス実装は他にも出てますし、やりようによっては、自宅の俺Waveサーバ建てれますし。

私は、この思想への興味は尽きそうにありません。

2010-08-02

宿題に回答

先日とある食事会に参加し、私に振られはしたものの
中途半端な回答になった感のある話題を
ピックアップして備忘録的にキーワードを羅列しておきます。

■SGMLベースで電子カルテって言ってる人たちっていましたよね...?情報元って何?
 => オープンな仕様は、今では XML ベースになってて、地域によっては一患者一カルテが実現しています。 (医師で好きなヒトがいる)
...が、私が扱ってる範囲ではまったく兆候が見られません(医療機関内だけでなくベンダーにもギャップがある)。

  • MEDIS/DC
  • JIHIS
  • HL7/MML
  • Dolphin Project
  • 医療情報技師(民間資格ビジネス)
流れはオープンデータに向かってるけれども、現実問題この業界でそれが起こるのか。観察には事欠きません。

...で本題。
一言で終わろうと思えば終わる、別れ際の宿題の回答を
あえてエントリー。

別れ際に
@bardiche 「翻訳するのにいいツールない?」
私「私の場合個人レベルなので使ってないけどw」
というやり取りがあり、観測範囲でチラミしている感じでは
規模によってはこんな方法もあるみたいですよと適当に返事をしてしまいました。

詳細は後日ということで、その場は別れましたのでその回答。

1つめ:

分散構成管理システムの Mercurial を翻訳に利用しているグループもあるようです。


2つめ:
あの場では phenix って言いましたが間違ってました
正しくは Sphinx です。

3つめ:

DocuWiki というものもあるようですが、
PHP 製は個人的な理由で敬遠中。
(すばらしいフレームワークが多いので、個人的に損してると思う)

■その他キーワード
  • シンプルなことは複雑(単純化するのは難しい)。(大人になるといろいろ判って考えちゃうよね)
  • 「分かること」と「ヒトを評価すること」(最近、情報消費の感覚が雑だよね。バイナリシンキング) 
  • IAは基本的なヒューマンスキル。誰にでも素養はある。
  • コンテンツとコンテキスト(外情報(exformation)と情報の流動化、などなど。) 
  • 五感の中で嗅覚って WEB では置いてけぼりっぽい。
  • ルサンチマンとポジティブシンキング(ポリアンナ症候群)。
  • 「日本版」とか「俺仕様」とか。
  • 世の中知らないで良いこともたくさんある。(派閥ってxxx)
  • 建築写真集ジャケットフェチという消費方法に共感。
書ききれないくらいキーワードが増えて来るので
これくらいにして忘却します。

続きはまたの機会に。


2010/08/03修正
ちょっと配慮に欠けた感がそこはかとなく漂っていたので一部訂正しました。

2010-07-24

RedisCookbook 日本語訳を(やっと) github に公開しました。

放置されていた RedisCookbook ですが、
先日ひょんなこと(node.js)から触った cygwin 使ったら
うまく リモートサーバに push できたのでご報告。


----
■cygwin に git セットアップ
  • openssh
  • git
設定
git config --global user.name "jasagiri"
git config --global user.email "jasagirixxx at gmail dot com"
git config --global color.ui "auto"

設定確認
git config --global --list


■SSH設定

鍵作成
ssh-keygen -t dsa


 注): ssh-keygen -b 2048 -t rsa -f ~/.ssh/github_rsa だと、「Permission denied (publickey)」と怒られて push できない。
参照):http://help.github.com/troubleshooting-ssh/

パスフレーズ入れる



クリップボードにコピー
cat ~/.ssh/id_dsa.pub | putclip

鍵の保管場所を変更しておく。

github サイトで公開鍵を登録 (最後の改行注意)


■ フォーク
 http://github.com/rediscookbook/rediscookbook からさっくりフォーク

■修正

修正元取得
git clone xxx@xxxx:jasagiri/rediscookbook.translation.git

ごにょごにょ変更

変更点をローカルリポジトリに知らせる
git add .

変更点をローカルリポジトリに登録する

git commit -m 'japanese translation: fixed changeset 04abfa6 (2010/07/01)'

変更点をリモートリポジトリに登録する

git push origin master
Enter passphrase for key 'key path and name': <sshのパスフレーズ>

公開されているか確認
http://github.com/jasagiri/rediscookbook.translation



■メモ
  • フォーク元に迷惑かからないようにできているのか不安。
  • upstream とか基本的なことがわかってないw
  • submodule 化したほうが良かったかもと今更ながら
  • en-US分を翻訳元として追随使用と思うとどうフォークするのが正解?

2010-07-19

Node.js を試してみる

御贔屓の RedisDB のページで気になってた Node.js  を試してみる。
(結論としては、Redis 使うところまで届かず、コンパイルで時間切れという残念な結果。次回期待)


やったこと(残念な流れ):
  1. cygwin ダウンロードする。
  2. cygwin インストールする。
    1. python gcc/c gcc/c++ make を追加で選択
  3. 本家参考にソースをダウンロード/展開する。
  4. cygwin/bash で ./configure 

      => いろいろ not found と出る。

5. libssl-dev 入れると幸せ(via:tricknotes)という情報を入手。
6. cygwin のパッケージ眺めてもそれっぽいのが無いので Devel\openssl-devel を入れてみる。
7. 何個かは not found が消えたがまだコンパイル通らない。(情報と not found の数も合わない)
8. cygwin 用フルパッケージを配っているヒト(via: DTrejo)がいたので拝借。
9. cygwin/bin 配下から現環境とくらべて新しそうなの(や無いの)を持ってくる。(何者なのかは調べてない)

  • cygintl-1
  • cygintl-2
  • cygpcre
  • cygrensvr
  • cygssp
  • cygwap
  • ln.exe
  • nano.exe
10. 3.で展開した最新ソースで ./configure。
11. not found がまだ出るが気にせず、make と make install。

=> 通った!

12. make test

=> module オブジェクトに GuessArchitecture アトリビュートが無いと怒られる。
同じヒトがいた。python のバージョンかもらしい。 (via: vwxyz)

13.  サンプルのチャットアプリ(via: ry)を試す。

=> node server.js
http://127.0.0.1:8001/ にブラウザでアクセス。 => 動いた。

RedisDBまでいかなかった orz。


以下 ./configure と make test のメモ
----
$ ./configure
Checking for program g++ or c++          : /usr/bin/g
Checking for program cpp                 : /usr/bin/c
Checking for program ar                  : /usr/bin/a
Checking for program ranlib              : /usr/bin/r
Checking for g++                         : ok
Checking for program gcc or cc           : /usr/bin/g
Checking for gcc                         : ok
Checking for library dl                  : yes
Checking for library execinfo            : not found
Checking for openssl                     : not found
Checking for function SSL_library_init   : yes
Checking for header openssl/crypto.h     : yes
Checking for library rt                  : yes
--- libeio ---
Checking for library pthread             : yes
Checking for function pthread_create     : yes
Checking for function pthread_atfork     : yes
Checking for futimes(2)                  : yes
Checking for readahead(2)                : no
Checking for fdatasync(2)                : yes
Checking for pread(2) and pwrite(2)      : yes
Checking for sendfile(2)                 : no
Checking for sync_file_range(2)          : no
--- libev ---
Checking for header sys/inotify.h        : not found
Checking for header sys/epoll.h          : not found
Checking for header port.h               : not found
Checking for header poll.h               : yes
Checking for function poll               : yes
Checking for header sys/event.h          : not found
Checking for header sys/queue.h          : yes
Checking for function kqueue             : not found
Checking for header sys/select.h         : yes
Checking for function select             : yes
Checking for header sys/eventfd.h        : not found
Checking for SYS_clock_gettime           : no
Checking for library rt                  : yes
Checking for function clock_gettime      : yes
Checking for function nanosleep          : yes
Checking for function ceil               : yes
Checking for fdatasync(2) with c++       : yes
'configure' finished successfully (53.469s)

----

$ make test
Waf: Entering directory `/cygdrive/d/user/bin/node/build'
DEST_OS: cygwin
DEST_CPU: x86
Parallel Jobs: 2
Waf: Leaving directory `/cygdrive/d/user/bin/node/build'
'build' finished successfully (0.516s)
python tools/test.py --mode=release simple message
Traceback (most recent call last):
  File "tools/test.py", line 1066, in
    ARCH_GUESS = utils.GuessArchitecture()
AttributeError: 'module' object has no attribute 'GuessArchitecture'
make: *** [test] Error 1
----

2010-04-20

[翻訳]rediscookbook/4_higher_level_data_structures/implement_a_social_graph

### 問題

ある種のアプリケーションでユーザのソーシャルグラフを実装するのに単一または複数の方向の関係が利用可能な状態(フォローやフレンドシップ)で Redis を使いたいとしましょう。

### 解法

Redis 組み込みの set 関数を使って、各ユーザのユニークID をキーとした「follow」、「follower」と「blocked」リストを構成してください。redis の生データではこのように見えます:

    redis> SADD user:1:follows 2
    (integer) 1
    redis> SADD user:2:followers 1
    (integer) 1
    redis> SADD user:3:follows 1
    (integer) 1
    redis> SADD user:1:followers 3
    (integer) 1
    redis> SADD user:1:follows 3
    (integer) 1
    redis> SADD user:3:followers 1
    (integer) 1
    redis> SINTER user:1:follows user:1:followers
    1. 3

### 検討

Redis はキーに割り当てられたユニークな値の集まりの「sets」を構成することができます。
特定のユーザのために「follows」「followers」リストの両方を作成し、簡単なセットの交点を使用することで彼らの「friendships」について求められるでしょう。

Ruby でそのシステムを実装する場合には、このように見えます。:

{% code_snippet social_graph.rb %}

2010-04-14

rediscookbook翻訳中です。

最近めっきりご無沙汰の Redis 絡みで、
先日公開されていた RedisCookbook
リハビリがてら、いつものなんちゃって日本語訳中です。
(一部動作未確認)

本当は githubのリポジトリ に公開したいのですが、
push 時のエラーが解決できなく、時間切れ中。
(リポジトリ作った後の手順で README は push できたのですが。)

懐に温めててもしかたがないので、ブログに公開することにしました。
(チェンジセット:5c5816b312bf33adc429ac45633b4c61c4fa9cef までのrecipe.md)
(11日の最後のチェンジセット以降は未確認)
(チェンジセット:57216e1 に合わせて修正)

■構成


[翻訳]rediscookbook/README.md

# Redis クックブック

### みんなの知識で Redis コミュニティを育てましょう!

この Redis Cookbook にみんなのパターンやメソッドのアイデアを持ち寄りましょう。

- - -

### レシピに貢献する方法

1. このリポジトリを Fork して新しいトピックのブランチ(フォルダ)を作成してください。
2. メタデータ(著者やタグ)を含んだ YAML ファイルを作成したフォルダに追加してください。
3. pull request を送ってください。-- 新規や追加したレシピの簡単な紹介を含めてください。
4. ドキドキしましょう。

### もっと貢献する方法

下記のことが可能です:
* 既存のレシピにプログラム言語に寄らずサンプルコードを追加すること。リポジトリを Fork して関連ディレクトリにコードを追加してください!
* rediscookbook.org ウェブサイトを訪れてください。このサイトはオープンソースで `site` フォルダに丸ごと入っています。
* 誤字、書式誤り、リンク切れ、その他小さなことを見つけてください。 どんな潜在的な改良でも「小さすぎる」ということはありません。-- とにかくフォークしてください。


### 主催者

* [Tim Lossen](http://github.com/tlossen)
* [Ted Nyman](http://github.com/tnm)

### ライセンス

Creative Commons Attribution Share Alike 3.0

[翻訳]rediscookbook/IDEAS

ウェブチャットの作成方法 (Pieter Noordhuis) ?
http://gist.github.com/348262

現在オンラインのユーザをトラックする方法 (Luke Melia) ?
http://www.lukemelia.com/blog/archives/2010/01/17/redis-in-practice-whos-online/

分散ロックの実装方法 (amix)
http://amix.dk/blog/post/19386

twitter クローンを書く方法 (Daniel Lucraft) ?
http://github.com/danlucraft/retwis-rb

Node.js によるユーザの位置情報をトラックする方法 (Rick Olson)
http://techno-weenie.net/2010/2/3/where-s-waldo-track-user-locations-with-node-js-and-redis

stats を組み込みで使う方法 (Ben O'Steen)
http://oxfordrepo.blogspot.com/2010/01/usage-stats-and-redis.html

クラウドを利用した文書解析方法 (Simon Willison)
http://simonwillison.net/2009/Dec/20/crowdsourcing/

短縮 URL サービスの構築方法 (Sunil Arora) ?
http://sunilarora.org/url-shortener-service-using-redis

メモ化の方法 (Levi Cook)
http://github.com/levicook/memodis

redis の内容を点検する方法 (Chris Kite)
http://github.com/chriskite/rediscover

大量のアトミックな操作を発生させる方法 (Nate Wiger)
http://github.com/nateware/redis-objects

boogle クローンを書く方法 (Nick Quaranto)
http://github.com/qrush/beesknees

[翻訳]rediscookbook/5_durability_and_consistency/make_data_more_durable

### 問題

Redis にあるデータの耐久性を上げたい。

### 解法

Redis 組み込みのbuilt-in *追記型ファイル* (AOF) を使用してください。

`redis.conf` という Redis 構成ファイルを編集して、次の行を含めてください:
    appendonly yes

Redis はすべてのコマンドを AOF に対応させる予定です。
もしサーバがクラッシュしてもこのファイルから状態の再構築ができるでしょう。
MySQL の binlog など、他のデータベースで一般的なログファイルととてもよく似た振舞いをします。

### 検討

AOF 自身は構成可能です。 耐久性と速度のトレードオフを特徴とする3つの異なるオプションがあります。
`redis.conf` にこれら構成を設定できます。

3つのコマンドとは、すべてのコマンドで強制的に同期する、1秒毎に同期する、同期しない(つまりオペレーティングシステムのプロセスに任せる)です。Redis のデフォルトはすべてのコマンドで同期するですが、とても遅くなるでしょう。通常、2番目のオプションは安全性(訳注:耐久性?)と速度とのトレードオフです。

### 参照

[翻訳]rediscookbook/4_higher_level_data_structures/implement_a_fifo_queue

### 問題

基本的な push と pop 操作でシンプルな抽象化された先入れ、先出しのキューを実装して Redis を使いたい。

### 解法

Redis 組み込みの `List` データ型は自然なキューです。事実、単なるキューの実装で、`List` 操作の限定されたセットを便利にする必要があります。

    redis> LPUSH queue1 tom
    (integer) 1
    redis> LPUSH queue1 dick
    (integer) 2
    redis> LPUSH queue1 harry
    (integer) 3
    redis> RPOP queue1
    tom
    redis> RPOP queue1
    dick
    redis> RPOP queue1
    harry


### 検討

Redis は *ブロッキングポップ*操作と同等の4つの基本的なリストプッシュとポップ操作(RPUSH, LPUSH, LPOP, RPOP)が提供されています。これらはすべて O(1) オーダで、コマンドの時間的コストはリストの長さに依存しません。

Redis コマンド上で簡単なキューを実装するには、簡単で、さらっと Redis の力を把握するには良いイントロです。

例えば、ここに、オブジェクトレベルの相互作用(新しいキューの ID を一意にするために INCR を使います)を提供する Python キューがあります。:

    r = redis.Redis()

    class Queue(object):
        """抽象 FIFO キュー"""
        def __init__(self):
            local_id = r.incr("queue_space")
            id_name = "queue:%s" %(local_id)
            self.id_name = id_name

    def push(self, element):
        """キューの最後に要素を Push する"""
            id_name = self.id_name
            push_element = redis.lpush(id_name, element)

    def pop(self):
        """キューの最初の要素を Pop する。"""
            id_name = self.id_name
            popped_element = redis.rpop(id_name)
            return popped_element


### 参照

[翻訳]rediscookbook/3_object_level_interaction/using_a_ruby_library_to_store_objects

### 問題

Ruby オブジェクトを永続化する [remodel](http://github.com/tlossen/remodel) を使いたい。

### 解法

オプションを探し、1つ選んでください! Ruby には オブジェクトを保存するいくつかの永続化ライブラリがあります続化オブジェクトが存在しています。
このレシピでは、例として [Ohm](http://github.com/soveran/ohm) と [remodel](http://github.com/tlossen/remodel) を取り上げます。
しかし、読者はこの目的のために使用できる他の良いライブラリがあることを忘れないでください。
[どうか、他のライブラリやたくさんの使用例を追加してください。]

一般的な抽象化戦略は複雑なスキーマ定義無しでオブジェクトをマッピングすることで、
同等の結果を得るためにとても簡単なドメイン固有言語を使用しています。

次に Ohm の例を考えてください。
ここでは、3つの任意のオブジェクト(Event, Venue, および Person)をモデル化し、Event にバリデーションを提供するつもりです。

{% code_snippet ohm.rb %}
Remodel は永続化エントリの説明的なシンプルな DSL を提供します。:
よく知られている 'has_many' 関連は remodel ではこうです。

{% code_snippet remodel.rb %}
もし上記を `cookbook.rb` として保存して、Redis をローカルで動かせるなら、
Ruby シェルを開いて、実行できます。

    >> require 'cookbook.rb'
    => true
    >> book = Cookbook.create :title => 'Python Cookbook', :author => 'Alex Martelli'
    => #
    >> recipe = book.recipes.create :name => 'Sorting a Dictionary'
    => #
    >> recipe.book
    => #

### 検討

永続化オブジェクトのために既存のライブラリを使う重要な理由は、
組み込みのbuilt-in *アサーション* や バリデーションの力です。
例えば Ohm では、数値のみフィールドには確かに数値にマッチするかをアサーションします。
`format` バリデーションのために正規表現を使うことが出来ます。:

    assert_format :username, /^\w+$/

Remodel はそれ自身「最小のオブジェクト-redis マッパー」として定義され、簡単なマッピング戦略に使います。:
オブジェクトのすべてのプロパティは JSON ハッシュにシリアライズされ、単一キー配下に保存されます。

関連の扱いは異なっており、専ら — で扱われます。
関連の両端は別々のキーに保存されます。
`has_many` は Redis list を使い、関連オブジェクトのキーを保存し、
`has_one` は Redis string を使い単一の関連キーを保存します。
この手法は、どんなオブジェクトでも(デ)シリアライズすること無く、関連を変更できるという利点があります。

### 参照





----
追記
チェンジセット(57216e1)に合わせて変更

[翻訳]rediscookbook/3_object_level_interaction/introduction_to_storing_objects

### 問題

任意の Ruby オブジェクトを Redis に保存したい。

### 解法

どんなキー/値データベースでも、構造化するのにキーを使えます。:
ここでは Ruby を使った例ですが、原則どんなプログラミング言語でも利用できます。

    >> redis.set "event:42:name", "Redis Meetup"
    => "OK"

    >> redis.get "event:42:name"
    => "Redis Meetup"

同じ例ですが、今回はまず固有の ID を生成しています。:

    >> id = redis.incr "event"
    => 1

    >> redis.set "event:#{id}:name", "Redis Meetup"
    => "OK"

    >> redis.get "event:#{id}:name"
    => "Redis Meetup"

別解は、保存するときにデータをシリアライズして、検索するときにデコードすることです。:

    >> id = redis.incr "event"
    => 2

    >> redis.set "event:#{id}", {:name => "Redis Meetup"}.to_json
    => "OK"

    >> JSON.parse redis.get("event:#{id}")
    => {"name" => "Redis Meetup"}

最新バージョンの Redis で利用可能なもう1つの解は、新しいデータ Hash 型を使うことです。:

    >> id = redis.incr "event"
    => 3

    >> redis.hset "event:#{id}", "name", "Redis Meetup"
    => "OK"

    >> redis.hget "event:#{id}", "name"
    => "Redis Meetup"

お分かりのように、Redis は非常に柔軟で、情報を保存する最も良い戦略を決められます。

オブジェクト属性に基づくキー生成を自動化するいくつかのライブラリがあります。これらをチェックして使い方を学んでください。

* [DataMapper Adapter](http://github.com/whoahbot/dm-redis-adapter)
* [Ohm](http://ohm.keyvalue.org)
* [Redis Model](http://github.com/voloko/redis-model)
* [Redis Objects](http://github.com/nateware/redis-objects)
* [Remodel](http://github.com/tlossen/remodel)

### 参照

いろいろなライブラリを使った戦略のRuby のオプションを確認するには
 **オブジェクトを保存するために Ruby ライブラリを使う** をチェックアウトしてください。

[翻訳]rediscookbook/2_basic_commands/pipeline_multiple_commands

### 問題

単一のアトミックコマンドを使って、いくつかの Redis コマンドを実行したい。

### 解法

コマンドのキューを作成し、それらをアトミックに実行するには MULTI/EXEC コマンドを使います。
キューの開始には `MULTI` コマンドを使います。Redis は `OK` を返します。
それから各コマンドのキューを作ってください。最終的には、`EXEC` を使用してコマンドを実行します。
Redis は各コマンド毎にか返値と一緒に multi-bulk を返します。
この基本的な例で、3つの値をリストに追加し、'country-count' と呼ばれるキーを(3に)増加させ、
それからリストのすべての値の範囲を求めます。

必要なら、MULTI キュー と既存のキューをクリアするために DISCARD コマンドを使うことができます。

    redis> MULTI
    OK
    redis> LPUSH country_list france
    QUEUED
    redis> LPUSH country_list italy
    QUEUED
    redis> LPUSH country_list germany
    QUEUED
    redis> INCRBY country_count 3
    QUEUED
    redis> LRANGE country_list 0 -1
    QUEUED
    redis> EXEC
    1. (integer) 1
    2. (integer) 2
    3. (integer) 3
    4. (integer) 3
    5.
     1. germany
     2. italy
     3. france
   

### 検討

MULTI/EXEC (Redis 2.0 で追加予定)は Redis の非常に重要なコンポーネントで、多く語るに値します。
これが何をするのか、そして何をしないのか知ることはとても重要です。

M/E は次に述べるような意味で、「アトミック」です。
キューが実行されている間、他のクライアントが全く Redis サーバにアクセスできません
-- このキューは単一操作として扱われます。これはデータの完全性にとって重要です。

M/E プロセスは、コマンドがキューに追加されるときはいつでも、
構文エラーがあるとすぐに構文エラーを報告しながら実行するよう設計されています。例えば:

    redis> MULTI
    OK
    redis> LPUSH country_list italy
    QUEUED
    redis> LPUSH country_list italy germany
    Wrong number of arguments for 'lpush'


さて、 M/E は完全な「トランザクション」を提供 *しません*
-- 少なくとも常識的な意味では。-- 「ロールバック」の機能を含んでいないからです。
以下のような状況を考えてください。
比較的大きな M/E キュー(例えば、200個のコマンド)を作成して、EXEC を実行します。
すべての溜め込まれたコマンドが実行される前に、
(おそらくメモリを使い果たして)コマンド #148 でサーバがクラッシュしたとしましょう。
はじめの 148 個のコマンドは本当に実行されますが、残りは実行されません。

実際は、M/E では、EXEC コマンドが実行される *前* (つまり、溜め込み中)は 'すべてか無しか' 操作だけなのです。
-- 実行中はそうではありません。

Redis は問題に対処する興味深い方法を提供します。:馴染み深い追加のみファイルです。
Redis の次バージョンでは、キューのコマンド群は EXEC コマンドが完全に成功したときに AOF に書かれるだけです。
このため、万一サーバが中途半端な EXEC 状態でクラッシュしても、前の pre-EXEC 状態に従って状態を再構築できます。


### 参照

[翻訳]rediscookbook/2_basic_commands/get_and_delete

### 問題

Redis からオブジェクトをアトミックに GET し、 DELETE したい。

### 解法

    success = RENAME key key:tmp
    if success
      value = GET key:tmp
      DELETE key:tmp
      return value
    end

using `redis-cli`:

    >> SET TOTO 1
    OK
    >> GET TOTO
    1
    >> RENAME TOTO TOTO:TMP
    OK
    >> GET TOTO:TMP
    1
    >> DEL TOTO:TMP
    (integer) 1
  
    >> GET TOTO
    (nil)
    >> RENAME TOTO TOTO:TMP
    (error) ERR no such key   
### 検討

これは、簡単な例ですが、有効にRedisのアトミックな特徴を利用しています。RENAME 関数は最初に呼ばれた場合、成功し、その後呼ばれる場合はキーが変更されたので失敗するでしょう。GET と DEL は RENAME 関数のおかげで他のクライアントが操作しているオブジェクトデータを参照するのを防ぎます。(??)

### 参照




----
追記:
チェンジセット(57216e1)に合わせて修正

[翻訳]rediscookbook/2_basic_commands/empty_the_database

### 問題

Redis に既に保存されたすべてのキー(と関連する値)を削除したい。

### 解法

Redis の FLUSHALL コマンドを使用してください。

    $redis-cli flushall
    OK

### 検討

### 参照

[翻訳]rediscookbook/2_basic_commands/create_unique_ids

### 問題

あなたは、任意のオブジェクトに重複しない固有の ID を提供したい。

### 解法

Redis 組み込みのアトミックな INCR 関数を利用してください。

    $redis-cli INCR
    (interger) 1

    $redis-cli INCR
    (interger) 2

    $redis-cli GET
    1
       
    $redis-cli GET
    2
   
### 検討

固有の ID を提供する INCR を使うことは Redis の中心概念の1つです。しばしば「主キー」スタイルとしてリレーショナルデータベースで使われてきた同等な機能の代わりに使用されます。

固有のID を使うより多くの例は *Redis における Ruby オブジェクトの保存* を参照してください。

### 参照

[翻訳]rediscookbook/1_install_configure/install_with_make

### 問題

Linux や OS X や Posix 互換のオペレーティングシステムに Redis をインストールしたい。

### 解法

Redis は文字通り「設定いらず」です。最新の Redis [stable release](http://code.google.com/p/redis/) をダウンロードしてください。
tar を解凍し新しいディレクトリにファイルを作り、`cd` でそのディレクトリに入ってください。それから `make` 。 Redis はすぐにインストールされでふぉるのて設定を使って構成されます。`./redis-server` を実行するとサーバが動き出し、目的は達成です。

### 検討

Salvatore Sanfilippo は Redis の作者で、「設定いらず」でインストールすることに強いこだわりがあります。実際、Redis は全く依存関係がありません。「サーバからダウンロードしてmake するまで」どれくらい時間がかかったか計ると、たった 34 秒でした。

### 参照

[翻訳]rediscookbook/1_install_configure/install_with_installer

### 問題

以下のことをしたい:

* Linux や OS X や Posix 互換のオペレーティングシステムに Redis をインストールする。
* 標準レイアウトを使った設定でバイナリを配置する。
* root にインストールしたい場合は /etc/{init.d,rc.d}/redis にシステムコントロールスクリプトがある。
* 1つ以上のリモートホストにインストールする。
* *1つ* のコマンドを使って、ローカルにインストール可能であること。

### 解法

[redis-installer](http://github.com/wayneeseguin/redis-installer/) を使ってください。

1. localhost にインストールします:

まずは、redis-installer をダウンロードまたはクローンします。:

    git clone git://github.com/wayneeseguin/redis-installer/

次に、単に Redis をインストールします。:

    bin/install-redis

2. **1つ** のコマンドで localhost にインストールします。

"怠けてるのではなく、賢いんです!"

    bash < <(curl http://github.com/wayneeseguin/redis-installer/raw/master/bin/install-redis)

3. 複数のリモートホストにインストールします

まず、下記から redis-installer をダウンロードまたはクローンします。:

    git clone git://github.com/wayneeseguin/redis-installer/

次に、1つ以上のリモートホストに Redis をインストールします。

    bin/install-redis-on-hosts hostname1 [hostname2 [hostname3 ...]]

### 検討

インストールと設定で気をつけることは、 root としてインストールするかか user としてするかで異なります。 root では、/usr/local/ に、 user では~/.redis/ にインストールされる。

解法2は単に Redis インストーラスクリプトをダウンロードして、`bash` に直接実行コマンドを送んでいるだけです。

### 参照

2010-02-10

Libron Okayama Module 前回調査分を一部反映しました。

前回調査でTOSパターンに漏れていた瀬戸町を追加しました。

今回対応:
  • 瀬戸町図書館

本家で更新されていた 埼玉県和光市図書館 を参考に
  • 鏡野町立図書館
  • 勝央図書館
  • 奈義町立図書館
も対応予定でしたがまだ検索結果が取得できていません。
図書館サイトで WEB から検索すると cookie に何か保存されているところまでは確認できました。
(ブラウザからcookie削除すると結果が取得できなくなる。)

他方で検索したあとでなら、別サイトでも検索結果が取得できるのが不思議です。


岡山版インストール:
http://github.com/jasagiri/libron/raw/master/libron.user.js

本家:
http://libron.net/
http://github.com/champierre/libron

2010-02-04

TortoiseHG 0.9.3 試しました。

0.9系最後のリリースらしいので、現状確認のためダメ文字関連の追試を行いました。

結論としては、0.8.3以降同様 windows 環境限定ですが十分運用可能です。
感謝です。

■確認状況と対応
  •  リポジトリルート直下ではソ系(0x5c:バックスラッシュ)ダメ文字のファイル単位では追加(ADD)できない。 (フォルダは可能)
    • 案1:リポジトリルートフォルダに対して追加する。
    • 案2:リポジトリルート直下はフォルダのみにし、ファイルは置かない構成にする。 
  •  ソ系ダメ文字のフォルダやファイルはアイコンオーバーレイされない。
    •   :気にしない。 
  • 再現性が低いが画面上文字化けする場合がある。 (ログ表示のファイル名パターンの初回表示やPC初回起動時のソ系ダメ文字ファイルの追加)
    •   :気にしない
■インストール等
  1. TortoiseHG 本体 (bitbucket)インストール
  2. \cmenu_i18n\thg-cmenu-ja.reg を実行
  3. OS再起動
  4. リポジトリ作成
  5. \Mercurial.ini 修正
    1. 「[extensions]hgext.win32mbcs =」 を追加
  6. 動作確認(ファイル名・フォルダ名「ソ」でいろいろいじる)
■その他メモ

  • ポ系(0x7c:パイプ記号)ダメ文字は時期は不明ですが使えるようになってました。
■参考

2010-02-03

Libron Okayama Module 向けに図書館サイトの検索クエリ調査しました。

未確認サイトの検索クエリを調査しました。

[不具合]前回追加対応したサイトで貸し出し中等で取得できない場合にリンクが間違って全件取得してしまう場合がある。


動作確認
  • 矢掛町立図書館 
前回のTOSパターンと同一。
  • 岡山市立瀬戸町図書館(url=http://library.okayamaseto.jp/tosken.html)
他県例を参考にできそう。
  • 鏡野町立図書館
    • url=http://lib.town.kagamino.lg.jp/opac/wopc/pc/pages/SearchDetail.jsp?srv=
    • cookie?  javax.faces? isbn ある。埼玉県和光市図書館が同じっぽい。
  • 勝央図書館
    • url=http://lib.town.shoo.okayama.jp/opac/wopc/pc/pages/SearchDetail.jsp?srv=
    • cookie? javax.faces? isbn ある。埼玉県和光市図書館が同じっぽい。
  • 奈義町立図書館
    • url=http://lib.town.nagi.okayama.jp/opac/wopc/pc/pages/SearchDetail.jsp?srv=
    • cookie? javax.faces? isbn ある。埼玉県和光市図書館が同じっぽい。
独自ぽい。 
  • 笠岡市立図書館
    • url=http://www.lib.city.kasaoka.okayama.jp/tosho/kensaku/kensaku_w.php
    • query= tzn=1&SortKubun=1&TTL_Kubun=0&title-andor=and&title1=&title2=&title3=&author=&publisher=&keyword=&isbn=&year-from=&year-to=
    • isbnkey=isbn
    • 内部コード=TosCode
    • 利用可能判断=利用可能です。
  • 井原市立図書館 
    • url=http://iblibsv.ibara.ne.jp/cgi-bin/select?0 
    • query= type=0&allc=&page=1&keyword=&sentaku=and&title=&sentaku=and&author=&sentaku=or&publish=&sentaku=or&isbn=&pubydate1=&pubydate3=&bunrui=&syubetu=all&kan=all&media=all&count=10&order=publish&before=select&authorid=&opacfile=&titleid=&i1=&i2=
    • isbnkey=isbn
    • 内部コード=biblioid
    • 利用可能判断=利用可能です。
  • 浅口市立図書館
    • url=http://lib.city.asakuchi.lg.jp/iliswing/we/opac/kensaku.jsp
    • 不明
[保留]大学関連は一般人が利用しないし webcat 統一インタフェースがあるので対応見合わせ。
  • 岡山大学附属図書館
  • 岡山県立大学附属図書館
  • 岡山商科大学附属図書館
  • 岡山理科大学図書館
  • 新見公立短期大学附属図書館
  • 美作大学附属図書館

[未対応]ISBNが検索条件に無い。
  • 美咲町立図書館 
  • 高梁市立中央図書館 
[未対応]ISBNが条件にあるがデータ登録されていなそう。
  • 瀬戸内市図書館(室)




対応状況は下記のとおりです。

対応済み
  • 岡山県立図書館
  • 津山市立図書館
  • 総社市図書館
  • 赤磐市立図書館
  • 真庭市立図書館
  • 早島町立図書館
蔵書の検索はできるが、予約システムが提供されていない。(文言変更が必要)
  • 和気町立図書館
  • 金光図書館
蔵書の検索はできるが、貸し出し状況が取得できていない。(貸し出し状況処理変更が必要)
  • 玉野市立図書館
  • 新見市立哲西図書館
  • 備前市立図書館
  • 美作市立図書館
  • 里庄町立図書館
  • 久米南町図書館
  • 矢掛町立図書館
未対応(保留)
  • 岡山大学附属図書館
  • 岡山県立大学附属図書館
  • 岡山商科大学附属図書館
  • 岡山理科大学図書館
  • 新見公立短期大学附属図書館
  • 美作大学附属図書館
未対応(ISBNが無い)
  • 岡山県図書館横断検索
  • 岡山市立図書館
  • 倉敷市立図書館
  • 美咲町立図書館 
  • 瀬戸内市図書館(室)
  • 高梁市立中央図書館

2010-02-01

Libron Okayama Module 対応図書館を追加しました。

前回に引き続き、libron Okayama Module の対応図書館を追加しました。
 URLクエリがURLエンコードされているとサーバ側で処理できないというトンでも仕様がありました。
動けばいいんですしょうが、サポートの程度や技術力が知れてしまいますね。


岡山版インストール:
http://github.com/jasagiri/libron/raw/master/libron.user.js

本家:
http://libron.net/
http://github.com/champierre/libron


対応状況は下記のとおりです。



対応済み
  • 岡山県立図書館
今回対応
  • 津山市立図書館
  • 総社市図書館
  • 赤磐市立図書館
  • 真庭市立図書館
  • 早島町立図書館
蔵書の検索はできるが、予約システムが提供されていない。(文言変更が必要)
  • 和気町立図書館
  • 金光図書館
蔵書の検索はできるが、貸し出し状況が取得できていない。(貸し出し状況処理変更が必要)
  • 玉野市立図書館
  • 新見市立哲西図書館
  • 備前市立図書館
  • 美作市立図書館
  • 里庄町立図書館
  • 久米南町図書館 
対応済みのはずだが、サイトがダウンしてて確認できず。
  • 矢掛町立図書館
未対応(未確認)
  • 岡山市立瀬戸町図書館
  • 笠岡市立図書館
  • 井原市立図書館
  • 高梁市立中央図書館
  • 瀬戸内市図書館(室)
  • 浅口市立図書館
  • 鏡野町立図書館
  • 勝央図書館
  • 奈義町立図書館
  • 美咲町立図書館 
  • --
  • 岡山大学附属図書館
  • 岡山県立大学附属図書館
  • 岡山商科大学附属図書館
  • 岡山理科大学図書館
  • 新見公立短期大学附属図書館
  • 美作大学附属図書館
未対応(ISBNが無い)
  • 岡山県図書館横断検索
  • 岡山市立図書館
  • 倉敷市立図書館

2010-01-29

Libron Okayama Module 初回リリースしました。

Amazon.co.jp に最寄の図書館の蔵書状況を埋め込む greasemonkey スクリプト、
Libron」向けに岡山モジュールを作成中です。
イマイチ Fork がこれで正しいのか不安だ。

初回は岡山県立図書館のみの対応。
ぼちぼち追加するつもり。
出揃ったら pull request しようかと。

  岡山市立図書館はISBNコードで検索できない(><)ので後回しです。
...というか岡山統一感無さすぎて泣けます。

他県の情報が集まったらもう少しきれいに作れそうなので
一段落したら練習がてら Chrome Extensions に移植しようかな。

岡山版インストール:
http://github.com/jasagiri/libron/raw/master/libron.user.js

本家:
http://libron.net/
http://github.com/champierre/libron