たいちょーの雑記

ぼくが3日に一度くらい雑記をかくところ

終わりを出力するコマンドつくった

ここが、終わりの地

つくってみました

owariコマンド

github.com

終わりにまつわるAAを出力するだけのコマンドです

ScreenShot

Install

$ go get -u github.com/xztaityozx/owari

もしくはreleaseからバイナリをダウンロードし、PATHの通った場所に置きます

つかいかた

  • 重い処理とともに!

  • イルミネーションに!

  • killコマンドの代わりに!

その他色々

シェル芸Bot

使えます

シェル芸人の皆様がいろいろな作品を生み出しているので、見てみると楽しいかもしれません

おわりに

AAの追加とか機能追加はIssueやPRしてください!どうぞどうぞ!

ぼくの今年まとめ

どうも

この記事は無ですが,まあとりあえず書きます

1月

Visual Studio拡張機能を作る

2月

AtCoderのレートがガタ落ちする

3月

大学を卒業する

シェル芸勉強会に参加する

4月

シェル芸勉強会で超・記号オンリー難読化シェル芸を発表する

大学院に入学する

自転車を買う

車にひかれる

5月

研究を自動化してサボり始める

6月

留学のために英語でランチミーティングする会に参加する.ほぼだれも飯食ってなかった.

7月

レポートを書く

ICPCの模擬でSelectedになる

大雨でお家に帰れなくなる

ICPCの国内予選で敗退する

ゼミ室にて一人シェル芸勉強会を開催する

キャンパスの近くが震源になる

8月

留学準備をする.金が底をつく

cdxをGo Langで作り直す

9月

留学出立前日にシェル芸勉強会に参加する

そのあと腹を壊し留学できなくなる

LINEのハッカソンに参加する

WebExtensions使ってブラウザの拡張機能作る

10月

新学期が始まる.授業がつらい

留学に行ってきた同期にデカい顔をされる

シノアリスを始める

11月

文化祭を飛ばしてシェル芸勉強会に参加する

就活を始める

坐骨神経痛になる

12月

就活が終わる

AtCoderのレートが戻ってくる

ゼミ飲み会をとばしてシェル芸勉強会に参加する.LTで発表した自作コマンドがシェル芸Bot入りする

キズナアイのライブに参加する

まとめ

振り返ってみるといろいろ始めましての年でした.

Go Langを始めたのも本年です.とても楽しい言語ですね.

坐骨神経痛はここから永遠に付き合うので早く出て行ってほしいですね.

留学も初めてでした.いけませんでしたが.

ライブ参加も初めてでした.キズナアイはずっと前から応援していましたが,彼女が夢に向かって着実に進んでいることを実感して感動しました.

就活も初めてでした.ずいぶん楽な就活させてもらったと思います.

来年は上京費を稼がないといけないのでたぶんバイトを始めます.すごい憂鬱です.誰か雇ってください

第39回シェル芸勉強会大阪サテライトへ参加してきました

参加しました

2018/12/22大阪で行われた第39回シェル芸勉強会大阪サテライトへ参加してきました.

午前

今回も鳥海さんによる文字コードについてでした.前回参考文献にあがっていたユニコード戦記を読んでおいたのでどのへんの話かな~と楽しみにしてました.

資料はここで公開されています.今回の話もとっても楽しかったのでアーカイブで見ることをオヌヌメします.

今回からUnicodeについてでした.今回特に印象に残ったのはBOMについてです.

BOMに使われているのは\U+FEFFですが,これにはゼロ幅文字が割り当てられていて,データの先頭にあるかどうかでこの値の意味が変わるらしいというのが最悪感でててよかったです

過去にBOMにひどい目にあわされたので恨みからか気づいたらBOMを💣爆破💣して目的の文字列を得る難読化をその場で組んでいました.

# sedでBOMを取り除くことでdateになる文字列を使ってシェル芸してみる
$ echo –n 搀愀琀攀|iconv -t utf-16|sed 's/^\xff\xfe//g'
date
# xxdで見てみる. BOM(fffe)を取り除けばdateになることが分かる
$ echo -n 搀愀琀攀|iconv -t utf-16|xxd 
00000000: fffe 0064 0061 0074 0065                 ...d.a.t.e

