DelphiXE8は#128=#$0080ではないのか?

私、Delphiは#128と#$0080はイコールだと思っていました。

でも、そうではないと思われる場面に遭遇しました。

きっかけは海外のSkRegExpユーザーさんからの「XE8上で、3.0.8と3.1.のでマッチ結果が異なる」という指摘でした。

正規表現='\b[Ĉ]([^Ĉ\d]+)'
対象文字列='Ĉ Ĉĉĉ';

コレは先頭の2文字にマッチするのが正解です。

もちろん、私のテストでもそうなります。

しかし、そのユーザーさんのテストではマッチしないというのです。

問題が再現しないって言う最悪のケースです。

コレって本当に困りますよね。

幸い、ユーザーさんが問題解決に協力すると言ってくれました。

問題箇所を絞り込むために何度もテストプログラムを送り、結果を返してもらいました。

で、問題の原因となったコードはコレでした。

if AStr^ < #128 then

Ĉ は U+0108H です。

この条件式は False になるはずです。

しかし、テストコードの結果は True になっていました。

そりゃマッチするわけないですわ!

Delphi は XE2 以降で仕様が変わったのでしょうか?

ま、そんな疑問は置いておいて。

問題解決が先です。

ならばと、次のように書き換えてテストプログラムを送って結果を返してもらいました。

if AStr^ < #$0080 then

問題は解決しました。

でも、どうなってんの? コレ?

ちなみにXE8でテストしなかった理由は、私がXEで止まっている&XE8体験版の試用期限が切れたためです。

Delphi2007で”Borland.Delphi.Targets が見つからない”

Windows10でDelphi2007のプロジェクトを開くとBorland.Delphi.Targets が見つからないとのエラーメッセージが出るときの対策。

“C:\Windows.old\WINDOWS\Microsoft.NET\Framework\v2.0.50727″フォルダにある

  • Borland.Common.Targets
  • Borland.Cpp.Targets
  • Borland.Delphi.Targets
  • Borland.Group.Targets

上記4つのファイルを”C:\Windows\Microsoft.NET\Framework\v2.0.50727\” にコピーする。

SkRegExp version 3.1.0 release

マイナーバージョンアップは2年ぶりです。

とは言っても、バグ修正は行なっていましたが。

今回のマイナーバージョンアップは、今まで放置していた危ないバグの修正と高速化がテーマです。

危ないバグとは?

次の正規表現でマッチさせると無限ループ?と思われるくらい処理に時間が掛かります。

[\x{0}-\x{ffff}]

正規表現を知っている人がこのような正規表現を書くことはないと思います。

たとえばUnicodeの漢字の範囲が必要なら\p{Han}と書きますからね。

そんなわけでずっと放置してきました。

ところが先日、某海外製アプリでこの症状に遭遇しました。

まさかと思ってバイナリを覗くとSkRegExpWの文字が!

SkRegExpが使われていることに驚いたと同時に冷や汗が。

せっかく使ってもらっているのだからそれなりの責任を果たさなければと考えを改めました。

というわけでこのバージョンで修正しました。

もう一つのテーマの高速化については、地味な作業なのでこちらも放置してきたことを改善しました。

まだやらなければならないこともあるんですが、取り敢えず、モチベーションを維持しているうちにできることは片付けました。

SkRegExp version 3.1 はこちらからダウンロードできます。

bbpressをtwentytwelveで使用時のカラム落ち対策

テーマのディレクトリにある、bbpress由来のすべてのファイル内に以下を追加する。

get_header() の後ろに以下を追加。


<div id="primary" class="site-content">
<div id="content" role="main">

get_sidebar() の前に以下を追加。

</div><!-- #content -->
</div><!-- #primary -->

以下はpage-front-forum.phpの変更例。


<?php

/**
 * Template Name: bbPress - Forums (Index)
 *
 * @package bbPress
 * @subpackage Theme
 */

get_header(); ?>

	<div id="primary" class="site-content">
		<div id="content" role="main">

	<?php do_action( 'bbp_before_main_content' ); ?>

	<?php do_action( 'bbp_template_notices' ); ?>

	<?php while ( have_posts() ) : the_post(); ?>

		<div id="forum-front" class="bbp-forum-front">
			<h1 class="entry-title"><?php the_title(); ?></h1>
			<div class="entry-content">

				<?php the_content(); ?>

				<?php bbp_get_template_part( 'content', 'archive-forum' ); ?>

			</div>
		</div><!-- #forum-front -->

	<?php endwhile; ?>

	<?php do_action( 'bbp_after_main_content' ); ?>

		</div><!-- #content -->
	</div><!-- #primary -->

<?php get_sidebar(); ?>
<?php get_footer(); ?>

サーバーのgzip圧縮が無効になった時のチェクポイント

定期的にサイトのパフォーマンスをチェクしているが、ある日突然サーバーのgzip圧縮が無効になった。

