OmniAICreator/Qiita-1.07M huggingface dataset:
baserCMSで短いURLでブログ記事にアクセスする

こんにちは。『[baserCMS Advent Calendar 2018](https://adventar.org/calendars/3481)』5日目担当の ryuring です。
あまり時間がないので小ネタだけ。

baserCMSのブログ記事のURLは、WordPressの初期状態に似て少し長いんですよね。

こんな感じ。

```
http://localhost/news/archives/1
```

たまにSEOうるさい人が、URL短くしろよとか言いますよね。
なのでそれを叶えてあげるためにこんな感じにする方法を書きます。

```
http://localhost/1
```

プラグインとして作りましょう。

例えば、`ShortUrl` プラグインとして作る場合。
まず、ルーティング設定用のファイル `app/Plugin/ShortUrl/Config/routes.php` を作ります。

```php
// routes.php
Router::connect('/:no',
	['plugin' => 'blog', 'controller' => 'blog', 'action' => 'archives', 'entityId' => 1],
	['pass' => ['no'], ['no' => '[0-9]+']]
);
```

`entityId` は、ブログコンテンツIDになります。管理画面で調べましょう。

あとは、管理画面で、プラグインを有効化すれば完了です。

これは baserCMSの特別な機能ではなく、CakePHPの標準機能なんですね。

Cakeすげえ。viva Cake!
と言って、Laravelに追い抜かれてしまった Cake の後押しをしてみる。
現在過去未来 行き放題にするおまじない

## 日付指定で公開されるコンテンツを簡単にデバッグする

WEBサイトを作っていると、このキャンペーンは、○日から告知したい、また、このページは○日で終わりにしたい。などの時間帯表示制御を入れたくなるのが人の性。ただ、モノによっては、夜中0時からスタートするという、システム屋泣かせな企画もあるかと思います。そんな時、テストって皆さんどうしてますか？

- OSのシステムの時刻をずらして切り替わるかテストする
- 切り替えの時間を現在時刻+2分くらいにして、切り替わることを担保する
- PHPTimecop等(hnwさん作)を使う

いろいろあるかと思います。

## 非システムメンバーが簡単に確認する方法は？

前述の対応を使うと、システムにあまり詳しくないメンバーは確認するために都度エンジニアに依頼をすることとなります。って、これ毎回やるの？お互い大変！

## もっと簡単にできる方法を考えてみた

### 準備するもの

- 適当なPHP MVCフレームワーク・・・・・・・・・1式
- TWIG等のテンプレートエンジン   ・・・・・・・・1式

### 設計方針

非システムメンバーに、【直感的に確認してもらえる方法】はなんだろう？と考えた時、今表示されているURLの後ろにGETパラメータで日時指定できたら楽かも・・・と思いつく。

### 要件の確認

- 年月日を指定することで、対象ページのその日の状態を見ることができる
- 時間で切り替わるコンテンツもあるので、時分秒でも指定できる
- テンプレートで指定時刻を使った表示制御ができる

### 実装方法の検討

ページによって、引数を受け付ける内容が違うので、フレームワークの場合ルーティング部分（コントローラー部分）に引数の制御及び、バリデーションロジックを一つひとつ細かく書いてくのが面倒。（フレームワークによっては、ミドルウェア部分でできるけど）ってことで、大抵どのページも通る公開ディレクトリの`index.php`にロジックを書く。

※ここでは、`?static_date=YmdHis`を共通の引数として、サイト内では`$static_date`を現在時刻として扱う様にする。

### 実装

```php:index.php
//static_dateがあればその内容を$appの配列に追加する
if(isset($_GET['static_date']) && $_GET['static_date'] && is_numeric($_GET['static_date'])){
	//その内容をタイムスタンプとして$appの配列に追加する
	$app['static_date'] = strtotime($_GET['static_date']);
} else {
	//なければ、現在時刻を指定
	$app['static_date'] = time();
}
```

### テンプレート実装方法の検討

View側で変数の設定値を見て日付を比較、日付が表示する範囲内の場合は表示、範囲外の場合は非表示とするロジックを実装。

### 実装

※例はTWIGを利用したもの。

```TWIG:view
{% if app.static_date | date("Ymd") == "20181219"  %} 
12月19日おめでとう!
{% endif %}

```

TWIGでは、日付をdate()でフォーマットできるのでその部分を利用する。

| フォーマット | 内容 |例   |
|:----------------:|:-----------------|:------------------|
| Y| 年を西暦で取得| 2018  |
| m |月を0埋めで取得|       08      |
|d | 日を0埋めで取得|        05        |
| H |   時間を取得（24時間）|       23         |
| i  |    分を0埋めで取得|       05     |
| s |    秒を0埋めで取得|       09       |

```twig:日時取得SAMPLE
{# 現在の年月日を取得 20181204#}
{{ "now" | date("Ymd")  }}　
{# 現在時分秒を取得 152532#}
{{ "now" | date("His")  }}　

```

## 使い方

時間で出し分けするコンテンツを見たいページのURLの末尾に、
`?static_date=20181219`
をつけて12月19日をシミュレートする。

```:アクセスURL
https://example.com/?static_date=20181219
````

でアクセスすると、

```:サイト表示
12月19日おめでとう!
```
と画面に表示され、表示されない日の12月14日をシミュレートすると

```:アクセスURL
https://example.com/?static_date=20181214
```
なにもでない様になる。
同様に、時間帯制御も可能。例えば、12月19日12：00～13：00だけ出したいものは

```TWIG:12月19日12：00～13：30だけ
{% if app.static_date | date("YmdH") >= "2018121912" and app.static_date | date("YmdHi") <= "201812191330" %} 
昼だね。今日12月19日は、何食べ行こうか?
{% endif %}
```
という要領で使える。

## 注意

このまま、サービスをしてしまうと、サイト閲覧者が、先々のキャンペーン予定を知っちゃったりして、諸々危険なので、この動作は開発環境でのみ実行するようにしておいたほうが良いと思います。Apacheを使っている場合、httpd.confに環境を識別する変数`env`等を指定し、それをアプリ側で判別、機能のOn/Offを切り替えるようにしときましょう。

```php:環境を見て挙動を変更する
//開発環境で且つstatic_dateが引数にあれば
if(isset($_GET['static_date']) && $_GET['static_date'] && is_numeric($_GET['static_date']) && $_SERVER['env']=="dev"){
	//その内容をタイムスタンプとして$appの配列に追加する
	$app['static_date'] = strtotime($_GET['static_date']);
} else {
    //なければ、現在時刻のタイムスタンプを指定
    $app['static_date'] = time();
}
```

## まとめ

やり方はいろいろあると思いますが、非システムメンバが確認しやすい環境を作ってあげるのもエンジニアとして必要なタスクかと思います。それと、たまに、過去の日付を指定して、昔のキャンペーン等を見てノスタルジーに浸ってみるのも良いかもしれませんね。
EC2上の容量がいっぱいになったので、きれいにする

# 概要

開発を行っていて、EC2の空き容量がなくなって、以下のようなメッセージが出てきた。

```
E: Failed to fetch http://deb.debian.org/debian/dists/stretch/main/binary-amd64/Packages  Error writing to output file - write (28: No space left on device) Error writing to file - write (28: No space left on device)
E: Some index files failed to download. They have been ignored, or old ones used instead.
```

そのため、容量を開けるための方法を以下にメモする。
と、その前に、本当に容量がいっぱいかを確認するためには以下のコマンドを実行する。

```
df -h
```

私のインスタンスは想定通り満杯だ。

```
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      8.0G  8.0G   48M 100% /
```

# 方法

## Dockerのごみを削除

とりあえず、たまりにたまっているであろうDockerのごみを削除。以下のコマンドを実行。

```
docker system prune -a
```

結果は以下。1.5GB空いた。

```
Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      8.0G  6.6G  1.5G  83% /
```

`docker system prune -a`は、全ての停止中のコンテナ、ボリューム、ネットワーク、イメージを一括削除するコマンドみたいだが([参考](https://qiita.com/mom0tomo/items/911b92cc18871f52a2a0))、以下のコマンドでvolumeも削除したところ、もっと空いた。

```
docker volume prune
```

結果はVolumeの削除だけで2.7GB空いた。合計で4GB以上、50％以上空いた。


# 参考
https://cntnr.io/whats-eating-my-disk-docker-system-commands-explained-d778178f96f1
ReactNativeでPINコード画面

RNでPINコード画面をとりあえず、見た目だけ。

デザインがシンプルでよかったので、[react-native-pincode](https://github.com/fnzc/react-native-pincode#readme)を使いました。

![37805052-bdefa610-2e9c-11e8-8290-fe2d695020a5.gif](https://qiita-image-store.s3.amazonaws.com/0/252667/b105aad0-37fe-8714-e219-0d47f3492a74.gif)

##インストール

```terminal
npm install --save @haskkor/react-native-pincode
```


```javascript:App.js
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
import PINCode from '@haskkor/react-native-pincode';


export default class App extends React.Component {
  render() {
    return (
        <PINCode status={'choose'}/>
    );
  }
}
```

一応これだけで、見た目は動きます。

##使い方
このnpmでは３つの使い方ができる。
<img width="756" alt="スクリーンショット 2018-12-05 15.00.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/252667/89620b95-d5ba-cf7b-bda1-18d6725019cd.png">

###choose
ユーザーがPINを入力して再度PINを入力して確認する
パスワード設定とかでよくある二重確認の機能

###enter
指定したPINを入力して承認する
ロック機能をつけたアプリのログイン画面みたいな機能

###locked
PINを何度も間違えたときに一定時間ロックされた画面を表示させる


##オプション
###パスワードの文字数の変更

```diff:App.js
export default class App extends React.Component {
  render() {
    return (
        <PINCode 
          status={'choose'}
+         passwordLength='5'
        />
    );
  }
}
```

###タイトルの変更
※choose画面のタイトル変更のみ

```diff:App.js
export default class App extends React.Component {
  render() {
    return (
        <PINCode 
          status={'choose'}
+         titleChoose='メインタイトル'
+         subtitleChoose='サブタイトル'
        />
    );
  }
}
```
<img width="485" alt="スクリーンショット 2018-12-05 15.14.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/252667/c3c244ba-bd2c-3036-b124-1d04472633a3.png">


以上。随時更新します。
初めてのVulkanプログラミング step2 物理デバイスの選択


[目次に戻る](https://qiita.com/tositada_nakada/items/db0f01c1c8c2945f786b)

ソースコードは以下の場所に置いておきます。各自のバージョンに合わせたプロパティ設定をしてから自由にご利用ください。
[github:  VulknAppAdocal2018](https://github.com/nakadasanda/vulkanAppaddcal2018)

##物理デバイスの選択
Vulkanライブラリーを初期化した後必要な機能をサポートするシステム内のグラフィクスカードを探して選択する必要があります。グラフィクスカードは同時にいくつでも使用することができます。



```cpp
VkPhysicalDevice _gpu = nullptr;
```

**vkEnumeratePhysicalDevices**関数を使用することで、グラフィクスカードの一覧を、番号だけで照会することができます。

```cpp
		uint32_t gpu_count = 0;
		vkEnumeratePhysicalDevices(_instance, &gpu_count, nullptr);
```

GPUが0台の時は、gpu_Countの値が0でこの機種でVulkanはサポートしていません。

それ以外の場合vkPhysicalDevicesのハンドル保持する配列を割り当てることができます。

```cpp
std::vector<VkPhysicalDevice> gpu_list(gpu_count);
vkEnumeratePhysicalDevices(_instance, &gpu_count, gpu_list.data());
```

##デバイスの適合性
すべてのデバイスで Vulkan APIの指定バージョンを使えるというわけではありません。
例えば自分のパソコンではgtx1080とintel系のCPUが乗っています。
その場合利用できるバージョンの違いは必ず出てきます。バージョンの違いだけでなく、テクスチャーの圧縮、マルチビューポートレンダリング最近発売されたRTX20では、レイトレーシング、テンサーコアが使える等機能的にも大きく違います。そのためちゃんと持っているデバイスの特性を確かめる必要がありますね。ここでは、ベストなGPUを見つける方法について書いていきます。

##GPUの基本情報
GPUの名前、ベンダーID、製品情報などの基本的なことは、vkGetPhysicalDevicePropertiesを使用して取得することができます

```cpp
VkPhysicalDeviceProperties _gpu_property = {};
vkGetPhysicalDeviceProperties(_gpu, &_gpu_property);
```

##GPUの拡張機能
お持ちのGPUの名前が分かっても、ある特定の機能使えるかどうかは、分からないです。
そのような拡張機能を調べるには、**vkGetPhysicalDeviceFeatures**関数を使用します。

```cpp
vkGetPhysicalDeviceFeatures(gpu, &features_properties);
```

##キューファミリー

使用するコマンドがデバイスでサポートされているキューファミリーか確認する必要があります。そのためにvkGetPhysicalDeviceQueueFamilyPropertiesを使用します。

```cpp
vkGetPhysicalDeviceQueueFamilyProperties(_gpu, &family_count, family_property_list.data());
```

相対的に見て一番GPUとして適したものをデフォルトのGPUに設定します。今回は、GPUをグラフィクス用途に使うためGRAPHICS_BITが立っているものを選びます。

```cpp
bool found = false;
		for (uint32_t i = 0; i < family_count; ++i) {
			if (family_property_list[i].queueFlags  & VK_QUEUE_GRAPHICS_BIT) {
				found = true;
				_graphics_family_index = 1;
			}
		}
		if (!found) {
			assert(0 && "Vulkan err: Queue Family supporting graphics not faound");
		std:exit(-1);
		}
```

## まとめ
今回やったことは、正しい物理デバイスを見つけるための操作です。

## 連絡先

tweeter: [tositada_nakada](https://twitter.com/nakadasanda17)
mail: nakadasanda@outlook.com

## 寄付

paypal: [tositada_nakada](https://www.paypal.me/nakadasanda)
Amazon: [欲しいものリスト](http://amzn.asia/fGpGuJo)
WEBアプリでFirebaseのデプロイ環境を構築する

> この記事は[Angular+Firebaseでチャットアプリを作る](http://qiita.com/Yamamoto0525/items/a76ea4b3924eeb82b0f9)のエントリーです。
> ※「Advent Calendar 2018」にもエントリーさせていただきました。
> 前記事：[Angularのngrxを使って状態管理を行う（実装編：エンティティ設定）](https://qiita.com/Yamamoto0525/items/e66804ba742bceeb3e38)
> 次記事：準備中

# この記事で行うこと

[前回の記事](https://qiita.com/Yamamoto0525/items/6c31cd6b45d23e54637b)ではngrxの状態管理の実装（エンティティ設定）を扱いました。
[以前の記事](https://qiita.com/Yamamoto0525/items/fb23707831ff6d181544)で「Firebase tools」のインストール、およびコンソールからFirebaseにログイン、デプロイして確認する方法を紹介しましたので、本記事ではそれ以降のFirebase環境構築について学習します。

> アドベントカレンダーから来られた方でもわかるよう、この記事単体で成立する内容にしています。

- [開発、ステージング、本番環境を作る](#開発ステージング本番環境を作る)
- [Firebaseのデプロイコマンド](#firebaseのデプロイコマンド)

### Firebaseのデプロイ環境

WEBアプリをサービスとして運用しようとした場合、本番環境だけでは開発テストやステージングテストの実施が困難になるため、それぞれにデプロイしてテストできる環境が必要になります。
Firebaseの場合、１つのプロジェクトに対して１つのホスティングしか実行できないため、このような運用を行う場合は3つの独立したプロジェクトを作成する必要があります。

Firebaseは開発テストくらいで使用する分には基本無料枠で運用することができるので、開発用、ステージング用にプロジェクトを作成しても、追加のコストにはならないというメリットがあります。

*****
（追記：2020/6）現時点（2020年6月）での最新の内容に書き換えています。
*****


# 実装内容

## 開発、ステージング、本番環境を作る

まず、このアプリのプロジェクトとFirebaseプロジェクトを登録します。
`.firebaserc`というファイルに、事前に作成したFirebaseプロジェクトのIDを設定します。

プロジェクトIDは、`firebase login`を行った状態で、`firebase list`コマンドを起動すると確認することができます。

```json:.firebaserc
{
  "projects": {
    "dev": "開発用FirebaseプロジェクトID",
    "staging": "ステージング用FirebaseプロジェクトID",
    "prod": "本番用FirebaseプロジェクトID"
  }
}
```

特に何も指定せずに`firebase deploy`を行なった場合、Firebaseのカレントプロジェクト（ログイン中のプロジェクト）にデータがデプロイされます。

もし、プロジェクトを指定してデプロイを行いたい場合は、次のようにコマンドを実行します。

```bash
firebase deploy --project dev
firebase deploy --project staging
firebase deploy --project prod
```

これでそれぞれのプロジェクトにデプロイを行うことができるようになりました。
ただ、このままにしてしまうとついうっかり本番用のプロジェクトIDにデプロイしてしまうと行った事故が発生る可能性があります。

そこで、本番アップロード用にFirebaseのアカウントをもう1つ作成し、今までのアカウントでは閲覧権限のみになるように設定しておきます。

権限設定は次の手順で行います。

1. Firebaseコンソールにログインする
2. Project Overviewの横にある歯車アイコンから、「ユーザーと権限」をクリック
3. 登録されているメンバーを選択し、役割を適当なものに変更する

これで誤って本番にデプロイしてしまう事故を防ぐことができました。

![NgChat – 設定 – Firebase console.png](https://qiita-image-store.s3.amazonaws.com/0/112566/a6984d31-8283-e91e-39b7-77c3ffe2af0c.png)

## Firebaseのデプロイコマンド

Firebaseのデプロイにかかるコマンドを紹介します。

| コマンド | 内容 |
|:-----------------|:------------------|
| firebase deploy | プロジェクトにデータをデプロイする |
| firebase hosting:diable | プロジェクトを非公開にする |
| firebase use プロジェクトID | カレントプロジェクトをプロジェクトIDに切り替える |
| firebase use --add | プロジェクトのエイリアスを作成。`.firebaserc`に追記される |
| firebase deploy --only hosting | Hostingのデータだけデプロイする |
| firebase deploy --only functions | Functionsのデータだけデプロイする |


#### 参考

[Firebase CLI リファレンス](https://firebase.google.com/docs/cli/?authuser=1)

### ロールバック処理をする

もし、不用意なデプロイを行なってしまった場合、前のバージョンに戻したいということがあると思います。

そう行った場合は、Firebaseコンソールを開いて、任意のバージョンにロールバックを行います。

![NgChat – Hosting – Firebase console (1).png](https://qiita-image-store.s3.amazonaws.com/0/112566/e2ed9022-0df5-ff60-c129-d4c57ca658c8.png)

これでFirebaseのデプロイ環境は整いました。次回はAngularのビルドとFirebaseのデプロイを連動させます。

## ソースコード
この時点での[ソースコード](https://github.com/Yamamoto0525/NgChat/tree/15cb212b63947267293b73dcad12febd616ea2de)
※firebaseのapiKeyは削除しているので、試すときは自身で作成したapiKeyを入れてください。
yarn upgrade-interactive と同じように npm でも対話型な更新をしたい！

## 前書き

ところで皆さん、パッケージマネージャーは yarn と npm どちらを利用していますか？

yarn のリリース直後、「高速なダウンロード！lock ファイル (_yarn.lock_) による依存ライブラリのバージョン固定！最&高！」と感動し、 npm から yarn に切り替えたのを覚えています。

しかし、npm v5 のリリースにより、速度が改善され、更には lock ファイル (_package-lock.json_) が生まれました。
この時から、「あれ、yarn って必要？」と思うようになりました。

npm に切り替えたいですが、 yarn には `upgrade-interactive` コマンドという大変便利な、対話型な更新が可能なコマンドを標準で備えています。
※ `yarn upgrade-interactive` について知りたい方は、[こちら](https://qiita.com/terrierscript/items/98931b91d155348046c9)を参照するのが良いです。

「npm でも対話型な更新をしたいんや！」

## npm で対話型な更新をする

先ずは [npm-check](https://github.com/dylang/npm-check) をインストールし、

```shell
$ npm install npm-check --save-dev
```

_package.json_ の npm-scripts を以下のように修正します。

```json:package.json
{
	"scripts": {
		"upgrade-interactive": "npm-check --update"
	}
}
```

後は、以下のように実行するだけです。

```shell
$ npm run upgrade-interactive
```

すると、yarn upgrade-interactive と同じように対話型な更新が可能です。

> ![npm-check -u](https://cloud.githubusercontent.com/assets/51505/9569917/96947fea-4f48-11e5-9783-2d78077256f2.png)
> 引用元: [https://github.com/dylang/npm-check](dylang/npm-check: Check for outdated, incorrect, and unused dependencies.)


さっき知ったのですが、[yarn upgrade-interactive の公式ドキュメント](https://yarnpkg.com/lang/ja/docs/cli/upgrade-interactive/)に、

> npm-check の対話型の更新モードと同様です。

と記載されていました。
django.urls.reverse についてまとめる

`django.urls.reverse` はよくわからなくなることが多いのでまとめる。

# reverse とは

Django の urls に設定された名前をパラメータとして渡すと、URLを返す。

```python:sampleapp.urls.py
# 情報足りてないかも知れませんが、大体で理解してください。

urlpatterns = [
    url(r'^send_mail/$', send_mail_view, name="send_mail"),
    url(r'^item/<pk>/$', item_detail_view, name="item_detail"),
]
```

上記URL の設定がある前提で、以下のように使う。

```python:
reverse("sampleapp:send_mail")
# /send_mail/ を返す
```

# reverse にパラメータを渡す(query)

```python:
"".join([reverse('sampleapp:send_mail'),'?',urlencode(dict(limit='10', flg='1'))])
# '/send_mail/?limit=10&flg=1' を返す
```

# reverse にパラメータを渡す(path)

```python:
reverse('sampleapp:item_detail', kwargs=dict(pk=u'7'))
# '/item/7/' を返す
```
Unityのguidのconflict時の解決のされ方

# 背景

Unityで作成したリソースのGUIDがぶつかるとwarningが出つつ変わるのだが、この解決方法が変わったときがあったので挙動を調べた。


# 実験

Unity 2018.2.16f1で実験

Script1.csとScript2.csをconflictさせてみる

## 検証1. Script1.cs がImport済み、 Script2.cs (guid同一)が追加されたときの挙動

この状態でUnityEditorを開く

```
$ tree Assets/Scripts
Assets/Scripts
├── Script1.cs
└── Script1.cs.meta

0 directories, 2 files
```

いったんUnityEditorを閉じて、コピー

```
$ cp Assets/Scripts/Script1.cs Assets/Scripts/Script2.cs
$ cp Assets/Scripts/Script1.cs.meta Assets/Scripts/Script2.cs.meta
```

UnityEditorを開く

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15000/028ec192-0a95-a2d4-ca59-45c52daacc8f.png)

warningがでて、 `Script1.cs` と `Script2.cs` がconflictしたことにより、 `Script2.cs` に新しいguidが割り振られることがわかった

```diff
$ git diff
diff --git a/Assets/Scripts/Script2.cs.meta b/Assets/Scripts/Script2.cs.meta
index b6d4548..b43c0ea 100644
--- a/Assets/Scripts/Script2.cs.meta
+++ b/Assets/Scripts/Script2.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: e2d1e0565f7244fe190400e5735663c1
+guid: 14ecaa395b8084260ad61be8d595fe93
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
```

## 検証2. Script1.cs / Script2.cs が未Import時の挙動

いったん検証1の状態を戻しておく

```
$ git checkout .
```

Library以下を削除することで、未Import状態を作る

```
$ rm -rf Library
```

UnityEditorを開く

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15000/8e09a185-d31e-5afc-5cbf-c5d7ba4d325f.png)

`Script1.cs` と `Script2.cs` の両方で新しいGUIDが割り振られた

```diff
$ git diff
diff --git a/Assets/Scripts/Script1.cs.meta b/Assets/Scripts/Script1.cs.meta
index b6d4548..b253617 100644
--- a/Assets/Scripts/Script1.cs.meta
+++ b/Assets/Scripts/Script1.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: e2d1e0565f7244fe190400e5735663c1
+guid: 4863cdfedb69949af9a48b4794c98200
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
diff --git a/Assets/Scripts/Script2.cs.meta b/Assets/Scripts/Script2.cs.meta
index b6d4548..db0fc57 100644
--- a/Assets/Scripts/Script2.cs.meta
+++ b/Assets/Scripts/Script2.cs.meta
@@ -1,5 +1,5 @@
 fileFormatVersion: 2
-guid: e2d1e0565f7244fe190400e5735663c1
+guid: 49b3f20779ffa4ca7bab99ee1bb22a59
 MonoImporter:
   externalObjects: {}
   serializedVersion: 2
```

未Import状態だと競合するassetの双方でguidが新たに割り振られることが判明した

# まとめ

GUIDがconflictしたとき、状況によって2つのパターンで新しいGUIDが割り振られる

1. 片方がImport済みなとき => 新しくImportされるassetのGUIDが変わる
2. 両方が未Importのとき => 両方のGUIDが変わる

注: Unity2018.2.16fでの挙動なので、正確な動作は手元のversionのUnityでご確認ください
VS CodeでC/C++時に参照の検索をする(gtags)

MSが用意したVS Code拡張では、全ての参照が使用出来ない。
gnu global(gtags)を使用して、c++で全ての参照を使用可能にする。

# GNU Globalをインストール

GNU GlobalのHPを参考にして、Ver 6.5以上をインストールする。
https://www.gnu.org/software/global/

## windowsの場合

以下からバイナリファイルをダウンロード
http://adoxa.altervista.org/global/
解答したフォルダを適当な場所に配置
今回は、C:\gnu_global\ 以下に配置するとする。
C:\gnu_global\binへパスを通す。

## ubuntuの場合
https://qiita.com/akegashi/items/042c659c856d2092c443
を参考にして、OSバージョンに合わせてインストールする。

# VS Codeに拡張機能をインストール

以下のC/C++ GNU Global拡張をインストール
https://marketplace.visualstudio.com/items?itemName=jaycetyle.vscode-gnu-global
(C++ Intellisenseの方は設定等いまいちだった)

# C/C++ GNU Global

拡張機能の使い方を設定

## ビルド

`Ctrl`+`Shift`+`P` でコマンドパレットを開き、
`Global: Rebuild Gtags Database`と打つとビルドされる。

## 設定

デフォルトではGTAGSが50MBを超えると自動でrebuildしないので、
`gnuGlobal.autoUpdate`を`enable`に変更

## 使い方

単語を選択して、
`shift`+`F12`や、`shift`+`alt`+`F12`で参照している場所を表示出来る。
UnityのCanvas上に線描画をしてiOSでビルドする

![sample.gif](https://qiita-image-store.s3.amazonaws.com/0/117549/e771eace-ba1d-f45d-1f06-e75090316b6b.gif)


Unityで線描画をする場合いくつか方法があり、[この記事](https://qiita.com/kwst/items/ad61e72562a8bcd9a9f7)が参考になります。
Canvasへの線描画はAsset Storeで有料のライブラリがありますが、今回はAssetsを使わずにCanvasへ表示するための方法を備忘録として書きます。（私が試した方法なので、正攻法ではないかもしれません）

## CanvasのRender Mode
まず、Canvasの設定を**Screen-Scapce Camera**に設定します。
この設定で、3DオブジェクトをCanvas上に配置できるため、擬似的にCanvas上にライン描画ができるようになります。

<img width="284" alt="スクリーンショット 2018-12-05 15.57.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/117549/8d0e73a9-eb8d-8a0d-ca12-a1fe6149f8d7.png">

## 3DのLineRender
基本的にライン描画はLinerenderコンポーネントを使って表示させました。LineRenderは3Dのコンポーネントであるため、2Dのキャンバスとは座標概念が異なっています。そのため、2DのCanvasオブジェクトの3D空間内での座標系を取得し、LineRenderのコンポーネントを追加したGameObjectの座標にその差分を追加します。
一部変更を加えていますが、以下のような形になります。```convertWorldToCanvas```関数でLineRenderにプロットする座標をCanvas上の座標に変換しています。

```csharp

void Start() {
	float radius = 25.0f;
	float lineWidth = .2f;

	int segments = 360;
	string name = "Circle";
	LineRenderer line = createLineRenderer(name, LINE_WIDTH);
	line.useWorldSpace = false;
	line.startWidth = lineWidth;
	line.endWidth = lineWidth;
	line.positionCount = segments + 1;

	int pointCount = segments + 1;
	Vector3[] points = new Vector3[pointCount];

	for (int i = 0; i < pointCount; i++) {
			float rad = Mathf.Deg2Rad * (i * 360f / segments);
			Vector2 point = new Vector2(Mathf.Cos(rad) * radius,  Mathf.Sin(rad) * radius);
			Vector3 vec = convertWorldToCanvas(point, canvas);
			points[i] = vec;
	}

	line.SetPositions(points);
}
private Vector3 convertWorldToCanvas(Vector2 pos, Canvas canvas) {
	RectTransform canvasRect = canvas.GetComponent<RectTransform> ();
	pos.x += canvasRect.transform.position.x;
	pos.y += canvasRect.transform.position.y;
	return new Vector3(pos.x, pos.y, canvasRect.transform.position.z - 10.0f);
}

private LineRenderer createLineRenderer(string name, float width, float offset = 0.0f) {
	GameObject container = new GameObject { name = name };
	LineRenderer line = container.AddComponent<LineRenderer>();
	Color c1 = new Color(0.0f, 1.0f, 0.0f, 1);

	line.material = new Material(Shader.Find("Mobile/Particles/Additive"));
	line.SetColors(c1, c1);
	line.useWorldSpace = false;
	line.startWidth = width + offset;
	line.endWidth = width + offset;
	return line;
}
```


## iOSでビルドするときの注意点
iOSでビルドする際に少しはまった点ですが、LineRenderをスクリプトから生成する際に、マテリアル```Shader.Find("Mobile/Particles/Additive")```を追加しました。その関係か、そのままxcodeプロジェクトをパブリッシュしてから端末にインストールしてもラインが表示されません（私の環境の場合)。デフォルトでは入っていないようなので、以下の設定を加える必要があります。

##### Unity側で追加
1. Edit > project settings > Graphicsでインスペクタを表示
2. **Always Included Shaders**項目でSizeの数を増やして、行を追加する。
3. 空欄に以下のシェーダーを追加する

```  
Mobile/Particles/Additive
```

<img width="504" alt="スクリーンショット 2018-12-05 16.20.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/117549/7aa63e45-155d-0378-ead5-fc5e56b07eb3.png">

## CanvasやuGuiがピンク色になってしまう現象について
- shaderの読み込みがうまくできていない可能性がある。
- graphicのリセットを行うと良い

[こちらの記事](https://blog.naichilab.com/entry/ugui-shader-missing-pink)が参考になります。



<br>
<br>

ソースコードは[github](https://github.com/mitsuyacider/UnityDrawLine)に置いてあります。
SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect integer value:のエラーが出たとき

SQLでこんなふうになっているときに出るエラー。
insert into `t_examples` (`company_id`, `company_name`, `created_at`) values (1, , '2018-12-05');

nullをちゃんと指定すれば直る。
insert into `t_examples` (`company_id`, `company_name`, `created_at`) values (1, null , '2018-12-05');
写真加工する時に更に便利なプラグイン：Camera Rawフィルター




今回の記事は、Camera Rawフィルターというフォトショップのプラグインを紹介します。

Camera Rawフィルターを使って簡単に画像加工できるので是非皆さんお試してみてください。



#Camera Rawフィルターというのは？


Adobe Camera フィルターなら写真を簡単に修正できます。写真を補正するときは、明るさを調整し、青みを抜き、彩度を上げるなどを全部Adobe Camera フィルターで便利に調整をできます。ここでは写真加工に便利な機能をいくつか紹介します。

#Camera Rawフィルターの便利な機能
##１スマートフィルター機能
![1.png](https://qiita-image-store.s3.amazonaws.com/0/314254/d79e68bd-08c5-88cf-01f6-f11f355c139e.png)
![2.png](https://qiita-image-store.s3.amazonaws.com/0/314254/c3001289-7bf2-b806-dada-b495281aeb4f.png)
![3.png](https://qiita-image-store.s3.amazonaws.com/0/314254/da3d763e-9aba-b559-18f8-04592463f125.png)


Camera Rawフィルターのスマートフィルター機能を使うと、元のファイルに変更を加えることなく、写真の彩度、明瞭度、コントラストなどを修正することができます。操作方法は写真をスマートオブジェクトに変更し、プラグインのCamera Rawフィルターを選べることです。



##２、1つの画面で写真を調整できます。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/314254/8cb40b1a-7b03-a917-91d1-b309d9698e12.png)


これまではその作業をトーンカーブ、レベル補正、色相･彩度ウィンドウをそれぞれ開いて補正をしていましたが、PhotoshopのCamera Rawフィルターなら1つの画面で様々な調整をすることが出来ます。

写真加工する時によく使っている「明るさ・コントラスト」や「色相・彩度」、「自然な彩度」、「トーンカーブ」、「シャープ」、「ノイズの低減」などの機能を一つの画面で調整できます。





##3、ターゲット調整ツール
![5.png](https://qiita-image-store.s3.amazonaws.com/0/314254/42af60d4-48e4-f417-778a-a17c6c949dc6.png)

ターゲット調整ツールを使うと指定される色だけを調整できます。ハイライトや露光量などの調節も簡単にできます。操作方法はアイコンをタップし、画像にある特定な色を上下にドラッグすると調節できます。



##4、見比べるのは簡単です

![6.png](https://qiita-image-store.s3.amazonaws.com/0/314254/01aaed21-8245-798f-87b7-2fc6abdc2568.png)

下にある補正前と補正後のビューを切り替えるボタンをクリックすると補正前と補正後を見比べながら編集すると変化が分かりやすいです。



##5、リセットも簡単
![7.png](https://qiita-image-store.s3.amazonaws.com/0/314254/5ecebd22-eb0e-4115-24e5-04925c55b38f.png)


見比べる方法：いつでも、目のアイコンをクリックすると、Camera Rawフィルターでの補正前の状態に戻れます。目のアイコンをクリックしたら簡単に見比べることもできます。
![8.png](https://qiita-image-store.s3.amazonaws.com/0/314254/17f06f46-eadd-4eec-9659-6a83b27a3ccb.png)

再編集する方法：「Camera Raw フィルター」をダブルクリックで再編集することができます。

フィルターを削除する方法：ゴミ箱にドラッグするだけです。



#まとめ
PhotoshopでCamera Rawフィルターを使って簡単な色調補正をできるので興味がある方ぜひ試してください。

Photoshopを使れば使うほど、奥が深いアプリケーションですね。もっと細かい調整の機能があるので、ぜひいろいろお試しください。
Raspberry Piで心拍センサの値を読み取る

初投稿です. 今日からスマブラspが始まるのでこれが最後の投稿になります.
ラズパイで心拍センサの情報を読み取ります.

###準備するもの
* Rapberry Pi 3 Model B
* [心拍センサ](https://www.switch-science.com/catalog/1135/)
* [MCP3008](http://akizukidenshi.com/catalog/g/gI-09485/)(ADコンバータ)
* ブレッドボード
ジャンパワイヤ

###配線
[このサイト](https://tutorials-raspberrypi.com/raspberry-pi-heartbeat-pulse-measuring/)をそのまま使用.

<img src="https://qiita-image-store.s3.amazonaws.com/0/182945/48bdfed7-c293-14a1-1ff6-26bed7c85f0c.png" width=50%>

肝心の心拍センサが映ってなくてすいません...

###SPI
[このサイト](https://qiita.com/f_nishio/items/4b9723c4e622a51aaeb5)の通りpy-spidevをインストールする(ラズパイ上でSPI driverを有効にしておく必要あり).

```console
$ git clone git://github.com/doceme/py-spidev
$ cd py-spidev
$ sudo python setup.py install
```

###サンプルプログラム
以下のPythonファイルを作成．

```python:pulse.py
#!/usr/bin/python
#coding: utf-8
import spidev
import time
import sys

Vref = 3.3
Criteria = 530 

#spiパスへのアクセスを開く
spi = spidev.SpiDev()
spi.open(0,0)
spi.max_speed_hz =  1350000

adc_channel = 0
delay = 0.01

f = open('pulse.dat', 'w')
pulse = 0
digital = 0.0
index = 0

#ADコンバータからSPIデータの読み込み
def ReadChannel(channel):
    adc = spi.xfer2([1, (8+channel)<<4, 0])
    data = ((adc[1]&3)<<8) + adc[2]
    return data

try:
    while True:
        #心拍センサの値読み取り
        analog_level = ReadChannel(adc_channel)
        
        #値がいったん基準を超え、次に基準を下回った瞬間に"pulse"を出力
        if(analog_level == 0):
            time.sleep(delay)
            continue

        if((analog_level < Criteria) and (pulse == 1)):
            print("Pulse")
           
        if (analog_level < Criteria):
            pulse = 0
        else:
            pulse = 1

        #値を電圧[V]に変換
        digital = analog_level * Vref / float(1023)
        
        data = "{} {} {} \n".format(index, analog_level, digital)
        f.write(data)
        time.sleep(delay)
        index += 1

except KeyboardInterrupt:
    print("Exit")
    f.close()
```
コマンドプロンプトで実行. 拍動に合わせて"Pulse"と出力されれば成功です.
datファイルに書き込んでいますが今回は使用していません.

```console
$ python pulse.py
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/182945/4c59e095-f82b-8477-0688-6a185f0e2ad4.png" width=80%>
ちょうど緑の丸のタイミングで"Pulse"と出力されるイメージです
※この写真はイメージであり今回ラズパイを使って出したグラフではありません(別のタイミングでArduinoでとったデータから作成したグラフです)

###補足
先ほどのpulse.pyで書いた以下の文

```python
spi.max_speed_hz =  1350000
```
最初はこれを書かずに実行するとMCP3008から値が読み取れませんでした. [こちらのサイト](https://www.raspberrypi.org/forums/viewtopic.php?t=115971)を読み上の文を付け加えると上手く値を読み取ることができましたが, 読み取れなかった原因は不明です. 

```python
data = ((adc[1]&3)<<8) + adc[2]
```

この謎の文の意味については[こちらのサイト](https://hack-le.com/47361017-2/)に詳しく書かれています. ADコンバータを用いる際に頻繁に出てくるコードなので勉強になりました.
KPIを見易くするために頑張った話

# Cluster,Inc. Advent Calendar 2018、5日目の記事です。
クラスター社ではOKRを定めて仕事を進めていて，KR(Key Result)を主にRedashでまとめて見れるようにしています．
どういう数値(グラフ)の見せ方をすれば勘違いや誤解が生まれないかを模索しながら改善していった記録を紹介します．

# 1. とりあえず実績値をそのまま見せる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18974/1356ef82-93c1-a866-e6b5-b9b834e8ee74.png)

- まぁとりあえず．．．という感じ
- OKRでは3ヶ月程度の期間を通してKRを追うため，実績だけ見せられても微妙だった
    - 目標にどれだけ足りないのか? あとどれぐらい期間があるのか? などがパッと判断できない

SQLをがんばって，x軸をOKRの期間に，y軸をKRの目標数値に固定することもできましたが，**KRはストレッチゴールを置く**という制約とあいまって期間の最初のほうは実績値が小さすぎになり何もワカラン．．．というグラフができたりしましたので却下😔

という感じだったので次

# 2. 予測線を出してみる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18974/57abf0e1-e835-8d69-f370-5c14cc90d421.png)

実際にSlackに投げられた画像です．

- 単純に線形回帰してみただけですが，この期間だと順当にいけばここまでか〜，みたいなのが見易くなりました
- あくまで<font color=red>赤は予測線</font>，<font color=blue>青は実績値</font>だったのですが，**赤線の通りに進んでるからOK**(実績値から引いてるので当然そうなる)という見方をする人が出てきてしまいました

というわけでこれもイマイチだったねということで次

## 余談：Redashで線形回帰する小技
RedashはSQLを書くしかないので，素直にやるなら線形回帰の式をSQLで書くことになります．
ただどう考えても面倒だったので，Google Spreadsheetと連携する形で実現することにしました．

### Redashで元ネタを生成する
単純に実績値だけを取るクエリを書きます．
できたら実行／保存して，結果をCSVで取れるURLをコピっておきます．また，自動更新をONに(更新間隔は適宜)しておきます．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18974/bf3c8295-5b6b-9836-1125-44995a14c018.png)


### Redashのクエリ結果(CSV)をGoogle Spreadsheetに取り込む
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18974/e036a44b-3b8e-c259-2a74-ffc731cee7e2.png)

Spredsheetの`importdata`関数[^id]で外部のCSVを取り込めるのでサッと取りこみます．
あとは [LINEST関数](https://support.google.com/docs/answer/3094249?hl=ja) でえいやっと傾きと切片を求めておきます．

あとは別シート(※後述)で，求めたパラメータをもとに期間内の各日付における予測値を算出しておきます．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18974/751a4fb7-427c-b6ba-710c-0369b67da764.png)

### Google SpreadsheetをRedashに取り込む
ここまでで，実績値と，それを使った線形回帰による期間内の予測値が手に入ったので，今度はそれをRedashに持ってきます．

データソースとしてGoogle Spreadsheetを追加 + 上で作ったSpreadsheetの共有設定にRedashを追加(GCPのService Accountの設定が必要)したうえで，
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18974/0d1bcaa7-f6b2-6495-b2a8-0371533a1573.png)

