わたがし食べたい

アイドルマスター卯月Pによるつれづれなる技術ブログ(仮)

libpqxx で レコードを一行ずつ表示する

一行ずつカンマ区切りで表示する

ソースコード

#include "ClibpqxxMap.h"
#include <iostream>
#include <pqxx/pqxx>
using namespace std;
using namespace pqxx;

int main()
{
try {
connection Conn("dbname=postgres user=postgres");
work T(Conn);
result r(T.exec("select * from test"));

//一行ずつ表示する
const int num_rows = r.size();
for (int rownum = 0; rownum < num_rows; ++rownum)
{
std::cout << "r.size" << std::endl;
const pqxx::row row = r[rownum];
const int num_cols = row.size();
for (int colnum = 0; colnum < num_cols; ++colnum)
{
const pqxx::field field = row[colnum];
string fieldStr = field.c_str();
if (colnum +1 < num_cols) {
fieldStr = fieldStr + ",";
}
std::cout << fieldStr ;
}
std::cout << std::endl;
}
//T.commit();
Conn.disconnect();
}
catch (const exception &e) {
cerr << e.what() << endl;
return 1;
}
return 0;
}

実行結果

f:id:kuroaka3:20180701223155p:plain

 

さらに改良し、1カラムずつ出力

ソースコード

 

#include "ClibpqxxMap.h"
#include <iostream>
#include <pqxx/pqxx>
using namespace std;
using namespace pqxx;

/*
自作split
*/
std::vector<std::string> split(const std::string input, char delimiter)
{
std::istringstream stream(input);

std::string field;
std::vector<std::string> result;
while (std::getline(stream, field, delimiter)) {
result.push_back(field);
}
return result;
}

int main()
{
try {
connection Conn("dbname=postgres user=postgres");
work T(Conn);
result r(T.exec("select * from test")); const int num_rows = r.size(); for (int rownum = 0; rownum < num_rows; ++rownum)
{
const pqxx::row row = r[rownum];
const int num_cols = row.size();
string record = ""; for (int colnum = 0; colnum < num_cols; ++colnum)
{
const pqxx::field field = row[colnum];
string fieldStr = field.c_str(); //次も値があるかチェック
int chCnt = colnum;
record = record + fieldStr;
if (chCnt +1 < num_cols) {
record = record + ",";
}
}
cout << endl; std::cout << "record : " << record << endl; // カンマで区切る
cout << "---split----" << endl;
for (const string& s : split(record, ',')) {
cout << s << endl;
}
}
cout << endl;
//T.commit();
Conn.disconnect();
}
catch (const exception &e) {
cerr << e.what() << endl;
return 1;
}
return 0;
}


実行結果

f:id:kuroaka3:20180702001540p:plain

libpqxx5.1 を Visual Stadio 2017 でビルドする

環境

windows7

Visual Stadio 2017

libpqxxの5.1

GitHub - jtv/libpqxx at 5.1

※master版のビルドも次回やります(やることはほとんど変わりません。)

 

 参考

tensor12321.hatenablog.jp

基本的には参考のページを見て実施。

前提条件

libpqxxのビルドはPostgreSQLがインストールしてあることが前提です。

postgresのincludeファイルを使用します。

ビルド前準備

・common-sampleをcommonファイルとして複製。

→内容は参考のURL参照

(Postgresのインストールディレクトリのパスを書き換えるのを忘れずに)

・ヘッダーファイルのコピー

libpqxx-5.1\config\sample-headers\compiler\VisualStudio2013\pqxx

配下の2ファイルをlibpqxx-5.1\include\pqxxへコピー

・vc-libpqxx.makの修正

259,269行目の$(LIBPQDPATH)"$(LIBPQDDLL)"を

postgresのインストールディレクトリにあるlib配下のlibpq.dllのパスにする

私の場合は

"C:\Program Files\PostgreSQL\10\lib\libpq.dll"

 

271,274行目の$(LIBPQDPATH)"$(LIBPQDLIB)"を

postgresのインストールディレクトリにあるlib配下のlibpq.libのパスにする

私の場合は

"C:\Program Files\PostgreSQL\10\lib\libpq.lib"

