むにえる牧場

毎日むにえるをつくっています

brew bundleを利用してHomebrewで管理したアプリを一括でインストールする

はじめに

Macユーザーならほぼ全員が利用していると思われるHomebrewのちょっと便利な brew bundle コマンドについて紹介します。
Macのお引越しをする際や、他人に入れているアプリを共有するときなどなど結構便利です。

Homebrew

brew.sh

すでにご存知かもしれませんが、Mac用のパッケージ管理ソフトです。
Homebrewを利用すれば、Macで利用するアプリのほぼすべてをHomebrewを介して管理できます。
install, uninstall, updateといろいろできて便利です。

個人的にはHomebrewを介さないでアプリを入れたくないほどに……

brew bundle dump

$ brew bundle dump

とterminalにてコマンドを入力すると、Homebrewで管理しているアプリを Brewfile に書き出すことができます。

brew bundle

$ brew bundle

とterminalにてコマンドを入植すれば、 Brewfile に一覧されているアプリを一括でインストールできます。

そして.dotfilesに

BrewfileGitHubなどなどで管理しておけばいつ何時Macが故障してもすぐに開発環境を構築できます。
私の Brewfile は今こんな感じ

github.com

おわりに

小ネタです……
ブログのあり方というか書き方をちょっと悩みつつあります。
とりあえず続けることが大事という意識です。

転々々職して3か月経過した

はじめに

転々々職をして3か月経過しました。
3週間、3か月、3年なんてところに壁があると聞きますが、その壁を2つ乗り越えたのでそろそろ転職記事なるものを書こうと筆をとった次第です。

who am i

そもそもお前は誰なのかということで、まずはTwitterがこちら

twitter.com

  • 93年生まれの26歳
  • 情報系大学卒
  • ゲームをするのが大好きで7,8年くらいずっとLeague of Legendsをプレイしている
  • 大雑把な言語遍歴: Java -> C# -> PHP
  • 多摩地区在住

新卒就職

日付をしっかりと覚えてないが、大学3年の秋(?)冬(?)頃にサポーターズというサービスを利用してモバイルゲーム開発/運営会社のA社に内定をいただいた。

supporterz.jp

それから大学4年の6月から早期出社という形式で週3,4日ペースでアルバイトをさせてもらった。
入社してからはUnityでのゲーム開発業務をさせてもらった。
学生時代にはUnity触ってないし、C#も書いたことないということで不安だらけだったが、C#の記法が比較的Javaと似ていたのもあってなんとかついていけた。
あと学生時代に、下記の本を利用してゲーム開発のいろはを学んで自分で開発していたのがとても役に立った。

Androidゲームプログラミング A to Z

Androidゲームプログラミング A to Z

A社では、

  • リリース済みのモバイル向けゲームの運用および新規機能開発
  • 完全新規ゲーム開発
  • 新卒採用周りの職務
  • 社内勉強会の運営

といろいろなことをさせてもらった。
アジャイル開発のいろはも学べた。所謂モダンな開発現場だった。社内Slackも盛況で部活動のようなものも盛んだったと思う。
今現在は組織が変わっていろいろと大変みたいな話を聞くが、とても良い環境だったと思う。

しかし、A社は2年半程度で辞めてしまった。
理由としては3つ程度ある。
1つ目はプライベートがいろいろ大変だったこと。
彼女と同棲していたのだが(今もしている)、あまり身体の調子がよろしくなく女性特有の病気にもなってしまっていた。
今でも病気への付き合い方は難しいなーと感じているが、当時は全然余裕がなくて仕事に行くのはギリギリもしくは遅刻してしまうし、土日はほぼ寝て過ごすという感じだった。
平日は残業から帰ってきてストレス発散にゲームをする→しかし対人オンラインゲームで上手く勝てずにストレス溜まるみたいな悪循環だった。

2つ目は通勤経路が長かったこと。
A社には中央線で通っていたのだが、中央線の端から端へ通うというような感じだった。
混雑状態もストレスになるし、仕事で疲れた後に通勤というハードルがある。
なら会社近くに引っ越せばいいのにとなるが、同棲という制約があって動きづらかった。(自業自得のような気もしている)

