OmniAICreator/Qiita-1.07M huggingface dataset:
最小限のカスタマイズでvimを普段使いのメモ帳として使えるようにする

# 要件

## 概要

これまでmac標準のNotesを使ってメモを取っていたが、入力効率やファイルフォーマットの汎用性の観点から、vim + markdownの組み合わせでメモを取れるようにしたくなった。
既に様々なプラグインや補助ツールがリリースされていそうだが、やりたいこととしてはほぼ標準のコマンドの組み合わせで実現できて然るべき内容なので、本記事では「最小限のカスタマイズによる要件の達成」を目標とし、環境を構築する。

## メモ帳に求められる要件

以下の要件を満たす方法をそれぞれ考える

* メモを取りたい時に素早く起動できる
* 各メモ冒頭の数行を一覧し、対応するメモを素早く開ける
* メモを横断して検索できる
* 見やすい形で人に提示できる

# それぞれの要件に対する実現方法

## メモを取りたい時に素早く起動できる

以下のような関数を `.zshenv` に登録し、 `scratch` というコマンドですぐメモを取り始められるようにした。

```shell

function scratch () {
	nvim --cmd 'cd ~/Scratches' ~/Scratches/`scratchf $1`
}

function scratchf () {
	echo `date +%F``echo $1 | sed 's/^\(.\)/-\1/'`.md
}
```

`scratch` コマンドを打つと、今日の日付のファイル( e.g. `2018-05-17.md` )を開く、または新規作成した状態でvimが起動する。
`scratch foo` というように引数を渡すと、引数がファイル名末尾に付与された状態( e.g. `2018-05-17-foo.md` )で上記の挙動となる。
`--cmd 'cd ~/Scratches'` という引数を渡しているのは、起動したvimのカレントディレクトリを設定する目的でそうしている。
なお `~/Scratches` というディレクトリは、あらかじめ作成しておく。

`scratchf` は `scratch` 関数から参照されており、ファイル名を生成する関数。
この関数を単体で利用するケースについては、後述する。

### `scratch` 後に別名のメモを作成したくなった場合

上述の `scratchf` コマンドを利用する。
具体的にはvimのコマンドモードで ``:edit `scratchf foo` `` のようなコマンドを打てば、shellの実行結果が展開された状態で `:edit` が実行されるため、それを利用する。

## 各メモ冒頭の数行を一覧し、対応するメモを素早く開ける

普通に `head` コマンドを利用する。
具体的には `~/Scratches` カレントディレクトリがある状態で `head *` とするだけで、ファイルの先頭部分が一覧できる。

```
==> 2018-05-16.md <==
# 備忘録

出社前に必ず靴を履くこと。
裸足で出社した場合は誰かから靴を借りる。

==> 2018-05-17.md <==
# 今日のやること

* 掃除
* 餌やり

## 忘れそうなこと

* ゴミ出し
```

vimからその一覧を閲覧したいときは `:new | read ! head *` などとすれば、新しいバッファでシェルの結果が表示される。
そこからファイルを開きたいときは、ファイル名にカーソルを合わせた状態で `gf` なりなんなりすれば、ファイルを開くことができる。

## メモを横断して検索できる

標準のvimgrepを使う。
`:vimgrep foo * | copen` などど打てば、quickfixウィンドウからマッチしたポジションにジャンプできる。

## 見やすい形で人に提示できる

markdownをプレビューするプラグインを導入する。
今回は https://github.com/iamcco/markdown-preview.vim を利用した。
編集中にリアルタイムでプレビューが更新されたり、カーソル位置にスクロールが追従したり使い勝手は良いと感じた。

# おまけ

## 日本語入力をスムーズにする

コードを書いているときは気にならなかったが、メモとして日本語を打っているとinsertモードを抜けた後にIMEをオフにするのが煩わしく感じた。
Karabiner-Elementsを利用し `単発の左Ctrl` を `英数キー + Esc` にマッピングするようにした。
具体的には以下のような設定となる。

```json
{
  "title": "alone ctrl -> eisuu + esc",
  "rules": [
    {
      "description": "alone ctrl -> eisuu + esc",
      "manipulators": [
        {
          "type": "basic",
          "from": {
            "key_code": "left_control",
            "modifiers": {
              "optional": [
                "any"
              ]
            }
          },
          "to": [
            {
              "key_code": "left_control",
              "lazy": true
            }
          ],
          "to_if_alone": [
            {
              "key_code": "japanese_eisuu"
            },
            {
              "key_code": "escape"
            }
          ],
          "parameters": {
            "basic.to_if_alone_timeout_milliseconds": 200
          }
        }
      ]
    }
  ]
}
```

デフォルトのタイムアウトだと予期せずescが発動してしまうことが多かったので、 `basic.to_if_alone_timeout_milliseconds` を短めに設定した。( デフォルトは `1000` )

# まとめ

プラグインを書いたり導入したり専用のソフトをインストールしたりしなくても、ちょっとした工夫の組み合わせでできることは意外と多いと感じた。
単一の目的に最適化するのもいいが、自分の場合は多少不便でも汎用的なものの組み合わせを使う習慣をつけておく方が大事だと思った。
MacでGo言語を読むための環境整えた

#Motivation
- Dockerやがgoで書かれているため
- マイクロサービスのデバッグのために分散トレースツールを探したところ
jaegerがおすすめ！みたいな記事を読み、お前もgoかとなったため


#環境
OS: macOS High Sierra


#Goのインストール
homebrew先生は偉大ですね

```
brew install go
```

#エディタ Visual Studio Code(VS Code)のインストール
https://code.visualstudio.com/download
ここから持ってくるだけ。

#Goのための拡張機能のインストール
VS Codeをひらいて、下記のようにGoの拡張をインストール

<img width="1021" alt="Screen Shot 2018-05-17 at 19.18.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/94861/13bfe519-1721-b0ff-6b73-d982cab01c1f.png">


# Hello Go言語!


```hello.go
package main

import "fmt"

func main() {
  fmt.Printf("Hello Go言語!\n")
}
```

#Goのデバッグツールのインストール
Goのデバッグツール delveを下記を参考にインストール

```
go get -u github.com/derekparker/delve/cmd/dlv
```

https://github.com/derekparker/delve/blob/master/Documentation/installation/osx/install.md
Cognos Framework Manager のブリッジテーブル設定

#Framework Managerのブリッジテーブル設定
こんなTechnoteの存在を最近始めて気が付き、自分の興味と理解のために検証したので、自分で忘れないように投稿しておきます。
こちらの**Bridge Query Subjects**です。

**IBM Analytics Proven Practices - What's New in Framework Manager 10.2.2**
http://www-01.ibm.com/support/docview.wss?uid=swg21902184

こんなテーブル構造があったとします。
構造的に、PROPERTY_FACTとPROPERTY表で、スタースキーマ①を構成していて、OWNER_FACTとOWNER表でスタースキーマ②を構成しています。
例えば、PROPERTY表のPROPERTY_ID毎にPROPERTY_FACT表のAPPRAISED_VALUEを表示するのはリレーション一つで簡単にできまですが、PROPERTY_ID毎に別スタースキーマのOWNER_FACT表のGROSS_ANNUAL_INCOMEを表示するには、以下のモデルのようにOWNER_PROPERTY_BRIDGE表のようなブリッジテーブルを介在させる必要があります。
![Bridge.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/942ae367-447f-e67d-1fd3-2e369f0ceff6.jpeg)

しかしながら、OWNER_PROPERTY_BRIDGE表はリレーション的に1..nで接続されていますので、Cognosがこの表をファクト表と認識してしまい、PROPERTY_IDからGROSS_ANNUAL_INCOMEを表示する時に重複して集計してしまう事があります。

実際に、各表のテーブル定義と値を以下に示します。
**OWNER表**
![OWNER.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/2c9a762b-9285-5609-3392-d50771a8afec.jpeg)

**OWNER_FACT表**
![OWNER_FACT.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/6aac49b6-b2af-74d4-31b8-67dd85be02b9.jpeg)

**OWNER_PROPERTY_BRIDGE表**
![OWNER_PROPERTY_BRIDGE.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/34658660-9120-fca6-92f6-c50c1e647c16.jpeg)

**PROPERTY表**
![PROPERTY.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/47b3d01d-b803-c827-4a78-04197041b162.jpeg)

**PROPERTY_FACT表**
![PROPERTY_FACT.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/89c7d09b-05da-12c5-8cd4-29be20a5d87f.jpeg)

