Drafts

@cm3 の草稿置場 / 少々Wikiっぽく使っているので中身は適宜追記修正されます。

Atom の Markdown preview の色とかが気に食わないとき

Ctrl + , で表示される Settings > Themes > Your stylesheet へのリンク > css 編集

h2 と h3 の見分けがつかないなどなどデフォルトのは使いにくすぎる

とりあえずAtomエディタのMarkdown PreviewのCSSを実務書類的に調整する | 大石制作ブログを導入しておく

pre ブロックの中の文字色と背景色が一緒で文字が見えない

.markdown-preview:not([data-use-github-style]) atom-text-editor{
    color:black;
}

を追加した。

And more

Ctrl + Alt + iデバッグパネルが開くのでそれを見ながら任意の場所の css を上書き。

概念分析の社会学 ─ 社会的経験と人間の科学

1章30分でまず流し読む(そういう粗いことすると警察が来るかもね)

なお、章名は元の章名じゃないっす。俺が覚えやすいように書いてるだけ。

前書きなど

専門的概念も常識的概念と接続しないと我々は認知できない。そこの齟齬が現実と概念の間の相互作用を生み出す(ループ効果)

1章 人種

所謂リジッドな人種の科学的な裏付けは失敗しているが、遺伝座の遺伝子頻度相関は地理的にもクラスターが存在するので、連続性をもった新しい「人種」概念を持ち込んでルロワは人種があるという。それが理解できない(と僕は感じたので中指たてて読んでた)グッドマンがクソリプ返してるんだけど、まあ確かにこういう理論は悪用されやすいという問題意識は分かる。

種の概念については自然を名づける―なぜ生物分類では直感と科学が衝突するのかが超面白いよ、問題意識も本書と似てるし。

あと、「集団の生物学的特性を確率という形で個人に帰属することによっても人種主義は成立しうるからである(Gannett 2001)」ってのはそりゃそうなんだけど、信頼(もしくは信頼/安心)の議論と接続しないと、それが不適切であり得るだけでしょってことで、そういう不適切な概念活用が行われる過程の研究(冒頭 p.11 の「もう一つ」)に吸収されるだけな気がする。

2章 遺伝知識と疾患

出生前診断ルーマンのリスク/危険の区別で、技術によって後者が前者に移行した好例だね。

細かく具体的な記述はわかりやすく読みやすかった。

偶発性をどう捉えるかってところに大きな論点があって、そこに対して当事者同士の繋がりを持ち出すのははぐらかされた感もある(ロールズ的な正義論を期待していた)が、むしろそれが、どんな正義のもとでも疎外される人たちをどう救うかという点において示唆を得られてよかった。

ナビゲーション2

こういうのイイね(本の構成というメタな点で)。前にシンポジウムでも企画者が各講演のつながりについてナビしなきゃいけないって書いたけど、こういう多様な話をまとめて見せる場合も同じだな。

Electron アプリ開発メモ

Electron で ディレクトリ監視ツールを作ってる。その際に躓いた基本的なことをメモしておく。

Electron でアプリを作る基本

30分で出来る、JavaScript (Electron) でデスクトップアプリを作って配布するまで - Qiita

こちらをどうぞ。このひな形をどんどん書き換えていきました。

html / css / js は普通に書き換えられる

こういうウェブの技術で構築できるのが electron のいいところですし。

プロセス間通信

js を書いていると、main.js と html 側の js でやりとりしたいことが出てくるはず。ローカルでの計算結果を表示したりね。そういう時に、Electronでipcを使ってプロセス間通信を行う - Qiitaが参考になると思いきやこれはもう使えなくなっていて、

の2つを使う。前者は ipc と同じくプロセス間通信で、後者は main プロセスから html 側のイベントを取得したり、js を実行したりにも使える。

例:

main.js

mainWindow.webContents.on('did-finish-load',function(){
   mainWindow.setTitle("sample");
   mainWindow.webContents.send('message', 'Hello World!');
});

view.js(html側)

  const ipcRenderer = require('electron').ipcRenderer;
  ipcRenderer.on('message', function(event, message){
      var date_obj = new Date();
      var li = document.createElement("li");
      var span1 = document.createElement("span");
      span1.appendChild(document.createTextNode(zfill(date_obj.getHours(),2) + ":" + zfill(date_obj.getMinutes(),2)));
      var span2 = document.createElement("span");
      span2.appendChild(document.createTextNode(message));
      li.appendChild(span1);
      li.appendChild(span2);
      document.getElementById("message").appendChild(li);
  })