3つ目は技術的に追いつけてないという不安感が日に日に高まっていたということ。
A社の同期エンジニアはめちゃくちゃ優秀な人ばかりだった。ゲームジャムとか頻繁にやってるし、仕事でのコミット量も圧倒的に多いし……と当時は劣等感マシマシだったのを覚えている。
自宅で勉強して追いつこうと思っていたが、1つめ2つめの問題があって余裕がなくて全然やりたいことができなくてさらに高まる劣等感……という感じだった。
一応他の部分で成果出せればと思ってアジャイル開発のいろはを学び直したり、他の人がやりたがらないことを積極的にやったりしたが、焼け石に水という感じで自身の気持ちはあまり晴れなかった。

ということが積み重なって退職に至った。
プロジェクトが変わって環境変化があったのも原因の1つかなとは思うが、基本的には自身に問題があったのかなと思っている。

1回目の転職

A社を退職してからしばらく休んで気力が回復してから転職活動をした。
この転職活動では、マイ●ビやリク●ビのような大手サービスとハロー●ーク経由で転職活動をした。

そして自宅から近かったB社に入社した。
当時はあまり深く理解できていなかったのだが、所謂SIer下請けのSES会社だった。
N●●とかパチ●ロ基盤系のお仕事とかが多かった。

川●の客先に常駐してのお仕事だったのだが、

  • パイプ椅子
  • インターネットに繋げないどころかイントラネットすらない
  • 誰が何の仕事してるかわからないし聞いても教えてもらえない
  • バージョン管理はファイル名
  • 1個だけ存在するUSBメモリでコードがやり取りされる
  • 紙駆動手動テスト

と結構レガシーな感じだった。
プロダクトそのものはそこまでレガシーではなくて、Cordovaを利用してのタブレット型注文アプリのようなものをつくっていた。
全然触ったことなかったが、仕事そのものは比較的楽にこなせていたと思う。
現場の社員の方に「君みたいにコードばりばり書ける人は社内だと1,2人くらいしかいないよ」みたいなことを言われて、本気か……?となった。

通勤もかなり遠くて、乗り換え乗り換え乗り換えからのバスで片道1時間30分〜2時間程度だった。
1時間超えると途端にしんどさが増す。

結局こちらの会社は3か月程度で退職に至ったのだが、レガシーかつしんどい環境に嫌気がさしてしまったのともう1つ
社員の方から「この会社には成長しようという考え方の人はいないよ」というようなことを言われてしまったこと。
ただでさえ変化の激しいIT業界でレガシーなことやってて、その上成長思考がないと聞いたら不安要素がたっぷりだった。
もともと不安駆動というか、マイナス思考な部分が多いので決定的だった。

2回目の転職

B社にいながら当時流行っていたTwitter転職活動をしていた。
某ひよこアイコンの人のハッシュタグとか、Twitter転職みたいなタグを使ってやっていた。
ありがたいことに10数社の方から声をかけていただいて、いろいろな会社を訪問させていただいた。

これと同時に技術書典とか、podcastにも手を出していた。
しがないラジオが環境的に被っていたのでエピソード1から全部聞くレベルだった。
(今でも聞いています。 そのうち喋らせてください )

shiganai.org

そして都心にある規模が小さめのモバイルゲーム会社に内定をいただいて入社した。
残念ながらこちらのC社は全然続かなくて1,2か月程度で辞めてしまった。
各所に迷惑をかけてしまって反省している。

当時は焦りやら、疲れやら、なんやかんやで判断が鈍っていた……と思う。
言い訳のようになってしまうが、

  • オンボーディングのような仕組みがなかった
  • C社で利用している技術に馴染みがなかった
  • 通勤が遠かった
  • 残業マシマシだった

というような点があってダウンしてしまった。
大きめな環境変化が連続してあったのも影響して体調を崩してしまった。

そして3回目の転職

半年くらいゆっくりして、再び転職活動をした。
3度目の正直ということで、今までの失敗を生かして会社を見た。
Twitter転職とその他転職サービスを併用していた。
結果、B社にいた頃に、勉強会に参加させてもらったD社の社長からTwitterで声をかけてもらって、入社に至った。
D社はWebサービス開発をメインに行なっているWeb系の開発会社である。