**レポート実行結果**
GROSS_ANNUAL_INCOMEの値がおかしいですね。
PROPERTY表のPROPERTY_ID、APPRAISED_VALUE、GROSS_ANNUAL_INCOME
![設定前.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/bc45e65d-aee7-f088-d10b-b25dbdd826f4.jpeg)


**ブリッジテーブル設定**
そこで、Technoteに記載の機能の、クエリーサブジェクトのプロパティで、ブリッジテーブルの設定を行います。
こちらですね、ブリッジテーブルにしたいOWNER_PROPERTY_BRIDGEクエリーサブジェクトで、(DQM)使用方法 = 「ブリッジ」に設定します。
![FM変更.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/90d4058c-8b4b-c398-160e-206842318a3e.jpeg)

パッケージを発行し、再度レポート実行します。
ばっちりですね。
![設定後.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/eed7636d-1023-26b3-ba67-11abd25106ef.jpeg)


2つのスタースキーマをつなぐ、マルチファクトモデルを生成する場合、思い出して設定してください。
OkHttpでオフラインの状態を判別してみる。

OkHttpを使ったネットワーク処理で、オフライン状態かどうかの判別をする方法を記載したいと思います。

# NetworkOfflineException を作成
まずはオフライン状態だった場合に発生させるExceptionのクラスを作成します。

```kotlin:NetworkOfflineException.kt
class NetworkOfflineException : IOException() {
    override val message: String?
        get() = "オフライン状態です。ネットワーク接続を確認してください。"
}
```

メッセージにはオフライン状態を伝える文言を入れておくといいと思います。

# NetworkManager を作成
現在ネットワークに接続しているか否かを判別するためのクラスを作成します。ざっと書くと以下のような感じです。

```kotlin:NetworkManager.kt
object NetworkManager {
    fun isConnected(context: Context): Boolean {
        val cm = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
        val networkInfo = cm.activeNetworkInfo
        return (networkInfo?.isConnected == true)
    }
}
```

なお、 `ConnectivityManager` の取得には `ACCESS_NETWORK_STATE` のパーミッションがの取得が必要になりますので、AndroidManifest.xmlに記載します。

```
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
```

# OfflineCheckInterceptor を作成

OkHttpでは `Interceptor` という処理を割り込ませる仕組みがあるので、ネットワーク判別を行う `Interceptor` を作成します。

```kotlin:OfflineCheckInterceptor.kt
class OfflineCheckInterceptor(val context: Context) : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        
        // オフラインならExceptionを発生させる
        if (!NetworkManager.isConnected(context)) {
            throw NetworkOfflineException()
        }

        return chain.proceed(chain.request().newBuilder().build())
    }
}
```

`NetworkManager` でオフライン判定を行い、オフラインなら `NetworkOfflineException` をスローするという感じですね。

以上で準備は完了です。
実際に使用する時は、OkHttpのインスタンスを作成する際に `addInterceptor` で `OfflineCheckInterceptor` を追加してやればOKです。

```
val okHttpClient = OkHttpClient.Builder().addInterceptor(OfflineCheckInterceptor(context)).build()
```

# 実際に使うと…

下記は仮想のコードですが、実際に書くとこんな感じになるかと思います。（RxJavaを使用）
オフライン時には `onError` に `NetworkOfflineException` として渡ってくるので、そこで良しなにエラー表示などを行うと良いのではないかと思います。

```
client.loads() // 適当なメソッド
      .subscribeOn(Schedulers.io())
      .observeOn(AndroidSchedulers.mainThread())
      .subscribeBy(
          onSuccess = {
              // 成功の処理
          },
          onError = {
              when (it) {
                  is NetworkOfflineException -> {
                      // オフライン時の処理
                  }
                  else -> {
                      // それ以外のエラー処理
                  }
              }
          }
      )
```

# まとめ
・OkHttpでオフライン判定を行う方法を記載しました。
・RxJavaなどと合わせて使うと、オフライン時の判定も `onError` の中で行うことが出来るので、良さげかなと思います。
Ethereum の適切な Gas Price を取得する

* Web3.js の `eth.getGasPrice` メソッドを使用することで、過去数ブロックの GasPrice の中央値を取得することができる
* [ドキュメント](https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethgasprice)
* 以下の例は web3 version 0.20.x 

# サンプルコード

```js
var web3 = new Web3(new Web3.providers.HttpProvider('https://mainnet.infura.io'));
web3.eth.getGasPrice(function(error, result) {
  console.log(result.toString(10));
  var gasPriceInGwei = web3.fromWei(result, 'gwei');
  console.log(gasPriceInGwei);
});
```

