Perl Numeric Literal

perlの数値リテラルについて調べたのでまとめておく。

プログラミングPerl

$x = 12345;               # 整数
$x = 12345.67;            # 浮動小数点数
$x = 6.0e23;              # 科学的記法
$x = 4_294_967_296;       # 下線をつかって読みやすくする
$x = 0377;                # 8進数
$x = 0xfff;               # 16進数
$x = 0b1100_0000;         # 2進数

プログラミングPerl - 2.6.1 数値リテラル より

Inf, NaN

$x = 'inf';        # 無限大
$x = '-inf';       # 負の無限大
$x = 'nan';        #

Infinityも認識される。大文字と小文字の区別なし。

Perlで文字列が数値かどうか判定するには

1. 最良の方法?

!( $n == 0 && $n ne "0" )

warningが出る...Argument "String" isn't numeric in numeric eq (==)

2. looks_like_number()

Scalar::Util::looks_like_number()

正規表現にしてみた

my $rx_integer = qr/(?:[0-9_]+)/;
my $rx_decimal = qr/(?:[0-9_]+\.[0-9_]+)/;

my $rx_number = qr{ 
    (?: (?:-)* inf (?:inity)* )
    |
    nan 
    |
    0(?:
        (?:x[0-9a-f_]+)
        |
        (?:b[0-9_]+)
        |
        (?:[0-7_]+)
    )
    |
    (?: $rx_decimal|$rx_integer) e[+|-]? $rx_integer )
    |
    $rx_decimal
    |
    $rx_integer
}xi;


参考:
perldata - Perl のデータ型 - perldoc.jp
looks_like_number() - Perl日記

Perl Infinity&NaN

perl-5.6.1以上なら、InfinityとNaNが扱えるらしい。

> 1e1000
inf

> 'inf' + 1
inf

> 'inf' * -1
-inf

>'inf'-'inf'
nan


数値リテラルとして認識されるのは

inf  <- /inf(inity)*/i
-inf <- /-inf(inity)*/i
nan  <- /nan/i


数値としては、inf, -inf, nanとして保存される。

> my $inf = "Infinity";
Infinity

> $inf += 0;
inf


ただし、0除算はerrorになる。

> 1 / 0
Illegal division by zero.

> 1 % 0
Illegal modulus zero.

参考:
looks_like_number() - Perl日記
perl561delta - perldoc.perl.org

OruxMapsでGoogle Map Hybridを使う

Google Map Hybridを使う方法。

/mnt/sdcard/oruxmaps/mapfiles/onlinemapsources.xml

に以下の分を追加する。

