News

Software Design 2020年9月号に寄稿しました

Added by kanata about 1 month ago

Software Design 2020年9月号の 現場で役立つユースケースを厳選 エピソードで覚えるUnixコマンド[第2弾]という特集の一部を執筆しました。dateとtputのお役立ちな使い方を書きました!他にもすごい執筆陣の方々がお役立ちコマンドを紹介されております。

個人的には、結城 浩さんによる私の好きな「難読化」の記事や、高校ではやらなくなったと噂の行列計算の基本など興味深い記事が目白押しでございます。

8/18発売です!

書籍といえば技術書典9でも薄い本を出す予定です
CyberChefとシェル芸 で詳細を公開しています
あとssmjp同人部でも書かせてもらっているのですがその話はまた今度

jus共催 第49回ボンバイエシェル芸勉強会

Added by kanata about 1 month ago

上田さんがリンクをまとめてくださるはず

jus共催 第49回ボンバイエシェル芸勉強会

2020年8月15日YouTube liveにて。動画:

とても楽しい

知見

けっこう長いことお邪魔させて頂いておりますが、未だに新しいコマンドや使い方を知れるのすごい

errno

Linuxの標準エラーコードを探せる
一覧を出すときはこう

$ errno -l
EPERM 1 Operation not permitted
ENOENT 2 No such file or directory
ESRCH 3 No such process
EINTR 4 Interrupted system call
EIO 5 Input/output error
ENXIO 6 No such device or address
E2BIG 7 Argument list too long
ENOEXEC 8 Exec format error
EBADF 9 Bad file descriptor
ECHILD 10 No child processes
EAGAIN 11 Resource temporarily unavailable
ENOMEM 12 Cannot allocate memory
EACCES 13 Permission denied
EFAULT 14 Bad address
ENOTBLK 15 Block device required
EBUSY 16 Device or resource busy
EEXIST 17 File exists
EXDEV 18 Invalid cross-device link
ENODEV 19 No such device
ENOTDIR 20 Not a directory
EISDIR 21 Is a directory
EINVAL 22 Invalid argument
ENFILE 23 Too many open files in system
EMFILE 24 Too many open files
ENOTTY 25 Inappropriate ioctl for device
ETXTBSY 26 Text file busy
EFBIG 27 File too large
ENOSPC 28 No space left on device
ESPIPE 29 Illegal seek
EROFS 30 Read-only file system
EMLINK 31 Too many links
EPIPE 32 Broken pipe
EDOM 33 Numerical argument out of domain
ERANGE 34 Numerical result out of range
EDEADLK 35 Resource deadlock avoided
ENAMETOOLONG 36 File name too long
ENOLCK 37 No locks available
ENOSYS 38 Function not implemented
ENOTEMPTY 39 Directory not empty
ELOOP 40 Too many levels of symbolic links
EWOULDBLOCK 11 Resource temporarily unavailable
ENOMSG 42 No message of desired type
EIDRM 43 Identifier removed
ECHRNG 44 Channel number out of range
EL2NSYNC 45 Level 2 not synchronized
EL3HLT 46 Level 3 halted
EL3RST 47 Level 3 reset
ELNRNG 48 Link number out of range
EUNATCH 49 Protocol driver not attached
ENOCSI 50 No CSI structure available
EL2HLT 51 Level 2 halted
EBADE 52 Invalid exchange
EBADR 53 Invalid request descriptor
EXFULL 54 Exchange full
ENOANO 55 No anode
EBADRQC 56 Invalid request code
EBADSLT 57 Invalid slot
EDEADLOCK 35 Resource deadlock avoided
EBFONT 59 Bad font file format
ENOSTR 60 Device not a stream
ENODATA 61 No data available
ETIME 62 Timer expired
ENOSR 63 Out of streams resources
ENONET 64 Machine is not on the network
ENOPKG 65 Package not installed
EREMOTE 66 Object is remote
ENOLINK 67 Link has been severed
EADV 68 Advertise error
ESRMNT 69 Srmount error
ECOMM 70 Communication error on send
EPROTO 71 Protocol error
EMULTIHOP 72 Multihop attempted
EDOTDOT 73 RFS specific error
EBADMSG 74 Bad message
EOVERFLOW 75 Value too large for defined data type
ENOTUNIQ 76 Name not unique on network
EBADFD 77 File descriptor in bad state
EREMCHG 78 Remote address changed
ELIBACC 79 Can not access a needed shared library
ELIBBAD 80 Accessing a corrupted shared library
ELIBSCN 81 .lib section in a.out corrupted
ELIBMAX 82 Attempting to link in too many shared libraries
ELIBEXEC 83 Cannot exec a shared library directly
EILSEQ 84 Invalid or incomplete multibyte or wide character
ERESTART 85 Interrupted system call should be restarted
ESTRPIPE 86 Streams pipe error
EUSERS 87 Too many users
ENOTSOCK 88 Socket operation on non-socket
EDESTADDRREQ 89 Destination address required
EMSGSIZE 90 Message too long
EPROTOTYPE 91 Protocol wrong type for socket
ENOPROTOOPT 92 Protocol not available
EPROTONOSUPPORT 93 Protocol not supported
ESOCKTNOSUPPORT 94 Socket type not supported
EOPNOTSUPP 95 Operation not supported
EPFNOSUPPORT 96 Protocol family not supported
EAFNOSUPPORT 97 Address family not supported by protocol
EADDRINUSE 98 Address already in use
EADDRNOTAVAIL 99 Cannot assign requested address
ENETDOWN 100 Network is down
ENETUNREACH 101 Network is unreachable
ENETRESET 102 Network dropped connection on reset
ECONNABORTED 103 Software caused connection abort
ECONNRESET 104 Connection reset by peer
ENOBUFS 105 No buffer space available
EISCONN 106 Transport endpoint is already connected
ENOTCONN 107 Transport endpoint is not connected
ESHUTDOWN 108 Cannot send after transport endpoint shutdown
ETOOMANYREFS 109 Too many references: cannot splice
ETIMEDOUT 110 Connection timed out
ECONNREFUSED 111 Connection refused
EHOSTDOWN 112 Host is down
EHOSTUNREACH 113 No route to host
EALREADY 114 Operation already in progress
EINPROGRESS 115 Operation now in progress
ESTALE 116 Stale file handle
EUCLEAN 117 Structure needs cleaning
ENOTNAM 118 Not a XENIX named type file
ENAVAIL 119 No XENIX semaphores available
EISNAM 120 Is a named type file
EREMOTEIO 121 Remote I/O error
EDQUOT 122 Disk quota exceeded
ENOMEDIUM 123 No medium found
EMEDIUMTYPE 124 Wrong medium type
ECANCELED 125 Operation canceled
ENOKEY 126 Required key not available
EKEYEXPIRED 127 Key has expired
EKEYREVOKED 128 Key has been revoked
EKEYREJECTED 129 Key was rejected by service
EOWNERDEAD 130 Owner died
ENOTRECOVERABLE 131 State not recoverable
ERFKILL 132 Operation not possible due to RF-kill
EHWPOISON 133 Memory page has hardware error
ENOTSUP 95 Operation not supported

