Beeeat’s log

Beeeat’s log

プログラミングで出くわした知識やツール、日常生活、働き方その他色々なことをメモしていくブログ

GitLab を コードリーディングするために Git LFS を入れる

大規模システムのコードを読んで勉強するために,GitLab を コードリーディングすることにしました.

gitlab.com

しかし,普通にgit cloneするだけでは,クローンすることができませんでした.

$ git clone git@github.com:gitlabhq/gitlabhq.git                                                                                      
Cloning into 'gitlabhq'...
remote: Enumerating objects: 1399, done.
remote: Counting objects: 100% (1399/1399), done.
remote: Compressing objects: 100% (1339/1339), done.
remote: Total 1502728 (delta 459), reused 759 (delta 34), pack-reused 1501329
Receiving objects: 100% (1502728/1502728), 733.90 MiB | 10.26 MiB/s, done.
Resolving deltas: 100% (1146442/1146442), done.
git-lfs filter-process: git-lfs: command not found
fatal: the remote end hung up unexpectedly
warning: Clone succeeded, but checkout failed.
You can inspect what was checked out with 'git status'
and retry the checkout with 'git checkout -f HEAD'

エラー内容にgit-lfs filter-process: git-lfs: command not foundとあったので,Git LFS を導入した上でgit cloneをしてみます.

Git LFS とは?

Git Large File Storageの略で大規模のファイルを管理する時に便利なツールのようです.

git-lfs.github.com

インストール方法

Homebrew でインストールします.

$ brew install git-lfs
$ git lfs install

バージョンを確認します.もし,バージョンが表示されない場合はPCを再起動してから確認してみてください.

$ git lfs version
git-lfs/2.10.0 (GitHub; darwin amd64; go 1.13.6)

もう一度クローンしてみる.

さて,これで Git LFS はインストールされたので,エラーにあったgit-lfs filter-process: git-lfs: command not foundが解消されたかと思います.

気を取り直してもう一度 GItLab をgit cloneしてみましょう!

少し時間は掛かりますが,クローンすることができると思います.

$ git clone git@github.com:gitlabhq/gitlabhq.git                                                                                      
         clone ssh://git@gitlab.com/gitlab-org/gitlab.git -> /Users/ユーザ名/projects/gitlab.com/gitlab-org/gitlab
           git ls-remote ssh://git@gitlab.com/gitlab-org/gitlab.git
           git clone ssh://git@gitlab.com/gitlab-org/gitlab.git /Users/ユーザ名/projects/gitlab.com/gitlab-org/gitlab
    Cloning into '/Users/ユーザ名/projects/gitlab.com/gitlab-org/gitlab'...
    remote: Enumerating objects: 114060, done.
    remote: Counting objects: 100% (114060/114060), done.
    remote: Compressing objects: 100% (10205/10205), done.
    Receiving objects: 100% (1889852/1889852), 738.19 MiB | 684.00 KiB/s, done.
    remote: Total 1889852 (delta 110480), reused 104393 (delta 103838), pack-reused 1775792
    Resolving deltas: 100% (1478442/1478442), done.
    Checking out files: 100% (28689/28689), done.

これで手元の PC に GitLab のソースコードが手に入りました! Zip でダウンロードするやり方もありますが,利用しているエディタが VS Code の場合,「gitlink」という拡張機能があります.

marketplace.visualstudio.com

この拡張機能にある 「goto online link」 という機能を使えば,下記のように GitLab 側のソースコードを経由してマージリクエストを見ることができるので,やはりgit cloneした方が良いのかなぁと思いました.

f:id:bake0937:20200217233042p:plain

まとめと所感

Git LFS を導入し,手元の PC に GitLab をgit cloneすることができました.Git LFS は名前だけ聞いたことあるレベルだったので実際に使う機会ができて良かったです.

さぁここからですね!GitLab は Rails で作られており, Vue.js も採用しているようです!頑張って読んでみるぞ!!!

プログラミング言語のタイピング練習ができる「Speedcoder」の紹介

f:id:bake0937:20200210232249p:plain

最近,コードを書いている時にタイピングスピードをもっと上げたいと感じてきました.

タイピングの練習といえば「寿司打」ではあるのですが,寿司打は基本的に日本語のタイピング練習のため,普段書いているソースコードのタイピングのスピードを上げる練習はできないものかと悩んでいました.

typing.sakura.ne.jp

「Speedcoder」でプログラミング言語のタイピング練習ができる!

色々探してみたのですが,「Speedcoder」というサイトがとても良さそうでした.

www.speedcoder.net

様々な言語のタイピングの練習ができます.

私はよく Ruby で練習をしてます.

f:id:bake0937:20200210233312p:plain

