OmniAICreator/Qiita-1.07M huggingface dataset:
[Go] for { select { default: break } } ではループを抜けられない

過去の自分を含め、意外と間違っている人が多いのですが、

```go
for {
	select {
	default:
		break
	}
}
```

では for ループを抜けることができません。
これは switch の case や default 内で break を使っても switch は抜けらますが、その外側のループは抜けられないことと同じです。

恐らく default では例外処理を行うことが多く、例外処理のテストを適切に行っていないためこのバグが潜在しているものと思われます。

そこで、Labeled Break を使いましょう！

```go
L:
	for {
		select {
		default:
			break L
		}
	}
```

これでラベルの貼られた for から break L で抜けることができます。

あ、func で包んで即実行してもいいですが Labeled Break のほうがより直感的ですね。

<blockquote class="twitter-tweet" data-lang="en-gb"><p lang="ja" dir="ltr">labeled break が使えます。 <a href="https://t.co/7xKyxkaNs5">https://t.co/7xKyxkaNs5</a><a href="https://t.co/D5YXYsqqpx">https://t.co/D5YXYsqqpx</a></p>&mdash; mattn (@mattn_jp) <a href="https://twitter.com/mattn_jp/status/987720344512294913?ref_src=twsrc%5Etfw">21 April 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-conversation="none" data-lang="en-gb"><p lang="ja" dir="ltr">結構積極的に使います。</p>&mdash; mattn (@mattn_jp) <a href="https://twitter.com/mattn_jp/status/987726348977192960?ref_src=twsrc%5Etfw">21 April 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
iosはレスポンスをキャッシュする？

#経緯

使用ライブラリ: Alamofire

ある日、アプリとサーバーでやり取りしている最中に発生しました。

送ったリクエストに対して、レスポンスが返ってくるときに前に送ったときのレスポンスがそのまま返ってきたのです。

ヘッダーの情報は変わっているのにです。

サーバー側は正常なレスポンスを返しており、かつiosのアプリを起動し直すと治ります。

#原因
もともとAlamofireはNSURLSessionを元に作られているそうです。

NSURLSessionはレスポンスの結果が前回の結果と同じ場合（ヘッダー情報を含まず）はキャッシュされたレスポンスを返すそうです。

#対処方法

#### 対処法1:キャッシュポリシーを設定してキャッシュしないようにする。
キャッシュポリシーを設定することによって、ローカルキャッシュの使用方法を指定します。

| キャッシュポリシー|       説明 | 
|:-----------------|:------------------|
| URLRequestUseProtocolCachePolicy|デフォルトのキャッシュポリシーです。プロトコルに最も準拠したポリシーとして定義されます。 |
| URLRequestReloadIgnoringCacheData|URLローディングシステムは送信元からデータを読み込み、キャッシュは完全に無視されます。 |
| URLRequestReturnCacheDataElseLoad|キャッシュデータが存在する場合、URLローディングシステムは有効期間や有効期限を無視してキャッシュデータを使用し、キャッシュバージョンがない場合にのみ、送信元からデータを読み込みます。|
|URLRequestReturnCacheDataDontLoad|アプリケーションは、キャッシュ内のデータのみが返されるように指定できます。レスポンスがローカルキャッシュ内にない場合に、このキャッシュポリシーを使用してNSURLSessionTaskインスタンスを作成しようとすると、すぐにnilが返されます。|

例

```swift
URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 5)
```


#### 対処法2: キャッシュをクリアする

```swift
URLCache.shared.removeAllCachedResponses()
```

このコードを使用するとキャッシュを全て削除してくれます。

以上です。
間違えている箇所がございましたらご指摘お願いします。
Simutrans-ExtendedをLinux(Ubuntu16.04LTS)でビルドする


この記事では、Simutrans-ExtendedをUbuntu16.04LTS上でビルドして、プレイできる状態にする方法を説明します。他のlinuxディストリビューションでも同様な方法でビルドできると思います。
Simutrans-Extendedとは、Simutransというフリーの輸送シミュレーションゲームの拡張版です。最近はフリーとは思えないほど機能が増えてきており、ダイヤの作成機能、リアルな鉄道信号の挙動、客の収入レベルに応じた旅客流動など、商用ソフトに引けをとらないクオリティに仕上がっています。最近では自動車の追越車線を実装するパッチ(OTRP)や列車の増解結といった非常にチャレンジングな機能を開発する動きもあります。

なお、Simutransの詳細は http://japanese.simutrans.com/ にあります。気に入ったらSimutrans-Standardもやってみてね！

# 準備
SimutransをLinuxで
なお、gcc(g++)やmakeを含むbuild-essentialパッケージはすでに入っているとして話を進めていきます。なければ
`$ sudo apt install build-essential`
で入れてください。
# ソースコードのDL
ソースコードはjamespettsさんのgithubから入手できます。
https://github.com/jamespetts/simutrans-extended

ターミナル上で入れたいディレクトリ(ここでは~/simutrans/とします。他のディレクトリに入れる場合は適宜読み替えてください。)に移動したあと、
`$ git clone https://github.com/jamespetts/simutrans-extended`
と入力すればDLできます。同じディレクトリにpak128.Britain-Exを
`$ git clone https://github.com/jamespetts/simutrans-pak128.britain`
でインストールしておくとあとで便利。

# ビルド準備
ビルドのための準備をします。
~/simutrans/simutrans-extended/ディレクトリに入って、
`cp config.template config.default`
でconfig.templateをコピーします。
config.defaultをemacsやvimなどのテキストエディタで編集し、
`#BACKEND = sdl2
 #COLOUR_DEPTH = 16
 #OSTYPE = linux`
の3行の先頭の#を削除します。

# Let's Build!
## simutrans-extended本体のビルド
あとはおもむろに`$ make`しましょう。ビルドが遅い？　だったら`$ make -j`でもすればいいんじゃないかな！
さて、大量の警告の後、ビルドは停止すると思います。SDL.hがないとかbzip.hがないとか言われるので、libbz2-devやlibsdl2-devを入れましょう。
入れたらmakeを再実行します。最後、LDまで終わって
`===> LD build/default/simutrans-extended`
と言われればビルド成功です！

## makeobj-extendedのビルド
次にmakeobj-extendedのビルドを行います。`~/simutrans/simutrans-extended/makeobj/`に移動し、ここで`$ make`します。多分ここでもpng.hがないとか言われると思うので、libpng16-devをインストールしましょう。もう一度`$ make`して、
`===> LD  ../build/default/makeobj-extended/makeobj-extended`
と言われればビルド成功です。

# ディレクトリのコピー
~/simutrans/simutrans-extended/simutrans/ディレクトリには、simutransを動かすために必要なファイル(simuconf.tabとか、music/ディレクトリとかtext/ディレクトリとか)が一通りそろっています。ここでは、~/simutrans/simutrans/ディレクトリにコピーします。
それから、先ほどビルドして作った本体を~/simutrans/simutrans/ディレクトリにコピーして入れましょう。
~/simutrans/simutrans/config/simuconf.tabのsingleuser_install=0を=1に変更してあげるといいかも。

# pak128.Britain-Exのビルド
また、makeobj-extendedは先ほどクローンしてきた~/simutrans/simutrans-pak128.britain/ディレクトリの中に入れてあげましょう。
ビルドしましょう。ここも~/simutrans/simutrans-pak128.britain/ディレクトリの中に入って`$ make`します。時間が掛かるので`$ make -j`してもいいです。
そうすると~/simutrans/simutrans-pak128.britain/pak128.Britain-Ex/ディレクトリができていると思います。このディレクトリを~/simutrans/simutrans/ディレクトリにコピーしてください。

#さあ実行しよう
これで準備は整いました。
~/simutrans/simutrans/ディレクトリに移動して`$ ./simutrans-extended`と打って起動すれば導入成功です。お疲れ様でした！
バリデーションの拡張

## 背景
laravelのバリデーションにある
alpha: 中身が全部英字かどうか
alpha_dash: 英字または-または_であるかどうか
alpha_num: 英数字であるかどうか

のバリデーションを行うと、日本語のままでも行けてしまいます。

困ってますね・・・

## 1.独自のバリデーションを作成する