uniname

オフセット、バイトオフセット、hex、エンコード、グリフ、名前を調べられる

$ echo 難読化シェル芸|uniname
No LINES variable in environment so unable to determine lines per page.
Using default of 24.
character  byte       UTF-32   encoded as     glyph   name
        0          0  0096E3   E9 9B A3       難      CJK character Nelson 5038
        1          3  008AAD   E8 AA AD       読      CJK character Nelson 4375
        2          6  005316   E5 8C 96       化      CJK character Nelson  350
        3          9  0030B7   E3 82 B7       シ      KATAKANA LETTER SI
        4         12  0030A7   E3 82 A7       ェ      KATAKANA LETTER SMALL E
        5         15  0030EB   E3 83 AB       ル      KATAKANA LETTER RU
        6         18  0082B8   E8 8A B8       芸      CJK character Nelson 3908
        7         21  00000A   0A                     LINE FEED (LF)

めっちゃ便利

rg(ripgrep)

Rust製のすごいgrepのようだ

openssl prime

opensslで素数の判定ができるなんて知らなかったー!

$ openssl prime `seq 15`
1 (1) is not prime
2 (2) is prime
3 (3) is prime
4 (4) is not prime
5 (5) is prime
6 (6) is not prime
7 (7) is prime
8 (8) is not prime
9 (9) is not prime
A (10) is not prime
B (11) is prime
C (12) is not prime
D (13) is prime
E (14) is not prime
F (15) is not prime

tr -dc

  • -dオプションは「指定した文字を取り除く」
  • -dcオプションは「指定した文字だけ残す」
$ echo a1b2c3d4 | tr -dc abcd
abcd
$ echo a1b2c3d4 | tr -d abcd
1234

stringsみたいに使えるし、stringsよりもカスタマイズができますね

jus共催 第48回引きこもりシェル芸勉強会

Added by kanata 3 months ago

jus共催 第48回シェル芸勉強会リンク集 | 上田ブログ

Mon Jun 29 21:19:34 JST 2020 (modified: Wed Jul 1 09:00:25 JST 2020) 2020年6月27日土曜日、 日本UNIXユーザ会 さんとシェル芸勉強会を共催いたしました。今回もコロナウイルス禍のため、拙宅からYouTubeでオンライン開催しました。皆様、オンラインでのリアクション、二次会での暴言へのリアクション、誠にありがとうございました。 色塗りました.増分はまた今夜にでも足しますー #シェル芸 jus共催 第48回引きこもりシェル芸勉強会 - Togetter https://t.co/YiPUc4HPYu @togetter_jp より- 上田 隆一 (@ryuichiueda) June 28 2020 LTやります。配信できたらツイートいただけると幸いです? https://t.co/UBB0Q4WjlJ #シェル芸 - taka@SIではたらくフレンズ (@amanoese) June 27 2020 では、次のLTいきますー。こちらのURLになります。 https://t.co/V1iwCeD7uj 音声と映像大丈夫そうでしたらお伝え下さいー。#シェル芸 - ぐれさん😉 (@grethlen)

jus共催 第48回引きこもりシェル芸勉強会

主にプロセスについて勉強しました。激しかったです。

とても楽しい

知見

ここらへんの知見については自分で本を書いておきながら忘れてたりする

catの代替

ビルトインなので、たとえ/usr/bin/catが吹き飛んだとしてもこれでなんとかできる

$ echo hoge > hoge
$ cat hoge
hoge
$ echo $(<hoge)
hoge

サブシェルとexec

サブシェル

子のbashをforkして、その先で実行する
実行終了まで待ち合わせる
変数とかカレントディレクトリとか引き継がない

$ pwd
/tmp
$ (mkdir -p test;cd test;touch hoge)
$ pwd
/tmp

&でバックグラウンド実行するのと似ているけど、こっちは子プロセスを作らないので変数とかカレントディレクトリとかは、そのまま

exec

