Archive for the ‘Tips’ Category

thisポインタを使ったshared_ptr

thisをshared_ptrで他のクラスに渡したい場合にどうするか。メモ。

#include <boost/shared_ptr.hpp>
#include <boost/enable_shared_from_this.hpp>
using namespace boost;

#include "Y.h"
class X : public enable_shared_from_this<X>
{
private:
    Y y_;
public:
    void make_reference();
};

void X::make_reference()
{
    /* Yに自身を渡す*/
    y_ = new Y(shared_from_this());
}

注意点、Y側はshared_ptrからweak_ptrに変換して保持しないと循環参照となりX, Yもdeleteされないことに。また、shared_ptrをコンストラクタで構築すると、コンストラクタを抜けた時に自身が解放されちゃう。

class X
{
public;
    X() { shared_ptr<X> x = shared_from_this(); } ///NG
}

参考文献 :

 

重複行を消す PostgreSQL

まったく同じ内容の行を消したい場合、create tableが使える。

create table new_table as select distinct * from base_table;

これで、元のテーブルを削除して、新しいテーブルの名前を変更すると良い。

SQL 基礎実地編 (その九) テーブルコピー、レコード追加、修正、削除よりアイデアをいただいた。テーブルコピーというのを知らなかっただけれど、重複行を消す技を探していて見つけた。

このページにある「空のテーブルをコピーするには..」というのもおもしろい技だ。

 

範囲のmax値が持つ時刻を取る - PL/pgsql

時系列表であるyour_tableのカラムvalue1が持つmax値の最初の時刻を取る。

select into res.timestamp, res,value1
    timestamp, value1
    from your_table
     where starttime < = timestamp and timestamp <= endtime
     order by value1 desc, timestamp
     limit1
 

複数の値を返す - PL/pgsql

ストアドプロシージャで複数の値を返す様にするにはユーザ定期型を用いる

create type your_type as
(
    timestamp timestamp with time zone,
    value1 float,
    value2 float
);
create or replace function your_storedprocedure
(
    starttime timestamp with time zone,
    endtime timestamp with time zone
)
returns your_type
as $$
:
 

CSVファイルをPostgreSQLに格納する

CSV形式で記述された複数のテキストファイルをpostgresqlに格納する方法。

ただし、ファイルの最初の1行目にはデータのフィールド名が入っているので取り除く

for i in *.txt; do sed -e "1d" $i | psql -d db -c "copy history from stdin using delimiters ',';";done

こんなところでsedつかうとは。。

 

3ボタンエミュレーション

Fedora8では3ボタンエミュレーションが無効になっている。大抵のホイル付マウスはホイル自体が3番めのボタンになるので、エミュレーションは必要ない。だが、ホイルをボタン代わりに押すってのはどうも慣れない。でもって、3つボタンが無いころから選択範囲を簡単にコピーするため3ボタンエミュレーションは欠かせなかった。

さてさて、これを有効にしようにも設定画面が無い。仕方なくxorg.confを触ることになる。

# cd /etc/X11/
# vi xorg.conf
 :
Section "InputDevice"

    # generated from default
        Identifier  "Mouse0"
        Driver      "mouse"
        Option      "Protocol" "auto"
        Option      "Device" "/dev/input/mice"
        Option      "Emulate3Buttons" "yes" < -- これ
        Option      "ZAxisMapping" "4 5"
EndSection
 :

Xを再起動すれば有効になる。