OmniAICreator/Qiita-1.07M huggingface dataset:
隣接リストの木構造で列の値を根から引き継がせる


```text
id  parent_id  auther
--  ---------  ---------
1   null       foo
2   1          foo
3   2          bar
```

3のようなレコードをDB制約で弾きたい。1つの木に auther が異なる枝が混入しないようにしたい。
# 環境
- SQLite3

# 元の状態

```sqlite3
CREATE TABLE tree(
    id INTEGER NOT NULL UNIQUE PRIMARY KEY AUTOINCREMENT,
    parent_id INTEGER,
    auther,
    FOREIGN KEY (parent_id) REFERENCES tree(id)
);
```

# たどり着いたもの

```sqlite3
CREATE TABLE tree(
    id INTEGER NOT NULL UNIQUE PRIMARY KEY AUTOINCREMENT,
    parent_id INTEGER,
    auther,
    UNIQUE(id, auther),
    FOREIGN KEY (parent_id, auther) REFERENCES tree(id, auther)
);
```

## ポイント
Auther フィールドを親から引き継がせるために、もとの隣接リストの foreign key 制約

```sqlite3
FOREIGN KEY (parent_id) REFERENCES tree(id)
```

を、次のような複合 foreign key 制約に変える。

```sqlite3
FOREIGN KEY (parent_id, auther) REFERENCES tree(id, auther)
```

これにより、自行の auther と参照先の auther が一致しない場合レコードは挿入できない。

```sqlite3
Error: FOREIGN KEY constraint failed
```

なお、Foreign key 制約を課すためには参照先の列に Unique 制約が必要。

```sqlite3
UNIQUE(id, auther)
```
rstudio.cloud の紹介

# rstudio.cloud とは

