これは「フィヨルドブートキャンプ Advent Calendar 2021」の25日目のエントリーです。
- [フィヨルドブートキャンプ Part 1 Advent Calendar 2021 - Adventar](https://adventar.org/calendars/6331)
- [フィヨルドブートキャンプ Part 2 Advent Calendar 2021 - Adventar](https://adventar.org/calendars/6360)
入門中でもプログラミングを楽しむ方法、それは、
「俺コマンドを書く」
ことだと思います。「俺コマンド」とは自分のためだけのコマンドです。
プログラムはただ動けばいいわけではなく、特に入門中は正しい作法を学んだり、オブジェクト指向プログラミングだの何だの、他の人から見てわかりやすいプログラムを書く必要があるのでなかなか難しいです。
しかし「俺コマンド」は自分のためだけなので気を使う必要はありません。自分が便利になるために、楽しむために書きましょう。
## どんなものを作るといいか
普段自分がやっている定型作業を少し自動化するコマンドを書いてみることから始めるのがおすすめです。
- ブログ用のWebサイトのスクリーンショットをいつものサイズで撮る。
- スクリーンショットのサイズを小さく圧縮する。
- ダウンロードフォルダを整理してバックアップする。
- 日報の雛形を投稿する。
普段から、
「この作業はコマンド化できないかな?」
と考えると楽しいです。
## コマンドを書いてみる
試しに「ダウンロードフォルダを整理してバックアップするコマンド」を書いてみます。
ダウンロードフォルダは散らかりがちなので、`~/backup/2021-12-23`のような日付名のフォルダを作ってそちらに移動するプログラムです。
`cleaner`:
```ruby
#!/usr/bin/env ruby
require 'date'
require 'fileutils'
FileUtils.mkdir_p("#{ENV['HOME']}/backup/#{Date.today}")
FileUtils.mv(
Dir.glob("#{ENV['HOME']}/Downloads/*"),
"#{ENV['HOME']}/backup/#{Date.today}/"
)
```
rubyの標準添付ライブラリだけを使ったプログラムです。
```sh
$ cleaner
```
こういう感じで実行するとダウンロードフォルダの中身が全部下記の場所に移動します。
![Image from Gyazo](https://i.gyazo.com/42c2ce435ef3031e94e0ec0ff7f297b0.png)
このようにコマンドにしておくと、例えば毎日決まった時間になったらこのコマンドを実行しるように設定しておくことでダウンロードフォルダの整理が自動化できます。
[【UNIX】cronとはなんぞや?](https://zenn.dev/kemmochi/articles/747a038ef09d95)
rubyでコマンドを書く方法の詳細については下記を見てください。
- [rubyでコマンドを作る | FJORD BOOT CAMP(フィヨルドブートキャンプ)](https://bootcamp.fjord.jp/articles/40)
## 楽して書くコツ
RubyのライブラリのRubyGemsやオープンソースの便利コマンドを利用すると自分の書くコードが減って便利です。
[RubyGems](https://rubygems.org)のサイトや(macの場合は)[Homebrew](https://brew.sh/index_ja)のサイトなどで便利なライブラリやコマンドを漁って知っておきましょう。
## よく使うgem
- [nokogiri](https://nokogiri.org)
- HTMLを簡単に扱うライブラリ。
- [selenium-webdriver](https://rubygems.org/gems/selenium-webdriver)
- ブラウザを操作するライブラリ。
- [colorize](https://github.com/fazibear/colorize)
- Terminalで文字に色をつけるライブラリ。
- [kramdown](https://github.com/gettalong/kramdown)
- Markdownを扱うライブラリ。
## よく使う便利コマンド
- [imagemagick](https://imagemagick.org/index.php)
- さまざまな画像処理を行うコマンド。リサイズや合成などコマンド一髪でできる。
- [ffmpeg](https://ffmpeg.org)
- さまざまな動画処理を行うコマンド。動画作成やフォーマット変換など色々できる。
- wget
- 主にwebからファイルをダウンロードするコマンド。リンク先も一気に持ってきたり色々できる。
- [mpg123](https://www.mpg123.de/)
- 音声ファイルを再生するコマンド。
- [imagesnap](https://github.com/rharder/imagesnap)
- Webカメラで写真を撮るコマンド。
## 外部コマンドを使う
実際にHomebrewでインストールしたimagemagickのコマンドをrubyから使ってみましょう。
```sh
$ brew install imagemagick
```
imagemagickをインストールすると`convert`コマンドが使えるようになります。
`image_compressor`:
```ruby
#!/usr/bin/env ruby
dir = ARGV[0]
Dir.entries(dir).each do |name|
unless name =~ /^\./
path = "#{dir}/#{name}"
system "convert '#{path}' -resize 50% -quality 90 '#{path}'"
end
end
```
rubyの`system`メソッドはシェルのコマンドラインを文字列で渡せば実行してくれます。
ディレクトリを渡すと中のスクリーンショットを小さく圧縮するコマンドを書きました。
このフォルダ内のスクリーンショットを全部圧縮してみます。
```sh
$ image_compressor ~/screenshot
```
![Image from Gyazo](https://i.gyazo.com/1f32722e90af7d1dc045e68e7c47c313.png)
大分小さくなりました。
このように外部コマンドを利用するとちょっとしたコードでいろんなことができます。
## 俺ライブラリを書く
コマンドをいくつか書いていると繰り返し出てくる処理をまとめたくなります。そこで自分だけが使うライブラリを書くと便利で楽しいです。
試しに上記の「自分用に画像を圧縮する機能」を俺ライブラリにしてみましょう。
`my_compressor.rb`:
```ruby
module MyCompressor
def compress(path)
system "convert '#{path}' -resize 50% -quality 90 '#{path}'"
end
end
```
これで他のコマンドからも利用しやすくなりました。
`image_compressor`:
```ruby
#!/usr/bin/env ruby
require_relative 'my_compressor'
include MyCompressor
dir = ARGV[0]
Dir.entries(dir).each do |name|
unless name =~ /^\./
compress "#{dir}/#{name}" # 簡単!
end
end
```
さっきの俺コマンドを俺ライブラリを使って書き換えてみました。こういう俺ライブラリを書き溜めていくとどんどん便利になるので楽しいです。
こういう汎用性の無い雑なライブラリは他の人が使うものとしては色々叱られちゃうので書けないですが、俺ライブラリなら自由です。
プログラミングを勉強していって新しいテクニックや作法を覚えたら俺コマンド・俺ライブラリにそれらを導入してみるととっても勉強になるし楽しいです。
## エンドゲームとしてのOSS活動へ
これらの遊びはプログラミングの入門中でも十分楽しめます。フィヨルドブートキャンプのカリキュラムで言えば「Ruby」カテゴリーのプラクティスぐらいまで進んでいれば十分だと思います。
[学習内容 | FJORD BOOT CAMP(フィヨルドブートキャンプ)](https://bootcamp.fjord.jp/practices)
勉強中の人同士で俺コマンドを持ち寄って紹介しあうのも楽しいかもしれません。
そして、オブジェクト指向設計や汎用的なコードの再利用を学んで行ったら、発展的な内容に挑戦して他の人も便利になるコマンド・ライブラリを公開してみましょう。それはいわゆるOSS(オープンソースソフトウェア)活動になっています。
OSS活動はプログラマーにとっての一番楽しいSNSであり、オンラインゲームです。
年末年始にかけてまとまった休みができた人はぜひ俺コマンドの作成に挑戦してみてください。
## 宣伝
![スクリーンショット 2021-12-25 9.54.07.png](https://bootcamp.fjord.jp/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBBN2g5QWc9PSIsImV4cCI6bnVsbCwicHVyIjoiYmxvYl9pZCJ9fQ==--53e014c6a6f7bb944b44943658c7c55cc7abf66a/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202021-12-25%209.54.07.png)
[フィヨルドブートキャンプ](/)では明日の12/26(日)~1/4(火)の期間中に入会すると通常3日のお試し期間が7日になる**お正月のプログラミング学習応援キャンペーン**を開催しています。
お試し期間中に退会すれば無料で全ての体験ができますので、年末年始のお休みの機会にぜひプログラミング学習を始めてみてください。
ブログ