雑記(2017年9月9日)

Pocket
LINEで送る

にゃーんを短く

こういうことがあって

当然こういう話になって、

割って入って

こうなって、

当然こうなった。

ロボット学会のスライド

最低バージョン完成

ICRA

明日にかける。

某案件

作り物の大改修のあと、書いたところの修正も一気にした。ICRAそっちのけだけど、やりたいことを他のスケジュールで抑制するとかえって気疲れするので。

集中しすぎて体が興奮しているが、寝る。

Pocket
LINEで送る

jus共催 第30回危念シェル芸勉強会の報告

Pocket
LINEで送る

昨日、2017年8月26日、さくらインターネットさんのセミナールームにて第30回のシェル芸勉強会を開催しました。

共催の日本Unixユーザ会さん、さくらインターネットさん、横田さん、宮川さん、常連さん、初参加の方々、参加されたUSP研究所のお二方、ありがとうございました。

そして、午前の講師の鳥海さん。昼食に行くときに置き去りにして、さらに昼食後も置き去りにし、マルエツで買い物袋を運ばせ、大変失礼いたしました。

今回の傾向

今回は前半がテキストファイルの編集でsedを使う問題が中心、後半がパズルや数学でした。いつもと違うのは、Pandocやhubコマンド、LLの虚数計算などの紹介を入れたことでした。問題を解くときにはこれらのライブラリの存在やオプションを調べ、セットアップするのに時間がかかったかもしれません。

また、どちらかと言うとソフトウェアを消費する側にとどまりがちなシェル芸界隈でも、巨大プロジェクトに成長する可能性が皆無ではないプロジェクトが立ち上がりました。

嘘ですスミマセン!いや、皆無ではない。

リンク集

まとめ

サテライト会場の様子

当日の動画

午前

午後

LT(いろいろ際どかったのでカットされてます)

スライドやブログ

福岡、大阪関係のものは当地にお任せします。

↓午前の鳥海さんのスライド。ツイッターやらない(幻のアカウントは持っている)ので代理で石井さんが投稿。

LTは平均的に危険でした。

↓N氏から発表のあったシェルスクリプト製のライフゲーム

💩

宣伝

シェル芸メンバー(そういう概念はあるのか?)で連載してます。よろしくお願いしまーす。

Pocket
LINEで送る

【問題と解答】jus共催 第30回危念シェル芸勉強会

Pocket
LINEで送る

問題のみのページはこちら

問題で使うファイル等

GitHubにあります。ファイルは

https://github.com/ryuichiueda/ShellGeiData/tree/master/vol.30

にあります。

クローンは以下のようにお願いします。

$ git clone https://github.com/ryuichiueda/ShellGeiData.git

環境

解答例はUbuntu Linux 16.04 で作成。Macの場合はcoreutilsをインストールすると、GNUのコマンドが使えます。BSD系の人は玄人なので各自対応のこと。

イントロ

スライド

Q1

リポジトリの中に、次のようなディレクトリがあります。

$ tree posts
posts
├── 20170806_check_of_webhook
│   └── main.md
├── 20170810_negi
│   ├── green_negi.jpg
│   ├── main.md
│   ├── white_negi.jpg
│   └── ねぎ.pdf
├── 20170810_negistagram
│   └── main.md
├── 20170812_work
├── 20170812_working
│   └── main.md
├── 20170814_layout
│   └── main.md
├── 20170818_bash
│   └── main.md
├── 20170820_bootstrap
│   └── main.md
├── 20170820_injection
│   └── main.md
└── template
    └── main.md

この中の、各main.mdは次のようなヘッダ付きのマークダウンです。

$ cat posts/20170818_bash/main.md 
---
Keywords: 嫌がらせ
Copyright: (C) 2017 Ryuichi Ueda
---

# 検索機能への嫌がらせ
Keywords: ワッショイ
Keywords: ワッショイ
Keywords: ワッショイ

これらのファイルから、次のような出力を作ってください。なお、Keywordsの行は各ファイルで最初にある行しか抽出しないこととします。

