athome-developer’s blog

不動産情報サービスのアットホームの開発者が発信するブログ

Herokuで動かしているRubyアプリでbower installしてgulpでbuild

やまだです。
夏休みはいかがお過ごしでしたでしょうか。
本日はその夏休み中に勉強がてら遊んでいた際のことでも。

TL;DR;

課題

異なる言語ごとのデプロイをしたい。

本体はRubyなのでbunldle installでOKだけど、
bowerとかgulpとかNode.jsの方も自動でやりたい。

対応

  • package.json"scripts"に下記を追加することでnpm install後に実行される
    • "postinstall": "bower install && gulp"
  • Buildpacksを下記の順番で設定
    • heroku/nodejs
    • heroku/ruby
  • Herokuでdeploy

くわしく

Herokuで動かしているRuby(Sinatra)のWebアプリがあり、そこでBootstrapなどを使っているわけです。
面倒なのでCDNとか使ってたんですが、ちょうど最近の業務で携わっているシステムでbowerやgulpも使っているんで、 勉強がてら導入してみました。

ローカルでの作業はひと段落して
「いやー、やっぱbowerとかgulpとか便利だねー」
と、ドヤ顔してたんですが、んじゃデプロイするか、となった際に
「はて、どうやってbower installとかgulp( default)を実行するのだろう」
と、困った。

postinstallを設定する

調べてみるとNode.js使ってる例ではpackage.jsonpostinstallを追加すればいいとのこと。

package.jsonへ追加し、まずはローカルでnpm installしてみたら 確かにbower installからgulp( default)の実行まで一気に実行できた。

なにこれ、超便利。

Buildpacksを設定する

が、まだローカルでの話で、結局Herokuでnpm installはどうやってやるのかな?とさらにググって下記の記事にたどり着く。

結構、単純…。

リンク先コマンドで設定しているけれどWebからも「Settings」に「Buildpacks」がある。
(「heroku/ruby」が設定済みの状態)

まずは単純に「heroku/nodejs」を追加してみたけど、先にRubyが実行されてしまうため失敗。
Webでは--index 1みたいなことはできなそうなので、一度「heroku/ruby」は削除し、

  • heroku/nodejs
  • heroku/ruby

の順番で追加。

f:id:ky04968:20160831112215p:plain

再度デプロイしdeploy logを確認すると無事に成功しました。

ASP.NET CoreをIISで動かす

情報システム部の高野です。
ASP.NET Coreは、標準でKestrelというWebサーバで実行されますが、
本番環境では、機能不足なのでIISやNginxをフロントに立ててそこからリバースプロキシするのが一般的だと思います。

今回は、リバースプロキシではない方法でIISから直接実行する方法をご紹介します。

IISの設定

まず必要なモジュールがインストールされているか確認します。
IISのモジュール画面を開き「AspNetCoreModule」があるか確認します。
f:id:taktak1974:20160824162813p:plain

なければこちらからWindows (Server Hosting)を選択して
ダウンロードしてインストールをしてください。


アプリケーションプールを作成します。
この時に「.Net CLRバージョン」を「マネージコードなし」にします。
f:id:taktak1974:20160824163910p:plain


Webサイトを作成します。
先ほど作成したアプリケーションプールを選択します。
あとのパラメータは適当に設定してください。
f:id:taktak1974:20160824164151p:plain

アプリケーションのデプロイ

publishコマンドを使ってデプロイ用のモジュールを作成します。

dotnet publish --framework netcoreapp1.0 --output "c:\temp\sampleApp" --configuration Release


ここまでの設定でIIS上でアプリケーションが動くようになっているはずです。
ちなみに再度デプロイをする際にIISを止めておかないとエラーになります。

Windows認証にしてみる

上記の方法で動かす方法を調査したきっかけが、
いま手掛けているシステムがWindows認証を行う必要がでてきたからなんですね。
ということで、ついでにWindows認証の方法も記載しておきます。

IISWindows認証を有効にします。
これだけだと認証の情報がアプリケーションには伝わらないので
アプリケーション側の設定を変更します。

