Start Developing iOS Apps (Swift)でiOS入門した
iOS入門してる https://t.co/PAsGWOODlM
— suzuken (@suzu_v) 2018年4月29日
GWだしまとまった時間があるので、いつかやろうと思っていたiOSアプリづくり入門をした。とりあえず10時間くらい触った。楽しい。
Apple公式のドキュメントが充実しているっぽいので、ひとまずStart Developing iOS Apps (Swift): Jump Right Inをやってみることに。内容としては食べたご飯の画像と評価(といっても☆が5つあってそれを保存する)を保存するアプリを作るというもの。次のことを順をおってやっていく。
- storyboardでのUIの作り方
- UIコンポーネントとAction, Outletのつなげ方
- Auto Layoutで余白をつくったりレイアウトを調整してみる
- UITableViewにデータを表示する
- 詳細画面とTableViewで同じデータをもとに表示する
- 編集と新規作成で同じUIを使いまわす
- 投稿データを削除できるようにする
- FileManagerを使ったデータの保存と読み取り
ところどころアドバイスがあるので横道にそれながら進むのも楽しい。「ここはもっとcomplexなケースだとDelegateをつかうといいよ」とか「guardをつかうとよりシンプルにかけるよ」とか。だいたい公式リファレンスに詳しく書かれていてそっちも面白いので、チュートリアルそっちのけで読んでしまった。
面白いなあと思ったことを書いておく。
- importにannotationが書ける。
@testable import xxx
的な。 https://twitter.com/suzu_v/status/990871005944934402 inout
修飾子をつけたときのrace condition検出 https://twitter.com/suzu_v/status/990906606236778496 https://twitter.com/suzu_v/status/990908591287689217- Navigation Controllerの存在。これがあるので、どういう表示をさせるかっていう切り替えがシンプルに実現されてる。 https://twitter.com/suzu_v/status/991106763087728640
- Modalityの使い方一つとってもデザインガイドラインがちゃんとあってすごい丁寧。 https://twitter.com/suzu_v/status/991149974216847361
- NSObjectとNSCoding Protocol。Persistent Dataにするための実装がわかりやすい。これならどういう型でもSerDeを書けば保存読み込みできる。 https://twitter.com/suzu_v/status/991244362305519616
あとはよくわからないなあと思ったことをメモっておく。
- Protocol。 The Swift Programming Language (Swift 4.1): Protocols をちゃんと読むとよさそう。ふるまいとしては「どういうメソッドがあるか」「どういうプロパティがあるか」とかを定義できる。インタフェースとかトレイトとか抽象クラス、ではなくProtocolとしたのはなんかもう少し違う概念なのかな、と想像してる。
- Auto Layout。marginやらwidth, heightやらを設定してるんだけどなんかうまく調整されないときがある。ので、 Auto Layout Guide: Understanding Auto Layout を読むとよさそう。
WEB+DB PRESS Vol.102の連載、「事業を支えるPHP」に寄稿しました
WEB+DB PRESSに寄稿しました。今回から始まる「事業を支えるPHP」という連載の第一回です。
今回から毎号、VOYAGE GROUPのエンジニア陣で連載を担当します。個人としてもWEB+DB PRESSへは初めての寄稿となりましたが、無事脱稿できたときにはほっとしています。10月ごろには年内に原稿は書かないだろうと思っていたのですが、11月ごろにお話をいただき、せっかくの機会なので会社のエンジニアで一緒に連載をしていきましょうという運びとなりました。
初回は私が「異常系コードのリファクタリング」について書きました。初回からとても事業を支える感のあるテーマになってしまいましたね・・w 今年のPHPカンファレンスでも発表もあり、今年は多くの機会を頂いて嬉しく思っています。
今年の主なテーマの一つは過去に書かれたコードとの向き合い方でした。その中の一つのアプローチが今回書かせていただいた記事の中にも盛り込まれています。もちろんテクニックもありますが・・やはりコードとどこまで向き合い、自分なりに問題を解き続けられるかというのが如何に大切なことかというのを感じています。
連載全体としてはPHPのバージョンアップなどあればそれについて触れつつ、基本的には私達が事業開発をするなかで試行錯誤してきたもの、あるいは特定のアプローチについて切り取ってお伝えする、という形になると思います。社内の他のチームのメンバーも執筆しますので、私としてもこの連載によって社内の知見が文章になって出てくるのを楽しみにしています。
お楽しみいただけると幸いです。
re:Invent 2017で聴いたセッション + あとでみるセッション
re:Invent 2017から昨日帰国しました。聴いたセッション、またあとでビデオ + スライドを見ておきたいセッションをメモしておきます。
聴いたセッション
Workshopが多いですね。セッション中のメモはDropbox Paperで取っていたのですが、Tweetにまとめているのもあるのでそちらもどうぞ。
- ATC303 - Cache Me If You Can: Minimizing Latency While Optimizing Cost Through Advanced Caching Strategies
- bidding engineの話。Lambda@EdgeでABテストとか。
- タイトルがおしゃれ。 元ネタ: https://en.wikipedia.org/wiki/Catch_Me_If_You_Can
- ATC301 - 1 Million bids in 100ms – using AWS to power your Real Time Bidder
- NLB + ENAで2M connection / min. さばいてるのが印象的なセッション。あとはbidderはstatelessにしてspot instanceにしてるとか。
- AerospikeをNVMe SSDで使ってる。I3 or F1。
- MCL309 - Deep Learning on a Raspberry Pi
- MXNetをラズパイで。資料はこれ GitHub - juliensimon/mxnetworkshop
- といっても実習はEC2でやったのであった。手法変えつつtrainの時間みつつ。あとはPyCameraつかえばinferenceをノードで動かせるとこまでやって終了。
- IOT204 - AWS Greengrass Basic Workshop
- Greengrassのセットアップまわりの基礎的な説明。pubsubをAWS IoTで眺めつつEC2をIoT Deviceとみなせるようにして一通りさわった。
- ARC401 - Serverless Architectural Patterns and Best Practices
- CTD403 - Supercharge Your Websites with the Power of Lambda@Edge
- suzuken on Twitter: "CTD403 - Supercharge Your Websites with the Power of Lambda@Edgeに来た。早速cloudfront distribution立てつつ準備中。 #reinvent"
- 内容はこれ GitHub - aws-samples/aws-lambda-edge-workshops: This repository contains instructions and blueprints for Lambda@Edge workshops
- Lambda@EdgeからDynamoDBのUpdate + Scanをするのが面白かった
- CON309 - Containerized Machine Learning on AWS
- クックパッドさんから2人登壇されていたので見に行ってきました。動画: AWS re:Invent 2017: Containerized Machine Learning on AWS (CON309) - YouTube 手元のiPhoneで試したらばっちり分類されていて便利でした :)
- MCL212 - SESSION FULL! NEW LAUNCH! AWS DeepLens workshop: Building Computer Vision Applications
- MCL209 - NEW LAUNCH! Introducing Amazon Translate – Now in Preview
- MCL345 - NEW LAUNCH! Integrating Amazon SageMaker into your Enterprise
- MCL215 - NEW LAUNCH! Introducing Amazon Transcribe – Now in Preview
- DAT318 - NEW LAUNCH! Deep dive on Amazon Neptune
- MCL343 - NEW LAUNCH! Natural Language Processing for Data Analytics
聴いたセッションについてはajitofmでも話したのでよかったらそちらもどうぞ。
Published: ajitofm 14: Losing $100 in 5 minutes at Las Vegas with @_nishigori @chocopie116 https://t.co/ppllM62Uwf #ajitofm
— ajitofm (@ajitofm) 2017年12月1日
聴きたいけど聴けなかったセッション
あとでビデオとスライドで見ようかなあと思っているもの。Breakout Sessionの動画はこちら。そのうち全部あがるはず。
月曜日
- ABD331 - Log Analytics at Expedia Using Amazon Elasticsearch Service
- ATC302 - How to Leverage AWS Machine Learning Services to Analyze and Optimize your Google DoubleClick Campaign Manager Data at Scale
- AMF305 - Autonomous Driving Algorithm Development on Amazon AI
- GPSTEC313 - GPS: Real-Time Data Processing with AWS Lambda Quickly, at Scale, and What Comes Next?
- CMP332 - C5 Instances and the Evolution of Amazon EC2 Virtualization
- ABD315 - Building Serverless ETL Pipelines with AWS Glue
火曜日
- MCL365 - NEW LAUNCH! Introducing Amazon SageMaker
- ABD327 - Migrating Your Traditional Data Warehouse to a Modern Data Lake
- MCL310 - Building Deep Learning Applications with Apache MXNet and Gluon
- ABD215-R - [REPEAT] Serverless Data Prep with AWS Glue
- CTD301 - Amazon CloudFront Flash Talks: Best Practices on Configuring, Securing, Customizing, and Monitoring Your Distribution.
- DEV315 - GitHub to AWS Lambda: Developing, Testing, and Deploying Serverless Apps
- SRV403-R - [REPEAT] Serverless Authentication and Authorization: Identity Management for Serverless Applications
- MBL402 - NEW LAUNCH! Data Driven Apps with GraphQL: AWS AppSync Deep Dive
- CMP323 - AWS Batch: Easy and Efficient Batch Computing on AWS
水曜日
- DAT342 - NEW LAUNCH! How to build graph applications with SPARQL and Gremlin using Amazon Neptune
- SID341 - Using AWS CloudTrail Logs for Scalable, Automated Anomaly Detection
- MCL333-R - [REPEAT] Building Deep Learning Applications with TensorFlow on AWS
- CTD206 - NEW LAUNCH! Learn how Fubo is monetizing their content with server side ad insertion using AWS Elemental MediaTailor
- DAT326 - How DynamoDB Powered Amazon Prime Day 2017
- CON404 - Deep Dive into Container Scheduling with Amazon ECS
- CTD203 - NEW LAUNCH! Hear how OwnZones is using AWS Elemental MediaConvert to help media customers deliver world class VOD experiences
- CMP332 - C5 Instances and the Evolution of Amazon EC2 Virtualization
- CTD304 - Dow Jones & Wall Street Journal's journey to manage traffic spikes while mitigating DDoS & application layer threats
- CON214 - NEW LAUNCH! Introducing AWS Fargate
- MCL305 - Scaling Convolutional Neural Networks with Kubernetes and TensorFlow on AWS
- DEV324 - Deep Dive on Advanced Continuous Delivery Techniques Using AWS DevOps Tools
木曜日
- DAT308 - A story of Netflix and AB Testing in the User Interface using DynamoDB
- DEV203-R - [REPEAT] Launch Applications the Amazon Way
- DEV402 - Deep-Dive for AWS X-Ray
- SRV401 - Become a Serverless Black Belt: Optimizing Your Serverless Applications
- MCL341 - NEW LAUNCH! Infinitely Scalable Machine Learning Algorithms with Amazon AI
- SRV424 - Massively Parallel Data Processing with PyWren and AWS Lambda
- MCL342 - NEW LAUNCH! Graph-based Approaches for Cyber Investigative Analytics Using GPU Accelerated Community Detection and Visualization with Amazon Neptune and Graphistry
- CMP330 - NEW LAUNCH! Amazon EC2 Bare Metal Instances
おまけ
1週間ぶりに食べる日本食は最高だなあと思いました。
我々一行は帰国後すぐ蕎麦屋に向かった。この一週間でもっとも美味いを言い続けている… pic.twitter.com/9yKWEfP2vT
— suzuken (@suzu_v) 2017年12月2日
DeepLensはAWSの新サービスてんこ盛りデバイスだった
今週はラスベガスで開催されているAWS re:Inventに来ています。DeepLensのWorkshopに先程出てきたのでメモがてら貼っておきます。
概要
DeepLens自体は次の記事が詳しいです。
AWS DeepLens – Get Hands-On Experience with Deep Learning With Our New Video Camera | AWS News Blog
私はビデオもデバイスについても特に詳しいわけではないのですが、DeepLensがすごいなーと思ったのは、それ自体が今回発表されたサービスを含め、AWSのサービスを上手くつかって構築されていることです。
- SageMakerで作ったモデルを取り込む
- Greengrass Core上でlocal Lambdaを動かし、デバイスデータの送信とinferenceをする。
- eventのpubsub管理はAWS IoTで
- Greengrassに乗っているのでデプロイも簡単にできる
- ビデオデータはKinesis Video Streamでサーバ側へ送信 + バッファ可能
- inferenceの結果はAWS IoTトピックで扱えるので、任意のLambda functionのtriggerに設定可能
DeepLens自体のスペックは次のとおりです。
AWS DeepLens – Deep learning enabled video camera for developers - AWS
Workshopではこれらを一通り触りながらDeepLensにモデルをデプロイしていきました。次がWorkshopでつかったプロジェクトです。
GreengrassにDeepLensをデバイスとして関連付けすると、AWS IoT Device Gateway経由でイベントが流れてきます。例えば物体認識したイベントは次のようなデータが流れてきます。GreengrassではLambda functionをデバイスのlocalで実行できるので、ここでinferを実行するわけです。Greengrass SDKをつかったコードは次にあります。infer結果をpublishしているのがわかります。この例だとMXNetを使っています。
https://s3.amazonaws.com/deeplens-managed-resources/lambdas/hotdog-no-hotdog/new_hot_dog_lambda.zip
ちなみに今日あったアップデートでGreengrassからカメラやGPUにアクセスできるようになっています。
今日試したところ、DeepLensにはProjectを1つだけデプロイできます。ProjectというのはModelとFunctionの組み合わせでつくられるDeepLensの挙動のだと思うとわかりやすいです。
公式ページにもあるとおり、DeepLensがProgrammableというのはここで実現されています。
AWS DeepLens is easy to customize and is fully programmable using AWS Lambda. The deep learning models in DeepLens even run as part of an AWS Lambda function, providing a familiar programming environment to experiment with.
1つ1つをみるとやっていることはシンプルですが、よく考えられているなあと思ったポイントは以下のとおりです。
- Greengrass Coreの設定をしなくていい。DeepLensのconsoleからdeviceを紐付けるだけ。
- ゆえに証明書の配置とかも気にしなくていい。(出荷時点で組み込みのはず)Greengrassの設定するの若干面倒ですし・・
- ひとまずつなげばAWS IoTのpubsubにつなげるのでユーザはmodelとLambdaをどう書くかだけ考えるのに集中できる
あたりかなと。Greengrassで管理してるのでnetwork connectivityが安定しなければ再送される、あるいは他のGreeengrass Coreと連携して端末間通信する、あたりも便利そうですね。
感想
お、これは早速実物だ #reinvent #deeplens pic.twitter.com/lwbFhAfQ8x
— suzuken@re:Invent (@suzu_v) 2017年11月29日
あーこれgreengrassd動いてるのかな。まだ触らないでね!っていわれてる
— suzuken@re:Invent (@suzu_v) 2017年11月29日
ということでDeeplens Workshop始まった。デバイスのチームとMLのチームがコラボして開発されたとのこと。開発者が簡単にMLを扱えることを目指して開発しているとのこと。Video CameraではなくてDL enabled developer kitだと。
— suzuken@re:Invent (@suzu_v) 2017年11月29日
Workshopではすでにサンプルプロジェクトが用意されている。物体認識、行動認識、顔認識など。機能をカスタムしてもいいし、自分でプロジェクトを作ることもできる。
— suzuken@re:Invent (@suzu_v) 2017年11月29日
SageMakerで作ったモデルをgreengrass経由でlocal Lambdaつかってデプロイするのかなーと想像してるけどどんな感じで進むのかしら
— suzuken@re:Invent (@suzu_v) 2017年11月29日
Deeplens, Ubuntuのってるのか https://t.co/kIAck0l1aQ
— suzuken@re:Invent (@suzu_v) 2017年11月29日
Deeplensはlambdaでinferenceする。VideoをKinesis Video Streamにおくる。デバイス管理はGreengrass。trainingなどはSageMakerで。今回発表されたサービスをもりもりつかっているなあ。
— suzuken@re:Invent (@suzu_v) 2017年11月29日
Deeplensのstorageは拡張できるらしい。MXNet用にclDNNが入ってる。
— suzuken@re:Invent (@suzu_v) 2017年11月29日
— suzuken@re:Invent (@suzu_v) 2017年11月29日
Tensorflowもサポート予定とのこと
— suzuken@re:Invent (@suzu_v) 2017年11月29日
Alexaは入ってない。Audio StreamingではなくVideo Streaming。
— suzuken@re:Invent (@suzu_v) 2017年11月29日
ホットドッグが配布されたw 「ホットドックの検出やるからまだ食べないでください!」とのこと
— suzuken@re:Invent (@suzu_v) 2017年11月29日
あ、これGreengrass Coreの1.2.0入ってるな。
— suzuken@re:Invent (@suzu_v) 2017年11月29日
DeepLens consoleではmodelの設定とGreengrass上のLambda functionの設定ができる
— suzuken@re:Invent (@suzu_v) 2017年11月29日
あーDeepLensのinferenceの結果はMQTT topicでsubscribeできるのか。なるほど。
— suzuken@re:Invent (@suzu_v) 2017年11月29日
なんていうか、DeepLens自体はGreengrassがpresetされたシンプルな構成だけど、Greengrass + Lambdaのおかげでデプロイもしやすいのがいいな。
— suzuken@re:Invent (@suzu_v) 2017年11月29日
DeepLens上のLambda functionではpreprocess, inference, publishをしている。
— suzuken@re:Invent (@suzu_v) 2017年11月29日
昨日Greengrass Workshopにいったので理解しやすくてよい
— suzuken@re:Invent (@suzu_v) 2017年11月29日
検出できた #deeplens #reinvent pic.twitter.com/ae4iolMad2
— suzuken@re:Invent (@suzu_v) 2017年11月29日
コードあった https://t.co/7E7fucz4p2 SageMakerつかってmodelを組んでみる
— suzuken@re:Invent (@suzu_v) 2017年11月29日
お、SageMakerでJupyter Notebookさくっと開いて実行できるじゃん便利
— suzuken@re:Invent (@suzu_v) 2017年11月29日
あーSageMakerでたてたJupyter NotebookでtrainしてmodelをS3にuploadしてそれをDeepLensですぐつかえるのかなにこれ便利
— suzuken@re:Invent (@suzu_v) 2017年11月29日
Hotdog判別モデルをSageMakerでつくってs3に配置し、それをDeepLensのプロジェクトに追加してデプロイしている。
— suzuken@re:Invent (@suzu_v) 2017年11月29日
Lab 4だとsubscribeしたtopicをLambdaのIoT RuleでSQLで絞り込むというのをしているな。これあったっけ? https://t.co/GMRrGffPlU
— suzuken@re:Invent (@suzu_v) 2017年11月29日
LambdaでIoT topicをsubscribeして、一定以上のp値でHotdogだと判定したらSNSでメールとばすのできた。無限にホットドック検出メールが飛んでくる・・w
— suzuken@re:Invent (@suzu_v) 2017年11月29日
これがないとDeepLensできないもんなあ。これ、DeepLensを作ろうとして用意したのかどうかとか気になる。SageMakerないとこのWorkshopも面倒だったろうし。https://t.co/fQheSFNnOA
— suzuken@re:Invent (@suzu_v) 2017年11月29日
Greengrass + Local Lambda + SageMakerの実用例がDeepLensっていうのはプレゼンテーションとしてもわかりやすいよなあ
— suzuken@re:Invent (@suzu_v) 2017年11月29日
今回のワークショップだとDeepLens上のUbuntuにはいってるデスクトップ環境つかってconsoleでの操作とかもできるし、なんていうか忍者の小道具みたいな感じがすごい
— suzuken@re:Invent (@suzu_v) 2017年11月29日
DeepLens Challenge Virtual Hackathonとな https://t.co/AhuooPL0oY #reinvent #deeplens
— suzuken@re:Invent (@suzu_v) 2017年11月29日
まとめ
*1:Workshop後にDeepLensももらえます
PHPカンファレンスで話してきた
先々週のことですが、PHPカンファレンス2017で話してきました。初PHPカンファレンス。楽しかった!ひさびさにPHPの話をいっぱいできてよかったです。
会社のブログにもゆきみねがまとめてくれてます。 techlog.voyagegroup.com
発表資料はこちら。
セッション動画も載ってます。
セッション内容としてはレガシーなシステムの段階的改善です。「こんなケース、ありませんか?」というのが今回の問い。会場で聴いていただいた方々にも多く該当される方がいたようで、このテーマで話をしてよかったなあと思いました。
コードを書くとき、すでにあるコードを変更することのほうが多いはずです。そして価値を出している。価値を出しているコードを、僕は尊敬しています。なのでそれらをより良くしていくためにどうしたらよいか?というのがこの1年間ほど取り組んでいたテーマの1つでした。
大きくなってしまったコードベースを読み解くのは大変です。コードを読むことは、書くことよりも時間を使います。コードは読まれる時間のほうが長いのです。Readabilityは最も重要です。ですがすでにReadabilityが低いコードである場合にはどうしたらよいのでしょう。小さい規模であればリファクタリングして地道につぶしていくのもいいかもしれませんが、それだと時間がかかりすぎてしまうかもしれません。
最近読んでいる本にレガシーソフトウェア改善ガイドがあります。レガシーソフトウェア改善ガイドの話は発表中にはしていないのですが、おすすめです。レガシープロジェクトの改善をどう進めていくかという観点から体系立てて書かれています。
リファクタリングかリライトするかというのは、常に悩ましい問題です。しかし、リプレースという選択肢もあります。リファクタリングするのでもリライトするのでもなく、リプレースをする。書き直さずに、置き換える。サードパーティ製のソフトウェアで代替えできるのであれば、それは素晴らしいことです。
今日公開した ajito.fm/10 でもPHPカンファレンスについて話したので、よかったら聴いてみてください。 ajito.fm
カンファレンス運営者のみなさま、スポンサーのみなさま、そして参加者のみなさま、どうもありがとうございました!
「データ分析基盤構築入門」の執筆に参加しました
「データ分析基盤構築入門」の執筆に参加させていただきました。
概要は以下のとおりです。
「サービスのデザインはログのデザインから。」良いサービスを作り上げるには,ログデータを収集し,改善を続けるシステムの構築が必要です。本書は,ログデータを効率的に収集するFluentdをはじめ,データストアとして注目を集めているElasticsearch,可視化ツールのKibanaを解説します。本書を通して,ログ収集,データストア,可視化の役割を理解しながらデータ分析基盤を構築できます。2014年に刊行した「サーバ/インフラエンジニア養成読本ログ収集 可視化編」の記事をもとに最新の内容に加筆しています。
最初に執筆させていただいてから早3年、改訂しませんか?との話から始まった今回の執筆。ログ解析にまつわる環境にも変化がありました。前に書いた原稿を眺め、反省しつつ、2017年の今また改めてこの文章を書くならどう書くのが良いのだろうか?というのを自分なりに再解釈し、書いたのが今回の書籍になります。
もともとElasticsearch, Fluentd, KibanaのいわゆるEFKスタックの本として書かれていました。その間にETLの領域でも様々なツールが生まれ、実践され、よりよい運用が試みられてきました。そうした取り組みを改めて俯瞰し書く機会をいただき、嬉しく思っています。特に今回はy-kenさんにより、Embulk、Digdagに関しても多く加筆されています。
10/10夜にはピクシブ株式会社様にて刊行記念の勉強会が開かれます。お気軽に聞きに来ていただけると幸いです。
PHPカンファレンス2017で話します
2017年10月8日(日)に開催されるPHPカンファレンス2017にて登壇します。
https://joind.in/event/japan-php-conference-2017/session14-php--
session14: 広告配信管理システムを支えるPHP ~ レガシーシステムからの段階的移行戦略 13:35 4Fコンベンションホール梅 (手前側)
弊社管理画面の改善ネタです。下記の記事をみていただくと雰囲気が伝わるかと思います。
是非お越し下さいませ。会場でもPHPerの皆様とお話できるのを楽しみにしております :)