OmniAICreator/Qiita-1.07M huggingface dataset:
#Rails ( or #Ruby + ActiveSupport ) : Time.zone.now VS Time.current what is difference?  when specify Time.zone then used ActiveSupport::TimeWithZone class else use Time class

```rb
require 'active_support/core_ext'


# No Time.zone setting

Time.use_zone(nil) { Time.current }
# => 2019-11-29 07:38:04 +0900

Time.use_zone(nil) { Time.current.class }
# => Time



# with Time.zone setting
# Time.current class changed Time to ActiveSupport::TimeWithZone

Time.use_zone('UTC') { Time.current }
# => Thu, 28 Nov 2019 22:38:20 UTC +00:00

Time.use_zone('UTC') { Time.current.class }
# => ActiveSupport::TimeWithZone

Time.use_zone('UTC') { Time.zone.now }
# => Thu, 28 Nov 2019 22:38:26 UTC +00:00

Time.use_zone('UTC') { Time.zone.now.class }
# => ActiveSupport::TimeWithZone



require 'active_support/testing/time_helpers'
include ActiveSupport::Testing::TimeHelpers

# Freeze time
Time.use_zone('UTC') { travel_to Time.parse('2020-01-01 00:00') }

Time.use_zone('UTC') { Time.current == Time.zone.now }
# => true


# NOTE
# Time.parse class not changed to ActiveSupport::TimeWithZone

Time.parse('2020-01-01 00:00')
# => 2020-01-01 00:00:00 +0900

Time.parse('2020-01-01 00:00').class
# => Time

Time.use_zone('UTC') { Time.zone.parse('2020-01-01 00:00') }
# => Wed, 01 Jan 2020 00:00:00 UTC +00:00

Time.use_zone('UTC') { Time.zone.parse('2020-01-01 00:00').class }
# => ActiveSupport::TimeWithZone

```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2778








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#Rails ( or #Ruby + ActiveSupport ) の Time.zone.now と Time.current の違いは Time.zone 指定の有無であり、Time class と ActiveSupport::TimeWithZone class が切り替わることが判明

```rb
require 'active_support/core_ext'


# No Time.zone setting

Time.use_zone(nil) { Time.current }
# => 2019-11-29 07:38:04 +0900

Time.use_zone(nil) { Time.current.class }
# => Time



# with Time.zone setting
# Time.current class changed Time to ActiveSupport::TimeWithZone

Time.use_zone('UTC') { Time.current }
# => Thu, 28 Nov 2019 22:38:20 UTC +00:00

Time.use_zone('UTC') { Time.current.class }
# => ActiveSupport::TimeWithZone

Time.use_zone('UTC') { Time.zone.now }
# => Thu, 28 Nov 2019 22:38:26 UTC +00:00

Time.use_zone('UTC') { Time.zone.now.class }
# => ActiveSupport::TimeWithZone



require 'active_support/testing/time_helpers'
include ActiveSupport::Testing::TimeHelpers

# Freeze time
Time.use_zone('UTC') { travel_to Time.parse('2020-01-01 00:00') }

Time.use_zone('UTC') { Time.current == Time.zone.now }
# => true


# NOTE
# Time.parse class not changed to ActiveSupport::TimeWithZone

Time.parse('2020-01-01 00:00')
# => 2020-01-01 00:00:00 +0900

Time.parse('2020-01-01 00:00').class
# => Time

Time.use_zone('UTC') { Time.zone.parse('2020-01-01 00:00') }
# => Wed, 01 Jan 2020 00:00:00 UTC +00:00

Time.use_zone('UTC') { Time.zone.parse('2020-01-01 00:00').class }
# => ActiveSupport::TimeWithZone


```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2779








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#Rails ( or #Ruby + ActiveSupport )  + travel_to  :  freeze to localtime beggining of year and ref UTC date and time and timestamp 

```rb
# REQUIRE : on Ruby

require 'active_support/testing/time_helpers'
# => true

require 'active_support/core_ext'
# => true

include ActiveSupport::Testing::TimeHelpers
# => Object


# Travel to JST beggining of Year

travel_to Time.use_zone('Tokyo') { Time.parse('2020-01-01 00:00') }
# => nil


# JST

Time.use_zone('Tokyo') { Time.current }
# => Wed, 01 Jan 2020 00:00:00 JST +09:00

Time.use_zone('Tokyo') { Time.zone.now }
# => Wed, 01 Jan 2020 00:00:00 JST +09:00

Time.use_zone('Tokyo') { Date.current }
# => Wed, 01 Jan 2020


# UTC


Time.use_zone('UTC') { Time.current }
# => Tue, 31 Dec 2019 15:00:00 UTC +00:00

Time.use_zone('UTC') { Time.zone.now }
# => Tue, 31 Dec 2019 15:00:00 UTC +00:00

Time.use_zone('UTC') { Date.current }
# => Tue, 31 Dec 2019


# Unix Timestamp
# are All same at any Timezone

Time.use_zone('Tokyo') { Time.zone.now.to_i }
# => 1577804400

Time.use_zone('UTC') { Time.zone.now.to_i }
# => 1577804400

Time.now.to_i
# => 1577804400

Time.current.to_i
# => 1577804400


# UTC vs JST near date change line

travel_to Time.use_zone('Tokyo') { Time.parse('2020-01-01 08:59') }

Time.use_zone('UTC') { Date.current }
# => Tue, 31 Dec 2019

travel_to Time.use_zone('Tokyo') { Time.parse('2020-01-01 09:00') }
# => nil

Time.use_zone('UTC') { Date.current }
# => Wed, 01 Jan 2020

```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2777








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Java変数のvolatile修飾子とは？

# volatile修飾子の概要
- 変数に付与する修飾子だよ。場合によってはsynchronizedの代わりに使える。
- 以下が利用例。

```Java
private static volatile int count = 0; 
```

# 役割１： キャッシュ値からの読み取りを禁止する
- マルチスレッドが使われている場合、各スレッドがフィールドの値をキャッシュすることがある。このキャシュの対象外にする役割（パフォーマンス向上のために、各スレッドが変数のコピーを用意するため、メインメモリの値に変更があると、スレッド内の値と乖離が発生する可能性がある）
- volatileつけると**この変数はメインメモリから読み込んでね**というお願いができる。

# 役割2: コンパイル時の最適化の対象外にする
- Javaのコンパイル時には無駄な評価をなくすように最適化が行われる。

```
# 以下のようなコードは...
boolean flg = true;
while(flg){
    System.out.println("hello!");
}

# 以下のように最適化される... →　別スレッドでflgをfalseに変更する前提だとループが終わらない！
if(flg){
  while(true){
       System.out.println("hello!");
  }
}
```
- volatileを付与することで上記のような**最適化をおこなわないようにしてね**、というお願いができる。


# synchronizedとの違いは？
- synchronizedの方が高機能（volatileはsynchronizedの簡易版的な感じ）
- volatileは上記の役割を持つが、スレッドセーフというわけではない。
- volatileはスレッドとメインメモリ間の変数を同期する（=キャッシュせずに値をメインメモリから読みとりますよ）役割であるが、synchronizedはそれに加え、排他制御を行いますよという役割も持つ。
- **volatile**が排他制御に使えますよ、っていうのは間違い。


# 参考文献
[Difference Between Volatile and Synchronized Keywords in Java]
https://dzone.com/articles/difference-between-volatile-and-synchronized-keywo
VS Codeで入れとくと便利なプラグインとか設定とか-フロントエンド向け

#はじめに

フロントエンドエンジニアよりのWEBデザイナーとして、VS Codeを約2年ほど使ってみて入れてて良かったなぁ　便利だなぁと思ったプラグインを紹介いたします。

・環境
使い始めたときはWindowsで使用していましたが、今はMacです。
大体どちらでも使用感は変わらない気がします。

・対象
VS Codeを使ってみたいコーダー、フロントエンドエンジニア向け。

##VS Codeってなに？

VSCode（Visual Studio Code）はMicrosoft社製のテキストエディタです。
無料で使えて、プラグイン（拡張機能）も豊富なのでとても便利です。
自分は使いはじめてすぐに惚れ込みましたw

##Japanese Language Pack for VS Code

日本語化プラグイン
英語が残念な私にとっては必須です。。。

##vscode-icons

表示あれるアイコンを変更できるプラグインです。

![screenshot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251910/4a56a94a-77ab-09fa-04dc-190dbb9e4820.gif)

##Bracket Pair Colorizer

