News

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

Added by kanata about 1 month ago

【問題と解答】jus共催 第48回引きこもりもりシェル芸勉強会 | 上田ブログ

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 3 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 4 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 4 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 6 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 7 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 8 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 8 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の資料はここにまとめられています

pagemapを追加しました

Added by kanata 9 months ago

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コードの順にソートしたい(シェル芸)

Added by kanata 9 months ago

この記事はシェル芸 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 ... 15 (1-10/143)

Also available in: Atom

Add picture from clipboard (Maximum size: 100 MB)