そういえばこのブログのドメイン(docs.komagata.org)ばかり使っていてkomagata.orgのドメインはだいぶ放置していたのでサイトを作りました。
Google Domainsを使ってるので(?)Firebase Hostingにおきました。
CSSのAnimationはTwitterで@shimewtrさんに教えてもらいました。ありがとうございます。
そういえばこのブログのドメイン(docs.komagata.org)ばかり使っていてkomagata.orgのドメインはだいぶ放置していたのでサイトを作りました。
Google Domainsを使ってるので(?)Firebase Hostingにおきました。
CSSのAnimationはTwitterで@shimewtrさんに教えてもらいました。ありがとうございます。
ずっと下記に書いたような問題意識を自分たちのプログラミングスクールに対して持っております。
OSS Gateオンラインワークショップに参加 - komagataのブログ
そこでこんな活動をやってみたらどうかな〜と思っています。(スクール内限定じゃなくてパブリックなワークショップにしたい)
OSS活動は終わらないネットゲームであり、みんな脳汁を垂れ流して楽しんでおります。しかしそこに辿り着くまでに色々と障壁があり、プログラミングに興味のある人や初心者の方にプログラミングの楽しさを知ってもらうためのワークショップができないかと考えております。(また、OSS活動以外のプログラミングの楽しみもいいと思う)
1回につき1テーマのプログラミングの楽しみについて体験してもらい、みんなで楽しむ。
役に立つとか、勉強になるとかは置いておいて、楽しさを一番重視する。
自分のための小さなスクリプトを作ろう。
~/bin
とかに置くような自分のためだけのちょっとした便利スクリプトをみんなでかく。
「昼飯をランダムで決めるスクリプト」とか「~/Downloadsディレクトリの中を定期的に削除するスクリプト」とか「平日の10時に自動で勤怠アプリにログインする」スクリプトとかそういうやつです。
基本のアルゴリズムを実装してみよう。現代のプログラミング言語であれば標準ライブラリで備えているような基本的な簡単なアルゴリズムを自分の得意な言語で実装してみる。
フリーソフトウェア運動に参加する。フリーソフトウェアとは何かを学んで入信する。自分の使ってるソフトをフリーソフトウェアに置き換えられないか検討したり、布教活動をする。
Quineを作ってみよう。(説明すると長くなるので省略)
使ったことない言語を使ってみよう。
使ったことないOSを使ってみよう。
競技プログラミングに挑戦しよう
名著を読もう。
みんなで色々な名著を読んできて、大体の内容を話してもらう。他人におすすめする。
ライブラリを作ろう。gemとかnpmとかそういうのの作り方ワークショップ。これができたらOSS活動に進む感じ。
1〜3時間ぐらいの長すぎないワークショップにしたい。一回につき1テーマで開催する。色々やってみて評判の良いテーマが絞れたらそれらを繰り返しやる。1 > 3 > 7...とか。
前半は説明をして、後半で手を動かしてやってみる。最初は1人でサポートしきれるぐらいの人数が良いかもしれない。
全体として、Terminalの使い方、簡単なコードが書ける力(どの言語でもいいが)などが必要になる。
Terminalの使い方は(昔に書いた)下記で学べるかもだが、基本的なプログラミングも学べる何かが欲しい。
本当は怖くない 黒い画面入門: https://fjord.jp/kuroigamen.html
初心者向けだけど、プロでもネタのチョイスによってはずっと楽しめる感じにしたい。例えばQuine入門の内容をやるけど、超難しいやつを自分のテーマとして毎回作っても良いみたいな感じ。競プロ入門を毎回やるけど、すげー人が既にいるとか。コミュニティーの中に目指したくなるロールモデルがいるとより良いと思うので。
ちょっとできるように考えてみたいと思います。
OSS Gateオンラインワークショップ2021-03-13にサポーターとして初参加させていただきました。
フィヨルドブートキャンプというプログラミングスクールを運営していますが、生徒の方で「頑張って、歯を食いしばって勉強する!」という状態になる方が出てしまうのが常々僕らの取り組みの問題だと感じています。
「プログラミングが面白くてハマってたらスキルが上がっていた」というのが理想です。逆にハマりさえすればあとは勝手に勉強していくので面白さを伝えるのがスクールの一番の目標といっても過言ではありません。
「どうやったらプログラミングの面白さを伝えられるんだろう?」と考えたときに、やはり「プログラミングの楽しさっつったらOSS活動だろう」ということでOSS活動に参加する人を日夜増やし続けているOSS Gateさんのやり方を学びたく、また僕もその活動をしたいと思って参加しました。
今回はビギナーの方が自身で選んだOSSであるApache AirFlowの開発に参加してみるのをサポートしました。(実際は進行役のPiroさんのメンタリングを僕はほとんど聞いてるだけの形ですが🤭)
詳細なメモを取りながらまず自分でインストールしてみる。わかりにくかった部分をIssueフィードバックする。その部分を直すPRを作って送ってみるという一連の流れをやりました。
僕もAirFlowって初めて知りましたし、途中でちょっとしたbashの問題にハマったり、Issueを書く時の適した英語表現など、僕も非常に勉強になりました。
事前に動画で予習してる時から感じてたのですが、非常に実践的で、そして予想以上に手厚くサポートしてもらえるワークショップですごいなと思いました。
まさに今回参加されたビギナーさんは「これだったらこのあと家で一人でもできる」と思ってもらえたんじゃないかと思います。
「ソフトの文句を言う人」から「ソフトの開発者」に半日で変わったのだからすごい進化です。
ひるがえって自分の運営するスクールでの適用を考えた時の問題点を考えてみました。
プログラミングスクールの生徒として考えるとまず、「OSSってなんですか?」という状態の人にはまだ早いということです。
「XXX(ソフト・ライブラリ名)がとても便利!こんなのがあるなんて知りませんでした。」
という感想に対して僕が
「あるというより誰かが便利に作ってくれたってことなんですよね。」
とコメントをすると
「そうですよね。誰かが作っているんですよね。考えてみたこともなかったです。」
的なやりとりが大体発生し、そこで初めてOSSなどを意識して学習していくことが多いです。まずそこを超えた人(=ソフトのありがたみを感じたことのある人)じゃないと参加が難しいと思いました。
また、コマンドライン・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を作ります。
ターゲットにはHTTPを指定してリクエストを飛ばしたりもできますが、Pub/Subも指定できます。
Pub/Subはややこしいかと思ってたんですが単に名前決めて作るだけでした。
Cloud FunctionsではPub/Subで作ったイベントをSubscriptionしてそのタイミングで実行できます。
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を使うのも何にも苦労せずでした。
Cloud Functionsは高度な用途もありますが、こういうふうに週1回しか動かないクソちょっとしたプログラムを動かすにも安くていいなと思います。
フィヨルドブートキャンプでは終盤に生徒の方と一緒になってみんなが使っているEラーニングシステム自体をスクラムで開発するカリキュラムがあります。
そこでのブランチ戦略を最近変えたので生徒の方への説明も兼ねて紹介します。
GitLab Flowです。
糸冬 わ り
だとあんまりなのでデプロイについても書きます。
(厳密にはpre-productionはなくて、master=唯一のステージングです)
デプロイはCloud Buildでgit pushをきっかけにmain = ステージング環境、production = 本番環境という具合でデプロイしています。
デプロイは週1回で、毎週水曜日のふりかえりミーティングの後にリリースしています。
master(main)にPRがマージされるとgit-pr-releaseでリリース用のPRが作成されます。
各担当者はステージング環境で動作確認したらここのチェックボックスにチェックを入れます。
そして各担当者は自分の実装したところをリリース文に書きます。
全部の動作確認が終わっていたらリリースします。(productionブランチにマージする)
本番環境にデプロイされたら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分になって嬉しい。
このエントリーはフィヨルドブートキャンプ Part 2 Advent Calendar 2020の9日目の記事です。
プログラミングを始めるにはパソコンが必要ですがMacとかを用意するにはいきなり10万円以上のお金がかかってしまい敷居が高いです。そこで中古のパソコンとLinuxを使って1万円代で環境を用意しようというお話です。WebプログラマーはLinux知識が必須なのでこれを使えばLinux力養成(強制)ギプスとしても働くのでとてもいいです。
おすすめはThinkPadの中古専門店 Be-Stockで中古のThinkPad X230を買うことです。
大体14,000円ぐらいで売ってます。
Linuxをインストールするパソコンは安ければなんでもいいんですが、ThinkPadは中古市場に出物が多く安定して流通していること、Linuxをインストールして使う人が多いため情報が豊富なことがおすすめの理由です。
HDDをSSDに換装しているものも売っているのでそちらの方がお勧めです。画面解像度がFWXGA(1366x768)なのがネックですが50,000円ほど出せばFull HD(1920x1080)のモデルが買えます。
僕も買ってみました。いやっほう!
SSDに換装されていて15,000円ぐらいでした。Linuxをインストールする場合、パソコンによってWiFiがすんなり動かないとかザラにあるんですが、さすがThinkPad X230はこなれているのでバッチリ動きました。(指紋認証も設定なしで動いたのはびっくり)
いきなりLinuxをインストールしてもいいんですが、もしもの時のためにバックアップを取っておきましょう。これがあれば何かあってもWindowsに戻して使えます。
下記はDVDを使っていますがUSBメモリーを使った方が便利です。16GB以上のUSBメモリーがあればOKです。僕はコンビニで16GBのUSBメモリー買ってきました。
ThinkPad X230 のリカバリーメディアの作り方を解説 | DESIGN.PC
一番無難なUbuntuをインストールしましょう。
本家からよりも日本語の環境が整っているubuntu Japanese Teamから日本語Remixイメージ(拡張子が.isoのファイル)をダウンロードしましょう。
Ubuntu 20.04.1 LTSの方がサポート期間が長いバージョンなので安定していますが、デスクトップ用途なので最新のUbuntu 20.10の方がいいと思います。
これをインストールUSBにしてくれるソフトを使ってUSBに入れます。
上記のエントリーではRufusというソフトを使ってインストールUSBを作っていますが、僕はUNetbootinというソフトを使いました。まあどれも似たようなもんです。
インストールUSBができたらそれを刺して起動しましょう。
パソコンが起動するとき、どこにOSが入っているのかHDDかな?DVDかなUSBかな?と順番に調べていっています。普通はUSBよりHDDの方を先に見にいく設定になっているのでHDDにインストールされているOS(この場合はWindows7)が起動してしまいます。USBから起動したいのでこの順番を変えましょう。こういった設定はBIOSでやります。
X230の場合は起動時のロゴが表示された時にF1を押すとBIOSの設定画面に入れます。
推奨するBIOSの入り方 (Boot Menu) - ThinkPad, ThinkCentre, ThinkStation - Lenovo Support US
素っ気なくてちょっと怖い画面ですが、良く見れば難しいことは書いてありません。矢印の左右で一番上のタブを選択し、上下で選んでEnterで選択できます。
起動の順番はStartupタブのBootのところで設定できます。
僕の設定はこうなっていました。
CDもFDD(フロッピーディスク)もないので4のHDDが選択されてそこからWindowsが起動しているようです。これより上にUSB HDDを持ってくればOKなはず。
右側のHelpに書いてあるように-
キーや+
キーで順番を変えられたのでUSB HDDを上に持ってきました。そして画面下部に書いてあるようにF10キーで保存して終了。
するとubuntuのインストールイメージが起動するのでしばらく待ちます。
インストーラーが立ち上がりました。インストーラーで聞かれる内容はWindowsやMacと大差ありません。
萌え萌えmoebuntu Ubuntu 20.10(Groovy Gorilla) のインストール手順
インストールできした〜!やった〜!
Ubuntu 20.20はコードネームGroovy Gorillaなのでゴリラがマスコットみたいです。
ThinkPadのトラックポイント(赤いポッチ)やトラックパッドも問題なく動いています。WiFiも問題なし。SSDに換装されている影響か、画面の解像度の狭さ以外は結構快適です。
プログラミングの勉強に必要なソフトをインストールしていきましょう。
Ubuntu Software
Snap Store
Ubuntu SoftwareがWindows StoreやMac App Storeみたいなもんです。Snap StoreがUbuntu Softwareにとって変わられる予定みたいですが今のところ過渡期のようです。Snap Storeはソフトが豊富です。
最初から 端末 という名前で入っています。
Firefoxが初めから入っています。Chrome好きはオープンソース版のChromiumを使うと良いです。
迷ったらVisual Studio Codeでいいんじゃないでしょうか。
SlackとDiscordがちゃんと動きますね。
さすがLinuxはプログラマー向けの各種ツールはバッチリ動きますね。railsもバッチリです。
ハードとソフト、準備が揃ったらプログラミング学習をスタートしましょう。
ドットインストール
ドットインストール - 3分動画でマスターできるプログラミング学習サービス
無料で色々学べて便利。僕もいくつもやったことありますし、有料版を社員研修に使ったこともあります。
Progate
Progate | プログラミングの入門なら基礎から学べるProgate[プロゲート]
プログラミングってどういうものだろう?と思っている方はこれをやってみるとわかると思います。Progateをやってみて「プログラミングって楽しい!」と思ったら他の方法も合わせて本気で取り組んでみるという流れは僕もお勧めです。
フィヨルドブートキャンプ
はい、長々と書いてきたオチでございます。
「プログラミングって楽しい!」と思って本気でプログラマーとして就職を目指そうと思ったらぜひオンラインプログラミングスクールのフィヨルドブートキャンプへ。Linuxもカリキュラムできっちりやるのでubuntuにも最適です。
すでにフィヨルドブートキャンプで学ばれている方もLinux矯正ギプスを手に入れてLinux力をアップしてみてはいかがでしょうか!