Recent Entries
Archives
Search


Links
Powered by
Movable Type 2.64

2010年03月15日

自己書換コードとか

先々必要になるのがわかってるので、自己書換コードとか書いてみたりヽ(´ー`)ノ
あるサブルーチンを引数付きで呼び出すコードを関数へのポインタ1個だけで管理
OpenCOBOL中でサブルーチン呼び出してる箇所で色々とやるために必要だっ
たり、同様に他言語からCで書いたコード呼び出すときに色々便利なので。

#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);
}

2007年09月05日

終了しないプログラム

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;

(;´Д`)すんません

2006年08月14日

お盆の過ごし方(XML地獄編)

#!/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すると中身が・・・

2005年07月14日

またアクセス権限の問題を解決

先日からどうも PCの動作がおかしい件について(;´Д`)調査。PSP8がPower Users権限では起動しなくなって、どのDLLがとかどのEXEが実行できないのか調べていたのですが・・・

DLL ファイルで "アクセス許可は拒否されました" エラーを監視する
ああ便利ヽ(´ー`)ノ
Filemon for Windows つかってサクサクと調査、サクサク解決。
20050714psp8error.png

ということで、ATL.DLLを使えなくなっていたようなので、また権限変更して 解決(たぶん)。


2005年07月13日

実行権限とPower Usersと

どうも最近PCの調子が悪いな~動作しないソフトが増えたな~(;´Д`)ということで原因調査
0xc0000022エラーがでていたので、実行権限関連と思ったのですが、いったいどのDLL、EXEが原因か不明でした・・・が見つけましたヽ(´ー`)ノ
bash-2.05b$ cacls MFC42.DLL
C:\WINNT\system32\MFC42.DLL MAINMACH\Administrator:F
                            NT AUTHORITY\SYSTEM:F
                            BUILTIN\Administrators:F
Administratorでしか MFC42.DLL使えない状態ですね。UsersとPower Usersにも必要に応じて実行権限ついてないとアカンのですが(普段はうちではAdministrator権限ではPC使ってないのです)
世の中 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
とりあえず、起動できなかったソフトの問題はほとんど解消しましたヽ(´ー`)ノ

2005年05月28日

snmpでメモリ残量取得

適当に書いてみる(要:snmpget) ヽ(´ー`)ノfor mrtg
#!/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";
13:13 | Comments (1)

2005年04月19日

perlでXMLでDOMでよく忘れる

perlでXMLでDOMでほげりヽ(´ー`)ノXML::DOM
よく忘れるので貼っておく
#!/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";
}
18:05 | Comments (0)

2004年10月04日

ココ最近のPHPのコードの書き方(自分の場合)

ココ最近パターン化してしまった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ファイルの中で実施。
トカ。いつかまたスタイルが変わったかな?というときに思い出して読めるように
メモヽ(´ー`)ノ

2004年03月10日

Win32関連でオサライ

Win32関連でオサライ(;´Д`) そして、意図したとおりに動作した
// 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;
}

2003年12月21日

VBでポインタ

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~

2003年08月28日

PHPでimapで添付ファイル

ちょっとMSNメッセンジャー周辺で話題にでたので… PHPでというか、uw-imapdでimapの添付メール(attachment)取得を行った場合に、生JISで添付ファイル名がつけられているものを正しく取り扱えない場合があります。というか、取り扱えません。uw-imapd自身が添付ファイル名部分のパースに失敗するためです。
[PHP-jp 12088]
#ほかの imapdの実装それぞれでどうだかは不明 で、解決策としてはimap_fetchbodyで全体分捕ってきて自前で解析するしかないということになります。最近のPEARライブラリには入ってるかもしれませんが…
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;
}

2003年08月27日

Java講座とか(1)

いろいろ縁あって水曜の夕方からJava開発コースの講座を毎週受け持つことに…
で、前の講師の方の教え方とか結果としての理解度とか計るためにアンケート実施。目立つところなど…
1.Java言語の予約語について知っているものに○をつけてください
結果)interfaceに ○がついていないのは少しツライかも。ifに○がついていないのはかなり悲しいかも…extendsに ○付いてる人が全体の1/5しかないのはどういうこと?…ぬぬ
2.プログラミング言語/開発環境/OSについて、次の中から知っている(聞いたことはある)キーワードについて何でも良いので知るところを書いてください。
結果)eclipseとIISが無回答というのはあまあ、何となくそうかな…とか。JBuilderには反応アリ…ぬぬ
事前に渡されていた講義用テキストと受講生に渡されていたものが違っていたり、前もって準備していたネタが使えなかったりといろいろ混乱はありましたが、とりあえず責任持ってJava使いに仕上げる予定…ぬぬ

おまけ)今日のBGM
Sh530014.jpgAN EVENING WITH KIMIKO ITOH