【問題と解答】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で送る

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

Pocket
LINEで送る

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

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

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

Twitterまとめ

録画

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

サテライト会場の様子

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

福岡

大阪

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

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

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

Pocket
LINEで送る

最近のラズパイマウスまわりの情報

Pocket
LINEで送る

最近、ラズパイマウス本の宣伝をしてませんが、ラズパイマウスの開発やラズパイマウス上で動くソフトウェアはどんどん増えてますので、情報を並べておきます。

本の情報はGitHubに掲載しています。

質問お待ちしております!!

ゲームパッドとラズパイマウスをつなぐROSパッケージ

弊研究室の岡崎氏が管理しています。

Hector SLAM + ナビゲーションのパッケージ

同じく岡崎氏作のHector SLAMしながらナビゲーションするパッケージ。千葉工大のOBの前川氏のパッケージからあまりいじっていないそうです。

岡崎さんは現在、移動ロボットでは標準的な構成となるgmappingとナビゲーションメタパッケージをラズパイマウスに移植中です。

イベント等

終わったものや募集が定員に達したものばかり挙げますが・・・。これからもあるかもしれません。ありがとうございます。

オプション(ハードウェア)

色々開発中のようです。どれがもう売っててどれがまだなのかよくわからんのでアールティさんのページでご確認を。

↓こちらはモータの実際の回転量を計測できる基盤(コネクタ)です。

迷路走行用ROSパッケージ

こんな感じで走ります。分岐点でどこを曲がるかは、その時のセンサの値次第です。

学習モジュール

ロボット学会のネタなのでまだ詳細を発表できませんが、今こんなものを作っています。

こういう制御のプログラムでロボットを動かして・・・

ロボットが別の学習プログラムで動きを真似をします。真似してる動作は簡単ですが、学習プログラムもアホみたいに簡単です。

シミュレータ

忘れてました。こちらも色々開発が進んでいるようです。実機と同じようにデバイスファイル(に見せかけたダミーファイル)でセンサ、アクチュエータを通信できるように改造してほしいという依頼を出しています。

Pocket
LINEで送る

「Raspberry Piで学ぶ ROSロボット入門」という本を書きました

Pocket
LINEで送る

ロボットにラズパイを載っけてROSで動かすという流行りもの全部乗せの節操のない本を書きました。3月30日に出ます。以前の日経Linuxの連載をまとめて、原型を留めないほどROS化したものです。本日校了ということで、9月から12月までは執筆、1月からは書き直しや校正と、充実した地獄が終わりました。

 

 

まさか自分がROSの本を書くとは思っていませんでした。私のROSに関するコントリビューションは、たまにROS Wikiを翻訳するくらいです。あんまりROSのコミュニティーに仁義が切れてないのは、別のコミュニティーをやってる身としては褒められたものではないという認識なのですが、日経Linuxの内容を強化する上でROSが避けられず、自分も真正面から扱うことにした次第です。

本の中ではこんなことをしています。

内容は大学の講義や実習を想定しています。4月からの講義にはギリギリですが、ぜひ本を手にとっていただければと。

Pocket
LINEで送る

【問題のみ】第27回sedこわいシェル芸勉強会

Pocket
LINEで送る

解答例はこちら

問題で使うファイル等

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

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

にあります。

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

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

イントロ

環境

対象とするsedはGNU sedだけに絞っています。解答例はUbuntu Linux 16.04 で作成。Macの場合はcoreutilsをインストールの上、gsedをつかいましょう。GSD系の人は玄人なので各自対応のこと。

Q1

次のechoの出力について、偶数番目の文字だけ大文字にしてください。できたら、奇数番目の文字だけ大文字にしてください。

$ echo abcdefghijklmn

Q2

seq 1 100から始めてsedだけでFizzBuzzをやってみましょう。

Q3

次の出力について、3行目を7行目の下に移動してください。

$ seq 1 10

Q4

次のコードのmainとahoの位置を入れ替えてください。

$ cat aho.cc 
#include <iostream>
using namespace std;

int main(int argc, char const* argv[])
{
	aho();
	return 0;
}

void aho(void)
{
	cout << "aho" << endl;
}

Q5

seq 1 10 | から始めて次のような出力を作ってください。

2
1
4
3
6
5
8
7
10
9

Q6