自分自身のbashが、実行したコマンドのプロセスに置き換わると思えばいい
以下だとbashがsleepに置き換わるが、sleep自体は3秒立ったら終了するため、3秒後にターミナルごと落ちる

$ exec sleep 3

execはリダイレクト先を切り替える機能もある

$ exec > hoge     # 標準出力をファイルに切り替える
$ exec > /dev/tty # シェルの標準出力先を画面に戻す

今回のシェル芸勉強会の問題を解くには、標準入力を切り替える必要があった

LT

この2つのLTはとても面白かったので、是非見て

Technopop shell-gei

soxというコマンドを使うとシェル芸で音が鳴らせるよ!という内容
すばらしい…

ワイも音シェル芸を以前やろうとしててtxt2wavの作者の方に許可を頂いて、周波数をインプットに音楽を作り出そうとしたんだけれど挫折した経緯が…

周波数を扱うレイヤから、楽曲まで昇華させるの実はすんごい難しかったです

takaさんは周波数をbcで見事に計算して、そして音楽を奏でていた
素晴らしかった(こなみ)

シェル芸人に必要なのは「マスキングテープ」だったのでは

なんかもぅ…すごすぎて説明できない(語彙力)
Youtubeみて頂けたらと

ほんとこれはパラダイムシフトの瞬間を目の当たりにしたような衝撃を…覚えました

今まで、「あ、これはう~ん、しょうがないpython(とか)で書くか…」という事が多々あったんですよね
主に処理時間的な意味で

teipがあれば、全部シェル芸でできる…!最高か

使っていきます

オンラインホワイトボードサービスmiroヤバい

Added by kanata 5 months ago

TL;DR

miroというヤバすぎサービスがある

  • ホワイトボードのように使える
    • 複数人で編集できる
    • 付箋はれる
    • お絵かきできる
    • KJ法の表現
    • フロー図書ける
    • などなどのテンプレートが沢山用意されてる
  • マインドマップ書ける
  • これら全部、範囲を指定して スライドにできる
  • そのスライドはpdfとか画像で エクスポートできる

なんかもういろんな用途に使えそうですが、特にプレゼンテーション用途でビビッときました

最強では…

よくわかるmiroの紹介

この記事がわかりやすかったです

発端

えびすセキュリティボーイズ#2 -Learning Books-で、渡辺洋司さんがmiroを使ってLTしてくださいました

発表資料

ACM 会員になってオライリーのセキュリティ原書を DeepL に読んでもらう。
https://miro.com/app/board/o9J_ktc3EUY=/

readonlyの状態でmiroが触れるので、いろいろ触ってみるといいです
資料の中身自体もおもしろいので是非

触ってみた雰囲気

渡辺さんの発表資料をもとに触ってみる

全体像

ホワイトボードのように使えるので、マインドマップを中心に付加情報を表現しているようです

好きに書いて"frame"という機能で囲めば、それがスライドの1枚になります
しかもスライド間でオーバーラップできるんですよね。これすごい便利では。。
プレゼンテーションだと、前のスライドと次のスライドの話の繋がりとか意識しなきゃいけなかったけど、オーバラップできたら悩まなくてすみそう!
プレゼンテーションのアウトライン書いたらそのままスライドにできる勢いある

全体像

左のスライドをクリックするとフォーカスされる

フォーカス後も画面は動かせるので、マウスぐりぐりして周りの関連情報も見せることができる
これLTしてて相手の反応をみて「あ、こっちに興味ありそう」ってなったら、スライドにしてない情報も、その場でみせれるってことですよね
これまでのプレゼンテーションツールだと、それがやりにくかったのが解決できてる…!

フォーカス

スライドは全画面表示できる

全画面表示できるしpdfエクスポートできるので、完全にプレゼンテーションツールとして使えますね!
でもオンラインなら、フォーカスした状態で使った方がよさそう

全画面表示

マインドマップ

マインドマップ作れて嬉しい
マインドマップって、なんかこうコレ!っていうソフトを見つけられなくて困ってたんだけど、これでよさそう

マインドマップ

jus共催 第47回引きこもりシェル芸勉強会

Added by kanata 5 months ago

jus共催 第47回シェル芸勉強会リンク集 | 上田ブログ

2020年4月25日土曜日、日本UNIXユーザ会さんとシェル芸勉強会を共催いたしました。今回はコロナウイルス禍のため、拙宅からYouTubeでオンライン開催しました。皆様、オンラインでのリアクション、誠にありがとうございました。

オンラインでも殺しにきてる(順調に死亡)

知見

Unicodeもろもろの情報の入手


# apt install unicode-data

すると/usr/share/unicode配下にUnicodeに関するいい感じの情報が格納されます
/usr/share/unicode/emoji/emoji-data.txt とかよさそう

uninameコマンド

Unicodeに関してめっちゃ便利なツール群

コマンド紹介 : uniutilsツール群 (Unicode関連コマンド)
https://yutarine.blogspot.com/2017/04/uniutils-unicode.html

一文字ずつの置換

よくtrでやってた。sedのyオプションでもできる

$ echo abcdef|tr abc ghi
ghidef
$ echo abcdef|sed 'y/abc/ghi/'
ghidef

Markdownで書いてシュッとCSS組版環境でpdfを出力する

Added by kanata 6 months ago

コロナの影響で家にいるみなさまは時間があれば薄い技術書を作ればいいじゃない!

※当情報は、 2020/4月時点の情報です。時間の経過と共に使えるなくなる部分が出てくるかもしれません。。

CSS組版とは

簡単にいうとhtmlが薄い本になります
なので、最低限HTML+CSSが理解できていれば本ができます!

まぁその…直接html書くのはそれはそれで骨が折れますけれど…

