ChatGPTが作ったシェルスクリプトをBing(Copilot)が修正

以前にChatGPTが作成した天気予報スクリプト。

これをBing(Copilot)が改善・修正したらどうなるかという検証です。

修正前のスクリプト

#!/bin/bash

# ユーザーに都市名を尋ねる
echo "都市名を入力してください:"
read city

# ansiweatherコマンドを実行して天気情報を表示
echo "ansiweatherの情報:"
ansiweather -l "$city"

# curlコマンドを使用してwttr.inから天気情報を表示
echo "wttr.inの情報:"
curl wttr.in/"$city?lang=ja"

行うことは単純。プロンプトで都市名を尋ね、その都市の天気予報をansiweatherとwttr.inで表示させるというもの。

これを改善案を示して欲しいですと聞いてみました。

修正後のスクリプト

  • getweather.sh
#!/bin/bash

# 都市名をコマンドライン引数から取得するか、ユーザーに尋ねる
city=$1
if [[ -z "$city" ]]; then
echo "都市名を入力してください:"
read city
if [[ -z "$city" ]]; then
echo "都市名が入力されませんでした。"
exit 1
fi
fi

# ansiweatherコマンドを実行して天気情報を表示
echo "ansiweatherの情報:"
if ! ansiweather -l "$city"; then
echo "ansiweatherから情報を取得できませんでした。"
fi

# curlコマンドを使用してwttr.inから天気情報を表示
echo "wttr.inの情報:"
if ! curl -s "wttr.in/${city}?lang=ja"; then
echo "wttr.inから情報を取得できませんでした。"
fi

スクリプトの動き

対話式

./getweather.sh 

都市名を引数にする

./getweather.sh Paris

と、対話式でもコマンドからでも実行できるようになっています。この、都市を引数に指定することによって、他のシェルスクリプトにも転用できるのはいい改良案という形でした。

続・百均グッズで作るキーホルダー。

こちらのフォトフォルダーのキャンドゥ版です。

こちらはスクェア型。写真サイズも54mmと大きめになっています。

Copilot Designer(Bing Image Creator)の画像比と一致しているので、構図塔を合わせる必要がありませんでした。

フレームが硬く、広げたクリップなどの細いものが必要です。

ダイソーのとのサイズはこんな形。より大きい分、ちょいと取り回しに苦労はします。

Ubuntu 22.04に資産管理システム『Snipe-IT』をインストール。

環境

前提

  • ドメインで名前解決できること
  • そのドメインに即した証明書があること

さっくりとした手順

  1. Snipe-IT用のDBを作成します。
  2. Snipe-ITをダウンロードします。
  3. Composerでインストールを行います。
  4. Apacheの設定を行います。
  5. Web画面からインストールを行います。

手順

  • Web画面以外はSSH/ターミナルで操作を行います。
  • Apacheの実行ユーザはwww-dataです。自分の環境に合わせます。

MySQLでDB作成

  • コンソールログイン
mysql -u root -p
  • DB作成
CREATE DATABASE snipeit character set utf8mb4;
CREATE USER 'snipeit'@'localhost' IDENTIFIED BY 'password';

この'password'は任意のパスワードに変更してください

GRANT ALL ON snipeit.* TO 'snipeit'@'localhost';
flush privileges;
exit
  • DB作成確認
  • 設定したパスワードでログインできることを確認
mysql -u snipeit -p
  • DB確認
SHOW DATABASES;

snipeitがあることを確認

  • ログアウト
exit

プログラム配置

  • Webサイト配置ディレクトリに移動
cd /home/www-data && pwd

自分の環境に合わせます。

  • ダウンロード
sudo -u www-data git clone https://github.com/snipe/snipe-it snipe-it
  • ディレクトリ移動
cd snipe-it
  • .envを作成
sudo cp -pi .env.example .env
  • .env修正

※教義・信仰に沿ったエディタで編集します。※

  • 修正箇所
APP_URL=http://ドメイン名

snipe-itを動かすドメイン名です。

APP_TIMEZONE='Asia/Tokyo'

タイムゾーンを指定します。

DB_DATABASE=snipeit
DB_USERNAME=snipeit
DB_PASSWORD= 

DB名/ユーザ名/パスワードは上述したDB作成で指定したものです。

