あーあーそのー

最近はshuyuheyと名乗ることが多いですが面倒なのでBLThunder1991のままにします。

担当者とか発表者とか決めるためのルーレットみたいなものを作った

事の発端

うちのチームで、進捗報告の担当とか議事録の担当とかデイリーミーティングファシリテータとか、そういうものを何でもかんでもくじ引きで決めるようになってきた。

毎回毎回くじ引きを作ったり、紙の感じで当たり外れが分かるのも嫌だなと思ったのでルーレット的なものを作ってみた。すでにあるかもな、って思ったけどノリと勢いで自分で実装した。

できたもの

http://blthunder1991.github.io/html_Roulette/

どこでも動くようにHTMLとJSで作った。デザインとかはものすごく雑。

ついでと言ってはなんだけど、JSでクラスみたいなものを実装したことがなかったので、それっぽいものにチャレンジした。

Thisが呼び出し元によって意味が変わるみたいで、ちょっと苦労した。苦し紛れに、Thisが必要なメソッドには自分自身のインスタンスを渡すようにしてみたけど、この辺りを綺麗に書く方法が知りたい。

やはり一度、Javascriptの本をしっかり読んでお作法的なことを抑える必要がありそう。

RoboCupSoccer SSL向けのnode.jsとWebブラウザを使ったグラフィカルクライアントssl_gclient_nodeを作りました.

f:id:BLThunder1991:20140730065151p:plain

BLThunder1991/ssl_gclient_node · GitHub

ひとまず最低限な機能を満たしたので,紹介したいと思います.

事の発端

最近,HTML5とかnode.jsを触る機会が多くて,これでなんか作りたいなと思ってました.幾つかアイディア出てきたんですが,一番イメージが湧きやすかった,RoboCupに関するプロダクトを作ってみたくて,やってみました.

なぜわざわざ,SSL-Visionに同梱されているグラフィカルクライアントを作ったのかと言えば,Macの上で動くクライアントが欲しかったのと,どうせ試合をクライアントから見るなら得点の状況とかステータスも知りたいなという要望が個人的にあったからです.試合直前にロボットのお世話しながら机の上で試合見るとかできます(笑)

さらに言えば,僕がRobocupに参加した時こういうものがあったらうれしかったなというのがなんとなくあります.

個人的にそう思っていたというか,こればっかりは僕のグイグイ力の問題なのかもしれませんが,初参加の時は時間とか人とかのリソース的にロボット作ってAIサーバ作るのが精一杯でこういう本筋とは関係ないけど会ったほうが良かったものってなかなか後回しになりがちです.

もし,今後Robocupに興味を持って,参加したいというチームに向けてちょっとでもハードルが下がるといいなという気持ちで作りました.

ssl_gclient_nodeができること

SSL-Vision,RefereeBoxからのパケットを受け取って,サーバにアクセスしているWebブラウザにリアルタイムで反映します.

なので,サーバをマルチキャストが届く範囲で起動させて,アクセスするWebブラウザは経路さえ空いていればどこからでも試合の状況を確認できます.

単純に,現状のグラフィカルクライアントを置き換えることも十分できるとは思いますが,パブリックビューイング的な?見に来てくれているお客さんが試合の状況を把握するとか,そういうケースにも使えるかと思います.(なんせブラウザがあれば見れるので!)

あとは,ちょっとインフラの整備が必要になるかもしれませんが,公式ページに埋め込んで,Webサイトから試合の状況リアルタイムで見れる,みたいなこともできると思います.

ssl_gclient_nodeがこれからできるようになるかもしれないこと

WebSocketは双方向の通信技術なので,サーバからブラウザへ更新をかけるだけではなく,もちろんブラウザから何かサーバ側に送る事もできます.

また,基本的にはWeb(HTML5)の技術を使用しているので,クリックイベントとかも結構簡単に取れます.

したがって,シミュレータみたいなものももしかしたら結構簡単に作れるかもしれません.(Javascriptの2D物理演算ライブラリとかもありますしね)

実装に関して幾つかのフォロー

サーバサイド

サーバサイドはnode.jsで実装されています.

% node gclient.js

コマンドを叩くと,Webサーバ,Websocketサーバ,マルチキャストレシーバ×2が起動します.

ポート番号とかホストとかはハードコーディングされているので,必要に応じて変更してください.

サーバ側では,Googleprotobufを使うためにprotobufjsというライブラリを使用しています.

dcodeIO/ProtoBuf.js · GitHub

これがまた素晴らしいライブラリで,かなり簡単にProtobufをいじれるようになりました.逆にパケット作るなんてときにもめっちゃ簡単そうです.

クライアントサイド

クライアントサイドはWebsocketでデコード済みのProtobuf(JSON形式)をサーバから受け取って,それを元にロボットとかボールとかを描画しています.

