たのしい駆動開発

たのしいアウトプットの場所

pyKNPで構文解析し、結果を有向グラフにする

ほぼほぼこいつと同じ内容です。 ssabcire.hatenablog.com

import networkx as nx
from pyknp import KNP


def tag(text: str) -> (list, list):
    '''
    return tag_ids: [(子基本句ID, 親基本句ID), ...]
    '''
    knp = KNP()
    tag_list = knp.parse(text).tag_list()
    tag_ids = list()
    for tag in tag_list:  # 各基本句へのアクセス
        if tag.parent_id != -1:
            tag_ids.append((tag.tag_id, tag.parent_id))
    return tag_list, tag_ids


def graph_to_image(tag_list, tag_ids, dg: nx.DiGraph):
    for u, v in tag_ids:
        dg.add_nodes_from([tag_list[u].midasi, tag_list[v].midasi])
        dg.add_edge(tag_list[u].midasi, tag_list[v].midasi)
    nx.nx_agraph.to_agraph(dg).draw('graph.png', prog='dot')


if __name__ == '__main__':
    text = "私はスポーツが好きだが、バスケは嫌い。でも彼はバスケがうまい"
    tag_list, tag_ids = tag(text)
    dg = nx.DiGraph()
    graph_to_image(tag_list, tag_ids, dg)



出力結果 f:id:ssabcire:20191022222905p:plain



KNPの出力結果と比較して、正しく構文木になっていることが確認できます。 f:id:ssabcire:20191022223335p:plain

ツラさ楽しさインターン

4年次の夏休みにいわゆる内定インターンとか言われるやつに行ってきました。

インターンでやったこととか

SREチームに配属され、CTOの下でひたすらPythonのコードをガリガリーって書いてました。
初日は初めての大規模かつオブジェクト指向のコード、インフラ周りをみて、ああ...これはすごい...わけわかんないとなってました😇
2週間目頃にはバグ修正のプルリクを5つほど出し、mergeまで行くことができました。 いやぁ、1年前全てがわからなくて死ぬ思いをしていたときとは大違いです。少しは成長したなあと実感しました。

ssabcire.hatenablog.com

3週間目以降はこういう機能欲しいよね!ってビジネス側から降ってきた機能を私一人で設計から実装まで行い、デプロイしました。
これが結構たいへんで、自分の実力なら4日でできそう!と思ったにも関わらず、9日もかかりました。
理由としては、実装は4日目である程度できていたのですが、仕様をきちんと把握してなくて設計の手戻りが発生したり、これは別のところに切り出したほうがいいよねとか、もっと良いかんじのコード書けるよねというレビューを多くもらい、ひたすら良くしていった結果倍以上の時間がかかりました。
(まだ時間かかりそう?と言われてひたすら謝って完成日を伸ばしてもらってたのは本当に申し訳無さと感謝しかないです...)
あとこれは血と涙の結晶の証です。(自分がクソコードを書きまくった結果こうなりました)

f:id:ssabcire:20190922201104p:plain

あとは会社のテックブログを書いたり、

tech.zeals.co.jp

会社の初CMが発表されたり、

www.youtube.com

会社のチャットコマウスくんに自分の記事を紹介されたり。

とても多くのことをインターンで経験しました。




楽しかったこと

はい。やったことだけ書いてても面白くないですよね。タイトルを回収していきましょう。

自分が書いたコードが実際に反映される喜び

これは紙一重でもありますね。バグ修正PRで自分の書いたコードがApproveをもらい、本番環境に初デプロイするときはすごくドキドキで、恐怖と喜びが入り混じっていました。実際に動いてバグ通知が全然来なかったときはすごく肩の荷が降りたのを覚えています。

いろいろな人と行くランチや飲み会

あまり話したことがない人と話したり質問したりできるチャンスの時間です。業務でわからなかったけどそこまですぐ聞く必要もないことを聞いたり、会社の課題感だったりをたくさん聞きました。 そのおかげで、会社をもっと良くしていきたいよね、日本をぶちあげたいよねという気持ちが強くなりました。
あと五反田はそれなりにランチが安く、1000円以内で済ませられるところが多くて貧乏学生には良かったです

辛かったこと

やはり私といえば失敗したり辛かった話でアクセス数を稼いでいる節があるので、ここからがこの記事の本題といっても過言ではないでしょう。

コードを書くことしかできなけりゃ業務委託でもいい。新卒じゃなくていい

お、さっそくそれは無いやろってマサカリ飛び間違い無しの煽り度の高い文が来ましたね。
あと、業務委託をディスっているわけではないです。自社に来る業務委託のエンジニアはすごい方ばかりでした。
ではなぜこんな煽りがちな文のでしょうか?それはインターン開始5日目くらいにCTOと1on1をしたときの出来事です。
色々はなした中の最後で、会社でイケてないな、と感じたところはあった?と言われたとき、私はすぐに答えることができず、新卒で入るなら会社を良くしていくことを期待されてる人物なんだから、それが出来ないなら業務委託でもいいのでは?と言われました。
その言葉に私はすごく凹み、新卒で会社を良くしていくぞと決めていたのにゆるふわでインターンを過ごしていたと後悔し、普段から疑問を持つ、課題感を探す癖をつけなければ、と決意しました。
そこから、会社やチームでこうしたいよね、といった部分を提案してみたり、自分から手を上げて挑戦してみたりしました。