[rstudio.cloud](https://rstudio.cloud) とは クラウド環境中の RStudio Server が(今のところ) 無料で使えるサービスです。
(ただし，まだ alpha ステージのサービスですのでその点ご注意ください。)
利用するにはこのサービスへのサインアップ・ログインが必要です。
(サインアップ・ログインは Google または GitHub のアカウントでもできます。)

その機能は「RStudio Server Open Source Edition に
- **Project Sharing**
- **Multiple R Versions**
を足して少しクラウドサービス独自色が入ったもの」ぐらいの認識で問題無いかと。

# rstudio.cloud について詳しく

rstudio.cloudにはまず大別して

- **Workspace**
- **Workspace以外のSpace**

という概念があります。前者はpublicな `Space`, 後者はpublicではない `Space` になります。
前者のSpaceは最初から一つだけ存在するもので, 後者はユーザが自ら作るものになります(後者は複数作れます)。
`Space` の概念の下には複数の `Project` がありこの `Project` が1つの RStudio Server 環境に相当します。

## Workspaceについて

![image.png](https://qiita-image-store.s3.amazonaws.com/0/7591/e904a6ee-314b-78b8-8ee1-4b3cbd8f176d.png)

上記画像では public な `Space` (Workspace) に hoge と moge と名付けた2つの RStudio Server 環境が存在しているわけです。
Primers と Trash は全ユーザーのWorkspace中に最初から存在する Project 集です。

Primers には R 言語の学習用に RStudio 社が用意してくれている Project がいくつがあり，
Trash には要らなくなった Project を捨てるようになっています。

## Workspace 以外の Space

画像中で foo と名付けられた `Space` は私が作成したもので public ではない Project 集になります。
`Project` が public かそうでないかは `Project` 名右下のロックアイコンによって確認できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/7591/ffa3f319-781b-1be1-005d-3f3ac9c4fbb2.png)

また Workspace 以外の `Space` には他の rstudio.cloud ユーザを招待しその `Space` 内の `Project` を共有できるようになっています。

# 結び

まだ alpha ステージのサービスなので データ・環境安定性・性能 などの保証はできません (その說明の記述も無いように思いました)。
ですがクラウドの利便性を無料で得ることができるという点で試されて損は無いかと思います。

以上。
ブロックチェーンのウォレットとは

今回はブロックチェーンの**ウォレット**について紹介します。
できる限り「Short & Simple」を心がけます。
なお、私もブロックチェーン初学者なので、内容に誤り等ありましたらご指摘いただけると幸いです。

## ウォレットとは
ウォレットとは**デジタル鍵（秘密鍵、もしくは秘密鍵と公開鍵のペア）を保持する単純なデータベース**。ウォレットというとコインなどを管理しているイメージだが、実際はデジタル鍵を管理している。
※秘密鍵や公開鍵については以下の記事をご参照ください。

- [公開鍵暗号](https://qiita.com/nagata03/items/64431248426a46235075)

## ウォレットアドレス
ウォレットアドレスは**「お金を受け取るためのアドレス（＝お金の送り先のアドレス）」**。公開鍵から一方向ハッシュ関数を用いて生成される。
ウォレットアドレスは、ブロックチェーンの参照やインターネットへのアクセスがなくても生成することができる。

## 非決定性（ランダム）ウォレット
初期のウォレットは**ランダムに生成された秘密鍵の集まり**を管理しており、このタイプのウォレットを**非決定性ウォレット**を呼ぶ。
例えばビットコインクライアントの場合、初回起動の時にあらかじめ100個のランダムな秘密鍵を作成する。ここの鍵は１度しか使われないため、ストックがなくなると必要に応じて鍵を追加する。
非決定性ウォレットの欠点は、鍵のすべてをコピー（バックアップ）しておく必要があること。ウォレットにアクセスできなくなった場合、鍵のバックアップがなければその鍵に紐づく資金を永久に失うことになる。

## 決定性ウォレット
決定性ウォレットまたはSeededウォレットは、１つの共通の「シード（乱数）」から一方向性ハッシュ関数を用いて導出された秘密鍵が入ったウォレット。
決定性ウォレットでは、「シード」があれば生成されたすべての鍵を復活させられるため、「シード」のみを１度バックアップしておけば十分。
「シード」はウォレットのエクスポートやインポートにも適しており、ウォレット間の鍵の移行を容易にしてくれる。

## ホットウォレットとコールドウォレト
*後日追記します。*


## 参考文献
- [いちばんやさしいブロックチェーンの教本](https://www.amazon.co.jp/いちばんやさしいブロックチェーンの教本-人気講師が教えるビットコインを支える仕組み-「いちばんやさしい教本」シリーズ-杉井靖典-ebook/dp/B075CFG2TY/ref=sr_1_1?ie=UTF8&qid=1511787155&sr=8-1&keywords=いちばんやさしいブロックチェーンの教本)
- [Mastering Bitcoin](https://www.amazon.co.jp/ビットコインとブロックチェーン-アンドレアス・Ｍ・アントノプロス-ebook/dp/B072JJL66R/ref=sr_1_2?s=digital-text&ie=UTF8&qid=1511787188&sr=1-2&keywords=mastering+bitcoin)
アルファゼロについて羽生永世七冠が著書の中で予測していた

前人未到の「永世七冠」の達成と翌日のアルファゼロの発表と盛り上がったが，羽生永世七冠がアルファゼロの可能性について著書『[人工知能の核心](http://amzn.to/2AFF8pJ)』NHK出版，2017年．の中で予測していた．
34頁からやや長く引用する．

>「もし、アルファ碁の探索の設定が詳らかになれば、将棋やチェスにも応用できる可能性があるのかもしれないと、考えています。そして、それが何を意味しているのかというと、チェスや将棋や囲碁は、競技としては違うけれども思考のロジックには共通のプラットフォーム(基盤)があるかもしれない、という可能性です。異なったルールであっても、思考や論理的な考え方そのものには、突き詰めると、根本的なところで共通するものが存在する。もしそうなら、それは「知性」そのものの汎用性を考える契機にはならないでしょうか。」
systemd-nspawnで使う.nspawnファイルとは？

[systemd-nspawn Advent Calendar 2017](https://qiita.com/advent-calendar/2017/systemd-nspawn) 4日目の記事です。

.nspawnファイルとはコンテナ個別の設定を行うために設置するファイルです
以下の場所に設置できます

* /etc/systemd/nspawn/machine.nspawn
* /run/systemd/nspawn/machine.nspawn
* /var/lib/machines/machine.nspawn

これは順に検索され、見つかった時点で検索を終了します。

例えば、`/var/lib/machines/ubuntu` にコンテナがあり、`/etc/systemd/nspawn/ubuntu.nspawn`と`/run/systemd/nspawn/ubuntu.nspawn`にファイルを置いた場合は最初のファイルに書いた設定しか有効になりません。
また、コマンド引数の方が優先されるため、例えばnspawnファイルに

```
[Exec]
Boot=0
```

と書いたとしても、-bオプションを付けて起動すれば/sbin/initから起動します。

もう一点注意点として、`/var/lib/machines/machine.nspawn` に置いたnspawnファイルはホスト側に影響するようなオプション
TemporaryFileSystem=, Bind=, BindReadOnly=, Capability= 等は使うことができません。
そのようなオプションを使う場合は`/etc/systemd/nspawn/machine.nspawn`か`/run/systemd/nspawn/machine.nspawn`に置いてください。

設定サンプル

```
[Exec]
# /sbin/initから起動させる
Boot=1
[Files]
# hostの/mntとコンテナの/var/tmpをつなげる
Bind=/mnt:/var/tmp
[Network]
# br0インターフェイスにブリッジする
Bridge=br0
```



その他詳しいことは[`man systemd.nspawn`](https://www.freedesktop.org/software/systemd/man/systemd.nspawn.html)を参照ください
Datadog AgentをKubernetesにインストールするときのベスト・プラクティス

# TL;DR;

ただhelm installするだけだと色々難点があるので、以下の設定は最低限入れておくといいと思います。

# 手順

相当な数の設定をhelm install時に渡す必要があって、コマンドラインから`--set`フラグで渡すと見通しが悪いため、以下のようなYAMLファイルを作成する。

```yaml:datadog.values.yaml
daemonset:
  updateStrategy: RollingUpdate
  # Masterノードのメトリクスも収集できるように
  tolerations:
  - operator: Exists
    effect: NoSchedule
  - operator: Exists
    effect: NoExecute
  - operator: Exists
    key: CriticalAddonsOnly

# helm install datadogでつくられるkube-state-metrics chartのrbac.createをtrueにする方法がわからないので別個に入れる
kubeStateMetrics:
  enabled: false

datadog:
  # Datadog APMを利用するため
  apmEnabled: true
  env:
  # Process and Container Monitoringを利用するため
  # https://docs.datadoghq.com/infrastructure/process/#kubernetes-daemonset
  - name: DD_PROCESS_AGENT_ENABLED
    value: "true"
  - name: HOST_PROC
    value: /host/proc
  - name: HOST_SYS
    value: /host/sys
  # 必要かなと思ったけど、これがあるとホストのhostnameコマンドの出力（本当のホスト名）ではなく、K8Sノード名(AWSの場合、ip-<private ip>)が使われてしまって、トレース、メトリクス、ログの#hostタグの値の整合がとれなくなってしまったのでやめた
  # https://github.com/DataDog/dd-agent/issues/3496#issuecomment-325642715
  #- name: KUBERNETES_KUBELET_HOST
  #  valueFrom:
  #    fieldRef:
  #      fieldPath: spec.nodeName

  # Event collectionするとき同じイベントを重複して収集してしまわないように、Leader Election機能を有効化する
  # https://github.com/kubernetes/charts/issues/1021#issuecomment-327189423
  - name: KUBERNETES_LEADER_CANDIDATE
    value: "true"
  - name: KUBERNETES_LEADER_LEASE_DURATION
    value: "60"
  - name: KUBERNETES_NAMESPACE_NAME_REGEX
    value: "'.*'"
  # 複数環境(test, staging, production等)からのメトリクスを分類できるように(Datadog APMトレースのタグにはならない)
  - name: DD_TAGS
    value: "env:test,kube_cluster:mycluster1"
  volumeMount:
  - name: passwd
    mountPath: /etc/passwd
    readOnly: true
  volume:
  - hostPath:
      path: /etc/passwd
```

Datadog chartにインストールさせることもできるか、その場合にkube-state-metrics chartにそのRBAC関連リソースを作らせる方法がわからなったので、別途インストールする。

```
$ helm install stable/kube-state-metrics --set rbac.create=True
```

dd-agentをインストールする。

```
$ helm install \
  --name datadog \
  --set datadog.apiKey=$DD_API_KEY \
  -f datadog.values.yaml
```
WebExtention の Add-on missing manifest. で5分無駄にした話

絶対に繰り返す自信があるので備忘録

アドオン作る準備が終わって、開発者センターから .zip をアップロードしたら以下のエラーではじかれた。

    アドオンの検証に失敗しました。2 個のエラーがあります。
  
    No install.rdf or manifest.json found
    Add-on missing manifest.

.zip内に manifest.json 含めてるのになんで？と思って、マニュアルを見直すと以下の記述。

[MDN web docs :  WebExtensionを公開する](https://developer.mozilla.org/ja/Add-ons/WebExtensions/Publishing_your_WebExtension)

    1.あなたのWebExtensionを格納したディレクトリを開きます。
    2.すべてのファイルをSelectします。
    3.右クリックメニューから圧縮を選びます。

原因は、親のディレクトリごとzip化したせいでした。
配下の全ファイル選択→zip化　しないとだめ。若干めんどくさい。

階層が違ったため manifest.json 見つからなかっただけでした。辛い。

マニュアルちゃんと読みましょう。
組合せ最適化でのりのりを解く

Advent Calendar 7日目の記事 [組合せ最適化で因子の部屋を解く](https://qiita.com/SaitoTsutomu/items/bf825e14c686e2393c1e)
Advent Calendar 9日目の記事 [組合せ最適化でチョコナを解く](https://qiita.com/SaitoTsutomu/items/6185510f01a615ba9ca5)

## これなに

**のりのり**を、Pythonで[組合せ最適化](https://qiita.com/SaitoTsutomu/items/bfbf4c185ed7004b5721)モデルを作って解きます。
解く楽しみは、モデル化を工夫することになります。

[^1]: カックロは[株式会社二コリ](http://nikoli.co.jp/)の[登録商標](http://www.nikoli.co.jp/ja/copyright/)です。

自分でも試してみたい人は、下記を参考にしてください。

- [数独を通して組合せ最適化を学ぼう](https://qiita.com/SaitoTsutomu/items/bd09190d8a02432b3f16)

## 問題

- 盤面のいくつかのマスを黒くぬります。
- 黒マスは必ずタテかヨコにちょうど２つだけぬります。
- 太線で区切られた各部分には、黒マスが２つずつ入ります。

左が問題で、右が答えです。

![](https://raw.githubusercontent.com/SaitoTsutomu/opt4puzzle/master/pic/norinori.png)

Pythonでは、`data`（部屋のグループ）を使うことにします。

```py3:python
import pandas as pd, matplotlib.pyplot as plt
from pulp import LpProblem, lpSum, value
from ortoolpy import addbinvars
data = """\
ABBBC
ADDBC
EDBBB
EEEEE
EEEEE""".splitlines()
```

## 変数表

下記のような変数表を作成します。各行の変数は0または1をとります。
変数の値が1ならば、該当行 該当列のマスが黒になります。

<table><tr><th></th><th>行</th><th>列</th><th>字</th><th>Var</th></tr>
<tr><th>0</th><td>0</td><td>0</td><td>A</td><td>v000001</td></tr>
<tr><th>1</th><td>0</td><td>1</td><td>B</td><td>v000002</td></tr>
<tr><th>...</th><td>...</td><td>...</td><td>...</td><td>...</td></tr>
</table>

```py3:python
ni, nj = len(data), len(data[0])
a = pd.DataFrame([(i,j,data[i][j]) for i in range(ni)
    for j in range(nj)], columns=list('行列字'))
a['Var'] = addbinvars(len(a))
a[:2]
```


## 数理モデルを作り解く

変数表ができたので、のりのりの解になるように、制約条件を追加し数理モデルを作成し、解きましょう。

- あるマスが黒なら、その上下左右の黒の数はちょうど1となる。これは、下記の2つの式で表現できます（Mは十分大きな数）。
    - 上下左右の黒の数 >= 該当マスの黒の数
    - 上下左右の黒の数 <= 1 + M*(1-該当マスの黒の数)
- 各グループ内の黒の数はちょうど2。

```py3:python
m = LpProblem()
for _,r in a.iterrows():
    e = lpSum(a.query(f'abs(行-{r.行})+abs(列-{r.列})==1').Var)
    m += e >= r.Var
    m += e <= 1+(len(e)-1)*(1-r.Var)
for g,v in a.groupby('字'):
    m += lpSum(v.Var) == 2
m.solve()
```

### 結果の表示

```py3:python
a['Val'] = a.Var.apply(value)
plt.imshow((a.Val<0.5).values.reshape(ni,nj), cmap='gray', interpolation='none')
plt.show()
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/13955/12e8cb13-7202-a499-36dd-8c0811662b4a.png)

解けていることが確認できます。

以上
vim,emacsそしてevilへ

# vim,emacsそしてevilへ

## evilとは
emacsのpluginの一つでemacs上でvimの操作が可能になるものです。
少し説明すると、emacsにステート（vimのモードのようなもの）が追加され、emacsステート、vimステートの2つに分かれます。
emacsステートは、emacsのキーバインド操作が可能です。
vimステートは、vimのキーバインド操作と、vimのモード（ノーマル、インサート、ヴィジュアル）も存在します。
どうでしょうか？少し　興味が出てきた方はインストールしてみてはいかがでしょうか？

## インストール方法
evilはemacsのversionが24以上出ないと動作しません。
macの標準で入っているemacsはversionが24未満なのでupdateしましょう。
(versionの確認方法 `$ emacs --version`)

### emacsのversionが24未満の方
`$ brew upgrade emacs`

`$ emacs --version`で`GNU Emacs 25.3.1`と表示されれば大丈夫です。

### emacsが入っていない方
`$ brew install emacs`（オプションに`--with-cocoa`をつけるとGUI版も一緒にinstallされるらしいが、CUI派のため、つけない）

## init.elに以下を追加
``` init.el
(when load-file-name
  (setq user-emacs-directory (file-name-directory load-file-name)))

(require 'package)
(add-to-list 'package-archives
             '("marmalade" . "http://marmalade-repo.org/packages/"))
(package-initialize)

(defun package-install-with-refresh (package)
  (unless (assq package package-alist)
    (package-refresh-contents))
  (unless (package-installed-p package)
    (package-install package)))

(package-install-with-refresh 'evil)

(require 'evil)
(evil-mode 1)
``` 
この設定は、忘れてしまいましたが、どこかのサイトを参考にしました。
emacsを再起動すれば、設定が反映されます。

## 操作方法

evilを導入すると、emacsステート、vimステートが存在し、前述でも説明した通り対応した操作が
可能になります。
ステートに切り替え方法ですが、`C-z`で切り替え可能です。
現在のステートの確認方法は、モードラインの行数の隣に表示されています。

### emacsステート
emacs操作が可能なステートです。
モードラインに`<E>`と表示されます。

### vimステート
vim操作が可能なステートです。
モードラインに`<N>`と表示されているときはノーマルモード、`<I>`のときはインサートモード、`<V>`のときはヴィジュアルモードに相当します。
`<N>`（ノーマルモード）から`<I>`（インサートモード）への切り替えはvimと同様です。

emacsでvim操作ができるなんと面白いですよね。
すでにemacsの方は導入の検討を、vimmerな方はぜひ一度試されてはいかかでしょうか？


## 終わりに
vimを使っている方はvimmer,emacsを使っている人はemacserと呼ぶのでしょうか？emacserは少し、言いにくい気がしますね。
スマートコントラクトの定時実行

知っている限りでは、イーサリアムのスマートコントラクトのトリガーとして考えられるのは

- 外部アカウントから発動するトランザクション
- スマートコントラクトのオーナーが直接にスマートコントラクトの関数を呼び出す

ぐらいしかない。

そうでしたら、よく言われている**指定の日時になったら、残高をAアカウントに送金する** ようなことをどう実現できるかを考えてみます。

「2017/12/01 00:00にアドレスAに10 ETHを送信する」ことを課題とします。

## 論理的に考えてみる
- 普通のシステム上でこうしたい時は、あるサーバーに何かしらの手段でタイマーを設定し、2017/12/01 00:00になると、アドレスAに 10 ETH送信するプログラムを実行する流れになる
- ブロックチェーンの場合は、P2Pネットワークに参加している各ノードが任意のタイミングでネットワークに参加・退出できるので、どのノードに任せるかは全く特定できない
- 特定できないのもよいので、１つではなく複数個たとえば100個のノードに任せるのはどうでしょう
    - まず100個のノードに任せようとしても、2017/12/01 00:00になった時その100個のノードがどれもネットワークにない可能性は、ゼロではない
    - また、現状の各クライアントアプリは、P2Pネットワークに参加しデータ同期することと、同期できたブロックチェーンのデータとやり取りするAPIを公開することしかやってない

なので、論理上はできないように思います。

## スマートコントラクトで考えてみる
- コントラクトXを作成しておく、コントラクトXの内容は
    - 「2017/12/01 00:00-01:00」の1分間の間、最初にコントラクトXのYメソッドを呼び出すアドレスに 0.5 ETH を送信する
    - Yメソッドが呼び出されたら、アドレスAに 10 ETH を送信する
- コントラクトXのアドレスに 10.5 ETH送金しておく

のように料金を払う形であれば、「2017/12/01 00:00-01:00の間Yメソッドの呼び出す」約束を守ってくれる可能性が高くなりますが、と言っても、祈っているにすぎない

## 個人の結論
- 現状は、分かってないだけかもしれませんが、イーサリアムのスマートコントラクトで **指定日時に、あるアドレスに送金する** ようなことは、まだ実現できないようです。
- もちろん、自分のサーバまたはAWSのラムダを使って、指定日時にあるアドレスに送金するとか、指定日時にコントラクトのメソッドを呼び出すとか、の方法であればできると思いますが、**スマートコントラクトだけ** でできないことは、ちょっと意外でした。

## 参考
- [JavaScript API · ethereum/wiki Wiki](https://github.com/ethereum/wiki/wiki/JavaScript-API#web3ethibancreateindirect)
PeerCast プログラミング配信 Advent Calendar 2017 七日目

[昨日](https://qiita.com/fusuya/items/223c13a145e606253312)の続き

複数の外部プログラムにデータを送るとこで手間取っている。
外部プログラムのストリーム？とかプロセスをグローバル変数にしてるんだけど
構造体とかで管理したほうが良いんだろうか

多分AI側にデータ送れているはずなので今度はAI側を作っていきたい

おしまい
Perl の built-in の上書き

rand の返り値を固定してあげて、テストしたい時などに行う
Perl の built-in 関数の上書きについて書いてみます

## 前置き

まずは簡単な上書きの例を紹介してみます
重み付け抽選をしてくれる [Data::WeightedRoundRobin](https://metacpan.org/pod/Data::WeightedRoundRobin) を使うコードのテストを見てみます
次のコードは、`rand` を 1 で固定しているので、常に抽選結果は`bar` になります

```perl:test.pl
BEGIN {
    *CORE::GLOBAL::rand = sub { 1 }
}

use Test::More;
use Data::WeightedRoundRobin;

my $dwr = Data::WeightedRoundRobin->new([qw/foo bar/]);

is $dwr->next, 'bar' for 0..10; # 何回回したって平気..!!

done_testing;
```

```shell-session
perl ./test.pl
# => ok
```

ここで問題提起です
こんな感じの Preload モジュールを読み込んで、このテストを実行した場合どうなるでしょうか？

```perl:Preload.pm
package Preload;

use Data::WeightedRoundRobin;

1;
```

おそらく、テストはfail すると思います

```shell-session
perl -MPreload ./test.pl
# => fail!!
```

前置きが長くなってしまいましたが、
このfailについてと回避策について書いてみます

## 仕様確認

早速、[仕様](
http://perldoc.perl.org/CORE.html#OVERRIDING-CORE-FUNCTIONS) を確認してみます

> To override a built-in globally (that is, in all namespaces), you need to import your function into the CORE::GLOBAL pseudo-namespace at compile time:

```perl
BEGIN {
  *CORE::GLOBAL::hex = sub {
    # ... your code here
  };
}
```

超訳すると...

「どこでも上書きしたbuilt-in を使いたいなら、
built-in 関数が CORE::GLOBAL という名前空間に生えていることにするから、
それをコンパイル時に上書きするようにして」

という感じでしょうか

普段 ユーザ定義の関数の場合、次のように `*Foo::hello` を上書きします
built-in の場合は、`CORE::rand` のように `CORE` に生えているのですが、
上書きする場合は、`CORE::rand` ではなく、`CORE::GLOBAL` を書き換えるようにして! 
というのが、built-in ならではの1つの制約になります

```perl
package Foo {
    sub hello { 'hello!!' }
}

warn Foo::hello; # => hello!!

*Foo::hello = sub { 'fufufu' };

warn Foo::hello; # => fufufu
```

また、もう一つの制約が、**コンパイル時** に上書きすることです
例えば、上記のユーザ定義の関数と同様に上書きしてみても、
これは、意図通り上書きされません

```perl
package Foo {
    sub hello { rand }
}

warn Foo::hello;

BEGIN {
  *CORE::GLOBAL::rand = sub { 1 };
}

warn Foo::hello; # => is NOT 1
```

## 前置きの解説

このコンパイルの制約を踏まえると、前置きのfailは理解できます
つまり、前置きのfailは、次のようなコード解釈がなされ、
rand のコンパイル前に、上書きができなかった為に、コンパイルの制約にそぐわなかったのです

```perl:test.pl
use Data::WeightedRoundRobin; # Preload

BEGIN {
    *CORE::GLOBAL::rand = sub { 1 }
}

use Test::More;
use Data::WeightedRoundRobin;

my $dwr = Data::WeightedRoundRobin->new([qw/foo bar/]);

is $dwr->next, 'bar' for 0..10; # 何回回したって平気..!!

done_testing;
```

```shell-session
perl ./test.pl
# => fail
```

## このテストを通すには？

Preload で rand が 呼び出されている場合はどうするか、やり方を考えてみます

次の例のように、何よりも先にbuilt-in を上書きしておけば、どこでも上書きされたものを利用でき、
その上、上書き後は好きなタイミングで上書きが適用できることを利用してみます

```perl
BEGIN {
    *CORE::GLOBAL::rand = sub { 1 };
}

package Foo {
    sub random { rand }
}

BEGIN {
    *CORE::GLOBAL::rand = sub { 2 };
}

warn Foo::random; # => is 2
```

結論、次のように、
`Preload` の先頭で、`rand` を上書きしてみます:)

```perl:Preload.pm
package Preload;

BEGIN {
    *CORE::GLOBAL::rand = sub { CORE::rand($_[0]) }
}

use Data::WeightedRoundRobin;

1;
```

```
perl -MPreload ./test.pl
# => ok!!
```

やりましたね!


# まとめ

- Perl で built-in を上書きは、CORE::GLOBAL に生えているもんだとして、コンパイル時に上書きする



よりスマートな方法があれば、教えていただけると嬉しいです..!
以上です!
PythonでSeleniumを扱ってhtmlに埋め込まれたJavaScriptを実行

---

- 最近良くSeleniumを使います.
- htmlに埋め込まれたJavaScriptを実行する方法を備忘録的に残しておきます.


---


## とりあえずこんな感じで書けます

```python
browser.execute_script('javascript:hogehoge();')
```

引数はstr型ですね.
hogehoge()は実行したいJavaScriptです.

例えばリンクをクリックしてリンク先のファイルをダウンロードしたいという時に,

```python
driver.find_element_by xxx .click()
```
で要素を取得してボタンをクリックするのではなく,埋め込まれたJavaScriptを実行した方が上手くいったりします.
Advent of Code day4をPerl 6で

こんにちは、7日目の投稿になります。
例によって投稿者がいなかったので、[Advent of Code day4](https://adventofcode.com/2017/day/4)の私の回答を貼っておきます。

```
use v6;                                                                                                                                                
                                                                                                                                                       
say +$*IN.lines>>.split(" ", :skip-empty)\                                                                                                             
.grep(-> @a { +Set(@a) == +@a  }); # (#1)
```

+ ポイント
  + `-> @a`でいったん`@`sigilの変数に代入を行い、2回目の呼び出し(`+@a`に相当する処理)の時にすでに消費されてしまっていて使えなくなるのを防ぎます (#1) 

以上、7日目の投稿でした。
Djangoでのwebアプリ開発～GETでURLパラメータを取得する～


### 自分のメモ用です。 h3

formタグのactionで指定のURLに飛ばして
request.GETでURLパラメータを取得する

※合っているかわからない

3つ設定すること

```ruby:hello/urls.py
#省略
urlpatterns = [
    #省略
    url(r'^get/$', views.hello_get_query, name='hello_get_query'),
    url(r'^get_name/$', views.hello_get_name, name='hello_get_name'),
]
```

```ruby:template/get_query.html
    <form action="{% url 'hello:hello_get_name' %}" method="get">
        <label>名前:<input type="text" size="20" name="your_name"></label>
        <input type="submit" value="送信">
    </form>
```

actionに”{% url 'hello:hello_get_name' %}”と書くことで
レスポンスを返すビュー関数を指定することができる。

```ruby:hello/views.py
#省略
def hello_get_name(request):
   d = {
       'your_name': request.GET.get('your_name')
   }

   return render(request, 'get_name.html', d)
#省略
```

```ruby:template/get_name.html
    {% if your_name %}
        {{ your_name }}さん、こんにちは。
    {% endif %}
```

”http://＊＊＊＊/hello/get_name/?your_name=9999”
となり、
<img width="295" alt="getname.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/222029/4dd8527a-2825-d53a-abfb-6871ab48f9f6.png">

となった。
Linuxコマンド全然使ってないよ！って人のためのLinuxコマンド再入門

# はじめに
みなさんLinuxコマンド使ってますか？
自分は今まで`cd`や、`rm`などしか使っていませんでした。
最近パイプライン、xargsなどの存在を知り、その便利さに感銘を受けたので、紹介したいと思います！

全くLinuxコマンド使ってないよ！って人の一助になれば幸いです。

# パイプラインとは
[【 パイプの使い方 】](http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231015/?rt=nocnt)より
> パイプとはコマンドの実行結果を，次のコマンドの入力として扱えるようにするシェルの機能である。パイプを利用するには，「|」という記号を用いる

以下のようなことが実現できます。

```zsh:Terminal
$ ls | grep Gemfile

Gemfile
Gemfile.lock
```

# xargsとは
[findとxargsの基本的な使い方](https://www.xmisao.com/2013/09/01/how-to-use-find-and-xargs.html)より
> xargsは標準入力から一覧を受け取って、それを引数に任意のコマンドを実行するコマンド。


以下の章で実際の使い方を見ていきましょう。


# 何ができるようになるのか
Linuxコマンドは他のgitコマンドなどと**組み合わせる**ことで、強力な力を発揮します。

例えば、gitコマンドを用いて、次のcommitで反映されるファイルだけ対象に、rubocopを実行する、なんてことが可能になります。

```zsh:Terminal
git diff --cached --name-only --diff-filter=AM | grep '\.rb$' | xargs rubocop
```
またGitフックを用いると、このようなコマンドをコミットの前に自動で実行することができます。[Gitフックを使っておかしいRubyコードをコミットできないようにする](https://qiita.com/yuku_t/items/ad072418290a2b01a35a)

これを応用すると変更したspecファイルだけ実行したい時は以下のようにします。

```zsh:Terminal
git diff --cached --name-only --diff-filter=AM | grep 'spec' | xargs bundle exec rspec
```

gitでマージ済みのローカルブランチを削除する時は以下のようにします。

```zsh:Terminal
git branch --merged | grep -v '*' | xargs -I % git branch -d %
```

注: xargsの-I オプションにより、標準入力より渡されたデータを、任意の位置の引数に展開することが可能になります。


# 補足
上で紹介したようなめんどくさいコマンドをzshrcなどにエイリアスとして登録しておくと便利です。

```zsh:.zshrc
alias rubo=“git diff --cached --name-only --diff-filter=AM | grep '\.rb$' | xargs rubocop”
```

# まとめ
以上数例紹介したように、地味に面倒な作業を一発で実行できるようになるので、Linuxコマンド覚えておくと便利、という話でした。
他にも便利な使い方があれば教えていただけると幸いです！
Heroku Scheduler を使う

Heroku のサーバは、１時間アクセスしないと、スリープ状態になってしまうようなので、
Heroku Scheduler を使って、１時間おきにアクセスをして、スリープさせないようにした

まず、Resources　の画面で、 [Heroku　Schduler]　Add-ons をインストール

![スクリーンショット 2017-12-07 20.51.01.png](https://qiita-image-store.s3.amazonaws.com/0/151710/976c0b86-7307-d013-2987-a6cd95de50c7.png)

![スクリーンショット 2017-12-07 20.51.15.png](https://qiita-image-store.s3.amazonaws.com/0/151710/6bfb8eb8-f718-593a-6eca-fdfb647992ac.png)

Provision ボタンを押すと、インストールされた

![スクリーンショット 2017-12-07 20.51.24.png](https://qiita-image-store.s3.amazonaws.com/0/151710/0f27a530-382d-beed-8fc8-bde16804f9bb.png)

Heroku　Scheduler　のリンクをダブルクリックすると、ジョブを設定する画面が表示される

![スクリーンショット 2017-12-07 20.51.35.png](https://qiita-image-store.s3.amazonaws.com/0/151710/d209af7a-053a-ca2e-58c0-817c263f6d38.png)

１時間ごとにCurlコマンドで自サーバにアクセスするコマンドを毎時0分に実行する設定をした

![スクリーンショット 2017-12-07 20.51.59.png](https://qiita-image-store.s3.amazonaws.com/0/151710/621870e6-f411-557b-c478-4d7f731669bc.png)

これだけで設定終わり。

とっても、簡単で便利ですね。
プログラムを書く時に気をつけていること(変数編)

Qiita初投稿になります。普段プログラムを書く時に気をつけていることを
自分のためにも一回まとめてみたいと思います。
**きほんのき** ではあるんですが、一番大事なことかなって思います。

今回は変数についてです。


# 真偽値を書く時の命名規則

## 正しい例

* isXXXX
* doXXXX
* canXXXX

## ダメな例

* checkXXX
* XXXX

true の場合に何を指しているかというのが重要です。
check は何の説明にもなっていないのでダメです。
is などをつけていない場合もクラス名などと間違いやすいため、ダメです。

# 変数のスコープは極力大きくしない

ほとんど private です。
クラス内しかアクセスできないように閉じ込めておきます。

## 他のクラスからアクセスする時

Get や Set のアクセサメソッドを用意します。
ただし、オブジェクト型を Get で渡してしまうと外でいじられることがあるので、
必要なければ中の値のみを渡します。

```Java:オブジェクトを渡す例
private Object object;
public Object getXXXObject(){
  return object;
}
```
では大きすぎるので、必要なものがもっと少ないならば、、

```Java:値だけ渡す例
private Object object;
public int getXXXObjectNumber(){
  return object.number;
}
```
これだといじられなくて安心です。
オブジェクトごと渡さないとままならない場合もあるのですが、
まず最初に値だけで済まないかどうか考えた方が後で苦労しません。


# 固定した値を使う場合は極力 enum か定数を使う

## グループ化されたもの

グループ化されているような場合（例えば複数のタイプのIDなど）、
enum を使います。その際は言語によってはできるので、実際の値として数値を設定します。

```C#
public enum XXXType {
  typeA = 1,
  typeB = 2,
  typeC = 3
}
```

設定しておくと何がいいかというと、何か設定情報としてテキスト保存などを行う機会もあるからです。

## 単独の値の場合

また、設定情報の保存をしたいが、enum に値が設定できなかった場合は、
const を利用します。

```java:constの例
public const String MAIN_COLOR = "#fad3b2";
```

## 定数だが最低限の計算が伴う場合

```java:時間など
public final int oneDaySeconds = 60 * 60 * 24;
```

定数は定数でも計算が伴うものは Java の final のようなもので定義します。
今回の例の場合、予め計算していたものを入れておけばいいっていう話しもあるのですが、
計算自体のコストよりもパッと見でわかるメンテナンス性の方が大事と考えるからです。


---

とりあえず今回はこの辺にしておきます。
また他の項目についても書いていきます。
分散ストレージを語る

もぉーいーくつねーるとぉー○○○○○～。さて○に入る文字は何でしょう？

そうですね、クリスマスですね！！
アイスタイル <a href="https://qiita.com/advent-calendar/2017/istyle">アイスタイル Advent Calendar 2017 </a> 8日目担当します、廣瀬です。
皆さんはリース飾りましたか？私は今日の朝、「さっさと飾れやヴォケェ！」とたたき起こされて気分↑↑でかざりましたヨ♪

<H2>で、本題。</H2>
早いもので昨年は<a href="https://qiita.com/hirosesa/items/a8965677ec47beb2cc53">ウマいストレージの選び方。</a>というお題でストレージの性能、何を軸に選んだらいいか、などインフラなお話をしました。
私はインフラエンジニアなので、今回もインフラなことを話そうと思います。

<H2>分散ストレージの種類。</H2>
SDS(Software Defined Storage)のカテゴリでもある分散ストレージ、様々なものがありますね。
分散ストレージといっても、ストアの方法から大きく2つに大別できます。

<H3>オブジェクトストレージ</H3>
オブジェクトストレージは読み込み・書き込みの最小単位が「ファイル」になることが特徴です。
AWSのS3もオブジェクトストレージであることは皆さんもよくご存知かと思います。
それだけではなく入出力の方法も主にAPI経由であることも一つの特徴ですね。

<H3>ブロックストレージ</H3>
ブロックストレージの読み込み・書き込みの最小単位は「ブロック」になります。
普段使っているHDD,SSDもブロックストレージと言われますが、大きく違いうのはブロックの大きさです。
HDD,SSDの場合は数KB程度のブロックで読み書きを行いますが、分散ストレージはネットワークを使うため、ネットワークでKBをやり取りするとオーバヘッドが大きくなりすぎるため、数MBのブロックでやり取りされることが多いです。
ブロックストレージではたいていの場合、APIではなくドライバをとおしてPOSIX準拠で読み書きを行います。

<H2>で、どうやってつかうの？</H2>
では実際にどう使うか。
PHPの場合、オブジェクトストレージの場合は下記のようにライブラリを通して、ファイルにアクセスすることになります。
また、アクセスをする前に基本的な認証はすべて終えていることが前提となります。
```
// Get an object.
$result = $s3->getObject(array(
    'Bucket' => $bucket,
    'Key'    => $keyname
));
```
※参考 : <a href="http://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/RetrieveObjSingleOpPHP.html">AWS SDK for PHP を使用したオブジェクトの取得</a>

ブロックストレージの場合はどうなるか？ POSIXでアクセスが可能なので、普通にローカルストレージをアクセスするように読み書きができますね。
こちらも、事前にマウントされていることが前提となります。
```
$result = file_get_contents('/path/to/target.file');
```
※参考 : <a href="http://php.net/manual/ja/function.file-get-contents.php">PHP Manual - file_get_contents()</a>
大きな違いとしては、この場合では、オブジェクトストレージは複数のクライアントから同時に読むことができますが、ブロックストレージは共有可能なファイルシステム(ex. OCFS2)等、特殊な構成でない限り、複数のクライアントからの同時読み込みはできない、ということです。

このことから、オブジェクトストレージは主に、複数のクライアントからドキュメントなどの共有リソースを読むのに最適な分散ストレージであり、ブロックストレージは仮想マシンのディスクイメージなど排他アクセスが必要なケースで利用される、と考えてよいかと思います。

<H2>で、使えんの？</H2>
そもそもなぜ分散するか？ですが、これはストレージが壊れた時等の可用性の向上のためにに分散をかけます。
たいていの分散ファイルシステムはデータノードが1台故障しただけではデータロストや不整合は起きないように設計されています。
また、複数ノードで全く同じ数のファイルを持つことは、リソースの無駄になってしまいます。
そのため、ある一定の単位で複数ノードにコピーを置きながら、可用性を高めるような設計になっています。この点ではオブジェクトストレージもブロックストレージも共通しています。
一番の弱点はそれがネットワークを介して制御されていることです。

現在のコンピュータネットワークは早くなったものの、まだ、内部Busの速度に比べてはるかに遅いです。
※しかし、Diskのインターフェイスの速度には近づきつつある。

下記は物理Diskと分散ストレージ(Sheepdog 4Node)のIOPSを比較したものです。構成はすべて1HDD(SAS Disk)しか使っていません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/148297/f5df77b1-c352-bc2b-9bdf-be8885428be5.png)

Sheepdog 1プロセス時のシーケンシャルリードの値が悪いですが、プロセスを多重化するとIOPSレベルでは物理Diskとほぼ同一、場合によっては物理ディスクを抜くパフォーマンスが出ていることが確認できます。（特にRandom Read/Writeのパフォーマンスが物理を抜いている傾向にある)
※さらに未チューニングであるため、チューニングの内容によってはこれ以上のパフォーマンスが期待できます。

このことから、分散ストレージはネットワークを使う分、物理ディスクよりもパフォーマンスが落ちることも想定はされますが、昨今のネットワーク性能を鑑みると、データベース等のよほど高IOPSが求められる環境でないかぎりは十分に実用に耐えうるものではないかと推測されます。

<H3>っていうことでまとめ。</H3>
今回は分散ストレージの概略から特徴、ブロックストレージだけにはなりますが、物理ディスクとのIOPSの比較をご紹介いたしました。
分散ストレージはノードが増えればその分パフォーマンスが上がり、可用性の向上にもつながるスケールアウト型のシステムであるので少しでも興味を持っていただき、より障害に強い、運用のしやすいシステムの構築のきっかけになればと思います。

さて、明日のAdvent Calendarは@hirotsumさんの「新卒エンジニアさんの成長を見守った記録」とのことです！お楽しみに！！
SSL証明書の有効期限チェック

[BRIGHT VIE Advent Calendar 2017 - Qiita](https://qiita.com/advent-calendar/2017/brightvie) の7日目です！

アドベントカレンダーも1週間目！
今のところ走り続けれていますが、執筆が続いているためそろそろバテてきており...
今日は軽めな感じで。。。

# はじめに

弊社でもパブリックな証明書やプライベート証明書など様々なタイプのSSL証明書を利用しているのですが、
組織としてきちんと動き出す以前は、SSLの証明書チェックが無かったり、
運用中にもかかわらず有効期限切らせてしまったりといったことが結構起きている状況でした;;


最近では、Let's Encryptなども利用しており、cronで更新処理を組み込んだりしてりおけば安心ですが、
念のため自動更新の場合でも正常に更新がされているのか、
手動の場合には更新し忘れがないかをチェックしたいといった場合はあるかと思います。

# 簡易的なチェック方法

弊社で利用している簡易的な有効期限のチェックはJenkinsさんが頑張ってくれています。
（実行環境は、 Amazon Linux AMIで、サーバのタイムゾーンがJST）

```
# 対象のドメインの有効期限を取得(GMT)
## (2018/03/11 EXPIREとなっていたのをEXPIREDに修正)
EXPIRED=`openssl s_client -connect 対象ドメイン:443 < /dev/null 2> /dev/null | openssl x509 -text | grep "Not After" | awk -F ' : ' '{print $2}'`

# 有効期限をUnixTimestamp形式で取得する(GMT)
EXPIRED_UNIXTIME=`date '+%s' -d "\`echo $EXPIRED\`"`

# 取得した有効期限はGMTであるため、日本標準時間のJSTに変更する
EXPIRED_UNIXTIME=`expr $EXPIRED_UNIXTIME - 32400`

# あと何日かを取得するために現在の時間をUnixTimestamp形式で取得する
NOW_UNIXTIME=`date "+%s"`

# 有効期限から今の時間を引くことで、残り時間をUnixTimestmap形式で計算する
DIFF_SECOND=`expr $EXPIRED_UNIXTIME - $NOW_UNIXTIME`

# 1日は、60秒*60分*24時間=86400秒
ONE_DAY_SECOND=86400

# 残り日数を取得する
DAYS=`expr $DIFF_SECOND / $ONE_DAY_SECOND`

# 残りの有効期限を表示
echo "残り有効期限は、${DAYS}日です。"
```


新しいドメインの発行と証明書を発行した際にドメインリストに登録してしまえば、
自動チェックの対象になるので何かと便利。

## 通知設定

また、有効期限が近づくと下記のようにSlackに通知するようにしたりしています。

<img width="493" alt="Slack_SSLの有効期限チェック.png" src="https://qiita-image-store.s3.amazonaws.com/0/17346/85a02923-2f3b-75cb-c338-cd369a21a580.png">

これで、自動更新がうまく動いていなかった場合も検知できますし、
手動で更新しなければいけない部分にも漏れなく対応ができますね！
（ただし、DNSに設定時にチェック対象のリストに登録していれば...）

# まとめ

簡単でしたが現状では上記で十分ですが、今後対象ドメイン数が増えてきたときに登録し忘れなどが起きるような気もしており...
このあたり、DNSから自動で取得してチェックを入れるような仕組みにしているほうが本当はもっと安心なんでしょうね。

時期を見てこのあたりもしっかり整備していければと思っております。
go-diff-imageが便利なので紹介

UIテストを作るとき、Seleniumなどを使ってブラウザを操作するかと思います。
UIが変わっていないことを担保するためには画面のスクリーンショット画像を作り、差分がないことを確認するほか、それを可視化することが必要になるでしょう。

では、その画像差分をどうやって取ってますでしょうか？
たとえば、ImageMagickを使う方法があります。
参考: http://blog.mirakui.com/entry/20110326/1301111196

ただ、リンク先の画像を見れば分かる通り、差分が出た箇所しかハイライトできないので、大きなUIの一部だけちょっと変わった！といったケースだと差分が分かりにくい場合があると思います。
また、OS X向けにhomebrewでImageMagickをインストールするのはビルド時間が長くてしんどいなどの問題もあるでしょう。

そういった場合に、go-diff-imageはとても便利です。

# go-diff-imageの特徴

go-diff-imageには1つの便利な特徴があります
まずはREADMEのExampleを見ましょう: https://github.com/murooka/go-diff-image#example

見ましたね？
気づきましたでしょうか。

そう。ピクセルの列単位でdiffが出ているのです！
ImageMagickの`composite -compose`とは違い、差分のある列があればそこがまるっとdiffとして検出されます。

縦スクロールのブラウザに合わせて縦方向に変更されることの多いWebUIのdiffを取るには相性が良いのではないでしょうか。
要素の追加、削除などがわかりやすいかと思います。

# インストール

あなたとgo-diff-image、いますぐ`go get`!
そう。ImageMagickのように長すぎるビルド時間に悩まされる必要はないのです！

```
go get -u github.com/murooka/go-diff-image/...
```

はい！使えるー！もう使えるー！！いえーい！！！！

# まとめ

ちょっとした違いですが、こういったツールもありますという紹介でした。

できたばかりのリポジトリで機能も少ないのでコントリビュートチャンスもありそうです！
実装も素朴でコンパクトで、処理も追いやすいと思います。

ぜひ実用してみて、困ったらissueを立てるなりpull-reqしてみるなり、してみると良いのではないでしょうか？

repository: https://github.com/murooka/go-diff-image
nuxt.jsのlayoutsがとても便利

これは[Vue.js #3 Advent Calendar 2017 – Qiita](https://qiita.com/advent-calendar/2017/vue3) 7日目の記事です。

今回、業務システムをNuxt.jsで実装しました。
使っていて、layoutが以外と便利だなと感じたのであーだこー書ければなと


[Nuxt.js](https://nuxtjs.org/)
Nuxt.jsの便利なところはめんどくさい設定をしといてくれています。

- vue-router
- vuex
- middleware
- サーバーサイドレンダリングなど

今回業務システムなのでサーバーサイドレンダリングをする必要はなかったのでspamodeで開発していました。

nuxt.conf.js

```js

module.exports = {
  mode: 'spa',

```

## ページの作成

公式のとおり、ページの作成は`/pages`直下にファイルを作成するだけでページが生成されます

```
-pages
  -home.vue
```
/home

## 基本レイアウト

layoutがとても便利
共通のヘッダーやサイドバーをどう構成しようか毎回悩むのですが、
Nuxt.jsは `/layouts` でレイアウト用のファイルが作成でき、ページ毎に設定できる

home.vue

```js

export default {
  layout: 'default',
```

layouts/default.vue

```js
<template>
  <div class="wrapper">
    <sidebar-components class="is-desktop" :sidebarItem="sidebarItem" :isCollapse="isCollapse"></sidebar-components>
    <transition name="transition-fade">
      <div class="mobile-back" @click="showBack" v-show="backSlide"></div>
    </transition>
    <transition name="transition-slide">
      <sidebar-components class="is-mobile" :sidebarItem="sidebarItem" v-show="showSidebar"></sidebar-components>
    </transition>
    <section class="container">
      <common-header @clickSidebar="clickSidebar" @clickNav="clickNav" :isCollapse="isCollapse"></common-header>
      <div class="page-contents">
        <div class="page">
          <nuxt></nuxt>
        </div>
      </div>
    </section> 
  </div>
</template>
```

`<nuxt></nuxt>` にlayoutを設定したpagesが表示されます
今回はヘッダーとサイドバーもコンポーネントにわけ、レイアウトを構成していました。


## ページ毎にレイアウトを変更

ヘッダーはそのままでサイドバーの項目だけページ毎に変えたいときも1つのレイアウトcomponentでまかなえました

home.vue

```js
export default {
  fetch ({ store }) {
    return store.commit('toggleLayout', 'sidebar1')
  },
  layout: 'default',

```

store/mutaition.js

```js
export default {
  toggleLayout (state, value) {
    state.layout = value
  },

```


fetchのタイミングでStoreで、どのサイドバーを表示するかを切り替えます

layouts/default.vue

```
  computed: {
    ...mapState([
      'layout',
      'loginUser'
    ]),
    sidebarItem () {
      if (this.layout === 'sidebar1') {
        return [{ id: 1, name: 'メニュー1' }, { id: 2, name: 'メニュー2' }]
      } else if (this.layout === 'sidebar2') {
        return [{ id: 3, name: 'メニュー3' }, { id: 4, name: 'メニュー4' }]
      }
    }
  },

```

サイドバーコンポーネントもpropsで渡すデータを変更するだけで項目が変更できるように作れば、
1つのSidebarComponents.vueでまかなえちゃいます！

## Middleware

middlewearは公式では`nuxt.conf.js`か各ページコンポーネントで設定すると書かれていましたが、レイアウトでも設定することができたので、今回レイアウトで設定しました

- 全体に設定するのは違う(loginページではmiddlewearいらない)
- 各コンポーネントに設定するのもなんか違う
- `default.vue`はログイン後のレイアウトになるのココに設定しちゃおう
みたいな感じで笑

layouts/default.vue

```js
export default {
  middleware: ['fetch-user', 'check-auth'],
```
2つ設定することもでき非常に便利でした


---

Nuxt.jsを使いはじめて半年以上経ちますが、初心者にとってはめんどくさい設定がなく、使いやすかったです。(テストの設定はかなりハマりました)

他にも良い使い方や便利なこともたくさんあると思います
初めてつかった頃にlayoutがあるのがすごくやりやすい！と感じたので今回、簡単ですがこの内容で書かせて頂きました！


明日は、、、
kuwanaさんです！
開発合宿を行う際の知見まとめ

みなさんは今年、開発合宿行きましたか？
私は今年2回、開発合宿に行きました。
幹事も担当し、開発合宿で学んだことや注意した方がいいことをまとめてみます。
開発合宿行く前に見ていただけたら、幸いです。

## 幹事の事前準備について
幹事が事前にやることは、大きくわけて以下の7つです。

- 宿決め
- 日程決め
- 宿予約
- 交通手段予約
- タイムスケジュール決め
- 開発合宿のテーマ決め
- 旅のしおり作成

宿を一番最初に決めると、開発合宿やるぞ～という気分になるので最初にやるのがおすすめです。


## 宿決めについて

いろいろな宿がありますが、どういう開発合宿にしたいのか(開発に集中したいのか・旅行も楽しみたいのか)などによって適した宿は変わってきます。
初めていくところで失敗してしまうのも残念なので、開発合宿にいってきたブログを参考にすると良いと思います。
結構大事なのが移動時間で、移動時間が長いと開発に集中できる時間が減ってしまうため移動時間を考慮したほがいいです。


探してよく出てきた宿と、その宿で開発合宿を行ったブログです。
ぜひ参考にしてください。

- 土善旅館
	- https://qiita.com/gotou015/items/40081f33b68f616491b8
- 山喜旅館
	- https://developers.cyberagent.co.jp/blog/archives/2055/
- おんやど恵
	- https://kawlu.com/journal/6164-2/
- まるも
	- https://www.wantedly.com/companies/kitchhike/post_articles/48295
- マホロバマインズ三浦
	- https://goodpatch.com/blog/gpdevcamp-vol-1/

私は今年、土善旅館とおんやど恵に行きました。
どちらも、電源タップやwifiなどの開発の環境が整っていてよかったです。
きれいさ・東京からの近さを求めるならおんやど恵で、ほどよい田舎感・猫をもとめるなら土善旅館がいいと思います。
猫はひとなつっこくてかわいいです。
ちなみに、土善旅館は東京駅から送迎バスが来てくれるバス停まで約2時間、おんやど恵は品川駅から踊り子で宿最寄りの湯河原駅まで約1時間です。

## 日程について
泊数については、1泊2日か2泊3日にするか結構迷いますよね。
1泊2日だと、往復の移動時間も考えると、開発時間が5〜8時間ほどしかとれない可能性もあります。(徹夜は別)
がっつり開発したい場合は、2泊3日がよいかもしれません。

開発合宿は、楽しいのですが結構疲れます。
私は月曜・火曜で開発合宿に行ってきたのですが次の日から体調を悪くしてしまう人もいたので、日程は週の後半のほうがよいと思います。

## 近くのコンビニを把握しておく
開発合宿におやつは必須ですよね。お酒も。
宿の近くにコンビニがないことが多いので、事前に準備したほうがよいです。
あとで買えると思ってたら、意外と遠くて行くのがめんどくさくなってしまいます。

## やりたいことは先に決めてもらう＆開発の準備をしてきてもらう
これはかなり大事だなと思いました。
開発合宿における開発時間は、長いようで短いです。
やりたいことを決める時間はないです。
せっかく開発合宿に行くのであれば、事前にやりたいことを決めて開発の準備をしてきましょう。

## 成果発表を設ける
これもかなり大事だと思いました。
せっかく開発合宿を行くので、1人5分とかでいいので成果発表する時間を設けたほうがいいです。
成果発表があると、そこまでに開発しきろうというやる気が出てきます。
また、他の人がどういうことをやっていたかを知る機会にもなりとてもよいです。

## 昼ごはんについて
なぜかこういうときに限って定休日のお店を選んだり、行ってみたら営業時間が過ぎてしまっていることがよくあります。
定休日と営業時間はしっかり把握しましょう。

## 宿についている設備確認
宿にどういう設備がついているかはHPなどでチェックしましょう。
リンスインシャンプーではなくコンディショナーがついているなどは、地味に大事です。
宿によっては、タオルや歯ブラシなどのアメニティが別料金のところもあるので要チェックです。
当日忘れ物に気づいたとしても、大丈夫です。
上記に挙げたものはコンビニにいけばだいたいなんとかなります。

## ハプニングを楽しむ気持ち
合宿中、お店が定休日だったりコンビニが遠かったりいろいろなハプニングに出くわします。
何かしら予期しないことは起こると考えて、ハプニングを楽しむ気持ちをもっておきましょう。

# 終わりに
開発合宿で学んだことについてまとめてみました。
企画する方や、参加する方の参考になれば幸いです。
開発合宿慣れしてる方、ほかに知見あったらぜひ共有していただきたいです。
WebKit ViewでURLを取得する

ちょっと手間取ったのでメモ

WKNavigationDelegateとKOVを使った例をそれぞれ紹介します。

# 開発環境
・Xcode9
・Swift4

# 実装(WKNavigationDelegate)
```swift
import UIKit
import WebKit // Webkitを読み込む

// WKNavigationDelegateを追加
class ViewController: UIViewController, WKNavigationDelegate {

    @IBOutlet weak var webView: WKWebView!

    let homeUrl = "https://qiita.com/trend"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        openUrl(urlString: homeUrl)
        // webViewにデリゲートを設定
        webView.navigationDelegate = self

    }
    
    func openUrl(urlString: String){
        let url = URL(string: urlString)
        let urlRequest = URLRequest(url: url!)
        webView.load(urlRequest)
    }
    
    // ページが表示されたら下記の関数を実行
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        let activeUrl: URL? = self.webView.url
        let url = activeUrl?.absoluteString
        
        // 特定のURLで分岐処理
        if url! == "https://qiita.com/trend" {
            print(url!)
        }       
    }
   
}
```
didFinish関数はアプリを立ち上げた時に一回だけ呼ばれます。
毎回ページURLを判定して何か処理を行いたい時はKOVを使います。

# 実装(KOV)
```swift
import UIKit
import WebKit // Webkitを読み込む

class ViewController: UIViewController {

    @IBOutlet weak var webView: WKWebView!

    let homeUrl = "https://qiita.com/trend"

    override func viewDidLoad() {
        super.viewDidLoad()

        // オブサーバーの設定
        self.webView?.addObserver(self, forKeyPath:"URL", options:.new, context:nil)
        openUrl(urlString: homeUrl)
    }

    func openUrl(urlString: String){
        let url = URL(string: urlString)
        let urlRequest = URLRequest(url: url!)
        webView.load(urlRequest)
    }

    deinit {
        self.webView?.removeObserver(self, forKeyPath: "URL")
    }

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        switch keyPath {
            case "URL"?:
                if let url = change![NSKeyValueChangeKey.newKey] as? URL {
                    let urlString: String = url.absoluteString
                    // ページアクセスするたびにURLを取得
                    print(url)
                    
                }
            
        default:
            break
        
        }
    
    }


}
```

## 参考サイト
[WKWebView リファレンス](https://developer.apple.com/documentation/webkit/wkwebview)
[mixi-inc/iOSTraining](https://github.com/mixi-inc/iOSTraining/blob/master/Swift/pages/day3/4-3_WKWebView.md)
[[Swift4]Webkit View(WKWebView)の使い方](https://ponvire.com/2017/10/13/swift4webkit-viewwkwebview%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9/)
[SwiftでWKWebViewとKey-Value Observingを使ってWebページの読込み状況を取得する](https://qiita.com/sl2/items/83fc71e083fba2c7220c)
[SwiftでKVO(Key-Value Observing)を行う]
(https://qiita.com/Kei-Kamikawa/items/9d6d661bff2d15ceac51)
こんなfont-familyの指定順は嫌だ

## 僕はこんなfont-familyが嫌だ

僕は、を強調しているのは本当にどうしようもなく個人の気持ちだから。
ある意味宗教戦争みたいな内容なので仕方ないものの、どの文でも「一概には言えませんが〜」と書くのも歯切れが良くありません。
というわけで、この記事の文章は自分の気持ちが全ての基準です。

## 欧文より和文が先に指定されている

```css:例
font-family: メイリオ, "Hiragino Kaku Gothic Pro", Meiryo, "ヒラギノ角ゴ Pro W3", "MS PGothic", "MS UI Gothic", Helvetica, Arial, sans-serif;
```

相当有名なサイトからそのままコピペしてきました。
「僕は嫌です」と宣言しているので流石に名前は伏せます。

### 上記の指定だと何が起こるか

**欧文がHelveticaではなく和文の従属欧文で描画されます**
なぜなら和文フォントの中に英数字があるからです。

### 解説

文字にフォントが適用されるステップは以下のようなイメージです。

`font-family内の先頭のフォントを認識する` → `そのフォントを使って文字が描画出来ればOK` → `出来なければ次のフォントで文字の描画を試みる`

和文を先に指定していると和文中の英数字で描画出来てしまい、欧文フォントは画面に登場しません。

ですから欧文を先に指定するべきです。

ちなみにこのサイトの海外向けバージョンを調べたら、英語に翻訳された同じスタイルのサイトではなくて完全に別物が現れました。
つまり、海外ユーザー向けの施策というでもないのでしょう。
（海外ユーザー→ローカルに和文フォントが入っていない→和文指定が先でも欧文フォントで描画される）

## Helveticaより先にArialが指定されている

```css:例
font-family: Arial, Helvetica, sans-serif;
```

という指定も見かけました。

### 上記の指定だと何が起こるか

**HelveticaではなくArialが画面に描画されます**

### 解説

仕組みは前の節で書いたのと同様です。

歴史を紐解くと、ArialはHelveticaに「似るために」生まれたフォント。
そしてWindowsにもMacにも標準搭載されているフォント。

Helveticaが表示できるMacユーザーに大して、あえて「Helveticaに似せたフォント」であるArialを表示させる指定をしている訳です。

（ArialとHelveticaの話は相当長くなりますので、[タイプフェイスデザイナー大曲都市さんのブログ記事へのリンク](http://tosche.net/2012/09/arial_j.html)を貼ります。詳しく知りたい方はこちらをどうぞ。）

## ヒラギノ角ゴシックより先にメイリオ指定されている

```css:例
font-family: "Meiryo","Hiragino Kaku Gothic ProN","MS PGothic",sans-serif;
```

これも相当有名なサイトからそのままコピペしてきました。
「僕は嫌です」と宣言しているので流石に名前は伏せます。

### 上記の指定だと何が起こるか

**Officeソフトを入れてるMacユーザーにはヒラギノ角ゴシックではなくメイリオで描画されます。**
（嫌すぎて、僕は普段メイリオの使用を停止しています。）

### 解説

仕組みは前の節で書いたのと同様です。

ヒラギノが先なら先で「Windowsユーザーの画面に、あのヒンティングで表示されるヒラギノ角ゴシックが不憫」と思った方もいるかもしれません。
しかしそれでもメイリオよりは美しいと思います。

## 終わりに

和文の順番は美学や宗教っぽい問題ですが、欧文を和文の後に指定するのはただただ無駄です。
どこかからコピペしただけのfont-familyはやめましょう。
Mentimeterの回答一覧をブックマークレットでまとめる


[Mentimeter](https://www.mentimeter.com/)（Question typeが"Open Ended"の質問）で集めた回答リストをまとめるためのブックマークレットを作りました．
Mentimeterのhtml変更によってそのうち動かなくなる可能性はあります．
とりあえず回答数50程度で動作確認しています．（追記：111個でも動くこと確認しました．）

## 環境

* Chrome 61
* Firefox 57（たぶんセキュリティの問題でブックマークレットとしては動きませんでしたが，Webインスペクタのコンソールに直接貼ると動作しました）

## コード

```javascript
javascript:
var ans = document.getElementsByClassName('one-by-one__item');
var ansText='';
[].forEach.call(ans, function(e) {
  ansText += e.textContent.trim();
  ansText += '\n----\n';
});
var onebyoneWrapperDiv = document.getElementsByClassName('one-by-one__wrapper')[0];
var textbox = document.createElement('textarea');
textbox.setAttribute('rows', '10');
textbox.setAttribute('cols', '200');
textbox.textContent = ansText;
onebyoneWrapperDiv.insertBefore(textbox, null);
```

## 使い方

* 上のコードを全部1行に繋げて，それをURLとしてブックマークに登録します．

繋げたコード

```javascript
javascript: var ans = document.getElementsByClassName('one-by-one__item'); var ansText=''; [].forEach.call(ans, function(e) { ansText += e.textContent.trim(); ansText += '\n----\n'; }); var onebyoneWrapperDiv = document.getElementsByClassName('one-by-one__wrapper')[0]; var textbox = document.createElement('textarea'); textbox.setAttribute('rows', '10'); textbox.setAttribute('cols', '200'); textbox.textContent = ansText; onebyoneWrapperDiv.insertBefore(textbox, null);
```

* Result layoutを"One by one"にして"▶Present"を押してプレゼンテーションモードにします
* 登録したブックマークを開きます
* こんな感じ↓にテキストエリアが現れて，全回答が連結されたテキストが取得できます

![menti-matome.png](https://qiita-image-store.s3.amazonaws.com/0/35592/677b663e-d360-c046-ee01-41ba94820248.png "menti-matome.png")

* プレゼンテーションモードにしなくてもテキストエリアは出現しますが，プレゼンテーションモードにしないとテキストエリアの内容がコピーできません
MacでPython環境構築頑張ったのにIDLE起動したらWARNINGが表示されたから、これも頑張って表示しなくさせたはなし

#MacでPython環境構築頑張ったのに、IDLE起動したらWARNINGが表示されたから、これも頑張って表示させなくしたはなし
---
######環境
iMac2013　OS X Yosemite 10.10.5　（古い）
---
【警告内容】
WARNING: The version of Tcl/Tk (8.5.9) in use may be unstable.
Visit http://www.python.org/download/mac/tcltk/ for current information.

![スクリーンショット 2017-12-05 23.03.07.png](https://qiita-image-store.s3.amazonaws.com/0/182799/cbe57635-d9e6-834c-a8af-9668cfd72236.png)



とりあえず翻訳![2017-12-06_18h51_50.png](https://qiita-image-store.s3.amazonaws.com/0/182799/60cf3972-bcb7-a4a8-019a-f13e5e870c23.png)

######警告文にあるURL先に遷移
![スクリーンショット 2017-12-07 20.51.50.png](https://qiita-image-store.s3.amazonaws.com/0/182799/847d5fbb-f0a0-f19d-9ffd-13d495c2c42d.png)


そもそもpython3.0以上を使いたいから、OSのアプでが必要
今話題(投稿当時)のos x high sierraにアプで![Image uploaded from iOS.jpg](https://qiita-image-store.s3.amazonaws.com/0/182799/423776de-a421-ec76-90f9-e521db21d0cc.jpeg)
ここまで2時間...
インストール出来たので、つづき

######「ActiveTcl 8.5.18.0」をインストール


リンクをクリック
![スクリーンショット 2017-12-07 20.56.27.png](https://qiita-image-store.s3.amazonaws.com/0/182799/d397a542-a962-9d03-390e-5b5921c8d1e4.png)

ActiveStateのページに遷移される
![スクリーンショット 2017-12-07 20.57.32.png](https://qiita-image-store.s3.amazonaws.com/0/182799/6b67466e-c51c-12ce-7be2-f3c9e149dda0.png)

インストーラーをダウンロード
![スクリーンショット 2017-12-07 20.58.49.png](https://qiita-image-store.s3.amazonaws.com/0/182799/e81139c0-7a3c-1cd9-dba6-e79d039dd95d.png)

起動
![スクリーンショット 2017-12-07 22.14.46.png](https://qiita-image-store.s3.amazonaws.com/0/182799/ca5fef55-5f0e-d25a-4c80-c4d98eb5b9b2.png)

![スクリーンショット 2017-12-07 22.10.33.png](https://qiita-image-store.s3.amazonaws.com/0/182799/07dc7019-635b-6c75-c3aa-9dce77424223.png)

######Pythonをインストールし直さなくてはいけないみたいなので
再度インストール
IDLE起動
消えた
![スクリーンショット 2017-12-07 22.14.31.png](https://qiita-image-store.s3.amazonaws.com/0/182799/532707dc-05de-b4bb-0158-f9b673cd3062.png)
Window function の lag関数で発生したエラーとその回避策

# やりたいこと
あるログデータについて取得時間順に並べた場合、各レコードについて自身のレコードの一つ前のログデータの時間をを取得し、それを一つ前のログデータ取得時間用カラムへ登録したい。

具体的には、以下のテーブル(1)を(2)のように更新したい。

```sql
-- ログテーブル構成(最小限のカラムのみ)
create table example (
  col_dt     datetime not null,     -- ログ取得時間
  col_dt_prev datetime default null -- ひとつ前のログ取得時間
)
;

insert into example (col_dt) values 
('2017-12-01 12:00:00'), 
('2017-12-01 14:00:00'), 
('2017-12-01 15:00:00'), 
('2017-12-01 17:00:00')
;

-- col_dt, dol_dt_prevはdatetime型
-- (1) 

|---------------------+-------------+
| col_dt              | col_dt_prev |
|---------------------+-------------+
| 2017-12-01 12:00:00 | NULL        |
| 2017-12-01 14:00:00 | NULL        |
| 2017-12-01 15:00:00 | NULL        |
| 2017-12-01 17:00:00 | NULL        |
~---------------------+-------------+

-- (2)
+---------------------+---------------------+
| col_dt              | col_dt_prev         |
+---------------------+---------------------+
| 2017-12-01 12:00:00 | NULL                |
| 2017-12-01 14:00:00 | 2017-12-01 12:00:00 |
| 2017-12-01 15:00:00 | 2017-12-01 14:00:00 |
| 2017-12-01 17:00:00 | 2017-12-01 15:00:00 |
+---------------------+---------------------+
```

# 環境

| 環境要素 | バージョンなど |
|:----:|-----------|
| DBMS | MariaDB 10.2.6 |

# 発生した事象

まず、問題なく求めていた結果が得られるかの確認のためSELECT文では、正しい結果が得られました。

```sql
-- SELECTで結果を確認
select
  col_dt
 ,lag(col_dt) over (order by col_dt) as col_dt_prev
from example
;

+---------------------+---------------------+
| col_dt              | col_dt_prev         |
+---------------------+---------------------+
| 2017-12-01 12:00:00 | NULL                |
| 2017-12-01 14:00:00 | 2017-12-01 12:00:00 |
| 2017-12-01 15:00:00 | 2017-12-01 14:00:00 |
| 2017-12-01 17:00:00 | 2017-12-01 15:00:00 |
+---------------------+---------------------+

```

しかし、テーブルを更新しようと同じ条件でアップデート文を実行したところ、以下のエラーが発生

```sql
-- UPDATEで更新
update example ex, (
	select
		 col_dt
		,lag(col_dt) over (order by col_dt) as col_dt_prev
	from example
) it
set ex.col_dt_prev = it.col_dt_prev
where ex.col_dt = it.col_dt
;
```

実行結果

```
ERROR 1292 (22007): Incorrect datetime value: '' for column 'col_dt_prev' at row 1
```

insert文でも同様のエラーが発生する。

分かったことをまとめると、
 
 - select文だけではエラーが発生しない。
 - update文, insert文とselect文を併用した場合にlag関数でエラーが発生する。

# 回避策 
一度、Unix Timestampへ変換してから、lag関数を適用して、再度datetime型へ戻す。以下がそのSQLです。

```sql
-- UPDATEで更新
update example ex, (
    select
       col_dt
       -- datetime -> unix timestamp -> datetime
      ,from_unixtime(lag(unix_timestamp(col_dt)) over (order by col_dt)) as col_dt_prev
    from example
) it
set ex.col_dt_prev = it.col_dt_prev
where ex.col_dt = it.col_dt
;
```

原因は不明で根本的な解決策ではありませんが、上記の対応でエラーが発生しなくなりました。

**(2017/12/15 追記)**
コメントでアドバイスをいただきました。
mariadbのバージョン 10.2.11　では発生しませんでしたので、そちらへバージョンアップを行えば解決します。
Node.jsでElixir/PhoenixのChannelに接続する


Phoenix ChannelにNode.jsからアクセスしてみます。

**[岩手県立大学アドベントカレンダー](https://qiita.com/advent-calendar/2017/ipu)に差し込みました**

![](https://i.gyazo.com/59d6e8d9e9ead22e6bb83d80afc77619.gif)

画面左がPhoenix Channelで作っているチャット、右側のターミナルがNode.jsのプロセスです。

## Phoenix ChannelのNode.js Client

[phoenix-channels](https://www.npmjs.com/package/phoenix-channels)を使いました。

```
npm i --save phoenix-channels
```

```app.js
'use strict';

const { Socket } = require('phoenix-channels')
const socket = new Socket("ws://localhost:4000/socket");
socket.connect();
const channel = socket.channel("chat:lobby", {});

channel.join()
    .receive('ok', resp => console.log(`> joining channel  ${channel.topic}`))
    .receive("error", reason => console.log(`Error joining channel:`, reason));

channel.on("new_msg", msg => console.log(msg));

channel.onError(e => console.log("something went wrong", e))
```

これだけで接続できます。
簡単。

## ハマってたところ

ここまでいくのに割とハマったのが

```js
const socket = new Socket("ws://localhost:4000/socket");
```

とするところを

```js
const socket = new Socket("ws://localhost:4000");
```

と指定していたのが問題でした。

```
[debug] ** (Phoenix.Router.NoRouteError) no route found for GET /websocket (DemoWeb.Router)
```

などのログがでてるけどさっぱりでした汗

* [elixir-phoenix-websocket-error](https://stackoverflow.com/questions/39392847/elixir-phoenix-websocket-error)
* [Websocket Clients and Phoenix Channels](http://graemehill.ca/websocket-clients-and-phoenix-channels/)

この辺を見ると`endpoint.ex`の

```ex
socket "/socket", MyAppWeb.UserSocket
```

の記述がWebSocketのパスを指定してる箇所だとわかります。
CounterCulture を途中から導入した時に counter を同期する


CounterCulture: [magnusvk/counter\_culture: Turbo\-charged counter caches for your Rails app\.](https://github.com/magnusvk/counter_culture)

Rails の counter cache を設定しても現在のレコード数で初期化はされない。

もしプロダクトの途中で実装に入れるときは counter_culture の [`counter_culture_fix_counts`](https://github.com/magnusvk/counter_culture#manually-populating-counter-cache-values) メソッドを使って修正する。


```rb:lib/tasks/batch.rake
namespace :batch do
  desc "Fetch Counter cache"
  task :fix_counts => :environment do
    User.counter_culture_fix_counts
    Product.counter_culture_fix_counts
    Project.counter_culture_fix_counts
  end
end
```

呼び出し元は子要素側なので注意