したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | メール | |

管理人の独り言(プログラミング関連)

1みみず★:2008/08/10(日) 23:28:15
あまりにもプログラミングの内容が増えすぎた。
よって隔離スレの中を更に隔離。

1569 ◆adhRKFl5jU:2009/03/07(土) 19:22:45
二分探索は面白い。
目から鱗。

1570 ◆adhRKFl5jU:2009/03/07(土) 21:49:27
このような状態で、既にemacsは特殊化されています。
このソフトは素晴らしい。別に普通に操作も出来るし、複雑な操作もキーボードだけで行うことも可能である。
また、Emacs Lispを使えば、自らの手で拡張することも容易である。
しかしとても残念なのが日本語の扱いである。もう少し丁重に扱ってくれたならばとても嬉しいのだが。
まあ、それは海外製のソフトウェアなので仕方が無い。まだ日本語で入力できるだけましであると思おう。
emacsを利用すれば、インターネットでブラウジングをしたり、メールを送ったり出来るそうなのだが、自分はただ単にLinuxの中にはviかemacsぐらいしか入っていないという理由で使っているだけである。だから特に自分はこのソフトウェアに拘りがあるかといわれたら、何もないとしか答えようが無い。
個人的にはvimのように操作が出来たほうが、少しでもvimを触ってしまった俺にとっては嬉しい。
MinbufferというFirefoxのスクリプトがあるのだが、あれはvim + Emacsのような感じである。あれは素晴らしい。
自分でキーバインドを簡単にカスタマイズすることが可能であり、また外部からも拡張することが可能なのである。素晴らしい。
是非ともSleipnirに移植したいと思ったのだが、残念ながらSleipnirはAltやCtrlやShiftを押した場合は、全てのキーイベントを奪ってしまうという仕様なので、全くC-f等の重要な操作が出来ないという状態に陥ってしまった。
表示を整えても、大事な入力の部分でこれでは全く駄目である。
また、ファンクションキーのボタンと、一部のキーが被っているという全く駄目なTridentの使用の為に更に使い勝手が悪くなってしまう。
このような不遇な中で958氏などが精力的に活動されているのは尊敬に値するものであると固く信じております。

1571 ◆adhRKFl5jU:2009/03/07(土) 21:50:05
emacsから投稿できるようにすると面白いかもしれないが、面倒くさい。
別にコピペでも簡単なので良いや。

1572 ◆adhRKFl5jU:2009/03/07(土) 21:50:25
適当に入力したので上の文章に深い意味は無い。

1573 ◆adhRKFl5jU:2009/03/08(日) 12:27:39
やっぱり凄いやつは凄いなあ。

1574 ◆adhRKFl5jU:2009/03/08(日) 12:27:56
努力?
俺の辞書に(ry

1575 ◆adhRKFl5jU:2009/03/08(日) 13:50:57
右耳から音が聞こえないと思ったら、イヤフォンが落ちてた。

1576 ◆adhRKFl5jU:2009/03/08(日) 14:14:59
SDL_SetAlpha(bmp, SDL_SRCALPHA, curve[index]);
SDL_BlitSurface(bmp, NULL, sc, NULL);
で以前上手くいかねえええええええええええ、
とか思っていたが、いまだと上手く行く件について。
何故だ、

1577 ◆adhRKFl5jU:2009/03/08(日) 14:39:49
早く俺にC++0xを使わせろや。
func({})とか早くやりたい><

1578 ◆adhRKFl5jU:2009/03/08(日) 14:50:25
正直C++0xは複合リテラルももらってきて欲しかった。
つまり、構造体を渡すときに、
---------------------------------------
struct Rect{
int x, y, w, h;
};

void FillRect(const Rect *p);
--中略--
FillRect(&(Rect){.x = 0, .y = 0, .w = 100, .h = 100}); //こんな風に!
FillRect(&(Rect){0, 0, 100, 100});
---------------------------------------
みたいに渡すことが出来ちゃう機能である。
これだといちいち変数宣言しなくて良いから楽なんだけれどもなあ。
別に構文は一緒でなくても良いから、入れて欲しかった。

1579 ◆adhRKFl5jU:2009/03/08(日) 14:57:41
>>1578
恐らく下のほうの構文は、普通に出来る(“&(Rect)”は書かなくて良い!)と思うが、上の方が使いたいのだ。
上の方が全て初期化する必要性が無いだろうからだ。
つまり、.xと.yだけ使う関数があるから、それだけ利用したいと。

1580 ◆adhRKFl5jU:2009/03/08(日) 15:14:46
恐らく可変長引数テンプレートは俺は使わないだろう。
ライブラリー作る中の人頑張って下さい><

1581 ◆adhRKFl5jU:2009/03/08(日) 18:04:47
http://msdn.microsoft.com/en-us/library/aa384273(VS.85).aspx

1582 ◆adhRKFl5jU:2009/03/08(日) 18:04:57
http://msdn.microsoft.com/en-us/library/aa382925(VS.85).aspx

1583 ◆adhRKFl5jU:2009/03/08(日) 18:05:09
http://msdn.microsoft.com/en-us/library/aa384106(VS.85).aspx

1584 ◆adhRKFl5jU:2009/03/08(日) 20:17:31
例外をスローしてちゃんとハンドルをクローズするようにするの面倒だなあ。
そう考えるとfinallyがあると物凄く便利だと思う。
かなり重くなりそうだが。

1585 ◆adhRKFl5jU:2009/03/08(日) 20:31:12
僅か七十行で、HTML通信が出来るというのも素晴らしいものだ。
WinInetだとクッキーを共有するので、WinHTTPで書いてみた。
本当ならば、WinSocketで書くべきなのだが、そんなの使ってたら、chunkedとかあるので、結構面倒。
という事で、高レベルなAPIで書いてしまえということである。
まあ、同じのをJScriptで書けば、ファイルの処理とかも含めて100行ぐらいなのだが。
そう考えると生産性が低いなと。

1586 ◆adhRKFl5jU:2009/03/08(日) 20:33:37
WinHttpOpen(L"Test", WINHTTP_ACCESS_TYPE_NO_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0)
WinHttpConnect(hInet, L"mimizu.karou.jp", INTERNET_DEFAULT_HTTP_PORT, 0)
WinHttpOpenRequest(hConnect, L"GET", L"index.html", NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, WINHTTP_FLAG_REFRESH)
WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0)
WinHttpReceiveResponse(hRequest, NULL)
WinHttpQueryDataAvailable(hRequest, &size)
WinHttpReadData(hRequest, p, size, &copyed)

