こんにちは、タイトルは昨今の流行を取り入れた自虐です😭

MacBook Pro 13inch 2020が来たので設定しつつ、いつもやっている設定を書きます。

キーボードや入力設定をする

まずはこれ。

  • CapsLockをControlにする。
  • キーリピートを最速に、リピート入力認識を最短にする。

App Storeからアプリをインストール

すでにインストールしてたやつをまた入れる。

  • CotEditor
  • Slack
    • みんな大好き。
  • Simplenote
    • 自分用のテキストはここに置いてます。
  • Kindle
    • PCで使うことは意外と多い。
  • TweetDeck by Twitter
    • こういうツールでホームのタイムラインは視界に入れないようにすると精神衛生上良い。
  • Xcode
    • 一応。

Homebrewをインストール

CLI系のアプリをインストール。

  • ghq
  • fzf
  • git
    • 新しい版を使いたい。
  • postgresql
    • 大好き。
  • mysql
    • 嫌いではない。
  • the_silver_searcher
    • 主にvimから全文検索するために使っています。もっといいものが最近はあるけど、vimgrepに比べたら超速いので満足してます。
  • tig
    • Unity+C#をやった時に大量のファイルをaddするのが辛くて使い始めました。
  • node
    • node-gypが憎い。
  • yarn
    • railsで必須だから以外に思い入れは無い。
  • pwgen
    • 手元でサッとランダムなパスワードを作りたい時のために。
  • screen
    • いい加減にtmuxに移りたいが同じ設定がtmuxでできず放置中。
  • go
    • あんまり書いてませんが、プログラムのディレクトリ構成はgoに合わせたままです。
  • rbenv
    • ~/.zshrcに設定を追記するのを忘れてスクールの生徒の方がいつもハマるやつ。
  • ruby-build
    • 最近色々オプションつけなくても良くなった気がする。
  • vim
  • hugo
  • imagemagick
    • 昔は荒ぶっていたが最近は大人しいヤツ。
  • ffmpeg
    • とっつき辛いが覚えれば一番ちゃんと動いてくれるやつ。
  • zsh
  • direnv
    • 特に無し。
  • hub
    • 特に無し。

Homebrew CaskでGUIアプリをインストール。

  • google-chrome
    • メインのブラウザです。
  • chromedriver
  • cyberduck
    • 滅多に出番はないけど慣れてるので使っちゃう。
  • fluid
  • messenger-native
  • sequel-pro
    • 最近不安定。
  • dbeaver-community
    • 使い辛いけど、Sequel Proが落ちる時に。
  • postico
    • 一番使うDBはPostgreSQLなのでお世話になってます。問題が起きたこと無し。
  • macdown
    • ブログなどの長文はこれで書いてます。
  • gyazo
    • いまだに神アプリ
  • discord
    • 自作キーボードのチャンネルに入る時に使ってます。
  • deepl
    • 翻訳すごいですね。
  • libreoffice
    • 主に他の会社の方のドキュメント編集用。Numbersは大抵崩れる。更に互換性が必要な場合はオンラインのOfficeを使う。
  • docker
    • メモリ喰い。
  • openemu
    • 最近中華ポータブルゲーム機にハマってるので。
  • steam
    • Windowsのゲーム用PCでは大活躍中だけど、macは仕事用なのでアンインストールした方がいいかもしれない。僕がやりたいゲームは大抵macでも動くのが困る。
  • sketch
    • 図を書く時に使う。以前Photoshopから移行してきた。
  • visual-studio-code
    • プログラミングスクールとしてはこれを前提としてるのでカリキュラムを作ったり、スクショを撮ったりする時に使います。
  • dropbox
    • 会社のドキュメントを共有してます。
  • 1password
    • 会社のパスワードを共有してます。

手動でアプリを入れる

App Storeにもhomebrewにも無いやつ。

  • zoom
    • 特に競合に対して優位性はないような気がする。

sshの鍵を入れる

