このエントリーをはてなブックマークに追加

2016年12月11日日曜日

はじめの一歩 -Rails 時間・タイムゾーン編- その3

どうもはじめです。

前回は時間に関するクラスである
「Time,Date,DateTime,TimeWithZone」の違い
について書いてみました。

はじめの一歩 -Rails 時間・タイムゾーン編- その2
今回は様々な日時の取得方法を見ていきます。
例としてTimeクラスとTimeWithZoneクラスを使用していきます。


Time

前回までも使用していますが、まずは現在時刻の取得から見ていきます。
Time.now
# => 2016-12-11 13:19:53 +0900

次に任意の時間を設定します。
Time.gmではUTCで時刻を設定し、
環境変数で設定しているタイムゾーンで時刻を設定したい場合は
Time.localを使用します。
Time.gm('2016,12,11,13,19,53')
# => 2016-12-11 13:19:53 UTC
Time.local('2016,12,11,13,19,53')
# => 2016-12-11 13:19:53 +0900

Timeクラスでは任意の秒数を加算減算して、
指定時刻からの数秒後、数秒前を取得することができます。
1日前、1日後を取得する場合
time = Time.now
# => 2016-12-11 13:19:53 +0900
time - 24 * 60 * 60
# => 2016-12-10 13:19:53 +0900
time + 24 * 60 * 60
# => 2016-12-12 13:19:53 +0900

文字列への変換は以下のように行います。
time = Time.now
time.to_s
# => "2016-12-11 13:19:53 +0900”

文字列からの変換を行うには
require 'time'
を記述する必要があります。
require 'time'
Time.parse('2016-12-11 13:19:53 JST')
# => 2016-12-11 13:19:53 +0900

unixtimeへの変換とunixtimeからの変換は以下のように行います。
time = Time.now
time.to_i
# => 1481429993
Time.at(1481429993)
# => 2016-12-11 13:19:53 +0900

Timeクラスには2038年問題がありましたが、
現在はすでに解消されているそうです。


TimeWithZone

現在時刻の取得は以下のように行います。
Time.zone.now
# => Sun, 11 Dec 2016 17:23:24 JST +09:00
Time.current
# => Sun, 11 Dec 2016 17:23:24 JST +09:00
Time.zone.nowまたはTime.currentで取得する時刻は
application.rbに設定したタイムゾーンを使用します。

任意の時間設定は以下のように行います。
Time.zone.parse('Sun, 11 Dec 2016 17:23:24 JST +09:00')
# => Sun, 11 Dec 2016 17:23:24 JST +09:00

次にさまざまの時刻を取得する方法です。
昨日明日
time = Time.zone.now
time.yesterday
# => Sat, 10 Dec 2016 17:23:24 JST +09:00
time.tomorrow
# => Mon, 12 Dec 2016 17:23:24 JST +09:00
先月来月
time = Time.zone.now
time.prev_month
# => Fri, 11 Nov 2016 17:23:24 JST +09:00
time.next_month
# => Wed, 11 Jan 2017 17:23:24 JST +09:00
去年来年
time = Time.zone.now
time.prev_year
# => Fri, 11 Dec 2015 17:23:24 JST +09:00
time.next_year
# => Mon, 11 Dec 2017 17:23:24 JST +09:00
その他にも以下のように表現することができます。
例として2日前と3年後を表示してみます。
time.ago(2.days)
# => Fri, 09 Dec 2016 17:23:24 JST +09:00
time.since(3.years)
# => Wed, 11 Dec 2019 17:23:24 JST +09:00

文字列への変換は以下のように行います。
time = Time.zone.now
time.to_s
# => "2016-12-11 17:23:24 +0900”

unixtimeへの変換とunixtimeからの変換
time = Time.zone.now
time.ti_s
# => 1481444604
Time.zone.parse(1481444604)
# => 2016-12-11 17:23:24 +0900

まとめ

TimeWithZoneではyesterdayやtomorrowなど 直感的に記述することができますが、
Timeクラスでも
require ‘active_support/all’
と記述することでTimeWithZoneと同様に
翌日や前日等の日時を表現することができます。

次回

次回はいくつかのタイムゾーンの紹介や
任意のタイムゾーンでの出力等ついて書いてみようと思います。

2016年12月10日土曜日