なので、楽な方法があります。軽量マークアップ言語で書いて本になればもっと楽ですよね!
そんな方法の話です

執筆環境の分類と整理

技術書同人誌勢の一定の割合の方は、Re:VIEWを使用して執筆していると思われます

① Re:VIEW形式のファイル      →     pdfファイル
                        Re:VIEWで変換

Markdownで書きたい勢は、更にこんな感じで書いていると思われます

① Markdown形式のファイル     →     Re:VIEW形式のファイル
                        md2reviewで変換

② Re:VIEW形式のファイル      →     pdfファイル
                        Re:VIEWで変換

Markdownで書きたい勢(ワイ)の中で、更にCSS組版したい場合はこんな感じです

① Markdown形式のファイル     →     Re:VIEW形式のファイル
                        md2reviewで変換

② Re:VIEW形式のファイル      →     htmlファイル
                        Re:VIEWで変換

③ htmlファイル               →     pdfファイル
               VivliostyleでCSS組版(ブラウザでpdf印刷)

④ pdfファイル                →     pdfファイル
         Microsoft Print to PDFでアウトライン化

メリット

  • TEXの悪夢から(ほぼ)逃れられる
  • 絵文字が使える😭😭😭
  • CSSいじれればある程度なんでもできる

デメリット

  • 環境構築に時間がかかる(まだ情報が少ないので)

Install & Setup

以下の環境を前提にしています
でもLinux環境だったら、だいたいいけるのでは

$ cat /etc/issue
Ubuntu 18.04.1 LTS \n \l
$ uname -a
Linux ubuntu 4.15.0-91-generic #92-Ubuntu SMP Fri Feb 28 11:09:48 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

使うソフトウェアは大きく以下になります

  • md2review
  • Re:VIEW
  • Vivliostyle
  • sed(GNUコマンド)
  • Chrome(ブラウザ)

この内、Re:VIEWとVivliostyleがdockerコンテナになっているので、あまり意識しなくても大丈夫です

md2review

md2reviewは、MarkdownからRe:VIEWへ変換してくれるありがたいコマンドです

インストールは以下

# gem install md2review

ruby製のコマンドなので、rubyとbundleが要ります
入ってなかったらググって入れて

@at_grandpaさんのRe:VIEW+CSS組版 執筆環境

@at_grandpaさんの神環境により、一瞬でRe:VIEWとVivliostyleの環境が構築できます最高

Re:VIEW+CSS組版 執筆環境構築

2020.4月時点では、v0.2.0をダウンロードして…とありますが、最新版でも大丈夫でしょう

$ mkdir [執筆環境を入れるディレクトリ]
$ cd [執筆環境を入れるディレクトリ]
$ git clone https://github.com/at-grandpa/review-and-css-typesetting
$ cd review-and-css-typesetting*
$ make up docker/setup_npm docker/setup_bundler docker/setup_plantuml_jar # docker環境をセットアップする

dockerコンテナなので、dockerが要ります
入ってなかったらググって入れて

Macが前提になっている環境なので、LinuxでエラーがでないようにちょこちょこっとMakefileを修正します

$ vi Makefile

- open $(HTML_URL)
+ echo $(HTML_URL) # openコマンド入ってないので

Vivliostyle CLI

2020.4に公開されたばかりのCUI版Vivliostyleです
これのすごいところは…

  • ブラウザで表示しなくてもpdf出力できる(内臓のHeadless Chromeで)
  • 文字のアウトライン化をしてくれるオプションがある(CSS組版勢がよくハマるところ)

ただ、まだなんか私の環境では上手く動きませんでした
今後に超期待
状況は以下を注視してもらればと

https://github.com/vivliostyle/vivliostyle-cli

Vivliostyle CLI

使い方

とりあえずサンプルでCSS組版環境を試してみたい場合は、以下でできます

$ cd [執筆環境を入れるディレクトリ]/review-and-css-typesetting*
$ make browser
make docker/html
・
・
中略
・
・
http://0.0.0.0:8000/vivliostyle-js-2018.12.103/viewer/vivliostyle-viewer.html#x=http://0.0.0.0:8989/book.html

最後に出てきたURLをブラウザに打ち込めば見れるのですが、その前に0.0.0.0(2箇所)は自分のIPアドレスに置き換える必要があります
自分のIPアドレスは、以下で確認できます

$ hostname -I
$ ip a s|grep inet # ifconfigは無くなったんや…

見れましたか?これをブラウザの印刷機能で印刷すれば、とりあえずpdfができますね

さて、ここまで動いたら順を追ってやってみます

Markdownを書く

Markdownを書いたら以下でRe:VIEW形式に変換します

$ md2review hoge.md > chapter1.re

Re:VIEW形式のファイルをCSS組版環境に配置する

動いているサンプル環境に対して、少しずつファイルを入れ替えていくと動作確認しながら進めやすいと思います

$ cd [執筆環境を入れるディレクトリ]/review-and-css-typesetting*/articles
$ mv -i chapter1.re chapter1.re.bak # 削除してもいいですけどね
$ mv -i [さっき変換したRe:VIEW形式のファイル] chapter1.re
$ cd ..
$ make browser

で、また同じようにURLをブラウザに打ち込んで反映されているか確認してみてください
ディレクトリarticle配下は、Re:VIEWの環境なので章の追加やタイトルの変更方法は、Re:VIEWの仕様に準じます

設定ファイル的なものは、以下の2つだけ意識しておけば事足りるはずです

  • config.yml
  • catalog.yml

Markdownで無理やりRe:VIEWの機能に対応させる