まぁこんな感じです.

他にはUTF-32は結合文字のせいで1文字=32bitとはならないというのがまた最悪感あってよかったです.

嬉しいことに次回も文字コードらしいので楽しみですね.

午後

今回も初心者向けの問題セットらしいです.たぶん嘘だと思っていたので裏切られてもあんまりダメージはなかったです.

問題と解答例はここにあります

Q1

wrong.mdというMarkdownファイルの文法ミスをワンライナーで何とかする問題.ここ最近の1問目で一番難しかった気がします.実際時間内に正規表現が書ききれませんでした.

解答例ではsedの後方参照と最短一致する正規表現をそれそれ~と書くというやつでした.

Q2

attendee.md のデータを並び替える問題.親の要素は数値,子の要素は開催地でソートするという感じですね.

$ cat attendee.md|sed 's/第\(3[0-9]\)回.*/\1/g'|
tr -d '*:'|
sed 'y/東京大阪福岡/112233/'|
awk 'NF==1{k=$1}NF==2{map[k,$1]=$2}END{ for(i=34;i<38;i++) {print "- 第"i"回シェル芸勉強会";print "福岡: "map[i,33];print "大阪: "map[i,22];print "東京: "map[i,11]}}'|
awk 'NF==2{print}'
- 第34回シェル芸勉強会
大阪: 16
東京: 19
- 第35回シェル芸勉強会
大阪: 10
東京: 27
- 第36回シェル芸勉強会
東京: 38
- 第37回シェル芸勉強会
福岡: 8
大阪: 10
東京: 21

awkの配列を使うことにしました.二次元配列の各位置に放り込んで順番に出してるだけですね.

解答例は良い感じに値を付けてあげてsortコマンドに任せるというやつでした.すげースマート.見習っていきたい

Q3

wgetgoogle.comからindex.htmlを取得した後,上の方にある<meta content="...."という要素があるのでここのメッセージを読む問題.

$ cat index.html|sed 's/.\+\(<meta content=.*name="description">\).\+/\1/'|head -n1|awk '{print $2}'|nkf --numchar-input
content="世界中のあらゆる情報を検索するためのツールを提供しています。さまざまな検索機能を活用して、お探しの情報を見つけてください。"

sedheadでほしい部分を取り出してnkf --numchar-inputUnicode参照を変換します.しかし取り出す必要はなく,読めればいいので最初からnkfに通せば良かったみたいですね.

Q4

さっき取得したindex.htmlからscript要素とstyle要素を取り出して,それぞれindex.jsindex.cssに書きだす問題.実用的だな

$ cat index.html|pee 'pup "script json{}"|jq -c ".[].text" > index.js'  'pup "style json{}"|jq -c ".[].text" > index.css'

悪戦苦闘していたのですが,Twitterpupというツールがあるというのを知り,

github.com

これとpeeでなんとかクリアしました.pupめっちゃ便利っすね

Q5

さっきまで使っていたindex.htmlからscriptstyle以外の要素をindex_no_cssjs.htmlへ書き出す問題.jqのなかでうまく否定文が書けなくて四苦八苦してたら時間切れになってしまった...

Q6

index.js内でエスケープされてる文字を復元する問題

$ echo -e $(echo -e $(echo -e "$(cat index.js)" ))|nkf --numchar-input
...省略...

エスケープを解除するだけならechoでいいんじゃないかと思ったので重ねてみました.echoでできないUnicode参照はnkfで.解答例と一応比較してみます

# 解答例
$ sed 's/\\\\u\(....\)/\&#x\1;/g' index.js | nkf --numchar-input | nkf --numchar-input | sed 's/\\x22/"/g' | sed 's/\\x3d/=/g' | sed 's/\\\\/\\/g'|tr -d \\n|cat - <(echo)|grep -o . > A.txt
# 僕の解答
$ echo -e $(echo -e $(echo -e "$(cat index.js)" ))|nkf --numchar-input|grep -o . > B.txt 
# diff
diff A.txt B.txt                                                                                                                  
2696a2697
>  
2879a2881
>  
3039a3042
>  
3123a3127
>  
3124a3129
>  
3129a3135
>  
3615a3622
>  
4494a4502
>  

