OmniAICreator/Qiita-1.07M huggingface dataset:
Rails5で初めてのPostgreSQLを使うときの手順とエラー解消方法[メモ]


[参考：インストールからRails-PostgreSQL環境を整える](https://qiita.com/torini/items/9952d91c4a7087b23481)
[参考：RailsでPostgreSQLの情報を確認する](http://tamata78.hatenablog.com/entry/2015/09/24/224839)
[参考：rails側のエラー](https://github.com/enPIT-Tonika/tasquel/issues/44)
[参考：Railsアプリケーションを作ろう：PostgresからScaffold](https://dotinstall.com/lessons/basic_heroku/28805)

結構時間がかかったが、これで何とかなった。
Rails5の構築にも慣れてきて、SQLiteからPostgreSQLへ変更して、「さてHerokuでも接続するか」で躓いたところ。

#確認事項
まずOS(Ubuntu)にPostgres入ってないから。
なのでインストールする。

入っているか入っていないのかは

```
$ psql --version
```

このコマンドで確認できる。

```
$ sudo apt-get install postgresql
$ /etc/init.d/postgresql status
$ sudo -u postgres psql
```

```
postgres=# create role projectname with createdb login password 'password';
postgres=# \q
```

\qで退出できる。忘れると消さないといけないので忘れない様に。
だいたい.q だの\q だの quit なので覚えておく様に。

```
$ rails new mymemo -TB --database=postgresql
$ cd mymemo 
$ sudo apt-get install libpq-dev
```

```Gemfile
gem 'therubyracer', platforms: :ruby
gem 'jquery-rails'
```

```
$ bundle install
```

```config/database.yml
default:
  adapter: postgresql
  encoding: unicode
  pool: 5
  # 3つを追加
  username: mymemo
  password: password
  host: localhost
```

```
$ rake db:migrate
```

##ここでエラーが出た。
何度か消したりやり直したりしたせいの様だ。

```
PG::DuplicateTable: ERROR:  relation "memos" already exists
ActiveRecord::StatementInvalid: PG::DuplicateTable: ERROR:  relation "memos" already exists
```

簡単に翻訳すると既に memos テーブルあるよってこと。

# 簡単な方法(追記)
```
$ rails db:migrate:reset
```

テーブルの削除とマイグレーションを一緒にやってくれるコマンド。
これで一発解消。

 
## ここからPostresqlのテーブルを消す(旧方法)
Postgresqlに入って修正する方法

```
$ rails dbconsole
```

Postgresに入る。
\l　のコマンドで一覧を表示

```
mymemo_development=> \l
```

で該当するテーブルを削除する

```
mymemo_development=> drop table memos;
\q
```

```
$ rake db:migrate
== 20180523015057 CreateMemos: migrating ======================================
-- create_table(:memos)
   -> 0.0133s
```
これでもう一回データベースをマイグレートしてOK。

```
$ rails s
```

でサーバー起動して確認。
無事動いている！

## rails sで起動しないとき
```
$ rails s -b 192.168.xxx.xxx 
```

IPアドレスを打つと起動できます。
「-d」じゃなくて「-b」だから。
matplotlib, seabornをコマンドのみで最速日本語化（Ubuntu, Google Fonts）

# 目的
文字化け（いわゆる豆腐くん）を
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195903/2c573d7f-a8fb-5e0e-c9e5-8d13532cb04f.png)

こうする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/195903/4b3808d8-2dc1-abfc-b29a-9deb9094abc1.png)

# バージョン

```
# python -V
Python 3.6.5
# pip list | grep -e seaborn -e matplotlib
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
matplotlib (2.2.2)
seaborn (0.8.1)
```

# 結論

```
# 1,Download font
wget https://noto-website-2.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip

# 2,unzip
unzip NotoSansCJKjp-hinted.zip

# 3,Check Directory
python

Python 3.6.5 | packaged by conda-forge | (default, Apr  6 2018, 13:39:56)
[GCC 4.8.2 20140120 (Red Hat 4.8.2-15)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib
>>> matplotlib.matplotlib_fname()
'/opt/conda/lib/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc'  <- this is config file.

# 4,Copy fontfiles
cp NotoSansCJKjp-*.otf /opt/conda/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/

# 5,Copy config file to home directgory
cp /opt/conda/lib/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc ~/.config/matplotlib/

# 6,Edit font settings(add last row)
vim ~/.config/matplotlib/matplotlibrc
>>> font.serif:Noto Sans CJK JP
>>> font.sans-serif:Noto Sans CJK JP

# 7,seaborn setting
 vim /opt/conda/lib/python3.6/site-packages/seaborn/rcmod.py

>>> # Line80
>>> def set(context="notebook", style="darkgrid", palette="deep",
>>>         font="Noto Sans CJK JP", font_scale=1, color_codes=False, rc=None):

>>> # Line189
>>> "font.family": ["Noto Sans CJK JP"],
>>> "font.sans-serif": ["Noto Sans CJK JP", "Arial", "DejaVu Sans", "Liberation Sans",
                              "Bitstream Vera Sans", "sans-serif"],

# 8,remove font cache
rm -Rf ~/.cache/matplotlib/*

```

# 説明
- matplotlibのフォントは、デフォルトでは日本語対応していない。
- 今回はGoogleのフォントを利用したが、UbuntuなのでtakaoフォントでもOK。
- .ttf, .otfファイルなら、その他IPAフォントなどでも可能。ダウンロードと、ファイルの配置の部分だけ読み替えればOK。
- フォントファイルを置く場所や、matplotlibrc（設定ファイル）の置き場所は環境によって異なる。なのでpythonコマンドで確認している（3,Check Directory）。ちなみに、pythonコマンドを終了するときはCtrl + D。
- matplotlibはフォントデータをキャッシュする機構があるため、キャッシュを削除しないと反映されない（7,remove font cache）。
- Jupyter Notebookを起動中の場合は、念のためRestart Kernelすること。
create-react-appでlocalのbackgroundImageが表示されない時の対処法

#背景
Reactのcreate-react-appを使って作業していました。ランディングページの上の方に背景画像をつけておしゃれにしようとして、cssのbackgroundImageでローカルの画像を表示しようとしたのですが、少しハマったので共有しておきます。

#環境
react - 16.3.2

#方法
localの画像をbackgroundImageで表示するには最初にimportをしなければなりません。

```javascript
import foo from './hoge.jpg'
```

からの

```javascript

const style = {backgroundImage:`url(${foo})`}
```

です。大事なのは

```javascript
import './hoge.jpg'
```

のようにしてもimportされないこと。僕ははじめこのようにimportしていたのでずっと死んでいました。


#おわりに
こんなことで記事を書くなと言われそうですが、とりあえずQiitaに投稿してみたかったので許してください。今度投稿する時はもっと面白い記事を書きます。
読んでおきたい記事まとめ

#読んでおきたい記事まとめ
個人的に読み直したい記事などをまとめておく。随時追加していく予定


- seleniunの開発背景  
https://codezine.jp/article/detail/10225

- werckerの仕組み
https://deeeet.com/writing/2014/10/16/wercker/

- rbenv + ruby-build はどうやって動いているのか
http://takatoshiono.hatenablog.com/entry/2015/01/09/012040

- railsコンソールでPostgreSQLの情報を確認する
http://tamata78.hatenablog.com/entry/2015/09/24/224839
アイコンタイプのよくあるローディング用SCSSモジュール（ちょっと汎用性あるやつ）

こういうのよく使って便利ですよね

## アイコン風に使えるLoading
ちょっとしたローディングステータスを表現したいときにお使いください。

<p data-height="398" data-theme-id="0" data-slug-hash="deLvmz" data-default-tab="result" data-user="mtmtkzm" data-embed-version="2" data-pen-title="SCSS Loading Circle Animation" class="codepen">See the Pen <a href="https://codepen.io/mtmtkzm/pen/deLvmz/">SCSS Loading Circle Animation</a> by rider (<a href="https://codepen.io/mtmtkzm">@mtmtkzm</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

![5月-23-2018 12-03-32.gif](https://qiita-image-store.s3.amazonaws.com/0/82699/d5881655-3c3d-2344-58a5-883e11f8b7a3.gif)

## 説明

```
loading-icon ($size:50px, $color:orange, $bg-color:white)
```

デフォルトでは、「白背景でオレンジの50pxの円が回る」ようになっています。上記CodePenデモの左側です。
サイズに関しては 単位付きで渡してあげてください。
忘れやすい人のための三項演算子の省略形【PHP】

# まえがき

PHPの三項演算子は場合によって省略形で書けることがありますが、省略形が2つあってどっちがどっちだか分からなくなる(自分だけ？)のでメモとして残しておきます。
そもそも論として「三項演算子は可読性が下がるからやめよう」的な話は昔からあるのですが、そういった宗教戦争はここではおいておきます。Qiita内にもたくさん記事があるのでそちらを参照してください。個人的には「好きにすりゃええんじゃ...！ (cv. 千鳥ノブ)」という感じです。

- [三項演算子?:は悪である。](https://qiita.com/raccy/items/0b25b2f106e2a813828b)
- [三項演算子は悪か？](https://qiita.com/stkdev/items/cbb83cbd9921b9f755a4)
- [条件演算子（三項演算子）を可読性低いとか言わせない](https://qiita.com/yuba/items/9832c26dc1498e0017bb)

# エルビス演算子 `?:`

これはPHP 5.3以降で登場した記法で、

```php5
$a ? $a : $b;
```

という場合には、


```php5
$a ?: $b;
```

と書けるというものです。一見分かりづらいように思えますが、

```php5
const DEFAULT_NAME = '以下、名無しにかわりましてVIPがお送りします';

public function postComment(string $comment, string $name = '')
{
    $displayName = $name ?: self::DEFULT_NAME;

    // (ellipsis)
}
```

```php5
public function getFavoriteList(): FavoriteList
{
    $favoriteList = $this->favoriteRepository->get($this->userId); // FavoriteList or null

    return $favoriteList ?: new FavoriteList([]);
}
```

などの例のように、 **デフォルト値** として使うと可読性を下げずに短く書けるかと思います(下の例はそもそもRepositoryがList返しておけよという感じですがまぁ...)。今さらですが[日本語公式リファレンス](http://php.net/manual/ja/language.operators.comparison.php)を引用。

> PHP 5.3 以降では、三項演算子のまんなかの部分をなくすこともできるようになりました。 式 expr1 ?: expr3 の結果は、expr1 が **TRUE** と同等の場合は expr1、 それ以外の場合は expr3 となります。

つまり、 **false**, **null**, **0**, **''(空文字)**, **[]\(空配列\)** などのときのデフォルト値として使えます。便利ですね。

# null合体演算子 `??`

こちらはPHP 7から登場した記法で、エルビス演算子同様にデフォルト値として使うことができるのですが、大きな違いは存在しない値にアクセスしてもPHP Noticeを出さないという点です。

> 式 (expr1) ?? (expr2) は、 expr1 が NULL である場合は expr2 と評価され、それ以外の場合は expr1 と評価されます。
> この演算子は、左側の値が存在しない場合でも notice が発生しません。 isset() と同じ挙動です。

これは配列を扱う時に非常に便利です。

```php5
public function __construct(array $config = [])
{
    $this->handler  = $config['handler'] ?? new DefaultHandler();
    $this->callback = $config['callback'] ?? null;
    $this->trial    = $config['trial'] ?? 10; 
}
```

ただし注意が必要なのは **isset()と同じ挙動** なので、falseや0、空文字などは真と判断され左側の値が使われます。このへんの型比較は意外と忘れがち(自分だけ？)なので一応[リンク](http://php.net/manual/ja/types.comparisons.php)を貼っておきます。

```php5
$value = '';

echo $value ?: 'Hello World!'; // Hello World!

echo $value ?? 'Hello World!'; // (No Output)
```

また、当然ながら評価する前にアクセスしようとするとNoticeが発生します。

```php5
unset($url);

$path = str_replace('https://mangamura.org/', '', $url) ?? 'home'; // Notice
```

```php5
$queryParameters = [
    'searchWord' => 'コナン',
    'replyWord'  => '真犯人は...',
];

$currentPage = (int)$queryParameters['page'] ?? 1; // Notice
```

こういうケースでは素直に省略せずに書くか、そもそもこの処理にくる以前のロジックフローを見直す方が良いでしょう。それと仮にできたとしてもこのような書き方は可読性が下がるので、アンチ三項演算子派の方々に怒られそうですね。

# まとめと使い分け

- **false** と等価な値をデフォルト値で置き換えたい -> エルビス演算子 `?:`

- 未定義や配列の存在しないIndexの可能性がある値にデフォルト値をセットしたい -> null合体演算子 `??`

- 存在していないまたはfalseと同等なら置き換えたい -> `!empty($undefined) ? $undefined : $default;` とでもするしかない

という感じでしょうか。一応例に出したものは動作確認を行った(PHP 7.2.5)はずですが、間違い等ありましたら指摘していただけると助かります。
goconveyでsetUp, tearDownのタイミングを理解する

## 概要
Goのテストツールである[goconvey](https://github.com/smartystreets/goconvey)を雰囲気理解で使用しているので、`setUp`や`tearDown`な処理をするために
どう記述するのがいいのか確認したのでメモ。

```conv_test.go
package sample

import (
	"testing"

	"fmt"

	. "github.com/smartystreets/goconvey/convey"
)

func TestConvey(t *testing.T) {
	Convey("テストケース", t, func() {

		fmt.Println("setUp")

		Convey("テストA", func() {
		})

		Convey("テストB", func() {
		})

		Reset(func() {
			fmt.Println("tearDown")
		})
	})
}
```

## 実行結果
verboseオプション付きで実行

```
$ go test -v sample/conv_test.go   
```

出力結果 (少し整形)

```
=== RUN   TestConvey

  テストケース

setUp

    テストA tearDown
setUp

    テストB tearDown



0 total assertions
```

`fmt.Println("setUp")`で出力した通りにsetUp処理をして、tearDownは`Reset()`で行う。
これで事前処理、事後処理が出来る。

## 参考
* [公式Wiki-setUp](https://github.com/smartystreets/goconvey/wiki/Execution-order)
* [公式Wiki-tearDown](https://github.com/smartystreets/goconvey/wiki/Execution-order)
Laravel ORMで副問合せして順位まで取得する


LaravelでDBのデータを順位付けしたいときってありますよね！
僕はありました！


## 順位取得SQL

まずSQLの準備です。
データの順位は下記のSQLで取得できます。

```rank.sql
SELECT id,
       score,
  (SELECT count(score)
   FROM summaries as b
   WHERE a.score < b.score) + 1 as rank
FROM summaries as a
WHERE a.score IS NOT NULL
ORDER BY rank ASC
```
この副問合せをLaravelのクエリビルダで書き直します。

## Laravel副問合せ構文

副問合せはそのまま`DB::raw()`で書くのがいいっぽいです。

```
DB::table('table')
			->select(
				DB::raw(
					('select文')
				)
			)
			->get();
```


[参考: Laravel - How to make subquery in select statement?](https://itsolutionstuff.com/post/laravel-how-to-make-subquery-in-select-statementexample.html)

これで準備が整いました。


## 実際のORM

```SummaryRepository.php

public function getRanks()
{
	return DB::table('summaries as a')
		->select(
			'id',
			'score',
			DB::raw(
				"(select count(score) FROM summaries b WHERE a.score < b.score) + 1 as rank"
			)
		)
		->whereNotNull('a.score')
		->orderBy('rank', 'ASC')
	->get();
}
```

`->get()`を`->toSql()`に変更して生成されたSQLを確認すると上述のSQL文が発行されていることがわかります。

これでDBから順位付けされたデータが取得できます！めでたし。
ASP.NET Coreでメッセージリソースを使用

# ASP.NET Core MVCアプリケーションのViewに出力する文言をリソースファイルから取得する
## やりたいこと

- ASP.NET Core MVCのView(cshtml)に出力する文言をリソースファイルから取得したい
- 多言語対応の予定は無し
- すでにリリース済みのアプリへの対応のためできるだけシンプルに

## 実現手順
1. リソースファイルの格納フォルダを作成
    - ソリューション直下でも良いが、リソースファイルを複数ファイル化する時のために専用の置場を準備する
    - ex.[プロジェクト名]\Resources

2. リソースファイルを作成
    - 1のフォルダ上で右クリック, 追加→新しい項目の追加→ASP.NET Core→リソースファイルで名前を付けて「追加」
    - ex.HogeResources.resx

3. リソースファイルを編集
    - 2のファイルをGUIのデザイナーで編集。名前, 値, コメント(任意)を設定
    - ex. 名前：fugafuga, 値：ふがふが
    - アクセス修飾子を「Public」で保存　→　HogeResources.Designer.csを自動作成
　
4. view(cshtml)でリソースファイルの項目を参照
    - HogeResources.Designer.csにリソースファイルに記述した名前のpublic staticプロパティが ある
    - `@[プロジェクト名].Resources.HogeResources.fugafuga`　→　//「ふがふが」と出力
超初心者が学ぶgit

##背景　
18卒文系未経験ながらエンジニア配属になった僕がトレーナーの方と共にgitを勉強していく話です。 
バージョン管理システムって何？gitって何それ美味しいの？レベルです。 
一通り勉強したことの備忘録。 

##勉強時間 
おおよそ５時間 

##勉強サイト 
[猿でもわかるgit入門](https://backlog.com/ja/git-tutorial/) 
[git flowとgithub flowとは？その違いは？](https://qiita.com/mint__/items/bfc58589b5b1e0a1856a) 

##やったこと　
* 「猿でもわかる〜」を一読し言葉の理解をする (チュートリアルは飛ばしました)
* 　コマンドを一覧にする 


``` 
## ターミナルでのGitの使い方 

### 基本的な操作
* git init リポジトリの初期化 
* git add フォルダ名/ファイル名　インデックスにファイルを追加 
* git commit リポジトリの履歴を記録 
* git log コミットログを確認
* git status　変更したファイルを表示する 
* git diff --color　どこが変わったか色を変えて表示する 
* git commit -am "コードレビューに向けて"　コメントをつけてコミット(save)する
* git remote -v フェッチ先とプッシュ先を表示

### ブランチ操作  
* git branch　今あるブランチの一覧を表示 
* git branch　◯◯　新しいブランチをつくる 
* git push origin(リポジトリ名) master(ブランチ名)    　  originというリポジトリのマスターにプッシュする 
* git reset --hard HEAD^ 一つ前のコミットに戻れる 
* git checkout text(ブランチ名)　textというブランチに移動する 
* git checkout -b ブランチ名 ブランチを作成し、切り替える
* git merge test 今いるブランチにtestの内容をマージする(上書き）

### リモートリポジトリ操作
* git remote add  リモートリポジトリを登録 
* git clone リモートリポジトリを取得 
* git pull 最新のリモートリポジトリブランチを取得 
```
* backlogにファイルをアップするためにコマンドをしようしてみる 


## 感じたこと 
* コマンドは打たないと覚えない。
* 実際のプロジェクトに参加するまではgitflowの実感はわかないんだろうな。 
* 「猿でもわかる〜」は本当にわかりやすい。 
* コミット、ステージング、インデックスの関係が最初は理解できなかった。 
→ファイルをステージングすることで次のコミットに含める。ステージした内容を保持する領域がインデックス。
PhotoshopからSwipeを作成するSwipeGenerator

# Swipeとは
Swipeとは、JSON形式の宣言型のマークアップ言語で記述されるオープンなリッチメディアコンテンツです。Swipeのファイルを表示するSwipe EngineはiOS, javascript, Android版と様々なバージョンが用意されています。すべてオープンソースで提供されています。
https://github.com/swipe-org/swipe  (iOS)
https://github.com/swipe-org/android  (androin)
https://github.com/isamu/swipejs (javascript)

Swipeファイルは、iOS版とweb版のSwipe Studioで作成するか、直接JSON形式のファイルを記述することが可能です。

https://studio.swipe.net/studio/#0  (Swipe Studio on Web)
https://itunes.apple.com/us/app/swipe-studio/id1148461767 (Swipe Studio app)

# PhotoshopのGeneratorとは
PhotoshopのGeneratorは、開発者がPhotoshopを拡張するために用意されている環境で、プログラムによりPhotoshopの機能を追加することができます。具体的にはユーザのアクションなどのイベントによりnodeで記述されたプログラムが呼ばれ、そのプログラムからPhotoshopのデータを読みファイルを生成するなどができるような仕組みになっています。Photoshopの14.1以降で利用できるようです。

# SwipeGeneratorとは
SwipeGeneratorは、PhotoshopのGeneratorを使って、Swipeファイルを生成する機能です。Photoshopのレイヤーを使って、各レイヤーグループを１つのページとし、レイヤーグループ内に配置された各レイヤーの画像をelementとしてSwipeファイルを生成します。

# インストール
SwipGeneratorは、以下からダウンロードできます。
https://github.com/isamu/swipeGenerator/archive/master.zip
ダウンロードしたファイルは、解凍してPhotoshopのGeneratorのディレクトリーにおきます。
Macでは、 /Applications/Adobe Photoshop CC 2018/Plug-ins/Generator  でした。
このフォルダの中に、解凍したswipeGeneratorフォルダをおきます。
<img width="790" alt="スクリーンショット 2018-05-24 7.57.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/25071/4adf2d2a-d63c-3627-8ddc-8a7efb70aa70.png">


これでインストールはおしまいです。

# 使い方

Photoshopを起動します。インストールが成功していれば、
ファイル -> 生成 -> に Generate swipeというメニューが追加されています。

<img width="646" alt="スクリーンショット 2018-05-23 11.02.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/25071/fd3b9abf-fb61-fa72-3e11-e5e6bd0cabce.png">

画像を配置した複数のレイヤーを１つのレイヤーグループにまとめます。この例ではpagesグループに各ページのレイヤーグループを配置しています。

<img width="930" alt="スクリーンショット 2018-05-23 11.41.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/25071/5a33c48b-7fe5-a915-2cf2-58070ed1ee5d.png">

先ほどのメニューから「Generate swipe」を選択します。選択すると直ちにSwipeファイルが生成され、コンピュータのデスクトップに、フォトショップのファイル名と同じ名前のフォルダーが生成されています。
その中のmain.swipeがswipeファイルです。 index.html をブラウザで開くとそのswipeファイルのコンテンツが表示されます。 index.htmlはjavascript版のSwipe Engineを読み込むようにしているので、そのままHPなどにアップすればコンテンツとして利用可能です。
生成されたコンテンツをWebに置いておきます。
http://to-kyo.to/~isamu/swipe_test/#0


# 関連

[PhotoshopとSwipeGeneratorでアニメーションを作る １](https://qiita.com/isamua/items/ef9b7bafdb7422ebbcc9)
[PhotoshopとSwipeGeneratorでアニメーションを作る 2](https://qiita.com/isamua/items/c6cf8d41d14f20e98001)
玄人プログラマでもやりがちなあるある難読プログラム

**全部実際にあったことです #大手の子会社 #ベンチャー**

## 変数を持ち替えすぎている

例：
`var w = window`, `var d = document`
とするパターン。

- 変数を検索しずらい。
- 別の人が「wってなに?dって??」となる。

## 単体テストできない関数...

```javascript

  function getAttributeWithPrefix(elem, symbol, defaultValue) {
    return elem && elem.getAttribute(prefix + symbol) || defaultValue;
  }
```

`prefix`変数の定義がどこかにコードに埋もれていたなら、もうテストしんどいぞ。。

外から変数持ってくるのやめなさい。

## 関数がファット

難読玄人「わかってはいるけど、負債の積み重ねでどうしても、、。」

## try catch文の多用

なぜ多用するのか未だに理解不能、、。

## なぜかオブジェクト指向で書いていない

書くとすっきりするコードに限って書いていない、、。

## 意外と密結合

- 特にクラス内のメソッド同士。
- いやふつうの関数同士でもやべぇやつがいる...

## キャメルケースとスネークが入り乱れる

- 意外とやりやがる難読玄人が多い...
- 属性から値を貰おうがテンプレートエンジンの変数だろうが、**いかなる理由でも**統一すべき。。

## やばい命名。

- メソッド名、関数名 が 名詞、過去形。。
- 過去形にした理由はコールバック用だと思うが、ナンセンス過ぎるだろ。。 そもそも汎用性もない。

## そのくせいちゃもんが多い

- 難読玄人「メモリの消費に関して徹底的にこだわりたいのだ、、！」
- 難読玄人「ファイルの末行は改行を！」
- 難読玄人「`{`の前には半角スペースを！」

前に進まぬ、、！
NestedScrollView内のRecyclerViewが慣性スクロールしない



こんなレイアウトxmlを使ったところ、RecyclerViewをスクロールしても指を離すとすぐにスクロールが停止してしまい、慣性スクロールしなかった。

```xml
<NestedScrollView>
  <LinearLayout>
    <なんかビュー/>
    <RecyclerView/>
</NestedScrollView>
```  

解決方法は `recyclerView.isNestedScrollingEnabled = false` と isNestedScrollingEnabledをfalseにすること。なんか混乱しますね。

# 注意
NestedScrollViewでRecyclerViewをラップすると、リサイクルされない。
かつ見えてるアイテム以外もonCreateViewHolderはしっちゃうから、アイテム数が限定的なところ以外では使わないほうが良さそう。

https://stackoverflow.com/questions/37590651/recyclerview-does-not-recycling-views-when-use-it-inside-nestedscrollview
KotlinからFirestoreにデータ登録するとBooleanのプロパティ名のisが除去される


ちょっとハマりました。
kotlinでfirestoreにデータ登録するときは、kotlinのオブジェクトをそのまま登録できて便利です。

しかし次のように`is`から始まるプロパティ名でBooleanのプロパティが定義されていると、Firestoreに登録されるデータのフィールド名は `valid` となってしまいます。

```kotlin
class Hoge{
  var isValid:Boolean? = null
}
```

どうやらFirestoreのSDK内で変換される際に、このようになってしまう模様。

@GengroHirano さんにアドバイスいただき、`PropertyName`アノテーションを使う方法で解決できることがわかっています。

```kotlin
import com.google.firebase.firestore.PropertyName
class Hoge{
  @set:PropertyName("isValid")
  @get:PropertyName("isValid")
  var isValid:Boolean? = null
}
```

ちなみに先頭が`get`のものも怪しそう、試してないですが。。

FirestoreのSDKのソースコードって公開されてないのかな？
OracleとSQL メモ

久しぶりすぎて、ほとんど微かな記憶となってしまったため
個人的なOracle関連の覚え書きです。

# sqlplus

## 接続

```
sqlplus ユーザ/パスワード@接続先
```

接続先は、tnsnames.oraに記載されてる。
配置場所は「$ORACLE_HOME/network/admin」を目安に探す。

### 自分だけの接続先設定を作りたい
単体テストでたまに、接続先を変更したいときに便利。
環境変数TNS_ADMINを設定しておく。
加工したtnsnames.oraを環境変数に指定したpathに配置する。

```shell
# 例
export TNS_ADMIN="/home/uesr/hoge"

```

[6 ローカル・ネーミング・パラメータ(tnsnames.ora)](https://docs.oracle.com/cd/E16338_01/network.112/b56287/tnsnames.htm)


# NLS_LENGTH_SEMANTICS
 文字数を、数えるときに、なにで数えるかを決める設定。

- 確認方法
`select * from V$NLS_PARAMETERS where parameter = 'NLS_LENGTH_SEMANTICS'`
value列が、[BYTE]なら文字数はByte単位になる。
[CHAR]なら文字数はChar単位になる。

- 一時的に変更する方法

```sql

ALTER SESSION SET NLS_LENGTH_SEMANTICS='CHAR';
ALTER SESSION SET NLS_LENGTH_SEMANTICS='BYTE';
```

# ALTER SESSION ~
データベースとの接続を切断するまで有効となる設定
[Oracleマニュアル 11g](https://docs.oracle.com/cd/E60665_01/db112/SQLRF/statements_2013.htm)

- date型のフォーマット変更 <br>
`ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS';`

# 文字列は、シングルクォーテーションで囲む

```sql

select 'hoge' from dual;
```


# Oracle Application Express
oracleをインストールしなくても、WEBブラウザでSQLやPL/SQLを試せる。
全部出来るわけじゃないけど、便利。
無料でこれだけできれば、ありがたい。
[apex.oracle](https://apex.oracle.com/jp/)

# 制約

## 一意制約(UNIQUE KEY)

- テーブルデータ内で重複を許可しない
- 複数の項目を指定できるが、値がNULLでもいい

```sql

・テーブル定義
CREATE TABLE uniq_tbl
  (
     id   number(2) ,
     c    CHAR(8),
     s    VARCHAR(255),
     UNIQUE (id, c)
  ) 

・データ確認
select * from uniq_tbl


・データ追加
1回目：⇒OK
insert into  uniq_tbl VALUES(1,'c','aaa')
insert into  uniq_tbl VALUES(2,'c',null)
2回目：⇒NG「ORA-00001: 一意制約(SNNO.SYS_C0074917443)に反しています」
insert into  uniq_tbl VALUES(3,'c',null)



```

## 制約の確認

```sql

・制約の確認
select table_name, constraint_name, CONSTRAINT_TYPE,status from user_constraints where table_name = 'XXX';

```
ElasticBeanstalk with sinatra

環境構築
====

### eb cliのインストール

https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-install.html

    pip install awsebcli --upgrade --user
    pyenvを入れている場合、--userの指定は不要

dockerfile

    FROM ruby
    ここでrubyとしか指定していないが、自動的にdebianイメージになる模様

https://42-design.work/technology/docker-multibyte/

### ローカルでsinatraアプリのモックを作る

    ruby -v
    >ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-darwin16] #rbenvの環境がある前提

Gemfile作成

    vim Gemfile

最低限のインストール

    source 'https://rubygems.org'
    gem 'sinatra'

bundle installする

    bundle install

軽量web serverのthinを入れ、そいつを起動するshotgunを入れる

https://github.com/rtomayko/shotgun

起動

    bundle exec shotgun main.rb

    == Shotgun/Thin on http://127.0.0.1:9393/
    Thin web server (v1.7.2 codename Bachmanity)
    Maximum connections set to 1024
    Listening on 127.0.0.1:9393, CTRL+C to stop
    127.0.0.1 - - [30/Jan/2018:16:39:35 +0900] "GET / HTTP/1.1" 200 3 0.0295

これで、127.0.0.1:9393にアクセスするとなんか出る

ActiveRecord

sinatra用activerecordを入れる

    https://github.com/janko-m/sinatra-activerecord

dbに接続する

    require 'sinatra/activerecord'

これでconfig/database.ymlがあれば自動的に読み込んでくれる

接続

    ActiveRecord::Base.connection.execute('select now()').first

こんなエラー

    uninitialized constant ActiveRecord::ConnectionAdapters::RedshiftAdapter::PGconn


PGconnという定数が未定義なのが原因なのだが、理由がわからん

    vim /Users/hokaron/.rbenv/versions/2.3.0/lib/ruby/gems/2.3.0/gems/pg-0.21.0/lib/pg.rb
    autoload :PGconn,   'pg/deprecated_constants' # ここで読み込んでいる

deprecated_constantsってのは明らかに怪しい
中身を見ると

    The PGconn, PGresult, and PGError constants are deprecated, and will be removed as of version 1.0.

とばっちり書いてある

    bundle show
    pg (1.0)

お前か・・

Gemfile更新

    gem 'pg', '~> 0.20.0'
    bundle update pg

これでOK。疲れたよパトラッシュ・・(activerecordって依存関係にうるさすぎ)
ちなみにactiverecord5のredshift-adapterでもだめでした。

SQLのテンプレートはerubisを使用(書き方はerbとほぼ同じ)

Sinatraの実行環境の指定

http://d.hatena.ne.jp/riocampos+tech/20150201/study_sinatra

なぜかrubyコマンドでサーバーも起動。なぜだろう

    ruby myapp.rb [-h] [-x] [-e ENVIRONMENT] [-p PORT] [-o HOST] [-s HANDLER]

何気に入れているsinatra-contribはすごいやつらしい

https://qiita.com/ma2saka/items/8e377fdc5f29bdb0ea66
AWS CLI

AWS CLI
=======

bash環境でno_proxyの環境変数をセットしているとawsネットワーク環境に届かない
こうなる

    botocore.vendored.requests.exceptions.ConnectionError: ('Connection aborted.', OSError(51, 'Network is unreachable'))

その場合は、

    unset no_proxy


### デバッグ

    aws ec2 describe --debug
GAE/SE+GoのDockerイメージ

こんにちは、[@akifumifukaya](https://twitter.com/akifumifukaya)です。
GAE+GOでサーバーサイドを開発しており、Docker対応したのでメモを残しておきます。

# ベースイメージの選択

はじめに今回作成するイメージのベースイメージを決めます。
以下に、調べたものを残しておきます。

## ベースイメージ候補

### 1. [debian](https://hub.docker.com/_/debian/)

debianイメージをベースとして、一から環境構築を行う方法です。
まっさらなdebian環境となるので、様々なカスタマイズが行えます。
その代わり、必要な設定は全部書く必要があります。

例）Dockerfile

```
FROM debian:jessie
```

### 2. [golang](https://hub.docker.com/_/golang/)

Golangが入っている環境です。
任意のバージョンの入れることができます。

例）Dockerfile

```
FROM golang:1.8
```

### 3. [mercari](https://hub.docker.com/r/mercari/appengine-go/)

Mercari, Intが作成・運用しているイメージです。
複数バージョン対応しているので、使い勝手が良さそう。

Githubでも公開されています。
https://github.com/mercari/docker-appengine-go

### 4. [Cloud SDK](https://hub.docker.com/r/google/cloud-sdk/)

Cloud SDKが入ったイメージです。
GAEで開発する行う場合、gcloudコマンドが必要となるためGoogle Cloud SDKは必要となります。

例）Dockerfile

```
FROM google/cloud-sdk:alpine
```

今回は、[google/cloud-sdk:alpine](https://hub.docker.com/r/google/cloud-sdk/)をベースイメージとして、イメージを作成しようと思います。

# 構築

## Golangのインストール

`google/cloud-sdk:alpine`には、Golangが入ってなかったので、インストールします。
https://golang.org/dl/ からGolangをダウンロードすることができます。
今回は、Golang 1.8.3をインストールすることにしました。

```
ENV GO_VERSION 1.8.3
RUN curl -Lso go.tar.gz "https://dl.google.com/go/go${GO_VERSION}.linux-amd64.tar.gz" \
    && tar -C /usr/local -xzf go.tar.gz \
    && rm go.tar.gz
```

インストール後、goのパスも忘れずに通しておきましょう。

```
ENV PATH /usr/local/go/bin:$PATH
```

## depのインストール

※こちらはdepを使用している方のみとなります。

[golangのインストール](https://qiita.com/akifumi1118/items/5b2e1e87fc6526b828bb#golangのインストール)でgoパスを通したので`go get`でインストールできます。

```
RUN go get -u github.com/golang/dep/cmd/dep
```

## GAE SDKのインストール

GAE for GoのSDKをインストールします。

```
RUN gcloud components install app-engine-go
```

⚠️注意点⚠️

`/google-cloud-sdk/platform/google_appengine/appcfg.py`の実行権限がなく、パスも通っていなかったので注意してください。
`appcfg.py`を実行したい方は対応が必要です。
自分の場合は、以下のように対応しました。

```
RUN chmod 755 /google-cloud-sdk/platform/google_appengine/appcfg.py
ENV PATH /google-cloud-sdk/platform/google_appengine:$PATH
```

# Dockerfile

以下が、最終的な`Dockerfile`です。

```
FROM google/cloud-sdk:alpine

ENV GOPATH /go
ENV PATH $GOPATH/bin:/usr/local/bin:$PATH

# Install Go
ENV GO_VERSION 1.8.3
RUN curl -Lso go.tar.gz "https://dl.google.com/go/go${GO_VERSION}.linux-amd64.tar.gz" \
    && tar -C /usr/local -xzf go.tar.gz \
    && rm go.tar.gz
ENV PATH /usr/local/go/bin:$PATH

# Install dep
RUN go get -u github.com/golang/dep/cmd/dep

# Install GAE for Go SDK
RUN gcloud components install app-engine-go
RUN chmod 755 /google-cloud-sdk/platform/google_appengine/appcfg.py
ENV PATH /google-cloud-sdk/platform/google_appengine:$PATH
```

GAE/SE+GoのDocker環境構築の記事があまりなかったので、参考になればと思います。

参考
http://takaya030.hatenablog.com/entry/2017/07/08/181136
https://qiita.com/wasnot/items/b8691bb4940e6f4a9c24
https://medium.com/@timakin/gae-goをcircleci2-0経由でdeploy-5af054c7d4af
Interpreter Pattern

# Interpreter Pattern
文法上で決められたものを定義する際に使用。Compositeパターンと似ている。通訳者がいて、それが文法上で決められているオブジェクトの使い方を知っている。ユーザーは通訳者を通じて、オブジェクトを操作するため、文法は知らなくて良い。

# Reference
- [tutorialspoint:Interpreter Pattern](https://www.tutorialspoint.com/design_pattern/interpreter_pattern.htm)
- [journaldev:Interpreter Pattern](https://www.journaldev.com/1635/interpreter-design-pattern-java)
- [geeksforgeeks:Interpreter Pattern](https://www.geeksforgeeks.org/interpreter-design-pattern/)
- [iluwatar:Interpreter Pattern](https://github.com/iluwatar/java-design-patterns/tree/master/interpreter)
- [techscore:Interpreter Pattern](http://www.techscore.com/tech/DesignPattern/Interpreter.html/)
VMWare Workstation (Win) > ゲストOS > Windows 10 (1803; April 2018 update) > Disk Usage 100%対策 (2018-05-23版) > VMWare Toolsと関連か?

```txt:動作環境
ホストOS: Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)
VMware(R) Workstation 14 Pro バージョン 14.1.1 build-7528167
ゲストOS: Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)
```

### 症状

ゲストOS: Windows 10において、OS起動後(デスクトップ表示後)にDisk Usage 100%が3分以上続く。

この症状により、同じハードディスクで起動している他のゲストOSのパフォーマンスも極端に低下し作業の妨げとなる。

### 対策

下記を行うことでOS起動後(デスクトップ表示後)のDisk Usage 100%の期間は1分弱で済むようになった。

1. VMWare Toolsアップデート
    - [VMWare Tools再インストール]というメニュー表示時は不要な作業
2. 再起動
3. 7分10秒程度待つ
    - ==> Disk Usage 0%になる
4. シャットダウン

上記の対策後、3回のOS起動(デスクトップ表示)後、Disk Usage 100%の期間が1分弱であることを確認済。


## 他の情報 (上記、対策のみ知りたい人には不要な情報)

### Link 1
https://www.drivereasy.com/knowledge/100-disk-usage-windows-10-fixed/
にFix 8までのDisk Usage 100%症状の対策が記載されている。
(コメントにさらにもう一つ、電源管理でハイパフォーマンス（デフォルト設定）にする、ともある)。

### 冒頭の4つの手順に至るまで

VMWareにてスナップショットを撮り、スナップショットで状態を戻しながら、対策の効果を見た。

1回目:
Link1の記載方法や「いくつかのこと」を試しているうちにDisk Usage 100%問題が解消した。
Link1の情報が正しいと思った。

2回目:
Link1の方法のみを実施した。問題は解消しなかった。

3-5回目:
Link1の方法のみを実施した。問題は解消しなかった。

6回目:
下記を実施した。
1. Link1のFix8実施、再起動
2. Link1のFix1実施、再起動
3. Link1のFix3実施、再起動
4. Link1のFix5実施、再起動
5. VMware Toolsのアップデート、再起動
6. 7分10秒待つ
    - => Disk Usage 0%に落ち着く
7. シャットダウン
    - => 以後、OS起動後(デスクトップ表示後)Disk Usage 100%は1分弱で解消するようになった

7回目:
冒頭の4手順だけを試し、Disk Usage 100%が1分弱で解消することを確認した。

## 備考

今回の症状は、Link1の掲載情報とは別の問題であった。
Link1を含めて色々しているうちに解消したことでLink1の有効性を考えたが、それは間違いであった。

**効果があった時に、「それが何により効果があったか」をきちんと確認しておくのが良い。**
そうしておかないと、次回症状が出たときに、問題の解消につながらない作業を行い、徒労に終わる。
bundle経由でもruby on rails5をいれてみたよ

[前回](https://qiita.com/nyanyamo/items/5df8ac833526dc9f0760)、通常のgem installでrailsをいれて、それ以外のgemはbundle経由でっていう書き方をキロクしたけど、結局どっちがいいのか未だに迷走。
一応bundleで全部入れるバージョンもやったのでキロクキロク。

## bundlerインストール

これは普通に入れる

```cmd:コマンド
$ gem install bundler
```

## プロジェクトフォルダを作成

rails newでつけるプロジェクト名にあたるのでちゃんと命名しとかないと後で面倒。

```cmd:コマンド
$ mkdir プロジェクト名 & cd プロジェクト名
```

## Gemfile作成

```cmd:コマンド
$ bundle init

# rails, mysql2追記
$ vi Gemfile
```

## gemインストール

```cmd:コマンド
# Path指定してローカルgemに。(フォルダは自動生成される)
$ bundle install --path vendor/bundle
```

## railsアプリ作成

通常アプリ名を入れるところを.にすることで、
今いるフォルダ名(最初に作成したプロジェクト名)で作成される。

```cmd:コマンド
$ bundle exec rails new . -d mysql
```

## DB作成


```cmd:コマンド
# rootのパスワード入力
$ vi /config/database.yml

# rakeアップデート
$ bundle update rake

# DB作成
$ bundle exec rake db:create
```

## rails起動

```cmd:コマンド
$ bundle exec rails s
```

あとは通常通り。
ただ、何するにも

```cmd:
$ bundle exec .... 
```
これが必要。
省略する方法もあるらしい。
やってないけど。

おしまい

> 参考
[https://qiita.com/prgseek/items/d00ef79a624bd29681c7](https://qiita.com/prgseek/items/d00ef79a624bd29681c7)
CentOS 7 に MySQL 8.0.11 GA をインストール

RDBMS は普段 MariaDB しか使わないので備忘録。

# レポジトリ設定

```
yum localinstall http://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm
```

以下の2つのレポジトリが設定されます。

```
/etc/yum.repos.d
-rw-r--r--. 1 root root 1864 Feb 22 08:49 mysql-community.repo
-rw-r--r--. 1 root root 1885 Feb 22 08:49 mysql-community-source.repo
```

# yumでインストール

```
yum -y install mysql-community-server
systemctl start mysqld
```

初期passwordは /var/log/mysqld.log に記載されています。

```
/var/log/mysqld.log
2018-05-22T16:47:07.339688Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: jo;Fa5g&14DT
```

```grep "temporary password" /var/log/mysqld.log``` するといいと思います。

```
mysql -uroot -p
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.11 MySQL Community Server - GPL

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
```

# mysql_secure_installation

お約束の mysql_secure_installation を実行してrootユーザのパスワード変更等を行います。

# ユーザ作成

リモートのクライアントから接続できるようにユーザを作成してみます。

```
mysql> create user remoteuser@'%' identified by 'p@ssW0rd';
mysql> grant all on *.* to remoteuser@'%';
mysql> flush privileges;
```

# authentication plugin 'caching_sha2_password' cannot be loaded

デフォルトの認証プラグインが caching_sha2_password に変更されていて、MySQL Workbench をもってしても接続できなくなっているようです。
my.cnf の mysqld セクションに以下の設定を追加して mysql_native_password を選択されるようにしたら、MySQL Workbench でも HeidiSQL でも接続できることを確認しました。

```/etc/my.cnf
[mysqld]
default_authentication_plugin=mysql_native_password
```

## 参考リンク
[MySQL 8.0登場！立ち止まることを知らない進化はこれからも続く。](http://nippondanji.blogspot.jp/2018/05/mysql-80.html)
Goでstructがinterfaceを未実装であればエラーにする方法

## 概要
`interface`で定義した関数をstructに実装を強制させたい場合、`未実装` or `定義が一致しない`場合はエラーにさせる方法が分からなかった。
コンストラクタの戻り値にinterfaceを指定する事で実現できたのでメモ。

```impl_sample.go
package main

import (
	"fmt"
	"strconv"
)

type IShop interface {
	Billing(price int)
}

type Shop struct {
}

// NewShop コンストラクタの戻り値の型をinterfaceにする
func NewShop() IShop {
	return &Shop{}
}

func (s *Shop) Billing(price int) {
	fmt.Println(price, "円を請求する")
}

func main() {
	shop := NewShop()

	shop.Billing(100)
}
```

Shop構造体を利用する場合は、必ず`NewShopコンストラクタ`を使用してインスタンスを扱う必要があるけど、こんな形にしておくとIntelliJ上※でも`interface`の定義に一致していない時は、赤い線でエラーを視認できるようになった。
もちろんコンパイルエラーでも検知できる。

※ IntelliJにGoプラグインを入れた場合
Unityを0から始めてOculusGoアプリをリリースするまでの記録(予定) #OculusGoDev



OculusGoでVRにはまり、そのモチベーションを使いUnityへ入門中です。
こちらに開発中の記録をまとめ、後々振り返ることで**OculusGoのアプリを作りストアへのリリース**するまでの一連の流れを纏めることができればと考えています。

それではよろしくお願いいたします

# 最初のUnity入門からVRに対応する

一番最初の取っ掛かりとしてUnity入門(玉転がしのチュートリアル)が良いです。
実際これに触ることでUnityの基本操作とゲーム作成の流れがイメージとしてつかめました。

これに追加作業でOculusGoに対応させる追加チュートリアルを以下に作成しました。

*  [Unityの玉転がしチュートリアルを#OculusGoに対応させる](https://qiita.com/m0a/items/98cdc1e03cf067769578)

だいぶ簡単にVRアプリが作れることがわかりモチベーションがさらに高まりました。

# デバック環境を整備する

その後自作アプリを作りましたが、その際に一番の問題がわかりました。動作確認が面倒なのです。

流れとして

- buildの実行
- OculusGo(以下Go)への転送
- Goを被る
- Playする
- Goを脱ぐ
- Mac/PCでパラメータ調整
- 最初に戻る

この一連の流れを繰り返すのですが大変です。単純な調整に2,3時間かかることもあります。
UnityにはEditorからPlayできるモードがありますがGoのコントローラー等が対応していないため
動かすことができません。そこで普通のゲームパッドで代替できないか検討したところ
全く同じというわけではありませんが、代替は可能になりました

*  [OculusGoのデバック環境をMac上で動かす。](https://qiita.com/m0a/items/07d24bd376e6e0f43c16#_reference-f27a8b24904651999b6d)
(PCだと最初から対応しているっぽい？)

これに対応することで例えばOculusGoを持ち歩かなくてもMac/PCさえあれば、実装作業ができるという副次作用もできました。更にテンションが上りました。

# リリース用ビルドを行う(βテスト依頼もできるようになります)

実際に遊んでもらったり、ストアに登録するにあたり、リリース用apkビルド手順があります。
それを以下の記事にまとめました。

* [OculusGoアプリのリリース用APK作成手順まとめ #OculusGoDev](https://qiita.com/m0a/items/126dd0186a3192ffd70c)

なおUnityのバージョンによって不具合があったりするようですので
リリースしたいアプリを開発しているようでしたら**割と序盤にこの作業を経験しておいたほうが良い**と感じました。 OculusStoreへのリリースはiOSやAndroidと違いお金がかからないので、
お手軽で良いです。

Goに紐付いたメールアドレスがあればβテストをお願いすることもできます。
開発者同士で交流も兼ねてぜひテストリリースを試してみてください


# Unityにハマったこと時系列順記録

以下嵌ったこと一覧

* [Physics.Raycastにつまった件が解決しました](https://qiita.com/m0a/items/9f254e1ddb8e75da779f)

* [UnityのOculusGo向けのライティング #OclusGoDev](https://qiita.com/m0a/items/98705926c91f68d23834)

* [OculusGoをuGUIに対応させる ](https://qiita.com/m0a/items/a78d20e82d75369c1b2d)

つづく
Go 循環参照ではまった

https://www.slideshare.net/pospome/ss-69946057

要するにpakageAがpakageBをみてpakageBがpakageAを見ると循環参照になりコンパイルエラーになる。

これでテストコードを書くときにハマった。

```golang

package logic

import (
	"###/logic"
)

func AAA() {

}
```

```go

pakage logic_test
import (
	"###/logic"
)

func TestAAA (t *testing.T) {
}

```

↑は動く

```go


package logic

import (
	"###/logic"
)

func AAA() {

}
```
パッケージを同じにしよう。
importの`###/logic`は 必要ないから `_` で握りつぶして…

```golang

pakage logic
import (
	_ "###/logic"
)

func TestAAA (t *testing.T) {
}

```

循環参照です！！


`_`って握りつぶしているだけで、import自体は行っているため、循環参照となるよう。

コメントアウトするか、importするパッケージを消す。
単純なことだが、結構ハマった。

↓正しい形

```golang

pakage logic
import (
	//  "###/logic"
)

func TestAAA (t *testing.T) {
}

```
[Java小ネタ]Listに値が追加されるタイミングを監視する

デバッグ用の小ネタ。Listに値が追加されたタイミングを追う方法。

```Java
public class Foo {

   public List<String> list = new ArrayList<>();

}
```

上記のようなListにいつ値が追加されたか監視したい場合、以下のように無名クラスに書き換えて`add`メソッドをオーバーライドすると、値が追加されたタイミングでログ出力したり、ブレイクポイントで処理を止めることができる。

```Java
public class Foo {

   public List<String> list = new ArrayList<String>() {

      @Override
      public boolean add(String string) {
         // ここにブレイクポイントをつければ、値が追加されたタイミングで処理を止められる
         System.out.println("addされました:" + string);
         return super.add(string);
      }

   };

}
```

`add` だけでなく `remove` など他の処理も拡張可能。
あくまでちょっとしたデバッグ用。

# そういえば

無名クラスと初期化ブロックを使ってListの初期化をすることができる。

```Java
List<String> list = new ArrayList<String>();		
list.add("1");
list.add("2");
list.add("3");
```

上記は以下のように書ける。

```Java
List<String> list = new ArrayList<String>() {{
   add("1");
   add("2");
   add("3");
}};
```

若干タイプ数は減るものの、初心者に優しくないのでチーム開発で使うのはおすすめしない（普通こんなことしないと思うが。。。）
docker-composeを使って手っ取り早くRailsアプリケーションを立ち上げる手順

## 確認した環境
 
 * macOS 10.13.4
 * Docker for mac

```
$ docker version
Client:
 Version:       18.03.0-ce
 API version:   1.37
 Go version:    go1.9.4
 Git commit:    0520e24
 Built: Wed Mar 21 23:06:22 2018
 OS/Arch:       darwin/amd64
 Experimental:  false
 Orchestrator:  swarm

Server:
 Engine:
  Version:      18.03.0-ce
  API version:  1.37 (minimum version 1.12)
  Go version:   go1.9.4
  Git commit:   0520e24
  Built:        Wed Mar 21 23:14:32 2018
  OS/Arch:      linux/amd64
  Experimental: true
  ```

## 手順

適当な場所にディレクトリを用意（例えば ~/docker-rails）し、該当ディレクトリ配下で以下の手順を進める。

以下の内容で Dockerfile を用意

```:Dockerfile
# Dockerfile
FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
COPY Gemfile /myapp/Gemfile
COPY Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
COPY . /myapp
```

以下の内容でGemfileを用意（後述の`rails new`で上書きされる）

```:Gemfile
# Gemfile
source 'https://rubygems.org'
gem 'rails', '5.1.6'
```

空のGemfile.lockファイルを用意

```
$ touch Gemfile.lock
```

以下の内容で docker-compose.ymlを用意

```:docker-compose.yml
# docker-compose.yml
---
version: '3'
services:
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
```

`rails new` を実行する（`--force`は既存のGemfileを書き換えるために必要）

```
$ docker-compose run web rails new . --force
```
すると、Gemfileが更新されRailsに必要な基本的なgemが登録される。

カレントディレクトリの内容が更新されているのでイメージビルドし直す。

```
$ docker-compose build
```

コンテナを起動する。

```
$ docker-compose up
```

ブラウザ等で`http://localhost:3000/`を開いて以下のように表示されればOK
![image.png](https://qiita-image-store.s3.amazonaws.com/0/8219/607088af-fb12-4c4a-2ef2-0824f12e3837.png)



参考: https://docs.docker.com/compose/rails/#connect-the-database
Devopsの各ツールのLDAP連携設定(メモ)

今回の担当のプロジェクトの構成管理は、K8s上に、Devops仕組みを作成しています。
複数のOSSを使用しているので、OSSごとにユーザー作成管理すると、大変なことになります。よってユーザー作成管理は、LDAPで一元管理するようにします。

■LDAP：
・OpenLdap 本体
・ldap-phpadmin　管理者向けのユーザーグループなどの管理ツール
・Ldap Tool Box　利用者向けのユーザーパスワード変更ツール

■Redmine：
・LDAP認証の設定：Ldapの接続情報などの設定
・LDAP同期プラグイン設定：LDAPのユーザーとグループが自動にRedmine側に同期してくれる。Redmine操作が一切不要
　プラグイン情報：Redmine LDAP Sync　https://github.com/thorin/redmine_ldap_sync
　★注意点：グループメンバーシップについて、なぜか「グループ情報中」がうまくいかないので、「ユーザー情報中」設定にした。よって、LDAP側のユーザーにも、グループグループメンバーシップの属性を追加した。
==2018/08/02更新==
「グループ情報中」の設定もできることを判明しました。方法は下記です。
　⇒LDAP認証» に、「あわせてユーザーを作成」チェックボックスをチェック
　⇒LDAP同期» に、
　　メンバーユーザー(group) *：uniqueMember
　　メンバーID(user) *：dn

■Jenkins：
・グローバルセキュリティの設定⇒LDAP
　★注意点：設定保存前に「Test LDAP settings」は必ずやることです。RedmineのLDAP連携と違って、Jenkinsの場合、すべてのユーザーがLDAP認証になるため、ローカルのadminユーザーがログインできなくなるので、LDAP 側のAdminグループ（要作成）ユーザーが「Test LDAP settings」にログインできてから、設定を保存します。
・「Manage and Assign Roles」：LDAP 側のグループごとに、権限ロールを付与する。しないとログインできない
■SonarQube：
 プラグイン情報：https://docs.sonarqube.org/display/SONARQUBE67/LDAP+Plugin
 上記のサイトの情報を参照し、sonar.propertiesのLDAPの設定を行う
★注意点：権限設定のため、LDAP側に合わせてSonarQube上にグループを作成し権限設定が必要

■Gitlab：
GitlabCEを使用していますので、下記のリングに合わせて、Docker起動時の環境変数に設定しました。※/etc/gitlab/gitlab.rbファイル変更の方法もありますが、やはりDockerイメージ再作成が面倒くさそうので、Docker環境変数のみ変更しました。
https://docs.gitlab.com/ee/administration/auth/how_to_configure_ldap_gitlab_ce/index.html#gitlab-enterprise-edition---ldap-features
★注意点：GitlabCEは、LDAPグループの同期ができないです。また、LDAP連携設定後に、Redisエラーなど起きた場合は、gitlab-ctl reconfigureやgitlab-ctl restartで試してみてください。
GitlabEE版は、下記のリンクをご参照ください。
https://docs.gitlab.com/ee/administration/auth/ldap.html

■Nexus3：
https://help.sonatype.com/repomanager3/security/ldap
再帰のパラドクス

以下の記事を、それぞれ心地よいという解釈だけ抜き出し、また、似た様な記事も同じ様に抜き出していくのが、
再帰になれるコツである。余りに請求にやると、精神を偏重をきたすが、人が増えるにつれそれが、どんどん最適化され、学習コストは下がっていく。

音や図で、指を指して強烈なバイアスを持つが、強烈な具象も持つ実世界で、すり合わせても良いかもしれない。
また、必ず本人の直感をそのまま、言葉にしてください。
お互いなに言っているか分からない人は、恐らく、同じ言葉を実際の文字に落とした時等に、反対側を指すでしょう。
見た時と、聞いた時両方でやりましょう。
そういった場合、相手の戦略が分かるので、合わせる事は容易です。
協調したいだけなのに、認識が違う場合、認識を合わせれば良いのです。
逆に一方が虐げられるのならば、違う相手を探して、気が変わったらもう一度すり合わせましょう。

https://qiita.com/hirokeyRe/items/b32e8e29023ff9649d3d
opencv のJPEGライブラリがLIBJPEG-TOURBOに変更されていた！あとCUDA9.2

メモ
OpenCVは3.4系がメンテナンスフェーズとなり、今年の夏にデビューするのはたぶん4になるみたいですが、まあそれはそれとしてJPEGのライブラリがLIBJPEG-TOURBOに変更されていました。これは本家Gitの3.4ツリーにも適用されています。
今まで自前ビルドしてCMAKEで差し替えていましたが手間が省けます。

CUDA9.2が出ましたので早速適用してみました。相変わらず最新のVisualStudioのバージョンには対応できないようで、15.6が必要とマニュアルには書いてありましたのでVisualStudioのバージョンを15.6にアップグレードしてビルドしてみました。
ビルドのポイントについては以前書いた通りなので省略します。

ビルドは特に問題なくできました。動作確認はこれからです。
google-home-notifierが気づいたら動かなくなってた時の対処法

# はじめに
以前、「[google-home-notifier周りをほぼ自動化した](https://qiita.com/k_keisuke/items/3e67aa25a24f07656f47)」で書いた方法を使ってIoT？な日々を送っていたある日、

**気づいたらgoogle-home-notifierが外部から通知を受け取らなくなっていた**

あっれー？ラズパイがおかしくなったかなー、と再起動してみたら正常に動くようになる。たまたま調子が悪かった？と思って調べずにいたが、後日気づいたらまた外部から通知を受け取らなくなっていた。

これはおかしいと思って調査したら、原因がわかったのでメモがてら。

*2018/12/15:「まーた動かなくなった」を追記*

# 原因
原因はngrok側にあった。というか[この記事](https://000dandelion000.blog.fc2.com/blog-entry-284.html)がそのまんま原因だった。
ようはngrokにアカウント登録なしで使う場合、8時間で自動的にURLが失効するようになっていた。

# 対処方法
なので、ここはおとなしくngrokにアカウント登録してそれと紐づける方法をとる。

## ngrokにログイン
https://ngrok.com/
にいく

「SIGN UP」を押してログイン画面へ。Google/Githubのアカウントで登録できるのでそれらで入るのが楽チン

## Authtokenを取得
ログインできたら、左の項目から「Auth」を選択。
すると、Authtokenが確認できるのでこれをコピーする。
<img width="766" alt="スクリーンショット 2018-05-22 13.11.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/76726/ce61de14-b072-3f13-86f2-55f287159545.png">

## google-home-notifierに反映する
ラズパイにログインし、
`google-home-notifier/example.js`を開き、以下のように編集

```js:example.js
const serverPort = 8091; // default port
const token = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; //追加

var deviceName = 'Google Home';
var ip = '192.168.xx.xx'; // default IP

// 中略

app.listen(serverPort, function () {
  ngrok.connect({authtoken: token, addr: serverPort}, function (err, url) { //修正
    console.log('Endpoints:');
    console.log('    http://' + ip + ':' + serverPort + '/google-home-notifier');
// 略
 });
});
```

ngorkでアクセスする際に、authtokenをセットするように修正する。
その後、example.jsを再起動してあげる。
そして一度スクリプトを走らせると、ngrokの処理が走り、サービスの方に登録される。
登録されていれば、ngorkの「Status」を見ると以下のようにURLが登録されている、はず。

<img width="974" alt="スクリーンショット 2018-05-22 13.22.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/76726/41fefbdd-6a4f-8539-0fc2-398b45156544.png">

# 終わりに
１日様子を見てみたけど問題なく起動し続けているので（多分）これで大丈夫

# 2018/12/15、まーた動かなくなった
はい、ま〜〜た動かなくなったので調べてみました。結論から言えば
[google-home-notifierで"Error: get key failed from google"とエラーが出る問題の対処法](https://qiita.com/ktetsuo/items/21f4f85a98145772be3d)に書いてあることをやればOKです。

## 原因
`google-tts-api`のAPI仕様がしれっと変わっていてKeyが取得できなくなっていたのが原因。なので`npm`でインストールするバージョンを変更してやれば良い。

## 対処方法
まず、`google-home-notifier/package.json`を開き、以下の部分を変更

```json:package.json
 ~中略~
  "dependencies": {
    "body-parser": "^1.15.2",
    "castv2-client": "^1.1.2",
    "express": "^4.14.0",
-    "google-tts-api": "0.0.2",
+    "google-tts-api": "0.0.4",
    "mdns": "^2.3.3",
    "ngrok": "^2.2.4"
  }
}
```

次に`google-home-notifier/`直下に移動し以下のコマンドでアップデート
`npm update google-tts-api`

最後にラズパイを再起動してあげればOK

## 参考URL
http://www.autumn-color.com/archives/1279
https://qiita.com/ktetsuo/items/21f4f85a98145772be3d
二項分布のパラメータ（ベータ分布）の事後分布を尤度関数で求める

確率変数xが二項分布に従うものとする。
そしてその二項分布は、パラメータuを持ち、uはベータ分布に従うとする。

N回の試行のうち、x=1の事象がm回、x=0の事象がN-m回発生したとする。

N,mとベータ分布のa,bの値を以下のように定めたとき、
事前分布、尤度関数、事後分布を求め、更新の様子を可視化してみた。

```python
import math
import numpy as np
import matplotlib.pyplot as plt

N = 1
m = 1
a = 2
b = 2
x = np.linspace(0, 1, 100)

# 事前分布
y_prior = (math.gamma(a+b) * (x ** (a-1)) * ((1-x) ** (b-1))) / (math.gamma(a) * math.gamma(b))
# 尤度関数
y_likelihood_function = (math.factorial(N) * (x ** m) * ((1-x) ** (N-m))) / (math.factorial(N-m) * math.factorial(m))
# 事後分布
y_posterior = (math.gamma(N+a+b) * (x ** (m+a-1)) * ((1-x) ** (N-m+b-1))) / (math.gamma(m+a) * math.gamma(N-m+b))

plt.plot(x,y_prior, label='prior')
plt.plot(x,y_likelihood_function, label='lilelihood function')
plt.plot(x,y_posterior, label='posterior')
plt.legend()
plt.show()
```

結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196673/84448f66-aa60-0d16-8eb6-9135ce11f52d.png)
【随時更新】動いているWebアプリケーションをアップデートする時の注意点

# 概要

先日先輩に聞いた機能拡張などのアップデートする時の注意点を聞いたので、
その辺りをメモ。もしここもではないのかと思う点ありましたら指摘お願いしますm(_ _)m

この場合、使っている人がいる状況でアップデートを行う。
普通メンテナンスモードにするなどの施策を打つが、それができない場合、

# cache問題

cacheが使われていることによって起こる問題。
cacheを消さずにupdate => ソースコードとcacheで不整合が起きる => Fatal Error
というパターンが起こる。
[Google Blog] Smart Reply

This post follows a google's brilliant blog post
https://ai.googleblog.com/2017/05/efficient-smart-reply-now-for-gmail.html

## Introduction
In 2016, they have launched Smart Reply alpha version, a feature for gmail to suggest replies using ML techniques. In fact, the number of users has significantly grown these days, so it is quite content for them.
So in this post, i would like to describe how did they come up with this idea and approach to the issues they got.

## Hierarchical Structure of Languages
Do you remember one the finest book published in 2017, which is ["How to Create a Mind: The Secret of Human Thought Revealed"](https://en.wikipedia.org/wiki/How_to_Create_a_Mind) by the inventor and futurist Ray Kurzweil. It became popular covered by many newspapers and magazines.
Inspired by this great book, they have adapted the concept that the language is structured in hierarchy. Namely, the content of the conversation or novel hugely rely on the context. As running example, they have given us this sentence, "That interesting person at the cafe we like gave me a glance.". The hierarchical chunks in this sentence are highly variable. For instance, considering the meaning of "a glance" in this context, we can say that this is good gesture because the fancy looking person and you had a glance each other, that is definitely Cool! On the other hand, some might say "hmm,, maybe she/he was annoyed because of your noise or something? or maybe she/he did just respond to the noise biologically..". Hence, we cannot simply determine the meaning belongs to the word "a glance" in this sentence, it is because potentially it is really ambiguous.

## Modeling
Given the example, now we can consider how to model this complex phenomenon, which is a context in a language. Initially they have approached to this issues using LSTM encoder-decoder architecture though, it turned out that even with the google's sophisticated infrastructure it is massively computation expensive to follow emails word by word. Instead, they have come up with the hierarchical modeling, which is more computation efficient.

<img width="451" alt="Screen Shot 2018-05-23 at 8.43.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/4ae7f351-12de-8759-3090-bb3e8fc087b2.png">

So first layer is for making features useful by embedding inputs. And in second layers, it is working on more abstract representation of the inputs. With this architecture, they succeeded to consider the context more efficiently and comprehensively comparing to the word-by-word approach.
<img width="636" alt="Screen Shot 2018-05-23 at 8.52.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/b87caeab-c899-b7c3-e341-f654e2823faa.png">

## Conclusion
In the end, they have evaluated the model and its capability of representation, it turned out that it was able to nicely detect the context and the generated sparse embeddings have meaningful format.
【PHP】数値かどうかをチェックする関数「ctype_digit()」「is_numeric()」とは？その違いは？【サンプルコード】

今回は、入力された値が数値かどうか検証する関数について学んでいこうと思います。

![ 2018-05-23 8.16.53.png](https://qiita-image-store.s3.amazonaws.com/0/254159/66a844b1-a5f4-adbf-4769-d5bd44e7f5ff.png)

今回使用する関数、それが、

- ctype_digit()
- is_numeric()

の2つになります。

まずはいつも通り、HTMLをエスケープするプログラムを作成します。一応ここに記載しておきますが、私の投稿ではほぼいつも記載しているので使い回しで結構です。

```php5:h.php

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>HTMLでのエスケープ処理をする関数</title>
</head>
<body>
<?php 

//HTMLでのエスケープ処理をする関数
function h($var) {
	// is_array() -> $varが配列かどうかを調べる
	// $varが配列だったら・・・
	if (is_array($var)) {
		// array_map() -> 配列の各要素に対して指定した関数を実行する
		// array_map('コールバック関数名',配列)
		return array_map('h', ($var));
	// $varが配列じゃなかったら・・・
	} else {
		// フォームなどからのユーザーのデータをブラウザに表示する場合は、
		// 原則すべてのデータにhtmlspecialchars関数を使用する。
		// ENT_QUOTES -> クオートを変換する
		return htmlspecialchars($var, ENT_QUOTES, 'UTF-8');
	}
}

?>
</body>
</html>
```

そして今回の関数です。

```php:form_ctype_digit.php

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<title>数値かどうかをチェックする</title>
	<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
</head>
<body>
<?php 

// HTMLをエスケープする関数を読み込む
require_once('h.php');

// もし'number'nameが送信されたら・・・
if (isset($_POST['number'])) {
	// 変数に格納する
	$number = $_POST['number'];

	// ctype_digit()関数->文字列のすべてが数字であるかどうかの検査（文字列型で渡す）
	echo '<p>ctype_digit()関数: </p>';
	// postの値をctype_digit()関数に
	if (ctype_digit($number)) {
		echo h($number)."は数値です";
	} else {
		echo h($number)."は数値ではありません";
	}

	// is_numeric()関数->小数点を含んだ場合、「+0123.45e6」のような指数表記、
	// 「0xFF」のような16進数表記の文字列も数値と判断。
	// 数値である場合はtrue、そうでない場合はfalseを返す
	echo '<p>is_numeric()関数: </p>';
	if (is_numeric($number)) {
		echo h($number)."は数値です";
	} else {
		echo h($number)."は数値ではありません";
	}
}
?>
<form action="form_ctype_digit.php" method="post">
	<p>数字を入力してください</p>
	<input type="text" name="number" value="">
	<input type="submit" value="送信する">
</form>
</body>
</html>
```

![ 2018-05-23 8.16.53.png](https://qiita-image-store.s3.amazonaws.com/0/254159/66a844b1-a5f4-adbf-4769-d5bd44e7f5ff.png)

実行すると↑こんなプログラムが出来上がります。簡単だね！