備忘録とか日常とか

学んだこととかを書きます。

Markdownが書きたいのでAtomとVSCodeを整備して比較する

Markdownを書くための環境設定などをメモする。
普段はVSCodeを使っているが、github開発のAtommarkdownと親和性が高そうなので比べてみた。
環境はmacbook promacOS Sierra 10.12.6

Atom

Atomはデフォルトでmarkdownに対応しており、macならctrl + shift + mでリアルタイムプレビューを表示できる。
それに加えて拡張機能も豊富であり、以下のサイトで色々紹介されている。
qiita.com

とりあえず以下の拡張は便利だった。

markdown-writer

各種ショートカットが追加され、キーバインドなどを設定可能。
便利。この後のtool-bar-markdown-writerがもっと便利。

tool-bar-markdown-writer

markdown編集時に、エディタ上部にtool-barが表示される。
markdownの記法を覚えてなくてもGUIで直感的に扱えるようになる。テーブル整形とかも便利。
tool-barmarkdown-writerのパッケージが必要。

markdown-pdf

Atomはデフォルトでhtml出力には対応しているが、pdfなどで出力するにはこのパッケージが必要。
コード部分なども綺麗に出る。
Atomはプレビューや出力のhtml, pdfのデザインなどがデフォルトで綺麗なとこが最大の利点かもしれない。


以下のはちょっと問題があった。

markdown-scroll-sync

プレビューをスクロールすると自動で該当するテキスト部分までスクロールしてくれる。
機能自体は便利で良いのでが、自分の環境ではなぜか動作しなかった。。
Mac以外なら動くのかもしれない。アプデ待ち。

markdown-toc

目次を自動生成してくれるパッケージ。
トピック名を変更しても上書き保存時に目次も変更してくれるのでよい。
が、これで生成したhtmlやpdfのリンクは機能しない。。意味ねえ。。
当然プレビューのリンクも効いていない。

ググってみて、先人がいたと思ったらなんかちょっと違った。
take-she12.hatenablog.com
日本語はidが生成されなくてリンクが正常にいかないらしいということはわかったが、英語でもリンクされない。
何故なのか・・・。
Atom側の問題なのかもしれない。解決できる気がしないのでとりあえず放置。


と思ったらすごいのがあった。

markdown-preview-enhanced

f:id:may46onez:20180309180023p:plain
プレビュー、TOC作成、プレビューとスクロール同期に加えてlatex数式埋め込みからPDF、html、ebook出力などめっちゃ多機能である。
数式埋め込みなど全ての機能を使うには別途パッケージが必要だが、これを入れるだけでとりあえず

  • スクロール同期プレビュー
  • TOC自動作成
  • html出力(リンク生きてる, ただし日本語はだめ)

の三つは実現できる。もうこれだけでいいね!

PDF出力はpuppeteer, phantomJS, princexmlの三つに対応している。princexmlは有償なのでよくわからない。
残り二つについて試してみた

puppeteer

Nodeのライブラリ。今までNode.jsとかいうのに触れた機会がなく、基礎知識など皆無だがとりあえず使う方法だけメモしておく。
Node.jsについての説明は以下だけ読んだ。
qiita.com
qiita.com

macで導入するにはまずhomebrewを導入する。多分↓のでできる。
qiita.com

その後nodeをインストールする。

brew install node
echo 'export PATH="/usr/local/share/npm/bin:$PATH"' >> ~/.bash_profile

するとnpmが使えるようになっているので、

npm install -g puppeteer

とするとpuppeteerでのPDF出力が可能となる。

ここまでやってから、どうやらnodebrewとやらがあるということに気がついた
mmorley.hatenablog.com
homebrewではNode.jsのバージョン管理ができないらしい。
今はよくわかんないので必要になってからでいいかな・・・

PhantomJS

PhantomJSとはwebkitベースのヘッドレスブラウザということらしい。サーバサイドとかウェブ系のことがわからなさすぎて辛い。。
例によってとりあえず使う環境は整えておく。というよりこれはbrewで入れるだけ。

brew install phantomjs

二通りでPDF出力を試したが、puppeteerはコード部分の背景が白くなってしまい、phantomJSはやたらフォントサイズが大きくなってしまうという結果になった。
どっかをいじれば直せるのかもしれないが、とりあえずデフォルトではAtomのプレビューとPDFが綺麗で個人的には一番好き。