1587 ◆adhRKFl5jU:2009/03/08(日) 20:35:10
忍者のところのサーバーはchunkedで返してくる。
</head>のところに広告用のcssをはさんでくるのでそこでまず切れる。
で、次に</body>のところで実際の広告を入れるということだ。

1588 ◆adhRKFl5jU:2009/03/08(日) 20:37:01
http://i.msdn.microsoft.com/Aa383880.art_winhttp3(en-us,VS.85).png
WinHTTPのAPIの呼び出し方の図。
分かりやすし。

1589 ◆adhRKFl5jU:2009/03/08(日) 20:39:34
new ActiveXObject("WinHttp.WinHttpRequest.5.1");
で可能と・・・

1590 ◆adhRKFl5jU:2009/03/08(日) 20:41:27
http://msdn.microsoft.com/en-us/library/aa384060(VS.85).aspx
COM使うのは滅茶苦茶面倒だな。
JScriptとかC#とか万歳!
まあ、其の分遅いのだが。

1591 ◆adhRKFl5jU:2009/03/08(日) 20:51:54
ああ、なんか色々と面白いことが出来そうなんだがなあ。
何も思い浮かばない。もうだめぽ。

1592 ◆adhRKFl5jU:2009/03/08(日) 22:35:13
うーん。
やっぱりTCP/IPとかHTTPの仕様がよく分からん。
正確にはWinHTTPの実装がどうなっているのかということだが。

1593 ◆adhRKFl5jU:2009/03/08(日) 22:54:46
HTTPの仕様は読めば読むほど、実装大変ですね、と思えてくる。

1594 ◆adhRKFl5jU:2009/03/08(日) 23:10:06
まあ、良い。
完全に実装を行おうとするからいけないのだ。
なんか、206の受け取りの実装は大変そうな予感。
ちゃんとWinInetとかWinHTTPでは上手くやってくれるのだろうか。

1595 ◆adhRKFl5jU:2009/03/08(日) 23:11:01
あ、別にRangeに複数指定している場合だけなんだか面倒なだけなようだ。

1596 ◆adhRKFl5jU:2009/03/08(日) 23:15:36
最悪、400を返せばよいなw

1597 ◆adhRKFl5jU:2009/03/09(月) 18:48:54
初音ミクが家の前を歩いてたんだけど…‐ニコニコ動画(ββ)
http://www.nicovideo.jp/watch/sm4788237
「電脳コイル」に向けたAR研究例・PTAMのソースコードが公開されていますのでお知らせ | 王様の箱庭
http://www.masayashi.com/2008/10/14/870
-----
電脳コイルが実現するのか!

1598 ◆adhRKFl5jU:2009/03/09(月) 18:52:20
まつもと直伝 プログラミングのオキテ---目次:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20060825/246409/

1599 ◆adhRKFl5jU:2009/03/09(月) 19:42:40
気分でダウンローダーでも作ろうかと。
一応しょぼしょぼSleipnirでも利用できるような仕様にする予定。
ダウンロード処理は全部別プロセスに任せて、主にそっちで処理は全部する。
インターフェイスっぽいものを用意して、それを利用してダウンロードの指示とか出来るようにしようかと。
まあ、どうやってインターフェイスを作ろうかが問題である。
名前付きパイプになるかな?

1600 ◆adhRKFl5jU:2009/03/09(月) 19:49:16
charからwchar_tの変換面倒だな。
まあ、普通にCの標準関数でやるべきか。
それともWinAPIを使うべきか。

1601 ◆adhRKFl5jU:2009/03/09(月) 19:50:01
適当にハッシュ関数を作る。
別に逆算されても問題ないので滅茶苦茶適当に作る。

1602 ◆adhRKFl5jU:2009/03/09(月) 19:58:30
newは例外を投げるから嫌いです><
別にC++でも普通にmallocとか使っても良いと思う。
別に誰からも禁止されたことは無いが。

1603 ◆adhRKFl5jU:2009/03/09(月) 20:01:57
例外は出来るだけ起こさない方向で。