↓のような感じで入力する際の指のガイドやタイピングのスピードを計測してくれます. f:id:bake0937:20200210233526p:plain

なんと練習したいソースコードをアップロードすることもできます!!! f:id:bake0937:20200210233715p:plain

まとめと所感

プログラミング言語のタイピング練習ができる「Speedcoder」について紹介しました.

エンジニアとして生産性を上げるにはタイピングスピードはとても重要だと感じています.「Speedcoder」1日1回練習すれば一年後にはタイピングスピードはかなり向上しそうだなぁと思いました.

コツコツコツコツやっていこうと思います.

コミットメッセージを改行する方法

GitHub 上でファイルを修正し,commit する際は以下のようにコミットメッセージに加えて説明文を書くことが出来る.実はこれ,GitHubだけしかできない機能ではなく, git コマンドでコミットする時に可能である f:id:bake0937:20200203223744p:plain

コミットメッセージを改行する方法

どんなやり方をするかという簡単で以下のように,git commit -m "コミットメッセージ1"の後にさらに-m "コミットメッセージ2"を追加すれば良い,ちなみに,さらに-m "コミットメッセージ3"で繋げるとさらに改行できる.

$ git commit -m "コミットメッセージ1" -m "コミットメッセージ2"

まとめと所感

今回はコミットメッセージを改行する方法をまとめてみた.こちらのコマンドも日常でほぼ毎日使うコマンドになるため,当たり前な状態になりつつあるがまとめてみた.

うう,早く部屋の掃除を完了させてもっとブログに力を入れねば...

ブランチ名を意識しないで git push する方法

普段開発する時に今まではブランチ名を頭で記憶して,git push origin ブランチ名で push していた. しかし,途中で忘れていること場合は何度も調べ直したりして効率が悪い.

git push の後に,さらに git コマンドを実行する

以下のように,git push origin の後に自分が現在チェックアウトしているブランチ名を表示するコマンドを実行すれば良い

$ git push origin $(git rev-parse --abbrev-ref HEAD) 

まとめと所感

今回はブランチ名を意識しないで git push する方法についてまとめた.今回の内容は今まで一番小さい小ネタだがほぼ毎日使うため,メモとして残してみた.

Ruby のコードで見かける「&.」は safe navigation operator (ぼっち演算子)と呼ばれる演算子だった

 普段の業務で Ruby のコードを読んでいると,何箇所かobject&.fooという書き方を見かけました.

初めて見た時は「まぁこういう書き方もあるんだなぁ」とさらっと読んでいましたが,後々,「あれ?結局これどういう意味なんだろ?」と混乱したため今回はこの「&.」とは何かについてまとめていきます.

「safe navigation operator (ぼっち演算子)」

調べてみた結果,「&.」は「safe navigation operator 」と呼ばれる演算子でした. Ruby 2.3.0 がリリースされた時に導入されたメソッドのようです.

www.ruby-lang.org

Ruby の公式ドキュメントを読むと,「ぼっち演算子」とも呼ぶようです...(公式のリファレンスでの名称なんですね...)

docs.ruby-lang.org

「&.」の機能は公式リファレンスを見てみると...

object&.foo という形式のメソッド呼び出し形式が追加されました。
これは object が nil でないときにメソッド foo を呼び出します。

とのことでした.つまりどういうことでしょう?

実際に書いて試してみる

ということで,試しにコードを書いてみました.以下は,Human オブジェクトでgreetingメソッドを実行し,コンソール上に文字列を表示するコードです.まずは「&.」を使わずに実行してみます.

class Human
  def greeting(name)
    puts "こんにちは#{name}さん"
  end
end

obj = Human.new
name = "okabeeeat"
puts obj.greeting(name)

なんてことなく文字列が表示されました.

~ » ruby sample.rb
こんにちはokabeeeatさん

次は,objの値をnilにしてみましょう.

class Human
  def greeting(name)
    puts "こんにちは#{name}さん"
  end
end

-- obj = Human.new
++ obj = nil 
name = "okabeeeat"
puts obj.greeting(name)

予想通り,NoMethodErrorとなります.

~ » ruby sample.rb
Traceback (most recent call last):
sample.rb:9:in `<main>': undefined method `greeting' for nil:NilClass (NoMethodError)

それでは,objnilの状態で「&.」を使ってgreetingメソッドを実行してみましょう.

class Human
  def greeting(name)
    puts "こんにちは#{name}さん"
  end
end

obj = nil
name = "okabeeeat"
-- puts obj.greeting(name)
++ puts obj&.greeting(name)

なんとNoMethodErrorが発生せずに終了しました.公式リファレンスの内容を引用すると,objnilの場合はgreetingメソッドを実行せずに処理が終了したことになります.

