yakataの情報奮闘記

プログラミングの話をします

期待値のいい性質

前書き~あれ400なのマ~ジ?~

こんにちはこんばんはおはようございます、B600点でWAが取れない、ヤカタです。 AtCoder Grand Contest 049 - AtCoderにレート44吸われたために落ち込んでますが、上の人たちがパフォーマンス2000台叩き出しているのを見ると、1回そういうことがあったからとかあんまり気にせずに色々やっていくべきなんだろうななどと思うわけです。

ということで、理屈は分かっていたBは置いておいて、歯が立たなかったAを見ていこうと思います。

AGC049_A

まず、Nを105で出している時点で、O(N2)、つまりある頂点とその関係を見る、みたいなことを拒否されているわけなんだから、「ある頂点ごとに状態Xがまとめられて、その状態XをN個集めると答えになる」というような状態Xを見つける必要がある。

今回で言えば、期待値でかつ、それぞれの頂点がたかだか一度しか選ばれないことを利用して(後者はいらないかも)、状態X=その頂点が選ばれる確率 とできる。ここに気づけたら、何とか状態を書きだせないかとやってみるとうまくいく。(ここまで見れば解説読んでわかる)

期待値のいい性質

Wikiに普通にまとまってたので引用。重要なのは線形性。単調性も時々使うイメージ

期待値 - Wikipedia

WSL2で~/.bashrcが読み込まれずに困った話と解決策

Hello WSL2

ブログ書くのは久方ぶりなので、書き方から忘れています、yakata66です。 今回はWSL2が起動時にbashrcを読み込んでくれずに困った話をしたいと思います。

今回起きたこと

自分は~/.bashrcにaliasを色々入れているのですが、それがterminalの再起動時に command not found. を引き起こして発覚しました。

環境はUbuntu20.04です。

そもそも起動時に何が起きているのか

WSL2は起動時に"~/.bash_profile", "~/.bash_login", "~/.profile"らへんが読み込まれるのですが、~/.profileの最初の五行に書いてあるとおり ~/.bash_profileや~/.bash_loginがあると、そっちを読み込んでprofileを読み込まないよって書いてます。

# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

ということで~/.bash_profile は読み込まれるので、即物的な対応策としては~/.bash_profileの最後に

bash

と書いてあげると~/.bashrc が読み込まれることになります。

わかる、説明できる、実装できる

最近、寝る前に蟻本読んだりして、なんとなくわかった気になっているアルゴリズムとかは結構あるものなのだけれど、じゃあいざ実装しようとすると、あるいは説明しようとすると詰まることが色々ある。

今回眠れなくていいタイミングなので、これらにあたったときの対処法とかを考えていく。

わかった→説明できる

説明のplotを用意する。

ここらへんをB5 1ページくらいで纏められるとよい。

説明する→実装する

  • 必要な変数や入力
  • 擬似コード
  • あってほしい関数名(Union Findならunionとsame?とinit)

まとめ

意外とこれだけっぽいな。適宜追記していく。

徒然

Joeチャンネルを見ていたら、VSCodeでのデバッグ方法が書いてあったので、簡単に導入してみた。 テキストベースでの解説より数倍早く導入できたように思う。

目的がInputにとどまること、たとえばアルゴリズムを覚えることとかにおいて、テキスト<動画となるかというと怪しいと思うのだけれど、実装まで含めると動画のほうが早く学べるのだろうなぁと。

matplotlib (Python) でsubplot使うときの書き方備忘録

特段加筆するなら、plotをたくさんするとなんのグラフなのかを示すものが必要になるので、一意なtitleをつけるなどすること(いつも忘れる) →もっといい書き方が最後にあります。

# 整数の各変数に対してboxplotを書きたいとする。Pandas DataFrameは変数dfに入っている。
# subplotのためにindexを取る必要があるので、enumerateを取る。
# 整数の各変数に対してboxplotを書きたいとする。Pandas DataFrameは変数dfに入っている。
# subplotのためにindexを取る必要があるので、enumerateを取る。
plt.figure(figsize=(20, 20))
for idx, column_name in enumerate(df.describe().columns.to_list()):
    # ここ↓のx,yはx*y<=カラム数になるようにint値に変更する。
    plt.subplot(x, y, idx+1)
    plt.boxplot(student_data_math[column_name])
    plt.title(column_name)
    plt.grid(True)

追記 以下のようにかける。参考文献は以下

df.select_dtypes(include=int)

pandas.DataFrameから特定の型dtypeの列を抽出(選択) | note.nkmk.me

ラプラス変換を学んだので簡単にまとめる