修正後、.envを保存します。

composerでsnipe-itインストール

  • 依存関係のアップデート
sudo -u www-data composer update --no-plugins --no-scripts
  • インストール
sudo -u www-data composer install --no-dev --prefer-source --no-plugins --no-scripts
  • APPキー作成
sudo -u www-data php artisan key:generate

途中のプロンプトには「yes」を入力します。

バーチャルサイト作成

  • ログ格納ディレクトリを作成
sudo mkdir -p /var/log/snipeit

※自分の環境に合わせます。

  • ログ格納ディレクトリの権限変更
sudo chown -R www-data:www-data /var/log/snipeit
  • バーチャルファイル作成
  • Snipe-IT用の設定ファイル作成
  • 【】の箇所は、自分の環境に合わせて修正してください。
cat <<- __EOF__ | sudo tee -a /etc/apache2/sites-available/snipeit.conf
<VirtualHost *:80>
    # ドメイン名を指定します
    servername 【hoge.example.com】
    # HTTPアクセスを強制的にHTTPSにリダイレクトします
    RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>

<VirtualHost *:443>
    # ドメイン名を指定します
    ServerName 【hoge.example.com】
    # 上述したログディレクトリを指定します。
    CustomLog /var/log/snipeit/snipeit_access.log combined
    ErrorLog /var/log/snipeit/snipeit_error.log

    # Snipe-ITのプログラムを配置したディレクトリを指定します。
    DocumentRoot 【/home/www-data/snipe-it/public】
    <Directory 【/home/www-data/snipe-it/public】>
        Options -MultiViews
        AllowOverride All
        Require all granted
    </Directory>

#SSL設定
  SSLEngine on
    Protocols h2 http/1.1

    # SSL証明書を指定します
    SSLCertificateFile 【/etc/certs/hoge.example.com.crt】
    # 秘密鍵を指定します
    SSLCertificateKeyFile 【/etc/private/hoge.example.com.key】

    # 中間証明書が発行元から別ファイルで提供されている場合は、このすぐ下をコメントアウトして中間証明書を指定します
    # SSLCACertificateFile 【/etc/certs/hoge.example.com.CA.crt】

#セキュリティヘッダー付与

    Header always set Strict-Transport-Security "max-age=63072000"
    Header set X-Content-Type-Options "nosniff"
    Header always append X-Frame-Options "SAMEORIGIN"
    Header set X-XSS-Protection "1; mode=block"

</VirtualHost>

# これらのセクションはSSL暗号化強度を高めるための記述です
# </VirtualHost>の外側に書くことにご注意ください

SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2
SSLCipherSuite          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:EC6-GCM-SHA384
SSLHonorCipherOrder     off
SSLSessionTickets       off

SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
__EOF__
  • コンフィグ有効化
sudo a2ensite snipeit.conf
  • コンフィグの文法確認
sudo apache2ctl configtest

Syntax OKを確認します

  • apache再起動
sudo systemctl restart apache2.service

Web画面からの設定確認

ブラウザで

https://設定したURL

にアクセスします。

ここまで来れば目前です。ガイダンスに従って管理者情報などを入力。

このようなダッシュボードが確認できればインストール成功です。

デッキ、迷走中。(統率者メモ:2024/03/20)

内容とコンセプトが気に入って組んではいるデッキ。ちょっと詰まり気味です。

ドクター・フー統率者デッキ『パラドックスパワー』をベースに組んだデッキです。

統率者

  • 13代目ドクター/The Thirteenth Doctor
  • ヤズミン・カーン/Yasmin Khan

デッキ

クリーチャー

  • ヴリンの神童、ジェイス/Jace, Vryn's Prodigy
  • ダニー・ピンク/Danny Pink
  • オペレーション・ダブル、オスグッド/Osgood, Operation Double
  • ライアン・シンクレア/Ryan Sinclair
  • 火星の女王、イラクサ/Iraxxa, Empress of Mars
  • 骨集めのドラコサウルス/Bonehoard Dracosaur
  • 燃え盛るティラノサウルス/Flaming Tyrannosaurus
  • カーンのシスターフッド/Sisterhood of Karn
  • 探索するドルイド/Questing Druid
  • グレアム・オブライエン/Graham O'Brien
  • フォートールドの兵士/The Foretold Soldier
  • リヴァー・ソング/River Song
  • 氷刻み、スヴェラ/Svella, Ice Shaper
  • 自然の怒りのタイタン、ウーロ/Uro, Titan of Nature's Wrath
  • 逃亡ドクター/The Fugitive Doctor
  • 不死者、ミー/Me, the Immortal
  • フロストフェアのチョウチンアンコウ/Frost Fair Lure Fish

