OmniAICreator/Qiita-1.07M huggingface dataset:
C++ Builder XE4 > Excel > link: 在C++Builder中利用OLE存取Excel文件 > Excel処理実装例 (中国語)

```txt:動作環境
C++ Builder XE4
秀丸エディタ Version 8.79
```

C++ BuilderのExcel実装例を探していたら、下記に見つけた。

[在C++Builder中利用OLE存取Excel文件](https://blog.csdn.net/ljianhui/article/details/8689804)

マクロなどを使って短縮記載にしている。

```
#define PG OlePropertyGet
#define PS OlePropertySet
#define FN OleFunction
#define PR OleProcedure
```

マクロの使用は利点と欠点があるだろう。

様々な処理に対する実装例が詳しい。

我很感激 Wǒ hěn gǎnjī. (I appreciate it.)
GRPC ノウハウ

# Protocol Buffers
 https://ja.wikipedia.org/wiki/Protocol_Buffers


# GRPCについて 
https://medium.com/eureka-engineering/golang%E3%81%A7grpc%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9Fapiserver%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B-9e608be200b1

・gRPCを使った簡易的なマイクロサービスを作ってみた（とてもわかりやすい）
https://qiita.com/kotamat/items/a84301a16fc24a203304

# 雑な理解の仕方
protoファイルにインターフェイスを定義して、コンパイルして、そこでできるソースを作って、それを元にクライアント、サーバを実装。クライアントもサーバも同じprotoファイルを利用する。
インターフェイスを定義したら、コードを自動で生成してくれるのが、良い。RESTみたいに更改時にIFをドキュメント管理して、サーバとクライアント管理して、みたいな手間が少し減る。
Protocol BuffersのWikiが一番わかりやすい。
HLFの場合、実装するgoは、protoファイルからコンパイルしたものを用いている？
sympy で量子フーリエ変換

# 量子フーリエ変換
量子フーリエ変換は、ただの量子ゲートである。特にカスタマイズポイントや、バリエーションがないので、sympy で簡単に利用できる。

```py
>>> from sympy.physics.quantum.qft import QFT
>>> QFT2 = QFT(0,1) # QFT for 1-qubit
>>> QFT4 = QFT(0,2) # QFT for 2-qubit
>>> QFT8 = QFT(0,3) # QFT for 3-qubit
```

# 量子フーリエ変換に親しむ

## Lesson1. QFT2 はアダマールゲートである

```py
>>> from sympy.physics.quantum.qft import QFT
>>> from sympy.physics.quantum.qubit import Qubit
>>> from sympy.physics.quantum.qapply import qapply
>>> from sympy.physics.quantum.represent import represent

>>> QFT2 = QFT(0,1)
>>> qapply(QFT2 * Qubit('0'))
sqrt(2)*|0>/2 + sqrt(2)*|1>/2
>>> qapply(QFT2 * Qubit('1'))
sqrt(2)*|0>/2 - sqrt(2)*|1>/2
```

## Lesson2. QFT は周期の逆数を導出する
周期2 の状態 (例: `|0> + |4>`) を入れると周期が 4の状態 が出てくるなど。

```python
>>> from sympy.physics.quantum.qft import QFT
>>> from sympy.physics.quantum.qubit import Qubit
>>> from sympy.physics.quantum.qapply import qapply
>>>
>>> QFT8 = QFT(0,3) # QFT for 3-qubit
>>> qapply( QFT8*(Qubit('000')))
sqrt(2)*|000>/4 + sqrt(2)*|001>/4 + sqrt(2)*|010>/4 + sqrt(2)*|011>/4 + sqrt(2)*|100>/4 + sqrt(2)*|101>/4 + sqrt(2)*|110>/4 + sqrt(2)*|111>/4
>>> qapply( QFT8*(Qubit('000')+Qubit('100')))
sqrt(2)*|000>/2 + sqrt(2)*|010>/2 + sqrt(2)*|100>/2 + sqrt(2)*|110>/2
>>> qapply( QFT8*(Qubit('000')+Qubit('010')+Qubit('100')+Qubit('110')))
sqrt(2)*|000> + sqrt(2)*|100>
```

## Lesson3. 入力にオフセットをつけるとよく似た出力になる
オフセットの違う入力(例: `|0> + |4>` と `|1> + |5>` ) を入れると、よく似た出力が得られる。

```python
>>> from sympy.physics.quantum.qft import QFT
>>> from sympy.physics.quantum.qubit import Qubit
>>> from sympy.physics.quantum.qapply import qapply

>>> QFT8 = QFT(0,3) # QFT for 3-qubit
>>> qapply( QFT8*(Qubit('000')+Qubit('100')))
sqrt(2)*|000>/2 + sqrt(2)*|010>/2 + sqrt(2)*|100>/2 + sqrt(2)*|110>/2
>>> qapply( QFT8*(Qubit('001')+Qubit('101')))
sqrt(2)*|000>/2 + sqrt(2)*I*|010>/2 - sqrt(2)*|100>/2 - sqrt(2)*I*|110>/2
>>> qapply( QFT8*(Qubit('010')+Qubit('110')))
sqrt(2)*|000>/2 - sqrt(2)*|010>/2 + sqrt(2)*|100>/2 - sqrt(2)*|110>/2
```


参考: https://www.appi.keio.ac.jp/Itoh_group/abe/pdf/qc6.pdf
iOS の WWW リクエストをカスタマイズ

Unity の WWW クラスで外部ファイルをダウンロードして使うコードを書いていたところ、iOSだけ古い外部ファイルを参照している状態になりました。調べてみたらキャッシュを使う設定になっているようで、キャッシュ無効にした話。

検索したらこちらの記事ですぐ気が付けたので助かりました。

UnityのiOSでデータダウンロード時にキャッシュされてしまう問題
https://qiita.com/tempura/items/75a429507c6d32bf8f46

そして今だとスマートな解決策が用意されているようなので共有しておきます。

iOS の WWW リクエストをカスタマイズ
https://docs.unity3d.com/jp/current/Manual/iosCustomWWWRequest.html

これを参考に、Plugins/iOS/CustomConnection.mm を用意して
request.cachePolicy = NSURLRequestReloadIgnoringLocalCacheData;

するだけで、すんなりキャッシュ無効となりました。
MySQLのselectの表示結果を\Gで縦に見やすく表示したい

#SQLの表示結果を縦にしたい`\G`


```sql
mysql> select * from table_name where id = 1\G
```
普段は`;`（セミコロン）を終わりにつけているものを`\G`に置き換える。

#表示例

```
mysql> select * from test_table;
+----+--------+--------+--------+
| id | teamid | status |   a    |
+----+--------+--------+--------+
|  1 |      1 |   no   |  200   |
|  2 |      1 |   ok   |  250   |
+----+--------+--------+--------+
2 rows in set (0.00 sec)

mysql>
mysql> select * from test_table \G
************ 1. row ************
  id: 1
  teamid: 1
  status: no
  a: 200

************　2. row ************
  id: 2
  teamid: 1
  status: ok
  a: 250
```
プレイヤーが乗ったら足場から落ちないようにする(プレイヤーの子オブジェクトにする)※編集中

```notfall.cs
using UnityEngine;
using System.Collections;


public class notfall : MonoBehaviour
{
void OnCollisionEnter(Collision col) {
    if (col.gameObject.tag == "MoveStage") {
        transform.SetParent(col.transform);
    }
}
 
void OnCollisionExit(Collision col) {
    if (col.gameObject.tag == "MoveStage") {
        transform.SetParent(null);
    }
}
}
```
行ったり来たりするオブジェクト※編集中

```MoveRound.cs

using UnityEngine;
using System.Collections;


public class MoveRound : MonoBehaviour
{
    [SerializeField]
    private Vector3 _startPosition;

    [SerializeField]
    private Vector3 _targetPosition;

    [SerializeField]
    private float _duration = 1f;

    private float _time = 0;
    //private int _dirFactor = 1;
    private bool _inverse = false;

    private void Update()
    {
        _time += Time.deltaTime;

        // 指定時間を過ぎたら向きを逆に
        if (_time >= _duration)
        {
            _time = 0;
            _inverse = !_inverse;
        }

        // 時間を媒介変数として計算（0 - 1）
        float t = _time / _duration;

        if (_inverse)
        {
            transform.position = Vector3.Lerp(_startPosition, _targetPosition, 1f - t);
        }
        else
        {
            transform.position = Vector3.Lerp(_startPosition, _targetPosition, t);
        }
    }
}
```
SpreadsheetのGoogle Apps Scriptにショートカットキーを割り当てる

GASマニアの皆様こんにちは GAS界の老害 大橋です。 席取りはしません。

2018/04/11にマクロ機能が追加され、その記事を先程書いたのですが、その中にショートカットキーを割当について書きました。
https://qiita.com/soundTricker/items/9c6987d4a4c60642777a

ただこのショートカットキーの割当については昔から問い合わせも多く、多分この内容だけで検索される方も多いと思いますので、
別途独立した記事として、書かせてもらおうと思います。

## Spreadsheet(Sheets)におけるGASへのショートカットキーの割り当て方

### 1. GASの関数を作る

適当にGASの関数を作ってください。
なおマクロの自動記録でも、GASエディタで直接でもどちらでも構いません

### 2. マクロ化する

マクロの自動記録で作成した場合はこの操作は不要です。
メニューから「マクロ」→「インポート」を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/2965/e75530af-21d8-d53d-2bc7-e75911fcde09.png)

