C++って本当に重いの??

C++が重いとか、余分なRAMを使うと言われる理由を探してみます。

簡単なコードとアセンブリを用意。

MinGWでコンパイルしたので余分なアセンブリが入っていると思います。

class test
{
public:
	int data1;
	int data2;
	void aaa()
	{
		data1 = 1234;
	}
	;
};

volatile void sub3()
{
	test* ts = new test;
	ts->aaa();
	ts->data1 = 300;
}

volatile void sub2()
{
	test ts;
	ts.aaa();
	ts.data1 = 200;
}

volatile void sub1()
{
	test ts;
	ts.aaa();
	ts.data1 = 100;
}

int main()
{
	sub1();
	sub2();
	sub3();

	return 0;
}
	.file	"test02.cpp"
	.text
	.align 2
.globl __Z4sub3v
	.def	__Z4sub3v;	.scl	2;	.type	32;	.endef
__Z4sub3v:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$8, %esp
	movl	$8, (%esp)
	call	__Znwj
	movl	%eax, -4(%ebp)
	movl	-4(%ebp), %eax
	movl	%eax, (%esp)
	call	__ZN4test3aaaEv
	movl	-4(%ebp), %eax
	movl	$300, (%eax)
	leave
	ret
	.section	.text$_ZN4test3aaaEv,"x"
	.linkonce discard
	.align 2
.globl __ZN4test3aaaEv
	.def	__ZN4test3aaaEv;	.scl	2;	.type	32;	.endef
__ZN4test3aaaEv:
	pushl	%ebp
	movl	%esp, %ebp
	movl	8(%ebp), %eax
	movl	$1234, (%eax)
	popl	%ebp
	ret
	.text
	.align 2
.globl __Z4sub2v
	.def	__Z4sub2v;	.scl	2;	.type	32;	.endef
__Z4sub2v:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$24, %esp
	leal	-8(%ebp), %eax
	movl	%eax, (%esp)
	call	__ZN4test3aaaEv
	movl	$200, -8(%ebp)
	leave
	ret
	.align 2
.globl __Z4sub1v
	.def	__Z4sub1v;	.scl	2;	.type	32;	.endef
__Z4sub1v:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$24, %esp
	leal	-8(%ebp), %eax
	movl	%eax, (%esp)
	call	__ZN4test3aaaEv
	movl	$100, -8(%ebp)
	leave
	ret
	.def	___main;	.scl	2;	.type	32;	.endef
	.align 2
.globl _main
	.def	_main;	.scl	2;	.type	32;	.endef
_main:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$8, %esp
	andl	$-16, %esp
	movl	$0, %eax
	addl	$15, %eax
	addl	$15, %eax
	shrl	$4, %eax
	sall	$4, %eax
	movl	%eax, -4(%ebp)
	movl	-4(%ebp), %eax
	call	__alloca
	call	___main
	call	__Z4sub1v
	call	__Z4sub2v
	call	__Z4sub3v
	movl	$0, %eax
	leave
	ret
	.def	__Znwj;	.scl	2;	.type	32;	.endef

見たところ、むしろ非常に効率よく処理してるような気がします。
少なくとも、ROMからRAMへコードはコピーされないことが確認できます。

テンプレートや例外はまた今度

UT-VPNのインストールと設定

環境はubuntu10.10です

インストールから接続までやってみます。

こちら からut-vpnのソースコードを持ってきます。
pdfのマニュアルがあるので、そちらもダウンロード
② 展開して ./configuer ./configure ※修正!
パラメータは不要
make
おそらく以下のどれかのライブラリの、ヘッダファイルが見つからない等のエラーが出るので、
適切なライブラリをインストールします。

apt-get update
  • OpenSSL apt-get install libssl-dev
  • libiconv  apt-get install  libiconv-hook-dev
  • readline apt-get install libeditline-dev
  • ncurses apt-get install libncurses5-dev