インスタント

  • 光輝の高揚/Surge of Brilliance
  • 熟慮/Think Twice
  • 大あわての捜索/Frantic Search
  • 平面の敵/Flatline
  • 襲来の予測/Saw It Coming
  • 混沌のねじれ/Chaos Warp
  • 減衰するタイムループ/Decaying Time Loop
  • 成長のらせん/Growth Spiral
  • 暴力的な突発/Violent Outburst
  • 感電の反復/Galvanic Iteration
  • マグマ・オパス/Magma Opus

ソーサリー

  • 定業/Preordain
  • 見えざる糸/Hidden Strings
  • 量子ずれ/Quantum Misalignment
  • アールンドの天啓/Alrund's Epiphany
  • 信仰無き物あさり/Faithless Looting
  • ジェスカの意志/Jeska's Will
  • 混沌の辛苦/Throes of Chaos
  • タイム・ボルテックスの中へ/Into the Time Vortex
  • 冒涜の行動/Blasphemous Act
  • 三顧の礼/Three Visits
  • 遥か見/Farseek
  • 耕作/Cultivate
  • 明日への探索/Search for Tomorrow
  • 表現の反復/Expressive Iteration
  • 倒壊と再建/Wreck and Rebuild
  • 間の悪い爆発/Ill-Timed Explosion
  • 最後の夜を一緒に/Last Night Together

エンチャント

  • パイロットにする/Become the Pilot
  • 鏡割りの寓話/Fable of the Mirror-Breaker
  • フラックス/The Flux
  • 過去へ帰還せよ/Return the Past
  • 天国送り/Heaven Sent
  • 中はとても広い/Bigger on the Inside

アーティファクト

  • 太陽の指輪/Sol Ring
  • ターディス/TARDIS
  • 好奇のタリスマン/Talisman of Curiosity
  • 衝動のタリスマン/Talisman of Impulse
  • 秘儀の印鑑/Arcane Signet
  • ソニック・ドライバー/Sonic Screwdriver
  • コンフェッション・ダイアル/Confession Dial
  • オヘル・タクの眼/Eye of Ojer Taq

土地

  • 3:島/Island
  • 2:山/Mountain
  • 3:森/Forest
  • 隠された火山/Hidden Volcano
  • 繁殖池/Breeding Pool
  • 轟音の滝/Thundering Falls
  • 商業地区/Commercial District
  • 迷路庭園/Hedge Maze
  • 根縛りの岩山/Rootbound Crag
  • 凍沸の交錯/Frostboil Snarl
  • 獲物道/Game Trail
  • 蔦明の交錯/Vineglimmer Snarl
  • 嵐削りの海岸/Stormcarved Coast
  • 落石の谷間/Rockfall Vale
  • 夢根の滝/Dreamroot Cascade
  • 神秘の神殿/Temple of Mystery
  • 天啓の神殿/Temple of Epiphany
  • 冠水樹林帯/Waterlogged Grove
  • 焦熱島嶼域/Fiery Islet
  • 隠れた茂み/Sheltered Thicket
  • 燃えがらの林間地/Cinder Glade
  • 開拓地の野営地/Frontier Bivouac
  • ケトリアのトライオーム/Ketria Triome
  • 祖先の道/Path of Ancestry
  • 統率の塔/Command Tower
  • ギャリフレイ評議堂/Gallifrey Council Chamber
  • 風変わりな果樹園/Exotic Orchard
  • 不吉な墓地/Ominous Cemetery
  • 有望な鉱脈/Promising Vein
  • 僻地の灯台/Desolate Lighthouse
  • 樹木茂る山麓/Wooded Foothills

何が問題か?

決定力不足

一撃でゲームを終わらせるのではなく、断続的なアドバンテージを得るデッキ。

