読者です 読者をやめる 読者になる 読者になる

Skyland Ventures tech ブログ

渋谷のVenture Capital Skyland Venturesのいま一番イケてる投資先、nanameue,IncとKaumoの共同技術ブログ

SwiftyBeaver使ってみたら便利だったはなし

株式会社Nanameue iOSエンジニアのbatiです

今回は噂のSwiftLoggingツールSwiftyBeaver使ってみたよ!ってはなしです

SwiftBeaverとは、ログをXcodeで確認したり収集するプラットフォームです。HelpScout社が運用するオープンソースプロジェクトです。

ログをHelpScout社が提供するMacアプリで見ることができます。 すなわち、プロダクションにあるアプリのログも見れちゃうすぐれものです!

install stepは

  • SwiftyBeaverからgit clone or pod install or Swift Package Managerを使ってインストールします
  • SwiftyBeaver Mac App アプリをダウンロードします。まだリリースされていないため、ベータverに登録した人しかダウンロードできません
  • app ID, secret, encryption keyをset
public let SBLog = SwiftyBeaver.self

 SBLog.addDestination(ConsoleDestination())
 SBLog.addDestination(FileDestination())
 SBLog.addDestination(SBPlatformDestination(appID: kSBAppId, appSecret: kSBAppSecretId, encryptionKey: kSBAppEncryptionKey))

-あとは以下のように使います

SBLog.verbose("not so important")  // prio 1, VERBOSE in silver
SBLog.debug("something to debug")  // prio 2, DEBUG in green
SBLog.info("a nice information")   // prio 3, INFO in blue
SBLog.warning("oh no, that won’t be good")  // prio 4, WARNING in yellow
SBLog.error("ouch, an error did occur!")  // prio 5, ERROR in red

エラーメッセージを詳細に見れるのは良い

SBLog.error("\(error.code) \(error.userInfo)")

などのように使うと、エラーコードやエラーの詳細メッセージをSwiftyBeaver Mac アプリで見ることができます

こんな感じ

スクリーンショット 2016-05-20 21.13.03.png

リリースされたら是非みなさんも使いましょう!!!!!

また、今度TECH_Salon ✖ 私コラボイベント to do アプリを作ろう開催します!!!

是非初心者大学生など、Swift勉強したい方お越しください!!!

to do アプリを作ろう Swift勉強会

また最近記事になりました 「Twitterがキッカケで出会って1分で入社を決意、エンジニアとして猛烈に成長したい」ナナメウエ iOSエンジニア 千葉大志氏はどうスキルを磨いたのか

いまさらkoa.js入門

こんにちは。1か月前からnanameue,incでインターンし始めた斎藤です。
最近JSばっかりでkoa.jsにまで手を出してしまったのでkoa.jsの入門記事を書きます。 個人的には1年半ほどRailsをいじっていたのですがReactからJS界隈に入り始め、ついにバックエンドまで到達しました。
Rails界隈と比較すると割とミニマムな物が好まれていて、高機能なものよりシンプルな部品を組み合わせて作っていく感じです。
Railsのあまりの大きさに嫌気がさしRailsからnode系に移った人も多いらしくRailsを真似たsailsというフレームワークもありますが全く流行ってません。

自分は1週間ほど前からkoa.jsをやり始めたのですが、yieldとかgenerateなどを使っているので理解するのに時間がかかりました。なのでその部分を解説します。多分ここがkoaの本質でkoa自体はスーパーミニマムなので多分ここを理解すればkoa自体を理解したことになるんじゃないでしょうか。ならないか。

koa.js

koa自体はすごく小さくルーターさえも提供されていません。koaが提供しているのは単なるミドルウェアです。
というわけでkoaの公式サイトのsampleコードをやっていこうとしたのですがいきなりこんな感じのコードが出てきて意味不明になりました。

// x-response-time
app.use(function *(next){
  var start = new Date;
  yield next;
  var ms = new Date - start;
  this.set('X-Response-Time', ms + 'ms');
});

