ramenjunitiメモ

自分なりに調べたものをまとめたり、文章を書く練習したり

2020年振り返り

2020年は大変な年になりました。新型コロナウイルスにより、人と物理的に会うことが難しくなり、あらゆることが中止またはリモートで行われるようになりました。

そんな2020年になることを想像すらしていなかった自分が書いた「2020年にやりたいことリスト」があるので、これを見ながら2020年を振り返ってみます。 ramenjuniti.hatenablog.com

• 英語の勉強

やれてないです。やらんきゃ。

• CSの勉強

いくつか本を読んで知識は増やせたかなと思います。まだまだ全然ですが。

• OS作る

これを読んで作りました。OSの雰囲気はなんとなくわかった気がします。 www.amazon.co.jp

インタプリタ作る

作れてない。作りたい。

• Goにコントリビュート

やれてない。まずはソースを読むとこから!

• Go以外のOSSにコントリビュート

やれてない。自分が使っているツールとかにできたらいいな。

• 海外に行く

コロナで無理!

• イベントで登壇

やれてない。イベント系はリモート開催が多くなり、参加ハードルは下がっているので、何かネタを見つけてやりたいですね。

• 何かアプリケーション作る

研究室の食糧を管理するアプリケーションを作りました。インフラはAWS、サーバーはGo、フロントはReactで作りました。ただコロナにより、研究室に行く機会がめっきり減ったので、使うことはありませんでした。

• サーバーサイド領域の勉強

アプリケーションを作成することで知らなかったことを学べました。もっと色々作りたい。

• インフラ領域の勉強

    • AWS

    • GCP

    • Terraform

アプリケーションを作成した際にAWSを利用しました。そこで色々触ってみましたが、もっとちゃんと勉強しないといけないなと思いました。特にネットワーク周り。GCPなどの勉強はできませんでした。

ハッカソン出る

やれてない。来年は出たい。

• HHKBを買う

書いました。たまに使ってます。普段は自作のやつを使ってます。

関数型言語の勉強

SICPを読んでる時にほんのちょっとだけ。

• ジムにちゃんと行く

行きました。ただ筋トレ好きにはなってません。金払ったから行ってるって感じです。

• 就活を終わらせる

終わりました。来年から渋谷でエンジニアやります。

• git完全理解

たまにgitわからんマンになるので、完全理解はできてません。

• 富士山に登る

• どっかの世界遺産に行く

f:id:ramenjuniti:20201231173625j:plain

こんな感じでした。できたりできなかったりでした。勉強系はもっとやりたかったのですが、モチベーションを保てず、なんだかんだやらなくなってしまいました。まずはモチベーションを保つ方法を見つけないといけないような気がします。

この振り返りで見つかった課題は来年の自分に託します。今年の自分お疲れ様でした。

Cabochaで依存構文木を作る

juliaでCaboChaを呼んで係り受け解析を行い、依存構文木を作ってみました

taku910.github.io

コードはこんな感じです。

using PyCall

# cabocha
# 辞書のパス
const dic = ENV["DIC"]
const cabocha = pyimport("cabocha.analyzer")
const cabocha_analyzer = cabocha.CaboChaAnalyzer("-d $dic")

struct Node
    id::Int64
    parent::Int64
    children::Array{Int64,1}
    body::String
end

sentence = "一郎は二郎が書いた絵を三郎に贈った"

chunks = cabocha_analyzer.parse(sentence)

tree = []
for chunk in chunks
    id::Int64 = chunk.id + 1

    # 親のノードid
    parent::Int64 = chunk.next_link_id + 1

    # 子のノードid
    children::Array{Int,1} = []
    for children_id in chunk.prev_link_ids
        push!(children, children_id + 1)
    end

    # 文字そのもの
    body::String = chunk.surface

    push!(tree, Node(id, parent, children, body))
end

これにより以下のような依存構文木を生成できます

f:id:ramenjuniti:20200819135550p:plain
「一郎は二郎が書いた絵を三郎に贈った」の依存構文木

julia-vimはdein_lazy.tomlじゃなくてdein.tomlに書こう

問題

github.com julia-vimdein_lazy.tomlで以下のように読み込ませると

[[plugins]]
repo = 'JuliaLang/julia-vim'
on_ft = ['julia']

以下のメッセージがnvimを開くたびに表示されるようになりました

E117: Unknown function: LaTeXtoUnicode#Refresh

いちいち表示されるので、めっちゃ邪魔

解決

julia-vimdein_lazy.tomlではなくdein.tomlに記述したら解決しました

このissueを見ると、どうやらlazy-loadingが原因だったみたい github.com