Canvasタグの2Dコンテキストを取得してゴリゴリ書いています.描画タイミングは,SSL-Visionからパケット受け取ったタイミングで書くようになっていて,安定して受け取れるなら大体60fpsぐらいで描画しています.

描画に関してはもしかしたら,WebGL使ったりしたほうが扱いやすくなるかもしれません,今後検討します.

RefereeBoxからのパケットも同様に,受け取ったらチーム名とか得点とかステータスとかを更新しています.

デザイン面に関しては,Twitter bootstrapを使用してレイアウトしています.しかしながら,なんかたまにおかしいことになります(笑)

あと,致命的なことにUIがださい(笑)改善案お待ちしています.

もしつかっていただけるなら……

所属チームを引退してからはや数ヶ月,実は僕の手元には色々テストするための環境がありません.ロボットとか,シミュレータとか,AIそのものとか…….なので,本プロダクト作成にあたっては,grSimとか使ってデバッグしておりました.

もし,このプロダクトが気に入って,使っていただけるようであれば,ぜひぜひ使い倒してバグ報告とか,改善提案とかいただければと思います.Pull Requestとかも大歓迎です!

本番に近い環境じゃないとわからないこともたくさんあると思うので.

おわりに

かなり簡単な説明になってしまいましたが,このぐらいにしておこうと思います.

バグの報告や改善案などはGitHub等にお願いします.

リーンスタートアップ勉強会に参加してきました

事の発端

前回参加した勉強会でお世話になったSEゼミさんの勉強会に参加してきました.

SEゼミ | プロフェッショナルを目指す学生のためのインターン | プログラミングが好きな学生のためのリーン・スタートアップ(Lean Startup)勉強会

前回の勉強会:リーダブルコード勉強会に参加してきました - あーあーそのー

リーンスタートアップ,言葉は知ってたんですが実のところよく知らなかったので飛び込んでみました.

前回と同様,リーンの本とアイディアのつくり方という本も頂いちゃいました.リーンの本はじっくり読もうと思います.

それでは,参加してきて思ったこととか内容とかについて書いていきます.

(なんかものすごく長くなりました.スッキリ文章をまとめられる能力も必要だ……)

続きを読む

リーダブルコード勉強会に参加してきました

f:id:BLThunder1991:20140708124132j:plain

事の発端

前のがっこの先生が,こちら勉強会のことをツイートしてたのが始まりです.

SEゼミ | プロフェッショナルを目指す学生のためのインターン | プログラミングが好きな学生のためのリーダブルコード勉強会

リーダブルコードは,前のがっこにいた時に,指導教員のせんせにおすすめされて読んだことがあります. その時も結構感銘を受けて,コードの書き方滅茶苦茶変わったりしました.

それまでにも,チーム開発の機会は結構あったし,これからもたくさん増えてきそう(実際ものすごく増えてる)なので,リーダブルなコードについてお勉強しようと応募しました.

無事,参加が決まって実際に行ってきた(7/6)のでその時のお話を書きます.

続きを読む

OSXのEmacsで…とかOptionを使う文字を入力する

事の発端

三点リーダ…とか毎回・を三回打って変換とかしてたんだけど、どうにかして一回で入力したいと思った。
調べたらどうやら Option + ; で入力できるらしい。

だけど僕は、普段Emacs使っていて、OSの設定でOptをmetaに割り当てている。
そうなると、Emacs上でOptionキーが使えなくてちょっと困る。
どうにかして、右のOptionだけとかを、metaじゃなくしたい。

結論

これをinit.elに書く。右のOptionキーだけ、metaじゃなくてOptionとして使える。

(setq ns-right-alternate-modifier nil)

参考:OSX Emacs: unbind just the right alt? - Stack Overflow

オチ