# 実際に動いているデモ
* [getCurrentGasPrice](https://piyolab.github.io/playground/ethereum/getCurrentGasPrice/)

# Note
- Ethereum 関連の情報は https://scrapbox.io/sushiether/ に集約することにしました。
- この記事の内容に変更・更新がある場合は、以下の URL を更新します。
- https://scrapbox.io/sushiether/Ethereum_の適切な_Gas_Price_を取得する
AkkaStream、Iterator作っちゃって、Iterator[Iterator[..が嫌な時

必要な時に限って忘れるので、メモ。

```scala
val flow: Flow[Int, Int, NotUsed] = 
    Flow.fromFunction[Int, Iterable[Int]](
      i => i until (i + 10))
  .mapConcat[Int]((x: Iterable[Int]) => x.to[collection.immutable.Iterable])
```
mapConcatがあなたの友達。
webpackで環境変数をモジュールに渡す

webpackでは本番環境用・開発環境用で処理を分けたい場合、環境変数の`process.env.NODE_ENV`を用いる。
さらに[DefinePlugin](https://webpack.js.org/plugins/define-plugin/) [^1]を使うと、モジュール内にこの環境変数を渡せるようになる。 

[^1]: 環境変数を渡すだけなら[EnvironmentPlugin](https://webpack.js.org/plugins/environment-plugin/)でも可能。

```js:webpack.config.js
var webpack = require('webpack');

module.exports = {
  entry: {
    ...
  },
  output: {
    ...
  },
  plugins : [
    new webpack.DefinePlugin({
      NODE_ENV: JSON.stringify(process.env.NODE_ENV),
    })
  ],
};
```

webpackを実行する際に、`NODE_ENV`にパラメータを渡してやる。

```
NODE_ENV=development webpack
```

こうするとモジュール内に環境変数の`NODE_ENV`を渡せるので、開発環境のみ実行されるといった処理を記述できる。

```js
if(NODE_ENV === 'development') {
  console.log('development');
}
```

本番環境用となる`NODE_ENV=production`の場合には、ビルド時のwebpackによる静的解析により、上記の式は`if(false) { ... }`と解釈される。
これに[UglifyJsPlugin](https://webpack.js.org/plugins/uglifyjs-webpack-plugin/)を用いると`if(false) { ... }`のような必ず実行されない式の部分は省かれるので、本番環境用ビルドには上記の処理が排除されたものが出力される。
【Rails】ActiveRecordでオブジェクトどうしを==で比較したとき、何が比較されるか

ActiveRecordで取得したオブジェクトが等しいかどうか、``==``で比較したい場合があります。

**オブジェクトどうしを==で比較するとき、何を比較しているかがあいまい**なため、調べました。

## 何を比較しているか
公式ドキュメントである[Ruby on Rails API](http://api.rubyonrails.org/)から[ActiveRecord::Core#==](http://api.rubyonrails.org/classes/ActiveRecord/Core.html#method-i-3D-3D)を参照すると、

> Returns true if comparison_object is the same exact object, or comparison_object is of the same type and self has an ID and it is equal to comparison_object.id.

とあります。大雑把に訳すと

> 比較対象のオブジェクトが厳密に同じオブジェクトであるか、または同じクラスのインスタンスでIDというインスタンス変数~~を持ち~~が値を持ち[^0.5]、さらにそれが同一であるときにtrueを返す[^1]

[^0.5]: （2018/05/19追記） コメントでの指摘を反映
[^1]: the same type は「同じ型」と訳したくなりますが、Rubyに型なんてモノは存在しないので意訳しました

となります。

つまり、ActiveRecordのインスタンスを``==``で比較するときは

* オブジェクトIDが同一の、全く同じオブジェクトどうし
* 同じテーブルの同じIDを持つレコードから作成されたオブジェクトどうし

のいずれかの場合にtrueが返るということになります。

## 注意する点
後者のルールによって、**あるインスタンス変数では別の値を持っているのに、==で比較するとtrueと返ってくる**状況がありえます。

### 片方のオブジェクトだけ編集された場合
例えば、同じテーブルの同じレコードから作成されたオブジェクトAとオブジェクトBがあるとします。

作成直後に両者を比較すると、当然``true``が返ります。

```ruby
obj_a = SampleModel.find(1)
obj_b = SampleModel.find(1)

obj_a == obj_b
=> true
```

しかし、このあと**オブジェクトAの一部のデータだけが変更された**場合に比較してもtrueが返ります。

```ruby
obj_a.name == "another name"

obj_a == obj_b
=> true
```

です。この場合、変更後の値がDBに保存されているかどうかは関係ありません。

### テーブルの主キーがIDでない場合
テーブルの主キーに何らかの事情でID以外が指定されている場合、**IDが同じ全く別々のデータを比較してもtrue**が返ってきます。

そんな特殊なケースでもIDという名前のカラムには最低限``unique``制約をつけておきましょう[^2]。

[^2]: uniqueじゃないIDentifierって何なんだって話ですけど

## 比較の例外[^0.5]
一方で、IDが一致しているのにfalseが返る場合があります。

それが**両辺のIDの値がともにnilである場合**です。例えば、

```ruby
SampleModel.new == SampleModel.new # => false
```

このような場合です。

``==``のソースコードを見ると、

```rails/core.rb
def ==(comparison_object)
  super ||
    comparison_object.instance_of?(self.class) &&
    !id.nil? &&
    comparison_object.id == id
end
```
となっており、確かに**左辺がnilでない**条件が入っています。

左辺がnilの場合は問答無用でfalseが返ってしまうので、比較そのものが行われないんですね。

newしてsaveする前のID値はnilなので、**ActiveRecordどうしの==での比較はID値の比較**とだけ覚えていると思わぬ穴にハマります。

注意しましょう。

## まとめ
* ActiveRecordのオブジェクトどうしを``==``で比較するとき、生成元クラスおよびIDが一緒なら``true``が返る
* 逆に、それ以外は見ていないので比較の際は注意
* IDという名前のカラムには最低限unique制約をつけよう
* IDがnilの場合は問答無用でfalseが返るので注意[^0.5]

誤りや言葉足らずな点がありましたらコメントにてご指摘ください。
Expoで「Application main has not been registered.」が出るとき（React Native）

react-native-cliで作ったアプリをexpoで確認しようとすると、以下のエラーが出ます。

```
Application main has not been registered.
```

これは、expoではデフォルトで'main'という名前のAppを探しに行くためです。

react-native-cliで作った場合はアプリ名が指定されていると思います。
index.jsに書いてあります。

```
AppRegistry.registerComponent('appName', () => App);
```

なので、app.jsonでexpo.appKeyを指定することで、解消されます。

```
{
  "name": "appName",
  "displayName": "appName",
  "expo": {
    "sdkVersion": "27.0.0",
    "appKey": "appName",
  }
}
```
JenkinsでJobを作る時のTips集

# 概要
Jenkins上でJobをつくる時のTips集です。

# Tips
## 古いビルドを破棄する
![スクリーンショット 2018-05-17 16.25.46.png](https://qiita-image-store.s3.amazonaws.com/0/55086/e6d4057d-8284-c9c8-88f4-cf4dae8d46c4.png)

古いビルドの破棄にチェックを入れてビルドの保存日数や最大数を設定します
高度な設定からビルドの成果物の日数や最大数を設定することも可能です。
Jenkinsマシンの容量不足対策になります。

## クローンとフェッチのタイムアウト
![スクリーンショット 2018-05-17 16.30.37.png](https://qiita-image-store.s3.amazonaws.com/0/55086/569c053b-2721-dc1c-a930-aa3b23f3544c.png)

ソースコード管理でGitを使う場合には、タイムアウト時間を設定することが可能です。
[ソースコード管理] -> [Git] -> [追加処理] -> [Advanced clone behavious]から設定ができます。
何も設定しない場合には10分です。大きなレポジトリの場合、やや短いこともありここでJobがこけることもあるので注意です。

## レポジトリの一部分をクローンする
Sparse checkout pathsで欲しいディレクトリだけcloneしてくることが可能になっています。
![スクリーンショット 2018-05-17 17.14.00.png](https://qiita-image-store.s3.amazonaws.com/0/55086/7105aff9-d4bf-5353-5aa4-dd5a706531ea.png)


## プロジェクトの削除を行ってもslaveのworkspaceは残ってしまう問題への対応

![スクリーンショット 2018-05-17 16.35.59.png](https://qiita-image-store.s3.amazonaws.com/0/55086/e40a92b6-d0e5-260a-5d1f-51de328410e9.png)

Jenkinsをmaster-slave構成にしている場合には、管理画面上からプロジェクトを削除してもslave上のワークスペースは残り続けてしまいます。
以下のスクリプトをJobとしてslaveで定期実行させることで存在しないプロジェクトのワークスペースを削除することが可能です。

```
require 'net/http'
require 'uri'
require 'fileutils'
require 'json'

uri = URI.parse("http://JENKINS_URL/api/json")
request = Net::HTTP::Get.new(uri)
request.basic_auth("user_name", "password")

req_options = {
  use_ssl: uri.scheme == "https",
}

response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
  http.request(request)
end

result = JSON.load(response.body)
jobs = result["jobs"].map{|job| job["name"] }

workspace_dirs = Dir.glob("../*")
workspace_dirs = workspace_dirs.map{|dir| File.basename(dir)}
workspace_dirs.each do |dir|
  FileUtils.rm_rf("../#{dir}") unless jobs.include?(dir)
end

puts "Job of jenkins synchronization completed!"
```

auth認証をかけていない場合は`request.basic_auth`は設定不要です。

## Xcodeのアーカイブを定期的に削除する
Xcodeビルド限定の話ですが、Xcodeのキャッシュやアーカイブは定期的に削除すると容量不足対策になります。不必要な場合は削除してしまいましょう。

```
# Xcodeアーカイブ、キャッシュクリア
rm -rf ~/Library/Developer/Xcode/DerivedData/
rm -rf ~/Library/Developer/Xcode/Archives
```

↑このスクリプトを定期JobとしてJenkinsで実行させる。

## Jenkinsを通して（Master -> Slaveの）keychainアクセスに失敗する
キーチェーンアクセスをアンロックする必要があります。
マシンの再起動のたびに必要のようです。

```
security unlock -p パスワード ~/Library/Keychains/login.keychain
```

一部のSierraのバージョンでは、さらに以下の設定も必要のようです。


```
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k LoginPassword login.keychain
```

参考
* https://stackoverflow.com/questions/39868578/security-codesign-in-sierra-keychain-ignores-access-control-settings-and-ui-p
gitだけで設定なしでgitサーバを立ち上げる

基本中の基本なんだけど，gitbucketを使うようになって，うっかり忘れてしまったので．
「git サーバ」とかで検索するとgit-coreとか入れてユーザ作って．．．．．みたいな面倒くさい方法がたくさんひっかかるんだけど，普通にgit入れるだけで，できる．

# 目的

gitサーバをすげー簡単に立てる

# 前提

sshが通る．
proxy越しでもいい．

# インストール

```sh
sudo apt-get install git
```

# sshの設定

gitの設定はいらないけど，sshが通るようにしておく必要はあるので．

ユーザ名や証明書の設定を入れたければ，``~/.ssh/config``に設定しておく．

```sh
ssh hostname
```

```conf:~/.ssh/config
Host hostname
    HostName     hostname.fqdn
    User         username
    IdentityFile ~/.ssh/id_ed25519
    ProxyCommand nc -x sock.proxy.fqdn:1080 %h %p
    #ProxyCommand /usr/bin/corkscrew http.proxy.fqdn 8080 %h %p
```

# 使い方

gitサーバ上のリポジトリを置く場所を``/home/username/git``とする．

## リポジトリ作成

```sh
ssh hostname
cd /home/username/git
mkdir repository.git
cd repository.git
git init --shared --bare
```

## push

```sh
cd path/to/localpj
git init
git remote add origin ssh://hostname/home/username/git/repository.git
git add some.file
git commit -C 'comment'
git push origin master
```

## clone

```sh
git clone ssh://hostname/home/username/git/repository.git
```
印刷時にbackground-colorが反映されないときの対処法

## 今回のテーマ
ページを印刷する際に背景色が反映されないことがありました。

印刷の際にページと同一の色を付与したいにも関わらず反映されないという事態、、

しかし、これはCSSで解決できるようです。

以下に手順を記します。

### chromeだけ適用できる設定
CSSで背景色も印刷時に反映されるように指定をしておく。
※chromeしかないプロパティなのでIEやFireFoxでは使えない。

```css

body {
  -webkit-print-color-adjust: exact;
}
```

## 次に、!importantを付けて解決
印刷したい箇所の背景色指定には!importantをつける
!importantを付けない場合、上記の設定をしていても表示されないようです。

```css

th {
  background-color: #fff !important;
}
```

見事解決できました！

## 参考
https://hacknote.jp/archives/11460/

https://stackoverflow.com/questions/14987496/background-color-not-showing-in-print-preview
IBM Cloud(旧Bluemix)にExpressをデプロイする方法

## IBM Cloud(旧Bluemix)
heroku以外の選択肢はないかなーと思っていろいろ探してたけど、
料金体系も変わって結局herokuに落ち着くのかね。
でも別のサービスも使ってみたい、ってことで旧Bluemix使ってExpressをデプロイする方法を調べてみた。

## 何十番煎じ？
紹介している人は何人もいたけど、キャプチャ古かったり(Bluemixのままだったり)したので、
IBM Cloudのバージョンでやってみた。

## 環境
Ubuntu 16.04LTS 64bit

## 前提
デプロイするプログラムは事前に準備してください。
npm -g express-generatorでジェネレータインストールして、
適当なファイルにExpress.jsを初期状態を作っとく。
2分ぐらいで終わる。

## IBMクラウド ライト・アカウントの登録
https://www.ibm.com/cloud-computing/jp/ja/bluemix/lite-account/
こちらのページからライトアカウントを登録していく。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/249143/cd106bc6-2fb3-4f54-5642-2bcb0336f5d5.png)

ライト・アカウントを今すぐ登録を選択

![002.png](https://qiita-image-store.s3.amazonaws.com/0/249143/c76a190a-237a-990a-aa5a-f78c06df8157.png)

- メールアドレス
    - 前に実施してた30日間無料お試しプランに登録してたメールアドレスは使えないみたい
- 名前
- 性
- 会社名(任意)
- 国または地域
- パスワード
を入力
最後のチェックボックスはチェックしなくてもいい。
入力が完了したらアカウントの作成を選択。

![003.png](https://qiita-image-store.s3.amazonaws.com/0/249143/f1e88a98-804c-1b35-4ca6-96658102d828.png)

登録確認メールが送信されるので、メールを確認。
URLにジャンプするとアカウントが有効になる。

## IBMクラウドにログイン
https://www.ibm.com/account/jp/ja/
上のページ飛んで、サインインを選択し、
メールアドレス、パスワードを入力しサインインを完了する。

![005.png](https://qiita-image-store.s3.amazonaws.com/0/249143/5f41e2dd-ff2d-de35-8a2b-2657f0e85f33.png)

初回ログインに限りこんな画面が出るかもしれないので、Proceedを選択。

![007.png](https://qiita-image-store.s3.amazonaws.com/0/249143/d1753db9-efdc-a0c9-6cb0-7b237babc95e.png)

IBMCloudの起動を選択。アクセスしたURLによって英語と日本語の両パターンあるかも。

![008.png](https://qiita-image-store.s3.amazonaws.com/0/249143/e6124936-aa73-acbd-3edd-373d737f2b8d.png)

この画面が出てきたらアカウント作成は完了。
続いてプログラムをデプロイしていく。

## cfのインストール
下記URLにジャンプ。
https://docs.cloudfoundry.org/cf-cli/
[Installing the cf CLI]からDebian/Ubuntu用の.debファイルのリンクがあるので選択してダウンロード。
ダウンロードが完了次第パッケージをインストール。
すると、cfコマンドが使えるようになるはず。

```
$ cf -v
cf version 6.36.1+e3799ad7e.2018-04-04
```

コマンドが無いよとか怒られなければ完了。

## デプロイ
まずはAPIのエンドポイントを指定。

```
$ cf api https://api.ng.bluemix.net
```

続いてibmcloudのアカウントでログイン。

```
$ cf login
```

メールアドレスとかパスワードとか聞いてくると思うので、登録したアカウントでログインする。

次にルートディレクトリにmanifest.ymlファイルを作成する。

```
---
applications:
- name: sample-express
  memory: 128M
  host: sample-express
```

manifest.ymlの詳細はここでは割愛します。(というかよく調べて無い)
名前とホスト名をユニークにしとけばとりあえずOKっぽい。

最後にibmcloudにpushして終了。

```
$ cf push
```

(manifest.ymlが自動的に読み込まれる)

これでexpressのサンプルページにアクセスできるようになっていると思います。
FileMaker17のスクリプトデバッガを有効化する

#FileMaker17でスクリプトデバッガが消えた？
FileMaker17はFileMakerProがなくなり、今まで開発用だった（値段も高かった）FileMakerProAdvancedだけになりました。
で、スクリプトを書こうとしたら、スクリプトワークスペースにいつものスクリプトデバッガがないので焦りました

##最初に有効化する必要がある
どうやら最初に有効化する必要があるようです。ProとAdvancedが一緒になったので、必要ない人にデバッガを出さないということなのか？
1.ファイルを開いた後に[編集]->[環境設定]->[高度なツールを使用する]にチェック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/181254/98b7221e-6054-31cc-bb03-c44c11e21960.png)
2.ファイルメーカーを再起動
3.懐かしのデバッグ虫アイコンと再会です
![Qiita0517-2.png](https://qiita-image-store.s3.amazonaws.com/0/181254/c8c4ad41-110d-aec9-8486-9f1176fbc0e9.png)

##参考
・[スクリプトのデバッグ](https://fmhelp.filemaker.com/help/17/fmp/ja/index.html#page/FMP_Help/debugging-scripts.html)
・[高度なツールの使用](https://fmhelp.filemaker.com/help/17/fmp/ja/#page/FMP_Help%2Fusing-advanced.html%23ww1029978)
TikZ 簡易チートシート

Ti<i>k</i>Z on $\mathrm{\LaTeX}$するときのためのチートシートです。画像が用意できていなくて申し訳ない。

個人用のメモとしての一面が強いです。何か間違ったことを言っていたらコメントか何かで教えてください。

# Ti<i>k</i>Zとは

$\mathrm{\TeX}$で図を書くためのパッケージです。



# Ti<i>k</i>Zを使う

だいたいのことは `texdoc visualtikz` で表示されるPDF文書を参考にしたらわかります。

ここでは、わざわざ `texdoc` するのが面倒な、頻繁に使う構文だけを紹介します。


## 使い方

```TeX:プリアンブル
%% \documentclass[dvipdfmx]{jsarticle}
%% のように、ドライバオプションは指定しておきましょう。
\usepackage{tikz}
\usetikzlibrary{calc} %TikZに計算をさせるおまじない
```

``` TeX:文書中
\begin{tikzpicture}
%% この環境中にコマンドを書く。
%% コマンドは必ず`;'で行が終わる。
\end{tikzpicture}
```

## 使うにあたって

Ti<i>k</i>Zでは座標を元にして色々なモノを配置します。あらかじめ作りたい図があるならば、それを方眼紙に書き出して何がどこの座標にあるかを把握しておいた方が良いです。

# コマンド

## 座標の指定

`(3,4)` のようにしてX座標、Y座標を指定する。座標は描画領域の左下を原点として、右がXの正の向き、上がYの正の向き。単位は1が1cmです。多分js系のクラスでは真の1cmからずれたりすると思う。

相対的な配置もできるらしいけどよくわからない。

極座標も指定できるようだけど、私はうまくいかなかったので割愛。

## ノードを配置する

```TeX
\node(P) at (3,4) {Text};
%% (3,4)にPという名前のノード（点）を配置して、Textというラベルをつける。
%% ラベルは必須。空のラベルでもOK。
```

```TeX
\coordinate(Q) at (12,5);
%% こちらはラベルの指定をしない方法。
```

上の例の、`P`とか`Q`とか言った点の名前は後で呼び出せる。

ラベルとして指定した文字列は出力される。

## 線を引く

```TeX
\draw(P) -- (Q);
%% 直線を引く。
```

```TeX
\draw[->] (P) -- (Q);
%% 矢印を引く。
```

```TeX
\draw[<->] (P) -- (Q);
%% 両矢印を引く。
```

`\node`で設定したノードには大きさがあるので、

```TeX
\node(O) at (0,0) {原点$\mathrm{O}$}; %ラベルで数式モードに入ってもOK。
\node(P) at (1,0) {}; 
\node(Q) at (2,0) {};
\draw(O) -- (P) -- (Q);
%% 3点を直線で結ぶこともできる。
```

みたいに書くと、点Pのところに空白ができてしまう。

`\coordinate` でノードを設定すれば、ノードの大きさは0になるので、

```TeX
\coordinate(O) at (0,0); %ラベルは書けない。
\coordinate(P) at (1,0); 
\coordinate(Q) at (2,0);
\draw(O) -- (P) -- (Q);
```

ちゃんと直線になる。

`\coordinate` しながらラベルをつけたい欲張りな方には、

```TeX
\coordinate(O) at (0,0);
\coordinate(P) at (1,0); 
\coordinate(Q) at (2,0);
\draw(O) node {原点$\mathrm{O}$} -- (P) -- (Q);
```

とすればラベルがつけられる。

## 文字を配置する（ラベルの位置変更）

```TeX
\node(P1) at (3,4) [right] {Text1};
\node(P2) at (12,5) [left] {Text2};
\node(P3) at (4,5) [above] {Text3};
\node(P4) at (7,9) [below] {Text4};

\coordinate(Q1) at (0,0);
\coordinate(Q2) at (1,0); 
\draw(Q1) node [above] {原点$\mathrm{O}$} -- (Q2);
```

のようにずらす方向を指定して、少しずらすことができる。
Tkinter でタブを利用する

- Tkinter を利用して GUI アプリを作る際に，tab を利用する．
- オブジェクト指向で書く．

## 実行結果
### tab1
<img width="197" alt="スクリーンショット 2018-05-18 13.08.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/68605/6512b94a-623c-f802-73bd-35e0ab6fe2ca.png">


### tab2
<img width="198" alt="スクリーンショット 2018-05-18 13.08.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/68605/651d6338-6504-db16-bd08-28d84e26fc2d.png">


say hello ボタンを押すと以下が表示される．

```
Hello World at tab2
```

## コード

```python
#!venv/bin/python
# -*- coding: utf8 -*-

import tkinter as tk
import tkinter.ttk as ttk


class Application(ttk.Notebook):
    def __init__(self, master=None):
        super().__init__(master)
        self.master.title('window')

        tab1 = tk.Frame(self.master)
        self.add(tab1, text="tab1")
        Tab1(master=tab1)

        tab2 = tk.Frame(self.master)
        self.add(tab2, text="tab2")
        Tab2(master=tab2)

        self._quit_outside_widget()
        self.pack()

    def _quit_outside_widget(self):
        quit = tk.Button(self.master,
                         text="QUIT at outside",
                         command=root.destroy)
        quit.pack(side=tk.BOTTOM)


class Tab1(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self._label_tab1_widget()
        self._quit_tab1_widget()
        self.pack()

    def _label_tab1_widget(self):
        label = tk.Label(self, text='Hello World at tab1')
        label.pack()

    def _quit_tab1_widget(self):
        quit = tk.Button(self,
                         text="QUIT at tab1",
                         command=root.destroy)
        quit.pack(side=tk.BOTTOM)


class Tab2(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self._start_tab2_widget()
        self._quit_tab2_widget()
        self.pack()

    def _start_tab2_widget(self):
        start_button = tk.Button(self,
                                 text="say hello",
                                 command=self._hello)
        start_button.pack()

    def _quit_tab2_widget(self):
        quit = tk.Button(self,
                         text="QUIT at tab2",
                         command=root.destroy)
        quit.pack()

    def _hello(self):
        print("Hello World at tab2")


if __name__ == '__main__':
    root = tk.Tk()
    app = Application(master=root)
    app.mainloop()
```

## widget の階層関係

- ttk.Notebook (window)
    - tk.Frame (tab1)
        - tk.Label (hello)
        - tk.Button (quit)
    - tk.Frame (tab2)
        - tk.Button (hello)
        - tk.Button (quit)
    - tk.Button (quit)
Apple Watchのページベース遷移で、一番目以外の画面に遷移する方法

## コメントをいただきました

こちらの記事「[Apple Watchでページベース画面に遷移するときの注意点 - Qiita](https://qiita.com/toshi586014/items/9622430812201fe163e8)」につぎのコメントをいただきました（コメントありがとうございます！）。

> ページベース画面を2つ作って、ページベース画面に遷移した時に、2つ目のページ(右のページ)に最初に遷移したいのですが、どのようにすればいいか、もし知っていましたら教えて欲しいです。(workoutアプリのような画面遷移のイメージです。)

そういえばどうやるのだろう？　と思ったので調べてみました。

## アップルの公式リファレンスを調べてみた

アップルの公式リファレンスに関連する記載があるか調べてみました。
すると、つぎのような内容を見つけました。

> watchOSは通常、シーケンスの先頭にあるインターフェイスコントローラを、起動後、最初に表示します。これを変更したい場合は、initメソッドまたはawakeWithContext:メソッド内で、becomeCurrentPageメソッドを呼び出してください。

[watchOSプログラミングガイド：インターフェイスナビゲーション](https://developer.apple.com/jp/documentation/General/Conceptual/WatchKitProgrammingGuide/InterfaceStyles.html#//apple_ref/doc/uid/TP40014969-CH12-SW1)より引用

どうやら `becomeCurrentPageメソッド` を使うと、最初に表示するインターフェースコントローラーを変更できそうです。

## becomeCurrentPage調べてみた

つぎは、リファレンスでbecomeCurrentPageメソッドを調べてみました。

> Displays the interface controller in the page-based interface.
> Discussion
> Use this method to make the current interface controller become the current page of a page-based interface. The current interface controller must be installed in the page-based interface. After calling this method, WatchKit animates the interface controller into view.
> Always call this method from your WatchKit extension’s main thread.

> ページベースのインターフェイスにインターフェイスコントローラを表示します。
> ディスカッション
> 現在のインターフェイスコントローラをページベースのインターフェイスの現在のページにするには、このメソッドを使用します。 現在のインターフェイスコントローラは、ページベースのインターフェイスにインストールする必要があります。 このメソッドを呼び出した後、WatchKitはインターフェイスコントローラをアニメーション化して表示します。
> このメソッドは、WatchKit拡張のメインスレッドから常に呼び出します。

[becomeCurrentPage() - WKInterfaceController | Apple Developer Documentation](https://developer.apple.com/documentation/watchkit/wkinterfacecontroller/1619564-becomecurrentpage)より引用（日本語訳はGoogle翻訳です）

## becomeCurrentPageつかってみた

<img width="606" alt="01.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/aa5d2407-72c1-a2cd-725e-e9fafe2015e0.png">


ストーリーボードの設定は、こちらです。

![02.png](https://qiita-image-store.s3.amazonaws.com/0/38924/669c3913-8974-280c-bbe9-628ca84dc3e8.png)


アプリを起動すると、InitialInterfaceControllerが開きます。

![03.png](https://qiita-image-store.s3.amazonaws.com/0/38924/ec7849c9-1f18-6aa9-49c7-61aa267656d2.png)


Modalボタンをタップすると、FirstラベルがあるFirstPageInterfaceControllerが表示されます。

![04.png](https://qiita-image-store.s3.amazonaws.com/0/38924/a099a9d5-0a47-742a-2b10-d47df1ebd26c.png)


スワイプすると、SecondラベルがあるSecondPageInterfaceControllerに切り替えられます。

それでは、Modalボタンをタップしたときに、SecondラベルがあるSecondPageInterfaceControllerを表示するようにしてみましょう。

リファレンスに `awakeWithContext:メソッド内で、becomeCurrentPageメソッドを呼び出してください` とあったので、SecondPageInterfaceControllerにつぎのように書いてみました。

``` Swift
    override func awake(withContext context: Any?) {
        super.awake(withContext: context)
        
        becomeCurrentPage()
    }
```

これでアプリを実行します。

![05.png](https://qiita-image-store.s3.amazonaws.com/0/38924/6d6b99b5-bba4-0b07-2475-59df6cf505a1.png)


InitialInterfaceControllerでModalボタンをタップすると……

![06.png](https://qiita-image-store.s3.amazonaws.com/0/38924/6a85a30f-ca82-75a7-547f-12fca558c1fb.png)


バンザーイ！　SecondラベルがあるSecondPageInterfaceControllerが表示されました！

これでページベース遷移の活用の幅が広がりますね。
DialogflowからGoogleAssistantでSimulatorテスト

簡単に制御するための覚え書き
![download.png](https://qiita-image-store.s3.amazonaws.com/0/122121/9ab73229-cf33-bb64-8eb8-668120ecbfe3.png)
■
---
前回の「まずはDialogflowを触ってみる」をGoogleAssistantでテストしてみる。
https://qiita.com/sanoh/items/efd99ebbdee294a7beb3
■Dialogflowの管理画面
---
左メニュの「integrations」から「INTEGRATION SETTINGS」を選択します。
![2018-05-17 (55).png](https://qiita-image-store.s3.amazonaws.com/0/122121/741f3b32-f021-6d0c-8669-7415afbb49da.png)

■GoolgeAssistantのダイアログが開いたら
---
Explicit invocationに今回作ったAgent名「食べ物の好み！」を設定
そして「TEST」ボタンを押してテスト開始
![2018-05-17 (57).png](https://qiita-image-store.s3.amazonaws.com/0/122121/0d7df72e-358f-0452-542b-d766214d77a5.png)

■Action on Googleの起動
---
TESTを押すことでAction on Googleが起動します。
![2018-05-17 (59).png](https://qiita-image-store.s3.amazonaws.com/0/122121/5e8699ee-111f-3482-d3fd-8d73aef437bc.png)
まずは「テスト用アプリにつないで」でSimulatorから接続します。
あとは、入力欄にいろいろと記入すれば、対応したメッセージが返ってきます。
![2018-05-17 (61).png](https://qiita-image-store.s3.amazonaws.com/0/122121/19f98ad7-e6f5-469b-568a-d4ba8f0e4591.png)
軽い気持ちで調べ始めたWebGL/GLSLが想像してたよりあまりに難しすぎたので0

### WebGLとか何も知らない人なもので
色々調べてここにメモとして残すと後から振り返って「頑張ってたかもな」なんて思えるかもしれないので。

### 最初はhtmlのcanvas使って線とかアニメーションさせたかっただけなんだけど
ちょっと前の私はHPを作るぞと息巻いていて、自分のHPに線沢山アニメーションさせてモアレ作りたいなと思っていたので<canvas>使って出来るだろなんて軽く考えていました。
（なんでモアレ作りたいんだってのは置いておくとして）htmlのcanvasでの描画には勝手にアンチエイリアスがかかってぼやっとしちゃうようで、それだったらwebglで線を描画してはいかが？みたいなページをどっか（ https://teratail.com/questions/15335 ）で見つけまして、「ほう、そうなんか」と早合点して、なんか勉強にもなるし良いかななんて。

### うーん、WebGLってそもそも...
WebGLはjavascriptを通してGPUを扱えるようにしたOpenGL由来のAPI、だそうです。
参考:https://html5experts.jp/yomotsu/2897/
(OpenGLってそもそも...と無限後退出来る件ではありますが)

### GLSLはシェーダー専用言語
OpenGL専用のシェーダー言語でC言語っぽく記述できる。
GLSLのコンパイラはGPU内に用意されているという仕様らしい。
GPUごとの性能や仕様に基本的には左右されることなくシェーダーを書くことができる（賢い）
バーテックスシェーダーとフラグメントシェーダーに分かれていて　←みたいなことが出てきてから物凄い勢いで分からなくなってくる。

### 資料

参考：https://wgld.org/
こちらのサイトで絶賛勉強中です。本当に丁寧に説明されていて感激します。
同時にグラフィックの描画がいかに大変かも分かります。恐ろしい世界です。




次はもっと内容のあること書きます
UITextfield がキーボードに隠れないようにする

```swift
import UIKit
import PlaygroundSupport

class ViewController: UIViewController {

    private var scrollView: UIScrollView!
    private var textField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        scrollView = UIScrollView()
        scrollView.backgroundColor = .gray
        scrollView.alwaysBounceVertical = true
        scrollView.keyboardDismissMode = .interactive
        view.addSubview(scrollView)
        scrollView.translatesAutoresizingMaskIntoConstraints = false
        scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
        scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
        scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true

        textField = UITextField()
        textField.backgroundColor = .white
        textField.delegate = self
        scrollView.addSubview(textField)
        textField.translatesAutoresizingMaskIntoConstraints = false
        textField.topAnchor.constraint(equalTo: scrollView.topAnchor, constant: view.bounds.height - 100).isActive = true
        textField.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true

        NotificationCenter.default.addObserver(self,
                                               selector: #selector(keyboardWillShow),
                                               name: .UIKeyboardWillShow,
                                               object: nil)
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(keyboardWillHide),
                                               name: .UIKeyboardWillHide,
                                               object: nil)
    }

    @objc private func keyboardWillShow(notification: Notification) {
        guard let keyboardFrame = notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? CGRect else { return }
        let offset = textField.frame.maxY - keyboardFrame.minY
        if offset > 0 {
            scrollView.contentOffset.y = offset
        }
    }

    @objc private func keyboardWillHide(notification: Notification) {
        scrollView.contentOffset.y = -scrollView.safeAreaInsets.top
    }
}

extension ViewController: UITextFieldDelegate {
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }
}

let viewController = ViewController()
let window = UIWindow(frame: CGRect(x: 0, y: 0, width: 768, height: 1024))
window.rootViewController = viewController
window.makeKeyAndVisible()

PlaygroundPage.current.needsIndefiniteExecution = true
PlaygroundPage.current.liveView = window
```
Golang での multipart な RequestBody のつくりかた

`multipart/related` を POST したくて調べたときのメモ。

`mime/multipart` を使って `NewWriter` して (`CreatePart` して)+ `Close` すればOK🙆

```golang
package main

import (
	"bytes"
	"fmt"
	"mime/multipart"
	"net/textproto"
)

func main() {
	body := new(bytes.Buffer)

	mpWriter := multipart.NewWriter(body)

	boundary := "END_OF_PART"
	if err := mpWriter.SetBoundary(boundary); err != nil {
		panic(err)
	}

	{
		part := make(textproto.MIMEHeader)
		part.Set("Content-Type", "text/plain")

		writer, err := mpWriter.CreatePart(part)
		if err != nil {
			panic(err)
		}

		writer.Write([]byte("hello"))
	}
	
	{
		part := make(textproto.MIMEHeader)
		part.Set("Content-Type", "text/plain")

		writer, err := mpWriter.CreatePart(part)
		if err != nil {
			panic(err)
		}

		writer.Write([]byte("hello2"))
	}

	mpWriter.Close()

	fmt.Println(body)
}
```

OUTPUT

```
--END_OF_PART
Content-Type: text/plain

hello
--END_OF_PART
Content-Type: text/plain

hello2
--END_OF_PART--
```

- 複数の Part を書き込むには、`CreatePart` を何度も呼び出せばよい
- Part の中身は、`CreatePart` から返ってくる `io.Writer` で書き込める
- Boundary は指定しなければ生成してくれるみたい
- `Close` しないと最後の区切り `--<Boundary>--` が書き込まれないので注意🚨

# Playground
https://play.golang.org/p/2bK7YOJHlf1

# References
- [mime/multipart](https://golang.org/pkg/mime/multipart/)
- [Big Sky :: golang の mime/multipart で独自の Content-Type を付ける。](https://mattn.kaoriya.net/software/lang/go/20140310125915.htm)
Vimにmolokaiカラースキームを入れる

```shell
$ mkdir -p ~/.vim && cd ~/.vim && mkdir -p colors && git clone https://github.com/tomasr/molokai && mv molokai/colors/molokai.vim ~/.vim/colors && vim ~/.vimrc
```

```vim:~/.vimrc
colorscheme molokai
syntax on
let g:molokai_original = 1
let g:rehash256 = 1
set background=dark
```

gitは

Macの場合は

```shell
$ brew install git
```

Centosの場合は

```shell
$ yum install git
```
Xamarin.FormsでTicker的なものを作ってみた



文字を横に流すアレです

iOSとAndroidのエミュで動作確認済み


<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/Xamarin?src=hash&amp;ref_src=twsrc%5Etfw">#Xamarin</a> で Ticker的なのを作った <a href="https://t.co/JLn0CS65q4">pic.twitter.com/JLn0CS65q4</a></p>&mdash; 吉田カエル@長崎 (@Frog_woman) <a href="https://twitter.com/Frog_woman/status/997028710413877248?ref_src=twsrc%5Etfw">2018年5月17日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


```XAML 
<ContentView BackgroundColor="Gray" HorizontalOptions="FillAndExpand">
	<AbsoluteLayout>
	    <Label x:Name="label" TextColor="White" FontAttributes="Bold"/>
	</AbsoluteLayout>
</ContentView>
```

```C#
private double _count;

public MainPage()
{
    InitializeComponent();
}

protected override void OnSizeAllocated(double width, double height)
{
    base.OnSizeAllocated(width, height);

	//デバイズサイズを代入。右から左に流すので最大値からデクリメントさせていく
	_count = width;

	//文字サイズ
	int LabelFontSize = 25;

    //表示する文字
	String ViewText = string.Format("Width={0} Height={1}", Width, Height);
    //表示文字を代入
	label.Text = ViewText;
    //文字サイズ決定
	label.FontSize = LabelFontSize;
     
	double LabelWidth = ViewText.Length * LabelFontSize ;//文字数×1文字分のピクセル(合ってる？
    
	//Console.WriteLine("LabelWidth: {0} ", LabelWidth);
    
    Device.StartTimer(
    TimeSpan.FromSeconds(0.01),
    () =>
    {
        _count--;           
		AbsoluteLayout.SetLayoutBounds(this.label, new Rectangle(_count, 10, LabelWidth, 30));
        
		//Console.WriteLine("Count: {0} , position: {1}", _count, -LabelWidth);
		if(_count < -LabelWidth){
			_count = width;
		}
		return true;
    });
}
```

`double LabelWidth = ViewText.Length * LabelFontSize`の部分が合ってるのかがよく分かりません。
何か良い書き方などが他にありましたら教えて下さい。
[Google Analytics]Azure VirtualMachine上でGoogleAnalytics認証ファイルを読み込ませる方法

##背景
GoogleAnalyticsAPIを使いたい！よっしゃ、ローカルで動くようにできた！
→あれ、ステージング環境(Azure Virtual Machine)上だと動かない…なんでや…

##前提/環境
・上述の通りローカルでは正常に実行できる。
・後述ですが認証ファイルが正しい状態である。(中身、配置場所等々)
・Azure Virtual Machine

###トラブルシューティングしてみると
--------------------------------
仕様の関係上try~catchでcatchした際もstatus:200を返していたためにエラーログがないというお粗末な状態
とりあえずcatch時に手動でエラーログを出したりこまめにログ出力をするようにしたらGoogleAnalyticsの認証時に落ちている模様

###あれ、認証ファイルちゃんとあるよな？
流石にありました。ですがなんで読み込まれないのかが全く分からない。
・認証ファイルが置かれているディレクトリが悪い？→合ってる。
・認証ファイルが置かれているディレクトリへの参照権限がない？→ある。
しばらく頭を抱えてましたが調べてみるとIIS起動時に自動では読み込まれない模様

##対処方法
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/243544/cd58a9f1-6cdd-0f2c-8e08-89ad4a1acc19.png)
こちらIISの画面です。(見せられない箇所とか固有名は塗りつぶしてます。)
赤枠の`アプリケーションプールの固有値の設定`をクリック。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/243544/b107339e-2c65-6bbf-6bb8-f6d0bfb47f49.png)
赤枠の`ユーザープロファイルの読み込み`をfalse→trueに変更

`※変更後、IISの再起動をお忘れなく！`

###修正後
アプリの実行時に無事にGoogleAnalyticsの認証ファイルが読み込まれるようになりました。
認証ファイルを扱うのが初めてだったのもあり、特に日本語記事が見つからなかったりしたので頑張って英語記事読み漁った苦い思い出
Windowsでネットワークハードディスク（NAS）を追加できないときの対処法

PCにNASを追加しようとしたらこのようなエラーが出た．

![Inkedキャプチャ_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/257442/99f5414f-2378-ba65-fc7c-206d35f2f316.jpeg)

ブラウザからはアクセス可能なため，IPアドレスにも問題はない．
どうやら別の何かが原因らしい．

いろいろ解決策を調べたところ，ファイル共有プロトコルがうまく動作していないらしい，windowsで使われているファイル共有プロトコルのSMB（Server Message Block）を確認すると，

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/257442/832239c3-075a-6580-0d59-7722f7b70d51.png)

SMBクライアント機能が無効になっている...　そりゃ動かないわけだ...

有効化したら無事解決しましたとさ！


SMBの有効化はこれを見れば分かります↓
http://www.iodata.jp/pdf/win10_smb1.pdf
Laravel で Class 'PDO' not found というエラーが出た場合の対処（CentOS7）

```shell
$ yum install php-pdo
# remiリポジトリを使っている場合はこっちのほうがいいらしい
# 71は任意のバージョンに変更する
$ yum install --enablerepo=remi,remi-php71 php-pdo
# php.iniの編集
$ vim /etc/php.ini
```

```ini
; Dynamic Extensionsとか好きなところに
extension=php_pdo.dll
```
【GAS】Googleスプレッドシートで特定の列の日付を基準に別の列を書き換える

プログラミング経験ゼロ（簡単なHTMLを書いたりバッチ作成くらいならできる）の人間がjavascriptを独学して書きました。
コードがスマートではない部分もあるかと思いますが、ご容赦ください。

# やりたかったこと

以下のようなGoogleスプレッドシートについて、
「日付」がスクリプト実行日よりも後であれば、「状況」列を「完了」にするようなスクリプトです。

| 日付 | タスク | ステータス |
|:-----------|------------:|:------------:|
| 2018/05/13 | 書類提出 | 完了         |
| 2019/01/20 | 懇親会 | 未       |
|  | 飲み会（日付未定） | 未           |
| 2017/12/16 | 同窓会 | 完了         |
| 2018/11/03 | 旅行 | 未           |

上記の例はフェイクですが、
適宜ステータスを正確に変更する必要があるスプレッドシートだったので自動化を試みました。

# 書いたスクリプト

```javascript:myFunction
function myFunction() {

//　このスクリプトの実行日の取得
 var today = Utilities.formatDate(new Date(), 'Asia/Tokyo','yyyy/MM/dd');; //　今日の日付をyyyy/mm/dd形式に直して取得
 
//　スプレッドシートで指定された日付の取得
 var spreadsheet = SpreadsheetApp.getActiveSpreadsheet(); //　①：スプレッドシートを取得
 var sheet = spreadsheet.getActiveSheet(); //　②：スプレッドシートを元にシートを取得
 var col = "C"; // ③：検索する列（C列）を指定
 var last_row = sheet.getLastRow(); //　④：シート全体のうち、データが入力されている最終行を取得
 var range = sheet.getRange(col + "1:" + col + last_row); //　⑤：②で取得したシートについて、④で指定した行と⑤で取得した列の範囲を取得
 var value = range.getValues(); //　⑥：範囲の値を取得
 var array = []; //⑦：⑥で取得した範囲の値を変換するための配列を用意
 var isDate = []; //⑧：取得した値が日付かどうかを判定して、結果を格納するための配列を用意

//　取得した値を元にセルを書き換え
  for(var i = 0; i < value.length; i++){ //　取得したデータについて、一つ一つ以下の作業を行っていく
    array.push(value[i][0]); //　シートから取得した2次元配列を1次元配列に変換
    isDate.push(Object.prototype.toString.call(value[i][0])) // value[i]を日付かどうかを判定し、isDateに1行1行の結果を格納
     if (value[i] !== undefined && isDate[i] === "[object Date]"){ //　もしvalue[i]が空欄ではなく、かつ日付であれば、以下の処理を行う
      array[i] = Utilities.formatDate(array[i], 'Asia/Tokyo','yyyy/MM/dd'); //　⑤取得した値（Javascript形式の日付）を、todayと比較するためyyyy/mm/dd形式の日付に変換
       if (array[i] <= today){ // この関数を実行した日（today）が、シートに書いてある日（specifiedDay）よりも後ならば
         sheet.getRange(i+1, 3).setValue("完了") //　i+1行、3列目の文字を「完了」にする（配列は0番目から始まるが、行は1行目なので、格納されている順番+1して行を更新）
   } 
  }
 }
}
```

このスクリプトに時間主導型のトリガーを適切なタイミングで設定すれば、
自動的にステータスの変更ができるようになります。

# ひとこと

プログラミングド初心者としては、Utilities.formatDateで取得できる日付がGMT+9の形式で
スプレッドシートの日付と比較するには変換が必要だったのが少々やっかいでした。

どなたかのお役に立つことを祈ります。
aws cliを使ってECSのクラスタに紐づいた全コンテナインスタンスIDをAZごとに取得した件

#やりたいこと
以下の赤い四角で囲まれた部分をAZごとに取得したい。

![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/257872/f51ac7ba-55d6-5859-ab0a-5debf7a81727.jpeg)

<br>
####取得した後の用途としては以下のようなコマンド

```
#指定したコンテナインスタンスの"Status"を"Draining"にする

aws ecs update-container-instances-state --cluster ${CLUSTERS} \
--container-instances ${CONTAINER_INSTANCE_ID} \
--status DRAINING
```
参考：https://docs.aws.amazon.com/cli/latest/reference/ecs/update-container-instances-state.html


```
#指定したコンテナインスタンスの"RunningTask"を取得

aws ecs describe-container-instances --cluster ${CLUSTERS} \
--container-instances ${CONTAINER_INSTANCE_ID} \
--query containerInstances[].runningTasksCount
```
参考：https://docs.aws.amazon.com/cli/latest/reference/ecs/describe-container-instances.html


#はまった点
クラスターに紐づいたコンテナインスタンスIDをAZごとに取得しようとすると以下のように出力されてしまう。

```
#実行コマンド

aws ecs list-container-instances \
--cluster ${CLUSTERS} \
--query containerInstanceArns[*] \
--filter "attribute:ecs.availability-zone == ${AZ}"
```
```
#出力結果

[
    "arn:aws:ecs:us-west-2:************:container-instance/********-****-****-****-************",
    "arn:aws:ecs:us-west-2:************:container-instance/********-****-****-****-************",
    "arn:aws:ecs:us-west-2:************:container-instance/********-****-****-****-************",
    "arn:aws:ecs:us-west-2:************:container-instance/********-****-****-****-************",
    "arn:aws:ecs:us-west-2:************:container-instance/********-****-****-****-************"
]
```

取得したいのは`********-****-****-****-************`となっている箇所。
リファレンスを読んでも、この箇所だけ抜き出すことができなそう。


#取得方法
しょうがないので、ださいけど以下の方法で整形して取得。

```
#実行コマンド

aws ecs list-container-instances --cluster ${CLUSTERS} \
--query containerInstanceArns[*] \
--filter "attribute:ecs.availability-zone == ${AZ}" | \
sed "s/.\+\///g" | sed "s/[\"|\,]//g" | \
egrep -v "\[|\]"`
```
```
#出力結果

********-****-****-****-************
********-****-****-****-************
********-****-****-****-************
********-****-****-****-************
```

1. `sed`コマンドで`/`より左を消す
2. `sed`コマンドで行末にあるダブルクオーテーションとカンマを消す
3. `egrep`コマンドで`[`, `]`を消す
pandasのデータ置換様々

# pandasによるデータ置換

## まえがき
pandasにはデータの置換1つをとっても様々なやり方があり、非常に混乱させられる。
このことは私を含む独学の初学者の学習を遅らせる原因となっていると思うので、簡単にまとめてみる。
1~9の連続数が収められた3×3行列の2列目の4以上の値を欠損値に置換する。

## インデックス参照による代入

```python
df = pd.DataFrame(np.arange(9).reshape(3, 3), index=['row1', 'row2', 'row3'], columns=['col1', 'col2', 'col3'])

df.loc[sample['col2'] >= 4, 'col2'] = np.nan
```

## df.where

```python
df.col2.where(df.col2 < 4, np.nan, inplace=True)
```

## df.query

```python
df.query('df.col2 >= 4', inplace=True)
```
Windows 10 に cifs 接続する

Windows 10 に cifs で接続する時の備忘録です。
vers=2.0 がキモ。(debian 9 の man mount.cifs より)

>vers=SMB protocol version. Allowed values are:
· 1.0 - The classic CIFS/SMBv1 protocol. This is the default.
· 2.0 - The SMBv2.002 protocol. This was initially introduced in Windows Vista Service Pack 1, and Windows Server 2008. Note that the initial release version of Windows Vista spoke a slightly different dialect (2.000) that is not supported.
· 2.1 - The SMBv2.1 protocol that was introduced in Microsoft Windows 7 and Windows Server 2008R2.
· 3.0 - The SMBv3.0 protocol that was introduced in Microsoft Windows 8 and Windows Server 2012.

```bash:/etc/fstab
#//接続先IPアドレス/共有名 マウント先ディレクトリ名 cifs vers=2.0,noperm,nounix,credentials=資格情報ファイル名
//server/share /mnt/win cifs vers=2.0,noperm,nounix,credentials=.credentials 0 0
```
```bash:.credentials
username=value
password=value
domain=value
```
(資格情報ファイルは chmod 0600 .credentials とかしておいた方がいいでしょう)

[mount.cifs](http://www.samba.gr.jp/project/translation/3.5/htmldocs/manpages-3/mount.cifs.8.html)
PHPのExceptionで配列を扱えるようにする

#Exceptionで配列を扱いたい！

##ダメなパターン
Exceptionに配列を入れると、パラメーターが間違ってるよとエラーを出す

```php:エラーになる
throw new \Exception(array('配列','入れたい'), 1);

Error [ Error ]:
Wrong parameters for RuntimeException([string $message [, long $code [, Throwable $previous = NULL]]])
```


##🎉解決策
ならExceptionを拡張して、独自の例外クラスを作れば解決しそう！
以下例外の拡張方法
`json_encode`で配列をJson形式にして、配列を受け取るときに`json_decode`でJsonを配列に戻す。

```php:Exeptionの拡張クラス
class OriginalException extends Exception {

  public function __construct($message = null, $code = 0, Exception $previous = null) {

    // 全てを正しく確実に代入する
    parent::__construct(json_encode($message), $code, $previous);
  }

  public function getArrayMessage($assoc = false) {
    return json_decode($this->getMessage(), $assoc);
  }
}
```
```php:Exceptionの使用クラス
try {
   throw new OriginalException(array('エラー', 'です'));
} catch (OriginalException $e) {
   var_dump($e->getArrayMessage());
}
```

##参考サイト
[PHP マニュアル - 例外の拡張](http://php.net/manual/en/language.exceptions.extending.php)
[stackoverflow](https://stackoverflow.com/questions/6797142/can-you-throw-an-array-instead-of-a-string-as-an-exception-in-php)
wordcloud を Windows で Anaconda / Jupyter で使う（Tips）

# WindowsのAnaconda（Jupyter）環境で wordcloud を使う。

シンプルにシンプルに手順だけ。ほぼ自分のメモ用。
※ こういうときは gist を使うか悩みますが、誰かがみてくれる、誰かの役に立つ可能性が高い気がするのでQiitaを使う！！

## 以下の手順でいく

### **一応確認しておく**

Jupyterなどの環境で下記の１行だけかいて実行させてみる。

```python
from wordcloud import WordCloud
```

インストールされていなければエラーが出ます。

```python
ModuleNotFoundError: No module named 'wordcloud'
```

ということでインストールされていないことを確認できたので次に進む。

### **Anaconda prompt を起動して以下コマンドで wordcloud のインストール**

```bash
> conda install -c conda-forge wordcloud
    :
※ 何回かなにかきかれるけど y で切り抜ける
```

### **一応確認してみる**

```python
from wordcloud import WordCloud

text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
wordcloud = WordCloud(background_color="white", width=800,height=800).generate(text)
wordcloud.to_file("./test.png")
```

カレントディレクトリに png が出来てたら成功。

![test.png](https://qiita-image-store.s3.amazonaws.com/0/33095/5c552371-e075-2e14-ae76-f4d4c2ccf17e.png)

### **おまけ：Windowsで日本語フォント**

font_pathでフォントを指定してください。 ``.otf`` だとうまくいきます。

```python
wordcloud = WordCloud(background_color="white", font_path=r"C:\WINDOWS\Fonts\SourceHanCodeJP-Bold.otf", width=800,height=800).generate(text)
```

# さいごに

もしどなたかの役にたったなら、気軽に **いいね** お願いいたします m__m


# Appendix.

上の例は英語の文章なのでスペースで分かち書きされていますが、日本語をわかちしたかったら `janome` が便利です。
janome からの日本語フォントを使ってのWordCloudのサンプルだとこうなります。

```python
## 分かち書き
## pip install janome
from janome.tokenizer import Tokenizer
tokenizer = Tokenizer()

text = ''
line = '吾輩は猫である。名前はまだ無い。どこで生れたかとんと見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。'
tokens = tokenizer.tokenize(line)
for token in tokens:
    parts = token.part_of_speech.split(',')
    if (parts[0] == '名詞'):
        text = text + ' ' + token.surface

print(text)


## 引き続きWordCloud
from wordcloud import WordCloud

wordcloud = WordCloud(background_color="white", font_path=r"C:\WINDOWS\Fonts\SourceHanCodeJP-Bold.otf", collocations = False, width=800,height=800).generate(text)
wordcloud.to_file("./test.png")
```