JISキーMacでUSキーHHKBを使った時に vscode-vim の ctrl+[ が 反応しない

問題

JISキーMacでUSキーHHKBを使った時に vscode-vimctrl+[が 反応しなくなりました。

これではインサートモードから抜けられない。

でもctrl+]だとインサートモードを抜けられる。なんでや。

こちらの記事を参考にkeybindins.jsonをいじってみたがうまくいかず... android.gcreate.jp

解決

keybindings.jsonに以下のコードを追加

[
  {
    "key": "ctrl+[BracketLeft]",
    "command": "extension.vim_escape",
    "when": "editorTextFocus" 
  }
]

これで解決しました。ctrl+[ではなくctrl+[BracketLeft]じゃないと反応しないらしい。

Julia + MeCabのDockerfile書いた

これです

hub.docker.com

github.com

Dockerfileの中身はこんな感じ

FROM julia:latest

RUN apt-get update \
    && apt-get install -y mecab \
    && apt-get install -y libmecab-dev \
    && apt-get install -y mecab-ipadic-utf8\
    && apt-get install -y git\
    && apt-get install -y make\
    && apt-get install -y curl\
    && apt-get install -y xz-utils\
    && apt-get install -y file\
    && apt-get install -y sudo\
    && apt-get install -y wget

RUN git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git\
    && cd mecab-ipadic-neologd\
    && bin/install-mecab-ipadic-neologd -n -y\
    && cd ..\
    && rm -r mecab-ipadic-neologd

RUN julia -e 'using Pkg; Pkg.add("PyCall")'
RUN julia -e 'ENV["PYTHON"]="/root/.julia/conda/3/bin/python"'
ENV PATH="/root/.julia/conda/3/bin:$PATH:${PATH}"

RUN pip install mecab-python3

辞書はmecab-ipadic-neologdを利用できるようにしました

以下のJuliaを食わせると

using PyCall
MeCab = pyimport("MeCab")
mecab = MeCab.Tagger("-d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd -Owakati")
println(mecab.parse("私はラーメンを食べたい。"))

ちゃんと分かち書きしてくれます

私 は ラーメン を 食べ たい 。

MeCab以外でもPyCallが入っているのでpipで何か欲しいものを入れてあげれば、Julia側でPythonのライブラリを利用することも可能です

定期的にslackのbotのメッセージを消す

背景

slack.com

slack無料枠は最大メッセージ数が10000件となっており、メッセージ数10000件を超えると古いメッセージから見れなくなってしまいます。

しかし、サーバーの監視botのような頻繁にメッセージを送信するbotを導入している場合、メッセージ数10000件はすぐに超えてしまいます。

重要度の高いメッセージがbotのメッセージによって見れなくなってしまうのは困るので、何とかしたい...

botのメッセージを削除する

削除されたメッセージは上限にカウントされないので、botのメッセージを定期的に削除して上限を超えることを防ぎます。

こちらのツールを用いてメッセージを削除します。 github.com

Dockerイメージが公開されているので、今回はDockerを利用します。

docker pull sgratzl/slack-cleaner

以下のように実行できます。

docker run -it --rm sgratzl/slack-cleaner -c "slack-cleaner ..."

slack-cleanerの詳細な使い方はこちら

メッセージを削除するためには権限周りの設定が必要です。 トークンの取得して必要な権限を付与してください。

私は以下のようなスクリプトを書いて、cronで定期的に実行させています。

#!/bin/sh

set -eu

TOKEN="取得したトークン"
CHANNEL="チャンネル名"
DATE=`date '+%Y%m%d' --date '1 days ago'`
RATE=1

COMMAND="slack-cleaner --token ${TOKEN} --message --group ${CHANNEL} --bot --as_user --before ${DATE} --perform --rate ${RATE}"

docker run --rm sgratzl/slack-cleaner -c "${COMMAND}"
  • --groupでプライベートチャンネルを指定しています。
  • --beforeである日付より古いメッセージを削除対象にしています。
  • --rateでslack APIの呼び出し頻度を指定します。
  • --performで実際に削除を行います。

cronの設定は以下のようにしました。

0 0 * * * {スクリプトのパス}

これで毎日00:00にスクリプトが実行され、メッセージが削除されるようになりました。

2020年やりたいこと

• 英語の勉強

• CSの勉強

• OS作る

インタプリタ作る

• Goにコントリビュート

• Go以外のOSSにコントリビュート

• 海外に行く

• イベントで登壇

• 何かアプリケーション作る

• サーバーサイド領域の勉強

• インフラ領域の勉強

    • AWS

    • GCP

    • Terraform

ハッカソン出る

• HHKBを買う

関数型言語の勉強

• ジムにちゃんと行く

• 就活を終わらせる

• git完全理解

• 富士山に登る

• どっかの世界遺産に行く

雑に書きました

思いついたら随時更新する予定