Author Archives: admin

PHPで Cannot use string offset as an array

結論:
文字列に対して2次元配列のようにアクセスするとなる。

実験結果

javascriptで検索エンジンの入力キーワードをハイライト表示する

http://scott.yang.id.au/code/se-hilite/ ここで開発されている、”se_hilite.js”をダウンロードしてサーバに置く。

ページに以下の記述を追加する。これだけで完了。

テストしてみるには、Hilite.debug_referrerの値を適当にいじる。よくわからない場合はgoogleで検索してURLを設定する。

ある特定のidをもつエリアだけをハイライトしたい場合は、Hilight.elementid = “myid”のようにidを指定する。

ここに置いてみた。Google検索から飛べばハイライトされるはず。

VS 2005 Expressで2008で開発できるようにして32ビットでも動くようにする

開発環境を2008にすると、新しいDLLなどを使うのでwin2kなどで動かなくなると嫌なので、しかし2005はvistaとかで上手く動かないのでどうにかしたい。

プラスCシャープでアプリを作って32ビットDLLを読み込むと64ビットで動かなくなるのでどうにかしたい。

2005CSで空のプロジェクト”MyApp”を新規作成
保存する”C:\T\MyApp”
プロジェクト”MyApp”を削除する。
2005CSを閉じる
フォルダ”MyApp”を削除する。
MyApp.slnの所に2005というフォルダをつくりこのソリューションファイルを移動する。
移動したMyApp.slnを開く。
新しいプロジェクト”MyAppLib”をつくり、C:\T\MyApp に保存する。

AssemblyInfo.csとClass1.csをどっかにコピーしてから削除する。
2005CSを閉じる
MyAppLib.csprojをソリューションファイルと同じところに移動する。
ソリューションを開き、利用不可になっているMyAppLibを削除する
既存のプロジェクトをついかで、2005\MyAppLib.csprojを追加する。
既存の項目を追加で、とってあったAssemblyInfo.csとClass1.csをC:\T\MyApp\MyAppLibの下に戻して追加する。このときcsprojの下にコピーする。slnやcsprojのあるところにはcsファイルは置かないので、csprojを直接編集する。
2005CSを閉じて、エディタでMyAppLib.csprojを開いてファイル名らしいところを、..\MyAppLib\Class1.csなどと編集する。
ソリューションを開いてちゃんとファイルが開けるか確認。
MyAppLibの参照に”System.Windows.Forms”を加える
プロジェクトMyAppLibにあたらしいフォームを追加する。
この時もcsprojの下につくるので上記のように頑張って移動する。
Class1にメイン関数MyMain()を追加する。

ソリューションに新しいプロジェクト”MyApp”を追加する。

プロジェクトMyAppのForm1を削除する。
Resources.resxとSettings.settingsを削除。
MyApp.csprojを2005に移動して、エディタで開いて、ファイル構成が同じになるように色々頑張る。
MyAppの参照にプロジェクトMyAppLibを加える。
MyAppのMain()を書き換える。

MyAppがちゃんと動くか確認。2005の下に変なファイルを作らないか確認。

次に2005を2008ファルダにコピーする。
2008\MyApp.slnをVS2008CS Expressで開いて頑張る。

32ビットで起動するためのexeをVC2005EEでつくる。
VC2005EEで新しいフォームアプリMyApp32をつくり、フォームやアイコンを削除して、参照にMyAppLib.dllを加えて、main()を書き換える。

これでMyAppLibが32bitDLLを使っていても64bitから起動できる

svnで特定のファイルやフォルダを無視する

1,特定のファイルを無視する
ファイル名の拡張子がbmpのファイルを無視する場合。
ここではmyprojの下にあるbmpファイルを無視する。

以下を追加

2,特定のフォルダを無視する
logフォルダがあり、このフォルダはco時、空のフォルダを作成して欲しいけど中のすべてのファイルを無視する場合。

以下を追加

確認するにはフォルダに移動して、以下を実行

C#のWeakReference

C#の参照はオブジェクトを保持している変数がある限り、ガーベッジコレクトされることはありません。こういう参照は強い参照と呼ばれます。WeakReferenceの参照はそれを保持していても、他の強い参照がない限りガーベッジコレクトされます。

