ニュース
jus共催 第48回引きこもりシェル芸勉強会
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ヤバい
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回引きこもりシェル芸勉強会
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に関してめっちゃ便利なツール群
ぱっと調べたら
— taka@SIではたらくフレンズ (@amanoese) April 25 2020
uninameコマンドなるものがあるらしい。https://t.co/t8aLV9BXj9#シェル芸
コマンド紹介 : 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を出力する
コロナの影響で家にいるみなさまは時間があれば薄い技術書を作ればいいじゃない!
※当情報は、 2020/4月時点の情報です。時間の経過と共に使えるなくなる部分が出てくるかもしれません。。
- CSS組版とは
- Install & Setup
- 使い方
- Markdownで無理やりRe:VIEWの機能に対応させる
- Re:VIEW → html に変換するタイミングでやりたいことをなんとかする
- html → pdf に変換するタイミングでなんとかする
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の環境が構築できます最高
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
使い方¶
とりあえずサンプルで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/<BR>/<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回人類はおそらくシェル芸に仕事を奪われるか奪われないかのどちらかであるシェル芸勉強会 に参加さ(文字数
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コメント)
第ニ回サイバーセキュリティ系LT会 in 東京において、質問を頂きました
「パソコンちょっとわかる」レベルの人のCTF入門は、どの本やサイトがおすすめですか?
への回答でございます
TL;DR¶
CTFは、解けた時が一番楽しい!!!!!!!11!1
ので 常設しているcpawCTFかpicoCTFをやってどんどん解いてみてください!
ここを読んでやってみる¶
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:ダニング・クルーガー効果¶
いわゆるチョットデキル曲線です
エンジニア用語の「完全に理解した」「何も分からない」「チョットデキル」は「ダニング・クルーガー効果」で簡単に説明ができます。これは一種の認知バイアスで能力の低い段階では自分の能力の低さを認識できないためです(過大評価しがち)。その反面で能力が高くなると過少評価しがちです。 pic.twitter.com/LGaJ4E5hWo
— おちゃめ (@ochame_nako) April 8 2019
自信と理解度の関係を図にしました。#完全に理解した pic.twitter.com/SA638Vy9UH
— 廻転楕円体๑2/2 DENDRA!Reincarnation出演 (@kaitendaentai) October 17 2018
ポイントは、初心者でも変態(褒め言葉)でも「初心者です」と言う点です
自身を過小評価する傾向は人間の自然な特性だと思っていて、むしろ健全な心の有り様かなと思っています
日本だと古来より"~道"(華道とか柔道とか)で表現してて、「完全に理解した」なんてなくて、ずっと先まで道が続いてて終わりはないという表現なのかと、CTFも然り
つまり、どんな問題でも"入門","初級","初心者","baby","beginner"と名付けられる可能性があります
*3:難易度を表現していない¶
競技プログラミングはスコアで定量的に測れますね
CTFは広大なコンピュータ技術の全領域を対象としているため、定量的に難易度(や、自身の技術レベル)を測ることが難しいと思っています(あと、別に測れなくてもいいのでは、とも思っています)
また、CTFで出題される問題の獲得点数で難易度の目安はわかりますが、そのCTF大会に閉じた相対的なものです
A大会のCTF 100点問題 と B大会のCTF 100点問題 が同程度の難易度とは限りません
その他 ご参考¶
"CTFってこういうものだよ"という解りやすいスライド
なんと初心者向けに勉強会を開催してくださっています!(行ったことはないんですが…)
良い本揃いです
同じく良書揃い
自分の過去のTweetを検索する方法
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とか(中略)かんけいないけどシェル芸勉強会 に参加させて頂きました!
実用的です!詳しくはリンク先を参照!
午前中はぷるさんによる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の資料はここにまとめられています
pagemapを追加しました
lrsjng/pagemapを使って当サイトにpagemap機能を追加しました
縦に長い記事が少し扱いやすくなったと思います
セットアップ手順は以下
https://raintrees.net/projects/a-painter-and-a-black-cat/wiki/Redmine#PageMap%E3%81%AE%E8%BF%BD%E5%8A%A0
ASCIIコードだけどEBCDICコードの順にソートしたい(シェル芸)
この記事はシェル芸 Advent Calendar 2019の13日目の記事です。
カレンダーに空きがあって、せっかくなので、ちょっと前に書いたブログに加筆して再公開します
それでですね、標題の話を聞いた。よくある話らしい
つまり、今までメインフレームでソート処理してたんだけど、オープン化したら文字コードがASCIIに変わってソートした結果の並び順が変わってしまった。前と同じにしたい、と。。
ASCIIコードとEBCDICコードは同じアルファベットでも割り当てられている値が異なるので、当然そのままソートすると結果が異なる
文字コード¶
ASCIIコード¶
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
---|---|---|---|---|---|---|---|---|
0 | NUL | DLE | SP | 0 | @ | P | ` | p |
1 | SOH | DC1 | ! | 1 | A | Q | a | q |
2 | STX | DC2 | " | 2 | B | R | b | r |
3 | ETX | DC3 | # | 3 | C | S | c | s |
4 | EOT | DC4 | $ | 4 | D | T | d | t |
5 | ENQ | NAC | % | 5 | E | U | e | u |
6 | ACK | SYN | & | 6 | F | V | f | v |
7 | BEL | ETB | ' | 7 | G | W | g | w |
8 | BS | CAN | ( | 8 | H | X | h | x |
9 | HT | EM | ) | 9 | I | Y | i | y |
A | LF/NL | SUB | * | : | J | Z | j | z |
B | VT | ESC | + | ; | K | [ | k | { |
C | FF | FS | , | < | L | \ (¥ ) | l | | |
D | CR | GS | - | = | M | ] | m | } |
E | SO | RS | . | > | N | ^ | n | ‾ |
F | SI | US | / | ? | O | _ | o | DEL |
列が上位3ビット、行が下位4ビットを表す
例えば、"a"だったら0x61
ASCIIコードは7bitで文字を表現している
EBCDICコード(英小文字を拡張したケース)¶
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | NUL | DLE | DS | (予約) | SP | & | - | { | } | \ | 0 | |||||
1 | SOH | DC1 | SOS | (予約) | / | a | j | ~ | A | J | 1 | |||||
2 | STX | DC2 | FS | SYN | b | k | s | B | K | S | 2 | |||||
3 | ETX | TM | WUS | IR | c | l | t | C | L | T | 3 | |||||
4 | SEL | RES/ENP | BYP/INP | PP | d | m | u | D | M | U | 4 | |||||
5 | HT | NL | LF | TRN | e | n | v | E | N | V | 5 | |||||
6 | RNL | BS | ETB | NBS | f | o | w | F | O | W | 6 | |||||
7 | DEL | POC | ESC | EOT | g | p | x | G | P | X | 7 | |||||
8 | GE | CAN | SA | SBS | h | q | y | H | Q | Y | 8 | |||||
9 | SPS | EM | SFE | IT | i | r | z | I | R | Z | 9 | |||||
A | RPT | UBS | SM/SW | RFF | ¢ | ! | ¦ | : | ||||||||
B | VT | CU1 | CSP | CU3 | . | $ | , | # | ||||||||
C | FF | IFS | MFA | DC4 | < | * | % | @ | ||||||||
D | CR | IGS | ENQ | NAK | ( | ) | _ | ' | ||||||||
E | SO/LS1 | IRS | ACK | (予約) | + | ; | > | = | ||||||||
F | SI/LS0 | IUS/ITB | BEL | SUB | ¬ | ? |
列が上位4ビット、行が下位4ビットを表す
例えば、"a"だったら0x81
という訳で数字、英小文字、英大文字の出現順番が違うのでソートしても同じ結果にならないんですね
テストデータ¶
$ cat testdata.txt
AAA1001
ABA0100
BBB0010
XXX0201
01C0020
02D0002
90E3000
普通にソート¶
$ cat testdata.txt |sort
01C0020
02D0002
90E3000
AAA1001
ABA0100
BBB0010
XXX0201
アルファベットから始まるデータが後ろに来ている
EBCDICのコード順でソートした場合を想定すると英大文字、英小文字、数字の順でソートされるはず
EBCDIC順にソートシェル芸¶
こんな感じかな
$ cat testdata.txt|tr a-zA-Z0-9 0-9A-Za-z|sort|tr 0-9A-Za-z a-zA-Z0-9
AAA1001
ABA0100
BBB0010
XXX0201
01C0020
02D0002
90E3000
数字、英小文字、英大文字をEBCDICの順番に文字を入れ替えた上でソートして、ソート後にもとに戻す
厳密には、記号の並び順までtrで対応付けなければいけないと思うけれど、こんな感じでいけるのでは
trめっちゃ便利やなぁ
関連情報¶
漢数字ソートを応用してもできる気がする
上田ブログ 本日観測したシェル芸その2(漢数字のソート)
https://b.ueda.tech/?post=10610
俺的備忘録 〜なんかいろいろ〜 ターミナル上で漢数字ソートを行う
https://orebibou.com/2017/10/%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E4%B8%8A%E3%81%A7%E6%BC%A2%E6%95%B0%E5%AD%97%E3%82%BD%E3%83%BC%E3%83%88%E3%82%92%E8%A1%8C%E3%81%86/
« 前 1 2 3 4 ... 16 次 » (11-20/153)
他の形式にエクスポート: Atom