くそ記事

PythonやらMLやら

Mojo🔥 - ダウンロードからHelloWorldまで

すごい早いと言われているMojo🔥というプログラミング言語がダウンロード可能になっていたで試してみます。

これまではプレリリース的な感じでクラウド版だけで利用できましたが、最近ダウンロードしてローカルで実行できるようになっていましたね。

https://www.modular.com/mojo

現時点はLinux向けのみ公開とのことなので、WSL2上でのローカルダウンロード版のMojo🔥のセットアップ方法をまとめます。

環境

1. Modularアカウントの作成

Mojoの公式サイトへ行ってDownload Nowボタンを押します。

www.modular.com

するとアカウント作成を促されるので仕方なく作ります。

メールアドレスを入力して6桁のPIN認証をすれば完了するのですぐ終わりました。

2. ダウンロードとインストール

認証が終わるとダウンロード方法が説明されているページに自動的に切り替わるので、それを参考にMojoをインストールしていきます。

今回Windowsのブラウザでページを開いたのでWindows->WSL2->Ubuntu22.04上での実行が自動で表示されているみたいですね。

左下のSet up on WindowsのところはMac(Appleシリコン版)とかMac(Intel版)Linuxにも切り替えられて、IntelMacではDocker使って入れる方法が書かれていました。Appleシリコン版Macでは、Linuxじゃないのになぜかそのまま入れられるみたいな感じでした。

今回Windows版の方法に従ってやっていきますが、VSCodeやらMojo拡張機能やらをインストールするように書かれているのはいったん無視して03. In the Ubuntu terminal, install the Modular CLI:

curl https://get.modular.com | \
  MODULAR_AUTH=*************** \
  sh -

を実行します。