今回はシンプルなものを作っているので、jquery も react もなんも使ってない。生 javascript

BrowserWindow のタイトルを動的に書き換える

既に上の例に示しているが、'did-finish-load' イベントを受け取ってからタイトルを書き換えないと、非同期の問題で html に書き込まれた title タグを上書きできない。

参考:

BrowserWindow のメニューを入れ替える

Menu APIを参考に書く。こちらは右クリックメニューを作るサンプルがドキュメントに書かれているが、最後の Menu.setApplicationMenu(menu); を BrowserWindow インスタンスの mainWindow に対して、 mainWindow.setMenu(menu); と書き換えるだけで、上のメニューバーの入れ替えが実現できる。

例:

const Menu = require('menu');

var template = [
    {
        label: 'Test',
        submenu: [
            {
                label: 'console',
                accelerator: 'CmdOrCtrl+M',
                click: function(item, focusedWindow) {console.log("selected.");}
            }
        ]
    }
]

//mainWindow の定義はすでにコードに書かれている想定
//mainWindow = new BrowserWindow({width: 800, height: 400});
var menu = Menu.buildFromTemplate(template);
mainWindow.setMenu(menu);

参考:

引数のパージング

process.argv で引数を受け取れる。Python の sys.argv みたいなもん。でも注意しなければいけないのは、electron コマンドで起動してるときは、

electron [main.jsのあるディレクトリ] [引数]

となっているので、2以降を使うのだが、コンパイルして exe とかにすると、

hogehoge.exe [引数]

となるので、インデックスがズレるのだ。ちゃんと、commandernomnomあたりを使って、引数のパージングは実装したほうがいい。

参考:

配布

Windows 用にコンパイルするとこんなシンプルなプログラムでも 100MB を超えてしまう。それなら node.js や electron をインストールさせるインストーラを作って、メインはバッチファイルで作ってBat To Exe Converterみたいなので体裁整えた方が良い気がするかもしれないが、上記に書いたように、electron や nodejs がまだ進化中なので、その方法では electron のバージョン違いなどですぐ使えなくなる。諦めてコンパイルしよう。

GitHub 上でバイナリのリリースは Release Your Software を参考に。

Mac 用のコンパイルでエラー

Windowsmac 用のバイナリを作るときに Cannot create symlinks; skipping darwin platform というエラーが出るが、これはコマンドを管理者権限で実行する必要があるらしいです。

参考:

electron モジュールに組み込まれているモジュールの利用

Qiita に投稿したのでそちらを見てください→electron v0.35.0 以降は、electron モジュールを使いましょう -Qiita。要は

  • × const app = require('app');
  • const app = require('electron').app;

ってことです。

その他参考:

何を作ってるのか

Current Jazz の Danny Green の音がFFっぽいなぁと思って、そういやFFの決戦ってシマノフスキ交響曲にヒントを得ていると聞いたことあると思って、以下の3つをヘビロテしている

Szymanowski: Sonata No.2 Mov.2(Fuga)


Karol Szymanowski ‒ Piano Sonata No.2, Op.21

Danny Green: Thirty Springrolls Please


After The Calm - EPK

浜渦正志: FINAL FANTASY X 決戦


FINAL FANTASY X 決戦

「なぜ僕はジェンダーを語る人と衝突しがちなのか」第 k 回、「ブルードルフィンのヘルメット」です。


Twitterパパ、スーパー戦隊は仕事なの?「スーパー戦隊と公共性」(工藤啓) - 個人 - Yahoo!ニュース というリンクが張られていて、流し読みながら、別にこれとは全く関係が無いのですが、スーパー戦隊って男に強さ、女に優しさを性格付けする描写が多かったので、今なら問題にされやすいだろうなぁと考えてました。そもそも女性が主役にならないのは仮面ライダーも同じで、仮面ライダーの主人公って男ばっかりですけど、女主人公とかつくらな... - Yahoo!知恵袋みたいな回答にあるように基本的に「子供向けキャラクタービジネスの世界では、『男女の住み分け』は思っている以上に重要」なんですが、そういう文脈を無視するのがジェンダー界隈なので*1

