IoTのハッカソンに参加してきたよ

本とIoTハッカソンに参加してきた。

f:id:mio_kt:20170130120514j:plain

参加者としてハッカソンに行ってきたのはとても久しぶりだ。1年ぶりくらいかもしれない。本もIoTも興味の惹かれる分野だったので、たまには参加してみようっていう軽い気持ちで参加してきた。

軽い気持ちで参加したので、誰も知った人がいない空間がしんどくて、開始1時間後くらいには帰りたくなってきた。でもせっかく来たんだしと思って、がんばって交流しているとだんだんと楽しくなってきて、終了したときは来てよかったーと思ったので記録しておく。

ハッカソンに参加しての気づき。

気づき① 役割ごとの重要性

ワークショップとかハッカソンとかに参加すると、プランナーがやたら多くて、アイデアはあるけど実装できないみたいな話をよく聞く。それで絵に書いた餅にならないように、つくることが出来るエンジニアリングが超重要と思ってた。でも今回のハッカソンに参加している人はほぼエンジニアで、企画やデザイン、UXを考えることが出来る人が少なかった。そうすると、それらスキルを持った人が重宝される。結局バランスが大事なんだなーと思う。ドラクエのパーティでも戦士ばかりだとダメ出し、魔法使いばかりでもダメだ。それぞれのスキルを組み合わせてパーティを組むことが大事だよね。当たり前のことかもしれないけど、今回体感してハッとした。

気づき② 新しい出会い

上にも書いたけど、久しぶりにハッカソンに参加したので、最初は誰も知った人がいなくて、とてもしんどい気持ちになってきた。開始1時間後くらいの説明の時間はもう帰ろうかなと思っていた。でもそこから少しづつ初対面の参加者の人たちと話していて、打ち解けてくると居心地がだんだん良くなってきた。よく知った間柄ではない人と話すのは、自分の好きなことや得意なことを再認識させてくれる。グループの中で当たり前となった前提がなにもないので、改めて自分がどういう人か話さなきゃならない。これは面倒でもあるんだけど、自分は何が好きで、どうしたいのか話すとことによって、自分はこういうことが好きだったんだなと、改めて気づかせてくれる。最近技術力を高めたい気持ちが強かったけど、自分の興味の範囲は、ただ技術力を高めて仕事をするだけではなくて、現在の社会問題を考えることや、技術によって人の生活がどう変わるかと言った側面にもあるようだ。普段まわりの人からそういう話ばかり聞くので、少し食傷気味になってたみたい。

気づき③ つくるはたのしい

ハッカソンでは二日間ひたすらつくるところを担当していた。これはひたすら楽しい。また自分ひとりで開発してるわけではないので、チームのために良いサービスにしなければならないという適度なプレッシャーがあり、これが自分にとってはとても良い。仕事以外で一人でやってると手を抜いてしまう面もあるので、プレッシャーって心地よいわけではないけど、必要だと感じる。

結果的に今回4人のチームでつくったサービスは特別賞をいただきました。頑張ったせいかとして表彰されるのはうれしいものですなー。

15 : 言語処理100本ノックでPythonのお勉強

第二章 : 15 末尾のN行をを出力

自然数Nをコマンドライン引数などの手段で受け取り,入力のうち末尾のN行だけを表示せよ.確認にはtailコマンドを用いよ.

Pythonコードはこんな感じ。

# tail.py
file = 'hightemp.txt'

N = int(input('文の末尾から切取りたい行数を選択してください。\n'))

with open(file) as data:
    lines = data.readlines()

for line in lines[-N:]:
    print(line.strip())

コードをターミナルから実行。

$ python tail.py
文の末尾から切取りたい行数を選択してください。
5

Unixコマンドで確認。

$ tail -5 hightemp.txt

Qiitaのこちらの記事を参考にしております。

14 : 言語処理100本ノックでPythonのお勉強

第二章 : 14 先頭からN行目を出力

自然数Nをコマンドライン引数などの手段で受け取り,入力のうち先頭のN行だけを表示せよ.確認にはheadコマンドを用いよ.

コードはこんな感じ。

file = 'hightemp.txt'
N = 4

with open(file) as f:
    for i, line in enumerate(f):
        if i < N:
            line = line.rstrip()
            print(line)

enumerate()関数を使うとfor文回すときに中身とインデックスを両方取得できるので便利ですね。 line.rstrip()のところは改行コードを削除するために使っています。

