文系コボラーが初めてiOSアプリ開発に挑戦し、Web系エンジニアになった日記

文系コボラーがほぼ独学でiOSアプリを作ってみました。 -> iOS/Androidエンジニア -> Web系エンジニアになるまでの日記。

この2年半の出来事

すごく久しぶりの投稿です。

前回の投稿が2015年11月なので、2年半ちょっと空いたことになりますね…

この2年半どうだったかというところから、現在の状況について書きたいと思います。

前回の投稿時点での状況

前回投稿時点では、COBOLをメインとしたSESでの仕事が嫌になり、
モバイルアプリを自社開発している会社への転職が決まったところで記事が終わっていました。

モバイルアプリエンジニアへの転職後

さて、晴れてモバイルアプリエンジニアへの転職を果たし、toC向けのサービスの開発に携われることになったわけですが、
そこでの仕事内容は 既にある程度テンプレート化されているアプリの内容とデザインを変えて、アプリを量産する仕事 でした。
最初の数ヶ月はアプリ開発自体のスピード感もあり割と楽しくやっていたのですが、
ある程度すると飽きてきちゃいまして…
で、最終的にもう少しちゃんと エンジニアリングがしたい という思いから、再び転職先を探し始めました。

再びの転職活動

とはいっても、まだまだ本格的に転職するつもりはそこまでなくて、なんとなく転職先を物色している最中、
とある求人媒体経由でAIベンチャー企業のCTOからメッセージが届きます。
最初はそこまで本気では無かったのですが、なんとなく AIってどんなことやってるんだろう という軽い気持ちから
メッセージをやり取りし、軽く会って話を聞いてみることになりました。

思った以上に面白そう

いざ話を聞いてみると、

  • 開発チームの権限や裁量
  • 作っているプロダクトの内容
  • 会社として、エンジニアリングに対する考え方

などなど、その時の会社に比べて非常に魅力的に映りました。

その後もその会社で実際に働いている人たちと会わせてもらったりなど、色々と知っていくうちに
次第に この会社に入社したい と思うように。

入社してみた

で、結局そのAIベンチャーに入社することになりました。

現在もそのAIベンチャーに所属していますが、色々と思うところがあり再び新天地を求めて彷徨い始めました…
(あまり詳しくは書けませんが、会社の方向性と自分の目指す方向性が違ってきた、というのが大きな理由です。)

転職活動の新しいカタチ

もともとCOBOL使いでコボラーとしてSIerで、いわゆる SE として働いていましたが、
ここ数年モバイルアプリエンジニアやAIを使ったWebバックエンドエンジニアなど、様々な経験を積ませて頂いたこともあり、
今回の転職では通常の 転職サイトやエージェント 経由での転職は選択肢にありませんでした。

最近ではTwitter転職やリファラル採用など、ちょっとソーシャル要素が強い転職活動がWebエンジニア界隈では割と多いようで、
私もその流れに乗っかってみようかなと思い、今回転職サイトへは登録しない形で方法を探していました。

そんな中、ふとQiitaかなんかの広告で目に留まったのが 転職ドラフト でした。

なんと、その人のスキルセット(経歴レジュメ)のみで、 企業側から 年収額が提示された指名が来るという何ともすごい仕組みでした。

今回はこのサービスを使って転職しようと思い、転職ドラフトに登録することに。

転職ドラフトに登録してみた

さて、転職ドラフトにいざ登録してみました。
"よし、いっちょレジュメとやらを書いてみるか" と意気込んだものの、
いざレジュメページを見ると、かなりガチで書かなきゃいけないっぽい…

ただ、それは その人のスキルセット(経歴レジュメ)のみで、企業側から年収額が提示 されるという特性のため、
レジュメが判断材料としてかなり重要な位置付けになるから仕方ないのかなと思い直し作成開始。

3日くらいかけてとりあえずのアウトラインを完成させ、保存ボタンを押した。

すると、なぜか良くわからないが 審査中 みたいなステータスに…

どうやらレジュメを記載し保存すると、自動で運営による審査に係るという仕組みらしい。
まぁ勝手に審査してくれるなら良いかと思い、そのまま放置。

しばらくすると、 審査合格 という連絡が来て、 あなたは次回ドラフトに参加可能 とのこと。