~ » ruby sample.rb

どんな場面で使えるのか?

動きはこれでわかりましたが,はたしてどんな時に役に立つのかを考えてみました.

一言で言うとnilをチェックする処理を実装する書く手間が省けることが挙げられます.開発するプロダクトによっては,特定の条件で object がnilになることを考慮して,object の値がnilかどうかをチェックする処理を書く場合があります.

そこで,今回調べた「&.」を利用すると object がnilの場合ならメソッドを実行しないで済むため,object がnilになることでの Error が発生せずに済みます.

まとめと所感

今回は「&.」,「safe navigation operator (ぼっち演算子)」について調べてみました.調べる前は「&.」がなんて呼ばれるものなのかわからず調べるのに少し苦労しましたが,何とか調べることができて良かったです.

「&.」はもっと使い所がある演算子だと思うので,どんな時に役立つかをもう少し意識して,コードを書いてみようと思います.

他にも Ruby を書いてて気になる文法があるので,今回の記事のように気になったら随時まとめていこうと思います.

Puppeteer で Basic 認証が掛かったページにアクセスする方法をまとめてみた

先日 Jest + Puppeteer の導入が完了した.その過程で Basic 認証が掛かったページに対して E2E テストを実行する必要があった.そのため,Basic 認証が掛かったページにアクセスする方法を調べ,対応したのだが,想定よりも時間が掛かったためまとめておく.

設定方法

調べた所,2つの方法を見つけた.

page.authenticate を利用する方法

公式ドキュメントにある page.authenticate を使って Basic 認証のユーザとパスワードをセットし, page.goto でページにアクセスする.

await page.authenticate({username: 'Basic 認証のユーザ名', password: 'Basic 認証のパスワード'});
await page.goto('Basic 認証が掛かったページのURL', {waitUntil: "domcontentloaded"});

実際は,Basic 認証のユーザとパスワードをハードコーディングするのではなく,以下のように定数を利用した.定数は dotenv をインストールし,.env ファイルで値を設定した.

require('dotenv').config();

await page.authenticate({username: process.env.USER, password: process.env.PASS});
await page.goto('Basic 認証が掛かったページのURL', {waitUntil: "domcontentloaded"});

page.setExtraHTTPHeaders を利用する方法

page.setExtraHTTPHeaders を利用する方法も見つけたため,試してみた.この方法でもページにアクセスすることが確認できた.

await page.setExtraHTTPHeaders({ Authorization: `Basic ${new Buffer.from(`${'Basic 認証のユーザ名'}:${'Basic 認証のパスワード'}`).toString('base64')}`});
await page.goto('ベーシック認証が掛かったページのURL', {waitUntil: "domcontentloaded"});

最初は Buffer() を使って Basic 認証の設定をしていたが,実行すると以下のように Buffer() は非推奨である旨がコンソールに表示されたため,代わりに Buffer.from() を使っている.

DeprecationWarning: Buffer() is deprecated due to security and usability issues. Please use the Buffer.alloc(), Buffer.allocUnsafe()
, or Buffer.from() methods instead.

どちらのメソッドを利用すれば良いの?

どちらのメソッドを利用しても Basic 認証が掛かったページにアクセスすることがわかった.そのため,どちらを使うかは実装者の判断で決めれば良いと思う.

私の場合はpage.authenticateを利用する方法を採用した.理由としては,公式ドキュメントの説明文を見たところ page.authenticate はHTTP認証の情報を提供するために用意されたメソッドである旨が書いており,こちらを利用した方が目的と合致していると思ったからだ.

まとめと所感

今回は,Puppeteer で Basic 認証が掛かったページにアクセスする方法についてまとめてみた.知ってしまえば何てことない内容だが,それ故に想定より時間が掛かったため色々悔しかった(まぁ,他に Typo とか色んな理由もあったけど).

Jest + Puppeteer の導入は完了したが,テストケースはまだまだ足りないため,これから他のタスクと併行して増やしていく.

Advent Calendar を作ってから埋まるまでに学んだことについて LT しました

この記事は マイナビ Advent Calendar 2019 25日目の記事となります.

23日に開催された「エンジニアの成長を応援する忘年LT大会2019」で LT 登壇しました.イベントでは参加者の皆さんと一緒に今年を振り返ることができ,充実した時間を過ごすことができました.

LT では私が所属企業の Advent Calendar を作成し,枠が埋まるまでに学んだことについてお話しました.

今回は,登壇した資料についての補足や登壇してみての所感などについてまとめていきます.

「Advent Calendar を作ってみたけど中々埋まらなかった」,「来年は所属企業の Advent Calendar を作ってみたい」という方に少しでも参考になれば嬉しいです.