echo 1から始めて次のような出力を作ってください。

1
11
111
1111
11111
111111
1111111
11111111
111111111
1111111111

Q7

aというファイルをtouch等で作り、次の縛りでa1, a2, a3, …, a10というファイルをaからコピーして作ってください。縛り1と縛り2を独立した別々の問題として解き、その後縛り1,2を両方満たす解を考えてみましょう。

  • 縛り1: 使うコマンドはseq、cp、sedだけ
  • 縛り2: ワンライナー中で数字を使わない

Q8

echo 1 | から始めて、あとはsedだけで次のような出力を得てください。

1
11
111
1111
11111
11111
1111
111
11
1
Pocket
LINEで送る

近況: 日経Linux、RoboCup2016(世界大会)出る、投稿論文通った他

Pocket
LINEで送る

おかげさまでいいニュースが多くて忙しくしています。現在は日経Linuxの6月号の原稿と、推薦をもらったので和文の投稿論文を執筆中です。どちらも3/31締め切り。死ぬ。

日経Linux4月号発売

今月の特集は「大門」だそうで、一体何のことでしょうか。都営線の地味な駅のことでしょうか。大門刑事でしょうか。それとも私の実家の方で作っている素麺のことでしょうか。Linuxとの関係は何なのでしょうか。(叱られるぞ。)

ファイル 2016-03-09 22 02 10

何の特集かは商品を手にとって是非ご自身の目でお確かめください。

あ、今月の私の連載は「ジャイロを使って比例制御でロボットをまっすぐ走らせる」です。

別冊も、あまりにもド直球なタイトルですが、中身が気になりますね。

CIT Brains @Homeが世界大会に出場します

私もお菓子配り係として参加している家事ロボット作るぞチーム「CIT Brains @Home」が、結成からわずか4ヶ月で世界大会に出ることになりました。皆様おめでとうございます。今年の世界大会(RoboCup2016)は、6月に東ドイツのライプチヒで行なわれます。秘密警察が怖いですが、西側のお菓子をたくさん持ち込んで民主化の起爆剤にする所存です。とりあえず税関でお菓子に法外な関税をかけられないように注意します。

真面目な話をすると、チームではスポンサーを募集しております。本来ならこちらから回ってお願いすべき話なのですが、万が一ご興味があれば@ryuichiuedaにお知らせくださいませ。家事ロボットは人の声を認識する、腕や台車部分を自動制御する、複数のPCをロボットに載せた状態で安定させて動かす等、様々な技術の検証や統合にとても良い課題です。もちろん、掃除以外もこなすルンバを作るという話ですので、今後の需要も非常に期待できます。チームの結成当初から一緒に戦っていただけるパートナーを探しております。

もちろん、ロボットにステッカーを貼ったりウェブサイトにバナーを貼ったりという、影響力はわずかかもしれませんが直接的な特典も検討いたします。

投稿論文通った

復帰後2本目の投稿論文の採択通知をいただきました。プレプリントをアップしました。こんなやつです。

内容は自分の博士論文を少し進めたもので、でっかいPCで数値計算で求めたロボットの行動規則がでかくてマイコンに載らないのでどうやって圧縮しようかという話です。マイコン制御の倒立振子を作って実機実験をやりたかったのですが、自分に作る腕がないので制御対象はシミュレーションの二重振子になりました。

その他

そろそろ4月のシェル芸勉強会の支度をしないと・・・

寝る。

Pocket
LINEで送る

GitHubのWikiの変更をHubot経由でSlackに通知

Pocket
LINEで送る

シェル芸勉強会の次の日でかなり疲れているのですが、「GitHubのWikiを複数人で編集し、その変更をSlackに飛ばしたい」というニッチな需要ができたので工作活動してました。Slackの標準の機能には、GitHubのWikiの更新を受け取る手段が2016年2月14日現在、無いようです。(あったらすぐ教えてください!30分くらい探してSlack側に受け口が見つからなくてキレてやっちまいました。)issueやpullリクエストの通知機能はあるんですが・・・。

ということで、HubotにGitHubからJSONを飛ばして、Hubotで解釈してSlackに飛ばすことにしました。Hubotについては、次のサイトを参考にインストールを行いました。環境はVPSのUbuntu 14.04上です。

