著者アーカイブ 杉浦

著者:杉浦

地理院地図(電子国土Web)

 地理院地図(電子国土Web)は国土地理院の公開している電子地図です。3D版に地理院地図globというものもあります。
 
 国土地理院というだけあって日本に縁の深い情報と地図を絡めて表示する機能がとても優れています。下図の様な地域の避難場所を始めとして、日本の歴史、地理、災害、土地の特徴など様々です。

 単にこの画面だけのサービスでも有用ですが、ソースコードの公開、よく使われるライブラリとの連携方法などの説明もあり、開発者向けでもあります。

著者:杉浦

ダミーデータ作成サービスMockaroo

 Mockaroo – Random Data Generator and API Mocking Tool | JSON / CSV / SQL / Excel
 Mockarooは様々なダミーデータを作成してくれる基本無料サービスです。無料ではダウンロード数の限界が1000個に制限されます。有料の場合、10万個、1億個などの大容量のデータを作成することができ、無料に比べて高速にダウンロードできます。無料でも簡単な動作テストに使用する程度ならば問題ありません。

 リンク先のタイトルにある様にMockarooはJSON、CSV、SQLを始めとして様々なフォーマットでダミーデータを作成できます。

また、Fxの関数マークからデータの欠け率やバイアス、偏りなども細かく指定できます。式のヘルプ

 このデータの指定部分も無料で使用可能な機能に含まれています。小さなデータであれば大体無料で不自由なく作ることが可能です。

著者:杉浦

文字コードを利用して文字をforで回す

 文字コードは文字を数字で扱う仕組みです。各数字と各文字が一対一の関係で対応しています。この記事では文字コードの一つであるASCIIを利用します。ASCIIの対応の大きな分類は次の表のとおりです。ASCII – Wikipediaより引用

コード範囲(16進) 内容
00-1F 制御文字
20 空白
21-7E 図形文字
7F 制御文字(DEL)

 図形文字はいくつかの記号とa-zA-Z0-9、おおざっぱにはキーボードのローマ字入力で直接打てる文字です。キーボードに詳しくないのでまあ多分そんなものぐらいの気持ちで。Ascii Table – ASCII character codes and html, octal, hex and decimal chart conversion
 知る限りのプログラミング言語にはこのASCIIと数字を変換する機能が備わっています。これを利用すると文字列をforで回せます。Excelシートと関係のあるプログラムを書いたりする時、特に便利です。最近よく使用している言語であるphp,javascriptでの例が次です。
 phpならばchr関数を利用して次の様な感じです。PHP: chr – Manual

<?php
for($i = 97;$i <= 122;$i++){
    echo chr($i);
}
for($i = 65;$i <= 90;$i++){
    echo chr($i);
}


javascriptならばString.fromCodePoint()関数を利用して次の様な感じです。String.fromCodePoint() – JavaScript | MDN

String.fromCodePoint.apply(null,Array.from({ length: 26 }, (_, i) => i+65));
String.fromCodePoint.apply(null,Array.from({ length: 26 }, (_, i) => i+97));

著者:杉浦

変数名等の命名サービスcodic

 codicはコーディング中の命名を楽にしてくれるサービスです。
プログラマーのためのネーミング辞書 | codic”

使い方は簡単。左側に日本語を入れると対応する英語が出てきます。各行が1対1で対応しており、余計な操作なく多数の語を変換できます。左上の記法ボタンからスネーク記法、キャメル記法、ハイフン区切りなど記法を切り替えることができます。

 codicはgoogle翻訳の様な一般の翻訳ツールと異なり命名用と目的が狭く、明確です。そのためちょっとした記法で、出力を限定できる機能が備わっています。
 ”~する”と動詞で結ぶことで、メソッド名になります。

 ”~か”と結ぶことで、真偽値を返すメソッド名になります。

 ”辞書s”のように名詞の後にsをつけることで複数形に変換されます。

 コーディングにおける命名用の翻訳のため通常の翻訳と異なるコーディング用の翻訳をしてくれます。

 英単語をクリックすると他の候補と簡単な英和辞書へのリンクが出現します。

著者:杉浦

