くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

python

サロゲートとIVSの正規表現

サロゲートとIVSの正規表現まとめ。

IVS含めたものってなかなか見ないので。

どうなんだろ。皆どうやってるんでしょね。


サロゲートのコード範囲

上位サロゲート:U+D800-U+DBFF

下位サロゲート:U+DC00-U+DFFF

IVSのコード範囲

32bit表現:U+E0100-U+E01EF

で、これの16bit表現がなかなか出てこなくて困った。

なので計算して求める。とりあえず結果。

16bit表現:U+DB40 [U+DD00-U+DDEF]


なので、正規表現は下の感じ。

// javascript

// サロゲートがあるかどうか
str.match(/([\uD800-\uDBFF][\uDC00-\uDFFF])/)

// IVSがあるかどうか
str.match(/(\uDB40[\uDD00-\uDDEF])/)

// サロゲート+IVSがあるかどうか
str.match(/([\uD800-\uDBFF][\uDC00-\uDFFF])|(\uDB40[\uDD00-\uDDEF])/)

// サロゲートを含む文字列を一文字ずつの配列にする
str.match(/([\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF])/g)

// サロゲート+IVSを含む文字列を一文字ずつの配列にする
str.match(/([\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF])(\uDB40[\uDD00-\uDDEF])?/g)

32bit表現が使える場合は下の感じ

//Python

// サロゲート+IVSを含む文字列を一文字ずつの配列にする
re.findall('([\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF])[\U000E0100-\U000E01EF]?', strs)


IVSの32bit表現を16bit表現にする計算。

計算方法:wiki : 拡張領域→サロゲートペアの項

0xE0100            1110 0000 0001 0000 0000
0xE01EF            1110 0000 0001 1110 1111

上をサロゲートペアとしてエンコーディング

①0x10000を引く

 0xE0100            1110 0000 0001 0000 0000
-0x10000            0001 0000 0001 0000 0000
=0xD0100            1101 0000 0001 0000 0000

 0xE01EF            1110 0000 0001 1110 1111
-0x10000            0001 0000 0001 0000 0000
=0xD01EF            1101 0000 0001 1110 1111

➁これを上位10ビット値と下位10ビット値に分割する。

0xD0100            1101 0000 00(0x0340)    01 0000 0000(0x0100)
0xD01EF            1101 0000 00(0x0340)    01 1110 1111(0x01EF)

➂ハイサロゲート形成として上位ビットに0xD800を加える。

 0x0340            0000 0011 0100 0000
+0xD800            1101 1000 0000 0000
=0xDB40            1101 1011 0100 0000

 0x0340            0000 0011 0100 0000
+0xD800            1101 1000 0000 0000
=0xDB40            1101 1011 0100 0000


④ローサロゲート形成として上位ビットに0xDC00を加える。

 0x0100            0000 0001 0000 0000
+0xDC00            1101 1100 0000 0000
=0xDD00            1101 1101 0000 0000

 0x01EF            0000 0001 1110 1111
+0xDC00            1101 1100 0000 0000
=0xDDEF            1101 1101 1110 1111

⑤上記から

0xE0100 ⇒ \uDB40\uDD00
0xE01EF ⇒ \uDB40\uDDEF

⑥なのでコードの範囲は下位8bitの範囲(00-EF:240個)として表現しちゃってよい(上16bit分は固定)ので下記正規表現

\uDB40[\uDD00-\uDDEF]

DjangoとApacheとWSGIとWindows

Windows上でDjangoで作ったアプリをApacheからWSGIで呼べるようにする。

まーWindowsはいばらの道じゃ。

とりあえず必要な資源をダウンロードしておく。ApacheとかPythonとか。PythonはPIPとVirtualEnvも。

①Djangoで適当にアプリを作る。

仮想環境つくる
virtualenv venv

仮想環境での作業に変える
cd venv
Scripts\activate

Djangoをインスト
pip install django

Djangoのバージョン ⇒ 今回は2.0.6
python -m django --version

アプリを作る
django-admin startproject mysite

とりあえず動かして確認 ⇒ http://127.0.0.1:8000/
cd mysite
python manage.py runserver

②Apacheの準備

1.ダウンロードしたZipを適当なフォルダに展開しておく
2.confファイルの変更(Apache24\conf\httpd.conf)
 ⇒ デフォでC:\Apache24みたいになってるところを格納したフォルダのパスに全部変える。
3.動作確認 : コマンドプロンプト上でbin/httpd.exeで動かしたら「http://localhost」にアクセス
 ⇒ IT WORKS!!って出ればOK。ポート変えてる時はURLは適宜変える。

そしたら、胆のmod_wsgiのインスト。仮想環境上でやってもいいかもだけど、自分は本体(って言い方であってんのかな)の方にインストした。windowsでインストールするやり方は昔はアレコレ大変だったようですが、今は割と楽。調べてて、昔のやり方ではまりそうになったんだけど、mod_wsgiのGitのReadmeにちゃんと書いてあった。やっぱ一次情報をちゃんと読まないとダメですね。これには大部分が昔のやり方で載ってるんだけど、一番上にここに載ってる事はもうやんなって書いてありましたね。

で、今のやり方は↓。

pip install mod_wsgi

これだけ。随分楽になったようで。・・・が、ApacheをC:の直下に展開してないとエラーが出ると言う罠。「No Apache installation can be found. Set the MOD_WSGI_APACHE_ROOTDIR environment to its location.」っていうエラーが出る。C:直下以外にある場合は、この環境変数setしてからじゃないとダメっぽいですね。stackoverflowに質問もあった。 という事で、C:直下以外にある場合は↓の感じ。

set "MOD_WSGI_APACHE_ROOTDIR=F:\Apache32\Apache24"
pip install mod_wsgi

で、Apacheには32bit版と64bit版があるんですが、64bit版だとこれでもまだ変なエラーがでる。あきらめて32bit版にしましたとさ。。。

あと、自分のPCにはVisualStudio2017も入ってるんですが、上記のStackOverflow見てると、VisualStudio入ってないとダメそう?mod_wsgiのインストールの中で、コンパイルしてるっぽい?

インストール出来たら↓。

mod_wsgi-express module-config

上記のコマンド実行すると↓感じの設定文字列が出てくるので、これをApacheのhttpd.confにコピペする。

LoadFile "f:/python36/python36.dll"
LoadModule wsgi_module "f:/python36/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win32.pyd"
WSGIPythonHome "f:/python36"

そしたら、あとはDjangoの公式に載ってる設定をhttopd.confに追加しておしまい。最終的にhttpd.confに追記するのは↓。

LoadFile "f:/python36/python36.dll"
LoadModule wsgi_module "f:/python36/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win32.pyd"

WSGIPythonHome "f:/py/venv"
WSGIScriptAlias /mysite "f:/py/venv/mysite/mysite/wsgi.py"
WSGIPythonPath "f:/py/venv/mysite"

<Directory f:/py/venv/mysite/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

WSGIPythonHomeはDjangoを使ってる仮想環境のルートを指定するっぽいですよ。これで、WSGIScriptAliasで指定してるURLにアクセスすればDjangoが動くという寸法です。ただ、なんだかデフォのままだとトップページが出ないぽいので、「/mysite/admin/」みたいに中のURLまで行かないとダメな感じ?あんま調べてない。まー動いたから良しとしよう。

あーあと、MariaDB使ってるんですが、開発環境上だと「pip install PyMySQL」だけで動くんだけど、Apache通すと動かない。エラーログに「Did you install mysqlclient?」って出てくるから「pip install mysqlclient」でインストールしたら動くようになった。なんだろね。。。

問合せ