チャットボットでチーム開発効率化入門(1):GitHub製フレームワークHubotの概要とインストール、チャットアプリと連携する基本的な使い方 (1/2) – @IT チャットボットでチーム開発効率化入門(1):GitHub製フレームワークHubotの概要とインストール、チャットアプリと連携する基本的な使い方 (1/2) - @IT
CentOSにHubotを導入してSlackと連携させる – Qiita CentOSにHubotを導入してSlackと連携させる - Qiita

また、CoffeeScriptを書いた時はHubot経由でGitHubのイベントを通知する | SPACEMARKET BLOGを参考にさせていただきました。掲載されているコード(GitHubのissue等をTwitterに飛ばすもの)を、GitHubのwikiをslackに飛ばすように改造しました。

以下はちょっと端折ってますが手順です。

Hubotを召喚する

必要なものを上のサイトを参考にインストール後、適当なディレクトリ(自分の場合は~/HUBOT/GITHUB)を作り、その下で次のコマンドを打ちます。

yo hubot

すると、こんな感じで根掘り葉掘り聞かれます。AAがアホっぽいです。いや、なんでもありません。

$ yo hubot
                     _____________________________  
                    /                             \ 
   //\              |      Extracting input for    |
  ////\    _____    |   self-replication process   |
 //////\  /_____\   \                             / 
 ======= |[^_/\_]|   /----------------------------  
  |   | _|___@@__|__                                
  +===+/  ///     \_\                               
   | |_\ /// HUBOT/\\                             
   |___/\//      /  \\                            
         \      /   +---+                            
          \____/    |   |                            
           | //|    +===+                            
            \//      |xx|                            

? Owner Ryuichi UEDA <aho@gmail.com>
? Bot name github
? Description A simple notifier for GitHub wiki
? Bot adapter (campfire) slack

間違えてはいけないのは

? Bot adapter (campfire) slack

の一箇所です。

hubotの起動スクリプトを作る

ディレクトリの下のbin/hubotがHubotの起動シェルスクリプトです。これを次のように書き換えます。PORTは、HubotがGitHubからデータを受け取るときに使うポート番号です。

このスクリプトは最後のforeverでサーバに常駐化します。常駐化するとデバッグで止めたり動かしたりするのが面倒なので、
デバッグの時はコメントアウトしている#exec…を使うと良いでしょう。こっちを使うとCtrl+cで止まります。

各種設定

上のスクリプトで次のようになっているところは、自分の環境に合わせて書き換える必要があります。

export HUBOT_SLACK_TOKEN=xxxxxx
export HUBOT_GITHUB_SECRET=yyyyyyy

HUBOT_SLACK_TOKENはSlackのHubotの設定ページに、次のようにトークンが表示されているはずなので、これをコピペして使います。

1455450034

HUBOT_GITHUB_SECRETは、GitHubの連携したいリポジトリのWebhookの設定で、「Add webhook」を押すと、次のように表示されるので、ここの「Secret」に適当なトークンを入れて使います。

1455450001

私は次のような感じで作りました。

