エントリー

カテゴリー「プログラム」の検索結果は以下のとおりです。

XAMPPでPythonを動作させるメモ

Pythonをインストールした際のメモ。

参考サイト

メモ

  • ざっと見たところ、まだバージョン3は広く使われていないように思ったので、今回はバージョン2(2.7.6)をインストールした。
  • 今回のインストール先はWindows7の64ビット版だけど、Pythonの64ビット版は一般的に使われるモジュールが64ビットに対応していなかったり…があるらしいので、32ビット版をインストールした。
  • CGIプログラムとして実行するために、httpd.confAddHandler.py を追加した。

データベースを使う

PythonからMySQLを使ってみる。MySQLに接続するためのドライバはたくさんあるけど、定番(のように思う)の MySQL for Python を使ってみる。

MySQL-python-1.2.4b4.win32-py2.7.exe をダウンロードして実行するだけでインストールされる。以下はMySQLへの接続例。

#!/python/python
# coding: UTF-8

import MySQLdb

con = MySQLdb.connect(host='127.0.0.1', db='dbname', user='username', passwd='password', charset='utf8')
cur = con.cursor(MySQLdb.cursors.DictCursor)
cur.execute('SET NAMES utf8')

print 'Content-Type: text/html'
print ''

print '<!DOCTYPE html>'
print '<html>'
print '<head>'
print '<meta charset="utf-8" />'
print '<title>MySQL</title>'
print '</head>'
print '<body>'

cur.execute('SELECT id, name FROM members LIMIT 10')

result = cur.fetchall()

for row in result:
  print '<hr />'
  print 'id=' + str(row['id'])
  print 'name=' + str(row['name'].encode('UTF-8'))

cur.close()
con.close()

print '</body>'
print '</html>'
  • localhost で接続しようとすると Can't connect to MySQL server on 'localhost' のエラーになった。IPアドレスなら接続できた。
  • MySQLdb.cursors.DictCursor を指定することにより、ディクショナリ形式で値を取得できる。

フレームワークを使う

1ファイルで構成されている軽量フレームワーク、Bottleを使ってみる。

Bottleをダウンロードすると含まれている bottle.py を適当な場所にコピーする。

同じ場所に hello.py を作成し、以下のコードを記述する。

from bottle import route, run

@route('/hello')
def hello():
  return 'Hello World!'

run(host='localhost', port=8080, debug=True)

コマンドプロンプトから python hello.py と入力すると、8080 でサーバーが起動する。ブラウザソフトから http://localhost:8080/hello にアクセスし、Hello World! と表示されれば成功。

CGIとして動作させる場合、以下のように記述する。

#!/python/python
# coding: UTF-8

import bottle
from bottle import route, run

@route('/hello')
def hello():
  return 'Hello World!'

run(server=bottle.CGIServer)

ブラウザソフトから hello.py/hello にアクセスし、Hello World! と表示されれば成功。この方法なら、ロリポサーバーなどでも手軽に使える予感。

MySQLを扱う場合、Bottle-MySQLプラグインを使用する。(プラグイン内部では、前述の MySQL for Python が呼び出されている。)

bottle.py と同じ場所に bottle_mysql.py を配置すれば、以下のコードでMySQLに接続できる。

#!/python/python
# coding: UTF-8

import bottle
import bottle_mysql

from bottle import route, run

mysql_plugin = bottle_mysql.Plugin(dbhost='127.0.0.1', dbuser='root', dbpass='1234', dbname='test')
bottle.install(mysql_plugin)

@route('/')
def show(db):
  db.execute('SELECT id, name FROM members LIMIT 10')
  result = db.fetchall()
  view = ''
  for row in result:
    view += '<hr />'
    view += 'id=' + str(row['id'])
    view += 'name=' + str(row['name'].encode('UTF-8'))
  return view

run(server=bottle.CGIServer)

PostgreSQLメモ

テーブルを扱うためのメモ。

SQLでテーブル一覧を表示

SELECT
  pg_class.relname AS relname
FROM
  pg_class INNER JOIN pg_namespace
ON
  pg_class.relnamespace = pg_namespace.oid
WHERE
  pg_class.relkind = 'r' AND pg_namespace.nspname = 'public';

SQLでテーブル仕様を表示

SELECT
  column_name, data_type, is_nullable
