OmniAICreator/Qiita-1.07M huggingface dataset:
LaravelでAuthを使ったサイトのパスワードを忘れた場合、人類はどのように対応すれば良いのか

Laravelでよくお世話になるAuth。`php artisan make:auth`と叩くだけで必要なものがほぼ全部生成されるので便利ですよね。

しかし、開発環境でユーザーのパスワードをド忘れした場合どのようにしたら良いのでしょうか。

# tinkerを起動する

作業用ディレクトリ上で`php artisan tinker`を叩く。

```shell

$ php artisan tinker
```

**(2018/10/29 追記)** モデルを使って直接書き換える手段をコメント欄にていただきました。(Thx! @hokutoasari) 圧倒的に簡単ですね。

もしメールアドレスがわかっている場合はwhereでメールアドレスを使えばOKです。

```
>>> \App\User::where('email','at.mattenn@gmail.com')->update(['password' => \Hash::make('nyan')]);
```

もう何もかも忘れてしまってどうしようもない場合は下の取り消し線を引いた方法を使ってください。


# ~~Hashでパスワードハッシュを作る~~
~~(ハッシュは例です)~~

```
Psy Shell v0.8.18 (PHP 7.2.6 — cli) by Justin Hileman
>>> \Hash::make('nyaaaaaaaan');
==> "$3y$10$HnhrbrvsxZe6409rOgOiA37.xv7BU1LdUpJNntKH0TOCOC0A.fOXkKBfIMK"
```

# ~~データベースに突っ込む~~

~~どこのご家庭にもあるHeidiSQLやSequel Proを使ってデータベース内のテーブルに突っ込む。デフォルトはusersテーブルです。~~

# 注意

このパスワードハッシュは本番環境では使うことができません。なぜなら入力されたパスワードは`.env`の`APP_KEY`と共にハッシュ化されるので、本番用と開発用ではハッシュも異なるからです。
**もし本番環境でも同じパスワードハッシュが使えた場合、それはそれで問題なので**別のAPP_KEYを設定しましょう。
ChefTips: bootstrap時に カスタマイズした client.rb を配布する

## 解決したい課題

`chef-client` の設定ファイルである `client.rb` に追記・修正したい場合は、通常 chef-client cookbook を使用します。

