カテゴリーアーカイブ 未分類

著者:杉浦

厳密な正規表現による高速化

 正規表現は文字列の集合を一つの文字列で表せる便利な手法で、様々な言語、アプリに実装されています。
 大体の正規表現の行いは文字列の前方から正規表現とのマッチを順に探して弾かれたら終了というわかりやすいものです。また、正規表現のマッチングにはループが行われることが少なくないです。このため厳密に書かれた正規表現は雑に書かれた正規表現より格段高速に動きやすいです。極端な例として次の正規表現があります。

(.*),(.*),(.*),(.*)\r\n

 この正規表現中の()は変数に代入する目的の()です。$1に一つ目のカッコの中身が、$2に二つ目の…といった具合です。正直なところ、csvファイルを読み取る時に私が書いてしまったことのある正規表現です。実際は40列以上のフォーマットでしたのでもっとろくでもない正規表現になっていました。(想定した数以上の列があっても正しいとしてしまうため、速度以外でもろくでもないです)この正規表現は、一行の終わり近くまでを任意文字として読み取っては”,”の数が足りずに最初に戻って、また任意文字として長大な読み取りを行っては”,”の数が足りずに最初に戻って…と繰り返します。こんなことをすれば実行時間が長くなって当然でしたね。この例の()の中の様な部分を厳密に記述することによって、試行されるマッチングがすぐに破棄されるようになり、結果高速化が実現します。例えば

(\d\d),(\d\d),(\d\d),(\d\d)\r\n

とすれば.*によって引き起こされたループすら行われなくなります。

  • この記事いいね! (0)
村上 著者:村上

【MySQL】集計した値を日付けごとにグループ化して抽出する方法

タイトル通り、ログイン数の合計などの集計したいデータを日付けごとにグループ化して抽出するためのMySQLの書き方です。
これを使うことで、日ごとの投稿数とか、日ごとのログイン数がサクッととれるので、かなり重宝しています。
なお、この抽出を行うためには、数えたいカラムと日付を保存したカラムがある必要があります。

 

SQL文はこちら。

SELECT date_format([日付のカラム],'%Y%m%d'),count([カウントしたいカラム名]) FROM [テーブル名] GROUP BY date_format([日付のカラム],'%Y%m%d');

このSQL文を実行すると、カウントしたいカラムの合計値を日付けごとに抽出することができます。

今回重要なのは、GROUP BY句と、date_format() という時間関数を使うことです。
date_format()関数を使うことで、日付のデータを任意の書式に変更することができます。
今回は、「2018/04/26」のような形式に変更しています。
勿論、別の書き方でも問題ありません。

そして、その日付の値を GROUP BY でグループ化することで、同じ日付の値だけをそれぞれカウントしてくれます。
MySQLを使い始めたばかりだと、GROUP BY句ってどんな時に使うのか、そもそもどうやって使うのかの感覚がつかめなかったりするのですが、分かってしまうと凄く便利です。
日付け以外にも、カテゴリごととか、そういう指定もできますしね。

なお、上のSQL文を応用して、下記のように記述すると月ごとに集計することも可能です。

SELECT date_format([日付のカラム],'%Y%m'),count([カウントしたいカラム名]) FROM [テーブル名] GROUP BY date_format([日付のカラム],'%Y%m');

やろうと思えば時間単位でもできそうですが…それだとデータ数がとんでもないことになりそうなので、WHERE句で期間を指定するなど、計画的に行ってください。
INTO OUTFILE を使って、抽出結果を外部ファイルにエクスポートすると、後々使いやすいと思います。

 

なお、この書き方だと、カウント数が だった日付があった場合、その日は省略されますので、そこだけは注意してください。
値が 0 の日付も表示する方法はあるのかな…?
今のところ、この仕様でも困っていないのであまり意識していませんでしたが、あるなら便利そうですね。
時間があったら、方法を探してみたいと思います!

  • この記事いいね! (0)
著者:杉浦

GIS

 GIS(ジー アイ エス)とは、Geographic Information System の略称で日本語では地理情報システムと訳されます。
地球上に存在する地物や事象はすべて地理情報と言えますが、これらをコンピューターの地図上に可視化して、情報の関係性、パターン、傾向をわかりやすいかたちで導き出すのが GIS の大きな役割です。