{や（などの括弧をわかりやすく色付けしてくれるプラグインです。
対応する括弧がどこか一目瞭然となるため、jsを書く時などに便利です。

##Indent-Rainbow

インデントを階層ごとに虹色に色分けしてくれるプラグインです。
好みは分かれそうw

##vscode-htmltagwrap

ドラッグして選択した文字列をタグで囲むことができるプラグインです。

![screenshot-1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251910/202d2f5f-9a84-ecc2-0b1a-9bdf8bab323b.gif)

使い方は
ドラッグして文字列を選択して　option　＋　W
これで前後を　<p> </P> で囲むことができる。
デフォはpタグですが、そのままの状態で編集すれば、別の要素に変えることができます。
かなり昔DWでコーディングしてた時に重宝してた機能で、VS Codeでも同じことできないかなぁ、、、なんて探してみたら見つかりました！

##Color Highlight


カラーコードを実際の色で可視化してくれるプラグインです。

![Untitled-3 — neo (ワークスペース) 2019-11-29 11-30-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251910/32bf0cc5-0797-a1aa-45f9-7152425937cc.png)

##Partial Diff

ドラッグして選択した部分の差分を簡単に確認できるプラグインです。

![public.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251910/a68a6f3a-6d4a-9115-3c59-372508be1ffd.gif)

##VS Color Picker

その名の通りカラーピッカーを表示させるプラグインです。

![usage_palette.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251910/e0ab7dea-114f-b6fa-61c0-bd82ed6ea4a6.gif)

##Whitespace+

空白文字を可視化してくれるプラグインです。
併せて
### zenkaku
も使用することで更に余計な空白を見つけやすくなります。
全角空白が原因でエラー・・・なんてことが減ります！

![readme01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251910/bee59dab-551f-96c5-f1d6-5331fd73fe4c.png)

更に！私は
###Trailing Spaces
も併せて使っていたりします。
こちらは行末の無駄な空白を可視化してくれます。

##テキスト校正くん

###番外編
日本語の文章をチェックしてくれるプラグインです。
txtファイル、mdファイルなどを開くと自動で文章のチェックをしてくれます。


![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251910/0ab66fcd-9a11-5dc9-4a47-77515b1f4332.gif)

##設定

###自動でフォーマット
以前はPrettier や Beautify　といったプラグインを使用していましたが、
現在はVS Codeにデフォで設定があるのでそちらを使用しています。
setting.jsonの中にある
```
"editor.formatOnPaste": true,
    "editor.formatOnSave": true,
    "editor.formatOnType": true,
```
この項目を全てtrueにすると
上から
ソースをペーストした時に自動でソースフォーマットを適用
ファイルを保存する時に自動でソースフォーマットを適用
入力した時に自動でソースフォーマットを適用
となります。

##まとめ

Qiita初投稿となります。
自分への備忘録も兼ねて、エディタの便利機能をまとめてみました。
ここに紹介したプラグイン以外にも使用しているプラグインはあるのですが、今回は万人が便利に感じるであろう機能に絞ってみました。
これからVS Codeを使ってみよう！という方や、前から使ってるけどこのプラグインは知らなかったという人に届けば嬉しいです。
Pythonのlambda式で複数行を実行させたいので実験した

# 結論から先に書くと
print("")を2回実行させたいような場合を除いて、lambda式で複数行を実行させようと考えるのではなく、コールバック関数を使って実装した方がバグを発生させずにコーディングできると思いました。以下、その考察過程です。

## コールバック関数を使った場合
・コールバック関数なので、コールバック関数内で複数行を実行するのは問題ない。

```python
# コールバック関数
def call_back():
    print("aaaa")
    print("bbbb")


# 高階関数
def higher_order(func):
    return func()


higher_order(call_back)
# 実行結果
# aaaa
# bbbb
```

## 上のコードをlambda式を使って書き換えた場合
・配列にすると上手くいきました。lambda式は「文ではなくて式」なので、複数行は基本的にはできませんが、戻り値を配列にすると、複数行の実行が可能になるようです。但し、難しい処理はしないで、print("")のように簡単な処理に限定して利用した方がよいと思われます。

``` python
# 高階関数
def higher_order(func):
    return func()


higher_order(lambda: [print("aaaa"), print("bbbb")])
# 実行結果
# aaaa
# bbbb
```

# コールバック関数に引数を付けて考えてみる
``` python3
# コールバック関数
def call_back(a, b):
    a += 1
    b = a + b + 100
    return a, b


# 高階関数
def higher_order(func, a, b):
    return func(a, b)


aa = 1
bb = 10
(aa, bb) = higher_order(call_back, aa, bb)
print("aa = " + str(aa))
print("bb = " + str(bb))
# 実行結果
# aa = 2
# bb = 112
```

## 上のコードをlambda式で置き換えた場合
``` python3
# 高階関数
def higher_order(func, a, b):
    return func(a, b)


aa = 1
bb = 10
(aa, bb) = higher_order(lambda x, y: [x + 1, y + x + 100], aa, bb)
print("aa = " + str(aa))
print("bb = " + str(bb))
# 実行結果
# aa = 2
# bb = 111
```
bbが112と111で違いが発生しています。このような違いはバグになってしまうと思われるので、lambda式で複数行を実行するというようなチャレンジは行わないで、コールバック関数でしっかり実装した方が良いと思いました。
ベテランになるとまた違う考えがあるのかもしれませんが、今の自分の知識ではこのような結論に至りました。
rubyのバージョンアップ

# rubyのバージョンアップする時の方法



この記事は私の備忘録として記載していきます。
何か間違っている場合があれば、ご指摘していただけると助かります。


####現在の環境
ruby 2.6.3
rails 5.2.3

#### 目的
rubyのバージョンを2.6.5にしたいです。


環境にバージョンがあるか確認します。

```ruby
$ rbenv install --list
```

もし、指定したいバージョンがなければ

```ruby
$ brew upgrade ruby-build
```
をしてください。

もう一度確認で

```ruby
$ rbenv install --list
```

#### rbenvでインストール
指定したいバージョンがあれば次に、rbenvでインストールをします。

```ruby
$ rbenv install 2.6.５
```
インストールされました！！

#### インストールしたバージョンを使用する時

```ruby
$ rbenv versions
  system
  2.4.1
  2.5.1
  2.5.3
* 2.6.3 (set by /Users/user_name/hoge/.ruby-version)
  2.6.５
```
- 環境全体にrubyバージョンを反映したい時

```ruby
$ rbenv global 2.6.5
```
- 特定のプロジェクトのみ反映したい時

```ruby
$ rbenv local 2.6.5
```
もう一度確認で

```ruby
$ rbenv versions
  system
  2.4.1
  2.5.1
  2.5.3
  2.6.3 
* 2.6.5(set by /Users/user_name/hoge/.ruby-version)
```
反映されました。

#### rubyのバージョンごとにgemをインストールしなければいけないので
```ruby
$ gem install bundler
```
インストールできました。
Gemfileに使用するバージョンを書き換えて

```ruby
$ bundle install --path=vendor/bundle
```
できました。

#### rubyのバージョンを上げた後にrailsコマンドを使おうとすると、下記のようになってしまった。

```ruby:ruby.rb
$ rails --version
rbenv: rails: command not found

The `rails' command exists in these Ruby versions:
  2.6.5
```

新しくインストールしたrubyの中にrailsというgemが入っていないために起こっているようだ。

#### 目的
新しくインストールしたruby環境にrailsをインストールをする
まず、gemをアップデートします

```ruby
$ gem update --system
```
次にbundlerをインストールします

```ruby
$ gem install bundler
```
その次にrailsをインストールします

```ruby
$ gem install rails
```

バージョンを確認します。

```ruby
$ rails --version
Rails 5.2.3
```
バージョンが表示されたらrails コマンドが使えるようになっている

# まとめ
初めてのＱiita記事でした。記事一つ書くだけでも長時間かかってしまいました。
本日はバージョンのアップデートやバージョン指定など頻繁にあるので、備忘録としてここに書かせて頂きました。
どんどん記事を書いてアウトプットしていきたいと思います。

#### この記事は、下記の記事を参考にさせて頂きました。
[rbenvでRubyのバージョンを最新安定版にupdate](https://qiita.com/_kanacan_/items/c1499f6c13b1c41da982)

[rbenvでrubyのバージョンを上げたときに The `rails' command exists in these Ruby versions: となる](https://qiita.com/kamillle/items/5a7befd0ebad47378832)



とても、勉強になりました。ありがとうございます。
Kotlinは何故すごいのか

## 経緯

通っているジーズアカデミーというプログラミングスクールでKotlinの勉強会をすることになりました。なので、改めてKotlinの勉強をし直し、自分なりに何故Kotlinがすごいのかをまとめてみました。

一言でいうと「**便利**で**安全**」なのがKotlinの良さだと思うので、「Kotlinは何故便利なのか」と「Kotlinは何故安全なのか」の2回に分けて書こうと思います。

Kotlinは完全に独学なので、間違っていることや足りていないことがあるかもしれませんが、その際はコメントなどでご指摘いただけると幸いです。

- [Kotlinは何故便利なのか](https://qiita.com/ngsmvn/items/9ccc30b1ab1e6718d8c5)
- [Kotlinは何故安全なのか](https://qiita.com/ngsmvn/items/70036002946640a440a9)

勉強会に参加する方は、環境構築をしておいてください。20分掛からずにできるはずです。

- [Kotlinの環境構築(G's FUKUOKAでの勉強会向け)](https://qiita.com/ngsmvn/items/502e9a695831de187c99)

また、以下の記事に目を通して文法をざっと確認しておいてください。(ざっとでいいです)

- [３０分で覚えるKotlin文法](https://qiita.com/k5n/items/cc0377b75d8537ef8a85)
Melting Make Up by GIMP

Melting Make Up by GIMP

※本解説は以下の動画で紹介されている手順を箇条書きでまとめている
　https://www.youtube.com/watch?v=6kZf9x09dVg&t=1202s

1.加工元レイヤーを複製
　最下層レイヤーをunder
　上レイヤーをtopと名付ける(viewはoff)

2.新レイヤーの追加
　背景：白
　レイヤーunderとtopの間に配置する
　レイヤーモード：HSV Saturation
　Opacity：80くらいに設定

3.レイヤーunderのCurves設定
　[Colors]→[Curves]
　より肌を白くするため、波形をS字型にするとよい

4.レイヤーunderのBrightness and Contract設定
　[Colors]→[Brightness-Contract]
　より肌を白くするため、Contrastだけ5くらいに設定

5.レイヤーunderのHue-Saturation設定
　[Colors]→[Hue-Saturation]
　Lightness:13
　Saturation：10

6.Path toolで熔解効果を付与する場所を選択する

7.レイヤーtopに熔解効果を付与する
　[レイヤーtopのサムネイルを右クリック]→[Add Layer Mask]→[Selection]
　これでPathの指定範囲だけ肌色となる

8.レイヤーtopの複製
　最上位レイヤー名をtop copyとする(hidden)
　
9.レイヤーtopにDodgeで影、光沢を付ける
　・Dodgeで影を付ける
　　　type:burn
　　　range:highlights
　　　exposure:30くらい
　　　（要所によってopacityを変更）
　・Dodgeで光沢を付ける
　　　type:dodge
　　　range:highlights
　　　exposure:30くらい
　　　（要所によってopacityを変更）

10.レイヤーtop溶ける質感をアップ
　[colors]→[saturation]
　scale: 1.4くらい

11.レイヤーtop溶ける質感をアップ2
　レイヤーtopの切り抜き側(Pathで指定した白黒のレイヤー)をPaintblush Toolで加工
　髪の毛側をforeground colorで塗る（髪が淡くなる）
　肌側をbackground colorで塗る(肌が濃ゆくなる)

12.レイヤーtop溶ける質感をアップ3
　・Dodgeで肌の明るい部分を塗って光沢を表現
　　　type:dodge
　　　range:highlights
　　　exposure:30くらい
　　　（要所によってopacityを変更）
　　　（目の光沢もdodgeで表現する）
　・Dodgeで肌の暗い部分を塗って影を強調する
　　　type:burn
　　　range:highlights
　　　exposure:30くらい
　　　（要所によってopacityを変更）
　　　（眉毛も塗る）

13.[Colors]→[Curves]
　 波形をS字型にする

完成
Flutterのパッケージインストールで詰んだ初心者

# 初手詰み余裕
FlutterでWebViewのサンプル試すのにパッケージを追加しようと思ったら出来なかった（情弱）

インストールしようとしたのは[flutter_webview_plugin](https://pub.dev/packages/flutter_webview_plugin)

```pubspec.yaml
dependencies:
  flutter_webview_plugin: ^0.3.9+1
```

`pubspec.yaml`にパッケージ名とバージョン追記して`flutter pub get`するとコケる。バージョンを落としてもダメなのだ。

```
[flutter_webview_plugin] flutter packages get
Running "flutter pub get" in flutter_webview_plugin...          
Error on line 22, column 3 of pubspec.yaml: A package may not list itself as a dependency.

   ╷

22 │   flutter_webview_plugin: ^0.3.9+1

   │   ^^^^^^^^^^^^^^^^^^^^^^

   ╵
pub get failed (65)
exit code 65
```

他プロジェクトだと普通に入るのに、何故なのか。

# 解決編

知見のある方に相談してみると…

**「もしかしてプロジェクト名をパッケージ名と同名にしてませんか？？」**

「アッハイ（大声）」

コケたプロジェクトを破棄。名称を変えたプロジェクトにて無事にインストールできました。

```
[sample-flutter-webview-plugin] flutter packages get
Running "flutter pub get" in sample-flutter-webview-plugin...            1.1s
exit code 0
```

プロジェクト名にパッケージ名と同名を付けてしまうと、競合してしまうということですね。

# 教訓

サンプルプロジェクトでも雑にパッケージ名を付けちゃうと、こういう罠があるんですね。

> A package may not list itself as a dependency.

初心者が陥りやすい気がするのですが、このエラーメッセージではなかなか察しづらそうなため書き留めておきました。
#Rails ( or #Ruby + ActiveSupport )  + travel で 現地時刻 = JST で特定日付に時間を固定して、それぞれUTC JST timestamp で現在時刻・日付を得る例

```rb
# REQUIRE : on Ruby

require 'active_support/testing/time_helpers'
# => true

require 'active_support/core_ext'
# => true

include ActiveSupport::Testing::TimeHelpers
# => Object


# Travel to JST beggining of Year

travel_to Time.use_zone('Tokyo') { Time.parse('2020-01-01 00:00') }
# => nil


# JST

Time.use_zone('Tokyo') { Time.now }
# => 2020-01-01 00:00:00 +0900

Time.use_zone('Tokyo') { Time.current }
# => Wed, 01 Jan 2020 00:00:00 JST +09:00

Time.use_zone('Tokyo') { Time.zone.now }
# => Wed, 01 Jan 2020 00:00:00 JST +09:00

Time.use_zone('Tokyo') { Date.current }
# => Wed, 01 Jan 2020


# UTC


Time.use_zone('UTC') { Time.now }
# => 2020-01-01 00:00:00 +0900

Time.use_zone('UTC') { Time.current }
# => Tue, 31 Dec 2019 15:00:00 UTC +00:00

Time.use_zone('UTC') { Time.zone.now }
# => Tue, 31 Dec 2019 15:00:00 UTC +00:00

Time.use_zone('UTC') { Date.current }
# => Tue, 31 Dec 2019


# Unix Timestamp
# are All same at any Timezone

Time.use_zone('Tokyo') { Time.now.to_i }
# => 1577804400

Time.use_zone('Tokyo') { Time.zone.now.to_i }
# => 1577804400

Time.use_zone('UTC') { Time.now.to_i }
# => 1577804400

Time.use_zone('UTC') { Time.zone.now.to_i }
# => 1577804400

Time.now.to_i
# => 1577804400

Time.current.to_i
# => 1577804400


# Date.today
# Not considered Timezone with Time.zone setting
# its Ruby method refers TZ env

Time.use_zone('Tokyo') { Date.today }
# => Wed, 01 Jan 2020
Time.use_zone('UTC') { Date.today }
# => Wed, 01 Jan 2020

```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2776








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
GitHubの開発フロー

Githubの開発フロー

1.アプリケーションとリポジトリの準備
2.ブランチを作成
3.プルリクエストを作成
4.作成したブランチで実装
5.コードレビューを依頼
6.プルリクエストのマージ

1. アプリケーションとリポジトリの準備を行う
   
・　ターミナル上でアプリケーションを作成

新たにアプリケーションとそのmysqlの作成する
 $ rails new アプリ名　-d mysql
デェレクトリを作ったアプリに移動する
 $ cd アプリ名
作ったアプリの中でデータベースを作成する
 $ rails db:create

・　アプリをローカルリポジトリにする

Github Desktopで左上の『current Repository』から
『add』　『add Existing Repository』を選択

ファイル内から作成したアプリを選択して『Add repository』をクリック

・　ターミナルからアプリをローカルリポジトリにする
 $git init

・　コミットをする

　ローカルリポジトリよりにある全てのファイルを選択してコミット
　GitHub desktopの右下の『commit to master』をクリックするとコミットできる
最初のコミットなら名前いを『initial commit』とするのが好ましいらしい

・　リモートリポジトリを作成
　コミットをしたら、リモートリポジトリに反映させる
GitHub Desktopでは、『publish』ボタンを押すとリモートリポジトリが作られていない場合に作ってくれる。
[publish repository]ボタンをクリックするとGitHubのリモートリポジトリが作成される。
GitHubのトップページに移動してYour repositoriesの欄アプリ名があればうまくいっている。

2.ブランチを作成する
　ブランチは一つの実装機能ごとに作成する。
・Github Desktopから『current branch』をクリックし、『New branch』をクリック。最初に作成されるmasterブランチから新しいトピックブランチを作成する。
・　ブランチの名前は実装機能にちなんだ名前にするのが良い。
　　　『create branch』をクリック。にブランチ作成後に作成したトピックブランチ名に切り替わっているのか確認。
作成したトピックブランチが上にあったら作業場をそのブランチへ移動できる。

3.プルリクエストを作成する

・手順
　　・空のコミットを作成する
　　・プッシュする
　　・プルリクエストを作成する
　　・同じブランチで変更修正を加えていく

・プルリクエストを作成するには対象のブランチで少なくとも一つのコミットを新たにしなくてはならない。しかし、現在このブランチでは作業をしていないのでコミットできるものがない。なので空のコミットを作ることでプルリクエストは作成できる。
ターミナルでからのコミットを作成
 $git commit--allow-empty -m 'create pull request'
(--allow-emptyオプションで何も作業がなくてもコミットできる)
空のコミットが作成されたらGithub Desktopで左下に『committed just now create pull request』が表示される
次に[publish branch]をクリックしてプッシュする。
プッシュをしたら、Github desktop上の[create pull request]をクリックする。すると、ブラウザが起動してプルリクエストの作成画面が表示される。
　　　・プルリクエストのタイトルの記述
　　　・writeの欄に#whatと#whyをマークダウン記法でプルリクエストの詳細を記入する。
　　　・Reviewの欄でマークダウン記法が正しく適応されているか、プレビューする。
　　　・『Create pull request』をクリックしてプルリクエストの作成をする。

3.作成したブランチで機能の実装をしていく

railsが備えているscaffoldというジュネレーターを使用するとアプリケーションの型があるソースコードを自動で生成してくれる。
 $rails g scaffold article title: string author: string text:text
このコマンドによりariticleに関するコントローラー、モデル、マイグレーションファイルなどが一括に生成される。生成されたマイグレーションファイルを実行
 $rails db:create

・作成内容をコミット・プッシュする
　機能の実装ができたらここまでの作業内容をコミット、プッシュする。Github desktopで全てのファイルを選択してコミットする。コミット名は機能実装の内容を簡単に記入しコミットができたらプッシュする。
・コミットを確認する
　ブラウザで先ほど作成したプルリクエストのページを確認すると、作成したコミット名のコミットが反映されている。
　コミットが追加されている。(edit)でプルリクエストの編集ができる。

5.コードレビューを依頼する
　プルリクエストのページのURLを共有することで他者にレビューを依頼することができる

・プルリクエストにコメントする
　Githubの『files changed』をクリックすると変更修正されたコード一覧が表示される。特定のファイルのコメントを残したい行にカーソルを当てると青色の+ボタンが出てくる。このボタンをクリックするとコメント用のフォームが出てくるのでコメントを書いて『Add single comment』をクリック。
ファイル全体へのコメントをしたい場合は一覧の最下部のお面と欄で送信。
・コードを修正したい場合はテキストエディタで修正！さらにコメントの送信！
修正箇所がないと他者に判断されたらLGTM！とコメントがくる。青したらマージをする。
・『Merge pull Request』をクリックマージが終わったら修正していたブランチを『delete branch』をクリックして削除する
google-authenticator に認証コードの再入力までの猶予期間を設定する

## 背景
google-authenticator を使って二段階認証を実施していると、毎回認証コードを聞かれるのが面倒くさい。
特に複数台にデプロイする時とか30秒待たないといけないのでツライ。
どうやら、1.06で猶予期間の設定ができるようにオプションが追加されたらしいのでアップデートして試して見る。

https://github.com/google/google-authenticator-libpam/pull/127

## 環境とか前提
* Amazon Linux 2
* epel を有効にし、`google-authenticator@1.04` をインストールおよび設定済み

## EPELのアップデート
確認してみると、epel7 では 1.04 までしか提供されていなかったので、epel8 にアップデートしておく。

* epel でのパッケージ提供状況の確認はここでする
    * https://rpms.remirepo.net/rpmphp/

### /etc/yum.repos.d/epel.repo を編集
`$release` とか `7` と記載されている箇所を `8` に変更する。

```config

baseurl=http://download.fedoraproject.org/pub/epel/8/$basearch
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-8
```

### GPG-KEY を取得しておく

```bash
sudo wget https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-8 -P /etc/pki/rpm-gpg/
```

## google-authenticator をアップデートする

### パッケージのアップデート

```bash
sudo yum update google-authenticator
```

### 猶予期間を設定し反映する
google-authenticator モジュールの設定を行っている `/etc/pam.d` 配下のファイルを編集する。

下記の様にモジュールの設定箇所に `grace_period=3600` オプションを指定する（指定値は秒数）。

```conf
auth        sufficient    pam_google_authenticator.so nullok echo_verification_code grace_period=3600
```

変更を反映する

```bash
sudo systemctl restart sshd
```

あとは、二段階認証を有効にしているユーザーにて接続の確認を行って問題なければOK。
ニフクラ用の Terraformカスタムプロバイダを書いてみた(未完)

## 概要

先日[記事](https://qiita.com/shztki/items/d3fa879457f420c4c65a)に書いたニフクラ用Terraform Provider について、中途半端なところではありますが開発を終了しました。
ニフクラを利用する職場を離れたため、今後は動作検証もできないので、ここまでとなりました。

[ニフクラ用Terraform Provider](https://github.com/shztki/terraform-provider-nifcloud)

予定通りロードバランサー、付替IPアドレスまでは追加できたので、作成可能なリソースは最終的に以下のようになりました。

| リソース | ステータス | 備考 |
|---|---|---|
| サーバー | ok | インポートやコピーは作っていません |
| ディスク | ok | |
| ネットワーク・セキュリティ | ok | SSHキーインポートのみ |
| OSイメージ | ok | |
| ロードバランサー | ok | SSL関連は未検証 |
| マルチロードバランサー | n/a | |
| ファイアウォール | ok | |
| SSL証明書 | n/a | |
| 付替IPアドレス | ok | |
| 追加NIC | n/a | |
| オートスケール | n/a | |
| 基本監視 | n/a | |
| プライベートLAN | ok | |
| ルーター | ok | dhcp関連とNAT関連とWebプロキシは作っていません|
| 拠点間VPNゲートウェイ | ok | |
| サーバーセパレート | n/a | |
| バックアップ | ok | |
| RDB | ok | イベント通知は作っていません |
| NAS | n/a | |

## サンプルイメージ

`examples_v0.12.14+` のコードを実行すると、とりあえず以下のような環境ができあがる状態になっています。
disableにしていますが、RDB やバックアップ、カスタマイズイメージも作成可能です。
<img width="1896" alt="nifcloud_examples_001.png" src="https://raw.githubusercontent.com/shztki/terraform-provider-nifcloud/images/nifcloud_examples_002.png">

## 備忘録

作成中はずっと Terraform v0.12.9 と examples のサンプルでテストしていました。
無事予定していたところまで完成したので、終了しようと思ったところ、Terraform のバージョンがいつのまにか v0.12.16 まで上がっていました。
せっかくなので最新バージョンで動作確認しようと思ったところ、エラーの嵐が・・・。
v0.12.14以降は変数の記載の仕方が厳格になったのですね。
そのため急遽 examples を修正して、 `examples_v0.12.14+` を作りました。
これで動く・・・と思いきや、 `Error: rpc error: code = Unavailable desc` といったエラーが大量にでました。
「今さらどうしよう・・・なぜ・・・」と思いましたが、hashicorp 関連といえばもうひとつあるぞ、と気づきました。
作成しているコード側で、 [`github.com/hashicorp/terraform-plugin-sdk/`](https://github.com/hashicorp/terraform-plugin-sdk) を使っているんですよね。
`go.mod` を見ると v1.1.1 でしたが、最新版は v1.4.0 まで上がっていました。
`go.mod` の記載を修正して再度 build したものを利用したところ、問題は無くなりました。
今後利用される方がいらっしゃった場合に、このあたりも気にしていただくと、しばらくはバージョンが上がってもちゃんと動くのかな、と思っています。

## 今後について

私の開発は終了ですが、もし続きを作ろうかなとか、修正したいなとお考えになる方がいらっしゃったときのために、環境を分ける方法を簡単に記載しておきます。
以下のように自分の環境を作っていただいたらよいのかな、と思っています。

1. github等で nifcloud-sdk-go と terraform-provider-nifcloud のリポジトリを作成
1. 以下のようにして、自分の環境を作成

```
mkdir -p $GOPATH/src/github.com/YOURACCOUNT
cd $GOPATH/src/github.com/YOURACCOUNT
git clone https://github.com/shztki/nifcloud-sdk-go.git
cd nifcloud-sdk-go
git checkout -b XXXXXX
find ./ -type f | xargs sed -i "s/shztki/YOURACCOUNT/g"
git add .
git commit -m "path change"
git push -u origin XXXXXX

cd $GOPATH/src/github.com/YOURACCOUNT
git clone https://github.com/shztki/terraform-provider-nifcloud.git
cd terraform-provider-nifcloud
git checkout -b XXXXXX
find ./ -type f | xargs sed -i "s/shztki/YOURACCOUNT/g"
git add .
git commit -m "path change"
git push -u origin XXXXXX
```

* branch を作成している部分は、分けるつもりが無ければ不要です。
* sed での置換については、すべてのファイルが変更になるので注意。 `.git` 以下も変わるので、 `git remote set-url origin https://~` が不要になります。
* github等のデフォルトブランチは自分が利用するブランチにしてください。

## 最後に

お読みいただきありがとうございました。
中途半端なところで終了してしまいましたので、業務に取り入れる、などは開発を継続できるような方でないと難しいと思いますが、個人でこっそり構築タスクを効率化する、程度であれば、ちょっとはお役に立てそうかな、と考えたりもしております。
私の試行錯誤した流れが、多少でもお役に立てれば幸いです。
どうぞよいニフクラライフを！
GetでQuery(Parameter)を渡す方法

# `get`で`query`を渡す方法

タイトルを見て、「そんなことも分からんのか」と思う方もいらっしゃると思います。
そうなんです、私はできなかったんです。

以下では、Laravel プロジェクトでシステム開発をしているときの
私の失敗と解決できた方法を記載していきます。

## HTTP テスト

正しく動作するかをテストすることはとても重要です。

私もシステムが正しく動作するか、テストを書いており
検索機能が正しく動作しているか HTTP テストを書いていた時の話です。

### テストの作成

よし、テストを作成するぞと意気込んで作成を開始しました。

まず、プロジェクトフォルダで、ターミナルを開きます。

```sh
$ cd test // 現在の階層のtest(フォルダ)に移動する
```

そして、`ItemSearchTest`を作成します。

```sh
$ php artisan make:test ItemSearchTest
```

これで`test\Feature\ItemSearchTest.php`が生成されます。
さぁテストを書いていきましょう。

### `query`が渡せない

文字列検索は、`get`メソッドで自己参照させて`query`で条件を与えていました。
そのため、以下のようなコードを書きました。

```php:test\Feature\ItemSearchTest.php
public function testGeneralPattern () {
    $query = [
        "keyword" => "〇〇",
    ];

    $response = $this->get(route("item"),[
            "query" => $query,
    ]);
}
```

実行してみると、NG のパターンが通らない。

中身を調べてみると、**`query`はまったく送られていませんでした**。
ネットで調べた通りに`Header`の中に入れたのになぁ、と途方に暮れることになりました。

### URL でもダメ

他に方法はないかと考えた結果、URL に`query`情報を入れ込む方法を試してみました。

```php:test\Feature\ItemSearchTest.php
public function testGeneralPattern () {
    $url = "http://localhost/item?keyword=〇〇";

    $response = $this->get($url);
}
```

これでもダメでした。
この時点で少し心は折れかけていました。

### `route()`

長時間悩まされていましたが、解決のときが来ました。
**「`route()`の第二引数で`query`が渡せる」** という情報を手に入れたのです。

早速、試してみました。

```php:test\Feature\ItemSearchTest.php
public function testGeneralPattern () {
    $query = [
        "keyword" => "〇〇",
    ];

    $response = $this->get(route("item", $query);
}
```

頼む！通ってくれ！！と願いを込めて、・・・・

**ちゃんと`query`が渡せていました！**

今月で一番ホッとした瞬間でした。

## 自己参照で`query`を引き継ぐ

検索機能だけでなく、ソート機能やタブ切替など
機能が増えてくると、<font color="red">現在の`query`を保持して自己参照したい</font>と考えました。

上記でもあるように、`route()`を使えば`query`を渡せることは分かっています。
あとは<font color="red">現在の`query`</font>を取得する方法だけです。

### `Request::query()`

現在の`query`を配列で取得するものです。
これが手に入ればあとはもう簡単でした。

```php:resources\views\item\index.blade.php
<a href="{{ route('item', array_merge(Request::query(), ['tab' => '〇〇'])) }}">〇〇</a>
```

これで<font color="red">現在の`query`に与えたい`query`を追加した URL</font>となります。
verdaccio + Docker + GCE でprivateなnpmレジストリを立てる

# 概要
社内のいくつかのアプリに共通で組み込むため、npmライブラリを作ったものの、
npmにpublishして全世界に公開する訳にもいかないので、verdaccioを使って社内に公開可能なnpmレジストリを作成する

# [verdaccio](https://github.com/verdaccio/verdaccio)
ローカルにnpmのレジストリを構築するためのツール。
[docker-examples](https://github.com/verdaccio/docker-examples) に `docker run` するだけで構築可能なサンプルが豊富にあるため、
今回はこの中から [Docker + Apache + Verdaccio](https://github.com/verdaccio/docker-examples/blob/master/apache-verdaccio/README.md) を選択してGCE上に構築していく

# 構築手順
## 1. GCEインスタンスの起動
無料枠内で収めたいので、とりあえず1番小さいインスタンス
ディストリビューションはUbuntuを選択した

- MachineType: f1-micro
- Image: Ubuntu 18.04 LTS
- Allow HTTP traffic

```bash
gcloud beta compute --project=<your_project_id> instances create verdaccio \
--zone=asia-northeast1-b --machine-type=f1-micro --tags=http-server,https-server \
--image=ubuntu-1804-bionic-v20191113 --image-project=ubuntu-os-cloud \
--boot-disk-size=10GB --boot-disk-type=pd-standard --boot-disk-device-name=verdaccio
```

GCEが起動したらSSH接続し、以降の作業はインスタンス内で実施する

## 2. docker + docker-compose をインストールする
- 参考: [Ubuntu 18.04にDockerをインストールする(+docker-composeも)](https://qiita.com/iganari/items/fe4889943f22fd63692a)

## 3. verdaccioのサンプルをcloneし、docker-composeする

```bash
$> git clone https://github.com/verdaccio/docker-examples.git
$> cd docker-examples/apache-verdaccio/
$> sudo docker-compose up -d
.
.
.
Creating verdaccio ... done
Creating apache-verdaccio_apacheproxy_1 ... done
```

## 4. 起動に成功したらブラウザからアクセスしてみる
- GCEインスタンスに割り当てられたExternal IPをクリックしてブラウザでアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121358/3b211a25-a3b6-b347-33f9-bce1b38f8a4c.png)

> httpsだとアクセスできないので、httpに修正してアクセスする

- こんな感じの画面が表示されたら成功

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121358/438d9e8d-5629-9d39-c261-83980f15f1b0.png)

# 運用手順
- ここからはローカルPCに戻って作業する

## 1. npmライブラリをpublishしてみる

- ライブラリのdistフォルダ内で以下を実行してpublishする

```bash
$> npm set registry http://<external_ip>
$> npm publish --registry http://<external_ip>
```

## 2. レジストリを確認してみる
- verdaccioに再度アクセスしてみる

- publishしたライブラリが表示されていれば成功

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121358/bf72644e-f8ce-ca2f-a7dd-67b50aab51f9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/121358/bf142775-ec4e-a0cf-bcae-f966373796d7.png)

## 3. ライブラリをインストールしてみる

```bash
$> npm install --save my-library --registry http://<external_ip>
```

- 正しくライブラリがインストールされたら成功
- 他の一般公開されているライブラリと同じように扱うことができる
PyWebViewを使ったプロジェクトをPyInstallerでexeにできない

現在(PyWebView 3.1時点)、PyWebViewを使ったアプリをそのままPyInstallerでexeにしようとすると、`Pyinstaller hook can't find WebBrowserInterop.x64.dll`というエラーメッセージでコンパイルが中断する問題が発生しているようです。

* [Pyinstaller hook can't find WebBrowserInterop\.x64\.dll · Issue \#346 · r0x0r/pywebview](https://github.com/r0x0r/pywebview/issues/346)

大まかには上記Issueの通りなのですが、PyInstaller用のWebhookが正しいパスを指していないようで、エラーになってしまうとのこと。

上記を見た感じ最新版では修正は済んでいるものの、公開モジュールへの反映はまだ という感じのようです。

で、直るまで手作業でwebhookを直して回るのは面倒くさいので、PowerShellスクリプトを書きました。

うちでは、PyInstallerでのコンパイルにPowerShellスクリプトを使っているので、ファイル内でPyInstallerを使う前に、次のコードを呼び出します。

```powershell
if(Select-String "library = join\(sitepack, 'lib', dll_name\)" -Path .\.venv\Lib\site-packages\PyInstaller\hooks\hook-webview.py){
  Write-Host "> Fix PyInstaller\hooks\hook-webview.py"
  $data = Get-Content .\.venv\Lib\site-packages\PyInstaller\hooks\hook-webview.py | % {$_ -replace "library = join\(sitepack, 'lib', dll_name\)","library = join(sitepack, 'webview', 'lib', dll_name)"}
  $data | Out-File .\.venv\Lib\site-packages\PyInstaller\hooks\hook-webview.py
}
```

ただし、PowerShell 5.xはBOMなしUTF-8を扱えないため、このままだとPyInstallerが正常に読めないwebhookファイルができてしまいます。

PowerShell 6.xなら問題なく使えるので、事前にChocolateyなどから`pwsh(PowerShell 6.x)をインストールし、PowerShell 6上でこのスクリプトを実行するようにしましょう。

うっかりPowerShell 5.xで実行しそうになってしまったときのために、PowerShell 5.xでスクリプトを起動しようとしたら落とすコードも追加しておきます。

```powershell
if(!($PSVersionTable["PSCompatibleVersions"].Major -contains 6)){
  Write-Host @'
    This script must be PowerShell version 6 or higher before it will work properly.
    The shell currently running is PowerShell version 5 or lower.
    Use the `pwsh` command to change to PowerShell 6.
'@
  exit
}
```

これを先頭行に書いておけば安心です。警告が出るので気付くでしょう。
MacOSで/system以下のread only filesystemにアクセスしたい時（Catalina)

#1-SIPを無効にする
command + Rを同時に押しながらMacを起動し、ユーティリティからターミナルを起動します。

```bash
csrutil disable
```
を実行し、再起動します。
#2-SIPが無効化されているか確認する
 再起動したMacのターミナルで

```bash
csrutil status
```
を実行します。

```
System Integrity Protection status: disabled.
```
と表示されれば、SIPが無効化されています。

#3-マウント

```bash
sudo mount -uw /
```
を実行し、

```bash
 killall Finder
```
を実行すると、/system以下にアクセスできるはずです。

#お疲れ様でした！
ASTでドキュメントコメント(Docフィールド)を取得する際にハマった

`"go/parser"` でパースしたASTから、Docフィールドを取ろうとしてちょっとはまったのでメモ

GitHub のIssueによると [^1]
type の前につけたドキュメントコメントは、`ast.TypeSpec` ではなく、`ast.GenDecl` の `Doc`フィールドにつくよという話。

[^1]: GitHub Issue [go/ast: TypeSpec.Doc is nil? Have to grab documentation at GenDecl #27477](https://github.com/golang/go/issues/27477)

```go
// doc comment
type Foo struct {
}
```

```go
// このコメントは GenDecl.Doc につく
type A struct {
}

// このコメントは GenDecl.Doc につく
type (
    // このコメントが TypeSpec.Doc につく
    B struct {
    }
)
```

動作確認のソース [Gist](https://gist.github.com/osamu329/1af0d40f257977837eb712c73ff3a253)
Emscriptenのstandaloneモードについて

## TL;DR; 

`-o` オプションに wasm ファイルを指定すると、[wasmer](https://wasmser.io/) や [wasmtime](https://github.com/bytecodealliance/wasmtime)のような WASM ランタイム向けのwasmファイルが出力されます。

## Standalone モード

[v8.dev にも投稿されていましたが](https://v8.dev/blog/emscripten-standalone-wasm)、Web以外での実行を念頭においたモードが Emscripten に実装されました。[リリースノート](https://emscripten.org/docs/introducing_emscripten/release_notes.html)によれば、v1.38.46（2019年9月25日リリース）から実装されていたそうです。

詳しい内容は [Emscripten のドキュメント](https://github.com/emscripten-core/emscripten/wiki/WebAssembly-Standalone)、もしくは v8.dev の記事 ["Outside the web: standalone WebAssembly binaries using Emscripten"](https://v8.dev/blog/emscripten-standalone-wasm) を読んでいただくとして、簡単にまとめると次のような特徴を持っています。

* JS が出力されない
* WASIを出来るだけ利用する
* WASIで定義されたエントリーポイント`_start`が定義され、エキスポートされる

### JS のコードが出力されない

~~~c++
#include <emscripten.h>

EMSCRIPTEN_KEEPALIVE
int add(int a, int b){
  return a + b;
}
~~~

このコードを次のようにコンパイルすると、standalone モードでコンパイルされ、wasm ファイルだけが出力されます。

~~~
% emcc -o add-standalone.wasm add.cpp
% ls 
add.cpp add-standalone.wasm
~~~

次のように`-s STANDALONE_WASM`をつけても、standalone モードでコンパイルされます。js ファイルも出力されますが、気にしなくて大丈夫です。

~~~
% emcc -o add.cpp -s STANDALONE_WASM
% ls 
add.cpp a.out.js a.out.wasm
~~~

出力された wasm ファイルを [wasmer](https://wasmer.io/)　を使って実行します。

~~~
% wasmer a.out.wasm
~~~

なにも出力されません。エントリポイントとなる関数（`_start`）から実行されるユーザ定義関数がないからです。次のように `main` 関数を定義すると、`1 + 1` の結果がターミナルに出力されます。

~~~c++
#include <stdio.h>

int add(int a, int b){
  return a + b;
}

int main(int argc, char** argv){
  printf("1 + 1 = %d\n", add(1, 1));
  return 0;
}
~~~

wasmerでの実行例：

~~~
% wasmer a.out.wasm
1 + 1 = 2
~~~

### WASI が利用される

上記の例では、いくつかのシステムインタフェースが利用されています。例えば

* コマンドライン引数の数を取得する
* コマンドライン引数を取得する
* 標準出力への文字列の出力
* 0 を実行環境に返す

などです。

通常モードでビルドすると、これらのシステムインタフェースの実装は JS によって与えられます。これに対して standalone モードでは、wasmer などの持つ WASI の実装が利用されます。

[wasm2wat](https://github.com/WebAssembly/wabt) を使って作った wat ファイルの先頭を見ると、次のように WASI のシンボルがインポートされていることがわかります。

~~~LISP
(import "wasi_unstable" "args_sizes_get" (func (;0;) (type 4)))
(import "wasi_unstable" "args_get" (func (;1;) (type 4)))
(import "wasi_unstable" "proc_exit" (func (;2;) (type 5)))
(import "wasi_unstable" "fd_write" (func (;3;) (type 6)))
~~~

なお、wasi-core に存在しないシステムコールは、変わらず`env`からインポートできることが期待されています：

~~~LISP
(import "env" "__syscall5" (func (;1;) (type 0)))
~~~

### エントリーポイント：`_start`

WASI では [WASM の使用に定義されている `start` セクション](https://webassembly.org/docs/modules/#module-start-function)ではなく、`_start` 関数をエントリーポイントとして利用します。

~~~LISP
(export "_start" (func 9))
~~~

## まとめ

Emscripten に実装された standalone モードを使うことで、簡単に WASI 向けのコードが出力できるようになりました。

Python や　R　のような言語に対して　WASM プラグインを書くときには便利だと思います。

一方、WASI はまだ議論中であることには注意が必要です。定義されているが実装されていないシステムインタフェースもまだありますし、ランタイムごとにも実装状況は異なります。

またファイルアクセスのセマンティックスが UNIX とは異なるため、fstat が wasi-core に定義されていないなど、ファイル入出力を扱うプログラムのコンパイルには追加の作業が必要となります。
【Symfony】フィクスチャロード(php app/console doctrine:fixture:load)でエラーが出た時の対処法

#はじめに
作業していて発生したエラーの対処法についてまとめた備忘録となります。

#開発環境
PHP:7.0
Symfony:2.8
CentOS6系(VirtualBoxで環境を構築)

#発生したエラー内容
```terminal
$ php app/console doctrine:fixture:load
[Swift_TransportException]                                                                                                                                                
  Connection could not be established with host email-smtp.us-east-1.amazonaws.com [php_network_getaddresses: getaddrinfo failed: Temporary failure in name resolution #0] 
```

#解決法
VirtualBox再起動
GASからウェブフォームへ送信して結果を利用する方法

GASを使ってウェブサービスのフォームに対してリクエストする方法と、その結果の利用するやり方です。

# フォームの要素を確認する
フォームへパラメータを送信するために、まずはフォームの構造を確認します。
サンプルとして[診断メーカー](https://shindanmaker.com/)のフォームで確認してみます。

chromeの開発者ツールで該当部分を見てみます。
![スクリーンショット 2019-11-29 11.33.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/7695/a18282a7-4632-9e7f-c642-e4e81f011b4d.png)

診断メーカーのformを見つけたら下記の内容を確認します。

- formタグに設定されている`method`. (今回は"post")
- formタグの下に定義されている各inputタグの`name`.(今回は名前を入れる部分の"u")

formは子供として持っている`type="submit"`を押されると、form下の各inputのnameとそこに入力されているパラメータをformタグに定義されている`action`に対して、同じくformに定義されている`method`で送信します。

なので、今回の場合は診断するボタンが押されると該当の診断のURLに対して `{"u": "名無しのI"}`をbodyとして`Post`する、ということになります。

formの挙動については下記のページが詳しいです。
[フォームデータの送信](https://developer.mozilla.org/ja/docs/Learn/HTML/Forms/Sending_and_retrieving_form_data)

# GASで実装する

フォームの形と挙動はわかっているので、あとは`UrlFetchApp`を使って同じように動作させるだけです。
診断メーカーの場合、urlは診断のURLです。

`UrlFetchApp.fetch`の第2引数でmethodとフォームのbodyを設定します。
formのbodyは`payload`です。


```App.gs
function myFunction() {
  var url = 'https://shindanmaker.com/80808';  
  var payload = {
    "u" : "名無しのI" // 診断する名前
  };  
  var options = {
    "method" : "POST",
    "payload" : payload
  };
  var response = UrlFetchApp.fetch(url, options);
}
```

`UrlFetchApp.fetch`の戻り値は`HTTPResponse`です。
フォームを送信した結果のhtmlが取得したければ`getContentText()`が使えますし、ログインフォームに対してリクエストしたならば`getAllHeaders()`から`["Set-Cookie"]`を取得し、それをheaderに設定することでログイン後のページに対してリクエストすることも出来ます。
戻ってくるものがファイルならば`getBlob()`してドライブに保存したりメールに添付出来ます。

# まとめ
これでGASを使ってフォームの送信を自動化することが出来るようになりました。
例えば毎月の利用明細を取ってきたり、日替わりの診断メーカーを毎日回したり出来ます。

まさにそんな記事がありました。
[Google Apps Scriptでクレジットカード利用明細を毎月自動で奥さんにメール送信する](https://qiita.com/takeruko/items/5fed0f7acc1a60d1df76)

# 他サービスとの連携について余談
自分は毎日診断メーカーを回してIFTTT経由でTwitterに投稿するbotとして使用しています。
IFTTT経由だとTwitter APIの申請もいらないしTwitter以外の連携もできるのでおすすめです。

# 公式ドキュメント
ここまで書いておいてなんですが、上記のコードは似たようなものがAPIドキュメントに載っていました。
[Class UrlFetchApp](https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app)
[Class HTTPResponse](
https://developers.google.com/apps-script/reference/url-fetch/http-response.html)
Open sesame！

こんにちは。バカンのチェです。

今日バカンで使ったオフィスの鍵管理について説明しようと思います。
いろいろ試した結果、Slackと連携して鍵を共有しています。

* 物理的な鍵
 * 人数が増えるによって合鍵を作るのが大変。
* スマート南京錠
 * 指紋で南京錠が開くのが便利ですが、今年オフィス移転し、ドアの形が違って使えなくなった。
* スマートロック
 * ドアを開けてアプリを閉じないと他の人が使えない問題が発生。
* Slack Bot [現在]
 * BotからAPIをCall。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540923/6b327cc0-9037-49ae-64bf-ead69182b834.png)

今のところ、大きな問題なく上の仕組みで鍵の管理を行っています。
来年新オフィスの移転があるので、鍵の管理はまだまだ進化を続けます！！

以上です。

最後にバカンで一緒に働くメンバーを募集しています。是非よろしくお願いいたします！！
https://www.wantedly.com/companies/vacancorp/projects
Pigをインストールする


象さん(Hadoop)を Pig で操作するために Pig をインストールしました。

# Pig インストール

```bash
$ cd ~
$ wget https://archive.apache.org/dist/pig/pig-0.17.0/pig-0.17.0.tar.gz
$ cd /opt
$ sudo tar xvf ~/pig-0.17.0.tar.gz
$ sudo chown -R hadoop:hadoop ./pig-0.17.0/
# シンボリックリンク作成
$ sudo ln -s pig-0.17.0 pig
$ sudo chown -h hadoop:hadoop ./pig
```

# Pig PATH 設定

Pig の PATH を通します。

```bash
# hadoop ユーザを作ったので hadoop ユーザで PATH を通しています。ここは各々のユーザで実行してください。
$ sudo su - hadoop
$ cd ~
$ vi .bashrc
$ source .bashrc
```

```bash
export PIG_HOME=/opt/pig
export PATH=$PATH:$PIG_HOME/bin
export PIG_CLASSPATH=$PIG_HOME/conf:$HADOOP_INSTALL/etc/hadoop
```

# Pig 動作確認

```bash
$ pig --version
Apache Pig version 0.17.0 (r1797386)
compiled Jun 02 2017, 15:41:58
```
総称型(Generics)についてそれとなく書いてみる

前提条件(人)
--------------------

- `静的型付け`に興味がある
- 総称型(テンプレート型)とか言われても分かんない
- サンプル見てるけどいまいちピンと来ない
- 「Java、少し分かるよ」

### 合わない人

- 総称型をごっさ使ってる
- 妙な比喩は勘弁ね
- 細かい違いを許せない

本題
--------------------

総称型、使ってますか。
総称型を使わない人は実体験が少ないので、

- 「やり方は書いてあるけど、具体的にどう使えば良いかイメージできない」
- 「よく分からない。何がおいしいの？」

こういう事があると思います。
ただ、総称型を使う基本的な理由はすごく単純です。
**同じ処理を一つのコードにまとめて使いたいだけ**

```java
Java       { name() { return ... } }
Julia      { name() { return ... } }       -> Lang { name() { return ... } }
TypeScript { name() { return ... } }
```

です。
言い換えると**同じ処理なのに、型名が違うだけで、別々のコードとして作りたくない**
です。保守が大変になるだけですからね。
「じゃあクラスを継承すればええやん！」
はい、確かに**同じ処理を一つのコードにまとめる**はクラス継承で簡単に可能でしょう。
しかし、やりたい事と考え方が一致しません。
総称型では
「クラスが持っている機能を、**誰が使って良いか**」
を決めます。そう、**クラスの機能を使いたい**のであって、
**クラスの性質を受け継いだ別のクラスを作りたくはない**のです。
あなたがレストランに行って、ご飯を頼みたいとしましょう。
その時にあなたが選ぶのは

- コックさんに依頼してご飯を受け取るために
  - ウェイターの能力を受け継ぐために面接を受ける(クラスの継承)
  - ウェイターにご飯を頼むための資格(お金)を持つ(総称型)

どちらを選ぶでしょうか。
今回あなたがレストランに行った目的は「ご飯を頼みたい」なので、総称型についての選択をするのが適切と考えられます。
そう、「ご飯を食べたい」だけであれば、「ウェイターにならなくて良い(クラス継承しなくてよい)」のです。
そもそもウェイターさんはレストランに既にいる(はず)なので、自分がウェイターさんになる(別のウェイターさんを増やす)事は目的からすると大げさな事なのです。
(目的次第でクラス継承の方が適切な場合もあるでしょう。「影響範囲を限定化したい」という目標も含み、継承に因る負債が増える可能性を覚悟するなら)

ただ、`静的型付け`を使うのであれば、理由はこれだけではありません。
**処理を使えるか使えないかを、型名でCompilerさんに気付いてほしい(エラーにしてほしい)**

```java
class Family<? extends Lang> {}

Family<Java>
Family<Julia>
Family<TypeScript>
Family<OreOre>  -> Compilerさん「誰やねんOreOreて！Langさんとこの子ちゃうがな！」-> コンパイルエラー
```

となります。
同じ処理を一つのコードにまとめたいだけなら、「`void*`型を使っちゃえ！(何でもありの型の例)」というだけで終了です。
`静的型付け`を使えるのならば、**合ってるか間違ってるかをコンパイル時に知りたい**のです。
(総称型を使わない場合、実行時に合ってるか間違ってるかを知れますが、それでは`静的型付け`の持ち腐れになります)

ただ気を付けなければならないのは、`静的型付け`は**論理的な間違いを指摘してくれるけど、意味的な間違いは指摘してくれない**という事です。
よくあるソクラテスのネタを使いますと、

```
ソクラテスは人である
人は死ぬ
ゆえにソクラテスは(人だから)死ぬ
```

があります。これを

```
ソクラテスはサイヤ人である
サイヤ人は死ぬ
ゆえにソクラテスは(サイヤ人だから)死ぬ
```

というピンクの人(時々ゴールド)が言いそうな三段論法も、「合っている」とCompilerさんは結論します。
でも(多分)ソクラテスはサイヤ人じゃなかったと思うので、
ソクラテスは「サイヤ人だから」という理由では死にません。
なので、`静的型付け`に因るCompilerさんの検査は**論理的には合ってるけども、意味(意図)の保証ではない**という事です。
当たり前と怒られそうですけども、これを意識するかしないかでテストがどれだけ重要かの認識力が変わってきます。`静的型付け`、`総称型`も結局は「便利にするだけの道具」に過ぎませんので、本来の目的を見失わないようにご留意下さい。

### 終わりに

グダァッとポエムの如く書きました。
コメントには(能力不足により)返信できませんのでご了承下さい。
ズンドコきよし

既に旬は逃し尽くしているけれど何か見かけて面白かったのでワンライナーで
一回じゃつまらなかったので無駄に5回実行します。

``` bash:zdk.sh
perl -e 'for($i=0;$i<5;$i++){$buf="";while(){$buf .= int(rand(10))%2;if($buf =~ /1$/){print "ズン";}if($buf =~ /0$/){print "ドコ";}if($buf =~ /11110$/){print "キ・ヨ・シ！\n";last;}}}'
```

```:実行結果（一例）
ズンドコドコドコドコズンドコドコズンズンドコドコズンドコズンドコズンズンズンドコドコドコズンズンズンズンドコキ・ヨ・シ！
ズンドコドコズンドコズンドコドコドコドコドコズンドコズンドコドコズンドコドコズンズンズンドコドコドコドコドコドコドコドコズンドコズンズンズンズンドコキ・ヨ・シ！
ドコズンズンズンズンドコキ・ヨ・シ！
ズンドコズンドコズンドコズンズンズンズンドコキ・ヨ・シ！
ドコズンドコズンズンドコズンドコドコドコドコドコドコズンドコドコドコズンズンズンドコズンズンドコズンズンドコドコズンズンズンズンズンドコキ・ヨ・シ！
```


01の羅列で過去の結果を保持し続けて直近5回でズンドコってたらキ・ヨ・シ！出力するだけ。簡単
VScodeでMatlabファイルを実行する

# したいこと
- VScode上でMatlabファイル(.m)を編集
- そのままVScodeで実行
- Figure表示

# 導入

1. 拡張機能「Matlab」と「Matlab Code Run」をVSCにインストール
[Matlab](https://marketplace.visualstudio.com/items?itemName=Gimly81.matlab)
[Matlab Code Run](https://marketplace.visualstudio.com/items?itemName=bramvanbilsen.matlab-code-run)

2. VSC上のユーザ設定(Ctrl+,)から設定の検索で「matlab」と打ち込むとMatlab拡張機能のconfigがヒットする(下図)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228086/1d26f723-904f-82f1-6e03-4f674651e60e.png)

3. `Matlab:Matlabpath`と`Matlab:Mlintpath`にmatlabとmlintのexeファイルを指定
exeファイルの場所はデフォルトだとそれぞれ，
`C:\Program Files\MATLAB\R2019a\bin\matlab.exe`
`C:\Program Files\MATLAB\R2019a\bin\win64\mlint.exe`
になっているはず．

これで拡張機能の設定は完了．

# 実行

適当にMatlabを実行するフォルダとファイル(.m)を作成し，VSCでワークスペースを開く．


```matlab:test.m

close all;
clear;
clc;

foo ='Hello World';
x = rand(3,3)

```
プログラムが書けたら「Ctrl+Shift+P」でコマンドパレットを開く．
コマンドパレットから`Run Matlab File`を実行すると，MATLAB Command Windowが起動し出力が表示される．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228086/cfc174bb-7197-de34-5c8e-40b707b428a9.png)

Figureも表示される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228086/de22758e-840d-58de-6cee-5c775321e251.png)

# 不具合
- Matlab Code Runで，初回は`Run Matlab File`で正常に実行されるが，二回目の実行の際では実行コマンドが`run('./[file].m')`となっており実行できない．
    - 自分でコマンドを叩かないといけない(致命的)
    - issue投げて直してもらう....(?)
- 実行する度にMATLAB Command Windowが起動するので多窓になる．
    - コマンド引数で何とかなりそう(?)
   
# まとめ
- VSCでMatlabの実行はできる．
- Matlab Code Runが不完全なので快適に開発はできない．
    - ***結局VSCでは実行できていない．***
- 修正を待つか拡張機能を自作する必要がある．

**[追記]**
現在(2019/11/29)拡張機能はLinux, Macで正常に動作するようでした．Windows対応まで座して待ちましょう．．．
全域木を用いた迷路作成方法

※この記事は、筑波大学のゲーム制作サークルAmusementCreatorsアドベントカレンダーの4日目の記事です。

#はじめに
タイトルにあるように、この記事ではグラフ理論における概念の一つである最小全域木というものを用いて、迷路を作成する方法について記述しています。なお、筆者はグラフ理論をしっかり学んでいるわけではないため、最小全域木について誤解している部分があるかもしれませんがその際は進んでご指摘ください。

#迷路の定義
この記事においては、迷路をグラフ理論における木であると定義します。下図のように、基本的に迷路は頂点と辺の組み合わせで表現することができ、かつ連結で頂点数-1の辺を持つため迷路を木で表現することは妥当であるといえます $^{[1]}$ 。
![car_tree.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214300/8fc126ff-7821-78e7-f1be-b82db471d94a.png "図1 迷路と木の関係")

　　　　　　　　　　　　　　　　図1 迷路と木の関係

#全域木
ところで、木には二分木や平衡木などいくつかの種類が存在します。その中に、全域木というものが存在します。数学的な定義は省きますが、簡単に言えば全域木とは、「あるグラフの全ての頂点とそのグラフを構成する辺の一部分のみで構成される木」です$^{[2]}$(図2参照)。
特に、元となるグラフの辺に正の数の重みが設定されている場合、全域木を構成する辺の重みの総和を計算することができ、この重みの総和が最小となるように構成された全域木を最小全域木といいます。
![220px-4x4_grid_spanning_tree.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214300/f9b8bbce-96d0-ecf1-4656-a6c34d77e27b.png "図2 全域木")
図2 全域木

先の迷路の定義から、迷路を作成するというのはグラフの全域木を求めることと同値であることがわかります。

#迷路生成アルゴリズム
前項で示したように、迷路作成は全域木を求めることと同値であるため、全域木を求めるアルゴリズムが組めれば、迷路作成アルゴリズムが組めることになります。
そこで、今回はクラスカル法を用いて全域木を生成することにします$^{[3]}$。ただし、簡単のため次の前提条件を設定します。

- 元となるグラフは二次元配列$A[H][W]$で、$A[y][x]$は頂点$v_{x + yW}$を表す
- 辺集合は配列$E$で、要素としてタプル$t(v_a, v_b, w)$を持つ
- タプル$t$は、頂点$v_a, v_b$間の重みが$w$という意味を表す
- $w \geq 0$を満たし、$w = 0$は頂点$v_a, v_b$が隣接していないことを表す
- $w$は上の条件を満たす乱数

アルゴリズムの詳細は次の通りです。

1. $A$の各要素を要素数1の木の集合$T$として、集合族$F$に保存する
2. $E$が空集合となるまで、$E$から最小の$w$をもつ$t$を取り出す
3. $t$の頂点$v_a, v_b$がそれぞれ$F$の異なる集合$T_a, T_b$に属していれば、$T_a, T_b$を合成し一つの木とする
4. 2に飛ぶ

このアルゴリズムを実行することで、最終的に$A$のすべての頂点から構成される一つの木が生成されます。これが$A$の全域木、すなわち迷路となります。
#実行結果
上記のアルゴリズムを実装したプログラムを実行した際の結果を下に示します。
![maze.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214300/66a67791-191a-d98e-ea19-8a09251646a3.png "図3 クラスカル法により生成された迷路1")
図3 クラスカル法により生成された迷路1

![maze_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214300/15e7a892-3e54-7f12-dac8-c5edbf4f5155.png "図4 クラスカル法により生成された迷路2")
図4 クラスカル法により生成された迷路2


#おわりに
迷路の生成方法の一つとして、全域木を用いたアルゴリズムを紹介しましたが、他の有名な迷路生成方法である棒倒し法や穴掘り法と比べ、比較的アルゴリズムが複雑だと思います。
ですが、迷路が生成できる論理的な理由が最もわかりやすいアルゴリズムだと思うので、迷路生成方法の一つとしてぜひ検討してみてください。

迷路生成で用いたコードを見たいという方は、[こちら](https://github.com/kerochan/Maze)のmasterブランチのmain.cppを見てください。かなり見にくいコードですが、実装の参考になれば幸いです。


#参考文献
[1] 木(数学) - Wikipedia
URL->https://ja.wikipedia.org/wiki/%E6%9C%A8_(%E6%95%B0%E5%AD%A6)
[2] 全域木 - Wikipedia
URL->https://ja.wikipedia.org/wiki/%E5%85%A8%E5%9F%9F%E6%9C%A8
[3] クラスカル法 - Wikipedia
URL->https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%AB%E3%83%AB%E6%B3%95
CentOS  のcurlの更新時のメモ・備忘録

conohaのVPSを借りて、CentOSでサーバを立ててみた。
備忘録。

主に以下のサイトを見ながら、
https://qiita.com/maangie/items/4af8b813ed9ddce4a0db
https://teratail.com/questions/61070

```
openssl のライブラリが必要らしい
$ sudo yum install openssl-devel
自分的には、gccをインストールするまでは、以下で実行するmakeがエラーになった気がした。
$ yum install gcc
```
ttp://curl.haxx.se/latest.cgi?curl=tar.bz2の最新版を指定する
$ wget http://curl.haxx.se/download/curl-7.CX.0.tar.bz2
tarで展開する
$ tar xf curl-7.37.0.tar.bz2
cdで移動する。
$ cd curl-7.37.0
./configureでmakeの設計図を作る
curlの場所が、/usr/binと/usr/local/binにある。また、tarをダウンロードした場所にもある。
curlはどこにインストールされるのか？configureに書かれている。
が、configureをいじるのが不安。よって、次の命令を実行。
（$./configure --enable-libcurl-optionではなくて、次のように実行した）
./configure --prefix=/usr/bin --enable-libcurl-option
（↑/usr/binにcurlをインストールするというオプションを付けた）
$ make
インストール
$ sudo make install

バージョンを確認して、変更されていたので、一応成功。
curl --version
(Curl 7.60.0と表示される)
/usr/local/bin/curl --version
(Curl 7.60.0と表示される)
/usr/bin/curl --version
（しかし、上のように指定すると、Curl 7.29.0と表示される。なぜだ？）
```


とにかく、curl --versionとやって変更されたから、成功したことにする。
Eloquent で困ったことの解決方法

# Eloquent で困ったことの解決方法

Laravel プロジェクトを作成して、システム開発を行っていた時に
解決方法がなかなか判明せず、大変だったものの解決方法を以下にまとめております。

## OR 検索

文字列で検索ができるように OR 検索を導入しようとしたときでした。
とりあえず少し調べて、以下のコードで実行しました。

```php:失敗パターン
$keyword = $request->keyword;

$user = Auth::user();
$items = $user->items()->where("name", "like", "%".$keyword."%")
            ->orWhere("text", "like", "%".$keyword."%")->get();
```

これで OR 検索をしようとすると、
`->where("name", $keyword)`は、ログインしている User の結果だけを返すのですが、
`->orWhere("text", $keyword)`は、<font color="red">**全ての User**</font>の結果を返すのです。

**なんでやねん！**

とツッコミを入れながらも、改善案を探すことにしました。

### `where`でまとめる

そうすると、`where`をまとめることができるようです！
早速まとめてみます！

```php:失敗パターン
$keyword = $request->keyword;

$user = Auth::user();
$items = $user->items()->where(function ($query) {
            $query->where("name", "like", "%".$keyword."%")
                ->orWhere("text", "like", "%".$keyword."%");
            })->get();
```

これで大丈夫と思ったのですが、エラーが出ます。
スコープの問題で、「`$keyword`なんて知らない」といわれます。

これでも悩みました。。。

### `use`で変数を渡す

そうしていると、先輩が解決方法を教えてくださり、

```php:成功パターン
$keyword = $request->keyword;

$user = Auth::user();
$items = $user->items()->where(function ($query) use ($keyword) {
            $query->where("name", "like", "%".$keyword."%")
                ->orWhere("text", "like", "%".$keyword."%");
            })->get();
```

`use`を使って解決できたのでした。

## `asc`で`NULL`を後に持ってくる

Item を昇順で並べてみます。

```php:失敗パターン
$user = Auth::user();
$items = $user->items()->orderBy("price", "asc")->get();
```

値段が安いものから表示させたいと、上記のコードで並べてみると、、、、

**非売品**が先に表示されてしまいます。
そう、非売品の **`price`は`NULL`** なんです。

複雑な条件が必要なのか、
はたまた`NULL`と`NULL`でないもので分けて取得する必要があるのか
と色々考えながら、調べておりました。

### `->orderByRaw('column is null asc')`

`->orderByRaw('column is null asc')`を使うと、`NULL`を後ろに回すことができます。
※`column`の部分に DB のカラム名が入ります。

```php:成功パターン
$user = Auth::user();
$items = $user->items()->orderByRaw('price is null asc')
            ->orderBy("price", "asc")->get();
```

これで、値段の安い順に並びつつ、
`NULL`である非売品は、後ろに並びます。