テキストファイルの中からCJK互換漢字をあぶり出す

先日、メモ帳のテキストにおかしな漢字(CJK互換漢字)があるという感じの記事を書きましたが、そんな漢字をあぶり出すスクリプトを考えましたので今回はその紹介。

tuttitan.hatenablog.com

 

スクリプトPerlで作られており、内容としてはテキストファイルを開いて1文ずつ文字コードを調査していき、コード的にU+F900~U+FF00の文字があったら表示するというものです。

CygwinPerl環境で動作確認していますが、環境が変わると文字が化けたり正しいコードが取れない可能性があるので参考にする場合はご注意下さい。

文字コード関連でのはまりどころとしては、STDOUTをutf8に設定するところと、テキストファイルをopenするところでutf8を指定するところでしょうか。なお、テキストファイルはutf8(BOMなし)改行(LF)でエンコードされている前提です。

 

ちょいと汚いですが、以下がコードになります。

#!/usr/bin/perl

use strict;
use warnings;

# エンコードの設定
use utf8;
binmode(STDOUT, ":utf8");
binmode(STDERR, ":utf8");

# 文字色の設定
use Term::ANSIColor qw(:constants);
$Term::ANSIColor::AUTORESET = 1;

print "Script Start...\n";

if (0 != $#ARGV) {
    die "開くファイルを引数で指定して下さい";
}

unless (-e $ARGV[0]) {
    die "$ARGV[0]は存在しません";
}

my $file = $ARGV[0];  # ファイル名
our $cntFind = 0;


open(FDI, "<:utf8", "$file");

my $content;  # ファイルの全内容

# 一時的に入力セパレータを無効して$contentにすべて読み込む
{
    local $/ = undef;
    $content = <FDI>;
}

my $cntLine = 1;
my $column  = 1;

