inforno.net Open in urlscan Pro
185.199.111.153  Public Scan

URL: http://inforno.net/
Submission: On February 22 via api from GB — Scanned from GB

Form analysis 1 forms found in the DOM

GET https://google.com/search

<form action="https://google.com/search" method="get">
  <fieldset>
    <span class="add-on"><i class="icon-search"></i></span>
    <input class="search" type="text" name="q" placeholder="Search...">
    <input type="hidden" name="hq" value="inurl:http://inforno.net/">
  </fieldset>
</form>

Text Content

INFORNO


INFORMATION + INFERNO ... INFORNO




GOLDMARKがHUGOに採用された

Dec 25, 2019 golang goldmark

ちょっと前の話ですが、goldmarkが HugoのMarkdownレンダラーに採用されました。

(しかし、このブログはHogoではなく独自のプログラムで生成されているのであった…)

やっぱりblackfridayに対する不満というのはGo界隈ではそこそこあったんだなあ、というのと
単純にこう、自分の書いたコードが評価されるっていうのはうれしいし自信につながりますね。

柔軟な拡張性を担保しつつ、CommonMark仕様を実装するというのは実はかなり難易度が高くこれを
実現しているライブラリは多言語ふくめてもそれほどないので頑張ってよかったなあと。

本当はGoのAdventカレンダーで実装の詳細やパフォーマンスチューニングの話など書こうかなと
思ってたんですけどあっという間に埋まってしまい。Adventカレンダー最終日のポエムです。

--------------------------------------------------------------------------------

2019年も終わりが近づいてますが、まだ自分の書くコードは世界にある程度通用するなあ、という
自信も得られたので来年こそは転職活動に本腰を入れて、もう一度ソフトウェアエンジニアとして 勝負してみたいなあ、と思っております。仕事でGo書きたいほんとに。

話だけでも聞いてみたいなーというのはいろいろあるんですけど、そういうの、雇う側からすると 冷やかしちっくでやっぱり嫌なものなんですかね。
冷やかしでもいいよーとか、よい話があればGithubにあるメアドなりに連絡ください笑

メリークリスマス。 よいお年を。

--------------------------------------------------------------------------------


GO言語でCOMMONMARKパーサを実装した、またCOMMONMARKについて

Apr 27, 2019 golang commonmark markdown parser

GoでCommonMarkのパーサを実装しました。





分かりやすいASTに変換+拡張が容易、そこそこ速い実装になっています。

めちゃくちゃしんどかったです。


経緯

Go言語のMarkdownパーサといえばblackfridayですが、
拡張するための機構がないのでさくっと自前でMarkdownパーサを書くか、と思い立ちました。

そこで「そういえばCommonMarkなんてもんがあったな」と思い出しせっかくならCommonMark準拠にするかと
おもってCommonMarkの仕様を読み始めました。

え、なにこれは…

Markdownで出来ることなんてrestructuredTextなどほかのマークアップ言語に比べれば
わずかなものです。しかし、たかがそれだけを実装するために凄まじく複雑な仕様 が定義されているのでした。

以下、CommonMarkに寄せられた声です。

























しまいには、CommonMarkの中心人物自体が「えらいもん作ってしまった・・・」となっています。

 * Beyond Markdown

> There are 17 principles governing emphasis , for example, and these rules
> still leave cases undecided. The rules for list items and HTML blocks are also
> very complex. All of these rules lead to unexpected results sometimes, and
> they make writing a parser for CommonMark a complex affair. I despair, at
> times, of getting to a spec that is worth calling 1.0.

私も仕様を読んだ段階で「これはヤバい」と感じたのですがここで引くのも悔しかったので作り切りました。


COMMONMARKについて思うところ

正直なところ、これが世に広まるってどうなの、と思います。

そもそもなんでMarkdownが軽量マークアップ言語の中でこれだけ広く使われるようになったのかというと

 * 書き手としての書きやすさ
 * 実装者としての実装しやすさ

つまり、「書き手の適当さ」と「実装側の適当さ」がいい具合に噛み合ったからだと思っています。
書き手はそれなりに適当に書けるし、実装するにしても仕様が適当なので、適当に実装してもMarkdown 対応であると言うことができました。

それによってあらゆる言語、さまざまなタイプの実装が生まれそれが至るところで使われることになり Markdownは広まっていったのです。