人の活動において場所に関する情報を得たい場面は数多くあります。「駅から徒歩 10分圏内にある物件は?」、「店舗を出店するのに最適な場所は?」、「感染症の発生率が高い地域はどこ?」など、GIS は場所に関する問いに対する答えを地図上にビジュアルに表現しますので、文字や数値であらわされる表データを見る場合と較べて容易に状況を理解することができます。

(esriジャパンより引用)
 乱暴な言い方ですが地図と情報がセットならGISです。土地の情報に関するサービスの多くはGISを用いて実現されてます。GISは様々な場所で有償無償で公開されています。各自治体、研究室によって公開されるデータセットが少なくないです。G空間情報センターはそういった公共機関を始めとしたさまざまな機関が地図データを集めているサイトです。このサイトにあるデータセットはフリーのものが多くあるため、お手軽にGIS、GNSS関係に用いて遊ぶことができます。
 こう聞くとGIS同士を組み合わせて簡単に様々な有用なサービスを生み出せそうですが測量規格の障壁という問題が立ちふさがることがあります。インターネット等による盛んな情報交換の歴史は新しく、今までの各機関は自身に適した自身の定めた手法によって独自に発展してきました。結果、GIS情報を統合する際に様々な値の変換が必要になることがあるのです。

  • この記事いいね! (0)
著者:杉浦

マージソート

 ソートアルゴリズムの一つであるマージソートの紹介です。このソートはコンピュータに比べて残念な記憶力の人間でも身一つで大規模な相手に対して実行可能な高速ソートアルゴリズムです。実際、ボードゲーム、TCGなどでカードを整理する時に便利です。コンピュータにソートをやらせるならメモリをあまり食わず高速な賢い備え付けのソート(多分大体クイックソートの変形)を使った方がよいと思います。コンピュータ的な利点は、同値の項目でも並び替え前の関係を維持する安定ソートである点、データを分割して実行してもそれほど遅くならない点(メモリに乗りきらないくらい巨大なデータ相手に強い)でしょうか。
 マージソートの手順は以下の通りです。
(日本語wikipediaより引用)

  1. データ列を分割する(通常、二等分する)
  2. 分割された各データ列で、含まれるデータが1個ならそれを返し、2個以上ならステップ1から3を再帰的に適用してマージソートする
  3. 二つのソートされたデータ列(1個であればそれ自身)をマージする

 下のGIFはデモです。
 このソートは安定して塊を置くスペースがあるならば、デモ中で赤く示されているわずかな部分に注目するだけで実行できます。このためソート対象が巨大になってもデモと同様のことが人間の手で十分やれます。塊が目印になるので途中で放置しても再開が簡単な点、小さな塊を柔軟に好き勝手並びかえるのが有利な点(アルゴリズムによっては最終的に変わらなかったり、遅くなったり)も人の手で行うのにおすすめです。

  • この記事いいね! (0)
著者:杉浦

文字の出現頻度

 言語にはよく使われる文字と使われない文字の偏りがあります。アルファベットの母音と子音の使用頻度の違いは分かりやすいですし、調査結果もググれば出てきます。下図はアルファベットの出現頻度です。自分の覚えとも近かったので大体こんな感じです。

この出現頻度の偏りを用いた二つの技術を紹介します。
 一つは単純な換次式暗号の解読です。これはA→え、B→あ、C→さ、…のように1対1で本来の文字と別の記号を割り当てる暗号です。文中に出てくる語の頻度とある言語の使用頻度が近い場合、それは重要な手掛かりになり、十分な量の暗号文があれば暗号文のみで解読まで可能です。
 また、通信量の減少にも用いることができます。文字の出現頻度を考慮して01符号にアルファベットを割り当てることを考えると
0->e
1->a
00->t
01->i
10->o
11->s
000->n

と頻出する語に短い符号を割り当てることで雑な割り当てに比べて通信量を少なくすることができます。

  • この記事いいね! (0)
著者:杉浦

二進法

