(ハライチ感)

Foo.configure do |config|
  config.name = "foo"
  config.email = "foo@example.com"
end

こっちでもかけたりする。

Foo.config.name = "foo"
Foo.config.email = "foo@example.com"

こういうやつ。

実装は大体こういう感じになってる。

module Foo
  class << self
    def configure
      yield config
    end

    def config
      @_config ||= Config.new
    end
  end

  class Config
    attr_accessor :name, :email

    def initialize
      @name = "no name"
      @email = "default@example.com"
    end
  end
end

これrubyでよくあるけど(他の言語であんま見ない)これなんて呼ぶのがいいのかな?

フィヨルドブートキャンプで説明する時にこれを表現したくても

「blockで設定するやつ」

としか言えない。

「なんでこれで設定できるんですか?」

と言われても、口で説明するのが大変なのでここに置いておきます。

Cloud Buildでのデプロイ通知を調べると相当ヘビーなやり方の公式ドキュメントが出てくる。

Slack 通知を構成する  |  Cloud Build のドキュメント  |  Google Cloud

Cloud Storageにおいた構成ファイルをもとにpub/subに通知を送ってそれを読み取ったCloud RunにデプロイしたSlackNotifierがSlackにメッセージを送る?

面倒クセェ〜!

  - id: Notify
    name: gcr.io/google.com/cloudsdktool/cloud-sdk
    entrypoint: curl
    args: ['-H', '"Content-Type: application/json"', '-X', 'POST', '-d', '''{"content": "Deployed."}''', '$_WEBHOOK_URL']

curlで良いやろ。(上記はDiscordへの通知)

公式ドキュメントにもしっかりあるし、みんなデフォルトでやってるかもしれないけど、すごく早くなったのでご紹介。

ビルドを高速化する際のおすすめの方法  |  Cloud Build のドキュメント  |  Google Cloud

今まではCloud BuildでCloud Runにデプロイするときにでdockerイメージをbuildするところを下記のようにしてたんですが、

  - id: Build
    name: gcr.io/cloud-builders/docker
    args: ['build',
           '-t', 'asia.gcr.io/$PROJECT_ID/$REPO_NAME:$COMMIT_SHA',
           '-t', 'asia.gcr.io/$PROJECT_ID/$REPO_NAME:latest',
           '.',
           '-f', 'Dockerfile']

そこの前に下記のように前回最後にbuildしたイメージを取ってくるようにして、build時に--cache-fromを入れると良い感じに前回のイメージを使ってくれる。

  - id: Fetch
    name: gcr.io/cloud-builders/docker
    entrypoint: 'bash'
    args: ['-c', 'docker pull asia.gcr.io/$PROJECT_ID/$REPO_NAME:latest || exit 0']
  - id: Build
    name: gcr.io/cloud-builders/docker
    args: ['build',
           '-t', 'asia.gcr.io/$PROJECT_ID/$REPO_NAME:$COMMIT_SHA',
           '-t', 'asia.gcr.io/$PROJECT_ID/$REPO_NAME:latest',
           '--cache-from', 'asia.gcr.io/$PROJECT_ID/$REPO_NAME:latest',
           '.',
           '-f', 'Dockerfile']

24分ぐらいかかってたのが4分になって嬉しい。

Image from Gyazo

サメになって成長し、母サメの仇であるシャークハンターを倒す素晴らしいゲーム、マンイーターをクリアしました。

無双系をやってるような爽快感とB級サメ映画の文脈を外さないストーリーでとっても面白かったです。

土日でクリアできるボリューム感も良い。

このエントリーはフィヨルドブートキャンプ Part 2 Advent Calendar 2020の9日目の記事です。

プログラミングを始めるにはパソコンが必要ですがMacとかを用意するにはいきなり10万円以上のお金がかかってしまい敷居が高いです。そこで中古のパソコンとLinuxを使って1万円代で環境を用意しようというお話です。WebプログラマーはLinux知識が必須なのでこれを使えばLinux力養成(強制)ギプスとしても働くのでとてもいいです。

パソコン選び

おすすめはThinkPadの中古専門店 Be-Stockで中古のThinkPad X230を買うことです。

Image from Gyazo

大体14,000円ぐらいで売ってます。

Linuxをインストールするパソコンは安ければなんでもいいんですが、ThinkPadは中古市場に出物が多く安定して流通していること、Linuxをインストールして使う人が多いため情報が豊富なことがおすすめの理由です。

HDDをSSDに換装しているものも売っているのでそちらの方がお勧めです。画面解像度がFWXGA(1366x768)なのがネックですが50,000円ほど出せばFull HD(1920x1080)のモデルが買えます。

