来年の目標(と、研究室に配属された話)
前回に引き続き、入院と救急車を繰り返す病弱人間でした。元気になってきたのでまたアウトプットを頑張ろうかと思って、年末も近いので簡単に今年をまとめつつ来年の目標についてお話しします。理系の大学に興味のある人もいるかと思うので、大学生活の中でも一大イベントの研究室配属についてもお話しします。
今年のまとめ
- 4月に眼科系手術、9月と12月に救急車&入院騒動、休職
- 大学学部授業ほぼ終わり
- 仕事はほとんどできず。エンジニアとしてはPythonを好きになった
- フロント・webより業務系の仕事に興味を持ちwindows(GPU載せ)を購入
来年の目標
来年の目標からは年の終わりにできたできないを反省できるようにしたいです。今は20代も後半ですが、同じように病気抱えてキャリアに悩んでいる人、理系コンプレックスな人が少しでもこんな生き方もあるんだと希望に感じてくれると嬉しいなと思っています。
病院に通って通勤できるくらい元気になったら業務系に転職する
言わずもがな。業務系というのは、ずっとWebサービスを開発していてコーディングに不安を感じていました。授業の中で自分で1から考えて、何も参考にできるものがない中シーケンス・クラス・ロジックを考える機会があったのですが、MVCのフレームワークを使ったりするのと違ってだいぶ自由にコーディングできました。私が今まで不安だったコーディング力は、自分でシーケンスを考えたり、低レイヤーも考慮できたりという力で、コーディングを手段と考えられない自分にとって今の働き方は遠回りに感じています。Webサービス界隈でも自分でライブラリを作ったり中身をみたりできる人もいると思いますが、Cやアセンブリはやる気になってもPythonやReactではそういったことはできませんでした。向き不向きが見えたので、いったん違った領域を試してみようかと思っています。
適切な発信をする
今までは病気、キャリアに悩む、というマイナスの面が大きく、自分のやってみたことも少なくて、ポエムな発信しかできていなかったと思います。今年始めにブログのコーチングを受けたのもあり、今後は自分のやってみたことを増やし、特に理系に興味のある人、自分に向いた働き方を模索している人に向けて届けられたらと思います。また、私は普段結構柔らかい話口調なのですが、文字になると長くてかたくなってしまいがちです。完全武装モードを解いてとっつきやすく発信していきたいです。
研究室で成果を出す
そういえば、研究室配属をされました。その話は後ほど。
研究室に配属された話
Twitterで交流のあった方から、スケジューリングに困っているという話を伺ったことがありました。元々離散数学が好きだったのに加え、そういったいわゆるソルバーを使って解くスケジューリング問題ってなんだろうというところから数理最適化にたどり着きました。何もわからない中で研究室に配属され、今数理最適化の全体像を把握しようと頑張っています。このあたりの解説記事も書こうと思っています。今知っている限り、身近なところだと路線検索アプリやマッチングアプリ、災害時のサービス復旧の計画などに使われているようです。面白そうでしょ。
以上、来年の目標でした。来年は生きている実感がほしいです。また来年もよろしくお願いします。
windowsのキーバインドを変更する
最近体調を崩して救急車で運ばれるだとか、それとは別に手術するだとかしていました。web屋さんなのでMacを使っていたのですがこの機会にやりたいことを見つめなおそうと思いとても久しぶりにwindowsを購入し、キーボードはおさがりのゲーミングキーボードを使うことにして、久しぶりにブログを書こうとしたんです。 そこでwindowsキーがないことに気づきました。windowsでスクショを簡単にとるにはwindowsキーが必要です。長くなりましたが、初めてキーレジストリをいじってキーをマッピングすることにしました。
やること
キーボードにあるよくわからないキー(見たこともない図が書いてある)をwindowsキーとして割り当てる
手順概要
yukituna.com こちらのサイトを参考にしました。
- キーに割り振られた値を確認する
- レジストリエディタを開く
- Scancode Map というファイルを作成する
- 変更したいキーのバイナリを書き込む
- PCを再起動する
キーに割り振られた値を確認する
kts.sakaiweb.com
Keymillというソフトを使用しました。動作に.Netの環境が必要なようです。
起動すると下記のような画面になります。
レジストリエディタを開く~PC再起動まで
yukituna.com さきほど紹介した上記のサイトに沿って設定を行っていきます。 バイナリの書き方だけは
so-zou.jp このサイトを参考にしました。
キーの値を各順番に注意が必要で、ビッグエンディアンなので先ほど確認した値を2桁ずつ逆にして書きます。 レジストリエディタにScancode Mapというファイルを作成し、無事にバイナリを書き込めたらPCを再起動しましょう。晴れてキーバインドが変わっているはずです。
感想
正直windowsを触るのも久しぶりで、PCを触るすら久しぶりで1時間ほどかかってしまいました。今後はしばらくweb系に関係のないもの、例えばOS作ってみるとかCPU作ってみるとか、時にはFPGAを触ってみるとか、そういうことで息抜きをしつつ回復しようと思います。
Pythonで関数を呼び出す時に参照渡しで呼び出し元の変数を直接関数の中で書き換えたかった
Pythonで関数を呼び出す時の引数を参照渡し
にして、呼び出し元の変数を直接関数の中で書き換えたかった時に躓きました。イミュータブル
が良いとされている世の中ですが、どうしても参照している値のインデックスを呼び出し元の変数と直接関数の中とで共有したかったという状況です。この悩みの原因はそもそもPythonで関数を呼び出す時に参照渡し
になっているところにあるのですが、同じように悩む人がいるかもしれないので詳細な仕組みについてまとめます。
参照渡しと値渡し
値渡し
が引数の値をコピーして渡す方法で、独立してメモリ上に値を保管します。参照渡し
がメモリアドレスを渡す方法で、呼び出し元と関数の中で同じ値を参照します。
Pythonのミュータブルとイミュータブル
ミュータブル
な値はリスト、セット、ディクショナリなどです。部分的な値を変更が可能(メモリ上の値自体
の変更が可能)です。
イミュータブル
な値はタプル、数値型、文字列、ブーリアン、Noneなどです。注意するべきは、イミュータブル
な値でも再代入
は可能なことです。仕組みとしては、変数にメモリの番地
が入っており、再代入するとメモリの番地
が変更される、ということになります。一応コードで具体例を示します。
a = 5 b = a #この時点ではメモリの番地は同じ b = 1 #ここでbのメモリの番地が変わる
Pythonは変数にメモリの番地
を持っているため、値渡し
と参照渡し
という切り口ではなく、ミュータブル
とイミュータブル
と言う切り口で捉えるのが適切です。Pythonではメモリの番地
を直接操作するような低レイヤの事柄は基本的に見えません。
ここまででわかるように、私が悩んだ
呼び出し元の変数を直接関数の中で書き換えたかった
はPythonではできないようです。
Mecabの形態素解析の精度を向上する
形態素解析によく使うMecab
ですが、何も考えずに使うと変なところで切れてしまうことがあったり、品詞が違ったりしました。今回は米津玄師さんのLemonを題材に、Mecab
の形態素解析の精度の向上について書きます。
Mecabとは
taku910.github.io
上記を参照してください。形態素解析に用いるエンジンとしては他にChaSen
(隠れマルコフモデル)やJuman
(RNN言語モデル)がありますが、Mecab
は高速に動作するため現場でよく使われています。
インストールについても上記の記事を参考にしてください。Macの場合は
#Mecab brew install mecab #初期の辞書 brew install mecab mecab-ipadic #python用のmecab pip install mecab-python3
で最低限の環境が整うはずです。今回の検証環境は以下です。
mecab -v #mecab of 0.996 python -V #Python 3.6.5
歌詞を読み込む
歌詞をテキストファイルで用意します。今回はLemon
をlemon.txt
というファイル名で用意しました。
夢ならばどれほどよかったでしょう 未だにあなたのことを夢にみる 忘れた物を取りに帰るように 古びた思い出の誇りを払う
この歌詞をPythonで読み込みます。
一行ずつlistに入った入れ子のlistになるので、reduce
を用いて一行ずつのstrのlistに直します。
import pandas as pd import numpy as np import MeCab from functools import reduce lyrics = pd.read_table("./lemon.txt", header=None, encoding="utf-8").values.tolist() lyrics = [reduce(lambda x: x, l) for l in lyrics] print(lyrics) #['夢ならばどれほどよかったでしょう', '未だにあなたのことを夢にみる', '忘れた物を取りに帰るように', '古びた思い出の誇りを払う']
辞書なしで形態素解析をする
#辞書なし tagger = MeCab.Tagger() no_dict_result = [] for line in lyrics: tagger.parse("") node = tagger.parseToNode(line) while node: if node.surface: result = "「{}」の品詞は{}".format(node.surface, node.feature.split(",")[0]) no_dict_result.append(result) node = node.next
tagger.parse("")
については、入れないとエンコードエラーを起こすことがあります。
詳しくは下記を参照してください。
辞書ありで形態素解析をする
辞書としてmecab-ipadic-neologd
を使います。説明は下記を参照してください。
指示にしたがってインストールしていきます。
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git cd mecab-ipadic-neologd ./bin/install-mecab-ipadic-neologd -n
Mecab
を使う際に辞書の位置を指定する必要がありますが、下記のコマンドで確認できます。
echo `mecab-config --dicdir`"/mecab-ipadic-neologd"
#辞書あり tagger_with_dict = MeCab.Tagger('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd') use_dict_result = [] for line in lyrics: tagger_with_dict.parse("")#エンコードエラーのため(https://qiita.com/kasajei/items/0805b433f363f1dba785) node = tagger_with_dict.parseToNode(line) while node: if node.surface: result = "「{}」の品詞は{}".format(node.surface, node.feature.split(",")[0]) use_dict_result.append(result) node = node.next
テキストファイルに書き出して比較する
いままでの結果を下記のようなコードでテキストファイルに書き出して比較してみました。
write_path = "no-dict.txt" print(no_dict_result) with open(write_path, mode='w',encoding='utf-8') as f: f.write('\n'.join(no_dict_result))
上記は辞書なしで形態素解析をするの方の結果を書き出しています。
結果はこんな感じです。左が辞書なしで形態素解析をする
の結果で、右が辞書ありで形態素解析をする
の結果です。辞書なしもともとの精度も今回の歌詞については悪くありませんが、「夢ならば」が「夢」「なら」「ば」とわかれるなど、さらに精度が向上していることがわかります。
まとめ
辞書を使うことでMecab
の形態素解析の精度を向上できました。
他にも形態素解析前に前処理
として記号やタグ文字を取り除くことや、速度を気にしないならJuman++
を使うなどの精度向上の方法が考えられます。今回は取り上げませんでしたが、前処理にはneologdn
というPythonのライブラリを使うこともできるようです。
今回のソースコードは結果も含めて下記にあげてあります。
PythonでTwitterのフォロワー数をグラフ化する
3月からブログメンタリングを受けており、ブログ週間PV
、累計はてなブックマーク数
、ブログ読者登録数
、Twitterフォロワー数
をKPIとして設定しています。
今まではただ確認するだけでしたが、せっかくなのでグラフにして施策を打ちやすい状態を作ることにしました。Jupyter Notebook
上でスクレイピングをして、Matplotlib
を用いてグラフ化し、ipynbファイルをバッチで実行してhtmlファイルを吐き出します。なお、Google Apps Script
を検討していましたが、デフォルトアカウントでしかスクリプトがかけないため、複数アカウントを使っている私には大変そうなのでやめました。
今回の記事ではTwitterフォロワー数
のスクレイピングとバッチ設定とグラフ化について書きます。
環境
Jupyter Notebookを使います。
python -V #Python 3.6.5 jupyter --version #4.4.0
Tweepyでフォロワー数を取得
Twitterのフォロワー数についてはTweepy
というライブラリを用いて行います。
pip install tweepy
次に下記の記事を参考にTwitter APIの登録をして、APIキーなどを取得してください。
auth = tweepy.OAuthHandler(API_KEY, API_SECRET_KEY)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
api = tweepy.API(auth,wait_on_rate_limit = True)
Jupyter Notebookを新しく開き上記のコードで事前に設定をしたら、api.me()
で自分のTwitterアカウントの情報を取得できます。私はtwitter_collection.ipynb
という名前で実行することにしました。
api.me().followers_count api.me().friends_count
Twitterのフォロワー数の履歴はtweepyを用いては取得できず、他のサイトからクローリングする必要があります。そのため、今回は日々Twitterのフォロワー数をCSVに記録することとします。
PATH = "data/twitter.csv" dt_now = datetime.datetime.now() #もしファイルがあれば if os.path.exists(PATH): with open(PATH, 'a') as f: writer = csv.writer(f) writer.writerow([dt_now.strftime('%Y年%m月%d日'), followers, followees]) else: with open(PATH, 'w') as f: writer = csv.writer(f) writer.writerow(["日付", "フォロワー数", "フォロー数"]) writer.writerow([dt_now.strftime('%Y年%m月%d日'), followers, followees])
ipynbのバッチ化
Jupyter Notebookのバッチ化はrunipy
というライブラリを用いて行います。
pip install runipy
これで下記のようにコマンドラインからipynbを実行できるようになります。
runipy twitter_collection.ipynb
このコマンドをcron
で設定します。ターミナルで下記を入力します。
$ crontab -e
何も書き込まれていないファイルが開かれるので、下記を入力します。毎朝7時にコマンドを実行します。パスは絶対パスで指定してください。
PYTHONIOENCODING = 'utf-8' LANG=ja_JP.UTF-8 0 7 * * * cd (実行パス);(runipyの絶対パス)(ipynbの絶対パス)
0 7 * * *
は(分)(時)(日)(月)(曜日)です。ワイルドカードで指定すると毎分や毎時という設定になります。ホームディレクトリでコマンドが実行されるので、cd
で移動してからコマンドを叩くようにします。コマンド自体のパスも絶対パスで指定します。
集計したデータのグラフ化
Jupyter Notebookをまた新たに開き、モジュールを読み込みます。私はtwitter_analysis.ipynb
という名前で実行することにしました。
import pandas as pd import numpy as np %matplotlib inline
CSVからデータを読み込みます。
PATH = "data/twitter.csv" dates = [] followers = [] followees = [] with open(PATH) as f: h = next(csv.reader(f))#ヘッダー行を読み飛ばす reader = csv.reader(f) for row in reader: dates.append((row[0])) followers.append(int(row[1])) followees.append(int(row[2]))
読み込んだデータをグラフ化します。
df = pd.DataFrame( { 'follower': followers, 'followee': followees }, index = dates ) df.plot()
最後に作ったJupyter Notebookからhtmlファイルを吐き出します。ターミナルで以下を実行してください。
runipy twitter_analysis.ipynb twitter_analysis_out.ipynb jupyter nbconvert twitter_analysis_out.ipynb --to html
上記のコマンドもcron
に登録してもいいでしょう。
参考資料
ソースコードは以下に置きました。
今回の分のソースコードはスクレイピング部分がtwitter_collection.ipynb
、グラフ化部分がtwitter_analysis.ipynb
です。
グラフは下記のように出力されます。
ブログメンタリングを受けて1ヶ月たったのでまとめた
@kakakakakku(https://twitter.com/kakakakakku)さんのブログメンタリングを受け始めて1ヶ月がたちます。 これまでの振り返りや学んだことについて記事にまとめます。 ブログメンタリングについては
上記の記事をご参照ください。
受けようと思った動機
「プログラマーになれていない」と感じていたので、その状況を改善したく、ブログメンタリングに応募しました。 「プログラマーになれていない」を分析すると、
- 業務範囲が広くて自分が何をしている人かわからない、それぞれの分野の知識が浅い
- 技術面で聞かれたことに答えていると知識が浅くて苦しくなってくる
- 一人で開発することが多くて交流機会が少ない
という3つが要素としてあると自覚をしていて、ブログメンタリング応募時にはその旨を伝えました。
今月やったこと
「週に1度、決めた日にブログ記事を公開する」が基本ですが、その他にやったことを列挙します。
- KPIの決定 - ブログネタの書き出し - はてなブログの設定 - Twitterやブログの紹介文の見直し - フォローや読者登録の習慣化 - ブログネタ探しの習慣化
KPIの決定
私ははてなブログでブログを書いているので、KPIとして週間PV
、累計はてなブックマーク数
、はてなブログの読者数
と、自己ブランディングをしたいのでTwitterのフォロワー数
をKPIとして設定しました。1ヶ月目時点では可視化ができておらず、数値もなんとなく眺めるだけに終わっています。
ブログネタの書き出し
Trelloにまずは20個、ブログネタを書き出しました。テーマとしては普段使うライブラリを列挙したうえでその機能についてだとか、業務で調べる内容だとか、普段から気になっていたことを最初は列挙しました。使うライブラリのドキュメントを読んで、気になる機能を見つけました。ブログネタはブログを書き出してからも増えていて、ブログを書いている時に検索した内容や、目についてキーワード、日々の業務での躓きもブログネタとしてストックしています。@kakakakakkuさんに検索履歴
がテーマになるとアドバイスをいただいたのは目から鱗でした。
はてなブログの設定
最初ははてなブログにGoogle Analytics
とGoogle Search Console
を設定しました。
ブログを書くたびにカテゴリ
を設定し、サイドバーにカテゴリ一覧
を表示するようにしました。
さらにサイドバーにプロフィール画像
として、Twitterのアカウントと同じアイコンを設定しました。
Twitterやブログの紹介文の見直し
ブログの説明文
を見直しました。具体的には、
> コピペ職人のPGだけどまともなPGになりたいしなんならkaggleもやりたい
という説明文でしたが、
> コーディング力に自信のないWebエンジニアが自信をつけるために試したことまとめます。コンパイラ言語を試したり、フレームワークのコードを読んだり、業務で使うAWSやReactについての記事を書きます。
と変更しました。
ブログデザイン
も可愛い見た目で可愛いフォントのデザインを使っていたのですが、内容とマッチしておらずフォントも読みにくかったので、シンプルなブログデザイン
に変更しました。
Twitterの方は自己紹介文
を見直しました。
> AWS 機械学習 React
という内容を書いていたのですが、普段は機械学習についてはほとんどツイートしていませんでした。 ブログにはコンパイル言語の内容やコーディング力を上げる系の記事を書いていたので、
> 業務系とコンパイル言語が気になりだしてコーディング力を底上げする方法を模索中。
を追加して、ツイート内容も見直すようにしました。最新の情報紹介
をしたりリツイート
をするのは今後の課題です。
フォローや読者登録の習慣化
先ほども書いたリツイート
をするとか、自分からフォロー
したりはてなブログなら読者登録
をすることで、人と交流することを習慣化するよう努力しています。
とはいえ、現状は普段まったくしていなかったところから、意識するようにしただけです。こちらも数値で目標を立てて、来月は習慣化できるようにしていきます。
ブログネタ探しの習慣化
ブログネタをストックするため、
- 業務中に躓いたことや検索したキーワードをメモする
- 2日に1回は
はてなブックマークのテクノロジーページ
とTwitter
とQiita
のトピックを眺める
を実践しました。また、ブログのネタを探す時に軽いネタ
と重いネタ
とに分けるようにしました。分け方はブログを書くまでにかかりそうな時間で、重いネタ
ばかりにならないように注意しています。
ブログの書き方について
毎回ブログを書いたら確認するようなこととして、表記揺れ
やシンタックスハイライト
、URLの埋め込み
などはご指摘いただきました。
あとは記事を書く時のコツとして画像を入れる
、強弱をつけるため強調を使う
ということも意識しています。
最後に、ブログメンタリングを受けるようになってから、他の人のブログをインプットとして読んでから記事を書くようにしています。
最初の頃に書いた記事
Pythonでテトリスを作ることでよく知らない分野の実装手順について考察する(1)設計編 - ぴよまるがアウトプットするってさ
は主観的
でメモのようで、書き方も強調もなく再現性もなく読みにくいです。
一方で最近書いた記事
textlintを使ってブログの表記揺れをなくす - ぴよまるがアウトプットするってさ
は他のブログを参考に読む人が欲しい内容を分析
して、客観的
に書くようにして、再現性や画像の量に気をつけました。
来月やること
- ツイート内容を見直す(
最新の情報紹介
をしたりリツイート
をする) フォロー数
、読者登録数
について目標数を決めて達成する- 設定したKPIを可視化し、毎週振り返りと施策立てをする
- OGPの設定をする
自分用のメモ
の記事の数はブログには書かず、ターゲットを想定した
記事を増やす
textlintを使ってブログの表記揺れをなくす
3月頭から@kakakakakkuさんにブログメンタリングをしていただいています。その中でよくご指摘いただく事項に表記揺れがありました。 そんな時に役立つ文書校正ツールのtextlintについて紹介します。
textlintとは
特定のルールにしたがって自然言語をチェックしてくれます。 CLI経由でも利用できますし、Visual Studio CodeやAtomとの連携も可能です。
環境
textlintはnpm経由でインストールします。今回は特定のフォルダ内のあるマークダウンファイルを対象とし、
~/blog
というリポジトリの中に~/blog/textlint.md
を作成したとして進めます。Node.jsはインストールされているとします。
npm -v #6.5.0
手順
まず、package.json
の生成をします。
npm init --yes
このコマンドでpackage.json
が生成されます。
次に、textlintをインストールします。
npm install --save-dev textlint
次に、ルールをインストールします。
結論から言うと、技術ブログの校正であればtextlint-rule-proofdict
とtextlint-rule-preset-ja-technical-writing
でことたりそうです。
npm install --save-dev textlint-rule-proofdict textlint-rule-preset-ja-technical-writing
次に、textlintのルールを有効にするファイルを生成します。
npx textlint --init
このコマンドで.textlintrc
が生成されます。
最後に、textlint-rule-proofdictの辞書の設定をします。
こちらにあるようにリポジトリをforkして細かく表記揺れ検知の設定をすることも可能です。 .textlintrc
"filters": {}, "rules": { "preset-ja-technical-writing": true, "proofdict": { "dictURL": "https://azu.github.io/proof-dictionary/" } } }
実際に使う
npx textlint textlint.md
自動修正も可能です。
npx textlint --fix textlint.md
Visual Studio Codeでの使用
vscode-textlint
という拡張機能を入れます。
これだけで.textlintrc
の配置されているプロジェクトを開くと、リアルタイムで画像のように校正されます。
まとめ
textlintを使用することで表記揺れを減らすことができ、ブログを見直す時の心理的ハードルが下がりました。 ぜひ導入してみてください。