engineers.connpass.com

登壇資料

Advent Calendar はすぐに埋まるとは限らない

f:id:bake0937:20191225203003p:plain

Advent Calendar の文化が醸成されている企業はカレンダーが作られたら,早い者勝ちで枠が埋まるかと思います.

しかし,現在私が所属しているマイナビは,今年からエンジニアブログやテックイベントなど社外へ技術発信する手段を増やしてきた状態.つまりアウトプットの文化は醸成している最中です.

そのため,沢山のメンバーが参加し,様々な内容の情報発信をするには,参加してもらうまでの過程で少し工夫を加える必要があると考えました.

全然埋まってねぇ!!

f:id:bake0937:20191225203029p:plain

社内の知り合いや書いてくれそうな人から個別に声を掛けてみましたが,11月の下旬でまだこのレベルの埋まり具合...流石にヤバいと感じました(枠を必ず全部埋めることが正解ではないかもしれませんが...).

Advent Calendar を作ったのは私のため,残りの空いた枠は私が全部埋めることも考えましたが,これだとカレンダーの枠が半分以上が私になり,それはそれでどうなんだろう...と悩んでいました.

「なぜ埋まらないのか?」を考える

f:id:bake0937:20191225203120p:plain

「うわぁぁ参加者少ない...もうウチはダメなんだぁ〜」と考えるのはまだ早いと判断し,一旦自分が取り組んだことを振り返り,原因が何かを考えてみました.

個別に声を掛けるのと併行して,もっと早く全体に告知すれば良かったというのが大半の理由だと思いましたが,個別に声を掛けた時に Qiita の Organization の参加方法や Advent Calendar の参加方法について何個か質問されたのを思い出しました.

そのため,これから告知をする時は単に「Advent Calendar 作りました〜 登録お願いします〜」という簡素な内容ではなく,「Advent Calendar とは何か?」についての説明や魅力,参加するまでに必要な手順含めて告知し,Advent Calendar を初めて知った人が参加できるように工夫しました.

そして,声を掛けた時に一番受けた「ネタに困っている」という相談.ここに関しては,社内で各々が今までに投稿した社内ブログや Wiki の記事を今回用に少し書き換えて投稿する提案をしました.

これは Advent Calendar に限らず,個人のブログやエンジニアブログのネタ切れ問題を解決する方法の一つにもなります.

この時に社内で利用している DocBase の記事数を確認したのですが,記事数が 3000 を越えているのにはかなり驚きました(社内用の記事も含めてにはなりますが...).これから投稿する記事のネタには困らない...はず!.

ついに枠が埋まった!!

f:id:bake0937:20191225210030p:plain

Slack で告知後は参加者の何人かに告知文のリマインドをお願いしたり,引き続き知り合いが通り掛かったら声を掛けてみるようにしました.

役職・職種関係なく声を掛けていたので事業部長にも声を掛けていました笑.そうすると次第に参加者が増えていき,12月の第一週の後半ぐらいには全部の枠が埋まりました!

Advent Calendar から学んだこと

f:id:bake0937:20191225212456p:plain

作った直後は「え?適当に告知したらすぐ埋まるでしょww」というような気持ちでいましたが,Advent Calendar を作ってから埋まるまでの過程を通して,参加者をどのように集めるかや協力の仰ぎ方,巻き込み方などを身を持って経験することができました

今回経験したことは,これから新しい技術や制度・文化を組織やチームに導入する時にも活きていくと感じました.

発表中

会場は合同会社 DMM.com さんのイベントスペースでした!めちゃくちゃオシャレで東京タワーも一望できて最高でした.

LT 登壇中は参加者の皆さんから良い感じにリアクションを頂き,話しやすくて助かりました.また実況ツイートも頂き,登壇後のフィードバックにもなったためとても嬉しかったです.

まとめと所感

「エンジニアの成長を応援する忘年LT大会2019」で LT 登壇しました.一時はどうなるかと思いましたが,「Advent Calendar へ参加する文化を醸成した企業でも,最初に誰かが導入したという段階が必ずある」と考えると,その「導入の段階」を経験できたのは貴重だと感じました.

Advent Calendar の枠が無事全部埋まったといっても今回は私が 4 枠入れていたりもするので,次回は参加者(ユニーク)25人による様々な技術や知見を発信する Advent Calendar になることを目指します💪

懇親会では,参加者の皆さんの今年の振り返りを共有することができ,来年の目標の決めるためのヒントを沢山見つかりました.参加者・スタッフの皆さん,ありがとうございました!

最後になりますが,マイナビアドベントカレンダーはこちらです.

qiita.com