とすると，SpreadsheetのデータがRedashで見れるようになり，エイヤッとまとめてグラフにすると，実績値と線形回帰の結果をいい感じに同時に表示できるようになります．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/18974/7497a3ba-e0b2-102f-f84e-1208a6dd3782.png)

ちょっと回り道感はありますが，SQLで頑張りすぎる必要がなくなるのと，グラフ化や通知は(Redashのbotを使ってるのもありますが)再利用できて，むしろメンテナンスはしやすくなりました(当社比)

# 3. 現実との乖離を分かりやすくする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18974/82952240-a59e-1719-436c-40501983d59d.png)

2で作ったシートに，$(目標数値 - 実績値) / 日数$から計算される目標値を追加しました．
ここまでやると，**現実と目標数値にはだいぶ乖離があること**が一目瞭然になり，このグラフを見て誤解を生むことは概ね無くなった気がします．(目標が高すぎたのはまた別の話．．．😇)

# まとめ
- 毎日見る数値／グラフはその意味がパッと見で把握できるようになっていると説明の手間なども無くなって捗る
- SQLだけで頑張らず，ツールごとの得意分野を組み合わせて使と捗る

[^id]: `importdata`は1時間1回ぐらいの頻度で勝手に取りにいってくれる(閉じていても大丈夫)ようです．
Pycharmで「QStandardPaths: XDG_RUNTIME_DIR points to ... 0700 permissions.」というエラーが出たときの対処法

