私をペロペロするがよい

lazy_dog のブログです。

KZ ZS5 イヤホン + Bluetooth モジュール

Bluetooth イヤホンとして、以前は SONYノイズキャンセリングモデルを使っていた。

※ 現行モデルは下。

BOSE のモデルより安価にしてはノイズキャンセリングも効いていて、音質も良かったので満足して使っていたが、ある日イヤホンが断線して使えなくなった。3 年は利用したので、大往生ともいえる。

その後、Philips の 2000 円弱の安いイヤホンをずっと使っていたが、忘れたとき用に予備が欲しくなり、またちょっと音質をアップグレードしたかったので KZ ZS5 を購入した。

AliExpress で安価で買える場合があるらしいが、初期不良などを考えると Amazon で買った方が無難。また Amazon でもセールされている時があるので(タイミング良く、自分も 2 割引のタイミングで買えた)、そっちを狙うのもいいかもしれない。

f:id:lazy_dog:20170929074213j:plain

音質

エージングは信じていなかったが、耳が慣れたこともあってか、初めて聴いたときとは印象がだいぶ変わる。

  • 最初は 100 ~ 200 Khz あたりの音が篭ってると思うくらい凄いブーミーに聴こえたが、今では許容範囲まで落ち着いた。
    • ただし、50 ~ 100 Khz あたりは薄い。ブーミー感が減ってくると、全体的にはフラットに聴こえる。
  • 音場が広いのと音の分解が良いので、埋もれずしっかり聴こえる。ただし、特徴的なところはなく普通といった感じ。素直に性能が良い。
  • ディエッサー必要なくらいサ行が刺さったが、時が経つにつれ、少し落ちついた。
  • アタック感は普通。元気な音を出すイヤホンではない。

全体的に音質は満足。提灯屋のようなレビューも多く不安だったが、思っていたより完成度が高かった。値段を考えると、この音質は凄い。

使い勝手

  • 付属のケーブルはイマイチ。重いし、タッチノイズもある。頭の後ろに片方のケーブルを通して、耳にひっかける Shure 掛けタイプ。
    • ケーブル重いし、耳に負担がかかる。
  • ウレタンの M のイヤーピース使用時、遮音性は少々微妙。音場が広いので、外部のノイズは結構気になる。
    • イヤーピース交換で改善できるかと。
  • 音洩れは多分してない。やたらと大きい音で流さなければ、電車でも使える。

Bluetooth モジュール

やたらと安いのもあり、ポチった。もう 500 円出すから作りを丈夫にして欲しいと思った。使い勝手は最高。

  • スペック上は Bluetooth 4.2、aptX 対応。
  • iPhone SE + iOS 11 の環境では問題なし。レイテンシーなどを見ると、たぶん AAC で繋がってると思われる。
    • 遅延を気にする場合、iPhone では利用は難しいと思う。ゲーム
    • ぱっと分かる範囲での音質の劣化はない。(気持ちの問題からか、若干籠った気がする?)
  • 作りが不安。丁寧に扱わないと断線しそうなのが怖い。
    • USB のカバーのゴムは速攻でモゲた。弱い。
  • コントローラは、再生ボタンと音量のプラス・マイナスのみ。電源オンオフ、ペアリングも困ったことはなかった。操作性は問題ない作りとなっている。
    • マイクもコントローラに付いているようだが、使うかなあ。
  • デフォルトの有線ケーブルよりは軽いので、耳の負担はない。取り回しも楽になる。
  • KZ ZS5 自体、Ultimate Ear の 10Pro と同じケーブルとピン形状なので、10Pro も無線化できる。
  • 再生時間は 4 時間程度。短かい。旅先に持ってく場合、USB のモバイルバッテリーが必要。
    • ちゃんと電源切っておかないと、気付いたら電池がなくなっている。

満足度は非常に高いけど、いつまで持つかが不安。1 年は持ってほしいなあ。

まとめ

どれほど長く使えるか不安だけど、音質や使い勝手諸々は良かったのでおすすめ。

だんだん覚えていく tmux

tmux は Terminal multiplexer と呼ばれる複数のコンソールを管理するソフトウェアです。一つの画面に複数のコンソールを表示したり、Session という単位でコンソールを管理することができます。

f:id:lazy_dog:20170730185640p:plain

今までなんとなく tmux を使用してきたのですが、しっかりと使えるようになりたいと思い、下記の通り勉強しました。

とりあえず使えるようになるために覚える必要があること一覧

  • 各種名称を覚える
  • 初期設定
  • Window の作成、切り替え、削除
  • Pane の新規作成(画面の分割)と削除
  • Pane の切り替え
  • セッションの終了・再開
  • Copy-mode について

各種名称を覚える

“Session” , “Window” , “Pane” を覚えれば OK。

