イナズマの日記

こんにちは。

Julia のメリットとデメリット

Julia を書いているとどういうメリットがあるかを聞かれることが多いので,Python を始めとする他言語と比較した時のメリットやデメリットを書きます.しかし,「for文が速い」みたいな月並みなことや「1/2 を 2\1 と記述できる」などのような役立った試しがないようなことは書きません. 当方 Julia,Python ともにエアプなので,こういう構文・機能を使えば便利だよ.みたいなものがあったら教えてくださると幸いです.

メリットとデメリット共に発見次第追記していく予定です.

メリット

Dot 構文

f.(x)みたいなやつです.x が配列などの時に x の各要素に関数 f を適用します. Python では map 関数を用いることにより同様のことをできますが,f の引数が複数あったりすると面倒です. 例えば,

def f(x, y):
    return x + y

を用いて,配列 (リスト) L の要素すべてを 10 増やしたいとします.

map(lambda i : f(i, 10), L)

Python だとこのようになりますが,Julia だと

f(x, y) = x+y
f.(i, 10)

と簡潔になります.

このDot構文は演算子にも適用できて,要素同士の演算が 「.==」 や 「.+」などでスッとできます.

引数の値を後ろの引数で使える

Python では

def f(x, y=x+10):

のような関数は宣言できませんが,Juliaでは

function f(x, y=x+10)

のような宣言ができます. 割と便利です.

パッケージ管理ツールで悩まない

Python はpipenv や poetryなどたくさんのツールがありますが,Julia は言語がデフォルトで持っているので選択の余地がありません,多分.

デメリット

for文でエラーが生まれやすい

for i in l
end

でfor文が書けますが,lがInt型でも動いてしまいます. 例えばPythonだとlがIntだとエラーが出てくれます.

日本語の情報が少ない

頑張って英語を読みましょう.そして我々が日本語で情報発信をやっていきましょう. もしかしたら英語の情報も Python などと比べると少ないかもです.

引数の名前を指定した呼び出しが不便

Pythonでは任意の引数を名前を指定して呼び出せます.

f(x=10, y=10)

Julia ではこれはできなくて,名前を付けて呼び出すには

function f(x; y)

のようにあらかじめ宣言しておかなければしなければなりません.このように宣言すると,セミコロンの後の引数のみ名前を付けて呼び出せます. しかしこの宣言だと,今度は必ず引数の名前を指定しなくてはならないので不便です.

precompile をする必要がある

例えばJupyterでカーネルのリスタートするたびに,各ライブラリの precompile が走り,待つ必要があります. precompile のおかげで高速になるため仕方ないですが,速度が要求されない小規模なシミュレーションなどをする際は別言語を使ったほうが良いかもです. 結構待つものの,噂によると Julia 0.6 で大幅に高速化されるらしいです.

プログラムの強制終了に時間がかかる場合がある

自分の環境のせいかもしれませんが,Jupyter の Interrupt the kernel をクリックしてもすぐにプログラムが止まらない場合があります. 連打すると止まる場合がありますが,勝手にカーネルがリスタートしていたりします.

module の import が遅いがち

Julia でモジュールを利用するときは

using package_name

と書くのですが,precompile が無くてもなんか遅いです.なんででしょう.

出力が遅い

例えば

x = 1
for i in 1:N
  x += i
  println(x)
end

などと書くと,for文が終わってから出力されたりします.なんででしょう.

「クラスタリング」のニュアンスの違い

今まで「クラスタリング」と聞くと,「データをいくつかの集合 (クラスタ) に分割すること」をイメージしていました. 実際,scikit-learn の spectral_clustering や Louvain 法などはこのような操作をしているし,私の研究でもこのような操作をするアルゴリズムを考えています.

しかし,

KDD 2020 | Minimizing Localized Ratio Cut Objectives in Hypergraphs

KDD 2020 | Parameterized Correlation Clustering in Hypergraphs and Bipartite Graphs

の論文ではクラスタリングのニュアンスが違っています. これらの論文では「あるデータ集合にとって適切な要素の発見」というようなニュアンスで使われています. 「ユーザーの聞いた音楽集合が与えられたときに,最も適切な新しい音楽をサジェストする」ようなことに応用したい場合は,このニュアンスのクラスタリングアルゴリズムを用いる方が適切だと思います.

この2つのクラスタリングにおいて,前者のニュアンスでは「Modularity」,後者のニュアンスでは「Conductance」を用いてクラスタリングの適切さが測られていることが多いです.

…ニュアンスの違いを適切に言語化できていない気がしますが,このような違いがあることを頭の片隅に置いておくと論文を読んだときに変な混乱を防げる気がします.

ところで,「Clustering」と類似した言葉に「Community Detection」や「Cutting」や「Partitioning」などがありますので,これらの単語がそれぞれ適切に意味付けられればいいなと思ってます. (僕がエアプなだけで実際にはそれぞれ違う意味付けがされているのかも)