マクロ化していないGASの関数が一覧表示されるのでマクロ化したい関数の「関数を追加」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/2965/9df1fd56-94ad-6213-f974-549e2c846be1.png)

### 3. ショートカットキーを割り当てる

メニューから「マクロ」→「マクロを管理」を選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/2965/d34c4b8b-7368-c763-fb56-acb5e173d2d8.png)

マクロの管理ダイアログが表示されるので、右側にあるショートカットキーに割り当てたいキーを設定して、「更新」ボタンをクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/2965/7e32032a-de97-4fb3-9677-98cf13ae2cbc.png)


以上でショートカットキーの割当が完了です。
あとは、Spreadsheetに戻りショートカットキーを入力するだけです。

![Apr-13-2018 12-37-26.gif](https://qiita-image-store.s3.amazonaws.com/0/2965/055f4420-d70b-916b-9ec8-3487c3ed2372.gif)

なお、一部のソフトウェア(skitchとか)で既に対象のショートカットキーが割り当てられてしまっていると動かない時があるのでご注意ください。
それでは皆さん良きGASライフを!!!!
スプレッドシートにマクロ機能が追加されたので試してみた

マクロ記録がスプレッドシートにも登場しましたが、筆者の環境に来たので早速試してみました。
概要を知りたい方は次の記事をどうぞ
[Googleのスプレッドシートにマクロが来た――G Suiteツールにメジャーアップデート | TechCrunch Japan](https://jp.techcrunch.com/2018/04/12/2018-04-11-google-sheets-gets-macros/)

![zakrx-iihfh.gif](https://qiita-image-store.s3.amazonaws.com/0/35595/45f21c9f-cfdd-f45a-cd90-1364bccad4bc.gif)



## 作るもの
**スプレッドシートにドット絵で `HOWDY39` を書く！**
「そんなクソなもん作るなよ...」とか突っ込むのは禁止です。（良い例が思いつかなかったのです

では、早速作ってみましょう。

## マクロの記録を開始
ツールにマクロが追加されているのでそこから記録を開始します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/01f3e07a-bece-e1b9-11d4-e7fa095c7658.png)

記録中であることが分かるポップが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/94cb16d2-c559-7132-c4af-60cb37145947.png)


## キャンバスをつくる
### 列サイズを変更
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/e27b3f52-cf3a-4dcc-a5dc-be83316a5042.png)

### 列を追加
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/f4478e2b-2995-aace-6db9-8bfcaa508abe.png)


## 文字を打っていく
なおドットはこちらのサイトを参考にさせていただきました。
[レシピ用 素材 アルファベット | ビーズ織り(ドット絵)の小物](https://ameblo.jp/akemi-x-x-nakajima/entry-11082574427.html)

### 保存
打ち終わったら保存を押します。
保存する際にマクロ名とショートカットを設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/24b536b9-95e7-90e7-2d15-fdd5e412f338.png)

保存が完了した旨のポップが表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/81119141-da39-9209-83a9-ab1fb1d5d9e3.png)


## 実行してみましょう
新しいシートを作成して、ツールからマクロを実行します。
※先程設定したショートカットでも実行できます！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/37e6a668-df78-545d-13c0-b358966179b3.png)

最初だけ承認画面が出てきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/6c34aecc-9d9e-32e3-4558-637d109f5598.png)

実行するとちゃんとマクロが起動して処理が行われました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/4f3205ef-4606-9a53-fd7e-3e03c91c1d32.png)


## マクロで記録したコード
マクロで記録したコードは次のようなApps Scriptのコードになりました。
コピーペーストやセルの移動なんかもちゃんと認識していますね。
本当に `操作` を記録している感じです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/35595/7b761fa2-b021-70d5-57fe-c358862eb29d.png)


## 余談
GASのリファレンスを調べずに操作からコードを作れるのは快適。
マクロ記録からベースのコードを作ってから、キレイにしていく開発スタイルが良さそう。

GASを先に書いておいて、マクロ管理のインポートから登録することも可能。

マクロが使えるスプレッドシートを共有すれば他の人使えるんじゃないか？と思ったけどできなかった。
左クリックで弾を飛ばす※編集中

```Shooting.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Shooting : MonoBehaviour {

	
    public GameObject bullet;
    public Transform muzzle;
    public float speed = 1000;
   

    void Start()
    {
       
    }

    void Update()
    {

        if (Input.GetButtonDown("Fire1"))

        {
            StartCoroutine("shot");
                    }
    }
    IEnumerator shot()
    {
        GameObject bullets = GameObject.Instantiate(bullet) as GameObject;
        yield return new WaitForSeconds(0.5f);
        Vector3 force;
        force = this.gameObject.transform.forward * speed;
        bullets.GetComponent<Rigidbody>().AddForce(force);
        bullets.transform.position = muzzle.position;
            }
    }
```
プレイヤーの移動と攻撃 Verバーチャルパッド対応版

```PlayerJoystickVer.cs
using UnityEngine;
using System.Collections;
using UnityStandardAssets.CrossPlatformInput;

public class PlayerJoystickVer : MonoBehaviour
{

    private CharacterController characterController;
    private Vector3 velocity;
    [SerializeField]
    private float walkSpeed;
    private Animator animator;

    // Use this for initialization
    void Start()
    {
        characterController = GetComponent<CharacterController>();
        animator = GetComponent<Animator>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetButtonDown("Fire1"))

        {
            animator.SetBool("Attack", true);
        }

        if (characterController.isGrounded)
        {

            velocity = new Vector3(CrossPlatformInputManager.GetAxis("Horizontal"), 0f, CrossPlatformInputManager.GetAxis("Vertical"));

            if (velocity.magnitude > 0.1f)
            {
                animator.SetBool("isRunning", true);
                transform.LookAt(transform.position + velocity);
            }
            else
            {
                animator.SetBool("isRunning", false);
            }
        }
        velocity.y += Physics.gravity.y * Time.deltaTime;
        characterController.Move(velocity * walkSpeed * Time.deltaTime);
    }
}
```
Numpy > broadcasting > rows + cols | link: Numpy reshape 1d to 2d array with 1 column

@ Scipy lecture notes, Edition 2017.1
https://www.scipy-lectures.org/_downloads/ScipyLectures-simple.pdf
3.2.3 Broadcasting
p66

https://www.scipy-lectures.org/intro/numpy/operations.html#broadcasting

図の一番下の例を実装してみる。

https://ideone.com/wEzZO6

```py
import numpy as np

rows = np.array([0, 10, 20, 30]).reshape(-1, 1)
cols = np.array([0, 1, 2])

print(rows)
print(cols)
res = rows + cols
print(res)

```

```txt:run
[[ 0]
 [10]
 [20]
 [30]]
[0 1 2]
[[ 0  1  2]
 [10 11 12]
 [20 21 22]
 [30 31 32]]
```

### link

rowsに関して4列1行を1列4行にする方法は下記を参考にした。