Session

各仮想コンソールの状態を Session という単位で管理する。

Window や Pane の状態、ターミナルの状態をセッションの単位で保存や再開することができる。複数の仮想コンソールの状態を、任意のタイミングで停止(バックグラウンド化)・保存・再開することが可能。

Window

ブラウザで言うところのタブ。Session 内に複数の Window を持つことができる。なお、Window も下記の Pane という形で画面分割することができる。

なお、Window には任意の名前を付けることができ、デフォルトだとシェルの名前($SHELL)になる。

Pane

Window の画面を分割した単位。Pane の状態は Window ごとに持つ。Pane ごとに仮想コンソールを持ち、その分起動しているシェルも増える。

上記の通り、"Session" → “Window” → “Pane” という親子関係というイメージ。

Status bar

tmux のステータス状態やその他もろもろを表す行のこと。タブブラウザのように Window の一覧化を表示したり、時刻を表示したりと、任意の内容を出力することが可能。オシャレなエンジニアはよくここをカスタマイズしている。

初期設定

${HOME}/.tmux.conf が tmux の設定ファイルの保存場所になる。(独断と偏見であるが)必要最低限の設定のみ解説する。キーバインドは後述。

# Window に割り振られる番号の開始。Window 切り替え時、Window 番号をキーで指定し切り替えるため、1 始まりが使用上、楽。
set -g base-index 1

# Prefix Key の指定。tmux の各種コマンドを実行する始点のキーを指定する。C-a が Screen 互換だが、C-t が個人的にオススメ。
set -g prefix C-t

# tmux の各 Pane が保持するヒストリ行の指定。
set -g history-limit 50000

# 好みの問題であるが、マウスサポートが一切不要の場合、下記の通り。
set -g mouse off
set -g terminal-overrides ',xterm*:smcup@:rmcup@'

Status bar の設定はネット上にたくさん掲載されている。設定も複雑なので、詳しい内容は割愛。下記は個人的な設定を記載する。ステータスバーに色々な情報を載せると、確かに見栄えや便利さは上がるのだが、反面 tmux が物凄い勢いで CPU を食いだすのでほどほどに。

# Status bar
set -g status-left '#[fg=black,bg=white]#{?client_prefix,#[reverse][P],}#[default]'
set -g status-right ''
set -g status-interval '0'

# Color
set -g status-bg white
set -g status-fg black
set -g window-status-current-fg white
set -g window-status-current-bg blue
set -g pane-border-fg black
set -g pane-active-border-fg black

Window の切り替え

  • 作成: Prefix Key を押した後、c
  • 切り替え: Prefix Key を押した後、Window の番号の数字キー
  • 削除: シェルから exit するか、Prefix Key を押した後、&
    • pane が一つ(画面分割していない)状態で kill-pane コマンド(Pane を削除する)を実行すると、Window が削除される。

Pane の新規作成と削除

画面分割をすると、Pane が増える。

  • 縦分割: Prefix Key を押した後、%
  • 横分割: Prefix Key を押した後、"

ただし、デフォルトはあまり直感的ではないので、画面に線が入る場所を意識しやすいように -| キーを利用すると分かりやすい。

# 縦分割
bind - split-window -v

# 横分割
bind | split-window -h

カレントの Pane を消すには、Prefix Key を押した後、x。個人的に、Emacs ライクにするため k キーにしている。

bind k confirm-before -p "kill-pane #P? (y/n)" kill-pane

Pane は一個の tty でもあるので、exit や Ctrl + d でも削除できる。

Pane を Window にしたい場合、Prefix Key を押した後、!

Pane の切り替え

  • Pane の切り替えを行うためには、Prefix Key を押した後、o
  • 一つ前の Pane に戻るには、、Prefix Key を押した後、;
  • カレントの Pane から上下左右の任意の Pane に移動したい場合、Prefix Key を押した後、任意のカーソルキー。

Pane はちょっとややこしいけど、作成と切り替えをきちんと覚えれば難しくない。

セッションの終了・再開

基本的に、Session を保存せず tmux を終了させるには、最後の Pane を消す(exit する)ことをすればよい。

ただし、Session を次回以降も再利用したかったりする場合、Session を保存すると良い。これを Detach(デタッチ)と呼ぶ。Prefix Key を押した後 d

再度 tmux を実行すると Session は新規に作成されるが、デタッチされた Session は保存されている。tmux ls で保存されたセッションを一覧表示できる。

~ $ tmux ls
0: 1 windows (created Tue Jul 18 07:42:47 2017) [128x39]
1: 1 windows (created Wed Jul 26 23:26:08 2017) [128x39]

上記だと左端の数字が Session Name となる。デフォルトだと 0 から始まる数字が Session Name となり、Session が増えていく度 1 ずつインクリメントされていく。

