月曜日までに考えておきます

ITネタとゲームネタ中心に興味のあること色々書きます。

Google画像検索で画像保存するGem作ったけど・・・

キーワードを入れればGoogle画像検索で欲しい画像を引っ張ってきてくれるGemを作りました。

https://rubygems.org/gems/google_image_fetcher

クエリ入れれば画像をとってくれる

$ google_image search "艦これ 時雨”

これで

こうじゃ!

なぜ作ったか

テストとかしてて、会社PCのDLフォルダに有る数枚の画像を使い分けているだけだとバグとか見落としそうだし楽しくないので、 寿司の画像とか焼肉の画像とか検索してたんですがそもそもそんなの一気にガーッと取ってきたいじゃん、的なモチベーションで作りました。

が!!!

APIキーが要ります

APIキーが要ります

画像検索APIの実情

しかもGoogleの画像検索API、1日に100回までという制約があるんですよね。 この辺り、調べてみると画像検索系のAPIはかなりいろいろ厳しくなってるんですよね。

無料で使える画像検索APIとリクエスト数制限まとめ - Qiita

たしかに検索エンジンAPIは便利なので、無料(または定額)で無制限とかやったらビジネス活用でフルに使われて提供側が破綻しそうな気がします。 一定の限度を超えた使われ方をすると急激に運営側にとってコスト効果が悪くなるっていうこの辺りはオンラインストレージサービスなどと似ているのかもしれませんね。

有名なところでいうとNAVERまとめがGoogle画像検索できなくなったという出来事があるようです。あの規模で使われると厳しそうに思えますね。 それで考えると、課金力で検索できるBingはすごい良心的に思えます。

設定

APIキーの取り方

  • Google Developer Consoleに行く

https://console.developers.google.com

  • ここでAPIを有効にする

  • Custom Search API

  • 有効にして認証情報からAPIキーを取得

カスタム検索も作る必要がある

Googleカスタム検索へ

https://cse.google.co.jp/

新規に検索エンジンを作り、以下のように設定

  • 画像検索を「オン」にする
  • 「検索するサイト」は絞らない
  • 検索エンジンID」を取得する

と言った設定を行う必要があります。

APIキーと検索エンジンIDを環境変数

export GOOGLE_API_KEY={your_api_key}
export SEARCH_ENGINE_ID={your_seach_engine_id}

みたいに取得した値を入れてください。

これでようやく

$ google_image search "艦これ 時雨”