JQueryの.onメソッドについて

こんにちは、Taroです。
既に多くの方がご存知のことかと思いますが、JQuery 1.7以降、イベント定義では.onメソッドを使用することが主流なようです。
恥ずかしながら、私は昨日まで、下記のように書いておりました。
そのため、本日はこの.onメソッドについて調べてみたいと思います。
使用するJQueryのバージョンは1.12.4になります。
<div id="click" style="background-color: #cc0000; width: 50px; height: 50px;"></div>
<script>
  $(function() {
    $('#click').click(function() {
      $(this).css('background-color', '#00ff00');
    });
  });
</script>
それではこちらを.onメソッドで書き換えるとどうなるのでしょうか?
<script>
  $(function() {
    $('#click').on('click', function() {
      $(this).css('background-color', '#00ff00');
    });
  });
</script>
あまり変わらなく、逆にclickの方が直感的かも。。。
ただ、この.onメソッドの偉いところは、複数のイベントに対して定義ができることです。
$(function() {
  var change_color_flg = true;
  $('#click').on('click mouseenter', function() {
    if (change_color_flg) {
      $(this).css('background-color', '#00ff00');
      change_color_flg = false;
    } else {
      $(this).css('background-color', '#0000ff');
      change_color_flg = true;
    }
  });
});
これで、クリックしたときとマウスオーバーしたとき両方で色を変えることができます。 また、各イベントに対してハンドラを定義することもできます。 その際は、マップ(連想配列)で渡すようです。

$('#click').on({
  // クリックしたとき
  'click': function() {
    $(this).css('background-color', '#ff7fbf');
  },
  // マウスオーバーしたとき
  'mouseenter': function() {
      $(this).css('background-color', '#7fffff');
  },
  // マウスアウトしたとき
  'mouseleave': function() {
    $(this).css('background-color', '#bfff7f');
  }
});
これは見やすくなりました。
他にも便利な使い方がないかと、JQueryの日本語ドキュメントをながめてみました。
http://js.studio-kingdom.com/jquery/events/on

実は.onメソッドには4つの引数を与えられるようです。

  • 第一引数:イベント
  • 第二引数:セレクタ
  • 第三引数:ハンドラに渡したいdata
  • 第四引数:ハンドラ

第二引数と第三引数は省略可能です。
そのため、上述したように、イベントとハンドラだけでも動きます。
ただ、折角なので、使用してみたいと思います。

あとから追加した要素にイベントを定義する