最後にアクティブだった Session を再開するには tmux a を実行。Session を再開することを Attach (アタッチ)と呼ぶが、tmux attach -t {target-session} で可能。{target-session} は Session Name を選択する。

$ tmux ls
0: 1 windows (created Tue Jul 18 07:42:47 2017) [128x39]
1: 1 windows (created Wed Jul 26 23:26:08 2017) [128x39]
$ 
$ tmux attach -t 1
  # "1" の target-session を選択しアタッチした。

カレントの Session Name を変更するには Prefix Key を押した後 $

Copy-mode について

各 Pane は history-limit で指定した数の行数分、出力を遡って確認することができる。その Mode のことを Copy-mode と呼ぶ。Copy-mode に移行するには Prefix Key を押した後 [

デフォルトでは less コマンドのように vi キーバインドで見ることができる。下記の通り .tmux.conf に設定すれば Emacs キーバインドとなる。

# Emacs keybind for Copy-mode
set -g mode-keys emacs

あとがき

tmux はとてもカスタマイズブルで設定や機能が大量にあります。本記事では使い方のレクチャを優先して、詳細は書ききれなかったのですが、是非 man を読んでみてください。

http://man.openbsd.org/OpenBSD-current/man1/tmux.1

DELL のモニター UP2716D を買った

f:id:lazy_dog:20170725233310j:plain

結論から書くと、サイコーだった。

購入するにあたり考慮したこと

デスクトップ用のモニターとして、Iiyama の古い TN モニターを長らく使っていた。解像度は 1920 x 1280 と、Full HD よりちょっと広めで満足して使っていたが、複数ウインドウを開いての処理、例えばウェブブラウザを見ながらテキストエディタを使用していたりとか、そういう場面で狭く感じることが度々あった。

そのため、デュアルモニターにしたかったのだが、その際の要望として、

  • 一眼レフカメラ現像用に Lightroom を使っているので、カラーサポートがそういう用途のもの。
  • 1920 x 1280 以上の解像度。
  • モニターアームが利用できる。
  • インチは大きいほうがいい。

にこだわった。

UP2716D について

DELL UP2716D は DELL のモニターのラインアップの中でもプロユース向けであり、Adobe などのプロダクション用途に耐えうる製品、とのことだ。そのため、カラーサポートは 100 % Adobe RGB 、その他諸々の充実っぷり。色深度も 10 億 7400 万なので、通常のモニターと比較しても明らかにスペックは高い。

f:id:lazy_dog:20170725233316j:plain

画質は文句なし。色深度が通常のモニターより高い分、表現力は高いはずなのだが、それにしてもやはり、ぱっと見たときの鮮かさは TN モニターと段違い。ドットピッチも細かいので、画面の粗さは感じない。

解像度も 2560 x 1440 なので、4K ほどではないが、相当広い。Full HD と比べても 1.3 倍はあるので、ウインドウをあれこれ置けるのは嬉しい。

ゲーム用途ではない購入なので、きちんと比較はしていないが、応答速度最速 6 mm (ゲームモードにした時?)なので、よほどレイテンシーを気にするゲームでなければ多分問題ないとは思われる。(個人的に、ゲームをしたいのであれば、ゲーム用途としても優秀であるテレビにコンピュータを繋げたほうがいいと思う)

購入方法

Amazon で Prime で購入できるのは本当便利な世の中になったと思う。加えて、クロネコヤマトの保守延長も同時購入できる。個人的にあまり多くのサイトに渡ってクレジットカードを登録したくないので、Amazon で一本化できるのは嬉しい。

DELL 公式サイトや楽天、その他 EC サイトと比較しても Amazon は安いので、ここで買うのがベストだと思う。

良かったところ

黒点ドット欠け)はなかった。良かった! DELL の保証の場合、ドットの色がおかしくなる有色のドット欠けは「輝点」と呼ばれ、交換の対象になるが、常時黒点は対象外のとなる。ここは分かり難いと思うから、もうちょっと強めに書いといて欲しいと思う。

画質云々ではないのだが、ベゼルの狭さが気に入っている。デザインは極々シンプルでとても良い。全面の “DELL” ロゴ以外、目立つものは特にない。筐体自体の厚さも、高級機にしては薄いと思う。この辺り、時代の進歩を凄く感じた。

コンパネも特に弄る必要もないが、分かりやすい配置にはなっていると思う。デフォルトから変更したのは明度のみ。

消費電力は最大 45 W と思っていたよりもと低かったのが好印象。

サウンドスピーカは持っていないが、ミニピンのサウンド出力が背面にある。そのため、コンピュータの HDMI → UP2716D → 外部スピーカーという流れで接続ができる。UP2716D 自身も USB 出力を 2 つ持っているので、スピーカーも USB で電力を取るものであれば、UP2716D との接続だけで完結する。

