端末情報ファイルが更新されました。
Version: 20100305

下記のUserAgentが追加されています。
- SoftBank/1.0/943SH
最新の端末情報ファイルはぜひサポートにご加入いただいて
ご利用いただきますようお願いいたします。
購読専用サポートコース「Subscription」も新しくご用意。
どうぞご利用ください。
よろしくお願いいたします。
端末情報ファイルが更新されました。
Version: 20100305

下記のUserAgentが追加されています。
最新の端末情報ファイルはぜひサポートにご加入いただいて
ご利用いただきますようお願いいたします。
購読専用サポートコース「Subscription」も新しくご用意。
どうぞご利用ください。
よろしくお願いいたします。
端末情報ファイルが更新されました。
Version: 20100226

下記のUserAgentが追加されています。
最新の端末情報ファイルはぜひサポートにご加入いただいて
ご利用いただきますようお願いいたします。
購読専用サポートコース「Subscription」も新しくご用意。
どうぞご利用ください。
よろしくお願いいたします。
端末情報ファイルが更新されました。
Version: 20100222

下記のUserAgentが追加されています。
最新の端末情報ファイルはぜひサポートにご加入いただいて
ご利用いただきますようお願いいたします。
購読専用サポートコース「Subscription」も新しくご用意。
どうぞご利用ください。
よろしくお願いいたします。
端末情報ファイルが更新されました。
Version: 20100219

下記のUserAgentが追加されています。
最新の端末情報ファイルはぜひサポートにご加入いただいて
ご利用いただきますようお願いいたします。
購読専用サポートコース「Subscription」も新しくご用意。
どうぞご利用ください。
よろしくお願いいたします。
今流行りの twitter のクライアントが作りたい。
ユーザーのIDとパスワードをどこに置くか?
OAuthていうのを使うといいらしいけど、なんかややこしそうだし
セキュリティホールがあるってのも気になります。
やっぱレジストリに置こうかな。
ってことで、とりあえず可逆暗号書いてみました。
いろいろ調べたけど、結構簡単に使えそうなAPIがあったので
助かりました。
Windowsが関数の中で LocalAlloc する変数があるので忘れずに
LocalFree。恐ろしや。
#include <cstddef>
#include <string>
#include <windows.h>
#include <Wincrypt.h>
bool encrypt(const std::string& key, const std::string& plain, void* crypt, size_t* crypt_len )
{
DATA_BLOB key_bolb;
key_bolb.pbData = (BYTE*)key.c_str();
key_bolb.cbData = key.length()+1;
DATA_BLOB plain_bolb;
plain_bolb.pbData = (BYTE*)plain.c_str();
plain_bolb.cbData = plain.length()+1;
DATA_BLOB crypt_bolb; // must LocalFree
BOOL result
= CryptProtectData(
&plain_bolb,
L"",
&key_bolb,
NULL,
NULL,
0,
&crypt_bolb);
if(result)
{
*crypt_len = (size_t)crypt_bolb.cbData;
if(crypt != NULL )
::memcpy(crypt, crypt_bolb.pbData, *crypt_len);
}
LocalFree( crypt_bolb.pbData );
if(result)
return true;
else
return false;
}
bool decrypt(const std::string& key, const void* crypt, const size_t crypt_len, std::string& plain )
{
DATA_BLOB key_bolb;
key_bolb.pbData = (BYTE*)key.c_str();
key_bolb.cbData = key.length()+1;
DATA_BLOB crypt_bolb;
crypt_bolb.pbData = reinterpret_cast<BYTE*>(const_cast<void*>(crypt));
crypt_bolb.cbData = crypt_len;
DATA_BLOB plain_bolb; // must LocalFree
LPWSTR* desc = NULL; // must LocalFree
BOOL result
= CryptUnprotectData(
&crypt_bolb,
desc,
&key_bolb,
NULL,
NULL,
0,
&plain_bolb);
if(result)
{
plain = (char*)plain_bolb.pbData;
}
LocalFree( plain_bolb.pbData );
LocalFree( desc );
if(result)
return true;
else
return false;
}
使い方。
size_t out_len; //まずは暗号化後の長さを得る
if(::encrypt(key, plain, NULL, &out_len))
std::cout << "encrypt len ok" << std::endl;
else
std::cout << "encrypt len ng" << std::endl;
char* out = new char[out_len]; //暗号化
if(::encrypt(key, plain, out, &out_len))
std::cout << "encrypt ok" << std::endl;
else
std::cout << "encrypt ng" << std::endl;
//outに暗号化後のデータが入ってるので、どっかに保存したりする
memdumpc(out, out_len);
std::string check; //復号
if(::decrypt(key, out, out_len, check))
std::cout << "decrypt ok" << std::endl;
else
std::cout << "decrypt ng" << std::endl;
delete [] out;
std::cout << check << std::endl;
return;
}
端末情報ファイルが更新されました。
Version: 20100212

