Wakotech Blog

ポエム

VPNとかリモートデスクトップとかでどうにか艦これをスマホでやろうとしたけど結局Win8タブが無難だった

現在8インチのWindows8.1タブレットであるMiix 2 8を持っていますが、電子書籍リーダーとしての性能が微妙である(Perfect Viewer(Androidアプリ)に匹敵するほど使いやすい優秀なリーダーアプリが見つからない)こと、8インチなので映像コンテンツを楽しんだり電子書籍を読むのには少し小さいこと、そしてなによりjubeatReflec beat等の音ゲーができないため、10インチ級で音ゲーができるタブレットとしてどちらかが欲しいなー、と。
私は音ゲーマーの端くれかつガジェオタの端くれでもあるので、iPad AirXperia Z2 Tabletなどがとても欲しいと思っています。

特にKDDI版のiPad Airの場合Wi-Fi版と同じ価格で購入できる上にKDDIの4Gスマートフォンを使用していれば月額が900円を切る(iPad Airを本体一括で購入した場合)のでiPad Airの購入は非常に検討しているのです。が、せっかく買うのならば他のことをしたい(具体的には艦これができればいいのですが)と思い、VPN艦これをやることについて色々調べてみました。


・Splashtopを使う(200円/月)
お金がかかりますが外部から接続できます。VPNを構築すれば0円でできるみたい?(よくわからない)
Splashtopの問題点としてはPCを点けっぱなしにしないといけないらしいです。

OpenVPNで自分でがんばる(0円)
知識がないと難しいようですが自分でVPNを構築して繋ぐそうです。セキュリティに自信がないので素人がVPNを使うのは怖いのでとりあえず保留。

・スマートサーブを使ってVPNを構築してリモートデスクトップをする(300円/月)
VPNを構築した上でリモートデスクトップを使用することでリモートデスクトップアプリ側の料金をかけないで使えるそうです。セキュリティは大丈夫らしいのですが、本来の用途ではほかの家電にも直接接続できることを生かした使い方をするようなので、艦これのためだけに300円は高いのかも?


というわけで、とりあえずVPNを使うにしろなんにしろまずはLAN内でリモートデスクトップをしてみようと。SplashtopとPocketCloudというものを試してみました、が、
メインマシンのディスプレイが2枚なせいか、どちらも非常にカクカクでした。ウィンドウを限定してリモート接続するとかいうオプションがあれば……と思い、あきらめることに。また今度色々調べて試してみようと思います。

結果的に、VPNの構築をしないままあきらめて、艦これを外でやりたければWin8タブが快適というところに落ち着きました。(4月末のアップデート以降Atom Z3740でも起動時に止まらず、通信も快適に行われるようになりましたし。)
となると問題は電子書籍なんですが、色々探し回った結果、とりあえず有料ですがPico Viewerといううのが使いやすいので使っています。しばらくこれでがんばります。


よくわからないまま下手なことするなら既製品を使った方が楽というお話とiPad Airの紹介でした。

RubyでTwitterにStreaming接続してbotを作ってるお話

Twitterでリマインダをするのが一番楽なのではないかと思いRubyのTwitterGemを使いbotを作りはじめました。
とりあえず今回はRubyTwitterに接続するお話を、前回の短すぎる内容ではなく、調べながら理解したことを踏まえて書いていきます。

# twitter-reminder.rb

require 'twitter'
require 'yaml'

def connect_twitter
  keys = YAML.load_file('./config.yml')
  @client = Twitter::Streaming::Client.new do |config|
    config.consumer_key = keys['twitter']['consumer_key']
    config.consumer_secret = keys['twitter']['consumer_secret']
    config.access_token = keys['twitter']['access_token']
    config.access_token_secret = keys['twitter']['access_token_secret']
  end

  @rest_client = Twitter::REST::Client.new do |config|
    config.consumer_key = keys['twitter']['consumer_key']
    config.consumer_secret = keys['twitter']['consumer_secret']
    config.access_token = keys['twitter']['access_token']
    config.access_token_secret = keys['twitter']['access_token_secret']
  end

  @user_screen_name = @rest_client.user.name
end

def stream
  @client.user do |status|
    if status.is_a?(Twitter::Tweet)
      puts "#{status.user.name} (#{status.user.screen_name})"
      puts status.text
      puts '---'
    end
  end
end

def tweet
  @rest_client.update(ARGV[0])