自分のHOTFIX修正で炎上案件が発生した

悲しいですね。すごく悲しいです。これが起きた原因として、

  • バグ修正の方向性を決める際にビジネス側と相談せず、自分一人で決めていた
  • ただバグが治ればいいくらいの考えだったので、エンドユーザーが最高のUXになるか?という視点を持っていなかった

ため発生しました。普段から視座を高くして開発をしていかないといけない、という身を持って実感させられた出来事でした...

SQL知識が少ないせいで無駄なメソッドを作りまくって時間を無駄にした

メソッドつくってひたすらに条件式を書いていたのですが、テーブルを結合させればいい、というレビューをもらったときはすごく自分の無力感で辛かったです...
もっと知識があればこんなことにはならなかったのに...

新規機能開発で自ら切ったタスク期間の倍PRのマージに時間がかかった

自分の実装力だとこのくらいだよね〜と思って新規機能を実装できる期間を決めたのですが、レビュー後の修正や動作確認で発覚した問題の修正などで、決めた日の2倍かかりました。
これも完全に自分の未熟な部分で起こったので、これから改善していかないと...

所感とまとめ

約一ヶ月間でしたが、多くの人と話したり会社の成長を追ったり開発だったりなどすごく楽しかった半面、自分の未熟さに日々直面して辛い、という感じでした。
あとは、自分がだめだったところを日々改善して、技術力も身につけられればさらに貢献できるから頑張るぞ!!という気持ちがとても強くなりましたね。
最後にどうでもいい話ですが、20卒エンジニアは私一人しかいないので同期エンジニアがほしいです!うちの会社に応募してください😇

Juman++を使って形態素解析を行う

Juman++を使って形態素解析を行い、頻出回数順にソートします
ちなみにTwitterjsonを読み込んでます

import json
import re
from glob import glob
from pyknp import Juman


def counter(text, d):
    jumanapp = Juman()
    result = jumanapp.analysis(text)
    for mrph in result.mrph_list():
        if mrph.genkei in d:
            d[mrph.genkei] = d[mrph.genkei] + 1
        else:
            d[mrph.genkei] = 1


filenames = glob('/Users/ssab/go/src/research/twitter/json/*.json')
d = dict()
for i, filename in enumerate(filenames):
    f = open(filename, 'r')
    tweet_text = json.load(f)['full_text']
    text = re.sub(
        r'(https?://[\w/:%#\$&\?\(\)~\.=\+\-]+)|(RT@.*?:)|([ | ])',
        '', tweet_text
    )
    counter(text, d)
    f.close()
print(sorted(d.items(), key=lambda x: x[1], reverse=True))


出力

[('する', 3), ('を', 3), ('に', 2), ('インタフェース', 2), ('若い', 1), ('うち', 1), ('から', 1), ('毎日', 1), ('コツコツ', 1), ('続ける', 1), ('こと', 1), ('で', 1), ('老後', 1), ('2000万', 1), ('円', 1), ('用意', 1), ('ぬ', 1), ('済む', 1), ('ようだ', 1), ('なる', 1), ('ソリューション', 1), ('同じだ', 1), ('メソッド', 1), ('シグネチャ', 1), ('持つ', 1), ('複数', 1), ('の', 1), ('embeded', 1), ('作れる', 1), ('様', 1), ('proposal', 1), ('どま', 1), ('そ', 1), ('は', 1), ('こうして', 1), ('生まれる', 1), ('。', 1)]

pyKNPをインストールして日本語構文解析器KNPを使う

pyKNPをインストールしていきます。
pyKNPのgithubのrequirementにknpとjumanと書かれているので、インストールしていきます。

brew install knp
brew install jumanapp

どちらもそれなりにインストールに時間がかかります。


次に、pipでpyknpをインストールします。

pip install pyknp


インストールできているか確認しましょう

brew list
pip freeze



次に、KNPを使って構文解析を試してみます。

from pyknp import KNP


line = "クロールで泳いでいる少女を見た"
knp = KNP()
result = knp.parse(line)

print("文節")
for bnst in result.bnst_list(): # 各文節へのアクセス
    print("\tID:%d, 見出し:%s, 係り受けタイプ:%s, 親文節ID:%d, 素性:%s" \
            % (bnst.bnst_id, "".join(mrph.midasi for mrph in bnst.mrph_list()), bnst.dpndtype, bnst.parent_id, bnst.fstring))


