OmniAICreator/Qiita-1.07M huggingface dataset:
DI(Dependency Injection) と Factory Pattern

## DI(Dependency Injection) vs Factory Pattern?

**DI(Dependency Injection) vs Factory Pattern** などと検索すると、例えば下記のような記事が見つかります。

https://stackoverflow.com/questions/557742/dependency-injection-vs-factory-pattern

この記事では車のエンジンとホイールとタイヤを使って両者の違いを説明しています。
例がSwiftじゃなくてすいません。

**DIの例**

```java
class Car
{
    private Engine;
    private SteeringWheel;
    private Tires tires;

    public Car(Engine engine, SteeringWheel wheel, Tires tires)
    {
        this.Engine = engine;
        this.SteeringWheel = wheel;
        this.Tires = tires;
    }
}
```

**Factory Pattern**

```java
static class CarFactory
{
    public ICar BuildCar()
    {
        Engine engine = new Engine();
        SteeringWheel steeringWheel = new SteeringWheel();
        Tires tires = new Tires();
        ICar car = new RaceCar(engine, steeringWheel, tires);
        return car;
    }   
}
```

違いの説明としては悪くありません。
しかしながら、実際の設計に適用しようと思うとちょっと違和感があります。

## ちょっと違和感が・・・

まず、みなさんはエンジンとホイールとタイヤを車に乗る度に交換しますか？
もちろんそのような交換が必要なレース用の車では話が違いますが、一般のドライバーはそんなことはしないでしょう。また、車に乗るのではなく、車の生産や車検や定期的な交換だと言われるかも知れませんが、そのように滅多に起きることのない事象に対してDIはいささか大げさだと思ってしまうのです。

車の生産や車検の時に、つまり**単体テスト**する場合に依存するインスタンスをテスト用に変更する程度であればDI構造を取らなくてもFactory Patternで十分だと考えます。
もちろんDIの方が柔軟であることに間違いはありません。大きな違いは依存するインスタンスの生成などのソースコードが外部に存在することで、ソースコードの追跡が一度途切れてしまうことです。
SwiftであればProtocolを使ってDIすることが多いでしょうが、DIされたインスタンスの実体の（classなどの）宣言にジャンプすることは簡単ではありません。特にリバースエンジニアリングのような場合は、実際には何のインスタンスが渡ってきているかを掴むのが少々面倒臭くなる場合もあります。一方Factory PatternであればFactoryのコード内に即時にジャンプしてインスタンスの実態を掴むことが容易になります。

前任者がドキュメントもコメントも書かず書き散らかしたソースコードを追跡する羽目になることは日常茶飯事ですが、そんな時にあらゆる場面でDIされてしまうと、**１つだけならちょっと面倒なだけのこの追跡**で後任者は頭を掻きむしりたくなることでしょう。

一方で、例えば車ではなく、電子レンジのようなオブジェクトを考えた場合、レシピと食材を投入して料理が調理されて出てくる、といった機能に対しては「DIしないでどうする！」と思います。

より柔軟なインスタンスの入れ替えをとるか、コードの追跡性を取るか、これはケースバイケースだと思います。

## レイヤード設計におけるDI

MVVMやMVC構造の場合は、その良し悪しは別としても基本的には上位の層が下位の層に依存するように設計されます。「依存関係逆転の原則」なるものもありますが、これは例えばデバイスドライバーのフレームワークを作って各デバイスに対するデバイスドライバーをそのフレームワークに合わせ込むと行った場面ではとても有効な概念だと思います。しかしながら、例えばiOSアプリのMVVMやMVC構造ではあまり必要な考え方だとは思いません。

(実際には「依存性逆転の原則」は上位層と下位層の依存関係を逆転しろと言っているわけではなく、どちらも抽象に依存しろ、と言っているわけですが現実にはその抽象をどちらが管理するかで少し様相は変わってきます)

もちろん各層の間でProtocolベースでインターフェイスすべきことは言うまでもありませんが、例えばView層をViewModel層にDIする、といった設計は有効なのでしょうか？

MVVMやMVC構造では、各層のロジックが下層に行くに連れてより普遍的になり、変更・修正の確率が下がって行くことを前提としています。変更される可能性が高いオブジェクトを可能性が低いオブジェクトに依存させることで、上位層の変更の範囲を限定的にする、というのがこの考え方でしょう。

つまりProtocolでDIされるViewインスタンスの設計は変更される可能性が高く、Protocol自体も変更される可能性が高いのです。
変更された場合はViewModelの内部コードに影響を与えるということになります。このことは本来分離すべく設計していた下位層まで巻き込んで、大掛かりな改修になってしまう可能性が増大することを意味します。

ViewとViewModelの関係は、カーネルのmodule仕様とデバイスドライバーの関係とは全く違います。
つまりここでもケースバイケースで考えるべきだと思います。

DIはとっても素敵な考え方ですが、なんでもかんでも適用しようと思うのはちょっと待ってください、
もしやるのなら自分で最後まで責任を持ってくださいね、と言いたいのです。
PyCharmでCythonを試そうとしたらハマったのでメモ

#概要
PyCharmでCythonを使おうとして、

