OneDay

40歳からプログラマとして生活しています。

2017年にやりたいこと

今週のお題「2017年にやりたいこと」

  • 効率化
  • Scala習得
  • 営業力強化

です。


まず、昨年の抱負とレビューをすると

1. Webサービスを新規で2つやります。
2. 積極的に技術の勉強会に参加します。
3. Ruby/Ruby on Railsに加え、新たな言語習得します。

昨年はフリーランスとして、受託を開始したので年初とは大きく方向性が変わりました。

1は、自分での新規サービスは出来ませんでした。受託を通じて、案件の優れた技術や知識に触れることによって如何に自分が考えていたサービスが不完全かということを再認識。受託に真摯に取り組むことで、技術力アップの方を優先させました。

2は、1年間5つ以上参加したと思います。2017も引き続き参加して、仕事の幅、人との繫がりを広げたいと思います。

3は、Scalaに取り組んでいましたが受託優先で、習得には至りませんでした。案件の切れ目等で再度挑戦するも、新たな案件になって中途半端になるという繰り返しでした。

受託案件をやりはじめ、自分で行っていたサービスを一旦辞めることにしようと思います。
葬送Webサービス ノブレブ https://nograve.net
時間を割くことが出来ないし、なにより自分が生み出したサービスより新たな技術を身に着けたりする方に面白みや可能性を感じるようになったからです。

2017年は2016年の経験と反省をベースにして出てきたキーワードが冒頭の効率化、続Scala習得、営業力強化になります。

効率化
自営業なので、定時という概念がありません。ただひたすらコードを書いて、トイレと食事のときだけ休憩という日も多々あります。土日が潰れた週も多々ありました。
今年は1日8時間という仕事の時間を設定したいと思います。時間に制限を設けないと効率化に意識が行かないし、この調子で仕事していると家族から見放されます。コードを書く段取り等も含め、効率化していき、時間内に終える仕事のスタイルを確立しようと思います。

Scala習得
違う言語を学べば、Rubyやプログラミングにさらに理解が深まる。可能性が広がる。難しいことができれば、お金になる。効率化できた時間で自己投資したいと思います。

営業力強化
去年の案件は懇意にしてくださった会社からの紹介でした。自営業で生きていく以上、その会社にお世話になりつづけるわけにはいかないので自分で仕事を取りにいきます。


一言でいうと自分の仕事を大きくするという極めてシンプルな2017年やりたいことになりますが、日々やっていきます。

Railsのキャンプに行った感想

lp.spartacamp.jp

 
に2/13,2/14,2/20,2/21で行ってきた。
私のスペック : プログラミング歴2年、Rails歴1年。Webアプリケーションを自前で作った経験あり。
 
参加動機 :  書籍とWebで学習したが、一度人を通じて学びたかった。
 
参加までの宿題: Sublime Textインストール、プロゲートというサイトでHTMLとRubyの予習をしておく。

Progate | プログラミングの入門なら基礎から学べるProgate (プロゲート)

 

このキャンプでプログラミングスキルアップとビジネスアイデアを見つけようと気合入っていて、事前の予習も全部やったし、メタプログラミングRuby 第2版を読みなおして望んだ。

 

終えての感想 : 参加者のレベルにばらつきがあり、進行も全体の理解速度よりやや速い程度。Rails歴ある私は、講義内容は私には易しかった。

 

 

得たもの : 独学で身についたスキルは間違っていなかったと確認できた。IT業界の方数名と知り合いになれた。CentOS/Apacheを用いたデプロイ環境の構築、RansackというGemを知る。周りの人に教えることで自分の頭も整理。周りの人のエラー対応フォローで、対応力アップ。実際にはデプロイまで講義は進まなかったが、テキストにあったので終わらせた。

 

ざっくばらんとした感想 : 4日間で税別35,000円のキャンプ、時間あたりにするととてもお得。初学者も受け付けているため、当然間口が広い。当日Macを触るのが初めてという強者も数名いた。ターミナルでのCUIも初めてでしょう。当然だが、その方々には難しすぎたはず。案の定、3日目、4日目では来なくなった方もいた。Rubyの基礎を理解するのに私は何ヶ月もかかったものだ。いきなりRubyを超えて、Railsをやるというのは凄いカリキュラムだ。途中、講義内容についていけない方が私に質問してきた。
 
 
「分からないですが、どうしたらよいですか?」
 
 
基礎部分を飛ばしているから、分からない人には分からないので、こう答えた。「たぶん、この会場でも十分理解出来ている人は少ない。この4日間で繰り返し同じことをやっていくと思うので、流れと繰り返し使うメソッドを覚える。前半と後半の間に平日があるので、そこで復習する。分からないことあったら連絡下さい。平日でも対応しますよ。」 
 