なんか違うらしいので覗いてみます.

# 解答例の2690~2699文字目
$ cat -n A.txt| grep "^  269."
  2690 e
  2691 .
  2692 f
  2693 =
  2694 {
  2695 }
  2696 ;
  2697 v
  2698 a
  2699 r
# 僕の解答の2690~2699文字目
$ cat -n B.txt| grep "^  269."
  2690 e
  2691 .
  2692 f
  2693 =
  2694 {
  2695 }
  2696 ;
  2697  
  2698 v
  2699 a

;の後にスペースがあるみたいですね.他もそんな感じだったので,十分echoでよさそうですね

Q7

table.md内にあるMarkdownで書かれた表の縦横を変換する問題.

$ cat table.md|sed 's/|\|-\|://g'|sed '/^$/d'|awk '{x[1]=x[1]"|"$1;x[2]=x[2]"|---";x[3]=x[3]"|"$2;x[4]=x[4]"|"$3}END{for(k in x) print x[k]"|"}'
|回|38回|37回|36回|35回|34回|33回|32回|31回|30回|29回|
|---|---|---|---|---|---|---|---|---|---|---|
|年月|201811|201809|201807|201804|201803|201801|201712|201710|201708|201706|
|人数|37|39|38|37|35|40|39|37|46|55|

愚直に書きました.awkに各要素を整形しながら詰めていってEND{}で出力しています.tateyokoとかrs -Tを使ってもよかったんですが,ぱっと思いついたので

Q8

yabatanienというファイルの色を変化させ続けてください.何を言ってるんだ・・・・

問題設定に変なのがない(Q1除く)ので安心しきっていたんですが,終わりの時間に爆弾が来て放心状態になりました.

$ cat yabatanien|while read L; do x=$(echo {0..9}|xargs -n1|shuf -n1); echo -e $L|sed "s/9[0-9]m/9${x}m/g"; done

img

一応やってみたんですが崩れてしまいました・・・まぁ読めなくはないし・・・?(苦しい)

LT

www.slideshare.net

github.com

今回もヤバい難読化シェル芸を考えてきました.ワタナベ難読化シェル芸といいます.

きっかけは前回シェル芸勉強会の大阪LT後,配信外で渡る世間はナベばかりという神経衰弱の紹介でした.ぱっと見の難易度の高さからヤバかったのですが,その時「難読化に使えるわこれ」と思った僕もだいぶヤバそうですね

今回作った難読化ツールnocがシェル芸Bot入りしたことと,皆さんにnocで遊んでもらえたのがとてもうれしかったです.

これを考えたのは朝4時の研究室でした.一緒に考えてくれた友人には感謝しています.おかげでヤバい難読化シェル芸ができました.

詳しい説明とかはまた別記事で書きたい気がします.

終わりに

今回も楽しかったです!文字コードパワーとシェルパワーがまた少し上がった気がします.企画・運営をやってくださった皆々様本当にありがとうございました!

紲星あかりとともに生きたい

OIT Advent Calendar 2018!! 今年もやります

この記事は、 OIT Advent Calendar 2018の1日目の記事です。

adventar.org

やってきたぞOIT Advent Calendar!!! 一日目はたいちょーがやります.去年,一昨年も参加させていただきました.うふふ

xztaityozx.hatenablog.com

xztaityozx.hatenablog.com

特にWSLの記事はいまだに伸びてて,思いがけずこのブログの看板記事になっているんですが,もう1年前の記事なので・・・と思ったり.ぼくはこのころからさほど変えてないので新たに書けることがない!

12/22は誕生日だぞ!

実は12/22はぼくの誕生日なんです.そして同時にVOICEROID2 紲星あかりの誕生日でもあります.いやーおめでたいですね.

別記事にも書いていますが,誕生日が一緒だったので発表後すぐに購入を決意しました.かわいいし.

動画投稿などは考えてなかったので,Markdownの校正やネット記事の読み上げ,ビルドの終了通知などにあかりちゃんを使っています.とてもかわいい声で読み上げてくれるので最高です.

これらについては以前にも記事を書いていますので,そちらをご覧ください。

xztaityozx.hatenablog.com

xztaityozx.hatenablog.com

