読者です 読者をやめる 読者になる 読者になる

ざっくりん雑記

プログラミングで忘れそうなことをひたすらメモる

Heroku - タイムゾーンを日本に設定する

Heroku 備忘録

Herokuのタイムゾーン設定方法

一言でいうと

$ heroku config:add TZ=Asia/Tokyo --app [app-name]で設定可能。

サーバの現在時刻を調べる

HerokuはデフォルトでタイムゾーンAsia/Tokyoではない(リージョンはUnited Statesの場合)

コンソールを立ち上げて確認してみる(heroku run console)。

$ heroku run console --app hoge-app
Running console on ⬢ hoge-app... up, run.1087 (Free)
Loading production environment (Rails 4.2.7)
irb(main):001:0> Time.now
=> 2017-03-25 04:13:28 +0000
irb(main):002:0> exit

なお、Herokuで作成しているアプリが一つしかない場合は--appオプションは必要ないが、複数ある場合は一意に特定して実行するために--app [app-name]という感じで指定してあげている。

日本時間は現在13時頃だが、2017-03-25 04:13:28 +0000となっている。

サーバのタイムゾーンを設定する

$ heroku config:add TZ=Asia/Tokyo --app hoge-app
Setting TZ and restarting ⬢ hoge-app... done, v35
TZ: Asia/Tokyo

TZという環境変数Asia:Tokyoを設定することで、タイムゾーンが日本になる。

設定が反映されているか確認してみる。

$ heroku run console --app hoge-app
Running console on ⬢ hoge-app... up, run.2172 (Free)
Loading production environment (Rails 4.2.7)
irb(main):001:0> Time.now
=> 2017-03-25 13:14:20 +0900
irb(main):002:0> exit

日本での現在時刻と一致していることが分かる。

以上です。

追記: ブラウザで設定する

下記リンクのアプリ設定画面にてConfig VariablesからReveal Config Varsをクリックすることで、環境変数を管理できます。

https://dashboard.heroku.com/apps/[app name]/settings

ターミナルと同様に、TZという環境変数Asia:Tokyoを設定すれば良いです。

https://gyazo.com/885f68d443cd9dd1c671c4f82d6a8759

あれですね、$ heroku config:add TZ=Asia/Tokyoとこのブラウザで設定するのは同じ動作ということです。ブラウザ上で設定しても、heroku run consoleで設定がうまくいっているか確認すると思うので、ターミナルで設定するのがよさそう。

参考

qiita.com

Heroku - git push heroku master すると Everything up-to-date となる

備忘録 Heroku

現在チェックアウトして作業しているブランチをpushする

はじめてデプロイする際は難なくデプロイできて、 その後再度デプロイする際に、

$ git push heroku master

すると、

Everything up-to-date

既に全部上がってるよと言われる。

現在、自分がチェックアウトして作業しているブランチがmaster以外で、たとえばissues-3ブランチで作業している場合は、

$ git push heroku issues-3:master

としなければいけない、初歩的な勘違いでした。

参考

Heroku へ初デプロイで引っかかった bundle install - Qiita

Rails - 環境変数を三項演算子を使って適応させる

Rails Ruby 備忘録

方法

Rails.env == 'production' ? ENV['FACEBOOK_APP_ID_PRODUCTION'] : ENV['FACEBOOK_APP_ID_DEVELOPMENT']

三項演算子はすっきり書けて、最近ハマっています。

参考

たのしいRuby 第5版

たのしいRuby 第5版

【Ruby・Rails】三項演算子(条件演算子)を使ってif文をスリムに書こう! - Qiita

Swift - switch文

Swift 備忘録

Swiftでのswitch文の書き方

オーソドックスな書き方

let signalColor = "green"
switch signalColor {
case "green":
    print("通過しても良いです")
case "yellow":
    print("停止できるなら停止してください")
case "red":
    print("停止してください")
default:
    print("判定不能")
}
通過しても良いです

レンジ演算子を使った判定

for i in 1...20 {
    switch i {
    case (1...5):
        print("...")
    case (5...10):
        print(".........")
    case (10...15):
        print("................")
    default:
        print("default")
    }
}
...
...
...
...
...
.........
.........
.........
.........
.........
................
................
................
................
................
default
default
default
default
default

タプルを利用したswitch

let imageSize = (1080, 1920)
switch imageSize {
case (0, 0):
    print("幅, 高さともに0です")
case (320, 480):
    print("iPhone 3G世代")
case (1080, 1920):
    print("iPhone 6世代以降")
default:
    print("判定できませんでした")
}
iPhone 6世代以降

バリューバインディング

かっこいい響き。

let resolutionSize = (1080, 100)
switch resolutionSize {
case (0, 0):
    print("幅, 高さともに0です")
case (320, 480):
    print("iPhone 3G世代")
case (1080, let height):
    print("高さが規格外:\(height)")
case (let width, 1980):
    print("幅が規格外:\(width)")
case (1080, 1920):
    print("iPhone 6世代以降")
default:
    print("判定できませんでした")
}
高さが規格外:100