FROM
  information_schema.columns
WHERE
  table_schema = 'public' AND table_name = 'テーブル名';

SQLでテーブル作成コードを表示

SELECT
  CASE
    WHEN tb.relkind = 'r' THEN(
      SELECT 'CREATE TABLE "テーブル名"(' || chr(10) || array_to_string(
        ARRAY(
          SELECT ' "' || "Column" || '" '|| "Type" || "Modifiers" || "Index" FROM(
            /* Column */
            SELECT
              at.attnum, ns.nspname AS schema, tb.relname AS table, at.attname AS "Column",
              /* Type */
              CASE
                WHEN at.attinhcount <> 0 OR at.attisdropped THEN null
                ELSE
                  CASE
                    WHEN tp.typname = 'int2'   THEN 'SMALLINT'
                    WHEN tp.typname = 'int4'   THEN 'INTEGER'
                    WHEN tp.typname = 'int8'   THEN 'BIGINT'
                    WHEN tp.typname = 'float4' THEN 'REAL'
                    WHEN tp.typname = 'float8' THEN 'DOUBLE PRECISION'
                    WHEN tp.typname = 'bpchar' THEN 'CHAR'
                    ELSE UPPER(tp.typname)
                  END ||
                  CASE
                    WHEN at.attlen >= 0             THEN ''
                    WHEN at.atttypmod < 4           THEN ''
                    WHEN tp.typname <> 'numeric'    THEN '(' || at.atttypmod - 4 || ')'
                    WHEN (at.atttypmod & 65535) = 4 THEN '(' || (at.atttypmod >> 16) || ')'
                    ELSE '(' || (at.atttypmod >> 16) || ',' || (at.atttypmod & 65535) - 4 || ')'
                  END
              END AS "Type",
              /* Modifiers */
              CASE
                WHEN at.attnotnull THEN ' NOT NULL'
                ELSE ''
              END ||
              CASE
                WHEN ad.adbin IS NULL THEN ''
                ELSE ' DEFAULT ' || UPPER(pg_get_expr(ad.adbin, tb.oid))
              END AS "Modifiers",
              /* one-column Index */
              CASE
                WHEN ix.indexrelid IS NULL THEN ''
                ELSE
                  CASE
                    WHEN ix.indisprimary THEN ' PRIMARY KEY'
                    WHEN ix.indisunique  THEN ' UNIQUE'
                    ELSE ''
                  END
              END AS "Index"
            FROM
              pg_attribute at
              INNER JOIN pg_type tp ON at.atttypid = tp.oid
              LEFT OUTER JOIN pg_attrdef ad ON ad.adrelid = tb.oid AND ad.adnum = at.attnum
              LEFT OUTER JOIN pg_index ix ON ix.indrelid = tb.oid AND ix.indnatts = 1 AND at.attnum = ix.indkey[0]
              LEFT OUTER JOIN pg_class ic ON ix.indexrelid = ic.oid
              LEFT OUTER JOIN pg_am    am ON ic.relam = am.oid
            WHERE
              tb.oid = at.attrelid AND at.attnum >= 1
          ) AS columns ORDER BY attnum
        ), ',' || chr(10)
      )
      ||
      (
        SELECT
          CASE
            WHEN COUNT(*) = 0 THEN ''
            ELSE ',' || chr(10) || ' ' || array_to_string(
              ARRAY(
                SELECT
                  CASE
                    WHEN indisprimary THEN 'PRIMARY KEY '
                    ELSE 'UNIQUE '
                  END
                  || substr(indexdef, strpos(indexdef, '('), strpos(indexdef, ')') - strpos(indexdef, '(') + 1) || ' /* '||index||' */'
                FROM
                (
                  SELECT
                    ic.relname AS index, ns.nspname AS schema, tb.relname AS table --, ia.attname, ia.attnum
                    , ix.indnatts, ix.indisunique, ix.indisprimary, am.amname
                    , ix.indkey
                    , pg_get_indexdef(ic.oid) AS indexdef
                  FROM
                    pg_index ix
                    INNER JOIN pg_class ic ON ix.indexrelid = ic.oid
                    INNER JOIN pg_am    am ON ic.relam = am.oid
                  WHERE
                    ix.indrelid = tb.oid AND ix.indnatts > 1 AND (ix.indisprimary OR ix.indisunique)
                ) AS def ORDER BY indisprimary desc, index
              ), ','||chr(10)
            )
          END
        FROM
          pg_index ix
        WHERE
          ix.indrelid = tb.oid AND ix.indnatts > 1 AND (ix.indisprimary OR ix.indisunique)
      ) || chr(10) || ')'
    )
    END