Web.ConfigのforwardWindowsAuthTokenをtrueに変更します。

<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
    </handlers>
    <aspNetCore 
      processPath="%LAUNCHER_PATH%" 
      arguments="%LAUNCHER_ARGS%" 
      stdoutLogEnabled="false" 
      stdoutLogFile=".\logs\stdout" 
      forwardWindowsAuthToken="true"/>
  </system.webServer>
</configuration>

これでWindows認証ができるはずです。

このままだとVisualStudio Codeでデバッグした時にログインできないので
弊社では、Kestrelで起動した場合でもログインできるように
Windows認証とは別な認証も併せて実装しています。
この辺はもう少しスマートに、やりたいのですがなかなか良い方法が見つかりません。
Windows認証をやめるのが一番なんですが・・・)



もう少し良い方法が見つかればまたこちらでご紹介したいと思います。


参考サイト
Publishing and Running ASP.NET Core Applications with IIS - Rick Strahl's Web Log

PostgreSQLからOracleに接続するためのoracle_fdwをインストールした時にはまったこと

やまだです。

ある日、PostgreSQLOracleのテーブルを参照したい、との依頼を受けて作業したのですが、 その際にはまった点などもあったので、誰かの役に立つこともあるかもしれない、というわけで書き留めておきます。

使用したのは下記、PostgreSQLの拡張になります。

PostgreSQLは9.5です。

oracle_fdwのインストール

ダウンロード~インストール(make install)

とっても簡単。

curl -O https://github.com/laurenz/oracle_fdw/archive/ORACLE_FDW_1_4_0.zip
unzip oracle_fdw-ORACLE_FDW_1_4_0.zip
cd oracle_fdw-ORACLE_FDW_1_4_0/
make
make install

以上で、PostgreSQLのインストール先にライブラリが入ります。

もしこの辺でうまくいかなかったらREADME.oracle_fdw の下記のあたりとか怪しいかもしれないです。

oracle_fdw has been written as a PostgreSQL extension and uses the Extension Building Infrastructure "PGXS". It should be easy to install.

You will need PostgreSQL headers and PGXS installed (if your PostgreSQL was installed with packages, install the development package). You need to install Oracle's C header files as well (SDK package for Instant Client).

Make sure that PostgreSQL is configured "--without-ldap" (at least the server). See "Problems" below.

Make sure that "pg_config" is in the PATH (test with "pg_config --pgxs"). Set the environment variable ORACLE_HOME to the location of the Oracle installation.

https://github.com/laurenz/oracle_fdw/blob/master/README.oracle_fdw#L522-L538

PostgreSQLでの作業(CREATE EXTENSION)

CREATE EXTENSIONでエラーが発生する場合

下記のようなエラーが起きることがあります(というか起きました)。

ERROR: ライブラリ"/usr/pgsql-9.5/lib/oracle_fdw.so"をロードできませんでした: libclntsh.so.12.1: 共有オブジェクトファイルを開けません: そのようなファイルやディレクトリはありません

実際にはそのファイルは存在し、postgresユーザも参照可能(参照できない場合はchmod 775とかしとく)なのに、見れない。なぜ。。。 しばらく悩んで本家のGitHubのissueを見つけた。OSSバンザイ。

https://github.com/laurenz/oracle_fdw/issues/64

以下適当な訳。

Q:LD_LIBRARY_PATHやORACLE_HOMEは設定したはずなのにつながらないよ! A:ほんとに?PostgreSQL server process (postmaster).の環境変数確認してみ? cat /proc/<pid>/environ | xargs -0 -n 1

Q:ありがと!確認してみる!

Q:あ、設定できてなかったから.bash_profileに設定してみたよ。 そしたら動いたよ。ありがと。

A:手動で開始した場合はシェルの環境変数引き継いじゃうけど startup scriptとかで起動した場合は引き継がないです。 なので、PostgreSQLの起動スクリプト内の変数を設定することをお勧めします。 前に言ったように、ldconfigをを使用すると、さらにいいよ。