USBメモリに入れてるsshの鍵をmacにコピー。

colinux上で作った鍵を使い回していて、セキュリティ的にまずいので作り直した方がよさそう。(今自分のブログを検索したところ2005年頃作った鍵のようだ)

dotfileをダウンロード

bitbucketで管理してたdotfileはgithubのprivateも無料になったのでgithubに移行しました。

シンボリックリンクを貼るsymlink.rbって昔書いたscriptをずっと使ってるけどずっと動いてる。

dotfilesを管理しよう - Qiita

仕事のプロジェクトを動かしてみる

いくつか動かしてみて動いたらOK。

ファイル共有

ドキュメントや画像なんかはicloud driveが安いのでほとんど入れてます。写真はGoogle Photos。

昔に比べるとクラウドで同期されるものが増えて、macを買った時の設定は楽になりました。

Mac設定の自動化

かっちりスクリプト or ツールで自動化しても、実行する機会が滅多に無いので、実行するたびに時代が変わっていてメンテナンスが必要になるのであまり楽にならないというあるある。(会社など複数人で使う自動化は意味がある)

最近のハードウェア・OSのアップデート戦略

以前は、

「毎年旧正月には禊として身を清めてから下ろしたての下着を履きクリーンインストールすべし。1年の垢と厄とキャッシュファイルをきれいにするのだ。」

などと言っていたのですが、

「OSアップデートもクリーンインストールもしない。2年に一度MacBookを買い換えれば良い」

という怠惰な戦略になっています。(最近はMacBookの進化が鈍化してるので買い替え頻度も落ちている)

ただ、上記に書いたように買い換えたときはTime Machineからリストアせず、まっさらから手動で設定しています。

ss

$ ffmpeg -i YJSNPI.mp4 -vf scale=240:-1 -an -vsync 0 img%03d.png
$ mogrify -fuzz 40% -transparent blue *.png
$ convert -delay 3 -loop 0 -dispose background *.png RUNNING_YJSNPI.gif
$ ffmpeg -i bomb.mp4 -vf scale=240:-1,thumbnail=2 -an -vsync 0 img%03d.png
$ mogrify -fuzz 50% -transparent blue *.png
$ convert -delay 3 -loop 0 *.png bomb.gif

-fuzzオプションで透過色の閾値が指定できるようになった。いいゾ~これ。

チャットでのいい加減な爆破オチにお使い下さい。

$ ffmpeg -i smile.flv -vf scale=240:-1,thumbnail=2 -an -vsync 0 img%03d.gif
$ mogrify -transparent blue *.gif
$ convert -delay 6 -loop 0 *.gif bomb.gif

元動画から上手く抜けないなあ。

$ ffmpeg -i movie.mp4 -vf scale=240:-1,thumbnail=20 -an -vsync 0 img%03d.png
$ convert -delay 20 -loop 0 *.png YJSNPI_WHO_LEAPT_THROUGHT_TIME.gif

ffmpegで20フレーム毎、横幅240pxアスペクト比固定でリサイズし、imagemagickでanime gif化する。

ご存知の通りスマホのHTML5 Auidoは現状酷い状態です。

全プラットフォーム共通で再生できるフォーマットが無かったり、iPhoneは独自仕様で自動再生はできず、ユーザー操作由来のアクションからしか再生できなかったり、複数音が再生できなかったり、Androidは2.2までは全然動かなかったり。

対応策として知られているのがCSS SpriteならぬAudio Sprite。複数の音楽ファイルをつなげて一つのファイルにし、シーク位置を制御することで好きな音を鳴らしたりループしたりする姑息なテクです。

そんな面倒なことやってられるかと思ってたんですが、そろそろAudio Sprite用のツールも揃って来ました。

jukebox

zynga/jukebox

ひとつはAudio Sprite用の再生ライブラリjukebox。Zyngaが作ってるのでちょっとマジっぽいです。