でも、Ruby, Railsを触るのが初めてだったら、質問すらわからないかもしれない。自分の初期を思い出す。何やっているのか分からない。Railsが少しずつ分かり始めたのは実際に自分で何か作り始めた時。Railsのしくみに興味持ち、少しずつ理解が深まったのはメタプログラミングRuby 第2版などの書籍を読みながら、なぜなぜって考えながらコード読んだ時。
 
 
このRailsキャンプの適切なターゲット層は、数ヶ月RubyなりRailsなりを学んだ、または他言語でWebサービスを作ったことがある方々ではないか。まったくの初心者は申し込む前にRubyRailsの本を一冊買って取り組んでみるべき。逆に自分でRailsデプロイ経験ある方はターゲットではない。学びに来たのに、周りの人に教えることになる。
 
 
講師やスタッフには悪意はまったくない。せっかくの貴重な数日を使うキャンプ、参加するからにはアウトプットは大切だ。そんな方に参考になればよい。くれぐれも「なんかスキルが身につくんじゃねー」というノリだけで決定しないように。

Rails SQLite3の挙動確認

lp.spartacamp.jp

に参加していて、2/13、2/14で前半戦終了。2/20、2/21で後半戦。今回のキャンプは平日を5日挟むから、復習予習可能。その際、SQLiteで気になったことがあって、その調査。

気になったこと: databaseをSQLiteを指定し、データベース構築時にlimit制約を設定するが、全く機能しない。

class CreateCustomers < ActiveRecord::Migration
  def change
    create_table :customers do |t|
      t.string :name, null: false, limit: 10
      t.string :email, null: false, limit: 10

      t.timestamps null: false
    end
  end
end

`bin/rake db:migrate`後、nameカラムが11文字以上のレコードを追加時にSQLiteに怒られるはずが、怒られない。

rails new mysqltest -d mysql

で、同様の実験。


ActiveRecord::StatementInvalid in CustomersController#create
Mysql2::Error: Data too long for column 'name' at row 1: INSERT INTO `customers` (`name`, `email`, `created_at`, `updated_at`) VALUES ('aaaaaaaaaaaaa', 'aaaaaaaaaaaaa', '2016-02-18 07:16:42', '2016-02-18 07:16:42')


期待通りにエラーが出た。MySQLは、databaseとmodelのvalidationのダブルで安全性高められるが、SQLiteではこうならない。ちょっとSQLite注意。



他の方も記述されていました。
SQLite3でvarchar型に最大文字数制限ないのね - 日々精進いたします

MySQLMacローカルで使用した際に遭遇したエラー対処
[ERROR! The server quit without updating PID file]
HomebrewでMySQLをセットアップしたらちょろりとハマった - light log

iPhone 修理と断食 の顛末

f:id:walkstepbystep:20160202111735j:plain
iPhone修理の顛末。


2/2 修理依頼  ヤマト運輸引取
2/3 ヤマト運輸 修理センターへの配送終了
2/4 修理センター 受取&修理開始&修理完了
2/5 修理センター 返却手続
2/6 ヤマト運輸 配送 手元に返る


帰って来たiPhoneは紛れも無い私が以前使っていたもの。よって14800円+税金で修理。前回は新品との交換だったので34800円+税金。コストが2万円も違うので開ける時はドキドキした。新品交換と修理ではリードタイムが一日違うみたい。修理の場合は修理後にクリーニング、梱包等のプロセスが入るからだろう。代替だったら、代替え品を送るだけでいいものね。


なぜ、ドキドキか。修理か新品送付かは修理依頼者が選べない。Appleの修理センターが状態を見て判別するから。たいした傷じゃないと本人が思っていても、他の部品に影響がありうると判断されたら、ガラスの取り換えだけでは済まない。


手元に戻ってすぐにアクセサリーを装着。1000円ちょっとで買えるケースに入れるだけでiPhoneが手から滑りそうという事態がなくなった。デザイン的には裸のほうがいいけど、ヒヤヒヤしながら使うよりは精神衛生上良い。



