未来永劫

メリーバッドエンドが好きです.

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

 今年の夏はOSS開発で最高の夏にしような

ということでチョットデキルメンターさんの皆様に囲まれてSEゼミさん主催のリーダブルコード勉強会に参加してきました.

目的は人のリーダブルなコードを盗むということ.

 

私は,研究でタスクの評価に関する研究をしていたので,他人のコードを評価するという企画に惹かれて参加しました.

 

しかし,実態は

×コードを評価(レビュー)する

◯ コードのリーダブルなところを発見する

 

技術や早さを競うのではなく,

また,コードの間違いなどを指摘するというわけでもありません.

いかに読む人にとって読みやすいコードを書くかという点が重要視されていました.

(そしてどれだけ書けるかとかも求められていません.最低限文法が理解できて,自分で調べることができれば大丈夫だと思いました. デバッグもメンターさんが新しい視点を提供してくれたのでなるほどと思うことが多かったです.)

 

実際に体験してみて 

意識して人のリーダブルなコードを発見するという作業,意識して自分がリーダブルだと考えて記述した事を主張するというのは非常に新鮮でした.

自分が日常的に当たり前だと思ってやっていることが他人にとってはリーダブルであったり,普段書かないような記法で書いてあるコードが私にとってはリーダブルであると感じることが出来ました.

また,(ちょっとどころか現役の超優秀エンジニアの)メンターさんに直接レビューして頂けました!

意識して書いたコードに気づいて頂けたことはやはり嬉しかった!

 

本で書かれている「可読性の高いコード」は綺麗にわかりやすく加工されたものですが,それ以外(OSSや野生のリーダブルなコード)を実践的に学ぶ機会は中々ないですよね.

私にとっては,良い意味で期待を裏切られた形になりました.サイコー!

 

その後の懇親会では

また,自分は機械学習系に興味があったので,その筋に強い方とコンタクトをとってお話することができました.

非常に有意義! やっぱり与えられた機会は逃さず参加するもんですね. 
 
 

勉強したことを箇条書きにメモ

一番はじめに実装したいことをコメントで箇条書きにし,その箇条書きの通りに実装していく.

最初に「やりたい!」と考えた事が伝わるほうがいいよね.その機能が実装できる度にコミットすれば他の機能追加が無いから,コミット内容も美しくなるよね.
 
コメントアウトしたコードはコミット時には消す.
(読む側にとっては)冗長なだけなので不要.前述したやり方をしてたら,機能毎のデバッグも難しくないはず.
 
(困ったときに)グーグル先生に頼るのも良いが,実際にGitHubで公開されているコードから学ぶ
OSSを読む力がつく.同じ内容でも,より良い方法で実装しているかもしれない(しかもmergeされている以上は,ある程度動く保証がある).
また,一度読んだことはちゃんとに自分の中のDBに格納される.
 
(OSS)を読む練習をするなら,GitHub Awardなどで上位のユーザを参照すると良い.
実際に評価されている人なのでコードを見ると間違いなく勉強になる.
 

広告

 6月20日にはGitHub勉強会,27日にはOSSに関する勉強会,7月11,12日には本番のOSS開発が行われるので,興味がある方は是非一緒に行きましょう.
http://www.seplus.jp/sezemi/

Heroku + Rails4.2 + Devise + Bootstrap3系列で本番環境でログアウト(Sign_out)ができない問題

環境

Heroku
Rails 4.2
devise 3.5.1
Bootstrap3.1.1

起きたこと

rails4.2 + Deviseで,本番環境のみで発生するエラーです.

$git push heroku master

でHerokuにデプロイし,

$heroku open

でアプリケーションを立ち上げる.

Deviseの機能を用いて正常にログインはできていたのだが,ここでサインアウトを選択すると

The page you were looking for doesn't exist.
You may have mistyped the address or the page may have moved.
If you are the application owner check the logs for more information.

という内容のエラーが出る.

$rails s

でローカルで立ち上げた場合は正常にサインアウトができていた. 何だこれ?

解決策

JavaScriptが正常に読み込まれていないのが原因であった.
ローカルにpublic/assetsディレクトリが存在している場合は容赦なく

$rm -rf public/assets

を用いて削除する.

ここで再び,