1604 ◆adhRKFl5jU:2009/03/09(月) 20:11:19
という事で、例外が起こったというのを示すために
std::pair<bool, 返したい型>
みたいな風にすれば良いと思った。
これならば、エラー起こってもそんなに傷は深くないと思う(時間的な意味で)。

1605 ◆adhRKFl5jU:2009/03/09(月) 20:21:51
適当。
-----
std::pair<bool, unsigned long long int> GetHash(const wchar_t *str){
typedef std::pair<bool, unsigned long long int> rettype;

std::size_t len = wcslen(str);
unsigned long long int v = 0x0123456789ABCDEFLL;
for(std::size_t i = 0; i < len; ++i){
v = v * 137 + str[i] * 581;
}

return rettype(true, v);
}

1606 ◆adhRKFl5jU:2009/03/09(月) 20:32:44
無駄に64bits。
ただ単にパスからユニークな値を導出したいだけなのだが。

1607 ◆adhRKFl5jU:2009/03/09(月) 20:35:54
パイプってやっぱり一対一だけなのかな。
一体多が出来ると美味しいのだが。

1608 ◆adhRKFl5jU:2009/03/09(月) 20:40:40
Named Pipes (Windows)
http://msdn.microsoft.com/en-us/library/aa365590(VS.85).aspx
-----
>A named pipe is a named, one-way or duplex pipe for communication between the pipe server and one or more pipe clients.
-----
という事で、大丈夫そう。

1609 ◆adhRKFl5jU:2009/03/09(月) 20:45:00
パイプを開くのにCreateFileを使うのは物凄い違和感がある。
と言ってもCreateFileでファイルを開くんだけどね。

1610 ◆adhRKFl5jU:2009/03/09(月) 20:50:07
>The opening process can duplicate the handle as many times as required, but after it is opened, the named pipe instance cannot be opened by another client.
死んでしまえ!

1611 ◆adhRKFl5jU:2009/03/09(月) 20:51:31
常に開いておかないと通信出来んやん。
必要なときだけ開いて、閉じれば良い?面倒すぎるだろ。
しかし、それしか方法無いしそれで行くかorz....

1612 ◆adhRKFl5jU:2009/03/09(月) 21:02:28
リソースを占有し続けるぜ!

1613 ◆adhRKFl5jU:2009/03/09(月) 21:14:19
取り敢えず、読み込みたい書き込みたい!と思ったら、
WaitNamedPipe
で待てば良いみたい。
まあ、大体鯖は
-----
ConnectNamedPipeで接続を待つ。;
ReadFileで情報を読む。;
WriteFileで情報を書き込む。 if(書き込まないといけないような内容だったら);
最初に戻る。
-----
という感じか。
全てのダウンロードが終わったら終了するのだが、ちょうど終了処理中に新たなダウンロード依頼が来たら困っちゃうが、まあそれは実装の時に考えよう。

1614 ◆adhRKFl5jU:2009/03/09(月) 21:28:06
ぐはっ。
起動時にはダウンロードするファイルが無いから直ぐ終了するぜ!
考えよう。

1615 ◆adhRKFl5jU:2009/03/10(火) 18:13:43
クリックジャッキングの本質的な解決策 - IT戦記
http://d.hatena.ne.jp/amachang/20090310/1236674542
-----
駄目じゃね?
まあ、JavaScriptが有効じゃなかったら問題ないが。
でも
-----
* *{
opacity: 0.1 !important;
}
-----
でおk。
こっちの方が優先度が高いはず。

1616 ◆adhRKFl5jU:2009/03/10(火) 20:15:31
あ。
ユーザースタイルシートの方が優先度高いか。なんてこった。

1617 ◆adhRKFl5jU:2009/03/10(火) 20:16:39
いかん。
1.ユーザー
2.鯖
3.鯖 !important
4.ユーザー !importantか?

1618 ◆adhRKFl5jU:2009/03/10(火) 20:22:09
ちゃうちゃう。
1.鯖
2.ユーザー
3.鯖 !important
4.ユーザー !important
か。

1619 ◆adhRKFl5jU:2009/03/10(火) 20:22:54
Windows と C++: 非同期 WinHTTP
http://msdn.microsoft.com/ja-jp/magazine/cc716528.aspx
-----
やっぱり日本語の資料じゃないと読む気がしない。

1620 ◆adhRKFl5jU:2009/03/10(火) 20:23:23
個人的にはスレッドつくりまくりの計画だから、要らないかもしれないが。

1621 ◆adhRKFl5jU:2009/03/10(火) 20:26:13
std::pair<bool, unsigned long long int> GetHash(const wchar_t *str){
typedef std::pair<bool, unsigned long long int> rettype;

std::size_t len = std::wcslen(str);
unsigned long long int v = 0x0123456789ABCDEFLL;
for(std::size_t i = 0; i < len; ++i){
v = v * 137 + str[i] * 581;
}

return rettype(true, v);
}

std::pair<bool, unsigned long long int> GetHash(const char *str){
typedef std::pair<bool, unsigned long long int> rettype;

int size = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
if(size == 0){
return rettype(false, 0LL);
}
wchar_t *buff = (wchar_t*)std::malloc(sizeof(wchar_t) * size);
if(buff == NULL){
return rettype(false, 0LL);
}

int copyed = MultiByteToWideChar(CP_ACP, 0, str, -1, buff, size);
if(copyed == 0 || size != copyed){
std::free(buff);
return rettype(false, 0LL);
}

rettype ret = GetHash(buff);

std::free(buff);
return ret;
}

