OmniAICreator/Qiita-1.07M huggingface dataset:
scroll.fullScrollするとFocusが移動しちゃう問題

#TL;DR
安易なscroll.fullScroll()はFocusが勝手に移るから、面倒だけど↓これ使おう
https://stackoverflow.com/a/34866634

#注意事項
API Level 27環境です。
あんまりこういう事例見かけないから、betterなやり方があるのかも。

#要件
- 複数のEditTextやらTextViewやらが並ぶリストがある
- だいたいのViewにフォーカスが移るたびに何かしら処理させたい
    - それぞれのViewに応じて別のViewの表示/非表示を切り替えたいとか・・・
- View.OnFocusChangeListener使うか〜〜〜
- scroll.fullScroll()で最下段まで勝手にスクロールも、、、あれ？

#問題
**scroll.fullScroll()したら上段のEditText君にFocus当たってね？**
OnFocusChangeも呼ばれちゃって意図しない処理が実行される

#こんなコードを改修する
以下のコードが実行された直後の状態だと、おそらく画面に写っている、もしくはscrollvViewに格納されている最初の子ViewにFocusが移り、その子ViewのonFocusChangeイベントが発生します。（もちろんhasfocus=true）

```java:hogehogeFragment.java
〜省略〜

scroll.post(new Runnable() {            
    @Override
    public void run() {
           scroll.fullScroll(View.FOCUS_DOWN);              
    }
});

〜省略〜
```

そもそもそんな設計が間違っている、スマートじゃないという話しもありますが、なるべく少ない作業量で修正しなきゃいけない場面も来るわけで。


