2016年5月24日火曜日

javascript Dateで前月と翌月の設定について

javascriptで日時を扱う時は、次のようにDateオブジェクトを生成して使用する。

var date = new Date();

そして、Dateオブジェクトには月を設定する関数(setMonth)がある。
次のように使用する。

date.setMonth(month);

なので、Dateオブジェクトの前月、翌月はsetMonthを設定することで可能だ。
前月の場合はこんな感じ。

date.setMonth(date.getMonth() - 1);


翌月の場合はこんな感じ。

date.setMonth(date.getMonth() + 1);


で、前月と翌月の設定はできそうであるが、はまったことがある。
当日が31日で、当日の前月と当日の翌月が30日までしかない場合に
当日(31日)の前月と当日が、setMonthだとうまく設定できなかったのだ。
次のコードのような場合だ。

function dateTest1() {
    var date = new Date();
    date.setMonth(5);//6月
    date.setDate(0);//5月の最終日を設定

    console.log("date.getMonth() = " + date.getMonth());
    console.log("date.getDate() = " + date.getDate());

    var previousM = new Date(date.getTime());
    previousM.setMonth(previousM.getMonth() - 1);

    console.log("previousM.getMonth() = " + previousM.getMonth());
    console.log("previousM.getDate() = " + previousM.getDate());

    var nextM = new Date(date.getTime());
    nextM.setMonth(nextM.getMonth() + 1);

    console.log("nextM.getMonth() = " + nextM.getMonth());
    console.log("nextM.getDate() = " + nextM.getDate());
}


このコードの実行結果は次のようになった。

date.getMonth() = 4
date.getDate() = 31
previousM.getMonth() = 4
previousM.getDate() = 1
nextM.getMonth() = 6
nextM.getDate() = 1


前月に設定したはずが当月と同じ。それで翌月に設定していたはずが翌々月になっている。
今回の場合、当日は5月31日である。それで当日のDateオブジェクトにたいしてsetMonthに当月の-1した値を設定すれば4月になるのではと思うのだが、4月31日なんてものはない。4月は30日までだ。なので、javascriptが5月1日にしている。(previousMのgetMonth()とgetDate()の結果)
なお、前月はsetMonthに当月の+1した値を設定すれば6月になるのではと思うのだが、6月31日なんてものはない。6月は30日までだ。なので、javascriptが7月1日にしている。(nextMのgetMonth()とgetDate()の結果)
それで、この問題をどう解消しようかと考えて次のコードで対応することにした。
どうしたかというと、setMonthを使用せずに、setDateを使用して、前月と翌月を設定させることにした。
setDate(0)は前月の最終日がされるので、当月のDateオブジェクトに対して、setDate(0)を行い前月を設定する。
そして、当月の最終日が設定されているDateオブジェクトに対して、setDate(date.getDate() + 1)をすることで、翌月を設定するようにしている。

function dateTest2() {
    var date = new Date();
    date.setMonth(5);//6月
    date.setDate(0);//5月の最終日を設定

    console.log("date.getMonth() = " + date.getMonth());
    console.log("date.getDate() = " + date.getDate());

    var previousM = new Date(date.getTime());
    previousM.setDate(0);

    console.log("previousM.getMonth() = " + previousM.getMonth());
    console.log("previousM.getDate() = " + previousM.getDate());

    var nextM = new Date(date.getTime());
    nextM.setDate(date.getDate() + 1);

    console.log("nextM.getMonth() = " + nextM.getMonth());
    console.log("nextM.getDate() = " + nextM.getDate());
}


コードの実行結果は次のようになった。
ちゃんと、前月と翌月が設定できていた。

date.getMonth() = 4
date.getDate() = 31
previousM.getMonth() = 3
previousM.getDate() = 30
nextM.getMonth() = 5
nextM.getDate() = 1

2016年5月21日土曜日

Facebookをやめた

