2012年10月31日水曜日

[HTML][CSS]Bloggerにコードハイライトを追加する

Bloggerにコードハイライトを導入する上でハマったところがあるのでメモ

  1. Syntax Highlighter Scripts Generator で必要な言語をチェックして、下記のようなコードを生成する。
  2. <link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/>
    <link href='http://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/>
    <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shCore.js' type='text/javascript'></script>
    <script src='http://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js' type='text/javascript'></script>
    <script language="javascript" type="text/javascript">
     SyntaxHighlighter.config.bloggerMode = true;
     SyntaxHighlighter.all();
    </script>
    
  3. 上記のHTMLコードをBloggerの「テンプレート」→「HTMLの編集」→「続行」で開いたHTMLの</head>の直前にコピー
  4. 導入完了

    <pre class="brush: cpp;">
     int main(){
      printf("hello world!");
     }
    </pre>
    

    上記のように書くと下記のように表示される

     int main(){
      printf("hello world!");
     }
    

しかし、Google Chromeで二桁の行番号が改行されてしまう(2012/10/31現在)

shCore.cssを変更せずChromeで表示した場合

http://code.google.com/p/chromium/issues/detail?id=140868 によるとGoogle Chromeに、左右のpaddingの合計が整数のpx出ない場合に表示がおかしくなるという不具合があることが分かった。その為、下記の対応を行うことで回避することができる。

  1. 「テンプレート」に追加したHTMLコードのうちshCore.cssを追加している行を削除
    <link href='http://alexgorbatchev.com/pub/sh/current/styles/shCore.css' rel='stylesheet' type='text/css'/>
    
  2. shCore.cssはコードの中身を直接コピー後Bloggerの「テンプレート」→「カスタマイズ」→「アドバンス」→「Add CSS」に直接貼り付け
  3. 貼り付けしたshCore.cssコードのうち下記の部分を変更する
    .syntaxhighlighter table td.gutter .line {
      text-align: right !important;
      padding: 0 0.5em 0 1em !important;
    }
    
    を下記に変更
    .syntaxhighlighter table td.gutter .line {
      text-align: right !important;
      padding: 0 6px 0 13px !important;
    }
    

解説

行番号のデフォルト文字サイズが13pxなのでpadding-rightが0.5emだと6.5pxとなり、整数とならない。そこで、今回の変更では6pxとしている。それ以外の値でも左右のpaddingの合計が整数になれば問題ない。

2012年10月28日日曜日

[Win][C++]現在起動しているプロセス名を列挙する方法

Windowsにて現在起動しているプロセス名を列挙する方法をメモ

プロセスの列挙には下記の関数を利用する

HANDLE WINAPI CreateToolhelp32Snapshot(
  DWORD dwFlags,
  DWORD th32ProcessID
);

dwFlagsにはどのスナップショットを取得したいかを指定できる。

具体的には、TH32CS_SNAPPROCESSの他に

TH32CS_SNAPHEAPLIST // ヒープのリスト
TH32CS_SNAPMODULE   // モジュールのリスト

などが指定できる。

th32ProcessIDはプロセスの列挙の場合0を指定すればよい。

スナップショットの内容は、Process32First()/Process32Next()を利用して、戻り値がFALSEになるまで呼ぶことで走査できる。

サンプルコード

#include <iostream>
#include <vector>
#include <string>

#include <Windows.h>
#include <TlHelp32.h>

typedef std::vector<std::wstring> ModuleNameList;

// 現在起動しているプロセス名のリストを返す
ModuleNameList getModuleList() {
 ModuleNameList module_name_list;
 // スナップショットを取得
 HANDLE snapshot = ::CreateToolhelp32Snapshot(
  TH32CS_SNAPPROCESS, 0
  );
 if(snapshot == INVALID_HANDLE_VALUE)
  throw std::exception();

 // プロセスの情報を走査
 PROCESSENTRY32W entry;
 entry.dwSize = sizeof(entry);
 BOOL has_entry = ::Process32FirstW(snapshot, &entry);
 while(has_entry) {
  module_name_list.push_back(entry.szExeFile);
  has_entry = ::Process32NextW(snapshot, &entry);
 }
 ::CloseHandle(snapshot);

 return module_name_list;
}

int wmain(int argc, wchar_t* argv[]) {
 const auto list = ::getModuleList();
 for(auto name : list) {
  std::wcout << name.c_str() << std::endl;
 }
 return 0;
}

出力結果例

[System Process]
System
smss.exe
csrss.exe
wininit.exe
...

Visual Studio 2013にて動作確認済み