VSCode

VSCodeもデフォルトでmarkdownプレビューに対応している。
しかし自動で分割してくれず、shift + command + Vで同じ領域の別タブにプレビュー→自分で画面分割という手順を踏む必要があり、あまりスマートな感じがしない。
以下のパッケージが非常に役に立つ。

Markdown Preview Enhanced

MPE再び。デフォルトでは微妙なmarkdownプレビューを改善してくれる。
Atomと同じctrl + shift + m (またはcommand + K からの V)でMPE Previewを表示でき、自動で画面分割してくれるので余計な操作はいらない。
もはやこれでほぼ事足りる。


一応こんなのもある。

Markdown PDF

VScodeデフォルトのプレビューをPDF変換する。
上書き保存時に自動変換する機能や、スタイルシートを指定して自分好みのpdfを出力できる機能がついており、拡張性が高い。
ただデフォルトだとVScodeのプレビューのまま出てくる上にフォントサイズが少々大きい。
色々いじりたい人向け。ドキュメントが日本語で読みやすい

Markdown All in One

ショートカット、テーブルフォーマット、アウトライン表示などなど、編集する際に役立つ機能が詰まった拡張。
VScodeでがっつりmarkdownを編集する人にはいいかもしれない。
ただしbold体、italic体をトグルするショートカットがVScode自体のショートカットと重複するので注意が必要。

どっちを使うのか

と、ここまで書いたがVScodeには一つ致命的な欠陥がある。
プレビュー表示した状態で日本語を入力→バックスペースを押すとゴミ文字が入力されるというもの。
以下でこの問題が取り上げられている。
forum.vivaldi.net

qiita.com

macOSだけの問題らしい。日本語入力の際に出る不具合だが、プレビュー表示していない時は問題なく編集できる。謎。
今のところ、少なくともMarkdownをプレビュー見ながら編集したければAtomがいいと思われる。

.bstファイルをいじって著者名表記を変える

bibtexで引用する際に注意すべき点として、

  • 引用順をどうするか
  • 著者名表記をどうするか

がまずあげられる。分野によると思うが、自分がよく使うのは

  • 文献を引用された順にソート
  • 著者名のファーストネームはイニシャル

なので、それに合わせて.bstファイルをいじる方法をメモする。

デフォルトのテンプレ

欧文用ではplain.bst, unsrt.bstを使い、和文にはjplain.bst, junsrt.bstを使う。
plainでは参考文献がアルファベット順に出力し、
unsrtでは引用された順に出力する。

特に設定を書き換えない場合は参考文献を載せたい場所で

\bibliographystyle{plain}
\bibliography{reference.bib}

みたいに書けば良いが、自分でいじった.bstファイルを使う場合はtexソースと同じディレクトリに.bstファイルを置く。

ここではjunsrt.bstをいじって自分用のmyjunsrt.bstをつくる。
/usr/local/texlive/2016/texmf-dist/pbibtex/bst/junsrt.bstを適当にコピー。
jplain.bstも同じ場所にある。バージョンとかは適宜読み換える。
見つからない場合は

find /usr/local/ -name junsrt.bst

とかしたら出てくる。windowsもtexlive/以下にあるんじゃないかな。知らんけど。

書き換え

.bstファイル内では、

FUNCTION {---定義名---} {
    ----定義の内容----
}

という形で各種表記の仕方が定義される。
こんな感じ↓

