■:X:n:n=n次元情報空間n包思念体

宇宙計算機プログラムの謎と謎の謎

デバイスの通信量を記録するツールを作ってみた

 学校でネットワークの通信量を日ごとに見られるソフトをインストールせよ、との指令が出た。Windows版なら学校側から推奨されているソフトがあったが、Linuxには自分の体に合いそうなものは存在しなかった。
 仕方ない。自作るか

github.com

機能について

このツールには以下のような機能がある、

  1. 独自の形式のログファイルを作成し、そこに日ごとのデバイスの通信量(受信・送信)を記録する
  2. /proc/net/dev にはシステムが起動した以降に、それぞれのデバイスが何バイト分の通信をしたかの情報が出力される。この差分を一定時間ごとに取得し、ログに書き込む
  3. GUIの実行が可能で、日ごとの通信量が表として表示される

ドキュメントなど

Githubに追加予定

その他

出来たてホヤホヤで多分バグの宝石箱
何れ直していくさ。

追記 2016/05/29

案の定重大なバグが発生した。日付変更時に連続して起動していても、次の日のログへの変更が発生しない と言うものである。 しばらくの間は所用により変更できないため、6/10以降にバッチを作成しようと思う

Open Data Day 2016 in GEEKLAB.NAGANO に参加したためメモ書き

Open Data Day 2016 in GEEKLAB.NAGANO feat.NSEG に参加したためメモ書きします
glnagano.doorkeeper.jp

Open Data Day について

Open Data Dayの公式サイトには、オープンデータデイについて以下のようにあります

オープンデータデイは、オープンな公開データを使ってアプリケーションを書いたり、データを開放したり、視覚化したり、分析結果を公開するために世界中の市民が集まって、世界の地方、地域、そして中央政府によるオープンデータに関する政策の導入を支援、奨励します。

http://opendataday.org/index_ja.html
おそらく、オープンデータを活用してプレゼンやハッカソンをするイベントを同時開催するという趣旨のイベントです

今回、GeekLabNaganoではMonacaニフティクラウドを使った簡潔にアプリを作成する方法が紹介されました
これを元に、ハッカソンでは自分がいたチームは災害時支援アプリを作っていくことになります

おおよその日程

2016 3月5日に実施

時刻 やったこと
10:00~10:20 オープニング + ODD2016とGEEKLAB.NAGANOの紹介
10:30~12:00 ハンズオン(ニフティクラウド様)
13:50~17:30 ハッカソン (チームに別れて制作)
18:00〜20:00 懇親会・成果発表

ハンズオン

ハンズオンではニフティクラウドの川原 史識 さんが、Monacaニフティクラウドを合わせた、オープンデータを用いたスマホアプリを簡単に作る方法が紹介されました。
sssslide.com
Monacaは、スマホアプリを作るツールで、HTML5とJSで開発するものです。それぞれの環境にビルドするという方式をとっているらしく、センサにアクセスする機能があり、WEBで開発できます。
ニフティクラウドは、無料から使えるクラウドサービスで、楽にサーバー構築でき、SDKを入れるだけで簡潔にサーバーとのやりとりができるというサービスです。
このMonacaニフティクラウドを合わせると、楽に○○マップが作れる。そして、除雪マップの市民に除雪させるアプリや、Pepperの観光案内、鎌倉今昔写真というアプリなどに、活用されている。ということが紹介されました。
この時、Monacaニフティクラウドの登録をし、サンプルアプリをいじってみた といったことが今回のハンズオンの内容でした。

ハッカソン

ハッカソンでは、2〜4人程度のチームに別れて制作したり、設計したりしました。
ルールは、オープンデータを使った地域に役立ちそうなものを作るということでした。

アイディアの例

チームごとの制作の前に、オープンデータを活用するアイディアについて紹介さました。以下に例の一例を出します 

  • おくやみ情報
    • 友人が死亡していた時とかに通知してくれると便利かもしれないと思った。
  • Wifiマップ,充電器の場所 
    • フリーWifiの場所とか知りたいときは多い。
  • 緑の自転車の乗り捨て場 停車所とかを表示 
    • 長野市内の無料で借りられる自転車。観光客とかには停車所の位置情報は必須だと思った。

自分のいたチームについて

自分のいたチームでは、色々と議論した後、災害時の助け合いをすすめるアプリを作成することに決定しました。
ここから、各々に作業を分担し、1人はプレゼン資料作成、1人は地図への表示機能、そして自分はアンケート機能を制作していきました

制作しようとしたもの 概要

災害時に活用するアプリ
支援を必要とする要支援者と、要支援者を支援する支援者を橋渡しするツール。主に2つのモードがある

  1. 要支援者のためのアンケートを入力フォーム
    • 名前や緯度・経度、緊急度のレベル付、必要な支援の登録、メッセージの入力を行う
  2. 支援者のためのマップ
    • 入力されたデータを元に、マップに情報を表示する
    • 火事場泥棒対策のため、詳しい位置は最初からは表示しない。円でぼかしておく
    • 緊急度のレベルに基づく色分け
    • 特定のニーズに合わせた絞り込み