※これはvc-libpqxx.makの$(LIBPQDPATH)"$(LIBPQDDLL)"や$(LIBPQDPATH)"$(LIBPQDLIB)"のダブルコーテーションの位置がおかしいため、エラーが発生します。

正しい位置(masterを参考にするとよい)にしてもビルド出来ると思いますが、今回は単純にパスを書きました。

 

 

(ここから先はVS2017の開発用コマンドプロンプトで実施)

・VCVARSALL.BATの実行

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Buildへ移動してコマンド実行

f:id:kuroaka3:20180610145735p:plain

VCVARSALL.BAT amd64

ビルド

nmake /f win32/vc-libpqxx.mak ALL

f:id:kuroaka3:20180619012540p:plain

※ビルド中に上記のような警告?が表示されるが、C++ではよくあるメッセージらしい。

f:id:kuroaka3:20180619012715p:plain

コマンドプロンプトが上記のようになり、libpqxxのlibフォルダに以下のようにlibpqxx.dllが出来ていればOK(libpqxxD.dllはデバック用)

f:id:kuroaka3:20180619012808p:plain

 

以上です。

早めにmasterのビルド方法もあげます。(やることは変わりません)

 

 

Lpic (LinuC) Level1 勉強方法

Lpic試験について

ざっくりいうとLinuxを使いこなすためのベンダー資格

レベル1は初心者向けの資格です。

レベル1は101、102の2試験ともに合格するとLpic Level1と名乗ることが出来ます。

今はLinuCという試験に変わりつつありますが、まだLpicも受けることが出来る(はず)です。

LinuCはまだ情報が少ないのでLpicの方が合格しやすいのではないかな、と個人的に思っております。

 

受験結果

101試験:660(合格ライン:500)

(内訳)

・システムアーキテクチャ:100%

Linuxのインストールとパッケージ管理:54%

GNUUnixコマンド:92%

・デバイスLinuxファイルシステムファイルシステム階層標準:80%

 

102試験:630(合格ライン:500)

(内訳)

シェル、スクリプト、およびデータ管理:80%

ユーザインタフェースとデスクトップ:100%

管理業務:91%

重要なシステムサービス:90%

ネットワークの基礎:71%

セキュリティ:55%

 

こうみると得意な部分と不得意な部分が極端で面白いですね。

ネットワークが一番悪いかなと思っていましたが(Oracle受ける時もネットワークは苦労しました。笑)

101ではパッケージ管理、102ではセキュリティが酷いですね。

また、102ではシェルやSQLを業務で多く使っていたので勉強する必要がなかったのは大きかったです。(100%ではなかったですが。。。)

勉強のもろもろ

期間

101試験:1ヶ月

102試験:3週間

だらだら勉強しても仕方ないので先に受験日を決めました。

ちょうど1カ月後には予定が入っていたため、というのと、シェルやSQLの分を差し引いて102を3週間としました。

勉強方法

Linux教科書 LPICレベル1 スピードマスター問題集

Amazon CAPTCHA

いろいろ他の合格者の話を見ていたらこの問題集がお勧めされていたので購入。

結果として、一番使えました。本番の類似問題が多かったです。

問題数も多く、解説も丁寧なのでこの一冊だけで十分合格できると思います。

また、101,102の両方をこの一冊で補えるのでお財布にもやさしい。

私はこの本を約3~4週しました。目安は一日1章。

最後の一週間は巻末の模擬試験と自信がなかった章を解くようにしました。

さらに模擬試験では90%以上とれるまで繰り返しました。

 

Ping-t

ping-t.com101は無料で問題集を実施することができます。

スピードマスターをやっていると初見でも模擬試験モードで大体80~90%は取れると思います。

ですので、101も102も私は全部銀、半分くらい金の状態で受験しました。

問題数が多く、理解を深めるという位置づけで使用しました。

 

102の問題は有料です。月額ですので、自分の勉強期間に合わせて購入することが出来ます。

私は101を受けてから1月以内に102を受験するつもりで勉強していたので1ヶ月分を購入しました。

 

また、私は全て机上で勉強しましたが、環境がある人は実際にLinux環境を構築して実施するとよいと思います。