まんまと質問者の状況と同じでした。

作業時はシェル上でexport環境変数を設定し、そのままpsqlCREATE EXTENSION ...を実施した。 その後、PostgreSQLを再起動したため、必要な環境変数が未設定の状態で起動したことが原因。

というわけで、.bash_profileへ追加してもいいのだけど、 今回はldconfigを使用するため/etc/ld.so.conf.d/oracle.confに下記を追加。

echo "/opt/oracle/app/oracle/product/12.1.0/client_1/lib/" >> /etc/ld.so.conf.d/oracle.conf
ldconfig

なお、ldconfig実行時に下記のメッセージが出たが、oracle_fdwとしては問題ない模様。

ldconfig: /opt/oracle/app/oracle/product/12.1.0/client_1/lib/libexpat.so.1 はシンボリックリンクではありません

以上を実施後、念のためsystectl restart postgresql-9.5として再起動しても問題無いことも確認しました。

外部表作成時にエラーが発生する場合

よしよし、じゃあ外部表作っちゃうぞー。

ERROR: error connecting to Oracle: OCIEnvCreate failed to create environment handle

なんかやっぱり環境変数回りで失敗してる模様。仕方がないのでpotgresユーザの.bash_profileに書いたが、反映されず。 なのでsystemctlが使用する/usr/lib/systemd/system/postgresql-9.5.serviceをいじって下記の行を追加した。

  • Environment=ORACLE_HOME=/opt/oracle/app/oracle/product/12.1.0/client_1
  • Environment=LD_LIBRARY_PATH=/opt/oracle/app/oracle/product/12.1.0/client_1/lib
# It's not recommended to modify this file in-place, because it will be
# overwritten during package upgrades.  If you want to customize, the
# best way is to create a file "/etc/systemd/system/postgresql-9.5.service",
# containing
#       .include /lib/systemd/system/postgresql-9.5.service
#       ...make your changes here...
# For more info about custom unit files, see
# http://fedoraproject.org/wiki/Systemd#How_do_I_customize_a_unit_file.2F_add_a_custom_unit_file.3F

# Note: changing PGDATA will typically require adjusting SELinux
# configuration as well.

# Note: do not use a PGDATA pathname containing spaces, or you will
# break postgresql-setup.
[Unit]
Description=PostgreSQL 9.5 database server
After=syslog.target
After=network.target

[Service]
Type=forking

User=postgres
Group=postgres

# Note: avoid inserting whitespace in these Environment= lines, or you may
# break postgresql-setup.

# Location of database directory
Environment=PGDATA=/var/lib/pgsql/9.5/data/
Environment=ORACLE_HOME=/opt/oracle/app/oracle/product/12.1.0/client_1
Environment=LD_LIBRARY_PATH=/opt/oracle/app/oracle/product/12.1.0/client_1/lib

# Where to send early-startup messages from the server (before the logging
# options of postgresql.conf take effect)
# This is normally controlled by the global default set by systemd
# StandardOutput=syslog

# Disable OOM kill on the postmaster
OOMScoreAdjust=-1000

ExecStartPre=/usr/pgsql-9.5/bin/postgresql95-check-db-dir ${PGDATA}
ExecStart=/usr/pgsql-9.5/bin/pg_ctl start -D ${PGDATA} -s -w -t 300
ExecStop=/usr/pgsql-9.5/bin/pg_ctl stop -D ${PGDATA} -s -m fast
ExecReload=/usr/pgsql-9.5/bin/pg_ctl reload -D ${PGDATA} -s

# Give a reasonable amount of time for the server to start up/shut down
TimeoutSec=300

[Install]
WantedBy=multi-user.target

その後、systemctl restart postgresql-9.5.serviceとしたら

Warning: postgresql-9.5.service changed on disk. Run 'systemctl daemon-reload' to reload units.

と、警告されたので、警告通りsystemctl daemon-reloadで、 再度systemctl restart postgresql-9.5.serviceを実行。

