OmniAICreator/Qiita-1.07M huggingface dataset:
異なる言語間でgRPCを使う（server:golang、client:java）

公式のチュートリアルを参考に試す
https://grpc.io/docs/quickstart/

**環境**

```bash
$ go version
go version go1.12.4 darwin/amd64
$ java -version
java version "1.8.0_131"
```

**サーバ**

```go:greeter_server/main.go
func (s *server) SayTestRpc(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
  log.Printf("Received: %v", in.Name)
  return &pb.HelloReply{Message: "This is go server rpc" + in.Name}, nil
}
```

**クライアント**

```java:src/main/java/io/grpc/examples/helloworld/HelloWorldClient.java
public void checkrpc(String name) {
  HelloRequest request = HelloRequest.newBuilder().setName(name).build();
  HelloReply response;
  try {
    response = blockingStub.sayTestRpc(request);
  } catch (StatusRuntimeException e) {
    logger.log(Level.WARNING, "RPC failed: {0}", e.getStatus());
    return;
  }
  logger.info("Greeting: " + response.getMessage());
}
```

**動作確認**

```bash
# server
$ go run greeter_server/main.go
# client
$ ./build/install/examples/bin/hello-world-client
〜省略〜 Greeting: This is go server rpcworld
```

**http2でPOSTしている**
![スクリーンショット 2019-05-02 9.48.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110457/59154d04-0ae9-85d8-e2e3-91f3857dca27.png)
micro:bit で Scratch をもっと楽しく

とりあえず手元にmicro:bitがあったから連携させてみた的な。

環境・モノは以下で確認しています。
- Mac Mojave 10.14.4
- Scratch3.0
- micro:bit

#1. Scratch Linkをインストールする

ダウンロードは以下より

Mac : https://downloads.scratch.mit.edu/link/mac.zip
Windows : https://downloads.scratch.mit.edu/link/windows.zip

![スクリーンショット 2019-05-02 8.41.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/3b557e4a-78c6-fa30-014b-81c89115d667.png)

#2. Scratch Linkを起動する

Macの場合、起動したら上部メニューバーに下記アイコンが表示されます。
![スクリーンショット 2019-05-02 8.47.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/aea9dba7-6ff7-d83b-5d65-3421aede83b4.png)

#3. micro:bit にScratch通信用プログラムをインストール

以下よりダウンロードし、解凍後、micro:bit にコピーします。
https://downloads.scratch.mit.edu/microbit/scratch-microbit-1.0.hex.zip

#4. Scratch で micro:bit 拡張ブロックを追加

![スクリーンショット 2019-05-02 8.46.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/93c447fc-74a4-01e1-4a8b-32308ac871b3.png)

![スクリーンショット 2019-05-02 8.46.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/06641eac-414e-185a-9c54-ca456d2f7a5e.png)

- Scratch Link が起動されていないと以下のメッセージが表示されます。

![スクリーンショット 2019-05-02 8.46.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/ffafed59-e04f-87dc-6972-655ae1d43eec.png)

- Bluetoothをオンにし、Scratch Link が起動されていれば micro:bit を探しにいきます。

![スクリーンショット 2019-05-02 8.49.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/346fa91b-f59b-97b6-1658-2d7fa8ea3b13.png)

- micro:bit が見つかったら「接続」しましょう。

![スクリーンショット 2019-05-02 8.52.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/fd880f61-5ca6-dc66-4ef6-7447a1bde2bc.png)

- 接続されたらScratchエディターに戻ります。

![スクリーンショット 2019-05-02 8.52.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/c481c888-a62a-bf25-7f88-72da88c02ea4.png)

#5. ボタンがされたらキャットを移動

micro:bit 専用ブロックから、「ボタンA(B) が押されたとき」を使うとこんな風に連携しているのが分かります。micro:bit の Aボタンを押すと右方向に動き、Bボタンを押すと左方向に動きます。

![ab.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/d877cfdc-7808-c145-04c2-1211579e622f.gif) 

#おまけ
micro:bitをコントローラー代わりにした「キノベーダー」はこちらから
https://scratch.mit.edu/projects/306138229/

![kino.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/119864/1bafffc1-615d-0c62-7c1f-3431122ccf7e.gif)
機械学習論文読みメモ_164

