OmniAICreator/Qiita-1.07M huggingface dataset:
CLOCとGitで日本語ファイル名のファイルを比較する

# はじめに
CLOCというツールでステップ数を集計しようとしたら、日本語のファイル名でエラーになりました。
それを解決した話。

# 結論
まず、結論から。
環境はMac。
エラー内容はこんな感じ。

```
$ cloc --git --diff release feature
fatal: pathspec 'myrepository/\343\202\212\343\203\274\343\201\251\343\201\277\343\203\274.md' did not match any files
Failed to create tarfile of files from git. at /usr/local/Cellar/cloc/1.84/libexec/bin/cloc line 4713.
```

圧縮ファイルが作れないって言ってる。
文字化け感満載。
下記コマンドをローカルリポジトリで一度流せば解決。

```
$ git config --local core.quotepath false
$ brew install gnu-tar
$ export PATH=/usr/local/opt/gnu-tar/libexec/gnubin:$PATH
```

再起動したら再びエラーになると思うので、環境変数は`.bash_profile`等に追記しても良いと思います。

# CLOCについて
オープンソースのステップ数計測ツールです。
単純な計測以外にも、比較やgitにも対応しています。

この情報が必要な人は既にCLOC使い始めてると思うので・・・公式サイトは以下です。
http://cloc.sourceforge.net/

公式サイトの更新が滞ってるようなので、コマンドのヘルプかソースみた方が良さげです。

# 原因
## その１
ソース中に `git ls-tree --name-only -r branch_name` でファイルリスト取得している部分があるのですが、ここで文字化けしてました。
解決策はこちらを参考にさせて頂きました。
https://dev.classmethod.jp/tool/git/git-avoid-illegal-charactor-tips/
ありがとうございます。

## その２
解決したと思いきや、こんなメッセージが表示されるように・・・。

```
Usage:
  List:    tar -tf <archive-filename>
  Extract: tar -xf <archive-filename>
  Create:  tar -cf <archive-filename> [filenames...]
  Help:    tar --help
```

tarのオプションが間違ってる雰囲気。
`-v`オプションで詳細みてみると`-A`オプションを指定しているようだが、`tar --help`に`-A`オプションの記載はない。
下記記事を参考にさせて頂いた所、解決しました。
https://hacknote.jp/archives/8951/
ありがとうございました。

# 感想
情報があまり見当たらなかったので、動かしながらデバッグしました。
perlはじめてでしたが、言語はなんであれソース動かすの楽しい。
Datadog で ECS タスクのメトリクスを見れるようになるまで

Datadog で ECS のメトリクスを見れるようになるまでちょっとハマったのでメモ。