1622 ◆adhRKFl5jU:2009/03/11(水) 18:28:14
TryEnterCriticalSectionのMutex版はないのか!

1623 ◆adhRKFl5jU:2009/03/11(水) 20:42:05
にゅー。
Mutexとかの処理が上手くいかない。
ファイルマッピングを使っちゃおうかなあ。
あれって、書き込んだ瞬間に他のプロセスにも反映されるのかが分からないから困る。

1624 ◆adhRKFl5jU:2009/03/11(水) 21:17:29
MapViewOfFile
が上手くいかない。
まあ、CreateFileMappingを使う方向で。
-----
HANDLE hMap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_WRITECOPY | SEC_COMMIT, 0, 100, "TESTTESTTEST");
void *p;
void * const _p = p = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);

UnmapViewOfFile(_p);
CloseHandle(hMap);

1625 ◆adhRKFl5jU:2009/03/12(木) 12:49:59
BOOST_INTERLOCKED_INCREMENT
使えば良いみたい。使わなくても良いみたい。
よく分からない。

1626 ◆adhRKFl5jU:2009/03/12(木) 12:50:11
#include "DownloadManager.hpp"

#include <iostream>
#include <string>

#include <cstdlib>
#include <cctype>

#include <windows.h>

#include <cstring>

int Run(const char*, DWORD);
int Init(const char*, DWORD);
std::string GetFileName(std::string);
void Death(const char*);
bool CreateMainProcess(std::string&);

int Run(const char *hash, DWORD pid){
DownloadManager dm(hash);
if(dm.AddPID(pid)){
if(dm.Initialize()){
int ret = dm.Loop();
dm.Finalize();
return ret;
}
}

return -1;
}

int Init(const char *_hash, DWORD pid){
std::string hash(_hash);
{
HANDLE hTesting = CreateMutexA(NULL, FALSE, ("DLTesting1:" + m_hash).c_str());
if(hTesting == NULL){
return -1;
}
HANDLE hRunning = CreateMutexA(NULL, FALSE, ("DLRuning:" + m_hash).c_str());
if(hRunning == NULL){
CloseHandle(hTesting);
return -1;
}
WaitForSingleObject(hTesting, INFINITE);
bool isMutexRunningNonSignal = WaitForSingleObject(hRunning, 0) == WAIT_OBJECT_0;
ReleaseMutex(hTesting);
if(isMutexRunningNonSignal){
ReleaseMutex(hRunning);
}
CloseHandle(hRunning);
CloseHandle(hTesting);

if(isMutexRunningNonSignal){
if(CreateMainProcess(hash)){
return 0;
}else{
return -1;
}
}
}

{
HANDLE hTesting = CreateMutexA(NULL, FALSE, ("DLTesting1:" + m_hash).c_str());
if(hTesting == NULL){
return -1;
}
HANDLE hFlag = CreateEvent(NULL, TRUE, FALSE, ("DLFlag:" + hash).c_str());
if(hFlag == NULL){
return -1;
}
if(GetLastError() == ERROR_ALREADY_EXISTS){

}else{
if(CreateMainProcess(hash))
}
}

return 0;
}

bool

std::string GetFileName(std::string str){
typedef std::string::size_type size_type;

size_type pos = str.find_last_of('\\');
if(pos == std::string::npos){
pos = str.find_last_of('/');
}

if(pos == std::string::npos || pos == str.length() - 1){
return str;
}

return str.substr(pos + 1);
}

int main(int argc, char **argv){
if(argc < 2){
Death("引数が凄く足りません。");
}

const char *hash = NULL;
DWORD pid = ~0;
bool run = false;
for(int i = 1; i < argc; ++i){
if(argv[i][0] == '/' || argv[i][0] == '-'){
switch(argv[i][1]){
case 'h':
case 'H':{
hash = &argv[i][2];
break;
}
case 'i':
case 'I':{
pid = (DWORD)std::atol(&argv[i][2]);
break;
}
case 'r':
case 'R':{
run = true;
break;
}
}
}
}

//コマンドラインが無くても、ここで引っかかるはず。
if(pid == ~0 || hash == NULL){
Death("引数が足りないです。");
}

//パイプの最大の長さは全体で256文字まで。バックスラッシュ以外は利用可能。
//このソフトは英数字以外は利用しないとする。
//256 - nはn文字分確保するため。
{
unsigned int len = 0;
while(hash[len]){
++len;
if(len <= 256 - 15){
if(std::isalpha(hash[len - 1]) || std::isdigit(hash[len - 1])){
}else{
Death("渡されたハッシュに不正な文字が含まれています。");
}
}else{
Death("渡されたハッシュが長すぎます。");
}
}
if(len == 0){
Death("渡されたハッシュがありません。");
}
}

if(run){
return Run(hash, pid);
}

return Init(hash, pid);
}

//エラー吐いて死ぬ
void Death(const char *str){
std::cerr << GetFileName(__argv[0]) << ":" << str << std::endl;
std::exit(-1);
}

1627 ◆adhRKFl5jU:2009/03/12(木) 12:50:42
#include "DownloadManager.hpp"

