OmniAICreator/Qiita-1.07M huggingface dataset:
ElementUI に Scoped CSS が適用されない問題対応策

宮崎在住エンジニアのジョウ(@JotarO_Oyanagi) です。

Vue.js 用 UI ライブラリ [Element](http://element.eleme.io/#/en-US) の要素に対し、[Scoped CSS](https://vue-loader.vuejs.org/ja/features/scoped-css.html) を使う場合に起きうる問題（後述）への対応策を紹介します。

# TL;DR
- Element の要素に Scoped CSS のスタイルが適用されないケースがある。
- 原因は、通常の記述方法だとセレクタの子要素に data 属性がつき、そこに対してスタイルがあたるが、Element が書き出す一部の要素には data 属性がつかない。
- 対応策としては **/deep/** セレクタを使用する。

# Scoped CSS とは
コンポーネントごとの CSS を書ける仕組みです。

`<style scoped>` とすると、そこに記述されたセレクタに対し、ユニークな data 属性がつき、その data 属性がセレクタに付加されます。

具体的にはどういうことか、公式の記述を抜粋してご紹介します。

参考：[スコープ付き CSS](https://vue-loader.vuejs.org/ja/features/scoped-css.html)

```html
<style scoped>
.example {
  color: red;
}
</style>

<template>
  <div class="example">hi</div>
</template>
```

と記述すると、以下の状態で書き出されます。

```html
<style>
.example[data-v-f3f3eg9] {
  color: red;
}
</style>

<template>
  <div class="example" data-v-f3f3eg9>hi</div>
</template>
```

`data-v-f3f3eg9` という属性が付加されましたね。

セレクタに子要素を記述した場合には以下のようになります。

```html
<style scoped>
.example .child {
  color: red;
}
</style>

<template>
  <div class="example">
    <span class="child">hi</span>
  </div>
</template>
```

この場合、以下の状態で書き出されます。


```html
<style>
.example .child[data-v-f3f3eg9] {
  color: red;
}
</style>

<template>
  <div class="example">
    <span class="child" data-v-f3f3eg9>hi</span>
  </div>
</template>
```

**親ではなく子の要素に data 属性がつきます。**

# Element が書き出す一部の要素には data 属性がつかない
以下の記述で書き出されたソースをご覧ください。

```html
<style lang="sass" scoped>
.RootApp

  .el-input
    display: block
    margin: 10px auto
    width: 90%

    &__inner
      border-radius: 0
</style>

<template>
  <div class="RootApp">
    <el-input/>
  </div>
</template>
```

この場合、以下の状態で書き出されます。

![スクリーンショット 2017-12-26 19.11.31.png](https://qiita-image-store.s3.amazonaws.com/0/217369/38cb7b28-37c0-30da-62d4-f23aa33c7f6c.png)

`<el-input>` により `.el-input` と `.el-input__inner` が書き出されています。

`.el-input` には data 属性がついているのでスタイルが適用されていますが、

![スクリーンショット 2017-12-26 19.14.08.png](https://qiita-image-store.s3.amazonaws.com/0/217369/9ce69460-d3ed-b003-e337-86ad70428ac8.png)

`.el-input__inner` には data 属性がないため、スタイルが適用されません。

これを解決するためにどうすればいいかと小一時間調べてみると、公式にその答えが書いてありました。
上で散々挙げた[スコープ付き CSS](https://vue-loader.vuejs.org/ja/features/scoped-css.html)の一番下に書いてあります。

Vue の公式はマジで優秀。

# 親要素に data 属性をつけるには、/deep/ セレクタを使う
vue-loader v12.2.0 以上 ならば、**/deep/** セレクタという仕組みがあるとのことで、それを使うと data 属性が親要素につきます。

Sass ならこう書くと

```diff
<style lang="sass" scoped>
- .RootApp
+ .RootApp /deep/

  .el-input
    display: block
    margin: 10px auto
    width: 90%

    &__inner
      border-radius: 0
</style>
```

こうなります。

![スクリーンショット 2017-12-26 19.27.38.png](https://qiita-image-store.s3.amazonaws.com/0/217369/dbee7da4-20f5-3e40-be4f-4123786d5f5f.png)

セレクタの親要素に data 属性がついて、無事 `.el-input__inner` にスタイルが適用されました！

Sass ではなく、通常の CSS の書き方なら `>>>` を使います。

```html
<style scoped>
.RootApp >>> .el-input__inner {
  border-radius: 0
}
</style>
```

# おわりに
Vue 関連は「公式読め」で解決することがホント多い。

# 参考資料
- スコープ付き CSS
 - [https://vue-loader.vuejs.org/ja/features/scoped-css.html](https://vue-loader.vuejs.org/ja/features/scoped-css.html)
スマートコントラクト開発の準備をする（ethereum5）


前回はこちら。[マイニングと譲渡をHTTP経由で改めてやってみる](http://qiita.com/joji/items/8ca923ee1bfd74024955 "マイニングと譲渡をHTTP経由で改めてやってみる")

###概要

開発者はコードを書き、サーバ(ここではブロックチェー ン)にデプロイします。ユーザはブラウザでサーバにアクセスし、目的の処理を行います。まず開発者はチューリング完全な高レベルの言語でコントラクトを記述します。そしてそれを EVMコンパイラでコンパイルして EVM バイトコード(EVM 固有のバイナリ形式)にし、ブロックチェー ンにデプロイします(EVMとは Ethereum Virtual Machine の略)。EVMバイトコードは、個々のEVM上で実行されます。なお「ブロックチェーンにデプロイする」とは、ブロック内にEVMバイトコードを保存することを意 味します。ブロックチェーンネットワークに参加する全ノードは同じブロックを保持しますので、全ノードがEVMバイトコードを保持して実行できることになります。

![スクリーンショット 2017-12-26 18.59.02.png](https://qiita-image-store.s3.amazonaws.com/0/39073/635e8f73-651f-f330-9949-5a0476932dcd.png "スクリーンショット 2017-12-26 18.59.02.png")

次はコントラクト(EVM バイトコード)へのアクセスについて説明します。ユーザはブラウザやコンソールからブロックチェーン上の EVM バイトコードに JSON-RPC 等でアクセスします。EVMバイトコードは接続したノードの EVM上で実行され、データの更新を行う場合は、(送金などと同様に) 更新内容がブロックチェーンネットワークに配信されます。

![スクリーンショット 2017-12-26 19.01.20.png](https://qiita-image-store.s3.amazonaws.com/0/39073/7914e903-3491-d07d-05d7-ebe23fcddfcf.png "スクリーンショット 2017-12-26 19.01.20.png")

###コンパイラをインストール

```bash
sudo add-apt-repository ppa:ethereum/ethereum
```

```bash
sudo apt-get update
```

```bash
sudo apt-get install solc
```

versionの確認

```bash
solc --version
```

```shell-session
solc, the solidity compiler commandline interface
Version: 0.4.19+commit.c4cbbb05.Linux.g++
```

gethを起動

```bash
nohup geth --networkid 4649 --nodiscover --maxpeers 0 --datadir /home/ubuntu/data_testnet --mine --minerthreads 1 --rpc --rpcaddr "0.0.0.0" --rpcport 8545 --rpccorsdomain "*" --rpcapi "admin,db,eth,debug,miner,net,shh,txpool,personal, web3" --unlock 0,1 --verbosity 6 2>> /home/ubuntu/data_testnet/geth.log &
```

web console

```geth_console
geth attach rpc:http://localhost:8545
```

Geth に solc のパスをセットします

```geth_console
admin.setSolc("/usr/bin/solc")
```

```shell-session
"solc, the solidity compiler commandline interface\nVersion: 0.4.19+commit.c4cbbb05.Linux.g++\n"
```

正しくセットされたことを確認する

```geth_console
eth.getCompilers()
```

```shell-session
["Solidity"]
```
Rで統計をするための備忘録

※メモしたいことが増え次第追記

## 桁数を指定
```
# 桁数指定
> format(0.3456789, digits = 2)
[1] "0.35"

# 百分率表記
> sprintf("%1.2f", 0.123456 * 100)
[1] "12.35"
```

## 列の入替え
```
> df
  A C B
1 1 3 2

> df[,c(1,3,2)]
  A B C
1 1 2 3
```
[R：データフレームの列を入れ替える・削除する。](https://qiita.com/dokokano_panda/items/4e40deece0b169bc979a)

## plotされる図で日本語が文字化け回避

```
# フォントをHirakakuProN-W3に設定
> par(family = "HiraKakuProN-W3")
```

## 描画関連

### 誤差バーを追加

```
# (x, y)の点に対してyに標準偏差をプロット
arrows(x, y - stddev, x, y + stddev, code = 3, length = 0.02, angle = 90)
```

### y = xの線をプロット
```
abline(0, 1, lty = 2)
```

### 凡例を追加

```
legend("topleft", lty = rep(1, 6), legend=labels, col = palette()[-1])
```

## 乱数の生成

```
# 5つの乱数生成
> runif(5) # デフォルトでは0~1
[1] 0.7698414 0.4976992 0.7176185 0.9919061 0.3800352

# 0~10の間で乱数生成
> runif(5, min = 0, max = 10) 
[1] 7.774452 9.347052 2.121425 6.516738 1.255551

# シードの固定(同じ乱数を出力する)
> set.seed(1); runif(5)
[1] 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819
```

## 分布関数から値の取得

### 確率分布と乱数に関する使い方
|用途|関数名|説明|
|---|---|---|
|確率密度(pdf: probably density function)|dxxx(q)|qは確率点を表す|
|累積分布(cdf: cumulative distribution function)| pxxx(q) | |
|確率点(qauntile)|qxxx(p)||
|乱数(random)|rxxx(p)||

### Rに用意されてる主要な確率分布

|分布名|コード名|パラメータ|
|---|---|---|
|ベータ分布|beta|
|二項分布|binom|n: 事象が起きる回数, size：試行回数, prob:事象が起きる確率|
|コーシー分布|cauchy|
|χ二乗分布|chisq|
|指数分布|exp|
|F分布|f|
|ガンマ分布|gamma|
|幾何分布|geom|
|超幾何分布|hyper|
|対数正規分布|lnorm|
|ロジスティック分布|logis|
|多項分布|multinom|
|負の２項分布|nbinom|
|正規分布|norm|
|ポアソン分布|pois|
|t分布|t|
|一様分布|unif|min:最小値, max:最大値|

参考：[確率分布と乱数](http://cse.naro.affrc.go.jp/takezawa/r-tips/r/60.html)


## 離散値から累積密度関数と累積確率の算出

累積分布関数$F$は「確率変数$X$がある値$x$以下（$X \le x$）の値となる確率」を表す関数

$$
F(x) = P(X \le x)
$$

```
# 正規分布からサンプリング
> sample <- rnorm(100)

# 確率密度でヒストグラムを描画
> hist(sample, freq = F)

# 確率密度の曲線描画
> lines(density(sample))

# 累積確率関数の生成
> ecdf.sample <- ecdf(sample)

# 1.5以下の累積確率
> ecdf.sample(1.5)
[1] 0.93

# 累積確率の閾値描画
```

![Rplot01.png](https://qiita-image-store.s3.amazonaws.com/0/18783/a126b445-8793-fe85-f3b8-260d7ab47396.png)
Elmのパイプライン演算子と関数合成

２つの関数 `f : A -> B`, `g : B -> C` と値 `x : A` があるとき、そのまま関数適用すると

```elm
g (f x)
```

となるところを、Elmではいくつかの方法で書き換えることができます。

```elm
g <| f <| x
g << f <| x

x |> f |> g
x |> f >> g
```

演算子としての適用順に注目しながら確認してみましょう。

## パイプライン演算子(Pipeline Operator)

演算子という呼び名がありますが、実際は次のようなシグネチャを持つ関数です。

```elm
(<|) : (a -> b) -> a -> b
(|>) : a -> (a -> b) -> b
```

そのため、次のような関数適用も可能です。

```elm
(<|) g (f x)
```

リテラルで中置演算子として適用できるので、結果として以下のように書けます。

```elm
g <| f x
```

同じく `f x` も `f <| x` と表現できるので、適用の順番を考慮すると `g <| (f <| x)` と書くのが妥当ですが、これを `g <| f <| x` と表記することもできます。これは `<|` 演算子の結合順が**右結合**に指定されているからです。
これがもし左結合だとシグネチャが合わないので動作しません。

全く推奨できませんが、以下のように2引数関数に `<|` を使って適用させることも可能ではあります。
しかし、括弧の使用から分かるように無理やり左結合として解釈させているため不自然です。

```elm
z = \x -> (\y -> x + y)
(z <| 2) <| 3
```

同様に右向きのパイプライン演算子でも表記できます。

```elm
x |> f |> g
```

関数の適用順が左から右になって読みやすいですね。こちらの結合順は `(x |> f) |> g` と解釈されるので**左結合**です。

一方で、異なる向きのパイプライン演算子は括弧なしでは混同できません。
仮に `f = \x -> x + 1`, `g : \x -> x * 2` でシグネチャが同じだったとしても、

```elm
(g <| x) |> f
g <| (x |> f)
```

は結果が異なるので定義が曖昧です。エラーメッセージも次のような文言が出ます。

> Conflicting associativity for binary operators (<|, |>). Consider adding
> parentheses to disambiguate.

たとえ括弧を使ったとしても大変読みにくいのでこのような混同は避けるべきでしょう。

ちなみに、 `<|` はHaskellで言うところの `($) :: (a -> b) -> a -> b` と同じです。

## 関数合成(Composition)

パイプライン演算子と似たような記号ですが、２つの関数を合成する関数があります。

```elm
(<<) : (b -> c) -> (a -> b) -> a -> c
(>>) : (a -> b) -> (b -> c) -> a -> c
```

これも中置演算子で、上記の例だと `g << f` や `f >> g` のように使われています。
これを用いて `g (f x)` を表現しようとすると

```elm
(g << f) x
```
のようになります。これに先程のパイプライン演算子を組み合わせると

```elm
(g << f) <| x
```

となります。ここからさらに括弧を外して

```elm
g << f <| x
```

と書くこともできます。これは先程の（同じ演算子同士の）結合順ではなくて、演算子の優先順です。すなわち `<<` が `<|` よりも優先して処理されていることがわかります。

同じ向きの関数合成同士ではどうでしょうか。考えてみるとわかりますが、 `h << g << f` を `(h << g) << f` と解釈しても `h << (g << f)` と解釈しても結果は同じはずです。
そのため左右どちらの結合としても解釈できます。個人的にはパイプライン演算子と同様に `<<` を右結合とみなしても良いように感じます。

逆向きの `f >> g >> h`, `x |> f >> g` も同様です。

パイプライン演算子のときと同様に、異なる向きの関数合成を `h << g >> f` のように混ぜようとするとエラーが発生します。

> Conflicting associativity for binary operators (<<, >>). Consider adding
> parentheses to disambiguate.

ちなみに、 `<<` はHaskellにおける `(.) :: (b -> c) -> (a -> b) -> a -> c` と同じです。

## まとめ

- 結合順を意識する
    - `<<, >>` が `<|, |>` より優先される
    - 矢印の順に折りたたまれるように結合されると考えると覚えやすい？
- 異なる向きの演算子を混ぜるべきではない
- ただし、あんまり複雑に組み合わせることを考えるのではなく、意味のある単位で関数に置き換える（シンプルだけど重要）

## 蛇足：紹介しなかった組み合わせ

`g << f <| x` ではなく、逆の場合はどうなるでしょうか？以下の例で考えてみましょう。

```elm
f = \x -> x + 1
g = \x -> x * 2
h = \fun -> fun 3

h <| g << f
```
【Xcode9.1】FastlaneのSnapshotを使ってUITestでスクリーンショットをとるよ

# やること　

FastlaneのSnapshotを使ってUITestでスクリーンショットをとります。

# 環境
Fastlane 2.68.2
Xcode 9.1
Swift 4

# 手順

## Fastlaneを導入

参考：　https://qiita.com/SatoTakeshiX/items/fea8d49216a2a1086cf9

```
$ bundle init
$ vim Gemfile 
```

```ruby:Gemfile
# frozen_string_literal: true
source "https://rubygems.org"

# gem "rails"
gem "fastlane"
gem "cocoapods"
```

```
$ bundle install --path vendor/bundler
```

## UITestのTarget準備

参考：　https://qiita.com/taji-taji/items/c00e5b94376c37f17443

「File」→「New」→「Target」→「iOS」→「Test」→「iOS UI Testing Bundle」を選択。

## Snapshot準備

※下記のサンプルではいろいろ怒られてますが、それでも`./fastlane/Snapfile`を作成してくれます。

```
$ fastlane snapshot init
[15:55:57]: fastlane detected a Gemfile in the current directory
[15:55:57]: however it seems like you don't use `bundle exec`
[15:55:57]: to launch fastlane faster, please use
[15:55:57]: 
[15:55:57]: $ bundle exec fastlane snapshot init
[15:55:57]: 
[15:55:57]: Get started using a Gemfile for fastlane https://docs.fastlane.tools/getting-started/ios/setup/#use-a-gemfile
✅  Successfully created SnapshotHelper.swift './fastlane/SnapshotHelper.swift'
✅  Successfully created new Snapfile at './fastlane/Snapfile'
-------------------------------------------------------
Open your Xcode project and make sure to do the following:
1) Add a new UI Test target to your project
2) Add the ./fastlane/SnapshotHelper.swift to your UI Test target
   You can move the file anywhere you want
3) Call `setupSnapshot(app)` when launching your app

  let app = XCUIApplication()
  setupSnapshot(app)
  app.launch()

4) Add `snapshot("0Launch")` to wherever you want to create the screenshots
```

1), 2), 3), 4)を参考に設定を進めていきます。

1) Targetは上で追加していれば怒られないはず。
2) `./fastlane/SnapshotHelper.swift`にファイルができているので、それを先ほど作成したUITestのTargetに追加します。(Command + Option + A)
3) UITestのファイルのsetUpを下記みたいな感じに修正

```
    override func setUp() {
        super.setUp()

        continueAfterFailure = false
        let app = XCUIApplication()
        setupSnapshot(app)
        app.launch()
    }
```

4) UITestのファイルのtestExampleを下記みたいな感じに修正

```
    func testExample() {
        snapshot("0Launch")
    }
```

## Snapfile

Snapfileを以下を参考に修正

```ruby:fastlane/Snapfile
# 適当な端末を選択。多いとテストが遅くなるので最初は１つでいいです
devices([
   "iPhone 7",
   "iPhone 7 Plus",
   "iPhone X",
   "iPhone SE",
])

# 日本語。他の言語でテストしたい場合は追加してください
languages([
  "ja-JP",
])

# テスト対象のスキーマを入力
scheme "Scheme"

# screenshotの出力先
output_directory "./fastlane/screenshots"

# 毎回screentshotディレクトリを空にするかどうか
clear_previous_screenshots true 
```

## 実際に動かしてみる

注意事項
・実機ビルドだと落ちます
・XcodeのTestで実行してもスクリーンショットは取れません

```
$ fastlane snapshot run
```

これで`./fastlane/screenshots`にスクリーンショットが保存されていればOK！

## おまけ

【Xcode9.1】iOSのUITestとかでアプリを削除したりデータをResetしたりする方法 - Qiita
https://qiita.com/rd0501/items/8e822c1830ad1bb2a7c0
openFrameworksで「Use of undeclared identified 'glm'」エラーが出た時


→ ofxCvがopenFrameworksのバージョンによってglmを提供していたりしていなかったりするためにおこるエラー。

v0.9.8 の場合は https://github.com/kylemcdonald/ofxCv/tree/stable、 
またv0.10.0の場合は https://github.com/kylemcdonald/ofxCv/tree/master を使う。

## installation

oFのバージョンに合わせてofxCvのブランチを変えればいい（githubからcloneしていることが前提）
ターミナルを使って、ofxCvのディレクトリで

```sh
git checkout origin stable(かmaster)
```

を実行。
C++ Builder 10.2 Tokyo > ソフト操作 > notepad を開いて、ステータスバーを表示 / 非表示 > Alt+V, S の送信 > 失敗する > notepadの設定の問題

```txt:動作環境
Rad Studio 10.2 Tokyo Update 2
```

[c++ builder > ソフト操作 > notepad を開いて、ステータスバーを表示 / 非表示 > Alt+V, S の送信](https://qiita.com/7of9/items/e0bb49501224178ba4e2)

上記記載のコードを10.2 Tokyo + Windows 10 Pro (version 1709)で動作させた。

notepadは開くが、ステータスバーの表示がされない。

### 対処法

10.2 Tokyoの問題ではなく、notepadの設定によるようだ。

[「メモ帳」でステータスバー(行数/列数)を表示できない場合の対処方法](http://dynabook.com/assistpc/faq/pcdata/004804.htm)

上記の設定をすることで、ステータスバーの表示・非表示がされるようになった。
Macのコマンドラインからゴミ箱へファイルを移動するスクリプト

```bash
function trash () {
    while true; do
        # get real path of file
        _path="$(cd "$(dirname "$1")"; pwd)/$(basename "$1")"
        read -p "remove $_path? [Y/n] " answer
        case $answer in
            '' | [Yy]* )
                osascript -e "tell application \"Finder\" to delete \"$_path\" as POSIX file"
                break;
                ;;
            * )
                break;
                ;;
        esac
    done;
}
_trash() {
   COMPREPLY=( `echo $2*` )
}
complete -F _trash trash
```

## 参考
https://github.com/morgant/tools-osx
CodeIgniter Email クラスの罠

## はじめに

初期化時に crlf と newline を明示的に設定しないと RFC 822 に沿っていないことになります。

```php

$this->load->library('email');

$this->email->initialize(array(
    ... 中略
    'crlf'      => "\r\n",
    'newline'   => "\r\n"
));
```

なぜデフォルトでそうなっていないのか...（理由はあるのでしょうけれど）。おかげでメールが届いたり届かなかったりしてしまいました。

## 参考

CodeIgniter Email クラス
http://codeigniter.jp/user_guide/3/libraries/email.html

RFC 2822
http://srgia.com/docs/rfc2822j.html

CodeIgniterでメール送信 - ドキュメント | SendGrid
https://sendgrid.kke.co.jp/docs/Integrate/Frameworks/codeigniter.html

> 行末は“crlf” => “\r\n” と “newline” => “\r\n”を使用することが重要です。
Raspbian で SAMBA が起動できない

## はじめに

Raspbian をいろいろとセッティングしているときに、SAMBA が起動しなくなりました。

いろいろとネットの情報はあったのですが、私が遭遇したのは以下のような状況でした。

## 起動していないのにゾンビファイルが存在する

起動していないのに下記のコマンドで表示されるファイルがあれば、それは Raspberry Pi 本体の異常終了などで残ってしまったゾンビファイルである可能性があります。

【※注意】SAMBA が起動している状態なら、これらのファイルは存在してしかるべきものです。消してはいけません。

```sh
cd /lib/systemd/system/

ls -l | grep smbd.service

ls -l | grep nmbd.service
```

私の場合はこのファイルを削除して samba の起動を再試行しました。

```sh
sudo rm -i smbd.service
sudo rm -i nmbd.service
sudo /etc/init.d/samba restart
```
LinuxでRuby 2.5.0 インストールメモ

### 変更履歴

2023/2/15 ruby-buildのリポジトリが変更になっているようなので注釈を入れました。

# Ruby 2.5がリリースされたらしい

[Ruby 2.5.0 リリース](https://www.ruby-lang.org/ja/news/2017/12/25/ruby-2-5-0-released/)

### はじめに

コメントをいただいたようにruby-buildのREADME.mdに書いてある方法でアップグレードしてください。
以下の記事にある内容は無手勝手流で行きあたりばったりの方法なのでご笑覧ください。
**2023/2/15 ruby-buildのリポジトリが変更されているため旧リポジトリからruby-buildをインストールしている場合は`git pull`コマンドではうまくいきません。**
**本記事のべたな方法を試してみてください。**

```sh:Upgrading抜粋
# As an rbenv plugin
$ cd "$(rbenv root)"/plugins/ruby-build && git pull

```

### どうやってインストールすればいいんだろう？

そう言えば、つい最近、Ruby 2.4.3 を `rbenv` でインストールしていました。

参考URL
[rbenvでRubyをインストール](https://qiita.com/abgata20000/items/8bfd25d76692063cc012)

### とりあえずやってみた（以下、単なるメモ）

rbenvは `/usr/local/rbenv` に既にある状態。

```:リストを見てみる
# rbenv install --list

```

当然ながら、 `2.5.0` は表示されません。

`/usr/local/rbenv/plugins/ruby-build` を新しくする必要があります。
※「はじめに」に書いてあるように `git pull` でやればスマートにできます。

```:ruby-buildを新しく入れる
# cd /usr/local/rbenv/plugins

# rm -rf ruby-build

# git clone git://github.com/sstephenson/ruby-build.git ruby-build (*1)

# cd ruby-build

# ./install.sh

# chgrp -R ruby /usr/local/rbenv/plugins/ruby-build

# chmod -R g+rwxX /usr/local/rbenv/plugins/ruby-build

```

*1 **2023/2/15現在ruby-buildのリポジトリは<https://github.com/rbenv/ruby-build>になっています。git cloneコマンドは以下となります。**

```

git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build

```

こんどは `2.5.0` 出てくるかな？

```:リストを見てみる
# rbenv install --list
（略）
  2.4.3
  2.5.0-dev
  2.5.0-preview1
  2.5.0-rc1
  2.5.0
  2.6.0-dev
（略）

```

`2.5.0` がありました。 `2.6.0-dev` というのもあります。

`2.5.0` をglobalでインストールします。
個人的な環境なので開発したツールが動かなくなるとか心配せずに2.5.0にします。
（公共的な環境の場合はlocalで試すとよいと思います）

```:2.5.0をインストール
# rbenv install -v 2.5.0

# rbenv versions
  system
* 2.4.3 (set by /usr/local/rbenv/version)
  2.5.0

# rbenv global 2.5.0

# rbenv rehash

#  rbenv versions
  system
  2.4.3
* 2.5.0 (set by /usr/local/rbenv/version)

# ruby -v
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]

```

### おわりに

反省点：READMEくらいは読むようにしたいと思います。
コメントいただき、ありがとうございました。
`2.5.0` の新機能などを試してみたいと思います。
MacでCoccinellidaを使ってSSHポートフォワーディング！

## 前提

WebサービスではDBサーバーは踏み台サーバーを経由しないと接続できないようにしていることが多いかと思いますが、
例えばローカル環境で開発環境のDBにあるデータで動作確認をしたい際に、
いちいちターミナルでSSHコマンドを打つのは面倒なので、そんなときにCoccinellidaを使ってポートフォワーディングすると便利です。

## 手順

### Coccinellidaのインストール

[こちらより](https://sourceforge.net/projects/coccinellida/files/)インストール

### Coccinellidaの起動

アプリケーションフォルダもしくはDockにCoccinellidaをセットしている場合はDockから起動
-> 上部メニューバーにてんとう虫のアイコンが現れ、これがインターフェイスとなる。

![デスクトップ.png](https://qiita-image-store.s3.amazonaws.com/0/74725/70758add-0b9b-ebb3-b8d4-e23252fb10a9.png)

### Coccinellidaの設定

上部メニューバーのてんとう虫をクリックし、「Preferences」を選択

![デスクトップ2.png](https://qiita-image-store.s3.amazonaws.com/0/74725/bf43d20f-d5cf-ec36-0439-0b56f502e7a5.png)

Preferencesの設定画面が開いたら、上部てんとう虫マークの「Tunnels」をクリックし、
次に下部の「Add」をクリック

![設定画面.png](https://qiita-image-store.s3.amazonaws.com/0/74725/a29bf029-50bb-29cf-da91-d706cb1a8f21.png)

設定画面で、まずは「General」で踏み台となるサーバーの接続情報を設定する

- Name: 任意の名前
- Host: 踏み台サーバーのIPアドレス or ホスト名
- Port: ポート番号（任意の番号でも可）
- User: ユーザー名
- Password: SSHパスワード（設定していれば）
- Identity: SSH秘密鍵のパス

![踏み台サーバー設定.png](https://qiita-image-store.s3.amazonaws.com/0/74725/44d3ba02-5834-4442-5f2b-cf736829fdb5.png)

次に踏み台サーバーを経由して接続したいサーバーの情報を設定する
-> 最後にSaveで保存

- Type: localのまま
- Local Port: 2022 (任意のポートでもいい)
- Local Host: localhostのまま
- Remote Host: 本命のサーバーのIPアドレス or ホスト名
- Remote Port: 22 (他のポート指定がある場合はそのポート番号)

![接続サーバー設定.png](https://qiita-image-store.s3.amazonaws.com/0/74725/d0de3580-fe66-77af-b874-6a946442e1f3.png)

### Coccinellidaの実行

Preferencesを一旦閉じ、再度上部メニューバーをクリックすると
先程登録した踏み台サーバー名が表示されるので、それをクリックすれば接続完了

接続しても特に何もアクションが起きないため接続した感が無いですが、
左側にチェックマークが付いていれば接続されているということになる

![接続状態.png](https://qiita-image-store.s3.amazonaws.com/0/74725/dd17d19a-79d2-cc99-5759-cd1d45d77859.png)

## 以上です

ありがとうございました。
2017-12-26 C++ Builder 10.2 Tokyo > XE4でのTDictionaryのエラーはTokyoではエラーとならない

```txt:動作環境
Rad Studio 10.2 Tokyo Update 2
```

[c++ builder XE4 > TDictionaryを使おうとしてひっかかったこと > ilink32 エラー](https://qiita.com/7of9/items/d2b66694f36aa4581bf7)

XE4ではエラーになっていた上記に関して、10.2 Tokyoで確認をした。
10.2 Tokyoではエラーは出なかった。

エラーは出ないが、STL std::mapを使うことも検討する方がいいだろう。
Nuxt.jsでGraphQLを扱う方法

株式会社スマートドライブのオオキです。遅ればせながら[SmartDrive Advent Calendar 2017](https://qiita.com/advent-calendar/2017/smartdrive)25日目の記事です。

# はじめに
弊社ではGraphQLを採用したプロダクトを開発中です。
詳しくは弊社アドベントカレンダー4日目の記事を見てみてください。
[GraphQLのススメ](https://qiita.com/ryota-koganezawa/items/49b88f2cc238376b8538)

開発中のプロダクトのフロントエンドでは[Nuxt.js](https://ja.nuxtjs.org/)を採用する予定です。

NuxtでGraphQLを扱う上で少し躓いた部分があったのでまとめてみたいと思います。

# 実装

## [apollo-module](https://github.com/nuxt-community/apollo-module)
Nuxt.jsでGraphQLを扱うためにNuxt.jsの`apollo-module`というモジュールを使います。

> Nuxt.js module to use vue-apollo (integrates graphql-tag loader to parse .gql & .graphql files)

`apollo-client`というGraphQLをフロントエンドで扱うライブラリをラップしている`vue-apollo`というライブラリをNuxt用にラップしてくれています。

まずはモジュールを追加します。

```
yarn add @nuxtjs/apollo
```

configに設定を追加し、

```js:nuxt.config.js
{
  // Add apollo module
  modules: ['@nuxtjs/apollo'],

  // Give apollo module options
  apollo: {
    clientConfigs: {
      default: '~/apollo/client-configs/default.js'
    }
  }
}
```

apolloの設定を記述します。
今回はGitHubのAPIをたたいてみます。

```js:~/apollo/client-configs/default.js
import { ApolloLink } from 'apollo-link'
import { HttpLink } from 'apollo-link-http'
import { InMemoryCache } from 'apollo-cache-inmemory'

export default () => {
  const httpLink = new HttpLink({ uri: 'https://api.github.com/graphql' })

  // auth token
  const token = xxxxxxxxxxxxx

  // middleware
  const middlewareLink = new ApolloLink((operation, forward) => {
    operation.setContext({
      headers: { Authorization: `bearer ${token}` }
    })
    return forward(operation)
  })
  const link = middlewareLink.concat(httpLink)
  return {
    link,
    cache: new InMemoryCache()
  }
}
```

`HttpLink`にAPIのURLを格納、`ApolloLink`でヘッダーにトークンを追加しています。

### **躓きポイント1**

ここまで、READMEに記載されてる内容をコピペしてきただけなんですが、実はこれでは動きません。

なんと、`apollo-client`のバージョンがv1系からv2系に上がったので、足りないライブラリがあるのです！
（その他のコードはv2系で書かれています。）

足りないものがREADMEの一番下に書いてあるので、インストールします。

```
yarn add apollo-link-http graphql
```

## Query
サーバー側からデータを取得するためのクエリを書きます。

今回はGitHubのリポジトリの名前と、そのリンクを10件取得するクエリを書きます。

```gql:allRepos.gql
{
  user(login:"takanorip") {
    repositories(first:10) {
      nodes {
        name
        url
      }
    }
  }
}
```

## コンポーネント
最後にViewの実装をします。

```js:index.vue
<template>
  <ul>
    <li v-for="repo in allRepos" :key="repo.name">{{ repo.name }}</li>
  </ul>
</template>

<script>
import allRepos from '~/apollo/queries/allRepos'

export default {
  data: () => ({
    allRepos: {}
  }),
  apollo: {
    allRepos: {
      prefetch: true,
      query: allRepos,
      update: ({ user }) => user.repositories.nodes
    }
  }
}
</script>
```

`data`でデータの初期化をしつつ、`apollo`でデータを取得しています。

### **躓きポイント2**
今回、クエリ名と取得するオブジェクトのキーが一致しない場合、`update`でデータを返してあげる必要があります。
今回だと、`user.repositories.nodes`の中身を`allRepos`につっこんでいます。
下記issueに詳しく書いてあります。

https://github.com/Akryum/vue-apollo/issues/10

# まとめ
弊社ではNuxt.jsやGraphQで開発したいエンジニアを絶賛募集中です！
https://www.wantedly.com/projects/156189
https://www.wantedly.com/projects/177318
Python3 Pandasの使い方メモ

多分すぐに忘れるのでメモ。

# 簡単な使い方

```python3
# pandas インポート
>>> import pandas pd

# 名前と身長のデータを生成(列ごとにデータを生成)
>>> df = pd.DataFrame([ ["taro", "hanako"], [178, 152] ]).T

# 名前と身長のデータを生成(行ごとにデータを生成)
>>> df = pd.DataFrame([ ["taro", 178], ["hanako", 152] ])

# 列に名前をつける
>>> df.columns = ["name","height"]

# データ表示
>>> df
     name height
0    taro    178
1  hanako    152
```
# 諸情報の確認

```python3
# 行数の確認
>>> len(df)

# 次元数の確認
>>> df.shape #（行数、列数）の形

# カラム情報の一覧
>>> df.info() #カラム名と型の一覧

# 各列の基礎統計量の確認
# Rでいうところのsummary()
>>> df.describe() # 平均、分散、4分位など

# head / tail
>>> df.head(1) #先頭1行を確認
>>> df.tail(1) #先頭1行を確認
```

# csvを出力する
## DataFrame.to_csv()
```python3
Signature: to_csv(path_or_buf=None, 
　　　　　　　　　　　sep=',', 
　　　　　　　　　　　na_rep='', 
　　　　　　　　　　　float_format=None, 
　　　　　　　　　　　columns=None, 
　　　　　　　　　　　header=True, 
　　　　　　　　　　　index=True, 
　　　　　　　　　　　index_label=None, 
　　　　　　　　　　　mode='w', 
　　　　　　　　　　　encoding=None, 
　　　　　　　　　　　compression=None, 
　　　　　　　　　　　quoting=None, 
　　　　　　　　　　　quotechar='"', 
　　　　　　　　　　　line_terminator='\n', 
　　　　　　　　　　　chunksize=None, 
　　　　　　　　　　　tupleize_cols=False, 
　　　　　　　　　　　date_format=None, 
　　　　　　　　　　　doublequote=True, 
　　　　　　　　　　　escapechar=None, 
　　　　　　　　　　　decimal='.')
Docstring:
　　　　　　Write DataFrame to a comma-separated values (csv) file
```
デフォルトでカンマ区切り、utf-8でヘッダーとインデックスまでついたデータが出力されるようです

|引数  |役割  |
|---|---|
|path_to_buf  |出力するファイル名。省略した場合は、コンソール上に文字列として出力される。  |
|sep  |区切り文字(デフォルト=,(カンマ))  |
|encoding  |出力の際の文字コード。python3ならデフォルト='utf-8'。他にも'shift_jis','euc_jp'など。|


### 出力例1
```python3
>>> import pandas as pd

# 名前と身長のデータを生成
>>> df = pd.DataFrame([ ["taro", 178], ["hanako", 152] ], columns=["身長", "体重"])

# CSV ファイル (hoge.csv) として出力
>>> df.to_csv("hoge.csv")
```

### 確認

```shell
# 内容を確認する
$ cat hoge.csv

,身長,体重
0,taro,178
1,hanako,152 

# 文字コードを確認する(Mac)
$ file --mime hoge.csv
hoge.csv: text/plain; charset=utf-8
```


### 出力例2 shit_jisで出力
```python3
>>> import pandas as pd

# 名前と身長のデータを生成
>>> df = pd.DataFrame([ ["taro", 178], ["hanako", 152] ], columns=["身長", "体重"])

# CSV ファイル (hoge.sjis.csv) として出力
>>> df.to_csv("hoge.sjis.csv" , encoding="shift_jis")
```

### 確認

```shell
# 内容を確認する(環境によっては文字化けします)
$ cat hoge.sjis.csv

,�g��,�̏d
0,taro,178
1,hanako,152

# 文字コードを確認する(Mac)
$ file --mime hoge.sjis.csv
hoge.sjis.csv: text/plain; charset=unknown-8bit

# shift_jisはunknown-8bitとして表示されるようです
```
NSLocalizedString の記述を簡単にする extension

R.swift は知らないです

# 使用例
```swift:Localizable.strings
"test 1"   = "test 1";
"テスト ２" = "test 2";

"format_test1"        = "format test 1 %@";
"フォーマットテスト３%@" = "format test 3 %@";
```
```swift:Hoge.swift
func do() {
    print("test_1".localized)    // ログ：test 1
    print("テスト ２".localized)  // ログ：test 2
    print("テスト ３".localized)  // ログ：テスト ３

    print("format_test1".localized("unko"))         // ログ：format test 1 unko
    print("format_test2".localized("unko"))         // ログ：format_test2
    print("フォーマットテスト３%@".localized("unko")) // ログ：format test 3 unko
    print("フォーマットテスト４%@".localized("unko")) // ログ：フォーマットテスト４unko

    print("format_test1".localized())         // ログ：format test 1 (null)
    print("format_test2".localized())         // ログ：format_test2
    print("フォーマットテスト３%@".localized()) // ログ：format test 3 (null)
    print("フォーマットテスト４%@".localized()) // ログ：フォーマットテスト４(null)
}
```
# コード
```swift:extension
extension String {
    
    var localized: String {
        return NSLocalizedString(self, comment: "")
    }
    
    func localized(_ args: CVarArg...) -> String {
        return NSString(format: NSLocalizedString(self, comment: ""), arguments: getVaList(args)) as String
    }
}
```

# 備考
- args になにも入れないと、`args.count == 0` となって、**\(null\)** って表示されるけど、その辺は好きに
- args じゃなく `getVaList(args)` としてるのは、<br/>args の型が`[CVarArg]`となってるせいで、それをそのまま入れると配列としての表示になっちゃうから変換しないとダメ
- getVaList(args) の型は`CVaListPointer`だけど、これをうまくなんかやってくれるのは<br/>`NSString(format: String, arguments: CVaListPointer)`しかなかった
- ロガーつくってみたとか書いてるページで CVaListPointer に言及してるページ見つけられなかったけど、なんでや

# 参考
getVaList とかあるんだ、って知ったページ
> Swiftで引数リスト(CVaListPointer)の渡し方 - The Pragmatic Ball boy
http://yanamura.hatenablog.com/entry/2015/02/11/222814
【WordPress】プラグイン「MW WP Form」の「確認・送信」ボタンをページごとで制御する

# 概要
プラグイン「MW WP Form」の機能で、「確認・送信」フォームタグ（ボタン）を配置すると、確認画面を自動的に生成してくれてとても便利ですが、
下記のような**あるチェックボックスの状態によってボタンの状態を制御する**仕組みを入れている場合、確認画面では想定していない動きになります。

**例）規約同意のチェックボックスをチェックすると確認ボタンが押せるようになるフォーム**

![btn.gif](https://qiita-image-store.s3.amazonaws.com/0/85815/9a697f34-77ba-9528-80df-b2f4c226e7aa.gif)

**↓MW WP Formのフォーム編集画面**

```html
~~~略~~~

<p>[mwform_checkbox name="form-agree" id="agree" children="規約に同意する" vertically="true"]</p>

<div>[mwform_submitButton name="mwform_submitButton" confirm_value="確認画面へ" submit_value="送信する"]</div>
```
  
このフォームの確認画面へボタンを押下し、確認画面へ遷移すると、送信ボタンが押せない状態になります。
  
**↓送信ボタンにdisabled属性がついてる**
![WS000066.JPG](https://qiita-image-store.s3.amazonaws.com/0/85815/c25cd3bf-884f-aa0d-12b4-39e4e7078291.jpeg)

  
こういった問題を回避する策として以下を試してみました。

1. 確認画面のURLを別にする
2. 確認画面のURLならdisabled属性を削除するjsを追加する


## 1.確認画面のURLを別にする
**↓MW WP Formのフォーム編集画面で確認画面URLを設定する**
![WS000067.JPG](https://qiita-image-store.s3.amazonaws.com/0/85815/26122f43-a5e9-0847-41ca-fa29dff276ac.jpeg)


## 2. 確認画面のURLならdisabled属性を削除するjsを追加する

```mwformChangeButton.js
/* 要jQuery */
$(function(){
    /* ページ読み込み時のボタン制御処理 */
    if ($('input[id="agree"]:checked').val()) {
        $('[name="submitConfirm"]').prop("disabled", false);
    } else {
        $('[name="submitConfirm"]').prop("disabled", true);
    }

    /* 同意のチェックボックスをクリックした際のボタン制御処理 */
    $('[id="agree"]').click(function() {
        if ($('input[id="agree"]:checked').val()) {
            $('[name="submitConfirm"]').prop("disabled", false);
        } else {
            $('[name="submitConfirm"]').prop("disabled", true);
        }
    });

    /**
     * 確認画面用（確認画面のボタンは常に押せる状態にしておく）
     * ※この書き方は苦肉の策感がすごいする・・・
     */
    if (location.pathname === '/confirmation/') {
        $('[name="submitButton"]').prop("disabled", false);
    }

});
```

このjsを両画面で読み込むようにすれば、入力画面・確認画面ともに想定したボタンの動きになると思います。
  
ただ、この方法が正しいのかはわかりません・・・
タッチやドラッグ調べるついでにUIEventとUITouchの違いを調べる

#UIEvent
###An object that describes a single user interaction with your app.
######アプリ上の一人ユーザーのインタラクションを説明するオブジェクト


Overview

Apps can receive many different types of events, including touch events, motion events, remote-control events.
######アプリはtouch events, motion events, remote-control eventsなどの様々なタイプのイベントを受け取る。




Touch events are the most common and are delivered to the view in which the touch originally occurred.
touch eventsはもっとも一般的なものだ。タッチされたviewに渡される。


Motion events are UIKit triggered and are separate from the motion events reported by the Core Motion framework.

core motion framework(https://qiita.com/MilanistaDev/items/a24f418d3091072b23e8)に記述されたもの。UIKitがトリガーとなる。


Remote-control events allow a responder object to receive commands from an external accessory or headset so that can manage manage audio and video - for example, playing a video or game controller, AppleTV remote, or other device that has physical buttons.
TouchDesigner 必要な時だけオペレータをcookする


<br>
##cookとは
ネットワーク上のオペレータが何か処理を行なっている状態のことです。
@kodai100さんが「[[#TouchDesigner] cookのWikiページを翻訳してみた](https://qiita.com/kodai100/items/be672ea8978e443867b0)」という記事でCookについて細かく紹介しています。

TouchDesigner公式wikiによるcookは[こちら](http://derivative.ca/wiki099/index.php?title=Cook)←
サンプルファイルは[こちら](https://drive.google.com/open?id=1VPWDEDPsf8JogkE1HSu_FfMi8bL92aKQ)←

##作るもの
必要がないときにも全てのオペレータを走らせておくことは全体の処理が重くなってしまう原因になるので、必要な時だけ必要なオペレータが走るような(cookするような)処理の仕方の一例をメモしたいと思います。

![cook.gif](https://qiita-image-store.s3.amazonaws.com/0/160720/90e4ccdb-b063-edb4-f5ae-497eccd3ea84.gif)

このようにSwitchTopのindexに参照された値に対応するContainerCOMPがcookされ、他のContainerCOMPはcookがオフ（オペレータ上に×が表示される状態）になっています。

##Switch機能の実装
<img width="382" alt="スクリーンショット 2017-12-26 午後4.37.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/160720/10e247b8-c677-6967-1b2a-d95be519a426.png">


こちらの例では、ContainerCOMPを5つ(container0~container4)用意し、 中でMoviefileinTOPとOutTOPを繋いでいます。
OutTOPを繋いだことで、それぞれのContainerCOMPをSwitchTOPに繋ぐことができるようになります。

<img width="1133" alt="スクリーンショット 2017-12-26 午後4.41.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/160720/e38fcb11-7bc1-9151-215b-5e3b20a75ca3.png">



ButtonCOMPのButton->ButtonTypeをMomentaryにします。
CountCHOPを繋ぎ、Count->LimitをLoop Min/Max、Limit Minimumを0、Limit Maximumを4に設定します。
CountCHOPの後にNullCHOPを繋ぎ、ContainerCOMPを繋いだSwitchTOPのindexに値をエクスポートします。
これで、ボタンを押すと順番にContainerCOMPが切り替わるようになりました。


##必要な時だけcookする

CHOPExecuteDATにNullCHOPを参照させ、CHOP Execute->Value ChangeをOnにします。（デフォルトでOnになっています）
CHOPExecuteDATのonValueChangeに以下のコードを書きます。

```
def onValueChange(channel, sampleIndex, val, prev):
　　　　　　　　　　　　　　　　op('container'+str(int(prev))).allowCooking = 0
　　　　　　　　　　　　　　　　op('container'+str(int(val))).allowCooking = 1
　　　　　　　　　　　　　　　　return
```

onValueChangeの第３引数valは現在の参照しているCHOPの値、第４引数prevは一つ前の値が入っています。cookしたいcontainerCOMPのallowCookingを1(オン)にするのと同時に、その直前にcookしていたcontainerCOMPのallowCookingを0(オフ)にします。こうすることで必要なオペレータだけをcookし、必要でないオペレータは処理を停止させておくことができました。

##完成

<img width="1190" alt="スクリーンショット 2017-12-26 午後3.49.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/160720/0b013fc9-28e7-2ef7-a169-a8bb4a00d796.png">

##まとめ
ひとつのプロジェクトにたくさんの機能を持たせると全体の処理が重くなってしまいがちですが、処理させるところとさせないところのオンオフも組み込むことでFPSを守ることができました。
<br>
C++ Builder 10.2 Tokyo > IDE > クイック編集 > 名前とキャプションなど変更に便利 + 要改善点

```txt:動作環境
Rad Studio 10.2 Tokyo Update 2
```

複数のコンポーネント(コントロール)の「名前」や「Caption」を変更していく方法としては以下があった。
[C++ Builder / IDE > 複数のコンポーネントのプロパティを順番に変更する](https://qiita.com/7of9/items/d2b3f712c9c778821277)

10.2 Tokyoからは右クリックからの「クイック編集」という機能が利用できる。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/aef3f98f-9f7f-730a-4b27-097c9e043d9c.png)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9d606c86-f510-998f-8aa0-dd4666a6ba0c.png)

デザイン時の時間節約に役立つ!!!

### XE4の時の方法

コンポーネントのNameを変更する時にXE4では以下の方法も使っていた。

- プロパティの表示をカテゴリ「その他」にする
    - Nameがスクロールなしで表示される
- 複数のコンポーネントに対してNameを変更する作業をする
- 作業後、プロパティの表示をカテゴリ「すべて」に戻す

### 要改善点

クイック編集において、「名前」から「Caption」をCtr+CとCtr+Vにてコピーしようとしたら、作業対象コンポーネント自体がコピーされてしまった。

ユーザが意図しない動作になるため、このあたりのUIは改善される方がいいだろう。
Flowtypeで外部module用のjs.flowを書く

#前提

Objective-C → C#ときて
最近本格的なjsのプロジェクトにjoinしたjs初心者です。

今回のプロジェクトには型チェッカーとしてFlow
https://flow.org/
が採用されてるのですが、ここでハマりにハマったので整理としてまとめておきます

#なぜFlowか

javascriptといえば型がないのが特徴ですが、
近年jsによる大規模開発が増えてくる中で、
やっぱり型があったほうがいいよねという声もあったようで、
MicroSoftによる型対応のjsスーパーセットである
TypeScriptがメジャーになっているようです。

じゃあTypeScript使えばいいじゃんといきたいところですが、
TypeScriptを使う際は一度トランスコンパイルを行なって
生のjsにする必要があります

Flowには comment-based syntax 
https://flow.org/en/docs/types/comments/
というFlowの型定義をコメント内に書いておける仕組みがあるため
Flowの恩恵を受けながらも生のjsとして使えるという利点があります。


#外部モジュール

npmで入れた外部モジュールを使う際は、
外部モジュールの型定義を行う必要があります。

メジャーなモジュールの型定義は

FlowTyped
https://github.com/flowtype/flow-typed
にある可能性があるのでそちらをインストールすればOKですが、
ここにない場合は自分で書く必要があります

具体的には

.flowConfigに
```.flowConfig
[libs]
flow-typed
modules
```
上記のように指定したフォルダに
hogehoge.js.flowを作る必要があります。


外部モジュールの定義をどこまですればいいのかが問題ですが、
```hogehoge.js.flow
declare module 'hogehoge' {
}
```
上記のようにトップレベルの定義だけして済ますのでは
あまり意味がないので、ある程度の型指定はしておきたいところです。
("ある程度"が難しいところですが...

他にチェックすべきところとして
ある程度の基本の型やBOM,DOMといった必須パーツの定義は予めされているので
こちらに則るのが良いと思われます。
FlowCheatSheet
https://www.saltycrane.com/flow-type-cheat-sheet/latest/

# おわりに
jsでコードを書いていると、現状一番時間を食っているのが
外部モジュールのflow定義のような気がしています...
早くflowとお友達になりたい。

追記
未確認ですが、tsファイルからflow定義を作成するgeneratorがあるようなので
https://github.com/joarwilk/flowgen
tsで書かれたモジュールであれば自動生成が可能かもしれません
タグ付けしたときにCircleCIでハマった話

GitHubにタグ付けしてもCircleCIが動作しなかったので、そのときの解決方法を記載します。
結論としては、`requiresのジョブにもfiltersを設定しよう`ということになります。

# 環境
- CircleCI version 2.0
- GitHub

# 問題
以下のように`circleci/config.yml`を書いてタグ付けをしたのですが、なぜかCircleCIでワークフローが動作しませんでした。

```config.yml
workflows:
  version: 2
  samples:
    jobs:
      - sample1:
      - sample2:
          requires:
            - sample1
          filters:
            branches:
              ignore: /.*/
            tags:
              only: /^v[0-9]+(\.[0-9]+){2}$/
```
# 原因と解決方法

jobsの基本動作として、`filters`の`branches`指定しなくても全てのブランチでジョブは動作しますが、`tags`は**指定しないと動作しない**ようになっていました。

公式に、依存するジョブにはタグの指定をしてね、的なことが書いてありました。
https://circleci.com/docs/2.0/workflows/#git-tag-job-execution


つまりここで動作しなかった原因は、sample2の必須ジョブとしてsample1が設定されていましたが、sample1はタグ設定時には動作しないためCircleCIが動作していませんでした。

以上を考慮して、タグ設定時でもsample1を動作させるようにした結果、無事タグ付けしたときにCircleCIが連動してジョブを実行してくれました :raised_hands:

```config.yml
workflows:
  version: 2
  samples:
    jobs:
      - sample1:
          tags:
              only: /^v[0-9]+(\.[0-9]+){2}$/
      - sample2:
          requires:
            - sample1
          filters:
            branches:
              ignore: /.*/
            tags:
              only: /^v[0-9]+(\.[0-9]+){2}$/
```


# 参考
タグ動作でハマった人が質問しており、見事原因が同じでした。
https://discuss.circleci.com/t/builds-for-tags-not-triggering/17681/5
Hashの順番を並び替えるときHash#sliceがべんり

Ruby 2.5で追加された`Hash#slice`を使うと便利

```rb
h = {a: 1, b: 2}
key_order = %i[b a]
h.slice(*key_order)
# => {:b=>2, :a=>1}
```

## マイクロベンチマーク

```sort_hash.rb
require 'benchmark/ips'

class Hash
  # active_support/core_ext/hash/slice
  # https://github.com/rails/rails/blob/v5.2.0.beta2/activesupport/lib/active_support/core_ext/hash/slice.rb#L23-L25
  def slice_as(*keys)
    keys.each_with_object(Hash.new) { |k, hash| hash[k] = self[k] if has_key?(k) }
  end

  # based on active_support/core_ext/hash/slice
  # https://github.com/rails/rails/blob/v5.2.0.beta2/activesupport/lib/active_support/core_ext/hash/slice.rb#L23-L25
  def slice_sort(*keys)
    keys.each_with_object(Hash.new) { |k, hash| hash[k] = self[k] }
  end
end

Benchmark.ips do |x|
  x.report('Hash#slice builtin') do
    { a: 1, b: 2, c: 3 }.slice(:c, :b, :a)
  end

  x.report('Hash#slice active_support') do
    { a: 1, b: 2, c: 3 }.slice_as(:c, :b, :a)
  end

  x.report('Hash#slice active_support tweaked') do
    { a: 1, b: 2, c: 3 }.slice_sort(:c, :b, :a)
  end

  x.compare!
end
```

```
% ruby -v sort_hash.rb
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]
Warming up --------------------------------------
  Hash#slice builtin   111.211k i/100ms
Hash#slice active_support
                        67.275k i/100ms
Hash#slice active_support tweaked
                        73.364k i/100ms
Calculating -------------------------------------
  Hash#slice builtin      1.479M (± 1.2%) i/s -      7.451M in   5.040261s
Hash#slice active_support
                        812.401k (± 1.0%) i/s -      4.104M in   5.051928s
Hash#slice active_support tweaked
                        876.849k (± 1.0%) i/s -      4.402M in   5.020535s

Comparison:
  Hash#slice builtin:  1478540.2 i/s
Hash#slice active_support tweaked:   876849.3 i/s - 1.69x  slower
Hash#slice active_support:   812400.9 i/s - 1.82x  slower
```


## 参考
https://github.com/ruby/ruby/blob/v2_5_0/spec/ruby/core/hash/slice_spec.rb#L19-L21
brew update fails with "Git must be installed and in your PATH

brew をアップロードしようとするとエラーが出ました。
助けてください。cocopadsをインストールするまでの準備で妨げになってしまいました。

```
$ brew update
Warning: git 2.15.1_1 is already installed
Error: Git must be installed and in your PATH!
Tomohisa-no-MacBook-Pro:local TomohisaSutani$ 
I know there are similar problems posted.
This is for my case. Many Thanks! in Advance.
```

```
$ brew config
HOMEBREW_VERSION: >=1.4.0 (shallow or no git repository)
ORIGIN: (none)
HEAD: (none)
Last commit: never
Core tap ORIGIN: (none)
Core tap HEAD: (none)
Core tap last commit: never
HOMEBREW_PREFIX: /usr/local
HOMEBREW_NO_ANALYTICS_THIS_RUN: 1
CPU: quad-core 64-bit broadwell
Homebrew Ruby: 2.3.3 => /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.3.3/bin/ruby
Clang: N/A
Git: N/A
Curl: 7.54.0 => /usr/bin/curl
Perl: /usr/bin/perl
Python: /usr/bin/python
Ruby: /usr/bin/ruby => /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby
Java: N/A
macOS: 10.12.6-x86_64
Xcode: N/A
CLT: N/A
X11: 2.7.11 => /opt/X11
```

``````
$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

Warning: Git could not be found in your PATH.
Homebrew uses Git for several internal functions, and some formulae use Git
checkouts instead of stable tarballs. You may want to install Git:
  brew install git

Warning: No developer tools installed.
Install the Command Line Tools:
  xcode-select --install


``````

そのた情報が必要であればおしらせください。よろしくお願いします。


```
$which - a git
/usr/local/bin/git
```
`````
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Users/TomohisaSutani/.rvm/bin 

```
Kindについて

## Kind

kindは、Intだと`*`、Maybeだと`* -> *`などと表し、型が型をとる場合がわかるラベルみたいなもの。(`*`以外にもいくつか種類がある。)

kindは`:k`や`:kind`で確認できる。

```haskell
>:k Int
Int :: *
>:k Maybe
Maybe :: * -> *
>:k Map
Map :: * -> * -> *
```

例えばこのように定義した時、

```haskell
Prelude> data Foo a b
Prelude> :k Foo
Foo :: * -> * -> *
```

aとbを受け取るので`* -> * -> *`だが、

```haskell
Prelude> data Foo a b = Foo (a b)
Prelude> :k Foo
Foo :: (* -> *) -> * -> *
Prelude> :k Foo Maybe Int
Foo Maybe Int :: *
```

こうすると、Fooのaはbを受け取るのだから、aが`* -> *`だと推論してくれる。

なのでFooのaは`* -> *`な型しか受け取れない。

これをわかりやすくkind注釈を書くこともできる。

```haskell
Prelude> :set -XKindSignatures
Prelude> data Foo (a :: * -> *) (b :: *) = Foo (a b)
```

余談だが、この辺Scalaだとkindを意識して型定義する必要があるのでわかりやすい。

```scala
scala> case class Foo[F[_], A](f: F[_], a: A)
defined class Foo

scala> :k -v Foo
Foo's kind is X[F[A1],A2]
(* -> *) -> * -> *
```

`*`はIntみたいにkindを取らない型しか表せないから単相だが、多相なkindを表すこともできる。

```haskell
Prelude> :set -XPolyKinds
Prelude> data Foo (a :: k) = Foo
Prelude> :k Foo
Foo :: k -> *
Prelude> :k Foo Int
Foo Int :: *
Prelude> :k Foo Maybe
Foo Maybe :: *
```

## 型の昇格

DataKinds拡張を使うことで、値コンストラクタを型に使うことができる。

```hs
Prelude> :set -XDataKinds
Prelude> :set -XKindSignatures
Prelude> data Color = Red | Blue
```

Red、Blueは値コンストラクタだが、

```hs
Prelude> data MkColor (a :: Color)
Prelude> :k MkColor Red
MkColor Red :: *
```

のように型として使うことができるる。さらに型コンストラクタは種上にも定義することができるなど昇格して便利に使うことができる。

もっとちゃんと書こうと思ったけど時間ないのでこの辺で...
UltraZed 向け Debian GNU/Linux (v2017.3版) の構築(FSBL編)

## はじめに

UltraZed-EG スターターキットに Debian GNU/Linux (v2017.3版) を構築する方法について、具体的な方法をいくつかに分けて説明します。

 * [Introduction](https://qiita.com/ikwzm/items/a4ebcffdd26ab3e8124d)
 * [Boot Loader](https://qiita.com/ikwzm/items/9d2a76f9665759df58e7)
   - [Sample FPGA Design](https://qiita.com/ikwzm/items/61316ecec2fc68be4c96)
   - __FSBL   (First Stage Boot Loader)(この記事)__
   - [PMUFW  (Platform Manager Unit Firmware)](https://qiita.com/ikwzm/items/9835f591a78e83d6b92b)
   - [BL31   (ARM Trusted Firmware Boot Loader state 3-1)](https://qiita.com/ikwzm/items/6d03b7e5b47721df3ae9)
   - [U-Boot](https://qiita.com/ikwzm/items/27e6ab1517d724b7f2eb)
   - [BOOT.BIN](https://qiita.com/ikwzm/items/45520c8722edbfcd3575)
 * [Linux Kernel](https://qiita.com/ikwzm/items/367f49e9b02102e907d8)
 * [Debian9 Root File System](https://qiita.com/ikwzm/items/a0e88798ed29b30fa003)

この記事では、ZynqMP の Boot Loader で使うための FSBL(First Stage Boot Loader) の構築について説明をします。

## 必要な環境

 * Vivado SDK 2017.2

## Sample FPGA Design の構築

FSBL の構築には Sample FPGA Design のハードウェア情報が必要です。[「UltraZed 向け Debian GNU/Linux (v2017.3版) の構築(Sample FPGA Design編)」](https://qiita.com/ikwzm/items/61316ecec2fc68be4c96)の通りに target/UltraZed-EG-IOCC/build/fpga/project.sdk/design_1_wrapper.hdf を作っておきます。

## FSBL の構築

ここでは Vivado の hsi(Hardware Software Interface) を使って構築する方法を示します。GUI を使って手で入力するのは面倒なので Tcl スクリプトファイルを用意しています。 Tcl スクリプトの詳しい内容は[「Vivado SDK でZynq FSBL(First Stage Boot Loader)をビルドするTclスクリプト(hsi編)」](https://qiita.com/ikwzm/items/e09fab6b17986471cbda)を参照してください。

```Tcl:target/UltraZed-EG-IOCC/build/fpga/build_zynqmp_fsbl.hsi
#!/usr/bin/tclsh

set app_name          "fsbl"
set app_type          "zynqmp_fsbl"
set hwspec_file       "design_1_wrapper.hdf"
set proc_name         "psu_cortexa53_0"
set project_name      "project"
set project_dir       [pwd]
set sdk_workspace     [file join $project_dir $project_name.sdk]
set app_dir           [file join $sdk_workspace $app_name]
set app_release_dir   [file join [pwd] ".." ]
set app_release_elf   "zynqmp_fsbl.elf"

set hw_design         [open_hw_design [file join $sdk_workspace $hwspec_file]]

generate_app -hw $hw_design -os standalone -proc $proc_name -app $app_type -compile -dir $app_dir
file copy -force [file join $app_dir "executable.elf"] [file join $app_release_dir $app_release_elf]
```

build_zynqmp_fsbl.hsi を Vivado で実行することにより target/UltraZed-EG-IOCC/build/zynqmp_fsbl.elf が生成されます。

```shell
vivado% cd target/UltraZed-EG-IOCC/build/fpga/
vivado% hsi -mode tcl -source build_zynqmp_fsbl.hsi
```

## 参考

 * [「Vivado SDK でZynq FSBL(First Stage Boot Loader)をビルドするTclスクリプト(hsi編)」@Qiita](https://qiita.com/ikwzm/items/e09fab6b17986471cbda)
rakeタスクで使用するメソッドの共通化

## rakeファイルのメソッド共通化

DRYなコードを書く上で、共通化した処理をどこに書くかで結構悩むかと思います。
今回はrakeタスクを書いていて、別ファイルに逃がすまではしたくないけど、共通化したい場合があって調べてみたら同じ境遇の方がいたので備忘録として残しておきます。

```ruby
namespace :hoge do

  top_level = self

  using Module.new {
    refine(top_level.singleton_class) do
      def fuga
        p 'hogehoge'
      end
    end
  }

  desc 'test task'
  task test_task: :environment do |task, args|
    fuga
  end

end
```

オブジェクトの確認

```
[1] pry(main)> top_level
=> main
[2] pry(main)> top_level.singleton_class
=> #<Class:#<Object:0x007fa9470be378>>
[3] pry(main)> top_level.class
=> Object
```

実行

```
$ bin/rails hoge:test_task
=> "hogehoge"
```

トップレベルでオブジェクトを生成すると、`Object`クラスの`main`オブジェクトを生成する。
[rubyにおけるトップレベル](https://www.rubylife.jp/ini/method/index1.html)

## refinements

引数 klass で指定したクラスだけに対して、ブロックで指定した機能を提供で きるモジュールを定義します。
定義した機能は Module#refine を使用せずに直 接 klass に対して変更を行う場合と異なり、限られた範囲のみ有効にできます。 
**定義した機能は main.using, Module#using を実行した場合のみ 有効になります。**
[ドキュメント](https://docs.ruby-lang.org/ja/latest/method/Module/i/refine.html)

```ruby
class C
  def foo
    puts "C#foo"
  end
end

module M
  refine C do
    def foo
      puts "C#foo in M"
    end
  end
end

x = C.new
x.foo # => "C#foo"

using M

x = C.new
x.foo # => "C#foo in M"
```

`refine, using`便利だな〜
組み込みクラスとか拡張するときには、逆にこの機能を使わないと不安なレベルではあるかなと。(滅多にないとは思うが...)

## 参考
[rakeタスクの中だけで使うメソッドはRefinementsで定義するとべんり](https://qiita.com/hanachin_/items/6cf63dd3987a60e3d264)

[Ruby の refinements の使い途](https://qiita.com/scivola/items/dc49d56c90fd0cb6d4d3)

[usingのスコープ](https://docs.ruby-lang.org/en/trunk/syntax/refinements_rdoc.html#label-Scope)

[ドキュメント](https://docs.ruby-lang.org/ja/latest/method/Module/i/refine.html)
sequelizeのログをいい感じにする

Rails（ActiveRecord）ではクエリの実行時間や内容がわかりやすくログに表示されている。
sequelizeでログをカスタムしてそれっぽくする。

## ログのカスタム

以下の記事参考
https://qiita.com/TsuyoshiMIYAMOTO/items/ba755b91789f9888f8e2

## カスタムログで実行時間を取得する

sequelizeにはbenchmarkオプションがあり、

```js
var sequelize = new Sequelize(db, username,  password, {
  benchmark: true
})
```

のように全体で設定するか、

```js
const users = await User.findAll({benchmark: true})
```

のように各クエリで設定する。

実行時間はloggingの関数の第2引数で渡される。

```js
var sequelize = new Sequelize(db, username,  password, {
  benchmark: true,
  logging: (logStr, execTime, options) => {
    logger.debug(logStr, execTime)
  }
})
```

### 最終例

いい感じに色を設定

```js
const colors = require('colors/safe')
const path = require('path')

const env = process.env.NODE_ENV || 'development'
const config = require(path.resolve('config', 'database.json'))[env]

const options = Object.assign({}, config, {
  logging: (logStr, execTime, options) => {
    if (!options) {
      options = execTime
      execTime = undefined
    }
    let col = null
    switch (options.type) {
      case 'SELECT':
        col = colors.blue.bold
        break
      case 'UPDATE':
        col = colors.yellow.bold
        break
      case 'INSERT':
        col = colors.green.bold
        break
      default:
        col = colors.white.bold
        break
    }
    if (execTime) {
      logger.debug(colors.magenta.bold(`[${execTime} ms]`), col(logStr))
    } else {
      logger.debug(col(logStr))
    }
  }
})
const sequelize = new Sequelize(config.database, config.username, config.password, options)
```
C++ Builder 10.2 Tokyo > IDE > 構造強調表示の解除

```txt:動作環境
Rad Studio 10.2 Tokyo Update 2
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/ab9b29c5-ae20-923d-9d1c-33ac9f498994.png)

for文の左などにある色がついたブロックの表示は「構造強調表示」というものらしい。

参照: [コード エディタ](http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/%E3%82%B3%E3%83%BC%E3%83%89_%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF)

この表示はソースリーディング時の障害になるので解除したい。

オプションの
エディタ設定 > 色 > 構造強調表示 > 構造強調表示を有効にする
のチェックをはずす。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/cf2f4c59-5f41-0276-4a8c-04defa841e8d.png)


**ソースコードを閲覧している場合は、表示解除はすぐに反映されない。**ソースコードを開きなおすと、強調表示はされなくなる。

### 関連

[C++ Builder 10.2 Tokyo > IDE > エディタに表示される狼煙（のろし）マーク > 消し方](https://qiita.com/7of9/items/a2fa9d107c5b36cc0798)
ApplicationError　イベントID1000(100)

```
障害が発生しているアプリケーション名: mmc.exe、バージョン: 6.3.9600.17415、タイム スタンプ: 0x54504e26
障害が発生しているモジュール名: ntdll.dll、バージョン: 6.3.9600.18821、タイム スタンプ: 0x59ba86db
例外コード: 0xc0000374
障害オフセット: 0x00000000000f1c10
障害が発生しているプロセス ID: 0x21c0
障害が発生しているアプリケーションの開始時刻: 0x01d379fcec7c69fb
障害が発生しているアプリケーション パス: C:\Windows\system32\mmc.exe
障害が発生しているモジュール パス: C:\Windows\SYSTEM32\ntdll.dll
レポート ID: 65452e90-e9f9-11e7-80ef-9cb654b8549e
障害が発生しているパッケージの完全な名前: 
障害が発生しているパッケージに関連するアプリケーション ID: 
```
なんじゃこりゃ？？？

まぁ気にしないでいいのかな……