後はPostgeSQLでの外部表作成、およびデータもちゃんと見れました。 作業完了~。

ASP.NET Coreの環境を切り替える方法

情報システム部の高野です。
今回は、ASP.NET Coreの環境を切り替える方法について書きたいと思います。

検証環境

  • Windows10
  • VisualStudio Code1.3.1
  • C#拡張1.3.0
  • .NET Command Line Tools 1.0.0-preview2-003121

※.NET Command Line Toolsがプレビュー版なので正式リリース版では仕様が変わる可能性があります

概要

VisualStudioやYeomanでプロジェクトを作成すると
_layout.cshtmlに下記のような記述があります。

<environment names="Development">
    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>
</environment>
<environment names="Staging,Production">
    <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.2.3.min.js"
            asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
            asp-fallback-test="window.jQuery">
    </script>
    <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.6/bootstrap.min.js"
            asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
            asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal">
    </script>
    <script src="~/js/site.min.js" asp-append-version="true"></script>
</environment>

こちらのenvironmentタグのnames属性に指定されているものが、ASP.NET CoreのEnvironment(環境)です。
上記の場合は、これを切り替えることにより読み込むJavaScriptを変えています。
他にもこのEnvironmentを使うことで開発機と本番機で動きを変えたりできるわけです。

準備

どの環境で実行されているか分かりやすいようにAboutページに環境名を表示します。

IHostingEnvironment env;

// IHostingEnvironmentをインジェクションする
public HomeController(IHostingEnvironment env)
{
    this.env = env;
}

public IActionResult About()
{
    ViewData["Message"] = "Your application description page.";

    // EnvironmentNameで設定した環境名が取得できる
    ViewData["Environment"] = this.env.EnvironmentName;

    return View();
}

dotnet runでの実行

まずは何も設定しない状態でdotnet runコマンドを実行してみます。

f:id:taktak1974:20160728133343p:plain

Productionと表示されました。なにも設定が無いと本番環境として実行されるようです。
デフォルトがProductionになるのは私のPCだけかもしれませんが、このままだとまずいのでDevelopmentに変更したいと思います。*1

下記コマンドを実行し環境変数を追加します。

setx ASPNETCORE_ENVIRONMENT Development

※永続的に変更したくない場合は、setコマンドを使います。
※もちろんGUIで追加しても大丈夫です。


一度コマンドプロンプトを起動しなおしてから、
もう一度dotnet runコマンドを実行しサーバを起動します。

f:id:taktak1974:20160728134518p:plain

これでDevelopmentで動作するようになりました。

デバッグでの実行

今度は、これをVisualStudio Codeのデバッグ機能を使って実行してみたいと思います。
こちらはデフォルトでDevelopmentで実行されました。
(画像は同じものになるので割愛します)
デバッグ時の環境は、VisualStudio Codeで最初にプロジェクトを開いた時に作られる
launch.jsonというファイルの設定に依存します。

"env": {
    "ASPNETCORE_ENVIRONMENT": "Development"
},

こちらの記述が無い場合は、環境変数を見に行くようです。

IISでの実行

Kestrelサーバを起動してIISからリバースプロキシする方法ではなくIISから直接実行します。
こちらはどうも環境変数を見てくれないらしく、なにも設定しないとProductionで実行されました。
IISの環境を変更するには、IISの構成に設定を追加します。


構成エディタのセクションを「system.webServer/aspNetCore」、
場所を「ApplicationHost.config・・・」に変更します。
f:id:taktak1974:20160728145034p:plain

environmentVariablesの追加ボタンをクリックします。
表示されたダイアログでnameに「ASPNETCORE_ENVIRONMENT」、
valueに「Development」を設定します。
f:id:taktak1974:20160728145436p:plain
IISのサイトを再起動します。

これでIISでもDevelopmentで起動することができます。*2

設定ファイルを切り替える

環境によって設定ファイルを切り替えることが可能です。
各環境の設定ファイルを「appsettings.production.json」のようなファイル名で作成します。
このファイルに環境ごとの設定を記述するだけで設定を切り替えることができます。

