#include <stdio.h> #include <string.h> #include <limits.h> #include <sys/mman.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> void enable_code(void *addr) { long pagesize = sysconf(_SC_PAGESIZE); char* p = (void*)(((int) addr ) & ~(pagesize-1)); if(mprotect(p, pagesize, PROT_READ | PROT_WRITE | PROT_EXEC)) { fprintf(stderr, "mprotect(2) failed. errno = %d?n", errno); exit(1); } } void prt1(char *str) { printf("1:%s\n",str); } void prt2(char *str) { printf("2:%s\n",str); } void* make_caller_with_void_ptr(void* prog, void *strp) { unsigned char opcodes[] = { 0x55, /* push %ebp */ 0x89,0xe5, /* mov %esp,%ebp */ 0x53, /* push %ebx */ 0x83,0xec,0x04, /* sub $0x4,%esp */ 0xb8,0,0,0,0, /* movl $0x0,%eax */ 0x89,0x04,0x24, /* mov %eax,(%esp) */ 0xb8,0,0,0,0, /* movl $0x0,%eax */ 0xff,0xd0, /* call *%eax */ 0x83,0xc4,0x04, /* add $0x4,%esp */ 0x5b, /* pop %ebx */ 0x5d, /* pop %ebp */ 0xc3 /* ret */ }; static const int offset_string = 8; static const int offset_callee = 16; void(*code)(void); code = malloc(sizeof(opcodes)); memcpy(code, opcodes, sizeof(opcodes)); memcpy(code+offset_string, &strp, sizeof(&strp)); memcpy(code+offset_callee, &prog, sizeof(&prog)); enable_code(code); return code; } int main(int argc, char* argv[]) { void(*code1)(void); void(*code2)(void); code1 = make_caller_with_void_ptr(prt1, "this is code1"); code2 = make_caller_with_void_ptr(prt2, "this is code2"); printf("code1:"); code1(); printf("code2:"); code2(); exit(0); }
perlにて終了しないプログラムに遭遇(;´Д`)
処理A;
print "end\n";
exit;
ではendと表示して終了するのに、
処理B;
print "end\n";
exit;
ではendと表示するが「終了しない」という現象に遭遇(;´Д`)処理Aと処理Bの大きな違いは処理Bは処理Aと違って猛烈にメモリ使用の激しい処理であるということで…(2GBくらい使ってるポイ)CPUはほぼ100%使用になってしまっているので、なにかメモリ解放とかで手間取ってるのかも?と推測。しかし、ちょっと急ぎだったので以下のように実装したり(;´Д`)
処理B;
print "end\n";
kill 'HUP', $$;
exit;
(;´Д`)すんません
#!/usr/bin/perl
use strict;
use Encode;
use XML::LibXML;
use XML::LibXSLT;
use Data::Dumper;
(;´Д`) 20時間目
とりあえず気づいた部分(改定版):
・LibXML2周辺では Namespaceをぶっ飛ばされたりする。明示的にsetNamespace必要
・xsd:includeの処理が面倒でxslt一発で処理しようとしてもgoogleでも屍が多数見つかるのみ。地道にparseしてやるのが楽
・[xsl] :Generate instance document from schemaは不完全。かかわると時間の無駄
・Schemaからxslでinstance吐かせるのはかなり大変。取り回しを考えれば地道parseが近道
・ほかにも多数の地雷あり(;´Д`)
・toStringすると中身が・・・
先日からどうも PCの動作がおかしい件について(;´Д`)調査。PSP8がPower Users権限では起動しなくなって、どのDLLがとかどのEXEが実行できないのか調べていたのですが・・・
DLL ファイルで "アクセス許可は拒否されました" エラーを監視する
ああ便利ヽ(´ー`)ノ
Filemon for Windows つかってサクサクと調査、サクサク解決。
ということで、ATL.DLLを使えなくなっていたようなので、また権限変更して 解決(たぶん)。
bash-2.05b$ cacls MFC42.DLL C:\WINNT\system32\MFC42.DLL MAINMACH\Administrator:F NT AUTHORITY\SYSTEM:F BUILTIN\Administrators:FAdministratorでしか MFC42.DLL使えない状態ですね。UsersとPower Usersにも必要に応じて実行権限ついてないとアカンのですが(普段はうちではAdministrator権限ではPC使ってないのです)
bash-2.05b$ cacls MFC42.DLL C:\WINNT\system32\MFC42.DLL MAINMACH\Administrator:F BUILTIN\Administrators:F BUILTIN\Power Users:(OI)(CI)R NT AUTHORITY\SYSTEM:F BUILTIN\Users:Rとりあえず、起動できなかったソフトの問題はほとんど解消しましたヽ(´ー`)ノ
#!/usr/bin/perl #host.hrSystem.hrSystemUptime.0 .1.3.6.1.2.1.25.1.1.0 = Timeticks: (3168344309) 366 days, 16:57:23.09 #enterprises.ucdavis.memory.memTotalSwap.0 = 2096472 #enterprises.ucdavis.memory.memAvailSwap.0 = 2023480 #enterprises.ucdavis.memory.memTotalReal.0 = 1030676 #enterprises.ucdavis.memory.memAvailReal.0 = 96220 #enterprises.ucdavis.memory.memBuffer.0 = 27720 #enterprises.ucdavis.memory.memCached.0 = 232212 my ($addr, $commname) = @ARGV; my $mibhrSystemUptime = '.1.3.6.1.2.1.25.1.1.0'; my $mibmemTotalSwap = '.1.3.6.1.4.1.2021.4.3.0'; my $mibmemAvailSwap = '.1.3.6.1.4.1.2021.4.4.0'; my $mibmemTotalReal = '.1.3.6.1.4.1.2021.4.5.0'; my $mibmemAvailReal = '.1.3.6.1.4.1.2021.4.6.0'; my $mibmemBuffer = '.1.3.6.1.4.1.2021.4.14.0'; my $mibmemCached = '.1.3.6.1.4.1.2021.4.15.0'; my $snmpGet = 'snmpget'; my $memAvail = `$snmpGet -Oqs -v 1 "$addr" "$commname" $mibhrSystemUptime $mibmemTotalSwap $mibmemAvailSwap $mibmemTotalReal $mibmemAvailReal $mibmemBuffer $mibmemCached`; my @vals = split(/\n/, $memAvail); my $val; foreach $pair (@vals) { my ($k, $v) = split(/ /, $pair); $val{$k} = $v; } print 100*($val{'memTotalReal.0'}-$val{'memAvailReal.0'}-$val{'memBuffer.0'}-$val{'memCached.0'})/$val{'memTotalReal.0'}."\n"; print 100*($val{'memTotalSwap.0'}-$val{'memAvailSwap.0'})/$val{'memTotalSwap.0'}."\n"; my @upt = split(/:/, $val{'hrSystemUptime.0'}); print "${upt[0]} days ${upt[1]}:${upt[2]}\n"; print "$addr\n";
#!/usr/bin/perl use strict; use Encode; use XML::DOM; my $parser = new XML::DOM::Parser; my $doc = $parser->parsefile("hogehoge.xml"); my $nodes = $doc->getElementsByTagName("Query"); my $nodelength = $nodes->getLength(); for my $i (0..($nodelength-1)) { my $node = $nodes->item($i); my $queryName = $node->getAttributeNode("name")->getValue(); print "$queryName"."\n"; # SQLタグを含むElementは Queryタグ毎に1個しかないため my ($sqlNode) = $node->getElementsByTagName("SQL")->item(0); # SQLタグの中身を引っ張り出す(getChildNodes) # そして TEXT_NODEがタダ一つだけ取得されると仮定(item(0):概ね大丈夫) # で、TEXT_NODEから値を引っ張り出す(getData) print $sqlNode->getChildNodes->item(0)->getData."\n"; }
ココ最近パターン化してしまったphpのコードの書き方ヽ(´ー`)ノ自分の場合
includeして
POST値(btn_hoge)の処理1:location吐く
データ定義したり、データ読み込んだり
POST値(btn_hoge)の処理2:btn_内容で分岐
dispHeader(ほげ) http~bodyくらいまで吐く
whileまわしながら
dispTables(ほげ) 表とか吐く
dispFooter(ほげ) commit用ボタンとか 残りとか吐く
--コメント--
dispHeaderの定義
dispTablesの定義
dispFooterの定義
__END__ここまで
ちなみに
インクルードファイル:
rt.php(ランタイム)
common.php(共通変数)
とかで rt.phpと そのファイル固有のインクルード分を読み込みます。拡張子はphp
encodeは後で一気に全部変更できるように仕掛けを入れます。sessionの処理は
rt.phpから呼び出される includeファイルの中で実施。
トカ。いつかまたスタイルが変わったかな?というときに思い出して読めるように
メモヽ(´ー`)ノ
// ThreadTest.cpp : コンソール アプリケーション用のエントリ ポイントの定義 // #include "stdafx.h" #include "ThreadTest.h" #include/* _beginthread, _endthread */ #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // 唯一のアプリケーション オブジェクト CWinApp theApp; using namespace std; VOID threadA(LPVOID param) { while(1) { DWORD dwRet = WaitForSingleObject((HANDLE)param, 10000); if (dwRet == WAIT_TIMEOUT) { cout << "TIMEOUT\n"; }else{ cout << "GET MUTEX! 3000ms mattari! \n"; Sleep(3000); ReleaseMutex((HANDLE)param); } } } VOID threadB(LPVOID param) { while(1) { DWORD dwRet = WaitForSingleObject((HANDLE)param, 1000); if (dwRet == WAIT_TIMEOUT) { cout << "timeout\n"; }else{ cout << "get mutex! 6000ms mattari! \n"; Sleep(6000); ReleaseMutex((HANDLE)param); } } } int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; // MFC の初期化および初期化失敗時のエラーの出力 if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { // TODO: 必要に応じてエラー コードを変更してください。 cerr << _T("Fatal Error: MFC initialization failed") << endl; nRetCode = 1; } else { // TODO: この位置にアプリケーションの動作を記述してください。 CString strHello; strHello.LoadString(IDS_HELLO); cout << (LPCTSTR)strHello << endl; HANDLE mutex = CreateMutex(0, FALSE, NULL); _beginthread(threadA, 0, (void*)mutex); _beginthread(threadB, 0, (void*)mutex); } while(1); return nRetCode; }
VBで構造体に値を詰め込んでVC++で記述された別プロセスのソフトにデータ投げ投げ。
Private Sub Command3_Click() Dim p As DENBUNHDR_TBL Dim q As YMDHMS_TBL Dim r(36) As Byte Dim m As String Dim i As Integer With p .datasize = 8 .syubetu = 22 End With With q .year = &H2003 .mon = 3 .day = 11 .hour = 12 .min = 34 .sec = 56 End With MsgBox Hex(VarPtr(r(1))) Call CopyMemory(r(1), p, 28) Call CopyMemory(r(29), q, 8) For i = 1 To 36 m = m + Right("00" + Hex(r(i)), 2) Next MsgBox m Call PostDenbun(VarPtr(r(1)), 8) End Sub
VarPtr(Visual Basicの限界を広げるサブクラス化の手法)はまあ常道だけど、配列の先頭アドレス取るのにハマったり。フツー参照渡しなのでr(1)と先頭要素書けばいいのね。同様にr(29)と書けば28番目の要素のアドレス(コノ場合はDENBUNHDR_TBLの直後)を表現したり。DENBUNHDR_TBLの後ろにYMDHMS_TBLを貼り付けてメモリ上にまとめてからPostDenbunサブルーチンでWM_COPYDATA~
function mail_Q_decode($str) { $i = 0; $l = strlen($str); while ($i < $l) { while ($str[$i] != '=' && $i < $l) { $r .= $str[$i++]; } if ($i == $l) break; while ($str[$i] == '=' && $i < $l) { $r .= chr($str[$i+1]*16+$str[$i+2]); $i += 3; } if ($i >= $l) break; } return $r; } function mail_decode_BQ($s, $tocharset) { while ($s) { if (!is_string($idx = strpos($s, "=?")) || $idx) { $sf = substr($s, 0, $idx); $sr = substr($s, $idx +2); if (!is_string($idy = strpos($sr, "?=")) || $idy) { $sri = substr($sr, 0, $idy); $srj = substr($sr, $idy +2); // echo "sri=".$sri."\n"; // echo "srj=".$srj."\n"; $funcname = "stripslashes"; if (eregi('^Shift_jis(.*)\?([BQ])\?(.*)$', $sri, $bs)) { $fromcode = "SJIS"; }else if (eregi('^iso-2022-jp(.*)\?([BQ])\?(.*)$', $sri, $bs)) { $fromcode = "JIS"; }else if (eregi('^iso-8859-(.*)\?([BQ])\?(.*)$', $sri, $bs)) { $fromcode = "pass"; } if ($bs[2] == 'B') $funcname = "base64_decode"; if ($bs[2] == 'Q') $funcname = "mail_Q_decode"; $ts = i18n_convert($funcname($bs[3]), $tocharset, $fromcode); }else{ // krudge; $ts = $sri; } $r .= ($sf.$ts); $s = $srj; }else{ $r .= $s; break; } } return $r; } function mail_contenttype(&$p, &$types) { while ((list($k, $v) = each($p)) && isset($v[0]) && $v[0]) { // echo "d[".$k."]".$v."\n"; if ($v[0] == 'c' || $v[0] == 'C') { if (eregi("^CONTENT-TYPE:(.*)", $v, $r)) { $rf = ltrim($r[1]); while((list($k, $v) = each($p)) && isset($v[0]) && (ereg("[ \011]", $v[0 ]))){ // echo "C[".$k."]".$v."\n"; $rf .= ("\015\012".$v); } if (ereg("(^[-a-z/A-Z0-9]+)", $rf, $tp)) { $types = $tp[1]; } $rf = substr($rf, strpos($rf, ';', strlen($types)) + 1); if (!isset($v[0]) || !$v[0]) { // echo "f[".$k."]".$v."\n"; return $rf; } } } } // echo "e[".$k."]".$v."\n"; return $rf; } function mail_parse_attr($rf) { $ATTR = array(); if (!$rf) { return; } $i = 0; while( $i < strlen($rf)) { while (ereg("[ \011\015\012]", $rf[$i])) $i++; if ($i >= strlen($rf)) break; $pa = ""; while (ereg("[-a-zA-Z0-9+]", $rf[$i])) { $pa .= $rf[$i++]; if ($i >= strlen($rf)) break 2; } $pa = strtoupper($pa); $ATTR[$pa] = ""; while (ereg("[ \011\015\012]", $rf[$i])) $i++; if ($i >= strlen($rf)) break; if ($rf[$i] == '=') $i++; else if ($rf[$i] == ';') { $i++; continue;} else { break; } $va = ""; while (ereg("[ \011\015\012]", $rf[$i])) $i++; if ($rf[$i] == chr(042)) { $i++; while ($rf[$i] != chr(042)) { while ($rf[$i] == chr(033) && $rf[$i+1] == '$') { $va .= "\033$"; $i += 2; if ($i >= strlen($rf)) break 2; while (("" != $rf[$i]) && $rf[$i] != chr(033)) { $va .= $rf[$i]; $i++; } if ($i >= strlen($rf)) break 2; if ($rf[$i] == chr(033) && $rf[$i+1] == chr(050)) { $va .= "\033\050"; $i += 2; } if ($i >= strlen($rf)) break 2; } if ($rf[$i] == '\\') { $i++; $va .= $rf[$i]; $i++; } if ($i >= strlen($rf)) break; if ($rf[$i] == chr(015)) { while (ereg("[ \011\015\012]", $rf[$i])) $i++; } if ($i >= strlen($rf)) break; if ($rf[$i] != chr(042)) { $va .= $rf[$i]; $i++; } if ($i >= strlen($rf)) break; } $ATTR[$pa] = $va; // echo "[".$va."]\n"; $i++; } } return $ATTR; } function mail_parse_mime(&$p, $boundary, &$at, $lv) { $lc = 0; while (list($k, $v) = each($p)) { // echo "[".$k."]".$v."\n"; if ("--".$boundary == $v) { $lc++; // echo "FIND=[".$k."]".$v."\n"; $rf = mail_contenttype($p, $type); // echo "NEWRF=".$rf."\n"; $boundary2 = ""; if ($rf[0]) { $attrs = mail_parse_attr($rf); reset($attrs); $at[substr($lv.".".$lc,1)] = $attrs; if (isset($attrs['BOUNDARY'])) { $boundary2 = $attrs['BOUNDARY']; } } // echo "TYPE2=".$type."\n"; if ($boundary2) { // echo "BOUNDARY2=".$boundary2."\n"; mail_parse_mime($p, $boundary2, $at, $lv.".".$lc ); }else{ if (!strcasecmp("message/rfc822", $type)) { // echo "---\n"; $rf = mail_contenttype($p, $type); $boundary3 = ""; if ($rf[0]) { $attrs = mail_parse_attr($rf); reset($attrs); $at[substr($lv.".".$lc.".1",1)] = $attrs; if (isset($attrs['BOUNDARY'])) { $boundary3 = $attrs['BOUNDARY']; } } if ($boundary3) { // echo "RFC822BD=".$boundary3."\n"; mail_parse_mime($p, $boundary3, $at, $lv.".".$lc); } // }else{ // $at[substr($lv.".".$lc."1",1)] = array(); } } } if ("--".$boundary."--" == $v) { // echo "EXIT=[".$k."]\n"; return; } } } function mail_fullstructurefetch($mbox, $num, $flags = FT_UID) { $attr = array(); $p = explode("\015\012", imap_fetchbody($mbox, $num, 0, $flags)); $rf = mail_contenttype($p, $type); $attrs = mail_parse_attr($rf); $boundary = $attrs['BOUNDARY']; $p = explode("\015\012", imap_body($mbox, $num, $flags)); mail_parse_mime($p, $boundary, $attr, ""); $attr[0] = ""; return $attr; }
いろいろ縁あって水曜の夕方からJava開発コースの講座を毎週受け持つことに…
で、前の講師の方の教え方とか結果としての理解度とか計るためにアンケート実施。目立つところなど…
1.Java言語の予約語について知っているものに○をつけてください
結果)interfaceに ○がついていないのは少しツライかも。ifに○がついていないのはかなり悲しいかも…extendsに ○付いてる人が全体の1/5しかないのはどういうこと?…ぬぬ
2.プログラミング言語/開発環境/OSについて、次の中から知っている(聞いたことはある)キーワードについて何でも良いので知るところを書いてください。
結果)eclipseとIISが無回答というのはあまあ、何となくそうかな…とか。JBuilderには反応アリ…ぬぬ
事前に渡されていた講義用テキストと受講生に渡されていたものが違っていたり、前もって準備していたネタが使えなかったりといろいろ混乱はありましたが、とりあえず責任持ってJava使いに仕上げる予定…ぬぬ
おまけ)今日のBGM
AN EVENING WITH KIMIKO ITOH