といった機能を考えました
アプリ上での実装目標です
f:id:ikemaki:20160306005133p:plain

制作結果

自分は要支援者のためのアンケート入力フォームの作成を行いました。
フォームの型の作成は難なく出来ましたが、2時間近くJavaScriptが使えない謎の自体に陥りました。そこで、Monacaの確認のエミュレーターのようなものを利用してテストしていたところを、ブラウザを使ってテストをするようにすると、JavaScriptが使えるようになりました。たぶん、エミュレーターがJavaScirptの読み込みができないことによると思いました。
JavaScirptが使えるようになってから、サーバーへの送信関数を作ろうとしましたが、ここでタイムオーバーになりました。
成果物を上げておきます。 必要な機能を満たしていないため、これからも機能を追加できたらなぁと思います。
GitHub - Makinori/disaster_support

Lispで深さ優先探索

Common Lisp深さ優先探索をしました
正しく説明できている自信がないので、間違えなどはご指摘いただけるとありがたいです
あまり参考にしないほうがいいと思います(汗
とりあえずコードから

(defparameter *graph*
  '((a b c d)
    (b c)
    (c d)
    (d a)))
    
(defun depth-search (passed-point goal graph)
  (let* ((now-point (car passed-point))
         (next-points (cdr (find-if #'(lambda (point)
                                        (equal now-point (car point)))
                                    graph)))
         (new-graph (remove-if (lambda (x)
                                 (equal now-point (car x)))
                               graph)))
    (cond ((eq now-point goal) (list (reverse passed-point)))
          (t (mapcan #'(lambda (point)
                         (depth-search
                          (cons point passed-point)
                          goal
                          new-graph))
                     next-points)))))

実行は

CL-USER> (depth-search (list 'a) 'd *graph*)
((A B C D) (A C D) (A D))

課題内容

ある点からある点までの考えうる全ての経路を表示せよ
以下のような形式のデータが与えられる

[(a b c d)
 (b a c e)
 (c a b f) ...]
X Y

それぞれの()内の構造は、
(点N 点Nから行ける点1 点Nから行ける点2 ...)
のようになっていて、この配列をグラフと言う。
このとき、点Xから点Yに到達できる経路すべてを表示せよ。
ただし、同じ点は2回以上通ってはいけないものとする

課題の例

たとえば、このデータが与えられたとする

[(a b c d) (b c) (c d) (d a)]
a d

グラフイメージするとこんな感じだ
f:id:ikemaki:20160208234346g:plain
この問題は、上のようなグラフの点aから点dまでの経路を考えるというものだ。
この時、考えられる経路は、はじめにa->bを通った場合、a->cを通った場合、a->dを通った場合の3つになるだろう。そうすると
a -> b -> c -> d 
a -> c -> d
a -> d
になる。このように、経路を探索するのが今回の課題だ

今回の考え

  1. 関数searchには、経過した点、ゴール、グラフの3つの情報が与えられる
  2. 経過した点の配列から、最後に通った点(点N)を抜き出す
    1. グラフから、点Nから行ける点の配列(配列G)を抜き出す
    2. グラフから、点Nを除いたグラフ(新グラフ)を作る
  3. これを元に、以下の動作をする
    • 点Nがゴールと同じなら、配列Pを返す
    • 配列Gが空なら、空配列を返す (明記されていない)
    • 配列Gのそれぞぞれの要素(点G)に同じことをし、空配列を取り除く
      1. 関数searchに、点Gと経過した点を合わせた配列、ゴール、新グラフを与える

というのが、上のコードを日本語に概訳したものだ。

改良すべき点

  • (equal now-point (car x)) が2つあって気持ち悪い。
  • 再帰呼出しごとに、グラフのコピーが発生していて、メモリを圧迫しかねない。そもそもnew-graphの存在自体が疑問
  • 同じことを同じ引数で処理している。メモ化すべき
  • わかりにくい。高速化の前に、更に行う処理をシンプルにしたい

とりあえず思いついたことです
このプログラムは巨大なグラフが与えられると、一発で死ぬと思われるので、全く実用的ではありません。
私の力不足を感じた次第であります

参考文献

Common Lispによるグラフの探索が細かく書かれています。この方は他にも多くの記事を書かれていて、プログラミングに関する様々なノウハウが詰まっています

ブログの公開について

長年作ろうと考えていましたが、実際に公開するのは初めてです。

個人的にはプログラミングや回路に興味があり、その方向で制作物や製作記、発見などの記事を書いていきたいと思っています。

よろしくお願いします