ラプラス変換って何が嬉しいの?

  • 線形性がある
    • L(af+bg) = aL(f) + bL(g)
  • 微分を加算と乗算に変換できる ← 強い
    • L(f') = -f(0) + L(f)
  • 逆変換が存在する

何に使うの?

  • 微分方程式が解ける。
    • 位置、速度、加速度が同じ式に出てくる物理の力学とかで使うんじゃないかな。
  • 畳み込み演算が乗算になるらしい。

参考文献

初心者用 ラプラス変換解説

ひとこと

機械学習の畳込み層を調べていたらこんなとこまで来てしまった。こんなところと言っても、理系学生なら常識なんだろうけれど。

ラズパイを公式OSのままNAS化したから見てて

※この記事のリンクはしばしばhttpである場合があります。リンク踏む場合はお気をつけください。

ラズパイを衝動買いしてしまいました。利用したのはコチラのネット通販。(https://raspberry-pi.ksyic.com/)

色々いじるとラズパイとラズパイOSの個性が見えてきて、

  • ブラウザのChromiumを起動するのに30秒くらいかかる。(サブPCとしても使いにくい遅さ)
  • terminalを叩くと特に遅くは感じない。
  • 大体Linuxだと思っておくとコマンド周りは大丈夫。だけど時々動かせないコマンドはある。
  • そのために検索するときはLinuxで検索をかけるが、そのまま適応出来ず一部コマンドを変更することもまぁまぁある。
  • 起動データ周りを壊してしまっても(おそらく)全部microSDに入っているので他のPCで直せばまた動く(エライ)

というわけでプログラミングしたりするにはいいけど、動画見たりみたいな使い方は厳しいという感じですね。今回の自分の要望が

  • ラズパイ公式OSさんで遊んでいたい
  • NAS(Network Attached Storage ネットにつながっているHDDくらいの認識)化してノートPCの容量を実質的に増やしたい。
  • すでにHDDは使っているので、formatしたくない。

という3つがありました。特に3つ目は頭わるいことこの上無いのですが、新しいの買いたくなかったから仕方ない。ちなみにntfsでフォーマットされていたので、この後はその話をします。 調べるとNAS専用OS使っているものが多いので自分で調べることに。

必要なことが

  1. (ラズパイとノートPCを同じWifiにつなぐ。)
  2. ラズパイでHDDをmountする。
  3. ラズパイでntfs形式の書き込みを出来るようにする。
  4. マウントしたフォルダを共有する。(これを起動時に行うように設定する)
  5. (ノートPCで見られるか確認する。)

でした。

ラズパイでHDDをmountする。

公式OSではつなげるだけで自動でマウントしてくれるのですが、普通Linuxntfs形式の書き込みは出来ません。そのため書き込み出来るようにマウントし直す必要がある。

umount (mount先のパス ex. /media/test)

何か怒られたらmount先のパスを見ているプロセスがあるので消す。ここはrebootしてすぐに(プロセスが作られる前に)umountしたら怒られなかったのでそれでもいい。

fuser -k (mount先のpath)

確か怒られたときにfuser使えと言われて"fuser --help"して使った気がする。ネットの記事より公式のhelp。 ココらへんは(https://open-groove.net/linux-command/fuser/)を参照したら-kmのほうがいいよみたいなことが書いてあった。まぁ壊してもいいのが強みですしおすし。

あとは

mount (マウント元のパス) (マウント先のpath)

でマウント出来ますが、これはしないで次の項目

ラズパイでntfs形式の書き込みを出来るようにする。

さて、ntfs formatを書き込みするためにntfs-3gを使います。ちなみに使い方調べたら10年前の記事がヒットしてそのまま使えました。ココらへんの話はhttpじゃないと出てこなかったので、将来的にはGoogleじゃない検索使うとかになるんですかね。 参考リンク: http://www.usamimi.info/~pochi/linux/ntfs-3g.html

sudo apt install ntfs-3g
sudo mount -t ntfs-3g (mount元のパス) (マウント先のパス)

これで書き込みが出来るようになりました。適当にvimなどでテキストファイル作ってみて確認しました。あとはちゃんとマウント出来ているかを

df -Th

で見ます。dfは本当は残り容量を見るためのものなのですが、マウントも見れるのでこれで見てます。 起動時にマウントされるように/etc/fstabに書き込んでおきましょう。ココが起動時に読み込まれ、自動でマウントされる場所のようです。 fstabについてはココらへんを参照しました。spaceの数は適当で大丈夫らしい。

qiita.com

マウントしたフォルダを共有する。(これを起動時に行うように設定する)

本当は色々大変なんでしょうけどsambaというパッケージが全部やってくれます。かんたんだね。

sudo apt install samba
vim /etc/samba/smb.conf

でここに色々書き込みます。ココらへんは他に解説を譲ります。セキュリティは甘々で作っている自覚があるので。 さて、ココまでやれば出来ているはずなので、ノートPCで確認→reboot→ノートPCで再確認をすれば終わりです。お疲れ様でした。

終わりに

ノートPCと配線地獄を分離出来たので個人的に満足です。またその気になったらラズパイOSで遊ぶことも出来るのが良き。正直ノートPCの容量が足りなくなりかけていたので、家でだけ見られればいいデータはNASに、作業中のものはノートPCかクラウドにおいておけばいいという形がおおよそ出来ました。やったね! NASは非エンジニア界隈にはもちろん、エンジニア界隈でもあまり知名度無いっぽいので、おすすめしておきます。物理的に繋げなくても容量増やせるよ。