[Self-Imitation Learning](https://arxiv.org/abs/1806.05635)
本論ではself-imitation learningを提案する。
この手法はエージェントの過去の良い決定を再現するよう学習を行う
off-policy actor-critic algorithmである。
本論の仮説である、より深い探索は過去の良い経験によって間接的に導かれる、
という考えの正しさを本論は示した。

[Evolving simple programs for playing Atari games](https://arxiv.org/abs/1806.05695)
Cartesian Genetic Programming (CGP)は関数集合に対する選択と組合せを通して
プログラムを構築プロセスに関し、それを遺伝的アルゴリズムにより発展させていく手法である。
CGPは特に画像処理に関してその可能性を示してきた。
本論ではCGPをAtariゲームのプレイに適用する。
提案するCGPでは、行列計算に関する処理を関数集合に含め、
結果画像処理や制御挙動を可能にする。
プログラムサイズは小さいが、SOTAモデルと同等の性能を持つ事が
可能である。

[DARTS: Differentiable Architecture Search](https://arxiv.org/abs/1806.09055)
本論ではneural architecture searchを微分可能形式に定式化する事で
スケーラビリティを改善する手法を提案する。
離散あるいは微分不可能な探索空間に対する強化学習や遺伝的アルゴリズムに基づいた
手法と違い、構造表現の連続緩和に基づいてSGDによる効率的な探索を提案手法は実現する。
提案手法はネットワーク構造をdirected acyclic graph (DAG)で表現し、そのDAGにおける
接続パターンをsoftmax関数を用いた連続緩和表現を利用することで微分可能な形にしている。
AWS認定試験(SAA:ソリューションアーキテクトアソシエイト)をPeasonVueで受験し合格した

# はじめに

[AWS Innovate online conference](https://aws.amazon.com/jp/about-aws/events/aws-innovate/sessions/)でPeasonVueでもAWS認定試験が受けられることを知りましたので受けてきました。
PeasonVueのテストセンターを検索してみると県に１つ認定試験のテストセンターがあるように見えます。
場所にしばられず受験がかなり楽になりました。

* 参考：[AWS Certification の受験場所が 3 倍に増加、AWS 認定取得がより便利に](https://aws.amazon.com/jp/about-aws/whats-new/2019/04/aws-certification-triples-testing-locations/)
* 参考: [PeasonVue テストセンター検索](https://wsr.pearsonvue.com/testtaker/registration/SelectTestCenterProximity/AWS?conversationId=757511)

## 試験の予約

[AWS認定サイト](https://aws.amazon.com/jp/certification/certified-solutions-architect-associate/)で予約します。試験のスケジュールを立てる、で予約手続きが可能です。手続き後予約時に登録するメールアドレス宛に手続き完了通知が届きます。（メールは英語でした）

![スクリーンショット 2019-05-02 8.01.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133866/e4c0f13f-3f39-0db1-f770-2a88139b6d7e.png)

## PeasonVueテストセンター

* 受付用紙をテストセンター受付で記入
* 本人確認書類は2種必要な点に注意し持参。自分は運転免許証とパスポートを持参
* そして顔写真を撮り受付完了
* 30分余裕を持って会場に着いていたので前倒しで受験できました

## テスト

* 会場にもよるのですが今回の会場はWEB監視カメラなしで受験
(別の会場の時はWEB監視カメラありで顔を試験中に触るだけでも注意を受けました・・)
* 会場に持ち込んで良いのは本人確認書類とテスト会場で支給されたメモボードとペンのみでした

## テスト後

* アンケートに回答
* アンケート回答後、合否が即時発表(スコアはわからない) -> 合格してました
* テスト受験翌日に上記AWS認定サイトで登録していたメールアドレス宛にテスト結果・スコア通知が届きました
（通知が届くまで時間がかかる場合があるようです）

## 資格取得のモチベーション

正直なところ、資格を取得しても知識が得られるだけで実際に手を動かして実践ができるような実力が身につかず実務には直結しないと思っていたため、今まで敬遠してきました(AWSは趣味でEC2やLambda、ECS使っている程度)。

今回の資格取得を経て体系的にサービスの特徴やアーキテクチャの考え方を知ることができました([AWS Well-Architected Framework](https://aws.amazon.com/jp/blogs/news/webinar-bb-w-a-2018/))。
個人利用レベルではRedShiftやKinesis、DirectConnectは中々利用するシーンがない気がします。高いですしね。。

## 今後

* 得られた知識を棚卸するために実際にサービスを使ってみて簡単なシステムを組んで実践してみたいです（QwikLABSでできたら嬉しい）。

[![thumbnail](http://image.slidesharecdn.com/20180606aws-blackbelt-prepare-for-certification-180606171357/95/slide-41-1024.jpg)](https://www.slideshare.net/AmazonWebServicesJapan/20180606-aws-black-belt-online-seminar-aws/41)

以上
WPAdmin AWS CDN Setup プラグインで WordPress + CloudFront

公式チュートリアルや WordPress に CloudFront をかませる Qiita 投稿などを見ても ACM(AWS Certificate Manager) で作成したSSL証明書を Alternate Domain Names とどうやって紐づけするのかいまいちよくわからなかったが，[WPAdmin AWS CDN Setup](https://wordpress.org/plugins/aws-cdn-by-wpadmin/) でえらく簡単に設定できた。

https://wordpress.org/plugins/aws-cdn-by-wpadmin/

なお，AWS SDK for PHP を利用しているようなので，

* AWS_ACCESS_KEY_ID
* AWS_SECRET_ACCESS_KEY

の入力を求められる。
rcairoのスクリプトをmruby-cairoで試してみた

こちらにあったrcairoのスクリプトをmruby-cairoで試してみました。

http://blawat2015.no-ip.com/~mieki256/diary/201201241.html

```ruby
W = 128
H = 160

RST = 21

width, height = W, H

num_enable = true

fpsv = 24

fontname = "/root/fonts/6x13.pcf"

def radians(ang)
  return (ang.to_f * Math::PI / 180.0)
end

def draw_watch(cr, cx, cy, r, fpsv, num_enable, fontname)
  rd = [0.97, 0.90, 0.87, 0.84, 0.82] 
  rdnum = [0.80, 0.76, 0.63]
  lv = [0.0, 0.0, 0.0, 0.0]
  wd = 1.1

  c = 0.0
  cr.set_source_rgb(c, c, c)
  cr.set_line_width(wd)
  cr.arc( cx, cy, r * rd[0], 0, 2 * Math::PI)
  cr.arc( cx, cy, r * rd[1], 0, 2 * Math::PI)
  cr.arc( cx, cy, r * rd[2], 0, 2 * Math::PI)
  cr.stroke()

  (6*fpsv).times do |i|
    ang = radians(360.0 * i / (6 * fpsv) - 90)

    x0 = (r * rd[0]) * Math.cos(ang) + cx
    y0 = (r * rd[0]) * Math.sin(ang) + cy

    if ( i % fpsv ) == 0 then
      rr = r * rd[4]
      c = lv[3]
      l = wd * 3.0
    elsif (i % (fpsv / 4) ) == 0 then
      rr = r * rd[3]
      c = lv[2]
      l = wd
    elsif (i % (fpsv/8) ) == 0 then
      rr = r * rd[2]
      c = lv[1]
      l = wd
    else
      rr = r * rd[1]
      c = lv[0]
      l = wd
    end

    x1 = rr.to_f * Math.cos(ang) + cx
    y1 = rr.to_f * Math.sin(ang) + cy

    cr.set_source_rgb(c, c, c)
    cr.set_line_width(l)
    cr.move_to(x0, y0)
    cr.line_to(x1, y1)
    cr.stroke()
  end

  if num_enable then

    (6*4).times do |i|
      ang = radians(360.0 * i / (6*4) - 90)
      if (i % 4) == 0 then
        s = [6,1,2,3,4,5][i/4]
        fsize = r * 0.13
        r5 = r * rdnum[1]
      else
        s = [0,6,12,18][i%4]
        fsize = r * 0.07
        r5 = r * rdnum[0]
      end
      s = s.to_s

      x0 = r5 * Math.cos(ang) + cx
      y0 = r5 * Math.sin(ang) + cy

      cr.move_to(x0, y0)
      cr.font_create(fontname)
      cr.set_font_size(fsize)
      cr.show_text(s)

    end
    6.times do |i|
      ang = radians(360.0 * i / 6 - 90.0)
      s = [-1,7,8,9,10,11][i]
      next if s == -1
      s = s.to_s
      fsize = r * 0.07
      r5 = r * rdnum[2]
      x0 = r5 * Math.cos(ang) + cx
      y0 = r5 * Math.sin(ang) + cy
      cr.move_to(x0, y0)
      cr.font_create(fontname)
      cr.set_font_size(fsize)
      cr.show_text(s)
    end
        
  end

end

tft = BsdTft.new(1, 0, BsdTft::S6D0151)

tft.setsize(W, H)
tft.setreset(RST)
tft.init

tft.cls(0)

c = Cairo.new(W, H)
c.set_source_rgb(1, 1, 1)
c.paint

cx = width / 2
cy = height / 2
rb = ([width,height].min) / 2

draw_watch(c, cx, cy, rb, fpsv, num_enable, fontname)

tft.lcdCopy(c.get_data)
```

文字の表示方法が違うところ以外はそのままでいけました。

![写真（2019-05-02 8.38）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/8a6fb644-2118-64c0-5bb0-d0608302203e.jpeg)
セッション機能を使用してログイン認証画面を作成する

お久しぶりです！

今回はログイン画面の作成にチャレンジしました。
(まだそこかいっというツッコミは受けます)

とりあえず成果物を作りたい！と思って色々調べたのですが、
その通りにやっても出来なくて( T_T)＼(^-^ )


がしかし！
以下のWebサイトを実践したところ出来ました〜！
https://www.ipentec.com/document/java-servlet-login-order-form

(手抜き感凄い)
(自分用のメモとして書いてるのでそこは許してほしい)

きちんと解説も載ってて分かりやすい！
アレンジもしやすい！

私みたいに、Javaで何か作りたいけど何から作ったら良いか分からない。。。
そういえばゲーム作れるんだっけ、やってみようかな、、、え？結構難しそうなんだが(そして挫折)
という方はこちらを参考にして見てくださ〜い！


ちなみに私は根気強く一から調べて...というのは途中で折れてしまって
／(^o^)＼うわあああ無理ぃ...(真っ暗)
となってしまうので、成果物を真っ先に作成してモチベーションを高め、
そこから解説見るだとかソースコードをいじって理解する方が向いてるみたいです。

勉強する気になっただけでも自分としてはかなり偉い← ので、
自分のこのやる気を損ねないようにするのも一つのやり方なのでは！と前向きに捉えています。笑

初心者の皆さん！一緒に頑張りましょう！！！
Windows10環境からChocolateyを使ってGitをインストール

#1. Chocolateyを使いGitをインストールする理由
身も蓋もないことですが、友人にGitの使い方を教えてもらい、その際にchocolateyを使っていたからです。コマンドラインはあまり馴染みがないのでこの機会に勉強します。この記事はPowerShellを使ってのインストールとなります。

#2. Chocolateyのサイト
1.　Chocolateyのダウンロードページへ飛ぶ
https://chocolatey.org/install

2.　画像の赤丸をクリック（コマンドがコピーされる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/998bb6ec-c80d-3e9a-1b6e-00d5496d9328.png)

#3　PowerShell（管理者)を起動・ダウンロード
［Windows］＋［X］キー（アドバンスメニューを表示）から簡単に選べる。

1.  2.2のコピーしたコマンドをペーストしてEnter（ダウンロード開始）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/492bae48-920a-aa0b-d107-bf435d79dccb.png)




2.　ダウンロード完了後以下のコマンドを入力してChocolateyをインストール

~~~
choco install git
~~~

3.　以下のことを聞いてきたらyを押してEnter
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307841/f8982716-3aa5-9c19-448d-d59874809fca.png)

#4　おわりに
Chocolateyの要素がほぼ皆無申し訳ないです。
Gitと一緒に学びます。
Craft CMS で Redactor の最初の画像を取りだす

> first-image/README.md at master · bhashkar007/first-image
> https://github.com/bhashkar007/first-image/blob/master/README.md

このプラグインを使うことで Redactor でのフィールドで使ってる最初の画像を取り出すことができる。
Vue.js で子コンポーネントに props を一括で渡す方法

沢山のプロパティを持つコンポーネントに値を渡すとき、
以下のように全プロパティについてズラズラ書いていくのはちょっと面倒です。

```javascript:よくない例
<Profile 
    :id="id" 
    :name="name" 
    :nickname="nickename"
    :address="address"
/>
```

こういうときは、**プロパティ名なし**の`v-bind`にオブジェクトを渡すことでプロパティを一括で渡すことができます。

```javascript:良い例
<Profile v-bind="{id, name, nickname, address}" />
```

あるいは`data`等にオブジェクトを定義しておくとテンプレートがより簡潔に書けます。

```javascript:良い例
<Profile v-bind="profile" />

(中略)

  data() {
    return {
      profile: {
        id: id,
        name: name,
        nickname: nickname,
        address: address,
      }
    }
  },
```

#蛇足

上述の方法は[公式ドキュメント](https://jp.vuejs.org/v2/guide/components-props.html#%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%AE%E5%8F%97%E3%81%91%E6%B8%A1%E3%81%97)にも一応ちょこっと記載はあるのですが、意外と知らない人も多そうだったので記事にしました。

実際、[公式の別の箇所](https://jp.vuejs.org/v2/guide/components.html#%E5%8D%98%E4%B8%80%E3%81%AE%E3%83%AB%E3%83%BC%E3%83%88%E8%A6%81%E7%B4%A0)では「プロパティが増えてきたらプロパティ定義を一つにまとめよう」的な別の解決策が書かれています。
しかしながらそれだと[プロパティのバリデーション](https://jp.vuejs.org/v2/guide/components-props.html#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E3%81%AE%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3)がやり辛くなるため、現在ではバッド・プラクティスではないかと思われます。

現行のバージョンではプロパティ定義を変えずともオブジェクトで渡せるので是非そうしていきましょう。
kubernetes上でIstioを動かしてみる

#はじめに

[Istio](https://istio.io/)は、Google、IBM、Lyftで共同開発したOSS化されたサービスメッシュフレームワークで、環境非依存のプラットフォームで利用可能です。

各マイクロサービスと一緒にSidecarProxyとをデプロイし、それ経由で他のマイクロサービスとの通信を行います。[Istio](https://istio.io/)では、SidecarProxyとしてLyftが作成した[Envoy](https://www.envoyproxy.io/)を採用しています。

そんなIstioをkubernetes上で動かしてみたので、まとめておこうと思います。

※2019年3月にバージョンが1.1に到達しています（参考：https://istio.io/blog/2019/announcing-1.1/）
※ベータ版ですが、GCPのマネージドサービスとして提供されています（参考：https://cloud.google.com/istio/docs/istio-on-gke/overview）

#Istioをkubernetesにinjectする

基本的にはPodは1つのcontainerを持つ状態で起動します。そのため、下のコマンドを叩くと、`1/1`と表示されます。

```sh

$ kubectl get pods
NAME                       READY   STATUS    RESTARTS   AGE
httpbin-5fc7cf895d-mp8vt   1/1     Running   0          27d
sleep-57f9d6fd6b-78xfr     1/1     Running   0          27d
```

Istioをinject（注入する）ためには、下記のコマンドでラベル付けをします。

```sh
$ kubectl label namespace default istio-injection=enabled
```
```sh
$ kubectl get namespace -L istio-injection
NAME             STATUS   AGE   ISTIO-INJECTION
default          Active   29d   enabled
istio-system     Active   29d
kube-public      Active   29d
kube-system      Active   29d
```

IstioのinjectはPodを作成するタイミングで発生します。
そのため、これ以降新たなPodを作成するタイミングで、Sidecarがinjectされます。

```sh

$ kubectl delete pod sleep-57f9d6fd6b-78xfr
$ kubectl get pod
NAME                     READY     STATUS        RESTARTS   AGE
sleep-57f9d6fd6b-78xfr   1/1       Terminating   0          1m
sleep-776b7bcdcd-7hpnk   2/2       Running       0          7s
```

上記の通り、`2/2`となっていることからもSidecarがinjectされていることがわかります。


#Istioをkubernetesにinjectしないようにする

上記で設定したinjectは下記のコマンドで無効にすることができます。

```sh
$ kubectl label namespace default istio-injection-
```
UbuntuでGoの開発環境をインストールしてHelloWorldしよう！

# はじめに

この記事では、  
1. UbuntuにGo言語の開発環境をインストールする
2. HelloWorldする  
の2つについて書いていきまーす

# 前提環境

* Ubuntu 18.04.2 LTS

# 1. UbuntuにGo言語の開発環境をインストールする

ctrl+alt+t キーを押すことでターミナルを開きます。  
Ubuntuでターミナルを開いて以下のコマンドを入力します。  
```
$ sudo apt install golang
```
これでgoのインストールが完了するはずです！  

![1-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289151/e242b6c3-bed5-a226-6f77-8f8c6bb24ba4.png)

次は、ちゃんとgoの開発環境が入ってるか確認します。  
以下のコマンドを実行することで、現在入っているgoのバージョンを確認できます。  

```
$ go version
go version go1.10.4 linux/amd64
```

![1-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289151/19bbfa61-5ebf-70d9-d107-b5049121a538.png)

# 2. HelloWorldする

それでは無事goの環境構築ができたところで、HelloWorldをしましょう！  
以下のコードを入力してください。  

```go:hello.go  
package main

import "fmt"

func main() {
  fmt.Printf("Hello World!\n")
}
```

そして、ターミナルでファイルを保存したディレクトリを開き、以下のコマンドを実行するとHello World完了です！  

```
$ go run hello.go
Hello World!
```

![2-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/289151/9aeee302-32f2-db9e-a2ba-58c9780cb7a0.png)

# まとめ

この記事では、Go言語の開発環境を構築し、Hello Worldをしました！  
今後もGoに関連する記事を書いていくのでよろしくおねがいします！

# 参考記事

* [go run と go buildの違い](http://nununu.hatenablog.jp/entry/2016/09/20/210000)
* [初めてのgo！インストールまで。](https://qiita.com/inexp_eng4432/items/08dce692894c92ae08ee)
[vbs]サブフォルダをランダムに開く

私用で急造したもの。
このスクリプトを配備したフォルダ内のフォルダをランダムに開く。

```vb:random.vbs
dim fso
dim folder
dim sfCount
set fso = createObject("Scripting.FileSystemObject")
set folder = fso.getFolder(fso.getParentFolderName(WScript.ScriptFullName))
sfCount = folder.SubFolders.Count

dim rnd_val
Randomize
rnd_val = Int(sfCount * rnd + 1)

dim subfolder
dim i
for each subfolder in folder.subfolders
	i = i + 1
	if i = rnd_val then
		CreateObject("Shell.Application").ShellExecute subfolder
		WScript.Quit
	end if
next
```
macOSのターミナルでssh接続先(Ubuntu18)のMySQLで日本語を入力すると日本語が消える

TerminalでUbuntu18.04のサーバにssh接続して、mysqlを起動してvaluesに日本語を入力すると"mysql> "プロンプト画面で、日本語をタイプすると、未変換状態の時は表示るが、Enterキーで確定すると日本語が消える。文字化けでない。これを解決するのに役立った解決方法は以下のコードを**/etc/mysql/my.cnf**に入力して解決した。

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

[mysqldump]
default-character-set = utf8
```
Kubernetesでnamespaceを作成・変更・削除する方法

#はじめに

Kubernetesでは、[Namespace](https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/)を使うと同一クラスタ内で Pod や Service, Deployment や StatefulSet などを仮想的なクラスタとしてグルーピングして取り扱うことができます。

チームごとや環境ごとにNamespaceを有効に使うことで、開発スピードを上げることができます。Googleの中にもKubernetesのベストプラクティスとしてまとまっているので、こちらは参考に読んでみると良いと思います。
[Kubernetes best practices: Organizing with Namespaces](https://cloud.google.com/blog/products/gcp/kubernetes-best-practices-organizing-with-namespaces)

#Namespaceを作成する方法

Namespaceは下記のコマンド1つで作ることができます。

```sh
# sampleというNamespaceを作成する
$ kubectl create namespace sample
```

また、作成したyamlファイルをapplyして作成することも可能です。

```sample.yaml
kind: Namespace
apiVersion: v1
metadata:
  name: sample
  labels:
    name: sample
```
```sh
# sample.yamlをapplyし、sampleというNamespaceを作成する
$ kubectl apply -f sample.yml
```

#作ったNamespaceを確認する方法

```sh
$ kubectl get namespace
NAME             STATUS   AGE
default          Active   29d
kube-public      Active   29d
kube-system      Active   29d
sample             Active   8m36s
```

`default`、`kube-system`、`kube-public`の3つに加えて、sampleのNamespaceができていることが確認できます。

#作ったNamespace上のリソースを確認する方法

作成したNamespaceのPodsの一覧を確認できます。

```sh
$ kubectl get services --namespace=sample
NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
details       ClusterIP   10.11.253.46    <none>        9080/TCP   16d
```
 
作成したNamespaceのPodsの一覧を確認できます。

```sh
$ kubectl get pods --namespace=sample
NAME                              READY   STATUS    RESTARTS   AGE
details-v1-bc557b7fc-cldx8        1/1     Running   0          16d
```

Namespaceを指定しないと、アクティブなnamespace上のリソースのみにしか問い合わせてくれません。

そのため、他のnamespace上のリソースを確認するには、上記のように--namespaceオプションを渡して上げるか、下記のコマンドでアクティブなnamespaceを変更する必要があります。

```sh
$ kubectl config set-context $(kubectl config current-context) --namespace=sample
```

#Namespaceを削除する方法

Namespaceは下記のコマンド1つで作ることができます。

```sh
# sampleというNamespaceを削除する
$ kubectl delete namespace sample
```

また、作成したyamlファイルを用いて削除することも可能です。

```sh
# sample.yamlで定義したsampleというNamespaceを削除する
$ kubectl delete -f sample.yml
```
python・Flask（Webフレームワーク）環境構築

#開発端末（Mac）の環境構築
　①Pycharmのインストール
　　[https://www.jetbrains.com/pycharm/](https://www.jetbrains.com/pycharm/)より無料版を取得

　②Pycharmの日本語化
　　[http://mergedoc.osdn.jp/](http://mergedoc.osdn.jp/)よりPleiadesプラグインをダウンロードし実行
<img width="1010" alt="スクリーンショット 2019-05-02 4.15.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/d92c3a51-c6ce-e93c-42b3-50f6fd35b0e3.png">

　③Pycharmにてプロジェクト作成

　④作成したプロジェクトにFlaskフレームワークを導入
　　Pycharm→環境設定→プロジェクト：｛プロジェクト名｝→プロジェクト・インタープリター
　　→＋ボタンを押下し　使用可能なパッケージ一覧ダイアログを表示

<img width="1033" alt="スクリーンショット 2019-05-02 4.24.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/9a012790-91df-ad66-e92d-31a03264b542.png">

　　　Flaskを選択し、パッケージのインストールを実施
<img width="917" alt="スクリーンショット 2019-05-02 4.29.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/a57d9284-ddfa-c0f7-8012-5d9a92937eb7.png">

　　参考：https://qiita.com/ikaro1192/items/4a840f4499c4046669e6

　⑤"Hello World!"作成
　　以下ファイルを作成

```hello.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return "Hello World!"

if __name__ == '__main__':
    app.run(port=8080)
```
<img width="728" alt="スクリーンショット 2019-05-02 4.35.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/df11d1ff-b364-0d56-1059-20aa3dfa239d.png">

　⑥サーバー実行
　　hello.pyを実行 
　　[http://localhost:8080]() にて"Hello World!"が表示されることを確認
<img width="762" alt="スクリーンショット 2019-05-02 4.42.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/f14044b0-072f-45e3-f435-c938f418810c.png">
Ruby 配列とブロックについて〜チェリー本４章〜

#Ruby 配列とブロックについて〜チェリー本４章〜#
**※この記事は初心者の私がチェリー本で学習するにあたって新しく知ったことや考えたことアウトプットするための場として書いています。**
この記事は以下の情報を参考にして記述し、一部引用しています。
[プロを目指す人のためのRuby入門](http://gihyo.jp/book/2017/978-4-7741-9397-7)
##ブロックに使うメソッド##

###delete_if###
```
irb(main):003:0> a = [1,2,3,4,5]
=> [1, 2, 3, 4, 5]
irb(main):004:0> a.delete_if do |n|
irb(main):005:1* n.odd?
irb(main):006:1> end
=> [2, 4]
```
`delete_if`メソッドはブロック内で指定した条件で配列の数字や文字等を削除するメソッドです。

```
irb(main):007:0> numbers = [1,2,3,4,5]
=> [1, 2, 3, 4, 5]
irb(main):008:0> sum = 1
=> 1

irb(main):009:0> numbers.each do |n|
irb(main):010:1* sum_value = n.even? ? n * 10 : n 
irb(main):011:1> sum += sum_value
irb(main):012:1> end

irb(main):013:0> sum 
=> 70
```
このようにブロック内は複数行に渡って条件を書くことやブロック外からの参照も可能（ただしブロック内から外への参照は不可）。
`sum_value = n.even? ? n * 10 : n`あとブロックとは関係無いですが、最初この文の２つ目に出てくる？が何を意味してるものなのか意味がわからなかったですが、１つ目の？がeven?で一つのメソッドになっていて、２つ目の？は条件演算子の？です。

###map###
```
irb(main):035:0> numbers = [1,2,3,4]
=> [1, 2, 3, 4]
irb(main):036:0> new_numbers = numbers.map {|n| n * 10}
=> [10, 20, 30, 40]
```
他の配列を利用してブロック処理をしたもの新しい配列に作るメソッドです。

###select / reject###
```
even_numbers = numbers.select{|n| n.even?}
=> [2, 4]

irb(main):038:0> odd_numbers = numbers.reject{|n| n.odd?}
=> [2, 4]
```
`select`はブロックの戻り値の中で条件式が一致したものだけを取り出すメソッドになります。
`reject`は逆でブロックの戻り値の中で条件式が一致したものだけを除外するメソッドになります。

###find###
```
irb(main):040:0> find_numbers = numbers.find{|n| n.even?}
=> 2
```
ブロックの戻り値が最初に真になった最初の要素を返します。

###each_with_index###
```
drink = %w(coffee tee water cola)
=> ["coffee", "tee", "water", "cola"]

drink.each.with_index{|d, i| puts "#{i}:#{d}" }
0:coffee
1:tee
2:water
3:cola

drink.each.with_index(1){|d, i| puts "#{i}:#{d}"}
1:coffee
2:tee
3:water
4:cola
```
each文で処理する結果に`.with_index`でインデックスの数字をつけてます。
インデックスの数字は指定しないと０から始まるので引数に１を指定してます。
簡単に書くとブロック処理の結果にもう一つ何か処理を一緒に加えたい時に使えるメソッドです。
ちなみにeach以外にもmapやdelete_ifと組み合わせてmap_with_indexやdelete_with_index,その他のメソッドと組み合わせて使うことができます。

---
##リファクタリングに使える配列の書き方##

###do...endの代わりに｛｝を使う###
```
numbers = [1,2,3,4]
numbers.each do |n|
sum += n
end
sum
=> 10

numbers.each {|n| sum += n}
sum
=> 10
```
ブロック内の条件式が１行で終わる場合は`do...end`の代わりに`{}`を使って１行で終わらせる方が見やすいです。

###(&:メソッド名)でもっと簡潔に書く###
```
[1,2,3,4,5,].select{|n| n.even?}
=> [2, 4]
[1,2,3,4,5,].select(&:even?)
=> [2, 4]
```
**1.ブロック引数が１つで**
**2.ブロックの中で呼び出すメソッドには引数が無く**
**3.ブロックの中ではメソッドを一回呼び出す以外の処理が無い**
場合にのみこの方法が使えます！

---
###あとがき###
この記事でなんとか２日目も書くこともができた！
けど４時間もかかってしまった、主に記事構成を考えるのと記事のトピック毎にどのように書こうかというところに時間がかかってしまっているのでどうしようか...
このままだと時間の無い平日とかに続けるのが厳しそうなのでなんとか解決策を見つけます！
２日目でも既にただ本を読んでただけの頃と比べるとちゃんと自分の頭で考えて消化出来てると感じるので明日も書きます。
CentOS7にDockerをインストールして、systemdで自動起動させる


CentOS7にDockerをインストールして起動させたい。
毎回起動させるのも面倒なので、2回目以降は自動で起動するようにsystemdで設定をする。

## 環境
```
$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
```

## Dockerをインストールする
1．インストール可能パッケージを確認。

```
$ yum list available | grep docker
```

2．yumでDockerをインストール。必要であれば適宜インストールオプション（-y）を付けると、インストール前の確認作業が省略できる。

```
$ sudo yum install docker 
```

3．Dockerインストール完了。

```
$ docker -v
Docker version 1.13.1, build b2f74b2/1.13.1 
```

## Docker起動
1．Dockerを起動させる。

```
$ systemctl start docker
```

2．Docker起動完了。

```
$ systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since 木 2019-05-02 02:53:31 JST; 23s ago
     Docs: http://docs.docker.com
 Main PID: 10304 (dockerd-current)
    Tasks: 17
   CGroup: /system.slice/docker.service
           ├─10304 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/d...
           └─10309 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libc...
```


## Docker自動起動設定
1．Dockerの自動起動設定をする。

```
$ systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
```

2．Dockerの自動起動設定完了。

```
$ systemctl is-enabled docker
enabled
```
Laravelのtrait Macroableを使って動的にメソッドを追加する

# Macroableとは

Laravelをインストールしたときに一緒にインストールされるtraitです。

vendor\laravel\framework\src\Illuminate\Support\Traits\Macroable.phpにあります。

Macroableをuseするとそのクラスは定義されたクラス以外でも動的にメソッドを追加できるようになります。

ソースそのものは108行しかないのでシンプルです。

以下メソッド

```
public static function macro($name, $macro)
public static function mixin($mixin)
public static function hasMacro($name)
public static function __callStatic($method, $parameters)
public function __call($method, $parameters)
```
仕組みとしてはmacro()でメソッド名と実行する内容を登録して、マジックメソッドの __call() か __callStatic() で使えるようにするといったものです。

hasMacro()は名前の通りmacro()で登録してあるかチェックするためのメソッドです。

mixin()は5.5から追加されました。名前で推測できるように引数にインスタンスを渡して、そのインスタンスのメソッドを使えるようにするためのものと判断出来ます。
ですが、癖が強いので使い勝手が良いかどうかは疑問です。後述します。


## 使い方
```
class Human{
	use \Illuminate\Support\Traits\Macroable;
	public function punch(){
		echo "パンチ";
	}
}
Human::macro('kick', function(){
	echo "キック";
});
$human = new Human();
$human->punch();
$human->kick();

//結果 パンチキック
```

Laravelで使うときはProviderで登録するのがまとまりがあって良いでしょう。

## mixin()の使い方

まずはmixinメソッドがどのように定義されているか見てみましょう。

```
public static function mixin($mixin)
{
	$methods = (new ReflectionClass($mixin))->getMethods(
		ReflectionMethod::IS_PUBLIC | ReflectionMethod::IS_PROTECTED
	);

	foreach ($methods as $method) {
		$method->setAccessible(true);
		static::macro($method->name, $method->invoke($mixin));
	}
}
```

リフレクションを使い、public,protectedのメソッドの一覧を取得してforeachでmacro()で登録する流れになっています。
ですが見てください。macroメソッドの第二引数の渡し方。

```
$method->invoke($mixin)
```

普通にメソッドの呼び出しをしています。
もしも直感的にメソッドを使うなら次のように間違って書いてしまうでしょう。

```
class Cat{
	public function say(){
		echo "にゃー";
	}
}

Human::macro('kick', function(){
	echo "キック";
});
Human::mixin(new Cat());
$human = new Human();

$human->punch();
$human->kick();
//$human->say(); BadMethodCallExceptionが発生する 

//結果　にゃーパンチキック
```
say()を呼び出していないのに にゃー と鳴いてしまってます。
say()を呼び出すとBadMethodCallExceptionになります。

どう解決しましょうか。
答えはシンプルです。

say()メソッドの返り値をクロージャーにします。

```
class Cat{
	public function say(){
		return function(){
			echo "にゃー";
		};
	}
}
```
このように定義すればsay()を呼び出してもBadMethodCallExceptionが発生しません。
結果はパンチキックにゃーの順で呼び出されます。

mixin()は無名クラスを使って登録するのがベターな気がします。

```
Human::mixin(new class{
	public function say(){
		return function(){
			echo "にゃー";
		};
	}
});
```

## Macroableの使い所は？
第三者に拡張性のあるクラスを提供したい！といった場合くらいですかね。
自分で率先して使う場面というのはあんまり無いでしょう。
バグの原因になりそうです。

実際の用途としてはLaravelで定義してあるクラスを拡張するのに使用するといったところでしょうか。
## 余談

日付操作ライブラリのCarbonにも同じようなMacroableのようなコードがあります。

個人的にマジックメソッドの __call() や __callStatic() はソースが追いにくくなるため苦手です。
Laravelチュートリアル - 汎用業務Webアプリを作る(1/4) Laradockで環境構築

# はじめに

これまで私はDjangoでいくつかのWebアプリを作ってきましたが、とある事情から今後Laravelに触れる必要が出てきました。

そこで、既存のDjangoアプリをLaravelで再現するチュートリアル記事を作成し、その過程を通してLaravelについて学ぶことにしました。

題材には、CRUD機能、検索機能、認証機能を持ち、Djangoを勉強する際にも大変お世話になった、下記Webアプリとさせていただきました。

[Djangoチュートリアル - 汎用業務Webアプリを最速で作る - Qiita](https://qiita.com/okoppe8/items/54eb105c9c94c0960f14)

# チュートリアル全体の構成

1. Laradockで環境を構築する（**本記事**）

2. [テーブルとCRUD画面を作る](https://qiita.com/shonansurvivors/items/561cfe9c2ae02da65bd4)

3. [検索画面とページネーションを作る](https://qiita.com/shonansurvivors/items/d0d2e6be5103244e8eb2)

4. 認証機能を作る（作成予定）

# 環境

- macOS High Sierra 10.13.6
- php 7.2.16
- Laravel 5.5.45
- PostgreSQL 9.6.2


# 1. Laradockで環境構築する

## ディレクトリ構造

本記事での環境構築を終えると、下記のディレクトリ構造が出来上がります。

```
├── data // データベースのディレクトリ
├── laradock // Docker関連ファイルのディレクトリ
└── src // Laravelのルートディレクトリ
```

## Laradockのコピー

プロジェクトのルートとなるディレクトリに、Laradockをコピーします。

```
$ git clone https://github.com/Laradock/laradock.git
```

## Laradockの.envファイルの編集

`laradock`ディレクトリが出来上がるので、その配下の`env-example`ファイルをコピーし、`.env`ファイルを作成します。

```
$ cd laradock
laradock $ cp env-example .env
```

`laradock/.env`の以下2つの設定を編集します。

```laradock/.env:
APP_CODE_PATH_HOST=../src

DATA_PATH_HOST=../data
```

## PostgreSQLのバージョンの指定

PostgreSQLは9.6.12を使用することにします。
PostgreSQLのDockerファイルを以下の通り編集します。

```:laradock/postgres/Dockerfile
FROM postgres:9.6.12

LABEL maintainer="Ben M <git@bmagg.com>"

CMD ["postgres"]

EXPOSE 5432
```

## コンテナの起動

コンテナを起動します。

```
laradock $ docker-compose up -d --build workspace postgres php-fpm nginx
```

## Laravelのインストール

Laravelをインストールします。

まず、起動したコンテナの中に入ります。

```
laradock $ docker-compose exec workspace bash
```

続いて、Laravelをインストールします。
バージョンは`5.5.*`にします。

```
/var/www# composer create-project --prefer-dist laravel/laravel . "5.5.*"
```

##データベースを作成する

コンテナの中に入ったまま、今度はPostgreSQLに接続し、データベースを作成します。

まず、PostgreSQLに接続します。

```
/var/www# psql -U default -h postgres
```

パスワードを入力します。

```
Password for user default: 
```

続いて、データベースを作成します。
データベース名は、`sample`にします。

```
default=# create database sample;
```

PostgreSQLとの接続を終了します。

```
default=# \q
```

## Laravelのタイムゾーンを日本時間にする

Laravelのタイムゾーンを日本時間にします。

```php:src/config/app.php
<?php
return [
//略
  'timezone' => 'Asia/Tokyo',
//略
];
```

## .envファイルの編集

Laravelの.envファイルを編集し、LaravelからPostgreSQLに接続できるようにします。

```:src/.env
DB_CONNECTION=pgsql
DB_HOST=postgres
DB_PORT=5432
DB_DATABASE=sample
DB_USERNAME=default
DB_PASSWORD=secret
```

# 最後に

以上で環境構築は完了です。

[次の記事](https://qiita.com/shonansurvivors/items/561cfe9c2ae02da65bd4)では、テーブルとCRUD画面の作成を行います。

# 参考

- [Laradock - Introduction](http://laradock.io/)
- [LaravelでPostgreSQLを使うための設定メモ - Qiita](https://qiita.com/aminevsky/items/52f56546f081c52b79ed)
LDAPで快適Linux環境 #3 LDAPアカウントの追加

[前回](https://qiita.com/uuu_n/items/a1dbdde83f47bc4364e5)、LDAPサーバーの設定をしたので、今回はアカウントを登録していきます。


ou=peopleの中に作ったou=1thにユーザーを登録していくのですが、homeをNFS共有する都合でまずサーバー上にローカルユーザーを作ります。

```bash
root@deb:~# adduser hoge -u 10101　--home /home/ldap/hoge
```

uid10101、gid10101のユーザー「hoge」を作りました。
LDAPユーザーはuid10000番代、1thに所属するので10100番代という規則にしています。2thなら10200番代にします。
"/home/ldap"の中にホームディレクトリを作っているのは、NFS共有するときにサーバーの管理用アカウントがクライアントから見えないようにするためです。

次にサーバーに登録していきます。以下の内容をvimなりemacsなりでldifファイルに記述します。

```:hoge.ldif
dn: uid=hoge,ou=1th,ou=people,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: Hoge Fuga
sn: Hoge
gn: Fuga
userPassword: asdf12345
loginShell: /bin/bash
uidNumber: 10101
gidNumber: 10101
homeDirectory: /homes/hoge

dn: cn=hoge,ou=1th,ou=groups,dc=example,dc=com
objectClass: posixGroup
cn: hoge
gidNumber: 10101
memberUid: hoge
```

サーバーのローカルに作ったユーザーとuid、gidを一致させるのがミソです。ホームディレクトリをNFSマウントするときに役立ちます。
パスワードは、とりあえず平文で簡単なものを入れておきます。初めてログインしたときに、使う人に変えてもらいましょう。
snは「surname」のことなので姓、gnは「given name」のことなので名をいれて、cnが「名 姓」になるようにしています。(無くても登録できるらしいのですが。)"uid="のところが実際にログインするときに使われるので、そこは小文字で姓にします。
"homeDirectory"が"/homes"の中なのは、クライアントのローカルユーザーのホームディレクトリと区別するためです。

```bash
root@deb:~# ldapadd -x -D cn=admin,dc=example,dc=local -W -f hoge.ldif
```

で登録します。

学年ごとのグループも作っておきます。

```bash
root@deb:~# adduser --group 1th --gid 10100
```

gid10000を持つ1thグループができました。これをサーバーに登録します。

```:1th.ldif
dn: cn=1th,ou=1th,ou=groups,dc=example,dc=com
objectClass: posixGroup
cn: 1th
gidNumber: 10000
memberUid: hoge
memberUid: piyo
```

cnに書いたものがグループ名になります。memberUidにuidを書いたものがグループのメンバーになります。

```bash
root@deb:~# ldapadd -x -D cn=admin,dc=example,dc=local -W -f 1th.ldif
```
部活全体のグループも作っておきます。

```bash
root@deb:~# adduser --group all --gid 10000
```

```:all.ldif
dn: cn=all,ou=groups,dc=example,dc=com
objectClass: posixGroup
cn: all
gidNumber: 10000
memberUid: hoge
memberUid: piyo
memberUid: hage
```
```bash
root@deb:~# ldapadd -x -D cn=admin,dc=example,dc=local -W -f all.ldif
```

slapcatをして設定を確認しましょう。
[次回](https://qiita.com/uuu_n/items/efe59cce54ffbc470216)に続きます。
bit全探索について簡単にまとめる

競プロとかで毎回bit全探索を調べ直しているのでまとめる。

## bit全探索とは
bit全探索とは、bit演算を使って全探索をする方法。bit全探索を使えば、部分集合を全パターン列挙することができる。
例えばAtCoderの「[C - たくさんの数式 / Many Formulas](https://atcoder.jp/contests/abc045/tasks/arc061_a)」のような問題で、各文字列中のどこに`+`を入れるかというパターンを簡単に全探索できる。

## bit全探索の例
例のコードは以下のようになる。（参考：[ビット演算 (bit 演算) の使い方を総特集！ - Qiita](https://qiita.com/drken/items/7c6ff2aa4d8fce1c9361)）

```cpp

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n = 3;

    // {0, 1, ..., n-1} の部分集合の全探索
    for (int bit = 0; bit < (1<<n); ++bit) {
        vector<int> S;
        for (int i = 0; i < n; ++i) {
            if (bit & (1<<i)) { // 列挙に i が含まれるか
                S.push_back(i);
            }
        }

        cout << bit << ": {";
        for (int i = 0; i < (int)S.size(); ++i) {
            cout << S[i] << " ";
        }
        cout << "}" << endl;
    }
}
```

標準出力は以下のようになる。

```cpp

0: {}
1: {0 }
2: {1 }
3: {0 1 }
4: {2 }
5: {0 2 }
6: {1 2 }
7: {0 1 2 }
```

## bit全探索のコード解説
一つずつ上記のコードを解説していく。まずは最初のfor文を見てみる。

```cpp

// {0, 1, ..., n-1} の部分集合の全探索
for (int bit = 0; bit < (1<<n); ++bit) {
  //
}
```

見慣れないのはおそらく`(1<<n)`の部分だと思う。**`(1<<n)`は`2^n`と覚えよう。**`2^n`は全パターン数と一致する。

`<<`という演算子はビット演算子で、ビット（2進数）を左へシフトする。int型は透過的に整数として扱えるが、実際に内部ではbitで管理されている。例えば3を8bitで保持するのであれば、`0b00000011`になる（2進数は先頭に`0b`をつける）。

そして1 (`0b00000001`)を左へ3ビットシフトする場合は`1<<3`と書き、結果は8(`0b00001000`)となる。

### AND演算
次にこの部分を見る。

```cpp

if (bit & (1<<i)) { // 列挙に i が含まれるか
```

まずは`(1<<i)`この部分。これは先ほど説明した通り、iが3なので`2^3`で8となる。
`&`の部分はAND演算、つまり「両方のビットが 1 のときのみ結果が 1 になるビット演算」である。

出力が`7: {0 1 2 }`となる場合は、bitが7 (`0b00000111`)である。というのも、どのビット位置（0~2番目）にもビットが立っているため、iが0~2どれであってもAND演算子ではtrueになり、全パターンである`0 1 2`を列挙することになる。
逆に`4: {2 }`の場合は4 (`0b00000100`)は右から3番目にしかビットが立ってないため、0~2の内、3番目である`2`しか列挙しないことになる。

このようにbitの特性を活かして全探索することができる。

## bit全探索まとめ

- **`(1<<n)`は`2^n`と覚える**
- **`(bit & (1<<i))`はAND演算子であり、bitの特性を活かして列挙することができる**

実際に手を動かして試すのが一番分かりやすい。
Homestead MailHog を利用する

# Laravel 簡単なアプリケーション作成(2)
## イベントを利用して会員登録時にメールを送る機能を追加

Laravelを利用して簡単なアプリケーションを作成する手順  
今回はイベントを使用して会員登録時にメールを送信する機能を追加する  

イベントとは、プログラムで発生する様々な事象を別のオブジェクトに通知し、その事象に対応した処理【リスナー】を実行する機能。


## 環境
[前回までの環境](https://qiita.com/kiyo-tomo/items/340b6c8aae3a7ba3a64d)を利用する

## 手順概要

1. メール送信設定
2. イベントとリスナーファイルの設定
3. リスナークラスの実装

### メール送信設定

Homesteadに同梱される"MailHog"というSMTPサーバを使用する。  
管理画面は
http://homestead.test:8025 にアクセスすることでGUI表示できる。

sampleapp/.env を編集

```sampleapp/.env
MAIL_DRIVER=smtp
MAIL_HOST=localhost
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
```

### リスナーファイルの設定

通常、イベントとリスナーの実装が必要だが、イベントはLaravelに含まれるものを利用するためリスナーのみ実装する。
下記ファイルに追加してリスナーを定義する。

```php:app/Providers/EventServiceProvider.php
protected $listen = [
    Registered::class => [
        SendEmailVerificationNotification::class,
    ],
    'App\Events\Event' => [
        'App\Listeners\EventListener',
    ],
    'Illuminate\Auth\Events\Registered' => [
        'App\Listeners\RegisteredListener', 
    ],
];
```

sampleappディレクトリに移動し、下記コマンドを実行してリスナークラスを作成する。  
app以下にListenerディレクトリが生成され、EventListener.php, RegisterListener.phpが生成されている。

```
$ php artisan event:generate
Events and listeners generated successfully!
$
```

生成されてるか確認

```
$ ls app/
Console		Events		Exceptions	Http		Listeners	Providers	User.php
$ tree -L 1 app/Listeners/
app/Listeners/
├── EventListener.php
└── RegisteredListener.php

0 directories, 2 files
$
```

### リスナークラスの実装

Listeners/RegisteredListenered.php に処理を追加

```Listeners/RegisteredListenered.php
<?php

namespace App\Listeners;

// add for mailer
use App\User;
use Illuminate\Auth\Events\Registered;
use Illuminate\Mail\Mailer;

use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class RegisteredListener
{
    private $mailer;
    private $eloquent;

    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct(Mailer $mailer, User $eloquent)
    {
        $this->mailer = $mailer;
        $this->eloquent = $eloquent;
    }

    /**
     * Handle the event.
     *
     * @param  Registered  $event
     * @return void
     */
    public function handle(Registered $event)
    {
        $user = $this->eloquent->findOrFail($event->user->getAuthIdentifier());
        $this->mailer->raw('会員登録完了しました。', function($message) use ($user){
            $message->subject('会員登録メール')->to($user->email);
        });
    }
}
```
FlutterでTextFieldに初期値を設定する方法


TextEditingControllerで設定する模様。


```dart
class Example extends StatefulWidget {
  @override
  _ExampleState createState() => _ExampleState();
}

class _ExampleState extends State<Example> {
  String _text = '';
  TextEditingController _textEditingController;

  @override
  void initState() {
    super.initState();
    _textEditingController = new TextEditingController(text: ''); // <- こんな感じ
  }

  @override
  Widget build(BuildContext context) {
    return TextField(
      controller: _textEditingController,
      onChanged: (value) {
        setState(() {
          _text = value;
        });
      },
    );
  }

  @override
  void dispose() {
    _textEditingController.dispose();
    super.dispose();
  }
}
```
　　
TextFormFieldでは初期値設定ができるようだけど、onTapとかないのでTextFieldと同じように使うにはGestureDetectorとか使わないといけないかもしれない。
　　

```dart
TextFormField(initialValue: 'hogehoge')
```

## 参考
[How do I supply an initial value to a text field?
](https://stackoverflow.com/questions/43214271/how-do-i-supply-an-initial-value-to-a-text-field)
とあるRailsエンジニアが再就職活動を共有したがっているようだ 2019-05-01 on Twitter

# エンジニアのリモートワークでは労働時間に対する報酬というよりも、本当に、貢献度に対する報酬という軸で考えなければ成り立たない気がしてきた。



<a href="https://twitter.com/YumaInaura/status/1123363719994470402">2019-04-30 23:09:16 UTC</a>
# Rubyエンジニアの年収例。


これを額面通り受け取って、週に2日で年収400万円だと、5日働けば1000万円になるわけだけど。

そうすると税金も高くなるし、なんだかんだと年収はわざと低く抑えるのもハッピーなのかもしれない。

>今はRubyの仕事をしてます。
>　
>働いてるのは週に2日だけですが、それでも年収は400万近くまでいきます。
>
>プログラミングは安定して、そこそこの金額を稼げるいい仕事です
>
>実務経験が5年くらいあれば誰でもできるので駆け出しエンジニアさんも夢があるんじゃないかと。

<a href="https://twitter.com/YumaInaura/status/1123422796950822913">2019-05-01 03:04:01 UTC</a>
# どうしてこんなに基本的なことを忘れていたんだろう。


"エンジニア人生は長いので転職に他の人より時間かかってもOKです"

>3〜4ヶ月で未経験からエンジニアに転職できたというツイートを見ると
>
>「え、おなじ期間勉強してるのに俺はまだ転職できるほどスキルない」
>
>「俺、エンジニアに向いてないのか..」
>と焦りますよね。
>
>でもそんな必要ないよ⭕
>
>エンジニア人生は長いので転職に他の人より時間かかってもOKです👍

<a href="https://twitter.com/YumaInaura/status/1123424644579508225">2019-05-01 03:11:22 UTC</a>
# プログラミング言語やフレームワークの盛衰もギャンブル性があるよね。
どの数字にベットするかみたいな。カジノのルーレット。

>僕もこのrailsオワコン論を信じてDjangoからweb開発に入ったわけですが
>
>初心者の方でこれからweb開発をやってみたいという人はRudyから入った方が遥かに情報量が多いので一応Railsをお勧めしますｗ
>
>ただPythonの時代がくるでぇ～論もあるので
>趣味はRails
>キャリア系はPython
>くらいの認識で(ﾃｷﾄ https://t.co/p0g1zSuAdV

<a href="https://twitter.com/YumaInaura/status/1123448392326295553">2019-05-01 04:45:44 UTC</a>
# 前職で一緒だったジャクシンさんの記事がQiitaでトレンド入りしている。


エンジニアのLINEグループにも招待したら喜んでくれた。


<a href="https://twitter.com/YumaInaura/status/1123451235997298695">2019-05-01 04:57:02 UTC</a>
# 前職で一緒だったジャクシンさんの記事がQiitaでトレンド入りしている。
  2019-04-30 on Twitter


<a href="https://twitter.com/YumaInaura/status/1123498158997295104">2019-05-01 08:03:29 UTC</a>
# プログラミング言語の人気は「おもちゃの輝き」によるのか。


"ここ3，4年はrubyやrailsに関しては、「飽きた」という言葉を聴くようになっていて"

"今、入ってきている人は新しもの好きが飛びつくオモチャとしてではなくて、すでに誰かが慣らした道を、道具として使おうと捉えている人達"

>なんでrubyがこんなに落ちたのか、面白い考察があった。
>
>gemってのが結構厄介みたいだね。
>
>https://t.co/SgQjKPSBBx

<a href="https://twitter.com/YumaInaura/status/1123533501989396480">2019-05-01 10:23:55 UTC</a>
# 言語にオモチャのキラメキがなくなると、人がいなくなり、コミュニティが消失すると。


"コミュニティの消失は新しいドキドキするようなオモチャ（新機能）がなかなか入らなくなった事で、新しもの好きのプログラマはScalaなどの他の言語に流れてしまいました。"


<a href="https://twitter.com/YumaInaura/status/1123533864381501441">2019-05-01 10:25:22 UTC</a>
# 小さな宝石のままだったはずなのに。


"まさかrubyがこんな巨大なライブラリ群と、railsのような巨大な実装で使われるとは思っていなかった、という初期設計のミスなんだと思うのですよね。"

Rubyは滅びゆく言語なのか？ - Qiita


<a href="https://twitter.com/YumaInaura/status/1123534389617422336">2019-05-01 10:27:27 UTC</a>
# プログラミングが育てる日常の名探偵。


>プログラミング勉強してるからか変に冷静に原因考えてしまった。
>・部屋着のポケット(滑りやすい)に入れてた
>・カバンや袋もなくジュースを買ったので手が塞がってた
>・部屋着のズボンのゴムが緩いので振動が伝わりやすい
>・イヤホンが有線で短いので引っ張ってしまった

<a href="https://twitter.com/YumaInaura/status/1123550084342247426">2019-05-01 11:29:49 UTC</a>



# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
R8C m12aのGCC環境構築

表記の通りやってみた


RVF/RC45 blogさんのやり方ではエラーが出て出来なかった

環境
Windows10上のvirtual box上のUbuntu16.04(64bit)

使用したソース
gmp-5.0.5.tar.gz
mpfr-3.1.0.tar.gz
mpc-0.9.tar.gz
binutils-2.25.1.tar.gz
gcc-4.9.3.tar.gz
newlib-2.2.0.tar.gz

・gmp-5.0.5の構築

```shell-session
$ sudo apt-get install m4 m4-doc
$ cd
$ cd gmp-5.0.5
$ ./configure --prefix=/usr/local
$ sudo make install
```
・mpfr-3.1.0の構築

```shell-session
$ ./configure --prefix=/usr/local --with-gmp=/usr/local
$ make
$ sudo make install
```
・mpc-0.9の構築

```shell-session
$ ./configure --prefix=/usr/local --with-gmp=/usr/local --with-mpfr=/usr/local
$ make
$ sudo make install
```

・binutils-2.25.1 の構築

```shell-session
$ cd
$ tar xfvz binutils-2.25.1.tar.gz
$ cd binutils-2.25.1
$ mkdir m32c_build
$ cd m32c_build
$ ../configure --target=m32c-elf --prefix=/usr/local/m32c-elf --disable-nls
$ make
$ sudo make install
```

・「/usr/local/m32c-elf/bin」へPATHを通して、シェルを起動しなおす
・gcc-4.9.3の構築

```shell-session
$ cd
$ tar xfvz gcc-4.9.3.tar.gz
$ cd gcc-4.9.3
$ cp /usr/share/automake-1.15/config.guess .
$ mkdir m32c_build
$ cd m32c_build
$ ../configure --prefix=/usr/local/m32c-elf --target=m32c-elf --enable-languages=c --disable-libssp --with-newlib --disable-nls --disable-threads --disable-libgomp --disable-libmudflap --disable-libstdcxx-pch --disable-multilib --disable-bootstrap
$ make
$ sudo make install
```
・newlib-2.2.0 の構築

```shell-session
% cd
% tar xfvz newlib-2.2.0.tar.gz
% cd newlib-2.2.0
% mkdir m32c_build
% cd m32c_build
% ../configure --target=m32c-elf --prefix=/usr/local/m32c-elf
% make
% sudo env PATH=$PATH make install
```
・gcc-4.9.3のC++ コンパイラの構築

```shell-session
$ cd
$ cd gcc-4.9.3
$ cd m32c_build
$ ../configure --prefix=/usr/local/m32c-elf --target=m32c-elf --enable-languages=c,c++ --disable-libssp --with-newlib --disable-nls --disable-threads --disable-libgomp --disable-libmudflap --disable-libstdcxx-pch --disable-multilib --disable-bootstrap
$ make
$ sudo env PATH=$PATH make install
```
・インストールされている確認する

```shell-session
$ m32c-elf-gcc-4.9.4
```
バージョンが表示されればOK
Substance Painter で読み込んだNormal mapの上下が逆転している際の対処法

# Substance Painter のNormal map読み込みについて
**Substance Painter**では外部で作成したNormal mapをインポートして使う事ができます。しかし、しばしば読み込んだNormal mapのY方向が逆転していることがあったので、この対処方法を共有します。
![SP_nor_06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230036/8308e631-d32b-db89-bfcf-2db14150f481.jpeg)

# Normal mapの上下が逆転する原因
Normal mapには**OpenGL方式**と**DirectX方式**があり、**Y方向を示すGチャンネル**の表現が逆となっています。なお**UnityのNormal mapはOpenGL方式**です。
Substance Painterでは外部から読み込んだNormal mapをレイヤーにアサインした場合にこの方式を自動で判別しますが、これが間違っている場合に上下が逆に表示されてしまうようです。
![SP_nor_07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230036/a61f09e5-8f3b-8fd8-91fb-4964fa04cfa5.jpeg)

#Substance Painter での修正方法
Substance Painterでの修正は簡単ですが、設定場所が少しわかりにくいかもしれません。
1.Normal mapイメージを適用したレイヤーのPROPERTIESを開きます
2.Normal欄の右下にある小さな▽をクリックします
3.開いた小ウインドウの二段目右をクリックします(これ以外の設定項目はありません)
4.開いたリストから**OpenGL normal**か**Direct3D Normal**の正しく表示される方を選択します
![SP_nor_08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230036/b3ec1053-2da1-479f-fb11-100c1c65b45b.jpeg)
#Photoshopでの修正方法
Substance Painterを使わずに単にNormal mapの上下を反転させたい場合は、PhotoshopでNormal map画像の**Gチャンネルを**選択し、**イメージ＞色調補正＞階調の反転**とする事で修正できます。Photoshopの場合は画像の上書きが必要ですが、Substance Painterは非破壊で修正できるところが利点です。
#まとめ
Normal方向の反転はSubstance Painterのごく基本機能ですが、少しわかりにくい場所にあると感じたので記事にしました。
本番環境(AWS)でjavascriptを読み込む方法

# はじめに
某プログラミングスクールの課題で、Railsを使ってECサイトを作成。

## 開発環境
Ruby 2.3.1
Rails 5.2.2.1

###発生時の状況
トップページに掲載している画像を、javascriptを使ってスライドさせる機能を開発環境で実装。
本番環境にデプロイすると、画像がスライドされず、また大きくレイアウトも崩れました。

###エラーの原因
原因は、application.jsに
``=require rails-ujs
=require jquery-ujs
``
の２つの記述があり、Rails側とjQuery側でファイルの呼び出しを行いエラーが発生しているようでした。

###解決策
調べた結果、上記のコードのいずれかを削除すると正常に動作する模様。
今回は、上の方のコードを削除したところ正常に動作しました。恐らく下のコードを削除しても正常に動作する。
LaradockでLaravel Mixを行う際の注意点

## LaravelのLaravel Mixでスタックしたことのまとめ

- npm run watch が動作しない。

laradockはdocker上で動いているため、`npm run watch`をしただけではダメ。

```
npm run watch-poll
```

これを入力する必要がある。

## 参考
「Laravel mix事始め」
https://qiita.com/ryosukes/items/24a556b9e634c183f93b
GCPを使ったゲームサーバの構築（マインクラフト） 仕様策定

# やりたいこと
このGW中にやろうと思っていた、GCPを使ったゲームサーバの構築を行う。
ゲームサーバは基本的に24/365で公開されており、かつ運用は自動で行われるようにする。
ただし、お金はあまりかけたくないので維持費は極力安くする。

## 要件
- GCPにサーバを構築したい
    - 24/365起動しておきたいが、たまに落ちてても別に良い
    - ただし、自動復旧したい
        - サーバに異常があった場合は通知したい
- あまりお金はかけたくない
    - リソースは極力小さいものにする
    - サーバソフトはリソースをあまり喰わないものにする
- サーバにMODを入れられるようにしたい
- サーバに接続する際にドメインで接続できるようにしたい
- バックアップは自動的に取りたい
    - 適当なタイミングでバックアップを取りたい
    - 古いバックアップはお金がかかるから適度に削除したい
- 今後ブログもやりたいのでWordpressを導入したい（そのうち）

## 仕様
- GCPにGCEインスタンスで構築する
    - プリエンプティブでVMを立て、small程度のリソースで構築する
    - ただしプリエンプティブでは２４時間に一度落ちてしまうのでテンプレートを使い自動復旧するようにする
    - Stackdriverを用いてサーバの停止、起動を通知する
- サーバソフトにはSpigotを利用する（今調べた限りではこれが良さそう？）
- CloudDNSを用いる。
- ドメインは安いドメインを取得する
- SSL証明書はCloudDNSと合わせてマネージドで設定する
- バックアップはGCSに行う
    - バックアップの取得間隔は日次とする
    - １週間経過したバックアップはNearlineに移行する（ライフサイクル設定）
    - 30日経過したバックアップは削除する（ライフサイクル設定）

## スケジュール
GW中に行いたいという希望なので、実際に行われるかはわかりませんが・・・とりあえず頑張ります。

2019/05/07追記
GW中に間に合わず…
一旦今週中を目処に頑張ります。

## その他
今回はとりあえずテンプレートエンジンを使うが、そのうちGKEで立ててみたい。
Windows10でDocker PHP7.2の開発環境を構築

##環境
- Windows10
- Hyper-V


##PHP7.02 + Apacheを起動する
イメージからコンテナを立ち上げる。（ローカルにimageがない場合はDocker Hubから取得してくれる。）

```
docker container run -d --name php-sample -v :/var/www/html -p 80:80 php:7.2-apache
```

##コンテナが作られているか確認
```
docker container ls

NAMESにphp-sampleが作られている事が確認できる。
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
501589adf392        php:7.2-apache      "docker-php-entrypoi…"   9 minutes ago       Up 9 minutes        0.0.0.0:80->80/tcp   php-sample
```


##コンテナにログインします。
```
docker container exec -it php-sample bash
```

##PHPファイルを作成
```
echo '<?php phpinfo();'> index.php
```

##ブラウザで確認
http://localhost/


以下の画面が表示される。
![php画面.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/265907/e55b5307-620d-5ac4-49ed-c4c1a68330b5.png)
外部キー(foreign_key: true)

###はじめに
初学者のアウトプット記事です。
アドバイス指摘あればどうぞよろしくお願いします。

#外部キー
外部キーは異なるテーブルのレコードと関係性（リレーション）を持つ場合に必要なカラムです。主キー同様に識別子の役割を持ちますが、他のテーブルのレコードを識別するために使います。


####例
外部キー(foreign_key)は関連する他のテーブルのレコードの主キーを値として持つカラムです。外部キーは他のテーブルのレコードとの関係性を表すために用います。

matching(出会い系)テーブルには2名の人間がいます。主キーになるカラムはid。

| id               |       name                  |    email |
|:-----------------|------------------:|:------------------:|
| 1                |             おっさん|     hugahuga@cmail |
| 2                |            美少女  |     hogehoge@gmail |

matchingテーブルと関係性を持つテーブルとして所持金テーブルがあると仮定します。
所持金テーブルにはそれぞれの人に対する所持金が保存されています。

| id               |       money             |    matching_id |
|:-----------------|------------------:|:------------------:|
| 1                |             1000円|     2              |
| 2                |          5000円|     1              |

所持金テーブルのidは主キーです。その他にmatching_idという属性が存在します。所持金テーブルでは、このmatching_idは外部キーに当たります。これはその所持金を持った人のレコードの主キーと対応しています。
つまり所持金テーブルのidが1であるレコードはmatchingテーブルのidが2であるレコードと対応しており、このことから「美少女の所持金は1000円である」ことが分かります。

###制約

テーブルのカラムに対して制約をかけることで不正なデータや予期せぬデータが保存されることを防ぐことができます。
制約とは特定のデータの保存を許さないためのバリデーションです。例えば同じメールアドレスのユーザーを登録できないようにする、名前のデータが空のユーザーを保存できないようにするといったことができるようになります。

###外部キー制約

外部キー制約は、外部キーの対応するレコードが必ず存在しなくてはいけないという制約です。外部キーのカラムに値があっても、その値を主キーとして持つ他のテーブルのレコードがなければいけません。

今回もハマったのですが。
今回は外部キーのカラムに値があったが、その値を主キーとして持つ他のテーブルのレコードがなかったためにエラーが発生してたりseaquel proにてデータベースへのレコード書き込みができませんでした。
そこのレコードを先に書いて値を入れといてあげると、特に問題なくレコード追加したりできました。



他にもnot null規制とかもあるんですが今回はこれにて。
ｍだ理解が必要です。