この間、iPhone断食実施。Facebook,Twitter,Instagram等を隙間に見るという習慣からの脱却が出来たような気がする。まぁ一日一回見るくらいでいいんじゃない、と思えてきた。あと自宅での情報収集はスマホよりもPCのほうが良いことに気がついた。ググれるのと、一度に見る情報量はPCのほうが強い。スマホで見るのは、簡潔にまとまったLINE NEWSがいいんじゃないか。



息子が通う保育園からのお便りの中に、スマホを子どもに触らせるのはもちろんのこと、子どもと接する時に親はスマホを触らないようにしようとあった。テレビの見過ぎ等と合わせ、将来コミュニケーション障害の原因になると。確かに子どもが遊んでとせがんでくるときに親がスマホ見ていたら、子どもも悲しいだろう。でも、ちょっと思うのは生まれてからスマホがあった世代に、我々中年の考え方は正しいのか。早い時期からPCに触れさせ、ネットの世界を教える親もいるだろう。子どももあっという間に大きくなる。親として、このスタンスはしっかり考えたいと思う。プログラマとしては一緒に何か作ってみたいとも思うが・・・。


この断食の間、素敵な新刊の情報を得た。嫌われる勇気の続編だろうか。これは即ポチ。
幸せになる勇気

iPhone断食 一日目の感 スマホ依存症な自分の再確認

f:id:walkstepbystep:20140424004455j:plain

iPhoneを修理に出し、私の生活からスマホが無くなった。ちなみに私は自営で家でコード書いている。


手元にあるのは、MacBookKindleと書籍。IT機器が皆無ということではないが、スマホ依存だった自分の生活態度を振り返るには良い機会だ。階段の登り降り、ベットに入って寝付くまで、トイレの大はもちろん、隙間時間を情報収集に当てている。かといって、ニュースアプリでニュース記事を乱読したり、FacebookTwitterの記事を追いかけるのが主だ。


仕事をしていてもスマホに手が伸びる。一時間に一度や二度ではない。そして、仕事が中断する。思考が中断する。(まぁ、PCを相手にしていても同じだけど。。。)旬な情報は手に入るとしても、それが自分の脳の筋肉になっている実感はない。プログラミングで脳に負荷をかけているため、スマホに走るのは、脳が脱線したがっているのかもしれない。


スマホがない生活をして、いつでもどこでも何かしら情報を得ようとするスマホ依存な自分を再発見できた。一日24時間しかなく、睡眠時間や子育ての時間を省くとプログラミングや仕事にあてられる時間は少ない。だから、この習慣は外せない。だけど質を見直せる。FacebookTwitterのタイムラインを見るのは一日一回にするなど。


あとスマホの画面の小ささを再確認できる。高解像度で見やすいといってもRetinaMacで見たほうが楽だ。


断食して気づいたこと。

  • スマホよりPCの方が一度に多くの情報とれる。すぐググれるというのはPCの強み。
  • 隙間時間をどう活用するか、ちゃんと考えるべき
  • たまにはIT断食するのも良い



本日は、アドラーの本を少々とメタプログラミングRubyを読んで思考。今月行くRuby on Railsのキャンプに向けた予習だが、近頃ScalaばかりやっていたのでRuby学ぶの楽しい。
lp.spartacamp.jp

メタプログラミングRuby 第2版

メタプログラミングRuby 第2版

アドラー 人生を生き抜く心理学 NHKブックス

アドラー 人生を生き抜く心理学 NHKブックス

iPhone修理2度目。だからiPhone断食をする

f:id:walkstepbystep:20160202111735j:plain
数年前まで某電機メーカーでパソコンに関わる部署で働いていた。ある日、MacBook Pro Retinaを手にした。自社に関連のあったWindowsに愛想が尽き、Apple信者になるのにそう日数はかからなかった。iPhoneiPadMacBook以前から使用して、Appleすげーとは思っていたのだが、本当に好きになったのはMacBookからだ。


Apple好きなのだが、残念ながらiPhone6Sは批判したい。手元から滑り、そして落ちやすい。昨日落とした時にひびが入っていた。
f:id:walkstepbystep:20160202162210j:plain
デザイン、薄さが秀逸なのは認める。しかし、ここまでユーザーに優しくない作りは何なのだ。夫婦でそれぞれ6Sを持っているが何度手元から落ちたか。その都度ヒビが入ったりして、残念な気分になる。ネット上で「iPhone ひび」等で検索するとひびが入ったり、割れたりするユーザーを多く見つけられる。また、液晶を保護する商品が同じく検索結果に出て来る。