子供っていわゆる第一次反抗期くらいから男女別々に遊ぶことが多くなって、同性で同じコンテンツを見ていることも重要になってくるのかと思います。僕はそのころ、男女の遊びグループが分かれる中でどちらにもちょこちょこ顔を出すけれど一人遊びが多くなるという経緯を辿って、幼稚園では完全に浮きました。園を脱走して電車を見に行ったり、一人で氷の張ったプールを歩こうとしてあわや溺れそうになったり、親は監督不行き届きな幼稚園の先生に不満を持ってましたが、僕がみんなから逃げている以上しょうがなかったと思います。基本的に女の子と遊べないし、ガサツな男の子が嫌いだったのですが、ある日男の子と女の子が楽しそうに騒いでいるのを見て「おお、珍しい、何をしているのかな」と思ったらスカートめくりから鬼ごっこに発展していたようで、「なるほど、そういうものなのか!」と早合点し、途中で加わったところ、スカートをめくって先生にチクられ怒られて「なんという理不尽!」と思いました。その理不尽さを共有する人がおらず、仕方なく自分の持ち物を入れる棚の前に行き、青いカゴのなかの自分の持ち物―自分の持ち物だけは自分の味方だという安心感があったのです―を順次眺めながら心を落ち着かせていたことも鮮明に覚えています。暗いですねー、キモいですねー、残念な子ですねー。でも未だにその「彼」にどうやったらよかったかという解決策を提供できずにいます。

前後しますが、僕は年中から通園したので、入園前の4歳の時にやっていた戦隊ものといえば超獣戦隊ライブマンだった。当時、そのあるキャラクターのヘルメットをかぶってなりきって自転車漕いでました。母曰く「あれは見ていて恥ずかしかった」とのことですが、なりきっていたキャラクターは「優しさ」を性格付けされている女性のキャラクターだったのです。べつにそこになんの違和感も感じなかった。好きなキャラクターだったから。それだけ。前述の文脈に翻訳し直せば、強さ、優しさ、などのキャラクター付けだけでキャラを見ていて、男だろうが女だろうが些末事だったのです。


超獣合体ライブロボ

周りにはたまに話してますが、2歳~3歳にかけて塗り絵も女の子用ばかりやっていて、でも、自分が女の子だという自意識ではなかった。電車やメカが大好きで、そこはとっても「男の子」なのです。性的にもヘテロで、それを明確に自覚していました。

ジェンダーを語る人々は、男と女の区別をかなり自明のものとしてなおかつすごく重大なこととして出発して、その出発点が色々縛られているもんだから、その原因を社会環境とかに求めているように見えます。何を語ってもその出発点は強固だし、むしろそれを強化するようなことしか言わないので、3歳までの平和な世界を壊す、悪いやつらなのです(冗談です)。もちろん、そりゃその区別が現実問題必要で、なおかついろんな災厄をもたらしてますよ。でもその解決策を考えるのに、なんで区別を強化して距離を離す方向に行くんですかね。


大学入ってすぐに、これを理解してくれる人々が寮にいたのでとても心地よかった。そして、その10年後にも某サークルの後輩たちが、ソウルメイトという概念を駆使して―まあ他のメカニズムも働いているのですが―、仲が良いけれどいわゆる「男女関係」ではない関係を構築してるのをみて、「あぁ、類友なんだな、テニサーではありえないもんな」と思って見ていました。

昨日のデートも、まったく心地よく、ずっと話していたくて、四条河原町から京都駅まで喋ったまま歩いてしまいました。

ちなみに、これは性的な事柄を避けているのではないです。僕は別に性的に欲望されることも全く厭わないですけれど、性的に「だけ」欲望されるのはとても悲しい。2つの指標があった時に(1,0)から(0,1)の一次元直線しか見えない人が多いのですけど、ふつーに(0,0)も(1,1)もある2次元でとらえてほしい。なんでわざわざ一次元にするのかわからない。かわいさの称揚の否定も同様、かわいさの称揚を否定する必要なんてどこにもない。いや、本当はわかってるけどね、反比例するという間主観感覚があるからでしょ。なんでそこを固定して考えるのか不思議です。