# 起こったこと & したこと
Ubuntu & PycharmでCNNしようとしたらこんなエラーが。

```
QStandardPaths: XDG_RUNTIME_DIR points to non-existing path'/run/user/1000/snap.pycharm-community', please create it with 0700 permissions.
```
どうやらXDG_RUNTIME_DIRというのが/run/user/1000にあるはずのsnap.pycharm-communityを示してるけどないらしい。（適当）0700権限で作ってね、らしいので作る。

```
cd /run/user/1000
mkdir snap.pycharm-community
chmod 700 snap.pycharm-community
```

このあと起動したら大丈夫でした。
14: curl#7 ではまった件 - CentOS7

yumを実行すると、

14: curl#7 - "Failed to connect to 2001:4178:5:200::10: ネットワークに届きません"

みたいにでてはまった件について、メモしておく。

ipv6　で通信しているからとか、

DNS が！

とか色々情報が書かれているが、自分の場合 proxy に原因があった。


```
export http_proxy="http://＜プロキシのIPアドレス＞:＜プロキシのポート＞/"
export https_proxy="http://＜プロキシのIPアドレス＞:＜プロキシのポート＞/"
export ftp_proxy="http://＜プロキシのIPアドレス＞:＜プロキシのポート＞/"
```

で追加。

```
export
```

