io.Readerはスレッドセーフなのか

Golangインターフェイスにある io.Reader は、スレッドセーフなのか。気になったので、調べてみた。
結論から言えば

  • os.File は、スレッドセーフになってる
  • それ以外は、実装によるけど、スレッドセーフじゃないと思った方がいい

っという感じになってた。

続きを読む

colaboratory用のプログレスバー

夏頃から話題に上がってる colaboratory を数週間いじってた。

Python には詳しく無いので、コピペしたり書き換えたりしながらいじってたけど。
colaboratory のイケてない点として、プログレスバーやログが延々と溜まっていく点が挙げられる。

原因を調査を調査してみると、どうやらエスケープシーケンスが無視されてるのが原因のようだ。

sys.stdout.write('\r') # work
sys.stdout.write('\033[J') # not work

キャリッジリターンは効くので、1行だけは消せる。 (※正確には、1行だけ上書きできる)
けど、ログやプログレスバーなど、複数行を消すのは、どうやら無理そうだった。

良い手立ては無いか探してたら、いいものを見つけた。

GitHub - fastai/fastprogress: Simple and flexible progress bar for Jupyter Notebook and console

使い方のサンプルが少ないのが玉に瑕だったけど、colab でも使えることを確認した。
これを chainer の extension として使えるように実装してみた。 (見よう見まね)

Progressbar & loss image & sample image extension for chainer · GitHub

f:id:minowith:20181208175619p:plain

※内部的には IPython.display を更新してるので、それを使えば更新表示はできるのかもしれない・・・

注意点

現在わかってる問題として、損失グラフが extensions.PlotReport と違う結果を返すということが挙げられる。
ブログを書いてるときに分かったので、あとで直してみる。

[追記] 修正しました。

並列処理の本を読み終わったので、並列処理を作りました

寝る前にのんびり読んでたので、読み終わるのが遅くなりましたが。
「Go言語による並行処理」を読み終わりました。

www.amazon.co.jp

読み終わった記念に、ストリームっぽい書き方ができる物を作りました。

github.com

続きを読む

zipをいじれるコマンドを作りました

もう2週間前になりますが。
zipをいじれるコマンド ziped を作りました。

github.com

簡単な使い方
# ファイルの中身表示
ziped ls hoge.zip

# 該当するファイルを削除
ziped rm hoge.zip --filter="hoge.cpp" --overwrite

# ファイルの名前を変更
ziped rename hoge.zip --from=".cpp" --to=".c++" --overwrite

# ファイルの中身を変更
ziped convert hoge.zip --cmd="optimizer.exe" --filter="*.cpp"

自分の環境でいろいろ試したところ、処理がめっちゃ遅い・・・
最適化とか並列化を模索中。

golang におけるパッケージパスへの苦情

今日は、ただの愚痴です。

golang で開発する上で、「パッケージパス」からは逃げられない。

  • 全てのファイルは、パッケージに所属していなければいけない。
  • パッケージパスは、フォルダ構造に依存する。

そして、パッケージパスは、悲しいことに、「インターネット」から逃げられない。

  • 外部パッケージのパッケージパスは、Web の URI に依存する。

これをちょっと整理して、苦情を述べる。 (主に3つ目に対して)

結論

パッケージパスは自由に決めさせてくれ!

続きを読む

Proxyでつらい人のためのメモ書き

某社では、通信を 監視 管理するために、Proxyを通さないとインターネットに接続できないようになっている。
そんな、可哀想な人を救うために、知ってる範囲の設定を書き出してみた。

Proxyでつらい人のためのメモ書き · GitHub

参考文献

Qiita を見ると、つらい思いをして乗り越えてる人が沢山見つかる。
本当に、いつも助かっております。
https://qiita.com/tags/proxy

おまけ: Proxy に NTP を殺されてしまった人の設定

Windows

PowerShellを使って、http経由で時間を取得&設定することができる。
HTTP経由でのNTP時刻合わせ(PowerShell利用)

Linux

htpdateを使って、http経由で時間を取得&設定することができる。
Introduction | HTTP Time Protocol

goalngのarch/zipをカスタマイズした

golang には標準でライブラリが沢山入っており、例えば zip圧縮/解凍 を行う arch/zip なんてものもある。
もちろん、ソースコードは全て公開されている。 (github)

しかし、このzipライブラリ、使ってく上で2点問題があった。

  • zipファイルの編集に向いてない
  • Data Descriptor を書き込まない形式に対応していない

この問題を解決するために、はるか昔に arch/zip を fork した物がこちら。
だけど、もろもろ互換性に問題があってサポートしづらかったので、1からforkしなおした。

github.com

以下、余談

続きを読む