雑草SEの備忘録

東大を卒業し、SEとして働くことになった。備忘録的に作業を綴る。

PumaのThread数を確認する

pumaのプロセスIDを確認する

$ ps aux | grep puma
healthd   2215  0.0  1.9 814768 39676 ?        Ssl  Feb26   2:41 puma 2.11.1 (tcp://127.0.0.1:22221) [healthd]
root      4816  0.0  0.1  58788  2744 ?        Ss   20:13   0:00 su -s /bin/bash -c bundle exec puma -C /opt/elasticbeanstalk/support/conf/pumaconf.rb webapp
webapp    4857  1.8  1.2 108468 25296 ?        Ssl  20:13   0:00 puma 3.12.0 (unix:///var/run/puma/my_app.sock) [current]
webapp    4860 17.6  5.9 1347812 119492 ?      Sl   20:13   0:03 puma: cluster worker 0: 4857 [current]
webapp    4864 17.3  5.7 1345368 114504 ?      Sl   20:13   0:03 puma: cluster worker 1: 4857 [current]
ec2-user  4918  0.0  0.1 110536  2204 pts/0    S+   20:13   0:00 grep --color=auto puma

/proc/プロセスID/statusを見る

$ grep Threads /proc/4860/status
Threads:    17

CapybaraでのJavaScriptのconsole.logを見る方法

確認したい箇所で、puts page.driver.browser.manage.logs.get(:browser) を記述。

fill_in 'order[family_name]', with: '佐藤'

puts page.driver.browser.manage.logs.get(:browser)

expect(page).to have_field('order[email]')

ただし、JavaScript側でconsole.logだと表示されない。この場合、console.warnconsole.errorを用いる。

const successFn = (r) => {
  console.warn("sample text")
}
//=> WARNING 2018-11-17 18:32:32 +0900: http://127.0.0.1:54321/assets/packed/sample_json-a01eb4d84f09eb434050cd758dafbf3bf1451fe65aaea47dc1bf95754c1b6dc2.js 38037:14 "sample text"

未経験者がネットワークスペシャリスト試験に合格するまでの道のり

12月21日は平成30年度のネットワークスペシャリスト試験の合格発表の日でした。
高度試験は、概ね合格発表の週の火曜日に解答例が発表され、私はすでに自己採点をしていました。
成績は、以下でした。

f:id:smartenergy:20181230181322p:plain
ネットワークスペシャリスト試験の成績

午後Ⅱが60点で本当にギリギリの点数での合格でした。1点で合否が分かれるので資格試験とは怖いものです。
個人的には午後IIの方が午後Iよりできた気がしました。午後Iが受かっていれば合格できているだろうと。しかし、結果を見ると午後IIの方が悪かった。もしかしたら、午後IIは途中退室したのがよくなかったかもしれません。途中退室するしないで採点が別れるとは考えにくいですが、できれば途中退室せずに最後まであがくことをお勧めします。


実は、この試験、今年で3回目の挑戦でした。2014年の秋に基本情報、2015年の春にデータベーススペシャリストを1回の受験で合格したのち、2016年、2017年とネットワークスペシャリスト試験を受けてきましたが、受かることができていなかったので、今年こそは何としても合格したいと思っていました。
私はエンジニアとして働いていますが、もともとは情報系ではないので情報系の素養はゼロ。その中でこの業界で働いていくためには、こうした資格を取得することで外部に対して自分の基礎スキルをアピールしていかなければなりません。データベーススペシャリストとネットワークスペシャリストを取ったことで、IT技術者として最低限のレベルにはあるということを示せたのではないかと思っています。

ネットワークスペシャリストの勉強にあたってはだいぶ遠回りをしてしまいました。
データベーススペシャリスト試験では、ICTワークショップシリーズの参考書で勉強したので、2年前は同じようにこちらの本を購入しました。

情報処理教科書 ネットワークスペシャリスト 2018年版

しかし、この本は、基礎編と応用編に分かれており、基礎編はWebのPDFでの提供。紙媒体で読むことを好む私にはまったく合いませんでした。特に、ネットワーク未経験者ですので、基礎からきっちりと学びたいので紙媒体での提供は必須です。(書き込みなどをするため)

1年目はこの本と過去問だけで挑み、撃沈しました。
2年目で手にしたのが、ネスペの基礎力という本です。

この本は、題名の通り基礎から解説してあります。また、2年目の私は少しは知識はついていたので、この本により、断片的な知識をより体系的に学ぶことができました。ネスペの基礎力は、本文中に適度に問や過去問もあり、考えながら理解できるようにしてあるところも良いところです。
基本情報処理に合格する程度のネットワークの知識がある人は、最初はこの本から入っても良いでしょう。
ただし、とはいうものの、ネットワークの知識自体を体系的に記述するのが難しいということもあり、この本を読んでも理解が十分にできない箇所もあります。このあたりについては、私自身、Qiitaの記事などで今後公開していければいいなと思っています。

調べてみると、ネスペの基礎力の著者である、左門至峰さんは、ネスペ、セキュスペ界隈では有名な人でブログや多くの書籍などでネスペ、セキュスペの勉強法について解説しています。

本屋で立ち読みした中でも、過去問の解説が一番しっくりきたので、左門至峰さんの過去問の解説本を買い、過去問についてはこちらで勉強しました。

ネスペ 29 魂 -ネットワークスペシャリストの最も詳しい過去問解説

(平成28年度に関しては、前述のネスペの基礎力にて解説)
ネスペ 27 礎 -ネットワークスペシャリストの最も詳しい過去問解説 (情報処理技術者試験)

ネスペ 26 道 -ネットワークスペシャリストの最も詳しい過去問解説 (情報処理技術者試験)

ネスぺの剣25 ~ネットワークスペシャリストの最も詳しい過去問解説 (情報処理技術者試験)

過去問を解いた量は、基本的に毎年、5年分を1周ずつ解きました。すなわち、3年間では5年分を3周したことになります。左門さんの書籍の中にも過去4年分を3回解くといったことことが書かれているので、最初の年から5年分を3回解くことができればもっと早く合格できたかもしれません。
とはいえ、データベーススペシャリストを取得した時はSIerに所属しており、比較的時間に余裕があり業務時間中も勉強をしていたりしたのに比べ、ベンチャーへ転職してからは常に人手不足で勉強する時間が土日(土日も休日出勤などで片方が潰れる)しかとれないという状況ではなかなか集中的に勉強する時間はとれませんでした。
優秀な人であれば効率よく勉強できたりするのかもしれませんが、要領の悪い私にはこの勉強量では厳しかったのだと思います。

ネットワークスペシャリストを受ける前までは、「マスタリングTCP/IPを一通り読むだけで合格できる」などといった人もいましたが、よくよく考えれば彼は情報系の学部出身で、素養があったのだと思います。情報系の知識未経験者が社会人になってから勉強するには、ネットワークはなかなか難しいです。
データベーススペシャリストとの決定的な違いは、ネットワークスペシャリストの方が覚える量が圧倒的に多いということです。多くのアルファベットの略語が出てきます。似たような概念の言葉が出てきて、それぞれ微妙にカバー範囲が違ったりします。そうした内容を一つ一つ理解していくにはそれなりに経験や時間がいるのだということだと思います。

私がデータベーススペシャリストやネットワークスペシャリストの資格を取る大きな理由は、未経験の分野でも過去問を解くことで疑似体験できるということです。データベーススペシャリストをとったときは、データベース設計なんて業務でしたことがありませんでした。しかし、過去問でこういう業務の時にこういうデータベース設計をするということを学びました。
ネットワークスペシャリストも同じです。ネットワーク設計なんて今までしたことがありませんが、過去問で例をたくさんみることで、ネットワーク設計の感覚をつかむことができます。もちろん、試験に出てくるような設計は滅多にしないという意見もあるかもしれません。現場ではネットワークスペシャリストを持っていない人の方が多いのだから、シンプルに設計すべきということもありえます。
しかし、現場でもっといい設計を思いつきやすくなったり、リードしていけるのは資格を持っていない人より持っている人です。持っていることに損はありません。

また、今後エンジニアとしてシニア層になっていって優秀な若手が台頭してきてそうした資格を持っていたらどうでしょう。現場での経験は豊富だといっても、資格を持っていなければその経験が本当に理論に裏打ちされたものなのか、オレオレ理論で設計してきたのかはわかりません。資格よりも実務の方が大事だという人に言いたいのは、もしその経験が本物であれば、勉強することなく資格試験に受かるはずだということです。中途半端な知識で物事を語っているのであれば、資格試験に合格することはできません。自分の言葉の説得力を高めるために資格の力を借りることは良いことだと思います。

以上、未経験者がネットワークスペシャリスト試験に合格するまでの道のりでした。

Goならわかるシステムプログラミング 14.2.9のReactiveXでpackageのインストールし忘れがち問題

前々回の記事に引き続き、Goならわかるシステムプログラミングの写経を行なっています。



Goならわかるシステムプログラミング

  • 作者: 渋川よしき
  • 出版社/メーカー: Lambda Note
  • 発売日:2017/10/19

何も考えず実行すると、こんな形でエラーが出てきます。

main.go:9:2: cannot find package "github.com/reactivex/rxgo/observable" in any of:
	/usr/local/Cellar/go/1.10.3/libexec/src/github.com/reactivex/rxgo/observable (from $GOROOT)
	/Users/username/go/src/github.com/reactivex/rxgo/observable (from $GOPATH)
main.go:8:2: cannot find package "github.com/reactivex/rxgo/observer" in any of:
	/usr/local/Cellar/go/1.10.3/libexec/src/github.com/reactivex/rxgo/observer (from $GOROOT)
	/Users/username/go/src/github.com/reactivex/rxgo/observer (from $GOPATH)

これは単純にpackageがインストールされていないだけで、

go get -u github.com/reactivex/rxgo

を実行すればエラーが解消されるはずです。

RactiveXのREADEMEに書いてある通りですね。

github.com

vimの置換(%s)で全角数字を半角数字に変換する方法

例えば、とある電気料金の基本料金が次の様になっていて、全角では使いにくいので半角に変換したい。

291円60銭
437円40銭
583円20銭
874円80銭
1,166円40銭
1,458円00銭
1,749円60銭

まず、円や銭やカンマを置換する。パイプ(|)で繋げられる。このとき、`g`の次に`e`とするとエラーを抑制できる。

:%s/円/./ge | %s/銭//ge | %s/,//ge

同様に考えて、一気にパイプでつなげていく。

:%s/0/0/ge | %s/1/1/ge | %s/2/2/ge | %s/3/3/ge | %s/4/4/ge | %s/5/5/ge | %s/6/6/ge | %s/7/7/ge | %s/8/8/ge | %s/9/9/ge

正規表現等を使い、もう少しスマートなやり方がありそうなものだが。

Goならわかるシステムプログラミング 6.6.1のKeep-Alive対応のHTTPサーバーのコードがわかりにくい問題

少し前にはてな界隈でも話題になった、Goならわかるシステムプログラミングという本を写経しています。



Goならわかるシステムプログラミング

  • 作者: 渋川よしき
  • 出版社/メーカー: Lambda Note
  • 発売日:2017/10/19
この本は、Go言語の勉強のために購入したのですが、Go言語というより、HTTPプロトコルなど、比較的程レイヤーの解説および実装となっていて、Go言語の勉強というよりも、TCPとは何か、UDPとは何か、OSにおけるファイルシステムとはどういうものなのかということを学べる書籍となっています。そういう意味で、今まで何気なく使っているものより少し下のレイヤーの技術を勉強するにはもってこいの本だと思います。

その中で、「6.6.1 速度改善(1)」にあるp107ページのコードがあるのですが、「6.5.1 TCPソケットを使ったHTTPサーバー」の差分になっており、差分といってもどこをどう編集すればいいか少し戸惑ったので、diffで表現して見ました。
また、差分表記ではないものは、こちらにあります。

 package main

 import (
     "bufio"
     "fmt"
+    "io"
     "io/ioutil"
     "net"
     "net/http"
     "net/http/httputil"
     "strings"
+    "time"
 )

 func main() {
     listener, err := net.Listen("tcp", "localhost:8888")
     if err != nil {
         panic(err)
     }
     fmt.Println("Server is running at localhost:8888")
     for {
         conn, err := listener.Accept()
         if err != nil {
            panic(err)
         }
-        fmt.Printf("Accept %v\n", conn.RemoteAddr())
-        request, err := http.ReadRequest(
-            bufio.NewReader(conn))
-        if err != nil {
-              panic(err)
-        }
-        dump, err := httputil.DumpRequest(request, true)
-        if err != nil {
-              panic(err)
-        }
-        fmt.Println(string(dump))
-        response := http.Response{
-              StatusCode: 200,
-              ProtoMajor: 1,
-              ProtoMinor: 0,
-              Body:    ioutil.NopCloser(strings.NewReader("Hellow World\n")),
-        }
-        response.Write(conn)
-        conn.Close()
+
+        go func() {
+            defer conn.Close()
+            fmt.Printf("Accept %v\n", conn.RemoteAddr())
+
+            for {
+                conn.SetReadDeadline(time.Now().Add(5 * time.Second))
+                request, err := http.ReadRequest(bufio.NewReader(conn))
+                if err != nil {
+                     neterr, ok := err.(net.Error)
+                     if ok && neterr.Timeout() {
+                          fmt.Println("Timeout")
+                          break
+                     } else if err == io.EOF {
+                          break
+                     }
+                     panic(err)
+                }
+                dump, err := httputil.DumpRequest(request, true)
+                if err != nil {
+                     panic(err)
+                }
+                fmt.Println(string(dump))
+                content := "Hello World\n"
+
+                response := http.Response{
+                     StatusCode:    200,
+                     ProtoMajor:    1,
+                     ProtoMinor:    1,
+                     ContentLength: int64(len(content)),
+                     Body: ioutil.NopCloser(
+                          strings.NewReader(content)),
+                }
+                response.Write(conn)
+            }
+        }()
     }
 }

Androidのアプリ開発を自走できるようになるまで

このブログを書くのもかなり久しぶりになってしまいました。
最近は技術系の話はQiitaに書くようになって、個人ブログは放置している状態なのですが、今回はコラム的なものなのでこちらで書きたいと思います。

 

かれこれRailsの仕事を初めてもうすぐ3年になります。ベンチャー企業で働くと時が経つのが早いです。

と同時に3年もRailsの仕事を続けているのかという驚きもあります。

と言っても最近はGoogle spreadsheetとにらめっこしたり、Google presentationとにらめっこする日々も多く、気づいたらcommitしていないという日も何度かあり、プライベートで作業しているリポジトリも諸般の事情によりbitbucketを利用していたりするのでGitHubに草がつかないということが出て来るようになりました。

 

さて、そろそろ新しいこともしたいなと思い、業務の合間にRails以外の勉強もしていて、6月にはcouseraのdeeplearning コースを3〜4ヶ月かけて修了するなどを行っていたのですが、まずは広く浅く学んでみようということで、Androidアプリ開発の勉強も本格的に着手しました。

 

今日は、Androidのアプリ開発を学び始め、ある程度自分で調べて実装できるようになる(自走できる)までどう勉強したかを述べたいと思います。

 

Androidアプリ自体は、昨年お6月から今年の3月ぐらいまでよちよち.kotlinという勉強会を開催しており、そこで経験者をお招きし、kotlinおよびAndroidの勉強をしていました。

とはいうものの、簡単なゲームアプリを作って公開した程度で、画面も一つしかなく、Androidの基本的なことを知らないまま開発してしまったので、基礎からきちんと学びたいなと思っていました。

まず、Androidアプリ開発をインターネットの情報で勉強するのは初心者にはなかなか至難の技だと思います。というのもAndroid自体は結構前から普及しており、かつ進化も早いため、「Androidアプリ開発勉強法まとめ!」といった記事でも紹介されているサイトが数年前のものだったり、レガシーな情報だったりするものが多いです。

初心者にとってこれをやればOKみたいなものはAndroidに関しては見つけにくいのが現状だと思います。iOSはAppleがSwift Playgroundsなどを提供してくれているのでその点勉強しやすいかと思いますが、Androidはなかなか手強い。Googleの公式ドキュメントも初心者からしてみれば全く何が書いてあるかわからないと思います。少なくとも私はわからなかった。

また、最近はweb開発ややアプリ開発の教室もあるのですが、なかなか高額でかつ時間も取れないということで休日や平日の夜に勉強できるのならばやはり書籍を買って最初から最後までやり遂げるということが大切だと思っていました。受験生の時も多くの参考書を買うのではなく、一つの参考書を何回もやるというのは鉄則です。(私は他の参考書にも浮気していたから成績が悪かった)

 

そこで、丸善やジュンク堂といった本屋に行き、Androidアプリの開発入門的な本を探して見ました。

探すポイントとしては、

出版時期が比較的新しい

前述の通り、進化がとても早いので1年前に出版された情報ですら、最新の環境では状況が違ったりします。

Android Studioの最新版に対応している(2018/8/6現在ではAndroid Studio 3です)

Android StudioはAndroidの統合開発環境なのですが、年1ぐらいでバージョンアップされるので、バージョンが違うとやはり勝手が違ったりします。

レイアウトに関する説明がある

 Androidのデザインの概念を簡単でもいいので記述してくれてあり、概要がわかるものがいいです。また、Android Studioでは、部品をドラッグ&ドロップなどしてGUIで直感的に配置できるのですが、書籍によってはレイアウトファイル(xmlファイル)を載せているだけでGUIの操作方法などを説明してくれていないものもあります。Googleもxmlファイルの記述は不要というプレゼンをしているので、できるかぎりGUIで説明しているものを選ぶといいと思います。ただし、GUIでの説明は画像をふんだんに使う必要があって説明や編集が大変だったりするので丁寧に説明してくれているものが少ない印象です。

サンプルアプリがあって写経できる

プログラミングの学習方法の一つは写経だと思うのですが、きちんと動くコードがあって写経できるものがいいと思います。また、完成品をバンと載せるのではなく、適宜実行できて一つ一つ何をやっているのかがわかる書籍がおすすめです。

kotlinで説明をしてくれている

GoogleがAndroidの開発言語として指定してはや1年以上がたちました。まだまだJavaで開発している現場も多いと思いますが、今後はkotlinがメインになってくるでしょう。であれば、kotlinで説明している書籍が良いと思います。ただし、Javaの知識が不要ということは決してありません。私は新卒で入社した会社でJavaを学んだので基本的なところが把握していましたが、kotlinと並行してJavaも学んでおいたほうが良いでしょう。

 

そんな観点から本屋で漁っていると、比較的最近出版された本で以下の本が見つかりました。 

基本からしっかり身につくAndroidアプリ開発入門 Android Studio 3対応

2018年5月22日発売で比較的新しく、kotlinで解説、Anroid Studioも3系に対応しています。

amazonのレビューを見るとなかなか辛辣な意見もあるのですが、立ち読みして雰囲気悪くなかったので、購入しました。

そして、3週間ほどかけて、すべて写経し終えることができました。改めて、この本のいいところは、

・レイアウトをGUIで説明してくれている

・フラグメント、API通信などアプリで使う基本的なことを解説してくれている

・加えて、JobSchedulerなどバックグラウンドでの処理の仕方も説明がある

などだと思います。今まで断片的に知っていて、Androidについてもやもやしていたところがある程度クリアになったという印象です。

一方で人によっては物足りないかもなと思うのは、

・Retrofit2やormaなどのよく使われるライブラリに関する説明はない

・kotlinで記述されているが、kotlinの良さを最大限に発揮した書き方ではない

・テストの書き方がない

というところです。ただ、安易に外部ライブラリに頼らず最初は初めから組み込まれているもので実装するというのもいい経験だと思うので、入門書としてはいいのではないかと思います。

またkotlinに関しても、あまりkotlin固有のテクニックを使ってしまうと、巷に溢れている情報はまだまだJavaのものも多いので、Javaとの行き来が難しくなってしまうので、これはこれでわかりやすいと思いました。

 

個人的には、この本に加えて、日本語での初のkotlin解説本も読むといいともいます。実は、私は昨年の5月にKotlinスタートブックを購入し、Androidアプリ開発勉強しようと思って読み始め、写経もしたのですが、ちんぷんかんぷんでした。この本は、一通りJavaでAndroid開発できる人向けで、一からAndroidアプリ開発をしようという人向けではないと思います。kotlinの言語仕様を学ぶにはいいかと思いますが、Androidアプリ開発の最初の入門書には向いていません。

ただし、前述した「基本からしっかり身につくAndroidアプリ開発入門 Android Studio 3対応」の物足りないなと思う部分をいくつかカバーしてくれており、私は「基礎から身につく〜」をやってから改めてKotlinスタートブックのAndroidアプリの部分を読んで、ListViewつかっていたところをRecyclerViewに書き直すなど自分風にアレンジしつつ、4時間ほどで読み直せたので、やはり1年前に私にはAndroidの基本的なところが身についていなかったようです。

Kotlinスタートブック -新しいAndroidプログラミング

 今は、オリジナルのアプリを作っている最中で、必ずしも本に出てきたことだけで実装が完了するわけではないものの、google先生に聞けばなんとか先に進めるという状況までなりました。自走できるようになったわけです。

ただし、今の状態ではまだまだ仕事で使えるレベルではなく、アーキテクチャはどうすればいいとか、動くものはできたけどより良い設計はどうあるべきかなどはまだまだこれからといった形です。

 

もし学生の方でAndroidアプリ開発を仕事にしてみたいというのであれば、本を1冊やりきり、オリジナルのアプリでも一つぐらい作ってどこかのベンチャー企業にインターンやアルバイトといったかたちで応募すればお金をもらいながら経験を積めると思います。やはりお金を払って学ぶよりお金をもらいながら学ぶ方が良いですからね。。

 

最後に、Androidを学ぶ上で大事なのは、Androidのオキテに沿って実装する必要があるということ。一からプログラミングをするときは、自分が書くコードがすべてですが、Androidはある種のフレームワークのようなもので、すでに多くのコードがそこにあり、使いたいものを適宜持ってきて使うという感じになります。なので、例えばRecyclerViewを使いたいならば、適切にメソッドをオーバーライドして、自分のアプリに合うようにカスタマイズするという形です。そこに難解なアルゴリズムは存在しません。あるのは、いかにGoogleが指示するように実装していくかです。最初のうちはそれに対してあまり深いことを考えてはいけません。

例えばActivityを作るとonCreateというメソッドをオーバライドしなければいけないのですが、onCreateが実際にどういう実装で使われているのかを追っていては先に進めません。Activityにはライフサイクルがあって、onCreateはこのタイミングで呼ばれるメソッドであるということを盲目的に知識としてインプットします。

実は、2014年頃、新卒の研修でJavaを勉強し、Androidアプリ開発できるようになったぞ!と思って本を一冊買って挫折したことがあります。このときは、ここで内部実装まで考えてしまい、なんでonCreateなの?どういうカラクリで動いてるの?などと考えてしまっておりました。そしてもうわからーん!となったわけです。

この辺りはそういうものだと思って先にするむのが吉です。おそらく理解はあとからついてきますし、場合によっては理解しなくてもAndroidのオキテを把握して置くだけで十分なときもあるでしょう。

 

では、快適なAndroidアプリ開発ライフを〜!

 

2018.8.19 追記)

久しぶりに技術書を頭からきちんとやって、間違いもいくつか見つかったので、出版社にお伝えしたところ、公式サイトにも正誤表を載せていただけました。大きな間違いではないので、あまり困ることはないかもしれませんが、参考にしていただければ幸いです。

SBクリエイティブ:【正誤情報】『基本からしっかり身につくAndroidアプリ開発入門 Android Studio 3.x対応』