二進法は01、ビットなどと連想されるようにコンピュータに縁の深い言葉です。現代のコンピュータの計算速度はこれでもかというくらい小型化を続けるハードの貢献といかにうまくビットを扱うかというソフトの貢献に大きく支えられています。二進法は0,1,10,11,100,101,110,111,1000,⋯ と数えていく方式です。雑な言い方で二進法、十進法の関係を言葉にすると、二進法のn桁目の値が十進法でいうところの2^nにあたり、その変換の各桁の和が十進法表記になります。二進法表記と十進法表記の関係は次式の様に見るとわかりやすいはずです。
 コンピュータでは十進法でいうm^nをm=2^a、n=2^bと表現することで巨大な数や微小な数を表す浮動小数点方式、一度の状態変化で値を多彩に処理する補数表現、シフト演算、論理演算などの工夫がされています。
物事を覚えるには何度も繰り返すのが堅実です。二進法にはものを数える時に二進法を使うというで即物的に役に立ち、繰り返し使える方法があります。手の指をビットに見立て、折った状態を0、立てた状態を1とすることで片手で0から2^5-1=0~31、両手で2^10-1=1023までを数えることができるのです。さすがに32以上のものを手で数える事は珍しいでしょうが、片手で31まで数えられるというのは案外便利です。二進法に親しんでみましょう。

  • この記事いいね! (0)
著者:ym

コンプライTS500

ジムやジョギング用に bluetooth のヘッドセットを持っているのですが、付属の大イヤーピースでもサイズが合わず、困っていたんですよね。

でも、良い製品を発見しました。まさかイヤーピースだけで販売しているとは。

X3Tに対応した型番はなかったので、試しに TS500 の L をつけてみたところ、これがジャストフィット。いや結構無理やり差し込みましたけど。
でも、耳はジャストフィット。ウレタンの低反発枕のような素材なので握ってつぶしてから耳に差し込めば徐々に大きくなって抜けなくなります。
ただ素材的には消耗品なので、いずれは買い直しが必要、これはやむを得ないかな。
これで、何か食べて落ちるとか、下向いて落ちるとかが改善されたのでよしとします。

  • この記事いいね! (0)
著者:杉浦

ウィキメディア・コモンズの紹介

 ウィキメディア・コモンズはコモンな素材を集めたサイトです。少なくとも公的な立場で何かを書くことになり、そのために使う画像を集めるに際し、権利関係で悩むのが面倒な人(私とか)の役に立ちます。(最近フリー素材でググっても大勢のおもちゃにされているだけで、全然フリーじゃない素材がけっこうでてきて厄介です)
 ウィキメディア・コモンズは一見、創造的であったりなんだりで著作権が付随していそうな硬いメディアが多岐にわたり豊富なことが他のフリー素材集との大きい違いです。ポップなアイコンなら、いらすとや、ピクトグラムなんかもおすすめできます。また、このメディアがどのくらいの範囲で、どういう理由でフリーなのかの説明も付随してくるというのも権利関係にお手軽に安心できて良いです。
 ウィキメディア財団はウィキペディア、ウィキメディア・コモンズのみならず様々な活動活動を行っています。英語版wiki関係の充実っぷりはとんでもない(wikipediaは500万を超える記事、10万人以上のアクティブな編集者)のでいろいろ探してみるのも面白いです。

  • この記事いいね! (0)
著者:杉浦

量子三目並べの紹介

 三目並べは〇×ゲームとして知られています。私の地元では〇×ゲームと呼ばれていました。googleで三目並べと検索すれば検索結果画面で三目並べを遊ぶこともできます。お互いが最善の行動をした〇×ゲームが引き分けで終わることは簡単にわかると思います。単純な三目並べの手筋は探索アルゴリズムを考えるより、総当たりをした方が早いぐらいの探索範囲で済みますしね。この記事では三目並べに量子力学の発想を加えた量子三目並べの紹介をします。
 量子力学の世界では量子重ね合わせ(複数の状態を同時に持つ。ビットは0と1を同時に取れる)、量子もつれ(他の量子の状態の確定によって他の量子の状態も確定した状態になる)という法則が存在します。量子三目並べはこの量子重ね合わせ、量子もつれらしいものを導入した〇×ゲームです。量子三目並べはQuantum Tic-Tac-Toeというタイトルでiphone、android両方でアプリとしてプレイすることが可能です。石関匠, & 松浦昭洋. (2010). 量子三目並べの必勝法解析.なんて論文もあります。
 ルール(wikipediaより引用。図は石関・松浦(2010)より引用)