ができます(ヽ'ω`)

まとめ

Gemで解決している以上にやらないといけないことがイロイロあるね・・・

Slackの絵文字を変更すると世界(観)が変わる

Slack便利ですよね。

仕事でもプライベートでもSlackを使っている人も多いと思います。 今日はその中でも絵文字の設定について説明したいと思います。

絵文字の設定は変えられる

Slackの起動直後は絵文字がこんな感じになっていると思います。

これを設定画面から変更することが可能なんですね。

Slack画面の左上のチーム名をクリックして、 Preferences > Messages & Media でこのような設定画面を出すことができます。

Noneを除くと、4つの選択肢があるわけですね。

デフォルトサンプルの4つの中にunko入れてるSlackのセンスすごいなぁと思います。

さて、ここにあるサンプル以外のアイコンでの雰囲気を見てみましょう。謝罪にも感謝にも使える便利アイコンのみんな大好き:bow:だと

Apple/International

Google Hangouts

Twitter

Emoji One

となっています。で、この中で明らかに変な奴が一人いますよね。

こいつは一体何なんでしょうか。

Google Hangouts Styleの黄色い人

このイエローマン、他の絵文字でも特徴的でだいたいこんな感じです。

癒し系ゆるキャラ感がありますね。

Dancerとか、Appleがこれなのに対して

こんなですよ。ふなっしーかよ。

:ok_woman:のイエローマンedition

「OKに見えない」「頭抱えている」「/(^o^)\」とか言われている :ok_woman:さん

これもOKに見えます。そう、Google Hangouts Styleならね。

どこからどう見てもOKですね。むしろwoman要素どこ行った。

まとめ

みなさんもEmoji Styleを変えてみてSlack生活にちょっとした変化をもたらしてみてください。

モンハンクロスの進捗

11月下旬に発売して3ヶ月ぐらいやりこんでいたモンハンクロスですが、そろそろやめそうなので進めたところまで書きます。

プレイ時間とHR

300時間弱、と言ってもあと3時間は遊ぶだろうから300時間は超えると思います。前作4Gは150時間ぐらいでお腹いっぱいになったので、今作はだいぶ遊べたと思います。

使用武器

片手剣大好きなのですが、今作は片手剣忙しさの割に報われないとかエリアル/ブシドーやってみたいのに弱いとかあったので、途中から双剣に切り替えて遊んでました。強走薬飲んで高火力叩きだしていればパーティー貢献できるので楽しかったです。

勲章

97%まで進めました。

残りはネコ5匹LV50と金冠2種です。

ネコ5匹LV50は3匹までは済で、レベル10隻眼ガルルガを猫部屋で5分針で終わってほぼ1上がります。そして上げるための貫通/巨大/ブーメラン得意を持ったネコをLV40が1匹、LV30が1匹という状態なのでこれはやると思います。

金冠は、同じこと繰り返し&運が絡むというのが苦手なので、毎日少しずつやろうとして途中で飽きるパターンかなぁと思います。

次何やるの

最近出たのだといけにえと雪のセツナ、スト5あたり気になってるのですが、セツナは評判割と良さそうですがキャチコピーが気に入らない(スクエニがそれ言うな)、スト5は評判良くないのでとりあえずスルーかなぁと。買って序盤で止まっていた Fallout4 やってます。

来月はVITAのミクさん新作やると思います。

RailsとJavascriptのレンダリングわからん

Railsのサーバサイドだけで解決している編

Railsで例えばこういうデータがあったとして、

positive_phrasesテーブル

text
頑張る人は報われる
ここで諦めちゃダメだ
君ならやれる
さあ、もう一度トライしよう

view側でこの文言を装飾したいとすると、

- @positive_phrases.each do |positive_phrase|
  tr
    td
      = in_social_game_context(positive_phrase.text)
def in_social_game_context(text)
  "#{text} ※ソーシャルゲームのガチャの話です"
end

こういうヘルパーを作ったら、以下のような表示がされます。

ここまでは楽勝ですね。

Javascript

より良いUXのためにデータをページ遷移無しで追加/更新できるようにするとか、コンテンツ量が多い時のpagenationを「次へ」ボタンを押させるのではなく、スクロールに応じて動的に追加していく(いわゆる無限スクロールってやつですね)などの要求が出てくるケースはよくあると思います。

そういうことをやろうとすると、JavascriptAPIをコールしてJSONで値を取得して要素を追加するというやり方になりますよね。 例えばこういう感じに。

positive_phrases/index.html.slim

input#new-phrase type="text"
button#submit-by-jquery
  | Create Phrase by jQuery

positive_phrases.coffee

  $("#submit-by-jquery").on("click", ->
    $.ajax(
      type: "POST"
      url: "/positive_phrases.json"
      data:
        positive_phrase:
          text:$("#new-phrase").val()
      success: (data) ->
        $("<tr><td>#{data.text}</td></tr>").appendTo($("#tbody"))
        #$("<tr><td>#{in_social_game_context(data.text)}</td></tr>").appendTo($("#tbody"))
      error: (a, b, c) ->
        alert("error")
      dataType: "json"
    )
  )

これで取得してきたJSONをHTMLに追加しようとした時に、Javascriptからin_social_game_contextというRailsのhelperは呼べないんですよね。

$("<tr><td>#{data.text}</td></tr>").appendTo($("#tbody"))
#$("<tr><td>#{in_social_game_context(data.text)}</td></tr>").appendTo($("#tbody"))  => これが呼べない

RailsJavascriptでダブルメンテという問題

まあこれぐらいならJavascript側でも"※ソーシャルゲームのガチャの話です"って追加してやるだけで解決するわけですが、以下のような二つの問題が生じます。

1つ目の問題

その後の仕様変更で「※ソーシャルゲームのガチャの話です」を「※ただしイケメンに限る」に変えましょう、という話になりました。

そういうときにRails側だけ変更して、Javascript側は「※ソーシャルゲームのガチャの話です」になったままで、いっけなーいって気づくようなことってよくあると思います。2重メンテを担保し続けるのはハード。

  inSocialGameContext = (text) ->
    "#{text} ※ソーシャルゲームのガチャの話です"
    
  ...
        success: (data) ->
        $("<tr><td>#{inSocialGameContext(data.text)}</td></tr>").appendTo($("#tbody"))
  ...

JS側で同じようなメソッドを作って呼んでやるが、仕様変更の対応を忘れて片方だけ直した、みたいになっていると

(Rails側のView)

            = but_only_handsome(positive_phrase.text)

JSで取得した部分だけ違う表示になってしまう。

2つ目の問題

片方を修正忘れする問題の以前に、Viewに書くhelperやdecoratorはこの例よりももっと複雑なケースが多いと思います。

特にRailsだと便利なGemで表示フォーマットを1メソッド呼ぶだけで複雑な整形を容易に実現している、というケースがあって、Javascriptだとそれを自前で実装しないといけないというケースは多いんじゃないかなと。

RailsJavascriptの両方で同じ表示テンプレートを用意してやるのが手間ですね。

と言っても

ダブルメンテつらいけどやるしかないのか?と思っているのが現状。

他に考えられる案を挙げて見ると、

  • JavascriptによるリッチなUXなんてやめましょう

=> それが本質的な解決策ならいいですが、そうじゃないケースが多いはず

=> レンダリングのテンプレート組み立ては一箇所で済むのですが、Javascriptだと表示してから描画されることになるのでSEO評価されない可能性がありそう(※)です。これまた受け入れてもらえないケースが多そうですね。

(※)そこでReactのサーバーサイドレンダリングですよ、的な話はちょっと脱線するのであえて触れません

そうなると、Railsでのレンダリング、JSでのレンダリングの両方やらなきゃいけないのがつらいところなのかなと。

remote: trueとjs.erbを使うという手段もありますが、こちらは以下のような問題があるのかなあと思っています。

  • formでしか使えない(?)
    • 今回の例で言うとアイテムの追加には対応できるけど、無限スクロールでの要素追加なんかには対応できなさそう
  • レンダリングしたDOMをHTMLに挿入する、という仕組みはjQueryではないちゃんとしたJSフレームワークとは相性が悪そう
    • vue.jsにModel管理させて、あとはtemplateで描画してほしいねん・・・

この辺り、皆さんどうやってうまく解決しているのか気になるところですね。

職場近くの図書館を利用したら捗った

週に一冊ぐらいのペースで読書したかったんですが、本代が掛かるなぁと思って図書館で借りることにしました。

利用可能な図書館

図書館って住んでいる自治体だけではなく、通勤/通学先のエリアの図書館も利用できるというケースが多いみたいですね。 ぼくは渋谷に勤務していて、渋谷区の図書館はそうでした。

渋谷駅からちょっと離れた位置ですが、職場から徒歩圏内に図書館があったのでそちらに行ってみて、あっさり図書カード作れました。

自分の住んでいる自治体だと最寄り駅にはなくて、1つ隣の駅に行く必要がありました。それだと借りるときはまあいいとしても返す時とか、だんだん行くのつらくなるんですよね。図書館、スポーツジム、レンタルビデオなんかの店は最寄り駅にないと行かなくなるなぁというのを実感しました。

ネット予約

最近の図書館ってWeb上で検索、ネット予約、最寄り図書館にお届けまでやってくれるようです。 ぼくがこれまでに住んだ大田区横浜市と今務めている渋谷区でそうなっているので割と当たり前になっているのかもしれません。

流行りのWebサービスほどUIがイケてないとかありますが、図書館の検索と予約ぐらいであれば充分できるかと思います。

人気の本は100人以上待ちとかになっていることも多いのですが、専門的な本や一昔前の人気書とかであれば借りやすいと思います。

まとめ

図書館、自分の居住地または通勤/通学先に無いかを調べて、Web予約で借りたいものを借りると捗ると思います。

PS4「ドラゴンクエストビルダーズ」クリアしました

木曜日に発売された「ドラゴンクエストビルダーズ」、早速やりこんで今日クリアしたのでまとめです。 主なゲーム内容は体験版の記事(ドラゴンクエストビルダーズの体験版やってみた - 月曜日までに考えておきます)で書いたので、クリアまで進めて良かったところと悪かったところまとめます。

良かった点

  • ストーリーや演出

主人公の正体とか1の勇者はどうなったのかとか竜王の目的とか、そのあたりがストーリー上すぐに明かされなくて気になってプレイしちゃいましたね。 各章ごとの展開もドラクエにしては結構大人向けというかショッキングな描写あって面白かったです。とくに2章とか。

各章ごとにアイテムや能力値が引き継がれないのですが、新しい章ではまた違ったルールで遊べる感じで、前章で慣れた経験を活かしつつ応用して遊ぶのが面白かったですね。特に終章序盤の展開は絶望感強くてすごい引きこまれました。

それぞれの町の住人が個性的で面白かったです。全体的に主人公含め毒舌な人が多い気がしました。おっさんだけじゃなくてかわいい女性キャラも含め。 戦闘しなさそうな女性キャラが防衛時に一緒に戦ってくれて結構強いとかのギャップも面白かったです。

  • モンスターの攻め方に応じて街づくりするの楽しい

防衛戦で何も対策してないと街がガンガン潰されてしまうので、それに応じて防衛できるまちづくり考えるの楽しかったですね。 特に目的意識を持たずにエディットするっての苦手なので、「こういうふうに敵が攻めてくるのでそれに備えた壁や地形を作る」と目的を与えられると作ってて楽しいですし、さらにそこから見た目も整えようというモチベーションも湧いてきて気付いたら長時間プレイしてしまいました。

イマイチだった点

チャレンジ目標というのがあり、これを満たすとフリーモードで使えるアイテムが増えたりトロフィーがもらえたりするのですが、これの条件の1つに「◯日以内にクリア」というのが各章にあるんですよね。

章ごとの街を極限まで自分の好きなようににビルドして遊びたいのに、これのせいで急ぎクリアしないとダメになっているのはゲーム性を損ねている気がしました。 基本はセーブデータ二つ作って、片方はろくにビルドせずにストーリーすすめる感じでやるのが正解なんでしょうか。

  • 基本的に囲わないときつい、ゴーストの夜襲とか

街の周りを2ブロック、普通のモンスターには壊されない強度で一周ぐるっと囲って扉で出入りするようなまちづくりをしないと、モンスターの襲撃で街の中が壊されまくることになります。街の中に入れてしまった時点で主人公の攻撃でも街の施設が壊れてしまうので、基本的に中に入れないのが正解なんですよね。

第1章のメルキドは元城塞都市ですし、ストーリーも防壁やトラップを作っていくことになるので、街をグルっと囲って罠で対策でいいんですが、以降の街も全部そういうつくりをしないと正直しんどいというのがありますね。そういう点で、あまり自由度がなくなってしまっている気がします。もうちょっとオープンに作りたかったんですが、まあモンスターの襲撃に備えながら復興している設定なのでしかたないのかな。

あまりにもうざいのが夜襲してくるゴーストで、これは襲撃イベントとかではなく毎夜頻繁に来ます。しかもこいつらはワープしてくるので囲ってても中に入ってくるんですよね。そしてそれなりに強いという。

夜になったらさっさと寝ろということかもしれませんが、前述の日数制限を考えると昼間は探索して夜間にクラフトすることになるので、こいつらにはイライラさせられました。

  • 複数まとめて作れない

これはゲームコンセプト的なものじゃなく単純に不便なだけなので、パッチとかで修正されないかな、と思っていることなんですが。 アイテムを作る時に、「1セット作るか、作れる限界まで作る」のどちらかしかないんですよね。3セット作るとかができないのです。作れる限界まで作ってしまうと、例えば石炭やふとい枝なんかはいろんなアイテムを作る時に必要になるので、それらのアイテムが枯渇することになります。そしてこれらを必要とするアイテムこそ3〜5セットぐらい欲しい、ということが多いので、1個作る、を複数回繰り返すことになります。

これテストプレイとかでも絶対意見出ただろうにどうしてこうなっちゃったんですかねぇ…

  • 倉庫のページを意識しないといけない

これまた挙動おかしいやろ系。

大倉庫というアイテムを預けられるものが手に入るのですが、アイテム枠の1ページ目と2ページ目がありどちらも入れられるアイテムに制限などありません。 それなのに、1ページ目がいっぱいになると次に入れようとしたときに「アイテムがいっぱいです」と言われて、わざわざ2ページ目に切り替えて入れないとエラーが出ます。2ページ目に入れてソートしたら1ページ目のアイテムと合わせてソート/マージされるので両ページのアイテム認識されているだろうに、どうしてこんな実装になっているんでしょう…

  • 設計図が障害物あると敷けない

これも不便だった系。 設計図を既存の壁を利用して作ろうとすると設計図を敷く段階で障害物があります、と言われて設計図が敷けません。 わざわざ後で再度使う予定の壁を壊してから設計図を置かないとダメなんですよね。 別に異なるアイテムが置かれていたら設計図の内容が成立しないだけなので設計図は敷かせてくれてもよかったんじゃあ、と思いました。

  • クリアしたあとにそこの街をさらに発展させ続けるゲームしたかった、フリーモードとか

章ごとのストーリーや登場人物が魅力的すぎて次のステージに行くのが惜しいのともっとその街を発展させたかったというのを感じます。 日数制限はタイムアタックだけの話なので引き続き遊ぶことはできるのですが、終章とか終章クリア後に全アイテム使える状態で各街を回るとか、フリーモードで各街の登場人物がやってくるとかしてくれたらなぁ、と思いました。

まとめ

イマイチだった点を結構長く書いてますが、自分的には大変満足できました。というかまだまだ遊び足りないので、各章のチャレンジ達成&トロフィーコンプ、フリーモード飽きるまで遊んでみるつもりです。

想像以上に世界観や話がドラクエとしてしっかりしていますし、ゲーム性も面白いのでぜひ遊んで欲しい一作です。

ドラゴンクエストビルダーズの体験版やってみた

来週の木曜日(1/28)発売予定の「ドラゴンクエストビルダーズ アレフガルドを復活せよ」の体験版が金曜日にPS4, PS VITA向けに配信されたので早速やってみました。

なお、体験版は配信されていないですがPS3でも出ます。

どんなゲーム?

割と当初からマインクラフトのパクリだ、的なこと言われてましたが、その想像はそんなに間違ってなくてマインクラフトのようにブロックを掘って入手して、それを元に別の建物を立てるというゲームです。2Dで同じジャンルの「テラリア」とも似ていますね。

マインクラフト的じゃない部分

シナリオ内でシステムを覚えさせていくしくみがすごく丁寧で、ここはドラクエ的な良さがありますね。テラリアやマインクラフトでも一応チュートリアルはあるものの、プレイヤー置いてけぼり感あったので、この辺はさすがにドラクエだなぁという印象でした。

逆に、序盤と言うか体験版の範囲はずっとおつかいの繰り返しなので、自由に作りたい人には向かないかもしれないですね。

操作性とか画面とか

グラフィックはマインクラフトと比べると相当きれいで、視点もかなり引き気味のTPSなので見渡しやすくていいですね。操作性も良いです。

キャラクターも主人公、村人、モンスターたちそれぞれドラクエの親しみやすいグラフィックで良いですね。

音楽

ドラクエシリーズの音楽、ドラクエヒーローズ星のドラゴンクエストのような亜流の作品で過去作の名曲があまりマッチしないシーンで使いまわされているの好きじゃないんですが、この作品はアレフガルドが舞台なのでフィールドの曲がアレフガルドの曲なのマッチしてていいですね。

夜になったらダンジョンの曲が流れてました。これまた不気味な感じで良いです。。ただ、街の曲はDQ4の曲が使われてますね。最後のほうで使われたりするんでしょうか。

PS4版かVITA版か

どちらのハードも持っているので、両方の体験版を遊んでみました。

当たり前といえば当たり前ですが、VITA版の方がややグラフィック劣化、フレームレート低くて、何より目が疲れる感じがしました。といっても、どこでも遊べるというのは魅力だと思います。

自分はPS4版を買おうと思います。

まとめ

1/28の発売楽しみです!