my @chars = split(//, $content);
my $compatiCode1 = 63744;  # 0xF900
my $compatiCode2 = 65280;  # 0xFF00

for (my $x = 0; $#chars >= $x; ++$x) {

    my $code = ord($chars[$x]);

    # CJK互換文字を見つけたら表示する
    if (($code >= $compatiCode1) &&($code < $compatiCode2)) {
        print BOLD RED "NG";
        printf("  line: %4d | col: %3d | char: %s(0x%x)\n", $cntLine, $column, $chars[$x], $code);
        ++$cntFind;
    }

    ++$column;  # 1文字処理したのでカラムを+1する

    # 行末の処理
    if ($chars[$x] =~ /\n/) {
        $column  = 1;
        ++$cntLine;
    }
}
close(FDI);

print "\n";
print "=============================\n";
print "見つかった数: $cntFind\n";
print "=============================\n";
print "\n";

print "...Script End\n";

なんだかメモ帳の文字が変だぞ?

Windowsのメモ帳(notepad.exe)にコピペした文字を眺めていたら、なんだか変なことになっていることに気付いた。

メモ帳のフォントは "MS ゴシック" のはずなのに、文字がなんだか明朝体っぽいのだ。

f:id:tuttitan:20170117200016p:plain

もしかして中国の文字か?と思ってWordに貼り付けて調べてみるとUnicode的にF始まりの文字で私用領域よりも外側にあるCJK互換漢字(U+F900~U+FA2D)だった。

詰まるところ外字でしたw

 

正規化することでCJK統合漢字(JIS第一水準・第二水準)に戻せるっぽいけどなかなか興味深い。

f:id:tuttitan:20170117201813p:plain

 

参考Webページ

 

生麦〜東戸塚に謎の線路がある

Google Mapsを眺めていたら、大口界隈で横浜線と交差する謎の線路を目にした。
地図には路線名も書いてないし、『こんなところに鉄道なんてあったっけ?』と思って調べてみると、どうやら地下を走っている貨物線とのこと。

f:id:tuttitan:20170107132653p:plain

地図を辿っていくと、京急の生麦から分岐して東戸塚まで繋がっている。JR東海道貨物線の駅としては鶴見〜横浜羽沢〜東戸塚があるので、どうやら貨物列車は横浜を迂回してこの区間を走っているっぽい。

 

参考Webページ

vim ことはじめ(Syntax Highlight)

vimにも少し慣れておかないとなぁと、perlのコードを書いたときの話。

emacsなら何もしなくても ".pl" はPerlコードですね!Syntaxハイライトします。となるところだけど、vimの場合はこれを自動的にやってくれないという。

そんなバカなと思って調べてみると、どうやら ~/.vimrc にお作法を書いておく必要があるとのこと。とりあえず以下のように書いたところちゃんとSyntaxハイライトがかかりました。

syntax on
set autoindent
set expandtab
set tabstop=4
set shiftwidth=4
set cursorline
set number

 

 

参考Webページ

Visual Studio 2015 でOpenCV2.xを使う (第2回)

前回はCMakeを使ってVisual Studio 2015用のOpenCVプロジェクトを生成するところまで紹介しました。

 

tuttitan.hatenablog.com

 

今回は、OpenCVプロジェクトのビルドから動作確認までを見ていきたいと思います。

 

 

1. OpenCVプロジェクトのビルド

(Generate実行後)CMakeの [Open Project] ボタンをクリックするか、buildフォルダにある "OpenCV.sln" を開くと、Visual Studio 2015が起動し、ソリューション "OpenCV" が読み込まれている状態になります。

f:id:tuttitan:20161227153324p:plain

 

まずはDebug用のバイナリとライブラリファイルを生成したいと思うのので、ソリューションの構成が「Debug」になっていることを確認します。(32bit用の場合は「Win32」、64bit用の場合は「x64」になります)

f:id:tuttitan:20161227153432p:plain

 

ソリューションをビルドします。Debugの場合はあまり時間がかからなかったです。

f:id:tuttitan:20161227153752p:plain

 

ビルド中は下方にある出力ウィンドウにログが出力されます。ビルドが完了するとその旨が出力ウィンドウに表示されます。エラーや失敗がないことを確認して下さい。

f:id:tuttitan:20161227154150p:plain

f:id:tuttitan:20161227154332p:plain

 

ビルドが正常に終了したら、ソリューションの構成を「Release」に変更して、同様にビルドを行ないます。

f:id:tuttitan:20161227154516p:plain

 

以上で、Debug用とRelease用のバイナリとライブラリファイルが生成されたことになります。場所としてはbuildフォルダの下に "bin" と "lib" が作られており、その中にそれぞれ "Debug" と "Release" がある構成になっています。

C:\opencv
└─ opencv-2.4.13
     ├─ build
     ├─ sources
     ├─ LICENSE.txt
     ├─ README.md.txt
     └─ build_x86
          ├─ bin
          |   ├ Debug
          |   └ Release
          └─ lib
               ├ Debug
               └ Release

 

 

2. バイナリとライブラリファイルを配置する

このままのフォルダ構成でも問題はないのですが、見通しをよくするためにファイルを再配置します。

もともとあるOpenCVのbuildフォルダを見てみると、以下のような構成になっています。

C:\opencv
└─ opencv-2.4.13
     ├─ build
     |   ├─ x86
     |   |   ├─ vc11
     |   |   └─ vc12
     |   |        ├─ bin
     |   |        └─ lib
     |   └─ x64
     |        ├─ vc11
     |        └─ vc12
     |             ├─ bin
     |             └─ lib
     ├─ sources
     ├─ LICENSE.txt
     ├─ README.md.txt
     └─ build_x86

 

つまり、buildの下に "x86"(32bit用)と "x64"(64bit用)があり、その下にそれぞれ "vc11"(Visual Studio 2012用)と "vc12"(Visual Studio 2013用)があって、その中に "bin"(バイナリ)と "lib" ライブラリファイルがあることになります。

このフォルダ構成になって、vc14(Visual Studio 2015用)のフォルダを作ってそこに先ほどビルド生成したバイナリとライブラリファイルを配置したいと思います。

なお、再配置するファイルは以下の拡張子のものになります。

  • exe
  • dll
  • lib

拡張子がpdb、ilk、expのものはVisual Studioのプロジェクトが使用するファイルなので移動させる必要はありません。

 

 

3. OpenCVの動作確認を行なう

ビルド生成して配置したOpenCVバイナリとライブラリファイルが正しく使えるか確認します。Visual Studio 2015 を起動させて適当な場所にコンソールアプリケーションのプロジェクトを作成します。

 

OpenCVのサンプルページを参考に適当にプログラムを書きます。

入出力 — OpenCV2 プログラミングブック リファレンス編

f:id:tuttitan:20161227184850p:plain

 

プロジェクトのプロパティを編集します。左方の「VC++ ディレクトリ」を選択し、「インクルード ディレクトリ」と「インクルード ディレクトリ」に以下をそれぞれ追加します。

インクルード ディレクト C:\opencv\opencv-2.4.13\build\include
ライブラリ ディレクト C:\opencv\opencv-2.4.13\build\x86\vc14\lib

f:id:tuttitan:20161227185914p:plain

 

Debug構成およびRelease構成でビルドできることを確認します。ソリューションフォルダの下に "Debug" フォルダと "Release" フォルダが出来ているので、dllファイルを "C:\opencv\opencv-2.4.13\build\x86\vc14\bin" よりそれぞれのフォルダにコピーします

コピー先コピー元
ソリューション名/Debug C:\opencv\opencv-2.4.13\build\x86\vc14\bin\Debug
ソリューション名/Release C:\opencv\opencv-2.4.13\build\x86\vc14\bin\Release

 

 「デバッグの開始」を実行してうまく動けばOKです。

f:id:tuttitan:20161227191121p:plain

Visual Studio 2015 でOpenCV2.xを使う (第1回)

OpenCV3がリリースされて1年以上経ちますが、使い慣れたOpenCV2.x系を使って開発したいという方もおられることでしょう。

しかし、OpenCV2.x(執筆時点で最新は2.4.13)をダウンロードしてみると、プレビルドされたバイナリとライブラリファイルはvc11(Visual Studio 2012用)とvc12(Visual Studio 2013用)しかありません。

 

というわけで、Visual Studio 2015でOpenCV2.xを使おうと思うと、自分でバイナリとライブラリファイルをビルドしなければなりません。手順としては以下のようになります。

  1. Visual Studio 2015用のプロジェクトを作成するために、CMakeをインストールする
  2. OpenCVをダウンロードする
  3. CMakeでOpenCVプロジェクトを作る
  4. Visual StudioOpenCVプロジェクトをビルドして、バイナリとライブラリファイルを生成する

今回の記事ではCMakeをインストールしてOpenCVのプロジェクトを作成するところまで見ていきたいと思います。

 

1. CMakeのインストール

CMakeをダウンロードします。CMakeはソースファイルからビルドすることもできるみたいですが、それには古いCMakeが必要になるので新規でCMakeをインストールする場合は大人しくインストーラー(.msiパッケージ)をダウンロードします。

  • 32ビット環境の場合は、cmake-x.x.x-win32-x86.msi
  • 64ビット環境の場合は、cmake-x.x.x-win64-x64.msi

 

https://cmake.org/download/

f:id:tuttitan:20161227135240p:plain

 

インストーラーをダウンロードしたら、実行してCMakeのインストールを開始します。下図のようなSetup Wizardが出てくるので [Next] をクリックして次へ進みます。

f:id:tuttitan:20161227135732p:plain

 

エンドユーザライセンスに一応目を通して、チェックボタンにチェックを入れてから [Next] をクリックして次へ進みます。

f:id:tuttitan:20161227135837p:plain

 

インストールオプションを選択します。特に問題がないようなら「Add CMake to the system PATH for all users」を選択して、お好みで「Create CMake Desktop Icon」をチェックします。
前者は全ユーザーに対してCMakeのパスを通すという意味になります。
後者はデスクトップにCMakeのショートカットを作成するということになります。

f:id:tuttitan:20161227135942p:plain

 

CMakeのインストール先を指定します。特に問題ないようならDefaultのままでよいでしょう。[Next] をクリックして次へ進みます。

f:id:tuttitan:20161227140255p:plain

 

以上でインストールの準備が整ったことになります。[Install] をクリックしてインストールを開始します。(なお、管理者権限が必要になります)

f:id:tuttitan:20161227140353p:plain

 

インストールはすぐ終わります。

f:id:tuttitan:20161227140506p:plain

 

インストールが完了すると下図のような画面になります。[Finish] をクリックしてインストーラーを終了します。

f:id:tuttitan:20161227140553p:plain

 

 

2. OpenCVのダウンロード

次にOpenCV2.xをダウンロードします。

VERSION 2.4.13 のところで 「OpenCV for Windows」を選択します。

 

http://opencv.org/downloads.html

f:id:tuttitan:20161227141250p:plain

 

ファイル(自己解凍形式)がダウンロードされたら、実行してファイルの中身を展開します。展開先は任意の場所で構いません。

 

OpenCV用にフォルダを作成します。分かりやすい場所でよいと思いますが、私の場合は C:\opencv としました。作成したフォルダに展開したフォルダを移動させます。このとき、OpenCVのバージョンが分かるようにフォルダ名を変更しておいたほうがよいでしょう。

フォルダ構成としては次のようなります。

C:\opencv
└─ opencv-2.4.13
     ├─ build
     ├─ sources
     ├─ LICENSE.txt
     └─ README.md.txt

 

 

3. OpenCV用プロジェクトの作成

Visual Studio 2015 でビルドするためのOpenCVのプロジェクトをCMakeを使って生成します。

 

まずはCMakeを起動します。

上方にある「Where is the source code:」の箇所に先に展開して移動させたOpenCVのsourcesのフォルダを指定します。

「Where to build the binaries:」の箇所にはプロジェクトの生成先を指定します。OpenCVのbuildフォルダを指定すると既存ファイルとごちゃごちゃになるので新たなフォルダを切ります。ここではx64用のプロジェクトを作成したかったので "build_x64"という(存在しない)フォルダを指定しています。

f:id:tuttitan:20161227143917p:plain

 

上方の2つのパスを入力した後、下方にある [Configure] ボタンをクリックします。buildフォルダが存在しない場合は、下図のようにフォルダを作成するか聞かれるので [Yes] と答えます。

f:id:tuttitan:20161227144605p:plain

 

何用のプロジェクトにするか聞かれるので、32bit用の場合は「Visual Studio 14 2015」、64bit用の場合は「Visual Studio 14 2015 Win64」をプルダウンリストから選択します。

「Optional toolset to use」は空白のままで、コンパイラの選択は「Use default native compilers」のままでよいでしょう。

[Finish] をクリックすると Configureが始まります。

f:id:tuttitan:20161227145420p:plain

 

Configureしています...

f:id:tuttitan:20161227145604p:plain

 

Configureが完了すると、下図の様な画面になります。画面中央にある赤地のところのチェックボックスによってプロジェクトの設定を行なっていくのですが、普段使いならそのままでよいでしょう。

[Configre] のとなりにある [Generate] をクリックすると、Visual Studio用のプロジェクトが生成されます。

f:id:tuttitan:20161227145953p:plain

 

Generate が完了すると下図のような画面になります。[Generate] のとなりにある [Open Project] をクリックすると生成されたプロジェクトが Visual Studio 2015 で開かれます。

f:id:tuttitan:20161227150535p:plain

 

プロジェクトはbuildフォルダ(今回の場合は C:\opencv\opencv-2.4.13\build_x64)の下に "OpenCV.sln" という名前で生成されています。

 

OpenCV.sln をビルドして、OpenCVバイナリとライブラリファイルを生成する話は次回に書きたいと思います。

 

 

参考Webページ

秋イベを振り返る。その7

艦これ秋イベント2016の話です。
E4海域で輸送が完了すると、部隊は左から右へと移りいよいよ殲滅作戦の攻略となります。

編成によって道中4戦ルート、5戦ルート、6戦ルートとあるのですが、最も安定していた4戦ルートで攻略を進めました。

いずれにしても道中には、

  • 防空カットイン不発で一発退場の航空戦マス
  • 艦隊支援も先制攻撃も通用しない潜水艦マス
  • 軽量編成では歯が立たないフラルマス

があり、ようやくボスに辿り着けたとしても通常艦隊で連合艦隊(敵)を相手にしなければならなく本イベント屈指の難易度でした。

はじめは難易度甲でやっていたのですが、ラスダン編成になった途端 異次元の難易度に...(ボス随伴艦のWフラヲ改が明らかに無理)
甲種のクリア報酬が試製甲板カタパルトで手に入れたかったのですが、イベント終了期限も迫っていたので乙種に難易度を下げて攻略しました。

 

キラ付けして道中支援出しても、5戦ルートは決まってRマスのフラヲ改にやられるかSマスのフラルにやられていたので4戦ルートで進行。航空戦マスで事故があったもののキラキラが付いていれば基本的にボスまでは辿り着けました。(甲種の場合は、辿り着けないほうが多かったけど)

f:id:tuttitan:20161208152718p:plain

 

編成は高速統一で、戦艦もしくは正規空母は1隻までというシビアさ。

普段はキラ付けは面倒なため「しない派」なのですが、この海域はキラキラなしでは突破不可なんじゃないかと思いました。