Facebookをやめて1週間経った。
Facebookをやめた理由を一言で言うと、疲れるからだ。
まず、誕生日のメッセージや投稿のやり取りするのが面倒だ。
自分に誕生日のメッセージや投稿を送ってくれた人には、
誕生日にお返しのメッセージまたは投稿をしなければと思ってしまう。

次に、いいねとしてあげないといけないような
投稿もあるので、それに気をつかってしまう。

最後に、毎日Facebookをチェックする時間が
もったいないということ。
Facebookをチェックすることによって、何か学習できることがあればいいのだけど
Facebookのタイムラインを見ると、美味しいものを食べました。とか
観光名所に行きました。とかの類であって
それにを見ることによって、いいと思うことがないからだ。
あっ、そう。って思って終わりで、無駄な時間を費やしているだけだと思うようになった。

なので、Facebookの利便性があると思わない限り
Facebookは利用解除のままで、使用することはないと思う。

2016年5月15日日曜日

iPhoneが運転免許証になる。

イギリスでWalletアプリに免許証が格納可能になるみたい。


免許証いらないよな。
クラウドの電子データでいいし。
免許証の更新とかは、楽になるんだろうね。
免許証の発行での待ちとか、その間に動画見るとかは
免許証を発行する交通センターとかに行かなくてもいいような気がする。

あと、スマートフォンでなくても
指紋や顔認証になれば、もっといいのではと。

2016年5月4日水曜日

眼球に挿入する視力矯正用デバイス

眼球に挿入する視力矯正用デバイスってのがあるのか。

グーグル、眼球に挿入する視力矯正用デバイスの特許を出願

これが、実用できるのだったらレーシック手術と競合するよな。
視力だけでなく、耳につける小型の補聴器とか、聴力矯正用デバイスとかは出来なのかな?
私事だけど、自分の母親は耳が悪くなって、両耳に補聴器つけているだよね。
でも、それでも母親は音が聞きづらいから、コミュニケーションが取りにくい。
しかも、補聴器ってサイズが小さくないからな。耳にかけるイヤホンぐらいあるからな。
絶対ウザイと思う。大変だよな。

話戻すけど、眼球にデバイスを挿入するってすごいよな。
そのうちに、失明しても目の位置にデバイスというかセンサを入れれば、脳に何かしらの電波みたいなものを送れば、目が見えるような状態になったりして。
その前に、細胞複製技術が発展して、眼球ごと復活できるようになる可能性もあったりして。

2016年5月3日火曜日

npm installで単純ミスではまる

Node.jsでロケールの時刻を取得する処理を実装させるために、npmでGlobalizeをインストールしようとした。

インストールの方法は、次のサイトに説明が記述してある。

https://github.com/jquery/globalize/blob/master/README.md#installation


説明通りに、npmコマンドでGlobalizeをインストールしようと試みる。

すると、エラーが出ている。
コマンドラインは次の状態だ。

npm install globalize cldr-data.
npm http GET https://registry.npmjs.org/globalize
npm http GET https://registry.npmjs.org/cldr-data.
npm http 200 https://registry.npmjs.org/globalize
npm http GET https://registry.npmjs.org/globalize/-/globalize-1.1.1.tgz
npm http 404 https://registry.npmjs.org/cldr-data.
npm ERR! TypeError: Cannot read property 'latest' of undefined
npm ERR!     at next (/usr/local/lib/node_modules/npm/lib/cache.js:692:35)
npm ERR!     at /usr/local/lib/node_modules/npm/lib/cache.js:680:5
npm ERR!     at saved (/usr/local/lib/node_modules/npm/node_modules/npm-registry-client/lib/get.js:142:7)
npm ERR!     at /usr/local/lib/node_modules/npm/node_modules/graceful-fs/polyfills.js:133:7
npm ERR!     at Object.oncomplete (fs.js:97:15)
npm ERR! If you need help, you may report this *entire* log,
npm ERR! including the npm and node versions, at:
npm ERR!     <http://github.com/isaacs/npm/issues>