盤は通常の三目並べと同様に3×3の9つのマスを使用する。マークは先手を○、後手を×として、順に○1、×2、○3、…、×8、○9とする。
各手番でプレイヤーは、9つのマスのうちの2つに確定していないマーク(石関・松浦(2010)では量子マークと呼んでいるのでここではこれに倣う)を置く。マークした時点ではこのマークは確定せず、ゲームの進行によって後から確定することになる。量子マークは他の量子マークがすでに置かれているマスにも置くことができる。特例として、○9の手番ですでに他の8マスが確定している場合のみ、残りの1マスを即座に○に確定させる。

プレイヤーの新たな量子マークによって、同じ番号の2つずつ量子マークをそれぞれ結んだときに輪ができる状態になったとき(これを「”cyclic entanglement”が発生した」と言う。)、この輪を完成させた方ではない方のプレイヤーが、この輪に関わるマークの確定のしかたを選ぶ。なお、cyclic entanglementが発生したとき、この輪を形成するいずれかの番号の量子マークをどちらかのマスに確定させると、連鎖的にこの輪に関わる全てのマークが確定するため、有りうる確定の結果は2通りである。ここで、「この輪に関わるマーク」とは、直接に輪を形成しているマークのみでなく、ペアのうち一方が輪の上あり、もう一方が輪に関係ないマスにある量子マークのペアも含む(このようなペアの量子マークは、輪に関係ない方のマスに確定する。)。

通常の三目並べと同様に、確定した自分のマークを一列に3つ並べたプレイヤーが勝利である。しかし、量子三目並べでは、cyclic entanglementを確定させた結果、先手と後手が同時にラインを完成させる場合がある。この場合は、ラインを形成する確定したマークの番号のそれぞれの最大値を比べて、これが小さい方が優位であるとされる。

 図3の(b)は7対6で×が勝ちです。このゲームは既に必勝法を解析されてしまいしたが、常人の頭の許容量を超える程度には深く、十分楽しむ余地がありお勧めできるゲームです。余談ですが英語wikipediaの目並べ系項目は異様に充実しています。目並べ研究会でもあるのでしょうか。

  • この記事いいね! (0)
takahashi 著者:takahashi

FuelPHPでNotice例外の表示を消す方法

FuelPHPはデフォルトで、すべてのPHPエラーを表示するように設計されています。

FuelPHP は、古い手続き型の関数からの(例外でなない)PHP エラーに遭遇した場合、デフォルトの PHP の振る舞いを変更します。 FuelPHP は、致命的でない PHP エラーに遭遇した場合、処理を継続せず、これらのすべてのエラーに対し PhpErrorException をスローします。 すると、以前は無視していたような E_NOTICE といったエラーもすべて解決することを求められます。 非プログラマが作成したビューファイル中の構文エラーといった、PHP のエラーを捕らえることも同時に可能になります。

つまり、PHP上で作法通り(例えば空の変数を参照しない、など)プログラムしていないとNoticeエラーでバシバシ怒られます。
綺麗なプログラムを描きたい場合は非常に有用です(し、可能な限り修正すべきです)が、既成のライブラリを用いたり、開発期間が短かかったり、などといった場合はNoticeエラーが表示されるのは非常に困ることがあります。

そういう場合にNoticeエラーを無効化する方法を紹介します。

自分の知る限り、無効化する方法は2通りあります。

一つ目は、.htaccessでPHPのNoticeエラーを無効化する方法です。
fuelの場合、ドキュメントルート/public/.htaccess に次の設定を加えることで設定できます。

php_value "error_reporting" "E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR"

この一行を、.htaccessの末尾に追加すれば設定完了です。
もう一つの方法は、fuelPHPの設定ファイル fuel/app/config/config.php に設定を記述することでnoticeを無効化できます。

アプリケーション設定 – FuelPHP

FuelPHPは”規定より設定”という思想で開発されており、かなり自由にコーディングすることができます。
最低限のルールの土台はfuel、それ以降の細かい部分は自分で作りこむことができるのがfuelの魅力ですね。

フレームワーク何を使うか悩んでいる方は是非一度試してみてはいかがでしょうか。

  • この記事いいね! (1)