$ cat /etc/* | md5sum 2> /dev/null
b720a34fb302c401e5146cefe1ae656d  -

Secretの二つ上にある「Payload URL」は、http://:<ポート番号>/github/webhookにしておきます。このURLの「github」というのはHubotの名前です。

また、リポジトリのどんな変化に対して通知を受け取るかは、「Which events would you like to trigger this webhook?」という項でいじります。「Gollum」というのがWiki関係の通知に相当します。

Hubotスクリプト

こんな風に書きました。Hubotのディレクトリ下のscriptsディレクトリに<なんとかかんとか>.coffeeという名前で置いておくと、bin/hubotを実行すると動き出します。isCorrectSignatureの部分は上に挙げた3番目のブログのコードを整形して使い回しています。

次の部分(19行目)がSlackにデータを投げている部分です。「lab-github」というのは、Slackのチャンネルですので、用途に合わせて変更しましょう。毎度ハードコーティングで申し訳なく・・・

robot.messageRoom 'lab-github', message

スクリプト自体はパースされたJSONのデータを切った貼ったしているだけなので、なんとなく分かる人なら、どんどんいじっていけると思います。GitHubが送ってくるJSONの実物は、さっきのGitHubのリポジトリwebhook設定ページにあります。

Slackには、次のように通知が入ります。(ちょっとデバッグ中のメッセージもありますが。)

スクリーンショット 2016-02-14 21.44.46

表示される情報がURLだけで味気ないので、もうちょっと改良の余地あり。いや、これくらいの方がかえっていいのかも・・・。

寝る。

Pocket
LINEで送る

【問題と解答】第21回未経験者大歓迎!誰でも働けるアットホームな職場ですシェル芸勉強会

Pocket
LINEで送る

問題だけのページはこちら

問題で使うファイル等

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

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

にあります。

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

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

環境

今回はUbuntu Linuxで解答例を作りましたので、BSD系、Macな方は以下の表をご参考に・・・。

Mac,BSD系 Linux
gdate date
gsed sed
tail -r tac
gtr tr
gfold fold

イントロ

補記

最近あまり本の宣伝をしていないのでシェルプログラミング実用テクニックから問題を持ってきました。

Q1

ShellGeiData/vol.21/Q1のbba.pdfからテキストを抽出して標準出力に出してください。

解答例

例題のファイルの日本語にはFlateDecodeという圧縮がかかっていますが、これを解凍する一般的なコマンドは見つかりませんでした。ですのでpdf用のコマンドを紹介するだけで・・・。FlateDecodeの解凍コマンドはzlibを使うと自作はできる模様。

###poppler-utilsをインストール###
$ sudo apt-get install poppler-utils
###あとはlessとかpdftotextとか###
$ less bba.pdf | cat
  群馬のシャブばばあ




hoge.txt[2016/02/09 22:30:32]
$ pdftotext -q bba.pdf -
群馬のシャブばばあ

hoge.txt[2016/02/09 22:30:32]

Q2

次のデータはShift JIS(cp932)の固定長データです。

$ cat anydata.cp932 
00000001??ӹ޷?ݺ?*******214413051100000002ʰ????ݸ*********114413018800000003???ӷ?ݺ?********210413093100000004??ݷ?ݺ?*********234413000800000005???ް??׳??޷?ݺ?331413090000000006??Э????ݾ޲??ݺ?1234130981

次のようなUTF-8のテキストに変換してください。

00000001ハナモゲギンコウ*******2144130511
00000002ハードバンク*********1144130188
00000003コドモギンコウ********2104130931
00000004ハタンギンコウ*********2344130008
00000005アンダーグラウンドギンコウ3314130900
00000006バミューダメンゼイギンコウ1234130981


解答

###Shift JISの半角は1バイトなのでUTF-8に変換する前に折り返すと楽です。###
$ cat anydata.cp932 | fold -b35 | nkf -wLux
00000001ハナモゲギンコウ*******2144130511
00000002ハードバンク*********1144130188
00000003コドモギンコウ********2104130931
00000004ハタンギンコウ*********2344130008
00000005アンダーグラウンドギンコウ3314130900
00000006バミューダメンゼイギンコウ1234130981

###1行の長さを調べるときは仕様書を見るか、規則性を見つけて折り返して長さを調べる###
$ cat anydata.cp932 | sed 's/[0-9]\{10\}/&\n/g' |
 LANG=C awk '{print length($0)}'
35
35
35
35
35
35
1
1

Q3

2016年の日曜日を全て列挙してください。

解答

GNU dateの-fを使うと楽です。

$ seq 20160101 20161231 | date -f - 2> /dev/null | grep 日曜日
2016年  1月  3日 日曜日 00:00:00 JST
2016年  1月 10日 日曜日 00:00:00 JST
2016年  1月 17日 日曜日 00:00:00 JST
...
2016年 12月 18日 日曜日 00:00:00 JST
2016年 12月 25日 日曜日 00:00:00 JST
###Tsukubaiを使う例###
$ mdate -e 20160101 20161231 | tr ' ' '\n' | yobi 1 | awk '$2==0'
20160103 0
20160110 0
20160117 0
...
20161218 0
20161225 0

Q4

次のデータファイル

001 あみだばばあ
002 砂かけばばあ
003 ******
004 尾崎んちのババア

に、次の新しいデータ

002 *******
003 群馬のシャブばばあ
005 純愛ババア学園

を反映して

001 あみだばばあ
002 *******
003 群馬のシャブばばあ
004 尾崎んちのババア
005 純愛ババア学園

というデータを出力してください。

解答

$ sort -ms -k1,1 newdata data | uniq -w 3
001 あみだばばあ
002 *******
003 群馬のシャブばばあ
004 尾崎んちのババア
005 純愛ババア学園

Q5

GitHubのvol.21/Q5にある次の二つのシェルスクリプトのデバッグをしてください。

$ cat ./a.bash 
#!/bin/bash

echo Hell
###実行すると変なバグ###
$ ./a.bash 
./a.bash: 行 1: #!/bin/bash: そのようなファイルやディレクトリはありません
Hell
$ cat b.bash 
#!/bin/bash

ls ˜/
###ホームディレクトリが表示されない###
$ ./b.bash 
ls: ˜/ にアクセスできません: そのようなファイルやディレクトリはありません

解答

a.bashについては「BOM付きUTF-8」という凶悪なフォーマットなので発見はバイナリの理解が大きな助けになります。が、とりあえずnkfに通せばBOMは取れます。たまにWindowsからやってきます。

###調べるとUTF-8と出るので発見が遅れる。###
$ nkf -g a.bash 
UTF-8
###xxdで見ると頭に変なバイト列。###
$ xxd -ps a.bash 
efbbbf23212f62696e2f626173680a0a6563686f2048656c6c0a
###ただし、見なくてもnkfで除去できる。###
$ nkf -wLux a.bash > a
$ chmod +x a
$ ./a
Hell

b.bashは、チルダがUTF-8のマルチバイト文字になっていて、~/がホームディレクトリに変換されません。このスクリプトには他にマルチバイト文字がないので、次のようなワンライナーでチルダがおかしいことを発見できます。

$ iconv -c -f utf-8 -t ascii b.bash | diff - b.bash 
3c3
< ls /
---
> ls ˜/

Q6

次の拡張正規表現をワンライナーで基本正規表現に変換してください。括弧の中の数字は数字の回数の文字列の繰り返しに展開してください。

$ cat extended 
a+h{5}(ho){10}[0-9]+

解答

ゴリゴリです。

$ cat extended | sed 's/[+}]/&\n/g' | sed 's/\(.*\)+/\1\1*/' |
 tr '{}()' '    ' |
 awk 'NF==2{for(i=1;i<=$2;i++){printf $1};print ""}NF==1' |
 tr -d '\n' | xargs