※違うディストリビューションで、aptが無い場合は公式から直接ライブラリのソースを落としてきて、コンパイルします。
どのライブラリもconfiguerのパラメータは設定不要でおkです。

④コンパイルが通るまで③へ戻る。

make install      ※追加 make test で確認しておく方がいいようです。
次の3つの実行ファイルがインストールされます

  • utvpnclient  /usr/utvpnclient/utvpnclient
  • utvpnserver    /usr/utvpnserver/utvpnserver
  • utvpncmd        /usr/utvpncmd/utvpncmd

次のディレクトリに起動用のスクリプトが展開されます

  • /usr/bin/utvpnclient
  • /usr/bin/utvpnserver
  • /usr/bin/utvpncmd

⑥ 起動する
utvpnclient start
正常に起動できれば、SoftEther UT-VPN Client Service Started. と、表示されます。
表示されなければ失敗です①からやり直し。
Segmentation fault と表示されたら、ライブラリの再インストールをすると治ったりするかも。(opennsslで詰まりました)
⑦ クライアントへ接続する(自分自身)

2. VPN Client の管理
何もせずにEnter
⑧ コマンドを確認
About                    – バージョン情報の表示
AccountAnonymousSet      – 接続設定のユーザー認証の種類を匿名認証に設定
AccountCertGet           – 接続設定に用いるクライアント証明書の取得
AccountCertSet           – 接続設定のユーザー認証の種類をクライアント証明書認証に設定
AccountCompressDisable   – 接続設定の通信時のデータ圧縮の無効化
AccountCompressEnable    – 接続設定の通信時のデータ圧縮の有効化
AccountConnect           – 接続設定を使用して VPN Server へ接続を開始
AccountCreate            – 新しい接続設定の作成
AccountDelete            – 接続設定の削除
AccountDetailSet         – 接続設定の高度な通信設定の設定
AccountDisconnect        – 接続中の接続設定の切断
AccountEncryptDisable    – 接続設定の通信時の暗号化の無効化
AccountEncryptEnable     – 接続設定の通信時の暗号化の有効化
AccountExport            – 接続設定のエクスポート
AccountGet               – 接続設定の設定の取得
AccountImport            – 接続設定のインポート
AccountList              – 接続設定一覧の取得
AccountNicSet            – 接続設定で使用する仮想 LAN カードの設定
AccountPasswordSet       – 接続設定のユーザー認証の種類をパスワード認証に設定
AccountProxyHttp         – 接続設定の接続方法を HTTP プロキシサーバー経由接続に設定
AccountProxyNone         – 接続設定の接続方法を直接 TCP/IP 接続に設定
AccountProxySocks        – 接続設定の接続方法を SOCKS プロキシサーバー経由接続に設定
AccountRename            – 接続設定の名前の変更
AccountRetrySet          – 接続設定の接続失敗または切断時の再試行回数と間隔の設定
AccountSecureCertSet     – 接続設定のユーザー認証の種類をスマートカード認証に設定
AccountServerCertDelete  – 接続設定のサーバー固有証明書の削除
AccountServerCertDisable – 接続設定のサーバー証明書の検証オプションの無効化
AccountServerCertEnable  – 接続設定のサーバー証明書の検証オプションの有効化
AccountServerCertGet     – 接続設定のサーバー固有証明書の取得
AccountServerCertSet     – 接続設定のサーバー固有証明書の設定
AccountSet               – 接続設定の接続先の設定
AccountStartupRemove     – 接続設定のスタートアップ接続を解除
AccountStartupSet        – 接続設定をスタートアップ接続に設定
AccountStatusGet         – 接続設定の現在の状態の取得
AccountStatusHide        – VPN Server への接続中に接続状況やエラー画面を表示しないように設定
AccountStatusShow        – VPN Server への接続中に接続状況やエラー画面を表示するように設定
AccountUsernameSet       – 接続設定の接続に使用するユーザー名の設定
CertAdd                  – 信頼する証明機関の証明書の追加
CertDelete               – 信頼する証明機関の証明書の削除
CertGet                  – 信頼する証明機関の証明書の取得
CertList                 – 信頼する証明機関の証明書一覧の取得
Check                    – SoftEther UT-VPN の動作が可能かどうかチェックする
KeepDisable              – インターネット接続の維持機能の無効化
KeepEnable               – インターネット接続の維持機能の有効化
KeepGet                  – インターネット接続の維持機能の取得
KeepSet                  – インターネット接続の維持機能の設定
MakeCert                 – 新しい X.509 証明書と秘密鍵の作成
NicCreate                – 新規仮想 LAN カードの作成
NicDelete                – 仮想 LAN カードの削除
NicDisable               – 仮想 LAN カードの無効化
NicEnable                – 仮想 LAN カードの有効化
NicGetSetting            – 仮想 LAN カードの設定の取得
NicList                  – 仮想 LAN カード一覧の取得
NicSetSetting            – 仮想 LAN カードの設定の変更
NicUpgrade               – 仮想 LAN カードのデバイスドライバのアップグレード
PasswordGet              – VPN Client サービスに接続するためのパスワードの設定の取得
PasswordSet              – VPN Client サービスに接続するためのパスワードの設定
RemoteDisable            – VPN Client サービスのリモート管理の禁止
RemoteEnable             – VPN Client サービスのリモート管理の許可
SecureGet                – 使用するスマートカードの種類の ID の取得
SecureList               – 使用できるスマートカードの種類の一覧の取得
SecureSelect             – 使用するスマートカードの種類の選択
TrafficClient            – 通信スループット測定ツールクライアントの実行
TrafficServer            – 通信スループット測定ツールサーバーの実行
VersionGet               – VPN Client サービスのバージョン情報の取得
⑨ 仮想LANカードを作成

