OmniAICreator/Qiita-1.07M huggingface dataset:
[Rails] solidus herokuデプロイ

#はじめに
solidusで作ったECサイトをherokuにデプロイする方法
herokuブランチを切ってから試してみてください。

```
# 実行環境
 ruby 2.4.1
 rails 5.1.4
```


##1.database.ymlの変更

```database.yml
#変更後
production:
  <<: *default
  adapter: postgresql
  database: db/production.postgresql
  pool: 5
  username: test_postgre
```

##2.gitignoreの確認

```
# vendor/bundle以外のvendorがGitの管理対象に入っているか確認
git ls-files | sed -e '/^[^\/]*$/d' -e 's/\/[^\/]*$//g' | sort | uniq

# 入っていなければ手動で追加
git add /vendor

```

##3.application.rbの変更


```
# 以下をconfig/application.rbに追加

config.assets.initialize_on_precompile = false
```

```config/application.rb
require_relative 'boot'

require "rails"
# Pick the frameworks you want:
require "active_model/railtie"
require "active_job/railtie"
require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "action_view/railtie"
require "action_cable/engine"
require "sprockets/railtie"
# require "rails/test_unit/railtie"

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module Hogehogeec
  class Application < Rails::Application

    config.to_prepare do
      # Load application's model / class decorators
      Dir.glob(File.join(File.dirname(__FILE__), "../app/**/*_decorator*.rb")) do |c|
        Rails.configuration.cache_classes ? require(c) : load(c)
      end

      # Load application's view overrides
      Dir.glob(File.join(File.dirname(__FILE__), "../app/overrides/*.rb")) do |c|
        Rails.configuration.cache_classes ? require(c) : load(c)
      end
    end

    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.

    config.time_zone = 'Tokyo'
    config.generators.test_framework = :rspec
    config.generators.system_tests   = false
    config.generators.stylesheets    = false
    config.generators.javascripts    = false
    config.generators.helper         = false
    config.assets.initialize_on_precompile = false  #追加
    .
    .
    .

    end
  end
end
```

##4.Gemfileの変更

**変更後**

```
# mysqlを下記のように:development,:test環境へ移動してgem 'pg'を:productionに追加

group :development, :test do
　・
　・
　・
　・
  gem 'mysql2', '>= 0.3.18', '< 0.5'
end

# 追加
group :production do
  gem 'pg'
end
```
`bundle install --without production` #production用のgemを除いてbundle install




##6.デプロイ


```
heroku login
heroku create
heroku pg:reset DATABASE
bundle exec rake assets:precompile
git push heroku master(pushするブランチがmasterでない場合　-> git push heroku ブランチ名:master)

heroku addons:create heroku-postgresql
heroku run rails db:migrate
heroku run rails g spree:install
heroku restart
```
上記コマンドを一つずつ実行して下さい。
##7.補足　CDNの読み込み(応急処置)

デプロイ後にfont-awesome(Facebookなどのアイコン)が読み込まれない場合は`application.html.erb`の`<head></head>`内に以下のstylesheet_link_tagを追加してみてください。

```layouts/_head.html.erb
<%= stylesheet_link_tag "application", 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.css', :media => "all" %>
```
for-in文内のメソッド名のちょっとしたこと Swift

JSONからforで情報を取り出すときに教えてもらったこと
  
  ``````swift
  for platform in platforms {
      let moreDetailPlatformName = platform["name"].stringValue
  }
  ``````


ループの中などはスコープがその中に限られているので、moreDetailPlatformなのはわかりきってるはず。そのため、こういうときはnameとかtimeでも伝わる。

  ``````swift
 for platform in platforms {
      let name = platform["name"].stringValue
 }
  ``````


ただ、このforの中でいくつかの情報を取り扱うのであれば、それらと区別しなければいけないので上のコードの書き方の方がいいかも。
【BigQuery】StandardSQLで最頻値（modeやtop）

DBのとあるカラムから出現回数が一番多い値（最頻出）をだしたいときに使えるやつです。カテゴライズされた値とかとか。

エクセルだとmodeというので一発でだせるみたいですが（使ったことないけど）
それをBigqueryのStandardSQLでやる方法です。

ちなみにLegacyだと `TOP`という関数で行けるみたいです。

## APPROX_TOP_COUNT

```sql
SELECT
  APPROX_TOP_COUNT(x, 1) AS approx_top_count
FROM
  UNNEST(["apple", "apple", "pear", "pear", "pear", "banana"]) AS x;

```

こう書くことで対象のカラムで最も出現する単語を出すことができます。


