OmniAICreator/Qiita-1.07M huggingface dataset:
grep/git grepでタブ文字を検索する

`grep`コマンドや`git grep`で「タブ文字」（`\t`）を検索する方法。過去に何度か調べている気がするのでメモ。

## 行頭のタブ文字を検索する例:

```sh
git grep -E $'^\t'
```

## 参考

* [逆引きUNIXコマンド/grepでタブを検索する方法 - Linuxと過ごす](https://linux.just4fun.biz/?%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/grep%E3%81%A7%E3%82%BF%E3%83%96%E3%82%92%E6%A4%9C%E7%B4%A2%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)
* [タブ文字で grep する - suer のブログ](https://suer.hatenablog.com/entry/2016/03/04/181232)
STSでlombokがエラーになった時

STSを開いた時にlombokのコードがエラーになる現象が度々起こり、都度対応を忘れるので備忘録。
元々動いていたプロジェクトが動かなくなった時の対応といった感じです。

## エラー
下記のようなエラーが100件くらい出る。
>ani cannot be resolved or is not a field
>Java Problem

## 環境
Java11(jdk-11.0.1)
Spring Tool Suite 3.9.6.RELEASE

## やったこと

##### 1. STSにJava11のプラグインをインストール
Eclipse MarketPlaceから「Java 11 Support for Eclipse 2018-09 (4.9)」をインストール。

##### 2. STSのJava Compilerの参照先をjdk11に変更

 - 設定画面を開く

  [Window] -> [Preferences] -> [Java] 

  - JRE追加

  -> [Installed JREs] -> [Add] -> 「Standard VM」選択 -> JRE 
  homeでjdk11のパスを設定 -> [Add External Jar] -> [Finish]

  - Compiler設定

  -> [Compiler]  

Compiler compliance level、GEnerated.class files compatibility、Source compatibilityの3カ所を「11」に設定する。


##### 3. lombok.jar再インストール

##### 4. Maven Update Project

Mavenを使っていたので[Maven] -> [Update Project]

STSというかJava11で怒られていたのをどうにかしたという話。


## 発生したタイミング

 - STS起動時
 - Project Clean時
newlibのコンパイル

mipsel用にnewlib-3.0.0.20180831をlinuxのtoolchainを使ってコンパイルしてみた。toolchainはいろいろ探したら、gcc 4.2.3な物が見つかったので、これを使いました。

```
% mips-cc -v
Using built-in specs.
Target: mipsel-linux-uclibc
Configured with: /home/gracecsm/toolchains/src/toolchains/linux-2.6/buildroot/to
olchain_build_mipsel/gcc-4.2.3/configure --prefix=/projects/hnd/tools/linux/hndt
ools-mipsel-linux-uclibc-4.2.3 --build=i386-pc-linux-gnu --host=i386-pc-linux-gn
u --target=mipsel-linux-uclibc --enable-languages=c,c++ --disable-__cxa_atexit -
-enable-target-optspace --with-gnu-ld --with-gmp=/home/gracecsm/toolchains/src/t
oolchains/linux-2.6/buildroot/toolchain_build_mipsel/gmp --with-mpfr=/home/grace
csm/toolchains/src/toolchains/linux-2.6/buildroot/toolchain_build_mipsel/mpfr --
enable-shared --disable-nls --enable-threads --disable-multilib --with-abi=32 --
with-tune=mips32
Thread model: posix
gcc version 4.2.3
```

蟹さんのときと同じで

newlib/libc/include/stdlib.h の __deprecated__を2行コメントアウト
newlib/libc/include/sys/_intsup.h の Unable to determineを2行コメントアウト

gccのバージョンが古いためか

libgloss/mips/crt0.Sの.gnu_attribute 4,0をコメントアウトが必要だった。

~~あと何故かコンパイル時にmakedoc.cのコンパイルのためにgccが必要になっていた。ところがconfigure時に/usr/bin/ccをgccとシンボリックリンクしておくとconfigureが暴走します。。。~~ configureにCC_FOR_BUILD=ccを付けて解決しました。

configureはいろいろ試して、こうしました。

```
% ./configure --target=mips --host=amd64 CFLAGS_FOR_TARGET="-fno-pic -mno-abicalls" CC_FOR_BUILD=cc
```

setjmpで固まるのでデバッグして、newlib/libc/machine/mips/setjmp.SのsetjmpとlongjmpのFPR_LAYOUTをコメントアウトしたら正常に動くようになりました。

テストプログラムはこんなです。

```
jmp_buf env;
        printk("MORIMORI1");
        if (setjmp(env) == 0) {
                printk("MORIMORI2");
                longjmp(env, 1);
        } else {
                printk("MORIMORI3");
        }
```

_sbrkを作ってmallocのテストもした方が良いです。

```
long *ptr;
        printk("MORIMORI1");
        ptr = malloc(32);
        printk("MORIMORI2");
```

pkgで入れたgcc6ではコンパイルできそうになかったので、あきらめました。

gcc492のportsを作って、FreeBSDのネイティブツールでビルドできるようにしました。gccはmips-gccですがarはmips-unknown-freebsd12.2-arになるので、configureに以下を追加する必要がありました。

```
ac_cv_path_AR_FOR_TARGET=mips-unknown-freebsd12.2-ar ac_cv_path_RANLIB_FOR_TARGET=mips-unknown-freebsd12.2-ranlib
```

newlibはmakeの中でもconfigureを実行しているような感じがしますし、configureを二度かけると挙動が違ったり、なんだか変です。

newlibはgccのコンフィグレーションごとのライブラリを作ります。mipsの場合デフォルトはビックエンディアンですが、リトルエンディアンもサポートしているgccの場合はelというディレクトリにライブラリが作られます。

# arm編

armel用にnewlib-3.0.0.20180831をビルドしてみました。armのgcc4はFreeBSDのpkgで用意されていたので、それを使います。上で書いていたdocのgccも問題も解決しました。

```
% ./configure --disable-newlib-supplied-syscalls --target=arm-none-eabi --host=amd64 CC_FOR_BUILD=cc
% gmake
```

こちらは修正無しに通りました。
ディープラーニングでNVIDIA GPUを使おう

この記事は NTTテクノクロス Advent Calendar 2018 の3日目です。
こんにちは、遠藤と申します。
普段は [NTTテクノクロス](https://www.ntt-tx.co.jp/?utm_source=qiita&utm_medium=ac2018&utm_campaign=03)で、深層学習関連のプロジェクトをしております。


# はじめに
何社か有名な半導体メーカはあれど、現状ディープラーニングをがっつりやろうとした場合には、NVIDIA社製のGPUを選択することになると思います。
本記事ではそんなNVIDIA GPUについて紹介します。

# プロダクトの種類
NVIDIAのGPUには大きく分けて3つのブランド（シリーズ）があります。
値段はもちろんプロダクトにもよるので、あくまで目安。

- GeForce：コンシューマー向けで最も知名度が高く一般的。  
  5～10万円くらい。GeForce 1070とか。
- Quadro：ワークステーション向け。GeForceとTeslaの中間の気もするが、業務向け。  
  30万円～100万円くらい。Quadro P6000とか。
- Tesla：データセンタやスパコンなど、高い信頼性と性能を求める方向け。  
  100万円～。Tesla V100とか。

QuadroとTeslaは3年保証ですが、GeForceは1年保証です。
またNVIDIAはGeForceシリーズをデータセンタで使うことは禁止しているので、データセンタでGPUを使う方はご注意を。少しニュースにもなったので、ググって知っておきましょう。

# GPUのアーキテクチャ
NVIDIAはアーキテクチャの世代ごとに、有名な科学者の名前を付けています。
おおよそ1年半から2年で新しいアーキテクチャが発表になります。
ここ数年で並べるとこんな感じ。Turingが最新です。

Maxwell < Pascal < Volta < Turing

例えば、Tesla P100というGPUの`P`はPascal世代を、TITAN Vの`V`はVolta世代であることを示します。
プロダクト名に世代の頭文字を付けているGPUも多いです。

アーキテクチャが1世代進むと5～10倍性能が上がったりしますので、GPUを購入する際は、上のプロダクトの種類とこの世代をもとに、具体的にどのGPUを購入するかを検討します。
そしてNVIDIAはこのアーキテクチャの世代ごとに、CUDAやNVIDIAの関連ライブラリのバージョンを管理しています。

# CUDA
CUDAとはNVIDIAが開発提供している統合開発環境です。何でも屋です。
CやC++でGPUを操作するAPIを提供したり、メモリからGPUメモリにデータをロードしたり、GPUの各コアに並列処理を依頼する仕組みも提供してくれます。
ほとんどの方はCUDAでプログラミングするのではなく、TensorFlowやChainerといったフレームワークを使っていると思います。
そのフレームワークがCUDAへのアクセスを担当してくれるので、インストールだけしてCUDAを意識する人は少ないと思いますが、NVIDIA GPUを使う上では必須になります。

# バージョンの依存
NVIDIA GPUを使う上で、バージョンの依存関係は注意しましょう。
以下3つには依存関係があります。

NVIDIA Driver <-> CUDA <-> フレームワーク

#### NVIDIA DriverとCUDA  
CUDAのdeveloperサイトを参照してもよいですが、個人的には[こちら](https://github.com/NVIDIA/nvidia-docker/wiki/CUDA)がわかりやすいです。
CUDAのバージョンに応じて、要求されるNVIDIA Driverが変わってきます。

#### CUDAとフレームワーク
使っているフレームワークによりますが例えばTensorFlowであれば、[Requirements](https://www.tensorflow.org/install/gpu)を見るに現在はCUDA9.0を指定しています。

この辺の依存関係やそれから関連ライブラリなどのバージョンは、しっかり公式がサポートしている環境で使いましょう。

# nvidia-docker
バージョンアップも多く、その他NVIDIAの関連ライブラリにも依存関係があるので、ホストではなくdockerでの利用をお勧めします。
ただ通常のdockerだとホストのGPUを操作できませんので、NVIDIAが提供するnvidia-dockerを使います。

ざっくり手順をまとめるとこんな感じ。

1. NVIDIA Driverをインストールする
2. dockerをインストールする
3. nvidia-dockerをインストールする [（手順）](https://github.com/NVIDIA/nvidia-docker#quickstart)
4. NVIDIAがCUDA導入済みのdockerイメージを配布しているので、これを使う [（配布先）](https://hub.docker.com/r/nvidia/cuda/)

# まとめ
- 依存関係に注意してNVIDIA GPUを使おう。
- nvidia-dockerおすすめです。
Synology DS416slim benchmark

## Synology DS416slim Performance

cf. https://www.synology.com/en-global/products/performance#4bay


- RAID0 disk1 + disk2 + disk3 + disk4

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114634/398802f2-253c-b8ae-e5f4-89b34523c96d.png)

- SHR1 ~ RAID5

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114634/e7428eee-f561-6453-f82f-bc8709bb9af0.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/114634/343185ea-332a-c1dc-6879-228ebd12d478.png)
時間毎の件数を0も含めて取得するSQL

時間毎の件数を取りたいが、
そもそも0件の時間帯についてはデータが取得できないので
取れるようにする

（例）
テーブル名は「users」
カラムは「created_at」（Timestamp）
1時間毎のデータ件数を表示する

generate_seriesで1時間毎、0件のデータを作成し、
それに元のデータをUnion Allして、SUMをとるだけ。

generate_seriesの存在を忘れがちなので忘備録。

```
select hour, sum(c) from 
	(
		select hour, 1 as c from users, date_trunc('hour', created_at) as hour where DATE(created_at) = '2018-08-31'
		union all
		SELECT generate_series as hour, 0 as c FROM generate_series('2018-08-31 00:00'::timestamp,'2018-08-31 23:00', '1 hours')
	 ) as a
 group by hour 
 order by hour
```
Amazon LightsailでLAMP環境の構築手順

案件でテスト環境を作る際に、AmazonのLightsailを利用して構築。

月額が安いのと、確認環境なので特にスペックもそれほど必要ないので、お手軽で良いかと思い導入。
ロードバランサーとかCDNとか特に必要ないので、今回はインスタンの立ち上げと固定IPの設定まで。

スクショは、すでに1つインスタンスがある状態で撮ったので、全くインスタンスが無い状態だと、ちょっと画面が違うけど基本的には同じ。

# インスタンスの立ち上げ

ホーム画面の[インスタンスの作成]を選択

<img width="1157" alt="スクリーンショット 2018-11-21 12.18.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/27566/517f4d5a-25ee-674c-c5ad-848ef326ccb5.png">

インスタンスのイメージを選択。今回はLinuxのLAMP(PHP7)を選択

<img width="822" alt="スクリーンショット 2018-11-21 12.19.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/27566/a669bc9a-928f-c1e3-e346-fbf5d9ca0560.png">

もし、自前のSSHキーを利用したいのであれば、ヘッダーの[アカウント]から[SSHキー]のタブを選択して、事前にアップロードしておけば、このインスタンス作成の画面の[SSH キーペアの変更]で、アップロードしたSSHキーが使えるようになる。

プラン(スペック)を選択。とりあえず1ヵ月無料の一番低いスペックを選択し、インスタンス名を指定して[インスタンスの作成]を実行

<img width="869" alt="スクリーンショット 2018-11-21 12.21.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/27566/1adb977a-8b5a-1ffa-6831-548e8a80a1b4.png">
<img width="933" alt="スクリーンショット 2018-11-21 12.21.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/27566/8363127b-0475-05b5-1013-bb56edec9515.png">

しばらくするとインスタンスが立ち上がり、保留中から実行中の状態になればインスタンスの作成は完了

<img width="503" alt="スクリーンショット 2018-11-21 12.21.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/27566/21a235cd-9f86-e2cb-1cf6-91c916a27083.png">

# 固定IPの設定

[ネットワーク]のタブから[静的IPの作成]を選択

<img width="628" alt="スクリーンショット 2018-11-21 12.22.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/27566/1bc2c990-24d6-e1d8-cb94-e5bcba4906a2.png">

インスタンスのアタッチで作成したインスタンスを選択し、名前を入力(変更)して[作成]を実行

<img width="912" alt="スクリーンショット 2018-11-21 12.23.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/27566/729a8669-0bff-1629-1e35-a753607b18e7.png">

完了したら割り振られたIPでブラウザからアクセスし、Bitnamiのメニュー(?)が表示されたら完了

<img width="869" alt="スクリーンショット 2018-11-21 12.23.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/27566/3df7e2f6-53bd-13b5-7e99-20c5b68ba8cf.png">

あとはIPにDNSのAレコードを向ければサイトが表示される

# アプリケーションパスワードの確認

MySqlのパスワードなどは、サーバーにSSHでログインして下記コマンド(ファイル)に記載されている

```shell
cat ~/bitnami_credentials
```

# PHPMyAdminへのアクセス

自分はこういう接続をしたことがなかったけど、下記内容でSSHで接続している間だけみれる

```shell
ssh -N -L 8888:127.0.0.1:80 -i {鍵ファイル} bitnami@{サーバーのIPアドレス}
```
これで接続している状態で、 http://127.0.0.1:8888/phpmyadmin にアクセス
ユーザーは、```root```でパスワードは、上記のファイルに記載してあるパスワードでログイン可能

# Timezoneの設定

```shell
sudo dpkg-reconfigure tzdata
```

これで、Asia→Tokyoを選べばTimezoneが変更される

***

結構簡単に構築できたので、本当に開発用とかで使うには楽だなーといった感じだった。
これから、ちょっとずつ実務でAWSを増やしていきたい。。。

***
参考サイト

- [Option 2: Find Credentials By Connecting To Your Application Through SSH](https://docs.bitnami.com/aws/faq/get-started/find-credentials/#option-2-find-password-by-connecting-to-your-application-through-ssh)
- [Connect To PhpMyAdmin](https://docs.bitnami.com/aws/faq/administration/access-phpmyadmin/?utm_source=bitnami&utm_medium=cloudimage&utm_campaign=aws)
リリースするapkはdabuggable=falseでなければならない

公式にも記載がありますが、リリース用apkはAndroidManifest.xmlのdebuggableをfalseにする必要があります。
>リリース用アプリをビルドする前に、ログ記録とデバッグ オプションを無効にします。ログ記録を無効にするには、ソースファイルで Log メソッドの呼び出しを削除します。デバッグを無効にするには、マニフェスト ファイルで android:debuggable 属性を <application> タグから削除するか、マニフェスト ファイルで android:debuggable 属性を false に設定します。

Android Developerより引用
https://developer.android.com/studio/publish/preparing?hl=ja

## 注意点
と、これだけ読むとAndroidManifest.xmlにだけ注意していればいいように感じるかもしれません。しかしbuild.gradleの記述はAndroidManifestよりも優先されることを思い出しましょう。

公式サイトに、versionCodeやversionNameについて記載があります。

>アプリのバージョンをアプリの <manifest> 要素で直接定義すると、Gradle ビルドファイルのバージョンの値によってマニフェストの設定がオーバーライドされます。

Android Developerより引用
https://developer.android.com/studio/publish/versioning

そしてこの上書きの動作は、debuggadleにもあてはまります。


## 確認する
実際にapkを作成、分析してこの動作を確認してみましょう。

### 準備
まずはAndroidManifest.xmlとappモジュールのbuild.gradleにそれぞれ以下の記述を行い、apkを作成します。

```AndroidManifest.xml
android:debuggable="false"
```
```app/build.gradle
debuggable=true
```

### 分析する
分析すると言っても難しいことはなく、Android Studioがやってくれます。

Buildのメニューにある「Analyze apk...」をクリックして、作成したAPKを読み込ませるだけです。
<img width="282" alt="スクリーンショット 2018-09-25 22.35.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/105272/3f9fa946-b989-9a5b-00a3-6a2af20a6b9f.png">

APKを選択すると↓のような画面が出てきます。
<img width="643" alt="スクリーンショット 2018-09-25 22.39.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/105272/cf6520bb-f795-b77c-c6c0-c90ede3daea5.png">

AndroidManifest.xmlを見てみると、app/build.gradleの設定が優先されるために、debuggable=trueであることが確認できます。

### まとめ
+ AndroidManifestよりもbuild.gradleの記述が優先される
+ Android StudioのAnalyze apkでAPKの中身を確認することができる
DockerでNginx+Djangoをリバースプロキシで動作させた時の本番デプロイでの静的ファイルの扱いについて

# はじめに
DockerでNginx+Django環境を動かして開発していた時に、本番環境へのデプロイする際、静的ファイル(staticfile)の扱い周りでちょっと詰まったので解決方法を共有します。

# 問題点
Djangoでは、静的ファイルの扱いについて、開発時においてはとても扱いやすく作られています。
各アプリケーション下にstaticディレクトリを用意するだけで、開発用サーバを実行した場合はそのまま参照してくれます。
また、本番デプロイ時は`python manage.py collectstatic`を実行することで、静的ファイルを一箇所に集約することができます。

ここで、Dockerの様なコンテナではなく、他の方法で環境を用意した場合を考えます。
コンテナではなく、他の方法で環境を用意した場合、NginxとDjangoアプリケーションは同じ環境で動作していると思います。
この場合では、Nginxの設定で、`/static/`のリクエストは直接`python manage.py collectstatic`で静的ファイルを集めたディレクトリを参照するように、エイリアスの設定などをすれば問題ありません。

次にコンテナ型の仮想環境で環境を用意した場合を考えます。
コンテナで環境を用意した場合、NginxとDjangoアプリケーションのコンテナを別々に用意し、Dockerのネットワーク機能でこれらのコンテナを接続すると思います。

しかし、この場合ですと、NginxとDjangoアプリケーションのコンテナは別々なため、Nginxコンテナに静的ファイルを配置しなければいけません。
ですが、簡単に自動で環境を構築できる様にするためにDockerを使用しているのに、わざわざ手動でNginxコンテナに静的ファイルを配置するというのは得策ではありません。

そこで、どうにかして、うまいこと本番環境へのデプロイ時には、collectstaticで集約した静的ファイルを参照できないかということを考えて試してみました。

# 解決策
解決策は単純で、volumeとして`STATIC_ROOT`をNginxコンテナのルート直下に配置し、ドキュメントルートで指定するという方法です。
今回のアプリケーションでは、アプリケーションコードをvolumeとしてDjangoアプリケーションのコンテナにマウントしていたため、同じ様にstaticディレクトリのみNginxにマウントすればできました。

# じゃあ何でハマったのか
ハマった理由としてはパーミッションでした。
始め、staticのマウント先を`/root`下に作業ディレクトリを用意して、そこにマウントしていたため、`/root`のパーミッションの関係上、Nginxから参照できなくて、403エラーが出る様になってしまいました。
そのため、`/root`下以外にマウントすることで、パーミッションがroot以外でも読み取れる様になったので、エラーが出なくなった様です。

# この方法の問題点
この方法ですと、docker-composeの様にあくまで同じマシン上でNginxコンテナとDjangoコンテナを稼働させていないといけないため、Kubernetesの様なコンテナオーケストレーションでは使えないといった問題点があります。
実際に運用するにあたってそもそも、一つのマシンで運用するdocker-composeは適さないと思うので、今後改善策を考えたいと思います。
ソーシャルサービスでアカウント名に大文字小文字を区別する？ 細かすぎて伝わらないUI UX デザイン設計 

# Twitter方式がトレンド

- 大文字もアカウント名に反映される
- 内部的は大文字小文字は同じものとして扱う
- どれでもログインできるけど、最終ログインのユーザー入力によって、自分のアカウント名の表示が変わる

# 何が嬉しいの？

- ユーザーは自分の氏名＝アイデンティティを表現できる (YumaInaura)
- ユーザーは文字の区切りをアカウント名に表現できる (TakoyakiDaisuki)
- ドットやハイフンでの区切りの曖昧さや間違いもない (yuma_inaura yuma.inaura)
- 「アカウント名をこう表示する」みたいなオプション項目も要らない


# これに共感できる人はソーシャルリテラシの感度が高いユーザー

- アカウント名はユーザーアイデンティティの心臓
- 1文字の違いに敏感になれるかどうかでソーシャルサービスの成功は決まると思うぜ

#Next?

[ui ux yumainaura - Google Search](https://www.google.co.jp/search?q=ui+ux+yumainaura&oq=ui+ux+yumainaura&aqs=chrome..69i57j69i60l3.2633j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
TikTokは神のアミューズメント ソーシャルアプリ！ で、何が「盛れる？」の？ おっさんスマホアプリ開発者も必見。UI UX デザイン設計

# TikTokすごいよ！

言葉にできないよ！

# 倍速再生で盛れる！

- 普通再生だと自分の顔のアラとかが目立つ
- スピードを上げると目立たなくなる
- TikTokの広告でよく見てた速い動画には理由があったんだ！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/2615dab8-af9e-2b81-0c2f-dc51b9a7c7c1.png)


# スタンプで盛れる！

- 視聴者ユーザーの注意力がシンボルに向く！
- 可愛いアイテムは人を可愛くする。
- プリクラ理論！


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/c8b2463b-e5fa-e3c1-7f3c-455453a44fbb.png)

# 音楽で盛れる！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/9fb610a8-f44b-f453-ad73-39b80a4a3544.png)



# ソーシャルで盛れる！

- みんなで渡れば怖くない！
- とりあえずTikTok始めたらAKB48のグループ動画とか出てくるかも！

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/60b1cd62-2245-a086-cfb7-06cdd2d28485.png)


# 本当によく出来てるな！ 神がかってる設計！

- 全てのピースが組み合わさって爆発的な威力を出している
- 恐ろしい勢いで上場したり株価上げたりというのも理解できる
- 無駄なものが一つもなくて奇跡の芸術品として完成されている

# 盛れると何が嬉しいの？

- みんなソーシャルできるよ！
- ソーシャルはサービスの心臓で命で全てだよ！
- 参加ユーザーが増えるほど指数関数的にコミュニケーション爆発！うおーーー！


# おっさんエンジニアも動画を作ったぞ！

## [みてね 💚](https://t.tiktok.com/i18n/share/video/6629409857202031873/?region=JP&mid=6573217499922303745&u_code=d39bdb5d6bgb04&share_ab_group=0&&iid=6627275868094121729&utm_campaign=sever_share&utm_medium=iphone&app=tiktok&utm_source=twitter)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/da04f2a0-028d-113c-8653-e1feedc4c787.png)

# TikTokすごい！！！

- まだ言えてないことがたくさんある！
- 言葉にできない！
- らら、ららら、言葉にできぬ！！！！

#Next?

[tiktok yumainaura - Google Search](https://www.google.co.jp/search?q=tiktok+yumainaura&oq=tiktok+yumainaura&aqs=chrome..69i57j69i60l3.3593j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
PHPでPDOクラスを使ってデータベースにデータを挿入する


PHPでデータベースに接続するためにPDOを使います。

# PDOとは？
PDOとは、データベースに接続するために用意されたクラスです。
データベースの接続に便利なメソッドがたくさんあります。

# データベースに接続する

まずデータベースに接続してみます。

```php:
define('DSN','mysql:host=localhost;dbname=ホスト名;charset=utf8');
define('DB_USERNAME','ユーザー名');
define('DB_PASSWORD','パスワード');

try{
        $db = new \PDO(DSN, DB_USERNAME, DB_PASSWORD);
        $db ->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
}catch(\PDOException $e){
        echo $e->getMessage();
        exit;
}

```


# データベースにデータを挿入する

データベースにデータを挿入してみましょう。

`$stmt = $db->query("select * from students_table")`

これで、データベースからデータを読み出せたので、queryメソッドを使えば、SQL文を実行できそうです。

```php 
$stmt = $db -> query("INSERT INTO students_table (entry_id,student_id,student_name,student_age,remark) VALUES (".$count.",".$number.",'".$name."',".$age.",'".$remark."')");
```
文字列である\$nameと\$remarkは`'`で囲むことに注意しましょう。

これでもデータを挿入できました。

しかし、ネットで調べてみると、データ挿入時にはprepareメソッドとexecuteメソッドをセットで使っているコードが多くみられます。

## exec、query、prepare、executeの違い

データベースを操作する時にこれらのメソッドをどのように使い分ければいいのでしょうか。

|メソッド名 | 意味 | 
|:------:|:------:|:------:|
|exec | SQLを複数行実行、作用した行数を返す |  
|query | SQL文を1行実行して、PDOStatementを返す |
|prepare | SQL文の実行の準備をして、PDOStatementを返す|
|execute | prepareで準備されたSQL文を実行する|

### queryとexec

select文を使ってデータベースの中身を見たいときは、execは行数を返すだけなので適していません。
queryメソッドが有効です。戻り値のPDOStatement`$stmt`にfetchメソッドをつかうことで、データを取得できます。

SQL文内に変数を割り当てる必要がなければ、insert文やdelete文もこの2つのメソッドで実行できます。

### prepareとexecute

prepareとecxecuteメソッドは、SQL文内に、変数を割り当てたいときに適しています。

以下の例では、SQL文内で変数を展開するために、結合演算子`.`を利用しています。

```php 
$stmt = $db -> query("INSERT INTO students_table (entry_id,student_id,student_name,student_age,remark) VALUES (".$count.",".$number.",'".$name."',".$age.",'".$remark."')");
```
しかし、これではSQLインジェクションを防げません。

まずprepareでSQL文内で変数を展開したい場所を`:名前`で確保しておきます。
これをプレースホルダと言います。

```php
 $stmt = $db -> prepare("INSERT INTO students_table (entry_id,student_id,student_name,student_age,remark) VALUES (:entry_id,:student_id,:student_name,:student_age,:remark)");
```
用意したプレースホルダに展開したい変数をbindValue、bindParamメソッドを使って指定します。

```php
$stmt->bindValue(':entry_id', $count, PDO::PARAM_INT);
 $stmt->bindParam(':student_id', $number, PDO::PARAM_STR);
 $stmt->bindParam(':student_name', $name, PDO::PARAM_STR);
 $stmt->bindValue(':student_age', $age, PDO::PARAM_INT);
 $stmt->bindParam(':remark', $remark, PDO::PARAM_STR);
```
どこにどの変数を割り当てるのか決まったら、最後にexecuteメソッドを実行します。

```php
 $stmt->execute();
```
これで変数名にSQL文の一部が入っていても、SQL文の実行に影響が出ずにすみます。
Markdownスライド作成ツール『Marp』のTips

# はじめに

LTや社内の勉強会用のスライドを作るときはKeynoteを使っていたのですが、最近はMarkdownスライド作成ツールである『Marp』を使っています。
元々スライドの流れをメモでまとめてから、作成していた自分としてはメモがそのままスライドになるため、とても助かっています。
そんなMarpとちょっとした小技を紹介していきます。

# Marpとは

[Marp](https://yhatt.github.io/marp/)は、Markdown記法を用いてスライドが作れるアプリケーションです。
Windows・Mac・Linuxで使えます。

![スクリーンショット 2018-11-30 7.13.36.png](https://qiita-image-store.s3.amazonaws.com/0/180827/363f2062-3479-6d8f-82aa-2d657a382e9a.png)

また、作ったスライドはPDFファイルとして出力できます。

もっと詳細が知りたい！という方は作者さまの記事を参照してください。

* [Electron で Markdownプレゼン作成ツールを作って公開するまで](https://qiita.com/yhatt/items/0bf65699a538d5508c33)
* [Markdown スライド作成ツール『Marp』の開発経緯裏話](https://tech.speee.jp/entry/2016/07/14/204951)

# Tips

Marpの基本的な使い方は公式サイトに記載されているサンプルを見ればわかると思いますので、今回は、自分がスライドを作るときに(サンプルに載ってないけどこういうときどうしたらいいんだろう？)となったことを紹介していきます。

### 文字の中央寄せ・右寄せ

自分の場合はstyleでtext-align:centerを指定して実現しました。

```
<div style="text-align:center">中央寄せにしたい文章</div>
```

![スクリーンショット 2018-11-30 7.59.49.png](https://qiita-image-store.s3.amazonaws.com/0/180827/5d0ac345-8bf0-9401-e49f-0df9c6e776d3.png)


### 文字のサイズ

Markdown記法の最大文字サイズよりも大きく文字を表示したい場合があったので紹介します。
自分はstyleを使ってCSSを直接記述しました。

```
<span style="font-size: **px;">文字のサイズ</span>
```

![スクリーンショット 2018-11-30 8.04.33.png](https://qiita-image-store.s3.amazonaws.com/0/180827/af221425-8afb-b51e-3b89-24392c584bbc.png)


### 画像のサイズと表示位置

画像を少し小さくして中央寄せにしたい機会がありました。

その際は以下のように書きます。

```
![70% center](hoge.jpg)
```



# おわりに

個人的にMarpにはめちゃめちゃお世話になってます。ありがとうございます。

テーマが自作できるとのことなので、時間を見つけていじってみたいと思ってます。

おしまい。
[Flutter] animationを使って試してみた。その２

おはようございます
どんどん寒くなり、今年もまもなく終わりになります。
頑張りましょう。

# 以前の投稿(連関)
1. [[Flutter] animationを使って試してみた。](https://qiita.com/Dreamwalker/items/c195d8ba12e8a55383f1)

# Stateful 
Stateful でつかいます。

#Curved Animation 
1. [[Flutter] アニメーションのCurves](https://qiita.com/Dreamwalker/items/0f91b56b678bbe5bfa49)
2. https://docs.flutter.io/flutter/animation/Curves-class.html
 

```dart
 animation = CurvedAnimation(parent: animationController, curve: Curves.bounceOut);
```

```dart

   animation.addStatusListener((status) {
      if (status == AnimationStatus.completed) {
        animationController.reverse();
      } else if (status == AnimationStatus.dismissed) {
        animationController.forward();
      }
    });

```

```dart

class AnimatedLogo extends AnimatedWidget {
  final Tween<double> _sizeAnim = Tween<double>(begin: 0.0, end: 500.0);

//  final CurvedAnimation _sizeAnim = CurvedAnimation(begin: 0.0, end: 500.0);

  AnimatedLogo({Key key, Animation animation})
      : super(key: key, listenable: animation);

  @override
  Widget build(BuildContext context) {
    // TODO: implement build
    final Animation<double> animation = listenable;
    return Transform.scale(
      scale: animation.value * 50,
      child: FlutterLogo(),
    );
  }
}

```

ここ注目ポイント。

```dart

  return Transform.scale(
      scale: animation.value * 50,
      child: FlutterLogo(),
    );

```

最後に是非忘れないで～

```dart
@override
  void dispose() {
    // TODO: implement dispose
    animationController.dispose();
    super.dispose();
  }
```

#これなら。

1. 心臓が動いているアニメーションができる。

![녹화_2018_11_30_07_32_49_871.gif](https://qiita-image-store.s3.amazonaws.com/0/137182/eca3290a-4e90-e0a2-a493-a624d68ff244.gif)

#参考

1. https://flutter.io/docs/development/ui/animations/tutorial
Jupyter Notebookで、なぜかC#でHelloWorldをコンパイルして実行してみる(外部コマンド実行)

# 概要
このエントリでは、Jupyter Notebookの上で、なぜかC#でHelloWorld.cs的なプログラムをコンパイルし、実行してみることを行います。

要は、外部コマンドとしてコンパイラを実行をしているだけです。

## 前提

- 想定読者は、物好きな方です。
- 実用性は目的としていません。
- OSは、Windows 10を利用しました。(コンパイラもOS導入後(Vista以降)に入っているcsc.exeでよく、本エントリの範囲ではVisual Studioを入れる必要はありません。)

# 準備

## Jupyter Notebook

<details><summary>
まずはJupyter Notebookを動かせるようにしましょう。</summary><div>

\```python

2018年11月時点では、本家サイト「http://jupyter.org/install」において、AnacondaでのPython関連のインストールが推奨されています。
Pythonのパッケージマネージャにはお好みの流派があるとは思いますが、本エントリでは、Jupyter Notebookおすすめの方式に従います。

Anacondaのサイト（https://www.anaconda.com/download/#download）より、Windowsの64bit版のインストーラをダウンロードし、導入します。
（本エントリ執筆時点では、Anaconda3-5.3.1-Windows-x86_64.exe）
\```
</div></details>

## ソースを書く

動かしたいのは、よくあるHelloWorldです。

```C#
using System;
namespace HelloWorld
{
    class Hello 
    {
        static void Main() 
        {
            Console.WriteLine("Hello World!");
        }
    }
}
```

これをペタッとNotebookのCellに貼ります。

![jn-cs-helloworld.png](https://qiita-image-store.s3.amazonaws.com/0/65002/89cd9e64-80a8-ecb8-aa31-c6f45c5c1517.png)


Cellの先頭に「%%writefile HelloWorld.cs」というJupyter Notebookにおいて「指定したファイル名でCellの内容をファイルに書き出す」命令を書いて、Runします。

ここまでで、Jupyter Notebookのデフォルトのファイル保存先（Anacondaで不通に入れてスタートメニューから動かしているときは、ホームディレクトリ）に、HelloWorld.csが出力されています。エクスプローラなどから確認できます。

## コンパイル

ソース一つをコンパイルするだけなので、ビルドファイルも作らず、csc.exeを使います。

```powershell
!!c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /w:4 HelloWorld.cs
```

このCellをRunすると、前述と同じ場所に「HelloWorld.exe」が出力されています。

## 実行

これも、外部コマンド実行を使います。

```powershell
!!HelloWorld.exe
```

CellでRunすると、HelloWorld.exeが実行され、結果をCellで確認できます。

![jn-exec.png](https://qiita-image-store.s3.amazonaws.com/0/65002/d8b078ca-7bda-544e-4b89-eb70d5a0cee1.png)

## 出力を使う

実行しっぱなしもつまらないので、出力結果をほかのCellで使ってみます。

Cellで、変数aに「%%system」で実行した結果を格納し、次のCellで表示させてみます。
```
a=%%system HelloWorld.exe
```

![jn-capture-output.png](https://qiita-image-store.s3.amazonaws.com/0/65002/0e2da9be-31a5-e127-70c9-797c4491bced.png)

できましたね。

## まとめ

このエントリでは、Jupyter Notebookの外部コマンド実行機能を用いて、C#のコンパイラを動かしてみました。
【翻訳】MariaDBのAriaに対応するGUI・ワークベンチは？

以下の記事を翻訳したので、投稿しておきます。
記事では、MariaDBが公式に[MySQL Workbench](http://www.mysql.com/products/workbench/) がMariaDBで利用可能であると記載しています。
[GUI/Workbench for MariaDB Aria?](https://mariadb.com/kb/en/library/guiworkbench-for-mariadb-aria/)

# GUI/Workbench for MariaDB Aria? （MariaDBのAriaに対応するGUI・ワークベンチは？）
## 回答
MariaDBを取り扱えるGUIツールはたくさんあります。例えば、[Webyorg/SQLyog](http://webyog.com/)、[HeidiSQL](http://www.heidisql.com/)、[dbForge Studio for MariaDB](https://www.devart.com/dbforge/mysql/studio/mariadb-gui-client.html)、そしてもちろん[MySQL Workbench](http://www.mysql.com/products/workbench/)もです。

私たちは、(たとえば[SQLyog](http://code.google.com/p/sqlyog/issues/detail?id=538)のように)MariaDBとAria特有の機能のサポートを追加するようにリクエストがあったり対応中だったりするツールがいくつかあることは知っています。あなたの好みのGUIツールがMariaDBとAria特有の機能を直接的にサポートするようになるまで、ほとんどのツールはカスタムSQLコードを編集したり実行するメカニズムを提供します。
【翻訳】Database Workbench (MariaDBのデータベース ワークベンチ公式説明)

MariaDB公式サイト内にある、Database Workbenchのページを翻訳（意訳）したので、掲載しておきます。
https://mariadb.com/kb/en/library/database-workbench/
なお、Database Workbenchは有料のデータベース管理GUIツールです。

# Database Workbench
　[データベースワークベンチ](https://www.upscene.com/database_workbench/)は、MySQL、MariaDB、Oracle、Firebird、InterBase、Microsoft SQL Server、SQL Anywhere、NexusDBなどのデータベースにおいて、データベースの設計、開発、管理、テストを行うためのWindowsアプリケーションです。（Linux上のWineでもうまく動作します。）

データベースワークベンチでできること：

- データベース設計
- 複数のデータベースに接続
- メタデータの閲覧と編集
- データの閲覧と編集
- データのインポートとエクスポート
- ODBC/ADOデータソースに接続
- データベースシステム間のデータ転送
- メタデータの移行
- メタデータの比較
- 権限の管理
- ストアドプロシージャのデバッグ
- メタデータやデータの印刷

さらにいくつもの他のツールも含まれています。こちらにもっと[スクリーンショット](http://www.upscene.com/database_workbench/learnmore)があります。

データベースワークベンチには様々なエディションがあり、モジュールごとのライセンスとなっているので、あなたに必要なバージョンがきっと見つかるはずです。
MessageResources.propertiesに記述した日本語が文字化けする

# 前提

Spring の Validation メッセージが文字化けする。
※本番環境など
※Eclipse で実行したときは、正常に表示されている

## 問題点

本ページでは、「propertiesファイルは、unicode（Eclipseでは、ISO-8859-1）エンコードされていなければならない。」に違反している場合を取り上げます。

Spring では、Spring api を通じて読み込まれる propertiesファイルは、マルチバイト文字を読み込む想定で作られていないため、上記エンコード方式である必要がある。

## 解決策

### 1. Eclipse エディタのエンコード方式を変更する

***（注意）変更前に MessageResources.properties の内容をバックアップしておく***
1. Eclipse のパッケージ・エクスプローラーから、MessageResources.properties を右クリック
2. プロパティーをクリック
3. リソース→テキスト・ファイル・エンコード→その他：ISO-8859-1 を選択
4. 適用して閉じる、をクリック
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/227525/123e5a5f-0cf3-104f-15e8-dd5417edd1e1.jpeg)

### 2. ファイルを記述し直す

1. Eclipse のパッケージ・エクスプローラーから、MessageResources.properties を右クリック
2. 次で開く→Limy プロパティー・エディターをクリック
3. 文字化けしていたら、記述しなおす（バックアップからコピペなど）。
4. 保存する

### 3. エラー表示が日本語になる

- 上記によって、Eclipse 上では日本語で表示され、文字のエンコード方法は ISO-8859-1 になっているファイルが出来上がっている。
UguiでCameraに写っているかどうか判定する

カメラに写っているかの判定方法は

[【Unity】オブジェクトが画面外かどうかを判定する方法(まとめ)](https://tama-lab.net/2018/08/%E3%80%90unity%E3%80%91%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%8C%E7%94%BB%E9%9D%A2%E5%A4%96%E3%81%8B%E3%81%A9%E3%81%86%E3%81%8B%E3%82%92%E5%88%A4%E5%AE%9A%E3%81%99%E3%82%8B/#WorldToViewportPoint)

の記事が詳しいのですが、微妙にCanvasのImageとかの場合どうすればいいのかというとあまりよいのがない。
Renderer.isVisibleやOnBecameVisible、OnBecameInVisibleやOnWillRenderObjectとかを使うのはMeshRendererとかが必要なのでuguiで使うにはびみょい。

Camera.ViewportToWorldPointを使うとよさそうだが普通にやったらGameObjectの位置になってしまうのでRectの範囲をとりたいわけです。

というわけで以下。

```C#:testVisibleCheck.cs
using UnityEngine;

public class testVisibleCheck : MonoBehaviour {

    //Uguiを表示してるカメラを貼り付ける
    [SerializeField] private Camera camera;

    private RectTransform _target;

    private Rect rect = new Rect(0, 0, 1, 1);

    public bool isVisible;

    void Start()
    {
        _target = this.GetComponent<RectTransform>();
    }

    void Update()
    {
        isVisible = rect.Contains(camera.WorldToViewportPoint(_target.transform.position + (Vector3)(_target.rect.min * _target.lossyScale.x))) ||
                   rect.Contains(camera.WorldToViewportPoint(_target.transform.position + (Vector3)(_target.rect.max * _target.lossyScale.x)));
    }

}

```

Canvas以下にあるGameObjectにImageでも付けてみて移動してみてください。見えなくなった(画面外)でisVisibleがfalseになります。

ただこれ、親のCanvasのrendermode設定がScreen Space Overlayだとちゃんと動きません。

テストだからUpdateに入れてるけど、毎フレームでやると重くなるかもしれないので値変更時にやるとかいいかも。uniRxだと[簡単](https://qiita.com/toRisouP/items/d0d32cf674a00f3a8427)ですね。
[速報] [AWS re:Invent 2018] API GatewayがWebSocketに対応しました

docomo Developer supportの赤塚です。

KeynoteでAPI GatewayのWebSocket対応が発表されました。

API Gatewayはクライアントとはステートフルな接続し、AWSサービスとはステートレスな接続をするようです。

リアルタイムに双方向の通信が必要となるアプリの開発が容易になりそうです。

リリース時期はComing soonとなっています。

![BA7BAB45-D91E-4FC9-9A87-5DDFF81A49A4.jpeg](https://qiita-image-store.s3.amazonaws.com/0/262328/abbe9c0d-9de5-5834-136f-2ae349709720.jpeg)
未ログインのQiitaトップページはCPU使用率が高い

# はじめに
　未ログインでQiitaトップページのトレンドを見たあとブラウザ（Chrome）を開きっぱなしにして別のことをしていたところ、ノートPCのCPUファンの音がうるさく（＝CPU使用率が高く）なったので調べてみました。

# 原因
　長く引っ張れる話ではないのでさっさと原因を書くと、未ログイン時に表示されているユーザー登録フォームを含む領域でCSSによりグラデーションアニメが指定されてるせいでした（2018/11/30時点）。

# 詳細
　トップページのHTMLソースから試しにいろいろ要素を削りながら調べたところ `<div class="nl-Hero">` が原因のようだったのでCSSを確認。

```css:style-[中略].min.css(抜粋＆整形)
.nl-Hero{
  width:100%;
  padding:72px 32px 32px;
  background-position:left top,left top;
  background-size:400px,400% 400%;
  background-repeat:repeat,no-repeat;
  background-image:url(/assets/public/hero-background-1e127e93e528b4cc9413fb67a2d3fb74.png),linear-gradient(-45deg,#32deaf,#55c500);
  animation:nl-Hero_Gradient 15s ease infinite;
  height:500px;
  display:flex;
  align-items:center
}
@keyframes nl-Hero_Gradient{
   0%{background-position:left top,0 50%}
  50%{background-position:left top,100% 50%}
 100%{background-position:left top,0 50%}
}
@media(max-width:770px){
  .nl-Hero{padding:104px 24px 64px}
}
```

背景画像に対して線形グラデーションが指定されていました。

# 改めてトップページを見ると
　確かに色合いが時間とともに変わってます。じっくり見ないから気付きませんでした。
![qiita1.png](https://qiita-image-store.s3.amazonaws.com/0/256480/1a2953be-ed9c-a535-c093-6f9548bd92f6.png)
![qiita2.png](https://qiita-image-store.s3.amazonaws.com/0/256480/5e1528a2-ad74-a4da-74af-802c52541f10.png)

# 結論
　とりあえずログインしましょう。
なぜAdvent Calendar 2018をやるのか？


# Advent Calendar 2018を始めた！

まだ25日分埋まっていない(汗

まぁ これから２日分、３日分や初めてやろうという人がきっとでてくると信じている！！
（穴が空くと切ないw）

技術的なことも検討したが1日目ということもあり

エンジニアならQiitaよりコード書いた方がいいじゃん！って人向けに書いてみようと思いました。

## まず2017年の振り返り

去年に12月近い時期に唐突にやってみようと思い立ち初めて始めたのがきっかけ。

もちろん書いてくれる25人にあてがあったわけでは無いが
そのタイミングで「まぁ　次でいっか」となると

それは1年後になるのでなんか悔しい気持ちと勿体無い気持ちになり「最悪、自分で25日書けばいいか」と始めることになる。（今思えばとりあえずやってみるか！は大事なのかもしれない）

だが、やることを社内などで共有していくと

2日分書く人がでてきたり、意外な人が、意外な内容を書いていたりしてとても面白い

やっぱり参加した中でもアウトプットできるエンジニアはまとめるのがうまいのか
APIの設計やドキュメント資料、プロジェクトの情報共有などもうまく、通じるものがあるように感じた。
（誤解のないように、もちろんQiita、Blogなどにアウトプットしてないとダメという話じゃ無い）

なので仕事（エンジニアリング）にもこの改めて調べる、人に向けてまとめるということは活きると実感。

# しかしエンジニアのアウトプットってなかなか難しい
エンジニアというタイプはなかなか「人生で最高のプログラムのソースが書けた！！」と思うことが少ないと思う。自分もなかなかそう思うことはない。

尚且つエンジニアはネットの情報の収集に慣れているので

 - 上には上がいる
 - 自身が知っている知識は誰もが知っている

と思いがちだと思う。

さらにソースの設計の仕方やミドルウェアなど、要件によってもいろんな正解があり、次々とより新しいミドルウェアやツールがでてくる。

アウトプットを行うに当たって自分が理解していた事を改めて調べたりなどが書いている人自身の知識の向上や深い理解に繋がるのは最大のメリット

# アドベントカレンダー達成後には
アドベントカレンダーをやり遂げて俺ら最高だよね飲み会をやるのが良い
お互いの記事について直接話すこともできるし

「次は何を書こうか。。。」

ネタがないから何か新しい技術やツールを使ってみよう、というサイクルにしていきたい。

# というわけでこれからプログラム始めるよという方に
 - 動画プログラム学習サイトや本を併用して学習する
 - GitHub、Qiitaのアカウントを作る
 - 自分のやったことを公開していく（自分の為になる）

はおすすめです。
もし投稿内容に間違いがあっても間違っていたことを理解して自分の力にすれば良いだけです。

# アウトプットする事で情報が集まってくる
という意見をネットで見ました。まさにその通りだなと。他の人も関連する情報を共有しやすいし、良い情報を教えてくれた人に良い情報を返そうという良い反響が起きやすいと思います。

# これからでも全く遅くない
是非、2018のアドベントカレンダーにどれか参加してみてはいかがでしょう？
いろんな言語でHelloWorld並べても面白いかもしれない！！
性善説、性悪説とチームのルール作り

# 性善説、性悪説とチームのルール作り

## 1. スクラムチームのルールを作ろうとした話

スクラムチームは、「自己組織化されている」ことを求められます。
（詳しくは [Core Scrum](https://www.scrumalliance.org/ScrumRedesignDEVSite/media/ScrumAllianceMedia/Files%20and%20PDFs/Learn%20About%20Scrum/Core-Scrum.pdf)を参照してください！）

自己組織化されているということは、マネージャーやステークホルダーから上意下達の決定が下されるのではなく、スクラムチームが自ら考えて決定を下すこと！

そんな決定をするための、「決定のルール」を悪戦苦闘しながら作ったお話です。

## PART1 性悪説に基づいたルール作り

「決定のルールを作ろう！」という議題で会議を開きました。
最初の2回の会議は、なかなか進みませんでした。
「最初に決定のルールの案を考えてきて、それをベースに考えた方が速いかな？」と思い、こんな感じで案を考えて提示しました。

```
有志で会議を開いて、そこで決まったことをスクラムチーム全体の決定と扱うことができる
- 会議を開催する旨はSlackで全員に通知する
- 会議は任意参加とする
- 改善の会議を開く前に議題（＝決定したいこと）を発表する
- 会議では議題のみ決定し、それ以外の決定は無効にする
```

しかし、思いの外ツッコミがたくさん来て、なかなか前に進みません。

- 有志が少数しかいなくても決定できるの？
- 参加したい人全員が参加できない場合はどうするの？
- わざとみんなが参加できなそうな時間帯に開催して、そこで少数で決定されたらどうするの？

などなど、細部にこだわればいくらでも粗があります。
そして、ファシリの僕は、「これらの粗全てを解決するようなルールを作るには、一体何回MTGを開けばいいのだろう...」と頭を抱えました。

## PART2 性悪説で考える必要がないなら、性善説で考えよう

2回開催しても会議がなかなか進まないので、それまで準備を1人でやっていたところを、会議の目的に共感してくれた先輩に手伝って頂きました。

その方は、「もう少し性善説で考えてもいいんじゃないか？」と言ってくれました。

> - 有志が少数しかいなくても決定できるの？
> - どうしても参加したい人が参加できない日程に開催されたら納得感は得られないけどどうするの？
> - わざとみんなが参加できなそうな時間帯に開催されたらどうするの？

**このような発生するかわからない事態について、悩む必要はあるのだろうか？**

何千、何万という数のユーザーに対してではなく、二十数名のスクラムチームを対象にしているのだから、もう少し緩く考えてもいいんじゃないか。

みんな（多分）いい人だから、少数でもいい決定をしてくれるだろうし、どうしても参加したい人がいたらその人が参加できる日程に開催してくれるはずだし、わざとみんなが参加できない時間帯に会議を開催することなんてきっとない。

もしそういうことをする人がいたら、そのときにまたルールを修正すればいい。

こいう考えを会議で共有した上で、改めて緩めのルールを提案したら、微調整はしたもののどんどん議論は進み、スピーディに全員の合意を得ることができました！

## なぜ性悪説に基づいて考えてしまうか

私がいる部署は、自分も含めほとんどがエンジニアか、元エンジニアのスクラムマスター・プロダクトオーナーなどの技術系の人です。

エンジニアは、システムを設計する際に、ある程度あらゆる事態を想定して設計しなければいけません。

- 悪意のあるユーザーが変な動きをしたらどうしよう？
- エンジニアが間違えて〇〇をしたらどうしよう？
- DBに変な値を入れられたらどうしよう？

こう言った事態を防ぐために、ユーザーの動きを制限したり、テストを書いたり、DBに値を入れる前にバリデーションをかけたりする訳です。

エンジニアは職業柄、性悪説で考える癖がつきやすいのではないでしょうか？
そうしないと、堅牢なシステムが作れないのだから。

## まとめ

性悪説と性善説を使い分けよう。

スピードと細部のディテールはトレードオフになる。
システムを作るときなど、細部にこだわる場合は性悪説が必要。
しかし、そうでない場合は性善説でスピーディな意思決定をしよう！
【AWS re:Invent 2018】Make Money with Alexa Skillsのセッション解説

※本記事はAWS re:Invent2018のセッション解説記事です。

re:Invent2018に参加しています。
本記事では[ALX402-R] Make Money with Alexa Skillsのセッションを解説していきます。

主に、2018年9月に発表されたConsumablesの解説セッションです。主に下記の内容が実施されました。

- Consumablesを使うための基本的なワークフローの解説
- コンテンツ購買を行ってもらうためのベストプラクティスの解説

※ConsumablesとはSkill内でのコンテンツ販売(In Skill Purchase)の新しい機能で、Skill内のコンテンツを個別に販売できる機能です。スマホアプリのアプリ内コンテンツに対する課金とだいたい同じだと思ってもらえればわかりやすいと思います。

## Alexaの今までの歩み
Alexaリリース ~ Skill Kitリリース ~ SKillでの購買が記録される ~ Cousumablesがリリース
着実に進化をしていっていることを強調していました。

![IMG_0394.JPG](https://qiita-image-store.s3.amazonaws.com/0/317821/23e48328-bf90-4692-bc4b-fc0ec590121e.jpeg)


## AlexaのSkillにおける課金手法
Consumablesがリリースされたことにより、３つの手段が提供されることになりました。

- One-Time Purchases
- Subscriptions
- Consumables 

![IMG_0406.JPG](https://qiita-image-store.s3.amazonaws.com/0/317821/7cb374f0-2db3-a31d-816a-30e0a3abd74e.jpeg)

#### 設定金額の幅

ポイント手段によって設定できる金額の幅が違います。

- One-Time Purchase \$0.99 ~ \$99.99 
- Subscription \$0.99 ~ \$99.99
- Consumable \$0.99 ~ \$9.99

※課金のUX毎にユーザーが「支払ってもいい」と思える金額がだいたいこのくらい、ということでこの金額設定にもちゃんと理由があるようでした。
※国によって感覚は違うからこれはアメリカでの話だよ！という話だったので他の国では変わるかもしれません(現在はアメリカのみ対応)

#### 売上について
売上はDeveloperとAmazonの間で7:3の比率で分けられます。
後述する機能でDiscountが可能になっているのですが、その場合でも実際に発生した売上に対して適用されます。

#### 課金金額の登録について
基本的に何回でも変更が可能になっています。
が、変更時には再認証が必要となります。

![IMG_0412.JPG](https://qiita-image-store.s3.amazonaws.com/0/317821/6c813193-32f3-ff6b-c03c-36969d887c03.jpeg)

## ベストプラクティス - いかにして買ってもらうか
いくら環境が整ったとしても、ユーザが購入してくれなければ何も意味がありません。そのためにもUX設計が非常に大事になってきます。

#### 購買Intentを用意する

- ユーザがいつ買ってくれるかを判別するために必要
- きちんとフローを定義しておくことで細かいケアが可能になる。

![IMG_0425.JPG](https://qiita-image-store.s3.amazonaws.com/0/317821/23c9f535-7668-3274-018f-00a5b3b0bf69.jpeg)

#### しつこく購買オファーを出さない

-　購買をすることがユーザにとっての利便性を高めることにつながるか、を意識することが大事。
-　しつこいプロモーションはユーザにとってもDeveloper自信にとっても良い結果にならない
    
![IMG_0426.JPG](https://qiita-image-store.s3.amazonaws.com/0/317821/f2fa4ec4-0854-ba3b-edd2-3528017c5e09.jpeg)

#### 購買情報を保持し続ける

- consumablesにおいては、そんなに頻繁にデータを保存することが出来ない。
- 「ユーザが何を買ったのか」という情報はしっかりと保持し続け、それを用いて会話を構築することがUX向上につながる

![IMG_0427.JPG](https://qiita-image-store.s3.amazonaws.com/0/317821/062adf5a-d41e-bacd-9248-35b9ca5719f3.jpeg)

## ベストプラクティス実践例　Inevntory Checker
上記のUXを高めるための一例として、「いつ」購買オファーを出すのかを判断するために、ユーザが購買しそうなヒントを貯めてチェックする機構を作っていました。

コードの一部抜粋
![IMG_0429.JPG](https://qiita-image-store.s3.amazonaws.com/0/317821/6b95ae32-6314-649b-2255-82c432181b51.jpeg)

購買に繋がりそうな単語を何回発言したかでレコメンドするかどうかを判断する機能です。ゲームにおけるフラグのようなものですね。きちんとマイナス方向に作用する発言もちゃんと実装されていました。

## 終わりに
VoiceUIにおける課金は始まったばかりで、Developer側も魅力的なコンテンツを生み出せているわけではないし、ユーザ側も価値があるということを認識していないのが現状だと思います。

歴史を振り返ると、スマートフォンのアプリ内課金もLINEのスタンプが出てくるまではさっぱりだったので、何かしらのキラーコンテンツが出てきて、そこからVoiceUI上での課金が一般の感覚として浸透するまではなかなか難しい状態が続くかもしれません。
株式会社マクアケのチーム分けと利用技術について

# はじめに

この記事は[Makuake Product Team Advent Calendar 2018](https://qiita.com/advent-calendar/2018/makuake)の初日記事です。

株式会社マクアケ開発本部マネージャーの[kimura-ryohei](https://qiita.com/kimura-ryohei)と申します。
株式会社マクアケでは、「世界をつなぎ、アタラシイを創る」というビジョンを掲げ、webサービス[Makuake](https://www.makuake.com/)と[スマートフォン向けアプリ（iOS版）](https://itunes.apple.com/jp/app/id1274816320?mt=8)を運営しています。

Makuakeとは、「アイデアを形にしたい人」と「アイデアを応援したい人」をつなげるプラットフォームです。アイデアを形にしたい人＝実行者、のチャレンジを、アイデアを応援したい人＝支援者が支援してチャレンジを後押しできるサービスです。
参考：[Makuake（マクアケ）とは？ – Makuake ヘルプ](https://support.makuake.com/hc/ja/articles/115002853912-Makuake-%E3%83%9E%E3%82%AF%E3%82%A2%E3%82%B1-%E3%81%A8%E3%81%AF-)

今回、株式会社マクアケとして始めてアドベントカレンダーを書くことにしました。今後アップされる記事の内容を理解していただきやすくするために、マクアケの開発本部についてご紹介させていただきます。

# マクアケの開発チームと利用技術

## 人数規模

現在、開発に関わるメンバーは20名を超え、1年間で10名以上増加しています。増加していくに伴ってチーム体制づくりや開発の方針など様々なことに取り組んでいます。この記事では、チーム体制づくりと開発方針についてご紹介させていただきます。

## チーム体制づくり

### 目的別のチーム分類

![無題のプレゼンテーション (2).png](https://qiita-image-store.s3.amazonaws.com/0/320998/60c74564-294a-f236-1d2d-238e56b07e64.png)
大項目でプロダクト、技術基盤、IT戦略の３つの目的があり、それにそったチームを編成しています。そのなかで複数のプロジェクトが走っている状態です。
人数比的にはプロダクトに関わるメンバーが最も多く、ついで技術基盤、IT戦略という順になっています。またデザイナーやディレクターはプロダクトチームに関わることが多いですが、基本的には横軸で全てのチームに関わります。筆者はこの中でプロダクト向き合いチームのリーダーを担当しています。

### 開発方針

人数が増え、目的別のチーム組成を進める中で、従来のモノリスなシステムでは柔軟な対応がし辛いと考え、マイクロサービス化を推し進めています。
また特徴的なこととして、エンジニア個々人が今まで触っていなかった技術に挑戦するケースも多くあります。この点については自分の個人的な経験も含め、12/2（火）の記事として書く予定です。

現在の利用技術については以下のようになっています。新しい技術の採用も適宜行っています。今後公開されるアドベントカレンダー内の記事では、これらに触れる記事も書いていく予定です。

* マクアケで用いている技術（一例）
    * サーバサイド：PHP、Go
    * フロントエンド：jQuery、Vue
    * iOS：Swift
    * インフラ：AWS
    * その他：Firebase
* マクアケで用いているツール（一例）
    * コード管理：Github
    * タスク管理：Zenhub
    * ドキュメント管理：esa
    * メッセージングツール：Slack

# プロダクトチームの紹介

筆者がリーダーを担当しているプロダクトチームについて少し記載します。サービス全体の新規開発・改善を行うチームです。施策の提案・実装・分析を担当します。特徴としては、UX、CXに向き合い、ユーザーヒアリングやA/Bテストなどを含めたデータドリブンな改善を行っています。データ分析には主に以下のようなツールを使っています。

* Google Analytics（アクセス解析サービス）
* Google Optimize（A/Bテストツール）
* Google Tag Manager（タグ管理ツール）
* Redash（BIツール）
* Google SpreadSheet（データ分析・可視化）
* Google App Script（ツールどうしのつなぎ合わせ、効率化等）

今回のアドベントカレンダーでは、チームで行っている改善に関係する記事も書く予定ですので、ぜひ御覧ください。

# まとめ

株式会社マクアケの紹介と技術スタックについて書かせていただきました。多様な技術スタックや志向を持ったエンジニア、デザイナーが記事を書いていきますので、ご期待いただければと思います。
また、一緒に「世界をつなぎ、アタラシイを創る」エンジニアを募集しております。ご興味持っていただけた方はぜひ一度、「[各種エンジニア募集！ クラウドファンディングMakuake](https://www.wantedly.com/projects/26807)」からご連絡いただければと思います。
Backlog wikiの鮮度チェッカーを作った

[ハンズラボ Advent Calendar 2018](https://qiita.com/advent-calendar/2018/handslab) 2日目の記事です。

## 何を作ったか
先日、ハンズラボの全社のイベントで、「理想的なチーム内・チーム間の情報共有」をテーマにアイディアソンを実施しました。1日がかりで課題とその解決策についてまとめ、チーム発表を実施しました。

社長賞は「ドキュメント単位で担当者を決めて、ドキュメント閲覧者が情報の不備を発見したら担当者に通知できる仕組みを作る」でした。

さて、ハンズラボではBacklogを使用して課題管理・文書管理を行っています。
社長賞の解決策をいきなり作るのは難しいので、まずはWikiの鮮度チェッカーを作ってみました。思い切りQiitaのパクリです。編集リクエスト機能まで作りたいのですがリクエスト先が決まらないので、今の所この辺で。
以前から興味があったので、chrome-extensionで作成しています。

## 使い方
1. https://github.com/watarukura/backlog-wiki-freshness をcloneします。
2. Chromeの拡張機能画面を開きます。
3. 画面右上の「デベロッパーモード」をONにします。
4. 「パッケージ化されていない拡張機能を読み込む」を押下、1.でcloneしたディレクトリを読み込みます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/49339/4abcc6df-ec05-a259-1b3e-e12c2810a7a1.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/49339/272f22a8-0993-39ed-8a25-c4301f6c7e8a.png)
5. Backlogにログインし、wikiページを開きます。<br>
↓最終更新日から1年以内のときは何も変化ありません。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/49339/1606ce34-3b40-2756-ba41-d35f6be21def.png)
↓最終更新日から1年以上経過している場合は、タイトルの下に警告が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/49339/e7294cf9-3819-8e2b-bd47-d1c0ecac6e93.png)

## 没アイディア
BacklogのWikiにはタグという機能があり、タイトルに[]で囲んだ文字を入れることでタグを登録できます。
Backlog APIでWikiページを全件取得、最終更新日をチェックして「最終更新日から1年以上経過」というタグを登録していく、というスクリプトを定期的に実行すれば、鮮度チェックできるなーと考えました。
タグをクリックすると、そのタグがついた記事一覧も取得できて一石二鳥です。

ところが、当然ながらタイトルを更新すると最終更新日も更新されてしまうため、実際の最終更新日がわからなくなってしまいます。
これではチェック運用を回せません・・・。ということで、Wikiページを全件取得する、というところまででお預けです。
没アイディア供養のため、Wikiの鮮度一覧を取得するGASを書きました。
https://github.com/watarukura/BacklogWiki2Gsheet

## まとめ
chrome-extension、すぐに作れて簡単にお気に入りのツールを機能拡張できるのでおすすめです。
chrome webstore公開も考えたのですが、開発者登録しているとアドベントカレンダーの締切が・・・。

## 参考にさせていただいたサイト
- [Backlog用chrome拡張機能(slide method for Backlog) を公開しました](http://www.cyamax.com/entry/2016/08/22/121601)

[ハンズラボ Advent Calendar 2018](https://qiita.com/advent-calendar/2018/handslab) 明日3日目は@rednesです！
[AWS]Auto Scalingで終了されるインスタンスの選択基準

# はじめに
Auto Scalingの（デフォルトの）終了ポリシーが毎回よくわからなくなるので、ちょっと整理してみました。
スケールインが発生した場合、AZ→インスタンスの順で判定が発生します。

（参考ページ）
https://aws.amazon.com/jp/autoscaling/
https://docs.aws.amazon.com/ja_jp/autoscaling/ec2/userguide/as-instance-termination.html

# 判定①AZの選択（マルチAZ構成の場合）
1. 稼働中のインスタンスが最も多い
2. 起動設定（Launch Configuretion）が最も古いインスタンスが所属している
3. 1,2に該当するAZが複数ある場合はランダム

「起動設定が古い」とは、要するに起動時間が一番長い、ということらしい。

# 判定その②インスタンスの選択
1. 起動時間（Launch Configuretion）が最も古い
2. 課金発生時間が最も近い
3. 1,2に該当するインスタンスが複数ある場合はランダム

（こちらも参考）
https://qiita.com/iron-breaker/items/2b55da35429da7b19e49
【はじめての機械学習】レコメンドの基礎

# 1. レコメンドとは？	
レコメンドは、人工知能ブームが来る前からずっと使われてきた機械学習の活用方法の一つです。
レコメンドの例としては以下があげられますね。
- おススメ商品・コンテンツの自動選定
- Amazon・Youtubeなどで表示させるおススメ商品・コンテンツの選定
- ニュースサイトで読者が関心の強い記事を選定
- Qiitaでも下に出てきますね
- マッチングサイト上での紹介者を選定
TinderやPairsなど

#2. レコメンドに必要なデータって？
レコメンドの評価には、大きく以下のデータが使われています。
- ユーザーからのアイテム評価データ
- ユーザーの属性（特徴）データ　
- アイテムの属性（特徴）データ　

# 3. ユーザーベースレコメンドとアイテムベースレコメンド
- ユーザーベースレコメンドがおススメする商品は？
  コメンド対象者と好みの傾向が似たユーザーを探し、その類似ユーザーが過去に
  高い評価を与えた商品のうち、レコメンド対象者がまだ購入していない商品

- アイテムベースレコメンドがおススメする商品は？
  レコメンド対象者が過去に高い評価を与えた商品と、
  似たような評価を付けられる傾向がある商品

# 4. コールドスタート問題	
新規ユーザー・新規アイテムが増えた際に、評価データが集まるまでレコメンドが出来ない問題があり、コールドスタート問題と呼ばれています。コールドスタート問題の解決方法としては以下があります。

## 4-1. 新規ユーザーのコールドスタート問題解決方法
類似ユーザーが過去に高い評価を与えたアイテムをおススメする方法です。
必要なデータとしては、ユーザーの属性（特徴）データ、ユーザーのアイテム評価データを用います。

## 4-2. 新規アイテムのコールドスタート問題解決方法
類似アイテムを特定し、類似アイテムに高い評価を与えたユーザーに新規アイテムをおススメする方法です。必要なデータとしてはアイテムの属性（特徴）データ、ユーザーのアイテム評価データがあります。

(参考) [新アイテムは行動履歴がないからレコメンドできない」モンダイを解決するには](https://eczine.jp/article/detail/2865)

# 5. 予測精度(レコメンドの精度)を向上させるには？
レコメンドの予測精度を向上させる方法としては以下のような方法があります。
- ユーザーの属性情報を見直す
- 商品の属性情報を見直す
- ユーザー評価として採用する情報を見直す

#（参考）レコメンドの成功事例
- [Spotifyって機械学習をどう活用してるの？⇒元社員がQuoraで回答](http://incubit.co.jp/blog/ai/development/machine-learning-by-spotify/)

- [Netflixのレコメンドは行動を分析　性別や年齢は対象外](https://trendy.nikkeibp.co.jp/atcl/pickup/15/1003590/060101710/)
Tomcatのルートディレクトリで、warファイルにアクセス

# 手順

1. Tomcat の ROOT ディレクトリ名変更
2. Eclipse でファイルエクスポート
3. war ファイルを配置

## Tomcat のROOT ディレクトリ名変更

/var/lib/tomcat8/webapp/ 以下にある ROOT ディレクトリを ROOT2 に名前変更

## Eclipse でファイルエクスポート

1. プロジェクト名を右クリック
2. エクスポートをクリック
3. Web → warファイルを選択し、次へ
4. 宛先 → 参照 → ファイル名を「ROOT」にして、保存

## war ファイルを配置

エクスポートされた、ROOT.warファイルを /var/lib/tomcat8/webapp/ 以下に配置する。

配置後、10秒程度で自動的に、/var/lib/tomcat/webapp/ROOT ディレクトリが新しく作られ、中に ROOT.war の内容が展開されている。

※ROOT.warファイルを削除すると、自動的にROOTディレクトリも削除される。
【OpenCV】画像の一部のみ処理するＲＯＩの設定について【Python版】

# はじめに

かなり前に、[画像の一部のみ処理するＲＯＩの設定について【OpenCV2.x,3.x】](https://qiita.com/wakaba130/items/91ddc8c9d1cbf9ea8eda)という記事を書いていましたが、
最近は、C++を使わず、Pythonばかりいじるようになってきたので、Python版のROI設定をメモ書きしようと思います。

#　サンプルコード

サンプルコードは前回と同じ、画像のぼかし処理です。

```python
##
# cording:utf-8
##

import numpy as np
import cv2

def main():
    # 画像入力
    img = cv2.imread("test.jpg")

    print(img.shape)

    # 処理領域を設定(left(x1), top(y1), right(x2), bottom(y2))
    roi = (937,218, 1280, 350)

    # 出力の初期化(入力画像を複製)
    dst_img = img.copy()

    # ROI領域を抜き出し、抜き出した画像をぼかす
    # [top:bottom, left:right] 順序
    s_roi = img[roi[1]: roi[3], roi[0]: roi[2]]
    s_roi = cv2.blur(s_roi, (30, 30)) # ぼかし処理

    #　出力画像の同じ箇所に埋め込み
    dst_img[roi[1]: roi[3], roi[0]: roi[2]] = s_roi

    # ぼかした領域をわかりやすくするために入力画像に矩形描画
    rect_img = img.copy()
    cv2.rectangle(rect_img, (roi[2],roi[3]), (roi[0],roi[1]), (0, 255, 0), 2)

    # 描画
    cv2.namedWindow("image", cv2.WINDOW_AUTOSIZE | cv2.WINDOW_FREERATIO)
    cv2.namedWindow("dst_image", cv2.WINDOW_AUTOSIZE | cv2.WINDOW_FREERATIO)
    cv2.imshow("image", rect_img)
    cv2.imshow("dst_image", dst_img)
    cv2.waitKey()

    cv2.destroyAllWindows()

if __name__ == '__main__':
    main()
```

#　結果

今回もあかりちゃんに犠牲になってもらいました。
犠牲の犠牲にな・・・
緑の枠の部分をぼかしています。

![rect.jpg](https://qiita-image-store.s3.amazonaws.com/0/104675/f1250a95-6148-5dff-670e-db4fb9e028b3.jpeg)

![dest.jpg](https://qiita-image-store.s3.amazonaws.com/0/104675/e37bafa7-a3da-2b93-48a0-e66793cb693d.jpeg)
pythonでサクッとmultithreadなサーバーを立てる

```python
def thread_func(client):
    try:
        # Receive the data in small chunks and retransmit it
        while True:
            # Check if all data is received
            data = client.recv(4096)
            do_something()
    except:
        traceback.print_exc(file=sys.stdout)
    finally:
        # Clean up the connection
        client.close()


def create_server():
    sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)

    sock.bind(server_address)
    sock.listen(1)

    with ThreadPoolExecutor() as executor:
        while True:
            # Wait for a connection
            client, client_address = sock.accept()
            executor.submit(thread_func, client)

if __name__ == '__main__':
    create_server()
```
Flutter VSCodeでデバッグする際にオプションを追加する

開発環境を変更する際に`flutter run --target`で切り替えを行なっていますが
VSCodeのF５デバッグでも設定できないかと思い調べたのでメモ。

`Debug` ->`Open Configuration` ->`launch.json`

```
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Flutter",
            "request": "launch",
            "type": "dart",
            "args": [
                "--target",
                "lib/main_stg.dart",
                "--flavor",
                "staging"
            ]
        }
    ]
}
```

`flutter run`に渡すオプションはここで設定できるのでflavorも渡せますね
まずはこれ！画像解析用のデータセット基本4選

## データセットとは？何につかう？
機械学習でモデルを作って学習をさせるのには大量のデータが必要になります。
しかし、そんな大量のデータを自分で取ってくるのは
気が遠くなります・・・

そこで、公開されているデータセットを活用して学習を行います。


## MNIST
一番の定番。0〜9までの10種類の手書き文字の28×28サイズのグレースケールの画像データを60000枚集めたものです。正解のラベルデータも付いています。

公式サイト:http://yann.lecun.com/exdb/mnist/

![スクリーンショット 2018-11-30 0.21.25.png](https://qiita-image-store.s3.amazonaws.com/0/317125/0cc0a299-6ec9-9057-bf1c-d38a327a67ee.png)

![スクリーンショット 2018-11-30 0.24.31.png](https://qiita-image-store.s3.amazonaws.com/0/317125/f9c85b1f-825c-a5c5-c801-caa4794ee41f.png)

![スクリーンショット 2018-11-30 0.24.48.png](https://qiita-image-store.s3.amazonaws.com/0/317125/8feacc96-366c-0adf-f02e-15b6e53d2a89.png)

こんな感じの手書き文字が60000枚入っています。


## CIFAR-10
32×32サイズの画像60000枚が10種類のラベルとセットで含まれています。
画像とラベルの種類はairplane,automobile,bird,cat,deer,dog,frog,horse,ship,truckの10種類です。

公式サイト:https://www.cs.toronto.edu/~kriz/cifar.html


![スクリーンショット 2018-11-30 0.28.51.png](https://qiita-image-store.s3.amazonaws.com/0/317125/618c4b81-8d05-6255-f5e8-b6faa8c4b14f.png)


↓こちらの記事でCIFAR-10のデータを表示させています
「kerasとMatplotlibを使ってデータセットCIFAR-10の画像を表示させて遊んでみた」
https://qiita.com/kenfukaya/items/db531bd08f57c93ff1b0




## ImageNet
約1420万点以上の画像、2万種類以上のラベルを使用して分類されています。
公式サイト:http://image-net.org/

![スクリーンショット 2018-11-30 0.36.27.png](https://qiita-image-store.s3.amazonaws.com/0/317125/4267dc00-944a-7e0e-1c81-6a78c17a5cc1.png)




## Open Image dataset
Googleにより提供されている約900万点の画像URLとそれらについてのラベルや物体領域などのアノテーションデータを含むデータセットです。

参考リンク:https://ai.googleblog.com/2016/09/introducing-open-images-dataset.html
[Apex] なぜ Account account = new Account(); と書いてはいけないのか

## TL;DR
* 変数名にオブジェクト名を使用してしまうと、変数のスコープ内でそのオブジェクトの静的メソッド、静的変数が使用できなくなってしまう。

## はじめに
ApexにはJavaにはないApex特有の落とし穴があります。


以下の書き方をよく目にしますが、いずれも避けるべき書き方です。

```java
User user = new User(Id = UserInfo.getUserId());
Order order = new Order();
Result result = validateInput();
```

つまり、変数名にオブジェクト名を小文字にしただけのものを使ってはいけないということです。
なぜなら、場合によってはコンパイルエラーになるからです。
通常、エラーにならないので見落としがちですが、Enumだと確実にエラーになります。

```java
public with sharing class Class001 {
	public enum Enumtest {HOGE}

	// Ok
	private void method001(Enumtest e) {
		System.debug(Enumtest.HOGE);
	}

	// NG
	// classes/Class001.cls: Static field cannot be referenced
	// from a non static context: HOGE from the type Class001.Enumtest (Line: 13)
	private void method002(Enumtest enumtest) {
		System.debug(Enumtest.HOGE);
	}

}
```

なぜエラーになるのか、例をあげて説明したいと思います。


## 例
### Apexクラスの場合
以下のクラスがあるとします。

```java:SampleClass.cls
public with sharing class SampleClass {
    public static void staticMethod001() {
        System.debug( LoggingLevel.DEBUG, 'hello' );
    }
}
```

次の記述はコンパイルされます。

```java:ok
SampleClass sampleClass = new SampleClass();
```

次の例もコンパイルされます。

```java:ok
SampleClass.staticMethod001();
SampleClass sample = new SampleClass();
```

ただし、次はコンパイルエラーになります

```java:ng
SampleClass.staticMethod001();
SampleClass sampleclass = new SampleClass();
```

## エラーの理由
エラーの内容は `Static field cannot be referenced` です。
つまり、インスタンスから静的メソッドを使用することはできないと言っています。
以下の場合も同じエラーが発生します。

```java:ng
String str = '';
str.valuOf(1);
```

先程の例では、 `SampleClass.staticMethod001();` の `SampleClass` が、クラスではなく、変数で宣言した `sampleclass` と解釈されたということです。

忘れがちですが、Apexは大文字と小文字を区別しません！！
そのため、このようなことが発生します。

## Apex なぜ Account account = new Account(); と書いてはいけないのか
SObjectクラスも静的な変数を持っています。
以下のように記述するとエラーになります。
エラーになる可能性がある以上、`Account account` のような記述は避けるべきです。

```java:ng
Account account = new Account();
SObjectField token = Account.Name;
```