リセットや出てしまったファッティに対しての体制があまりないです。

リセットからのリカバリー

地道に+1/+1カウンターを乗せていくので、除去からのリカバリーが難しくなっています。

この2点がまずタイマンの統率者で見えてきた点。

4人戦でやってから、更に方向性を探ります。

百均グッズで作るキーホルダー。

作りやすく、視認性も良かったです。

フォトホルダー

単に、フォトフレームにカラビナ風の留め具がついているだけ。

写真サイズは4.9cm×3.4cm。その写真を用意します。(Wordに貼り付けてサイズを調整するのが手っ取り早いです)

蓋を開けてカットした写真を枠内に収めます。蓋をすれば完成。

ペンケースに取り付けです。

取り付けたものが大きいので相対的に小さく見えますが、割と大きめ。

ペンケースとボトル。

アベイルでの特価品コーナーで売られていたので入手です。

弁当型ペンケース

遠目では「弁当が何故こちらに?」でしたが、実際はペンケース。

中身は街も深く、大きめのペンケースです。

メインで持ち運んでいるペンケースの他に

  • スティック糊
  • カッター
  • ハサミ

等を入れたかったので、このぐらいのサイズはちょうど良く。

蓋をするとこの形です。

中身が見えるペンケースを探していたけど、百均のようにオールクリアなのはちょっとと思っていただけに、渡りに船です。

9と3/4ステンレスボトル

こちらも入手。『ハリー・ポッター』作中、ホグワーツ特急の発着駅である9と3/4プラットフォーム。そのロゴ入りのマグボトル。

値引き額は3/4ではなく2/3引きぐらい。

実際に現地でも訪れた場所でもあるので、これもまた手元に置いて良かったヤツです。

崩せたボードゲーム。

勝手しばらく経ってたものを崩しました。

ティナーズトレイル

コーンウォールを舞台にしたボードゲーム。

  • ルールが難しそう
  • 長い

ということでボードゲーム会には持って行けませんでしたが、今回はルール確認したいという自分からのリクエストでプレイ。

  • 鉱山を競り落とし
  • 鉱山を改良し
  • 水と戦いながら採掘
  • そうして売り払った鉱石を
  • 全て投資に回す

という、かなりダイナミックなゲーム。売却する際の鉱石がラウンドごとに変動するのも凄まじい乱暴さです。(しかも、ラウンドごとに持ち越せません!)

ですが、手番のコントロールがとにかくモノを言う堅実なゲームでした。

今回は僅差で負け。

インスト込みで2時間ほど掛かったものの、もう一度やりたいゲームです。

カエサル!

「20分でローマを支配せよ」と箱に謳われているとおり、チップを置いて領土を囲んでいくゲーム。

アブストラクトでありながらバッグドローと置けるチップに制約があることで、運要素もあるゲームとなっていました。

チップの置き方がやや怪しかったので、こちらもしっかりルールを確認してやっていきたいです。

竹のカトラリー入手。

施設のアクキーに続けて手に入れた『夢の島熱帯植物園』のグッズです。

竹製カトラリーセット

サイズ感はこんな形。細長い箱に

熱帯植物園のドームが書かれた袋が入っています。

中身は

  • ナイフ
  • フォーク
  • スプーン
  • ストロー
  • ブラシ

ブラシのみが金属で、ストローの内部を洗うものとなっていました。

実際に使って

最初は面倒だと思っていた手入れも、弁当箱と一緒に洗えばそうでもないと判明。

また、これによって弁当のバリエーションが広がりましたので、汁物OKの弁当箱に切り替えたほどです。

おまけのようなストローに関しても、水出し紅茶を飲むのに最適でした。

BookStackにGoogleフォントを設定。

こちらでBookStackに任意のフォントを設定する方法を説明しましたが、

Webで公開されているGoogleフォントに置き換えます。

設定

管理者権限でログイン後、
設定>カスタマイズ>カスタムheadタグに進みます。

以下のコードを入れます。

<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+JP:wght@100..900&display=swap" rel="stylesheet">
<style>
body, h1, h2, h3, h4, h5, h6 {
font-family: 'Noto Sans JP', sans-serif;
}
</style>

ここでは Noto Sans JPを入れています。適宜合わせてください。

