Closed45

書くときのメモとかスクリプトとか

ほげさんほげさん
  • クラス名とかは ` で囲う
  • 英単語は半角 space を両サイドに入れる
ほげさんほげさん

言語ハイライトは可能な限りファイル名を表示する

```haskell:main.hs
main = do
  putStr "hello"
  putStrLn "world"
```
main.hs
main = do
  putStr "hello"
  putStrLn "world"

diff の場合は diff と言語指定とファイル名指定を全部やる

```diff haskell:main.hs
  main = do
-   putStr "hello"
+   putStr "hey"
    putStrLn "world"
```
main.hs
  main = do
-   putStr "hello"
+   putStr "hey"
    putStrLn "world"

diff の場合は一律で行頭に space x 2 を入れて、-+を置換で入れる

以下の様なインデントずれを避けるため

main.hs
main = do
-   putStr "hello"
+   putStr "hey"
  putStrLn "world"
ほげさんほげさん

自分の記事の todo は fixme で残す

todo は文章やサンプルコードで実際に使いたいから

grep fixme -i -w  ./*

とかで適当に管理

ほげさんほげさん

url はベタ貼りにしたので^httpの正規表現で見つけられるはず

機械的に探してリンク切れとか確認するスクリプト作ると良さげ

  • markdown 形式を撲滅したら試す
ほげさんほげさん

見出しの確認が cli プレビューだとちょっと違う感じなので

どうせならと行数目安も数えることにした

驚くくらい適当に

python が 27 なのは単純に慣れているから

/tmp/index.py
import itertools

def dw(word, lines):
    return itertools.dropwhile(lambda line: not line.startswith(word), lines)

def read(path):
    with open(path, 'r') as f:
        return f.read().splitlines()

chapters = [line.replace('- ', '').strip() for line in dw('chapters:', read('./config.yaml')) if not line.strip().startswith('#') and line.strip() != ''][1:]

for chapter in chapters:
    lines = read(chapter)
    body = dw('#', lines)

    print '\n---------- ' + lines[1].split('"')[1] + ' ----------'

    count = 0

    for line in body:
        if line.startswith('#'):
            print '.\n' * (count / 5)
            print line
            count = 0
        else:
            count += 1
$ python /tmp/index.py

---------- この本について ----------

# 想定する人

# 内容
.
.

# 次の章

---------- xxx するには ----------

# 仕様
.
.

## tips 他には

# 目的 / 目標を定める
.
.
.
.

---------- 構築する ----------

# 絵で整理
.
.

## 1. xxx
.

## 2. xxx
.
.
.

## 3. xxx
.
.

## 4. xxx
.
.

---------- おわりに ----------

# まとめ
ほげさんほげさん

使って気に入ったらもう少し真面目に作るかも

ターミナルスクロールだと見通し悪すぎる

収集する##の深さとか決めたりとか

ほげさんほげさん

なんとなく ruby で ( 素人 )

標準出力しても見辛いので .md ファイルを吐き出した

config.yaml に入れなければ公開されないけど cli のプレビューで閲覧できるので都合が良い

5 行ごとに ● で文字数感を確認する line-summary.md と、画像かリンクだけを抜粋した link-summary.md ができる

/tmp/index.rb
chapters = File.read('./config.yaml')
    .split("\n")
    .reverse
    .take_while { |line| !line.start_with?('chapters') }
    .reverse
    .select { |line| !line.strip.start_with?('#') }
    .collect { |line| line.strip.gsub('- ', '') }

link_summary = []
line_summary = []

for chapter in chapters do
    lines = File.read(chapter).split("\n")
    header = lines.reverse.drop_while { |line| line != '---' }.reverse
    title = '# ' + header.select { |line| line.start_with?('title') }[0].split('"')[1]
    body = lines.reverse.take_while { |line| line != '---' }.reverse
    
    link_summary.push title
    line_summary.push title

    sub_title_line_numbers = body.collect.with_index { |line, n| [line.start_with?('#'), n] }.select { |b, _| b }.collect { |_, n| n }

    for s, e in sub_title_line_numbers.zip(sub_title_line_numbers.drop(1)) do
        e = body.size if e == nil
        paragraph = body.slice(s .. e - 1)

        link_summary.push '#' + paragraph[0]
        line_summary.push '#' + paragraph[0]

        paragraph.select { |line| line.start_with?('http') || line.start_with?('![') }.each { |line| link_summary.push line }
        line_summary.push "●\n" * [1, paragraph.select { |line| !line.start_with?('http') && !line.start_with?('![') }.size / 5].max
    end
end

File.write('./link-summary.md', link_summary.join("\n"))
File.write('./line-summary.md', line_summary.join("\n"))
ほげさんほげさん

慣れれば気にしすぎなくてもだいたい守れるはず

それを逸脱するほどはやらない

ほげさんほげさん

あいうえおあいうえおは「かきくけこかきくけこ」や「さしすせそさしすせそ」や「たちつてとたちつてと」といったメリットがあります


あいうえおあいうえおのメリットは以下の通りです

  • かきくけこかきくけこ
  • さしすせそさしすせそ
  • たちつてとたちつてと
ほげさんほげさん

基本小文字は使わないもんなのかなー

x scala
o Scala

x java
o Java

php はよく迷う

PHP ?

ほげさんほげさん

生成物は除外

grep fixme -i -w --exclude 'link-summary.md' --exclude 'line-summary.md' ./*
ほげさんほげさん
grep -e 気づく -e いろんな -e 色んな -e 色々な -e いろいろな -e 。 -e '\*\*' -e 「 -e 一人 -e 独り -e 〜 -e 一つ -e 二つ -e 三つ -e 出来る -e '/' -e github --exclude 'link-summary.md' --exclude 'line-summary.md' ./* | grep -v http | grep -v '//'

出過ぎるので分解しよ...

あとやっぱどうしても章順になってないとめんどくさい

ほげさんほげさん

こんなんで

何となく  あいうの様に は開きたくない気持ち

grep 気づく ./*.md
grep いろんな ./*.md
grep 色んな ./*.md
grep 色々な ./*.md
grep 。 ./*.md
grep 独り ./*.md
grep 一人 ./*.md
grep 一つ ./*.md
grep 二つ ./*.md
grep 三つ ./*.md
grep 〜 ./*.md
grep ( ./*.md
grep ) ./*.md
grep 出来る ./*.md
grep 時 ./*.md
grep 事 ./*.md
grep 他 ./*.md
grep 等 ./*.md
grep github ./*.md | grep -v http
grep java ./*.md | grep -v '```'
grep scala ./*.md | grep -v '```'
grep kotlin ./*.md | grep -v '```'
grep swift ./*.md | grep -v '```'
grep haskell ./*.md | grep -v '```'
grep rust ./*.md | grep -v '```'
ほげさんほげさん

ruby のやつ

  • 見出しの深さを指定して抽出したい
    • 本になった時の見出しがみたい
  • が縦に出るとやばいので横に出す
ほげさんほげさん

適当に整えた

  • chapter ごとの分量可視化は機能カット
    • でかい本を書く頻度が高くないし vi でちょろすれば済むので
  • 厳密な日本語チェックはできないので、目検
    • ある時あるときにしたいけど実行時とかもひっかかる
  • そのかわり、色をつけて目検しやすくした
  • 英単語は highlight とか url で引っかかりすぎるので検査しない
    • javaとかgithubとか
    • JavaとかGitHubって書く習慣がついたので良い
  • 引数がある場合は articles の md 指定と判断して 1 ファイルチェック
  • 引数がない場合は books のとあるディレクトリにいると判断して chapter 順に全ファイルチェック
ほげさんほげさん
plint.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys, commands, itertools

import defs


def check(path):
    print '\n%s' % path
    for (black, white) in defs.pairs:
        lines = filter(str.strip, commands.getoutput("grep -n '%s' %s" % (black, path)).split('\n'))
        for line in lines:
            print '    %s → %s' % (line.replace(black, '\033[31m%s\033[0m' % black), '\033[32m%s\033[0m' % white)


def book():
    with open('./config.yaml', 'r') as f:
        paths = ['config.yaml'] + [line.strip().replace('- ', '') + '.md' for line in itertools.dropwhile(lambda line: 'chapters' not in line, f.read().splitlines()) if line][1:]

    for path in paths:
        check(path)


def article(path):
    check(path)


if __name__ == '__main__':
    if len(sys.argv) == 2:
        article(sys.argv[1])
    else:
        book()
defs.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

pairs = [
    ('気づく', '気付く'),
    ('いろんな', 'いろいろな'),
    ('色んな', 'いろいろな'),
    ('色々な', 'いろいろな'),
    ('独り', 'ひとり'),
    ('一人', 'ひとり'),
    ('一つ', '1 つ'),
    ('二つ', '2 つ'),
    ('三つ', '3 つ'),
    ('四つ', '4 つ'),
    ('五つ', '5 つ'),
    ('ひとつ', '1 つ'),
    ('ふたつ', '2 つ'),
    ('みっつ', '3 つ'),
    ('よっつ', '4 つ'),
    ('いつつ', '5 つ'),
    ('(', ' ( '),
    (')', ' ) '),
    ('出来る', 'できる'),
    ('下さい', 'ください'),
    ('時', 'とき'),
    ('事', 'こと'),
    ('他', 'ほか'),
    ('等', 'など'),
    ('あんまり', 'あまり'),
]

このスクラップは2021/04/15にクローズされました