markdown
慣れるまで、や、使い始めるまでは「なんかめんどくさいんじゃないのー?Web系のウェイウェイが騒いでるだけでさー?」ってイメージだったのだが、今ではメモするにも何するにしてもmarkdownで書いている。特に職場ではVScodeくらいしか自由に使える道具が無いので非常に有用だ。そうなってくるとこの当該クソブログもmarkdownで書きたくなるわけで。
WP Githuber MD
というWordPressプラグインをちょっと前に入れて使っているのだが、一つ気になったことがある。どこでMD->HTMLやってんだ?である。早速Localにdumpしたデータを持ってきて見てみたのだが……。
select * from wp_posts where post_status='publish'
んんんんん???
なんじゃこりゃあああああ!!!!!!さっぱりわからないのだが、謎のコメントが大量に付いている。
鵺の哭く夜は恐ろしい
直近のエントリの中身(wp_posts.post_content)を見てみる。
https://www.dobusarai.net/blog/curse-of-cp932-golang/
<h3>golangでも同じことをやってみた</h3>
<p><a href="https://www.dobusarai.net/blog/curse-of-cp932/">[c#] SJISというかCP932とかいう呪い</a></p>
<p>c#でのcp932で化けてしまう一部キャラクタを変換するやつ。それをgoで書いてみたのだけど……。なんだろ、遅い。正規表現は他言語と同じく遅いようで、RegexpではなくReplacer使えーとかそこらへんは考慮して書いたのだが。stopwatchの精度もスリープで確認したりなんだりで問題なさそう。未使用メソッドがあったり、処理の1,2,3を順にループさせたりするとどんどん遅くなる(なので未使用~についてはコメントアウトしてる)のが謎い。</p>
<h3>? < 処理が遅い!</h3>
<pre><code class="language-c">4826 // -> goでのこのミリセカンド表記はc#版のほうでいうと
00:00:04.0826 // -> これと同値</code></pre>
<p>最終結果は同じだが、文字化け(マッピングできないキャラ)が来るとそこで試合終了っぽい。</p>
<p><img src="https://www.dobusarai.net/blog/wp-content/uploads/2020/11/1606027028951.png" alt="結果" /></p>
<pre><code class="language-go">package main
import (
"bufio"
"fmt"
"os"
"strings"
"time"
"golang.org/x/text/encoding/japanese"
"golang.org/x/text/transform"
)
// ループの外でReplacerを持つようにした
var rep *strings.Replacer
func main() {
fmt.Println("start")
// ファイル読み込み
list := getFileData()
/*list2 := make([]string, len(list))
copy(list2, list)
list3 := make([]string, len(list))
copy(list3, list)*/
// 処理
start1 := time.Now()
// ループの外でReplacerを持つようにした
rep = strings.NewReplacer("〜", "~", "−", "-", "¢", "¢", "£", "£", "¬", "¬", "—", "―", "‖", "∥")
for i := 0; i < 1000000; i++ {
replaceUnmappingChars1(list)
}
stop1 := time.Now()
fmt.Println(stop1.Sub(start1).Milliseconds())
// ファイル書き込み
outputFile(list)
fmt.Println("end")
}
// replace unmapping chars3 -> 8293
/*func replaceUnmappingChars3(list []string) {
for i, str := range list {
sl := strings.Split(str, "")
length := len(sl)
var rep string
for j := 0; j < length; j++ {
if sl[j] == "〜" {
rep += "~"
} else if sl[j] == "−" {
rep += "-"
} else if sl[j] == "¢" {
rep += "¢"
} else if sl[j] == "£" {
rep += "£"
} else if sl[j] == "¬" {
rep += "¬"
} else if sl[j] == "—" {
rep += "―"
} else if sl[j] == "‖" {
rep += "∥"
} else {
rep += sl[j]
}
}
list[i] = rep
}
}*/
// replace unmapping chars2 -> 100万回 9946
/*func replaceUnmappingChars2(list []string) {
for i, str := range list {
var rep string
for _, c := range str {
if string(c) == "〜" {
rep += "~"
} else if string(c) == "−" {
rep += "-"
} else if string(c) == "¢" {
rep += "¢"
} else if string(c) == "£" {
rep += "£"
} else if string(c) == "¬" {
rep += "¬"
} else if string(c) == "—" {
rep += "―"
} else if string(c) == "‖" {
rep += "∥"
} else {
rep += string(c)
}
}
list[i] = rep
}
}*/
// replace unmapping chars -> 100万回 4826
func replaceUnmappingChars1(list []string) {
for i, data := range list {
//rep := strings.NewReplacer("〜", "~", "−", "-", "¢", "¢", "£", "£", "¬", "¬", "—", "―", "‖", "∥")
list[i] = rep.Replace(data)
}
}
// GetFileData return list
func getFileData() []string {
// file open
file, err := os.Open("./source.txt")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer file.Close() // c#でのusing - disposeみたいな? todo:あとでもっとよく調べる
// file read
var data []string
scanner := bufio.NewScanner(file)
for scanner.Scan() {
data = append(data, scanner.Text())
}
if err := scanner.Err(); err != nil { // どうやったらここに来るんだ?
fmt.Println(err)
os.Exit(1)
}
return data
}
// outputFile
func outputFile(list []string) {
// file create todo:上書きっぽい(あとでよく見る)
file, err := os.Create("./destination_sjis_fix.txt")
if err != nil {
fmt.Println(err)
os.Exit(1)
}
defer file.Close()
// data write
writer := bufio.NewWriter(transform.NewWriter(file, japanese.ShiftJIS.NewEncoder()))
for _, data := range list {
_, err := writer.WriteString(data + "\n") // やっぱり普通はここで変換するよね(c#でも書いたのでこっちにも)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
}
writer.Flush() // buf(debuggerでみた)の中にWriteStringで溜めてFlushで一気に書くっぽい
}</code></pre>
<p>なんか根本的にミスってるのかなー。わからん。ベンチマークメソッド?みたいなのがあるからそっちでやらないとダメなのかなー。</p>
俺の記憶が確かなら、バニラのWordPressはかなりプレーンテキストに近い形でエントリを保持していたような。そこで変なコメントが付いていなそうな、このblogの2番目のエントリを見てみる。
https://www.dobusarai.net/blog/post-16/
cssフレームワークやることにした。つまらんが最低限の実装は必要だしな。でも、bootstrapはくっそ重すぎて趣味に合わない。なので、色々とダウンロードしてサイズみたりサンプルみたりしてmaterializeに決めた。
<a href="http://materializecss.com/">http://materializecss.com/</a>
始めはspectre、skyblue、pureに白羽の矢を立てたのだが、前者2つはサンプル少なくてめんどくさい。pureはYahooBSDとかいう謎ライセンス。デザインめんどくさくてECシステム作るのペンディングにしてたので、これを機にどかーーーんと管理画面まで実装したい。まずはWordpressやめて自前blogに移行するので、それのフロントとアドミン。今週末に出来たらいいなあ。
最近の土日は暇といえば暇なのだけれど、リビングではるちゃん(甥っ子)の楽しげな声が聴こえるとついつい見に行って遊んでしまうのでなーんもしていないのよね。そろそろリブートですわリブート。シャットダウンしたら故障して起動しないんだろ?知ってるよそんなこと。
だよね。
うーんこの
SNS等を定期的に抹消しないと気持ち悪いという呪いにかかっているので、Localを除くとこのblogしか無いんだよなー。なので長くデータを残したい。markdownそのものをエントリデータとして保持するblogシステムはないのか、と検索したところあることはあるのだがマイナーだし。そうなると……
blogシステムの自作?
うーんそれは。VScodeで編集してコピペすればいいのだが、それはそれでどうなんだというのもあるし、かといって凝った編集機能の付いたbackendの実装とか考えるだけダルいというかなんというか。実際に書くわけではないので適当にロードマップを考える。
- wp_postsの加工(これは後でいっか)
- backendの実装(カテゴリとTwitter自動投稿は欲しい。管理画面でのデザイン変更とかコメントとかfeedは全部いらね)
- frontendの実装(markdown→htmlとページャーくらい?code highlightは現行のprismでいいだろう)
あ、ベタ書きWebアプリケーションならオレオレシステム的にはWindowsのクリップボードキャプチャと同じくらいの工数で余裕そうだな。不慣れなのもあるがSPAデーってなったら死ぬ。MDtoHTMLでよさげなものがあるプラットフォームでやってみようかな。c#, go, phpのいずれか。