wafu3000の技術

勉強の記録です。

CodeIQでSランク

プログラムは汚かったけど、達成感があって、ちょっと嬉しいです。

Cランクを解いたら、はまってしまいました。

アルゴリズムは、頭の体操になりました。

これで、スキルは全部クリアしましたが、

勉強不足を感じました。

 

f:id:wafu3000:20160821225420p:plain

janssonを使ってみた。

JSONの処理は、picojsonを使っていましたが、いろいろ悩むことがあり、janssonに変更中です。

janssonは、APIのドキュメントがあるのが良いです。

 

■ヘッダ
#include <jansson.h>

■ライブラリ
jansson.lib


■ファイルを開く
    json_t *result = json_load_file("json.db", 0, &error);
    if (result == NULL) {
        fputs(error.text, stderr);
        return 0;
    }


■オブジェクトを開く
    json_t *JO1 = json_object_get(result, "roots");
    if (JO1 == NULL) {
        printf("JO1 is NULL\n");
        return 0;
    }


■オブジェクトの確認
    //オブジェクトの判定test
    if (json_is_null(JO2) == 1){
        printf("NULL\n");
    }
    if (json_is_object(JO2) == 1){
        printf("object\n");
    }
    if (json_is_integer(JO2) == 1){
        printf("integer\n");
    }
    if (json_is_array(JO2) == 1){
        printf("array\n");
    }
    if (json_is_string(JO2) == 1){
        printf("string\n");
    }


■Arrayの値の読み出し
    json_t *JO3;
    JO3 = json_object_get(JO2, "children");
    if (JO3 == NULL) {
        printf("JO3 is NULL\n");
        return 0;;
    }
    json_t *JO4;
    json_array_foreach(JO3, i, JO4) {
    printf("%s/%s: %s\n",
        json_string_value(json_object_get(JO4, "name")),
        json_string_value(json_object_get(JO4, "url")));
    }


■オブジェクトの一覧をループ
    keyに名前が入り、valueが新しいオブジェクト

    json_t *value;
    const char *key;
    json_object_foreach(JObj,key,value){
        printf("key:%s\n",key);
        
    }

C++でHPDF 文字列の幅計算(HPDF_Font_GetUnicodeWidth)

TrueTypeフォントで、文字列の幅が計算(調整)方法です。

 

HPDF_Font_GetUnicodeWidth()関数

を使えば、個々の文字の幅がわかります。

picojsonのMEMO

JSONのデータを扱うことがあり、調べました。

 

JSONについては、ここに書いています。

http://www.json.org/json-ja.html

 

C++に処理するにあたり、ヘッダファイルだけで扱えるとのことで、調べてみました。

ライブラリは動作させるまでが大変だっりします。

 

ここから、picojson.hをダウンロードします。

https://github.com/kazuho/picojson

このようなツールが作れることに尊敬します。

 

■使い方

 色々なサイトを参考にさせてもらいました。

    // 変数
    stringstream ss;
    ifstream     f;
    unsigned int i;

    // Jsonファイルの読み込み
    f.open("Books", ios::binary);
     if (!f.is_open()){
        return 1;
    }
    ss << f.rdbuf();
    f.close();

    // Parse Json data
    value v;
    ss >> v;
    string err = get_last_error();
    if(!err.empty()) {
        cerr << err << endl;
        return -1;
    }

 

■オブジェクトの読み込み
object &o = v.get<object>();

rootsを読む例

object o = v.get<object>()["roots"].get<object>();

 

■オブジェクトの抽出
    object o = v.get<object>()["roots"].get<object>();
    for (object::const_iterator it = o.begin(); it != o.end(); it++) {
        char buf[4096];
        sprintf_s(buf, "%s", it->first.c_str());
        MessageBoxA(NULL,buf,"first",MB_OK);
    }

    it-firstは文字列
    it-secondは値
    文字列への変換には、to_str()を使用

 c_str()で、stringをcharにします。
    it-second.to_str().c_str()

■Arrayの読み込み

 barの下にchildがある例
    object& o2 = o["bar"].get<object>();
    array& aAry = o2["child"].get<array>();

    for (i = 0; i < aAry.size(); i++){
        object& o3 = aAry[i].get<object>();
        strcpy(buf,(char *)o3["name"].get<string>().c_str());
    }

■型の確認例

型の確認は、getの代わりにisを使います。
    //バッファの型を確認
    if (o[buf].is<string>() == TRUE){
   }else if (o[buf].is<array>() == TRUE){
      }else if (o[buf].is<object>() == TRUE){

まだ、勉強中なのでここまでです。

C++でHPDF PNG画像

HPDFでの画像関係のメモです。

 

HPDF_Doc pdf;

HPDF_Page page = HPDF_GetCurrentPage (pdf);

//PDFやpageは、なんやかんやする。

 

HPDF_Image image;

//png画像のをimageに読み込む、filenameは、ファイル名

image = HPDF_LoadPngImageFromFile (pdf, filename);

 

//横幅を取得
int GetWSize = HPDF_Image_GetWidth(image);

 

//縦幅を取得
int GetHSize = HPDF_Image_GetHeight(image);

 

//PDFに画像を書き込み

HPDF_Page_DrawImage (page, image, x, y,横幅,縦幅);

Rubyでレジストリファイルを確認

Rubyで、ロードしていないWindowsレジストリファイルを確認するソースです。これなら、Linuxからでも動作できます。

入手先

Volatile Minds: Reading offline registry hives in pure ruby

 

 

 

リソースエディタにウイルスが混入されているようです。

正規サイトのはずですが、おかしいですね。

http://www.resedit.net/

 

シマンテックトレンドマイクロの両方でウイルスを検知します。

トレンドマイクロのウイルス名は「TROJ_GEN.R03EC0ODM16

 

検出するのは、32ビットのファイルが検出します。

64ビットは、検出されません。

 

リソースエディタが必要な方は、窓の杜を利用すれば、入手できます。

 

virustotalにも登録されているようです。