で追加されたことを確認する。

とりあえず、yum を実行すると

解決した！！！


直接ファイルに書き込む場合は↓
[CentOSのCUIでProxyを使う方法いろいろ](https://qiita.com/hirohiro77/items/cdf6d8baa619c0e0e82d)
PHP formを使ってページの更新   備忘録

##やりたいこと
Fromを用いて、データを送信しページを更新

##Viewの設定
``` home.php
<form action="<?php echo base_url() ?>クラス名/関数名"  class="float-right" method="POST">
	<select name="period">
		<option value="30m" >30分後</option>
		<option value="1h" selected>１時間後</option>
		<option value="tomorrow">明日</option>
	</select>
	<input type = "submit" value ="更新">
</form>

```

##controllerの設定
今回は、部分更新をするのでデータの更新を行ったら、元のページに戻りため、controllerのindex関数を呼びます。
後々こっちのほうが便利かもしれない。

```Home.php

public function 関数名(){
	$selected = $_POST['period'];
	if ($selected == '30m') {
	        $period = '30分後';
	}elseif ($selected == '1h') {
	      $period = '1時間後';
	}elseif ($selected == 'tomorrow') {
	      $period = '明日';
	}
	$this ->index($period);
}
```
FPGA の評価ボードを選ぶ

# FPGA の評価ボードを選ぶ
どういった評価ボードを選んだらいいでしょう？ターゲットは FPGA に慣れ親しんでいない人がターゲットです。それには将来、何をしたいか？どこを目指すのかを考えるといいと思います。

1. とにかく FPGA を触ってみたい
2. 将来 ARM も含めた SoC から FPGA を使いたい

なお、ここで紹介するのはあくまで私個人の偏った環境からの選択です。いろいろなチップやツールを使ってみた感想では、特別に使いやすい、使いにくいというは今までありません。手元にもし FPGA があるなら、新たに買いなおす必要あありません。それを使いこなすようにするのがいいと思います。


## とにかく FPGA を触ってみたいなら
FPGA ってなんだろう？とお試ししたいのであれば CPU が入っていない安価なボードを購入するのがよいと思います。ARM などの CPU が入っていると開発として FPGA 上の回路を動かすのにソフトウェアの起動が必要になったりします。その場合、複数のツールを行ったり来たりしなければならなくなり、長年それらのツールに携わっていないとまず確実に躓くでしょう。特に ARM の 64bit は複雑なので要注意です。

ツールもできればなるべく最新のものが使える環境がよいでしょう。Windows 7 あたりで更新が止まっているツールは使わない方が無難です。

FPGA に搭載可能なロジック数はあまり気にしなくてよいと思います。各社ばらばらの基準ですし、いまさらトランジスタ数換算しても意味はないでしょう。懐具合と相談して安価なものを使うのがいいと思います。1万円を切るものでも用途によっては十分です。事前に Web で検索して情報が多いものを選ぶとよいでしょう。

「将来 ARM も含めた SoC から FPGA を使いたい」と思っていてもまずは FPGA 単体のものをお勧めします。ただ、私が確認済みというものが少ないのが（この記事の）現状です。

## 動作確認済み FPGA 
手元にあって動作確認済みの FPGA 評価基板を列挙してみましょう。URL は参考です。そこから購入することをお勧めするわけでありません。

### ICE40UP5K-B-EVN 
https://www.digikey.jp/product-detail/ja/lattice-semiconductor-corporation/ICE40UP5K-B-EVN/220-2134-ND/6596291

個人的には Lattice はお勧めです。価格も手ごろです。全体的に情報が少ないのが難点です。Lattice が用意するツールはシンプルで使い勝手も悪くありません。

### PERIDOTボード
https://peridotcraft.buyshop.jp/items/2126611

詳細はこちら(とウェブページに書いてある)
https://github.com/osafune/peridot

時間があったら今回このボード対応をしてみます。（手元にボードはあるのだが、、、)