$git add .
$git commit -m "[コミット内容]"
$git push heroku master

の手順でherokuにデプロイし,

$heroku open

で立ち上げる.

再び同じエラーが起きたが,今度はWebインスペクタを参照すると,

[Error] bootstrap-datetimepicker requires jQuery to be loaded first (undefined, line 0) 

という内容のエラーが出ていた.
jQueryをbootstrapより先にロードしてね」と言われているようなので,
app/assets/javascript/application.js 内で

//= require jquery 
//= require jquery_ujs 

の2行を他のリクエストよりも優先的(先頭)に記述し直した.

再び,

$git add .
$git commit -m "[コミット内容]"
$git push heroku master

の手順でherokuにデプロイし,

$heroku open

で立ち上げると,今度は無事に成功!

scaffoldのdeleteが正常に行われない時や,
Railsで意図しない挙動を示している場合にはWebインスペクタの確認と,Javascript関連を当たってみると良いかもしれない.

(今回の場合で)やっちゃダメなこと

$git push heroku master

を行うと,自動的に
assets precompileしたのと同じになるらしい.
従って,あまり安易に

rake assets:precompile

するのは控えた方が良いかもしれない.

GitHubで芝生が何故かContributionsに反映されない時

僕はこれに気づかずに半年間芝生が生えませんでした!!!
芝生被害者の会を作りましょう.

起きた事と問題

共同開発などでpull requestを送ったり,mergeされたりした時にはContributionsに芝生が反映されるのに,
自前で開発しているアプリケーションをcommitした時にはなぜかContributionsに反映されないという問題にブチ当たっていました.
githubの仕様が変わったのかなと考えていましたが,そんなこともなく,悩んでいたところ解決方法が見つかったので備忘録としてアウトプットしておきます.

解決方法

GitHubページのEmailアドレスを確認する.

どうやら自前の開発環境とGitHubで登録しているメールアドレスが一致していない場合,正しくContributionsが反映されないようです.

Settings -> Public email から 登録されているEmailアドレスを確認

次に,自分の開発環境で

$ git config user.email

で表示されるアドレスを確認して下さい.
もし,このEmailアドレスが一致していない場合は,

$ git config user.email [example@exampl.com]

として自分の登録されているEmailアドレスを付与することで,変更する事ができます.

で,ここからが注意ですが,
自分のローカルのリポジトリ単位でこの設定を行ってください
逐一確認しないと,せっかく設定しなおしたのに芝生が反映されてない…なんてことが起こります.
自分がハマっていたのはこれだったのでご注意を!

追記 2015 10/15

$ git config --global user.email [example@exampl.com]

ここでglobalオプションを明示的に指定することで,おそらく以降の設定が不要になります.
確認したところ,草が反映されていない以前のリポジトリにはやはり逐一指定する必要がありそうです.

参考
Why are my contributions not showing up on my profile? - User Documentation
GitHubのYour Contributionsが反映されない - Qiita
GitHub Contributions 色つかない(草生えない) - Ryusuke Fuda's Tech Blog

Mac OSX で gem install twitter できなかった話

環境

Mac OSX Mavericks

ruby -v 

で念のため rubyのver確認

ruby 2.1.4p265 (2014-10-27 revision 48166) [x86_64-darwin13.0]

エラー内容

$ gem install twitter

したら

Building native extensions.  This could take a while...
ERROR:  Error installing twitter:
	ERROR: Failed to build gem native extension.

    /Users/[user_name]/.rvm/rubies/ruby-2.1.4/bin/ruby -r ./siteconf20150521-83034-htbchk.rb extconf.rb
creating Makefile

make "DESTDIR=" clean

make "DESTDIR="
compiling ruby_http_parser.c
gcc: error: unrecognized command line option '-Wshorten-64-to-32'
gcc: error: unrecognized command line option '-Wdivision-by-zero'
gcc: error: unrecognized command line option '-Wextra-tokens'
make: *** [ruby_http_parser.o] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/[user_name]/.rvm/gems/ruby-2.1.4/gems/http_parser.rb-0.6.0 for inspection.
Results logged to /Users/[uesr_name]/.rvm/gems/ruby-2.1.4/extensions/x86_64-darwin-13/2.1.0/http_parser.rb-0.6.0/gem_make.out

解決方法