FROM
  pg_class tb INNER JOIN pg_namespace ns ON tb.relnamespace = ns.oid
WHERE
  tb.relname = 'テーブル名'

コマンドラインでデータベースの内容をエクスポート

pg_dump -U postgres -d データベース名 > C:\~エクスポート先~\任意のファイル名.sql

コマンドラインでデータベースの内容をインポート

psql -U postgres -d データベース名 -f C:\~インポート元~\インポートするファイル

PHPでデータベースの内容をエクスポート

putenv('PGHOST=ホスト名');
putenv('PGPORT=ポート番号');
putenv('PGUSER=ユーザー名');
putenv('PGPASSWORD=パスワード');
putenv('PGDATABASE=データベース名');
print('<pre>');
passthru('"C:\\postgresql\\bin\\pg_dump.exe" -i --inserts');
print('</pre>');
exit;

FlashCCでiPhoneアプリを作成した時のメモ

Androidアプリは普通に書き出してインストールして簡単に完了したけど、iPhoneアプリはとても大変だったので参考にしたページをメモ。

FlashではじめてiPhoneアプリを作りました
まったく何も解らないとき読んで、Flash + Air でのiPhoneアプリ開発の概要をつかむことができた。
iPhoneアプリの開発方法 for Flash Professional CS5
FlashCCで作ったけど、今でも十分参考になった。ただ、iOS Devloper Program の構成がところどころ変わっていて戸惑った。
iOS Developer Programに登録しようと思ったらググッて出てくる情報は色々古かったので手順を書きとめる【2012年12月版】
iOS Developer Program への登録は難関なので心強かった。
日本のApple StoreでiOS Developer Programを購入しActivateするまでの全スクリーンショット
普通に進めてもアクティベートできなかったけど、その点が書かれていて参考になった。ただ、今はエラー画面に「We have received your purchase information and will email you shortly to verify additional details.」と書かれていて、しばらく待てばAppleからメールが送られてきた。アクティベートできなかったのは、「漢字」と指定された欄に漢字を入力したからだった。

FlashCCでデスクトップガジェットを作成するメモ

ActionScript3 + Air で、Windowsのデスクトップに置いておけるガジェットを作成するメモ。以下のようなガジェットを作成できます。

20130929.png

基本的には普通のFlashと同じ手順で作れるけど、

  • タスクバーに表示されない、不定形ウインドウで表示する
  • ステータスバーが無いので、アプリ自体をドラッグで移動&ダブルクリックで終了する
  • OSの起動時、ガジェットも自動的に起動する
  • 表示位置は前回終了時を記憶する

のような仕様にしようとしたら、それなりにコードを書く必要があったのでメモ。

普通にウインドウを表示するとタスクバーに表示されるので、その対策にウインドウ非表示で起動して、ActionScriptからNativeWindowクラスで新しくウインドウを開く。Main というクラスでムービークリップを作成して、それをActionScriptで新しいウインドウに配置する。…としています。

スタートアップへの登録は専用の命令で可能。表示位置の記憶はSharedObjectを使用。

具体的には、「ファイル → AIR 3.6 for Desktop 設定 → 詳細 → 初期ウインドウ設定」で「最大化を有効にする」「最小化を有効にする」「リサイズを有効にする」「起動後に表示する」のチェックを外した上で、以下のActionScriptでウインドウを表示する。

//アプリのデータを復元
var sharedObject:SharedObject = SharedObject.getLocal('App');

var appX:int = 100;
var appY:int = 100;
if (sharedObject.data.x) {
  appX = sharedObject.data.x;
}
if (sharedObject.data.y) {
  appY = sharedObject.data.y;
}

//スタートアップに登録
if (sharedObject.data.startup != true) {
  NativeApplication.nativeApplication.startAtLogin = true;
}

//ウインドウを開く
var initOptions:NativeWindowInitOptions = new NativeWindowInitOptions();
initOptions.transparent  = true;
initOptions.systemChrome = NativeWindowSystemChrome.NONE;
initOptions.type         = NativeWindowType.LIGHTWEIGHT;