npm ERR! System Darwin 15.4.0
npm ERR! command "node" "/usr/local/bin/npm" "install" "globalize" "cldr-data."
npm ERR! cwd /Users/xxxxx/Documents/yyyyy
npm ERR! node -v v0.11.11
npm ERR! npm -v 1.3.25
npm http 200 https://registry.npmjs.org/globalize/-/globalize-1.1.1.tgz
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!     /Users/xxxxx/Documents/yyyyy/npm-debug.log
npm ERR! not ok code 0


TypeError: Cannot read property 'latest' of undefined ってエラーが出ている。
なんだろう。これは?
ググってみる・・・だけど、それらしい解決方法が見当たらない。
Globalize特有の問題でもなさそうだ。
コマンドラインの結果をまた見ている。
すると、 npm http 404 https://registry.npmjs.org/cldr-data. ってのがある。
https://registry.npmjs.org/cldr-data. が見つからないのかって思い。
数秒経過・・・あれ、最後に「.」があるんですけどなんで?
そういえば、npmのコマンドって間違っているのか?
コマンドラインを確認する。

npm install globalize cldr-data. になっている。
なんか最後の「.」はいらないような・・・

npmのコマンドは、先のGlobalizeのインストール方法の説明の箇所をコピペしたんだけど・・・
Globalizeのインストール方法の説明の箇所を見てみる。


あっ・・・最後の「.」いらないじゃん。余分にコピー対象に含めてたんだな。

その後、npm install globalize cldr-data のコマンドで無事にGlobalizeのインストールをできました。
こんなことで、約1時間ぐらいが無駄になった。嗚呼…
でも、こんな単純ミスって結構あるんだよな。

2016年5月1日日曜日

GoogleアカウントでOAuth2.0認証

GoogleアカウントでOAuth2.0認証させるようにしてみた。

まず、次のURLのサイト(Google APIsのコンソール)を表示させる。

https://console.developers.google.com/?hl=JA

Googleにログインしてなければ、ログインを促す画面が表示する。
ログインしていると次の画面が表示する。


吹き出しの中の [次へ] を押して次に進みます。


また、吹き出しの中の [次へ] を押して次に進みます。


吹き出しの中の [完了] を押します。(多分ここまでの吹き出しは初回だけだと思います。)
そして、左メニューの [API Maneger] を選択します。
そのあとに、左メニューの [認証情報] 選択して、中央の [認証情報を作成] を選択します。


[OAuthクライアントID] を選択します。


[同意画面を設定] を押します。


[メールアドレス][ユーザーに表示するサービス名]を入力して、[保存]を押します。


[アプリケーションの種類]の[ウェブアプリケーション] を選択して、[作成] を押します。


[名前] [承認済みのJavaScript生成元][承認済みのリダイレクトURI(※1 後で使用する)]を入力して、[作成] を押します。
[承認済みのJavaScript生成元]は、OAuth2.0認証のリクエスト要求元のURI。[承認済みのリダイレクトURI]は、OAuth2.0認証結果後にコールバックされるURIになる。



中央の全面のウインドウに、OAuthクライアントの[クライアントID(※2  後で使用する)][クライアント シークレット]が生成されるので、コピーして退避させときます。



以上で、Google APIsのコンソールでの設定は、完了。
ブラウザのアドレスバーに次のURLを入力して、動作を確認する。

https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=[※2]&redirect_uri=[※1]&scope=https://www.googleapis.com/auth/plus.me

(URLの[※1]及び[※2]は、事前の説明箇所で入力及び生成された内容と同じものを設定する。)

Googleにログインしてなければ、ログインを促す画面が表示する。
ログインしていると次の画面が表示する。
これで、OAuth2.0認証ができますね。
実際は、今回ブラウザのアドレスバーに入力したURLをWebアプリケーションに組み込んで使用するかと思います。
ちなみに、事前の説明箇所の入力箇所や生成箇所のグレイアウトしている箇所は、大事な情報ですので、他人には知らせない方が良いかと。(URI、クライアントIDなど)