OmniAICreator/Qiita-1.07M huggingface dataset:
DockerでポータブルなUbuntuを作ろうとして日本語入力で挫折した

# 概要
 - やりたかった：DockerでUbuntu(日本語入力可)を作成し、開発環境を移植する
 - できた：Dockerコンテナ上でGUIアプリを起動
 - できた：日本語の表示
 - できなかった：日本語の入力

# 詳細
Dockerfileさえあれば、Windowsでも簡単にUbuntuで開発環境が構築できるような状況を作りたかった。
しかしfcitxがうまく起動していない(?)ため日本語の入力ができなかった。
以下、学習したことを書いていく。

## Docker上でGUIアプリを起動する一番楽な方法

### コンテナ側
環境変数DISPLAYを設定し、Xの画面をホストに飛ばす。
Windowsの場合、`ipconfig`の結果が次のようになるはずなので、設定する値は`192.168.99.1:0.0`となる。
意味は"(ホスト):(ディスプレイ番号).(スクリーン番号)"。

```bash:
イーサネット アダプター VirtualBox Host-Only Network #4:

   接続固有の DNS サフィックス . . . . .:
   リンクローカル IPv6 アドレス. . . . .: fe80::d146:d8f3:409d:7af7%10
   IPv4 アドレス . . . . . . . . . . . .: 192.168.99.1
   サブネット マスク . . . . . . . . . .: 255.255.255.0
   デフォルト ゲートウェイ . . . . . . .:
```

起動時オプションとして指定するのが楽。(実際はdocker-compose.ymlで指定する)

```bash:
$ docker run -e DISPLAY=192.168.99.1:0.0 your-image:tag
```
### ホストマシン側
X Serverをインストールする。(例：VcXsrv)
インストールが終わったらボタンポチポチで設定を行う。これによりコンテナから飛ばされたXの画面を表示できる。
![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/150087/30c2a45b-3a14-6d40-6cc1-a711a63814a9.jpeg)
![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/150087/8b820872-d293-4591-c9db-5d6149bd2984.jpeg)
![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/150087/8623bb6a-f5ac-3e58-c2b7-0f913490bb02.jpeg)

### やっておくとよいこと
```bash:
# 初期設定のaptリポジトリは米国のサーバーなので遅い。日本のサーバーに向ける
$ sed -i.bak -e "s%http://archive.ubuntu.com/ubuntu/%http://ftp.iij.ad.jp/pub/linux/ubuntu/archive%g" /etc/apt/sources.list

# Firefoxを起動した時に"Failed to execute dbus-launch to autolaunch D-Bus session"が出なくなる
$ apt-get install -y dbus-x11

# ppaリポジトリを追加する際にadd-apt-repositoryが使えるようになるので便利
$ apt-get install -y software-properties-common
```


## Ubunutu(on Docker)で日本語を表示する方法
デフォルトでは英語になっているので、ロケール情報を修正する。
必要なパッケージ/コマンドは次の通り。

``` bash:
$ apt-get install -y fonts-takao-* language-pack-ja tzdate
$ locale-gen ja_JP.UTF-8
$ update-locale LANG=ja_JP.UTF-8 LC_ALL=ja_JP.UTF-8
$ dpkg-reconfigure locales
$ ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
$ dpkg-reconfigure tzdata
```

#やりかけのDockerfile
あとは日本語入力さえできれば、、、。
誰か詳しい人がいたら教えてください。

```docker
FROM ubuntu:xenial

ENV DEBIAN_FRONTEND=noninteractive \
    GTK_IM_MODULE=fcitx \
    QT_IM_MODULE=fcitx \
    XMODIFIERS=@im=fcitx \
    DefalutIMModule=fcitx

RUN sed -i.bak -e "s%http://archive.ubuntu.com/ubuntu/%http://ftp.iij.ad.jp/pub/linux/ubuntu/archive%g" /etc/apt/sources.list \
 && apt-get update \
 && apt-get install -y dbus-x11 \
                       fonts-takao-* \
                       fcitx-mozc \
                       language-pack-ja \
                       tzdata \
                       software-properties-common \
                       x11-server-utils \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/* \
 && locale-gen ja_JP.UTF-8 \
 && update-locale LANG=ja_JP.UTF-8 LC_ALL=ja_JP.UTF-8 \
 && dpkg-reconfigure locales \
 && ln -fs /usr/share/zoneinfo/Asia/Tokyo /etc/localtime \
 && dpkg-reconfigure tzdata \
 && echo "fcitx-autostart" >> /etc/X11/xinit/xinitrc.d/fcitx \
 && chmod 557 /etc/X11/xinit/xinitrc.d/fcitx
```
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure


EclipseからSQLへ接続する際、上記のエラーが出ることがある

## 概要

何らかの理由によりEclipseからSQLに接続出来ないときに発生するメッセージ

## 解決法

- 単純にSQL接続用のアプリケーションを起動し忘れていると出る
- アプリは立ち上がっているがSQLの起動ボタンを押し忘れている、または何らかのエラーでSQLが停止している場合も同じエラーになる



#### SQLの接続にXAMPPを使用する場合
セキュリティ対策のため、初期状態のXAMPPでは外部からアクセス出来ない設定になっている

##### 解決法
- インストールしたXAMPPフォルダを開き
    → xamppfiles
     → etc
- という順番でetcフォルダへ移動し、内部のmy.cnfファイルをテキストエディタなどで開く
- 56行目辺りに skip-networking と書かれているので先頭に # を挿入しコメントアウトして保存
- この後にXAMPPを起動すれば外部からアクセス出来るようになる
ずんだの1桁足し算問題 Kotlin 編

https://qiita.com/tbpgr/items/6c75930566dda97bb5b6 の Kotlin 実装版。

```kotlin
fun ずんだ() = (1..10)
            .map { first -> (1..10).map { second -> Pair(first, second) } }
            .reduce { acc, list -> acc + list }
            .forEach { println("${it.first} + ${it.second}=${"~".repeat(it.first + it.second)}${it.first + it.second}") }
```

# Whats zunda-san

https://twitter.com/edamametsubu318

# 結果
```
1 + 1=~~2
1 + 2=~~~3
1 + 3=~~~~4
1 + 4=~~~~~5
1 + 5=~~~~~~6
1 + 6=~~~~~~~7
1 + 7=~~~~~~~~8
1 + 8=~~~~~~~~~9
1 + 9=~~~~~~~~~~10
1 + 10=~~~~~~~~~~~11
2 + 1=~~~3
2 + 2=~~~~4
2 + 3=~~~~~5
2 + 4=~~~~~~6
2 + 5=~~~~~~~7
2 + 6=~~~~~~~~8
2 + 7=~~~~~~~~~9
2 + 8=~~~~~~~~~~10
2 + 9=~~~~~~~~~~~11
2 + 10=~~~~~~~~~~~~12
3 + 1=~~~~4
3 + 2=~~~~~5
3 + 3=~~~~~~6
3 + 4=~~~~~~~7
3 + 5=~~~~~~~~8
3 + 6=~~~~~~~~~9
3 + 7=~~~~~~~~~~10
3 + 8=~~~~~~~~~~~11
3 + 9=~~~~~~~~~~~~12
3 + 10=~~~~~~~~~~~~~13
4 + 1=~~~~~5
4 + 2=~~~~~~6
4 + 3=~~~~~~~7
4 + 4=~~~~~~~~8
4 + 5=~~~~~~~~~9
4 + 6=~~~~~~~~~~10
4 + 7=~~~~~~~~~~~11
4 + 8=~~~~~~~~~~~~12
4 + 9=~~~~~~~~~~~~~13
4 + 10=~~~~~~~~~~~~~~14
5 + 1=~~~~~~6
5 + 2=~~~~~~~7
5 + 3=~~~~~~~~8
5 + 4=~~~~~~~~~9
5 + 5=~~~~~~~~~~10
5 + 6=~~~~~~~~~~~11
5 + 7=~~~~~~~~~~~~12
5 + 8=~~~~~~~~~~~~~13
5 + 9=~~~~~~~~~~~~~~14
5 + 10=~~~~~~~~~~~~~~~15
6 + 1=~~~~~~~7
6 + 2=~~~~~~~~8
6 + 3=~~~~~~~~~9
6 + 4=~~~~~~~~~~10
6 + 5=~~~~~~~~~~~11
6 + 6=~~~~~~~~~~~~12
6 + 7=~~~~~~~~~~~~~13
6 + 8=~~~~~~~~~~~~~~14
6 + 9=~~~~~~~~~~~~~~~15
6 + 10=~~~~~~~~~~~~~~~~16
7 + 1=~~~~~~~~8
7 + 2=~~~~~~~~~9
7 + 3=~~~~~~~~~~10
7 + 4=~~~~~~~~~~~11
7 + 5=~~~~~~~~~~~~12
7 + 6=~~~~~~~~~~~~~13
7 + 7=~~~~~~~~~~~~~~14
7 + 8=~~~~~~~~~~~~~~~15
7 + 9=~~~~~~~~~~~~~~~~16
7 + 10=~~~~~~~~~~~~~~~~~17
8 + 1=~~~~~~~~~9
8 + 2=~~~~~~~~~~10
8 + 3=~~~~~~~~~~~11
8 + 4=~~~~~~~~~~~~12
8 + 5=~~~~~~~~~~~~~13
8 + 6=~~~~~~~~~~~~~~14
8 + 7=~~~~~~~~~~~~~~~15
8 + 8=~~~~~~~~~~~~~~~~16
8 + 9=~~~~~~~~~~~~~~~~~17
8 + 10=~~~~~~~~~~~~~~~~~~18
9 + 1=~~~~~~~~~~10
9 + 2=~~~~~~~~~~~11
9 + 3=~~~~~~~~~~~~12
9 + 4=~~~~~~~~~~~~~13
9 + 5=~~~~~~~~~~~~~~14
9 + 6=~~~~~~~~~~~~~~~15
9 + 7=~~~~~~~~~~~~~~~~16
9 + 8=~~~~~~~~~~~~~~~~~17
9 + 9=~~~~~~~~~~~~~~~~~~18
9 + 10=~~~~~~~~~~~~~~~~~~~19
10 + 1=~~~~~~~~~~~11
10 + 2=~~~~~~~~~~~~12
10 + 3=~~~~~~~~~~~~~13
10 + 4=~~~~~~~~~~~~~~14
10 + 5=~~~~~~~~~~~~~~~15
10 + 6=~~~~~~~~~~~~~~~~16
10 + 7=~~~~~~~~~~~~~~~~~17
10 + 8=~~~~~~~~~~~~~~~~~~18
10 + 9=~~~~~~~~~~~~~~~~~~~19
10 + 10=~~~~~~~~~~~~~~~~~~~~20
```
ログを残しつつTerminalで作業するためのシェルスクリプト