但しdotnet publishする時だけ注意が必要です。
デフォルトの設定だと追加した設定ファイルは、パブリッシュ先にはコピーされません。
appsettings.○○.jsonファイルもコピーするためにはproject.jsonに追記します。

"publishOptions": {
  "include": [
    "wwwroot",
    "Views",
    "Areas/**/Views",
    "appsettings.json",
    "appsettings.production.json", // 追加
    "web.config"
  ]
},

本当は、パブリッシュするときにappsettings.jsonにマージしてくれるのが良いのですが
いまのところそのような機能は無いようです。

まとめ

Webサーバやデバッグ実行などによってEnvironment(環境)を設定する場所が違うので注意が必要。
dotnet publishは、設定を追加しないと新しく追加したファイルをコピーしてくれない。
ツールがまだプレビューなのでもっと使いやすくなることを期待したい。


弊社ではエンジニアを募集しています。
athome-inc.jp

*1:なんでデフォルトがProductionなんだろうか? なにか変な設定が入っているのかな?

*2:StartUpクラスのコンストラクタにbuilder.AddUserSecrets()の記述があるとIISの時だけ500エラーが発生しました。原因は今のところ不明です。

情報システム部内で開発ツール統一を目指している話 ~ HipChat自動通知活用編 ~

物件管理システム開発グループのいけやです。

MongoDBやRailsAWSを扱うプロジェクトチームにいます。
コードをがりがり書いています。

今回のテーマについて

ここ1~2年、情報システム部内で、開発に関わるツールを、Atlassian製品に統一していこう、という取り組みがあります。
今回は、この取り組みの一環として、
私が所属するチームでの HipChatの自動通知に関する活用・運用例 を紹介します。

補足: この取り組みのねらい

部内全体で、というこの取り組みのねらいは、下記です。

  • 各ツール間の連携を強くすることで、スムーズで漏れのない進捗管理を得る
  • 統一ツールを使うことで、部内全体のノウハウの蓄積・共有や異動時のキャッチアップ時間短縮を図る
  • ツール制作会社を揃え、ツール間連携をより簡単に密に構築できるようにする

このねらいに基づき、製品選定を行い、
結果、JIRAが社内にいちばん広く浸透していたので、Atlassian製品で決定 ⇒ HipChat、Confluence、Bamboo、Bitbucketを導入することになりました。
検討が長引いたため、実導入が行われたのはつい3ヶ月ほど前です。

前提

プロジェクトチームの紹介

  • 開発しているのは主に下記です。
    1. 当社の物件情報を保有・管理する「物件API」(RailsやMongoDB, Solrなどを使っています)
    2. 当社の画像情報を保有・管理する「画像API」(Rails, AWSなどを使っています)
  • 20~25人ほどで開発
    • 3~4チームくらいに分かれている(インフラ系、オンライン系など、作業層で分割)
  • テスト環境は計10面
    • 複数案件を並行して開発するため、それぞれ別バージョンのデプロイが行われる
  • 部内ツール統合の動きの1年程前から、HipChat、Confluence、JIRAのチーム内利用を開始
    • メール運用はあまりない。当社規定のWebメールでは、デスクトップ通知がないため

自動通知方法

活用・運用例

障害通知

  • 通知元: Errbit, CloudWatch, NewRelic
  • 「通知が来たら、ボールの持ち主をはっきりさせる」というルールがある
    • 「わたしが見ます」「○○さん、確認してください」のやり取りを必ずする
    • 「通知が来たら確認する人」を持ち回り制にして、より確実に

f:id:mi15795:20160723163245p:plain

効果

  • 作業状況の周知や、役割分担などがスムーズに進むようになった
  • 「誰かが見ていると思って誰も何もしていない」「複数人で同じ調査をし始める」など、
    「ちょっとの連携があればなくなるもの」がようやくなくなった

