OmniAICreator/Qiita-1.07M huggingface dataset:
VPoE と CTO の違い

# VPoE と CTO の違い

## はじめに

最近 VPoE という役職の名前を聞くようになってきて、CTO と何が違うのか不明だったため、
調べて自分なりにまとメモ

---

## VPoE (Vice President of Engineering)

- マネジメント責任者
- 開発本部長 etc

### 役割

- サービスを発展させていくために必要な業務全般を行う
- エンジニア組織のマネジメント全てを統括する
- エンジニア組織のトップとして、マネジメントを担う

### 責任

- サービスのグロースを目的とし、エンジニア組織の成長(生産性と成長の最大化)に責任を持つ

### 具体的な仕事内容

エンジニアの

- 採用
- 育成
  - 教育体系の構築
- 評価
  - 評価体系の構築
- 配置
  - チームビルディング
  - 体制
  - 組織形態
- ブランディング・広報
  - イベント企画・運営
  - 登壇
  - 技術 blog
- 文化の形成

を行う

### 適正

- 事業の拡大に貢献することに興味がある人
- コミュニケーション能力が高い人
- 人が好きな人

---

## CTO (Chief Technical Officer)

- 最高技術責任者

### 役割

- 技術戦略・方針を決定する

### 責任

- 技術的な観点から組織やサービスの成長に責任を持つ
- 「経営面での技術的な意思決定」に責任を持つ
- 技術マネジメントに責任を持つ

### 具体的な仕事内容

- 技術戦略・方針
- 新技術の調査
- 技術選定
- アーキテクチャ選定
- インフラ設計
- 品質管理
- 開発環境
- 開発手法・フロー
  - スクラム開発
  - コードレビュー
  - ブランチ戦略

### 適正

- 技術に強い人
- 技術の流れを俯瞰して捉えられる人

---

## おまけ VPoP(事業執行責任者) Product Owner

### 責任

- 事業の短中期的な開発を主導し、事業目標の達成に責任を持つ。

---

## まとめ

- エンジニア組織の成長、制度の構築に興味がある人は VPoE、技術を深く深く追求していきたい人は CTO って感じか。

## 参考リンク

