【Bash】ダミーファイル作成 ( +ファイル加工 )

システム作っているとダミーファイルを作ることもありますね。

テストの時とかね。

めんどくさいことはシェルにやってもらおう!

今日のお話

環境

対象言語

10個のファイルを作りたい場合

コマンド

$ for i in $(seq 0 9) ; do echo Value = $i > $i.txt; done

メモ

  • 0.txt ~ 9.txt までファイルが作られる
  • 中身は「Value = xx」になる。

10MBのサイズのファイルを作成する

コマンド

$ dd if=/dev/zero of=dummy bs=10485760 count=1

メモ

  • Linuxならbsのところは10MBと書けばいいと思う。
  • ifはインプットするファイル名(今回はNULLで敷き詰めている)
  • ofはアウトプットするファイル名

特定の文字を検索結果のファイルに挿入

コマンド

$ find . -name "*.txt" -print | while read LINE; do echo "add text" >> $LINE; done

メモ

  • txtファイルで見つけ出したファイルに対して「add text」を追加
  • while/forのセミコロンの位置が分からなくなるけど要するに do xxx なんだ。(今から〇〇しますよーみたいなね)

気付き

  • 今回は特にないですがあえていうのであれば、macLinuxで動作が違うことがあるから気をつけないとです。

戯言

  • whileとかforとかさらっと使えるとすごく時短になるよね。
  • こんな時に使えます!みたいなものがいっぱいあると読んでて楽しくなりそうだなー。

【Linux】Findを使ったコマンド例

Findコマンドについてメモしておく。

結構使うことあるんだよな。。。

都度更新していこう。

今日のお話

環境

対象言語

サンプルフォルダ構成

━app●
 ┝.git●
 ┝src●
 ┃┝hoge.cpp
 ┃┝hoge.h
 ┝lib●
  ┝libsample.so
● : ディレクトリ

コマンド

  • .git以外のフォルダの一覧

$ find app -name ".git" -type d -prune -o -type d -print

気付き

  • macLinuxではオプションが違うから注意が必要だ。

戯言

  • 随時更新していこう。。。
  • findはどんどん使って行きたい。
  • xargsとかも使えるようにしていきたい。

【C++】カスタム例外と継承

カスタム例外を作りたくなりました。
さらにカスタム例外クラスを継承したくなりました。
なので試してみようと思います。

今日のお話

開発言語

やりたいこと

  • 例外クラスのインスタンスを作る時にメッセージを設定できるようにしたい
  • ↓みたいな階層構造にしたいと思いました。

  exception:標準例外クラス
  ┗BaseException:カスタム例外クラス(親クラス)
   ┗SubException:カスタム例外クラス(子クラス)

サンプルソース

#include <iostream>

using namespace std;

// カスタム例外クラス(親クラス)
class BaseException : public exception
{
public:
    BaseException(const string &msg) { message = msg; }
    char const *what() const noexcept { return message.c_str(); }

private:
    string message;
};

// カスタム例外クラス(子クラス)
class SubException : public BaseException
{
public:
    SubException(string msg) : BaseException(msg) {}
};

// サンプル関数
void SampleFunc()
{
    try
    {
        throw SubException("aaa");
    }
    catch (SubException subex)
    {
        cout << subex.what() << endl;
        throw;  //ここで再スロー
    }
}

// メイン関数
int main()
{
    try
    {
        SampleFunc();
    }
    catch (BaseException bex) // SubExceptionも受け取れる
    {
        cout << bex.what() << endl;
    }
    return 0;
}

気付き

  • exceptionクラスはデフォルトではコンストラクタにメッセージを追加することができないみたいです。*1
  • SubException のスローすると BaseException でもキャッチすることができますね。(当たり前ですがw)
  • これで SubException に詳細エラーを書いて、 BaseException でもう少し全体的なエラーにすることができます。

戯言

  • exception クラスにはデフォルトでメッセージを登録するようなことはできないみたいです。
  • 例外も階層化すればエラーがあった時にトレースが便利になると思うから、設計の時とかに意識して使っていけるようにしたいな。

*1:例外クラスとstd::exception:https://teratail.com/questions/79022