.htaccessを書き直したが変化なし。

もっとも、いきなりこんなことをやるのがバカ。

動いてた時と何を変えたのか?を考えたのは散々いじり倒した30分後。

すると思い当たることがあった、あった。

そのサイトはさくらインターネットに置いている。

1週間前にWAF(ウェブアプリケーションファイアウォール)を導入したのだった。

それを解除にしたら動いた。

理由は時間があったら調べてみるつもり。ってのは絶対にやらないよね。

取り敢えず解決。仕事に戻る。

Ymobile DIGNO-Tでイヤホンから音が出ない時の対策

Ymobile DIGNO-Tでイヤホンから音が出ない時の対策はマイク付きイヤホンで試してみること。

スマホでイヤホンから音が出ないコトに困っている人が結構いるようだ。

サポートに電話すると、待たされるわ、「イヤホンをちゃんと差して下さい」とできない子扱いされるわ、気分が悪い。

そこで私が解決策の一つを提案しておく。

症状はイヤホンによって異なる。

iPod touchに付属のイヤホンは差し込んでもスピーカーから音が出ててしまう。当然、イヤホンから音は出ず。

オーディオテクニカのイヤホンとヘッドホンはスピーカーから音は出なくなるが、イヤホンからも音は出ない。

ただ、どちらも共通しているのは端子をいじっているうちにイヤホンから音が出ることもあるのだ。機嫌がよければ10分くらいは聞ける。ただし、途中で音が出なくなる。

Ymobileのショップで他のDIGNO-Tでも試させてもらったが同じ症状だった。

結論はイヤホンの相性だろうと言うこと。

「どのイヤホンなら使えるのか?」と聞いたら「わからない」との返事。

仕方ないので私が人柱になって試してみることに。

その結果。

スマートフォン用のマイク付きイヤホンなら問題なし。音楽専用のイヤホンは極めて相性が悪い。少なくてもDIGNO-Tでは使わない方がよい。

以上、参考まで。

 

リサーチアルチザンライトの管理画面でエラーがでるときの対処法

リサーチアルチザンライトは自分のサーバーに設置できる、オープンソースのアクセス解析ツール。

Google Analyticsも使っているが、リアルタイムで出ないのと機能が多すぎてわかりにくい。

Googleプロダクトは直感的に使えないものが多いと思う。あ、私にとってはね。

その点、リサーチアルチザンライトはリアルタイムでわかり、直感的で使いやすい。

そのリサーチアルチザンライト、昨日、管理画面で次のようなエラーが出て動かなくなった

It is not safe to rely on the system’s timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected ‘Asia/Tokyo’ for ‘JST/9.0/no DST’ instead

phpのバージョンを5.2から5.3に挙げたのが原因だとはすぐにわかった。

ところが私は英語が苦手。

よく読みもせず、リサーチアルチザンライトは5.3に対応していないのだと勘違い。

代わりのアクセス解析を片っ端から試す羽目になった。

4時間探しても、リサーチアルチザンライトほどのものは見つからず。

ここでようやくエラーメッセージを読む気になった。

すると、「システム設定のdate.timezoneか、date_default_timezone_set()関数でタイムゾーンを指定しろ。お前のだとアジア東京がいいじゃないか?」と言っているようだ。

そこで、php.ini にdate.timezone =  Asia/Tokyoを追加。

何事もなく、リサーチアルチザンライトの管理画面を立ち上がった。

4時間ムダにしたとも言えるが得たものもある。

それはリサーチアルチザンライトは私にとってはベストな選択だと言うこと。

良いアクセス解析をお探しの方はリサーチアルチザンライトを試してみては?

20%速くなりました

TREMatchEngine.MatchPrim を TREMatchEngine.MatchCore に統合する作業を完了しました。

現在のバージョンでは要素ごとに MacthcPrim メソッドを呼び出しています。

ココが SkRegExp のボトルネックでは?

と言うわけで、 MatchPrim を MatchCore の中に押し込んだバージョンを作りました。

その結果は?

この変更だけで20%速くなりました。

やっぱり、ループ中のメソッド呼び出しは重いんですね。

近いうちに version 3.1 として公開します。

SkRegExp version 3.0.3 公開

SkRegExp version 3.0.3 を公開しました。

次のバグを修正しました。

  • 修正)戻り読みの中で選択(|)を使った正規表現パターンで Access violation が出るバグを修正。
    TRETrieList.Add 内のハッシュテーブルでキーが重複したときの処理が間違っていた。
  • 修正)戻り読みの中で選択(|)を使った正規表現パターンでマッチしないことがあるバグを修正。

    最適化すべきでない部分を最適化していたため。

  • 修正)選択(|)の際、最適化が効かなくなるバグを修正。
    TRENFA.GenerateStaeteList メソッドでリテラル文字の開始位置を正しく計算していなかった。

SkRegExp version 3.0.3 はこちらからダウンロードできます。