aa*hhhhhhohohohohohohohohoho[0-9][0-9]*

Q7

GitHubのvol.21/Q7にあるテキストについて、各段落の文字数を数えてください。

解答

改行をとって数える対象を1行にまとめる方針が簡単です。解答例はロケールが日本語で、awkがgawkである等、いろいろ制約がありますが・・・。

$ cat text | tr -d '\n' | sed 's/ /\n/g' |
 awk '{print length($1),$1}'
0 
15 恥の多い生涯を送って来ました。
353 自分には、人間の生活というものが、...にわかに興が覚めました。
103 また、自分は子供の頃、...とばかり思っていました。

Q8

GitHubのvol.21/Q8にある1350369599.Vfc03I4682c8M940114.remoteから添付ファイルを抽出して画像を復元してください。二つありますが別々に処理して構いません。

解答

まず、何行目から何行目までがデータなのか調べます。

$ grep -n -C 1 -- -- 1350369599.Vfc03I4682c8M940114.remote 
(略)
59:--047d7b621ee6cf83c604cc276bb3
60-Content-Type: image/jpeg; name="CHINJYU.JPG"
--
665-0000000000000000000000000000001//9k=
666:--047d7b621ee6cf83c604cc276bb3
667-Content-Type: image/jpeg; name="IMG_0965.JPG"
--
77341-xk9On61jS6VNFJqFxdoIZYbWK6QALsnJbBjHYcc4GT2IHJrGhUevkZ1MNypPuf/Z
77342:--047d7b621ee6cf83c604cc276bb3--

で、その範囲を抽出して変換します。一つめの画像の切り出しの例だけ示しておきます。

###出力の範囲を見ながらデータを切り出す###
$ sed -n '60,665p' 1350369599.Vfc03I4682c8M940114.remote |
 sed -n '6,$p' | base64 -d > a.jpg