ただ、ドラフトが奇数月に一回という少し長いスパンになるため、長いと1ヶ月以上待つことになる。
今回の場合は2-3週間程度の待ちでしたが、コレが結構長く感じる。

ひたすら1日ずつ、"開催日はまだか" と思いながら過ごし、いざ開催日を向かえることに…

開催日を迎えて

いざ開催日を向かえると、転職ドラフトのトップページ上で
〇〇会社が 800万で ID:hogehoge を指名しました!
みたいなタイムラインが流れてて、もうテンション最高潮!

自分もいつ指名されるのかとワクワクして待ちます。

...が、何日経っても一向に指名が来ない。

"やはり自分の実力じゃどこも必要としていないのか…"

と気を落としていたところ、開始から1週間後に初の指名が…!

その後はあれよあれよと言う間に、合計8社からの指名を頂くことが出来ました。

転職活動の行方

転職ドラフトで多くの企業に指名を頂き、そのうち少しでも興味のある企業へは話を聞きに行ってみることにしました。
色々な企業に話を聞いた結果、転職ドラフトで指名頂いた企業のうち、
やりたい事と諸々の条件が一番良かった企業に内定を頂いたので、
そこに入社することに決めました。

というわけで、来月からはまた別の企業でエンジニアとして働くことになります。

転職ドラフトを使って感じたこと

転職ドラフト、このサービスは本当にエンジニアにとってメリットしか無いサービスだと思います。
例えば、通常であれば 前職年収 を考慮して次の年収が決まることが多いと思いますが、
それって本質的にはやっぱりおかしくて、 前職年収は前職での企業内評価基準に応じた収入 であって、
その人の仕事に対する価値 では無いと思うんです。

本来は その人がどれだけの仕事ができるか によって 絶対値 で収入が提示されるべきだと思うので、
その点転職ドラフトでは 前年収を企業側に提示しない 前提となっているため、非常に素晴らしいと思います。

また、その人がどれだけの指名をもらっていて、どれだけの額で指名されているかがオープンになっているので
透明性が非常に高いことに加え、具体的な金額付きで指名されることでその人の エンジニアとしての市場価値に対する自信
みたいなものにも寄与すると感じます。

まとめ

エンジニアとして働いているなら、とりあえず転職ドラフトに登録・参加して
まずは自分の市場価値を知っておいた方が良いと思います。
特にSESとかで搾取されて働いているエンジニアは、他の選択肢が見えなくなりがちなので
一度世の中の市場に自分を曝け出してみても良いのではないかなと思います。

※こちらの記事は転職ドラフト体験談投稿キャンペーンに参加していますが、
転職ドラフトに肩入れするつもりはなく、いちエンジニアとして純粋に素晴らしいサービスだと思った末の感想です。

コボラーから元コボラーへ

久々すぎるエントリですみません。

ここ1ヶ月ほどで色々あり、結果としてコボラーやめる…もとい退職することになりました。

退職に至った理由としては、一言でいうとSI業界じゃないところで
エンジニアとしてモノづくりがしたくなったというところです。

今の職場は1000人規模の割と大きなSIerなのですが、
やってることは他のSIerと大して変わらず、
客先常駐という名の人月商売です。

客先で巨大なシステムの一部分だけを作ったり、
業務知識という名のシステム仕様を覚えたり、
下請けの管理したりといった、
いわゆるSIerのSEとしてではなく、いちエンジニアとして成長したいと思い、退職することにしました。

次は社員数一桁のスタートアップで、スマートフォンアプリとかWebとかを作るエンジニアになります。


というわけで、近々コボラー卒業してしまうので、
このブログは「元コボラー」となります。


次の職場はまだSwiftではなく、Objective-Cなので、勉強しなきゃなぁ…

RealmでGMSPolylineを保存する

久しぶりのpostです。

仕事やらプライベートやらが忙しかったという言い訳のもと、更新をサボってました。。。
 
さて、肝心のアプリはそれなりに出来てきていて、
あとはバックグラウンドでの位置情報取得が実装出来れば、
一旦リリースできるかもしれません。
 

RealmでGMSPolylineを保存する

移動ルートをGoogleMapSDKのGMSPolyline で描画しているのですが、それをRealmでローカルに保存して、履歴として表示するようにしています。
 