【CentOS7】C++でReflection ~RTTRライブラリのインストール~

C++でReflectionがしたい。。。
そんな時にGithubでRTTRと言うライブラリを見つけました。
今回は試行錯誤してインストールした方法を書いてみたいと思います。

github.com

注意事項

このインストール方法は公式の方法ではありません。
試行錯誤したらやっとライブラリが使えるようになったので、同じ悩みを抱えている人の参考になるかと思い書いてます。
公式インストール手順は、ちゃんと下記に載ってます。

https://www.rttr.org/doc/master/building_install_page.html

今日のお話

開発言語

環境

インストール方法

必要なパッケージをインストール

root ユーザで実行

# yum install -y gcc-c++
# yum install -y epel-release
# yum install -y —enablerepo=epel cmake3

RTTRライブラリのビルドとインストール

root ユーザで実行

# wget https://www.rttr.org/releases/rttr-0.9.6-src.tar.gz
# tar zxvf rttr-0.9.6-src.tar.gz
# mkdir build
# cd build/
# cmake3 -DCMAKE_BUILD_TYPE=Release ../rttr-0.9.6/
# make
# make install
# cp -rp install/lib64/librttr_core.so /usr/lib64/
# cp -rp install/lib64/librttr_core.so.0.9.6 /usr/lib64/

RTTRライブラリを使ったcppファイルを作成

main.cpp *1

#include <iostream>
#include <rttr/registration>
static void f() { std::cout << "Hello World" << std::endl; }
using namespace rttr;
RTTR_REGISTRATION
{
    using namespace rttr;
    registration::method("f", &f);
}
int main()
{
    type::invoke("f", {});
}
// outputs: "Hello World"

RTTRライブラリを使ってアプリをビルド

  • build ディレクトリにmain.cppを作ってる想定です。
  • gcc実行は build ディレクトリで実行します。
  • ビルドは通常ユーザで実施です。

○ビルドコマンド

$ g++ -std=c++11 main.cpp -I./install/include -lrttr_core

最終的に↓みたいなディレクトリ構成です!

/usr/lib64                     #共有ライブラリ
┣librttr_core.so
┗ librttr_core.so.0.9.6
/home/vagrant
┣rttr-0.9.6/
┗build/
  ┣main.cpp           #作ったcppファイル
  ┗install/
    ┗include/      #ヘッダー

気付き

  • 共有ライブラリパス /usr/lib64 にライブラリを配置することでgccコマンドでライブラリのパス指定が不要になる。
  • ライブラリの指定は、-Lでできるらしい。※今回はコンパイルが上手くいかなかったのであえてファイルをcpしました。
  • ライブラリ名は「libxxx.so」となっている必要があり、gcc側でパラメータを指定する時は、「-lxxx」となる。( lib , .so は不要になる)

戯言

  • cmakeについてもっと少し理解を深める必要があるなー。
  • って言うか、c++のライブラリインストール難しいよ!
  • あとgccもわかりにくいよ!

*1:サンプルコードの出典元( 1行目の #include だけ追加してます) https://www.rttr.org/doc/master/register_hello_world_page.html

【Mac】こんにちはgolang

3連休ですね。
前からちょっと気になってたGo言語触ってみようと思います。

こういうのはとにかく体験することが大切だと思うので、
まずは、golangであいさつ。

今日のお話

開発言語

golang 1.15.5

環境

MacでGo環境の作成

インストールは簡単ですね。

brew install go

バージョン確認

go version

$ go version
go version go1.15.5 darwin/amd64

Hello Worldまで

ファイル作成

ファイル拡張子は、 .go です。 今回は Hello.go にしました。

Hello Worldソースコード

package main //①

import "fmt" //②

func main() { //③
    fmt.Printf("Hello World\n"); //④
}
  • main パッケージになることの宣言。
     Goでは何かしらのパッケージに所属する必要があるらしい。
     所属しないとエラーになった。
  • ②標準パッケージの「fmt」をインポート。
  • ③最初に呼び出される関数。
  • ④標準出力。

参考:Goの基本的な文法を学ぼう | Think IT(シンクイット)

ビルド

go build Hello.go

Hello アプリができます。

実行

$ ./Hello
Hello World

気付き

  • Go言語の雰囲気がちょっとC++に似てるかもなと感じた。
  • C++に詰まったら、気分転換でGoも書いてみたい。

戯言

  • ということで、「Hello golang」!

libpqxxでpostgresqlへ接続

早速libpqxxでPostgreSQLに接続してみたいと思います。

libpqxx勉強開始です。

今日のお話

libpqxxライブラリでPostgresqlへ接続してみたという記録です。

開発言語

C++

環境

ソースコード

void Db::DbConnect()
{
    try
        {
            conn = new pqxx::connection{"hostaddr=xxx.xxx.xxx.xxx port=xxxx dbname=xxxx user=xxxx password=xxxx"};

            pqxx::work worker(*conn);
            pqxx::result result = worker.exec("Select * from xxxx");

            for (pqxx::row row : result)
            {
                cout << row[1].c_str() << endl;
            }
        }
        catch (const exception &e)
        {
            cerr << e.what() << endl;
        }
    }
}