20170806_check_of_webhook Keywords: Webhook
20170810_negi Keywords: ネギ
20170810_negistagram Keywords: Twitter, Instagram, ネギ
20170812_working Keywords: 働けども働けども, bashcms2
20170814_layout Keywords: table, 雑
20170818_bash Keywords: 嫌がらせ
20170820_bootstrap Keywords: Bootstrap
20170820_injection Keywords: injection
template Keywords: 

解答

grepの-mオプションを使うと一番最初にマッチした行を取り出せます。

$ grep -m 1 '^Keywords:' posts/*/main.md |
 sed 's;posts/;;' | sed 's;/main.md:; ;'

Q2

次のHTMLファイルurl.htmlについて、リンクが相対パスになっているものについては頭に/files/をつけて、/から始まっているものとhttpやhttpsから始まっているものはそのままにしてください。できる人は変なところに改行があるものなどに対応できるように、なるべく一般解に近づけましょう。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
  <ul>
    <li><a href="./hoge.html">ほげ</a></li>
    <li><img src="ayasii.jpg" alt="怪しい" /></li>
    <li><a href="https://blog.ueda.tech/">クソブログ</a><a href="huge.html">ふげ</a></li>
    <li><a href="/root.jpg"></a>これはそのまま</li>
    <li><a href="http://www.usptomo.com/">更新してない</a></li>
  </ul>
</body>
</html>

次が出力例です。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
  <ul>
    <li><a href="/files/hoge.html">ほげ</a></li>
    <li><img src="/files/ayasii.jpg" alt="怪しい" /></li>
    <li><a href="https://blog.ueda.tech/">クソブログ</a><a href="/files/huge.html">ふげ</a></li>
    <li><a href="/root.jpg"></a>これはそのまま</li>
    <li><a href="http://www.usptomo.com/">更新してない</a></li>
  </ul>
</body>
</html>

解答

いちおうこれで大丈夫だとは思うのですが、自分でもなんだかよくわかりません・・・。

$ cat url.html | sed -r 's;(img src="|a href=");&/files/;g' |
 sed -r 's;(href="|src=")/files//;\1/;' |
 sed -r 's;(href="|src=")/files/(https://|http://);\1\2;g' |
 sed 's;/./;/;g'
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
  <ul>
    <li><a href="/files/hoge.html">ほげ</a></li>
    <li><img src="/files/ayasii.jpg" alt="怪しい" /></li>
    <li><a href="https://blog.ueda.tech/">クソブログ</a><a href="/files/huge.html">ふげ</a></li>
    <li><a href="/root.jpg"></a>これはそのまま</li>
    <li><a href="http://www.usptomo.com/">更新してない</a></li>
  </ul>
</body>
</html>

Q3

次のファイルについて、

$ cat list
* 妬み
* 嫉み
* 僻み

次のようにHTMLにして、頭にHTTPヘッダをつけてください。インデントは不要ですがタグは1行1個でお願いします。

Content-Type: text/html

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
<ul>
<li>妬み</li>
<li>嫉み</li>
<li>僻み</li>
</ul>
</body>
</html>

すぐできて退屈な人は、インターネット上のサーバでこのHTMLファイルを送信するサーバをワンライナーで立ててください。

解答

ゴリゴリやってもあまり苦労はしないと思いますが、Pandocの紹介がてら問題を出しました。

$ cat list | sed 's/\* /<li>/' | sed 's;$;</li>;' |
 sed '1iContent-Type: text/html\n\n<!DOCTYPE html><html><head><meta charset="utf-8"></head><body><ul>'  |
 sed '$a</ul></body></html>' | sed 's/></>\n</g'
### Pandocを使う方法 ###
$ pandoc list -t html5 -s | sed '5,12d' | sed '1iContent-Type: text/html\n'

ブラウザからの応答に反応するには、レスポンス行も追加します。(改行は\r\nの方がいいかもしれません。)

$ pandoc list -t html5 -s | sed '5,12d' |
 sed '1iHTTP/1.1 200 OK\nContent-Type: text/html\n' | nc -l 8080
### 連続応答 ###
$ while : ; do pandoc list -t html5 -s | sed '5,12d' |
 sed '1iHTTP/1.1 200 OK\nContent-Type: text/html\n' | nc -l 8080 ; done

Q4

&&や;でコマンドを繋いだワンライナーで、GitHubにリポジトリを作ってそこにテキストファイルを一つ置いてください。

解答

hubの紹介のための問題でした。

$ mkdir hoge && cd hoge && git init && echo aho > aho.txt 
&& git add -A && git commit -m "aho" 
&& hub create ryuichiueda/hoge && git push origin master
Initialized empty Git repository in /home/ueda/hoge/hoge/hoge/.git/
[master (root-commit) 76206c8] aho
 1 file changed, 1 insertion(+)
 create mode 100644 aho.txt
Updating origin
created repository: ryuichiueda/hoge
Counting objects: 3, done.
Writing objects: 100% (3/3), 215 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:ryuichiueda/hoge.git
 * [new branch]      master -> master

Q5

次のファイルの1行目の複素数と2行目の複素数をかけ算してください。

$ cat complex 
1 + 4*i
3 - 2*i

解答

Perlを使ってみました。(Perlに慣れていればもっと前処理は簡単になると思います。)

$ cat complex | sed 's/^/(/' | sed 's/$/)/' | sed '2,$i*' |
 xargs | tr -d ' ' |
 xargs -I@ perl -e '{use Math::Complex;print(@);print "\n"}'
11+10i

Q6

フィボナッチ数列で、6765の4つ前の数を出力してください。

解答

$ echo a | awk 'BEGIN{a=1;b=1}{while(1){print a;c=b;b+=a;a=c}}' |
 grep -m 1 -B4 6765 | head -n 1
987

Q7

次の数字の列について、00, 01, 02,…,99の数字2つ並びのうち、含まれないものを抽出してください。できる人はループを使わないで抽出してください。

cat nums
1232154916829552629124634124821535923503018381369677458868876877570978993996890718096846698577281037379417474410221480004050608111920262721512985412925301

解答

$ seq -w 0 99 | while read n ; do grep -q $n nums || echo $n ; done 
31
33
42
43
56
61
64
65

whileやforを使わない場合はこんな感じで。

$ cat nums | sed 's/.\(.*\)/\1\n&/' | fold -b2 | grep .. | sort -u |
 sort -m - <(seq -w 00 99) | sort | uniq -u
31
33
42
43
56
61
64
65

Q8

次のアルファベットの区間のうち、間に含まれるアルファベットが一番多いものはどれでしょうか。

$ cat alphabet 
a-g
e-q
z-v
r-y

解答

ブレース展開を使うとこんな感じです。

$ cat alphabet |
 awk '{a=$1;gsub(/-/,"..",a);print "echo",$1,"{"a"}"}' |
 bash | awk '{print $1,NF}' | sort -k2,2n |
 tail -n 1 | awk '{print $1}'
e-q

あとは10進数のasciiコードに変換する方法を示します。

$ cat alphabet | xxd -ps | fold -b2| tr a-f A-F |
 sed '1iobase=10;ibase=16;' | bc | xargs -n 4 |
 awk '{print $1-$3}' | tr -d - | awk '{print NR,$1}' |
 sort -k2,2n | tail -n 1 | awk '{print $1}' |
 xargs -I@ sed -n @p alphabet 
e-q
$ cat alphabet | tr - ' ' |
 perl -anle '{print abs(ord($F[0])-ord($F[1]))}' |
 awk '{print NR,$1}' | sort -k2,2n | tail -n 1 |
  awk '{print $1}' | xargs -I@ sed -n @p alphabet 
e-q
Pocket
LINEで送る

【問題のみ】jus共催 第30回危念シェル芸勉強会

Pocket
LINEで送る

解答はこちら

問題で使うファイル等

GitHubにあります。ファイルは

https://github.com/ryuichiueda/ShellGeiData/tree/master/vol.30

にあります。

クローンは以下のようにお願いします。

$ git clone https://github.com/ryuichiueda/ShellGeiData.git

環境

解答例はUbuntu Linux 16.04 で作成。Macの場合はcoreutilsをインストールすると、GNUのコマンドが使えます。BSD系の人は玄人なので各自対応のこと。

イントロ

スライド

Q1

リポジトリの中に、次のようなディレクトリがあります。

$ tree posts
posts
├── 20170806_check_of_webhook
│   └── main.md
├── 20170810_negi
│   ├── green_negi.jpg
│   ├── main.md
│   ├── white_negi.jpg
│   └── ねぎ.pdf
├── 20170810_negistagram
│   └── main.md
├── 20170812_work
├── 20170812_working
│   └── main.md
├── 20170814_layout
│   └── main.md
├── 20170818_bash
│   └── main.md
├── 20170820_bootstrap
│   └── main.md
├── 20170820_injection
│   └── main.md
└── template
    └── main.md

この中の、各main.mdは次のようなヘッダ付きのマークダウンです。

$ cat posts/20170818_bash/main.md 
---
Keywords: 嫌がらせ
Copyright: (C) 2017 Ryuichi Ueda
---

# 検索機能への嫌がらせ
Keywords: ワッショイ
Keywords: ワッショイ
Keywords: ワッショイ

これらのファイルから、次のような出力を作ってください。なお、Keywordsの行は各ファイルで最初にある行しか抽出しないこととします。

20170806_check_of_webhook Keywords: Webhook
20170810_negi Keywords: ネギ
20170810_negistagram Keywords: Twitter, Instagram, ネギ
20170812_working Keywords: 働けども働けども, bashcms2
20170814_layout Keywords: table, 雑
20170818_bash Keywords: 嫌がらせ
20170820_bootstrap Keywords: Bootstrap
20170820_injection Keywords: injection
template Keywords: 

Q2

次のHTMLファイルurl.htmlについて、リンクが相対パスになっているものについては頭に/files/をつけて、/から始まっているものとhttpやhttpsから始まっているものはそのままにしてください。できる人は変なところに改行があるものなどに対応できるように、なるべく一般解に近づけましょう。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
  <ul>
    <li><a href="./hoge.html">ほげ</a></li>
    <li><img src="ayasii.jpg" alt="怪しい" /></li>
    <li><a href="https://blog.ueda.tech/">クソブログ</a><a href="huge.html">ふげ</a></li>
    <li><a href="/root.jpg"></a>これはそのまま</li>
    <li><a href="http://www.usptomo.com/">更新してない</a></li>
  </ul>
</body>
</html>

次が出力例です。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
  <ul>
    <li><a href="/files/hoge.html">ほげ</a></li>
    <li><img src="/files/ayasii.jpg" alt="怪しい" /></li>
    <li><a href="https://blog.ueda.tech/">クソブログ</a><a href="/files/huge.html">ふげ</a></li>
    <li><a href="/root.jpg"></a>これはそのまま</li>
    <li><a href="http://www.usptomo.com/">更新してない</a></li>
  </ul>
</body>
</html>

Q3

次のファイルについて、

$ cat list
* 妬み
* 嫉み
* 僻み

次のようにHTMLにして、頭にHTTPヘッダをつけてください。インデントは不要ですがタグは1行1個でお願いします。

Content-Type: text/html

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
<ul>
<li>妬み</li>
<li>嫉み</li>
<li>僻み</li>
</ul>
</body>
</html>

すぐできて退屈な人は、インターネット上のサーバでこのHTMLファイルを送信するサーバをワンライナーで立ててください。

Q4

&&や;でコマンドを繋いだワンライナーで、GitHubにリポジトリを作ってそこにテキストファイルを一つ置いてください。

Q5

次のファイルの1行目の複素数と2行目の複素数をかけ算してください。

$ cat complex 
1 + 4*i
3 - 2*i

Q6

フィボナッチ数列で、6765の4つ前の数を出力してください。

Q7

次の数字の列について、00, 01, 02,…,99の数字2つ並びのうち、含まれないものを抽出してください。できる人はループを使わないで抽出してください。

cat nums
1232154916829552629124634124821535923503018381369677458868876877570978993996890718096846698577281037379417474410221480004050608111920262721512985412925301

Q8

次のアルファベットの区間のうち、間に含まれるアルファベットが一番多いものはどれでしょうか。

$ cat alphabet 
a-g
e-q
z-v
r-y
Pocket
LINEで送る

Software Designで新連載

Pocket
LINEで送る

はじまりました。

全国各地の変態腕利きのワンライナー野郎がSlackに集まって書いてます。

あとの情報は・・・ぜひ本をご購入の上、確かめていただければと。

Pocket
LINEで送る

第29回シェル芸勉強会まとめ

Pocket
LINEで送る

今回も共催の日本UNIXユーザ会様、会場提供のさくらインターネット様、参加者の皆様のご協力のもと、シェル芸勉強会を開催しました。

今回の問題は、ここ数回では難易度が下がったようで、会場では安堵の声、体力を奪われなかったという声が聞かれました(どんな会なんだ・・・)。

以下、単にリンクの貼り付け集ですが、当日の様子が分かるまとめです。

Twitterまとめ

録画

あと、大阪のLTの録画がありますが、それは大阪のレポートから辿っていただければと。

サテライト会場の様子

大阪、福岡で開いていただきました。ありがとうございました。

福岡

大阪

LTなどのスライドやブログ

大阪のLTは(やばすぎるので、ということではないですが)大阪からのレポートにお任せします。

ブログなどなど、書いたら教えてくださーい。

Pocket
LINEで送る

【問題と解答】第29回激しいシェル芸勉強会

Pocket
LINEで送る

問題のみのページはこちら

問題で使うファイル等

GitHubにあります。ファイルは

https://github.com/ryuichiueda/ShellGeiData/tree/master/vol.29

にあります。

クローンは以下のようにお願いします。

$ git clone https://github.com/ryuichiueda/ShellGeiData.git

環境

解答例はUbuntu Linux 16.04 で作成。Macの場合はcoreutilsをインストールの上、gsedをつかいましょう。BSD系の人は玄人なので各自対応のこと。

イントロ

Q1

次の2つのファイルは、講義で出した課題1,2それぞれの点数です。

$ cat kadai1
001 山田 20
002 出川 30
005 鳥海 44
$ cat kadai2 
001 山田 20
003 上田 15
004 今泉 22
005 鳥海 44

両方に名前のある人については点数を合計して、次のように全員の得点リストを作ってください。

001 山田 40
002 出川 30
003 上田 15
004 今泉 22
005 鳥海 88

解答

$ join -a 1 -a 2 -1 1 -2 1 kadai{1,2} | awk '{print $1,$2,$3+$5}'
001 山田 40
002 出川 30
003 上田 15
004 今泉 22
005 鳥海 88

Q2

次の2つのファイルは、5回の講義の出欠と6回目の講義で出席した人の番号のデータです。attendに6回目の講義の出欠を反映したデータを標準出力に出力してください。

$ cat attend
001 山田 出出欠出出
002 出川 出出欠欠欠
003 上田 出出出出出
004 今泉 出出出出出
005 鳥海 欠出欠出欠
$ cat attend6
001,005,003

解答

$ tr , '\n' < attend6 | sort | sed 's/$/ 出/' |
 join -a 1 attend - |
 awk 'NF==3{print $0"欠"}NF==4{print $1,$2,$3$4}'

Q3

次の2つのファイルは5回の講義の出欠とテストの成績を記録したファイルです。

###$1: 番号, $2: 名前, $3: 出欠 ###
$ cat attend 
001 山田 出出欠出出 
002 出川 出出欠欠欠
003 上田 出出出出出
004 今泉 出出出出出
005 鳥海 欠出欠出欠
###$1: 番号, $2: テストの点数(受けてない人のデータは無い)###
$ cat test 
001 90
002 78
004 80
005 93

こういうルールで、最終的な点数を出して、番号、名前、点数を記録したファイル作ってください。

  • 出席が過半数に満たない人、テストを受けていない人は0点
  • 出席が過半数の人はテストの点数を採用

解答

$ join -a 1 -o 1.1 1.2 1.3 2.2 -e 0 attend test |
 awk '/(.*欠){3}/{$4=0}{print}'
001 山田 出出欠出出 90
002 出川 出出欠欠欠 0
003 上田 出出出出出 0
004 今泉 出出出出出 80
005 鳥海 欠出欠出欠 0

Q4

Q4.1

次の出力をパイプで受けて

$ echo -1 4 5 2 42 421 44 311 -9 -11

次のように同じ桁のものを横並びに出力を得てください。横に並べる時の順番は任意とします。また、この出力のように正の数と負の数を分けます。

-11 
-9 -1 
2 4 5 
42 44 
311 421 

Q4.2

次の出力をパイプで受けて

$ echo -1 +4 5 2 42 421 44 311 -9 -11

次のように同じ桁のものを横並びに出力を得てください。Q1.1と同じく横に並べる時の順番は任意とします。

-11 
-9 -1 
2 +4 5 
42 44 
311 421 

解答

Q4.1

$ echo -1 4 5 2 42 421 44 311 -9 -11 | xargs -n 1 | sort -n |
 awk 'length(a) != length($1){print ""}{printf("%d ",$1);a=$1}' |
 awk 'NF'
-11 
-9 -1 
2 4 5 
42 44 
311 421 

Q4.2

awk内で1をかけると+符号が外れるので、符号を外して桁数を比較すると先ほどの解答例が転用できます。

$ echo -1 +4 5 2 42 421 44 311 -9 -11 | xargs -n 1 | sort -n |
 awk 'length(a*1) != length($1*1){print ""}{printf("%s ",$1);a=$1}' |
 awk 'NF'
-11 
-9 -1 
+4 2 5 
42 44 
311 421 

Q5

次のファイルの中身について、

$ cat triangle 
   1
  3 9
 7 a 6
8 4 2 5

次のように右に転がしてください。できる人はawkを使わないでやってみましょう。

   8   
  4 7  
 2 a 3 
5 6 9 1

解答

四角にして回すと楽です。

$ cat triangle | sed 's/ /0 /g' | sed 's/\([^ ]\)0/\1/g' |
 tac | rs -T | tr -d 0 | sed 's/  / /g' | sed '1s/^/   /' |
 sed '2s/^/  /'  | sed '3s/^/ /'
   8   
  4 7  
 2 a 3 
5 6 9 1

Q6

次の1から100までの素数を書いたファイル(いくつか欠番が存在)について、

$ cat prime 
2 3 5 7 11 13 17 19 31 37 41 43 47 53 59 67 71 73 79 83 89 97

次のように欠番のところで折り返してください。(ワンライナーの中に欠番を直接書かないでくださいね。)

2 3 5 7 11 13 17 19 
31 37 41 43 47 53 59 
67 71 73 79 83 89 97

解答

$ cat prime | xargs -n 1 | cat - <(seq 1 100 | factor |
 awk 'NF==2{print $2}') | sort -n | xargs |
 awk '{for(i=1;i<NF;i+=2){if($i==$(i+1)){printf("%d ",$i)}else{print "";i-=1}}}' |
 awk 'NF'
2 3 5 7 11 13 17 19 
31 37 41 43 47 53 59 
67 71 73 79 83 89 97 

Q7

リポジトリ内のnyaan.htmlは、ブラウザで見ると次のように見えます。

次のようにcatから始めて、この文字を(大きなまま)端末上に表示してみてください。

$ cat ./nyaan.html | ...

できる人は小さい通常の文字で「にゃーん」と出してみてください(これは解答例を考えていません)。

解答

$ cat ./nyaan.html | nkf --numchar-input |
 sed 's/<[^<]*>//g' | sed 's/&quot;/"/g'

Q8

次のshellgeiファイルについて、

$ cat shellgei 
                                            m                         
   ""m                        m  "m          #    # #           #     
  mm                           #  #          #mmm"""          m"      
    "    m"      mmm""         #  #   #     m"   #        mm""m       
       m"          #mm        m"  # m"     "    #             #       
  "mm""         """"  "      m"   #"          m"              #       
                                                                      
                   

次のように、文字の無い列を詰めてください。

                          m               
 ""m             m "m      #    # #      #
mm                # #      #mmm"""     m" 
  "    m" mmm""   # #   # m"   #   mm""m  
     m"     #mm  m" # m" "    #        #  
"mm""    """"  "m"  #"      m"         #                                     

解答

$ cat shellgei | sed 's/ /@/g' | sed 's/./& /g' |
 awk '{for(i=1;i<=NF;i++){if($i!="@")a[i]=$i}}END{for(i=1;i<=NF;i++){b=a[i]==""?"x":" ";printf b}}END{print ""}' |
 cat - shellgei |
 awk 'NR==1{a=$0}{for(i=1;i<=length($0);i++){if(substr(a,i,1)!="x")printf substr($0,i,1)};print ""}'
                                          
                          m               
 ""m             m "m      #    # #      #
mm                # #      #mmm"""     m" 
  "    m" mmm""   # #   # m"   #   mm""m  
     m"     #mm  m" # m" "    #        #  
"mm""    """"  "m"  #"      m"         #  
                                          
                      

もっと良い解答。

Pocket
LINEで送る

【問題のみ】第29回激しいシェル芸勉強会

Pocket
LINEで送る

解答のページはこちら

問題で使うファイル等

GitHubにあります。ファイルは

https://github.com/ryuichiueda/ShellGeiData/tree/master/vol.29

にあります。

クローンは以下のようにお願いします。

$ git clone https://github.com/ryuichiueda/ShellGeiData.git

環境

解答例はUbuntu Linux 16.04 で作成。Macの場合はcoreutilsをインストールしてつかいましょう。BSD系の人は玄人なので各自対応のこと。

イントロ

Q1

次の2つのファイルは、講義で出した課題1,2それぞれの点数です。

$ cat kadai1
001 山田 20
002 出川 30
005 鳥海 44
$ cat kadai2 
001 山田 20
003 上田 15
004 今泉 22
005 鳥海 44

両方に名前のある人については点数を合計して、次のように全員の得点リストを作ってください。

001 山田 40
002 出川 30
003 上田 15
004 今泉 22
005 鳥海 88

Q2

次の2つのファイルは、5回の講義の出欠と6回目の講義で出席した人の番号のデータです。attendに6回目の講義の出欠を反映したデータを標準出力に出力してください。

$ cat attend
001 山田 出出欠出出
002 出川 出出欠欠欠
003 上田 出出出出出
004 今泉 出出出出出
005 鳥海 欠出欠出欠
$ cat attend6
001,005,003

Q3

次の2つのファイルは5回の講義の出欠とテストの成績を記録したファイルです。

###$1: 番号, $2: 名前, $3: 出欠 ###
$ cat attend 
001 山田 出出欠出出 
002 出川 出出欠欠欠
003 上田 出出出出出
004 今泉 出出出出出
005 鳥海 欠出欠出欠
###$1: 番号, $2: テストの点数(受けてない人のデータは無い)###
$ cat test 
001 90
002 78
004 80
005 93

こういうルールで、最終的な点数を出して、番号、名前、点数を記録したファイル作ってください。

  • 出席が過半数に満たない人、テストを受けていない人は0点
  • 出席が過半数の人はテストの点数を採用

Q4

Q4.1

次の出力をパイプで受けて

$ echo -1 4 5 2 42 421 44 311 -9 -11

次のように同じ桁のものを横並びに出力を得てください。横に並べる時の順番は任意とします。また、この出力のように正の数と負の数を分けます。

-11 
-9 -1 
2 4 5 
42 44 
311 421 

Q4.2

次の出力をパイプで受けて

$ echo -1 +4 5 2 42 421 44 311 -9 -11

次のように同じ桁のものを横並びに出力を得てください。Q1.1と同じく横に並べる時の順番は任意とします。

-11 
-9 -1 
2 +4 5 
42 44 
311 421 

Q5

次のファイルの中身について、

$ cat triangle 
   1
  3 9
 7 a 6
8 4 2 5

次のように右に転がしてください。できる人はawkを使わないでやってみましょう。

   8   
  4 7  
 2 a 3 
5 6 9 1

Q6

次の1から100までの素数を書いたファイル(いくつか欠番が存在)について、

$ cat prime 
2 3 5 7 11 13 17 19 31 37 41 43 47 53 59 67 71 73 79 83 89 97

次のように欠番のところで折り返してください。(ワンライナーの中に欠番を直接書かないでくださいね。)

2 3 5 7 11 13 17 19 
31 37 41 43 47 53 59 
67 71 73 79 83 89 97

Q7

リポジトリ内のnyaan.htmlは、ブラウザで見ると次のように見えます。

次のようにcatから始めて、この文字を(大きなまま)端末上に表示してみてください。

$ cat ./nyaan.html | ...

できる人は小さい通常の文字で「にゃーん」と出してみてください(これは解答例を考えていません)。

Q8

次のshellgeiファイルについて、

$ cat shellgei 
                                            m                         
   ""m                        m  "m          #    # #           #     
  mm                           #  #          #mmm"""          m"      
    "    m"      mmm""         #  #   #     m"   #        mm""m       
       m"          #mm        m"  # m"     "    #             #       
  "mm""         """"  "      m"   #"          m"              #       
                                                                      
                   

次のように、文字の無い列を詰めてください。

                          m               
 ""m             m "m      #    # #      #
mm                # #      #mmm"""     m" 
  "    m" mmm""   # #   # m"   #   mm""m  
     m"     #mm  m" # m" "    #        #  
"mm""    """"  "m"  #"      m"         #                                     
Pocket
LINEで送る

Software Design7月号未掲載部分

Pocket
LINEで送る

本日発売です。bashのマニアック機能について「使うなよ!絶対使うなよ!!」というテイストで書きました。

で、宣伝部分だと味気ないので、調子に乗って書きすぎて掲載できなかった部分をあまり加工せずに貼り付けておきまっす。bash3.2とbash4.4で挙動の違う例、4.0以降の新機能の例です。

数字のブレース展開のゼロ埋め

ブレース展開においてゼロ埋めができるようになっています。

bash-3.2$ echo {01..03}
1 2 3
bash-4.4$ echo {01..03}
01 02 03

Unicodeのコードポイント指定

Unicodeのコードポイントを指定して文字を出力できます。

###UnicodeとUTF-8の16進数を指定してみる例###
bash-3.2$ echo -e '\U1F363' '\xF0\x9F\x8D\xA3'
\U1F363 🍣
bash-4.4$ echo -e '\U1F363' '\xF0\x9F\x8D\xA3'
🍣 🍣

次の例は、
この機能とxxdというコマンドを使ってUnicodeから
UTF-8へ変換するワンライナーです。

bash-4.4$ echo -en '\U1F363' | xxd -ps
f09f8da3

case文で使う「;;&」

次のcase文は、SHELLという変数の文字列がbashで終わっている場合に
「bash」と表示するものです。「\*bash」というパターンにマッチして
echoを実行し、次の「\*」は評価されずに終わっています。

bash-3.2$ case $SHELL in *bash ) echo bash ;; * ) echo defalut ;; esac
bash

バージョン4.0ではこの挙動に加え、
「;;&」を用いて次のパターンも評価させることが可能となりました。

bash-4.4$ case $SHELL in *bash ) echo bash ;; * ) echo defalut ;; esac
bash
bash-4.4$ case $SHELL in *bash ) echo bash ;;& * ) echo defalut ;; esac
bash
defalut

大文字を小文字に強制変更する変数

declare -lで変数を宣言すると、代入した大文字が小文字に変換されます。

bash-4.4$ declare -l yesno
bash-4.4$ yesno=YeS
bash-4.4$ echo $yesno
yes                   #小文字になる

また、例は省略しますが、declare -uで宣言すると大文字に変換されます。

普通の変数に対して後から小文字大文字を変換することもできます。
変数の後ろに「^」や「,」をつけます。

bash-4.4$ y=YeS
bash-4.4$ echo ${y^^} #大文字に
YES
bash-4.4$ echo ${y,,} #小文字に
yes
bash-4.4$ echo ${y,}  #1文字目だけ小文字に
yeS

ということで

買って読んでいただければ幸いです。

こちらもお願いしまっす!

Pocket
LINEで送る

第28回基準値を超えるシェル芸勉強会のまとめ

Pocket
LINEで送る

参加者の方々、会場でお手伝いいただいた方々、サテライトの主催・参加のみなさま、会場を提供いただいたさくらインターネットさん、横田さん、午前講師の今泉さん、共催のjusさん並びにりゅうちさん、LT発表者のみなさま、ありがとうございました。

総括的なコメント

最近、会場の半分くらいの人たちのレベルが人間離れしていますが、初心者でも楽しめる雰囲気はキープできたかと・・・。問題は実用的かつ高難易度でした。

今回は募集が早すぎてドタキャンが多くゆったりめでした。

問題はこちらです。

話が前後しますが、午前の部は今泉さんのシグナルに関するレクチャーでした。ありがとうございました。個人的には擬似シグナル0番というのを知らなかったです。

当日の様子

Twitter上での様子

サテライトの様子

大阪のLTのスライドはこちらにあります。

LTやブログのリンク

写真など

昼食
LT

Pocket
LINEで送る