YAMAGUCHI::weblog

土足で窓から失礼いたします。今日からあなたの息子になります。 当年とって92歳、下町の発明王、エジソンです。

TidalCycles環境をセットアップする

はじめに

こんにちは、ファイナンシャル・プランニング技能士です。ちょっと最近普通のプログラミングとは別にオーディオプログラミングとかヴィジュアルアートプログラミングとかで遊びたいなーと思いはじめてたところに、TLでTidalCyclesを見かけました。うまくSuperColliderをラップしてて面白そうなので、とりあえず環境構築をしてみることに。

Arch Linux

SuperColliderをインストール

普通にパッケージがあるのでインストール。

% pacaur -S supercollider sc3-plugins

stackを使ってtidalのインストール

公式サイトのインストール手順 に書いてあるとおりに適当に進めてみたら、家のArchでは cabal install tidal でいろいろ設定をいじってもインストールできなかった。ArchのpacmanでインストールするGHCがデフォルトだと動的リンクをするのに対し、cabalでのデフォルトの設定が静的リンクになっているせいかとも思ったが、設定を変えるても失敗するのでstackで入れることにした。

% pacaur -S stack
% stack setup
% stack install tidal

SuperDirtのインストール

インストール手順にあるようにSuperColliderを起動して、エディターに include("SuperDirt") を入力して実行。するとPost Windowにインストールログが流れ始めてインストール作業が行われていることがわかる。

*** Welcome to SuperCollider 3.9.3. *** For help press Ctrl-D.
Couldn't set realtime scheduling priority 1: 許可されていない操作です
file "/home/ymotongpoo/.local/share/SuperCollider/Help/scdoc_version" does not exist.
SCDoc: Indexing help-files...
SCDoc: Indexed 1802 documents in 0.77 seconds
Fetching https://github.com/supercollider-quarks/quarks.git
Installing SuperDirt
Installing Vowel
Adding path: /home/ymotongpoo/.local/share/SuperCollider/downloaded-quarks/Vowel
Vowel installed
Installing Dirt-Samples
Adding path: /home/ymotongpoo/.local/share/SuperCollider/downloaded-quarks/Dirt-Samples
Dirt-Samples installed
Adding path: /home/ymotongpoo/.local/share/SuperCollider/downloaded-quarks/SuperDirt
SuperDirt installed
... the class library may have to be recompiled.
-> SuperDirt

SuperDirtの起動に失敗するのでjackdを手動で起動

手順どおりに SuperDirt.start を実行するとオーディオを正しく起動できなかったとエラーメッセージが出る。

-> SuperDirt
booting server 'localhost' on address: 127.0.0.1:57110
Found 10 LADSPA plugins
jackd 0.125.0
Copyright 2001-2009 Paul Davis, Stephane Letz, Jack O'Quinn, Torben Hohn and others.
jackd comes with ABSOLUTELY NO WARRANTY
This is free software, and you are welcome to redistribute it
under certain conditions; see the file COPYING for details

could not initialize audio.
RESULT = 0

ちょっと調べた結果、どうもSCで利用しているjackdが正しく起動出来ていないようなので、手動でjackdを起動する。

% pacaur -S libffado
% jackd -r -d alsa   
jackd 0.125.0
Copyright 2001-2009 Paul Davis, Stephane Letz, Jack O'Quinn, Torben Hohn and others.
jackd comes with ABSOLUTELY NO WARRANTY
This is free software, and you are welcome to redistribute it
under certain conditions; see the file COPYING for details

Cannot create RT messagebuffer thread: Operation not permitted (1)
Retrying messagebuffer thread without RT scheduling
Messagebuffer not realtime; consider enabling RT scheduling for user
JACK compiled with System V SHM support.
loading driver ..
creating alsa driver ... hw:0|hw:0|1024|2|48000|0|0|nomon|swmeter|-|32bit
configuring for 48000Hz, period = 1024 frames (21.3 ms), buffer = 2 periods
ALSA: final selected sample format for capture: 32bit integer little-endian
ALSA: use 2 periods for capture
ALSA: final selected sample format for playback: 32bit integer little-endian
ALSA: use 2 periods for playback

改めて SuperDirt.start を実行するときちんと起動できた。

