2011年10月19日水曜日

Windowsにリモートで繋いでいて調子が悪くなった時の対処方法

Windowsにリモートで繋いでいて、リモート先マシンの
調子が悪くなった時の対処方法。
リモート先のサービスを再起動してみる。

# リモート先へ接続。host_ip は接続先のリモートPCのIPアドレス
net use \\
host_ip /user:local\administrator password
# サービスの停止・開始 xxx は停止・開始させたいサービス名
# サービスの停止
sc \\host_ip stop xxx 
# サービスの開始
sc \\host_ip start xxx
vncとかtelnetサービスとかを再起動してみると、
うまくいけば再接続できるようになる。
telnetがお亡くなりになると現地にいる人へ電話 or 
現地へ赴くというアナログな手段が待っている。

2011年10月9日日曜日

WindowMessageでIE(InternetExplorer)にF5リフレッシュさせる。(C#)

C#で、Windowsのシステムコールの「WindowMessage」を使って
IE(InternetExplorer)にF5リフレッシュさせるソースサンプル。

#region User32.dll定義
[DllImport("User32.dll", EntryPoint = "FindWindow")]
public static extern Int32 FindWindow( string lpClassName, string lpWindowName);

[DllImport("User32.dll", EntryPoint = "FindWindowEx")]
public static extern Int32 FindWindowEx( Int32 hwndParent, Int32 hwndChildAfter, string lpszClass, string lpszWindow);

// 同期送信
[DllImport("User32.dll", EntryPoint = "SendMessage")]
public static extern Int32 SendMessage( Int32 hWnd, Int32 Msg, Int32 wParam, ref Int32 lParam);

// 非同期送信
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("user32.dll", EntryPoint = "PostMessage", SetLastError = true)]
public static extern bool PostMessage( Int32 hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);

#region メッセージ一覧
public static class WINDOW_MESSAGE
{
    public const Int32 WM_KEYDOWN = 0x0100;
}
#endregion

#region キー一覧
public static class KEY_CODE
{
    public const Int32 VK_F5 = 0x74;
}
#endregion
#endregion

///

/// 指定されたウィンドウ名のInternetExploreに画面更新キー(F5)を送ります。
///
///
public static bool F5RefreshIE(string windowName)
{
    int hwnd;
    int hwndTmp = FindWindowEx(0, 0, "IEFrame", windowName);
    if (hwndTmp == 0)
return false;
    else
hwnd = hwndTmp;

    hwndTmp = FindWindowEx(hwnd, 0, "Frame Tab", null);
    if (hwndTmp != 0) hwnd = hwndTmp;

    hwndTmp = FindWindowEx(hwnd, 0, "TabWindowClass", null);
    if (hwndTmp != 0) hwnd = hwndTmp;

    hwndTmp = FindWindowEx(hwnd, 0, "Shell DocObject View", null);
    if (hwndTmp != 0) hwnd = hwndTmp;

    hwndTmp = FindWindowEx(hwnd, 0, "Internet Explorer_Server", null);
    if (hwndTmp != 0) hwnd = hwndTmp;

    //Int32 param = 0; // パラメータなし
    //SendMessage(hwnd, MessageList.WM_KEYDOWN, KEY_LIST.VK_F5, ref param);
    //param = 0;
    //SendMessage(hwnd, MessageList.WM_KEYUP, KEY_LIST.VK_F5, ref param);
    PostMessage(hwnd, WINDOW_MESSAGE.WM_KEYDOWN, KEY_CODE.VK_F5, 0);

    return true;
}

///

/// 任意のInternetExploreに画面更新キー(F5)を送ります。
///
public static bool F5RefreshIE()
{
    return F5RefreshIE(null);
}

///

/// 指定されたウィンドウに画面更新キー(F5)を送ります。
///
public static bool F5RefreshIE(Int32 hwnd)
{
    if (hwnd == 0) return false;

    PostMessage(hwnd, WINDOW_MESSAGE.WM_KEYDOWN, KEY_CODE.VK_F5, 0);

    return true;
}

 やっとできた。。。Blogger + sites.google.com で Syntax Highlighter

