雨ときどき晴れ

最近は C# や Blazor やってます。Raspberry Pi で Node-RED も活用できるようになりました。

apache で https → https にリダイレクトしてみた。

何かしらの事情でページをリダイレクト(転送)する必要がある場合、
通常は、.htaccess のファイルに

Redirect / http://hoge.net/

という感じで設定すると思います。


ところが、SSL なページ、つまりは URL が https のページから
同じく https なページにリダイレクトすることは残念ながらできません。


ボクは、それに気づくまで1時間かかりました。


ということで、今回はその対応方法を書いておきます。

対応方法

PHP を使う。

転送したい php ファイルに

<?
Header( "HTTP/1.1 301 Moved Permanently" );
Header( "Location: https://hoge.net/" );
?>

と転送先を書いて保存すれば完了。


ただ、この方法はページを PHP で作成している状態じゃないとダメです。
PHP じゃない人は、php ファイルを Rewrite で html ファイルに偽装するなどの対応が必要。
もしくは、Rewriteで転送を試みる方法もあります。

Netduino Application が表示されないときの対応

Microsoft の VisualStudio 2010 を使って、C#でプログラムが組めるマイコンである Netduino。
最近、存在を知ったので早速、Amazon で注文してみました。


Amazon.co.jp: Netduino(Arduinoピンコンパチ.NETマイコンボード): おもちゃ


プログラムの開発環境を整えるのも簡単。
Netduino :: Netduino : Downloads
に書いてあるとおりに

  1. Microsoft Visual C# Express 2010
  2. .NET Micro Framework SDK v4.1
  3. Netduino SDK v4.1.0 (32-bit) or Netduino SDK v4.1.0 (64-bit)

上記、3つをインストールすれば完了です。


インストールが完了すれば、VisualStudio の
「新しいプロジェクト」→「Visual C#」→「Micro Framework」の画面にて、
「Netduino Application」のテンプレートが表示されます。
あとは、これを元にプログラムを書けばできます。


が、しかし、ボクは最初インストールしたときに「Netduino Application」の
テンプレートが表示されなかったのです。


正直、困った。
原因としては、「.NET Micro Framework」をインストールする前に
「Netduino SDK」を先にインストールしてしまったことだと思います。

これにより、Netduino のテンプレートが正常に登録できなかったんでしょう。


ということで、今回はその場合の対応策を書いておきます。
ちなみに「.NET Micro Framework」と「Netduino SDK」をアンインストールして、
再度、順番通りにインストールしてみましたが問題は解決しませんでした。

対応策

devenv.exe /setup を実行する。

devenv.exe とは、VisualStudio の実行ファイルです。
これに setup オプションを付けてテンプレートの登録を再度試みてみる感じですね。

手順
  1. 「すべてのプログラム」→「アクセサリ」→「コマンドプロンプト」を「管理者として実行」で起動する。
  2. devenv.exe があるフォルダに移動する。
  3. devenv.exe /setup を実行する(VisualStudion は終了しておく)

以上の操作で完了です。

もし、できなかったら、、、

通常だと「Netduino Application」のテンプレートは、

C:\Users\ユーザー名\Documents\Visual Studio 2010\Templates\ProjectTemplates\Visual C#\Micro Framework

にインストールされています。

ここにある「NetduinoApplication.zip」を

C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\ProjectTemplates\CSharp\Micro Framework

にコピーしてください。
それから、上記の setup を実行するとうまくできるかもです。


Netduino、最初はつまづいたけど、環境が整うと後はプログラムを書くだけなので楽だなぁ。
あと、Netduinoで実行させたプログラムは、電源OFFした後も記録されるんですね。普通にすごいと思った。

EC-CUBE で amazon のカスタマレビューっぽい表示をやってみた。

EC-CUBEには商品の詳細ページに
「この商品に対するお客様の声」を表示する部分がある。


ここでは、お客様の声を投稿したり、表示することができるのだが
ちょっと物足りない。というか寂しい。


ということで、今回はamazonのカスタマレビューに表示されている
統計情報を表示してみることにしてみました。


参考にするのはこの部分。


で、実際に表示するのはこんな感じ。


グラフ表示については、できるだけ画像を使わない方法を採用しました。
なので、配色の変更などはCSSをいじるだけでOK。

編集したファイル

  • /data/class/pages/products/LC_Page_Products_Detail.php
  • /html/user_data/packages/default/detail.tpl
  • /html/user_data/packages/default/css/products.css

※今回の改造では、モバイルへの対応は行っていません。

/data/class/pages/products/LC_Page_Products_Detail.php

お客様の声の統計情報を取得する関数を追加。
場所は、lfGetReviewData関数の下。

/*
 *	レビュー情報の統計を取得する。
 */