WeakReferenceにはShortとLongがありますが、ここではShortのみ考えます。

アプリケーションがモードレスなダイアログ(メッセージボックスのようなOKを押さない限り次に進めないものをモーダルダイアログといい、そうでないのをモードレスといいます)をいくつも作り、それを配列に格納したいとします。普通の配列やコレクションを使うと、参照は強い参照になるので、このダイアログが閉じられても参照を保持し続けガーベッジコレクトされることはありません。これをWeakReferenceの配列として持てば閉じられたダイアログはガーベッジコレクトされ、メモリの節約になるかもしれません。

まずアプリケーションのメインフォームのメンバーにWeakReferenceのListを加えます。

アプリケーションがモードレスダイアログをつくって、このリストにWeakReferenceを追加します。

WeakReferenceのコンストラクタに渡したオブジェクトは他の強い参照がなくなればガーベッジコレクトされます。

Listから列挙

WeakReferenceのTargetがすでにガーベッジコレクトされている場合はnullが返ります。ただしオブジェクトがガーベッジコレクトされるかは定かではありませんのでタイミングには注意が必要と思われます。それと、ガーベッジコレクトされてもWeakReferenceオブジェクト自体は消えませんので上記のようなやり方でずっとやると、Listがどんどん大きくなっていってしまいます。

Windowsコマンドラインでの環境変数

1、環境変数の表示
setコマンドで全部表示
set envnameでenvnameを含む環境変数を表示
echo %envname%でenvnameを表示

環境変数PATHはpathコマンドでも表示できる。

2、環境変数を変更または作成

環境変数はカレントプロセスとこのプロセスから起動した子プロセスに適用される。

topコマンドの使い方

topコマンドの画面構成は上から順にサマリー、コマンド・メッセージ、ヘッダー、タスクエリアに分かれる。

1,サマリー

最初の行

最初の行はuptimeコマンドの出力と同じであると思われる。

左から順に、現在時刻 稼働時刻 ログインしている人数 過去1分、5分、15分の平均負荷

2行目

全部で98個のプロセス、1個動いている、97個寝ている、0個止まっている、0個ゾンビ
sleepingは、割り込みやイベントを待っている状態のことだと思われる。
stoppedは、Ctrl+Zやデバッガなどで外部から停止させられたプロセスと思われる。
zombieはプロセスは終了して戻り値などを親に回収してもらうのを待っているプロセス。

3行目

0.0%ユーザーCPU時間、0.0%システムCPU時間、0.0%ナイスCPU時間、99.7%アイドルCPU時間、0.0%IO待ちCPU時間、0.0%ハードIRQ時間、0.0%ソフト割り込み時間、0.0%盗まれ時間
ユーザCPU時間はniceコマンドを使っていないこのユーザのプロセスのCPU時間
システムCPU時間はカーネルプロセスのCPU時間
ナイスCPU時間はniceコマンド使ったこのユーザのCPU時間
アイドルCPU時間は何もしてないCPU時間
IO待ちCPU時間はおそらくディスクの読み書きをなどを待っている時間
ハードIRQ時間はハードからの割り込みを処理した時間
ソフト割り込みCPU時間はソフトからの割り込みを処理した時間
盗まれ時間はこのマシンが仮想マシンで、ハイパーバイザから奪われた時間

4行目、5行目

省略

コマンド・メッセージ

コマンドなどが表示される行。1行

ヘッダ

PID:プロセスID、プロセスごとに付けられた番号
USER:プロセスの実効ユーザ
PR:プロセスの優先順位、低いほど高い。RTと表示されるものもあるがリアルタイムのことか?
NI:プロセスのナイス値。低いほど高い。普通に起動したものは0になる。
VIRT:使っている仮想メモリ(kb)
RES:使っている物理メモリ(kb)
%CPU:前回の画面のリフレッシュからつかったCPU時間。%
%MEM:物理メモリのうちどれだけ使っているか。%
TIME+:プロセスが開始してからのCPU時間。デフォルトでは子プロセスを含まない。

タスクエリア

実際に動いているプロセス。デフォルトでは%CPUでソートされる。


ここからインタラクティブコマンドを使った操作

