次ログ

次ログ

JavaFXで作ったツールとか公開したり、イラスト配布したり音楽配布したりしてるかもです。

GitHubPagesにブログ移転します。

GitHubPagesにブログを移転します。 移転先は下記。

jiro4989.github.io

配布イラスト一覧は下記 次郎の配布イラスト一覧

はてなブログはエンジニアの利用率が結構高い印象です。 一番のメリットはMarkdown記法に対応していることだと思ってます。 僕もMarkdownが使えるから、ということでFC2から移ってきました。

他にもメール送信で記事の投稿ができるので スクリプトと連携して自動化したり Vimで記事を書いたりできる。 SEO対策もしっかりされてますし、 はてなブックマーク数やスター数が表示されるのも結構便利だったんですが 投稿後に記事を修正するための編集ページが重たかったり もろもろ不満もありました。

github.ioのドメインと柔軟性の高さ、 ブログ記事の更新履歴を残せる、 管理がやりやすい、 エディタが選べる、コマンドラインと相性が良い、自動化が簡単など いろんなメリットから移転を決意しました。

移行こちらのブログはおそらく更新しません。 イラストの配布についても新しいブログの方に告知していきます。

以上です。

自分が今まで書いたイラストの書いた時期と枚数を集計する

概要

集計の勉強がてらにbashawkで自分が今まで書いたイラストの枚数と傾向を集計して分析します。

目的

自分の絵師としてのモチベーションの傾向を分析し、未来の活動指針を決定するため。 というのは大嘘でbashawkで集計の練習がしたかったからです。

成果物は月単位、年単位で集計したグラフです。 本目的の達成は、上記のグラフを作成し可視化することをもって完了とします。

コード

成果物