技術的についていけるかという不安があったのをはっきりと伝えたところ、選考フローの中で開発課題を設けてくれた。
D社以外にも転職活動はしていたので、その活動と並行して少しずつLaravelでのブログサービス開発のようなことをしていた。
週1くらいでオフィスにお邪魔して面談のようなことをしてもらって、1月程度経ったところで課題のレビューをしてもらった。
レビューと同時に、社員全員(4,5人くらい)との面接をさせてもらって内定に至った。
選考フローとしては長めだと思うが、経歴が経歴だったので安心感に繋がった。

3ヶ月たった今

D社で元気に(?)働いている。

  • 自宅から自転車通勤で片道20分くらい
  • 自己研鑽タイムというものがあり、毎日1時間自由に使える
  • 月1で1on1面談をやってもらえる
  • 開発環境モダン

と良い感じ。
仕事としては、Laravel + Vue.jsを利用してWebサービスの開発をしている。
1か月目はWebの事まったくわからん状態だったが、2か月目突入したあたりでなんとなくいろはがわかってきた。
3か月経過した今はパフォーマンスチューニングのようなこともさせてもらっている。
社員の人数が少ないからいろいろなことをやらせてもらえる。(逆にいうとなんでもやらないといけないが、何でもできるようになりたいという思考があったので良かった)
とはいえ、いつ技術的についていけなくなるか、成果を常に出し続けないといけないみたいな焦燥感はずっと持っている。
これで潰れない限りはちょうどよいストレスになるかもしれないが、まあ怖いよね。
自己研鑽タイムという仕組みがあるおかげで日々勉強ができるのでその辺りが良い塩梅なのかもしれない。

プライベートで彼女を支えるといった点は継続中なので、その辺りの折り合いをつけつつ、勉強量活動量を増やしていきたい……というのが今現在のお気持ち表明である。

最近はなんとなーくC#を書きたい気持ちがあるので、C#のBlazorとか触ってみようかなと思っている。

dotnet.microsoft.com

さいごに

転職エントリ恒例のほしいものリスト添付です。

ほしいものリスト

【Laravel】テスト中にRoutingを追加する

はじめに

Laravelでテストコードを書く際に、テスト中に Routing を追加したい場面に出くわしました。
そんなコードの備忘録記事です。

version は Laravel 5.6 利用です。

テスト中に Routing を追加する

単刀直入に、コード上でRoutingを追加するコードはこちら

public function registerRoute($method, $route, $middleware, $closure = null)
{
    if (is_string($m)) {
        $m = [$m];
    }

    $middleware = collect(['web'])->merge($m)->toArray();

    if (isset($closure)) {
        app('router')->match($method, $route, $closure)->middleware($middleware);
    } else {
        app('router')->match($method, $route, [function () {
            return view('layouts.app');
        }])->middleware($middleware);
    }
}

Laravel Router

Laravel 5.8のコードですが、こちらにRouterクラスがあります。

framework/Router.php at 5.8 · laravel/framework · GitHub

今回利用したmatchメソッド以外にもいろいろとpublicになってるので、結構何かと弄れそうな雰囲気

テストでの利用法

テストコード側からの利用はこんな感じに

$this->registerTestRoute('GET', "/test/{test_id}", ['middleware'], function () {
    return 'test view';
});

$response = $this->get('test/1');

$response->assertStatus(200);

【NodeSource】6.xを指定しても10.xしか落ちてこなくて困った話

はじめに

CircleCIにてNode.jsの環境をつくるのにNodeSourceを利用していました。
6.xを指定していたのですが、突然10.xが落ちてくるようになり、jobが動かなくなったので解決方法をメモ書きしておきます。

問題

CircleCIのjobで

 - run:
    name: Install Nodejs
    command: |
        curl -sL https://deb.nodesource.com/setup_6.x | bash -
        apt-get install -y nodejs

としていましたが、ここでインストールされるNode.js10.15.2 になってしまってました。
npmが同梱されていなくてこの後にnpm iする時点で落ちる。
npmを解決しても、その後のjobでnode-sassを利用していてNode 10.xだと動かない。
と問題になってました。

解決方法

試行錯誤した末にたどり着いたissueがこちら

github.com

コメントを意訳すると、

「現在のworkflowだとNode.jsの新しいバージョンを取得しようとしている。特定のバージョンを取得したい場合の回避方法があるからやってね」

とのこと。
手順は、

  • 現在入っているNode.jsを削除
$ sudo apt-get purge nodejs
  • 設定ファイルを開く