end

connect_twitter
unless ARVG[0]
  stream
else
  update
end

consumer_key等の情報は利便性を考え別ファイルにyamlとして記述します。

# config.yml
twitter:
  consumer_key: "YOUR_CONSUMER_KEY"
  consumer_secret: "YOUR_CONSUMER_SECRET"
  access_token: "YOUR_ACCESS_TOKEN"
  access_token: "YOUR_ACCESS_TOKEN_SECRET"

consumer_key等の取得は、Twitter Developersから新規アプリを登録し、その中のAPI keysにある情報を記述してください。また投稿やDMを使用するため、Permissions内のRead, Write and Access direct messagesにチェックを入れてください。

まず最初にconnect_twitterTwitterに接続します。ここでは自分自身のアクセストークンを記録し、自分自身のアカウントの情報にアクセスできるようにします。
Twitter::Streaming::ClientクラスではStreaming APIを操作できるのですが、こちらからは投稿やユーザ情報の取得ができないため、REST API操作用のTwitter::REST::Clientクラスのインスタンスも生成します。
引数がある場合はtweetメソッドを呼び引数の値をツイート、ない場合は自分のタイムラインをストリーミングする、というコードにしています。
Twitter::REST::Clientクラスのupdateメソッドでは引数をそのままツイートします。
Twitter::Streaming::Clientのuserメソッドでは、Streaming APIと繋ぎっぱなしにし、認証ユーザのタイムラインをストリーミングします。
流れてきたstatusがTwitter::Tweet型である場合のみそのツイートを表示するようにしました。ここではuserメソッドtextメソッドを使ってツイートの詳細を取得しています。

ここからリマインダとしては、ツイートの発言者(status.user.screen_name)とリプライ先(status.in_reply_to_screen_name)が自分(@user_screen_name)と同じだった場合にリマインダであると判断し、細かい条件分けにかけていく感じです。(多分status.textに対して正規表現使うより処理が早そう。)

という感じでTwitterbotを作るのはこんな感じです。すぐ出来ると思うので試してみてください。(なかなかしっくりくる記事がなかった(updateだけどかstreamingだけとか)のでがんばって書いたつもりです。)
リマインダの部分は長いのとまだコードをきれいにしているところなので2回に分けて次回書きます。

Rubyでtwitter gemを使ってTwitterに接続してツイートした

RubyTwitterを使ったリマインダーbotを作りたいとずっと思っていたのでようやく着手しようととりあえずTwitterに接続してみました。

require 'twitter'
@client = Twitter::REST::Client.new do |config|
  config.consumer_key = "CONSUMER_KEY"
  config.consumer_secret = "CONSUMER_SECRET"
  config.access_token = "ACCESS_TOKEN"
  config.access_token_secret = "ACCESS_SECRET"
 end
@client.update 'Hello Wakotsu Bot.'

twitter gemを使うのでrequireします。が、まずそのまえにgemをインストールしていない場合はしましょう。

$ gem install twitter

次にTwitter Developersからbot用にアプリケーション作成を行います。右上のメニューからMy ApplicationsからCreate New Appで作成します。必須項目を入力すると作成されますので、色々見てみましょう。
botではツイートをするため、権限を設定します。Permissions->Accessで、Read onlyから他のものに変更しましょう。ここではDMを使用することを考えRead, Write and Access direct messagesにチェックを入れました。
コード中にあるCONSUMER_KEY等はAPI_KeysもしくはTest OAuthから確認できます。API key/secretがCONSUMER_KEY/CONSUMER_SECRETに該当します。わかりにくいですね……。
なおPermissionを変更したらキー等も再生成しなければならないそうです。

というかんじで@clientを宣言し、updateメソッドを使用してツイートしてみました。おそらくこの通りにやればできると思います。

結構古い情報が多くて公式の英語ドキュメントを読まないといけなさそうなので結構骨が折れそうです。とくにRESTの部分など以前とは違う仕様なようなので。
毎回開発を進めるたびにメモとして書いていきます。

初めてのPythonをはじめた話と電子書籍(PDF)リーダーのお話

