tag:crieit.net,2005:https://crieit.net/tags/%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA/feed 「アプリ開発」の記事 - Crieit Crieitでタグ「アプリ開発」に投稿された最近の記事 2023-07-29T05:35:55+09:00 https://crieit.net/tags/%E3%82%A2%E3%83%97%E3%83%AA%E9%96%8B%E7%99%BA/feed tag:crieit.net,2005:PublicArticle/18544 2023-07-29T05:35:55+09:00 2023-07-29T05:35:55+09:00 https://crieit.net/posts/Nuxt3-Cloudflare-GooglePlay-64c426ab215c8 【個人開発】アイデア出しから公開・プロモーションまでまとめ(Nuxt3、Cloudflare、GooglePlay) <h1 id="1. はじめに"><a href="#1.+%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">1. はじめに</a></h1> <p>個人開発の大体の流れがつかめるように、アイデア出しから公開・プロモーションまでをまとめました。</p> <h2 id="1-1. 作ったアプリ"><a href="#1-1.+%E4%BD%9C%E3%81%A3%E3%81%9F%E3%82%A2%E3%83%97%E3%83%AA">1-1. 作ったアプリ</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://lisble.net/about/"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906025/2eb38bfc-0efc-d719-9baa-d0967308e507.png" alt="シンプルな買い物リスト-lisble リスブル" width="350"></a></p> <div class="table-responsive"><table> <thead> <tr> <th>About</th> <th>List</th> <th>History</th> </tr> </thead> <tbody> <tr> <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906025/01ff7a29-9672-8717-161b-807bfd85f014.png" alt="Aboutページのスクリーンショット.png" width="120" height=""></td> <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906025/1e53b87e-f6d3-8ef8-8646-f66b8c02dbb2.png" alt="リストページのスクリーンショット" width="120" height=""></td> <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906025/64e97b97-f950-2f48-e346-63a506643401.png" alt="履歴ページのスクリーンショット" width="120" height=""></td> </tr> </tbody> </table></div> <div class="table-responsive"><table> <thead> <tr> <th></th> <th>基本操作</th> </tr> </thead> <tbody> <tr> <td>① <strong>リスト作成</strong> ② <strong>買い物完了でチェック</strong> ③ <strong>チェック済みを削除</strong> ※これらの手順だけで簡単操作</td> <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906025/33bc7e8d-e258-bdbd-85e4-affb6c585cd9.gif" alt="買い物リスト-lisble リスブルの基本操作" width="160" ></td> </tr> </tbody> </table></div> <p><strong>『<a target="_blank" rel="nofollow noopener" href="https://lisble.net/about/">買い物リスト・メモ - Lisble リスブル</a>』</strong><br /> <div class="table-responsive"><table> <thead> <tr> <th>iOS,PC</th> <th>Android</th> </tr> </thead> <tbody> <tr> <td><a src="https://lisble.net/about/" target="_blank" rel="noopener noreferrer" ><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906025/992c120a-33bd-48d1-93cd-d97fde42d22c.png" alt="シンプルな買い物リスト-lisble リスブル" width="250"></a></td> <td><a src="https://play.google.com/store/apps/details?id=net.lisble.twa" target="_blank" rel="noopener noreferrer" ><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906025/f92cdde6-21d1-2d3f-b8bf-9fb72a74abde.png" width=230 alt="googlePlayバッジ" ></a></td> </tr> <tr> <td>iOS,PCの方は、PWAの為、メニューから <strong>「ホーム画面に追加」</strong> をお願いします。</td> <td>このアプリは Google Play で入手できます。</td> </tr> </tbody> </table></div></p> <h1 id="2. 0から公開までの流れ"><a href="#2.+0%E3%81%8B%E3%82%89%E5%85%AC%E9%96%8B%E3%81%BE%E3%81%A7%E3%81%AE%E6%B5%81%E3%82%8C">2. 0から公開までの流れ</a></h1> <h2 id="2-1. アイデア"><a href="#2-1.+%E3%82%A2%E3%82%A4%E3%83%87%E3%82%A2">2-1. アイデア</a></h2> <p>1番大事だけど一番頭を悩ませました。<br /> 新しいものか、既存のサービスでの差別化の二択で、はじめてということで後者にしてしまいました。<br /> これからもアンテナをはって次につなげたいです。</p> <p><strong>アイデアの出し方</strong><br /> * とにかく紙に書く<br /> * 不満・面倒・悩み・困っていること<br /> * 人間観察(周りの人)・他業種の業務課題<br /> * 真似 → シンプル化・別分野へ応用・既存のサービスの不満解消<br /> * 海外のサービス調査<br /> * ニッチ・マニアック(自分の強み・趣味)<br /> * 合体・逆</p> <p>既存のサービスの発展系か、何かの組み合わせか<br /> 思いついたらメモ 📝</p> <p><strong><em>参考サイト</em></strong><br /> <a target="_blank" rel="nofollow noopener" href="https://shuheblog.com/programing-app-idea-creative">アプリ開発でアイデアが浮かばないあなたへ。独創的なアイデアの出し方</a><br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/MasatoraAtarashi/items/eec4642fe1e6ce79304d">ポートフォリオや個人開発で使えそうなアイデア</a></p> <h2 id="2-2. 要件定義"><a href="#2-2.+%E8%A6%81%E4%BB%B6%E5%AE%9A%E7%BE%A9">2-2. 要件定義</a></h2> <p><strong>①要件(こうだったらいいな)</strong><br /> * 出来る、出来ないを考えずあげていく</p> <p><strong>②要件の為の機能</strong><br /> * ここで出来る、出来ないを考える<br /> * 最低限必要な機能を絞る<br /> * 実装方法が思いつかない機能は省略</p> <hr /> <ul> <li>出先で「あれあったかな❓」を解決したい → 買い物履歴を残して最近買ったものをわかるようにする機能</li> <li>在庫の把握・重複購入を減らしたい → 買い物履歴から同じ単語入力時に色の変化で知らせる → 入力中に知らせることにより在庫を思い出すきっかけにもなる<br /> etc...</li> </ul> <p><strong>③出来ればマネタイズも考える</strong><br /> 1. <strong><em>広告</em></strong>:アフィリエイト、AdSense(web)、AdMob(アプリ)<br /> 2. <strong><em>課金</em></strong>:広告削除、追加コンテンツ、アイテム<br /> 3. <strong><em>寄付</em></strong><br /> 4. <strong><em>有料</em></strong>:買い切り<br /> 5. <strong><em>サブスク</em></strong>:月額制</p> <p>とにかく一連の流れを経験したく、マネタイズまでの道のりが見えたのが本アプリ案で、結果Amazonアソシエイト、AdSenseになりました。<br /> AdSenseは受かりませんでした。継続して挑戦します。</p> <p><strong>④利用技術</strong><br /> 🔑 <strong><em>ログイン・ユーザー登録無し</em></strong>、、広告も可でとにかく<strong><em>お金をかけずに</em></strong>を優先して、SPAで制作することにしました。<br /> - GooglePlay Developer 申請・登録25ドル(当時3,352円)<br /> - 独自ドメイン Xserverドメイン 初年度のみ1円<br /> - 更新、移管はCloudflare予定</p> <p><strong><em>アイデア・デザイン</em></strong><br /> Xmind(マインドマッピング)<br /> Figma<br /> <strong><em>コード</em></strong><br /> Nuxt3(Composition API)・TypeScript・Tailwind CSS<br /> <strong><em>インフラ</em></strong><br /> Cloudflare<br /> <strong><em>開発環境</em></strong><br /> VSCode・Git、GitHub</p> <p><strong><em>参考サイト</em></strong><br /> <a target="_blank" rel="nofollow noopener" href="https://tenshoku-miti.com/takahiro/create-original-application/">【5ステップ】初めてのオリジナルアプリの作り方!アイデアの出し方も公開</a></p> <h2 id="2-3. 設計"><a href="#2-3.+%E8%A8%AD%E8%A8%88">2-3. 設計</a></h2> <p><strong>①画面設計</strong><br /> 1. 必要なページ列挙 ➡ 階層・整理<br /> 2. ワイヤーフレーム(紙手書き)下書き<br /> 3. ワイヤーフレーム(figma)清書</p> <p><strong><em>参考サイト</em></strong><br /> <a target="_blank" rel="nofollow noopener" href="https://b-risk.jp/blog/2019/10/wireframe/">ワイヤーフレーム(画面設計)の作り方</a><br /> <a target="_blank" rel="nofollow noopener" href="https://aqcg.jp/web_point/">Web画面設計の手順と重要なポイント</a></p> <p><strong>デザインの4原則</strong><br /> 1. 「<strong><em>近接</em></strong>」:関連する要素を<strong><em>グループ化</em></strong><br /> 2. 「<strong><em>整列</em></strong>」:関連する要素を<strong><em>見えない線</em></strong>で整列<br /> 3. 「<strong><em>反復</em></strong>」:要素の<strong><em>一貫性</em></strong>、デザインの<strong><em>統一</em></strong><br /> 4. 「<strong><em>対比</em></strong>」:要素の優先度を<strong><em>強弱</em></strong>で示す</p> <p><strong><em>参考サイト</em></strong><br /> <a target="_blank" rel="nofollow noopener" href="https://designpartner.jp/principle/#:~:text=%E3%80%8C%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AE4%E5%8E%9F%E5%89%87%E3%80%8D%E3%81%AF,%E3%82%B7%E3%83%BC%E3%83%B3%E3%81%A7%E3%82%82%E5%BD%B9%E7%AB%8B%E3%81%A4%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%80%82">お役立ち知識:デザインの4原則 - デザインパートナー</a></p> <p><strong>②データ設計(構造)</strong><br /> * データの設計図</p> <h2 id="2-4. 開発"><a href="#2-4.+%E9%96%8B%E7%99%BA">2-4. 開発</a></h2> <ul> <li>設計通りに作る</li> <li>最低限の機能</li> <li>制作途中で機能の追加案を我慢して、とにかく完成させることに集中する(追加の機能を制作してしまいました。なのでここに残しておきます。)</li> </ul> <p><strong>①工夫した機能</strong><br /> - <strong>並べ替え(D&D)・スワイプ機能</strong>をライブラリ(Vue.Draggableは、思うような機能にならなかった)を使用せずに作成<br /> - ↳シンプル化のため、<strong>同じ発火点</strong>で、<strong>参考サイト様</strong>(<a target="_blank" rel="nofollow noopener" href="https://reffect.co.jp/vue/trello-drag-drop-clone/">Trello風タスク並び替えドラッグ&ドロップクローン(Vue.js利用)</a>)を参考に、【<strong>マウス、タッチ、処理回数削減、d&dとswipeの融合、グループ間並べ替え、d&d中の上下の画面端scroll</strong>】ロジックを考え自作しました。</p> <div class="table-responsive"><table> <thead> <tr> <th>並び替え機能</th> <th>スワイプ</th> </tr> </thead> <tbody> <tr> <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906025/30495dd3-fec4-c791-cb39-a1c09f78003d.gif" alt="買い物リスト-lisble リスブルの並べ替え動作" width="150" height=""></td> <td><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906025/cb611a1f-9124-472b-1a26-b7c4f53f8ecc.gif" alt="買い物リスト-lisble リスブルのスワイプ動作" width="150" height=""></td> </tr> <tr> <td></td> <td>←<strong>色</strong>  →<strong>削除</strong>※タッチデバイスのみ</td> </tr> </tbody> </table></div> <ul> <li>スマホとPCの<strong>挙動の違い</strong>など(ENTER、終了時の処理...)</li> <li>日本、世界の<strong>日時の表示形式</strong>(履歴)</li> <li>Amazonアソシエイトの各国の設定(<strong><em>OneLink</em></strong>)</li> <li>アニメーション(数字のドラムロール、追加削除時...)etc...</li> </ul> <p><strong>②多言語化(i18n)</strong><br /> <strong>@intlify/nuxt3</strong>使用<br /> 日/英で単語の長さの違いによる表示崩れに注意</p> <hr /> <p><strong><em>未解決問題</em></strong><br /> 日本語で検索時、検索結果が英語サイトのtitleとdescriptionになってしまう問題(同じURLで 日/英 にしたい)</p> <p><strong><em>確認</em></strong><br /> meta tagの設定(title、description等)日/英 切替時にきちんと切り替わっている。</p> <p><strong><em>↓ためしたこと↓</em></strong><br /> - <a target="_blank" rel="nofollow noopener" href="https://zenn.dev/koushikagawa/articles/32ef098e0698c7">Nuxt.jsのi18n多言語対応したら、日本語で検索した時の検索結果が英語になってしまった。解決できたので対応方法を記載します。</a><br /> - <strong>@intlify/nuxt3</strong> で <code>detectBrowserLanguage: false,</code>にあたる設定がない??<br /> - sitemapの設定 (hreflang属性)<br /> - Google Search Consoleに日/英を認識させる方法??...<br /> - (2023年7月) Nuxt3での多言語化はまだ開発中らしいので情報待ち🍥 → <a target="_blank" rel="nofollow noopener" href="https://github.com/intlify/nuxt3">intlify/nuxt3: Nuxt 3 Module for vue-i18n-next</a></p> <hr /> <p><strong>③プライバシーポリシー</strong><br /> <strong><em>参考サイト</em></strong><br /> <a target="_blank" rel="nofollow noopener" href="https://biz.moneyforward.com/contract/basic/1237/">プライバシーポリシーとは何か?必要性、記載事項をわかりやすく解説</a></p> <p><strong>④テスト</strong><br /> - 個人情報を扱っているなら、徹底的に安全確認<br /> - 例外処理</p> <h2 id="2-5. 公開"><a href="#2-5.+%E5%85%AC%E9%96%8B">2-5. 公開</a></h2> <p><strong>①(SPA SSG) 静的ファイルホスティングサービス【無料】</strong><br /> 1. GitHub Pages<br /> 2. Firebase Hosting<br /> 3. Netlify<br /> 4. Vercel<br /> 5. <strong><em>Cloudflare Pages</em></strong></p> <p>無料プランの枠・サイトのパフォーマンス・商用利用可で<strong><em>Cloudflare Pages</em></strong></p> <p><strong><em>参考サイト</em></strong><br /> <a target="_blank" rel="nofollow noopener" href="https://zenn.dev/catnose99/scraps/6780379210136f">Cloudflare Pages・Vercel ・Netlify の違いや使い分けをまとめる</a><br /> <a target="_blank" rel="nofollow noopener" href="https://jpsern.com/netlify-to-cloudflare-pages/">NetlifyからCloudflare Pagesに引っ越しました</a></p> <p><strong>②Google Play Store 配信方法</strong><br /> <strong><em>PWA → TWA</em></strong><br /> * TWA変換ツール「<strong><em>Bubblewrap CLI</em></strong>」使用<br /> * Lighthouse で <strong><em>80</em></strong> 以上のパフォーマンス スコアが必要(↓に記述)</p> <p><strong><em>参考サイト</em></strong><br /> <a target="_blank" rel="nofollow noopener" href="https://flaming.codes/ja/posts/trusted-web-activity-create-pwa-android-app">信頼できるWebアクティビティ</a><br /> <a target="_blank" rel="nofollow noopener" href="https://0115765.com/archives/7932#outline__2_2">【TWA】完全開発ガイド=超簡単にPWAをPlay Storeで配信しよう</a><br /> <a target="_blank" rel="nofollow noopener" href="https://sqripts.com/2022/12/14/22480/">PWA対応サイトをAndroid APK(AAB)に変換する</a></p> <p><strong>③Lighthouse のパフォーマンス改善(リファクタリング)</strong><br /> - <strong><em>cssの最適化</em></strong> → 読み込み順、削除、animation(<code>transform</code>,<code>opacity</code>...)etc...<br /> - <strong><em>googleFonts, Analytics</em></strong> → GTM使用、読み込むタイミング、読み込み方、文字の限定etc...<br /> - <a target="_blank" rel="nofollow noopener" href="https://deep-space.blue/web/2090">【2022年3月】Google Fontsのパフォーマンス比較&ハリー・ロバーツ方式の勝手に改良版</a><br /> - <a target="_blank" rel="nofollow noopener" href="https://nullnull.dev/blog/google-fonts-subset/#%F0%9F%8F%A9______________________%F0%9F%91%A8%F0%9F%91%A9">Google Fontsを簡単にサブセット化する方法</a><br /> - <strong><em>Web Worker</em></strong> → 並列処理 <a target="_blank" rel="nofollow noopener" href="https://note.com/npaka/n/nc930b61840ac">Web Workerの使い方</a><br /> - <code>requestAnimationFrame()</code> → 「60fps」 <a target="_blank" rel="nofollow noopener" href="https://www.webdesignleaves.com/pr/jquery/requestAnimationFrame.html">requestAnimationFrame の使い方</a><br /> etc...</p> <p>Mobile :arrow_down:<br /> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906025/ea2d91d0-76be-ff81-0c8f-ee55669bf1e6.png" alt="Lighthouseモバイルのスコア" width="500" height=""><br /> Desktop :arrow_down:<br /> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906025/23080b76-e970-9ecb-b92d-3f873b2878e7.png" alt="Lighthouseデスクトップのスコア" width="500" height=""></p> <h2 id="2-6. リリース後"><a href="#2-6.+%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E5%BE%8C">2-6. リリース後</a></h2> <p><strong>①掲載用スクリーンショット、画像作成</strong><br /> * figma制作<br /> * サイトにより、サイズ、比率、枚数、が異なる</p> <p><strong>②登録サイトに投稿/掲載依頼</strong><br /> 当たって砕けろ、チャレンジ精神で色々掲載依頼を出してみた結果です。<br /> <a target="_blank" rel="nofollow noopener" href="https://zenn.dev/yamatake/articles/b93d87ed134f31">個人開発者に告ぐ!「告知=恥ずかしい」を脱却しよう~実例データから重要性を解説</a></p> <p><strong><em>登録or掲載</em></strong> → 🎉<br /> メール・問い合わせ反応待ち → 📧<br /> 更新が止まっているサイトが多い</p> <p><strong>日本</strong><br /> - <a target="_blank" rel="nofollow noopener" href="https://app-liv.jp/5347459/"><strong><em>Appliv</em></strong></a> → 🎉 <strong><em>レビュー</em></strong>、とても丁寧な対応 :thumbsup:<br /> - <a target="_blank" rel="nofollow noopener" href="https://applion.jp/android/app/net.lisble.twa/"><strong><em>APPLION</em></strong></a> → 🎉 ランキング<br /> - <a target="_blank" rel="nofollow noopener" href="http://houkago-no.appspot.com/app_detail/6278466848686080"><strong><em>放課後アプリ部</em></strong></a> →🎉 登録<br /> - <a target="_blank" rel="nofollow noopener" href="https://applishow.com/detail/DsL3Q4b5hxxm/"><strong><em>Applishow</em></strong></a> → 🎉 登録<br /> - <a target="_blank" rel="nofollow noopener" href="https://www.approom.me/app/01H2J1N7SXF5JSH8ZMMDMGBF2V?platform_id=2"><strong><em>AppRoom</em></strong></a> → 🎉 登録 <a target="_blank" rel="nofollow noopener" href="https://www.approom.me/articles/01H2JGWJ3K3J72WVN7EJT5CKYD"><strong><em>アプリ記事掲載</em></strong></a><br /> - <a target="_blank" rel="nofollow noopener" href="https://seekups.seekgeeks.net/views/detail.html?id=712"><strong><em>SeekUps</em></strong></a> → 🎉 登録<br /> - <a target="_blank" rel="nofollow noopener" href="https://rrws.info/archives/3197"><strong><em>ロケットリリース</em></strong></a> → 🎉 登録<br /> - <a target="_blank" rel="nofollow noopener" href="https://appstimes.jp/posts/2991"><strong><em>Appstimes</em></strong></a> → 🎉 登録<br /> - <a target="_blank" rel="nofollow noopener" href="https://anymake.app/products/kAjQm0f6tswHGaKTd0G5"><strong><em>AnyMake</em></strong></a> → 🎉 登録<br /> - <a target="_blank" rel="nofollow noopener" href="https://www.makepost.net/projects/386"><strong><em>makepost</em></strong></a> → 🎉 登録<br /> - <a target="_blank" rel="nofollow noopener" href="https://www.mitsukarusite.jp/2023/06/550/"><strong><em>MITSUKARU!</em></strong></a> → 🎉 登録<br /> - <a target="_blank" rel="nofollow noopener" href="https://devhaunt.com/product/111"><strong><em>DevHaunt!</em></strong></a> →🎉 登録、とても丁寧な対応 👍<br /> - <a target="_blank" rel="nofollow noopener" href="https://kojin.dev/application/41"><strong><em>個人dev</em></strong></a> → 🎉 登録<br /> - <a target="_blank" rel="nofollow noopener" href="https://appget.com/c/developerpage/createdevpost/"><strong><em>アプリゲット</em></strong></a> → ゲームのみ<br /> - <a target="_blank" rel="nofollow noopener" href="https://www.appbank.net/"><strong><em>AppBank</em></strong></a> → 📧<br /> - <a target="_blank" rel="nofollow noopener" href="https://applision.com/review/"><strong><em>Applision</em></strong></a> → 📧<br /> - <a target="_blank" rel="nofollow noopener" href="https://tsukulog.work/"><strong><em>ツクログ</em></strong></a> → 📧 クリエイター登録済み、まだ作品は掲載されない(2度投稿)<br /> - <a target="_blank" rel="nofollow noopener" href="https://octoba.net/"><strong><em>octoba</em></strong></a> → 📧<br /> - <a target="_blank" rel="nofollow noopener" href="https://newlaun-ch.com/"><strong><em>NewLaun-ch</em></strong></a> → 📧<br /> - <a target="_blank" rel="nofollow noopener" href="https://appllio.com/"><strong><em>appllio</em></strong></a> → 📧<br /> - <a target="_blank" rel="nofollow noopener" href="https://appnavi.info/"><strong><em>appnavi</em></strong></a> → 📧<br /> - <a target="_blank" rel="nofollow noopener" href="https://androlion.org/"><strong><em>Androライオン</em></strong></a> → 📧条件:レビュー<br /> - <a target="_blank" rel="nofollow noopener" href="https://androrank.com/?m=send"><strong><em>AndroRank</em></strong></a> → 📧条件:レビュー<br /> - <a target="_blank" rel="nofollow noopener" href="https://android-apps.org/"><strong><em>Androidアップス</em></strong></a> → 📧<br /> - <a target="_blank" rel="nofollow noopener" href="https://softcollection.org/android/"><strong><em>Androidコレクション</em></strong></a> → 📧<br /> - <a target="_blank" rel="nofollow noopener" href="https://news.mynavi.jp/top/notice/press/"><strong><em>マイナビニュース</em></strong></a> → 📧<br /> - <a target="_blank" rel="nofollow noopener" href="https://corp.itmedia.co.jp/pr/"><strong><em>ITmedia</em></strong></a> → 📧<br /> - <a target="_blank" rel="nofollow noopener" href="https://corp.itmedia.co.jp/media/pr/"><strong><em>ITmedia ねとらぼ</em></strong></a> → 📧<br /> - <a target="_blank" rel="nofollow noopener" href="https://androck.jp/contact/"><strong><em>AndRock</em></strong></a> → 📧<br /> - <a target="_blank" rel="nofollow noopener" href="http://app-vip.jp/posts/add"><strong><em>AppVIP</em></strong></a> → 📧<br /> - <a target="_blank" rel="nofollow noopener" href="https://applink.jp/request"><strong><em>AppLink</em></strong></a> → 📧<br /> - <a target="_blank" rel="nofollow noopener" href="https://www.gapsis.jp/"><strong><em>GAPSIS</em></strong></a> → 📧</p> <hr /> <p><strong>海外</strong></p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://www.producthunt.com/my/products"><strong><em>Product Hunt</em></strong></a> → 🎉 登録から1週間待つ必要がある</li> <li><a target="_blank" rel="nofollow noopener" href="https://alternativeto.net/software/shopping-list--lisble/about/"><strong><em>AlternativeTo</em></strong></a> → 🎉 登録</li> <li><a target="_blank" rel="nofollow noopener" href="https://appstoreapps.com/submit-your-app/"><strong><em>app store apps</em></strong></a> → 📧</li> <li><a target="_blank" rel="nofollow noopener" href="https://www.appcraver.com/contact-us/"><strong><em>AppCraver</em></strong></a> → 📧</li> <li><a target="_blank" rel="nofollow noopener" href="https://arstechnica.com/contact-us/"><strong><em>arttechnica</em></strong></a> → 📧</li> <li><a target="_blank" rel="nofollow noopener" href="https://www.androidappsreview.com/submit-your-android-app/"><strong><em>Apps Review</em></strong></a> → 📧</li> <li><a target="_blank" rel="nofollow noopener" href="https://androidcommunity.com/send-tips/"><strong><em>community</em></strong></a> → 📧</li> <li><a target="_blank" rel="nofollow noopener" href="http://www.androidapplog.com/suggest-app/"><strong><em>App Log</em></strong></a> → 📧</li> <li><a target="_blank" rel="nofollow noopener" href="https://getandroidstuff.com/submit-app/"><strong><em>Get Android Stuff</em></strong></a> → 📧</li> <li><a target="_blank" rel="nofollow noopener" href="https://www.androidguys.com/request-app-review/"><strong><em>Android Guys</em></strong></a> → 📧</li> <li><a target="_blank" rel="nofollow noopener" href="https://www.androlib.com/"><strong><em>androlib</em></strong></a> → 📧</li> <li><a target="_blank" rel="nofollow noopener" href="https://www.apkmirror.com/"><strong><em>APKMirror</em></strong></a> → 📧</li> <li><a target="_blank" rel="nofollow noopener" href="http://appscout.pcmag.com/"><strong><em>PCMag</em></strong></a> → 📧</li> <li><a target="_blank" rel="nofollow noopener" href="https://www.newsreports.com/contact/"><strong><em>NEWSREPORTS</em></strong></a> → 📧</li> <li><a target="_blank" rel="nofollow noopener" href="https://www.ifanzine.com/contact/"><strong><em>iFanzine</em></strong></a> → 📧</li> </ul> <hr /> <p>※上記以外で無料で宣伝できるサイト、方法があれば教えていただけると嬉しいです。</p> <p><strong>③記事を書く</strong><br /> - Qiita<br /> - <a target="_blank" rel="nofollow noopener" href="https://qiita.com/arieight/items/7935afdaf78d31f8b444">【Nuxt3】はじめての個人開発「買い物リストアプリ」開発記録</a><br /> - Zenn<br /> - <a target="_blank" rel="nofollow noopener" href="https://zenn.dev/arieight/articles/55ec7a38edb940">Nuxt3で初めての個人開発記録【買い物リストアプリ】</a><br /> - Crieit<br /> - <a href="https://crieit.net/posts/Lisble-64bfaf0e5e2b7">シンプルな買い物リストアプリ「lisble リスブル 」の紹介</a><br /> - 【個人開発】アイデア出しから公開・プロモーションまでまとめ(Nuxt3、Cloudflare、GooglePlay)<br /> - note<br /> - <a target="_blank" rel="nofollow noopener" href="https://note.com/arieight/n/nc8cace276feb">値上げ対策! 買い物リスト作成で節約</a><br /> - <a target="_blank" rel="nofollow noopener" href="https://note.com/arieight/n/ne70e5e3865f3">シンプルな買い物リストアプリ「Lisble リスブル 」のご紹介</a><br /> - Medium(英語記事)<br /> - <a target="_blank" rel="nofollow noopener" href="https://medium.com/@arieight_8/price-increase-measures-save-money-by-making-a-shopping-list-120cec400b15">Price increase measures! Save money by making a shopping list</a></p> <p><strong>④Twitter(日本語/英語)</strong><br /> - Twitter日本語ver.:<a target="_blank" rel="nofollow noopener" href="https://twitter.com/arieight_8">@arieight_8</a><br /> - Twitter英語ver.:<a target="_blank" rel="nofollow noopener" href="https://twitter.com/Lisble_en">@Lisble_en</a><br /> - 登録or掲載 → つぶやく<br /> - 機能一覧、設定一覧、動画(gif)でツイート<br /> - 開発中からつぶやいた方が良い</p> <p><strong><em>参考サイト</em></strong><br /> <a target="_blank" rel="nofollow noopener" href="https://www.producthunt.com/posts/shopping-list-lisble">個人開発したWebサービスをリリースした後にやったこと / やり続けていること</a></p> <h1 id="3. 気付き・反省点・まとめ"><a href="#3.+%E6%B0%97%E4%BB%98%E3%81%8D%E3%83%BB%E5%8F%8D%E7%9C%81%E7%82%B9%E3%83%BB%E3%81%BE%E3%81%A8%E3%82%81">3. 気付き・反省点・まとめ</a></h1> <ul> <li>開発を0からして、初めてコードをさわって新しい概念にふれた時くらい勉強になり、とても知見が広がり良かったです。</li> <li>プログラミング以外の作業が初だったので「プログラミング:他 = 3:7」くらいの感覚でした。様々なデザインが予想より大変でした。</li> <li>一番面白いと感じた作業は、ロジックを考えて形になった時でした。<br />  </li> <li><strong>アイデア</strong> → 紙やXMindに思いつく限りまとめたのですが、総合的な判断で結局既存のサービスに追加機能の方向になってしまいました。マネタイズまで含めたアイデアが難しいです。どうせやるなら一通りやってみたかったので次回以降にしました。常にアンテナをはって知見を広げていいこうと思いました。</li> <li><strong>要件定義</strong> → 運用費がかからない、個人情報は扱わない、AdSense以外のマネタイズまで考える、などを考慮してアイデアを絞り、考え、すでにあるサービスと見比べ、アイデアと要件定義をぐるぐるしていました。</li> <li>AdSenseは、コンテンツ不足でwebアプリは受かりづらいらしいです。</li> <li><strong>利用技術</strong> → 平凡なアイデアだったので初めて挑戦する技術(Nuxt3、TypeScript、etc...)を使用してしまいました。</li> <li>デプロイ先など、お金をかけずに運用していくための他の効率の良い方法やサービスを引き続き調査していきます。(Firebaseをデータベース等)</li> <li><strong>設計</strong> → 画面デザインは、UI足したら引き算・データ設計は構造整理</li> <li><strong>開発</strong> → 追加の機能を制作してしまいました。最低限の機能でまず完成を目指すべき</li> <li><strong>工夫した機能</strong> → ToDoの変化型アプリで平凡なアプリで非常に多く数があるため、機能にこだわりました。</li> <li>多言語化して作業が増えた。[Amazon設定、時間形式、表示崩れ、metaタグ、etc...]</li> <li><strong>テスト</strong> → 多視点が重要</li> <li><strong>公開</strong> → 運用費をかけないにこだわる</li> <li><strong>パフォーマンス改善</strong> → 良い学習</li> <li><strong>マネタイズ</strong> → Amazonまでの導線が弱い 要検討</li> <li>著作権・プライバシーポリシー・DDoS対策etc...</li> <li><strong>プロモーション</strong> → Twitterは開発中から・アイデア段階でSNSを考慮したサービス・地道にor金をかけるか・個人の場合限られるので勉強段階からブログや記事など書いておけばまた違ったかも</li> <li>「告知=恥ずかしい」があったので、経験せずにはわからないからできることは全部しようと思いました。</li> </ul> <p>作る前に想像していたよりコード以外の作業が多いとうことに改めて気付かされました。<br /> 制作中、何度も宇宙兄弟のセリフが脳内再生してました。ありがとうございました。</p> <hr /> <blockquote> <p>「また積めばいいよ」<br /> 「次はもっと上手く積めるようになってるよ」<br /> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906025/54752648-2273-f10c-d125-ea6abc68e562.jpeg" alt="『宇宙兄弟』17巻 小山 宙哉「また積めばいいよ」" width="300"><br /> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906025/9d577b8b-90ef-2e69-8d2b-2e67ebfb9794.jpeg" alt="『宇宙兄弟』17巻 小山 宙哉「次はもっと上手く積めるようになってるよ」" width="300"><br /> 出典: 『宇宙兄弟』17巻 小山 宙哉(講談社、2012年3月23日第1発行)</p> </blockquote> <hr /> <p>購入履歴が残せるシンプルな買い物リストアプリ <strong><em>『買い物リスト - Lisble リスブル』</em></strong> です。メモ、ToDoアプリとしても機能します。<br /> 購入履歴の保存機能により、無駄な重複購入を防ぎ、在庫の備忘録にもなります。<br /> ログイン・ユーザー登録不要、無料ですぐにご利用いただけます。<br /> もしよかったら、触ってみてください。</p> <p><strong>『<a target="_blank" rel="nofollow noopener" href="https://lisble.net/about/">買い物リスト・メモ - Lisble リスブル</a>』</strong><br /> <div class="table-responsive"><table> <thead> <tr> <th>iOS,PC</th> <th>Android</th> </tr> </thead> <tbody> <tr> <td><a src="https://lisble.net/about/" target="_blank" rel="noopener noreferrer" ><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906025/992c120a-33bd-48d1-93cd-d97fde42d22c.png" alt="シンプルな買い物リスト-lisble リスブル" width="250"></a></td> <td><a src="https://play.google.com/store/apps/details?id=net.lisble.twa" target="_blank" rel="noopener noreferrer" ><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906025/f92cdde6-21d1-2d3f-b8bf-9fb72a74abde.png" width=230 alt="googlePlayバッジ" ></a></td> </tr> <tr> <td>iOS,PCの方は、PWAの為、メニューから <strong>「ホーム画面に追加」</strong> をお願いします。</td> <td>このアプリは Google Play で入手できます。</td> </tr> </tbody> </table></div></p> <p>Twitter:<a target="_blank" rel="nofollow noopener" href="https://twitter.com/arieight_8">@arieight_8</a></p> <hr /> <p>Google Play および Google Play ロゴは、Google LLC の商標です。</p> Arieight tag:crieit.net,2005:PublicArticle/18503 2023-07-05T08:29:04+09:00 2023-07-05T08:29:04+09:00 https://crieit.net/posts/f26081c9701d81c8dc97559f6edb1a1a 自作アプリをバズらせるために8年間やったこと <p><a href="https://crieit.now.sh/upload_images/2d1fd15dcc688767b4aff3101b6ef37564a4a436c8f39.gif" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/2d1fd15dcc688767b4aff3101b6ef37564a4a436c8f39.gif?mw=700" alt="image" /></a><br /> モーショングラフィックスアプリ9VAeをはやらせようと8年間実施したことをまとめました。<br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/danjiro/items/3004b6993d3e93e0d3fb">https://qiita.com/danjiro/items/3004b6993d3e93e0d3fb</a></p> Danjiro Daiwa tag:crieit.net,2005:PublicArticle/18137 2022-03-07T14:42:49+09:00 2022-03-07T14:42:49+09:00 https://crieit.net/posts/Android-API31 Android 虎の巻 API31対応するための修正 <p><a href="https://crieit.now.sh/upload_images/e3b6c3ee08fdf4b7856b8e60c3a0a2a16225985e9cfea.gif" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e3b6c3ee08fdf4b7856b8e60c3a0a2a16225985e9cfea.gif?mw=700" alt="image" /></a><br /> 上のようなアニメがつくれるフリーソフト<a target="_blank" rel="nofollow noopener" href="https://9vae.blogspot.com/p/9vae-download.html">9VAeきゅうべえ</a> を開発してます。<br /> 現在、Googleアプリストアに登録するには、Android API30 以上が必要ですが、次のバージョンに対応するために、AndroidStudio の build.gradle(Module:) を、31 に変更すると、ビルドエラーがでます。</p> <pre><code>android { compileSdkVersion 31 <--30 から 31に変更 defaultConfig { minSdkVersion 24 targetSdkVersion 31 <--30 から 31に変更 versionCode xxx versionName "x.x" } } </code></pre> <p>AndroidManifest.xml に「android:exported="true"」を追加するとビルドできるようになるみたいです。</p> <pre><code><application <activity android:name="xxxx" android:exported="true" <--これを追加するとエラーがなくなった ... > </activity> </application> </code></pre> Danjiro Daiwa tag:crieit.net,2005:PublicArticle/17948 2022-01-20T19:00:13+09:00 2022-01-20T19:00:13+09:00 https://crieit.net/posts/Dart-61e932ada423e Dartを使った大規模なアプリ開発 <p>こんにちは、Quireです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://quire.io">Quire</a>は、Dartで開発された初めてのWebアプリケーションではありませんが、クライアントとサーバーの両方でDartをふんだんに使ったものとしては、初めてかもしれません。</p> <p><img src="https://storage.googleapis.com/zenn-user-upload/1a086b990119-20220120.png" alt="" /></p> <p>動作の軽い、徹底して階層構造のタスク管理ツールです。このプロジェクトはDartコードで合計53992行、1620 KB。コミュニティーからのオープンソース ライブラリも使っています。</p> <h1 id="私たちについて"><a href="#%E7%A7%81%E3%81%9F%E3%81%A1%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">私たちについて</a></h1> <p>このプロジェクトを開始するまで、私たちはRikuloというDartファンの集まりでした。Rikuloはこれまで、UIフレームワークやUIライブラリ、Webサーバー、メッセージサーバー、DBクライアントなどのDartライブラリをリリースしています。<br /> Dartが2011年に初めてリリースされたとき、すぐに将来性を感じ、さっそく小規模のプロジェクトに着手。その後、ほとんどDartで書かれた大規模アプリの開発へと進みました。今回はそのときの経験をお話しします。Dartによる開発に興味を持っていただければ幸いです。</p> <h1 id="なぜDartか"><a href="#%E3%81%AA%E3%81%9CDart%E3%81%8B">なぜDartか</a></h1> <p>私たちがDartを選んだ理由はたくさんありますが、以下に大きなものを挙げてみます。<br /> - 強く型付けされていて、無数の小さなミスを防ぐことができる。公式IDEのDart Editorは、タイプミスへの即時フィードバックやオートコンプリート機能を備えており、トラッキングも容易。<br /> - 継承がクラスベースで、プロトタイプベースよりも直感的に使える。<br /> - クライアントとサーバーの両方で同じ言語が使えて、データモデルやコードベースを共有できる。<br /> - JavaScriptの問題点をほぼ解消。完全ではないが、以前にあった問題の99%には対応している。<br /> - JavaScript Harmonyで人気の特徴をいくつか備えている。例えばFuture(Promise)パターン、矢印関数など。<br /> - 強力なチームの後ろ盾があり、ハイクオリティーな公式ライブラリや使いやすいAPIを利用できる。まだ開発途上ながら、仕様はすでにかなり安定している。<br /> - サーバーサイドではマルチスレッドではなくイベントループ方式で、好みだった。<br /> - JavaScriptへのコンパイル時にTree Shakingできる(下記参照)。</p> <h5 id="もちろんデメリットもあります。以下に挙げてみます。"><a href="#%E3%82%82%E3%81%A1%E3%82%8D%E3%82%93%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%82%82%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82%E4%BB%A5%E4%B8%8B%E3%81%AB%E6%8C%99%E3%81%92%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%99%E3%80%82">もちろんデメリットもあります。以下に挙げてみます。</a></h5> <ul> <li>コミュニティーがJavaScriptよりも圧倒的に小さい。</li> <li>DartとJavaScript間の通信が自明でない。</li> <li>強い型付けなので、APIのPolyfillが面倒。</li> <li>Dart Editorの性能が(今のところ)大規模プロジェクトに適さない。</li> </ul> <p>強い型のサポートにより、書くプロセスがJavaScriptよりもずっとロバストです。また、Javaよりもシンプルで、Vanilla JavaScriptと比べてもシンプルなことがあります(関数の書き方など)。全体的にDartは扱いやすい言語ですが、以下のような例外はあります。</p> <ul> <li>コンストラクタのボディよりも先にイニシャライザでFinalフィールドを初期化する必要がある。</li> <li>ミックスインの仕様が使いにくく、2.0まで改善されそうにない。</li> <li>ジェネリック型パラメータがクラスにしかなく、関数宣言にない。(そのためコンパイラの負荷が増す)。</li> </ul> <h2 id="クライアントサイド"><a href="#%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%82%B5%E3%82%A4%E3%83%89">クライアントサイド</a></h2> <p>Dart VMがChromeに統合される日まで、JavaScriptにコンパイルして作成することになります。JavaScriptにコンパイルする言語はたくさんありますが、Dartには以下のような独自のメリットがあります。</p> <ul> <li>私たちは開発時、Dart VMを内蔵したChromiumベースのブラウザー、DartiumでDartをネイティブに実行している。このイテレーションではコンパイルが不要で、スムーズに進めることができる。</li> <li>テストとプロダクションの段階でJavaScriptにコンパイルし、すべてのメジャーなブラウザーで実行する。このとき使用するコンパイラがTree Shakingを行い、不要なコードを除去するため、JavaScriptのコードサイズを小さくできる。</li> </ul> <h3 id="サーバーサイド"><a href="#%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%82%B5%E3%82%A4%E3%83%89">サーバーサイド</a></h3> <p>サーバーサイドについてはあまりコミュニティーで話題になりませんが、私たちは以下の理由から、Dartはサーバーサイドのプログラミング言語に入ると考えています。</p> <ul> <li>Webサービスは本質的に非同期なため、イベントループ方式と相性がいい(マルチスレッドと比べて)。</li> <li>クライアントサイドよりもサーバーサイドのほうが、よりロバストで安全なコードが必要。強い型付けの言語はこの点において有利。</li> </ul> <h1 id="サポートライブラリ"><a href="#%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA">サポートライブラリ</a></h1> <p>Quireは約30のライブラリをインポートしています。そのうち10ライブラリはコミュニティーからで、残りはDartからリリースされたものです。Dartに詳しい方ならAngularDARTとPolymer.dartがあると思うかもしれませんが、実はどちらも使っていません。</p> <h5><a target="_blank" rel="nofollow noopener" href="https://angulardart.org/">AngularDART</a>を使わない理由は、以下のとおりです。</h5> <ul> <li>DOMを細かく制御したい。</li> <li>私たちはクライアント構造の構築に独自のアーキテクチャガイドラインを使用しており、そのパラダイムがAngularのロジックと異なる。</li> <li>AngularDARTについて調べたとき、コンパイルされたJavaScriptのコードサイズにかなりのオーバーヘッドが生じた。ただし、これはその後かなり改善された。</li> </ul> <h5 id="私たちは以下の理由から、Polymer.dartも使っていません。"><a href="#%E7%A7%81%E3%81%9F%E3%81%A1%E3%81%AF%E4%BB%A5%E4%B8%8B%E3%81%AE%E7%90%86%E7%94%B1%E3%81%8B%E3%82%89%E3%80%81Polymer.dart%E3%82%82%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82">私たちは以下の理由から、Polymer.dartも使っていません。</a></h5> <ul> <li>カプセル化とイベント リターゲティングのため、ShadowDOMはBootstrapのようなセレクター指向のフレームワークと併用できない。</li> <li>ShadowDOMの外部からスタイルを適用できない。サードパーティーのコンポーネントセットがPolymerで作成されている場合、ユーザーが見た目や感じを変えることは不可能に近い。(更新:2013年12月時点で、内部のスタイルを外部から変更可能。<a target="_blank" rel="nofollow noopener" href="http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom-201/#toc-style-cat-hat">Shadow DOM 201</a>を参照。)</li> </ul> <h3 id="DQuery&Bootjack"><a href="#DQuery%EF%BC%86Bootjack">DQuery&Bootjack</a></h3> <p>私たちのクライアントサイド スタックの基盤は、Rikuloリリースのオープンソース プロジェクト、DQueryとBootjackです。<br /> - <a target="_blank" rel="nofollow noopener" href="https://github.com/rikulo/dquery">DQuery</a>はjQueryの一部、特にイベントデリゲートの仕組みの部分をDartに移植したものです。<br /> - <a target="_blank" rel="nofollow noopener" href="https://github.com/rikulo/bootjack">Bootjack</a>はBootstrap 3の完全な移植で、CSS およびAPIとほぼ同じです。</p> <p>このようにアプリケーション スタックを構築して、JavaScriptについて知っていること、できることを活用しています。</p> <h3 id="Stream"><a href="#Stream">Stream</a></h3> <p>私たちのWebサーバーは、Dartのみで書かれ、ルーティング、フィルター、サーバーサイドMVCなどを備えたStreamです。イベントループ方式とシームレスに連携して動作します。リクエストハンドラーも、ノンブロッキングのルーチンをつなげるだけで書くことができ、従来のマルチスレッド方式よりも生産的かつ快適に仕事ができます。私たちは、Webサービスをスケールし、nginxでHTTPSを処理し、Streamにリクエストをデリゲートしたりもしています。このアーキテクチャによりDart VMを個別にSpawn/Despawnでき、サーバーのアップグレードもユーザーの使用を妨げずに実施できます。</p> <h1 id="終わりに"><a href="#%E7%B5%82%E3%82%8F%E3%82%8A%E3%81%AB">終わりに</a></h1> <p>Dartは使い勝手の良い言語です。この記事がDartコミュニティー成長の一助となることを願っています。最後に、Dartで何ができるか興味のある方は、ぜひ<a target="_blank" rel="nofollow noopener" href="https://quire.io">Quire</a>を試してみてください。</p> uniyeh tag:crieit.net,2005:PublicArticle/17924 2022-01-07T16:19:06+09:00 2022-01-11T17:18:59+09:00 https://crieit.net/posts/Flutter-61d7e96a4daa2 Flutterベースのモバイル向けタイムラインの作成 <h1><a target="_blank" rel="nofollow noopener" href="https://quire.io">Quire</a>タイムライン(モバイル向け)の構造を初公開</h1> <p>2018年に初めてFlutterベースのアプリを作ったときは、とても楽しく興奮しました。それから3年経ち、<a target="_blank" rel="nofollow noopener" href="https://quire.io">Quireアプリ</a>もかなり充実して、従来のモバイル向けプロジェクト管理アプリの域を超えるまでになりました。Quireモバイルアプリの現行バージョンは、階層表示、ボード表示だけでなく、タイムライン表示にも対応しています。</p> <p>モバイルアプリ向けのタイムライン表示の作成を決めたときは、簡単にできるとは思いませんでした。当時は類似の既成コンポーネントもなかったためですが、驚いたのは、インターネットでタイムライン表示の構造についての情報も見当たらなかったことです。そこで、いちかばちか、自分たちで作ってみることにしました。</p> <h5><a target="_blank" rel="nofollow noopener" href="https://quire.io">Quire</a>モバイルアプリ用のタイムラインでは、以下を計画していました。</h5> <ol> <li>横方向への無限日付スクロール</li> <li>レンダリングオンデマンド(ROD)。ビューポートにあるときのみ実行されるWidgetのState</li> <li>任意の位置に素早く配置</li> <li>操作がかんたんで使いやすいインターフェースと、スムーズなユーザーエクスペリエンス</li> </ol> <p>数週間で初期開発が完了し、以下のような構造になりました。</p> <p><img src="https://storage.googleapis.com/zenn-user-upload/52c3e5779da7-20220105.png" alt="" /></p> <ol> <li>タイムラインペインのコアベース(週、週末のセクションなど)</li> <li>タスクリスト(階層構造のタスクリスト)</li> <li>タイムラインペインのビューポートベース双方向リスト</li> <li>1ペインのみのとき、2ペインにまたがるときの両方に対応した期間の横棒</li> <li>期間の横棒上の固定ラベル</li> </ol> <p>上図のように、タスクごとにタイムラインペインが割り当てられ、すべてのタイムラインのスクロール位置は互いに同期されます。</p> <h2 id="インデックスベースのスクロールビュー"><a href="#%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E3%82%B9%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB%E3%83%93%E3%83%A5%E3%83%BC">インデックスベースのスクロールビュー</a></h2> <p>Google Flutter Widgetに似たインデックスベースのスクロールビューを作るために、Centerに引数のあるカスタムスクロールビューを使用します。実装すると、任意の位置まで素早くスクロールできるようになります。スクロール中のどの時点でも、各位置とインデックスを表示できます。</p> <p>イメージ的には、少しスクロールした時点で、新しいCenterの引数でタイムラインをリロードしてビューポートの外に移し、またスクロールするとビューポート内に配置される、という感じです。</p> <h2 id="タイムラインペイン"><a href="#%E3%82%BF%E3%82%A4%E3%83%A0%E3%83%A9%E3%82%A4%E3%83%B3%E3%83%9A%E3%82%A4%E3%83%B3">タイムラインペイン</a></h2> <p>タイムラインをスムーズに使えるように、インデックスベースのスクロール表示と似た発想で、横方向にスクロールできるカスタム「無限双方向スクロールビュー」を実現しました。実装すると、タイムラインをなめらかにスクロールできます。</p> <p>無限双方向スクロールビューには、Flutterの強力なViewportの考え方を活用しました。そして、Backwardリストのインデックスを-1から始まる負の数に変更しました。Index 0に当たる日付が分かるようにフラグも設定して、任意の日付まで素早くスクロールできるようにしました。</p> <pre><code class="js">Widget forwardList = SliverList( delegate: SliverChildBuilderDelegate((BuildContext context, int index) { return cellBuilder(context, _getIndex(forward: true, index: index)); }) ); Widget backwardList = SliverList( delegate: SliverChildBuilderDelegate((BuildContext context, int index) { return cellBuilder(context, _getIndex(forward: false, index: index)); }), ); Scrollable( viewportBuilder: (BuildContext context, ViewportOffset offset) { return Viewport( offset: offset, center: forwardListKey, slivers: [ backwardList, forwardList, ] ); }, ) </code></pre> <h2 id="2ペインにまたがるときの問題と解決方法"><a href="#2%E3%83%9A%E3%82%A4%E3%83%B3%E3%81%AB%E3%81%BE%E3%81%9F%E3%81%8C%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE%E5%95%8F%E9%A1%8C%E3%81%A8%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95">2ペインにまたがるときの問題と解決方法</a></h2> <p>ビューポートには無限のリスト2つがスクロールされるため、期間の横棒が2つのリストにまたがることもあります。そこで、どちらのリストにも完全に同じ期間の横棒を作成し、ぴったり重ねて、リストがビューポートの外に移動してもリスト内のアンカーが壊れないようにしました。</p> <p><img src="https://storage.googleapis.com/zenn-user-upload/a56ed0583195-20220105.gif" alt="" /></p> <h2 id="固定ラベルで解決"><a href="#%E5%9B%BA%E5%AE%9A%E3%83%A9%E3%83%99%E3%83%AB%E3%81%A7%E8%A7%A3%E6%B1%BA">固定ラベルで解決</a></h2> <p>モバイル機器の小さい画面ではプロジェクトのどこを見ているかが分かりにくく、使っていると混乱してきます。この問題は、できるだけ多くの情報を提供することで軽減できます。そこで便利なのが固定ラベルです。</p> <p>最初はとにかくシンプルにするため、スクロールビューのスクロール通知に従って、位置を取得してから配置されたラベルに設定していました。固定ラベルを各タイムラインペインの開始位置に表示するには、期間の横棒の現在位置の計算がベースとなります。</p> <p>しかし、新しく配置されたラベルは次のフレームまでしか更新されず、スクロールビューと同じ時間枠で同期されないため、ずれて見えてしまいました。</p> <p>幸いFlutterコミュニティーが、レンダリングレイヤー固定ヘッダーというすばらしい解決方法を教えてくれました。つまりレイアウトのタイミングによる方法です。レンダリングレイヤーにすべてのWidgetをサイズとともに入れるだけでなく、そのピクセルすべてを計算する必要があります。最後にlocalToGlobal関数を、スクロール位置、および2ペインにまたがるときのペイン切り替えに基づいた演算操作と置き換えて、パフォーマンスを向上させました。</p> <h2 id="始まりはこれから"><a href="#%E5%A7%8B%E3%81%BE%E3%82%8A%E3%81%AF%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89">始まりはこれから</a></h2> <p>今は大変な時代ですが、だからこそテクノロジーの分野で貢献したいと考えています。タイムライン表示の作成でまず考えたのは、どうやってFlutterの強力なフレームワークを活用して、ビューコンポーネントを一から作り直すことなく、軽く安定したゴージャスなUIを実現するか、ということでした。</p> <p>各日付単位はインデックスとして、FlutterのSliverに組み込まれています。ほとんどのものはWidgetレイヤーの高レベルの開発概念に留まり、固定ビューのときのみレンダリングレベルに移動します。</p> <p><a target="_blank" rel="nofollow noopener" href="https://quire.io">Quireアプリ</a>をインストールして、Flutterベースのモバイルアプリを使ってみませんか。Quireタイムラインについて気になることは、コメントを投稿するか、<a target="_blank" rel="nofollow noopener" href="https://twitter.com/quire_io">@quire_io</a>でツイートしてお知らせください!</p> <p>※転載許可済み: https://zenn.dev/quireteam/articles/2b2c44c3e49fac</p> uniyeh tag:crieit.net,2005:PublicArticle/16841 2021-04-13T16:45:08+09:00 2021-04-13T16:45:08+09:00 https://crieit.net/posts/38e8f748a2d53951f9604bea786870bf モバイルアプリ開発フレームワーク <p>現在、40億人を超えるモバイルユーザーがいるため、モバイルでオーディエンスとつながることができなければ、あなたは存在しません。人々はスマートフォンの使用をとても楽しんでいるので、技術のない日を過ごすために自分自身に挑戦する必要があります。スマートフォンは、電話、テキストメッセージ、メールのチェック、さらには娯楽まで、必要なものをすべて提供できます。そのため、モバイルアプリフレームワークが実現します。<br /> このような陰謀的なアプリケーションの舞台裏には、何千ものモバイルアプリ開発フレームワークがあります。ただし、モバイルアプリをうまく作るには、適切なモバイルアプリ開発フレームワーク、関連技術、プラットフォーム、データベースが不可欠です。とはいうものの、あまりにも多くの選択肢があり、どれかひとつに絞るのはこれまで以上に難しい状況です。そこでこの記事では、iOSとAndroid両方のプラットフォームで最も人気の高いモバイルアプリ開発フレームワークについて説明します。その前に、効率的な モバイルアプリ開発フレームワーク とはどのようなものかを簡単に見ていきましょう。</p> <p><strong>1. React Native</strong><br /> React Nativeは、AndroidアプリとiOSアプリの両方向けに構築された非常に人気のあるフレームワークです。特に、モバイルアプリの開発者は、より短いビルドサイクルでより高速なデプロイ時間で高性能アプリをビルドでき、予算にやさしいオプションです。さらに、React Nativeは、ビュー、テキスト、画像など、プラットフォームに依存しないネイティブコンポーネントのコアセットを提供し、すべてプラットフォームのネイティブUIビルディングブロックにマップされます。また、フルスタックに必須のJavaScriptもサポートしています。</p> <p><strong>2. Flutter</strong><br /> FlutterはGoogle が作ったオープンソースの<a target="_blank" rel="nofollow noopener" href="https://kaopiz.com/ja-news-cross-platform-framework-flutter-vs-react-native/">ネイティブアプリケーション開発フレームワーク</a>です。Dart という共通言語で開発を行います。詳しいデバッグができるので React Native で感じる「隔靴掻痒」感は少ないです。<br /> Flutterを使うことで同一のコードベースからAndroidやiOSアプリを構築でき、その見た目もネイティブアプリです。FlutterはGoogleによる導入が2015年でしたが、2018年12月の公式リリースまではベータ段階にとどまっていました。<br /> Flutterのユーザーは、携帯電話、テレビ、タブレット、ウェアラブルデバイス、スマートディスプレイ用のアプリを作成できます。<br /> ちなみに Flutter Studio は Flutter の UI 作成のために使えるサイトです。ビルドのためのものではありません。Flutter を採用するなら使うことになるのではないかと思われます。Flutter ではそれぞれの Native パートをプロジェクト含めることができる。</p> <p><strong>3. Ionic</strong><br /> Ionicは、クロスプラットフォームアプリケーションとともにインタラクティブハイブリッドおよびPWAを構築するのに役立ちます。このオープンソースフレームワークは、アプリケーションを作成するためのプレミアムサービスを提供します。さらに、Ionicは、Web、Android、およびiOS用のアプリケーションの構築をカバーしています。さらに、Ionicで作業している間は、常にアプリケーションを作成して、展開可能な場所に出荷できます。すぐに使用できる機能を備えているため、アプリケーション開発に最適です。</p> <p><strong>まとめ</strong><br /> 以上挙げた3つのフレームワーク以外、他にも<a target="_blank" rel="nofollow noopener" href="https://kaopiz.com/ja-news-mobile-application-development-frameworks-20202021/">モバイルアプリ開発フレームワーク</a>があります。どのフレームワークを選択するかは、要件、予算、技術的要件、そして短期的または長期的な成功の可能性に応じて、最も適したものを選ぶと良いでしょう。</p> hanhnh tag:crieit.net,2005:PublicArticle/16760 2021-03-20T21:39:06+09:00 2021-03-22T03:27:16+09:00 https://crieit.net/posts/3-6055eceac0123 個人開発アプリを有料プレスリリース(3万円)で宣伝してわかったこと <p><img src="https://assets.st-note.com/production/uploads/images/48176530/rectangle_large_type_2_685779401361c654095aa442b1f5db67.jpg?width=800" alt="image" /><br /> 2021年2月半ばに2本目となる英語学習とクイズゲームを組み合わせたアプリ『<a target="_blank" rel="nofollow noopener" href="https://quiz-usa.com/">英語学習クイズ!アメリカンドリーム</a>』をiOSでリリースしました。</p> <p>法人名義で出していますが、実態は個人(せいぜいチームレベル)で企画からユーザー獲得の宣伝までなんでもやらないといけない状況です。リリース後の1ヶ月ぐらいの間にやってみたことを何回かに分けて書きますが、今回は主に「有料のプレスリリース」を使ってみた感想と結果、その周辺のやり方をまとめてみました。</p> <p>▼以下のようなクイズゲームのアプリです</p> <p><img src="https://assets.st-note.com/production/uploads/images/48176724/picture_pc_175b5600429bda96f93fd37075451663.png" alt="image" /></p> <p>本当はもっといろいろ書きたかったのですが長くなったのでテーマを絞りました。このシリーズ記事は以下のような似た境遇の人に役立てるように書いたつもりです。</p> <p>●個人開発、小規模なチーム開発でアプリ / ゲームをリリースする予定の人<br /> ●カジュアルゲームから中規模なアプリをリリースする予定の人<br /> ●大手のように宣伝にかける潤沢な資金があまりない(だからといってすべてを無料で済ませる気もない)<br /> ●アプリ/サービスのユーザー数を増やしたい<br /> ●どんな宣伝方法があって、何が効果的なのかよくわからない<br /> ●やれることはなんでもやりたいがそもそも何ができるのか?<br /> ●規模の大小を問わずプレスリリースを書こうとしている人</p> <p>あわせて私が参考にさせてもらったブログ記事などもご紹介します。先人たちの書いた記事に助けられ勇気をもらったので、少しでも続けるようにしたいと思います。</p> <p>この記事を書いている時点でやった手法が爆発的に成功したわけではなく、ユーザーにつながる広告宣伝のチャンネルを開拓しているといった感じが実情なので「これをやったらうまく行きました!」みたいな記事でもありません。</p> <p>初めてのアプリは2014年の終わりに出した、ゲームではない英語学習のアプリ『<a target="_blank" rel="nofollow noopener" href="https://studynow.jp/">ざっくり英語ニュース!StudyNow</a>』で現在は120万ダウンロードになっています。</p> <p>基本的なスタンスは質の良いサービスを作って、そこに効果的な宣伝が重なってダウンロード数 / ユーザー数が増えていくという考えです。そもそも低品質のサービスをチート技でブーストさせる手法はあまり好きではないので、前提としては「一過性ではない、長く使われる質の良いアプリ・サービスを作る」です。</p> <p>2014年と2021年ではアプリを取り巻く環境も違い、大手が展開する高品質な競合が多くなって、相対的に資金力・開発力のないアプリやウェブサービスの運営が難しくなっているのが肌感覚としてわかります。</p> <p>2014年の年末に「ざっくり英語ニュース!StudyNow」を出した時はちょっとしたいざこざ炎上があって、その爆発力がダウンロード数に直結するといった再現性のないラッキーがありました。結果、初動で2万ダウンロードあり、好意的に紹介して応援してくれる人も多かったです。</p> <p>今回の『英語学習クイズ!アメリカンドリーム』はそういった手法が使えないので、コツコツ地味に正統派の宣伝を試しています。よっぽど特殊で面白い販促宣伝が思いついたり札束を投下できるなら別ですが、そうでないなら時間がかかって地味な宣伝しかないのかなぁと思います。</p> <p>この記事以外にもいろいろ試してその結果をフィードバックしていく予定です。</p> <h2 id="アプリやサービスを改善する2つの方向性"><a href="#%E3%82%A2%E3%83%97%E3%83%AA%E3%82%84%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%92%E6%94%B9%E5%96%84%E3%81%99%E3%82%8B%EF%BC%92%E3%81%A4%E3%81%AE%E6%96%B9%E5%90%91%E6%80%A7">アプリやサービスを改善する2つの方向性</a></h2> <p>サービス全体のダウンロード数を獲得して成長させるには、大きくわけると手法としては2つの方向性があると考えています。</p> <p>ASO(App Storeの最適化)にあたるストアの文章やスクリーンショットの見栄えを整える、そもそものアプリのサービスの質やUI / UXを改善する、グロースハックといった「内部に対する施策」も当然のように重要です。内側を見る行為です。</p> <p>内部のUX / UIに関しては別の機会に書きたいのですが、軽く読む感じでは以下の記事が参考になりました。</p> <p><a href="https://crieit.net/posts/100-5fd1a1cdb1827">売れるアプリにするコツ100個書きます(吐血)</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/noranuk0/items/27b7442e6e8c885588b4">個人製作アプリのダウンロード数を少しでも増やすためにやったこととその成果</a></p> <p>今回は開発者が「制作でやるだけのことはやった!さあ、どうやって宣伝しようか」みたいな状況です。外側に対するアプローチです。その中でも「プレスリリース」を使った告知、宣伝についてだけまとめています。</p> <h2 id="有料(3万円)のプレスリリースを使ってみた結果"><a href="#%E6%9C%89%E6%96%99%EF%BC%883%E4%B8%87%E5%86%86%EF%BC%89%E3%81%AE%E3%83%97%E3%83%AC%E3%82%B9%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F%E7%B5%90%E6%9E%9C">有料(3万円)のプレスリリースを使ってみた結果</a></h2> <p>有料のプレスリリース仲介の相場は1回3万円ぐらいで、複数回セットなら1回あたりの金額が安くなる料金体系です。大手だと「PR TIMES」や「@Press」なんかが有名です。おおざっぱな仕組みは以下の通りです。</p> <p><img src="https://assets.st-note.com/production/uploads/images/48124169/picture_pc_50e6acd35f5777a8ed133319cb4d2e94.png?width=800" alt="image" /></p> <p>一般的には自分で書いたプレスリリースは画像素材と一緒に「PR TIMES」や「@Press」のような仲介をする配信ポータルを通して送付されます。受け取るのはテレビ局、ラジオ局、雑誌からAppBank、ねとらぼのようなウェブ媒体など登録されている大小さまざまなメディア媒体です。</p> <p>もちろん自分のサービスを告知するにふさわしい相性の良いジャンルや媒体はある程度は選ぶことができます。「ロケットニュース24」「ねとらぼ」といった送付する媒体の指名は可能ですが、1つ1つ選定はしていられないので英語学習クイズならば「ゲーム系メディア」「教育系メディア」「WEB媒体」「アプリ情報系」みたいなざっくりしたくくりで決めます。</p> <p>受け取った媒体はそれを元にニュースを書くので「こちらからニュースにしてくれとネタを提供する行為」だと考えていいと思います。その情報を見た媒体の記者が独自取材のうえで書き直すケースもあれば、機械的にそのままの文面(誤字も含めて)素通りで掲載されるケースもあります。</p> <p>今回は「@Press」を使い、5年前には「PR TIMES」を使いました。料金は3万円でした。それぞれ数百社以上の媒体が登録されています。以下は自分で書いた実際に配信したプレスリリースです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.atpress.ne.jp/news/244937">本格的な4択クイズゲームで英語学習ができる無料アプリ 『アメリカンドリーム』iPhone版をリリース!</a></p> <p>成果にあたる数字は後半に書きましたが、結果的にはこのプレスリリースそのものがダウンロード獲得につながっているかといえば、そこまで大きな影響はありませんでした。同時期に出た「ウマ娘 プリティーダービー」ぐらいの話題作なら取り上げてくれるメディアもありますが、なかなか個人開発レベルのサービスを積極的に取り上げてくれるメディアも少ないです。</p> <p>ゲーム系アプリならAppBankや4Gamerのような大手にもいちおう送付されますが、日々多くのプレスリリースが送られてくるのは予想できるので掲載される可能性は少ないです。</p> <p>せいぜい文面そのままを自動で取り上げてくれるようなニュースサイトに掲載されるぐらいで、人が見ている感じでもありません。「少しはSEOに効果があるのかなぁ…」といった程度です。</p> <p>なかなか単発のプレスリリースが掲載される可能性は少ないそうで、継続的に話題を作ってプレスリリースを定期的に打つのが良いと@Pressが言っていました。これは複数回の契約につながる営業トーク込み込みの話だと思います。</p> <p>そういった過剰な期待をしない前提で、どこを使えばいいかといえば、どこでもいいと思います。有料ならば使い勝手もわかりやすい最大手の「PR TIMES」が無難です。PR TIMESにはスタートアップ向けの支援サービスがあって、創業2年以内なら無料で配信できます。</p> <p><a target="_blank" rel="nofollow noopener" href="https://prtimes.jp/magazine/startup-plan/">PR TIMESスタートアップチャレンジとは?</a>(PR TIMES)</p> <p>「@Press」は担当者がついてくれて文章の校正やアドバイスをくれます。二重敬語のチェックなど、文章を客観的な目で見てもらえる点ではいいと思います。あくまで校正レベルのチェックであり、コピーライティング的なアドバイスをくれるといった感じでもなさそうでした。ツイッター拡散オプションなど入れていけばけっこう値段があがります。</p> <p>どこか試してみたい!というならば使い勝手の良さ(インターフェイスや分析ツールなど)も含めて「PR TIMES」でいいんじゃないかと思います。</p> <p>尖ったサービスなら取り上げてもらえる可能性もあるので、完全に無駄だとは言い難いですが、それでも大手に掲載されるのは難しいレベルだと思います。しかし、宝くじは買わないと当たらないし、プレスリリースは送らないことには掲載されないもんだと思います。</p> <h2 id="個人開発者にとって有料のプレスリリースって無駄なのか?"><a href="#%E5%80%8B%E4%BA%BA%E9%96%8B%E7%99%BA%E8%80%85%E3%81%AB%E3%81%A8%E3%81%A3%E3%81%A6%E6%9C%89%E6%96%99%E3%81%AE%E3%83%97%E3%83%AC%E3%82%B9%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%A3%E3%81%A6%E7%84%A1%E9%A7%84%E3%81%AA%E3%81%AE%E3%81%8B%EF%BC%9F">個人開発者にとって有料のプレスリリースって無駄なのか?</a></h2> <p>ダウンロード数という意味ではさほど影響はありませんが、プレスリリースを書く利点としては、自分の作ったサービスをもう一度見つめなおす機会ができることでしょうか。</p> <p>どこに自分のサービスの長所があって、どんな売り文句・キャッチコピーを考えようか、誰がメインターゲットなのか、どんな画像がいいのかなど、3万円もかけて配信するので多少なりとも緊張感を持って臨めます。</p> <p>また整理されたプレスリリースをWEB上に1つ用意しておくことで、今後さまざまな宣伝や説明の機会の際には「概要はここのプレスリリースにあるので見てください。素材はご自由にお使いください」と伝えられます。</p> <p>そういう意味では、有料配信を使うかは別として、少し時間をかけてプレスリリースだけは使っておいて損はないと思います。後に紹介する個別の媒体への手動配信でも使えます。</p> <p>プレスリリースの書き方みたいな記事はけっこうあります。タイミングも重要で「新規リリース」は「新卒」みたいなカードなので有効に使ってください。</p> <p><a target="_blank" rel="nofollow noopener" href="https://automaton-media.com/articles/newsjp/20210122-149815/">個人開発者、Steamでゲームをリリースしたが初週で10本も売れなかったと悲しむ。情報を発信する難しさ</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://note.com/gamecast/n/nae90d756bf04">穴埋めで作る、インディゲーム開発者のための簡単なプレスリリースの作り方</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://sqool.net/business/archive/press-release-01.html">【ゲーム系プレスリリースの基礎】ゲームメディアに掲載されるためのポイントを徹底解説!</a></p> <p>それでも「3万かぁ…」みたいな気持ちもよくわかるんですよね。</p> <h2 id="光本勇介さんに教えてもらったプレスリリースの使い方"><a href="#%E5%85%89%E6%9C%AC%E5%8B%87%E4%BB%8B%E3%81%95%E3%82%93%E3%81%AB%E6%95%99%E3%81%88%E3%81%A6%E3%82%82%E3%82%89%E3%81%A3%E3%81%9F%E3%83%97%E3%83%AC%E3%82%B9%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9">光本勇介さんに教えてもらったプレスリリースの使い方</a></h2> <p>2014年にオンライン学習サービスの「Schoo」に当時のSTORES.jpの代表だった光本勇介さんがPR戦略について語っている授業を見ていました。今でも視聴可能です。</p> <p><a target="_blank" rel="nofollow noopener" href="https://schoo.jp/teacher/218">『STORES.jp』に学ぶ、WEBサービスローンチ後のPR戦略</a>(Schoo)</p> <p>光本勇介さんの経歴については割愛しますが、他の授業も含め今でもPR戦略について学べる面白い内容です。いい思い出ですね。個別のメール送信など、けっこう泥臭いことをやっているなぁといった印象でした。</p> <p>そこで質問する機会があったので「有料のプレスリリースって効果ありますか?」と聞いてみたけれど、答としては個別の記者との信頼関係のほうが重要だといっていました。</p> <p>一斉にマスで伝えようとする有料のプレスリリースは中小、個人開発のサービスには相性が悪いのもわかります。そこでポイントになるのが手間はかかりますが次のようなやり方です。「汗をかく」「足をつかう」みたいな発想の延長だと思います。</p> <h2 id="個別にニュース媒体に送る(送付先リスト)"><a href="#%E5%80%8B%E5%88%A5%E3%81%AB%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9%E5%AA%92%E4%BD%93%E3%81%AB%E9%80%81%E3%82%8B%EF%BC%88%E9%80%81%E4%BB%98%E5%85%88%E3%83%AA%E3%82%B9%E3%83%88%EF%BC%89">個別にニュース媒体に送る(送付先リスト)</a></h2> <p>「PR TIMES」や「@Press」を通せば大手主要なメディアにはプレスリリースが配信されますが、ここの配信リストにのっていない媒体も多いです。だいたいメディアにはプレスリリースの窓口があるので、手間はかかりますがそこに個別に送付できます。</p> <p><img src="https://assets.st-note.com/production/uploads/images/48124893/picture_pc_02a1f71fe568690fb77a933b6ca06414.png?width=800" alt="image" /></p> <p>ゲーム系のアプリでいえば、個別のプレスリリースを受け付けてくれるサイトは以下の記事がまとめてくれています。実際にこれを見て1つ1つ私も送りました。</p> <p>スパムと違うのは少なくとも媒体はプレスリリースを使った情報提供を求めている点です。</p> <p><a target="_blank" rel="nofollow noopener" href="https://note.com/akutaba/n/n029b58128250">個人開発ゲーム(PC)向けプレスリリース送付先まとめ ※日本限定</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://sqool.net/business/archive/press-release-media-list.html">2019年12月版:ゲーム系のプレスリリースを受けているメディアの連絡先一覧+レビュー依頼先一覧</a></p> <p><a target="_blank" rel="nofollow noopener" href="https://i24appnet.hateblo.jp/entry/2017/01/04/231243">レビュー依頼できるiPhoneアプリ紹介サイトまとめ【随時更新】</a></p> <p>上のリストを見ながら1つ1つ送って、基本的にはコピペにはなるけれど、少なくとも「〇〇〇(媒体名)編集部」とか冒頭の宛名など、変更できる部分は変更して送りました。</p> <p>また個別のお問い合わせフォームは文字数に制限があったり、媒体独自のフォーマットの指定があってめんどくさい部分もあります。正規で作ったプレスリリースとは別に「ショート版・ミニ版」みたいなものを作っておくのも便利です。</p> <p>先に紹介した光本さんは、各テレビ局の各番組ホームページのお問い合わせフォームから定期的に送信していたそうです。</p> <p>基本的にはそれでもなかなか取り上げてはくれないし、PR TIMESのようなポータルを通すのとさほど変わりません。掲載されたとしても自動的にプレスリリースの内容をそのまま掲載するタイプの媒体が多いです。アクセスやダウンロード数もさほど期待できません。</p> <p>しかし、中にはプレーした後でレビューを掲載してくれるサイトもあります。スマホゲームCHさんは記者の方による詳細なレビューの上で、情報を掲載してもらいました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://gameappch.com/app/?app=08548">英語学習クイズ!アメリカンドリー‪ム‬をじっくり遊んで徹底レビュー!</a>(スマホゲームCH)</p> <p>結果的に『英語学習クイズ!アメリカンドリー‪ム』については高評価をいただいたので幸いです。レビューに関しては口出しできませんが、客観的に評価をしてもらえたのがすごく収穫でした。自分の思っていた長所が見落とされていたり、ユーザーは何が楽しくてどこがうけているのかといった開発者にはありがたいレビューがもらえました。</p> <p>宣伝は自分たちが言うよりも、他人の口から言ってもらったほうが効果あります。他者からの評価は今後の宣伝に使える強力な武器になるので財産だといえます。</p> <p>1つ書いてもらえれば今後、自分のアプリを紹介するときに「これはスマホゲームCHさんの記者がプレーしたアプリの感想と評価です」と伝えたほうが客観的に魅力的に伝えることができます。</p> <p>こういうのはアクセスやダウンロード数に直結しなくとも積み上げていくつもりで獲得していきます。</p> <p>StudyNowが雑誌に掲載されると、雑誌経由のダウンロードよりも「雑誌に掲載された」というステータスのほうが長期的にみると財産になっているのと似ています。</p> <h2 id="専門媒体にプレスリリースを送ってみる"><a href="#%E5%B0%82%E9%96%80%E5%AA%92%E4%BD%93%E3%81%AB%E3%83%97%E3%83%AC%E3%82%B9%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%82%92%E9%80%81%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B">専門媒体にプレスリリースを送ってみる</a></h2> <p>ゲームという縛りで考えると、上で紹介したゲーム系のメディアに送付することになり、そこは激戦区です。プレスリリースの記事そのままであっても取り上げてもらいにくいのが実情です。</p> <p>しかし、ゲームを作っていてもゲームメディアというしばりから一歩抜け出せば、さまざまな専門媒体があります。</p> <p>例えば『英語学習クイズ!アメリカンドリー‪ム』はクイズゲームであり、英語学習教材でもあります。そこには「クイズ」「e-Learning」「ゲーミフィケーション」「米国」のような切り口が可能で、それぞれの分野のインフルエンサーやYouTuber、有力団体、メディアがあります。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.quizbang.net/">クイズ専門情報サイト QUIZ BANG</a>(クイズバン)</p> <p><a target="_blank" rel="nofollow noopener" href="https://g-dx.jp/">GDX News</a>(ジーディーエックス ニュース)</p> <p><a target="_blank" rel="nofollow noopener" href="https://edtech-media.com/">EdTech Media: 教育ニュース、ICT教育のメディア</a></p> <p>GDX Newsはゲーミフィケーションやデジタルトランスフォーメイションを扱うニュース媒体です。こういったメディアに個別に送ると掲載してもらえました。</p> <p>例えば「釣り」をテーマにしたゲームならば、ゲームで考えると埋もれがちですが、「釣り」でとらえればまた別の専門の媒体や有名人の存在があります。アイコンが鳥だから野鳥関係の団体を攻めるとかなんでもいいと思います。</p> <p>私は大阪府の東大阪市の出身ですが、東大阪の地域サイトに「東大阪で開発されたアプリ」みたいな切り口をつくれば、そこには新たな宣伝のルートが開設できます。受け入れるかどうかは相手が決めることで、こっちが考えることじゃないと『嫌われる勇気』に書いてました。</p> <p>自分の作ったものが何かのジャンルを横断できないか、自分や自分のアプリはどんな属性を持っているのかを考えてみると、新しい切り口や突破口が生まれる可能性があります。</p> <h2 id="登録サイトに登録してみる"><a href="#%E7%99%BB%E9%8C%B2%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AB%E7%99%BB%E9%8C%B2%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">登録サイトに登録してみる</a></h2> <p>プレスリリースの受付ではないけれど、自社のサービス、自薦の登録を受け付けてくれるサイトがあります。クリエイター系の相互支援サイトもあります。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.memory-lovers.blog/entry/2019/09/02/200000">個人開発したWebサービスをリリースした後にやったこと / やり続けていること</a></p> <p>これも例えば『英語学習クイズ!アメリカンドリー‪ム』でいえば英語学習教材としても登録できるレビューサイトがありました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://eigohiroba.jp/item/29187903">みんなの英語ひろば</a></p> <p>ひと昔前のインターネットはCGIで作った「登録サイト」がけっこうありましたが、リンクファーム的なサイトになんでもかんでも登録するのはSEOスパムっぽくなりそうなのでご注意ください。</p> <p>登録サイトに登録するときも、プレスリリースで書いた情報を使いまわせるので便利です。</p> <h2 id="記者・ブロガーに直接プレスリリースを送る"><a href="#%E8%A8%98%E8%80%85%E3%83%BB%E3%83%96%E3%83%AD%E3%82%AC%E3%83%BC%E3%81%AB%E7%9B%B4%E6%8E%A5%E3%83%97%E3%83%AC%E3%82%B9%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%82%92%E9%80%81%E3%82%8B">記者・ブロガーに直接プレスリリースを送る</a></h2> <p>結局はここに行きつきますが、マスで一斉に送信するよりは個別の記者、担当者に送るほうが効果的です。「あなたにだけお知らせします」と言われたほうが、記者もオリジナルの記事を書きやすくなります。</p> <p>そんな知り合いの記者なんていねえよ、という話になりますが、それはよくわかります。東京を拠点にしていないと、なかなかメディア関係者と知り合いになる機会もありません。</p> <p>私の場合は5年も運営している「StudyNow」があり、過去にPRESIDENTやGetNavi、Aera Englishに掲載されたこともあって、その当時のやり取りをたどって、そこの担当者の方にメールで案内を出しました。</p> <p>また「StudyNow」もブログやYouTubeで紹介してくれていた人もいたので、そういった方に送信しました。メールを見返して過去の遺産を掘り返すのも手ですが、それでも取り上げられないケースは山のようにあります。</p> <h2 id="どうやったら広めてくれるのか?(モンゴルマン理論)"><a href="#%E3%81%A9%E3%81%86%E3%82%84%E3%81%A3%E3%81%9F%E3%82%89%E5%BA%83%E3%82%81%E3%81%A6%E3%81%8F%E3%82%8C%E3%82%8B%E3%81%AE%E3%81%8B%EF%BC%9F%EF%BC%88%E3%83%A2%E3%83%B3%E3%82%B4%E3%83%AB%E3%83%9E%E3%83%B3%E7%90%86%E8%AB%96%EF%BC%89">どうやったら広めてくれるのか?(モンゴルマン理論)</a></h2> <p>程度の差はあれ結局は知った情報を広めてくれるかどうかは、人間関係の上に成り立っている部分も大きい気がします。知らない人から知らないサービスを宣伝してくれと言われても抵抗感あるのが当然です。</p> <p>もちろん、作ったサービスが斬新で話題性もありメディア取材が殺到するパターンも世の中には存在します。こういうのはよっぽど尖った内容か、大手が開発する話題性のあるサービスの場合です。</p> <p>小規模なサービスの場合は、宣伝をお願いできたり、少しでも取り上げてもらえる人間関係を日頃から構築しておくことがポイントじゃないかと思います。それは友達であれ、ツイッター上であれ、知り合いの記者相手でも同じです。応援してくれる人や広めてくれそうな人を増やしておく、別の表現では「根回し」みたいな感じです。程度の差はあれナチュラルにやっていることを、もう少し意識して取り組む感じでしょうか。</p> <p>知らない人からテンプレートで送られてくるプレスリリースの情報よりも、個人あてに送付するリリースメールのほうが採用される可能性が高いです。それより可能性が高いのはLINEで直接お願いすることです。距離が近いほど依頼も通りやすくなり、もっと成功率が高くなるのは会っていうことで、究極奥義はセックスしながらお願いすることです。</p> <p>StudyNowの時はある切っ掛けで当時のテッククランチのライターさん(岩本さん元気ですか?私は元気です!)知り合いになりました。その縁で当時のテッククランチの掲載してもらいましたが、キラ星のごとく斬新なスタートアップのプロダクトが並ぶ中で当時の「StudyNow」が光っていたかといえば、どうだろうと今となっては客観的には思います。</p> <p>そんな中でも知り合ったことで、それを補ってプロダクトを直接PRできる機会を得られたし、そこから伝わる思いもあったのだと思います。「モンゴルマンは1000万パワーはないけれど、それをおぎなう1000万の技があるから2000万パワーズに入れる」みたいな理論と一緒で、プロダクトがまだ未熟であっても、それを補えるものがあれば広めてくれる可能性が生まれてきます。</p> <p>世の中にはお問い合わせフォームにある「press@...」「info@...」で始めるメールアドレスに送っても響かない内容でも、コミュニティの内側に入ってメールをゲットして「tanaka@...」からなら同じ内容でも響いてくれるケースがあります。</p> <p>コミュニティの内側に入りこんで内部から届かせる努力、人間関係の構築はそれなりに必要なんだろうと思います。</p> <p>ある媒体に掲載されているアプリやサービスを見ると、アプリの質みたいなもので掲載されたり話題になってるように感じますが、多くは実はもっと政治力が働いた結果のような気がします。</p> <p>StudyNowはゲームではありませんが、たまたまAppBankのライターさんがアプリで英語学習をしてTOEICの高得点を目指す企画をやっているのを知って、そのライターさんに直接「StudyNowやってみてください!」と宣伝したら、後日AppBankに掲載してもらえました。AppBankには「プレスリリース受付フォーム」からも宣伝していましたが、そっちは撃沈してライターさんに直接いったほうは掲載にいたったことになります。日ごろからアンテナをはっておくのはいいと思います。</p> <p>それでも、そんなことは難しく頼める相手がいない、チャンスもないなら「費用をかける(有料広告)」になります。以下の記事も有料の広告宣伝に対する考え方としては面白かったです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/appxxx77/items/e8b5796cfdd27104e345">宣伝費をケチる個人アプリ開発者にお灸を据える</a></p> <h2 id="有料のプレスリリースの結果とダウンロード数"><a href="#%E6%9C%89%E6%96%99%E3%81%AE%E3%83%97%E3%83%AC%E3%82%B9%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%A8%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E6%95%B0">有料のプレスリリースの結果とダウンロード数</a></h2> <p>@PRESSで2月16日の13時に以下のプレスリリースを打ちました。</p> <p>本格的な4択クイズゲームで英語学習ができる無料アプリ 『アメリカンドリーム』iPhone版をリリース!</p> <p>このリリースと同時にいろんな宣伝を開始しました。先に紹介した個別の媒体へのメール送付なんかも、この@PRESSのリリースを出してから送りましたので、下の数字にはそれら行動の成果が含まれていると考えてもいいと思います。</p> <p>以下はプレスリリース後の2週間ぐらいの実際のダウンロード数です。</p> <p>日付 / ダウンロード数<br /> 2/16 273<br /> 2/17 136<br /> 2/18 84<br /> 2/19 45<br /> 2/20 68<br /> 2/21 53<br /> 2/22 25<br /> 2/23 48<br /> 2/24 37<br /> 2/25 37<br /> 2/26 31<br /> 2/27 31<br /> 2/28 45</p> <p>自分のツイッターでの告知や、他の宣伝も少しやっているし、関係者のダウンロードも入っているので、純粋なプレスリリースの影響力ではありません。むしろこの数字に占めるプレスリリースの影響力ってかなり少ないと思います。</p> <p>3月に入ってから爆発したとかもないです…。このままじわじわ滑空するように下がっています。やべえよ、やべえよ。</p> <p>もちろん書いたプレスリリースの内容の良し悪しもあって、個々のケースで効果は違うと思います。プレスリリースを検討されている方は、どう応用して使うか?といった話になるので、プレスリリースを3万円払って配信したら自動的に集まるといったような、それ単体での過度な期待をしないほうがいいかもしれません。</p> <p>この記事が役に立った方はぜひ「いいね」していってね。iOSしかありませんが、アプリも無料なんでクイズで遊んでください。</p> <p>▼App StoreのURL<br /> <a target="_blank" rel="nofollow noopener" href="https://apps.apple.com/jp/app/id1523430789">英語学習クイズ!アメリカンドリーム</a></p> <p>▼5年前に出したアプリ<br /> <a target="_blank" rel="nofollow noopener" href="https://studynow.jp/">ざっくり英語ニュース!StudyNow</a></p> <p>ほかにも「ツイッターの公式アカウントをゼロから運用してみた」「友達にダウンロードお願いしてみた」「自社サービスで宣伝してみた」「オウンドメディアで宣伝してみた」とか実験中のものや、ゲームはそもそもはじめてつくったので、どう作ったのかといった話、売上公開とかもやってみたいと思います。応援よろしくお願いします。</p> ますやま / おとなし tag:crieit.net,2005:PublicArticle/15995 2020-07-03T14:57:19+09:00 2020-07-03T14:57:19+09:00 https://crieit.net/posts/Flutter-IdeaShuffleMemo 新作Flutterアプリ「IdeaShuffleMemo」を広めるために考えている戦略 <p><a href="https://crieit.now.sh/upload_images/0c5772e78aa0f279ed29c9e177857c365efec751c86bc.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0c5772e78aa0f279ed29c9e177857c365efec751c86bc.jpg?mw=700" alt="image" /></a><br /> こんにちは、YuKiOです。</p> <p>7月にFlutterアプリ開発を始めて2作目のアプリ、アイデアを発想するためのメモアプリ「IdeaShuffleMemo」をリリースしました。</p> <p>■AppStore<br /> <a target="_blank" rel="nofollow noopener" href="https://apps.apple.com/jp/app/id1517535550">https://apps.apple.com/jp/app/id1517535550</a></p> <p>■Google Play<br /> <a target="_blank" rel="nofollow noopener" href="https://play.google.com/store/apps/details?id=com.IdeaShuffleMemoApp&hl=ja">https://play.google.com/store/apps/details?id=com.IdeaShuffleMemoApp&hl=ja</a></p> <p>1作目はとりあえずリリースすることを目的に作成しましたが、今回は「自分が欲しいもの」というテーマで作成しました。</p> <p>さらに今後のアプリ開発を含めて、機能やアプリの露出方法についても挑戦的に戦略を考えています。</p> <p>このアプリのトライアンドエラーの経験を、次回につなげていければと思っています。</p> <p>機能については、Qiitaに書いています。<br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/YuKiO-OO/items/283f44da64d304a6228e">https://qiita.com/YuKiO-OO/items/283f44da64d304a6228e</a></p> <p>crieitでは、どうやって露出させていくか?考えていることを、書いていきたいと思います。</p> <h3 id="全体の戦略"><a href="#%E5%85%A8%E4%BD%93%E3%81%AE%E6%88%A6%E7%95%A5">全体の戦略</a></h3> <h4 id="アプリの収益化"><a href="#%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E5%8F%8E%E7%9B%8A%E5%8C%96">アプリの収益化</a></h4> <p>せっかくアプリ開発をするのだから、お金を稼げるようになりたいです。なので、収益を得る方法として、「広告」と「サブスクリプション」の2つを用意しました。</p> <p>サブスクリプションも採用した理由は、コロナの影響もあり「広告」落ち込んでいたこと、広告収入という方法が今後変化する可能性が高く、安定したものではないからです。</p> <p>単発の課金のほうが難易度が探るかもしれませんが、長期的にみて、開発の継続、安定した収益を目指す上ではサブスクリプションがいいと判断しました。</p> <p>最終的に「お金を払ってでも使ってもらえるものを作る」というのが最終的な目標もあり、かなり苦労しましたがサブスクリプション機能を追加しました。</p> <h4 id="アプリの多言語化"><a href="#%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E5%A4%9A%E8%A8%80%E8%AA%9E%E5%8C%96">アプリの多言語化</a></h4> <p>日本のアプリ市場は世界的に見ても大きいほうだとは思います。<br /> ただ、1国で月1万円稼げるレベルのアプリだったとして、日本だけにリリースすれば、1万円しか稼げません。もし全世界に配信することが出来れば、市場も広がるので、稼げるチャンスは増えるはず。(そこまで単純なものではないと思いますが)</p> <p>なのでアプリは、最初から多言語化を意識して作りました。<br /> 初めから7カ国ご対応は辛いので、英語と日本語の2つに対応をさせました。</p> <p>それに合わせて、アプリのキャプチャーや紹介文も英語で用意も。</p> <p>英語圏でも反応が少しでれば、クラウドワークスなどを使って、ネイティブにPRできるような文章を作り込んでいきながら、対応できる言語を増やしていくつもりです。</p> <p>まずは英語と日本語圏で収益を出せるかで、継続の判断をしていきたいと思います。</p> <h4 id="アプリのターゲット"><a href="#%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88">アプリのターゲット</a></h4> <p>アプリのターゲットユーザーは、主にアプリやサービス開発者、ビジネスマン、経営者、起業を考えている人です。<br /> まずは、自分と近い範囲のアプリやサービスの開発者に広めたいなと思っています。</p> <h3 id="アプリの具体的な露出戦略"><a href="#%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E5%85%B7%E4%BD%93%E7%9A%84%E3%81%AA%E9%9C%B2%E5%87%BA%E6%88%A6%E7%95%A5">アプリの具体的な露出戦略</a></h3> <h4 id="■国内での露出"><a href="#%E2%96%A0%E5%9B%BD%E5%86%85%E3%81%A7%E3%81%AE%E9%9C%B2%E5%87%BA">■国内での露出</a></h4> <h5 id="・ツイッター"><a href="#%E3%83%BB%E3%83%84%E3%82%A4%E3%83%83%E3%82%BF%E3%83%BC">・ツイッター</a></h5> <p>まずは自身のツイッターアカウントで告知します。ただこれは、Webサービスの時と同様あまり期待はしていません。フォロワー数が少ない、インフルエンサーでもないので、よほどインパクトがあるサービスでなければ、「リリースしました」のような広告っぽい投稿は敬遠されて反応がでません。</p> <p>ただ少しでも反応を出すために、審査の間でPR動画を作ってみました。(Appleぽさを意識しながら、最後はメタルギアを意識している裏エピソードがあります。)</p> <p>カメラなど映像も趣味なので、別の趣味がいかせて良かったです。</p> <blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Webサービスやアプリ!斬新なアイデアをひらめきたい人に!アイデアを発想するためのメモアプリ✍️IdeaShuffleMemoをリリースしました!■AppStore<a target="_blank" rel="nofollow noopener" href="https://t.co/gEPzEEJ7mt">https://t.co/gEPzEEJ7mt</a>■Google Play<a target="_blank" rel="nofollow noopener" href="https://t.co/w0vTiOanGE">https://t.co/w0vTiOanGE</a>使ってみてください😁<a target="_blank" rel="nofollow noopener" href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a> <a target="_blank" rel="nofollow noopener" href="https://twitter.com/hashtag/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0?src=hash&ref_src=twsrc%5Etfw">#プログラミング</a> <a target="_blank" rel="nofollow noopener" href="https://t.co/gQ0dOMNgGB">pic.twitter.com/gQ0dOMNgGB</a></p>— YuKiO | 個人開発&Flutter (@oo_forward) <a target="_blank" rel="nofollow noopener" href="https://twitter.com/oo_forward/status/1278611399749431296?ref_src=twsrc%5Etfw">July 2, 2020</a></blockquote> <p>「#駆けだしエンジニアと繋がりたい」「#プログラミング初心者」のタグは、タグ検索をしているユーザーが多いのでつけています。</p> <p>ただ、特に内容を見ずにいいねを押しているユーザーもいるので、いいねの割りには反応は薄かったりします。</p> <p>まあ、固定ツイートなどの時の見た目として、いいねとリツイートが多い方がいいので、この方法を採用しました。</p> <h5 id="・Qiitaに投稿"><a href="#%E3%83%BBQiita%E3%81%AB%E6%8A%95%E7%A8%BF">・Qiitaに投稿</a></h5> <p>これはアプリの露出と、アプリ制作でお世話になった数多くの方々への恩返し、自分自身への備忘録&技術の精査の意味も含まれていますが、Qiitaに技術記事がメインで、説明の一貫としてアプリの紹介をするのは問題ないかなと思ってます。</p> <p>第1弾は、アプリ開発で使ったパッケージを紹介、それ以降はパスワードロック、データのバックアップ、サブスクリプションなどの、Flutter開発で情報が少なくて困った内容を書いていこうと考えています。</p> <p>■第1段「おすすめのパッケージ」<br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/YuKiO-OO/items/283f44da64d304a6228e">https://qiita.com/YuKiO-OO/items/283f44da64d304a6228e</a></p> <p>おかげ様で、現時点で1100viewにはなっているので、それなりに露出としては成功しているかなと思います。</p> <h5 id="・Crieit"><a href="#%E3%83%BBCrieit">・Crieit</a></h5> <p>もちろん開発者のコミュニティであるこちらにも投稿。他が技術的な内容になっているので、ここではこのようにアプリを露出させる方法として、内容ががぶらないようにしています。</p> <h5 id="・自分のブログサイト"><a href="#%E3%83%BB%E8%87%AA%E5%88%86%E3%81%AE%E3%83%96%E3%83%AD%E3%82%B0%E3%82%B5%E3%82%A4%E3%83%88">・自分のブログサイト</a></h5> <p>自分のブログ記事は、アプリの紹介ページのような位置付けで書いています。<br /> 今後はアプリのQandAなどを追加して、情報を充実させていきたいと思います。</p> <p>予算とアプリの反響によっては、こちらも多言語対応できれば理想ですね。</p> <h5 id="・プレスリリース"><a href="#%E3%83%BB%E3%83%97%E3%83%AC%E3%82%B9%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9">・プレスリリース</a></h5> <p>Webサービスではやったことがないのですが、プレスリリースにも挑戦しています。プレスリリースの難しいところは、個人を受け付けてなかったり、有料で、さらに1回に数万円と高額な場合があったりと、個人開発レベルでは手が出しづらい所です。</p> <p>本業ではプレスリリースを使っているのですが、無料の場合はやはり無料レベルに留まることがおおく、あまり期待はできません。</p> <p>ただ、今回は1アカウントお試して無料でできる、value pressさんを使いました。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.value-press.com/">https://www.value-press.com/</a></p> <p>無料では配信できるメディアなど限られますが、有名なメディアや、ターゲットが好みそうなメディアも多いのが選んだ理由です。</p> <p>ただ、記者は開発者ではないので、アピールする部分を少しヅラすことを意識しました。</p> <p>ターゲットを、コロナ禍で厳しい環境にたっていて、何か変えたいと必死で考えている人向けとすることにして、コロナとは言葉に出していませんが、プレスリリースタイトルは、それを強くい意識した内容になっています。</p> <p>ここで少しでも反応がでれば、ある程度お金をかけてもいいかなと思っています。</p> <p>個人での注意点ですが、電話やメールアドレスが公開されます。勧誘メールが届くようになったりと、色々大変です。</p> <p>公開しても良いメールアドレスや、格安のIP電話を契約して、それを公開するようにしましょう。</p> <h5 id="・ツイッター・フェイスブック広告"><a href="#%E3%83%BB%E3%83%84%E3%82%A4%E3%83%83%E3%82%BF%E3%83%BC%E3%83%BB%E3%83%95%E3%82%A7%E3%82%A4%E3%82%B9%E3%83%96%E3%83%83%E3%82%AF%E5%BA%83%E5%91%8A">・ツイッター・フェイスブック広告</a></h5> <p>これはちょっと迷ってます。今回は実験ですが、それなりに広告費用をかけてみようと思います。<br /> これまでもツイッター広告をつかっているのですが、あまりパフォーマンスがよくありません。</p> <p>もしやるとしたらフェイスブック広告を出してみようかなと思っています。</p> <p>ブログ記事であったり、いくつかの反応を見てから、実行する予定です。</p> <h4 id="■海外戦略"><a href="#%E2%96%A0%E6%B5%B7%E5%A4%96%E6%88%A6%E7%95%A5">■海外戦略</a></h4> <h5 id="・Div"><a href="#%E3%83%BBDiv">・Div</a></h5> <p>海外のQiitaのようなサイトを探してみたのですが、stackoverflowが紹介されていましたが、なんとなく質問コーナーという感じで、技術ブログのようなものではありませんでした。</p> <p>Divはそこそこライトな感じの投稿が多そうだったので、こちらに投稿してみました。<br /> 英語は得意ではありませんが、Google翻訳を活用しながら、自分で書いたQiitaの記事を抜き出し、翻訳しました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://dev.to/oo_forward/flutter-recommended-package-used-in-the-developed-memo-application-15dl">https://dev.to/oo_forward/flutter-recommended-package-used-in-the-developed-memo-application-15dl</a></p> <p>Flutterに記事や、iOSの記事についてそこまでいいねがされていたりする記事がなかったり、どれぐらい動いているのか分かりませんが、2時間まえくらいに投稿した時点で、2件くらい「いいね!」がもらえているので、動いているのは動いているっぽいです。</p> <h5 id="・producthunt"><a href="#%E3%83%BBproducthunt">・producthunt</a></h5> <p><a href="https://crieit.net/posts/7">https://crieit.net/posts/7</a><br /> この記事で紹介さていたのでしりました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.producthunt.com/founder-club/benefits">https://www.producthunt.com/founder-club/benefits</a></p> <p>仕組みがよくわかってないのですが、プロダクトを紹介するというサイトのようです。<br /> 紹介にあたってYoutubeの紹介動画が必要ぽいので、せっかくなら海外用のPV動画も制作して乗っけようと思っています。</p> <p>正直あまりよくわかってない感じですが.</p> <h5 id="・Hacker News"><a href="#%E3%83%BBHacker+News">・Hacker News</a></h5> <p>上記の記事でproducthuntとの連携で紹介されていました。<br /> まだ深くは理解できてないですが、このあたりも挑戦していきたいなと思います。</p> <h5 id="・Medium"><a href="#%E3%83%BBMedium">・Medium</a></h5> <p>Flutter初めてからみるようになったのですが、技術系のブログのようですね。<br /> かなり膨大な投稿量らしいので、Qiitaのよう書いたからといってすぐに反応がでなさそうですが、起点として考えた方がいいなと思います。</p> <p>どんな内容で買えば良いか、ちょっと考えています。</p> <p>せっかく英語で書くなら、日本人として特色も入れられないかなと考えています。</p> <h4 id="■ASO"><a href="#%E2%96%A0ASO">■ASO</a></h4> <p>サイト検索順位ならぬ、アプリ検索順位の最適化ASOについて。<br /> 正直、軽くしか調べてられてませんが、リリースした直後は、評価も何もないので、ダウンロードしてくれそうなユーザーが検索しそうなキーワードを入れるくらいしか、できないのではないかと考えています。</p> <p>SEOと同じ観点でユーザー主義でいくのであれば、ストア内の内容だけは順位が関係しないと勝手に思ってます。</p> <p>例えば、</p> <ul> <li>アプリの有料化率</li> <li>外部リンクからのアクセス数</li> <li>多言語への対応</li> <li>アプリの定着率など。</li> </ul> <p>AppleやGoogleどちらも、アプリのサブスクリプションが長く続く方がいいわけなので、結局SEO同様にアプリをよくしていくこと以外に方法はないと思っています。</p> <h3 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h3> <p>今回人生で2回目のアプリをリリースしました。アプリ開発って、アプリのコードを打ち込んで組むだけだと思いがちですが、本気でPRをやろうと思うとやることいっぱいだなと実感しています。個人開発の大変さも実感しています。</p> <p>この方法がうまくいくとも分かりませんし、アプリ自体に需要がなければ、どんなにPRしても難しいと思います。</p> <p>人事を尽くして天命を待つ</p> <p>これも一つの実験で、うまくいかなければ別の方法を試していきたいと思います。</p> <p>ツイッターもやってますので、ぜひフォローください。<br /> <a target="_blank" rel="nofollow noopener" href="https://twitter.com/oo_forward">https://twitter.com/oo_forward</a></p> <p>■AppStore<br /> <a target="_blank" rel="nofollow noopener" href="https://apps.apple.com/jp/app/id1517535550">https://apps.apple.com/jp/app/id1517535550</a></p> <p>■Google Play<br /> <a target="_blank" rel="nofollow noopener" href="https://play.google.com/store/apps/details?id=com.IdeaShuffleMemoApp&hl=ja">https://play.google.com/store/apps/details?id=com.IdeaShuffleMemoApp&hl=ja</a></p> YuKiO | 個人開発&Flutter学習中 tag:crieit.net,2005:PublicArticle/15739 2020-02-29T14:25:03+09:00 2020-03-06T23:34:59+09:00 https://crieit.net/posts/GAS-LINE-bot-5e59f5af2ba2b GASで「農作業記録アシスタント」LINE bot作った(技術・設計編) <h2 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h2> <p>制作したLINE botの紹介を前回の記事で書きました。<br /> <a href="https://crieit.net/posts/GAS-LINE-bot">GASで「農作業記録アシスタント」LINE bot作った(紹介編) - Crieit</a></p> <p>今回はそのために活用した技術や設計に関することをまとめてみます。<br /> 具体的なコードの中身やLINE botの制作手順などについては割愛させてもらって、考えてきたことやどんな風に実装したか、また残っている技術的な課題や個人的反省について整理してみました。紹介編と合わせてご覧いただけたらと思います。</p> <h3 id="使用技術等"><a href="#%E4%BD%BF%E7%94%A8%E6%8A%80%E8%A1%93%E7%AD%89">使用技術等</a></h3> <ul> <li>言語はGoogle Apps Script(Rhinoランタイム:Javascript1.6がベース)</li> <li>LINE messaging API</li> <li>サーバーレス</li> </ul> <h3 id="制作期間"><a href="#%E5%88%B6%E4%BD%9C%E6%9C%9F%E9%96%93">制作期間</a></h3> <p>約1ヶ月くらい(要件定義から制作まで)<br /> GASの基礎学習を少しずつUdemyで学習(2週間くらい?)</p> <h2 id="(1)設計に関して"><a href="#%EF%BC%88%EF%BC%91%EF%BC%89%E8%A8%AD%E8%A8%88%E3%81%AB%E9%96%A2%E3%81%97%E3%81%A6">(1)設計に関して</a></h2> <p>技術の解説に入る前に、アプリ制作のために構想したことを。<br /> カッコつけて設計とは言ってみたものの、不十分だったり設計とは呼ばない内容かもしれませんがご容赦ください。またこんなにはっきり文章化して作り始めてはいません。</p> <h3 id="①簡易ペルソナ"><a href="#%E2%91%A0%E7%B0%A1%E6%98%93%E3%83%9A%E3%83%AB%E3%82%BD%E3%83%8A">①簡易ペルソナ</a></h3> <p>農作業の現場作業をしていて記録を簡単に取りたい人。仕事終わりにじっくりと記録をとるのがなかなかめんどくさい人。細かい情報を記入する必要はなく、休憩時間などにちょちょっと記録してちょちょっと見返したり、圃場に出かけた際に簡単に過去の記録を見返したりしたい、というニーズのある自分自身や身近な農業者。</p> <h3 id="②競合アプリの比較・考察"><a href="#%E2%91%A1%E7%AB%B6%E5%90%88%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E6%AF%94%E8%BC%83%E3%83%BB%E8%80%83%E5%AF%9F">②競合アプリの比較・考察</a></h3> <p>既存のWEBアプリやスマホアプリは色々あり、農場の認証取得向けのしっかりした大規模なもの、資材管理なども同時にできるもの、農薬の散布制限なども自動で計算してくれるものなど。また個人向けのものや簡単入力ができるものもあるが、ただどうしても入力のところで課題を感じる。</p> <p><strong>どんなにシンプルなものでも入力のステップが多い</strong><br /> - 毎日・複数回行う入力作業だが、そのステップがどうしても多くなってしまう。最短でもスマホを手に取ってから、①アプリを開いて ②入力ボタンを押して ③フォームに入力して ④投稿を押す<br /> - ものによってはフォーム入力で空欄があると投稿が出来ないものもあったり、画面遷移があるものも。<br /> - プルダウンによる入力も選択肢が多いとかえって不便なことも</p> <p><strong>入力を習慣づけるのが難しい</strong></p> <p><strong>初期設定が多く導入のハードルが高いものも</strong><br /> - 初期設定で圃場や所有機械の情報を入力したり使用する資材を入力しておくと便利!というものも多いが、まずそれを設定しないと入力ができないなど導入のハードルが高い。</p> <p>このようなアプリはしっかり管理したい人にはメリットは多い。ただサクッとメモしたい程度の使い方をするにはストレスを感じる。</p> <p><strong>一方で既存アプリで参考にしたい点も</strong><br /> - 出力面で、カレンダー表示やカテゴリ毎の表示は必須<br /> - 作業記録のテンプレートをユーザーが用意できて使いまわせるものもあり、それはすごく良い</p> <h3 id="③このアプリの特徴"><a href="#%E2%91%A2%E3%81%93%E3%81%AE%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E7%89%B9%E5%BE%B4">③このアプリの特徴</a></h3> <p><strong>入力の手間をとにかく排除</strong><br /> - ①LINEを開いて ②トークルームを開いて ③タップしたら指示に従って選択・入力、の3ステップ。あとは自動で投稿される。<br /> - サクッとメモしたものがそのまま記録される、くらいの手軽さ。twitter投稿くらいの感覚。</p> <p><strong>日常で使用するツールを使用することで習慣づけがしやすい</strong><br /> - LINEは毎日コミュニケーションツールとして開くし、Googleカレンダーも普段の予定管理に活用しているのでこれらを活用。</p> <p><strong>シンプルさを保つためにデメリットも</strong><br /> - 画像の登録はできない<br /> - 入力と出力以外の機能が無い(在庫管理などができない)</p> <h2 id="(2)技術に関して"><a href="#%EF%BC%88%EF%BC%92%EF%BC%89%E6%8A%80%E8%A1%93%E3%81%AB%E9%96%A2%E3%81%97%E3%81%A6">(2)技術に関して</a></h2> <h3 id="①GAS(Google Apps Script)とは"><a href="#%E2%91%A0GAS%28Google+Apps+Script%29%E3%81%A8%E3%81%AF">①GAS(Google Apps Script)とは</a></h3> <p>GASとはGoogleが提供するサーバーサイドのスクリプト言語です。Javascriptをベースにしており、Javascriptに既に触れている方や学ぶ予定がある人には習得しやすいかなって思います。(「プログラミング言語」という認識でいるのですが、合ってるのでしょうかね?もし違っていたらご指摘お願いします)<br /> 古いJavascriptのバージョンにしか対応していなかったのが難点ですが、つい先日、2020/2/6にはV8ランタイムというものをサポートしたことでECMAScriptに対応し、より現在のJavascriptとの互換性が増したようです。<a target="_blank" rel="nofollow noopener" href="https://tonari-it.com/gas-v8-runtime/">(参考リンク1)</a></p> <p>Google Apps(Googleドキュメント、スプレッドシート、カレンダー、Gmailなど)と簡単に連携することができるので、これらを活用したちょっとしたツールが作りやすいです。Webアプリも作れます。また開発環境のインストールもいらず、Web上でコードを書いて操作するだけで簡単に公開して実行することもできます。</p> <p>制限はありそうですが「ある程度ならなんでも簡単にできる」という印象で、仕事や趣味・生活などで「自分やチームで使うツールをちょっと作る」というのには最適かなって思います。</p> <h3 id="②LINE Messaging APIとは"><a href="#%E2%91%A1LINE+Messaging+API%E3%81%A8%E3%81%AF">②LINE Messaging APIとは</a></h3> <p>今では「LINE公式アカウント」でクーポン情報などを流すお店や企業が増えてますが、アレを作ることができるAPI(Application Programming Interface)です。様々な言語で活用できて、LINEを介して双方向のコミュニケーションをとることができるものを作ることができます。<br /> LINE botとして有名どころでLINEで女子高生AIと会話ができる「<a target="_blank" rel="nofollow noopener" href="https://www.rinna.jp/">りんな</a>」とか。面白いですね。</p> <h2 id="(3)実装内容"><a href="#%EF%BC%88%EF%BC%93%EF%BC%89%E5%AE%9F%E8%A3%85%E5%86%85%E5%AE%B9">(3)実装内容</a></h2> <p>今回のLINE botで実装した内容からいくつか簡単に紹介します。</p> <h3 id="①[GAS] LINEからの入力に対応"><a href="#%E2%91%A0%5BGAS%5D+LINE%E3%81%8B%E3%82%89%E3%81%AE%E5%85%A5%E5%8A%9B%E3%81%AB%E5%AF%BE%E5%BF%9C">①[GAS] LINEからの入力に対応</a></h3> <p>バックエンドの処理はGASで記述し、実際にユーザーが使う部分は基本的にLINEになります。この点でまず僕自身でUIを考えてコーディングする必要がなく、機能を制作することに集中することができました。</p> <p>LINEでユーザーがフォローしたりメッセージを送ったりと何か反応があったら、まず<code>doPost</code>関数が実行されます。そこからLINEアクションの種類(followだったりmessageだったりpostbackだったり)によって処理を分岐します。</p> <p>GASでGoogleサービス以外の外部のWeb APIを使うためには、<code>UrlFetch</code>サービスの<code>fetch</code>というメソッドを活用します。これによりHTTPリクエストを送信してWeb APIを叩くことができます。</p> <p>またLINEでの日報入力の際にユーザーが段階的に入力できるようにするために、GASのキャッシュサービスを活用しています。1つ処理を行ったら<code>Cache</code>オブジェクトに一時的にデータを保存しておくことで、ユーザーからのアクションをフラグで管理して分岐するようにしています。</p> <h3 id="②[GAS] 日報をGoogleカレンダー・スプレッドシートへ書き込み"><a href="#%E2%91%A1%5BGAS%5D+%E6%97%A5%E5%A0%B1%E3%82%92Google%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%E3%83%BB%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%E3%81%B8%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF">②[GAS] 日報をGoogleカレンダー・スプレッドシートへ書き込み</a></h3> <p>GASではGoogleの各サービスにアクセスするためのクラスが用意されています。<br /> - GmailAppクラス:Gmailを操作操作する<br /> - DocumentApp:Googleドキュメントを操作する<br /> - Spreadsheetクラス:Googleスプレッドシートを操作する<br /> - CalendarAppクラス:Googleカレンダーを操作する</p> <p>これらは先程の外部APIとは違ってGASから使える内部サービスのため、何の準備なしに使うことができます。<br /> これらを利用して日報を専用のカレンダーとスプレッドシートに書き込む処理を作りました。</p> <p>注意点としては、自分のGoogleアカウントに紐づいているGoogleカレンダーとしか連携できないことです。つまり、僕のアカウントでスクリプトを作成して、そのスクリプト上で他のユーザーが制作したカレンダーに書き込むことができないのです(スプレッドシートなら可能な様子)。</p> <h3 id="③[GAS] カテゴリをユーザーがカスタマイズ:Webアプリの作成(HTML Service)"><a href="#%E2%91%A2%5BGAS%5D+%E3%82%AB%E3%83%86%E3%82%B4%E3%83%AA%E3%82%92%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%8C%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%EF%BC%9AWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E4%BD%9C%E6%88%90%EF%BC%88HTML+Service%EF%BC%89">③[GAS] カテゴリをユーザーがカスタマイズ:Webアプリの作成(HTML Service)</a></h3> <p>毎回の入力の手間を省くために「作業カテゴリ」というものを用意しています。<br /> LINEから日報を入力する際にが選択肢(LINEのクイックリプライ機能)として選べるようにしたのですが、この内容をユーザーが自由に編集できるようにしました。</p> <p>データの保管場所としてスプレッドシートでセルを用意しており、そのデータを取得することで作業カテゴリを配列で取り出せるようにしています。</p> <p>またユーザーがカテゴリを編集しやすくするために、その部分だけWebアプリとして制作してみました。要件定義の段階では特に作る気はなく、スプレッドシートから直接編集できるからいいやと思っていたのですが、スプレッドシートに慣れていないユーザーだと編集しずらいだろうなと考えたためです(初期設定のハードル)<br /> これにはGASの<code>HtmlService</code>を活用して、最低限のHTMLの知識があれば簡単に制作することができます。</p> <p>Webページには編集フォームとスプレッドシートに設定されている作業カテゴリが表示されているだけのシンプルなものです。<br /> Webページにアクセスするとまず<code>doGet</code>関数が実行されます。またフォームで作業カテゴリを編集して送信した場合は<code>doPost</code>関数が実行されます。<code>doPost</code>関数ではLINEからのアクションなのかWebからのカテゴリ変更処理なのかをイベントオブジェクト<code>e</code>の中身から判断して、Webからの場合なら送られてきた内容をスプレッドシートの作業カテゴリのセルに上書きする、というような処理を行っています。</p> <h3 id="④[LINE] リッチメニューの作成"><a href="#%E2%91%A3%5BLINE%5D+%E3%83%AA%E3%83%83%E3%83%81%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%AE%E4%BD%9C%E6%88%90">④[LINE] リッチメニューの作成</a></h3> <p>LINE messaging APIで一番理解が難しかったのが、LINE messaging APIを活用したリッチメニューの制作方法でした。</p> <p>リッチメニュー制作にはLINE公式アカウントからの設定方法とmessaging APIを活用する方法の二種類があります。<br /> <a target="_blank" rel="nofollow noopener" href="https://developers.line.biz/ja/docs/messaging-api/using-rich-menus/">リッチメニューを使う | LINE Developers</a></p> <p>LINE公式アカウントからの制作はとても簡単で、画像を用意さえしておけばブラウザ上で操作するだけで簡単にリッチメニューを作成してLINE botで活用できます。プログラムを書かなくとも誰でも直感的に作ることができるのですが、メニューボタンの配置を細かく決めることができなかったりアクションの種類が限られていたりと、できることに制限があります。</p> <p>それでもちょっとしたものなら十分なのですが、LINE messaging APIを使うことでもうちょっと手の込んだ、例えばゲームコントローラーのようなボタン配置などをプログラムに落とし込んで作ることができます。</p> <p>最初に公式アカウントで制作したところ一瞬でできて感動したのですが、魔が差してmessaging APIを活用する方法で実装し直すことにしました(コードで完結できればメンテナンス性も高い?という考えも)。ところがhttpリクエストやRESTの理解が浅かったため自力で実装するのが困難でした。<br /> この実装にはこちらのHASEKATSU様のnote<a target="_blank" rel="nofollow noopener" href="https://note.com/_hasekatsu/n/n83afa5ffee56">(参考リンク2)</a>を参考にさせていただきました。<br /> 一応実装はできましたが、どう言う仕組みで実装できているのかまだちゃんと自分の言葉で説明できないので課題です。</p> <h2 id="(4)技術的な課題"><a href="#%EF%BC%88%EF%BC%94%EF%BC%89%E6%8A%80%E8%A1%93%E7%9A%84%E3%81%AA%E8%AA%B2%E9%A1%8C">(4)技術的な課題</a></h2> <p>紹介編にも書いたのですが、データベースの一意性がありません。これはほぼ自分用とはいえかなりの欠陥。<br /> 一度入力した日報をスプレッドシートやカレンダーから修正できるのですが、それがもう一方に反映される仕組みが作れていないのです。誤って日報登録してしまうことも多々あるので、一度登録したものを安心して編集・削除できる仕組みが必要なところ。</p> <p>この部分を解決するためにまず一番最初に考えたのが、Webアプリとしてスプレッドシートの内容を取り出して編集できるようにするというやり方。ところがこれ以上Webアプリ部分に力を割くのは、手間がかかる割にはどうにもGASで制作する意味が薄いように感じます(PHPやRubyでデータベースを用意して作る方が発展性がありそう)。</p> <p>手軽さとGoogleのサービスとの連携が簡単というGASの良さを引き出すなら、スプレッドシート上で編集するのが良さそうです。と思って調べてみると、値の変更があった際に発動するトリガーがGASで設定できるとのこと。スプレッドシート上の日報履歴が編集・削除されたら、対応したGoogle Calendarのイベントを書き換える…ということが理論上できそうです(Calendarのイベント固有のIDでデータベースを管理する)。</p> <p>一方でGoogleカレンダーの方で修正したいこともあるのですが、こちらがなんだか一手間二手間かかりそうです。これもGASのトリガー機能を使うことで、カレンダーの編集があったらスプレッドシートにもデータが反映されるようにすれば可能かなと思えたのですが、それにはGASのCalendarAppサービスだけでは出来ない様子。calendar APIという外部APIを使えうことで、なんとかできなくもなさそうな感じです。</p> <p>というわけで、技術的な課題は現状あるもののクリアできそうです。</p> <h2 id="おわりに"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</a></h2> <p>今回の制作では、初めて念願のAPIというものを活用することができました。<br /> RailsでWEBアプリ開発を学んでいた時には、エラーの対処やフロントエンド作り、環境構築などでいっぱいいっぱいでしたが、デバッグの感覚を学び、今回は比較的とっつきやすい技術を選んで目標を最小限にしたことで、余裕を持って制作できたと思います。</p> <p>反省としては、GASやLINE botの仕様を把握出来ていなくて、ユーザーに活用してもらうにあたり移行作業に手間がかかったことです。<br /> 自分以外のアカウントのGoogleカレンダーへの書き込みが出来ないことに完成間際で気づいて、どうやって他ユーザーに使ってもらうかを考え直すことになりました。結局身近で興味を持ってくれた仲間限定ということで、僕が新規作成したカレンダーを共有して使用してもらう方法をとることに。<br /> また、人数分のLINE botを用意しなければならずそれに対応した使い回しのきくスクリプトに書き換える作業が発生してしまいました。<br /> 完成したぜ!という段階からだいぶうだうだやってたのがもったいない。</p> <p>今後の方針としては、もうちょっとGASでこのアプリの改善と日常で必要なアプリを作りつつ他のAPIの活用のやり方も学んでみたいなーと思っています。</p> <h2 id="MEMO"><a href="#MEMO">MEMO</a></h2> <p>僕の過去記事でGASとLINE messaging API学習に役立った教材・ブログをまとめてあります。<br /> もしこれから取り組む方がいましたら参考にしていただけたら嬉しいです!<br /> <a href="https://crieit.net/posts/GAS-LINE-messaging-API">GAS & LINE messaging APIの学習便利帳 - Crieit</a></p> <h3 id="参考にしたサイト"><a href="#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%9F%E3%82%B5%E3%82%A4%E3%83%88">参考にしたサイト</a></h3> <ul> <li>参考リンク1<br /> <a target="_blank" rel="nofollow noopener" href="https://tonari-it.com/gas-v8-runtime/">祝!Google Apps Scriptが「V8ランタイム」をサポート!モダンなECMAScript構文が使えるようになった</a></li> <li>参考リンク2<br /> <a target="_blank" rel="nofollow noopener" href="https://note.com/_hasekatsu/n/n83afa5ffee56">Postmanでリッチメニューを設定する方法【LINE Messaging API×GAS】|HASEKATSU|note</a></li> </ul> <p>またこちら、本文には特記してないのですが、使用言語としてGASを検討する際の参考に。<br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/mistolteen/items/c206d5970ae1a6c7813d">GASを使うべきか否かの判断材料 - Qiita</a></p> Massa tag:crieit.net,2005:PublicArticle/15736 2020-02-26T12:37:47+09:00 2020-02-29T14:45:42+09:00 https://crieit.net/posts/GAS-LINE-bot GASで「農作業記録アシスタント」LINE bot作った(紹介編) <h2 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h2> <p>エンジニアでもなんでもないただの畑作農家が、普段の農作業の記録を簡単に記録するためのLINE botを作りました。<br /> 今回はその紹介編です!</p> <p><strong>(2020/2/29追記)技術編もまとめました。</strong><br /> <a href="https://crieit.net/posts/GAS-LINE-bot-5e59f5af2ba2b">GASで「農作業記録アシスタント」LINE bot作った(技術編) - Crieit</a></p> <p>農家にとって細かく作業の記録を残しておくことは大事で、作業ごとに把握しておくべき項目が多いのです。<br /> 例えば種蒔き。年に1回(ほんの数日間)しか行わない作業ですが、種子を落とす量・肥料の銘柄と量・それに合わせた機械のセッティングと走る速度など、細かな調整がその年の収量(=収入)を左右します。</p> <p>また複数の作物を管理していると、定期的に農薬を散布するなど天気を見ながら計画を立てることになるので、前回いつ・どんな薬を撒いたか、などを把握しておくことが大事になります。数年前の記録を引っ張り出してきたい時もあります。</p> <p>メモしておかないと、だいたい1年経つと全て忘れます\(^o^)/</p> <p>ただ、メモするのがめんどくさいんですよね。<br /> 紙の日誌だと多く情報を残せますが、検索性に欠けるし。<br /> 必要な時に必要なものだけちゃちゃっと記入して、必要な時に必要なものだけちゃちゃっと取り出せる、そんなツールが欲しいなあと思っていました。</p> <p>皆さんおそらく同じように悩まれていることで、農作業日誌アプリにはスマホアプリやWEBアプリが既に多々存在します。農家の経営を助けるために、いろんな方がいろんな想いを込めて作ってくれています。<br /> ところが、僕にはどうも上手く使いこなせないのでした。実際に使ってみても中々しっくりくるものがなかったというのが正直なところで。</p> <p>まあ、そんなんで、作りました。<br /> 自分が普段メモ書きなどでも使っているLINEと予定管理に使っているGoogle Calendarに着目して、入力の手間を極限まで省いた農作業記録アプリをLINE botで作成。</p> <h2 id="こんなアプリ"><a href="#%E3%81%93%E3%82%93%E3%81%AA%E3%82%A2%E3%83%97%E3%83%AA">こんなアプリ</a></h2> <p>LINEを開いてメニューをタップしたら入力開始。メッセージに従って「日時」「作業カテゴリ」を選択した後にチャットで作業内容を入力。</p> <p>入力した内容は指定のGoogleカレンダーとスプレッドシートに自動で登録されるので、それらのツールで登録した記録を見返すことができます。</p> <div class="iframe-wrapper"><iframe width="560" height="315" src="https://www.youtube.com/embed/G7_aKwVEjTs" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div> <h3 id="(1)LINEを開いて簡単に今日の作業日報を入力"><a href="#%EF%BC%88%EF%BC%91%EF%BC%89LINE%E3%82%92%E9%96%8B%E3%81%84%E3%81%A6%E7%B0%A1%E5%8D%98%E3%81%AB%E4%BB%8A%E6%97%A5%E3%81%AE%E4%BD%9C%E6%A5%AD%E6%97%A5%E5%A0%B1%E3%82%92%E5%85%A5%E5%8A%9B">(1)LINEを開いて簡単に今日の作業日報を入力</a></h3> <p>作業の日報入力を専用のアプリでやるのではなくLINEで入力するというのが肝。<br /> コミュニケーションツールとしてLINEを開かない日は無い、という人が多いかと思います。LINEを立ち上げる度に嫌でもこのbotのアイコンが目に入るため、思い出した時にちゃちゃっと入力をしてやればいいのです。</p> <p><strong>↓メニューの左「日報を入力」をタップすると、日報登録のボタンが出てくる</strong><br /> <a href="https://crieit.now.sh/upload_images/704d5676a24bb5091ddb305676ac996f5e55e34d74b65.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/704d5676a24bb5091ddb305676ac996f5e55e34d74b65.png?mw=700" width="200px"></a></p> <p><strong>↓日時を選択して登録できるので昨日の記入忘れも安心</strong><br /> <a href="https://crieit.now.sh/upload_images/6c48c898f6f32a4537bb20b6d6ab9a2f5e55e3ed0e142.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6c48c898f6f32a4537bb20b6d6ab9a2f5e55e3ed0e142.png?mw=700" width="200px"></a></p> <p><strong>↓作業カテゴリは選択肢を選ぶだけ</strong><br /> <a href="https://crieit.now.sh/upload_images/b1e66934331753526993140f48a0ac695e55e594c7429.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b1e66934331753526993140f48a0ac695e55e594c7429.png?mw=700" width="200px"></a></p> <p><strong>↓作業内容を入れる時だけテキスト入力が必要</strong><br /> <a href="https://crieit.now.sh/upload_images/99c8c1d24bccead863d92d4477857f245e55e3fc1eb2b.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/99c8c1d24bccead863d92d4477857f245e55e3fc1eb2b.png?mw=700" width="200px"></a></p> <p><strong>↓登録できました!</strong><br /> <a href="https://crieit.now.sh/upload_images/630219fae38678f3d7061d6f86c50f5d5e55e4fac84df.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/630219fae38678f3d7061d6f86c50f5d5e55e4fac84df.png?mw=700" width="200px"></a></p> <p>また、LINEを使うと過去にあげた日報の履歴がLINE上からも参照できるというのは何気に便利。コピペしてきて文面を使い回して使用しても◎</p> <p>ただ、LINEからの一度登録した予定の編集・削除は現状備わっておりません。手動でカレンダーとスプレッドシートで編集する必要があります。</p> <h3 id="(2)Googleカレンダーに記録して見返す"><a href="#%EF%BC%88%EF%BC%92%EF%BC%89Google%E3%82%AB%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%E3%81%AB%E8%A8%98%E9%8C%B2%E3%81%97%E3%81%A6%E8%A6%8B%E8%BF%94%E3%81%99">(2)Googleカレンダーに記録して見返す</a></h3> <p>こちらも日常使いのツールをそのまま使用。<br /> 予定管理を全てGoogleカレンダーで行なっているので、スマホのウィジェットとして登録しておくことで、作業履歴もそこに表示してくれることになります。<br /> 他のカレンダーアプリにGoogleカレンダーを連携して使うこともできそうですよね。僕の周りでは「Time Tree」を予定管理に使っている人が多いのですが、どうやら連携が可能そうです(僕自身使ってないので正確にはわからず)。</p> <p><a href="https://crieit.now.sh/upload_images/5fa9ec01f71efe346deaf216045b13835e55e63397e81.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5fa9ec01f71efe346deaf216045b13835e55e63397e81.png?mw=700" width="200px"></a></p> <h3 id="(3)スプレッドシートでも記録を管理"><a href="#%EF%BC%88%EF%BC%93%EF%BC%89%E3%82%B9%E3%83%97%E3%83%AC%E3%83%83%E3%83%89%E3%82%B7%E3%83%BC%E3%83%88%E3%81%A7%E3%82%82%E8%A8%98%E9%8C%B2%E3%82%92%E7%AE%A1%E7%90%86">(3)スプレッドシートでも記録を管理</a></h3> <p>これはおまけというか、主にパソコン上で過去の履歴を一覧にして参照したい時があるので、そのために作りました。ここは比較的アナログ感が強いのですが、参照したい時はスプレッドシート上で操作をします。フィルタで特定の作業カテゴリのみを一覧表示にしたり、全体を検索をかけたり。ここをWEBアプリでもうちょっとしっかりすると良い感じがします。</p> <p><a href="https://crieit.now.sh/upload_images/3de1a13f3cacaba3532e84c82897f5bd5e55e69a160f0.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3de1a13f3cacaba3532e84c82897f5bd5e55e69a160f0.png?mw=700" width="400px"></a></p> <h3 id="(4)作業カテゴリをユーザーがカスタマイズ"><a href="#%EF%BC%88%EF%BC%94%EF%BC%89%E4%BD%9C%E6%A5%AD%E3%82%AB%E3%83%86%E3%82%B4%E3%83%AA%E3%82%92%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%8C%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA">(4)作業カテゴリをユーザーがカスタマイズ</a></h3> <p>日報入力時に作業カテゴリを選択肢として出るようにしているのですが、これはユーザーによって色々変わってくると思います。専用のWEBアドレスにアクセスすると、そこからユーザー自身でカテゴリの編集を行えるようにしています(ここはWEBアプリ)</p> <p><a href="https://crieit.now.sh/upload_images/c67771d31977854f9b49d34c1e2abb6c5e55e7102f475.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c67771d31977854f9b49d34c1e2abb6c5e55e7102f475.png?mw=700" width="300px"></a></p> <h2 id="現状の課題とこれからの展望"><a href="#%E7%8F%BE%E7%8A%B6%E3%81%AE%E8%AA%B2%E9%A1%8C%E3%81%A8%E3%81%93%E3%82%8C%E3%81%8B%E3%82%89%E3%81%AE%E5%B1%95%E6%9C%9B">現状の課題とこれからの展望</a></h2> <p>あくまで自分が欲しいものを作ったのですが、その延長で「人に使ってもらいフィードバックをもらう」ところまでは今回ずっと考えて作ってきました。身近な同業者に使ってもらえることになったので、反応が楽しみです。</p> <p>ひとつ大きな課題としては、データの編集・削除に問題があります。<br /> カレンダーとスプレッドシート両方を編集する必要があるので、単に不便なだけでなくデータの一意性が保てていません。ここはもうちょっと考える必要あり。</p> <p>自分専用で使うなら最低限の機能を持ったアプリが完成した感じなので、これで満足といえば満足です。<br /> 仮に発展が望めるなら、別言語でサーバーを準備して本格的にWEBアプリ化?スマホアプリ化?</p> <p>もうすぐ春から本格的に始まる農作業で実際に活用しつつ、使ってもらえる方の反応を聞きながら、今後の展開を考えていきたいと思います。</p> <h2 id="おわりに:農作業記録アシスタントLINE botを使ってみたいという方へ"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB%EF%BC%9A%E8%BE%B2%E4%BD%9C%E6%A5%AD%E8%A8%98%E9%8C%B2%E3%82%A2%E3%82%B7%E3%82%B9%E3%82%BF%E3%83%B3%E3%83%88LINE+bot%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%BF%E3%81%9F%E3%81%84%E3%81%A8%E3%81%84%E3%81%86%E6%96%B9%E3%81%B8">おわりに:農作業記録アシスタントLINE botを使ってみたいという方へ</a></h2> <p>残念ながら一般公開はできません。ただ、もし「使ってみたい!!!」というアツいお方がもしいらっしゃいましたら、是非ぜひお声がけいただけたら嬉しいです。システム的には農業に限らず業界関係なく使用できると思います。また、</p> <ul> <li>Googleアカウントが必要(Gmailアドレス)</li> <li>自分専用(複数人での使用は登録処理がおそらく無理。カレンダー共有は可)(とは言いつつも少人数のメンバーが固定してるグループならLINE botを人数分立てていけるのかも)</li> <li>登録情報の秘密性には欠ける(僕の方で参照・編集することができてしまう)</li> </ul> <p>この点だけご注意を願いします。テストユーザーとして色々遊んでもらって、使い勝手などご意見いただきたい気持ち。<br /> LINE botを個別に作成する必要があるため多くの対応は難しいですが、まあそんなことはないと思うので、何か気軽にお話いただけたらとても喜びます。</p> <h2 id="MEMO"><a href="#MEMO">MEMO</a></h2> <p>使用技術等はこんな感じ(別記事で詳しく書く予定です)<br /> - 言語はGoogle Apps Script(GAS)<br /> - LINE messaging API 使用</p> <p>サーバーレス。<br /> Googleカレンダーとスプレッドシートを連携。WEBアプリ部分はGASのHTML Serviceを活用して作成。</p> <p>また、今回のLINE botのアイコンイラストは、こちらの「ねこぺんね」様の素材を使用させていただいてます。ありがとうございます!<br /> <a target="_blank" rel="nofollow noopener" href="https://www.ac-illust.com/main/detail.php?id=1624420&word=%E9%A1%94%E3%81%A4%E3%81%8D%E9%87%8E%E8%8F%9C">顔つき野菜イラスト - No: 1624420/無料イラストなら「イラストAC」</a></p> Massa tag:crieit.net,2005:PublicArticle/15697 2020-01-24T17:37:21+09:00 2020-01-24T18:25:11+09:00 https://crieit.net/posts/GAS-LINE 【GAS】家族で使えるゴミ出しリマインダ LINEチャットボットを作った <h2 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h2> <p>日常のゴミ出しって難題ですよね。</p> <p>「今日燃えるゴミの日なのに、ゴミ出し忘れた!!」<br /> 「プラごみ出し忘れて今日で1ヶ月…また2週間後まで出せない…」</p> <p>いや、できるのが普通当たり前のことなのかもしれないのですが、自分のような日常生活に支障をきたす程度の面倒くさがり+曜日感覚のない人間にとっては、ゴミを定期的に出すというのはかなりのハードルです。<br /> 一人暮らしの時にはアパートの入り口は基本ゴミの山。<br /> 結婚してからも自分の力でゴミ出しができた試しがなく妻には頭が上がらない。</p> <p>男女問わずこんな<del>ダメ人間</del>多忙なビジネスパーソンが多いと僕は信じています…。</p> <p>ともあれ、そんなやっかいなゴミ出し問題を解決するために、家族や夫婦で活用できるアプリを制作しました。</p> <p><em>「ゴミ出し日の前日にリマインドしてくれるLINEチャットボット」</em></p> <p>一人暮らしで活用してもよし、旦那さんが奥さんのために率先してゴミ出ししてもよし、夫婦で共有してもよし、子供にゴミ出しを意識づけさせるために使ってもよし。</p> <h2 id="使用した技術"><a href="#%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E6%8A%80%E8%A1%93">使用した技術</a></h2> <ul> <li>GAS(Google Apps Script)</li> <li>LINE Messanger API</li> </ul> <h2 id="1.チャットボット詳細"><a href="#%EF%BC%91%EF%BC%8E%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%83%9C%E3%83%83%E3%83%88%E8%A9%B3%E7%B4%B0">1.チャットボット詳細</a></h2> <p>改めて、このチャットボットで出来ることはとてもシンプルで、このLINE botアカウントと友達になっておくことで<br /> 「ゴミ出し日の前日夜9時にリマインダが送られてくる」<br /> というものです。ただそれだけ。</p> <p>曜日によって送る情報を変えることができるので、自分の地域のゴミ収集曜日を入れておくことでそれに応じてリマインドしてくれます。</p> <p><em>↓いろいろ通知してくれるLINE bot 「にゃんこ通信」</em><br /> <a href="https://crieit.now.sh/upload_images/971c1a50bdb9a973c3b0ebc0cde519595e2aab1a5c401.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/971c1a50bdb9a973c3b0ebc0cde519595e2aab1a5c401.png?mw=700" alt="Screenshot_20200117-181309.png" /></a></p> <p><em>↓こんな感じに勝手にチャットが飛んできてお知らせしてくれます。うんこうんこ</em><br /> <a href="https://crieit.now.sh/upload_images/bbea6d5ef62c776c07a3c530541a9e015e2aab36dfdda.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/bbea6d5ef62c776c07a3c530541a9e015e2aab36dfdda.png?mw=700" alt="Screenshot_20200117-181124.png" /></a></p> <h2 id="3.色々な情報をグローバルで定義しておく"><a href="#%EF%BC%93%EF%BC%8E%E8%89%B2%E3%80%85%E3%81%AA%E6%83%85%E5%A0%B1%E3%82%92%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E3%81%A7%E5%AE%9A%E7%BE%A9%E3%81%97%E3%81%A6%E3%81%8A%E3%81%8F">3.色々な情報をグローバルで定義しておく</a></h2> <p>Line Developersのチャンネル作成やプッシュメッセージの登録などが必要ですが、<br /> 今回はコードのみ紹介。</p> <pre><code>//チャンネル情報・ラインユーザー情報の取得 var CHANNEL_ACCESS_TOKEN = 'ここにアクセストークンを入力'; var USER_ID_M = 'ここにラインユーザーIDを入力'; var USER_ID_L = 'ここにラインユーザーIDを入力'; </code></pre> <p>まず、チャンネルアクセストークンと、リマインダメッセージを送りたいラインのユーザーIDを変数に入れます。</p> <p>これらはプログラム中で変更することがないので定数constに入れたいなあと思うのですが、どうやらconstはグローバルでは定義できないようです(<a target="_blank" rel="nofollow noopener" href="https://teratail.com/questions/226375">参考リンク1</a>)<br /> (定数は関数内でプライベートでのみ定義)<br /> 頭に書いておきたいので変数varで定義しておきます。</p> <p>チャンネルアクセストークンと自身のLINEユーザーIDについては、LINE Developersのチャンネル情報で見れるので、それを利用します。</p> <p>ちょっと手間がかかるのが複数人でこのbotを共有する場合。<br /> 僕の場合は妻とbotを共有したいので、メッセージの送り先として妻のLINEユーザーID(ラインで友達検索に使うラインIDとは別物です)を設定しなければなりません。</p> <p>ところが、調べているとこれが簡単に取得できないことが発覚。<br /> 一旦置いておいて次項で。</p> <pre><code>//ユーザー入力項目 var weekday = ["日", "月", "火", "水", "木", "金", "土"]; var garbageCalendar = { "日":"", "月":"燃やすゴミ", "火":"", "水":"資源ゴミ", "木":"燃やすゴミ", "金":"", "土":"" }; </code></pre> <p>次にユーザー入力項目ですが、<br /> このgarbageCalendar変数に、オフジェクトでゴミ収集の曜日とゴミの種類を入れておきます。<br /> 地域のゴミ収集カレンダーから持って来ましょう。</p> <h2 id="3.他人のラインユーザーIDの取得"><a href="#%EF%BC%93%EF%BC%8E%E4%BB%96%E4%BA%BA%E3%81%AE%E3%83%A9%E3%82%A4%E3%83%B3%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BCID%E3%81%AE%E5%8F%96%E5%BE%97">3.他人のラインユーザーIDの取得</a></h2> <p>これには<a target="_blank" rel="nofollow noopener" href="https://www.pre-practice.net/2018/11/line-botuserid-groupid-roomid.html">参考サイト1</a>をそのまま活用させてもらいました。</p> <p>取得したユーザーIDをグローバル変数に入れておきます。</p> <h2 id="4.リマインダのメイン処理"><a href="#%EF%BC%94%EF%BC%8E%E3%83%AA%E3%83%9E%E3%82%A4%E3%83%B3%E3%83%80%E3%81%AE%E3%83%A1%E3%82%A4%E3%83%B3%E5%87%A6%E7%90%86">4.リマインダのメイン処理</a></h2> <p>次に、リマインダのメッセージなどを記述して送信するための<code>garbageReminder()</code>関数というものを作ります。</p> <pre><code>//リマインダのメイン処理 function garbageReminder() { //翌日の日時を取得 var date = new Date(); date.setDate(date.getDate() + 1); //翌日の曜日を取得して、ゴミの種類を取得 var dayNum = date.getDay(); var day = weekday[dayNum]; var garbageType = garbageCalendar[day]; //明日がゴミ収集日にリマインドメッセージを送信 var message = "【ゴミ出し通信】\n"; if(garbageType != ""){ message += " 明日は${day}曜日、「${garbageType}」の日です。\n出すゴミをチェックしよう!".replace('${day}',day).replace('${garbageType}',garbageType); sendToLine(message); }else{ }; } </code></pre> <p>前半では、今日の日付から曜日を取得してわちゃわちゃして翌日のゴミの種類を判別してます。</p> <p><code>new Date()</code>でまず今日の日付情報を取得できるので、その変数に<code>date.setDate(date.getDate() + 1);</code>とすることで、翌日の日付情報を取得しています。<br /> その取得した日付情報<code>date</code>に<code>getDay()</code>メソッドを使うことで曜日を取り出すことができます。曜日は数字になっているので注意。<br /> 曜日からゴミの種別を取ってくるときは、グローバルで定義しておいた配列とオブジェクトを使用します。</p> <p>後半は、メッセージを送信する処理になります。<br /> 翌日がゴミ出し曜日の場合にのみ、変数<code>message</code>に曜日やゴミの種別が入った文字列が入ります。<br /> 変数を文字列として送るときは<code>replase</code>メソッドを活用。<br /> また改行を入れたいときは<code>\n</code>(記号はバックスラッシュ)を使います。</p> <p>最後に<code>sendToLine(message)</code>という関数(次項に記述)を利用して、先ほどの変数<br /> <code>message</code>の値をラインに送信しています。</p> <h2 id="5.ラインに送信する処理"><a href="#%EF%BC%95%EF%BC%8E%E3%83%A9%E3%82%A4%E3%83%B3%E3%81%AB%E9%80%81%E4%BF%A1%E3%81%99%E3%82%8B%E5%87%A6%E7%90%86">5.ラインに送信する処理</a></h2> <p>前項の最後の、実際にラインに送信するための色々な情報を記述する<br /> <code>sendToLine()</code>関数を作ります。</p> <pre><code>//ラインに送信する処理 function sendToLine(message){ //色々なパラメータを設定 var url = 'https://api.line.me/v2/bot/message/multicast'; var headers = { 'Content-Type':'application/json; charset=UTF-8', 'Authorization':'Bearer ' + CHANNEL_ACCESS_TOKEN }; var data={ "to":[USER_ID1, USER_ID2], "messages":[{ "type":"text", "text":message }] }; var options = { 'method':'post', 'headers':headers, 'payload':JSON.stringify(data) }; //LINE messanger APIを叩く UrlFetchApp.fetch(url, options); } </code></pre> <p>最後の<code>UrlFetchApp.fetch(url, options);</code>がGASでAPIを叩く命令となります。<br /> かっこの中は「どこへ、どの情報を送る」というイメージです。</p> <p>そのために必要なものをその前に変数に入れて記述しています。<br /> 詳しくはLINE Developersの公式ドキュメント(<a target="_blank" rel="nofollow noopener" href="https://developers.line.biz/ja/reference/messaging-api/#send-push-message">Messaging APIリファレンス</a>)を参照。</p> <p><code>var url</code>にはHTTPリクエストを送るURLを記述します。<br /> このurlの末尾を<code>multicast</code>としていることで、送り先を複数に設定しています。<br /> この実際に送るのが<code>var data</code>の<code>to</code>に配列で複数設定しているユーザーIDになっています。</p> <p>例えばこのbotを自分だけが使用できれば良いという場合は、<br /> HTTPリクエストを送るurlの末尾を<code>push</code>にして、<code>var data</code>の<code>to</code>には自分のユーザーIDだけを指定しておけば良いですね。</p> <p>詳しい説明は省いてしまいますが、このようにLINEのmessaging APIを叩くための諸々のパラメータを<code>url</code>,<code>headers</code>,<code>data</code>, <code>options</code>に入れているわけです。</p> <p>ここまでできたら、トリガーを登録することでリマインド機能が完成です!</p> <h2 id="課題"><a href="#%E8%AA%B2%E9%A1%8C">課題</a></h2> <ul> <li>LINEのユーザーIDを調べる方法をコピペで実施しているので、コードを自分の頭で書いて理解してみようと思います。</li> <li>というか、そもそもLINEユーザーIDをいちいち入れなくてもいい可能性はないか…?</li> </ul> <h2 id="おわりに"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</a></h2> <p>普段使っているラインを入り口にして色々できないかなーと考えるようになって<br /> 日常生活で欲しかったちょっとしたものを実際に作ってみた次第です。</p> <p>これに夫婦で使いたい機能をちょっとずつ付け足していきたいと思っていて、<br /> 家計の金銭管理とか、買い物リストとか、直接ラインでやりとりするのは少し手間だったり精神的負担があったり…というようなほんと些細なことをツールで出来るようにしたいなーと思っています。</p> <p>いずれリッチメニューなんかも作れるようになりたいですね。</p> <p>夫婦中がちょっとだけアップするアプリを目指します。笑</p> <h2 id="参考にしたサイト"><a href="#%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%9F%E3%82%B5%E3%82%A4%E3%83%88">参考にしたサイト</a></h2> <ul> <li>参考1<br /> <a target="_blank" rel="nofollow noopener" href="https://teratail.com/questions/226375">Google Apps Script - Google Apps Scriptでグローバルな定数を定義できない|teratail</a></li> <li>参考2<br /> <a target="_blank" rel="nofollow noopener" href="https://www.pre-practice.net/2018/11/line-botuserid-groupid-roomid.html">Google Apps Script試行錯誤Blog: LINE BOTでuserId, groupId, roomIdを取得したい</a></li> <li>LINE Developers公式ドキュメント(プッシュメッセージ)<br /> <a target="_blank" rel="nofollow noopener" href="https://developers.line.biz/ja/reference/messaging-api/#send-push-message">Messaging APIリファレンス</a></li> </ul> <h2 id="MEMO"><a href="#MEMO">MEMO</a></h2> <p>Githubに全体のコードをあげています。<br /> 書き方はあまりスマートでない部分もあるかと思うので、その点はお手柔らかに。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/Massasquash/LINEbot-for-life/blob/master/push.gs">LINEbot-for-life/push.gs at master · Massasquash/LINEbot-for-life · GitHub</a></p> <p>また、LINE botのアイコンの画像はこちらのものを使用させていただいてます。感謝。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.sozailab.jp/sozai/detail/14638/">勉強猫 | 無料イラスト素材|素材ラボ</a></p> Massa tag:crieit.net,2005:PublicArticle/15661 2019-12-31T22:28:48+09:00 2019-12-31T22:38:26+09:00 https://crieit.net/posts/Workdiary 作業日誌アプリ「Workdiary」説明書 <p><a target="_blank" rel="nofollow noopener" href="https://workdiary-al.herokuapp.com/diaries">Workdiary</a></p> <p>初めて制作してきたWEBアプリです。<br /> 日記とその日にやったワークの登録を行う作業日誌アプリで、農作業を想定していますがどんなジャンルの作業でも(おそらく)使えるような内容になっています。</p> <p>GitHubリポジトリは<a target="_blank" rel="nofollow noopener" href="https://github.com/Massasquash/workdiary">こちら</a></p> <p>初アプリとはいえ未完の部分が多く、クオリティ的には課題が山積み。<br /> お時間のある時になんとなくいじってみてもらえたら嬉しいです。</p> <h2 id="アプリの使用イメージ"><a href="#%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E4%BD%BF%E7%94%A8%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8">アプリの使用イメージ</a></h2> <p>自身の農作業の記録を目的として制作してみました。<br /> 勉強の記録などに使ってもいいかもしれません。</p> <p><strong>(1)やった作業を入力する</strong><br /> 農作業をやっていて、一段落ついた休憩時とかその日家に帰ってお酒飲みながらでも、スマホをポチポチやってその日にやった作業内容を登録。この時にメモしておきたい数量や機械のセッティング内容などを簡単に入れておきます。</p> <p><strong>(2)必要なときに調べる</strong><br /> その後「このセッティングって前回どうしていたっけ?」という時に、スマホをポチポチやって以前に入力した内容を確認します。</p> <p>特徴としては「テンプレート機能」というものをつけてみました。<br /> 作業内容の定型文(テンプレート)をユーザーが事前に作っておくことで、やった作業の記録を簡単に記録できるようにしています。</p> <h2 id="アプリの使い方"><a href="#%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9">アプリの使い方</a></h2> <h3 id="(1)サインアップ・ログイン"><a href="#%EF%BC%88%EF%BC%91%EF%BC%89%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97%E3%83%BB%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3">(1)サインアップ・ログイン</a></h3> <p><a href="https://crieit.now.sh/upload_images/80efe1f337b04eeaa51d2e04ff6c3f175e0b4af496652.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/80efe1f337b04eeaa51d2e04ff6c3f175e0b4af496652.png?mw=700" alt="スクリーンショット 2019-12-19 21.05.58.png" /></a></p> <ul> <li>サンプルアカウントでログインしてみてください。</li> <li>初期値でフォームにサンプルアカウントが入っているのでそのまま「ログイン」をクリックすると入れます。</li> <li>任意のメールアドレスとパスワードでユーザー登録(サインアップ)することもできます。</li> <li>メールアドレスは架空のものでOKです。現状の設定では実際にメールは届きません。</li> </ul> <h3 id="(2)ナビゲーションバー"><a href="#%EF%BC%88%EF%BC%92%EF%BC%89%E3%83%8A%E3%83%93%E3%82%B2%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%90%E3%83%BC">(2)ナビゲーションバー</a></h3> <p><a href="https://crieit.now.sh/upload_images/ce91611997d4568e6aa485feea173edb5e0b4b49a8daf.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ce91611997d4568e6aa485feea173edb5e0b4b49a8daf.png?mw=700" alt="スクリーンショット 2019-12-19 21.31.17.png" /></a></p> <p>ログインしたら画面上部にナビゲーションバーが登場し、アイコンをクリックすると画面遷移します。左から、</p> <ul> <li>ダイアリー一覧:ダイアリーとワークを一覧表示します。</li> <li>ワーク一覧:ワークをカテゴリごとに一覧表示します。(未実装)</li> <li>検索:日記・ワークを文字列検索できます。(未実装)</li> <li>編集:カテゴリとテンプレートを編集できます。</li> <li>アカウント:ログイン状況の確認とログアウトができます。</li> </ul> <h3 id="(3)メインページ(「日記一覧」画面)"><a href="#%EF%BC%88%EF%BC%93%EF%BC%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8%EF%BC%88%E3%80%8C%E6%97%A5%E8%A8%98%E4%B8%80%E8%A6%A7%E3%80%8D%E7%94%BB%E9%9D%A2%EF%BC%89">(3)メインページ(「日記一覧」画面)</a></h3> <p><a href="https://crieit.now.sh/upload_images/ddad0c60cdc43af96d4c9f997dffd83a5e0b4b7792edb.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ddad0c60cdc43af96d4c9f997dffd83a5e0b4b7792edb.png?mw=700" alt="スクリーンショット 2019-12-19 21.16.18.png" /></a></p> <p>ログインしたら最初にこの画面が表示されます。<br /> ここでは既に登録された「日記」と「ワーク」が一覧で表示され、それらの作成もできるこのアプリのメインページになります。</p> <p><strong>日記の作成</strong><br /> - 「ダイアリーを書く」から今日の日記を投稿します(画像では「日記を書く」)。<br /> - 投稿できる日付は今日に限らず過去でも未来でもプルダウンで選択できます。<br /> - ダイアリーは日付あたり1つのみ作成できます。</p> <p><strong>ワークの作成</strong><br /> - ダイアリーを作ったら、そのダイアリーに紐づいたワークが作成できるようになります。日付の横にある「ワークの追加から作成します。<br /> - カテゴリ、作業名、作業内容を入力して登録します(写真はフォームのみで未実装)。</p> <p><strong>その他</strong><br /> ・ダイアリー一覧の日付をクリックすると日記の詳細画面に映ります<br /> ・登録したダイアリー・ワークの編集と削除もできます<br /> ・「メモする」をクリックすると、ワークに対してメモを1つ追加することができます。後から気づいた点を追記したい場合などに活用できます。</p> <h3 id="(4)「カテゴリ」について"><a href="#%EF%BC%88%EF%BC%94%EF%BC%89%E3%80%8C%E3%82%AB%E3%83%86%E3%82%B4%E3%83%AA%E3%80%8D%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">(4)「カテゴリ」について</a></h3> <p>ワークに対してカテゴリを登録しておくことで、後からカテゴリごとにワークを一覧表示できるようにするものです。</p> <ul> <li>ワーク入力時に「カテゴリ」をプルダウンで選択します。</li> <li>事前に「+カテゴリ追加」から自分でカテゴリを作っておく必要があります(画面遷移します)。</li> <li>ナビゲーションバーの「編集」ページでカテゴリを編集・削除することができます。</li> <li>カテゴリを削除したら、該当するワークからはカテゴリが外れてしまいます。</li> </ul> <h3 id="(5)「テンプレート」について"><a href="#%EF%BC%88%EF%BC%95%EF%BC%89%E3%80%8C%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%80%8D%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">(5)「テンプレート」について</a></h3> <p>ワーク入力時にテンプレートを選択することで作業内容に定型文を入力できます。例えば「決まった一連のワークがあって、その作業内容の定型文を作っておいて数値のみ変えて登録する」といった活用なんかを想定しています。</p> <ul> <li>ワーク入力時に「テンプレート」をプルダウンで選択するとその下の作業内容フォームにテンプレートの内容が自動で入力されるので、それを書き換えるなどして投稿することができます。</li> <li>事前に「+テンプレート追加」から自分でテンプレートを作っておく必要があります(画面遷移します)。</li> <li>ナビゲーションバーの「編集」ページでテンプレートを編集・削除することができます。</li> </ul> <p>↓テンプレートをプルダウンリストで選択すると……<br /> <a href="https://crieit.now.sh/upload_images/b9b27dd4ad30bed38c15c67f5a3802785e0b4ba361dc5.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b9b27dd4ad30bed38c15c67f5a3802785e0b4ba361dc5.png?mw=700" alt="スクリーンショット 2019-12-19 22.56.16.png" /></a></p> <p>↓このように作業内容のフォームに反映されます<br /> <a href="https://crieit.now.sh/upload_images/0db1f94ffb5a331cdefc136d18611c6a5e0b4bb5d66b0.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0db1f94ffb5a331cdefc136d18611c6a5e0b4bb5d66b0.png?mw=700" alt="スクリーンショット 2019-12-19 22.56.24.png" /></a></p> <h3 id="(6)ログアウト"><a href="#%EF%BC%88%EF%BC%96%EF%BC%89%E3%83%AD%E3%82%B0%E3%82%A2%E3%82%A6%E3%83%88">(6)ログアウト</a></h3> <p>ナビゲーションバーの「アカウント」ページよりログアウトできます。</p> <p>......以上、最低限のアプリの説明書でした。</p> <h2 id="開発に使用したスキル"><a href="#%E9%96%8B%E7%99%BA%E3%81%AB%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E3%82%B9%E3%82%AD%E3%83%AB">開発に使用したスキル</a></h2> <p>言語とフレームワーク<br /> - HTML, CSS<br /> - Ruby, Ruby on Rails<br /> - 一部、Javascript, JqueryでAjax化</p> <p>開発環境等<br /> - AWS cloud9<br /> - Heroku</p> <p>またRailsで使った主なgemとしては<br /> - Bootstrap4(デザイン)<br /> - Font Awesome (アイコン使用)<br /> - Devise(ログイン機能)</p> <p>デザイン周りはほぼBootstrapを活用しています。<br /> 一部機能にjQueryを使用してAjax化していますが、ちゃんと理解して使えていないというのが正直なところ。<br /> ログイン機能のメール認証に関しては実際の認証は外した状態です。</p> <h2 id="今後の実装予定と課題"><a href="#%E4%BB%8A%E5%BE%8C%E3%81%AE%E5%AE%9F%E8%A3%85%E4%BA%88%E5%AE%9A%E3%81%A8%E8%AA%B2%E9%A1%8C">今後の実装予定と課題</a></h2> <p>制作期間が間延びしてしまいモチベーション的にも厳しくなってきたので、これで一区切りして次に移ろうと考えてますが、やはり未消化でモヤモヤする部分もあります。</p> <ul> <li>ワーク一覧表示画面、検索画面の作成</li> <li>(完了!)パンくずリストをつける</li> <li>(完了!)アラートメッセージの表示方法と日本語化</li> <li>ワーク登録時に写真を追加できるようにする</li> <li>ワーク登録時のカテゴリ・テンプレート新規作成をモーダルウィンドウで入力しやすくする</li> <li>日付をカレンダーから選べるようにする</li> </ul> <p>この辺りは時間を見つけてもうちょっと取り組んでいきます。<br /> また公開したことによって細かい部分で自分で気付けなかった問題やバグが出てくると思うので、そういったデバッグ作業から今後の学びにしていきたいと思います。</p> <p>例えば現状でも、ダイアリーやワークの登録に文字数制限をかけておいたりすべきかなーとか、UI的にダイアリーやワークの作り方がわかりづらいなーとか手間がかかるなーとか、色々見えてきますね。</p> <p>今回一度公開することで、友人に見せてみることができたのが良かったです。何人かに見てもらったのですが、皆さんまずは「どう使えばいいかわからない」と口を揃えて言っていただけます。。。<br /> これを実感するだけでも公開した意味があったなーと感じます。</p> <p>このアプリは僕の処女作としてしばらく公開を続けてみて、いろんな方にサンドバッグにしていただきたい所存です。<br /> とはいえぜひお手柔らかにお願いします!(よわい)</p> Massa tag:crieit.net,2005:PublicArticle/15605 2019-12-14T07:00:08+09:00 2019-12-14T07:00:08+09:00 https://crieit.net/posts/f9ebd420c41c1270c5dbfe042703d173 自作クソアプリを無謀にもドヤ顔で晒す… <p>クソアプリ紹介記事を開いていただき本当にありがとうございます。高田と申します。</p> <h1 id="どんなクソアプリなの?"><a href="#%E3%81%A9%E3%82%93%E3%81%AA%E3%82%AF%E3%82%BD%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AA%E3%81%AE%EF%BC%9F">どんなクソアプリなの?</a></h1> <p>ズバリ。「福笑い」でございます。<br /> <a target="_blank" rel="nofollow noopener" href="https://portrait.piggy3.com/ja/index.html">https://portrait.piggy3.com/ja/index.html</a></p> <h1 id="遊び方"><a href="#%E9%81%8A%E3%81%B3%E6%96%B9">遊び方</a></h1> <h2 id="1.サイトにアクセスする"><a href="#%EF%BC%91%EF%BC%8E%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B">1.サイトにアクセスする</a></h2> <p>トップ画面が開いたらやることは1つ。「似顔絵を作成する」を押しましょう。<br /> <a href="https://crieit.now.sh/upload_images/333bc7f5384be08dc752e6a9220f45725de7d14de1b0a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/333bc7f5384be08dc752e6a9220f45725de7d14de1b0a.png?mw=700" alt="image.png" /></a></p> <blockquote> <p>【 クソポイント】<br /> ・ログイン機能の実装で挫折<br /> ・なのに英語対応(英語力はクソ)<br /> ・さらに独自ドメイン取得</p> </blockquote> <h2 id="2.遊びたい絵を選択"><a href="#%EF%BC%92%EF%BC%8E%E9%81%8A%E3%81%B3%E3%81%9F%E3%81%84%E7%B5%B5%E3%82%92%E9%81%B8%E6%8A%9E">2.遊びたい絵を選択</a></h2> <p>これは!と感じた絵を選びましょう。<br /> <a href="https://crieit.now.sh/upload_images/333bc7f5384be08dc752e6a9220f45725de7d2436e6d6.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/333bc7f5384be08dc752e6a9220f45725de7d2436e6d6.png?mw=700" alt="image.png" /></a></p> <blockquote> <p>【クソポイント】<br /> ・素材の追加で挫折<br /> ・このためだけに契約したPhotoshopに月々980円を払い続けている<br /> ・もうすぐお正月だから素材を充実させたい気持ちもアリ</p> </blockquote> <h2 id="3.自由にパーツを配置"><a href="#%EF%BC%93%EF%BC%8E%E8%87%AA%E7%94%B1%E3%81%AB%E3%83%91%E3%83%BC%E3%83%84%E3%82%92%E9%85%8D%E7%BD%AE">3.自由にパーツを配置</a></h2> <p>ここだ!と感じた場所にパーツをドラッグ。「位置を確定して次へ」を押すと次のパーツの配置に進みます。この繰り返し。<br /> <a href="https://crieit.now.sh/upload_images/333bc7f5384be08dc752e6a9220f45725de7d3c589639.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/333bc7f5384be08dc752e6a9220f45725de7d3c589639.png?mw=700" alt="image.png" /></a></p> <blockquote> <p>【クソポイント】<br /> ・操作が直感的ではない<br /> ・「位置を確定して次へ」ボタンいらなかったかも…ドラッグして離したら自動で次のパーツに進むようにすれば良かった<br /> ・でも修正する気ナシ</p> </blockquote> <h2 id="4.タイトルを設定"><a href="#%EF%BC%94%EF%BC%8E%E3%82%BF%E3%82%A4%E3%83%88%E3%83%AB%E3%82%92%E8%A8%AD%E5%AE%9A">4.タイトルを設定</a></h2> <p>これだ!というタイトルを付けてあげましょう。あえて未設定も可。心の準備ができたら「確定」を押します。<br /> <a href="https://crieit.now.sh/upload_images/333bc7f5384be08dc752e6a9220f45725de7d4d910868.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/333bc7f5384be08dc752e6a9220f45725de7d4d910868.png?mw=700" alt="image.png" /></a></p> <blockquote> <p>【クソポイント】<br /> 完成した絵を確認する前にタイトル付けを強要</p> </blockquote> <h2 id="5.完成!"><a href="#%EF%BC%95%EF%BC%8E%E5%AE%8C%E6%88%90%EF%BC%81">5.完成!</a></h2> <p>おめでとうございます!完成した作品のURLをコピーしてSNSにシェアしましょう!<br /> <a href="https://crieit.now.sh/upload_images/333bc7f5384be08dc752e6a9220f45725de7d5b39ba39.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/333bc7f5384be08dc752e6a9220f45725de7d5b39ba39.png?mw=700" alt="image.png" /></a></p> <blockquote> <p>【クソポイント】<br /> ・SNSのシェアボタンではなくURLコピペスタイル</p> </blockquote> <h1 id="最後に作者の自己紹介"><a href="#%E6%9C%80%E5%BE%8C%E3%81%AB%E4%BD%9C%E8%80%85%E3%81%AE%E8%87%AA%E5%B7%B1%E7%B4%B9%E4%BB%8B">最後に作者の自己紹介</a></h1> <p>ここまでお読みいただき本当にありがとうございます。</p> <p>お仕事ではOffice 365などのクラウドサービス導入支援・利活用サービス提供を生業としております。最近は営業寄りの活動が中心になっており仕事上では技術に触れる機会が激減中です。</p> <p>本クソアプリはAWSのサーバーレスに興味があり趣味の範疇で手を出してみた結果です。Web開発で飯を食う目標は持っていませんが、自分でやってみることで本格的なサービスを開発しているエンジニアの皆様の凄さをより理解できるようになりました。なにより、モノづくりの過程であれこれと勉強している時間が本当に楽しかったです(ある程度形になると飽きっぽさが出てしまいます…)。Udemyの動画教材でAWSを契約するところから学んだのですが、ついつい楽しくて徹夜をしてしまったこともあり。仕事の合間に短期集中で1か月くらいの期間で作成しました。</p> <p>最後の最後にクソアプリの構成だけ載せておきます。</p> <div class="table-responsive"><table> <thead> <tr> <th>AWSサービス名</th> <th>役割</th> </tr> </thead> <tbody> <tr> <td>Lambda</td> <td>・サーバー側処理の実行(Pythonを使用)</td> </tr> <tr> <td>S3</td> <td>・htmlやjsなどの静的コンテンツ配置・Lambdaで生成した画像データ保管</td> </tr> <tr> <td>DynamoDB</td> <td>・システム用レコード管理・ユーザー作成の画像データに紐づくプロパティ情報保管</td> </tr> <tr> <td>API Gateway</td> <td>・Lambdaの処理をREST APIとして提供するための設定</td> </tr> <tr> <td>CloudFront</td> <td>・キャッシュ管理(CDN)・S3/API Gatewayのコンテンツにユーザーがアクセスするためのマッピング設定</td> </tr> <tr> <td>Route53</td> <td>・ドメイン管理・S3/API GatewayをCloudFrontにマッピングするための定義</td> </tr> </tbody> </table></div> 高田弘介 tag:crieit.net,2005:PublicArticle/15358 2019-08-28T00:11:53+09:00 2019-08-28T00:19:29+09:00 https://crieit.net/posts/DesignBox デザイナー向けのタスク管理アプリDesignBoxを作りました <p><img src="https://morningcoding.me/wp-content/uploads/2019/08/design-box-1.png" alt="image" /></p> <p>みなさん、こんにちは!タカフミです!</p> <p>実は今月でフリーランスを始めてからちょうど1年になりました!この1年の間で色々な方とお会いして、今まで経験したことないようなお仕事をたくさんさせていただきました。この場を借りて、皆々様に深く御礼申し上げます。</p> <p>普通でしたらこのあたりで「<strong>フリーランスを1年経験してわかったこと!</strong>」や「<strong>フリーランスを始める前にやっておいた方が良かったこと</strong>」などの記事を書きたくなるものですが、そういうものに関してはすでに諸先輩方の有用な記事がたくさんあるので、そちらにお任せすることにします。</p> <p>この1年のフリーランス期間を通して、いろいろなお仕事をしながらもコツコツ作っていたものがあります。何かというと<a target="_blank" rel="nofollow noopener" href="https://www.designbox.tech/ja">DesignBox</a>というフリーランス・デザイナーさん向けの超シンプルなタスク管理アプリです。</p> <p><img src="https://morningcoding.me/wp-content/uploads/2019/08/design-box-image.png" alt="image" /></p> <p>DesignBoxという名前はなんとなく語呂がよくて、僕がよく使っているDropBoxとも名前が似ていたの気に入ってつけました笑</p> <p>今日は僕がフリーランスのデザイナー生活を通して、ある問題に気が付き<a target="_blank" rel="nofollow noopener" href="https://www.designbox.tech/ja">DesignBox</a>を作るにあたった経緯についてお話したい思います!</p> <hr /> <h1 id="すべては1年前から始まりました"><a href="#%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AF1%E5%B9%B4%E5%89%8D%E3%81%8B%E3%82%89%E5%A7%8B%E3%81%BE%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F">すべては1年前から始まりました</a></h1> <p>プロフィール文のところに小さく書かれていますが、フリーランスになる前には教育系ベンチャー企業で3年半ほどエンジニア兼デザイナーとして働いていました。アプリやウェブサイトのデザインから開発、CIデザインなども任せていただけて本当にたくさんの経験をさせていただくことができました。名刺やスタンプカードからロゴ、アプリ開発などに関わりなんでも屋さんとして働いていました。長いようであっという間の3年半の間で、一回りも二回りも大きく成長することができました。</p> <p>僕がデザインしたウェブサイトを見て「この会社で働いてみたいと思ったんです」と言ってもらえたり、何かデザインしたもので周りの人に喜んで貰えることが何よりも嬉しくて、働くことを通してデザインすることの喜びや楽しみを感じられるようになりました。人を笑顔にしたり、喜ばせることが出来る「<strong>デザインの力</strong>」に気がついた瞬間でもありました。</p> <p>そこで色々と経験した後、いつしか「<strong>他にも自分のデザインを必要としている人がいるのではないか</strong>」と考えるようになりました。他にも家庭の事情などもあり、「<strong>世界中の人をデザインで幸せにする</strong>」をミッションに掲げてフリーランスとして働くことに決めました!</p> <p><img src="https://morningcoding.me/wp-content/uploads/2019/08/thai.jpeg" alt="タイ旅行でドナルドと一緒に" /></p> <h1 id="デザインに集中したいのに。。。"><a href="#%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%81%AB%E9%9B%86%E4%B8%AD%E3%81%97%E3%81%9F%E3%81%84%E3%81%AE%E3%81%AB%E3%80%82%E3%80%82%E3%80%82">デザインに集中したいのに。。。</a></h1> <p>フリーランスのデザイナーとしてスタートして、見積もりに請求書や税務など当初は分からないことばかりでした。でも、幸運なことに素敵なクライアントさんに恵まれたおかげで日々楽しく働くことができました。</p> <p>ただ一方でクライアントさんが増えてくるにつれて、依頼されたお仕事を管理することにストレスを感じるようにもなってきました。デザインすることは楽しいのに、案件を管理するのにうんざりしてしまったのです。</p> <p>それまではタスク管理ツールとしてWunderlistを使っていました。デザインもシンプルで簡単にタスクを追加、完了できるのでとっても気に入っていました。今でも、個人的なタスクを管理するために使っているほどです。ただ、自分の仕事の用途にはあまり向いていませんでした。</p> <p>ここで、ちょっと普段のデザイン業務の流れについて説明させていただきます。案件の大小によって若干の違いはありますが、概ね次のような流れになります。</p> <h2 id="(1)クライアントさんから依頼がくる"><a href="#%EF%BC%88%EF%BC%91%EF%BC%89%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%81%95%E3%82%93%E3%81%8B%E3%82%89%E4%BE%9D%E9%A0%BC%E3%81%8C%E3%81%8F%E3%82%8B">(1)クライアントさんから依頼がくる</a></h2> <p>クライアントさんからSlackやメールなどを通じてご依頼を受けたら、Wunderllistに依頼内容が分かるようにタスクを追加します。詳細についてはメモ機能があるので、そこに保存をします。</p> <h2 id="(2)案件用のフォルダを作成"><a href="#%EF%BC%88%EF%BC%92%EF%BC%89%E6%A1%88%E4%BB%B6%E7%94%A8%E3%81%AE%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%E4%BD%9C%E6%88%90">(2)案件用のフォルダを作成</a></h2> <p>成果物を保存するためのフォルダを自分のコンピュータ上に作成します。このフォルダにはクライアントさんから貰った、画像素材やテキスト情報などのデータも一緒に保管をしています。</p> <h2 id="(3)数日後になって、デザイン業務に取り掛かる"><a href="#%EF%BC%88%EF%BC%93%EF%BC%89%E6%95%B0%E6%97%A5%E5%BE%8C%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%80%81%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E6%A5%AD%E5%8B%99%E3%81%AB%E5%8F%96%E3%82%8A%E6%8E%9B%E3%81%8B%E3%82%8B">(3)数日後になって、デザイン業務に取り掛かる</a></h2> <p>いいアイデアを思いつくのに時間がかかったり、納期まで余裕があるので他の案件との兼ね合いも見ながら、数日後になっていいアイデアが思いついてからデザイン業務に取り掛かるようにしています。</p> <p>ただ、ここである問題に気が付きました。</p> <p>それは何かというと、数日前に作成した案件用のフォルダを見つけるのに時間がかかってしまうということです。クライアントさんの名前別にフォルダを作成して保存はしているのですが、正確なフォルダの位置をはっきりと覚えていないので、フォルダの奥深くまで潜ったり、あっちでもこっちでもないとフォルダを行ったり来たりすることがありました。</p> <p>最初のうちは辛抱強く探していたのですが、こんな事が1度や2度ではなく何度もあったためウンザリしていました。。あるクライアントさんに「<strong>去年作って貰った名刺の背景を変えたものを用意して欲しい</strong>」と言われたことがあったのですが、数日前の記憶すら忘れてしまう僕にとっては至難の技でした笑。1時間以上かけてフォルダを探してみたのですが、結局見つからずゼロからデータを作成するなんて事もあったのです。</p> <p>「<strong>デザイン業務に集中したいのに、どうしてフォルダを見つける事にこんな時間が掛かってしまうんだろう。。</strong>」もうこれ以上、こんな無駄で楽しくないことはしたくないと感じるようになりました。</p> <h1 id="解決方法はシンプルなのに、アプリがない。"><a href="#%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95%E3%81%AF%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AA%E3%81%AE%E3%81%AB%E3%80%81%E3%82%A2%E3%83%97%E3%83%AA%E3%81%8C%E3%81%AA%E3%81%84%E3%80%82">解決方法はシンプルなのに、アプリがない。</a></h1> <p>どうしてこんなことが起きるのだろうと小一時間考えたみたら、すぐに原因がわかりました!</p> <p>それは、タスクとそれに関連するフォルダとの紐付けが一切ないからでした。よくあるタスク管理アプリではファイルのアップロードやメンバーとのチャット、ボイスメッセージの機能はあるのに僕が必要としている機能はなかったのです。</p> <p>もしかしたら、僕が知らないだけで不満を解消してくれるものが他にあるかもしれないと思い、出来る限り調べてみたのですが1つも見つかりませんでした。考えてみたら、それもそのはずで一般的なタスク管理アプリは「牛乳を買う」「ゴミ出しをする」<strong>などの日常生活でおこる一般的なタスクを管理する人向け</strong>に作られていることがほとんどで、デザイナーさんのようにタスクがコンピュータ上のデータと関連するような場合については考えられていないからでした。</p> <p>「<strong>もうフォルダ探したくない問題</strong>」に対する解決策はとっても簡単で、あるタスクに対して特定のフォルダを関連づけるシンプルなアプリがあればいいだけでした。「<strong>他にアプリはないし、でもこれ以上フォルダを探したくない。。なら自分でつくるっきゃないよね!</strong>」ということから<strong>フリーランスのデザイナーさん向けのタスク管理アプリ</strong>を作ることに決めました!</p> <p>macOSアプリの開発経験は全く無く、なんとかなるだろう精神で完全に見切り発車したのですが、結果的には絶望的に情報量やノウハウが少なくて何度も挫けそうになりました笑</p> <p>紆余曲折あって出来上がったのが<a target="_blank" rel="nofollow noopener" href="https://www.designbox.tech/ja">DesignBox</a>です!</p> <p><img src="https://morningcoding.me/wp-content/uploads/2019/08/1_BVsISJ9k39cKvgBvsUqJBA.jpeg" alt="DesignBoxのラフスケッチ。ここから形にするまで長い道のりでした。。。" /></p> <hr /> <h1 id="普段の業務で僕はこんな風にDesignBoxを使っています"><a href="#%E6%99%AE%E6%AE%B5%E3%81%AE%E6%A5%AD%E5%8B%99%E3%81%A7%E5%83%95%E3%81%AF%E3%81%93%E3%82%93%E3%81%AA%E9%A2%A8%E3%81%ABDesignBox%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99">普段の業務で僕はこんな風にDesignBoxを使っています</a></h1> <p>リリースしたばかりで全くといってユーザーさんがいないので、僕以上にDesignBoxを使っている人は現在いないと思います笑 普段の業務でもガッツリ使っているので、ここではどんな風に使っているのかをお話したいと思います。</p> <h2 id="1. リストを作成する"><a href="#1.+%E3%83%AA%E3%82%B9%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">1. リストを作成する</a></h2> <p>新しいクライアントさんからお仕事のご依頼を受けたら、クライアントさんの名前を入力してリストを追加します。リストに付ける名前はクライアントさんの名前だけに限らず、プロジェクトの名前でもいいですし、とにかく自分がわかりやすい名前で付けるのがオススメです。</p> <div class="iframe-wrapper"><iframe width="560" height="315" src="https://www.youtube.com/embed/6KVsLl_ArzE" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div> <h2 id="2.タスクを作成する"><a href="#2.%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">2.タスクを作成する</a></h2> <p>リストからタスクを追加したいクライアントさんなどを選択したら、依頼内容が分かるようにタスク名を入力して作成します。大きなメモ帳も用意しているので、そこに依頼内容の詳細情報を入力したり、進捗状況などをメモしたりします。</p> <div class="iframe-wrapper"><iframe width="560" height="315" src="https://www.youtube.com/embed/h_HRyhxjumw" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div> <h2 id="3. 期限を設定する"><a href="#3.+%E6%9C%9F%E9%99%90%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B">3. 期限を設定する</a></h2> <p>納期をしっかりと守れるように期限を設定するようにしています。タスク右上にあるカレンダーアイコンから簡単に設定できます。ちなみに、リスト横にあるバッジの色が期限までの猶予を表しています。青>黄>赤の順に納期が迫っていることを教えてくれます。</p> <div class="iframe-wrapper"><iframe width="560" height="315" src="https://www.youtube.com/embed/H2KK4MkhCYQ" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div> <h2 id="4. フォルダを作成してワークスペースとして設定する"><a href="#4.+%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%A6%E3%83%AF%E3%83%BC%E3%82%AF%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%A8%E3%81%97%E3%81%A6%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B">4. フォルダを作成してワークスペースとして設定する</a></h2> <p>タスク用のフォルダを作成して、そのフォルダをワークスペースとして設定します。これを設定することで、タスクと特定のフォルダを関連付けることができます。あとは、そのフォルダにクライアントさんから貰った画像やテキストデータなどを移動させるようにしています。</p> <div class="iframe-wrapper"><iframe width="560" height="315" src="https://www.youtube.com/embed/zMVeN43xt9M" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div> <h2 id="5. やっと業務にとりかかる"><a href="#5.+%E3%82%84%E3%81%A3%E3%81%A8%E6%A5%AD%E5%8B%99%E3%81%AB%E3%81%A8%E3%82%8A%E3%81%8B%E3%81%8B%E3%82%8B">5. やっと業務にとりかかる</a></h2> <p>やっといいアイデアが思いついたらデザイン業務にとりかかります。リストやタスクの一覧から探してもいいのですが、僕の場合は右上の検索バーにキーワードを入力することが多いです。タスク名はもちろん、メモ帳の内容も検索対象に含まれるのですぐに目的のタスクを見つけることができます。あとは、そのタスクを選択するだけで関連する作業フォルダが自動的に表示されます!!以前の僕ならここですごく時間が掛かっていたので、たったこれだけでも本当に助かります(^^)</p> <div class="iframe-wrapper"><iframe width="560" height="315" src="https://www.youtube.com/embed/_T5P6192fsU" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div> <h2 id="6. タスク完了!"><a href="#6.%E3%80%80%E3%82%BF%E3%82%B9%E3%82%AF%E5%AE%8C%E4%BA%86%EF%BC%81">6. タスク完了!</a></h2> <p>待ちにまった感動の瞬間です。。納品が完了したらチェックボタンをクリックして納品完了です!もっと爽快感のある音に出来ないか現在検討中です。</p> <div class="iframe-wrapper"><iframe width="560" height="315" src="https://www.youtube.com/embed/oqA5yic4ZmQ" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></div> <hr /> <p>DesignBoxは現在も絶賛アップデート中です。あれもこれも出来たらいいからと機能を追加することはなく、あくまで「シンプルで簡単」をモットーにデザイン業務に集中できるタスク管理アプリを目指しています!</p> <p>一人でも多くの人に<a target="_blank" rel="nofollow noopener" href="https://www.designbox.tech/ja">DesignBox</a>を使ってもらって、幸せになってもらえたら嬉しいです。アプリのアップデート情報については、<a target="_blank" rel="nofollow noopener" href="https://www.designbox.tech/ja">DesignBox</a>もしくは僕の<a target="_blank" rel="nofollow noopener" href="https://twitter.com/morningcoding">ツイッター</a>をご覧ください。</p> <p>それではみなさん素敵なデザインライフをお楽しみください!</p> takafumi/Brand Identity Designer tag:crieit.net,2005:PublicArticle/15130 2019-06-19T23:27:01+09:00 2019-06-19T23:30:43+09:00 https://crieit.net/posts/208f56095ca8e483481917ef0354ccf9 【禅Do】利用しているライブラリについて <h2 id="導入したライブラリについて"><a href="#%E5%B0%8E%E5%85%A5%E3%81%97%E3%81%9F%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">導入したライブラリについて</a></h2> <p>とりあえず当時、Carthageの情報が結構出ていて使いやすそうだったので<br /> 基本的にCarthageを利用してインストールする方針でやっていた。<br /> その中で対応していないものはCocoaPodsを利用するか、直接ソースを入れる形にした。</p> <h3 id="Carthageで入れたもの"><a href="#Carthage%E3%81%A7%E5%85%A5%E3%82%8C%E3%81%9F%E3%82%82%E3%81%AE">Carthageで入れたもの</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/malcommac/SwiftDate">SwiftDate</a> <ul> <li>リマインド機能の日付操作の為に導入</li> </ul></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/DeclarativeHub/Bond">Bond</a> <ul> <li>リアクティブプログラミング的なものを使ってみたかった為</li> <li>全体設計の見通しの良さ向上の為など</li> </ul></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/xmartlabs/Eureka">Eureka</a> <ul> <li>設定画面でリスト型テーブルやForm作成を簡単にするための導入</li> </ul></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/delba/Log">Log</a> <ul> <li>開発用途。デバッグのしやすさ向上の為</li> </ul></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/Quick/Quick">Quick</a> <ul> <li>開発用途。テストコードを書く為(なおちゃんとテストコード書いてない模様)</li> </ul></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/Quick/Nimble">Nimble</a> <ul> <li>開発用途。テストコードを書く為(なおちゃんとテストコード書いてない模様)</li> </ul></li> </ul> <h3 id="CocoaPodsで入れたもの"><a href="#CocoaPods%E3%81%A7%E5%85%A5%E3%82%8C%E3%81%9F%E3%82%82%E3%81%AE">CocoaPodsで入れたもの</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/firebase/firebase-ios-sdk">firebase-ios-sdk</a> <ul> <li>(今もかもだけど)当時モバイルのアナリティクスとしてイケてる感じだった為導入</li> <li>ユーザ動向を知るため</li> </ul></li> </ul> <h3 id="直接入れたもの"><a href="#%E7%9B%B4%E6%8E%A5%E5%85%A5%E3%82%8C%E3%81%9F%E3%82%82%E3%81%AE">直接入れたもの</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/thii/FontAwesome.swift">FontAwesome</a> <ul> <li>各種アイコンに利用</li> </ul></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/DylanVann/DatePickerCell">DatePickerCell</a> <ul> <li>設定画面でのCell操作の為に導入</li> </ul></li> </ul> <h2 id="導入ライブラリのアップデート"><a href="#%E5%B0%8E%E5%85%A5%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88">導入ライブラリのアップデート</a></h2> <p>とりあえず当然ビルドが通らなくなってため、各ライブラリの最新版を利用するように<br /> Cartfileを書き換えてアップデートしてみた。<br /> ただそもそも、Carthageの使い方を忘れていたので、思い出すために下記記事などを参考にした。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/s-harada/items/47295d653ef0cf34d540">Carthage について</a><br /> <a target="_blank" rel="nofollow noopener" href="https://www.raywenderlich.com/416-carthage-tutorial-getting-started">Carthage Tutorial: Getting Started</a></p> <p>さらに元々、Carthageディレクトリ以下のBuild/Checkoutsもgit管理下においていたが、<br /> ライブラリアップデートを何回も試してる時に、いちいち削除が面倒になったのと<br /> 下記の記事を読んだので、git管理化から外すことにした。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/mono0926/items/636819c42e96a8c4e12d">CocoaPods・Carthageでインストールした成果物はバージョン管理に含めるべきか?</a></p> <h3 id="アップデート方法"><a href="#%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88%E6%96%B9%E6%B3%95">アップデート方法</a></h3> <p>利用しているライブラリのうちほとんどは、Swift3へのアップデート対応等がされていたが<br /> Logライブラリだけはメンテが止まっていたので、forkして対応することにした。<br /> (代替のものを探したが方が良いが、とりあえずビルドを通すのが第一目標なのでそのまま利用)</p> <p>直接ソースを入れるタイプのものも、Carthage対応されるようになっていたので<br /> Carthageを利用してインストールする方式に変更した。</p> <p>メンテナンスされているライブラリはバージョン指定を外して<br /> 最新版をインストールするようにした。</p> <p>下記はSwiftのバージョンを3にして <code>carthage update --platform iOS</code> が<br /> 問題なく実行できるようになった時点でのCartfile。</p> <pre><code># Use libraries github "malcommac/SwiftDate" github "SwiftBond/Bond" github "xmartlabs/Eureka" github "Quick/Quick" github "Quick/Nimble" github "thii/FontAwesome.swift" github "DylanVann/DatePickerCell" ~> 1.0 # Own repos. github "stlwolf/Log" </code></pre> <h3 id="備考"><a href="#%E5%82%99%E8%80%83">備考</a></h3> <ul> <li>carthageでのインストールが成功するところまで行き、Xcode上でライブラリを<br /> 利用しているコードでErrorになってる箇所を修正することができる状態にはなった。</li> <li>Bondライブラリがアプリに入れた時期から大きな変更が入っているので、利用方法を含めて<br /> 再度使い方を調べないと最新版のコードを利用できそうにないことが判明。(ReactiveKitに組み込まれてる?)<br /> 公式Docと下記あたりを参考に別途キャッチアップする。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.raywenderlich.com/667-bond-tutorial-bindings-in-swift">Bond Tutorial: Bindings in Swift | raywenderlich.com</a><br /> <a target="_blank" rel="nofollow noopener" href="http://grandbig.github.io/blog/2017/07/31/swiftbond-1/">Bond, SwiftBondを使ってみよう! - Takahiro Octopress Blog</a></li> </ul> stlwolf tag:crieit.net,2005:PublicArticle/15085 2019-06-10T13:53:49+09:00 2019-06-19T23:31:31+09:00 https://crieit.net/posts/Swift2-3-Swift5 【禅Do】Swift2.3のアプリをSwift5対応にしたい <h2 id="大枠"><a href="#%E5%A4%A7%E6%9E%A0">大枠</a></h2> <p>数年前にSwiftの勉強のために作ったiOSアプリを、リリース後に全く<br /> アップデート対応していなかったので気がついたらSwiftのバージョンも5になってた。</p> <p>このアプリのWeb版出したりとか諸々やりたいことが出来てきているので<br /> とりあえず最新版のSwiftに対応して一度アプリを<br /> 更新リリースするところまでやることにした(頑張る)</p> <h2 id="前提条件"><a href="#%E5%89%8D%E6%8F%90%E6%9D%A1%E4%BB%B6">前提条件</a></h2> <ul> <li>1,2年ほどiOSアプリ周りを全く触ってなく以下は忘却されている <ul> <li>Swiftの文法、機能について</li> <li>Xcodeでの各種設定について</li> <li>リリースまでに必要なりソース、手順について</li> <li>導入したOSSライブラリについて</li> </ul></li> <li>アプリ自体の機能はかなり控えめなので、コード量自体は多くない</li> <li>当時リアクティブプログラミングの勉強を兼ねて<a target="_blank" rel="nofollow noopener" href="https://github.com/DeclarativeHub/Bond">Bond</a>というライブラリを利用している <ul> <li>RxSwiftとかを入れるほど大した機能はなかったので、機能が控えめなBondを入れた経緯</li> <li>ただ当時から大分実装が変わっているようなので、コレの置き換えが一番手間かかりそう</li> </ul></li> </ul> stlwolf