親要素(#click)を起点として、子要素を監視させます。(以前はdelegete()で管理していたやつです。)
普通は後から追加した要素にイベントハンドラは実行されません。

<div id="click">
  <button>初めからある</button>
</div>
<script>
$('#click').on('click', 'button', function() {
  $(this).after("<button>新しいボタンです</button>");
});
</script>

イベントハンドラにデータを渡す



$('#click').on('click', {value: 'Hello'}, function(event) {
  alert(event.data.value);
});

おわりに


非常に簡単ではありますが、JQueryの.onメソッドについてまとめてみました。
今後もJavaScriptやJQueryについて学習したことを記述していきたいと思います。

2016年12月9日金曜日

「心の時代」にモノを売る方法


 こんにちは、Hiroです。今回は、ドトール会で発表した本に関してのブログになります。この本は、2012年11月に出版された本です。
 ちょうどその前後に、CRM(Customer Relationship Management)のWebサービスを開発をしていて、この本以外にも「小阪裕司」さんの本はよく読み返し、開発の参考にしたものです。

 さて、この本なのですが、消費社会の変化の中でどのようにモノを売るのか、そのためにはどのような能力を磨くべきなのかが事例をもとに書かれています。各章での概要を記載しますので、ぜひ参考にして興味があれば読んでみてください。

1. 変わりゆく消費社会とたったひとつの欲求

 この章では、時代の変化とともに、消費社会が変化している歴史について書かれています。
  1. 耐乏生活期
  2. モダン消費期(高度経済成長期)
  3. ポストモダン消費期
  4. ネオポストモダン消費期(縮む消費と選ぶ消費)
 モダン消費期は、「生産と分配の経済」であり、共通の需要の概念であありまsた。一方で、現在はモノが満たされ、需要が共通的ではなく、1回ごとの試みによって(お客様が喜ばれるかどうかが)模索される消費の時代となっています。例で食の話がでてきているのですが、「胃袋から舌へ、そして頭へ」という言葉がわかりやすいのではないかと思います。空腹を満たすための食から、味を楽しむ食となり、そしてワインに代表されるような頭で楽しむ食へと移り変わっていると小阪氏は説明されています。

2. なぜ、この「現実」が見えなくなるのか

 2章では、1章のように消費活動が大きく変化しているにもかかわらず、この現実が見えにくくなっている理由を説明しています。大きく3点に絞られて説明されています。
  1. 人は見ようとするものしか見えない(メンタルモデルとしての思い込み)
  2. 複雑すぎて見えない(局所的な解しか理解できない)
  3. 変化が大きすぎて見えない(受け入れがたい状況で防御的になる)
 この内容は、この消費社会が見えないということだけに関わらず、人が陥りやすい状況を説明していて、自分も気をつけなければならないと気づかされる内容でした。

3. 売れない三重の問題とビジネスの未来

 3章では、なぜ売れないのかを3つに絞って説明しています。
  1. そもそも伝えるべき価値を伝えるべき相手に伝えていない
  2. 心の豊かさと毎日の精神的充足感の面から捉え直していない
  3. モノをコトとして見られていない

4. 新しいビジネス6つの整理要件

 4章では、新旧でのビジネス要件を対比させながら新しいビジネスでの要件を説明しています。
  1. 旧:価格訴求         - 新:価値創造
  2. 旧:商品力(感性価値)    - 新:商品力(コストパフォーマンス)
  3. 旧:顧客コミニュニティの育成 - 新:人口と立地
  4. 旧:新基準の品揃え      - 新:豊富な品揃え
  5. 旧:もてなしとしつらえ    - 新:ローコストオペレーション
  6. 旧:人材育成(感性と実践知) - 新:標準化とマニュアル化

まとめ

 この本を読んで、所有物の移転から体験の取引へという言葉が一番印象的でした。マイカーやマイホームがほしいという所有したいという欲求をおして、モノを販売するではなく、体験つまりコトを提案して、結果としてモノが売れるという考えです。もちろん、全てが上記のような消費社会となっているのではなく、現在は旧来の消費社会と新しい消費社会が併存している社会であると小阪氏も言われています。
 今後のビジネスを考えていく上で、一般的にはなりつつある考えかもしれませんが、改めてこの本を一読してみると新しい発見があると思います。

2016年12月8日木曜日

はじめの一歩 -Rails 時間・タイムゾーン編- その2

どうも、はじめです。

前回は指定したフォーマットで時刻を表示するstrftimeについて書いてみました。
「はじめの一歩 -Rails 時間・タイムゾーン編-」
今回は日付や時間に関するクラスである
こちらの4つについて書いていきます。
「Time、Date、DateTime、TimeWithZone」

はじめに、

現在時刻の取得をした後、strftime()で「年月日、時刻、曜日、タイムゾーン」を表示して
それぞれの違いを見ていきます。


Time

こちらはRubyで用意されている時刻を表すクラスです。
現在時刻の取得、表示はこのように行います。
time = Time.now
# => 2016-12-07 21:28:39 +0900
time.strftime('%Y * %m * %d * %w * %U * %X * %Z')
# => "2016 * 12 * 07 * 3 * 49 * 21:28:39 * JST"
年月日、時分秒、曜日、タイムゾーンなどの情報を表示することができました。


Date

こちらはRubyで用意されている日付を表すクラスです。
使用する際は
require ‘date’
と記述をする必要があります。
現在時刻の取得、表示はこのように行います。
require ‘date'
date = Date.today
date.strftime('%Y * %m * %d * %w * %U * %X * %Z')
# => "2016 * 12 * 07 * 3 * 49 * 00:00:00 * +00:00"
Timeとは違って年月日、曜日のみ表示されました。
その他の時分秒、タイムゾーンの情報は全て0で表示されています。


DateTime

こちらは日付と時刻を扱えるDateのサブクラスです。
DateTimeもDateクラスと同様に使用する際には
require ‘date’
と記述する必要があります。
現在時刻の取得、表示はこのように行います。
requrire ‘date’
datetime = DateTime.now
datetime.strftime('%Y * %m * %d * %w * %U * %X * %Z')
# => "2016 * 12 * 07 * 3 * 49 * 21:28:39 * +09:00”
Timeクラスと同じように年月日、時分秒、曜日の情報が表示されましたが、
タイムゾーンに関しては表示が違います。
Timeクラスでは”JST"と文字列で表示されていますが、
DateTimeクラスの場合は”+09:00”とUTC(協定世界時)からの時差が表示されています。


TimeWithZone

こちらはRailsで使用することができるActiveSupport::TimeWithZoneクラスです。
素のRubyでは使用することはできません。
TimeWithZoneクラスでの現在時刻の取得、表示は以下のようになります。
timewithzone = Time.zone.now
timewithzone.strftime('%Y * %m * %d * %w * %U * %X * %Z’)
# => "2016 * 12 * 07 * 3 * 49 * 21:28:39 * JST”
こちらはTimeクラスと全く同じ表示になりました。

まとめ

Time、DateTime、TimeWithZoneの3つに関しては、
大きな違いはないように見えます。

調べてみたところTime、DateTimeの違いとしては以下の点があげられるようです。

Timeの場合、
・require無しで使える
・タイムゾーンの指定なしでインスタンスの生成を行った時、システムまたは環境変数で設定しているタイムゾーンが使用される
(DateTimeの場合はUTCが使用される)
・うるう秒を使える
・サマータイムを使える

ということからDateTimeよりTimeを使用したほうが良いとのことです。

Timeに対してTimeWithZoneはシステムや環境変数ではなく、
application.rbに設定したタイムゾーンが使用されるようです。
また、"Time.current"でタイムゾーンを指定して時刻の取得を行うこともできます。


つまり。。。
Time、DateTime、TimeWithZoneの全てが使える環境であれば、
タイムゾーンを柔軟に扱えるTimeWithZoneを使用し、
そうでない環境である場合はTimeを使用する形になるのではないかと思います。


次回

前回から今回にかけて現在時刻を取得して比較をしていましたが、
次回は翌日や翌年、時刻の指定やUnixTimeの変換等について
書いてみようと思います。

2016年12月7日水曜日

Swift3でMapKitの吹き出し(Callout)タップを取得したい!

こんにちは、onukiです。

今回、iOSのMapKitで吹き出しのタップを取得しようと思ったのですが、
これが案外簡単にいかなかったというか無理矢理やりました。(笑)

MKMapViewDelegateに以下のメソッドが用意されています
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
    //処理
}
ただ、こいつは基本的にMKAnnotationViewの
「leftCalloutAccessoryView」か「rightCalloutAccessoryView」にUIButton等のUIControlが取得できるものを配置し、
そして、そのボタンを押すなどした時に、このメソッドが呼ばれます。
しかし、今回やりたいことはGoogleMapみたいに吹き出しのどこでもタップできるようにしたいという事。
(というか吹き出しにボタンを配置したくない。。。)

というわけで結論を早々に述べるとMKAnnotationViewに直接UITapGestureRecognizerを設定します。
MapKitはピンを刺すときにMKAnnotationViewを使用していますがピン部分だけではなく
吹き出し(Callout)部分もSubViewではなくピンと一緒にMKAnnotationViewとして扱われています。
なので以下のようにすると吹き出し部分のタップも取得できます。
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(hoge.tapGesture(gestureRecognizer:)))
    view.addGestureRecognizer(tapGesture)
}
これで吹き出し部分のタップが取得できます!

ですが、このままだとピン画像(MKAnnotationView.image)の部分もタップできてしまうので、
タップ処理側で以下のような条件を付けます。
func tapGesture(gestureRecognizer: UITapGestureRecognizer){
    let view = gestureRecognizer.view
    let tapPoint = gestureRecognizer.location(in: view)
    //ピン部分のタップだったらリターン
    if tapPoint.x >= 0 && tapPoint.y >= 0 {
        return
    }
    //処理
}

なぜこれでいけるかというと、MKAnnotationView自体のフレームはピン画像部分のみで
吹き出し部分はMKAnnotationViewのフレーム外に描画されています。

以上、だいぶ無理矢理タップ判定しましたが
これでGoogleMapと同じく吹き出しのどこをタップされても取得することができます。
(もっとスマートなやり方ご存知の方、ご教授いただけると幸いです)