## ARM + FPGA
ARM が入っているボードはある意味、ARM もソフトもやらなければならなくなるので FPGA という意味ではちょっと敷居が高くなります。ただ、情報が多いことも事実で Linux + FPGA で頑張りたいというならこの選択肢は有効です。

ikwzm さんが FPGA-SoC-Linux と銘打ってバイナリまで提供してくれるので、これにのっかるのが楽かもしれません。
https://github.com/ikwzm/FPGA-SoC-Linux

ソフトウェアとして Python を扱いたいなら Linux は必須だと思うので、その場合は Zynq を搭載したものが情報量も多いのでよい選択肢になるでしょう。

### ZYBO-Z7 
http://akizukidenshi.com/catalog/g/gM-12552/
http://akizukidenshi.com/catalog/g/gM-12553/

7010 ベースのものと 7020 ベースのものがあるので注意。7020 の方がロジックの容量(?)が大きい。MIPI 用のインタフェースがあるのが特徴。

### DE0-Nano-SoC
https://www.marutsu.co.jp/pc/i/595199/

情報が少ないかも。価格的には魅力。DE10-Nano というのもあるらしい。

### CORA Z7 
http://akizukidenshi.com/catalog/g/gM-13489/
チップが 7007 なのでロジックスライスが少なめ。
購入したばかりなのでまだ実験してません。
7010 版もあります。