xztaityozx.hatenablog.com

あかりちゃんを開発しよう

VOICEROIDは割といろいろ使われています.動画で喋るのももちろんですが,ニコ生のコメ読み上げやVTuberの声の代わりをしたりします.VOICEROID自体は入力されたテキストを音声化することなので,色んなことをするために色んな人々がツールを開発・公開しています.

ch.nicovideo.jp

www.okayulu.moe

しかしVOICEROID側が特別APIを公開しているわけではないです.そういったツールはUI Automationなどを使って,プログラムからVOICEROIDのエディターを操作することで 実現されています. こういう操作の部分だけをライブラリにして公開しているリポジトリなども存在するので,それを使って実装したりもします.言語はC#pythonをよく見かけます.

github.com

hgotoh.jp

これまで僕が作ってきたVOICEROID,もしくは棒読みちゃん用のツールもVOICEROIDを操作するためにライブラリを使っていたりします.

ここから本題

ぼくはレポートを書くときにWordを使いがちなんですが,Typo検出に音声読み上げを使います.Wordの校正タブにある読み上げ機能でもいいんですが,あかりちゃんに比べて可愛くないので,文章をコピペしてあかりちゃんに読み上げてもらっていました.この手順は

  1. 読み上げたい部分をコピー
  2. VOICEROID2 エディターに張り付け
  3. 再生ボタンを押す
  4. Typo検出(かわいい)

というステップを踏みます.しかし目的であるTypo検出までの手順が多すぎます.細かなキー操作とかも考えると非常に面倒です.そこで思いました.「WordからVOICEROID操作したらいいじゃん!」

Word2Voiceroid2

今回作ったのはMS WordからVOICEROID2を操作できるWordアドインです.ライセンスはMITです.

github.com

主に以下のような機能を持ちます.

  • 文章全体の再生
  • 選択している文章だけ再生
  • カーソル位置以降の文章の再生
  • 区切り文字を指定して分割再生
  • 音声の保存.分割保存
  • キャラクターの切り替え
  • 音量・高さ・話速・抑揚の調節

Word2Voiceroid2を追加するとWordにVOICEROID2を操作するリボンが追加されます.見たらわかるぐらいのUIを目指したんですがセンスがないのでごちゃついてしまいました.

img

適当に動画を撮ってみたのでどうぞ
いったん消します

分割保存について

VOICEROIDエディターの標準機能とほぼ同じ動きをしますが,標準機能を呼び出すわけではありません.これは利用したライブラリにそういうメソッドが用意されてなかったからです.以下のような特徴を持ちます.

  • Word2Voiceroid2では[句切る]にチェックを入れているときしか使えません.
  • 保存時はファイル名を指定するのではなく,ディレクトリを指定します.指定された場所に1から始まる連番のファイル名で保存されます.

インストール

WordにWord2Voiceroid2をインストールする方法を提供・・・しようかとおもったんですが,最初から自分向けで配布を考えてなかったのでVisual Studioでビルドする方法しかわからない

Visual Studioを使う方法

面倒なのでお勧めしません

  1. TTSController に依存するのでDLLをビルドするなりして手に入れてください.
  2. このリポジトリをクローンします.
  3. Visual StudioでWord2Voiceroid2のプロジェクトを開いて,TTSControllerを参照に追加します.
  4. ビルドします.
  5. Wordに追加されます.

終わりに

は~~~あかりちゃんかわいい.これでまたあかりちゃんとともに過ごせる時間が増えますね.は~~うれしい.サイコ―にハッピーです.

Wordデフォルトの音声読み上げでもいいですが,是非お気に入りVOICEROIDにお手伝いしてもらってはいかがですか?

明日はwhesonくんです!とっっっっっっっても楽しみですね!!

第38回シェル芸勉強会@大阪サテライトに参加しました

シェル芸勉強会に参加してきました

参加しました

ライブストリーミングYouTube上にも残っているので気になる方はご覧くださいな

www.youtube.com

午前の部

前回に続き、鳥海さんによる文字コードのお話でした。

twitter.com

まずはShift-JISについてで、歴史的経緯や区点番号についてなどが語られました。
特に興味深かったのはダメ文字についてで、