⇒ この「ちょっとの連携」をカバーするのが、チャットの大きな効果だと思います。
  さらにチーム内の運用ルールを定めることで、少ない手間で仕事を回していくことができるようになりました。

デプロイ通知

  • 通知元: Capistrano, Chef
  • 通知内容: デプロイ先、ブランチ名、コミットコメント(デプロイ先が本番のときのみ)
  • 専用の通知部屋を作成し、@allメンションで全員に通知

効果

  • 周知の手間・漏れがなくなった。
    • テスト環境で「これってデプロイされていますか?」の問合せもなくなった。
  • 本番リリースの内容を簡単に確認できて、開発者も安心する(自分のコミットがリリースされた、と)

一定期間放置されているブランチ・JIRA課題の通知

  • 通知元: GitLab API(ゆくゆくはBitbucketに), JIRA API(を叩くスクリプト
  • 通知内容: 「このブランチは30日間更新がありません」「この課題は1週間更新がありません」「確認・更新してください」
  • 個人(ブランチ最後のコミッター/課題担当者)の元にダイレクトメッセージを飛ばす

f:id:mi15795:20160715155436p:plain

効果

  • 不要なブランチがリモートに溜まらなくなった(ブランチ運用の事故防止)
  • 「これはいったい、今どうなっているのか?」という、不明なブランチ・タスクがなくなり、全体の見通しがよくなった
  • "掃除を呼びかける人"がいなくなった(自動化バンザイ!)

気をつけていること

HipChatの「良さ」を潰さないように気を付ける必要があります。

  • 必要な通知だけが届くようにする
    • 「来てもどうせ見ない」ものは通知しない。需要があるかどうかを定期的にメンバーに確認する。
    • 「個人メンションを付けるか付けないか」「@allか」「グループチャットかダイレクトメッセージか」など、通知範囲・方法をよく検討する。
      • カスタム通知機能で、自分に関係のない通知を省けるので、この機能を利用者している人は多い。
        通知方法を誤ると、通知がポップアップされないことも。

さいごに

これらの、「開発しやすい環境」を育んできた自動通知ですが、
実は結構、スクリプトを書いて実現しているところも多いです。

BambooやBitbucketへの移行が済んだら、もっとかんたんに拡張していけるかなと期待しています。
さらなる「開発しやすい環境」を目指していきたいです。

AWS Summit 2016 Tokyo で拝聴したセッションの感想

情報システム部の山本豊です。不動産情報サイト「アットホーム」のインフラを主に担当していました。
クラウドに興味がありまして、当社で有効活用出来ないかと考えています。
また、データサイエンスにも興味がありまして、ぼちぼちと勉強を始めています。


先日、2016年6月1日(水)~6月3日(金)に開催された「AWS Summit2016 Tokyo」に行って、下記のセッションを聴かせていただいたので、その感想を書こうと思います。

クラウド上に効率的なビッグデータ処理基盤を構築するには?~データ特性に応じたシステム設計~

セッション内容は、amazonが公開している資料・ご動画を参照ください。

AWS Summit Tokyo 2016 セッション資料・動画一覧 | AWS

AWSを使うかどうかは別として、下記は共感、納得しました。

・「データは加工せず、全期間残す」(データレイク)
AWS S3 ならディスク容量気にせずに保管出来るよ!!
・データの温度を定義しよう。ホットデータ、コールドデータ。
・ホットデータは、今すぐ分析したいデータ。
・コールドデータは、今は使わないけど後で使うかも(月末、年度末とかに分析するかも)
ビッグデータ基盤が出来れば、IoT、ディープランニング、未来予測が出来る様になるよ!!

以下は、社内でビックデータ基盤を構築した場合の妄想です。

もしこんな基盤があったら、社内でレコメンドエンジンが作れるなぁと思いました。
当社が運営する不動産情報サイト「アットホーム」のユーザーの検索操作や回遊データを元にすれば、ユーザーが求めている条件に近い物件をお勧めする事が出来ます。
物件探しは、自分の条件に「100%」一致する物件を見つけるのは苦労する事が多いので、それを自動的にお勧めしたり、似た様な条件の物件をお勧めしたりする事で、ユーザーの苦労を少しでも手助けする事が出来ると思います。
現在は他社のレコメンドエンジンを使用して同様の事を実施していますが、自社で開発すれば、より細かいレコメンドのチューニングをしたり、最近のユーザー動向などを当社顧客である不動産会社様にフィードバック出来るかもしません。
また、ユーザー検索操作や回遊データを元に新しいサービスを開発する事も出来ると思います。

(自分が作ると思っていないので妄想全開ですw)

ただ、そんな基盤を構築するには、アットホームサイトはユーザー行動を分析する為のデータ(ログ)まだ足りていないような気がします。

エンジニアの立場からすると、こんなデータ・ログがあれば、こんな分析が出来そうだなと思う事があるのですが、今まで企画部署のデータ解析する人達から統計っぽい分析(クラスターや回帰分析)をしたいと言う要求がなかったので取っていなかったりします。
オンプレでサービス稼働しているので、使う予定の無いデータを蓄積する程のディスクの余裕が無いのです。

データ蓄積してBIツールで見せられればデータ解析担当の意識も変わるかもしれないと思っているんですが、そもそも自分も統計学に詳しくなかったり、プレゼンが苦手だったりで自信がないのです (^^;)

こっそり、AWSの個人アカウントで出来る事を色々試してみようと妄想している今日この頃です。

余談ですが、本サミットでは S3にデータ保管 → データ解析→ IoTやディープラーニングという事例が多く発表されていました。
大小さまざまな企業がビックデータ、IoT、ディープラーニングの現実的なビジネスを始めているんだなぁと思いました。

一言、断っておきますが、私はAWSに偏っているわけではなく、Azure、Google、 Bluemix にも興味があります。今後は、幅広いテーマで、いろいろと書いていきたいと思います。

JavaScriptとC#の日付型の受け渡しで嵌った件

情報システム部の高野です。アーキテクチャ構築をメーンに担当しています。

今回は、JavaScriptのDate型をAjaxC#のDateTime型にバインドさせた時に嵌った話です。
(そもそも文字列型に変換してから送ればいい、という話は棚の上に置いておきます)

とりあえず環境
・クライアント
→AngularJS(AjaxもAngularを使って実行)
・サーバ
ASP.NET Core MVC 1.0


下の画像のようなコントロールに入力したデータをサーバに送信します。
(Angular UIを利用しています)
f:id:taktak1974:20160714134256p:plain

サーバ側で見るとこうなります。
f:id:taktak1974:20160714134238p:plain
UTCになってる!
しょうがないので、C#側でローカルタイムに変換します。

これで問題解決と思ったのですが、別の問題が発生します。
この登録したデータを編集するためにクライアント側で開きます。
IEやedgeだと問題はありません。
f:id:taktak1974:20160714134832p:plain
でもchromeだと、
f:id:taktak1974:20160714135112p:plain
9時間後になってしまいます!

これはC#側でちょろっと変換しておけばいいや、という話ではなくなりました。
なにか根本的に問題がある!

そこでいろいろ調べました。
Angular UIの設定?
JavaScriptのDate型になにかすればいいの?
AngularJSのAjax処理?

で、行きついたのはJson.NETの設定でした。
たどり着くまでかなり遠回りをしましたが、分かってしまえば簡単で、
StartupのConfigureServicesメソッドに設定を追加するだけでした。

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddJsonOptions(options => {
            options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            options.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Local;
        });
   …
}

AddJsonOptionsの2つ目の設定が必要でした。
(ちなみに、1つ目の設定は、JSONのプロパティ名の頭を小文字にする設定です。)

この設定をすることによりわざわざローカルタイムに変換する処理もいらなくなりますし
chromeでも正しい時間が表示されます。


一応、解決はしましたが根本的な原因が分かっていないので
今後、時間ができたら調べてみたいと思います。

あ、国内でしか使わないシステムなのでこのような対応にしています。あしからず。