下記のUserAgentが追加されています。
最新の端末情報ファイルはぜひサポートにご加入いただいて
ご利用いただきますようお願いいたします。
購読専用サポートコース「Subscription」も新しくご用意。
どうぞご利用ください。
よろしくお願いいたします。
C++でメモリダンプでやりたいといってた slab allocation。
書いたどー。
http://na-s.jp/download.ashx?dl=/nslab_pp/nslab_pp_016.zip
一般に、malloc や free を繰り返していると、ヒープで管理される
メモリブロックの単位が次第に小さくなっていき、断片化してきます。
とくに、確保される領域の大きさがバラバラだったり、
確保から解放までの時間がバラバラだったりすると、
断片化が顕著になるといわれています。
ある程度断片化したヒープからは、空き領域があっても
まとまった領域を確保することができなくなってしまうので、
プロセスの再起動が必要になってしまいます。
slab allocation は上記のような問題に対する解決策です。
プロセス起動時にまとめて malloc した巨大な領域(slab)を、
あらかじめ決めておいた単位に分けて貸し出し、返却された
領域を再利用していくというもの。
ここに詳しい説明があります。
http://gihyo.jp/dev/feature/01/memcached/0002
【使い方】
malloc と free を置き換える場合。
using namespace nslab_pp;
size_t SLAB_UNITS[] = {4, 8, 100, 200 }; //貸し出し単位
const size_t SLAB_SIZE = 100 * 1024 * 1024; //mallocサイズ
int main()
{
::sconf(
SLAB_SIZE, SLAB_UNITS, sizeof(SLAB_UNITS)/sizeof(size_t) );
char* cptr = (char*)::salloc(100); //動的メモリ確保
// 何かする。
::sfree(cptr)
return 0;
}
オブジェクトとして使いたい場合。
using namespace nslab_pp;
size_t SLAB_UNITS[] = {4, 8, 100, 200 }; //貸し出し単位
const size_t SLAB_SIZE = 100 * 1024 * 1024; //mallocサイズ
slab_manager g_slab_man(
SLAB_SIZE, SLAB_UNITS, sizeof(SLAB_UNITS)/sizeof(size_t) );
int main()
{
char* cptr = (char*)g_slab_man.allocate(100); //動的メモリ確保
// 何かする。
g_slab_man.release(cptr)
return 0;
}
【コンパイル方法】
■A. Windowsの場合
0. Windows SDK と boost(thread関係) をインストール・構築しておく
1. src\Makefile.win の先頭2行を自分の環境に合わせる
2. Visual Studio Command Prompt を起動
3. src に cd
4. 自分の環境に適したコマンドを発行
>nmake -f Makefile.win BUILD=release ARCH=x86
>nmake -f Makefile.win BUILD=release ARCH=x64
dist に .lib ファイルなどが生成されます。
■B. Linuxの場合
0. g++ と boost(thread関係) をインストール・構築しておく
>sudo yum install gcc-c++
>sudo apt-get install g++
1. src に cd
2. make コマンドを発行
>make BUILD=release
dist に .a ファイルなどが生成されます。
端末情報ファイルが更新されました。
Version: 20100208

下記のUserAgentが追加されています。
最新の端末情報ファイルはぜひサポートにご加入いただいて
ご利用いただきますようお願いいたします。
購読専用サポートコース「Subscription」も新しくご用意。
どうぞご利用ください。
よろしくお願いいたします。