オラコレiOS版リリース記念でEbook18タイトルが50%オフ!(現在は終了しています)で有名な本が半額セールだったので、Kindle以外の電子書籍をはじめて購入しました。
今回は特に重さが尋常じゃない「JavaScript」と「初めてのPython」を電子版で購入しました。初めてのPythonは800ページ超で1.3kgもあり、Macbook Airとほぼ変わらない重さという、持ち運ぶには非常に不便そうなサイズなので、紙にこだわる自分もさすがに迷わず電子版を購入しました。
PDFでのダウンロードなのでPCでもスマートフォンでも閲覧することができますが、標準のリーダーではやはり書籍として読むには使いにくい、というわけで、色々試した結果としておすすめのリーダーについて少し書きます。

まずAndroidでは、間違いなく「Perfect Viewer」が最適解であると思います。幅調整や中心地点調整、ページング操作調整など幅広くカスタマイズできるため、他のリーダーとは段違いの使いやすさです。なおPDFの表示にはPDFプラグインを追加でインストールする必要があります。
私はGALAXY Note2で閲覧していますが、操作性は抜群です。3:4書籍であっても縦表示の場合は縦サイズにあわせて見やすくしたり、画面右側タップでページングできるようにしたり。横表示の場合もスクロールアクションをタッチ操作に割り当てることができるので、非常に快適です。
ただ、電子書籍リーダーとして購入するのであればフルHD以上である方が好ましいです。HDでも読めますが多少荒い部分があります。それと当然画面サイズは大きい方が見やすいです。5.5インチでは現状読めていますが、小型機種だと厳しいかも……Nexus7(2013)がちょうどよさそうですね。

次にWindows8ですが、こちらはなかなかまともなアプリが見つからず困りました。標準のリーダーは非常に使いにくいです。
今現在使っているのはDrawboard PDF、有料アプリですが今のところ一番使いやすいと感じていますが、それでもやはりAndroidのPerfect Viewerの方が格段に使いやすいです。そういった部分でやはりまだまだAndroid優勢だなーとは感じますね。
一応もともとは編集用アプリなのでそういった用途にも使えますし、無料で2週間試せるので、Windows8ユーザのみなさんは一度使ってみてはどうでしょうか。

iPadについては私が所有していないのですが、評判を聞く限りだと微妙そうですね……。
ちなみにタブレットスタンドはAnkerのコレを注文しました(まだ届いていない)。しばらく記事を書いていなかったのでこれのレビューも書きたいです。

という感じでtechblogとかいっているのに技術的じゃない話になってしまいました。みなさんも重たいO'Reilly本を持ち歩かないで済むように快適な電子書籍ライフを送りましょう。
ちなみにセールは終わってますが、「初めてのPHP, MySQL, JavaScript&CSS」は個人的にphpあたりをまとめてやるのにはよかったのでおすすめです。

kaminariを使ってajax通信でページ送りを実装しました

