Warning: Declaration of FEE_Field_Terms::wrap($content, $taxonomy, $before, $sep, $after) should be compatible with FEE_Field_Post::wrap($content, $post_id = 0) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/post.php on line 0

Warning: Declaration of FEE_Field_Tags::wrap($content, $before, $sep, $after) should be compatible with FEE_Field_Terms::wrap($content, $taxonomy, $before, $sep, $after) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/post.php on line 0

Warning: Declaration of FEE_Field_Category::wrap($content, $sep, $parents) should be compatible with FEE_Field_Terms::wrap($content, $taxonomy, $before, $sep, $after) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/post.php on line 0

Warning: Declaration of FEE_Field_Post_Thumbnail::wrap($html, $post_id, $post_thumbnail_id, $size) should be compatible with FEE_Field_Post::wrap($content, $post_id = 0) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/post.php on line 0

Warning: Declaration of FEE_Field_Post_Meta::wrap($data, $post_id, $key, $ui, $single) should be compatible with FEE_Field_Post::wrap($content, $post_id = 0) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/post.php on line 0

Warning: Declaration of FEE_Field_Widget::wrap($params) should be compatible with FEE_Field_Base::wrap($content, $data) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/widget.php on line 0

Warning: Declaration of FEE_Field_Comment::wrap($content) should be compatible with FEE_Field_Base::wrap($content, $data) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/other.php on line 0

Warning: Declaration of FEE_Field_Term_Field::wrap($content, $term_id, $taxonomy) should be compatible with FEE_Field_Base::wrap($content, $data) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/other.php on line 0

Warning: Declaration of FEE_Field_Single_Title::wrap($title) should be compatible with FEE_Field_Term_Field::wrap($content, $term_id, $taxonomy) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/other.php on line 0

Warning: Declaration of FEE_Field_Option::wrap($content, $key, $ui) should be compatible with FEE_Field_Base::wrap($content, $data) in /home/twfs/serverkurabe.com/public_html/blog/wp-content/plugins/front-end-editor/php/fields/other.php on line 0
Sabakura Blog - Part 17

SyntaxHighlighter(Ver3.x)の導入方法

コードを記載する記事が増えてきたこともあり、言語に合わせて構文の色分け表示(シンタックスハイライト)をしてくれるJavaScript「SyntaxHighlighter」を導入しました。

最初に

SyntaxHighlighterが上手く動かないということで当記事に辿りつかれる方も多いと思いますので、最初に導入に際しての注意事項を書いておきます。

SyntaxHighlighterは、ページ読み込み後に動作させないと上手く機能しません。そのため、フッター部で読み込ませるか、もしくはヘッダ部に記述する場合は、window.onloadを使う必要があります。(詳しくは後述します)

SyntaxHighlighterとは

20を超える言語のシンタックスハイライトを実現するJavaScriptです。

非常に導入が簡単でなおかつ多数の言語に対応していることから、多くのサイト・ブログで使われています。たぶん、シンタックスハイライトとしてはもっとも利用率の高いJSだと思います。

SyntaxHighlighterの導入

なお、下記の導入手順はVer3.0.83時点のものです。

  1. SyntaxHighlighterの公式サイトで、ダウンロードページの「Click here to download」をクリックして、適当な場所に保存します。
  2. ダウンロードしたファイルを解凍し、フォルダ内にある「scripts」と「styles」フォルダをサーバー上にアップロードします。
    たとえば当サイトの場合は、以下のようにアップロードしています。

    /public_html/js/syntaxhighlighter/scripts
    /public_html/js/syntaxhighlighter/styles
    
  3. 次にHTMLファイルを開き(WordPressの場合はthemeフォルダ内の「header.php」)、以下のコードを<head>~</head>に追加します。

    <link type="text/css" rel="stylesheet" href="[path]/styles/shCore.css"/>
    <link type="text/css" rel="stylesheet" href="[path]/styles/shThemeDefault.css"/>
    <script type="text/javascript" src="[path]/scripts/shCore.js"></script>
    <script type="text/javascript" src="[path]/scripts/shAutoloader.js"></script>
    <script type="text/javascript" src="[path]/scripts/shBrushXml.js"></script>
    <script type="text/javascript">
    window.onload=function(){
    	SyntaxHighlighter.autoloader(
    		 "bash                      [path]/scripts/shBrushBash.js"
    		 ,"css                      [path]/scripts/shBrushCss.js"
    		 ,"html xml xhtml           [path]/scripts/shBrushXml.js"
    		 ,"js jscript javascript    [path]/scripts/shBrushJScript.js"
    		 ,"perl pl                  [path]/scripts/shBrushPerl.js"
    		 ,"plain                    [path]/scripts/shBrushPlain.js"
    		 ,"php                      [path]/scripts/shBrushPhp.js"
    		 ,"python py                [path]/scripts/shBrushPython.js"
    		 ,"sql                      [path]/scripts/shBrushSql.js"
    	);
    	SyntaxHighlighter.defaults['toolbar'] = false;
    	SyntaxHighlighter.all();
    }
    </script>
    

    ※[path]のところは、各自がSyntaxHighlighterをアップロードしたフォルダを指定してください。また、言語の種類に関しては自分が必要とするものがあれば適宜追加してください。

  4. 実際の記事において、コードを書く際に<pre>~</pre>で囲います。さらにこの<pre>に「brush:[言語]」のclassを設定してください。具体的には以下のようになります。

    <pre class="brush:php">
    <?php
    	echo "hogehoge";
    ?>
    </pre>
    

