wafu3000の技術

勉強の記録です。

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にも登録されているようです。

RubyでExcel操作 少しまとめ

RubyExcel操作です。

また、調べることがあります。

 

# -*- Encoding:UTF-8 -*-
require 'win32ole'

class Excel
end

excel = WIN32OLE.new('Excel.Application')
WIN32OLE.const_load(excel, Excel)

#Excelファイルをダイアログで開く場合
#book_file = excel.GetOpenFilename
#book = excel.WorkBooks.Open(book_file)

#ファイル名指定で開く場合1(COM使用)
#fso = WIN32OLE.new('Scripting.FileSystemObject')
#filename = fso.GetAbsolutePathName("test.xlsx")
#book = excel.WorkBooks.Open(filename)

#ファイル名指定で開く場合2
#book = excel.workbooks.open 'sample.xlsx'

# 新規ブックを作成
book = excel.workbooks.add

#画面に状況を表示させる。
excel.visible = true

#シートにワークシートの1を指定
sheet = book.Worksheets(1)

#セルの値を取得(縦、横)
#s = sheet.Cells.Item(3,3).value
#セルに値を格納(縦、横)
sheet.Cells.Item(3,3).value = 1000
sheet.Cells.Item(2,2).value = "画像一覧"

#test
sheet.Cells.Item(2,2).Font.Size = 20
sheet.Cells.Font.Name = 'MS ゴシック'.tosjis
#sheet.Cells.Item(2, 2).Font.Bold = true    #失敗
#スタイル


#折り返して表示

#列の幅


#罫線
range = sheet.range("F11:G16")
#色
#range.Interior.ColorIndex = 6
#range.Interior.Pattern = Excel::XlSolid
#罫線
#線の種類
range.borders.lineStyle = Excel::XlContinuous
#線の太さ
range.borders.weight = Excel::XlThin
#名前を付けて保存する
#book.saveAs 'e:\test.xlsx'

#Excelブックを閉じる
#true:上書き false:上書きしない
#book.close(true)

#Excel終了
#excel.quit