$ echo|nkf -s
[文字化け]\
$ echo|nkf -s
[文字化け]|

と言うようにnkfなどを使ってShift-JISに変換すると、2byte目に制御文字が出てきてしまう文字をダメ文字と言うらしいです。

\が出てしまうものをソ系|が出てしまうものをポ系のダメ文字と呼ばれていると言うのがとても面白かったです。

というわけでテキトウに難読化に使ってみました。

$ eval "$(__=$(nkf -s <(echo));echo echo ZGF0ZQo=${__:1}base64 -d${__:1}bash)"
2018113日 土曜日 21:24:14 JST

変数への代入と展開でパイプを隠蔽してみました。何かに応用できたら良いですね!

午後の部

今回は事前に数学系だと聞いていたのでヤバそうだなーと思いながら挑みました。問題と解答例はここです。

問1

echo 'jus共催 第38回҈҈҉҈҈҉シ҈҉ェ҈҉ル҈҉芸҈҉勉҈҉強҈҉会' からはじめて、文字列中のモヤモヤを取る問題。モヤモヤの正体はキリル文字の結合文字なのでxxdなどでバイナリ値を見て削るのが良さそう

$ echo 'jus共催 第38回҈҈҉҈҈҉シ҈҉ェ҈҉ル҈҉芸҈҉勉҈҉強҈҉会' | xxd -ps
7573e585b1e582ac20e7acac3338e59b9ed288d288d289d288d288d289
e382b7d288d289e382a7d288d289e383abd288d289e88ab8d288d289e58b
89d288d289e5bcb7d288d289e4bc9a0a

d288d289 というのがキリル文字っぽいのでsedで取り除く

$ echo 'jus共催 第38回҈҈҉҈҈҉シ҈҉ェ҈҉ル҈҉芸҈҉勉҈҉強҈҉会' | xxd -ps | sed 's/d28[8|9]/g|xxd -ps -r'
jus共催 第38回シェル芸勉強会

後はxxdでもとに戻せばOKですね。絵面はヤバイですが簡単な問題でした。

問2

任意の文字列に含まれる文字の内、提供されたファイル 仏説摩訶般若波羅蜜多心経 の中身にも含まれる文字を探す問題。例を挙げると

$ echo 不摂生|何らかのワンライナー
不
生

ファイルの中に不と生だけが含まれているので、こう出力するのが正しいというわけですね。それではやってみましょう

$ echo 不摂生|grep -o .|xargs -n1 -I@ echo "grep @ ./仏説摩訶般若波羅蜜多心経 &> /dev/null && echo @"|bash
不
生

最近 |xargs -n1 -I@ echo "ワンライナー" | bash というパターンにハマっているのでこの問題もコレでやってみました。不摂生という文字列をgrep -o .で1文字ずつに区切った後、それぞれgrepでファイルから検索しています。正常終了すれば含まれるので、echo しておきます。

問3

提供されたファイルedoの中身を年代順に並べてください

# cat ./edo
元禄
安政
元和
享保

元号を年代順に並べる問題ですね。本当の問題文にはヒントがあり、スクレイピングをすると良いらしいです。それではやってみます

$ w3m -dump "ja.wikipedia.org/wiki/元号一覧_(日本)" | grep -f <(cat ./edo)|tail -n4
                元和1615-1624
                元禄1688-1704
                享保1716-1736
                安政1855-1860

ちょっと余計なのがついてますが、w3mで取ってきて、grepするとキレイに並んでいるのが見つかりました。下から4行がコレだったのでtail -n4で取り出して答えです。

問4

エクセルの列番号XYZは何番目でしょうか。

エクセルなどの表計算ソフトでは列にアルファベットを使った26進数がよく使われるのですが、この並びの中でXYZが何番目かを求めます。コレはなぜか問題ページに答えが書いてあったので、コレしか思いつかねえなと思って流しました。

$ echo {A..Z} {A..Z}{A..Z} {A..Z}{A..Z}{A..Z} | tr ' ' \\n | grep -n XYZ
16900: XYZ

ブレース展開で列番号を作ってgrepするだけですね。

問5

罠にドはまりしてたので修正しました

標準偏差が10、平均が0の正規分布に従う乱数を発生させてヒストグラムを出してください