gccのエラーを吐いてるのでggって見るがこれといって解決に繋がるものはなかった.

$gcc --version

でversion確認すると,

gcc (GCC) 4.9.0 20130929 (experimental)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

と,gcc 4.9.0になっていたので,gccのversionの問題かと思ってgcc 4.2.Xに戻してみたがそれも上手く行かず.

困ったので,

$ sudo rm /usr/local/bin/gcc
$ sudo rm /usr/local/bin/g++
$ sudo ln -s /usr/bin/gcc /usr/local/bin/gcc
$ sudo ln -s /usr/bin/g++ /usr/local/bin/g++

この手順で gcc -> LLVMに戻してみた.

$gcc --version

を再び実行すると,

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.3.0
Thread model: posix

となり,戻っていることが確認出来た.

この状態で

$ gem install twitter

を行うと無事にインストールできた.


これで今日からrubyで楽しいtwitterライフを送れます.
(インスコしておいてあれだけどやっぱりpythonに帰ります.)

Mac OSX Mavericks で Apache環境構築 + 任意のディレクトリからCGIプログラムの実行まで行う.

環境

Mac OSX Mavericks(このご時世にいつまで使うのやら)

Server version: Apache/2.2.26 (Unix)

Server built: Dec 10 2013 22:09:38

Apacheの設定

verの確認

ApacheはMac OSX Mavericksでは標準でインストールされているはずです.
従って,今回はそれを利用します(homebrewでぶっ込んで試したけど挫折した).

$ httpd -v 

でまずはver確認から.

標準では

Server version: Apache/2.2.26 (Unix)
Server built:   Dec 10 2013 22:09:38

と出力されるはずです.

Apacheの起動確認

$ sudo apachectl start

で起動できます.

終了は

$ sudo apachectl stop

でOK.

設定ファイルを弄った後は

$ sudo apachectl restart

をして再起動してください.

http://localhost/
を参照すると起動が出来ているか確認できると思います.

設定ファイルの変更

標準では設定ファイルが /etc/apache2/配下に置かれているはずです.
今回はエディタのEmacsで編集を行うので

$ sudo emacs /etc/apache2/httpd.conf

で編集を行います.

変更箇所

1カ所目
ユーザディレクトリを許可するモジュールをアンコメントアウト

LoadModule userdir_module libexec/apache2/mod_userdir.so

デフォルトではコメントアウトされているので外します.

2カ所目

 #User home directories                                                           
 Include /private/etc/apache2/extra/httpd-userdir.conf

同様にこのInclude文もコメントアウトされているので外します.

3カ所目

#                                                                             
# AddHandler allows you to map certain file extensions to "handlers":         
# actions unrelated to filetype. These can be either built into the server    
# or added with the Action directive (see below)                              
#                                                                             
# To use CGI scripts outside of ScriptAliased directories:                    
# (You will also need to add "ExecCGI" to the "Options" directive.)           
# 
AddHandler cgi-script .cgi

この最後の文も標準ではコメントアウトされているので外します.

ここで,rubyperlなどをcgiプログラムで活用したい場合は

AddHandler cgi-script .cgi .rb .pl

のようにして追記すると良いでしょう.

任意のディレクトリを参照できるように設定

次にユーザディレクトリを設定します.
設定するためには

$ sudo emacs /etc/apache2/users/[user_name].conf

を行って作成する必要があります.

自分のuser_nameは

$ whoami

で確認することが出来るので,各自確認の上[user_name]部分を変更してください.

設定は以下のコードを入力してください.

<Directory "/Users/[user_name]/Sites/">
  AllowOverride All
  Options Indexes FollowSymLinks MultiViews +ExecCGI
  AddHandler cgi-script .cgi
  Order allow,deny
  Allow from all
</Directory>
Options Indexes FollowSymLinks MultiViews +ExecCGI

この+ExecCGIと,

AddHandler cgi-script .cgi

この一文がCGIプログラムを任意のディレクトリで実行するために重要になります.

任意のディレクトリを設定するには

<Directory "任意のディレクトリ">
</Directory>

とすれば任意のディレクトリを設定することができる(はず)です.

CGIプログラムを動かすための準備

ここまで設定が完了したら,実際に動かすために準備を行います.

$ cd 
$ mkdir ~/Sites