![スクリーンショット 2018-12-14 16.43.25.png](https://qiita-image-store.s3.amazonaws.com/0/186346/a8453b4c-251d-371f-a442-282e9337440d.png)

注意する必要があるのは、
`カラム名.value`
と
`カラム名.count`

という形で2列でてくるところです。

valueのほうには一番多く出てくる単語が表示され、
countのほうには、カラムxの中からvalueが何個でてきたか。が出力されます。

最初は、「countいらねえよ！！」
とか思ったんですけどこれすごくありがたいですね。本当にすみませんでした。

第二引数のところに２とか入れれば上位２件のvalueを出力してくれます。幸せいっぱいですね。

![スクリーンショット 2018-12-14 16.48.25.png](https://qiita-image-store.s3.amazonaws.com/0/186346/351094a9-6d6c-12a8-be6d-8c4847ef2f64.png)


## 参考(ドキュメント)

https://cloud.google.com/bigquery/docs/reference/standard-sql/functions-and-operators?hl=ja#approx_top_count
Firebase Cloud Functionsの導入手順

#はじめに

`Firebase Could Functions`を導入する手順がわかりづらかったのでまとめてみました。
都合上、スクリーンショットの一部を隠していますがご了承ください。また、以下はターミナル(`Mac OS`)で行っています。

#導入手順
- `Node.js`と`Firebase CLI`を設定する
    - `Firebase CLI`をインストール
    - `Node.js`をインストール
- `Firebase`のアカウントと連携する
    - `Firebase`にログインする
    - 連携するアカウントを選択する
- `Firebase Cloud Functions`をプロジェクトと連携する
    - `Firebase Cloud Functions`を利用したいプロジェクトのディレクトリまで移動する
    - `Firebase Cloud Functions`を初期化する
    - 使用する言語を選択する `JavaScript` or `TypeScript`
    - `ESLint`を使用するか選択する
    - `npm`をインストールするか選択する
- 完了



#Node.jsとFirebase CLIを設定する

**`Firebase CLI`をインストール**

```terminal
npm install -g firebase-tools
```
**`Node.js`をインストール**

```terminal
brew install node
```

`Node.js`とはサーバサイドで動く`JavaScript`のこと

`Node.js`についてはもっと知りたいという方は以下の記事を参考にしてください。
[Node.js を5分で大雑把に理解する](https://qiita.com/hshimo/items/1ecb7ed1b567aacbe559)



**※`Homebrew`をインストールしていない場合はまず`Homebrew`をインストールしましょう。**

```terminal
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

`Homebrew`とはパッケージをインストールしたりアンインストールしたりできるシステムのこと

`Homebrew`についてはもっと知りたいという方は以下の記事を参考にしてください。
[homebrewとは何者か。仕組みについて調べてみた](https://qiita.com/omega999/items/6f65217b81ad3fffe7e6)

#Firebaseのアカウントと連携する

**`Firebase`にログインする**

```terminal
firebase login
```

**連携するアカウントを選択する**
![スクリーンショット 2018-12-14 15.54.47.png](https://qiita-image-store.s3.amazonaws.com/0/255167/2698a88e-c866-d7ab-328f-7289866940c8.png)


#Firebase Cloud Functionsをプロジェクトと連携する

**`Firebase Cloud Functions`を利用したいプロジェクトのディレクトリまで移動する**

```terminal
cd ~ 任意のディレクトリ名
```

**`Firebase Cloud Functions`を初期化する**

```terminal
firebase init functions
```

![スクリーンショット 2018-12-14 16.06.22.png](https://qiita-image-store.s3.amazonaws.com/0/255167/479b0054-3853-2037-a924-29706d89e2ad.png)

**使用する言語を選択する `JavaScript` or `TypeScript`**
![E80C1B49-3157-4328-AC23-E3441F12F0E3.png](https://qiita-image-store.s3.amazonaws.com/0/255167/024fcc88-512e-bcda-e7f4-23e66a7e5358.png)

**`ESLint`を使用するか選択する**
![D775851F-70AF-4959-B587-9CF41E9BFBA3.png](https://qiita-image-store.s3.amazonaws.com/0/255167/ffebb833-de13-ccca-96b4-d073bd1d9771.png)
`ESLint`とは`JavaScript`のコードが正しいかチェックするツールのこと

`ESLint`についてはもっと知りたいという方は以下の記事を参考にしてください。
[ESLint 最初の一歩](https://qiita.com/mysticatea/items/f523dab04a25f617c87d)



**`npm`をインストールするか選択する**
![B30F06AB-24CA-4988-89BA-E36B25C3E2AD.png](https://qiita-image-store.s3.amazonaws.com/0/255167/08eb4917-3078-92e2-e476-51b0a9d04a90.png)
`npm`とは`Node.js`のパッケージを管理するためのもの

`npm`についてはもっと知りたいという方は以下の記事を参考にしてください。
[npm入門](https://qiita.com/maitake9116/items/7825d90c09f3e2f87dea)


#完了

**完了画面(ターミナル上)**
![スクリーンショット 2018-12-14 16.21.36.png](https://qiita-image-store.s3.amazonaws.com/0/255167/cfb7a8b4-7f42-54d3-98ec-24baaad806ef.png)

**完了画面(ディレクトリ上)**
![スクリーンショット 2018-12-14 16.28.37.png](https://qiita-image-store.s3.amazonaws.com/0/255167/1416cae2-63ca-02f1-b79c-1f33fd13df9e.png)

#おわりに

以上がざっくりとした`Firebase Cloud Functions`の導入手順でした。
次回は実際に使用するときの手順をまとめてみたいと思います。
Unityのシェーダでステンシルを使う際のComparison Functionの定義値

uGUIのUIにカスタムのシェーダーを適用させる時は基本的に、公式のビルトインシェーダからUI-Defaultを引っ張ってきて、これを下地にコーディングすることでカスタマイズします。
（そうしないとuGUIで用意しているマスク等の機能が働かなくなるのと、実行時にワーニング吐きまくったりする）。
その標準で用意されている機能の中の、ステンシルの比較関数についてですが、外から変更できるようにStencil Comparisonとしてパラメータ化されています。
![aaaa.jpg](https://qiita-image-store.s3.amazonaws.com/0/153804/c05e9813-7be1-5f64-09e5-8c96b29e9661.jpeg)


この値に何が設定されるとどうなるか、ですが、なぜか[こちらの公式マニュアル](https://docs.unity3d.com/ja/current/Manual/SL-Stencil.html)だと、Enumの定義順通りに載っていない罠が仕掛けられており、ちょっと混乱したのでメモしておきます。
※ちなみにStencil Operationについては定義順通りに記載されているようです。

## CompareFunction（比較関数）

| 項目       |       値 |    説明    |
|:-----------------|------------------:|:------------------|
| Disabled             |              0|        ステンシルテストを無効にします。        |
| Never           |            1 |       常にステンシルテストを通しません。|
| Less             |              2 |        ピクセルのレファレンス値がバッファの値より小さい場合のみレンダリングします。|
| Equal               |            3 |         ピクセルのレファレンス値がバッファの値と等しい場合のみレンダリングします。|
| LEqual             |         4 |       ピクセルのレファレンス値がバッファの値より小さいか等しい場合のみレンダリングします。|
| Greater          |         5 |      ピクセルのレファレンス値がバッファの値より大きい場合のみレンダリングします。|
| NotEqual         |          6 |      ピクセルのレファレンス値がバッファの値と等しくない場合のみレンダリングします。|
| GEqual         |          7 |      ピクセルのレファレンス値がバッファの値より大きいか等しい場合のみレンダリングします。|
| Always         |          8 |      	常にステンシルテストをパスさせます。デフォルト値。|






## 参考リファレンス
[Unity マニュアル - ShaderLab:ステンシル](https://docs.unity3d.com/ja/current/Manual/SL-Stencil.html)
[Unity Scripting API - CompareFunction](https://docs.unity3d.com/ScriptReference/Rendering.CompareFunction.html)
[Unity Scripting API - StencilOp](https://docs.unity3d.com/ScriptReference/Rendering.StencilOp.html)
Brainfuck インタプリタを実装する

# はじめに

プログラミングを上達するにはコンパイラを自作すると良いという話を聞いたことがあります。
気軽に言っていますが、コンパイラなんて私のような木っ端エンジニアにはとても書けそうにないです。
そこで、私の知る限り最も低水準な言語 Brainfuck で、コンパイラでなくインタプリタならなんとか書けるんじゃないか…？ということでやってみました。
使用する言語は Scala です。

# Brainfuck とは

8種類しか命令が無い言語です。
Wikipedia 参照。
https://en.wikipedia.org/wiki/Brainfuck

# 実装

思ったより長くなってしまったので、この記事には載せきれませんでした。
以下のリポジトリにあります。
https://github.com/soycoffee/scala-brainfuck-interpreter

# テスト

Wikipedia の "Example" から "Hello World!", "ROT13" が動作することを確認しました。

# 所感

ネストしたループをいかに処理するか、コメントをどう除去するか、と意外に考えるところは多かったです。
せっかくなので関数型っぽく書こうとしたのですが、なかなか苦戦しました。
`Stream` の扱い方など、理解が甘かったところを再確認できました。

# おわりに

簡単すぎず難しすぎず、ちょうどいい手ごたえでした。
コーディング試験の課題なんかにちょうどいいんじゃないでしょうか。
個性が表れそうなので、他の人の実装も見てみたいです。
bash_profileをSublimeText3で開く方法

- 環境
    - macOS Mojave バージョン10.14.1
    - Sublime Text Version 3.1.1
- 補足: Windows10とCentOS7(GUI)でもできました。

```bash
# ただ開くと「テキストエディット」というもので開きますがSublimeTextがいいんです。
$ open .bash_profile
```

[コマンドラインからSublimeTextを起動する - ゆずめも](https://yuzu441.hateblo.jp/entry/2015/07/19/220632) を参考にしました。

# SublimeTextのコマンドを確認する
```bash
# コマンドを確認して
$ ls -l /Applications/Sublime\ Text.app/Contents/SharedSupport/bin/
total 104
-rwxr-xr-x  1 mana  admin  50064  6  3  2018 subl
# 叩くとSublimeTextが起動した
$ /Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl
```

|OS|コマンド|
|:-:|:-:|
|macOS|/Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl|
|Windows|{インストールディレクトリ}/Sublime\ Text\ 3/subl|
|CentOS|{インストールディレクトリ}/sublime_text/sublime_text|

# sublのエイリアスを.bash_profileに設定する

```bash
# 追記して
$ echo "alias subl='/Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl'" >> ~/.bash_profile
# 反映する
$ source ~/.bash_profile

# PATHを通したわけじゃないから探せないけど
$ which subl
# sublでSublimeTextが起動できるようになった。
$ subl
```

# sublで.bash_profileをSublimeTextで開けるようになる

```bash
$ subl .bash_profile
```

- `subl` コマンドの活用 : [Sublime Textでphp.iniを開くコマンドを作ってみた - Qiita](https://qiita.com/ponsuke0531/items/2aab86653defee9ffe87)
2018年に拡充されたMackerel AWSインテグレーションの紹介と思い出など


# はじめに

この記事は、[Mackerel Advent Calendar 2018](https://qiita.com/advent-calendar/2018/mackerel)の14日目の記事です。

はじめまして。私はアイレット株式会社で開発エンジニアをしています。
この度、ご縁がありまして、MackerelのAWSインテグレーション開発を担当させていただいております。

2018年の8月から開始して、12月までの間に5つのサービスに対応したAWSインテグレーションをリリースしています。
ここでは、拡充されたAWSインテグレーションの開発を行ってきた思い出も絡めて紹介したいと思います。

AWSインテグレーションの設定方法については、公式のヘルプと、クラスメソッド様の記事でも丁寧に紹介いただきましたので、そちらもご参照ください（クラスメソッド様ありがとうございます！）。

[Mackerelヘルプ AWSインテグレーション](https://mackerel.io/ja/docs/entry/integrations/aws)
[MackerelのAWSインテグレーション機能でDynamoDBとCloudFrontを監視対象にした手順](https://dev.classmethod.jp/cloud/aws/enable-mackerel-aws-integration-for-dynamodb-and-cloudfront/)

## DynamoDB
アイレットとの共同開発第1弾として、DynamoDBインテグレーションが2018年9月にリリースされました。
テーブル単位でホストとして登録されます。<br>[<img src="https://qiita-image-store.s3.amazonaws.com/0/320367/a4e317e0-4d3d-8f6d-2795-2514d1958cb3.png" width="65%">
](https://mackerel.io/ja/blog/entry/weekly/20180925)<br>私自身、Mackerelについて無知であったのと、Go言語にも不慣れで開発に苦労しました…。
Mackerelチームの方々に多大なるサポートをいただき、何とか完成させることが出来ました。
大変だっただけにリリース告知が出た時は感動しました。
幸いユーザの方々にも良い反応をいただけているそうで、本当にやって良かったなと思っています！



## CloudFront
共同開発第2弾です。CloudFrontインテグレーションが2018年10月にリリースされました。
ディストリビューション単位でホストとして登録されます。<br>[<img src="https://qiita-image-store.s3.amazonaws.com/0/320367/dfbdf89b-5cce-feb2-4642-3f56c0838bb7.png" width="65%">
](https://mackerel.io/ja/blog/entry/weekly/20181015)<br>ユーザの方々から要望があったCloudFrontが第2弾として決定しました。
アイレットで構築している中でも利用頻度で上位に入るサービスです。
CloudFrontは取得できるメトリックの数が少ないので、[プラグイン](https://github.com/mackerelio/mackerel-agent-plugins/tree/master/mackerel-plugin-aws-cloudfront)と同等のグラフ定義となりました。



## API Gateway
第3弾のAPI Gatewayは11月にリリースされました。
こちらはAPIごとにホストとして登録します。<br>
[<img src="https://qiita-image-store.s3.amazonaws.com/0/320367/20787962-602c-5c3a-1274-9b753c8e0b91.png" width="65%">](https://mackerel.io/ja/blog/entry/weekly/20181112)<br>API Gatewayも取得できるメトリックはあまり多くありません。
グラフ定義としてはシンプルなものになっていると思います。
AWSインテグレーションだと手軽に設定できるので、便利に使っていただけるのではと思います！




## Kinesis Data Streams
第4弾はKinesis Data Streamsです。2018年11月にリリースされました。
こちらはストリームごとにホストとして登録します。<br>[<img src="https://qiita-image-store.s3.amazonaws.com/0/320367/60ab2f35-9336-12ae-1b61-8c0a9e995a1c.png" width="65%">](https://mackerel.io/ja/blog/entry/weekly/20181128)<br>Kinesisで取得できるメトリック数は比較的多いですが、イメージの付きやすいメトリックだったので、グラフとしてはスムーズにまとまった印象です。
この頃になると慣れもあり、少し余裕が持てるようになってきました。



## S3

告知はまだですが、S3のインテグレーションが2018年12月にリリースされました。
こちらはリクエストメトリックの設定が行われているバケットごとにホストとして登録します。

[AWSインテグレーション - S3](https://mackerel.io/ja/docs/entry/integrations/aws/s3)

上記、Kinesisのところで
>少し余裕が持てるようになってきました

と書いたばかりでしたが、S3でまた少し苦労しました…
また色々とMackerelチームの皆さまにご協力いただきました。



# 終わりに

まだAWSインテグレーション開発は進行中です。来年以降もさらに拡充させていく予定になっています。
ユーザの方々から要望があるサービスを優先して検討されているので、もし希望のサービスがありましたら、要望を出せば対応されるかもしれません！
最後に、Mackerelチームの皆さんはとても優秀な方ばかりで、しかも皆さん本当に優しいんです:joy:！
今回Mackerelチームの皆さんと共同開発をさせていただいた中で、コミュニケーションをとても大事にされていると感じました。この記事をご覧のみなさんも、積極的にMackerelのイベントなどに参加されてみては如何でしょうか！
react+reduxでRedux DevToolsで生成されるテストを活用

以下、react+reduxはセットアップ済みが前提となります。

# Jestセットアップ
```
npm install --save-dev jest
```
`package.json`に以下を追加

```json
{
  "scripts": {
    "test": "jest"
  }
}
```
### 参考ページ
[Getting Started](https://jestjs.io/docs/ja/getting-started)

# Babelセットアップ
```shell
npm install --save-dev babel-jest babel-core regenerator-runtime
```
プロジェクトのルートフォルダーに `.babelrc`ファイルを追加して、以下を記述。

```json
{
  "presets": ["env", "react"]
}
```
### 参考ページ
[Babel を使用する](https://jestjs.io/docs/ja/getting-started#babel-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B)

# Redux DevToolsセットアップ
以下から使用するブラウザに応じてインストール
[Installation](https://github.com/zalmoxisus/redux-devtools-extension#installation)

Chromeの場合は → [Redux DevTools](https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd)

`createStore`の引数を以下のように調整

```jsx
 const store = createStore(
   reducer,
+  window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
 );
```

### 参考ページ
[With Redux](https://github.com/zalmoxisus/redux-devtools-extension#1-with-redux)

# テスト作成
Redux DevToolsのTest欄からコピペでテスト作成。importなどは適当に調整。
ツールは以下参照。Test欄は動画のレイアウトだと右端中央あたり。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="und" dir="ltr"><a href="https://twitter.com/hashtag/memo?src=hash&amp;ref_src=twsrc%5Etfw">#memo</a> <a href="https://t.co/0pWViKm5JK">https://t.co/0pWViKm5JK</a></p>&mdash; m (@m3816) <a href="https://twitter.com/m3816/status/1073481194111549446?ref_src=twsrc%5Etfw">2018年12月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# 動作確認
プロジェクトルートで`npm run test`でテストがスタートするはずです。
音声品質についての資料

IP電話になって、音声品質の評価基準が大きく変化したかもしれない。

音声通話の利便性よりも、料金に見合う通話を考えるきっかけを記録。


音声品質評価法　NTT
http://www.ntt.co.jp/qos/technology/sound/index.html

IP 電話の通話品質評価法 一般社団法人 情報通信技術委員会
http://www.ttc.or.jp/jp/document_list/pdf/j/STD/JJ-201.01v9.pdf

IP電話の通話品質の話
http://www.hitachi-systems-ns.co.jp/column/11.html

IP 電話の音声品質評価と品質制御に関する検討
https://ci.nii.ac.jp/els/contentscinii_20181214161526.pdf

IP電話通話品質評価法の標準化動向
https://www.oki.com/jp/Home/JIS/Books/KENKAI/n202/pdf/202_R28.pdf

IP電話サービス（23種類）の料金と音質を比較する
http://blog.jikoman.jp/2015/11/ip-denwa-hikaku.html


# 文書履歴(document history)
ver. 0.01 初稿 20181214
ver. 0.04 URL追記　20230302

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
kubectlで接続先AKSクラスターを切り替える方法

複数のAzure Kubernetes Serviceを運用する際のメモです。

# 接続先クラスターの追加方法

```
az aks get-credentials -g [Resource Group Name] -n [AKS Cluster Name]
```

# 操作するクラスターの切り替え方法

* 登録されているコンテキストを確認します。CURRENTに*が付いているクラスターが現在操作対象になってます。

```
$ kubectl config get-contexts
CURRENT   NAME                CLUSTER             AUTHINFO                                   NAMESPACE
*         k8s-cluster-1       k8s-cluster-1       clusterUser_k8s-cluster_k8s-cluster-1
          k8s-cluster-2       k8s-cluster-2       clusterUser_k8s-cluster_k8s-cluster-2
```

* k8s-cluster-2に切り替えます。

```
$ kubectl config use-context k8s-cluster-2
```
Plotlyの日付軸の設定

# Plotlyの日付軸の設定
Plotlyの積み上げ棒グラフを作っていたときに日付軸の設定でいくつか調べたので残しておきます。


## 日付軸の設定

### 日付軸の開始日を指定

日付の開始日を指定したい場合は以下のように「tick0」に日付を指定します。

```javascript:plotly_test.js

var layout = {
  xaxis: {
    tick0:: '2018-05-15'　// 開始日
  };
```

開始日を日付型の変数で持っている場合は以下のように文字列結合してあげます。

```javascript:plotly_test.js
...
var start_date = new Date('2018-05-15T00:00:00')
...
var layout = {
  xaxis: {
    tick0:[this.start_date.getFullYear(), this.start_date.getMonth() + 1, this.start_date.getDate()].join('-') // 開始日
  };
```


### 日付軸を一定間隔で表示

日付軸を一定間隔で表示するには「dtick」に**ミリ秒で**設定します。
例えば，X軸が日付で1週間ごとに表示する場合は以下のように指定します。

```javascript:plotly_test.js

var layout = {
  xaxis: {
    dtick: 7*24*60*60*1000 // 7日（7日×24時間×60分×60秒×1000）
  };
```

恥ずかしながら”dtick:7”って指定して「なんでだ？！」ってなりました・・・。
Pythonを2から3に切り替えよう!!

## はじめに
python使ってたら文字コードの問題が発生。

```
 UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0: ordinal not in range(128)
```

Stack Over flow:
[I want to use utf-8 with python 2.7](https://stackoverflow.com/questions/53718750/i-want-to-use-utf-8-with-python-2-7)

文字コードが`utf-8`のシステムでデフォルトが`asciii`の`Python v2`だと問題が起きるみたい。
しかも、2020年には`python 2`のサポートも終了するとのこと。
デフォルトの文字コードを変えるより、デフォルトが`utf-8`の`Python v3`に切り替えたほうが良さそうだね。
それじゃあ、やっていきますか!!

## 参考文献
[それでもPythonのversionを切り替えたい](https://qiita.com/bootsnin/items/5735f667a83beaca078b)

## v2からv3へ切り替え
### 現状確認

![Screenshot from 2018-12-14 15-07-09.png](https://qiita-image-store.s3.amazonaws.com/0/218398/4c3d5de3-7bc7-b836-fa98-175c9ac0b8e1.png)
![Screenshot from 2018-12-14 15-07-18.png](https://qiita-image-store.s3.amazonaws.com/0/218398/7c2164bc-94fb-c630-82a3-3b5490bbdd7c.png)

python v3もちゃんとあるね。

### pyenvの導入
[参考文献](https://qiita.com/bootsnin/items/5735f667a83beaca078b)によると、`python`のバージョン切り替えには`pyenv`を使うのが良さそう。
`pyenv`の導入の参考にさせてもらったのはこの記事。
[pyenvのインストール、使い方、pythonのバージョン切り替えできない時の対処法](https://qiita.com/koooooo/items/b21d87ffe2b56d0c589b)

#### PCに導入
```
$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv
```

#### bash_profileの編集
```
$ vim ~/.bash_profile
```
次の内容を`~/.bash_profile`に記入

```.bash_profile
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```
書けたら、読み込み

```
$ source ~/.bash_profile
```

これで`pyenv`が使えるようになったね。
試しに、インストールできるバージョンの一覧を表示してみるか。

```
 $ pyenv install --version
```

･･･思ったよりたくさんあった。

### v3へ
`pyenv`に`python3`と同じバージョンをインストール。
たぶんそれがLTSだと思うし。

```
$ pyenv install 3.6.7
```

そして、それをPC全体に適用させる。

```
$ pyenv global 3.6.7
```

![Screenshot from 2018-12-14 15-32-07.png](https://qiita-image-store.s3.amazonaws.com/0/218398/fbe7b9dc-b8b2-8b62-e5f1-db73f9bb0f4e.png)


…できてないじゃん。

### 問題解決
検索してみると解決策発見。
[【pyenv】ubuntu16.04でのpython環境の構築](https://qiita.com/banaoh/items/00aea13fe045fab7e8ba)

つまり、パッケージが色々足りんとのこと。

まずは

```
$ sudo apt install zlib1g-dev
```

それでもう一回。

```
$ pyenv install 3.6.7
```

<img src="https://qiita-image-store.s3.amazonaws.com/0/218398/21b2a15b-b2c6-aa3c-e61a-ea903a1e9ddf.png" height="300px">



…できたのか?

![Screenshot from 2018-12-14 16-05-44.png](https://qiita-image-store.s3.amazonaws.com/0/218398/6592dcd2-962b-ceea-0125-5c50a43aac76.png)

(できて)ないです。

エラーを見てみると、まだ足りないパッケージがありそう。

```
$ sudo apt install libssl-dev
```

終わったら、もう一回。

```
$ pyenv install 3.6.7
```

![Screenshot from 2018-12-14 16-14-07.png](https://qiita-image-store.s3.amazonaws.com/0/218398/394e7dae-4221-22c0-f932-a7726261791c.png)

できたっぽいね。

### 環境に適用
```
$ pyenv global 3.6.7
$ python --version
```

これでOK!!
動画からGIFアニメーションを簡単作成

##無料で動画からGIFアニメへと変換できる方法を紹介します。

**【動画からGIF作成する方法】**

**・Aconvert**
**・GIFMAGAZINE**
**・動画変換マスター**

####1、[Aconvert](https://www.aconvert.com/jp/video/mov-to-gif/)
https://www.aconvert.com/jp/video/mov-to-gif/

Aconvertは各種類のメディアファイルの変換ができるオンラインサービスです。動画からGIFへ変換するだけではなく、PDFやオーディオなどの変換もできます。操作しやすくて、使い勝手がとてもいいです。
![aconvert-edit-20181212.jpg](https://qiita-image-store.s3.amazonaws.com/0/267745/26a4b84e-f5ea-6d77-1837-d0399d05a8bb.jpeg)

####2、[GIFMAGAZINE](https://www.aconvert.com/jp/video/mov-to-gif/)
https://gifmagazine.net/converters/movie_to_gif

GIFMAGAZINEは動画、YouTubeと画像からGIFを作成することができる、オンラインのGIFアニメ作成ツールです。

![gifmagazine-select-20181212.jpg](https://qiita-image-store.s3.amazonaws.com/0/267745/7baf0456-cfd7-bd45-e6b2-4d59d3eff4b7.jpeg)

最大6秒のGIFアニメを作成することが可能です。また、動画のスタート位置を自由に設定して、動画をGIFに変換できるのが特徴です。

![gifmagazine-edit-20181212.jpg](https://qiita-image-store.s3.amazonaws.com/0/267745/d7909355-c72d-46d6-bac6-d11691cc32e8.jpeg)

####3、[動画変換マスター](https://download.aoscdn.com/down.php?softid=videoconverter)
https://download.aoscdn.com/down.php?softid=videoconverter

「動画変換マスター」は動画をいかなるフォーマットに変換できるソフトです。動画変換以外に、簡単な動画編集、ダウンロードとスクリーン録画機能も備えています。「動画変換マスター」を利用して、動画の全体ではなく、「トリミング領域を選択」で動画を部分的にGIFへ変換することができます。

![videoconverter-edit-20181212.jpg](https://qiita-image-store.s3.amazonaws.com/0/267745/91529075-bd53-d98e-8a83-e3b727b5d8be.jpeg)

--------------------------------

以上は、動画からGIFアニメーションを簡単に作成する方法の紹介です。ソフトのダウンロードとインストールが面倒くさいと思う方なら、オンラインツールを利用して、動画をGIFアニメーションに変換してください。もし、動画を軽くトリミングしたり、必要な部分だけを切り取ったりしたいなら、動画変換マスターがオススメです。
laravelでファイルを保持する方法

## 背景
私はphpのlaravelというフレームワークを使っています。
あるツールを作っている時、データベースにファイルデータを入れる前に画面遷移がありました。その時アップロードファイルをどのように保持すればいいか、苦労したので共有したいと思います。

## ファイル保持の仕方
まずはrequestで送られてきたファイルデータを関数を使って読み込む。

```
$file = $request['file_data']

$fileData = file_get_contents($file->getRealPath())

$fileName = $file->getClientOriginalName();

```


これらをsessionを使ってブラウザに記憶させる。
名前空間でsessionを宣言する。

```
use Session;

```

以下のようにしてsessionに記憶させる

```
Session::put('file_data', $fileData]);
Session::put('file_name', $fileName);
```

これでsessionに記憶することができました！


## ファイル取得の仕方
以下のようにして取得する

```
$fileData = Session::get('file_data');
$fileName = Session::get('file_name');
```

これらをデータベースに挿入すれば画面遷移があってもアップロードファイルを保持することができます！




## 苦労した点
sessionではなく、viewのinputで送ろうとしたが、input typeのfileはあくまでアップロード機能であり、valueを使うことはできません。
またsessitonにファイルデータをそのまま入れようとした場合、シリアライズ可能でないオブジェクトをキャッシュすることはできないそうです。
シリアライズというのは.....ぐぐってみると
『ソフトウェア内部で扱っているデータをそのまま、保存したり送受信することができるように変換することです。』
と記載されていました。

sessionにもキャッシュできるものできないものがあるのですね。とてもいい勉強になりました。
MacOS X (Mojave)でPython3.5がインストールできなかった

pyenvで 3.5.6 をインストールしようとしたら以下のエラーがでた。

```
BUILD FAILED (OS X 10.14.1 using python-build 20180424)

zipimport.ZipImportError: can't decompress data; zlib not available
make: *** [install] Error 1
```

#### 1. zlib がないみたいだったのでインストール

```
$ brew install zlib

-> 治らない
```

#### 2. xcode　が要るらしいので一応確認　

```
$ xcode-select --install

-> インストール済
```

#### 3. macOS_SDK_headersとかいうツールがMojaveの場合デフォルトで入ってこないのが原因らしいので手動で落とす。
```
$ sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

$ pyenv install 3.5.6
Installed Python-3.5.6 to /Users/bambis13s/.pyenv/versions/3.5.6

-> 成功〜！
```

## 参考

[[MacOS Mojave]pyenvでpythonのインストールがzlibエラーで失敗した時の対応](https://qiita.com/zreactor/items/c3fd04417e0d61af0afe)
[MacでPython 3.5.0インストールに失敗したら](https://qiita.com/maosanhioro/items/bf93540515d4ea75b222)
今後に向けて新しいBIツールを導入した話

こんにちは。Data Focusの石塚です。
私は11月にPLAIDに参画したばかりなのですが、Data Focusも10月にできたばかりの新しい組織です。

今回の記事ではData Focusの紹介も兼ねて、弊社にて8月に導入したLookerの導入までの経緯と今後の展望について紹介したいと思います。
こちらの投稿はPLAID Advent Calendar 2018の14日目の記事でもあります。
https://qiita.com/advent-calendar/2018/plaid

## BIツールはいくつか使っていた
Data Focusはデータにまつわる全ての業務を担当するチームであり、BIツールもそのひとつです。
しかし、当然ながらチーム発足前からBIツールは使っていました。

SaaSのベンチャーらしくPLAIDでは他社のツールをとにかく使ってみる文化であり、BIツールも同様に複数使用してきました。
最初はChartioを使っていたようですが、Looker導入時のツール使用状況はこんな感じです。

- 経営指標の可視化
    - Domo
    - 一度締まった元データは変更できないように管理
- 日常のビジネスでのデータ可視化
    - Mode
    - ビジネスサイドメンバーがエンジニアに依頼して作ってもらったレポートを閲覧
- 開発におけるデータ確認
    - Mode
    - BIツールと言うよりはSQL Runnerとして使っている
    - BigQueryの純正画面が使いにくいというのが主な理由

## BIツールの有効性に関する疑問
社員のBIツール使用状況から、次第にこんな課題を感じてきました。

- 核となるツール・担当者が存在しない
    - 各々で好きなやり方でデータの取りまとめを実施しており一般化されていない
    - ビジネスメンバーは複数のエンジニアメンバーにデータ取得を依頼しており、ノウハウが蓄積されていない

- 非エンジニア（主にビジネスサイド）のメンバーはデータを作成できない
    - データの作成のSQL記述にエンジニアのサポートが必要となり業務スピードが遅くなる


## そんな中Lookerを選んだ理由
既存のBIツールを更新する方針も検討しましたが、以下3つの理由からLookerの導入を決定しました。


1. イケてるベンチャーが導入している
2. ビジネスサイドの分析が自走できそう
3. 将来的にKARTE内のサービスとして埋め込めるかも

<b>1. イケてるベンチャーが導入している</b>
まず、他社の導入事例がありました。
Quipperやメルカリなどの会社が導入していたことが、もともと新しいサービスを貪欲に使ってみる文化と相まって検討が始まりました。

- Quipper : https://quipper.hatenablog.com/entry/2018/06/04/080000
- メルカリ : https://tech.mercari.com/entry/2018/08/22/155059

<b>2. ビジネスサイドの分析が自走できそう</b>
次に、ビジネスサイドの課題解決です。
従来のツールだとどうしてもエンジニアへ随時集計やレポート作成の依頼が必要でした。
Lookerはエンジニアの作業領域とデータ閲覧の領域が明確に分かれています。
そのためSQLが苦手な非エンジニアでも手軽にデータ集計できることが最大の魅力でした。
もちろんそれ以外にも導入のメリットはあるのですが、そのあたりは前述のブログを是非ご一読ください。

<b>3. 将来的にKARTE内のサービスとして埋め込めるかも</b>
最後に、今後の展望も視野に入れていました。
現在弊社が提供しているKARTEにはBIの機能があまり充実していません。
今後社内で開発していく選択肢ももちろんあるのですが、社外のツールを機能として埋め込むことも考えています。
Lookerは既に世界中のツールに埋め込んで提供している事例があり、そういう意味でも一度使ってみる価値があると判断しました。

## 導入に伴う変化
多くのツールはリリース後に効果が実感されると思いますが、弊社の場合、リリース前・リリース後の２段階で効果が出ました。

<b>■リリース前</b>
まずリリース前の段階で「データに関する議論の活発化」が発生しました。
導入に向けて動くことでBIツールの中心人物ができたため、これまで各自で溜め込んでいたデータ分析に対する要望がどんどん表出化しました。
例えば「XXXXがみたい」「XXXを確認したい」といった意見がオープンに出てきて、それに伴う新たなデータ分析の要望も生まれてきました。
このような議論により、見るべき指標とその見方に対する社員の感度が上昇したと感じています。


<b>■リリース後</b>
8月の終わりから試験的に導入を始めて一部のメンバーにアカウントを渡したところ、想定していた以上に反響がありました。
ビジネスメンバーにとっては意思決定スピードの向上が感じられているようです。
Looker導入前後のデータ生成プロセスを比較するとこんな感じです。

- 導入前：需要発生　→　エンジニアに依頼　→　エンジニアが作業　→　データ確認
- 導入後：需要発生　→　　　　　　<b>Lookerにてデータ生成</b>　　　　　→　データ確認

このプロセスの変化の効果が最も感じられるのは会議の場です。
先日お客様データの集計結果について議論した際は、議論の流れからその場で複数のクロス集計を実施し、即座に議論を深化させることができました。
従来の「エンジニアへ依頼→会議を再設定→・・・」という流れと比較すると議論のリードタイムが1日以上短くなったと実感できます。



## これから実現したいこと
導入当初は見られるデータが少なかったり設定が適切ではなくQueryが遅かったりしていて、要望に対して改修が追いつかずに大変でした。
今はやっと一通りのデータがある程度整理された状態で集計できるようになってきており、全社的に活用を始めようとしています。


現在は自社クライアントのデータを集計する社内向けの利用しかしていませんが、知見が溜まってきたら社外への展開も検討を進めていくつもりです。

将来的にはお客さまの成功事例をそのままパッケージ化して、クリックひとつで簡単にダッシュボードが作れるというようなことまでやっていきたいなと考えています。
Python Django 環境セットアップ　1. Local PC



#はじめに
この記事では、必要な作業環境のセットアップを、最低限の事をメモで書いています。


###サンプル環境の考え方
拡張性の高いテキストエディタをなにか導入します
Pythonやりたいという声をよく聞くのでPythonでやってみます。（他の言語でもOK）
クラウドはAzureでやってみます。（他のクラウドでもOK）



#手順メモ
###Python on VS Code


- テキストエディタを入れておく
    - VS Code
        - DLサイト　https://code.visualstudio.com/download　
    - テキストエディタってなに？
        - 参考サイト　完全初心者におすすめのテキストエディタ【Visual Studio Code】
            - https://taroken.org/recommended-editor-for-beginners/
- VSコード用のPython拡張をインストール
    - Extentionの検索窓から、Python と入力すれば、拡張モジュールが出てくるので導入する
    - もしくは、以下のウェブサイトから入れてもOK
        - https://marketplace.visualstudio.com/items?itemName=ms-python.python　
- Python 実行環境
    - どうにかして Python 3x インストールします
        - （基本のやり方） python.orgからのダウンロード。 
        - （macOSでHomeBrewを使う場合） brew install python3 
        - (データサイエンティスト志向の場合) Anacondaからのダウンロード
- 環境変数
    - Windowsでは、PATH環境変数にPythonインタプリタの場所が含まれていること
        - （確認）CMDでpathを実行します
        - （設定）Windowsの設定を開いて「環境」を検索し、アカウントの環境変数を編集
    - MacOSでは、VSコードのインストール場所がPATH環境変数に含まれていること
        - Siriから Codeと入力してコマンド起動するとちょっと便利
- Django いれる

```bash
$ pip install Django
Requirement already satisfied: Django in /Users/.virtualenvs/env1/lib/python3.7/site-packages (2.1.3)
Requirement already satisfied: pytz in /Users/.virtualenvs/env1/lib/python3.7/site-packages (from Django) (2018.7)
$ django-admin startproject proj1 
$ python manage.py migrate
python manage.py startapp he
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
```

- Django のアプリを作成して、ブラウザで確認する

```
$ python manage.py startapp helloapp
$ python manage.py runserver
Performing system checks...

System check identified no issues (0 silenced).
December 13, 2018 - 16:54:06
Django version 2.1.3, using settings 'proj1.settings'
Starting development server at http://127.0.0.1:8000/
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/60530/4e125ee1-6019-8e0a-61ae-72dc756caf38.png)



#関連記事
Python Django 環境セットアップ　1. Local PC
https://qiita.com/dms/items/61fade6b73fdc058703c

Python Django 環境セットアップ　2. Cloud Server (Azure PaaS編)
https://qiita.com/dms/items/042b2cebeb3b21f7121c

Python Django 環境セットアップ　3. Cloud Server (Azure IaaS編)
https://qiita.com/dms/items/6ff9ee4e7158810ee485
画像読み込み速度比較

# この記事の内容
- imread関数の速さを比較します。

# 追記（2020.2.26）
- pillowのImage.openがやたらと速いのはそもそもの処理が違うからということについて、[こちら](https://qiita.com/m-shimao/items/e2ccb122eb4c106ebec7)をどうぞ。

# imreadとは？
画像データを読み込む際に使われる関数ですが、いろいろなモジュールに同じ名前で組み込まれています。
以下では、scipy、matplotlib、opencv、imageio、pillowで画像をロードし、その速さを比較します。
pillow(PIL)はimreadではないですが、比較してみます。

# 比較方法

- Corei7 (I7-7567U)で処理します。
- [レナ](http://www.lenna.org/lena_std.tif)さんをロードします。
- 下のようにして1, 10, 100, 1000, 10000回読み込みます。
- 各読み込み回数ごとに10回試行し、平均を取ります。

```load_lena.py
import sys
import time
import statistics
import scipy.misc as misc
import matplotlib.pyplot as plt
import cv2
import imageio
from PIL import Image


def load_imread(how):
    if how == "scipy":
        imread = misc.imread
    elif how == "plt":
        imread = plt.imread
    elif how == "cv2":
        imread = cv2.imread
    elif how == "imageio":
        imread = imageio.imread
    elif how == "PIL":
        imread = Image.open
    return imread


def load_img(path, imread):
    for i in range(10000):
        imread(path)


if __name__ == '__main__':
    times = []
    imread = load_imread(sys.argv[2])
    for i in range(10):
        t = time.time()
        load_img(sys.argv[1], imread)
        times.append(time.time() - t)
    print(statistics.mean(times))
```
```compare.sh
python load_lena.py lena_std.tif scipy
python load_lena.py lena_std.tif plt
python load_lena.py lena_std.tif cv2
python load_lena.py lena_std.tif imageio
python load_lena.py lena_std.tif PIL
```

# 結果
|module |       1|       10|       100|       1000|      10000|
|-------|--------|---------|----------|-----------|-----------|
|scipy  |  1.7604|  10.1680|  105.7542|  1106.6721|  9590.0972|
|plt    |  1.8986|   9.5794|  101.2807|  1060.2709|  9070.2802|
|cv2    |  1.0150|   8.7479|   90.4795|  1048.3251|  9753.4891|
|imageio|  1.8104|   9.4085|   69.5722|   764.6874|  7153.4754|
|PIL    |  0.8072|   4.1412|   28.9652|   301.9217|  2709.1016|

（いずれもミリセカンド）

![imread.png](https://qiita-image-store.s3.amazonaws.com/0/207596/eaa6f971-4215-46fe-6452-8de9083f4e88.png)
1回のみ読み込む際のopencvの速さと、全体を通して安定して早いPILが目立ちますね。また、10000回単位で読み込む際にはimageioかPILを使うのが良さそうです。

# ちなみに
- scipy, plt, cv2, imageioはnumpy配列で読み込まれますが、PILだけはPILイメージとして読み込まれ、numpy配列にするには変換する必要があります。
- scipy.miscのimreadは、deprecatedのため1.2.0で削除されます。代わりにimageioを使うことをおすすめされていますね。
知らない間にThingWorxが日本語表示に対応していたので切り替えてみた

# ThingWorxの表示言語切り替えについて
ちょくちょく質問のあった、ThingWorxのComposerやMashupBuilderの日本語表示ですが、知らない間に対応していたので切り替えてみました。

## 表示言語はユーザー毎に設定
ThingWorxではユーザー毎に表示言語を設定する、というUIになっています。ユーザー設定はセキュリティグループのユーザーで行います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111405/fe32b427-6f54-9e44-308f-1662e80f7d76.png)

LanguagesのEditボタンを押すと言語選択ダイアログが開きます。
Available Languagesのリストから表示させたい言語、ここでは日本語をドラッグ＆ドロップで右側のSelected Languageの下に移動させます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111405/5574cddd-e495-c2da-567e-b45870a49174.png)

## これでようやく日本語表示になりました
なんとなく親近感！？が沸きますね
### 従来型Composer画面
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111405/45bc3436-5f59-3975-8dff-e45dba890986.png)

### 新Composer画面
![image.png](https://qiita-image-store.s3.amazonaws.com/0/111405/a7fabe08-a07a-bd62-39c8-34c9c6d6cfc3.png)
webカメラによる書籍ISBNバーコード解析

# 背景
  バーコードリーダーが普及されているが、業務用なので、超小規模システム、個人などではなかなか
  手を出しづらい、それで、ノートパソコンのカメラを流用できないかを調査してみました。
# 目標
  ノートパソコンのカメラに書籍の裏面を映したら、ISBNバーコードを読み取り、コードを返す。

# 環境
    python   3.7
    opencv2  3.4.4.19
    pyzbar   0.1.7
# ライブラリ のインストール
    pip install opencv-python
    pip install pyzbar

# カメラの使用方法
    
    capture = cv2.VideoCapture(0) # カメラ番号　capture = cv2.VideoCapture(1)
    cv2.namedWindow("Capture", cv2.WINDOW_AUTOSIZE)
    while True:
        ret, image = capture.read()
        if ret == False:
            continue
        image_mirror = image[:,::-1]
        cv2.imshow("Capture", image_mirror )
        keyInput = cv2.waitKey(3) 
        if keyInput == 27: # when ESC
            break

# 全体ソース 
 [ソースコード](https://github.com/wzwzliu/get_ISBN_by_web_camera)

# 感想
  web カメラでも高い認識率でバーコードを認識していることが分かった。pyzbarを開発した方に感謝！
pythonでメソッドのオーバーライドを禁止する

# 概要
pythonでクラスメソッドのオーバーライドを禁止したかったのですが、検索してもヒットしなかったので将来の自分のために書き残します。

**※追記**
@shiracamus さんからコメントで有益な情報をいただきました。
そちらのクラスを実装するのが現状の最適解かと思われます。

**※追記(19/2/4)**
あくまで実行前の処理になりますが、mypyのFinal methodsを使う手もありそうです。
https://mypy.readthedocs.io/en/latest/final_attrs.html#final-methods

# 結論
```python
class OverrideException(Exception):
    def __init__(self, method_name: str) -> None:
        super().__init__()
        self.method_name = method_name

    def message(self) -> str:
        return f'"{self.method_name}" method is can not be overwritten.'


class Parent:
    def __init__(self) -> None:
        not_override_methods = [
            'override_method'
        ]
        if self.__class__.__name__ != "Parent":
            for mtd in not_override_methods:
                if mtd in self.__class__.__dict__:
                    raise OverrideException(mtd)
                    
    def override_method(self) -> None:
        print("上書きしちゃダメよ")


class Child_1(Parent):
    def __init__(self) -> None:
        super().__init__()
    
    def override_method(self) -> None:
        print("しちゃった")


try:
    # オーバーライドしてるとエラー
    Child_1()
except OverrideException as e:
    print("Child_1: ", end="")
    print(e.message())


# 以下補足 =========================

class Child_2(Parent):
    def __init__(self) -> None:
        super().__init__()


try:
    # オーバーライドしてなければ問題なし
    Child_2()
except OverrideException as e:
    print("Child_2: ", end="")
    print(e.message())


try:
    # 親そのものを呼び出しても問題なし
    Parent()
except OverrideException as e:
    print("Parent側: ", end="")
    print(e.message())

```

# 補足
標準ライブラリ、標準関数とかに入っていたりしないんだろうか。
FlaskとElasticsearchで社内の簡易書籍管理システムを作ってみた

今の会社では社員に対して技術書の購入を推奨（会社費用）する制度を設けています。
各自読み終わった本は所定の書棚に格納するのですが、その冊数も徐々に増え始め、今後の増加も見越して、そういった書籍を管理するためのシステムを作成することにしました。

今回は、登録と検索を作成しました。将来的には機能を拡張していく予定です。

# レポジトリ
この記事の内容のコードは次のレポジトリに掲載しました
    https://github.com/michihosokawa/MiniBookManagementSystem

# 前提
社内で各技術者が購入した技術書を、社員（100人超）で共有することを想定しています。

# 構成
次のような構成にしました

- Python
- flask
- Elasticsearch
- Vue.js

※将来的なメンテナンスの省力化を考え、内部で流通するデータはJSON形式です
![簡易書籍管理システム.png](https://qiita-image-store.s3.amazonaws.com/0/132967/22d155e7-ab4e-7717-1bdd-e10429c68293.png)

# WebAPIの利用
書籍データを手作業で入力しようとすると、手間がかかるし、入力ミスが発生することがあります。
書籍登録に負担を感じるようだと、書籍登録自体が敬遠されてしまい、管理システムの意義が損なわれる恐れがあります。

そこで、すべての書籍に割り振られているISBNコード（13桁）を用いることにします。
（ISBNコードがない一部書籍などは、今回は対象外とします。）

入力されたISBNコードから書籍情報(JSON)を補完し、それを登録するシステムを考えることにします。

書籍情報がJSONデータで取得できるWebAPIとして、次のようなものがあります。

- [Google Books API](https://developers.google.com/books/)
    - 利用のための登録不要
    - 1000件/日の制限
- [openBD](https://openbd.jp/)
    - 利用のための登録不要

今回は、[Google Books API](https://developers.google.com/books/)を採用しました。
XMLやHTMLで取得できるAPIもありますが、そこから必要情報を抜き出す手間をかけたくありませんでした。
JSON形式で取得し、その中から必要な項目を参照し、書籍情報を取得します。

# flask
WebFrameworkの選択肢として、Djangoとflaskを考えました。
今回は、諸般の事情からflaskを採用しました。

# Elasticsearch
データの管理にはElasticsearchを使用します。

- JSONデータを管理できる
- 検索機能
    - 自然言語処理部（大文字小文字同一視など）が、設定レベルで実現できる
        - 処理をプログラムとして記述する必要がない
    - JSON記述による論理式での検索

# Vue.js
フロントには、Vue.jsを使いました。
得意分野ではないので、他で使っていたものを流用した形です。
Vue.jsとflaskを同時に使おうとすると、テンプレートエンジンの記述が競合してしまい。うまく動作しません。
今回は、Vue.jsのテンプレートしか使うつもりがなかったので、flask（jinja）側の記述を差し替えることで対応しました。

# 今後の拡張（予定）
- 基本機能の補足
    - 一覧表示機能
    - 登録失敗時のエラー処理
- 基本機能の拡充
    - ISBNコードの入力
        - キー入力ではなく、カメラでのスキャンによる入力
    - 欠落書籍対応
        - GoogleBooksAPIには格納されていない書籍情報があります
        - 存在しないものに対しては、[openBD](https://openbd.jp/) の情報も使うことで網羅性が上がることが期待できます
    - 書影
        - 書影をカメラ撮影して登録することを考えます
        - 撮影は、表紙の外側に映った個所を削除して形状を補正したうえで登録したいです
- 管理機能の拡張
    - 各種管理情報の入力
        - 登録者、購入日 など
    - 貸し出し管理機能
        - 借りた人、貸出日、返却予定日
    - 紛失書籍の対応

# 参考
- [Google Books API からJSONデータを取得してjQueryで処理する](https://qiita.com/TakeshiNickOsanai/items/2d9c30cedcba21f36669)
- [FlaskとVue.jsを組み合わせて使う](https://muunyblue.github.io/0b7acbba52fb92b2e9c818f7f56bac99.html)
- [Vue.jsでimgタグのsrcをバインドさせる際の注意点](http://tk2000ex.blogspot.com/2017/11/vue.html)
rspec-railsでjbuilderを使う場合にJSONをチェックしたい

Viewをレンダリングする必要があるので、 render_views します。

```
describe HogeController do
  render_views
end
```

rails_helperに追加したい場合は、

```
RSpec.configure do |config|
  config.render_views
end
```

と追加します。

参考:
https://relishapp.com/rspec/rspec-rails/v/3-8/docs/controller-specs/render-views
jQueryでページ内全画像のsrc属性の末尾に適当な文字列（ランダムの数字）をつける

画像をキャッシュさせず、ページ表示のたびロードさせたい時、なおかつ、楽天GOLDのようなサーバサイドではなく、ブラウザ側だけで対処したい時に。


```javascript
$(function(){

	//ランダムの数字を作る
	var rand = parseInt(Math.random()*10000);

	$('img').each(function(){
		//imgのsrc属性取得
		var src = $(this).attr('src');
		//src末尾に?xxxx のランダム数字を追加
		var src_added = src + '?' + rand;
		//src属性の書き換え
		$(this).attr('src',src_added);
	});

});
```
iTunes Connect登録時のスクリーンショット、Appプレビューのサイズについて

# iTunes Connect登録時のスクリーンショット、Appプレビューのサイズについて
## はじめに
忘れやすいのでiTunes Connectで使用するスクリーンショット関連のメモ
> iOS12.1現在

App Storeに表示される画像と動画には名前が付いていて、それぞれ

画像 ＝ **スクリーンショット**

動画 ＝ **Appプレビュー**

という名称になっている

## 編集可能なタイミング

- 編集が可能なタイミング
	- 提出準備中
	- 審査待ち
	- 輸出コンプライアンス待ち
	- 却下済み
	- メタデータ却下済み
	- デベロッパにより却下済み
	- デベロッパによりストアから削除済み
- 削除はいつでも可能

## 登録サイズ
### Appプレビュー
- **最大登録数3つ**
- 最大ファイルサイズ**500MB**
- 最小再生時間**15秒**
- 最長再生時間**30秒**
- デフォルトのポスターフレーム再生時間**5秒**
- フォーマットは**H.264**と**ProRes 422**
- サポート拡張子
	- H.264
		- .mov
		- .m4v
		- .mp4
	- ProRes 422
		- .mov


##### App プレビューの解像度

| デバイスサイズ  | 解像度 (V: 縦、H: 横) |
|:------------- |:---------------:|
| 5.5 inch | V: 1080 x 1920<br>H: 1920 x 1080 |
| 6.5 inch | V: 886 x 1920<br>H: 1920 x 886 |
| 12.9 inch | V: 1200 x 1600<br>H: 1600 x 1200 |
| AppleTV | 1920 x 1080 |
| Mac | 1920 x 1080 |

[詳しくはこちら](https://help.apple.com/app-store-connect/?lang=ja-jp#/dev4e413fcb8)

### スクリーンショット
- 必須のデバイスサイズが存在する(Required)
- 最大登録数**10枚**
- iPhone X系のデバイスには角丸で表示される

| デバイスサイズ  | 解像度 (V: 縦、H: 横) | Required |
|:------------- |:---------------:|:--------:|
| 6.5 inch | V: 1242 x 2688<br>H: 2688 x 1242 ||
| 5.8 inch | V: 1125 x 2436<br>H: 2436 x 1125 ||
| 5.5 inch | V: 1242 x 2208<br>H: 2208 x 1242 | ○(iPhone) |
| 3.5 inch | V(ステータスバーなし): 640 x 920<br>V(ステータスバーあり): 640 x 960<br>H(ステータスバーなし): 960 x 600<br>H(ステータスバーあり): 960 x 640 ||
| 12.9 inch | V: 2048 x 2732<br>H: 2732 x 2048 | ○(iPad) |
| 11 inch | V: 1668 x 2388<br>H: 2388 x 1668 | |
| Watch | シリーズ3: 312 x 390<br>or<br>シリーズ4: 368 x 448 | ○(Watch) |
| AppleTV | 1920 x 1080<br>or<br>3840 x 2160 | ○(AppleTV) |
| Mac | 1280 x 800<br>or<br>1440 x 900<br>or<br>2560 x 1600<br>or<br>2880 x 1800 | ○(Mac) |

[詳しくはこちら](https://help.apple.com/app-store-connect/?lang=ja-jp#/devd274dd925)

### オプショナルの解像度の扱い

オプショナルのデバイスサイズにスクリーンショット、Appプレビューを登録しなかった場合はRequiredのスクリーンショット、Appプレビューが拡大、縮小されて表示される。
TFS > サーバー移行（オンプレミス）



## サーバー移行元

TFS管理コンソール

チームプロジェクトのデタッチ
![image](https://qiita-image-store.s3.amazonaws.com/0/49910/9c1543de-a2f0-e1d8-9303-74c357088748.png)

SSMSにて対象のDBをデタッチ

DBはTfs_プロジェクト名

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/aa0cd415-fa75-673d-090a-900650d4715a.png)


デタッチ後のファイルを、移行先サーバーへコピー


## サーバー移行先

移行先のDBにてアタッチ

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/e15ff5d1-eedc-3974-4da4-f053fc863d72.png)


![image](https://qiita-image-store.s3.amazonaws.com/0/49910/4ec75570-2cee-73d2-b23a-6189af42b318.png)
Haskell の勉強会を開いてみたら色々気づきがあったのでメモ

# はじめに

先日(2018-12-09)、友達を集めて[プログラミング Haskell](https://www.amazon.co.jp/dp/4274067815/)をみんなで勉強しようという勉強会を開きました。
基本的にもくもく会のスタイルで、詰まったりわかんなかったら相談、という流れです。

ぼくを除いて Haskell 未経験者で、処理系のインストールからやった人も居たのですが、 Haskell そのものから外れた部分でちょっとした気づきがあったのでメモします。

# 参加者

参加者は全員異なるバックグラウンドの人でしたが、
全員 IT の基本的なスキルはある人でした。
エディタも Atom, Visual Studio, Emacs などなどバラバラでした。

## A
ぼくです。大学に居た頃にプログラミング Haskell をひとおり勉強しました。
大学を出てからは特に使うこともなく、時折遊んでみる位だったのですが、最近またやってみたくなったので定期的に勉強会に出ています。

## B
普段は MATLAB で信号処理の計算をしている人。
最近 MATLAB の Lambda 式にハマって色々使っているので、 Haskell に興味を持ったとか。

## C
PHP でバリバリ色々作ってる人。最近は革の盾を作っている。

## D
インダストリアル・エンジニアリングの人。オペレーションズ・リサーチにも興味があるらしい。業務を圏論で書き下せないかみたいな事を言っていたので、ぼくが Haskell を教えたら勉強会開くながれになった。

## E
インフラ中心に色々やってたけど、最近はコンサルとかディレクションに移行しつつある人。自分の武器を増やしたいので参加したそうな。

# Stack

## Mac の場合

参加者に Mac ユーザが二人居て、
どちらも [stack](https://docs.haskellstack.org/en/stable/README/) で
GHC をインストールをしました。
stack から GHC をインストールするには gcc が必要になるので、
XCode をインストールしておく必要があります。
あと、 stack 最初に GHC が無いと動かなかったりする?ので、
brew あたりから別途入れといたほうがいいかも。

## Windows Defender に注意

参加者の一人は Windows 10 ユーザでした。
stack から GHC インストールしていたのですが、
Windows Defender をオンにしたところ、 stack がマルウェアとして削除されてしまったとのこと。

僕も Windows 10 で WSL から stack で使っていても同じ現象が起きてないのですが、そういうこともあるようです。

# Haskell

## GHCi は GHC でコンパイルする場合とは多少挙動が近いので注意

GHCi 上からパターンマッチで関数定義をすると、そのままだと上手くいかない現象がありました。

こんな関数を定義するとしましょう。

```
mysum [] = 0
mysum (x:xs) = x + mysum xs
```

このとき、これを ghci にそのままコピーして入力しても、
mysum は正しく定義されません。
なぜなら、二行目の定義で一行目の定義が上書きされてしまうからです。
この事は以下の一連の入力をすると確認できるでしょう。

```
x = 1
x
x = 2
x
```

x の値が変化することが見て取れるます。
複数行に渡る関数定義を行いたい場合は、
ghci の multiline command 機能を利用して以下のように記述します。

```
:{
mysum [] = 0
mysum (x:xs) = x + mysum xs
:}
```

この機能は以前の ghci には無かった(let を使わないと定義できなかった)気がするので、戻ってきた人はハマりやすい気がします。

## -1 の取り扱い

ghci 上で関数の引数に -1 をそのまま渡すと、以下のようにエラーが出てしまいます。

```
Prelude> func x = x + 1
Prelude> func -1

<interactive>:10:1: error:
    • Non type-variable argument in the constraint: Num (a -> a)
      (Use FlexibleContexts to permit this)
    • When checking the inferred type
        it :: forall a. (Num a, Num (a -> a)) => a -> a
```

これを避けるためには、 "()" や "$" を使う必要があります。

```
Prelude> func (-1)
0
Prelude> func $ -1
0
```

この原因は "-" 自体が演算子であるためです。
これに関する議論は以下の記事に記載されています。

+ [get rid of unary '-' operator](https://prime.haskell.org/wiki/NegativeSyntax)

get rid of unary '-' operator
https://prime.haskell.org/wiki/NegativeSyntax
Android でUDP通信をする

# コード
## パーミッションの設定
```xml:AndroidManifest.xml
    <uses-permission android:name="android.permission.INTERNET" />
```

## UDP Controller
```kotlin:UDPController.kt
package com.hoge.fuga.piyo

import java.net.DatagramPacket
import java.net.DatagramSocket
import java.net.InetAddress


object UDPController {
    var ip = InetAddress.getByName("ここにIPアドレス")
    var port = 5000

    fun receive() : String {
        // udpを受信して、文字列にして返す
        val socket = DatagramSocket(port)

        val buffer = ByteArray(8192)
        val packet = DatagramPacket(buffer, buffer.size)

        socket.receive(packet)
        socket.close()

        return String(buffer)
    }

    fun send(msg: String) {
        // udpで文字列を送信する
        val socket = DatagramSocket(port)

        val byte = msg.toByteArray();
        val packet = DatagramPacket(byte, byte.size, ip, port);

        socket.send(packet);
        socket.close()
    }

}
```

## アクティビティ
```kotlin:MainActivity.kt
package com.hoge.fuga.piyo

import android.content.Context
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.widget.Toast
import kotlinx.coroutines.experimental.android.UI
import kotlinx.coroutines.experimental.launch
import java.lang.Thread.sleep
import kotlin.concurrent.thread

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        thread  {
            while (true) {
                // UDP受信
                var msg = UDPController.receive()

                launch(UI) {
                    // UDP受信した内容を表示
                    Toast.makeText(this@MainActivity, "$msg", Toast.LENGTH_SHORT).show()
                }

                // UDP送信
                UDPController.send("hello")

            }
        }

    }
}
```
The easiest way to make LGTM image

- Write
- Take a photo
- Done!

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/539378b3-1cf8-2c1b-d7b6-fa323aaf3e80.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/ac264d6b-0b7f-0a87-ef00-71ac95ad7156.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
gitコマンドの整理【コミットの閲覧・編集】

# Git 過去のコミットの閲覧・編集
### コミット履歴を見る
```
git log

commit 45d86f8a3ab235d7adb4e2144e3301efd6ca3ce5    # これがコミットハッシュ
Author: toki <tokidrill@hoge.com>
Date:   Fri Dec 14 10:23:34 2018 +0900

    COMMIT MESSAGE    # コミットメッセージが表示される。
```
logのオプションはいい感じの記事を見つけたので、そちらを参照されたし。
https://qiita.com/take4s5i/items/15d8648405f4e7ea3039

### 特定のファイルに絞ってコミット履歴を見る
```
$ git log -p FILE_PATH
```

↑先祖返りしてしまったファイルを追跡するのに使った。

### コミット間の差分を見る
```
git diff COMMIT_HASH1 COMMIT_HASH2
```
※直前のコミットは```HEAD^```で表される。

#### ファイル名だけ
```
git diff --name-only COMMIT_HASH1 COMMIT_HASH2    # 差分のあったファイルのファイル名だけ出力してくれる。
```

### コミットの打ち消し(リバート)
指定したコミットを打ち消す差分を作ってくれる。
`-e` ( `--edit` )オプションをつけるか、省略した場合はコミットまで行ってくれる。
※あくまで逆差分のコミットを作るだけであって、コミット自体を消去するわけではない。

```
git revert COMMIT_HASH
```
revertに関していい感じの記事
https://qiita.com/chihiro/items/2fa827d0eac98109e7ee

### コミットの取り消し
指定したコミットの履歴を消去する。

#### コミットのみ取り消し
```
git reset --soft COMMIT_HASH
```
#### コミットとワークディレクトリ内の差分を取消
```
git reset --hard COMMIT_HASH
```
### コミットの上書き
commit message 編集するときとかに便利。

```
git commit --amend
```

### remoteリポジトリへの反映
revert や reset は、 push することによってremoteリポジトリに反映される。

```
git revert HEAD^
git push origin BRANCH
```
【MySQL】Keyのところに出る「MUL」の付け方

##なぜここに書くのか
前回のMySQL書き込みの際にPRIMARY KEYを後から付ける方法を書きましたが、別テーブルのユニークカラムのところに「MUL」と書いてあり、これがわからなかったため
https://qiita.com/qyuser/items/26a6e4dc1001bf3ab6ce

##MULって何
Multiple keyの略称とは書いていたけど
https://blog.halclan.net/entry/2014/07/09/000000
このページには「重複可能な外部制約キー」と書いていました。

我々初心者には、重複可能な外部制約キーと言われてもピンときません。
自分はこう噛み砕きました。

「インデックスのこと」

##解決策
```
ALTER TABLE table_Backup ADD INDEX table_Backup_index(othertable_unique_no);
```

##結果
####table_Backup
Field| Null|Key|
|:------------------|:-----------------|:------------------|
|table_A_no| No             | PRI              |
|othertable_unique_no| Yes           |  MUL           |


##おわりに
なぜindexつけたらMULなんだろうって、単に意味が繋がらないからなんでしょうね。
もっと深く勉強すれば共通する何かが見つかって覚えられるのですが、今のところ共通点が見つからず覚えられそうにないです・・・
INDとかIDXとでも表現しておけばいいのに。

～～2020年3月追記～～
自分のこの記事だけアクセスがかなり多く、皆さんMULに悩まされていることが伺えます。
mysql　MUL　でググると現状この記事が一番上に出てきますねｗ
お役に立てて何よりですm(_ _)m