-> SuperDirt
booting server 'localhost' on address: 127.0.0.1:57110
Found 10 LADSPA plugins
JackDriver: client name is 'SuperCollider'
SC_AudioDriver: sample rate = 48000.000000, driver's block size = 1024
JackDriver: connected  system:capture_1 to SuperCollider:in_1
JackDriver: connected  system:capture_2 to SuperCollider:in_2
JackDriver: max output latency 21.3 ms
JackDriver: connected  SuperCollider:out_1 to system:playback_1
JackDriver: connected  SuperCollider:out_2 to system:playback_2
SuperCollider 3 server ready.
Requested notification messages from server 'localhost'
localhost: server process's maxLogins (1) matches with my options.
localhost: keeping clientID (0) as confirmed by server process.
Shared memory server interface initialized
loading synthdefs in /home/ymotongpoo/.local/share/SuperCollider/downloaded-quarks/SuperDirt/classes/../synths/core-modules.scd
---- core synth defs loaded ----
loading synthdefs in /home/ymotongpoo/.local/share/SuperCollider/downloaded-quarks/SuperDirt/classes/../synths/core-synths.scd
loading synthdefs in /home/ymotongpoo/.local/share/SuperCollider/downloaded-quarks/SuperDirt/classes/../synths/default-synths.scd
loading synthdefs in /home/ymotongpoo/.local/share/SuperCollider/downloaded-quarks/SuperDirt/classes/../synths/try-load-extra-synths.scd
loading synthdefs in /home/ymotongpoo/.local/share/SuperCollider/downloaded-quarks/SuperDirt/classes/../synths/tutorial-synths.scd

loading 217 sample banks:
808 (6) 808bd (25) 808cy (25) 808hc (5) 808ht (5) 808lc (5) 808lt (5) 808mc (5) 808mt (5) 808oh (5) 808sd (25) 909 (1) ab (12) ade (10) ades2 (9) ades3 (7) ades4 (6) alex (2) alphabet (26) amencutup (32) armora (7) arp (2) arpy (11) auto (11) baa (7) baa2 (7) bass (4) bass0 (3) bass1 (30) bass2 (5) bass3 (11) bassdm (24) bassfoo (3) battles (2) bd (24) bend (4) bev (2) bin (2) birds (10) birds3 (19) bleep (13) blip (2) blue (2) bottle (13) breaks125 (2) breaks152 (1) breaks157 (1) breaks165 (1) breath (1) bubble (8) can (14) casio (3) cb (1) cc (6) chin (4) chink (1) circus (3) clak (2) click (4) clubkick (5) co (4) control (2) cosmicg (15) cp (2) cr (6) crow (4) d (4) db (13) diphone (38) diphone2 (12) dist (16) dork2 (4) dorkbot (2) dr (42) dr2 (6) dr55 (4) dr_few (8) drum (6) drumtraks (13) e (8) east (9) electro1 (13) erk (1) f (1) feel (7) feelfx (8) fest (1) fire (1) flick (17) fm (17) foo (27) future (17) gab (10) gabba (4) gabbaloud (4) gabbalouder (4) glasstap (3) glitch (8) glitch2 (8) gretsch (24) gtr (3) h (7) hand (17) hardcore (12) hardkick (6) haw (6) hc (6) hh (13) hh27 (13) hit (6) hmm (1) ho (6) hoover (6) house (8) ht (16) if (5) ifdrums (3) incoming (8) industrial (32) insect (3) invaders (18) jazz (8) jungbass (20) jungle (13) juno (12) jvbass (13) kicklinn (1) koy (2) kurt (7) latibro (8) led (1) less (4) lighter (33) linnhats (6) lt (16) made (7) made2 (1) mash (2) mash2 (4) metal (10) miniyeah (4) moan (1) monsterb (6) moog (7) mouth (15) mp3 (4) msg (9) mt (16) mute (28) newnotes (15) noise (1) noise2 (8) notes (15) numbers (9) oc (4) odx (15) off (1) outdoor (6) pad (3) padlong (1) pebbles (1) perc (6) peri (15) pluck (17) popkick (10) print (11) proc (2) procshort (8) psr (30) rave (8) rave2 (4) ravemono (2) realclaps (4) reverbkick (1) rm (2) rs (1) sax (22) sd (2) seawolf (3) sequential (8) sf (18) sheffield (1) short (5) sid (12) sine (6) sitar (8) sn (52) space (18) speakspell (12) speech (7) speechless (10) speedupdown (9) stab (23) stomp (10) subroc3d (11) sugar (2) sundance (6) tabla (26) tabla2 (46) tablex (3) tacscan (22) tech (13) techno (7) tink (5) tok (4) toys (13) trump (11) ul (10) ulgab (5) uxay (3) v (6) voodoo (5) wind (10) wobble (1) world (3) xmas (1) yeah (31) 
... file reading complete. Required 439 MB of memory.