????????なんで????

$ csharp -e "
var rnd = new Random();
double X,Y;
double z1,z2;
for(var i=0;i<10000;i++) {
X=rnd.NextDouble();
Y=rnd.NextDouble();
z1=Math.Sqrt(-2.0*Math.Log(X)) * Math.Cos(2.0*Math.PI*Y);
z2=Math.Sqrt(-2.0*Math.Log(X)) * Math.Sin(2.0*Math.PI*Y);
Console.WriteLine((int)(z1*10+1000));
Console.WriteLine((int)(z2*10+1000));
}"|sort |uniq -c|sort -n -k2|awk '{for(i=0;i<$1/20;i++){printf "@"}print "\t"$1,$2-1000}'
@       1 -40
@       1 -37
@       3 -36
@       1 -34
@       2 -33
@       4 -32
@       7 -31
@       18 -30
@       13 -29
@@      22 -28
@       19 -27
@@      28 -26
@@      36 -25
@@@     48 -24
@@@@    75 -23
@@@@    77 -22
@@@@@   92 -21
@@@@@@  109 -20
@@@@@@@ 138 -19
@@@@@@@@@       169 -18
@@@@@@@@@@@     212 -17
@@@@@@@@@@@@@   241 -16
@@@@@@@@@@@@@@  268 -15
@@@@@@@@@@@@@@@@@       335 -14
@@@@@@@@@@@@@@@@@@@@    385 -13
@@@@@@@@@@@@@@@@@@@@@   414 -12
@@@@@@@@@@@@@@@@@@@@@@@ 454 -11
@@@@@@@@@@@@@@@@@@@@@@@@        467 -10
@@@@@@@@@@@@@@@@@@@@@@@@@@      515 -9
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  594 -8
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 617 -7
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@   736 -6
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@   734 -5
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  754 -4
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@   729 -3
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  759 -2
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@        791 -1
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@       804 0
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@       811 1
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@        791 2
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@      678 3
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  742 4
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  754 5
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@       648 6
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  590 7
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  587 8
@@@@@@@@@@@@@@@@@@@@@@@@@@@     537 9
@@@@@@@@@@@@@@@@@@@@@@@ 442 10
@@@@@@@@@@@@@@@@@@@@    397 11
@@@@@@@@@@@@@@@@@@@@    398 12
@@@@@@@@@@@@@@@@@       324 13
@@@@@@@@@@@@@@  279 14
@@@@@@@@@@@@    225 15
@@@@@@@@@@@     215 16
@@@@@@@@@@      184 17
@@@@@@@@        144 18
@@@@@@  115 19
@@@@@@  105 20
@@@@    73 21
@@@@    71 22
@@@     54 23
@@@     42 24
@@      30 25
@@      26 26
@       15 27
@       15 28
@       12 29
@       7 30
@       5 31
@       4 32
@       3 33
@       2 34
@       1 35
@       1 36
@       1 40

ヒストグラムは解答例を参考にしました。乱数生成はC#を使ってボックスミューラー法で行います。

問6

広済寺ホームページから妙法蓮華経の全文をダウンロードして、仏説摩訶般若波羅蜜多心経 と4文字連続で一致するところを探しなさい

なに?

$ cat ./myoho_shinji.txt|grep -of <( cat ./仏説摩訶般若波羅蜜多心経|sed 's/。/\n/g'|sed '/^$/d'|sed 's/..../&\n/g'|sed '/^$/d'|grep -o ....)|sort |uniq 
究竟涅槃
三世諸仏
即説呪曰
得阿耨多
般若波羅
亦復如是
羅三藐三

多分誤答です。コレは4文字ずつぶつ切りにして検索しただけなので。問題の意図は1文字ずつずらした4文字連続とのこと。これは時間内に解けませんでした。一番難しかった・・・

問7

a^2+b^2a*b+1で割り切れる正の数の組み合わせを生成してください。またチェックできたらしてください

$ echo {1..1000}_{1..1000} |tr ' ' '\n'| awk -F_ '$1<$2&&($1*$1+$2*$2)%($1*$2+1)==0{print $1,$2,($1*$1+$2*$2)/($1*$2+1),sqrt(($1*$1+$2*$2)/($1*$2+1))}'|column -t         

