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を使ってみよう(勉強編)
- ビーコンはUUIDと呼ばれる識別情報をアドバタイズ(伝達)する。
- UUIDが同一のビーコンは、アドバタイズしている追加情報(MEJORおよびMINOR)によって区別可能である。
- 半径約10mをカバーしている。(壁面や床・天井・人体などの影響を受けて反射・吸収・回折が生じることで、複雑な電波強度分布となる)
- 電波が減衰する性質を利用してビーコンとの距離を求めることができる。
→詳しくは、コチラに書かれていました。 - ビーコンはアプリがあって成り立つ。
- アプリ側はビーコンの受信をきっかけに、処理を行う。
実際に以下の様な使われ方をしています。
ってことで、実装してみました。
iBeacon自体も自社の研究会で購入したのですが、今回はnode.jsを使って電波を飛ばしたいと思います。