1. [Basic Tutorial — Cython 0.29a0 documentation
](https://cython.readthedocs.io/en/latest/src/tutorial/cython_tutorial.html)
2. [PyCharm上でCythonのビルドを簡単にするには – 長久手パラボラ日記
](http://blog.cocomoff.info/archives/2015/01/13/7303/)

を参考に、setup.pyを設定して実行したら

```
/Users/username/PycharmProjects/cyyc/venv/bin/python3.6 /Users/username/PycharmProjects/cyyc/setup.py build_ext --inplace
Traceback (most recent call last):
  File "/Users/username/PycharmProjects/cyyc/setup.py", line 8, in <module>
    ext_modules=cythonize("helloworld.pyx")
  File "/Users/username/PycharmProjects/cyyc/venv/lib/python3.6/site-packages/Cython/Build/Dependencies.py", line 897, in cythonize
    aliases=aliases)
  File "/Users/username/PycharmProjects/cyyc/venv/lib/python3.6/site-packages/Cython/Build/Dependencies.py", line 777, in create_extension_list
    for file in nonempty(sorted(extended_iglob(filepattern)), "'%s' doesn't match any files" % filepattern):
  File "/Users/username/PycharmProjects/cyyc/venv/lib/python3.6/site-packages/Cython/Build/Dependencies.py", line 102, in nonempty
    raise ValueError(error_msg)
ValueError: 'helloworld.pyx' doesn't match any files

プロセスは終了コード 1 で完了しました
```
helloworld.pyxが見つからないと言われた。
(`"cyyc"`はプロジェクト名)

##環境
macOS High Sierra 10.13.6
PyCharm Professional 2018.2(Pleiadesで日本語化済)
Python3.6
virtualenv使用

#やったこと
##絶対パスを指定
.pyxファイルの場所を絶対パスにした。

```python:setup.py
from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize("/Users/username/PycharmProjects/cyyc/helloworld.pyx")
)
```
成功したけど、これでは不便。
##作業ディレクトリを変える
外部ツールの設定を見直す。
`PyCharm > Preferences > ツール > 外部ツール`
![スクリーンショット 2018-09-03 23.11.39.png](https://qiita-image-store.s3.amazonaws.com/0/269891/52bf8a2e-7d7f-8782-44b0-2d7038e9a1a6.png)

作業ディレクトリが初期設定では`/venv/bin`になっているが、ソースファイルのあるディレクトリに変える。
ここでは、とりあえずマクロでプロジェクトディレクトリ`$Projectpath$`を指定する。
後から気づいたが、[参考にしたサイト2](http://blog.cocomoff.info/archives/2015/01/13/7303/)でもこのように設定していた。
![スクリーンショット 2018-09-03 23.58.40.png](https://qiita-image-store.s3.amazonaws.com/0/269891/9fde62de-4685-bd51-322b-cae7ed1c049f.png)

setup.pyを元に戻した。

```python:setup.py
from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize("helloworld.pyx")
)
```
実行すると、.soファイルが生成された。
#気づいたこと
外部ツールの設定で、引数の1つ目を`FilePath`とマクロで指定しているためか、**setup.py以外**のファイルを開いた状態で外部ツールの実行をするとそのファイルが引数に入れられて、実行に失敗する。
pythonでGoogle翻訳が使えるモジュール

# Google翻訳が使えるモジュール
英語がわからないのでヘルプやエラーメッセージを理解するのにGoogle翻訳に頼りっぱなしなんですが、さらに頼もしいモジュールを見つけたので、早速、使ってみました。
ただし、いつでも使えるという保証はないそうです。([エラー回避へ](#エラー回避))

#### 必要なモジュールのインストール
`pip install requests`

#### googletrans のインストール
ダウンロードはこちらから
[googletrans · PyPI](https://pypi.org/project/googletrans/)

pipが使える場合はこのコマンドで
`pip install googletrans`

**iOS**の**Pythonista3**にインストールする場合は、[こちらの記事](https://qiita.com/maboy/items/cef5dee13d5b2e9ac843)にもありますが、コンソールから次のコマンドで**「StaSh」**をインストールすると`pip`コマンドが使えるようになるので外部モジュールのインストールが楽になります。

~~~python
import requests as r; exec(r.get('http://bit.ly/get-stash').text)
~~~

# コード(クリップ翻訳.py)
クリップボードの内容を翻訳してクリップボードにコピーするスクリプトを書きました。
動作確認 : iOSのPythonista3

~~~python:クリップ翻訳
import console
import clipboard
from googletrans import Translator

# コンソール画面の文字サイズと色を変更
console.clear()
console.set_font('Menlo',16)
console.set_color(0,1,0)

# クリップボードから5000文字を翻訳
text=clipboard.get()[:5000]
print('原文',len(text),'byte')
print(text+'\n')

# 翻訳
text = (Translator().translate(text, dest = 'ja').text)

# 翻訳をコンソールに表示
console.set_color(1,1,0)
print('翻訳')
print(text)
console.set_color(1,1,1)

# アラートを表示
title = '翻訳'
message = text
button1 = 'コピー'
button2 = 'キャンセル'
button = console.alert( title, message, button1, button2, hide_cancel_button=True)

# [コピー]がタップされたら結果をクリップボードにコピー
if button == 1:
  clipboard.set(text)
~~~


エラー回避のため **# 翻訳** の部分を修正(2020/11/9)

```python:(2020/11/9)
# 翻訳
tr = Translator()
while True:
  try:
    text = tr.translate(text, dest="ja").text
    break
  except Exception as e:
    tr = Translator()
```



# 結果
こんなコードをpython3で実行すると…

~~~python
print “hello”
~~~

<br> 
なんか、おこられます。
<font color="red"><pre>
    print 'hello'
                ^
SyntaxError: Missing parentheses in call to 'print'</pre></font>

<br>
この部分をコピーして

`SyntaxError: Missing parentheses in call to 'print'`

<br> 
クリップ翻訳を実行すると「カッコがない」ことがわかりました。

<img width="300" alt="image.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/280129/b9f144ea-f927-2f63-8006-febceecf5195.jpeg">

# エラー回避
下記のエラーが出て使えない時に試した方法。

~~~:最後だけ抜粋
gtoken.py", line 57, in _update
    code = unicode(self.RE_TKK.search(r.text).group(1)).replace('var ', '')
AttributeError: 'NoneType' object has no attribute 'group'
~~~
- 2018/10/2:回避できました。
- 2018/11/30:回避できました。


## エラー回避方法。
speaktech様から教えていただきました。(2018/10/2)

`googletrans/gtoken.py`を
こちらの[gtoken.py](https://github.com/BoseCorp/py-googletrans/blob/master/googletrans/gtoken.py)と差し替えることで使えるようになりました。

上記の方法でもエラーを回避できなくなりました。(2020/11/9)
こちらの記事で紹介されているように、何度もトライすることで対策してます。
[【python】googletransの『AttributeError: 'NoneType' object has no attribute 'group'』対策 - Qiita](https://qiita.com/_yushuu/items/83c51e29771530646659)

こちらの記事で紹介されている方法でエラー回避できました。(2021/1/10)
[【python】googletransの『AttributeError: 'NoneType' object has no attribute 'group'』対策【2020/12/02追記】 - Qiita](https://qiita.com/_yushuu/items/83c51e29771530646659)
　　GITにあるものにインストールしなおし、サービスURLを変更するという方法でエラーが回避できました。

　　また、記事内のコメント欄で@t4t5u0様が紹介してくれた、`pip install googletrans==4.0.0-rc1`でアルファバージョンをインストールする方法でもエラーが回避できました。
git  aliasのメモ

オレオレ省略なので一般的でないですが参考になれば幸いです・

~~~
st = status
cm = commit
cma = commit --amend -m
ps = push origin
psd = push origin develop
psm = push origin master
pl = pull origin
pld = pull origin develop
plm = pull origin master
ch = checkout
cha = !git checkout -f . && git status
chde = checkout develop
chma = checkout master
chth = checkout --theirs
cl = clean
cla = !git clean -f . && git status
rf = !git checkout -f . && git clean -f . && git clean -df && git status
re = reset --hard
ada = !git add . && git status
di = diff
br = branch
ss = stash
sspd = !git stash && git pld
sspm = !git stash && git plm
ssp = stash pop
ssl = stash list
sss = stash show
me = merge --no-ff
ge = grep
cp = cherry-pick
fe = fetch
ta = log --graph --branches --pretty=format:'%C(yellow)%h%C(cyan)%d%Creset %s %C(green)- %an, %cr%Creset'
ll = log --pretty=format:"%C(yellow)%h%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --decorate --numstat
~~~
Djangoチュートリアル アプリ作成(2)[モデル・DBの作成]

# アプリの作成
`manage.py`ファイルがあるディレクトリで、

```
$ python3 manage.py startapp blog
bin		db.sqlite3	lib		mysite
blog		include		manage.py	pyvenv.cfg
```

これで新しくblogディレクトリが作成されました。
アプリケーションを作成したら、Djangoにそれを使うように伝えないといけません。
`mysite/settings.py`ファイルの中で指定します。まず**INSTALLED_APPS**をみつけて、その上に'blog'という一行を追加します。
`mysite/settings.py`をエディタで開き、'blog',を追加します。

```python

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
]
```

`blog/models.py`ファイルでModelsと呼ばれる全てのオブジェクトを定義します。これがブログポストを定義する場所です。
`blog/models.py`をエディタで開いて全部削除し、下記のコードを書きます。

```python

from django.db import models
from django.utils import timezone

class Post(models.Model):
    author = models.ForeignKey('auth.User',on_delete=models.CASCADE)
    title  = models.CharField(max_length=200)
    text   = models.TextField()
    created_date = models.DateTimeField(default=timezone.now)
    published_date = models.DateTimeField(blank=True, null=True)

    def publish(self):
        self.published_date = timezone.now()
        self.save()

    def __str__(self):
        return self.title

```

`models.Model`はポストがDjango Modelという意味で、Djangoが、これはデータベースに保存すべきものだと分かるようにしています。
フィールドのタイプを決めなければいけません。
・models.CharField - テキスト数を定義するフィールド
・models.TextField - これは制限無しの長いテキスト
・models.DateTimeField - 日付と時間のフィールド
・models.ForeignKey - これは他のモデルへのリンク

# データベースにモデル用のテーブルを作る
新しいモデルをデータベースに追加します。まず、今作成したモデルの中で少し変更があったことをDjangoに知らせます。

```
$ python3 manage.py makemigrations blog
Migrations for 'blog':
  blog/migrations/0001_initial.py
    - Create model Post

$ python3 manage.py migrate blog
Operations to perform:
  Apply all migrations: blog
Running migrations:
  Applying blog.0001_initial... OK
```

これでポストモデルがデータベースに入りました。

# ポストを追加・編集・削除

`blog/admin.py`ファイルをエディタで開き、以下のように変更します。

```python

from django.contrib import admin
from .models import Post

admin.site.register(Post)
```

前回定義したPostモデルをimportしています。モデルをadminページで見れるようにするには、モデルを`admin.site.register(Post)`で登録する必要があります。

次に、ポストモデルを見ます。Webサーバーを走らせるには、以下のコードを実行します。

```
$ python3 manage.py runserver
```

http://127.0.0.1:8000/admin/
このような画面が出てくると思います。
![スクリーンショット 2018-09-03 23.44.56.jpg](https://qiita-image-store.s3.amazonaws.com/0/285122/2cc9fdd8-73bb-3f30-172f-40c27b11676d.jpeg)

ログインするには、superuser （サイトの全てを管理するユーザー）を作る必要があります。
一旦、ターミナルで`command+N`で別のタブを作り、myvenvに移動し、

```
$ python3 manage.py createsuperuser
```

を入力し、続けて、ユーザー名、メールアドレス、パスワードを入力してください。
あとでログインするときに使うので、わかりやすいものにしてください。

全て入力したら、`Superuser created successfully.`と出てきます。
そしたら、ブラウザに戻って、先ほど作成したsuperuserでログインします。

![スクリーンショット 2018-09-03 23.53.42.jpg](https://qiita-image-store.s3.amazonaws.com/0/285122/cf16ca34-d8d8-9d88-6113-26e3b462da3a.jpeg)
このような画面になります。

そしたら試しにPostsにいき適当に書いて保存して見ましょう。
保存できたら成功です！！！
【node.js】Socket.IOでBitFlyerのBTCFXチャートデータ生成を自作する



CSG夏休みAdventCalendar23日目です。

Dockerとか書いてみたかったのですが書けるレベルにまでは至っていなかったのでまたの機会に。

部活のイベントで書くネタとしてはどうかとも思いましたがせっかくなのでアウトプットしようという事で、今回は某LTで使ったネタの一部から、仮想通貨自動売買テクニックの一部をご紹介します。

# はじめに

テクニックとは言っても唯の実装なんですが、何故わざわざ自分で収集するかといいますと。

実際、自動売買やろうと思うとCryptowatchなんていうAPIを使うのがメジャーなわけですが、1か月ほど前に1, 5分の短い時間足で数分間データが抜けてたり価格が違っていたことがありました。

裁量トレードの場合、多少値段が違うくらいならそこまで困ることもないのですが、自動売買ではチャートデータを元にエントリー基準などを決めるので、正確なデータを抜けなく取得出来る信用できる方法が必要なわけです。

という事で既にCryptowatchAPIを前提に実装しているBotに適応するため、CryptowatchのResponseと同じ形式のデータを作成したいと思います。

# 前提

[CryptowatchReference](https://cryptowatch.jp/docs/api#ohlc)なんかを見てみると以下のようなjsonが返却されます。

```json
{
  "result":
      {
        "14400": 
          [
            [CloseTime, O, H, L, C, V],
            [CloseTime, O, H, L, C, V],
          ]
      }
}
```

なので最終取引時間, 始値, 高値, 安値, 終値, 出来高を足事に配列で持たせてやればいいことになりますね。

# 実装
今回はnode.jsでSocket.ioを用いて実装していきます。

まずはSocket.IOクライアントのとmomentのインストール。

    $ npm i -S socket.io-client moment
    
それではコーディングを始めていきましょう。

     $ vi ohlcgenerator.js

```javascript
const io = require('socket.io-client');

const moment = require('moment');

const STREAM_URI = 'https://io.lightstream.bitflyer.com';
const FX_EXECUTIONS_CHANNEL = 'lightning_executions_FX_BTC_JPY';
const minTimeinterval = 1; //min

const socket = io(STREAM_URI, { transports: ['websocket'] });
socket.on('connect', () => {
    socket.emit('subscribe', FX_EXECUTIONS_CHANNEL);
});

socket.on(FX_EXECUTIONS_CHANNEL, message => {
        updateOhlc(message[0].exec_date, message[0].price, message[0].size);
});

let ohlcv = [];

const updateOhlc = (date, price, size) => {
    currentBar = ohlcv[ohlcv.length - 1];
    if(ohlcv.length == 0 || makeTimestamp(currentBar[0]) != makeTimestamp(date)) {
            ohlcv.push([date, price, price, price, price, size]);
    } else {
            if(currentBar[2] < price) currentBar[2] = price;
            else if(currentBar[3] > price) currentBar[3] = price;
            currentBar[4] = price;
            currentBar[5] += size;
    }
    //ここでストラテジ関数を実行したり？
    //strategy.proc(ohlcv);
};

/*指定時間足*/
const makeTimestamp = (date) => {
    let time = moment(date);
    let result = -1;
    if(minTimeinterval >= 60) {
            result = time.hour() * 60 / minTimeinterval;
    } else {
            result = time.minute() / minTimeinterval;
    }
    return Math.floor(result);
};
```

# さいごに

プログラムを起動した時点からのデータしか収集できないため、botとは別プログラムにして別途DBにOHLCデータとして格納して置いたり、botと同じプログラムに組み込むのであればohlcの初期化にはCryptowatchのAPI等を用いてもいいかもしれません。

また、StereamingAPIからのデータ流入が止まる事もあるので、その対策も必要になってきます。

(昨日今日と少し忙しかったので軽めの書き込みですが後日修正など行いたいと思います)
パスワードを入力せずにWi-Fiに接続するサイトつくった

# tl;dr

<p data-height="632" data-theme-id="0" data-slug-hash="eLWWNd" data-default-tab="js,result" data-user="04" data-pen-title="The Wi-Fi URL scheme generator" class="codepen">See the Pen <a href="https://codepen.io/04/pen/eLWWNd/">The Wi-Fi URL scheme generator</a> by John Doe (<a href="https://codepen.io/04">@04</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

- パスワード入力するのめんどくさいひとにおすすめ

こんな感じになりましゅ

<img width="320" alt="IMG_6212.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/208363/1977ec0b-39ac-0c79-4a1f-f703e784f85c.png">

<img width="320" alt="IMG_6213.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/208363/bfc4a02c-cfb9-3507-b486-ba493a86afff.png">
Vue routerでルート定義を動的に生成する方法

# はじめに
現在開発しているアプリにてvue routerにてルート定義を動的(サーバーから取得)に定義する方法を検討しました。 

## 環境
* vue: 2.5.17
* vue-router: 3.0.1
* vue-cli 3.0.1

## 手順

基本的なアプリの生成方法は割愛しますがvue-cliを利用しています。

### 1. router.jsの生成
ここではベースのルート定義だけを行います。

```router.js
Vue.use(Router);

const router = new Router({
    mode: 'history',
    base: process.env.BASE_URL,
    routes: [
        {
            path: '/',
            name: 'home',
            component: Home
        }
    ]
});
```

### 2. main.js
main.jsにて1で定義したrouterをセットします。
ここでは特別な設定はしていません。

```main.js
import Vue from 'vue';
import App from './App.vue';
import router from './router';
new Vue({
    el: '#app',
    router,
    components: {App},
    template: '<App/>'
});

```

### 3. App.vue
App.vueにて動的にルート定義を行います。
componentはdynamic importで取り込んでいます。
/* webpackChunkName: "views_" */の部分は生成されるjsファイルのプレフィックスになります。
また、`@/views/${v.vueName}.vue`の部分は全て変数にしてしまうとwebpackが認識できませんので、一部をパスにする必要があります。

```App.vue
<template>
    <div class="home">
        <router-view/>
        ... some contents (router-link)
    </div>
</template>

<script>
    import Vue from 'vue';
    import axios from 'axios';

    export default Vue.extend({
        name: 'app',
        created() {
            const routes = [];
            // サーバーからルート定義を取得(axios使用)
            axios.get('/routes').then(function(res) {
                // dataは配列型のルート定義データを想定
                res.data.forEach(function(v){
                    routes.push({
                        path: v.path,
                        name: v.name,
                        query: v.query,
                        // dynamic import
                        component: ()=> import(/* webpackChunkName: "views_" */ `@/views/${v.vueName}.vue`)
                    });
                });
               
                this.$router.addRoutes(routes);
           }).catch(function(error) {
               console.log('ERROR');
           });
        },
        ...
    });
</script>

```

swaggerなんかと連携できれば面白いかもしれません。

以上です。

## 終わりに
私自身webpackについてはまだまだ勉強中ですので、ご指摘などありましたら幸いです。
【随時更新】PHPUnitの環境と参考記事を探してまとめてみた。

# 概要

テスト(phpunit)を書く練習がしたかった。(手に馴染ませたい)
そして参考となりそうな先人の知恵をまとめて自分用に使いたい！
Dockerの環境くらいあるだろうし、探してみようということで探してみた。

知恵を投稿してくださっている方々本当にありがとうございます。。。

# 探してみた。

## 公式ドキュメント

[PHPUnit - 公式 (ver. 6.5)](https://phpunit.de/manual/6.5/ja/index.html)

## Dockerで即導入できそうな環境一覧

php7~のphpunitのDockerはたくさんあったが、php7未満のものは存外少ない。

[JulienBreux/phpunit-docker](https://github.com/JulienBreux/phpunit-docker) (php7~)
[spatie/phpunit-docker-assertions](https://github.com/spatie/phpunit-docker-assertions) (php7~)
[callan/docker-phpunit-php7](https://github.com/callan/docker-phpunit-php7) (php7~)
[dhanugupta/phpunit-docker](https://github.com/dhanugupta/phpunit-docker) (バージョンをまだ未確認)
[mkenney/docker-phpunit](https://github.com/mkenney/docker-phpunit) (php5~)
[DockerHub - phpunit (公式)](https://hub.docker.com/r/phpunit/phpunit/) (php7~)


## 参考記事一覧

### Dockerと組み合わせる時について

[Dockerを使い手軽にPHPUnitをはじめる](https://qiita.com/masayuki5160/items/b305d5a19f3ec632f3e3) - @masayuki5160 さん
[PHPUnit チートシート](https://qiita.com/mochimochi-inu/items/a11a7bca17d3008b5e7e) - @mochimochi-inu さん

### PHPUnitを使ったコーディング

[PHP でテストコードを意識したコーディング](https://qiita.com/morinosubako/items/5b1d95a897bae11f2a5a) - @morinosubako さん
[PHPUnitの主なAssertメソッド一覧](https://qiita.com/rev84/items/12fbd16d210d6a86eff9) - @rev84 さん
[PHPUnit 入門](https://qiita.com/tsuuuuu_san/items/46246168dc36ad2369cc) - @tsuuuuu_san さん
[PHPUnitとデータプロバイダとテストケース生成](https://qiita.com/Hiraku/items/5c49987f4e9e167dad86) - @Hiraku さん
[PHP でカバレッジを出すなら phpdbg](https://qiita.com/nanasess/items/f5f8483e92c76ef408ff) - @nanasess さん


### ソースコード書き方ミスるとユニットテストかけないよ系

[デバッグ用にechoやprint_rを書く代わりにテストを書こう](https://qiita.com/niisan-tokyo/items/cf445985f951291a1b34) - @niisan-tokyo さん
[PHPのトレイトを使うならおさえておきたい５つのこと](https://qiita.com/sasakure-kei@github/items/212637b2f32197441a3a) - @sasakure-kei@github さん
[テストがないと死ぬ病気にかかった人間がUnit Testが当たり前の状態になるまでにみてきたもの](https://qiita.com/wkubota@github/items/55146562d6c338093205) - @wkubota@github さん
[依存性注入(DI)の解説とやり方](https://qiita.com/1000k/items/aef6aed46b0fc34cc15e) @1000k さん


# ユニットテストの実行速度高速化

[CircleCI 2.0でのスローテスト（テスト遅い）問題対処法を思いつくだけ書き出す](https://qiita.com/terrierscript/items/80dede32cc7935193b70) - 
@terrierscript さん
pythonでクオータニオンを扱う(pyquaternion)

pythonでクオータニオン使いたい！って思ったら`pyquaternion`なるものがあった．
でも全然日本語記事がねえ．

とりあえず，公式ドキュメントを読んで使い方を書いとくことにした．
クオータニオンについて詳しくは他サイトをどうぞ

[公式ドキュメント][00ae8f2e]

  [00ae8f2e]: http://kieranwynn.github.io/pyquaternion/ "公式リンク"

**適宜更新**

# インストール

```shell:install
# 普通にpipでインストール可能
pip install pyquaternion
```

# 使い方
## 環境
最初の説明で「クオータニオンに手を出すくらいならnumpy使ってるよね．当然．」みたいな前書きがあったので当然numpyは必須です．なければインストールしましょう．

```py:import
# こいつでインポート
from pyquaternion import Quaternion
```
直感的に軸と回転を入れるだけでも，(w,x,y,z)でもどっちいれても使えます．便利

## 初期化
`1 + 0i + 0j + 0k` を作ります．

```py:default
q1 = Quaternion()

# コピー（クローンを作る）
q2 = Quaternion(q1)
```

## 要素から作成

`w,x,y,z`から作成

```py:from_elements
q1 = Quaternion(w,x,y,z)

# numpy.arrayからも可能
q2 = Quaternion(numpy.array([a,b,c,d]))

# タプル，リストからも可
```

##演算
掛け算、割り算はそのまま使えます。

```py:mutipli
qm = q1 * q2
qd = q1 / q2
```

## ノルム（長さ）

```py:norm
my_quaternion.norm
my_quaternion.magnitude
```

## 逆クオータニオン

```py:inversion
inv_quaternion = my_quaternion.inverse

#　共役クオータニオン
conj_quaternion = my_quaternion.conjugate
```

##正規化

```py:normalisation
unit_quaternion = my_quaternion.normalised
unit_quaternion = my_quaternion.unit
```

## 回転クオータニオン

３次元ベクトルをクオータニオンで回転

```py:rotation
rotated_tuple       = my_quaternion.rotate((1, 0, 0)) # Returns a tuple
rotated_list        = my_quaternion.rotate([1.0, 0.0, 0.0]) # Returns a list
rotated_array       = my_quaternion.rotate(numpy.array([1.0, 0.0, 0.0])) # Returns a Numpy 3-array
rotated_quaternion  = my_quaternion.rotate(Quaternion(vector=[1, 0, 0])) # Returns a Quaternion object
```

## 要素を取りだす

```py:accessing_individual_elements
a = my_quaternion.elements
print("{} + {}i + {}j + {}k".format(a[0], a[1], a[2], a[3]))
    #-0.6753741977725701 + 0.4624451782281068i + -0.059197245808339134j + 0.5714103921047806k
```
Ruby でもっと文字列を使い回したい

## きっかけ

Python3 で FizzBuzz を書くときに、次のようにすると、

```Python
def fizzbuzz(n):
    f = 'Fizz' if n % 3 == 0 else ''
    b = 'Buzz' if n % 5 == 0 else ''
    fb = f + b
    return fb or n
```

```Python
fizzbuzz(3) is fizzbuzz(6)        => True
fizzbuzz(5) is fizzbuzz(10)       => True
fizzbuzz(15) is fizzbuzz(30)      => True
```

となり、'Fizz' も 'Buzz' も 'FizzBuzz' も同じ文字列オブジェクトを使い回しています。Python の文字列が immutable だから、安全に使い回せるんですね。
これを Ruby でもやってみたいということです。
RubyInstaller の 2.5.1 を使います。

## つまずき

Ruby では、現状、文字列が使い回せるのは 文字列のリテラル("literal") に、`-"literal"` か `"literal".freeze` したときだとされています。`+` メソッドで文字列を結合すると、メソッド呼び出しのたびに新たな文字列オブジェクトが作られるため、Python のようにはいきません。

```Ruby
def fizzbuzz(n)
  f = (n % 3).zero? ? -"Fizz" : -""
  b = (n % 5).zero? ? -"Buzz" : -""
  fb = f + b
  fb.empty? ? n : fb
end

fizzbuzz(3).equal? fizzbuzz(6)           => false
fizzbuzz(5).equal? fizzbuzz(10)          => false
fizzbuzz(15).equal? fizzbuzz(30)         => false
```

## ひらめき

Ruby のマニュアルには、式展開はリテラルだと書かれています。だとすると、式展開と `-@` なり `freeze` なりを組み合わせれば、使い回しのきく文字列が合成できるのではないか？

```Ruby
def fizzbuzz(n)
  f = (n % 3).zero? ? -"Fizz" : -""
  b = (n % 5).zero? ? -"Buzz" : -""
  fb = -"#{f}#{b}"
  fb.empty? ? n : fb
end

fizzbuzz(3).equal? fizzbuzz(6)           => true
fizzbuzz(5).equal? fizzbuzz(10)          => true
fizzbuzz(15).equal? fizzbuzz(30)         => true
```

大成功です。こんなこと当たり前で、ただ私が不勉強なだけなのかもしれないのですが、まだ知らない人とこの感動を分かち合いたいと思い、勇気を持って投稿しました。

## いろいろ実験していて、「ひょっとしてバグ？」と思った点

* `fb = -"#{f}#{b}"` を `fb = "#{f}#{b}".freeze` にすると、文字列が使い回されない。

OMG! なぜ、両者で振る舞いを変えるのでしょう？

* `# frozen_string_literal: true` にすると、文字列が使い回されない。

ますます、OMG! です。初めから文字列リテラルが frozen なんだから、`-` が邪魔なのかと思って削ってみたものの変化はありませんでした。
この振る舞いは意図的なものなのでしょうか？

## 結論的なもの

`# frozen_string_literal: false` + `-"literal"` + `式展開` = `最強`
25歳初めてのフリーランスエンジニアの単価について

## はじめに

今回は自分が知りたかったシリーズ第1弾です。

第1弾：25歳初めてのフリーランスエンジニアの単価について
第2弾：[新卒入社後、約3年半で読んできた書籍たち](https://qiita.com/turmericN/items/5c09ce3b634c73c118e7)
第3弾：[フリーランスエンジニアの面談ってこんな感じ](https://qiita.com/turmericN/items/e248d8ac30ca5c21650e)
第4弾：[新規参画した現場で1週間で意識したこと、やったこと](https://qiita.com/turmericN/items/7a66033c1d7fb24ca458)

こんにちは。今はまだ正社員ですが10月から初めてフリーランスエンジニアとして仕事していく予定です。
気になる単価ですがネットで調べると平均やMaxの値が多いので、僕のスキルでどれくらいの単価を提示してもらえたのかを記載しておきます。

## 職歴
キャリアチェンジはおそらく王道中の王道だと思います。
SIer→Web系開発→フリーランスエンジニア

[エンジニアの市場価値診断やってみたら今の年収低すぎた](https://www.youtube.com/watch?v=VCStEMndSXM)
この動画の例にでてきたキャリアップ事例集は自分なのではと錯覚しました。

### SIer(2015-2017年)
新卒でSIerに入社
常駐案件でVB.NETや少しjavascriptの開発
ただ、もっと開発がしたい！！Webに携わりたい！！モダンな環境触りたい！！という思いから転職を決意。

### Web系自社開発(2017-2018年)
ありがたいことにほぼWeb系は未経験（少しjavascript触っていましたが。。）にも関わらず、採用して頂きました。
ベンチャー企業でフロント、バックエンドでどちらも経験できる環境で最初はスキルギャップに苦しみましたが必死に勉強していきました。
技術的にも余裕が出てきて勉強会に参加するようになり、もっと色んなプロダクトや技術に挑戦したい気持ちがでてくるようになりました。
即戦力ではなく、ポテンシャルをみて採用頂いたので申し訳なさはあります。

### フリーランスエンジニア(2018年予定〜)
技術的にも不安がありましたが、失敗しても立ち直りやすい、若いうちにという考えもあり挑戦してみることに

## スキルセット
簡単ですが下記に簡単なポートフォーリオを作成しています。
エージェントへの職務経歴書も概ねこれと同じものを書いています。
https://spinesuzukinaoto.github.io/portfolio/

見てわかるように実務経験もそこまで長くなく、すごい成果物もない状態です。
このようなものでそもそも参画できる案件はあるのかという不安はありました。

## 使用したエージェント
営業もできず、コネもないのでエージェントにお願いしました。
下記、記載したエージェント以外にも2つほどお話を聞きに行きました。
ただ、管理、スケジュール調整が大変になり大手2社に落ち着きました。
まだ全てのフローを経験はしていませんが、対応はどちらも良かったです。

- [geechs job](https://geechs-magazine.com/job/)
- [レバテック](https://freelance.levtech.jp/?sip=o075000_030)

## 結果
おそらくここが一番気になる所だと思いますが、下記表となります。
5社面談して4社から是非とのお声を頂き、単価も提示されました。
自分のスキルセットでこの金額は高いのか？低いのか？妥当なのか？というのが正直分からないですが、仕事はあるんだなと分かりました。

運が良かったのかどの面談も楽しかったです。知らないプロダクトや進め方を聞けるのはいいですね。
また、面談後エージェントからフィードバックをもらえますが「キャッチアップ能力がありそう」、「ポテンシャル感じる」、「一緒に仕事をしてみたい」という内容は社交辞令でも嬉しいものがありました。

実際に参画する所は面談の雰囲気、プロダクトの興味、技術的な興味、単価を総合して決めています。

||技術 | 単価（税込み）|
|:-----------------|------------------:|:------------------:|
| A社| vue,PHP | 65万円 |
| B社| Angular,vue,Go,Python | 63万円 |
| C社| PHP(Laravel) | 55万円 |
| D社| Riot.js | 55万円 |
| E社| 不明（案件によって） | 不明（連絡がこなかった？） |

## 所感
- フリーランスで迷っているならとりあえずエージェントに相談してみる（無料なので）
- そこまで技術がなくても書類選考は通った
- 面談ではしっかり自分のやってきたことを話す。どのようなプロジェクトで、どのような技術を使って、どういった考えで取り組んでいたか？
- 自分の考えを話せるようにする。「僕はこういった考えでフリーランスを目指し、5年後はこうなりたい。」
- 意外とポテンシャル的な所もみてくれる？？
- 参画の意志決定は早くする必要あり（長くても1週間）
- 常に自分のキャリアを考えていく必要がある
- 最終的に面談で決まるのでコミュニケーション能力は大事

## 最後に
参画案件は決まったものの実際に入ってからどうなるのかは少し不安です。。（すぐに切られるのではないのか。）
ただ、自分がどういった所で貢献できるのか？期待される役回りはどこか？は常に頭に入れながらやっていこうと思います。

## 参考URL
[フリーランスエンジニアの単価を決める](https://qiita.com/KazukiTanaka/items/130a2c477847b24e35ce)
目からウロコです。この視点はまだ持てていません。ここまで考えて行動できる様になりたいです。

[雑食系エンジニアTV](https://www.youtube.com/channel/UC_HLK-ksslL-Z_2wiIZDlMg)
この動画を何回も見て、自分にあった働き方はなんだろうと考えました。
CPU/GPU プロセッサ　メーカー謹製 Fortran 

# CPU/GPU プロセッサ・メーカーの Fortran 
##Intel
* intel fortran

https://software.intel.com/en-us/fortran-compilers
https://www.xlsoft.com/jp/products/intel/compilers/index.html

##AMD
* AOCC Fortran Plugin 
* DragonEgg – the Fortran Compiler
* Flang (alpha) – the Fortran compiler

https://developer.amd.com/amd-aocc/

##NVidia/PGI
* PGI CUDA FORTRAN

https://developer.nvidia.com/cuda-fortran
https://www.pgroup.com/

##ARM
* ARM ALLINEA STUDIO: ARM FORTRAN COMPILER
* GNU compiler for Armv8-A 
* llvm flang?

https://www.arm.com/products/development-tools/server-and-hpc/allinea-studio/fortran-compiler
https://developer.arm.com/hpc/hpc-software/categories/compilers

##富士通
* ARM 用 Fortran 
?

- Hisa Ando　Hot Chips 30 - 富士通が発表したPost-Kスパコンのプロセサ
1 https://news.mynavi.jp/article/a64fx-1/
2 https://news.mynavi.jp/article/a64fx-2/
3 https://news.mynavi.jp/article/a64fx-3/
4 https://news.mynavi.jp/article/a64fx-4/

##NEC
* SX−Aurora TSUBASA 用　Fortran

?　

参考
https://vectory.work/
https://www.cal.is.tohoku.ac.jp/_wp/blog/category/sx-aurora-tsubasa/ 実機導入記あり

- Hisa Ando　Hot Chips 30 - NECの最新スパコン「SX-Aurora TSUBASA」を読み解く

1 https://news.mynavi.jp/article/nec_aurora_tsubasa-1/
2 https://  


##IBM
* Power AIX/Linux
* z/OS

https://www.ibm.com/jp-ja/marketplace/xl-fortran-aix-compiler-power
https://www.ibm.com/jp-ja/marketplace/xl-fortran-linux-compiler-power
https://www.ibm.com/jp-ja/marketplace/vs-fortran
PowerAppsのAccelerationについて調べてみた

この投稿では、PowerAppsでデバイスの加速度センサーがどのように利用されているのかを実験した結果を報告します。

##PowerAppsでのAcceleration関数とは##
近頃ではネイティブアプリだけでなく、ブラウザからもデバイスの加速度センサーの情報を呼び出せるようになりました。
PowerAppsでも同様に、デバイスの加速度センサーの情報（Acceleration関数）が提供されています。
公式のドキュメントでは以下のように記載されています：
*The Acceleration signal returns the device's acceleration in three dimensions relative to the device's screen. Acceleration is measured in g units of 9.81 m/second2*
地球の重力加速度を単位として、数値が返されるということです。
この関数を使って何ができるかはさておき（例えばデバイスの傾きを検知してオブジェクトを動かすとか）、実際に試してみましたので、結果を記載します。

##試してみた##
使用したのはiPhone7, Android Nexus 5X, Windows 10 Mobileです。
結果からいうと、すべてのデバイスで共通して、**重力加速度の影響を取り除いていない結果**がかえってきました。
以下スクショです。
|<img width="200" alt="acc1.png" src="https://qiita-image-store.s3.amazonaws.com/0/202779/7c718437-eebb-09fa-900c-60cebabb47e4.png">　　<img width="200" alt="acc2.png" src="https://qiita-image-store.s3.amazonaws.com/0/202779/64c69547-bc73-2f22-f85c-3aa7ac848b3f.png">

順に、デバイスを寝かせた場合、縦にした場合の例です。Xはデバイスの左右方向、Yは前後方向、Zは画面方向で、加速度の大きさはそれぞれの2乗を足して、平方根をとっています。
見てみると、おおよそ9.8m/s\^2が静止した状態でも表示されることがわかります。
OS差異は、Android, Windows 10 Mobileでも見られませんでした。

##コードを覗いてみた##
いつも通り、開発者ツールでどんな実装なのかみてみました。
/studio/js/AppMagic.Runtime.App.js の中に以下のように記載されています。これが怪しそう。

```JavaScript:AppMagic.Runtime.App.js
this._watchID=navigator.accelerometer.watchAcceleration
```

acclerometer.watchAcceleration で[Monaca Docsの説明](https://docs.monaca.io/ja/reference/cordova_6.2/device-motion/)がヒットしました。

**加速度の値には、重力加速度 ( 9.81 m/s\^2 ) も含まれるため、端末の画面を上に向け、水平にした場合、 返される *x*、*y*、*z* の値は、0、0、9.81 にそれぞれなります。**
ということで、利用の場合にはご注意ください。
vimでclipboardを+にしたいけどならない人向け

初学者です。
ubuntu18.04にアップデートした際、
vimをコンパイルしたら

```shell

$ vim --version | grep clipboard
-clipboard         +jumplist          +persistent_undo   +vertsplit
+emacs_tags        +mouse_dec         -sun_workshop      -xterm_clipboard
```
と、clipboardが-になってしまった。
これを解決した手順の覚え書きです。

#参考
大変参考になりました。
[Ubuntu 16.04: apt sourceでソースコードをダウンロードする](https://www.hiroom2.com/2016/07/14/ubuntu-16-04-apt-source%E3%81%A7%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B/)
[How to build vim 8 with clipboard support](https://www.reddit.com/r/vim/comments/52knab/how_to_build_vim_8_with_clipboard_support/)

#vimをコンパイルしたい

##ソースコード取得
```shell
$ cd /opt/
$ sudo git clone https://github.com/vim/vim 
$ cd vim/
```

##依存したパッケージのソースコード取得

```shell
$ sudo apt build-dep vim
Reading package lists... Done
E: You must put some 'source' URIs in your sources.list
```
できない。終わり。

Ubuntu16.04以降ではデフォルトではソースコードをダウンロードできないらしい。
理由はdeb-srcがコメントアウトされているため。
対応するdeb-srcをコメント解除しろということらしいので、全部解除した。

```shell
$ sudo su -c "grep '^deb ' /etc/apt/sources.list | \
sed 's/^deb/deb-src/g' > /etc/apt/sources.list.d/deb-src.list"
$ sudo apt update
$ sudo apt build-dep vim
```
できた。


##メイクする
```shell

$ sudo ./configure --with-features=huge \
 --with-x \
 --enable-multibyte \
 --enable-luainterp=dynamic \
 --enable-gpm \
 --enable-cscope \
 --enable-fontset \
 --enable-fail-if-missing \
 --prefix=/usr/local 
 --enable-pythoninterp=dynamic \
 --enable-python3interp=dynamic \
 --enable-rubyinterp=dynamic \
 --enable-gui=auto \
 --enable-gtk2-check \

$ sudo make
$ sudo make install

$ vim --version | grep clipboard
+clipboard         +jumplist          +persistent_undo   +vertsplit
+emacs_tags        +mouse_dec         -sun_workshop      +xterm_clipboard
```
できた。
新卒1年目プログラミング未経験者が配属１ヶ月で困ったこととその対処法

# はじめに
前回の記事「[プログラミング未経験者がエンジニアとして配属されるまでに使った書籍と学習コンテンツ](https://qiita.com/KakkiiiiKyg/items/8949cdf5d31b5c7addcd)」はとてもたくさんの方に読んでいただいたようで、トレンド入りすることができました。読んでいただき、ありがとうございます。少しでも自分と同じ初心者の方に読んでもらえれば、という気持ちで書いたのでとても嬉しいです。

さて、今回は実際に配属されて１ヶ月が経って、その中で私が困ったことと、その対処法について書こうと思います。私と同じことに今現在悩んでいる方、これからエンジニアとして現場に配属される方の参考に少しでもなってもらえると嬉しいです。

# 配属１ヶ月で一番困ったこと
何に困ったかと言えば、ズバリ「**書かれているコードの意味が分からない**」です。配属直後は、今まで書かれたコードを読み込む作業が必要かと思うのですが、新人エンジニアにとっては書かれているコードを読み込んでも全く理解できません。この分からない原因には知識ももちろんあると思うのですが、以下の３つが大きいかなと感じました。

- コード量が膨大でどこから読めば良いのか分からない
- 配属直後でそのコードが書かれた思想・背景を知らない
- コードを読み取るということに慣れていない

特に私のようなチームでの開発経験などが全く無く、本やネットのコンテンツで学んだだけの人にとっては、「他人の書いたコードを読む」ことが初めての経験で、とても苦労するかと思います。

# 対処法
しかし書かれているコードが理解できなければ、いつまで経っても本格的な開発に携わることができません。そこで、私は以下の３つの方法で対応しました

## 最小単位に区切った機能ごとにコードを読む
いきなり上のファイルから読んでいっても、全く理解できませんでした。そこで、まずはユーザーの立場になって、どういう機能があるのかを洗い出し、その機能を最小単位に区切っていきました。例えば、ユーザーが以下のようにアプリを使うとします

- トップページからAページに行く
- AページでBという情報をユーザーが入力する
- Bという情報を入力したユーザーはCページに行く

そうしたらまず「トップページからAページにはどういう仕組みで行けるのか」ということが説明できるようになるためにコードを読みます。それができたら、次は「ユーザーが入力する情報をどうやって処理するのか」、次は「Cページにはどういう仕組みで行けるのか」というようになるべく小さな単位に区切って、その挙動を説明するという目的でコードを読むようにしました。

読む目的がはっきりすると、本当に読むべきところに集中できます。これにより、読むべきコード量が膨大という問題が少しは解消するかと思います。

## 過去のプルリクエストを読む
過去のプルリクエストも読むようにしました。プルリクエストはある機能についてひとまとまりになっている（はず、な）ので読む量が少なくてただ上から読むより理解しやすいです。

さらにプルリクエストの良いところは、そのコードが書かれた背景も書いてあるというところです。そしてコードレビューもあわせて読めば、そのチームの思想も垣間見えます。

あまり過去のを遡るともう使われていないコードかもしれないので、最近のものから読んでいくと良いと思います。

## 自分でコードを書きながら既存のコードを読む
コードを読み込んで理解しないと本格的な開発には入れないかと思いますが、ちょっとしたレイアウト修正やリファクタリングならできることがあると思います。これができる環境なら、100%全てのコードを読み込む前からどんどん自分でコードを書いていった方が良いと思います。

私の場合は、先輩方にレイアウトの修正やリファクタリングの機会を与えてもらったため、本当に助かりました。自分でコードを書くとなると、目的が明確になるので、本当に読むべきところがはっきりします。

それに先述の通り、コードを読み取るということに慣れていないため、理解したと思っても、自分で手を入れてみると、思ってもいない挙動を起こすことがあります。そこで初めて「正しく理解できていなかった」ということに気付けるということが多々ありました。

# 終わりに
以上、「配属されたが書かれているコードが分からない」という自分の一番困ったことと、それについて自分がやったことについて書きました。実際は私もまだまだ理解できてないところがたくさんあって、悪戦苦闘中です。

ここに書いた他にも、「もっとこうすれば良いのに！」という先輩エンジニアの方々や「私はこうしている！」という同じく新人エンジニアとして頑張っている方々のコメントお待ちしています。
webhook周りのアクションをローカルホストで検証

# 概要

ローカルホストで実践により近い形でwebhookの検証をしたかったが、わからなかったため、メモメモ。

# そもそもwebhookとは？

> Webhookは、複数のWebサービスを連携するための仕組みです。 kintoneでWebhookを設定すると、次の操作が行われたときに、そのことを外部のWebサービスに通知できます。 Webhookを利用すると、kintoneと外部のWebサービスを連携できます。(Google)

# ローカルホストでなぜPOSTを受け取れないのか

Webhookの説明を見ると「通知する、Webhookを送る」などの言葉が用いられているが、
これはPOSTリクエストのことを指している。WEBサーバー側から自分のパソコンをlocalhostで指定してしまうと、WEBサーバー自体を指してしまうため、localhostを指定することで送信できないということがある。よく検索出てくるIPアドレス指定すると良いよね！みたいなのはlocalhostなどを刺さないために必要。

# 検証の主な方法

ここでWebhookの検証に用いることができる主な方法を確認しておく。

1. リモートにサーバーを自分で立ててlocalhostに転送する
2. 様々なサービスを使ってlocalhostに転送する。

# 1. リモートにサーバーを自分で立ててlocalhostに転送する

こちらについては以下の記事で開設されていたため、そちらに任せることにします。

[ローカル環境のサーバで Webhook を受け取る方法](https://qiita.com/hoto17296/items/7af969284b022568a36e) - @hoto17296 さん

# 2. 様々なサービスを使ってlocalhostに転送する。

以下で紹介しているサービスやツールたちは結局のところ以下の流れでlocalhostに転送している。

1. webhookのURLの向き先をWEB上に存在しているツールのURLにしておく
2. ツールがwebhookの内容を受け取り、それをlocalhostに転送
3. localhostはそれを受け取ってhogehogeする

## ultrahook

Railsの場合は「ultrahook」というgemが用意してあり、これを利用することで、外部からのwebhookを受け取って、検証を行うことができる。

## ngrok

こちらも一部の方には結構有名なサービス。自分は初めて知った時とても便利と感動した。
以下の記事は導入するのに役立ったと思う。ありがとうございます。

[ngrokを使用してローカル環境を外部に公開する](https://qiita.com/kitaro729/items/44214f9f81d3ebda58bd)

##  注意点！！！！！！！！！！！！！！！！！！！

上記二つのサービスもそうだが、基本的にはネット上に公開されているものを使ってテストをしている。そのため、セキュリティを締めておかないと、クラックし放題となる。セキュリティを締めるべきところについては他の記事に任せるが、最低限必要と言われるところはやっておくこと。

# 参考

[Webhookとは？](https://qiita.com/soarflat/items/ed970f6dc59b2ab76169) - @soarflat さん
[ローカル環境のサーバで Webhook を受け取る方法](https://qiita.com/hoto17296/items/7af969284b022568a36e) - @hoto17296 さん
[StripeのwebhookをUltraHook使ってローカルで受け取るやつ](https://qiita.com/sio_9/items/a4429df9676aa81d5983) - @sio_9 さん
[ローカル環境でWebhookが使える UltraHook - はてなブログ](https://tmg0525.hatenadiary.jp/entry/2018/02/22/222519)
[GitHubのWebhookをPHPで受け取る練習 - はてなブログ](http://am1tanaka.hatenablog.com/entry/2018/03/09/004014)
OvercommitでGit hookを簡単に設定する

# Overcommit！クリーンコード警察ツール

そもそもLintなどの静的コード解析を通過しない状態でコミットしたくない・させたくないですね。
Git Hookで色々と組み込めますが一からやるのがかなり辛いです。 

そこで、Overcommit! Git Hookを簡単に設定・管理ができるツールです。

https://github.com/brigade/overcommit

今回nodejs用に簡単に設定してみました。

## インストール

### 事前準備

* `gem`コマンドが使える環境
* nodejsやJavascriptのある既存Gitレポジトリ
* [EsLint](https://eslint.org/)のパッケージがインストールされ、任意のルールで設定されている

### Overcommitのgemをインストールする

```shell
> gem install overcommit
Fetching: iniparse-1.4.4.gem (100%)
Successfully installed iniparse-1.4.4
Fetching: overcommit-0.46.0.gem (100%)
Install hooks by running `overcommit --install` in your Git repository
Successfully installed overcommit-0.46.0
Parsing documentation for iniparse-1.4.4
Installing ri documentation for iniparse-1.4.4
Parsing documentation for overcommit-0.46.0
Installing ri documentation for overcommit-0.46.0
Done installing documentation for iniparse, overcommit after 1 seconds
2 gems installed
```

### Overcommitを初期設定する

```yaml:.overcommit.yml
PreCommit:
  EsLint:
    enabled: true
    description: 'Analyze with ESLint'
    required_executable: 'node_modules/.bin/eslint'
    flags: ['--format=compact']
    install_command: 'npm install -g eslint'
    include: '**/*.js'
```

そして設定を反映します。

```shell
> overcommit --sign
Updating signature for configuration file...
```

## 実験

### EsLintのエラーを起こす

適当にソース内に行の終わりに`;;`を入れてコミットしてみます。

```shell
> git commit -m "ESLint prehook should fail"
Running pre-commit hooks
Analyze with ESLint..........................................[EsLint] FAILED
Errors on modified lines:
/Users/jb/Documents/nyan/co/app.js: line 10, col 20, Error - Extra semicolon. (semi)
/Users/jb/Documents/nyan/co/app.js: line 10, col 20, Error - Missing whitespace after semicolon. (semi-spacing)
/Users/jb/Documents/nyan/co/app.js: line 10, col 21, Error - Unnecessary semicolon. (no-extra-semi)


✗ One or more pre-commit hooks failed
```

### コミットメッセージの警告を出す

デフォルトで入るチェックがいくつかあります。コミットメッセージのフォーマットはその一つです。

詳しくは： https://github.com/brigade/overcommit/blob/master/config/default.yml

```shell
> git commit -m "elisnt wil succeed"
Running pre-commit hooks

✓ All pre-commit hooks passed

Running commit-msg hooks
Check text width..........................................[TextWidth] OK
Check subject capitalization.....................[CapitalizedSubject] WARNING
Subject should start with a capital letter
Check subject line................................[SingleLineSubject] OK
Check for trailing periods in subject................[TrailingPeriod] OK

⚠ All commit-msg hooks passed, but with warnings

[master fb50ca4] elisnt wil succeed
 1 file changed, 1 insertion(+), 1 deletion(-)
```

## 感想

最高です。プロジェクト初期段階（スプリントゼロ）に必ず入れたいものです。

PreCommitの他、PrePush、PostMergeなども設定できます。

すぐに利用できるHookは非常に豊富です。Ruby, PHP, Javascript, Python, yaml, Typescript, Golang, CSS, SCSS, HTML, nginx, shellなど、必要以上にあります。

https://github.com/brigade/overcommit#built-in-hooks

コミット前に、RubyLintとRailsBestPracticesでクリーンコードをチェックし、プッシュ前にRspecでテスト通過確認させるフローはこれで簡単に実現できます♥
windows python 導入

インストールされたいもの
python本体
Numpy（数値計算モジュール）
matplotlib、seaborn、bokeh、jupyter（可視化モジュール）
Scipy（科学技術計算モジュール）
Pandas,blaze,dask（データ解析モジュール）
pdfminer3K（PDF解析モジュール）
csvkit（csvハンドリングモジュール）
statsmodels（統計モジュール）
scikit-learn（機械学習）
PuLP（数理最適化モジュール）
NetworkX（ネットワークモジュール）
xlwings（Excel連携モジュール）
lightgbm（勾配ブースティング関連モジュール）
BeautifulSoup4（ウェブスクレイピング）

下記のサイトを参考
https://qiita.com/R-Imai/items/18fee5203e695838e899

python本体のインストール、下記サイトからインストーラーダウンロード
https://www.python.org/downloads/windows/
インストールの際にAdd Python 3.※ to PATH をチェック入れ
パス変更の場合、カスタマの方を選ぶ（その前にディレクトリを作成）

終わったらコマンドプロンプトを立ち上げ、python -Vでバージョン確認

次にpipをアップグレードする
python -m pip install --upgrade pip

pipに入っているモジュールを確認
pip list
基本はpipとsetuptools しかない次には各モジュールをインストール

pip install Numpy matplotlib seaborn bokeh jupyter Scipy Pandas blaze dask pdfminer3K csvkit statsmodels scikit-learn PuLP NetworkX xlwings lightgbm BeautifulSoup4
（場合によって -mをつけて管理者でやる）

少し時間がかかる

終わったら pip listで確認あればＯＫ、これら付随するものもインストールされるはず、これで完了

Atomエディタをインストール
これは好みですがあれば便利
https://atom.io/
インストールされたら、日本語化を行う
「Settings」→「Install」を選択
Search packagesに「japanese Menu」を入力して「Packages」をクリック
検索で出てきた「japanese Menu」の「Install」をポチって完了
こちら参考
https://qiita.com/takuya-y/items/c1df4187c2c2eb679bde

Jupyter　エディタの起動は
jupyter notebook
Atomインストール＆日本語化

公式サイトよりダウンロード
https://atom.io/
ieで開くと絵のズレが発生するのだがchromeだと問題なく20180903現時点は最新1.30.0

次は日本語化を行う
•Atomを起動する
•メニューバーにあるHelp→WelComeGuideをクリック
•「Install a Package」をクリック
•「Open Installer」をクリック
•左側の上の方にフォームがあるのでそこに「japanese」と入力し、「Packages」をクリックします。
•パッケージが表示されるので、「japanese-menu」の「Install」をクリックしましょう。
•日本語化完了
我が家にBing for Businessがやってきた！

**ついにBing for Businessがうちにきました！**
これまでOffice365のAdmin centerの「サービスとアドイン」には、**Bing**という項目があるにも関わらず、
ONにしようとするとエラーが起きてサービスを有効にできていませんした。
![bing_error.png](https://qiita-image-store.s3.amazonaws.com/0/202779/6933ca57-b9ff-6502-d2fe-aefb54f1c10c.png)

※Bing for Businessについては[こちら](https://support.office.com/ja-jp/article/Bing-for-Business-の概要-161ea667-9b27-4695-b7a8-e8e063141795)を参照してください。
要はテナント内の人とかファイルをbingから検索できるというものです。

なんか面白そうなので、サポートに問い合わせしたところ、
*『日本ではまだプレビューを提供していないよ。もし使いたかったらこの[リンク](https://go.microsoft.com/fwlink/?linkid=857686)から問い合わせしてね』*
とのこと。で、リクエストしてみました。

本日久しぶりにEdgeをつかってBingで検索をかけてみるとどうでしょう。
<img width="528" alt="bing1.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/202779/bd7ad4a3-5b04-72f7-df3c-ce747ffb2df4.png">
**なんか出てる！！**

ためしに検索文字を入れてみます。（SharePoint OnlineのHome.aspxとかなら確実だろうと）
<img width="876" alt="bing!!.png" src="https://qiita-image-store.s3.amazonaws.com/0/202779/5e56b3c4-7dfd-c2fe-631d-d6a19d3715be.png">
きました！！！なんとSharePoint Onlineのサイトページが検索結果で返ってきたのです！
というかちゃんとBing for Businessってかいてあるし！

ということで、使ってみたいなという方がもしいたら、リンク先（Formsで作られたリクエストフォーム）から申請してみるとよいかと思います。
私はプライベートテナントですが通ったみたいです。

[2018/09/04追記]
[次の投稿](https://qiita.com/h-nagao/items/8676e8938ca436cd38cd)で検索にヒットする対象を調べた結果を紹介しています。
springのバリデーションの実装時のエラーについて

```
HTTPステータス 400 - Bad Request
Type ステータスレポート

説明 The server cannot or will not process the request due to something 
that is perceived to be a client error (e.g., malformed request syntax, 
invalid request message framing, or deceptive request routing).

Apache Tomcat/8.5.32

```

# 結論から言うと『BindingResult』の順番間違い

リクエストを送ったPOSTコントローラーでの引数に『BindingResult』オブジェクトを使用していたが、その順番を間違えていたから。

```
@RequestMapping(value = "/hoge", method = RequestMethod.POST)
public String hogeHoge(@Valid @ModelAttribute EmployeeListForm form, BindingResult result, Model model) {
    if (result.hasErrors()) {
        model.addAttribute("title", "エラー");
        model.addAttribute("message", "以下のエラーを解消してください");
    } else {
        EmployeeDto dto = new EmployeeDto();
        BeanUtils.copyProperties(form, dto);
        employeeList.add(dto);
        model.addAttribute("title", "社員一覧");
        model.addAttribute("message", form.getName() + "を登録しました。");
        model.addAttribute("employeeListForm", new EmployeeListForm());
    }
    model.addAttribute("employeeList", employeeList);
    return "hoge";
}
```

このように引数には
`hogeHoge(formオブジェクト, BindingResult, Model)`
の順番にしないといけない
グループ化したGoogle Homeで時間になったら音楽を鳴らす

[ブログ](https://aoirohn.hatenablog.com/)からの転載です

# 背景

Google Homeの二台目を購入してホームグループを作ったまでは良かったのだが、時間をトリガーにして音楽を流させようとしても1台のGoogle Homeでしか再生できなかった。
ということでホームグループに対して再生させる方法を調べた。

# 結論
ネットで検索すると真っ先にヒットするnode.jsのライブラリ、[google-home-notifier](https://github.com/noelportugal/google-home-notifier)ではホームグループでの再生はできないので**[pychromecast](https://github.com/balloob/pychromecast)を使おう！** [^1]

[^1]: Google homes are just chromecasts! らしい


# 詳細

きちんと確認したわけではないけれど、Google Homeで音楽を鳴らしたり喋らせたりするとき、Google Homeのポート8009にアクセスすることで再生が始まる。しかし、グループに投げたいときはグループの親となっている(？)Google Homeの8009ではない特定のポートに対してアクセスしなければならない。

google-home-notifierでは使っているcastv2-clientか何かのライブラリがアクセスするポートを8009に固定してしまっており、グループのポートを指定できないためグループにキャストできない。

この記事はただの定期実行だし、リスナー常駐させるほどじゃないなという方向けです。
外部からIFTTT等で喋らせたい場合は、同様にpychromecastを使っている[google-home-notifier-python](https://github.com/harperreed/google-home-notifier-python)を使いましょう。

---

# 必要な環境

- Google Home 複数(グループ化しておく)
- raspberry piなどのおうちハックできる環境
- 音楽ファイルをおいておくためのローカルサーバー (raspberry piでも良い)

# pychromecast インストール

1.  raspberry piにpython3環境を作っておきます
2. pychromecastをインストール
    
    ```pip3 install pychromecast```

# 音楽を鳴らすスクリプト
今回は曜日ごとに流す音楽を変えた


```python
#### alarm.py ####

#!/usr/bin/env python3
#coding: utf-8

import pychromecast as pcc
import datetime as dt

chromecasts = pcc.get_chromecasts()
#print(chromecasts)

#再生するGoogle ホームの名前；グループ名でも単体の名前でもOK
chromecast_name = "ホームグループ" 
cast = next(cc for cc in chromecasts if cc.device.friendly_name == chromecast_name)

weekday = dt.datetime.now().weekday()

music_path = 'http://192.168.x.x/path_to_music_dir/';

if   weekday == 0: # mon
    music_path += 'Mon.mp3'
elif weekday == 1: # tue
    music_path += 'Tue.mp3'
elif weekday == 2: # wed
    music_path += 'Wed.mp3'
elif weekday == 3: # thu
    music_path += 'Thu.mp3'
elif weekday == 4: # fri
    music_path += 'Fri.mp3'
else:              # sat, sun
    music_path += 'Sat_Sun.mp3'

print(music_path)

cast.wait()
mc = cast.media_controller
mc.play_media(music_path, 'audio/mp3')
mc.block_until_active()

```

最後の`mc.block_until_active()`を忘れるとDefault Media Receiverがactiveのときしか再生されなくなるので注意

# cronに登録

今回は朝家を出る時間に流してほしいのでcronで定期実行の登録をする

```sh
$ chmod 755 alarm.py
$ crontab -e

> 0 7 * * * /home/pi/path_to_dir/alarm.py
```
完成！

---

ということでgoogle homeのグループで音楽を流させる方法でした。
今回は音楽でしたが喋らせることも同様にできます。
ただしnode.jsのgoogle-home-notifierと違ってpychormecastでは一度音声を保存する必要があります。

そんなに難しくないので、やりたい方は同様にpychromecastを使っている[google-home-notifier-python](https://github.com/harperreed/google-home-notifier-python)の実装を参考にすると良いでしょう。
Pythonで競プロに挑む日誌 vol.6 ~集合型の内包表記~

サクッと解けたので連続投稿.

# 現在の目標
* 今年の10月内に茶色を取得する **←イマココ**
* 年内に緑色を取得する
* [APG4b](https://beta.atcoder.jp/contests/apg4b) で C++ にも手を出す

#今日の問題その2
ABC085B - Kagami Mochi 
https://beta.atcoder.jp/contests/abs/tasks/abc085_b

**結果**

```answer.py
# coding: utf-8
N = int(input())
print(len({input() for i in range(N)}))

# 実行時間：17 ms
# メモリ　：2940 KB
# コード長：76 Byte
# 得点　　：200/200
```
たぶん1行でも書けるんだろうけど, 最初の N がどこに行ったか分からなくなりそうなので, 私にはこれくらいがちょうどよさそうな気がする.

#明日やること
[ABC085C - Otoshidama](https://beta.atcoder.jp/contests/abs/tasks/abc085_c) を解く.
UbuntuでHerokuを使おうと思ったらエラーになった

##前提
・Bash On Ubuntu On Windowsを使用
・Windows10


herokuのインストールはこちらの記事を参考にしました。
[Heroku CLI を ubuntuに入れる](https://qiita.com/ryotaro76/items/6aa9d3187d742eed0325)


##エラー概要
インストール完了。


```
$ wget -qO- https://cli-assets.heroku.com/install-ubuntu.sh | sh
```


まずはherokuを呼んでみる

```
$ heroku --version
```
あ、あれ…？

```
/mnt/c/Program Files/heroku/bin/../client/bin/heroku.cmd: 1: /mnt/c/Program Files/heroku/bin/../client/bin/heroku.cmd: @echo: not found
/mnt/c/Program Files/heroku/bin/../client/bin/heroku.cmd: 2: /mnt/c/Program Files/heroku/bin/../client/bin/heroku.cmd: setlocal: not found
/mnt/c/Program Files/heroku/bin/../client/bin/heroku.cmd: 4: /mnt/c/Program Files/heroku/bin/../client/bin/heroku.cmd: Syntax error: "(" unexpected (expecting "then")
```
なぜか怒涛のエラーメッセージ。
##解決法

ということで調べたら次の記事が。
[heroku push postgres WINDOWS 10
](https://stackoverflow.com/questions/47866902/heroku-push-postgres-windows-10)
その中のコメントに、
>have you tried with sudo heroku ... ? – Aserre Dec 18 '17 at 10:53

お？
ということでやってみる。

```
$ sudo heroku
```
できた！！！

##考察
管理者権限が必要ってことですね。
template関数を特定の型集合(浮動小数点型、整数型等)に特殊化する方法

たまに使うのに調べてもパッと出てこなかったので自分用のメモ

```c++:test.cc
#include <iostream>
#include <type_traits>

using std::cout;
using std::endl;

template <class T,
         typename std::enable_if<std::is_floating_point<T>::value, T>::type* = nullptr>
void func(T num){
    cout << "This is a floating point number:" << num << endl;
}
template <class T,
         typename std::enable_if<std::is_integral<T>::value, T>::type* = nullptr>
void func(T num){
    cout << "This is an integer number:" << num << endl;
}
template <class T,
         typename std::enable_if<!std::is_floating_point<T>::value && !std::is_integral<T>::value, T>::type* = nullptr>
void func(T num){
    cout << "This is neither integer nor floating number:" << num << endl;
}

int main(){
    func(123);
    func(123.);
    func(123.f);
    func("0x7B");
    return 0;
}
```
翻訳：超知能へ向けたステップ (ロドニー・ブルックス)

# ロドニー・ブルックス氏について

1954年、オーストラリア生まれ。スタンフォード大学で博士号を取得。1980年代半ばより、MITでコンピュータ・サイエンスの教授を勤めています。詳細な経歴はブルックス氏本人が説明している本文を読んでほしいのですが、包摂アーキテクチャ (サブサンプション・アーキテクチャ) の提案によりロボティクスと人工知能研究に革命をもたらした人物です。最近では、ロボット掃除機ルンバを作ったiRobot社の共同創業者としても有名です。

ブルックス氏は、2017年初めごろから自身のサイトhttps://rodneybrooks.com/ 上のブログで、近年のいわゆる「第三次AIブーム」に対するやや懐疑的な論調のエッセイを多数発表しています。この記事は、「ロボティクスとAIの未来」というタイトルを付けられた連載記事の一部であり、「超知能」あるいはその前段階として「汎用人工知能」の実現のため目指すべき目標を説明するエッセイです。

# tl; dr

パート1では、人工知能研究の難しさと、過去「汎用人工知能」の実現を目指した4つのアプローチが説明される。4つのアプローチは、「シンボリックAI」、「ニューラルネットワーク」、「伝統的ロボティクス」と「振る舞いに基づくアーキテクチャ」である。最後の「振る舞いに基づくアーキテクチャ」は、ブルックス氏自身が考案したものである。

パート2では、いわゆるチューリングテスト (模倣ゲーム) を代替する、汎用的な知能をテストするための手法として、エルダーケアワーカー (ECW) とサービスロジスティックプランナー (SLP) というアプリケーションが提唱されている。ECWは、高齢者の家で身体的な介護介助を行う物理的なロボットである。SLPは、何らかのサービス提供 (文中では、人工透析施設の医療サービスが例に挙げられている) のために必要な建物、施設、機械と労働者等の配置及び需要予測などの全般的な計画タスクを担うプログラムである。なお、SLPは必ずしも物理的な身体を持つロボットである必要はない。

パート3では、現在の人工知能には困難な問題、代表的な7つが取り上げられる。その7つは、本当の知覚、本当の物体操作、本を読むこと、診断と修繕、人間とロボットの行動の地図上での関連付け、プログラムを書いたりデバッグすること、人間との絆である。

パート4では、直近で目指すべき目標が4つ挙げられる。すなわち、2歳児の物体認識能力、4歳児の言語理解能力、6歳児の物体操作能力、8歳児の社会性理解である。

# 本文

1. [汎用人工知能研究の歴史](https://qiita.com/ryoen/items/f59a8038440a2eec4d0d)

2. [チューリングテストを超えて](https://qiita.com/ryoen/items/6a18b8e6161bdbf2908f)

3. [人工知能には(まだ)できない7つのこと](https://qiita.com/ryoen/items/3ce8f99076f4018ad84e)

4. [汎用人工知能実現のために今やるべきこと](https://qiita.com/ryoen/items/c948fc193f73feb4ba1e)