#やりたいこと
- 作業ログを残しつつTerminalで作業がしたい
- Tera Termでログを残すような操作感のイメージ
- シェルスクリプトファイルをダブルクリックで起動する

#スクリプトファイル
Scriptコマンドで以下のように作成するサンプル
実行後、ファイル名を入力する
ファイル名：　[日付yyyyMMdd_hhmmss]_[入力したファイル名].log
ディレクトリ：　/home/hoge/logs

```terminal-with-log.sh
echo "ファイル名: "
read filename
script /home/hoge/logs/`date "+%Y%m%d_%H%M%S"`_`echo $filename`.log
```


#設定
そのままだとファイルをダブルクリックしてもエディタが開くだけなので実行できるようにする

- ファイルを右クリック → プロパティ → アクセス権 → 実行 の「プログラムとして実行可能」をチェックON
- ファイル → 設定 → 動作 → 実行可能なテキストファイル の「どうするか確認する」を選択
    - 「実行する」でもOK
第２回 Laravelプルリクで学ぶ英語講座

今回のプルリクはこちらです。

[[5.7] Allow Gates / Policies To Accept "Guests"]([https://github.com/laravel/framework/pull/24576])

This PR allows gates and policies to allow "guest users" (null) to be passed to them instead of automatically returning false. They can allow this by marking their user type-hint as optional or providing a null default value for the incoming user:

```php
$gate->define('foo', function (?User $user) {
    return true;
});
```

簡単に概要を説明すると、GatesとPolicyにゲストユーザー(null)をパラメタとして渡すことができるように変更したというものです。
*GatesとPolicyは、モデル保存時などにユーザーの認証を行うクラスです。
[ドキュメント](https://readouble.com/laravel/5.7/ja/authorization.html)

それではまずはタイトルから見て見ましょう。

タイトル
英: Allow Gates / Policies To Accept "Guests"
日: GatesとPolicyがGuestを受け付けるようにする

はい。これは特に説明は不要ですね。
allowもacceptもよく使われるので覚えておきましょう

allow: 許可する、許す、できるようにする
accept: 認める、受け入れる

allowはここでは「できるようにする」という意味だと理解してください。

次は内容を見ていきます。

This PR allows gates and policies to allow "guest users" (null) to be passed to them instead of automatically returning false. They can allow this by marking their user type-hint as optional or providing a null default value for the incoming user:

まずは読みやすいように自分で文章を分割してみましょう。
分割してみたら次を読み進めてください。

分割の仕方に厳密な方法はありませんが、私は以下のように分割しました。
分割の仕方については[前回](https://qiita.com/shrft/items/644ea4af28256001e824)も少し触れているので読んでいない方は参照ください。

This PR allows gates and policies
to allow "guest users" (null) to be passed to them 
instead of automatically returning false.

They can allow this 
by marking their user type-hint 
as optional or providing a null default value
for the incoming user:

```php
$gate->define('foo', function (?User $user) {
    return true;
});
```

それではこれを一行ずつ訳していきます。

英：This PR allows gates and policies
日:このプルリクエストはゲートとポリシーができるようにする

この時点では何をできるようにするのかわかりませんが、次に進みます。

英：to allow "guest users" (null) to be passed to them 
日: ゲストユーザー(null)をそれらに渡すことを可能にする

them(それら)はゲートとポリシーのことです。

英：instead of automatically returning false.
日: 自動的にfalseを返す代わりに

ここまでをまとめると以下のようになります。

英: This PR allows gates and policies to allow "guest users" (null) to be passed to them instead of automatically returning false.
日: このプルリクエストは、ゲートとポリシーに自動的にfalseを返す代わりにゲストユーザー(null)を渡せるようにする。

ちょっと長くなったので、今日はここまでにします。
Markdownのファイル分割とif/elseをerbで実現したよ

# 目的

Markdownは、シンプルで書きやすくていいですが、マニュアルを書くには少し物足りない部分があるのでerbでどうにかならないか試してみました。

## Markdownに追加できれば便利な機能

- ファイル分割
- テンプレートファイル利用(変数)
- if/else

## erb

erbは、テキストにRubyスクリプトを埋め込むことができるRubyの標準ライブラリです。
Rubyスクリプトを埋め込めるので、テキストファイルを一部パラメータ化したり、if/elseで条件分岐したりできます。Markdownに足りないと思っている機能を補えそうです。

# 試した結果

Markdownの書き方に少しerbの書き方を加えるだけの、いい感じなものを短いスクリプトで実現できました。**ただ、erbの方で頑張りすぎると、Markdownの良さである読みやすさがなくなるので、erbを少し活用する程度が良さそう**です。

## 全体像

全体の作りとしては、erbの書き方に沿ってRubyスクリプトを埋め込んだMarkdownファイルを、Rubyスクリプトで素のMarkdownに変換します。

- 基本Markdownで書いて
- テンプレート的に穴埋めする部分はerbの決まりで書いておく
- if/elseする部分はerbの決まりで書いておく
- 別ファイルのMarkdownを読み込む部分は、読み込むメソッドを書いておく
- Rubyスクリプトを実行して変換

```
ruby main.rb > main.md
```

## erbを埋め込んだMarkdownファイルを変換するスクリプト

erbを埋め込んだMarkdownファイルを変換するスクリプト(main.rb)の実装例です。paramには変数として渡したいものを記載します。Pageクラス内で、Object#instance_variable_setで展開しているので読み込んでいるerbファイル内でパラメータとして利用できます。

```ruby:main.rb
# -*- coding: UTF-8 -*-
require "erb"

class Page
  def initialize(locals={})
    locals.each { |key, val| 
      self.instance_variable_set("@#{key}", val)
    }
  end

  def render(path)
    content = File.read(File.expand_path(path))
    t = ERB.new(content, nil, '-')
    t.result(binding)
  end
end

# Markdownファイルに埋め込むパラメータを事前に定義する
param = {
  title: "何かのマニュアル",
  plan: "梅",
}

page = Page.new(param)
markdown = page.render("main.erb.md")
puts markdown

```

## 読み込むMarkdownファイル例

スクリプトから読み込むトップのMarkdownファイル(main.erb.md)です。erbの書き方は省略しますが、ここではplanが松、竹の場合は別のMarkdownファイルに書いたスペシャル機能の説明を埋め込む例です。

```md:main.erb.md
<%= @title %>

# このマニュアルについて

このマニュアルは<%= @plan %>プラン向けのマニュアルです。

# スペシャル機能について

<% if ["松", "竹"].include?(@plan) %>

<%= render "special.erb.md" %>

<% else %>

スペシャル機能は、<%= @plan %>プランでは利用できません。

<% end %>

```

トップのMarkdownファイル(main.erb.md)から、読み込まれるファイル(special.erb.md)です。読み込む時、erbとして読むのでこっちでもerbの書き方が利用できます。

```md:special.erb.md
スペシャル機能は、<%= @plan %>プランで利用できます。スペシャル機能は、特別な機能です。

スペシャル機能のとても長い説明。

```

## 実行結果例

planを松とした場合。

```
何かのマニュアル

# このマニュアルについて

このマニュアルは松プラン向けのマニュアルです。

# スペシャル機能について



スペシャル機能は、松プランで利用できます。スペシャル機能は、特別な機能です。

スペシャル機能のとても長い説明。




```

planを梅とした場合。

```
何かのマニュアル

# このマニュアルについて

このマニュアルは梅プラン向けのマニュアルです。

# スペシャル機能について



スペシャル機能は、梅プランでは利用できません。



```

外部ファイルの読み込みと、if/elseができました。

# 補足

パラメータの部分も別ファイル(yamlなど)にして、実行時に指定できるようにした方が良さそうです。今回は、ファイル分割とif/elseが実現できればよかったので、最小限の実装です。

あと、ファイル拡張子(erb.md)は、変換前もそこそこMarkdownプレビューできるようにmdとしています。ファイル的にはmd.erbの方が正しい気もしますが、プレビューできないので。

# 参考URL

erbファイルに別のerbファイルを読み込む方法は、下記URLを参考にしました。

- [Including one erb file into another](https://stackoverflow.com/questions/10236049/including-one-erb-file-into-another)
ど素人のiOSアプリ開発記 - Part.0

#未経験からのiOSアプリ開発
完全素人がiOSのアプリを開発してみようという企画です。
どこまで続くか分かりませんが、何か一つでも形にできればいいなと思っています。
##何をいつまでにどうやって作るのか
そもそもの話ですがこれを決めないと前に進めません。とは言っても何も決まっていないので、今から考えていきます（プランニングがすでに破綻しているのは気にしない）。
とりあえず、Qiitaを使っていくからには有益な情報をまとめていければと思っています。
というわけでざっくりコンセプトを決めます。
###自分が使うためのアプリを作ります
何かを作るからには誰かに使ってもらわないといけません。私の場合、ウェブ関連のフロントエンドスキルはありますが、いきなり高度なアプリ開発はハードルを上げるだけなので、自分のためになるアプリを作ってみたいなと思います。
普段やってるMMORPGで膨大なステータスデータを管理してみるとか、仕事でも使えるコーディング関連支援ツールとか、ふわっとした発想は出てきますが具体的なものは何一つありませんね。
###開発スケジュール
巷の記事を見ていると、GWを使って一通りの内容は習得できるなど夢のような情報はたくさん出てきています。とはいえ、そんなことを鵜呑みにしていると痛い目を見そうなので無理やり納期を決めちゃいます。
####10月にやること
- アプリ開発の宣言をする（今ここ）
- 開発に必要な基本事項を調べる

####11月にやること
- アプリで何が出来るかを把握する
- 開発コンセプトをまとめる

####12月にやること
- デザインを固める（どうやるんだろ？）
- 開発に必要なデータを整理する（必要なのかな？）

####2019年3月頃
- アプリをリリースする！

###とりあえずやってみる
さぁ、とてもざっくりなスケジュールが出来たので、この計画を実現するためにあとは行動するだけです。とりあえず不安しかないので、自分のケツを叩くためにも隔週くらいでQiitaに近況報告をするような形で進めたいなと思っています。
##まず何をすればいいのか？
とりあえず備忘録としてこのあたりは知っておいたほうが良さそうな情報です。
今のところ当たり前のような情報しかありません。
###Apple公式の開発者向けサイト
[Apple Developer](https://developer.apple.com/jp/)
最新の情報はここを見ておけば掴めるのかな？
英語が多いけど頑張ろう
####開発環境
[Xcode](https://itunes.apple.com/jp/app/xcode/id497799835?mt=12)
これを入れるとmacOS、iOS、WatchOS、tvOSといったAppleのプラットフォームの開発に着手できるみたいです。無料なのはありがたいですが5GBもあるんですね。
####デベロッパー登録
[Apple Developer Program](https://developer.apple.com/jp/programs/)
Appleにデベロッパーとして登録をしないといけないようです。ここは有料で年間11,800円もかかるようです。出費を渋っていても始まらないので登録しようと思いますが、もう少し作るアプリの内容が具体化してからでも良さそうなのでとりあえず様子を見ていようと思います。

##順調に開発準備が進んでいます
さて、いろいろ書きましたがとりあえずアプリを作る！という意志と最低限の情報を調べることができました。
次回はもう少し踏み込んだ内容を調べてまた、記事を書きたいと思います。

続く・・・？
Githubに新規リポジトリを追加

前提
githubのアカウントの作成
sshkeyの追加

環境
windows10

##はじめに
githubに新規リポジトリを追加します。自分のアウトプット用に記事にしました。
###1,git initでセットアップ
コマンドプロンプト上でこれから作成するアプリケーションのルートディレクトリに移動します。下の写真のように、これから作成するアプリケーションのファイルの一番先頭に移動したら、ルートディレクトリに移動ができたということです。

```
C:\Users\hoge\environment\sample_app>
```
下のように、git initコマンドを打ち込みます

```
C:\Users\hoge\environment\sample_app>git init
```

###2,git add -Aでインデックスにファイルを追加

```
C:\Users\hoge\environment\sample_app>git add -A
```
インデックスとはこれからコミットするファイルが集まっている場所と捉えています。
オプションの-Aは-allと同じ意味で、このオプションを付けることで
git管理内のすべての変更がaddされますが、新規レポジトリを追加する場面では特に意識する必要はないでしょう。

###3,git commit -m で変更を反映
これからはコマンドプロンプト上での現在の位置情報を示す、
C:\Users\hoge\environment\sample_app>は、見やすさを考慮して、省略します。

```
git commit -m "Initialize repository"
```
インデックスで控えていたファイルたちをgit commitで本格的に変更を反映させます。ただし、今の状態はローカルマシン上での操作で、自分のパソコン内での操作と考えておきましょう。

###4,github上で新規レポジトリを作成
ローカルリポジトリからリモートリポジトリに移動させる時に、受け皿つくる必要があります。githubが受け皿になっています。

赤枠で囲まれたプラスをクリックすると
<img width="924" alt="github 追加.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/299065/cca724f5-4469-0519-de66-ff7c13b26b9d.png">
プルダウンでメニューが出てくるので、New repositoryをクリックします。
<img width="933" alt="github 追加２.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/299065/a369b0ba-e39d-5910-18e4-bbdda85cba8f.png">

リポジトリの作成の画面になります。

<img width="584" alt="github 追加8.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/299065/1165f301-4b22-ea11-c9bf-054583bb7b20.png">

自分は初め、Initialize this repository with a READMEの部分をチェックして作成したら、conflictを起こして上手くgit push origin master（後に説明）が出来なかったので、ここではチェックしない方が楽だと思います。
Create repositoryをクリックしたら、github上での受け皿が完成します。

###5, githubのリモートリポジトリ情報をローカルリポジトリに追加する
コマンドプロンプトに移動して以下のようなコマンドを打ちます。

```
git remote add origin [リモートリポジトリ情報]
```

ただ、上のリモートリポジトリ情報をgithub上から取得しなければいけません。
下のような画面になっているかと思います。
下のURLがリモートリポジトリ情報にあたります。
<img width="551" alt="github 追加7.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/299065/b2f4d6a3-1b82-82c8-067a-91cc602626e7.png">



ですのでコマンドは以下のようになります。
ちなみに、下のsodaihiraiの部分は、各自のuser_nameで、次のsample_appはgithub上でリポジトリを作成した際に設定した、Repository nameになります。

```
git remote add origin　https://github.com/sodaihirai/sample_app.git
```
###6,git pushでローカルリポジトリの変更をリモートレポジトリに反映する。

コマンドは以下のようになります。

```
git push origin master
```
githubのページをリロードすると、しっかり反映が確認できます。

###初めての投稿を終えて
始めて、Qiitaに投稿をしてみました。確かにアウトプットの質は高まりますが、
記事作成の時間と作成することで得られるアウトプットの質を考えなければと思いました。これからも投稿していけたらと思います。
Nginxで静的コンテツを読み込むようにするために

# 経緯
- 昨日、Redmineの前面にNginxを置いてcacheとSSLオフロードかましてうはうは楽しんでたらCSSやJS読み込まれなくなったことに昨晩気がつく。。。

## どうするの？
- 修正した箇所となぜそれが必要なのかを残しておく

## 設定を変更した箇所
```
location /xxxx/ {
    proxy_pass http://127.0.0.1:xxxx/;
}

~割愛~

location ~ .*\.(html?|jpe?g|gif|pdf|png|css|js|ico|swf|inc) {
    expires 1d;
    access_log off;
 }
```

```
location ~/xxxx/ {　　　　　　　<--ここ
    proxy_pass http://127.0.0.1:xxxx/;
}

~割愛~

location ~ .*\.(html?|jpe?g|gif|pdf|png|css|js|ico|swf|inc) {
    expires 1d;
    access_log off;
 }
```
## 教訓

- モジラで生成したコンフィグを元にやっていましたが、細かいところの設定は見直さないとね。。。

## 参考サイト（多謝）
[https://www.lancard.com](https://www.lancard.com/blog/2014/11/19/nginx%E3%81%AE%E3%83%AA%E3%83%90%E3%83%BC%E3%82%B9%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%84%E3%81%A6location%E3%81%AE%E5%84%AA%E5%85%88%E9%A0%86/
)
[paulownia.hatenablog.com](https://paulownia.hatenablog.com/entry/2018/07/21/140906)
[Nginx公式ドキュメント](http://nginx.org/en/docs/http/ngx_http_core_module.html#location)
正規表現を使って配列をフィルターしてみる

# ループ文の中でifを使う

適当な文字列の配列を用意して、その中から先頭に「-」がついているワードをフィルターしてみる。

```php
$keywords = ['野菜', '-にんじん', '-きゃべつ', 'じゃがいも', 'すいか'];
$keywordFiltered = [];
foreach ($keywords as $i => $keyword) {
    if (!preg_match('/^-.*/', $keyword)) {
        $filtered[] = $keyword;
    }
}
var_dump($keywordFiltered);
```

結果(var_dump)

```plain
array (size=3)
  0 => string '野菜' (length=6)
  1 => string 'じゃがいも' (length=15)
  2 => string 'すいか' (length=9)
```

# array_filterを使う

PHPには[array_filter](http://php.net/manual/ja/function.array-filter.php)という関数があるので使ってみる。

第一引数には配列、第二引数にはコールバック関数を渡す。

コールバック関数は、外出しして関数名を指定してもいいが、無名関数でもいける。

下の場合は無名関数を使用。

```php
$keywords = ['野菜', '-にんじん', '-きゃべつ', 'じゃがいも', 'すいか'];
$keywordFiltered = array_filter($keywords, (function($keyword) {
    return !preg_match('/^-.*/', $keyword);
}));
var_dump($keywordFiltered);
```

結果(var_dump)

```plain
array (size=3)
  0 => string '野菜' (length=6)
  3 => string 'じゃがいも' (length=15)
  4 => string 'すいか' (length=9)
```

関数を外出しするとこんな感じ。

```php
function filterMinusWord(string $keyword):bool
{
    return !preg_match('/^-.*/', $keyword);
}
$keywords = ['野菜', '-にんじん', '-きゃべつ', 'じゃがいも', 'すいか'];
$keywordFiltered = array_filter($keywords, 'filterMinusWord');
var_dump($keywordFiltered);
```

ただこのままだと添字が飛び飛びになってしまっているので、[array_values](http://php.net/manual/ja/function.array-values.php)を使うと、添字の振り直しができる。

# filterした差分の配列を取得する

場合にもよるけど、全体とフィルター後の配列の差分を取りたい場合もあるので、その場合の方法も書いてみる。

そういう場合には、[array_diff](http://php.net/manual/ja/function.array-diff.php)を使う。

array_diffも返ってくる配列の添字が飛び飛びなので、array_valuesで添字の振り直しが必要。

```php
$keywords = ['野菜', '-にんじん', '-きゃべつ', 'じゃがいも', 'すいか'];
function filterMinusWord(string $keyword):bool
{
    return !preg_match('/^-.*/', $keyword);
}
$keywordPlus = array_filter($keywords, 'filterMinusWord');
$keywordMinus = array_diff($keywords, $keywordPlus);
var_dump(array_values($keywordMinus));
```

結果（var_dump）

```plain
array (size=2)
  0 => string '-にんじん' (length=13)
  1 => string '-きゃべつ' (length=13)
```

# 処理速度

配列の要素数を10000にして比較してみた。
array_valuesとか使ってるので、単純な比較ではなくなってるけどやっぱり単なるループの方が早い。

```plain
# ループ文
0.0078341960906982(sec)
# array_filter
0.011768102645874(sec)
```

# 使ってみた感想

なんかこういうときに思考停止してループばっかり書いてるので、たまにはPHPの標準関数も使っていこうじゃないかと思って使ってみました。

多分普通にループ文を使うことになるんですが、調べながらどうなのか検証するって作業は割と楽しかったです。
オブジェクト配列をソートする

# まずは単一条件でソートしてみる

下記は社員を役職でソートする例

```javascript
let classes = ['部長', '課長', '主任', '担当'];
let members = [
    { name: 'すずききよこ', class: '主任' },
    { name: 'たかはししょう子', class: '課長' },
    { name: 'やまだいちろう', class: '担当' },
    { name: 'もとやまひろき', class: '部長' },
    { name: 'うづきかおる', class: '担当' },
    { name: 'あおきもろのぶ', class: '担当' },
    { name: 'かわしたみずき', class: '担当' },
];
let sortedMembers = members.sort(function (x, y) {
    return classes.indexOf(x.class) - classes.indexOf(y.class);;
});
console.log(sortedMembers);
```

結果

```text
0:{name: "もとやまひろき", class: "部長"}
1:{name: "たかはししょう子", class: "課長"}
2:{name: "すずききよこ", class: "主任"}
3:{name: "やまだいちろう", class: "担当"}
4:{name: "うづきかおる", class: "担当"}
5:{name: "あおきもろのぶ", class: "担当"}
6:{name: "かわしたみずき", class: "担当"}
```

役職リストのindexを比較して、indexが若い役職順に並ぶようにした

# 複数条件（役職 + 名前）でソート

役職と社員の配列は変えずに、sortの中に条件を加える

indexOfが何度も実行されるのを避ける為に実行結果は変数`classDiff`に格納する

```javascript
~~省略~~

let sortedMembers = members.sort(function (x, y) {
    let classDiff = classes.indexOf(x.class) - classes.indexOf(y.class);
    // 役職が同じ場合は名前の文字列順でソート
    if (classDiff === 0) {
        return x.name > y.name;
    }
    return classDiff;
});
console.log(sortedMembers);
```

結果

```text
0:{name: "もとやまひろき", class: "部長"}
1:{name: "たかはししょう子", class: "課長"}
2:{name: "すずききよこ", class: "主任"}
3:{name: "あおきもろのぶ", class: "担当"}
4:{name: "うづきかおる", class: "担当"}
5:{name: "かわしたみずき", class: "担当"}
6:{name: "やまだいちろう", class: "担当"}
```

役職 > 名前 の優先順位の複数条件でソートできた
Array.filterが使えないNodeListに対してフィルターをかける方法

# 概要

`document.getElementById`して、`childNodes`プロパティで子要素を取った場合などに返ってくるNodeListはArray-Likeなオブジェクトで`Array.filter`が使えないのでfilterする方法をメモ

filter以外のメソッドを使いたい場合も同じことをすれば大体使えるはず

# 前提

下記の`select`の`option`要素を取ってくる

その際に`select`の`childNodes`で`option`のリストを得ようとすると`option`要素以外も取れてしまうので、`childNodes`で`NodeList`を得た後に、Element以外をfilterする

```html
    <form>
        <label for="food">一番好きな食べ物は？：</label>
        <select id="food">
            <option value="ラーメン">ラーメン</option>
            <option value="餃子">餃子</option>
            <option value="焼き肉">焼き肉</option>
        </select>
        <button type="button" id="btnRegister">決定</button>
    </form>
```
# 方法1:Array.prototype.filter.callを使う

Array-Likeなオブジェクトに対して、Arrayのfilter等のメソッドを使いたい場合、`call`メソッドが使えるらしい

`Array.prototype.*.call`という風に使う

```javascript
let select = document.getElementById('food');
let children = select.childNodes;
let selectedOptions = Array.prototype.filter.call(children, node => { return node.nodeType === Node.ELEMENT_NODE; });
console.log(selectedOptions);
```

# ところでcallって何？

`call`で呼べば、Arrayで使えるメソッドが使えるのはわかったけどそもそも`call`って何だよっていうお話

>あるオブジェクトに属するメソッドを別のオブジェクトのメソッドのように呼び出したい (すなわち、メソッド中の this キーワードの参照先オブジェクトを別のオブジェクトにしたい) とき、call メソッドを使えば、わざわざ別のオブジェクトのプロパティにそのメソッドを代入せずとも済みます。 例えば、obj.testMethod というメソッドを otherObj のメソッドのように呼び出したいときは、obj.testMethod.call( otherObj ) とすればよいです。

参照：https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Function/call

そのまんまの意味であるオブジェクトで使いたいメソッドがあった時に、いちいちそのオブジェクトにメソッドを用意するの怠いよね？

怠いから代入せずとも使えるようにメソッド用意しといてやったぞ有り難く使え！ってことらしい

有り難や〜

# 方法2:Array.from(object).filterを使う

さっきと何が違うのかというとまず`Array.from`で`object`を配列に変換してるところが違う

配列に変換された後だったら`filter`メソッドあるから普通に使えるよねというお話

```javascript
let selectedOptions2 = Array.from(children).filter( node => { return node.nodeType === Node.ELEMENT_NODE; });
console.log(selectedOptions2);
```

# 方法3:firstElementChildとnextElementSiblingとwhileを併用

`firstElementChild`で最初のElement要素を取ってこられる

次の要素は`nextElementSibling`で取ってくる

次の要素がない場合は`nextElementSibling`には`null`が入ってるのでwhileは終わる

かなり記述が冗長になってしまうし、使う意味を感じないので使わなさそう

```javascript
let select = document.getElementById('food');
let child = select.firstElementChild;
let children = [];
while (child) {
		if (child.nodeType === Node.ELEMENT_NODE) {
				children.push(child);
		}
		child = child.nextElementSibling;
}
console.log(children);
```

# 結局どれを使うのか

速度比較をしてくれている記事を発見したので下記参照

[JSのArray.prototype.filter.callとArray.from().filterどっちが早いか](https://qiita.com/apollo_program/items/60f987205f805d7beb8e)

`Array.prototype.filter.call`でいいかなという結論でお願いします
Visual Studio Code + VSCodeVim での単語カーソル移動(w, b, e)の簡易日本語対応

VSCodeの拡張機能[VSCodeVim](https://github.com/VSCodeVim/Vim)にて，`w`, `b`, `e`にて単語レベルでカーソル移動をしたい場合の設定についてメモ

## 結論
VSCodeの`setting.json`にて以下を追記する．

```json:setting.json
{
  ...
  "vim.iskeyword": "/\\()\"':,.;<>~!@#$%^&*|+=[]{}`?-、。「」【】『』（）！？　てにをはがのともへでや",
  ...
}
```

- `、。「」【】『』（）！？　てにをはがのともへでや`が追記部分，それ以前はデフォルト
- 上記に登録した文字を単語の区切り文字と認識してカーソル移動するため，当然形態素解析したような正確さはない
- 必要に応じて区切り文字の増減要

#### 2019/01/14 追記
上記の代わりに下記を追記しても有効です．違いは備考参照．
(@kazuma1989 さんにコメントでご指摘いただきました，ありがとうございます！）

```json:setting.json
{
  ...
  "editor.wordSeparators": "/\\()\"':,.;<>~!@#$%^&*|+=[]{}`?-、。「」【】『』（）！？　てにをはがのともへでや",
  ...
}
```

## 備考
- VSCodeでVSCodeVimを用いない場合の単語移動Ctrl+Right/Left(Option+Right/Left)も，デフォルトでは日本語対応していない
- Ctrl+Right/Left(Option+Right/Left)は下記のいずれかで実現可能 (参考：[Visual Studio Code の日本語問題まとめ](https://qiita.com/EbXpJ6bp/items/e6a0ed52bdcb60bfd145))
    - [Japanese Word Handler](https://marketplace.visualstudio.com/items?itemName=sgryjp.japanese-word-handler)の導入
    - `editor.wordSeparators` に `、。「」【】『』（）！？　てにをはがのともへでや` あたりを追加

**2019/01/14 追記**

- ~~ただし上記設定はVSCodeVimのカーソル移動には反映されない~~
- `vim.iskeyword`を明示しない場合，`editor.wordSeparators`が参照されるようになったようです
   - よって，`editor.wordSeparators`か`vim.iskeyword`のいずれかを設定すればOK
   - 通常カーソル移動とVSCodeVimのカーソル移動を特に分ける必要が無い場合は`editor.wordSeparators`に記述した方が良さそうです (`editor.wordSeparators`と`vim.iskeyword`の両方に書くと二重管理になるので）
   - VSCodeVimだけで使いたいなら`vim.iskeyword`に書く感じ

**追記ここまで**

- 通常のVimの単語判定は`iskeyword`の値に設定されており，VSCocdVimでも`vim.iskeyword`にて設定可能
- そこで，`vim.iskeywork`に上記`editor.wordSeparators`への対策と同様の修正を加えることで，VSCodeVimでの単語移動を日本語対応させることが可能
リーダブルじゃないコードをリーダブルに変えよう！

# 三項演算子
自分なりに考察してみた結果、こういう書き方が分かりやすいかも知れないと思うに至りました。

~~~javascript
a
? b
: c
~~~

これなら、多段記述になった場合でも…

~~~javascript
a
? b
  ? c
  : d
: e
  ? f
  : g
~~~

読む時は箇条書きのようにインデントが下がるので楽かも知れません。

更におまけですが、

~~~javascript
(
  a
  ? b
  : c
)
.method()
~~~~
という呼び方、出来ます（笑）

# メソッドチェーン
インデント下げる派の人、多すぎです（笑）

~~~javascript
a
.b()
.c()
~~~

これでどうしても読みづらい時は、

~~~javascript
(
  a
  .b()
  .c()
)
~~~

更におまけ

~~~javascript
const e = (
  a
  .b()
  .c()
) + d
~~~

つまり…
### 丸括弧　（パーレン）超便利！

あくまで参考程度にどうぞ…
pomera DM200のLinuxでグラフィカルログイン

#概要
pomera DM200にインストールしたLinuxでグラフィカルログインするためのメモ

#インストール
lightdmをインストールします。

```bash
$sudo apt install lightdm
```

これだけで自動的にグラフィカルログインするようになるのですが、
そのままだとメニュー等の表示が英語になり、日本語入力ができないという状態になってしまうので、設定をする必要があります。

#日本語設定
日本語関係がうまく行かない原因はいままでstartx(xinit)する際に読み込まれていた.xinitrcをlightdmは読まないからです。
~~ググった感じでは.xprofileを使うようにとされているですが、~~なぜかIM関係の環境変数をここに記述してもうまくいきません。
結論から言うと、/etc/environmentに記述するとうまく行きます。

```bash:/etc/environment
export LANG=ja_JP.UTF-8
export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus
```

~~ただ、ibus起動コマンドは記述しても反映されないので
こちらはウインドウマネージャーの自動起動設定で自動起動するようにしておきます。~~

#.xsession
グラフィカルログインのときは.xinitrcの代わりに.xsessionに記述するそうです、
ただ.xinitrcと違い、.xsessionには必ず実行属性をつける必要があり忘れると面倒なことになるようですので気をつけましょう。
Redmine導入備忘録 in CentOS7.5 in VirtualBox

#あらすじ
webアプリや個人活動を管理するため、Redmineを導入しました。
いつでも環境を作れるように手順を残しておきます。

記事を書く前に何回か環境を作ってテストしているので、
冪等性はある程度担保しているつもりです。

#環境
- ホスト
 - macOS High sierra 10.13.6
 - VirtualBox 5.2.18
- ゲスト
 - CentOS 7.5 Minimal

#手順

##VirtualBoxの設定
メモリ：1024MB
VDI容量:可変 20GB
ネットワーク：ブリッジアダプタ
※上記以外は初期値のまま


##CentOS7.5のインストール
Redmine専用の環境を作ります。
不要なものは極力入れたくないので、Minimal版をインストールします。
今回使ったISOファイルは「**CentOS-7-x86_64-Minimal-1804.iso**」

##ネットワーク接続設定
```
nmcli d ⇒このコマンドでネットワーク名を取得する 例:enp0s3
nmcli c m enp0s3 connection.autoconnect yes 
systemctl restart network
```

##Redmineのインストール

RedmineJPの
[CentOS用 Redmine自動インストール用Ansible playbook](https://github.com/farend/redmine-centos-ansible)
のとおりに作業してください。

手順書にはCentOS7.3構成と書いてますが、CentOS7.5でも動作します。

##インストール後にやること
Ansibleでの作業が終わった後にうまくいかないことがあります。
原因はSELinuxを無効にしてはいるが再起動していないため。

``` Reboot ``` コマンドで再起動します。
``` getenforce ``` コマンドでDisabledになっていれば大丈夫です。

##IPアドレスの確認
ホストに移る前にIPアドレスを確認します。

```
ip a
```
「192.168.＊.＊」 というアドレスがなければ、
VirtualBoxのネットワーク設定を見直してください。
NATになっていたら接続できません。

##ログイン
IPアドレスをホスト側で入力し、ログインできるか確認します。

例：http://192.168.＊.＊/redmine

最初はadminでログインします。（パスワードはユーザ名と同じ）
そのあとadminのパスワードを変更します。

<br>
ここまで出来たら導入は完了です

#完走した感想
タスク管理めんどくさいなぁなんて思ってましたが、
導入してみたらなんかやる気が出てきました。
管理しやすいですね～（小並感）。
~~やっぱExcelでタスク管理してるような現場は糞糞アン糞~~
<br>
以上
#参考
[Redmine](http://redmine.jp/install/)
[CentOS用 Redmine自動インストール用Ansible playbook](https://github.com/farend/redmine-centos-ansible)
[Redmine 3.4をCentOS 7.3にインストールする手順](http://blog.redmine.jp/articles/3_4/install/centos/)
[今更ながらRedmineでチームのタスク管理した時の話（＋これからのタスク管理）](https://qiita.com/nh321/items/c84807142227fb91d831)
なぜtransform.position.xが直接編集できないか

https://teratail.com/questions/53956
この記事が一番まとまってると感じました。

まず大前提として、
transform.positionが、vector3型で実装されていて、vector3型はオブジェクトでなく構造体であり、
構造体は値型である、というのがあります。

詳細のコードは明らかにされてはいないのですが、
transform classの中で、positionはフィールド(すなわちメンバ変数として)に定義されているわけではなく、プロパティとして実装されている。(と挙動から推測できる)

public vector3 position { get; set; }

＝＝＝

そしてそれが何を引き起こすかというと、

go.transform.position.x = 10;
は、
go.transform.position().xというようにコンパイラーに解釈され、
この場合、構造体、つまり値型の特徴から、
Vector3 anotherVec = go.transform.position;
anotherVec.x = 1;
ということをしようとしてしまいます。

これは全く関係ないVector3を生み出し、そこに値を代入し、それをほったらかしにするという、
空虚極まりない行為なので、それはC#側でエラーにしようよということで、エラーを出す仕様になったとさ。
環境ごとにFirebaseプロジェクトを使い分ける方法

#初めに
Firebaseを利用して開発を行う際に、開発環境と本番環境とでそれぞれ接続するFirebaseプロジェクトを変えて開発したい際にどうやって実現するかを書いてみました。

# 実現方法のアプローチ
・Schemeごと(開発、本番)に異なるBuildConfigurationを設定。
・設定したBuild Configurationを元に読み込むGoogleService.plistを決定。

#Schemeごと(開発、本番)に異なるBuildConfigurationを設定
[こちらの記事でまとまっていたのでリンクを貼っておきます](https://dev.classmethod.jp/smartphone/iphone/xcode-build-environment-adding-scheme/)

# 設定したBuildConfigurationを元に読み込むGoogleService.plistを決定

## 環境に対するGoogleService.plistの命名
prodとDevのGoogleService.plistの命名は例として以下の内容になります。

| 環境   |  GoogleService.plist |
|:-----------------|------------------:|
| Prod            | GoogleService-prod.plist        |
| Dev           |GoogleService-dev.plist |

## Schemeに設定したBuildConfigurationで使用するGoogleService.plistを決める
```swift:Config.swift
import Foundation
import UIKit

struct Config {
    private init() {}

    struct Firebase {
        static func resourceFilePath() -> String {
            #if Prod
                return Bundle.main.path(forResource: "GoogleService-prod.plist", ofType: "plist")!
            #else
                return Bundle.main.path(forResource: "GoogleService-dev.plist", ofType: "plist")!
            #endif
        }
    }
}  
```

## FirebaseApp.configure()で環境に合わせて設定
```swift:AppDelegate.swift
import UIKit
import Firebase

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        let options: FirebaseOptions = FirebaseOptions(contentsOfFile: Config.Firebase.resourceFilePath())!
        FirebaseApp.configure(options: options)
    }
```

#参考
[FirebaseDocument/複数のプロジェクトを構成する](https://firebase.google.com/docs/configure/?hl=ja)
データサイエンティストになりたいなら、ロジスティック回帰を最初に学ぶべき5つの理由

本投稿は、海外の投稿記事の翻訳・要約になります。
[5 Reasons Logistic Regression should be the first thing you learn when becoming a Data Scientist](
https://www.kdnuggets.com/2018/05/5-reasons-logistic-regression-first-data-scientist.html)

# はじめに
本記事の筆者は数年前に、データサイエンスの世界の自学を開始。当時ソフトウェアエンジニアであり、最初にオンラインで学び始めた。
オンラインで検索すると、線形回帰、SVM、決定木、ランダムフォレスト、ニューラルネットワークなどの学習アルゴリズムの名前しか見ていなかった。どこから始めるべきかを理解することは非常に困難だったことを覚えている。

データサイエンティストになるために学ぶ最も重要なことは**パイプライン、つまりデータの取得と処理、データの理解、モデルの構築、結果の評価（モデルとデータ処理の両方のフェーズ）とデプロイ）**であると考えている。ロジスティック回帰を最初に知って、**パイプラインに精通し、派手なアルゴリズムに圧倒されないようにすべき**。

ロジスティック回帰から始めてデータサイエンティストになるべきと考える理由が5つある。これはもちろん筆者の意見であり、他の人にとっては、別のやり方でやる方が簡単かもしれない。

# 理由1. 学習アルゴリズムはパイプラインの一部にすぎないため
データサイエンスの仕事は単なるモデル構築ではない。これには次のステップが含まれる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/7d8bbbbb-9e32-5e7c-184d-6c2a9e8a3ae3.png)

「モデリング（Modeling）」は、この繰返しプロセスの一部。
データプロダクトを構築するときは、パイプライン全体を最初に構築し、できるだけシンプルにし、何を達成しようとしているのか、どのように自分自身を測定できるのか、そしてベースラインが何であるかを理解する必要がある。その後に、魅力的な機械学習を行い、より良くなっているかどうかを知ることができる。

なお、ロジスティック回帰（または任意のMLアルゴリズム）は、「モデリング」の部分だけでなく、「データの理解」と「データの準備」でも使用できる。

# 理由2. 機械学習についてより理解できる
この記事のタイトルを読むとき、「ロジスティック」であり、 「線形」回帰ではないの？と恐らく尋ねる。重要な真実は、それは重要ではない、問題ではないということ。
この質問からは、分類（ロジスティック回帰）と回帰（線形回帰）の2種類の教師あり学習があるという気づきが得られる。
ロジスティック回帰または線形回帰を使用してパイプラインを構築すると、機械学習の概念のほとんどを理解しやすくなる。

* 教師付き学習、教師なし学習、分類vs回帰、線形vs非線形問題など多くの概念がある。
* データの準備方法、インプットや特徴量選択などの課題、モデルの測定方法、精度、Precision－Recall、ROCとAUC、平均二乗誤差やピアソンの相関係数などを使用する必要がある。
これらすべての概念は、データサイエンスのプロセスにおいて最も重要な部分である。あなたがそれらに精通した後は、単純なモデルをあなたがマスターしたもっと複雑なアルゴリズムに置き換えることができる。

# 理由3. 「ロジスティック回帰」が（時には）十分であるため
ロジスティック回帰は非常に強力なアルゴリズムであり、非常に複雑な問題であっても良い仕事をするでしょう。
例えば、MNISTを考える。 ロジスティック回帰のみを使用して95％の精度を達成することができるが、それは素晴らしい結果ではない。でも、パイプラインが機能するかを確認する上では十分である。

# 理由4. 統計学上の重要なツールの1つである
線形回帰は、予測だけに利用できるわけではない。
フィットした線形回帰モデルを使用すると、説明変数（特徴量）と目的変数間の関係性を知ることができる。

EX）住宅価格の予測。線形回帰モデルに適合し、良い結果が得られる場合がある。モデルが各説明変数について学習した実際の重みをしることで、それらが有意であればその特徴が他の特徴よりも重要であると判断できる。
線形回帰は、データからの関係を学ぶための強力なツールであり、統計家はそれを非常に頻繁に使用します。

# 理由5. ニューラルネットワークを学ぶ最初のスタートになる。

ニューラルネットワークを学ぶ際に、ロジスティック回帰の学びは非常に役に立った。

* ネットワーク内の各ニューロンをロジスティック回帰と考えることができる。
* インプット、重み、バイアス、次に非線形関数を適用する。
* ニューラルネットワークの最後のレイヤは、多くの場合で単純な線形（もしくはロジスティック）モデルを利用している。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/188414/3b878286-6e24-7308-e663-0719317de934.png)

# Conclusion
一見すると、学習アルゴリズムが最も重要な部分であるかのように見える。
実際のところ、学習アルゴリズムはほとんどの場合非常に複雑で、理解するために多くの時間と労力が必要。でもデータサイエンスのパイプラインのほんの一部です。
【Rails】5.2.1インストールメモ(Ubuntu)

#環境
Ubuntu 16.04.2 
32bit

#前提条件
- RubyGemsがインストール済みであること
- Ruby1.9移行では、標準でインストール済みです。Rubyのインストール方法については、[【Ruby】2.5.1インストールメモ(Ubuntu)]を参照してください。https://qiita.com//yut-nagase/items/468f848be586265f585
- RubyGemsがインストール済みかどうかの判定は以下のコマンドで確認してください。

```
gem env
```

- RubyGemsがインストール済みの場合、以下の様にRubyGemsのバージョンが表示されるはずです。

```
  - RUBYGEMS VERSION: 2.7.6
```

#Railsのインストール
- ここでは、2018/09/25時点の最新バージョンのRails5.2.1をインストールしました。
- では、以下のコマンドを実行します。
	- ちなみに、gemコマンドはRubyGems（Ruby言語用のパッケージ管理システム）のコマンドです。ここでは、gemコマンドを使用して、Railsをインストールしようとしています。

```
sudo gem install rails
```

- エラーが発生してしまいました！

```
(中略)
Building native extensions.  This could take a while...
ERROR:  Error installing rails:
	ERROR: Failed to build gem native extension.

    current directory: /var/lib/gems/2.3.0/gems/nokogiri-1.8.4/ext/nokogiri
/usr/bin/ruby2.3 -r ./siteconf20180925-27256-18eqs4.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /var/lib/gems/2.3.0/gems/nokogiri-1.8.4 for inspection.
Results logged to /var/lib/gems/2.3.0/extensions/x86_64-linux/2.3.0/nokogiri-1.8.4/gem_make.out
```

> mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

- 上記のエラーメッセージを読むと、どうも、rubyのヘッダーファイル(ruby.h)が見つからない為、インストールに失敗してしまっているようです。
- rubyのヘッダーファイル(ruby.h)は、現環境のUbuntuでは、ruby-dev に含まれているようなので、インストールしてあげます。

```
sudo apt-get install ruby-dev
```

- 改めて、railsのインストールを試みます。

```
sudo gem install rails
```

- railsのインストールが終了したので、確認の為、以下のコマンドを実行します。

```
rails -v
```

- 無事にインストールできたようです。

`Rails 5.2.1`
Python3でAt CoderのTypical DP Contestに挑戦してみる（その２　Bゲーム）

引き続き挑戦。またしても以下のサイトにお世話になりました。ありがとうございます。
[クリエイティヴなヴログ](http://www.creativ.xyz/tdpc-b-684)

今回と前回で2度もお世話になった上記のブログですが，TDPCのC問題については記事がないようなので，次からは自力でやらないといけないかもしれません。頑張ります。

今のところ，クリエイティヴなヴログさんのC++（ですか？）のソースをpythonで書き直しただけなので，自力解決できるようにしたいです。

```python:
#入力を受け取る

#数列a,bの要素数
A, B = input().split()
A = int(A)
B = int(B)

#数列a,bの具体的な値
a = list(map(int, input().split()))
b = list(map(int, input().split()))

#各局面における先攻のスコアをリストdpに格納する(0で初期化))
dp = [[0 for i in range(B+1)] for j in range(A+1)]

for i in reversed(range(0,A+1)):
    for j in reversed(range(0,B+1)):
        
        if i + j == A + B:
            continue
        
        #先攻のときは，2通りあるうちのよりスコアが大きくなるほうへ行動
        if (i+j)%2 == 0:
            if i == A:#Bの山からしか取れないとき
                dp[i][j] = b[j]+dp[i][j+1]
            elif j == B:#Aの山からしか取れないとき
                dp[i][j] = a[i]+dp[i+1][j]
            else:
                dp[i][j] = max(a[i]+dp[i+1][j], b[j]+dp[i][j+1])

        #後攻のときは，先攻のスコアが小さくなるように行動する
        else:
            if i == A:#Bの山からしか取れないとき
                dp[i][j] = dp[i][j+1]
            elif j == B:#Aの山からしか取れないとき
                dp[i][j] = dp[i+1][j]
            else:
                dp[i][j] = min(dp[i+1][j], dp[i][j+1])

print(dp[0][0])
```
UE4を学びながら私が躓いたところ・感じたことについてのメモ

#始めに
私がUE4のブループリントを学びながら感じたことや、躓いたことをまとめていこうという記事です。
勉強する度に追記していきます。

##ArrayのGETについて
ArrayのGETは”GET(a copy)”と "GET(a ref)"の2種類になっているが、これは「値渡し」か「参照渡し」の差。もし分からなければ、値渡しの"GET(a copy)"を選ぶのが無難。

##ピッチ、ヨー、ロールについて
ピッチ (上下動)、ヨー (左右回転)、ロール (進行軸回転)

##Cameraのプレビューサイズについて
http://massa8080.hatenablog.com/entry/2018/01/06/114637

##他のプロジェクトからアセットを移動させる方法
http://historia.co.jp/archives/275/

##UE4 Default PawnとSpectator Pawnについて（起動時の操作対象など）
http://unrealengine.hatenablog.com/entry/2016/04/24/235447

##NavMesh系
pdfに色々まとまっている
https://drive.google.com/file/d/1oJRUrBMw_72_qCwYnJB_14hCFHPBTOdC/view

##移動（MoveTo）系
http://unrealengine.hatenablog.com/entry/2017/06/14/005914
AWS FargateでRubyを実行してiOSアプリの証明書とかの有効期限をSlackに通知する

[AWS LambdaでRubyを実行してiOSアプリの証明書とかの有効期限をSlackに通知する](https://qiita.com/mii-chan/items/3a9d9f45b2c370372d45) を利用してmobileprovisionやcertの有効期限を定期的にSlackに投稿していたのですが、先日何故か動かなくなりました。

修正ついでに先日AWS Fargateがスケジュール実行をサポートされたので、そっちに移行する事にしました。

# TL;TR
アプリ入れた[Dockerイメージ](https://hub.docker.com/r/rplusplus/ios-cer-profile-expiration-date-checker/)公開したので、それ使ってFargateで実行すれば通知してくれます。

# Lambda版からの変更点
## nodeを削除してrubyのみへ

Lambda版ではNode側でAppleDeveloperPortalのID/PassとSlackのWEBHOOKURLをKMSで復号していました。Dockerコンテナにrubyとnodeの両方のランタイムを入れると無駄にサイズが大きくなるので、ruby側に寄せました。

## ruby, fastlaneを最新へ

TravelingRubyやLambdaのサイズ制約がなくなりましたので、存分に最新版を使えます。

## CloudFormation

今回のアプリが入ったDockerイメージはdockerhubで公開しているので、Fargate側で指定して実行するだけで動かせます。動かすためのIAM Role, ECSのタスク定義, ECSのクラスタまでを作成するymlを書きました。

CloudFormationにはスケジュール実行のリソースもあるのですが、実行するVPC情報が必要で不特定多数向けに正常動作するように書くのは面倒だったので省きました。
かわりに作成時のスクショを置いておきます。

### スケジュール実行の定義
名前は適当につけましょう。 `cron(0 1 1 * ? *)` で毎月1日の10時JSTに実行されます。
<img width="659" alt="スクリーンショット 2018-10-07 11.08.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/1295/112f1e41-8810-f0a7-065c-982453d67383.png">

起動タイプはFARGATE、作成したタスク定義を指定します
<img width="632" alt="スクリーンショット 2018-10-07 11.09.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/1295/9275bd3e-7c94-5f9a-d886-c762bd416655.png">

コンテナの上書きの箇所で環境変数を変更します。`ID`, `PASS`, `WEBHOOKURL`
にはKMSで暗号化したものを入れます。
<img width="658" alt="スクリーンショット 2018-10-07 11.10.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/1295/6fadcab2-ce29-a6e7-966a-27db4da30a0a.png">

これで毎月1日に有効期限がSlackに通知されます！

## ところで

アプリ側のコード変えてないのですが、Fargateでちゃんと動いています。なんでLambda版は失敗しだしたんでしょうかねぇ。。たぶんApple側の変更で古めのfastlaneだとうまく取得できていなかった・・・とかでしょうか。

## Repo

Source: https://github.com/hands-lab/ios-cer-profile-expiration-date-checker
DockerImage: https://hub.docker.com/r/rplusplus/ios-cer-profile-expiration-date-checker/
Ruby で Password 自動生成プログラム

# Ruby で Password 自動生成プログラム

Rubyでパスワードを自動生成するプログラムを作ります。
下記がソースコードですが、
適宜、数字・記号などパスワードから外したい文字はコメントアウトしてください。

```ruby:create_password.rb
print "Please input length of password you want! "
pass_size = gets.to_i
a = ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a + ['~','!','@','#','$','%','^','&','*','(',')','-','+']
pass = Array.new(pass_size){a[rand(a.size)]}.join
puts pass
```
これを実行すると、

>$ ruby create_password.rb
>Please input password length you want! 

となります。
ためしに32とか打つと、下記の通りに出力されます。
>Please input length of password you want! 32
>6E6tjZFl*ZslLgl!lcCTEViqK$%t9u^7

このパスを忘れないよう、次はどこかにメモするプログラムを作る予定です。

##【追記】ソースコードの一部短略化
@kts_h さんにご指摘頂きました。
>a = ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a + ['~','!','@','#','$','%','^','&','*','(',')','-','+']

上記コードは以下のように短略化することができます。
>a = [\*('a'..'z'),\*('A'..'Z'),\*('0'..'9'),'~','!','@','#','$','%','^','&','*','(',')','-','+']
乱立するKubernetesエンジン XKE（XKS）の一覧

Kubernetesを管理するサービスとして、有名なところは GKE（Google Kubernetes Engine） がまず挙げられます。しかし、世には他にも多くの X Kubernetes Engine（または X Kubernetes Service）が出てくるようになりました。この記事では、2018年10月時点で私が知る限りのものをリストアップしています。おそらく、これからも新たなXKE（XKS）は世に出てくることでしょう。

## 抽出条件

- Kubernetesが関連するもの
- 略称が XKE（XKS） となっているもの

## XKE（XKS）の一覧

|略称　|正式名称|説明|
|---|---|---|
|AKE|[Adtech Container Engine](https://developers.cyberagent.co.jp/blog/archives/12058/)|CyberAgent グループ内部向けのOpenStackベースの独自基盤|
|AKS|[Azure Kubernetes Service](https://azure.microsoft.com/ja-jp/services/kubernetes-service/)|Microsoft社Azureのクラウドサービスの一つ|
|CKE|[Cybozu Kubernetes Engine](https://github.com/cybozu-go/cke)|サイボウズ社開発のKubernetes管理OSS|
|EKS|[Amazon Elastic Container Service for Kubernetes](https://aws.amazon.com/jp/eks/)|Amazon社AWSのクラウドサービスの一つ|
|GKE|[Google Kubernetes Engine](https://cloud.google.com/kubernetes-engine/)|Google社GCPのクラウドサービスの一つ|
|IKE|[IIJ Container Engine for　Kubernetes](https://www.iij.ad.jp/dev/report/iir/pdf/iir_vol40_focus2.pdf)|IIJ社の社内向けの独自基盤|
|NKE|[NetApp Kubernetes Service](https://cloud.netapp.com/kubernetes-service)|NetApp社のマネージドKubernetesサービス|
|OKE|[Oracle Container Engine for Kubernetes](https://cloud.oracle.com/containers/kubernetes-engine)|Oracle社Oralce Cloudのクラウドサービスの一つ|
|PKS|[Pivotal Container Service](https://pivotal.io/jp/platform/pivotal-container-service)|Pivota社Pivotal Cloud FoundryのKubernetes管理製品|
|RKE|[Rancher Kubernetes Engine](https://github.com/rancher/rke)|Rancher社が開発しているRancher内部のKubernetes管理OSS|
|SKE|[Suranaree Kubernetes Engine](https://github.com/chanwit/ske)|詳細は不明だがスラナリー工科大学（タイ）が開発しているRKEベースのOSS|
|VKE|[VMware Kubernetes Engine ](https://cloud.vmware.com/vmware-kubernetes-engine)|VMWare社のマネージドKubernetesサービス|

アルファベットがすべて埋まるのも時間の問題ですね！
ずんだの1桁足し算問題 JavaScript編

[てぃーびー](https://qiita.com/tbpgr)さんの[ずんだの1桁足し算問題](https://qiita.com/tbpgr/items/6c75930566dda97bb5b6)をJavaScriptで実装しました。


```javascript
for (let i = 1; i <= 9; i++) {
  for (let j = 1; j <= 9; j++) {
    const total = i + j;
    console.log(`${i}+${j}=${'~'.repeat(total)}${total}`);
  }
}
```

**※追記**
コメントにて @hogefuga さんより、ワンライナーと `'~'.repeat(total)` での `~` 埋めの方法を教えていただきました。
`'~'.repeat(total)` に変更する前は `''.padEnd(total, '~')` で `~` 埋めをしていました。

## 出力
```
1+1=~~2
1+2=~~~3
1+3=~~~~4
1+4=~~~~~5
1+5=~~~~~~6
1+6=~~~~~~~7
1+7=~~~~~~~~8
1+8=~~~~~~~~~9
1+9=~~~~~~~~~~10
2+1=~~~3
2+2=~~~~4
2+3=~~~~~5
2+4=~~~~~~6
2+5=~~~~~~~7
2+6=~~~~~~~~8
2+7=~~~~~~~~~9
2+8=~~~~~~~~~~10
2+9=~~~~~~~~~~~11
3+1=~~~~4
3+2=~~~~~5
3+3=~~~~~~6
3+4=~~~~~~~7
3+5=~~~~~~~~8
3+6=~~~~~~~~~9
3+7=~~~~~~~~~~10
3+8=~~~~~~~~~~~11
3+9=~~~~~~~~~~~~12
4+1=~~~~~5
4+2=~~~~~~6
4+3=~~~~~~~7
4+4=~~~~~~~~8
4+5=~~~~~~~~~9
4+6=~~~~~~~~~~10
4+7=~~~~~~~~~~~11
4+8=~~~~~~~~~~~~12
4+9=~~~~~~~~~~~~~13
5+1=~~~~~~6
5+2=~~~~~~~7
5+3=~~~~~~~~8
5+4=~~~~~~~~~9
5+5=~~~~~~~~~~10
5+6=~~~~~~~~~~~11
5+7=~~~~~~~~~~~~12
5+8=~~~~~~~~~~~~~13
5+9=~~~~~~~~~~~~~~14
6+1=~~~~~~~7
6+2=~~~~~~~~8
6+3=~~~~~~~~~9
6+4=~~~~~~~~~~10
6+5=~~~~~~~~~~~11
6+6=~~~~~~~~~~~~12
6+7=~~~~~~~~~~~~~13
6+8=~~~~~~~~~~~~~~14
6+9=~~~~~~~~~~~~~~~15
7+1=~~~~~~~~8
7+2=~~~~~~~~~9
7+3=~~~~~~~~~~10
7+4=~~~~~~~~~~~11
7+5=~~~~~~~~~~~~12
7+6=~~~~~~~~~~~~~13
7+7=~~~~~~~~~~~~~~14
7+8=~~~~~~~~~~~~~~~15
7+9=~~~~~~~~~~~~~~~~16
8+1=~~~~~~~~~9
8+2=~~~~~~~~~~10
8+3=~~~~~~~~~~~11
8+4=~~~~~~~~~~~~12
8+5=~~~~~~~~~~~~~13
8+6=~~~~~~~~~~~~~~14
8+7=~~~~~~~~~~~~~~~15
8+8=~~~~~~~~~~~~~~~~16
8+9=~~~~~~~~~~~~~~~~~17
9+1=~~~~~~~~~~10
9+2=~~~~~~~~~~~11
9+3=~~~~~~~~~~~~12
9+4=~~~~~~~~~~~~~13
9+5=~~~~~~~~~~~~~~14
9+6=~~~~~~~~~~~~~~~15
9+7=~~~~~~~~~~~~~~~~16
9+8=~~~~~~~~~~~~~~~~~17
9+9=~~~~~~~~~~~~~~~~~~18
```
OpenCVやDlibの使い方で失敗した諸点 

OpenCVやDlibを使ってみて、人の顔の動画を処理することをやっています。

ここでは、これまでに失敗した点を、いくつか残しておきます。Qiitaをはじめ、画像処理関係でいろいろ検索すると、OpenCVのこれこれが使えるよという投稿が多いです。が、実際に使い込んでみたら結局使えなかったという情報も、役立つと思うので。

+ 顔の特徴点を得るのに、DlibのLandmark68が有名ですが、これは顔の上半分が全然使えません。DlibのLandmarkは、西洋人のデータでTrainingされていて、東洋人の目周辺のLandmarkの質が低いです(2018.10.30更新->東洋人のデータも使ってTrainingするかとDlibの作者のDavid　Kingが書いてました、そのうち解決される）。また、眼鏡をかけていると、目と眼鏡をよく取り違える。目回りのFeature　Point検出は、自力で書くか、自分でDlibでTrainingしなおすかです。ちなみに、OpenCVのHaarカスケードの目検出は精度が高く枠が安定してとれますが、点はわからない。

+ DlibのLandmarkは、フレームごとに揺れます。安定した位置を得たいときは、Kalmanフィルターを通すなどの工夫が必要です。特徴点を中心としたTracking Boxを使う方法でもいいのですが、Tracking Boxは遅い。スカラー値のKalmanフィルターは高速です。[【揺れる値をおとなしくさせるには、カルマンフィルターが便利で高速】](https://qiita.com/satoyoshiharu/items/07d01d10759b29aa8f0b)に、スカラー値のカルマンフィルターのコードを載せておきます。

+ 顔向きを得る方法の紹介が何個も出ています。顔のLandmarkから、SolvePnPRansacなどで、顔座標系とカメラの座標系とのTranslation/Rotation関係であるFacePoseが得られます。ここで、FacePoseの計算には、顔3Dモデルが必要です。しかし、公開されている顔モデルのSampleはそのままでは使い物になりません。FacePoseはピクセル単位の計算であるため、人の顔モデルが実際の被写体のそれと数ピクセルでも異なれば、大きな狂いが生じたり、FacePose方向ベクトルが激しく揺れます。まず、被写体の顔の3Dモデルの獲得が前提です。そこをクリアしないと、FacePoseは活用できません。[【顔モデルの取得の処理概要をここに残しておきます。】](https://qiita.com/satoyoshiharu/items/39953500f3605b94f070)

+ OpenCVのCannyやHoughCircle等が物体のEdge形状の検出に使えるという記事が山ほどあります。が、これらは人工物にあるような幾何的な形状だと機能しますが、人の顔のパーツなど自然の物体には、使いものになりません。自分は、これらが何とか使えないか、試行錯誤にずいぶん時間を浪費してしまった。みなさんは、時間を節約してください。

+ 光の条件に左右されない画像処理という検索で、引っかかるのはEdgeを使え系が多いです。また引っかかるものはAcademic　Paperが多く、現場の実用的な場面ではどういう工夫をしているのかわかりません。きっと、高価な光学センサーを使うとかしてしまうのでしょうか。安価なカメラでやりたいとき、光の条件に左右されにくいように、grayに対して、OpenCVで身近にあるcv2.equalizeHistしてから、EdgeをとるとかBinarizeするとかしたくなります。が、これらはあまりうまくいきません。まず、cv2.equalizeHistはGradientを壊します。そのため、画像が汚くなります。また、光の条件の影響をもろに受けるBinarizeでなく、Edgeで攻めようとしても、結局Edgeも明暗環境に多分に左右され、結果が安定しません。しかし、ヒストグラムをstretchし（Intensityのmin/maxを0と255に広げるように変換する）Blurすると、全体的な明暗に関係なく、きれいな画像が得られます。そのあとでEdgeやGradientをとるのがいいです。min、maxを適当に設定しなおしたり、Intensityの変換式のところでSQRTを3回かければ暗いほうがより詳細化されますし、POW3回かければ明るい方がと、Damageを小さくしていろいろ加工できます。[【暗い画像を鮮明にするStretch】](https://qiita.com/satoyoshiharu/items/d33c4f6b2c80c87e0074)に、コードを置いておきます。
Macにgoogle-cloud-sdk（gcloudコマンド）をインストール


# 概要
手元のMacBook Pro（High Sierra）にgoogle-cloud-sdkをインストールする。
gcloudコマンドを使用するため。

# 手順
## ダウンロード
ここを参考に。
https://cloud.google.com/sdk/docs/quickstart-mac-os-x?hl=ja

## パッケージを展開

```
$ tar xvzf /path/to/tarball -C /path/to/install_dir
```

## インストール

```
$ cd /path/to/install_dir
$ ./google-cloud-sdk/install.sh
```

## シェルの設定
install.shの実行時にメッセージが出るが、それをシェルの初期化時に行われるようにする。
これが適切な設定か分からないが動く。

```bash:~/.bash_profile
source /path/to/install_dir/google-cloud-sdk/completion.bash.inc
source /path/to/install_dir/google-cloud-sdk/path.bash.inc
```

設定後、ログインし直すか、上記のコマンドを手動で実行しておく。（次の手順で必要）

## 初期設定

```
$ gcloud init
```

先ほどの設定でgcloudコマンドへのパスが通ったはず。
初期設定でいくつか選択項目があるが、後で変えられるので悩む必要はない。

## バージョン更新
古いバージョンがインストールされているので、最新バージョンにアップデートする。

```
$ gcloud components update
```

## 確認など

```
# インストールされているgoogle-cloud-sdkの情報
$ gcloud info

# 設定の情報
$ gcloud config list
```

# 使い方
適当な場所で`help`とか`-h`とかすると、だいたい教えてくれる。

```
gcloud help
gcloud -h
gcloud --help
```

以上です。
iOSでプラポリが必須になったのでGitHub Pagesで対応した

おはようございます。

昨夜0時前の寝る前に申請したアプリが、起きたら審査を通っていて、寝覚めがとても良いです。わずか7時間。スピード感！

#### before
![IMG_4034.png](https://qiita-image-store.s3.amazonaws.com/0/69911/3c10fc7b-afe0-e826-ec07-0653f770acaa.png)

#### after
![IMG_4035.png](https://qiita-image-store.s3.amazonaws.com/0/69911/9998e4d9-8c3d-6fb0-6925-f93726fc7a06.png)


--- 閑話休題 ---


## 結論
- プライバシーポリシーをソースコードとともにGitHubで管理する
- Pagesで`https://username.github.io/HogeApp/PrivacyPolicy/Japanese`みたいに公開してストアのプライバシーポリシーURLに申請する
- ソースコードはPrivateのままで大丈夫

## 経緯

「アプリ申請しよう思ったら、プライバシーポリシー必須になってて申請できないどうしよwオワタwwもう少し早く出しておけば...」

どうやら10/3からのようで。[2018年10月3日からApp Store Connectのアプリ審査の際にPrivacy Policyが必須になる件の調査](https://qiita.com/MilanistaDev/items/515355f1b766953c7a0f)

ドメインとか持ってないしどうすればええんやって思ってて思い出したのがこちら↓

[GitHubのmasterブランチをWebページとして公開する手順（GitHub Pages）](https://qiita.com/tonkotsuboy_com/items/f98667b89228b98bc096)

「一瞬で公開できるやんけ！GitHub最高！」

ってことでお手軽に対応するならGitHub Pagesがいいよという話です。

みなさん、アプリのソースコードはGit管理してますよね？
で、GitHub使っててソースコードはPrivateのまま、部分的に公開することも可能なのです。

## 手順

リポジトリ -> Settings -> GitHub Pages で以下のように`master branch /docs folder`を選択します。
注意書きがありますが、「プライベートリポジトリだけどサイトが公開されています」というもので、今回の件では意図通りなのでスルーでOKです。

<img width="665" alt="Screen_Shot_2018-10-07_at_8_33_05.png" src="https://qiita-image-store.s3.amazonaws.com/0/69911/5dcb3572-332e-073d-c8e8-4d7f13dde83f.png">



作業としては、リポジトリ直下んに`docs`フォルダを作り、Webページとして公開したいソースをいれます。
私は、さらにPrivacyPolicyというフォルダを用意することで`https://username.github.io/HogeApp/PrivacyPolicy/ページ`のように、HogeAppのPrivacyPolicyであることを表現できるようにしてみました。

<img width="886" alt="Screen_Shot_2018-10-07_at_8_21_25.png" src="https://qiita-image-store.s3.amazonaws.com/0/69911/527cde03-020a-3ed7-0ed4-c966df9b3cc8.png">


また、日本語と英語を用意してローカライズに対応しました。
ちなみにマークダウンが好きです。
<img width="886" alt="Screen_Shot_2018-10-07_at_8_21_37.png" src="https://qiita-image-store.s3.amazonaws.com/0/69911/f19aeabe-8114-18b2-b2f6-869e82c5a566.png">

上記だと、
- `https://username.github.io/HogeApp/PrivacyPolicy/Japanese`
- `https://username.github.io/HogeApp/PrivacyPolicy/English`
のurlが利用できます。

以上です！どなたかの参考になれば！
もっといい方法あるよ！とかあれば教えてください！
ありがとうございました。

## 参考

プライバシーポリシーの書き方や内容には苦労しましたが、
いいエントリーがあったのでこちら([個人開発者がAppStore用にプライバシーポリシーを書く](https://qiita.com/Hiroki_Kawakami/items/94f012d20afdb692df20))もご覧ください。確かに何を書けば良いのかわからず、とても悩んだし、Webからいろいろ探したけれど、よくまとまっていて参考になりました。