var mainWindow:NativeWindow = new NativeWindow(initOptions);
mainWindow.stage.scaleMode   = StageScaleMode.NO_SCALE;
mainWindow.stage.align       = StageAlign.TOP_LEFT;
mainWindow.stage.stageWidth  = this.stage.stageWidth;
mainWindow.stage.stageHeight = this.stage.stageHeight;
mainWindow.x                 = appX;
mainWindow.y                 = appY;

mainWindow.activate();

//メインのMCを配置
var m:Main = new Main();
m.x = Math.floor(m.width / 2);
m.y = Math.floor(m.height / 2);

mainWindow.stage.addChild(m);

//移動処理
m.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownToMove);
function mouseDownToMove(event:Event):void
{
  mainWindow.startMove();
}

//終了処理
m.doubleClickEnabled = true;
m.addEventListener(MouseEvent.DOUBLE_CLICK, doubleClickToExit);
function doubleClickToExit(event:MouseEvent):void
{
  closeWindow();
}
mainWindow.addEventListener(Event.CLOSING, closingToExit);
function closingToExit(event:Event):void
{
  closeWindow();
}
function closeWindow():void
{
  //アプリのデータを記録
  var sharedObject:SharedObject = SharedObject.getLocal('App');
  sharedObject.data.startup = true;
  sharedObject.data.x       = mainWindow.x;
  sharedObject.data.y       = mainWindow.y;
  sharedObject.flush();

  //終了
  NativeApplication.nativeApplication.exit();
}

this.stop();

Mainムービークリップの内容は、基本的には普通のFlashと同じ要領で作れます。

まだまだ勉強中なので、ツッコミ歓迎…。_(:3 」∠ )_

WindowsのXAMPPにPostgreSQLを導入するメモ

PostgreSQLを導入してみたので、忘れないうちにメモ。

主な参考サイト

トラブル

PHPからPostgreSQLに接続する際、以下のようなエラーになった。

Call to undefined function pg_connect()

php.iniphp_pdo_pgsql.dllphp_pgsql.dll を有効にする必要がある。それでもダメなら、Windowsの環境変数にPHPへのパス(C:\xampp\php など)を書き込めば回避できるみたい。

コマンドプロンプトからの操作例

#ユーザー名を指定してPostgreSQLにログイン
psql -U postgres

#ユーザー名とデータベースを指定してPostgreSQLにログイン
psql -U postgres -d test

#データベース作成
CREATE DATABASE test;

#データベース一覧
¥l

#データベース選択
¥c test

#テーブル作成
CREATE TABLE sample1(
  id   integer,
  name text
);

#テーブル一覧
\dt

#テーブル定義確認
\d sample1

#SQLを発行
INSERT INTO sample1 VALUES(2, 'test2');
SELECT * FROM sample1;

PHPからの、pg_connect()での接続例

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>テスト</title>
</head>
<body>
<?php

$con = pg_connect('host=localhost dbname=test user=postgres password=1234');
if (!$con) {
  exit('データベースに接続できませんでした。');
}

$result = pg_query($con, 'SELECT * FROM sample1');
while ($data = pg_fetch_array($result)) {
  echo '<p>' . $data['id'] . ':' . $data['name'] . "</p>\n";
}

$con = pg_close($con);
if (!$con) {
  exit('データベースとの接続を閉じられませんでした。');
}

?>
</body>
</html>

PHPからの、PDOでの接続例

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>テスト</title>
</head>
<body>
<?php

try {
  $pdo = new PDO('pgsql:dbname=test;host=localhost', 'postgres', '1234');
} catch (PDOException $e) {
  exit('データベースに接続できませんでした。' . $e->getMessage());
}

$stmt = $pdo->query('SELECT * FROM sample1');
if (!$stmt) {
  $info = $pdo->errorInfo();

  exit($info[2]);
}

while ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
  echo '<p>' . $data['id'] . ':' . $data['name'] . "</p>\n";
}

$pdo = null;

?>
</body>
</html>

フレームワーク

オレオレフレームワークを作る機会があったので置いておきます。