server 'localhost' disconnected shared memory interface
Shared memory server interface initialized
loading synthdefs in /home/ymotongpoo/.local/share/SuperCollider/downloaded-quarks/SuperDirt/classes/../synths/core-modules.scd
---- core synth defs loaded ----
loading synthdefs in /home/ymotongpoo/.local/share/SuperCollider/downloaded-quarks/SuperDirt/classes/../synths/core-synths.scd
loading synthdefs in /home/ymotongpoo/.local/share/SuperCollider/downloaded-quarks/SuperDirt/classes/../synths/default-synths.scd
loading synthdefs in /home/ymotongpoo/.local/share/SuperCollider/downloaded-quarks/SuperDirt/classes/../synths/try-load-extra-synths.scd
loading synthdefs in /home/ymotongpoo/.local/share/SuperCollider/downloaded-quarks/SuperDirt/classes/../synths/tutorial-synths.scd

loading 217 sample banks:
808 (6) 808bd (25) 808cy (25) 808hc (5) 808ht (5) 808lc (5) 808lt (5) 808mc (5) 808mt (5) 808oh (5) 808sd (25) 909 (1) ab (12) ade (10) ades2 (9) ades3 (7) ades4 (6) alex (2) alphabet (26) amencutup (32) armora (7) arp (2) arpy (11) auto (11) baa (7) baa2 (7) bass (4) bass0 (3) bass1 (30) bass2 (5) bass3 (11) bassdm (24) bassfoo (3) battles (2) bd (24) bend (4) bev (2) bin (2) birds (10) birds3 (19) bleep (13) blip (2) blue (2) bottle (13) breaks125 (2) breaks152 (1) breaks157 (1) breaks165 (1) breath (1) bubble (8) can (14) casio (3) cb (1) cc (6) chin (4) chink (1) circus (3) clak (2) click (4) clubkick (5) co (4) control (2) cosmicg (15) cp (2) cr (6) crow (4) d (4) db (13) diphone (38) diphone2 (12) dist (16) dork2 (4) dorkbot (2) dr (42) dr2 (6) dr55 (4) dr_few (8) drum (6) drumtraks (13) e (8) east (9) electro1 (13) erk (1) f (1) feel (7) feelfx (8) fest (1) fire (1) flick (17) fm (17) foo (27) future (17) gab (10) gabba (4) gabbaloud (4) gabbalouder (4) glasstap (3) glitch (8) glitch2 (8) gretsch (24) gtr (3) h (7) hand (17) hardcore (12) hardkick (6) haw (6) hc (6) hh (13) hh27 (13) hit (6) hmm (1) ho (6) hoover (6) house (8) ht (16) if (5) ifdrums (3) incoming (8) industrial (32) insect (3) invaders (18) jazz (8) jungbass (20) jungle (13) juno (12) jvbass (13) kicklinn (1) koy (2) kurt (7) latibro (8) led (1) less (4) lighter (33) linnhats (6) lt (16) made (7) made2 (1) mash (2) mash2 (4) metal (10) miniyeah (4) moan (1) monsterb (6) moog (7) mouth (15) mp3 (4) msg (9) mt (16) mute (28) newnotes (15) noise (1) noise2 (8) notes (15) numbers (9) oc (4) odx (15) off (1) outdoor (6) pad (3) padlong (1) pebbles (1) perc (6) peri (15) pluck (17) popkick (10) print (11) proc (2) procshort (8) psr (30) rave (8) rave2 (4) ravemono (2) realclaps (4) reverbkick (1) rm (2) rs (1) sax (22) sd (2) seawolf (3) sequential (8) sf (18) sheffield (1) short (5) sid (12) sine (6) sitar (8) sn (52) space (18) speakspell (12) speech (7) speechless (10) speedupdown (9) stab (23) stomp (10) subroc3d (11) sugar (2) sundance (6) tabla (26) tabla2 (46) tablex (3) tacscan (22) tech (13) techno (7) tink (5) tok (4) toys (13) trump (11) ul (10) ulgab (5) uxay (3) v (6) voodoo (5) wind (10) wobble (1) world (3) xmas (1) yeah (31) 
... file reading complete. Required 439 MB of memory.

SuperDirt: listening to Tidal on port 57120

Atomの設定とテスト

Atomをインストールして、tidalcyclesパッケージをインストール。中で呼び出すghciの起動コマンドの設定があるので、そこを stack ghci に変更しておく。

f:id:ymotongpoo:20180520181340p:plain

その上で、 Packages > TidalCycles > Boot TidalCycles を実行する。インストール手順書にあるように次のコードをEvalしてみて音がなったら成功。

d1 $ sound "bd sn"

