作業と思いつきの記録

日々忘れがちになるので作業の記録や、思いつきなどを残していきます

CとLuaでWebスクレイピングを作る

Webスクレイピングを作る

最近さぼり気味だったので、練習と感を取り戻すためにWebスクレイピングプログラムを作成する。

構成

言語ライブラリなどをリストアップする。変更あり。

言語

まずは部品づくり

  1. http通信を行う部品を作る

作業経過は別途書いていく。

sol2: SQLite3を扱うC関数を呼び出して結果をコンテナvectorで返す

sol2を使う練習として、LuaからSQLite3を操作するプログラムを作成した。

実装の概要

  1. SQLite3を操作するユーザデータとして、クラスまたは構造体で実装する
  2. 戻り値を格納するユーザデータを実装する
  3. ユーザデータを登録する
  4. Luaスクリプトを実行する

SQLite3を操作するクラス

今回は、sqlite3.cをプロジェクトに取り込む方法で使う。

一部抜粋:

class CLuaSQLite {
private:
    sqlite3* _db;
    sqlite3_stmt* _stmt; 

public:
    CLuaSQLite();
    void debug(const std::string& msg);

    int open(const std::string& filename);
    void close();

    void exec(const std::string& query);
    ResultData select(const std::string& query);
};

上記のクラスをユーザデータとして登録する

 lua.new_usertype<CLuaSQLite>("sqlite3",
        sol::constructors<CLuaSQLite()>(),
        "debugPrint", &CLuaSQLite::debug,
        //
        "open", &CLuaSQLite::open,
        "close", &CLuaSQLite::close,
        "exec", &CLuaSQLite::exec,
        "select", &CLuaSQLite::select
    );

Luaからの呼び出し

function runMain()
    local sq = sqlite3.new();
    sq:debugPrint("runMain() from Lua");

    -- SQLite3の操作をテストする
    local ret = sq:open("test.sqlite");
    if ret == 1 then
        -- error
        print("データベースのオープンに失敗した");
    end

    -- 書き込み
    sq:exec("create table personal(id, name, age);");
    --[[ 
    sq:exec("insert into personal values ('aaa', 'bbb',  99);");
    --]]

    -- 読み込み
    local selStmt = "select * from personal;";
    local selResult = sq:select(selStmt);

    -- 結果を出力してみる
    print("[Lua] 結果を出力してみる");
    for i, v in pairs(selResult) do -- v : rowdata
        print("select......"..i); 
        for ri, rv in pairs(v) do
            print("    rowdata......type: "..rv:getType()..", "..rv:getColName());
            if (rv:getType() == 1) then
                print("        data: "..rv:getInteger());
            elseif (rv:getType() == 3) then
                print("        data: "..rv:getText());
            end
        end
    end

    sq:close();

    sq:debugPrint("end.");

end

戻り値をコンテナ: vectorで返す

ユーザデータとするクラスを作り、クラス内に戻り値にするvectorを定義する。 ネストも可能。

ソースコードの一部抜粋

struct ResultData {
private:
        // 戻り値
    std::vector<rowData> _record;

public:
    ResultData(){}

    // row set
    void setRow(rowData rd){
        _record.emplace_back(rd);
    }

    using value_type = decltype(_record)::value_type;
    using iterator = decltype(_record)::iterator;
    using size_type = decltype(_record)::size_type;

    iterator begin() { return iterator(_record.begin()); }
    iterator end() { return iterator(_record.end()); }
    size_type size() const noexcept { return _record.size(); }
    size_type max_size() const noexcept { return _record.max_size(); }
    void push_back(rowData value) { _record.push_back(value); }
    bool empty() const noexcept { return _record.empty(); }
};

上記ユーザデータの登録

 lua.new_usertype<ResultData>("result_data",
        sol::constructors<ResultData()>(),
        "iterable", [](ResultData& rd) {
            return sol::as_container(rd); 
        }
    );

一応の実行結果 f:id:diCE-K:20190911103752p:plain

参考

Lua SOL2

Lua SOL2を使ってみたが問題発生

メモ

最新バージョンのSOL2 を使ってみたがコンパイル内エラーが発生した。 バージョンをv2系の最終にしてみるとエラーが出ない。 問題はどこにあるのか、VisualStudio2019、Luaのバージョン、c++17のいずれだろうか。

SOL2のバージョンが更新されたら再調査したい。

再開

ゲーム制作を再開しようと思う

寄り道がすぎて、リハビリに時間が掛かりそう・・というより

今は、新規でやり始める感覚に近いか

以前の(もともと大したことはないんだが)状態に戻すには

それなりの時間が必用そうである

やることメモ

  • 言語の確認 C++
  • 設計 何をつくるのか
  • あれMarkdownの書式も忘れてる・・・

はてなで、ソースコードを載せる

Markdown記法で、ソースコードを記事に載せるテスト

参照: ソースコードを色付けして表示する(シンタックスハイライト) - はてなブログ ヘルプ

Markdown

``` で囲む

#include <iostream>

void main(){
    std::cout << "Hello World !!!" << std::endl;
}

GitHub

スクリプトを貼り付ける

<pre>

#include 

void main(){
    std::cout << "Hello World !!!" << std::endl;
}

SDL2のチュートリアルを勉強している投稿記事を改善しよう

2017/10/13現在、ゲームを制作したいと思って勉強しています。 プログラミングの経験はあるので軽い気持ちではじめたのは事実でございます。 がしかし、必要な知識は多岐にわたり、かつ深淵のごとく深い。 かるく絶望をいだきはしましたが、少しずつ出来ることからやっていこうと 思う次第です。

まずは、プログラムに使う言語とライブラリを決めました。 C++とSDL2の組み合わせでゲームを作る上での勘どころが感じられればと。

SDL2のチュートリアルが公開されているのですが、自分が別に運営しているサイトで 軽くまとめながら勉強&投稿しています。

これが本題なのですが記事を見直してみると、これがまたヒドイ。 内容がナイヨー・・・。あまりに見苦しいので、改善点をまとめて次に活かしたいと思います。

画像を入れよう

文字のみだとイメージを掴みにくいし、見栄えが悪いので 積極的に入れていきたい。

  1. アイキャッチ
  2. 動作イメージ
  3. チャート

語句、概念などの説明を入れよう

今は分かっているつもりでも、時間を忘れてしまうのが人というもの。 ひっかかりがあったものを中心として丁寧に文章で残しておこう。

サンプルプログラムを自分で書こう

チュートリアルでは解説に使われているソースコードがダウンロードできるところが 多いです。しかしながら、これを動かしただけで出来るつもりになるのが怖いです。 そのまま自分の記事にコードを載せるのも問題がありますしね。

ある程度参考にしながら、自分なりにコードを書き説明を残す。コードが長くなったら ダウンロード出来るように、GitHubを使う予定です。


tmick.net

運営しているサイトのリンクです。user1になっていますが、これテストで自分でやったものです お恥ずかしい・・・。