var settings = { 
  spritemap: { 
    bgmusic: { 
      start: 0.00,
      end:  20.00,
      loop: true
    },
    shoot: { 
      start: 21.00,
      end: 22.50
    },
    kaching: { 
      start: 24.00,
      end: 24.75
    } 
  } 
};

var player = new jukebox.Player(settings);
player.play('bgmusic'); // faster, sprite entry's id
player.play(12.34); // slower, will search for matching sprite entry

一つにまとまった音楽ファイルと、それぞれの曲のstart位置、end位置、loopの有無の情報を元に簡単に再生できます。勿論AndroidでのFlashへのFallbackもやってくれます。

audiosprite

tonistiigi/audiosprite

もう一つが複数の音楽ファイルを一つにまとめる面倒な作業をやってくれるaudiospriteというnodeのライブラリ。

中身はffmpegのラッパーで、ファイルを全部をくっつけた上に各種プラットフォームをカバーするための複数種類のフォーマットで音楽ファイルを作成してくれます。更にjukeboxで使うための上記で言うsettingsにあたるデータをjsonで出力してくれるという気の効きよう。

iPhoneで一番パフォーマンスが出るCore Audio Format(caf)まで作ってくれるところが泣けます。

% audiosprite --help
info: Usage: audiosprite [options] file1.mp3 file2.mp3 *.wav
info: Options:
  --output, -o      Name for the output file.                             [default: "output"]
  --log, -l         Log level (debug, info, notice, warning, error).      [default: "info"]
  --autoplay, -a    Autoplay sprite name                                  [default: null]
  --silence, -s     Add special "silence" track with specified duration.  [default: 0]
  --samplerate, -r  Sample rate.                                          [default: 44100]
  --channels, -c    Number of channels (1=mono, 2=stereo).                [default: 1]
  --help, -h        Show this help message.

実際試したところ、ちょろっと音を出したい用途には使えそうです。しかし、スマホでネット上からダウンロードして鳴らすにはこのままでは駄目で、大きなファイルになった場合の動作が不安定でした。ローカルに何とかキャッシュする方法を探れば行けるかもしれませんが、僕が試したかった怖話のような大容量の音楽ファイルを鳴らす用途には難しそうです。

URLにひらがなを指定すると、そのひらがなの音声がmp3で得られるwebサーバーを作りました。

komagata’s talkedbun at master – GitHub

インストール/起動

$ sudo gem install komagata-talkedbun -s http://gems.github.com
$ talkedbun

http://localhost:4567/ にwebサーバーが立ち上がります。

Talkedbun </del> japanese text-to-speech server

例えば、http://localhost:4567/うえからくるぞ、きをつけろ! にアクセスするとmp3が開く、という感じです。

http://localhost:4567/うえからくるぞ、きをつけろ!

SayKana – Mac用音声合成プログラムを使っていて、Mac専用です。

しかも、ffmpegにパスが通っている事を要求するなど、お手軽感がいまいちです。

AquesTalkのWin版dllは組み込むのもFreeなので、本当は

“Windows上でaquestalkのdllとmecabとffmpegを組み込んでRuby/DLを使ってアクセスする”

というのが本目的だったんですが、期限が明日までなので時既に時間切れ

仕事でもデプロイ/リリースは面倒な作業ですが、今回はパッケージングも面倒な作業だと思い知りました。

しかし、道具を使う側にとっては重要な部分なので気を配って行きたい。

wavからmp3へ変換

ffmpeg -i input.wav -ab 128 output.mp3

ゆっくりボイス活用のためにMacみたいにsayコマンドですぐ喋れる様にした話は以前書きました

やっぱり日本語が使えると面白くて、会社でわざとこのコマンドだけで会話したりしてました。

ネット越しにもこのおかしさを伝えたいのでrsayコマンドを作ってみました。(rcpみたいなネーミングで)

W + r(ファイル名を指定して実行)から、rsay <話したい台詞> で、

rsay