導入の補足

以上でSyntaxHighlighterそのものは動作するはずですが、上記のコードについて二、三補足しておきます。

window.onloadの利用

上記のコードでは、SyntaxHighlighterの主動作である「SyntaxHighlighter.all();」をwindow.onloadしています。

これはなぜかというと、SyntaxHighlighterは動作した時点でいきなり<pre>タグを探しにいくため、ページ全体を読み込ませた後に動作させないと、<pre>を見つけられず機能しないためです。

これを避けるためにwindow.onloadを使い、ページ読み込み後に動作させています。
または別解として、window.onloadは使わずにフッター部で読み込ませても良いと思います。

実体参照についての注意

SyntaxHighlighterでpreタグを使う場合、preタグ内の「<」は「<」として実体参照の形で書かないとうまく動作しません。

これを避けるために、<script>タグを使う方法が公式に載っています。
ただ、これはこれでRSSで上手く読み込まれない可能性があるなどデメリットもあるため、私は<pre>で囲んでから、あとでまとめて置換しています。

この辺りは各自使いやすい方を選んでいただければと思います。

autoloaderについて

SyntaxHightlighter3.xからはautoloaderという機能が実装されました。

これは最初からすべての言語のシンタックスハイライトを読み込むのではなく、必要となった時点で特定の言語だけを読み込むものです。余計な読み込みが不要になる分、動作が軽くなることが期待できます。

詳しくは、下記の記事が非常に参考になります。

【Javascript】SyntaxHighlighter 3.0 の新機能と注意点

toolbarの設定

SyntaxHighlighterをデフォルト設定で使うと、コード右上に「?」というクエスチョンマークが表示されます。

このマークをクリックするとSyntaxHightlighter公式サイトへのリンクが表示されるのですが、不要に感じる場合も多いと思います。そこで、以下の一行を追加することでこのマークを非表示にできます。

SyntaxHighlighter.defaults['toolbar'] = false;

POSTで受け取ったデータは文字列型になる

基本的なことですが、少しはまったのでメモしておきます。

$_POSTで受け取ったデータも自動で型変換される

たとえば次のようなごく簡単なフォームがあって、value内の数値によって処理を変えたいとします。
※そもそもvalueに数値を使わずに文字列を使う方がシンプルではありますが。今回はそれは使わないということで。

<form>
<select name="fruits" size="1">
	<option value="0">りんご</option>
	<option value="1">オレンジ</option>
	<option value="2">すいか</option>
</select>
</form>

これを$_POSTで受け取り、データを表示する場合、正しくは下記のようになります。

<?php
$favorite = $_POST['fruits'];

if ($favorite == "0") {
	echo "りんご";
} elseif ($favorite == "1" ){
	echo "オレンジ";
} elseif ($favorite == "2") {
	echo "すいか";
}
?>

しかし、じつはPHPは型付けの緩い言語なので、次のようにダブルクォーテーションなしでIFの判定を書いても、暗黙的に型変換をして判別してくれます。

<?php
$favorite = $_POST['fruits'];

//数値を""で囲っていない(文字列型として扱っていない)
if ($favorite == 0) {
	echo "りんご";
} elseif ($favorite == 1 ){
	echo "オレンジ";
} elseif ($favorite == 2) {
	echo "すいか";
}
?>

型変換されてしまうことによる誤判定

ですが、上記のような曖昧な使い方をしていると次のようにvalueに数値と文字列が混在している場合に意図しない挙動になる恐れがあります。

まずフォームから。

<form>
<select name="fruits" size="1">
	<option value="0">果物は嫌い</option>
	<option value="apple">りんご</option>
	<option value="orange">オレンジ</option>
	<option value="watermelon">すいか</option>
</select>
</form>

次にPHPです。

<?php
$favorite = $_POST['fruits'];

if ($favorite == 0) {
	echo "果物は嫌い"
} elseif ($favorite == "apple") {
	echo "りんご";
} elseif ($favorite == "orange" ){
	echo "オレンジ";
} elseif ($favorite == "watermelon") {
	echo "すいか";
}
?>

このようなPHPを書いてしまった場合、たとえばフォームで「apple」が選択されていた場合でも、IF文の条件判定はすべて($favorite = = 0)をTRUEとしてしまいます。
これは、「0」を本来受け渡されている文字列型として使っていないためです。

誤判定を避けるための対策