### その他
もし Zybo とか ZedBoard とか持っていればそれも使えます。もちろん、各メーカ純正などのお高いボードでもいいでしょう。使っている環境があればそれを利用するのが一番です。

# 検索してみた

入手性がよさそうなボードをピックアップしてみます(FPGA 通販で検索しました)。ピックアップしただけでいずれも手元にあるわけではありません。使うのにどれだけ大変かはこちらでは確認してません。

### ARTY S7 
http://akizukidenshi.com/catalog/g/gM-12558/
Spartan-7 なので大丈夫でしょう（たぶん）。同じ Spartan でも 6 や 3 などの古めのチップを搭載した評価ボードもいろんなところでちらほら見受けられますが、使ったことがある人以外はお勧めしません。古いチップは細心のツールで対応していないこともあり、古い環境をそろえるのも大変だったりします。

### ARTY A7
http://akizukidenshi.com/catalog/g/gM-10034/
Artix なので大丈夫でしょう。

### MAX10 関連
http://select.marutsu.co.jp/list/detail.php?id=253

### Cyclone10 LP評価キット
https://www.marutsu.co.jp/pc/i/1003761/
2017 発表とある

### DE0-NANO
https://www.marutsu.co.jp/pc/i/557709/
買った記憶があるようなないような、、、あとで家探ししてみよう。
Cyclone IV だとちょっと古めか？

### DE0-CV
https://www.marutsu.co.jp/pc/i/557615/
ちょっと高めのお値段

### ICE40HX1K-STICK-EVN 
https://www.digikey.jp/product-detail/ja/lattice-semiconductor-corporation/ICE40HX1K-STICK-EVN/220-2656-ND/4289604
時間と金があればこれに対応したい。価格自体は安い。

###  HIMAX HM01B0 
https://www.digikey.jp/product-detail/ja/lattice-semiconductor-corporation/HM01B0-UPD-EVN/220-2226-ND/9759580
カメラがついている?(当方未確認)
Elm SPA テンプレートを作った 2

**WARNING: This article is outdated and not maintained anymore.**

