- フリーランスでアプリ開発(Android/iOS)や個人開発をしています。
Kotlin | Java | Swift | Objective-C | PHP | Python | Javascript | Ruby | Go | C++
- Eclipseを使った開発の時代からのAndroidアプリの知見があります。
- Java, Kotlinの両方で自走できる知見が十分にあります。
- Google’s Guide to app architecture に沿った実装、Android Architecture Componentsや Kotlin CoroutinesやMaterial Design Components for Android などベストプラクティスとして使われるライブラリ群を使用した実装の知見があります。実践したサンプルコードがGitHubに上がっています。
- Memory Profiler, Layout Inspector などを使用したアプリの調査、パフォーマンス改善ができます。
- Activity, Fragmentのライフサイクルを理解した上での実装を実践できます。
- Jetpack Composeを使ったUI実装に取り組んでいます。
- iOS3.0の時代からのiOSの歴史の知見があります。
- Swift, Objective-C の両方で自走できる知見が十分にあります。
- Foundation, UIKit, Core Location, MapKit, In App Purchace, Push Notification, CoreData, AVFoundation, Core Bluetooth, HealthKit などiOS特有の様々なフレームワークを使った実装経験があります。
- パッケージ管理としてCocoapods、Carthageを使用していました。
- MVC, MVP, MVVMに沿った実装の実践経験があります。
- UIViewControllerのライフサイクルを理解した上での実装を実践できます。
- SwiftUIを使ったUI実装に取り組んでいます。
- 前職でiOSアプリ開発の社内研修の講師をやりました。テキスト中心の演習形式でスタンドアロンのアプリを複数作成してもらいました。プログラミングは座学より実践だと強く実感しました。
- PHPのLaravelフレームワークを使用して、開発業務を担当できます。簡単なREST API作成、管理画面作成、DB設計などができます。
- Pythonを使用したデータ分析を個人で経験しています。Google Colaboratoryを使っていました。
- SQLの読み書きは多少複雑なものでも問題ないです。
- Jetpack Composeを使ったサンプル android-dev-challenge-compose3 MoviesApp
- Guide to App Architecture に沿った実装、Android Architecture Componentsや Kotlin Coroutinesを使っています Tweets Search
- The Official Conference App for DroidKaigi 2020 にcontributeしました。KMMをベースとした多くのModuleで構成されたソースはとても刺激になりました。commit
- 個人でストアへの公開練習として作成したゲームアプリ - Google Play ソース: Catch the Ball
- SwiftUIの取り組み Landmarks: SwiftUI Tutorials
- shibuya.apk #37でLT発表しました。資料はSpeakerDeckを参照。公開しているライブラリの経緯になります。
- ViewPager2, TabLayoutを用いてタブ付きスワイプビューを作成。タブを無限ループ - hatena
- iOSアプリでAESでの暗号化のためCryptoSwiftを使用した - Qiita
- 気象庁の台風統計をPythonでスクレイピング - Qiita
-
可読性、保守性を重視したコードを書く
命名、コーディングスタイル、SOLID原則、デザインパターン、アーキテクチャーを理解し、プロジェクトの規模に合わせて組み合わせることができます。 -
最新の情報をキャッチアップして開発に活かす
最近はAndroidアプリの開発技術を中心にキャッチアップしています。またiOSの進化、UX、世間的な技術トレンドにはアンテナを貼っています。 -
1つの技術に特化せず、幅広い知識で問題を解決する
開発面ではインフラ、サーバーサイド、フロントエンド、モバイルアプリと幅広い経験があります。 -
開発プロセスの改善でチームの生産性を最大化する
前職でアジャイル開発、ITILを学び、また実際のプロダクト開発で実践し、振り返りなどを通じてチームが改善されていくのを経験してきました。 -
ツールの開発や導入による業務の効率化を行う
Jenkins, Bitrise, GitHubを使用してアプリのCI/CDのワークフロー整備などができます。
年 | 期間 | プロジェクト名 | 担当範囲、使用技術 |
---|---|---|---|
2020,2021 | 4ヶ月 | 1. リアルタイム心拍数連携アプリ | iOS, Swift/ Firebase/ Bluetooth/ Polar SDK |
2020 | 3ヶ月 | 2. メモ帳アプリ ライブラリの最新化 (AndroidXへの移行など) | Android, Java, Kotlin |
2019,2020 | 8ヶ月 | 3. ワークアウトアプリ | iOS, Swift, HealthKit |
2019 | 8ヶ月 | 4. ニュースアプリ | Android, Java, Kotlin |
2018 | 6ヶ月 | 5. ボットつき家庭用グループチャットアプリ | Android, Java/ iOS, Swift/ PHP, Node.js |
2017 | 3ヶ月 | ホーム入れ替えアプリ | Android, Java |
2017 | 3ヶ月 | 薬剤師相談アプリ | iOS, Swift |
2017 | 4ヶ月 | メモ帳アプリ | Android, Java, Kotlin/ PHP |
2016 | 10ヶ月 | 安否確認アプリ | iOS, Objective-C/ Android, Java |
2015 | 6ヶ月 | ラジオ放送ストリーミングアプリ | iOS, Objective-C, AVFoundation/ HLS |
2014 | 4ヶ月 | コミック配信アプリ | iOS, Objective-C |
2013 | 6ヶ月 | カロリー消費管理アプリ | iOS, Objective-C/ Bluetooth |
2013 | 6ヶ月 | 6. 天気予報スマートフォンアプリ | iOS, Objective-C, App内課金 |
2012 | 8ヶ月 | 7. トレーディングカード ゲーム&コレクション | iOS, Objective-C, App内課金 |
2011,2010 | 12ヶ月 | 生理日管理アプリ | iOS, Objective-C |
2008,2009 | 14ヶ月 | 8. 商品検索比較アプリ(BuyKing) 振り返り | iOS, Objective-C |
設計、コーディング、テスト
Xcode, Swift, Realm, Git, Firebase, CocoaPods, BLE, Bitbucket, SwiftLint, NVActivityIndicatorView
運動中の心拍数をオンライン上で集中管理できるアプリを開発し、研究スタッフが高齢者の安全管理を徹底。link
iOSアプリを1人で担当。クライアントの指定でiPhoneの使用が確定していた。
運動中の高齢者の心拍数をリアルタイムで把握し、遠隔地でそれを監視できるシステムです。
ユーザーにPolar製の心拍計を装着してもらい、運動中はリアルタイムでiOSアプリに心拍数が送られるようにした。
また遠隔地での監視のために、状態をサーバーに保存するため、Firebase Realtime Databaseを使用した。
サーバーレスにしたかったのと、蓄積したデータのcsvエクスポートが容易なため。
心拍計との連携にはPolar SDKを使用し、開発当時はXcode12との互換性がなかったので、ソースからビルドしました。
Swift5.3.1を使用し、生成したframeworkをアプリのプロジェクトに組み込みました。
ビルド時に発生した問題はCarthageに起因するものと、PolarBleSdkのARM対応のものでした
issue1、issue2
Firebase Realtime Databaseには、心拍数、日時、心拍計との接続状態などを保存した。
保存にはFirebase SDKのAPIを使用した。
心拍数はiPhoneにもデータを保存したかったので、Realmを使用しました。
想定ユーザーが高齢者なので、アプリのUIはフォントを大きくしました。
- プロダクトとしては実証実験で作成したシステムであったが、顧客満足度は高かった。
- 初見のPolar SDKのビルド時の問題を解決し、パッケージマネージャーを使わないライブラリ組み込みに対応した。
- Firebase Realtime Databaseを使用した実装は初回だったが、SDKドキュメントの記載は十分なもので、難なく対応できた。
2.メモ帳アプリ ライブラリの最新化 Google Play
Java, Kotlin, Android Studio, okHttp, Realm, Android Support Library, AndroidX, Stetho, PHP, Laravel, MySQL, Docker, Ansible, Deploygte, Backlog, Firebase
プリインストールのアプリだが、ユーザー数も少なく、バグフィックスが主で長らく放置気味であったアプリのソースコードのライブラリ群の最新化。また、サーバーサイドの保守開発の継続。
Androidアプリの改修、サーバーサイドの保守開発を1人で担当
プリインストールのアプリで、個人のメモやWebページをカード形式で保存しておくアプリ。
- Android Support Libraryのサポート終了により、AndroidXへ移行 (Migrate to AndroidX)
- Android Gradle Plugin アップグレード
- ButterKnife アップグレード
- Realm アップグレード
- Fabric SDk 削除
- Google Analytics SDK 削除
- Firebase Analytics 導入
- Firebase Crashlytics 導入
- Play Services SDK アップグレード
- Firebase Messaging アップグレード
ブラックボックステストのみ存在していたので、少しずつライブラリを最新化し、手元のデバイスで確認を行いながら進めました。
リリースでは、アプリの機能の大半で手動テストが必要でした。
また、2017年にこのアプリの継続開発に参加し、Java, KotlinでのAndroidネィティブアプリケーション開発を担当しました。アプリ内DBとしてRealmにより、ユーザー情報、カード情報を管理していました。
また、ユーザーのログイン、データーの同期、データー交換、カード交換、カードダウンロードなどの機能を持つサーバーサイドAPIを引き継ぎ開発しました。PHP、Laravelで実装しました。DBはMySQLを使用。サーバーのソースはGitHubのdeploy_keyも用いて管理。APIのデプロイにはAnsibleを使用して簡略化を行っていた。開発環境構築でDockerを使用した。
- ライブラリの大幅な入れ替えを達成し、アプリが十分な品質でリリースされ、クラッシュリポートなどを継続的に測定できる状態にもっていきました。
- サーバーサイドのAPIの構成、仕様、開発フローを整備し、追加開発できる状態を維持しました。
要件定義、設計、コーディング、テスト
Xcode, Swift, DeployGate, Carthage, bitbucket, Bitrise, CocoaPods, Firebase, github-flow, HealthKit, SwiftLint, Realm, AdobeXD
水泳に特化したワークアウトアプリを開発した。
基本機能はiOS標準のワークアウトアプリと同じ。
標準のワークアウトアプリで分かる情報では物足りない層にリーチする。
iOSアプリを1人で担当。クライアントの指定でiPhoneの使用が確定していた。
iOSネィティブアプリのスクラッチの新規開発。
HealthKitを使った実装例は、Appleのドキュメントが不十分であり、Webの情報も少ないと実感している。
仕様上で必要なデータを得るには、HealthKitから得られるデータをつまびらかにし、独自のロジックを組む必要がある。
心拍数の折れ線グラフ、ワークアウト実施日のカレンダーなど標準のUIでは工数がかかる実装があったが、 要件は標準的なものなので、OSSのライブラリで対応した。
- Charts, JTAppleCalendar を使用
設計はModel-View-Presenter。アプリの規模と自己のナレッジからそれが最適と判断したため。
SwiftLintをビルド時に実行されるようにし、コードのチェックを行なっていた。
Bitrise, DeploygateでCI/CDのパイプラインを構築していた。
UIはなるべくXibを活用して作成した。
- アプリとしては実証実験で終了したが、 HealthKitの仕様、実装について十分な知見が得られた。
- Charts, JTAppleCalendarのカスタマイズ性が高かった。
- UITableViewをスクロールしてスクリーンショットを取る知見が得られた。
4.ニュースアプリ Google Play
設計、コーディング、テスト、運用、保守
Kotlin, Java, Git, git-flow, Android Studio, Android SDK, DataBinding, Okhttp, Retrofit, LiveData, Room, Robolectric, Bitrise, Deploygate
Androidネィティブアプリケーション開発。ニュースアプリ。サーバーサイドは他社との連携。
Webのアプリ版。ユーザーは中高年層がメイン。
Androidアプリを3人のチームで担当。
JavaとKotlinでのAndroidネィティブアプリケーション開発。
Androidアプリを3人のチームで、GitHubを使って、git-flowに近い形で進行していた。
FatActivity化していたのでコードベースを刷新して、MVVMを採用した。当時のGoogleのアーキテクチャーガイドを参照した構成にした。
新規のクラスは妥当な理由がない限りはJavaは避けて、Kotlinを使用した。
Android Architecture Components を取り入れ、ViewModel, LiveData, DataBindingによりModelオブジェクトの状態変化を監視し、Activity, Fragmentに反映させていた。
GPSやWifi通信による位置情報の取得。天気表示の地点決定に使用。
MPAndroidChartを用いた棒グラフの実装。読んだ記事ジャンルの傾向を表示するのに使用。
RecyclerView、RecyclerAdapterを用いた記事一覧の実装。
大相撲の記事では取組表を表示するなど、カテゴリ特有のUIを表示。
DataBindingは、端末によって描画結果が異なるパフォーマンスの問題があったので、XMLの中では単純な処理のみ行うようにした。Layout Inspectorを使用して調査しました。
Robolectricを用いてBindingAdapter周りのUnitTestを書いていた。
FCMによる通知は、通知チャンネルが登場したAndroid 8以上とそれ未満を考慮した実装にしていた。
速報ニュースは重要度;高、定時ニュースは重要度:標準とし、通知をしていた。
Bitrise、Deploygateと連携して、CI/CDのワークフローを組んでいた。
- PR出したけど放置されてるのでライブラリ化した話 - Speaker Deck
- ViewPager2, TabLayoutを用いてタブ付きスワイプビューを作成。そのタブを無限ループさせる。- blog
- ソースコードのアーキテクチャーを維持し、コードの可読性、保守性の高い状態を維持できた。順調に大相撲、プロ野球など新カテゴリの記事をリリースできた。
- 速報ニュースはUIとして疑問が残ったが、リリース時はユーザー数の伸びが大きくなった。
- Android開発のライブラリを公開する知見が得られた。
5.ボットつき家庭用グループチャットアプリ Google Play
設計、コーディング、テスト
サーバーサイド、ネィティブアプリ、インフラ(ミドルウェア)
Java, Android Studio, Git, PHP, Redis, Netbeans, Vim, node.js, socket.io, Apache, Slack, Deploygte, Backlog, AWS S3, Docker, Xcode, Swift4, cocoapods, bash, Dialogflow.ai
グループ(ご家庭)向けのチャット機能と、AIボットによる自動応答機能がついたネィティブアプリケーション開発。また、バックエンドのプラットホーム開発。
サーバーサイドAPI、Androidアプリ、iOSアプリ開発を兼任
クライアントアプリはiOS、Androidのネィティブアプリケーション開発、チャット機能でsocket.ioのライブラリを使用し、複数人でのグループチャットを実装。
チャット機能のサーバーサイドは、リアルタイム性を確保するため、node.jsでのsocket.ioを使用し、DBはRedisを使用した。
画像ファイルサーバとしてS3を使用し、アクセスを限定して安全性を確保。
AIボットによる自動応答として、Dialoflowによる自然言語解析を行い、対話形式でのニュース、キーワード検索などを提供した。
また、ユーザーデータ、チャットルーム、チャット履歴の保存などの機能を持つサーバーサイドAPIをPHPで開発した。
Apacheとsocket.ioの連携周りでミドルウェアの設定を担当した。
開発環境の構築において自主的にDockerを導入した。
サーバーサイドの設計は、実証実験でチャットボットで家電を動かすプロジェクトが別件であり、その設計を参考にした。
FCMを用いたAndroidアプリへのプッシュ通知周りなどを実装した。
iOSのネィティブアプリの設計から全実装を担当した。
ドメインロジックをModelに分割したり、Viewのロジックを切り出したりして、ViewControllerの肥大化を防ぐ工夫をした。
bashによりXcodeとDeploygateを連携させて、CDを構築した。
チャットのテキストはアプリで暗号化、復号している。
- プロジェクトとしては実証実験で終了した。一つのシステムでのインフラ、サーバーサイド、モバイルアプリと広範囲の設計と実装を経験、自然言語解析の機械学習も取り入れ、開発者としての自信が深まりました。
- Swiftでのテキストの暗号化、復号の知見が得られた。
主に、iOSネイティブアプリの開発担当でしたが、リソースに応じて、Androidネィティブアプリの開発も行っていました。
iOSアプリ開発はObjective-CでUI作成、サーバーAPIとの通信、ローカルDBへの保存など。
Foundation, UIKit, Core Location、MapKit、In App Purchace, Push Notification, CoreData, AVFoundation, Core Bluetooth などiOS特有の様々なフレームワークを経験しました。
パッケージ管理にはCocoapodsを用いてました。
MVCかつオブジェクト指向を意識したコードを書いていました。
AndroidアプリはJavaによる開発で、UI作成、サーバーAPIとの通信、SQLiteへデータを暗号化して保存などの実装を経験しました。
コミック配信システムのサーバーサイドはJavaでのAPI開発であり、Seasar2、Windows Azureを使用しました。webロール、workerロールを併用し、PaSSの特徴を活かしたシステム構成にしました。
音楽配信管理システムのDBではSQL Serverのストアドプロシージャの実装などを担当しました。5テーブルぐらいをjoinしたSQLを繋げていくなど、複雑なものばかりで、前任者の残りを汲み取りながらの機能開発に苦労しました。
社内向けのプロジェクトの進行はアジャイル開発を実践し、ベースはScrumでやっていました。
スクラムコーチを招聘し、1年ぐらいで、所属組織のプロジェクトの大半がアジャイル開発に変わりました。
スクラムのプラクティスを実践することで、自律的なチームの育成を学びました。
また社内研修でアジャイル開発の体系的な知識を身につけました。
またITサービスマネジメントのベストプラクティスであるITIL V3を身につけました。
iOSネィティブアプリケーション開発の社内研修の講師を、2013年1-2月に担当しました。テキストの監修や講義を行い、得るものは多かったです。テキスト中心の演習形式でスタンドアロンのアプリを複数作成してもらいました。またプログラミングは座学より実践だと強く実感しました。
天気予報情報のネィティブアプリケーションのリニューアル。リリース後の運用開発。 典型的な天気予報アプリ
Xcode, Objective-C, iOS, iOSSDK, Subversion, Redmine, Jenkins, In-App Purchase, CoreData
iOSアプリの開発を4人のチームで担当
iOSネィティブアプリケーションのリニューアルから、リリース後の継続的開発を担当した。
プロジェクト進行はアジャイルで行った。
アジャイルへの前提知識がないメンバーが多かったので、初期はスクラムコーチの役割も担当した。
前提知識の説明、カンバンによるスプリントの実践、振り返りの実施などで、自律的なチームへと変わっていった。
一方、開発では、プッシュ通知、位置情報の追跡、雨レーダー、雨通知の課金機能などを担当した。
CoreDataを用いたマルチスレッドの実装に嵌り、苦労した。stackoverflowを参考にして解決した。
複数人で開発すると、競合して編集しやすいプロジェクトファイルなどはチャットで声掛けをルールにして、競合を防止していた。
JenkinsとXcode Plugin を用いてCI / CDをしていた。
- スクラム開発、カンバン、振り返りの実施により、開発状況の見える化、自律的なチーム形成を実現した。開発チーム外の評価が上がった。
- リニューアル版を無事リリースし、当初は順調に月額課金者を獲得した。
トレーディングカードゲームと連携したコレクションサービスのネィティブアプリケーション。集めたカードをアプリでコレクションできる。アプリ独自のARがある。
Xcode, Objective-C, iOS, iOSSDK, Subversion, Redmine, CoreAnimation
iOSアプリの開発を4人のチームで担当
iOSネィティブアプリケーションの初期リリースから継続的開発を担当。
プロジェクト進行はアジャイルで行った。
所持しているカードを把握するUI、カード合成アニメーション機能、課金機能、メンバー卒業による組閣対応などの機能開発を行った。
カード画像をダウンロードしてローカルに保存していたので、iOS Data Storage Guidelinesに従い、バックアップが行われないように Application_Home/Library/Caches に保存した。
プロジェクト初期は、中国のオフショアとの合同チームであったため、ユーザーストーリーやタスクの割り振りに苦労した。これは中国側とは同じユーザーストーリーをやらないようにし、かつ細かな管理はしないことで、改善した。
また、アプリケーションのAppleによる審査では、一部の機能をログインユーザーでなくても使えるようにする追加改修を強いられる、継続課金に対するノウハウやドキュメントの少なさによる実装ミス、競合アプリと間違われるなど、スケジュールが厳しいタイミングで、3回リジェクトされるという、予定外の事態もあった。
初リリースではそういった粘り強さも要求された。
- Appleによる審査で予想外の苦労もあったが、初リリースを予定期日にできた。トレーディングカードゲームの発売日に合わせることができた。リリース当初はアプリ内の課金を順調に獲得した。
- 中国のオフショアとの合同チームでの進行も良い成果がでた。
大手ECサイトを横断的に検索し、商品検索、カテゴリーランキングデータ表示、お気に入り記録機能など。価格.comのようなアプリ。Amazon API, 楽天 API, Y!ショッピング APIを使用し、これら3サイトを横断検索する。
企画、設計、開発、テスト、AppStoreへの登録、リリース
Xcode, Objective-C, iOS, iOSSDK, SQLite, SQL, AmazonAPI, 楽天API, Y!ショッピングAPI
iOSネィティブアプリケーションの企画、仕様書作成、ソースコード設計、全機能の組み込み、実機での動作検証、App Storeへのリリースまでを担当しました。
Minimum Viable Productの戦略を知らなかったので、機能を絞って、初期リリースをスケジュール早めで公開する、ということができなかった。アプリの価値を考え絞り、最低限の機能でリリースし、早めにニーズを知るということができなかった。
またObjective-C 初心者かつ、iOSアプリ開発の資料も少なかったので、ノウハウがたらず開発初期は難航した。
またアプリのサスペンド状態がOSで用意されていなかった(ホームボタンを押すとアプリが終了する)ので、起動時に前画面復元機能を実装したが、画面の構成要素が多く、またサンプルコードが少なかったので、とても苦労しました。
App Storeアプリの動作を参考にして実装しました。App Storeアプリは起動時に終了時画面だけを復元し、それより前の画面は、画面を戻るときに復元していたので、これを指針として、コードは自力で少しずつ組み込みました。これで一つのタブで上手くいったので、他のタブにも同様なコードを組み込んで、なんとかやりとげました。
またARCがなかったので、オブジェクトの所有権管理をリファレンスカウント方式で実装していたので、考え方に慣れるのに苦労しました。
またユーザーが実際に使用するような環境でのテストが手薄になってしまったので、通信が悪い環境で発生するバグを残してしまった。こういったバグへの修正リリースを早めに申請したが、こちらが焦ってもAppleの審査は早くはならなかった。審査期間を考慮したリリーススケジュールが必要であった。
振り返りを記事にしました
- 週間ダイヤモンド 2010/05/15の号に載りました。
- リリース当初は無料アプリランキングの生活カテゴリで上位になりました。
- 少人数でアプリの企画からリリースまで達成することができた。引き続き追加開発をした。
会社がパッケージソフトを主力事業としていたので、パッケージソフト(筆王など)の開発業務や、QA、インストーラー作成、CDマスタリング作業、WEBマーケティング、ユーザーサポート、量販店商品コーナー作成陳列など様々な業務を経験しました。
Windows インストーラーの仕組み、Windows OSの仕組みに詳しくなりました。マーケティングとしてWEBサイト作成を行うことで、サイト作成やSEOの知識も身につけました。
OracleをDBとした、多くの業務システム開発を担当しました。
DBレイヤーの担当が多く、ストアドプロシージャ作成などで、PL/SQLを駆使することで、DBの知識や操作を体得しました。
また短期間のプロジェクトが多かったですが、ERPシステムの仕組みや、ウォーターフォールによるプロジェクト管理手法を学びました。IT業界の下請け構造を身を持って体験しました。