Image from Gyazo

僕も買ってみました。いやっほう!

SSDに換装されていて15,000円ぐらいでした。Linuxをインストールする場合、パソコンによってWiFiがすんなり動かないとかザラにあるんですが、さすがThinkPad X230はこなれているのでバッチリ動きました。(指紋認証も設定なしで動いたのはびっくり)

バックアップ

いきなりLinuxをインストールしてもいいんですが、もしもの時のためにバックアップを取っておきましょう。これがあれば何かあってもWindowsに戻して使えます。

下記はDVDを使っていますがUSBメモリーを使った方が便利です。16GB以上のUSBメモリーがあればOKです。僕はコンビニで16GBのUSBメモリー買ってきました。

ThinkPad X230 のリカバリーメディアの作り方を解説 | DESIGN.PC

Linuxのインストール

一番無難なUbuntuをインストールしましょう。

本家からよりも日本語の環境が整っているubuntu Japanese Teamから日本語Remixイメージ(拡張子が.isoのファイル)をダウンロードしましょう。

Ubuntu 20.04.1 LTSの方がサポート期間が長いバージョンなので安定していますが、デスクトップ用途なので最新のUbuntu 20.10の方がいいと思います。

これをインストールUSBにしてくれるソフトを使ってUSBに入れます。

上記のエントリーではRufusというソフトを使ってインストールUSBを作っていますが、僕はUNetbootinというソフトを使いました。まあどれも似たようなもんです。

Image from Gyazo

インストールUSBができたらそれを刺して起動しましょう。

パソコンが起動するとき、どこにOSが入っているのかHDDかな?DVDかなUSBかな?と順番に調べていっています。普通はUSBよりHDDの方を先に見にいく設定になっているのでHDDにインストールされているOS(この場合はWindows7)が起動してしまいます。USBから起動したいのでこの順番を変えましょう。こういった設定はBIOSでやります。

X230の場合は起動時のロゴが表示された時にF1を押すとBIOSの設定画面に入れます。

推奨するBIOSの入り方 (Boot Menu) - ThinkPad, ThinkCentre, ThinkStation - Lenovo Support US

Image from Gyazo

素っ気なくてちょっと怖い画面ですが、良く見れば難しいことは書いてありません。矢印の左右で一番上のタブを選択し、上下で選んでEnterで選択できます。

起動の順番はStartupタブのBootのところで設定できます。

Image from Gyazo

僕の設定はこうなっていました。

CDもFDD(フロッピーディスク)もないので4のHDDが選択されてそこからWindowsが起動しているようです。これより上にUSB HDDを持ってくればOKなはず。

Image from Gyazo

右側のHelpに書いてあるように-キーや+キーで順番を変えられたのでUSB HDDを上に持ってきました。そして画面下部に書いてあるようにF10キーで保存して終了。

するとubuntuのインストールイメージが起動するのでしばらく待ちます。

Image from Gyazo

インストーラーが立ち上がりました。インストーラーで聞かれる内容はWindowsやMacと大差ありません。

萌え萌えmoebuntu Ubuntu 20.10(Groovy Gorilla) のインストール手順

Image from Gyazo

インストールできした〜!やった〜!

Ubuntu 20.20はコードネームGroovy Gorillaなのでゴリラがマスコットみたいです。

ThinkPadのトラックポイント(赤いポッチ)やトラックパッドも問題なく動いています。WiFiも問題なし。SSDに換装されている影響か、画面の解像度の狭さ以外は結構快適です。

開発環境構築

プログラミングの勉強に必要なソフトをインストールしていきましょう。

Ubuntu Software

Image from Gyazo

Snap Store

Image from Gyazo

Ubuntu SoftwareがWindows StoreやMac App Storeみたいなもんです。Snap StoreがUbuntu Softwareにとって変わられる予定みたいですが今のところ過渡期のようです。Snap Storeはソフトが豊富です。

ターミナル

最初から 端末 という名前で入っています。

Image from Gyazo

ブラウザ

Firefoxが初めから入っています。Chrome好きはオープンソース版のChromiumを使うと良いです。

プログラミング用エディタ

迷ったらVisual Studio Codeでいいんじゃないでしょうか。

Image from Gyazo

チャット

SlackとDiscordがちゃんと動きますね。

Image from Gyazo

ruby & rails

さすがLinuxはプログラマー向けの各種ツールはバッチリ動きますね。railsもバッチリです。

Image from Gyazo

プログラミングを学習できるサイト

ハードとソフト、準備が揃ったらプログラミング学習をスタートしましょう。

ドットインストール

ドットインストール - 3分動画でマスターできるプログラミング学習サービス