これはもぅどうしようもないのですが、組版における表現の機能はMarkdownと比較するとRe:VIEWに軍配があがります
ここでは、特定の表現を主にMarkdownでなんとかするための方法を説明します

Markdown → Re:VIEW に変換するタイミングでなんとかする

脚注

これかなり困ってたんですが以下の書き方をすれば、md2reviewでいい感じに変換してくれました

これ[^脚注1]はいったい…

 [^脚注1]: これとはアレである

ただ、この脚注の説明が全部、章末に集まっちゃいました
Re:VIEWは、pdfに変換する際はいい感じにしれくれるんですが、htmlだとそうはいかないみたいです

なので、以下のようなシェル芸を作りました
何回も実行するのでシェルスクリプトにしておくと良いと思います
Re:VIEWに変換後のファイルに対して脚注を任意の行に移動できるようにしました

$ FILE="preface.re";FOOTNO="1";INSERTNO="19";FOOTNOTE=$(grep "^//footnote\[$FOOTNO\]" $FILE);sed -i -e "/^\/\/footnote\[$FOOTNO\].*/d" $FILE;sed -i -e "${INSERTNO}i ${FOOTNOTE}" $FILE

※冒頭の3つの変数を適宜書き換える

FILE : 対象のファイル名
FOOTNO : 上から数えて何番目の脚注か
INSERTNO : 移動先の行番号

画像の縮尺

Markdownは画像の縮尺の書き方に方言があるので、md2reviewで変換できません
これは以下のように工夫しました
まず、markdownでこう書きます

![テスト画像 scale=0.5](image.jpg)

md2reviewで変換するとこうなります

//image[image][テスト画像 scale=0.5]{
//}

これを以下のように変換すればいいですね

//image[image][テスト画像][scale=0.5]{
//}

これはRe:VIEWに変換する際に合わせて置換すればいけます

$ md2review hoge.md|sed 's/ scale=/][scale=/g' > chapter1.re

表のサイズ

Markdownで書いた表の文字が枠を突き抜けることがあります

参考 【Re:VIEW】表のセル内でURLを折り返しする方法

これは、Re:VIEW上では表の列のサイズを指定することで解決できます
以下を表の冒頭に記載します

//tsize[60,60]

よってMarkdownにもあらかじめtsizeを書いておけばよさそうですが、表とくっつけて書くと表として認識されなくなります
なので、一行あけて書きましょう

# NG

//tsize[60,60]
| hoge | fuga |
|------|------|
| 1    | 2    |

# OK

//tsize[60,60]

| hoge | fuga |
|------|------|
| 1    | 2    |

最終的にRe:VIEWに変換する際に開けた一行をくっつければいけます

$ md2review hoge.md|sed '/tsize.*/N;s/\n/ /' > chapter1.re

: さっきの画像の縮尺の対応と合わせるとこうなります
$ md2review hoge.md|sed 's/ scale=/][scale=/g'|sed '/tsize.*/N;s/\n/ /' > chapter1.re

表の名前

Markdownでは対応する機能がありません
md2reviewで変換すると表は順番に番号がつくのでそれを目印にして表名を挿入していきます
何回も実行するのでシェルスクリプトにしておくと良いでしょう
Re:VIEWに変換後のファイルに対して表名を設定できるようにしました

$ FILE="chapter1.re";TBLNO="1"; TITLE="ほげほげの表";sed -i -e "s/\/\/table\[tbl${TBLNO}\]\[/\/\/table\[tbl${TBLNO}\]\[${TITLE}/g" $FILE
$ FILE="chapter1.re";TBLNO="2"; TITLE="ふがふがの表";sed -i -e "s/\/\/table\[tbl${TBLNO}\]\[/\/\/table\[tbl${TBLNO}\]\[${TITLE}/g" $FILE
$ FILE="chapter1.re";TBLNO="3"; TITLE="こんな感じ";sed -i -e "s/\/\/table\[tbl${TBLNO}\]\[/\/\/table\[tbl${TBLNO}\]\[${TITLE}/g" $FILE

※冒頭の3つの変数を適宜書き換える

FILE : 対象のファイル名
TBLNO : 上から数えて何番目の表か
TITLE : 表の名前

Re:VIEW → html に変換するタイミングでやりたいことをなんとかする

改ページ

markdownは ---- で改ページするよう書く

前のページ

----

次のページ

style.cssを編集

$ cd [執筆環境を入れるディレクトリ]/review-and-css-typesetting*/articles
$ vi style.css # ファイル末尾に以下を追加

+
+hr.page-wrap {
+  break-before: page;
+  visibility: hidden;
+  margin: 0px;
+  padding: 0px;
+  height: 1px;
+}

make browserで作成された book.html を編集する

$ sed -i -e 's|<hr>|<hr class="page-wrap" />|g' book.html 

コードブロックの等幅フォント

$ cd [執筆環境を入れるディレクトリ]/review-and-css-typesetting*/articles
$ vi style.css # 329行目あたり(pre.list,pre.emlistの要素)を以下の通り編集

-   font-family: "Ricty Diminished";
+   font-family: Consolas, 'Courier New', Courier, Monaco, monospace;

改行

markdownでは改行したい所に<BR>を書く

ここで改行<BR><BR>したい

make browserで作成された book.html を編集する

$ sed -i -e 's/&lt;BR&gt;/<BR>/g' book.html 

表に干渉する文字 |

表の中に|があると困ります
表が崩れちゃうの…
なので、仮に%7Cと書いておきます

| hoge | fuga |
|------|------|
| %7c  | 2    |