## やろうとしたこと
[Datadog の公式ドキュメント](https://docs.datadoghq.com/ja/integrations/amazon_ecs/?tab=python) を参考に、 Datadog コンテナを ECS タスクで動かして、 Datadog 上で ECS クラスタのコンテナの状況を見れるようにしようとしました。

## 構成
下記構成でハマりました。
ECS + EC2
amzn-ami-2018.03.x-amazon-ecs-optimized (ami-0a7edd69bbca1d1f0)
ECS エージェントバージョン 1.31.0

## ハマったところ
### タスク定義が見れない
上記ドキュメント内に Datadog のコンテナを動かすための [ECS タスク定義のJSON](https://docs.datadoghq.com/ja/integrations/amazon_ecs/?tab=python#aws-cli)のリンクがあったのですが、リンクが間違っているのか見ることができないです（2019/11/12 現在）
#### ブログのリンクをお借りする
とりあえず、[こちらのブログ](https://goodbyegangster.hatenablog.com/entry/2019/04/06/081105)に貼ってあったリンクを使いました（URL を見た限りだと最新の JSON っぽいけどどうなんだろう・・・）。
### メトリクスが取れない
上記 JSON を使って無事 Datadog コンテナが起動できた！
・・・しかし動いているタスクの一覧は表示されるけど、 CPU やメモリなどのメトリクスが取れていない。
#### ログを見てみる
Datadog タスクのログを取ってみたところ、下記のログが出力されていました。

```
2019-11-12 07:48:05 UTC | PROCESS | WARN | (pkg/util/containers/metrics/cgroup_detect.go:126 in parseCgroupMountPoints) | No mountPoints were detected, current cgroup root is: /host/sys/fs/cgroup/
```

#### cgroup のパスがおかしい？
調べてみたら、 Datadog はタスクのメトリクスを `cgroup` から取ってるらしく、 `cgroup` がうまくマウントされていない？
[github でもこんな Issue が](https://github.com/DataDog/datadog-agent/issues/2001)。パスが間違っている？

#### EC2 を確認
ECS のクラスタとして動かしている EC2 にログインして タスク定義 JSON に記載されている `cgroup` のパスを確認してみました。

```
 # cd /sys/fs/cgroup/
 # ls -a
.  ..
```

空っぽ・・・。
上記 github の Issue のパスを見てみると

```
 # cd /cgroup/
 # ls -a
.   blkio  cpuacct  devices  hugetlb  perf_event
..  cpu    cpuset   freezer  memory
```

こちらが正しいパスのようです。

#### タスク定義を直す
このパスを直して以下のような JSON にすると Datadog 上での正しくコンテナの様子を見れるようになりました。

```json
{
  "containerDefinitions": [
    {
      "name": "datadog-agent",
      "image": "datadog/agent:latest",
      "cpu": 10,
      "memory": 256,
      "essential": true,
      "mountPoints": [
        {
          "containerPath": "/var/run/docker.sock",
          "sourceVolume": "docker_sock",
          "readOnly": true
        },
        {
          "containerPath": "/host/sys/fs/cgroup",
          "sourceVolume": "cgroup",
          "readOnly": true
        },
        {
          "containerPath": "/host/proc",
          "sourceVolume": "proc",
          "readOnly": true
        }
      ],
      "environment": [
        {
          "name": "DD_API_KEY",
          "value": "<YOUR_DATADOG_API_KEY>"
        },
        {
          "name": "DD_SITE",
          "value": "datadoghq.com"
        }
      ]
    }
  ],
  "volumes": [
    {
      "host": {
        "sourcePath": "/var/run/docker.sock"
      },
      "name": "docker_sock"
    },
    {
      "host": {
        "sourcePath": "/proc/"
      },
      "name": "proc"
    },
    {
      "host": {
        "sourcePath": "/cgroup/"
      },
      "name": "cgroup"
    }
  ],
  "family": "datadog-agent-task"
}
```

![スクリーンショット 2019-11-12 17.42.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149365/3c187cb7-a71b-1d5d-5e4d-96b9510b61b8.png)
CSSセレクタの詳細度 (優先順位)

#CSSセレクタの詳細度とは
ある要素へのCSSの指定が競合した場合、どのセレクタが優先されるかということ。

# CSSセレクタの優先順位 (強さ順)

1. HTMLのstyle属性
2. id
3. class、擬似クラス、属性
4. 要素型、擬似要素

⚠️ 同じ優先順位の場合は後に書いたCSSが優先される。

##例
```html
<body>
  <div class="red">
    <h1>あああ</h1>
  </div>
</body>
```

```css
.red {
  color: red;
}
div {
  color: black;
}

```

<img width="131" alt="スクリーンショット 2019-11-12 17.38.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496792/6cd0ef50-8eb6-7ee4-7ebe-b6aaafc14c37.png">

classの方が要素型よりも強いので文字がredになる。
Laravel Debugbarで簡易速度計測

Laravelをお使いの皆さんにはおなじみ[Laravel Debugabr](https://github.com/barryvdh/laravel-debugbar)ですが簡易的な速度計測ができることをご存知でしょうか。
~~xhprofやblackfireを使えというマサカリは受け付けません~~
明らかに処理が遅そうだが確証がないな〜、簡易的でいいから計測したいな〜というときに便利です。

```php
start_measure('このへん重そう');
// ここに怪しい処理がある
stop_measure('このへん重そう');
```
ヘルパー関数が用意されているのでこんな感じで怪しい処理に`start_measure`と`stop_measure`を挟みましょう。
始まりと終わりは同じ文字列を入れましょう。

いつものDebugbarのTimelineで以下のように見ることができます。
![2019-11-12 17.24.20 localhost adc9fd177940.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89213/1573a24f-6719-bd4e-1b61-1cd09805d663.png)
（View数,Query数はひみつ）
はい、全然違いましたね。

```php
start_measure('このへん重そう');
// ここに怪しい処理がある
stop_measure('このへん重そう');

start_measure('じゃあこっちか？');
// あんまり怪しくないと思ってた処理
stop_measure('じゃあこっちか？');
```

![2019-11-12 17.27.52 localhost 471cc4561bf1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89213/12ecabcf-af6e-3281-f9e9-abafaf8277fc.png)

無事遅い箇所が特定できました。
他にもログを出す機能も付いてるので活用してみてください。
おしまい
npmコマンドで、permission deniedが発生する

# 状況
babelをインストールしようとすると、permission deniedが発生し、インストールに失敗しました。

```Bash
$ npm i @babel/core @babel/node @babel/preset-env --save-dev
npm ERR! code EACCES
npm ERR! syscall rename
npm ERR! path /home/user/repos/play_express/node_modules/@babel/core
npm ERR! dest /home/user/repos/play_express/node_modules/@babel/.core.DELETE
npm ERR! errno -13
npm ERR! Error: EACCES: permission denied, rename '/home/user/repos/play_express/node_modules/@babel/core' -> '/home/user/repos/play_express/node_modules/@babel/.core.DELETE'
npm ERR!  { [Error: EACCES: permission denied, rename '/home/user/repos/play_express/node_modules/@babel/core' -> '/home/user/repos/play_express/node_modules/@babel/.core.DELETE']
npm ERR!   cause:
npm ERR!    { Error: EACCES: permission denied, rename '/home/user/repos/play_express/node_modules/@babel/core' -> '/home/user/repos/play_express/node_modules/@babel/.core.DELETE'
npm ERR!      errno: -13,
npm ERR!      code: 'EACCES',
npm ERR!      syscall: 'rename',
npm ERR!      path: '/home/user/repos/play_express/node_modules/@babel/core',
npm ERR!      dest:
npm ERR!       '/home/user/repos/play_express/node_modules/@babel/.core.DELETE' },
npm ERR!   stack:
npm ERR!    'Error: EACCES: permission denied, rename \'/home/user/repos/play_express/node_modules/@babel/core\' -> \'/home/user/repos/play_express/node_modules/@babel/.core.DELETE\'',
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'rename',
npm ERR!   path: '/home/user/repos/play_express/node_modules/@babel/core',
npm ERR!   dest:
npm ERR!    '/home/user/repos/play_express/node_modules/@babel/.core.DELETE',
npm ERR!   parent: 'play_express' }
npm ERR!
npm ERR! The operation was rejected by your operating system.
npm ERR! It is likely you do not have the permissions to access this file as the current user
npm ERR!
npm ERR! If you believe this might be a permissions issue, please double-check the
npm ERR! permissions of the file and its containing directories, or try running
npm ERR! the command again as root/Administrator.

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/user/.npm/_logs/2019-11-12T02_06_04_443Z-debug.log
```

# 対応
npmをグルーバルで再インストールしました。

```Bash
$ rm -rf ~/.npm-global
$ npm config set prefix '~/.npm-global'
$ npm i -g npm
```
ちなみに、`npm config get prefix`で、現在のprefixを確認できます。


# 結果
babelをインストールできました。
[Firebase]Storage上のファイル名一覧を表示する

#前提条件・環境
- [Firebase を JavaScript プロジェクトに追加する](https://firebase.google.com/docs/web/setup?hl=ja)で、SDKの追加と初期化が完了している
- Storageのデフォルトパケット作成済
- ファイルアップロード済
- バケットURL指定済
- SDKのインポートはCDNを使用

#手順
## 1. ルールの書き換え
ListAPIの使用にはFirebase Storage Rules バージョン２が必要なため、Storageにルールを加えます。デフォルトではFirebaseにログインしないと読み書きできないので、必要に応じて書き換えます。今回はテスト用に特に制限を設けません。

```
rules_version = '2';
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read;
    }
  }
}

```
## 2. SDKインポート

```javascript

<script src="https://www.gstatic.com/firebasejs/6.2.0/firebase-storage.js">
```
※上記SDKを追加しないと下記エラーになります。
　"firebase.storage is not a function"
## 3. 参照の取得

```javascript
var storage = firebase.storage();
var storageRef = storage.ref();
```
## 4. リスト表示
listAPIを使ってファイル参照一覧を取得します。

```javascript
storageRef.listAll().then(function(result) {
  result.items.forEach(function(ref) {
  // 処理
  });
}).catch(function(error) {
  console.error(error);
});
```
## デモコード
```html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>TEST</title>
  <!-- Firebase App (the core Firebase SDK) is always required and must be listed first -->
  <script src="https://www.gstatic.com/firebasejs/6.2.0/firebase-app.js"></script>

  <!-- Add Firebase products that you want to use -->
  <script src="https://www.gstatic.com/firebasejs/6.2.0/firebase-auth.js"></script>
  <script src="https://www.gstatic.com/firebasejs/6.2.0/firebase-storage.js"></script>
</head>
<body>
  <p>Storageファイル一覧</p>
  <div id="table"></div>
  <script>
    var firebaseConfig = {
      ===== 省略 =======

      =================
    };

    // Initialize Firebase
    firebase.initializeApp(firebaseConfig);
    // Get a reference to the storage service, which is used to create references in your storage bucket
    var storage = firebase.storage();

    // Create a storage reference from our storage service
    var storageRef = storage.ref();

    document.addEventListener('DOMContentLoaded', function() {
      var table = document.createElement( 'table' );
      var tableBody = document.createElement("tbody");

      storageRef.listAll().then(function(result) {
        result.items.forEach(function(ref) {
          var row = document.createElement("tr");
          var cell = document.createElement("td");
          cell.appendChild(document.createTextNode(ref.name));
          row.appendChild(cell);
          tableBody.appendChild(row);
          table.appendChild(tableBody);
        });
        document.getElementById("table").appendChild(table);
      }).catch(function(error) {
        console.error(error);
      })
    });
  </script>
</body>
</html>
```
##結果
![demo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416412/3c7c6bfb-64ad-5104-dfde-dcc796cc655a.png)

#参考サイト
[ウェブでファイルのリストを取得する](https://firebase.google.com/docs/storage/web/list-files?hl=ja)
[How to get a list of all files in Cloud Storage in a Firebase app?](https://stackoverflow.com/questions/37335102/how-to-get-a-list-of-all-files-in-cloud-storage-in-a-firebase-app/56402109#56402109)
Lambdaのデッドレターキュー(DLQ)設定は非同期呼び出しでのみ有効

## はじめに
SQSをイベントソースにしてLambdaを実行する仕組みを検証している際、DLQの設定を行っているのに、実行に失敗した際のメッセージがDLQに移動しない！という状況に陥りました。

そもそもSQS側にDLQの設定があるので、どちらを利用すればいいのかというのを確かめるために検証していたのですが、少しハマったので共有します。

## SQSをイベントソースにした場合のLambda呼び出しは「同期呼び出し」
これが分かっていなかったため、ずっと[「非同期呼び出し」に関する説明](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/invocation-async.html)を追っていました。

非同期呼び出しの場合、実行が失敗すると2回まで再試行を行う、という説明があるのですが、CloudwatchLogsで実行ログを確認しても再試行している様子がありません。念のため、ドキュメントで説明に使っているX-rayというサービスも使って実行のトレースをしてみましたが、実行は1度きりしか行っていないよう。

なぜ1回しか呼び出されないのか、その答えを求めて調べていると、今回の答えにたどり着きました。気づくきっかけになったのは以下の記事です。

https://qiita.com/keni_w/items/dc651c9fc794f5a8ad64

これをきっかけに公式のドキュメントでもSQSは「同期呼び出し」であることがわかり、またDLQは「非同期呼び出し」の場合のみ有効であることがわかりました。

なおAWSのサービスからLambdaを呼び出す場合は、そのサービスがどの呼び出し方をしているかを確認するのが手っ取り早いです。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-services.html



## まとめ

- DLQ設定は非同期呼び出しでのみ有効
    - https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-invocation.html
- SQSをイベントソースにした場合は同期呼び出し
    - https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-sqs.html
- サービスごとに呼び出し方法を確認するべし
    - https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-services.html
    - https://qiita.com/is_ryo/items/009220083e179272cbda
Doctrineでちょっと複雑なSQLを発行する

Doctrineでちょっと複雑なSQLを発行しようとすると躓くことが多いです（個人的に）。
ハマったポイントをいくつかまとめてみたいと思います。

## SQLで使える関数が使えない

もちろん特定のRDBMSに依存していないライブラリなので、それぞれのRDBMSで使える関数は使えません。
でもDoctrineで使える関数もいくつかあります。
以下のページにまとまっています。

DQL Functions
https://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#dql-functions

上記のリンクは公式のリファレンスですが、
コードサンプルがないのが悲しいところです。
例えばDATE_ADDを使いたいときは

> DATE_ADD(date, days, unit) - Add the number of days to a given date. (Supported units are DAY, MONTH)

この一文を見て使い方を予測します。
今から1ヶ月後は

```
DATE_ADD(CURRENT_DATE(), 1, 'MONTH')
```

今から1日前は

```
DATE_ADD(CURRENT_DATE(), '-1', 'DAY')
```

※-1にはシングルクォートをつけないと怒られます。

で、Supported units are DAY, MONTHとあるようにYEARには対応していません。
もちろんエラーです。

よく使うものはだいたいあるかなという感じですが、個人的にはMySQLにあるDATE_FORMAT（OracleならTO_CHAR）がないのが辛いです。
DBに登録されている日付から日だけ取得するとか、
時間を切り捨てて日付のみの比較をするようなことができないからです。
次はDATE_FORMATについて書いてみます。

## DATE_FORMATが使えない

個人的には結構辛いものがあるのですが、
なにかうまい代替方法はあるものでしょうか・・・？
大抵は渡す引数を工夫したりしますが、どうしてもDATE_FORMATを使いたいときはDQL関数拡張という機能を使います。

ドキュメントはこちら
DQL User Defined Functions
https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/cookbook/dql-user-defined-functions.html

ドキュメントにはサンプルコードがあります。
サンプルコードを見れば関数の追加自体は簡単そうに見えますが、
関数の中身を書くのはちょっと手間そうです。

そんなとき、いろいろな関数をまとめて実装してくださっているコードがgithub上で提供されています（ありがたい）。
DoctrineExtensions
https://github.com/beberlei/DoctrineExtensions

こちらを導入することで、DATE_FORMATも使えるようになります。
手順はサンプルコードにあるので割愛。

## FROM句でサブクエリを使いたい

Doctrineではサポートしていません。
過去に要望もあったようですが、却下されたようです。

DDC-2793: Subquery into FROM
https://github.com/doctrine/orm/issues/3542

FROM句でサブクエリを使うようなときはネイティブなクエリを使ってとのことです。

## ネイティブなクエリを発行する

本当に複雑なSQLを発行するときは結局はここにたどり着きます。
以下のような感じで発行できます。

```php

$sql = <<<___SQL
SELECT
    *
FROM
    order
WHERE
    order_id = :order_id
___SQL;

$params = ['order_id' => $order_id];
$em = EntityManager::create($dbParams, $config); // EntityManagerのgetはそれぞれのやり方で
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute($params);
$result = $stmt->fetchAll();
```

### ネイティブなクエリを発行したもののEntityと紐付けるのがめんどう

上記のサンプルだと、orderテーブルの中身を全部返しているのでOrderエンティティを返してほしいところです。
そんなときはResultSetMappingBuilderを使います。

```php
$sql = <<<___SQL
SELECT
    *
FROM
    order o
WHERE
    order_id = :order_id
___SQL;

$rsm = new ResultSetMappingBuilder($em);
$rsm->addRootEntityFromClassMetadata('Path\to\Order\Entity', 'o');
$query = $em->createNativeQuery($sql, $rsm);
$query->setParameter('order_id', $order_id);
$orders = $query->getResult();
```

## おわりに

まだまだDoctrineを使いこなしていませんが、いろいろ調べていきたいと思います！
pypyodbcを使って手っ取り早くAS/400からデータを取得してみた

永らく(3か月くらい) IBM client solution の「SQL scriptの実行」を使ってSQLの発行・データ取得を行っていましたが、データ件数が5000件を超えたあたりから、全件取得するために延々スクロールさせるのが面倒になってきたので、PythonとODBCを利用して一括取得の実験をしてみました。

実験コードですので、エラーチェックや出力結果のフォーマットは度外視しています。

# 実験環境

PC環境

- Windows10
- python 3.8
- pypyodbc 1.3.4
- IBM i Access Client Solutions 1.1.0 (ODBCドライバ)


接続先環境

- AS400  V7R3


# 準備

## Pythonの取得
[python.org](https://www.python.org) から最新安定板を取得してインストールします。
インストール後、"python.exe"のあるフォルダにパスを通しておきます。

## pypyodbcの取得
なぜ、一般的なpyodbcではなく、pypyodbcにしたかといえば、pipでのインストールに失敗したからです。IBM推奨の ibm_db も試してみましたが、両者共にMicrosoft Visual C++14 を要求された為、今回はパスです。

python添付の"pip"を使用してインストールします。

```
pip install pypyodbc
```

## IBM i Access Client Solutions の取得
数か月前に設定しましたので、内容はうろ覚えです。
https://www.ibm.com/support/pages/ibm-i-access-client-solutions にアクセスします。
"Downloads for IBM i Access Client Solutions"と書かれたリンクを辿ります。途中でIBM ID の認証を求められますので、IDのある方は入力、無ければ新規登録(無償)します。
"ACS Windows App Pkg English (64bit)" をクリックしてダウンロードします。

インストーラ形式になっていますので、インストーラの手順に従ってインストールします。

# テストコード

```python:odbctest.py
import pypyodbc

# 接続情報取得
config = {}
with open("connection_config.txt", 'r', encoding="utf-8") as conf:
    for line in conf.read().splitlines():
        key_, val_ = line.replace(" ", "").split("=")
        config[ key_ ] = val_

# DB接続
connection = pypyodbc.connect(
    driver='{iSeries Access ODBC Driver}',
    system = config["system"],
    uid = config["uid"],
    pwd = config["pwd"]                    )
cur = connection.cursor()

# SQL実行
statement = open("statement.sql", 'r', encoding="utf-8").read()
cur.execute( statement )
for row in cur:
    print( row )
```

ソースは大きく3パートに分かれています。

「接続情報取得」ではデータベースへの接続情報を外部ファイルから取り込んで、辞書に保管しています。外部ファイル "connection_config.txt"は以下のようになっています。

```text:connection_config.txt
system = xxx.xxx.xxx.xxx
uid    = USER
pwd    = PASWORD
```

「DB接続」では読み込んだ接続情報を使用してデータベースへの接続を試み、カーソルを取得します。

「SQL実行」では、外部ファイルに書き込んだSQLを読み込んで、カーソルの execute()に渡してSQLを発行します。
その下の for ループで1行ごとにprint()関数に投げ込んで標準出力に書き込みます。

# 実行結果
```sql:statement.sql
select * from QSYS2.LIBLIST
```

statement.sqlに上記のSQLを記述して実行してみましょう。

```text
>python testodbc.py
(1, 'QSYS', 'QSYS', 'SYSTEM', 0, '\x0eäýäþämäwäáäÝäbäJäÝäÞäì\x0f')
(2, 'QSYS2', 'QSYS2', 'SYSTEM', 0, 'CPI\x0eá¶àªäýäþämäwäáäÝäbäJäÝäÞäì\x0f')
(3, 'QHLPSYS', 'QHLPSYS', 'SYSTEM', 0, None)
(4, 'QUSRSYS', 'QUSRSYS', 'SYSTEM', 0, 'Sﾓﾍﾎｵﾃ Lｹｲﾈｱﾈﾓ ｶﾅﾈ Uﾍｵﾈﾍ')
(5, 'QIWS', 'QIWS', 'PRODUCT', 0, None)
(6, 'QGPL', 'QGPL', 'USER', 0, 'GENERAL PURPOSE LIBRARY')
(7, 'QTEMP', 'QTEMP', 'USER', 0, None)
```

文字化けは仕様です...。
いくつかのIBM提供オブジェクトのラベルはうまく変換してくれないようですが、普通に作ったテーブルでしたら、SQLを使用してようが、AS/400固有の機能を使用していようが、日本語も問題なく読める文字に変換してくれます。

ファイルにリダイレクトすれば、何万件の結果があろうと数秒から数十秒で終わるはずです。
サーバの性能にもよりますが、試しに、15カラム × 10000件、計算量やや多めのSQLを実行してみると、5秒程度で書込み完了しました（出力ファイルサイズ 1MB）。


これで、全結果セットの取得の為に、延々ページダウンキーを押し続ける苦行から解放されます。
Laravel5.5から一気にLaravel6.0へアプデ

# メモ

```
snake_case()
studly_case()
str_singular()
str_random()
str_plural()
array_pluck()
```
が無くなった。
というか、ヘルパがごっそり変わった。
↓

```
use Illuminate\Support\Str;
use Illuminate\Support\Arr;

Str::snake()
Str::studly()
Str::singular()
Str::random()
Str::plural()
Arr::pluck()
```

---

```
array_except
```
で怒られる。
↓
viewのキャッシュクリアでおｋ

```
php artisan view:clear
```

---

```
str_slug
```
で怒られる。
↓
どこかにテストで新規Laravel6プロジェクトを作成して、
config/cache.php
config/session.php
をLaravel6のファイルで上書きする（これらを変更している場合はその変更を反映させる）。

```
composer create-project "laravel/laravel=^6.0" laravel6test
```

---

viewのページング部分がレイアウトあたっていない。
↓
デフォルトで、bootstrap-4.blade.phpというファイルが使用されるようになった。
ので、ファイル名を変えるか、ファイルを指定する。
今後も変更あるかもしれないので、指定したほうが無難。

```
{{ $documents->appends(request()->input())->links('vendor/pagination/default') }}
```

---

laravelcollective/htmlを使用している場合、
GETで送信した際にフォームに初期値がセットされない。
↓
ビューに下記を追加

```
Form::considerRequest(true);
```

---

Laravelのログを見ると、

```
laravel.EMERGENCY: Unable to create configured logger. Using emergency logger.
```
で怒られている。
↓
どこかにテストで新規Laravel6プロジェクトを作成して、
config/logging.php
を持ってきて置く。

---

```
Access level to App\Http\Requests\CustomRequest::validationData() must be public (as in class Illuminate\Foundation\Http\FormRequest)
```
で怒られる。
↓
該当のfunctionをpublicにする

---

なんかエラー画面が出ない

```
Call to undefined method Whoops\Run::appendHandler()
```
でいっぱい怒られてる。
↓
そもそもエラー画面が新しくなっている。
composer.jsonのrequire-devを新しくする。

```
    "require-dev": {
        "facade/ignition": "^1.4",
        "fzaninotto/faker": "^1.4",
        "mockery/mockery": "^1.0",
        "nunomaduro/collision": "^3.0",
        "phpunit/phpunit": "^8.0"
    },
```
さらに、composer updateの際に

```
Class 'Symfony\Thanks\GitHubClient' not found
```
で怒られる。
↓
composer.jsonのscriptsを新しくする。

```
    "scripts": {
        "post-autoload-dump": [
            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
            "@php artisan package:discover --ansi"
        ],
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "@php artisan key:generate --ansi"
        ]
    },
```

---

artisan optimizeで失敗する。

```
The command "php artisan optimize" failed.
```
↓
optimizeは削除する。

---

DBに接続できない
↓
.envのパスワードに#やら入ってませんか？
そんなときは、クオーテーションでエスケープしましょう。

```
DB_PASSWORD="1234#56789"
```

# やっといたほうが良さそうな変更

5.7から以下の変更がされています。

> 新しくdataディレクトリがstorage/framework/cacheへ追加されました。このディレクトリをアプリケーションに作成してください。

```
mkdir -p storage/framework/cache/data
```
> 次に、新しく作成したdataディレクトリへ、.gitignoreファイルを追加してください。

```
cp storage/framework/cache/.gitignore storage/framework/cache/data/.gitignore
```
> 最後にstorage/framework/cache/.gitignoreファイルを以下のように確実に更新してください。

```
*
!data/
!.gitignore
```
AWSアカウントを作成した際のセキュリティ設定

# やったこと
ひさびさにAWSアカウントを作成する機会があったので、行ったセキュリティ関係の設定についてまとめてみました。


## rootアカウントのMFA設定
- 必須レベル
- ユーザーパスワードだけで全てのことが出来てしまうので、作ったらMFA設定して保管

## IAMの請求アクセス有効化
- これをしないとIAMユーザーから請求情報にアクセスできない。
- AWSは細かい従量課金を伴うため、コスト管理にIAMユーザーのチェックがあった方がいい
- 不要なコストが発生していないかチェックが必要

## 課金アラートの設定
- いくら気を付けていても、ある程度の不用意な課金は発生するので、アラート設定は必要

## CloudTrailの有効化
- API証跡は有効化しましょう。何かあったときには必須。

## IAMユーザー・グループの作成
- AWSではユーザーの使いまわしはNG。
- 使いまわしは誰がどんな操作したかがわからなくなります。
- 今までユーザーを共有していた方もAWSではやめましょう。
- 退職したりした人でも操作できてしまうかもしれません。
- 適切な権限、最小の権限を付与すべき、全員同じグループやとりあえずAdministratorAccessは×
- アクセスキーは必要になったら作成。（デフォルト作成しない）

## IAMユーザーのパスワードポリシー設定
- 文字数や英数混在、有効期間など
- 緩い設定をしてしまう人は必ずいます。ポリシーで制限しましょう。

## IAMユーザーのMFA設定
- 所属組織次第かもしれませんが、通常AdministratorAccessなど上位の権限を持ったユーザーはMFAアクセス必須とすべきです。
- 個人的にはポリシーで縛るべきだと思う。

## IPアドレス制限
- AWSマネジメントコンソールはインターネット上のサービスです。
- ということは自宅からでもアクセスできます。MFA設定してもVPN/専用線接続しても同じ。
- なのでIAMポリシーでIPアドレス制限が必要です。（CFなど一部サービスは使えないのでその場合AssumeRoleなど検討）
- 自分のグローバルIP以外からの操作を拒否するポリシーを持ったグループをユーザーに付与することを推奨。個別ポリシーでもOK。
GKEで Cloud Datastore を使えるようにする

とある参考書をみながら、GKEを触ってたら、

>Cloud Datastoreを「有効」にしておきます。

とありましたが、ぱっと見て分からなかったので備忘録。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525955/a1e2791a-1ee4-a3aa-63d1-b0fe0e97ea94.png)

↓
「各APIにアクセス権を設定」ボタンにチェックを入れると、
こんなのが表示されました。
ここに「Datastore」いましたね！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525955/de5bd6c2-0b46-6474-3852-f6c7f9f94a07.png)

教えてくれたうえむーさん、ありがとです！
いじょ。
VirtualBoxがvt-x is not available (verr_vmx_no_vmx).エラーで起動しない

# VirtualBoxが起動しない

VirtualBoxが`vt-x is not available (verr_vmx_no_vmx).`というエラーを表示して起動できなくなった。

## 忙しい人のための結論

- `コントロールパネル > プログラムと機能 > Windows の機能の有効化または無効化`よりHyper-V と virtual machine platform (仮想マシンプラットフォーム)のチェックを外して再起動する。

- Intel VT-x が有効かどうか確かめるためには[Intel® Processor Identification Utility](https://downloadcenter.intel.com/download/28539)を利用すると良い。

### 2020/03/13 追記

> Windows Subsystem for Linux(とおそらくWindows サンドボックス)も無効化する必要がありました。

とのコメントをいただきました。上記対応で効果を得られなかった場合、試してみてください。

### 2020/11/16 追記

どうやら最新のWindowsでの「virtual machine platfoam」 の表記が「仮想マシンプラットフォーム」となった模様。

## 環境

Windows 10 Pro: 1809

VirtualBox: 5.2.34



## 現象

**何もしていないのにVirtualBoxでUbuntuを起動できなくなった！**



## 原因
**Intel VT-xが無効化されているため。**

Intel製の CPUを利用している場合、VirtualBoxは仮想化にIntel VT-xを利用します。

もともとVirtualBoxを起動できていたのに起動できなくなった場合、他のアプリケーションをインストールしたことにより、他の仮想化技術(≒Hyper-V)が有効化されたために、Intel VT-xが無効化されている可能性が高いです。



例として

- Docker for Windows を利用しようとした

- WSL2を利用しようとした

など。



## 対処法

`コントロールパネル > プログラムと機能 > Windows の機能の有効化または無効化`よりHyper-V と virtual machine platform(仮想マシンプラットフォーム) のチェックを外して再起動しましょう。



当初の設定から変更していなければ、他の仮想化技術を無効にすれば自動的に有効化されると思われます。（私はされました。）

もし、それでもIntel VTが無効化されているならば、PC起動時にF12などを押して表示されるUEFIの設定を確認してみてください。



Intel VTが有効になっているかを確認するには[Intel® Processor Identification Utility](https://downloadcenter.intel.com/download/28539)を用いると良いです。
Intel VT(インテルバーチャライゼーションテクノロジー)が無効となっていれば×印が、有効化されていればチェックマークが表示されます。



## 引っかかったポイント

- VirtualBox 6ならHyper-Vと共存できるとされていたが(Qiitaにも[こういう記事](https://qiita.com/takotakot/items/94d3218cf8de5b2c1da8)があります)、VMの起動直後にフリーズして使い物にならなかった。機種(CPU?)によるらしい。

- Hyper-Vを有効化している場合、Intel VT-xが無効化されることは知っていたが、virtual machine platformが有効だとIntel VT-xが無効化されることを知らなかった。
- virtual machine platformが追加されていることを知らなかった。
- Hyper-Vを無効化しているのに、VirtualBoxを起動できない理由(=virtual machine platformが有効であること)に気づけなかった。



## さいごに

分かってしまえば凡ミスなのですが、情報を見落としていたので少しハマってしまいました。
この記事が誰かの助けになりますよう。。。
JavaScriptで関数型指向

## 自己紹介

松田尚也(24)
３年目エンジニア

### 最近やったこと・やっていること
- スマホアプリ向けバックエンドの開発(Node.js)

### 得意・好き
- JavaScript
- Node.js
- CI/CD (Azure)
- 認証/認可 (OAuth2.0/OpenID Connect)
- ビール(アサヒビール派）

---

## What is 関数型指向?

---

## Q  関数型指向ってどんなイメージ？？？
- Javaでのラムダ + Stream関数
- 第一級関数（関数の戻り値に関数を扱うことができる言語・関数）
- haskell、F#、Scala等の関数型言語でないと書けない
- カリー化とかとか。。。  
⇓  
これらは、関数型指向プログラミングを行う上での  `要素`であって関数型指向の本質ではない

---

## What is 関数型指向?

関数型プログラミングとは、
**純粋関数**を**宣言的**に評価することである。

純粋関数は、外部から観測可能な**副作用を回避する**ことで**不変性**を持つプログラムを生成する

By [JavaScript関数型プログラミング](https://book.impress.co.jp/books/1115101137) 本

---

## What is 関数型指向?
1. 宣言的プログラミング
1. 参照透過性(純粋関数と副作用)
1. 不変性

---

## 宣言的プログラミング

---

## 宣言的プログラミング

宣言型プログラミングとは、

どのような処理をしたいのかという宣言のみを行い、宣言した処理を行う。命令や手続きを明示することなく処理を表現するというパラダイム

---

## ？？？

---


## 宣言型プログラミング

宣言型プログラミング言語であるSQLのクエリ

```sql
SELECT name FROM game_character;
```
「どのようなデータがほしいのか」という宣言のみしかしておらず、

「どうやってデータを取得してくるか」のデータアクセス部分の処理は行っていない

---

## 宣言型プログラミング

for文

```js
const arr = [0, 1, 2, 3, 4, 5]
for(const i = 0; i < arr.length; i++) { // 処理を行うためのデータの流れ
  arr[i] = Math.pow(arr[i], 2); // 行いたい処理
}
console.log(arr) // [0, 1, 4, 9, 25]
```

⇓

宣言型

```js
const result = [0, 1, 2, 3, 4, 5].map(function(num) {
  return Math.pow(num, 2);
});
console.log(result); // [0, 1, 4, 9, 25]
```
ループ処理は`map`関数に委譲し、プログラミングの本質的な処理のみを記載している

ちなみにアロー関数を使うと更にシンプルになります

```js
const result = [0, 1, 2, 3, 4, 5].map(num => Math.pow(num, 2));
console.log(result) // [0, 1, 4, 9, 25]
```


---

## 宣言型プログラミング

宣言型プログラミングとは、
どのような処理をしたいのかという宣言のみを行い宣言した処理を行う、命令や手続きを明示することなく処理を表現する

プログラミングの本質的な処理のみを記載し、可読性、再利用性が上がる

iterationというデータを扱う必要がなくなるため、状態がなくなりバグがおきにくくなる

---

## 純粋関数と副作用

---

## 純粋関数と副作用
関数型プログラミングは、純粋関数を使用し、不変性をもつプログラミング  
という前提

- 関数への入力値（引数）のみに依存し、関数の呼び出し時および実行中に状態が変化する秘匿化された値や、外部スコープの値には依存しない
- 関数の外の値を一切変更しない。グローバルオブジェクトや参照渡しされた引数を変更しない

---

## 副作用のある関数

```js
var counter = 0
function increment() {
  return ++counter // 関数の外(グローバルスコープの値)の状態を変更している
}
```

## 副作用のない関数
```js
function increment(num) {
  return ++num
}
```

## 参照透過性がある
同じ入力に対して同じ作用と同じ出力を持つプログラム(関数)になること

---

## 参照透過性があると

リファクタリング・拡張性が高い

参照透過性があるということは、同じInputに対して必ず同じ結果が返却されるということ。
それ故に、呼び出し元を書き換える際にデグレが起きる可能性が減らせる

---

## 不変性

一見副作用がないコードに見えたとしても。。。

```js
const sortDesc = function(arr) {
  return arr.sort(function(a, b) {
    return b - a;
  });
};
const arr = [1, 2, 3, 4, 5];
const result = sortDesc(arr);
console.log(result); // [5, 4, 3, 2, 1]
console.log(arr); // [5, 4, 3, 2, 1]
```

`sort`関数はInputの配列をソートするため、副作用のある関数である
そのため、sort関数を参照透過性がある関数にするためには

```js
const sortDesc = function(arr) {
  return arr.slice().sort(function(a, b) { // slice関数で配列のコピー
    return b - a;
  });
};
const arr = [1, 2, 3, 4, 5];
const result = sortDesc(arr);
console.log(result); // [5, 4, 3, 2, 1]
console.log(arr); // [1, 2, 3, 4, 5]
```

---

## What is 関数型指向?

関数型プログラミングとは、
**純粋関数**を**宣言的**に評価することである。
純粋関数は、外部から観測可能な**副作用を回避する**ことで**不変性**を持つプログラムを生成する

--- 

## Why 関数型指向?

---

## Why 関数型指向?

- 純粋関数である  
-> InputとOutputが必ず一意になるため関数自体の**テストがしやすい**  
-> 関数自体がモジュールとなり、**自然と再利用性が高くなる**  
-> 状態を管理する必要がないため、**非同期で起こるバグが減らせる**  

--- 

## おしまい
redirect_toで間接的にpostリクエストを出す方法

#はじめに
redirect_toを用いてpostリクエストでリダイレクトしたいが、仕様上不可能とのこと。
ただどうしても、上記形を取りたい！という方向けに、**”力ずく”**で間接的にpostリクエストを出す実装方法を考えましたので記します。

##流れ
まず仕様上、redirect_toで直接postリクエストを出すことはできないので、getリクエストを出すこととします。
下記はトーナメント方式のアプリを実装時に、1回戦で負けた際に2回戦の試合結果を自動的にデータベースに保存するという流れを取っています。1回戦で敗北した際に、first_round_controllerのrecordアクションから、second_round_controllerのloseアクションをgetリクエストでリダイレクトさせています。

```ruby:first_rounds_controller.rb
class FirstRoundsController < ApplicationController
  def record
   (省略)
    difference = @RRecord.point_difference
    if difference > 0 
     redirect_to new_player_second_round_path   #1回戦勝利時(getリクエスト)
    else
     redirect_to lost_player_second_rounds_path   #1回戦敗北時(getリクエスト)
    end
  end
end
```
```ruby:second_rounds_controller.rb
class SecondRoundsController < ApplicationController
  def new #1回戦勝利時(getリクエスト)
  end

  def lose　#1回戦敗北時(getリクエスト)
  end

  def lose_record #1回戦で敗北した時にSecondRoundテーブルに自動的にデータをセーブ(postリクエスト)
    SecondRound.create(
      カラム1: "hoge",
      カラム2: "hoge",
      カラム3: "hoge",
      カラム4: "hoge"
    )
  end
end
```
敗北時、getリクエストを出すためloseアクションに伴う、lose.html.hamlが表示されますが、こちらには下記のように記述するだけで画面は何も記載されていない白画面のままです。form_withのurlはsecond_rounds_controllerのlose_recordアクション（postリクエスト）を指定します。

```haml:lose.html.haml
= form_with url: lost_record_player_second_rounds_path, method: :post
```
このままではlose.html.hamlの白画面で止まったままですので、form_withで指定したurlに遷移するようにJSを以下のように設定します。

```JavaScript:page_transition.js
$(document).on("turbolinks:load", function(){
  if (location.href.match("/[a-zA-Z0-9_]+/lose$")){
    document.forms[0].submit();
  }
})
```
今回はページのパスが....../loseの時にlose.html.hamlのform_withがsubmitされて、second_rounds_controllerのlose_recordアクション（postリクエスト）が呼び出されることになります。これでredirect_toで間接的にpostリクエストを出すことができます。

##まとめ
以上がredirect_toで間接的にpostリクエストを出す方法です。getリクエストを出したのちにpostリクエストを出すため、一時的に画面を読み込んでいるようなページ（白画面）が表示されますが、目的は達成できるかと思います。他に良い方法がありましたらぜひご教示ください。

##参考
* [擬似的にPOSTでリダイレクトする](https://qiita.com/necojackarc/items/50172a267f17ef320095)
JSONとは何ぞ？。[メモ]

#はじめに
pythonを学んでいたところjson.dumps()などでてきたが、まずJSONって何？となり調べてみました。

以下、JSONについて分かったことです。


__参考記事__
[非エンジニアでもわかるjson形式のスクリプトを徹底解剖！](https://tech-engine.jp/i0000478/"")

[【Python】JSONデータの使い方（jsonモジュール）](https://hibiki-press.tech/learn_prog/python/json/1633"")



## 結論
JSONとは、JavaScriptに使われている`データ記載フォーマットの１つ`。 

##  JSON(JavaScript Object Notation)
まず、JavaScriptとはプログラミング言語の１つ。

主にウェブブラウザ上で使われ、動作が軽く実行速度が速いことが特徴。



###JSONが広く使われる理由
● JavaScript 以外のプログラム言語でも読み取れ、とても扱いやすい形式。

●データ量が少なく通信がスムーズに行うことができる。

●何がどのデータなのかわかりやすく判読性が高い。



###どのように使われているのか？
●JavaScriptが使われているところ

●扱う文字や読みやすさを優先しているところ


## おわり
pythonでは形式を読み取ったり書き出したり変換すれば問題ないかな

修正
プログラミング→プログラミング言語
自作ロボット（ローバー）のROS対応

# はじめに

[ROS]( http://wiki.ros.org/Documentation )（Robot Operating System）というものが著者の周りで流行っている。ROSとは簡単に言うとロボット開発を支援するためのミドルウェアみたいなものである。



これを使うことで１から自分でプログラムを書く手間を省くことが出来るため、「専門知識はないけど自動運転の車を作ることが出来ました！」ということが可能となる。



さらにシュミレータ上での動作確認も容易になり、実機を用いずに手軽に動作確認をすることもできるようになる。



# 問題点

「ROS入門」みたいにPub・Sub通信から丁寧に教えてくれる記事や書籍はたくさんある。



しかし多くの人のゴールは「ROSを学ぶこと」ではなく、「ROSを使って〇〇の機能を実現したい」ではなかろうか？



先行研究を調べることが大事だと2年間大学院に通って理解はしている。

しかし、「理論の大枠を掴むためにとりあえず動かしてみよう」ということも、難しいことを学ぼうとする初学者のモチベーション継続に大事だと考える。



そこで本記事では自作ロボットを動かすために必要な環境構築に重点を置き、ソースの説明を極力省いている。



自作ロボットにはNexus robotが開発した[3WD48mmオムニホイールモバイルロボット]( https://www.vstone.co.jp/robotshop/index.php?main_page=product_info&cPath=895&products_id=5156 )（以下、ローバー）を使用している。

![3WD48mmオムニホイールモバイル台車ロボット](https://www.vstone.co.jp/robotshop/images/nexus1001901.jpg)

# 本記事を読むことのメリット

1. 「ROSを用いてロボットを動かしてみた」と言える

2. 実機を持っていなくてもシュミレーションまでは出来るため、
ROSで何ができるかを体験できる

3. オムニホイール3輪機構をもつロボットなら自分のロボットでも
   動かしてみることが可能
# 準備物

1. Ubuntu 16.04

2. ローバー（なくても第1章はできる）

# 各記事へのリンクまとめ

1. [ROSを用いたローバー制御（シュミレーター編）](https://qiita.com/Naotaka_K/items/e409b3fa322ed6c2214d#vmware%E3%81%A7%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E6%99%82%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC)

2. [Arduinoを用いたローバー制御（実機編）](https://qiita.com/Naotaka_Kawata/items/f0e03ecb685ea0fbbc3b)
 
3. [ローバーのROS化（簡易版）](https://qiita.com/Naotaka_Kawata/items/a2006ad87114f6d37f08)

4. [ローバーのROS化](https://qiita.com/Naotaka_Kawata/items/ace330ec2fb20adb8066)
   

# おわりに
著者は読書が好きだ。
将来自分の学んだことを文章にする仕事でもしたいと考えているので、
練習がてら大学院生の暇な時間を使ってこの記事を書いている。

誰かに読んでもらい、役に立てたら幸いである。
phpenvでphpをインストール

# 環境

CentOS release 6.8 (Final)

# やったこと

```
git clone git://github.com/phpenv/phpenv.git ~/.phpenv
echo 'export PATH="$HOME/.phpenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(phpenv init -)"' >> ~/.bash_profile
exec $SHELL -l
exit

git clone https://github.com/php-build/php-build $(phpenv root)/plugins/php-build
cd .phpenv/plugins/php-build/share/php-build/definitions
vi 7.2.15
```

- apache用のモジュール作成のため、以下を1行目に追加（apxsの場所は要確認）

```
configure_option "--with-apxs2" "/usr/sbin/apxs"
```

- その他、必要なモジュールがあれば

```
configure_option "--enable-calendar"
configure_option "--with-pear"
configure_option "--enable-sysvmsg"
configure_option "--enable-wddx"
configure_option "--with-gettext"

# mhashは下記では有効になりませんでした
configure_option "--with-mhash"
```

```
yum install re2c libxml2 libxml2-devel openssl-devel bzip2-devel curl curl-devel libjpeg libjpeg-devel libpng-devel libicu-devel readline-devel libtidy-devel libxslt-devel httpd-devel
phpenv install 7.2.15
```

- 切り替える場合

```
phpenv global 7.2.15
phpenv rehash
```

- imagickなど、peclを入れる場合（切り替え後に実行）

```
cd .phpenv/plugins/
git clone https://github.com/felipecwb/pecl-build.git
phpenv pecl imagick
phpenv pecl apcu
phpenv pecl mcrypt

# imagickのtestでエラーが出てインストールできなかったので、無理やりテストを飛ばして入れた（どうやら新し目のImageMagickだとなる模様。最新で確認）
cd ~/.phpenv/plugins/pecl-build/bin
./pecl-build imagick -p ~/.phpenv/versions/7.2.15/bin/phpize -i ~/.phpenv/versions/7.2.15/bin/php-config --skip-test
```

- php.iniを修正

```
date.timezone = "Asia/Tokyo"
```
など

- Apache再起動

phpenvで5系と7系を使用する場合
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/php.conf
を確認する。
参考：https://qiita.com/aat00000/items/23df738116bf724cadc4

よければ

```
service httpd restart
```

- すぐに切り替えない場合

```
[abrt] httpd: httpd killed by SIGSEGV
```
というメールが来るので、/etc/httpd/conf/httpd.confの

```
LoadModule php7_module        /usr/lib64/httpd/modules/libphp7.so
```
をコメントアウトする。

# 各ユーザのcliでphpのバージョンが古い問題

上記のやり方だと、rootでやってしまっているため、rootのみしかcliのphpはバージョンが変わらない。

```
# 移動
mv /root/.phpenv /usr/local/phpenv

# 各ユーザ(deployerのためにbashrcに書いたほうがいいです)
vi ~/.bashrc
export PATH="$HOME/.phpenv/bin:$PATH"
↓
export PATH="/usr/local/phpenv/bin:$PATH"

# phpenv pecl imagickで入れたものが反映されないので、シンボリックリンクはる
ln -s /usr/local/phpenv/ /root/.phpenv

systemctl restart httpd
```
PowerPoint VBA で 動画ファイルを作るときの注意

#動作環境

・Microsoft Office 365
・Microsoft Powerpoint 2016, 2013

#はじめに

マクロ処理の中に動画生成する処理が必要という人向けに書いてみようと思います。

「あれ？スライドショーだと音声や動画が再生されるのに、MP4出力したら静止画になったぞ！？音も鳴らないぞ！！」という問題にぶち当たりました。スライド切替は反映してくれるけど、スライドに貼ったオブジェクトは何も動作してくれませんでした。

解決方法としては、「マクロ上でもう一回設定してね！」という方法を採用しました。おそらく、UI上の設定はほとんど無効になってしまうと思います。

#注意点

PlaySettings.PlayOnEntry を True にしないと、スライドに入れたオブジェクトが何も動いてくれないです。
これが原因。おそらくデフォルトは False だと思います。

```vb
Set currentSlide = ActivePresentation.Slides(i)

With currentSlide.Shapes.AddMediaObject2(FileName).AnimationSettings
    .AdvanceMode = ppAdvanceOnTime 'スライドの切り替え方。ppAdvanceOnTimeにすると自動切替
    .AdvanceTime = 0 '指定スライドの切替時間。0にしないと、すぐに切り替えが起きない。
    .Animate = msoTrue 'スライドショー中に指定された図形のアニメーションを実行するかどうか
    .PlaySettings.PlayOnEntry = True 'アニメーション実行時、指定したビデオやサウンドを自動再生するか
End With
```

その他に注意する点。

こっちは、そのスライド自体の表示時間です。

```vb
currentSlide.SlideShowTransition.AdvanceTime = 10 '10秒表示
```

以下は、MP4ファイルを生成するコードです。

```vb
ActivePresentation.CreateVideo FileName:=mp4FileName, VertResolution:= 1080, Quality:= 80
```

- VertResolution は動画の解像度です。低い値にすると、文字化けが起きます。
- Quality は動画の品質です。Maxは100。
LaTeXファイル分割をしている場合に気をつけたい設定項目（atom）

# はじめに
### 環境
環境は次の通りです．エディタとエディタのパッケージが同じなら，他のOSでもあまり変わらないと思います．もし異なるエディタをご使用の場合，この記事はあまり参考にならないと思います．

- macOS Mojave 10.14.6
- ATOM（エディタ．パッケージの設定は後ほど言及．）
- skim（PDF閲覧）

### 前提
前提として，次の記事：
https://qiita.com/wtsnjp/items/6ba3b8e12514d8a3bd41
で言及されているように，単一のソースファイルをビルドするのではなく，いくつかにソースファイルを分割して，それらを取りまとめるようなファイル（以下，マスターファイル）をビルドするようになっています．

### 目標
簡単に述べると，

- ソースファイルは分割しておく
- 分割したファイルは保存のみ（ビルドは行いたくない）
- マスターファイルのみ保存・ビルドしたい（DVIを生成し，PDFも生成する）

ということです．以上を実現するためにパッケージの設定を以下のようにします．

# atomのパッケージ LaTeX の設定項目
##### Settings（抜粋）
|key |parameter |解説|
|:--|:--|:--|
|Engine          |uplatex  ||
|Output Format   |pdf      |出力されるファイルの形式||
|PDF Producer    |dvipdfmx |PDFを生成するときの外部ドライバ|
|Move Result to Source Directory |True |
|Build on Save   |False    |保存時にビルド**しない**|
|Opener          |skim     |出力ファイルを見るソフトの指定|

##### Keybindings
|key|parameter|
|:--|:--|
|Enable |True |

# 背景と解説
この記事の執筆時，私は修士2年でした．修士論文は当然ながらLaTeXで書いていました．ソースファイルが長大となることが予想したので，執筆当初から章ごとに分割し，マスターのファイルに分割したソースファイルをincudeする形をとっていました．また，上の表の設定では，保存時にビルド（Output Formatで指定された形式で出力される）**しない**設定になっています．

マスターファイルのみPDFなどの出力ファイルを作れば良いので，パッケージLaTeXの設定を

- `build on save`のチェックを外す（無効にする）
- キーバインドのEnableにチェックを入れる（有効にする）

のようにすることで，保存時にはビルドせず，キー操作`control + alt + b`によりビルドし，（表の設定ではdvipdfmxを用いて）PDFが生成されます．当然，分割したファイルに対してビルドすると，誤ったDVIファイルやPDFファイルが生成されます（保存は問題なく可能です）．

もちろん，ファイル分割をせずに，単一のファイルのみで編集している場合は保存と同時にビルドするほうが便利でしょう．次の記事が参考になります：
https://qiita.com/stomk/items/cb866116a3eb874732a0#保存時に自動コンパイル

また，キーバインドを変更したい場合は，
https://qiita.com/Mahito6/items/fd55fa5a221fd15de917
を参考にすると良いでしょう（私は未検証です）．

# 参考文献
- https://qiita.com/wtsnjp/items/6ba3b8e12514d8a3bd41
- https://qiita.com/stomk/items/cb866116a3eb874732a0
- https://qiita.com/Mahito6/items/fd55fa5a221fd15de917
SQL

#SQLとは
SQLとは、データベース言語の１つです。

#データベースの基礎
データベースはデータを保存するためのツールで、集めたデータをDBMS（データを管理するプログラム）で整理し、表でデータを管理しています。
表のことをテーブル、縦列をカルム、横列をレコードと呼びます。

##クエリ
データベースからデータを取得するには、
クエリという命令文が必要で、
その命令文を書く言語として有名なのがSQLです。

##SELECTとWHERE
どのカルムからデータを取得するか
選択するのに、SELECTを用います。

特定のカルムからデータを取得するのに、
WHEREを用います。

###WHERE
例えば、食費カテゴリーのカルムからデータを取得する場合は、
```WHERE category="食費"```
となります。
ただし、数値データの場合は""で囲まないことに注意です。

##FROM
データベースには複数のテーブルが存在する場合があるので、
FROMで選んだカルムがどのテーブルのものかを指定するのに、FROMを用います。

`
SELECT
 FROM
`

の順に書きます。

ひとまとまりのクエリの最後には「;」をつけましょう。

 ##NULLデータを取得する
NULL　データを取得するには、
「カルム名　IS NULL」とすることで可能になります。
NULLでない場合は　IS NOT NULL とすれば良いです。
カルム名の前にNOTをつけるのではないことに注意しましょう。

##複数のデータを取得したい時
AND演算子・OR演算子で
WHEREに複数の条件を指定することができます。


##　データの並び替え
ORDER BY　カテゴリー　○○○で、
○○○の部分が、

ASCなら昇順
DESCなら降順

となります。


#参考
progate SQL
Git fatal: Unknown index entry format

備忘録的に。
間違ったshellを動かしてgitレポジトリをぶっ壊してしまったとき。（.git ファイルなど隠しファイルにも影響を与えてしまった場合。。）  

```
$ git checkout .
```
を行なっても下記エラー。

```
fatal: Unknown index entry format x56axxxx
```

ほなとりあえずローカルレポジトリのremoteとの紐付け消すか、としたら

```
$ git remote rm origin
error: non-monotonic index .git/objects/pack/pack-12kjneffselfnwj3jwjk3wdnsdjknajw3dwdsjnd.idx
error: non-monotonic index .git/objects/pack/pack-12kjnadwselfnwj3jwjk3wdnsdjknajw3dwdsjnd.idx
error: non-monotonic index .git/objects/pack/pack-12kjnefffslfnwj3jwwk3wdnsdjknajw3dwdsjnd.idx
error: non-monotonic index .git/objects/pack/pack-12kjneawselfnwj3jwjk3wdnsdjknajw3dwdsjnd.idx
error: non-monotonic index .git/objects/pack/pack-12kjneffselfnwj35wjk3wdnsdjknajw3dwdsjnd.idx
error: non-monotonic index .git/objects/pack/pack-12kjneffssdfnwj3jwjk3wdnsdjknajw3dwdsjnd.idx
error: non-monotonic index .git/objects/pack/pack-12kjneffawdfnwj3jwjk3wdnsdjknajw3dwdsjnd.idx
```

うおお。なにこれ。

```
$ git fsck --full
error: inflate: data stream error (invalid distance too far back)
error: unable to unpack header of .git/objects/04/4c9cedaw427385a0aae914bea384fc45ba03236
```

したら同じようなログが1000行以上でてきた。これはもうちょっと解析できるレベルではない。

新しく同じ名前のディレクトリをつくって `git remote add` してから `git pull` しても下記。

```
$ git pull origin master
error: refs/heads/master does not point to a valid object!
error: inflate: data stream error (invalid block type)
error: unable to unpack xxxdc4ae26830ab44ae2746c52865556a4d993c1 header
error: inflate: data stream error (invalid block type)
error: unable to unpack xxxdc4ae26830ab44ae2746c52865556a4d993c1 header
fatal: loose object xxxdc4ae26830ab44ae2746c52865556a4d993c1 (stored in .git/objects/xx/xxx4ae26830ab44ae2746c52865556a4d993c1) is corrupt
```

おそらくだが `.git` までshellで変更してしまったから、もうこれは直せないと感じ、
下記を試しました。現状のリモートディレクトリの `.git` を持ってきて自分のローカルのものと置き換える。

[Git: “Corrupt loose object”](https://stackoverflow.com/questions/4254389/git-corrupt-loose-object)

>The fix
Execute these commands from the parent directory above your repo (replace 'foo' with the name of your project folder):

>Create a backup of the corrupt directory:

```
cp -R foo foo-backup
```
>Make a new clone of the remote repository to a new directory:

```
git clone git@www.mydomain.de:foo foo-newclone
```

>Delete the corrupt .git subdirectory:

```
rm -rf foo/.git
```

>Move the newly cloned .git subdirectory into foo:

```
mv foo-newclone/.git foo
```

>Delete the rest of the temporary new clone:

```
rm -rf foo-newclone
```

これで元に戻りました。
ありがとうStackOverflow.
今回、ローカルだったのでぶっ壊れてもなんとかなりましたが、これをリモート側でやってしまったら結構取り返しのつかない大事件になるところでした。
リモート先で実験する場合はmasterレポジトリをbackupした先で行うことが必要だと再実感できてよかったです。
Vue.js + webpack で 数字をドラムロールする

#はじめに

数字をドラムロールするアニメーションはすでに、[Vue.jsのドキュメント](https://jp.vuejs.org/v2/guide/transitioning-state.html) にあるけど、これをwebpackで使いたい。
あと、フォームに入力してカウントアップするやり方ではなく、ボタンを押したら10ずつ増えるという簡単なコードを書きました。

# HTMLを書く

ボタンと数字を表示する

```html
<div id="app">
  <button v-on:click="countup">
    10ずつカウントアップ
  </button>

  <p>{{ animatedNumber }}</p>
</div>
```

# GSAPをインストール

GSAPのTweenLiteを使うため、GSAPをwebpackにインストールします。

```bash
npm install gsap
```

#コードを書きます。

```javascript
import Vue from 'vue'
import TweenLite from 'gsap' // GSAPのTweenLiteを使います。

new Vue({
  el: '#app',
  data: {
    tweenedNumber: 0
  },
  computed: {
    animatedNumber: function() {
      return this.tweenedNumber.toFixed(0) //小数点を削除するため toFixedを使用
    }
  },
  methods: {
    countup: function() {
      const newValue = this.tweenedNumber + 10
      TweenLite.to(this.$data, 0.5, { tweenedNumber: newValue })
    }
  }
})
```

といった感じです。
これができると色々応用がきくと思います。
わたしは、検索結果の件数をリアルタイムで出す際にこれを使ってます。
最大値を探そう python (修正ver)

先日上げた「[最大値を探そうpython](https://qiita.com/banana19980702/items/08b30cc81602917e8407)」の修正verです。以前のコードの悪い点と変更点は以下の通りです。
##悪い点
・リストの要素がすべて負の時、最大値が0になってしまう
・処理速度が遅い
##変更点
・最大値候補の初期値をリストの適当な要素に設定
・while文からfor文にする

***

悪い点の二点を踏まえてリファクタリングをしてみました

```python
num = int(input("何個数値を代入しますか?"))
value_list = [] #数値を格納する配列を用意する

for i in range(num):
    value = int(input("数値を代入して下さい"))
    value_list.append(value) #用意したリストに値を追加していく

max_value = value_list[0] #リストの要素で初期化

for i in range(num):
    if value_list[i] > max_value:
        max_value = value_list[i]

print(max_value) #最大値を出力
```

##変更した部分
```python:代入(変更前)
while i < num:
    value = int(input("数値を代入して下さい"))
    value_list.append(value) #用意したリストに値を追加していく
    i += 1
```
```python:代入(変更後)
for i in range(num):
    value = int(input("数値を代入して下さい"))
    value_list.append(value) #用意したリストに値を追加していく
```

```python:比較(変更前)
max_value = 0 #最大値を0で初期化
i = 0
while i < num:
    if value_list[i] >= max_value: #格納した数値を順番に比較していく
        max_value = value_list[i]
    i += 1
```
```python:比較(変更後)
max_value = value_list[0] #リストの要素で初期化

for i in range(num):
    if value_list[i] > max_value:
        max_value = value_list[i]
```
***
初期値を入力した要素に設定することで入力された要素がすべて負の時も正常に最大値が出るようになりました。
さらに、while文からfor文にしたことで無駄に初期化や加算処理をすることがなくなりました。

##max関数を使ってみた
pythonには与えられた要素を持つオブジェクトから最大値を求める関数があるとコメントで指摘してもらったので早速使ってみました。

```python
num = int(input("何個数値を代入しますか?"))
value_list = [] #数値を格納する配列を用意する

for i in range(num):
    value = int(input("数値を代入して下さい"))
    value_list.append(value) #用意したリストに値を追加していく

print(max(value_list))
```
出力結果

```
何個数値を代入しますか? 3
数値を代入して下さい -3
数値を代入して下さい -2
数値を代入して下さい -5
-2
```
***
意見、ご指摘して下さったみなさんありがとうございました。
【雑記】Dockerとマイクロサービス

#前置きとモノシリックアーキテクチャ

だいぶ前に「マイクロサービスアークテクチャ」という名前は聞いたことあるものの、具体的な例がイメージできなかったです。

でも、今回何も知らずにDockerに手を出しました。
で、なんかアプリを作ってみたいと思って、
「せっかくだから、フロントはAngularで〜、サーバーサイドはGolangで〜」
とか呑気に考えていたところ、

**。。。あれ？　Dockerfile のFROM（ベースのイメージ？）って、
１個しか設定できない？！**
Goは「FROM golang:1.9」だし、
Angularは「FROM node:10.8.0-stretch」とか書くの？

え？え？

ってなりました。

長年Javaとかでやってきた自分としては、１つのプロジェクトのなかに、サーバの処理も画面（htmlやcss、js含め）も全部入ってる、というのが普通でした。
で、それらをeclipseとかでボーンって全部開いて全部触る、的な。

なんなら、それら全部が一つのサーバで管理されていて、
下手したらDBすら１台の物理サーバにはめ込まれてしまう。

こんなのが **モノシリックアーキテクチャ** というのだそうです。
モノシリック（monolithic）とは英語で「一枚岩」っていう意味の形容詞だそうな。
そのままのイメージですね。
一枚岩のようなサーバの上に、全部乗っかってる。
全部のせ。

じゃあ、そもそもマイクロアーキテクチャってなんなの？

#マイクロサービスアーキテクチャ
これについては、以下を参照ください。
（きっとこっちをみてもらうとめっちゃわかりやすい）

>
マイクロサービス（Microservices）は、個々に開発された複数の小さな（マイクロ）サービスを連携させて管理、運営をおこなっていくソフトウェアのアーキテクチャです。
ソフトウェアのエンジニアであるマーチン・ファウラー氏らによって書かれた2014年の記事に登場して以来、一種のバズワードとして知られるようになりました。
https://ec-orange.jp/ec-media/?p=23458
>

Dockerはよくよく調べてみると、マイクロアーキテクチャを実現するための重要な要素だったようです。
訳もわからないまま、それとは知らずマイクロサービスの入り口に立ってたってことですね。

で、本題に戻る。
じゃあ、AngularとGoでDockerを使うためには、どんな構成にすべきなのか？
ってなったらこんな感じなのでしょうか？
<img width="958" alt="スクリーンショット 2019-11-12 16.15.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525955/ec288a9a-1e3c-e217-df26-c3a0fbc079cf.png">

なんか、フロント、サーバサイド、データ、ってな感じで小さい単位になった気がする。。。
フロントとサーバサイドを通信させる、っていう頭はなかったので、目からウロコでした。

というわけで、もう少し色々勉強してアプリ作成まで頑張ります！
fbjni のメモ

PyTorch Android や React Native などで利用されているが, いまいち情報が無い fbjni

official repo はこちら.

https://github.com/facebookincubator/fbjni

基本的には, エラー処理などを内包して JNI binding を書きやすくした wrapper ライブラリです.
Apache 2.0 License で利用しやすくなっています.

ドキュメントはこちら

https://github.com/facebookincubator/fbjni/blob/master/docs/quickref.md

Java `String` と C++ `std::string` が関連づけられており, 使いやすくなっています.
C++ で JNI が書けるのがいいですね.
(C++ ABI 的にやや懸念がありますが, Android においては, 昨今は C++11 or later + libc++ 限定になったことがあり, C++ interface でも昨今は問題ないのかも?)
【Python】前にアンダースコア(アンダーバー)２つの関数って何

classの中にある関数の前にアンダースコアが２つある時がある


```py
    def __hogehoge():
        print('Hello.')
```

なんの意味があるのか知らなかったので備忘録
結論：そのclass内でしか呼び出せなくなる

##練習してみる
実際にやってみよう〜
下記のようなサンプルを用意
※わかりやすように関数名はpublic、privateとしてますが稼働に際して意味はありません。

```train.py
class Hoge:
    def __init__(self):
        print('this is init function.')
        
    def public():
        print('this is public function.')
    
    def __private():
        print('this is private function.')
```

【ターミナル】でこのファイルがあるディレクトリまで移動してから以下のように実行

###Hogeクラスの実行
`__init__`はclassを実行すると必ず呼び出される


```
$python
>>> from train import Hoge 
>>> Hoge()
this is init function.
```

###public関数の実行

ターミナルの先ほどの続きに以下のように入力

```
>>> Hoge.public()
this is public function.
```
何も付いていない関数は問題なく呼び出せる

###private関数の実行

ターミナルの先ほどの続きに以下のように入力

```
>>> Hoge.__private()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: type object 'Hoge' has no attribute '__private'
```
外部からの呼び出し失敗

追記：
19/12/4
コメントいただきました。
どうしても呼び出したい場合は```Foo._Foo__a```とすることで呼び出せるようです！
情報ありがとうございます。
Unity 2019.2でTile Paletteをインストールする方法（表示する方法）

以下の手順でインポートすれば表示される
<img width="246" alt="スクリーンショット 2019-11-12 16.12.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67439/f3602e55-f7a2-c985-97d5-3f532d31ca4c.png">
（packageでtileと検索すればこれが出てくるのでインストール）
<img width="701" alt="スクリーンショット 2019-11-12 16.14.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67439/017d11c6-43b4-1870-80e1-683ebb1eef85.png">

<img width="378" alt="スクリーンショット 2019-11-12 16.15.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67439/3cd7057a-2715-bbef-35c6-e64e818f1eaa.png">
【Python中級者への道】lambda式を使う


# まとめへのリンク

https://qiita.com/ganariya/items/fb3f38c2f4a35d1ee2e8

# はじめに

Pythonの勉強をするために、[acopy](https://github.com/rhgrant10/acopy)という群知能ライブラリを写経していました。

acopyでは、多くのPythonの面白い文法・イディオムが使われており、その中でも便利だなぁというのをまとめています。


今回は、Pythonのlambda式について学びます。

# lambda式とは？

ラムダ式とは、他の多くのプログラミング言語でも利用される概念で、**無名関数**の意味をさします。
名前をつけるまでもない、**利用するスコープが非常に小さい**場合に、**無名な関数をその場で定義して使い捨てる**　というのがラムダ式です。

C++では`[](){}`の表記で利用できます。

# lambda式の例

lambda式は`lambda 引数: 処理`の形で表記します。
処理の結果として、必ず値が返されるという特徴があります。


例えば、２つの整数の引数を足し算するadd関数、そしてそれをlambdaで表したlm_add関数を作成してみます。

```py
def add(x, y):
    return x + y


lm_add = lambda x, y: x + y

x = 10
y = 40

'''
50
50
'''
print(add(x, y))
print(lm_add(x, y))

```

add関数と同じ挙動を示すのがlm_add関数です。
引数$x, y$を受け取り$x+y$を計算したあと、強制的にreturnされます。

通常の関数と同様に、可変長引数を利用できます。


```py
f = lambda *args, **kwargs: print(args, kwargs)

'''
(10, 'a') {'hello': 'world'}
'''
f(10, 'a', hello='world')
```


# 活用例

lambda式は、基本的に使い捨てで名前をつけるまでもない、極小のスコープのみで利用します(するべきと考えています)。

例えば

- ソートの基準として
- 最大値の基準として

など組み込み関数と組み合わせて使用することが多いです。特に競技プログラミングでは多用します。

例えば、以下はタプルの配列を第$1$要素を基準として昇順に並べ、もし同じならば第$0$要素で昇順にさらに並び替えます。

```py
tuples = [(10, -3), (4, 10), (-4, 13), (-20, -50), (-20, 1), (0, 0), (-22, -50)]

tuples = sorted(tuples, key=lambda x: (x[1], x[0]))

'''
[(-20, -50), (-22, -50), (10, -3), (0, 0), (-20, 1), (4, 10), (-4, 13)]
'''
print(tuples)
```
以上のような比較関数はわざわざスコープの外に定義するまでもないため、また、関数の位置が遠くなり、処理を追う負担を減らすため、lambdaで定義すると良さそうです。


# 最後に

lambdaについて見てみました。
特に競技プログラミングでPythonでやっていると多用します。
他の言語でもラムダ式を活用していきたいです。

Pythonだと$2$つの要素で入れ替えるソート（C++のソートなど）
はクラスに`eq, lt`を定義するしかないんでしょうか...(ラムダでできると楽なのですが)


# 参考文献

- [Pythonのlambdaって分かりやすい](https://qiita.com/nagataaaas/items/531b1fc5ce42a791c7df)