前半: [Elm SPA テンプレートを作った 1](https://qiita.com/kawauso7/items/daed519ec3a1d3e3555d)
[elm-my-spa](https://github.com/kawausokun/elm-my-spa) の解説を続けます。

## 全てのページで使用するデータの保持方法

例えばセッション情報。ログインユーザデータ、言語設定、 Ports から受け取った何らかのデータ。これらはどのページでも必要ですが、全体で共有すべきものです。どう保持したら良いでしょうか。

もう一度 Main の Model を見てみます。

```elm:Main.elm
type Model
    = NotFound Env
    | Index Env IndexPage.Model
    | View Env Id ViewPage.Model
```

各ページを表現していて、どのページを表示するか判断するのに使用しています。こいつに Env というモデルを渡しています。これが共有データ保管場所として機能しています。

```elm:Env.elm
type Env
    = Env Internals


type alias Internals =
    { key : Nav.Key
    }


create : Nav.Key -> Env
create key =
    Env (Internals key)


navKey : Env -> Nav.Key
navKey (Env internals) =
    internals.key
```

共有データを増やしたい場合は、 Internals にいくらでも突っ込めば良いんです。
`Main.elm` 内を env で検索すると、 Model の初期化時、Model の変更（ページ切り替え）時に、各ページの init 関数に Env を渡し、常に引き回していることが分かるかと思います。

## まとめ

以上で [elm-my-spa](https://github.com/kawausokun/elm-my-spa) の解説を終わります。
今後もうちょっと拡張して、何かしらの API を叩くことで Http くらいは加えようかと思います。
BigQueryの監査ログ(audit logs)をCLIでBigQueryにsinkする方法

gcloudコマンドで実行出来る

```
# 監査ログを取りたいプロジェクトに切り替え
gcloud config set project プロジェクト名

# sinkを作成
gcloud logging sinks create bigquery_audit_logs bigquery.googleapis.com/projects/プロジェクト名/datasets/データセット名  --log-filter='resource.type="bigquery_resource"'
```
Django+ngrokでtwitter認証 〜Callback URLの設定〜

callback URL、ちゃんと設定できていると思っていたらできていなかった話です。

#開発環境
* Python==3.6.4
* Django==2.0.6
* social-auth-app-django==3.1.0
* ngrok==2.2.8

#現象
403エラーが発生し、ツイッター認証ができない。

#悩む
twitter　OAuth認証時にコールバックURLを正しく設定しなければいけない。
参考：[DjangoでTwitter認証アプリケーションを[2018/06最新版]](https://qiita.com/Kyou13/items/713a878065df82a0ecc3)
や
参考：[Twitter login not working(stackoverflow)](https://github.com/python-social-auth/social-app-django/issues/164)
などを参考にし、闇雲にコールバックURLを設定してみたんですが、ローカルではOKなのにngrokでみたときにだめだったので…まとめました。

#Callback URLって？
そもそも、Callback URLとは、連携が成功したときに帰ってくるURLです。
いろんなサイトでとりあえずダミーいれとけ！みたいになっているようですが、ちゃんと設定してやる必要があるみたい。

#Developerサイトのドキュメントをみる
[ここ](https://developer.twitter.com/en/docs/basics/developer-portal/guides/callback-urls.html)にちょっぴりかいてあります。
<img width="780" alt="スクリーンショット 2018-12-05 15.37.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/192887/bd8bd3fd-a8bc-e12b-ba82-572115cd221c.png">
localhostはだめっぽい。

#URLの設定
とりあえず、以下のように設定してみた
`http://127.0.0.1:8000/user/complete/twitter/`
動いた！！！！！

#ngrokで確認
ngrokは、ローカルで立ち上げたやつを外部からアクセスできるようになる、とっても優秀なやつです。

やってみる。
`http://a509a195.ngrok.io/complete/twitter/`

うごかない………

#ngrokで動くように試行錯誤
ここで気づく。
そもそもHOSTが許されていないのでは？？？
(http://a509a195.ngrok.ioのドメインのところは、乱数が起動の度に変わります)

###ALLOWED_HOSTS
```setting.py
(略)
ALLOWED_HOSTS=['localhost', '127.0.0.1', 'a509a195']
(略)
```
とするか、

```setting.py
(略)
ALLOWED_HOSTS=['*']
(略)
```
ワイルドカードでもOKみたいです。
とりあえず、HOSTの壁はクリア。

###user/

projectのurls.pyをみると、OAuth機能は　`user/`で渡しているじゃないか！
<img width="616" alt="スクリーンショット 2018-12-05 15.49.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/192887/a4ad346e-3d64-e2fb-8825-fe2820193e9b.png">
よくよく見直すと、developerで設定したCallbackURLに`user`抜けているし！

というわけで
`http://a509a195.ngrok.io/complete/twitter/`
↓
`http://a509a195.ngrok.io/user/complete/twitter/`
に変更。

うごいた……


簡単なことなのに、長いことハマってしまった話でした。
C++ Builder XE4 > FastReport > 手順: ボタンを押したらPDFを生成する > Error: クラスTfrxChartViewが見つかりません. > 対処

```txt:動作環境
C++ Builder XE4
FastReport VCL5
```

### 概要

FastReportを使いPDFを出力するまでの手順.
(2013-08-29の自分のEvernoteメモを参考に再構成)

FastReportはXE4の付属品ではなくFastReport VCL5を使用。
手順そのものはFastReport VCL 4でも変わらないと思われる。

### 手順

1. フォームにTfrxPDFExportを追加 (追加されたコンポーネント名: frxPDFExport1)
2. フォームにTfrxReportを追加 (追加されたコンポーネント名: frxReport1)
3. フォームにTButtonを追加 (Button1)
4. Button1クリックイベントに下記の実装をする。

```cpp
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	frxPDFExport1->FileName = L"test.pdf";
	frxPDFExport1->ShowDialog = true;
	frxPDFExport1->Quality = 100;
	frxReport1->PrepareReport(/* clearLastReport= */true);
	frxReport1->Export(frxPDFExport1);
}
```

`5. frxReport1をダブルクリックしてリポートのデザイン画面に移る

![2018-12-05_15h45_13.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b85afc3c-00d7-5d1f-1799-835ac3cbaac7.png)

`6. リポートのデザイン画面にて左のアイコンの「グラフオブジェクト」を追加する。小さいので大きくする

![2018-12-05_15h47_51.png](https://qiita-image-store.s3.amazonaws.com/0/32870/69091e6a-9941-5dc4-e665-b2d5dc818288.png)

`7. **保存をせずに**リポートのデザイン画面を閉じる

以上

### 実行

ビルドして、実行すると以下のエラーとなった。

![2018-12-05_15h49_01.png](https://qiita-image-store.s3.amazonaws.com/0/32870/2627bd30-2d80-a437-1dd4-f48565d1ef48.png)

> クラスTfrxChartViewが見つかりません.

対処方法は下記に記載の通り「TfrxChartObject」をフォームに追加する。
[Mamの覚書Q & A検索](http://mam-mam.net/mytech/show.php?cd=268)

情報感謝です。

下記はTfrxChartObjectも追加した後の状態です。
![2018-12-05_15h51_42.png](https://qiita-image-store.s3.amazonaws.com/0/32870/62165092-945b-a850-862d-13e09bdea640.png)

### エラー対処後の実行

再度ビルドして実行した。

Button1押下後
![2018-12-05_15h53_05.png](https://qiita-image-store.s3.amazonaws.com/0/32870/216eb3b7-5445-a7e6-6f1c-f38511e7d8ca.png)

OKを押した後に保存先を指定するとtest.pdfが生成される。


下記はPDFビューワソフト(PDF-XChange Viewer)で見た状態
![2018-12-05_15h54_00.png](https://qiita-image-store.s3.amazonaws.com/0/32870/82bcd65a-1395-a80f-c27f-9a13c0ba1d70.png)
Dockerのツールを紹介

[Docker Advent Calendar](https://qiita.com/advent-calendar/2018/docker) 15日目の記事です。

こんにちわ

Dockerの使い方や仕組みについての記事が多い中で、
Dockerの便利ツールに関する記事があまりないのでこれを機に調べたモノも含めて紹介していきます。
項目にそれぞれリンク貼ってありますので詳細を知りたい方は見てみてください。

# [dive](https://github.com/wagoodman/dive)
イメージのレイヤーの差分やコンテンツなどを確認できる。
ダイエット分析時に使用すると良い様子。

![demo.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/665376cf-ea64-b033-2ea8-b87aa30ffad5.gif)

# [dry](https://github.com/moncho/dry)
dockerとdocker swarmを管理できる
イメージなどの情報を確認できるが、コンテナの作成はできない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/743ce1a1-0178-7662-4b73-1eb6d2a58a0a.png)

# [docker-slim](https://github.com/docker-slim/docker-slim)
dockerイメージのダイエットツール。
圧縮率がすごい。
試しに自作ツールを圧縮してみたが、圧縮後動かなかったのでやり方が間違っているかも…

[![asciicast](https://asciinema.org/a/czxJahFcUHWCGKVWzT7LDpVdE.svg)](https://asciinema.org/a/czxJahFcUHWCGKVWzT7LDpVdE)

# [ctop](https://github.com/bcicen/ctop)
コンテナのリソースをモニタリングできるツール。
topと似ている感じ。
コンテナごとのリソースを確認するのにとても便利。

![grid.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/cf749a40-1c2f-96af-4a77-0a7f2a3e476e.gif)

# [dext-docker-registry-plugin](https://github.com/vutran/dext-docker-registry-plugin)
[dext](https://github.com/DextApp/dext)のdockerプラグイン。
Macのスポットライトの様にリポジトリを検索できる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/66178/67437ad8-f195-3f83-dcb0-59ad9938e92f.png)

# [docui](https://github.com/skanehira/docui)
ぼく製Dockerのcui管理ツール。
まだ未完成だけど、コンテナの作成・削除などができる。
ゆるく一緒に作ってくれる方探し中。

[![asciicast](https://asciinema.org/a/212109.svg)](https://asciinema.org/a/212109)

# [docker-compose-ui](https://github.com/francescou/docker-compose-ui)
docker-composeのウェブアプリ版。
プロジェクトごとに管理が可能なので、複数のプロジェクトを管理する場合はおすすめ。

![docker-compose-ui.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/cfebf2ee-56b4-33a9-a12d-2bfef32ae6fe.gif)

# [awesome docker](https://github.com/veggiemonk/awesome-docker)
dockerに関するawesomeなツールやTipsが紹介されています。

紹介されているライブラリでは一部メンテされてなかったり、一部自分の環境ではうまく動かなかったりしますが、
いまでも使えるモノもありますので、もっと知りたい方はぜひ見てください。
ツクールMVでスキルの表示・非表示を切り替えるプラグイン

（β版です）

RPGツクールMVで、アクターに沢山のスキルを覚えさせると、その習得数やプレイヤーによっては選ぶ手間を強いられます。
このプラグインを使用することで、「絶対に使わないスキル」をオフにし、スキル欄を整理することが出来ます。

![sshot.jpg](https://qiita-image-store.s3.amazonaws.com/0/180923/d4ea223d-f965-8c2b-b6d2-4be2313bc9a1.jpeg)

# 仕組み
スキル習得と同時に、アイテム欄に「オン用アイテム」が追加されます。
スキルをオフにすると、スキルを忘れ、アイテム欄のオン用アイテムが削除され、かわりにオフ用アイテムが追加されます。
スキルをオンにすると、スキルを覚え、アイテム欄のオフ用アイテムが削除され、かわりにオン用アイテムが追加されます。
本プラグインでは、この仕組みを利用して、スキルの表示可否を切り替えています。

# プラグインの導入

1) SkillSwitch.jsをpluginsフォルダに入れ、ONにしてくだささい。

2) パラメータ Skill_actorIDに、この機能を使用するアクターIDを入力します。
ID1から3までのキャラに機能を使用する場合は
1,2,3
という形で入力します。

3) バラメータ Skill_ItemType に任意の数値を入力します。
隠しアイテムAを使用する場合は　　3　です。


◆ スキル欄への設定
スキルのメモ欄に
&lt;skillitem:オン用アイテムID&gt;
を入力
例) そのスキルをオンにするためのオン用アイテムのIDが10の時は &lt;skillitem:10&gt;

◆ アイテム欄への設定
オン用のアイテムのメモ欄に
&lt;skillon:スキルID,覚えるアクターID&gt;
を入力（範囲は「なし」）
例) スキルID:4のスキルをアクターID1が覚える &lt;skillon:4,1&gt;

オフ用のアイテムのメモ欄に
&lt;skilloff:スキルID,覚えるアクターID&gt;
を入力（範囲は「なし」）
例) スキルID:4のスキルをアクターID1が忘れる &lt;skilloff:4,1&gt;

**※注　オン用アイテムの次のIDは必ずそのスキルのオフ用アイテムであること**
例) 
アイテムID1　スキルAのオン用アイテム
アイテムID2　スキルAのオン用アイテム
アイテムID5　スキルBのオン用アイテム
アイテムID6　スキルBのオフ用アイテム

◆ スキル表示可否画面の呼び出し
スクリプトで
SceneManager.push(Scene_ItemMagic)
を実行

----

サンプルプロジェクトは以下からダウンロードしてください。
［サンプルプロジェクト:http://aokikotori.com/plugin/SkillSwitch.zip ］

Javascriptプラグインは以下からダウンロードしてください。
［プラグイン:http://aokikotori.com/plugin/SkillSwitch.js ］
お名前.comからRoute53へjpドメインを移管した

ドメイン移行することってありますよね。しかもjpドメインって特殊だったのでせっかくなのでメモがてら書き起こしておきたいと思います。

# はじめに
今回、お名前.comで取得していた、xxxx.jpのドメイン更新がきましたので、せっかくなので Route53に移行することにしました。めったにないのでワクワクしながら手続きをしました。

# jpドメインはAuthCode(オースコード)がない
てっきり、AuthCodeを使って、移行元と移行先でやり取りが行われると思いこんでいたもので迷ってしまいました。お名前.comへお問い合わせして、jpドメインはそのような手続きがないことがわかりました。感謝。

# jpドメインはRoute53だと結構なお値段だった
私たちが管理しているxxxx.jpドメインはお名前.comは3000円前後でした。Route53だとその3倍くらいしました。関税？？

# 大事なメールが何回か届くので見逃さないようにする必要がある
移行元と移行先から、結構大事なメールが沢山きたので、ちょうど流れも理解しやすいので、列挙します。
 
## 「Certificate approval for xxxx.jp」
Route53でドメインを購入したあとに @domainnameverification.net　から届く「申請しましたよね？」っていう感じの英語のメール。承認を求められるので承認サイト用のURLから承認すると購入手続きは進捗中になりました。ドメイン購入時にはjpドメイン特有の移行条件(もろもろ60日たっているかなど)がありそれのチェックはRoute53でやってくれたので楽ですね。

## 「Transfer confirmation for the domain」
その後に @wixi.jp から届く「移行手続き進めますね？」という感じの日本語のメール。承認を求められるので承認サイト用のURLから承認すると移行手続きが次に進みます。

## 「【重要】トランスファー申請に関する確認のご連絡 xxxx.jp」
しばらくすると 　@onamae.com　(お名前.com) から届く「あなたの申請はここまできましたよ」というような感じの日本語のメール。承認を求められるので承認サイト用のURLから承認を求められるので承認用URLから承認を実施すると上位レジストリへの手続きへと進みます。目印としては、お名前.comのポータルでは「他社への移管状況確認」とうところが「レジストリ（上位機関）への承認処理待ち」というステータスにかわりました。

## 「トランスファー申請承認のご連絡 xxxx.jp」
その後に 　@onamae.com　(お名前.com) から届く「上位レジストリからへの申請は無事完了しましたよ(もうお名前.comではなにもできませんからね)」というような日本語のメール。無事ドメイン移管が完了する。目印としては、お名前.comのポータルでは「他社への移管状況確認」とうところが「他社へのドメイン移管完了」というステータスにかわり、ドメイン一覧からもきれいに見えなくなました。ようやく終わった感がでてきましたが、Route53では「Pending Request」にまだ溜まっている(step 7 of 14」くらいのまま)のでもやもやは続きました。と思いきや、しばらくするとRoute53でも「Registered domains」にステータス移動していました。スッキリ！！

## おわりに
本ブログ記事が、なにかのヒントになれば幸いです。なお、Whoisに登録されているメールアドレスが別のエンジニアだったので、どれくらいのスピード感で進んで行くかは割愛いたしました。

# 参考
* https://dev.classmethod.jp/cloud/aws/onamae-to-route53/

以上
[NVIDIA] AIを駆使したバーチャル空間の生成

#　NVIDIAとは
NVIDIA Corporationはアメリカ合衆国カリフォルニア州サンタクララに拠点を構える半導体メーカー。コンピュータのグラフィックス処理や演算処理の高速化を主な目的とするGPUを開発し販売している。
NVIDIAは「AIコンピューティンングカンパニー」として今日世界に40箇所以上の拠点をもち、研究開発を行なっている。

#　今回の技術
2018年12月3日にNVIDIA Developerの発表で深層学習を用いた現実空間を元に、3Dの仮想空間を自動生成する技術を発表した。
これまでは動画を画像処理して、その空間を生成する技術には人的リソースを用いて設計を行なっていたが、データとなる動画を自動処理して実際の3D空間を生成し、その中で活動などが可能な空間を生成できるようになる。この技術によって、仮想空間開発のコスト削減が大幅に可能となると共に、仮想空間の生成を行うことへの技術的障壁もかなり小さくなると考えられる。

#　将来に与える影響
VR空間を利用したゲームやアプリ開発が大きく進むようになるのではないかと思われる。またアバターなどを用いた技術なども画像処理技術の向上によって、進歩が進みより世の中の人々が仮想空間への関心を産みやすい環境が整えられていくと考えられる。
rails where の落とし穴

#はじめに
 自分が引っかかってしまったので、将来見返すようにメモ。
#whereメソッド
ご存知の通り、whereメソッドは条件に合うモデルを複数取得したい場合によく使われます。
#今回起こったこと
今回の自分の事例では、条件に合うモデルを探してあったらif文実行、なかったらif文を飛ばすというものです。以下コードです。Userモデルにはhoge、hogehogeカラムがあるとします。

``` ruby
if users = User.where(hoge: hoge1)
   user = users.first
   if user.hogehoge < 10
            .
            .
            .
            .
   end
end
```
いざ実行してみると`undefined method 'hoge' for nil:NilClass`.
なんでだーと思ったら単純な勘違いでした。

#whereメソッドの働き
自分の勘違いで、whereメソッドが何も見つけなかったら`nil`を返すと思っていました。しかし実は`中身が空っぽのActiveRecord::Relationオブジェクト`を返すのでした。中身は空だけど、入れ物は入っているからnilじゃないよ的な...。だから最初のif文が実行されてしまいます。
#題名のエラー処理
上記より中身が存在しているか存在してないかを条件に持って来れば良いので

``` ruby
users = User.where(hoge: hoge1)
if users.present?
   user = users.first
   if user.hogehoge < 10
            .
            .
            .
            .
   end
end
```

これで解決。

#終わり
最近細かい勘違いのせいで時間が取られている気がする。この前だって学校のサーバーでつなげていることを忘れて、自分のwebアプリをいろいろいじろうとしたらエラーが出てかなり悩んだし。。
丁寧にやることって大事。
phpプログラムの構文チェックをalias登録

# はじめに
phpの構文チェック、phpcsなどを入れて本格的にチェックしたい場合もあるでしょうが、とりあえずローカルとかでもちょこっとだけやっておきたいときってありますよね。
そんなときの小ネタです。

# 単一phpファイルの構文チェック
実は単一のファイルに対するphpの構文チェックは `php -l [ターゲットファイル]` で実施できます。

```bash
# php -l example.php
No syntax errors detected in example.php
```

# ディレクトリ全体の構文チェック1
では、特定のディレクトリの下を全部チェックしたい場合はfindと組み合わせれば再帰的にチェックしてくれます。

```bash
$ find ./ -name "*.php" | xargs -n1 php -l
No syntax errors detected in ./example1.php
No syntax errors detected in ./example2.php
No syntax errors detected in ./example3.php
No syntax errors detected in ./dir1/example1.php
No syntax errors detected in ./dir1/example2.php
No syntax errors detected in ./dir1/example3.php
No syntax errors detected in ./dir2/example1.php
No syntax errors detected in ./dir2/example2.php
PHP Parse error:  syntax error, unexpected '{' in ./dir2/example3.php on line 14
Errors parsing ./dir2/example3.php
xargs: php: exited with status 255; aborting
```
途中でどこかエラーがあったら止まりますが、少し出力内容が多いので邪魔ですね。

# ディレクトリ全体の構文チェック2

成功した行を捨ててしまいましょう。

```bash
$ find ./ -name "*.php" | xargs -n1 php -l > /dev/null
PHP Parse error:  syntax error, unexpected '{' in ./dir2/example3.php on line 14
Errors parsing ./dir2/example3.php
xargs: php: exited with status 255; aborting
```

# aliasに登録しておこう
ついでにこれを.bashrcなどにalias登録しておきましょう。

``` bash:.bashrc
～中略～
alias phplint='find ./ -name "*.php" | xargs -n1 php -l > /dev/null' 
```

``` bash
$ phplint
PHP Parse error:  syntax error, unexpected '{' in ./dir2/example3.php on line 14
Errors parsing ./dir2/example3.php
xargs: php: exited with status 255; aborting
```

便利ですね。

もちろん、同様のaliasを登録しておけばphp以外でも各種言語で簡単に手元でのチェックができるようになります。
[GitHub] PRを投げたあとにベースのブランチが更新されたのに、「Update Branch」ボタンが表示されないとき

![Screen Shot 2018-12-05 at 15.22.16.png](https://qiita-image-store.s3.amazonaws.com/0/109241/78006b09-97f1-fc94-1d78-a42d75f38d52.png)

こういうやつ。
おかしいな...

## ブランチごとにステータスチェックの設定が必要らしい
この「PRブランチがベースブランチに対して最新になっているかどうかのチェックを行う」という **Required Status** という機能は Protected Branchのみで利用できる機能らしく、ブランチごとの設定が必要。

今までは設定がOnになっていたのに...と思ったら、masterブランチではOnになっていて今回のPRを出したベースブランチの設定ではOffになっていた。

### 設定する場所

![Screen Shot 2018-12-05 at 15.28.29.png](https://qiita-image-store.s3.amazonaws.com/0/109241/b0788861-8553-1e7b-7803-024a9c64aca7.png)

の Branch protection rules でできるようです。

## 参考記事
https://thinkit.co.jp/article/8425
QSグループは何をしているのか？

## QSとは
- Quality Supportの略
- 製品開発／改善時の「サービス品質」を担保するサポート部隊

## QSグループのミッション
- 導入店様からのお問合せ件数を減らす
- 正しい情報を社内社外に展開する
- 導入店様の満足度を向上させる

## QSグループでの活動内容
【導入店様からのお問合せ件数を減らす】

- お問合せ傾向を把握して原因などをグループ内で考え、内容によっては開発チームとの定例会で共有する。 
- 新しいサービスやプロダクトがリリースされる早い段階からミーティングなどに参加してユーザのつまづきポイントを事前に察知して改善点などを提示する。


【正しい情報を社内外に展開する】

- 各オプションサービスに対しての説明会を社内で実施。
- 社内および社外からの質問に対して回答。また、質問がきたものはesaに集約して情報を整理。

【導入店様の満足度を向上させる】

- 困った時にすぐにつながるサポート窓口を提供するために応答率の向上を目指しております。
- わかりやすいオンラインマニュアルを提供するなどして導入店様に対して豊富な情報を提供。