↑ こういうの。

もう一個の USB は iPhone の充電用に使っている。BC 1.2 ( https://www.maximintegrated.com/jp/app-notes/index.mvp/id/5801 ) で接続ができるため、充電向き。モニターの電源を落としている場合は USB ポートの通電はないが、スリープであれば通電される。

この辺りの接続を一気に解決できたので、ケーブルがだいぶ減って机の回りがすっきりしたのは良かった。USB 接続が付いていれば UP2716D に限らずどのモニターでもできるが、革命的に配線が改善できたので嬉しい。

f:id:lazy_dog:20170725233323j:plain

もちろん、コンピュータの USB 接続と UP2716D のアップストリーム側を接続すれば、UP2716D を通じて USB を通信できる。特に用途はないので接続はしていない。

モニターアーム

モニターの下が開くっていうのは本当にすばらしい。ケーブルを綺麗にまとめることができるのであれば、机がかなりすっきり見える。

モニターを結構自由に動かせることができるのも良かった。ノートなどに書き事をしている時、モニターが一時的に邪魔な場合がある。そういう時は簡単にどかせることができる。スタンドの場合は、なかなかそうはいかない。

買ったのは

↑ これ。

耐荷重は 5 kg までで UP2716D は許容範囲内。実際使ってみるとデフォルトの状態だとモニターの重さに耐え切れず、下がってしまうが、各関節のネジを締めたらきちんと固定されるようになった。

コストパフォーマンスを取った選択だったけど、金額に余裕があるならエルゴトロンが良かったかなとも思う。昔っから品質が良いと向こうは耐荷重 10 kg 以上。UP2716D のみならず、最近のインチ大きめのモニターでも余裕だと思われる。

残念だったところ

最初から「Lightroom で写真を写してもきちんと色を出力できる」という用途で選んでいたので、スペックの上では大変満足している。上記の通り、特に使用感は問題なく、色々改善できたのも嬉しい。

が、購入金額はだいぶ高額となってしまった。言ってしまうと、唯一の残念ポイント。通常の普及価格帯のモニターと比べても頭一つか二つは多い値段である。そりゃあ、おいそれと変えるものではない。しかし、LightroomPhotoshop など、特定の用途としての利用が決まっているのであれば、EIZO と比較してかなり安い。

カラーキャリブレータは買ってない。理由はこれも高額のため。デフォルトできちんと色が出ていることを祈っている。

他機種と比較して

他の DELL のモニターと比較した。一社でこれだけのラインアップだったので、他社の製品は見ていない。

4K モニターはドットピッチが細かすぎて、文字が見辛くなってしまうと思ったので却下した。実際、27 インチで 2560 x 1440 の解像度はこれが限界かと思った。ただし、30 インチ程度で 4K モニター、狭いベゼルであれば購入するかもしれない。

UP2516D は UP2716D の 25 インチ版であるが、値段が許すのであればインチの大きい UP2716D が良いと思う。これ以上、ドットピッチが細かいと正直辛いと思う。

U2715HU2717D は似たようなスペックであるが、この値段を出すなら UP2716D が届く範囲だと思う。

U2718Q が最近リリースされているが、ちょっと気になる。27 インチなので見易さは心配であるが、この値段で HDR + 充実のカラーサポートなので、スペックは非常に良いと思う。

総評

f:id:lazy_dog:20170725233322j:plain

スペック上や営業文句としてもプロ向けであり、アマチュア含め、カメラやる人には良い。大切に使おうと思う。

foobar2000 for iOS に iTunes なしでバッチファイル一発で音声ファイルを転送する

foobar2000プラグインiPod manager (foo_dop.dll)が最新の iTunes のサポートをされなくなり、iPhone で楽曲を聴く場合には iTunes を利用しなければならなくなった。iTunes は全ての操作を GUI でやらないといけなく、しかも GUI がもっさりとしていて画面数も多い。私の環境では sync が上手くいかない事が頻発しており、非常に使い辛い。

しかも、ライブラリに登録できる曲は FLAC ファイルが NG で、トランスコードする場合、ローカルのどこかに iTunes で読める形式にしたファイルを保存し続けなければならない。これが結構、容量を食う。

iPhone で曲を聴くのはそろそろ限界かなと思っていた矢先、foobar2000 for iOS がリリースされた。開発中であることは知っていたが、正直、全く期待していなかった。が、これが非常に素晴しい完成度で、とても使いやすい。iPhone 純正のプレイヤーも foobar2000 for iOS のできが良いので、最近は全く使用していない。

難を言えば、デフォルトのスキンがアイコンなどヤボったく、見た目は純正プレイヤーの方に軍配が上がるが

  • FTP で楽曲が転送可能(iTunes 不要)
  • ReplayGain (iTunes でトランスコードすると ReplayGain タグが消される?)
  • 使いやすい GUI
  • 動作もさくさく

良い感じの仕上り。

なお、この Windows Mobile/Android/iOS でのプレイヤー開発って Peter がちゃんと開発しているようだ。最初は foobar2000 の名義貸しだけで、こういうの嫌がりそうな勝手な想像があったのだけども。

ftp で曲(音声ファイル)を転送するバッチファイル

を作った。foobar2000 から Converter で作成したファイルをフォルダごと FTP 転送する。

> foobar2000_ios_media_ftp_uploader.bat "C:\Path\to\Directory"

そこまで作り込みしなくてもいいとは思うけど、まだエラー処理が甘く、ftp 転送のところでエラーチェックはしていないので注意。

Windows ftp コマンド備忘録

Windowsftp コマンドを debug をオンにして使ってみると分かるのだけど、foobar2000 for iOSftp を使用する場合、どうも Windowsftp コマンドは少々考慮が必要のようだ。

例えば、Windowsftp コマンドにおける mkdirxmkd というコマンドを ftp サーバに実行している。これは foobar2000 for iOS では実行できないコマンドになる。なので、quote オプションで foobar2000 for iOS でサポートされている mkd を実行するようにしなければならない。

C:\>ftp
ftp> debug
デバッグ オン。
ftp> open 192.168.0.12
192.168.0.12 に接続しました。
220 PPFTPD all your base are belong to us
---> OPTS UTF8 ON
...

ftp> mkdir test1234
---> XMKD test1234
502 Unknown command
ftp> quote mkd test1234
---> mkd test1234
250 Create directory successful
ftp>

xmkdWindows における方言か、というとそうでもなく、"RFC 775" で標準化されている。 ref: https://tools.ietf.org/html/rfc775

rmdir なども。

ftp> rmdir test1234
---> XRMD test1234
502 Unknown command
ftp> quote rmd test1234
---> rmd test1234
250 Remove directory successful
ftp>

ftp コマンドは、実際に実行するコマンドとサーバに送信しているコマンドは違う、ということが分かった。

セーラー万年筆の「ふでDEまんねん」や「マイファースト」のレビューなど

このエントリーは、下記についてのレビューなどである。

以前、散歩がてら寄った文房具屋さんで、セーラー万年筆の「マイファースト」を購入した。

マイファーストという名前だけあって初心者向けであり、一本の胴軸にニブ(ペン先)が 2 本付いてくるものである。

万年筆練習。SCP-1678

lazy_dogさん(@ampll)が投稿した写真 -

恥ずかしながら以前試しに書いたものであるが、これがすこぶる良かった。

元々毛筆をやっていてたので、字を書く際の道具はどうしても毛筆で書いたときの書き心地と比べてしまう。個人的にはゲルインクのボールペンとは相性が良くって、インクのノリを指先でコントロールできるようにすらっと書けるのが良かったが、万年筆はそれがよりコントロールできるのがいい。万年筆のインクは潤滑や強弱が付けやすく、狙った感じに紙に書ける。おいらには筆圧も高い癖があるが、問題はなかった。

それから数ヶ月ほど色々書いてみたが、万年筆で字を書くことは楽しい。手入れやインク漏れという、ボールペンには無いデメリットはあるが、それ以上に書き心地という楽しさが勝る。

「マイファースト」が良かったところ

ケースや包装は残念ながらお洒落っ気のあるものでは決してない。 カクノ が「万年筆に触れたことのない」人を対象にしながら手に取ってもらいやすいデザインであるが、反面、こちらは超最低限のシンプルさである。胴軸に関しては、もうちょっとなんとかならんかったかと本当に思う。 しかし、マイファースト と名うっているだけあり、ニブのお手入れ方法を書いたマニュアルも同梱されている。インクも黒・赤(ピンク)・青と揃っている。黒を使いきった後に青を試してみたが、とても綺麗なスカイブルーで良かった。

セーラーの My First と特殊ペン先。万年筆のインクの青って綺麗ね。scp-2700

lazy_dogさん(@ampll)が投稿した写真 -

後述するが、ニブは 2 種類付いており、細字特殊ペン先 が付属している。

細字と特殊ペン先について

結論から言うと、それぞれとても書きやすい。高級万年筆と比較すれば不満はあるであろうが、初学者が初めて使った感想としては、何も不満はなく感動すら覚えるほどだった。

細字 はステンレス製であるので、カリカリとした書き心地である。ニブの先がつっかかるような感じがする分重く感じるが、筆圧を抑えて書くようにすればいい。潤滑も少々浮かせて素早く書けば狙ってかすれが出るが、基本的にはニブの細さという想像以上にインクがのる。

特殊ペン先 はお気に入りで、これはとてもいい。このニブのためにマイファースト買っとけ、と思うくらい。

f:id:lazy_dog:20161226182900j:plain

ニブの先は曲がっているので紙に刺さるのではなく、刷毛のように紙をなぞるように書くことができる。これの書き心地がとてもよい。強弱が付けやすく、また付っかかりがないので手首への負担がない。ゆっくり書けばインクが出るが、かすれは出ない気がする。太さ細さは出るが、殆ど抑揚は出にくいようである。

両方とも普段使いにはぴったりで、急ぎのメモ書きや会議の内容をノートに書くのも得意である。また、結婚式の準備の際には、両方とも大活躍だった。丁寧な字を書く分にもよい。

プロフィットふでDEまんねんふでDEまんねん(45度) について。

ふでDEまんねんの無印とプロフィットを比べる

セーラーの「プロフィット」と言うと安価帯のモデルから頭一つ抜けた、より上位のモデルとなる。普及価格帯でもあり、Amazon のレビュー数も多い。なので「プロフィットふでDEまんねん」は通常の「ふでDEまんねん」はより良いものなんじゃないか、と思うが、メモや通常使いには通常の「ふでDEまんねん」の方が良かった。

「プロフィットふでDEまんねん」は、ニブの先の曲がりである 55 度 という角度が人を選びすぎる。筆という書き心地を再現しようとするとこの角度になるらしいが、メモとしての字は太くなりすぎる。その分、強弱を付けることができるが、、、普通の万年筆の「強」はプロフィットふでDEまんねんにとっては「弱」になる。使い所は難しい。

f:id:lazy_dog:20161226182920j:plain

「ふでDEまんねん」はプロフィットより少々角度は浅く、ニブの先の曲がりは 45 度 である。恐らく、マイファーストの特殊ペン先と同等であるはず。筆としての書き心地は残念ながら分からないが、太さは常識の範囲内である。なので、こちらは普段使いできる。

横書きしたときの右に筆を滑らすときの横画に、マイファーストの特殊ペン先には無い微妙に重さのある付っかかりがあり、それが少々書き心地を落としている感じはある。しかし、マイファーストより強弱は出やすく、インクの潤滑も分かりやすい。マイファーストの「のっぺり」に対し、よりメリハリはある字が書ける。

今では、プロフィットの方の胴軸に無印の「ふでDEまんねん」のニブを付けて普段使いにしている。無印の「ふでDEまんねん」の胴軸は、もうちょっとどうにかならなかったのか、と思う。刻印なしの方が普段使いしやすいのに、どうしてこうなってしまったのだろうか。

Amazon では「マイファースト」のレビュー自体は多くはなく、他の初心者向けの万年筆に埋もれているが、とても良い万年筆だと思うので試してみてもらいたい。「プロフィットふでDEまんねん」はちょっと今のところ常用はできず、どうしようかと思っているが、また使う機会があれば。。。

あと、胴軸とニブをもっと自由に入れ替えられるようにできたらなあと思う。胴軸だけ単品で売ってくれればなあ。

Google Calendar と todo.txt を連携させた「todo-txt_gcaladd.sh」

TODO 管理を 2Do から todo.txt に替えた。todo.txt の場合、データファイルが通常のテキストであり、CLI のテキストユーティリティから参照や連携が容易。CLI で連携できるということで、Google Calendar と連携できるようにした。 下記、作ったスクリプトの紹介と使いかたについて。

todo-txt_gcaladd.sh について

  • due:yyyy-mm-ddgcal:on が入力されている行のタスクを、due:yyyy-mm-dd の日のスケジュールとして Google Calendar に登録する。
  • タスクがコンプリートした場合、具体的には todo.txtdone.txt に記載されているタスクの先頭に x が入力されたタスクについては、Google Calendar からスケジュールを削除する。 具体的な todo-txt_gcaladd.sh の動作は、下記「具体的に todo-txt_gcaladd.sh はどういう動きをしているのか?」項を参照。 色々テストはしているが、 うちの環境では きちんと動いている。"AT YOUR OWN RISK" でお願いします。

使用に必要なもの

$ gcalcli list でリスト一覧が取れれば問題なく動作すると思われる。

使い方

1. gcalcli をインストール及び設定

https://github.com/insanum/gcalcli の通り。

2. todo-txt_gcaladd.sh をインストール及び設定

https://bitbucket.org/lazy_dog/todo-txt_options/src からダウンロード願います。適当にパスが通るところなどに保存する。 スクリプト内の変数にオプションの指定があるので、下記の通り設定する。

## Temporary data directory
TMPDIR=/tmp

## Target calendar name
TARGETCALENDAR=TODOs

# todo.txt
TARGETTODOTXT=${TODODIR}/todo.txt

# done.txt
TARGETDONETXT=${TODODIR}/done.txt
  • TMPDIR=: 一時ファイルの作成ディレクトリ。 # アクセスできて write ができないと todo.txt が更新されないバグに、今これを書いている途中気付いた。。。
  • TARGETCALENDAR=: Google Calendar のスケジュールを登録するカレンダーの指定。
  • TARGETTODOTXT=: ターゲットとなる todo.txt へのパス。
  • TARGETDONETXT=: ターゲットとなる done.txt へのパス。

3. todo-txt_gcaladd.sh を cron に登録する

cron など自動実行ができるようにする。もちろん、手動で todo-txt_gcaladd.sh を叩くでも問題はない。

4. todo.txt へタスクを追加

todo.txt に Google Calendar と連携したい TODO を追加する。その行のどこにでもいいので、due:yyyy-mm-dd という形で日付を指定。gcal:on というオプションを付与する。ただし、上記 key:value の前後に半角スペースがないと上手く動かないと思うので注意。

図書館に本を返す due:2016-10-20 gcal:on

行頭に x が付いた完了タスクは、自動的に Google Calendar から削除される。

具体的に todo-txt_gcaladd.sh はどういう動きをしているのか?

todo.txt の内容を読み込み、Google Calendar にスケジュールをポストする。例えば、todo.txt に下記のようなタスクを追加したとする。

図書館に本を返す due:2016-10-20 gcal:on

due の日付は yyyy-mm-dd が必須とした。理由は SwiftoDo http://swiftodoapp.com/ という iPhone アプリが左記フォーマットの ISO 8601 https://ja.wikipedia.org/wiki/ISO_8601 を必須としているので、それに倣った。また gcal: という key に対し value が on でなければ連携は発動しない。 cron などで実行された todo-txt_gcaladd.sh は該当の行を確認し、gcalcli を使用して Google Calendar にスケジュールをポストする。

f:id:lazy_dog:20161016021713p:plain

スケジュールの詳細には tuid:.... という文字列が追記されているが、これが todo.txt と Google Calendar のスケジュールを紐付けている。また、この時 todo.txt の該当のタスクの行は下記の通り gcal: の value が uid に書き変わる。

図書館に本を返す due:2016-10-20 gcal:.5801c61eTa

タスクが完了した場合、todo.txt または done.txt の行の頭には x を付けるというルールがある。

x 図書館に本を返す due:2016-10-20 gcal:.5801c61eTa

todo-txt_gcaladd.sh は該当の行を確認し、Google Calendar から該当のスケジュールを削除する。同時に、該当の行の gcal: の value を done に変更する。

x 図書館に本を返す due:2016-10-20 gcal:done

todo-txt_gcaladd.sh が定期的に実行されれば、特に Google Calendar を手動で操作する必要はなく、全て todo.txt 側の操作のみで完結する。

余談: スクリプト書いていたときの雑多なこと

uid について

gcal:... 及び Google Calendar のスケジュールに記入される tuid:... について、ユニークな値をどうするか悩んだ。結論は、1970-01-01 00:00:00 UTC からの現在の秒数を 16 進数にし、それにランダムな文字 2 つとした。

GETDATE=`date +"%s"`
TODOUID=`printf '%x\n' ${GETDATE}`
TODOUID=`echo ${TODOUID}``cat /dev/urandom | env LC_CTYPE=C tr -dc '0-9a-zA-Z' | fold -w 2 | head -n 1`

兎に角、ユニークな値にしたかったので、処理時の時間であればユニーク値になるであろうとした。それを 16 進数にすることで桁数(文字数)を稼いだ。ただし、処理が早いから同じ秒で実行され、uid が被るという現象が確認できたので、/dev/urandom から 2 つの文字を持ってくることにした。 date コマンドでナノ秒を出すこともできるが、BSD 版の date コマンドでは使用できず。

# from "man date" from Cygwin
%N     nanoseconds (000000000..999999999)

uid の桁は単純に 16 進数ではなく、工夫すればもっと桁を稼げると思うが、とりあえずはこうした。

正規表現はどの環境でも使えるように

どのUNIXコマンドでも使える正規表現 - Qiita: http://qiita.com/richmikan@github/items/b6fb641e5b2b9af3522e

こちらの記事を参考に、正規表現を書くことを意識した。と言っても、下記ぐらいしか気をつけるべきところはなかったが。

  • 1 文字以上の繰り返しである + を使わず \{1,\} とした。
  • 最短一致は使用せず、その状態でもマッチするようにした。

他、半角スペース * などで繰り返しを行う場合、[ ] と指定して見易くなるように心掛けてみた。

三項演算子な書き方を多様してスリムにした

if で複数行に渡るのではなく、可能であれば三項演算子のような書き方を多様した。

## Is exist target todo.txt file
[ -e "${TARGETTODOTXT}" ] || { echo "Target todo.txt file could not be found."; exit 1; }
## check if ${line} is "^$"
### 2016-10-26: break だと while read の loop が終了してしまうので、continue に修正。
[ -z "${line}" ] && continue

ref: 初心者向け、「上手い」シェルスクリプトの書き方メモ - Qiita: http://qiita.com/m-yamashita/items/889c116b92dc0bf4ea7d

複雑なことでなければ、ワンライナーかつシンプルに記載ができる。 なお、{ CMD; }( CMD ) は違うことを意識する。 ( CMD ) はサブシェルであり、子プロセスとして動く。

# 上手く動かない
[ -e "${TARGETTODOTXT}" ] || ( echo "Target todo.txt file could not be found." && exit 1 )

上記は、|| 以降がサブシェルとして動いてしまうので、exit 1 はサブシェルである子プロセスの bash を exit するだけになる。そのため、後続のスクリプトも動いてしまう。

[ -e "${TARGETTODOTXT}" ] || { echo "Target todo.txt file could not be found."; exit 1; }

こちらが正解。

ref: bashの";", "&&", "||" に関する補足ネタ。コマンドグルーピングとの併用例 - Qiita: http://qiita.com/jpshadowapps/items/3f3fa3b214a998afd819

type コマンドでファイル(コマンド)があるかを確認

## Is exit gcalcli command
type gcalcli || { echo "gcalcli command could not be found."; exit 3; }

Bashでコマンドの存在チェックはwhichよりhashの方が良いかも→いやtypeが最強 - Qiita: http://qiita.com/kawaz/items/1b61ee2dd4d1acc7cc94

上記の記事に倣った。対象のファイルやディレクト/dev 以下のデバイスにも使えるので、これからも積極的に使っていこうと思う。

変数に格納した改行のあるテキストをヒアドキュメント(while read line)にする場合

while read line
do
    # check if ${line} is "^$"
    ## 2016-10-26: continue に修正
    [ -z "${line}" ] && continue


...

done <<< "${TARGET}"

この形式なら間違いなく処理してくれると思う。変数に空行が入っていても continue が聞くので、その空行は処理されない。色々試してみたが、これが一番シンプルで確実に動く。

ref: bash - How do I "read" a variable on a while loop - Stack Overflow: http://stackoverflow.com/questions/13122441/how-do-i-read-a-variable-on-a-while-loop

sed の -i オプションは使わない

有名な話であるが、sed コマンドの -i オプションは GNUsed のみであり、BSD 環境などでは使用できない場合がある。それを Twitter で呟いたら、perl を使用するという案を頂いた。

というご意見を頂いたのにもかかわらず、POSIX にこだわりたいというのがあったので中間ファイルを作るということで妥協した。perlPOSIX には入っていないようだ。

ref: POSIXコマンドチートシート(を作る) - Qiita: http://qiita.com/richmikan@github/items/e4cb1537d38966c10f4b

gcalcli の delete や search はスケジュールのタイトルのみならず、詳細も見てくれる

表題の通り。

~ $ gcalcli search "uid:1234abcd"

2016-10-15   9:00am  テスト "delete" me!

~ $ gcalcli delete "uid:1234abcd"

2016-10-15   9:00am  テスト "delete" me!
Delete? [N]o [y]es [q]uit: n

~ $ gcalcli --iamaexpert delete "uid:1234abcd"

2016-10-15   9:00am  テスト "delete" me!
Deleted!

~ $

のどかで Toggle 実行時にタスクトレイのアイコンを切り替え

変換キーを押すと Lock0 の状態にさせて、vi キーバインドのモードに移行するように設定した。その際、ノーマルの状態なのか vi の状態なのかが分からないため、タスクトレイのアイコンを変化させるようにした。例では 変換キー がトグルスイッチになっている。

# Set Lock0 vi-mode on
key *変換 = &Toggle(Lock0,on) &IconColor(2)
  key L0-J = ↓
  Key L0-K = ↑
  key L0-H = ←
  key L0-L = →

# Set Lock0 vi-mode off
key L0-変換 = &Toggle(Lock0,off) &IconColor(0)

vi キーバインドの状態であればトレイのアイコンは赤く、ノーマルの状態だと通常時の灰色になる。

通常

f:id:lazy_dog:20160811144340p:plain

vi キーバインド

f:id:lazy_dog:20160811144408p:plain

のどかは set VAR=xxx のように変数を入れることができないため、&Toggle を使うことで条件分岐できる。

参考