この性的にだけ欲望する人と通底するのですが、実は世の中の人間のそれなりの割合が僕の目から根本的に違う、人間の皮をかぶった地球外生命体かなにかのように見えています。その違いの方が男女の違いよりもずっとずっと僕にとっては恐ろしい。これは学歴や政治的思想とも関係が無い。血液型なのかなとか、ADHD特徴なのかなとか、いろいろ考えているけれど、よくわかりません。ふとした仕草とかを見て「同じ人間なんだなぁ」という謎の発言をしてしまったりします。

別にそんな異人でも尊敬したりは全然できるのですが。


冒頭の題にもどると、衝突のメカニズムとしてはトランスの人とかクィアの人が、ジェンダー論の主流(なんてものがあるのか微妙だけれど)と衝突するのと似ていたりするのかな。まあ、あの頑迷さが腹立つという Yet Another 頑迷さなんですけど。


*1:これ、後半の男女の住み分け自明云々とぶつかる気がしますが、ここでは要は子供社会とか経済的側面とか無視して、表層的な token (cf.token-black) だけ語るって意味です

  • 実利的な2つに加えて、リベラル的な人権問題が国境に関するトリレンマを形成している問題は、先日の資料を手に入れてから書く
  • 小学校教育的なる手枷足枷に対する怒りについて書く(補助線として「聾桟敷」や「躊躇い」や「鹹さ」について書いてもいいし)
  • システム側が勝手に押し付けた構造の中で勝手に強者/加害者にされた者がその加害性を根拠に手枷足枷を嵌められる暴力について書く
  • トリレンマじゃなくてクワドレンマにしろよ(次元を増やした方が解ける問題は合意形成理論でもアナロジカルにカーネルトリックでも紹介したら楽しい(俺が))
  • その上で「弱者救済」(救う側/救われる側を固定しがちなこの言葉嫌いだけど)の方法論を(齟齬を埋める社会システム的、技術的な工夫が必要という話)Empowerment!!(自己責任論放つには自分でなんとかできるだけの資源を与えることが前提だろ!的なのが補助線になるか)
  • (某ブログエントリに触発されていはいるが、それへの反論ではない(むしろベースを同一とする)ので、誤解されないように書き方に気を付ける)
  • 河合モデルで全体像を書いた方がいいのかな、徹底的な不可知主義・禅、社会システム理論・惑星社会、社会思想の否定という社会思想(多文化主義に近いけれど、その多角形の認識の枠を外して円相にしろというのだから、結局主義として成立しえない。でも、(社会思想を否定したら残る現実の人間社会(含、自然環境)そのものの弛みない捉え直し(cf.徹底的な不可知主義)だけが根拠になるので)人間社会の歴史的観察からゆるやかな変化を要請するので実態としては中道左派に属し、社会改良主義っぽくなる)、革新された議会主義…でもここらへんはすっげー未熟だから書かないほうがいい鴨。すべてをまず肯定せよ、すべてを否定せよ、再びすべてを肯定せよ、共存共栄を、くらいで十二分な気もする。
  • (あんまり理論理論したのはキモいしチラ裏なので、具体的事例を中心にする)

Markdown container format - Draftsを便利に活用するために、エディターとCMS、それらを支えるライブラリを書こうと思った。

エディター

必要な機能

  • 新規作成
  • container.xml を読み取って適切な markdown を編集状態にする
  • 関連する画像ファイルなどを一緒にzipするわけなので、zip の中身を全体的に編集できる必要がある。
  • 保存

実装

archive-view zip の中身を見れる。一時ファイルを展開して開くようになっているが、これを zip でまとめ直す機能をzip-folderzip-folder/zip-folder.coffee at master · JakeDixon/zip-folderを参考に付ける。これは、Save to archive file · Issue #29 · atom/archive-view · GitHubで要望が出ている。

  • OSの新規作成メニューでのテンプレート mdc の作成→atomでのテンプレートファイルの提供の仕方を調査
  • 各OSでファイルの関連付けで、メインのmarkdownが開けるようにするようなインストーラを作成。

その他参考:

zip の中にある markdown を開く

各OSでファイルの関連付けで、メインのmarkdownが開けるようにするようなインストーラを作成。しても、その中の markdown を直接編集させられないので、そちらがわに一時フォルダに展開したりする機能が必要。そうすると、今の atom archive-view の機能と重複する。それならば、インストーラ

  • (archive-view をインストールしたうえで)単に atom に関連付ける
  • 編集を監視し、zip を再生成するような zip エディタに関連付ける