FUNCTION {format.names}
{ 's :=
  #1 'nameptr :=
  s num.names$ 'numnames :=
  numnames 'namesleft :=
    { namesleft #0 > }

    { s nameptr "{ff}{ll}" format.name$ is.kanji.str$
	{s nameptr "{ff}{ll}" format.name$ 't :=}                        
 	{s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't :=}
      if$

      nameptr #1 >
	{ namesleft #1 >

	    {", " * t * }


	    { t "others" =

 		{ s is.kanji.str$

 			{"$B$[$+(B" * }


 			{", et~al." * }

 		  if$
 		}
 		{ s is.kanji.str$

 		    {", " * t * }



		    { numnames #2 =
 			{" and " * t * }
 			{", and " * t * }
		      if$
		    }


 		   if$
 		}
	      if$
	    }
	  if$
	}
	't
      if$
      nameptr #1 + 'nameptr :=
      namesleft #1 - 'namesleft :=
    }
  while$
}

著者名の出力を変えるにはFUNCTION {format.names}の中身を書き換える。
上記nameptrとか書いているあたりを見る

       {s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't :=}

この部分。
{ff~}{vv~}{ll}{, jj}で著者名の表記を指定する。

  • {f}でファーストネームを頭文字のみ表示、{ff}で全て表示
  • {l}でラストネームを頭文字のみ表示、{ll}で全て表示
  • {v}でミドルネームを頭文字のみ表示、{vv}で全て表示
  • {j}でJr.を頭文字のみ表示、{jj}でJr.全て表示
  • `~`をつけるとそこで改行されなくなる。姓と名で改行されないようにするために使われる。
  • `.`をつけるとその位置にピリオドを表示
  • `, `をつけるとその位置にカンマを表示

で変えられる。
例えばJohn Fitzgerald Kennedyが著者名の時、

  • {f.~}{v.~}{ll}{, jj} で J. F. Kennedy
  • {ff~}{v.~}{l.}{, jj} でJohn F. K.

みたいになる。

【追記 18/2/5】
一行前の

	{s nameptr "{ff}{ll}" format.name$ 't :=}

の部分は日本語表記に使用される。ここを書き換えると漢字の苗字の一文字目だけ表示されたりするのでいじらない。


他にもタイトルや出版年の出力を変えることができるらしい。
少なくとも情報系の学会や研究会ではtexフォーマットが与えられることが多いので使う機会はなさそうだが・・・
自前で作る必要がある場合に役立つかもしれない。

○参考元
bst ファイルのカスタマイズ - Okomeda Net
LaTeXで参考文献の形式を変更する方法(bstファイルの編集) - けつあご日記

Visual Studio Codeの拡張とか初期設定とか

約一年半の沈黙を破り更新。
いや沈黙というか普通にサボってただけなんだが・・・

社会人になってもコンスタントに更新できるだけの気力があるかどうかはわからない。
でもできるだけ勉強したこととかを更新していきたい


エディタの話。最近Visual Studio Codeに乗り換え、いい感じなので初期設定などをメモしておく。


自分は最初Sublime textを使ってたが、拡張の設定などが煩雑であまり好きになれなかった。
あと「これ無料版やで!気に入ったら買ってや!」っていうポップアップも地味に鬱陶しかった。。
なのでAtomに切り替えたのだが、拡張を入れていくとかなり重くなってしまい、ついにイライラがピークに達したのでリストラした。


VSCode

  • 拡張を入れても十分軽い
  • gitやターミナルにデフォルトで対応
  • デバッグ機能も最初から搭載

と、かなり使い勝手が良い。
というか最初からある程度の機能が備わっているので、拡張を入れずともそこそこ使えるのである。
それがVSCodeの魅力とも言える。

逆に不便に感じたことは

  • 複数プロジェクトを同時に開けない
  • たまにauto formatが効かない(OS依存?)

などがある。
異なる場所にあるディレクトリをサイドバーで同時に開く機能がVSCodeにはないらしい。
シンボリックリンクを使う方法もあるようだが、まあデフォで対応してくれたらその方が嬉しい。
あとubuntuで使用してる時にpythonのauto formatが効かない時がある。
これに関してはよくわからん。誰か直してくれ(他力本願)


とまあ色々あるがいい感じなので初期設定をメモしておく。
当方現在はpythonがメインなのでpython系の拡張が多いです。

拡張

Atom Keymap

その名の通り、Atomキーバインドをそのまま持ち込める。
もちろんVSCode内でキーバインドをカスタムすることもできるが、他のエディタに慣れた人ならそのまま使えるのが良い。
Sublime Text Keymapもありますよ。

Shortcuts

画面下のステータスバーにターミナルなどのショートカットを追加する。
あんま使わないけどあったら便利か?

Linux Themes for VSCode

テーマが追加される。
デフォルトではなんとなく好きじゃない配色ばかりだったので、これは気に入っている。

file-icons

サイドバーのアイコンが変わる。
いっぱい種類があるので調べて見ると楽しいかも。

LaTeX Workshop

latexがビルドできるようになり、pdfファイルをvscode内のtabで表示できる。
pdfはブラウザでも表示できる。
シンタックスハイライトやオートフォーマットも追加される。便利。
詳しくは以下
qiita.com
VSCode でLatexの日本語環境を作る · GitHub

Project Manager

プロジェクトを切り替えるコマンドを追加できる。
上述の通り、VSCodeではサイドバーで異なる場所にあるディレクトリを同時に開くことができない。
代案としてこの拡張を使えば、同時には開けないが切り替えはスムーズにできる。

Python

とりあえず入れた。シンタックスハイライトやらスニペットやらが追加される。
この中でも`Python`はpythonでコーディングするなら必ず入れる。lintとCode formatが使えるので便利

Setting Sync

非常に便利。gistを使って複数の端末で設定を共有できる。
利用するにはGithubアカウントが必要になる。利用方法は以下を見ればわかりやすい
marketplace.visualstudio.com

設定

Macなら設定ファイルは`/Users/ユーザー名/Library/Application Support/Code/User/settings.json`に書かれているが、
VSCode⌘ + ,GUI的に設定できる。windowslinuxならctl+,だと思う

ここに設定を書き込むわけだが、検索して変えたい設定をクリックするだけで設定ファイルに自動で記述される。
例えばエディタ内のルーラの位置を変えたければ、検索窓にrulersとか入れて出てきた設定を選択すればよい。
拡張の設定もここで変えられる。

以下に自分の設定をのせとく
【18/2/1 更新】

{
    "editor.multiCursorModifier": "ctrlCmd",
    "editor.formatOnPaste": true,
    "editor.renderWhitespace": "all",
    "python.linting.pylintEnabled": false,
    "python.linting.pep8Enabled": true,
    "editor.wordWrap": "on",
    "editor.rulers": [
        80
    ],
    "[python]": {
        "editor.rulers": [
            79
        ]
    },
    "editor.formatOnSave": true,
    "[latex]": {
        "editor.formatOnSave": false
    },
    "latex-workshop.latex.toolchain": [
        {
            "command": "ptex2pdf",
            "args": [
                "-l",
                "-ot",
                "-kanji=utf8 -synctex=1",
                "%DOC%"
            ]
        },
        {
            "command": "pbibtex",
            "args": [
                "%DOCFILE%",
                "-kanji=utf8"
            ]
        },
        {
            "command": "ptex2pdf",
            "args": [
                "-l",
                "-ot",
                "-kanji=utf8 -synctex=1",
                "%DOC%"
            ]
        },
        {
            "command": "ptex2pdf",
            "args": [
                "-l",
                "-ot",
                "-kanji=utf8 -synctex=1",
                "%DOC%"
            ]
        }
    ],
    "latex-workshop.latex.autoBuild.onSave.enabled": false,
    "editor.renderControlCharacters": true,
    "workbench.startupEditor": "newUntitledFile",
    "workbench.activityBar.visible": true,
    "python.linting.mypyArgs": [
        "--errors-only"
    ],
    "python.formatting.autopep8Args": [
        "--errors-only"
    ],
    "workbench.colorTheme": "Adapta Nokto",
    "window.title": "${activeEditorLong}",
    "sync.gist": "2adb76066f632f1f22a2798c7d57e1c2",
    "sync.lastUpload": "2018-02-01T03:57:43.855Z",
    "sync.autoDownload": false,
    "sync.autoUpload": false,
    "sync.lastDownload": "",
    "sync.forceDownload": false,
    "sync.anonymousGist": false,
    "sync.host": "",
    "sync.pathPrefix": "",
    "sync.quietSync": false,
    "sync.askGistName": false,
    "editor.minimap.showSlider": "always",
    "workbench.iconTheme": "file-icons",
}

メモしておくと、

  • `Python`拡張はデフォルトでpylintを使うが、自分はpep8派なので以下の記述を加える
"python.linting.pylintEnabled": false,
"python.linting.pep8Enabled": true,
  • pep8でwarningとerrorの箇所を示してくれるが、warning山ほど出すぎてしんどいのでとりあえずerrorだけ表示するように設定
"python.linting.mypyArgs": [
        "--errors-only"
    ],
    "python.formatting.autopep8Args": [
        "--errors-only"
    ],
  • latex関係を導入。
    "latex-workshop.latex.toolchain": [
        {
            "command": "ptex2pdf",
            "args": [
                "-l",
                "-ot",
                "-kanji=utf8 -synctex=1",
                "%DOC%"
            ]
        },
        {
            "command": "pbibtex",
            "args": [
                "%DOCFILE%",
                "-kanji=utf8"
            ]
        },
        {
            "command": "ptex2pdf",
            "args": [
                "-l",
                "-ot",
                "-kanji=utf8 -synctex=1",
                "%DOC%"
            ]
        },
        {
            "command": "ptex2pdf",
            "args": [
                "-l",
                "-ot",
                "-kanji=utf8 -synctex=1",
                "%DOC%"
            ]
        }
    ],
    "latex-workshop.latex.autoBuild.onSave.enabled": false,

toolchainを指定することでbibtexファイルとかを一発でビルドしてくれる。詳しくは上述のサイト。

ついでにlatex-workshop.latex.autoBuild.onSave.enabledをtrueにすると保存時に自動ビルドされる。デフォルトでtrueになっているが煩わしいのでfalseにした

  • 保存時にオートフォーマットする。この機能がAtomの拡張より格段に軽くて使いやすい。
"editor.formatOnSave": true,
  • ウィンドウのタイトルバーにカレントディレクトリのパスを表示。
"window.title": "${activeEditorLong}"
  • 言語ごとに設定を変えることができる。pep8は79文字制限があるので、pythonの時はルーラを79文字の位置にする
 "[python]": {
        "editor.rulers": [
            79
        ]
    },

また自分のlatexファイルはぐっちゃぐちゃなのでもはや我流で行きたい。latexでは切る。

"[latex]": {
        "editor.formatOnSave": false
},

latexでオートフォーマットするにはlatexindentというツールを導入する必要がある。
以下のサイトでなにかわかるかもしれない。
tex.stackexchange.com



Setting Sync使えばこれも自動でバックアップされるのでメモする意味もないかもしれないが一応。
今後VSCodeがもっと栄えてくれると嬉しい。

Windowsノート グラフィック設定を電源接続時と同じにする

所持していた古いノートPCにWindows10をクリーンインストールしたところ,
グラフィック設定が変わってしまったのでメモしておく.
具体的には

  • 電源に接続すると,一瞬画面が暗転して元の画面に戻る
  • 電源接続時はぬるぬる動くのに,バッテリー駆動時はなんかカクカクする(リフレッシュレートが変わっている)
  • 背景が暗いページを表示すると画面輝度が暗くなる.明るいページだとまた明るくなる

のような症状が現れた.
一応直し方をメモしておく.


環境
TOSHIBA dynabook R731(古い)
windows10 pro をクリーンインストールしたところ,
Intel(R) HD Graphics 3000 が自動で取得された.


リフレッシュレートを設定

インテルのグラフィックプロパティを立ち上げ,
「電源」-> 「バッテリー駆動」から
「ディスプレイ リフレッシュレートの切替」のチェックを外す.

「ディスプレイ」-> 「一般設定」の
リフレッシュレートを 60Hz に設定する

これで電源を抜き差しするたびに画面が暗転することはなくなり,
かつバッテリー駆動時でもぬるぬる動くようになる.


画面の輝度調整を無効

同じくインテルのグラフィックプロパティから,
「電源」-> 「バッテリー駆動」から
「ディスプレイ省電力テクノロジー」のチェックを外す.

かつ「バッテリー駆動」「電源接続」の両方の電源プランを
「最長バッテリー駆動時間」に設定する.


これで画面輝度が一定になる.
ならない場合はコントロールパネル -> 電源オプション -> プラン設定の変更から
「詳細な電源の変更」を開き,「ディスプレイ」->「自動輝度調整を有効にする」をオフにする
これでたぶんいける

バッテリー駆動時と電源接続時で画面輝度を変えたくないなら
「ディスプレイの明るさ」からそれぞれ同じ輝度に設定しておく



とりあえず電源回りは解決したけど
根本的にスペック足りてないしなこれ

新しいPC欲しいなぁ...新型macbook air早く出ないかなぁ...

Deeplearningライブラリ「Keras」でつまずいたこと

DeeplearningライブラリのKerasを使っているときにはまったことをいくつかメモ。
ほぼ自分用かもしれない


今までTheanoを使ってアルゴリズムの勉強かついろいろ実験していたのだが、
勉強にはなるものの一から新しいアルゴリズムを実装するのはなかなかしんどいので
Theanoのラッパーとして使えるKerasを使ってみた

他にも色々あるっぽいけど評判良さそうなので。。
そのうち浮気するかもしれん


ちょっと使って見たところ、何個か細かい点でつまずいたのでメモしておく。
バックエンドはTheanoしか使っていないのでTensorflowについてはわかりません

ラベルはバイナリベクトルで扱う

まずこれ。
keras.datasetsからmnistなどのデータセットを取ってこれる。
mnistの場合だと以下

import keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()

mnist.load_data()の戻り値はタプル*2

Xは(n_samples, row, column)という形のnp.arrayで、
yは0~9のint型の数値を持つ(n_samples,)という形のnp.arrayとなっている
Kerasはラベルを数値ではなく、0or1を要素に持つベクトルで扱うらしい
つまりあるサンプルに対するターゲットを「3」だとすると

[0, 0, 0, 1, 0, 0, 0, 0, 0, 0]

みたいな感じにしなければならない。

これは以下のように解決できる。

from keras.utils import np_utils
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)

(n_samples, n_classes)というnp.arrayがそれぞれのyに代入される。

入力データは[0,1]の範囲に正規化しなければならない

これが一番わかりにくかった
mnistの場合だと,まず入力データはint型になっているので変換する
その後画素値の最大である255で割り算しておく

X_train = X_train.reshape(X_train.shape[0], 28, 28).astype("float32")
X_train /= 255.0

こうしないと一向に学習が進まない。
Theano使ってるときは特にこういった処理はしなくても学習できたので
判明するまで丸二日くらいかかった

ドキュメントのわかりやすいとこに書いといてほしいです。。

poolingのフィルタがはみ出る場合は端っこのピクセルを無視する

細かい点だけど。
Theanoでプーリングを行う場合はtheano.tensor.signal.poolを使うのだが
フィルタサイズやストライドに加えてignore_borderという引数をとる。
これは例えばフィルタサイズ(3,3)、ストライド(2,2)みたいな設定にしたときに、
特徴マップの端でフィルタがはみ出した場合の扱いを決定する引数である。
図の例↓

f:id:may46onez:20151221223401p:plain

ignore_border=Trueとすると、はみ出た分のプーリングは行わない
つまり上図の例だと出力の特徴マップは(2,2)となる

この引数が、TheanoのデフォルトではFalseになっているのが
KerasだとTrueになっている

あまり性能に影響は出ないと思われるが、特徴マップのサイズがあまりにも小さくなりすぎると
認識率が落ちることが(自分の経験では)多々あったので
自分でネットワーク構造を考える場合は気に留めといたほうがいいかもしれない。

シークバー処理中にValueErrorを吐かれる

Kerasのいいところの一つに、学習状況などをシークバーでお知らせしてくれる機能がある
こんなの↓

Epoch 1/20
60816/60816 [==============================] - 19s - loss: 0.1665 - acc: 0.9597 
Epoch 2/20
31200/60816 [==============>...............] - ETA: 8s - loss: 0.1583 - acc: 0.9612

あとどれぐらいで学習が終わるか、lossがどれぐらい減少しているか、
学習データに対する認識率はどうか、
validationセットを指定した場合はそれに対する認識率もリアルタイムで表示される。

非常に便利な機能なのだが、
たまに以下のようなエラーを吐くことがある

ValueError: I/O operation on closed file

これはipythonでのバグらしいのだが、
今のところこれを根本的に解決する方法がないらしい・・・
丸一日かけて学習していたモデルが途中で止まったらかなりげんなりするだろう。
現に自分はした。

とりあえずの解決策としては、model.fit()の引数にverbose=0とする
これでシークバーが表示されなくなるのでエラーは回避できるが、
せっかくの便利機能が使えなくなる。。


公式の対応に期待か。