1,表示されるフィールドを増やしたり減らしたりする。

‘f’を押す。画面が変わって最初の行に以下のようなアルファベットの並びが現れる。

ひとつのアルファベットがひとつのフィールドを表し、大文字のものが表示されているものを表す。切り替えるにはそのキーを押す。キーを押すと大文字小文字が切り替わる。終わったらEnterでぬける。

2,フィールドの表示される順番を変える

‘o’を押すと、上記のようなアルファベットが表示される。大文字は表示されているやつ。大文字小文字を押すとそのフィールドが右左に移動する。

その他のコマンド

役に立ちそうなもののみ。

G

1から4を入力して他のフィールドをみる。

B

太字表示になる。

uとU

ユーザ名を入力して特定のユーザだけ表示する。’u’だと実行ユーザだけ、’U’だとリアルユーザIDとか他のやつも含む。

k

killする。PIDを入力する。

r

reniceする。PIDのあとに数値を入れる。

W

現在の設定を保存する。

x

ソートしているフィールドをハイライトする。

S

子プロセスの時間も親プロセスに含める。initなどではoffがよくて、コンパイラなどではonがいい。

i

アイドルのプロセスを隠す。

<と>

ソートするフィールドの移動。

Windowsでファイル名に使えない文字

1,?とか*とかの文字

  • < (less than)
  • > (greater than)
  • : (colon)
  • ” (double quote)
  • / (forward slash)
  • \ (backslash)
  • | (vertical bar or pipe)
  • ? (question mark)
  • * (asterisk)

 

2,制御文字

文字コード0から31までの制御文字

3,デバイス名っぽい文字列

CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9
拡張子をのぞいた部分がこうなる場合もやめたほうがいいらしい。

4,ピリオドやスペースで終わる文字列

ファイルシステム的には許されるかもしれないが、シェル的にはダメらしい。

C#で文字列がファイル名として使えるかを調べるコード

MSソース

awkの練習

awkはあるテキストを一行づつ読み込んで、それを加工してテキストを出力する処理に適している。ここでは以下のようなファイル”01.txt”を考える。

このファイルを以下のようにしたい。

まず01.txtには空行が含まれるのでこれを削除したい。しかし実際には空行ではなくてスペースが一個含まれているのでその行を削除したい。

その前に基本の整理。以下のようにawkを実行すると、元のファイルがそのまま表示される。

このコマンドの意味は、01.txtから一行ずつ読み込んで、それをprintで表示するという意味になる。これは以下のように書いても同じ。

$1とか$2にすると、その行がコマンドライン引数で渡られているかのように、$1,$2に入っていく。

aが含まれる行を表示するには以下のようにする。

こうすると、printが実行されるのはaが含まれる行だけになる。aが含まれない行を表示するには以下のようにする。

なので、スペースだけが含まれる行でない行だけ表示するには以下のようになる。

^は行の最初をあらわし、$は行の最後をあらわすのでその間にスペース一個入れておけば、スペースだけ含んだ行になる。
これを実行して02.txtにする。

本当の空行も削除して、03.txtにする。

ここからは本格的にやらないといけないので、コマンドラインではなく、ファイルにプログラムを書いて実行する。
その前に基本ちしき。
以下の文

これは以下と同じ。

myawkはファイルで中身は以下

よってmyawkでうまくプログラムを書いて目的を達成したい。
まず、元のファイルは3つの部分、開始時間、終了時間、テキストに分かれるて、これを時刻の行とテキストにする。まずは時刻の行を考えて以下のようにする。

awkは変数はいきなり使うことができる。文字列の連結は文字列を並べて書くことで行う。+を使うと算数の足し算のように頑張ってしまうので駄目。
次にテキストの行を考えて以下のようにした。

$1と$2に空文字を設定すると、$0からそれらが消える。しかしそれでも先頭にスペースが入ってしまうのでsub組み込み関数でそれらを取り除いて表示する。最後に空行を表示して完成した。

最後に上記のすべてを一行でやると以下のようになる。

上記のすべては自分の目的のためだけ+awkの勉強のためなのでここに書いてあることはかなりいいかげんか冗長で汎用性のないものなので注意してください。