見出し画像

【0069】sqliteを使う

随分間が空きましたが、間に挟まったタスクは無事終わりました。
というわけでちまちまこっちもまた再開していきたいと思います。
また割り込みが発生する想定ではありますが……。

さて、前回までで基本的にアイテムを拾うことに成功……
してたような気がしますが、
アイテムテーブルをスクリプト内に持つことに将来的な不安が残っていました。解決はしたものの速度的な問題もあったと記憶しています。

やっぱデータはDB化しないとキツイかなあということで
境内の通りsqliteを使おうと思います。

使おうと思いますって軽く書きましたけど
私sqliteとか触ったこと無いんですよね。

単純に「軽量で組み込みに使われることもある」という事前情報を知っていたというだけです。

使用可能なのかどうかから検討していきます。

sqliteでググると
・軽量である
・サーバを建てなくてもいい
・インストールしなくていい
というまあ想像だけはしていたような記事がヒットします。
それを見る限りはなんとなく要件にあっているような気がします。

で「インストールしなくていい」っていうのは、
コマンドラインでパイプかなんかでDDLなりDMLなりの文字列を渡せばいい
生で実行可能なファイルがある、ということなのかなと想像しました。
※実際にそうなんですけど、かなり苦戦しました

その実行可能形式ファイルはどこにあるのかなと
sqliteのdlサイトに飛びます。

なんかいっぱいありますけど、
とりあえず今はlinuxでぺしょぺしょやっているのでlinux版を……

画像1

……x86って書いたやつしか無いんですけど。
(私が使っているのは64bitのchromebook上のlinux)

とりあえず落としてみますか。

展開して出てきたものを叩いてみます。

画像2

しってた。
(実際にはアーキテクチャのバイトオーダが違うことに気づかずに数時間、「使い方が間違っているのだ」と思ってwebの海を延々と泳ぎ回っていた)

まあ3時間あれこれやって、わからなくてやめて翌日寝て起きたら「ああ、バイトオーダ違うからno such filreってなっているのであって、配置と入力自体は間違ってないのでは?」と、すぐに気づいたわけで……

まあ「煮詰まったら寝ろ」という百億兆回言われ尽くしてる至言でございました。

それにしてもweb上に、「linuxでsqliteをインストール無しで使う」という例文が殆ど見つからない。

「sqliteはインストール不要で使えます」
→「では使ってみましょう。まずはapt install……」

っていう感じの記事ばっかりで
「インストール不要っていう言葉はどこで表現されているんだよ!?!?!??!」
って一人で叫んでいました。

インストールすりゃ適切なものが選択されるわけで、普通に上記のコマンドが通ることは確認しました。
でも想定しているのは、このshellgame.shからコマンドラインを発行してアイテムなり敵なりの情報を取得してくるものであって、
ユーザのシステムにsqliteがインストールされていることに依存させるわけには行かないのですね。
なので「インストール不要」という利点を利用する必要がありました。

はい。というわけで、バイトオーダが違う実行ファイルしか置かれていないので、うまく使えないような感じでした。
公式にはlinuxのコマンドライン用プリコンパイル済みのものは32bit版しか無いようです。

で、上の方に。

画像3

そーすこーど。とかいう文字列があります。
アマルガム……合金?ナンノコッチャかよくわかりません。

説明がありますが……読んでもよくわかりません。

まあとりあえず上から順に落として試してみます。

なんかcのソースみたいなものが入っていたので、これでいいような気がします。これを、自分の環境でコンパイルすれば64bit版になるでしょうか。

どうやってコンパイルするのかの説明も一応あります。gccコンパイル……らしいです。

当然gccは前に使ったことあるぞ、この環境には入ってないけど。
ということでgccはおとなしくapt installします。

gccがインストールされたらさっきの説明ページにあるとおりに

画像4

……どれ?

google先生!!!!!!英語がいじめるーーー!!

画像5

いい時代ですね(恍惚)。

やりたいことはshellscriptからたたき事なんで、
これの「shell.c」だけアレばいいんだろうか……

画像6

linuxですが、まあこれのこったろう(楽観)。
コマンドをコピペしてターミナルでコンパイルを試みます。

a.out <ドンッ!!

……お前何? 名前指定なしで実行形式を作成するときのデフォルト名ですね。
サンプルコンパイル分提示するなら名前くらいはさあ。

インストールせずにコンパイルだけしてゲロった実行形式なので、pathなんて通ってません。

./a.out

とかなんか入れればとりあえずsqliteが起動してくれないだろうか。

画像7

おっ。なんかそれっぽいぞ。

というわけで、no such fileなエラーは出なくなったんで、コンパイルし直すというのはどうやらあっているもよう(自信はなかった

ということなのでコンパイルをやり直します。

…… -o sqlite ……

とかくっつければいってくれるでしょうかね。
結論から言えば行けました。やった。

画像8

よしよし。起動したっぽい。(ここまで丸一日)

sqliteはscvをかんたんにテーブルとして取り込めるっぽいので、
いまスクリプトの中で設定しているスペース区切りのアイテムテーブルを
csvにしてテーブルとしてインポートしてみたいと思います。

id,cat,crr,mod,name,exp
0000,CSM,000,nomod,八卦炉,激しくマーライオンする
0001,CSM,000,永遠亭謹製の,おくすり,あなたはもう死ねなくなる,
0002,CSM,+02,紅魔館メイド手製の,毒弁当,瀟洒!
0003,CSM,+01,魔法の森でとれた,キノコ,エッチな形をしている+1
0004,CSM,+02,魔法の森でとれた,キノコ,エッチな形をしている+2
0005,CSM,+03,nomod,キノコ,エッチな形をしている+3
0006,CSM,+04,魔法の森でとれた,キノコ,エッチな形をしている+4
0007,CSM,-10,アロマ臭のする,陰陽玉,いいにおいがする。霊夢愛用。
0008,CSM,000,七色に光る,壊れた人形,血がついている
0009,CSM,000,nomod,宝塔,おでん

1行目は属性名ヘッダ。
2行目以降、カンマ区切りの素直なcsvです。
(……文字列クォートしなくていいのかな……?)

こいつをlibItem.csvとして取り込みたいと思います。

画像9

……誤字ってますが、.mode でcsvモードにしてから

sqlite> .mode csv
sqlite> .import libItem.csv libite

とかやってみますと、出来ました。

こいつをshellgameDBとして.saveして保存します。

で、sqlを発行してみます。

画像10

おお、よさそうですね。

とりあえずsqliteをインストール無しでshellscriptから使うことはできるようになったので、今度はアイテムデータの取得なんかをスクリプト内の駄々長い変数ではなく個々から取得できるようになるか、また試してみようと思います。

きょうはこんなとこ

この記事が気に入ったらサポートをしてみませんか?