###ImageMagickのidentifyコマンドでちゃんと画像になっているか確認###
ueda@remote:~/GIT/ShellGeiData/vol.21/Q5$ identify a.jpg 
a.jpg JPEG 261x261 261x261+0+0 8-bit DirectClass 34.2KB 0.010u 0:00.019
###さらにavplayで画像を見る###
$ avplay a.jpg

Pocket
LINEで送る

【問題のみ】第21回未経験者大歓迎!誰でも働けるアットホームな職場ですシェル芸勉強会

Pocket
LINEで送る

解答はこちら。

問題で使うファイル等

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

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

にあります。

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

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

環境

今回はUbuntu Linuxで解答例を作りましたので、BSD系、Macな方は以下の表をご参考に・・・。

Mac,BSD系 Linux
gdate date
gsed sed
tail -r tac
gtr tr
gfold fold

イントロ

補記

最近あまり本の宣伝をしていないのでシェルプログラミング実用テクニックから問題を持ってきました。

Q1

ShellGeiData/vol.21/Q1のbba.pdfからテキストを抽出して標準出力に出してください。

Q2

次のデータはShift JIS(cp932)の固定長データです。

$ cat anydata.cp932 
00000001??ӹ޷?ݺ?*******214413051100000002ʰ????ݸ*********114413018800000003???ӷ?ݺ?********210413093100000004??ݷ?ݺ?*********234413000800000005???ް??׳??޷?ݺ?331413090000000006??Э????ݾ޲??ݺ?1234130981

次のようなUTF-8のテキストに変換してください。

00000001ハナモゲギンコウ*******2144130511
00000002ハードバンク*********1144130188
00000003コドモギンコウ********2104130931
00000004ハタンギンコウ*********2344130008
00000005アンダーグラウンドギンコウ3314130900
00000006バミューダメンゼイギンコウ1234130981


Q3

2016年の日曜日を全て列挙してください。

Q4

次のデータファイル

001 あみだばばあ
002 砂かけばばあ
003 ******
004 尾崎んちのババア

に、次の新しいデータ

002 *******
003 群馬のシャブばばあ
005 純愛ババア学園

を反映して

001 あみだばばあ
002 *******
003 群馬のシャブばばあ
004 尾崎んちのババア
005 純愛ババア学園

というデータを出力してください。

Q5

GitHubのvol.21/Q5にある次の二つのシェルスクリプトのデバッグをしてください。

$ cat ./a.bash 
#!/bin/bash

echo Hell
###実行すると変なバグ###
$ ./a.bash 
./a.bash: 行 1: #!/bin/bash: そのようなファイルやディレクトリはありません
Hell
$ cat b.bash 
#!/bin/bash

ls ˜/
###ホームディレクトリが表示されない###
$ ./b.bash 
ls: ˜/ にアクセスできません: そのようなファイルやディレクトリはありません

Q6

次の拡張正規表現をワンライナーで基本正規表現に変換してください。括弧の中の数字は数字の回数の文字列の繰り返しに展開してください。

$ cat extended 
a+h{5}(ho){10}[0-9]+

Q7

GitHubのvol.21/Q7にあるテキストについて、各段落の文字数を数えてください。

Q8

GitHubのvol.21/Q8にある1350369599.Vfc03I4682c8M940114.remoteから添付ファイルを抽出して画像を復元してください。二つありますが別々に処理して構いません。

Pocket
LINEで送る

【メモ】ImageMagick(convertコマンド)で3枚以上の画像を合成する

Pocket
LINEで送る

単なるメモですが日本語で手っ取り早いエントリーがなかったので。以下のドキュメントを読んでやってみました。

http://www.imagemagick.org/script/command-line-options.php?#evaluate-sequence

バージョンはこれです。Macでやってます。

$ convert --version
Version: ImageMagick 6.9.2-3 Q16 x86_64 2015-10-06 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2015 ImageMagick Studio LLC
License: http://www.imagemagick.org/script/license.php
Features: Cipher DPC Modules 
Delegates (built-in): bzlib freetype jng jpeg ltdl lzma png tiff xml zlib

この5枚を合成します。これもImageMagickで連結しました。($ convert +append *.png ../a.png)

b

実行。maxのほかにmeanとかminとかあります。

uedamb:tmp ueda$ convert *.png -evaluate-sequence max ../a.png

できたのがこれ。

a

時間を食ってしまったけどこれで論文が完成する・・・。

Pocket
LINEで送る