無料で色々学べて便利。僕もいくつもやったことありますし、有料版を社員研修に使ったこともあります。

Progate

Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]

プログラミングってどういうものだろう?と思っている方はこれをやってみるとわかると思います。Progateをやってみて「プログラミングって楽しい!」と思ったら他の方法も合わせて本気で取り組んでみるという流れは僕もお勧めです。

フィヨルドブートキャンプ

Image from Gyazo

FJORD BOOT CAMP(フィヨルドブートキャンプ)

はい、長々と書いてきたオチでございます。

「プログラミングって楽しい!」と思って本気でプログラマーとして就職を目指そうと思ったらぜひオンラインプログラミングスクールのフィヨルドブートキャンプへ。Linuxもカリキュラムできっちりやるのでubuntuにも最適です。

すでにフィヨルドブートキャンプで学ばれている方もLinux矯正ギプスを手に入れてLinux力をアップしてみてはいかがでしょうか!

フィヨルドブートキャンプというプログラミングスクールのEラーニングアプリをCloud Run + Railsで動かしています。

1ヶ月使ってみた結果、8,000円ぐらいでした。

Image from Gyazo

Cloud Runが300円でCloud SQLが7,000円って感じです。Cloud Buildとかちょこまかしたのはありますが誤差の範囲。

Cloud Runは1コンテナだったら1日10円ぐらいなんですよね。信じられないほど安い。

これでDockerイメージ放り込んでおけば自動スケールの環境が手に入るならほとんどの仕事のアプリはこれでいい気がします。パフォーマンスもいいし、これからのアプリは全部これで行こうと思います。

@bluerabbit777jpさんが使ってるのを見て良さそうだったので使い始めたTablePlus

MySQL、PostgreSQL両方行けるし、最近落ちまくりで困ってたSequel Proと違って落ちないし、Free Trialでしばらく使っていい感じだったのでライセンス購入しました。

Image from Gyazo

Cloud SQL Proxy経由でCloud SQLもしっかり使えております。便利〜。

Image from Gyazo

フィヨルドブートキャンプのrailsアプリをherokuからGCPのCloud Runに移行しました。

GCPに詳しい@bluerabbit777jpさんにやってもらいました。僕もこれを参考にしながら他のサービスも移行しようと思います。

この辺りのサービスの機能は日々進化してる感じなんですが、Cloud BuildのトリガーががGitHub Reposの特定のブランチにpushされたら動くというのに対応したので、masterにpushされたらCloud BuildでDocker ImageをビルドしてCloud Runにデプロイされるという感じです。

設定はちょっと面倒ですが、好きなDocker Imageをデプロイすればオートスケールってのは自由度が高くていいですね。

bootcampの規模では常に1インスタンスで夜中に1〜2回ぐらい0インスタンスになる感じです。0からの立ち上がりの初回は16秒ほどかかっています。最低インスタンス数の設定項目自体はあるのでもうすぐ有効になりそうです。そうなったら1にしておけはbootcamp的には問題なさそう。

Herokuからの移行で一番のメリットはやはりTokyoリージョンが近くて速いって点です。基本的に全てのページで200〜300msぐらい速くなった感じです。他の部分が遅ければ200msぐらいすぐに遅くなっちゃうのでアプリの高速化はやってましたが、全てのページが一律早くなるのは体感できるぐらいでした。

キャッシュどうすんだとか、cronどうすんだとかあるあるな点についても順次対応しつつブログに書いていこうと思います。

「映画好きを名乗るからには見とかなきゃいけないとか、斬新とか通好みとかじゃなくて、単純に一番面白い映画ってなんですか?」

って聞くと、俺みたいな映画に詳しくないヤツが見ても「う〜ん、難しくて良くわからなかった」となる映画を教えられがち。(小説でも同じ)

すごく映画詳しいと思われる@machidaさんに昔この質問をした時、

「 バックトゥザフューチャーじゃないすかね。」

と即答された。

こりゃ信用できるわぁ〜

fjordcop作った - komagataのブログ

これをgemにしました。

rubocop-fjord

gemにした理由は、gistだと適当感があってこれにしたがってくださいと言い辛いからです。 メンテについては腹を括ったのでやっていきます。

とにかくエディタ論争とこういうルールについての議論をするのが辛い。

プログラミングスクールで使うことを念頭に置いているので他にも教育やスクールをやっている方には便利かも知れません。

group :development do
  gem 'rubocop-fjord', require: false
end

.rubocop.ymlにこう書く。

inherit_gem:
  rubocop-fjord:
    - "config/rubocop.yml"
    # - "config/rails.yml"