Nullppo

メモ帳的なにか

Advent Calendar

Advent Calendarって。。。

クリスマスまでの期間に日数を数えるために使用されるカレンダーである。
アドベントの期間(イエス・キリストの降誕を待ち望む期間)に窓を毎日ひとつずつ開けていくカレンダーである。
すべての窓を開け終わるとクリスマスを迎えたことになる。
インターネット上などで、アドベントカレンダーに見立てて12月に一人、または複数人で毎日記事を投稿していくという企画がある。
特にプログラミングに関連するアドベントカレンダーの企画が近年多数行われている。(アドベントカレンダー - Wikipedia)

何故急にAdvent Calendarネタ?

それはですね。。。。。人生で初めて参加したからですw
その記事がこちら!!↓qiita.com


ちなみに、参加したカレンダーは
リクルートライフスタイル Advent Calendar 2015 - Qiitaです。

担当日までに記事を仕上げ、下書き状態で保存しておくことで、
当日に自動公開される仕組みです。
つまり、この記事を書く30分ほど前に公開されたというわけでございます!!

なんかカウントダウンされて公開されると思うとドキドキしますね///
とりあえず、参加した事だけを伝えたかったので記事書きましたw


以上!!zzz

JavaScriptのsetMonthについて

JavaScriptで日付(主に月)の加算・減算をしたい人必見!!!

やり方をググると、色々なページで解説がありますね。
そして、殆どがsetMonthを使ってますね!

https://msdn.microsoft.com/ja-jp/library/tst8h9zw(v=vs.94).aspx
setMonth メソッド (Date) (JavaScript)

Date オブジェクトの日付の月の部分を現地時刻で設定します。

構文
dateObj. setMonth(numMonth[, dateVal])

パラメーター
dateObj必須。任意の Date オブジェクトを指定します。numMonth必須。設定する月を表す数値を指定します。1 月の値は 0 で、2 月以降の値はそれに続く連続した数字です。dateVal省略可能です。設定する月の日付と等しい数値を指定します。この値を省略した場合は、getDate メソッドにより返される値が使用されます。

解説
世界協定時刻 (UTC) を使用して月の値を設定するには、setUTCMonth メソッドを使用します。
numMonth に 11 を超える値 (1 月は 0) または負数を指定すると、値に応じて格納されている年の値が変更されます。たとえば、日付が "Jan 5, 1996" と格納されている場合に setMonth(14) メソッドを呼び出すと、日付は "Mar 5, 1997" に変更されます。
setFullYear メソッドを使用すると、年、月、および日を設定できます。

上記の説明を見ると行けそうな気がします。
しかし、、、コレちょっと危険なんです!!

1月末日に+1ヵ月して2月末日を出そうとした場合、期待通りにいかないはずです!

var date = new Date('2015/1/31');
date.setMonth(date.getMonth()+1);

こう書いて正解っぽく見えますが、、、、
結果は【2015/3/3】になってしまいます。

おそらくですが、
2月31日(あり得ない) - 2月28日(現実) = 3日
2月28日(現実) + 3日(あまった日数) = 2015/3/3(結果)
このような計算が行われていると思われます。
今回は加算でしたが、減算でも起こり得ます(検証済み)。

じゃあ何故このようなことになってしまったのか。。。
ヒントはwikiにありました。

JavaScriptという言葉は狭義にはMozillaが仕様を策定し実装しているスクリプト言語を指す。このスクリプト言語EcmaインターナショナルでECMAScript (ECMA-262) として標準化されており、多くのWebブラウザー等はこの標準化されたECMAScriptを実装している。
https://ja.wikipedia.org/wiki/JavaScript

上記の文にあるECMAScriptのリファレンスを読んでみると。。。。。

15.9.5.38 Date.prototype.setMonth (month [, date ] )

If date is not specified, this behaves as if date were specified with the value getDate().

Let t be the result of LocalTime(this time value).
Let m be ToNumber(month).
If date is not specified, then let dt be DateFromTime(t); otherwise, let dt be ToNumber(date).
Let newDate be MakeDate(MakeDay(YearFromTime(t), m, dt), TimeWithinDay(t)).
Let u be TimeClip(UTC(newDate)).
Set the PrimitiveValue internal property of this Date object to u.
Return u.
The length property of the setMonth method is 2.
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.5.38