それに対して、CommonMarkはあまりに実装するのがしんどすぎます。さらにはそれだけしんどい思いを
しても出来ること自体は少ないのです。テーブルさえ使えないのです。

その実装の難しさからCommonMark対応のパーサはいわゆるMarkdownパーサと比べるとわずかしかありません。
CommonMarkにかかわっている人の中には「それが何の問題ですか?」という人さえいます。
「CとJSで参照実装提供してるじゃん。ブラウザはC動かないからJSも用意してある。それ以外の言語は
C実装のバインディング作ればいいだけでしょ。実装なんて1個あればいいんだよ」なんて感じです。

CommonMarkはオリジナルのMarkdown作者から「Markdownの名前は使うな」と言われてCommonMarkという名前
になったという経緯があります。

Markdownを冠していないのであれば、perlの神正規表現で実装されたオリジナルのMarkdown.plの動きにでき
るだけ寄せようとするのではなく、もっと仕様をシンプルにする方向に動いて欲しかったです。


COMMONMARKパーサを実装したい人に向けて

とにかく、CommonMarkに準拠するのは難しい。ということでいるかいないかわからない、CommonMarkパーサを
これから書こうと言う人に気づきを共有しておきます。

 * いわゆるプログラミング言語やXML, JSONなどのパースとは全く別物です。そういうものはもともと
   「パースしやすいように」という視点で文法が作られてますが、CommonMarkはそんなことはありません。
   pegベースのパーサもあるので無理じゃないですがいわゆるLL,LRやLALRのような方法では厳しいです。
 * Markdownはいうなれば「行志向」なので業単位を基本としましょう。
 * 「lazy continuation」はかなり曲者です。
 * 仕様策定者自身が Beyond Markdown で述べている 部分は間違いなくしんどいです。特に強調は自分で考えるのは諦めましょう。素直に参照実装と同じ
   アルゴリズムで実装するより他にspec testを通すのは難しいです。
 * タブが本来のタブの意味でつかわれる点に注意。つまりタブ文字の位置によりタブは 1文字分、2文字分、3文字分、4文字分、いずれの文字幅にもなりえます。
 * とにかく折れない心が大事です。CommonMarkとMarkdownは別物です。覚悟してかかりましょう。

--------------------------------------------------------------------------------


BATの中にBASHスクリプトを埋め込む方法

Feb 15, 2017 bash bat

相変わらずメインのマシンはWindowsなのですが、batファイルのもろもろがいつまでも覚えられず、bashスクリプトで書きたいなあ、ということでbatファイルにbashスクリプトを埋め込むことにしました。
Cでつくった自作用ツールがあるため、Windowsにはかならずmsys2をいれているのでbashは絶対あるんですよね。

その他の言語を埋め込む方法は

 * Windowsでshebangもどき、またはバッチにスクリプトを埋め込む方法

が詳しいです。


シェルスクリプトをバッチファイルに埋め込む

以下のようにすると、バッチファイルにシェルスクリプト(bashスクリプト)を埋め込むことにできます。拡張子 .bat で保存すると cmd.exe
からもmsys2の bash.exe からも起動できます。

:rem () { <<'#__CO__'
@bash  "%~f0" %* & exit /b
#__CO__
}

echo 以下普通にシェルスクリプト

仕組みはバッチファイルのコメントやら、bashのヒアドキュメントやら、: コマンドやらをうまく利用して埋め込んでいます。

 * «Previous
 * 1
 * 2
 * 3
 * 4
 * 5
 *   ......  
 * 27
 * Next»


ABOUT THIS SITE

Author: yuin

文学部文化学科卒という生粋の文系趣味プログラマ。Golang, Python, C, C++などがメイン。


FIND ME ON

 * GitHub
 * Twitter


ARCHIVES

2019 (2) 2017 (1) 2016 (3) 2015 (5) 2014 (2) 2013 (5) 2012 (1) 2009 (5) 2008
(17) 2007 (21) 2006 (17)


RECENTLY ARTICLES

goldmarkがHugoに採用された Go言語でCommonMarkパーサを実装した、またCommonMarkについて
batの中にbashスクリプトを埋め込む方法 Go1.8のpluginパッケージでGopherLuaに共有ライブラリロードを実装してみた
Go+Luaのチャットボットフレームワークを作った

© Yusuke Inuzuka

powered by silkylog