コントロールパネル
↓
ユーザとパスワード
↓
詳細タブ、詳細ボタン
↓
ユーザ、guest
kb2538242リピートされる
レジストリ
HKCR/Installer/Productsの下のでVC2005 Redistributableみたいなのを探して数字のキーをリネーム
PHPで Cannot use string offset as an array
結論:
文字列に対して2次元配列のようにアクセスするとなる。
実験結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
$a = "abc"; $a[0] = "x"; echo $a; // "xbc"になる。OK echo '<hr>'; $a = "abc"; $a[0] = "xyz"; echo $a; // "xbc"になる。OK echo '<hr>'; $a = "abc"; $a[1] = "xyz"; echo $a; // "axc"になる。OK echo '<hr>'; $a = "abc"; $a[10] = "xyz"; echo ($a); // "abc x"になるスペース(0x20)が入る echo '<hr>'; $a = "abc"; $b = $a[100]; echo $b; // 空になる echo '<hr>'; $a = "abc"; $b = $a['a']; echo $b; // "a"になる echo '<hr>'; $a = "abc"; $b = $a['c']; echo $b; // "a"になる echo '<hr>'; $a = "abc"; $b = $a['ab']; echo $b; // "a"になる echo '<hr>'; $a = "abc"; $a['a'] = "x"; echo $a; // "xbc"になる echo '<hr>'; $a = "abc"; $a['xyz'] = "x"; echo $a; // "xbc"になる echo '<hr>'; $a = "abc"; $a[0]['xyz'] = "x"; // ここでPHP Fatal error: Cannot use string offset as an arrayになる。 echo $a; echo '<hr>'; $a = "abc"; $a[0][0] = "b"; // ここでもPHP Fatal error: Cannot use string offset as an arrayになる。 echo $a; |
javascriptで検索エンジンの入力キーワードをハイライト表示する
http://scott.yang.id.au/code/se-hilite/ ここで開発されている、”se_hilite.js”をダウンロードしてサーバに置く。
ページに以下の記述を追加する。これだけで完了。
1 2 3 4 5 6 7 8 9 10 11 |
<script type="text/javascript" src="se_hilite_src.js"></script> <script type="text/javascript"> //Hilite.debug_referrer = 'http://www.google.com/search?abc=def&q=Report+business+america&foo=bar'; Hilite.exact = false; </script> <style type="text/css"> .hilite { background-color: #fcc; } .hilite1 { background-color: #ff0; } .hilite2 { background-color: #f0f; } .hilite3 { background-color: #0ff; } </style> |
テストしてみるには、Hilite.debug_referrerの値を適当にいじる。よくわからない場合はgoogleで検索してURLを設定する。
ある特定のidをもつエリアだけをハイライトしたい場合は、Hilight.elementid = “myid”のようにidを指定する。
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()を追加する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using System; using System.Collections.Generic; using System.Text; using System.Windows.Forms; namespace MyAppLib { public class Class1 { public static void MyMain() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } } } |
ソリューションに新しいプロジェクト”MyApp”を追加する。
プロジェクトMyAppのForm1を削除する。
Resources.resxとSettings.settingsを削除。
MyApp.csprojを2005に移動して、エディタで開いて、ファイル構成が同じになるように色々頑張る。
MyAppの参照にプロジェクトMyAppLibを加える。
MyAppのMain()を書き換える。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System; using System.Collections.Generic; using System.Windows.Forms; namespace MyApp { static class Program { /// <summary> /// アプリケーションのメイン エントリ ポイントです。 /// </summary> [STAThread] static void Main() { MyAppLib.Class1.MyMain(); } } } |
MyAppがちゃんと動くか確認。2005の下に変なファイルを作らないか確認。
次に2005を2008ファルダにコピーする。
2008\MyApp.slnをVS2008CS Expressで開いて頑張る。
32ビットで起動するためのexeをVC2005EEでつくる。
VC2005EEで新しいフォームアプリMyApp32をつくり、フォームやアイコンを削除して、参照にMyAppLib.dllを加えて、main()を書き換える。
1 2 3 4 5 6 7 8 9 |
// MyApp32.cpp : メイン プロジェクト ファイルです。 #include "stdafx.h" [System::STAThreadAttribute] int main(array<System::String ^> ^args) { MyAppLib::Class1::MyMain(); return 0; } |
これでMyAppLibが32bitDLLを使っていても64bitから起動できる
C#のテキストボックスでカーソルを最後に移動する
カーソル(キャレット)を最後に置くには以下のようにする。
1 |
txtLog.Select(txtLog.Text.Length, 0); |
さらにスクロールさせるには以下のようにする。
1 |
txtLog.ScrollToCaret(); |
svnで特定のファイルやフォルダを無視する
1,特定のファイルを無視する
ファイル名の拡張子がbmpのファイルを無視する場合。
ここではmyprojの下にあるbmpファイルを無視する。
1 2 3 4 |
$ svn co myproj ... $ cd myproj $ svn propedit svn:ignore . |
以下を追加
1 |
*.bmp |
1 |
$ svn ci |
2,特定のフォルダを無視する
logフォルダがあり、このフォルダはco時、空のフォルダを作成して欲しいけど中のすべてのファイルを無視する場合。
1 2 3 4 |
$ svn co myproj ... $ cd myproj/log $ svn propedit svn:ignore . |
以下を追加
1 |
* |
1 |
$ svn ci |
確認するにはフォルダに移動して、以下を実行
1 |
$ svn propget svn:ignore . |
C#のWeakReference
C#の参照はオブジェクトを保持している変数がある限り、ガーベッジコレクトされることはありません。こういう参照は強い参照と呼ばれます。WeakReferenceの参照はそれを保持していても、他の強い参照がない限りガーベッジコレクトされます。
WeakReferenceにはShortとLongがありますが、ここではShortのみ考えます。
アプリケーションがモードレスなダイアログ(メッセージボックスのようなOKを押さない限り次に進めないものをモーダルダイアログといい、そうでないのをモードレスといいます)をいくつも作り、それを配列に格納したいとします。普通の配列やコレクションを使うと、参照は強い参照になるので、このダイアログが閉じられても参照を保持し続けガーベッジコレクトされることはありません。これをWeakReferenceの配列として持てば閉じられたダイアログはガーベッジコレクトされ、メモリの節約になるかもしれません。
まずアプリケーションのメインフォームのメンバーにWeakReferenceのListを加えます。
1 |
List<WeakReference> pds_ = new List<WeakReference>(); |
アプリケーションがモードレスダイアログをつくって、このリストにWeakReferenceを追加します。
1 2 3 |
PostDialog pd = new PostDialog(); pd.show(); pds_.Add(new WeakReference(pd)); |
WeakReferenceのコンストラクタに渡したオブジェクトは他の強い参照がなくなればガーベッジコレクトされます。
Listから列挙
1 2 3 4 5 6 7 8 |
foreach (WeakReference wr in pds_) { PostDialog pd = (PostDialog)wr.Target; if (pd != null && !pd.IsDisposed) { pd.DoSomething(); } } |
WeakReferenceのTargetがすでにガーベッジコレクトされている場合はnullが返ります。ただしオブジェクトがガーベッジコレクトされるかは定かではありませんのでタイミングには注意が必要と思われます。それと、ガーベッジコレクトされてもWeakReferenceオブジェクト自体は消えませんので上記のようなやり方でずっとやると、Listがどんどん大きくなっていってしまいます。