// logger
app.use(function *(next){
  var start = new Date;
  yield next;
  var ms = new Date - start;
  console.log('%s %s - %s', this.method, this.url, ms);
});

一つずつ解説するとfunction *()というのはジェネレーター関数と言って簡単に言うとコードを実行するとyieldでストップします。es6の新機能です。上のコードではx-response-time実行中にyieldでストップしnextにloggerのコードが代入されて実行されます。ジェネレーター関数では.next()とかで次に進めるんですがそういうのはkoaがうまくやってくれてるんだと思います。

co

app.use(function *(){
this.state.user = yield User.find(id);
});

上のコードはUser.find(id)でユーザーが見つかり次第this.state.userへ代入してくれます。なぜこのような同期処理が可能かというとkoa自体はcoというライブラリを組み込んでいてそのcoの機能で可能になります。
coは一言で言えばPromiseをyieldの引数に取りPromiseがresolveして返した値をreturnしてくれます。意味不明ですよね。なので下にサンプルコードをのせました。他にもPromiseを含む配列を引数にしたりオブジェクトを引数にしたりできます。まぁでも本質はPromiseをいい感じに同期処理っぽく書けるということです。

例えばmongooseのfindOneメソッド

var query = User.findOne({name: "Guns N' Roses"});
 // A query is not a fully-fledged promise, but it does have a `.then()`.
 query.then(function (user) {
   this.state.user = user
 })

findOneの返り値はPromiseではないですがthenなどを使えPromiseのような働きをします。なのでこれもkoaのyieldで使用できます。下のコードは上のコードと同等な働きをします。

 this.state.user = yield User.findOne({name: "Guns N' Roses"});

this.state.userにユーザー情報が代入されます。こんな感じで綺麗に書けるんですよね。そんだけです。

いきなりですが以上でkoaの説明は終わりです。でもここら辺が一番トリッキーなのでここら辺を理解すれば、あとはkoaの公式サイトを読んだりチュートリアルとかをすればなんとか行けるじゃないでしょうか。koa楽しいですよ。スーパーミニマムでプログラムしてる感じがします。Railsに飽きた人はぜひ。下にオススメチュートリアルのリンクを貼っておきます。

おすすめチュートリアルリスト
Introduction to Generators & Koa.js: Part 1
Introduction to Generators & Koa.js: Part 2
A Simple CRUD Demo with Koa.js

iOSデベロッパーがプログラミング教育に関するラジオしてみました

株式会社Nanameue iOSエンジニアのbatiです Objective -CからSwiftに乗り変えて2か月。 今は新規プロジェクトをPure Swift でやっている状況で、 そろそろ、Swift最高じゃんもうObjective-Cには戻れないわ と感じている頃です。

実は、2016年2月からプログラミング教育に関するラジオをしています。

毎週隔週土曜23:30 ~ 以下のリンクから聞くことができます

天才エンジニアになりたかったら1年間で2回入院して2,3回死にかけろ

エンジニアを始めて1年2か月 エンジニアを始める前は、MicrosoftのWordしか触ったことがないような青年でした。

僕がエンジニアを始めたきっかけは1年前。 知り合いがやっていたiOSアプリ開発講座をノリで受けたことです。 初めてHello Worldを表示できた時、あ、アプリってこんな簡単なんだと思ったのと同時に自分が作ったものが動いたことに感動し、僕はこの世界でやっていけると思い、 のめり込んだエンジニアの世界

それ以来、約20個ほどのアプリを1年間で作ってきました 最高ランキングはAppleStore総合で96位まで行きました

受託関係など色々あるのでアプリの詳細は細かく言えませんが、 代表作は、 学生限定SNS HIMABU などです。

現在は大型受託案件が入り、1人で黙々Swiftを書いている日々です。

またライブラリなどもがんばって公開したりしています。 https://github.com/bati668/BTPagerViewController

今年の目標は10個くらいライブラリ出したいなと思っています。

自分で言うのはなんですが1年でここまで成長したiOSエンジニアはなかなかいないのではないかと自負しています。

そんなiOSエンジニアバーチーが、プログラミングラジオ始めました

