著者アーカイブ 杉浦

著者:杉浦

文字コードを利用して文字を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法という手法もあります。

著者:杉浦

インターネット上の技術仕様をまとめているRFC

 RFC(Request for Comments)はインターネット上の技術仕様をまとめているサイトです。2018/08/07におけるRFCのページには次の様にあります。

RFCs cover many aspects of computer networking, including protocols, procedures, programs, and concepts, as well as meeting notes, opinions, and sometimes humor.

 RFCは多岐にわたるインターネット技術の多くの側面をカバーしています。HTTPの様なプロトコルの定義に始まり、手続き、プログラム、コンセプト、議事録、ユーモアなどです。ユーモアにはタイトルだけで落ちているようなRFC1149 – 鳥類キャリアによる IP データグラムの伝送規格洗濯バサミ DHCP による IP アドレスの管理手法といったものがあります。
 最近、へぇ~となったのはメールアドレスの規格であるRFC 5321 – Simple Mail Transfer Protocolです。具体的な強制力はありませんが、大体これに従っています。注目するのは4.1.2節のCommand Argument Syntax、メールアドレスの構文です。メールアドレスといえば、@で前後を区切られるアドレスで@はメールアドレス中に一つだけとなんとなく思っている人が多いはずです。RFC 5321には次の様に記述されています。

   Mailbox        = Local-part "@" ( Domain / address-literal )

   Local-part     = Dot-string / Quoted-string
                  ; MAY be case-sensitive

...

   Quoted-string  = DQUOTE *QcontentSMTP DQUOTE
   
   QcontentSMTP   = qtextSMTP / quoted-pairSMTP

   quoted-pairSMTP  = %d92 %d32-126
                    ; i.e., backslash followed by any ASCII
                    ; graphic (including itself) or SPace

   qtextSMTP      = %d32-33 / %d35-91 / %d93-126
                  ; i.e., within a quoted string, any
                  ; ASCII graphic or space is permitted
                  ; without blackslash-quoting except
                  ; double-quote and the backslash itself.

 読み方は変数を当てはめていく感じです。

Mailbox = Local-part "@" ( Domain / address-literal )
Mailbox = (Dot-string / Quoted-string) "@" ( Domain / address-literal )
Mailbox = (Dot-string / DQUOTE *QcontentSMTP DQUOTE) "@" ( Domain / address-literal )
Mailbox = (Dot-string / DQUOTE *(qtextSMTP / quoted-pairSMTP) DQUOTE) "@" ( Domain / address-literal )
Mailbox = (Dot-string / DQUOTE *((%d32-33 / %d35-91 / %d93-126) / quoted-pairSMTP) DQUOTE) "@" ( Domain / address-literal )
 括弧の中の注目する部分だけ残して
Mailbox = DQUOTE *(%d32-33 / %d35-91 / %d93-126) DQUOTE "@" ( Domain / address-literal )

 %3aから%40までには広く使われる記号が入っており、@も含まれています。DQUOTE、つまり”で括ればこれらも使えるので”@@@@@”@gmail.comなんてアドレスもRFCに準拠するメールアドレスになります。もっとも、””で括ったメールアドレスはあまり一般的とはいえず、インターネット上の少なくない場所で弾かれます。小ネタでした。

著者:杉浦

頻繁に変わる一部分を抽出することによる関数化

 プログラミングを行う時、何を関数やクラスにすると楽ができるか、のちに使いやすくなるか、という判断のために抽出による判断ができます。抽出という言葉は抽出とは – 難読語辞典 Weblio辞書では次の様に載っています

ちゅう しゅつちう- [0] 【抽出】

( 名 ) スル

全体の中から、ある物を抜き出すこと。 「リストから条件を満たす物を-する」
固体または液体混合物溶媒加え混合物中の特定の成分溶媒中へ分離する操作。この操作後に得られる溶媒部分を抽出液という。溶媒抽出



 何らかの大きな問題を解く時、頻繁にある一部分のみが変わる同じような小さな問題を解くことになりやすいです。例えば問題が”Weblio辞書で数字の1から10までの意味を調べる”なら”Weblio辞書で数字の1の意味を調べる”,”Weblio辞書で数字の2の意味を調べる”,…です。これを更にブラウザ上の操作に分解すると”Weblio辞書を開く。”、”Weblio辞書で数字の1を検索バーに入力する。”、”検索ボタンを押す。”、”意味を読む。”になります。”Weblio辞書を開く”は最初の一度のみですが他を繰り返すだけで書き下されたコードは大変なことになります。


"Weblio辞書を開く。"
"Weblio辞書で数字の1を検索バーに入力する。"
"検索ボタンを押す。"
"意味を読む。"
"Weblio辞書で数字の2を検索バーに入力する。"
"検索ボタンを押す。"
"意味を読む。"
"Weblio辞書で数字の3を検索バーに入力する。"
"検索ボタンを押す。"
"意味を読む。"
"Weblio辞書で数字の4を検索バーに入力する。"
"検索ボタンを押す。"
"意味を読む。"
"Weblio辞書で数字の5を検索バーに入力する。"
"検索ボタンを押す。"
"意味を読む。"
"Weblio辞書で数字の6を検索バーに入力する。"
"検索ボタンを押す。"
"意味を読む。"
"Weblio辞書で数字の7を検索バーに入力する。"
"検索ボタンを押す。"
"意味を読む。"
"Weblio辞書で数字の8を検索バーに入力する。"
"検索ボタンを押す。"
"意味を読む。"
"Weblio辞書で数字の9を検索バーに入力する。"
"検索ボタンを押す。"
"意味を読む。"
"Weblio辞書で数字の10を検索バーに入力する。"
"検索ボタンを押す。"
"意味を読む。"

 読み難いです。分解した小さな問題の頻繁に変わる1~10の部分のみを抽出して、”Weblio辞書で数字の$nの意味を調べる”という関数に適宜挿入するコードは次の様になります。

function look_up_number_in_weblio($n){
	"Weblio辞書で数字の$nを検索バーに入力する。"
	"検索ボタンを押す。"
	"意味を読む。"
}
"Weblio辞書を開く。"
look_up_number_in_weblio(1);
look_up_number_in_weblio(2);
look_up_number_in_weblio(3);
look_up_number_in_weblio(4);
look_up_number_in_weblio(5);
look_up_number_in_weblio(6);
look_up_number_in_weblio(7);
look_up_number_in_weblio(8);
look_up_number_in_weblio(9);
look_up_number_in_weblio(10);

 さっくり全部読めるようになりました。