Nullppo

メモ帳的なにか

Javaの数値チェックは何でやるか。。。

Javaで数値チェックと言って、
思いつくのは。。。。。

  1. org.apache.commons.lang.math.NumberUtils.isNumber(String str)
  2. org.apache.commons.lang.math.NumberUtils.isDigit(String str)
  3. org.apache.commons.lang.StringUtils.isNumeric(CharSequence cs)

かなー。

じゃあ、
それぞれの違いってなんだろ?
っていう初心者チックな疑問について調べてみた。


1.NumberUtils.isNumber(String str)

  2進数でも16進数でもjavaが解釈できる数値であれば「true
  NumberUtils#isNumberが数値として判定するのは以下の場合
  ・0xで始まる16進数表現
  ・数字のみでの数値表現(小数表現、負符号可)
  ・数値タイプ(long値の場合の末尾のLなど)が指定された数値表現(小数表現、負符号可)
  ・指数表現

2.NumberUtils.isDigit(String str)

  正の整数と0ならば「true
  0が先頭でも「true
  空は「false

3.StringUtils.isNumeric(CharSequence cs)

  正の整数と0ならばtrue
  0が先頭でもtrue
  空は「true


簡易表にしてみた

NumberUtils.isNumber NumberUtils.isDigit StringUtils.isNumeric
NULL("null") false false true
空("") false false true
ゼロ(0) true true true
正の整数(1) true true true
負の整数(-1) true false false
指数(2.5E-4) true false false
【全角】正の整数(1) false true true
【全角】負の整数(-1) false false false

(【TODO】まだ追加で書くかも)

ノンブロッキングI/Oとは何なのか調べてみた

今行ってる現場で、node.jsというキーワードが出てきた。
が、、、、あまりnode.jsを知らない。
(node.jsとExpress、Jade?でウェブアプリ作れたはず、、、くらい。)

なので、node.jsでググった。
すると、ノンブロッキングI/Oというものが出てきて、
さらにそのキーワードを調べたらなかなか面白かったので、記事にしてみよう。

node.js初心者かつノンブロッキング初心者なので、間違った事言ってたらゴメンナサイ。

料理で説明

ググっても、なかなか引用できそうな説明がない。(コピペできんorz
だから、肉じゃがを作ることにする。(いきなりw)
もちろんご飯とお味噌汁付きだ。

まず、炊き上がるまで時間がかかりそうなご飯から。
米を洗い、炊飯器にセットし、ボタンを押す。
あとは通知(ピーピーピー)が来るのを耳を立てて?待つのみだ。

さて、次は肉じゃがを作ろう。
材料を切り、鍋に入れ、調味料を入れ、煮る。
煮終わるまでちょいと時間がかかるので、
お味噌汁とサラダを作ろう。

お味噌汁を作りなーがー。。。
あれ、肉じゃができる?確認してみよう。(爪楊枝をじゃがに刺す)
あれ、硬い。まだか。
よし、お味噌汁完成した。

つぎはサラダ。
ぱぱと切って・・・
あれ、肉じゃができる?確認してみよう。(爪楊枝をじゃがに刺す)
あれ、硬い。まだか。
切った野菜を皿に盛って、完成!

あれ、肉じゃができる?確認してみよう。(爪楊枝をじゃがに刺す)
お!きたー!柔らかい!
肉じゃがを皿に盛って、完成。

炊飯器「ぴーぴーぴー」
よし、ご飯もできたから皿に盛って、完成!

例えはコレだけにしときましょうww

非同期I/O

ご飯は非同期で作りました。
通知をバックグラウンドで待機しておいて、
通知が来たら皿に盛るという処理をしたのです。
通知が来るまでの間、別の処理を実行できますね!

ノンブロッキングI/O

肉じゃがは、ノンブロッキングで作りました。
鍋に入れて煮始めてから、できるまでの間に他の処理をしました。
しかし、たびたび爪楊枝で刺す事で「じゃが」のステータスを確認し、
煮えていた場合、皿に盛るという処理をしたのです。

両者の違い

通知をバックグラウンドで待つのが非同期。
ステータスを決まった間隔で確認しに行くのがノンブロッキング

そもそも

なぜノンブロッキングI/Oというものが出てきたのか。。。

少し前にC10K問題というものがありました。
apacheは、マルチプロセスモデル/マルチスレッドモデルを採用していました。
上記のモデルでは、1クライアントに対して1プロセス/1スレッドが割り当てられます。
10000クライアントが同時にアクセスすることで10000プロセスが立ち上がり、プロセスIDがどうのこうの。。。

そこに、登場したのがイベントループモデルを採用したNginxです。
イベントループモデルはシングルスレッドでループ処理をまわし、キューに溜まったイベントを処理していきます。
C10K問題を解決したわけです。

しかし、イベントループモデルにも弱点がありました。
それは、コードのどこかでブロックする処理が発生すると、、、
イベントループ自体の処理もストップしてしまい、パフォーマンスに大きく影響してしまうことです。

イベントループにおいてブロックする処理をなくそうということで出てきたものが、
「ノンブロッキング」ってわけです。


以上。(間違ってたらゴメンナサイmm

I wish you a happy new year


明けましておめでとうございます。
あなたにとってよい年になりますように。



ということで、
新年1発目の記事です。

iBeaconの記事も下書きのまま年を越してしまいました(汗
そして技術ネタも特にないので、
今年の目標でも。。。

今年の目標

  1. 与えられた仕事を頑張る
  2. 自社のインフラ整備に力を尽くす(だめだったら、、、|彡ッサ
  3. 目指せ1ヶ月3記事以上(本記事もカウントしまwww
  4. 帰省以外でプライベート旅行に行く


こんな感じでいいのかな。

ねよう。

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で受信(レンジング編)