- [CTO 及び、VPoE 就任のお知らせ](https://jp.corp-sansan.com/news/2018/cto_vpoe.html)
- https://tech.gunosy.io/entry/cto-vpoe-vpop
- [エンジニア組織を成功に導く「VP of Engineering」とは？ CTO との違いも徹底解説！](https://seleck.cc/1121)
- [マネジメントは「役割」。CTO・VPoE・VPoP が 3 頭分立する、Gunosy のエンジニア組織](https://seleck.cc/1220)
- [【VPoE とは】メルカリも採用！？エンジニア組織の重要なマネージャー](https://www.ieyasu.co/media/vpoe/)
- [境界線はどこにある？CTO、VPoE になれるエンジニアとなれないエンジニアの違い【及川卓也 ×FiNC 南野 ×WAmazing 舘野】](https://type.jp/et/feature/10201)
- [CTO の役割とは？エンジニアのトップキャリアパスを目指す方法](http://proengineer.internous.co.jp/content/columnfeature/12124)
#django でカスタムユーザーを設定するとき、既に開発は進んでいて migration とか辛い時ってどうすれば良いの？

マイグレーションなどで頑張るのではく OneToOne フィールドで別モデルに紐づける方法が現場ではよく使われているらしいです。(djangoの教科書より)

![image](https://user-images.githubusercontent.com/13635059/58064405-e8b8bd00-7bbc-11e9-881b-9e7fe90c2a00.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
php-master-changes 2019-05-20

今日は *.re へ変えていたファイルの *.l への再リネーム、テストの修正があった！

# 2019-05-20
## krakjoe: Revert "Rename *.l files to *.re"
- https://github.com/php/php-src/commit/e11233dc492a96844d22e4a3ed8e9e2d8a36651c
- [7.4~]
- [先日の修正](https://qiita.com/sj-i/items/691248ea7662f2f0c1ba#petk-rename-l-files-to-re) をリバート
- [PR:4172](https://github.com/php/php-src/pull/4172) で地味に喧嘩しててふいた
- 「*.l で分かるからわざわざ変えなくていいんじゃない？」と俺も最初思ったんだけど、よーく考えると本当はこれ petk の人、というか統一が本来正しい気もする（結局リバートされちゃったけど）
- 分かってる人にとってはどっちでもよい奴で、分かってない新規の人の参入障壁を下げるため構造を単純化していく、という話であって、分かってる人に分かってない人の気持ちは分からないので、その取り組みにはシンプルな原則論（同じ種類のファイルは同じ種類に見えるよう命名するとか）へ立ち返っての対応が適切
- 外部ドキュメントなんて必ず時代遅れになるもんだし、GitHub からのファイルのコミットログの見え方はともかく blame は見れるので、気にせず統一の方向に直しちゃってよかったんじゃないかな、みたいな（ただどちらかというと *.re は親しみないけど *.l は親しみあるので、もう *.l 統一でよかったんじゃないかな、みたいな）
- まあ当事者たちも言ってるように、ぶっちゃけどうでもいい些細な話だけどね！
 
## cmb69: Fix test wrt. opcache.error_log
- https://github.com/php/php-src/commit/64ec9f4dbe26ee587494b9faf510556e34aa875f
- [7.2~]
- ext/opcache で、テストで opcache.error_log をクリアするよう修正
AtomとPython3でAtCoderを始めるまで

AtCoderを始めたので、AtomとPython3でコードを素早くテストする環境を作りたい！と思ってやったことをまとめています。
※パッケージのインストール方法とかは調べればたくさん出てくるので割愛します。

## atom-runner
atomで編集したコードをショートカットで実行するパッケージです。
しかしデフォルトではPython2系で実行される（環境による？）のでPython3を実行するように変更します。

`Atom>個人設定`から`config.cson`を開き

```
runner:
    scopes:
      python: "Python3"
```
と追記。あとはpythonファイルを開いて`Ctrl+R`(Mac)で実行できます！

##標準input()を実行するためのセッティング
Python3系を動かせるようになりましたが、このままではAtCoderでよく使う

```
N = input()
```
が使えません。「どっから入力したらええねん！？」みたいに怒られてしまうのです。
そこで、`input.txt`というファイルを作成し、下記のコードをプログラムの先頭に付けることで標準入力先をこの`input.txt`に繋ぎます。

```python
import sys
import os
f = open('input.txt', 'r')
sys.stdin = f
```
これで、入力を`input.txt`に記述することで`input()`が使えるようになりました！

## スニペットの設定
よく使うコードは`snipets.cson`に書いておくことですぐに呼び出すことができるようになります。時短です。
例えば上の`input.txt`を標準入力に繋ぐコードは、ファイル作るごとに先頭に書かなければならない、メンドくさいですよね？
  
`Atom>スニペット`から`snipets.cson`を開き、下のコードを貼り付けることで

```
'.source.python':
  'atcoder_input':
    'prefix':'atcoder'
    'body':'''
      import sys
      import os
      f = open('input.txt', 'r')
      sys.stdin = f
    '''
```

`'atcoder'`と入力すればエンターキーで上のコードが記述されます。

## まとめ
設定は以上です。まだ始めたばかりなのでコンテストに参加したら使用感を書いてみようと思います。

## 参考にしたサイト
[atom・pythonで競技プログラミングのテスト環境構築](https://qiita.com/crukky/items/73c1322f5929b1ca5834)
[Atomで言語ごとにスニペットを追加登録する](https://note.nkmk.me/atom-add-snippets/)
WSGIを使ってDjangoをターミナルから叩いてみた

# 概要

Djangoで開発しててWSGI(Web Server Gateway Interface)ってたまに聞くけどよくわかってなかったんで調べてみたら、（あれ、これってひょっとしてpythonで直接叩ける？）とふと思ったんで、検証してみました。

# まずWSGIの概要

WSGIの詳細な仕様は各々調べてもらうとして、apache＋djangoをWSGIで動かしたとして、大まかに以下の図のような関係になっています。

![wsgi_01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305269/fab0d20b-85de-3de4-678b-aeba1e5c51e9.png)

図にあるようにapacheとdjangoがやり取りするインターフェースの規格がWSGIです。
django側の入り口となるのはwsgi.pyファイルで、そのファイル内に記述されているcallableなエントリポイント(ここではapplication)をapacheが呼び出すことでやり取りします。

と書くと分かりづらいかもしれまんせんが、要は、**apacheからapplication関数を呼び出して、その結果をブラウザとかに返す**というような感じです。

# 冒頭の疑問

WSGIの利点として、WSGIの仕様に対応していれば、呼び出し側（apacheとか）やWebアプリ側（djangoとか）が何であっても正常に動作する、というのがあります。
では、以下の場合でも動作するのでは？と考えました。

![wsgi_02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305269/adb4dc47-64ad-ac76-d062-936e9fd80c6c.png)

WSGIの仕様さえ守っていれば何でもいいんだから、呼び出し側はpythonスクリプトにしてimportしてやってもいけるのでは？

というわけで検証してみました。

# 検証環境

* Centos : 7
* Python : 3.7.1
* Django : 2.1.7

上記の環境で、[こちらのチュートリアル](https://docs.djangoproject.com/ja/2.2/intro/tutorial01/)に沿ってPollsのviewを作って、そのviewをPythonスクリプトからWSGIを通して呼び出してみました。

# Pythonスクリプトの内容

以下が、applicationを呼び出す``kick_wsgi.py``スクリプトです。

```python:kick_wsgi.py
# wsgi.pyファイルのapplicationエントリポイントのimport
from mysite.wsgi import application

# applicationに渡すメソッド
# 検証だけなので適当、表示のみ    
def start_response(status, response_headers):
    print('status           => %s' % status)
    print('response_headers => %s' % response_headers)

# applicationでGETメソッドを動作させる為に必要な最低限のパラメータ
environ = {}
environ['PATH_INFO']      = '/polls/'
environ['REQUEST_URI']    = '/polls/'
environ['REQUEST_METHOD'] = 'GET'
environ['SERVER_NAME']    = 'localhost.localdomain'
environ['SERVER_PORT']    = '80'
environ['wsgi.input']     = '' # これは謎、無いと怒られる

# application呼び出し
response = application(environ, start_response)

# HTMLのコンテンツ表示
print('content          => %s' % response.content)
```

applicationの第2引数:start_responseはdjangoの結果を受け取るだけなんでここでは適当です。重要なのは第1引数:environで、上記のスクリプトを見るとenvironで渡すパラメータには見覚えのあるパラメータ名が並んでいると思います。とりあえずdjangoを騙くらかして動かせればいいんで、最低限必要そうなのをセットしてます。

# スクリプトの実行結果

```
[guest@localhost hoge]$ PYTHONPATH=. python kick_wsgi.py 
status           => 200 OK
response_headers => [('Content-Type', 'text/html; charset=utf-8'), ('X-Frame-Options', 'SAMEORIGIN'), ('Content-Length', '40')]
content          => b"Hello, world. You're at the polls index."
```
想定通りの結果が返ってきました！

# まとめ

djangoをWSGIを使ってキックするのは思いのほかシンプルで簡単でした。シンプルだからこそ、WSGIに対応しているWebサーバやWebアプリであれば部品のように交換して動作させられるんでしょう。

あと私のようなターミナル大好き人間にとってはフレームワークやらなんやらをターミナルから直接叩ける方法があると嬉しかったりするのでこの記事は備忘録用でもあります。（ターミナルから直接叩けて何が嬉しいのか・・それはターミナル好きにしかわからない・・）
基礎から学ぶiPhoneアプリ開発

##基礎から学ぶiPhoneアプリ開発
###iPhoneやiPadで動くアプリ開発の手順書

XCode9対応

iOS SDKの機能について

Core OS

Core Services

| 機能・サービス名 |説明|
|----|----|
|CFNetWork| |
|Core Data| |
|Core Foundation| |
|Core Location| |
|Core Media| |
|Core Telephony| |
|Core Foundation| |
|Grand Central Dispatch| |
|Mobile Core Service| |
|SQLite| |
|XML| |
|アドレスブック| |
|アプリケーション内購入| |
|イベントキック| |
|クイックルック| |
|ブロックオブジェクト| |

Media

| 機能・サービス名 |説明|
|----|----|
|AirPlay| |
|AV Foundation| |
|Core Animation| |
|Core Audio| |
|Core MIDI| |
|Core Text| |
|Image I/O| |
|OpenAL| |
|OpenGL ES| |
|Quartz| |
|アセットライブラリ| |
|ビデオ| |
|メディアプレイヤー| |

Cocoa Touch

| 機能・サービス名 |説明|
|----|----|
|AirPrint| |
|iAd| |
|iTunes ファイル共有| |
|Mapキット| |
|Peer-to-Peer通信| |
|UIKit| |
|アドレスブックUI| |
|アプリケーション内メール送信| |
|イベントキットUI| |
|ジェスチャー認識| |
|プッシュ通知サービス| |
|マルチタスク| |
|ローカル通知| |

---


## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
Udacity: ES6 JavaScript Improved メモ③

UdacityのES6 - JavaScript Improvedコースを、受講しながらメモしていきます。
<font color="PaleVioletRed">*Lesson3 Built-ins*</font>

##Symbols
新しく追加されたデータ型。
主に、オブジェクトのプロパティを特定するために使われる。
symbolを作るには、`Symbol()`を使用する。引数には文字列が入る。


```example.js
const bowl = {
  'apple': { color: 'red', weight: 136 },
  'banana': { color: 'yellow', weight: 183 },
  'orange': { color: 'orange', weight: 170 },
  'banana': { color: 'yellow', weight: 176 } // 前に書いたbananaが上書きされる
};
```
この書き方だと、bananaというプロパティ名が重複するため、上書きされてしまう。
そこで…

```example.js
const bowl = {
  [Symbol('apple')]: { color: 'red', weight: 136 },
  [Symbol('banana')]: { color: 'yellow', weight: 183},
  [Symbol('orange')]: { color: 'orange', weight: 170 },
  [Symbol('banana')]: { color: 'yellow', weight: 176 } // 上書きされない！
};
```
`Symbol()`を使うことで、プロパティ名の重複を許容することができる。
使いどころとしては、新しくメソッドなどを追加するとき。既存ライブラリとケンカせずに追加できる。

##Set①
`Set`は、値の重複がないオブジェクト、のことを指す。
配列とは異なり、**インデックスによるアクセスができない**という点に注意。

```example.js
const sample1 = [1, 1, 2, 3]; // 値の重複があるため、セットといえない
const sample2 = [1, 2, 3, 4]; // 値の重複がないため、セットといえる
```
sample2はセットといえるがただの配列にすぎず、`sample2.push(2)`とすれば、2が重複する。
そこで、セットを作り出す`new Set()`が追加された。

```example.js
const foo = new Set(); // 空のセットを作成
console.log(foo);
// Set{}

const games = new Set(['Pokemon', 'Mario', 'Zelda', 'Pokemon']); // 値を入力して初期化も可能
console.log(games);
//　Set(3) {"Pokemon", "Mario", "Zelda"}
```
gamesには'Pokemon'を重複して入力しているが、Setは重複を許さないため、自動的に削除される。

Setの追加・削除にはそれぞれ、`add()`、`delete()`メソッドが使える。
全ての要素を一括削除するには`clear()`メソッドが使える。
先ほど作成したgames変数を使って…

```example.js
games.add('Kirby');
games.add('Donkey Kong');
games.delete('Mario');

console.log(games);
// Set(4) {"Pokemon", "Zelda", "Kirby", "Donkey Kong"}

games.clear(); //一括削除

console.log(games);
// Set(0) {}
```

セットの長さ（配列のlengthに相当）は、`set.size`のようにsizeプロパティで取得できる。

##Set②
`values()`メソッドは、イテレータオブジェクトを返す。
イテレータオブジェクトは`next()`を使用して、格納された値を順番に取得できる。

```example.js
const months = new Set(['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']);

const iterator = months.values(); // 変数iteratorにイテレータオブジェクトを代入

console.log(iterator.next()); // {value: "January", done: false}
console.log(iterator.next()); // {value: "February", done: false}
console.log(iterator.next()); // {value: "March", done: false}
```

`done`プロパティは、セットの最後に到達したかどうか、を表している。
つまり、trueになったら、セットの最後に到達したということ。

`for...of`ループを使えば、より簡単にアクセスできる。
JavaScriptはシングルスレッドで実行される

自分自身が勘違いしていたので記事にします。

## 問題

```html:
<!DOCTYPE html>
<html>

<head>
    <title>Document</title>
</head>

<body>
    <script>
        console.log(`Start ${new Date()}`)

        // 3秒後にCallbackと表示
        setTimeout(() => {
            console.log(`Callback ${new Date()}`)
        }, 3000)

        // 10秒間かかる処理を実行する
        const now = new Date()
        let dummy = 0
        while (new Date() - now < 10000) {
            dummy++ // 適当な計算処理
        }

        console.log(`End ${new Date()}`)
    </script>
</body>

</html>
```

このHTMLをブラウザで表示させると、コンソールには`Start`, `Callback`, `End`がどの順番で表示されるでしょうか？

1. `Start`が表示される
2. 3秒後に`Callback`と表示されることが予約される
3. 10秒間かかる処理を実行する<br>この間に少なくとも3秒間経過するので`Callback`と表示される
5. `End`と表示される

よって`Start`→`Callback`→`End`

だと思っていませんか？

残念！不正解です。

<img width="1017" alt="スクリーンショット 2019-05-21 11.14.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197209/8d6b31c2-31b9-ef53-bb6b-8cb790aa965d.png">


## 実行結果

```text:
Start Tue May 21 2019 10:39:40 GMT+0900 (日本標準時)
End Tue May 21 2019 10:39:50 GMT+0900 (日本標準時)
Callback Tue May 21 2019 10:39:50 GMT+0900 (日本標準時)
```

実際には`Start`→`End`→`Callback`の順番で実行されます。

## ポイント

ここら辺がポイントです。

- `setTimeout`は規定時間後に関数の実行を予約する
- しかし、JavaScriptはシングルスレッドで実行される
    - つまり、2つ以上の処理を並行して実行できない
    - 2つ以上の関数を同時実行できない

## 解説

つまり、正しくは以下のような順序になります。

1. `Start`が表示される
2. 3秒後に`Callback`と表示されることが予約される
3. 10秒間かかる処理を実行する<br>この間に少なくとも3秒間経過するが、まだメインの処理が実行されているので2.の関数を実行開始できない
5. `End`と表示される
6. メインの処理が完了して次の処理を実行可能になったので、2.の関数が実行される<br>`Callback`と表示される

よって`Start`→`End`→`Callback`の順番で実行されます。

<img width="1017" alt="スクリーンショット 2019-05-21 11.14.22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197209/c491122a-fb19-19f0-4fcc-58176c6eb449.png">

ちなみに、`setTimeout`を使う場合以外でも、

- Ajaxでの非同期処理
- Node.jsでのファイル読み込みなどの非同期処理

などの場合もシングルスレッドなので同様の処理順になります。
SELECT文でカラムごとに条件指定したデータを出力したい


#やりたいこと
カラムごとに条件を変えたSELECT文を書きたい。

```sql
SELECT (出力データ) 
FROM (テーブル) 
WHERE (出力条件) 
GROUP BY (指定カラム) 
ORDER BY (指定カラム)
```

上記のSELECT文はよく書くと思うんですが、
カラムごとに条件を変えたSELECT文ってどうすればいいんだろうと考えたとき、
簡単にできそうと思いあれこれ試すも、WHERE句が1つしか書けなくてムズムズ…
(SQL力なさすぎるがゆえ)

#ちょっと考えたら…
やりたいイメージはできていてもなかなか形にならなかったんですが、
case文みたいなものはSQLにはないのかと。

早速ググりました。


**ありました…**


（知ってる人からしたら当然ですが…）

#CASEを使ってみる

指定した複数の条件ごとにカラムをもってデータを出力したい。

例のテーブル：果物の売上データ(sales_data)
→顧客番号(c_num)、年(year)、月(month)、日(date)、商品(item)、売上数(s_qty)


```sql
SELECT date, 
COUNT(DISTINCT c_num) AS 購入顧客数 , SUM(s_qty) AS 売上数 
FROM sales_data 
WHERE year = 2019 AND month = 05 AND item = apple 
GROUP BY date 
ORDER BY date;
```
この場合、`year = 2019 AND month = 05 AND item = apple`以外の条件の出力が1つのSELECT文では厳しいです。

```sql
SELECT date, 
COUNT(DISTINCT CASE WHEN year = 2019 AND month = 05 AND item = apple then c_num end) AS "りんごを購入した顧客数_201905", 
COUNT(DISTINCT CASE WHEN year = 2019 AND month = 05 AND item = orange then c_num end) AS "オレンジを購入した顧客数_201904", 
SUM(CASE WHEN year = 2019 AND month = 05 AND item = apple then s_qty end) AS "りんごの売上数_201905", 
SUM(CASE WHEN year = 2019 AND month = 05 AND item = orange then s_qty end) AS "オレンジの売上数_201904"
FROM sales_data  
GROUP BY date 
ORDER BY date;
```

COUNTやSUMの中でCASE WHENで条件を記述することでカラムごとに条件を変更することができ、横に並べて出力することができます。
CASEの場合は**WHEREではなく、WHEN**という点に注意。

#おわりに
SQLは苦手意識あったんですが、こうして色々調べて自分で試すと理解が深まって良いと思いました。
和暦西暦変換を如何に完全に処理するか

text値の日付と思われる値を、date型の日付値に変換処理を作る事になり
あーでもないこーでもないと頭を悩ませた結果が以下の処理です。
最大の懸案は、「2桁の数値のみ」の年を如何に正しく変換するか、なのですが
今のところ正解がわかりません(´･ω･`)
19[63]と昭和[63]とかどうしたもんですかね？

想定するtextは
「2015年1月1日」「15年1月1日」「2015年01月01日」
「2015/1/1」「2015/01/01」「15/1/1」「15/01/01」
「2015-1-1」「2015-01-01」「15-1-1」「15-01-01」
「2015.1.1」「2015.01.01」「15.1.1」「15.01.01」
「平成27年1月1日」「平成27年01月01日」「H27年1月1日」「H27年01月01日」
「H27/1/1」「H27/01/01」
「H27-1-1」「H27-01-01」
「H27.1.1」「H27.01.01」
ざっとこんな感じです。

とりあえず作った処理は↓な感じ。

```python:datetextToDate.py
    def datetextToDate(self, date):
        #渡された日付を日付型にして返す
        #和暦対応
        list_wareki = ["昭和", 1925], ["平成", 1988], ["令和", 2018], ["S", 1925], ["H", 1988], ["R", 2018]
        #
        #引数を取得
        date_text = date
        #
        #和暦判定
        for nengou, nensuu in list_wareki:
            result_find_date_text_type = date_text.find(nengou)
            if result_find_date_text_type != -1:
                year_add = nensuu
                break
            #
        #
        #日付区切り毎に処理を行う
        #区切りが「年月日」
        if (date_text.find("年") != -1):
            search_date_regular = "((?<![0-9])[0-9]{1,4})年([0-9]{1,2})月([0-9]{1,2})日"
        #区切りが「/」
        elif (date_text.find("/") != -1):
            search_date_regular = "((?<![0-9])[0-9]{1,4})/([0-9]{1,2})/([0-9]{1,2})"
        #区切りが「-」
        elif (date_text.find("-") != -1):
            search_date_regular = "((?<![0-9])[0-9]{1,4})-([0-9]{1,2})-([0-9]{1,2})"
        #区切りが「.」
        elif (date_text.find(".") != -1):
            search_date_regular = "((?<![0-9])[0-9]{1,4})\.([0-9]{1,2})\.([0-9]{1,2})"
        #区切りが見つからなかった場合
        else:
            return "日付の区切り記号が判定出来ませんでした。：" + date, False
        #
        #日付を各要素に分解する
        search_result_date = re.search(search_date_regular, date_text)
        #
        #日付が入っていない場合は処理を抜ける
        if search_result_date == None:
            return "年月日の3つが取得出来ませんでした：" + date, False
        #
        y = int(search_result_date.group(1))
        m = int(search_result_date.group(2))
        d = int(search_result_date.group(3))
        #
        #和暦の場合
        if result_find_date_text_type != -1:
            y = y + year_add
        else:
            #西暦だが2桁の場合
            if len(str(y)) == 2:
                y = y + 2000
        #
        #日付チェック
        try:
            newDataStr="%04d/%02d/%02d"%(y,m,d)
            newDate=datetime.datetime.strptime(newDataStr,"%Y/%m/%d")
            #return True
        except ValueError:
            return "日付が正しい値ではありませんでした：" + date, False
        #
        #日付に変換する
        date_dt = str(datetime.date(y, m, d))
        date_dt = datetime.datetime.strptime(date_dt, "%Y-%m-%d")
        #
        #変換後の値を返す
        return date_dt, True
```
UE4 Shader Pipeline Cache に乗っていないシェーダーを調査する

# Shader Pipeline Cache とは
シェーダーは GPU に投入される前に、シェーダーコードをシェーダーバイナリへコンパイルする必要があります。 Shader Pipeline Cache は、コンパイル済みシェーダーバイナリをメモリ上にキャッシュし、次に利用する際にキャッシュ済みシェーダーバイナリを再利用する機能です。
事前にシェーダーリストを生成し、ゲーム起動時やローディングの合間にコンパイルすることができます。
https://docs.unrealengine.com/en-us/Engine/Rendering/PSO-Caching

キャッシュされていないシェーダーが使われる場合、次のように大きくヒッチが発生します。
![キャプチャ.PNG.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083/b0386437-8373-d42e-25bd-780a9906664d.png)

# シェーダーリストの生成
実際にシェーダーが使われる前にシェーダーをコンパイルするには、シェーダーリストが必要となります。このシェーダーリストを生成するには、実際にゲームをプレイし、シェーダーをコンパイルしたログを収集することになりますが、言うまでもなくとても面倒な作業となります。
そこで、次の画像のようにゲーム中に動的にスポーンされるマテリアルをアサインしたメッシュを並べたレベルを作成し、このレベルでシェーダーコンパイルのログを収集することにしました。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1083/cb38da28-be0e-0f02-e3fc-621a78164028.png)
レベルのライティング環境や、メッシュのライティング設定、アサインしたコンポーネント（ InstancedStaticMeshComponent など）によってシェーダーは変わります。

# リスト漏れシェーダーを探す
上記のようにシェーダーのプリコンパイルを行っても、実際にはリストの漏れが原因で、シェーダーコンパイルによるヒッチが発生したりします。
原因のシェーダーを探すには、シェーダーのハッシュをログに出力します。

```c++:Engine/Source/Runtime/OpenGLDrv/Private/OpenGLShaders.cpp
// Link program, using the data provided in config
LinkedProgram = LinkProgram(Config, bFromPSOFileCache);

UE_LOG(LogRHI, Warning, TEXT("not found LinkedProgram: VertexShaderHash( %s ), PixelShaderHash( %s )"), *VertexShaderRHI->GetHash().ToString(), *PixelShaderRHI->GetHash().ToString());
```
出力されたシェーダーハッシュを `/PATH/TO/PROJECT/Saved/Cooked/PLATFORM/*.scl.csv` に存在するクック済みマテリアル情報と照らし合わせ、該当するマテリアルをシェーダーリスト用レベルに追加します。

```
LogRHI: Warning: not found LinkedProgram: VertexShaderHash( F9B8B3D7AF22F9874B766922B3068F2501856565 ), PixelShaderHash( B26D8EF588701C166A73B52ABF2DBE43543E5FF8 )
```

```bash
% cat ShaderStableInfo-MyGame-GLSL_ES3_1_ANDROID.scl.csv | grep B26D8EF588701C166A73B52ABF2DBE43543E5FF8 | awk -F, '{ print $1 " " $2 " " $9 }'
MaterialInstanceConstant /Game/Item/Weapon/Base/Material/MI_WeaponMat_Default_Base_ORM_Mana.MI_WeaponMat_Default_Base_ORM_Mana TMobileBasePassPSFMobileDirectionalLightCSMAndSHIndirectPolicyINT32_MAXLDRGamma32 FLocalVertexFactory
MaterialInstanceConstant /Game/Item/Weapon/Base/Material/MI_WeaponMat_Default_Base_ORM_Mana.MI_WeaponMat_Default_Base_ORM_Mana TMobileBasePassPSFMobileDirectionalLightAndSHIndirectPolicyINT32_MAXLDRGamma32 FLocalVertexFactory
MaterialInstanceConstant /Game/Item/Weapon/Normal/Material/MI_p_wp_Mid160c.MI_p_wp_Mid160c TMobileBasePassPSFMobileDirectionalLightCSMAndSHIndirectPolicyINT32_MAXLDRGamma32 FLocalVertexFactory
MaterialInstanceConstant /Game/Item/Weapon/Normal/Material/MI_p_wp_Mid160c.MI_p_wp_Mid160c TMobileBasePassPSFMobileDirectionalLightAndSHIndirectPolicyINT32_MAXLDRGamma32 FLocalVertexFactory
...
```
出力内容は左から、マテリアル名、ピクセルシェーダータイプ、頂点シェーダータイプとなります。
スイッチを押しているとき、加速度の値をBluetoothで送信する

**※この記事は、「[LSM9DS1で加速度の値をシリアルにプリントする](https://qiita.com/Shun141/items/52be0749739c68feda0c)」を前提としています。**

ジェスチャーゲームを目標としていますので、

1. 無線通信できること
2. 動作の切り取りをすること

が不可欠です。
動作の切り取りは閾値を指定してやることで解決できますが、今回はWiiのボウリングを見習ってボタン（スイッチ）で切り取りたいと思います。
**スイッチを押し続けている間の動き**をジェスチャーとして認識します。

## 回路
こんな感じ↓
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390958/89e8868e-33c4-3193-0c8f-c6512c713ec5.jpeg" width="700">
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390958/706383ab-a103-1983-1537-02b7d8a04718.png)


## コード
```acc_ble.ino
#include <SparkFunLSM9DS1.h>
#include "BluetoothSerial.h"

#define LSM9DS1_M 0x1E
#define LSM9DS1_AG 0x6B
#define SW_PIN 7 //pin番号を指定する

LSM9DS1 imu;
BluetoothSerial SerialBT;

float x,y,z;
uint16_t connectionState = 0;

void setup()
{
  Serial.begin(115200);
  SerialBT.begin("ESP32"); //Bluetoothの名前を指定
  pinMode(SW_PIN, INPUT);
  
  imu.settings.device.commInterface = IMU_MODE_I2C;
  imu.settings.device.mAddress = LSM9DS1_M;
  imu.settings.device.agAddress = LSM9DS1_AG;
  if (connectionState == 0)
  {
    connectionState = imu.begin();
    while (connectionState == 0)
    {
      Serial.println("Failed to communicate with LSM9DS1.");
      Serial.println("Double-check wiring.");
      Serial.println("Default settings in this sketch will "
                     "work for an out of the box LSM9DS1 "
                     "Breakout, but may need to be modified "
                     "if the board jumpers are.");
      Serial.print("Connection Status: ");
      Serial.println(imu.begin());
      delay(1000);
      connectionState = imu.begin();
      Serial.println("------------------------------------------------------\n");
    }if(connectionState!=1){
      Serial.print("connectionState: ");
      Serial.println(connectionState);
    }
  }
}


void loop()
{
  imu.readAccel();
  x=imu.calcAccel(imu.ax)*10;
  y=imu.calcAccel(imu.ay)*10;
  z=imu.calcAccel(imu.az)*10;
  if(digitalRead(SW_PIN) == 1){ //スイッチが押されたら1、離すと0
    SerialBT.print("x=");
    SerialBT.print(x);
    SerialBT.print(", y=");
    SerialBT.print(y);
    SerialBT.print(", z=");
    SerialBT.println(z);
  }
  delay(500);
}
```

## Bluetooth接続
書き込みが終了すると、ESP32はBluetooth接続を待機している状態になります。
PC側で接続してあげましょう。

1. "設定" → "デバイス" → "Bluetoothとその他のデバイス"
2. 上部の "Bluetoothまたはその他のデバイスを追加する" をクリック
3. "Bluetooth" をクリックして "ESP32" を探してクリック
4. 一覧に "ESP32 ペアリング済み" と出たら接続完了

**完了すれば、PCとは切り離して、モバイルバッテリー等の電源に繋がっていれば大丈夫です。**

## 受信した値を見る
方法はいくつかありますが、せっかく**Arduino IDE**を使っていますのでそちらの**シリアルモニタ**(虫眼鏡のアイコン)で見てみましょう。
先ほど書き込んだポートのままになっていますので、**"ツール" → "シリアルポート"**でBluetoothのポート（さっきまではなかったポート）を探して変更しましょう。


**以上です！
何か分からないことがあれば質問どうぞ！**
LINQ to SQL の where で NTEXT 型のカラムを扱う方法

# 問題

次のコードのように LINQ to SQL で `NTEXT` 型のカラムを `where` で扱おうとしても

```C#
using(var dc = new DataContext())
{
    var NoDescriptionApples = dc.Apples
        .Where(i => "" == i.description).ToList(); // NG
    ...
}
```

そもそも素の SQL 文上で `NTEXT` 型の文字列比較はサポートされていない為、実行時エラーになります。

# 対処方法

`NTEXT` 型のまま比較しようするから弾かれるので、 `Substring()` で比較対象となる文字列より１文字だけ多く切り出して比較します。

```C#
using(var dc = new DataContext())
{
    var NoDescriptionApples = dc.Apples
        .Where(i => "" == i.description.Substring(0, 1)).ToList(); // OK
    ...
}
```

C# 上での `Substring()` は SQL の [SUBSTRING](https://docs.microsoft.com/ja-jp/sql/t-sql/functions/substring-transact-sql?view=sql-server-2017) に翻訳され、 `SUBSTRING` に `NTEXT` 型のデータを与えて実行した場合の戻り型は `NVARCHAR` 型になる為、普通に文字列比較ができるようになります。

# その他の対処方法

今回のようなケースではそもそも `NTEXT` 型の使用を諦めて `NVARCHAR` 型にしてしまうのが一般的なようです。
最尤法（method of maximum likelihood）を用いた画像分類

#はじめに
最尤推定（maximum likelihood estimation）や最尤法（method of maximum likelihood）とは，統計学において，与えられたデータからそれが従う確率分布の母数を点推定する方法のことをさします．
尤とは非常に優れているという意味で，直訳すれば最も非常に優れている推定方法，となりますね（笑）

#今回やること
画像の特定の５箇所を５クラスに設定して，該当するクラスごとに10点のr,g,b値を教師データとして格納し， 入力画像の各画素がどのクラスに該当するかを最尤法を用いて算出する. 

#アルゴリズム
今回のプログラムでは，入力した画像の特徴的な部分を任意に５クラス選出し，
画像の各画素がどのクラスに属するかを最尤法を用いて推定していきます．
使用する言語はPython３です．

以下の画像のように，入力画像の一部を1~5のクラス番号を振り，各クラスから教師データ用に10点を選出し，座標ごとのr,g,bの格納します．
![sample.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403949/7f7b0ac3-ce3e-eec1-e96b-9b166dd1fc6a.jpeg)

その後，
・各クラスの平均画素値
$$m=[Rmean,Gmean,Bmean]$$
・各クラスの共分散行列
$$cV$$
・共分散行列の逆行列
$$cV^{-1}$$
・共分散行列の行列式
$$|cV|$$
を計算します．
そして上記を用いて尤度の計算をおこないます．
尤度の計算式は、以下の式を用います。

$$ J(x,c) = log|cV|+d^2(x,c)$$
$$ d^2(x,c) = (x-m)cV^{-1}(x-m)^t$$

ここで，入力画像の各座標の画素値(r,g,b)がxとなります．
5種類のクラス分の計算を行い,J(x,c)が最小のクラスに分類していきます．

実際に数値を適当に設定して出力した画像はこちらになります．
![result.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403949/59468054-d45a-d7d7-9e0d-29c1bca60c1e.jpeg)


#ソースコード
雑ですが，サンプルコードはこちらにあげてあります．
https://github.com/legion98/Maximum-Likelihood-Method-example

コード中に記載されている教師データの座標は，適当に仮置きしたものなので，
画像編集ソフト等を用いて，自分で選出して使ってください．
EC-CUBE3でデバッグモードを利用する手順【index_dev.php不要】

<!--
-->
先日ECCUBE3で構築されているサイトを触ることになったのですが、

- index_dev.php が無い!?
- `dump()`が使えない（本番環境と同じ設定になっている?）
- Warningエラーが既存で大量発生していてローカル環境が見れない

というめまいの催すような環境だったのでデバッグモード設定の手順をまとめます。

ECCUBE3を触るときにindex_dev.phpを付けてデバッグするのが一般的だと思いますが、
毎回URL打つのは手間なので、URL変える必要なくデバッグモードを設定していきます。

## デバッグモードを設定する手順
### ECCUBEのconfig.ymlを修正
デバッグモードをconfigで設定できるようにします。  

```diff:app/config/eccube/config.yml
auth_magic: xxxxx
password_hash_algos: sha256
shop_name: the_shop
force_ssl: 1
admin_allow_host: {  }
cookie_lifetime: 0
locale: ja
timezone: Asia/Tokyo
eccube_install: 1
option_favorite_product: 0
+ debug: true
```  

### Application側でconfigを読み込み
yamlで設定した値を読み、`config: true`であればsymfonyのデバッグハンドラーを呼び出しています。
Application.phpの`initialize()`メソッドであればどこに記載してもよいかと思います。

```diff:src/Eccube/Application.php
    public function initialize()
    {
    //
    // ...
    //
+    if (isset($this['config']['debug']) && $this['config']['debug']) {
+      $this['debug'] = true;
+      Debug::enable(E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_WARNING);
+    }
```  

### TwigServiceProviderの設定変更
これまででデバッグモード自体は有効になりましたが、
Twig上で発生している既存のNoticeやWarningエラーを無視したいので下記を設定します。

```diff:vendor/silex/silex/src/Silex/Provider/TwigServiceProvider.php
/**
 * Twig integration for Silex.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */

class TwigServiceProvider implements ServiceProviderInterface
{
    public function register(Application $app)
    {
        $app['twig.options'] = array();
        $app['twig.form.templates'] = array('form_div_layout.html.twig');
        $app['twig.path'] = array();
        $app['twig.templates'] = array();

        $app['twig'] = $app->share(function ($app) {
            $app['twig.options'] = array_replace(
                array(
                    'charset' => $app['charset'],
                    'debug' => $app['debug'],
-                    'strict_variables' => $app['debug'],
+                    'strict_variables' => false,
                ), $app['twig.options']
            );

```

---

これでURLを切り替えることなくデバッグモードが使えるようになりました！

![Image201905201138.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245411/0cdde82c-701d-0295-df3d-f78540120124.png)  


ECCUBE3のデバッグで困っている..という方は試してみてはどうでしょうか。
コレクションの初期化

備忘録として

LISTの初期化の方法として複数の方法があるので忘れないようにメモ

Dim list1 As New List(Of Integer)(New Integer() {1, 2})
                Dim list2 As List(Of Integer) = New List(Of Integer) From {1, 2}
                Dim list3 As New List(Of Integer) From {1, 2}
                Dim list4 = New List(Of Integer) From {1, 2}

※list4はObject型になるのでLinqが使えない
いずれも中身は同様
System.Collections.Generic.List(Of Integer)
(0)	1	Integer
(1)	2	Integer
【UiPath】文字の前後だけじゃなくて、文字列内にある空白も削除したい


文字の前後の空白を削除したい場合は`trim`ですよね。みなさんご存知かと思います。

でも、trimでは文字のなかにある空白って削除できないですよね。例えば「山田 太郎」は無理です。

困ったなあ。。。

というわけで頑張りました。


# 文字の中にある空白を削除する

変数nameに`山田 太郎`が入っているとすると

```
name.ToString().Replace(" ", string.Empty)
```

これで、文字列内の空白が削除されます。

結果は`山田太郎`です。すごい！！


ちなみに、改行やタブとかも削除できるそうです。

その場合はこれ

```
name.ToString().Replace(" ", string.Empty).Replace(vbTab, string.Empty).Replace(vbLf, string.Empty).Replace(vbCr, string.Empty).Replace(" ", string.Empty)
```


# string.Emptyとは

string.Emptyは「空の文字列」だそうです！

なので、`.Replace(" ", string.Empty)`というのは、「空白を空の文字列に変換している」つまり、空白を削除しているという意味です。

そして、`vBTab`がタブであるとか`vbLF`が改行であるとかはVB.Netで決まっています。

このサイト↓↓をみれば、少し応用できそうですね！
[https://dobon.net/vb/dotnet/string/controlchars.html](https://dobon.net/vb/dotnet/string/controlchars.html)


# おわりに

というわけで、文字列内にある空白や改行、タブを削除する方法を学びました。
OCRで文字を取り出すときとかに使えそうですね！

みなさんもぜひ使ってみてください！
リモートURLを指定すると #Twitter #API を叩いて画像付きツイートをする #python スクリプトの例

# config.py

```
CONSUMER_KEY=''
CONSUMER_SECRET=''
ACCESS_TOKEN=''
ACCESS_TOKEN_SECRET=''

```

# twitterauth.py

```py
#!/usr/bin/env python3

import os, config
from requests_oauthlib import OAuth1Session

if os.environ.get('TWITTER_CONSUMER_KEY'):
  CONSUMER_KEY = os.environ.get('TWITTER_CONSUMER_KEY')
  CONSUMER_SECRET = os.environ.get('TWITTER_CONSUMER_SECRET')
  ACCESS_TOKEN = os.environ.get('TWITTER_ACCESS_TOKEN')
  ACCESS_TOKEN_SECRET = os.environ.get('TWITTER_ACCESS_TOKEN_SECRET')
else:
  CONSUMER_KEY = config.CONSUMER_KEY
  CONSUMER_SECRET = config.CONSUMER_SECRET
  ACCESS_TOKEN = config.ACCESS_TOKEN
  ACCESS_TOKEN_SECRET = config.ACCESS_TOKEN_SECRET

def twitter():
  return  OAuth1Session(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

```

# script.py

```py
#!/usr/bin/env python3

import json, config, os, twitterauth, sys, base64

url = 'https://dummyimage.com/600x400/000/fff'

twitter = twitterauth.twitter()

image_bytes = base64.b64encode(requests.get(url).content)
image_base64_str = image_bytes.decode('utf-8')

media_api_params = {
  "media_data": image_base64_str
}

media_api_url = 'https://upload.twitter.com/1.1/media/upload.json'
media_api_res = twitter.post(media_api_url, params = media_api_params)

media_id_string = media_api_res.json().get('media_id_string')



update_api_params = {
  "status" : "test message",
  "media_ids" : media_id_string,
}

update_api_url = 'https://api.twitter.com/1.1/statuses/update.json'

update_api_res = twitter.post(update_api_url, params = update_api_params)


print(json.dumps(media_api_res.json()))
```

 # result

![image](https://user-images.githubusercontent.com/13635059/58061706-4d224f00-7bb2-11e9-9c3f-345eb150bf6f.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
アプリ開発で使う mitmproxy 4.0 のコマンド一覧

# mitmproxy 4.0チートシート
- アプリ開発でよく使うコマンドをまとめた
    - 大きく操作が変わったversion 4での内容です
- 基本的な操作 q, tab, enter, j, k, ctr + d, shift + g, gg は除く

## コマンド一覧みたい
`?`

## flow list をフィルタリングしたい
`f`

## 並び替え(sort, order by)したい
`o`

## 画像のみをフィルタリングしたい
```
# fを押して
f

# : set view_filter= が表示されるので、下記を入力
~a jpg
```

## POST(Method)のみをフィルタリングしたい
```
f
~m POST

```

## Content-typeでフィルタリング
```
f
~t json
```


## flow list をコピーしたい
- Altを押したまま選択
- macだとfnを押したまま選択

## flow listを消したい
`z`

## curlコマンドに変換（コピー）したい
```sh
# :を押してコマンドプロンプトにして
:

# 以下を入力でクリップボードにcurl形式でコピー
# @focusで表示中の内容をコピー
export.clip curl @focus
```

## 常に一番下に新しい通信を表示したい（followingモード）
```sh
F (shift + f)

# 解除は再度F
```
(Ruby)インスタンス変数について(備忘録)

<h2>変数の種類</h2>
<table>
<tr><th>種類</th><th>命名規則</th><th>有効範囲<br>（スコープ）</th><th>例</th></tr>
<tr><td>ローカル変数</td><td>英小文字<br>または_</td><td>作られた場所（メソッドなど）でのみ</td><td>name<br>_name</td></tr>
<tr><td>インスタンス変数</td><td>＠で始まる</td><td>クラスのメソッド内で定義され、そのクラス内で参照可能</td><td>@name</td></tr>
<tr><td>クラス変数</td><td>＠＠で始まる</td><td>クラスのメソッド外で定義され、継承されても参照可能</td><td>@@name</td></tr>
<tr><td>グローバル変数</td><td>＄で始まる</td><td>プログラムの<br>どこからでも<br>参照可能</td><td>$name</td></tr>
</table>

<p>インスタンス変数とは、<strong>オブジェクトの情報を格納した変数</strong>のこと</p>

<p>例）</p>

```ruby:qiita.rb
class Fish
  def name=(name)
    @name = name
  end
  
  def name
    @name
  end
end

fish = Fish.new

fish.name = "さば"

puts fish.name

=>"さば"
```

<h3>解説</h3>
```
def name=(name)
　　@name = name
end
```
<p>:point_up_2:nameを@name（インスタンス変数）に格納している（セッター）</p>
```
def name
  @name
end
```

<p>:point_up_2:メソッドに定義して値を取り出せるようにしている（ゲッター）</p>


```
fish = Fish.new
```
<p>:point_up_2:クラスをオブジェクト化している</p>

```
fish.name = "さば"
```
<p>:point_up_2:セッターを呼び出して、"さば"と言う値を格納している</p>

```
puts fish.name
```
<p>:point_up_2:ゲッターを呼び出して、putsで出力する</p>


<h3>セッターとゲッターの省略した形</h3>
<p>・セッター</p>
```
def name=(name)
  @name = name
end
```
||
\/

```
attr_writter :name
```

<p>・ゲッター</p>
```
def name
  @name
end
```
||
\/

```
attr_reader :name
```
<p>:point_down:まとめた形</p>

```ruby:qiita.rb
class Fish
  attr_writter :name
  attr_reader :name
end

 fish = Fish.new

 fish.name = "さば"

 puts fish.name

=>"さば"
```

<p>さらに省略した形</p>
```
attr_writter :name
attr_reader :name
```
||
\/

```
attr_accesor :name
```

<p>:point_down:まとめた形</p>

```ruby:qiita.rb
class Fish
  attr_accesor :name
end

 fish = Fish.new

 fish.name = "さば"

 puts fish.name

=>"さば"
```

<h2>まとめ</h2>
<p>インスタンス変数は、セッターで格納し、ゲッターで値を取り出している</p>

<p>参考</p>
[【七海有里佳とRubyの基礎】Lesson15 いろいろある変数の種類](https://www.youtube.com/watch?v=vumdVlnjtQI&t=651s)
[【Ruby基礎】インスタンス変数とは](https://www.youtube.com/watch?v=5tXUSOkih-0)
「'TMP_FontAsset' does not contain a definition for 'characterDictionary' and no accessible extension method 'characterDictionary' accepting a first argument of type 'TMP_FontAsset' could be found」エラー解消

#エラー内容
以下のような赤いメッセージが表示されるようになりました。Unityのバージョンを変えても解消されません。
Unityバージョン：2019.1.3f1
```
'TMP_FontAsset' does not contain a definition for 'characterDictionary' and no accessible extension method 'characterDictionary' accepting a first argument of type 'TMP_FontAsset' could be found (are you missing a using directive or an assembly reference?)
```

#解消方法
答えはここにありました。
https://forum.unity.com/threads/i-have-a-problem-with-tiny-unity.665527/

> Tiny Mode is depending on TextMesh Pro "1.3.0".
> 'characterDictionary' method is deleted on 1.4.0
> so downgrade TextMeshPro to 1.3.0

Window ->  Package Manager  で、「TextMesh Pro」を探して、1.3.0にダウングレードしたら直りました。
【Ruby小ネタシリーズ】> ?a => "a"

# 例

```irb
$ ruby -v
ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-darwin18]

$ irb
> ?{
=> "{" 
> ?\s
=> " " 
> ?a
=> "a" 

> ?ab
SyntaxError: (irb):4: syntax error, unexpected '?'


$ ruby -v
ruby 1.8.7 (2008-05-31 patchlevel 0) [i686-darwin18.5.0]

$ irb
> ?a
=> 97

> ?a.class
=> Fixnum

> ?ab
SyntaxError: compile error
(irb):2: syntax error, unexpected '?'
	from (irb):2
```

# 解説
この?はRuby1.8以下ではASCIIコードをFixnumで返していたのですが、1.9からは文字列を返すようになりました。

# 参考
- チェリー本 P. 46
- https://stackoverflow.com/questions/16641205/what-does-the-unary-question-mark-operator-do
更新メソッド(setter)や関数を定義しよう！


# なぜsetter(更新関数)を定義するの?


## やるメリット
- 同じ意味をもつ更新がどこで行われているかわかる(なぜ関数を定義するのか)
- 行われうる更新を宣言することで逆に行われない更新を自明にできる

## やらないデメリット
- 同じ更新が他の箇所でも書かれていてコード重複がおきている可能性がある
- 更新関数がないということは別の関数が更新関数を実現しているはずなのでその別の関数が太ってしまう
- どこでどんな更新が行われているのかわからなくなる

## Object.assign(スプレッドシンタックス)はだめなの！？
- あるクラス(型)の中でプライベートに使うのはいいけど、クラス(型)の利用者が使うのやめたほうがいいんじゃないかな！
- ショートハンドはセッターとは違うぞ！

## setterがない場合

```js

const user = {id: 100, firstName: 'yamada', lastName: 'hanako' }

function onClickNameChangeSubmit(event) {
    const firstName = event.target.value

    let updatedUser = JSON.stringfy(JSON.parse(user))
    updatedUser.firstName = firstName
    
    save(updatedUser)

    alert("苗字が変更されました!")
}

```

## object.assign(スプレッドシンタックス)を使ったら

```js

const user = {id: 100, firstName: 'yamada', lastName: 'hanako' }

function onClickNameChangeSubmit(event) {
    const firstName = event.target.value

    // ぱっと見わかりやすくなった風だがこれをみてユーザの苗字を変えるとは読めないぞ...
    const updatedUser = {...user, firstName}
    
    save(updatedUser)

    alert("苗字が変更されました!")
}

```

## setterを定義したら

- setUserFirstNameはonClickNameChangeSubmit以外の関数でも使えそうだね！

```js

const user = {id: 100, firstName: 'yamada', lastName: 'hanako' }

function setUserFirstName(user, firstName) {
    return {...user, firstName}
}

function onClickNameChangeSubmit(event) {
    const firstName = event.target.value
    // 上から下へこの関数を読んだときにここでは苗字が更新されることが一目でわかる
    const updatedUser = setUserFirstName(user, firstName)
    save(updatedUser)

    alert("苗字が変更されました!")
}

```
顔認証API　MicroSoft Azure FaceAPIとFace++ Face Comparingの比較実験



MicroSoft Azure FaceAPIとMegvii Face++ Face ComparingのDEMOで２枚の写真を比較し、顔認証APIではどれだけの精度で人を見分けることが出来るのかという実験をしてみました。

・MicroSoft Azure FaceAPIデモへのリンク
https://azure.microsoft.com/ja-jp/services/cognitive-services/face/

・Megvii Face++ Face Comparingデモへのリンク
https://www.faceplusplus.com/face-comparing/

**今回、実際に行った実験での写真は芸能人にお借りしました。（肖像権のため、写真は載せていません。皆さんの想像力を発揮して下さい。）**

実験：　1.双子　　2.似ている人　　3.似ている人

![双子.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209256/afa4ddd6-27ff-fe6a-5297-e4fc58eca869.png)

実験１：双子は判別できるか。(えびちゃんとその双子の方で実験しました)


|        数値       |    数値     |   判定    |   結果  |
|:-----------------:|:----------:|:----------:|:---:
| Azure             |         86 |       同一人物 |　失敗　|
| Face++            |         86 |      同一人物  |  失敗  |

同一人物と判定されてしまいました、、、
一卵性双子はどちらも判別出来ないようです。


---

実験２：似ている人は判別できるか。(内村光良と宮川一朗太)

![そっくり.jfif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209256/a391c570-8637-96e2-8b9d-e66cefb602b1.jpeg)



|        数値       |    数値     |   判定    |   結果  |
|:-----------------:|:----------:|:----------:|:---:
| Azure             |         45 |       別人 |　成功！！　|
| Face++            |         69 |      同一人物  |  失敗  |
Azureでは別人と判断されています！

---
実験２：似ている人は判別できるか。(オバマとオバマのそっくりさん)
![ダウンロード.jfif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209256/9299149e-042a-0c0d-7941-2ac90ba650b6.jpeg)


|        数値       |    数値     |   判定    |   結果  |
|:-----------------:|:----------:|:----------:|:---:
| Azure             |         47 |       別人 |　成功！！　|
| Face++            |         74 |      同一人物  |  失敗  |

こちらも同様に、Azureでは別人と判断されています！

**結果**：双子は判別出来ない。
MicroSoft Azure FaceAPIだと、そっくりさんは判別出来る！

今回の実験ではMicroSoft Azure FaceAPIの方が精度が高かったですね。
**芸能人の皆様、その他の皆様、貴重なお顔のサンプルありがとうございました！！**

顔認証APIを利用される方の参考になればと思います！
Docker Swarmでコンテナのオーケストレーション


Docker Swarmでコンテナのオーケストレーションを試したときの備忘です。
Docker環境が複数必要です。

Docker Swarmとは
---
Docker に対応するネイティブなクラスタリング用ツールです。Docker Swarm は標準 Docker API で操作できます。そのため、Docker ホスト群を集め、1つの仮想 Docker ホストとして扱えます。

参考
http://docs.docker.jp/swarm/overview.html


Docker Swarmを使ってクラスタ作成
---
```
//node1
$ docker swarm init --advertise-addr eth0
Swarm initialized: current node (4qmd5zm5h002y8ww8lwz5g07v) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-31gbv0gje7royyy3x9i09iyd2h00hwtx8a21vlq23x2fxrje5n-48j2paz9czuz9fl2u4coo9euy 192.168.65.3:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
```
各nodeをクラスタに組み込む
---
上記コマンドでプリントアウトされたswarmの文をコピー(赤枠部分)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319276/5b1916ab-6fa0-19ff-9717-00d579a17a23.png)

各nodeで実行

```
//node2
$docker swarm join --token SWMTKN-1-31gbv0gje7royyy3x9i09iyd2h00hwtx8a21vlq23x2fxrje5n-48j2paz9czuz9fl2u4coo9euy 192.168.65.3:2377
This node joined a swarm as a worker.

//node3
$docker swarm join --token SWMTKN-1-31gbv0gje7royyy3x9i09iyd2h00hwtx8a21vlq23x2fxrje5n-48j2paz9czuz9fl2u4coo9euy 192.168.65.3:2377
This node joined a swarm as a worker.

//node1でクラスタが組まれているか確認 
docker nodes ls
$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
811 *   node1               Ready               Active              Leader              19.03.0-beta2
z08     node2               Ready               Active                                  19.03.0-beta2
0xj     node3               Ready               Active                                  19.03.0-beta2
```

Node1にコンテナ起動
---
```
//Nginxを起動
$docker service create nginx nginx

//起動確認
$docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
v80vj        nginx              replicated          5/5                 nginx:1.12          *:80->80/tcp
```

Ngingxをスケール
---
```
//クラスタ内に５つレプリカを作成する
$docker service update --replicas=5 --detach=true nginx

//起動の確認 1
$docker service ps nginx
    :

//起動の確認 2
$watch -n 1 docker service ps nginx

```
→nginxがスケールされました。swarmがルーティングの制御もしています。
※curlでアクセスしてみるとレスポンスするnodeが変わるのが確認できます。

所感
--
AWSのオートスケーリングみたいですねー。ただしswarmはport80しか対応していないらしい。。
からK8Sなのかー
関数を定義しよう!

# なんで関数を定義するんだろう :thinking:

- 同じ意味を持つロジックに名前をつけてあげることで認識をしやすくできるよ
- 同じことをしたい場所で同じ挙動をすることを保証するできるよ

## 関数のない例

```js

function showExcel(user) {
    downloadExcel(`${user.firstName} ${user.lastName}`)
}
```

```js

function showHtml(user) {
    renderHtml(`${user.firstName} ${user.lastName}`)
}
```

- ユーザの表示の仕様は苗字/名前を空白つなぎで表すことです。
- 仕様が変更したらshowExcel/showHtmlどちらにも必要になりますね。
- Htmlのほう変更が漏れてました><が起こり得ますよね!
- これが関数を定義することによって回避できるんです :muscle:

## 関数を定義してみる

```js
function showUser(user) {
    return `${user.firstName} ${user.lastName}`
}
```

```js
function showExcel(user) {
    downloadExcel(showUser(user))
}

```

```js
function showHtml(user) {
    renderHtml(showUser(user))
}
```

- showUserに苗字/名前を空白つなぎで表す 仕様を満たすロジックを書いたよ！
- ユーザ表示の仕様が変わって苗字だけでよくなったときはshowUserを変更したらいいね！一箇所の変更で済むね！
- 同じ仕様は同じロジックから呼び出されるというのをプログラムで表現できたぞ！


# 無名関数の乱用は避けて関数に名前をつけて定義しよう

- これをよんでパッとselectActiveAdminUsersByGroupはなにをするかわかるかな？
- filterに渡されている無名関数の中はなにをしているんだろう...と考えるので時間がかかるね
 
```js
function selectActiveAdminUsersByGroup(users, group) {
    return users
        .filter(user => user.status === Active)
        .filter(user => user.groupId === group.id)
        .filter(user => user.role === God || user.role === Admin)
}
```

## 関数に分けて定義してみる

- こうしたらfilterに渡している関数名からなにをするロジックなのかわかりやすいね
- isActiveUser/isUserInGroup/isAdminUserはselectActiveAdminUsersByGroup以外の関数でも今後使えそうで便利だね！

```js
function isActiveUser(user) {
    return user.status === Active
}
function isUserInGroup(user, group) {
    return user.groupId === group.id
}

function isAdminUser(user) {
    return user.role === God || user.role === Admin
}

function selectActiveAdminUsersByGroup(users, group) {
    return users
        .filter(isActive)
        .filter(user => isUserInGroup(user, group))
        .filter(isAdminUser)
}
```
【UiPath】フォルダ選択画面で指定のディレクトリにジャンプしたい！


UiPathでアプリをいろいろいじって自動化しようとしていたときの話。

アプリからデータを保存してダウンロードしたいときに、、こんな画面が出ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/8ee4b5c2-98a2-5e06-30da-377cde1f1aec.png)

**「デスクトップ配下のアプリディレクトリ」に保存してぇ...**

そう思ったけど、試行錯誤してもうまくいかず。。。


これなら絶対誰でもできる！っていう解決策がみつかりました。


# フォルダを指定してデータをダウンロードする

「フォルダー:」のところに絶対パスをいれれば良いとのことでした！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238739/e7d1cfdc-23d4-9705-be6b-aed25f7c85a3.png)

その後に、「フォルダーの選択」をクリックすればOK


問題は解決しました！


# 参考サイト

[開くダイアログのアドレスバーにフォルダパスを直接入力する方法](https://forum.uipath.com/t/topic/20224)
いつも忘れるRailsでの nil? empty? blank? present? の使い分け

## 前置き

Railsで、StringやArrayの値のチェックをする際、`nil? empty? blank? present?` の使い分けをいつも調べ直しているので、共有メモとして投稿します。  （調べればたくさん記事は出てきますが...）

## nil?

値がnilかどうか判定するメソッドです。
nilの場合は `true`
空のオブジェクト、または何かしら値が存在する場合は `false` となります。

```ruby
nil.nil?
=> true

"".nil?
=> false

"hoge".nil?
=> false
``` 

## empty?

空のオブジェクトかどうかを判定するメソッドです。
空の場合は `true`
値が存在する場合は `false` となります。
また、nilだった場合は、 `NoMethodError` が発生します。

```ruby
"".empty?
=> true

"hoge".empty?
=> false

nil.empty?
=> 
Traceback (most recent call last):
     1: from (irb):1
NoMethodError (undefined method `empty?' for nil:NilClass)
```

## blank?

空のオブジェクト、またはnilのオブジェクトかどうかを判定するメソッドです。
（ `empty? || nil?` と同等）
空のオブジェクト、またはnilのオブジェクトの場合は `true`
値が存在する場合は `false`となります
ただし、TAB文字・スペースは `true`が返ります。

```ruby
nil.blank?
=> true 

"".blank?
=> true

"hoge".blank?
=> false

"\t".blank? #TAB文字
=> true

" ".blank? #半角スペース
=> true

"　".blank? #全角スペース
=> true
```
## present?

値が存在するかどうかを判定するメソッドです。
(blank?の反転のため `!blank?` と同等)
値が存在する場合は `true`
空のオブジェクト、またはnilのオブジェクトの場合は `false` となります

```ruby
"hoge".present?
=> true

nil.present?
=> false 

"".present?
=> false
```
https-portal でポートフォリオつくってみた

# 私の今までの努力はなんだったのか
[html + css + docker + alpine nginx + Let's encrypt でポートフォリオを作った](https://qiita.com/cheese_ck/items/faecbb3d87bffe681ce7)
これでまぁまぁ頑張りながら公開＋https化をしたのですが「コンテナの中入ってコマンド打つのはあんまりよろしくないな」と思っていろいろ探してたのですがこんなの見つかりました。
[全自動Let's Encrypt Dockerコンテナ "https-portal" を使ってウェブサイトをHTTPS化する](https://qiita.com/c18t/items/c693d5bcda2e9b82e39b)
これをよしなに書き換えると...
**docker-compose up -dで公開まで一瞬で終わってしまいました**
ちゃんちゃん
気象庁による気象データのダウンロード

#気象庁が気象データを配布している
意外と知られていないかもしれないが、気象庁の公式ホームページから、過去の気象データがオープンソースとして無料で公開されている。

リンク：https://www.data.jma.go.jp/obd/stats/data/mdrr/docs/csv_dl_readme.html

上記サイトにて、かなり広範囲にわたっての気象データをcsvファイルで出力することができる。
ダウンロードの具体的な方法として、このサイトではURLによって指定するタイプのものとなっており、下図のように具体例も豊富に掲載されているので非常に使いやすいものとなっている。

![スケッチ (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396626/63607706-137c-2338-1e21-a3be646d94af.png)


気象データは他のさまざまなデータと組み合わせることによって様々なことを明るみにする可能性を秘めている。これを機に何かダウンロードして、ビッグデータ解析として利用してみてはいかがだろうか。
第４回　Raspberry Pi で監視カメラを作ろう！　～デバイス編～ 

Raspberry Piと専用のカメラモジュールを使用し、ONVIF対応の監視カメラを作成する[シリーズ記事](https://qiita.com/lis-hanzomon/items/cc1f7f316fbeb9579b28)です。
本記事は[リンク情報システム株式会社](https://www.lis.co.jp/)の有志が作成しています。

今回はカメラやサーボといったデバイスの設定を行います。

#デバイスを設定する

###カメラの接続
RaspberryPiのカメラコネクタにカメラモジュールを接続します。
静電気で破損する恐れがあるので、取り扱いに注意して作業してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399637/e041d57a-954f-a2b4-33b0-dca2a047428d.png)

###カメラの設定
raspi-configを起動します

```
$ sudo raspi-config
```

「5 Interfacing Options」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399637/9be8131a-6273-bcdb-e2d9-9e97ed773b74.png)

「P1 Camera」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399637/623b9f00-81a6-09d2-440f-a7761efaaae9.png)

「はい」を選択してカメラ設定を有効化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399637/fbe1931f-faa8-7574-a34f-5be28d8ed860.png)

次にユーザーをvideoグループに追加します。

```
$ sudo usermod -aG video [ユーザ名]
```

設定が変更できたらrebootコマンドで再起動します。

```
$ sudo reboot
```

###サーボ関連の接続
首振り機能用にサーボを用意した場合は、RaspberryPiとPWMコントローラーとサーボを接続します。
また、PWMコントローラーがサーボを駆動するために別途で電源が必要になります。
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399637/c99bd0e3-a158-6449-6896-f2468d5cebce.png)
>参考元：[Raspberry PiとPCA9685でサーボモータ制御 - 101実験室](http://101lab.hatenablog.com/entry/2017/12/15/194815)

サーボとカメラマウントについては、以下のサイトを参考に組み立てました。
参考元：[Raspberry Piでサーボコントロール、Part1 上下・左右の2軸を動かす | ものづくりエクスペリメント](http://denshikousaku.net/control-servos-on-raspberry-pi-part1-rpio)

###サーボの設定
カメラ設定を有効化する手順と同じように進み、インターフェイスの設定で「P5 I2C」を有効化します。
 
また、I2Cの通信速度が速すぎると通信エラーが発生する可能性が高まるため、OSの設定ファイル config.txt にI2Cの通信速度の設定を追加します。

```
$ sudo vi /boot/config.txt
#最下行辺りに通信速度の設定を追加
dtparam=i2c_baudrate=10000
```

設定が変更できたらrebootコマンドで再起動します。

```
$ sudo reboot
```

#カメラの動作確認
カメラモジュールを有効化できたら、RaspberryPiに用意されているカメラ用コマンドを実行して、カメラの基本的な動作を確認してみます。

###静止画の取得
まずは静止画を撮影するraspistillコマンドを実行して、静止画を取得します。

```
$ raspistill -o test.jpg
```

オプションの内容は以下のようになります。

|オプション|内容|
|:-:|:--|
|o|出力ファイル名を指定します。<br>指定しないと保存されません。|

これで"test.jpg"が作成されたので、sambaで取得してビューワーで表示してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/399637/2010b075-b587-ce2a-6e79-410959554165.png)

###動画の取得
静止画が取得できたので、次はraspividコマンドを実行して、動画をディスプレイに表示してみます。

```
$ raspivid -f -t 0
```

オプションの内容は以下のようになります。

|オプション|内容|
|:-:|:--|
|f|フルスクリーンで表示します。|
|t|撮影時間をミリ秒単位で指定します。<br>デフォルトは5秒です。<br>今回は 0 を指定して無効化しています。|

コマンドを実行して、ディスプレイに動画が表示されれば成功です。

---
[インデックス記事へ](https://qiita.com/lis-hanzomon/items/cc1f7f316fbeb9579b28)
[第３回記事へ](https://qiita.com/lis-hanzomon/items/31cf0127db0fdaf0aa35)
[第５回記事へ](https://qiita.com/lis-hanzomon/items/896342ec1af95d42db26)

---
[リンク情報システム株式会社](https://www.lis.co.jp)では一緒に働く仲間を[随時募集](https://www.lis.co.jp/employ_top)しています！
また、お仕事のご依頼、ビジネスパートナー様も募集しております。[お気軽にご連絡](https://www.lis.co.jp/inquiry)ください。