ちゃんと書いてるっぽいですね?(英語がイマイチ。。。orz
きっと知らずに使っている方はいっぱいいらっしゃいます。
みなさん気をつけてくだせぇ!!!

ライブラリを使って解決したり、日付を月初でやったりと、
対策もたくさんあります!
一番良いのは何かを考えながら実装するのも楽しいですね!

node.jsでiBeaconを発信

さてさて、前回に引き続きnode.jsでiBeaconの発信をしてみましょう。
環境さえ整えれば、すご~く気軽に発信できちゃいます。

事前準備

  • node.jsを使える環境にしておく
  • 筆者はMacOSを使用しています

1. bleaconの準備

以下のコマンドを使ってbleaconというモジュールをインストールします。以上!w

$ npm install bleacon

2. スクリプトを書こう

ここが、今回のメイン作業です。が、、、6行しかありません!!
とりあえず「sample.js」という名前を付けると仮定して説明します。

var Bleacon = require('bleacon');
var uuid = '04137D10-42C4-41D1-8E23-FCEB7FDE5856'; // テキトウ
var major = 1; // テキトウ
var minor = 1; // テキトウ
var measuredPower = -59; // 私の環境はこの設定値でOKでした
Bleacon.startAdvertising(uuid, major, minor, measuredPower);

UUIDとは
128bitで表される識別子です。主に組織単位で使用される事を想定したものとなっています。
簡単になりすまし出来ますね!ww

MAJORおよびMINORとは
16bitで表される識別子です。同一UUID同士をグルーピング、カテゴライズする際に使用します。
UUIDとMAJORが同一の場合はMINORを設定するといいかもしれません。

MeasuredPower(参照受信信号強度)とは
発信機と受信機を1m離した際の受信信号強度を設定します。
受信機は、この参照受信信号強度と実際に受信した信号強度から発信機と受信機器の間の距離を推定します。

3. 発信!!

心の準備はよろしいでしょうか?準備が整った方は
「ビーコンシステムオールグリーン、遠心カタパルト展開、作戦目標に向けて射出します!」
とでも叫びながら以下のコマンドを打ち込みましょう!

$ node sample.js

ヤッタネ!飛びました!!!って分からないですよね。
AndroidアプリでiBeaconをスキャンするものがいくつか出ているので、
事前にGooglePlayとかでインストールしておくといいかもしれませんね!

次回は、AndroidでiBeaconを受信する(実装編Part1)です。
Part1では、リージョン管理を行います。

お楽しみに。。。

iBeaconを使ってみよう(勉強編)

はじめに
iBeaconとは、iPhoneのiOS7に標準搭載されたBluetooth Low Energy(BLE)を使った新技術のことです。
 
以下の動画も有名ですね。
 
なんだか、ワクワクしますね!
調べてみると以下のことが分かりました。
  1.  ビーコンはUUIDと呼ばれる識別情報をアドバタイズ(伝達)する。
  2. UUIDが同一のビーコンは、アドバタイズしている追加情報(MEJORおよびMINOR)によって区別可能である。
  3. 半径約10mをカバーしている。(壁面や床・天井・人体などの影響を受けて反射・吸収・回折が生じることで、複雑な電波強度分布となる)
  4. 電波が減衰する性質を利用してビーコンとの距離を求めることができる。
    →詳しくは、コチラに書かれていました。
  5. ビーコンはアプリがあって成り立つ。
  6. アプリ側はビーコンの受信をきっかけに、処理を行う。
これだけで、色々なアイデアが生まれそうですね。
実際に以下の様な使われ方をしています。
  • 博物館や美術館等の展示品紹介
    →展示品にビーコンを設置する。事前にアプリを仕込んだ端末を持ったユーザが、展示品に近づくと自動で紹介動画や文章が開く
  • 東京駅構内におけるナビゲーション
    →ビーコンを複数設置して、ビーコン対端末間の距離を使って場所を把握。地図にマッピングすることでナビゲーションを可能にしている
  • 勤怠管理(シュキーン)
    →説明がめんどいので公式を見てください
さて、、、、
ここまで書いといて残念なお知らせです。
私はiPhoneではなく、Androidユーザですw
 
ですが、心配はいりません。
Bluetooth LE に対応したAPI が追加された Android 4.3 以降の端末であれば、iBeaconは受信することが出来ます
とりあえず、BluetoothをScanして受信したbyte列をiBeacon のデータフォーマットに則って UUID や、maj・・・・・こんなの面倒ですね。(簡単にできますが。)
Radius Networks社が出しているAltBeaconを使えば、上記のような手間が省けます。
さらに、距離の計算も自前でしなくていいのです。
 
あー使いたい。あー使いたい。
ってことで、実装してみました。
iBeacon自体も自社の研究会で購入したのですが、今回はnode.jsを使って電波を飛ばしたいと思います。
 
と、、、、
ここまで書いたのですが、眠くなってきたので次回のお楽しみということで。
 
iBeacon関連記事の予定
  1. 本ページ
  2. node.jsで電波を発信
  3. altBeaconを使用してAndroidで受信(リージョン管理編)
  4. altBeaconを使用してAndroidで受信(レンジング編)