jackdとSuperColliderの起動のスクリプト

一応これで動いたけれど、jackdを手動で起動して、かつSuperDirtの起動のためだけにSuperColliderIDEを起動するのは大げさなので、スクリプト化してターミナルだけで完結するようにする。

まず start.scd という名前でSuperDirt.startを呼ぶだけのコードを保存しておく。

(
SuperDirt.start
)

次に先ほどのjackdの起動とstart.scdの読み込みだけの簡単なシェルスクリプトを用意する。

#!/bin/bash

jackd -r -d alsa &
sclang start.scd

これのシェスクリプトを起動すればいちいちSuperCollider IDEを起動しなくて良くなる。終わったあとはjackdをちゃんとkillしないと音声を出すアプリケーションが動かなくなるので注意。

参考

YAMAGUCHI::weblogの2017年を振り返る

はじめに

こんにちは、おじさんです。こんな日に誕生日というのも毎度のことながら忙しい時期に生まれたもんだと思います。というわけで例のやつです。

以下、突然のである調。

関連エントリ

ここまで続けると毎年やらないわけにいかない感じになってる。

ymotongpooの2017年

昨年立てた目標

去年も同じこと書いたけど、毎年このエントリの最後に「来年は〜」って書いてるんだけど全然覚えてない。

スペイン語の勉強

2016年9月にスペインに行ってみて、スペインが思ったより良かったので、麻疹にかかったようにスペイン語面白いといって熱をあげてたんだが、結局日本に帰ってくると使うことがなさすぎていつの間にかDuolingoもやめてしまった。 英語は毎日使うので嫌でも毎日勉強になっているんだけれども、やはりスペイン語も似たように毎日使うようなモチベーションがなにかないと続けるのは大変だなあ。

誰かと一緒にDuolingoで競えていたら少しはやりがいも出るんですが、誰かやりませんか。

Pythonやり直す

一時期Pythonを使って細かなツールなんかを書いたりしてたので、だいぶ勘所は戻ったかなという感じ。

久々に使っても、割とすんなりキャッチアップできるのは使う側としてはありがたいと思った。特にエコシステムが落ち着いてるので、1年離れただけで浦島太郎になってしまうことがないという安心感は大きい。

資産運用を引き続き

資産運用に関しては本当にしっかり取り組んだ一年だった。詳細は直前のエントリにて。

お金に関連する話(税制や金融商品に関する知識など)は知ってるだけで得することが多く、特にその知識を網羅的に体系だてて知るためにもFP技能試験を受験するのが良いという結論に至った。まずは3級から始めるけれど、来年中に2級も受けたい。

今年はお金をあちこちに移動させた年だったので、来年1年はお金の流れを落ち着いて観察してプランしたとおりに実行できているか評価したい。こういった評価をするのは初めてなので楽しみでもある。

ジム

もはや生活に当たり前のように溶け込んでいるので、あらためて評価をするということはなのだけれど、生活習慣になるまで自身の生活に溶け込んだと考えると良いことだったと思う。

基本的には週3〜4日はジムに行くようにしていて、時間がないときも1時間程度4種目はこなすようにしている。慣れてくると不思議なもので、用事が立て続けにあり、予定していたペースでジムに行けないと体がムズムズするような感覚になる。 出張のときなども、事前に滞在先のホテルにジムがあるか確認し、スケジュールを見て夕食後、もしくは朝食前などに行くようにしている。

今年特にやっていたこと

仕事など

今年はGoogle I/Oまでは主にウェブ関連(AMPやPWAの普及、特に企業向けのサポートなど)を行っていた。またGoogle I/OGoogleアシスタントの日本語対応とGoogle Homeの日本での販売が発表されたけれども、今年の頭からそのリリースに関する様々なプロジェクトに関わることができた。特にGoogleアシスタントの外部開発者向け機能のActions on Googleの日本語対応に関する早期アクセスなどに関わった。

GoogleアシスタントGoogle Home以外の端末(AndroidスマートフォンAndroid WearAndroid TV、Googleアシスタント搭載スマートスピーカーなど)でも動作するし、他にも今年はAmazon EchoやLINE Clova WAVEなど日本でも一気に展開された。スマートスピーカーをすでにお持ちの方はまだまだ発展途上の領域だし、これのおかげで生活が一変するというようなものではないかもしれないが、確実に便利な使い方というのあるということを実感されていると思う。

スマートスピーカーを始めとする音声UIツールのブームが今年だけで終わらないよう、来年も市場全体を大きくできるように動きたいと思う。

MacからLinuxに開発環境を移した

今年初頭の環境は次のような感じだった。

