OSS Gateオンラインワークショップ2021-03-13にサポーターとして初参加させていただきました。

参加理由

フィヨルドブートキャンプというプログラミングスクールを運営していますが、生徒の方で「頑張って、歯を食いしばって勉強する!」という状態になる方が出てしまうのが常々僕らの取り組みの問題だと感じています。

「プログラミングが面白くてハマってたらスキルが上がっていた」というのが理想です。逆にハマりさえすればあとは勝手に勉強していくので面白さを伝えるのがスクールの一番の目標といっても過言ではありません。

「どうやったらプログラミングの面白さを伝えられるんだろう?」と考えたときに、やはり「プログラミングの楽しさっつったらOSS活動だろう」ということでOSS活動に参加する人を日夜増やし続けているOSS Gateさんのやり方を学びたく、また僕もその活動をしたいと思って参加しました。

OSS活動参加をサポート

今回はビギナーの方が自身で選んだOSSであるApache AirFlowの開発に参加してみるのをサポートしました。(実際は進行役のPiroさんのメンタリングを僕はほとんど聞いてるだけの形ですが🤭)

詳細なメモを取りながらまず自分でインストールしてみる。わかりにくかった部分をIssueフィードバックする。その部分を直すPRを作って送ってみるという一連の流れをやりました。

僕もAirFlowって初めて知りましたし、途中でちょっとしたbashの問題にハマったり、Issueを書く時の適した英語表現など、僕も非常に勉強になりました。

感想

事前に動画で予習してる時から感じてたのですが、非常に実践的で、そして予想以上に手厚くサポートしてもらえるワークショップですごいなと思いました。

まさに今回参加されたビギナーさんは「これだったらこのあと家で一人でもできる」と思ってもらえたんじゃないかと思います。

「ソフトの文句を言う人」から「ソフトの開発者」に半日で変わったのだからすごい進化です。

スクールでの適用に対する問題点

ひるがえって自分の運営するスクールでの適用を考えた時の問題点を考えてみました。

OSSって何?

プログラミングスクールの生徒として考えるとまず、「OSSってなんですか?」という状態の人にはまだ早いということです。

人が作ってる?

「XXX(ソフト・ライブラリ名)がとても便利!こんなのがあるなんて知りませんでした。」

という感想に対して僕が

あるというより誰かが便利に作ってくれたってことなんですよね。」

とコメントをすると

「そうですよね。誰かが作っているんですよね。考えてみたこともなかったです。」

的なやりとりが大体発生し、そこで初めてOSSなどを意識して学習していくことが多いです。まずそこを超えた人(=ソフトのありがたみを感じたことのある人)じゃないと参加が難しいと思いました。

コマンドライン・gitが使えない

また、コマンドライン・gitが使えることも前提となるので、フィヨルドブートキャンプでいえばそれらのカリキュラムを履修した人以降が対象だと思いました。

スクールに適用するなら

OSS GateではOSS活動に参加したことのないプログラマーが対象ですが、フィヨルドブートキャンプの生徒に対して行う(またはプログラミング学習中の人に行う)ならば、「XXXが使える人」「XXXのカリキュラムより先に進んでいる人」などの前提条件を決める必要があるなと感じました。

そして僕の問題意識から考えると、まずはそこに達していない人にプログラミングの楽しさを伝える活動が必要なのかなと思いました。(達してる人はOSS Gateへ!)

ちょっとそういった活動も考えてみたいと思います。

フィヨルドブートキャンプではチャットをSlackからDiscordに移行しようとしています。

DiscordにはSlackのようなReminder機能がメジャーなBotの中には無いので定期的なミーティングのリマインドを簡単に移行することができません。

有名なreminder-botでは「72時間おきにリマインド」のような単純Interval形式しか対応してません。「毎月1日の9時にリマインド」のようなことができないので困ってました。

ブートキャンプでは現在リマインドすべきものは3つしかなく、SlackのようなReminder Botを僕が作るのも面倒なのでCloud Functionsでやってみました。

流れ

Cloud Scheduler -> Pub/Sub -> Cloud Functions -> Discord

Cloud Schedulerでcronと同じインターフェースで時間を指定できるのでjobを作ります。

Image from Gyazo

ターゲットにはHTTPを指定してリクエストを飛ばしたりもできますが、Pub/Subも指定できます。

Pub/Subはややこしいかと思ってたんですが単に名前決めて作るだけでした。

Cloud FunctionsではPub/Subで作ったイベントをSubscriptionしてそのタイミングで実行できます。

コード

Image from Gyazo

require 'functions_framework'
require 'net/http'
require 'json'

FunctionsFramework.cloud_event 'reminder_sub' do |event|
  uri = URI.parse(ENV['WEBHOOK_URL'])
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  params = { "content" => "💬 14:00からふりかえりミーティングが 🔈ミーティング チャンネルで始まります。" }
  headers = { "Content-Type" => "application/json" }
  http.post(uri.path, params.to_json, headers)
end

Discordの発言はwebhookにPOSTするだけです。Cloud Schedulerからpayloadに何か値を入れてれば上記のeventの中にそれが(base64でエンコードされて)入っているのでその内容を使って処理を分けたりもできます。(実際のコードでは3種類の通知をそれで出し分けてます。)

最初のテンプレにGemfileも含まれていて、gemを使うのも何にも苦労せずでした。

Image from Gyazo

Cloud Functionsは高度な用途もありますが、こういうふうに週1回しか動かないクソちょっとしたプログラムを動かすにも安くていいなと思います。

フィヨルドブートキャンプでは終盤に生徒の方と一緒になってみんなが使っているEラーニングシステム自体をスクラムで開発するカリキュラムがあります。

そこでのブランチ戦略を最近変えたので生徒の方への説明も兼ねて紹介します。

Image from Gyazo

GitLab Flowです。 

糸冬 わ り

だとあんまりなのでデプロイについても書きます。

(厳密にはpre-productionはなくて、master=唯一のステージングです)

リリース

デプロイはCloud Buildでgit pushをきっかけにmain = ステージング環境、production = 本番環境という具合でデプロイしています。

デプロイは週1回で、毎週水曜日のふりかえりミーティングの後にリリースしています。

master(main)にPRがマージされるとgit-pr-releaseでリリース用のPRが作成されます。

ss

各担当者はステージング環境で動作確認したらここのチェックボックスにチェックを入れます。

ss2

そして各担当者は自分の実装したところをリリース文に書きます。

全部の動作確認が終わっていたらリリースします。(productionブランチにマージする)

Image from Gyazo

本番環境にデプロイされたらDiscordに通知が来るので、各担当者は本番環境で動作確認をして、IssueをCloseします。

最近変えたところ

以前まではGitHub Flowだったんですが、やっぱりいきなり本番にアップされるのは怖いという声もあり、Git Flowを検討していました。

しかし@kakutaniさんからGit Flowは提唱者自身が

「Git FlowはGitHubとかなかった昔に作ったものだから別のFlowがいいよ」

と言っていると聞いてGitLab Flowを見たら良さそうだったので決めました。

みんなでリリース文を書くというのも、誰がどの機能を作ってくれたのか、学習中の方にも伝わって楽しいということで初めてみましたが好評な感じです。

次はmasterをmainに変えると作業をやる予定です。

(ハライチ感)

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もしっかり使えております。便利〜。