make browserで作成された book.html を編集する

$ sed -i -e 's/%7C/|/g' book.html 

html → pdf に変換するタイミングでなんとかする

埋め込みフォント(Type3フォント)問題

これはけっこう面倒くさい問題で、フォントが埋め込まれてないと印刷会社さんからダメって言われることがあるようです
具体的には、pdfのプロパティを参照した際にType3っていうフォントがあるとマズいです

これを解決するには以下のどちらかの対応になるようですが、フォント埋め込むのがけっこう難易度が高くて死にます

  • フォントを埋め込む
  • アウトライン化(≒画像化)

で、アウトライン化してくれるのが前述のvivliostyle-cliなんですね!
これがなくても、いちおうなんとかできます
いったんブラウザ機能で印刷したpdfを更にWindows10の Microsoft Print to PDF で再度PDF化すればいけそうです

ファイルサイズめっちゃでかくなるけど…

以上、楽しい組版ライフを!

jus共催 第46回人類はおそらくシェル芸に仕事を奪われるか奪われないかのどちらかであるシェル芸勉強会 に参加さ(文字数

Added by kanata 7 months ago

jus共催 第46回シェル芸勉強会リンク集 | 上田ブログ

知見

同じ文字が出てくる行をひっかける(grep)

イディオムとして覚えてしまいたい(脳死)

$ echo {A..D}{A..D}{A..D}{A..D} | tr ' ' \\n | grep -Ev '(.).*\1'
ABCD
ABDC
ACBD
ACDB
ADBC
ADCB
BACD
BADC
BCAD
BCDA
BDAC
BDCA
CABD
CADB
CBAD
CBDA
CDAB
CDBA
DABC
DACB
DBAC
DBCA
DCAB
DCBA

LT

ネットワーク業界の闇(大変興味深かった)

ワイのLT

CTF入門のための情報 (3 comments)

Added by kanata 8 months ago

第ニ回サイバーセキュリティ系LT会 in 東京において、質問を頂きました
「パソコンちょっとわかる」レベルの人のCTF入門は、どの本やサイトがおすすめですか?
への回答でございます

TL;DR

CTFは、解けた時が一番楽しい!!!!!!!11!1
ので 常設しているcpawCTFpicoCTFをやってどんどん解いてみてください!

ここを読んでやってみる

CTF入門に関する情報はきなこさんとkusuwadaさんが綺麗に情報をまっとめてくださっています

ここを読むとわかるかなと

kusuwadaさんはpicoCTFのほぼ全ての問題解説を書いてくださっているので

  • picoCTFをやってみる → わからない → kusuwadaさんのブログを見る

がとてもよさそう

余談

ダニング・クルーガー効果によるCTFの習熟度をうまく表現できない問題

CTFですが、競技の性質*1ダニング・クルーガー効果*2 によって、"入門","初級","初心者","baby","beginner"などの記述があっても、それが難易度を表現していない*3 ことがあります

何が言いたいかというと、"入門","初級","初心者","baby","beginner" という記述があったとして「こんなに難しいのに初心者向けなのか…」と諦めてしまうのはちょっともったいないと思っているということです(それは、自分の得意分野と違った領域であるかもしれません)

*1:競技の性質

CTFは出題範囲が広範囲に及びます

  • ネットワーク
  • Web技術(DBやバックエンドの技術も含まれたりする)
  • バイナリ(符号理論、信号処理、画像処理、組み込み技術etc..)
  • Pwn(exploitとか、CTFの華ですね)
  • Forensic(ファイルフォーマット、ファイルシステム、ログ解析、ディスク解析)
  • 暗号
  • Recon(OSINTを始めとした調査の技術)
  • その他、雑学

ある分野では"常識"(これが初級とかbabyとか表現されたりする)であっても、別の分野からすると未知の話だったりします

ちなみに「私この分野は素人なのですが…」といいながら、全ジャンルを満遍なく解かれる方も極稀にいらっしゃいますが、たいていは得意分野を中心に問題を解いている方が多い印象です

趣味(興味のある分野)を深く掘り下げると、その周りの分野も巻き込んで掘り進むので好きなことを続けるのが個人的にはいいのかなと思っています

*2:ダニング・クルーガー効果

いわゆるチョットデキル曲線です

ポイントは、初心者でも変態(褒め言葉)でも「初心者です」と言う点です

自身を過小評価する傾向は人間の自然な特性だと思っていて、むしろ健全な心の有り様かなと思っています
日本だと古来より"~道"(華道とか柔道とか)で表現してて、「完全に理解した」なんてなくて、ずっと先まで道が続いてて終わりはないという表現なのかと、CTFも然り

つまり、どんな問題でも"入門","初級","初心者","baby","beginner"と名付けられる可能性があります

*3:難易度を表現していない

競技プログラミングはスコアで定量的に測れますね
CTFは広大なコンピュータ技術の全領域を対象としているため、定量的に難易度(や、自身の技術レベル)を測ることが難しいと思っています(あと、別に測れなくてもいいのでは、とも思っています)
また、CTFで出題される問題の獲得点数で難易度の目安はわかりますが、そのCTF大会に閉じた相対的なものです
A大会のCTF 100点問題 と B大会のCTF 100点問題 が同程度の難易度とは限りません

その他 ご参考

"CTFってこういうものだよ"という解りやすいスライド

なんと初心者向けに勉強会を開催してくださっています!(行ったことはないんですが…)

良い本揃いです

同じく良書揃い

自分の過去のTweetを検索する方法

Added by kanata 9 months ago

OwnTweetSearch

自分の過去のTweetを検索する方法

Twitterしてると、たまに「あぁ~このタイムラインの話題、あの時つぶやいたあの話なんだよな~」と思う時があります
でも、後の祭りでなかなか検索できないんですよね
そんな訳で簡単に検索できるツールを作りました

前提

以下のコマンドが使える環境があること、仮想環境のLinuxとかWSLとか
Macは動かない気がするけど、中身をちょっと書き換えればいけると思う

  • jq,sed,awk,grep,tail

準備(自分の全ツイート履歴のダウンロード)

Twitterは自分の過去ツイートの全データをダウンロードできます
以下の手順を基にダウンロードします

zipで提供されるはずですので、中身を展開して確認しましょう
この中の tweet.js だけが必要です

OwnTweetSearch の導入

install

ダウンロードして、実行権つけて、一箇所中身の設定項目を書き換えるだけ

$ wget https://raintrees.net/attachments/download/709/OwnTweetSearch.sh
$ chmod u+x ./OwnTweetSearch.sh
$ vi OwnTweetSearch.sh
- MY_NAME="own-twitter-id" #自身のTwitterのidを設定
+ MY_NAME="ここに自分のTwitterのidの@を抜いた形で設定してください" #自身のTwitterのidを設定

中身

中身シェルスクリプトなので、どうということはない

#!/bin/bash

IFS='
'

MY_NAME="own-twitter-id" #自身のTwitterのidを設定
HIT_LIST=$(cat tweet.js |sed -e 's/window.YTD.tweet.part0 = //'|jq -r -c '.[]'|grep "$1")
HIT_COUNT=$(echo "${HIT_LIST}"|wc -l)
COUNT="1"

for RECORD in $HIT_LIST
do
  echo $RECORD
  ID=$(echo $RECORD|grep -o "\"id\":\".*\""|tr ',' '\n'|grep "\"id\":\".*\""|tail -1|awk -F'"' '{print $4}')
  SCREEN_NAME=$(echo $RECORD|grep -o "screen_name\":\".*\","|awk -F'"' '{print $3}')
  if [ -z "$SCREEN_NAME" ]
  then
    SCREEN_NAME=$MY_NAME
  fi
  echo "https://twitter.com/${SCREEN_NAME}/status/${ID}"
  if [ "$HIT_COUNT" -gt 1 ]
  then
    echo "-------------------- [$HIT_COUNT] --------------------"
    : $((HIT_COUNT--))
  fi
done

使い方

tweet.jsが同じディレクトリにある状態で、引数に検索した文字を入れるだけ
複数件あると複数件ひっかかる
該当のJSONとURLを出力する

$ ./OwnTweetSearch.sh 私見
{"retweeted":false,"source":"<a href=\"http://www.twitpane.com\" rel=\"nofollow\">TwitPanePlus</a>","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"display_text_range":["0","161"],"favorite_count":"32","in_reply_to_status_id_str":"1121753187784876032","id_str":"1121772687645237249","in_reply_to_user_id":"983655865474363392","truncated":false,"retweet_count":"9","id":"1121772687645237249","in_reply_to_status_id":"1121753187784876032","created_at":"Fri Apr 26 13:47:04 +0000 2019","favorited":false,"full_text":"@urbsxb4mu 私見でございますが…以下を順番に読むといい気がしております\n\n入門UNIXシェルプログラミング―シェルの基礎から学ぶUNIXの世界  ブルース・ブリン  (著)\nシェルプログラミング実用テクニック Kindle版 上田隆一  (著)\n\nワイ、入門シェルプログラミングの本でシェルスクリプトを覚(文字数","lang":"ja","in_reply_to_screen_name":"44GG44KT44GT","in_reply_to_user_id_str":"983655865474363392"}
https://twitter.com/44GG44KT44GT/status/1121772687645237249

$ ./OwnTweetSearch.sh 変態だ
{"retweeted":false,"source":"<a href=\"https://about.twitter.com/products/tweetdeck\" rel=\"nofollow\">TweetDeck</a>","entities":{"hashtags":[],"symbols":[],"user_mentions":[{"name":"シェル芸bot","screen_name":"minyoruminyon","indices":["3","17"],"id_str":"3978626952","id":"3978626952"}],"urls":[{"url":"https://t.co/hgjICWlvJF","expanded_url":"https://youtu.be/3OSJlfPag4A","display_url":"youtu.be/3OSJlfPag4A","indices":["36","59"]},{"url":"https://t.co/L8UwU6aKef","expanded_url":"https://twitter.com/yami_buta/status/1121942576657879040","display_url":"twitter.com/yami_buta/stat…","indices":["64","87"]}]},"display_text_range":["0","87"],"favorite_count":"0","id_str":"1121942740575461376","truncated":false,"retweet_count":"0","id":"1121942740575461376","possibly_sensitive":false,"created_at":"Sat Apr 27 01:02:48 +0000 2019","favorited":false,"full_text":"RT @minyoruminyon: 仮に変態だとしても変態という名の https://t.co/hgjICWlvJF だよ! https://t.co/L8UwU6aKef","lang":"ja"}
https://twitter.com/minyoruminyon/status/1121942740575461376
-------------------- [5] --------------------
{"retweeted":false,"source":"<a href=\"http://www.twitpane.com\" rel=\"nofollow\">TwitPanePlus</a>","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"display_text_range":["0","5"],"favorite_count":"1","id_str":"1012308409654231042","truncated":false,"retweet_count":"0","id":"1012308409654231042","created_at":"Thu Jun 28 12:15:07 +0000 2018","favorited":false,"full_text":"変態だった","lang":"ja"}
https://twitter.com/kanata201612/status/1012308409654231042
-------------------- [4] --------------------
{"retweeted":false,"source":"<a href=\"http://www.twitpane.com\" rel=\"nofollow\">TwitPanePlus</a>","entities":{"hashtags":[],"symbols":[],"user_mentions":[{"name":"","screen_name":"youkanyukari","indices":["3","16"],"id_str":"-1","id":"-1"}],"urls":[]},"display_text_range":["0","42"],"favorite_count":"0","id_str":"982603281049403394","truncated":false,"retweet_count":"0","id":"982603281049403394","created_at":"Sat Apr 07 12:57:32 +0000 2018","favorited":false,"full_text":"RT @youkanyukari: 超・記号オンリー難読化シェル芸 とか変態だ・・・","lang":"ja"}
https://twitter.com/youkanyukari/status/982603281049403394
-------------------- [3] --------------------
{"retweeted":false,"source":"<a href=\"http://www.twitpane.com\" rel=\"nofollow\">TwitPanePlus</a>","entities":{"hashtags":[],"symbols":[],"user_mentions":[{"name":"上田 隆一","screen_name":"ryuichiueda","indices":["3","15"],"id_str":"372780389","id":"372780389"}],"urls":[]},"display_text_range":["0","80"],"favorite_count":"0","id_str":"908140256137854976","truncated":false,"retweet_count":"0","id":"908140256137854976","created_at":"Thu Sep 14 01:28:04 +0000 2017","favorited":false,"full_text":"RT @ryuichiueda: 創造し続けようと思う人間には、変態しかあり得ない。人生は変態であり、変態だ。('シェル芸おじさん自叙伝 Ⅱ' p114514)","lang":"ja"}
https://twitter.com/ryuichiueda/status/908140256137854976
-------------------- [2] --------------------
{"retweeted":false,"source":"<a href=\"https://mobile.twitter.com\" rel=\"nofollow\">Twitter Web App</a>","entities":{"hashtags":[],"symbols":[],"user_mentions":[],"urls":[]},"display_text_range":["0","66"],"favorite_count":"6","id_str":"1183283246122946560","truncated":false,"retweet_count":"0","id":"1183283246122946560","created_at":"Sun Oct 13 07:28:04 +0000 2019","favorited":false,"full_text":"着圧ソックスが低気圧時の頭痛に効くっていうから物色してたんだけど、女性用しかないな。これを着ける…?変態じゃないか…(変態だけど…)","lang":"ja"}
https://twitter.com/kanata201612/status/1183283246122946560

jus共催 第45回せんせいがAIとか(中略)かんけいないけどシェル芸勉強会 に参加させて頂きました!

Added by kanata 9 months ago

実用的です!詳しくはリンク先を参照!
午前中はぷるさんによるJavaScriptの解説でした!
勉強になりました。

jus共催 第45回シェル芸勉強会リンク集 | 上田ブログ

このサイトではGoogle AdSenseやその他ソーシャルボタンのためにCookieを使用しています。もし同意いただけない場合はブラウザでクッキーを無効にして閲覧をお願いします。This site uses cookies for Google AdSense and some social buttons. If you cannot accept our use of cookies please disable cookies on your browser. Got It.

知見

sortのバージョンソート

やばいこれ、今まで知らなかった人生損してた
記号を挟んだ数値のレコードを適切にソートしてくれる
つまり、1と10のソートに対して、01と10に変換するような気を遣わなくてよい素敵な方法

$ cat test.txt
1.2
1.1
1.12
1.11
1.10
1.111

2019/1/30
2020/1/1
2019/10/20
$ cat test.txt |sort -V

1.1
1.2
1.10
1.11
1.12
1.111
2019/1/30
2019/10/20
2020/1/1

"バージョン"という言葉に惑わされがちだけれど、ipアドレスのソートもちろんできる
目から鱗

$ cat iplist.txt
20.1.2.1
221.111.49.1
192.168.30.1
168.192.0.1
202.145.12.1
34.23.10.1
12.132.12.1
230.2.1.1
30.1.11.1
192.168.0.1
$ cat iplist.txt |sort -V
12.132.12.1
20.1.2.1
30.1.11.1
34.23.10.1
168.192.0.1
192.168.0.1
192.168.30.1
202.145.12.1
221.111.49.1
230.2.1.1

uniq

重複がある行は出力しないuオプション

$ cat test.txt
aaa
aaa
aaa
bbb
bbb
ccc
ddd
$ cat test.txt |uniq -u
ccc
ddd

比較するフィールドを指定するfオプション、何文字分比較するか指定するwオプション

  • 1項目目から3文字分をキーとして比較し重複を排除
  • 2項目目から4文字分をキーとして比較し重複を排除(3が重複しているが、これはソート前に処理しているため、適切にソートしたら重複排除される)
$ cat test.txt
aaa 1111
aaa 1111
aaa 3333
bbb 1111
bbb 3333
ccc 2222
ddd 2222
$ cat test.txt |uniq -f 0 -w 3
aaa 1111
bbb 1111
ccc 2222
ddd 2222
$ cat test.txt |uniq -f 1 -w 4
aaa 1111
aaa 3333
bbb 1111
bbb 3333
ccc 2222

LT

いろいろ面白すぎる
冒頭のリンク先


AVTOKYO2019でお話した内容を改めてLTしました

異体字セレクタ難読化シェル芸(公開用).pdf

null

AVTOKYO2019の資料はここにまとめられています

1 2 3 ... 15 (1-10/145)

Also available in: Atom

Add picture from clipboard (Maximum size: 100 MB)