⑩ 接続設定を新規作成

⑪ 接続

⑫ 状態を確認
accountstatusget
以下は設定例で mobilefreeの公開サーバへの接続例

おしまい。

todoの作り方

自分流の作り方を、メモ。

todoとは今日すべきことや、今からすべきことを簡単に まとめた物です。

ライフハッカーを読むまでは、存在さえ知らなかったわけですが、これが便利!

頭がぼーっとしていて、何すればいいのか分からなくなった時が使いどき。

① ひたすら何をすべきだったのか思い出す。

これは何でも良くて、ゲームだったり、片付けだったり、夕飯だったり、提出物だったり。

② 思い出したことをメモ帳に書く。

思い出した順番に、すべて書く。

順番の上にあればあるほど、自分の中で重要な物です。

順番の下にあればあるほど、自分の中で どうでも良くなっている物です。

③ 本当は重要でない物や、とても時間のかかる物をインデントします

インデントが多いほど、優先度は低くなります。

④ インデントの小さい物から順に、リストの下から実行します。

下から実行すると、実行しないで溜まっていたタスクが優先的に消えます。

 

偽札??

euroを空港で日本円に換金していると 一枚だけ機械が何度やっても拒否するらしく、おねぇさんに このお札は換金できないといわれました。

もしかして偽札!?とか思ったりした。

けど、 まさかなぁ。。 (おそらくイタリア。

ニコ生アラートやコメントビューアがブラウザで使えたらいいな

今あるアラートはどれもローカルにインストールor解凍しないと使えないし、

違うPCで見たりすると、ツールが入ってない!ってなる。

それに、ビュワーに関しては、インデックスしてあるIDのリストも違うPCと手動同期しないといけない。

ブラウザで実装してあれば、そもそもインストールする手間も掛からないので、沢山の人が使ってくれると思う。

ちょっと使いたいな~という時に、すぐ使えるので、継続的に使ってくれる人も多そう。

サーバサイドでニコニコと通信すると負荷が大きいので javascriptやAjaxで通信を実装したほうが良いと思った。