$ csharp -e "for(var a=1;a<1000;a++) for(var b=1;b<1000;b++) if((a*a+b*b)%(a*b+1)==0) Console.WriteLine($\"{a} {b}\");"|awk '{print $1,$2,($1*$1+$2*$2)/($1*$2+1), sqrt(($1*$1+$2*$2)/($1*$2+1))}'|column -t         

2    8     4    2
3    27    9    3
4    64    16   4
5    125   25   5
6    216   36   6
7    343   49   7
8    30    4    2
8    512   64   8
9    729   81   9
10   1000  100  10
27   240   9    3
30   112   4    2
112  418   4    2

チェックが甘いですが、これで解答としました。どちらもa,bを1から1000で動かして全探索しました。

問8

x[i+1]=a*x[i]*(1-x[i]) を無限に繰り返し、重複しないように1,000,000個数を出力する問題。x[0]=0.5、aは任意だが3<=a<4

awkではじめてと書いてあるのでawkでストリームを作って重複処理をすれば良さそうです

awk 'BEGIN{x=0.5;a=3.0;while(1){x=a*x*(1-x);print x}}'|awk '{x[$1]++;if(x[$1]==1)print $1}'|head -n1000000

先のawkで無限に数を生成し、後のawk連想配列を用いた重複の除外を行っています。しかしコレ、1,000,000個出そうと思っても桁が足りず一生終わらないので、awkOFMT="%0.20f"をつけなければならないです。

さらにこの問題実はカオスなので(カオス理論の方)、適切にaを与えれば重複処理が必要ないです。なので最終的には

$ awk 'BEGIN{OFMT="%0.20f";x=0.5;a=3.99;while(1){x=a*x*(1-x);print x}'|head -n1000000

です。

LT

今回もLTさせてもらいました。初っ端だったので緊張しましたが

www.slideshare.net

今回は~/.bashrcにイタズラされてしまったので、その対抗策として~/.bashrcを難読化する手法を提案しました。
欠点だらけなんですが、まあ大目に見てほしいです

終わり

今回もとても楽しかったです。東京会場のLTも盛り上がったみたいのでこれからアーカイブを見ようと思います。参加された皆様、企画側の皆様、ありがとうございました!

VSCodeからあかりちゃんに喋ってもらいたかったから拡張機能作った

VSCodeから棒読みちゃんに喋ってもらう拡張機能作りました

作りました

動機

xztaityozx.hatenablog.com
xztaityozx.hatenablog.com

これまで作ってきた拡張機能のおかげで今PC上で生活するうちの半分ぐらいをあかりちゃんとともに過ごしているわけですが、正直まだちょっと足りないので今度はVSCode拡張機能に挑戦しました。

VSCBouyomi

例によって拡張機能越しに棒読みちゃんを操作する系です。 inst1

特に設定なしにインストールするだけで始められます。

使い方

インストールするとデフォルトだとCtrl+Shift+Pに割り当ててあるコマンドパレットから以下のコマンドが使えます。一緒に表記してある内部コマンドを使えば任意のキーバインドも設定できます。たぶん

  • VSCBouyomi : Talk : 読み上げ
    • 内部コマンド : vscbouyomi.talk
  • VSCBouyomi : Skip : 読み上げのスキップ
    • 内部コマンド : vscbouyomi.skip
  • VSCBouyomi : Pause : 読み上げの一時停止
    • 内部コマンド : vscbouyomi.pause
  • VSCBouyomi : Resume : 読み上げの再開
    • 内部コマンド : vscbouyomi.resume

usage2
vscbouyomi.talkを実行すると文章全体を読み上げます。このとき文字列が選択してあるならそこだけを読み上げます。

設定

大した設定もないですが
詳しい値などは棒読みちゃん付属のSampleSrc.txtをお読みください

項目 説明
vscbouyomi.encoding utf-8 or shift-jis or unicode 読み上げる文章のエンコーディングです
vscbouyomi.delimitor 文字列のリスト 文章の区切りを指定できます
vscbouyomi.skipblank true or false trueのとき空白行を飛ばします
vscbouyomi.speed 数値 棒読みちゃんの読み上げ速度です
vscbouyomi.tone 数値 棒読みちゃんの音程です
vscbouyomi.voice 数値 棒読みちゃんの声です
vscbouyomi.volume 数値 棒読みちゃんの音量です