環境構築できないよ!って方はcygwinhttps://www.cygwin.com/)をwindowsにインストールしましょう。windows上でLinuxコマンドが使用できるターミナルです。

これを使って勉強するのも有だと思います。

 

受けた感想

いたるところで、「日本語が変」だとか「一昔前のGoogle翻訳」だとか書かれていたのでドキドキしながら受験しましたが、私のときはもう変な日本語の問題はありませんでした。(運が良かっただけかもしれませんが)

また、記述問題は101も102も15問ほどでした。オプションが不要な時は不要、と書いてくれていますので、かかれていない時はオプションも付けると吉です。

101からでも102からでもどちらでも受けられますが、順当に101から受けることをお勧めします。

理由は明白で、101の学習内容を102でそのまま利用する場面があるからです。

また受験費用は15000円×2なのでお高いですのでなるべく1回で合格を目指しましょう。

 

次の資格の話はOSS-DBの取得を目指しているので合格したら書きます。

 

 

PL/SQL と PL/pgSQL のout引数が refcursor のプロシージャ を実行する

out引数がカーソルの時のファンクションの実行について

記事が少なかったのでメモしておく。

 

 

とりあえずテーブルを作る 
>||
-- create
CREATE TABLE Test(
id numeric,
name VARCHAR(255)
);
とりあえずレコードも作る 
--レコードを作る
insert into Test values(1,'aaa');
insert into Test values(2,'bbb');
insert into Test values(3,'ccc');
insert into Test values(4,'ddd');
insert into Test values(5,'eee');
insert into Test values(6,'fff');

 

 Oracleの場合

PL/SQLの作成

create or replace procedure get_test(
in_id number
,full_cur out sys_refcursor
,id_cur out sys_refcursor
)
is
begin
 open full_cur for
select * from test;

open id_cur for
select * from test where id =in_id ;

END;
/

oracleではプロシージャで作成。

Postgresではプロシージャという概念がないのでファンクションで作成します。

PL/SQLの実行

var full_cur refcursor;
var id_cur refcursor;
exec get_test(1,:full_cur ,:id_cur );

print full_cur ;
print id_cur ;

callでも行けるはずですが、確認してません。

print でカーソルの中身を確認できます。

 

f:id:kuroaka3:20180520133956p:plain

PostgreSQLの場合

PL/pgSQLの作成

create or replace function get_test(
in in_id numeric
,out full_cur refcursor
,out id_cur refcursor)
returns record
as $$
declare
begin

open full_cur for
select * from test;
--closeは書かない

open id_cur for
select * from test where id =in_id ;
--closeは書かない
end;
$$ language plpgsql;

closeをかくのはReturnで明示的に戻している場合で、(たぶん)

out引数の時にcloseしちゃうと返った時にカーソルが閉じてしまって見れなくなります。

PL/pgSQLの実行

begin;
select * from get_test(1);
fetch all in "<unnamed portal 3>";
fetch all in "<unnamed portal 4>";
rollback;

f:id:kuroaka3:20180517234108p:plain

unnamed portal (無名ポータル)にカーソルが返ってくるので

fetchで中身を見てあげる感じです。

※3とか4なのは1回ミスったからです。

 

 

 

 

Docker で Oracle DataBase 11gR2 を構築

12CはPDBとかCDBとかあるので面倒だなって思ったので

11gR2を公式のDockerファイルを使って構築してみる。

 

参考

公式 Oracle Database の Docker イメージを構築 - #chiroito ’s blog

 

まずはGitHubのclone or Download からzipファイルをダウンロード

(gitで落とせる人はcloneでもよい)

https://github.com/oracle/docker-images

 

11R2なので以下から「Oracle Database Express Edition 11g Release 2 for Linux x64」ファイルをダウンロード

Oracle Database Express Edition 11g Release 2のダウンロード

 

docker-images-master\OracleDatabase\SingleInstance\dockerfiles\11.2.0.2

にzipファイルのまま配置

 

dockerにて以下のコマンド実行

 ./buildDockerImage.sh -v 11.2.0.2 -x

 

次のようなログが出たらOK

Oracle Database Docker Image for 'xe' version 11.2.0.2 is ready to be extended:
--> oracle/database:11.2.0.2-xe
Build completed in 358 seconds.

 