caseの条件式において値を使用する

let physicalInfo = (180, 80, 30) // 身長, 体重, 年齢
switch physicalInfo {
case let (height, weight, _) where (height >= 120) || (weight <= 100):
    print("体重が低すぎるか, 体重が重すぎるため, 乗れません")
case let (_, _, age) where (age >= 12):
    print("12歳以上でなければ, 乗れません")
default:
    print("乗れます")
}
体重が低すぎるか, 体重が重すぎるため, 乗れません

default を省略する

バリューバインディングを用いることで、かならず当てはまる条件式を書いた場合は、defaultを省略できる。

let point = (10,100)
switch point {
case (0, 0):
    print("中心点")
case (0, _):
    print("x軸上にある点")
case (_, 0):
    print("y軸上にある点")
case let(x, y):
    print("(\(x),\(y))")
}
(10,100)

参考

Swift - 複数の条件式を書く

Swift 備忘録

複数の条件式を書く時

Swiftのif文においては複数の条件式をカンマ区切り書くことができて、良い。

func judgmentPassOrFailTest(math:UInt, english:UInt) {
    if math >= 60, english >= 60, math+english >= 120 {
        print("あなたは合格です!", terminator: "/")
    } else {
        print("あなたは残念ですが, 不合格です", terminator: "/")
    }
    print("数学:\(math), 英語:\(english), 合計:\(math+english)")
}

judgmentPassOrFailTest(math: 56, english: 90)
judgmentPassOrFailTest(math: 63, english: 10)
judgmentPassOrFailTest(math: 62, english: 61)
あなたは残念ですが, 不合格です/数学:56, 英語:90, 合計:146
あなたは残念ですが, 不合格です/数学:63, 英語:10, 合計:73
あなたは合格です!/数学:62, 英語:61, 合計:123

参考

Swift - レンジ演算子

Swift 備忘録

レンジ演算子

レンジ演算子は、数値の範囲を指定できる演算子で、for文などで使います。

書式
開始値..<終了値
開始値…終了値

数値が範囲内にあるかどうかを調べるとき

おもしろい範囲の調べ方ができる…(じぶんにとって見たことがない記法だった)

let range = 1...5
print(range.contains(1))
print(range.contains(3))
print(range.contains(5))
print(range.contains(100))
true
true
true
false

for inでレンジ演算子を使う

for-in文における使い方は以下のようなかたち。

for i in (1..<5) {
    print("\(i) 回目")
}

for i in (1...5) {
    print("\(i) 回目")
}
1 回目
2 回目
3 回目
4 回目
--
1 回目
2 回目
3 回目
4 回目
5 回目

参考

Swift - タプル

Swift 備忘録

タプル

タプルは、複数の値を1個の値として扱えることが可能となる。1個の変数に複数の値を代入したり、関数で複数の値を返すこともできる。

宣言と代入

書式
(値1, 値2, ...)

たとえば、以下のような使い方ができる。

let book = ("Let's Swift!", 1200)
var sushikun:(String, Int, String) = ("おいしい", 200, "マグロ")

print(book)
print(sushikun)
("Let\'s Swift!", 1200)
("おいしい", 200, "マグロ")

ちなみに、型を指定していない場合は最初に代入した値をもとに型推論がされるため注意が必要。

let book = ("Let's Swift!", 1200)

book = ("Let's Android", "book")
error: cannot assign value of type 'String' to type 'Int'
book = ("Let's Android", "book")

値を取り出す

タプルに代入された値を取り出す際は、以下のように受け取る。

var book = ("Let's Swift!", 1200)
var (bookName, bookPrice) = book
print(bookName, bookPrice, separator: "/")
Let's Swift!/1200

以上のように、タプルに代入された値の数と受け取りたい数が一致していれば良いが、本の名前だけを取得したい、という場合には_というワイルドカードを使用すれば必要な値のみ受け取ることが可能になる。

var book = ("Let's Swift!", 1200)
var (bookName, _) = book
print(bookName)
Let's Swift!

タプルの値にインデックス番号でアクセス

先程の値を取り出す方法だと、たくさんの値が含まれたタプルの最後の値を取り出したい時に煩雑なコードになってしまう。

タプルはインデックス番号でアクセスすることも可能であるので、上記のような場合はこちらを利用したほうが見通しがよくなる。

var book = ("Let's Swift!", "Let's Xcode", "Let's Macbook", "Let's note")
print(book.3)
Let's note

タプルの値にラベルを付ける

それぞれの値がどういうものなのか、ラベルを付けることで区別することができる。

var book = (name: "Let's Swift!", price: 1500, isbn: "134321234532")
print(book.name)
Let's Swift!

参考