本格的なフレームワークを導入するほどの規模ではないが、それなりに多機能なのである程度の処理は任せたい。今更PHP4に対応させる必要があるが、PHP5でも動作させる必要がある。本番環境のテストが公開直前までできないので、ひととおり内部を見渡せる軽量なフレームワークが好ましい。ついでに、簡易なデータベース管理ツールも欲しい。

…という場合に役に立つかもしれません。というか、そんなことがあったために自作することにした。_(:3 」∠ )_

PHPでオブジェクトを配列に変換

ググると色々出てきたものの、「オブジェクトの中に配列があって、さらにその中にオブジェクトがあって、さらにその中に配列がある」のような場合に正しく変換できなかったり、privateな値もまとめて取得したい場合に対応できなかったり…ばかりだったので書いてみた。

privateな値に直接アクセスできるようにするのは邪道な気もするけど、どうしても必要な時があったりなかったり。

function object2array($data)
{
  if (is_object($data)) {
    $data = (array)$data;
  }

  if (is_array($data)) {
    foreach ($data as $key => $value) {
      $key1 = (string)$key;
      $key2 = preg_replace('/\W/', ':', $key1);

      if (is_object($value) or is_array($value)) {
        $data[$key2] = object2array($value);
      } else {
        $data[$key2] = (string)$value;
      }

      if ($key1 != $key2) {
        unset($data[$key1]);
      }
    }
  }

  return $data;
}

使う時は

$array = object2array($object);

のように呼び出します。まだまだ調整の余地がありそうですが、ひとまずこれで。

PayPal管理画面操作メモ

毎回探すのに手間取るのでメモ。「個人設定」にマウスオーバーでは一部のメニューしか表示されないので注意。

設置済みボタンの確認

「ログイン」→「マイアカウント」→「個人設定」をクリック→「販売ツール」→「オンライン販売」→「PayPalボタン」で確認できる。

支払いデータ転送(PDT)の設定

「ログイン」→「マイアカウント」→「個人設定」をクリック→「販売ツール」→「オンライン販売」→「ウェブサイトの設定」で「支払いデータ転送(オプション)」を「オン」にする。

「ウェブ ペイメントの自動復帰」を「オン」にし、「復帰 URL」にPDTを受け取るプログラムのURLを設定する。

即時支払い通知(IPN)の設定

「ログイン」→「マイアカウント」→「個人設定」をクリック→「販売ツール」→「支払いとリスク管理」→「即時支払い通知」

PHPで可逆暗号化

PHPでは mcrypt_generic() を使えば可逆暗号化ができ、mdecrypt_generic() で復号化できます。…が、使い方がちょっとややこしかったのでメモ。関連する関数を色々と呼び出す必要があります。

具体的には、以下のコードで暗号化ができます。

<?php

//暗号化するデータ
$plain_text = 'これは秘密のメッセージです。';

//暗号化&復号化キー
$key = md5('KQAHGOEUXD');

//暗号化モジュール使用開始
$td  = mcrypt_module_open('des', '', 'ecb', '');
$key = substr($key, 0, mcrypt_enc_get_key_size($td));
$iv  = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);

//暗号化モジュール初期化
if (mcrypt_generic_init($td, $key, $iv) < 0) {
  exit('error.');
}

//データを暗号化
$crypt_text = base64_encode(mcrypt_generic($td, $plain_text));

//暗号化モジュール使用終了
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

//結果を表示
echo "<!DOCTYPE html>\n";
echo "<html lang=\"ja\">\n";
echo "<head>\n";
echo "<meta charset=\"utf-8\" />\n";
echo "<title>暗号化テスト</title>\n";
echo "</head>\n";
echo "<body>\n";
echo "<h1>暗号化テスト</h1>\n";
echo "<dl>\n";
echo "<dt>暗号化前</dt><dd>" . $plain_text . "</dd>";
echo "<dt>暗号化後</dt><dd>" . $crypt_text . "</dd>";
echo "</dl>\n";
echo "</body>\n";
echo "</html>\n";

?>

この場合、これは秘密のメッセージです。 という文字が暗号化されます。KQAHGOEUXD は、暗号化と復号化に使うパスワードのようなものです。この値を知っている人だけが、このデータを復号化できます。

実行すると、以下のように暗号化前の文字と暗号化後の文字が表示されます。

暗号化テスト

暗号化前
  これは秘密のメッセージです。