そのため、$_POSTでデータを受け取って使う場合には必ず($favorite == “0”)のように文字列として取得する必要があります。
なお、さらに安全に扱うためには、データ型の一致まで確認する「= = =」を使い、以下のようにすることをおすすめします。

if ($favorite === "0") {

VirtualPC上の仮想マシン(CentOS)をVMwareに変換する

VMware

これまでVirtualPC上にCentOSを入れて運用していたのですが、VMwareの方が軽いという話を聞いて乗り換えてみました。(まあ、実はほとんどの場合SSHで接続してCUIで使うのであんまり軽さは関係ないのですが、VMwareの勉強も兼ねまして)

さて、とはいえ環境はなるべくならばそのまま移行したいので、VirtualPCの仮想マシンをそのままVMwareに変換してみました。

ネット上にも参考資料がちらほらありましたが、詳細な手順がなかなか見つからなかったので、ここで詳しい手順をまとめておきます。

仮想マシンのディスクを変換する

VirtualPCでは、仮想マシンのディスクは「.vhd」という拡張子のファイルです。
まずは、これをVMwareのディスクである「.vmdk」形式に変換する必要があります。
この作業のためには「NHC」と呼ばれるソフトを使います。

NHCの使い方

  1. NHCのサイトへ行きます。
  2. 「NHC Ver.0 alpha40A 2011/05/14 32bit版」をダウンロードします。
  3. ダウンロードしたファイルを解凍し、フォルダ内の「NHC.EXE」を起動します。
  4. 「変換元ファイルの指定」で「ファイル」にチェックを入れます。
  5. 「参照」ボタンをクリックし「.vhd」ファイルを選択します。
    VMwareへの変換その1
  6. 「変換先の形式の選択」で「組み込み」にチェックを入れ、リストボタンから「VWwareVMDK」を選択します。
    VMwareへの変換その2
  7. 「VMware VMDK形式変の変換」に関してはとくに変更せずに「次へ」進みます。
  8. 「変換先ファイル名」に「.vmdk」をつけたファイル名を入力します。
  9. 「次へ」をクリックすると変換が始まります。

VirtualPCの設定ファイルをVMware用に変換する

上記でディスクそのものの変換は完了しましたが、個別の設定に関してはさらにVirtualPCの設定ファイル「.vmc」をVMware用の「.vmx」に変換する必要があります。

これにはVMwareの公式サイトから「VMware vCenter Converter Standalone」というソフトをダウンロードして使います。
VMware製品をはじめて利用する場合はユーザー登録が必要ですので、その手順もあわせて説明します。

VMware vCenter Converter Standaloneのダウンロード

  1. 「VMware vCenter Converter Standalone」のページへ行きます。
  2. (VMware製品をはじめて利用する場合は)ユーザー登録を行います。
  3. 登録後届いたメールからユーザーをアクティベートします。
  4. 同じくもう一通届いているメールから、ソフトのダウンロードページへ移動します。
  5. ダウンロードしたファイルをダブルクリックで起動してインストールします。

VMware vCenter Converter Standaloneの利用

  1. プログラム一覧から「VMware vCenter Converter Standalone」を起動します。
  2. 「マシンの変換」をクリックします。
  3. 「ソースのタイプを選択」で「バックアップイメージまたはサードパーティ仮想マシン」を選択します。
  4. 「参照」ボタンから「.vmc」ファイルを選択します。
  5. 「ターゲットのタイプを選択」で「VWwareWorkStationまたはその他のVMware仮想マシン」を選択します。
  6. 「VMware製品の選択」で「VMware Player 3.0.x」を選択します。
  7. 「参照」ボタンから仮想マシンのフォルダを選択します。
  8. 「オプション」の「ネットワーク」の「接続タイプ」で「NAT」を選択します。
    ※NATを選ぶとホストOSと共通のIPアドレスが割り振られます。
  9. 「サマリ」で変換内容を確認したあと「終了」をクリックすると変換が始まります。

VMware Playerの利用

ここまででVirtualPCからの変換作業は完了です。
最後にVMwarePlayerをインストールし、仮想マシンを起動します。

VMware Playerのダウンロード

  1. VMwarePlayerのページへ行きます。
  2. 「ダウンロード」へ進むと登録メールアドレスへメールが配信されます。
  3. 届いたメールからアクティベートを行います。
  4. 届いたメール内の「VMware Playerのダウンロード」からダウンロードページへ進みます。
  5. 「VMware Player (32 ビットおよび 64 ビット版 Windows 用)」をダウンロードします。
  6. ダウンロードしたファイルをダブルクリックで起動してインストールします。
  7. インストール完了後再起動を求められるので、再起動します。

VMware Playerの利用

  1. プログラム一覧から「VMware Player」を起動します。
  2. 「仮想マシンを開く」をクリックします。
    VMwareの起動
  3. 作成済みの「.vmx」ファイルを選択すると、左ペインのライブラリ一覧に仮想マシンが追加されます。
  4. 再生したい仮想マシンを選び「仮想マシンの再生」をクリックすると、仮想マシンが起動します。