OmniAICreator/Qiita-1.07M huggingface dataset:
Kubernetes入門ハンズオン-WordPressを立ててみよう-

Kubernetesハンズオンを私の所属する研究室で行いました。

我ながら入門者にはとっつきやすい資料ができた気がしたので、Qiitaにも軽く解説を交えつつ貼っておこうと思います。

# スライド
[初心者による初心者のためのKubernetesハンズオン // Speaker Deck](https://speakerdeck.com/uutarou10/chu-xin-zhe-niyoruchu-xin-zhe-falsetamefalsekuberneteshanzuon)

# このハンズオンの対象者
- Kubernetesを始めたばかり or 始めてみたいひと
- 他の解説記事で`kubectl run ...`とかやって一通り試したけど、YMLどうやって書くのかわからなくて困っている人たち

# このハンズオンでやらないこと
- Clusterの構築手順
    - スライドの最後の方で軽く触れていますが、minikubeを使うのが個人的にはおすすめです。
    - [Install Minikube | Kubernetes](https://kubernetes.io/docs/tasks/tools/install-minikube/) ここにインストール手順が書いています。遅めの回線でも10分ちょっとあれば終わると思います。
- 永続化
    - こちらもスライドの最後の方とサンプルのマニフェストでは触れていますが、詳しくは触れていません

# 解説
ハンズオンでは別の人が、　k8sを構成する概念については説明してくれていた状態だったので、このQiita記事では主にスライド上に登場する概念を解説します。スライド見ながらわからない概念がでてきたらちょくちょく参照してみてください。

私自身も初心者なので、誤りがあればコメント等で知らせていただけると幸いです。

## `namespace`
namespaceという名前の通り、名前空間を切るためのリソース。(k8sでは、「リソース」を組み合わせてアプリケーションを構築していく)

他にも、namespaceごとに権限を付与したり、ということもできる。

## `Deployment`/`ReplicaSet`
Deploymentは自体はReplicaSetを持っているだけのリソースである。

ReplicaSetはPod(あとで解説するがとりあえずDockerのコンテナだと思っておけばいい)のレプリカ(複製)の数を管理するリソースで`3`とか指定しておくと、常にPodの数を3つに保ってくれる。(Nodeの電源喪失やその他の原因でPodが死んだときには自動でReplicaSetで指定した数にPodがなるようにしてくれる)

では、なぜReplicaSetを持っているだけのDeploymentというリソースが存在するのかというと、世代管理を行う為である。

バージョンアップなどで新しいReplicaSetに変更したときに、Deploymentは徐々に古いPodの数を減らして、新しいPodを配備するということを行ってくれる。(ローリングアップデート)

この恩恵にあずかるために、基本的にはDeploymentを作成することがほとんどのようです。

## `Pod`
Podはk8s上の最小単位。中には1つ以上のDockerコンテナを持っている。

Pod内ではネットワークが共有されるので複数のコンテナで同じポートを使ったりということはできない。

今回の例だとWordPressは本体のコンテナ+MySQLのコンテナを使うことでWordPressを立てる事ができるが、それらを一つのPodに押し込むのはアンチパターン。あくまでもPodは同時に起動していないといけないコンテナを束ねることに留めるのがよい。(というかそうでないとk8sの旨味を味わえない)

## `Service`
Podを束ねるロードバランサー。

今回の例だとこんなマニフェストを書いた。

```yml
apiVersion: v1
kind: Service
metadata:
  name: wordpress
spec:
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: wordpress
    role: web
```

この例でいくとこのServiceに対するアクセスを`app`ラベルの値が`wordpress`かつ`role`ラベルの値が`web`であるPodへ分散してフォワードするというような役割を担っている。

そして、もう一つServiceには大事な役割があって、これを作成すると`ClusterIP`というものがServiceに対して割り当てられる(ClusterIPはクラスタ内からアクセスすることができる仮想的なIPアドレス)のに加えてk8sクラスタ内で稼働しているDNSにService名が登録される。

この仕組みを使うことで他のPodからのアクセスを実現することができる　。今回で言えば、WordPress本体とMySQLの通信にあたる。

## `Ingress`
~~最初聞いた時、[ポケGoの祖先](https://www.ingress.com/)かと思った。~~

これは、HTTP層のロードバランサー。今回のハンズオンでは、特定のホストで立てたWordPressを公開する目的に使っている。

これは、HTTPを抽象化した概念で、実際の実装はClusterによって異なる。例えば、GKE(Google Kubernetes Engine)だとMaglevというのが実際には使われている。これはすごく高性能なロードバランサーらしい。(使ったことないので知らないけど)

HTTP層なので今回のように、Hostを見てアクセス先を変えるということが可能になるので、これを使ってWordPressを外部公開したというわけ。

---
いちおうこんな感じ。また何かあったら加筆するかも。
AWS Lambdaで他のディレクトリのpythonのclassをimportする

## AWS Lambdaでpython importする

```
my_prj
|
├── src
|    ├── lambda
|    |     └── lambda_function.py
|    ├── api
|    |     └── api.py
|
```


他のディレクトリのpythonのclassをimportする
` lambda_function.py `か らapi.pyをimport するためのコード


```python
import os
import sys
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/..')
from api.util_api import UtilApi


def lambda_handler(event, context):
    util_api = UtilApi()
    util_api.create_data()
```
[memo] VMWareTools install & フォルダ共有設定

## **事前準備**
### **gccインストールパスの確認**
```
$ which gcc
/usr/bin/gcc
```

### **カーネルヘッダの確認**
```
$ sudo uname -mr
3.10.0-693.el7.x86_64 x86_64

$ ls /lib/modules/3.10.0-693.el7.x86_64/build/include
ls: /lib/modules/3.10.0-693.el7.x86_64/build/include にアクセスできません: そのようなファイルやディレクトリはありません
```

見つからない場合は改めてインストールする

```
$ sudo yum install -y kernel-devel-3.10.0-693.el7.x86_64
```

## **VMWareTools instlal**
### **VMWareToolsパッケージのdownload**
[myVMWare](https://my.vmware.com/group/vmware/details?downloadGroup=VMTOOLS1020&productId=614)からダウンロードする。

### **VMWareToolsパッケージのマウント**
ダウンロードしたファイル(zip)を展開し、isoファイルを設定する。![WS0015.JPG](https://qiita-image-store.s3.amazonaws.com/0/43130/0efc2563-f12a-a7d2-9770-a41fc6740bd0.jpeg)

「VMWareToolsの再インストール」を選択する。
![WS0016.JPG](https://qiita-image-store.s3.amazonaws.com/0/43130/994bf257-75e0-864b-ac9f-65c0adc5c857.jpeg)

VMWare画面下に下記の様な表示がされる。
![WS0017.PNG](https://qiita-image-store.s3.amazonaws.com/0/43130/7eda43d5-ed0f-2023-7f61-df7f98653873.png)

CDROMドライブをマウントし、中のファイルを取り出す。

```
$ sudo mount /dev/cdrom /media
mount: /dev/sr0 is write-protected, mounting read-only

$ cd /media
$ cp VMwareTools-10.2.0-7259539.tar.gz /tmp/
$ cd /tmp
$ tar zxvf VMwareTools-10.2.0-7259539.tar.gz
```

### **VMWareTools install**
```
$ cd vmware-tools-distrib/
$ sudo ./vmware-install.pl
```

対話形式のインストーラなので度々入力を求められるが、基本的にはそのままエンターキーを押す（デフォルト入力値で進む）。

途中でgccパスを訊ねられた時、パスが実際のものと異なっていたら修正する。

```
Searching for GCC...
Detected GCC binary at "/bin/gcc".
The path "/bin/gcc" appears to be a valid path to the gcc binary.
Would you like to change it? [no] yes    ← ここで一度yes（パスを変更する）を入力する

INPUT: [yes]

What is the location of the gcc program on your machine? [/bin/gcc] /usr/bin/gcc    ← 事前に調べたパスを入力する

INPUT: [/usr/bin/gcc]

The path "/usr/bin/gcc" appears to be a valid path to the gcc binary.
Would you like to change it? [no] no    ← 最後にここでnoを入力する

INPUT: [no]
```

## **共有フォルダの登録**
**共有フォルダの追加はゲストOSをシャットダウンさせてから行うこと。**

「仮想マシン設定」から共有フォルダの追加を行う。
![WS0018.PNG](https://qiita-image-store.s3.amazonaws.com/0/43130/d7b63238-503b-4cfd-a290-cfb64af48f80.png)

共有したいホストPC上のパス、及び、LINUX上で見える名前を入力する。
![WS0019.PNG](https://qiita-image-store.s3.amazonaws.com/0/43130/f3e8cdac-cfc9-8e80-e02c-41b93b3be80a.png)

![WS0020.PNG](https://qiita-image-store.s3.amazonaws.com/0/43130/6c26ae67-f52b-98e4-668d-a85b9feccd98.png)

### **確認**
ゲストOSを起動させ、/mnt/hgfs 下に追加したフォルダがあるかを確認する。

```
$ ls /mnt/hgfs/
src
```


以上
Ruby on Rails Tutorialのメモ

Ruby on Rails Tutorialのメモ

4章が終わったので５章から。

##5章

＊code＊
<!--[if lt IE 9]>
＊mean＊
もし、Microsoft Internet Explorer (IE) のバージョンが9より小さい場合



<img width="677" alt="スクリーンショット 2018-02-20 11.45.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/148649/08fe1f7a-ff12-5ac7-0212-1d0455cf47fc.png">

assert_selectの使用例


##6章

rails test:???

???にはファイルの名前を記入する。
例＞　model integration  


<img width="718" alt="スクリーンショット 2018-02-20 17.16.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/148649/caec71b5-461e-7fca-858c-c97c1decf2eb.png">

＊自分自身を指す
　　______FILE_______
＊小文字にする
   downcase



##7章

*code*
if Rails.env.development?

デバッグ情報がRailsの3つのデフォルト環境のうち、開発環境 (development) だけで表示されるようになる。
つまり、本番のアプリケーションやテストでは表示されない。

Railsの３つのデフォルト機能
・テスト環境(test)
・開発環境(adevelopment)
・本番環境(production)

データベースの更新
attributes

英単語を複数形にして返してくれる
入力 => helper.pluralize(2, "woman")
出力 => "2 women"
コンソールに打つときはこのように入力すればOK

<%= pluralize(@user.errors.count, "error") %>
このコードは、"0 errors"、"1 error"、"2 errors" などのように、
エラーの数に応じて活用された単語を返します。


参考URL
https://railstutorial.jp/
AD2 > I2C > Re-Startという表記 > repeated start condition

```txt:動作環境
Windows 8.1 Pro (64bit) 
  - on VMware workstation 14 Pro, version:14.0.0 build-6661328
Analog Discovery 2 (以下AD2)
WaveForms 2015 v3.7.5
```

[Raspberry Pi > C > RPi_i2c_comm_180227: v0.4 > GPIOピンのレベル設定と、レベル読取まで](https://qiita.com/7of9/items/b925c943822deb7f9d01)
で実装中のI2C通信確認のため、AD2を使い始めている。

自前実装のI2C通信が失敗する（読取値が0xFFになる)ため、カンニングすることにした。

GitHubにあるPythonスクリプトで測定値の取得ができる。それのスクリプトで実行中のI2CのSCLとSDAをAD2で取得した。


![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/bf87c13b-fccf-c8e3-cc6d-83660d1b6369.png)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/99366e82-4d12-2b3d-c40f-710b124a4105.png)



Re-Startとは何か?

### 参考

https://www.i2c-bus.org/repeated-start-condition/

> Repeated Start Condition
...
 Instead of sending the stop condition it is also allowed to send another start condition again followed by an address

意訳「Stop条件を送らずに再度Start条件を送る」

### 備考

自前のI2C通信処理において、Stop条件のタイミングでStart条件を送信するとRe-startとしてAD2で測定できるようになった。


### ひっかかり

- データシートではRepeated Start conditionでなく、Stop conditionとインターバル後のStart conditionが記載されている
- 上図の波形を見てもStop conditionの15msec後にStart conditionに思われる
- 自前の実装でもStop conditionの15msec後にStart conditionで測定値が読めるようになった
PowerBI - Dynamics365の連携方法の注意点

PowerBIとDynamics365を連携するときは以下のURLを参考。
https://technet.microsoft.com/ja-jp/library/dn708055.aspx

この通り実施すれば連携できると思いきや、現時点(2018/3/2時点)では以下のメッセージが出力する。


「詳細 : "OData: フィードのメタデータ ドキュメントが無効である可能性があります。"」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/240857/f01c7cbb-f463-bc78-bd92-0bf3d9454977.png)


# 解決策
結構ハマりましたが、、なんとか解決できました。
どうやら現在は「Dynamics65(オンライン)バージョン9.0ODataエンドポイントと互換性がない」ようです。
以前までの8.2であれば動作可能であることを確認しました。
依って、以下のように変更して入力します。

「https://XXX.api.crm7.dynamics.com/api/data/v9.0/」
　　　　　↓
「https://XXX.api.crm7.dynamics.com/api/data/v8.2/」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/240857/7cb72ee2-3f98-2f92-3759-f06472b24a02.png)

繋がりました。あとは必要なテーブルをポチポチして出来上がり。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/240857/f3054a7e-3cf2-1fd5-6d78-a00cbde78ff4.png)

終わり。
Atom「Failed to activate the react package」の解消

# エラー発生
久々にAtomを起動したら以下のエラーが発生しました。

![atom_error_256.png](https://qiita-image-store.s3.amazonaws.com/0/132550/9ac3bc48-070d-cc5b-e83f-03845c7c8519.png)
[View Issues](https://github.com/orktes/atom-react/issues/256)

# 解消
reactを"0.18.0"へアップデートしろということなので、
「File」→「Settings」→「Updates」より、以下を選択する。
![atom_error_update_react_1.png](https://qiita-image-store.s3.amazonaws.com/0/132550/5e70d6df-00db-8136-dd86-12842a1f88d5.png)


「Restart」で解消！！
![atom_error_update_react_2.png](https://qiita-image-store.s3.amazonaws.com/0/132550/bd8d87aa-6290-d1fe-067a-f7d233258dbc.png)
【Unity】カードを回転させてめくる動作を実装する

カードゲームといえば、裏になってるカードを捲って表にする動きを実装したいですよね。そんな時に使える方法を紹介します。
#概要

uGUIでもtransformを回転させればGameObjectを回転させられます。
そこで、カードのGameObjectを回転させて90度を越えたら画像を表面のSpriteに差し替えることで、カードが捲られたように見えるようになります。


#サンプル

```C#:

	//カードのGameObjectにアタッチしたScriptに記述
	//右回転用
	public IEnumerator CardOpen ()
	{
		//カードを予め-180度回転させ裏面用の画像を表示する
		//裏面表示はコルーチン外で行っても良い
		//CanvasGroupでなくspriteのalpha値を操作しても良い
		transform.eulerAngles = new Vector3 (0, 180, 0);
		ReversedFace_CanvasGroup.alpha = 1f;

		float angle = -180f;
		float Speed = 300f;

		//-90度を超えるまで回転
		while (angle < -90f) {
			angle += Speed * Time.deltaTime;
			transform.eulerAngles = new Vector3 (0, angle, 0);
			yield return null;
		}

		//裏面用の画像を非表示(表面が表示される)
		ReversedFace_CanvasGroup.alpha = 0f;

		//0度まで回転
		while (angle < 0f) {
			angle += Speed * Time.deltaTime;
			transform.eulerAngles = new Vector3 (0, angle, 0);
			yield return null;
		}

		//綺麗に0度にならないことがあるため、補正
		transform.eulerAngles = new Vector3 (0, 0, 0);
	}
```

回転させる方法はぶっちゃけもっと良い書き方があると思いますが、大筋の方針としてはこれで良いかと思います。

#まとめ
１．カードのGameObjectを予め-180度回転させておき、裏面用画像を表示させる
２．ransform.eulerAnglesなどでGameObject回転させる
３．90度回転したら裏面用画像を非表示にする
４．そのまま180度回転させる

[サンプルの動画](https://twitter.com/azumagoro/status/969239225861259266)

参考になった方はいいねお願いします。
それともっとこう書いた方がスマートだよ等あれば是非教えてください。
Redmineで個人設定から姓名/メールアドレスを変更できなくする方法【View customizes Plugin】

# やりたいこと
ユーザが個人設定から姓名及びメールアドレスを変更禁止にしたい。
勝手にローマ字とかにされると管理上困るため。

# 動作環境

Redmine3.4.3
View Customize plugin 1.1.4

# やり方
Redmineのプラグイン「view customize plugin」を利用します。

下記の設定をview customizeで設定します。

- Path pattern

```
/my/account
```

- Type

```
JavaScript
```
- Code

```
$(function(){
$('#user_firstname').prop('readonly',true);
$('#user_lastname').prop('readonly',true);
$('#user_mail').prop('readonly',true);
});
```

ちなみに$('#xxx').prop('readonly',true);
のxxx部分を対象のhtmlソースからidを拾って入力すれば、その項目も
読み取りのみになります。
Path patternを変更すれば個人設定以外のところにも適用できると思います。
Linuxで時刻を確認したい

タイムゾーンの設定が出来ない仕様のOS（具体的にはESXi）が
ハードウェアクロック（BIOS時刻）に設定されているJSTの時刻を
そのままUTCとして取得してしまったので確認方法。

date
普通にOSの時刻を確認。
[結果]
Thu Mar  2 05:15:42 UTC 2017

hwclock
ハードウェアクロックを確認。
スーパーユーザーで実行する必要有。タイムゾーンの概念は無い模様。
[結果]
Fri Mar  2 14:16:50 2018  .698035 seconds
【Excel VBA】集合棒状グラフを3パターンで描画する

# 記事の概要
今回は初回なので基本的な集合棒状グラフを描きますが、シリーズ化していきたいなと思います。
仕事でExcelVBAでグラフを作成することがあるのですが、調べてもなかなかピンとくるものがなくて最初は苦戦しました:tired_face:
この記事が誰かの役に立ったら嬉しいです。

# 環境
・Excel2016
・Windows10

# グラフを描画する
###### グラフの材料

お約束の果物シリーズで集合棒状グラフを3つの方法で作成します:apple::tangerine::strawberry::grapes::banana:

![image.png](https://qiita-image-store.s3.amazonaws.com/0/241380/be67d03e-480a-c0f5-b19a-53a84e238e53.png)



### ①全体のグラフを作成する場合
###### グラフの範囲
![image.png](https://qiita-image-store.s3.amazonaws.com/0/241380/84894b9a-8398-65d6-83d9-95d56fe6976c.png)
###### コード

```vb
Public Sub Graph_Bar1()

 Dim ws As Worksheet
    Set ws = Sheets(1)

       ws.Cells(2, 2).CurrentRegion.Select    '---B2に関連するセルを選択
       
       With ws.Shapes.AddChart.Chart          '---グラフを作成
          .ChartType = xlColumnClustered      '---グラフの種類を「集合縦棒」にする
          .SetSourceData Source:=Selection    '---選択したセルをグラフの範囲にする
       End With

End Sub
```
###### 作成されたグラフ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/241380/b282ff08-6bf9-3c3b-2376-b1c01546f3bf.png)


### ②隣り合う列を選択してグラフを作成する場合
###### グラフの範囲
![image.png](https://qiita-image-store.s3.amazonaws.com/0/241380/54dfd7d0-e51f-5e53-137a-6239c5c6f21e.png)
###### コード
```vb

Public Sub Graph_Bar2()

 Dim ws As Worksheet
    Set ws = Sheets(1)
    
 Dim LastRow As Long
    LastRow = ws.Cells(Rows.Count, 2).End(xlUp).Row         '---B列の最終行を求める

       Range(ws.Cells(2, 2), ws.Cells(LastRow, 3)).Select   '---B2～C列の最終行を選択
       
       With ws.Shapes.AddChart.Chart          '---グラフを作成
          .ChartType = xlColumnClustered      '---グラフの種類を「集合縦棒」にする
          .SetSourceData Source:=Selection    '---選択したセルをグラフの範囲にする
       End With

End Sub
```
###### 作成されたグラフ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/241380/33c07c49-c02d-8855-cd9d-087fafa93123.png)


### ③離れた列を選択してグラフを作成する場合
###### グラフの範囲
![image.png](https://qiita-image-store.s3.amazonaws.com/0/241380/7a478ee5-2239-1e83-198f-e558c515a6d5.png)
###### コード
```vb
Public Sub Graph_Bar3()

 Dim ws As Worksheet
    Set ws = Sheets(1)
    
 Dim LastRow As Long
    LastRow = ws.Cells(Rows.Count, 2).End(xlUp).Row         '---B列の最終行を求める
     
       Range("B2:B" & LastRow & ", E2:E" & LastRow).Select  '---B2～B列の最終行とE2～E列の最終行を選択
       
       With ws.Shapes.AddChart.Chart          '---グラフを作成
          .ChartType = xlColumnClustered      '---グラフの種類を「集合縦棒」にする
          .SetSourceData Source:=Selection    '---選択したセルをグラフの範囲にする
       End With

End Sub
```
###### 作成されたグラフ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/241380/4c65feac-a9db-1f90-e598-402b13df26fa.png)
Ruby on Rails やってる時にNoMethodError in SessionsController に悩んだ件

Ruby on Rails チュートリアル(8章)を進めていく中でこんなエラーが・・



<img width="998" alt="スクリーンショット 2018-03-02 12.01.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/148649/fee89c29-8c18-ee57-e7e8-bef394398dfc.png">

NoMethodError in SessionsController 

undefined method `[]' for nil:NilClass


なんだろう・・・？？

値が入っていないのかな・・と思って該当の部分を見て見る・・。

```sessions_controller.rb
class SessionsController < ApplicationController

  def new
  end

  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      log_in user
      redirect_to user
    else
      flash.now[:danger] = 'Invalid email/password combination'
      render 'new'
    end
  end

  def destroy
    log_out
    redirect_to root_url
  end
end
```
よくわからん。
あっとるやん・・・ってViewを見て見ると・・やらかしていた。

```new.html.erb
<% provide(:title, "Log in") %>
<h1>Log in</h1>

<div class="row">
  <div class='col-md-6 col-md-offset-3'>
    <%= form_for(:sessions, url: login_path) do |f| %>
    
    <%= f.label :email %>
    <%= f.email_field :email, class:'form_control' %>
    
    <%= f.label :password %>
    <%= f.password_field :password, class:'form_control'%>
    
    <%= f.submit "Log in", class:"btn btn-primary" %>
  <% end %>
  
  <p>New user? <%= link_to "Sign up now!", signup_path %></p>
  </div>
</div>
```
このコードの部分
<%= form_for(:sessions, url: login_path) do |f| %> ❌
<%= form_for(:session, url: login_path) do |f| %> ⭕️

見落として結構時間取られてしまってた・・。
気をつけないと・・泣
WordPressの関数が酷い

# WordPressの関数が酷い

いや、とにかく酷い。全体的に行き当たりばったり感がハンパ無い。インターネッツの技術って、こういう行き当たりばったり方式で作ったものの方が普及しちゃうよね。EMailとかFTPとかHTTPとかHTMLとかCSSとかJavaScriptとかコインチェックとか。

勢いかね？

## 結論 → 勢い大事

## この記事について

この記事は、WordPressをCMSとして利用する開発依頼を請け、あまりにも酷い内部構造に苛立ち、その苛立ちを吐き出すためにしたためた記事である。

## 俺的関数一覧

WPは関数で色々と求める。クラスではない。

```php
//  カテゴリーIDからカテゴリー名を求める（その１）
$category_name = get_cat_name($category_id);

//  カテゴリーIDからカテゴリー名を求める（その２）
$category_name = get_the_category_by_ID($category_id);

//  カテゴリー名からカテゴリーIDを求める。
//  カテゴリー名が重複していると正しく取得できない。
//  サブカテゴリーでカテゴリー名が重複することがある。←これは酷い！
$category_id = get_cat_ID('FAQ');

//  スラッグ名からカテゴリーIDを求める。（直接求める関数はない）
//  カテゴリー名は表示に使用し、スラッグ名はURLなどで識別に使う。
$category_id = get_category_by_slug('お知らせ')->cat_ID;
```

## バッドノウハウ
カテゴリー名が重複する場合は、スラッグ名に名前空間を自分で設定する。
例えば、サブカテゴリーが重複したら、スラッグ名に親カテゴリーも含める。

**"悪"というカテゴリー名に、"evil"というスラッグ名が重複した場合**
悪 → google:evil
悪 → microsoft:evil

## WPをDisろう

```php
function get_query_var( $var, $default = '' ) {
	global $wp_query;
	return $wp_query->get( $var, $default );
}
```

なんだよこの`global`って！
私がプログラムをはじめた20年前、初めて買ったプログラム書籍「はじめてのSymantec C++」には、`Global変数はバグの温床なので使ってはいけません`と書いてあった。

```index.php
//	テーマを使うか否か
define('WP_USE_THEMES', true);

//	wp-blog-header.phpを読み込む ← おいおい
require( dirname( __FILE__ ) . '/wp-blog-header.php' );
```

`dirname( __FILE__ )` は `__DIR__` だけで良いです。誰か指摘してあげて下さい。[^1]

wp-blog-header.phpというファイル名に違和感を感じる人も多いだろう。内容も違和感たっぷりだ。（後日追記予定）

## WPを讃えよう

 * 行頭のインデントがタブ ← 正解！！ここが分からない人は老害認定されて下さい。[^2]

[^1]: プルリクしたら、"我々はPHP5.2をサポートする必要がある"って返事があった。
[^2]: スペース派には、２・４・８と三流派あります。
現在のgitブランチのトラッキング（アップストリーム設定）を削除する

## こんなときに
* リモートブランチをチェックアウトしたけど、`git push`はしないししたくない。
* だけどローカルブランチはそのまま使いたい。
* リモートブランチは消したくない。

```
git branch --unset-upstream
```

https://qiita.com/chihiro/items/e178e45a7fd5a2fb4599
https://gist.github.com/magnusbae/10182865
Visual Studio Codeのアクティビティバーが邪魔な時の対処法

## モチベーション


AtomやSublime Textとかに比べて、Activity Barが邪魔に感じませんか？
対処法探したらいいExtensionが見つかりました。


<img width="94" alt="Screen Shot 2018-03-02 at 13.51.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/84451/6886741d-f76f-56c9-bb1a-bc4bde12c6c8.png">
(これがアクティビティバー)

## Extensionの導入

[Activitus Bar](https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.activitusbar)というExtensionを使います。
これを使うと、以下のようにエディタの下にさり気なく、アクションバーの機能が使えるようになります。

<img width="188" alt="Screen Shot 2018-03-02 at 13.53.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/84451/28705b2a-1989-50e7-9960-8098ddb65534.png">

詳しいことは[Activitus Bar](https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.activitusbar)のページを御覧ください
<https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.activitusbar>

## Activity Barの非表示にする方法

以下のどちらの方法を使っても非表示にできます

### 方法1

Activity Barの上で右クリックして[Hide Activity Bar]をクリックする

<img width="204" alt="Screen Shot 2018-03-02 at 13.58.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/84451/7613d823-97c1-76bb-dfe6-739659562770.png">


### 方法2

User settingのJSONに以下を追加する

```json
"workbench.activityBar.visible": false
```


## 参考

* [user interface - Activity Bar width in Visual Studio Code - Stack Overflow](https://stackoverflow.com/a/48496575/2885946)
Anglular CLI で環境構築


# Angular CLI のインストール

 [Angular CLI](https://github.com/angular/angular-cli) で Angular 環境を構築します。
この記事は、AngularJS から Angular への移行に際して行った作業記録です。
今後 ngUpgrade を使った段階的移行などの記録を書いていきたいと思ってます。

## 1. Node.js
YARN とか使う、という選択肢もありますが、
自環境では既に Nodist が入っているので、Node.js を使います。

Angular CLI には **Node.js 6.9.0 以上、NPM 3 以上が必要**。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/81813/6caaa031-956d-0d91-9439-ce10fc5d991f.png)
see - https://github.com/angular/angular-cli#prerequisites

自環境は、NPM は 4系でクリア。
Node の方は管理に nodist を使用していて、既に Node 5.8.0 が
インストールされているので、6.9.0 以上のバージョンを追加します。

```
nodist add v7.2.1
```

使用する バージョンをインストールしたものに切り替えます。

```
nodist use v7.2.1
```

※ 都合により最新バージョンではなく、 7.2.1 をインストールしてます。

### 2. Angular CLI をインストール


Angular CLI をインストール

```
npm install -g @angular/cli
```

### 3. Angular アプリ実行

my-application には作成したいプロジェクト名を入れます。
SASSも使いたいので --style=sass を末尾に追記して作成。

```
ng new my-application --style=sass
```

実行してみる。

```
ng serve
```

わーいできました。

とっぴんぱらりのぷう

----

# 参考

* [Angular CLI - GitHub](https://github.com/angular/angular-cli)
* [Angularの環境構築（Angular CLIで構築）- Qiita](https://qiita.com/Yamamoto0525/items/65d5a0b36eb4dbd8079b)
* [Windows環境でangular/cliを使えるようにする - Qiita](https://qiita.com/elphe27/items/8e73d4118b26a6971c3b)
* [nodistでNode.jsをバージョン管理 - Qiita](https://qiita.com/satoyan419/items/56e0b5f35912b9374305)
raspberry piが動かなくなってしまった2018年冬その1

#Raspberry pi2が起動できなくなった
動作が重くなっていたので、プロセスを確認したところ、暴走してそうなものを発見したのでスクリプトを編集後、アップデート、そして再起動をかけたのですが、起動中に止まってしまい、ログインできなくなってしまいました。

#焦ってやるといいことがない
焦って復旧を試みると、いじらなくてもいいところまで、いじりがち（経験済）なので、まず深呼吸、次にバックアップ、それから復旧の順でやりました。

#SDカード全体のバックアップ
いじりすぎて致命傷になる前にバックアップをとった方がいいです。Raspberry piからSDカードを取り出し、WindowsPCでバックアップしました。

- Win32 Disk Imagerを利用
- SDカードの内容が入ったimage fileを置く場所を指定
- Readボタンを押下

以上しばし待つ

#RaspberryPiのシングルユーザーモードで状況確認
RaspberryPiにモニターをつないでいない場合は、HDMIで事前につないでおきます。

- ロゴがでたところでShiftキー
- Edit Configを選択
- cmdline.txtの方に[init=/bin/sh]を追記

```cmdline.txt
dwc_otg.lpm_enable=0 init=/bin/sh console=ttyAMA0,115200 \以下省略
```
のような形で追記
読み取り専用になっているので、書き込み権限を付加

 
```
# mount -o rw,remount /
```

#問題のファイルを修正、がしかし
ファイルシステムが壊れているらしく、昔バックアップしておいたSDカードを本体に挿入し、壊れているSDをリーダーに入れてUSB接続。古い環境下で下記コマンドを実行

```
sudo fsck -n /dev/mmcblk0p7
```
修復後、問題のスクリプトを修正し再起動したものの、状況はかわらず。
というわけで地道に古いSDカードに差分をコピーしていくことになりました。

```
sudo mount /dev/sda7 /mnt/sd
```
おしまい
box.comのFTP機能を使って後生大事に抱えているFTPサーバを駆逐しよう

俺です

弊社のGoogle Drive運用そろそろやめようかなとおもって[Box](https://www.box.com/ja-jp/home)アカウント開設しました。

Adminコンソール覗いてたらftpがあるじゃねーっすか。知らなかった(ｼﾞｮｳﾖﾜｯ
早速使ってみたいと思います。ドキュメントは[コチラ](https://community.box.com/t5/%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%81%AE%E7%AE%A1%E7%90%86/Box%E3%82%92FTP%E3%81%A8%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B/ta-p/7704)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/42755/d9c209cd-eab5-e8a7-3e0f-c510ec5af00e.png)


# FTPでboxにファイルを転送する

```
$ ftp ftp.box.com
Connected to ftp.box.com.
220 Service ready for new user.
Name (ftp.box.com): ************
331 User name okay, need password for ***********
Password:
230 User logged in, proceed.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
229 Extended Passive Mode Entered (|||12135|)
150 File status okay; about to open data connection.
drwx------   1 owner group            0 Mar  1 18:50 Box Reports
drwx------   1 owner group            0 Mar  1 19:26 私のBox Notes
226 Closing data connection.
ftp> mkdir unko
257 "/unko" created.
ftp> ls -l
229 Extended Passive Mode Entered (|||25525|)
150 File status okay; about to open data connection.
drwx------   1 owner group            0 Mar  1 18:50 Box Reports
drwx------   1 owner group            0 Mar  1 20:31 unko
drwx------   1 owner group            0 Mar  1 19:26 私のBox Notes
226 Closing data connection.
ftp> cd unko
250 Directory changed to /unko
ftp> put exec.sh
local: exec.sh remote: exec.sh
229 Extended Passive Mode Entered (|||19241|)
150 File status okay; about to open data connection.
100% |****************************************************************************************************************************************************|   216      100.01 KiB/s    00:00 ETA
226 Transfer complete.
216 bytes sent in 00:00 (0.22 KiB/s)
ftp> bye
221 Goodbye.
```

FTPでboxにしょーもないファイルを転送することができました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/42755/4fd9a000-e99d-52b2-213d-3cb4ad056503.png)

Google Driveのデータ全部ftpでぶっこんでしまおう。

FTPサーバ作れってしょーもない業務依頼遂行してる方は
是非box契約してFTPサーバを駆逐しましょう。
俺達の仕事ってFTPサーバのオモリではないですよ。
Businessプラン1ユーザーあたり¥1800/month支払えば超絶な幸せが待ってます。

完
Oracle APEX5関連リンク

#無料で最新版APEXが使える
[オラクル提供APEXクラウド](https://apex.oracle.com/jp/)
　2018/3/2現在5.1.4.00.08。DBサイズ制限あり。期間制限なし
　スキーマ利用。DBへ直接接続したり、シェル呼び出しはできない。

#APEX5ではユニバーサルテーマになった
[Universal Theme](https://apex.oracle.com/pls/apex/f?p=42:100::::::)
フォントアイコンは、APEX5.0のa-Iconに加え、APEX5.1では[Font-awesome](https://univ.peraichi.com/39)が加わった。
a-Iconとは文字コードが異なるので両方とも利用可能。
a-Iconの[一覧](https://www.speech2form.com/ords/f?p=141:250)と[文字コード](https://www.speech2form.com/assets/css/apex-icons.css)。font-awesomeの[一覧](https://apex.oracle.com/pls/apex/f?p=42:icons)
今までのアイコンも利用可能だが、今後はこちらを利用した方が良い。（画面によりFont-awesome利用時はIcon Type:faを指定する必要あり）

#随時更新予定
　2018/3/2 作成。
　2018/3/5 アイコンの説明修正。
　2018/3/7 アイコンの説明とリンク追加。
UnityのDOTweenで無限ループをKillしたりStartしなおすと不自然になっちゃう?

DOTween便利ですよね。

http://dotween.demigiant.com/

`tweener.SetLoops(-1)` すると無限ループできるわけですが、
この時、ループしてるtweenのプロパティを再設定したいなとか思うじゃないですか。

```cs
var duration = 1f;
var tweener = transform.DORotate(new Vector3(0,0,-359.9f), duration).SetLoops(-1).Play();

tweener.Kill();
duration = 2f;
tweener = transform.DORotate(new Vector3(0,0,-359.9f), duration).SetLoops(-1).Play();
```

なんか無限ループのつなぎ目がうまく繋がらなくなる…！

のは、tweenerをkillしたからと言って、プロパティはリセットされないからでした。

```cs
var duration = 1f;
var tweener = transform.DORotate(new Vector3(0,0,-359.9f), duration).SetLoops(-1).Play();

tweener.Kill();

// reset property
transform.localRotation = Quaternion.Euler(0, 0, 0);

duration = 2f;
tweener = transform.DORotate(new Vector3(0,0,-359.9f), duration).SetLoops(-1).Play();
```
UITextViewのカーソルの座標を取得

あとでちゃんと書き直す


```swift
if let textView = self.textView, let textRange = textView.selectedTextRange{
    let caretRect = textView.caretRect(for: textRange.end)
    //これ
    let caretRectInWindow = textView.convert(caretRect, to: nil)
}
```
俺言語 その13

#概要

俺言語をやってみた。
avrにアセンブラで実装してみた。
tera termから、Lチカやってみた。

#環境

avr studio 4
attiny85 1mhz
tera term
usb-serial

#バグ
論理演算の>の件
<は、<ですが、>は、=>です。仕様です。

#拡張

delayを、@に割り当てた。
@=1で、おおよそ、1秒待つ。

```
delay:
	clr 	r0
	clr		r1
	dec 	r0
	brne	PC - 1
	dec 	r1
	brne	PC - 3
	dec 	r17
	brne	PC - 5
	ret
```
右辺に、?で、キー入力待ち
a=?
0キーなら、aに、48が入る。


#サンプルコード

　>を表示して、キー入力待ち。
0キーで、led消灯。
1キーで、led点灯。
スペースキーでループを抜ける。

```
10 r=6
20 o=2
30 ?=">"
40 a=?
50 #=a>49*20
60 #=a=32*100
70 o=6
80 #=30
```

以上。
ecl の http-request の使い方 (Post)

Common Lisp のひとつである、ecl の http Post のサンプルです。
quicklisp.lisp のインストールが済んでいるものとします。

```lisp:ecl_post.lisp
#! /usr/bin/ecl -shell
; -------------------------------------------------------------------
;	ecl_post.lisp
;
;						Mar/02/2018
;
; -------------------------------------------------------------------
(format t "*** 開始 ***~%")
(load "~/quicklisp/setup.lisp")
(ql:quickload :drakma)
(defvar out_str)
(setf out_str (flexi-streams:octets-to-string
	(drakma:http-request "http://httpbin.org/post" :method :post
		:parameters '(("user" . "jiro") ("password" . "123456"))
		)
	))
(format t out_str)
(format t "*** 終了 ***~%")
(quit)
; -------------------------------------------------------------------
```

実行結果

```text
$ ./ecl_post.lisp 
*** 開始 ***
;;; Loading "/home/uchida/quicklisp/setup.lisp"
;;; Loading #P"/usr/lib/ecl-16.1.3/asdf.fas"
To load "drakma":
  Load 1 ASDF system:
    drakma
; Loading "drakma"

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "password": "123456", 
    "user": "jiro"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Connection": "close", 
    "Content-Length": "25", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Drakma/2.0.4 (ECL 16.1.3; Linux; 4.15.5-1-ARCH; http://weitz.de/drakma/)"
  }, 
  "json": null, 
  "origin": "163.49.205.60", 
  "url": "http://httpbin.org/post"
}
*** 終了 ***
```
Zabbixの通知（Media）設定（Gmail, Slack）


# 環境

`docker` 上で構築します。
https://github.com/zabbix/zabbix-docker

+ zabbix-web-apache-mysql
+ zabbix-snmptraps 
+ zabbix-server-mysql
+ mysql

## メール通知

### ステップ1：メールのセキュリティ設定
設定ページ：https://myaccount.google.com/u/1/lesssecureapps?pli=1&pageId=none
安全性の低いアプリをONにします

![Kobito.3OKu3n.png](https://qiita-image-store.s3.amazonaws.com/0/181951/998d8347-7284-c080-74cc-1e1ad852be9b.png "Kobito.3OKu3n.png")

### ステップ2：zabbixのメディア設定

![Kobito.eFcuaa.png](https://qiita-image-store.s3.amazonaws.com/0/181951/eb38c9b1-89f9-4ed6-2f70-916ffa0e0a4e.png "Kobito.eFcuaa.png")

### ステップ3：ユーザのメディアにメール追加、有効

管理　＞　ユーザー　＞　ユーザー選択　＞　メディアタブ　＞　追加　＞　更新

### ステップ4：アクション設定

新規アクション作成

+ アクション名入力
+ 実行条件選択

![Kobito.M8g5dj.png](https://qiita-image-store.s3.amazonaws.com/0/181951/12c01778-6564-a3e6-fb6e-56f00d22722d.png "Kobito.M8g5dj.png")

+ 実行内容で、メールで送信やユーザ、グループを選択

![Kobito.G0A21d.png](https://qiita-image-store.s3.amazonaws.com/0/181951/7d1a63f4-62e6-2984-621f-9434510711bc.png "Kobito.G0A21d.png")


→ 追加します。

### 完了

ここまではメール設定が完了ですが、送信エラーが発生する場合があります。もしかして、ログインエラーが発生したらメールをチェックして見てください（サーバメール）。許可させないと送信できませんです。

![Kobito.HpmUlk.png](https://qiita-image-store.s3.amazonaws.com/0/181951/244cc45b-c265-38a7-f2e0-2a466b7e7f69.png "Kobito.HpmUlk.png")

## Slack通知

こちらのスクリップ使います
https://github.com/ericoc/zabbix-slack-alertscript

ほぼほぼ以上のgithubの手順でやりますが以下の問題があった場合：

> `slack.sh` の権限

処理方：権限させる

```bash
$ chmod 777 slack.sh
```

> `curl` コマンドが見つかれませんでした

処理方：curlインストール

```bash
sudo apt-get update -y
sudo apt-get install curl -y
```

> SSLエラー

処理方：curlのkオプションを追加

```bash
# curl -m 5 --data-urlencode "${payload}" $url -A 'zabbix-slack-alertscript / https://github.com/ericoc/zabbix-slack-alertscript'

curl -k -m 5 --data-urlencode "${payload}" $url -A 'zabbix-slack-alertscript / https://github.com/ericoc/zabbix-slack-alertscript'
```


# 完了です
ブラウザ拡張機能を作ろう！ChromeとFirefoxの開発を比較

# はじめに
「ああ、こんな拡張機能が欲しいのに、どうして見つからないんだ！！」

「こんなに簡単なことなのに！！」

と、嘆くあなた。

エンジニアのささくれ・・・違った、端くれなら作りましょう。
まずは入口として、各ブラウザの開発言語や方法について調べてみました。

# 開発言語と難易度

色々な言語の経験をしてきましたが、
残念ながらまだ英語は翻訳サイトを駆使しながらしか読めないので、手抜きでfirefoxの方をやってみたいと思います。
しかしどうやらブラウザ間の互換性がある程度あるそうですのでソースの使い回しは大部分で可能なようです。

|ブラウザ|開発言語|ドキュメント|難しさ|
|:--|:--|:--|:--:|
|Chorome|javascript/HTML/CSS|[公式マニュアル(英語)](https://developer.chrome.com/extensions)|低|
|Firefox 新方式|javascript/HTML/CSS|[公式マニュアル(日本語)](https://developer.mozilla.org/ja/Add-ons/WebExtensions/Your_first_WebExtension)|低|
|Firefox 旧方式|XUL|現在は非推奨|高|
|Opera|javascript/HTML/CSS|[公式マニュアル(英語)](https://dev.opera.com/extensions/)|低|

その他、処理の高速化や、APIでは不可能なことをする場合は、CやC++で書かれた外部のライブラリが利用可能のようです。

とりあえずこれで、作れそうですね！

つづく？
ecl の http-request の使い方 (Get)

Common Lisp のひとつである、ecl の http Get のサンプルです。
quicklisp.lisp のインストールが済んでいるものとします。

```list:ecl_get.lisp
#! /usr/bin/ecl -shell
; -------------------------------------------------------------------
;	ecl_get.lisp
;
;						Mar/02/2018
;
; -------------------------------------------------------------------
(format t "*** 開始 ***~%")
(load "~/quicklisp/setup.lisp")
(ql:quickload :drakma)
(defvar out_str)
(setf out_str (flexi-streams:octets-to-string
	(drakma:http-request "http://httpbin.org/get")
	))
(format t out_str)
(format t "*** 終了 ***~%")
(quit)
; -------------------------------------------------------------------
```

実行結果

```text
$ ./ecl_get.lisp 
*** 開始 ***
;;; Loading "/home/uchida/quicklisp/setup.lisp"
;;; Loading #P"/usr/lib/ecl-16.1.3/asdf.fas"
To load "drakma":
  Load 1 ASDF system:
    drakma
; Loading "drakma"

{
  "args": {}, 
  "headers": {
    "Accept": "*/*", 
    "Connection": "close", 
    "Host": "httpbin.org", 
    "User-Agent": "Drakma/2.0.4 (ECL 16.1.3; Linux; 4.15.5-1-ARCH; http://weitz.de/drakma/)"
  }, 
  "origin": "163.49.205.60", 
  "url": "http://httpbin.org/get"
}
*** 終了 ***
```

Post のサンプルはこちら
[ecl の http-request の使い方 (Post)](https://qiita.com/ekzemplaro/items/fe60d0dd7b7face885df)
aws lambda file書き込む時のエラー



lambdaでfile作成する時以下のエラーが出る場合がある

```
OSError: [Errno 30] Read-only file system:
```

## 解決
以下の経路をつけること
`/tmp/ `

例）

```
file_name_xlsx = '/tmp/' + file_name + ".xlsx"
file_name_csv = '/tmp/' + file_name + ".csv"
```
vimでmanを使う．タグジャンプもあるよ．(vim色に染まれ3)

vimでmanを使う．タグジャンプもあるよ. (vim色に染まれ3)
============================

環境
================

ディストリ変遷

- Ubuntu16.04LST -> Ubuntu17.10 -> Arch Linux
- Windows10 -> Arch Linux

ついにメインPCもArchに乗り換えたよ．

- lenovo-S21e，自作PC(メインPC)
- vimにプラグインは入れたくない派

dwm (dynamic window manager) いいね．なぜかgnome-terminalだけfcitxで日本語入力が出来ない．．．


(´・ω・) < tabよりbufferのほうが使いやすいと最近気づきました．

(´・ω・) < 特に`:badd`コマンドね

前々回
- [vim色に染まれ．機能紹介のついでにbashをvi仕様に．](https://qiita.com/Pseudonym/items/2cb442ff257a2f9f9d70)

前回
- [vimは端末エミュレータ :terminal (vim色に染まれ2)](vimは端末エミュレータ :terminal (vim色に染まれ2))



本題
================


みんなはプログラミングをする際，man pageを使っているだろうか．
(´・ω・`) は自称C Programmerなので，関数のman pageをよく見たりする．

知りたい関数の名前にカーソルを当てて`K`って押せばman pageが開くのよ．
でもね，画面全部乗っ取って表示するのはいかがなものか．

(´・ω・) < 見た内容を全て記憶しておけと．．．？

(｀・ω・) < Impossible!

というわけで，新しいwindowにman pageを開いてあげようではないか．

そしてなんと，公式設定を使ってやると念願のman pageでのタグジャンプまでついてくるのだ．


ここに載ってます．

- [usr_12 - Vim日本語ドキュメント](http://vim-jp.org/vimdoc-ja/usr_12.html)


補足
--------
前回紹介した`:terminal`コマンドを使えば別画面でmanpageを表示させれるんだけど，
こっちのほうが絶対便利だよ．

man page
===============

そもそも`man`コマンドというものがあって，
コマンドのドキュメントとかライブラリ関数とか色んな情報を表示してくれる．

基本的な使い方は

```
man man
```

を見ればわかる．

```
man <command>
```

とかこんな感じで使うよ．


このmanでの情報の表示方法はPAGERというもので決定される．
デフォルトのPAGERはless(moreかも)なので（環境によっては違うかも），
タグジャンプが使えないし，色もつかないのよね．

で，vimからこれを呼び出すことが出来て，知りたいコマンドや関数の上にカーソルを合わせて，

```
K
```

を押すことで，man pageが表示される．

__lessで__


ということは，vimじゃないから画面を乗っ取っちゃう．

(´・ω・`) < 妙に使いにくい．．．

と思っていたら，公式でちゃんと対策がありました．

方法
====================

とりあえず，~/.vimrc`に次を書く．

```
runtime! ftplugin/man.vim
```

これで，vimで`Man`というコマンドが使えるようになる．

```
:Man <command>
```

こんな感じ．

(´・ω・) < でもね，`K`みたいに使いたいよね～

(｀・ω・) < Possible!

(I'm possibleにしようと思ったけど，間違いなのよね～)


カーソルの下の`man`を新しいwindowで開く．
==========================

調べたい単語の上にカーソルを持ってきて，

```
\K
```

これで新しいwindowでvimをPAGERにしてman pageを表示できる．


(´・ω・) < いい感じに色がついてる～～～ しゃ☆れ☆お☆つ

(´・ω・) < vimがPAGERか．．．

(´・ω・) < まさか．．．もしかして．．．

(´・ω・)  ｶﾁｬﾘ `ctrl + ]`

(´  ω  ) <  なん．．．だと．．．

(´・ω・) < タグジャンプが出来た．．．

(´・ω・`) < ．．．

(´∩ω∩`)



参考文献
=================
- [usr_12 - Vim日本語ドキュメント](http://vim-jp.org/vimdoc-ja/usr_12.html)
Apple Watchの画面サイズを取得する方法

Apple Watchの画面サイズenumを作成して、38mmと42mmを設定します。

```Swift
enum CaseSize: Int {
    case size38mm = 38
    case size42mm = 42
}
```

`WKInterfaceDevice`の`extension`に`currentCaseSize`メソッドを追加します。
（将来的におおきいサイズのWatchが発売された場合のために、38mmと42mm以外は42mmにしています。エラーにしたい場合などは、enumにnoneを追加してdefaultで.noneをretrunするといいかと）

```Swift
extension WKInterfaceDevice {
    
    class func currentCaseSize() -> CaseSize {
        let width38mm: CGFloat = 136.0
        let width42mm: CGFloat = 156.0
        let width = WKInterfaceDevice.current().screenBounds.size.width
        
        switch width {
        case width38mm:
            return .size38mm
        case width42mm:
            return .size42mm
        default:
            return .size42mm
        }
    }
    
}
```

[awake(: )]で実行してみました。

```Swift
    override func awake(withContext context: Any?) {
        super.awake(withContext: context)
        
        let caseSize = WKInterfaceDevice.currentCaseSize()
        print("\(caseSize.rawValue)")
    }
```

デバッグエリアに38mmと表示されました。

<img width="1512" alt="スクリーンショット 2018-03-02 12.39.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/38924/5f82bab2-ba94-2807-1fdb-f50a59d12df2.png">
vimは端末エミュレータ :terminal (vim色に染まれ2)

vimは端末エミュレータ `:terminal` (vim色に染まれ2)
============================

ディストリ変遷

Ubuntu16.04LST -> Ubuntu17.10 -> Arch Linux (now)

- lenovo-S21e
- vimにプラグインは入れたくない派

Arch いいね．日本語入力はまだ設定できてないけど．

前回は長々と書いたので，今回は`:terminal`に焦点を当て小さい記事を．

ちょっと紹介しきれなかった機能が判明したのでそれもね．

前回の補足
=========
前回

- [vim色に染まれ．機能紹介のついでにbashをvi仕様に．](https://qiita.com/Pseudonym/items/2cb442ff257a2f9f9d70)


`gf`でそのファイルに行けて`ctrl + w + gf`で新しいタブで開くって紹介したけど．


```
ctrl + w + f
```

で新しいwindowで開くのほうがよく使うよね．

tabよりbufferを使うほうが多いかな？

(´・ω・) < bashをvim風にはもうちょっといい方法があったのでまた今度に．．．


:terminal
===================

vim8から（より正確には違うが）`:terminal`というコマンドが使えるようになった．
これはvimのwindowとして端末エミュレータを開くことができる機能だ．

vimとbashを使っていれば，`set -o vi`していることだと思うが，やっぱり機能不足は否めない．

vimの一画面としてbashを表示させたい．隣にbashの画面がほしいと思った人は多いであろう．
それができるようになった．

さらに便利な機能もついて．．．


詳しくは次を見ればわかるが，使いそうな機能だけをピックアップしてわかりやすく(??)紹介する．

[terminal - Vim日本語ドキュメント](http://vim-jp.org/vimdoc-ja/terminal.html)


(´・ω・)  <  vimのドキュメントのweb版はもうちょっと見やすかったらいいのにね．．．


基本
================
端末エミュレータを新しい画面(デフォルトでは横分割)で開く．

```
:terminal
```

もしくは

```
:term
```

以下ではタイプを減らすために`:term`で統一とする．

シェルを指定したい．
------------
bashを指定．

```
:term bash
```

makeのログを取りたい．
-------------
ドキュメントではこの下に`:term make myprogram`とか書いてある．
これをすると，新しいwindowでmakeの出力を出してくれる．

(´・ω・)  < `make`するんだったら，Quickfixでいいかな．．．

(´・ω・)  < `:make`と`:copen`か`:cw`のほうが使いやすい．．．

(´・ω・`)  < ちなみに`:cw`だとエラーがない場合windowを閉じてくれる．

[quickfix - Vim日本語ドキュメント](http://vim-jp.org/vimdoc-ja/quickfix.html)

操作方法
========================
windowの一種なので`ctrl + w`系のwindow操作コマンドが使える．

通常のbashの`set -o vi`との一番大きな違いは，
標準出力やエラー出力に対してTerminal-Normalモード(通常のノーマルモードと同じ)に入り，コピペができることだ．

Terminal-Normalモードへの入り方
--------------------------
デフォルトでは，

```
ctrl + w + N
```

ちょっと変わってるね．

戻るには```a```とか```i```を押せばいい．


標準出力の一部を直接コピーできる．

ただし，Terminalの出力に対して編集はできない．(read-onlyもといcopy-onlyか)
ActiveModel で distinct しながら order by random する

```ruby
#　おこられる
Parent
  .joins(:children)
  .where(children: { age: 0 })
  .distinct
  .order(:name, 'random()')

# おこられない
Parent
  .joins(:children)
  .where(children: { age: 0 })
  .distinct
  .select('parents.*, random() as rand') # <= !?
  .order(:name, 'rand')
```

select する要素に無理やり入れとけば怒られはしない。すごくバッドノウハウっぽい…
Tinkercad > geometry > ネジ山数20以上のISOメートルねじを用意する手順 > 3つ目の連結でずれが生じる

ブラウザ動作するAutoDeskのTinkercad。


ネジ山数20以上のISOメートルねじを用意する手順

1. ISOメートルねじを作成する
2. 手順1のオブジェクトをコピーする
3. 手順2のオブジェクトの垂直位置を以下の手順で「27.95」にする。
    - オブジェクトを選択する
    - 上矢印(下矢印)をクリックして上ドラッグ
    - 表示される垂直位置の数値を27.95にする

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/77e87fcc-0194-a857-0cbf-f98ed6c1f9fc.png)

これで手順2のオブジェクト(茶色)と手順1のオブジェクト(白色)の連結部分の違和感が少なくなる。

マウス操作では多少ずれる。

上記の手順を繰り返せば、全ねじをTinkercad上で作ることができる。

と思ったが、3つ目の連結でずれが生じた。
Ionic3 で Pipe を自作する

Ionic3でPipeを作ってViewから呼び出す方法です。
ググっても微妙に情報が足りなかったり、英語の記事ばかり出てくるので、まとめておきます。

__環境__

- Ionic 3.19.1

## `ionic`コマンドでPipeを作成

```bash
$ ionic g pipe example
```

以下のファイルが生成されます。

```
src
└ pipes
   ├ pipes.module.ts
   └ example
     └ example.ts
```

プロジェクト内で初めてPipeを作るときのみ、`pipes.module.ts`も一緒に生成されます。

```typescript:src/pipes/pipes.module.ts
import { NgModule } from '@angular/core';
import { ExamplePipe } from './example/example';
@NgModule({
  declarations: [ExamplePipe],
  imports: [],
  exports: [ExamplePipe]
})
export class PipesModule {}
```

## Pipeをカスタマイズする

目的に合わせてPipeをカスタマイズします。

クラス内の`transform()`関数の返り値が、Pipeから返ってくる文字列になります。
どんな文字列を投げても`'example'`に変換するPipeを作りたければ、以下のように修正します。

```typescript:src/pipes/example/example.ts
import { Pipe, PipeTransform } from '@angular/core';

/**
 * Generated class for the ExamplePipe pipe.
 *
 * See https://angular.io/api/core/Pipe for more info on Angular Pipes.
 */
@Pipe({
  name: 'example',
})
export class ExamplePipe implements PipeTransform {
  /**
   * Takes a value and makes it lowercase.
   */
  transform(value: string): string {
    return 'example';
  }
}
```

## PageでPipeを使う

使用したいPageの`*.module.ts`に、Pipeをimportします。

例えば`Home`というページで使用する場合、`src/pages/home/home.module.ts`を編集します。

```typescript:src/pages/home/home.module.ts
import { NgModule } from '@angular/core';
import { IonicPageModule } from 'ionic-angular';
import { HomePage } from './home';

import { PipesModule } from '../../pipes/pipes.module';

@NgModule({
  declarations: [
    HomePage,
  ],
  imports: [
    IonicPageModule.forChild(HomePage),
    PipesModule,
  ],
})
export class HomePageModule {}
```

importするのは `ExamplePipe`ではなく、Pipeをまとめている`PipesModule`です。

あとはHTML内でPipeを呼び出すだけです。
呼び出し時は、`@Pipe`アノテーション内の`name`に設定した文字列を使用します。

```html:src/pages/home/home.html
...
<div class="foo">
  {{'hello' | example}}
</div>
...
```
Vim で TypeScript のカラースキーマに対応する

## はじめに

vim で TypeScript ( *.ts とか *.tsx ) を開いたところテキストファイルのように単色表示されたので、それを解決した際の備忘録です。

## 解決法
[Vim Awesome](https://vimawesome.com/?q=typescript) で軽く見たらこちらのプラグインの Star が多かったのでこちらを採用。
repo: https://github.com/leafgarland/typescript-vim

1. [プラグインマネージャー](https://qiita.com/tanabee/items/e2064c5ce59c85915940)に Vundle を利用している場合、.vimrc に以下を追記。

```vimscript
Plugin 'leafgarland/typescript-vim'
```

2. 以下のコマンドを実行する。

```bash
$ vim +PluginInstall +qall
```

<img width="658" alt="スクリーンショット 2018-03-02 12.36.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/19698/0fc87f3b-9d42-4970-2ac3-e2beca6736cf.png">

こんな感じになりました！カラースキーマは [Solarized](http://ethanschoonover.com/solarized) dark 利用です。

以上です。

## 関連記事

- [意外と知らない Vim でできること](https://qiita.com/tanabee/items/a9e80aeee4261501bdd6)
- [Vim におけるプラグイン管理についてまとめてみた](https://qiita.com/tanabee/items/e2064c5ce59c85915940)
- [https://qiita.com/tanabee/items/8675580c07c58a3db990](https://qiita.com/tanabee/items/8675580c07c58a3db990)
Tinkercad > Ubuntu 16.04 LTS + firefox > error > タブがクラッシュしてしまいました。

ブラウザ動作するAutoDeskのTinkercad。

```txt:動作環境
Ubuntu 16.04.3 LTS desktop amd64
Firefox Quantum v58.0.2 (64 ビット)
Google Chrome バージョン: 64.0.3282.140（Official Build） （64 ビット）
```

Tinkercadの編集をしようとデザインを開くと以下のエラーとなった。

>タブがクラッシュしてしまいました。
>ご迷惑をおかけして申し訳ありません。
>[このタブを復元する] を選択するとページを再読み込みします。
...

Firefox Quantumでは使用できない。

Google Chromeでは問題なくどうした。
Tinkercad > names > ViewCube > Viewを操作する左上のボックス | 名称の掲載されたPDF

ブラウザ動作するAutoDeskのTinkercad。

左上にあるViewを操作するボックスの名称が不明だった。

![8guJOLuMzYhlvQ1cKu9R1g.png](https://qiita-image-store.s3.amazonaws.com/0/32870/0ebb2ac1-a90d-5d84-8dba-76849ec03355.png)


[forumで聞いてみた](https://support.tinkercad.com/hc/en-us/community/posts/360000813347-the-name-of-the-box-in-upper-left)。

ViewCubeという名称のようだ。

ViewCubeという名称をきっかけとして以下のPDFを見つけた。
https://www.tinkercad.com/img/tinkercad_beta_guide.pdf

これに他の機能の名称も載っているだろう。

ベータ版の資料なので、正式版と違う名前がある可能性はある。
css文字数の節約

### 読み込み時間は文字数に関連するのでminifyするに関わらず少ない方が良い。
wildcardでまとめる。

```css
/*[for="flg-title"]
,[for="flg-mes"]
,[for="flg-hide"]
,[for="flg-auth"]
,[for="flg-list"]
,[for="flg-imgur"]{color:red}*/
[for*="flg-"]{color:red}
```
```html
<label for="flg-title">title</label>
<label for="flg-mes">mes</label>
<label for="flg-hide">hide</label>
<label for="flg-auth">auth</label>
<label for="flg-list">list</label>
<label for="flg-imgur">imgur</label>
```
### 背景はcenter&coverが多い
```css
*{
 font-family: 'Armata',meiryo,sans-serif;
 background-repeat:no-repeat;
 background-position:center;
 background-size:cover;
}
```
レインボーLEDテープ

#概要

オークションでレインボーLEDテープを買ってみた
ws2811でなかった。
R,G,Bが単体で付いてる。しかも、印刷と合わない。
whiteは、無理。
端子は、VDD,R,G,B。
明るさは、PWM。
電圧、電流は、12V,1A程度。
電池は死んでた。

#動作動画
flash
https://www.youtube.com/watch?v=ebxUIXKhMRY
strobe
https://www.youtube.com/watch?v=M_A7vnxRqf0
fade
https://www.youtube.com/watch?v=1aY1yfJF2FE
smooth
https://www.youtube.com/watch?v=z0fqr4TzKLI

以上。
eve-ng 導入メモ

eve-ngにCiscoのトポロジーをインストールする手順メモ。

## installing eve-ng
- まずここからOVAをDLします。ファイル名の拡張子がOVFになっててVMWare　Fusionにうまくインストールできなかったので手動でOVAに変えたらうまくいきました。

http://www.eve-ng.net/index.php/downloads/eve-ng

## setup eve-ng
- MACの場合、StaticでIPアドレス振るとインターネットに抜けられないようです。以下の手順を実施したらeve-ngからインターネットにアクセス可能になりました。

https://medium.com/upinatoms-com/sharing-a-network-between-your-vmware-fusion-linux-guest-and-your-mac-os-x-host-70d98271f142


- network adaptorを追加（1つ目のアダプタはNATモード、2つ目のアダプタはホストオンリー）
- MACアドレスを生成してメモしておく
- DHCP　Rangeを避けたIPアドレスでDHCPサーバとして決定


```
例）
host eve {
    hardware ethernet 00:50:56:24:D3:92;
    fixed-address 172.16.57.2;
    option domain-name-servers 8.8.8.8, 8.8.4.4;
}
```
- eth1をmanualに、pnet1をDHCPに。

```
# The primary network interface
iface eth0 inet manual
auto pnet0
iface pnet0 inet dhcp
    bridge_ports eth0
    bridge_stp off

# Cloud devices
iface eth1 inet manual
auto pnet1
iface pnet1 inet dhcp
    bridge_ports eth1
    bridge_stp off
```

参考：DHCPの設定　http://blog.opensquare.jp/?p=1607

- ホスト名でGUIアクセスできるようになりました。

## setup iol environment

- 次に以下の手順を実施します。

http://www.eve-ng.net/index.php/documentation/howto-s/62-howto-add-cisco-iou-iol

```
cd　/opt/unetlab/addons/iol/bin/
/opt/unetlab/wrappers/unl_wrapper -a fixpermissions
```

- 次に以下のファイルを作成してPython実行。

https://gist.github.com/paalfe/8edd82f780c650ae2b4a

```
python2.7 CiscoKeyGen.py
```

- 出力されるechoコマンドを実行。

```
echo -e '[license]\neve-ng = xxxxxxxxxxxxxx;' | tee $HOME/.iourc
```

※ この $HOME の部分を /opt/unetlab/addons/iol/bin に置き換えました。

## installing a topology (iol)
- eve-ng GUI MenuからLabトポロジーをインストール

## installing a client module
- 手順通りインストールすればOKです。

参考　http://www.eve-ng.net/index.php/downloads/linux-client-side
参考　http://www.brianlinkletter.com/how-to-set-up-the-eve-ng-network-emulator-on-a-linux-system/

## MAC userはtelnetが使えるようにする

- 特に、high sierra の場合はSIPを無効にしてtelnetを/usr/binにコピーが必要です。

参考　https://qiita.com/samuraidays/items/b8a3d4a06e2c6c379865
参考　https://applech2.com/archives/20170626-apple-remove-telnet-cmd-on-high-sierra.html
参考　http://eve-ng.net/forum/viewtopic.php?f=3&t=1155

## wiresharkが動くようにする
- この時、ホスト名にハイフン(-)があるとうまく動かないようです。

参考　http://www.eve-ng.net/forum/viewtopic.php?f=6&t=702&p=2392&hilit=wireshark#p2392
vue-cli 3.0 でTypeScriptのプロジェクトを作ったらVeturがうまく動かなかった

# 概要
`vue-cli`の3.0がbetaですが利用できるようになりました。
cliでTypescriptのプロジェクトが作成できる便利さにさっそく作ってみたのですが、Veturに怒られたので対象法を書きます。

# この現象の発生条件
* `vue-cli 3.0.0-beta` (vue create でプロジェクト作成)
* オプションで`TypeScript`を利用
* ` Use class-style component syntax?` に `Y` と回答(class-styleでコンポーネントを書く)
* Veturを拡張機能で利用している

# 発生すること
`HelloWorld.vue`でVeturのチェックでエラーが発生します。

```ts:HelloWorld.vue
export default class HelloWorld extends Vue {
  // msg! の　'!' がsyntax errorになります
  @Prop() private msg!: string;
}
```

# 原因
TypeScript2.7.1で変数末尾に`!`をつけることで厳密化した
初期化チェックを割愛できるようになったのですが、Veturの
TypeScriptのバージョンが対応できてないことが原因です。

TypeScript2.7.1の変更点はこちらを参考にさせていただきました。
>https://qiita.com/vvakame/items/3a1e628e53a5dd99dfe0

# 対処法
VeturのGithub Issueに上がっていたので対応方法を記載します。
簡単に言うと、インストールしたVeturのTypeScriptバージョンを上げようぜってことです。

コンソールで、VSCodeのExtensionのディレクトリを開きます。
`.vscode\extensions\octref.vetur-0.11.7`

```
yarn upgrade typescript@latest
cd ./server
yarn upgrade typescript@latest
```

これでVSCodeでのVeturのエラーが消えます。
ちなみに、本件のIssueは以下になります。
> https://github.com/vuejs/vetur/issues/682
Railsチュートリアル 第１１章の実装で、herokuのアドオンとしてSendGridが利用出来なかった話

herokuのアドオンとしてSengGridをインストール出来なかった話
-
ちょっとしたトラブルかつ日本語で似たような記事が見当たらなかったので一応記事に残しておこうかと

###この記事が参考になるのでは？と思う対象者は以下の通りです。
最近、<b>Railsチュートリアル</b>を始めた方
最近、<b>heroku</b>にアカウントの新規登録をした方
herokuのアドオンとして<b>SendGrid</b>の利用を考えている方
<b>herokuのアカウント登録にgmail</b>を使っている方
<b>よくわからないけどherokuでSendGridインストール出来ないんだけど？？</b>な方

==============================


基本的には様々なサイトやブログなどの記事に書いてある通り、
自分の所有するクレジットカード情報をherokuに登録すれば問題なくアドオンを利用できます。

しかし稀に
###クレジットカード情報登録したのにインストールできない！

ということがあるようで
>The account "\*\*\*\*@email.com" is not permitted to install the sendgrid add-on at this time. 
If you believe this is an error please contact support and reference ID *\*\*\*-*\*\*\*-*\*\*\*-*\*\*\* when opening an ticket.

といったメッセージログを返されてしまいます。

内容をざっくり訳すと
>このメールアドレスのアカウントはSendGridを使用する許可が下りてないですよ。
そんなことない！って思うなら一応サポートに連絡してきてね

とのこと
※というより、ここで自分は誤解してた可能性が、これって
このメールアドレスのアカウント、ではなくこのアカウントのメールアドレスは
という意味なのでは...

そんなこんなで私はハマりました
で、**少し待てばアクティベートメールのようなものが届くのカナー？**
とか思って待ってみたり
**反映されるまでに少し時間かかるのカナー？**
と思って待ってみたり

いややっぱおかしいよなぁ？と疑いながら
色々と参考になりそうな記事やヘルプを探してみるのだけれど
私の検索能力が乏しいのと、英語能力が乏しいのとで悲しいことに詰んでしまった
というか、ぶっちゃけ何が原因なのか見当もつかずに途方に暮れてしまった
でも一応探してみても類似する記事が見当たらないわけだし
よくよく考えてみればさっさとサポートに問い合わせたらいいじゃないかと気づいたので尋ねてみることに

するとすぐ返事がきました。

#####herokuサポートさんが仰るに
>It looks like your account was flagged by our anti-spam protections by mistake. This blocked your ability to add email add-ons your apps. That happens sometimes with new accounts. I have unblocked your account. Please try again and get back to us if you still have an issue.

ということらしく、ざっくり訳すと

>不具合により迷惑メール防止機能にあなたのメールアドレスが引っかかっていました。
そのせいで、電子メールサービスのアドオンサービスを受けられない状態になっていました。
最近新規登録された方の中で稀にこういった事例が発生しています。
とりあえず今こちらで確認とって解除しておきましたので確認してみてください。

ということらしい
えー、そんなこと...

ちなみに私の登録していたメールアドレスはそんな複雑というわけでもない簡単な文字列の、普通のgmailです。

まぁ、別に文句が言いたい訳でもなくそういうこともあるんだろうなぐらいに受け止めたのですが
一応私自身謎のメッセージに悩まされ疲弊した割になんてことのない理由だったわけですし
不思議と日本語での記事が見当たらなかったので、今後同じ事態になってしまった方がすぐ対処できるよう書き留めておくことにしました。

#####最後に
今回のことでこちらが解決に向けて対処出来たことといえば、真っ先にサポートに連絡することぐらいだったので
もし私と似たログが出てハジかれた方は真っ先にサポートに問い合わせるのが良いでしょう。

#####補足
未確認ではありますが
もしメールアドレスを複数所有しているのであればサポートに連絡する前にアカウントに登録しているメールアドレスを変更してみても回避できるのかもしれませんね。