$ sudo vim/etc/apt/preferences.d/nodesource
  • 設定内容を記述
Package: *
  Pin: origin deb.nodesource.com
  Pin-Priority: 600
  • 変更が適用されているか確認する
$ apt-cache policy nodesource
  • 再度Node.jsをインストールする
$ sudo apt-get install nodejs

CircleCI jobへの適用

CirCleCIではこんな設定にして解決しました。

 - run:
    name: Set Preference
    command: |
        echo "Package: *" | tee -a /etc/apt/preferences.d/nodesource
        echo "Pin: origin deb.nodesource.com" | tee -a /etc/apt/preferences.d/nodesource
        echo "Pin-Priority: 600" | tee -a /etc/apt/preferences.d/nodesource
 - run:
    name: Install Nodejs
    command: |
        curl -sL https://deb.nodesource.com/setup_6.x | bash -
        apt-cache policy nodejs
        apt-get install -y nodejs

おわりに

今回の問題に行き当たったことで、

  • Pin-Priority : パッケージの優先度をつける
  • teeコマンド : ファイルへの出力と標準出力での出力を同時に行ってくれるコマンド

と学びがありました。
環境周りのエラーは本当に難しいので解決できて良かったです……!

「Webを支える技術」の読書会をした話

はじめに

こんにちは、最近アウトプットへの比重が減ってきていてしんどさを感じているじゃれみーです。  

それはさておき……
会社にて毎日1時間自己研鑽タイムという名称でなんでもしてよい時間があるので、それを利用して読書会をしていました。
Web開発に関してnewbieなので、まずは「Webを支える技術」を課題本として利用させていただきました。
今回は読書会のふりかえり記事のようなものを書きます。

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus)

読書会

そもそも読書会とは、複数人が同じ本(またはテーマ)をもとに、一緒に読み進めたり、感想を言い合ったりする会です。1
読書会の形式はいろいろあって、

  • 輪読会式 - 区切りごとに皆で読み進めていく
  • 研究会式 - 事前に決めた章を読んでおいて、講義のような形で知見の共有を行う
  • 発表会式 - 各自が事前に決めたテーマについて、自由にスライドなどを作り発表する

と、大まかには3種類ほどの形式があるようです。
最近だとオンライン読書会をやっている人たちも見かけるので、これには当てはまらない形式もあるかもしれません。

参加人数と、読む本の内容の重さ、読書会にかける時間あたりをもとに読書会の方式を洗濯していくのが良いと思います。

やり方

今回は参加人数が少なく、Webを支える技術が題材だったので輪読会式にしました。
他にも進め方を決めたので箇条書き

  • 1日30分利用して進める
    • 読む時間を20分
    • 内容についてふりかえる時間を10分
  • キッチンタイマーのようなものを利用して経過時間をわかりやすいようにする
  • Googleドキュメントに大事な点や、いまいちわからなかった点をまとめていく

といった感じにしていました。
だいたい1ページ読むのに1分弱程度で、1章20ページ前後の構成だったので、1日1,2章ずつ読み進めました。

Webを支える技術の感想

まずは一言で感想を述べると、「Web開発における基礎中の基礎知識を得られる素敵な本」といった感じでした。
Web技術に関しての歴史から始まり、普段何気なく使っているHTTPメソッドについて、その他認証やAtomJSONといったリソース形式についても記載しており、非常にためになりました。
最近はLaravel + Vue.jsを利用してお仕事をさせてもらってるのですが、フレームワークが便利すぎて低次の層2のことを気にしないでも動くものが作れてしまいます。
とはいえ、低次の層のことを知っているとより良い設計でかけますし、何よりなんとなく動いたとかよくわからんけどこういうURLにしておけばいいんだろうという、居心地の悪い感じがなくなったのは本当に良かったです。

個人的に一番良かった点はURLの設計について理解が深まった点です。
なんとなくでしかURLの設計をできていなかったのですが、良いURLの設計について理論込みで、理解を深めることができたので自信につながりました。
クールなURIとは、変わらないURIのことである
しっかり覚えておこうと思います。

読書会の感想

読書会を行ったことそのものについて、全体的にやって良かったなという気持ちでいます。
今回の本のような座学に近いものを広く勉強する本だと、途中でダレてしまって読むのをやめてしまったり……ということがよくあるのですが、読書会という存在があるおかげで最後まで読むことができました。
人によって注目する点が違うので、異なった視点から内容を見つめ直すことができるのもいい点です。
また、すでにベテランの人がたまに補足知識として歴史や、実務でxxということがあったと語ってくれるのもおもしろかったです。