第一回放送ゲストは、Far Connectionの代表市来さんです

高校生と受託案件をやるすごい会社です 以下のリンクからいつでも聞くことができます

http://yumenotane.net/podcast/wp-content/uploads/2016/02/3-1-2_tensaienjinia_20160213.mp3

また、GW特別企画でSwiftもくもく勉強会します! ぜひお越しください

http://connpass.com/event/31410/?utm_campaign=event_publish_to_follower&utm_medium=facebook&utm_source=notifications

http://connpass.com/event/31412/?utm_campaign=event_publish_to_follower&utm_medium=facebook&utm_source=notifications

http://connpass.com/event/31413/?utm_campaign=event_publish_to_follower&utm_medium=facebook&utm_source=notifications

気をつけろ!NSUserDefaultは消えるぞ!

株式会社Nanameue iOSエンジニアのbatiです Objective -CからSwiftに乗り変えて2か月。 今は新規プロジェクトをPure Swift でやっている状況で、 そろそろ、Swift最高じゃんもうObjective-Cには戻れないわ と感じている頃です。

さて今日の本題ですが、なんて刺激的なタイトルなんでしょう。 しかし僕はこの目で見てしまいました NSUserDefaultの値が勝手に消え失せる現象を!!!!! なんてFantasticな現象でしょう

僕の仮説ではこれはiOS側のバクだと考えられます。(iOS9.3にアップデートした瞬間起き始めたので)

僕の端末でしか確認できてませんが、もし同じ現象の人がいたら是非情報共有しましょう

具体的な現象

  • Facebook,Line,SmartNewsを開くたびに、ログイン画面、会員登録画面になる
  • 僕が会社で開発しているアプリでもNSUserDefaultに保存していたデータがアプリをKillするたびに、勝手に消える
  • ログを出力してみたら、保存したデータではなくnilが返ってきた
  • もう一回ビルドしてみたら、nilではなくきちんと保存したデータが帰ってきた
  • この現象は1時間に1回ほどのペースで起きた

考えられる原因

1時間ほどググった結果、NSUserDefaultはMainスレッドで実行されなければ正しく動かないことがわかりました。 しかし、NSUserDefaultはスレッドセーフです。 わざわざ、スレッドを変えなくても、大丈夫なはず!!

なんですが、事実として原因と考えられるものはこれしか見つかりませんでした

一応NSUserdefaultに保存できる上限があるのですが、それはiPhoneのストレージ分なので、 上限に達したというのは考えにくいです

実際に、Mainスレッドで強制的に呼ぶコードを書いたら、その現象は二度と起きなくなりました

本当に不思議ですね、、

僕の仮説だと、アップデートでスレッドが呼ばれるタイミングなどが 少しバクってしまったのでは???

と考えています。

同じ現象が起きる人がもしいたら是非共有しましょう

Swiftにおける良いコードとは何か

株式会社Nanameue iOSエンジニアのbatiです Objective -CからSwiftに乗り変えて2か月。 今は新規プロジェクトをPure Swift でやっている状況で、 そろそろ、Swift最高じゃんもうObjective-Cには戻れないわ と感じている頃です。

Swiftは超べんりです。 Objective-Cに比べてはるかにいろんな書き方ができて楽しい毎日を過ごすことができます。 しかし、デメリットとしてObjective-Cに比べてはるかに表現力が高い分、いろんな書き方があって結局どれがいいのか迷う事があります。

例えば、変数の定義の仕方にしても文字列の場合

let string: String = "a"

とも書けますし

let string = "a"

とも書けます。

Arrayの場合

let array: Array<String> = ["a"]

let array: [String] = ["a"]

let array = ["a"]

と3種類の書き方があります。

これだけ表現の仕方が多様だと、チームで開発している時など、 様々なArrayの宣言コードがいたるところに散乱しているような状態になってしまいます。

一人で開発する分にはいいのですが、チームで開発する時に、統一性のないコードになってしまうという問題が発生してしまいますね。

この問題をどう解決していけばいいのか。 僕なりの良いSwiftコードにするための3か条を発表します。

1.誰のための良いコードか考えろ