私たち夫婦だけでない。iPhone6や6Sは滑りやすい、落ちやすい商品だ。


商品というのは、多くの関係者の思いの産物だ。Appleは製品数が限りなく少ないので、1つの製品に多くの思いが凝縮されている。デザインしかりで、裸が一番良い。車も電気製品も買ったまま、アクセサリーを付けずに使うのが好きだ。でも、落として残念な思いをするのはもう嫌だ。


電化製品でも、あのメーカーの商品は壊れやすいとか、ソニータイマーが入っているとか揶揄されているが今回のiPhone6, iPhone6Sの壊れやすさは、この揶揄に値する。次のiPhoneに無線で充電という機能云々あるが、まずは裸で持てるくらい強くしてくれ。



修理2回目なので、Appleへの修理依頼も迅速に淡々と。掛かる費用は仕方がない。
iPhone6S 液晶にヒビ キャリア softbank - ノグレブ管理人のblog


Sim抜いて、初期化して渡さないといけないため、復元した場合に単純に復元できないアプリの復元方法を確認する。私の場合はGoogle AuthenticatorとAWSのMFAだった。Google Authenticatorは以下画面から「別の携帯端末に移動」から手続きすればよい。念のためにバックアップコードは印刷しておく。
Sign in - Google Accounts


AWSのMFAはGoogle Authenticatorを使用していたものなので、以下URLを参考にMFAを解除する。機種変更の場合は手元に古い機種を用いて、root権限にログインして、変更をすることが可能だが、修理では手元に古い機種がなくこの対応が不可能なので、一度解除して再度登録というプロセスを踏む。


前回は、Softbankに代替機を頼んだが、代替機を復元してとかやっていると結構時間がとられる。せいぜい1週間だ、代替機は借りずにiPhone断食する。そして、帰って来たiPhoneにはアクセサリ装着する。
ところで、各キャリアはiPhoneの新機種が出ると下取りを行う。街の修理屋に出すとどうなるのか、ググってみると非正規で修理したものは下取りで値が付かないようだ。改造扱いになるみたい。
ドコモのiPhone下取りプログラムについて質問です。 - 非正規の業者での... - Yahoo!知恵袋






まとめ

  • iPhone6, 6Sは滑りやすい、液晶割れやすい。
  • 割れたら、仕方がない。たんたんと修理依頼。
  • 裸で持てるiPhoneを出してくれ。
  • 修理期間、代替機を用意せずスマホなしの生活を体験してみよう



今回買ったアクセサリ

高階関数分かってきた気がする、Ruby関数定義するときにcurry使えそう - Scala, Ruby

EXERCISE 2.5 (34ページ)
2つの関数を合成する高階関数を実装せよ

def compose[A, B, C](f: B => C, g: A => B): A => C

高階関数とは、他の関数を引数として受け取る関数のこと。
テキストでは、メソッドに関数を定義して、それを別のメソッドで呼び出す例がある。

object MyModule {
    def factorial2(n: Int): Int ={
        var acc = 1
        var i = n
        while (i > 0) { acc *= i; i -= 1}
        acc
    }

    def formatResult(name: String, n: Int, f: Int => Int) = {
        val msg ="The %s of %d is %d."
        msg.format(name, n, f(n))
    }

    def main(args: Array[String]): Unit = {
         println(formatResult("factorial", 7, factorial2))
    }
}

このコードを実行すると下記が返る。

res3: String = The factorial of 7 is 5040.

MyModuleのformatResultメソッドの引数の中にf: Int => Intという関数が入っている。ある数字が関数によって変化した値が返る。この例では関数にfactorial2を指定している。factorial2は入力する数字までを乗算する関数。5を入れると 5 * 5 * 3 * 2 * 1の値を返す。つまり、formatResultメソッド(関数)の引数としてfactorial2(関数)を受け取っている。こういうのを高階関数という。



最初のEXERCISE 2.5に戻る。

def compose[A, B, C](f: B => C, g: A => B): A => C

compose関数の引数にはfとgの関数が2つある。
この関数の返り値もまた関数であり、A型の値を入れるとC型の値を返す関数となる。

