tag:crieit.net,2005:https://crieit.net/tags/GitHub/feed 「GitHub」の記事 - Crieit Crieitでタグ「GitHub」に投稿された最近の記事 2021-09-30T09:25:05+09:00 https://crieit.net/tags/GitHub/feed tag:crieit.net,2005:PublicArticle/17693 2021-09-30T07:19:35+09:00 2021-09-30T09:25:05+09:00 https://crieit.net/posts/ProductHunt 海外進出を目指して、ProductHuntへ個人開発サービスを投稿するまでにやったこと&やった結果を全面的にシェアする <h1 id="初めて作った個人開発サービスで海外進出しようという無謀な挑戦"><a href="#%E5%88%9D%E3%82%81%E3%81%A6%E4%BD%9C%E3%81%A3%E3%81%9F%E5%80%8B%E4%BA%BA%E9%96%8B%E7%99%BA%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%A7%E6%B5%B7%E5%A4%96%E9%80%B2%E5%87%BA%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%84%E3%81%86%E7%84%A1%E8%AC%80%E3%81%AA%E6%8C%91%E6%88%A6">初めて作った個人開発サービスで海外進出しようという無謀な挑戦</a></h1> <p>以下の記事の通り、9月頭に2goというサービスを作って公開しました。サービスの詳細は以下のURLから見てもらえればと思いますが、いくつかの理由から世界での公開を元から視野に入れていました。<br /> <a href="https://crieit.net/posts/Github-Issues-2go">https://crieit.net/posts/Github-Issues-2go</a></p> <p><a href="https://crieit.now.sh/upload_images/2ccd9128457814ab80f6aa50fae47a4b615488e83f814.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/2ccd9128457814ab80f6aa50fae47a4b615488e83f814.png?mw=700" alt="スクリーンショット 2021-09-26 16.27.05.png" /></a></p> <ol> <li>英語圏のユーザーも含めたほうがサービスの規模感が大きくなる</li> <li>サービス内容が日本だけに留まらない共通の需要があると思った</li> <li>どこかで挑戦しなくてはならないのなら、ここで挑戦しようと思った(無謀)</li> </ol> <p>こういった背景があり、全てのインターフェースは英語で作ってきました。そして、MVPが9月に完成したので、日本でのアナウンスをしました。海外を意識していたので、日本での進め方はあくまでフィードバックを貰えればくらいに思っていましたが、今思えばここからが既に問題なんだなと考えられます。<br /> <a href="https://crieit.now.sh/upload_images/f1969ee50f2c22b287264f3cd5afceb8615488f2e271d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f1969ee50f2c22b287264f3cd5afceb8615488f2e271d.png?mw=700" alt="スクリーンショット 2021-09-07 3.13.35.png" /></a></p> <p>私の経験をまとめましたので、自分への戒めと今後トライされる方の参考になれば。</p> <h1 id="日本でやったことと、その結果"><a href="#%E6%97%A5%E6%9C%AC%E3%81%A7%E3%82%84%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8%E3%81%A8%E3%80%81%E3%81%9D%E3%81%AE%E7%B5%90%E6%9E%9C">日本でやったことと、その結果</a></h1> <p>日本でリリースしたときにやったことを書いていきます。</p> <h2 id="Twitterでの開発進捗の共有による露出"><a href="#Twitter%E3%81%A7%E3%81%AE%E9%96%8B%E7%99%BA%E9%80%B2%E6%8D%97%E3%81%AE%E5%85%B1%E6%9C%89%E3%81%AB%E3%82%88%E3%82%8B%E9%9C%B2%E5%87%BA">Twitterでの開発進捗の共有による露出</a></h2> <p>私のTwitterアカウントはコチラですが、元々は現在働いている会社のAwarenessを上げるために、自分自身の考えやnoteなどの記事を共有するために使っていたものでした。そのため、インフラやクラウドなどのトピックが中心のため、100強のフォロワーもそういった傾向がありました。ただし、インフラやクラウドもこれからはアプリケーションレイヤーがわかっていないと語れないなと思い、個人開発をすることで開発者の気持ちを理解していこうとしている途中でした。<br /> <a target="_blank" rel="nofollow noopener" href="https://twitter.com/jnakajima1982">https://twitter.com/jnakajima1982</a></p> <h3 id="Twitterでの取り組み内容"><a href="#Twitter%E3%81%A7%E3%81%AE%E5%8F%96%E3%82%8A%E7%B5%84%E3%81%BF%E5%86%85%E5%AE%B9">Twitterでの取り組み内容</a></h3> <p>そのため、絶対数としてこういったアプリレイヤーに興味がある人が少ないということもあり、開発進捗を共有したとしても反応がほぼもらえないという状況が続きました。そこで、私は以下を取り組みました。<br /> 1. 「#個人開発」や「#今日の積み上げ」といったハッシュタグを使った投稿を増やした<br /> 2. 上記ハッシュタグにまつわる個人開発者を中心にフォローを増やした<br /> 3. 自分自身で話題を作るより、フォローしている人のTweetに引用RTするようにした<br />  </p> <h3 id="結果と考察"><a href="#%E7%B5%90%E6%9E%9C%E3%81%A8%E8%80%83%E5%AF%9F">結果と考察</a></h3> <p>「#個人開発」に関しては普段よりはインプレッションが増えましたが、反応が劇的に増えた感じはしませんでした。これには2つの原因があると考えています。「どんなサービスかわかりにくかった(プロフィールもわかりにくかった)」のと、「作っているサービスが英語」だったため、ハードルが高かったのだと思っています。それでも少しずつフォロワーは増え、最終的には今回の取り組みで50フォロワーくらい増えたので、コツコツやっていくことが重要で、指数関数的に上がることになるのではないかなと思っていますので、継続が必要です。</p> <p>ただし、私のアカウントが公共分野(デジタル庁など)のインフラ・クラウドと、個人開発が混ざっているので、アカウントを分けるべきか非常に迷っています。フォロワー0から作り直すリスクと、複数アカウントを運用することの大変さに応えられるのかに解がないため、一旦は1つのアカウントとしています。</p> <p><a href="https://crieit.now.sh/upload_images/89697e0fc27d4936e961e842ff9c0e1861548905416a3.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/89697e0fc27d4936e961e842ff9c0e1861548905416a3.png?mw=700" alt="twitter (1).png" /></a></p> <p>また、 「#今日の積み上げ」は、インプレッションが非常に増え、リアクションも同時に増えるのですが、フォロワーが増えません。これは個人開発に留まらないユーザーが大量に流入しているせいだと思いますが、どちらかと言うとお互いに励まし合おうというハッシュタグの位置づけになっていると思われるので、このような結果になっているのだと思います。自分自身の精神安定の観点で、たまに投稿して安心するくらいが丁度いいと思っています。</p> <p>3については、私自身が有益なことをTweetすることができればいいのですが、いざTwitterの画面を開いてなにか書こうと思ったときに、思いつくことには限界があったんですよね。特に、何がウケるのかみたいなことを考えだしたのもいけなかったんだと思います。なので、フォローしている人は私が興味があってフォローしているわけで、その人が話題にしていることに対して引用RTすることにして、自分の意見を言っていこうと考えました。</p> <p>これは意外と効果があります。Twitter上での表示のされ方も、元Tweetが強ければ同時に表示されることもあります。また、何より引用RTした相手からのコメントを頂ける確率も高く、それがインプレッションの増加に繋がる結果が多かったと思います。</p> <h3 id="反省と今後"><a href="#%E5%8F%8D%E7%9C%81%E3%81%A8%E4%BB%8A%E5%BE%8C">反省と今後</a></h3> <p>いずれにしても、Twitterでの認知度向上は一朝一夕ではいきませんので継続した活動が必要ということが身に沁みました。後ほど触れますが、ProductHuntなどは、このようなフォロワーの数が少ない開発者を掘り出して世に出すためのサービスという大前提があるのですが、現実問題として規模の戦いは存在すると実感しましたので、Twitter等のSNSでコミュニティを形成する必要を感じさせられました。</p> <p>特に英語圏での情報発信を考えると、英語用Twitterアカウントを作ったのですが、日本語用Twitterアカウントだけでも苦労しているのに、英語で書いて運用していくというのはとても大変なことです。そのため、英語用Twitterアカウントはほとんど活動ができていません。</p> <h2 id="運営者ギルドへの参加"><a href="#%E9%81%8B%E5%96%B6%E8%80%85%E3%82%AE%E3%83%AB%E3%83%89%E3%81%B8%E3%81%AE%E5%8F%82%E5%8A%A0">運営者ギルドへの参加</a></h2> <p>Twitterを徘徊していると、運営者ギルドという存在を知りました。まさに私が陥っているような状況が冒頭に書かれていました。<br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/organizations/admin-guild">https://qiita.com/organizations/admin-guild</a></p> <blockquote> <p>作ったWebサービス、全然使われない……<br /> どうやってマネタイズしよう<br /> どこまで作り込んでからリリースすればいいんだろう<br /> デザイン難しすぎ<br /> 利用規約はどうすれば?<br /> この先どうやってサービスを伸ばしていけばいいのか……<br /> Slackでの運営形態になっており、中の活動が全く見えなかったので、入れていただくかを非常に悩んだのですが、何事もチャレンジだと思ったので、連絡させて頂き、無事入らせて頂きました。</p> </blockquote> <p><a href="https://crieit.now.sh/upload_images/9a13068ab299538fc8dcc14cfa4026f4615489143c8f5.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9a13068ab299538fc8dcc14cfa4026f4615489143c8f5.png?mw=700" alt="image (28).png" /></a></p> <h3 id="結果と考察"><a href="#%E7%B5%90%E6%9E%9C%E3%81%A8%E8%80%83%E5%AF%9F">結果と考察</a></h3> <p>結果から言うと、個人開発をしている人は入ったほうが良いです。下手な質問をしたら、ぶっ飛ばされるのではないかとビクビクしていましたが、そんな事は全くありませんでした。唯一あるとするならば、自分自身で発信したことには多くの意見がもらえてモチベーションに繋がりますが、自分自身で発信しない方はここで何をしていいかわからなくなってしまうと思います。</p> <p>私は、実運用ではどのようにしているかなどは、こういった限定されたユーザーだけが参加するコミュニティだからこそ聞ける生の声が本当に貴重だと思いました。また、今回のProductHuntのチャレンジなどを好意的に捉えてくださるだけでなく、普段の自分自身の開発の進捗にコメントいただける方もいらっしゃり、個人開発の課題となりがちなモチベーション維持にもなりました。</p> <p>だからこそ、私自身がコミュニティの一部として、他の方が同様な状況にいる場合には、積極的に自分の経験を還元する必要があると思い、いろいろな方のチャンネルに入るようにしました。</p> <h2 id="技術コミュニティメディアへのサービス開発記事の投稿"><a href="#%E6%8A%80%E8%A1%93%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3%E3%83%A1%E3%83%87%E3%82%A3%E3%82%A2%E3%81%B8%E3%81%AE%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E9%96%8B%E7%99%BA%E8%A8%98%E4%BA%8B%E3%81%AE%E6%8A%95%E7%A8%BF">技術コミュニティメディアへのサービス開発記事の投稿</a></h2> <p>Twitterや運営者ギルド以外では、とにかくサービスを知ってもらえるチャネルを増やそうとしていました。そこで以下の技術コミュニティメディアに記事を投稿してみました。<br /> - Zenn:https://zenn.dev/nice2have/articles/aa15eccd13a23c<br /> - Qiita:https://qiita.com/nice2have/items/28449ae4ef45fef2c671<br /> - Crieit: https://crieit.net/posts/Github-Issues-2go<br /> - ツクログ:https://creators.eightbit.jp/service/item4309.html</p> <p>以下にそれぞれのメディアの現時点での結果をまとめます(Google Analytics調べ)。Zennは正直きちんと取れているのかわかりません。ツクログは投稿して間もないのと、どこからデータが取れるのかわからずなので、外しています。<br /> <div class="table-responsive"><table> <thead> <tr> <th>メディア</th> <th>記事閲覧数</th> <th>サービス流入数</th> <th>LGTM</th> </tr> </thead> <tbody> <tr> <td>Zenn</td> <td>34</td> <td>10</td> <td>4</td> </tr> <tr> <td>Qiita</td> <td>1468</td> <td>261</td> <td>7</td> </tr> <tr> <td>Crieit</td> <td>1198</td> <td>66</td> <td>1</td> </tr> </tbody> </table></div></p> <h3 id="結果と考察"><a href="#%E7%B5%90%E6%9E%9C%E3%81%A8%E8%80%83%E5%AF%9F">結果と考察</a></h3> <p>いずれにせよ、どのメディアにも投稿することは確実に認知度とサービス流入に繋がっていると言えますので、サービスローンチのタイミングだけでなく、書く内容がある限り、投稿し続けると良いと思います、、、が、やっぱり書くのって大変なんですよね。さらに、メディアによってトレンドがあるから、書く内容を変えたほうがよいというのを見たのですが、全く同じ記事を上げているのが現状です。まずは続けることが大事なので、しばらくはそれを継続しようと思っています。</p> <h3 id="ダイレクトアプローチ"><a href="#%E3%83%80%E3%82%A4%E3%83%AC%E3%82%AF%E3%83%88%E3%82%A2%E3%83%97%E3%83%AD%E3%83%BC%E3%83%81">ダイレクトアプローチ</a></h3> <p><a href="https://crieit.now.sh/upload_images/d3971adefd981bac418520bb891203cb61548925cc9ef.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/d3971adefd981bac418520bb891203cb61548925cc9ef.png?mw=700" alt="lp_issues.png" /></a><br /> 追加でした作業についても記録しておきます。2goというサービスの特性上、Github Issueを利用している/利用見込みのユーザーがターゲットになります。そのため、メディア上にGithub Issueについて記事を書いている人へ直接連絡して実際に利用していただくことで、フィードバックを受けて改善に生かしていこうと思いました。</p> <p>Google検索からたどり着いた5件にコメントをしてコミュニケーションを図ってみたのですが、どこからも未だ返事がない状況です。Twitter上でキーワード検索してアプローチしたこともありましたが、ちょっと利用用途が異なったようで、試してもらうまでに至りませんでした。</p> <p>以上のアプローチで、面白いですとか、良いサービスですねなど言われるものの、今思えば、やはり利用されるだけの魅力やユースケースが見出してもらえなかったのだと思いました。</p> <h2 id="まとめ:日本での取り組み"><a href="#%E3%81%BE%E3%81%A8%E3%82%81%EF%BC%9A%E6%97%A5%E6%9C%AC%E3%81%A7%E3%81%AE%E5%8F%96%E3%82%8A%E7%B5%84%E3%81%BF">まとめ:日本での取り組み</a></h2> <p>海外進出を前提に置いていたため、以下の2点の理由で、Githubアカウントでログインしてまで試してくれた人は、2桁にすら行きませんでした。<br /> - 日本での取り組みを正直本気で取り組んだとは言えない<br /> - 英語のインターフェースのため、伝わりづらかった</p> <p>そこで、Githubアカウントでログインすることのハードルが高いと思い、ログイン不要で誰にでも触れるサンプルを追加開発して提供してみたのですが、こちらも時たま試す人が現れるくらいで、試すことすらしてもらえないのかと打ちひしがれましたorz</p> <p>ほとんどのユーザーアクティビティ(サービス登録/ログイン/公開設定)が発生すると、Slackに通知が飛んでくるようにしていたのですが、たまにしか飛んでこず、こちらも現時点では自分のログイン動作だけが通知される閑古鳥が鳴いている状態です。</p> <h1 id="海外編:Product Hunt"><a href="#%E6%B5%B7%E5%A4%96%E7%B7%A8%EF%BC%9AProduct+Hunt">海外編:Product Hunt</a></h1> <p>つらつらと書いてきましたが、これからが本編です。当時、海外進出しか見えていなかった私は、海外での認知度を上げるための方策を調査していました。調べていくと以下の2つのサービスがマッチすると思いました。</p> <ol> <li>Product Hunt : https://www.producthunt.com/</li> <li>Indie Hackers : https://www.indiehackers.com/</li> </ol> <p>これらのサービスでは、個人開発者やスタートアップが自分の作ったプロダクトを投稿して、認知度を上げることが毎日のように行われています。ただ、Indie Hackersの方は招待制でしか入れず、Redditなどを徘徊してもInvitation Codeを求める人はいるものの、なかなか何もない状態でそれがもらえる人は見られなかったので、一旦Product Huntにフォーカスすることに決めました。</p> <h2 id="Product Huntへの投稿を決心"><a href="#Product+Hunt%E3%81%B8%E3%81%AE%E6%8A%95%E7%A8%BF%E3%82%92%E6%B1%BA%E5%BF%83">Product Huntへの投稿を決心</a></h2> <p>まずは経験者のまとめを読み漁りました。具体的には以下の記事を読みました。この中でも、本当に有効だったこと、今では有効ではないこと、役に立たないことがあるので、それを自分なりに整理していきました。とにかくやれることはやりきらないと、次につながらないと思い計画していきました。</p> <p><a href="https://crieit.net/posts/7">https://crieit.net/posts/7</a><br /> <a target="_blank" rel="nofollow noopener" href="https://jp.taishikato.com/posts/i-want-to-prove-that-japanese-can-compete-in-english-speaking-countries">https://jp.taishikato.com/posts/i-want-to-prove-that-japanese-can-compete-in-english-speaking-countries</a><br /> <a target="_blank" rel="nofollow noopener" href="https://blog.notsobad.jp/entry/2019/12/23/232807">https://blog.notsobad.jp/entry/2019/12/23/232807</a><br /> <a target="_blank" rel="nofollow noopener" href="https://blog.notsobad.jp/entry/bungo-search-product-hunt">https://blog.notsobad.jp/entry/bungo-search-product-hunt</a></p> <h3 id="Product Hunt攻略計画"><a href="#Product+Hunt%E6%94%BB%E7%95%A5%E8%A8%88%E7%94%BB">Product Hunt攻略計画</a></h3> <p>先述の記事を読んで私が立てた当日の計画は以下のとおりです。<br /> 1. 太平洋時間 0:01(日本時間 16:01)からその日のランキングレース開始。<br /> 2. 1時間くらい様子をみて、Google や Facebook からのプロダクトなどのビッグサービスが投稿されていないのを確認してから投稿。<br /> 3. Twitter で Product Hunt への投稿を英語でアナウンス。 @ProductHuntをメンションする。<br /> 4. Product Hunt 上の紹介ページ URL が取得できるので、それを基に Product Hunt Card 作成(Medium の場合は URL を貼り付けるだけで OK)し、Medium 投稿。<br /> 5. ProductHunt の URL を使って Landing Page に反映し、導線を作る。<br /> 6. Medium の記事を、Product Hunt 上のプロダクト紹介ページに関連記事として貼り付け。<br /> 7. Medium の記事を、Hacker News に投稿(Show HN:をタイトルにつけて投稿)<br /> 8. Reddit に投稿<br /> 9. コメントが入ったらそれに返信していく。</p> <p>また、投稿当日までの計画は以下のとおりです。<br /> 1. 投稿用のランディングページを作る<br /> 2. 投稿用の動画(英語)を作る<br /> 3. Medium/HackersNews/Redditの記事を準備する<br /> 4. Product Huntのupcoming Productに登録する<br /> 5. Product Hunt投稿内容の準備をする<br /> 6. 最低限必要な機能の整備(退会機能・規約)<br /> 7. 著名なProduct HuntersにReview Requestをして、認知してもらう</p> <p>簡単に言ってしまうと、以下の2点に集約されます。すごくシンプルです。<br /> - ProductHuntの投稿を魅力的なものにする<br /> - ProductHuntのupvoteを得るための導線をできるだけ多く作る</p> <h4 id="投稿当日までの準備と結果"><a href="#%E6%8A%95%E7%A8%BF%E5%BD%93%E6%97%A5%E3%81%BE%E3%81%A7%E3%81%AE%E6%BA%96%E5%82%99%E3%81%A8%E7%B5%90%E6%9E%9C">投稿当日までの準備と結果</a></h4> <p>順番は前後しますが、投稿当日までの計画について共有します。</p> <h5 id="ランディングページ"><a href="#%E3%83%A9%E3%83%B3%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E3%83%9A%E3%83%BC%E3%82%B8">ランディングページ</a></h5> <p>ランディングページはたいして手間もかからなかったのですが、当日投稿しなければ、貼るURLがわからないため、ボタンだけ作ってVueの機能で表示しない状態で準備しておきました。実際のトップページの見えるところにボタンを置いた程度でした。はっきり言ってダサいですね。<br /> <a href="https://crieit.now.sh/upload_images/a66b3274000d3cb3eea1c45bdc3c27aa6154893919d2d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a66b3274000d3cb3eea1c45bdc3c27aa6154893919d2d.png?mw=700" alt="image (27).png" /></a></p> <p>改めて投稿後にいろいろ研究してみましたが、以下のような形で誘導するのはとても有効だと感じました。後にわかりますが、こんなレベルの問題ではないことがわかります。<br /> <a href="https://crieit.now.sh/upload_images/55b3b19e99f9362c582a1295c888addd61548947627a7.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/55b3b19e99f9362c582a1295c888addd61548947627a7.png?mw=700" alt="image (26).png" /></a></p> <hr /> <h5 id="投稿用の動画"><a href="#%E6%8A%95%E7%A8%BF%E7%94%A8%E3%81%AE%E5%8B%95%E7%94%BB">投稿用の動画</a></h5> <p>ProductHuntの投稿にYoutube動画を付けると、Product紹介の一番最初に表示され、自動的に再生される仕組みになっています。そのため、インパクトがあると思ったのと、これをやらねばやらなかったときの効果が今後わからなくなると思い、動画制作に手を付け始めました。しかしながら、以下の問題にぶつかります。</p> <ul> <li>動画編集に知見がない</li> <li>動画ナレーションは英語の必要性がある</li> </ul> <p>動画編集に知見がないので、いろいろ調べたところ、ダビンチリゾルブという動画編集ソフトが良さそうで試してみたところ、操作が全くわからず、説明記事をウロウロしていたのですが、わからなすぎて挫折しそうになっていました。ところが、原点に戻って動画のことは動画で、と思ってYoutubeの解説動画を探しました。</p> <p>そして以下の動画を10分で見たら、一気に進み、こんな私でも動画編集ができるようになりました。基本操作と、動画編集に最低限必要そうな動画を紹介しておきます。</p> <p><a target="_blank" rel="nofollow noopener" href="https://youtu.be/duxtN8ixpLo">https://youtu.be/duxtN8ixpLo</a><br /> <a target="_blank" rel="nofollow noopener" href="https://www.youtube.com/watch?v=0J7lqAnP_64&t=194s">https://www.youtube.com/watch?v=0J7lqAnP_64&t=194s</a></p> <p>ただ、計画もなしに動画編集するとうまく行かなったので、Figmaで整理してみました。ただし、これで一旦動画を作ったのですが、文字だらけでなかなか理解しにくいものになってしまいました。<br /> <a href="https://crieit.now.sh/upload_images/7ef5b8ff4b8585d89aea6aae136e0560615488982a3bd.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7ef5b8ff4b8585d89aea6aae136e0560615488982a3bd.png?mw=700" alt="image (25).png" /></a></p> <p>ここあら紆余曲折があって、ようやく完成した最終版はコチラです。<br /> <a target="_blank" rel="nofollow noopener" href="https://youtu.be/YvcyiAccCBo">https://youtu.be/YvcyiAccCBo</a></p> <p>先にナレーションの英文を考えて、Google Text to Speechに喋らせて、それに合わせて映像を作成するという手順を踏みました。しかしながら、結果的に動画以前の問題であることも発覚します。<br /> <a href="https://crieit.now.sh/upload_images/1854cd2cbe6840ac117d5ae95762703d615488842c9e4.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/1854cd2cbe6840ac117d5ae95762703d615488842c9e4.png?mw=700" alt="image (24).png" /></a></p> <h5 id="Medium/HackersNews/Redditの記事を準備する"><a href="#Medium%2FHackersNews%2FReddit%E3%81%AE%E8%A8%98%E4%BA%8B%E3%82%92%E6%BA%96%E5%82%99%E3%81%99%E3%82%8B">Medium/HackersNews/Redditの記事を準備する</a></h5> <p>ここから導線となる記事の準備についてお話しいたします。</p> <p><strong>Medium</strong><br /> <a target="_blank" rel="nofollow noopener" href="https://medium.com/@nice2have/2go-road-to-my-first-webservice-5b38666a7dd8">https://medium.com/@nice2have/2go-road-to-my-first-webservice-5b38666a7dd8</a><br /> <a href="https://crieit.now.sh/upload_images/c76742bc401d73b46336fe6b13cfa4c161548878085d9.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c76742bc401d73b46336fe6b13cfa4c161548878085d9.png?mw=700" alt="image (23).png" /></a><br /> - 特に制限もないので、自由に書きましたが、タグについては迷いましたね。サービスの特性上、割り当てるべき適切なタグかどれか未だにわかっていません。<br /> - しかしながら現時点でもView数は2です。そのため、こちらもMediumのフォロワーを増やしておくか、単なるプロダクト説明の置き場と割り切るかのどちらかが今後の戦略となりそうです。<br /> <a href="https://crieit.now.sh/upload_images/36006e156388e53b6d55afc31fa83f0a6154883e1dcc6.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/36006e156388e53b6d55afc31fa83f0a6154883e1dcc6.png?mw=700" alt="image (22).png" /></a></p> <hr /> <p><strong>HackersNews</strong><br /> <a href="https://crieit.now.sh/upload_images/1be5ea94b6dfb0a28f3b04305009befe6154880ca815b.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/1be5ea94b6dfb0a28f3b04305009befe6154880ca815b.png?mw=700" alt="image (21).png" /></a><br /> - Show HNを付けるというルールを守って投稿<br /> - 付けるURLはMediumのページか、サービス自体のURLかは迷いましたが、サービスにProductHuntへの誘導を用意していたので、後者を選択しました。<br /> - しかし残念ながら、GoogleAnalytics上は、HackersNewsからの流入は0でしたので、もう少し工夫が必要か、流れるのが早すぎて流入が期待できないかもしれません。</p> <hr /> <p><strong>Reddit</strong><br /> <a target="_blank" rel="nofollow noopener" href="https://www.reddit.com/r/ProductHunters/comments/px15lq/i_created_my_first_web_site_2go_2go_can_generate/">https://www.reddit.com/r/ProductHunters/comments/px15lq/i_created_my_first_web_site_2go_2go_can_generate/</a><br /> <a href="https://crieit.now.sh/upload_images/210f64e0ce8b159071e2738e1bd35776615487f13bade.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/210f64e0ce8b159071e2738e1bd35776615487f13bade.png?mw=700" alt="image (20).png" /></a><br /> - Karmaというポイントがないと記事が投稿できないという話を見たので、事前に記事投稿やコメントで参加してみました。特にGithub Issueの必要性などを投稿したりして、反応を窺うなどもトライしましたが、慣れていないせいもあって反応も薄かったです。<br /> - どのSubredditに投稿するかは検討しました。ProductHunt / Github / webdev / SaaS / startups / indieHackers / indieDevelopers等、色々調査しました。ProductHuntのSubredditが最も適切かと思いましたが、あまり活況がないのが心配でした。ただ、それ以外のところでは厳しい反応も予想されたので、シンプルにProductHuntのSubredditを投稿先と決定しました。<br /> - その他細かいことですが、RedditのProfileなどもきちんと整備しました。<br /> - しかしながら、RedditのSpamFilterに引っかかって削除されてしまったみたいです…</p> <hr /> <h5 id="Product Huntのupcoming Product"><a href="#Product+Hunt%E3%81%AEupcoming+Product">Product Huntのupcoming Product</a></h5> <p>あまり認知されていませんが、以下のようにサービスローンチ前にユーザーとコミュニケーションができるPre-Postサイトを作ることが出来ます。ただここからSubsriberは1人も登録されませんでした。おそらくProductHuntの著名なユーザーが、次期サービスを立ち上げる前にユーザーとコミュニケーションするためのプラットフォームだと感じましたので、私には当分必要ないと思いました。<br /> <a target="_blank" rel="nofollow noopener" href="https://www.producthunt.com/upcoming/2go">https://www.producthunt.com/upcoming/2go</a></p> <hr /> <h6 id="Product Hunt投稿内容の準備をする"><a href="#Product+Hunt%E6%8A%95%E7%A8%BF%E5%86%85%E5%AE%B9%E3%81%AE%E6%BA%96%E5%82%99%E3%82%92%E3%81%99%E3%82%8B">Product Hunt投稿内容の準備をする</a></h6> <p><a href="https://crieit.now.sh/upload_images/76ebfc15ab748145d665f1c4a4986b7e615487ca134e3.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/76ebfc15ab748145d665f1c4a4986b7e615487ca134e3.png?mw=700" alt="image (19).png" /></a><br /> Product Huntの投稿ページは入力したものが記録されるようになっているので、Submitボタンの直前までを入力しておいて事前に準備しておくことが可能です。今回の画像は、動画作成時に作っていたFigmaデータを画像データに変換して利用することとしました。特に動画は視覚的に、画像は落ち着いて読むように文字を入れるようにしました。</p> <p><a href="https://crieit.now.sh/upload_images/7c82e16b607550ccb13639965cdedb976154879728e68.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/7c82e16b607550ccb13639965cdedb976154879728e68.png?mw=700" alt="スクリーンショット 2021-09-26 16.20.56.png" /></a><br /> <a href="https://crieit.now.sh/upload_images/51240628b6d64bac3d7d4b51f2ba477e615487a283dfe.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/51240628b6d64bac3d7d4b51f2ba477e615487a283dfe.png?mw=700" alt="スクリーンショット 2021-09-26 16.03.43.png" /></a><br /> <a href="https://crieit.now.sh/upload_images/4cb7adb70db8bd9afc4ec8e3c63bc1ed615487a8a64c5.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4cb7adb70db8bd9afc4ec8e3c63bc1ed615487a8a64c5.png?mw=700" alt="スクリーンショット 2021-09-26 16.04.35.png" /></a><br /> <a href="https://crieit.now.sh/upload_images/4937eca85eebe0d18e1ce6a5b2637f91615487ae2d3bc.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4937eca85eebe0d18e1ce6a5b2637f91615487ae2d3bc.png?mw=700" alt="スクリーンショット 2021-09-26 16.04.11.png" /></a><br /> ここで用意しにくいのは、投稿ロゴとして利用できるGIFファイルだと思います。動画や画像イメージは比較的簡単に用意できますが、GIFファイルはどんなものにするところから微妙に悩ましい位置づけです。私は今回動画ファイルを作って出力した後、MovファイルからGIFに変換して利用しました。<br /> <a href="https://crieit.now.sh/upload_images/07acf05940475d852b84873e9766827461548726e8258.gif" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/07acf05940475d852b84873e9766827461548726e8258.gif?mw=700" alt="titleGIF.gif" /></a><br /> 目立たせるために、アニメーションというよりは、全体の色が大きく変わることで目につくように意識して作りました。</p> <hr /> <h5 id="著名なProduct HuntersにReview Request"><a href="#%E8%91%97%E5%90%8D%E3%81%AAProduct+Hunters%E3%81%ABReview+Request">著名なProduct HuntersにReview Request</a></h5> <p>先程の記事の中には著名なProductHunterにお願いして、彼らに周知してProductHuntで彼らをフォローしているユーザーに通知されるようにしたほうが良いという記述がありました。一方で、その機能はなくなったのでやる必要ないよというのも見受けられました。ということは、やってみるしかありません。まずは以下のサイトからTop Huntersを探しました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://yvoschaap.com/producthunt/">https://yvoschaap.com/producthunt/</a></p> <p>それぞれがどういった方なのかまで抑えられなかったので、上から順番にTwitterを見て、直接DMを送れる人にていねいな英文を書いて送りました。…が、結果的に1人からも返信は返ってきませんでした。おそらく、こういった依頼が定常的に来るので、そもそもDMを開いていない可能性が高いです。既読にすらなりませんでしたので。</p> <p>では、このアプローチは不要なんでしょうか。その答えは、私のProductHuntの通知ページにありました。以下のようにフォローしているHunterがUpvoteすると、その通知がフォロワーには届きます。つまり、TopHuntersにUpvoteされると知られる確率が高くなるという理解をしています。ただ、彼らからUpvoteされるためにどうしたらよいかは未だにわかりません。Twitterでフォローされるわけもないので、ProductHuntでDiscussionに参加するなどして自分自身の露出が必要なのかもしれません。</p> <p><a href="https://crieit.now.sh/upload_images/93dd81709da263bd35dc9bdcde62bc5b615486ed95e33.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/93dd81709da263bd35dc9bdcde62bc5b615486ed95e33.png?mw=700" alt="tophunters.png" /></a></p> <p>その他に可能性があるとすると、以下は検討してみてもよいかと思いました。開発者のクローズドなコミュニティがあり、そこで繋がりが作れるかもしれません。なぜなら、$2,000/yearの有料会員制だからです。だからこそ、人数が爆発的に多いわけでもないですし、コミュニケーションが活発なのかもしれません。ただし、個人開発者がここに投資するのは、英語とお金が必要なので、ハードルが高いとは思います。</p> <p><a target="_blank" rel="nofollow noopener" href="https://megamaker.co/club/">https://megamaker.co/club/</a></p> <hr /> <h4 id="投稿当日の結果"><a href="#%E6%8A%95%E7%A8%BF%E5%BD%93%E6%97%A5%E3%81%AE%E7%B5%90%E6%9E%9C">投稿当日の結果</a></h4> <p>改めて、投稿当日の計画を振り返る前に、投稿曜日を検討していました。最初は準備ができた翌日に投稿しようかと思っていましたが、ちょうど週末でした。週末がどう影響するかがわからず、Active User数が減少するのではないかと推測して候補から外しました。また、週明けの月曜日も同様の理由で除外し、現地時間火曜日0時に投稿することとしました。</p> <ol> <li>太平洋時間 0:01(日本時間 16:01)からその日のランキングレース開始。</li> <li>1時間くらい様子をみて、Google や Facebook からのプロダクトなどのビッグサービスが投稿されていないのを確認してから投稿。</li> <li>Twitter で Product Hunt への投稿を英語でアナウンス。 @ProductHuntをメンションする。</li> <li>Product Hunt 上の紹介ページ URL が取得できるので、それを基に Product Hunt Card 作成(Medium の場合は URL を貼り付けるだけで OK)し、Medium 投稿。</li> <li>ProductHunt の URL を使って Landing Page に反映し、導線を作る。</li> <li>Medium の記事を、Product Hunt 上のプロダクト紹介ページに関連記事として貼り付け。</li> <li>Medium の記事を、Hacker News に投稿(Show HN:をタイトルにつけて投稿)</li> <li>Reddit に投稿</li> <li>コメントが入ったらそれに返信していく</li> </ol> <p>まず、予約投稿機能があるので、試してみましたが、正常に動作しませんでした。もしかすると私の現地時間の入力時間が間違っているかもしれませんが、念の為日本時間16時にはPCの前にいたほうがいいかもしれません。</p> <hr /> <h5 id="投稿後の動きの感想"><a href="#%E6%8A%95%E7%A8%BF%E5%BE%8C%E3%81%AE%E5%8B%95%E3%81%8D%E3%81%AE%E6%84%9F%E6%83%B3">投稿後の動きの感想</a></h5> <ul> <li>現地時間0時のタイミングでは、少しでもUpvoteを稼いだProductが上位に行きやすいです。そのため、初速を確保する知り合いやコミュニティへの事前声掛けは重要だと思いました(ただし、Upvoteを直接的に促してはいけません)</li> <li>必要初速Upvoteは10くらいだと思います。トップページに表示できるProductにも限りがあり、そこに載れなければ閲覧数も獲得できないです。</li> <li>必ずUpvote順にソートされるわけではありませんでした。コメントなどの他の要素も見ていると思われます。コメントはUpvote同様に初速に影響する可能性があるので、できれば事前に確保しておきたいところです。ただし、日本人のコミュニティにおいて、Upvoteはしてくれても、コメントまでしてくれる人を確保するのは至難の業だと思います。</li> <li>コメントがないと盛り上がりに欠けるのか、追加のコメントが得られにくいと思います。私はただの1つもコメントを最後まで得られませんでした。他のProductは、共同開発者などがコメントし合うことで盛り上がりを演出している印象を受けました。</li> <li>コメントが来たら返信しながら、投稿スレッドを盛り上げる準備をして待っていましたが、杞憂に終わってしまいました。</li> </ul> <hr /> <h5 id="結果と感想"><a href="#%E7%B5%90%E6%9E%9C%E3%81%A8%E6%84%9F%E6%83%B3">結果と感想</a></h5> <p><a href="https://crieit.now.sh/upload_images/74934dd4ad26684204b3a8d132c39ae6615486b229512.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/74934dd4ad26684204b3a8d132c39ae6615486b229512.png?mw=700" alt="スクリーンショット 2021-09-29 17.18.24.png" /></a></p> <p>最終的な結果はUpvote x15となりました。結果をまとめていきます。<br /> - Upvote x15(しかし、運営者ギルドから半数くらいはUpvoteしてくれた方がいたと思います)<br /> - 流入トラフィック x5(ほとんど流入が見込めませんでした)<br /> - 新規登録ユーザー数 x0(残念ながら一人も使ってくれませんでした)<br /> - サンプルを試したユーザー数 x2(流入トラフィックの割に確率が高かった)</p> <p>重要なのは…</p> <ul> <li>とにかく初速Upvoteを増やして、トップページに載らないと何も始まらない</li> <li>流入さえしてくれれば試してもらえる率はそこそこある</li> <li>投稿内容(文章・動画・画像)の良し悪しが影響するのかはわからなかった</li> <li>導線はほとんど影響しなかった(影響するように仕立て上げるには継続的な活動が必要)</li> <li>TopHuntersに認知される方法があれば、Upvoteを得るための近道になるかも。</li> </ul> <h2 id="ProductHuntへの挑戦は惨敗"><a href="#ProductHunt%E3%81%B8%E3%81%AE%E6%8C%91%E6%88%A6%E3%81%AF%E6%83%A8%E6%95%97">ProductHuntへの挑戦は惨敗</a></h2> <p>多くの方にご協力を頂きましたが、残念ながら私の個人開発サービスのProductHunt挑戦は惨敗に終わったと言って良いでしょう。ただし、考えうる限りのことはやり切ったので、次に繋がる敗戦だと考えています。</p> <p>海外進出のサービスの難しさを以下の点で痛感しています。<br /> - 海外でウケるサービスとかユースケースが、真の意味で理解できない可能性<br /> - 海外で求められるデザインやマーケティング・言い回しが適切かどうかわからない<br /> - 海外でのコミュニティ参加は更に負荷がかかるため、労力に見合うかが不安<br /> - 番外編)ユーザーに提供する規約の英文精査が難しい</p> <p>英語で開発すれば、非常に多くのユーザーに対する市場へのアプローチが可能ですが、このような深刻な悩みがついてまわることになります。いくつかの記事にもありましたが、英語圏の感覚を持つ人にヘルプしてもらわないと難しいかもしれません。</p> <h1 id="最後に…"><a href="#%E6%9C%80%E5%BE%8C%E3%81%AB%E2%80%A6">最後に…</a></h1> <p>想像してよりもずっとずっと個人開発は難しいです。プログラミングの世界だけでなく、デザイン・マーケティングまで1人で取り組まなければならず、かつアイデアの捻出とその中からの選定も全部自分の責任です。だからこそ楽しみがあるわけですが、大変さも同時に存在しています。</p> <p>企業よりも個人開発が気楽な分、企業よりもマーケティングや作業分担にお金がかけられません。特に個人開発はサービスが知られることがなければ、提供するユースケースが知られていないから失敗しているのか、知られていても失敗しているのか判断が難しくなります。</p> <p>そこでやはり重要となってくるのが、コミュニティだと思います。自分の作るプロダクトに意見を言ってくれる、試してみてくれる、拡散して届けてくれる人たちとともに歩まねば成功はあり得ません。そしてそれは継続的な努力によってのみ得られるものだと感じました。</p> <p>私にとって今回の開発は本当に作りたいものに対する準備の意味合いも兼ねていますが、コミュニティとともにモチベーションを維持し、成功の模索をしていきたいと思います。</p> <p>ということで、ぜひ気になる方はTwitterのフォローと、2goの利用をしてみて、フィードバックをいただければと思いますので、最後にリンクを貼って終わりにさせていただきます。</p> <p><a target="_blank" rel="nofollow noopener" href="https://twitter.com/jnakajima1982">https://twitter.com/jnakajima1982</a><br /> <a target="_blank" rel="nofollow noopener" href="https://2go.plus/">https://2go.plus/</a></p> <p>ありがとうございました!</p> jnakajima1982 tag:crieit.net,2005:PublicArticle/17641 2021-09-10T06:00:03+09:00 2021-09-10T06:00:03+09:00 https://crieit.net/posts/Github-Issues-2go Github Issuesをキレイに外部公開するサービス「2go」作ってみた <h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1> <p>今回初めて個人開発で作ったサービスを公開します。今までも何回かトライしていたのですが、なかなか公開までに至らないうちに、なにか問題にぶちあたったり、時間がかかりすぎて情熱が冷めてしまったりしていたので、今回はまずはスモールスタートで公開して改善していくことを心がけました。大体今回の公開まで、開発を始めてから1ヶ月程度になります。毎日朝4時半に起きて、子どもたちが起きる7時過ぎまでを開発時間として取り組んできました。<br /> <img src="https://storage.googleapis.com/zenn-user-upload/1463631d38d985beee6c9289.png" alt="" /></p> <h1 id="どんな人向け?"><a href="#%E3%81%A9%E3%82%93%E3%81%AA%E4%BA%BA%E5%90%91%E3%81%91%EF%BC%9F">どんな人向け?</a></h1> <p>自分で作っているサービスの開発ロードマップをユーザーに公開するために、都度ブログを書いたりするのも大変ですよね。もし、自分のサービスのソースコードをGithubで管理していたとして、Github Issuesを見せるとしてもGithubに馴染みのない人にとっては読みにくいですし、外に出すサービスであればあるほど、Githubのレポジトリは非公開になっていると思います。これをなんとかできないかなと思いました。<br /> <img src="https://storage.googleapis.com/zenn-user-upload/4aad80e2913adc2dac582847.png" alt="" /></p> <h1 id="どんなサービス?"><a href="#%E3%81%A9%E3%82%93%E3%81%AA%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%EF%BC%9F">どんなサービス?</a></h1> <p>まずはこちらを見てください。<br /> <a target="_blank" rel="nofollow noopener" href="https://2go.plus/nice2h/2go/roadmap">https://2go.plus/nice2h/2go/roadmap</a><br /> このようにGithubのレポジトリ内のIssueをMilestone区切りにして、Githubに馴染みのない人にも見やすいロードマップサイトを公開するサービスです。もちろん、非公開のレポジトリを公開設定にすることなく、ロードマップだけを外部公開することができます。<br /> <img src="https://storage.googleapis.com/zenn-user-upload/18ca977fd4aa86432338179e.png" alt="" /><br /> Githubアカウントでログインすると、以下の設定画面になります。レポジトリを選択して、どのMilestoneを共有するかをチェックして保存します。すると、自動的にロードマップサイトのURLが生成されるので、こちらにアクセスすれば常に最新のロードマップを見ることができます。このURLをシェアすれば、多くの人にあなたのサービスのロードマップを簡単にキレイに公開できるわけです。<br /> <img src="https://storage.googleapis.com/zenn-user-upload/d3bf728edcb2592f63689133.png" alt="" /><br /> Milestoneを今まで使っていな方は、Milestoneを作成して、Issueを割り当てればロードマップを整理することができます。また、Labelを活用している方もいらっしゃると思いますので、Milestoneの中のLabelでIssueをフィルタすることもできます。これらを駆使することで、Bugは見せずにenhancementだけ表示するなどのことも可能です。<br /> 今後の予定としては、今はMilestone基点で表示しているところを、Labelベースで表示できるようにもしたいと思っています。その他は、まさに上記のURLを参考にしていただければ、いつも最新です。</p> <h1 id="どんな技術を使ってる?"><a href="#%E3%81%A9%E3%82%93%E3%81%AA%E6%8A%80%E8%A1%93%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%8B%3F">どんな技術を使ってる?</a></h1> <p>企業での開発経験はないので、全て自己流です。書籍やWebサイトを中心に勉強して開発しながら学んできました。念の為、利用している技術は以下のとおりです。<br /> - Laravel : APIとBlade(SSRはやってみたことあり)<br /> - Vue3 : フロントエンド(今回初挑戦)<br /> - Tailwindcss : デザイン(Bootstrapからの脱却)<br /> - Docker : これらの開発環境と、本番でもDocker利用(いずれ分割予定)<br /> - Cloud : Conoha VPS(インフラに時間を掛けたくなかった)</p> <h1 id="気になっていること(随時追加予定)"><a href="#%E6%B0%97%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8%EF%BC%88%E9%9A%8F%E6%99%82%E8%BF%BD%E5%8A%A0%E4%BA%88%E5%AE%9A%EF%BC%89">気になっていること(随時追加予定)</a></h1> <ul> <li>開発環境はLaravel sailを使いましたが、本番は自前でdocker-compose.ymlを使いました。このあたりのコンテナの構成をどのようにしているか気になりました(本番でもsail使う?)</li> <li>本番環境にコードをpullしてからnpm run prodしてbuildが終わるまでにラグがあり、この間は使えない機能が出てしまったりするが、このあたりをみなさんはどのように工夫しているか?</li> <li>DBについては、どこまでレコードを暗号化するか。検索機能などとのトレードオフになると思われるが。。</li> </ul> <h1 id="今後は?"><a href="#%E4%BB%8A%E5%BE%8C%E3%81%AF%EF%BC%9F">今後は?</a></h1> <p>現在alphaフェーズですが、alphaとしてもう1段階リリースの予定があります。多くの人に使っていただき、Feedbackをいただきながら改善して、開発経験を増していきたいと思います。また、今回の個人開発は最初から海外も同様の問題を抱えていると思ったので、最初から英語圏も視野に入っており、今の所すべてのUIは英語にしています。以下の英語Twitterアカウントも作成して、情報発信していこうと思っています。</p> <p><a target="_blank" rel="nofollow noopener" href="https://twitter.com/2go_plus">https://twitter.com/2go_plus</a></p> <p>もちろん、日本語のTwitterは私の今まで通りのアカウントを利用していく予定です。<br /> <a target="_blank" rel="nofollow noopener" href="https://twitter.com/jnakajima1982">https://twitter.com/jnakajima1982</a><br /> ぜひご感想・ご指摘をいただければと思います。</p> jnakajima1982 tag:crieit.net,2005:PublicArticle/17627 2021-08-30T17:14:25+09:00 2021-08-30T17:14:25+09:00 https://crieit.net/posts/GitHub-Actions-Jest GitHub ActionsでJestを叩くときのタイムゾーンと言語を設定する <p>GitHub リポジトリにプッシュした時、GitHub Actions のワークフローで自動的に Jest を走らせるようにしています。GitHub 上で自動的に走る Jest と、手動で直接叩く Jest との違いはタイムゾーンとロケールです。ここでは、GitHub 上で Jest を動かすときに環境変数としてタイムゾーンとロケールを指定する方法について説明します。</p> <h2 id="1. package.json にグローバル設定ファイルを指定する"><a href="#1.+package.json+%E3%81%AB%E3%82%B0%E3%83%AD%E3%83%BC%E3%83%90%E3%83%AB%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%99%E3%82%8B">1. package.json にグローバル設定ファイルを指定する</a></h2> <p>以下のように設定を追記します。<code>jest-global-setup.js</code>に設定を記載すれば、環境変数から読み込まれた値を上書きできます。</p> <pre><code class="javascript"> "jest": { "globalSetup": "./jest-global-setup.js" }, </code></pre> <h2 id="2. jest-global-setup.js の中身を記載する"><a href="#2.+jest-global-setup.js+%E3%81%AE%E4%B8%AD%E8%BA%AB%E3%82%92%E8%A8%98%E8%BC%89%E3%81%99%E3%82%8B">2. jest-global-setup.js の中身を記載する</a></h2> <p>タイムゾーンと言語を指定します。</p> <pre><code class="javascript">module.exports = async () => { process.env.TZ = "Asia/Tokyo"; process.env.LANG = "en_US.UTF-8"; }; </code></pre> <h2 id="3. 動作結果を確認する"><a href="#3.+%E5%8B%95%E4%BD%9C%E7%B5%90%E6%9E%9C%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B">3. 動作結果を確認する</a></h2> <p>Jest のテストで出力される日時の文字列を確認したところ、言語が日本語から英語になっていることが確認できました。</p> <pre><code class="text"> - "date": "Wed Apr 01 2020 09:00:00 GMT+0900 (日本標準時)", + "date": "Wed Apr 01 2020 09:00:00 GMT+0900 (Japan Standard Time)", </code></pre> kabueye tag:crieit.net,2005:PublicArticle/17543 2021-07-28T18:50:16+09:00 2021-07-28T18:50:16+09:00 https://crieit.net/posts/GitHub-610128580bf39 GitHubのパスワード認証が通らなかった話 <p>約1週間前まではGitHubのパスワード認証が使えていたのに、<br /> 今日突然使えなくなっていたのでメモ。</p> <h2 id="発生した問題"><a href="#%E7%99%BA%E7%94%9F%E3%81%97%E3%81%9F%E5%95%8F%E9%A1%8C">発生した問題</a></h2> <p>GitHubにソースをpushしようとしたが、エラー(403)が出て失敗した。<br /> 以下のようなメッセージが出ていた。</p> <pre><code>remote: Password authentication is temporarily disabled as part of a brownout. Please use a personal access token instead. remote: Please see https://github.blog/2020-07-30-token-authentication-requirements-for-api-and-git-operations/ for more information. </code></pre> <h2 id="解決方法"><a href="#%E8%A7%A3%E6%B1%BA%E6%96%B9%E6%B3%95">解決方法</a></h2> <ol> <li><p><a target="_blank" rel="nofollow noopener" href="https://docs.github.com/en/github/authenticating-to-github/keeping-your-account-and-data-secure/creating-a-personal-access-token">Creating a personal access token</a> に書かれている手順でPersonal Access Tokenを作成する</p></li> <li><p>Terminalにて、以下のコマンドを実行する:<br /> <code>git config --global --add user.password 取得したトークン</code></p></li> <li>Keychain AccessにてGitHubの情報を探し、パスワード欄を取得したトークンで置き換える</li> </ol> <p>この記事の通りだった↓<br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/kanta_yamaoka/items/1a59892028b9c422df22">GitHubの認証方法の新しいビッグウェーブに乗り遅れるな!</a></p> <h2 id="備考"><a href="#%E5%82%99%E8%80%83">備考</a></h2> <ul> <li>トークンの有効期限が切れたら、また上記手順を行う必要がある</li> <li>約1週間前に、GitHubからこんなメールが届いていた。気付かなかった・・・</li> </ul> <pre><code>Hi (ユーザ名), You recently used a password to access the repository at (リポジトリ名) with git using git/2.0 (libgit2 0.26.0). Basic authentication using a password to Git is deprecated and will soon no longer work. Visit https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information around suggested workarounds and removal dates. Thanks, The GitHub Team </code></pre> marshmallow444 tag:crieit.net,2005:PublicArticle/17496 2021-07-11T01:08:30+09:00 2021-07-11T01:08:30+09:00 https://crieit.net/posts/listing-github-repository-in-docker-20210711 Github で特定ユーザの publicリポジトリ の名前の一覧を生成する Docker Compose <h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2> <p>自分のあるリポジトリを clone しようとして、名前を失念。探すのに手間取ったのでリポジトリの名前の一覧を生成するスクリプトが欲しくなりました。</p> <h2 id="調査"><a href="#%E8%AA%BF%E6%9F%BB">調査</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/emergent/items/a557246a0c0bf9d50a11">GitHubのリポジトリを一覧化する(public/private両対応) - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://rcmdnk.com/blog/2017/10/03/computer-github/">GitHubのレポジトリ一覧を取ってくるワンライナー</a></li> </ul> <p>調べたら Linuxコマンド でどうにかなりそうだったので、 Docker で Linux環境 を用意してごにょごにょしよう、と思い立ちました。</p> <h2 id="成果物"><a href="#%E6%88%90%E6%9E%9C%E7%89%A9">成果物</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/arm-band/docker_list_of_hirokawa">GitHub - arm-band/docker_list_of_hirokawa: Github の特定ユーザの public リポジトリの一覧を生成する Docker Compose 設定集。</a></li> </ul> <h2 id="構成"><a href="#%E6%A7%8B%E6%88%90">構成</a></h2> <h3 id="ディレクトリ構造"><a href="#%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E6%A7%8B%E9%80%A0">ディレクトリ構造</a></h3> <pre><code>PROJECT_ROOT/ ├ docker/ │ └ Dockerfile │ ├ entrypoint/ │ └ entrypoint.sh │ ├ template/ │ └ script.sh // コンテナ内で実行したいスクリプトのテンプレート。一部変数をエントリポイントで置換 │ ├ workspace/ // リポジトリ名一覧のテキストファイルのダンプ先 │ ├ .env // docker-compose.yml 用の環境変数 └ docker-compose.yml </code></pre> <p>今回はこんなディレクトリ構造に。</p> <h3 id="docker-compose.yml"><a href="#docker-compose.yml">docker-compose.yml</a></h3> <pre><code class="yml">version: '3.8' services: hirokawa: build: context: ./docker dockerfile: Dockerfile args: USER_NAME: $USER_NAME FILE_NAME: $FILE_NAME volumes: # entrypoint - ./entrypoint:/entrypoint # workspace - ./workspace:/workspace # docker settings template - ./template:/template tty: true entrypoint: /bin/sh -c "/bin/sh /entrypoint/entrypoint.sh $USER_NAME $FILE_NAME && /bin/sh" </code></pre> <p>リポジトリ名の一覧を取得したい対象ユーザ名とダンプ先ファイル名を <code>.env</code> で指定しています。</p> <h3 id=".env"><a href="#.env">.env</a></h3> <pre><code class="env">USER_NAME=saigyo FILE_NAME=repository_list.txt </code></pre> <p>上述の通り。</p> <h3 id="docker/Dockerfile"><a href="#docker%2FDockerfile">docker/Dockerfile</a></h3> <pre><code class="Dockerfile">FROM alpine:latest RUN apk update && \ apk upgrade && \ apk add --no-cache \ jq \ bash \ sed \ curl RUN mkdir /var/script RUN chmod 777 /var/script </code></pre> <p>必要なパッケージのインストールとスクリプトの生成先のディレクトリの作成。</p> <p>今回はやることが最小限なので alpine を使用。</p> <h3 id="entrypoint/entrypoint.sh"><a href="#entrypoint%2Fentrypoint.sh">entrypoint/entrypoint.sh</a></h3> <pre><code class="sh">sed -e "s/USER_NAME/${1}/gi" -e "s/FILE_NAME/${2}/gi" /template/script.sh > /var/script/script.sh </code></pre> <p>一部変数名を <code>.env</code> の値で置換。一行しかないので command でも良かったかも。</p> <h3 id="template/script.sh"><a href="#template%2Fscript.sh">template/script.sh</a></h3> <pre><code class="sh">for page in $(seq 1 10); do result=$(curl -s "https://api.github.com/users/USER_NAME/repos?page=$page&per_page=100"|jq -c '[.[] .name]'|jq -c '.[]'); if [ -z "$result" ]; then break; fi; formatted_result=$(echo "$result"|sed -e "s/\"//gi"); echo "$formatted_result" > "/workspace/FILE_NAME"; done </code></pre> <p>実行するスクリプトのテンプレート。個人ユーザ対象で <code>curl</code> で Github API を叩いて100個(指定可能な最大数)ずつ出力、 <code>jq</code> でフィルタリングして、 <code>workspace</code> にファイルとしてダンプ。</p> <hr /> <p>これでやりたいことは実現できました。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <h3 id="サンプル"><a href="#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB">サンプル</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/emergent/items/a557246a0c0bf9d50a11">GitHubのリポジトリを一覧化する(public/private両対応) - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://rcmdnk.com/blog/2017/10/03/computer-github/">GitHubのレポジトリ一覧を取ってくるワンライナー</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://deep.tacoskingdom.com/blog/11">[Shell script] Alpine LinuxのDockerコンテナ内で使うjqをインストールする方法</a></li> </ul> <h3 id="jq"><a href="#jq">jq</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://jqplay.org/#">jq play</a></li> </ul> <h2 id="alpine で bash"><a href="#alpine+%E3%81%A7+bash">alpine で bash</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/yumenomatayume/items/b28edbaf40a293519b8a">【docker alpine linux】でbashの使用方法 - Qiita</a></li> </ul> <h3 id="starting container process caused: exec: &quot;bash&quot;: executable file not found in $PATH: unknown"><a href="#starting+container+process+caused%3A+exec%3A+%26quot%3Bbash%26quot%3B%3A+executable+file+not+found+in+%24PATH%3A+unknown">starting container process caused: exec: "bash": executable file not found in $PATH: unknown</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://kaoru2012.blogspot.com/2017/11/docker-executable-file-not-found-in-path.html">プログラマーの雑記: docker コンテナにログイン時に、「executable file not found in $PATH」エラーの対応</a></li> </ul> <h3 id="alpineイメージ への entrypoint 指定"><a href="#alpine%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8+%E3%81%B8%E3%81%AE+entrypoint+%E6%8C%87%E5%AE%9A">alpineイメージ への entrypoint 指定</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://cpoint-lab.co.jp/article/202009/16844/">【Docker】ENTRYPOINT と CMD の仕組みと小技 – 株式会社シーポイントラボ | 浜松のシステム・RTK-GNSS開発</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/16550 2021-01-06T23:45:20+09:00 2021-01-06T23:55:33+09:00 https://crieit.net/posts/badge-of-github-actions-with-chrome-extension-20210106 Github Actions のバッジを付ける (+バッジに Github Actions ページへのリンクを付与するChrome拡張機能を作成) <p><a href="https://crieit.net/posts/run-phpunit-on-github-actions-20210105">前回記事</a>の続き。 Github Actions で PHPUnit が走ることが確認できたところで、今度は「そういえば Github Actions のバッジはあるのだろうか?」と気になって調べてみました。</p> <h2 id="バッジの所在"><a href="#%E3%83%90%E3%83%83%E3%82%B8%E3%81%AE%E6%89%80%E5%9C%A8">バッジの所在</a></h2> <p>バッジについては Github Actions のページにありました。</p> <ol> <li>リポジトリの対象アクション ( <code>https://github.com/<user>/<repo>/actions?<workflow></code> ) に遷移</li> <li>上のハンバーガー( <code>…</code> ) からメニューを開く</li> <li><code>Create status badge</code> をクリック</li> </ol> <p>以上の手順で発行できます。</p> <p><a href="https://crieit.now.sh/upload_images/30fd56cee47ae62946d6c90ff72122da5ff5cbafc5560.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/30fd56cee47ae62946d6c90ff72122da5ff5cbafc5560.jpg?mw=700" alt="バッジ発行のメニューを展開した画面" /></a></p> <p>メニュー展開時。</p> <p><a href="https://crieit.now.sh/upload_images/8ae1b6cc9da667dd3e02d32105a009505ff5cbba9ec66.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/8ae1b6cc9da667dd3e02d32105a009505ff5cbba9ec66.jpg?mw=700" alt="バッジの Markdownコード をコピペできるダイアログ" /></a></p> <p>ダイアログ表示。</p> <p><a href="https://crieit.now.sh/upload_images/141188e82ee2e92f15b7ec06bc7286ef5ff5cbc8c6e40.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/141188e82ee2e92f15b7ec06bc7286ef5ff5cbc8c6e40.jpg?mw=700" alt="バッジを readme.md に貼り付け" /></a></p> <p>バッジを readme.md に貼り付けてみました。</p> <h2 id="バッジのリンクを変更する Chrome拡張機能"><a href="#%E3%83%90%E3%83%83%E3%82%B8%E3%81%AE%E3%83%AA%E3%83%B3%E3%82%AF%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B+Chrome%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD">バッジのリンクを変更する Chrome拡張機能</a></h2> <p>ところで、</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/akameco/items/e474691964703033e18d">GitHub Actionsのバッジをリンク付きでREADMEに追加する - Qiita</a></li> </ul> <p>こちらの記事で「デフォルトのバッジ画像の Markdownコード は画像のみとなっていて対象の Github Actions へのリンクにはなっていないのが不便」とありました。確かに……。</p> <p>上記の記事では UserScript で該当の Markdownコード を書き換える方法を紹介していましたが、個人的には Chrome拡張機能 で充分な気がしたのでざっくり自前で作ってみました。</p> <h3 id="リポジトリ"><a href="#%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA">リポジトリ</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/arm-band/chrome_extensions_cambadge">arm-band/chrome_extensions_cambadge</a></li> </ul> <h3 id="manifest.json"><a href="#manifest.json">manifest.json</a></h3> <pre><code class="json">{ "manifest_version": 2, "name": "cambadge", "description": "Github Actions のバッジのURLを変更する拡張機能です。", "version": "0.0.1", "browser_action": { "default_icon": { "19": "icon_19.png", "38": "icon_38.png" }, "default_title": "cambadge" }, "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'", "content_scripts": [ { "matches": [ "https://github.com/*" ], "js": [ "main.js" ] } ] } </code></pre> <h3 id="main.js"><a href="#main.js">main.js</a></h3> <pre><code class="javascript">/** * cambadgeCampaign: rewrite markdown code in textarea * * @param {object} DOMBadgeMd */ const cambadgeCampaign = (DOMBadgeMd) => { if (/^\!\[(.*)\]\((.*)\)$/gi.test(DOMBadgeMd.textContent)) { DOMBadgeMd.textContent = `[${DOMBadgeMd.textContent}](${location.href})`; } }; window.addEventListener('load', (e) => { // triggered load if (/https:\/\/github\.com\/(.*)actions(.*)/gi.test(location.href)) { // only github actions page const clickItem = document.querySelector('summary[data-test-selector="badge-builder-button"]'); clickItem.addEventListener('click', (ev) => { // triggered click of element:summary[data-test-selector="badge-builder-button"] let setIntervalId; let DOMBadgeMd; function findTargetElement () { // watch until find element:#badge-markdown DOMBadgeMd = document.querySelector('#badge-markdown'); if (DOMBadgeMd !== null && DOMBadgeMd !== undefined) { // found clearInterval(setIntervalId); // call function cambadgeCampaign(DOMBadgeMd); } }; setIntervalId = setInterval(findTargetElement, 100); }); } }); </code></pre> <p>ダイアログ中の <code>#badge-markdown</code> を含むバッジ生成の要素は <code>Create status badge</code> をクリックした際に生成されるようなので、 <code>Create status badge</code> をクリックした後、 <code>#badge-markdown</code> が見付かるまで書き換えの処理を待つようにしました。</p> <p><a href="https://crieit.now.sh/upload_images/fdaadb5b62dc4f103757d48bb84e12645ff5ccc3a2263.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/fdaadb5b62dc4f103757d48bb84e12645ff5ccc3a2263.jpg?mw=700" alt="バッジの Markdownコード (Chrome拡張機能 で書き換え実施後の表示)" /></a></p> <p>Chrome拡張機能 で書き換えられたダイアログ。これで該当の Github Actions ページへのリンクに繋がるようになりました。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <h3 id="バッジ"><a href="#%E3%83%90%E3%83%83%E3%82%B8">バッジ</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/SnowCait/items/487d70b342ffbe2f33d8#fn1">GitHub Actions でステータスバッジを表示する - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://docs.github.com/ja/free-pro-team@latest/actions/managing-workflow-runs/adding-a-workflow-status-badge">ワークフローステータスバッジを追加する - GitHub Docs</a></li> </ul> <h3 id="バッジのリンクを変更する"><a href="#%E3%83%90%E3%83%83%E3%82%B8%E3%81%AE%E3%83%AA%E3%83%B3%E3%82%AF%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B">バッジのリンクを変更する</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/akameco/items/e474691964703033e18d">GitHub Actionsのバッジをリンク付きでREADMEに追加する - Qiita</a></li> </ul> <h3 id="UserScript"><a href="#UserScript">UserScript</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://kenchan0130.github.io/post/2018-05-21-1">UserScriptで業務改善</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/16539 2021-01-05T22:38:21+09:00 2021-01-05T22:40:17+09:00 https://crieit.net/posts/run-phpunit-on-github-actions-20210105 Github Actions で PHPUnit を走らせる <p>Github Actions で ESLint や Stylelint 、あるいはデプロイのワークフローは走らせたことがありますが、 Jest も行けるはず……と思い至ったところで、ふとそういえば PHPUnit はどうでしょうか、と思い実験。</p> <h2 id="検証"><a href="#%E6%A4%9C%E8%A8%BC">検証</a></h2> <p>検索すると、</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/blue32a/items/0661d70216051ad6552d">GitHub ActionsでPHPUnitを実行する - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://techblog.istyle.co.jp/archives/4143">GitHubActionsでPHP7.4環境のPHPUnitを実行する - istyle Tech Blog</a></li> </ul> <p>これらの記事がヒットしました。そこで、この記事を参考に <code>.github/workflows/test.yml</code> として作成。</p> <h3 id=".github/workflows/test.yml"><a href="#.github%2Fworkflows%2Ftest.yml">.github/workflows/test.yml</a></h3> <pre><code class="yml">name: PHPUnit test on: [push] jobs: test: name: Test runs-on: ubuntu-latest strategy: matrix: php-version: ['7.4'] steps: - name: Setup PHP $<span>{</span><span>{</span> matrix.php-version <span>}</span><span>}</span> uses: shivammathur/setup-php@v2 with: php-version: $<span>{</span><span>{</span> matrix.php-version <span>}</span><span>}</span> extension-csv: mbstring, xdebug, dom - name: Add Plugin run: sudo apt install -y php7.4-xml - name: Checkout uses: actions/checkout@v2 - name: Check PHP Version run: php -v - name: Check Composer Version run: composer -V - name: Check PHP Extensions run: php -m - name: Validate composer.json and composer.lock run: composer validate - name: Install dependencies run: composer install --prefer-dist --no-progress --no-suggest - name: Run test suite run: composer run-script test </code></pre> <p>試しに Github に push してみます。</p> <p><a href="https://crieit.now.sh/upload_images/5e7f8b136f405d78a18e5bea06bfba145ff4680848495.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/5e7f8b136f405d78a18e5bea06bfba145ff4680848495.jpg?mw=700" alt="Github Actions で PHPUnit が走った結果の様子" /></a></p> <p>走りました。</p> <p>先人の知恵があればこそですが、 workflows の <code>yml</code> ファイルがあれば PHPUnit のテストも可能ということが分かりました。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <h3 id="Github Actions で PHPUnit"><a href="#Github+Actions+%E3%81%A7+PHPUnit">Github Actions で PHPUnit</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/blue32a/items/0661d70216051ad6552d">GitHub ActionsでPHPUnitを実行する - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://techblog.istyle.co.jp/archives/4143">GitHubActionsでPHP7.4環境のPHPUnitを実行する - istyle Tech Blog</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/nanasess/items/09b0798eb878328b195f">GitHub Actions で PHP の CI/CD をする - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.pnkts.net/2020/03/22/github-actions-phpunit">【Github Actions】プッシュ時にgithubに自動でテストを実行してもらおう! - ポンコツエンジニアのごじゃっぺ開発日記。</a></li> </ul> <h3 id="composer"><a href="#composer">composer</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://getcomposer.org/doc/03-cli.md#install-i">Command-line interface / Commands - Composer</a></li> <li><a target="_blank" rel="nofollow noopener" href="http://blog.tojiru.net/article/440339824.html">Composerの作者に会った (PHP勉強会 番外編レポート) #phpstudy #composerphp: Architect Note</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/tadsan/items/3a753f9eca83f2867a0a">composer.jsonのrequireを直接編集してはいけない - Qiita</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/16323 2020-12-10T00:55:08+09:00 2020-12-10T00:59:23+09:00 https://crieit.net/posts/hugo-github-actions-for-github-pages Hugo + GitHub Pages + GitHub Actions で独自ドメインのウェブサイトを構築する <h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1> <p><img src="https://i.gyazo.com/ffe8fe276b9d008461880581002430ec.png" alt="Hugo のトップページ" /></p> <p>Zenn や Qiita, note など様々なウェブサービスで記事を書くにつれて、ふと雑多な内容で自分の好き勝手に記事を書いて公開できる自分のブログが欲しくなりました。そこで、自分のブログを作ろうと思い調査したところ、SSG で作るのが手っ取り早そうだったのと、その中でも一番ラクにウェブサイトが構築できそうな <a target="_blank" rel="nofollow noopener" href="https://gohugo.io/">Hugo</a> を採用しました。</p> <p>また、デプロイは簡単に行いたかったので、デプロイ先として <a target="_blank" rel="nofollow noopener" href="https://docs.github.com/ja/free-pro-team@latest/github/working-with-github-pages/about-github-pages">GitHub Pages</a> を採用しました。<br /> 独自ドメインの割り当てから HTTPS 対応まで無料でできるかつ、使い慣れている GitHub をデプロイ先に使えることが決め手でした。</p> <p>Hugo で自分のブログを構築して GitHub Pages で公開できるようになったのですが、ブログ内容を更新したり記事を書くたびにビルドしてデプロイをするのが、意外と面倒なことに気づきました。そこで、<a target="_blank" rel="nofollow noopener" href="https://github.com/marketplace/actions/github-pages-action">GitHub Pages action</a> を用いて、ビルドしてデプロイするという作業は自動化しました。</p> <p>上記までの作業をすることで、自分のブログを書いたり更新することだけに集中できる環境を整えることができました。ウェブサイトを作りこむ以外は、簡単ないくつかの作業をするだけで Hugo で満足のいく自分のブログを書く環境が整えられたので、その手順についてまとめてみました。</p> <p>ちなみに本記事の手順で実際に作成した私のブログは下記です。<br /> <a target="_blank" rel="nofollow noopener" href="https://nikaera.com/">https://nikaera.com/</a></p> <h1 id="Hugo を PC にインストールする"><a href="#Hugo+%E3%82%92+PC+%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B">Hugo を PC にインストールする</a></h1> <p>私は Windows には <a target="_blank" rel="nofollow noopener" href="https://chocolatey.org/">Chocolatey</a>、Mac では <a target="_blank" rel="nofollow noopener" href="https://brew.sh/index_ja">Homebrew</a> で Hugo をインストールしました。Chocolatey や Homebrew を利用したインストール方法については <a target="_blank" rel="nofollow noopener" href="https://gohugo.io/getting-started/installing/">公式サイトの手順</a> で公開されています。</p> <pre><code class="bash"># Mac で Homebrew を使って Hugo をインストールする brew install hugo </code></pre> <pre><code class="powershell"># Windows で Chocolatey を使って Hugo をインストールする choco install hugo -confirm # Sass/SCSS を用いてウェブサイトのデザイン改修を行いたい場合は # 下記で Chocolatey を使って Hugo をインストールする choco install hugo-extended -confirm </code></pre> <h1 id="Hugo で自分のウェブサイトを構築する"><a href="#Hugo+%E3%81%A7%E8%87%AA%E5%88%86%E3%81%AE%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92%E6%A7%8B%E7%AF%89%E3%81%99%E3%82%8B">Hugo で自分のウェブサイトを構築する</a></h1> <h2 id="Hugo プロジェクトを作成する"><a href="#Hugo+%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">Hugo プロジェクトを作成する</a></h2> <p>下記コマンドで Hugo のプロジェクトフォルダを生成できます。</p> <pre><code class="bash">hugo new site <プロジェクトフォルダのパス> </code></pre> <p>Hugo のコンフィグファイルのデフォルトフォーマットは <a target="_blank" rel="nofollow noopener" href="https://github.com/toml-lang/toml.io/blob/main/specs/ja/v1.0.0-rc.2.md">TOML</a> 形式なのですが、<code>hugo new site <プロジェクトフォルダへのパス> -f json</code> のように <code>-f</code> オプションを付与することで JSON フォーマットでもコンフィグファイルを生成可能です。</p> <p>後述しますが、一部の Hugo のテーマはコンフィグファイルのサンプルが JSON ファイルで書かれています。その場合は、新規で設定するコンフィグファイルのフォーマットも JSON で統一しておくと各種設定項目の調整が楽になりそうです。</p> <p>もしくは<a target="_blank" rel="nofollow noopener" href="https://github.com/sclevine/yj">こちら</a>のようなコンバーターを使用したり、<a target="_blank" rel="nofollow noopener" href="https://pseitz.github.io/toml-to-json-online-converter/">こちら</a>のようなウェブのコンバーターを使用して、設定ファイルを JSON から TOML フォーマットに変更しても良さそうです。</p> <h2 id="ウェブサイトのテーマを探す"><a href="#%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AE%E3%83%86%E3%83%BC%E3%83%9E%E3%82%92%E6%8E%A2%E3%81%99">ウェブサイトのテーマを探す</a></h2> <p>テーマとは、ウェブサイトのデザインテンプレートのことです。テーマは <a target="_blank" rel="nofollow noopener" href="https://themes.gohugo.io/">Hugo Themes</a> で公開されているので、この中から自分の好みを選びます。Hugo ではテーマの内容をカスタマイズしたり差し替えることもできるので、あとから一部デザインを自分好みに修正できます。</p> <p><img src="https://i.gyazo.com/294b076125052fe8bd9574c5bd0d1f0b.png" alt="Hugo Themes にアクセスした時のページ" /><br /> <strong><a target="_blank" rel="nofollow noopener" href="https://themes.gohugo.io/">Hugo Themes</a> にアクセスした時のページ</strong></p> <p>お気に入りのテーマが見つかったら、<code>Download</code> ボタンをクリックしてテーマの GitHub URL を控えておきます。</p> <p><img src="https://i.gyazo.com/36ce79358e416ff6c92e7ad405c2abfa.png" alt="Kiera というテーマのページ" /><br /> <strong><a target="_blank" rel="nofollow noopener" href="https://themes.gohugo.io/hugo-kiera/">Kiera</a> というテーマのページ</strong></p> <h2 id="Hugo プロジェクトにテーマを適用する"><a href="#Hugo+%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AB%E3%83%86%E3%83%BC%E3%83%9E%E3%82%92%E9%81%A9%E7%94%A8%E3%81%99%E3%82%8B">Hugo プロジェクトにテーマを適用する</a></h2> <p>テーマの適用方法については <a target="_blank" rel="nofollow noopener" href="https://gohugo.io/getting-started/quick-start/#step-3-add-a-theme">公式サイトの手順</a> で紹介されていますが、Hugo のプロジェクトフォルダのルートで下記コマンドを実行して、コンフィグファイルに <code>theme</code> を追記するだけです。</p> <pre><code class="bash">git clone <テーマの GitHub URL> themes/<テーマ名> --depth=1 echo 'theme = "<テーマ名>"' >> config.toml </code></pre> <p>どのテーマも基本的に適用方法は同じで、例えば私が採用したテーマである <a target="_blank" rel="nofollow noopener" href="https://themes.gohugo.io/hugo-papermod/">PaperMod</a> を適用する場合は下記コマンドを実行することになります。</p> <pre><code class="bash">git clone https://github.com/adityatelange/hugo-PaperMod themes/hugo-PaperMod --depth=1 echo 'theme = "hugo-PaperMod"' >> config.toml </code></pre> <p>これで自分のウェブサイトを作り込んでいくための準備が整いました。</p> <h2 id="ウェブサイトを作り込む"><a href="#%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92%E4%BD%9C%E3%82%8A%E8%BE%BC%E3%82%80">ウェブサイトを作り込む</a></h2> <p><strong>各テーマには <code>exampleSite</code> というウェブサイト作成の参考になる Hugo のプロジェクトフォルダが存在します。</strong> 最初は <code>exampleSite</code> フォルダ内に存在する各種ファイルを自分のプロジェクトにコピー&ペーストして、改変しながらウェブサイトを作り込んでいくとスムーズに作業が進められます。</p> <p><code>exampleSite</code> フォルダは大抵 GitHub プロジェクトのルートに存在しているのですが、<strong>GitHub のブランチで管理しているものもあります。</strong> 私の採用した PaperMod は GitHub の <code>exampleSite</code> ブランチで管理していました。</p> <p>上記のような詳細は Hugo のテーマページに記載があるはずなので、事前に <code>exampleSite</code> フォルダが配置されている場所や設定可能な項目等をチェックしておくことをオススメします。実際のウェブサイトの見た目を確認するには、Hugo のプロジェクトフォルダのルートで下記コマンドを実行します。</p> <pre><code class="bash">hugo server </code></pre> <p><code>hugo server</code> 実行中に、ウェブサイトの設定を変更したり記事を追加すると、自動的にビルドが実行されるので常に最新のウェブサイトの見た目を確認できます。また、その際にエラーもコンソールに出力されるので、適宜修正しながらウェブサイトの作成を進めていくことが可能です。</p> <h1 id="GitHub にデプロイ環境を整える"><a href="#GitHub+%E3%81%AB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E7%92%B0%E5%A2%83%E3%82%92%E6%95%B4%E3%81%88%E3%82%8B">GitHub にデプロイ環境を整える</a></h1> <p>ウェブサイトの構築が出来ればあとはデプロイするだけです。今回は GitHub Actions でデプロイするため、残りの作業は GitHub 上で進めていきます。一応 GitHub Actions を使わずに手動でデプロイする手順については、Hugo の <a target="_blank" rel="nofollow noopener" href="https://gohugo.io/hosting-and-deployment/hosting-on-github/">公式サイトの手順</a> にて紹介されています。</p> <p>GitHub Actions を用いてデプロイできるようにした際の利点としては下記があります。</p> <ul> <li>デプロイ時に毎回手動で複数コマンド実行する手間が省ける</li> <li>自動化することでデプロイ時のコマンドミスを防ぐことが可能</li> <li><strong>常に統一した Hugo のビルド環境が利用可能</strong></li> </ul> <p>最初のうちは私も公式サイトの手順通りに Mac で手動デプロイしていました。しかし、Windows 環境でデプロイ作業した際、本番環境デプロイ時に <a target="_blank" rel="nofollow noopener" href="https://gohugo.io/hugo-pipes/fingerprint/">SRI</a> 関連のエラーが発生してしまい、ウェブサイトに stylesheet が適用されないバグが発生してしまいました。</p> <p>結局原因はよく分からなかったのですが、GitHub Actions 経由でデプロイするようにしたところ直りました。<strong>CI 経由でデプロイできるようになると、こういった実行環境の違いによる挙動も気にする必要が無くなります。</strong></p> <p>一応 Windows 環境で発生した SRI 関連のバグは Hugo で該当するテンプレートファイルを <code>layouts</code> フォルダを利用して差し替えて、integrity の設定内容を空にすることで、本番環境でも stylesheet が適用できるようになったことは確認しました。<a target="_blank" rel="nofollow noopener" href="https://stackoverflow.com/a/65052963">詳細はこちら</a>。</p> <h2 id="自分のウェブサイトをデプロイするためのリポジトリを作成する"><a href="#%E8%87%AA%E5%88%86%E3%81%AE%E3%82%A6%E3%82%A7%E3%83%96%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B">自分のウェブサイトをデプロイするためのリポジトリを作成する</a></h2> <p>GitHub の <a target="_blank" rel="nofollow noopener" href="https://pages.github.com/">公式サイトの手順</a> に従って、自身のウェブサイトをデプロイするためのリポジトリを作成します。また本記事では、<strong>Hugo プロジェクトのリポジトリはデプロイ用リポジトリとは別で扱うため、Hugo プロジェクトのリポジトリも新たに作成します。</strong></p> <p>本記事では Hugo プロジェクトのリポジトリ名は <code>hugo-blog</code> という名前に設定した前提で進めていきます。また作成したリモートリポジトリの情報は、下記コマンドで Hugo プロジェクトに登録しておきます。</p> <pre><code class="bash"># Hugo プロジェクトフォルダのルートで Git リポジトリを作成する git init # Hugo プロジェクトのリポジトリ情報を登録しておく (hugo-blog の GitHub URL) git remote add origin <Hugo プロジェクトのリポジトリの URL> </code></pre> <h2 id="GitHub Actions で Hugo のビルドからデプロイまでを自動化するための環境を整える"><a href="#GitHub+Actions+%E3%81%A7+Hugo+%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89%E3%81%8B%E3%82%89%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%BE%E3%81%A7%E3%82%92%E8%87%AA%E5%8B%95%E5%8C%96%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE%E7%92%B0%E5%A2%83%E3%82%92%E6%95%B4%E3%81%88%E3%82%8B">GitHub Actions で Hugo のビルドからデプロイまでを自動化するための環境を整える</a></h2> <p>今回は <code>hugo-blog</code> という Hugo プロジェクトのリポジトリから、デプロイ用リポジトリへデプロイしたいため、まずはデプロイ用リポジトリでデプロイキーを登録します。<a target="_blank" rel="nofollow noopener" href="https://docs.github.com/ja/free-pro-team@latest/developers/overview/managing-deploy-keys#%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%82%AD%E3%83%BC">公式サイトの手順</a> に従いデプロイキーを登録したら、秘密鍵を <code>hugo-blog</code> リポジトリのシークレットに登録します。</p> <p>シークレットは <a target="_blank" rel="nofollow noopener" href="https://docs.github.com/ja/free-pro-team@latest/actions/reference/encrypted-secrets#%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E6%9A%97%E5%8F%B7%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%E3%82%B7%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90">公式サイトの手順</a> に従って登録します。今回は秘密鍵をシークレットに登録する際の名前に <code>ACTIONS_DEPLOY_KEY</code> を設定した前提で進めていきます。</p> <p>次に <a target="_blank" rel="nofollow noopener" href="https://github.com/marketplace/actions/github-pages-action">GitHub Pages action</a> を導入して Hugo のビルドから公開までを自動化する環境をセットアップします。</p> <p><code>hugo-blog</code> リポジトリに GitHub Pages action の <a target="_blank" rel="nofollow noopener" href="https://github.com/marketplace/actions/github-pages-action#getting-started">Getting started</a> を参考にワークフローファイルを追加します。<code>- name: Deploy</code> の項目のみデプロイ用リポジトリへデプロイするために設定内容を変更します。</p> <pre><code class="yaml"># .github/workflows/gh-pages.yml name: github pages on: push: branches: - main # Set a branch name to trigger deployment jobs: deploy: runs-on: ubuntu-18.04 steps: - uses: actions/checkout@v2 with: submodules: true # Fetch Hugo themes (true OR recursive) fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod - name: Setup Hugo uses: peaceiris/actions-hugo@v2 with: hugo-version: '0.78.2' - name: Build run: hugo --minify # - name: Deploy # uses: peaceiris/actions-gh-pages@v3 # with: # github_token: $<span>{</span><span>{</span> secrets.GITHUB_TOKEN <span>}</span><span>}</span> # publish_dir: ./public - name: Deploy uses: peaceiris/actions-gh-pages@v3 with: deploy_key: $<span>{</span><span>{</span> secrets.ACTIONS_DEPLOY_KEY <span>}</span><span>}</span> external_repository: nikaera/nikaera.github.io publish_branch: main cname: nikaera.com </code></pre> <p><code>- name: Deploy</code> の項目で設定した各種パラメータは下記になります。</p> <div class="table-responsive"><table> <thead> <tr> <th>キー</th> <th>説明</th> </tr> </thead> <tbody> <tr> <td>deploy_key</td> <td>デプロイ時に使用する秘密鍵</td> </tr> <tr> <td>external_repository</td> <td>デプロイ先のリモートリポジトリ</td> </tr> <tr> <td>publish_branch</td> <td>デプロイ先のリモートリポジトリのブランチ</td> </tr> <tr> <td>cname</td> <td>設定するカスタムドメイン名</td> </tr> </tbody> </table></div> <p><code>deploy_key</code> にはシークレットに登録した秘密鍵を設定します。<code>external_repository</code> には Hugo をビルドした際のデプロイ先リポジトリを <code><ユーザ名>/<リポジトリ名></code> のフォーマットで指定します。<code>publish_branch</code> はデプロイ先として使用するブランチ名になります。<code>cname</code> には自分が設定したいドメイン名を指定します。<code>cname</code> の <a target="_blank" rel="nofollow noopener" href="https://docs.github.com/ja/free-pro-team@latest/github/working-with-github-pages/managing-a-custom-domain-for-your-github-pages-site">詳細</a> はこちらからご確認いただけます。</p> <h2 id="カスタムドメインで設定した内容で DNS 設定を書き換える"><a href="#%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%A7%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%9F%E5%86%85%E5%AE%B9%E3%81%A7+DNS+%E8%A8%AD%E5%AE%9A%E3%82%92%E6%9B%B8%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B">カスタムドメインで設定した内容で DNS 設定を書き換える</a></h2> <p>GitHub Pages にカスタムドメインを利用する際は、該当するドメインの DNS レコードの設定で CNAME レコードもしくは A レコードを設定する必要があります。<a target="_blank" rel="nofollow noopener" href="https://docs.github.com/ja/free-pro-team@latest/github/working-with-github-pages/managing-a-custom-domain-for-your-github-pages-site">公式サイトの手順</a> に従って設定します。</p> <p>また、カスタムドメインの設定後は特別な理由がない限りは、デプロイ用リポジトリで <a target="_blank" rel="nofollow noopener" href="https://docs.github.com/ja/free-pro-team@latest/github/working-with-github-pages/securing-your-github-pages-site-with-https">HTTPS 強制の設定</a> をしておくことオススメします。</p> <p>ちなみに GitHub Pages で利用している証明書は <a target="_blank" rel="nofollow noopener" href="https://github.blog/2018-05-01-github-pages-custom-domains-https/">Let's Encrypt</a> のものになります。</p> <p>設定作業はこれで完了です。あとは実際に Hugo プロジェクトを更新後、<code>hugo-blog</code> リポジトリに push することでビルドからデプロイまで GitHub Actions で行われるようになったかを確認していきます。</p> <h2 id="Hugo プロジェクトの更新時に自動でデプロイが行われるか確認する"><a href="#Hugo+%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E6%9B%B4%E6%96%B0%E6%99%82%E3%81%AB%E8%87%AA%E5%8B%95%E3%81%A7%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%8C%E8%A1%8C%E3%82%8F%E3%82%8C%E3%82%8B%E3%81%8B%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B">Hugo プロジェクトの更新時に自動でデプロイが行われるか確認する</a></h2> <p>Hugo プロジェクトには既に <code>hugo-blog</code> リポジトリの GitHub URL が <code>origin</code> として設定されているはずなので、下記で実際に <code>hugo-blog</code> リポジトリへ push してみます。</p> <pre><code class="bash"># Hugo プロジェクトを hugo-blog リポジトリに push する git add -A git commit -m "initial commit" git push origin main </code></pre> <p>次は実際に GitHub リポジトリの <code>Actions</code> タブから、GitHub Pages action のワークフローが実行されているか確認します。</p> <p><img src="https://i.gyazo.com/d4c3c5477c0f149ae84464fcc63c593b.png" alt="GitHub Pages actions の実行に成功した様子" /><br /> <strong>GitHub Pages actions の実行に成功した様子</strong></p> <p>無事ワークフローの実行に成功したことを確認したら、デプロイ用リポジトリの様子を確認します。</p> <p><img src="https://i.gyazo.com/3a0eb5ca58701a39bb922ea14477488c.png" alt="デプロイ用リポジトリに Hugo の最新ビルドが push されていることを確認する" /><br /> <strong>デプロイ用リポジトリに Hugo の最新ビルドが push されていることを確認する</strong></p> <p>最新コミットのメッセージに <code>deploy: <ユーザ名>/hugo-blog@<コミットハッシュ></code> のコメントが表示されているはずです。コメントのリンクをクリックすると、<code>hugo-blog</code> リポジトリの最新コミットの確認画面に遷移するはずです。</p> <p>ここまで確認できれば、あとはローカルで <code>hugo server</code> して確認していたウェブサイトと同じように、GitHub Pages 上でもウェブサイトが見えるか実際に確認してみます。</p> <p>デプロイ用リポジトリ名が <code><ユーザ名>/<ユーザ名>.github.io</code> であった場合、<code>https://<ユーザ名>.github.io</code> でウェブサイトにアクセスできます。私の場合は <code>https://nikaera.github.io</code> になります。その際、カスタムドメインにリダイレクトすることも確認できれば、カスタムドメインの設定も正常に反映されています。</p> <p><img src="https://i.gyazo.com/b3c061569dae33a1dd58f4741c6d77cc.png" alt="ページが正常に表示できカスタムドメインでもアクセスできている様子" /><br /> <strong>ページが正常に表示されていてカスタムドメインでアクセスできた様子</strong></p> <p>アクセス時に意図したページが表示されていることが確認できれば大丈夫です。これで自分のウェブサイトを更新したら <code>hugo-blog</code> リポジトリに Hugo プロジェクトを push するだけで自分のウェブサイトを自動更新できるようになりました。</p> <h1 id="おわりに"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</a></h1> <p>今回は Hugo を例にしましたが、本記事内で紹介した <a target="_blank" rel="nofollow noopener" href="https://github.com/marketplace/actions/github-pages-action">GitHub Pages action</a> は <a target="_blank" rel="nofollow noopener" href="https://jamstack.org/generators/">様々な SSG</a> に対応しています。そのため Hugo ではウェブサイトのカスタマイズに限界が来たなと感じたら <a target="_blank" rel="nofollow noopener" href="https://nextjs.org/">Next.js</a> や <a target="_blank" rel="nofollow noopener" href="https://www.gatsbyjs.com/">Gatsby</a> に乗り換えるといったことも可能です。</p> <p>また Hugo では何も考えずとも、マークダウンで記事が書けてビルドも高速なので、手っ取り早く自分のウェブサイトを構築してみたいという用途にはピッタリだと感じました。</p> <p>関係ないですが、Hugo でウェブサイト構築する際の知見も記事に含めてしまったせいで、文章量が意図した倍近い量になってしまいました。。簡潔で分かりやすい文章が書けるようにならなきゃ。。</p> <h1 id="参考リンク"><a href="#%E5%8F%82%E8%80%83%E3%83%AA%E3%83%B3%E3%82%AF">参考リンク</a></h1> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://gohugo.io/">The world’s fastest framework for building websites | Hugo</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://themes.gohugo.io/">Complete List | Hugo Themes</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://docs.github.com/ja/free-pro-team@latest/github/working-with-github-pages/about-github-pages">GitHub Pages について - GitHub Docs</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/marketplace/actions/github-pages-action">GitHub Pages action</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://gohugo.io/getting-started/installing/">Install Hugo | Hugo</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://gohugo.io/getting-started/quick-start/#step-3-add-a-theme">Quick Start | Hugo</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://gohugo.io/hosting-and-deployment/hosting-on-github/">Host on GitHub | Hugo</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://pages.github.com/">GitHub Pages | Websites for you and your projects, hosted directly from your GitHub repository. Just edit, push, and your changes are live.</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://docs.github.com/ja/free-pro-team@latest/developers/overview/managing-deploy-keys#%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%82%AD%E3%83%BC">デプロイキーの管理 - GitHub Docs</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://docs.github.com/ja/free-pro-team@latest/actions/reference/encrypted-secrets#%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E6%9A%97%E5%8F%B7%E5%8C%96%E3%81%95%E3%82%8C%E3%81%9F%E3%82%B7%E3%83%BC%E3%82%AF%E3%83%AC%E3%83%83%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90">暗号化されたシークレット - GitHub Docs</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://docs.github.com/ja/free-pro-team@latest/github/working-with-github-pages/managing-a-custom-domain-for-your-github-pages-site">GitHub Pages サイトのカスタムドメインを管理する - GitHub Docs</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://docs.github.com/ja/free-pro-team@latest/github/working-with-github-pages/securing-your-github-pages-site-with-https">HTTPS で GitHub Pages サイトを保護する - GitHub Docs</a></li> </ul> nikaera tag:crieit.net,2005:PublicArticle/16107 2020-10-04T23:26:27+09:00 2020-10-04T23:26:27+09:00 https://crieit.net/posts/GitHub-5f79db931e76f GitHubのデフォルトラベルを和訳 + 絵文字付加 <p>本記事は、 Qrunch からの移転記事です。</p> <p>移転元: <a target="_blank" rel="nofollow noopener" href="https://morichan.qrunch.io/entries/s2n3b4OM2eC9wa5u">GitHubのデフォルトラベルを和訳 + 絵文字付加 - 雑木林</a></p> <h1 id="TL; DR"><a href="#TL%3B+DR">TL; DR</a></h1> <div class="table-responsive"><table> <thead> <tr> <th align="center">絵文字</th> <th align="center">原文</th> <th>和訳</th> </tr> </thead> <tbody> <tr> <td align="center">🐛</td> <td align="center">bug</td> <td>不具合</td> </tr> <tr> <td align="center">📝</td> <td align="center">document</td> <td>ドキュメント</td> </tr> <tr> <td align="center">🔙</td> <td align="center">duplicate</td> <td>別チケット有</td> </tr> <tr> <td align="center">✨</td> <td align="center">enhancement</td> <td>新機能など</td> </tr> <tr> <td align="center">🤝</td> <td align="center">good first issue</td> <td>初心者歓迎</td> </tr> <tr> <td align="center">🆘</td> <td align="center">help wanted</td> <td>助けて!</td> </tr> <tr> <td align="center">⛔</td> <td align="center">invalid</td> <td>不適当な内容</td> </tr> <tr> <td align="center">❔</td> <td align="center">question</td> <td>質問</td> </tr> <tr> <td align="center">❌</td> <td align="center">wontfix</td> <td>意図的な中止</td> </tr> </tbody> </table></div> <h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1> <p>GitHubのリポジトリを最初に作成すると、Issue/プルリクのラベルとして、下記が出現します。</p> <p><a href="https://crieit.now.sh/upload_images/f6da0dc1de3b0bb53b79a23b031fe5d45f79d42ececc6.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f6da0dc1de3b0bb53b79a23b031fe5d45f79d42ececc6.png?mw=700" alt="Issue/プルリクのデフォルトラベル" /></a></p> <p>これらの意味を知りたくなったので、調べてみます。<br /> ついでに、該当しそうな絵文字を探して付けてみます。</p> <h1 id="各ラベルの説明と和訳と絵文字"><a href="#%E5%90%84%E3%83%A9%E3%83%99%E3%83%AB%E3%81%AE%E8%AA%AC%E6%98%8E%E3%81%A8%E5%92%8C%E8%A8%B3%E3%81%A8%E7%B5%B5%E6%96%87%E5%AD%97">各ラベルの説明と和訳と絵文字</a></h1> <p>以降、各ラベルについての説明と和訳、そして絵文字を付けてみます。</p> <p>下記に参考ページを載せます。</p> <p><a target="_blank" rel="nofollow noopener" href="https://help.github.com/en/github/managing-your-work-on-github/about-labels#using-default-labels">About labels - GitHub Help</a></p> <h2 id="bug"><a href="#bug">bug</a></h2> <p>特に言う必要は無いと思いますが、バグですね。<br /> ただ、日本ではバグという言葉は強すぎるという意見もあるので、「不具合」の方がいいかもしれません。<br /> 絵文字は 🐛 でいいんじゃないですかね。</p> <h2 id="documentation"><a href="#documentation">documentation</a></h2> <p>これは、比較的最近作られたラベルですかね?<br /> 上記画像のリポジトリは2年前くらいに作ったので、存在しないです。</p> <p>純粋に、「ドキュメント」で良いと思います。<br /> 絵文字は 📝 にしましょう。</p> <h2 id="duplicate"><a href="#duplicate">duplicate</a></h2> <p>これは、既存のIssueが既に立っていることを示します。<br /> 「別チケット有」なんてどうでしょうか?<br /> 絵文字は、ドンピシャなものが無かったのですが、 🔙 とします。</p> <h2 id="enhancement"><a href="#enhancement">enhancement</a></h2> <p>新機能や要望のIssueでよく見かける気がします。<br /> 「新機能など」とすることで、機能追加以外についてもこのラベルで対応できるのではないでしょうか。<br /> 絵文字は、みんな大好き ✨ です。</p> <h2 id="good first issue"><a href="#good+first+issue">good first issue</a></h2> <p>直訳では「最初のIssueに良い」ですかね。<br /> 実は「最初のコントリビューター向けのIssue」、という意味があるそうです。<br /> 意訳ですが、「初心者歓迎」なんてどうでしょうか?<br /> 絵文字は 🤝 なんていいですね。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/gotchane/items/69c332b2e67b9e20c378">OSS 貢献における GitHub の Issue 探しについて手始めに調べてみた - Qiita</a></p> <h2 id="help wanted"><a href="#help+wanted">help wanted</a></h2> <p>GitHubのヘルプページには「メンテナが課題やプルリクについて助けを求めていること」とあります。<br /> ということで、意訳ですが「助けて!」としてみます。<br /> 最後のびっくりマークにより、声を大にして求めている感じを出しています。<br /> 絵文字は 🆘 がぴったりです。</p> <h2 id="invalid"><a href="#invalid">invalid</a></h2> <p>文法エラーなどでもよく登場しますが、直訳では「無効な」という意味です。<br /> Issueにラベル付けすることを考えると、「不適当な内容」としてみると良いかもしれません。<br /> 不適切とまでは言わないが、Issueに価値が無くなってしまったことを伝えたいです。<br /> 絵文字は悩みましたが、このラベルが付いたらクローズされそうなので、 ⛔ としてみました。</p> <h2 id="question"><a href="#question">question</a></h2> <p>質問する際に使えますね。<br /> 和訳も「質問」で良いと思います。<br /> 絵文字は ❔ としてみます。<br /> ❓ もありますが、デフォルトラベルの背景色が赤紫っぽかったので、白色の方にしました。</p> <h2 id="wontfix"><a href="#wontfix">wontfix</a></h2> <p>不具合はあるが未修正のままにするなどのように、あえて変更しないことを意味します。<br /> 「意図的な中止」とすることで、意図が伝わる気がします。<br /> 絵文字は ❌ がいいですかね。</p> <h1 id="おわりに"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</a></h1> <p>英語だととっつきづらいものも、日本語にすることで理解が進みますね。<br /> 絵文字文化ももっと広まることを願います。</p> Morichan tag:crieit.net,2005:PublicArticle/16106 2020-10-04T23:25:37+09:00 2020-10-04T23:25:37+09:00 https://crieit.net/posts/Git Gitのコミットメッセージに絵文字付きプレフィックスを適用する <p>本記事は、 Qrunch からの移転記事です。</p> <p>移転元: <a target="_blank" rel="nofollow noopener" href="https://morichan.qrunch.io/entries/boTlOB6zi3hGwNTd">Gitのコミットメッセージに絵文字付きプレフィックスを適用する - 雑木林</a></p> <h1 id="TL; DR"><a href="#TL%3B+DR">TL; DR</a></h1> <p>コミットメッセージのプレフィックスは、Angularスタイルを基準としています。<br /> また、各プレフィックスに絵文字を付ける際は、下記のようにしています。</p> <div class="table-responsive"><table> <thead> <tr> <th>プレフィックス</th> <th align="center">絵文字</th> <th>絵文字の綴り</th> </tr> </thead> <tbody> <tr> <td>feat</td> <td align="center">✨</td> <td>sparkles</td> </tr> <tr> <td>fix</td> <td align="center">🐛</td> <td>bug</td> </tr> <tr> <td>docs</td> <td align="center">📝</td> <td>memo</td> </tr> <tr> <td>style</td> <td align="center">📁</td> <td>file_folder</td> </tr> <tr> <td>refactor</td> <td align="center">♻️</td> <td>recycle</td> </tr> <tr> <td>perf</td> <td align="center">⚡️</td> <td>zap</td> </tr> <tr> <td>test</td> <td align="center">✅</td> <td>white_check_mark</td> </tr> <tr> <td>chore</td> <td align="center">🍰</td> <td>cake</td> </tr> <tr> <td>init</td> <td align="center">🎉</td> <td>tada</td> </tr> <tr> <td>merge</td> <td align="center">🔀</td> <td>twisted_rightwards_arrows</td> </tr> <tr> <td>review</td> <td align="center">👌</td> <td>ok_hand</td> </tr> <tr> <td>wip</td> <td align="center">🚧</td> <td>construction</td> </tr> </tbody> </table></div> <h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1> <p>コミットメッセージにプレフィックスを付ける文化が、少しずつ広がっています。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/numanomanu/items/45dd285b286a1f7280ed">【今日からできる】コミットメッセージに 「プレフィックス」 をつけるだけで、開発効率が上がった話 - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#type">angular.js/DEVELOPERS.md at master · angular/angular.js</a></li> </ul> <p>一方、コミットメッセージに絵文字を付ける文化も、広まりつつあります。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/SnO2WMaN/items/45a68905e6768f5d7c39">customizable-gitmoji-cliで、gitのコミットメッセージに絵文字を付ける - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://gitmoji.carloscuesta.me/">gitmoji | An emoji guide for your commit messages</a></li> </ul> <p>両者を組合せれば、最強のプレフィックスが出来上がるのではないかと考えました。<br /> ということで、絵文字付きプレフィックスという考え方を提案し、ここに記すこととします。</p> <h1 id="コミットメッセージにおける絵文字の付け方"><a href="#%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E7%B5%B5%E6%96%87%E5%AD%97%E3%81%AE%E4%BB%98%E3%81%91%E6%96%B9">コミットメッセージにおける絵文字の付け方</a></h1> <p>コミットメッセージに、絵文字名を <code>:</code> で挟むことにより、GitHub上で表示できます。<br /> また、コンソール上では、 emoji-cli などを利用することで、表示が可能です。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/b4b4r07/items/1811f39a5f1418b38ec4">コマンドラインで emoji を扱う - Qiita</a></p> <p>例えば、 ✨ (sparkles) という記号をコミットメッセージに書きたい場合、コミットメッセージを次のように記述します。</p> <pre><code class="txt">:sparkles: feat(ruby): やさしい日本語ページのルビタグ対応 </code></pre> <p>すると、GitHub上のコミットメッセージとして登録されます。</p> <p><a href="https://crieit.now.sh/upload_images/69c95e597c4645fbdc4475feb494043e5f79d2604c967.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/69c95e597c4645fbdc4475feb494043e5f79d2604c967.png?mw=700" alt="sparklesをGitHub上のコミットメッセージとして表示した画面" /></a></p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/covid19-miyazaki/covid19">covid19-miyazaki/covid19: 宮崎県(非公式) 新型コロナウイルス感染症対策サイト / Miyazaki COVID-19 Task Force website</a></p> <p>コミットメッセージの1行目は、表示できる文字数に制限があるため、長すぎる絵文字名の絵文字は気をつけたほうがいいかもしれません。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/tommy_aka_jps/items/a20d9a821cc01ee7bd96">git commit 時に書くコミットメッセージ1行目の表示文字数上限を調べてみた - Qiita</a></p> <h1 id="各プレフィックスと絵文字の紐付け"><a href="#%E5%90%84%E3%83%97%E3%83%AC%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E3%82%B9%E3%81%A8%E7%B5%B5%E6%96%87%E5%AD%97%E3%81%AE%E7%B4%90%E4%BB%98%E3%81%91">各プレフィックスと絵文字の紐付け</a></h1> <p>大前提として、プレフィックスを使う場合は、リポジトリ内で統一する必要があります。<br /> これは、プレフィックスを使ったとしても、意味がわからなければ伝わらないからです。<br /> 同様に、多くの種類の絵文字を使うことも否定的です。<br /> これからの時代は、プロジェクト毎に、コーディングスタイルと共にコミットメッセージスタイルも定義する必要があると思います。</p> <p>今回は、Angularスタイルのプレフィックスを参考にします。<br /> <del>理由は、それ以外のスタイルを知らないからです。</del></p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/angular/angular.js/blob/master/DEVELOPERS.md#type">angular.js/DEVELOPERS.md at master · angular/angular.js</a></p> <p>また、絵文字については、Gitmojiを参考にします。<br /> <del>理由は、サイトが綺麗だからです。</del></p> <p><a target="_blank" rel="nofollow noopener" href="https://gitmoji.carloscuesta.me/">gitmoji | An emoji guide for your commit messages</a></p> <p>オリジナル絵文字を利用する場合は、GitHubで使える絵文字チートシートを参考にします。</p> <p><a target="_blank" rel="nofollow noopener" href="https://www.webfx.com/tools/emoji-cheat-sheet/">🎁 Emoji cheat sheet for GitHub, Basecamp, Slack & more</a></p> <p>以降、各プレフィックスの内容を説明し、それに見合った絵文字を紹介します。</p> <h2 id="feat"><a href="#feat">feat</a></h2> <blockquote> <p><strong>feat</strong>: A new feature</p> </blockquote> <p>新機能を追加する際に利用します。</p> <p>Gitmojiでは、同等の絵文字として ✨ (sparkles) を定義しています。<br /> 新機能を導入する際に使う絵文字です。</p> <blockquote> <p>:sparkles: Introducing new features.</p> </blockquote> <p>ということで、 feat には ✨ (sparkles) を利用します。</p> <hr /> <p>余談ですが、新機能というと、無かった機能を追加した際のみにも聞こえます。<br /> 僕の場合は、既存機能を変更する際や、既存機能を削除する際にも使っています。<br /> 変更/削除についても、変更することによって統一性が図れるとか、削除することによってUIが向上するとか、変更/削除そのものが機能追加という場合が多いなーと思っていたからです(いわゆる enhansement と同じ意味として捉えています。<br /> これについては、プロジェクト毎に決めておくといいかもしれません。</p> <h2 id="fix"><a href="#fix">fix</a></h2> <blockquote> <p><strong>fix</strong>: A bug fix</p> </blockquote> <p>不具合を修正する際に利用します。</p> <p>Gitmojiでは、同等の絵文字として 🐛 (bug) を定義しています。<br /> 意味は全く同じです。</p> <blockquote> <p>:bug: Fixing a bug.</p> </blockquote> <p>ということで、 fix には 🐛 (bug) を利用します。</p> <hr /> <p>また余談ですが、個人的には、修正コミットに 🐛 を付けることは、若干抵抗があります。<br /> GitHubでIssueファーストの開発をしていると、Issueでは不具合発見として 🐛 を付けて、修正プルリクとして 🐛 の絵文字を付けてしまいませんか?<br /> 🐛 という絵文字自体には2つの意味があるからです。</p> <ul> <li>不具合発見時</li> <li>不具合修正時</li> </ul> <p>前者は 🐛 で問題ないのですが、後者については考える余地があるはずです。<br /> もし虫網や虫籠の絵文字があれば、それを使っていたのですが......</p> <p>コミット時に不具合を意図的に入れることは考えられない点と、不具合発見時をコミットメッセージで表すことが無い点、さらに 不具合 == バグ == 🐛 を知らないエンジニアがほぼいない点を考慮して、 fix には 🐛 がいいかなと考えました。</p> <h2 id="docs"><a href="#docs">docs</a></h2> <blockquote> <p><strong>docs</strong>: Documentation only changes</p> </blockquote> <p>ドキュメント類を修正する際に利用します。<br /> 修正と言っていますが、追加や削除時にも使ってよいと思います。</p> <p>Gitmojiでは、同等の絵文字として 📝 (pencil) を定義しています。<br /> ドキュメント類を記述する際に利用します。</p> <blockquote> <p>:pencil: Writing docs.</p> </blockquote> <p>また、 pencil と memo は、GitHubでは同じ絵文字として認識されます。</p> <p><a href="https://crieit.now.sh/upload_images/aaa7383ded55b293dbf016257c05ce015f79d2d1c40c6.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/aaa7383ded55b293dbf016257c05ce015f79d2d1c40c6.png?mw=700" alt="pencil と memo の絵文字" /></a></p> <p>ちなみに、鉛筆だけの絵文字は pencil2 です。<br /> <del>これは酷い......</del></p> <p><a href="https://crieit.now.sh/upload_images/ef7ebafe4134a31651e449623053f44f5f79d30a659e8.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/ef7ebafe4134a31651e449623053f44f5f79d30a659e8.png?mw=700" alt="pencil2 の絵文字" /></a></p> <p>ということで、 pencil では文字ベースとして判断しづらい点から、 📝 (memo) を利用します。</p> <h2 id="style"><a href="#style">style</a></h2> <blockquote> <p><strong>style</strong>: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)</p> </blockquote> <p>ソースコードの可読性を変更する際に利用します。<br /> Lintを適用した際や、空行を追加した際など、振舞いに変化を与えない変更が該当します。</p> <p>Gitmojiでは、 🎨 (art) が当てはまるかもしれません。<br /> 🎨 は、ファイル構造を変更する際、または、ソースコードのフォーマットを変更する際に利用します。</p> <blockquote> <p>:art: Improving structure / format of the code.</p> </blockquote> <p>style という観点で言えば、2番目の意味に該当することは間違いありません。<br /> また、1番目の意味も、ファイル構造の style という側面で見れば、該当すると見ることもできます。</p> <p>しかし、 <code>art</code> という単語からは、UIに関連しそうなイメージが付きます。<br /> 実際、下記のようなIssueも上がっています。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/carloscuesta/gitmoji/issues/320">🎨 for design and 📐 for structure · Issue #320 · carloscuesta/gitmoji</a></p> <p>style という内容に合わせるため、ここでは 📁 (file_folder) を利用します。</p> <p><a target="_blank" rel="nofollow noopener" href="https://emojipedia.org/file-folder/">📁 File Folder Emoji</a></p> <h2 id="refactor"><a href="#refactor">refactor</a></h2> <blockquote> <p><strong>refactor</strong>: A code change that neither fixes a bug nor adds a feature</p> </blockquote> <p>ソースコードの可読性を向上する際に利用します。</p> <p>Gitmojiには、同等の絵文字として ♻️ (recycle) を定義しています。<br /> 意味はほとんど同じです。</p> <blockquote> <p>:recycle: Refactoring code.</p> </blockquote> <p>ということで、 refactor には ♻️ (recycle) を利用します。</p> <h2 id="perf"><a href="#perf">perf</a></h2> <blockquote> <p><strong>perf</strong>: A code change that improves performance</p> </blockquote> <p>パフォーマンスを向上する際に利用します。</p> <p>Gitmojiには、同等の絵文字として ⚡️ (zap) を定義しています。<br /> 意味は全く同じです。</p> <blockquote> <p>:zap: Improving performance.</p> </blockquote> <p>ということで、 perf には ⚡️ (zap) を利用します。</p> <h2 id="test"><a href="#test">test</a></h2> <blockquote> <p><strong>test</strong>: Adding missing or correcting existing tests</p> </blockquote> <p>テストコードを追加する際や、既存テストコードを修正する際に利用します。</p> <p>Gitmojiには、同等の絵文字として ✅ (white_check_mark) を定義しています。<br /> 意味は全く同じです。</p> <blockquote> <p>:white_check_mark: Updating tests.</p> </blockquote> <p>また、チェックマークの絵文字は、他にも ✔️ (heavy_check_mark) が存在します。</p> <p>正直、どちらでもいいとは思います。<br /> 個人的には、Windowsでの開発が多かったため、 ✔️ を利用していました。<br /> ✔️ のチェックの色が緑色で、わかりやすかったためです。</p> <p>しかし、他OSではチェックの色が黒色で、わかりづらくなっています。<br /> 一方、 ✅ は、殆どのメーカーが緑色矩形の白抜きチェックであり、わかりやすくなっています。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://emojipedia.org/check-mark-button/">✅ White Heavy Check Mark Emoji</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://emojipedia.org/check-mark/">✔️ Heavy Check Mark Emoji</a></li> </ul> <p>ということで、 test には ✅ (white_check_mark) を利用します。</p> <h2 id="chore"><a href="#chore">chore</a></h2> <blockquote> <p><strong>chore</strong>: Changes to the build process or auxiliary tools and libraries such as documentation generation</p> </blockquote> <p>自動生成ツールによりファイルを変更する際に利用します。<br /> chore とは、雑務という意味があります。</p> <p><a target="_blank" rel="nofollow noopener" href="https://ejje.weblio.jp/content/chore">choreの意味・使い方・読み方 | Weblio英和辞書</a></p> <p>Gitmojiには、該当する絵文字はありません。<br /> 一部分で該当しそうな絵文字は、いくつか定義しています。</p> <p>少し頭を悩ませましたが、英語圏のスラングである 'It's a piece of cake' から取って、 🍰 (cake) を利用します。</p> <p><a target="_blank" rel="nofollow noopener" href="https://ejje.weblio.jp/content/it%27s+a+piece+of+cake">it's a piece of cakeの意味・使い方・読み方 | Weblio英和辞書</a></p> <h2 id="Angularスタイル以外"><a href="#Angular%E3%82%B9%E3%82%BF%E3%82%A4%E3%83%AB%E4%BB%A5%E5%A4%96">Angularスタイル以外</a></h2> <p>以下は、Angularスタイル以外のコミットメッセージで利用する絵文字です。<br /> プレフィックスは付けても付けなくても構いません。</p> <h3 id="First commit"><a href="#First+commit">First commit</a></h3> <p>最初のコミットとしてよく使われる first commit ですが、Gitmojiでは 🎉 (tada) として定義しています。</p> <blockquote> <p>:tada: Initial commit.</p> </blockquote> <p>ということで、 first commit には 🎉 (tada) を利用します。<br /> プレフィックスは init とします。</p> <hr /> <p>余談ですが、個人的には first commit を空メッセージにするのは懐疑的です。<br /> 必要無いから消したのか、書き忘れたのか、空メッセージでは判断できないためです。</p> <p><a target="_blank" rel="nofollow noopener" href="https://qiita.com/NorsteinBekkler/items/b2418cd5e14a52189d19">Gitの最初のコミットは空コミットにしよう - Qiita</a></p> <h3 id="Merge commit"><a href="#Merge+commit">Merge commit</a></h3> <p>マージ実行時のコミットですが、Gitmojiでは 🔀 (twisted_rightwards_arrows) として定義しています。</p> <blockquote> <p>:twisted_rightwards_arrows: Merging branches.</p> </blockquote> <p>ということで、マージコミットには 🔀 (twisted_rightwards_arrows) を利用します。<br /> 長いですが、マージコミットの1行目はあまり重要であることは少ないため、問題なしとします。<br /> プレフィックスは merge とします。</p> <h3 id="Review commit"><a href="#Review+commit">Review commit</a></h3> <p>レビュー指摘反映時のコミットですが、Gitmojiでは 👌 (ok_hand) として定義しています。</p> <blockquote> <p>:ok_hand: Updating code due to code review changes.</p> </blockquote> <p>ということで、レビュー指摘反映コミットには 👌 (ok_hand) を利用します。<br /> <del>あまり個人的には多用しないようにすべきとは思いますが......</del></p> <h3 id="WIP commit"><a href="#WIP+commit">WIP commit</a></h3> <p>作業中コミット (WIP: Work in Progress) ですが、Gitmojiでは 🚧 (construction) として定義しています。</p> <blockquote> <p>:construction: Work in progress.</p> </blockquote> <p>ということで、作業中コミットには 🚧 (construction) を利用します。<br /> プレフィックスは wip とします。</p> <h1 id="おわりに"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</a></h1> <p>現在ではプライベートリポジトリでしか利用してませんが、個人的には可読性が上がっている気がします。<br /> これを開発チームに展開して共有できれば、また違った世界が見えるかもしれません。</p> <p>絵文字は、用法用量を守り、適切にご利用ください。</p> <h1 id="ちなみに"><a href="#%E3%81%A1%E3%81%AA%E3%81%BF%E3%81%AB">ちなみに</a></h1> <p>Gitmojiでは、本記事と似たようなIssueが立っていました。<br /> もしかしたら、Gitmoji側で方針が決まるかもしれません。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/carloscuesta/gitmoji/issues/429">Add a "semver" field for each emoji · Issue #429 · carloscuesta/gitmoji</a></p> <p>こんなリポジトリもあります。<br /> これを使えば、本記事の内容をPJで統一しやすくなりますね。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/negokaz/git-fancy-message-prefix">negokaz/git-fancy-message-prefix: A Git prepare-commit-msg hook for fancy commit message</a></p> Morichan tag:crieit.net,2005:PublicArticle/16097 2020-10-04T23:17:10+09:00 2020-10-04T23:17:10+09:00 https://crieit.net/posts/vimrc-GitHub vimrcファイル(環境設定ファイル全般)はGitHubで管理するといいのではないか <p>本記事は、 Qrunch からの移転記事です。</p> <p>移転元: <a target="_blank" rel="nofollow noopener" href="https://morichan.qrunch.io/entries/uhFFiglG0UDfJIy0">vimrcファイル(環境設定ファイル全般)はGitHubで管理するといいのではないか - 雑木林</a></p> <h1 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h1> <p>皆さんは、出先にvimrcファイルがあれば良かったのに、という経験はありませんか?</p> <p>偶然にも、私はそんなことが何度かありました。</p> <h1 id="例1:インターンシップ"><a href="#%E4%BE%8B1%EF%BC%9A%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%83%E3%83%97">例1:インターンシップ</a></h1> <p>それは、とあるインターンシップでのことです。</p> <hr /> <p>回想はじめ</p> <p>偉い人「AWSサーバ1つあげるから、これで何か作ってください」<br /> 私「よっしゃいじり倒したろ、さてapacheの設定ファイルは......」<br /> 私「Vimの設定がデフォルトで全然使えん!!!」</p> <p>回想おわり</p> <hr /> <p>さて、私はこの時、偶然にもGitHubにvimrcファイルを置いていたため、クローンしました。<br /> するとどうでしょう、行番号も碌に表示していなかったVimに、命が吹き込まれたのです。</p> <p>私は、このインターンシップを大成功で収めることができました。</p> <h1 id="例2:新しい業務用パソコン"><a href="#%E4%BE%8B2%EF%BC%9A%E6%96%B0%E3%81%97%E3%81%84%E6%A5%AD%E5%8B%99%E7%94%A8%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3">例2:新しい業務用パソコン</a></h1> <p>それは、新しい業務用パソコンがたくさん届いた時のことです。</p> <hr /> <p>回想はじめ</p> <p>私「さて、環境構築するか」<br /> 新パソコンA「Vim無いよ」<br /> 新パソコンB「Vim無いよ」<br /> 新パソコンC「Vim無いよ」<br /> 私「......これ全部同じことしないとならんの?」</p> <p>回想おわり</p> <hr /> <p>さて、私はこの時、偶然にも(以下略)</p> <p>私は、たくさんの新しい業務用パソコンにいち早くVim環境を整えることができました。</p> <h1 id="例3:vimrc編集後"><a href="#%E4%BE%8B3%EF%BC%9Avimrc%E7%B7%A8%E9%9B%86%E5%BE%8C">例3:vimrc編集後</a></h1> <p>それは、突発的にvimrcファイルを書換えた時のことです。</p> <hr /> <p>回想はじめ</p> <p>私「ふへへ、ついに最強のvimrcを書いてやったぜ」<br /> 私「さて、これを私が利用している別のパソコンにも入れなきゃ」<br /> 私「えーっと、家のデスクトップ、家のノート、新パソコンA、新パソコンB、新パソコンC......」<br /> 私「......今日はそろそろ帰ろう」</p> <p>回想おわり</p> <hr /> <p>さて、私はこの時、偶然にもGitHubでvimrcファイルを管理していたため、新しいvimrcをpushしました。<br /> 別のパソコンを使う際にpullすればいいだけですから、その日は何も考えずに帰りました。</p> <p>数日後、別のパソコンを利用時にvimrcをpullするとどうでしょう、Vimが生まれ変わったのです。</p> <p>私は、常に最新のvimrcをどこでも利用できるのです。</p> <h1 id="おわりに"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</a></h1> <p>vimrcは便利ですが、慣れてしまうとデフォルトのVimが苦痛になってしまいます。<br /> いち早く自分の環境に(PCを)適応させるため、GitHubで環境ファイルを管理するのは1つの手だと思います。</p> <p>上記を活用して、快適環境の生活を過ごしませんか。</p> <h1 id="追記"><a href="#%E8%BF%BD%E8%A8%98">追記</a></h1> <p>GitHubで管理する前は、USBにvimrcを入れて生活していました。<br /> 書換えた時に面倒なことになるのは、お察しの通りです。</p> Morichan tag:crieit.net,2005:PublicArticle/16096 2020-10-04T23:16:13+09:00 2020-10-04T23:16:13+09:00 https://crieit.net/posts/GitHub-5f79d92de4c14 そのまま使えるGitHub事始め <p>本記事は、 Qrunch からの移転記事です。</p> <p>移転元: <a target="_blank" rel="nofollow noopener" href="https://morichan.qrunch.io/entries/TXygGMXlliMojzye">そのまま使えるGitHub事始め - 雑木林</a></p> <h1 id="何も考えたくないけどGitHubを使いたい方へ"><a href="#%E4%BD%95%E3%82%82%E8%80%83%E3%81%88%E3%81%9F%E3%81%8F%E3%81%AA%E3%81%84%E3%81%91%E3%81%A9GitHub%E3%82%92%E4%BD%BF%E3%81%84%E3%81%9F%E3%81%84%E6%96%B9%E3%81%B8">何も考えたくないけどGitHubを使いたい方へ</a></h1> <p>昔、誰でもGitHubを使えるように私が書いたREADMEもどきを発掘したので、それっぽく編集して上げておきます。</p> <p>この文章は、私の周りの新しいことが得意じゃない人たちにGitHubを使わせるべく書いたものです。<br /> 本質とか理由とかは抜きにして、この文章さえ読めたら使えるよう、本質から少しでも外れるものは除外しました。<br /> また、GitHubを使わせることが目的のため、Gitを使う際に最も恩恵を受けるはずのbranchの切替えやresetについては全く書いていません。</p> <p>これを読めば誰でもGitHubが使えるようになりますが、使えるだけで使いこなせるわけじゃないので気を付けましょう。<br /> 特に、最近はGUIベースのGitツールがたくさんあるので、わざわざCUIベースで使う利点があるのかどうかわかりません。<br /> でも僕がCUIベースのGitツールしか使ったことがないため、とっかかりにはいいんじゃないですかね? (適当)</p> <p>なお、既存のディレクトリをGitHubで管理したい人向けです。</p> <h1 id="使い方"><a href="#%E4%BD%BF%E3%81%84%E6%96%B9">使い方</a></h1> <p>事前条件は、以下の通りです。</p> <ul> <li>コマンドを利用できる (黒い窓に抵抗が無い)</li> <li>GitHubアカウントを作成済みである (作り方は調べてください)</li> <li>ローカルPCにgitコマンドを導入済みである (導入方法は調べてください)</li> </ul> <h2 id="GitHubの自分のアカウントで新しいリポジトリの作成"><a href="#GitHub%E3%81%AE%E8%87%AA%E5%88%86%E3%81%AE%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%A7%E6%96%B0%E3%81%97%E3%81%84%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E4%BD%9C%E6%88%90">GitHubの自分のアカウントで新しいリポジトリの作成</a></h2> <p>右上の自分のアイコンの隣の"+"ボタンを選択して、New repositoryを選べばいいと思います。<br /> ここで記述したリポジトリ名が後々に響きますので、ここは真面目に考えましょう。<br /> ここではhogehogeという素晴らしいリポジトリ名を付けたとします。</p> <h2 id="導入したいディレクトリに移動"><a href="#%E5%B0%8E%E5%85%A5%E3%81%97%E3%81%9F%E3%81%84%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%AB%E7%A7%BB%E5%8B%95">導入したいディレクトリに移動</a></h2> <p>ここではホームディレクトリ直下のhogehogeディレクトリを導入したいことにします。</p> <pre><code class="sh">cd ~hogehoge </code></pre> <h2 id="gitの確認"><a href="#git%E3%81%AE%E7%A2%BA%E8%AA%8D">gitの確認</a></h2> <pre><code class="sh">git --version </code></pre> <p>と打ってgitのバージョン情報が出てこなければ、gitを導入してください。<br /> また、ユーザ名やEメールアドレスも登録しておいてください。</p> <pre><code class="sh">git config --global user.name "User Name" git config --global user.email "[email protected]" </code></pre> <p>この時、今回導入したいディレクトリは別のアカウントで登録したい場合は、--globalを外しましょう。</p> <pre><code class="sh">git config user.name "The Other Name" git config user.email "[email protected]" </code></pre> <h2 id="リポジトリ化"><a href="#%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E5%8C%96">リポジトリ化</a></h2> <pre><code class="sh">git init </code></pre> <p>リポジトリ情報として、GitHub上で作成したリポジトリのURLを追加してください。<br /> 当然ですが、アカウントの名前は自分のアカウントを書いてください。</p> <pre><code class="sh">git remote add origin https://github.com/ユーザ名/リポジトリ名.git </code></pre> <p>hogehogeリポジトリをGitHub上で作ったMorichanさん(私です)であれば、次の通りです。</p> <pre><code class="sh">git remote add origin https://github.com/Morichan/hogehoge.git </code></pre> <hr /> <p><strong>古い方法</strong></p> <p>僕は上記でうまくいきましたが、幾つかのウェブサイトでは下記のように設定しているみたいです。</p> <pre><code class="sh">git remote add origin [email protected]:ユーザ名/リポジトリ名.git </code></pre> <hr /> <p>これでうまく行った方は教えてくださいね。<br /> ちなみに、設定は</p> <pre><code class="sh">cat .git/config </code></pre> <p>で見ることができます。<br /> うまく行かなかったときは</p> <pre><code class="sh">git remote rm origin </code></pre> <p>などで消して最初から書き直しましょう。<br /> もちろんconfigファイルを直に書き換えてもできるかもしれません。<br /> やったことがないのでわかりませんが自己判断でどうぞ。</p> <h2 id="ネット上のGitHubの情報をローカルに入手"><a href="#%E3%83%8D%E3%83%83%E3%83%88%E4%B8%8A%E3%81%AEGitHub%E3%81%AE%E6%83%85%E5%A0%B1%E3%82%92%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%81%AB%E5%85%A5%E6%89%8B">ネット上のGitHubの情報をローカルに入手</a></h2> <pre><code class="sh">git fetch </code></pre> <p>この時エラーとして、<code>fatal: Could not read from remote repository.</code>と出てきたら、リポジトリ化で設定したGitHub上のリポジトリのURLの設定が間違っている可能性が高いです。<br /> 書き直してあげてください。</p> <h2 id="masterブランチの導入"><a href="#master%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E3%81%AE%E5%B0%8E%E5%85%A5">masterブランチの導入</a></h2> <pre><code class="sh">git pull origin master </code></pre> <p>でmasterブランチが手に入ります。<br /> ちなみにpullする前に</p> <pre><code class="sh">git branch </code></pre> <p>と打っても何も出力されません。</p> <h2 id="gitの歴史にファイルの追加"><a href="#git%E3%81%AE%E6%AD%B4%E5%8F%B2%E3%81%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E8%BF%BD%E5%8A%A0">gitの歴史にファイルの追加</a></h2> <pre><code class="sh">git add -A </code></pre> <p>もし上記のコマンド、あるいは次のコマンドで何も書き換わってませんよということを言われたら、適当なファイル(README.mdなど)を書き換え(改行一つ追加でもいいよ)て、保存して同じコマンドしてください。</p> <p>最後にカラcommitをしてネット上に送り出せば終了です。</p> <pre><code class="sh">git commit --allow-empty -m "Pushしてやるぜ。" git push -u origin master </code></pre> <p>お疲れ様でした。</p> <h1 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h1> <p>こんな文章で理解した気になるのはやめましょう。</p> Morichan tag:crieit.net,2005:PublicArticle/16014 2020-07-21T08:27:14+09:00 2020-07-21T08:27:14+09:00 https://crieit.net/posts/GitHub-README GitHubのプロフィールにREADMEでアクセスカウンタを表示する <p>ちょっと前からGitHubのプロフィールにREADMEを表示できるようになったようです(2020/7/20現在)。僕も試してみてアクセスカウンタを表示してみました。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5f1593439747e.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5f1593439747e.png?mw=700" alt="" /></a></p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/dala00">https://github.com/dala00</a></p> <p>キリ番報告用の掲示板(issue)もあります。キリ番ゲットしたら絶対にスルーしてはいけません。</p> <h2 id="READMEの表示方法"><a href="#README%E3%81%AE%E8%A1%A8%E7%A4%BA%E6%96%B9%E6%B3%95">READMEの表示方法</a></h2> <p>プロフィールに表示するREADMEは、自分のユーザーIDと同じ名前のリポジトリを作ることで、そこに作ったREADMEを表示することが出来ます。作成しようとすると下記のような表示が現れます。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5f1593d66a1af.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5f1593d66a1af.png?mw=700" alt="" /></a></p> <p>赤くなっているのは僕が既に作成済みだからなので無関係です。あとはもしかしたらリリースされたばかりの機能のため、人によってはまだでないのかもしれません。</p> <p>これでリポジトリを作成したら、README.mdを作成すればプロフィールにそれが表示されます。</p> <h2 id="アクセスカウンタを表示する"><a href="#%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%AB%E3%82%A6%E3%83%B3%E3%82%BF%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B">アクセスカウンタを表示する</a></h2> <p>dev.toとかを見ると、色んな人が色々なREADMEを作って遊んでいます。僕も作成時の参考にしたのですが、 <a target="_blank" rel="nofollow noopener" href="https://github.com/ryanlanciaux/ryanlanciaux">@ryanlanciaux</a> さんのプロフィールは昔懐かしきWebを表現しています。</p> <p>この方のアクセスカウンターは、実はパラメータを変えれば誰でも使うことができるというシロモノです。とにかくすぐ試してみたい場合はこれを利用してみると良いでしょう。</p> <p><a target="_blank" rel="nofollow noopener" href="https://dev.to/ryanlanciaux/visitor-count-on-your-github-profile-with-one-line-of-markdown-593g">Add a visitor count on your GitHub profile with one line of Markdown - DEV Community</a></p> <p>ただし下記の技術記事を見る限りはオンメモリで値を持っているようですので、何か再起動のタイミングとかがあれば0に戻ってしまう可能性はあるのかもしれません。もしくはデータ保存型に修正済みかもしれませんが。</p> <p><a target="_blank" rel="nofollow noopener" href="https://dev.to/ryanlanciaux/quick-github-profile-visit-counter-14en">Quick GitHub profile visit counter - DEV Community</a></p> <h2 id="アクセスカウンタを作る"><a href="#%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%82%AB%E3%82%A6%E3%83%B3%E3%82%BF%E3%82%92%E4%BD%9C%E3%82%8B">アクセスカウンタを作る</a></h2> <p>自分で作る場合です。具体的には下記の方法です。</p> <ul> <li>値は適当に保存したり取得したりさせる</li> <li>動的に画像もしくはSVGを作る</li> <li>キャッシュを無効にする</li> </ul> <p>基本的には難しいことはしていません。キャッシュを無効にしないと、GitHub側で画像をキャッシュしてしまうため、キャッシュ無効のレスポンスヘッダを返して無効にします。そうすれば大丈夫みたいです。よくよく考えたらCIのバッジもキャッシュされず動的に変わってますね。元々不可能ではなさそうです。</p> <p>僕のプロフィールのリポジトリに一応サンプルのプログラムも置いてあります。適当です。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/dala00/dala00/blob/master/counter_sample.php">https://github.com/dala00/dala00/blob/master/counter_sample.php</a></p> <p>キャッシュでハマったのでなんやかんややっているうちにSVGになってしまいましたが、多分普通に画像でも行けるのではないかと思います……が試していないため分かりません。</p> <p>あとは先程の方がやっていたように、別にサーバーを持たなくてもGlitchで行けるのではないかと思いますがこちらも面倒で試していません(作り終わってからそっちでやればよかったと気づきました)</p> <p>ということで皆さんも色々試してみて下さい。</p> <h2 id="できないこと"><a href="#%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8">できないこと</a></h2> <p>多分iframe表示したりはざっと調べた限り、出来ないんじゃないかと思いますが試していません。画像で試行錯誤するしかないのかな……と今のところ思っています。何か面白いことができたらぜひ教えて下さい。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15810 2020-04-04T10:47:33+09:00 2020-04-04T15:57:22+09:00 https://crieit.net/posts/github-actions-build-lastmod hugoをgithub-actions上でbuildした際、lastmodの更新がすべての記事に適用される問題を解決した <h2 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://tech-wafter.net/2020/build-hugo-homepage-by-github-action/">hugoのジェネレートをGitHub-actionsを使って、pushするだけでデプロイできるようにした</a>のですが、全記事の最終更新日が更新されていたため原因調査をおこないました。</p> <h2 id="TL;DR"><a href="#TL%3BDR">TL;DR</a></h2> <ul> <li>gitのcloneを行う際に最新コミットしか取得していなかった</li> <li><code>actions/checkout</code>を利用する場合は以下の方法でfetchを行わせ、全履歴を取得しておく</li> </ul> <pre><code class="yaml">- uses: actions/checkout@v2 with: fetch-depth: 0 # Fetch all history for .GitInfo and . </code></pre> <h2 id="試したこと"><a href="#%E8%A9%A6%E3%81%97%E3%81%9F%E3%81%93%E3%81%A8">試したこと</a></h2> <h3 id="GitHub-actions上とlocalの比較"><a href="#GitHub-actions%E4%B8%8A%E3%81%A8local%E3%81%AE%E6%AF%94%E8%BC%83">GitHub-actions上とlocalの比較</a></h3> <div class="table-responsive"><table> <thead> <tr> <th align="center">icon</th> <th align="center">結果</th> </tr> </thead> <tbody> <tr> <td align="center">✅</td> <td align="center">更新対象記事のみlastmodが更新されていた</td> </tr> <tr> <td align="center">❎</td> <td align="center">すべての記事に対して更新が入っていた</td> </tr> </tbody> </table></div> <ul> <li>ローカル <ul> <li>✅MacOSでのビルド</li> <li>✅Vagrant内のUbuntu:18.04.4でのビルド</li> </ul></li> <li><p>CI環境</p> <ul> <li>❎Ubuntu:ubuntu-18.04でのビルド</li> <li>❎MacOS:latestでのビルド</li> <li>✅hugoのビルドを省いてデプロイ</li> <li>❎オプションを外してビルド</li> <li><p>❎既存のworkflowを使わずにコマンドでインストール(下記コマンドを実行)</p> <pre><code class="bash">wget https://github.com/gohugoio/hugo/releases/download/v0.68.3/hugo_0.68.3_Linux-64bit.deb sudo apt-get install -y ./hugo_0.68.3_Linux-64bit.deb </code></pre></li> </ul></li> </ul> <h3 id="git周りの確認"><a href="#git%E5%91%A8%E3%82%8A%E3%81%AE%E7%A2%BA%E8%AA%8D">git周りの確認</a></h3> <ul> <li>参照先のcommitIDが対象コミットのcommitIDになっているか <ul> <li>対象のコミットIDでした</li> </ul></li> <li><code>git log</code>の結果が正常に表示されているか <ul> <li><strong>CI上のログでは、1件しか表示されていなかった</strong></li> </ul></li> </ul> <h2 id="結果"><a href="#%E7%B5%90%E6%9E%9C">結果</a></h2> <p><code>actions/checkout@v2</code>という公式のworkflowを利用してgitのcloneを行っていたのですが、デフォルトでは最新のコミットしか取ってこないようです。<br /> 更新日時の参照先が見つけられなくなるため、すべての記事が最新のコミット更新日時を取得しに行ってしまったのだと思います。</p> <blockquote> <pre><code class="markdown"># Number of commits to fetch. 0 indicates all history. # Default: 1 fetch-depth: '' </code></pre> <p>https://github.com/actions/checkout#usage</p> </blockquote> <p>すべての履歴をcloneしてくることで、解決しました。<br /> GitHub Actionsのymlファイルでは、以下のように記載するようです。</p> <blockquote> <pre><code class="yaml">- uses: actions/checkout@v2 with: fetch-depth: 0 # Fetch all history for .GitInfo and . </code></pre> <p>https://github.com/peaceiris/actions-hugo#️-create-your-workflow</p> </blockquote> <h2 id="さいごに"><a href="#%E3%81%95%E3%81%84%E3%81%94%E3%81%AB">さいごに</a></h2> <p>最初はhugoのセットアップに使っているworkflowが悪いのかを疑ってたせいで、結構解決までに時間がかかりました…</p> <p>今回のような問題を早期発見するために、確認用のStepも入れたほうが良いのかなと思いました。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/actions/checkout">actions/checkout: Action for checking out a repo</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/peaceiris/actions-hugo">peaceiris/actions-hugo: GitHub Actions for Hugo ⚡️ Setup Hugo quickly and build your site fast. Hugo extended, Hugo Modules, Linux (Ubuntu), macOS, and Windows are supported.</a></li> </ul> matsu4ki tag:crieit.net,2005:PublicArticle/15728 2020-02-20T18:48:36+09:00 2020-02-26T17:42:55+09:00 https://crieit.net/posts/GitHub-Actions-MySQL-Laravel GitHub ActionsでMySQLを使ったLaravelのテストを実行する <p>GitHub ActionsでMySQLを使ったLaravelのテストを実行してみたら出来たのでメモ。</p> <p>アクションを作成する時にLaravelの雛形が選べるようなので、とりあえずそちらを使って作成する。雛形を下記のように置き換えた。</p> <pre><code class="yaml">name: Laravel on: [push] jobs: laravel-tests: runs-on: ubuntu-latest services: mysql: image: mysql:5.7 ports: - 3306 options: --health-cmd "mysqladmin ping -h localhost" --health-interval 20s --health-timeout 10s --health-retries 10 env: MYSQL_ALLOW_EMPTY_PASSWORD: yes MYSQL_DATABASE: laravel steps: - uses: actions/checkout@v2 - name: Copy .env run: php -r "file_exists('.env') || file_put_contents('.env', str_replace('DB_PORT=3306', 'DB_PORT=$<span>{</span><span>{</span> job.services.mysql.ports['3306'] <span>}</span><span>}</span>', file_get_contents('.env.example')));" - name: Cache vendor id: cache-vendor uses: actions/cache@v1 with: path: vendor key: $<span>{</span><span>{</span> runner.os <span>}</span><span>}</span>-vendor-$<span>{</span><span>{</span> hashFiles('**/composer.lock') <span>}</span><span>}</span> - name: Install Dependencies if: steps.cache-vendor.outputs.cache-hit != 'true' run: composer install -q --no-ansi --no-interaction --no-scripts --no-suggest --no-progress --prefer-dist - name: Generate key run: php artisan key:generate - name: Directory Permissions run: chmod -R 777 storage bootstrap/cache - name: Execute tests (Unit and Feature tests) via PHPUnit run: vendor/bin/phpunit </code></pre> <h2 id="やったこと"><a href="#%E3%82%84%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8">やったこと</a></h2> <p>下記が追加で編集したもの。</p> <h3 id="MySQLの設定"><a href="#MySQL%E3%81%AE%E8%A8%AD%E5%AE%9A">MySQLの設定</a></h3> <p>もともとはSQLiteでテストが行われる設定になっていたが、ちゃんとMySQLで実行したいのでその設定。まずはservicesにMySQLのサービスを追加。optionsはよくわからないがコンテナが落ちてしまうらしいので追加している。そのうち不要になるのでは。</p> <p>接続の設定は <code>.env.example</code> をコピーして使う。そのため、その設定に合わせてこのサービスのenvを設定する。具体的な設定はDockerHubのmysqlイメージのところに書いてある。</p> <p>ポートは <code>$<span>{</span><span>{</span> job.services.mysql.ports['3306'] <span>}</span><span>}</span></code> という感じでサービスのポートを参照できる。ホストはローカル。ただしlocalhostでなく127.0.0.1としないとつながらないっぽい。</p> <h4 id="phpunit.xmlの編集"><a href="#phpunit.xml%E3%81%AE%E7%B7%A8%E9%9B%86">phpunit.xmlの編集</a></h4> <p>phpunit.xmlにSQLiteを使う設定が書かれているので、そちらを削除する。</p> <h3 id="キャッシュの設定"><a href="#%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%81%AE%E8%A8%AD%E5%AE%9A">キャッシュの設定</a></h3> <p>vendorフォルダをキャッシュする。Cache vendorとInstall Dependenciesのところ。これでキャッシュされて次回から0秒になっているので多分大丈夫っぽい。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e4e55ac0e03c.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e4e55ac0e03c.png?mw=700" alt="image.png" /></a></p> <p>ちなみに下記がキャッシュ前。</p> <p><a href="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e4e55d2a2859.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/6e2af66c610d88bc766649f72032893a5e4e55d2a2859.png?mw=700" alt="image.png" /></a></p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>雛形もあるし非常に簡単だった。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/15707 2020-02-04T12:25:53+09:00 2020-02-08T21:35:09+09:00 https://crieit.net/posts/GitHub-GAS テキストエディタとGitHubでコード管理できるGAS開発環境を作る <h2 id="はじめに"><a href="#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB">はじめに</a></h2> <p>GASでの開発に取り組む中で、コードをテキストエディタで書き、Githubで進捗を管理したいなと思いました。</p> <p>普通にGASで開発する場合は、ブラウザからGoogleDriveのスクリプトエディタを起動してその中でコードを記述します。<br /> このブラウザ上で簡単に書けてすぐに実行できるという開発環境いらずなのがGASの良いところなのですが、<br /> このコードをローカルのテキストファイルとして作り、Githubを使って管理できたら良いなあと思ったわけです。</p> <p>僕の場合は<br /> - 以前に書いたコードと見比べたい時に、テキストファイルだと参照しやすい<br /> - Githubにコードを残してポートフォリオやメンターの方と共有したい<br /> - 以前Githubのプルリクを使って開発する流れを教わったので活用したい(行き当たりばったりの開発にならないように)</p> <p>そんなところから自分のやりやすいように開発環境を作ってしまえと考えてやってみた結果、<br /> 1. VSCodeでコードを作成・修正してGithubにpush<br /> 2. GASのscriptエディタでそれをpullして実行<br /> 3. 1に戻ってデバッグ</p> <p>という流れで作業をすることができるようになり、<br /> 例えば学習教材から学んだサンプルコードと見比べて吟味したりコピペしたり学びながらコードを書くのがとても便利になりました。</p> <p>正直この開発環境がベストプラクティスかどうかは怪しいですが、ノンプログラマの僕が最低限の使い方ができれば良し!という感じでやっています。<br /> 同じく最低限で使えれば良いよーという方は参考にしてみたらいただけたら嬉しいです。<br /> また、もっと良いやり方があるよーというのがあれば教えていただけると嬉しいです。</p> <h3 id="この記事の対象者"><a href="#%E3%81%93%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%AE%E5%AF%BE%E8%B1%A1%E8%80%85">この記事の対象者</a></h3> <ul> <li>GASを既に使っている方</li> <li>gitやGithubの基本的な使い方もある程度理解している方</li> </ul> <h3 id="使用ツール等"><a href="#%E4%BD%BF%E7%94%A8%E3%83%84%E3%83%BC%E3%83%AB%E7%AD%89">使用ツール等</a></h3> <ul> <li>Google Chrome(ブラウザ)</li> <li>VSCode(テキストエディタ)</li> <li><p>Github<br />  <br /> GASでのgithubとの連携にはChrome拡張機能を使用します。<br /> 前提として、以下のアカウント登録やインストールなどは先に済ませておきます。それぞれのやり方はここでは割愛。</p></li> <li><p>Githubのアカウントは登録済み</p></li> <li>GitをPCにインストール済み(<code>$ git --version</code>でバージョンが出ればOK)</li> </ul> <h2 id="開発環境づくり"><a href="#%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E3%81%A5%E3%81%8F%E3%82%8A">開発環境づくり</a></h2> <h3 id="1.プロジェクトフォルダとファイルの作成"><a href="#%EF%BC%91%EF%BC%8E%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%A8%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90">1.プロジェクトフォルダとファイルの作成</a></h3> <p>これから制作するプロジェクトのフォルダと、コードを記述するファイルを作っておきます。</p> <p>プロジェクトフォルダはどこに作っても大丈夫です(試しに作るならデスクトップで良いでしょう)。<br /> そしてその中に<code>main.js</code>という空のテキストファイルをjs拡張子で作成しておきます。<br /> (実際には拡張子は<code>.gs</code>なんですが、ここは<code>.js</code>に。理由は後ほど)</p> <p>※(余談)プロジェクトフォルダの名前や保存先は自由に決めて問題ないですが、あまり階層を深くしないのと、プロジェクトは一箇所(僕の場合は<code>Documents/Projects</code>)にまとめておき、その中にプロジェクトごとにフォルダを作るのが便利かなって思います。</p> <h3 id="2.ターミナルでgitの初期設定とGithubとの連携"><a href="#%EF%BC%92%EF%BC%8E%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%A7git%E3%81%AE%E5%88%9D%E6%9C%9F%E8%A8%AD%E5%AE%9A%E3%81%A8Github%E3%81%A8%E3%81%AE%E9%80%A3%E6%90%BA">2.ターミナルでgitの初期設定とGithubとの連携</a></h3> <p>ここから、<a target="_blank" rel="nofollow noopener" href="https://www.micknabewata.com/entry/github/vscode-sync-after-coding">参照リンク1</a>を大いに参考にさせて頂いてます。<br /> ターミナル(Mac)を起動してコマンドを打ち込んでいっても良いのですが、せっかくなのでVSCodeのターミナル機能を使ってみます。</p> <p>VSCodeを開いたら、「表示」タブから「外観>パネルを表示>ターミナル」もしくは「ターミナル」タブから「新しいターミナル」で開けます。これでターミナルも別窓にならないのでとても便利。<br /> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499640/97122f54-6533-f932-9c12-5987a0a0bca7.png" alt="スクリーンショット 2020-02-04 11.52.51.png" /></p> <p>さて、このターミナルにコマンドを打ち込んでいって、先ほど作成したプロジェクトフォルダに入ります。<br /> フォルダを作った場所によって違いますが、僕の場合は<code>Documents/Projects/(プロジェクト名)</code>がプロジェクトフォルダなので、</p> <pre><code>$ cd Documents $ cd Projects $ cd (プロジェクト名) </code></pre> <p>次にgitの初期化を行い</p> <pre><code>$ git init </code></pre> <p>GitHubとの連携のための初期設定を行っていきます。</p> <pre><code>$ git config --global user.name "ユーザー名を入力" $ git config --global user.email "メールアドレスを入力" </code></pre> <p>ダブルクォーテーション("")の中には、自分のGithubにアカウント登録しているユーザー名とメールアドレスを入力するようにします。エラーが出ないようなら成功。</p> <h3 id="3.Githubでリポジトリ作成"><a href="#%EF%BC%93%EF%BC%8EGithub%E3%81%A7%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E4%BD%9C%E6%88%90">3.Githubでリポジトリ作成</a></h3> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/">GitHub</a>にログインして<code>New</code>ボタンからリポジトリを作っておきます(ここでReadMeを作っておくと良いようですが僕はすっ飛ばしてしまいました)。</p> <p>リポジトリが完成したら、とりあえずHTTPSを選択(下の画像の赤丸)<br /> <code>…or push an existing repository from the command line</code><br /> の下の2行のコマンドをコピーしておきます。一番右のマークをクリックしたら一発でコピーできます。<br /> (下の画像の赤四角の部分)<br /> <img width="1025" alt="スクリーンショット 2020-01-30 21.54.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499640/b9b6e1da-d0f4-f242-53b6-dc89e3e4ae52.png"></p> <p>※(余談)ほんとはSSHを選択して鍵の作成や設定をしておくと安全だったりするっぽいのですが今回はHTTPSで。もうちょっと勉強しておきます。</p> <h3 id="4.リモートリポジトリの登録・コミットとプッシュ"><a href="#%EF%BC%94%EF%BC%8E%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E7%99%BB%E9%8C%B2%E3%83%BB%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%81%A8%E3%83%97%E3%83%83%E3%82%B7%E3%83%A5">4.リモートリポジトリの登録・コミットとプッシュ</a></h3> <p>ターミナルに戻り、一旦今の状態でコミット。<br /> コミットメッセージは最初はとりあえず"First Commit"とでもしておきます。</p> <pre><code>$ git add . $ git commit -m "First Commit" </code></pre> <p>次に、ローカルディレクトリにリポートリポジトリを登録します。<br /> 先ほど作成したGithubリモートリポジトリからコピーした2行のコマンドを入れます。</p> <pre><code>$ git remote add origin https://github.com/アカウント名/リポジトリ名.git $ git push -u origin master </code></pre> <p>するとユーザーネームとパスワードを聞かれるので、Githubのアカウントに使用しているものを入力します。</p> <pre><code>(上のコマンドを入力後の応答) Username for 'https://github.com': (Githubのユーザーネームを入力) Password for 'https://ユーザーネーム@github.com': (Githubのパスワードを入力) </code></pre> <p>もしパスワード入力に失敗したりしても、慌てずに<code>$ git push -u origin master</code>と入れれば再度入力できます。</p> <p>ユーザーネームとパスワード入力に成功すれば、見事リモートリポジトリの登録完了!</p> <h3 id="5.Chrome拡張機能の導入・GASでGithubと連携"><a href="#%EF%BC%95%EF%BC%8EChrome%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD%E3%81%AE%E5%B0%8E%E5%85%A5%E3%83%BBGAS%E3%81%A7Github%E3%81%A8%E9%80%A3%E6%90%BA">5.Chrome拡張機能の導入・GASでGithubと連携</a></h3> <p>次にGASのスクリプトエディタ側でGithubと連携し、push/pullをできるようにします。<br /> これにはChromeの拡張機能である「Google Apps Script GitHub アシスタント」を利用します。<br /> この導入には<a target="_blank" rel="nofollow noopener" href="https://qiita.com/20731057hh/items/7f76f9e53e9da5c85ae9">参照2</a>を参考にさせていただきました。</p> <p>導入は簡単で、まず<a target="_blank" rel="nofollow noopener" href="https://chrome.google.com/webstore/category/extensions?hl=ja">Chrome ウェブストア</a>から「Google Apps Script GitHub アシスタント」を検索してインストール(Chromeに追加)します。<br /> 次にGASのスクリプトエディタを開いて、<code>Login SCM</code>をクリックして、<code>username</code>と<code>password</code>を入力すればGithubと連携が完了です(<code>Repository</code>が選択可能な状態になっていればOKです)。<br /> <img width="844" alt="スクリーンショット 2020-01-31 17.21.18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499640/7c119fa4-470c-9fe8-17f4-383a3436112b.png"></p> <h3 id="6.GASでいったんpullしてみる"><a href="#%EF%BC%96%EF%BC%8EGAS%E3%81%A7%E3%81%84%E3%81%A3%E3%81%9F%E3%82%93pull%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">6.GASでいったんpullしてみる</a></h3> <p><code>Repository</code>タブから今回作成したGithubリポジトリを選択して、<br /> その右のほうにある⬇︎ボタンをクリックしてpullしておきます。<br /> <strong>(⬇︎がpull、⬆︎がpush)</strong></p> <p>ただ、そのままpullしようとしても上手くいきません。上部に「<code>There is nothing to pull</code>」とアラートが出てしまいます。</p> <p><code>Repository</code>の右の方にある歯車マークをクリックして、<code>File type to sync</code>の項目を<code>.js</code>に変更します。<br /> これはテキストファイルを作った時に<code>js</code>拡張子で作っていたためです。こうすることで<code>gs</code>ファイルとして読み込むことができます。</p> <p>これにより⬇︎をクリックするとちゃんとpullできるようになっています。</p> <p>以上で設定は完了です!わーい!</p> <h2 id="開発の流れ"><a href="#%E9%96%8B%E7%99%BA%E3%81%AE%E6%B5%81%E3%82%8C">開発の流れ</a></h2> <p>以降、</p> <ol> <li>VSCodeでコードを作成・修正してGithubにpush</li> <li>GASのscriptエディタでそれをpullして実行</li> <li>1に戻ってデバッグ</li> </ol> <p>を繰り返して開発を進めていきます。</p> <p>VSCodeでテキストファイルを読み込んで、実際にコーディングしていきましょう。<br /> ある程度コードを書いていき、ここらでGASで実行してみたいなーと思ったら、ターミナルでプロジェクトフォルダに入ってることを確認してから、</p> <pre><code>$ git add . $ git commit -m "(コミットメッセージを入力)" $ git push </code></pre> <p>続いてGASのスクリプトエディタ側で、⬇︎クリックでpullして、関数の実行なりアプリ公開なりしてみてください。<br /> しっかり「テキストエディタ&Github&GASのスクリプトエディタ」が連携しているはずです!!</p> <p>※(余談)コミットの管理とかプッシュはVSCodeの「ソース管理画面」なるものからクリックで直感的にできるようです。僕はターミナルを叩きたくて使ってませんが、そのやり方も<a target="_blank" rel="nofollow noopener" href="https://www.micknabewata.com/entry/github/vscode-sync-after-coding">参照リンク1</a>を参考にできそうです。</p> <h2 id="解説・補足"><a href="#%E8%A7%A3%E8%AA%AC%E3%83%BB%E8%A3%9C%E8%B6%B3">解説・補足</a></h2> <p>ただこのやり方、開発の際に注意しなければいけないのが、コンフリクトが起きないように気をつけることです。</p> <p>例えばデバッグする際にGASのスクリプトエディタ側のコードを修正してしまうと、テキストエディタで記述しているものと差異が生まれてしまいます。<br /> その都度push&pullするなら良いのですが、うっかり忘れがちなので結構面倒です。</p> <p>僕はひとまず<br /> <strong>「コードの修正は必ずテキストエディタの方で行う」</strong><br /> と決めて、GASスクリプトエディタでは基本的にコードを直接いじらないようにして回避しています(いじるとしたらあくまで関数の動作チェックのため)。</p> <p>そこがちょっと煩わしいのですが、一応今の所は不自由なく目的を果たしています。<br /> この辺上手く使いこなしている方がいれば、ぜひやり方を教えてください。</p> <p>また、テキストエディタはVSCodeに限る必要はなさそうなので、自身の慣れたテキストエディタでアレンジしてみても面白そうです。</p> <h2 id="あとがきMEMO"><a href="#%E3%81%82%E3%81%A8%E3%81%8C%E3%81%8DMEMO">あとがきMEMO</a></h2> <p>今回のやり方はさほど手間もかからずに1時間程度でできるし、自分の使い慣れているツール・やり方に落とし込む作業というのは、ハマればとても楽しいものですね。</p> <p>gitでのバージョン管理やGithubはこれまでも使っていたものの、調べて書いてある通りにやっていただけで実際によくわかっていなかったので、これを機に理解が深まった気がします。</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><p>参照リンク1<br /> <a target="_blank" rel="nofollow noopener" href="https://www.micknabewata.com/entry/github/vscode-sync-after-coding">【初心者向け】Visual Studio Codeで書いたコードをGitHubに公開する方法 - 鍋綿ブログ</a></p></li> <li><p>参照リンク2<br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/20731057hh/items/7f76f9e53e9da5c85ae9">GASをGitHubで簡単管理可能なChrome拡張機能 ~導入時に躓いたこと~ - Qiita</a></p></li> </ul> Massa tag:crieit.net,2005:PublicArticle/15292 2019-08-01T10:22:32+09:00 2019-08-01T10:22:32+09:00 https://crieit.net/posts/GitHub GitHubにブランチの自動削除設定が追加されたようです <p>GitHubにブランチの自動削除設定が追加されたようです。公式のブログはこちら。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.blog/changelog/2019-07-31-automatically-delete-head-branches-of-pull-requests/">Automatically delete head branches of pull requests</a></p> <h2 id="なぜ自動で削除するのか"><a href="#%E3%81%AA%E3%81%9C%E8%87%AA%E5%8B%95%E3%81%A7%E5%89%8A%E9%99%A4%E3%81%99%E3%82%8B%E3%81%AE%E3%81%8B">なぜ自動で削除するのか</a></h2> <p>例として以前下記のような記事を書きました。</p> <p><a href="https://crieit.net/posts/9c710ef2383a3703649ee712a9eb86e6">一人プルリクエストのすゝめ</a></p> <p>Gitでブランチを利用した開発をした場合、基本的にプルリクエストをマージした後はブランチを即削除するのがベストだと思います。残しておいてもたくさん並んでじゃまになるだけですし、どうしてももとに戻したい場合はもとに戻せばよいだけです。</p> <p>GitHubであればこんな感じですぐもとに戻せます。</p> <p><a href="https://crieit.now.sh/upload_images/9ba12108b5282c7abbdd9b24726b49bb5d423cdc9ded5.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/9ba12108b5282c7abbdd9b24726b49bb5d423cdc9ded5.png?mw=700" alt="" /></a></p> <p>ブランチは単なるコミットに対するタグ付けと同じですので、チームの運用ルールに従っていれば別に削除しようが戻そうが自由です。</p> <p>ということで、プルリクエスト後にボタンを押して毎回ブランチを削除していたのを単に自動にする、というだけですので、特に個人で開発しているリポジトリやOSSの場合だと何も支障はありません。</p> <p>業務の場合は一応チームで確認したり、テスト用リポジトリを作って試してみたほうが良いかもしれません。開発サーバー用ブランチのようなものを作って運用している場合もありそうですのでそういったものが削除されると厄介だと思います。</p> <h2 id="設定方法"><a href="#%E8%A8%AD%E5%AE%9A%E6%96%B9%E6%B3%95">設定方法</a></h2> <p>リポジトリの設定画面を開きます。</p> <p><a href="https://crieit.now.sh/upload_images/fa25abbcf8d96b1da083d1b1b36c222e5d423e3261731.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/fa25abbcf8d96b1da083d1b1b36c222e5d423e3261731.png?mw=700" alt="" /></a></p> <p>下の方に行くとMerge buttonの設定があり、その一番下に追加されているようです。</p> <p><a href="https://crieit.now.sh/upload_images/8dbe5882ddf04d520c0d48a7fe173b465d423e6e94f15.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/8dbe5882ddf04d520c0d48a7fe173b465d423e6e94f15.png?mw=700" alt="" /></a></p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/14714 2019-01-08T09:25:51+09:00 2019-01-10T10:53:57+09:00 https://crieit.net/posts/BitBucket-GitHub BitBucketからGitHubの無料プライベートリポジトリに引っ越した <p>GitHubのプライベートリポジトリが無料でも作れるようになりました! 無料で共有できるのは3人までですが、僕がやっているような個人開発は一人で使うことが多いため非常に嬉しいです。</p> <p>ずっとプライベートリポジトリとしてBitBucketを使っていましたが、重かったり使いづらかったりで不満はあり、GitHubを使いたかった気持ちはあったので、とりあえず一番頻繁に使っているCrieitのリポジトリをBitBucketからGitHubに引っ越ししてみました。</p> <h2 id="GitHubでプライベートリポジトリを作成"><a href="#GitHub%E3%81%A7%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%82%92%E4%BD%9C%E6%88%90">GitHubでプライベートリポジトリを作成</a></h2> <p>まずはGitHubにて空のプライベートリポジトリを作成しておきます。</p> <p><a href="https://crieit.now.sh/upload_images/c77afb0ecd7b69b6bbf9decc728760265c33ebc94f41a.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/c77afb0ecd7b69b6bbf9decc728760265c33ebc94f41a.png?mw=700" alt="Create a New Repository.png" /></a></p> <h2 id="各環境のremote参照を変更"><a href="#%E5%90%84%E7%92%B0%E5%A2%83%E3%81%AEremote%E5%8F%82%E7%85%A7%E3%82%92%E5%A4%89%E6%9B%B4">各環境のremote参照を変更</a></h2> <p>開発環境、本番環境など、Gitで参照しているremoteのURLを変更します。とりあえず現状のURLを見てみます。</p> <pre><code class="sh">$ git remote -v origin [email protected]:alphabrend/dev.git (fetch) origin [email protected]:alphabrend/dev.git (push) </code></pre> <p>URLを変更します。</p> <pre><code class="sh">git remote set-url origin [email protected]:dala00/crieit.git </code></pre> <p>再度確認してみると変更されていることがわかります。</p> <pre><code class="sh">$ git remote -v origin [email protected]:dala00/crieit.git (fetch) origin [email protected]:dala00/crieit.git (push) </code></pre> <p>実際にpushしたりする際にはGitHubの方にも鍵を登録しておく必要があります。ローカルはBitBucketにもGitHubにも登録しているかもしれませんが、本番環境は個別に登録していく必要がある場合が多そうです。</p> <p>諸々準備できたらpushすれば完成です。それぞれの環境でfetchしたりpushしたりを試してみてください。</p> <h2 id="草も移動するっぽい"><a href="#%E8%8D%89%E3%82%82%E7%A7%BB%E5%8B%95%E3%81%99%E3%82%8B%E3%81%A3%E3%81%BD%E3%81%84">草も移動するっぽい</a></h2> <p>多分ちゃんと草も移動してくれてるっぽい(?)です。</p> <p><a href="https://crieit.now.sh/upload_images/a217c5321557ae8aad29a5f0672d9d8d5c33ed510e610.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a217c5321557ae8aad29a5f0672d9d8d5c33ed510e610.png?mw=700" alt="contribution.png" /></a></p> <h2 id="WikiやPagesは使えない"><a href="#Wiki%E3%82%84Pages%E3%81%AF%E4%BD%BF%E3%81%88%E3%81%AA%E3%81%84">WikiやPagesは使えない</a></h2> <p>無料プライベートだとWikiは使えないみたいですね。メニューにありません。BitBucket側で色々な周辺機能をガンガン使ってる場合は移行しづらそうですね。あとGitHubでのダウングレードも注意が必要そうです。</p> <p>その他料金表で細かくは確認してください。</p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/pricing">Pricing · Plans for every developer</a></p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p><del>あとはCIとかも引っ越す必要がありますのでまた対応したら記事を書いていきます。</del> CIは単に新しいリポジトリのビルド設定を追加するだけで問題なさそうでした。</p> <p>Crieitはdev.toとQiitaを参考に作った、というところからdevという変なリポジトリ名になっていたのですが、この機会にちゃんとしたリポジトリ名にできたのも良かったです。</p> だら@Crieit開発者 tag:crieit.net,2005:PublicArticle/14604 2018-11-15T10:25:03+09:00 2018-11-16T16:55:42+09:00 https://crieit.net/posts/vim-tmux vimとかtmuxとかを使いこなそうとしない <p>Google Cloud Shellの中でやれることをやる。高価なPCやサーバーを用意しなくてもブラウザだけで従来の「プログラミング」をすることができる。評価の定まった本に書かれたコードを書いて実行できる。いま始める人のためにピッタリ。</p> <p>Google Cloud ShellにはWebエディターも用意されているけど複雑だから使わない。<br /> vimがインストール済みだからvimを使う。</p> <pre><code class="bash">$ vim index.html </code></pre> <p>ややこしいことは考えずに、<br /> <code>ESC</code>と<code>i</code>と<code>:q!</code>と<code>:qw</code>だけで十分使える。<br /> ESCキーの代わりに使える<code>ctrl + [</code> が便利。</p> <p>設定しなくても色が付いてるし、自動で閉じタグ書いてくれる。<br /> ただ、タブ幅が大きすぎるからvimrcファイルで設定する。</p> <p><code>~/.vim/vimrc</code>ファイルを置く、中身は3行。</p> <pre><code>source $VIMRUNTIME/defaults.vim </code></pre> <p>まずこれを書くこと。これがないとすっぴんで起動して、htmlのハイライトもされない。</p> <pre><code>set tabstop=4 set shiftwidth=0 </code></pre> <p>これでタブ1文字の表示がスペース4つ分になる。</p> <p>index.htmlを書いたら、プレビューする。</p> <p>Google Cloud Shellの「ウェブでプレビュー」は、インターネットからアクセスできるURLを用意してくれる。googleアカウントでログイン済みのアクセスだけをcloud shellの8080ポートへ通してくれる。<br /> ということで、8080ポートで待ち受けするWebサーバーを起動する。何を使ってもいいんだけど、インストールされててすぐ使えるからpython3。</p> <pre><code>$ python3 -m http.server 8080 </code></pre> <p>実行すると、画面から入力待ちのプロンプトが消えてWebサーバーのログが表示されるようになる。こうなるとvimが使えない。Webサーバーを起動したままで他のこともしたい。cloud shellの別のタブを使ってもいいけど、Google Cloud Shellはtmuxが導入済みで、こういう場面で役に立つ。</p> <p><code>ctrl + b, c</code>を押すと、「Wellcome to Cloud Shell」が表示される。さっきまでの画面は<code>ctrl + b, n</code>で戻れる。迷子になったときは<code>ctrl + b, w</code>で画面の一覧が出せる。</p> <p>これで、Webサーバーを起動させたままvimでhtmlファイルを編集できる。</p> <p>vimを終了させずにファイルを保存するには、<code>:w</code></p> あぜち(おばあちゃん) tag:crieit.net,2005:PublicArticle/14584 2018-10-25T12:36:02+09:00 2018-10-31T18:03:16+09:00 https://crieit.net/posts/React-Netlify-GitHub-GraphQL-TypeScript エンジニアライブを支える技術 ~ もしくは、React + Netlify + GitHub + GraphQL + TypeScript でイベント用のウェブサイトを作った話 ~ <p>エンジニアが出演する (音楽の) ライブイベントを企画したので、そのためのウェブサイトを作りました。</p> <p><a target="_blank" rel="nofollow noopener" href="https://engineer-live-tokyo.netlify.com" target="_blank">EngineerLiveTokyo</a></p> <p>これで利用したシステム構成が、短時間でそこそこ使いやすいサイトを作るのに使い回しの効きそうなものだと思うので紹介します。</p> <h2 id="エンジニアライブを支える技術"><a href="#%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%A9%E3%82%A4%E3%83%96%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93">エンジニアライブを支える技術</a></h2> <p>タイトルのまんまですが、技術スタック的な視点では以下の組み合わせで構築しています。</p> <ul> <li>React</li> <li>Netlify</li> <li>GitHub</li> <li>GraphQL</li> <li>TypeScript</li> </ul> <h2 id="React + Netlify"><a href="#React+%2B+Netlify">React + Netlify</a></h2> <p>まずサイトを手早く作るために <a target="_blank" rel="nofollow noopener" href="https://github.com/facebook/create-react-app" target="_blank">create-react-app</a> のテンプレートを元に SPA で画面を作っていきました。</p> <ul> <li>トップページ</li> <li>出演者一覧ページ</li> <li>出演者詳細ページ</li> <li>ニュース一覧ページ</li> <li>ニュース詳細ページ</li> </ul> <p>というシンプルな画面構成なので React を使えば (デザインは置いといて) 速攻で作れました。最終的にはペライチみたいなサイトでいいかなと思って出演者/ニュース一覧ページは無くしてしまいましたが。</p> <p>しかしここで特に「支える技術」として伝えたいのは Netlify のお手軽さで、Netlify を使うことで</p> <ul> <li>GitHub のブランチに更新を push したら CI でデプロイ</li> <li>SPA リロード時の404対策</li> <li>SPA の OGP 対策のための pre-rendering</li> </ul> <p>などを他の外部ツールに頼ることなく Netlify のみで一瞬で実現することができました。特に最後のものは、今回のエンジニアライブサイトのように各ページを LP としてシェアしてもらいたいようなサイトを SPA で構築するときに頭が痛い点の1つだと思うので、これがお手軽なのはかなりありがたかったです。</p> <p>そして小規模なウェブサイトであればフリープランで使えますし、うーん、とにかく良い…</p> <h2 id="GitHub issues as CMS"><a href="#GitHub+issues+as+CMS">GitHub issues as CMS</a></h2> <p>サイトを更新していく方法は色々ありますが、参加者の大半がソフトウェアエンジニアということで、GitHub の issues に記事などをポストするとそれがサイトのコンテンツに反映されるようにしました。</p> <p>エンジニアライブのサイトでは、定期的に更新されるコンテンツとして</p> <ul> <li>ニュース (お知らせや出演者の活動レポートなど)</li> <li>出演者情報</li> </ul> <p>の2つのカテゴリのページがあります。</p> <p>それぞれ、普通に GitHub の issue として内容を書いたらそれに <code>post</code> や <code>lineup</code> のラベルをつけると、対応するカテゴリのページとして実際にサイトに表示される仕組みにしました。フロントエンド側はリアルタイムに情報を GitHub から取得するので、GitHub 側でラベルを付けた issue を作成または更新すると即座にサイトにも反映されます。</p> <p>例えばニュースカテゴリのページを作りたかったら以下のように <code>post</code> ラベルをつけます。</p> <p><a href="https://crieit.now.sh/upload_images/b7658e62155e6d4cfa9bb337dd6c25565bd139d165d47.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b7658e62155e6d4cfa9bb337dd6c25565bd139d165d47.png?mw=700" alt="tech-stack-for-engineer-live-1.png" /></a></p> <p>GitHub を CMS として使うことで、普段使っているものと全く同じ感覚で markdown でコンテンツを入稿できて、ユーザー管理なども GitHub のものをそのまま使うことができるのが楽なところです。</p> <p>例えば「出演者情報ページでは写真が欲しい」といった理由から内容に一部レギュレーションを規定する必要はありましたが (必ず画像を入れてねみたいな) 、基本的には issue から取得した HTML をそのまま埋め込むだけなので markdown で表現可能などんな内容でも書くことができます。</p> <p>ただし、YouTube 動画を埋め込みたい要件があり、それがどうしても実現できなかったためにショートコード機能を追加しています。ショートコードというのは Hugo や WordPress にある機能で、特定の文法規則にしたがって記載しておくとそれが決まった形の HTML に展開されます。</p> <p>具体的には、issue 本文に</p> <pre><code>youtube xxxxxxx </code></pre> <p>と書いておくと (<code>xxxxxxx</code> は YouTube の動画 ID) 、それがサイト上では iframe の埋め込み動画として表示されるというものです。多少強引ですが、これはフロントエンド側で直接取得した HTML 文字列を変換することで対処しました。</p> <h2 id="GraphQL"><a href="#GraphQL">GraphQL</a></h2> <p>GitHub issues からのコンテンツデータの取得には GraphQL を使いました。</p> <p>REST API でも同じことはできますが、GraphQL を使うことで、シンプルな GET だけならほとんど API リファレンスなどを見なくても「必要な情報を必要なだけ得る」ためのクエリがすぐに書けるのはサッサと作りたい場面ではかなりありがたいです。今回のような「<code>post</code> ラベルがついた issue だけ取得したい」といった仕様を満たすのも簡単です。</p> <p>また、特筆すべき点として、GitHub は <a target="_blank" rel="nofollow noopener" href="https://developer.github.com/v4/explorer/" target="_blank">GraphQL Explorer</a> という GraphQL フロントエンド (GraphiQL) を用意してくれています。GraphiQL を使ったことがある方はわかると思うのですが、これが IDE 的な補完やドキュメント参照もその場でできる大変素晴らしく便利なやつです。</p> <p><a href="https://crieit.now.sh/upload_images/e8d092d2c14be7c91ab011e9a22ad5725bd139de6a3d5.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/e8d092d2c14be7c91ab011e9a22ad5725bd139de6a3d5.png?mw=700" alt="tech-stack-for-engineer-live-2.png" /></a></p> <p>前述した「ほとんど API リファレンスを見なくても…」というのにはこの GraphQL Explorer の存在が大きいです。</p> <p>GraphQL のクライアントには <a target="_blank" rel="nofollow noopener" href="https://www.apollographql.com" target="_blank">Apollo</a> を使いました。今回、実は最初に JavaScript で開発していたのを後から一気に TypeScript に書き換えたのですが、そのときも react-apollo を使っていると型定義の追加が簡単にできて型付けのための書き変えを難なく完了することができました。</p> <h2 id="TypeScript"><a href="#TypeScript">TypeScript</a></h2> <p>前節でも書いた通り、最初は JavaScript で開発をスタートしました。理由は単純で「JS をそのまま使う方が開発速度はきっと速いだろう」というものでした。</p> <p>が、最終的にはすべてを TypeScript で書き直しました。確かに JS の方がコード量は少なくなるのですが、開発中に結局 props を意識しないといけなくてそれがすぐにわからなくて悩むことや、静的型付けの方が結果的に細かいバグが減って開発効率も良かったためです。</p> <p>特に VSCode などの IDE 的なサポートが強いエディタで開発する場合には、TS の導入に大きな障害がないのであれば、ごく小規模なサイトを高速開発したいような場面でも最初から TS を使った方が良いかもしれません。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>実は、一番最初はこのサイトの作るのに自分の趣味を優先して <a target="_blank" rel="nofollow noopener" href="https://github.com/5t111111/EngineerLiveTokyo" target="_blank">Swift の Web Application Framework である Vapor を使ってフルスタックで作っていた</a>のですが、やっぱり色々時間がかかってしまったので、実益を取って React SPA + バックエンド CMS に切り替えた背景があります。React を用いて静的サイトになったことで Netlify を利用することもできたため、結果的には CI などの開発フローも含めて全体的な開発効率を大きく高めることができて正解でした。</p> <p>ただ、今回のようなシンプルな構成の場合に柔軟で高速な開発を行うには、どちらかというとバックエンドにこだわるよりはフロントエンドをデータ層と分離できていることが大事で、その上で適切に抽象化されたバックエンドとのインターフェースがあって楽に取り替えがきくことが重要であると感じています。</p> <p>そういう点で、コンテンツを更新していく仕組みは別になんでもいいと考えていて、GitHub じゃなくても NetlifyCMS や Contentful などのマネージドな Headless CMS を使ってもよいし、別にプレーンテキストのファイルでもクラウドストレージでも、手軽に更新できるものならなんでもよいでしょう。この辺りを突き詰めていくとプラガブルにデータソースを選択できる <a target="_blank" rel="nofollow noopener" href="https://www.gatsbyjs.org" target="_blank">GatsbyJS</a> を使うのが思想的にはマッチする気がしてきますが、記事更新のたびに静的サイトをビルドするのがちょっと面倒で今回は使いませんでした。</p> <p>まあ、今回高速開発が求められた理由というのが、単純にイベントそのものの準備もあってあんまり周りのシステムに時間をかけたくなかったことがありますので、もし次回があればせっかくの機会なのでもっと趣味を全開にして作ってみたいなと思います。とはいえ、躊躇なく CSS Grid Layout を使ったりできたのでストレス解消にはなりましたが…</p> <p>Lighthouse のスコアも、Web フォント使ってるところでパフォーマンスだけ満点取れなかったけどまあ十分かな。</p> <p><a href="https://crieit.now.sh/upload_images/b642158b0e3a31f1d4386c28a99f78685bd13a09a20c2.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b642158b0e3a31f1d4386c28a99f78685bd13a09a20c2.png?mw=700" alt="tech-stack-for-engineer-live-3.png" /></a></p> <p>最後に宣伝になりますが、エンジニアライブは <strong>2018/11/25 (日) に「真昼の月・夜の太陽」</strong> で開催します。僕は band.rb というグループで出演します。他にもエンジニアとして活躍中の方が多数出演するので、興味のある方は以下のページより参加をご登録ください!</p> <p><a target="_blank" rel="nofollow noopener" href="https://engineerlive.connpass.com/event/104979/" target="_blank">エンジニアライブ東京 #1 - connpass</a></p> WAKASUGI 5T111111