GMSPolyline 自体はただのlatitudeとlongitudeの集合なので、RealmオブジェクトのサブクラスとしてDouble型を2つ、latitude,longitudeとしてそれぞれ格納しておくクラスをつくり、
それをメインのRealmオブジェクトにList型で定義してあげれば良いです。

 

 

class Record: Object {

    dynamic var seqNo: Int = 0

    let polyLine = List<PolylineArray>()

}

class PolylineArray: Object {

    dynamic var poliLineLatitude: Double = 0

    dynamic var poliLineLongitude: Double = 0

}

 
で、位置情報を取得する度にその時点のlatitude,longitude をオブジェクトにaddする。
 
 
取り出して描画する際は、Realmで取得したオブジェクトに紐付くPolylineArrayを順に取得して、
そのlatitude,longitude をGMSPolylineに設定してあげれば表示出来ます。
 
 
 
Realmで画像とかも保存したいんだけど、できるのかなー。
 
 

NSPredicateがうまくいかない

前回からだいぶ間が空いてしまいました。

 

題名の通り、NSPredicateではまっています。

 

やりたいこと

前回まででお話しした通り、今作っているアプリのデータ保存に

Realmというライブラリを使用しています。

Realmにデータを保存するところまではなんとか実装できたのですが、

保存したデータをSelectするのにNSPredicateというものを使用するとのこと。

 

で、そのNSPredicateですが、色々調べると文字列マッチングの抽出条件式は

結構出てくるのですが、私がやりたいのはSQLでいうMAX関数のような形で、

とあるカラム内での最大値を取得したいと思っています。

 

しかしMAXについて、Objective-Cでの実装例はそこそこ出てくるのですが、

Swiftでの実装方法が見つからない・・・

このNSPredicateはObjective-CSwiftでは書き方が少し違うらしく、色々試したみたのですがことごとくエラー。

ダメだった書き方
  • NSPredicate(format: "seqNo = @max")
  • NSPredicate(format: "@seqNo = @max")

  • NSPredicate(format: "@max = seqNo")

  • NSPredicate(format: "seqNo,@max")

どなたか知っていれば知恵をお貸しください。。。

 

ここ数日間の実装メモ

  • tabbarで自身のviewが選ばれていなかったら遷移する
    if (self.tabBarController?.selectedViewController != self) {
        self.tabBarController?.selectedViewController = self
    }
  • NSDateを日付形式にする

    dateFormatter.locale = NSLocale(localeIdentifier: "ja_JP")

    dateFormatter.timeStyle = .ShortStyle

    dateFormatter.dateStyle = .ShortStyle

    "Date:\(dateFormatter.stringFromDate(record.startDate))

 

そろそろアプリ全体がいい感じになってきた。

ちゃんとできたら公開したいなぁ。

 

あと、最近Webアプリも少しやってみたいものがあって、

MEANスタックなるものにちょっと興味があったりする。

 

 

Swift勉強会に行ってきた

9月7日に渋谷で開催されたSwiftの勉強会に参加してきました。

内容としては初心者向けという事もあり、基本部分の復習と、
iOSシミュレータの知らなかった使い方、playgroundとかを知る事が出来ました。


たまたまそこで意気投合したweb系のエンジニアの方と勉強会後にご飯に行ったのですが、
そこで色々webの仕事について聞く事ができました。

なんだか仕事に対する考え方が変わったとともに、
今までやってきたどんな仕事よりも楽しそうに感じました。
もともと自分の手でモノづくりをして公開したいという想いはあったので、すごく輝いて見えましたね。


スキル面でも、仕事に対する意識の面でも非常に刺激になったので、
今後も色々な勉強会に積極的に参加していきたいと思っています。

5年くらい前にRailsを触った事があるので、
そっち方面も初心者向けの勉強会とかがあれば参加してみたいなぁ。


今回はあまりiOSアプリ開発に関係の無い話題となってしまいました。
次回こそはRealmの実装続編を書きたいと思います。

Realmのインストールでハマった話

さて、今回はRealmのインストールでハマった話です。

Realmとは