[chef-cookbooks/chef-client](https://github.com/chef-cookbooks/chef-client)

しかし、この方法では `chef-client` は すでにBootstrapされている前提なので、例えば『Bootstrap時にカスタマイズした `client.rb` ファイルを配布したい』という要件があった場合、採用することができません。

本記事では、公式で紹介されていた Bootstrap の Custom Templates を使って、上記要件を満たす方法をご紹介します。 


## knife bootstrap時にカスタマイズした client.rb を配布する方法

以下で紹介されていた方法を使います。

knife bootstrap - Custom Templates
https://docs.chef.io/knife_bootstrap.html#custom-templates

### (1) chef-full.erb ファイルに追記

`knife bootstrap`コマンドを実行する Chef Workstation上で、`knife bootstrap`の振る舞いを定義する `chef-full.erb`ファイルをカスタマイズします。直接カスタマイズしてしまってもいいのですが、念の為、`Chef-repo直下/.chef/bootstrap/` 以下あたりにコピーしてからカスタマイズしましょう。

```shell
$ mkdir .chef/bootstrap 
$ cp -ip $(find /opt/chefdk/embedded/lib/ruby -type f -name chef-full.erb) .chef/bootstrap/.
```
> `chef-full.erb` のパスは環境によって少し異なります。`/opt/chefdk/embedded/lib/ruby` 配下で `chef-full.erb` を find してみてください

`chef-full.erb` ファイルの以下あたりに `client.rb`に追記したい内容を記述してみてください。ここでは、`Chef::Config[:follow_client_key_symlink] = true` という記述を追記します。

```erb
cat > /etc/chef/client.rb <<'EOP'
<%= config_content %>
EOP

# 以下を追記
cat >> /etc/chef/client.rb <<'EOP'
Chef::Config[:follow_client_key_symlink] = true
EOP
```

### (2) erbファイルを指定して knife bootstrap

`chef-full.erb` ファイルのカスタマイズが終わったら、実際に `knife bootstrap` してみましょう。以下の例のように `--bootstrap-template` オプションで先程カスタマイズした `chef-full.erb` を指定してあげてください。

```shell-session
$ knife bootstrap vcent74 --sudo -N vcent74 --bootstrap-template .chef/bootstrap/chef-full.erb
```

毎回、`--bootstrap-template` オプションをつけるのが面倒だという方は、`knife`コマンドの設定ファイルである `.chef/knife.rb`ファイルに以下の記述をつけてあげることで省略可能です。

```ruby

knife[:bootstrap_template] = "#{current_dir}/bootstrap/chef-full.erb"
```


## 補足

本記事でご紹介した『bootstrap時に カスタマイズした client.rb を配布する』方法は、以下の記事で紹介されている AIX における Bootstrapも問題を回避する際にも有効です。

[AIX V7 にて chef-client を使用する際の integer 137438954242 too big to convert to `int' エラー](https://qiita.com/hiroyuki_onodera/items/eb86972a72e58a533836)
使わないNIC(network interface）の処理

# はじめに

かなりしょうもないtipsです。
「Network InterfaceがM/Bに2個以上あるとき、使わないinterfaceをどうやって明示的に設定するか？」という問題です。

# 挙動

1. 何も書かないでおくとdhcpを指定したのと同じ動作になります。
2. 適当にstaticを割り当てるのは、使っているのかいないのかわかりません。
3. routeが適当に振られるので動作がおかしくなることがあります。
4. iptablesを振るときもあるのに無視したり、使ってないのに設定したりする必要があります。

# …と、言う訳で

```
/etc/networks/interfaces

iface enp3s0 inet static
    address 0.0.0.0
```

# 結論

iface interface void
とかスマートに書く方法があるかと思ったのですが今日のところはここまで。
ブログはじめます

# なぜ書くのか

**書いた方が得なんじゃないの？（震え声）**

エンジニアってブログ書いた方が良いよね。って様々なところで言われてるし、とりあえず書いていこうよ。

# 期待している効果

- 目に見える成果
- アウトプットによる知識の定着（メモがわり）
- ネタ探し
- 自己紹介のかわり
- 反応がほしい


## 目に見える成果

すごく大事。
自分がこれだけインプットしてきたと1発でわかる。
自信とモチベーションに繋がる。

## アウトプットによる知識の定着

[@konifar](http://konifar.hatenablog.com/)さんが言ってた、インプットしたことをタイトルだけ書いて、後でまとめるやり方でやっていく。
復習と整理、両方出来てよい。

## ネタ探し
<u>週に記事を2本書く</u>という制約を設けて、今までではスルーしていたトピックを拾うようにしていく。
いわゆる意識改革。

## 自己紹介のかわり
自分自身、Qiitaの記事で人を知る機会が多いので、今度は自分の記事で自分を知ってもらいたい。

## 反応が欲しい。
色々な意見を聞いて成長していきたいので、コメント等のアクションをいただけるとありがたいです。どうぞよろしくお願いします。。。
[学習用]Rails5 投稿＋カテゴリー＋コメント機能を10分で速攻立ち上げる手順

![10minitRails5.png](https://qiita-image-store.s3.amazonaws.com/0/132580/a9497872-45ea-0eed-28f5-c07c07ac56ad.png)

忘れそうなので練習ついでに、速攻立ち上げ手順
Rails5のコマンドにも慣れたので、できるだけ短縮化しておきたい。

#アプリ作成
##アプリ作成
```
$ rails new articleapp -d postgresql
$ cd articleapp
```

##カテゴリー作成
```
$ rails g scaffold Category name:string
$ rails db:migrate
```

##投稿作成
```
$ rails g scaffold Article name:string title:string content:text user_id:integer category_id:integer
$ rails db:migrate
```

#コメント作成
##コメント投稿作成
```
$ rails g model Comment commenter:string body:text article:references
$ rails g controller Comments
$ rails db:migrate
```
※忘れたとき用：controller Commentsにアクション名を付け足してないのは、Viewsが要らないから。


##コメント関連付け
```config/routes.rb
resources :articles do
  resources :comments
end
```

```app/models/comment.rb
class Comment < ApplicationRecord
  belongs_to :article
end
```

```app/models/article.rb
class Article < ApplicationRecord
  has_many :comments, dependent: :delete_all
end
```
※dependent: :delete_all　を入れないとコメントが入っている場合に削除できないエラーが出る。

##コメント投稿作成
```app/controllers/comments_controller.rb
class CommentsController < ApplicationController
  def create
    @article = Article.find(params[:article_id])
    # @comment = @post.comments.create(params[:comment])
    @comment = @article.comments.create(comment_params)
    redirect_to article_path(@article)
  end

  def destroy
    @article = Article.find(params[:article_id])
    @comment = @article.comments.find(params[:id])
    @comment.destroy
    redirect_to article_path(@article)
  end

  private
  def comment_params
    params.require(:comment).permit(:body, :commenter)
  end
end

```

##コメントViews編集
```app/views/articles/show.html.erb
<h2>コメント</h2>
<% @article.comments.each do |comment| %>
  <p>
    <%= comment.commenter %>: <%= comment.body %>
    <%= link_to '削除', [comment.article, comment],
                :confirm => 'よろしいですか？',
                :method => :delete %>

  </p>
<% end %>

<h2>コメントを書く</h2>
<%= form_for([@article, @article.comments.build]) do |f| %>
  <div class="field">
    <%= f.label :commenter %><br>
    <%= f.text_field :commenter %>
  </div>
  <div class="field">
    <%= f.label :body %><br>
    <%= f.text_area :body %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>
```

#カテゴリーの関連付け
##カテゴリーの関連付け
```app/models/category.rb
class Category < ApplicationRecord
  has_many :articles
end
```

```app/models/article.rb
class Article < ApplicationRecord
  belongs_to :category
end
```

##カテゴリーの表示
```app/views/articles/_form.html.erb
  <div class="field">
    <%= form.label :category_id %>
    <%= form.select :category_id, Category.all.map{|o| [o.name, o.id]} %>
  </div>
```

```app/view/shops/index.html.erb
<%= article.category.name %>
```

```app/view/shops/show.html.erb
<%= @article.category.name %>
```

これで最低限の機能はそろう。
ここまでエラー無く無事立ち上がった。
検索対象文字列に一致した行と前の行も出力するプログラム

[「任意の文字列や行をハイライトするツールをGo言語で作成してみた」](https://qiita.com/x-color/items/bb4c4054083c1ef0b941)で`grep`コマンドの`-B`オプションと似た動作をするプログラムが必要となったのでその作り方のメモを残しておく。

# 何が必要になったか

以下のような`file.txt`が存在した場合に

```:file.txt
message1
Hello World.
message2
hello world.
message3
HELLO WORLD.
```

一致した行とその前の2行も出力する`grep`コマンドを実行した場合、以下の結果が得られる

```bash
$ grep -B 2 hello file.txt
Hello World.
message2
hello world.
```

これと似た動作をするプログラムが必要となった。

# 作成した関数

上記の動作と似た動作をする関数は以下の通り。

```go
// pattern 検索対象文字列
// lines   ファイルを一行ずつ読み込んだ結果が流れてくるチャンネル
func grepBefore(pattern, lines chan string){
    n := 2 // 保持しておく行数
    buf := []string{} // 保持用のスライス
    for line := range lines {
        // 指定保持数を超えたら一番前の行を保持用スライスから削除
        if len(buf) > n {
            buf = buf[1:]
        }
        buf = append(buf, line)

        // 現在の行にpatternが含まれているならば、出力処理を行う
        if strings.Contains(line, pattern) {
            for _, l := range buf {
                fmt.Println(l)
            }
            // bufを空にする
            buf = buf[:0]
        }
    }
}
```

## 動作順序

1. チャンネル(lines)からデータ(line)を読み取る。クローズされた場合は終了
2. バッファ(buf)にデータを格納
3. データに検索対象文字列(pattern)が含まれない場合は、1へ戻る
4. バッファに格納されている全ての行を出力する
5. バッファを空にする
6. 1へ戻る

# おわりに

実際に必要となったのは、検索対象文字列の前後の行に色を付けて出力する処理だったので、もう少し複雑になりました。
そのコードは https://github.com/x-color/hlt/blob/master/cmd/hlt/highlight.go#L135 にあるので見てみたい方がいたらどうぞ。
VisualStudioを完全アンインストールする

VisualStudioをインストールすると、色々な物が同時にインストールされますが、このツールを使えば色々一緒に消してくれるそうです、マイクロソフトが出しています。
> https://github.com/Microsoft/VisualStudioUninstaller/releases
![image.png](https://qiita-image-store.s3.amazonaws.com/0/266455/bf78990b-c553-139d-89e3-88c2095ecdf1.png)
ダウンロード、展開して、「Setup.ForcedUninstall.exe」を管理者として実行する事で起動します。
「Y」と入力して処理がスタートします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/266455/07d473ea-15bd-8ea6-fb3e-d5eafefb6c94.png)


---
参考
> Visual Studio 2017のインストール前に、Visual Studio 2013／2015と2017プレビュー／RC版を完全にアンインストールするには？
> http://www.atmarkit.co.jp/ait/articles/1703/13/news034.html
「Elasticsearch 6」で動作の検証などをしてみた

「Elasticsearch 6」で動作の検証などをしてみました。

過去に「[Elasticsearchチュートリアル](http://code46.hatenablog.com/entry/2014/01/21/115620)」という記事を見つけていたのでこちらが2014年の記事だったので2018年8月現在の最新版で試してみました。

他にもクエリ検索やAggregation、Analyzerの設定なども調べております。

## 動作検証など

★ [Elasticsearch 6 を使ったデータ検証 その1（Dockerでコンテナの作成と確認）](https://developer-collaboration.com/2018/08/10/elasticsearch-6-1/)

★ [Elasticsearch 6 を使ったデータ検証 その2（マッピングの登録をしてみる）](https://developer-collaboration.com/2018/08/12/elasticsearch-6-2/)

★ [Elasticsearch 6 を使ったデータ検証 その3（bulkでデータを投入してみる）](https://developer-collaboration.com/2018/08/13/elasticsearch-6-3/)

★ [Elasticsearch 6 を使ったデータ検証 その4（チュートリアル記事とデータの検索での比較）](https://developer-collaboration.com/2018/08/13/elasticsearch-6-4/)

★ [Elasticsearch 6 を使ったデータ検証 その5（クエリでの検索）](https://developer-collaboration.com/2018/08/17/elasticsearch-6-5/)

★ [Elasticsearch 6 を使ったデータ検証 その6（Aggregationを使った分類・集計）](https://developer-collaboration.com/2018/08/17/elasticsearch-6-6/)

★ [Elasticsearch 6 を使ったデータ検証 その7（Analyzerについて）](https://developer-collaboration.com/2018/08/24/elasticsearch-6-7/)




## 参考記事など

また、初期段階でとても役に立ったリンクなども。

★クラスメソッドさんのElasticsearch記事
　https://dev.classmethod.jp/cloud/aws/cm-advent-calendar-2015-getting-started-again-amazon-es/
　https://dev.classmethod.jp/cloud/aws/amazon-es-full-text-search/
　https://dev.classmethod.jp/server-side/elasticsearch/elasticsearch-6-breaking-changes/
　https://dev.classmethod.jp/server-side/elasticsearch-getting-started-05/
  
  
★はじめての Elasticsearch（コマンドの解説が非常に丁寧）
　https://qiita.com/nskydiving/items/1c2dc4e0b9c98d164329


★MySQL(MariaDB)のデータをElasticsearchで全文検索
　https://qiita.com/kesuzuki/items/2d58d31c38a9ea58ab47
  
★Elasticsearch(v5)を使うにあたっての神記事まとめ
　https://qiita.com/bwtakacy/items/5016862854e5c7b5278b

リンクだけの雑記になってしまいましたが。
Ubuntu HDD等認識 (mount)

忘れそうなのでメモ

- Ubuntu16.04LTS
- 2TBのハードディスク

## ディスク確認
```
$ sudo fdisk -l
```

ディスクサイズなどを確認して必要なデバイス`/dev/sdxx`を見つけます。今回は`/dev/sda1`をmount対象とします

```
...
...
Disk /dev/sda: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 1D7C473C-EE28-4369-847A-C52B729A0B43

デバイス   Start 最後から  セクタ  Size タイプ
/dev/sda1   2048 3907029134 3907027087  1.8T Linux filesystem


Disk /dev/sdb: 111.8 GiB, 120034123776 bytes, 234441648 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: C2C1A9EE-2FB7-4356-BC1D-DE79A43FC694

デバイス       Start 最後から セクタ  Size タイプ
/dev/sdb1       2048    499711    497664  243M Linux filesystem
/dev/sdb2     499712   1554431   1054720  515M EFI System
/dev/sdb3    1554432 195379199 193824768 92.4G Linux filesystem
/dev/sdb4  195379200 234440703  39061504 18.6G Linux スワップ
```

## ファイルシステムを確認
ディスクのファイルシステムを確認します。
英語ですが[こちらの記事](http://sourcedigit.com/22104-how-to-check-filesystem-in-linux-ubuntu-using-command/)に一通り説明されています。

```
$ lsblk -f
```

`/dev/sda1`のファイルシステムはext4であることが確認できます。

```
NAME   FSTYPE   LABEL   UUID                                 MOUNTPOINT
loop1  squashfs                                              /snap/core/4917
sdb                                                          
├─sdb4 swap             e3669f67-90b6-4a3d-8d2f-167737eb2d7d [SWAP]
├─sdb2 vfat             11B2-A8E9                            /boot/efi
├─sdb3 ext4             d778328f-d162-479c-bb7f-c7d40f5db47c /
└─sdb1 ext4             274a0e7a-cf62-4443-aa0a-8d14f1c53d21 /boot
loop4  squashfs                                              /snap/discord/69
loop2  squashfs                                              /snap/core/5145
loop0  squashfs                                              /snap/discord/71
sda                                                          
└─sda1 ext4     DATA2TB cbacc62a-6da2-4d6a-a415-199fe5d66c84 
loop5  squashfs                                              /snap/slack/7
loop3  squashfs                                              /snap/discord/72
```


## Mount
マウント先のディレクトリを作成してそこにマウントします。オプションとして読み書き権限を与えておきます。
自動マウント先が`/media/<username>/`下なのでそこに作ろうと思います。

```
$ sudo mkdir /media/<username>/<任意の名前>
$ sudo mount /dev/sda1 /media/<username>/<任意の名前> --types=ext4 --options=rw
```

これでマウントされました。

追記(2020/05/28)
vfatのディスクをマウントする際は権限にも注意
[fat32のディスクをlinuxでマウント | yamac diary](http://yamac.jugem.jp/?eid=36)


## Unmount
アンマウントしたいときは以下のコマンドで行えます

```
$ sudo umount /dev/sda1
```
RSpec letの遅延評価を理解しておく

letの遅延評価でつまづいたので、メモしておく。

## letとは
RSpecのドキュメントより
>letはメモ化のためのヘルパーメソッド（memoized helper method）を定義するために使います。
値はキャッシュされ、同じexampleの中では何度呼ばれても同じ値（同じオブジェクト）が返ります。
しかし、exampleが異なる場合は異なるオブジェクトが返ります。

letで定義された変数は最初に参照された時に値をキャッシュする。

## 遅延評価でつまずくこと

例えば以下のリレーションの場合。

```rb
class user
   has_many :articles
end

class article
   belong_to :user
end

```

以下テストコードを書くと、articleのデータがDBに保存されていないため、エラーとなる。

```rb
let(:user){ FactoryGirl.create(:user)}
let(:article){ FactoryGirl.create(:article, :user_id => user.id, :title => 'letの遅延評価')}

it 'test' do
  expect(user.articles.first.title).to eq 'letの遅延評価'
end

```

## 解決策

`let(:article)`を`let!(:article)`に変更すれば、事前にarticleをcreateしてくれるので解決する。
（userは`user.id`が参照されたタイミングでcreateされる。なので`let(:user)`のままで構わない。）

```rb
let(:user){ FactoryGirl.create(:user)}
let!(:article){ FactoryGirl.create(:article, :user_id => user.id, :title => 'letの遅延評価')}

it 'test' do
  expect(user.articles.first.title).to eq 'letの遅延評価'
end

```

## 参考

https://qiita.com/jnchito/items/42193d066bd61c740612
PHPの終了タグ'?>'はセミコロンだ

# はじめに

[<?php...?>タグの外側の文字列はどういう扱いなのか](https://qiita.com/crhg/items/1e523eff380bfebc492f)の続きです。PHPタグの外側に文字列を書くとecho文のように扱われると書いたのですが、では中身が空になる`?><?php `を任意の所に書いていいか?というのが疑問でした。

# 結論

タイトルに書いたとおり、PHPの終了タグ`?>`はそこにセミコロンがあるものとして扱われます。これはマニュアルの「[命令の分離](http://jp2.php.net/manual/ja/language.basic-syntax.instruction-separation.php)」に書いてあります。ここの書き方だと書き忘れても補ってくれるぐらいのものであるようにも読めるのですが、実際にはそこに必ずセミコロンがある扱いになります。ですから、セミコロンを置けないところに終了タグ`?>`を書くと構文エラーになります。

```php
<?php
class ?><?php Foo // これは構文エラー
{}
```

```php
namespace Foo // これはOK
?>
<?php
```

```php
for ($i = 0 ?><?php $i <10 ?><?php $i++) { // これもOK(普通はやりませんが)
}
```

# switch文の例

ところでそもそもの発端の「[phpでswitch文の「switch($hoge)★ここ★{case0:」に改行いれるとエラーになる。](https://qiita.com/matsuyoro/items/38d1fd073c8a4c63a637)」で

```php
<?php
$i = 0;
?>

<?php
switch($i){
?>
<?php
 case 0:
?>
<p>aaa</a>

<?php
break;
}
```

はOKでした。上の原則に従うとswitch文の所は

```php

switch($i){
;
 case 0:
 ...
```

で、最初のcaseの手前にセミコロンがあることになるのですが、これアリなの?というのが疑問になると思います。マニュアルの「[switch](http://php.net/manual/ja/control-structures.switch.php)」のところにもそれらしいことは書いていません。(もっとも最初のcase文の手前に実行文を書いてはいけないということも明記されていませんが)

例によってソース(`Zend/zend_language_parser.y`)を当たってみます。

```
switch_case_list:
		'{' case_list '}'					{ $$ = $2; }
	|	'{' ';' case_list '}'				{ $$ = $3; }
	|	':' case_list T_ENDSWITCH ';'		{ $$ = $2; }
	|	':' ';' case_list T_ENDSWITCH ';'	{ $$ = $3; }
;
```

つまり単独のセミコロン1個だけはOKとわざわざ書いてありました。どうしてこうなってるんでしょうか? PHP奥が深い...

追記:

```php

<?php switch ($i) { ?>
<?php case 1: ?>
ほげほげ
<?php break; ?>
<?php case 2: ?>
ふがふが
<?php break; ?>
<?php } ?>
```

のような書き方を許容したかったのかもしれません。セミコロンが許されてないと最初のcaseだけswitchとまとめて書かなくてはいけなくなって書き方の統一感がなくなります。

```php
<?php switch ($i) {
      case 1: ?>
ほげほげ
<?php break; ?>
<?php case 2: ?>
ふがふが
<?php break; ?>
<?php } ?>
```

さらに追記:

switchのマニュアルを確認したときに最後の方に

>case の最後はコロンではなくセミコロンとすることもできます。

と書いてあって変な仕様だなと思っていたのですが、これと終了タグがセミコロンであることをあわせると、次のような書き方が可能になるのですね。

```php

<?php switch ($i) { ?>
<?php case 1 ?>
ほげほげ
<?php break ?>
<?php case 2 ?>
ふがふが
<?php break ?>
<?php } ?>
```

こういうのを見るとPHPってもともとはHTMLに埋め込む言語だったんだなと実感します。普段は先頭におまじないのように`<?php`と書いたらあと閉じることなんてないですが。
Docker for Windowsで立ち上げたMySQLで日本語を使用できるようにする方法

# 環境
- Docker for Windows
- MySQL:5.7

# 対象
- Docker for Windowsで立ち上げたMySQLコンテナで日本語を使いたい人

# 原因
なぜ日本語が使えないかというと、初期設定ではマルチバイト文字が使えない設定だからです。

# 問題解決
対処法としては、設定ファイル（/etc/mysql/my.cnf）に以下の設定を追記することです。

```my.cnf
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8

[mysqld]
character-set-server=utf8
```

なぜこの設定なのかは「Docker mysql 文字化け」とかでググってください。

この設定の追記方法ですが、docker-compose.ymlのvolumesで対応しようとするとWindowの場合パーミッションがおかしくなってしまうのでDockerfileで対応します。

```Dockerfile:/build/Dockerfile
FROM mysql:5.7

# my.cnf
RUN { \
        echo '[client]'; \
        echo 'default-character-set=utf8'; \
        echo '[mysql]'; \
        echo 'default-character-set=utf8'; \
        echo '[mysqldump]'; \
        echo 'default-character-set=utf8'; \
        echo '[mysqld]'; \
        echo 'character-set-server=utf8'; \
    } >> /etc/mysql/my.cnf
```
docker-compose.ymlの書き方は自由ですが私はこんな感じです。

```docker-compose.yml
version: '2'
services:
  mysql:
    container_name: mysql
    build: "./build"
    volumes:
      - ./mysql_data:/var/lib/mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
    ports:
      - 3306:3306
    expose:
      - "3306"
    privileged: true
```
【Sequelize】this.build(...).save is not a function

## this.build(...).save is not a function

### 考えられること
createするときのデータが配列(array)になっていないか？

```js
const datas = [{ ... }];
```

idを作成するときに`create`を使用するとこのエラーが発生する。`bulkCreate`を使用しよう。

`create`を使う場合はdatasをオブジェクトに変えよう。

```js
const datas = { ... };
```


## 引用
[mysql - Sequelize TypeError build.save is not a function - Stack Overflow](https://stackoverflow.com/questions/36520710/sequelize-typeerror-build-save-is-not-a-function)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103475/127173c0-49a6-0af6-7027-73857027bd86.png)
PowerShellで指定したフォルダ配下の各フォルダサイズを取得してみる

## はじめに

PowerShell を利用して、指定したフォルダ配下の各フォルダサイズを取得してみました。
PowerShell v6.0.2 を利用しています。

## コード

```powershell
#====================================================================
# 指定したディレクトリに含まれるすべてのディレクトリサイズをCSV出力
#====================================================================

# 調べたいフォルダパス
$searchPath = "c:\tools"
# 結果CSVファイルの出力パス
$outputCsvPath = "c:\temp\result.csv"

# 指定したディレクトリパスを起点として、下層のディレクトリのみを再帰的に取得
$dirArray = Get-ChildItem $searchPath -recurse | Where-Object {$_.PSisContainer}

# 取得したディレクトリに対する繰り返し結果（カスタムオブジェクト）を配列に格納
[array]$fileArray = foreach ($dir in $dirArray)
{
    # ディレクトリに含まれるファイルの合計サイズを取得
    $subItems = (Get-ChildItem $dir.FullName | Select-Object Length | Measure-Object Length -sum)
    # ファイルのフルパス、合計サイズMB、作成日、更新日、アクセス日を持つカスタムオブジェクトを生成
    [PSCustomObject]@{
        Fullname=$dir.FullName
        MB=[decimal]("{0:N2}" -f ($subItems.Sum / 1MB))
        CreationTime=$dir.CreationTime
        LastWriteTime=$dir.LastWriteTime
        LastAccessTime=$dir.LastAccessTime
    }
}

# 合計サイズ降順でソートし、フルパスと合計サイズをCSVファイルに出力
$fileArray | Sort-Object MB -Descending | Select-Object Fullname,MB,CreationTime,LastWriteTime,LastAccessTime | Export-Csv $outputCsvPath -notype -encoding Default
```

## さいごに

このような処理を実現する場合はフォルダを舐めまわすしかないのかしら。
効率の良い処理方法があれば教えてほしいです。
Tapを使って、Active Recordを操作する

## Tapを使わないwhere文
```ruby
if params[:email].present?
 User.where(email: params[:email])
elsif params[:username].present?
 User.where(username: params[:username])
else
 User.all
end
```

なんかもっといいほうほうがある気がする :thinking: 

## Tapを使ったwhere文
```ruby
User.tap do |u|
 if params[:email].present?
  break u.where(email: params[:email])
 end
end.tap do |u|
 if params[:username].present?
  break u.where(username: params[:username])
 end
end.tap do |u|
 u.all
end
```

変わらないですかね？
こっちの方がややDRY化した気がした。
vscodeで検索するフォルダ、検索除外フォルダを指定する。

![alt](https://user-images.githubusercontent.com/26253721/39765058-e8d0eae4-531b-11e8-9305-4c852f269517.png)
vscodeは最高のエディタだ。当然検索機能も充実している。2018年のjsのエディタはvscode以外考えられない。

vscodeでファイル指定検索の機能を見つけたので共有する。

![スクリーンショット 2018-08-24 10.10.58.png](https://qiita-image-store.s3.amazonaws.com/0/183835/a7734568-c0df-2bd0-1b43-aad199a46e16.png)

vscodeで検索の下の含めるファイル、除外するファイルにexampleを入れた時、./exampleと言う全てのフォルダが該当する。./exampleと入れると、example/が該当する。!exampleでexampleと名前がついたもの以外を検索する。

検索オプションは以下だ。

* to match one or more characters in a path segment
? to match on one character in a path segment
** to match any number of path segments, including none
{} to group conditions (e.g. {**/*.html,**/*.txt} matches all HTML and text files)
[] to declare a range of characters to match (e.g., example.[0-9] to match on example.0, example.1, …)

例
*.erb, *.scss
と書き、右の歯車をクリック。

seacrch先としてnode_moduleなどが除外されているが、追加で、検索、ファイルの表示から除外したい時は
settingsからfiles.exclude、search.excludeで指定する。

特定のフォルダ以下を検索したい時は左のメニューからフォルダを右クリックすると、そのフォルダ内のみ検索できる。

![スクリーンショット 2018-08-24 10.21.16.png](https://qiita-image-store.s3.amazonaws.com/0/183835/a7e5560b-c3c9-bd97-4793-b4335bd443ed.png)
Sublime Text 3でxDebugを使う

#導入手順
* php.iniにxDebugの設定を記述
* Sublime Text3にパッケージ「**xDebug Client**」をインストール
* xDebug Clientの設定

#環境
* Mac
* MAMP　(PHPバージョンは5.6.33。 7.~でも手順は変わらないと思います)
* Sublime Text3

#導入
##php.iniにxDebugの設定を記述
xDebugを有効化します。
MAMPの場合、xDebugはインストール済みなので有効化するだけです。

php.iniに設定を記述します。php.iniのパスは「**Application/MAMP/bin/php/使用しているPHPバージョン/conf/php.ini**」。
xDebugの項目はファイル末尾付近に書いています。

```
~~色々書いてある~~

[xdebug]
;zend_extension="/Applications/MAMP/bin/php/使用しているPHPバージョン/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so"
```

これを以下のように変更します。

```
[xdebug]
zend_extension="/Applications/MAMP/bin/php/使用しているPHPバージョン/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so"
xdebug.profiler_output_dir="/tmp/xdebug/"
xdebug.profiler_enable=On
xdebug.remote_enable=On
xdebug.remote_host="localhost"
xdebug.remote_port=9000
xdebug.remote_handler="dbgp"
xdebug.idekey="sublime.xdebug"
xdebug.overload_var_dump = 0
xdebug.var_display_max_children = 128
xdebug.var_display_max_data = 1024
xdebug.var_display_max_depth = 10
xdebug.dump.GET= *
xdebug.dump.POST= *
xdebug.dump.SESSION= *
```

php.iniを保存してMAMPを再起動、起動したらphpinfoを確認してローカル環境でxDebugが有効化されているか確認しましょう。
下画像のようにxDebugの項目が表示されていれば有効化されています。

![スクリーンショット 2018-08-24 9.44.47.png](https://qiita-image-store.s3.amazonaws.com/0/245899/4a9a30cb-568e-6d6f-a0d0-e3388e26a9a8.png)

##Sublime Text3に「xDebug Client」をインストール
Sublime Text3を起動したら
[ツール] -> [コマンドパレット]で表示された入力カーソルに
「**install Package**」、「**xdebug client**」を順番に入力してパッケージをインストール。

これでxDebug Clientのインストールが完了です。

## xDebug Clientの設定

### *.sublime-projectファイル
sublime-projectファイルに以下の内容を追記します。

```
{
	"folders":
	[
		{
			"path": "/Users/2t0/Sites/ginza-print.com_git"
		}
	],
    //ここから
	"settings":
	{
		"xdebug":
		{
			"url": "http://プロジェクトのURL/",
		}
	}
    //ここまで
}
```

### Xdebug.sublime-settingsファイル
[ツール] -> [Xdebug] -> [settings - user]からxDebug Clientのカスタマイズができます。
以下は実際に自分が設定したものになります。

```
{
  // コンテキストでのスーパーグローバル変数の表示。trueで表示される
  "super_globals": true,
  // コンテキストに表示される変数の階層数
  "max_depth": 10,
  // PHPエラーが出た時点ブレークする。falseにするとエラー箇所でもブレークしなくなる。fatalエラーのみブレークするなど、エラーレベルの設定も可能
  "break_on_exception": false
}
```

その他の設定はXdebug Clientのパッケージページで確認できます。
[Xdebug Client - Packages - Package Control](https://packagecontrol.io/packages/Xdebug%20Client)

### /etc/bashrcファイル
以下を追記します。
追記した後はターミナルから`source /etc/bashrc`でbashrcを再読み込みします。

```
# User specific aliases and functions
export XDEBUG_CONFIG="idekey=sublime.xdebug"
```

#xDebugを使う

* ソースコード上で、ブレークポイントを置きたい場所で「**⌘ + F8**」
* [ツール] -> [Xdebug] -> [Start Debugging]でデバッグを開始します。（「**⌘ + Shift + F9**」）
* デバッグしたいページのURL末尾に「**?XDEBUG_SESSION_START=sublime.xdebug**」のパラメータをつけてアクセス。ブレークポイントを置いた箇所でブレイク。
* 次のブレークポイントに移るには「**⌘ + Shift + F5**」
* ステップインは「**⌘ + Shift + F6**」

ブレークポイント時点での変数の確認が「Xdebug Context」のウィンドウで確認できます。ステップインで関数の書いてある場所もすぐわかる。

dumpとかprint_rとかもう書かなくてよくなりそう…

ここまで。
Windows環境でpsqlコマンドを使ってSQLをファイル実行するときにエンコーディングでハマった

#はじめに
この記事はタイトルの通り、Windows環境でpsqlコマンドを使ってSQLファイルを実行する際に起きたエンコードのエラーと解決策を紹介します。
今までだったらPgAdminでファイルを実行すれば事足りる話だったと思います。ただ、pdAdmin4の動作が不安定ということもあり、筆者のように導入を諦めてしまった方もいると思います。そんな人に読んでいただければと思います。

#前提
##環境
+ Windows Server 2012
+ PowerShell 4.0
+ PostgreSQL 10.4

##DBの設定
| 名前 | エンコーディング | 照合順序 | Ctype |
|:-:|:-:|:-:|:-:|
| sample | UTF8 | C | C |


##用意したファイル
UTF-8形式で保存しました。

```sql:create_category.sql
create table category(
  id int not null,
  name varchar(100) not null,
  primary key(id)
);
comment on table category is 'カテゴリ';
comment on column category.id is 'ID';
comment on column category.name is '名前';
```

#起きた問題
コマンド`psql -U postgres -d sample -f create_category.sql`をPowerShellで実行しましたが以下のエラーが発生しました。

```posh
PS C:\Users\Administrator > psql -U postgres -d sample -f create_category.sql

CREATE_TABLE
psql:create_category.sql:6: ERROR: character with byte sequence 0x86 in encoding "SJIS" has no equivalent in encoding "UTF8"
```
Tableは作成できましたが、日本語のコメントが書いてある部分でエラーになっています。
なぜかUTF-8形式のファイルなのにPostgreSQLがSJIS形式で読み込もうとしていますね。

#諸悪の根源
client_encodingの文字コードがSJISになっているので、失敗したみたいです。

```sql
SHOW client_encoding;

client_encoding
--------------------
SJIS
```

#対策
###対策1.ファイルをSJIS形式で保存してから実行する
create_category.sqlをSJIS形式に変換してcreate_category_sjis.sqlとして保存しました。中身は同じ。

```posh
PS C:\Users\Administrator > psql -U postgres -d sample -f create_category_sjis.sql

CREATE_TABLE
COMMENT
COMMENT
COMMENT
```
うん、大丈夫ですね。でもこれclient_encodingの設定に依存しているので、Linux環境で同じように実行したら、SJISファイルをUTF8で読んでエラーが起こりそう。

###対策2.SQLファイルの先頭でclient_encodingを変更する
さっきのcreate_category.sql(UTF8)の先頭に`\encoding UTF-8`と書き足します。

```sql:create_category.sql
\encoding UTF8;
--以下は変更していない
create table category(
  id int not null,
  name varchar(100) not null,
  primary key(id)
);
comment on table category is 'カテゴリ';
comment on column category.id is 'ID';
comment on column category.name is '名前';
```

結果は以下の通り

```posh
PS C:\Users\Administrator > psql -U postgres -d sample -f create_category.sql

CREATE_TABLE
COMMENT
COMMENT
COMMENT
```
UTF8で読み込めたね、よくできましたね！
しかしSQLファイル冒頭に`\encoding UTF8`と毎回書くのは少し煩わしいです。

###対策3.Windowsの環境変数でclient_encodingを書き換える
※@c-yanさん、@dany1468さんのコメントより追記

```powershell
PS C:\Users\Administrator> $env:PGCLIENTENCODING = "UTF8"
```

PostgreSQLでclient_encodingを確認すると、UTF-8になっていることが分かります。

```sql
postgres=# \encoding
UTF-8
```

ただ、副作用でテーブル内の日本語のデータが文字化けする場合があります。
PowerShellのエンコード形式がデフォルトではUTF-8ではないからです。
こちらについてはSQLファイルの実行と直接関係ないので説明は割愛させていただきます。
以下のサイトにPowerShellのエンコード形式とフォントの変更方法が書いてありますので
それを参考に対策してください。
https://qiita.com/yufu/items/86a455f948a3e1c0ef97

#補足
本当はSQLファイル内にエンコード形式を書くのではなく、実行するコマンド内で指定したかったのですが、分からなかったので上記の方法を使いました。もっと良い方法、コマンドでエンコード形式を指定する方法をご存知の方がいたら教えていただけると嬉しいです。
APIControllerで無名クラスを返す場合のContentの取得方法

# 1.問題点

APIControllerを使用してPostを送る場合、
IHttpActionResultを返り値にする場合、以下のように無名クラスで値を返すことがあるが、
その場合、Contentの値を取得することができない。

例：

```c#

    [ApiVersion("1.0")]
    [RoutePrefix("api/login")]
    public class LoginController : ApiController
    {

        [Route("")]
        [HttpPost, BodyRequired]
        public IHttpActionResult Post([FromBody]Login.Request postRequest)
        {
                ----略----

                return Ok(new
                {
                    Response = response
                });
        }

```
```c#
        private void Login()
        {

            _login = new LoginController();
            _login.Request = new HttpRequestMessage()
            {
                RequestUri = new Uri("----略----")
            };

            _req = new Login.Request
            {
                ----略----
            };

            _login.Configuration = new HttpConfiguration();

            var rp = _login.Post(_req)

        }
```

上記だと、Post()の返り値がIHttpActionResultのため、Contentが取得できない。
他の型に変換しようにも無名クラスのため変換できない。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/197597/eafc3517-ca4b-a564-a49d-2fc7081bc647.png)


# 2.解決方法

以下のようにExecuteAsyncを使用すると、Contentが取得できる。

```c#
            var rp = _login.Post(_req).ExecuteAsync(CancellationToken.None);
            var r = rp.Result.Content.ReadAsStringAsync().Result;
```
【初心者向け】ドラゴンボールクリッカーを作ってみた。

いまさらですが、昔はやったクッキークリッカーを作りたくなったので、作ってみました。

クッキークリッカーの基本ルールは、こんな感じ。

- クッキーをクリックすると、クッキーが＋１。
- たまったクッキーを支払うことで、アイテムを購入できる。
- アイテムを購入すると、毎秒クッキーがもらえるようになる。
- アイテムは購入するごとに、値段が1.15倍されていく。

で、追加ルールとして、クッキーが一定量貯まると、イベントが走る機能を追加。

この時点で、だれもが知ってるドラゴンボールでやってみることに決定。
クッキーの代わりに戦闘力を使います。

出来上がりはこちら。

**■ドラゴンボールクリッカー**
https://dbck.dog-ears.net/

ソースコードはこちら。
（ちなみにAngularで作ってます。）

**■github - dbck**
https://github.com/dog-ears/dbck

なるべくシンプルにしたかったので、
コンポーネントは分けずに、app.component.tsにほぼすべて書いてます。

**■github - dbck - app.component.ts**
https://github.com/dog-ears/dbck/blob/master/src/app/app.component.ts

「亀仙人に弟子入り」アイテムが、亀仙人に出会う前に出てくると困るので、
各アイテムには、どこまで戦闘力が上がったら表示するか？という数値を設定してます。

また、今回、javascriptで小数点の計算すると、誤差が出ることを初めて知りました。

**■JavaScriptで小数点の誤差が発生する件の備忘録**
https://qiita.com/Chinats/items/e2647ca7900dfe7835a8

1に0.1を10回足しても2にならないんですね・・・JS。



ちなみに、戦闘力は、以下サイトを参考にしました。

**■ドラゴンボール 極**
http://dbkiwami.web.fc2.com/index.html

インフレインフレって言われてるけど、
序盤に関しては、そんなインフレしてないんですね。
桃白白、もっと圧倒的に強いイメージでした。

##結論
- ドラゴンボールの戦闘力に合わせて作ったため、クッキークリッカーの醍醐味であるインフレ感が味わえなかった。 
- クッキークリッカーは、プログラミング初心者には、最高の教材だと思う。
- 作るだけなら難易度は低いが、面白くしようとするとレベルデザインをしっかりする必要がある。
Unity+Riderで頻繁にUnityが強制終了する場合の対策方法

# まえがき
Riderを2018.3にアップデートしてから頻繁にUnityが落ちるようになった。
ちょっと設定をいじったら改善されたのでその対策メモ。

# 環境

* MacOS 10.13.5
* Unity 2018.2.1f1
   * IncrementalCompiler 0.0.42-preview.16
* Rider 2018.1.3

# 詳しい状況

Riderを2018系にアップデートしてから、何度かコンパイルが走った後にプレイボタンを押すとそのままUnityが落ちるようになった。

以前のRiderだと`.cs`ファイルを変更＆保存してもUnityにフォーカスしないとコンパイルが走らなかったが、2018系にしてからRider上でソースコードを変更＆保存すると自動でUnityに通知され、都度コンパイルされるようになった。

どうやら頻繁にファイルの更新を行ってコンパイル待ちが詰まるとUnityが落ちる原因になるようだったが、ソースコードを変更したら指が勝手に保存する体を変えるのは無理なので、都度コンパイルを設定でoffにする。

# 設定方法

Riderのグローバルメニュー > Preferences > Languages & Frameworks > Unity Engine
にある "Automatically refresh Assets in Unity" のチェックを外す。

探すのが面倒なら設定内の検索ボックスに "Unity" と入れるとすぐ見つかる。

　
以上
Macのターミナル — ヒアドキュメントで改行しつつクリップボードにテキストコピーする

* 「ヒアドキュメントモード」は勝手につけた名前。
 
```
$ cat | pbcopy
Alice
Bob
Carol
```

`Ctrl+d` で終了

一度決定した行には戻れないので注意

## 確認

```
$ pbpaste
Alice
Bob
Carol
```


## Version

- bash 4.2
- Mac OSX High Sierra

## こちらもオススメ

- [Mac — Vimでクリップボードのテキストを直接編集する - Qiita](https://qiita.com/YumaInaura/items/cb6a8ebd149abd4dc8c7)

## Links

- [ccc/pbmake at 9781f78fb00f7b2b7ae9398ba9dc285e7ebc4552 · YumaInaura/ccc](https://github.com/YumaInaura/ccc/blob/9781f78fb00f7b2b7ae9398ba9dc285e7ebc4552/source/pbmake)
- [Gist](https://gist.github.com/YumaInaura/be65f93235e55e8d28ac931fdbfefdfd)
- [Medium—imported](https://medium.com/supersonic-generation/mac-os-pbcopy-with-heredoc-mode-9e474348cbc8)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
vmstatをMB単位で見やすく表示


デフォルトだと単位がバイトで結果が見づらい。また、表がずれていたりする。
MBに変えると見やすくなる。

```
$ vmstat  1 -Sm
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0    376   2871    198   1955    0    0    27   228  355  215 43  7 49  0  0
 0  0    376   2862    198   1964    0    0     0     0  170  454  5  2 93  0  0
 0  0    376   2871    198   1955    0    0     0     0  176  422  3  1 96  0  0
```

注意点としては、変更されるのは"memory"に対してであり、"swap"と"io"は影響を受けない。このことはmanに書いてある。
Laravel5.6DBとうまくつながらないとき

環境
Laravel5.6

DB接続でエラーになるとき
sql 200 error?
(エラー文コピーしませんでした)

- DB設定を確認
- キャッシュをクリア

```
php artisan config:clear
php artisan cache:clear
```

- サーバを再起動

僕の場合はサーバを再起動したらうまくいきました。
Ubuntu18.04LTSにlinuxbrew(linux版homebrew)を入れる

環境
Ubuntu18.04LTS

linuxbrewがうまく入らなかったので共有します。
インストール

```
sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
```
パスが通っていない？エラー

```
Warning: /home/linuxbrew/.linuxbrew/bin is not in your PATH.
```
ぐぐってもよくわからないので公式サイトをみてまず、依存関係を入れる

```
sudo apt-get install build-essential curl file git
```
ソースをクローンして入れてパスを設定する

```
git clone https://github.com/Linuxbrew/brew.git ~/.linuxbrew
PATH="$HOME/.linuxbrew/bin:$PATH"
export MANPATH="$(brew --prefix)/share/man:$MANPATH"
export INFOPATH="$(brew --prefix)/share/info:$INFOPATH"
```

バージョン確認

```
brew -v
Linuxbrew/homebrew-core (git revision c82d; last commit 2018-08-23)
```

端末とじてやったらbrewがどこかにいってしまったのでubuntuのメッセージから次を入力

```
sudo apt install linuxbrew-wrapper
```
バージョン確認

```
brew -v
Linuxbrew/homebrew-core (git revision c82d; last commit 2018-08-23)
```

たぶんできた。

参考サイト
[Linuxbrew]
(http://linuxbrew.sh/)
python-firebase-adminのsdkを使ってfirebaseのRemoteConfigを更新したかった

# ない！

![image.jpg](https://qiita-image-store.s3.amazonaws.com/0/235100/1746d847-68fa-4caa-b4d4-2fdbf31a87eb.jpeg)

ない！　RemoteConfigの項目がない！
SDKからはRemoteConfigが更新できない！（らしい！！）

世界はなぜ僕を追い詰めるのか
[REST API](https://firebase.google.com/docs/remote-config/use-config-rest?hl=ja)はあるので、APIから更新してみようと思います。

# GoogleAppEngine から firebaseのRemoteConfigを更新してみる

https://neko-tech-test.appspot.com/firebase-remote-config

このページから確認できてしまいます。
GETで登録中の値を、POSTで指定の項目を更新できます。
どういうパラメータを送ればいいのかは……↓のリポジトリから忖度してください。

## 制作物
https://github.com/fumihiko-hidaka/firebase-remote-config-by-gae

ソースを用意してみたので、もし良ければ参考までに。
こうするともっと簡単にできたり、便利なライブラリがあったりしたら、コメントなどいただければ！

## 実装例

```py
import json

import requests
from google.auth.app_engine import Credentials, get_project_id
from google.auth.transport import requests as google_request


class RemoteConfigRequest:
    def __init__(self):
        credentials = Credentials(
            scopes=[
                "https://www.googleapis.com/auth/firebase.remoteconfig"
            ]
        )
        credentials.refresh(google_request.Request())

        self.request_url = "https://firebaseremoteconfig.googleapis.com/v1/projects/{}/remoteConfig".format(
            get_project_id()
        )
        self.token = 'Bearer {}'.format(credentials.token)

    def get(self):
        r = requests.get(self.request_url, headers={
            'Authorization': self.token
        })
        return r.json()

    def put(self, data):
        put_data = {
            "parameters": data
        }

        r = requests.put(self.request_url, json.dumps(put_data), headers={
            'Authorization': self.token,
            'If-Match': '*'
        })

        return r.json()
```

Credentials情報をGAE、または事前に取得しておいたservice_account.jsonから作成してあげればOKです！
それを元にREST API実行用のtokenを取得してあげれば、後は指示通りにリクエストを投げるだけで済んでしまいます。
If-Matchを上手く設定してあげないと更新できないので、商用で使う場合は……少し賢く使ってあげないとダメそうです。

ね、簡単でしょう？

# 最後に

[株式会社ネコカリ](https://www.nekokari.co.jp/)では猫の手も借りたい🔥炎上中🔥なお仕事を募集しています！
firebaseを使うお仕事でもなんでもウェルカム。
一緒に働くメンバーも募集していますので、よかったら是非！
ハッシュ法の利用（螺旋本）

#はじめに
螺旋本に挑戦中です。今回はHashについてのコードを書きました。

##問題
 以下の命令を実行する簡易的な「辞書」を実装してください。

- insert str: 辞書に strを追加する。
- find str: 辞書に str が含まれる場合 'yes'と、含まれない場合 'no'と出力する。

##回答

```c++
#include <bits/stdc++.h>
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define REP(i, n) FOR(i, 0, n)
#define EACH(i, c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i)
#define EXIST(s, e) ((s).find(e) != (s).end())
#define SORT(c) sort((c).begin(), (c).end())
#define dump(x) cerr << #x << " = " << (x) << endl;
#define debug(x) cerr << #x << " = " << (x) << " (L" << __LINE__ << ")" \
                      << " " << __FILE__ << endl;
#define ALL(a) (a).begin(), (a).end()
#define PB push_back
#define MP make_pair
#define SZ(a) int((a).size())

using namespace std;

#define M 1777771

class Dictionary{
    private:
        vector<string> data;
        map<int, string> m;
    public:
        void insert(string str);
        void hash_Insert(string str);
        bool find(string str);
        bool hash_Find(string str);
        int get_Kay(string str);
        int hash_1(int kay);
        int hash_2(int kay);
};

int Dictionary::hash_1(int kay){ return kay%M; }
int Dictionary::hash_2(int kay){ return 1+(kay%(M-1)); }

int Dictionary::get_Kay(string str){
    int k = 0;
    REP(i, (int)str.length()){
        k += (int)str[i] * pow(5, i);
    }
    return k;
}

void Dictionary::insert(string str){
    if (!Dictionary::find(str)) data.PB(str);
}
void Dictionary::hash_Insert(string str){
    int i = 0;
    int hashed_Kay;
    int kay = get_Kay(str);
    while(true){
        hashed_Kay = hash_1(kay) + i*hash_2(kay);
        if(m[hashed_Kay] == "" or m[hashed_Kay] == str) break;
    }
    m[hashed_Kay] = str;
}

bool Dictionary::find(string str){
    if(std::find(ALL(data), str) != data.end()) return true;
    else return false;
}
bool Dictionary::hash_Find(string str){
    int i = 0;
    int hashed_Kay;
    int kay = get_Kay(str);
    while(true){
        hashed_Kay = hash_1(kay) + i*hash_2(kay);
        if(m[hashed_Kay] == str) return true;
        else if(m[hashed_Kay].length() == 0) return false;
    }
}

signed main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);

    int n;
    cin >> n;

    string op, word;
    Dictionary dic;
    
    REP(_, n){
        cin >> op >> word; 
        if (op[0] == 'i') dic.hash_Insert(word);
        else if(dic.hash_Find(word)) cout << "yes" << "\n";
        else cout << "no" << "\n";
    }  
}
```

## 結果
時間切れとなりました
![スクリーンショット 2018-08-24 4.24.50.jpg](https://qiita-image-store.s3.amazonaws.com/0/227662/a7f602ea-6b42-da72-dd10-0f8bcf886740.jpeg)

# 考察
実は一度自力実装を諦め、参考書の回答をみてC++で記述したのですが通せないので原因がよくわかっていません。こういう場合はケアレスミスがあるということが多いのでよくよく見直してみたいと思います。
見開き2ページずつになっているPDFを1ページずつに分解する

MakerBotのマニュアルを中綴じ冊子印刷しようと思ったら、こんなPDFだったので頭を抱えてしまった。
<img width="837" alt="スクリーンショット 2018-08-24 3.57.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/26038/950f20a1-29d3-fc48-fd90-48037f3f1845.png">

表紙（1ページ）と裏表紙（46ページ）は1ページで独立していて、中間の2〜45ページが見開きで繋がっている。
2~45ページを真ん中でばさっと切って個々のページに別れたPDFに変換したい。

[Poppler](https://poppler.freedesktop.org/)というツールでPDFの操作ができるらしいので使ってみた。

macOSだとbrewでインストールできる。

```sh:popplerのインストール
brew update
brew install poppler
```

Popplerは複数のコマンドから成る。
今回使うのは、`pdfinfo`, `pdfseparate`, `pdftocairo`, `pdfunite` の4つ。

まず、`pdfinfo`で見開きになっているページの縦横のサイズを調べる。

```sh:2ページのメタデータを見るコマンド
pdfinfo -f 2 -l 2 Replicator+Manual.pdf
```

```shell-session:実行結果（例）
Creator:        Adobe InDesign CC (Windows)
Producer:       Adobe PDF Library 10.0.1
CreationDate:   Wed Oct  5 18:46:46 2016 JST
ModDate:        Wed Oct  5 18:47:03 2016 JST
Tagged:         yes
UserProperties: no
Suspects:       no
Form:           none
JavaScript:     no
Pages:          24
Encrypted:      no
Page    2 size: 986.4 x 658.8 pts
Page    2 rot:  0
File size:      3004940 bytes
Optimized:      yes
PDF version:    1.4
```

986.4 x 658.8 pts ということがわかった。

続いて、（元のPDFでいうところの）2〜24ページを、`pdfseparate`でページごとに分解して、`pdftocairo`の描画範囲指定オプションを使って見開きの左右を切り出す。
表紙と裏表紙は単に名前だけ変更してコピーする。
最後に、`pdfunite`でひとつのPDFにまとめる。

以下のようなスクリプトになった。
ptの値はさきほど調べた`986.4 x 658.8`のように実数の値もとり得るようだが、`-x` `-y` `-W` `-H` には整数しか渡せないようなので、結果を見ながら近い整数の値を指定した。

```sh:convert.sh
#!/bin/sh

input="Replicator+Manual.pdf"
output="manual.pdf"

find ./split | grep -v '^./split$' | xargs rm
find ./cropped | grep -v '^./cropped$' | xargs rm

pdfseparate -f 1 ${input} split/%d.pdf

#         i = {2, 3, 4}
# i * 2 - 2 = {2, 4, 6}
# i * 2 - 1 = {3, 5, 7}

cp ./split/1.pdf ./cropped/1.pdf
for i in `seq 2 23`; do
  # 見開きの左半分を切り取る
  pdftocairo -pdf split/${i}.pdf -x 0 -y 0 -W 493 -H 659 -paperw 659 -paperh 493 ./cropped/`echo "${i} * 2 - 2" | bc`.pdf
  # 見開きの右半分を切り取る
  pdftocairo -pdf split/${i}.pdf -x 493 -y 0 -W 493 -H 659 -paperw 659 -paperh 493 ./cropped/`echo "${i} * 2 - 1" | bc`.pdf
done
cp ./split/24.pdf ./cropped/46.pdf

pdfunite `ls ./cropped | sort -n | xargs printf './cropped/%s\n'` ${output}
```

ほしかったPDFができた。
<img width="873" alt="スクリーンショット 2018-08-24 4.30.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/26038/80caddcd-ce33-67d4-a483-970060d4079c.png">

これでプリンタの中綴じ印刷機能を使えば中綴じ印刷ができるし、中綴じ印刷機能が無いプリンタでも、`pdfunite`の引数に渡す順番を変更すれば中綴じ印刷用のPDFを生成できる（かもしれない）（試してない）。
JavaScriptでよく使う、配列の中身を操作・検索する関数


JavaScriptで、関数を操作するときによく使う関数をまとめました。
es6の[アロー関数](#アロー関数)を用いています。

## Map

配列全体を加工して、新しい配列を作成します。

```javascript
const a = 3
const ary = [1, 2, 3, 4, 5]

// 配列のすべての値をaの値だけ足します。
const result = ary.map(item => item + a)
// result = [4, 5, 6, 7, 8]
```
返り値として新しく作成された配列が返ってきます。
関数の中でreturnした内容が、そのまま配列の要素として上書きされていきます。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/map

## forEach

配列全体に対して、処理をしたい時に使用します。

```javascript
const ary = [1, 2, 3, 4, 5]

// 配列の中のものをすべてconsole.logします。
ary.forEach(item => {
  console.log(item)
})
```

返り値はundefinedです。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

## filter

配列の中から、必要な要素だけ抜き出すことができます。

```javascript
const ary = [1, 2, 3, 4, 5]

// 3より小さいものだけを抜き出します。
const result = ary.filter(item => item < 3)
// result = [1, 2]
```

関数の中ではtrue, falseのいずれかを返す必要があります。
trueならその要素が残り、falseであれば破棄されます。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter

## find

es6から対応です。
配列の中から、特定の要素を1つ抜き出すことができます。

```javascript
const a = 'blue'
const ary = ['red', 'green', 'blue', 'yellow', 'white']

// aと同じ要素があれば、抜き出します。
const result = ary.find(item => item === a)
// result = 'blue'
```

最初に関数の中がtrueを返した時点で処理が中断され、要素がそのまま返ってきます。2つ以上要素があった場合でも、最初の要素のみが返ってきます。
見つからなかった場合は、undefinedが返ってきます。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/find

## findIndex

es6から対応です。
配列の中から、特定の要素のインデックスを返します。
基本的な使い方はfindと同じです。

```javascript
const a = 'blue'
const ary = ['red', 'green', 'blue', 'yellow', 'white']

// aと同じ要素があれば、そのインデックス(何番目か)を返します。
const index = ary.findIndex(item => item === a)
// index = 2

const result = ary[index]
// result = 'blue'
```
一点注意なのが、検索結果が見つからなかったとき、findIndexは -1 を返します。
つまり、要素が存在するかどうかを判定するのに、

```javascript
const index = ary.findIndex(item => item === 2)

if (!index) {
  // ... (合致した要素がなかった場合)
}
```

では誤りで、

```javascript
if (index === -1) {
 // ... (合致した要素がなかった場合)
}
```

という書き方になります。
配列の内容を操作したい時は、findよりも、findIndexの方が適しています。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex

## some

配列の中に、条件を満たした要素があるかどうかをチェックする関数です。
返り値はtrue, falseのどちらかです。

```javascript
const ary = [1, 2, 3, 4, 5]

// 配列の中に偶数が含まれているかどうかをチェックします
const isIncludeEven = ary.some(item => item % 2 === 0)

// isIncludeEven = true
```

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/some

## every

配列のすべての要素に対してチェックを行い、
そのすべてが合致すればtrue, ひとつでも違うものがあればfalseを返します。

```javascript
const ary = [2, 4, 7, 8, 10]

// 配列の中身がすべて２で割れるかどうかをチェックします
const isAllEven = ary.every(item => item % 2 === 0)

// 7は、2で割った余りが1なので、条件に合致しない。
// isAllEven = false
```
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/every

## アロー関数

補足です。
アロー関数とは、es6から追加された新しい関数の書き方です。
特徴としては

- 1行で書く場合にはreturn文、ブラケット{}を省略できる。
- thisのスコープが固定される

など、functionを用いた書き方に比べてシンプルに記述することができます。

```javascript
const result = ary.map(item => item * 2)
```

これは、

```javascript
const result = ary.map(function(item) {
  return item * 2;
});
```

と同じものです。
vuforiaで出したオブジェクトに触りたい

ARでミクちゃんに触りたいよね。
変なところではまってしまったのでそういうことをしないようにと

# やり方
そんなに難しい考えじゃありません。
ARCameraからRayを飛ばすだけです。

# 環境
androidプロジェクトとしてやります。
PCとかでもInputの方が変わるだけでやり方は同じです。

# 実装
```c#:ray.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class ray : MonoBehaviour
{    Camera camera;

    // Use this for initialization
    void Start()
    {
        camera = GameObject.Find("ARCamera").GetComponent<Camera>();
    }

    // Update is called once per frame
    void Update()
    {
        if (TouchJudge())
        {
            gameObject.GetComponent<Renderer>().material.color = Color.yellow;
        }
        else
        {
            gameObject.GetComponent<Renderer>().material.color = Color.red;
        }
    }

    bool TouchJudge()
    {
        int touchCount = Input.touchCount;

        if (touchCount > 0)
        {
            Debug.Log("touch");
            for (int i = 0; i < touchCount; i++)
            {
                Touch touch = Input.GetTouch(i);

                Ray ray = camera.ScreenPointToRay(touch.position);
                RaycastHit hit = new RaycastHit();

                Debug.DrawRay(ray.origin, ray.direction * 100);

                if (Physics.Raycast(ray, out hit))
                {
                    Debug.Log("hit");
                    if (hit.collider.gameObject == gameObject)
                    {
                        return true;
                    }
                }
            }
        }

        return false;
    }

```
これを**触るオブジェクト**の方に設定します。

# 解説
**注意**: cameraをMain Cameraにしない！！！(はまってたのはこれ)

`TouchJudge()`だけ解説
上から

1. １つ以上タップされてるか
2. タップ情報を１つずつ処理
3. タップ位置からRayを作成
4. 何かに当たってるか
5. 当たってるGameObjectが自分かどうか
6. 当たってたらtrue
7. それ以外ならfalse

です。

updateの方で当たってたら黄色、当たってなかったら赤になるようになってます。
ここにミクちゃんの動きとか入れればいいです。


# おまけ
## Rayを可視化
`Debug.DrawRay()`というのを知らなくてこれ聞いたとき感動したので使い方だけ
Rayを可視化できます。これ聞いただけでも超便利！！って感じ
使い方は`Debug.DrawRay(始点, 方向)`です

```c#:DrawRay.cs
Ray = new Ray(hogehoge);
Debug.DrawRay(ray.origin, ray.direction * 100);
```

directionに描画する距離をかけます。

# PC用の判定メソッド

```c#:mouseJudge.cs
bool mouseJudge()
{
        RaycastHit hit;
        Ray ray = camera.ScreenPointToRay(Input.mousePosition);

        if (Physics.Raycast(ray, out hit) && hit.collider.gameObject == gameObject)
        {
            return true;
        }
        else
        {
            return false;
        }
}
```
アプリ(Node.js)の認証(OIDC)をALBにやってもらうやつ

今さら感ありますがApplication Load Balancerでのユーザー認証機能を試してみました。
JWTの検証で意外にハマってしまったのでメモしておきます。

## IdPの設定
今回はOneLoginを利用しました。

用意されている「OpenId Connect app」をCompany Appとして追加すれば終わりと高を括っていたところ、ALBがHTTP 561を返し続け大分ハマりました。

トークンエンドポイントへのリクエストを「Basic」ではなく「POST」に設定しないといけないのでした。[^1]

## ALBの設定
AWSのドキュメントとブログを頼りに設定できました。

- [Application Load Balancer を使用してユーザーを認証する（AWSドキュメント）](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/listener-authenticate-users.html)
- [Application Load Balancer 組み込み認証によりログインを簡略化（Amazon Web Services ブログ）](https://aws.amazon.com/jp/blogs/news/built-in-authentication-in-alb/)

個人的なポイントとしては以下。

- ALBはHTTPSでアクセスされるように設定する
- 認証アクションで入力を求められる各エンドポイントは`/.well-known/openid-configuration`から確認する[^2]
- リダイレクトURLには`https://<ALBのドメイン名>/oauth2/idpresponse`を設定する

## アプリケーション実装
上で挙げたブログ曰く、

> しかしながら、対象リクエストが改ざんされていないことを担保する JWT ヘッダー上の署名を検証するためのアプリケーションを実装することは依然として重要です。

ということなので、Auth0のnode-jsonwebtokenを利用して検証を行うことにしました。が、ダメ。デコードすらできず。IDトークンがbase64urlエンコードされていないっぽい。

Base64エンコードした後、以下の変換を施したものがbase64urlエンコードらしい[^3]のですがIDトークンに「=」が入ってしまっていました。削除するとデコードできるようになりましたがverifyは失敗します。

|対象の文字|変換後|
|:-:|:-:|
|=|削除する|
|+|-|
|/|_|

そこで[jwt.io](https://jwt.io/)にて他のライブラリがないか探し[jsrsasign](https://kjur.github.io/jsrsasign/)というライブラリを使わせてもらうことにしました。

これで検証とデコードが問題なくできるようになり、あとはAWSのドキュメントに載っているPythonで書かれたサンプルをJavaScriptに移植すれば、出来上がりっ

```javascript:index.js
const express = require('express');
const fetch = require('node-fetch');
const rs = require('jsrsasign');

const app = express();

app.get('/activate', (req, res) => {
    // IDトークンを取得
    const token = req.header('x-amzn-oidc-data');

    // ヘッダーからkey idを取得
    const decodedJwt = rs.KJUR.jws.JWS.parse(token);
    const kid = decodedJwt.headerObj.kid;

    // 検証用の公開鍵を取得
    fetch(`https://public-keys.auth.elb.ap-northeast-1.amazonaws.com/${kid}`).then(response => {
        return response.text();
    }).then(pem => {
        // トークンを検証
        const pubKey = rs.KEYUTIL.getKey(pem);
        const isValid = rs.KJUR.jws.JWS.verify(token, pubKey, ["ES256"]);
        if (isValid) {
            res.send('valid');
        } else {
            res.status(400).send('invalid');
        }
    });
});

app.get('/', (req, res) => {
    res.send('arrived!');
});

app.listen(3000);
```

[^1]: https://dev.classmethod.jp/cloud/aws/onelogin-oidc-alb-auth/
[^2]: https://developers.onelogin.com/openid-connect/api/provider-config
[^3]: https://tools.ietf.org/html/draft-ietf-jose-json-web-signature-41#appendix-C