あなたが書いているコードは誰のためでしょうか?チームメンバーのためでしょうか? 自分のためでしょうか?初心者教育のためでしょうか?

多くの人は、チームメンバーのためだと思います。 チームメンバーのために良いコードを書くためには、良いコードとは何かチームの中で定義する必要があります。 一番大事なことなチームメンバーがストレスなく開発できることです。 第3者から見てイケてないコードだとしても、チームメンバーにとってストレスなく読め、最速ででき、メンテナンスがしやすいコードがチームにとっていいコードだと僕は思うのです。

コード数が少ないものがいいコードなのか? 少し長くなってもいいから可読性を意識したものが良いコードなのか?とにかくnil safe, 型safeなコードでしょうか?クロージャの書き方どうしよう?

とにかくスマートに書きたい、短くスッキリ書く事が良いコードだとしたら、 変数の宣言は簡潔に

let array = ["a"]

とすべきでしょう

またif文なども、なるべくelseが多くならないように、条件式を工夫するなども必要です。 また、なるべくオプショナルバインディングを使わない工夫も必要かもしれません。 オプショナルバインディングは便利ですが、冗長なコードを増やしてしまいます。 いたるところに

if let a = b { }

があると単純な作業なのにコードが長くなってしまいます。 本当に必要な時のみ使うべきでしょう

可読性をとにかく意識したいのであれば、 if文などもelse文が多くなったとしても丁寧でわかりやすい条件で書くべきかもしれません

どんなコードも一長一短あり、チームとしてどんなコードがいいのか、徹底的に話あう必要があります。 それはSwiftの高い表現性ゆえにです。高い表現性ゆえチームとして制約を設けないと、統一性のない、メンテナンスしにくいコードになってしまいます。