としてSitesというディレクトリを作成します.

続いてディレクトリのパーミッション(アクセス権限)の設定を行います.

$ sudo chmod 755 ~/Sites

としてアクセス権限を変更します.

$chmod 755 とは

  • 所有者:読み出し,書き込み,実行が全て可
  • グループ:読み出し,実行が可
  • その他ユーザ:読み出し,実行が可

という状態に変更する事を指します.

CGIプログラムを動かす

いよいよCGIプログラムを動かすためのプログラムを書きます.

$ cd ~/Sites
$ emacs test.cgi

として~/Sites 配下にtest.cgiというファイルを作成します.
内容は以下のような簡単なものに.

#!/usr/local/bin/ruby                                                             
print "Content-Type: text/html\n\n"
str = "Hello World"
print str
print "\n"

作成後は先ほどと同様にパーミッションを設定します.

$ cd 
$ sudo chmod 755 ~/Sites/test.cgi

ここまで完了したら,

$ sudo apachectl restart

として再起動をかけてください.

http://localhost/~[user_name]/
を入力して何か表示されていれば成功.

http://localhost/~[user_name]/test.cgi
を叩いて
f:id:shopetan:20150515033642p:plain
が表示されればOkay!

エラーが出る場合は

これはmacの場合に限るかと思いますが…

$ tail -f /private/var/log/apache2/error_log 

これで適宜エラーログを確認することが出来ます.便利!

おつかれさまでした.
何か間違い等ありましたらコメントお願いします. 適宜修正いたします.

mastLTに参加して

いわゆる雑記です.

 

5/2にITF大のmastが中心となってワイワイ話すmastLTが開催されていました.

私は特に喋っていないので感想だけ.

 

みんな喋るのうめぇ!!!

 

これに尽きます.

内容は本当に人それぞれでした.

特に技術的な事を話さないで好きな定食屋の事を話す人もいましたし,頑張ってツインテールになってる人もいましたし,おっぱいフェチな人もいましたし,世界は広いですね.

 

しかし,これらすべてに共通して言えることは,プレゼンがとても面白いということです.

(主観ですが)面白いプレゼンをするためには,人に伝える力があるとかプレゼン自体の実力があるとかそういう事を抜きにして,自分が与えられた場を楽しんでいるかが重要な気がします.

研究発表でもなんでもそうですが,楽しそうに話している人のプレゼンはとても面白い.

自分が楽しいと感じる分野の事って自然とハキハキと,嬉々として人に伝えられますよね.

それを伝える規模が大きくなると委縮しがちですが,発表者の方々は場を楽しんでいる感が良く伝わりました.

重要なのは,自分が楽しいと思う内容を楽しいと思えるような場にして伝える事かなというのが所感です.

私自身も楽しく学ぶことが出来ました.ありがとうございました.

 

 

話は変わりますが…

今日(昨日5/4)はkosenLTがあったみたいですね.

10年入学15年卒の全国の高専生が集まってワイワイやる会です.

僕は高専時代の友人達と飲みに行く機会があったので出席しませんでしたが,友人が何名か行っていたようなので羨ましい限りです.

mastLTでもそうですしkosenLTでもそうですが,こういった場に参加すること自体のリスクというか抵抗がある方は割と多いみたいですね.

しかしそれ以上に参加する価値はあると思いました.色々な人の話が聞けるのはそれだけで価値がある事だと思います.

5/8にはklisLTが,5/15には工シスLTが開催されますね.このような学生主催のイベントが積極的に行われているITF大は本当に恵まれていると感じました.

編入生主体のLT(3penLT)も企画されているそうなので私もお喋りしようかなと考えています.

先日着任された落合先生も仰っていましたが,このような「正の同調圧力」は誰に対してもプラスに働くと思います.

積極的に波に乗っていきたいですね.

遺伝的アルゴリズムで組み合わせ最適化問題とお遊びする

最近まで高専でやってて,ちょっと大事だなと思ったので自分でアウトプットして理解促進につなげます.

 

遺伝的アルゴリズム(Genetic Algorithm)ってご存知ですか?

簡単に説明すると,機械にやって欲しい事を学習させるアルゴリズムみたいなものです.

詳しく説明するとこんな感じ↓↓

続きを読む