しかしながら、最近のmacOS自体の開発環境としての性質に疑問が多く生じてきたのでメイン環境をLinuxに移行し、次のような環境になった。

先のエントリーにも書いたが、ラップトップマシンをデスクトップ環境として使っていた結果バッテリーをだめにしてしまったので、自宅にもデスクトップ環境を用意した。最近のLinuxデスクトップ環境は本当によくできていて、4kモニタも問題なく使えるし、日本語入力も問題ない。フォントもNotoシリーズを始め高品質なものがたくさんあるし、エディタやIDEは自分が使う範囲ではEmacsVimVisual Studio Code、Android StudioIntelliJ)などすべてLinuxで動く。Google ChromeFirefoxも動作するので、日常必要なことはだいたいまかなえる。

唯一困る点としては各種Adobe製品が動かないことだけれど、Lightroomは最近はブラウザである程度できるので簡単なことはそこで、もし本格的に動かすとなったらサブ機としたMacBook Proで作業するようにした。

出張/旅行

今年も多くの出張や旅行に行った。

自作キーボード

Kinesisから始まって、いまは会社でも自宅でもErgoDox EZを使っているわけだけど、長らく使っているうちにやはり改善したい点などは出てきて、ついにこの深い沼に今年入り始めてしまった。

いまはLet's SplitとMinidoxのPCBがあるのでとりあえずこれを作らないといけない。ちょっと製作時に失敗してしまったので、年始に道具が揃ったらきちんと仕上げたいと思う。

来年に向けて

まあ覚えてたらいいなってくらいのスタンスでの目標。

  • FP技能検定2級
    • 1月に3級の試験を受けるので、そこではずみをつけたい。
  • 自作キーボード
    • とりあえずいまある基盤3枚は作りたい。安定して作成できるようにしたい。
  • ジム
    • 荷重懸垂を始めて、記録を伸ばしたい。
  • 書籍
    • そろそろまた出したい

2017年に買ってよかったもの

はじめに

こんにちは、三十路男です。今年も残すところあと3日となりましたが皆さんいかがお過ごしでしょうか。去年書いてみたら結構1年の間になにを買ったかが明確になってよかったので、今年もやってみる。

2017年に買ってよかったもの

SONY WI-1000X ワイヤレスノイズキャンセリングイヤホン

12月に入ってから買ったけれど、これのおかげで国際線の機内でも快適に映画を見ることができてよかった。気に入ってる点を書くと次の通り。

  • ノイズキャンセリングの性能が高い
  • 電池の持ちが長い
  • ネックバンドタイプなのでなくしづらい
  • イヤホンジャックにつなぐためのケーブルがついてくる

特に最後のやつは地味に重要で、飛行機用の左右が分離したステレオジャックも付属してくるので、機内でもそのまま使えます。 機内で使えてカタログスペックではあるけれど13時間使えるので、日本〜サンフランシスコ間、日本〜ロンドン間も十分カバーできるので安心です。

Intel NUC

これも12月頭ですね。12月にいろいろと物入りになって参りました。MacBook Pro 15'' (Mid 2014) が11月末にバッテリーが膨張してしまったのでApple Store表参道で修理したんですが、原因がはおそらく過充電でした。 そもそもこの2ヶ月前くらいからXPS 13''にArch Linuxを入れてメインマシンに切り替えていたし、ノートPCを外付けモニタに繋いで使い続けるのはマシンによくないので前々からデスクトップマシンはほしいと思っていました。 しかしながら、マシンの性能自体が上がっていて、高い負荷をかけるような処理もほぼ必要ないので、 タワーPCではなくコンパクト筐体のマシンが望ましく思いました。 数年前までであればおそらくMac miniを買ったんでしょうが、iOS開発をメインでしているわけでもなく、POSIX環境としてもmacOSに疑問を持ってLinux環境をメインに変えたので、じゃあこれだなってことでNUCにしました。

NUCには様々なモデルが出ていますが、Intel Core i5であればちょっとした検証で負荷をかけるにしても十分なので、それベースの筐体を選択しました。メモリがボトルネックになることが多いので(動画の処理や写真の現像など)、メモリはしっかり積みました。しかし最近のLinuxはすごいですね。このマシンはArch LinuxではなくUbuntuにしたのですが、家に各パーツが来てから部品を入れてOSのインストールをして普通に常用できる環境にするまで2時間程度でできました。まったく何も困りません。4kモニタ(後述)の設定もまったく困りませんでした。

JAPANNEXT JN-IPS320UHD

JAPANNEXT JN-IPS320UHD 4K 32インチ液晶ディスプレイ アルミ製 AMD freesync UHD PCモニター

