atom-shellでファイル無限吸い込み+sync機構を作る


概要

これで話す。

「Electron(旧:Atom-Shell)勉強会 #1」

http://atom-shell.connpass.com/event/13304/


基本的なところは誰かがやるでしょ的な感じで、ツールを一つ作った話。


FileMachineというのを作った

アプリにファイルを放り込んでいくと、リソースを丸っとバージョン管理してくれる代物。

GUIから使いたい、そして適当に管理してほしい、という欲求を叶える。


FileMachine

https://github.com/sassembla/FileMachine


当初goで書いてたんだけど、GUI部分でなんかノらなかったのでAtom-Shellで。


解決する内容

大規模マニュファクチュア~で画像とか3dモデルとかのリソースの置き方にする苦労を消し去りたい。


・デザイナさんサーバにガンガンリソース置きよる

・更新するたび名前変える? ん?? そういう病気??

・日付フォルダ、、ところであれの最新どこ? ああ、一ヶ月前の、、名前、、、違ったんだね、、

・「サーバの容量が逼迫されてきました」あのっあのっ21世紀

下らん。

下らなすぎるぞ。

ヒューマンがしてはならない無駄な努力だ。



挙動

フォルダごとリソースを放り込みまくってバージョン管理できるアプリケーション。


・フォルダを放りこむとどこかに保存

・過去のファイルとMD5とか違ったら新しいrevisionを作り出して保存

・MD5の差がなかったら代わりにproxyfileを置く

・ショートカット(super+oとか)で取り出す

・取り出す際は、最新ファイル全部、とか、revisionを指定して取り出すことができる

・外部からのアクセスエイリアス、外部へのアクセス経路を持つ(外部からの特殊なrsyncとか。Web万歳)

・ファイルIOを直に吐き出して、こんな書き方でファイルの入出力ができてそのまま保存とかできるようにしたい


filemachine -f some.txt | open -a なんかApp.app


ようは完全自動採番でコミットメッセージとか無し、差分比較をbin想定に限定したgitみたいなもの。

分散具合については考え中だけど、分散が実現しないでもいいことができそうなので開発してる。


分散同期に関してはWebRTCが使えると大変ファンキーなのでは? って一瞬思ったけどいろいろやることあってダメだわ。

atom-shellなら通信手段もサーバ能力もあるし行けると思う。



現状

途中までかいてるとこ。


・とりあえず保存と取り出しまでできればそれでいいかなって

実演


1.放り込んだら保存

ファイルは /Users/runnershigh/Library/Caches/FileMachine に自動複製される。


2.super+oで最新をすべて吐き出し

吐き出し場所としてDesktop指定。


3.取り出さずに何が入ってるか? super+iでフォルダ開く。

/Users/runnershigh/Library/Caches/FileMachine とかに入ってる。

んっとんっと、、open in finder どうすれば



why atom-shell

ブラウザっていうviewにもともと依存した環境。

GUI付きのツールが作りやすいと思った。


今回の場合は、もともとgoで作ろうと思ってたんだけど、GUIがダルかったのでatom-shellにした。

FileAPIとかあるししかも通信クライアントそのものだったりもするので、今後通信でファイルをなんとかするのも夢がある。(しかもServer/Client両用

GUIいらないなら別に選ぶ必要無いのでは????

GUIいるならatom-shellでいいのでは?????



使って本当によかったと思うところ

app.getPath まわりの仕様は本当にいいなと思った。

プラットフォームごとのよく使うpathを決めてあるのすごく良い。


マルチプラットフォームでの地獄がよくわかってる人たちが作ってるような気がする

https://github.com/atom/electron/blob/master/docs/api/app.md



FileMachineの未来

・デザイナさんが使えるようなGUI(いれポンだしポン)

・ちゃんとしたコマンドラインな(まだよくわかってない)

・どっかにファイル母体をシンクロさせるようにして、サービス化

・過去のファイルをシュリンクする機構(このままだと無圧縮かつ無限なので差分死する

・マネタイズ

絶対やったほうがいい。クリエイターは自身のクリエイトのためには金を払う。

その金で駆動する。

黄金の回転を目指す。


これの場合はUnityのAssetStoreかな。



TODO

・別名フォルダ入れるとそれ以降そっちを追う楽しいバグ

キャピ(・ω<) 

・削除してしまったファイル/フォルダを追う機能

latest:最新のみ

all:消したものも含めて全て


・ウィンドウからドラッグで取り出したいが??!!?!?!?!

ジッサイできるんかな。


・ファイル単体で放り込みたいぞ?

一発で場所がわかる名前ならそいつに対するチェックのみ行って受け入れ。

もし複数候補が出れば「どれ上書きすんの?」っていう画面出す。

ァッこれきっと作らない。


・フォルダを放り込むの楽しいデザインである必要がある、、、というかリアクションがない

・どのフォルダを放り込むか明示しないとな!

GUIデザインの問題。


・ファイルの名前変更のトラックを視覚化

タイムスリップ的にファイルの変化を追うGUIモードをつくればいいんだと思う。ピアノの鍵盤みたいにするか。

Unknown.jpeg

どちらかというと時系列で同じ名前で別のファイル置くのを楽に扱えて人類が受けるペナルティだけ無くしたい。


・いまんとこ全部syncで書いてる

なんか、、nodeだったら教義的にはasyncで書くのがいいような気がするが、、、すまないな。


・Win、、、、パス、、、ウッ頭が、、、

はたしてWindowsでちゃんと動くのか!!?? どうなってもしらんゾーーーーッ!!

atom-shellのことは信じてるが自分の書いたコードがマルチプラットフォームセーフかどうかは試してないから知らん。

どうぞ。

・アイコン

なんかそのうち。

この辺。

https://github.com/atom/electron/blob/master/docs/api/native-image.md


・remoteとのシンクロ

remoteとのシンクロとかそのへんをホラ。

セットした状態で配ればいいんじゃないかな。


以下メモ


scopeとか

どこまでこのclientでファイルを持つか、のscopeがあると便利そう。

now ~ 1month とか。

この制約はtime-windowなので、必要があればどんどんスライドしていく。

proxy fileが最古のものになったりするので、その際は基底(rev -1) とかをremoteから持ってくるといろいろ解決しそう。


ファイル単位のタイムライン

見たい。

perforceみたく表示したい。金になりそう。