様々な高さの定義

 ある地点の地上からの高さを同じ物差しでできる限り正確に測るためにいくつかの高さの定義がされてきました。この記事ではそれらを紹介します。紹介する高さは楕円体高、ジオイド高、標高(海抜)です。
 楕円体高は地球を純粋な楕円体として仮定した場合、地球楕円体と対象の地点との高さを表します。2018/08/15の日本ではGRS80地球楕円体を用いています。GNSSではWGS84地球楕円体を用いています。GRS80とWGS84のそれぞれが表現する地球はとても近く、同じものと扱っても大きな問題は起こりにくいです。GNSSの出力する高度はWGS84地球楕円体を用いた楕円体高です。GNSSを用いて現地点の地上からの標高を知るためには少し手間がかかります。
 ジオイド高はジオイドの楕円体高です。ジオイドとは、海が地球を包み、海が重力の影響のみを受けていると仮定した時、その海面が落ち着いた時に成す面のことです。近年では高精度なGNSSを用いて測量を行うことでジオイド高が求められています。ジオイド測量の概要|国土地理院
 標高はジオイドからある地点までの高さです。標高は海抜とも呼ばれます。
 三者を図解すると次の図の様になります。
 
 ジオイドとは|国土地理院から引用
 GNSSが出力する高さは楕円体高です。このため標高を求めるためにはジオイド高が必要となります。日本各所のジオイド高は国土地理院が無償で提供してくれています。
 ジオイド計算
 ジオイド・モデルの提供|基盤地図情報ダウンロードサービス※要利用登録

著者:杉浦

PHPを例にした正規表現の再帰

 正規表現によって多重括弧のような入れ子構造を表現することは難しいです。正規表現の難題、入れ子構造
 入れ子構造が正しいことを示すにはスタックのデータ構造を表現することが望ましいですが、通常の正規表現ではスタックを用いることはできません。一部の正規表現エンジンにのみ備わっている再帰機能によってスタック構造を表現できます。再帰機能を備えた正規表現を使用可能な環境にはPHP、python、ruby、一部テキストエディタなどがあたります。正規表現のみに頼らないで文字列操作コードを書くことが可能なプログラミング言語では実装されていない場合が少なくないです。次の正規表現はPHPで動作する正規表現です。PHP: 再帰的パターン – Manual

/\((?:[^\(\)]+|(?R))*\)/

 (?R)が再帰の記号です。この時点で再度正規表現全体を呼び出します。これは最大の大きさで成立している括弧を抜き出す目的の正規表現です。動作結果は下図の通りです。
 
 詳しい動作の過程は次の通りです。この過程の説明はPHP Recursive Patterns – Stan Angeloff’s blogの説明の仕方を大きく参考にしています。


/
  \(          # 開き括弧 '(' を見つける.
    (?:       # 新しいグループの開始。これをしないと最初と最後の'('と')'が|に巻き込まれる。
      [^\(\)]+# '('でも')'でもない文字をどん欲に消費する。
      |       # or
      (?R)    # '('か')'を読んだら、また最初から。再帰処理。
    )
    *         # 可能な限り深いのネストを探索する.
  \)          # '('に対応する閉じ括弧 ')' を見つける.
/
著者:杉浦

WWW上のページをアーカイブし続けているWayback Machine

 Wayback MachineInternet Archiveが保存するウェブアーカイブを閲覧することのできるサービスです。Internet Archiveは書籍、映像、ソフトウェア、音楽、ウェブサイトなどのコンテンツをアーカイブしている団体です。そのデータ量は2016年10月時点で15ペタバイトを超えていました。これらのコンテンツはアメリカの著作権法に則って収集されているため、おおよそ問題ありません。特に規模が大きいためか国、団体によっては問題視される場合もあります。
 Wayback Machineは過去にさかのぼってウェブページを見るためのサービスです。これを利用することでリンク切れのページや、更新前のページを見ることが出来ます。googleのキャッシュ機能との最大の違いは再現するページの時期を決めてくれることです。
 
 保存の日取りや仕方がまちまちで目当てのものが無い時も少なくないですが、最近ではphp4やphp5の始めあたりまでよく使われていたらしいxml用のphpライブラリの版元ページを参照することで役に立ってくれました。

著者:杉浦

javascriptにおける型変換による計算のさわり

 javascriptは型変換を行うことによって記述から予想される実行結果と実際の実行結果が異なることが起きやすい語です。それぐらい大きく変化の起きる型変換を用いた小ネタです。

