indilog

Ruby/Rails/React/Goなどに関して自分が勉強したことなどを投稿しています

プログラミングと自分

高校の時から夢見てた職業としてのプログラマに半年前になり、ふと自分はどのようにして学生時代PCやプログラミングと関わってきたのかを振り返ってみたくなったので軽く書いてみる。

PCとの出会い-小学校低学年

自分が生まれて初めてPCを触ったのは小学生低学年の時だった。 もうほぼほぼ憶えていないが、家にはデスクトップPCがあって、そのPCでブラックジャックを遊ぶのがすごく楽しかった気がする。

異国でコンピュータに触れる-小学校中・高学年

親の仕事の関係で、渡米することになった。 転校先の現地校では、こんな感じのIMacがずらーっと並んでいて、かっこいいなと思い、パソコンを使う授業がすごく楽しみだった。

https://upload.wikimedia.org/wikipedia/commons/c/c0/IMac_Bondi_Blue.jpg

この時はまだプログラミングをすることはなく、ひたすらブラインドタッチの練習や、オフィス系のソフトの操作などをやっていたような気がする。 友達と遊ぶにしてもPCゲームがメインだったので、親に自分のPCを買い与えられるまで、ひたすら家族のPCを一日中占拠していたのが懐かしい。 この時はダイヤルアップ接続だった気がする、やはり懐かしい。

日本に戻ってきて-中学生

中学生の頃もひたすらPCゲームをやっていた覚えがある。ダメ人間感がすごい。

夏休みはひたすら起きたらゲームを始め、飲み食いをほぼせずに一日が終わるまでひたすらオンラインゲームをしていた。

この時に技術の授業で初めてHTMLというものに触れた。交通系ICカードを紹介するサイトを作っていたのだが、リンクを貼ったり、画像を貼ったりと、自分の手で綺麗にサイトが出来上がっていくのを見てとても興奮した覚えがある。

プログラミング始め-高校生

ゲーム漬けだった中学生だったが、受験はアメリカ住まいで培った英語力でごり押し、なんとか無事志望校に受かることができた。

高校生になってからも相変わらずゲームが多かった気がする。頻度は少なくなっていたが、オンラインゲームは相変わらず継続していたし、PSPとかも出てきた影響もあり、時間があれば高校に集まってはみんなでワイワイとゲームをしていたことが多かった。

そんな中、ちょうど高校の選択授業でプログラミングの授業を2つ軽い気持ちでとることにした。中学生時代に味わったあの感覚をもう一度味わいたかったのだ。

しかしとった授業はC++JAVAの入門。HTMLからこの2つの言語にいきなり入っていったので、初めて見るそれぞれの言語の書き方や考え方に少し戸惑った。

C++の授業はプログラミング大会か何かの問題をひたすら解く形式、Javaは指定の教科書を買ってくるように指示され、それを輪読して説明するというなかなかハードモードな授業だった。

特にJavaの夏休みの宿題は、Javaで「物理シミュレータ」を作って来いというとても範囲が広くて何を作れば良いのかわからない課題で、悪戦苦闘しながらブロック崩しを作ろうとして途中で挫折した覚えがある。でもその時は本当にその悪戦苦闘が楽しくて、いつの間にか徹夜もしてたし、うまくいかないところを絶対うまくいかせてやろうという気持ちに溢れていてがむしゃらにコードを書いては消してを繰り返していた。

ちょっと寄り道-大学生

大学生に入ってからは、サークルの活動で少しマイコンを触る機会があり、Cを少しやったり、研究室でC++Pythonを使っていたりした。 バイトでは初めてサーバの設定や、web系のプログラミングを始めるなど、徐々に職業:プログラマとしての土台が見え始めてきたところなんじゃないかなと思う。

特にサーバの設定はとても印象的で、少し高校時代の思い出が蘇るようなものだった。サーバの設定をするためのマニュアルを渡され、それを頼りにいろいろと設定を入れていくのだが、エラーなどがバンバン出てきて全然思うようにいかない。ひたすらネットで調べて色々と試してみて、最後には設定もちゃんと入り、動くようになってくれて、それはそれで達成感があったのは間違いないと思う。


こんな感じでメモっぽいものを書いてみたが、とても薄いものになってしまった気がする・・・。 もっと面白おかしく書くスキルを手に入れないとな、と思うのであった。

itamaeでsidekiqが使えるようにredisをremiからインストールする

問題

railsでActionCableを使ってアプリを作っていて、ActiveJobを処理させるためにsidekiqを導入しようとしたら、 epel だとredisのバージョンが足りなかった。 github.com

# recipes/redis.rb

package "redis" do
  options "--enablerepo=epel"
  action :install
end

service "redis" do
  action %i(enable start)
end

解決

remi から取ってくるようにするために、レシピを以下のように変更。

# recipes/redis.rb

package "epel-release" do
  action :install
end

package "http://rpms.famillecollet.com/enterprise/remi-release-#{node[:platform_version][0]}.rpm" do
  not_if "rpm -q remi-release"
end

package "redis" do
  options "--enablerepo=remi"
  action :install