#include <string>
#include <map>

#include <windows.h>

/*----------*/
unsigned int
DownloadManager::WaitThread(void *){
return 0;
}

/*==========*/
DownloadManager::DownloadManager(const char *hash)
: m_hash(hash), m_hRunning(NULL), m_hPipe(NULL), m_hFlag(NULL)
{}

/*==========*/
bool
DownloadManager::AddPID(DWORD pid){
std::map<DWORD, HANDLE>::const_iterator it = m_pis.find(pid);
if(it == m_pis.end()){
HANDLE hProcess = OpenProcess(SYNCHRONIZE, FALSE, pid);
if(hProcess != NULL){
m_pis.insert(std::make_pair(pid, hProcess));
return true;
}
return false;
}

return true;
}

/*==========*/
bool
DownloadManager::Initialize(){
m_hRunning = CreateMutexA(NULL, FALSE, ("DLRunning:" + m_hash).c_str());
if(m_hRunning == NULL){
return false;
}
WaitForSingleObject(m_hRunning, INFINITE);

m_hPipe = CreateNamedPipeA(("\\\\.\\pipe\\" + m_hash).c_str(), PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE | PIPE_WAIT, 1, 0, 0, 1000, NULL);
if(m_hPipe == INVALID_HANDLE_VALUE){
ReleaseMutex(m_hRunning);
CloseHandle(m_hRunning);

return false;
}

m_hFlag = CreateEventA(NULL, TRUE, FALSE, ("DLFlag:" + m_hash).c_str());
if(m_hFlag == NULL){
CloseHandle(m_hPipe);
ReleaseMutex(m_hRunning);
CloseHandle(m_hRunning);

return false;
}

HANDLE hCreated = OpenEventA(EVENT_MODIFY_STATE, FALSE, ("DLCreated:" + m_hash).c_str());
if(hCreated == NULL){
CloseHandle(m_hFlag);
CloseHandle(m_hPipe);
ReleaseMutex(m_hRunning);
CloseHandle(m_hRunning);

return false;
}
if(SetEvent(hCreated) == FALSE){
CloseHandle(hCreated);
CloseHandle(m_hFlag);
CloseHandle(m_hPipe);
ReleaseMutex(m_hRunning);
CloseHandle(m_hRunning);

return false;
}
CloseHandle(hCreated);

return true;
}

/*==========*/
int
DownloadManager::Loop(){
return 0;
}

/*==========*/
bool
DownloadManager::Finalize(){
CloseHandle(m_hPipe);
ReleaseMutex(m_hRunning);
CloseHandle(m_hRunning);
return true;
}

1628 ◆adhRKFl5jU:2009/03/12(木) 12:50:57
#ifndef DOWNLOADMANAGER_HPP
#define DOWNLOADMANAGER_HPP

#include <string>
#include <map>

#include <windows.h>

class DownloadManager{
private:
static
unsigned int
WaitThread(void *);

public:
DownloadManager(const char*);
bool Initialize();
bool Finalize();
int Loop();
bool AddPID(DWORD);

private:
std::map<DWORD, HANDLE> m_pis;
std::string m_hash;

//mutex
HANDLE m_hRunning;
//pipe
HANDLE m_hPipe;
//event
HANDLE m_hFlag;
};

#endif

1629 ◆adhRKFl5jU:2009/03/12(木) 16:27:53
なんてこった。
今気づいた。ファイルマッピングは使えないと。
何故ならば、WaitFor(ryで待て無いじゃん。
やっぱりEventにしないとなorz......

1630 ◆adhRKFl5jU:2009/03/12(木) 16:28:58
取り敢えず、MutexとかEventを共有メモリ的に使えるようにするような簡単なclassでも書けば良いか。

1631 ◆adhRKFl5jU:2009/03/12(木) 16:55:55
#ifndef SHAREDMEMORYMANAGER_HPP
#define SHAREDMEMORYMANAGER_HPP

#include <windows.h>
#include <cstring>
#include <string>

#include <stdexcept>

class SharedMemoryManager{
private:
HANDLE m_hMutexRW, m_hMap;
volatile void *m_p;

public:
SharedMemoryManager(std::size_t size, const char *_id){
std::string id(_id);
if(id.length() > MAX_PATH - 5){
throw std::logic_error("_id is too long");
}

m_hMutexRW = CreateMutexA(NULL, FALSE, ("SMMR:" + id).c_str());
if(m_hMutexRW == NULL){
throw std::logic_error("CreateMutexA Error");
}
HANDLE hMutexC = CreateMutexA(NULL, FALSE, ("SMMC:" + id).c_str());
if(hMutexC == NULL){
CloseHandle(m_hMutexRW);
throw std::logic_error("CreateMutexA Error");
}

WaitForSingleObject(hMutexC, INFINITE);

m_hMap = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE | SEC_COMMIT, 0, size, ("SMMF" + id).c_str());
if(m_hMap == NULL){
ReleaseMutex(hMutexC);
CloseHandle(hMutexC);
CloseHandle(m_hMutexRW);
throw std::logic_error("CreateFileMappingA Error");
}
bool exist = (GetLastError() == ERROR_ALREADY_EXISTS);

m_p = MapViewOfFile(m_hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);
if(m_p == NULL){
CloseHandle(m_hMap);
ReleaseMutex(hMutexC);
CloseHandle(hMutexC);
CloseHandle(m_hMutexRW);
throw std::logic_error("MapViewOfFile Error");
}

if(exist == false){
ZeroMemory((void*)m_p, size);
}

ReleaseMutex(hMutexC);
CloseHandle(hMutexC);
}

~SharedMemoryManager(){
UnmapViewOfFile((void*)m_p);
CloseHandle(m_hMap);
CloseHandle(m_hMutexRW);
}

bool ReaderEnter(DWORD timeout = INFINITE){
return WaitForSingleObject(m_hMutexRW, timeout) == WAIT_OBJECT_0;
}
void ReaderLeave(){
ReleaseMutex(m_hMutexRW);
}
bool WriterEnter(DWORD timeout = INFINITE){
return WaitForSingleObject(m_hMutexRW, timeout) == WAIT_OBJECT_0;
}
void WriterLeave(){
ReleaseMutex(m_hMutexRW);
}

volatile void *GetPointer(){
return m_p;
}
operator volatile void *(){
return GetPointer();
}
};