実装していく。右辺のAは、A型の値aで、Cはf:B=>Cから取得。

def compose[A, B, C](f: B => C, g: A => B): A => C =
    a: A => f(b:B)

次に右辺のBはg:A => Bから取得。

def compose[A, B, C](f: B => C, g: A => B): A => C =
    a: A => f(g(a:A))

型は推測可能なので省略。

def compose[A, B, C](f: B => C, g: A => B): A => C =
    a => f(g(a))

関数の中に関数があるという実装になる。REPLを用いて、使い方を確認してみる。

scala> val calc1 = (x:Int) => x * x
calc1: Int => Int = <function1>

scala> val calc2= (x:Int) => "Result: " +  x
calc2: Int => String = <function1>

scala> val result = compose(calc2, calc1)
result: Int => String = <function1>

scala> result(10)
res8: String = Result: 100

compose関数の引数の順序を変えてみると怒られる。関数の順序は意識するようにしよう。

scala> val result = compose(calc1, calc2)
<console>:13: error: type mismatch;
 found   : Int => Int
 required: String => Int
       val result = compose(calc1, calc2)


ここでやったcomposeというメソッドScalaの標準ライブラリで実装されている。andThenというメソッドは関数の順序を意識したメソッドネーミングのように見える。「この関数の次は、この関数」ということを考えるとandThenを使ったほうが理解しやすいかもしれない。

scala> val compose_1 = calc2 compose calc1
compose_1: Int => String = <function1>

scala> compose_1(10)
res9: String = Result: 100


scala> val compose_2 = calc1 andThen calc2
compose_2: Int => String = <function1>

scala> compose_2(10)
res11: String = Result: 100


これをRubyでもやってみる。

[1] pry(main)> compose_setting =->(f,g,a){f.(g.(a))}
=> #<Proc:0x007fb32d8cbf80@(pry):1 (lambda)>
[2] pry(main)> compose_curry = compose_setting.curry
=> #<Proc:0x007fb32d8f2ea0 (lambda)>
[3] pry(main)> calc1 =->(x){ x * x }
=> #<Proc:0x007fb32d919c30@(pry):3 (lambda)>
[4] pry(main)> calc2 =->(x){ "Result: " + x.to_s }
=> #<Proc:0x007fb32cd282c8@(pry):4 (lambda)>
[5] pry(main)> compose = compose_curry.(calc2).(calc1)
=> #<Proc:0x007fb32f66b2e8 (lambda)>
[6] pry(main)> compose.(10)
=> "Result: 100"

Scalaだとこの関数合成のときに引数を気にしなくても 関数a と 関数bを合成して関数cを作ることができる。関数cに適切な引数をもって実行すると適切な値が返る。一方Rubyではlambda式を用いたが、compose関数を実装するにあたって、予めcompose関数の引数をセットしなければならない。pry[1]の行がそれを表している。fとgが関数でaが引数。

pry[1] : ブロックの引数を(関数1, 関数2, 合成した関数の引数)とし、->(f,g,a){f.(g.(a))}としている。このf.(g.(a))という書き方はprocオブジェクトを呼び出すcallメソッドシンタックスシュガーなので、もともとはf.call(g.call(a))である。[]を用いてf[g[a]]でもよい。

pry[2]: ここでいきなりcurry化し、それをcompose_curryというオブジェクトにしている。curry化すれば最初から任意の引数まで内包したオブジェクトにすることができる。curryについては、昨日記したエントリーをご参照下さい。curryが良くわからなかったので、ひたすら引用したら少し見えてきた -Scala, Ruby - ノグレブ管理人のblog何が嬉しいかというと合成した関数の引数だけを引数とした関数にすることができる。

pry[3]: pry[4]: compose関数に取り込みたい関数2つ

pry[5]: compose = compose_curry.(calc2).(calc1) でcompose_settingの最初2つの関数まで内包したcompose関数の出来上がり。

pry[6]: compose.(10) でcompose関数に10を入れているようになる。 curryは引数数を見ていて、curry元の引数数分callされるとcurry元のブロックが評価される。ここではcurry元 compose_settingの引数は 3つ。 composeは引数2つcurry化し、残り1つ。 compose.(10)で最後の1つが呼び出され、引数数が揃うのでcompose_setting関数が呼び出される。