OmniAICreator/Qiita-1.07M huggingface dataset:
【第一弾】Kubernetesベストプラクティス：Container Images

# ベストプラクティス第一弾です

こんにちは、jackです。

先日、YouTubeで見つけたKubernetes Best Practicesというシリーズがすごく良かったので復習を兼ねて、ざっくりとまとめてみたいと思います。
より詳しく知りたい方・原文（英語）を読みたい方はGoogle公式ブログをご覧ください。

今回はこちらの第一弾についてまとめます。
[Kubernetes best practices: How and why to build small container images](https://cloudplatform.googleblog.com/2018/04/Kubernetes-best-practices-how-and-why-to-build-small-container-images.html)

# TL;DR

* ベースイメージは常に**小さいサイズ**のものを使うように心がけよ
* インタープリタ型言語は**Alpine**を使え
* コンパイル型言語は**Alpine**を使った上で**multi-step build**をしろ



# もう少し詳しく

## ベースイメージは常に小さいサイズのものを使うように心がけよ

最近はDockerのおかげで、簡単にコンテナイメージの作成ができるようになりました。
ただこのように簡単にできる半面、深く考えずにイメージをビルドしてしまうと、イメージが**大きくなるだけでなく、致命的な脆弱性を見逃している可能性があります**。

コンテナイメージを小さくするということは、デプロイ時間の短縮やセキュリティの脆弱性削減にもつながるということです。


## インタープリタ型言語のコンテナ作成

Ruby、Python、Node.js、PHPなどといったインタープリタ型言語はコンパイルするオーバーヘッドがない半面、インタープリタもコンテナ内に含む必要があります。

以下のように`node:onbuild`を使ってビルドした時のサイズはなんと**673MB**！

```yml:Dockerfile
FROM node:onbuild
EXPOSE 8080
```
```sh
~/Desktop/kbp
❯ docker images my-app
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
my-app              onbuild             13fe69416f82        8 seconds ago       673MB
```

`node:alpine`に変更してちょちょっとDockerfileを書き換えるだけで、**69.9MB**まで減らせる！約 10分の1になるからすごいですね。

```yml:Dockerfile
FROM node:alpine
WORKDIR /app
COPY package.json /app/package.json
RUN npm install --production
COPY server.js /app/server.js
EXPOSE 8080
CMD npm start
```
```sh
❯ docker images my-app
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
my-app                alpine              261ac3efe521        9 seconds ago       69.9MB
```

## コンパイル型言語のコンテナ作成

Go、C++、Rustなどのコンパイル言語はコンパイルすることで何にも依存しないバイナリを作成することができる。これを利点に、先程のAlpine作戦ともう一つ、**multi-step build**を行うことでより小さいイメージを作成することができる。

`golang:onbuild`のサイズはおよそ700MB、
それを`alpine`にすることによって376MBになりました。

```yml:Dockerfile
FROM golang:alpine
WORKDIR /app
ADD . /app
RUN cd /app && go build -o goapp
EXPOSE 8080
ENTRYPOINT ./goapp
```
```sh
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
my-app                alpine              01552801e83f        10 seconds ago      376MB
```

Dockerでの**multi-step build**はこのように書く。

```yml:Dockerfile
FROM golang:alpine AS build-env
WORKDIR /app
ADD . /app
RUN cd /app && go build -o goapp

FROM alpine
RUN apk update && \
   apk add ca-certificates && \
   update-ca-certificates && \
   rm -rf /var/cache/apk/*
WORKDIR /app
COPY --from=build-env /app/goapp /app
EXPOSE 8080
ENTRYPOINT ./goapp
```

`build-env`と命名してあげることによって参照することができるようになります。
こうすることで**13.5MB**まで小さくすることができました。

```sh
❯ docker images my-app
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
my-app              alpine              d12f15709710        8 seconds ago       13.5MB
```

# まとめ

大事なのでもう一度書きます。

* ベースイメージは常に**小さいサイズ**のものを使うように心がけよ
* インタープリタ型言語は**Alpine**を使え
* コンパイル型言語は**Alpine**を使った上で**multi-step build**をしろ

その他、公式ブログではセキュリティやマシンスペックに応じてのビルド時間などより詳しく書いてあるので読むことをおすすめします。

それでは。
CentOS/Apache/Laravel使用時のpermission設定方法

# はじめに

## Permission denied
Laravelを使用していると、以下のエラーが吐かれる場面に遭遇することがあると思います。

`PHP Fatal error:  Uncaught exception 'UnexpectedValueException' with message 'The stream or file "/path/to/laravel_application/storage/logs/laravel-2018-xx-xx.log" could not be opened: failed to open stream: Permission denied'`

あー、ログが書き込めてないのね。権限だね。はいはい。

## 加えて起こるミス

私は、ログの設定を`daily`にして使用することが多いので...

- 設定したその日は、書き込もうとしているファイルの権限まで直接変えてるから書き込める
- その結果、直したように思い込んでしまう
- 日付が変わった瞬間、新しく作成されたログファイルの権限が適切でなくて書き込めない

...のコンボをくらうことがよくあります。

「ファイルを作成したユーザーと、次に書き込みたいユーザーが異なる状態」という複雑な状況を作り出しているのが悪いんですけど(´･ω･`)


そんな私による、私のための、得する人が他にいるのか分からないような設定手順メモ。

# 設定方法

## Laravel用にユーザーグループを作成する

```
# groupadd laravel
```

下の方でも書きますが、`storage`と`bootstrap/cache`の所有グループをこの`laravel`グループにします。

## 権限を与えたいユーザーをグループに追加する

必要なユーザーを適宜追加します。

```
# gpasswd -a hogehoge laravel
# gpasswd -a apache laravel
```

## プロジェクトのディレクトリに移動

```
# cd /path/to/laravel_application
```


## とりあえず綺麗にする

ディレクトリは`755`に、ファイルは`644`に全て変更。
（必要ない環境であれば飛ばしてください）

```
# find ./ -type d -exec chmod 755 {} \;
# find ./ -type f -exec chmod 644 {} \;
```

## `storage`と`bootstrap/cache`の所有グループを変更

`laravel`グループに属させます。

```
# chown -R :laravel ./storage

# chown -R :laravel ./bootstrap/cache
```

そして、既存のディレクトリ・ファイルに対して変更をかける

```
# find ./storage -type d -exec chmod 775 {} \;
# find ./storage -type f -exec chmod 664 {} \;

# find ./bootstrap/cache -type d -exec chmod 775 {} \;
# find ./bootstrap/cache -type f -exec chmod 664 {} \;
```

## SGIDを設定する

これによって、誰がどう作成しようが、作成されたファイル・ディレクトリの所有グループは`laravel`になります。

```
# find ./storage -type d -exec chmod g+s {} \;

# find ./bootstrap/cache -type d -exec chmod g+s {} \;
```

## ACLのデフォルト設定
`storage`と`bootstrap/cache`の配下に新規ファイルやディレクトリが作られるとき、ディレクトリは`775`に、ファイルは`664`に自動的に設定してくれるように設定します。

```
# setfacl -R -d -m g::rwx ./storage

# setfacl -R -d -m g::rwx ./bootstrap/cache
```

## 再起動

```
# shutdown -r now
```
Skype for Business Onlineだけだと会話の履歴が保存されない

## Skype for Business Onlineのライセンスだけ購入したら
弊社は元々Office365(Business Premium)を利用していたので、協力会社の方とコミュニケーションはSkype一択でした。主な使用用途がチャットだけということもあり、Office365 Business Premiumを購入するほどではなかったので、Skype for Business Onlineのライセンスだけ購入しました。

## 会話の履歴が保存できない
Skype for Businessの会話の履歴の保存先は「メール」のみのようなので、メールのライセンスが無いと保存されないということが判明しました。
というわけで、追加でExchange Onlineのライセンスを購入しました。
Skype+Exchangeの金額の方がBusiness Premiumより多少安いのですが、微々たるものなので、最初からBusiness Premiumを選択すれば良かったなあ、という後悔です。
わたしのコンサルティング、及び、マネジメント

やあやあ、ごきげんよう、🐱です。**上流とか超上流とかうるせー！**

どっちも骨法を押さえちゃいましょう！

#りょうしゃにきょうつうすること
両者、どちらも正解はありません。ただ、夥しい失敗の蓄積があります。つまり、どうすれば成功するかはわからないけれど、どうすれば失敗するかは確実に言えます。

ここだけの秘密なのですが、デマルコ先生とワインバーグ先生を全部読めば、事足りるのですが、そうなると🐱の立つ瀬がないので……。

#まほうつかいみたいなこんさる
誰でも知っているような某社様にコンサルタントとしてアサインされたことがあるのですが、一緒にお仕事させていただいた白髪のダンディがとにかくすごかったです。

「まあね、茶飲み話の相手くらいにはなりますよ」などと飄々と宣い、その会社様の取引明細全て（文字通り、全て）を、3晩寝ずに分析した後、「なるほど、実に合理的な設計をしておられます。**然るに**」からの、**刺さる提案**です。

某案件で有名な外資系コンサル会社様にプロジェクトのスケジュールについてご相談をしました際、全てのタスクを1日で終わらせることが可能であれば、理論上、オンスケになる、と言うA4資料を300万で叩きつけられました。

**うn**

#まほうつかいみたいなぷろまね
要するに、プロマネなんて、縁と座組み、それが全てです。チームですよ。組織ではありません。いかに場をHotに保つかが勝負です。

それを横目にプロマネはリスクを執拗に監視し続けます。プロマネが仕事をする時、それはリスクが実現してしまった時です。それは後手であり、敗戦処理であり、防衛戦です。

あのですね。

進捗どうですか？
True →　がんばってください
False →　がんばってください

このようなものをマネジメントと錯覚しておられる方が大量におられるように思われるのですが、それは、初音ミクさんでも出来ませんか？ プロジェクトを定量的に評価するのは管理（Control）であり、Managementではありません。

[Managementと言う言葉は多義的ですが](https://ejje.weblio.jp/content/management)要するに「やりくりする」とか「どうにかする」とか、そう言う意味です。履き違えてはいけない。

#結びに
Managementを失敗することなんて実に実に簡単です。コミュニケーションをロスすればいい。さらに言えば、議論において人格否定に終始し続ければ、人間は簡単に壊れます。

でも、もう、そんなの、いやでしょう？

読んでくれてありがとう。またね。

My pleasure.
My honour.
see ya soon.
Your faithful 🐱
nimでchannelを用いて他スレッドと連携

## 概要
Nimで他のスレッドとチャンネルを用いて連携
***

## シンプルデモ
```nim
import os
import threadpool
var channel: TChannel[int]

# バッファのデータを全て読み込み
proc recved():seq[int] =
  result = @[]
  while channel.peek() > 0:
    result.add(channel.recv())

# 5度データ送信 
proc sendMsg() {.thread.} =
  for i in 0..<5:
    channel.send(i)

channel.open()
spawn sendMsg()
sleep(1000)
echo recved() # @[0, 1, 2, 3, 4]
sync()
```
***

## オープン
```nim
import threadpool
var channel: TChannel[int]
#送受信の前にチャンネルを開く必要有り
channel.open()
```
***

## クローズ
```nim
import threadpool
var channel: TChannel[int]
#チャンネルを閉じ、リソースを開放
channel.close()
```
***

## 送受信
```nim
import threadpool
var channel: TChannel[int]
channel.open()
channel.send(37)
#バッファのデータを一つ返す
#データがない場合、受信するまでブロッキング
echo channel.recv(37) # 0
```
***

## バッファのデータ数
```nim
import threadpool
var channel: TChannel[int]
#チャンネルが閉じていた場合-1を返す
channel.peek()
```
***

## 参考
[Module channels](https://nim-lang.org/docs/channels.html#Channel)
td-agent をインストールして debug してみる ( docker + ubuntu )

## dockerコンテナを使う場合の例

```
docker run -it ubuntu:16.04 /bin/bash
```

## 色々と入れる

```
apt-get update && apt-get install -y curl sudo vim
```

## td-agentをインストール

```
curl -L https://toolbelt.treasuredata.com/sh/install-ubuntu-xenial-td-agent2.sh | sh
```

[Installing Fluentd Using deb Package | Fluentd](https://docs.fluentd.org/v0.12/articles/install-by-deb)

## td-agentを起動

```
td-agent
```

## debugしてみる


`docker exec` で二窓するなどして。
`/etc/td-agent/td-agent.conf` のデフォルト設定を参考にdebugを叩く。

```
curl -X POST -d 'json={"foo":"bar"}' http://localhost:8888/debug.txt
```

## 結果

td-agent起動中のコンソールに標準出力される

```
2018-06-22 15:39:59 +0000 debug.txt: {"foo":"bar"}
```

# 環境

- td-agent 0.12.40
- Ubuntu 16.04.4 LTS (Xenial Xerus)
- Docker version 18.03.1-ce, build 9ee9f40








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
クライアントからサーバーへの再送信をやめる

## はじめに
本件はわたくしは当事者ではなく、聞いただけなので曖昧な表現が多いかもしれません。

## サーバーからの応答が時間がかかった
クライアント(Java)からLB経由でサーバーに接続していて、サーバーからの応答がn分間かかるという事象がありました。n分間かかってしまうのはリクエストのデータ量が多く、ある意味仕様なのです(それがイケていないというツッコミは無しで)。
時間がかかるのは、分かっていたことなのですが、n分間経過すると同じリクエストがサーバーに届くという事象が発生しました。
![alt](https://docs.google.com/drawings/d/e/2PACX-1vQppqefW3dwfOmvvWaZYXZeWVDWfRHeLL_8fc-JuXv-nIY44rL3KEk_XPIfmrtjh3O3Y6DesiCp7mcw/pub?w=960&h=720)

同じリクエストが再送されたせいで、サーバ側でエラーになってしまったのですが、上図②を誰が行ったのか分かりませんでした。クライアント側では特に例外は出ていなかったようです。

## 誰が再送したのか
犯人はクライアントのJavaでした。
使用していたLBではn分間応答が無かったら、クライアント側にfinを返すようになっていました。Javaでは勝手に再送するようになっていました。これは[RFC2616](https://triple-underscore.github.io/RFC2616-ja.html)に記載されているように、POSTで接続できなかった場合もう一度送るべき、と書いてあるのでJavaもそれに倣っていると思います。
なお、今回はCommons-HttpClient(3.x)を使用していましたが、内部ではJavaのHTTPClientのクラスを使用しているようです。

## JDKネットワークプロパティ
[ここ](https://docs.oracle.com/javase/jp/8/docs/technotes/guides/net/properties.html)に書いてありました。
>sun.net.http.retryPost (デフォルト: true)
成功しなかったHTTP POST要求がサーバーに自動的に再送信されるかどうかを決定します。この場合、「成功しなかった」とは、サーバーが有効なHTTP要求または発生したIOExceptionを送信しなかったことを意味します。

上記プロパティをfalseにすると再送されなくなりました。
ただ、結局はn分間応答が無いとエラーになってしまうので根本解決にはなっていませんが。
elm-replをdockerで動かして、Elm入門ハンズオンを試してみた

## 動機
しばらくElmに触れられなかったところ、文法など忘れてしまっていた。
そんな呟きをしたら以下のスライドを教えていただいたので挑戦。
[Elm入門ハンズオン][*1]

## 動作環境

* windows10
* vagrant2.1.1
* virtualbox5.2.12
* ubuntu-18.04
* Docker version 18.05.0-ce, build f150324
* docker-compose version 1.21.2, build a133471

## elm環境作成

ディレクトリ構成は以下。

```
- bin
  - repl.sh
- docker
  - elm
    - Dockerfile
    - ensure_libsysconfcpus.sh
    - replace_elm_make.sh
  - docker-compose.yml
```

```Dockerfile:docker/elm/Dockerfile
FROM node:10.5.0

# Add Tini nodeはpid 1で動くようにできていないのでpid1でtiniを動かす。
# http://ngzm.hateblo.jp/entry/2017/08/22/185224
ENV TINI_VERSION v0.15.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini /tini
RUN chmod +x /tini
ENTRYPOINT ["/tini", "--"]


# コンテナ上の作業ディレクトリ作成
WORKDIR /app

# 後で確認出来るようにpackage.jsonを作成
RUN npm init -y

# elmインストール
RUN yarn add  elm

# elm 高速化
ADD ./ensure_libsysconfcpus.sh /app/ensure_libsysconfcpus.sh
ADD ./replace_elm_make.sh /app/replace_elm_make.sh

RUN /app/ensure_libsysconfcpus.sh
RUN /app/replace_elm_make.sh

# test
RUN yarn add --dev elm-test

# 追加モジュール
RUN yarn elm package install elm-lang/core -y

# package.json設定
RUN sed -i -e "s/\(\"scripts\": {\)/\1\n    \"repl\": \"elm-repl\", /" /app/package.json
```

```yml:docker/docker-compose.yml
version: '3'
services:
  elm:
    build: ./elm
    volumes:
      - cache1:/app/elm-stuff
volumes:
  cache1:
```

```bash:bin/repl.sh
#!/bin/bash

# 変数設定
bin_dir=$(cd $(dirname $0) && pwd)
composeFile=${1:-"docker-compose.yml"}
containerName=${2:-"elm"}

# docker-composeの起動
cd $bin_dir/../docker && docker-compose -f $composeFile run $containerName /bin/bash -c "yarn repl"
```

([この時点のソース](https://github.com/hibohiboo/develop/blob/6ab8760f0696359a076ba75f9bbf73dc86742ade/tutorial/lesson/elm-2/))

## ハンズオンを試す

`./bin/repl.sh`を実行して、replを起動。スライドを順番に試した。
リストの扱いが、特に勉強になった。
モジュールの解説は、そのうち追加されるのだろうか。
elmの基本的なことを少し学べたと思う。

## 参考
[Elm入門ハンズオン][*1]
[Docker で node.js を動かすときは PID 1 にしてはいけない][*2]

[*1]:https://gitpitch.com/ababup1192/elm-handson1/master?grs=github&t=sky
[*2]:http://ngzm.hateblo.jp/entry/2017/08/22/185224
nginxをソースからインストール(CentOS 7.2)

CentOSにnginxをインストールしたので備忘録

## 環境
- nginx 1.14.0
- CentOS 7.2

## インストール
何はともあれユーザー作成

    # useradd -M -s /sbin/nologin nginx

ソースコードダウンロード(2018.6.22 現在のstable版)

    # cd /usr/local/src
    # wget http://nginx.org/download/nginx-1.14.0.tar.gz

展開

    # tar xvzf nginx-1.14.0.tar.gz 
    # cd nginx-1.14.0

configure時のprefixはnginx-1.14.0にしてる(アップデート時など複数のバージョンを入れることを考慮。利用するバージョンはシンボリックリンクで切り替えて使う)

    # ./configure \
    --user=nginx \
    --group=nginx \
    --prefix=/usr/local/nginx-1.14.0 \
    --with-http_ssl_module \
    --with-http_stub_status_module

インストールと所有者設定

    # make 
    # make install
    # chown -R nginx:nginx /usr/local/nginx-1.14.0

シンボリックリンク設定

    # ln -snf /usr/local/nginx-1.14.0 /usr/local/nginx

ログの格納ディレクトリ作成

    # mkdir /var/log/nginx
    # chown nginx:nginx /var/log/nginx

nginx.confを編集（インストール時http_ssl_module組み込んだけど取り敢えず割愛）
ドキュメントルート /usr/local/www ホスト名 example.jp の場合こんな感じ

```/usr/local/nginx/conf/nginx.conf
user  nginx;
worker_processes auto;
worker_rlimit_nofile 100000;
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    multi_accept on;
    use epoll;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    sendfile       on;
    tcp_nopush     on;
    tcp_nodelay    on;
    keepalive_timeout 10;
    client_header_timeout 10;
    client_body_timeout 10;
    reset_timedout_connection on;
    send_timeout 10;

    server_tokens off;
    gzip  off;

    server {
        listen       80;
        server_name  example.jp;
        root   /usr/local/www;
        charset utf-8;
        access_log  /var/log/nginx/access.log  main;

        location / {
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
```
起動

    # /usr/local/nginx/sbin/nginx

確認

    # curl -v http://example.jp

## その他
ファイアウォールなどで80番Port閉じてる場合はちゃんと開ける
NimとRustに同時入門するぞ

やあやあ、ごきげんよう、🐱です。
最高にCoolなEngineerである諸賢はNimとRustに興味津々に違いない。そうだろ？ そうだって言え。Nim好きでしょ？　**好きって言え**。

今日はNimとRustに同時に入門しましょう！💪🐱

#らすとー！
[こちらがRustの公式になります](https://www.rust-lang.org/ja-JP/)。まあ、Better C++みたいなもん。借用権がーとか、多分メモリ参照の擬人化に過ぎないと思います。（雑）

Haskellから影響を受けているそうなのでので型クラス使えるみたいですね。トレードマークは歯車。ガリガリ動きそうでかっこいいー！

#にむー！
にむをしろ。にむをしろ。にむをしろ。

[こちらがNimの公式になります](https://nim-lang.org/)。**NimはCより出でて、Cより速し**。なお、Javascriptにもコンパイルされます。ふしぎ！

種を明かしますと、下手にC書くより最適化されたCにコンパイルしてくれるらしいです。さらに言えば、Javascriptになります。実質、マナーにやかましいコンパイラおばあさん付き静的型付けJavascriptですね。

トレードマークは輝く王冠。す、すてき！

#ところで
釈迦に説法ですが、あるプログラミング言語の公式サイトを見つけるにあたり”hogehoge lang”で検索すると高確率でヒットします。

ついでに最狂のプログラミング言語、[Malbolgeはこちらになります](https://ja.wikipedia.org/wiki/Malbolge)。”Hello, world”するのに2年かかった上に、人の手によるものではないそうです。こわい！

#にむとからすととか
これは秘密なんですが、某社様がネットワークエンジニアを大量に雇用しております。ScalaなりのJVMでサーバーの並列分散処理はすでに解決しており、ボトルネックはネットワークのみ、と🐱は読みます。

正直、現時点でここら辺の言語のスピードはToo Muchかも知れませんね。

#さらにところで
Rustがどうして流行ってるか、ご存知ですか？　流行らせてるんですよ、Mozillaが。あいつらはブラウザ戦争を仕掛けた、マーケティング戦争の鬼です。それはそれで結構なのですが、Nimが忘れ去られるのは、🐱は嫌です。

両立し、選択出来るべきだと思います。RustはSexyですし、NimはElegantです。ほんの少しだけでも、Nimを応援してあげて欲しいです。

#結びに
ジャバをOracle社様が買収し、すわOSSの危機かと騒がれましたが、GithubのバックにMicrosoft様が付きましたね。これがマーケティングというものです。

なんだかんだで技術的なこと書くの、初めてですね。読んでくれてありがとう。またね。

My pleasure.
My honour.
see ya soon.
Your faithful 🐱
マウスの操作が効かないけどキーボード操作は効くときにパソコンの電源を切る方法について

#shutdownコマンドを使おう。

1. [Windows]+[R]を押そう。[^1]
2. shutdownコマンドを使かえばパソコンの電源を落とせる。

```none
shutdown -s -t 0 '0秒後に(今すぐ)電源を落とす。
```

[^1]: 「Windowsロゴキーを押しながらRキーを押す」という操作を示している。
WordPressでHTTPS設定にしたあとにtoo_many_redirectsになったときの対処法

WordPressをセットアップして、最初に設定画面を見たら

<img width="615" alt="スクリーンショット 2018-06-22 23.53.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/244632/7cce4375-6023-cbec-f522-8c71702394f5.png">
あれ？**httpだ**

ということでhttpsにすると、

**TOO_MANY_REDIRECTSで管理画面にアクセスできなくなる。**

おかしいなと調べたところ、**wp-config.phpに以下の行を追記すると治った:**

```php
$_SERVER['HTTPS'] = 'on';
$_ENV['HTTPS'] = 'on';
$_SERVER['HTTP_HOST'] = 'YOUR_BLOG_URL_HERE';
$_SERVER['SERVER_NAME'] = 'YOUR_BLOG_URL_HERE';
$_ENV['HTTP_HOST'] = 'YOUR_BLOG_URL_HERE';
$_ENV['SERVER_NAME'] = 'YOUR_BLOG_URL_HERE';
```

ちなみに

```php
/** Absolute path to the WordPress directory. */
if ( !defined('ABSPATH') )
        define('ABSPATH', dirname(__FILE__) . '/');

/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');
```

の後あたりに前記のコードを書くと自分が管理者なのに「お前に見る権限はねえ」って偉そうに弾かれるので悲しい気持ちになりたい人にはおすすめです。

こんな初っ端からエラーが出るのに、なんで情報が殆どないんだ:tired_face:
匿名性について今更ながら調べて考えてみた

#匿名性について調べて考えてみた

##目次
1,導入
2,匿名性とは(調査結果)
3,匿名性とは(自分なりの見解)
4,まとめ


##1,導入
今回、ブロックチェーン関係の論文を読んだのだが、匿名性の意味を正確に把握仕切れていなかったため、意味を捉え間違えてしまったところが多々あった。
なので、ここでは自分が今回調べて理解した匿名性について書きたいと思う。
もし間違い等の指摘がある場合はどんどんコメントください。

##2,匿名性とは(調査結果)
匿名性が高い状態に関して、以下のサイトなどをみて調査してみた結果、自分は以下が適切な説明かと考えました。
<font color="crimson">***匿名性が高い状態とはある特定の情報と特定の人物とが一対一で結びつかないこと。***</font>
上記に関する説明は次の章でできればと考えています。
以下には参考にしたページの一部を載せておきます。

「匿名性（Anonymity）とは、名前などの本人の身元を隠すこと」
→セコムトラストシステムズ[https://www.secomtrust.net/secword/anonymity.html]
「誰であるかが秘匿されており分からないようになっているさま、匿名であるという性質、および、その度合いを意味する表現。」
→実用日本語表現時点[https://www.weblio.jp/content/%E5%8C%BF%E5%90%8D%E6%80%A7]
もっとも参考になった匿名性に関する記事
→[https://www.wildhawkfield.com/2012/02/blog-post.html]
→[https://www.wildhawkfield.com/2011/11/blog-post_19.html]

##3,匿名性とは(自分なりの見解)
<font color="crimson">***匿名性が高い状態とはある特定の情報と特定の人物とが一対一で結びつかないこと。***</font>
自分は上記で匿名性とはではなく、匿名性が高い状態とは?に関しての説明をしました。その理由は、匿名性とは白黒のように二極化できるものではなく、白から間の灰色を通って黒になるグラデーションのように高いものから低いもののように並んでいます。この高い低いは特定の情報と人物とを一対一で結びつけることが容易であれば、低く、逆に困難であれば高いと見なすことができます。では一対一で結びつけるとはどういうことなのか。
例えば自分がインターネットで「Aさんのバカヤロー」と呟いたとします。この情報と発言した人物が容易に結びつけば匿名性が低いですが、そんな簡単には結びつくはずがありません。

![匿名性01.png](https://qiita-image-store.s3.amazonaws.com/0/182526/4d512793-0e5f-2592-4e06-15eacef6e341.png)


ですが、この発言をしたのがTwitterで、そのTwitterに登録している名前が本名であった場合はどうでしょう。


この場合は
1,発言情報
2,実名
3,過去の発言履歴
など色々と情報が紐づくことで実際の人物と情報が結びつく可能性があります。

![匿名性02.png](https://qiita-image-store.s3.amazonaws.com/0/182526/dd515c79-b2de-1d8a-5fe2-25ff40ed9bca.png)


ですが、この場合も実名がよくある名前だったり、偽名だった場合は実際の人物と結びつく可能性が下がる可能性があります。

![匿名性03.png](https://qiita-image-store.s3.amazonaws.com/0/182526/773ede91-54f3-084a-ea21-edb5e1974f20.png)



ですが、その偽名からさらに他の情報に結びつくことで本人が特定されてしまう可能性があります。
すなわち、一つの情報が他の情報と結びつき、情報群となることでより一人の人物と一対一で結びつく可能性が高まるのです。これを考えると完全匿名性なんて状態はほぼないことに気がつきます。もし完全匿名性の状態において発言をすることを考えるとすると、...無理ですね。

##4,まとめ
1,<font color="crimson">***匿名性が高い状態とはある特定の情報と特定の人物とが一対一で結びつかないこと。***</font>
2,すでに完全匿名性などという状態は存在しない。
目指せ体脂肪率0%！ EngineerXXXXボディ部

やあやあ、ごきげんよう、🐱です。そろそろ夏が近いですね。体脂肪率を0%にしましょう！💪🐱

なお、Vimのキーバインドを打鍵するにあたり、小指などの筋力が必要になりますため、この記事は違法ではないというのが、🐱の言い分です。

#たべなければやせる

それはそう。そもそも、太る原因というのは炭水化物と糖質なので、それらを避ければ痩せます。お米、パンあたりが炭水化物。実は野菜や果物も糖質が豊富なので、体脂肪率0%を目指すのであればNGです。

逆に言うと、それ以外は何食べても脂肪になりません。

# でもおなかすいた

ですよね。オリーブオイルを食前にスプーン1杯飲みましょう。だいぶん食欲がなくなります。また、こんにゃくなども良いですよ。冷やした白滝とか、美味しいですね。

#ふとらないからだをつくろう

ガリガリで夏を越せるとでも思ったか。筋肉を付けて、太りにくい身体を作りましょう！💪🐱

とりあえず、[囚人トレーニング](https://motebody.tokyo/beginner-005)しましょう。最高の自重トレーニングです。

面倒臭いなら[スクワット](https://www.youtube.com/watch?v=GKowYaoKbq0)、[プランク](https://www.youtube.com/watch?v=bp2ZwBPkEk8)だけでもだいぶん違います。前者は下半身を、後者は体幹を鍛えることが出来ます。いやでしょう、腰痛。

なんなら、腹筋ローラー買って[膝コロ](https://www.youtube.com/watch?v=ZT9Hd2SaI-w)して下さい。全身に効きます。🐱だから毎日[立ちコロ](https://www.youtube.com/watch?v=-sms3rkRD6A)を20回くらいしてます。尺取り虫みたいで可愛いでしょ？

#えいようが……えいようを……

栄養、とれてますか？（ワインバーグ先生みたいな言い方）

とにかく、たんぱく質とビタミン摂りましょう。🐱だからササミとライトツナばかり食べてます。あと、納豆。

ビタミンBは摂り過ぎると身体に毒ですが、ビタミンCはいくら摂取しても大丈夫なので毎食後にサプリ飲んで大丈夫です。吸収出来ないものは、排泄されるので。なお、お肌の老化とはすなわち酸化であり、それを防ぐのがビタミンです。美肌、手に入れちゃいましょう！

あと、野菜ジュース、オススメです。

#結びに

このポエムは最高にCoolなEngineerである諸賢への後方支援であり、ヘルシーになる方法をご提案しました。自らのヘルスくらい自分で守れ、ばかものよ。（茨城のり子様みたいな言い方）

なお、体脂肪率0%とは、空腹すなわち餓死らしいので、ほどほどにね。

読んでくれてありがとう。
My pleasure.

My honour.

see ya soon.

Your faithful 🐱
Kotlinの短絡評価

【移行のお知らせ】[プライバシー上の懸念](https://blog.qiita.com/about-user-page-renewal-20200326/)により、Qiitaアカウントの削除を検討しています。
各投稿は個人blog( https://gateau.hatenablog.com/archive/category/Qiita )に移行しました。
今後も参照される方は、ブックマークなど移行をお願い致します。

---

短絡評価とは https://ja.wikipedia.org/wiki/%E7%9F%AD%E7%B5%A1%E8%A9%95%E4%BE%A1

> 「≪左辺≫ ≪論理演算子≫ ≪右辺≫」というような、論理演算子による式（論理演算子式）があるとする。左辺（第一引数）を評価した段階で式全体の値が定まらない場合のみ右辺（第二引数）を評価する、というのが短絡評価である。例えば、論理ANDの第一引数を評価した結果が false であれば、式全体は必ず false になるし、論理ORの第一引数が true であれば、式全体は必ず true になるので、第二引数を評価するまでもないので、そこで打切るのである。

どういうときに嬉しいのかもWikipediaに書いてある。
> 1つは、後半の部分式に時間のかかる処理を置き、最初の部分式でその処理が必要か否かのチェックをするようにすれば、無駄な関数呼び出しなどを減らすことができる。2つめとして、後半の部分式が実行時エラーを起こすかどうかのチェックを前半で行うというコーディングが考えられる。

言語によって評価順は異なるので、新しく言語を学ぶときには知っておきたい。
Wikipediaにもある通り、Javaは`&&` `||`が短絡評価あり、 `&` `|` が短絡評価なし。
そしてKotlinの場合は、`&&` `||`が短絡評価あり、 `and` `or` が短絡評価なし。

[Try Kotlin](https://try.kotlinlang.org/) 上で試してみる。


```Kotlin
fun main(args: Array<String>) {

    println("短絡評価する")
    if ( returnTrue() && returnFalse() ){}
    println("")    
    if ( returnFalse() && returnTrue() ){}

    println("\n短絡評価しない")    
    if ( returnTrue() and returnFalse() ){}
    println("")
    if ( returnFalse() and returnTrue() ){}    
    
}

fun returnTrue(): Boolean{
    print("true")
    return true
}

fun returnFalse(): Boolean{
    print("false")
    return false
}
```
実行結果

```
短絡評価する
truefalse
false       // 左辺の時点でfalseが確定するので右辺は実行しない
短絡評価しない
truefalse
falsetrue   // 左辺がfalseでも右辺を実行する
```
Ionic3でicloudにファイルを保存する

# はじめに
画像以外のtxt, PDF...etc. をiOSに保存して、
他のアプリから参照可能なようにしたかったが、
全然できず、丸1日悩んだので、記載（もっと良いやり方があるかもしれません。）

どこも回答がなく、色々試したら一応できたので、先に以下に回答もしています。
https://forum.ionicframework.com/t/writing-to-icloud-drive/87858/5

## できなかった方法
cordova-plugin-file
をはじめ利用してみたが、保存自体は成功するが、
「ファイル」アプリから見ることができず。。。苦戦
https://github.com/apache/cordova-plugin-file/blob/master/doc/ja/index.md
iOSの場合、Androidと違い、privateがnoの保存先が
キャッシュとtempのみのため、iCloud上で保存しても別のアプリから参照できないのかも（ここが違うかもしれません。）
と思い、「共有」にて、あげる方法に変更しました。

# 対応したこと
こちらを利用
https://ionicframework.com/docs/native/social-sharing/

・一回tempフォルダに書き出す。
・書き出したファイルをシェア。

```TypeScript
   let dir = this.file.tempDirectory;
    let fileName = ""; // please set your fileName;
    let blob = ""; // please set your data;

    try {
      this.file
        .writeFile(dir,
          fileName,
          blob,
          {replace: true})
        .then(value => {
          this.socialSharing.share(null, null, null, value.nativeURL);
        });
    } catch (e) {
      console.log(e);
    }
```
※1 this.fileはcordova-plugin-fileのインスタンス
※2 this.socialSharingはsocial-sharingのインスタンスです。

# 補足
Androidであれば、
cordova-plugin-file
を利用して

private = noの
externalRootDirectory　（これだけ試して、うまくいっています。）
externalApplicationStorageDirectory
externalDataDirectory
あたりを使えば、他のアプリからもみられる場所に保存可能なはず。
Kotlin: trimIndent と trimMargin の違い

Kotlin には `trimIndent`, `trimMargin` という似た名前の2つの関数があります。 いずれもロー・ストリングの左側の余分な空白を取り除きます。

## まずは実験

次のコードを実行してみます。

```kotlin
fun main(args: Array<String>) {
    println("---")
    println("""
    for (i = 0; i < 100; ++i)
      console.log(i)
    """.trimMargin())
    println("---")
    println("""
    for (i = 0; i < 100; ++i)
      console.log(i)
    """.trimIndent())
    println("---")
}
```

### 結果

次のような結果が出力されます。

```console
---
    for (i = 0; i < 100; ++i)
      console.log(i)
---
for (i = 0; i < 100; ++i)
  console.log(i)
---
```

`trimMargin` は指定された文字(列)に至るまでの空白とその文字(列)を除去してくれるもので、 `trimIndent` は左側にあるスペースを、一番インデントの少ない行に合わせて削除してくれるものです。


## trimMargin

次の場合にスペースが削除されます。

```kotlin
fun main(args: Array<String>) {
    println("---")
    println("""
    |for (i = 0; i < 100; ++i)
      |console.log(i)
    """.trimMargin())
    println("---")
    println("""
    > a
    > b
    > c
    > d
    """.trimMargin("> "))
    println("---")
}
```

### 結果

```console
---
for (i = 0; i < 100; ++i)
console.log(i)
---
a
b
c
d
---
```

### 補足

`trimMargin` の引数には必ず長さ1以上の文字列を渡す必要があります。 省略した場合は `"|"` が渡されたものとして扱われます。 空文字列(`""`)を渡すと次のようなエラーが出ます。

```
Exception in thread "main" java.lang.IllegalArgumentException: marginPrefix must be non-blank string.
```

## trimIndent

`trimIndent` は引数を受けませんので、 引数を渡すと次のようなエラーが出ます。

```
error: too many arguments for public fun String.trimIndent(): String defined in kotlin.text
```

(引数を渡せる似た関数 `replaceIndent` というものもあります。)
TypeScript：インデックスシグネチャが型安全を破壊する例

TypeScriptには、添え字アクセスに対して型注釈をつけるための Index Signatureという仕組みがあります。

これについて、某ライブラリの型定義でギョッとする使われ方をしていて、修正PRを出してアクセプトしていただいたのですが、ちょっと面白い（恐ろしい）事例だったので紹介。

## インデックスシグネチャとは

プロパティへの添え字アクセス（C# でいうところのインデクサー）に対する型情報を定義します。

たとえば、数値をキーにして文字列を保持する連想配列であれば、こんなふうに定義できます。

```ts
interface NumStrDictionary {
    [key: number]: string;
}
```

使用イメージ。

```ts
//初期化
const dic: NumStrDictionary = {
    1: "いち",
    2: "に"
}
//更新
dic[10] = "じゅう";

//取得
console.log(dic[1]);    //いち
console.log(dic[10]);   //じゅう
console.log(dic[3]);    //undefined
```

## キーがstringの場合、ドットアクセスが可能

js使いにとっては「そりゃそうでしょ」という感じなのかもしれませんが、このインデックスシグネチャのキーがstringである場合、 `.キー名` という書式でのアクセスが可能なんです（TypeScript 2.2以降：[参考](https://qiita.com/vvakame/items/eb6c054360868b88f9b1)）

```ts
interface StrStrDictionary {
    [key: string]: string;
}

const dic: StrStrDictionary = {}

dic.hoge = "ほげ";
dic["huga"] = "ふが";

console.log(dic["hoge"]);   //ほげ
console.log(dic.huga);      //ふが
```

これが恐ろしいことに・・・。

## 存在しないプロパティに対するコンパイルエラーが効かなくなる

前の例を見てもらえればわかるとおり、 `.キー名` で任意のキーに対する値を取得／設定できるということはつまり、 **stringをキーとするインデックスシグネチャが定義されたinterfaceに対しては、タイポ等に対するコンパイルチェックが一切効かない** ということです。

例のように、インデックスシグネチャのみが定義されたinterfaceであればさほど問題はないかもしれません。

しかし、私の遭遇した某ライブラリでは、そのコア機能の多くを定義するすべてのinterfaceの継承元interfaceとして、しかも最悪なことに **any型を返すインデックスシグネチャが定義されていた** ため、そのライブラリのほぼすべてのinterfaceにおいて、一切のコンパイルチェックが効かない状態となっていました。

```ts
interface Extendable {
    // 拡張できるよ！みたいな意図だったらしい
    [key: string]: any;
}

interface CoreFunctions extends Extendable {
    func1(): void;
    func2(): void;
}

const core: CoreFunctions = getCoreFunc();
core.func1();
core.func2();
core.func3();       //<- 書けちゃう
core.func4.aaa.bbb; //<- なんでも書けちゃう
```

## しかし意外と気づかない

しかしこれが、こんな状態でも意外と気づかないものでした。
というのは、Visual Studio Codeのような高機能エディタであれば、存在するプロパティに対する補完自体は快適に機能するため、存在しないプロパティ名をタイプしてしまう機会というのが、まずほとんどないんですね。

なので気づかないでいると特にこわいのは、後からリファクタリングなどでプロパティ名を変更するようなケース。
どうせコンパイルエラーになるだろうと思っていたらならないので、実行時に初めて気がつくことになります。

というわけで、インデックスシグネチャを使用する際は注意しましょうという話でした。
有料ライセンス無しでXcodeでデバッグ

iOS11.3.1 で確認しています。

アプリを削除するたびに設定が必要で、毎回忘れてしまうため記載します。

設定 > 一般 > デバイス管理 > 対象のデベロッパAPP > ここで信頼するを選択
Dockerのselenium/standalone-chrome-debugコンテナにVNC接続する

## selenium/standalone-chrome-debugコンテナを起動
```
docker pull selenium/standalone-chrome-debug
docker run -d -p 4444:4444 -p 5900:5900 --shm-size=2g --name sscd selenium/standalone-chrome-debug
```

## VNCで参照
* localhost:5900からDockerコンテナのVNCサーバに接続できる
    * passwordは「secret」
    * Macの場合は、Finder→移動→サーバへ接続→サーバアドレス[vnc://localhost:5900]で接続できる
        * ターミナルから`open vnc://localhost:5900`でも同様
    * Windowsの場合はRealVNC等を利用して同様に参照する
        * https://www.realvnc.com/en/connect/download/vnc/

## 参考URL
* https://github.com/SeleniumHQ/docker-selenium/tree/master/StandaloneChromeDebug
* https://hub.docker.com/r/selenium/standalone-chrome-debug/
* https://github.com/nightwatchjs/nightwatch.git
* https://github.com/dwyl/learn-nightwatch
EmacsからChromeを操作する

開発中はエディタとブラウザを行き来する機会がとても多いです。
そんなとき、カーソルを動かしたりスイッチャーを起動したりしてエディタ・ブラウザを切り替えるのは非常に面倒くさいです。
なので「エディタからブラウザ操作してしまえばいいじゃないか」という発想でやってみました。

### 開発環境
+ Emacs（Shell Commandを叩ければなんでもOK）
+ Mac（AppleScriptを用いるためMacOSが必要）

# 何ができるの？
Emacsからフォーカスを外すことなく、Chromeの**Reload**・**Tab Switch**・**Scroll**ができます。

### Reload
![reload.gif](https://qiita-image-store.s3.amazonaws.com/0/144707/74b03920-47ad-9dbe-27e2-03b61bbe9435.gif)

### Tab Switch
![switch_tab_chrome2.gif](https://qiita-image-store.s3.amazonaws.com/0/144707/06567c49-7433-35bd-f480-742a9fce6a28.gif)

### Scroll
![scroll_chrome2.gif](https://qiita-image-store.s3.amazonaws.com/0/144707/8357b192-e5fb-fabe-64af-b4a756c1bb29.gif)

# どうやるの？

## AppleScriptの用意

まず以下のそれぞれのAppleScriptを作成します。
作成したAppleScriptには `chmod +x` で実行権限を与えておいてください。

### Reload

これは[こちら](https://gist.github.com/lawrencejones/8906909)を参考にさせていただきました。

ファイル名：`reload_chrome`

```applescript
#!/usr/bin/osascript

tell application "Chrome" to tell the active tab of its first window
	reload
end tell
```

### Tab Switch

ファイル名：`switch_chrome_tab`

```applescript
#!/usr/bin/osascript

tell application "Google Chrome"
	set tabcount to number of tabs in front window
	set current_tab_index to get active tab index of front window
	if current_tab_index equal to tabcount
		set (active tab index of first window) to 1
	else
		set (active tab index of first window) to current_tab_index + 1
	end if
end tell
```

### Scroll

これは[こちら](http://d.hatena.ne.jp/ramusara/20110211/1297418503)を参考にさせていただきました。

ファイル名: `scroll_chrome`

```applescript
#!/usr/bin/osascript

on run argv
	tell application "Google Chrome"
		tell active tab of window 1
			if ("down" = item 1 of argv) then
				execute javascript "var x = document.documentElement.scrollLeft || document.body.scrollLeft; var y = document.documentElement.scrollTop || document.body.scrollTop; y += 100; window.scroll(x, y);"
				return
			else if ("up" = item 1 of argv) then
				execute javascript "var x = document.documentElement.scrollLeft || document.body.scrollLeft; var y = document.documentElement.scrollTop || document.body.scrollTop; y -= 100; window.scroll(x, y);"
				return
			end if
		end tell
	end tell
end run
```

## Emacsの用意

ユーザ定義関数をinit.elに記述してやります。

```elisp
;; pathを通す
(add-to-list 'exec-path "/path/to/applescript")

;; ChromeをReloadする
(defun my-reload-chrome()
	(interactive)
	(shell-command "reload_chrome"))
(global-set-key (kbd "H-r") 'my-reload-chrome) ;; お好みで

;; ChromeのTabを切り替える
(defun my-switch-chrome-tab()
	(interactive)
	(shell-command "switch_chrome_tab"))
(global-set-key (kbd "H-t") 'my-switch-chrome-tab) ;; お好みで

;; Chromeを下にスクロールする
(defun my-scroll-chrome-down()
  (interactive)
  (shell-command "scroll_chrome down"))
(global-set-key (kbd "H-j") 'my-scroll-chrome-down) ;; お好みで

;; Chromeを上にスクロールする
(defun my-scroll-chrome-up()
  (interactive)
  (shell-command "scroll_chrome up"))
(global-set-key (kbd "H-k") 'my-scroll-chrome-up) ;; お好みで
```

## 参考
[lawrencejones/refresh.applescript](https://gist.github.com/lawrencejones/8906909)
[シマリスkawaii/Google Chromeで閲覧中のページをEmacsからスクロールする ※Mac限定](http://d.hatena.ne.jp/ramusara/20110211/1297418503)
CentOS6.5に最新のRubyを1からビルドする

## はじめに
gitに上がっていたrubyの最新をCentOS(Vagrant)上で、ビルドしたいと思います。
下の部分では、つまづいた問題などを全て書いていっています。
~~全てのコマンドを一番下に載せておくので、コピペでもして使ってください。~~
## 実践
```
git clone https://github.com/ruby/ruby.git
cd ruby
./configure
```
ここでは、configureがないと言われます。githubのDocを見ると、autoconfを実行しろとあるので、実行してみます。（その前に入れます。）

```
sudo yum install autoconf
autoconf
```
これでも、Verが古いといわれて怒られます。

```
cd ..
wget http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz
tar -zxvf autoconf-latest.tar.gz 
cd autoconf-X.XX
./configure
sudo make
sudo make install
```
これで、もう一度autoconfをやり直します。

```
cd ruby/
autoconf
./configure
```
ここで、またエラーが、、`checking for ruby... false`
Rubyをいれます。(Rubyを入れるためにはRubyが必要か、、、)

```
sudo yum install ruby
./configure
```
ここでも、to_pathがないとNoMethdErrorを出されます。`NoMethodError: undefined method 'to_path'`
どうやら、to_pathは、1.9.2以降でないと乗っていないらしいのです。

```
cd ..
sudo yum remove ruby
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
cd ~/.rbenv/plugins/ruby-build
sudo ./install.sh
rbenv -v
rbenv install -l
rbenv install 2.3.1
```
ここで、gccがないと言われたので、、、

```
sudo yum install gcc
rbenv install 2.3.1
```
`Try running 'yum install -y openssl-devel readline-devel zlib-devel' to fetch missing dependencies.`と言われる。

```
sudo yum install -y openssl-devel readline-devel zlib-devel
cd ~/ruby/
rbenv install 2.3.1
rbenv rehash
rbenv global 2.3.1
cd ~/ruby/
```
これで、ある程度新しいRubyが入りました。
ここで、やっと`configure`のやり直しです。

```
./configure
```
できました！
次は、いよいよmakeです。

```
make
```
`make: bison: コマンドが見つかりませんでした`と出たので、

```
sudo yum install bison
make
make check #=> check succeeded
```
ここで、エラーっぽいものが出ましたが、気にせず、次をしてしまいました。

```
sudo make install
```
これで、

```
~/ruby/ruby -v
```
`ruby 2.6.0dev (2018-06-22 trunk 63723) [x86_64-linux]`できました！！！！！！！！！！！

最後まで、読んでくださってありがとうございました!
スクラムの各ロールを兼任していいかどうかの参考ページ

参考になりそうなページをまとめてみました。

# スクラムマスターとプロダクトオーナー

* http://www.ryuzee.com/contents/blog/2995

# スクラムマスターと開発メンバー

* https://kdmsnr.com/2012/12/09/

# プロダクトオーナーと開発メンバー

* http://www.ryuzee.com/contents/blog/7070
「タブエンジニアが少ないとやる気出ない問題」を解決するためにスペースをタブに変換する。

タイトルありきです。スペースをタブに変換するコマンド[unexpand]を紹介する。
コードがタブ/スペースで統一されるとやる気が出るかもしれない。
ほとんど情報はここから。https://webkaru.net/linux/unexpand-command/

```![2018-06-22 19_15_34-Microsoft Excel - Book1.png](https://qiita-image-store.s3.amazonaws.com/0/104300/62cbf775-29b7-9775-6b85-182dadb1ab03.png)

```
$ cat foo.txt 
        1       2       3       4       5
        a       b       c       d       e
```

```bash
unexpand　foo.txt
```

```
$ unexpand foo.txt 
	1       2       3       4       5
	a       b       c       d       e
```

逆に、タブからスペースにするには、```expand``` なんだ。

Rubyのワンライナーで書くとこんな感じ。

```Ruby
cat a.txt | ruby -e 'STDIN.each {|line| puts line.gsub(/^\s+/,"\t") }'
```

タイトルや画像の元についてはこちら。
https://logmi.jp/294756

お粗末さまでした。
XMLファイルの操作


下記の3つの方法がある。

# Linq to XML
## XMLに保存
```csharp
var option = new XElement("option");
option.SetElementValue("enabled", true);
var root = new XElement("settings", option);
root.Save("settings.xml");
```
## XMLの読込
```csharp
var xdoc = XDocument.Load("item.xml");
var xelements = xdoc.Root.Elements();
foreach(var item in xelements)
{
    XElement xname = item.Element("name");
    System.Diagnostics.Debug.WriteLine(xname.Value);
}
```

### 名前空間がついている場合
xdoc.Root.Name.Namespaceで名前空間を取得し、要素取得時に指定する。

http://neareal.net/index.php?Programming%2F.NetFramework%2FLINQ%2FLinqAndXmlNamespace

## コレクションをXMLに保存
```csharp
var items = new List<Item>()
{
    new Item()
    {
        Id = 1,
        Name = "テレビ"
    },
    new Item()
    {
        Id = 2,
        Name = "ラジオ"
    }
};

var elements = items.Select(x => 
    new XElement("item",
        new XElement("id", x.Id),
        new XElement("name", x.Name)));
var root = new XElement("items", elements);
var xdoc = new XDocument(root);

xdoc.Save("item.xml");
```

# DataContractSerializer
## XMLに保存
```csharp
var item = new Item()
{
    Id = 3,
    Name = "PC"
};
var settings = new XmlWriterSettings()
{
    Encoding = new UTF8Encoding(false),
    Indent = true,
    IndentChars = "    "
};

using (var writer = XmlWriter.Create("item.xml", settings))
{
    var serializer = new DataContractSerializer(item.GetType());
    serializer.WriteObject(writer, item);
}
```
## XMLの読込
```csharp
using (var reader = XmlReader.Create("item.xml"))
{
    var serializer = new DataContractSerializer(typeof(Item));
    var item = serializer.ReadObject(reader) as Item;
    System.Diagnostics.Debug.WriteLine(item.Name);
}
```

# XmlSerializer
## XMLに保存
```csharp
var item = new Item()
{
    Id = 4,
    Name = "スマホ"
};

using (var writer = XmlWriter.Create("item.xml"))
{
    var serializer = new XmlSerializer(item.GetType());
    serializer.Serialize(writer, item);
}
```
## XMLの読込
```csharp
using (var reader = XmlReader.Create("item.xml"))
{
    var serializer = new XmlSerializer(typeof(Item));
    var item = serializer.Deserialize(reader) as Item;
    System.Diagnostics.Debug.WriteLine(item.Name);
}
```
Android4.1系XperiaでView#setBackgroundColor(int)をすると同色の別Viewまで色が変わる

# こんな感じの赤いViewが２つあり

![スクリーンショット 2018-06-20 12.46.29.png](https://qiita-image-store.s3.amazonaws.com/0/233769/14721983-770d-592b-923e-95daed3226cc.png)

# 片方だけ色を青にします

```Java:MainActivity
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        findViewById(R.id.sample_view_1).setBackgroundColor(Color.BLUE);
    }
}
```

# すると何故か両方青くなります

![capture.png](https://qiita-image-store.s3.amazonaws.com/0/233769/e7a1a3e3-d308-942a-eeb9-7361ffdb0756.png)

# 詳細

View#setBackgroundColor(int)で背景色を変更すると、レイアウトXMLで同じbackground色を指定した別のViewまで色が変更されてしまう。


Android4.1のXperiaでのみ発生が確認できており、おそらく端末のバグ。
必ず発生するわけではなく数回アプリを立ち上げると発生する。

### 再現した端末
- Xperia tablet Z SO-03E (Android4.1.2)
- Xperiaのなんかスマホ (Android4.1系)（これだけ機種調べそこねた）

### 非再現端末
- HTL21 (Android4.1.1)
- Xperia A2 SO-04E (Android 4.2.2)
- priori2 (Android 4.4.2)
- Xpelia Z Ultra SOL24 (Android 4.4.2)
- Xperia Z3 (Android 5.0.2)
- Nexus7 (Android 6.0.1)
- DM-02H (Android 6.0.1) 
- HUAWEI P10 lite (Android 7.0)
- Nexus5x (Android 8.0.0)

似た投稿があった。こちらも根本原因はおそらく同じ。
[View#setBackgroundColor(int) を使って色を変更したら関係ないViewまで色が変わる事案](https://qiita.com/pside/items/839417a7c02f934ec439)

# 解決方法
レイアウトファイルの方のbackgroundの記述を削除して対応した。
※ `setBackgroundColor`で背景色がセットされるので、レイアウトの方に記載は必要なかった

他には若干面倒だが`background`をdrawableにすることでも解決できる。
[初期設定]初学者が最初に「.gitignore」を設定する方法

## 目次

1. 「.gitignore」とは？
2. 初期設定の方法

---

### 1. 「.git ignore」とは？

Gitで開発を行っていると、Gitの管理下に置きたくないファイルが出てくることがあります。
そういった場合に、意図的に追跡対象から外したい（無視したい）ファイルを設定するためのファイルです。

- metaデータ（開発環境で自動作成されるデータ）
- コンパイル、ビルドした時に作成されるデータや実行形式ファイル
- その端末固有の設定情報が記載された環境変数などのファイル
- セキュリティ上、共有したくないファイル

そこでGitでは「git ignore」という機能を利用して、Gitの管理外に置くファイルを設定することができます。

---

### 2. 初期設定の方法

以下の便利なツールが2つあります。
- [gitignore.io](https://www.gitignore.io/)
- [gibo](https://github.com/simonwhitaker/gibo)

- 今回は [gitignore.io](https://www.gitignore.io/) を使った設定方法を紹介します。


![https://gyazo.com/118b494c3065e2e3ad29107f977ee3c1](https://i.gyazo.com/118b494c3065e2e3ad29107f977ee3c1.png)

#### 表示された設定記述を貼るだけ！

![2018-06-22 11.19.59.png](https://qiita-image-store.s3.amazonaws.com/0/118229/f0aad27a-022b-2089-6207-8e8145026c2c.png)

```text:.gitignore
### Ruby ###
*.gem
*.rbc
/.config
/coverage/
/InstalledFiles
/pkg/
/spec/reports/
/spec/examples.txt
/test/tmp/
/test/version_tmp/
/tmp/

# Used by dotenv library to load environment variables.
# .env

## Specific to RubyMotion:
.dat*
.repl_history
build/
*.bridgesupport
build-iPhoneOS/
build-iPhoneSimulator/

## Specific to RubyMotion (use of CocoaPods):
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
# vendor/Pods/

## Documentation cache and generated files:
/.yardoc/
/_yardoc/
/doc/
/rdoc/

## Environment normalization:
/.bundle/
/vendor/bundle
/lib/bundler/man/

# for a library or gem, you might want to ignore these files since the code is
# intended to run in multiple environments; otherwise, check them in:
# Gemfile.lock
# .ruby-version
# .ruby-gemset

# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
.rvmrc
```



## まとめ
とりあえず、[gitignore.io](https://www.gitignore.io/) 便利🤗
Unity + NGUI で スプライト(UISprite)のtransfromを使った位置調整が効かないとき


NGUIのアトラスで管理しているUISpriteのサイズ調整をしながら位置調整をしていて、
なぜか位置調整ができなかった際のメモ。

### これだとVector3.zeroの位置調整が適用されない

```csharp:
            var heartBack = now.CreateSprite("rect_8x8", SpriteObject); // UISpriteを生成

            heartBack.transform.localPosition = Vector3.zero; // 位置を調整　←　これが適用されない
            heartBack.SetRect(0, 0,1500,1500); // UISpriteのサイズを調整
     
```

### これだとされる。順番注意！

```csharp:
            var heartBack = now.CreateSprite("rect_8x8", SpriteObject);  // UISpriteを生成

            heartBack.SetRect(0, 0,1500,1500); // UISpriteのサイズを調整
            heartBack.transform.localPosition = Vector3.zero;

```
Windows のコードページ (Windows10)とUnicodeの関係

Windows では API が２種類ある。

- ANSI系API
   - API名が「A」で終わっている
   - 文字列が MBCS (Multi Byte Charactor System)。１文字が複数バイト
   - 英語＋もう一種類の言語という構成。もう一種類の言語はモードで切り替える（コードページ）
- Unicode系API
   - API名が「W」で終わっている
   - 文字列が W (Wide Character)：UTF16 で表現する
   - 全ての言語の文字をモード切替なく表現できる
   - 昔は１文字がかならず２バイト固定だったが、今は４バイト以上の時もある

Windows で UTF8 を扱おうとすると、２つのアプローチがある。

- 言語のライブラリ層で、UTF8 を UTF16 に変換して、Unicode系APIを使う
     - Cygwin、Go言語などがこの方法をとっている
     - アプリケーションはコードページを気にしなくてよくなる
     - ただし、CMD.EXE がサポートしていない（バッチファイルを UTF16 で書きたい）
- コードページを 65001 (UTF8) に切り替えて、ANSI系APIを使う
     - 一つのフォントは一つのコードページにしか属せない**（過去形）**
        - 日本語環境で `chcp 65001` などでコードページを切り替えても日本語フォントが利用できない**（過去形）**

**Windows10 の最近のアップデートでは、１フォント１コードページという縛りがなくなった**らしく、「`chcp 65001`」の後も、引き続き、それまで使っていたフォントが利用できるようになった。すばらしい

コードページの設定は三種類ある。

* アクティブなコードページ(定数 `CP_ACP`で指定される)
* スレッドのコードページ(定数 `CP_THREAD_ACP`で指定される)
* コンソールのコードページ (API `GetConsoleCP()` で得られる)

子プロセスで CMD.EXE を呼び出すような場合、その CMD.EXE はスレッドのコードページではなく「コンソールのコードページ」で動作する（参考：[problem : batchfile arg UTF-8 data broken. · Issue #322 · zetamatta/nyagos](https://github.com/zetamatta/nyagos/issues/322)）ので、バッチファイルを生成して実行する場合は注意が必要だ。

以上
役に立った情報を残す  React Native編

調べたものを全部記載していく自分用備忘（もしも誰かの助けになれば幸い）

#npmのバージョンを上げる
```
npm install -g npm  
```
npm 5.0以降から各種installコマンド打つときに --save 入れなくて良くなった模様。自分のバージョンが4.X.Xだったので調べた
枝刈りによる学習モデルの小型化の効果

# 概要

「Chainer pruning」で検索すると以下のサイトがヒットする。

[ChainerでPruning - ニューラルネットの軽量化](http://tosaka2.hatenablog.com/entry/2017/11/17/194051)

pruningの利点はパラメータの削減だが、これによって学習モデルの容量削減も期待できる。今回はlossを低下
させない範囲でpruningを繰り返してどこまで学習モデルを削減できるかを検証する。

# 動作環境

- **Ubuntu** 16.04.4 LTS
- **Python** 3.5.2
- **chainer** 4.0.0
- **numpy** 1.14.2
- **cupy** 4.0.0
- **opencv-python** 3.4.0.12 

# 使用するコード

今回は以下のコードを使って検証を行っている。以下のコードの詳細については、コードが少し古いが[**ここ**](https://qiita.com/ka10ryu1/items/5dc38a32847ad6f2b0e8)を参照されたい。

[高圧縮jpeg画像のノイズを除去する](https://github.com/ka10ryu1/jpegcomp)

pruningに該当するのは`train.py`の`resume`を設定する部分である。今回はpruningなし、0.5、0.6、0.7と増やしていく。

```python3:train.py
# Resume from a snapshot
if args.resume:
    chainer.serializers.load_npz(args.resume, trainer)
    # Set pruning
    # http://tosaka2.hatenablog.com/entry/2017/11/17/194051
    masks = pruning.create_model_mask(model, args.pruning, args.gpu_id)
    trainer.extend(pruning.pruned(model, masks))
```

chainerのtrainerを使用している環境であれば、`Tools/pruning.py`と上記該当箇所の修正で利用できる。

# 学習結果

| epoch   | pruning | 学習モデル容量 [MB] | loss  | validation loss |
|:--------|---------|--------------------|-------|----|
| 0-100   |  -      | 64.5  | 0.002992 | 0.002654
| 100-125 | 0.5     | 39.5  | 0.002978 | 0.002623
| 125-140 | 0.6     | 33.3  | 0.002984 | 0.002621
| 140-150 | 0.7     | 26.9  | 0.003037 | 0.002646

lossが0.003を割りそうにないのでepochを150で止めた。しかし学習モデル容量は64.5 MBから26.9 MBまで40%以上の削減に成功した。

lossの全体像は以下の通り。

![loss.png](https://qiita-image-store.s3.amazonaws.com/0/227399/5e79d0a1-9670-1b21-b182-bd3643485945.png)

生成される画像については目視でpruningによる劣化がないことを確認した。ちなみに容量が減ったからといって処理時間が拘束になるという効果は期待できないので注意。

以上。
react native のライフサイクルにログを入れてみる

[前回投稿](https://qiita.com/qwed_qwed/items/24478684de1930cf9b62)にとりあえずログをいれる。

##storeが更新された場合##
ストア更新(profile/updateUid)
↓
Aスクリーン
↓
Bスクリーン
↓
ストア更新(profile/updateUid)
↓
Aスクリーン
<img width="953" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/7370/c6139a8c-7f16-bd92-f34a-c39f4098a267.png">

##setStateした場合##
```
❯ git diff
diff --git a/app/containers/Bscreen.js b/app/containers/Bscreen.js
index 477e965..c844821 100644
--- a/app/containers/Bscreen.js
+++ b/app/containers/Bscreen.js
@@ -50,7 +50,7 @@ class BScreen extends Component {
         <Text>{this.state.userName}</Text>
         <Button
           onPress={() => {
-            this.props.updateUid('JIRO');
+            this.setState({ userName: 'JIRO' });
           }}
           title="UPDATE name"
         />
```

もちろん、getDerivedStateFromPropsが呼ばれないだけ。

ストア更新(profile/updateUid)
↓
Aスクリーン
↓
Bスクリーン
↓
setState
↓
Aスクリーン

<img width="953" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/7370/375582d9-d3c1-6226-c738-cb32ac947fd6.png">

[ソースコード](https://github.com/n-qwed/sampleApp/tree/lifecycle)
Pythonで世界地図-9・matplotlibでグラフ(文字付き矢印)

Annotating text ドキュメント
https://matplotlib.org/users/annotations_intro.html

```python:
#!/usr/bin/python3
# coding: UTF-8

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

font = {'family': 'IPAGothic'}  # 日本語Fontを指定

lon1 = 135.0
lat1 = 35.0
lon2 = 2.0
lat2 = 2.0

map = Basemap(llcrnrlon=lon1-lon2,llcrnrlat=lat1-lat2,urcrnrlon=lon1+lon2,urcrnrlat=lat1+lat2,resolution='l',projection='cyl')

map.shadedrelief() #標高図

x, y = map(135.001485, 34.649376)
x2, y2 = (x-0.5, y-1)
#幅広テーパー矢印+テキスト
#plt.annotate('明石市立天文博物館', xy=(x, y),  xycoords='data',xytext=(x2, y2), textcoords='data',color='r',arrowprops=dict(arrowstyle="fancy", color='b'), **font)
plt.annotate('明石市立天文博物館', xy=(x, y),  xycoords='data',xytext=(x2, y2), textcoords='offset points',color='r',arrowprops=dict(arrowstyle="fancy", color='b'), **font)

x, y = map(135.432285, 34.665389)
x2, y2 = map(x-0.5, y-0.5)
#普通の矢印+テキスト
plt.annotate('ユニバーサル・スタジオ・ジャパン', xy=(x, y),  xycoords='data',xytext=(x2, y2), textcoords='data',arrowprops=dict(arrowstyle="->"), **font)

plt.show()
```

textcoords='data'の場合

![image.png](https://qiita-image-store.s3.amazonaws.com/0/238800/5226ae0e-3261-0c97-ed9d-57b5200574a8.png)

textcoords='offset points'の場合

![image.png](https://qiita-image-store.s3.amazonaws.com/0/238800/36fd0b85-e47d-22bc-1b93-6d420f070232.png)

#####matplotlibでグラフ

```python:
#!/usr/bin/python3
# coding: UTF-8

import matplotlib.pyplot as plt

font = {'family': 'IPAGothic'}  # 日本語Fontを指定

x, y = 0.5, 0.5
x2, y2 = (x+0.2, y+0.2)
#幅広テーパー矢印+テキスト
plt.annotate('文字', xy=(x, y),  xycoords='data',xytext=(x2, y2), textcoords='data',color='r',arrowprops=dict(arrowstyle="fancy", color='b'), **font)
#plt.annotate('文字', xy=(x, y),  xycoords='data',xytext=(x2, y2), textcoords='offset points',color='r',arrowprops=dict(arrowstyle="fancy", color='b'), **font)

x, y = 0.2, 0.2
x2, y2 = x+0.2, y+0.2
#普通の矢印+テキスト
plt.annotate('文字', xy=(x, y),  xycoords='data',xytext=(x2, y2), textcoords='data',arrowprops=dict(arrowstyle="->"), **font)

plt.show()
```

textcoords='data'の場合

![image.png](https://qiita-image-store.s3.amazonaws.com/0/238800/8cd9eb52-485f-9c20-9ed8-b26e5b50d219.png)

textcoords='offset points'の場合

![image.png](https://qiita-image-store.s3.amazonaws.com/0/238800/38806c5d-5b30-989c-5fee-c7b8bb1395a1.png)
Excel 2016 > ソルバーの条件を変えるとフリーズする

```txt:動作環境
Windows 8.1 Pro (64bit)
Excel 2016
```

### 症状

- Excelファイルにてソルバーを使っている
- 「ソルバーのパラメーター」 > 「制約条件の対象」 を変更して[OK]を押すとフリーズする

### 対処案 > シート名を変更する

1. シート名を変更する (例: 「00」->「00_」)
2. ソルバーの設定変更をしてソルバーを解く
3. シート名を元に戻す

問題のあるシート名に戻すと、ソルバーで固まる症状が復活する。
CircleCI2.0でPHPCPDを動かしたらエラーで中断される問題

## はじめに

PHPプロジェクトのCIをJenkinsからCircleCI(2.0)に乗り換えました。マネージドサービス最高！
その際に、Jenkins時代に動かしていたPHP CodeSniffer(PHPCS)やPHP Mess Detector(PHPMD)を動かしたのですが、PHP Copy/Paste Detector(PHPCPD)がExit code: 1を返してくるため、ビルドが失敗になってしまったのを解決しました。

ビルドエラーの図。Exit code: 1（右上）
![builderror.PNG](https://qiita-image-store.s3.amazonaws.com/0/14769/e4118f0f-1944-7ae2-2a58-34d3a1167deb.png)


## 結論

コマンドに || true を追加

```yml:.circleci/config.yml
- run:
  name: Run PHP-CPD
  working_directory: src
  command: ./vendor/bin/phpcpd app --log-pmd=/output/phpcpd.result.xml || true
```

成功の図
![success.PNG](https://qiita-image-store.s3.amazonaws.com/0/14769/51554e06-a477-a6d4-bc90-19c953af2108.png)


## 経緯

はじめに、PHPMDに存在する --ignore-violations-on-exitオプションが使えるだろうと思い調べたところ、公式GitHubのIssueが見つかりました。
[Option to exit with a zero code even if any violations are found. #148](https://github.com/sebastianbergmann/phpcpd/issues/148)


> 質問者
> CIで不便だからphpmdの--ignore-violations-on-exitみたいなやつ追加してくれないか
> 回答
> 役に立つとはおもわない

と、オプションによる解決はできませんでしたが、会話の中で出てきた「これで解決できるよ」という回答に救われたのでした。

```shell:shell
$ phpcpd ... || true 
```

## その他参考にしたページ

Identifying Exit Codes and their meanings
https://support.circleci.com/hc/en-us/articles/360002341673-Identifying-Exit-Codes-and-their-meanings
メモ: コンソールで入力を表示させない(Python)

# 結論
[termios](https://docs.python.jp/3/library/termios.html)モジュールで，端末の設定を変えてやればよい(一文字ずつ取るならばttyモジュールなどでもよさそう．)
以下のようなサンプルコードが載っている．

```python
def getpass(prompt="Password: "):
    import termios, sys
    fd = sys.stdin.fileno()
    old = termios.tcgetattr(fd)
    new = termios.tcgetattr(fd)
    new[3] = new[3] & ~termios.ECHO          # lflags
    try:
        termios.tcsetattr(fd, termios.TCSADRAIN, new)
        passwd = input(prompt)
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old)
    return passwd
```

何をやっているかというと，termiosのオプション（ビット列）に対してECHO（エコーバック）をするためのフラグを切っているのだと思われる．

# モチベーション
pythonで端末で遊べるゲームっぽいものを作るとしたとき，入力が一瞬でも表示されるのは嫌だなと思ったが，入力を表示させない方法としてググっても出てきたのがgetpassを使うという内容ばかりだった．C++に対しては[ここ](https://stackoverflow.com/questions/6899025/hide-user-input-on-password-prompt)で[解答](http://www.cplusplus.com/forum/beginner/43683/)が示されていたが，pythonはあまり見当たらなかったので探した．
まあコンソールで遊べるゲームを使うならば，cursesなどのもう少し高水準なライブラリを作るのがよさそうである．