#endif

1632 ◆adhRKFl5jU:2009/03/13(金) 13:18:07
初めてPIAのページが役に立ったと思ったwwww
-----
8-2. プロセス間通信とバックドア
http://www.ipa.go.jp/security/awareness/vendor/programming/b08_02.html

1633 ◆adhRKFl5jU:2009/03/13(金) 13:19:09
パイプはclassで包まないほうが良いと思った。
newで生成したりしてstd::bad_allocを捕捉しなきゃいけなくなるから。
HANDLEで扱ったほうが楽そうだ。

1634 ◆adhRKFl5jU:2009/03/13(金) 14:39:22
>hNamedPipe ハンドルが FILE_FLAG_OVERLAPPED フラグを持たないとき、かつ、lpOverlapped パラメータで有効なポインタを指定したときは、この関数は非同期的に実行されます。制御はすぐに返り、戻り値は 0 になります。GetLastError 関数は、ConnectNamedPipe 関数を呼び出す前にクライアントプロセス側が接続されていたときは ERROR_PIPE_CONNECTED を、そうでないときは ERROR_IO_PENDING を返します。
全然同期なんですが。

1635 ◆adhRKFl5jU:2009/03/13(金) 14:45:58
>If hNamedPipe was not opened with FILE_FLAG_OVERLAPPED, the function does not return until a client is connected or an error occurs. Successful synchronous operations result in the function returning a nonzero value if a client connects after the function is called.
えー。

1636 ◆adhRKFl5jU:2009/03/13(金) 14:48:18
多分ウィンドウズの中の人は
SetNamedPipeHandleState
で非同期に変えてからやってくれ!と言っているんだ。
間違いない。

1637 ◆adhRKFl5jU:2009/03/13(金) 16:52:22
失敗したらthrowしまくっている。
boolを返す関数はreturn trueしかしない。
何故ならば、throwするからだ。

1638 ◆adhRKFl5jU:2009/03/14(土) 11:57:25
イテレータ使うとautoが使いたくなってくる。(C++0x的な意味で。)

1639 ◆adhRKFl5jU:2009/03/14(土) 11:58:04
std::list<T>::size()ってO(n)?O(1)?

1640 ◆adhRKFl5jU:2009/03/14(土) 11:59:12
仕様は知らないが、VC++はO(1)っぽい。

1641 ◆adhRKFl5jU:2009/03/14(土) 12:03:14
うわああああああああああboostが使いたくなってきた。
bimap

1642 ◆adhRKFl5jU:2009/03/14(土) 13:37:01
【人工知能】物理エンジンで人工生命つくって学習させた‐ニコニコ動画(ββ)
http://www.nicovideo.jp/watch/sm6392515
-----
これは凄い。

1643 ◆adhRKFl5jU:2009/03/14(土) 13:50:13
計算量はO(m)ですか?
m:関節の数

1644 ◆adhRKFl5jU:2009/03/14(土) 14:59:55
漸くダウンローダーのダウンロードじゃない部分が完成した。
多分二重起動とか、デッドロックは多分起こらないものと信じたい。
一応起動させると終了しないようには出来た。

