fohte.log

大体雑に書く

LaTeX で TikZ を usepackage していると PNG 画像が表示されなくなる

状況

TikZ (あるいは gnuplot-lua-tikz などの TikZ に依存しているもの) を usepackage すると PNG 画像が適切に表示されなくなる。

\documentclass{jsarticle}
\usepackage[dvipdfmx]{graphicx}
\usepackage{tikz}

\begin{document}
\begin{figure}[htbp]
  \centering
  \includegraphics[width=10cm]{fig/ai_pet_family.png}
  \caption{ai\_pet\_family.png}
\end{figure}
\end{document}

f:id:Fohte:20170203125253p:plain

ログを見ると警告が出ている。

dvipdfmx:warning: Unparsed material at end of special ignored.

解決法

dvipdfmx が全てのパッケージで適用されるようにする必要がある。 つまり、 documentclass のオプションで dvipdfmx を指定すれば良い。

以下のような行がある。

\documentclass{jsarticle}
\usepackage[dvipdfmx]{graphicx}
\usepackage{tikz}

これを以下のように変更する。

\documentclass[dvipdfmx]{jsarticle}
\usepackage{graphicx}
\usepackage{tikz}

正常に表示された。 f:id:Fohte:20170203125256p:plain

参考

広告を非表示にする

brew cask で QuickLook プラグインを入れようとするとコケる

状況

$ brew cask install quicklook-json
==> Downloading http://www.sagtau.com/media/QuickLookJSON.qlgenerator.zip
######################################################################## 100.0%
==> No checksum defined for Cask quicklook-json, skipping verification
==> Moving QuickLook Plugin 'QuickLookJSON.qlgenerator' to '/Users/<username>/Library/QuickLook/QuickLookJSON.qlgen
Error: Permission denied - (/usr/local/Caskroom/quicklook-json/latest/QuickLookJSON.qlgenerator, /Users/<username>/Library/QuickLook/QuickLookJSON.qlgenerator)

解決法

ログを読むと、 /Users/<username>/Library/QuickLook/QuickLookJSON.qlgenerator に移動しようとしたが権限が無くて失敗してるっぽい。

$ ls -l ~/Library | grep QuickLook
drwxr-xr-x    3 root   staff    102 Feb  2 18:35 QuickLook/

所有者が root になっているために弾かれてしまっているようなので chown で自分に所有権を移す。

$ sudo chown -R $USER ~/Library/QuickLook

参考

広告を非表示にする

LaTeX で TikZ を usepackage すると Missing number, treated as zero. でコケる

状況

とあるスタイルファイルを usepackage した状態で

\usepackage{tikz}

しようとするとエラーを吐かれ、TeX ファイルのコンパイルができない。

エラーログ

! Missing number, treated as zero.
<to be read again>
                   \gdef
l.33 \xdef
          \pgfmath@rnd@z{\the\c@pgfmath@counta}% The seed.

再現性のある最小構成

ディレクトリ構成

.
├── foo.sty
└── main.tex

main.tex

\documentclass{jsarticle}

\usepackage{foo}
\usepackage{tikz}

\begin{document}
\end{document}

foo.sty

\def\year#1{\gdef\@year{#1}}

原因

TikZ が内部で利用している pgfmathfunctions.random.code.tex\year を乱数のシードの生成に使用していて、TikZ をロードする前に呼び出したスタイルファイル (今回は foo.sty) で定義された \year とコンフリクトしているのが原因だった。

解決法

TikZ をロードした後にコンフリクトしていたスタイルをロードすれば良い。

\documentclass{jsarticle}

\usepackage{tikz}
\usepackage{foo}

\begin{document}
\end{document}

参考

広告を非表示にする

シェルスクリプトでチルダを含む文字列をチルダ展開する

シェル上でチルダは自動的に展開されるが、文字列内のチルダは展開されない。

$ echo $HOME
/home/fohte

$ echo ~
/home/fohte

$ echo "~"
~

$ echo '~'
~

これは eval もしくは bash -c によって解決できる。

$ eval 'echo ~'
/home/fohte

$ bash -c 'echo ~'
/home/fohte

また、チルダに限らず変数やワイルドカード (*, **) も展開される。

参考

広告を非表示にする

2016 年の振り返り

成人した

成人した。

卒業研究

自分が在籍している高専本科では 5 年次から卒業研究が始まる。
自分は無事に 5 年生へと進級できたため、2016 年に度々話題になった Deep Learning をテーマの一つとして掲げていた研究室に所属し、Deep Learning での画像自動生成をテーマにした。

研究とはいっても自分の学科の卒業研究は研究というよりやってみたや作ってみたのような雰囲気で、自分はのびのびと機械学習の勉強をしていた。
9 月にあった中間発表では、DCGAN と呼ばれる手法が高いクオリティーの画像を自動生成できるようになって最近盛り上がっているということで、それを Python3 + Chainer で実装して学習させてみましたよというようなことを発表した。
内容はかなり薄いしこれで大丈夫なのかという気がするが、そもそも機械学習について全く知識がなかったし、何でどう実装するべきなのか分からず、ひたすらググって何も分からんみたいな期間が長かったから仕方ないね。

2 月初旬には卒論を完成させなければならないので、今年は頭から頑張りたい。

ErgoDox を買って Dvorak 配列に移行した