去年から作っているWakotsu Animation(http://wakolab.info/an/)ですが、先日Gehirn RS2に移行したのに伴いデータを移行しました。
以前はそのまんまScaffoldみたいな見た目だったので、項目が増えても縦に伸びるだけだったのですが、現在のデザインだと下に伸びすぎるので、ページ送りを導入することにしました。
indexページでページ送りするのでできれば画面を切り替えないでページ送りしようと思っていたところ、kaminariを使えば簡単にできるとのこと(だいたいhttp://qiita.com/nysalor/items/77b9d6bc5baa41ea01f3を参考にしてやりました)。

まず元のindexページから、アイテムページを切り離します。
ページャーもページを送るたびに更新されなければならないので_item.html.erbに記入します。

_item.html.erb
<% @items.each do |item| %>
  <%= h(item.hoge) %>
  <%# 中略 %>
<% end %>
<%= paginate @items, :remote => true %>
index.html.erb
<div id="items">
  <%= render :partial => "items" %>
</div>

ページ送りする内容を返すjsコードをindex.js.erbに書きます。

index.js.erb
$("items").html("<%= j(render :partial => 'items') %>");

controllerのindexメソッドにjsでのリクエストに対し上記のindex.js.erbを返すようにします。
また、データの受け渡しをkaminari準拠のページ送り形式に書き換えます。

items_controller.rb#index
def index
  @items = Item.page(params[:page]).per(10)
  respond_to do |format|
    format.html
    format.js
  end
end

こんな感じで簡単にできてしまいました。今までなんでこけていたのだろうという感じです……。

Gehirn RS2を借りてNginx+UnicornでRailsアプリケーションを公開するまで

WordPressで特にデザインを凝る訳でもないので、技術的なこととかははてなに書くことにしました。

ということで、まずはレンタルサーバーのGehirn RS2を借りて、Railsアプリケーションを公開した話です。ちなみに公開したものは自分のサイトのwakolab.infoです。
315円/月だったので、今使用しているPaaSの体験版が切れるのでこっちでやってみようと思いはじめてみました。
現在VPSを借りて就活乞食.com(shukoji.com)をApache+Passengerで公開しているのですが、こちらがRails3.2のため、Rails4.0のアプリケーションを公開しようとすると色々と面倒そうだったので、とりあえずRS2を試したいのもあったのでこっちでやってみます。

RS2は環境が簡単に整うのとセキュアなのが特徴みたいなので、環境構築でめげたりセキュリティ知識が付け焼き刃だったりする自分としては非常にありがたいわけです。

ということで契約してまずは環境を。
説明にある通りrs2コマンドで簡単に整うので非常に楽です。

今回はだいたいhttp://qiita.com/iriya-ufo@github/items/c1edfa84b34dba2211acを参考に、Nginx+Unicornでやりました。
Nginxで動かした方が早いという話なので、今後VPSも移行してみようと考えています。

細かいことはかいてあるので省略しますが、$ rs2 install railsで自動でrailsがインストールされ、nginxを入れ、unicornを設定した感じです。

まずnginxのインストールですが、ここにある通りにできました。最新版が1.5.10だったのでそれを。
Gehirn側でリバースプロキシに使うポートを設定し、それを指示通りconfigファイルに書き加えて、これでまずはnginxの設定は完了です、が、
gehirn-unicorn.confのポートを指定する際に、3000番は使えないのです。(おそらくレンタルサーバーの都合?)
なので、unicornと通信するUNIXのsocketを指定。

upstream backend-unicorn {
     server unix:/tmp/hoge-unicorn.todo.sock fail_timeout=0;
}

あとは書いてある通りの設定で大丈夫です。勘違いしていて詰まっていたのですが、nginx.conf側のserverセクションは全てコメントアウトして必要なことは全てgehirn-unicorn.confに記入しましょう。

ここでnginxを起動して、自分はBad Gatewayにはならず403forbiddenに……railsアプリケーションのpublic下にindex.htmlを試しに配置してみてそれが表示されれば、nginxは動いているようです。動いていなければ503が返ってきます。


このあとはUnicorn側の設定です。こちらもだいたい書いてある通りに。しかしunicorn-conf.rbがこの通りに書いてもうまくいかなかったので自分は下記のようにしました。ポートの指定部分は先ほど書いたものと同じsocketを指定します。


working_directory “/home/#{username}/public_html/#{rails_app}”
pid "“/home/#{username}/public_html/#{rails_app}/tmp/puds/unicorn.pid"

stderr_path “/home/#{username}/public_html/#{rails_app}/log/unicorn.log"
stdout_path “/home/#{username}/public_html/#{rails_app}/log/unicorn.rb"

listen “/tmp/hoge-unicorn.todo.sock”
worker_processes 2
timeout 30


これで設定は完了です。
$ unicorn_rails -c config/unicorn-conf.rb -E production -D

で動きます。既に動いている場合は起動しません。終了コマンドはないので、終了する場合はgrepしてkillしてください。

これで動くはずです。動かない場合、コントロールパネル > ドメインからリバースプロキシとして使うポートの設定をしていない、もしくはgehirn-unicorn.conf側と違っている可能性があります。それでもない場合はエラーログを見て下さい……。

このあとドメインを設定します。自分はお名前.comだったのですが他でもおそらく同じようにできるかと思います。
Gehirn DNSドメイン追加から登録したいドメインを入力し、指示通りにお名前.com側で入力し登録します。そうするとGehirn DNSから設定が行えるようになります。
RS2側でドメイン追加をすると、自動設定であとは設定できます。よくわからないまま試行錯誤してこれでできたので、おそらくこれでできると思いますができなかったらすみません……手順が分かったら加筆修正します。


というわけで、無事wakolab.infoが動きました!Sqaleのお試し期間が切れるのに間に合いました!
wordpressの移行が面倒だったのでそれは今度やったら書きますし、やらないでこのままはてなだけを使い続けるかもしれません……

今後は技術的に興味を持ったことややったことなど、稚拙ながら書き溜めて行こうと思いますのでよろしくお願いします。