Realmとは、今話題となっているローカルデータストレージらしいです。
なんでも、CoreDataやSQLiteとかに変わってこれからのスタンダードになって行く可能性があるとかないとか。
Androidでも使えるらしいので、今後Android展開することがあった時には楽かもしれないです。

インストール

インストールはSwift Docs - Realm is a mobile database: a replacement for SQLite & Core Dataを見ながら、CocoaPodsを使って行いました。
ものの数分でインストールは完了。

コーディング

早速、上記の公式サイトを見ながら実装。
今回は記録開始ボタンをタップしてから、再度ボタンをタップして記録終了するまでの距離と、
平均速度、その時の移動ルート(GMSPolylineを使用)を保存するためのクラスを別のswiftファイルを作って以下のプロパティを持たせる。
  • 移動距離:Double
  • 平均速度:Double
  • 移動ルート:GMSPolyline
  • 作成日時:NSDate

あとはボタンがタップされた時のActionに、保存するデータのオブジェクトを作成し、
それぞれの値を格納してからRealmオブジェクトを作成してwrite,addすれば完了…のはずでした。

うまく動かない

ここまで実装して、いざ動かしてみました。
…動かない。
前回も弄ばれたアイツです。
SIGABRT

さて困った。

落ちてるところはRealmオブジェクトを作成するとこだったので、
きっとインストールが失敗してるんだろうと思い、何度もpod installを繰り返したけど変わらず。
何が悪いのか分からなかったので、とりあえずプロジェクトを新たに作り直して、
全部のソースをaddしてCocoaPodsをインストールしてpod install し直してみた。
Realm()通った!
けど、結局何が悪かったのか分からず、BuildSettings周りを比較してみたら、Other Linker FlagsにRealmSwiftが入ってない。
原因はこれっぽい。

Other Linker FlagsってCocoaPods が自動で追加してくれると思ってたけど、ダメなパターンがあるのかな。
前回の"-ObjC"も、もしかして本来は手動で追加する必要なかった?


とりあえずは動いたので、これからエラーになったらOther Linker Flagsも疑ってみるようにしよう。


ちなみにRealmに格納できるデータ型は決まってるらしく、結局GMSPolylineを格納しようとしてコケたので、
そこはどうにかして別のデータ型で格納しなきゃ。
LongitudeとLatitudeを格納できるRealmのクラスを作って、それをメインのクラスにListで格納すればいけるかも。


次は保存したRealmデータを表示して、履歴を出せるようにしたいなぁ。

これまででハマったこと

ハマったこと

いろいろと書きたいんですが、ちょっとまだ整理しきれていないので

簡単に・・・

 

GoogleMapのライブラリ

cocoapodを使用してライブラリをインストールしているのですが、

とあるサイトで見たところ、podfileに

pod 'Google-Maps-iOS-SDK'

と記述するとあったので、それをcocoapodからインストールしました。

それでここのサンプルを元に作ってみたけど、何回やっても

import GoogleMaps

でエラーなる。

 

結局、podfileに記述する内容を

pod 'GoogleMaps'

にしなきゃいけなかったみたい。

 

use_frameworks!

cocoapodでSpringというアニメーションをつけるためのライブラリを

インストールしようとした際

[!] Pods written in Swift can only be integrated as frameworks; this feature is still in beta. Add `use_frameworks!` to your Podfile or target to opt into using it. The Swift Pod being used is: Spring

こんなエラーが出たので調べたところ

cocoapodでswiftのライブラリをインストールするためには、podfileに

use_frameworks!

っていう記述を追加する必要があるらしい。

 

その通りにやってみたらめでたくインストールは出来たのですが、

それ以降、何回やってもアプリ起動直後にSIGABRTになるのでいろいろ試行錯誤した結果、

XcodeのBuildSettingsにある、Other Linker Flags の最後に

" -ObjC"

を追加すると落ちなくなった。

正直、なぜこの記述でアプリが落ちなくなったかは全く分からないのですが、

とりあえず今のところは問題なさそうです。

 

これまでで大きくハマったのはこれくらい。

use_frameworks! に関しては、試行錯誤しすぎてプロジェクト作り直すハメに

なったけど、これも良い勉強ということで。。。

 

 

昨日からRealmというデータベースライブラリを使ってデータ操作を

試しているので、次回はその辺りについて書けたらいいな。