のどちらかをすればよい。そこについでに、メインの .md を開く機能が加わる形だ。atom に縛られたくないので後者の実装をしたい。

Best Free File Archiver-Zip Utility | Gizmo's Freeware をいろいろ探してみたけれど、既存のアーカイバにそういう機能は見当たらなかった。7-zip が近くて、notepad で編集したときには変更後にアーカイブをアップデートするか聞かれたが、他のエディタだとだめ。ファイルロックの関係かもしれない。

  • 一時フォルダのブラウジングはOSのexplorerに任す → ここは atom の tree view でもいい。
  • unzip や zip も7-zipなどコマンドラインから命令できるプログラムに任す
  • このプログラムのやるべきことは、開いているフォルダを監視して、変更があれば元の zip を上書き & ファイルを開いたときに各コマンドを呼び出す。

試しにまず、electron で、

  • 引数をとってそれを画面に表示
  • メニューに「Open directory」を用意し、それをクリックすると、引数のフォルダをエクスプローラで開く

プログラムを作成する。directory monitor and commander。次は

  • chokidar を使って監視して変更を画面に表示する

機能。同じファイルを開かないように、同じファイルを開こうとしたらもとのを activate して、そこにメッセージを表示するとか、いくらでもやるべき実装があるが、例えばこれは unzip や zip を担当する wrapper 側の仕事だし、そこらへんの切り分けは大事。

参考:

あったらいいな機能

  • HTML や PDF、epub を出力する。参考: atom-markdown-katex
  • 自動で画像を fetch してきて含めることもできるけれど、外部リンクのままにとどめときたい場合もあるから、あまり要らない。
  • 対象の md を右クリックして Compile into .mdc。container.xml 生成。さらに含めるファイルを選択して mdc 生成。
  • Open Packaging Format (OPF) (参考:日本語で読みたいなら オープン・パッケージング・フォーマット(OPF) 2.0 v1.0 がある)の語彙などでメタデータを container.xml に記述できる。EPUB 3.1metadataで検索して確認。この情報を簡単に書けるようにしておくことはCMSでのタグ機能などの実装に役立つ。
  • mdc を右クリックして Edit main markdown file メニュー
  • ビューワーだけのプラグインも作ってもいい。そちらはarchive-viewに読み取り機能だけをつけて、デフォで markdown のプレビュー機能のみを表示。→ビューだけ欲しければ epub or pdf エクスポートすべき

テキスト的な差分管理との親和性

バイナリであることは git とかで差分管理できないという問題がある。その解決のために Open Container Format の非圧縮版の仕様もサポートしておいた方がいい。

Base64 でやるかんたんMarkdownならこの問題は無い。その代わり、Pandoc とかとの連携が悪くなるので、PDFにする部分はVivliostyleをか使う必要がある。むしろ元の markdown の保存形式が HTML や JS と密結合していることに少々難があることが分かった。base64 を markdown で使うなら Can I embed png's in Markdown? — The Insignificant Pebble に紹介されているような記法がいいと思うけれども、ここにもファイルサイズの問題があって、 mdc はやっぱり必要だなと思われた。

名前

プログラム名は markdown container editor environment から marcee (マーシー)にした。名前に atom 入れないのはそこは入れ替え可能だと思っているから。

deprecated idea

Atomプラグインとしてすべての機能を完結させるつもりでいたので、coffee で mdc を読み書きするライブラリを作り、その活用例として Atomプラグインを位置づけるつもりでいた。Atomプラグイン作成入門 ハンズオン形式でプレビュー型プラグインを作ってみよう! - Qiitaに書いてあるようにひな形が自動生成されるのだが、それが coffee で書かれている。CoffeeScript はただの javascript も受け付けるようだ。

Markdown container format - Draftsを広めるために、各プログラミング言語でのライブラリを作ろうと思い、その1つ目として coffee を選ぼうとしたということだ。でも、上記のように Atom は呼び出される側で、OS依存な部分で mdc の読み書きを実装する必要があるので、30分で出来る、JavaScript (Electron) でデスクトップアプリを作って配布するまで - Qiita を参考に nodejs で書こうと思う。また、Atom 側でやるべきこととの設計のしなおしが生じても同じ javascript 系だったら書き直しやすいし、また利用者にも余計なインストールを強いずに済むと期待できる。

慣れている Pythoncx_Freezeコンパイルしてもよいが、あまりそのメリットがない。

Atom の代替