OmniAICreator/Qiita-1.07M huggingface dataset:
[iOS] ビューをドラッグして動かす

以下のように、ボタンをタップしてビューを追加し、それをドラッグして動かせるようにします。

![drag.gif](https://qiita-image-store.s3.amazonaws.com/0/81715/43421785-4eed-e129-5b35-3048b4058c27.gif)

## 実装方法
以下のように役割を分けて実装します。

- `ViewController`: ビューを追加するボタンを提供する
- `MainView`: ビューをドラッグして移動させる処理を行う

### ViewController
ViewControllerでは、ツールバーの設置とボタンタップ時にビューを追加する処理を実装します。
StoryBoardにて、このViewControllerのルートビューの型を`MainView`に設定しています。

```swift
import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        setup()
    }

    private func setup() {
        navigationController?.isNavigationBarHidden = true
        navigationController?.isToolbarHidden = false

        let addButton = UIBarButtonItem(
            barButtonSystemItem: .add,
            target: self,
            action: #selector(addView))
        toolbarItems = [
            .init(barButtonSystemItem: .flexibleSpace, target: nil, action: nil),
            addButton,
            .init(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)]
    }

    @objc func addView() {
        let v = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
        v.backgroundColor = .black
        let mainView = view as! MainView
        mainView.addSubview(v)
    }
}
```

### MainView
ビューをドラッグして移動させる処理はこちらのクラスで実装しています。

```swift
import UIKit

class MainView: UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }

    private func setup() {
        backgroundColor = .lightGray
    }

    override func addSubview(_ view: UIView) {
        super.addSubview(view)
        view.center = center
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        // [1]
        guard let touch = touches.first, let view = touch.view else { return }

        // [2]
        if view != self {
            view.center = touch.location(in: self)
        }
    }
}
```

メインとなる実装は`touchesMoved(_:with:)`メソッドです。
このメソッドは`MainView`上にあるビューをタッチしたまま動かしたときに呼ばれます。

**[1]**
タッチ操作に関する情報を保持するUITouchクラスのインスタンスを取得します。
デフォルトではインスタンスは1つだけ格納されています。
`isMultipleTouchEnabled`を`true`にすると複数タッチに対応し、インスタンスが複数格納されます。

さらに、タッチが検出されたビューを`view`プロパティから取得しています。

**[2]**
タッチが検出されたビューが自分自身でないことを確認します。
ドラッグして動かしたいのはサブビューであるためです。

`location`プロパティから現在のドラッグ位置を取得することができます。
ビューの位置をこのドラッグ位置に合わせることで、指のドラッグに合わせてビューを動かすことができます。

## まとめ
ドラッグしてビューを動かす実装について紹介しました。
今回は`touchesMoved(_:with:)`だけを実装しましたが、本来であれば同じタッチ関連のメソッドである`touchesBegan(_:with:)`等の実装も合わせて行う必要があります。
これはレスポンダーチェインに関連した話ですが、今回の記事の範囲からは離れるのでここでは取り上げません。
詳細は公式ドキュメントをご確認ください。

## リファレンス
- [touchesMoved(_:with:)](https://developer.apple.com/documentation/uikit/uiresponder/1621107-touchesmoved)
TECH::EXPERTに通ってみた！


2回目の投稿です！

今回は現在通っているTECH::EXPERTでの学習の内容について書いていきたいとおもいます！

私は夜間コースでTECH::EXPERTに1/26〜7/26までの6ヶ月間のコースに通っています。


## 学習内容

ウェブサイトの見た目の作成から、サーバーに実装して運用できるまでを学びます！

学習項目としては、
HTML / haml / css / sass /
ruby / Ruby on Rails /github
MySQL / AWS

のようなものを学習しています。

私は基礎カリキュラムが終わり、
応用カリキュラムに入ったところです。
現在はミニアプリの自作を行なっています。

基礎カリキュラムでは、
TECH::EXPERTオリジナルのカリキュラムで、HTML / css / ruby / Ruby on Rails の学習を行います。
これらの学習完了後、応用カリキュラムに進むための試験があり合格すれば、応用カリキュラムに進むことになります！

試験の内容としては、基礎的なことばかりですがしっかり勉強しておかないと受かりません、、w
私は入学前にプロゲートで予習はしていたものの、カリキュラムを何度も繰り返し、合格しました、、笑


応用カリキュラムに入ると、
haml / sass / JavaScript を使用した見た目の実装やgithubを使った開発の学習、AWSへの実装を行なっていきます。

また、上記学習だけでなく自作でアプリを作ったり実際の開発現場を想定した学習も始まります。

実際にコードを書く時の決まりや（インデントの入れ方、クラス名、変数名のつけかたなど）
というところまでが学習内容に含まれているので、現場でどのように開発しているかが想像できます！



## 教室の雰囲気

私は大阪の心斎橋校で学習しています。
休日は教室がほぼ満員になります。

自分と同じように考えている人が、こんなにたくさんいるんだと思うと心強いですね笑

メンターの方は、わからないところがあればすぐに教えてくれます。


最終課題ではチーム開発を行うのですが、
そのチームはキックオフの時に結成するので、基礎学習のときからメンバーと近況を話し合ったり、教えあったりしながら学習できます！


## 最後に
いかがだったでしょうか？
最後まで読んでいただきありがとうございます！
ブログを書くということ自体、10年ぶりくらいのため文章が読みにくかったかもしれません。

今同じように悩んで、TECH::EXPERTに入学しようか迷っている人の参考になれば幸いです！


次回は、今作っている自作ミニアプリについて投稿したいとおもいます。

今週ミニアプリの発表会があるので、頑張って作成しています、、笑

では、今回はこれで！
Ansibleのwin_chocolateyでエラー発生した時の対処方法

## はじめに

Windowsでソフトウェアをインストールする際にchocolateyって便利ですよね！
そもそもchocolateyって何よ？って方もいると思うので簡単に説明すると、Windows用のパッケージ管理ソフトで、ソフトウェアの依存関係なども含めてインストール・更新をよしなにしてくれます。
素敵ですね！

AnsibleでWindowsサーバに対してソフトウェアのインストールするときも `win_chocolatey` モジュールは便利です。

ただ、最近chocolateyをインストールして、openjdkも合わせてインストールしようとしたらエラーが発生し、ハマったので忘れないうちに以下に事象と解決策を書きたいと思います。

## 構成について

GCP環境でAnsible Server と Windows Server の2台構成です。

### Ansible Server

OS: CentOS 7
Ansible: 2.7.9

### Windows Server

OS: Windows Server 2012 R2 Datacenter
chocolatey: 0.10.13


## Ansible実行時にエラー発生

Ansible実行時に以下のエラー（抜粋）が発生しました。

```bash
TASK [chocolatey : Install Chocolatey] **************************************************************
changed: [xxx.xxx.xxx.xxx]

TASK [openjdk : Install openjdk] ************************************************************************
fatal: [xxx.xxx.xxx.xxx]: FAILED! => {
    "changed": false,
    "command": "C:\\ProgramData\\chocolatey\\bin\\choco.exe list --local-only --exact --limit-output openjdk",
    "msg": "Error checking installation status for the package 'openjdk'",
    "rc": 2,
    "stderr": "",
    "stderr_lines": [],
    "stdout": "",
    "stdout_lines": []
}
```

## 対処方法

最新のchocolateyをインストールすることで発生したかたちですが、chocolateyをインストールする際に終了コードの無効化の設定を行うことでエラーを回避することができます。
今まで正常に動いてたのに、急に動かなくなった場合のあるあるですね。。（そもそも最新版を入れry）

```yml

---
- name: install Chocolatey
  win_chocolatey:
    name: chocolatey
    state: present

### これを追加する
- name: disable enhanced exit codes
  win_chocolatey_feature:
    name: useEnhancedExitCodes
    state: disabled

- name: Install openjdk
  win_chocolatey:
    name: openjdk
    state: present
```

## さいごに

`win_chocolatey` モジュールを使用している方へ少しでもお役に立てれば幸いです！

## 参考にしたサイト

https://github.com/ansible/ansible/issues/53860
IntelliJ IDEAでKotlinを始めてHello Worldする

本稿ではIntelliJ IDEAでKotlinのプロジェクトを作り、Hello Worldするまでの流れを解説する。


## 事前準備


* 事前にインストールが必要なもの
    * [IntelliJ IDEA] (僕のはIntelliJ IDEA Ultimate 2018.3)
    * JDK 1.6以上 (僕は[Homebrewでインストールした]ので、AdpotOpenJDK 11が入った)
* インストール不要なもの
    * Kotlin (IntelliJ IDEAに内蔵されているため不要)

[IntelliJ IDEA]: https://www.jetbrains.com/idea/download/index.html
[Homebrewでインストールした]: https://qiita.com/suin/items/a898618eb542c77cc53b

JDKが入っていることを確認:

```
$ java -version
openjdk version "11.0.2" 2019-01-15
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.2+9)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.2+9, mixed mode)
```

## IntelliJ IDEAでKotlinを始める

「Create New Project」を押す。

<img width="777" alt="Welcome_to_IntelliJ_IDEA.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/7ff6f416-b7f4-5f2d-696c-680af581d07b.png">

* 「Java」モジュールを選択する。
* 「Project SDK」でインストールしたバージョンのSDKを選択する。(_僕の場合はOpenJDK 11なので「11」を選択。もしここに選択肢がない場合は、後述する`java_home`コマンドでJAVA\_HOMEのパスを調べたのち、「New」でそのHomeディレクトリを選択する。_)
* 「Kotlin/JVM」にチェックを入れる。

<img width="809" alt="New_Project.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/9dcead5d-5c2b-3009-f1bb-bb473ebff1ea.png">

SDKが見つからない場合は、下記コマンドでSDKのありかを探そう。

```
/usr/libexec/java_home -V
Matching Java Virtual Machines (2):
    11.0.2, x86_64:	"OpenJDK 11.0.2"	/Library/Java/JavaVirtualMachines/adoptopenjdk-11.0.2.jdk/Contents/Home
    1.8.0_201, x86_64:	"Java SE 8"	/Library/Java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home
```

プロジェクト名を決める。

<img width="809" alt="New_Project.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/f93bc4a8-b333-6f31-2ca0-8b5518e9f9e0.png">

これでプロジェクトディレクトリが生成される。

## Hello Worldするプログラムを作る

Kotlinのファイルをひとつ作りたいので、プロジェクトツリービューのsrcフォルダを右クリックして、「New」→「Kotlin File/Class」を選ぶ。

<img width="874" alt="Screen_Shot_2019-03-26_at_11_44_38.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/59034c01-5c79-9cb0-1cf1-8e206e4fab2c.png">

ファイル名を決める。(ここではappにします。)

<img width="365" alt="Screenshot_2019_03_26_11_48.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/30fd5cbd-0cc9-8f7c-696c-d9dc248eb12b.png">

src/app.ktを開き、Hello Worldするコードを書く。

<img width="576" alt="Screenshot_2019_03_26_11_56.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/432767e4-4986-febf-7e85-6df5a1bd6e1e.png">

```kotlin:app.kt
fun main() {
    println("Hello World!")
}
```

1行目の「▶」をクリックし、「Run 'AppKt'」をクリックすると、このコードが実行される。

<img width="327" alt="Screen Shot 2019-03-26 at 12.38.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/a967e142-adb6-6753-da58-47ecfe9510cc.png">

問題なければRunウィンドウに実行結果が表示される。

<img width="717" alt="HelloWorld___Volumes_dev_HelloWorld__-_____src_app_kt__HelloWorld_.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/7f566e56-18f8-d2d7-f361-c8549ddc9f3f.png">


## 元ネタ

* [Getting Started with IntelliJ IDEA - Kotlin Programming Language](https://kotlinlang.org/docs/tutorials/getting-started.html)
Handsontableでセルを選択したときに発生するスクロールを抑制する

https://handsontable.com/docs/5.0.2/Hooks.html#event:afterSelection
のexampleを実装する。

`afterSelection`のコールバックで`preventScrolling.value = true`するとスクロールされなくなる。
なんだこれ…

```
new Handsontable(element, {
  afterSelection: (row, column, row2, column2, preventScrolling, selectionLayerLevel) => {
    // setting if prevent scrolling after selection
    preventScrolling.value = true;
  }
})
```
Haskellの時間系ライブラリ time が提供する型

Haskellで時間を扱うためのライブラリといえば[`time`](http://hackage.haskell.org/package/time-1.9.2)がデファクトスタンダードでしょう。しかし時間に関係する概念はとても多く（そもそも時間という概念が複雑なのでいたしたかないところはあるかも知れませんが）、初見だとライブラリをどのように扱ったら良いかわからないかも知れません。この記事では `time-1.8.0.4` が提供する型とその間の関係を簡単にまとめていきます。

## `time`が提供する型
![relations.png](https://qiita-image-store.s3.amazonaws.com/0/17134/41944a95-cd9e-a187-4a2e-697428a18c14.png)

※空白○から伸びる関数は引数を取らない関数（つまり値）
※先端が◇の矢印はIOを伴う関数

### ロケーションに依存しない時間を表す型
#### `UTCTime`
[協定世界時（UTC）](https://ja.wikipedia.org/wiki/%E5%8D%94%E5%AE%9A%E4%B8%96%E7%95%8C%E6%99%82)を表す型です。定義は

```hs
data UTCTime = UTCTime
  { utctDay     :: Day
  , utctDayTime :: DiffTime
  }
```

となっており、経過日数`utctDay`（詳細は後述の`Day`を参照）と一日の中での経過秒`utctDayTime`を保持しています。`DiffTime`型は閏秒まで考慮した時間の長さを表す型で、$10^{-12}$秒の精度があります。

```hs
getCurrentTime :: IO UTCTime
```

`getCurrentTime`を使うと現在時刻を表す`UTCTime`の値が簡単に手に入ります。ただしUTCなので日本時間ではありません。タイムゾーンの情報も含んだ時間を取得したい場合は後述する`getZonedTime`を使用してください。

#### `NominalDiffTime`
UTCで測った時間の長さです。$10^{-12}$秒の精度があり、`DiffTime`と違って閏秒は無視されます。`diffUTCTime`を使って`UTCTime`を引き算した結果の型だったり、`addUTCTime`を使って`UTCTime`に足すことで`UTCTime`を変化させることができたりします。

`DiffTime`や`NominalDiffTime`の値を生成する時は[`duration`](https://hackage.haskell.org/package/duration)というライブラリが便利です。これはTemplate Haskellを使って直感的な形で時間を記述できるライブラリで、例えば`[µs| 1s |]`と書けば1秒をマイクロ秒に換算した時の値を表すことができます。詳細は以下の記事を参照してみてください。
[Template Haskell でいい感じに時間の長さを書けるライブラリ duration を作った - ryota-ka's blog](https://ryota-ka.hatenablog.com/entry/2018/06/09/210456)

### 時間と期間に関連する型
#### `Day`
[修正ユリウス通日](https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E9%80%9A%E6%97%A5#%E4%BF%AE%E6%AD%A3%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E6%97%A5%EF%BC%88MJD%EF%BC%89)を表す型で、1858年11月17日からの経過日数が保持されています。

```hs
newtype Day = ModifiedJulianDay { toModifiedJulianDay :: Integer }
```

#### `TimeOfDay`
一日の中の経過時間（時間・分・秒）を表す型です。

```hs
data TimeOfDay = TimeOfDay
  { todHour :: Int  -- range 0 - 23
  , todMin  :: Int  -- range 0 - 59
  , todSec  :: Pico -- 0 <= 'todSec' < 61
  }
```

`Pico`は$10^{-12}$精度の数を表す型で、`todSec`が60を超える可能性があるのは閏秒の存在があるからです。

#### `LocalTime`
現地時間を表す型です。場所によって変わる時間なので`UTCTime`とも違いますがタイムゾーンの情報は持っていません。

```hs
data LocalTime = LocalTime
  { localDay       :: Day
  , localTimeOfDay :: TimeOfDay
  }
```

日付`localDay`とその日における時間`localTimeOfDay`の情報を持っています。

#### `TimeZone`
タイムゾーンを表す型でUTCからのズレを保持しています。

```hs
data TimeZone = TimeZone
  { timeZoneMinutes    :: Int
  , timeZoneSummerOnly :: Bool
  , timeZoneName       :: String
  }
```

`getCurrentTimeZone` という関数を使用することで現在のシステムに設定されているタイムゾーンを取得することができます。

```hs
getCurrentTimeZone :: IO TimeZone
```

#### `ZonedTime`
タイムゾーンの情報を持った現地時間を表す型です。

```hs
data ZonedTime = ZonedTime
  { zonedTimeToLocalTime :: LocalTime
  , zonedTimeZone        :: TimeZone
  }
```

`getZonedTime` という関数を使用することで現在時刻を表す`ZonedTime`の値を取得することができます。

```hs
getZonedTime :: IO ZonedTime
```

## おわりに
timeに含まれる型について非常に簡単に説明してみました。より詳細な使い方に関しては次の記事が分かりやすいと思います。[time パッケージの使い方](https://haskell.e-bigmoon.com/posts/2018/09-17-time-package.html)
timeを使うハードルが少しでも低くなれば幸いです :relaxed:
「あー、あのブランチどのPullRequestだっけー？」をワンライナーで調べる

たまにあるよね。

# 出来上がったものがこちら

※見やすさのために3行に分けてます

```bash
curl -H "Authorization: token OAUTH-TOKEN" https://api.github.com/repos/:owner/:repo/pulls \
  | jq -r '.[]|{ url: .html_url, into: .base.ref, from: .head.ref }|@text' \
  | grep my_branch
```

## 使い方
- `OAUTH-TOKEN` に Github の `アクセストークン` を設定してね
    - https://qiita.com/kz800/items/497ec70bff3e555dacd0
    - public なリポジトリの場合は Authorization ヘッダなしでもOKだよ
- `:owner` と `:repo` に Github の `オーナー` と `リポジトリ` を入れてね
- `my_branch` に探したい `ブランチ名` を入れてね

## 例

```bash
$ curl https://api.github.com/repos/facebook/react/pulls \
  | jq -r '.[]|{ url: .html_url, into: .base.ref, from: .head.ref }|@text' \
  | grep coverage

{"url":"https://github.com/facebook/react/pull/15159","into":"master","from":"increase-test-coverage"}
{"url":"https://github.com/facebook/react/pull/15130","into":"master","from":"test/eslint-deps-coverage"}
```

## 応用のアイディア
- jq のクエリを変えればいろいろ柔軟に対応できるよ。
    - `.base.ref`, `.head.ref` のかわりに `.base.label`, `.head.label` を使うと、fork元も表示されたり。
- https://api.github.com/repos/:owner/:repo/pulls?state=closed とすればクローズされたPRも見れるのでAPIドキュメントを参照すること。

## 参考
https://developer.github.com/v3/#authentication
https://developer.github.com/v3/pulls/#list-pull-requests
https://stedolan.github.io/jq/manual/

# 別解
```bash
curl "https://api.github.com/repos/facebook/react/pulls?state=closed&head=Jessidhia:useref-warning" \
  | jq -r '.[]|{ url: .html_url, into: .base.label, from: .head.label }|@text'

{"url":"https://github.com/facebook/react/pull/14894","into":"facebook:master","from":"Jessidhia:useref-warning"}
```

https://developer.github.com/v3/pulls/#list-pull-requests には、そもそも `head`, `base` に対しての検索クエリが投げられるので、検索したいブランチが1個であればこちらのほうが早い。
【Python】辞書のコンストラクタに辞書を渡すと辞書ができる

ちょい記事です。

```python
hoge = {
    'hoge': 'fuga',
    'fuga': 'piyo',
    'piyo': ['hoge', 'HOGE'],
}
fuga = dict(hoge)
```

```python
>>> hoge is fuga
False
>>> hoge['piyo'] is fuga['piyo']
True
```

こんな感じでdictのコンストラクタにdictを渡すと辞書の~~ディープ~~シャロー(3/27修正 @LouiS0616 様ありがとうざいます)コピーができますよっていう話なんですが、
それ以上に便利なのがサブクラスを使うとき

```python
import re


class redict(dict):
    """
    正規表現をkeyにvalueが取り出せるdictのサブクラス \n
    マッチするkeyが複数あった場合はその中で最も短いkeyを正とする \n
    また存在しない場合には''が返る
    """
    def __getitem__(self, key):
        shortest_key = self.GetMatchedShortestKey(key)
        return super().__getitem__(shortest_key) if shortest_key is not None else ''

    def GetMatchedShortestKey(self, key):
        matched_keys = []
        shortest_key = None
        for key_ in self.keys():
            match = re.match(f'^.*{re.escape(key)}.*$', key_)
            if match: matched_keys.append(match.group())
        if matched_keys:
            shortest_key = min(matched_keys, key=len)
        return shortest_key
```

dictと同じ感覚で初期化することができます。

```python
hoge = redict({
    'hoge': 'fuga',
    'fuga': 'piyo',
    'piyo': 'hoge',
})
```

```python
>>> hoge['ho']
'fuga'
>>> hoge['u']
'piyo'
>>> hoge['yo']
'hoge'
```

# 効果
ちょっと嬉しい
OSSの採用活動用適性検査をGoで作ってみて学んだこと

GoでESEPIという適性検査OSSを作りました。

詳細は以下に書いたので、この記事では技術的な話しかしません。

[github](https://github.com/aimof/esepi)
[紹介記事](https://blog.aimof.net/esepi-introduction)

## 技術的側面

* Goによるシングルバイナリ
* 試験内容と称しブラウザでアクセスさせるタイプのサーバー
* Goのhtml/templateとbootstrapでつくられた適当なフロント
* グローバル変数を直接書き換える雑な作り

## 学びリスト

* 試作品をきれいに作るのは高い技術力がいる
* Goはシングルバイナリだから配布が容易だろうと思ったが、クライアントOSから何度も実行を止められる
* ユーザビリティ難しい
* Mac持ってないとMacの動作確認できない

### 試作品をきれいに作るのは高い技術力がいる

漠然としたアイデアをメモするようにコードを書いたので、非常に雑な作りになっています。プロトタイプは保守するものでもないかな、と思うので雑は雑で良いのですが、きれいなコードを書く難しさを学びました。

グローバル変数をhttpリクエストが来るたびに排他ロックなしに書き換えるとかいうなかなかに危ない作りをしています。

（プロダクションコードでこれやったらダメだけどね）

### Goはシングルバイナリだから配布が容易だろうと思ったが、クライアントOSから何度も実行を止められる

シングルバイナリがいいよね、って理由でGoを選んだのですが、Windowsで試したところ「危ないから実行するな」と幾度となくお達しをいただきました

実際、GitHubのリリースって、実行可能ファイルを直接アップロードできるのでそれは本当にソースコードと同じものなのか？という疑問はつねにつきまとうかと思います。

### ユーザビリティ難しい

「ブラウザで`localhost:8880`を開いてください」みたいな指示を試験と称して混ぜました。
実際のところ試験として導入するためには様々なハードルがあります。
詳しい人がいないと試験できないんじゃないかな……

### Mac持ってないとMacの動作確認できない

当たり前だけど鬱陶しいですね、Macの制約。
Flutterアプリを作ったときにiOS用のビルドできなかった思い出が先行している気もします。

## まとめ

アプリケーションを公開するのは学びが多くて楽しいですね。
アジャイルな開発者であるためのTips

# はじめに

私がスクラムのプロジェクトに開発者として参画してアジャイルコーチの指導を受けたり、いくつかのアジャイル研修を受講したりする中で、参考になったことをTips化してみました。

結果としては、[アジャイル宣言の背後にある原則](http://agilemanifesto.org/iso/ja/principles.html)を「開発者視点で」具象化した内容になっていると思います。

私個人はスクラムしか経験がないので、スクラムをベースとした内容になっています。
この記事の内容はあくまで私個人の見解であり、所属企業における立場、戦略、意見を代表するものではありません。

# 「仕掛り中」のストーリーを少なくする

- スプリント途中で進捗を見た時、仕掛り中のストーリーばかりでは進捗が見えにくく、プロダクトオーナーは不安になります。
- 不安になると指示を出したくなります。→信頼関係が破綻してスクラムが瓦解します。
- ストーリー単位に担当を分けると、どれもこれも仕掛り中になってしまいます。
- 1つのストーリーをサブタスクに分解し、優先順位の高いストーリーから、なるべく多い人数で片付けていく方がベターです。

**a) こっち↓よりも…**

| ストーリー | 担当 | 状態 |
| :-: | :-: | :-: |
| **ストーリー#1** | A | **仕掛** |
| **ストーリー#2** | B | **仕掛** |
| **ストーリー#3** | C | **仕掛** |

**b) こっち↓の方が価値を早く生み出しており、プロダクトオーナーからの信頼を得やすい。**

| ストーリー | サブタスク | 担当 | 状態 |
| :-: | :-: | :-: | :-: |
| *ストーリー#1* | 1-1 | A | *完了* |
|             | 1-2 | B | *完了* |
|             | 1-3 | C | *完了* |
| **ストーリー#2** | 2-1 | A | **仕掛** |
|             | 2-2 | B | **仕掛** |
|             | 2-3 | C | **仕掛** |
| ストーリー#3 | 3-1 | A | 未 |
|             | 3-2 | B | 未 |

# 様々な分野のスキルを習得する

- 上のように、価値を素早く生み出すためには、「○○はAさんしかできない」というチーム構成は不向きです。
- 技術的にフルスタックであることはもちろん、デザインやテスティングに関する知識も持っている方がベターです。
- プロダクトオーナーと議論したり、提案するためには業務知識も必要です。
    - 対してウォーターフォールの場合は、末端の技術者が「自分が誰のために何を作っているのか知らない」という状況が良くありますよね。
- 各開発者の得意分野はあれど、他のどんな分野の業務も「手伝える」レベルを目指すことが重要です。

# 技術的負債と戦う

- 技術的負債は、借金と同じで、長く放置すると利息がついて返済しづらくなります。こまめに返すべきです。
- こまめに、ためらわず、リファクタリングを行うべきです。
    - ウォーターフォール脳のエンジニアには、これが案外難しいと思います。
    - 「既存ロジックをなるべく触らずに拡張しよう」という考えは捨て去るべきです。それが、多すぎる引数や、複雑すぎる条件分岐を生み出しがちです。
- リグレッションテストを自動化することは必須と言って良いでしょう。
- 変更に強くあるためには、アーキテクチャーが重要です。
    - モノシリックよりもマイクロサービスを。

# バグも仕様ミスも速やかに直す

- 私のスクラム実践時の大反省点なのですが、新しいストーリーの開発に意識を奪われて、バグ修正が後回しになりがちでした。
- [アジャイルソフトウェア開発宣言](https://agilemanifesto.org/iso/ja/manifesto.html)に『（包括的なドキュメントよりも）動くソフトウェアを』とありますが、[英語版](https://agilemanifesto.org/)では"*Working software*"となっています。英語の"Work"には「期待通りにやりとげる」というニュアンスがあります。
- 日本で開発者が「動く」というと「とりあえず動いてる」みたいなニュアンスがある気がしますが、アジャイルでは、インクリメントは常時「期待通りに機能する」状態にする必要があります。
- 要するに、仕様ミスだろうが単純バグであろうが速やかに修正しなければなりません。期待通りに機能しないソフトウェアには価値がないわけですから。

# デイリースクラムでコミットメントを宣言する

- デイリースクラムはスクラムマスターに進捗報告をする場ではありません。
- 開発者は「チームに」「ありのままに」報告します。
- 私が個人的に良いと思う報告の仕方
    - 毎日、「私は今日、これを終わらせます」と宣言する。
    - そして翌日、前日の宣言通りの状態であれば問題なし。
    - 宣言通りに終わらなかったとしたら、その理由を正直に言う。
- 問題・課題は、チームが解決するのです。スクラムマスターは「こぼれ球」を拾ってくれたら良い。
- スクラムマスターが「で、どうやってキャッチアップするの？」とか言い出したら、スクラムチームの"死"だと思います。
- コミットメントにバッファを含めないことも、大事だと思います。

# 残業・休日出勤を前提にしない

- 遅れを残業・休日出勤でキャッチアップしてしまうことで、アジャイルで最も重要な「改善」をしなくなるから、です。
- もちろん、パフォーマンスが低下するとか、ベロシティを正しく計測できなくなるという理由もありますが、私には上の説明の方が納得感がありました。

# おわりに

良いアジャイル開発者であるためには、向上心と学習意欲を持ち続けることが必要で、シンドイ面もあります…

でも私は、アジャイルがもっと普及すれば、ソフトウェア開発はもっとクリエイティブでエキサイティングな仕事になると考えていますので、今後も精進したいと思います！
韓国で制作したWebサイトの日本語がMacで中華フォント化する原因

#中華フォントとは
**韓国**で制作されたWebサイトの日本語が、**Mac**のどのブラウザ（Chrome, Safari, Firefox）で見ても、以下のような**違和感のあるフォント**になっている現象に遭遇。
<img width="110" alt="text.png" src="https://qiita-image-store.s3.amazonaws.com/0/221915/53f821b3-9ee3-4a9e-266c-06447440b60c.png">
このような「**違和感のあるフォント化**」のことを、「[**中華フォント現象**](https://qiita.com/usagimaru/items/46c27c42e862fb8aba7e#%E4%B8%AD%E8%8F%AF%E3%83%95%E3%82%A9%E3%83%B3%E3%83%88%E7%8F%BE%E8%B1%A1%E3%81%A8%E3%81%AF)」と呼ぶようです。

#中華フォント現象の原因
原因はフォントに「`AppleGothic`」が適用されたことにあります。
韓国では**CSS**の`font-family`に「`AppleGothic`」を指定するケースがあるようで、ちなみに[アップル韓国](https://www.apple.com/kr/)のフォント指定は、

```css
font-family: "SF Pro KR","SF Pro Text","SF Pro Icons","Apple Gothic","HY Gulim","MalgunGothic","HY Dotum","Lexi Gulim","Helvetica Neue","Helvetica","Arial",sans-serif;
```

でした。

このように通常は**第2候補以降**に指定されることが多いと思いますが、なんらかの原因で**上位候補のフォントが適用されない場合**など注意が必要だと思いました。
Emacsからカレントディレクトリでターミナルアプリを開く

私の場合、Emacsからターミナルを使うときは基本eshellを使うようにしています。ただ、ごくたまに別窓でターミナルアプリを立ち上げてemacsと併行して作業したいときがありますので以下のように設定しておくと、Emacsのカレントバファーからディレクトリを取得して開いてくれるので便利です。

当然ながらコマンドラインでアプリが起動できるようにbashなりzshなりで設定しておくことが前提です。

## macのiterm.appを起動させる設定 ##

``` emacs-lisp
;; Launch iterm.app with Current directry
(defun my:iterm-app ()
  "Open iterm.app with current dir."
  (interactive)
  (let ((dir default-directory))
    (shell-command (concat "open -a iterm.app " dir))))
```
Herokuでの変更が反映されない

heroku初心者です。
変更を試みたところ変更が反映されません。

作業
①git add sp.html
②git commit -m "良い変更"
を行ったところ


---------
On branch master
Changes not staged for commit:
	deleted:    zenkaku.png

no changes added to commit
---------
という表示が出て変更できませんでした。

大変お手数ですがアドバイスいただけると幸いです。

何卒よろしくお願いします。
【GitHub】issueとプルリクを使ってテンポよく開発するやり方

前提
github アカウント持ってる
git インストール済み
git についてある程度知ってる（add, commit, push, branch, checkout, merge）

---

issue を作る
githubのweb上で作る

issue の番号に対応した branch を作る
git checkout -b foobar#1

push する
git push origin foobar#1

foobar#1 のブランチで作業
適宜 add や commit する

作業が終わったら push する
git push origin foobar#1

プルリク送る
githubのweb上で送る

merge する
githubのweb上

checkout する
git checkout master

pull する
git pull

---

目的意識を忘れずに開発できる
やったことが可視化されるのでモチベ維持になる
一般的なチーム開発手法（らしい）ので、その練習になる
ROSを用いた自作ロボット制作

# はじめに
私は東京電機大学でロボットを個人的に制作しています。先日、かわさきロボット競技大会第2回テクノ・クエスト部門に参加し、以下の画像のロボット”遠隔しゅた～る・お利口”で出場しました。
<img width="700" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.amazonaws.com/0/384152/47c6e92d-3eef-a871-ce09-e7ba55ce7e50.jpeg">

ここでは本機体で使用した技術を数回に分けて説明します。同様のロボットを制作したい方の参考になればと思います（あと備忘録）.

# 概要
本機体のシステムの概要は以下の図のようになります。

<img width="700" alt="システム概要.png" src="https://qiita-image-store.s3.amazonaws.com/0/384152/c33227a0-5ce7-4f17-e134-1268d7640e31.png">

ノートPCのゲストOS：Ubuntu 16.04 LTS上でROS kineticを起動しロボットを操作します。ロボットにはOS:Ubuntu MATE 16.04.2で動作するRaspberryPi3 ModelBを搭載し、同じくROSを使って機体の制御をします。無線LANルータを経由してWi-Fi通信で情報をやり取りし、ロボットのUSBカメラから映像を受信して、PS3用ジョイスティックで機体の操作情報を送信します。ロボットの各アクチュエータの制御はRaspberryPiのGPIOピンから行います。

# 目次
1) [ROSを用いた自作ロボット制作 -開発環境-](https://qiita.com/STAHL_S6K/items/de56c3fc6864867c5436)
ーーー随時追加しますーーー
dockerコマンド

# dockerの停止 (docker for windows)
hyper-vマネージャを起動し"MobyLinuxVM"を選択
"右クリック" - "停止"

# docker image配置場所の変更
dockerを停止した状態で、hyper-vマネージャを起動し"MobyLinuxVM"を選択
"右クリック"-"設定"で"MobyLinuxVM"の設定画面を開く
"ハードドライブ"にある"仮想ハードディスク"のパスを変更する
容量可変/最大容量を設定する

# dockerの起動
hyper-vマネージャを起動し"MobyLinuxVM"を選択
"右クリック" - "起動"
node.js で曲を奏でる

ネタ元: [countercomplex: Algorithmic symphonies from one line of code -- how and why?](http://countercomplex.blogspot.com/2011/10/algorithmic-symphonies-from-one-line-of.html)

Mac の場合 SoX をインストールする必要がある。

```
brew install sox
```

以下のコードを用意する

```music.js
const { Readable } = require("stream");

class AudioReadable extends Readable {
  constructor(options) {
    super(options);
    this.t = 0;
  }

  _read() {
    this.t++;
    const t = this.t;

    const v = t * ((t>>12|t>>8)&63&t>>4);

    this.push(Buffer.alloc(2, v));
  }
}

new AudioReadable().pipe(process.stdout);
```

そして実行

```
node music.js | sox -traw -r 8k -c 1 -e unsigned-integer -b 16 - -d
```

かっこいい
VBAからchromeスクレイピング

#VBAでchromeをスクレイピングしよう。

かつてIEのスクレイピングをして、価格ドットコムから情報を取得し、エクセルにランキング表を作る。ということをしていましたが、やはり今はやりのchromeでやりたいなーと思い挑戦してみました。

IEのスクレイピングだと、VBAの参照設定でできるのですがchromeの場合は簡単にはいきませんでした。調べてみるとSeleniumBasicというライブラリをインストールして使うことが有効とわかりましたので、SeleniumBasicを用いてchromeスクレイピングしてみようと思います。

##SeleniumBasicのインストール方法
以下の記事が役に立ちましたので紹介します。
https://lil.la/technology/technology-memo/post-3436

上記記事で
`zipを解答すると、 chromedriver.exe が１ファイルあると思います。
このファイルを、Selenium Basicをインストールしたフォルダにコピー＆上書きします。`

という説明文があるのですが、解凍した先のフォルダに**chromedriver.exe**をコピー&ペーストしますのでご注意ください。

インストールができたらエクセルを開いて
環境の設定をします。
ツール　→　参照設定で以下のダイアログボックスを表示します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/257191/75ea0d27-d4ad-59ce-8327-63b1d3237f63.png)

`Selenium Type Library`
を探してチェックしてください。
これでChromeDriverを使うことができます。

##早速スクレイピングをしよう
準備ができたら、早速chromeスクレイピングをしていきましょう。
chromeをVBAで扱うには以下のコードをメインモジュールに記述します。

```vb

Dim driver As New ChromeDriver
 'ChromeDriverのインスタンスを生成しDriver変数に格納
　'このDriverを使っていろいろ操作します。

driver.Start "chrome"
    driver.Get "開きたいサイトのURL"
```

たったこれだけで指定のサイトを開くことができます！

しかし、中には実行後このようなページに行ってしまう人が多いのではないでしょうか。。。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257191/43cc1a63-e92c-7136-60ad-00bf2b4ef6f4.png)

。。。ログインしなければいけないようです。

しかし、これもVBAからできてしまいます。
他のサイトのログイン処理も同様に可能なのでログインの処理をしてみます。

```vb

driver.FindElementById("i0116").SendKeys "あなたのメールアドレス"
    driver.FindElementById("idSIButton9").Click
    driver.FindElementById("i0118").SendKeys "あなたのパスワード"
    driver.Wait 1500
    driver.FindElementById("idSIButton9").Click
    driver.Wait 1500
    driver.FindElementById("idSIButton9").Click

```

コードの解説

`driver.FindElementById("i0116").SendKeys "あなたのメールアドレス"`
※解説
html上のid名を探します。i0116とうID名がついていたので取得します。
SendKeysは送信ボタンを押すというスクレイピング独自のコマンドです。　
これでinputタグに入力されたあなたのメールアドレスが送信されるようになります。
ただしまだ送信ボタンを押しているわけではありません。

上記はパスワードも同様ですので割愛します。

次に送信ボタンを押します。

`driver.FindElementById("idSIButton9").Click`


これで送信ボタンが押せます。
送信ボタンもHTMLのid名を探しています。
もし、他のサイトでボタンがid名ではなくclass名やbuttonタグなどであればFindElementsByClassなどで取得します。

.Clickがボタンを「押す」をという処理を実行してくれます。

`driver.Wait 1500`

これは待ち時間を記述しています。
これがないとchromeがすぐに画面遷移をしてしまい
文字の入力やボタンの押下処理がうまくいきません。
だいたい1秒（1000）以上は待ったほうがスムーズです。


パスワードまで送信できたら、ほぼ完了です。
最後にもう一度ボタンを押す処理があるので、記述しています。

いかがでしょうか。

chromeスクレイピングがVBAからできました。

次は、WEB上の情報をエクセルに転記するという処理をやってみたいと思います。
yumモジュールを使わずrpmでパッケージ追加したい


何らかの事情でyumモジュールが使えない
もしくはshellモジュールでrpmで入れる必要がある人向け

```yaml
    - name: package-x.x.x.xxxのインストールチェック
      shell: rpm -qa | grep package-x.x.x.xxx
      register: rpm
      failed_when: rpm.rc >= 2
```

```yaml
    - name: package-x.x.x.xxx.rpmのインストール
      shell: rpm -ivh package-x.x.x.xxx.rpm
      when: rpm.stdout.find('package-x.x.x.xxx') == -1
```

他にもやり方はあるだろうけどとりあえずはこれで
Seleniumで待機処理するお話

Seleniumで待機処理するお話

## Webページを開く
```python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

#ここではEdgeを使っています
driver = webdriver.Edge(executable_path='C:\\...\\MicrosoftWebDriver.exe')
driver.get('https://www.yahoo.co.jp/')
```

## Webページ上のコンテンツを基準にした待機例
```python
# ページ上のすべての要素が読み込まれるまで待機（15秒でタイムアウト判定）
WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)

# ID指定したページ上の要素が読み込まれるまで待機（15秒でタイムアウト判定）
WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.ID, 'ID名')))

# CLASS名指定したページ上の要素が読み込まれるまで待機（15秒でタイムアウト判定）
WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.CLASS_NAME, 'CLASS名')))

# try/catch例
try:
    WebDriverWait(driver, 15).until(EC.presence_of_all_elements_located)
except TimeoutException as te:
    ### 例外処理
```

## 時間指定の待機例
```python
# 一度設定すると find_element 等の処理時に、
# 要素が見つかるまで指定時間繰り返し探索するようになります。
driver.implicitly_wait(10) # 秒
targetElement = driver.find_element_by_id("ID名")
```

## よくある Stale Element Reference Exception
この例外は、Webページ上のロードが不完全な場合に、Seleniumで要素を触りにいった時に発生します。基本的には、上記の待機処理で試行錯誤するお話になりますが、Seleniumで捉えきれない動的なコンテンツや要素である場合には、HTMLのコードをSeleniumよりに修正するか、最終手段として`time.sleep()`を使うかも検討しています。

## 参考
- [PythonでSeleniumを使ってスクレイピング (基礎)](https://qiita.com/kinpira/items/383b0fbee6bf229ea03d)
- [5. 待機 — Selenium Python Bindings 2 ドキュメント](https://kurozumi.github.io/selenium-python/waits.html)
vuetifyのgridsystemのテストの為作った簡単なテストボタン

#プロジェクト作成中に画面のgridを計る時に使う簡単なソースです。
```vuejs:grid.vue
<template>
 <v-container>
  <v-layout>
   <v-btn class="hidden-lg-and-down">
　　　xl
　　　<!-- このボタンはxlの時しか表示されません -->
   </v-btn>
   <v-btn class="hidden-md-and-down hidden-xl-only">
　　　lg
　　　<!-- このボタンはlgの時しか表示されません -->
   </v-btn>
   <v-btn class="hidden-lg-and-up hidden-sm-and-down">
　　　md
　　　<!-- このボタンはmdの時しか表示されません -->
   </v-btn>
   <v-btn class="hidden-md-and-up hidden-xs-only">
　　　sm
　　　<!-- このボタンはsmの時しか表示されません -->
   </v-btn>
   <v-btn class="hidden-sm-and-up">
　　　xs
　　　<!-- このボタンはxsの時しか表示されません -->
   </v-btn>
  </v-layout>
 </v-container>
</template>
```

以上のソースでv-layoutの中のソースをpurojectの中に貼り付けるだけで現在のウィンドーのサイズを解ると思います。
確認は以下のページでできます。
>https://codepen.io/TEAMOO24/pen/RdORaw
HomebrewでAdpotOpenJDKをインストールする

AdpotOpenJDKは[Homebrew Cask]でインストールできる。

```shell
brew cask install adoptopenjdk
```

こんなかんじでインストールされる:

```
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Updated Formulae
ffsend                                                                                    gearsystem

==> Caveats
More versions are available in the AdoptOpenJDK tap:
  https://github.com/AdoptOpenJDK/homebrew-openjdk

  brew tap adoptopenjdk/openjdk

==> Satisfying dependencies
==> Downloading https://github.com/AdoptOpenJDK/openjdk11-binaries/releases/download/jdk-11.0.2%2B9/OpenJDK11U-jdk_x64_mac_hotspot_11.0.2_9.tar.gz
Already downloaded: /Users/suin/Library/Caches/Homebrew/downloads/3c73c3d877c851df4fae9caa0e09c43740f7820435395e393c520aac1fc99d43--OpenJDK11U-jdk_x64_mac_hotspot_11.0.2_9.tar.gz
==> Verifying SHA-256 checksum for Cask 'adoptopenjdk'.
==> Installing Cask adoptopenjdk
==> Moving Generic Artifact 'jdk-11.0.2+9' to '/Library/Java/JavaVirtualMachines/adoptopenjdk-11.0.2.jdk'.
Password: 【ここにMacのパスワードを入れる】
🍺  adoptopenjdk was successfully installed!
```

[Homebrew Cask]: https://qiita.com/guitar_char/items/3aca4950bf0adcdf419d
Flutterでの開発に実機を利用していて、Error connecting to the service protocol: HttpExceptionが発生したときの対処法

Flutterで開発をしているなかで、以下のようなエラーが発生した

```
Error connecting to the service protocol: HttpException: , uri = http://127.0.0.1:1024/ws
```

これ、ほっとくと、Hot Reloadができなくなる。
Flutterで開発しているなかで、結構痛手である。

これの解決策だが、Xcodeの実機設定で対応できることが判明した。

# 解決策

1. Xcodeを開く
2. window > Devices and Simulators(Shift + Command + 2)を開く
3. 左のConnectedリストから対象端末を選択
4. connect via networkをonにする

以上だ。
よく使うgrep

変異数を数える用途で、よく使うのでメモ。

```bash
grep -v '^#' hogehoge.vcf | wc -l
```

`-v` で次に来るものを除外します。`'^#'`で、#から始まる行を指定しています。`|`により、次のコマンドにgrepの結果を渡します。`wc -l`で行数を数えます。

おしまい。
READ ONLY Fileの編集

read onlyファイルの編集に詰まったのでメモ

ファイルを開くとき

```
$ sudo vim "ファイル名"
```

編集を保存するとき

```
:w !sudo tee %
```

終了するときは

```
:q!
```

原理の詳細は[ここ](https://stackoverflow.com/questions/2600783/how-does-the-vim-write-with-sudo-trick-work)


この記事はここまで
【Unity】自分の声をテキスト化する方法【Google Cloud Speech Recognition 】

#概要
自分の喋った内容をテキスト化する機能が必要だった為、Google Cloud Speech Recognition [VR\AR\Desktop\Desktop]を使って実装。備忘録として書き残しておきます。

#Google Cloud Speech Recognitionの使い方
<img width="1158" alt="スクリーンショット 2019-03-20 16.46.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/293639/e07c756a-9cfc-5029-3f21-6c9f36912901.png">

###APIkeyの取得
このAssetを利用するにはAPIKeyが必要です。あらかじめ取得しておきましょう。
GoogleAPI利用経験があるかどうかでAPIKey取得までの流れに違いがありますが、今回は初めての方を対象としています。

(1)下記URLにアクセスし、「無料トライアル」をクリック
https://cloud.google.com/speech-to-text/

(2)利用規約に同意し、情報の記入をしてください。

(3)情報の登録に成功するとこんな感じになります。
<img width="1440" alt="スクリーンショット 2019-03-22 15.43.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/293639/adc79db8-a9ba-cd66-53bb-7ab7409ebd72.png">

(4)Cloud Speech-to-Text APIを有効にする
- 検索バーに「Speech」と入力すると出てくるので「Cloud Speech-to-Text API」をクリック。
- 「有効にする」をクリック。課金を有効にします。(無料トライアル中は料金が発生しないのでご安心ください)

(5)認証情報の作成
- 右上の「認証情報を作成する」をクリック。するとこのような画面になります。
- 使用するAPIに「Cloud Speech-to-Text API」を選択。その後指示に従って進みます。
<img width="744" alt="スクリーンショット 2019-03-22 16.59.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/293639/28e5d61d-b098-748d-9a80-b55072bc3c10.png">

(6)APIKeyの作成
- 「認証情報の作成」 -> 「APIキー」 を選択。
- お疲れ様でした、APIKeyが作成されます。

###インポートする
下記URLから購入できます。
https://assetstore.unity.com/packages/add-ons/machinelearning/google-cloud-speech-recognition-vr-ar-desktop-desktop-72625

###サンプルシーンでの動作確認

(1)サンプルシーンを開く
インポートが終了したらFrostweepGames -> GCSpeechRecognition -> Examples -> Example -> Example.unityを選択してシーンを開きます。
<img width="1440" alt="スクリーンショット 2019-03-22 10.46.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/293639/8d1c26d8-3a22-4c00-7706-356f58929550.png">

(2)設定をする
- Hierarchyにある「GCSpeechRecognition」を選択。
- Inspectorで各種設定。ここでAPIKeyを入力しないとうまく動きません。
<img width="1440" alt="スクリーンショット 2019-03-26 10.06.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/293639/df5fb1d5-71fb-9673-2474-bf6f8e4338bf.png">


(3)動作確認
Gameシーンを再生し設定をします。
- 「en_GB」をクリックすると認識する言語を設定できます。
- 「Voice Detection Enabled?」にチェックを入れると音声入力がされるたびにテキストが更新されます。

設定が完了したら「Start Record」をクリックして喋ってみましょう。
<img width="538" alt="スクリーンショット 2019-03-26 10.50.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/293639/04edcdee-c81a-61fc-fc12-d42c1a169d2f.png">

認識してくれました！


###自分のプロジェクトで使う
ドキュメントが用意されていますので読みましょう。
(FrostweepGames -> GCSpeechRecognition -> Documentationにあります。)
わからなくなったらサンプルシーンを参考にしてみると解決できると思います！
[AWS]bundle exec cap production deployのエラーでつまった話

デプロイを行う際に発生したエラーで行なったことをメモ。
同じように困った方の参考になればと。

## 環境
ruby 2.3.1
Rails 5.0.7.2
MySQL
git
unicorn
nginx
capistrano
AWS EC2

## 発生したエラー
bundle exec cap production deploy
上記コマンド実行後、下記のようなエラーが発生する

```
00:08 deploy:assets:precompile
      01 $HOME/.rbenv/bin/rbenv exec bundle exec rake assets:precompile
      01 rake aborted!
      01 ArgumentError: Missing required arguments: aws_access_key_id, 
```
環境変数が読み込まれていない？
環境変数を念の為確認したが、特に異常なし。。

## 試したこと
```
[ec2-user@ip-XXX-XX-XX-XXX chat-space]$ kill -QUIT `cat tmp/pids/unicorn.pid`
cat: tmp/pids/unicorn.pid: そのようなファイルやディレクトリはありません
kill: 使用法: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... または kill -l [sigspec]
[ec2-user@ip-XXX-XX-XX-XXX chat-space]$ ps auxwww | grep unicorn
ec2-user  7949  0.0 10.2 365852 103808 ?       Sl   00:07   0:02 unicorn master -c /var/www/chat-space/current/config/unicorn.rb -E deployment -D
ec2-user  8027  0.0 11.1 376292 112920 ?       Sl   00:07   0:21 unicorn worker[0] -c /var/www/chat-space/current/config/unicorn.rb -E deployment -D
ec2-user 23353  0.0  0.2 110532  2132 pts/1    S+   11:50   0:00 grep --color=auto unicorn
[ec2-user@ip-XXX-XX-XX-XXX chat-space]$ kill 7949
[ec2-user@ip-XXX-XX-XX-XXX chat-space]$ ps auxwww | grep unicorn
ec2-user 23355  0.0  0.2 110532  2172 pts/1    S+   11:50   0:00 grep --color=auto unicorn
[ec2-user@ip-XXX-XX-XX-XXX chat-space]$ cd
[ec2-user@ip-XXX-XX-XX-XXX ~]$ sudo service nginx restart
Stopping nginx:                                            [  OK  ]
Starting nginx:                                            [  OK  ]
[ec2-user@ip-XXX-XX-XX-XXX ~]$ sudo service mysqld restart
Stopping mysqld:                                           [  OK  ]
Starting mysqld:                                           [  OK  ]

```
結論からいうと上記で改善しました。

```
kill -QUIT `cat tmp/pids/unicorn.pid`
cat: tmp/pids/unicorn.pid: そのようなファイルやディレクトリはありません
```
上記コマンドで「そのようなファイルやディレクトリはありません」となっていたので、
unicornは停止しているという認識だったのですが、

```
[ec2-user@ip-XXX-XX-XX-XXX chat-space]$ ps auxwww | grep unicorn
ec2-user  7949  0.0 10.2 365852 103808 ?       Sl   00:07   0:02 unicorn master -c /var/www/chat-space/current/config/unicorn.rb -E deployment -D
ec2-user  8027  0.0 11.1 376292 112920 ?       Sl   00:07   0:21 unicorn worker[0] -c /var/www/chat-space/current/config/unicorn.rb -E deployment -D
ec2-user 23353  0.0  0.2 110532  2132 pts/1    S+   11:50   0:00 grep --color=auto unicorn
[ec2-user@ip-XXX-XX-XX-XXX chat-space]$ kill 7949
```
psコマンドで確認すると、処理があったのでKillコマンドで終了させています。
確認したところこういったことはあるそうです。
その後、nginxとMySQLの再起動を行なっています。

もし上記で改善しない場合、git pullとbundle installもその前に行なっていたので、
それも試してみるといいかもしれません。

何か参考になればと思います。
宜しくお願いします。
Django で Primary Key を使う時の ForeignKey の使い方

モデルで、Primary Key を使うようにした時の ForeignKey の使い方です。

1) models.py
>to_field を指定する必要があります。

```py:models.py
from django.db import models
from django.urls import reverse

class Member(models.Model):
    id_member = models.CharField(max_length=10,primary_key=True)
    name = models.CharField(max_length=20)
    year_of_birth = models.IntegerField(null=True)

    team = models.ForeignKey('Team', to_field='id_team', on_delete=models.SET_NULL, null=True)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return reverse('member-detail', args=[str(self.id_member)])

class Team(models.Model):
    id_team = models.CharField(max_length=10,primary_key=True)
    name = models.CharField(max_length=20)
    home = models.CharField(max_length=20)

    def get_absolute_url(self):
        return reverse('team-detail', args=[str(self.id_team)])

    def __str__(self):
        return f'{self.name}'
```

2) urls.py
>Primary Key を 文字列にしたので、
><slug:pk>　にする必要があります。

```urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
    path('members/', views.MemberListView.as_view(), name='members'),
    path('member/<slug:pk>', views.MemberDetailView.as_view(), name='member-detail'),
    path('teams/', views.TeamListView.as_view(), name='teams'),
    path('team/<slug:pk>', views.TeamDetailView.as_view(), name='team-detail'),
]
#
urlpatterns += [  
    path('member/create/', views.MemberCreate.as_view(), name='member_create'),
    path('member/<slug:pk>/update/', views.MemberUpdate.as_view(), name='member_update'),
    path('member/<slug:pk>/delete/', views.MemberDelete.as_view(), name='member_delete'),
]
#
```

3) データベースのテーブルは次のようになります。

member

```text
+---------------+-------------+------+-----+---------+-------+
| Field         | Type        | Null | Key | Default | Extra |
+---------------+-------------+------+-----+---------+-------+
| id_member     | varchar(10) | NO   | PRI | NULL    |       |
| name          | varchar(20) | NO   |     | NULL    |       |
| year_of_birth | int(11)     | YES  |     | NULL    |       |
| team_id       | varchar(10) | YES  | MUL | NULL    |       |
+---------------+-------------+------+-----+---------+-------+
```

team

```text
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| id_team | varchar(10) | NO   | PRI | NULL    |       |
| name    | varchar(20) | NO   |     | NULL    |       |
| home    | varchar(20) | NO   |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+
```

4) 次の環境で確認しました。

```text
$ python --version
Python 3.7.2
$ python -m django --version
2.1.7
```
Delphi IDE の便利な機能 - コード補完

Delphi のプログラムコードを書くとき、かなりこれに頼っているというのがコード補完

## コード補完ってなーに？
コードエディタ上でプログラムコードを記述するときに助けてくれる便利な機能
「ヒント」として、コードに追加できる有効な選択肢を表示し、その選択肢内の選んだ内容をコード上に補完します
![code01.png](https://qiita-image-store.s3.amazonaws.com/0/164551/0cb22f9b-94df-f1bd-a55b-5749f9b81cdd.png)

## 実際の例で
言葉ですと分かりにくいので、実際の操作で説明します

- たとえば VCL アプリケーションを作るじゃろ
- ボタンを置くじゃろ
- 置いたボタンをダブルクリックしてイベントを自動生成して、コードエディタが表示されるじゃろ
- 生成されたイベント内で Ctrl + Space を押すじゃろ
- コード補完が動くのじゃ
![code02.png](https://qiita-image-store.s3.amazonaws.com/0/164551/06cd3ce3-1934-721d-24d3-6111af3c5c71.png)

表示される「ヒント」には、ここに追加できる有効な選択肢が表示されます
今回はボタンのキャプションを変えたいから、Button1 を選び Enter キーを押すとコードに Button1 が挿入されます

次に . を入力すると、またまたコード補完が働いて、追加できる有効なプロパティやメソッドなどの選択肢が「ヒント」として表示されます
![code03.png](https://qiita-image-store.s3.amazonaws.com/0/164551/66a9adbf-6684-244b-e7a2-f6e2f5aff5d7.png)

Caption と書きたいので . の後に C と書くと「ヒント」の絞込みが行われ C から始まるものだけになり
![code04.png](https://qiita-image-store.s3.amazonaws.com/0/164551/add40be2-4aa1-cbf0-6982-a4f924002844.png)

さらに a と書くと Ca で始まるものだけになる
![code05.png](https://qiita-image-store.s3.amazonaws.com/0/164551/d28042ba-24d2-0ee6-1d90-b9d3612b9314.png)

コーディングのスピードも上がるし、スペルミスなども防げて便利便利

## 設定
コード補完の設定をデフォルトから変えたい場合は、オプションダイアログの「ユーザーインターフェース\エディタ設定\支援機能」で行います

### オプションダイアログの表示
オプションダイアログを表示するには、IDE のメニューから [ツール | オプション] を選択します
または IDE インサイトを Ctrl + . で呼び出し (10.3 Rioの場合は下の画面イメージのように IDEのタイトルバー上にある)「支援」で検索しても OK
![code06.png](https://qiita-image-store.s3.amazonaws.com/0/164551/28afced0-256b-becd-82aa-3d88d959e162.png)

### 設定できる内容
コード補完に関する設定は、この画面内の

- コード補完
- 自動起動
- かっこの自動補完
- 履歴
- 予約語を表示
- 待ち時間

の箇所が該当します
それぞれの設定項目の内容は、[ヘルプの支援機能](http://docwiki.embarcadero.com/RADStudio/Rio/ja/%EF%BC%BB%E6%94%AF%E6%8F%B4%E6%A9%9F%E8%83%BD%EF%BC%BD) の箇所を参照してくださいませ (10.3 Rio)

![code07.png](https://qiita-image-store.s3.amazonaws.com/0/164551/843f36d0-2677-1d68-87df-8c2ef36dee8f.png)


## う...動かない
Ctrl + Space を押してもコード補完が動かない場合

- その前のコードでエラーがある (たとえば ; が無かったり) かをまずは確認
- [環境変数 PATH](http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB_%E3%83%8E%E3%83%BC%E3%83%88#.E3.82.AA.E3.83.9A.E3.83.AC.E3.83.BC.E3.83.86.E3.82.A3.E3.83.B3.E3.82.B0_.E3.82.B7.E3.82.B9.E3.83.86.E3.83.A0.E3.81.AE.E8.A6.81.E4.BB.B6) を確認して設定されている文字数が長すぎないか (2048文字以内) を確認

です

##参考 (docwiki - 10.3 Rio)

- [コード補完](http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E3%82%B3%E3%83%BC%E3%83%89%E8%A3%9C%E5%AE%8C)
- [支援機能（IDE チュートリアル）](http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E6%94%AF%E6%8F%B4%E6%A9%9F%E8%83%BD%EF%BC%88IDE_%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%EF%BC%89)
- [支援機能を使用する](http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E6%94%AF%E6%8F%B4%E6%A9%9F%E8%83%BD%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B)
- [［支援機能］](http://docwiki.embarcadero.com/RADStudio/Rio/ja/%EF%BC%BB%E6%94%AF%E6%8F%B4%E6%A9%9F%E8%83%BD%EF%BC%BD)
stm32f4-discoveryの作法 その8

#概要

stm32f4-discoveryの作法、調べてみた。
dmaなuart2やってみた。

#写真

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/1f0661ae-5c31-a0fe-725f-d4168c9ce9af.png)

#利用したライブラリ

https://github.com/ohisama/ESP8266-STM32F4Discovery

#サンプルコード


```
#include "driver_init.h"
#include <string.h>
#include "led.h"
#include "uart_2.h"
#include "tim_3.h"
#include "adc_1.h"

uint8_t rx_buffer[512];
void main(void)
{
	bool led_status = false;
	bool led_temperature_status = false;
	driver_init();
	uint8_t c;
	while (true)
	{
		if (adc_1_is_interupt())
		{
			adc_1_clear_interupt();
			set_led_orange(led_temperature_status);
			led_temperature_status = !led_temperature_status;
		}
		if (tim_3_is_interupt())
		{
			tim_3_clear_interupt();
			char text[128];
			uint16_t temperature = adc_1_get_value();
			sprintf(text, "%d\r\n", temperature);
			uart_2_send((uint8_t *) text, strlen(text));
			set_led_green(led_status);
			led_status = !led_status;
		}
		if (uart_2_is_interupt())
		{
			uart_2_clear_interupt();
			int length = uart_2_get(rx_buffer);
			for (int i = 0; i < length; i++)
			{
			}
		}
	}
}


```

以上。
SeleniumでEdgeを使うお話

SeleniumでEdgeを使うお話

## Edge用のWebDriverの準備
まずはEdgeのバージョン確認
Edgeの[設定]->[全般]から一番下までスクロールするとバージョンを確認できます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/360118/3d56c0a9-54a0-a868-23d6-6a02a07bbc90.png" width=40% />

EdgeのバージョンにあったWebDriverを下記からダウンロードします。
[WebDriver - Microsoft Edge Development](https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/)
<img src="https://qiita-image-store.s3.amazonaws.com/0/360118/aafc633f-ba08-30e6-5c36-d415e3c07ff7.png" width=60% />


## WebDriverの読み込み
```python
from selenium import webdriver
driver = webdriver.Edge(executable_path='C:\\...\\MicrosoftWebDriver.exe')
driver.get('https://www.bing.com/')
```

## 参考
[SeleniumでMicrosoft Edgeブラウザを動かす方法](https://bitwave.showcase-tv.com/selenium%E3%81%A7edge%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99%E6%96%B9%E6%B3%95/)
[Seleniumを使ってPythonでブラウザ操作 - Qiita](https://qiita.com/n-yamanaka/items/518b1c79fbc399c54c4a)
[Ruby]配列について

# 配列について
配列は一つの変数で複数の情報を管理できる箱のようなものです。
配列の中には文字列オブジェクト、数値オブジェクト、ハッシュオブジェクトなど様々な情報を配列の中で管理する事ができます。
また配列内に入った情報は**順番**を持っているのが特徴です。

## 配列の定義
そ俺では配列を定義していきます。

```配列.rb
example = []
```

これで配列の定義ができました。しかしこれは配列という箱を用意しただけなので中にはまだ何も入っていません。
次に情報を入れていきたいと思います。

```配列.rb
example = ["ゆーいち", 25]
```
値を入れる事ができました。
配列は順番があると説明しましたがこの場合先に書かれているものが１番となります。
しかし配列の順番の数え方は０番から始まるので0番目が文字列の"ゆーいち"、１番目が数値の25となります。

## 要素の追加
次に配列内に要素を追加する方法を説明します。

```配列.rb
example = ["ゆーいち", 25]
# 要素の追加
example << "エンジニア"
```

これで要素を追加する事ができました。
このように追加した要素は配列の一番後ろに行くので"エンジニア"という文字列は2番目ということになります。

## 要素の取り出し方
それでは次に配列の中から取り出したい要素を取り出していきます。今回は配列の中の「25」という数値を取り出していきたいと思います。

```配列.rb
example = ["ゆーいち", 25]
example << "エンジニア"
# 要素の取り出し
puts example[1]
# => 25
```
これで配列内の中から一つの要素を取り出す事ができました。
なんども言っていますが配列は順番を持ちます、なので取り出すときも**その番号を指定する**事で取り出す事ができます。

## 最後に
今回は配列についての基本的なことについて説明していきました。
次回はもう少し深掘りして配列を使った手法を説明していきたいと思います。

最後まで読んでいただきありがとうございました。
ServerlessFrameworkにてaws-go-modテンプレートのサービスをデプロイしてみる

とりあえずやってみた系。
大した情報ではないが、aws-go-modについてはServerlessFramework本家のサンプルもなく、海外も含め、まだ情報が少なそうだったので一応公開しておく。
誰かのお役に立てればこれ幸い。

## aws-go-mod?

ServerlessFrameworkでは、今現在（2019/03/26）、Lambdaのgoランタイムでは以下の３種から選択できる。
・aws-go
・aws-go-dep
・aws-go-mod

後者の２つはパッケージ管理ツールが含まれたものとなる。
それぞれ、dep、Moduleというツールになる。
Moduleはdepの後継版にあたり、今後はModuleが主流になる模様。新規に始める場合はこちらを選んでおきましょう。

## 実行コマンドの履歴

### サービス生成
ServerlessFrameworkコマンドにてサービス生成する。

```
$ sls create --template aws-go-mod --path test-func
$ cd test-func
$ ls
Makefile	gomod.sh	hello		serverless.yml	world
```

### ビルド（失敗）
ビルドしてみるがエラー :(

```
$ make build
chmod u+x gomod.sh
./gomod.sh
export GO111MODULE=on
env GOOS=linux go build -ldflags="-s -w" -o bin/hello hello/main.go
hello/main.go:8:2: cannot find package "github.com/aws/aws-lambda-go/events" in any of:
	/usr/local/Cellar/go/1.10.3/libexec/src/github.com/aws/aws-lambda-go/events (from $GOROOT)
	/Users/hiroyama/go/src/github.com/aws/aws-lambda-go/events (from $GOPATH)
hello/main.go:9:2: cannot find package "github.com/aws/aws-lambda-go/lambda" in any of:
	/usr/local/Cellar/go/1.10.3/libexec/src/github.com/aws/aws-lambda-go/lambda (from $GOROOT)
	/Users/hiroyama/go/src/github.com/aws/aws-lambda-go/lambda (from $GOPATH)
make: *** [build] Error 1
```

必要なパッケージをDL。

```
$ go get -u github.com/aws/aws-lambda-go/lambda
```

### ビルド（リトライ）

成功 :)

```
$ make build
chmod u+x gomod.sh
./gomod.sh
export GO111MODULE=on
env GOOS=linux go build -ldflags="-s -w" -o bin/hello hello/main.go
env GOOS=linux go build -ldflags="-s -w" -o bin/world world/main.go
$ ls
Makefile	bin		go.mod		gomod.sh	hello		serverless.yml	world
```

### デプロイ

成功 :)

```
$ sls deploy
```

ちなみに、以下のコマンドでビルドからデプロイまで実施できる。
通常はこっちの方が使うことが多そう。

```
$ make deploy
```
Self-Managed な社内 Gitlab をhttps化 したら Gitlab Runnerがうまく動かなかった件

# はじめに
社内で立ててる Self-Managed な Gitlab を https 化した際、 Gitlab Runner も設定変更が必要です。ところがうまく行かなくて、試行錯誤したので、忘備録的な意味合いで記事を書きます。

# 今回起きた現象

単純にrunnerのURLだけ変更すれば良いのかと思ってたので、設定変更しました

```shell
$ sudo vi /etc/gitlab-runner/config.toml
```

### 変更前

```vim
[[runners]]
  name = "for server"
  url = "http://192.XXX.XXX.XXX/"
  token = "xxxxxxxxxxxxxxxxxxxx"
  executor = "docker"
  [runners.docker]
    tls_verify = false
    image = "php:7.2.10"
    privileged = false
    disable_cache = false
    volumes = ["/cache"]
    shm_size = 0
  [runners.cache]
```

### 変更後

```vim

[[runners]]
  name = "for server"
  url = "https://gitlab.hoge.com/" # URLを変更
  token = "xxxxxxxxxxxxxxxxxxxx"
  executor = "docker"
  [runners.docker]
    tls_verify = false
    image = "php:7.2.10"
    privileged = false
    disable_cache = false
    volumes = ["/cache"]
    shm_size = 0
  [runners.cache]
```

設定を反映します

```shell
$ sudo gitlab-runner restart
```

Jobを走らせます

```shell-session
...(略)...
Fetching changes...
fatal: remote origin already exists.
Clean repository
fatal: unable to access 'http://gitlab-ci-token:xxxxxxxxxxxxxxxxxxxx@192.XXX.XXX.XXX/nishioka/hoge.git/': Failed to connect to 192.XXX.XXX.XXX port 80: Operation timed out
ERROR: Job failed: exit code 1
```

あれ？古いURL見に行ってるぞ？

# 試行錯誤

### 対策1
たぶん Runner 側にキャッシュが残ってるのかなあとは思ったんで、`runners.docker`>`disable_cache`を`true`にして runner restart したところうまく行かず。

### 対策2
Runner の設定値に`clone_url`というのがあったのでこれで試しにURLを上書きしてみました。

`clone_url`についての詳細はgitlab公式サイトのこの辺に記載があります。
https://docs.gitlab.com/runner/configuration/advanced-configuration.html#how-clone_url-works

```shell
[[runners]]
  name = "for server"
  url = "https://gitlab.hoge.com/" # URLを変更
  token = "xxxxxxxxxxxxxxxxxxxx"
  executor = "docker"
  clone_url = "https://gitlab.hoge.com/" # 新たに追加
  [runners.docker]
    tls_verify = false
    image = "php:7.2.10"
    privileged = false
    disable_cache = false
    volumes = ["/cache"]
    shm_size = 0
  [runners.cache]
```

これで runner restart して動かしました。うごいた！

# 終わりに

なんでこれで動くのかはわかるのですが抜本的な対策になっていないような気がします。が、ひとまずこれまで。
virtualenvにて仮想環境構築

#使用環境
macOS mojave 10.14.2

#Virtualenvをインストール
```
$ sudo easy_install virtualenv
```

```
・・・
Installed /Library/Python/2.7/site-packages/virtualenv-1.11.6-py2.7.egg
Processing dependencies for virtualenv
Finished processing dependencies for virtualenv
```

上の様なログが出力されればインストールは完了しています。

#仮想環境作成
```
$ mkdir practice
```

mkdirコマンドでディレクトリを作成し、

```
$ virtualenv --no-site-packages practice
```

vietualenvを使って先ほど作成したディレクトリを指定し、仮想環境を作成します。

```
New python executable in PythonTest/bin/python
Installing setuptools, pip...done.
```
上記の様なログが出れば完了です。

#仮想環境起動
```
$ source practice/bin/activate
```
↓

```
(practice)$ ....
```

$の前に作成したディレクトリ名が出れば起動完了しています。

#仮想環境終了
```
(practice)$ deactivate
```


この記事はここまで
MySQL8.0以上のset password構文

パスワード変更しようとset passwordコマンド叩いたらグダったのでメモ

#バージョン
MySQL 8.0

#以前までのコマンド
```
>>> set password for 'user'@'%' = password('new pass');
```

#8.0以降
```
set password for 'user'@'%' = 'new pass';
```

password()を呼び出さなくて良くなったみたいです。


この記事はここまで