2024年2月14日水曜日

macOS でコマンドが終了した際に通知する方法

macOS でコマンドが終了した際に通知する方法

概要

いつも忘れるのでメモ、音ありじゃないと気づかないことがある

環境

  • macOS 14.2.1

コマンド

  • ls && osascript -e 'display notification "Command finished!" with title "Terminal" sound name ""'

参考サイト

2024年2月13日火曜日

ModuleNotFoundError: No module named '_lzma'

ModuleNotFoundError: No module named '_lzma'

概要

Ubuntu + pyenv 環境で発生したので対処しました

環境

  • Ubuntu 22.04.3
  • pyenv 2.3.31

対処方法

  • sudo apt install -y liblzma-dev
  • pyenv uninstall 3.11.3
  • pyenv install 3.11.3

動作確認

Python 3.11.3 (main, Feb  5 2024, 14:46:38) [GCC 11.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import lzma

2024年2月12日月曜日

ILLA Builder を使って MySQL の Web クライントを作ってみる

ILLA Builder を使って MySQL の Web クライントを作ってみる

概要

phpMyAdmin の代わりになるものがないか探していたところ ILLA Builder というツールを見つけたので試してみました
テーブルのデータをグリッドに表示するところまでやってみました

環境

  • Ubuntu 18.04
  • docker 19.03.13
  • ILLA Builder 4.2

起動

  • mkdir -p ~/illa/database
  • mkdir -p ~/illa/drive
  • docker run -d --name illa-builder -v $(pwd)/illa/database:/opt/illa/database -v $(pwd)/illa/drive:/opt/illa/drive -p 2022:2022 illasoft/illa-builder:latest

localhost:2022 にアクセスするとログイン画面が表示されるのでとりあえずデフォルトの root/password でログインしましょう

新規アプリの作成

右上の「Create new」から作成します

リソースを追加する

MySQL をリソースとして追加します

Action List から New -> Create from resource を選択します

リソースのタイプを選択します
今回は MySQL を選択します

接続先 MySQL の情報を入力しましょう
入力できたら Save Resource します

グリッドを追加する

右ペインにある Data grid をドラッグアンドドロップして中央に配置します
データはダミーなので表示されているデータはまだ MySQL のデータではありません

アクションを追加する

追加リソースに対してすでにアクションがあるのでそれを使います
アクションをクリックすると SQL を入力することができるので適当なテーブルの一覧を取得する SQL を入力します
そして Save してアクションを保存します
アクションの名前は適宜変更してください

グリッドとアクションを紐付ける

グリッドを選択し Data source から先程追加したアクションを選択します
そしてアクションの Run をクリックするとグリッドにデータの一覧が表示されます

PrimaryKey の設定

データがうまく表示されない場合は Primary Key を正しく設定しましょう
Primary Key を設定するとソーティングなども行えます

紹介した機能はほんの一部なので他にもいろいろなアクションと UI コンポーネントを紐付けることができます
任意のスクリプトを実行することも可能です

最後に

ILLA Builder を試してみました
イメージとしては Redash のような BI ツールに近いのかなと思います
最近ではこのようなツールをローコード開発ツールと呼ぶようです
普通に MySQL の Web クライアントととしても十分に使えそうです

参考サイト

2024年2月11日日曜日

black でなぜか再帰的にフォーマットしてくれないときの対処方法

black でなぜか再帰的にフォーマットしてくれないときの対処方法

コマンド

ワイルドカードを使いましょう

  • pipenv run black ./**/*.py

環境

  • macOS 11.7.10
  • black 23.12.1

最後に

.gitignore に含まれている場合は除外されるっぽいです

2024年2月10日土曜日

apt でパッケージを情報を確認する際によく使うコマンド

apt でパッケージを情報を確認する際によく使うコマンド

概要

いつも忘れるのでメモ
基本は apt + dpkg で網羅できます

パッケージ確認

インストール元のリポジトリなどの確認もこれ (APT-Source)

  • apt show docker-ce

パッケージ一覧確認

インストール済みも削除済みも

  • dpkg -l

パッケージがインストールしたファイルの一覧

  • dpkg -L docker-ce

インストール済み一覧

  • apt list --installed

パッケージの依存関係

  • apt depends docker-ce

特定のパッケージをアップグレード

  • apt list --upgradable
  • sudo apt install --only-upgrade docker-ce

2024年2月9日金曜日

Open Interpreter 超入門

Open Interpreter 超入門

概要

Open Interpreter は ChatGPT に問い合わせた結果をローカルのマシンで実行することができるツールです
今回は ChatGPT ではなく llama2 をローカルで動かして ChatGPT の代わりとして動かしそこに対して Open Interpreter を実行してみます

環境

  • macOS 14.2.1
  • Python 3.11.6
    • open-interpreter 0.2.0
    • openai 1.11.1

インストール

  • pipenv install open-interpreter

llama2 の起動

ollama というローカルで LLM を動作させるツールを使います
また今回は軽めの LLM (llama2 [3.8GB]) を使いますがサイズの大きい LLM モデル (dolphin-mixtral:8x7b-v2.6 など) を使う場合は /tmp などの領域が十分に空いている状態で実行してください

  • brew install ollama
  • brew services run ollama
  • ollama run llma2

モデルのダウンロードが始まるので待ちましょう

open-interpreter の実行

まずはコマンドで実行してみます

  • pipenv run interpreter --model ollama/llama2

インタラクティブモードになるので質問してみます
とりあえず今回は特定のサイトをスクレイプする Python スクリプトを作成してもらいます
すると生成したスクリプトをそのままローカルマシンで実行するか確認するダイアログが表示されるので Yes を選択しましょう
もしライブラリなどの準備が整っていればそのまま実行することができます

▌ Model set to ollama/llama2

Open Interpreter will require approval before running code.

Use interpreter -y to bypass this.

Press CTRL-C to exit.

> Create a script to scrape https://hawksnowlog.blogspot.com/ in Python.

We were unable to determine the context window of this model. Defaulting to 3000.

If your model can handle more, run interpreter --context_window {token limit} --max_tokens {max tokens per response}.

Continuing...


  Plan:

   1 Write a script to scrape the website https://hawksnowlog.blogspot.com/ using Python.
   2 Use therequests library to make HTTP requests to the website and retrieve the desired data.
   3 Use theBeautifulSoup library to parse the HTML content of the website and extract the desired information.
   4 Store the extracted data in a dictionary or other data structure for further use.

  Code:



  import requests
  from bs4 import BeautifulSoup

  # Send an HTTP request to the website
  response = requests.get('https://hawksnowlog.blogspot.com/')

  # Parse the HTML content of the website using BeautifulSoup
  soup = BeautifulSoup(response.content, 'html.parser')

  # Extract the desired information from the website
  title = soup.find('title').text
  author = soup.find(' author').text
  date = soup.find('date').text

  # Store the extracted data in a dictionary
  data = {'title': title, 'author': author, 'date': date}

  # Print the extracted data
  print(data)


  Would you like to run this code? (y/n)

ここで y を入力するとそのまま実行されます
ライブラリなどがまだインストールされていない場合は以下のようにエラーになります

  ModuleNotFoundError                       Traceback (most recent call last)
  Cell In[2], line 4
        2 import requests
        3 print('##active_line2##')
  ----> 4 from bs4 import BeautifulSoup
        5 print('##active_line3##')
        6 pass

  ModuleNotFoundError: No module named 'bs4'


  The output means that thebs4 module is not available in your Python environment. This is likely because you have not installed thebeautifulsoup4 package.

  To install the package, you can use the following command in your terminal:



  pip install beautifulsoup4


  Would you like to run this code? (y/n)

インタラクティブモードを抜ける場合は Ctrl+c を入力します

Python から実行

コマンドではなく Python スクリプトから実行してみます
実行後はコマンド同様インタラクティブモードに入り結果をそのまま実行するか確認されます

  • vim app.py
  • pipenv run python app.py
from interpreter import interpreter

interpreter.llm.model = "ollama/llama2"

ret = interpreter.chat("Create a script to scrape https://hawksnowlog.blogspot.com/ in Python")
print(ret)

注意事項

  • CPU のみの環境だと動作はするが LLM からの応答がかなり遅くなるので GPU もしくはハイスペックマシン上で動かすことをオススメします
  • 今回は LLM をローカルで動作させましたが有料版の ChatGPT の API が使える場合はそちらを使うことをおすすめします
    • モデルのサイズは大きくローカルのディスクを消費するためです
  • open-interpreter から抜ける場合は Ctrl-c で ollama から抜ける場合は /bye を入力しましょう

最後に

Open Interpreter を試してみました
LangChain では LLM に入力する情報を工夫していましたが Open Interpreter は取得後の情報を使って何かしらのアクションを実行することができます

ローカルに実行するのでスクリプトを実行するマシン上に open-interpreter のインストールが必要になりますが LLM 自体はローカルではなく ChatGPT (OpenAI) や Azure OpenAI などの API を使えるのでそこまでスペックを要求しないのも良いかなと思います

また今回は試していませんが -y というオプションを使えば自動で実行したりエラーになった場合はトライアンドエラーを繰り返してくれるので勝手にすべてやってくれる機能もあります
さすがにプロダクション環境などでは -y は怖い感じもしますが開発のサポートやローカル環境などでは便利なのかもしれません

参考サイト

2024年2月8日木曜日

Transformers + Keras で Fine Tuning してみる

Transformers + Keras で Fine Tuning してみる

概要

とりあえず Fine Tuning できるかどうか試したかったので Transformers + keras でやってみました
基本は Transformers にある Fine Tuning のチュートリアルコードにコメントを入れているだけです

環境

  • macOS 14.2.1
  • Python 3.11.6
    • transformers 4.37.2

インストール

  • pipenv install numpy tensorflow datasets transformers

サンプルコード

基本的な流れは以下のとおりです

  • 学習するデータの準備
  • 事前学習済みモデルの取得
  • 事前学習済みモデルの再学習

詳細な流れは以下のコード内のコメントに記載しています

import numpy as np
import tensorflow as tf
from datasets import load_dataset
from transformers import AutoTokenizer, TFAutoModelForSequenceClassification

# Fine-Tuning で新たに学習させるデータセットのダウンロード
# データセットは {'sentence': 'It is easy to slay the Gorgon.', 'label': 1, 'idx': 8548} というデータが 8551 個ある
dataset = load_dataset("glue", "cola")
dataset = dataset["train"]

# トークナイザーの取得
tokenizer = AutoTokenizer.from_pretrained("bert-base-cased")
# トークナイズしてテキストを ID とトークンに変換
# padding=True にすることで最も長い文章の文字数に合わせる、溢れた部分はゼロ埋めになる
tokenized_data = tokenizer(dataset["sentence"], return_tensors="np", padding=True)
# print(tokenized_data[0])
# print(tokenized_data[0].ids)
# print(tokenized_data[0].type_ids)
# print(tokenized_data[0].attention_mask)

# 学習データの作成、トークナイズしたデータを辞書化するだけ
tokenized_data = dict(tokenized_data)
# 学習データの正解ラベルの作成
labels = np.array(dataset["label"])

# 事前学習済みモデルの取得、これに dataset を Fine-Tuning する
model = TFAutoModelForSequenceClassification.from_pretrained("bert-base-cased")
# モデルのコンパイル、損失関数の指定は不要 (らしい
# M2 Mac では以下のエラーが出るので最適化関数は tf.keras.optimizers.legacy.Adam を使用する
# E tensorflow/core/grappler/optimizers/meta_optimizer.cc:961] model_pruner failed: INVALID_ARGUMENT: Graph does not contain terminal node Adam/AssignAddVariableOp_10.
model.compile(optimizer=tf.keras.optimizers.legacy.Adam(3e-5))

# モデルの再学習
model.fit(tokenized_data, labels)

# モデルの保存
model.save("fine_tuned_bert_base_cased")

トラブルシューティング

  • 低スペックマシンだとエラーになる
  • ModuleNotFoundError: No module named ‘_lzma’
    • xz をインストールして再度 python をインストールしましょう
  • M2 Mac の場合最適化関するには tf.keras.optimizers.legacy.Adam を使用する

最後に

Transformers + keras でとりあえず Fine Tuning に触れてみました
元々公開されている LLM (GPT2) を使って新たに学習したモデルが作成できました

再学習させるのである程度のマシンスペックが必要になる他データ量に応じても負荷が変わるので注意しましょう
できれば GPU 環境があるのが望ましいです

また学習元の LLM も今回は GPT2 でしたが日本語の場合には日本語に特化した事前学習済みモデルがあるのでそういったものを選択したほうがより目的にあったモデルを作成することができます (例えば cl-tohoku/bert-base-japanese など)

参考サイト