1645 ◆adhRKFl5jU:2009/03/14(土) 18:30:08
オススメGmailフィルタ9選 : ライフハッカー[日本版], 仕事も生活も上手くこなすライフハック情報満載のブログ・メディア
http://www.lifehacker.jp/2009/03/090314_gmail10.html
スト決行!TBSからアナ消えた/芸能・社会/デイリースポーツonline
http://www.daily.co.jp/gossip/2009/03/14/0001753368.shtml
DO++: 大規模データを基にした自然言語処理
http://hillbig.cocolog-nifty.com/do/2009/03/post-3acb.html
痛いニュース(ノ∀`):「日本人のトイレに対する執念は何なんだ?」日本のトイレ、海外サイトで大反響 
http://blog.livedoor.jp/dqnplus/archives/1223558.html
| ^^ |秒刊SUNDAY | Windowsの潜在能力を飛躍的に向上するシステムツール集
http://www.yukawanet.com/sunday/2009/03/windows_1.html
安倍元首相が再登板に意欲「選挙の洗礼受けて」 : 政治 : YOMIURI ONLINE(読売新聞)
http://www.yomiuri.co.jp/politics/news/20090313-OYT1T00886.htm
若者はMP3の「雑音」がお好き? - スラッシュドット・ジャパン
http://slashdot.jp/article.pl?sid=09/03/13/0529258
Photoshopで火のついた線を描く方法 / ウェブデザインライブラリー
http://www.webdesignlibrary.jp/2009/03/fire-lines.php
音楽シーンに異変? 「初音ミク」チャートインの理由 - エンタ - 日経トレンディネット
http://trendy.nikkeibp.co.jp/article/pickup/20090310/1024495/

1646 ◆adhRKFl5jU:2009/03/14(土) 19:21:09
Sleipnirは東方よりも重い。メモリを食う。

1647 ◆adhRKFl5jU:2009/03/14(土) 21:29:04
friend classを使う荒業に出た。

1648 ◆adhRKFl5jU:2009/03/14(土) 21:33:36
流石に拙いと思ったので、やめた。

1649 ◆adhRKFl5jU:2009/03/14(土) 21:34:17
ObserverThread作るくらいだったら、シンプルにObserverパターンを実装すればよかったかな?

1650 ◆adhRKFl5jU:2009/03/14(土) 21:34:35
まあ、動いているからいいや><

1651 ◆adhRKFl5jU:2009/03/14(土) 21:38:35
あとは、ダウンローダーのコアとパイプのサーバー処理をなんとかするだけかな?

1652 ◆adhRKFl5jU:2009/03/15(日) 11:52:51
まだ、起動処理が書いてないし、クライアントも書いてないから、実際に動作実験が出来ないorz....
早いところ書かないとな。
まあ普通はテスト用のプログラムを書いてから開発に臨むべきだろうが。

1653 ◆adhRKFl5jU:2009/03/15(日) 11:55:06
新車の合鍵を作る序でに、本屋を見てきたのだが、Windowsのコマンドについて書かれた本が置いてなかった。
UnixとLinuxは置いてあったのに。
UnixとLinuxってそんなにコマンド違うのか?とも思った。俺はよく分からん><

1654 ◆adhRKFl5jU:2009/03/15(日) 15:52:52
まだ、完全にはデバッグできていないが、取り敢えず、起動部分は出来た。
後はクライアントを作るだけ。

1655 ◆adhRKFl5jU:2009/03/17(火) 18:49:00
取り敢えず、Sleipnirは終わったな。
これからはShiretoko使います。

1656 ◆adhRKFl5jU:2009/03/17(火) 19:01:11
PKU JudgeOnline
http://www.4dm.org/PKU/
------
こんなのあるんだ。

1657 ◆adhRKFl5jU:2009/03/17(火) 19:02:14
というかLingrすら知らなかったという。

1658 ◆adhRKFl5jU:2009/03/17(火) 19:03:55
取り敢えず、家を出てからちゃんと勉強が出来るようにジャッジに上がっているソースを全部ダウンロードしてみるテスト。
今からスクリプトを書くって言う。

1659 ◆adhRKFl5jU:2009/03/17(火) 19:09:11
あんまり晒されることを考慮して書いているから、晒されると動悸が・・・
まあインターネットだから仕方ないからいいんだよー!

1660 ◆adhRKFl5jU:2009/03/17(火) 19:32:32
正直emacsの自動的にふられるインデントが気に入らない。

1661 ◆adhRKFl5jU:2009/03/17(火) 23:28:07
出来たー。
どれだけ時間かかってソースダウンローダー作っているんだよwwwww

1662 ◆adhRKFl5jU:2009/03/17(火) 23:37:48
(function(){
var id = "";
var password = "";
var start = 1, end = 260;
var servername = ""
var CreateHTTPObject = function(){
return new ActiveXObject("Msxml2.ServerXMLHTTP.6.0");
};

var Utility = {
GetSearchString: function(obj){
var vec = [];
for(var i in obj){
if(obj.hasOwnProperty(i)){
vec.push(i + "=" + obj[i]);
}
}
return vec.join("&");
},
forEach: function(vec, func){
vec = [].concat(vec);
var len = vec.length;
for(var i = 0; i < len; ++i){
if(func(vec[i])){
return;
}
}
},
DecodeHTML: function(str){
return str.replace(/&([a-zA-Z]+);/g, function($1, $2){
return ({
amp: "&",
quote: "\"",
gt: ">",
lt: "<"
})[$2];
});
}
};

var Downloader = function(){
this.cookie = "";
};

Downloader.prototype.GetCookie = function(){
var http = CreateHTTPObject();
http.open("POST", "http://" + servername + "/joi_test/joi2/?action_user_index=true", false);
http.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

http.send(Utility.GetSearchString({
action_user_auth_proc: "true",
id: id,
pass: password,
submit: encodeURI("ログイン")
}));

var cookie = http.getResponseHeader("Set-Cookie");
cookie.match(/(JoiSESSID)=([^;]+);/);

this.cookie = RegExp.$1 + "=" + RegExp.$2;
};
Downloader.prototype.DownloadData = function(page){
var http = CreateHTTPObject();

http.open("GET", "http://" + servername + "/joi_test/joi2/?action_user_probresult_detail=true&jid=" + page);
http.setRequestHeader("Cookie", this.cookie);
http.send();

var html = http.responseText;
if(html.match(/<h2>エラーが発生しました<\/h2>/) && html.match(/<li>error<\/li>/)){
return null;
}else{
var lines = html.split("\n");
var src = Downloader.GetSource(lines);
var qid = Downloader.GetQuestionId(lines);
var id = page;
var language = Downloader.GetLanguage(lines);
var point = Downloader.GetPoint(lines);
var uptime = Downloader.GetUpTime(lines);
var results = Downloader.GetResults(lines);

return {
src: src,
qid: qid,
id: id,
language: language,
point: point,
uptime: uptime,
results: results
};
}
};

1663 ◆adhRKFl5jU:2009/03/17(火) 23:38:02

Downloader.GetSource = function(lines){
var flag = false;
var src = "";

Utility.forEach(lines, function(line){
if(!flag){
if(line.match(/<pre>(.*)$/)){
flag = true;
src = RegExp.$1;
if(line.match(/<pre>([^<]*)<\/pre>/)){
src = RegExp.$1;
return true;
}
}
}else{
if(line.match(/^(.*)<\/pre>/)){
src += "\n" + RegExp.$1;
return true;
}else{
src += "\n" + line;
}
}
});

return Utility.DecodeHTML(src);
};
Downloader.GetQuestionId = function(lines){
var flag = false;
var ret = "";

Utility.forEach(lines, function(line){
if(!flag){
if(line.match(/<td>問題番号<\/td>/)){
flag = true;
}
}else{
if(line.match(/<td><a[^>]*>([0-9]+)<\/a><\/td>/)){
ret = RegExp.$1 - 0;
}
return true;
}
});

return ret;
};
Downloader._GetNext = function(lines, name){
var flag = false;
var ret = "";
var reg = new RegExp("<td>" + name + "</td>");

Utility.forEach(lines, function(line){
if(!flag){
if(line.match(reg)){
flag = true;
}
}else{
if(line.match(/<td>([^<]+)<\/td>/)){
ret = RegExp.$1;
}
return true;
}
});

return ret;
};
Downloader.GetLanguage = function(lines){
return Downloader._GetNext(lines, "言語");
};
Downloader.GetUpTime = function(lines){
return Downloader._GetNext(lines, "アップロード時刻");
};
Downloader.GetPoint = function(lines){
return Downloader._GetNext(lines, "点数") - 0;
};
Downloader.GetResults = function(lines){
var state = 0;
var count = 0;
var i = 0;
var ret = [];

Utility.forEach(lines, function(line){
switch(state){
case 0:{
if(line.match(/<td>データ([0-9]+)<\/td>/)){
count++;
state = 1;
}
break;
}
case 1:{
if(line.match(/<td>データ([0-9]+)<\/td>/)){
count++;
break;
}else{
state = 2;
}
}
case 2:{
if(line.match(/<th>([^<]+)<\/th>/)){
state = 3;
}else{
break;
}
}
case 3:{
if(i < count){
if(line.match(/<th>([^<]+)<\/th>/)){
i++;
ret.push(RegExp.$1);
}
}else{
return true;
}
break;
}
}
});

return ret;
};

1664 ◆adhRKFl5jU:2009/03/17(火) 23:38:15

var fso = new ActiveXObject("Scripting.FileSystemObject");
var log = fso.CreateTextFile("log" + (new Date()).getTime() + ".txt", false);

var dl = new Downloader;
dl.GetCookie();
for(var i = start; i < end; ++i){
if(fso.FileExists("source" + i + ".txt") == false){
var ret = dl.DownloadData(i);
if(ret != null){
try{
var file = fso.CreateTextFile("source" + i + ".txt", false);
file.Write(ret.src);
log.WriteLine("採点番号:" + ret.id);
log.WriteLine("問題番号:" + ret.qid);
log.WriteLine("言語:" + ret.language);
log.WriteLine("アップロード時刻:" + ret.uptime);
log.WriteLine("得点:" + ret.point);
log.WriteLine("詳細:" + ret.results.toString());
log.WriteLine("文字数:" + ret.src.length);
log.WriteLine("------------------------------");
}catch(e){
log.WriteLine("エラー:" + e.toString());
log.WriteLine("------------------------------");
}
}
}else{
log.WriteLine("採点番号" + i + "は存在するためスルー。");
log.WriteLine("------------------------------");
}
}

WScript.Echo("完了");
})();

1665774さん:2009/03/18(水) 16:48:59
プログラマが1ヶ月でWebデザイナーに転身する方法 - やねうらお−よっちゃんイカを食べながら年収1億円稼げる(かも知れない)仕事術
http://d.hatena.ne.jp/yaneurao/20090318#p1

1666 ◆adhRKFl5jU:2009/03/18(水) 20:37:00
Shareすげえ。
DLLをインジェクションさせると起動に失敗するようになっていやがる。
だけれどもSetWindowsHookで注入するのは問題ないらしい。
どのようにしてチェックしているのだろうか・・・

1667 ◆adhRKFl5jU:2009/03/18(水) 20:44:06
ん?
Sleepしてあとから注入するとちゃんと動くって言う。
どういうことだ・・・?

1668 ◆adhRKFl5jU:2009/03/18(水) 23:01:37
ああ、もう駄目だ。
あきらめたあああああああああああああああ


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板