自分のペースで読み進めることができないという制約があって、デメリットかなーと思わなくもないのですが、勝手にペースメイキングしてくれるという反面もあります。
まあこの辺りは好みの問題かなと自己完結してます。
読書会の方式によって本の向き不向きがあるので、その辺りの選択を間違えるとつまらなくなるだろうなという感じ。

あと、今回Googleドキュメントに記録を残していたのですが、これは良かったです。
同時に編集することもできるし、どこからでも見れます。
markdown形式で書けない点はちょっとだけ微妙かな……と思いましたが、最終的に箇条書きのインデントをつけてそれっぽくしました。

f:id:jalemy:20190818225515p:plain:w400
Googleドキュメントの記録

おわりに

読書会の感想を適当に綴りました。
この本のあとも読書会そのものは続けていて、月に1,2冊程度読み進めていくペースでやっています。
勉強は好きなのですが、進んでる感の得にくい勉強ってなかなか続けづらいので、ある程度の強制をしてくれる勉強会は素敵だなーと。
オンライン読書会とかやってる方いましたら、ぜひ誘ってください。


  1. かなり大雑把な言い方ですが、だいたいあってるはず……

  2. 低いレイヤーという意味で使っています。蔑んでいるわけではないです。

Gitでmasterとdevelopにmerge済みのbranchを消すワンライナー

タイトル通りです。

merge済みのbranchを削除するコマンド

git fetch | cat <(git branch --merged origin/master --format "%(refname:short)") <(git branch --merged origin/develop --format "%(refname:short)") | sort | uniq | grep -vE '^\*|master$|develop$' | xargs -p -I % git branch -d %
  1. git fetchでリモートブランチの追跡を最新にする
  2. git branch --merged origin/develop でリモートのdevelop branchにmergeしてあるbranchを一覧で出す
  3. 今現在いるbranchについては*印がついたりするので、--formatで余分な情報を削ぎ落とす
  4. masterについても同様のことを行う
  5. catコマンドを利用して 3. 4. のコマンド結果を結合
  6. sort uniqコマンドを利用して重複を排除
  7. grepコマンドを利用してmasterdevelopを排除
  8. 残ったbranch名が、今回削除したいbranchになるので、git branch -dで削除

xargs-I をつけることで削除する前に確認が入るようにしているが、確認がいらない場合はオプションを消してください。

おわりに

完全にノルマ達成のために作ったワンライナーです。
本当にありがとうございました。

とはいえ、意外と利用する場面は多いのではないかと思って記事投稿です。

第12回ゆるはち.it【スプレッドシート駆動開発】で登壇してきた

はじめに

先月も参加していたゆるはち.itで登壇する機会をいただけたので、GASについて話してきました。
ちなみに今月のお題は、スプレッドシート駆動開発です。

どんなことを話したのか

登壇資料はこちら

  • GASってそもそもなに?
  • GASでできること
  • GASの長所・短所
  • claspを利用したGAS開発
  • GASでのWebスクレイピング
  • GASのトリガー

あたりを話しました。

感想

社外の勉強会で登壇するのははじめてだったのですが、無事こなせてよかったです。

内容としては、そんなに難しい内容を話せたわけでもないので、徐々に難しい内容も突っ込んで話せるようになったら良いな……とか思うところ。
発表時間は20分間だったのですが、リハーサル時点だと、余裕で時間余るだろう……という想定でした。
しかし、余るどころか足りなくなってしまい、かなり早口で話す事態になってしまいました。
このあたりの感覚は経験を積んで調節できるようにしたいです。
あと発表で何を伝えたいかコンセプトを絞って話せるようにとか……かな……?

ついでに、資料作るのにめちゃくちゃ時間がかかって前日ほぼ徹夜状態だったことを記録しておきます。
(おそらく計6,7時間くらいはかかってるはず ※コード含め)
ただ、週1ブログを続けているおかげか構成を考えることにはそこまで苦労しませんでした。
ブログを書き続けることについてありがたみを感じた瞬間でした🙏
ぜひこれからもアウトプットの習慣は続けていきたい。