Blogger + sites.google.com で Syntax Highlighter の適用がようやくできた。。。
FaziBear's Blogger Widgetsの「Add-widget」がクロスサイトスクリプトのチェックに引っかかることから始まり、CSSがコメントアウトされているところまで紆余曲折でした。 

(
SyntaxHighlighter
version 3.0.83 (July 02 2010)
)

適用手順は以下の通り。
1. SyntaxHighlighter をダウンロード
2. site.google.com のご自身のページに以下のファイルをアップロード
    style/shCore.css
    style/shThemeDefault.css
    scripts/shAutoloader.js
    scripts/shCore.js
    scripts/shBrushXXX.js ←使用したい言語に対応するファイル。複数あればそれら全てをアップロードする。
    
    アップロードしたファイルのパスを確認。
    http://sites.google.com/XXX/files/shCore.css など
    ※以下の例では、「 http://sites.google.com/XXX/files」を<url>として置き換えています。

3.  BloggerにSyntaxHighlighterのCSSを登録
    Blogger → テンプレート → HTMLの編集
    ※カスタマイズ → アドバンス → CSSの追加 でもCSSの追加ができるはずだが、実際にはコメントアウトされてしまいうまくいかなかった。リンクではなくCSSの内容をそのまま書かなければならなかったのかと今、思う。

4. <head>〜</head>に以下のCSSを追加
  … 
    <link rel='stylesheet' type='text/css' href='<url>/shCore.css'/>
    <link rel='stylesheet' type='text/css' href='<url>/shThemeDefault.css'/>
  … 
 
     ※<url> 部分に2でメモったパスを入力してください。


5. レイアウトにJavaScriptを追加
    レイアウトを開き「ガジェットを追加」をクリック。
    HTML/JavaScript をクリック。
    「コンテンツ」に以下を入力。(詳細はSyntaxHighlighterのAutoloader参照)
     ※<url> 部分に2でメモったパスを入力してください。(3箇所)
<script src="<url>/shCore.js" type="text/javascript"></script>
<script src="<url>/shAutoloader.js" type="text/javascript"></script>

<script type="text/javascript">
function sh_path()
{
  var args = arguments,
      result = [];
 
  for(var i = 0; i < args.length; i++) {
    result.push(args[i].replace('@','<url>/'));
  }
  return result;
}

SyntaxHighlighter.autoloader.apply(null, sh_path(
  'applescript            @shBrushAppleScript.js',
  'actionscript3 ac3      @shBrushAS3.js',
  'bash shell             @shBrushBash.js',
  'coldfusion cf          @shBrushColdFusion.js',
  'cpp c                  @shBrushCpp.js',
  'c# c-sharp csharp      @shBrushCSharp.js',
  'css                    @shBrushCss.js',
  'delphi pascal          @shBrushDelphi.js',
  'diff patch pas         @shBrushDiff.js',
  'erl erlang             @shBrushErlang.js',
  'java                   @shBrushJava.js',
  'jfx javafx             @shBrushJavaFX.js',
  'js jscript javascript  @shBrushJScript.js',
  'perl pl                @shBrushPerl.js',
  'php                    @shBrushPhp.js',
  'text plain             @shBrushPlain.js',
  'py python              @shBrushPython.js',
  'ruby rails ror rb      @shBrushRuby.js',
  'sass scss              @shBrushSass.js',
  'scala                  @shBrushScala.js',
  'sql                    @shBrushSql.js',
  'vb vbnet               @shBrushVb.js',
  'xml xhtml xslt html    @shBrushXml.js'));
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.all();
</script>
6.ブログで使用
以上で準備OK. 実際にソースコードをハイライトしたい場合は、以下のように<pre> でソースコード部分を囲む。
<pre class="brush: csharp">
public static void Hoge()
{
    MessageBox.Show("foo");
}
</pre>