確認

f:id:kuroaka3:20180517210036p:plain

出来てる!

docker run --name orcl -p 1521:1521 -p 5500:5500 -v /c/oradata:/opt/oracle/oradata \
-e ORACLE_SID=orcl oracle/database:11.2.0.2-xe

f:id:kuroaka3:20180517212433p:plain

エラーが発生している。

 

調べたらあった。

DockerでOracleデータベース11g XEを構築 - メンチカツには醤油でしょ!!

--shm-size=1g

上記のオプションを設定しなければならなかったらしい

 

runするときに以下のように実行した

docker run --shm-size=1g --name orcl -p 1521:1521 -p 5500:5500 -v /c/oradata:/opt/oracle/oradata \
-e ORACLE_SID=orcl oracle/database:11.2.0.2-xe

 途中ですが、こんな感じ

f:id:kuroaka3:20180518221534p:plain

 

無事に出来そうです。

Docker で イメージファイルを読み込む

前々回の記事の続き。

 

前回は古いDocker でpostgresの環境を作成した。

今日はUpgradeしたDockerでsaveしたファイルをloadする。

 

前回はつかえなかった

docker container lsが使えるようになっています。

下位互換もあるらしいのでdocker psもそのまま使える。

f:id:kuroaka3:20180515230931p:plain

 

loadはsaveとやることが逆なだけです。

イメージファイルが置いてあるディレクトリに移動して以下のコマンドを実行。

docker load < イメージファイル名 / docker load < postgres_new.tar.gz

f:id:kuroaka3:20180515231526p:plain

実行したら以下のようにログが表示される

f:id:kuroaka3:20180515231628p:plain

 

imageを確認する

docker images

f:id:kuroaka3:20180515231744p:plain

 

コンテナの作成

docker run -d --name postgres10 -e POSTGRES_PASSWORD=password -p 15432:5432 postgres_new

f:id:kuroaka3:20180515232411p:plain

前回と違うのはイメージ名はイメージファイルと同じになっているということです。

 

コンテナ内に入ってpostgresに接続できるのを確認しました。

やっと昨日に追いついた。

f:id:kuroaka3:20180515232633p:plain

 

次回はpl/pgSQLについてやっていきたい。

Docker Toolbox 最新版をインストールする

前回の記事でDocker が古いことに気づいたので

最新版を入手した。

その方法をメモしておく。

 

環境は

Win7 pro

 

まずは以下のリンクへ飛ぶ。

Install Docker Toolbox on Windows | Docker Documentation

Docker Store

windows用のDockerをダウンロードする。

※赤枠のGet Docker  Toolboxをクリックでダウンロードが始まります。

f:id:kuroaka3:20180515222237p:plain

 

DockerToolbox.exe

がダウンロードされるのでダブルクリック。

 

18.03.0-CEをインストールします。

EE版はお金がかかります。

 

Welcome to the Docker Toolboc Setup Wizard

f:id:kuroaka3:20180515222323p:plain

Next>

 

Select Components

f:id:kuroaka3:20180515222637p:plain

全部最新版にするのでそのままNext>

 

 

Select Additional Tasks

f:id:kuroaka3:20180515222932p:plain

上から

デスクトップにショートカット作成

環境パスの設定追加

VMのupgrade

NDISSドライバーのインストール

デフォルトのままNext>

 

Ready to Install

f:id:kuroaka3:20180515223140p:plain

Installボタン

 

インストール中~

f:id:kuroaka3:20180515223215p:plain

 

何回か以下のようにデバイスをインストールするか聞いてくるのでインストール。

ちなみにインストールしないにするとDocker Toolboxのインストールも失敗します。

f:id:kuroaka3:20180515223702p:plain

VM使うためのコンポーネント

 

無事に終了

f:id:kuroaka3:20180515224138p:plain

 

 PCを再起動して起動しようとしたところ、エラー・・・

 

以下の記事を参考にVirtualBoxの修復したら治りました。

DockerToolbox-1.12.0.exe を win7 に installしたら、Docker Quickstart Terminal の実行でerror - end0tknr's kipple - 新web写経開発

 

次は前回作ったイメージファイルをloadで読み込みます。