暗号化後
  eVVX5OPG0Vj4L49cuq8A3KT1R2nljAIPn74vAw0d/QbYQ1CfUApMlqSpSkyDjDvi

復号化は以下のようにします。

<?php

//復号化するデータ
$crypt_text = 'eVVX5OPG0Vj4L49cuq8A3KT1R2nljAIPn74vAw0d/QbYQ1CfUApMlqSpSkyDjDvi';

//暗号化&復号化キー
$key = md5('KQAHGOEUXD');

//暗号化モジュール使用開始
$td  = mcrypt_module_open('des', '', 'ecb', '');
$key = substr($key, 0, mcrypt_enc_get_key_size($td));
$iv  = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);

//暗号化モジュール初期化
if (mcrypt_generic_init($td, $key, $iv) < 0) {
  exit('error.');
}

//データを復号化
$plain_text = mdecrypt_generic($td, base64_decode($crypt_text));

//暗号化モジュール使用終了
mcrypt_generic_deinit($td);
mcrypt_module_close($td);

//結果を表示
echo "<!DOCTYPE html>\n";
echo "<html lang=\"ja\">\n";
echo "<head>\n";
echo "<meta charset=\"utf-8\" />\n";
echo "<title>復号化テスト</title>\n";
echo "</head>\n";
echo "<body>\n";
echo "<h1>復号化テスト</h1>\n";
echo "<dl>\n";
echo "<dt>復号化前</dt><dd>" . $crypt_text . "</dd>";
echo "<dt>復号化後</dt><dd>" . $plain_text . "</dd>";
echo "</dl>\n";
echo "</body>\n";
echo "</html>\n";

?>

eVVX5OPG0Vj4L49cuq8A3KT1R2nljAIPn74vAw0d/QbYQ1CfUApMlqSpSkyDjDvi は、先のコードで暗号化した文字列です。KQAHGOEUXD は、暗号化したときと同じ値を指定します。

実行すると、以下のように表示されます。

復号化テスト

復号化前
eVVX5OPG0Vj4L49cuq8A3KT1R2nljAIPn74vAw0d/QbYQ1CfUApMlqSpSkyDjDvi
復号化後
これは秘密のメッセージです。

Perlで特定フォルダ内の全文検索

Windows7でファイル内の文字列を検索したかったのですが、インデックスを作成してみたりフォルダオプションで「ファイル名と内容を常に検索する」に設定してみたりしても、何故か全文検索になってくれませんでした。

専用の検索ツールをインストール…とも思ったけど、後々使えるかもしれないので全文検索ツールをPerlで書いてみた。

##################################################
#ファイル内検索プログラム
##################################################

use strict;

print '検索ワード:';

my $input = <STDIN>;

chop($input);

&search('./', $input);

<STDIN>;
exit;

### 全文検索
sub search {
  my($dir, $word) = @_;

  opendir(DIR, $dir);
  my @dir = sort { $a cmp $b } readdir(DIR);
  closedir(DIR);

  foreach my $file (@dir) {
    if ($file eq '.' or $file eq '..') {
      next;
    }

    my $target = "$dir$file";

    if (-d $target) {
      &search("$target/", $word);
    } else {
      my $flag = 0;

      open(FH, $target);
      while (my $line = <FH>) {
        if (index(lc($line), lc($word)) >= 0) {
          $flag = 1;
        }
      }
      close(FH);

      if ($flag) {
        print $target . "\n";
      }
    }
  }

  return;
}

search.pl とかの名前でファイルを作成して、上の内容を書いておきます。あとはダブルクリックで実行すれば、検索文字を入力できる画面になるので、文字を入力してエンターキーを押します。検索対象は、search.pl を置いたフォルダ内全てです。(PerlがインストールされたWindowsを想定。)

エラー処理が無かったり、文字コードの異なるファイルの検索を想定していなかったり…と色々問題はありますが、ちょろっと検索するくらいなら十分でした。

ただ、EmEditorがインストールされた環境なら「フォルダを右クリック → EmEditorでファイルから検索」を実行すれば全文検索ができると教えてもらったので、実は専用ソフトをインストールする必要も検索ツールを作る必要も無かったという…。_(。゚⊿ 」∠)_

ページ移動

ユーティリティ

カテゴリー

検索

エントリー検索フォーム
キーワード

過去ログ

過去ログ表示フォーム
キーワード

Feed