JAPANNEXT JN-IPS320UHD 4K 32インチ液晶ディスプレイ アルミ製 AMD freesync UHD PCモニター

先述のNUCを購入する前に、7年前に買ったフルHDモニタだけで作業するのはいい加減近年の作業環境として厳しいなと思い、4kモニタを購入することにしました。 モニタを買うのが久々すぎたのでまったく勘所がなかったですが、4k 60Hzが出せるもので評価が安定しているJAPANNEXTのものを購入しました。

画面サイズはおかげで非常に快適で、ブラウザとエディタを画面を縦半分に分けて使ってまったく問題ないです。画面が大きいので、高さをかさ増ししないと画面の下側を見るのはちょっとストレスがあり、また持っていたモニタアームの重量を超えていたので使えなかったのが残念ですが、適当に台をおいて対応しようと思います。通常閲覧する分には画面上から3分の2程度を見ていれば良いので快適です。

パンデミック:新たなる試練 日本語版

これまでボードゲームとは疎遠だったのですが、 @shiumachi とたまたまこのゲームをする機会がありやってみって面白かったんで購入しました。このボードゲームは「協力ゲーム」と呼ばれるジャンルで、参加者全員で敵と対峙して困難を乗り越えるというのが参加者の目標です。このゲームは名前の通り世界でパンデミックが発生しかけている状態からゲームが開始し、参加者それぞれに割り振られている特殊技能を活かして病原菌を退治するというゲームです。このゲームの何がいいかと言うと、酔っ払った状態で複数人でワイワイやると盛り上がるということです!

AliExpress全般

11月半ばごろから自作キーボード熱が高まったのでAliExpressを利用することが非常に増えました。特にどれが優れていい、ということではなかったのですが、正直これまでAliExpressに持っていた印象がまったく変わりました。

たとえばこの500円の無線イヤホン。

www.aliexpress.com

500円で送料無料なんですが、正直「500円だろ?買って3日で壊れるだろ」とか「どうせ音質最悪だろ」とか鷹をくくってたわけです。でも送料無料だし、なんかネタでおもしろそうかなと思って買ってみたら驚きでした。こんなに安いのに、無線で音もちゃんとしてるんです。もちろん、高級イヤホンと比べたら明らかに違いがわかるんですが、適当に音楽を聞くだけなら全然使えます。ラジオを聞いたりするのであればもう十分です。

ほかにもこの商品。これはハンダを剥がすための道具なんですが、200円以下ですよ?それで中国から買って送料無料なんです。これを売って一体どうやって儲けてるんでしょう。

www.aliexpress.com

こういうような商品がいっぱいあるんです。それでも届いてみるとちゃんと使えるんだからすごい。個人的な感想としては、価格に対するサービスレベルの設定が絶妙なんですよね。例えば包装。これはAmazonなんかとくらべちゃいけません。無茶苦茶です。届いてみたらダンボールは潰れてるし、そもそもダンボールもどっかの使い回しのダンボールの、しかも切れっ端だし。でも別にいいんです。中身は何も問題ないから。あと問題あったらもう一回送ってくれるから。

これは「サービス」に対する考えを再認識させてくれるものでした。

おわりに

個人的にはものはなければない方がいいと思っているのですが、一方で持っているものを買い替えたり、これまでにまったくなかった新しいものというのは買ってみないといけないなと思っています。来年も新しいものとの出会いが楽しみです。

資産運用に取り組み始めた

はじめに

こんにちは、南国旅行から帰ってきたものです。日本寒すぎ。今年もあと10日ほどとなりましたがみなさんは楽しくお過ごしでしょうか。

この記事は pyspa Advent Calendar の21日目の記事です。前日は @takabowの旅行記 でした。

去年は 健康に気を遣って筋トレを始めた 話を書きましたが、今年は健康に加えて今後のライフプランを考えて資産運用を始めた話を書こうと思います。

TL;DR

FPに資産運用の相談をして資産運用を開始したら、色々面白くなってFP技能試験を受けることにした。

みんなが欲しかった! FPの教科書 3級 2017-2018年 (みんなが欲しかった! シリーズ)

みんなが欲しかった! FPの教科書 3級 2017-2018年 (みんなが欲しかった! シリーズ)

何をしたのか

資産運用すると言っても人それぞれの事情があり、すべての人に最適な唯一の資産運用プランというものは存在しませんので、あくまでこれは自分の話です。しかしながら計画をする際にはまず現状を明らかにすることは必要で、まずそこから始めました。 ちょうど資産運用をしなきゃなあと思っていたところに独立系ファイナンシャルプランナーの方と話す機会が得られたので、じっくりと時間を使って資産運用計画を練りました。

