OmniAICreator/Qiita-1.07M huggingface dataset:
Google Hangouts ChatのBotの実装

GASを使ったGoogle Hangouts ChatのBot作ってみた続き

> Google Hangouts Chat のBot作ってみた
> https://qiita.com/yotsua/items/80961f159f2528fd6799

公式リファレンスとサンプルスクリプトを読み解いた


# サンプルスクリプト分析

```javascript
/**
 * Responds to a MESSAGE event in Hangouts Chat.
 *
 * @param {Object} event the event object from Hangouts Chat
 */
function onMessage(event) {
  var name = "";

  if (event.space.type == "DM") {
    name = "You";
  } else {
    name = event.sender.displayName;
  }
  var message = name + " said \"" + event.message.text + "\"";

  return { "text": "hogehoge" };
}

/**
 * Responds to an ADDED_TO_SPACE event in Hangouts Chat.
 *
 * @param {Object} event the event object from Hangouts Chat
 */
function onAddToSpace(event) {
  var message = "";

  if (event.space.type == "DM") {
    message = "Thank you for adding me to a DM, " + event.user.displayName + "!";
  } else {
    message = "Thank you for adding me to " + event.space.displayName;
  }

  return { "text": message };
}

/**
 * Responds to a REMOVED_FROM_SPACE event in Hangouts Chat.
 *
 * @param {Object} event the event object from Hangouts Chat
 */
function onRemoveFromSpace(event) {
  console.info("Bot removed from ", event.space.name);
}
```

### `onMessage`メソッド

ダイレクトメッセージか、@付きのメンションがBotに送られたときに呼び出される。

### `onAddToSpace`メソッド

Botをチャットルームに追加したときに呼び出される。

### `onRemoveFromSpace`メソッド

Botをチャットルームから削除したときに呼び出される。

## 引数

Botに対して上記3種類のアクションを行ったとき、Event型のeventが引数として渡される。
サンプルでは`event.space.type`や`event.user.displayName`を参照してメッセージを作っているのが分かる。

Eventのフィールド構成は以下の通り。シンプルで分かりやすい。

<img width="527" alt="キャプチャ.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/198128/a49f9452-704c-8403-51a0-41a79b9c468f.jpeg">

> https://developers.google.com/hangouts/chat/reference/message-formats/events

引数eventのフィールドを探っていくことで、メンション送った人の名前とか、メッセージ送った人のメールアドレスとか分かる。

## 戻り値

戻り値はjson形式で、現在サポートされているフォーマットは2種類。

### Simple Messages

```json
{
  "text": "Your pizza delivery is here!"
}
```
サンプルで使われているのはこっち。
シンプルに`text`のvalueを返してあげると、Botがそれをメッセージしてくれる。

### Card Messages

例えば

```json
{
  "cards": [
    {
      "header": {
        "title": "Pizza Bot Customer Support",
        "subtitle": "pizzabot@example.com",
        "imageUrl": "https://goo.gl/aeDtrS",
        "imageStyle": "IMAGE"
      }
    }
  ]
}
```

このフォーマットで返すと、カード型のオブジェクトをチャットルームに送れる。

<img width="433" alt="キャプチャ2.JPG" src="https://qiita-image-store.s3.amazonaws.com/0/198128/e3311486-b056-add4-a995-ddcde636e11b.jpeg">

カードを複数枚同時に送ることも可能

```json
{
  "cards": [
    {
      "header": {
        "title": "Pizza Bot Customer Support",
        "subtitle": "pizzabot@example.com"
      }
    },
    {
      "header": {
        "title": "Burger Bot Customer Support",
        "subtitle": "burgerbot@example.com"
    }
  ]
}
```

> https://developers.google.com/hangouts/chat/reference/message-formats/cards

これ使うとかなり幅が広がりますね。
上記の公式ガイドにも例がたくさん載っているので参考に。

# APIでいろいろできそう

GoogleAppsScriptを使えば、豊富なGoogleAppsのAPIが超手軽に使えるので、GmailやGoogleCalendar、GoogleMapsなんかと連携していろいろ遊べそう。

初めてGAS使いましたが、簡単で楽しいのでいろいろ作っていこうと思います。

# 参考


> Hangouts Chat Developer Reference Documentation
> https://developers.google.com/hangouts/chat/reference/
Hyperで楽しい開発環境を！

# はじめに
今更ですが、友人におすすめのコマンドプロンプトを聞かれたので紹介しますw

# Hyperとは
JSで簡単に拡張できるターミナルです。
Google拡張機能のような手軽さで、自分好みの開発環境を簡単に構築できます。
Electron、React、Reduxで作られているそうです。
※ただ日本語対応していないので、日本語入力すると挙動おかしくなりますw