[Numpy reshape 1d to 2d array with 1 column](https://stackoverflow.com/questions/36009907/numpy-reshape-1d-to-2d-array-with-1-column?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa)
プレイヤーの上下左右の移動と攻撃※編集中

```Player.cs
using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour
{

    private CharacterController characterController;
    private Vector3 velocity;
    [SerializeField]
    private float walkSpeed;
    private Animator animator;

    void Start()
    {
        characterController = GetComponent<CharacterController>();
        animator = GetComponent<Animator>();
    }

     void Update()
    {
        if (Input.GetButtonDown("Fire1"))

        {
            animator.SetBool("Attack", true);
        }
        if (characterController.isGrounded)
        {
            velocity = new Vector3(Input.GetAxis("Horizontal"), 0f, Input.GetAxis("Vertical"));

            if (velocity.magnitude > 0.1f)
            {
                animator.SetBool("isRunning", true);
                transform.LookAt(transform.position + velocity);
            }
            else
            {
                animator.SetBool("isRunning", false);
            }
        }
        velocity.y += Physics.gravity.y * Time.deltaTime;
        characterController.Move(velocity * walkSpeed * Time.deltaTime);
    }
}
```
Slackで勤怠管理して可視化する

#これがあればだいたいできます
webserver+php+postgreSQL、よく使うのはPHPの正規表現、あとjavascriptを少しです。あとはSlackでCustom Integrationが使えること。

#PostgresにDB・Tableを用意
勤怠登録用と有給管理、カレンダーマスタくらいがあるとおk
運用にもよりますが、今の会社ではフレックスの予実管理と、遅刻早退管理、週休日、在宅などが管理されているので、なかなか大きいテーブルになってしまいました。

ちなみに勤怠登録用のテーブル定義です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223443/07465f5c-eefc-2589-1569-229a1db2fc99.png)


#Slackに勤怠専用のChannelを作成する
勤怠に関する入力は全てここに書き込む
私の社内ではtimesheetというChannelに登録してもらうことにしています。
朝の感じ↓(たまたま朝早い日でした)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223443/01e6f725-aaa6-7e1f-232b-fc063303995a.png)


#SlackのOutgoingWebhacksで入力された言葉をページに送る
Customize Slack→Configure Apps→Custom Integrationsでこのページまでたどり着きます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223443/eb9c092f-6879-7d5b-62c2-6b20e4728889.png)


特にトリガーは設定せず、全てを受け口のphpに送信する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223443/5da71cc5-5963-55b5-933e-06ff92d7f906.png)



#phpで勤怠コマンドに合致するものかどうかを判断させる
大体コマンドとしては20個位・・・
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223443/df88f0cc-9df0-78be-43a3-5303b11afa0e.png)


#コマンドに応じてDBへ登録
とりあえずPOSTされた言葉をキャッチして、

```php5:worktime.php
// 受信文字列取得mainmethod
if($_POST["user_name"] != "slackbot"){
    $rcvtext = $_POST["text"];
    $rcvtext = mb_convert_kana($rcvtext,'a');//「全角」英数字を「半角」に変換
    $rcvtext = str_replace('：',':',$rcvtext);//「全角」：を「半角」に変換
    $rcvtext = str_replace('／','/',$rcvtext);//「全角」／を「半角」に変換
    //どのコマンドか判別する
    $analyzetext = analyzeCommand($_POST["user_name"],$rcvtext);
```
的なところから判別メソッドに飛ばす。

ここから怒涛のpreg_match()祭りである。
連休指定用に2つの日付の判別、フレックス用に2つの時刻の判別、稼働日かどうかの判別など・・・。
様々なコマンド判定・日時の判定をクリアし、Insert、Updateをぶちかましていく。


#結果をSlackのIncomingWebhacksで返す
Webhook URLを生成して、送信時のURLに指定する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223443/4e89779c-048f-abd1-b865-13692e1ace31.png)

こんな感じである。

```php5:worktime.php

        // [Webhook URL]欄に表示されているURL
        $webhook_url ='https://hooks.slack.com/services/XXXXXXX/XXXXXXXXX/XXXXXXXXXXXXX';
        // Slackに投稿するメッセージ
        $msg = array(
            'username' => $username,
            'text' => "<@".$_POST["user_name"].">  ".$analyzetext,
            'icon_url' => $icon_url);
        $msg = json_encode($msg);
        $msg = 'payload=' . urlencode($msg);

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $webhook_url);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $msg);
        curl_exec($ch);
        curl_close($ch);
}
```

送信できると、名前の後ろにAPPと書いてあるBotチックなやつ(ちゃんと指定してるけど)が返信したように見える。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/223443/71186428-934a-00ba-0917-cb7cb4b3d820.png)

コマンドに引っかからなかった場合は、どこかしらのAIBotさんに返信を代わりにお願いしています。

#最終的にBIツールの勤怠ダッシュボードを作成して可視化
うわっ…私の勤務時間、足りなすぎ…？(入力してないだけと言う可能性も微レ存)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/223443/24f5b4af-bb48-1831-b9e0-3de73ea3cf3b.png)

>こちらを参考にさせて頂きました。

>>チャットで勤怠管理する「みやもとさん」をリリースしました
>>http://blog.masuidrive.jp/2014/10/19/miyamoto-san/
敵を全員倒したらクリア※編集中

```GameClearController.cs
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;

public class GameClearController : MonoBehaviour
{

    private GameObject[] enemyObjects;

    void Update()
    {

        enemyObjects = GameObject.FindGameObjectsWithTag("Enemy");

        print(enemyObjects.Length);

        if (enemyObjects.Length == 0)
        {

            SceneManager.LoadScene("GameClear");
        }
    }
}
```
Scipy Lecture notes > data/populations.txt > サイトからダウンロードする | PDFには明示されていない

@ Scipy lecture notes, Edition 2017.1
https://www.scipy-lectures.org/_downloads/ScipyLectures-simple.pdf
3.2.2 Basic reductions
Worked Example: data statistics
p64
https://www.scipy-lectures.org/intro/numpy/operations.html#other-reductions

> Data in populations.txt describes the populations of hares and lynxes (and carrots) in northern Canada during 20 years.

```py
In[1] !cat data/populations.txt
```