具体的には次のような流れです。

  1. 保有資産の把握
  2. 月次の資産の流れの把握
  3. 今後の人生計画の明文化
  4. 各ライフステージにおける費用の概算
  5. 短・中・長期での保有資産の割り振りと計画
  6. 各計画に応じた資産運用の実行

それぞれは当たり前に聞こえますが、一連の作業をちゃんとやるとそれなりに時間がかかる作業でした。

1. 保有資産の把握

まず何はともあれ、保有資産の把握です。これがわからなければ、資産の短・中・長期での割り振りなどができないので、現状の資産を洗い出しました。幸か不幸か、おおよその資産は預金、個人向け確定拠出年金、少ない銘柄の株しかなかったので、Money Forwardに登録していたこともあり、すぐに把握することができました。

2. 月次の資産の流れの把握

次はキャッシュフローを把握する作業をしました。当たり前の話ですが、固定費は毎月かかってくるものなので、ここが改善できると毎月資産を積み上げていけることになります。無駄なものにお金を払っていないか、日々の生活を振り返る上でもとても有意義な作業でした。

たとえば、保険の見直しや、確定拠出年金の掛け金の見直し、月々の光熱費の把握から始まり、職業柄各種オンラインサービスに登録しているので、その必要性など、さまざまな角度から現状を理解していきました。

3. 今後の人生計画の明文化

なんとなく「これからの人生はこんな感じかなあ」と思っていても、どういうイベントにどのくらいの費用がかかるのか、実際に書き出してみないとしっかりと把握することはできません。

結婚、住宅、育児、老後など、考えることは無限にありますが、大まかにどういうイベントが何歳ごろに起きそうなのかを書き出していきます。この中には予期せぬ病気や怪我なども含まれています。あくまで予想で、何年以内に何回ぐらい大病や怪我で収入が得られなくても耐えられるのかなどの把握をするためのものです。

人生計画と書くと大げさに見えますが、例えば数年おきにラップトップを新調するとか、年に1回は旅行に行くといったものも、定期的にまとまったお金が出ていくようなイベントは挙げていきます。

4. 各ライフステージにおける費用の概算

どういうイベントがいつに起きそうかわかったらそれぞれにかかる費用を計算していきます。簡単な算数です。どのタイミングでどれくらいの費用が必要かわかれば、現在保有している資産をどういった金融資産に割り振るかが決まるわけです。

よくある話としては老後はどういった生活をしたいか、です。年金制度が仮にいまのまま続いたとしたら年金でいくらもらえて、インフレ率がどれくらいになるはずなので、月にいくらかかって、など予想で計算していきます。当たり前の話ですが、あくまで予想なのでこれで完璧になるわけではありませんが、備えがないよりはよっぽどマシです。

また資産運用は目標がないと正しい判断を下せなくなるので、このステップで貯蓄目標を立てます。

5. 短・中・長期での保有資産の割り振りと計画

資産がわかったら、各ライフイベントにあわせて短・中・長期で保持していく資産の割り振りを行います。

大まかに短期=直近5年、中期=5年〜15年、長期=それ以上くらいに必要になりそうなまとまった費用をそれぞれのカテゴリに分けて運用していきます。まずはざっくりとすでに持っている保有資産を割り振ったあとに、キャッシュフローから月にいくらずつそれぞれの資産とし割り振っていくかを決定します。

このとき資産の持ち方も考えます。いままで何も考えてなかったのでおおよそ日本円で預金の形で保有していましたが、なんともったいないことをしていたのかと思いました。資産運用は投資と直結しますが、それぞれの金融資産の流動性とリスクを加味して、割り振ったあとの資産をどの金融資産でどれだけ保有するかも考えます。普通預金、定期預金、財形貯蓄、団体保険、積立保険、債権、投資信託ETF)、株式、不動産、など、それぞれに特徴があります。たとえば短期資産を不動産で持とうという人は少ないでしょう。 また運用をする際にも確定拠出年金(企業型・個人型)、NISAなど税制上優遇されるものもあるので、そうした制度の仕組みを把握することもこのタイミングで行いました。

これは人それぞれの状況(経済状況、家族構成、年齢、リスク許容度など)によって変化するので一概にどういう形で持つべきであるとは言えません。ただ自分で納得のいく運用ができることが大事だと感じました。この納得の行くポートフォリオを組む部分がまた面白いところでもありました。

6. 各計画に応じた資産運用の実行