```php:App\Validator\CustomValidator.php

namespace App\Validator;

use \Illuminate\Validation\Validator;

class CustomValidator extends Validator
{

    /**
     * [validateZipcode 中身が全部英字かどうか]
     * @param  [type] $attribute  [description]
     * @param  [type] $value      [description]
     * @param  [type] $parameters [description]
     * @return [type]             [description]
     */
    public function validateIsAlpha($attribute, $value, $parameters)
    {
        return preg_match('/^[a-zA-Z]+$/', $value);
    }

    /**
     * [validateIsAlphaDash 英字または-または_であるかどうか]
     * @param  {[type]} $attribute  [description]
     * @param  {[type]} $value      [description]
     * @param  {[type]} $parameters [description]
     * @return {[type]}             [description]
     */
    public function validateIsAlphaDash($attribute, $value, $parameters)
    {
    	return preg_match('/^[a-zA-Z\-_]+$/', $value);
    }

    /**
     * [validateIsAlphaDash 英数字であるかどうか]
     * @param  {[type]} $attribute  [description]
     * @param  {[type]} $value      [description]
     * @param  {[type]} $parameters [description]
     * @return {[type]}             [description]
     */
    public function validateIsAlphaNum($attribute, $value, $parameters)
    {
    	return preg_match('/^[0-9a-zA-Z]+$/', $value);
    }
}
```

第一引数`$attribute`はバリデーションの名前です。
第二引数`$value`はバリデーションする値、第三引数($parameters)はオプションで渡したい値です。
第三引数`$parameters`で値を渡したい場合は以下の様にモデルで記述します。

```php
'age'  => 'digits_between:1,99'
```

## 2.サービスプロバイダー作成と追加

```php

php artisan make:provider ValidatorServiceProvider
```

```php:App\Providers\ValidatorServiceProvider.php

namespace App\Providers;

use App\Validator\CustomValidator;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\ServiceProvider;

class ValidatorServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap the application services.
     *
     * @return void
     */
    public function boot()
    {
      Validator::resolver(function ($translator, $data, $rules, $messages, $attributes) {
          return new CustomValidator($translator, $data, $rules, $messages, $attributes);
      });
    }
}
```

最後

```php:config/app.php

'providers' => [
	// 追加
    App\Providers\ValidatorServiceProvider::class,
];
```

以上です。
PDF変換編集ソフト3選

PDFは、「Portable Document Format」の略で、データを実際に紙に印刷したときの状態を、そのまま保存することができるファイル形式です。どんな端末で開いても、フォントが置き換わってしまったり、レイアウトが崩れてしまったりすることがないのはPDFのメリットです。

ところが、PDFの編集がWordほど簡単ではありません。PDFファイルを編集するには、専門のPDF編集ソフトやPDFをwordやExcelファイルに変換する必要があります。ここでは、便利なPDF変換・編集フリーソフトを3つご紹介します。

<h2>LightPDF</h2>

LightPDFはPDFの変換、編集、結合、圧縮など一連の機能を備える無料サイトです。無料サイトですが、機能制限やファイルサイズ制限、及び使用回数制限などが一切ありません。

公式ページ：<a href="https://lightpdf.com/jp/">https://lightpdf.com/jp/</a>