unixコマンドではこんな感じで確認できます。
head -4 hightemp.txt'

コマンドラインからファイルと表示したい行数を指定して実行する場合はこんな感じになります。 sysモジュールを使うとargvのリストとしてコマンドライン引数を受け取ることができます。 第2引数は行数を指定するために渡していますが、文字列として受け取っているので、関数の中で整数に変換して使っています。

import sys

def get_head_line(file, N):
    N = int(N)
    with open(file) as f:
        for i, line in enumerate(f):
            if i < N:
                line = line.rstrip()
                print(line)

if __name__ == '__main__':
    get_head_line(sys.argv[1], sys.argv[2])

13 : 言語処理100本ノックでPythonのお勉強

第二章 : 13 col1.txtとcol2.txtをマージ

12で作ったcol1.txtとcol2.txtを結合し,元のファイルの1列目と2列目をタブ区切りで並べたテキストファイルを作成せよ.確認にはpasteコマンドを用いよ.

コードはこんな感じ。

f1 = 'col1.txt'
f2 = 'col2.txt'
f3 = 'output.txt'

with open(f1) as file1, open(f2) as file2, open(f3, 'w') as out_file:
    for f1_line, f2_line in zip(file1, file2):
        out_file.write(f1_line.rstrip() + '\t' + f2_line.rstrip() + '\n')

rstrip()関数は各行の末尾の改行コードを削除するために使っています。

Unixコマンドだと以下のようにできます。

paste col1.txt col2.txt >output.txt

Qiitaのこちらの記事を参考にしています。

12 : 言語処理100本ノックでPythonのお勉強

第二章 : 12 1列目をcol1.txtに、2列目をcol2.txtに保存

各行の1列目だけを抜き出したものをcol1.txtに,2列目だけを抜き出したものをcol2.txtとしてファイルに保存せよ.確認にはcutコマンドを用いよ

コードはこんな感じ。

f = 'hightemp.txt'
f1 = 'col1.txt'
f2 = 'col2.txt'

with open(f) as file, open(f1, 'w') as file1, open(f2, 'w') as file2:
    for line in file:
        cols = line.split('\t')
        file1.write(cols[0] + '\n')
        file2.write(cols[1] + '\n')

open()関数の第2引数'w'がないとファイルが無い場合、新規にファイルを作成してくれません。プログラムの中で新規ファイルを作成する場合、忘れないように注意せねば。

Unixコマンドで行なう場合はcutを使います。

# 1列目をカットして新規ファイルに。
$ cut -f 1 hightemp.txt > col1.txt
# 2列目をカットして新規ファイルに。
$ cut -f 2 hightemp.txt > col2.txt

Qiitaのこちらの記事を参考にしています。

11 : 言語処理100本ノックでPythonのお勉強

第二章 : 11 タブをスペースに置換せよ

タブ1文字につきスペース1文字に置換せよ.確認にはsedコマンド,trコマンド,もしくはexpandコマンドを用いよ.

sedコマンドを使ってファイル中の文字を置換します。当方macOS10.12 Sierraを使っているため、 sedコマンドではなく、gsedコマンドを使います。macではこっちを使ったほうがいいみたい。 あまり詳しくは調べてません。こちらでチェックしました。

$ wget 'hightemp.txt'   
$ gsed -i 's/\t/ /g' hightemp.txt

pythonでも処理を書いてみました。

f = 'hightemp.txt'
result = []

with open(f, mode='r') as data:
    for line in data:
        line = line.replace('\t', ' ')
        result.append(line)

with open(f, mode='w') as data:
    data.writelines(result)

10 : 言語処理100本ノックでPythonのお勉強

第二章 : 10 行数のカウント

行数をカウントせよ.確認にはwcコマンドを用いよ.

今回から「第二章:UNIXコマンドの基礎」に入りました。unixコマンドで行数をカウントするだけならとても簡単で、以下のように書くと表示されます。ファイルを使うのでこちらもダウンロードしておきます。

ちなみにwcコマンドはファイルの中の行数や文字数を調べるために利用します。

$ wget http://www.cl.ecei.tohoku.ac.jp/nlp100/data/hightemp.txt
$ wc -l hightemp.txt

pythonの使い方に慣れたいので、pythonでファイルを処理するコードも書いてみます。

thisfile = 'hightemp.txt'
count = 0

with open(thisfile) as data:
    for line in data:
        count += 1

    print(count)