print("基本句")
for tag in result.tag_list(): # 各基本句へのアクセス
    print("\tID:%d, 見出し:%s, 係り受けタイプ:%s, 親基本句ID:%d, 素性:%s" \
            % (tag.tag_id, "".join(mrph.midasi for mrph in tag.mrph_list()), tag.dpndtype, tag.parent_id, tag.fstring))


print("形態素")
for mrph in result.mrph_list(): # 各形態素へのアクセス
    print("\tID:%d, 見出し:%s, 読み:%s, 原形:%s, 品詞:%s, 品詞細分類:%s, 活用型:%s, 活用形:%s, 意味情報:%s, 代表表記:%s" \
            % (mrph.mrph_id, mrph.midasi, mrph.yomi, mrph.genkei, mrph.hinsi, mrph.bunrui, mrph.katuyou1, mrph.katuyou2, mrph.imis, mrph.repname))



参考文献

jumanとKNPの使い方 pyknp.readthedocs.io


knpのモジュールなど pyknp.readthedocs.io


さらに説明 pyKNPについてのメモ(自分用) · GitHub


jumanだけど参考になりそう chuckischarles.hatenablog.com

追記(2019-12-12)

brewでJuman++のインストールを行って、Juman++のユーザー辞書を追加しようとしたらJuman++が壊れました。
もしユーザー辞書をのちのち追加したいよ、という方はおとなしく公式の通りにダウンロードしたほうが懸命だと思います。 (もし壊れた原因など知りたければコメントください)

19社受けたエンジニア志望学生の悲哀の就活物語【就活まとめ】

苦節1年。1年以上続けてきた就活も、ついに内定を得て幕を閉じました(実はまだ少し残っていますが)。

現在就活は売り手市場で、エンジニアはこれからさらにどんどん不足していくと言われている中、私は16社落ちた結果となりました。
就活を振り返って大きく言えることは、自分はどれほど無価値なんだろう、どうせ受けても落ちるから無駄、という気持ちが何度も湧き、頭から離れないことです。
一生懸命企業分析、自己分析、面接で話すことを何度も練り直す。しかし、企業からくるメールは定型文なお祈り。これでメンタルをやられないわけがありません。就活うつや自殺者が多いことはすごく納得してしまいます。

私は、何もやってきていない遊んでばかりの人よりはそれなりに努力をしたり行動してきました。 その、ずっと努力してきた人よりはできないが、遊んでばかりの人よりはできるといった中途半端な位置にいたからこそ、卑しいプライドが大きくなり、自分のレベルより上または近い会社を受けてきた結果、多くの会社に落ちる結果となってしまいました。

こんな人間がこれから就活を始める人にアドバイスするなら、できるなら早い時期から努力をして、スピード感を持って行動をしておいたほうがいいということでしょうか。
私は大学3年生からバイトを減らしてプログラミングに力を入れ、1人独学で成果物をつくってきました。 独学では理解に時間がかかりますし、わからない所を解決する際に非常に時間がかかってしまいます。また、一人だとチームで開発する経験もめったに得られません。

就活で評価されるポイントは、”チーム(複数人)”で、"何かこと、ものを成し遂げた経験や感想、苦労した出来事”が求められます。
したがって、大学に入学後はなるべくはやい段階でものを作る経験を得ておくことが大事であると思います。

いろいろと話がずれてしまっていますが、最後に謝辞で締めたいと思います。
アナグラくん。自分が浪人しているときから行動力の凄さに感銘を受け、とても影響を受けていました。就活中は企業の紹介をしてくれたり、本当に感謝してもしきれません。ありがとうございます。
りゅうくん。kaitoさん。鯖防人くん。もやし丸さん。よしかわくん。ツイッター上で辛い時や頑張ったときなどにレスポンスをくれ、大変自分の活力になっていました。彼らが頑張っている姿を見て、私も負けないぞ、追いつくぞという気持ちで頑張ってここまで続けてこれたので、とても感謝しています。ありがとうございます。



追補

就活中ずっと思ってたことを書いたので、以下は他の人のためになるようなことをざーっと書いていこうと思います。

面接受け答え

まず1つ目に、自分が質問されたことに対し答えようと準備していたマインドマップです。
実際に質問されたのが太字になっているので、これから就活を迎える方は参考にしてみるといいかもです。あと、公開して都合が悪いものは削っています。
(追記ですが、こちら画像が潰れてしまっているので見たい人がいましたらツイッター上でDMください)

f:id:ssabcire:20190728171124p:plain

統計

次に統計です。

  • 受けた総数:19
  • 選考を蹴った数: 1
  • 1次選考落ちの数: 10
  • 書類選考(ES、履歴書、コーディングテスト)落ちの数:4
  • 内定: 1
  • サイレントお祈り: 1
  • フィードバックあり: 1

就活カレンダー

自分が行動してきた感じのカレンダー表です。
f:id:ssabcire:20190728171128p:plain

その他

志望動機を書くときに参考になったサイト

paiza.hatenablog.com

ベンチャーの採用のリアルや話す内容構成に参考になったサイト

www.wantedly.com