![hyperyellow.gif](https://qiita-image-store.s3.amazonaws.com/0/105093/fe28a2ea-2721-28d7-81c4-5ed097c34071.gif)

# インストール方法
[公式サイト](https://hyper.is/)で、簡単にインストールできます。
またコマンドでもインストール可能です。

```
$ brew update
$ brew cask install hyper
```

[Githubはこちら](https://github.com/zeit/hyper)

# プラグイン例
## hyper power
花火みたいになります。見てるだけでとても楽しいですねw

![13c9bfe6-4905-11e6-8fe4-baf8fc8d9293.gif](https://qiita-image-store.s3.amazonaws.com/0/105093/ea10fb55-36f1-fc8b-6022-0d24e9cb5563.gif)

[Githubはこちら](https://github.com/zeit/hyperpower)

**設定ファイルを開く**

方法①：Hyper > Preferencers
<img width="210" alt="スクリーンショット 2018-04-05 19.44.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/105093/ab1f0a59-ba01-b6ba-c842-3c4b61361935.png">

方法②：hyper上で ```⌘,```

方法③：```$ vi .hyper.js```

**```'hyperpower'``` を追記する**

```js
  plugins: [
    'hyperpower'
  ],
```

ちなみに、 ```$ wow``` で虹色になります。
もう一度、 ```$ wow``` するとピンク色に戻ります。

## Hyper Pokemon
![screen.png](https://qiita-image-store.s3.amazonaws.com/0/105093/e44c60d0-98d2-37b2-de1a-1e146c187659.png)

先程と同様に。
ただ2つ以上のプラグインを利用する際は、末尾に ```,``` を忘れずに！

```js
  plugins: [
    'hyperpower',
    'hyper-pokemon'
  ],
```

背景をミューツーにできたり、ポインターをフシギダネにできたり、色々できます。
いらない機能はコメントアウトしましょう。重くなりますのでw

```js
    pokemon: 'random', // Define your favorite pokemon theme
    pokecursor: 'true', // Activate your theme's pokecursor
    pokemonSyntax: 'dark', // Define the color of the terminal tabs
    unibody: 'false' // Define the color of the Hyper window header
    poketab: 'true' // Deactivate your theme's poketab
  },

  plugins: [
    'hyper-pokemon'
  ],

```

現在、[152ポケモン](https://klauscfhq.github.io/hyper-pokemon/)に対応しています。
<img width="1053" alt="スクリーンショット 2018-04-05 19.33.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/105093/0e3d49c0-7a6e-fc95-92a7-4636b369a239.png">

[Githubはこちら](https://github.com/klauscfhq/hyper-pokemon)

# 参考記事
[爆速でターミナルをポケモンにする](https://qiita.com/chanuu/items/b5c3d11e089ad0c7356d)
matplotlibの文字化け解消(明朝体の追加)

## 環境
mac
python3

python3付属のvenvで仮想環境を構築

## 手順
### フォントファイルのダウンロード

[IPAexフォント](https://ipafont.ipa.go.jp/node26#jp)

このサイトから`ipaexm.ttf`をダウンロードし、これを
`/仮想環境名/lib/python3.6/site-packages/matplotlib/mpl-data/fonts/ttf/`に移動



### matplotlibrcのコピー
`/Users/your_name/.matplotlib/`に、

`/仮想環境名/lib/python3.6/site-packages/matplotlib/mpl-data/matplotlibrc`をコピー

### コピーしたmatplotlibrcに追記

```python
font.family : IPAexMincho
```

上記コードを追加
C#でJWTのデコード・検証を行う

やんごとなき事情により他所で作成した JWT のデコード・検証を行う必要があった為、やり方をメモ。

他所で作ったJWTをデコードして〇〇のエントリを抜いて使うという設計は一度始めてしまうとJWTの内容に依存する形になってしまう為ロクな事にならない予感しかしない。昔良くあった「IDの〇桁目がNなら～」みたいな仕組みに通じるものを感じる。

```cs
var tokenValidationParameters = new TokenValidationParameters {
    ValidateIssuerSigningKey = true,
    IssuerSigningKey = SigningCredentialsProvider.GetVerificationKey(),

    ValidateIssuer = true,
    ValidIssuer = Issuer,

    ValidateAudience = true,
    ValidAudience = Audience,

    ValidateLifetime = true,
    ClockSkew = TimeSpan.Zero
};
var tokenHandler = new JwtSecurityTokenHandler();

JwtSecurityToken jwt = tokenHandler.ReadToken(token) as JwtSecurityToken;
return tokenHandler.ValidateToken(token, tokenValidationParameters, out SecurityToken securityToken);
```

* TokenValidationParameters.ValidateXXXX フラグでJWTのどこをバリデーション対象にするか選択可能
* 検証に失敗すると例外(SecurityTokenInvalidXXXXException)が発生する
* ValidateToken() の戻り値 ClaimsPrincipal の Claims にJWT各エントリが詰められているので後で取り出して使用できる
* サンプルでは共通鍵を使ってますが秘密鍵/公開鍵を使う場合は SigningCredentialsProvider を別に実装してください

サンプルソースは[こちら](https://github.com/yossy6954/JwtCreateAndValidate)。
アドレスバーからPOSTする

アドレスバーからPOSTする

```
javascript:var form = document.createElement('form');document.body.appendChild(form);form.setAttribute('action', 'URL');form.setAttribute('method','POST');form.submit();
```
※URL に URLを入力。パラメータを付ける場合?を使う。
※コピペすると何故か、javascript: が省略されたりする。
[phina.js] 画像の色を変える方法(マスク)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/60690/f565945b-5aae-850b-8fb2-1d86e38d8e89.png)

## 画像の色を変える関数を作る

```js


// 画像マスク用の関数を定義
function maskImage(imageKey, color, distKey) {
  var original = AssetManager.get('image', imageKey).domElement;
  
  // 画像生成用にダミーのシーン生成
  var dummy = DisplayScene({
    // 元画像と同じサイズにする
    width: original.width,
    height: original.height,
    // 背景色を変更したい色にする
    backgroundColor: color,
  });
  
  var originalSprite = Sprite(imageKey).addChildTo(dummy);
  
  // 描画の位置を変更
  originalSprite.setOrigin(0, 0);
  // 描画方法をマスクするように変更
  originalSprite.blendMode = 'destination-in';
  
  // シーンの内容を描画
  dummy._render();
  
  // シーンの描画内容から テクスチャを作成
  var texture = Texture();
  texture.domElement = dummy.canvas.domElement;
  if (distKey) {
    AssetManager.set('image', distKey, texture);
  }
  return texture;
}

```

### 使い方

`AssetManager` に 追加してから、使うか、直接テクスチャとして使えます
`maskImage(色を変えたい asset, 変更後の色, 新しい asset の名前)`

```js

// あらかじめ読み込んである 'kumo' という画像から　'青いくも' という asset を生成
maskImage('kumo', 'blue', '青いくも');
Sprite('青いくも').addChildTo(this);

// 直接テクスチャとして使う
var texture = maskImage('kumo', 'pink');
Sprite(texture).addChildTo(this);

```

## 処理の流れ

1. 処理したい画像と同じサイズの画像処理用のシーンを作成
2. シーンの背景色を変更したい色に設定する
3. シーンに色を変えたい画像をSpriteで追加する
4. Spriteの `blendMode` を `destination-in` にする
5. シーンの `_render()` メソッド呼び出し
6. シーンの `.canvas.domElement` から `Texture` を生成
7. `distKey` があれば、新しく `AssetManager` にセット
8. 生成した `Texture` を返す

画像の生成方法についてはこちらの記事でも説明してます
[phina.jsのShapeを複数まとめて画像として使う - Qiita](https://qiita.com/simiraaaa/items/7355ed8037ebd7d99bcb)

## サンプル

https://runstant.com/simiraaaa/projects/phina_js_image_mask
Getting cross point in python

```python
def getCrossPoint(s1, s2):
  base = s2[1]-s2[0]
  d1 = np.linalg.norm(np.cross(base,s1[0]-s2[0]))
  d2 = np.linalg.norm(np.cross(base,s1[1]-s2[0]))
  t = d1 / (d1+d2)
  return s1[0] + (s1[1]+s1[0])*t

n = input()
for i in range(n):
  a = []
  a.append(map(int, raw_input().split()))
  for aa in a:
    hn = np.array(aa).reshape(4,2)
    s1 = np.array([hn[0],hn[1]])
    s2 = np.array([hn[2],hn[3]])
    gcp = getCrossPoint(s1,s2)
    out = ""
    for x in gcp:
        if (out):
            out = out + " " 
        out = out + str(x)
    print(out)
```

```
3
0 0 2 0 1 1 1 -1
1.0 0.0
0 0 1 1 0 1 1 0
0.5 0.5
0 0 1 1 1 0 0 1
0.5 0.5
```

# Refs.
* [str](http://uxmilk.jp/12381)
MySQLでカタカナがうまくソート出来ない場合の解決策

# 環境
- MySQL5.1.73

# 症状
カタカナを登録してあるカラムでソートしてみると、なぜか期待通りアイウエオ順に並ばない。「ア」の前に「ベ」が来たりしてしまう。
カラムの情報は普通にこんな感じ。

```
`name_kana` varchar(255) DEFAULT NULL
```
DBは以下。

```
ENGINE=InnoDB CHARSET=utf8
```

# やりたかっとこと
単にカタカナのアイウエオ順にしたかっただけです…


# 原因と解決策
原因は、カラムの照合順序が utf8_general_ci だったため。みたい。
カラムの照合順序を utf8_unicode_ci に変更したら治りました。
なぜかは……よく分かってません……(´・ω・`)
どなたかご存知の方居たら教えてください。
【tutorial】Eclipseをダウンロード→Javaでアプリケーションを動かす（Pleiades）

2018/4/5に実施。面倒なのでPleiades。
　Pleiades All in One は Windows、Mac 向けに Eclipse 本体と日本語化を行うための
　Pleiades プラグインおよびプログラミング言語別に便利なプラグインをまとめたパッケージです。

１．ダウンロード。今回は「Eclipse 4.7 Oxygen」。
http://mergedoc.osdn.jp/
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/f6e26bc1-852d-bcbe-1998-fef679624f0a.jpeg)

２．Editionを選択。今回は「Java」「Full Edition」。
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/7480235b-312e-9559-e6e5-bbb78b6fd722.jpeg)

３．ダウンロードしたファイルを解凍。
　　解凍先のディレクトリが深いと「パスが長すぎます」とか言われるので、Dドライブ直下に解凍。

４．「D:\pleiades\eclipse」のeclipse.exeを実行。

５．何も考えずに「起動」をクリック。
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/b3fd7eb1-2285-e03d-caf8-03d0237b4232.jpeg)

６．「ファイル」→「新規」→「Javaプロジェクト」をクリック。
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/8f5b5b0a-439a-0080-d44e-a7d1e0d8a0fe.jpeg)

７．プロジェクト名を適当に入力して、「完了」をクリック。今回は「project」。
![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/83f33672-e148-f7bd-7b6a-084d082a82a7.jpeg)

８．パッケージ・エクスプローラーに「７．」で入力した名前のプロジェクトが出来ているので、
　　「src」を右クリックして、「新規」→「クラス」をクリック。
![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/3b1ce445-d390-e5a2-13bd-6b035eedd467.jpeg)

９．名前の欄を適当に入力。今回は「main」。
　　「public static void main(String[] args)(v)のチェックボックスをONにして「完了」をクリック。
![7.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/6de51e40-41ee-a776-7515-8c3f58772b26.jpeg)

１０．パッケージ・エクスプローラーに「１０．」で入力した名前のファイルが出来ているので、ファイルをダブルクリック。
![8.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/0bf1b393-4468-7b2c-6a1b-0a0af4f23e30.jpeg)

１１．ファイルの中身はこんな感じ。
![9.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/242e31fc-8132-9f74-13e0-01531185e0f8.jpeg)

１２．コードを編集。（3行目・9行目）

```
3行目に追加　import javax.swing.JOptionPane;
9行目に追加　JOptionPane.showMessageDialog(null, "hello world");
```

![10.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/506f00fa-a7f9-6189-78d9-911ea993f028.jpeg)

１３．パッケージ・エクスプローラーでファイルを右クリック。「実行」→「Javaアプリケーション」をクリック。
![11.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/db2a261c-10e9-f8d0-ec1e-6c7270d0f660.jpeg)

１４．ダイアログが表示される。
![12.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/6409973c-95a0-1837-d16a-57d14bafce10.jpeg)

終わり。
togglApiを使って日報を書く

## はじめに
togglで日報を書く＆業務時間の管理を試みます。
よくPythonを使用してtogglApiを叩いている方を見るのですがphpは見たことがないので今回やってみます。

## 必要なもの 
[togglアカウント](https://toggl.com)
php実行環境

## プログラム

[続きはこちらへ移転しました!](https://se-taisei.com/items/php/toggl)
version管理できる

ウェブ上で、簡単にJavaScriptのデバッグができるサイトがあります。
https://playcode.io

このサイトは、googleやGitHubのアカウントで、簡単にアカウントを作る事ができます。
アカウントを作るというか、ログインして直ぐに製作できます。

![スクリーンショット 2018-04-05 18.32.39.png](https://qiita-image-store.s3.amazonaws.com/0/20977/2084d82a-9d78-a905-d5f4-401a87e29033.png)
この画像のように、versionの管理ができるのは、すごいと思います。

テストするときのURLも、プロジェクト名で簡単に発行されます。
ソースコードのシェアも、簡単です。
![スクリーンショット 2018-04-05 18.44.16.png](https://qiita-image-store.s3.amazonaws.com/0/20977/7d8dad40-4a60-886e-7900-e6ebb63b6809.png)

パソコンの他に、スマホやタブレットなどで、簡単に製作や修正ができるので、私も活用しています。
【jQuery】動的に生成したオブジェクトのクリックイベント

動的に生成したオブジェクトにはイベントハンドラがないので

```javascript
$('#new-object').click(function()
{
    //何かしらの処理
}
```
とかやっても反応してくれません。

これを解決する方法は２つ

```javascript
$('#parent-object').append($('#new-object').click(function(){doSomething()}));
```

```javascript
$(document).on("click", "#new-object", function(){
    doSomething();
});
```
前者はオブジェクトの生成と同時にハンドラを生成するという方法だそうで、
後者はオブジェクトでなくドキュメントのハンドラを利用する、という違いがあるみたいです。

どっちがいいのかよくわかりませんが、前者のほうがオブジェクトそのもののハンドラを使ってるので素直な気がします。
Git Addを対話式でやる


```bash
$ git add -i
           staged     unstaged path
  1:    unchanged        +4/-4 sample-project/src/main/java/sample/Sample.java

*** Commands ***
  1: status	  2: update	  3: revert	  4: add untracked
  5: patch	  6: diff	  7: quit	  8: help

What now> 2
#ここで何を実行したいかを選ぶ。

           staged     unstaged path
  1:    unchanged        +4/-4 sample-project/src/main/java/sample/Sample.java
  
Update>> 1
#対象のファイルを選ぶ
  
           staged     unstaged path
* 1:    unchanged        +4/-4 sample-project/src/main/java/sample/Sample.java

Update>> 
#ファイルを選んだらそのままエンター

updated one path

*** Commands ***
  1: status	  2: update	  3: revert	  4: add untracked
  5: patch	  6: diff	  7: quit	  8: help
What now> 1
#Statusでファイルの状態を確認

           staged     unstaged path
  1:        +4/-4      nothing sample-project/src/main/java/sample/Sample.java

*** Commands ***
  1: status	  2: update	  3: revert	  4: add untracked
  5: patch	  6: diff	  7: quit	  8: help
What now> 7

#処理を終わる。
Bye.
```

あとは、いつも通りCommit/Pushで終わり。
複数ファイルの操作と、対象外にしたいファイルが存在する場合、revertする場合など、
結構便利です。
このWindowsUpdateをインストールメディアで

連日のように「WindowsUpdateが出来ない」「0x8XXXXXXXエラー」
「一日待っても終わらない」「xx％から進みません」
のような悲鳴がネット上から沢山聞こえてきます。
失敗を繰り返し、空き容量が足りないとか悪化させる場合もあります。
対応策の中に、KBxxxxxxx.msu をアップデートカタログからダウンロードして
ローカルでアップデートをする方法があります。
この方法でも、ウィルス対策ソフトが邪魔をしたりする事があるので
クリーンブートしてから行ってくださいとか手順が面倒です。

そこで、インストールメディアでアンインストールが出来るなら
アップデート（インストール）も出来るのでは？と試したら出来ました。
緊急手段？として使えるかも知れません。

やり方は
①　インストールメディアをＵＳＢメモリで作成。
　　※ ８ＧＢでＯＫ。
　　※ インストール先と同じＯＳで同じビット数で作成。
② 「X.cmd」と「C:\Windows\system32\CHOICE.exe」をＵＳＢメモリのルートにコピー。
 　　※ コピー先は、Setup.exe のある所です。
③　ダウンロードした「KBxxxxxxx.msu」をＵＳＢメモリのルートにコピー。
④　ＵＳＢメモリで起動して、言語選択画面で Shift + F10 を押します。
⑤　コマンドプロンプトが表示されたら「Ｄ：￥ｘ」（半角）と入力後、Ｅｎｔｅｒ。
 　　バッチが起動しなかったら「Ｅ：￥ｘ」、「Ｆ：￥ｘ」、「Ｇ：￥ｘ」のように
　　ドライブレターを変更して実行して下さい。
⑥　バッチが起動したら、ＯＳのドライブを聞かれるので「Ｃ」等を入力。
　　アップデートのインストールが行われます。
⑦　インストールが終わると、シャットダウン等を聞かれるので「Ｓ」を押す。

```bat:x.cmd
@echo off
SetLocal EnableDelayedExpansion

powercfg /? >nul 2> nul && call powercfg /s 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c

CLS
echo;★ ★ ★ KBxxxxxxx アップデートをインストールする （要：CHOICE.exe） ★ ★ ★
echo;
echo; Windows のあるドライブを探しています・・・
echo;

            Set        "Select_Drive= "
for                   %%D in ( C D E F G H I J K L M N O P Q Q S T U V W   Y Z ) do (
   if      exist      %%D:\ (
       if      exist "%%D:\Windows\system32\cmd.exe" (
              echo;【 %%D 】ドライブに cmd.exe が在ります。多分、これが OS の ドライブかも。
       )
       Call Set         Select_Drive=%%Select_Drive%%%%%%D
   )
)

echo;
echo;  [C,D,E]? のような選択肢が表示されたら
echo;
echo;  C を選択する場合、「 C 」キーだけ押して下さい。
echo;

"%~dp0choice"       /c %Select_Drive% /m "　OS のドライブを指定して下さい "
Call Set OSのドライブ=%%Select_Drive:~!errorlevel!,1%%

echo;
echo; USBメモリにあるアップデートをインストールします。

Dism /Image:%OSのドライブ%:\ /ScratchDir:%OSのドライブ%:\ /Add-Package /PackagePath:"%~d0:"

echo;

"%~dp0choice" /c SRT /m "更新終了。この後どうする？ シャットダウン：S、再起動：R、取り合えずこの処理を終わる：T "

if      !ERRORLEVEL! EQU 1                          Wpeutil         Shutdown
if      !ERRORLEVEL! EQU 2                          Wpeutil                    Reboot
```
![x.png](https://qiita-image-store.s3.amazonaws.com/0/98441/55872e13-97f2-4925-b273-390676d76ab8.png)
Laravelで、日本語を含む assertDatabaseHas や assertSeeText がエスケープされてしまう時

Laravel のテストを書いている時に、日本語（マルチバイト文字）はエスケープされてしまい、通るはずのテストが通らないという問題があった。

# 例

下記は通る。

```php
<?php

use App\User;
use Tests\TestCase;

class UserTest extends TestCase
{
    public function testCanCreateUser()
    {
        User::create([
            'name' => '太郎',
            'gender' => 'male',
        ]);
        $this->assertDatabaseHas('users', [
            'name' => '太郎',
            'gender' => 'male',
        ]);
    }
}
```

（通らないケースとして挙げたのに、実際に動かしたらこれは通った・・・なぜだろう・・？）

通らないケースは、下記のように JSON API を叩くテストを書くときに、自動的に日本語がエスケープされてしまう時。

```php
<?php

use App\User;
use Tests\TestCase;

class UserTest extends TestCase
{
    public function testUserProfileApi()
    {
        $user = User::create([
            'name' => '太郎',
            'sex' => 'male',
        ]);
        $this->actingAs($user)
            ->get('/api/me')
            ->assertSeeText('太郎');
    }
}
```

こうなる。

```js
1) UserTest::testCanCreateUser
Failed asserting that '{"name":"\u592a\u90ce","sex":"male"}' contains "太郎".
```

確かにエスケープされてしまっている。

# 解決策

json_encode してあげれば良い。

```php
<?php

use App\User;

//...
        $this->actingAs($user)
            ->get('/api/me')
            ->assertSeeText(json_encode('太郎');
// ...
```

`utf8_encode` でいいじゃん、と思うかもしれないが、自分の場合は駄目だった。この辺は `php.ini` で変わるのかもしれない。

他にも通らないことがあり（自分の場合はOAuth関連の処理を書いているときに通らなかった）、そういうときは `e('太郎')` を試してみると良いだろう。自分の場合はこれで解決した。


# 参考

中国語のサイトを含め探し回ったが、結局 Stack Overflow にあった。

https://stackoverflow.com/questions/49570725/laravel-5-assertseetext-and-html-entities

こういうマルチバイト関連の問題について調べる時に、中国語に堪能だと便利だろうな・・・。
まあ漢字を読めるだけで日本人は有利だろう。
html で pdf を表示する

Firefox と Chrome で表示されることを確認しました。

>width="100%" height="500" とwidth だけ% 表示にすると見やすくなります。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>PDF</title>
</head>
<body>
<h2>PDF</h2>
<object data="images/cities.pdf" width="100%" height="500"></object>
<p />
Dec/30/2023<p>
</body>
</html>
```

## ブラウザーでアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/512230c4-e69b-194c-d71b-f306d22e1f9f.png)


## 表示に使った PDF ファイルの確認

```bash
evince images/cities.pdf
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/8305d1ad-e75d-a25c-7b38-7f60a50bf0e6.png)
【tutorial】GitHubにリポジトリを作成→ローカルにクローン→ファイルを追加してコミット→プッシュ（GitBash）

2018/4/5に実施。

１．GitHubにリポジトリを作成。
https://qiita.com/d778980/items/a81568d5fbfcfad784ce
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/1ebdd772-e202-8135-c9f7-a6b2c7987d78.jpeg)

２．GitHubのリポジトリをローカルにクローン。
https://qiita.com/d778980/items/e356ba3f85b3cd4f09ca

３．GitBashを起動してローカルリポジトリに移動。今回はデスクトップ。

```
cd ~/Desktop
```

４．適当にファイルを作成。

```
touch newfile.txt
```

５．ステータスを確認。

```
git status
```

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/abaa9690-ab42-6742-36d2-5c70879d8d02.jpeg)

６．ファイルをGitの管理対象として追加。

```
git add newfile.txt
```

７．ステータスを確認。

```
git status
```

![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/04ebe78b-ae01-5340-133c-408e2a302832.jpeg)

８．コミット。

```
git commit -m 'add new text'
```

![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/be478f09-e41c-64ed-5a05-18a2fe8454a0.jpeg)

９．GitHubのリポジトリにはまだ追加されていない。
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/fd805f13-5328-b7c2-81a8-fe18bf2109fa.jpeg)

１０．GitHubのリポジトリにプッシュ。

```
git push
```

１１．GitHubのリポジトリに追加された。
![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/247425/2ec3b5e1-f336-660d-5910-b34d17a61fcd.jpeg)

終わり。
A content-wrapping, scrollable multiline UITextView with maximum size in Swift


##Conditions

Assume the following, common requirements:

- A UITextView with text appears at center of screen
- The textView height must adjust to fit the text height, but is scrollable if beyond a specified maximum height
- The textView width must adjust to fit the text width, up to a maximum width
- The textView must use center justified text if only one line, natural justified text other otherwise

##Solution

* Initialize the UITextView with the following properties

```swift
textView.translatesAutoresizingMaskIntoConstraints = false
textView.isScrollEnabled = true
textView.showsVerticalScrollIndicator = true
textView.setContentOffset(CGPoint(x: 0, y: 0), animated: false)
```


* Set the textView properties to multiline:

```swift
textView.numberOfLines = 0
textView.lineBreakMode = .byWordWrapping
```

* Set vertical content compression on the textView, with a value which is less than the default 1000:

```swift
textView.setContentCompressionResistancePriority(UILayoutPriority(rawValue: 500), for: UILayoutConstraintAxis.vertical)
```

* Put the textView inside a custom container view, and constrain their edges to be equal

* Set fixed constraints on the container width and height, so that they are no more than some fraction of a parent view size. These constraints will adopt the default priority of 1000, and are therefore prioritized ahead of constraints set by the textView content.

```swift
    NSLayoutConstraint(item: containerView,
                       attribute: .height,
                       relatedBy: .lessThanOrEqual,
                       toItem: parentView,
                       attribute: .height,
                       multiplier: containerSizeFraction, // e.g. 0.7
                       constant: 0.0),

```

* Override "layoutSubviews" of the container view to perform the remainder of the fitting - it will be called when adding the the UITextView to the container view. We summarize the fitting with the following lines:

First, ensure the textView is always showing the top line when its layout is rearranged.

```swift

override func layoutSubviews() {
        super.layoutSubviews()

    textView.scrollRectToVisible(CGRect(x: 0, y: 0, width: 1, height: 1), animated: false)
```

Then compute the textView size based its content

```swift
    let size = textView.sizeThatFits(CGSize(width: textView.contentSize.width, height: CGFloat.greatestFiniteMagnitude))
```

Constrain the textView width and height to size.width and size.height respectively. For each constraint, set the priority as:

```swift
    widthConstraint.priority = UILayoutPriority(rawValue: 750) }
    heightConstraint.priority = UILayoutPriority(rawValue: 750) }
```

Set the text alignment according to the current number of lines.

```swift
    textView.textAlignment = ( textView.contentSize.height >= font.lineHeight) ? .natural : .center
    textView.setNeedsDisplay()
```

It is helpful to briefly show the scroll indicator to highlight if the textView is now scrollable
   
```swift
    textView.flashScrollIndicators()
```
refile使い方

#インストール
**リファイルgem**

* ファイルのアップロード先を柔軟に設定できる
* 簡単に組み込める
* 画像のサムネイルを生成できる

**imagemagickインストール** 
`$ sudo apt-get update`
`$ sudo apt-get -y install imagemagick libmagick++-dev`

## gemに記述
```:Gemfile
gem "refile", require: "refile/rails", github: 'manfe/refile'
gem "refile-mini_magick"
```

 その後に`$ bundle install`

# 実装
## モデルにカラムを持たせる(image_id)

`$ rails g migration add_image_id_to_posts image_id:string`
`$ rails db:migrate`

## attachment(アタッチメント)メソッドを持たせる
image_idを持たせたモデルに`attachement :image`

```ruby:model/image_idを持ったモデル
class PostImage < ApplicationRecord

  attachment :image # ここを追加（_idは含めない）

end
```

## ファイルアップロードのフォーム
`<%= f.attachment_field :image %>`
カラム名は`image_id`でも`:image`を引数にする

## 画面に埋め込む
```
attachment_image_tag モデル名, :image, :fill, 横幅の数値(例: 100), 縦幅の数値, format: '拡張子名(例: jpg)' 
```
FileMakerServer16にDigiCertのEVマルチドメイン証明書を入れる

# 前提
## FileMaker の公式サイト「テスト済み証明書」について
FileMakerの公式サイトには、「テスト済み証明書」の一覧に DigiCert が公認証明書として記載されていません。
けれど使えるはず！　と思い、試してみたところ、無事に動作してくれました。よって、以下自己責任ということで。

[FileMaker Server 15 以降でのセキュリティ設定](https://support.filemaker.com/s/answerview?language=ja&anum=14741)


## DigiCert の EVマルチドメイン証明書
以下です。国内の代理店だと [RMSさん](https://rms-digicert.ne.jp/) が対応が親切で良いです。（といっても決して他が悪いとかではありません）

[EVマルチドメイン SSL/TLSサーバ証明書：DigiCert（デジサート）正規代理店 | 国内最安値](https://rms-digicert.ne.jp/service/ev-multi-domain-ssl.html)

既にこちらを取得して運用しているものとして話を進めます。取得していなかったら申請からおこなってください。もちろん、マルチドメインでの運用が想定されないのであれば、ただの EVSSL で良いと思います。
その他、SSL 関連の基礎は飛ばしていきます。

## 環境
今回用いた環境は以下です。

* FileMakerServer16（複数マシン展開はしない）
* WindowsServer2012
* IIS10


# FileMakerServer からCSRを発行する
まず、CSR を発行します。このマルチドメインは、公式ページに書いてあるワイルドカード証明書とは別モノなので、以下の手順で普通に発行してください。
なお、IISを触り慣れている場合、IISでCSRの発行をおこなってしまいがちですが、これだと途中で詰みます。FileMakerServerからの発行をおこないます。

* FileMakerServer の Admin Console を起動。
* データベースサーバー → セキュリティ を開く。
* 「データベース接続に SSL を使用する」にチェックを入れて、一度、「適用」ボタンを押す。
    * 【注意】公式の手順には書いていないけれど、これをしないと、「要求の作成」ボタンが enable 状態にならない。
* 「要求の作成」ボタンを押して以下の入力を進める。
    * 「ドメイン名」： hogehoge.fugafuga (実際にこのサーバで使うドメインを指定)
    * 「会社名」：日本語でもOKです。
    * 「プライベートキーのパスワード」：後で使うので忘れないように。
    * それ以外の情報は任意です。なくてもOK。
* 次のファイルが インストール先Path/FileMaker Server/CStore/ フォルダに生成される。
    * serverRequest.pem：これがCSRです。
    * serverKey.pem：証明書をインポートする際に必要なプライベートキーファイル。後で使う。
* 「ダウンロード」を押して serverRequest.pem を取得。


# RMS の担当者さんへ依頼
書くまでもなさそうな段ですが……

* 依頼は担当者さんへメールで連絡、上記 serverRequest.pem の中身を開いてコピーしてメールに貼付して送っています。ウチでは。
* しばらくすると、DigiCert 社から認証依頼メールが届くので、承認します。
* さらにしばらくすると、担当者からメールで CRT 含む各種一式送られてきます。その一式の中に、ルート証明書と中間証明書がなかったら、担当者にくださいとお願いしてください。


# FileMakerServer へのインポート
いよいよインポートです。その前に、ルート証明書と中間証明書とを連結させる必要があります。

## ルート証明書と中間証明書の連結
* 名前は分かりやすければ何でもよいのですが、chain.pem を連結後のファイル名としましょうか。
* ルート証明書ファイルの名前を上記へリネーム。
* ルート証明書ファイルを開いて、末尾に、中間証明書の中身を貼り付けます。で、保存。
* 以上。

## インポート
* Admin Console で先ほど CSR 発行した画面を開く。
* 「証明書のインポート」ボタンを押す。
* 「署名済みの証明書ファイル」：CRT ファイルを指定。
* 「中間証明書ファイル」：上記 chain.pem を指定。
* 「プライベートキーファイル」：上記で「後で使う」と書いておいた serverKey.pem を指定。
* 「プライベートキーパスワード」：上記で入力したパスワード。
* 「保存」ボタンを押す。
* FileMakerServerの再起動で完了。


# 確認
WebDirect の URL https://hogehoge.fugafuga/fmi/webd/  などにアクセスしてみて、問題なくアドレスバーのところが EVSSL 対応されて緑色になり自分の組織名が表示されていれば OK です！
複数の要素を同じイベントリスナーに登録する

メモ

```javascript:script.js
$('#main-btn').click(function(){
    //同じ処理
});

$('#sub-btn').click(function(){
    //同じ処理
});
```

こんなことしなくても

```javascript:script.js
$('#main-btn, #sub-btn').click(function(){
    //省略
});
```

でおk
rails章まとめ

# ruby章
##2章
* 仮想環境があるディレクトリまで移動 (cd ~/Desktop/work/vagrant)
* 仮想環境を立ち上げ (vagrant up)
* 仮想環境へSSH接続 (vagrant ssh)
* 仮想環境における共有フォルダへの移動(cd /vagrant)

##3章
* Railsアプリケーションの雛形を作る
* 作成したフォルダへ移動
* Controllerを用意する
* アクションを定義する
* Routingを設定する
* Viewファイルを作成する
* アプリケーションのサーバーを立ち上げる
* URLにアクセス

##４章　
**カラムの追加コマンド**
`$ rails g migration Addカラム名Toテーブル名 カラム名:型名`
**カラムの削除コマンド**
`$ rails g migration Removeカラム名Fromテーブル名 カラム名:型名`

* データベースとはテーブル・カラム・レコードの3要素で構成されている
* モデルを作る時にカラムを設定する
* マイグレーションを使うとデータベースやテーブルを作成することができる
* カラムの追加や削除をすることができる

##5章
**パラメーター取得の制限コード**
`params.require(:モデル名).permit(:カラム名１, :カラム名２)`

##8章
**リファイルgem**

* ファイルのアップロード先を柔軟に設定できる
* 簡単に組み込める
* 画像のサムネイルを生成できる
**imagemagickインストール**
`sudo apt-get update`
``

##9章
* ポップアップで警告を出すときは
`"data-confirm" => "文章"`
例:  `<%= link_to "削除", delete_post_path, "data-confirm" => "本当に削除しますか？"  %>`
* レコード削除は HTTPメソッドはdelete, コントローラーアクションはdestroy
* `link_to`メソッドでhttpメソッドを指定する場合は引数に`method: :delete`を明示的に指定する
vimのカスタマイズについて（.vimrcなどの編集）

# 注意事項
[前回](https://qiita.com/mira010/items/927f996b278a8157f751)までに読んでいてファイル構成が以下のようになっている前提で勧めます
ファイルの中身は前回のものをご覧ください

```
 ~/
 ├ dotfiles/
 │ └ .vim/
 │   ├ configs/
 │   │      ├ plugins/
 │   │      │     └ install/
 │   │      │       └dein.tonl
 │   │      │       
 │   │      └ users/
 │   │          └ plugins.vim
 │   └dein
 └ .vimrc
```
#設定を書いてみよう
前回.vimrcに``~/dotfiles/.vim/configs/users/``においたファイルを参照するように書き込んでいるので今回はそこを使います

```bash
$ cd ~/dotfiles/.vim/configs/users
$ vim basic.vim
```

```vimscript:basic.vim
" バックアップファイルを作らない
set nobackup
" スワップファイルを作らない
set noswapfile
" 編集中のファイルが変更されたら自動で読み直す
set autoread
" バッファが編集中でもその他のファイルを開けるように
set hidden
" 入力中のコマンドをステータスに表示する
set showcmd


" 見た目系

" 行番号を表示
set number

"色をつける
syntax enable
" 現在の行を強調表示
set cursorline
" 現在の行を強調表示（縦）
set cursorcolumn

" 行末の1文字先までカーソルを移動できるように
set virtualedit=onemore
"最終行から次の行まで移動
set whichwrap=b,s,h,l,<,>,[,],~ 


" インデントはスマートインデント
set smartindent

" ビープ音を可視化
set visualbell

" 括弧入力時の対応する括弧を表示
set showmatch

" ステータスラインを常に表示
set laststatus=2

" コマンドラインの補完
set wildmode=list:longest

" Tab系

" Tab文字を半角スペースにする
set expandtab

" 行頭以外のTab文字の表示幅（スペースいくつ分）
set tabstop=2

" 行頭でのTab文字の表示幅
set shiftwidth=2

"改行時に前の行のインデントを継続
set autoindent

"連続した空白に対してタブキーやバックスペースキーでカーソルが動く幅
set softtabstop=2

"ファイル作成禁止
set viminfo=
set noundofile

"コマンド補完
set wildmenu

"ペースト時のインデント整理
"if &term =~ "xterm"
"  let &t_SI .="\e[?2004h"
"  let &t_EI .="\e[2004l"
"  let &pastetoggle = "\e[201~"
"
"  function XTermPastBegin(net)
"    set paste
"    return a:ret
"  endfunction
"  inormap <special><expr><Esc>[200~XTermPasteBegin("")
"endif

"バックスペース有効化
set backspace=indent,eol,start

```
これだけでもかなり変わっているかもしれません
自分はhttps://github.com/mirachan/setを使用しているので
参考にしてください
MacでRStudioを使うときのドツボリメモ

この記事は「おうち」の外でRStudioを使ってみたはいいけど，「おうちに帰ってうまくできなくて困る」という人のためのものです．

## この記事の読者想定

- [R](https://cran.ism.ac.jp/), [RStudio](https://www.rstudio.com/)のインストールは完了している．
- 使われるスクリプト（下記を想定）については，他の人からもらったりして，手元にある．
    - `.r`ファイル
    - `.rmd`ファイル
- 使われるデータ（下記を想定）については，他の人からもらったりして，手元にある．
    - `csv`ファイル
    - `rdata`ファイル

スクリプトを開いて実行するところまで書きます．

---
## スクリプトを開く
日本語が含まれるスクリプトを開いたときの文字化け対策です．


### `~`がスクリプトの中に含まれている場合

上記の操作を行うと`~`と入っていたものが`・`として置き換えられる場合があります．
（`lm()`関数なんかを使っている場合に発生）

そのときは，大人しく入力し直しましょう．

もしくは，[Coteditor](https://coteditor.com/)などを使用してファイルの文字コードを変換しましょう．

---
### テキストエディットを使用して文字コードを変換する

`.Rmd`ファイルや`.R`を右クリックして「このアプリケーションから開く」から「テキストエディット」を開きましょう．

<img width="598" alt="スクリーンショット 2019-04-22 13.18.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62741/43569ae4-abb0-ac17-5582-c8e76ce948bd.png">

開いたファイルを複製します．

<img width="284" alt="スクリーンショット 2019-04-22 13.18.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62741/b6952120-25a5-dbe6-07e1-8eb584ce2491.png">

複製したものを指定したファイル名で保存しましょう．

このとき，エンコーディングを`UTF-8`にします．

<img width="474" alt="スクリーンショット 2019-04-22 13.19.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62741/5ea31e57-1a6b-168a-1a1c-c6b17cfb3e72.png">

デフォルトでは保存時にファイル名に`.Rmd`などが含まれないので，自分で付与して保存しましょう．

---
## データを開く
### Windowsで作成されたRdataをMacで開く
WindowsユーザーからRdataをもらったとき，それをMacで開くと，そこに入っている日本語が化けてしまうことがあります．
これに対応する方法を以下に記します．

#### データの読み込みの復習
データの読み込みは`load`関数を使えばよかったですね．
例えば，`tofu`というデータを次のコマンドによって読み込んだとします．

```R
load("tofu.Rdata")
```

#### 読み込んだデータの確認
Windowsで作られたものは次のように表示されます．
<img width="589" alt="スクリーンショット 2018-04-05 17.45.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/62741/5f44fc92-8a57-2145-4bb3-42bfce3bbe73.png">

これではなんの事やらわかりません．

ここで，何が文字化けしているかを考えます．．．
行と列ですね．（因子型データが含まれている場合には，その列を確認しておきます．）

#### 文字コードを変換するための関数
文字コードの変換は関数`iconv`によって可能です．

使い方は

```R
iconv(x, from = "", to = "", sub = NA, mark = TRUE, toRaw = FALSE)
```

とします．

以下で具体的に確認しましょう．

#### 文字化けしたデータフレームを直す
まずは，行名を直します．
`rownames(tofu)`でデータフレーム`tofu`の行のラベルを参照できます．
ここでの文字コードが`shift-jis`である事によって文字化けしているので，次のように直します．

```R
rownames(tofu) <- iconv(rownames(tofu), from = "shift-jis", to = "utf8")
```

実際にやってみたのが，次の画像です．
<img width="691" alt="スクリーンショット 2018-04-05 17.49.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/62741/06a49428-642e-2b1e-ce21-3c7d0496f74b.png">

同じ要領で列名も直します．

```
colnames(tofu) <- iconv(colnames(tofu), from = "shift-jis", to = "utf8")
```

では，文字コードが治ったか確認してみましょう．
<img width="774" alt="スクリーンショット 2018-04-05 17.50.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/62741/ac543044-747e-a28e-8953-0c8c63297417.png">


おめでとう！ちゃんと治りました！！
Visual Studio CommunityでCordova環境を作る

モバイルのWindowsのタブレットPCに、Visual Studio CommunityでCordova環境を作りました。
ネットで多数の記事がありますので、参考にしました。
ただ、記事が古かったので、最新のVisual Studio2017の画面をキャプチャしました。

Visual Studio Communityをインストールするとき、画面のようにJavaScriptでモバイル開発の項目を選択することで、Cordovaの環境をいんすーるすることが出来ます。
オプション選択することで、Android-SDKも同時にインストールできるので楽です。
オプションの選択は、画像右にあるJavaScriptでモバイル開発の＞の部分をクリックすると、インストールするオプションの追加ができます。

![setumei1.PNG](https://qiita-image-store.s3.amazonaws.com/0/20977/4a739a71-40a3-1445-50cc-d5c60422c847.png)

無事にこの画面が出ました。
![setumei2.PNG](https://qiita-image-store.s3.amazonaws.com/0/20977/836865d8-e14d-e857-4f78-e8e2b8b1fc50.png)

私は、単独でCordovaのインストールも試みました。

Node.jsも、インストールしました。

私は、Monacaでクラウドでアプリを作っています。
でも、今回、無料プランではCordovaのプラグインの追加が出来ないことを知り、ローカルでで開発環境を作りたかったのです。

Visual Studio Communityをインストールすることで、簡単にアプリ開発環境を作ることができるので、JavaScriptとHTML、CSSでアプリを作りたい人には、おすすめです。
ruby csv書き込み 一瞬ハマったメモ

ruby素人がcsv書き込みで一瞬ハマったのでメモ。

```ruby
  def dump_csv(filename, writedata, writetype = 'w')
    CSV.open(filename, writetype) do |csv|
      writedata.each do |arr|
        csv << arr
      end
    end
  end
```

実行すると以下のようなエラーが出た。

```bash
/usr/local/rbenv/versions/2.5.0/lib/ruby/2.5.0/csv.rb:1698:in `<<': undefined method `map' for #<String:0x000056146b9cabf0> (NoMethodError)
```

```bash
# csv.rb:1698
    output = row.map(&@quote).join(@col_sep) + @row_sep  # quote and separate
```

Stringはダメっぽい。

```ruby
  def dump_csv(filename, writedata, writetype = 'w')
    CSV.open(filename, writetype) do |csv|
      writedata.each do |arr|
        csv << [arr] #配列にするとOK
      end
    end
  end
```
VSTSでNuGetパッケージを作らせる

多分、また忘れるだろうと思うので、個人的にメモ。

### .csprojの設定

```xml
<PackageVersion Condition="'$(Configuration)' == 'Debug'">$(Version)-alpha</PackageVersion>
<PackageVersion Condition="('$(Configuration)' == 'Debug') AND ('$(BUILD_BUILDID)' != '')">$(Version).$(BUILD_BUILDID)-alpha</PackageVersion>
```

こう書いておくと、 `-c Debug` でプレリリースのパッケージが作れる。
2行目の設定でVSTS時にビルド番号を入れたプレリリースのパッケージにできる。

### VSTSのビルド設定

ビルド変数に `BuildConfiguration = Debug` を突っ込んでおくことで、デバッグビルドをさせることができる。

![021.png](https://qiita-image-store.s3.amazonaws.com/0/59270/faa64e17-670f-a0b9-9c6d-928d284c551f.png)

あとは、.Net Coreタスクでpack→nuget pushする。

**pack**
![022.png](https://qiita-image-store.s3.amazonaws.com/0/59270/3c77468d-51e7-5dda-6313-692ed44ccddc.png)

**nuget push**
![023.png](https://qiita-image-store.s3.amazonaws.com/0/59270/82b19f80-14e5-dc3b-ce36-046486ac3bc6.png)

### パッケージの場所を確認する

**Package** (①)内の **Connect to feed** (②)を選ぶと、パッケージの場所が表示されるので、 **Package source URL** の欄をNuGetパッケージソースとして設定する。

![024.png](https://qiita-image-store.s3.amazonaws.com/0/59270/0e2bf03e-d1a0-7e83-2738-3714cfa754d9.png)

### ファイルでNuGetソースの設定をする

プロジェクトディレクトリのルートに `.nuget/NuGet.config` ファイルを以下の内容で作っておく。

```xml
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
    <add key="My NuGet" value="https://foo-bar.pkgs.visualstudio.com/_packaging/Product/nuget/v3/index.json" />
  </packageSources>
</configuration>
```

**My NuGet** のvalueには、前の「パッケージの場所を確認する」で確認した **Package source URL** を設定する。
TensorflowのTutorialのメモ

#GoogleのTensorflowのTutorialsのMNISTで躓いた時のメモ。

##環境
macOS 10.13.3
tensorflow 1.6.0
Python 3.6.0

##状況
https://www.tensorflow.org/tutorials/layers
に載っている一番最初のコード

```python

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

# Imports
import numpy as np
import tensorflow as tf

tf.logging.set_verbosity(tf.logging.INFO)

# Our application logic will be added here

if __name__ == "__main__":
  tf.app.run()
```
これを実行した。すると
```
 main = main or _sys.modules['__main__'].main
AttributeError: module '__main__' has no attribute 'main'
```
というエラーが出た。
##解決
Githubの下記のページを参照した。
https://github.com/tensorflow/tensorflow/issues/2310

```python

def main(_):
    tf.logging.set_verbosity(tf.logging.INFO)
if __name__ == "__main__":
  tf.app.run(main=main)
```
とすると無事解決した様子。
ASP.NET Core Tips : 例外をJSONレスポンスに変換するフィルタ実装例

ASP.NET Core の WebAPI、JSONのシリアライズは自動でやってくれるわ Swagger への対応も簡単だわ便利ですよね。
と、調子に乗って作っていると例外を捕まえ忘れた時

![exceptionpage.png](https://qiita-image-store.s3.amazonaws.com/0/246831/bb5ed980-d14a-a6dd-bc2a-6662c90e5628.png)

みたいな事になります(UseDeveloperExceptionPageを使わないとステータスコードのみの空ページになりますが)。
やはりエラー時はエラー情報を乗せたJSONを返すようにしたいですよね。
というわけで ExceptionFilter を差し込んで Controller 内で捕まえなかった例外を自動的にエラー用のレスポンスJSONに乗せ換えて返してくれるフィルタのサンプルの作り方です。

## 独自例外の定義

何の例外が発生しても 500 固定にするならそれはそれでいいんですが、やはりステータスコードやメッセージをある程度制御したい事もあるので、独自の例外を定義します。

```cs
public class APIException : Exception {
    public int StatusCode_ = 500;
    ...

    public APIException(int statusCode, string message,
        [CallerMemberName] string memberName = "",
        [CallerFilePath] string sourceFilePath = "",
        [CallerLineNumber] int sourceLineNumber = 0
        )
        : this(message, memberName, sourceFilePath, sourceLineNumber) {
        StatusCode_ = statusCode;
    }
    ...
}
```

## フィルタの実装

ExceptionFilterAttribute から派生したフィルタの実装を行います。

```cs
public class APIExceptionFilter : ExceptionFilterAttribute {
    public override void OnException(ExceptionContext context) {
        JsonResult result;

        if (context.Exception is APIException) {
            var ex = context.Exception as APIException;

            result = new JsonResult(new {
                StatusCode = ex.StatusCode_,
                ex.Message
            }) {
                StatusCode = ex.StatusCode_
            };
        } else {
            result = new JsonResult(new {
                StatusCode = 500,
                context.Exception.Message
            }) {
                StatusCode = 500
            };
        }

        context.Result = result;
    }
}
```

捕まえた例外の型が APIException だった時はそのステータスコードとメッセージから、APIException 以外だった時はステータスコード 500と、例外のメッセージからレスポンスを作成するようにします。

## フィルタの使用

```cs
public void ConfigureServices(IServiceCollection services)
{
    ...
    services.AddScoped<APIExceptionFilter>();
}
```

```cs
[ServiceFilter(typeof(APIExceptionFilter))]
public class ValuesController : Controller
{
    ...
    // GET api/values/ArgumentNullException
    [HttpGet("ArgumentNullException")]
    public string GetArgumentNullException() {
        throw new ArgumentNullException("ArgumentNullException");
    }

    // GET api/values/APIException
    [HttpGet("APIException")]
    public string GetAPIException() {
        throw new APIException(HttpStatusCode.BadRequest, "Your exception message");
    }
}
```

ConfigureServices でフィルタを ServiceCollection に追加し、Controller でフィルタの使用を宣言します。
Controller で処理しない例外があった場合、フィルタで処理したレスポンスのJSONが返されます。

## サンプルソース

サンプルは[こちら](https://github.com/yossy6954/APIExceptionFilter)
zabbix エージェントアップグレード

### zabbix エージェントアップグレード

1,
[root@localhost ~]# rpm -qa | grep zabbix
zabbix-agent-3.0.8-1.el7.x86_64

2,
[root@localhost ~]# rpm -Fvh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-agent-3.0.15-1.el7.x86_64.rpm
http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-agent-3.0.15-1.el7.x86_64.rpm を取得中
警告: /var/tmp/rpm-tmp.W6h4p5: ヘッダー V4 DSA/SHA1 Signature、鍵 ID 79ea5ed4: NOKEY
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:zabbix-agent-3.0.15-1.el7        ################################# [ 50%]
整理中 / 削除中...
   2:zabbix-agent-3.0.8-1.el7         ################################# [100%]

3,
[root@localhost ~]# rpm -qa | grep zabbix
zabbix-agent-3.0.15-1.el7.x86_64
JSHINT option

### br...fyは特に必要ない。 codemirrorとの相性が良い。
```js
let opt={...};
JSHINT(d,opt);
return JSHINT.data()
```
### option
```js
let opt={browser:true,asi:true,es5:true,esnext:true
,lastsemic:true,laxcomma:true,curly:false,maxdepth:4}
```
### 全部
```html
<script src="https://gnjo.github.io/jshint/dist/jshint.js?v1=eeee"></script>
<div f><textarea a></textarea><textarea b></textarea></div>

<style>
 body{margin:0;width:100vw;height:100vh;}
*{background-color:#111;color:#eee;outline:none;resize:none}
[f]{display:flex;height:100%}
textarea{width:50%;padding:0.5rem}
</style>
```
```js
let fn={}
fn.q=(d=>document.querySelector(d))
fn.sol=(d=>Promise.resolve(d))
;
let a=fn.q('[a]'),b=fn.q('[b]')
,opt={browser:true,asi:true,es5:true,esnext:true,lastsemic:true,laxcomma:true,curly:false,maxdepth:4}
,calc=(d)=>{ JSHINT(d,opt); return JSHINT.data()}
,draw=(d)=>{ b.value=JSON.stringify(d,null,2);return d}
;
a.oninput=function(ev){ fn.sol(this.value).then(calc).then(draw)}
;
console.log(JSHINT)
```
### option参考
https://qiita.com/xorphitus/items/f26ec8fbe17c317d3994
http://yuzuemon.hatenablog.com/entry/2014/11/17/010227

### 追記　解析結果のエラー判別
```js
let d=JSHINT.data();
if(d.errors) console.log(d.errors)
```

### 応用 codemirrorに自分用の設定を適用させ、lintと一緒に使う。
もしcodemirrorと一緒に自分用の設定で使うのであれば公式デモのjavascript-lint.jsをマイグレーションする。
*もっと賢い方法がありそうだけれども。
参考
https://github.com/angelozerr/codemirror-lint-eslint/blob/master/eslint-lint.js

```html
<!--<script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.36.0/addon/lint/javascript-lint.js"></script>-->
<script src="https://codepen.io/gnjo/pen/GxzNGz.js?javascriptLintMeJS=001"></script>
```
```js
//validate()部
...
 var opt={browser:true,asi:true,es5:true,esnext:true,lastsemic:true,laxcomma:true,curly:false,maxdepth:3
     ,unused:true}
  function validator(text, options) {
  ...
    var _o =Object.assign({},options,opt) ;//
    JSHINT(text, _o, _o.globals);
  ...}
}

...
```
AndroidのCrashlyticsにユーザー情報つけて、解析しやすくして見たよ


「Crashlyticsではユーザーの情報をカスタムで付与できたり、カスタムログを仕込むことができるらしい」
ときいて、原因がぜ〜んぜんわからないクラッシュがあったので、ログを拡張してみました。

※注意: ログに個人情報はのせないように気をつけましょう

## Crashlytics.logException
普段はアプリでクラッシュが起きたのをキャッチしてCrashlyticsにスタックトレースが送られますが、logExceptionをつかえば能動的に情報をCrashlyticsに送ることができます


## Crashlytics.setXXX
Crashlytics.setBool, setStringなどで、アプリの設定情報（SharedPreferenceの中身）などを付与することができます
5つの情報を設定して見ると以下のようになります。
`Keys` として、5つの値のkey名と値が記載されてるのがわかります


![crashlytics key.png](https://qiita-image-store.s3.amazonaws.com/0/68146/ed77c41d-da96-d2f2-4151-74ff08c71716.png "crashlytics key.png")

## Crashlytics.log
カスタムのログもCrashlyticsに送ることができます。
出力したログは、引数を3つ与えるとLogcatにも出力できます。
実際におくったものはこちら↓。スイッチを `Logs` の方に向けると確認できます。

![crashlytics log.png](https://qiita-image-store.s3.amazonaws.com/0/68146/9d955b7d-3e2e-a672-be45-9b5baa83361e.png "crashlytics log.png")


## 最後に
エラーがでてから仕込んでも対応が後手後手になっちゃうので、先んじて仕込んでおきましょう♪
[さくらVPS]CentOS7の初期設定

さくらVPSを新しく借りたのでsshの設定をする
ssh接続するユーザー名は「sample」とする

## 環境
OS: CentOS Linux release 7.4

## まず

```
yum -y update
```

## ユーザーの作成

```
useradd sample
passwd sample
wheelグループに追加する
（gpasswd -a USER GROUP）
gpasswd -a sample wheel
```

## ユーザーの権限等の設定
visodo で/etc/sudoersを変更

```
visudo
```

```
# sudoコマンド使用時にパスワードを求めない場合
%wheel  ALL=(ALL)       NOPASSWD: ALL

# sudoコマンド使用時にパスワードを求める場合
%wheel  ALL=(ALL)       ALL
```

### 鍵の作成

```
ssh-keygen -t rsa
Generating public/private rsa key pair.
# 鍵ファイルを作成する場所(問題がない場合はそのままEnter)
Enter file in which to save the key (/home/sample/.ssh/id_rsa):
# パズフレーズ(必要がない場合はそのままEnter)
Enter passphrase (empty for no passphrase):
# パズフレーズの確認
Enter same passphrase again:
（略）

# ~/.ssh/id_rsa.pubにファイルが作成されているので内容をコピーする
```
### コピーした鍵を設置
```
# mkdir ~/.ssh
# chmod 700 ~/.ssh
ファイルを作成
# touch ~/.ssh/authorized_keys
権限の変更
# chmod 600 ~/.ssh/authorized_keys
~/.ssh/autorized_keysに先ほどコピーした内容を貼り付ける

```

### ssh接続での設定
```/etc/ssh/sshd_config
# ルートでのログインを禁止
PermitRootLogin no
# パスワードでのログインを禁止
PasswordAuthentication no
```
### sshdの再起動
```
systemctl restart sshd
```
ログアウトしてしまうと設定がうまく行かなかった場合、
ログインする方法がなくなってしまうので、
サーバーからログアウトせずに
ターミナル等で別ウィンドウからssh接続を確認する
jsonのインストール→bundle installでコケ続ける時にやった対処法

# 状況
Vagrant＋CentOSの中で、Railsの開発環境を作っている途中で

```
bundle install --path vendor/bundle
```
としたところ

```
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

（中略）
An error occurred while installing json (1.8.3), and Bundler cannot continue.
Make sure that `gem install json -v '1.8.3'` succeeds before bundling.
```
と言われたので素直に

```
gem install json -v '1.8.3'
```
としてみて再度

```
bundle install --path vendor/bundle
```
としたものの、上記エラーを解決することが出来ず。

bundler更新したり、Gemfile.lockを削除してみたり、直接Gemfile編集してみたりしましたが直らず。。。

色々調べてみて、 [こちら](https://tamosblog.wordpress.com/2015/02/22/bundle-install_on_vagrant/)を参考に

```
bundle install --path ~/ここにプロジェクト名/vendor/bundle
```
としたところ、無事にinstallされて先に進むことができました。
vue-qrcode-readerでQRコードを読み取る

[vue-qrcode-reader](https://github.com/gruhn/vue-qrcode-reader)が簡単すぎて素晴らしかったのでメモ。

# 追加
```
yarn add vue-qrcode-reader
npm install vue-qrcode-reader
```

# vueに登録
```
import Vue from 'vue'
import { QrcodeReader } from 'vue-qrcode-reader'

Vue.component('my-component', {
  components: { QrcodeReader },
)
```

# 使う
```
// html
<qrcode-reader @decode="onDecode"></qrcode-reader>

//scripts
methods: {
  onDecode (content) {
    this.paused = true
  }
}
```
【CakePHP3】配列でデータを取得したい

備忘録として

CakePHPでデータを取り扱う時に扱いやすいようにtoArray()を使ってオブジェクトを配列にして取得することが多いと思います。

```
$query->toArray()で取得した場合

[
    (int) 0 => object(Common\Model\Entity\Hoge) {

        'id' => (int) 1,
        'name' => 'hoge',
    },
    (int) 1 => object(Common\Model\Entity\Hoge) {

        'id' => (int) 2,
        'name' => 'poge',
    }
]
```
このままでもいいんですが、取得データを個々に一括で使いたいってなった場合、for文が増えてしまって見栄えが悪かったり、取り扱い方に困ったりすることがあったので、いい感じの方法を教えていただきました。

https://book.cakephp.org/3.0/ja/orm/retrieving-data-and-resultsets.html#finder


これによると、変換 (hydrate) を無効化すれば、素となる配列を取得することができます。

```
$query->enableHydration(false);
// 3.4.0 より前は
$query->hydrate(false);
```

$query->enableHydration(false)->toArray()で取得した場合は以下のように取得できます。

```
$query->enableHydration(false)->toArray()の場合

[
    (int) 0 => [
        'id' => (int) 1,
        'name' => 'hoge',
    ],
    (int) 1 => [
        'id' => (int) 2,
        'name' => 'poge',
    ]
]
```
これにHashなどを組み合わせると、idのみの配列を作成するなどの処理が気持ち短くかけるかな〜と思います。
tmux の設定で if を使う（ウィンドウが一つの時と複数の時で異なる動作をするキーバインドの設定）

（2018-04-06 20:25 コメント頂いた内容で修正しました）

# 動機

```
bind-key C-t last-window
```

このウィンドウの移動に対するキーバインドを、ウィンドウが一つしか開いていない時はペインの移動に変えたかったのです。

# 結論

```
# version 2.3 まで
bind-key C-t if-shell 'test #{session_windows} -eq 1' last-pane last-window
```

または

```
# version 2.4 以降
bind-key C-t if-shell -F '#{==:#{session_windows},1}' last-pane last-window
```

# 解説

`if-shell` で、シェルコマンドを対象とした if ができます。書式は

```
if-shell 「シェルコマンド」 「真の時に実行されるコマンド」 「偽の時に実行されるコマンド」
```

です。
`#{session_windows}` で、そのセッションで開いているウィンドウの数が取得できるので、1 なら `last-pane` それ以外（2 以上）なら `last-window` が実行される事になります。

なお、`tmux` の [version 2.4 から](https://raw.githubusercontent.com/tmux/tmux/2.4/CHANGES)、比較を簡単に書ける構文が導入されているので、後者のように tmux の中で閉じるように書けるようです。
`apt` などで入れている場合、古いバージョンが入っていてこの表記に対応していない場合があるのでご注意を。（というか、自分がそうでした。）

# 感想

~~list に wc とかしなくても、もっと簡単に window の数が取れる方法があってもいいような気がするんですがどうなんでしょうか？~~

すいません、やっぱりありましたね。
[nkf] 日本語を含むテキストファイル等を文字コード変換

#概要・目的
ターミナルから適当なテキストファイルを閲覧しようとすると、日本語部分が文字化けして見れない（だいたいShift-JISのせい）。
とりあえず内容だけサッと確認したい。

nkfというツールを使えば出来るっぽい。

#インストール
homebrewから

```zsh
brew install nkf
```

#コマンド
- `nkf -オプション`でコード変換して`cat`コマンドのように確認できる。
- `–overwrite`を指定すると、**元のファイルを変換して上書き**するので注意。


```zsh
#変換したいファイルの文字コードをチェック
nkf -g ファイル名

# ファイルの文字コードをUTF-8に変換して表示（元のファイルはそのまま）
nkf -w　ファイル名


# ファイルの文字コードをUTF-8に変換して上書き保存
nkf -w --overwrite ファイル名

# Shift-JISに文字コード変換して上書き保存
nkf -s --overwrite ファイル名


# 文字コードをUTF-8に変換、改行をLFにして新規ファイルで保存
nkf -wd 元ファイル名 > 新規保存ファイル名
```

#オプション引数

|引数|内容|
|:--:|:--|
|-u	|出力時にバッファリングを行わない|
|-g| 文字コード自動判別の結果を表示|
|-w	|UTF8コードに変換する|
|-j	|JISコードに変換する|
|-e	|EUCコードに変換する|
|-s	|シフトJISコードに変換する|
|-r	|ROT13/47の変換する|
|-T	|テキスト・モードで出力する|
|file|	変換元のファイルを指定する|
|–overwrite |引数のファイルに直接上書き|
|**改行系**||
|d,-Lu	|	改行をLFにする（UNIX系）|
|-c,-Lw|		改行をCRLFにする（Windows系）|
|-Lm|		改行をCRにする（OS Xより前のmac OS系）|


#参考
>
[macでファイルの文字コードを変換する『nkfコマンド』の使い方とオプション一覧](http://kawatama.net/others/mac/1754)
[ 【 nkf 】コマンド――文字コードと改行コードを変換する](http://www.atmarkit.co.jp/ait/articles/1609/29/news016.html)
 **iconv**
[ 【 iconv 】コマンド――文字コードを変換する](http://www.atmarkit.co.jp/ait/articles/1609/12/news019.html)
Elasticsearchのcurlを使ったindexの削除

---
~~jqコマンドがない場合は、表示の見やすさだけなので「| jq」は省略して問題ない。~~
「?pretty=true」を付けることで返却値が整形されるようです。
コメントで教えていただきました。

```
# 存在確認
curl -XGET localhost:9200/index_name/_mapping?pretty=true

# 削除
curl -XDELETE localhost:9200/index_name?pretty=true

# 存在確認(消えていること)
curl -XGET localhost:9200/index_name/_mapping?pretty=true
```
---
### 削除時のレスポンス

- 削除

```
{
  "acknowledged": true
}
```

- 削除後の確認

```
{
  "error": "IndexMissingException[[index_name] missing]",
  "status": 404
}
```