Redisってなに?
Radius と Redis を間違えていて(発音的な意味で)、ちょっぴり恥ずかしい思いをしたのでちゃんと調べてみた。
数年前得たぼんやりとした知識では、Memcacheの代わりに使うこと増えたね。使うの? だったら Windows にインストール出来ないのでどっかサーバ立てましょうよ的な印象でした。VMでもいいんですけど、コマンド叩けないプログラマの環境を構築するのにこっちが面倒になるので Windows で簡単に入れられないのはサーバ作っちゃいましょってやってました。
今回ググってみたら今Windows版のRedisあるんですね。しかもマイクロソフト製… そういやKVS製品なかった。
https://github.com/MSOpenTech/Redis
Node.jsも気がついたらWindowsインストーラあったり、まだまだWindowsで開発頑張れそうです。
memcache vs redis
さて、Memcacheよりも速いよ、レプができて型あるよってくらいしか Redis のことを知らなかったので、「memcache vs redis」 でググったらまんまの内容が stackoverflow で見つかったので、拙い英語力で読んでみる。
http://stackoverflow.com/questions/10558465/memcache-vs-redis
+50されてるのが、詳しいんだけどなんかRedisに肩入れされてますね?
ベンチマーク結果をぐぐると単純にget/setした場合は、memcacheのほうが速いという記事のほうが多いです。
単純な分速いんだろうなぁ。永続性とか安定性とか速度以外にも必要なものはあるので、単純に速度比較のみで優劣を図るのは個人的にはちょっと違うと思う。
となるとRedisを使いたいときはどんな時だろう? 永続性とか安定性とかは運用してる人に聞くとして、使わなくてもわかる機能面をもうちょっと掘り下げる。
KVSとして、特徴
- データタイプがある
インクリメントできるんだ! これいいなぁ。memcacheだとトランザクションないからインクリメントで正確性を求めるなら使えないって感じだった。あ、…ファイルロックつかったような、気が…
あと、String, Lists, Sets, Hashes, Sorted Sets が使えるとのこと。 今までシリアライズしてAddして、取ってきてからアンシリアライズしてたのが、直接KVSにListsやらの形で格納できるのはいいなぁ。Setsなんか重複の考慮をKVSでやってくれる。
トランザクションできる
Pub/Subできる
ユーザ向けのアラートメッセージとかに使うと便利なのかも。
チャット的なので、誰々さんがINしました!的な軽いものなら合いそう。
- キーのリネームできる
すごいけどすごいけど便利だけど、使うの怖い↓
If newkey already exists it is overwritten.
単純にキャッシュとして使うには少しもったいない気がします。簡易DB的な使い方が向いてそう。SQLLiteっぽい? memcacheでやってたのをそのままRedisにしてもいいけど、使うと決めたならこのへんのクラスはリファクタリングしたいかな。
書籍も買えるけど、マンガががっつり買えるストアを探してみた
Kindle PaperWhiteが目が疲れないのでいいけれど、昔のコピーみたいな感じの描画なので漫画だとちょっとどうかなって思っています。 Kindleで買って別端末で読めばいいんですが、折角なので別のストア探してみました。漫画に特化したビューアやストアという点では国内ストアのほうが出版社がコンテンツの独自性を出せるのかなとか。
レビューも既にたくさんあるんですがあまりチェックをしていないので、ほぼ先入観はないまま、名前よく見るところをチェックしてます。 今回は使ってみないで、FAQからどんな感じかだけ。
尚、タイトル数は気にしてません。最近の新刊や話題書を読みたいという目的の場合、数はあてにならないので。早くリリースされるといいなぁと思うけれど、そこはストアよりも出版社のほうの問題のような気がする。
条件
- 購入した書籍はiPadとPCで閲覧したい。
- 購入した端末以外でも読める。
- マンガは当然充実していて、さらに小説本も買えるところ。
- すぐに終了しなさそう。
割と最後が重要。ストアがなくなったら読めなくなるって場合、読む権利に文庫本と同じ金額払うのはちょっと…と思ってしまいます。
BOOK☆WALKER
ラノベが充実してる印象のストア。 角川系列なので、すぐには終了しなさそうな印象。紙と同時販売したコンテンツもあるようです。
- iOS、Android、Windows、Mac環境対応
- ダウンロード済みならオフラインで読める
- ジャンルごとにRSS配信あり
- ポイント還元セールあり
- 他のストアで購入した書籍を閲覧できる 但し角川系列のみ
文芸書の方は、角川系列から出ている話題書はほぼ確実に入ってくるんじゃないでしょうか。あとは講談社の本がレーベル検索できます。 講談社はどこでも充実してる気がする。以前からかなり電子書籍には力を入れている印象です。
コミックスは秋田、角川系、新書館、スクエニ、講談社、リブレ。一迅社はスクエニ系列扱いでよいかな。
…あ、一ツ橋系ない… スーパーダッシュ文庫があるから集英社あるかと思ったら、コミックスにはない。
一つのアカウントで購入した書籍は最大7端末で閲覧できます。 よくある質問を読んだ感じ、端末間共有も同時にできそうに読めるけど実際どうなんだろう?
同じBOOK☆WALKERアカウントでログインしていただければ、書籍の共有が可能です(※各端末においてデー タのダウンロードが必要です)。 ▼端末間共有の方法 (1)画面下部[設定]→[ログイン/新規登録]でご利用中のアカウント情報を入力します。 (2)画面下部[書籍一覧]をタップすると、そのアカウントで購入した書籍が表示されます。 ※同一アカウントであっても、共有できる機器の台数には上限があります。上限を超え、端末認証の解除が 必要な場合はお問い合わせよりご連絡ください。
端末間同時共有できると個人的にポイント高いです。 同時に端末間共有ができると、読みたいときに既にDL済の端末から消してから、別の端末でDLし直すということをしなくて済みます。資料的なものだと困りませんか。いつでもどこでも読めるのが電子書籍の特徴のひとつであってほしいなぁ。
本棚という機能があるんですが、本棚に入れないと読めないということもないようです。フォルダみたいなものかな。好きなシリーズをそのシリーズの壁紙付の本棚に入れて眺めることもできそうです。
スタッフおすすめの特集は、二次元寄りが多いですね。いいですね。
あとiOS版とAndroid版、Webストア版でお値段が違ったりするみたいです。
iOS版の価格につきましては、Apple社が設定した価格帯に合わせる必要があり、柔軟な価格設定ができま せん。 一方、Android版・Webストアは、自由に設定することができるため、書籍によってiOS版とAndroid版・Web ストアで価格に差が出る場合があります。ご了承ください。
これって、iOS版で買わない方がお得ってこと? だったら、どこで買ってもデータ同期ができるので、買うのはPCで読むときはiPadにすればいいので、個人的には問題なし。たぶん買うのはPCになると思います。閲覧しやすいし。
BookLive!
TOPに文芸書とマンガとバランスよく配置されてる感じが、総合本屋さんという感じのストア。 凸版印刷グループで出資元も堅い企業が並んでいるので、ここもいきなりなくなる可能性が低そうです。端末が出てたので、何となく三省堂運営なのかと思ってましたが違うんですね。
- iOS、Android、Windows環境対応
- ポイント購入型
- ポイント還元セールあり
- 雑誌の定期購入制度あり
文芸書は十分なラインナップ。雑誌の充実が目立ちます。ビジネス書が多いというか、想定しているメイン層がBOOK☆WALKERよりもずっと高めに感じられます。サイトやバナーのデザインも…ええ、はい。
コミックスは死角なし。BOOK☆WALKERから一ツ橋系+ケータイコミック常連出版社を追加したような感じ。
ひとつのアカウントにつき端末登録は5台までです。この間まで3端末だったようで、さすがに3台は少ないですよね。個人的には5つあれば十分かなといったところ。
よくある質問を見ると、
ダウンロードが完了する前から閲覧が可能な作品は、都度、通信が必要です。通信が行える状態でご利用 ください。
とあるので、オフライン閲覧できるとは限らない感じなのかな。 .book形式の書籍はそういうの多いのかもしれません。
なんかこう、FAQを見てると、閲覧環境の安定性に不安を覚えます。エラーが出たときは、という項目が目立ちます。
BookLive!も本棚という仕組みを使っていますが、BOOK☆WALKERとは内容が少し異なるようです。BOOK☆WALKERの外部連携にBookLive!が含まれていたので、似たようなものではあるんでしょうけど、説明を見ていると購入したコンテンツはいったん本棚に移動させなくてはいけないようです。
保管>本棚>DL
というかたち。削除すると「保管」になり、これを「本棚」に移動してから、端末にDLする。 販売コンテンツに雑誌を含んでいるせいか、少し説明が複雑になっているような感じがします。雑誌関係ないかもしれないけど。
ここからは見てみたけれど、更に詳しく見る気になれなかったストアをいくつか。
紀伊國屋書店
コミックスが少ない。 BOOK☆WALKER+一部WJって感じでしょうか。ONEPEACEはカラーモノクロ揃ってる感じ。一般向けですね。
honto
一ツ橋系も扱っているので充実度は高いかと思われます。
電子書籍と紙の書籍の両方を扱っているせいか、電子書籍の詳細ページに紙の本へのリンクがあります。気づかず飛んだ先の紙の書籍の詳細ページが電子書籍版とあまり変わらないので、間違えてしまいそうです。 サイトレイアウト変えてほしいなぁ。色だけでもいいから。
eBookJaban
漫画では世界最大級をうたってるだけのことはあります。 コミックスはジャンルのページを見ると小学館、講談社、角川、秋田ほかが取扱い対象。ジャンルのところにはないですが、集英社もあります。
コンテンツ数は多いようですが、充実度は旧作が中心のようです。劇画系。 特集を見ても、双葉社とか原哲夫とか、アカギとか明日のジョーとか…。 文芸書というか、書籍の方もビジネス書、グラビア多めです。
ちょっと探しているところと違うかなぁ。
Amazon Kindle
Kindle以外で探していたけれど、一応状況を調べておきます。 ドリフ3巻までもう出てるんだ…。しかも紙よりちょっと安い。
改めて見るとコミックスのラインナップに不満はなかったです。 集英社、小学館、講談社、角川、スクエニはあります。白泉、秋田はなさそうな。
紙の本とKindle価格が併記されているのがわかりやすくて好きです。オススメ遷移も電子書籍だけのようです。
まとめ
色々乱立していて困るくらいかなと思っていたんですが、個人的には最初の2つ以外はちょっと、といった結果になりました。 とはいえ、会員登録して少し使ってみないと実際の良さも悪さもわからないので、遠くから見ての雑感です。
BOOK☆WALKERは、見た感じ使いやすそうで、よさそうなんですが、一ツ橋系がないのが痛い。 BookLive!はポイント購入型なのが嫌。
特定の出版社系列だから今後BOOK☆WALKERでジャンプ系とか読めないんだろうなぁ。週刊連載は巻数が恐ろしいことになるので、できたら電書で集めたいんだけれど。既に30巻超えしてるのとかどうにかしたいんだけど。きっと30巻超えるんだよね、と思うとなかなか手が出せないWJとかサンデーとか。
ところで、新潮社はパブリでしか配信しないつもりなのでしょうか。あそこは書籍のみだし、紙の本とお値段一緒なのでそれだったら素直に紙の本買うなぁ。
Playframework 2.1.0 をJavaで頑張った記録
試してみた上での結論。Javaで開発するのは修行僧。
2.1以降はScalaで組んだほうがいいです。というか、そういうつもりで開発していると思います。
Windows に Play 入れて動かす
参考)
http://www.atmarkit.co.jp/fjava/rensai4/play01/02.html
参考サイト見ながらではまらずできました。なので、以下はログみたいなもの。
Java7 と Play2.1.0 をDLしてインストール+展開。
$ java -version
で、パスが通ってなかったら、パスを通す。
$ javac
で、パスが通ってなかったら、 javac のいる場所にパスを通す。
$ cd C:\play-2.1.0\ $ play new firstProject
で、firstProject というプロジェクトを作って
$ cd firstProject $ play
したら、VMサイズ作れんと言われるので、
C:\play-2.1.0\framework\bulid.bat
のヒープサイズを小さくする。(メモリ4Gなのでとりあえず、-Xmx512Mで)
したら、再度 play して、run。
[firstProject]$ run
ブラウザで下記URLにアクセスして確認。 http://localhost:9000/
エラーがあったら、エラーが表示される。
コンパイルしてみる
参考) http://www.playframework.com/documentation/2.1.0/Production http://www.playframework.com/documentation/2.1.0/ProductionDist
日本語サイトもありますが、これをやっている時点で 2.1.0 の翻訳はなかったので本家サイトのほうで。 2.0系と地味に違うところもあるので、日本語サイトの通りやってみて動かなかったら本家を参考にするとよいです。
バックグランド起動するには、↓ってやる。 コンパイル済み過去ファイルを全部クリアして、ステージング環境作るよ!ってことらしい。
$ play clean compile stage
ステージ環境のコンパイル。 エラー吐きまくるけど、chmodに失敗してるだけっぽいからどうやら大丈夫っぽい。 生成された start ファイルはシェルなので、cygwin から起動したら動きます。 サイトでは、windowsだと駄目だよ!って書いてます。バッチファイル作ってくれない。
ちなみに、cygwinでは run は動きませんでした。scala 内でのPATHの取得で失敗してます。
デプロイは、
$ play -Dconfig.file=<本番用>/application.conf dist
上記コマンドで作ったZIPを解凍して、start 実行すればよいんじゃなかろうか。 それとも起動時にconf指定するほうがいいのか。 実務で使うのなら、warにしてJettyとかのが安心ですかね。
コンソールの文字化け
play 実行後のエラーメッセージが文字化けするのは、こちらの記事を参考に https://groups.google.com/forum/#!topic/play_ja/nWM60qRWqD0
set _JAVA_OPTIONS="-Dfile.encoding=SJIS"
の環境変数をjavac 実行前に追加してみたら直りました。
とりあえず play.bat の先頭に足して動かしてます。 実行されるたび、わーんわーん言われるけど気にしない。
JDBC つないでみる
参考) http://blog.livedoor.jp/kotaatsuyama/archives/51340114.html
Application.conf のdbのところをコメント戻して、driver, urlを書き換える。
db.default.driver=com.mysql.jdbc.Driver db.default.url="jdbc:mysql://<host>/<database_name>"
Bulid.scalaに追記。バージョンは最新 5.1.24 だったので、それで。
val appDependencies = Seq( // Add your project dependencies here, .... "mysql" % "mysql-connector-java" % "5.1.24" )
追記したので、ライブラリを再取得してもらいます。
[firstProject] update [firstProject] reload
update コマンドの後で、success って出たら成功です。
EBean で振り分けてみる
たとえば、master/slaveに分けるとして、リソースが複数の場合は、modelのパッケージは分けなきゃいけないと書いてあります。 結論からいうと別に一緒でも問題ないようです。Evolution使うときにちょっとおかしなことになったりしますが、SQLを自動生成させなければ大丈夫っぽいです。
Application.conf の
db.<resource_name>.driver
この項目で、<resourse_name>が違うのを2セット用意する。
ebean.<resourse_name>="<models_package>.*"
ここで、DBリソースに対してのパッケージを指定する。
階層は深いのは対応していないので、hoge. とかで用意します。 EbeanPlugin.java で、. 限定で見てます。ひどい。
batch起動
Javaでは簡単には無理でした。 DefaultApplication が、Application にキャストできないので、Application 拡張したクラス作らないと駄目のようです。
Scala だと Application のインスタンスを取れるので、動きました。
いったんコンパイルしてから実行になるけども
$ play dist
でできたファイルを展開して、
$ java -cp "./lib*" batch.PlayExcutor
ってしたら動きました。なんかこのやり方だと結局ライブラリ使いまわしにはできるけれど…的な感じ…。実際のところどうなんでしょう? StackOverflowでバッチできないのって質問に対して、Playでバッチする必要あるの?ってレスがついてたりしてましたけど。
ちなみに、Scalaだと、
Play.start(new DefaultApplication(new File("."), this.getClass().getClassLoader(), None, Mode.Dev))
で、フレームワーク直接起動できます。 本家のコードコピペしたのに動かなかった…。まさか () 足りないとか、ちょっとびっくり。
進んでるってなんだ
git は操作はコマンドでやって、全体の確認をツールで行ってるんですが、
$ git pull origin master * branch master -> FETCH_HEAD Already up-to-date.
これなのに、
$ git checkout master Switched to branch 'master' Your branch is ahead of 'origin/master' by 11 commits.
になってしまうときがあります。
グラフ上はローカルのほうが進みまくっててるように見えますが、pull しても、更新するものはありませんって言われている状態です。
この状態で、
$ git checkout -b test origin/master
なんかしてしまったら、グラフ上の origin/master から始まってて、新しいブランチでpush したとき、変な場所から分岐が始まっててとても困ります。mergeするときとか。
解決方法がないかなと調べてみたら、ここがヒットしました。
$ git pull origin
すると、おお! 全部のブランチ連れてきたw
もう一度グラフで見ると位置が
[master] [origin/master]
と同じところになってます。これ、これにしたかった!
$ git checkout master Switched to branch 'master'
よし、commit 進んでるよって言われない!
ローカルで master 確認するのに
$ git pull origin master
ってやってるのがダメなんでしょうか。ローカルになければいいわけで、都度削除してファイル消してみたりしてたんですが、それも面倒くさいです。
https://www.kernel.org/pub/software/scm/git/docs/git-pull.html
このマニュアル見ると、 git pull と、 git pull origin next は違う的な感じに読めます。
Update the remote-tracking branches for the repository you cloned from, then merge one of them into your current branch:
って、前者は update。
Merge into the current branch the remote branch next:
後者は merge。
$ git fetch origin master
って、update だって思ってたんですけど、自分が想っていたような更新という意味での update じゃないみたい。
個別で update ってできないんでしょうかね。
ローカルに連れてくるような使い方がそもそもgit的におかしいんでしょうか。んー、でもなぁ。
PHP使いがRubyを触ったとき
仕事でRailsを数ヶ月使ったので、覚え書き。色々思ったことはあったんだけど結構忘れてしまいました。
Railsの機能を殆ど使ってない気がするのでRubyだけで。CakePHPやってると違和感少ないこともないこともないかもしれないです。結構違うと思いました。
便利と思った点
each_with_index の存在
forの必要性を疑問に思ったほど。for 文では減算ループできないので(減算は downto を使う)。
PHPの foreach と違って、前のループで途中で出ていてもリセット不要でちゃんと先頭からループされる。素敵。
配列やハッシュに関しては回し方に色々な方法があるので、最初は「こうやればよかった!」と思うことが頻繁でした。
Array#map、Array#select
ダミーの変数を用意して入れ替えるとかそんなのが必要なくなる素敵! こういうふうにソースを綺麗にシンプルに書けるという点ではRuby凄いと思います。
return false if hoge.nil?
とかね。(変数hogeがnilだったらfalseを返す、という意味)
戸惑った点
for文の存在
最初は使っていたんですけど、減算できないと思って色々調べてみたらループ文が多種多様にありすぎて、この子の存在って一体…という気分に。
ただ、見知った構文があることで入門者へのハードルは低くなるので、なくなればいいとは思いません。
クラスの継承
Rubyではクラスの継承はあまりしないときいて、後で納得。
モジュール使えってことだと思います。Webアプリの場合は、きちんとしたクラスよりも共通関数群を用意してざっくりと書いてしまった方が開発効率がいいような気がするので、慣れてしまうと楽に感じました。
クラスメソッドのアクセス制限
publicとかprivateとか、宣言じゃないよ。メソッドだよ!
書いてしまったらそれ以降すべてそのアクセス制限になるので、関数ごとに書き換えても意味をなしません。最初わからなくてずっとはまってました。
個人的には private_class_method を使うほうがすっきりすると思います。