<onlinemapsource uid="1">
	<name>Google Maps Hybrid</name>
	<url><![CDATA[http://mt{$s}.google.com/vt/lyrs=y&hl=ja&x={$x}&y={$y}&z={$z}]]></url>
	<minzoom>0</minzoom>
	<maxzoom>19</maxzoom>
	<projection>MERCATORESFERICA</projection>
	<servers>0,1,2,3</servers>
	<httpparam name=""></httpparam>
	<cacheable>1</cacheable>
	<downloadable>1</downloadable>
	<maxtilesday>0</maxtilesday>
	<maxthreads>0</maxthreads>
	<xop></xop>
	<yop></yop>
	<zop></zop>
	<qop></qop>
</onlinemapsource>

OruxMapsでGoogle Earthを使う

OruxMapsでgoogle mapを使う - tattii's blogの第2弾。

OruxMapsでGoogle Earthを表示する方法。

/mnt/sdcard/oruxmaps/mapfiles/onlinemapsources.xml

に以下の分を追加する。

<onlinemapsource uid="2">
    <name>Google Earth</name>
    <url><![CDATA[http://khms0.google.com/kh/v=149&src=app&x={$x}&y={$y}&z={$z}]]></url>
    <minzoom>0</minzoom>
    <maxzoom>18</maxzoom>
    <projection>MERCATORESFERICA</projection>
    <servers>0,1,2,3</servers>
    <httpparam name=""></httpparam>
    <cacheable>1</cacheable>
    <downloadable>1</downloadable>
    <maxtilesday>0</maxtilesday>
    <maxthreads>0</maxthreads>
    <xop></xop>
    <yop></yop>
    <zop></zop>
    <qop></qop>
    <sop></sop>
</onlinemapsource>


Android端末内のファイルを編集するには、AirDroidを使って一度パソコンにファイルをダウンロードして、編集したファイルを同じ場所にアップロードするのが簡単。

CentOSでPostgreSQLのデータベースの格納場所を変更する

CentOSPostgreSQLをインストールしてデータベースの格納場所を変更するときにSELinuxではまったので、やったことのメモ。

環境

CentOS 6.4
PostgreSQL 9.3.4
SELinux Enforcing

データベース格納場所

デフォルト: /var/lib/pgsql
変更先: /home/pgsql

1. ディレクトリ作成

# mkdir /home/pgsql/data

2. 所有者、パーミッション変更

# chown -R postgres:postgres /home/pgsql
# chmod -R 700 /home/pgsql

3. PostgreSQLの設定ファイル編集

# vim /etc/sysconfig/pgsql/postgres
PGDATA=/home/pgsql/data
PGLOG=/home/pgsql/data/pgstartup.log

4. データベース初期化

# su postgres -c "initdb -D /home/pgsql/data"

5. SELinuxのコンテキスト設定

PostgreSQLのデータベースには postgresql_db_t ラベルが必要。

# semanage fcontext -a -t postgresql_db_t "/home/pgsql(/.*)?"
# restorecon -R /home/pgsql

6. SELinuxポリシー設定

postmaster(postgresqlの実行プロセス)が/homeにアクセスできるよう設定する。
(違う場所にデータベースを格納する場合も、/から格納場所までのすべてのディレクトリに以下のような設定が必要)

postmasterのドメインpostgresql_t
/homeのタイプは home_root_t

6.1. ポリシー・ソースファイル作成

適当な場所にpostgres_local.teを作成

# vim postgres_local.te

module postgresql_local 1.0;

require {
    type postgresql_t, home_root_t;
    class dir { search getattr };
}

allow postgresql_t home_root_t:dir { search getattr };
6.2. モジュールのコンパイル、インストール
# checkmodule -M -m -o postgres_local.mod postgres_local.te
# semodule_package -o postgres_local.pp -m postgres_local.mod
# semodule -i postgres_local.pp

7. 起動

# service postgresql start
Starting postgreSQL service:                 [  OK  ]

OKと出れば起動成功。



参考
11.4. 設定例

OruxMapsでGoogle Mapを使う

OruxMapsがめっちゃ高機能ですごい。

でも、そのままではgoogle mapを見れないので追加する方法を調べた。

/mnt/sdcard/oruxmaps/mapfiles/onlinemapsources.xml

というファイルを開いて、以下の分を追加するだけ。

<onlinemapsource uid="0">
	<name>Google Maps</name>
	<url><![CDATA[http://mt{$s}.google.com/vt/lyrs=m@121&hl=ja&x={$x}&y={$y}&z={$z}]]></url>
	<minzoom>0</minzoom>
	<maxzoom>19</maxzoom>
	<projection>MERCATORESFERICA</projection>
	<servers>0,1,2,3</servers>
	<httpparam name=""></httpparam>
	<cacheable>1</cacheable>
	<downloadable>1</downloadable>
	<maxtilesday>0</maxtilesday>
	<maxthreads>0</maxthreads>
	<xop></xop>
	<yop></yop>
	<zop></zop>
	<qop></qop>
</onlinemapsource>

これでオフラインの地図も保存できるようになる。

参考: 2013-11-10 - 左利きの憂鬱

追記: Google Mapの他の地図を使う方法について

Google Earth (航空写真) - OruxMapsでGoogle Earthを使う - To The Sky!
Google Map Hybrid (航空写真+道路地図) - OruxMapsでGoogle Map Hybridを使う - To The Sky!

Hybridがおすすめ。