たいちょーの雑記

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

第57回シェル芸勉強会に参加しました

参加しました

今回は午前もありました

午前

今回は久々に午前がありました。配信はこちら。構造化プログラミングシリーズの1回目。 ダイクストラ大先生の言ってることを理解するにはGotoだらけのプログラムを書くと良いとのことで、状態遷移図とそれを途中まで実装したプログラムを埋める実習などで説明されました。 詳しいことは配信のアーカイブを見ればよいので書きませんが…。

オートマトンは昔少しだけ勉強したんだけど、GoToで書かれていれば読みやすいか?と聞かれるとそうかしら…?と思ってしまった。あんまり慣れてないからかな…?今度試してみようと思います。

午後

今回もzshのみ。PowerShellで解いてもいいけど体力が0を超えて-100になるので…。

配信はこちら

Q1

reiwaファイルから 令和 を数え上げる問題。

$ cat Sh*/vol.57/reiwa | uconv -x NFD | grep -o 令和 | wc -l
20

実はコードポイント違いの令が存在するので、それに騙されないようにする問題。ここではuconvユニコード正規化して数え上げる感じにしました。

Q2

kanji2ファイルの旧字体新字体に変換する問題。

$ curl http://www.gaoshukai.com/lab/0039/N_O_character.txt > o
$ cat Sh*/vol.57/kanji2 | while read L; do echo $L | grep -o . | while read R; do grep $R ./o 2>/dev/null || echo $R; done | awk '{print $1}' | paste -sd ''; done
写真
星図
学校
鉄道
鉄砲弾
灯台
両腕

インターネットに転がっていた辞書ファイルを使ってgrepで新旧を入れ替えてます。

Q3

kanjiファイルから日本語にない漢字を取り出す問題。

$ cat Sh*/vol.57/kanji | uniname | grep Unknown | awk '{print $7}' | paste -sd ''
无产阶级简华历场协议

uninameで調べたら日本語にない漢字はUnknownで絞り込めることが分かったのでそれを利用しました。

Q4

繫体字を簡体字にする問題。

$ cat Sh*/vol.57/ho* | hanzi-convert -s -

hanziconvが便利です

github.com

Q5

以下のような./a.shを作って

#!/bin/bash

date
sleep 30
date

1つ目と2つ目のdateの間を40秒以上にする問題。

$ ./a.sh &;x=$!;sleep 1s;kill -STOP $x;sleep 40;kill -CONT $x

killで止める案を見て良いな~と思ったので採用しました。

Q6

echo うんこ > unkoをしてからgrep うんこ unko | cat >> unkoを繰り返しているといつしか止まらなくなるので、これを止める問題。

$ echo > unko

unkoファイルを空にしてしまえば止まります。

Q7

因数分解する問題。どういう…どういうことなのですか…

$ echo 'factor(x^8 - y^8);' | maxima

Maxima 5.43.2 http://maxima.sourceforge.net
using Lisp GNU Common Lisp (GCL) GCL 2.6.12
Distributed under the GNU Public License. See the file COPYING.
Dedicated to the memory of William Schelter.
The function bug_report() provides bug reporting information.
(%i1)                                          2    2    4    4
(%o1)                - (y - x) (y + x) (y  + x ) (y  + x )
(%i2) %

maximaというツールがあるのでそれでやると楽とのこと。いろんなツールがあるんだなあ…

Q8

循環小数である7/17の最短の循環部分を求める問題。

$ echo -e 'scale=60\n7/17' | bc | grep -oPe '(\d+?)\1' | head -n1 | awk '{print substr($0,0,length($0)/2)}'
4117647058823529

正規表現でひっかければ良い。こういう時後方参照がさっと扱えるようになると楽ですよね~。

LT

今回もLTしました。

www.slideshare.net

12月ということでまたナベを使って何かしました。なんだこれは…。

おわり

今回もとても楽しかったです!午前回があると学びがさらに多くて良いですね…!次回も楽しみです。企画・開催ありがとうございました!