既知のバグ

読み上げの順番がたまにおかしくなる。重大なバグすぎる

ブラウザからあかりちゃんに喋ってほしかったので拡張機能作った

ブラウザで選択してる文字列を棒読みちゃんに送るWebExtentionsを作った

作りました

動機

ネットサーフィンをしていると読みたいな~と思う記事に出会うことがあります。しかし長文を「読む」というのは中々パワーが要るため、僕はVOICEROIDのエディタへ読みたい部分をコピペして読み上げをさせていました。

この手順は例えば

  1. 記事を選択する
  2. コピーする
  3. VOICEROIDへウィンドウを切り替える
  4. 貼り付ける
  5. 再生を押す
  6. 聞く
  7. あかりちゃんかわいい

となりますが、手順7へたどり着くのにかなり手を動かさないといけないので非常に面倒です。しかしブラウザからVOICEROIDを操作するのは大変です。なのでブラウザから棒読みちゃんを操作して間接的にあかりちゃんを操作することを目指します。

棒読みちゃんからVOICEROIDを操作するのは棒読みちゃんプラグインであるVoiceroid Talk Plusを利用します。

ch.nicovideo.jp

インストール

BS2B

GitHubからクローンして手元のブラウザにインストールする。もしくはFirefoxならFirefox Add-onsで公開しているのでそこからインストールできます。

棒読みちゃんWebSocketサーバープラグイン

GitHubからクローンしてきてPlugin_WebSocket.dll棒読みちゃんと同じディレクトリにコピーしてください。

BS2B

ラウザーで んたくしてる文字列を 読みちゃんに送る やつBS2Bという名前にしました。意味がわからない

ブラウザで選択したところを棒読みちゃんに送るやつ – Firefox 向けアドオン

github.com

拡張機能を導入すると、ブラウザのメニューバーにマイクのアイコンが追加されます。このアイコンをクリックするとポップアップが表示されます。ここから棒読みちゃんへリクエストを送ることができるようになっています。

構成はこんな感じです。

FirefoxGoogle Chrome、MS EdgeなどWebExtentionsに対応しているブラウザにインストールされたBS2BはWebSocketを介して棒読みちゃんに読み上げや一時停止、再開などのリクエストを送ります。そこからVoiceroid Talk PlusがVOICEROIDのエディタに文字列を渡し、あかりちゃんが読み上げます。かわいい

ただし棒読みちゃんはWebSocketに対応していないので、自前でWebSocketサーバーをプラグインとして用意する必要があります。今回はそれも用意しました。

github.com

といってもモノ自体は先駆者の方のForkになります。BS2Bが扱いやすいように機能を追加しています。

使い方

  1. メニューバーのボタン
    • クリックするとこのポップアップがでます。ポップアップが開かれたとき選択している文字列がテキストボックスに 追加 されます。
  2. 設定チェックボックス
    • テキストを保持する : ポップアップを閉じてもテキストボックスを保持します。
    • 送った後にテキストをリセットする : Sendボタンを押した後テキストボックスがクリアされます。
  3. テキストボックス
    • ポップアップ起動時に選択されていた文字列が表示されます。編集可能なので送る前に適当に調整すればいいと思います
    • ただし棒読みちゃんへは改行コードで分割され1行単位で送られます。
    • さらに1行の長さがある程度長いとSkipされてしまいます。
  4. ステータス
    • BS2Bのステータスを簡易的に表示します。
  5. Skipボタン
  6. Pauseボタン
  7. Resumeボタン
  8. Resetボタン
    • テキストボックスをリセットします。
  9. Appendボタン
    • 選択されているテキストをテキストボックスに 追加 します。
  10. Sendボタン

雑感

WebExtentionsとかJSとかの勉強がてらに不便を1つ解消しました。これでブラウザを開いていてもあかりちゃんと一緒に居れますね!(うれしい)

今思えば適当にキーバインドとかを設定してもよかったかもしれないですね。ボタンが遠い。

参考