IPythonのデフォルトでdata/populations.txtのようなデータがあるかと思った。
(カレントディレクトリの下に常にdata/があるわけではないので、それは間違いだと思った）。

[Scipy Lecture notesのサイト](https://www.scipy-lectures.org/intro/numpy/operations.html#other-reductions)にはダウンロードリンクがある。

PDFファイルにはダウンロード情報は明示されていない。PDFを読んでいるとファイルの所在が不明である。

htmlのリンクとしてドキュメントを作成した場合、それをPDF化するときに誤解（もしくは情報の欠落）が生じる。
ダメージ処理(弾に触れたら爆発)※編集中

```Damage.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Damage : MonoBehaviour
{
    public GameObject Explosion;
   
    void Start()
    {
        
    }

    
    void Update()
    {

    }
    void OnTriggerEnter(Collider collision)
    {

                
        if (collision.gameObject.tag == "Ball")
        {
            
            Instantiate(Explosion, new Vector3(transform.position.x, transform.position.y, transform.position.z), Quaternion.identity);
            Destroy(this.gameObject);
        }
    }
}
```
MacでChromeとopensslを使ってOCSPを体験してみる

## 1 OCSP Staplingが使えるか確認してみる。
> OCSP Staplingが有効かどうかはopensslコマンドにより確認することができる。
Staplingが有効である場合は、レスポンスにOCSP情報が含まれる。
> [我々はどのようにして安全なHTTPS通信を提供すれば良いか - Qiita](https://qiita.com/harukasan/items/fe37f3bab8a5ca3f4f92#ocsp-stapling)

### 1.1 opensslで確認してみる。
Qiitaは使えなかった・・・:crossed_swords:

```sh
# openssl s_client -connect [サイトのサーバ]:443 -status | head
$ openssl s_client -connect www.qiita.com:443 -status | head
depth=4 C = US, O = "Starfield Technologies, Inc.", OU = Starfield Class 2 Certification Authority
verify return:1
depth=3 C = US, ST = Arizona, L = Scottsdale, O = "Starfield Technologies, Inc.", CN = Starfield Services Root Certificate Authority - G2
verify return:1
depth=2 C = US, O = Amazon, CN = Amazon Root CA 1
verify return:1
depth=1 C = US, O = Amazon, OU = Server CA 1B, CN = Amazon
verify return:1
depth=0 CN = qiita.com
verify return:1
CONNECTED(00000003)
OCSP response: no response sent <<< コレが返ってくるとOCSP Staplingは有効でないらしい。
---
Certificate chain
 0 s:/CN=qiita.com
   i:/C=US/O=Amazon/OU=Server CA 1B/CN=Amazon
 1 s:/C=US/O=Amazon/OU=Server CA 1B/CN=Amazon
   i:/C=US/O=Amazon/CN=Amazon Root CA 1
 2 s:/C=US/O=Amazon/CN=Amazon Root CA 1
   i:/C=US/ST=Arizona/L=Scottsdale/O=Starfield Technologies, Inc./CN=Starfield Services Root Certificate Authority - G2
```

## 2 OCSPのURIを使ってみる。
### 2.1 サイトを開いて鍵マークあたりを押下して、[証明書]の下にあるリンクを押下する。
![スクリーンショット 2018-04-11 22.16.25.png](https://qiita-image-store.s3.amazonaws.com/0/159761/86ca8777-ff44-6229-c3a7-435855366654.png)
### 2.2 [詳細な情報]欄を広げる。
![スクリーンショット 2018-04-11 22.16.45.png](https://qiita-image-store.s3.amazonaws.com/0/159761/3d842789-f268-3553-c172-50c759fe8662.png)
### 2.3 [オンライン証明書状況プロトコル]にある[URI]を押下する。
![スクリーンショット 2018-04-11 22.17.08.png](https://qiita-image-store.s3.amazonaws.com/0/159761/c56b74e1-1180-aea9-7489-d6d88c77fac7.png)
### 2.4 ダウンロードされたファイルを開いてみる。
「ダウンロード」というファイルがダウンロードされたので見てみる。

```sh:ダウンロード
0
```

### 2.5 返却結果の意味が分からなかった・・・・
がーーーん。

## 出典
- [証明書の失効：CRL(Certificate Revocation Lists) とOCSP](https://rms-digicert.ne.jp/howto/basis/revoked_ssl_certificates_ocsp_crl.html)
- [ApacheでOCSP Staplingを有効にしてみた | やってみよう準備](https://tech.nosuz.jp/2015/12/enable-ocsp-stapling/)
ランダムな場所にクローン生成※編集中


```Clone.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Clone : MonoBehaviour
{
    [SerializeField]
    GameObject prefab;
    int count = 0;
    int max = 50;   

    void Start()
    {
        InvokeRepeating("Generate", 1, 1);

    }
    void Generate()
    {
        if (count == max) return;
        float x = Random.Range(0f, 500f);
        float y = 0;
        float z = Random.Range(0f, 500f);
        Vector3 position = new Vector3(x, y, z);
        Instantiate(prefab, new Vector3(x, y, z), Quaternion.identity);
        count++;
    }
}
```
yum でインストール済みリストをオフラインで取得する

# 結論

## -C オプションを使います

```bash
$ yum -C list installed
php56u.x86_64                        5.6.XX-X.XXX.XXX                 @XXX
php56u-cli.x86_64                    5.6.XX-X.XXX.XXX                 @XXX
php56u-common.x86_64                 5.6.XX-X.XXX.XXX                 @XXX
...
```

インストールしたPHPのバージョン確認は、こう。

```bash
$ yum -C info php
Loaded plugins: fastestmirror
Available Packages
Name        : php
Arch        : x86_64
Version     : 5.3.XX
Release     : XX.XXX
Size        : X.X M
...
```

# なにこの記事？

昔々あるところに、過去に yum を使ってセットアップされた**っぽい**、今は隔離されたところに置かれていて外に接続できないサーバーがありました。

> これって何でセットアップしたんすか？ yumですか？

そんな単純な問に、律儀な yum は過去履歴だけでなく外部レポジトリもチェックしに行くようで走りません。過去の履歴だけでいいから。別にその後オフラインのままインストールしたいんじゃなくて、ただ、今の状態を確認したいだけなんだ。

と思ってググったけど、なかなか見つからなかったので、穴埋め係を努めさていただきました。
日付をバリデーションする関数 by JavaScript（ついでにDateの罠も紹介）

# 目的
Webフォーム上で西暦日付入力欄を作成する際、**input**タグの**type**属性で**date**がサポートされていないブラウザではカレンダー形式の入力ができず不便なので、**jQuery UI**の**datepicker**などに頼ることがあるはず。ただ、その場合だと「2019/2/29」などの無効な日付を入力することができてしまうため、（サーバサイドは当然ながら）クライアントサイドでバリデーションすることが必要になる。
そこで、**JavaScript**で日付文字列のバリデーションする関数を示す。併せて、**JavaScript**の**Date**オブジェクトの罠を1つだけ紹介する。


# 日付バリデーション関数

```JavaScript:

function isValidDate(text) {
  if (!/^\d{1,4}(\/|-)\d{1,2}\1\d{1,2}$/.test(text)) {
    return false;
  }

  const [year, month, day] = text.split(/\/|-/).map(v => parseInt(v, 10));

  return year >= 1
    && (1 <= month && month <= 12)
    && (1 <= day && day <= daysInMonth(year, month));

  function daysInMonth(year, month) {
    if (month === 2 && isLeapYear(year)) {
      return 29;
    }

    return {
      1: 31, 2: 28, 3: 31, 4: 30,
      5: 31, 6: 30, 7: 31, 8: 31,
      9: 30, 10: 31, 11: 30, 12: 31
    }[month];
  }

  function isLeapYear(year) {
    return ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);
  }
}

```

はじめに<1-4ケタの数字><セパレーター(/ or -)><1-2ケタの数字><最初のセパレーターと同じ文字><1-2ケタの数字>のパターンになっているかを正規表現で確認する。これによって、入力パターンが無限個から有限個に絞られ、後続の処理で考慮しなければならないことがだいぶ減る。
あとは年、月、日の値がそれぞれ範囲内に収まっているかをうるう年を考慮しながら調べるだけ。


# 改良版？
[https://kantaro-cgi.com/blog/javascript/javascript_date_check.html　（2018/4/13　アクセス）](https://kantaro-cgi.com/blog/javascript/javascript_date_check.html)
たまたま見つけたリンク先を参考にして改良？したコードがこれ。

```JavaScript:

function isValidDate(text) {
  if (!/^\d{1,4}(\/|-)\d{1,2}\1\d{1,2}$/.test(text)) {
    return false;
  }

  const [year, month, day] = text.split(/\/|-/).map(v => parseInt(v, 10));

  // ここまでは一緒で、ここから下が変更点
  const date = new Date(year, month - 1, day);

  return date.getFullYear() === year
    && date.getMonth() === month - 1
    && date.getDate() === day;
}

```

リンク先のコードは、コンストラクタ関数じゃないのに関数名の先頭が大文字になっていたり、let（あるいはvar）もなしに関数内で変数を宣言・初期化していたりとツッコミどころはあるが、はじめに自分が書いたコードと比べると短くて、よりエレガントだなとそこは素直に降参。

**C#**では**DateTime**構造体のコンストラクタに無効な年月日（ex. 2019/2/29）の数値を与えると例外がスローされるので、これを利用するとバリデーション処理がシンプルになるが、**JavaScript**の**Date**オブジェクトのコンストラクタでは例外はスローされなかった（2019年3月1日のインスタンスが生成される）ので、そこで諦めていたがこんなに上手い方法があるとはと感心した…が、


# **Date**コンストラクタ関数の罠
ところが改良後のコードをテストすると有効な日付（ex. 0001/01/01）なのにfalseが返ってくることがある。
なので、ちょっとMDNの**Date**オブジェクトのページを調査。
[https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date　（2018/4/13　アクセス）](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Date)

コンストラクタ関数の引数 _year_ の説明によると、
>_year_
年を表す整数値です。0 から 99 までの値は、1900 から 1999 の値にマッピングされます。互換性のために (2000 年問題を回避するために)、常に完全な年を指定するべきです。例えば 98 より も 1998 を使いましょう。後述の例 を参照。

とのこと。

よって、改良したつもりのコードにはバグがあり、利用してはいけないことが分かった。


# 裏話
昔、オフショアしていて、国外にいるデベロッパーさんに「日付のバリデーション処理忘れずにお願いします」と頼んだが、ピュア？な正規表現だけ（手続き型の処理が一切含まれてないの意）で実装されたものがあがってきた。
試しに正規表現部分をコピーしてエディタに貼り付けたところ文字数が500文字を超えているのを見て目眩がしたが、テストしてみると直近のうるう年などの対応はうまくできているっぽい。
が、あまりにも大きな正規表現だったため、すべてのケースをテストしてみないとレビューOKとする自信がなく、早々にNGにしてやり直しを要求した、というか自分でこの記事で紹介したコードを書いて送った。

正規表現だけでうるう年とかも考慮した日付のバリデーションって実現できるのだろうか？
Numpy > array comparisons > np.all()の使用

@ Scipy lecture notes, Edition 2017.1
https://www.scipy-lectures.org/_downloads/ScipyLectures-simple.pdf
3.2.2 Basic reductions
Other reduction
p63
https://www.scipy-lectures.org/intro/numpy/operations.html#other-reductions

> Note Can be used for array comparisons:

np.all()とnp.any()を使ったarray comparisonが可能とのこと。

https://ideone.com/5cq8Uq

```py
import numpy as np

a = np.array([1, 2, 3, 2])
b = np.array([2, 2, 3, 2])
c = np.array([6, 4, 4, 5])
res = ((a <= b) & (b <= c)).all()
print(res)

```

```txt:run
True
```

比較した結果がリストでTrueかFalseの要素を持ち、それがすべてTrueの時にresがTrueになるという流れ。

.all()がない場合は、`[True  True  True  True]`がresに入る。
libheif の heif-convert コマンド

libde265 で有名な struktur AG さんが HEIF を JPEG や PNG に変換するツールを公開しているので、そのビルドと使い方メモです。
~~あと、このツールは HEIF 生成は出来ません、あくまで読むのだけ。~~

:::note info
いつの間にかエンコードも出来るようになっていました。デコードは libde265 のままで、エンコードには x265 を使います。 (2018/08/02 追記)
:::

HEIF は画像を H.265/HEVC Iフレーム1コマとして持ち、それを ISOBMFF(QuickTime の後継コンテナ仕様)で包んだ画像形式です。詳しくはこちらをどうぞ > https://speakerdeck.com/yoya/heif-kaisetsu


# レポジトリ

- https://github.com/strukturag/libde265
- https://github.com/strukturag/libheif
- https://bitbucket.org/multicoreware/x265

# libde256 のビルド

```shell
% git clone git@github.com:strukturag/libde265.git
% cd libde265
% git checkout v1.0.2
```

2種類のビルド方法が用意されています。README.md には cmake 方式が案内されているので、こっちが推奨だと思われます。

- cmake 方式

```shell
% mkdir build
% cd build
% cmake ..
% make
```

- automake 方式

```shell
% ./autogen.sh
% ./configure
% make
% make install
```

# libheif のビルド

```shell
% git clone git@github.com:strukturag/libheif.git
% cd libheif
% git checkout v1.0.0
```

- cmake 方式

```shell
% mkdir build
% cd build
% cmake ..
% make
```

- automake 方式

```shell
% ./autogen.sh
% ./configure
% make
% make install
```

# コマンド実行

引数１つ目にHEIF画像ファイル、２つ目に出力先画像を指定します。拡張子に応じて JPEG や PNG を出力します。

```shell:
% which heif-convert
/usr/local/bin/heif-convert
% heif-convert IMG_0001.HEIC output.JPG
File contains 1 images
% heif-convert IMG_0001.HEIC output.PNG
File contains 1 images
% 
```

# 蛇足

ImageMagick の Delegate 設定でこの heif-convert コマンドを繋げると、HEIC画像を読み込みできます。<del>（書き出しはできません)</del>

-  ImageMagick で HEIF 画像を読む方法 (Delegate 方式で)  
 - https://qiita.com/yoya/items/cc7cda887b4c2666ab52

最新版 ImageMagick では HEIF 対応していますが、どうしても古いバージョンの ImageMagick で HEIF を読みたい。といった場合にどうぞ。

あと、今のところ ImageMagick に入った HEIC コーダー(coders/heic.c) は出来がよくないので、こっちの方が便利。。

:::note info
ImageMagick の HEIC コーダー。独自でコンテナ組み立てしていたのを全部捨てて、libheif を使う方式で作り直したので、良い感じになりました。 (2018/08/02 追記)
:::
Pacakge.jsonの更新 (npm-check-updates)

# version
- node 8.9.4


ただのメモ
最新のpackage.jsonにしたい。その時の手順  

npmで最新との比較をする。

```
$ npm outdated

Package            Current  Wanted  Latest  Location
truffle              4.1.3   4.1.5   4.1.5  study_solidity
zeppelin-solidity    1.7.0   1.8.0   1.8.0  study_solidity
```

ncu　でもnpm outdatedと同じ物がでる事を確認

```
$ npm install --save-dev npm-check-updates
$ ./node_modules/.bin/ncu 
Using ~ package.json
⸨░░░░░░░░░░░░░░░░░░⸩ ⠏ :
The following dependencies are satisfied by their declared version range, but the installed versions are behind. You can install the latest versions without modifying your package file by using npm update. If you want to update the dependencies in your package file anyway, run ncu -a.

 truffle            ^4.1.3  →  ^4.1.5 
 zeppelin-solidity  ^1.7.0  →  ^1.8.0 


$ ncu -a
```
ここで package.jsonの更新を確認した。  
このままnpm install を実行したらエラーになってしまったので  
めんどいから 削除再インストールした。

```
$ rm -rf node_modules package-lock.json 
$ npm install
```

ま〜他の記事ではncu -u ってのがあったけど、更新されなかった。  
pakage-lock.jsonとかその辺りの影響があったのかも。  
目的は達成できたのでよし。
QRコードジェネレータの怠惰な作り方(Xamarin.Forms)

# なにがしたいのか
めっちゃ簡単にQRコードを生成したい。

# 完成品
以下がUWPでの動作画面。Androidでも動いた。iPhoneはやってないけど、たぶんうごく。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/91558/3a2c3108-f0b6-1f3c-5fe6-f1a20a11a9d2.png)


# コード
ImageにGoogle ChartsのQR Codes APIを使って画像をはめるだけ。
[QR Codes  |  Infographics  |  Google Developers](https://developers.google.com/chart/infographics/docs/qr_codes)

```cs:MainPage.xaml
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
			 xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
			 xmlns:local="clr-namespace:QRGen2"
			 x:Class="QRGen2.MainPage">
	<StackLayout>
		<Entry x:Name="inputTxt" />
		<Button x:Name="genBtn" Text="generate" Clicked="GenBtn_Clicked" />
		<Image x:Name="qrImage" />
	</StackLayout>
</ContentPage>
```

```cs:MainPage.xaml
using System;
using Xamarin.Forms;

namespace QRGen2
{
	public partial class MainPage : ContentPage
	{
		public MainPage()
		{
			InitializeComponent();
		}

		void GenBtn_Clicked(object s, EventArgs e)
		{
			// 重要なのはここだけ
			string urlEnc = System.Web.HttpUtility.UrlEncode(inputTxt.Text);
			string reqUrl = $"https://chart.googleapis.com/chart?cht=qr&chl={urlEnc}&chs=300x300&chld=H|1";
			qrImage.Source = reqUrl;
		}
	}
}
```

# 問題
・遅い、インターネット環境が必要

# 感想
そもそもZXing.Net.Mobileを使ってQRコードを生成したかったけど、なんかできなかったので作りました。
ZXing.Net.Mobileを使って生成できた人教えてください。
C++ Builder XE4 > Excel > Link > Access to Excel cells in "C++ Builder XE4" | +入力ファイル情報

```txt:実装環境
C++ Builder XE4
```

```txt:動作環境
Windows 8.1 Pro (32bit)
Excel 2016
```

XE4でExcelファイルの読込みと書出しができないか探していた。

@mojeld さんの記事が見つかった。
[Access to Excel cells in "C++ Builder XE4"](http://mojelder.hatenablog.com/entry/2015/06/29/112326)

情報感謝です。

### ファイル

以下のExcelファイルを用意する。

- Name: あいうえお.xlsx
- シート名: チェック
- 以下のようなデータを用意する
    - セルC5に値が入っていること (例: 43)

処理前    
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/6a931de5-2ca4-2071-6ffe-a6b8c4ae6d0d.png)

処理後
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/a9a2305a-3bfa-5dd7-aba5-9f0125c07049.png)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/6c3caa54-a066-57f7-542b-5d0586e9ec06.png)

### code v0.2

セルへの読書の処理を関数にしてみた。
また、書き方を自分のスタイルに変更している。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <System.Win.ComObj.hpp>  // EXCEL処理用
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------

/*
v0.2 Apr. 13, 2018
	- add setCellValue()
	- add getCellValue()
v0.1 Apr. 13, 2018
	imported from
	http://mojelder.hatenablog.com/entry/2015/06/29/112326
*/


__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------

static String getCellValue(Variant asheet, int row, int col)
{
	return asheet.OlePropertyGet("Cells").
			OlePropertyGet("Item", row, col).OlePropertyGet("Value");
}

static String setCellValue(Variant asheet, int row, int col, WideString val)
{
	asheet.OlePropertyGet("Cells").
		OlePropertyGet("Item", row, col).OlePropertySet("Value", val);
}

void __fastcall TForm1::B_convertClick(TObject *Sender)
{
	static const WideString kXlsFile = "あいうえお.xlsx";

	Variant ExcelApp = CreateOleObject("Excel.Application");
	try
	{
		WideString inFilename = ExtractFileDir(ParamStr(0)) + "\\" + kXlsFile; // Openに使う文字列はWideString定義
		WideString inSheetname = L"チェック"; // シート名もWideString (または番号)
		Variant xls_books;
		Variant xls_abook;
		Variant xls_sheets;
		Variant xls_asheet;
		WideString writeText = "文字";  // 書き込む文字列 // WideString型で定義

		try
		{
			ExcelApp.OlePropertySet("Visible", false); // Excel not shown

			xls_books = ExcelApp.OlePropertyGet("Workbooks");
			xls_abook = xls_books.OleFunction("Open", inFilename);
			xls_sheets = xls_abook.OlePropertyGet("WorkSheets");
			xls_asheet = xls_sheets.OlePropertyGet("Item", inSheetname);

			this->Caption = getCellValue(xls_asheet, 5, 3);
			setCellValue(xls_asheet, 1, 1, writeText);

			xls_abook.OleProcedure("Save"); //開いた*.xlsxを保存
			ExcelApp.OleProcedure("Quit"); //Excel終了。
		}
		__finally
		{
			xls_asheet = Unassigned(); // 変数を初期状態に
			xls_sheets = Unassigned();
			xls_abook = Unassigned();
			xls_books = Unassigned();
		}
	}
	__finally
	{
		ExcelApp = Unassigned();
	}
}
//---------------------------------------------------------------------------
```
【Raspberry Pi Zero W】Wi-Fiクライアント／サーバ（AP）切り替え

##概要
自宅ではWiFiのクライアント動作し、WiFiのない環境では自らWiFiのサーバ（アクセスポイント）になることで、いつでもラズパイにアクセスしたいと思い、以前、[別の記事](https://qiita.com/sunaga70/items/e5b0cbd00c687b51f428)でWiFiドングルを2つ接続することで実現しました。
しかし、Zeroだと、USBポートも少ないし、消費電力的にも厳しいと思い、（手動ですが）簡単に切り替えられる仕組みを考えてみました。
自宅の環境（例えば、ファイルサーバ、Webサーバ等）をモバイルでも使用（公開）できて便利ですよ。


##構成イメージ
　自宅
　　Wifiルータ（アクセスポイント）
　　　└ Raspberry Zero W（WiFiクライアント：wlan0：192.168.1.2）
　　　└ 端末（Wi-fiクライアント：192.168.1.100～200）

　外出先
　　Raspberry Zero W（アクセスポイント：wlan0：192.168.2.1）
　　　└ 端末（Wi-fiクライアント：192.168.2.100～200）

##自宅設定（WiFiモード）
　それぞれだと思うので参考程度に。。

```Bash:
$ sudo vi /etc/network/interfaces
・・・
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.1.2
netmask 255.255.255.0
gateway 192.168.1.1
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
```

```Bash:
$ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
・・・
network={
        ssid="使用するSSID"
        psk="上記SSIDのパスワード"
}
```

##外出先設定の構築（APモード）
外出先設定を上書きしてしまうので、まずはバックアップしてから編集し、同様にバックアップ。

```Bash:
$ sudo cp -p /etc/network/interfaces ~/wifi_interfaces
$ sudo vi /etc/network/interfaces
・・・
allow-hotplug wlan0
iface wlan0 inet static
address 192.168.2.1
netmask 255.255.255.0
$ sudo cp -p /etc/network/interfaces ~/ap_interfaces
```

アクセスポイントとDHCPサーバの環境構築は[別の記事](https://qiita.com/sunaga70/items/e5b0cbd00c687b51f428#%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88%E3%81%A8dhcp%E3%82%B5%E3%83%BC%E3%83%90%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%8A%E3%82%88%E3%81%B3%E8%A8%AD%E5%AE%9A)参照。
違いはwlan1でなくwlan0。

##切替
現在APモードとして動作している前提で、WiFiモードに切り替えます。

```Bash:
$ sudo systemctl disable hostapd
$ sudo systemctl disable isc-dhcp-server
$ sudo cp -p wifi_interfaces /etc/network/interfaces

$ sudo reboot
```

再起動後、WiFiモードになっていれば成功。次はその逆。

```Bash:
$ sudo systemctl enable hostapd
$ sudo systemctl enable isc-dhcp-server
$ sudo cp -p ap_interfaces /etc/network/interfaces

$ sudo reboot
```

再起動後、APモードになっていれば成功。
もう少し楽するため、スクリプト化。

```Bash:
$ vi ~/netch.sh
```

```Bash:netch.sh
#!/bin/bash

if [ "$1" == "ap" ]; then
    sudo systemctl enable hostapd
    sudo systemctl enable isc-dhcp-server
    sudo cp -p /etc/network/interfaces /etc/network/interfaces.bak
    sudo cp -p ap_interfaces /etc/network/interfaces
elif [ "$1" == "wifi" ]; then
    sudo systemctl disable hostapd
    sudo systemctl disable isc-dhcp-server
    sudo cp -p /etc/network/interfaces /etc/network/interfaces.bak
    sudo cp -p wifi_interfaces /etc/network/interfaces
else
    echo "abort."
    exit
fi

cat /etc/network/interfaces

read -p "reboot ok? (y/N): " yn
case "$yn" in [yY]*) ;; *) echo "abort." ; exit ;; esac

sudo reboot
```

WiFiモードにする場合

```Bash:
$ ./netch.sh wifi
・・・
reboot ok? (y/N):y
```

APモードにする場合

```Bash:
$ ./netch.sh ap
・・・
reboot ok? (y/N):y
```

##応用 
Raspberry Pi Zero W は Bluetooth が使用できるので、[Bluetoothリモートシャッターで写真撮影](https://qiita.com/sunaga70/items/89e2d1eecfd73d3fef21)を参考に、多少改造すれば、ボタン操作での切り替えも可能ですね。
SQL初学者のコマンドの入り口

#MySQLにルートでログインしよう
```sql
sql -u root
mysql>
```
とりあえずいじって勉強するならrootで入る。

#データベースを選択しよう
```sql
mysql> use testDB;
```
`use データベース名`で入力する。

#テーブル一覧を見よう
```sql
mysql> show tables;
```
これで選択したデータベースのテーブル一覧が見れる。

#テーブルの概要を見よう
```sql
mysql> desc table1
```
これでテーブルのカラムやタイプ等の一覧を表示できる。

#データを選択しよう
```sql
mysql> select * from table1 where column1 = 1;
```
解説
`select *` フィールド名(カラム名)を全て選択している。
`from table1`テーブル名table1を選択する。
`where column1 = 1`条件としてカラム名column1の値が1のレコードを取得する。
Elasticsearchのupdate

---
[Scriptを使ったupdate方法](https://qiita.com/fujieee/items/3199585d95e68e17f11a)は調べたのに、
シンプルなパターンのupdateがわからなかったので調べました。

- リクエスト

```
POST index_name/type_name/{{ ドキュメントの_id }}/_update?pretty=true
{
  "doc": { "user_name": "ヨシヒコ" }
}
```
- レスポンス

```
{
   "_index": "index_name",
   "_type": "type_name",
   "_id": "{{ ドキュメントの_id }}",
   "_version": xxx
}
```
これで、対象の_idの対象のフィールドの値だけが更新できました。
Homestead のインストール手順

## 環境
* Windows 10
* Laravel 5.6
* Vagrant 2.0.2
* Git 1.9.4

## 手順
* vagrant box インストール

        vagrant box add laravel/homestead

* homestead gitを適当な場所にクローン

        git clone https://github.com/laravel/homestead.git Homestead

* init.bat を実行
    * Homestead.yaml とかが作られる
        
* Homestead.yml を編集
    * 下記の項目を環境に合わせて編集
    
            folders:
                - map: C:\laravel\
                  to: /home/vagrant/code

            sites:
                - map: homestead.test
                  to: /home/vagrant/code/public

    * ```homestead.test```でないと、http:// にアクセスができない
        * ```homestead.app``` だと自動で https:// にリダイレクトされるが、chromeだと自己認証は警告対象なのでアクセスできない
              
* Windows ```hosts``` を編集
    * 下記1行を追加
    
            192.168.10.10  homestead.test

* Git Bash (じゃなくてもいけど) で ssh 認証鍵を作る

        #鍵をつくる用のフォルダを作成して移動
        mkdir ~/.ssh && cd $_

        #鍵作成
        ssh-keygen -t rsa -b 4096 -C <メールアドレス>
        #作成場所、任意パスキー、全部enterでスキップして問題無いが、Homestead.yml で指定した個所に鍵を作成する事

* Homestead をクローンした場所で vagrant up

        cd c:\Homestead\
        vagrant up
        
* http://homestead.test にアクセス
    * Laravel ホームが出れば成功

*基本的にはこことかオフィシャルのマニュアルの通りに行えば事足ります*
Laravel 5.6 Laravel Homestead
https://readouble.com/laravel/5.6/ja/homestead.html

便利な世の中になったね。
仮想環境を構築して、カーネル再構築を体験してみよう。

# 仮想環境の準備
## Vagrant上にLinuxを用意する
```
% vagrant box add debian-8-jessie https://github.com/holms/vagrant-jessie-box/releases/download/Jessie-v0.1/Debian-jessie-amd64-netboot.box
% vagrant box list
% vagrant init debian-8-jessie

% vagrant up
% vagrant ssh
```

# 必要ファイルの準備


カーネルパッケージのインストール

```
% sudo apt-get install kernel-package
```

カーネルリリースバージョンを確認する

```
vagrant@jessie:/etc/modules-load.d$ uname -rn
jessie 3.16.0-4-amd64
```

バージョンに合ったカーネルソースをインストールする

```
% sudo apt-get install linux-source-3.16
```

インストール先を確認する。/usr/src以下にインストールされていると思います。

```
# dpkg -L linux-source-3.16
```

おとしたままだとtarで固められているので解凍する

```
vagrant@jessie:/usr/src$ sudo tar xf linux-source-3.16.tar.xz
```

カーネルコンフィグのための設定ファイルをもってくる。
現在の設定を引っ張ってきます。

```
vagrant@jessie:/usr/src/linux-source-3.16$ sudo cp /boot/config-3.16.0-4-amd64 .config
```

menuconfigのためにncursesが必要なのでいれます。

```
vagrant@jessie:/usr/src/linux-source-3.16$ sudo apt-get install libncurses5-dev
```

# カーネル設定ファイルを眺めてみる
スペースを押すたびに、*でカーネルに組み込み、Mでローダブルモジュールとして扱えるようにする

```
# make menuconfig
```

# カーネルを再構築します
カーネルを区別するためにMakefile の EXTRAVERSION を変更してみる
例えば EXTRAVERSION = -hogehoge-686

```
$ vi Makefile
　　(開いてEXTRAVERSIONを書き換えます)
$ make
```

カーネルとカーネルモジュールもインストールします

```
# make modules_install
# make install
```

#ブートローダの設定
GRUBの設定でdefaultで立ち上がってくるカーネルのインデックスを変更します

```
# vim /boot/grub/menu.lst
```

# 確認
新しいカーネルで立ち上がっていることを確認します。

```
# uname -r
3.2.72-hogehoge-686
```
コマンドラインからファイルの合計サイズを表示する

`ls -l` でファイルの詳細情報を表示して (`grep` で計算したいファイルの絞り込みをして)、`awk` でファイルサイズを合計します。

```
[centipede@nginx-12]# ls -l
...
-rwxr-xr-x 0 root root  90431287  3月 31 11:35 2018 ssl.access.log.2018033110.gz
-rwxr-xr-x 0 root root  82394003  3月 31 12:35 2018 ssl.access.log.2018033111.gz
-rwxr-xr-x 0 root root  82359396  3月 31 13:35 2018 ssl.access.log.2018033112.gz
-rwxr-xr-x 0 root root  94798168  3月 31 14:35 2018 ssl.access.log.2018033113.gz
-rwxr-xr-x 0 root root 102199568  3月 31 15:35 2018 ssl.access.log.2018033114.gz
-rwxr-xr-x 0 root root 107884837  3月 31 16:35 2018 ssl.access.log.2018033115.gz
-rwxr-xr-x 0 root root 117452253  3月 31 17:35 2018 ssl.access.log.2018033116.gz
-rwxr-xr-x 0 root root 113485673  3月 31 18:35 2018 ssl.access.log.2018033117.gz
-rwxr-xr-x 0 root root  98886813  3月 31 19:35 2018 ssl.access.log.2018033118.gz
-rwxr-xr-x 0 root root 101206446  3月 31 20:35 2018 ssl.access.log.2018033119.gz
-rwxr-xr-x 0 root root 133360196  3月 31 21:35 2018 ssl.access.log.2018033120.gz
-rwxr-xr-x 0 root root 155181911  3月 31 22:35 2018 ssl.access.log.2018033121.gz
-rwxr-xr-x 0 root root 173862342  3月 31 23:35 2018 ssl.access.log.2018033122.gz
-rwxr-xr-x 0 root root 149713031  4月  1 00:35 2018 ssl.access.log.2018033123.gz
[centipede@nginx-12]# ls -l | grep -E '201803[23]' | awk '{sum += $5}; END {print sum}'
149713031
```
Anacondaを使ってMac OSにOpenCVをインストールする

### 経緯

MacOSにOpenCVをインストールしようとした際に、

 - 手順が多い

 - pipでインストールしたけどモジュールがない

 - "ImportError:No module named cv2"



など様々な記事を見かけたので今回は以下のステップでOpenCVをMacOSにインストールしていきます






## pyenvのインストール
1.Homebrewを使ってpyenvをインストール

```
$ brew install pyenv 
```

<br>

2.pyenvのpathを通す

```
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
```

<br>

※Homebrew自体をインストールしていない方は先人の記事がありますのでこちらを参考にしてください


macOSにHomebrewをインストール
https://qiita.com/pypypyo14/items/4bf3b8bd511b6e93c9f9





## Anacondaのインストール
1.pyenvを使ってAnacondaをインストール

```
$ pyenv install anaconda3-4.2.0
```

<br>

今回はPython3用のanaconda3-4.2.0をインストールしましたが、各自Pythonのバージョンに合わせてください

<br>

2.インストールしたAnacondaに切り替える

```
$ pyenv global anaconda3-4.2.0
```


<br>
ここまででOpenCVをインストールする準備が整いました

## OpenCVのインストール
Anacondaを使ってOpenCvをインストールしていきます

```
$ conda install -c menpo opencv3 
```

<br>

以上です。簡単でしたね
Pythonを起動し、

```
import cv2
```

としてもエラーが返って来なければ成功です

お疲れ様でした

<br>
<br>
Bootstrapでカラーテーマを新しく追加する

# Bootstrap v4.0.0 でカラーテーマを新しく追加する

既存の命令語のほかにさらに追加する必要があったのでやり方をメモ

1. _variables.scss の中に下記のように追加

```scss
    //テーマの追加
    $theme-colors: map-merge((
      .
      .
      .
      "add-theme":    $primary
    ), $theme-colors);
```

おわり

ググっても出てこなかったのは簡単すぎるからか。
正規表記



正規表現（regular expression）とは、文字列の集合を一つの文字列で表現する方法の一つである。
by wiki



```
> "string".class
=> String

> /regexp/.class
=> Regexp

```

##str.sub(pattern, replacement)

```
> str = "林さん、お元気ですか"
=> "林さん、お元気ですか"
> str.sub(/さん/, "様")
=> "林様、お元気ですか"
```

##str.gsub(pattern, replacement)

```
> str = "痛い、痛い、ドアに足をぶつけた！"
=> "痛い、痛い、ドアに足をぶつけた痛い！"

> str.gsub(/痛い/, "痛くない")
=> "痛くない、痛くない、ドアに足をぶつけた痛くない！"
```


Ruby 正規表現の使い方：
https://qiita.com/shizuma/items/4279104026964f1efca6
を参考にさせていただいてます。
HARR より LBPのほうがかけた時間に対して得られる成果が大きい気がする。

メモにてポエム

OPENCVのカスケードトレーニングをして、同じ学習データでHARRとLBPのトレーニングをして結果を見てみたのですが、同じデータセットでLBPだと12時間、HARRで3日くらい時間がかかりました。正解3000、不正解4000くらいです。

結論としては、大体それっぽいところを持ってくるということでいえばLBPのほうがコストパフォーマンスが高いです。
なぜHARRがデフォルトなのかわからないくらいです。

以上
karabiner-Elementsのプロファイルをコマンドラインから切り替える方法 How to switch karabiner-elements's profile by command line

自席にいるときは、windows外付けキーボードと使い、ミーティングでMBPを持って行くときは
内臓キーボードを使っている。
配列がそれぞれJIS、ANSIとなっており、いちいち切り替えるのが面倒だったので、コマンドラインで
切り替えられるようにした。
When I am in my seat, I use windows USB keyboard(JIS).
But my MBP's key layout is ANSI.
When I use internal keyboard, it was bothering to switch.
So I improve that.

やり方は簡単
1. プロファイルを2つ（外付けキーボード用、内臓キーボード用）作る
make 2 profiles (one for USB keyboard(JIS layout), another one is for internal keyboard(ANSI layout))
![スクリーンショット 2018-04-13 10.45.16.png](https://qiita-image-store.s3.amazonaws.com/0/55504/f5c0fe82-784a-fb84-6c63-a418be4cdea8.png)
2. [karabiner-profile-switch](https://www.npmjs.com/package/karabiner-profile-switch)をインストールする
install [karabiner-profile-switch](https://www.npmjs.com/package/karabiner-profile-switch)

```
$ kps
Karabiner-Elements profiles:
    1) real-force
 -> 2) Apple keyboard
Please select profile number: 1
Setting active profile: Internal Keys
Saving data...
Done.
```

参考：
[karabiner-profile-switch](https://www.npmjs.com/package/karabiner-profile-switch)
Mac でWindows ーWindows をインストールした外付けドライブでMacを起動する。

# Mac でWindows を考えている人への覚書


## Winのためにディスクスペースを取られたくない、お金をかけたくない.

いろんな記事で、BootCampやら仮想化マシンの話は見聞きするけど、意外と、容量とお金の問題を考えるとイマイチ腰が重いという人もいるかと思う。特に、頻繁にＷｉｎを使う必要がない人はそうでしょう。

　案外忘れられがちな選択肢が、Windows をインストールした内蔵／外付けドライブでMacを起動する方法です。裏技でもなく、公式にサポートされた機能ですから安心してＧＵＩで操作できます。

公式にサポートされた機能なので、詳細な手順、情報は下記アップルのサイトを参照ください。


https://support.apple.com/ja-jp/HT202796
[Review] Now of DeepLearning Research LABs

## Facebook AI Research
Check this coggle link!
https://coggle.it/diagram/WojhGCGMFQABHFKM/t/facebook-research/d7241a0723d71018b9cb2916db850e00d5d25dfa588f61b63bc7351d5e387aa7

## Other organisaitons
http://deeplearning.net/deep-learning-research-groups-and-labs/
windowsでmafftによるアライメント

#mafftとは
mafftとは複数のDNA配列やアミノ酸配列を一致するように並べるマルチプルアライメントツールである。

今回はwindowsでmafftを使う必要があったのでその際の操作を記録しておく

#インストール
https://mafft.cbrc.jp/alignment/software/windows.html
こちらのURLの真ん中にあるALL-in-one versionを使用した

zipファイルをダウンロード後そのファイルを右クリックし展開する。
展開後mafft-winというファイルができていたらインストールは終了。

#アライメント
mafft-winフォルダにアライメントしたいfastaファイルを移動する
また,アライメントあとのファイルの格納場所としてafter等と名前を付けてフォルダを作成する

一つのファイルをアライメントしたい場合は(https://mafft.cbrc.jp/alignment/software/windows_without_cygwin.html)
こちらのホームページの通りにwindows powershellから行ったほうが簡単なのだが,
複数のファイルをアライメントする際はかなりの重労働であるのでbatファイルを作る。


メモ帳を開き下のテキストをコピーして貼り付ける


```bat 
@echo off

for %%i in (*fasta) do (
echo %%i
mafft --ep --auto --inputorder %%i > after/%%i

) 
echo Done
pause
```

--ep,--auto,--inputorderの部分はアライメントに対する方法などを選択できる
https://mafft.cbrc.jp/alignment/software/manual/manual.html
こちらのサイトを参考に
アプリが意図した通りに動かない時にチェックする時に

今回アプリの制作が想像以上に時間がかかってしまったことに対しての自己反省をして記事を書いています。
アプリが動かない時に、参考にして頂けましたら幸いです。

#基本的な確認
まず、一番有り得るのが、『;』セミコロンのつけ忘れ。
それから、変なところにスペースが入っている。
全角と半角の間違い。

ディスプレイが小さいなどソースコードが読みづらい時は、IDEやテキストエディタの検索機能を使うと良いです。
;をキーワードに検索して色が変わらない;がある時は、それは全角の;（セミコロン)です。
ダブルコーテーションが全角で誤って入力してしまうこともあると思います。

#ソースコードを見るときのポイント
ただ単に、ソースを眺めていても、時間の無駄です。
ソースを見るときは、見本になる比較対象のソースを用意すると良いです。

今回私は、Cordovaを使ってアプリを作っていました。
煮詰まったので、Monacaにログインして、テンプレートを比較して見てました。
また、センサーの使い方も、サンプルのコードを見て再確認していました。

ネットが思うように使えないので、ちゃんと普通の速度があるネットに接続できる場所に行ってMonacaのIDEに接続したかったので、都合をつけるまでに時間がかかってしまいました。

MonacaのIDEのログの表示は、とても見やすかったです。
デバッグも、Monacaで行ってみました。

Monacaは、サードパーティー製のプラグインを利用する時は、有料プランでないと利用できないです。
そのため、今回は、動くところまでデバッグしました。
そして、最後にVisualstudioで、実機を接続してデバッグしました。

##思い込みが墓穴を掘る
ソースを見直す時に、思い込みがあるとミスを見逃します。
今回も、発見が遅れてしまい時間を無駄にしてしまいました。

#JavaScriptのイベントに注意
デバイスの準備ができたり、onsenUIの準備ができたりした時に発火するイベントが有ります。
でも、イベント発生をなんで「発火」と表現するのでしょうね。
トリガーとか、発生ではダメなのですかね。

今回、デバイスのセンサーが準備できたイベントを利用するイベントを利用していなかったことが、最大の失敗です。
先に書いた記事の通り、このコードを付け加えたら、音声合成のTTSのプラグインも問題なく動きました。

イベントを理解していなかったために、無駄に時間を費やしてしまいました。

JavaScriptで変数などの初期設定のコード以外は、イベントで動くように関数を使った方が間違い無いです。
そして、自分が使いたい前に起きるイベントを拾うように関数を使うと良いと思います。
イベントを拾う関数の中身は、空でも良いようです。
イベントを使うか、使わないかでアプリの動作が変わってしまいます。

#まとめ
まだアプリが完成したわけでは無いですが、意図した通りにアプリが動くようになったので、反省の思いが他のアプリ開発を志す人の役に立てばと思い記事を書きました。
ネットには、プログラミングの相談や質問ができるサイトが複数あります。
私も複数参加していて、今回も利用しました。
でも、思うように回答を頂けない場合もあり、自分で解決策を見つけ出すということになりました。
今回の時間が無駄にかかってしまったことは、JavaScriptのコードを書き慣れている人にとっては基本だと思います。
あまりに基本的な質問だったから、回答を得られなかったかもしれないです。
私は、限られた環境でプログラミングしているので、余計な手間をかけたり思わぬ失敗をしたりすることもあります。
こうした経験を、私が参加しているサイトで質問している人に対して回答ができるように活かして行きたいと思っています。
Linuxで特定の拡張子のファイルを削除する

いつも思い出せず検索しているので。
`/hoge` 以下の拡張子が `.foo` のファイルを再帰的に削除。

```
$ find /hoge -type f "*.foo" -delete
```

### 参考
特定の拡張子のファイルを削除
https://qiita.com/puriketu99/items/02d5e4611192077dabd6

特定の拡張子を持つファイルをサブディレクトリまで検索して削除
http://kusumoto-jp.org/article.php/find
codeコマンドが突然使えなくなった時 

今まで普通に使えていたのが突然下記エラーで使えなくなりました。
パスはちゃんと通っているのに……。

```bash:command
$ code README.md
/bin/bash: C:/Program Files/Microsoft VS Code/bin/code: No such file or directory
```

`.bashrc` へ、下記を追加で使用できるようになります。
**※要コンソール再起動（もしくは `source ~/.bashrc` ）**

```bash:.bashrc
alias code="cmd //C code $*"
```