3分ぐらい待つと↓が表示されてModular CLIのインストールが終わります。

  __  __           _       _
 |  \/  | ___   __| |_   _| | __ _ _ __
 | |\/| |/ _ \ / _` | | | | |/ _` | '__|
 | |  | | (_) | (_| | |_| | | (_| | |
 |_|  |_|\___/ \__,_|\__,_|_|\__,_|_|

Welcome to the Modular CLI!
For info about this tool, type "modular --help".

To install Mojo🔥, type "modular install mojo".

For Mojo documentation, see https://docs.modular.com/mojo.
To chat on Discord, visit https://discord.gg/modular.
To report issues, go to https://github.com/modularml/mojo/issues.

次に04. Install the Mojo SDK:

modular install mojo

を実行します。

5分ほど経つと↓のように怒られます

The virtual environment was not created successfully because ensurepip is not
available.  On Debian/Ubuntu systems, you need to install the python3-venv
package using the following command.

    apt install python3.10-venv

You may need to use sudo with that command.  After installing the python3-venv
package, recreate your virtual environment.

Failing command: /home/ubuntu/.modular/pkg/packages.modular.com_mojo/venv/bin/python3

modular: error: failed to run python:

Pythonが必要なようです。まあそれはそうですね。Python3.10をインストールしてからやってみます。

sudo apt install python3.10-venv
modular install mojo

さっきインストールしたときのごみが残っているようです。

modular: error: failure detected - please run `modular clean` and try again
==========================
Failure Information:
        - Creating symlink for /home/****/.modular/pkg/packages.modular.com_mojo/lib/liblldb.so.18.0.0git -> /home/****/.modular/pkg/packages.modular.com_mojo/lib/liblldb.so failed: File exists
        - Creating symlink for /home/****/.modular/pkg/packages.modular.com_mojo/lib/libMojoJupyter.so.18git -> /home/****/.modular/pkg/packages.modular.com_mojo/lib/libMojoJupyter.so failed: File exists
        - Creating symlink for /home/****/.modular/pkg/packages.modular.com_mojo/lib/liblldb.so.18.0.0git -> /home/****/.modular/pkg/packages.modular.com_mojo/lib/liblldb.so.18git failed: File exists
        - Creating symlink for /home/****/.modular/pkg/packages.modular.com_mojo/lib/libKGENCompilerRTShared.so.18git -> /home/****/.modular/pkg/packages.modular.com_mojo/lib/libKGENCompilerRTShared.so failed: File exists
        - Creating symlink for /home/****/.modular/pkg/packages.modular.com_mojo/lib/libMojoLLDB.so.18git -> /home/****/.modular/pkg/packages.modular.com_mojo/lib/libMojoLLDB.so failed: File exists
        - Creating symlink for /home/****/.modular/pkg/packages.modular.com_mojo/lib/libLLCLRuntimeGlobals.so.18git -> /home/****/.modular/pkg/packages.modular.com_mojo/lib/libLLCLRuntimeGlobals.so failed: File exists
        - Creating symlink for /home/****/.modular/pkg/packages.modular.com_mojo/lib/libMSupportGlobals.so.18git -> /home/****/.modular/pkg/packages.modular.com_mojo/lib/libMSupportGlobals.so failed: File exists
==========================

cleanしてから再度インストールします。(最初からPythonが入っている場合はこの操作は多分要らない)

modular clean
modular install mojo

インストールできたっぽい。

🔥 Mojo installed! 🔥

Mojo's Python virtual environment created at /home/ubuntu/.modular/pkg/packages.modular.com_mojo/venv

Now run the following commands if you are using bash:

echo 'export MODULAR_HOME="/home/ubuntu/.modular"' >> ~/.bashrc
echo 'export PATH="/home/ubuntu/.modular/pkg/packages.modular.com_mojo/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

If you are using ZSH, run the following commands:

echo 'export MODULAR_HOME="/home/ubuntu/.modular"' >> ~/.zshrc
echo 'export PATH="/home/ubuntu/.modular/pkg/packages.modular.com_mojo/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

Then enter 'mojo' to start the Mojo REPL.

For tool help, enter 'mojo --help'.
For more docs, see https://docs.modular.com/mojo.

環境変数を設定しろと書いてあるのでコピペして実行する。

echo 'export MODULAR_HOME="/home/ubuntu/.modular"' >> ~/.bashrc
echo 'export PATH="/home/ubuntu/.modular/pkg/packages.modular.com_mojo/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

これでインストールは完了。

対話形式でHelloWorld

ターミナルでmojoと打ち込む。

$ mojo
Welcome to Mojo! 🔥

Expressions are delimited by a blank line.
Type `:quit` to exit the REPL and `:mojo help` for further assistance.

  1>

Pythonぽいですね。

  1> print("Hello, world!")
  2.
Hello, world!
  2>

print("Hello, world!")と打って2回Enter押したらHello, world!と表示されました。 2回押さなけらばならないのはなんかめんどくさいですし、表示されるまで若干時間かかりました。

処理が終わったら:quitで脱出します。

  2> :quit
Process 14661 exited with status = 9 (0x00000009) killed
$

なるほど。

スクリプトファイルからHelloWorld

Mojoスクリプトファイルの拡張子は.mojo.🔥だそうです。.🔥はきもいのでhello.mojoで作ります。

fn main():
    print("Hello, world!")

ターミナルから実行します。

$ mojo hello.mojo
Hello, world!
$

なるほど。

まとめ

Ubuntuの環境さえ整っていれば、トータルで10分ぐらいでダウンロードからHelloWorldまで行けるので、簡単に使えるようになると思います。

暇だったら試してみるのもいいかもしれないですね。

Pythonのfoliumで簡単に地理情報を可視化できる

Pythonで地理情報を可視化できるfoliumというライブラリを見つけたので、ざっくりと使い方をまとめます。

実行環境

データの準備

最近暑かったので今回は気象庁の気温データを可視化してみます。

  • 気温データ

気象庁(気象庁|過去の気象データ・ダウンロード)から各都道府県庁所在地の最高気温をとってきて↓みたいな感じに整形しておきます。

kion.csv

北海道 青森県 岩手県 ... 宮崎県 鹿児島県 沖縄県
2023/6/1 24.7 26.5 24.1 ... 21.1 24.4 26.6
2023/6/2 21.9 20.0 19.3 ... 23.4 27.9 26.5
... ... ... ... ... ... ... ...

都道府県名と都道府県コードの対応辞書です。

pref_code = {
    "北海道": 1,
    "青森県": 2,
    "岩手県": 3,
    ...,
    "宮崎県": 45,
    "鹿児島県": 46,
    "沖縄県": 47
}
  • 都道府県のシェイプデータ

都道府県の形を地図上に描画するときの形状データです(多分)。 ↓のコマンドでダウンロードしておきます。

curl https://raw.githubusercontent.com/dataofjapan/land/master/japan.geojson > japan.geojson

都道府県庁所在地の緯度経度が記録されているデータです。

latlon.csv

pref lon lat
北海道 141.3469444 43.06444444
青森県 140.74 40.82444444
岩手県 141.1527778 39.70361111
... ... ...

地図を作成

必要なライブラリのインポート

import folium
from folium.plugins import HeatMap
import pandas as pd

コロプレス図を作る

まずは特定の日付の最高気温をコロプレス図(タイル形式でのヒートマップ)で描画してみます。

# 気温データの読み込みと都道府県コードへの変換
kion = pd.read_csv('kion.csv', index_col=0)
kion.columns = map(lambda x: pref_code[x], kion.columns)

# 描画対象の日付
date = '2023/8/1'

# 地図の基準
m = folium.Map(location=[35, 135], zoom_start=5)
m.choropleth(
    geo_data='japan.geojson',
    data=kion.loc[date].T.reset_index(),
    columns=kion.loc[date].T.reset_index().columns,
    key_on='feature.properties.id',
    threshold_scale=range(25,40),
    fill_color='YlOrRd',
    reset=True
)
# 地図をhtml形式で出力
m.save(outfile='map.html')

出力されたHTMLをブラウザで表示するとこんな感じ。

地図データにはOpenStreetMapを使っているんですね。

HTML形式なので、ブラウザ上でスクロールやズームもできます。

茨城が涼しいんですね。

ヒートマップを作る

次に点データの値の大きさをヒートマップで表示します。 点座標は都道府県庁所在地、値の大きさはその日の最高気温にします。

# 描画対象の日付
date = '2023/8/1'

# 緯度経度と最高気温を結合
latlon = pd.read_csv('latlon.csv', index_col=0)
kion = pd.read_csv('kion.csv', index_col=0)
kion = pd.concat([latlon, kion.T], axis=1).copy()
kion = kion[['lat', 'lon', date]].values.tolist()

# 地図の基準
m = folium.Map(location=[35, 135], zoom_start=5)
hm = HeatMap(
    kion,
    radius=15,
    blur=5
).add_to(m)
hm.add_to(m)
m.save(outfile='map.html')

東京や名古屋あたりが目立って暑そうに見えますが、都道府県庁所在地が密集しているせいですね。

動くヒートマップを作る

時系列で変化する点データを動かして可視化します。 ひとつ前のものと同じように点座標は都道府県庁所在地、値の大きさは最高気温にします。 そしてこれを日付変化で見られるようにします。

# 時系列の気温データの作成
latlon = pd.read_csv('latlon.csv', index_col=0)
kion = pd.read_csv('kion.csv', index_col=0) / 40
latlon_kion = [
    pd.concat([latlon[['lat', 'lon']], kion.loc[[date]].T], axis=1).values.tolist()
    for date in kion.index
]

# 地図の基準
m = folium.Map(location=[35, 135], zoom_start=5)
hm = folium.plugins.HeatMapWithTime(
    latlon_kion,
    index=kion.index.tolist(),
    auto_play=False,
    radius=16,
    max_opacity=1,
    gradient={0.1: 'blue', 0.25: 'lime', 0.5:'yellow',0.75: 'orange', 0.9:'red'}
)
hm.add_to(m)
m.save(outfile='map.html')

良い感じになりました。