帰りは気楽な歌で

Windows、VBScript等の小ネタ、その他個人の趣味(音楽等)を書いていきます。

ランニング用iPhoneアプリ比較(Endomondo, Runtastic)

前に記事を書いてから随分と間が空いてしまった。

健康維持もかねてランニングをやっていたが、子供が生まれてからご無沙汰になっていた。

このままでは太るばかりぞ・・・という事で、最近、会社帰りの帰宅ランを再開したのだ。

自己満足のため、ルートやタイム記録ができるiPhoneアプリを同時に活用しているので、紹介する。(※注意:無課金で利用できる機能を元に比較しています)

 

Endomondo

前からずっと使い続けていたアプリ。

 機能はだいたい以下の通り。

・距離、ペース、走行時間を記録できる

・走ったルートを記録できる。1Kmごとの地点が表示される。

・キロ毎の時間、ペース(キロ何分)

・走行中、何キロ地点・ラップタイムをアナウンスしてくれる(英語)

インターフェースがシンプル。ただ、評価を見ると、次にあげるRuntasticの方が上に見える。

 

Runtastic

Runtastic GPS ランニング&ウォーキング

Runtastic GPS ランニング&ウォーキング

  • runtastic
  • ヘルスケア/フィットネス
  • 無料

 こちらはendomondoと比べると多機能な印象(無料版の中では。)

endomondoの機能に加え、

・走行ルートのどの時点が速かったか/遅かったが色でわかる(ペース配分が一目瞭然)

・音楽をアプリ内で再生できる(テーマに合わせた音楽集も購入できる)

・endomondoより若干距離が短めに計測される(というかendomondoの方が若干長めか?)

という差異がある。

自分なりの2アプリ比較

○endomondoの利点

・インターフェースがシンプル(ボタンが大きく操作もわかりやすい)

GPSの位置検知が若干正確?(道路ではなく駅の敷地のような場所でも検知可能)

○endomondoの欠点

・距離が若干長めに計測される?

 

○Runtasticの利点

・多機能、初心者向けのガイドが豊富

・走行記録が細かく、ペース配分が一目でわかる(赤は早い、緑は遅い)表示はさすが。

・距離がルートラボ(下記)で計測した結果に近い。

ルートラボ - LatLongLab

○Runtasticの欠点

・多機能がゆえにガイドがうっとおしい。ランの停止などは直感的に操作できなかった。

GPSの位置検知があまい?(駅の敷地内が、周りの道路として検出されてしまう)

 

あくまで私的な意見ですので、お好みで選んでよいと思います。

Runtasticも数回しか使っていないので、これからアレに備えて頑張らねば・・・。

 

 

Chromecastで600円のクーポンがもらえるそうだ

ということで。

今ならChromecast販売一周年とのことで、購入者向けに600円のクーポンを配布しているそうだ。

必要なものは、

  1.  googleアカウント
  2. セットアップ済みのChromecast
  3. Chromecastにアクセスできるデバイス(iPhoneとかAndroidとか)

使い方は、もはや下記を見た方が早いだろう・・・。

Chromecastを買ってGooglePlayのクーポンを貰う方法 [期間限定] » 使い方・方法まとめサイト - usedoor

期限は2014/7/31までらしい!急げ!

(にしてもCMとか全くやらずにこっそりキャンペーンしている模様。)

あと今ならアナと雪の女王が400円でレンタルできるらしい。

今さら「楽々ERDレッスン」を読んで

 

楽々ERDレッスン (CodeZine BOOKS)

楽々ERDレッスン (CodeZine BOOKS)

 

市の図書館でなんとなく見つけた、「楽々ERDレッスン」。

なんと2006年に書かれた本だが、DB設計のとっかかり方をよく解説している本だった。

仕事を始めた時にこの本に出会えれば良かったと思うし、これからDB設計を始める後輩にもお勧めしたい本だと思う。
データベースの性能やアーキテクチャはどんどん変わっているが、RDBMSである限り、この本はまだまだ有用だなと感じた。

仕事をやっていると、
「あ~これあるある!」
「この間バグになったのがこれのせいだったんだよなぁ」
「あの時きちんと設計しておけば、こんな大改修にならずに済んだのに」
と共感する人もいるかも。

”DB理論にとらわれすぎず、お客様の業務にとって一番価値の生み出せる設計にできるかどうか”に重きを置いて説明している。

特に気になったものを取り上げると・・・

One fact in One place(1つの場所に1つの事実)

例えば、下記のような「売上伝票」のリレーションがあったとする。

f:id:slowalpaca:20140727221120j:plain