function lfGetReviewInfoData($arrReview) {
	$arrReviewInfo = array();
	
	$arrReviewInfo['count'] = count($arrReview);	// レビュー数
	$arrReviewInfo['level'] = array();
	$offset = 5;
	for ($i=0; $i < 5; $i++) {
		$tmp = array();
		$tmp['name'] = $offset - $i;
		$tmp['value'] = 0;
		array_push($arrReviewInfo['level'], $tmp);
	}
	
	$sum = 0;
	foreach ($arrReview as $item) {
		$arrReviewInfo['level'][$offset-$item['recommend_level']]['value']++;	// レベルごとの合計
		$sum += $item['recommend_level'];
	}
	
	$avg = $sum / $arrReviewInfo['count'];
	$arrReviewInfo['average'] = round($avg, 1);	// 平均(小数点第1位)
	
	return $arrReviewInfo;
}

追加した関数をprocess内で呼び出す。
240行目くらい。

// 入力情報を渡す
$this->arrForm = $this->objFormParam->getFormParamList();
// レビュー情報の取得
$this->arrReview = $this->lfGetReviewData($tmp_id);
// レビュー統計情報の取得
$this->arrReviewInfo = $this->lfGetReviewInfoData($this->arrReview); //←これを追加
/html/user_data/packages/default/detail.tpl

お客様の声を表示する先頭部分に追加する。

<!--{* レビュー統計情報 ここから *}-->
<div id="customervoiceinfoarea">
	<div class="info">
		<span class="infol">評価数:<!--{$arrReviewInfo.count}--></span>
		<span class="infor">おすすめ度:<!--{$arrReviewInfo.average|string_format:"%.1f"}--></span>
	</div>
	<div class="chart">
	<!--{foreach name=cnt from=$arrReviewInfo.level item=item}-->
		<!--{math equation="(x / y) * z" x=$item.value y=$arrReviewInfo.count z=100 assign=value}-->
		<dl>
			<dt><!--{$arrRECOMMEND[$item.name]|escape}--></dt>
			<!--{if 0 < $value}-->
				<dd><p style="width:<!--{$value|round:0}-->px;"><span><!--{$item.value}--></span></p></dd>
			<!--{else}-->
				<dd><p class="isnull"><span>&nbsp;</span></p></dd>
			<!--{/if}-->
		</dl>
	<!--{/foreach}-->
	</div>
</div>
<!--{* レビュー統計情報 ここまで *}-->
/html/user_data/packages/default/css/products.css

お客様の声が書かれているところに追記。

/* レビュー統計情報
----------------------------------------------- */
div#customervoiceinfoarea { border:1px #ccc solid; width:210px; float:left;}

div#customervoiceinfoarea .title {background-color:#73be1e; color:white; padding:0px 10px; line-height:2em; text-align:center;}

div#customervoiceinfoarea .info {padding:0 5px; line-height:2em; border-bottom:1px #ccc solid; height:2em;}
div#customervoiceinfoarea .infol {float:left; text-align:left;}
div#customervoiceinfoarea .infor {float:right; text-align:right;}

div#customervoiceinfoarea .chart {background:#d5ebbb; padding:10px 10px 22px; margin:0 0 0px 0; }
div#customervoiceinfoarea .chart dl         {clear:both; padding:0; margin:0 0 2px 0; display:block;}
div#customervoiceinfoarea .chart dl dt      {float:left; padding:0; margin:0; display:block; color:#ff7500; font:normal 10px Verdana; width:60px;  text-align:right;}
div#customervoiceinfoarea .chart dl dd      {float:left; padding:0; margin:0 0 1px 10px; display:block; text-align:left; background:white; width:110px;}
div#customervoiceinfoarea .chart dl dd p    {margin:0; padding:0 5px; display:block; background:#73be1e; text-align:right;}
div#customervoiceinfoarea .chart dl dd span    {margin:0; padding:0; color:#fff !important; font:bold 10px Verdana; position:relative; text-decoration:none; display:block; cursor:default;}

div#customervoiceinfoarea .chart dl dd p.isnull    {margin:0; padding:0 5px; display:block; background:white; text-align:right;}


以上です。

サイトマップをGoogleウェブマスターツールが認識してくれないので対応してみた。

WordPressで作ったサイトのサイトマップはSimple Google Sitemapで作成しています。

そのサイトマップ(XML)をGoogleウェブマスターツールに送信してみました。

結果、エラーのため認識してくれませんでした。(泣)


ということで、今回はGoogleに認識してもらえるようにサイトマップ生成部分をいじってみました。

方法

280行目あたり

$sitemapxml = '<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="'.$this->xslurl.'"?>
<!-- generator="wordpress/2.7" -->

の部分を

$sitemapxml = '<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.7" -->

一部記述を減らしてみました。


結果、無事Googleウェブマスターツールに認識してもらえました。
とりあえず、一安心です。

Simple Google Sitemap でトップページのアドレスを変更してみた。

WordPressGoogleやYahooで使えるサイトマップを生成してくれる
Simple Google Sitemap」というプラグインがあります。


この生成してくれるサイトマップですがデフォルトの場合、
WordPressのアドレス」がトップページのアドレスとして設定されています。


WordPressの管理画面の「設定」→「一般」から
WordPressをインストールしている場所である「WordPressのアドレス」と
サイトを公開しているアドレスである「サイトのアドレス」が設定できます。


ボクの環境では、「WordPressのアドレス」と実際に公開している
トップページのアドレスである「サイトのアドレス」は違います。