計画ができたらあとは実行するだけです。例えば、いままで特に困ってなかったのでメガバンクのと外貨用にシティバンクしか口座を持っていなかったのを、いくつかのネット銀行の口座を開設してメインバンクの変更をしたり、ネット証券の口座を開設してNISAでの運用を始めたり、個人型確定拠出年金iDeCo)の口座を変更したりなど様々です。

この時期はまとまったお金が動くので気持ちとして落ち着かないところもありましたが、いまは持っている資産をきちんと割り振ることができたので、ようやくスタート地点に立てたかなという気持ちです。ここからきちんと運用していくことが大事になるので、定期的に自分でも振り返りを書いています。

FP技能検定を受けることにした

ファイナンシャルプランナーに相談しているうちに、お金周りの身近な制度や資産に関して興味が出てきたので色々調べていたら、結局FP技能検定用のテキストを読むのが一番早いという結論に至って今読んでいます。

ファイナンシャルプランナーというのは士業ではないため、資格がなくても事業が始められますし、また別途資格がなければできない業務内容があったりします。(cf. 税理士、証券外務員、保険外交員など)そのためFP技能士の資格を持ってもどうということはないのですが、ITパスポート試験などと同じで、とりあえず網羅的に理解をするためのきっかけとしての受験はありかなと思って面白半分で受験申請をしました。

pyspaの人にもファイナンシャルプランナーのことを話して、上記のようなことをしたと共有したら、多くの方が同じファイナンシャルプランナーに相談して、皆が「良かった」と言っていました。皆それぞれにしっかりとしたエンジニアなんだけれども、いざ自分の資産計画となると、まだまだ考えることがたくさんあったようで、自分と同じく良いきっかけになったようです。

自分があったことある人ならもうちょっと具体的な話を共有できるので、興味あったら教えてください。まずは試験に受かるようにがんばります。

明日は @shiumachi の記事です。

or-done-channelでコードの可読性を上げる

はじめに

こんにちは、キーボード自作おじさんです。このエントリはGo Advent Calendar 2017の4日目の記事です。 今年のエントリーは大作が並ぶアドベントカレンダーの休憩用のエントリーと思っていただければ幸いです。

Goの並列処理のパターン

Goが公開されてからもう8年になり、Goが得意とする並列処理にもGo特有のパターンなどがコミュニティ内で蓄積されてきました。 その中でもよく聞くものとしては

  • for-select loop
  • or-channel
  • or-done-channel
  • tee-channel
  • fan-in, fan-out

などがあります。今日はその中でも or-done-channel について書こうと思います。

どういうときに or-done-channel を使うか

上限の数が決まっているような処理を行う場合に

  • データのソースからの入力が終わってしまった場合(channelのcloseに対応)
  • 上限の数に達してしまった場合(doneに対応)

のいずれかに当てはまる場合に便利なパターンです。

rangeを使う場合

まずchannelがcloseするまでの処理を行う場合は、range キーワード使って forループを回すのが便利で可読性も高いです。

for v := range ch {
    something(v)
}

しかし、この場合は処理の上限に達してしまった場合が対応できません。何らかの形で ch と done の両方を受けてあげる必要があります。

for-select loopだけを使う場合

そうなるとGoで複数のchannelを使った並行処理を書こうと思った場合には for-select loop が一番良く出てくるので、それを書きたくなります。

LOOP:
for {
    select {
    case v, ok := <-ch:
        if !ok {
            break LOOP
        }
        something(v)
    case <-done:
        break LOOP
    }
}

これでとりあえず希望の処理は書けるのですが、どうも見た目が大きくなってしまいます。そこでこの処理を別途まとめて、rangeの書き方に持ち込むのが or-done-pattern です。

or-done-channel

deferの性質を使って done が来ても ch からのデータ取得が終わった場合にも、かならず stream を close しています。これで得られる stream が閉じられたどうかだけ意識すればよくなるため、普通に range のパターンに持ち込めるわけです。

func orDone(done <-chan bool, ch <-chan Data) <-chan Data {
    stream := make(chan Data)
    go func() {
        defer close(stream)
        for {
            select {
            case <-done:
                return
            case v, ok := <-ch:
                if !ok {
                    return
                }
                stream <- v
            }
        }
    }()
    return stream
}

for v := range orDone(done, ch) {
    something(v)
}

Goはシンプルな文法ながら、 goroutinechannelfordefer などの機能をうまく組み合わせると非常に柔軟な書き方ができるので、こういった書き方との出会いがたくさんあって日々勉強になっています。皆さんも面白いパターンを知ったらぜひ教えてください。

明日は @cia_rana さんです。