csv形式で出力してLibreOfficeでグラフ化しました。 (コードの方ではcsv形式で出力するようにはしていないので、 スクリプト呼び出し時に| tr '[:blank:]' ','しました。

年単位での集計結果

f:id:jiroron666:20180325213600p:plain

月単位での集計結果

f:id:jiroron666:20180325213603p:plain

考察

2016年のころ、僕はまだ大学4年生でした。 大学4年は卒論の提出と就活が終わってしまえばあとはひたすら暇になるので その時間をイラストとプログラミングに最大に使っていたことがよく統計に現れているように思います。

2016年1月〜3月は冬休みでしたし、卒業研究も就活もまだ本腰でなかった時期なので その時間はひたすら絵を書いていたみたいですね。

しかし僕って2011年から絵を書いていたんですね...。 意外と結構期間が長いものです。

最近はめっきり絵を書く熱は冷めてしまって、プログラミングの熱ばかりあがっていますが、 それでもこれからも、年に1,2枚くらいは何かしら書くと思います。

アクセスログの処理時間を集計する単純なコード

概要

最近Bashで集計をすることが多いです。集計作業楽しいです。 と同時に、Clojureという言語にも興味ができたので、せっかくなので 簡単な集計作業を両方の言語でやってみたというだけの話です。

目的

access_log というログファイルが存在します。 ログのデータはすべて行単位ですが、共通することは行の一番最後の数値は アクセス時の処理時間です。

このアクセスログの時間を集計して、合計秒と行数を出力したいです。

作成したコード

下記を参照。 ClojureBashのコードです。

まとめ

集計作業のコード量の短さや読みやすさ、手軽さはやっぱり BashAwkのほうが断然上だなぁ...と。 Awkとかはもろに集計のための言語なんでかなり便利。 Clojureに集計やらせるもんじゃないかな...。 でも大量の便利関数群をまだまだ把握できていないので、 それらを駆使したらもっと短くシンプルになるのかも?

個人的にはBashClojureってなんか似ているような気がします。 BashのパイプとClojure関数型言語の性質が似てて、 コードを書いていてパズルを解いているような感じがしてコーディングがすごく楽しい。 逆にGoだとClojureほどコーディングが楽しくなかったり... 実装自体は複雑な機能がないので、つまづくこともあまりなく高速で実装できますが 味気ない感じがどうもあります(気にするべきじゃないのかもですが)。

余談

集計作業を行うとき、今まではなんとなくPythonとかでやっていたのですが、 そこまで複雑ではない処理だったらむしろPythonよりもBashAwkのほうが 短く素早く実装できるなぁと実感しています。

シェルのコードをPythonに置き換えるような話をちらほら聞く中 時代を逆走するようにBashAwkの勉強を最近はしています。 でも使ってみるとかなり便利なので、これからも勉強しようと思います。

作業記録 2018-02-18

作業記録 2018-02-18

Clojure + JavaFX

断念。Clojureが変数の再代入を許可しない制約のせいか知らないけれど、何かと問題に 直面。直面した大きな問題は下記。

  1. ListViewにFile型を入れられない。ListViewはJavaではGenerics指定するクラス ClojureListView<File>指定と同等のものが見つからなかった
  2. FXMLを使わない方法でstartしようとするもなぜか(.lookup root "#id")でnilが返っ てくる。lookupで対象を絞り込むことすら叶わなかったので諦めた。
  3. ScriptとしてのClojureを呼び出す方法の場合も同様でListViewの型にString以外指定 できないため断念。

とにもかくにも動的型付けとJavaFXの静的型付けが喧嘩をしている印象。どうしたもんか 。

スクリプトとしてのClojure

JavaFXないでJavascriptClojureを使うことが可能。Clojureは正式には対応していない ので、専用のライブラリを入れる必要があったが、たしかに動作した。注意点は、 <fx:script source="/script/event.clj" />とかって指定をする場合は、FXMLのrootの一 番最後のタイミングでロードするようにしないと、fx:idで定義されているコンポーネン トが未定義扱いされてアクセスできなくなる。

LightTable

Clojureの開発環境としてよく候補に上がるものらしい。使ってみた感触としては...。微 妙極まりない。まずフォントサイズの融通が利かないし、補間もほとんど聞かない。Web の記事の情報だとリアルタイムでClojureのコードの変更が反映されるとかって話だけれ ど、僕の環境では全然そんなことはなかった。うーーん。十中八九設定がうまく行ってな いだけなんだろうけれど、第一印象が良くなかったツールにこだわってもしょうがなかっ たので早々に設定は諦めて他のツールを探すことにしました。

Spacemacs + CIDER

Twitterでぼやきながら書いていたところアドバイスをいただきました。以前VimEmacs の間の子ということで一瞬だけ使ってどういう理由があってか結局Vimに戻ってしまった 経緯を思い出しながら再度インストールし直し。Clojureを書くようになってからinit.el を読むとそのコードの意味が何となく理解できるようになった。結局ClojureGUI作成は ほぼ断念しているけれど、「読める」ようになっただけでもでかい収穫だなぁと。

Spacemacsの第一印象は「随分リッチな見た目だなぁ」。Vimと双璧をなす古くから存在す るエディタとは思えないくらい今風の見た目にチューニングされていた。ただ起動直後に インストールしている拡張機能の更新を毎回探しに行くようで、起動直後からすぐにコー ディングできないのはマイナス。個人的にはエディタは不要になったらすぐ閉じるタイプ の人なのでこのローディングは結構重い。AtomといいVSCodeといい、最近のエディタは開 きっぱなしが前提なのかな。

使い勝手としては、確かにVimの操作がほぼできる。:tabeでタブを開けないのが気になっ たけれど、C-w + lとかで画面分割も普通にできるし、ファイル移動もお手の物。コマン ド名の補間機能まであるし、内部ターミナルまで実装されているとやりたい放題でVimと は本当に違うなぁと。(といってもこれはSpacemacsというよりEmacs自体の機能だったか な)ただVimもdein.vimを入れてかなりいじくり回しているので、ほぼほぼ自分のVimEmacsの違いはなくなってきてるが。

Webの記事を参考に操作を試すも、SPCをAlt+Mと読み替えないといけなかったり、ところ どころVimキーバインドで設定が上書きされていて使えなかったりと、やはり弊害も多 い。メインエディタを乗り換えるには高い壁があるなぁ、と。Vimを勉強し始めた頃は Youtubeで使っている人の動画を眺めたりとかしていたが、SpacemacsもYoutubeで使って みた動画を視聴して「どれくらい強力なのか」を目で見てみないと、すぐにVimに戻って しまいそうだ。というか、もう戻ってしまった。

流石に3年ほど慣れ親しんできたエディタから簡単に乗り換えるのは叶わず。だけれど、 実のところSpacemacsはめちゃくちゃ興味がある。VimのVimScriptのような酷い言語と違 ってこちらは非常に統一感があって柔軟性がある。Vimは非同期処理が苦手(できないわけ ではないが)ということで、どうしてもUI的に無理がある部分もあるが、Emacsは割となん でもできるらしい。どれだけ強力なのか、設定の仕方はどうすれば良いのかなどを理解し てどこかのタイミングで乗り換えてしまいたい。

Clojureのコミュニティ

Clojureのことをぼやきながらコードを書いていたら全く今まで関係のなかった方から度 々アドバイスを頂いた。日本でClojureがどれだけ流行っているのか知らないけれど、意 外と使っている人がいるのだろうか...。Kotlin + JavaFXの件をぼやきながらコードを書 いているときだと全然そういうこともなかった。単純に自分がClojureにハマって愚痴を こぼしている頻度が高かっただけかな。

Kotlin + JavaFX

以前から作成を続けていたTKFMのKotlin移植。今日はツクールのバージョンの違いをリソ ースファイルに吐き出していたものを読み込んでUIに反映するところを実装した。思いつ きで出力パネルをタブ化して、タブの切り替えで出力を変更できるようにした。突然の実 装の変更だったので、影響範囲がでかくて色々苦労した。当初予定していなかったstatic 変数の参照を辞める必要が出たので、コンストラクタに渡したりする必要が出ても~大変 。とはいえなんとか変更はできて、マウスクリックで反映された。

基本的な動作はほぼほぼ実装が終わったので、あとはショートカット周りの操作系と、画 像出力系くらいかなぁ。あとウィンドウの位置とか画面幅の設定とかその辺をConfigファ イルに吐き出す処理も必要になる。あと前から考えていた画像自動生成機能を実装したい ので、どこかのタイミングでタブを追加してしまわないと。タブごとに全く異なる機能な ので、変更してもそこまで影響はないと考えているけれど、レイアウトとか変わっている 部分でもあるので、早めにタブだけ追加しないと。

Chocolatey + Vim

ヘルプ開いたらKaoriyaVimじゃないんでドキュメントが普通に英語だった...。そりゃそ うか。

-- 次郎 (Jiro) Github : https://github.com/jiro4989 Blog : 次ログ - http://jiroron666.hatenablog.com/ Twitter : https://twitter.com/jiro_saburomaru/

Windows環境でgoreleaserを使用してGitHubにデプロイしてみた

前書き

どうもです。

以前Ubuntu環境でgoreleaserを使用してGitHubにデプロイする作業について記事を作成しましたが、今回はそれのWindows環境版です。

前の記事については下記を参照してください。 http://usernameon666.hatenablog.com/entry/2017/10/08/125842

やってることはほとんど同じですが、デプロイのスクリプトbashでやってるかPowerShellでやってるかという違いだけですね。

開発環境

項目
OS Windows 10 Home
Go version 1.9.2
使用スクリプト PowerShell

成果物

game-manager
ゲームのプレイ時間を記録してCSVファイルとして保存するTUIアプリ

わざわざ作るほどのものでもないのですが、まぁ勉強用ということで...
同様のゲームのプレイ時間が把握できるもので僕が使用したことがあるのは SteamやMoeL2などがあったのですが、あれと同じようなもので ターミナル上で動作するものを作成してみたかったんです。

「みんなのGo言語」に登場したtermbox-goとHOME配下のconfigフォルダにデータを格納する手順を勉強するために作成しました。

f:id:jiroron666:20171224212918p:plain

リリース手順

GitHubリポジトリの作成

今回は下記の通り game-manager というリポジトリを作成しました。 https://github.com/jiro4989/game-manager

GoReleaserの設定ファイルの作成

.goreleaserという設定ファイルを$env:GOPATH/src/game-manager配下に作成します。

PS C:\Users\username\go\src\game-manager> pwd

Path
----
C:\Users\username\go\src\game-manager


PS C:\Users\username\go\src\game-manager> ls


    ディレクトリ: C:\Users\username\go\src\game-manager


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       2017/12/24     20:05                data
d-----       2017/12/24     20:55                dist
d-----       2017/12/24     19:59                game
d-----       2017/12/24     20:51                res
d-----       2017/12/24     20:54                script
-a----       2017/12/24     20:48             19 .gitignore
-a----       2017/12/24     20:22            322 .goreleaser.yml
-a----       2017/12/24     20:04           5082 game-manager.go
-a----       2017/12/23      5:53            622 README.md

.goreleaserに設定を記入

.goreleaser.ymlの中身を下記の通りにする。

builds:
  - binary: game-manager
    goos:
      - windows
      - darwin
      - linux
    goarch:
      - amd64
      - 386
archive:
  format: tar.gz
  replacements:
    amd64: 64-bit
    darwin: mac
    linux: linux
  name_template: "{{ .ProjectName }}_{{ .Os }}_{{ .Arch }}"
  files:
    - README.md

デプロイスクリプトを作成

$env:GOPATH\src\game-manager\scriptに下記の内容のデプロイ用のPowerShellスクリプト"deploy.ps1"を作成します。

※別にスクリプトを作成しないといけないわけではないです。

git tag $args[0]
$env:GITHUB_TOKEN = cat ".\res\token.txt"
goreleaser --rm-dist
go install

GitHubのアクセストークンを配置

$env:GOPATH\src\game-manager\res\token.txtというテキストファイルを作成して、GitHubのアクセストークンを貼り付けます。 あんまりこういう運用方法って良くないと思いますけれど、まぁ個人で行う分には気にしないことにしています。

.gitignoreを作成する

デプロイするバイナリとtoken.txtがリポジトリ上に見えてしまうとまずいので それらを除外するように設定します。

.gitignoreの中身は下記のとおりです。 配置するパスは$env:GOPATH\src\game-managerです。

token.txt
/dist/

スクリプトを実行する

下記のパスがカレントディレクトリであることを確認します。

PS C:\Users\username\go\src\game-manager> pwd

Path
----
C:\Users\username\go\src\game-manager

下記のコマンドを実行します。
.\script\deploy.ps1 v1.0.0
※v1.0.0はタグ情報になるので、アップデートするたびに番号を更新する必要があります。

あとはひたすら待機...

PowerShell環境だと、制御コードがむき出しで表示されてパッと見バグったか失敗したように見えることがありますが、正常に動いているので、信じて待ちます。

リリースの確認

GitHubのリリースページを確認しにいきます。 https://github.com/jiro4989/game-manager/releases

Goの正規表現を少し使う

前書き

Go言語の正規表現はあまり早くないらしいので、 なるべくstringsパッケージの関数を使って文字列を扱うほうが パフォーマンスが良いという話をよく聞きます。

とはいえ、正規表現をどうしても使いたくなるときはありますし、 そこまで速度が重要でないときや、使用頻度が低いときは パパッと使って問題解決したほうが良いと考えているので regexpでよく使いそうなものを調べてテストしました。

そもそも速度が求められない状況ならPythonとかLLでよくない? とか言われそうですが...

よく使いそう、の判断基準は、 僕が普段Pythonでテキストを処理するときに よく使ったもの、というだけで、完全に主観です。

目次

コード

以下はPythonとGoの正規表現のコードです。 使用したものは下記の5つの機能です。

  1. 正規表現にマッチするかどうかの判定
  2. 正規表現にマッチしたものをすべて取得する
  3. 正規表現にマッチしたものの数を取得する
  4. 正規表現にマッチしたものを置換する
  5. 後方参照で置換を行う

所感

基本的には一緒でしたが、後方参照の部分での指定で結果が変わったのが気がかりです。
全角空白を含む、名前の間の空白文字をGo言語では\sで認識できない? まだ詳細を調べてはいませんが、気をつけないといけなさそうです。

漫画を読むためのHTMLを生成するツール

どうもです。

最近自宅でも会社でもコードを書かない状態が続いていたので、 簡単なツールを作成しました。

内容は漫画を読むためのHTMLを生成するツールです。
Releaseページに実行ファイルと必要なファイルを配置しています。
GitHub - jiro4989/genidx: 漫画を読むためのHTMLを生成するツール

探さなくても誰かがきっとやっているような内容ですが、リハビリということで...

目次

見た目

見た目は以下のような感じです。 f:id:jiroron666:20171112160436p:plain

※漫画は「うぶんちゅ!」という 瀬尾浩史 さんの漫画です。
http://www.aerialline.com/comics/ubunchu/

使い方

漫画の存在するディレクトリにgenidex.exeとtemplate.htmlを配置してgenidx.exeを実行 するだけです。

技術要素

Go言語では、html/templateパッケージを利用して、 カレントディレクトリ配下の漫画を読めるリンクをHTMLの中に埋め込むだけです。 そんなに難しいことはしてません。

JSは生のJSをガリガリと。 画像の切り替えやショートカットキーの追加程度ですが。

CSSは簡単なアニメーションと、target要素を利用した縦タブを実装。 ちょろっとだけ影も装飾して、すこしだけ雰囲気づけもしています。

所感

HTMLテンプレートにGo言語で値を埋め込む方法の勉強になりました。

ただ、やっぱり書いていて思うことは、 書き捨てるようなコードでパパっとかくならPythonのほうが絶対いいなぁと感じました。

LL言語なみに短いコードになる、という話を聞いていましたが、個人的にはPythonのほう がはるかに楽だと感じました。

やはり適材適所と言いますが、実装を早くするか、実行速度を早くするかで、 使い分けないといけなさそうですね。