実は初めはMarkdown記法でソースコードを表示するときの`をどうにかして打ちたかった。
恥ずかしながら、この記号をプライム´だと勘違いしていた僕は、
一生懸命ググってこのやり方に辿り着いたのだけど、
いざ入力してみたらMarkdown-modeなのに色が変わらない。

おかしいなって思ってよく見たら記号逆じゃーん。
しかもMacのキーボードをよくよく見たら一番左端に打ちたかった文字が……orz

というわけで、急遽三点リーダ…を打ちたかったことにしましたとさ。

redmineを1.3.3から2.5.1にUpdateして色々大変だった話

事の発端

本学のプロジェクトで使用しているRedmineのバージョンが1.3.3だったので,最新版にアップデートしたかった.

Backlogsとか入れてみたかったしね.

 

流れ

まず,もともと入っていたRubyが1.8.7 だった.

最新のRedmineでも,サポート範囲内だったと思うけど,作ってるプロダクトが2.0.0で作られてたので,将来的にここにサンプルとかもデプロイする運用を考えたかったので,バージョンを上げたい.

ただ,上書きはちょっと怖いので,rvmを利用することに.

適当に,

$ sudo apt-get install ruby-rvm

とかやっていたら,なんだかうまく行かなかった.そこで,ちゃんと調べてインストールしてみることに.

この後,参考にしたのは以下のサイト.

RedmineをUbuntu 12.04 LTSにrvmを使ってインストールする - espresso3389の日記

Install Ruby on Rails using rvm on Ubuntu 12.04 - Stack Overflow

user@host:~$ \curl -L https://get.rvm.io | bash -s stable
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   184  100   184    0     0    215      0 --:--:-- --:--:-- --:--:--   293
100 20511  100 20511    0     0  21206      0 --:--:-- --:--:-- --:--:--  472k

It looks you are one of the happy Ubuntu users,
RVM packaged by Ubuntu is old and broken,
follow this link for details how to fix:

  http://stackoverflow.com/a/9056395/497756

 おや,なんか失敗.しかもご丁寧に解決策が書いてあるリンクまで貼ってったので参照して無事インストール完了.

インストールが終わったので,rvmを更新.

$ sudo rvm get head
$ sudo rvm reload

パスが通っていないと怒られた.sudoすると,環境変数が引き継がれないらしい.

sudoでPATHなどの環境変数を引き継ぐ | Pistolfly

こちらを参考に,設定を変更.この時にvisudoしてnanoが立ち上がったのでイラッとしてnanoを削除

今度はコマンドが無事通ったので,目的のruby2.0.0をインストール.これも問題ない.

次は,rvm useを打ったんだけど,ログインコンソールでやってくださいと怒られた.

んー,理由はわからない.

$ /bin/bash --login
$ rvm use 2.0.0

今度は無事成功.バージョンを確認してみたら,最新バージョンになってる.はて?

とりあえずログインしなおしてから確認.今度はOK.

次は,redmineのインストール.とりあえず,最新版を適当なディレクトリに持ってきて,現行バージョンがおいてあった場所にシンボリックリンクを貼ることにした.

インストールの際に参考にしたのは以下のサイト.

RedmineUpgrade - Redmine

DebianでRedmine 1.3.2から2.0に更新する | kwLog

Redmine 2.5をCentOS 6.5にインストールする手順 | Redmine.JP Blog

手順に関しては,2番目の記事とほとんど手順は同じ,ただし,数カ所コケたところがあった.

一つ目は,mysqlのgemがうまく入らなかった.どうやら,1.4からmysql2というgemに切り替わったらしく,そいつを入れてあげなきゃいけないらしい.
入れようとしたけど,何故かコケた.ちょっと調べてみると,いくつか似たようなエラーを見つけた.

Rails - Ubuntuでmysql2 gemが入らない。 - Qiita

ここを参考に,無事解決.

次は,何故かdb:migrateでエラーが出る.しかもsyntax.なぜ…….

色々調べたら,該当gemを消せば直ったという記事を見つけた.(リンクどっか行っちゃいました.ゴメンナサイ)

 $ gem uninstall psych

これで,無事db:migrateも完了.

あと,僕が使っているサーバはPassengerを使っているので,そこのパスもrvmの場所に切り替えてあげなきゃいけない.

rvmのpassengerをapache用にコンパイルして,設定ファイルを書き換える.

Apache上でRuby on Railsアプリケーションを動かす/Passenger(mod_rails for Apache)の利用 — Redmine.JP

ここを参考に,設定.途中何回か怒られたけど,都度apt-getで対象パッケージをインストールしてココもクリア.

最後にapacheを再起動して,無事表示されることを確認しました.

#ここまで来るのに何回も再起動して失敗してるけどね

Macから富士ゼロックスのプリンタで印刷できなかった問題が解決した

事の発端

居室のプリンタ(富士ゼロックス DocuPrint C3350)に,Macから印刷投げてもエラーになってしまって困っていた.

目の前にWindowsもあるし,ちょっとめんどくさいけどわざわざWindowsから印刷してたりしたんだけど重い腰を挙げて問題解決した.

解決方法

Mac用のドライバを再インストールする.(ちゃんと一回消してから!)

解決までの道のり

とりあえずプリンタのジョブ履歴をプリントして,エラーを眺めてみる.

エラーコードは,「106-749」ドライバのエラーらしい.

 

というわけで公式サイトからドライバをインストールしてみる.

手順に従って,プリンタ設定してみたけど……ん?

指定の「FX Print Driver for Mac OS X vX.X」が見当たらない.

 

というわけで,再インストール.

一度インストールしたドライバを削除しようと思ったけど,そういえばMacのプリンタドライバってどこにあるの?

調べたらどうやら/Library/Printersにあるらしい.

その中のFujiXeroxディレクトリを丸ごと削除.

ついでに,PDDsのFX関係のファイルも削除

もひとつついでに,InstalledPrinters.plistのそれっぽい行も削除

もう一回インストールしたら,無事「FX Print Driver for Mac OS X vX.X」が登場.

 

無事プリントできるようになりましたとさ.