そのため、このままでは本来表示したいページがサイトマップに登録できません。


ということで、今回はサイトマップに登録するトップページのアドレスを
WordPressのアドレス」から「サイトのアドレス」に変更する方法を書いておきます。

方法


46行目くらい

function __construct(){
    //$this->siteurl = get_bloginfo('wpurl').'/';	//WordPressのアドレス(URL)
    $this->siteurl = get_bloginfo('url').'/';	//サイトのアドレス(URL)を取得に変更
    //$this->xslurl = $this->siteurl.'wp-content/plugins/simple-google-sitemap/sitemap.xsl';
    $this->xslurl = get_bloginfo('wpurl').'/'.'wp-content/plugins/simple-google-sitemap/sitemap.xsl';
    //$this->sitemappath = dirname(dirname(dirname(dirname(__FILE__)))).'/sitemap.xml';
    //index.phpが/wordpress/より上位のディレクトリにあるため下記のように dirname を追加
    $this->sitemappath = dirname(dirname(dirname(dirname(dirname(__FILE__))))).'/sitemap.xml';


以上です。

WP Contact Form III を日本語で使えるようにしてみた。

WordPressプラグインには「WP Contact Form III」という
簡単にお問い合わせページを作成してくれるものがある。


使い方は、本文中に[contactform]と入力すればOK


ただ、このプラグインは全て英語表記。
ボクとしては、項目名とか日本語がイイです。


ということで、今回は「WP Contact Form III」を日本語化して、
日本語で普通に使えるようにするまでを書いてみます。

日本語化したContactForm

設定するページにアクセスできない。。。

日本語化する前に問題が発生。
それは、WordPressの管理ページの「設定」→「ContactForm」にアクセスしようとしたところ
「このページにアクセスするための十分なアクセス権がありません」
と表示されてしまった。。。


で、この対応としては、

  • 編集するファイル:/wordpress/wp-content/plugins/wp-contactform-iii/wp-contactform-iii.php

295行目くらい

add_action('admin_head', 'wpcf_add_options_page');

の部分を

add_action('admin_menu', 'wpcf_add_options_page');

に変更することでアクセスできるようになりました。

項目名などの表記を日本語にする。

WordPressでお問合せフォームを設置するプラグイン | WordPress & Business メモ
上記のページにて「cfiii-ja.mo」というファイルをダウンロードしてください。
これを
/wordpress/wp-content/plugins/wp-contactform-iii/languages/
にコピーするだけです。

ContactFormからのメールが文字化けするので、その対応。

設置したContactFormから試しに送信してみたところ、
「件名」と「送信元」の日本語が文字化けしていました。


そのため、対応として、

  • /wordpress/wp-content/plugins/wp-contactform-iii/wp-contactform-iii.php

173行目くらい

$headers .= "From: $name <$email>\n";

の部分を

$headers .= "From: ".mb_encode_mimeheader($name)." <$email>\n";

に変更する。


181行目くらい

mail($recipient, $subject, $fullmsg, $headers);

の部分を

mail($recipient, mb_encode_mimeheader($subject), $fullmsg, $headers);

に変更すれば完了です。


以上で設定は完了です。
WordPressプラグインが豊富で便利なんですが
日本語環境で使用するためにはちょっといじる必要があるため大変ですね。
まあ、プラグインがあるだけでもとても助かりますけどね。

WordPress(SQLite)の投稿画面でエラーが発生した。

データベースにSQLiteを使用しているWordPressにて、
エラーが発生したので報告と対処方法をメモしておきたいと思います。


エラーは、投稿編集ページに表示されました。

Warning: require_once(/home/users/○○○/wordpress/wp-content/pdo/db.php) [function.require-once]: failed to open stream: No such file or directory in/home/users/○○○/wordpress/wp-content/db.php on line145

Fatal error: require_once() [function.require]: Failed opening required '/home/users/○○○/wordpress/wp-content/pdo/db.php' (include_path='.:/usr/local/php5.2/php') in /home/users/○○○/wordpress/wp-content/db.php on line 145 

上記のメッセージが表示されました。


とりあえず、無視して「更新」ボタンをクリックするとページを作成することができます。
ただし、「更新」ボタンをクリック後のページでは、

Warning: implode() [function.implode]: Invalid arguments passed in /home/users/○○○/wordpress/wp-includes/taxonomy.php on line 2461

Warning: Cannot modify header information - headers already sent by (output started at /home/users/○○○/wordpress/wp-includes/taxonomy.php:2461) in /home/users/○○○/wordpress/wp-includes/pluggable.php on line 890 

上記のエラーが表示されています。

対処方法

編集するファイル

116行目くらい

function escape($string) {
    return addslashes($string);
}

上記の箇所を

function escape($data) {
    if ( is_array($data) ) {
        foreach ( (array) $data as $k => $v ) {
            if ( is_array($v) )
                $data[$k] = $this->escape( $v );
            else
                $data[$k] = addslashes( $v );
            }
    } else {
        $data = addslashes( $data );
    }
    return $data;
}

このように置き換えると解決しました。