教科書通りに「自明な関数従属性」を排除したり、繰り返し項目を排除すると、下記のようになる。「商品」を切り出した際に、「単価」を商品の方に持っていった。

f:id:slowalpaca:20140727221142j:plain

ただ、もし

「価格は商品マスタの単価ではなく、割引期間中は単価を下げて提供することがある」
「特定の組み合わせだったら合計額が割り引かれる(だから、商品の単価をSUMっただけでは出ないよ)」
といった要件があったら・・・?

その場合は、「商品伝票明細」に「(販売)単価」が必要だし、「商品伝票」に「合計金額」が必要かも知れない。

・商品の価格は「単価」であらわされる
・でも割引することもある

という事実が2つある場合は、1つのリレーションで解決しないようにする必要がある。
(これは極端な例だけど、こうした要件漏れがあって、本番に移ってから不具合として顕在化することもある。)

DB設計はブロック分け・イベント抽出から

ともすると、先に登場人物(物・人間等)を抽出して、何とか属性を洗い出そうとする人もいるが、それは間違い。
まずは大まかなブロック分け(受発注・在庫管理・与信~等々)から始め、その次にイベント(注文とか予約等、~するという動詞・形容動詞にするとしっくりくるもの)を洗い出す。
リソース(商品、顧客... etc)はその次だ。
この順序に従ってERDを作成する演習を紹介しているため、「なんでこの順番に設計するの?」というのが非常にしっくりくる。

データを経営資産としていかに活用し、価値を生み出すか

この本は上記の事が複数の個所で繰り返し書かれている。
DB設計者は背景にある業務について強く意識しないといけない。

プロジェクト内でデータベース設計を任される人間は、
「表にある繰り返し項目や関数従属性を排除して正規化を進めるべきだ」
「元表に近い形で設計して高速に表示させるようにしたい」
等々、なまじDBの仕組みやセオリーを知っているだけに上記の考えがよぎってしまう。

DBの専門知識は当然重要だが、DB設計の本当にそもそもの目的は
”データを経営資産としていかに活用し、価値を生み出すか”
という事だ。

DBの技術的背景よりユーザー業務の理解から始めるのが妥当であり、要件の漏れも少なくなる。性能要件やディスク領域とかの話はその次なのだ。

センスのない扇子

今週のお題「夏アイテム」

 

夏アイテムなのかわからんけど、新婚旅行の時に買ったセンスです。

モンサンミシェルと書かれている。どこで買ったかわかる?

こんなお土産、日本の温泉街か屋台とかで買ったんだろう・・・?

f:id:slowalpaca:20140725221842j:plain

 

 

 

そう、モンサンミシェルで買いました。こんな箱根湯本的な感じのおみやげなんてモンサンミシェルにはないでしょ?とお思いだろう。

 

モンサンミシェルの寺院までの街並みは、お土産屋でひしめいているが、キューピー人形やキティちゃん、鉄砲やロボットのおもちゃなどがいて、ここ日本の温泉街じゃない?と一瞬錯覚してしまうくらいだ。

 

f:id:slowalpaca:20140725222725j:plain

 

ちなみに旅行したのは6月。普段は20度代で過ごしやすいはずだが、熱波のため32~3度くらいまで上がってた。

 

お土産さんも「普段とは全然違うわね」と英語で言っていた。

 

あ、日本語も通じるかもしれません。日本語の案内表記もたくさんあります。クッキーを6箱で買うと20ユーロ、とか。

 

ともかく夏にこの扇子を出すと、なんか初夏のフランスを思い出すのです。

 

あと、モンサンミッシェルが描かれたでかいビニールバッグを買って、奥さんに酷評された(笑)のもいい思い出です。

Windowsコマンドでプログラムの標準出力を読む

これまたlinuxのシェルを触っていて便利だなと思ったのが、プログラムの標準出力を変数に格納したりして、処理分岐に使える、という事。

VAR=`date +%Y%m%d`
echo ${VAR}
[結果]
20140724

で、windowsコマンドの場合はこれをforコマンドでやることになる。 下記の場合は、JP1(ver9)のajsshowコマンドを使い、第一引数で指定したジョブネットがどんな状態かをチェックするバッチだ。

プログラムの標準出力をBSTATUSという変数に渡して、findstrで"正常終了"か"異常検出終了"か"警告検出終了"を見つけたら、戻り値は 0 になる。

[test.bat]
for /F %%w in ('ajsshow -f "%%C" -X no %1') do set BSTATUS=%%w
echo %BSTATUS% | findstr "正常終了 異常検出終了 警告検出終了"
[使用例]
C:\>test.bat /テストジョブネット/テスト01/
C:\>echo %ERRORLEVEL%
0