xxxx のところは接続環境情報となります。

気付き

  • 意外と簡単にDb接続、データの取得まですることができた。
  • connection関数の中は、半角スペースで区切るみたいです。
  • libpqxxの型になるのでその辺りは確認しながら作成する感じですね。

戯言

  • 接続できるようにはなったけど、まだまだ改善の余地がアリそう。
  • 次はinsert, update, delete, selectの関数を作っていきたいかな。

Makefileを使ってみたい

Makefile

今日のお話

環境

注意事項

  • 説明に重点を置いているので、順に説明していきます。急いでいる人は下から読んでいくことがオススメです!
  • 間違っていることがあればコメントください!

フォルダ構成

- Project(ディレクトリ)
        |-main.cpp
        |-Hoge.hpp(インタフェースクラス)
        |-HogeSub.hpp
        |-HogeSub.cpp

Makefileの中身の名称

ターゲット:依存ファイル
    コマンド

Makefileを使わない場合

↓みたいな感じでコマンドを順次実行する必要がある

$ g++ -c HogeSub.cpp -o HogeSub.o
$ g++ -c main.cpp -o main.o
$ g++ main.o HogeSub.o

とりあえずMakefile作る

All:
    g++ -c HogeSub.cpp -o HogeSub.o
    g++ -c main.cpp -o main.o
    g++ main.o HogeSub.o

初期進化

変数、依存ファイルを知ると↓みたいになった。

CC = g++
CFLAGS = -g -Wall

All: main.o HogeSub.o
    $(CC) $(CFLAGS) -o main main.o HogeSub.o

mani.o: main.cpp
    $(CC) $(CFLAGS) -o mani.o -c main.cpp

HogeSub.o: HogeSub.cpp
    $(CC) $(CFLAGS) -o HogeSub.o -c HogeSub.cpp

clean:
    rm -f *.o main
  1. All ターゲットが呼び出される
  2. All ターゲットに依存ファイル main.o HogeSub.o と書かれているため、main.o ターゲットが呼び出され、コマンドが実行される(main.oファイルができる)
  3. HogeSub.o ターゲットが呼び出される(HogeSub.oファイルができる)
  4. 依存ファイルが解消されたので、 All ターゲットが呼び出される

-gデバッグ情報、 -Wall は警告オプションを全て有効にする

ちょっとカッコよくなってきたMakefile

コマンドが使えること、サフィックスルールを知ったら↓みたいになった。

CC = g++
CFLAGS = -g -Wall
SRC = $(shell ls *.cpp)
OBJS = $(SRC:%.cpp=%.o)

All:$(OBJS)
    $(CC) $(CFLAGS) -o main $(OBJS)

clean:
    rm -f *.o main

戯言

  • 順に仕組みを知っていけばわかることが多い。
  • Makefileって使わないことが多いのでインプットを増やしていかないと。
  • これで分割コンパイルができるようになったので次は何しようかなー。

トリビアmakefile入門
http://www.jsk.t.u-tokyo.ac.jp/~k-okada/makefile/