![lightpdf.jpg](https://qiita-image-store.s3.amazonaws.com/0/252908/3eb99bf2-88c6-4d5d-26bd-60d20f7ab0cc.jpeg)

機能一覧：
<ul>
<li>PDFをword/TXT/PNG/JPG/PPTに変換</li>
<li>word/Excel/PNG/JPG/PPTをPPTに変換</li>
<li>PDF編集/結合/分割/回転/圧縮</li>
<li>PDF保護/PDFに透かし追加/PDF署名/PDFパスワード解除/OCR</li>
</ul>

<h2>SmallPDF</h2>

LightPDFと同様に、SmallPDFもPDFの変換・編集などができる無料サービスです。でも、LightPDFと違い、SmallPDFにはサイズ制限や使用回数制限などがあります。つまり、完全無料ではありません。また、機能上は、OCR、PDF透かし追加、PDF保護機能が備わりません。

公式ページ：<a href="https://smallpdf.com/jp">https://smallpdf.com/jp</a>

![smallpdf.jpg](https://qiita-image-store.s3.amazonaws.com/0/252908/c3e4a6c8-eafa-b687-6811-bcefc308b326.jpeg)

機能一覧：
<ul>
<li>PDFをword/JPG/PPT/Excelに変換</li>
<li>word/Excel/JPG/PPTをPPTに変換</li>
<li>PDF編集/結合/分割/回転/圧縮</li>
<li>EサインPDF/PDFロック解除</li>
</ul>

<h2>I♥PDF</h2>

利用者数が非常に多いPDF変換・編集オンラインツールです。機能上は、上記2つとほぼ同じく、PDFにページ番号を追加できるのは特長です。OCR機能とPDF署名機能が備わりません。使用上、サイズ制限と使用回数制限がありません。

公式ページ：<a href="https://www.ilovepdf.com/ja">https://www.ilovepdf.com/ja</a>

![ilovepdf.jpg](https://qiita-image-store.s3.amazonaws.com/0/252908/cf45e19a-35e9-e864-ea31-9379a0f204b5.jpeg)

機能一覧：
<ul>
<li>PDFをword/JPG/PPT/Excelに変換</li>
<li>word/Excel/JPG/PPTをPPTに変換</li>
<li>PDF編集/結合/分割/回転/圧縮</li>
<li>PDFウォーターマーク追加/PDFロック解除/PDFページ番号追加</li>
</ul>

<h2>後書き</h2>

上記３つのサイトはどちらもPDFファイルを変換・編集できます。完全無料で使うには、LightPDFがおすすめです。そのほかの2つはどちらも制限があるからです。
disabled なボタンにも Bootstrap のツールチップを表示したい

# 問題点

disabled 属性を持つボタン要素に Bootstrap の [ツールチップ](https://getbootstrap.com/docs/4.0/components/tooltips/) を表示することができない。

```html
<button type="button" class="btn btn-secondary" data-toggle="tooltip" data-placement="top" title="こんにちは 😇" disabled>
  ボタン
</button>
```
# 対策

まずボタン要素を div 要素でラップする。このとき、ツールチップの表示に必要な data 属性や title 属性をこの div 要素に移動する。

```html
<div class="button-wrapper" data-toggle="tooltip" data-placement="top" title="こんにちは 😇">
  <button type="button" class="btn btn-secondary" disabled>
    ボタン
  </button>
<div>
```

次に以下の CSS を追加する。

```css
.button-wrapper {
  /* wrapper の幅を内包する要素に合わせる。 */
  display: inline-block;
}

.button-wrapper .btn:disabled {
  /* マウスをホバーした際のイベント伝搬を止めないようにする。 */
  pointer-events: none;
}
```


# デモ

<p data-height="265" data-theme-id="0" data-slug-hash="YLqXLV" data-default-tab="html,result" data-user="quanon" data-embed-version="2" data-pen-title="Show Bootstrap tooltip on disabled button" class="codepen">See the Pen <a href="https://codepen.io/quanon/pen/YLqXLV/">Show Bootstrap tooltip on disabled button</a> by QUANON (<a href="https://codepen.io/quanon">@quanon</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
WEBページに使われているテクスチャの通信コストを減らす、古の時代からのアイデア

#背景
**リアルウォンテッドリーにて、頭文字Ｇのデザイン企業のＣＴＯが、このアイデアを注目していたので、ここに記す。** 
 
「メールの添付ファイルは１ＭＢ以下にしましょう」と言われる時代はとっくの昔~~（だと思いたい）~~、
ＷＥＢアプリケーションがどのように作られているかを知らない（知る気もない）大学生が、
４Ｇモバイル通信を使って、フルＨＤの動画を見たり、ビットレート１ＭＢ以上で生中継する光景は、
別に珍しくもなくなってしまった。~~（そして、通信制限の原因がわからない社会人も増えてしまった。）~~

こういう（良いのか悪いのかわからない）世の中であっても、通信コストを減らすことを重要視している分野がある。
それは何か？..........***ランディングページ***である。

直帰を防いだり、コンバージョンを上げるためには、出来るだけリッチなランディングページを作りたい。
でも、ページ表示をコンマ１秒でも早くするためには、データ通信を抑えたい。
動画を使いながら、ページ表示が遅いと言うのはもってのほかだが、画像だって、多用すればするほど遅くなる。
さて、どうすればいいのだろうか？

#例
![スクリーンショット.jpg](https://qiita-image-store.s3.amazonaws.com/0/239082/bac19e36-7411-37f9-a5cb-abc8584bc743.jpeg)
これは、自分が企画・デザイン・プログラミングを行った、実際のＷＥＢアプリケーションの１画面である。
（なんやかんやあって、実際には導入されなかったが、掲載許諾は取ってある。）

デザインだけを見れば、

- 「教科書に書いてある悪いお手本を真似したんじゃないのか？」
- 「汚いデザインだなぁ…」
+ 「いやぁ懐かしい」
+ 「昔ながらの奥ゆかしいＷＥＢページである」 

とか言われそうだが、（２０００年代中期のプログラマー系のタグ打ちで制作した個人サイトをイメージして制作した）
このページを例に挙げたのは、~~（自力でJavascript＋JqueryでMCVを行っているのもあるのだけど）~~

* テクスチャ用の画像は２枚のみ
* 解像度は２枚とも128×128
* データサイズは両方とも４キロバイト以下

で、ここまで表現できる事を例示するためである。

#方法
##方法１　シームレスなテクスチャを繰り返すことにより、背景を構成することによって、通信コストを減らす。
![BackGround.png](https://qiita-image-store.s3.amazonaws.com/0/239082/d6a53252-e222-0c25-0354-66f3e99fa633.png)
このような、シームレス・128×128・4kbのテクスチャ１枚だけで、背景は表現できるのである。
1024×1024・400kb（Kritaにて、上の画像をLanczos3でアップスケーリングした時の実測値）のテクスチャは必要ない。
「レスポンシブデザインのために、画像を複数用意する必要が無くなる」という利点も存在する。

昔のＷＥＢサイトでは普通に使われていた表現だったし、ゲームの世界では今でも実用的な手法である。

##方法２　素材感を出すためのモノクロテクスチャと、CSSで生成した色を、BGBrendmodeで合成して、１枚のテクスチャで多色のテクスチャとする。
![FormBox.png](https://qiita-image-store.s3.amazonaws.com/0/239082/66639bc6-df0f-5703-759a-448f0e14a6ad.png)
この方法は、同じ材質で色違いのテクスチャを使用する環境においては、特に有効な方法である。
モノクロのテクスチャ１枚４キロビットと、カラーのテクスチャＸ枚４×Ｘキロビット、
どっちが通信コストを削減できるか、考えるまでもないだろう。

これは、ゲームの世界での「ディテールノーマル」という手法からアイデアを得たものである。
昔のＷＥＢサイトでは実現できなかったが、最近になって使えるようになった技術である。

#結論  
##___やろうと思えば、もっと通信コストは削減できる。___
方法２は、それなりに手間もかかるし、デザイナー（かPhotoshopを使っている人）で無ければ出来ないだろうが、
方法１は、シームレス化する便利なツールがある。
（~~Kritaでキラキラな文字を追加したり、ダサい色彩に加工するよりも、~~Gimpのシームレス化ツールは遥かに簡単）

##だから、
やらなければ意味がないから、しよう。
あと、ChromeでSVGをBrendmodeで合成出来たり、EdgeがUriFilterに対応してくれると嬉しい。

##Github
以下に、今回の例で紹介したページ・ソースを公開している。
https://polaris1080.github.io/CarrierPlatform_Enter-Leave_RecordSystem/
https://github.com/Polaris1080/CarrierPlatform_Enter-Leave_RecordSystem
Neo4jをとりあえず動くようにする備忘録

Neo4jを興味本位で初めて構築したので、飽きて一回離れた時用に構築手順をメモ

#JDKのインストール
Neo4jはJDKのインストールが必須らしい。
ただ、もともとJDKが自前PCには入ってて、この辺やってないので今回は割愛。
JDKのインストールとか、JAVA_HOMEの設定も割愛

Neo4jのバージョンによって対応バージョンが違う
Neo4j 2.xはjava7以上、3.xはjava8以上が必要
"以上"でいいのか、ピンポイントじゃなきゃダメなのかはわかっていない。
とりあえずjava8で2018/4/24現在、Neo4j3.3.5が動くのは確認できている。

この辺は後々追記。

#Neo4jの構築
## インストール
* https://neo4j.com/download/other-releases/

まずはここでインストールパッケージをダウンロードする。
exeが公式にある感じの記事はあったが、見つからなかったので今回はzipからの展開。

![Neo4jインストール2.png](https://qiita-image-store.s3.amazonaws.com/0/249967/14663135-4368-0a43-c818-09707b93a14f.png)

私の場合はNeo4j 3.3.5 CommunityのWindows 64 bitをインストール

## インストールパッケージの展開
ダウンロードフォルダのzipファイルを任意のディレクトリに展開。
右クリック → すべて展開
私は C:\dev\neo4j を作って配置。

## Neo4j起動
コマンドプロンプトを起動して、展開ディレクトリに移動。
ちなみに僕の場合ですが、**管理者権限でコマンドプロンプトを起動**しないと実行できない場合がある。

展開フォルダのbin直下に.batファイルがあるので叩いてみる。

```
C:\dev\neo4j\bin>neo4j.bat
Usage: neo4j { console | start | stop | restart | status | install-service | uninstall-service } < -Verbose >
```

この時点ではインストールされていないため、`C:\dev\neo4j\bin>neo4j.bat start`を実行してもエラー返却される。
まずは、インストールから。

```
C:\dev\neo4j\bin>neo4j.bat install-service
Neo4j service installed
```

これで実行可能。

```
C:\dev\neo4j-community-3.4.0-beta02\bin>neo4j.bat start
Neo4j windows service started
```

## ブラウザでアクセス
* http://localhost:7474

configいじれば別のポートでも起動できる。
とりあえず初期設定でのアクセスはこれでいい。

アクセスすると、ログイン画面に遷移する。
初期ID、パスワードは両方"neo4j"。

ログインすると、パスワードの変更が求められます。
任意のパスワードに変更する。

![初期画面.png](https://qiita-image-store.s3.amazonaws.com/0/249967/1b135229-212b-388b-2458-59fa699a3617.png)

この画面が出てくれば成功。

## まだわかっていないこと／調べ切れていないこと
* Neo4jバージョンとJavaバージョンの対応
* Boltについて
EarlGreyのMatcherを自作してみよう！


普段テストを行っていると、`UITableView`や`UICollectionView`などで特定条件のセルを探したい時などがあるかと思います。

そんな時は、matcherを自作しましょう。
ActionやAssertの作り方とは少し違いますので、気をつけましょう。

以下が例です。

```swift:自作Matcher
  private func grey_customCellMatcher() -> GREYMatcher {
    return GREYElementMatcherBlock.matcher(matchesBlock: { (ele) -> Bool in
      guard let cell = ele as? HogeCell else { return }
      
      ///return値がtrueの要素を探しています
      return cell.isHoge
    }, descriptionBlock: { (description) in
      _ = description?.appendText("grey customCellMatcher")
    })
  }

```

`true`だったものを返すので、複数要素がある場合multipleエラーになってしまいます。そんな時は`atIndex()`などを使いましょう。

```swift:全体コード

import XCTest
import EarlGrey

@testable import QiitaPresents

class QiitaPresentsTests: XCTestCase {
    
    override func setUp() {
        super.setUp()
        // Put setup code here. This method is called before the invocation of each test method in the class.
      
      let success = GREYCondition(name: "setup") { () -> Bool in
        var error: NSError? = nil
        
        EarlGrey.select(elementWithMatcher: grey_kindOfClass(UIViewController.self))
          .atIndex(0)
          .assert(grey_sufficientlyVisible(), error: &error)
        
        return error != nil
      }.wait(withTimeout: 15)
      GREYAssertTrue(success, reason: "failed setup")
    }
    
    override func tearDown() {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
        super.tearDown()
    }
    
    func testExample() {
        // This is an example of a functional test case.
        // Use XCTAssert and related functions to verify your tests produce the correct results.
      
      var targetCell: HogeCell!
      
      let matcher = grey_allOf([grey_sufficientlyVisible(),
                                grey_kindOfClass(HogeCell.self),
                                self.grey_customCellMatcher()])

      EarlGrey.select(elementWithMatcher: matcher)
        .inRoot(grey_kindOfClass(UITableView.self))
        .atIndex(0)
        .perform(grey_tap())

    }
  
  private func grey_customCellMatcher() -> GREYMatcher {
    return GREYElementMatcherBlock.matcher(matchesBlock: { (ele) -> Bool in
      guard let cell = ele as? HogeCell else { return }
      
      return cell.isHoge
    }, descriptionBlock: { (description) in
      _ = description?.appendText("grey customCellMatcher")
    })
  }
}

```
以上です。

###お願い
自作Matcherの`descriptionBlock:`の部分が何をしているか把握していません。
よろしければ誰か教えていただければ幸いです。
NCOでNetCDFを自在に扱う

NetCDFを楽に扱うために便利なNCOコマンドのまとめ (c) 2018 @okadate

- 2018/04/24 作成

# **NCO** - NetCDF Operator
- NetCDF の編集ができる便利ツール
- 以下に示すコマンドたちをまとめてNCOという
- 公式マニュアル：http://nco.sourceforge.net/nco.html
- 公式チートシート：http://nco.sourceforge.net/nco_rfr_crd.pdf

## How to Install
- condaでもbrewでもWindows用もあります：http://nco.sourceforge.net/#Executables
- Gitでもおk：http://nco.sourceforge.net/#Source

# **ncks** - Kitchen Sink

- 切りとる
- `-d`で切りとる範囲を指定（次元名、最小、最大、stride、duration）
- 最小・最大のインデックスは 0 始まり、無指定も可

```
$ ncks -d time,0,2 in.nc out.nc    # 1,2,3番目のみ
$ ncks -d time,,,12 in.nc out.nc   # 12こづつ
```

---

- 次元 `time` を Record用の次元（以下Rocord次元）に変更する

```
$ ncks --mk_rec_dmn time in.nc out.nc
```
- Rocord次元：`= UNLIMITED; //(30 currently)`などと表示されるやつ

# **ncwa** - Weighted Averager

- `-a` で指定した方向に平均できる

```
$ ncwa -a rain_time in.nc out.nc
```

# **ncra** - Record Averager

- Record方向に平均する（Rocord次元は消える）

```
$ ncra in.nc out.nc
```

# **ncecat** - Ensamble Concatenator

- Record次元を追加できる（各変数に第１次元としてRecord次元が追加される）

```
$ ncecat in.nc out.nc
```

---
- 本来は複数ファイルのアンサンブルをとるために使う

```
$ ncecat -u month in_{1..12}.nc out.nc
```

---
- Record次元があるなら `ncrcat`（Record次元は消える、はず）

# **ncrename** - Renamer

- 名前を変更する
- 下の例は`record`というDimensionの名前を`frc_time`に変更する

```
$ ncrename -d record,frc_time in.nc
```
Macに最新のMinicondaをインストールする方法

Macに最新のMinicondaをインストールする方法

* Homebrew は、あらかじめインストールしておく。
* インストールには pyenv を使う。
* MBP(Mid 2017) + macOS 10.13.4

```
# pyenvのインストール
brew install pyenv

# zlibエラーの回避
xcode-select --install

# miniconda3-latestのインストール
pyenv install miniconda3-latest
pyenv global miniconda3-latest
pyenv rehash

# PATH設定
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source ~/.bash_profile

# アップデートを行う場合には以下のコマンドを使うとよい
conda update -n base conda -y
conda update --all -y
conda clean --all -y
```
EarlGreyのAssertsとActionを自作する



#Assert編
`Assert`を頻繁に使ったりしますが、やはり自作UIパーツの特定の値が変わったかどうか、確かめたいですよね。

そんな時は、'Assert'を作ってやりましょう。

例：`HogeButton`という自作ボタンに、`isHoge`というBool型変数がある場合。

```swift
func grey_confirmToButtonHighlighted() -> GREYAssertionBlock {
  return GREYAssertionBlock.assertion(withName: "grey confirmToIsHighlighted") { (ele, err) -> Bool in
    guard let _ = err else { return false }
    guard let button = ele as? HogeButton else { return false }

    return button.isHoge
  }
}
```

```swift
EarlGrey.select(elementWithMatcher: grey_kindOfClass(HogeClass.self))
        .inRoot(grey_kindOfClass(UIView.self))
        .assert(self.grey_confirmToButtonHighlighted())
```

こんな感じで良い感じにAssertできます。



##Action編

Actionといっても、画面操作のメソッドはほとんど備わっているので、主に取得したい要素などに使ったりしています。


ほとんど`Assert`と同じ作り方ですが、要素に対して確認するか、働きかけるかで使い分けています。

```swift

func grey_getButtonInstance(completion: ((UIButton) -> Void)?) -> GREYActionBlock {
  return GREYActionBlock.action(withName: "grey getButtonInstance") { (ele, err) -> Bool in
    guard let _ = err else { return false }
    guard let button = ele as? UIButton else { return }
 
    completion?(button)

    return true
  }
}

```

```swift
let storeButton: UIButton!

EarlGrey.select(elementWithMatcher: grey_kindOfClass(UIButton.self))
        .inRoot(grey_kindOfClass(UIView.self))
        .assert(grey_getButtonInstance { button in
           storeButton = button
        })

```

こんな感じで取得できます。
とりあえずインタラクティブでswiftに触れてみる（hello world!）

仕事でSwiftを使って開発することになった。
初学者なので1から勉強したことを整理していくことにした。
普段、科学計算を専門(fortran,c）としている大学院生が、アルバイトでアプリを作る流れになるので、暖かく見守っていただきたい。笑

とりあえずInteractiveにswiftを使って、"hello world!"とprintすることがこのページの目標。

###環境の確認
Swift、Xcodeのバージョンは、以下コマンドで確認出来る。

```
$ swift --version
Apple Swift version 3.1 (swiftlang-802.0.53 clang-802.0.42)
Target: x86_64-apple-macosx10.9
$ xcodebuild -version
Xcode 8.3.3
Build version 8E3004b
```

###ターミナルで実行する方法
ターミナルからRead-Eval-Print-Loop（対話型実行環境）でswiftを実行できる（らしい。REPLについては不勉強なのでここでは詳細は省く）
下記のようにswiftと入力してswiftを立ち上げ、print("hogehoge")と入力すれは、print出来る。

```swift:terminal
$ swift
Welcome to Apple Swift version 3.1 (swiftlang-802.0.53 clang-802.0.42). Type :help for assistance.
  1> print("hello, world!!")
hello, world!!
```

###Xcodeで実行する方法
Xcodeは、SwiftのIDE（統合開発環境;エディター、デバッガやGUIデザイナー等の機能を備えた環境）です。
XcodeのPlaygroundを使うと、Swiftを対話的に実行できる。
一般的にSwiftでの開発にはXcodeを使ってビルドし、実行する。
（らしい）

1.Xcodeを起動して、"Get started with a playground"を選択。
![スクリーンショット 2018-04-24 16.22.15.png](https://qiita-image-store.s3.amazonaws.com/0/252703/2f1f2ff6-2afb-d5f5-3f9d-76d75b42f159.png)

2.Playgroundを作成する。（nextを選択すると保存先が選べる。）
![スクリーンショット 2018-04-24 16.25.03.png](https://qiita-image-store.s3.amazonaws.com/0/252703/7b1582a8-9d4a-b220-9fdf-6dce3225ae6e.png)

3.最初の画面が立ち上がる。
![スクリーンショット 2018-04-24 16.25.16.png](https://qiita-image-store.s3.amazonaws.com/0/252703/19474c50-f597-117d-c68a-ce9d34569815.png)

4.とりあえず何も考えずにhello worldを書き込む。
![スクリーンショット 2018-04-24 16.27.50.png](https://qiita-image-store.s3.amazonaws.com/0/252703/483534cc-f408-843f-443c-2fd6e01a2ad6.png)

###まとめ
無事にターミナルでも、Xcodeでもhello, world!出来た。
Xcodeだと\nの改行コードが入っているのだが…とりあえずなので良しとする。
Rails Tutorial 2周目覚書（3章）

#第3章　ほぼ静的なページの作成
テストをやるよってのがメインな気がした章。
何気にコラムやちょっとした解説にほほーってなった。

###herokuの仕様？
>RailsのデフォルトのページはHeroku上ではうまく表示されない仕様になっています。

###ブランチ習慣
>Gitを使う場合は、masterブランチでずっと作業するのではなく、その都度トピックブランチを作成して作業するのがよい習慣です。Gitでバージョン管理を行っているのであれば、次のコマンドを実行して、静的なページ用のトピックブランチをチェックアウトしましょう。

ブランチ（static-pages）切った後の最初のプッシュの流れ
`$ git add -A`
`$ git commit -m "Add a Static Pages controller"`
`$ git push -u origin static-pages`
以降はpushでOK

###Railsコマンドの短縮形
|完全なコマンド|短縮形|
|:---|:---:|
|$ rails server|$ rails s|
|$ rails console|$ rails c|
|$ rails generate|$ rails g|
|$ rails test|$ rails t|
|$ bundle install|$ bundle|

###Railsはキャメルケース好き？
>コントローラ名をキャメルケース (単語の頭文字を大文字にしてつなぎ合わせた名前) で渡していることに注目してください。こうすると、StaticPagesコントローラ名をスネークケース (単語間にアンダースコアを加えて繋ぎ合わせた名前) にしたファイルstatic_pages_controller.rbを自動的に生成します。ただし、上のような命名は単なる慣習に過ぎません。
実際、コマンドライン上で次のようなスネークケースのコントローラ名を入力しても、
`$ rails generate controller static_pages ...`
先ほどと同様にstatic_pages_controller.rbというコントローラが生成されます。これは、Rubyがクラス名にキャメルケースを使う慣習があり (詳細は4.4で説明します)、また、キャメルケースの名前を使うことが好まれているためです。これらの慣習に必ず従わなければいけないということではありません。

###rails destroy
>Railsはコントローラ以外にも関連ファイルを大量に生成するので、生成されたコントローラファイルを削除するだけでは元に戻りません。自動生成されたコードを元に戻すためには、新規作成されたファイルを削除するだけではなく、既存のファイルに挿入されたコードも削除する必要があります (実際、2.2や2.3でも説明したように、rails generateを実行するとルーティングのroutes.rbファイルも自動的に変更されるので、これも元に戻さなくてはなりません)。このようなときは、「generate」という言葉に因んで、rails destroyというコマンドを実行することで元に戻すことができます。

>マイグレーションの変更を元に戻す方法も用意されています。
元に戻したいときは、db:rollbackで1つ前の状態に戻します。
  `$ rails db:rollback`
最初の状態に戻したいときは、VERSION=0オプションを使います。
  `$ rails db:migrate VERSION=0`
  
頻繁に触ってたら必要に駆られて勝手に覚えるんでしょうけど、この辺は忘れやすい。

###テストについて
>何らかの変更を行う際には、常に「自動化テスト」を作成して、機能が正しく実装されたことを確認する習慣をぜひ身に付けましょう。アプリケーションを開発しながらテストスイート (Test Suite) をみっちり作成しておけば、いざというときのセーフティネットにもなり、それ自体がアプリケーションのソースコードの「実行可能なドキュメント」にもなります。テストを作成するということは、その分コードを余分に書くことになりますが、正しく行えば、むしろテストがないときよりも確実に開発速度がアップします。テストが揃っていれば、バグを追うために余分な時間を使わずに済むためです。

>本書における主要なテストは、コントローラテスト (この節より)、モデルテスト (第6章より)、統合テスト (第7章より) の3つです。統合テストでは、ユーザーがWebブラウザでアプリケーションとやりとりする操作をシミュレートできるので特に強力です。

3.3.1のテストで変なエラーが出るっぽい
`$ sudo yum install -y tmux`
でtmux入れたりdb:migrateしたら消えるっぽい。
test失敗時の出力が正常じゃない。minitestが最新だとそうなるっぽいのでgem 'minitest', '~> 5.10.1'をgemfileに追記。

[Ruby on Rails チュートリアル３章のテストのバグとその対応メモ](https://qiita.com/miihon_ani/items/1ab1b5733258374efa33)

あとGuardの設定はパスした。バグがあるとのことだし、使わない気がするので。
電子回路の勉強（無安定マルチバイブレータを作ってみた）

#概要
Arduinoを使っての開発を行っていますが、電子回路の基礎知識が無いので少しずつ学習して行きたいと思います。
今回は、主にトランジスターとコンデンサーの動きについて勉強しました。
参考にしたサイトなどを備忘録として残しておきます。

#教材
今回は初心者用の電子キットを売っているサイトの「無安定マルチバイブレータ」を購入したので勉強しながら組み立ててみたいと思います。
http://denshikit.main.jp/shopf/vibrate.html

まずは使用している電子部品について学びました。

#トランジスターとは
トランジスタは、増幅、またはスイッチ動作をさせる半導体素子です。
今回はスイッチ動作をメインで学びました。

トランジスターについて参考にしたサイトは下記になります。
このサイトの動画がすごく参考になりました。
https://www.murata.com/ja-jp/campaign/ads/japan/elekids/compo/transistor

＜学んだこと＞
・エミッタ、コレクタ間の電流はエミッタ、ベース間に電流を流すことで流れ出す（エミッタ、コレクタ間の回路がONになる）

#コンデンサーとは
コンデンサは、静電荷を蓄えたり、放出したりする受動素子です。
コンデンサーについて参考にしたサイトは下記になります。

https://www.murata.com/ja-jp/campaign/ads/japan/elekids/compo/capacitor

＜学んだこと＞
今回のキットの回路では極性のあるコンデンサを使っているが、一瞬ですが両方向に電流が流れ、電気を蓄えることが分かりました。
（ただ、逆向きに大きな電流・電圧をかけると破裂するそうです。）

#発行ダイオード（LED）
発行ダイオードがなぜ光るかは下記の動画のダイオードの話（２４分ころから）が参考になりました。
https://www.youtube.com/watch?v=UIH9EfNWnq4

＜学んだこと＞
発光ダイオードは順方向の電圧を流し、＋－の電子が再結合するエネルギーを使って発光していることを学びました。

#ブレッドボードで仮動作確認
キットについていた回路図を元にブレッドボードで仮組みを行い、動作の確認を行いました。
左右が同じ回路でも実際には少しの違いが発生します。そのため、最初は左右どちらかの回路にベース電流が流れます。
ベース電流が流れると、トランジスタのコレクタ電流が流れるので、コレクタは０Ｖになります。
この間、コンデンサには電化がたまって行き、逆側のベース回路がプラスになっていきます。
そうして逆側のベース回路がプラスに引き上げられると逆側にベース電流が移るという仕組みになっています。
この繰り返しでＬＥＤの点灯を制御しています。
（詳しい説明はキットに解説がついているので、購入してみてください）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/b2d6bd3a-a5cb-a4f6-acc5-07fec6e47673.png)

#組立、テスト稼動
キットについていた回路図とブレッドボードで仮組みした回路を参考に配線を考え、組み立てました。
（かなり汚い仕上がりですみません、、）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/95cc6f8f-5dbf-4a2a-a4e2-78281088e13f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/191429/737e0bfa-f4a0-8e79-9491-6d165a45d85c.png)

実際に動かしてみました。LEDが交互に点灯されているのが分かると思います。
![ezgif-5-19cef7bff0.gif](https://qiita-image-store.s3.amazonaws.com/0/191429/b3602b51-0fcc-91f9-87ad-ce14a9254d39.gif)


#まとめ
キットについていた回路図と説明を読みながら、電流の流れを勉強しました。
理論だけでなく実際に組み立てることで理解が進むことを改めて感じました。たぶん参考にしたサイトの説明だけを読んでも理解は難しいと思いますが、実際にくみ上げることで電流の流れをより理解することが出来たと思います。

まだ自分でコンデンサーやトランジスタを使って回路を考えるのは難しいですが、少しずつ基礎を固めて応用できるようにして行きたいと思います。

あと、キットを購入する場合は、電池(CR2032）が必要になるので、一緒に購入しておくとよいと思います。

#参考
下記の記事のおかげで簡単にGIFアニメを作成することができました。ありがとうございました。

＞Qiitaにアップする画面動画をgifアニメで簡単に作ろう
https://qiita.com/bohebohechan/items/f8bf6d4bbe0f14497a7b

以上です。
git statusしたときに(modified content)が発生したので対応した時の記録

#git status→(modified content)が発生しました。

```
$ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#   (commit or discard the untracked or modified content in submodules)
#
#	modified:   html/js/multiple-select (modified content)
#
no changes added to commit (use "git add" and/or "git commit -a")
```

調べたら同じ状況に遭遇している方が多いようでした。
どうやらgit の submoduleを利用している場合に発生するようです。
特段難しい話ではありませんが、自分で作業してて、あれってなったので記録しておきます。

#対応しました。

該当のsubmoduleのディレクトリに移動し、その差分を確認しました。

```
$ cd html/js/multiple-select
$ git diff
diff --git a/LICENSE b/LICENSE
old mode 100644
new mode 100755
diff --git a/README.md b/README.md
old mode 100644
new mode 100755
diff --git a/jquery.multiple.select.js b/jquery.multiple.select.js
old mode 100644
new mode 100755
diff --git a/multiple-select.css b/multiple-select.css
old mode 100644
new mode 100755
diff --git a/multiple-select.jquery.json b/multiple-select.jquery.json
old mode 100644
new mode 100755
```
filemodeの差分が発生していることがわかりました。
差分をチェックアウトして、filemodeを元に戻します。

```
$ git checkout -- .
```

これで差分がなくなったはず・・・
もとのディレクトリに戻って再確認します。

```
$ git status
# On branch master
nothing to commit (working directory clean)
```

差分がなくなりました。
Alpine Linux で timezone を変更する（最新版？）

alpine ベースの Docker イメージを使うと標準では UTC になる
ログの時間を localtime で取りたくなったのでメモ

Dockerfile に以下の命令を加える
`/etc/localtime` の設定だけではうまく行かないことがあったので `/etc/timezone` も変更すると良いかも

```
RUN apk add --update --no-cache tzdata && \
    cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
    echo "Asia/Tokyo" > /etc/timezone && \
    apk del tzdata
```

apk は Alpine Linux のパッケージマネージャ
`--no-cache` オプションをつけておけばアンインストール後にキャッシュを削除する必要がなくなる

基本的なことだが
全て1回の RUN に詰め込むことで無駄なレイヤーを作らずに済むのがポイント

参考：http://wiki.alpinelinux.org/wiki/Setting_the_timezone
VisualStudioCodeのタブが上書きされる問題

こんにちはm_saekiです。
VisualStudioCodeのタブが別ファイルを開くと上書きされてしまうのでそれの対処方法です。

## 環境
macOS : Sierra(10.12.6)
VisualStudioCode : バージョン1.22.2

## 方法
Code ⇨ 基本設定 ⇨ 設定
<img width="1032" alt="スクリーンショット 2018-04-24 15.55.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/237545/4860c68f-6130-2344-2afd-81ead78742d3.png">

```
"workbench.editor.enablePreview": false
```
を記入すれば終わりです。
極小構成でChrome拡張を作る

## Chrome拡張を作ってみた
自分がよく使うサイトでちょっと不便なところがあったので、Chrome拡張で改変してみました。
内容としては「FullScreen時に一部のオブジェクトを透過表示する」というもので、対象のサイトに
JavaScriptを追加するだけのChrome拡張になっています。

## ファイル構成
**manifest.json**と追加する**JSファイル**のみ。
試しにアイコンの画像も置いています。

- opre_comment_transparent/
    - manifest.json
    - 48.png
    - scripts/
        - contentscript.js
        - resource/
            - jquery-3.2.1.min.js

## ソース
### Gihhub
https://github.com/katsushi-machida/opre_comment_transparent

#### **manifest.json**
大体の内容はキー名から連想できます。
今回はJSの拡張なので**content_scripts**以下が肝となります。
> *matches*：対象とするURL(1つしか記述してないが、複数記述可能)
> *js*：JSファイルのパス
> *run_at*：読込タイミング

```json:manifest.json
{
  "name": "opre_comment_transparent",
  "version": "0.0.1",
  "manifest_version": 2,
  "description": "display openrec comment to full screen.",
  "icons": {
      "48" : "48.png"
  },
  "content_scripts": [
    {
      "matches": [
        "https://www.openrec.tv/live/*"
      ],
      "js": [
        "scripts/resource/jquery-3.2.1.min.js",
        "scripts/contentscript.js"
      ],
      "run_at": "document_end"
    }
  ]
}
```

#### **cotentscript.js**
普通のJSファイルです。

```javascript:contentscript.js
'use strict';

var chart_area_bg_color = '';
var comment_area_bg_color = '';

function fn_full_sc_com_open() {
    chart_area_bg_color = $('.c-chart.js-chartArea.live').css('background');
    comment_area_bg_color = $('.c-chart__comment.js-chartCommentArea.js-chartCommentAreaPc').css('background');
    $('#openrec-video-player').append($('<div id=\'full_sc_com_case\'></div>'));
    $('#full_sc_com_case').append($('<a class=\'full_sc_com_close_btn\' href=\'javascript:void(0)\'>✖</div>'));
    $('#full_sc_com_case').css('position', 'absolute');
    $('#full_sc_com_case').css('right', '0');
    $('#full_sc_com_case').css('font-size', '1.2rem');
    $('#full_sc_com_case').css('text-align', 'left');
    $('#full_sc_com_case').append($('#ticker'));
    $('#full_sc_com_case').append($('.c-chart.js-chartArea.live'));
    $('.c-chart.js-chartArea.live').css('background', 'rgba(0,0,0,0.4)');
    $('.c-chart__comment.js-chartCommentArea.js-chartCommentAreaPc').css('background', 'transparent');
}
function fn_full_sc_com_close() {
    $('.full_sc_com_close_btn').remove();
    $('.p-playlist').prepend($('#ticker'));
    $('.p-playlist').append($('.c-chart.js-chartArea.live'));
    $('.c-chart.js-chartArea.live').css('background', chart_area_bg_color);
    $('.c-chart__comment.js-chartCommentArea.js-chartCommentAreaPc').css('background', comment_area_bg_color);
}

$(document).on('webkitfullscreenchange mozfullscreenchange fullscreenchange', function (e) {
    if (!window.screenTop && !window.screenY) {
        // not fullscreen
        fn_full_sc_com_close();
    } else {
        // fullscreen
        fn_full_sc_com_open();
    }
});

$(document).on('click', ".full_sc_com_close_btn", function () {
    fn_full_sc_com_close();
});
```

## 公開について
5$課金すると通常の公開が行えますが、しなくても限定公開(URLを知っている人のみ)や非公開(自分のみ)は出来ます。
公開はChrome ウェブストアのデベロッパーダッシュボードより行えます。

[Chrome ウェブストア - 拡張機能](https://chrome.google.com/webstore/category/extensions?hl=ja)
LiveDataメモ

ライフサイクルを加味してくれて、データバインディングできるLiveDataについてメモ書き。

# 参考文献
https://developer.android.com/topic/libraries/architecture/livedata.html

# LiveDataとは
observableなデータホルダー。ライフサイクルを加味してよしなに、observerへデータ送信したり、該当のactivityなどがdestroyされたときは、observerを自動でremoveしてくれる。


# LiveDataの利点
- データの状態をうけとり、UIに自動で反映できる
- メモリリークしない
- アクティビティがBackStaskにあるときには、データ通知されない
- 自分で、ライフサイクル管理しなくていい
- BackStackからアクティブになった瞬間、最新のデータを受け取れる
- 画面回転などで、アクティビティを作り直した時も、最新のデータを受け取れる
- シングルトンでラップすれば、いろんな場所からLiveDataを購読できる

# LiveDataの使い方
1. LiveDataインスタンスを作成する。(通常、ViewModel内で行われる)
2. LiveDataの変更をうけとるonChanged()メソッドをもったObserverをつくる(通常、ActivityやFragmentにて)
3. observe()メソッドで、ObserverとLiveDataを紐付ける。このとき、LifecycleOwnerを紐付けることで、ライフサイクル管理をよしなにできる。
4. LiveDataインスタンスの値変更は、メインスレッド上ならsetValue()、バックグラウンドならpostValue()を使う

# kotlin実装イメージ

ViewModel

```kotlin
val nameLiveData: MutableLiveData<String> = MutableLiveData()
    
fun onButtonClicked() {
     nameLiveData.value = "hello world"
}

```

Activity

```kotlin
nameLiveData.observe(this, Observer {
     binding.name.text = it
})
```


# メモ

- ObserverのonChanged()メソッドは、setValueした都度、データに変更があろうとなかろうと呼ばれる
- DataBindingでLiveDataを購読したときは、元のデータとsetValueされたデータに違いがないと、呼ばれないぽい
Unity+VSCode使用時に「"GetReferenceNearestTargetFrameworkTask"タスクが見つかりませんでした。」と出た際の対処法


Unity+VSCodeで作業していると以下のエラーが出力され、VSCode上でのみエラーが出力される現象が発生したので対処方法をメモします。

```text
[fail]: OmniSharp.MSBuild.ProjectLoader
        "GetReferenceNearestTargetFrameworkTask" タスクが見つかりませんでした。次のことを確認してください。1.)プロジェクト ファイルの中のタスク名がタスク クラス名と同一である。2.)タスク クラスが public であり Microsoft.Build.Framework.ITask インターフェイスを実装する。3.)プロジェクト ファイルまたは "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin" ディレクトリに配置された *.tasks ファイルの中の <UsingTask> でタスクが正しく宣言されている。
```

![error.jpg](https://qiita-image-store.s3.amazonaws.com/0/80207/6ad486e9-15f8-d831-da07-11e77fbe26fc.jpeg)

※VSCode上で確認したエラーについて正確に言うと、以下の様な名前空間が見つからないと言ったエラーが発生しました。

```csharp
The type or namespace name 'UnityEditor' could not be found (are you missing a using directive or an assembly reference?) [Assembly-CSharp]
```

- 環境について
    - OSはWindows10
    - Unity2017.4.1 f1で確認
    - VSCodeのバージョンは1.22.2

# 対処方法

ググってみた所、以下のフォーラムに近似する現象と思われるものがありました。
→[Visual Studio Problem](https://forum.unity.com/threads/visual-studio-problem.507850/)

**その上で結論から言うと、VisualStudioInstallerから取得できる「Visual Studio Build Tools」から「NuGetのターゲットおよびビルドタスク」を取得することで解決できました。**

## 手順

VisualStudioInstallerを開き、「VisualStudioBuildTools」から変更を選択

![change.jpg](https://qiita-image-store.s3.amazonaws.com/0/80207/e86177a0-4079-9578-b827-667789d23d9d.jpeg)


上の方にあるタブから「個別のコンポーネント」を選択。
後はコードツール欄にある「NuGetのターゲットおよびビルドタスク」を選択してインストール

![build.jpg](https://qiita-image-store.s3.amazonaws.com/0/80207/ad6b5e45-a5ac-c137-fa96-c0a5f529cc00.jpeg)
Anaconda仮想環境の名前を変更する方法

#忘れないうちに個人的メモとして残す。
## 元ネタは、ゆるふわさんの以下の記事から。
http://paper.hatenadiary.jp/entry/2017/05/02/110302
ただし、--nとなっているのは-nに修正しときます。

```
conda create -n NEW_NAME --clone PREVIOUS_NAME
conda remove -n PREVIOUS_NAME --all
```

クローンして元の環境を削除
Unityシェーダーの覚書1

最近シェーダーの勉強を始めたので学んだことの自分用メモ。
unityでのシェーダーについて自分なりにまとめていくつもりである。
考え方についてはUE4にも応用できたらいいなと。

Unityではマテリアルとシェーダーが1対1で結びついています。

**・処理の流れ**
図にすると下記のような感じです。
![資料.png](https://qiita-image-store.s3.amazonaws.com/0/252878/03a91833-0776-408a-3839-8fe3445627de.png)

Unityのサーフェイスシェーダーには3つの工程があります。
・Vertex関数で頂点情報の処理
・Surf関数でオブジェクトの表面の色のを定義
・Lightingでオブジェクトの陰影を決定

**・シェーダーの中身**
unityでシェーダーファイルを作成した初期状態のものです。

```glsl:sample.shader
Shader "Custom/sample" {

//Parametersパート
	Properties {
		_Color ("Color", Color) = (1,1,1,1)
		_MainTex ("Albedo (RGB)", 2D) = "white" {}
		_Glossiness ("Smoothness", Range(0,1)) = 0.5
		_Metallic ("Metallic", Range(0,1)) = 0.0
	}

//Shader Settingsパート
	SubShader {
		Tags { "RenderType"="Opaque" }
		LOD 200
		
		CGPROGRAM
		// Physically based Standard lighting model, and enable shadows on all light types
		#pragma surface surf Standard fullforwardshadows

//Surface Shaderパート
		// Use shader model 3.0 target, to get nicer looking lighting
		#pragma target 3.0

		sampler2D _MainTex;

		struct Input {
			float2 uv_MainTex;
		};

		half _Glossiness;
		half _Metallic;
		fixed4 _Color;

		void surf (Input IN, inout SurfaceOutputStandard o) {
			// Albedo comes from a texture tinted by color
			fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
			o.Albedo = fixed4(0.1f, 0.1f, 0.1f, 1);
			// Metallic and smoothness come from slider variables
			o.Metallic = _Metallic;
			o.Smoothness = _Glossiness;
			o.Alpha = c.a;
		}
		ENDCG
	}
	FallBack "Diffuse"
}
```

シェーダーは大きく分けて3つのパートに分かれています。
・Parameters
・Shader Settings
・Surface Shader

では上記の3つのパートでは何をしているのでしょうか？
Parametersのパートではインスペクタに公開する変数を記述します。プログラムでいう変数の定義のようなものです。
Shader Settingsのパートではライティングや透明度などのシェーダーの設定項目を記述します。
Surface Shaderのパートにはシェーダ本体のプログラムを記述します。この部分を修正して目的のシェーダを作ります。

試しにo.Albedoのパラメータの数値を変えてみてください。するとモデルの表面の色が変わると思います。
のっぺりした色でなく立体的な色になっているのはSurfで色を決定した後にLightingの工程で光を当てることにより陰影がつくからです。

下記のサイトにて勉強させていただきました。
こちらにより詳しく記載されています。
[Unityシェーダー入門](http://nn-hokuson.hatenablog.com/entry/2016/09/12/202320)
【Mac】郵便局が公開している都道府県一覧CSVファイルがTextEditで文字化けしてしまう


コレ↓

![Screen Shot 2018-04-24 at 15.26.02.png](https://qiita-image-store.s3.amazonaws.com/0/109241/3249b552-5381-bb8f-5348-a4a111b58046.png "Screen Shot 2018-04-24 at 15.26.02.png")

で http://www.post.japanpost.jp/zipcode/dl/oogaki-zip.html で公開されているCSVファイルを見たい。
ちなみにNumbersだと文字化けしない。

![Screen Shot 2018-04-24 at 15.26.23.png](https://qiita-image-store.s3.amazonaws.com/0/109241/8a767992-3d07-66e9-f76b-67f57907c2d2.png "Screen Shot 2018-04-24 at 15.26.23.png")


## 解決法

TextEditのPreferenceでOpen時の設定を `Japanese (Mac OS)` にする。

![Screen Shot 2018-04-24 at 15.08.19.png](https://qiita-image-store.s3.amazonaws.com/0/109241/9b13e209-11bb-5a19-c0d1-2034ecc8ca07.png "Screen Shot 2018-04-24 at 15.08.19.png")
NSDateFormatterで日にちが一週間ずれる


```objective_c
NSDateFormatter *fmt = [NSDateFormatter new];
[fmt setDateFormat:@"YYYY-01-01 00:00:00 0000"];
[fmt setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
NSString *dateStr = [fmt stringFromDate:[NSDate date]];
NSDate *minDate = [fmt dateFromString:dateStr];
```

とした際にminDatが一週間ずれることがあった。

## 解決策

YYYY を yyyyに変更
Y(大文字)はその週の年、つまり1月1日が週の後半(厳密には木曜日以降)だったら、その週は前年の週と見なされる。
iOS11でUIBarButtonItemのサイズがずれる


メンテナンスしていなかったアプリのUIBarButtonItemのサイズがやたらおかしくなっていたことに気づいた。

## 原因
UIBarButtonItemのレイアウト設定がautolayoutに対応したのが原因のよう

## 解決策

```swift
 let widthConstraint = button.widthAnchor.constraint(equalToConstant: 32)
 let heightConstraint = button.heightAnchor.constraint(equalToConstant: 32)
 heightConstraint.isActive = true
 widthConstraint.isActive = true
```

```objective-c
NSLayoutConstraint * widthConstraint = [customButton.widthAnchor constraintEqualToConstant:40];
NSLayoutConstraint * HeightConstraint =[customButton.heightAnchor constraintEqualToConstant:40];
[widthConstraint setActive:YES];
[HeightConstraint setActive:YES];

UIBarButtonItem* customBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:customButton];
self.navigationItem.leftBarButtonItem = customBarButtonItem;
```

このように縦と横の制約を追加
Realmのモデルでビルドエラー


Realmのモデルで以下のエラーが発生したら
`Unsupported type java.lang.Object`

モデル内でAnyを使用していないか
(今回のcaseはAPIがdingoで作られていて空の場合はList、入っている場合はdoubleで返ってきていたのものをコピペしていたからこのようになった)
drawerHeaderをdatabindingで触る


```kotlin
class TimelineActivity : AppCompatActivity() {

    val binding by lazy {
        DataBindingUtil.setContentView<ActivityTimelineBinding>(this, R.layout.activity_timeline)
    }
    val viewModel by lazy { TimelineViewModel() }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding.navView.run {
            DataBindingUtil.bind<NavHeaderTimelineBinding>(getHeaderView(0))
            val headerBinding = DataBindingUtil.getBinding<NavHeaderTimelineBinding>(getHeaderView(0))
            headerBinding.state = viewModel.state
        }
    }
```
databindingでstring+文字列の表示


```
                <TextView
                    android:id="@+id/menu_price_content"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:text="@{@string/menu_price_content_str(menu.price)}"
                    android:textColor="@android:color/black" />


```

`<string name="menu_price_content_str">%s円</string>`

あとはmenuをいれて更新するだけ
CustomDatabindingAdapterでURLがあったら表示、なかったらデフォルトの画像を表示


例えばimageUrlがあったらそれを表示してなかったらデフォルトの画像を表示したい場合

``` CustonBindingAdapter.kt
object CustomBindingAdapter {
    @JvmStatic
    @BindingAdapter("app:imageUrl")
    fun imageUrl(imageView: ImageView, imageUrl: String?) {
        if (imageUrl != null)
            Glide.with(imageView.context).load(imageUrl).into(imageView)
        else
            imageView.setImageResource(R.drawable.no_image)
    }
}
```

これでxmlからapp:imageUrlでアクセスできる

```xml
<ImageView
    android:id="@+id/hospital_image_view"
    android:layout_width="80dp"
    android:layout_height="80dp"
    android:layout_margin="10dp"
    app:imageUrl="@{ hospital.mainImage }"/>
```
アプリを起動したら前の画面のキーボードが出てしまう際の対処法


前の画面などでEdittextなどを実装してそれに重なるfragmnetでもアプリを復帰するたびにキーボードが出てしまう

## 対処法

前のfragmentのEdittextにfocusが当たったままなのが原因。

```ResultFragment.kt
editText.isFocus = false
```

でfocusを外してあげる

この状態で前のfragmnetに戻ったらfocusがなかったりcursorが出なかったりするので

```SearchFragment.kt
editText.isFocus = true
editText.isFocusableInTouchMode = true
```

としてあげる
DataBindingの演算子


Javaとほとんど同じ

```
算術演算子 + - / * %
文字列連結演算子 +
論理演算子 && ||
バイナリビット演算子 & | ^
単項演算子 + - ! ~
シフト演算子 >> >>> <<
比較演算子 == > < >= <=
instanceof
グルーピング ()
リテラル: 文字、文字列、数字、null
キャスト
メソッド呼び出し
フィールド アクセス
配列アクセス []
三項演算子 ?:+1: 
```


```
例
android:text="@{String.valueOf(index + 1)}"
android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
android:transitionName='@{"image_" + id}'
```

null合体演算子

```xml
android:text="@{user.displayName ?? user.lastName}"
```

プロパティ参照

```xml
android:text="@{user.lastName}"
```

NullPointerExceptionの回避

```xml
例
@{user.name}がnullの場合、ぬるぽを回避してnullが入る。
@{user.age}などintの場合は0が入る。
```

xml内でviewなどにアクセスしたいときは

```xml
<data>
        <import type="android.view.View" />
        <variable
            name="employee"
            type="com.example.Employee"/>
</data>
```


とViewのインポートを忘れずに

xml内でorを使う場合

```xml
andorid:visivility="@{user.role == 1 || 2 ? View.VISIBLE : View.GONE}"

ではなく

andorid:visivility="@{user.role == 1 || user.role == 2 ? View.VISIBLE : View.GONE}"

とする
```

textなどにintをいれたいときは

```
android:text="@{Integer.toString(user.role)}"
```
php strom ショートカット


`⇧ シフト` `⌥ オプション` `⌘ コマンド` `⏎ エンター` `⌃ コントロール`

自動でセミコロンつけたりメソッド補完して終わらせてくれる

`⇧⌘⏎`

arrayの中身整形

`⌥⌘L`

＝合わせ

`⌥⌘I`

codic出す

`⇧⌘D`
relationでとってきた値の空判定


例えばuserから所属する代理店を取得して空判定をしたいとき

```
if(empty(user->agency)){
	hogehoge
}
```

などでは判別できない。

`count`を使って0かどうかで判断する。

```
if(user->agency->count() == 0){
	hogehoge
}
```

もっといい方法あるかも
中間テーブルに値を保存


単純に追加する場合
`attach`を使用
被っている値があってもばんばん追加される

```
$user = App\User::find(1);

$user->roles()->attach($roleId);
```

指定した値以外保存してほしくない場合
`sync`を使用
渡した配列に指定されていないものは勝手に削除される

```
$user->roles()->sync([1, 2, 3]);
```

123以外は削除される
また中間テーブルのID以外を更新したい場合

```
$user->roles()->sync([1 => ['expires' => true], 2, 3]);
```

実際の使用例

```
$user->agency()->sync([$agency->id]);
```
Ubuntuのmysqlのエラー(ERROR 1045 (28000): Access denied for user 'xxx'@'localhost' (using password: YES))

# Ubuntu16.04mysqlのインストール後エラーが起きたのでメモ

# やり方　
### mysqlのプロセスを停止  
  
```bash:bash
sudo systemctl stop mysql
```
### **他のサイトとかでも解決しなかった人は、別のプロセスが起動していると思うので、強制終了**

```bash:bash
sudo ps aux|grep mysql
> root      5321  0.0  0.1   4508  1640 ?        S    Apr23   0:00 /bin/sh /usr/bin/mysqld_safe --skip-grant-tables
> mysql     5681  0.0 17.9 1151340 180240 ?      Sl   Apr23   0:09 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --skip-grant-tables --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306 --log-syslog=1 --log-syslog-facility=daemon --log-syslog-tag=
> xxxx      8669  0.0  0.0  14224   984 pts/0    S+   01:51   0:00 grep --color=auto mysql
```

### 上で出てきたPIDをkill

```bash:bash
sudo kill 5321
sudo kill 5681
sudo kill 8669
```

### mysqlをセーフモードで起動
```bash:bash
mysqld_safe --skip-grant-tables &
```

### **もし失敗したら**
1. 起動していたプロセスをkill
2. 以下を実行して、もう一回

```bash:bash
sudo mkdir -p /var/log/mysql
sudo chown mysql:mysql /var/log/mysql
```

```bash:bash
sudo ps aux|grep mysql
sudo kill xxxx #出力された　PIDをxxxxに入力
sudo kill yyyy #出力された　PIDをyyyyに入力
#全部入力
```

### パスワードなしでログインできる形でmysqlを起動
```bash:bash
mysqld_safe --skip-grant-tables &
```
### mysqlを操作
```
mysql -u root
```

### mysqlを操作
```bash:bash
use mysql;
select * from  user;
truncate table user;
flush privileges;
grant all privileges on *.* to root@localhost identified by 'パスワード！！適宜変えて' with grant option;
flush privileges;
select * from  user;
exit
```

### mysql(サーバー側)を終了
```bash:bash
sudo ps aux|grep mysql
sudo kill xxxx 
#出力された　PIDをxxxxに入力
#全部入力
```
### 普通のmysqlを起動
```bash:bash
sudo systemctl start mysql
```
node.js で Phantom を使えるようにするまでの準備

node.js で Phantom をインストールして使えるようにするまでの準備作業を残しておきます。

インターネットにある半年前の情報では、

```
> npm init
> npm install --save phantom phantomjs
```

という手順で、関連するモジュールをインストールするように説明されています。
しかし、

```
npm WARN deprecated phantomjs@2.1.7: Package renamed to phantomjs-prebuilt. Please update 'phantomjs' package references to 'phantomjs-prebuilt'
npm WARN deprecated tough-cookie@2.2.2: ReDoS vulnerability parsing Set-Cookie https://nodesecurity.io/advisories/130
npm WARN deprecated node-uuid@1.4.8: Use uuid module instead
```

という警告が表示されます。

## phantomjs-prebuilt をインストールする

```
npm WARN deprecated phantomjs@2.1.7: Package renamed to phantomjs-prebuilt. Please update 'phantomjs' package references to 'phantomjs-prebuilt'
```

はモジュール名が変更されたので、`phantomjs-prebuilt` をインストールするように書かれています。ですので、

```
> npm uninstall --save phantomjs
> npm install --save phantomjs-prebuilt
```

と実行して、`phantomjs-prebuilt` をインストールします。

## tough-cookie をアップデートする

次に、

```
npm WARN deprecated tough-cookie@2.2.2: ReDoS vulnerability parsing Set-Cookie https://nodesecurity.io/advisories/130
```

は、tough-cookie@2.2.2 に脆弱性という警告で、参照先の URL を確認します。

* [ReDoS via long string of semicolons - Node Security Platform | Advisory](https://nodesecurity.io/advisories/130)

バージョン 2.3.0 以上にアップデートするように記載されているので、実行します。

```
> npm install --save tough-cookie

+ tough-cookie@2.3.4
updated 1 package in 0.969s
```

## uuid をインストールする

最後に

```
npm WARN deprecated node-uuid@1.4.8: Use uuid module instead
```

は node-uuid は非推奨なので、uuid というモジュールを使うように警告が出ているので、こちらも対応します。

```
> npm uninstall --save node-uuid
> npm install --save uuid
```

## 現時点で PhantomJS をインストールするには

```
> npm install --save phantom phantomjs-prebuilt tough-cookie uuid
```

を実行することになります。
bundlerのバージョンエラーが起きた

## 何が起きたか？
普段railsアプリケーションでbundler --version 1.10.5を使っているのですが、bundlerのアップデートをした際に`bundle exec` コマンドを叩くと、エラーが発生しました。

###出現したエラーメッセージ

```
Bundler could not find compatible versions for gem "bundler":
  In Gemfile:
    bundler (= 1.10.5)

    rails-footnotes was resolved to 4.1.8, which depends on
      rails (>= 3.2) was resolved to 5.0.5, which depends on
        bundler (>= 1.3.0)

  Current Bundler version:
    bundler (1.16.1)
This Gemfile requires a different version of Bundler.
Perhaps you need to update Bundler by running `gem install bundler`?

Could not find gem 'bundler (= 1.10.5)', which is required by gem 'rails (>= 3.2)', in any of the relevant sources:
  rubygems repository https://rubygems.org/ or installed locally
```


### 対処方法

bundlerのアンインストールを実行しました。

```
$ gem uninstall bundler
```

選択肢が出現

```
Select gem to uninstall:
 1. bundler-1.10.5
 2. bundler-1.16.1
 3. All versions
```

2を選択。

bundlerのバーションを確認


```
$ rbenv exec gem list | grep bundler
bundler (1.10.5)
```

→ 1.16.1が消えている。
めでたし。