設定後、

のように、Googleフォントに変わっていれば設定完了です。

ChatGPTによるスクリプト修正。(通貨変換)

海外通販で、ドル円計算が面倒なのでスクリプト化。

以前、ChatGPTで作成した通貨変換スクリプトを、以下のようにChatGPT自身に修正してもらいました。

  1. CSVへの記録ではなく、○ドル◆円のように表示する。
  2. 通貨ペアの変換前の数値をプロンプトで尋ねる。(空白エンターは1)
  3. その数値で計算する。(例えば3ドル○円など)

修正した結果がこちらです。

スクリプト内容

  • currency_check.sh
#!/bin/bash

#### 変数定義ここから #####
# 通貨ペアの変換前の数値を取得する。
read -p "変換したい通貨の数値を入力してください(空白エンターは1): " conversion_factor
if [ -z "$conversion_factor" ]; then
    conversion_factor=1
fi

# 通貨ペアを変数化する。
# USDJPY=ドル円
# EURUSD=ユーロドル
# など、以下のURLに沿ったものを指定
base_currency="USD"
target_currency="JPY"
#### 変数定義ここまで ####

# 1. コマンドを実行してデータを取得し、標準エラー出力を/dev/nullにリダイレクトする。
data=$(wget -O - -U "" http://www.gaitameonline.com/rateaj/getrate 2> /dev/null)

# 2. 現在時刻を取得する。
date=$(date '+%Y/%m/%d')
time=$(date '+%H:%M')

# 3. 指定された通貨ペアの情報を取得する。
currency_data=$(echo "$data" | grep -o '{"high":"[0-9]*\.[0-9]*","open":"[0-9]*\.[0-9]*","bid":"[0-9]*\.[0-9]*","currencyPairCode":"'$base_currency$target_currency'","ask":"[0-9]*\.[0-9]*","low":"[0-9]*\.[0-9]*"}')

# 4. 必要な情報を取り出し、並び替える。
currencyPairCode=$(echo "$currency_data" | grep -o 'currencyPairCode":"'$base_currency$target_currency'"' | cut -d ':' -f 2 | tr -d '"')
open=$(echo "$currency_data" | grep -o 'open":"[0-9]*\.[0-9]*"' | cut -d ':' -f 2 | tr -d '"' | awk -v cf="$conversion_factor" '{printf "%'\''0.2f", $1 * cf}')
high=$(echo "$currency_data" | grep -o 'high":"[0-9]*\.[0-9]*"' | cut -d ':' -f 2 | tr -d '"' | awk -v cf="$conversion_factor" '{printf "%'\''0.2f", $1 * cf}')
bid=$(echo "$currency_data" | grep -o 'bid":"[0-9]*\.[0-9]*"' | cut -d ':' -f 2 | tr -d '"' | awk -v cf="$conversion_factor" '{printf "%'\''0.2f", $1 * cf}')
ask=$(echo "$currency_data" | grep -o 'ask":"[0-9]*\.[0-9]*"' | cut -d ':' -f 2 | tr -d '"' | awk -v cf="$conversion_factor" '{printf "%'\''0.2f", $1 * cf}')
low=$(echo "$currency_data" | grep -o 'low":"[0-9]*\.[0-9]*"' | cut -d ':' -f 2 | tr -d '"' | awk -v cf="$conversion_factor" '{printf "%'\''0.2f", $1 * cf}')

# 5. 結果を表示する。
echo "$date $time ${conversion_factor} $base_currency は $target_currency で以下の通りです。"
echo "始値: $open $target_currency"
echo "高値: $high $target_currency"
echo "売値: $bid $target_currency"
echo "買値: $ask $target_currency"
echo "安値: $low $target_currency"
  • 実行権付与
chmod +x currency_check.sh

動き

./currency_check.sh
変換したい通貨の数値を入力してください(空白エンターは1): 74
2024/03/13 14:25 74 USD は JPY で以下の通りです。
始値: 10,926.10 JPY
高値: 10,926.10 JPY
売値: 10,924.62 JPY
買値: 10,925.36 JPY
安値: 10,895.02 JPY

と、ブラウザを開くことなく結果が出るようになりました。

Page 26 of 238

Powered by WordPress & Theme by Anders Norén