#試した事
Stackoverflowでの以下の質問。
[Android: ScrollView force to bottom](https://stackoverflow.com/questions/3080402/android-scrollview-force-to-bottom)

「bottomにスクロールしたいけどどうすんの？」みたいな質問に対して、色々回答がありますが、その中の[この回答](https://stackoverflow.com/a/34866634)が本問題に対する打開策になります。

```java:hogehogeFragment.java
〜省略〜

View lastChild = scrollLayout.getChildAt(scrollLayout.getChildCount() - 1);
int bottom = lastChild.getBottom() + scrollLayout.getPaddingBottom();
int sy = scrollLayout.getScrollY();
int sh = scrollLayout.getHeight();
int delta = bottom - (sy + sh);
scrollLayout.smoothScrollBy(0, delta);

〜省略〜
```

回答主も「Focus移っちゃうからこうしなよ」って感じのスタンスで書いています。

回答に寄せられているコメントを見ても、
- 「もっと評価されるべき！」
- 「これがベストアンサーだ！」
などなど賞賛されているので良いのでは？

実際に自分の環境でも変にOnFocusChangeが呼ばれず、無事解決しました。


#終わりに
なんでfullScrollしたらFocus移るん？って感じですが、冒頭に述べたように何かbetterな方法があるのかもしれません。ご参考までに。
VSCodeのVimプラグインでCmd+vでビジュアルブロックモードに移行したい

# この記事の対象者

* VSCode使い
* Vim操作使い
* ~~HHKB使い~~

# 経緯

~~普段HHKBを使っていて、~~Aの隣にあるCtrlにCmdを割り当てているんです。
※Macなら通常Aの隣はCtrl

でもそれだと、Vim操作で押しにくい位置に移動したCtrlを使わないといけなくなっちゃうんですよね。

ずっと`Karabiner`でCtrl+vとCmd+vをVSCode上でだけ置換する方法で我慢してたけど、ついに至高の設定を手に入れました。

# 設定

```json:.vscode/keybindings.json
[
// Place your key bindings in this 
	{
		"key": "cmd+v",
		"command": "extension.vim_ctrl+v",
		"when": "editorTextFocus && vim.active && !inDebugRepl && vim.mode == 'Normal'",
	}
]
```

満足(´ω｀)
VirtualBoxのゲストOS(Ubuntu)とホストOS(Windows10)の共有ディレクトリ作成

学校の研究でVirtualBoxからIBMCloudにデプロイするために、共有ディレクトリを作ることにした。

備忘録なのであしからず。

# 環境
- Windows10 home バージョン 1803
- VirtualBox バージョン 6.0.0
- Ubuntu バージョン 18.04 LTS
    - 自分の環境ではUbuntuがかなりカクカクだったから、SSH接続でTeraTermからUbuntuを操作した
        - 方法は「TeraTerm SSH VirtualBox Ubuntu」とかで検索したら出てくるだろうから割愛

# 手順
1. Windowsで共有用ディレクトリを作成
2. VitualBox マネージャーでUbuntuの「設定」から「共有フォルダー」の追加マークを選択し、「ディレクトリのパス」、「ディレクトリ名」に先程の共有用ディレクトリを追加し、「自動マウント」、「永続化する」のチェックボックスにチェックを入れて「OK」で設定保存
3. Ubuntu起動
4. Ubuntuのウィンドウのメニューの「デバイス」の「Guest Additions CD イメージの挿入」を選択し、それを実行（この辺曖昧）
5. Ubuntu再起動
6. これでUbuntuの/mediaにsf_共有ディレクトリ名ができているはず

一応ここまでで共有ディレクトリを作るだけなら終わり
ここからはちょっと使いやすくする手順

7. このままだと共有ディレクトリはrootじゃないと触れない
8. ユーザーをvboxsfグループに追加
```
$ sudo addusr Ubuntuのユーザー名 vboxsf
```
9. これでrootじゃなくても触れる様になった。
10. シンボリックリンク作成（Windowsのショートカットみたいな）
11. homeディレクトリで
```
$ ln -s /media/sf_共有ディレクトリ名 シンボリックリンク名
```

# 終わり
これするのにだいたい半日かかった。

理由はほったらかしにしていたUbuntuのアップデートがあったから。

これからはこまめにしようと思った。
python-dotenvを使って環境変数を設定する

##初めに

APIのキーやDBのパスワードなどをべた書きするのはあまり良くないと教わり環境変数に入れる方法を考えた際にpython-dotenvを使うことにしました。

公式のgitは[こちら](https://pypi.org/project/python-dotenv/)です。

##python-dotenvのインストールと.envファイル作成
インストール

```
$ pip install python-dotenv
```

また、環境変数を入れるためのファイルを作成します。

```
$ echo "ENV_KEY=hogehoge" > .env
```
これで.envファイルに"ENV_KEY=hogehoge" が入りました。
追加したい場合は、vsCodeやAtomなどのエディターでも作成出来ます。

##環境変数を渡したい場所に渡す

まずは環境変数ファイルの中身です（※以下いずれの形式でも問題なし）。

```.env
DB_NAME=dsn
USER_NAME="username"
PASSWORD = "password"
```
「settings.py」は.envファイルから値を読み込みます。`join(dirname(__file__), '.env')`で、「settings.py」の相対パスを取得し、joinで「.env」ファイルを指定します。dotenv_pathに格納された.envファイルのパスを元に、load_dotenvでファイルの中身を読み取ります。

```settings.py
import os
from os.path import join, dirname
from dotenv import load_dotenv

load_dotenv(verbose=True)

dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)

DSN = os.environ.get("DB_NAME")
USN = os.environ.get("USER_NAME")
PWD = os.environ.get("PASSWORD")
```

あとは「main.py」にimportして値を渡します。

```main.py
import ibm_db
import ibm_db_dbi
import settings

# print(settings.DSN)　*このように書くことで値が入っているか確認も出来ます
# print(settings.USN)
# print(settings.PWD)
DSN = settings.DSN
USN = settings.USN
PWD = settings.PWD


# 接続
conn = ibm_db_dbi.connect(DSN, USN, PWD)
cur = conn.cursor()

# SQL
cur.execute("select * from LT_SPSS_FMC")

# 列毎に集計
for row in cur:
    print("%s, %s, %s, %d, %s, %s, %s, %s" % 
          (row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7]))

conn.commit()

```

あとは実行して無事に終われば完了です。
順列や組合せを求めるプログラム

## ソースコード
```cpp
#include<bits/stdc++.h>
using namespace std;
const int MAX_N=100;
int f;
int v[MAX_N];
int N,R;

void combination(int now,int cnt,int goal){
  if(cnt==goal){
    for(int i=0;i<N;i++)if(v[i])cout<<i;
    cout<<endl;
    return;
  }
  for(int i=now;i<N;i++){
    if(!(f&(1<<i))){
      v[i]=1;
      f|=(1<<i);
      combination(i+1,cnt+1,goal);
      v[i]=0;
      f&=~(1<<i);
    }
  }
}

void permutation(int now,int cnt,int goal){
  if(cnt==goal){
    for(int i=0;i<goal;i++)cout<<v[i];
    cout<<endl;
    return;
  }
  for(int i=0;i<N;i++){
    if(!(f&(1<<i))){
      v[now]=i;
      f|=(1<<i);
      permutation(now+1,cnt+1,goal);
      v[now]=-1;
      f&=~(1<<i);
    }
  }
}
int main() {
  cin>>N>>R;
  cout<<"permutation"<<endl;
  for(int i=0;i<N;i++)v[i]=-1;
  permutation(0,0,R);
  cout<<endl;
  cout<<"combination"<<endl;
  for(int i=0;i<N;i++)v[i]=0;
  combination(0,0,R);
  cout<<endl;
  return 0;
}
```
## 実行例
```
4 3
permutation
012
013
021
023
031
032
102
103
120
123
130
132
201
203
210
213
230
231
301
302
310
312
320
321

combination
012
013
023
123
```
Railsアプリケーションデプロイ後にlib配下が読み込めない時の対処法

# 環境
Ruby 2.4.1
Rails 5.2.2

# Herokuにデプロイ後、lib配下のクラスなどが読み込めなくなる。
Railsでは、アプリケーション全体で共有する自作クラスなどを使用する際にはlibディレクトリにクラスを作成します。
例：　lib/utilities.rbを作成

```ruby:utilities.rb
class Utilities
  def search
    ・・・
  end

  def lookup
    ・・・
  end
end
```

このクラスをコントローラなどから呼び出すためには、自動的にlib配下を読み込む設定をconfig/application.rbに以下をするはずです。

```application.rb
・・・

module SampleApp
  class Application < Rails::Application
    ・・・
    config.autoload_paths += %W(#{config.root}/lib)
    ・・・
  end
end
```
ところが、本番環境(今回の場合はHeroku)にデプロイすると・・・
`NameError: uninitialized constant SampleApp`
というエラーが発生します。
SampleAppというクラスが読み込めないぞということです。

# 解決策
Railsが5.0にアップグレードされた際に、production環境では自動読み込みが無効化されるようになったみたいです。
[参考元:Railsアップグレードガイド](https://railsguides.jp/upgrading_ruby_on_rails.html#production-%E7%92%B0%E5%A2%83%E3%81%A7%E3%81%AE%E8%B5%B7%E5%8B%95%E5%BE%8C%E3%81%AF%E8%87%AA%E5%8B%95%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%8C%E7%84%A1%E5%8A%B9%E3%81%AB%E3%81%AA%E3%82%8B)
要するに、production環境では自動読み込み(autoload)ではなく一括読み込み(eager_load)になるので、以下のようにlib配下もeager_loadされるように設定すれば解決します。

```application.rb
・・・

module SampleApp
  class Application < Rails::Application
    ・・・
    config.paths.add 'lib', eager_load: true
    ・・・
  end
end
```

ちなみに上の記述だと、development環境ではAutoloadされ、production環境ではEagerLoadされます。
よって、
`config.autoload_paths += %W(#{config.root}/lib)`
は削除してしまって大丈夫です。
Mac で xonsh と pyenv を使う 

# Mac の環境

- macOS Mojave v.10.14.2
- Homebrew v.1.9.2
- GNU bash v.5.0.0

Homebrew のインストール手順：
[macOSにHomebrewをインストール](https://qiita.com/pypypyo14/items/4bf3b8bd511b6e93c9f9)

# xonsh とは

Python 製のシェル
詳しい説明は以下のサイトにあります．
[xonsh tutorial](https://xon.sh/tutorial.html)
[Pythonistaに贈るXonshのススメ](https://vaaaaaanquish.hatenablog.com/entry/2017/11/30/175236)

# pyenv とは

Python のバージョン管理システム
詳しい説明は以下のサイトにあります．
https://github.com/pyenv/pyenv

# xonsh のインストール

以下のコマンドでインストール

```bash
brew update; brew upgrade
brew install python3 
brew install bash-completion2
pip3 install --upgrade pip
pip3 install xonsh gnureadline prompt-toolkit
```

以下のコマンドで起動

```
xonsh
```

# pyenv のインストール

今回は Python 3.6.8 を使用
まず，`.bash_profile` に以下の内容を追加

```bash:.bash_profile
export PYENV_ROOT=/usr/local/var/pyenv
if which pyenv > /dev/null; then eval "$(pyenv init -)"; fi
```

次に，bash で以下のコマンドを実行し Python 3.6.8 をインストール

```bash
bash
brew install pyenv
source .bash_profile
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
pyenv install 3.6.8
```

pyenv を使用して，Python 3.6.8 を設定

```
pyenv global 3.6.8
```

# tips

`.bash_profile`の末尾に以下の内容を追加すると次から自動的に起動

```bash:.bash_profile
alias x="xonsh"
x
```

`.xonshrc` に関する詳しい説明は以下のサイトにあります．
[xonshrcを書く](https://vaaaaaanquish.hatenablog.com/entry/2017/12/09/154201)
ES6で追加されたアロー関数とクラス

今回はJava ScriptのES6で新しく追加されたアロー関数とクラスをご紹介します。

#####アロー関数
ES6で追加された関数です。
関数をシンプルに書くことができるようになりました。

######functionを用いた関数
``` 
const test = function(){
 console.log("Hello world");
};
```

#####アロー関数
```
const test = () => {
  console.log("Hello world");
};
```

#####呼び出し方
```
test();
```

###class
classはES6から追加されました。
これにより、オブジェクトを作成しやすくなりました。

```
class Fruit{
}
 const fruit = new fruit();
```
class クラス名でクラスをつくります
new クラス名()でオブジェクトを生成します。
クラスから生成したオブジェクトはインスタンスと呼びます。


#####コンストラクタ
インスタンスを生成するときに実行したい処理を追加するための機能です。

```
class Fruit{
 constructor(){
 }
}
```
クラスの中にconstractor(){}と記述することで追加できます。
コンストラクタの処理は、インスタンスが生成された直後に実行されます。
インスタンスごとに毎回実行されるため、注意が必要です。

#####メソッド
メソッドはインスタンスの処理のまとまりです。
クラスの中にメソッド名(){}と記述することで追加できます。

```
class Fruit{
 constractor(name,price){
}
 info{
  console.log("こんにちは");
 }
｝
　const fruit = new Fruit("ぶどう",300);
  fruit.info();
```

infoというメソッドを追加して呼び出しました。
assignsの割り当てテストで、ランダムで取得する変数のテストに戸惑ったのでメモ

# 経緯
rspecのassignsテストでランダムで要素を取得する変数をテストする際に、以下の方法で実装したので備忘録としてメモ。他に何かいい方法がありましたらコメントしていただけたら嬉しいです。

# self - other -> Array
rubyで特定の配列から指定した要素を取り除いた要素を返す。
使用例

```ruby
[1, 2, 3, 4, 5] - [3, 4] # => [1, 2, 5] 
```

# 実際の使用

コントローラー

```ruby
@related_products = Spree::Product.in_taxons(@product.taxons).
                    includes(master: [:images, :default_price]).
                    where.not(id: @product.id).distinct.sample(4)
```
コントローラーspec

```ruby
let(:taxonomy)           { create(:taxonomy) }
let(:taxon1)             { create(:taxon, taxonomy: taxonomy) }
let(:taxon2)             { create(:taxon, taxonomy: taxonomy) }
let(:taxon3)             { create(:taxon, taxonomy: taxonomy) }
let(:taxon4)             { create(:taxon, taxonomy: taxonomy) }
let(:product)            { create(:product, taxons: [taxon1, taxon3, taxon4]) }
let!(:related_product1)  { create(:product, taxons: [taxon1, taxon3, taxon4]) }
let!(:related_product2)  { create(:product, taxons: [taxon1, taxon3]) }
let!(:related_product3)  { create(:product, taxons: [taxon1, taxon4]) }
let!(:related_product4)  { create(:product, taxons: [taxon1]) }
let!(:related_product5)  { create(:product, taxons: [taxon1]) }
let!(:unrelated_product) { create(:product, taxons: [taxon2]) }

it "assigns only related products" do
  all_related_products = [
    related_product1,
    related_product2,
    related_product3,
    related_product4,
    related_product5
  ]
  # （関連商品をランダムに４つ取得するrelated_productsから関連商品全てを除けば空になるはず
  #  →関連商品のみ割り当てられているはず）
  expect(assigns(:related_products) - all_related_products).to be_empty
end
```
assignsのテストはランダムとか要素数を絞ると途端に難しくなるな〜といった印象。

#　参考
https://qiita.com/jnchito/items/2e79a1abe7cd8214caa5#eq
https://docs.ruby-lang.org/ja/latest/class/Array.html#I_--2D
WSL上のLaTeXを用いてVS CodeでTeXファイルをコンパイルする

# WSLのLaTeXを使う利点
- LaTeXパッケージの管理がWindowsよりも容易(な気がする)
- WSLのvim上でもコンパイルしたい

# 参考サイト
初めに, 参考にさせていただいたサイトを載せさせていただきます.
[WSLに入れたLaTeXをWindowsのVS Codeで使う](https://motchy99.blog.fc2.com/blog-entry-126.html)

こちらはシェルスクリプトを用いることで実現しているのですが, もう少しネイティブな機能を用いて行えないかなと思いました.

するとWSLにはWindowsとWSL上でのパス変換を行える便利が機能があることが判明!

```
$ wslpath "Windows上のパス"
"WSL上でのパス"
```

例えば,**c:/users/**というWindows上のパスを入れてみると

```
$ wslpath c:/users/
/mnt/c/Users
```
というようにWSLでのパスへと変換されます.

# これを適用してみよう!
ということで, VSCodeのLaTeXに関する設定ファイルを次のように書き換えちゃいましょう.

具体的にはパスを与えてくれる```%DOC%```の部分を, ``` `wslpath %DOC%` ``` という風にバッククォーテーションを用いて書いてあげればOKです.

```
{
    ...,
    "latex-workshop.latex.tools": [
        {
            "name" : "latexmk",
            "command" : "wsl.exe",
            "args" : [
                "latexmk",
                "-pdfdvi",
                "`wslpath %DOC%`" //WSL上のパスへと変換
            ]
        }
    ],
    ...
}
```

これだけの設定でWSL上のLaTeXを用いてコンパイルすることができるようになりました.

# 問題点
VSCode上での操作では, Synctexの機能が使えない状態になってしまっています...(Synctex内のパスがwsl状のものになってしまっている) この解決策をただいま模索中です.

# 最後に
私はlatexmkを用いてコンパイルを行っていますが, 多分他のコンパイラでも同様にできると思います.
検証はしておりませんのでもし情報がありましたら教えていただけたら幸いです.

# 関連記事
- [WSLに入れたLaTeXをWindowsのVS Codeで使う](https://motchy99.blog.fc2.com/blog-entry-126.html)
- [【Windows10/WSL】wslpathコマンドを試す](https://www.yokoweb.net/2018/05/03/windows10-wsl-wslpath/)
styled componentsでただのマークアップするときに悩む

# 概要

styled componentsで再利用しないCSSをただマークアップするとき、全部 `const Hoge=styled.~`って書くとめっちゃ変数増えません？

その時どう書くべきかなあと、悩むだけで結論のない記事です。

# 悩み

![Sample.png](https://qiita-image-store.s3.amazonaws.com/0/117615/6958b9a9-7251-e8e6-67fa-81acc867303e.png)

例えばこんなデザインがLPの中段あたりに出てきたりしたとします。
僕はずっとこんな感じで書いてました。

```jsx:MessageSection.js

// 省略
import Message from './Message';

const Wrapper = styled.div`
  width: 100%;
  padding: 40px 16px;
`;

const Heading = styled.div`
  font-size: 28px;
  color: black;
  :after {
    content: '';
    // 省略
  }
`;

const messages = [
  // 省略
];

export default props => (
  <Wrapper>
    <Heading>Message</Heading>

    [messages.map((v,i)=>(<Message {...v}>)]
  </Wrapper>
)
```

```jsx:Message.js

// 省略

const Wrapper = styled.div`
  max-width: 256px;
  margin: auto;
`;

const Thumbnail = styled.img`
  // 省略
`;

const Heading = styled.div`
  // 省略
`;

export default props => (
  <Wrapper>
    <Thumbnail />
    <Heading />
  </Wrapper>
)

```

でもなんか、これだけのためにどんだけ変数作るんだよと思ってしまい、こんな書き方試してました。
上記の雑な例程度ならまだしも、LPとかみたいな再利用性はないがマークアップ量ハンパないの書く時とか全部変数宣言するのツライんですよね。

なのでこうやって書いてみました。

```jsx:MessageSection.js

// 省略
import Message from './Message';

const Wrapper = styled.div`
  width: 100%;
  padding: 40px 16px;
  .heading {
    // 省略
  }
`;

export default props => (
  <Wrapper>
    <div className="heading">Message</div>

    [messages.map((v,i)=>(<Message {...v}>)]
  </Wrapper>
)
```

```jsx:Message.js

// 省略

const Wrapper = styled.div`
  max-width: 256px;
  margin: auto;
  .thumbnail {
    // 省略
  }
  .heading {
    // 省略
  }
`;

export default props => (
  <Wrapper>
    <div className="thumbnail">{props.thumbnail}</div>
    <div className="heading">{props.heading}</div>
  </Wrapper>
)
```

雑な書き方は色々許してください :bow: 
わあ、書きやすくなった〜って気がして嬉しがってたら気づいちゃったんすよね。

**`Message.js`の`.heading`、`MessageSection.js`の`.heading`のCSSがあたってまうやん、、、**

styled componentsの、名前空間の衝突を避ける旨みをフル無視してたみたいですね、、、。
むう。でも変数乱立するの嫌やなあ。

どうしよ、、 :thinking:
rails newでエラー発生[備忘録]

<h2>はじめに</h2>
railsを勉強２ヶ月目の初心者ですが、新規アプリ作成の時点でエラーを出してしまいました。

以下のようなエラーです。
「Can't initialize a new Rails application within the directory of another, please change to a non-Rails directory first.」

google先生で翻訳すると、どうも新規アプリを作る場所が悪かったみたいです。

「別のディレクトリ内で新しいRailsアプリケーションを初期化できません。最初にRails以外のディレクトリに変更してください。」

<h2>原因・解決方法</h2>
僕の場合ですが、別のアプリを作成していたので別アプリのディレクトリ内で新規アプリを作成してしまっていたみたいです。

「User/PCname/別のアプリ/新規アプリ」という具合ですね。(ターミナル上のディレクトリの位置です。)

解決方法として、「cd」をターミナル上で記入しホームディレクトリに戻ります。
そのあと、新規アプリ名でもう１度「rails new　　新規アプリ名」を実行してください！！
Ruby on Railsで孤立したレコードを見つけて削除する方法

# Ruby on Railsで孤立したレコードを見つけて削除する方法

以下の三つのテープルを定義してみます。

```Ruby
# app/models/notification.rb
class Notification < ActiveRecord::Base
  has_many :user_notifications
  has_many :users, through: :user_notifications
end

# app/models/user.rb
class User < ActiveRecord::Base
  has_many :user_notifications
  has_many :notifications, through: :user_notifications
end

# app/models/user_notifications.rb
class UserNotification < ActiveRecord::Base
  belongs_to :user
  belongs_to :notification
end
```

残念ながら、has_many：の通知にdependent：：destroyを追加するのを忘れた。 ユーザーまたは通知が削除されたときに、孤立したUserNotificationが残っていました。
この問題はdependent：：destroyによって修正されましたが、それでもたくさんの孤立したレコードが残っていました。
孤立したレコードを削除する方法は3つあります。

## Approach #1 — Bad

```Ruby
UserNotification.find_each do |user_notification|
  if user_notification.notification.nil? || user_notification.user.nil?
    user_notification.destroy
  end
end
```

これは各レコードに対して別々のSQLクエリを実行し、それが孤立しているかどうかをチェックし、そうであれば破棄します。

## Approach #2 — Better, but still pretty bad

```Ruby
UserNotification.all.each do |user_notification|
  if user_notification.notification.nil? || user_notification.user.nil?
    user_notification.destroy
  end
end
```

これは、すべてのレコードをメモリにロードしてから、上記と同じチェックを実行しながらそれらを繰り返します。

## Approach #3 — Good

```Ruby
UserNotification.where([
  "user_id NOT IN (?) OR notification_id NOT IN (?)",
  User.pluck("id"),
  Notification.pluck("id")
]).destroy_all
```

このアプローチでは、最初にすべてのユーザーと通知のIDを取得し、次に1つのクエリを実行してユーザーまたはクエリのいずれにも属していないすべてのユーザー通知を見つけます。

## Benchmarks

それぞれの場合にかかる時間を見てみましょう。

```s
          user       system     total    real
bad       3.020000   0.160000   3.180000 (  4.058246)
better    2.950000   0.170000   3.120000 (  3.982329)
good      0.010000   0.000000   0.010000 (  0.030346)
```

ユーザー通知の数が減っても、UserNotification.all.eachはUserNotifications.find_eachよりも高速です。これは、SQLクエリの実行回数が少ないためです。

## Approach #4

- データが多い場合、pluckよりselectのほうが高速です

```Ruby
UserNotification.where([
  "user_id NOT IN (?) OR notification_id NOT IN (?)",
  User.select("id"),
  Notification.select("id")
]).destroy_all
```
pythonのboto3を使って、S3のフォルダオブジェクトが取れなくて困った

# はじめに

amazon S3における「フォルダ」という幻想をぶち壊し、その実体を明らかにする
https://dev.classmethod.jp/cloud/aws/amazon-s3-folders/

こちらに載っていた情報で下記の2つのケース以外にもあったので補足いたします

1. 管理コンソールから、既存の空フォルダの中にファイルを配置する（ケース1）
2. aws-cliを使って、存在しないフォルダに直接ファイルを配置する（ケース2）

# 結論
管理画面でフォルダごとアップロードができ、フォルダの中のファイルの有無で変わる

# 詳細
## ケース1の追加
**「管理コンソールから、空のフォルダをフォルダごとアップロードする」**
例) 空のcase1testフォルダを管理画面からアップロードする

この場合は、オブジェクトとしてフォルダを取得できます

## ケース2の追加
**「管理コンソールから、ファイルの入ったフォルダをフォルダごとアップロードする」**
例) test.pngの入ったcase2testフォルダを管理画面からcase2testフォルダごとアップロードする

この場合は、オブジェクトとしてフォルダを取得できません

### ソース
```
import json
import boto3

def lambda_handler(event, context):

    S3Bucket    = 'myBucket'
    S3KeyPrefix = 'test/'
    s3 = boto3.resource('s3')
    bucket = s3.Bucket(S3Bucket)
    Obj = bucket.meta.client.list_objects_v2(Bucket=bucket.name, Prefix=S3KeyPrefix)
    print(Obj)
    
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

```

### 実行結果


```
{'ResponseMetadata': 
    略
  'Contents': [
               {'Key': 'test/', 'LastModified': datetime.datetime(2019,1,17,9,48,42, tzinfo=tzlocal()), 'ETag': '"d41d8cd98f00b204e9800998ecf8427e"', 'Size': 0, 'StorageClass': 'STANDARD'},
               {'Key': 'test/case1test/', 'LastModified': datetime.datetime(2019,1,17,9,48,50, tzinfo=tzlocal()), 'ETag': '"d41d8cd98f00b204e9800998ecf8427e"', 'Size': 0, 'StorageClass': 'STANDARD'},
               {'Key': 'test/case2test/test.png', 'LastModified': datetime.datetime(2019,1,17,9,48,53, tzinfo=tzlocal()), 'ETag': '"0753ec70b92a549bb53484c0e83ba7c1"', 'Size': 5293, 'StorageClass': 'STANDARD'}
              ], 'Name': 'myBucket', 'Prefix': 'test/', 'MaxKeys': 1000, 'KeyCount': 3
}

```

「'Key': 'test/case1test/'」のオブジェクトは有ります
「'Key': 'test/case2test/'」のオブジェクトは無いです



# おわりに
フォルダオブジェクトは無い前提で考えます:cry:
LaTeXで作成した数式をEPS形式に変換する方法

## 要約
* [TexClip](https://texclip.marutank.net)を使用する．

## Tex2imgより簡単
[前の投稿](https://qiita.com/MasashiSD/items/aeea586fb2efadf609d4)でTex2imgを使用して，変換する方法を書きましたが，より便利な方法を見つけたため共有します．

## 使用方法
[TexClip](https://texclip.marutank.net)に，eps等の画像ファイルに変換したい数式を入力するだけです．
docker-composeのサービス名にアンダースコアを入れないほうが良いよというお話

もしかしたら「当たり前だろヴォケが」的なお話かもですが、個人的にハマったので戒めとして残しておきます。。

## 何故や

docker-composeのサービス名ってそのまま `ホスト名` としてコンテナ間で参照できたりするのですが、ホスト名には `アンダースコア` を含めちゃイカンのです。

## 実際にはじかれるケースに遭遇

DjangoをDockerで動かして、別のコンテナからアクセスすると `Invalid HTTP_HOST` つって怒られました。

```yaml
version: '2'

services:
  suteki_na_web:
    image: suteki_na_django
    volumes:
      - ./source:/source
    working_dir: /source
    command: ./manage.py runserver 0.0.0.0:8000
    ports:
      - 8000

  hoge_container:
    image: alpine:3.6
    command: wget http://suteki_na_web:8000
```

調べると `ALLOWED_HOST` 書けよって言ってる人がたくさんいたんですけど、書いてもさっぱり動かなかったのであれーっと思ってソース読んでみたら、アンダースコア入りのホスト名は弾かれてました。。

```python
# https://github.com/django/django/blob/master/django/http/request.py#L24
host_validation_re = re.compile(r"^([a-z0-9.-]+|\[[a-f0-9]*:[a-f0-9\.:]+\])(:\d+)?$")
```

# ドメイン名としてはOKらしいが...

参考資料に書いてありますが、 `ホスト名はNG` で `ドメイン名はOK` とのこと。
ただDjangoの実装的には弾かれてるので `アンダースコアは使わない` に統一した方が、余計な事故に合わずに済みそうです。 

## 参考資料

- [ホスト名とかドメイン名とかFQDNでアンダースコア Add Star](http://d.hatena.ne.jp/S_a_k_U/touch/20130612)
Ruby でローマ数字の文字 (機種依存文字) をアルファベットに変換する

# やりたいこと

例えば `Ⅶ` ([U+2166](https://www.compart.com/en/unicode/U+2166)) を `VII` に変換したい。

# 方法

## 愚直な方法

```rb
def replace_roman_numerals_with_alphabets(str)
  conversions = {
    'Ⅰ' => 'I', 'Ⅱ' => 'II', 'Ⅲ' => 'III', 'Ⅳ' => 'IV', 'Ⅴ' => 'V',
    'Ⅵ' => 'VI', 'Ⅶ' => 'VII', 'Ⅷ' => 'VIII', 'Ⅸ' => 'IX', 'Ⅹ' => 'X',
    'Ⅺ' => 'XI', 'Ⅻ' => 'XII'
  }.freeze
  
  str.gsub(/[#{conversions.keys}]/, conversions)
end

replace_roman_numerals_with_alphabets('ﾌｧｲﾅﾙﾌｧﾝﾀｼﾞｰⅦ')
#=> "ﾌｧｲﾅﾙﾌｧﾝﾀｼﾞｰVII"
```

変換ルールを自分で用意するのは大変 :sob:

## スマートな方法

```rb
def replace_roman_numerals_with_alphabets(str)
  # Unicode の U+2160 から U+217F までがローマ数字。
  roman_numerals_pattern = /[\u2160-\u217F]/ 
  str.gsub(roman_numerals_pattern) { |char| char.unicode_normalize(:nfkd) }
end

replace_roman_numerals_with_alphabets('ﾌｧｲﾅﾙﾌｧﾝﾀｼﾞｰⅦ')
#=> "ﾌｧｲﾅﾙﾌｧﾝﾀｼﾞｰVII"

# ちなみに……
'ﾌｧｲﾅﾙﾌｧﾝﾀｼﾞｰⅦ'.unicode_normalize(:nfkd)
#=> "ファイナルファンタジーVII"
```

NFKD 形式 (あるいは NFKC 形式) で [Unicode 正規化](https://ja.wikipedia.org/wiki/Unicode%E6%AD%A3%E8%A6%8F%E5%8C%96) することで、対応するアルファベットに分解することができる。

# 参考

* [[Wikipedia] Unicode正規化](https://ja.wikipedia.org/wiki/Unicode%E6%AD%A3%E8%A6%8F%E5%8C%96)
* [[Ruby] String#gsub](https://docs.ruby-lang.org/ja/latest/method/String/i/gsub.html)
  * 第 2 引数に Hash オブジェクトを渡せたり、ブロック引数を渡せたりで器用なメソッド。 
* [[Qiita] Python 3 での Unicode に関する備忘録](https://qiita.com/QUANON/items/97ede1f86b375be877c2)
  * 拙記事。Python での Unicode 正規化に言及している。
iOSアプリでArchiveビルドしたら「symbolFileUploadLocation: API key expired. Please renew the API key.」


### xcodeで、Arichiveビルドしたら下記エラーになった。
（普通に実機テストする分には動いた。）

```
symbolFileUploadLocation: API key expired. Please renew the API key.
```

翻訳すると
「symbolFileUploadLocation：APIキーの有効期限が切れました。 APIキーを更新してください。」

たしかに最近firebaseのアカウントを変えたので、firebaseの「GoogleService-Info.plist」をダウンロード

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/87fbea54-9050-db79-e9fb-e9adb52b3828.png)

DLした「GoogleService-Info.plist」を更新し、再度Archiveビルド！


### 今度はこんなエラー

```
/proj.ios_mac/Pods/FirebaseCrash/upload-sym-util.bash:351: symbolFileUploadLocation: The caller does not have permission
```

翻訳するとw
「/proj.ios_mac/Pods/FirebaseCrash/upload-sym-util.bash:351：symbolFileUploadLocation：呼び出し側に許可がありません」

そしてぐぐると。

こちらの記事が大変参考になりました！
https://develop.hateblo.jp/entry/firebase-crash-haishi

**FirebaseCrash**は利用できなくなったので、代わりに**Crashlytics**を使ってねってとの事

(泣)


追記：
FirebaseCrashをPodfileで管理しており、FirebaseCrashだけ```pod install```でアンインストールしようとすると他のSDKも古いのかエラーまみれになってしまったので自分の場合は、手動でPodからFirebaseCrashだけ削除しました（泣）
PHP5.2～でエクセル出力するライブラリ mk-j/php_xlsxwriter

## ライブラリについて

PHPでエクセル出力する場合、ライブラリにPHPExcelとかがあるが、だいぶ古くてもうすぐ更新されなくなる。
composerインストールできるものを探していると新しいのがあるが、PHP7必須だったりする。
PHP5.2以上だとmk-j/php_xlsxwriter というのがあった。

クラスファイル分けしてなくて、1ファイルに全機能が入っている。あまり機能充実はしていない。
特色としては、「Never run out of memory with PHPExcel again.」とうたっている。出力をバッファすることでPHPExcelみたいなメモリオーバーを防止しているよということらしい。

## 機能を見る

Readmeと同梱のexamples11例を見ると、だいたい使い方がわかる。

セルの結合は次のような書き方。
`$writer->markMergedCell($sheet1, $start_row=0, $start_col=0, $end_row=0, $end_col=4);`
文字列の折り返し表示はスタイルにwrap_text=>trueを指定する。
`$writer->writeSheetRow($sheet4, array(101,'this text will wrap'    ), $row_options = array('height'=>30,'wrap_text'=>true));`

https://github.com/mk-j/PHP_XLSXWriter/blob/master/examples/ex08-advanced.php


目的が果たせるのか確認していてソースを見ると、シンプルなXMLを出力していることがわかった。VBAとXMLで単語が統一されているのでわかりやすい。
Excelを作るXMLの仕様についてはこちらのサイトとかがとても役に立った。
https://p-space.jp/index.php/development/open-xml-sdk

たとえばセルの枠線は標準の機能で引けるが、（右上から左下などの）斜線を引くオプションがない。
（VBA）
`BorderC7.DiagonalUp = new BooleanValue(true);`
（XML）
`<border diagonalUp="true"> `

みたいな書き方だとわかったので、該当の箇所を探して変更できた。

あとは行幅を文字列の長さで調節してほしい。
`<col customWidth="true">`
と書いている箇所があって、
VBAだと
`ws.Column(1).AdjustToContents();`
が該当する。
これはいろいろ触ってみたがわからなかった。。
【rails5】byebugを使ったデバッグの方法

##【rails5】byebugを使ったデバッグの方法

変数に入っている値を確認するため、デバッグでどうなっているかを確認した。

忘れそうなので自分用にメモを残す。

###手順

①アクション内で、値を確認したいコードの上に、

```
byebug
```

と記述する

```
例
byebug
@user = User.find(params[:id])
```


②登録ボタン、編集ボタンを押すなど、実際にブラウザ上でアクションを実行させる

③するとrailsサーバーのログに、アクション内のコードが表示される

④、①でbyebugと記述した一行下のコードにカーソル「=>」があることを確認する


```
railsサーバーのログ画面
例
=> 164:     @user = User.find_by(params[:id])
```

⑤同画面の一番下で、文字入力が可能な状態になっているので、**next**と入力し、一段下のコードへ移動する

⑥、上記④のコードが実行された状態となっているので、確認したい変数を入力する

```
(本記事の例であれば@user）
```

すると、値が入っていれば下記のように出力される

```
(byebug) #<User id: 1, name: "Example User", email: "example@railstutorial.org", created_at: "2019-01-12 02:11:57", updated_at: "2019-01-16 07:28:16", password_digest: "$2a$10$ZqufLCEGM/hC2KYlkyzy/.trD0jWUq59FBvlm58kn0c...", remember_digest: nil, admin: true, reset_digest: nil, reset_sent_at: nil
```

空であればnilと表示される

以上です。

ご指摘等あれば是非お願いいたしますm(__)m
ChainerX付きでChainerをMacOSにインストールしてみた

# 概要
ChainerXがすごいと聞いたので、Chainerの最新版をMacOS(10.13.6)にインストールしてみたときの試行錯誤を記録します。

# 環境
- High Sierra 10.13.6
- 外付けGPUあり（GTX1080ti）

# 前提
Cuda等のインストールはすでに済ませているものとします。[(参考)](https://qiita.com/tan826/items/dad36366c069cd538dd3)

Chainer、Cupyのレポジトリをそれぞれクローンしてきます

```
# chainer
git clone https://github.com/chainer/chainer

# cupy
git clone https://github.com/cupy/cupy
```

- chainerはpipでもインストールできますが、chainerxもインストールする場合は、現在はソースからインストールする必要があります。
オフィシャルのドキュメントは[こちら](https://docs.chainer.org/en/latest/chainerx/install/index.html)です。

```
# chainerのインストールのための環境変数設定
# chainerxはcuda付きでビルドします
# 以下のCUDNN_ROOT_DIRは私の場合です。findコマンドなりで探してください。
export CHAINER_BUILD_CHAINERX=1
export CHAINERX_BUILD_CUDA=1
export CUDNN_ROOT_DIR=/usr/local/cuda/lib
export MAKEFLAGS=-j8
```

- オフィシャルとは違いますが、クローンしてきたレポジトリでセットアップします。

```
cd [cupyのディレクトリ]
pip install .
cd [chainerのディレクトリ]
pip install .
```

# 失敗例
- Command Line Toolsのバージョンが9だとchainerのビルドができませんでしたが、10（Apple LLVM version 10.0.0 (clang-1000.10.44.2)
）にアップグレードして実行したところ成功しました。
- matplotlibがインストールされていないと怒られましたが、pip install matplotlibで解決しました。
- インストール後、[Mnistのサンプルコード](https://github.com/chainer/chainer/blob/master/examples/mnist/train_mnist.py)を回したところ、matplotlibのbackendがどうのこうのだと怒られましたが、[こんなふうに](https://www.atnr.net/how-to-work-matplotlib-on-mac/)backendをmacosxからTkaggに変更したところ解決しました。

# 失敗かわからないが気にしたこと
- Cupyのインストールが先のほうが良いかもしれない。

# スピードチェック
上記サンプルコードは2019.1.17時点のmasterはChainerXを使うようになっています。ChainerXを使っていないv5ブランチのものと比較しました。

- GPUあり + ChainerXあり

```
real	1m4.834s
user	1m8.003s
sys 	0m2.527s
```

- GPUあり + ChainerXなし

```
real	1m0.672s
user	1m3.361s
sys 	0m2.715s
```

- GPUなし + ChainerXあり

```
real	7m1.731s
user	12m16.100s
sys 	1m23.104s
```

- GPUなし + ChainerXなし

```
real	6m52.470s
user	11m58.722s
sys 	1m31.324s
```

# まとめ（られていない）
- 速さに誤差しかないのは[これ](https://github.com/chainer/chainer/blob/master/examples/mnist/train_mnist.py#L111)のせい？それとも[host-heavy workloads](https://github.com/chainer/chainer/pull/5725#issue-233827466)ではないから？
TypeORM EntityMetadataNotFound: No metadata for "***" was found

Mochaでテストしているコードで`getCustomRepository`すると `EntityMetadataNotFound: No metadata for "***" was found.`が発生する

# 発生したエラー

```shell-session
     EntityMetadataNotFound: No metadata for "Application" was found.
      at new EntityMetadataNotFoundError (src\error\EntityMetadataNotFoundError.ts:9:9)
      at Connection.getMetadata (src\connection\Connection.ts:316:19)
      at EntityManager.getCustomRepository (src\entity-manager\EntityManager.ts:781:86)
      at Connection.getCustomRepository (src\connection\Connection.ts:351:29)
      at Object.getCustomRepository (src\index.ts:287:55)
      at Function.<anonymous> (src\models\applications.ts:155:17)
      at Generator.next (<anonymous>)
      at fulfilled (src\models\applications.ts:4:58)
      at <anonymous>
```

# 該当するコードを追跡する
https://github.com/typeorm/typeorm/blob/master/src/connection/Connection.ts

```ts:Connection.ts
    /**
     * Gets entity metadata for the given entity class or schema name.
     */
    getMetadata(target: Function|EntitySchema<any>|string): EntityMetadata {
        const metadata = this.findMetadata(target);
        if (!metadata)
            throw new EntityMetadataNotFoundError(target);

        return metadata;
    }
```

```ts:Connection.ts
    /**
     * Finds exist entity metadata by the given entity class, target name or table name.
     */
    protected findMetadata(target: Function|EntitySchema<any>|string): EntityMetadata|undefined {
        return this.entityMetadatas.find(metadata => {
            if (metadata.target === target)
                return true;
            if (target instanceof EntitySchema) {
                return metadata.name === target.options.name;
            }
            if (typeof target === "string") {
                if (target.indexOf(".") !== -1) {
                    return metadata.tablePath === target;
                } else {
                    return metadata.name === target || metadata.tableName === target;
                }
            }

            return false;
        });
    }
```

# 実際にデータがどうなっているのか？
引数の`target`とプロパティ`this.entityMetadatas`の値をおってみる

```diff:Connection.ts
    protected findMetadata(target: Function|EntitySchema<any>|string): EntityMetadata|undefined {
+    console.log("target", target);
+    console.log("this.entityMetadatas", this.entityMetadatas);
```

```ts:target 
class Application {
}
```

```ts:this.entityMetadatas
[ 
  : ,
  EntityMetadata {
    :
    target: [Function: Application],
    : 
  },
  :
]
```

# 仮説
TypeScript形式の`class Application {}`とJavaScript形式`Function: Application`と名前の不一致ではないか？
iOS11以降のフォトライブラリへのアクセス許可について

iOS11から `UIImagePickerController` でフォトライブラリへアクセスする際にinfo.plistで `Privacy - Photo Library Usage Description` を設定してもアクセス権限の確認が自動で行われなくなり、アラートが自動で表示されなくなりました。
iOSの変更によるものなのでフォトライブラリに関してはアクセス許可の設定をしなくてもリジェクト対象ではない気もしますが、[ガイドライン](https://developer.apple.com/design/human-interface-guidelines/ios/app-architecture/requesting-permission/)には

**ユーザーは、現在の場所、予定表、連絡先情報、通知、写真などの個人情報にアクセスするためのアプリのアクセス許可を付与する必要があります。**

と記載されており、`写真`という表記があるため、もしかしたらリジェクト対象になる可能性があります。

もしリジェクトされてしまった場合は下記のようにこちら側でアクセス権限の確認アラートを表示しましょう。

##info.plist

`Privacy - Photo Library Usage Description`を追加

##UIImagePickerControllerの呼び出し

```swift
import Photos

if PHPhotoLibrary.authorizationStatus() != .authorized {
            PHPhotoLibrary.requestAuthorization { status in
                if status == .authorized {
                    // フォトライブラリを表示する
                } else if status == .denied {
                    // フォトライブラリへのアクセスが許可されていないため、アラートを表示する
                    let alert = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .alert)
                    let settingsAction = UIAlertAction(title: "設定", style: .default, handler: { (_) -> Void in
                        guard let settingsURL = URL(string: UIApplication.openSettingsURLString ) else {
                            return
                        }
                        UIApplication.shared.open(settingsURL, options: [:], completionHandler: nil)
                    })
                    let closeAction: UIAlertAction = UIAlertAction(title: "キャンセル", style: .cancel, handler: nil)
                    alert.addAction(settingsAction)
                    alert.addAction(closeAction)
                    self.present(alert, animated: true, completion: nil)
                }
            }
        } else {
            // フォトライブラリを表示する
        }
```

`PHPhotoLibrary.requestAuthorization`を呼び出すことで今まで勝手に出てきた確認のアラートが表示されるようになります。
JDBCを使ってAzure SQL Data WarehouseにAzure Active Directory認証で接続する

PDI(Pentaho Data Integration)からJDBCを使ってAzure SQL Data WarehouseにAzure Active Directory認証で接続できましたのでその方法をまとめておきます。
#必要となるJDBCドライバー、ライブラリ
- [Microsoft SQL Server 用 JDBC Driver](https://docs.microsoft.com/ja-jp/sql/connect/jdbc/download-microsoft-jdbc-driver-for-sql-server)
- [Microsoft Azure Active Directory Authentication Library (ADAL) for Java](https://github.com/AzureAD/azure-activedirectory-library-for-java)

上記のJDBCドライバー(今回はmssql-jdbc-7.0.0.jre8.jarを使用)と、adal4j(今回はadal4j-1.6.3.jarを使用）と必要な依存関係ファイルをJavaのclasspath上に配置します。

#JDBC設定
- 接続URL
jdbc:sqlserver://[SERVERNAME].database.windows.net;databaseName=[DBNAME];authentication=ActiveDirectoryPassword;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30
- ドライバークラス
com.microsoft.sqlserver.jdbc.SQLServerDriver

#Pentahoの接続の作成
- Connection Type: Generic Database
- Custom Connection URL: 上記の接続URL
- Custom Driver Class Name:　上記のドライバークラス
- User Name: Azure ADのユーザー名
- Password: Azure ADのパスワード


#参考にした情報
- [Azure Active Directory 認証を利用した接続](https://docs.microsoft.com/ja-jp/sql/connect/jdbc/connecting-using-azure-active-directory-authentication)
- [Pentaho Data IntegrationでAzure SQL Databaseと連携する](https://tech-lab.sios.jp/archives/7438)
- [Connect to SQL Azure Using Active Directory Authentication](https://razorsql.com/articles/sql_azure_active_directory.html)
- [Download adal4j JAR file with all dependencies](https://jar-download.com/artifact-search/adal4j)
flaskに入門した日

##flaskに入門

djangoからflaskに乗り換えることになった。
まず
<pre>pip3 install flask</pre>　


簡単なテストファイルを作った

```python
#test.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Hello'


if __name__ == '__main__':
    app.run(debug=True)
```

実行してみる
<pre>python3 test.py</pre>　

http://127.0.0.1:5000/
にアクセスすると、、、、

Helloと表示されていた。

###Success!

##参考

・[Python のマイクロフレームワーク『Flask』を試してみた]
(https://tnakamura.hatenablog.com/entry/20101214/flask0)
・[いまさらながら Flask についてまとめる 〜Routing〜]
(https://www.subarunari.com/entry/2017/09/28/001946)
・[Flaskの簡単な使い方]
(https://qiita.com/zaburo/items/5091041a5afb2a7dffc8)
・[Flask を始めよう]
(https://methane.github.io/flask-handson/start.html)
・[[Python] 軽量WebフレームワークのFlaskに入門（準備、起動、HTML、静的ファイル、GET、POSTなど）]
(https://www.yoheim.net/blog.php?q=20160505)
・[Flaskで任意のpythonファイルを実行する方法が知りたいです。]
(https://teratail.com/questions/96103)
・[いまさらながら Flask についてまとめる 〜Routing〜]
(https://www.subarunari.com/entry/2017/09/28/001946)
・[公式ドキュメント]
(http://flask.pocoo.org/docs/1.0/api/#flask.Flask)
・[Flaskの闇]
(https://methane.hatenablog.jp/entry/2012/12/24/214950)
・[Vue.jsとFlaskでフルスタックなWebアプリの開発環境を構築 その１〜〜環境構築〜〜]
(https://kittagon.hateblo.jp/entry/2018/08/27/011354)
・[PythonのWeb開発フレームワーク「Flask」のインストール・使い方]
(http://73spica.tech/blog/python-flask-get-started/)
・[Flask超入門]
(https://www.pytry3g.com/entry/Flask-Quickstart)
XCodeでiPhoneアプリ開発時に実機で実行するまでの設定

## XCodeでiPhoneアプリ開発時に実機で実行するまでの設定

XCodeで開発したiPhoneアプリを実機で実行しようとした際に、証明書や鍵の設定がいるらしい。
自動的に作って設定してくれるとなっていたので、それに任せたらはまった。今後のために設定までのログを残す。
XCode上で、先に秘密鍵まで作成した後、キーチェーンアクセスで鍵の設定を変更、そのあとアプリを実行するとうまく動作する。
とりあえず、アプリを実行してみたらはまった。
Web上のアカウント設定で色々いじれば、解決するという情報ばかりで、
開発アカウントに登録していない場合は、その機能を利用できないので、なかなか解決方法が見つからなかった。

Mac: 10.13.6 High Sierra
XCode: 9.4.1
iOS: 10.2

### 正常パターン

はまったのを無理やり直した結果なので、多少手順が異なっているかも。
キーチェーンアクセスアプリでの設定が特に重要で、
**iOS Developerの秘密鍵の使用をすべてのアプリケーションに許可** しないと、実行時にログインパスワードを入れても何故か通らない。
拒否するとはまる。

#### XCode上での設定

1. XCode
1. Preference
1. Accounts
1. AppleIDを追加
1. ManageCertifications
1. 左下＋ボタン：iOS Development

#### キーチェーンアクセスアプリでの設定

1. iOS Developer:秘密鍵の情報
1. この項目の使用をすべてのアプリケーションに許可
1. ログインパスワード入力


#### XCode 上での開発

1. iPhoneを接続
1. XCode のDeviceで実機を選択
1. 実行
1. パスワードを聞かれるので、ログインパスワードを入れて、`常に許可`をクリック


### はまったパターン

#### いきなり実行する

1. 上記のキーチェーンアクセスでの設定を飛ばして、いきなりコードを実行しようとすると、パスワードを入れろと出る
1. ログインパスワードを入れても`許可`できない
1. キャンセルできないので、仕方なく`拒否`を押すと、実機に対して二度と実行できなくなる

#### 証明書を削除してもう一度Certificationを作成しなおそうとする

1. キーチェーンアクセスの証明書にある`iPhone Developer..`を全て削除する
   1. 再度XCodeのManageCertificationsから、キーを追加しようとしても、既にあるというようなことを言われて追加できない
   1. しかし、認証をオート設定にしてあると、何かを試す度に同じ証明書をどんどん作成し、エラーを出す
1. キーチェーンアクセスの環境設定から自分のデフォルトキーチェーンをリセットしようとする
   1. `この操作の認証を得ることができません`エラーが起き、進まない

### はまった場合の解決策

2番目が特に重要
とりあえず、はまったらPCを再起動すれば、何故か動作する

1. キーチェーンアクセスの証明書にある`iPhone Developer:...`を全て削除する
1. PCを再起動する
1. 正常パターンをやり直す


### 結論

困ったら再起動すれば、動く。
イツノうぃんどうずダ。。
【Qiita】ページ内リンクを文章中に埋め込む

文章内にページ内のリンクを埋め込む方法です。
方法は Markdown で本文を見てください。

[概要]:<#概要>
[目的]:<#目的>
[目的詳細]:<#目的詳細>
[機能]:<#機能>
[機能詳細その１]:<#機能詳細その１>
[機能詳細その２]:<#機能詳細その２>

---
目次
---

1. [概要][]
1. [目的][]
1. [機能][]

---

## 概要
この概要の[目的][]については[目的詳細][]を参照してください。

## 目的

### 目的詳細
※[機能][]の詳細については次項で説明します。


## 機能

1. [機能詳細その１][]
1. [機能詳細その２][]

### 機能詳細その１
こんな機能があるよ。

### 機能詳細その２
こんな機能もあるよ。
VAEのKL距離

VAE(Variational Auto Encoder)のKL距離の理解に関して時間がかかったので自分の理解をメモしておく。
間違いがあれば指摘ください。
#VAE
![image.png](https://qiita-image-store.s3.amazonaws.com/0/299928/e9b4112d-40fa-5bac-ee03-72cd82014993.png)
VAEでは潜在変数zを連続な正規分布への変換で示す。
例えば二次元の潜在変数(z1,z2)を直前の潜在変数(μ1, μ2, σ1, σ2)を使って以下のように定義します。
$z=[z1, z2]=[μ1 + σ1 * randn(), μ2 + σ2 * randn()]$
ここでrandn()は平均値0、標準偏差1の正規分布乱数である。
こうする事によってVAEのDecoderは潜在変数z面の離散的かつ局所的な点からの変換ではなく、連続的な潜在変数z面からの変換が学習されるだろうことは何となくわかります。
ここまでは特に問題ありませんでした。
#損失関数にいきなり現れるKLダイバージェンス(KL距離)
次にVAEは損失関数にKL距離を足し学習を始めます。
ところが最初自分はこれがよく分かりませんでした。
どうして損失関数にKL距離を足す必要があるのか、そもそもKL距離って何だ（そこから？）というレベルでした。VAEを解説してくださる方の説明もKL距離に関して出てくる数式が難しく、余計にKL距離の理解を放棄する原因になりました。一度理解してみると解説で正しく書かれているんですが、残念ながら自分にはなかなか意味が分からず理解が進みませんでした。
同じ疑問を持たれた方はまずKL距離に対して調べるのがよろしいかと思います。

#KL距離とは
![image.png](https://qiita-image-store.s3.amazonaws.com/0/299928/4f8fa118-5863-2136-f933-c25f234ed9e1.png)

- KL距離はKLダイバージェンス、カルバック・ライブラー情報量ともいう。
- KL距離とはある分布P(x)とある分布Q(x)の距離二乗（のようなもの）を示す尺度である。
- 分布P(x)と分布Q(x)が一致するときKL距離は0になる。
- 逆に分布P(x)と分布Q(x)が離れるほど、（おおよそ）分布距離間の二乗に比例する形で大きくなる。
- 損失関数にKL距離を加えた時、KL距離は小さな値(ゼロ)に近づくように重みが学習される。すなわち潜在変数zの分布P(x)と対象となる分布Q(x)が一致するように収束する。
- VAEにおいては分布Q(x)は平均値0、標準偏差1の正規分布とする。
- つまりは損失関数にKL距離を加えると学習後の潜在変数zの分布P(x)(「VAEのDecoderの入力」)は平均値0、標準偏差1の正規分布に近づく形で生成される。(入力の正則化)
- 分布Q(x)を平均値0、標準偏差1の正規分布とし、潜在変数zの分布P(x)を平均値$μ$、標準偏差$σ$の正規分布とすればこの二つの分布のKL距離は$\frac{1}{2}(-2\lnσ+μ^2+σ^2-1)$となる。（計算略）
- この時、KL距離の$μ$および$σ$の偏微分の値が0になるのはそれぞれ$μ=0,σ=1$であるからKL距離はこの値で極小値を取ることが確認でき、その時のKL距離はゼロである。
- 実装では$σ$がマイナスになると$\lnσ$を求められないためか、$\ln(σ)^2$を$logvar$と置いてKL距離を$\frac{1}{2}(-logvar+μ^2+\exp(logvar)-1)$とする記述が主流である。 

#所感
VAEだと潜在変数zが学習によって収束する分布を平均値0、標準偏差1の分布とします。
ところで収束させる分布は連続的であるならば別に何でもいいのではないかと個人的に思います。例えば潜在変数の分布の行き先を平均値0.5、標準偏差0.1の正規分布にしたとしても、-1から1までの一様分布にしたとしても、潜在変数z面の連続にするという目的に関せば特に問題はないわけです。
(入力の正則化という目的からしたら的外れかもしれませんけど…)

その場合、従来のVAEからどのように変更すればよいでしょうか？
結論を言うとVAEの損失関数に足すKL距離の値を変えれば対応できる事になります。
例えば仮に分布Q(x)を平均値0.5、標準偏差0.1の正規分布とするならば損失関数に足すKL距離は$\frac{1}{2}(-2\ln10σ+10^2((μ-0.5)^2+σ^2)-1)$とすれば$μ=0.5,σ=0.1$に極小値0を持つ関数になり、潜在変数zのP(x)分布の行き先を平均値0.5、標準偏差0.1の正規分布Q(x)にする事ができるかと思います。
放射ぼかし・ズームぼかし(Radial Blur)をOpenCVで実装してみた

# 放射ぼかしとは
こういうの↓
![im20190117161419.png](https://qiita-image-store.s3.amazonaws.com/0/310374/cd49c929-4a23-f58c-7f04-35cc4a22caa9.png)

　カメラを前後に動かしながら撮影するとこうなりますね．集中線のような効果を得られます．一部の界隈では「躍動」写真とも呼ばれています．
　この放射ぼかし，PhotoShopなどの一般的な画像編集ソフトではおそらく標準搭載されています．しかし，一見数学的に1つの関数で表せそうなこの画像処理はOpenCVには標準搭載されていないので，プログラム上で扱うことができません．自分で実装するしかないというわけです．

# 放射ぼかしの実装
　自分で作る前に調べてみたところ，やはり先駆者がいらっしゃいました．
[『放射ぼかしをPython+OpenCVで実現する - さやかちゃんドットネット』](http://shira.hatenadiary.jp/entry/2018/06/30/022357)
　しかし，私はもう少し高速化できないかと考えて別のアルゴリズムで実装しようと思いました．簡単に言うと，元画像から段階的に小さくした画像を何枚も生成して，ぼかしの中心を基準に位置を合わせて全て重ね合わせます．以下がソースコードになります．

```python3:radial_blur.py

def radial_blur(src, pos, ratio, iterations, margin):
    h, w = src.shape[0:2]
    n = iterations
    m = margin

    # 背景を作成する．お好みで255を0にすると黒背景にできる．
    bg = np.ones(src.shape, dtype=np.uint8) * 255
    bg = cv2.resize(bg, (int(m * w), int(m * h)))

    # 背景の中心に元画像を配置
    bg[int((m - 1) * h / 2):int((m - 1) * h / 2) + h, int((m - 1) * w / 2):int((m - 1) * w / 2) + w] = src

    image_list = []
    h *= m
    w *= m
    c_x = pos[0] * m
    c_y = pos[1] * m

    # 縮小画像の作成
    for i in range(n):
        r = ratio + (1 - ratio) * (i + 1) / n
        shrunk = cv2.resize(src, (int(r * w), int(r * h)))
        left = int((1 - r) * c_x)
        right = left + shrunk.shape[1]
        top = int((1 - r) * c_y)
        bottom = top + shrunk.shape[0]
        bg[top:bottom, left:right] = shrunk
        image_list.append(bg.astype(np.int32))

    # 最終的な出力画像の作成
    dst = sum(image_list) / n
    dst = dst.astype(np.uint8)

    r = (1 + ratio) / 2
    dst = dst[int((1 - r) * c_y):int(((1 - r) * c_y + h) * r), int((1 - r) * c_x):int(((1 - r) * c_x + w) * r)]
    dst = cv2.resize(dst, (int(w / m), int(h / m)))
    return dst

```

各変数の意味は以下の通りです．

- src:元画像
- pos:ぼかしの中心座標(x, y)
- ratio: 最大縮小率(0 < ratio < 1)
- iterations: 重ね合わせる枚数(多いと滑らかになるが実行時間が増える)
- margin: このアルゴリズムは一番大きい元画像の端がぶれないという欠点があるため，元画像に余白を持たせてからアルゴリズムを実行し，最後にマージンの分をカットするという方法を取っています．(1 < margin < 2程度　大きいと実行時間が増える)

ちなみに，最初に貼った画像はratio = 0.9, iterations = 20, margin = 1.3です．

# おわりに
どうしてもfor文を使うアルゴリズムのため，実行時間が1秒ほどかかってしまいまだまだ不満です．もっと高速な実装があるという方がいましたらどうかお教えください．
ときにはコミットメッセージは変更ファイル名のコメントを外すだけでは良いのでは？gitのメッセージ書くのが面倒くさい、どうにか省略化したい人へ。

ときにはコミットメッセージは変更ファイル名のコメントを外すだけでは良いのでは？gitのメッセージ書くのが面倒くさい、どうにか省略化したい人へ。

```diff
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Thu Jan 17 10:06:30 2019 +0900
#
# On branch some_branch
# Changes to be committed:
-#	modified:   app/decorators/for_your_decorator.rb
#

```


---

https://twitter.com/YumaInaura

https://github.com/YumaInaura/YumaInaura/issues








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
DFT, SCFにおけるDIISの実装ノート

## DIIS
direct inversion in the iterative subspaceの略でDIIS。$x$を変数とする関数/汎関数 $f(x)$/$f[x]$ を反復的に最適化する際に、近似解列 $x_i, i=1,\dots,N$ の重み付き線形結合で、$N+1$ 反復の近似解 $x_N$ を求める手法。このとき、解 $\bar{x}$ と $N+1$ 反復の近似解 $x_{N+1}$ のerror $e_{N+1} = \bar{x}-x_{N+1}$ を $x$ が満たすべき制限の下で最小化することに特徴がある。
元はPulayによる提案(P. Pulay, Chem. Phys. Lett. **73** (1980) 393)で、主にKohn-Sham方程式、Hartree-Fock方程式の自己無撞着解を求める為に使われている。前者では密度の最適化で、後者は密度行列の最適化に使われている。また、平面波や実空間グリッドのような基底で一体ハミルトニアンを評価した際はその対角化も疎行列を念頭に置いた反復的に求めるため、この求解にも使われている。ここではKohn-Sham方程式に対する密度の最適化について考える。
多分、物理や化学で現れる第一原理計算に限らず、一般の最適化問題にも適用できると思うが、この分野以外での適用例は検索してもあまり見当たらない。

### 密度行列の最適化、対角化へのDIISの適用に対するコメント
DIISをキーワードについて色々探していた際に、様々な文献で一見異なる問題を解いているように思えて混乱したので、少しコメント。
とにかく共通していることは、上で述べたように $N+1$ 反復での近侍解を $i\leq N$ の近似解列の重み付き線形結合で近似して、 $N+$ 反復の近似解列に対するerrorを最小化することである。errorを評価するには解を何かしらの方法で評価する(もちろんこの解はこの手続きで求めたいと思っているので、何かしらの方法で代替物を用意する)必要があり、このerrorを評価する際に流儀が二つある。
一つの方法は解を持っている情報の中から適当に推測する。下に書いたように密度汎関数理論のKohn-Sham法では、入力した密度に対してKohn-Sham方程式を解くことで、出力密度を得る。この出力密度をとりあえずの解候補としてerrorが評価できる。
もう一つの方法は以下では述べないので、少し詳しく説明する。この方法ではNewton-Raphson法で解を更新することを念頭においている：$x_{N+1}=x_N - \left(H_N\right)^{-1}g_N$。$H_N$, $g_N$ は$x_N$で評価したへシアンと勾配。$x_{N+1}$ が解に近いとみなすと、errorは $- \left(H_N\right)^{-1}g_N$ になる。へシアンを求めるのは通常困難なので、このへシアンを現実的な計算コストでうまく近似する。
この二つの方法はDIISの特徴(近似解列の重み付き線形結合で評価したerrorを拘束条件の下最適化)を備えているが、errorの評価方法が実際上全く異なっている。

## 準備：拘束条件付き最適化問題: Lagrangeの未定乗数法
$A$を$n$次の実対称行列とするときの、$\sum_{ij}^n c_i A_{ij} c_j$の値を$\sum_i^n c_i = 1$の下で最小化する$c_i$を求める。(拘束条件が$\sum_i \left|c_i\right|^2=1$であれば、行列$A$の最低固有値問題を求めることに対応するが、本問題とは設定が異なる。)

未定乗数$\lambda$を導入して
$$
L(c_i) = \frac{1}{2}\sum_{ij}^n c_i A_{ij} c_j - \lambda \left(1 - \sum_i c_i \right)
$$
以下の関数の停留条件を解く:
$$
\frac{\partial L}{\partial c_i} = 0.
$$

この条件は$$ B_{ij} = A_{ij} (1 \leq i,j \leq n),\ -1 (i=n+1, 1 \leq j \leq n), \ -1 (1 \leq i \leq n, j=n+1), \  0 (i=j=n+1) $$$$ d_{i} = c_{i} (1 \leq i \leq n),\  \lambda  (i=n+1),\quad b_{i} = 0 (1 \leq i \leq n), \ -1  (i=n+1)$$として未定乗数も含めた変数に対する線型方程式$$\sum_j^{n+1} B_{ij} d_{j} = b_{i}$$を考える。こ)の線型方程式を解いて、$c_i$をえる。
$A$が対称行列であれば、$B$も対称行列である。($n+1$行目の定義のしようによっては対称行列にならないようにもなるので、注意)
$B$が対称行列で、右辺ベクトルが実数なので、解$c_i, \lambda$は実数になる。

## DFTでの実装
 **(書きかけ)** 
SCF収束解を与える密度を$\bar{n}$として、ある密度$n$のerrorを$e[\bar{n},n]=\bar{n}-n$とする。反復計算$i=1,2,\dots,N$での入力(出力密度は後で出てくる)密度$n_i^{\rm in}$における収束解とのerrorを$e_i$とする：$e_i = e[\bar{n},n_i^{\rm in}]$。

$N+1$反復で入力として使う密度$n_{N+1}^{\rm in}$をこれまでの入力密度のの重み付した和で近似する事を考える：
$$
n_{N+1}^{\rm in} = \sum_i^N c_i n_i^{\rm in}, \quad \sum_i^N c_i = 1.
$$
ここで導入された係数$c_i$は$N+1$反復でのerror $\left\langle \left. e[\bar{n},n_{N+1}^{\rm in}] \right| e[\bar{n},n_{N+1}^{\rm in}]\right\rangle$が最小になるように決める。このerrorを係数と反復$i$での入力密度でのerrorで陽に書くと、
$$
\left\langle \left. e[\bar{n},n_{N+1}^{\rm in}] \right| e[\bar{n},n_{N+1}^{\rm in}]\right\rangle = \sum_{ij} c_i^* A_{ij} c_j ,\qquad A_{ij} = \left\langle \left. e_i \right| e_j\right\rangle.
$$
この値を拘束条件付きで最小化すればよいので、前節の方法で解けることが分かった。


SCF収束解を与える密度を$\bar{n}$どう求めたら良いか という問題を一つ残している。
一つの解決策は$\bar{n}$として$n_i^{\rm in}$で構成されるハミルトニアンを対角化して得られる出力密度$n_i^{\rm out}$を使うことである。十分にSCFが収束してくれば入力と出力は近づくことが期待できる。
【Three.js】マウスカーソルの位置に応じて角度を変える3Dオブジェクト実装

##やったこと

Three.jsで遊んでいて、インタラクティブな要素が欲しくなったので。タイトル通りのことをやりました。
メモ書き程度なのでわかりやすくなくすみません。（入門者向けに解説していません）
サンプルは気が向いたらアップします

##前提
cameraのポジションはx:0, y:0, z:0で、rotationは初期位置なので、座標の中心にカメラがあり、Z軸のマイナス方向を向いていることになります。
動かすオブジェクトのポジションは、x:0, y:0, z:-80で、カメラから見ると中心にいることになります。
画面は固定です。

##実装
今回の前提の場合、マウス位置を取得して、x軸から反時計回りの角度を取得できればよさそう。

```js

document.body.addEventListener("mousemove", function (e) {
    //座標を取得する
    const rect = e.target.getBoundingClientRect();
    let mouseX = e.clientX - rect.left;
    let mouseY = e.clientY - rect.top;

    // マウス位置を-1〜1の範囲で表す
    mouseX = (mouseX / window.innerWidth) * 2 - 1;
    mouseY = -(mouseY / window.innerHeight) * 2 + 1;
 
　　　　　　　 //"object"と名付けられた3Dオブジェクトを取得￥
    const obj = scene.getObjectByName("object");
  　　
　　　　　　　　//今回のポイント。後述
    obj.rotation.z = Math.atan2(mouseY, mouseX) + -(Math.PI * 90 / 180);
  });

```

##最後の１行でなにをやっているか

まず、Math.atan2(mouseY, mouseX)でマウス位置を元にしたx座標からの角度をラジアンで算出しています。
threeのrotationプロパティはラジアン単位なので、そのまま使えます。

今回の場合3Dモデルの頭の部分をカーソルに向かせたかったので、ここからさらに-90度オブジェクトを傾けます。
これはラジアンに変換して加算するだけです。

##できた
このあとはオブジェクトとマウスの距離に応じて、動かすスピードをいじってみたいと思っています。
あのサービス・アプリのアーキテクチャ・プログラミング言語・フレームワークまとめ〔2019年始版〕

#概要
他所様の言語・F/W・DB・ツール等の使用数まとめ

以下の記事の集計の軸を変えて、各カテゴリ&ジャンルごとにカウントしたまとめ
あのサービス・アプリのアーキテクチャ・プログラミング言語・フレームワークを大調査！〔2019年始版〕
https://employment.en-japan.com/engineerhub/entry/2019/01/08/103000

#プログラミング言語
サーバーサイドKotlinが伸びてる。

## バックエンド系
- Python: 18
- Ruby: 17
- Golang: 17
- Java: 11
- Kotlin: 10
- PHP: 10
- Node.js: 8
- Scala: 7
- Rust: 2
- Perl: 2
- C#: 2
- Elixir: 1
- C++: 1

※ Pythonは機械学習系の利用も含まれている様子
※ Java, Node.jsの集計はF/Wなどのツールを見てバックエンドと判断。Node.jsがBFFかは判別できず。
※ Kotlinはサービスごとにググった結果からサーバーサイドKotlinと判断

## フロントエンド系
- TypeScript: 15
- CoffeeScript: 1

## ネイティブ系
- Kotlin: 17
- Swift: 17
- Objective-C: 8
- Java: 4

※ Kotlin, Javaの集計はサービスやF/Wなどを見てネイティブと判断


#フレームワーク
Golangは言語の使用数多いけどF/Wの数が少ない。Rails減ってる。
## バックエンド系
- Ruby on Rails: 17
- Spring Boot: 8
- Express: 8
- Spring Framework: 7
- Play Framework: 6
- Django: 4
- Pyramid: 2
- CakePHP: 2
- Gin: 2
- Echo: 2
- FuelPHP: 1
- Laravel: 1
- Seasaa: 1
- CodeIgniter: 1
- Falcon: 1
- Skinny Framework: 1
- Finagle: 1
- SlimFramework: 1
- Zend Framework: 1
- Flask: 1
- Goa: 1
- gorilla/mux: 1

## フロントエンド系
- Vue.js: 12
- React: 12
- Angular: 4
- Riot.js: 2
- Backbone.js: 1
- Knockout.js: 1
- Next.js: 1

## その他
- gRPC: 2



#DB・データ
Elasticsearchが伸びてる。

- MySQL: 32(AuroraのMySQLが6つ&RDSのMySQL1つ含む)
- Elasticsearch: 18(内2つがAmazon Elasticsearch Service)
- Redis: 18(内2つがRedis Cluster)
- PostgreSQL: 12
- Memcached: 10
- MongoDB: 6
- BigQuery: 5
- DynamoDB: 5
- Cassandra: 3
- Redshift: 3
- Bigtable: 3
- Presto/Hive: 2
- Solr: 1
- CloudSearch: 1
- Kafka: 1
- RabbitMQ: 1
- Couchbase: 1
- HBase: 1
- Hadoop: 1
- Athena: 1
- Oracle Exadata: 1
- Realm: 1
- SQLite: 1
- PipelineDB: 1
- Druid: 1
- Firestore: 1


#CI/CDツール
- CircleCI: 26
- Jenkins: 24
- Bitrise: 4
- Sider: 3
- Travis CI: 3
- Drone: 2
- Codecov: 2
- GitLab CI: 2
- AWS CodeBuild: 2
- AWS CloudFormation: 1
- Terraform: 1
- Screwdriver: 1
- Azure Dev Ops: 1
- fastlane: 1
- AWS CodeDeploy: 1
- DeployGate: 1
- Codeship: 1
- Cloud Build: 1
- Concourse: 1
- Chef: 1
- AppVeyor: 1

#各種ツール・その他
## 構成・サービス管理系
- Ansible: 11
- Terraform: 9
- Chef: 5
- Capistrano: 3
- Packer: 2
- Consul: 1

## 監視・BI・モニタリング系
- New Relic: 11
- Mackerel: 9
- Redash: 8
- Datadog: 6
- Sentry: 5
- Kibana: 5
- Fabric: 4
- PagerDuty: 3
- Prometheus: 2
- Grafana: 2
- BugSnag: 2
- Crashlytics: 1
- Tableau: 1
- Munin: 1
- Nagios: 1
- AppDynamics: 1
- Zabbix: 1
- Metabase: 1
- New Reric: 1

## デザイン的なコミニュケーションツール
- Zeplin: 7
- Abstract: 3
- Figma: 2

## その他
- Docker: 14(この内5つがKubernetesを利用)
- Fluentd: 11