僕が一人暮らしをしようと思った理由

自分でも自分の考えをまとめておきたかったので,書きます. 一人暮らしを考えている方の助けになれば幸いですが,個人的な考え方がかなり強く出てしまうと思います.

1. 大学が遠いから

大学が遠いと大学に行く気が大きく失せます. 僕の場合通学に往復3-4時間はかかります.これを毎日のように行うのは馬鹿です.

2. 友達と自由に遊ぶ空間ができるから

みんなでお酒を飲みながらボードゲームなどやりたくないですか?僕はやりたいです. ところで1Kか1Rなのでそんなに人間が部屋に入るかはわかりません.

2. 今より正しくお金の価値を知りたいから

実家暮らしをしている限り正しいお金の価値を知ることはできないと思っています. 生きていくために必要な多くの費用を家族に支払ってもらう,または共同で支払うからです. お金の価値を正しく知らないと,「お金を稼ぎたい」という自分の中の欲求を正しく自覚しにくいです. この欲求を正しく知らないと,自分にとって最善のお金の稼ぎ方(自分にとって,十分幸せに生活するにはどれくらいお金が必要なのかなど)がわかりません. 今回は親からいくらか仕送りをしてもらうので,完全に正しい価値を知ることはできないでしょうが,それでも今よりは正しく認知できるでしょう.

3. 一人で生きていく力を身に着けたいから

僕はクズなのでおそらく結婚はできません. 祖父母や父母は十中八九僕より早く死ぬでしょう. いずれ一人で生きていく必要が出てきます. 父母が生きているうちに大きな失敗をしておいたほうが無難でしょう.

まとめ

やっぱり言語化すると考えがまとまっていいですね.

想定質問

  • 今の時勢に毎日のように大学まで行く必要はなくないですか?
    • 僕は作業場所は家でないところが良いので,どこかしら作業場所は欲しいです. 一人暮らしするより安価で大学より環境の良い作業場所があるなら教えてほしいです.
  • 結婚できるよう努力はしないのですか?
    • その努力のほうが一人暮らしより難易度が高いように思えます.

Ubuntu20.04で回線が1時間に1回切断される時の対処

/etc/NetworkManager/conf.d/dhcp-client.conf(なければ作る)に

[main]
dhcp=dhclient

と書き込む. 他記事ではごちゃごちゃ書いてあるけど,僕はこの辺の話わからないのでこれだけ知ってればいいかな

ポケモン剣盾PGLをPCから見る

resource.pokemon-home.com

を,見ます.

おそらくPCから見られることを想定されてないので,ぶっちゃけ使いにくいです.

確かmitmproxyとかを使ってURLを調べたのですが記憶が曖昧です.Splatoonイカリングというアプリと同じ方法で調べられるはずです.

余談

  • 非開発者はこれを見れば良いですね swsh.pokedb.tokyo
  • Ranku match ←適当で草

ド健全ゲーム「Trouble Days」がLinux(Ubuntu20.04)で動いたという報告

Protonというwineから派生したなにか(よくわかってない)を使ってSteamのゲームの「とらぶるでいず」を動かしました.

qureate.net

Protonはすごく簡単に導入できるので各自調べてみてください.また,Proton DBと言うSteamのゲームがprotonで動いたかを報告しまとめているサイトがあるので購入する前に動くか動かないかの目処にできます. www.protondb.com

Proton DBでは各ゲームにレートがついて,どのくらいの手間・信頼度でそのゲームが動くかがわかるのですが,「とらぶるでいず」は報告が少なくてレートがついていませんでした. 一応Qureate製のゲームそれぞれに1,2レポートがついていて,「動くよ」みたいなことが英語で書いてあるのでそれを信頼して今回は購入しました.最悪,動かなかったら多分返金もできるので.

今回購入し起動までできたのはいいものの,画面が真っ黒でとてもプレイできたものではありませんでした.

そこで,SteamのプロパティからProton 4.11-13を強制的に使用することで無事プレイを開始することができました.(わーい) デフォルトでは5.13系が使われるみたいなので注意してください. 公式パッチも導入して動きました!! 導入するとウィンドウのバージョンの末尾に「H」が付きます.

本当はProton DBのReportとしてこの記録を残したかったのですが,英弱につきうまく投稿できなかったので取り急ぎここに記録しておきます. なるべく早くProton DBの方にも投稿する予定です.

追記 Proton DBの方にも投稿させていただきました. www.protondb.com

不具合を発見次第下に書きます. 今の所致命的なバグは見つかっていません.

  • セーブデータのサムネイルが真っ黒になる.
    f:id:inazuma110:20201105182028p:plain
    ロード画面
    - Steamに表示されるプレイ時間がおかしい(本当のプレイ時間の1/3くらいしかカウントされていない?)(もしかしたらオートにしてクリックしていない時間はカウントされていないのかも)

追記 ただの勘違いで,ちゃんとカウントされてるっぽいです.