+[]

 これの実行結果が
 
 です。javascriptは正負の様な数式符号がついた対象を数字として扱う動作があります。大体、空っぽい対象は0、trueっぽい対象は1として評価されます。そのためこの様な結果になります。これを利用すると次の様なこともできます。

 この手の型変換をこれでもかと利用した方法に記号プログラミングというものがあります。例えば、Aを表すコードは次になります。

(([][($+[])[-~-~-~[]]+(({})+[])[-~[]]+([][![]]+[])[-~[]]+(![]+[])[-~-~-~[]]+(!![]+[])[+[]]+(!![]+[])[-~[]]+($+[])[-~[]]+($+[])[-~-~-~[]]+(!![]+[])[+[]]+(({})+[])[-~[]]+(!![]+[])[-~[]]])+[])[-~-~-~[]*-~-~-~[]]
著者:杉浦

ブラックリスト方式とホワイトリスト方式

 何かを受け入れる、受け入れないという処理を行う時、処理の対象と仕方のリストを作成することになります。リストにはブラックリスト方式とホワイトリスト方式があります。
 ブラックリスト方式は、基本的に受け入れを行い、リストに載っている対象のみを受け入れない方式です。
 ホワイトリスト方式は、基本的に受け入れを行わず、リストに載っている対象のみを受け入れる方式です。
 対象の領域が広いリストになってくると両方が組み合わさったような印象のリストができあがったりもします。例えば、ファイアウォールです。通信はプロトコル、送信先/元のIPアドレスとポートなどの要素で分類できます。

if(プロトコルがhttps){
	if(送信元アドレスが以前攻撃してきた相手Aのアドレスではない){
		受信する
	}
	if(送信元アドレスが以前攻撃してきた相手Bのアドレスではない){
		受信する
	}
}
受信しない

 上のコードの場合、大本はプロトコルhttpsのみを認めるホワイトリスト方式ですが、最初のifを過ぎた後は以前攻撃してきた相手のアドレスを弾くブラックリスト方式です。プロトコルhttpsの範囲が広く、リスト中のリストが作れるため、この様になります。
 リストを使用するシステムで問題が起きる時、その原因はよくリストの漏れにあります。リストの漏れによって起きる動作は、ブラックリスト方式が異常な対象を受け入れる、ホワイトリスト方式が正常な対象を弾く、です。異常な対象を受け入れた時に起きる問題の規模が大きければ大きいほど、ホワイトリスト方式を選ぶ理由が大きくなります。
 リストの変更頻度を抑えるという方針を考えた場合、新たに現れた分類の様なリストに載せられない未知の対象に対する振る舞いの定義が土台のリストの方式を決定づけます。とりあえず受け入れるならブラックリスト、弾くならホワイトリストです。

著者:杉浦

機械学習によるクラスタリングの一手法であるk-means法

 k-means法は任意のデータをk種類のクラスタに分割する手法です。クラスタは集まりを意味する語でクラスやグループと同じようなものです。k-means法によってクラスタリングを行った際、グループは距離で分割されます。k-means法のアルゴリズムは次です。
1.ランダムにk個のクラスタ中心を振り分ける。
2.各データと各クラスタ中心の距離を求めて、データを最も中心の近いクラスタに振り分ける。
3.振り分け直されたデータによるクラスタ毎の中心を求める。
4.2,3を繰り返す。繰り返しをやめる時は変化がなくなるか、あらかじめ定めた閾値以下の微小な変化しかしなくなった時。
数式にすれば

x:各データ V:各クラスタ中心
です。具体的に画像で見てみると次です。
1.ランダムにk個のクラスタ中心を振り分けます。

2.各データと各クラスタ中心の距離を求めて、データを最も中心の近いクラスタに振り分ける。

3.振り分け直されたデータによるクラスタ毎の中心を求める。

2.各データと各クラスタ中心の距離を求めて、データを最も中心の近いクラスタに振り分ける。

3.振り分け直されたデータによるクラスタ毎の中心を求める。

2.各データと各クラスタ中心の距離を求めて、データを最も中心の近いクラスタに振り分ける。

3.振り分け直されたデータによるクラスタ毎の中心を求める。

4.繰り返しをやめる。
まとめて

 k-means法はクラスタに所属するデータとクラスタ中心の最大距離の近いk個のクラスタを自動生成する手法です。kは任意であり、k-mean法の使用者が任意に決定します。kを自動決定するように拡張されたx-means法という手法もあります。