Wantedlyさんのコーディング規約などを参考にしながら、決めるというのもいいかもしれません。 (http://qiita.com/susieyy/items/f71435cc962e70d81b37)

2. チームでコーディング規約を決める際はストレスなく書ける、読めるに重きをおけ

Swiftは表現力が高いゆえに書きたいように書けます。なるべくチームメンバー全員がストレスなく書きたいように書けるにポイントを落としどころに決めたコーディング規約を作ることができるのはSwiftならでばでしょう。 書きたいように書く、エンジニアがこれほど生産性を上げられるものはないと思います。

書きたいように書く

書きたいように書く、これはもはやエンジニアの趣味の領域です。それはエンジニアの心であり情熱であり芸術性を帯びた何か得体の知れないものです。 この何か得体の知れないものを共有しましょう。 ちなみに僕はプロトコルの多様はあまり好きではありません。理由は特にないです。 感覚です。何かprotocol extensionを見かけると多少ムカつきます。 これはまさに得体の知れない何かだとしか説明がつきませんね

読める 逆説的な話になりますが、ルールはたくさん設けた方が、ストレスなく読めます。 書きたいように書くけどルールはたくさん設けるべきでしょう ルールに縛られた方が実装も迷いなくできます。

③ 感謝と思いやりの精神

誰かが良いコードを書いてくれたら最大限の敬意を持って感謝しましょう。 How great code it is!!! 君のおかげで今日も明日も爽やかで良い1日を過ごせそうだ そんな気持ちで良いコードをmergeしてあげましょう そして言葉で伝えましょう。 あなたの書いたコードを愛していますと

そして自分がコードを書くときは、チームメンバーのことを思いやりながら愛しながら書きましょう。 僕のコードはこのすばらしいチームのためにあるのです。ああなんてすばらしいチームだ と思いながら書きましょう。

その瞬間コードの神様が天から降りてきて、あなたの頭脳にささやかなヒラメキと、 コードを書く情熱を授けてくれるでしょう

その瞬間の積み重ねが人類のテクノロジーを一歩前へ、また一歩前へと進める動力源となるのです

すばらしいSwiftライフを

Macのスペック上げたらSwiftビルド時間が5分から1分になりました

株式会社Nanameue(http://nanameue.jp/?lang=ja) iOSエンジニアのbatiです

Objective -CからSwiftに乗り変えて2か月。 今は新規プロジェクトをPure Swift でやっている状況で、 そろそろ、Swift最高じゃんもうObjective-Cには戻れないわ と感じている頃です。

Swiftは非常に便利なのですが、プロジェクトが大きくなるとコンパイルに時間がかかる時がかかることがしばしばあることが問題視されています。

具体的な状況

・ 環境 Macbook Air メモリ8G ・ Xcode version 7.3 ・ 言語 Swift2.2 ・ Swiftファイル200(リリース時期になるとおそらく250くらいにはなるでしょう、今後アップデートも含めると最高300にはなりそうです)

ググった結果

こういう時はググりましょう ということでググった結果以下の記事が出てきました

型推論をなくそう系

http://cocopon.me/blog/?p=5447

http://qiita.com/rizumita/items/913b05d799b3712260f6

複数のmoduleにしてみたら系

https://developers.eure.jp/ios/advent-calendar-18/

いやいや全てを一つのSwift.fileで書いてみたら系

https://speakerdeck.com/mpon/swift-compile-time-is-so-slow

一通りやってみた結果

型推論をなくそう系 とりあえず、わかりきってる型でも型推論allなしでしてみた結果 20秒短縮

複数のmoduleにしてみたら系 これはそもそもめんどくさい

いやいや全てを一つのSwift.fileで書いてみたら系 これは全体の1/10くらいで挫折しましたが、ビルド時間3秒でした

まあ、ググってやってみたが、そんなに効果はない

そもそもなぜObjective-Cに比べて遅いのか

Swiftにはクラスをimportするという概念がないからです。importするのはmoduleだけで、 publicなクラスを作った時点で、全てのfileからアクセスできます。 つまり、全てのfileからアクセスできるようにするのに、時間がかかるということです。

またSwiftコンパイラの仕組みは以下の記事が非常に参考になりました

http://qiita.com/demmy/items/f08a65298d2f2caf1360

ではどうやって解決すればいいのか

このままでは、Swift.file300に到達してしまいます。

そんな状態でarchiveしたらどうなるでしょう。。。

そこで弊社社長のツルの一声

Macbook Proにしたら良くなると思うよ、買ってあげようか

なんてホワイトなベンチャー企業でしょうか

会社の金で買っていただいた27万のMac Proで早速試したところ、

build時間が5分→1分に!!!!!!

ということで、皆さんもこれを機にMacbook Proにしてみましょう

めぐり合いで変わる世界

皆さんはじめまして

4月からnanameue, Inc.でインターンを始めることになった米永です:)

IT業界の業務に興味があり、スキルを身につけるだけでなく、実際の仕事や職場の雰囲気を感じたいという想いから、 友人の紹介でインターンをさせていただけることになりました。

iOS 修行を始めてそろそろ1ヶ月経ちます。まだまだわからないことが山積みですが、少しずつコードを理解できるようになってきたという楽しみを感じています!!

大学の講義や就職活動で、ちょいちょい休んでますが、これからも自分でアプリやシステムを開発できるようになるために、インターンを続けていく予定です! ちなみにこれまでしてきたことはというと、アプリの管理や保守・お客様対応などです。コードの勉強以外にも学べることがあり、楽しみながらインターンを続けています:)

今までの学生生活は、部活動に重きを置きて学業とアルバイトをしていましたが、インターンにチャレンジすることで、周りの環境が一変しました。

ぜひ学生の皆さんには同じように良いインターンとめぐり合ってほしいです!!

とりあえずの目標は、プログラミングの勉強会などにも積極的に参加して、アプリを1個作り上げることです。これからもインターン・学業・バイト・一応就活も同時並行で頑張っていきます!!

ちなみに4月からnanameue, Inc.が赤坂に移転しました。

職場も広くキレイになり、より学習を続けやすい環境です(笑)

f:id:skytechblog:20160422154343j:plain f:id:skytechblog:20160422154337j:plain

f:id:skytechblog:20160422174036j:plain f:id:skytechblog:20160422174416j:plain

connpass.com