ちなみに上記の例は、「ジョブネットが正常でも異状でも、終わった事を検知したい」という事情があって作ったもの。ジョブネットコネクタでは、接続元が異常終了すると、それ以上進めないので、やむなくこういうのを作りますた・・・

Windowsコマンドでファイル名だけ/パスだけ取得する

linuxには文字列を渡すとファイル名だけ返すコマンド(basename)とパスだけ返すコマンド(dirname)がある。

例えばこんな感じだ。

basename /test/hoge/fuga.csv
[結果]
fuga.csv
dirname /test/hoge/fuga.csv
[結果]
/test/hoge/

しかしながら、windowsにはそんな便利な一発コマンドがない・・・のだが、バッチパラメータの置換を利用して、似たようなことはできるようになっている。

下記のようなバッチファイルを作成してみる。

[basename.bat]

@echo off
echo %~nx1

[dirname.bat]

@echo off
echo %~dp1

それぞれの実行結果は下記の通り。

C:\>basename.bat C:\testhoge\fugafuga.csv
fugafuga.csv

ファイル名だけ取れてる。

C:\>basename.bat C:\testhoge\fugafuga.csv
C:\testhoge\

パスだけ取れてる。

他にも、ドライブ名だけ取得する、拡張子だけ取る、等も可能。詳細はcallコマンドのヘルプを参照するといい。下記callコマンドのhelpより引用。

バッチ パラメーター (%n) の置換は拡張されました。次のオプション構文
を使うことができます:

    %~1         - すべての引用句 (") を削除して、%1 を展開します。
    %~f1        - %1 を完全修飾パス名に展開します。
    %~d1        - %1 をドライブ文字だけに展開します。
    %~p1        - %1 をパスだけに展開します。
    %~n1        - %1 をファイル名だけに展開します。
    %~x1        - %1 をファイル拡張子だけに展開します。
    %~s1        - 展開されたパスは、短い名前だけを含みます。
    %~a1        - %1 をファイル属性に展開します。
    %~t1        - %1 をファイルの日付/時刻に展開します。
    %~z1        - %1 をファイルのサイズに展開します。
    %~$PATH:1   - PATH 環境変数に指定されているディレクトリを検索し、
                   最初に見つかった完全修飾名に %1 を展開します。
                   環境変数名が定義されていない場合、または
                   検索してもファイルが見つからなかった場合は、
                   この修飾子を指定すると空の文字列に展開されます。

修飾子を組み合わせて、複合結果を得ることもできます:

    %~dp1       - %1 をドライブ文字とパスだけに展開します。
    %~nx1       - %1 をファイル名と拡張子だけに展開します。
    %~dp$PATH:1 - PATH 環境変数に指定されているディレクトリを
                   検索して %1 を探し、最初に見つかったファイル
                   のドライブ文字とパスだけに展開します。
    %~ftza1     - %1 を DIR の出力行のように展開します。

Dictionary オブジェクトの並び順

仕事でVBAVBScriptを書くことが多いが、良く使っているオブジェクトの一つがScripting.Dictionary。

気になったのが、Dictionaryオブジェクトから値を取り出す順番。

Dictionaryオブジェクト自身は、この(http://www.atmarkit.co.jp/ait/articles/0907/29/news113_2.html)ページによると、

キーの格納順序については保証されない。例えば要素を列挙した際、最後に追加した要素が最後に現れるかどうかは分からない

とのこと。しかし、実際に下記のようなソースを実行すると、1~100まで格納した順に値が取り出される。

Option Explicit

Dim objDic
Set objDic = WScript.CreateObject("Scripting.Dictionary")

Dim i
For i = 1 to 100
    objDic.Add i, "値:" & i
Next

Dim key
For each key In objDic.Keys
    WScript.echo objDic(key)
Next

実はMicrosoftのサイトでこんな記述を発見した。

Sorting a Scripting Dictionary Populated with String Data

DictionaryオブジェクトがSortメソッドを実装していないので、ソート方法を紹介しているページなのだが、そこには、

Because this information is stored unsorted, enumerating through the array returns information in the order it was stored.  

 と書かれている。要は

Dictionaryオブジェクトは値をソートしないで格納し、取り出す時は"値を追加した順番で取り出される" (ので、ソートする方法を紹介しようとおもったよー)

 という事らしい。なんだって?値を追加した順番?

つまり、追加するだけで、Remove等を行わなければ、キュー(先入れ先出し)みたいな使い方もできるというわけか。

本ブログに記載のソースコード・情報を利用した際に生じたいかなる損害において、筆者は責任を負いません。十分な知識を持ったうえでご利用ください。