鈍足ランナーのIT日記

走るのが好きな5流のITエンジニアのブログ。

趣味の範囲は広いけど、どれも中途半端なクソブロガー楽しめるWebアプリを作ってあっと言わせたい。サーバーサイドPerl(Mojolicious)、クライアントサイドVue.js。Arduinoにも触手を伸ばす予定。

タイムゾーンに頭を悩ませたけれど

筋トレ応援団の筋トレ履歴データをPostgreSQLに格納するのですが、将来的には
グローバルで使われることを考慮してどのように
格納すればいいのか割と真面目に考えたつもり。

DBはタイムゾーン付きのtimestampを使用する

CREATE TABLEでtimestamp with time zoneタイプで定義した。
あとは、insert文でcurrent_timestampを使うだけ。日本時間で保存されることになる。

今月の筋トレ回数を求める検索

クライアントのタイムゾーンで検索してあげればいい。将来的にはAsia/Tokyoを可変にすればいいのではないか。
PostgreSQLタイムゾーンの変換を委譲しちゃう感じです。

var moment = require('moment-timezone');
var today = new moment().tz('Asia/Tokyo');
var firstDay = new moment({year : today.year(), month: today.month(), day: 1}).tz('Asia/Tokyo').format();
var lastDay = new moment({year : today.year(), month: today.month()+ 1, day: 0}).tz('Asia/Tokyo').format();

SQLでfirstDay,lastDayの範囲指定で検索する。lastDayの00:00:00も含まれてしまうけれど!!
まぁいいか。

もっと簡潔に書ける

今月の範囲
var moment = require('moment-timezone');
var firstDay = new moment().startOf('month').tz('Asia/Tokyo').format();
var lastDay = new moment().endOf('month').tz('Asia/Tokyo').format();

今日の範囲
var moment = require('moment-timezone');
var firstDay = new moment().startOf('day').tz('Asia/Tokyo').format();
var lastDay = new moment().endOf('day').tz('Asia/Tokyo').format();

今週の範囲
var moment = require('moment-timezone');
var firstDay = new moment().startOf('week').tz('Asia/Tokyo').format();
var lastDay = new moment().endOf('week').tz('Asia/Tokyo').format();

まじかい、便利すぎじゃろ。

タイムスタンプの格納と検索について

筋トレ応援団の筋トレ履歴データをPostgreSQLに格納するのですが、将来的には
グローバルで使われることを考慮してどのように
格納すればいいのか割と真面目に考えたつもり。

DBはタイムゾーン付きのtimestampを使用する

CREATE TABLEでtimestamp with time zoneタイプで定義した。
あとは、insert文でcurrent_timestampを使うだけ。日本時間で保存されることになる。

今月の筋トレ回数を求める検索

クライアントのタイムゾーンで検索してあげればいい。将来的にはAsia/Tokyoを可変にすればいいのではないか。
PostgreSQLタイムゾーンの変換を委譲しちゃう感じ。

var moment = require('moment-timezone');
var today = new moment().tz('Asia/Tokyo');
var firstDay = new moment({year : today.year(), month: today.month(), day: 1}).tz('Asia/Tokyo').format();
var lastDay = new moment({year : today.year(), month: today.month()+ 1, day: 0}).tz('Asia/Tokyo').format();

postgresql リモートアクセス

# postgresql.confの編集

#pg_hba.confの編集
データベースとユーザは絞って設定

# データベース再起動

#iptables
/etc/sysconfig/iptablesでポートを解放

# ipatables反映
sudo service iptables restart

# データベース、ロールの作成

create role hoge password hoge;
create database db owner hoge;
alter role hoge login;

eng-entrance.com

MP3ファイルが1秒ぴったりにならない

sox input.mp3 output.mp3 trim 0 1
soxi output.mp3

どうやっても1.04秒のファイルしかできない。おかしいと思っていたら。。

http://www.manbou2ndclass.net/2016/02/mp3.html

どうやら、そういうものらしい。

wavで出力すると

sox input.mp3 output.wav trim 0 1
soxi output.wav

1秒ぴったりできた!

スマートスピーカーアプリのBGMをなんとかしたい

アプリのBGMをなんとかしたい。
クラウドワークスに発注したけれど、結構お金がかかりそうな予感。五千円以上。
クオリティ高いものはできるかもだけど。

ロイヤリティフリーというキーワードで探していけば良さそうだ。

www.looperman.com


drums.kirakira-soundeffect.com

tadaoto.com

https://www.250music.jp


www.motionelements.com

Promise,async,awaitどうやって使うのが良いか

awaitはasync functionの中で使うもの

また、async functionの中でawaitを使うと、処理終了までブロックされる。
ただし、async functionを呼び出し元のメインの処理は待つことはない。

以下のソースの中のasyncCall();の後ろにconsole.log("hoge")を書くとすぐ実行されることがわかると思います。

developer.mozilla.org

awaitの返却値はresolveした結果

awaitでpromiseでresolveした結果を受け取れるので、次の処理で利用できる

async functionはPromiseを返す

暗黙的にasync function はpromiseを返す。

結局どう書けばいいの?

非同期の処理(callback処理)はPromiseでラップしまくる。
async functionの中でawaitを使いながら同期処理的に書いていく。