end

service "redis" do
  action %i(enable start)
end

これでうまくsidekiqが起動、処理してくれるようになった🔪🔪🔪

gretelって名前がメルヘンだけどパンくずリスト作りに便利

パンくずリストの実装って結構面倒くさそうだなって思ってたけど、gretelはなんて素敵gemなんだろうと思った。 github.com

使ってみた

READMEにもかいてあるけど、おもむろに

Gemfile

gem "gretel"

と書いて bundle install

次に設定ファイルを rails generate gretel:install で生成。

生成される config/breadcrumbs.rb に対して色々と設定を入れていけば良い感じ。

config/breadcrumbs.rb

# ページのルート
crumb :root do
  link <表示させたい文字列>, root_path
end

# 以下みたいなのをパンくずリストに表示させたい塊に対して書く
crumb :<パンくずのシンボル用文字列> do
  link <表示させたい文字列>, <リンク先パス>
end

のように記述する。

あとは各ページに対して

<% breadcrumb :<パンくずのシンボル用文字列> %>

パンくずリストを表示させたい箇所で記述するのと、

app/views/layouts/application.html.erb

<%= breadcrumbs style: :bootstrap" %>

と書いてしまえば bootstrap スタイルの素敵なパンくずができちゃいます。便利ですね!

React&React Native入門者の会に参加してきた

React&React Native入門者の会というものに参加し、面白そうだと思ってたけど全然触れてなかったReactについて色々と話を聞いてきたので雑まとめ。

Reactive Nativeのおかげで爆速でNativeアプリが書ける話 @prologさん

http://snack.to/bhclvf3k

アンドロイドアプリ作りたい

  • 豊富なライブラリ
  • awesome-react-native
    • react-native-grifted-chat ➡︎ LINE風のチャットが実装できる
    • react-native-action-button
    • react-native-dialogs

Reactの基礎 @minakaco0301さん

https://github.com/minakaco0301/react_native_sample


React Nativeを触り始めて@diskshimaさん

  • ListViewあるあるらしい

  • 更新されない場合はCloneWithRawsを呼びましょう


React JSのオープソースを学び倒して脱初心者を目論んでいる話 @tkow39

  • リアルなコードを書こう
  • fillはfluxの良い実装

Ajax in React with axios @takanorip

Reactでpromiseなajax


感想

  • 全体的に、名前の通り入門者レベルの話だった気がした。
  • とりあえずawesome-reactとかのプロジェクトを色々コードリーディングしていって、知識を取り入れられたらと思った。

【Rails】guard-livereloadを使ってみる

きっかけ

ReactJSの開発環境を設定している動画で、livereloadでサクサク開発をしているのが紹介されているのを見て、面白そうだなと思ってやってみました。

guard-livereload

github.com

RSpecとか更新時に色々と自動化してくれるやつのlivereload版。 viewファイルやCSSやJSなどといったファイルが更新された際に自動的にブラウザをリロードしてくれる。

インストール

Gemfile

group :development do
  gem "guard-livereload"
end

と書き、

bundle install

でインストール。

guard init livereload

でどのファイルを更新した時にリロードするのかといった設定を書くためのGuardfileを生成。 中身としては

# file needing a full reload of the page anyway
watch(%r{app/views/.+\.(#{rails_view_exts * '|'})$})
watch(%r{app/helpers/.+\.rb})
watch(%r{config/locales/.+\.yml})

などといったwatch~~な箇所が更新されたらリロードがされるようにデフォルトで生成されるファイルでは記述されている。

連携

chromeを使っているなら下から拡張機能をインストール。 chrome.google.com この状態で

bundle exec guard

を実行すると

INFO - LiveReload is waiting for a browser to connect.

という表示が出るので、

rails s

でサーバを立ち上げて、ブラウザでアクセスすると

INFO - Guard is now watching at [project名]

となり、これ以降にviewファイルなどを更新すると、自動的にリロードされるようになる。

Support

Guard::LiveReload is looking for a new maintainer. Please contact me if you're interested.

なんて書いてあって少し不安感あるけど、他にサクッと入れられるものはあるのだろうか。

【Rails】Time型で時間の条件だけを指定して取得

DBはSQLite3を使用

問題

id: 1, starttime: 2000-01-01 10:00:00 +0900
id: 2, starttime: 2000-01-01 10:00:00 +0900 

このようなレコードがあった時に

Model.where(starttime: Time.parse("2000-01-01 10:00:00 +0900"))

ではid: 1のみの取得となってしまった時があった。

調査

Model.find(1).starttime.to_i
=> 946688400

Model.find(2).starttime.to_i
=> 946688400

は両方同じものが返ってくる。 ということはDB側で値を比較する際に何かが起きている?

解決

とりあえずこれを

Model.where("time(starttime) == ?", Time.parse("2000-01-01 10:00:00").strftime('%H:%M:%S')) 

と記述して、DB側で文字列化し、比較することによって両方とも取得ができた。 でもこれってDBの種類によって挙動が変わる可能性ないのかな?まだまだ調査が必要が感じがする。