ゆっくりボイス化したものをmp3でアップして、URLをクリップボードに入れます。

http://tool.komagata.org/voice/23-57-10-95.mp3

TwitterやLingr、メッセンジャーなどにすぐ張れて楽しい。

コマンドといっても単なるバッチです。

rsay.bat:

@echo off
set voice_name=%time:.=-%
set voice_name=%voice_name::=-%
set voice_dir=C:\Documents and Settings\komagata\My Documents\My Music\voice\
set voice_rdir=komagata@komagata.dreamhosters.com:/home/.nudge/komagata/tool.komagata.org/voice/
set voice_url=http://tool.komagata.org/voice/
softalk /S:80 /R:%voice_dir%%voice_name%.wav /W:%1
ffmpeg -i "%voice_dir%%voice_name%.wav" -acodec mp3 "%voice_dir%%voice_name%.mp3" 
pscp "%voice_dir%%voice_name%.mp3" %voice_rdir%
echo %voice_url%%voice_name%.mp3|clip

softalk(ゆっくりボイスの元のAquesTalk Dllを使ったVBアプリ)、ffmepg、pscp(puttyについてるやつ)、clip.exe(パイプでクリップボードに渡せるアプリ)を組み合わせただけのもの。

これじゃ外部コマンドに頼りすぎで手軽に試せないので、今ある納期が終わったらVC++かC#で書き直したいです。

関連: Windowsで日本語でsayコマンド

時々、容量無制限!って書いてある無料HPサービスありますよね。WebDAVかS3互換のプログラムとflvを置いて動画サービスの裏ストレージとして使えないかなと思ってやってみたんですが、いまいちだった。理由は2つ。

1つは、容量無制限つっても規約で大抵ファイル置き場にしちゃだめとかあるし、膨大なHDD使用料と転送量でさすがにバレる。(当たり前)

2つは、動画の変換にCPUがかなり必要になる。無料HPサービス側じゃFFmpegは動かせなさそうだし、3年前のうんこノート上のcoLinux上で実時間の3倍ぐらいかかる。これかかり過ぎかな?

flvへの変換はニコニコ動画用ファイル作成Wikiを参考にしてFFmpeg 2passでコンパイル。一括変換したいので下記のようなスクリプトを書いて一晩置いたら終わってた。

#!/usr/bin/env ruby

$KCODE = "u" 

require "tmpdir" 
require "fileutils" 
require "pathname" 

def abspath(file)
  Pathname.new(file).realpath.to_s
end

def movie2flv(src)
  dst = src.gsub(/\..{1,4}$/, ".flv")
  puts dst+"\n" 
  passlog = Dir.tmpdir+"/passlog" 
  system "ffmpeg -i \"#{src}\" -vcodec flv -r 15 -b 500k -cropleft 6 -cropright 6 -s 512x384 -deinterlace -pass 1 -passlogfile \"#{passlog}\" -an -y \"#{dst}\"" 
  system "ffmpeg -i \"#{src}\" -vcodec flv -r 15 -b 500k -cropleft 6 -cropright 6 -s 512x384 -deinterlace -pass 2 -passlogfile \"#{passlog}\" -ar 44100 -ab 128k -y \"#{dst}\"" 
  File.delete(passlog)
end

src = abspath(ARGV[0])
if File.directory?(src)
  Dir.foreach(src) do |f|
    f = abspath(src+"/"+f)
    unless File.directory?(f)
      puts "#{f}\n" 
      movie2flv(f)
    end
  end
else
  puts "#{src}\n" 
  movie2flv(src)
end

音声のcodecは普通libmp3lameだそうだけどDebianデフォルトのFFmpegじゃ駄目。面倒なので無しで。ちゃんとやるならソースからコンパイルした方が良さそう。

Player側はJavascriptとNonverBlaster

と、1日かけたところで出来たのは俺専用動画サービス。このままじゃ一銭にもなりそうにないので眠らせとこう。