今年は卒業研究があったり、5 年生になって授業数が激減し自宅で作業することが増えたりでタイピングする機会が増えた。
そこで、左右で分割されたキーボードがあれば寝転びながらタイピングできるしめっちゃ楽じゃね?ということで探していたら ErgoDox を見つけて、購入した。

ErgoDox は左右に分割されているため右側に配置されているキーを左手で押すことは難しく、QWERTY 配列で Y キーを左手で押すような独自運指が体に染み付いていたので、QWERTY 配列よりも効率的にキーが配置されている Dvorak 配列に乗り換えた。

ErgoDox が到着してから Dvorak 配列に切り替え、そこからしばらくはタイピングゲームで遊んでいた。
Dvorak 配列に慣れるのに要した期間は約 1 ヶ月ほどで、秒速 6 キー程度になった。QWERTY 配列では秒速 8 キー前後だったので遅くはなったが、そこまで不便には感じていない。
QWERTY 配列はもう完全に忘れてしまって、今 QWERTY 配列でキーボードを打とうとするとキーボードガン見しながら人差し指でタイピングすることになる。

ErgoDox + Dvorak 配列にはかなり満足していて、これから先キーボードは分割キーボード以外は購入しないし、QWERTY 配列に戻ることはないだろう。
ただ Dvorak 配列に完全に移行すると難点もあって、世の中は QWERTY 配列が標準で Dvorak 配列はまだまだ普及していないため、iOS 標準 IMEDvorak 配列が搭載されていなかったり、ゲームのソフトウェアキーボードが QWERTY 配列しか用意されていなかったりで辛い思いをすることが割と多い。

技術系のこと

今年は卒業研究がメインだったのでもっぱら Python を触っていて、簡単なスクリプトから研究室で動かしている Slackbot まで何でも Python で書くようになった。
Python は複雑な構文が特にないため分かりやすく、公式のドキュメントも充実していて、すぐに馴染んだ。
しかし、それなりに理解できて満足したのでそろそろ他の言語を学習したい気持ちになっている。今年は Ruby かな。

IIDX, BMS 復帰した

約 3 年前に家庭用環境を取っ払って一時は引退していたが、Splatoon を通じて知り合った音ゲーマーのフォロワーとゲーセンで遊んでいたときに IIDX をやってみると完全にモチベーションが復活して、気付いたときには DAO コンを購入していた。

今はほぼ毎日 1 時間以上は BMS かゲーセンで IIDX していて、BMS は発狂九段、IIDX卑弥呼ハード程度の地力になった。
まだ全盛期に比べると少しだけ劣っているので、2017 年はひとまず全盛期の自分を越えて、発狂皆伝 + IIDX ☆12 全エクハを目指しつつ頑張りたい。

広告を非表示にする

qmk_firmware の keyboard ディレクトリの構成が変更されていた

Fork 元 (jackhumbert/qmk_firmware) から自分のリポジトリに pull したところ、 keyboard ディレクトリの構成に変更があった。 今年 7 月に移動したらしい。

対応としては、自分の keymap をディレクトリごと移動すればよい。
例えば ErgoDox の場合、以下のように mv する。

mv keyboard/ergodox_ez/keymaps/<your directory> keyboards/ergodox/keymaps
広告を非表示にする

fzf で git add する

はじめに

github.com

fzf 便利ですよね。 煩わしいコマンドラインのファイルパス入力は極力 fzf で済ませたくなってきます。

git add 時の疲労を fzf で軽減する

git add で一部のファイルだけ add したいとき、add したいファイル全てのパスを列挙する必要があります。
git add -p でコード単位で add する方法もありますが、更新量が多い場合などファイル単位で add したいときは面倒です。

シェルスクリプトを組む

今回はシェルスクリプトを用いていますが、bashrc や zshrc などで関数として定義することも可能です。
また、git add のオプションを利用することができます。

#!/bin/bash
local addfiles
addfiles=($(git status --short | awk '{ print $2 }' | fzf --multi))
if [[ -n $addfiles ]]; then
  git add ${@:1} $addfiles && echo "added: $addfiles"
else
  echo "nothing added."
fi

解説

シェルスクリプトの流れを追っていきます。

はじめに、fzf で選択された add したいファイルをローカル変数に代入します。

local addfiles
addfiles=($(git status --short | awk '{ print $2 }' | fzf --multi))

まず、未ステージング状態の (add されていない) ファイルの一覧を git status --short で取得します。
git status --porcelain でもファイル一覧は取得できますが、git リポジトリのルートディレクトリからのパスで出力されるため、ルートディレクトリ下から git status --porcelain を叩くと期待したパスが得られません。

このコマンドは、例えば以下のような出力が得られます。

 M ../Makefile
?? ../test

awk '{ print $2 }' で、スペースを区切りとしたときの 2 列目のみを出力します。

../Makefile
../test

これでファイルパスが得られたので、 fzf --multi で fzf を起動します。 --multi は Tab キーで複数選択できるようにするオプションです。 また、tmux を利用しているのであれば、 fzf ではなく fzf-tmux を使用するとなお捗るかもしれません。

最後に、得られた add したいファイル一覧を git add します。

if [[ -n $addfiles ]]; then
  git add ${@:1} $addfiles && echo "added: $addfiles"
else
  echo "nothing added."
fi

-n $addfiles で fzf で何らかの候補がひとつ以上選択された場合のみ git add するようにし、 ${@:1}シェルスクリプトに渡された引数で、これを git add に渡すことで git add のオプションを利用できるようにしています。

広告を非表示にする