OmniAICreator/Qiita-1.07M huggingface dataset:
APL(Alexa Presentation Language)のSpeakItemでmp3を鳴らす

#こんにちは
APLのSpeakItemの中でaudioタグを書いてもmp3が鳴らない仕様があり永らく悩んでいたのですが、APLでmp3を鳴らす方法を見つけたのでざっくり共有します。

#追記(2019/6)
echo show5やFireTV一部の機種において、通常のspeakとAPLのSpeakItemを併用するとフリーズする症状を確認しています。通常のspeakを使わずに全てSpeakItemのみで鳴らす事で回避可能です。

#例えば
hoge.mp3をAPLで鳴らすAPLを送るとします。
解説の都合上、datasourcesとExecuteCommandsから先に。

```json:datasources-1
"datasources": {
  "pagerAnimationData": {
    "properties": {
      "topicSsml": [
        "<speak><audio src=\"https://s3-ap-.../hoge.mp3\" /></speak>"
      ],
    },
    "transformers": [
      {
        "inputPath": "topicSsml",
        "outputName": "topicSpeech",
        "transformer": "ssmlToSpeech"
      },
      {
        "inputPath": "topicSsml",
        "outputName": "topicText",
        "transformer": "ssmlToText"
      }
    ]
  }
}
```
```json:ExecuteCommands（抜粋）
{
  "type": "SpeakItem",
  "componentId": "talk_0"
}
```

#鳴らない
さて、以下のようにDocumentを書いておいても鳴りません。

```json:document-1（抜粋）
{
  "type": "Text",
  "id": "talk_0",
  "text": "(音声再生中)",
  "speech": "${payload.pagerAnimationData.properties.topicSpeech[0]}",
  "position": "absolute",
  "width": 0,
  "height": 0
}
```

以下でもダメでした。

```json:document-1a（差分）
  "speech": "${payload.pagerAnimationData.properties.topicSsml[0]}",
```

#鳴る
下記のように、speechに直接URLを指定すると鳴らす事が出来ます。

```json:datasources-2
"datasources": {
  "pagerAnimationData": {
    "properties": {
      "topicSsml": [
        "（ここにはSSML書かない）"
      ],
      "topicSound": [
        "https://s3-ap-.../hoge.mp3"
      ]
    },
    "transformers": [
      {
        "inputPath": "topicSsml",
        "outputName": "topicSpeech",
        "transformer": "ssmlToSpeech"
      },
      {
        "inputPath": "topicSsml",
        "outputName": "topicText",
        "transformer": "ssmlToText"
      }
    ]
  }
}
```

```json:document-2
{
  "type": "Text",
  "id": "talk_0",
  "text": "(音声再生中)",
  "speech": "${payload.pagerAnimationData.properties.topicSound[0]}",
  "position": "absolute",
  "width": 0,
  "height": 0
}
```

#気をつける点
・**開発コンソールのシミュレータでは鳴らない**（動作が止まる）のでご注意ください。
・念のためtransformersの影響を受けない場所に置いたほうがいいかも。（未検証）

#参考
[Alexa Command SpeakItem coupled with self provided mp3 ? - Forums](https://forums.developer.amazon.com/questions/203285/alexa-command-speakitem-coupled-with-self-provided.html)
WindowsでNodejsのバージョン管理がしたいので、nvm-windowsをインストールしてみた

* いくつかのWindowsマシンに導入してみたが、うまくいかないマシンがあったのでメモ
  * 過去に書いて未投稿だったものを公開するので、内容が古い可能性もあります

## 基本は以下の通りでOK

* [nvm-windowsでNode.jsバージョン管理](https://qiita.com/akuden/items/a88630de9624039c4135)
  * ありがとうございます :bow:

## `npm -v`できなかった場合 :sob:

* 以下を見直したらできました :smile: :v:
  1. [Common-Issues#spaces-in-pathnamesinstallation-root](https://github.com/coreybutler/nvm-windows/wiki/Common-Issues#spaces-in-pathnamesinstallation-root)

* `1.1.8`で解消されるようですね
  * [nvm-windows/releases](https://github.com/coreybutler/nvm-windows/releases)
kotlinでtry-with-resourcesするやつ

# いきなり結論

残念ながらkotlinにはtry-with-resourcesそのものはないです。
その代わり、同等のfunction（厳密には[extension function: 拡張関数](https://kotlinlang.org/docs/reference/extensions.html#extension-functions)）として`use`があります。

```java:java
try (OutputStream ost = Files.newOutputStream(path)) {
    FileCopyUtils.copy(inst, ost);
} catch (Exception e) {
    e.printStackTrace();
}
```
これが↓

```java:kotlin
try {
    Files.newOutputStream(path).use { ost ->
        FileCopyUtils.copy(inst, ost)
    }
} catch (e: Exception) {
    e.printStackTrace()
}
```
こうなります。

個人的には`use`の中身が1行であれば`Files.newOutputStream(path).use { ost -> FileCopyUtils.copy(inst, ost) }`みたいに改行せずに書くことが多いです。
kotlinはjavaに比べてスッキリと書けるのところが好きなので。

# 複数resourceの場合
複数のresourceを使いたい場合は`use`をchainできます。

```java:kotlin
try {
    Files.newOutputStream(path).use { ost ->
        Files.newInputStream(path).use { inst ->
            FileCopyUtils.copy(inst, ost)
        }
    }
} catch (e: Exception) {
    e.printStackTrace()
}
```

あまりchainしすぎるとネストが深くなるのが玉に瑕。

# 参考
- [Try-with-resources in Kotlin | Baeldung](https://www.baeldung.com/kotlin-try-with-resources)
- [kotlin/Closeable.kt at master · JetBrains/kotlin](https://github.com/JetBrains/kotlin/blob/master/libraries/stdlib/jvm/src/kotlin/io/Closeable.kt)
    - 参考っていうか`use`の実装。気になったら一度目を通しても良いかも
PhpStromで出るwarning,errorメッセージをコピーする方法

今回は波々の下線(インスペクション)があるコードにマウスをかざすと出るメッセージ的なもの(ツールチップ)をコピーする方法を紹介。
PhpStromだけじゃなくて他のJetBrains IDEでも実現できると思います。

1. まずマウスをかざしてメッセージを出します。
2. 次にメッセージのコピーしたい範囲をマウスで選択。
3. altキーと右クリックをします。

これでコピー完了。
メッセージを検索したい時や、ブログを書く時に重宝します。

[ここに書いてありました。](https://youtrack.jetbrains.com/issue/IDEA-65636)
Alibaba CloudのKubernetesをVisual Studio Codeから利用する（Cloud Code編）

# はじめに

`Visual Studio Code Kubernetes Tools`を入れた後に、Googleの`Cloud Code`もVS Codeに対応していた事を思い出しました。
※2019.05.27時点ではベータ版です。

[Alibaba CloudのKubernetesサービスをVisual Studio Codeから利用する](https://qiita.com/MatYoshr/items/3dc8001fa5c74a4e7e74)

とりあえず入れてみたのでメモを残します。

# Cloud Code for VS Code のインストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/0e767c1d-ac8a-f48d-d836-f122694c4eef.png)

インストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/c6346658-a031-1aa1-3cdf-eae71da29826.png)

インストールが完了すると`Welcome`ページが開きます。
閉じてしまってもコマンドパレット`Cloud Code: Welcome`から開けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/c38c5382-1f73-d313-163d-013bdf1d7920.png)

# Kubernetes Explorerの確認

`Kubernetes Explorer`<>（こんなアイコン）を選択するとCloud Codeの画面が開きます。
`Visual Studio Code Kubernetes Tools`と同様にKubeconfigの設定がしてあれば`CLUSTER EXPLORER`にクラスターが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/4444c74e-caeb-2645-d515-31d511783610.png)

GKE以外にもEKS(AWS),AKS(Azure)も対応しています。
残念ながらAlibabaCloudはメニューとしては対応していないですね😭
Clusterの作成をVSCodeからはできないですが、作成済みのk8sクラスターの制御は普通に可能です😁

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/7c5c9aed-5296-948e-378e-532f091efb3d.png)

`Deployments`ではレプリカの数などが確認できます。
`Pods`では各podの状態や起動時間などが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/bbe9f843-f1c4-1ae0-51fe-fc8df4f28a9d.png)

`Services`では`Type`や`External IP`,`Port`などが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/f68103f3-7c66-051b-53f6-1fa3da34d43d.png)

# おわりに

`Cloud Code for VS Code`の方はベータ版のためか、GKE前提のためかクラスターの追加がVSCodeでは出来ない？🤔
機能的な面では`Visual Studio Code Kubernetes Tools`の方がイロイロできることが多い様な感じがします。

例えばログの閲覧ですが`Visual Studio Code Kubernetes Tools`ではこの様になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/5cd1900d-744c-886c-b33b-f6bc3e71040f.png)

`Cloud Code for VS Code`だとこの様にテキストファイルが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/7f8ad009-501c-f707-5075-ee663ea865ab.png)


ただ、感覚的には`Namespaces`単位で設定が整理されている`Cloud Code for VS Code`の方が使いやすい感じはしますねー

どちらにしてもクラスターの作成さえしておけば、二つとも対応クラウド以外のkubernetesでもちゃんと管理できるのでありがたいですね🤗
とりあえずは二つとも併用するかな🤔

`Cloud Code for VS Code`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/54529d9d-053d-5658-f19e-0358dd7a9740.png)

`Visual Studio Code Kubernetes Tools`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/11547/2fce0459-c534-d24a-0463-66c3a1e27032.png)
Firebase Remote Configを使って強制アップデート機能を実装してみた

# 概要
Firebase Remote Configを使用し、強制アップデート機能を実装したので、その過程をまとめたいと思います。

# Firebase Remote Configとは
Firebase Remote Configは、クラウド上でkey-valueを管理することができるサービスです。

クラウド上で管理する値を変更するだけで、即座にアプリに変更を反映させることができます。本来であれば、コードを変更し、Appleに審査を通すなどのプロセスが必要ですが、Firebase Remote Configを使えば、すぐにアプリのデータの更新が可能になります。

具体的な用途としては、A/Bテスト、新機能のテスト、今回紹介する強制アップデート機能など様々な使い道があります。

# 強制アップデート機能について
強制アップデート機能では、Firebase Remote Configを使ってアプリのversionを管理します。

手元にインストールされているアプリのversionとFirebase Remote Configで管理しているversionの値を比較し、Remote Configのversionの方が新しい場合、最新のアプリのインストールを促すアラートを表示します。

致命的なバグが見つかった時やアプリのリニューアルで大幅にUIが変更された時などユーザーにアプリをアップデートしてほしい際、強制アップロード機能を使用します。


# 実装手順
### 1. Firebase Remote Configにverを登録する
Firebaseの管理画面から、Remote Configを選択し、「パラーメータを追加」ボタンをタップすると画像のようなキーと値を登録する画面が表示されるので、任意のキーと値を登録するだけで簡単に設定を行うことができます。

![スクリーンショット 2019-05-26 20.58.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116254/64464053-cfb8-925a-fc90-141a17d0240a.png)



### 2. ダウンロードしているアプリのverを取得する

```swift

let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as! String 
```


### 3. Remote Configのverを取得する

```swift

func getLatestVersion() {
    let expirationDuration: TimeInterval = 30
    let versionKey = "pfc_ios_version"
    remoteConfig = RemoteConfig.remoteConfig()
    // Remote Configからデータを取得
    remoteConfig.fetch(withExpirationDuration: expirationDuration) { [weak self] status, error -> Void in
        guard let self = self else { return }
        if status == .success {
            self.remoteConfig.activateFetched() 
            guard let appStoreVer = self.remoteConfig[versionKey].stringValue else { return }
        }
    }
}
```

### 4. アップロード可能な最新のverがある場合、アップデートを促すアラートを表示する
versionの比較に関しては[こちらの記事](https://qiita.com/_mogaming/items/f98ae83f8c72b25a45c2)を参考が参考になりました。


### 5. アラートタップ後にAppStoreに遷移させる

```swift

func launcAppStore() {
    // App StoreのアプリのURL
    let appURL = ""
    guard let url = URL(string: appURL) else { return }
    if UIApplication.shared.canOpenURL(url) {
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
    }
 }
```
他にも`SKStoreProductViewController`を使用してアプリ内でAppStoreを開く方法もあります。詳細は[こちらの記事](https://dev.classmethod.jp/smartphone/launching-app-store-from-ios-app/)が参考になります。

# まとめ
今回は、強制アップデート機能実装のためにFirebase Remote Configを使用しました。Remote Configは他の用途でも活用できそうなので、次回は別の機能で使用してみたいです。


# 参考資料
- [Firebase Remote Config]
(https://firebase.google.com/docs/remote-config?hl=ja)
- [[iOS] アプリからApp Storeを表示する方法について]
(https://dev.classmethod.jp/smartphone/launching-app-store-from-ios-app/)
- [Swift3でバージョン文字列を比較する]
(https://qiita.com/_mogaming/items/f98ae83f8c72b25a45c2)
- [[iOS] アプリからApp Storeを表示する方法について]
(https://dev.classmethod.jp/smartphone/launching-app-store-from-ios-app/)
Node.js + Puppeteer を使って無料でデスクトップより大きなスクリーンショットを撮る 4k 8k

# はじめに
建築系のCG制作プロダクションで3DCGモデラーをしています。

建築の仕事をしていると、広範囲・高解像度の地図とか航空写真が欲しい時があります。
一番簡単なのは、国土地理院の[地理院地図](https://maps.gsi.go.jp/#5/36.104611/140.084556/&base=std&ls=std&disp=1&vs=c1j0h0k0l0u0t0z0r0s0m0f1)から画像を保存することです。
無料ですし、簡単で大変便利です。ただ、この地図、若干、**古いんです**。

もっと新しい地図が欲しければ、ゼンリンやMapFanみたいな地図会社の有料サービスを利用するか、
GoogleマップやYahooマップでスクリーンショットを撮るしかありません。

##高解像度のスクリーンショット
"無料で"というと、スクリーンショットを撮ることになります。

ただ、"広範囲・高解像度" となると、デスクトップよりずっと大きな画像になります。
普通にスクリーンショットを撮ろうとすると1画面に収まりません。デュアルディスプレイでも無理です。

ブラウザのエクステンションに、"ページ全体のスクリーンショットを撮る"ものがありますが、
画像のキャッシュなどの問題で、キレイに撮るのはなかなか大変です。

なので以前は、仕方なくスクリーンショットをたくさん撮って、Photoshopで合成してました...。



# Chromeを自動操作出来るpuppeteer
[puppeteer](https://github.com/GoogleChrome/puppeteer)は[node.js](https://nodejs.org/en/)上で動くChromeを自動操作するためのライブラリです。
大変短いコードで簡単にWEBページのスクリーンショットを撮れます。
[Puppeteer API](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md)


本来、WEBテスト用のツールですが、"ウィンドウサイズを指定"出来るので、
4kでも8kでも任意のサイズのスクリーンショットを撮れます。


## インストール
[node.js Install](https://nodejs.org/en/download/)
[puppeteer Install](https://www.npmjs.com/package/puppeteer)


## 実践
以下、Yahooマップの写真モードでやってみました。

```javascript:main.js

// yahoo maps in Japan
const url = 'https://yahoo.jp/scdMa0'; //マップの表示設定をした後、URLを取得（アドレスバーのじゃなくて、アイコンの"URLボタン"のほうから取る）

(async() => {
	const puppeteer = require('puppeteer');
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
	await page.setDefaultNavigationTimeout(120000);
    const response = await page.goto(url,{waitUntil:"networkidle2"});
    let n = 4;
    let k = 1024;
    // 4k = 4096 pixel x 4096 pixel 
	  try {
			let map_area = '#map';
			await page.setViewport({width:n*k,height:n*k}); // ウィンドウサイズを指定
			for (let i = 2; i > 0; i--) { // ブラウザにキャッシュさせるために2回繰り返す
			    await page.waitFor(90000); //通信環境にもよると思いますが、少し待たないと画像が全部来ないです。
				if(i == 1){
					let img_name = 'map_'+ n +'k' + i + '.jpg';
					const map_area_Handle = await page.$(map_area);
					await map_area_Handle.screenshot({path: img_name});
					console.log(img_name);
				}
		}

	  } catch (e) {
	    console.log(e);
	    
		throw e;
	  } finally{
	  	  await browser.close();
	  }
})();



```



```shell:run.bat
node main.js

```

# 結果
最大ズームで8k画像（8192 pixel x 8192 pixel）を取得出来ました。
![sct20190527090741.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66381/7d6af029-1946-ba76-fd68-4b2bebd0ae3a.png)


## 画像サイズについて
ウチの通信環境だと、8kはうまくいかない時があります。
画像タイルが全部ロードされず、歯抜けになってしまうことがあります。

12kでも試してみましたが、全然撮れません...。半分しか画像が来ません。
4kくらいまでならちゃんと撮れます。

### 扱いやすいサイズにする
そもそも、あまり画像サイズがデカいと後で扱いにくいので、
最終的に、大きくても4kに収まるようにするのがよいと思います。
理想的には2k以下が軽くていいです。大抵は事足ります。

広さが足りなければ、ズームアウトすればいいですし、
一部分だけでも高解像度が欲しければ、そのエリアと周囲を分けるといいと思います。



# 動くことは動くけど
シンプルなコードですが、ちゃんと絵が撮れるようになるまでちょっと苦労しました。
画像が全部ロードされるまで待つ方法が分からず、結局、時間指定です。

node.jsって何？ってところから始めたので、エンジニアでもなんでもない自分にとっては上出来ですが...。
うまい方法わかる方いらっしゃいましたら、ご教授ください。
Redashのアップグレード方法

# Redash6からRedash7へのアップグレード方法(V7～V8も同様の方法で可能)

## 既存環境のバックアップ
何かあった時の為に戻せるようpostgresqlのバックアップを取得する。

- Postgresqlのコンテナ上にpg_dumpでバックアップを作成

```
# docker exec -t redash_postgres_1 /bin/bash -c "pg_dump -U postgres postgres | gzip > /tmp/redash_backup_`date "+%Y%m%d"`.gz"
```

- コンテナからバックアップを取得

```
# docker exec -t redash_postgres_1 /bin/bash -c "chmod +x /tmp/redash_backup_`date "+%Y%m%d"`.gz"
# docker cp redash_postgres_1:/tmp/redash_backup_`date "+%Y%m%d"`.gz /home/redash/redash_backup/backupfile/redash_backup_`date "+%Y%m%d"`.gz
```

## コンテナの停止

docker-composeで構築したので同様にdocker-composeで停止

```
# docker-compose -f docker-compose.yml down
```
## docker-compose.ymlのバージョンを修正
docker-hubから最新のタグを確認する。2019/05/27時点では、「7.0.0.b18042」が最新の模様なので書き換える。バージョン8系でも同様なので以下でタグを確認して書き換える。
https://hub.docker.com/r/redash/redash/tags/

serverとworker部分の2カ所変更する。
``` docker-compose.yml
  server:
    image: redash/redash:7.0.0.b18042
・・・
  worker:
    image: redash/redash:7.0.0.b18042
```

## データベースをアップグレード
```
# docker-compose -f docker-compose.yml run --rm server manage db upgrade
```
## コンテナを起動
docker-composeでコンテナを起動する。

```
# docker-compose -f docker-compose.yml up -d
Creating network "redash_default" with the default driver
Creating redash_redis_1
Creating redash_worker_1
Creating redash_postgres_1
Creating redash_server_1
Creating redash_nginx_1
```

## バージョンの確認
REDASHへログインして右上の「System Status」からバージョンがアップグレードされている事を確認する。

## 各バージョンの変更点
changeログはこちらを参照
https://github.com/getredash/redash/blob/master/CHANGELOG.md
grepで複数ファイルの文字列を一括置換

grepで複数ファイルの文字列を一括置換

+ abc => RRR
 
```
grep -rl "abc" ./ | xargs sed -i -e "s/abc/RRR/g"
```

+ abc.aaa => RRR.bbb


```
grep -rl "abc\.aaa" ./ | xargs sed -i -e "s/abc\.aaa/RRR\.bbb/g"


```

`grep `
-r フォルダも検索
-l ファイル名のみ出力

`sed `

-e スクリプト（コマンド）を追加する
-i ファイルを直接編集する
GoでHttpサーバー(簡易CGI動作)を作る

#GoでHttpサーバと簡単なCGIプログラム

go言語でhttpサーバと簡易CGI動作確認用プログラムを作ります。
実行ファイル直下にhtmlフォルダを作成して、index.html以外の適当なHTMLファイルを作成してください。



```go:httptest.go
package main

import (
	"fmt"
	"net/http"
)

func cgiRun(w http.ResponseWriter, r *http.Request) {
	tmp := r.URL.RawQuery
	fmt.Fprintf(w, "%s", tmp)
}
func main() {
	http.HandleFunc("/cgi", cgiRun)
	http.HandleFunc("/html/", func(w http.ResponseWriter, r *http.Request) {
		//html/にアクセスしてindex.htmlが存在しないとき
		http.ServeFile(w, r, r.URL.Path[1:])
	})
	http.ListenAndServe(":8080", nil)
}

```

http://localhost:8080/cgi?a=aa&b=bb にアクセスするとa=aa&b=bbが表示されます。
http://localhost:8080/html にアクセスするとhtmlフォルダ内のファイルリストが表示されます。
cgiRunの関数部分を改造すれば、簡単なCGIが組めそう
Policyが紐づいていないModelに対してGate::deniesを実行したらtrueが返ってきた

## 環境

Laravel: 5.5
PHP: 7.2

## 前提

同じModelでもグローバルスコープをかけたい場合とかけたくない場合で2つModelを作っていた。

グローバルスコープをかけている方はかけていない方を継承したModelになっている。

グローバルスコープをかけている方は、権限やdeleted_atの関係でかけていたのでもちろんPolicyも登録されていた。

かけていない方は、権限を気にせず参照したい場合があるという理由でかけておらずPolicyもつけていなかった。



## 起こったこと

URLに特定のパラメータ(hoge_id=1のような形)が入っているかでModelの持ってくる方法を変えている三項演算子があった。

```php
$hoge = $request->has('hoge_id') ? Hoge::findOrFail($request->get('hoge_id')) : Auth::user()->fuga->hoge;
```
この三項演算子の:の右側に入った場合に`Auth::user()`で取り出される認証系のModelがグローバルスコープをかけていない方になっており、そのリレーションなので取り出されたfugaもhogeもかけていない方(=Policyがついていない)になっていた。



その場合に、Gate::deniesの第2引数に$hogeを渡すと、第1引数で指定したPolicy内で作成した関数にたどり着かずtrueで返ってきた。

Gateクラスの中身を覗いてみるとGate::deniesはGate::allowsの結果を反転させたものが返されていた。

Gate::allowsの中身は以下の通り

```php
public function allows($ability, $arguments = [])
{
    return $this->check($ability, $arguments);
}
```



呼び出されているcheckの中身はこんな感じ

```php
public function check($abilities, $arguments = [])
{
	return collect($abilities)->every(function ($ability) use ($arguments) {
    	try {
        	return (bool) $this->raw($ability, $arguments);
        } catch (AuthorizationException $e) {
            return false;
        }
	});
}
```

tryの中のrawはこんな感じ(コメントアウトは見やすさのために一旦除けました)  

```php
protected function raw($ability, $arguments = [])
{
	if (! $user = $this->resolveUser()) {
    	return false;
    }

    $arguments = Arr::wrap($arguments);

    $result = $this->callBeforeCallbacks(
    	$user, $ability, $arguments
    );

    if (is_null($result)) {
    	$result = $this->callAuthCallback($user, $ability, $arguments);
    }

    $this->callAfterCallbacks(
    	$user, $ability, $arguments, $result
    );

	return $result;
}
```

rawの中で呼ばれているresolveUser()を条件にしたif文の中のreturn false;が怪しいと踏んでresolveUser()を見に行く

こんな感じ

```php
protected function resolveUser()
{
    return call_user_func($this->userResolver);
}
```



ここのcall_user_funcで追いかけられなくなったので終了。



**以下推測**

call_user_funcのphp公式ドキュメントを見に行ったが存在しない関数名を渡した場合はどうなるかはわからず。ただ一番ありそうな気がする部分なので、call_user_funcでfalseが返り、

```php
if (! $user = $this->resolveUser()) {
    	return false;
}
```



のif文の中に入ったことでfalseがallowsの結果として返りdeniesがtrueになったのかなと思います。

## 振り返り

結局のところ型の意識が抜けた状態でプログラムを書いていたのが根本の原因かなと思うのでこういう(何らかの原因で同じModelを二つ作らざるを得ない)場合には自分が今どっちのModelを扱っているのか気にしたり後からそれが明示的にわかるような書き方をする必要があるなと学びました。
windowsに右クリックメニューに「送る」を追加したい場合

下記に、ショートカットを配置するだけ

windows10　windows7の場合は以下のパス

```
C:\Users\［ユーザー名］\AppData\Roaming\Microsoft\Windows\SendTo\
```

おまけ：
**windowsのショートカット作成方法**
フォルダまたはファイルの上で右クリック→「ショートカットの作成」で作成できます
![qiita1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421327/b335ecfc-6681-c3af-6a56-da503c2613b6.jpeg)
メモ


作業メモ用に。
Markdownになれる。

# php_googleカレンダー連携
- https://www.spiceworks.co.jp/blog/?p=10254
 
# Dragarrange
- ドラッグするだけでDOMの順番を変えられるプラグイン
- https://github.com/vishalok12/jquery-dragarrange
- https://goworkship.com/magazine/jquery-plugin/
WSL上のUbuntu環境で chromedriver を使ってRSpecするとエラーが発生するので、その解決方法。

# はじめに

WSLでUbutu環境を使いchromedriverでRSpecテストをしたらエラーが発生しましたが、無事に解決できたのでその方法をまとめます。

Railsで有名な参考書[「現場で使える Ruby on Rails 5速習実践ガイド」](https://www.amazon.co.jp/dp/4839962227/ref=cm_sw_r_tw_dp_U_x_Pxv6CbVC7BT2H)をやっていてぶつかったエラーなので、参考になる方が多いのではと思いQiitaで記事にまとめようと思いました。

おそらく、Windows環境で参考書通りにWSLとUbuntuを使っている人だと、ほぼ確実にぶつかるエラーなので参考になれば嬉しいです。

# 環境とバージョン

- WSL 
- Ubuntu 18.04.2 LTS
- Ruby 2.5.1
- Rails 5.2.3
- RSpec-rails 3.8.2

# エラー内容と解決方法

RSpecを記述した後、テストを通すとエラーが発生しました。(現場Rails205p)

エラー内容としては[「こちらの記事(teratail)」](https://teratail.com/questions/187391)と全く同じものです。

テスト内容の記述や`spec_helper.rb`、`rails_helper.rb`のソースコードもこちらの記事と同じなので、必要に応じて参考にしてみてください。

```console:エラー内容
 Failures:

 1) タスク管理機能 一覧表示機能 ユーザーAがログインしているとき ユーザーAが作成したタスクが表示される
    Got 0 failures and 2 other errors:

 1.1) Failure/Error: visit login_path

      Selenium::WebDriver::Error::WebDriverError:
        unable to connect to chromedriver 127.0.0.1:9515



      # ./spec/system/tasks_spec.rb:12:in `block (4 levels) in <top (required)>'

 1.2) Failure/Error: raise Error::WebDriverError, cannot_connect_error_text

      Selenium::WebDriver::Error::WebDriverError:
        unable to connect to chromedriver 127.0.0.1:9515
```

エラーを読むと、どうやらwebdriverにエラーが発生しててchromedriverに接続できないみたいです。

Windows側とは別に、Ubuntu側にもchromeをインストールしないといけないみたいなので、こちらの記事「[ubuntuにchromeを簡単にインストールしよう](https://sunababox.com/ubuntu/chrome-install/)」を参考にchromeをインストールしました。

ちなみに、Ubuntu上で以下のコマンドを入力するとchromeがインストールされているか分かります。

```console
$ google-chrome -version
Google Chrome 74.0.3729.169
```

さて、Ubuntu上にもchromeがインストールできたということで、もう一度テストを実行すると次は以下のエラーが...。

```console:エラー内容
Failures:

  1) タスク管理機能 一覧表示機能 ユーザーAがログインしているとき ユーザーAが作成したタスクが表示される
     Got 0 failures and 2 other errors:

     1.1) Failure/Error: visit login_path

          Net::ReadTimeout:
            Net::ReadTimeout



          # ./spec/system/tasks_spec.rb:12:in `block (4 levels) in <top (required)>'

     1.2) Failure/Error: @io.to_io.wait_readable(@read_timeout) or raise Net::ReadTimeout

          Net::ReadTimeout:
            Net::ReadTimeout
```

どうやら、次はchromeに繋がらずにタイムアウトしてしまったようですね。

こちらの記事([WSL Ubuntu 上で chromedriver を使った System Spec を動かす](https://gist.github.com/upinetree/fb71a947cc100e7918b7b280485d620c))によれば、

> ChromeがインストールされているのはWSLの外のWindows環境。 なのでパスが通っていないし、バイナリも不一致となってしまう。

>そのため cannot find Chrome binary のようなエラーが出るなどして System Spec を実行できない。

>以下の2種類の対策方法がありそうだ。

>A. chromedriver-helper を使わずに、自分で chromedriver を設定する
>B. chromedriver-helper を利用しつつ、ChromeをWSL環境にインストールする
>対策A. chromedriver-helper を使わずに、自分で chromedriver を設定する

とのこと。WSLでUbuntuを使うとパスが通ってないのでいろいろと設定が追加で必要なようです。

二つの対策方法があるみたいなので、記事を参考に僕もAの「自分でchromedriverを設定する」ことにしました。

結果、無事にテストを通すことができました。
めでたし、めでたし:clap:


# 参考記事まとめ

- [『Ruby on Rails 5 速習実践ガイド』のRSpecの実行部分でテストが通らなく詰まっています。(teratail)](https://teratail.com/questions/187391)
- [ubuntuにchromeを簡単にインストールしよう](https://sunababox.com/ubuntu/chrome-install/)
- [WSL Ubuntu 上で chromedriver を使った System Spec を動かす](https://gist.github.com/upinetree/fb71a947cc100e7918b7b280485d620c)
MVCモデルにおけるコントローラの役割[Rails]

#はじめに
```ruby:controller
def index
    @tweets = Tweet.includes(:user).order("created_at DESC").page(params[:page]).per(5)
end
```
上記のようなコードはコントローラに書きますが、コントローラに記述してるけど、これってモデルの仕事なのではと思ったので、改めてMVCモデルについて理解を整理しようと思います。

#MVCモデルとは
MVCモデルとは、モデル、ビュー、コントローラの略で、アプリケーションを３つのそれぞれ役割をもたせたプログラムに分けて設計する方式のことです。

それぞれの役割をざっくり定義すると
・モデル　処理
・ビュー　見た目
・コントローラ　処理と見た目の架け橋
となります。

このモデルにのっとらず、ビューのなかにすべての処理を記述することもできますが、それだと見づらく、変更が難しくなるため、でフロントとサーバーサイドにわかれたこのMVCモデルができました。

#コントローラについて
アプリケーションをつくる上で、

コントローラへの記述多くない？
処理を担当しているはずのモデルにほとんどコードを書かないけどどういうこと？

と疑問に思いました。

改めてコントローラの役割を定義すると、

「ユーザーの入力情報を取り出し処理担当のモデルに渡し、その処理結果を呼び出すビューに渡す」

といったところでしょうか。

コントローラのコードをみますと

```ruby
  def index
    @tweets = Tweet.includes(:user).order("created_at DESC").page(params[:page]).per(5)
  end

  def new
  end

  def create
    Tweet.create(image: tweet_params[:image],text: tweet_params[:text],user_id: current_user.id)
  end

  def destroy
    tweet = Tweet.find(params[:id])
    tweet.destroy if tweet.user_id == current_user.id
  end

  def edit
    @tweet = Tweet.find(params[:id])
  end

  def update
    tweet = Tweet.find(params[:id])
    tweet.update(tweet_params) if tweet.user_id == current_user.id
  end

  def show
    @tweet = Tweet.find(params[:id])
    @comments = @tweet.comments.includes(:user)
  end

  private
  def tweet_params
    params.permit(:image, :text)
  end
```

createやfindはActiveRecordのクラスメソッドですし、ここに書かれているほとんどはモデルの処理ということでしょうか。

#まとめ
今回、コントローラに書かれているからコントローラの処理だと思い込んでいたことが、実はモデルの処理なのではないかと疑問に思い、改めてMVCモデルについて考えました。

この考えに誤りがありましたら、ぜひお教えくださると嬉しいです！
The Web Interoperability Pledge

The Web Interoperability Pledge
https://www.w3.org/Promotion/WIP/

>THIS PAGE IS OBSOLETE AND NO LONGER MAINTAINED
Last modified: $Date: 1999/12/13 15:45:57 $ by $Author: ijacobs $.
Old page begins below.

1999年当時のこの資料の価値を理解していない。

>WIP is not a W3C initiative: 

W3C initiativeの公式文書ではないらしい。

>What is the Pledge Language?
There are two forms of the pledge.
One is for Webmasters:
"I pledge to use only recommended HTML tags as defined by W3C."
The other is for vendors:
"I pledge to support recommended HTML tags as defined by W3C, and submit all extensions to HTML to W3C before shipping them."

順次調べて追記予定

p.s.
用語の衝突
https://qiita.com/kaizen_nagoya/items/6a8eb7ffaa45eeb16624

@KEINOS さんからのコメントにあった用語。
記憶がもうろうとしている。わかることを記録。

自己参考(self reference)

英語(0) 一覧
https://qiita.com/kaizen_nagoya/items/680e3f5cbf9430486c7d

言語・文学記事　１００
https://qiita.com/kaizen_nagoya/items/42d58d5ef7fb53c407d6

日本語（０）一欄
https://qiita.com/kaizen_nagoya/items/7498dcfa3a9ba7fd1e68

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

Error一覧 error(0)
https://qiita.com/kaizen_nagoya/items/48b6cbc8d68eae2c42b8

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.

# 文書履歴(document history)
ver. 0.01 初稿 　 20190526
ver. 0.02 ありがとう追記 　 20230529
最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Excel VBAコース第8回内容

全12回 Excel VBAコースの第8回の内容です。

#プロシージャとは
プログラミングで、複数の処理を1つにまとめたもののことです。
例えば、VBAで言うと、Sub 〇〇 ～ End Sub までが1つのプロシージャです。

VBAで初めに理解すると良いのは、「Subプロシージャ」と「Functionプロシージャ」です。

#プロシージャの呼び出し方
・Callステートメント
・Callは省略可能
・Functionプロシージャは、関数として呼び出し可能

```
Sub MainSub()

    Call プロシージャ名
    
End Sub

Sub プロシージャ名()
    
    Cells(1, 3).Value = Cells(1, 1).Value + Cells(1, 2).Value 
    
End Sub
```

####※なぜプロシージャを分けるのか？
・処理の共通化（同じ処理を何回も書かなくて良くなる）
・可読性・可視性の向上（読みやすい、見やすい）

#引数と戻り値
・引数＝プロシージャに値を引き渡すもの
・戻り値＝プロシージャから値を戻すもの（Functionプロシージャのみ可能）

```:引数の例
Sub MainSub()
    Dim X As Integer
    Dim Y As Integer

    X = Cells(1, 1).Value 
    Y = Cells(1, 2).Value 

    Call プロシージャ名(X , Y)
    
End Sub

Sub プロシージャ名(a As Integer, b As Integer)
    
    Cells(1, 3).Value = a + b
    
End Sub
```
```:戻り値の例
Sub MainSub()
    Dim X As Integer
    Dim Y As Integer

    X = Cells(1, 1).Value 
    Y = Cells(1, 2).Value 

    Cells(1, 3).Value = プロシージャ名(X , Y)
    
End Sub

Function プロシージャ名(a As Integer, b As Integer) As Integer
    
    プロシージャ名 = a + b
    
End Function
```
#SubプロシージャとFunctionプロシージャの違い
・Subプロシージャ・・・マクロとして登録可能（マクロボタン等）
・Functionプロシージャ・・・戻り値を返せる（関数として利用可能）

#変数の適用範囲
宣言の仕方によって、変数の適用範囲が変わります。

・Dimでプロシージャ内：宣言したプロシージャのみ
・DimもしくはPrivateでプロシージャ外：モジュール内の全てのプロシージャ
・Publicでプロシージャ外：プロジェクト全体

※適用範囲内では、重複する変数名は使用できませんが、適用範囲外では使用可能
mac版sublimeを一部コマンドで日本語化【Japanize】

# はじめに
mac版sublimeの日本語化手順でファイルリネームとか面倒くさい部分をコマンドでやった記録。
使用するパッケージは定番の`Japanize`。
「Package Control」のインストール済み前提。
環境はmacOSX。

# `Japanize`のインストール
`Package Control`のパッケージインストールで`Japanize`をインストールする。

* `shift`+`option`+`p`でダイアログを開く。
* `Package Control: Install Package`を実行。
* `Japanize`で検索してインストール。
* インストール後に`Japanize`のreadmeが表示されたらOK。

```
Package Control Messages
========================

Japanize
--------

  Japanese menu for Sublime Text 3  
    
  Sublime Text 3の日本語化プラグインです。  
  [ゆーがいぶろぐ](http://blog.huwy.org/article/292827228.html)さんの日本語化ファイルがベースです。  
    
  適用手順  
  １．C:\Users\ユーザー名\AppData\Roaming\Sublime Text 3\Packages\Japanizeにインストールされている*.jpファイルを、  
   　　　C:\Users\ユーザー名\AppData\Roaming\Sublime Text 3\Packages\Default  
  　　にコピーします。※Defaultフォルダがない場合は作成してください。  
  ２．コピーしたファイルをオリジナルのファイル（.jpが付かないファイル）と置き換えます。（念のため、オリジナルのファイルが有る場合は.orgなどを付けて保管しておきましょう。）  
  ３．C:\Users\ユーザー名\AppData\Roaming\Sublime Text 3\Packages\Japanize\Main.sublime-menu（.jpが付かない方）を、  
   　　　C:\Users\ユーザー名\AppData\Roaming\Sublime Text 3\Packages\User  
  　　にコピーします。すると、他のプラグインで上書きされてしまっているトップメニューも日本語化されます。  
  以上です。
```
macでwindowsのreadmeが出てる。

# `適用手順`をmac版に置き換えて実施
ファイルを置き換えたりする手順があるのでターミナルでファイル操作を行う。

## やること
* `./Packages/Japanize/`に入ってる`.jp`ファイルを`./Packages/Default/`にコピー
* コピーしたファイル名から`.jp`を消した名前にリネーム
* `./Packages/Japanize/Main.sublime-menu`を`./Packages/User`にコピー

## コマンドでやってみる
`terminal`でも`iTerm`でもクライアントは何でもOK（なはず）
`/Users/｛ユーザ名｝/Library/Application Support/Sublime Text 3/Packages`
パッケージのインストール先は上記の通り。

```console
$ cd ~/Library/Application\ Support/Sublime\ Text\ 3/Packages/
$ mkdir Default; cp -a Japanize/*.jp Default/
$ for filename in Default/*.jp; do mv "$filename" "${filename%.jp}"; done
$ cp -a Japanize/Main.sublime-menu User/
```

実行チェック

```console
# 拡張子jpファイルがなければOK
$ ls -lt Default/*.jp
ls: Default/*.jp: No such file or directory
# .jpが付いてないMainファイルがあればOK
$ ls User/Main.sublime*
User/Main.sublime-menu
```

sublimeがひっそり日本語化してるはず。
自社開発企業にジョブチェンジ可能か?(業務未経験)

#web系自社開発企業に転職は可能か?(業務未経験)
##結論 : 無理じゃないけど、かなりきつい:cry:
採用担当者様に聞いたところ、それはかなり無理に近いとのこと。
さらに短期挑戦ともなれば、難易度はさらに上がる。

####:point_up: 転職パターン
①　未経験可の企業に潜り込む。
　→　そういう企業は、下手をすればジョブチェンジ失敗に終わりかねないとの厳しいお言葉、、当たりはずれもありそうなので、慎重に動いたほうがよさそう、

②　別枠で応募し、とりあえず入社してしまう。
　→　ある企業様からこのようなアドバイスをいただき、ありかもと思いました。
　　　エンジニアのいない環境で独学するぐらいなら、人脈を作れる環境にとりあえず身を置いてしまうのもありかも。

③　死ぬ物狂いで傑作ポートフォリオを作成。
　→　これはおそらくスクールなり行かないと不可能に近い。

最近は、甘い言葉でIT業界を勧めてくる人達がいますが、現実はかなり厳しいそうです、
vue-chartjsでoptionsを動的に変更させる方法

optionsに関してはレスポンシブに変更されないみたいで`this.renderChart()`で明示的に再描画する必要があるみたいです[^1]。
チャートのデータ変更はレスポンシブに変更されます。


[^1]: https://github.com/apertureless/vue-chartjs/issues/365
PySnooper の文字列を取得

こんにちは、古内です。
今回は少し前にバズった [PySnooper](https://github.com/cool-RR/PySnooper) で標準出力ではなく、Python としての文字列として取得する方法をご紹介します。

# はじめに

以下が、経緯です。

1. 本番環境 ( [GAE / SE](https://cloud.google.com/appengine/docs/standard/) ) でボトルネックを調べたい
2. [New Relic](https://newrelic.co.jp/) しようと思ったが GAE / SE ではどうやらできなさそう
3. 今だけ使うようなものでいいから手っ取り早くやりたい

また、公式ドキュメントが整っておらず、文字列を取得するやり方について見つからなかったので記事にしました。

コード自体はかなり適当に作られています。
本番環境で恒久的に運用することはしないでください。

この記事では、以下のバージョンでのご紹介になります。

- Python: 3.7.2
- PySnooper: 0.0.39

# 読者の想定

- Python 構文が分かる人
- 手っ取り早く PySnooper の文字列を Slack 等に送りつけたい人
- [New Relic](https://newrelic.co.jp/) 等がどうしても使えない環境でボトルネックをチェックしたい人

# ソースコード

正直、記事にするか悩むレベルで簡単です。( ドキュメントなかったのでとりあえず記事にしましたが… )

https://github.com/furuuchitakahiro/get-PySnooper-string

https://github.com/furuuchitakahiro/get-PySnooper-string/blob/master/get_pysnooper_string.py#L13-L19

```python
class MyWritableStream(pysnooper.utils.WritableStream):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.dump_message = ''

    def write(self, s: str) -> None:
        self.dump_message += s
```

はい、ほぼこれだけです。
あとは使うだけ。

https://github.com/furuuchitakahiro/get-PySnooper-string/blob/master/get_pysnooper_string.py#L5-L10

```python
ws = MyWritableStream()
with pysnooper.snoop(output=ws):
    num1 = 1
    num2 = 2
    result = num1 + num2
print(ws.dump_message)  # ws.dump_message で文字列として取得できる
```

あなたのデバッグしたいコードを `with pysnooper.snoop(output=ws):` の中に突っ込んでください。
例では `num1 = 1` から `result = num1 + num2` 部分です。
そして、最後に **`print(ws.dump_message)` 部分を Slack なりメールなり、ログファイルなりにすればいいと思います。**

解説のしようがないレベルであれなので必要なことだけ列挙しておきます。

- **pysnooper.utils.WritableStream を継承したクラスを作って write メソッドオーバーライドする**
- **with 構文で snoop する際に引数に予め初期化しておいた WritableStream インスタンスを渡す**

以上です。
**注意としてはデコレータでの使用は難しいって感じですかね。**
理由としては WritableStream の初期化が問題です。
( デコレーターで試してませんが多分だめだと思います )

# あとがき

なんだかすごく内容の薄い記事になってしまいました。
そのうち PySnooper もどんどん整備されていけばこういった記事がなくても良くなると思います。
ですが、WritableStream について触れている文献も探すの面倒だったりしたのでやっちゃいました。
こうした方がいいよとか、間違いとかあればぜひご指摘お願いします。
ありがとうございました！
Herokuデプロイ後のエラー

Cloud９上では、問題のなかったページ移行の動作ですが、
Herokuにデプロイ後、Heroku上で確認すると以下のエラーメッセージが出てきてしまいます。
(例えば、loginページからログインし、tasks（タスク一覧ページ）に行こうとすると以下のエラーになってしまう。):point_down:
We're sorry, but something went wrong.
If you are the application owner check the logs for more information.

:point_up:行った対処
☆ マイグレーションの再実行
　①　rails db:migrate:reset
　意味 : 一度DBを削除して、作成し直し、もう一度マイグレーションを実行。

　結果 : 一部動作はクリアしたが、まだエラーが生じる。

注: マイグレーションファイルの内容を大幅に変えていたので、Heroku側のデータベースは一旦リセットする。
　①　heroku pg:reset DATABASE
　②　  To proceed, type xxxxxxxxxxxx or re-run this command with --confirm xxxxxxxxxxxx

> アプリ名を入力(xxxxxxxxxxxxの箇所)
　③　heroku run rails db:migrate
　意味 : テーブルを再作成する。

:frowning2:これでも改善できなかったら、、、
　①　heroku restart
　意味 : herokuのサーバも再起動。

これで何とかエラーは消滅しました。
これを解決するのに２日ほどかかりました。
初心者には結構キツイですね、、
機械学習を勉強することがある程度の学歴を持った多くの人にオススメである理由

##はじめに

結論から言うと将来の自分の市場価値と自分の適性を考えて仕事を選びたいと考えているある程度学歴を持った人にとっては自分は「機械学習を学ぶ」というのが最短のゴールであると考えています。

ちなみに自分自身は機械学習のスキルが特別ずば抜けている訳でもないただのこれからようやく業務に機械学習エンジニアとして携わり始める人間ですが、まずここで機械学習を学ぶことでの将来のメリットをまず５つ提示していきます！

１、将来自分のスキルの掛け算で勝負しやすい
２、将来週4以下や時短勤務やリモートワークなどの自由な働き方ができる確率が上がる
３、英語数学などの机に向かうなどの勉強面も大事
４、将来的に需要が大きく伸びそう
５、万が一需要が低くなることがあっても、そこで学んだ統計や数学、プログラミングなどのスキルは他に生かしやすい

一つずつ見ていきたいと思います

##１、将来自分のスキルの掛け算で勝負しやすい
　皆さんご存知であると考えていますが、今世の中で様々なものとAIが掛け合わされています。○○techという言葉は皆さんご存知であると思います。このように、AIというのは世の中の多くのものと融合されるものです。
　また、どうしてスキルの掛け算で勝負することが大事かというと、シンプルに言うと一つの分野で偏差値70の人間になるより、偏差値60の分野を作った方が基本的に楽でコスパがいいからです。例えば受験を例にとると、英語１科目で入れる大学には、英語の偏差値がむちゃくちゃ高い人がたくさん来ますよね、例えば3年アメリカにいましたみたいな帰国子女だったり。そこで一流になるにはかなりの労力が必要になりますし、それなら特別苦手意識がないなら数学と英語2科目で受けられるところで勝負した方がいいよねって話です。
　同じように例えばマーケティングについて偏差値70のスペシャリストになったり、機械学習において偏差値70のスペシャリストになるよりも、その両方に置いて偏差値60になった方が楽ですし、天才みたいな人たちと勝負しないで済みます。


##将来週4以下や時短勤務やリモートワークなどの自由な働き方ができる確率が上がる
　これは僕の勝手な予測ですが、AI系の仕事と言うのは　IT企業が多いです。このような企業では、柔軟な働き方を推し進めている企業が多いです。そのため、機械学習のスキルを身につけることは将来自由な働き方をするという選択肢を広げることができます。

##英語数学などの机に向かうなどの勉強面も大事
　ここまでのものならただのエンジニアでいいなということは皆さん考えているかもしれません。
世の中には他にも多くのエンジニア業務ってありますよね、これは正直１から始めるなら勉強ができる人もできない人も同じ土俵からスタートする訳です。せっかく大学まで勉強してきたのにそれはもったいないですよね。
しかし、機械学習はまずアルゴリズムを理解するために数学の知識が必要ですし、それに加えてあまり解説などが多く広まっていないため調べるときには英語しか文章がないということも多々ありますもちろん普通のエンジニアも英語の文章しかない時もありますが、それよりも頻度がさらに高い印象です。

##将来的に需要が大きく伸びそう
　これは言うまでもないですね。例えば会計学や薬学などは勉強しても需要は横ばいですが、機械学習についてはこれから需要が大きくなっていく可能性は非常に高いでしょう。その中で需要＞＞＞供給となることも多くあります。

##万が一需要が低くなることがあっても、そこで学んだ統計や数学、プログラミングなどのスキルは他に生かしやすい
　需要は非常に高まる可能性が高いと書きましたが、もちろん機械における自動化などのリスクはあります。例えば実際に自動化を行うツールであるAutoMLというものが話題になっていたりします。これによって専門家よりも良い予測精度を出したという話もあるくらいです。
　そうなってきたら、機械学習を行う人の需要はこれから減っていくかもしれません。しかし、機械学習では「統計」「数学」「プログラミング」の三つの要素を学ぶことが必要不可欠です。そのためこのスキルは機械学習が潰れても残るものですし、スキルが０になる心配はありません。


##終わりに
　ここまで機械学習を学ぶことによるメリットを書いていきました。
学生などの多く（特に文系）は将来の役に立てるためになんとな英語を勉強したり簿記を勉強したりしている人が多いと思います。
　「AI」「機械学習」と聞くと難しそうだなと考える人は多くいると思います。しかし、この機械学習の難しいところは「プログラミングの質問ができる人がいる」という環境さえ整えれば払拭できると考えていますし、それがなくても適切な順番で勉強をしていけば理解できるはずです（この順番については今度書きたいと思います）。ぜひ将来のために役立てたい！と考えて勉強している人には「機械学習」という選択肢を持って欲しいです。
Raspberry Pi でNode-REDを開始する -「n」でバージョン管理編

Node.js V10 をインストールしたら、Node-RED の一部モジュールが対応していなかった。
「n」を使用してバージョン管理することにしました。
※今回はV9の最終版にしたら、モジュールのエラーが解消されました。

# 参考サイト

下記サイトを参考にさせて頂きました。

Node.js 環境構築メモ
https://qiita.com/megane42/items/dcd71c317b0062522068

Node-RED日本ユーザー会
https://nodered.jp/docs/hardware/raspberrypi

# 環境
```
$ cat /etc/issue
Raspbian GNU/Linux 9 \n \l
$ uname -a
Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux
$ arch
armv7l
```

# バージョン管理ツール 「 n 」 のインストール

```
curl -L https://git.io/n-install | bash
```

新しいターミナルを立ち上げる

# Node.js のインストール

`n list` でダウンロード可能なバージョン一覧を表示
`n 9.11.2` でバージョン（今回は 9.22.2 ）を指定してインストール

# Node-RED のインストール

```
npm install -g --unsafe-perm node-red
```

Node-RED version: v0.20.5
Node.js  version: v9.11.2
行ってきた！ ~CircleCI CTOが語る「ソフトウェア開発の過去と未来」~

## event
https://circleci.connpass.com/event/131707/

[#circlecijp](https://twitter.com/hashtag/circlecijp?src=hash)


common principle
idea economy ship fast to win
velocity from culture inbest in team tool automation




waterfall
wrong is expensive

requirement 
anahlissi
design 
codding
test
operation


ajile dev
adapt quickly



automate testing
bug fix while still remember code

junit
selenium 
cucmber

continus integration
ci


every moment ready

sonatype
jfrog

continus deployment

small change less risk

deploy is tire fire 
small tire fire is bset tire fire


measure everything




test in production




every engineer decision is a cost decision
everything you test , you can evaluate weather it is cheapest to catch in
test , staging prod
ホーム以外でホームの Rake タスクを実行

ホームディレクトリーに Rakefile を置いて，いろいろな作業ができるようにしている，とする。

別のディレクトリーにいるときに，そのタスクを実行するにはどうするか，というのがこの記事のテーマ。

# -f オプションで指定

`rake` コマンドには，Rake ファイルを指定する `-f` オプションがあるので，

```console
rake -f ~/Rakefile foo
```

のようにすればいい。
でもちょっと打つのが面倒じゃない？　もう少し簡略化できないの？

`-f` オプションにはディレクトリーを渡すことはできないが，ワイルドカードは使えるので，

```console
rake -f ~/* foo
```

と書けばよいようだ。

# おまけ

## Windows の場合

Windows では `~` がホームディレクトリーを表してはくれないので，この手は使えない。残念。
これなんか，rake コマンド側で対処してくれたらいいのにねー。
もちろん Windows では `~` という名前のディレクトリーを作ることができてしまうので，原理的には曖昧性が生じるわけだけど，「`-f` オプションの `~` はホーム」ってルールにしちゃってもいいんじゃない？

## Rake ファイルのファイル名

Rake ファイルのファイル名は

* Rakefile
* Rakefile.rb

のどっちでもいいし，大文字・小文字も気にしなくていい。

## Rake タスク中のパスの扱い方

Rake ファイルの場所がカレントディレクトリーと一致しているとは限らない，ということは常に頭に入れておきたい。

`-f` を使わなくても不一致は起こりうる。
カレントディレクトリーに Rake ファイルが存在しない場合，ディレクトリー階層を上にたどって Rake ファイルを探すからだ。

となると，Rake ファイル中で，たとえば

```rb
require "./my_library"
```

みたいな記述をしてしまってはダメ，ということになる。
この `.` はカレントディレクトリーを表しているからね。
Rake ファイルと同じ場所にある `my_library.rb` を読み込ませたいなら

```rb
require_relative "my_library"
```

とすればいい。

また，ファイルの読み書きなどでも

```rb
IO.read("foo.txt")
```

みたいなことはやめて，`__dir__` メソッドを使って Rake ファイルの置かれたディレクトリーのパスを取得し，そこからの相対パスでファイルを指定するようにしたい。
td-client-python を使って CREATE TABLE を実行する場合の注意点

Python3 で td-client-python のクエリ実行機能を使ってテーブル作成を行う場合、以下のような書き方だとテーブルは作成されません。

```python
job = client.query('sample_database', 'CREATE TABLE IF NOT EXISTS sample_table (time BIGINT, column1 STRING, column2 INT, column3 STRING)')
```

手元の環境は以下になります。

* Ubuntu 18.04 LTS
* Python 3.7.0
* td-client==0.13.0

この場合、type に presto を指定してあげるとテーブル作成できます。

```python
job = client.query('sample_database', 'CREATE TABLE IF NOT EXISTS sample_table (time BIGINT, column1 VARCHAR, column2 INT, column3 VARCHAR)', type='presto')
```

### 参考になった記事
[TreasureData：HiveQLのCREATE TABLEでエラーが出たら](https://okisanjp.hatenablog.jp/entry/archives/436)
PnP PowerShell で Sharepoint を操作しよう: (2) 準備とログイン

皆様こんにちは。

PnP でSharePoint に接続する第一歩を紹介します。

まず、インストールから。

##インストール

Windows10の場合

```
Install-Module SharePointPnPPowerShellOnline
```

管理者用PowerShell で上記のコマンドを実行します。

```
PS C:\Windows\system32> install-module SharePointPnpPowershellOnline

続行するには NuGet プロバイダーが必要です
PowerShellGet で NuGet ベースのリポジトリを操作するには、'2.8.5.201' 以降のバージョンの NuGet
プロバイダーが必要です。NuGet プロバイダーは 'C:\Program Files\PackageManagement\ProviderAssemblies' または
'C:\Users\user\AppData\Local\PackageManagement\ProviderAssemblies' に配置する必要があります。'Install-PackageProvider
-Name NuGet -MinimumVersion 2.8.5.201 -Force' を実行して NuGet プロバイダーをインストールすることもできます。今すぐ
PowerShellGet で NuGet プロバイダーをインストールしてインポートしますか?
[Y] はい(Y)  [N] いいえ(N)  [S] 中断(S)  [?] ヘルプ (既定値は "Y"): y

信頼されていないリポジトリ
信頼されていないリポジトリからモジュールをインストールしようとしています。このリポジトリを信頼する場合は、Set-PSReposit
ory コマンドレットを実行して、リポジトリの InstallationPolicy の値を変更してください。'PSGallery'
からモジュールをインストールしますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): y
```

これでインストールされました。

##接続

先ほどのPowerShellで以下のコマンドを実行します。

```
> $siteUrl = "https://<tennant>.sharepoint.com/sites/<somesite>"
> Connect-PnPOnline -Url  $siteUrl -Credentials (Get-Credential)
```

これで、資格情報の要求ダイアログが表示されました。

もしアカウントが多要素認証ありの場合は

```
Connect-PnPOnline -Url https://<tennant>.sharepoint.com/sites/<somesite> -UseWebLogin
```

を代わりに実行します。（アプリケーションパスワードを入力でも代用できますが、MFAが台無しになるのでやめましょう）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368667/f5ba3d1a-4e6e-896c-e736-c6ecbfa10013.png)

今回はここまでにします。
PnP PowerShell で Sharepoint を操作しよう: (1)はじめよう

皆様はじめまして。
最近、SharePoint Online 向けに業務アプリを組むことがありまして、まだ日本語の解説が乏しいようなので、あと日本語独自のテクニックも必要なようなので、ここで紹介してみたいとおもいます。

# PnP PowerShell について

まずここのサイトを紹介します。
[PnP PowerShell overview](https://docs.microsoft.com/ja-jp/powershell/sharepoint/sharepoint-pnp/sharepoint-pnp-cmdlets?view=sharepoint-ps)

PnP PowerShell というのは、"Patterns & Practices" というコミュニティベースのコマンドレット集みたいなもので、使いどころによっては劇的に開発効率が上がります。

比較対象となるのは、従来のSharePointへの接続方式である"CSOM"(Client Side Object Model) です。

idea.toString(); さんの [PowerShell + CSOM で SharePoint Online を操作する ](https://idea.tostring.jp/?p=914) が一番わかりやすかったのですが、参考にして自分で使ったサイト接続のスクリプトはこんなかんじです。

```
$csv = Import-CSV "csv\○○マスタ.txt" -Delimiter `t
$siteUrl = "https://○○.sharepoint.com/sites/exampleSite"
$listName = "○○マスタ"
$userName  = "me@example.com"

$password = Read-Host -Prompt "Enter password" -AsSecureString
$ctx = New-Object Microsoft.SharePoint.Client.ClientContext($siteUrl)
$credentials = New-Object Microsoft.SharePoint.Client.SharePointOnlineCredentials($userName, $password)
$context = New-Object Microsoft.SharePoint.Client.ClientContext($siteUrl)
$context.Credentials = $credentials
(以下、サイトに実際に行う操作）
[Microsoft.SharePoint.Client.Web]$web = $context.Web
[Microsoft.SharePoint.Client.List]$list = $web.Lists.GetByTitle($listName)

```

認証のために、`$ctx (コンテキスト)` とか `$credentials` とかをセットする必要があって、面倒～と思います。

対して、PnP ですと認証部分だけなら

```
$siteUrl = "https://○○.sharepoint.com/sites/exampleSite"
Connect-PnPOnline -Url  $siteUrl -Credentials (Get-Credential)
```
で済みます。これこそ、わたしの欲しかった、PowerShell らしい簡単な操作です。

たとえば、リストをSharePoint に作るコードも短いです。
ここでは、リスト"商品コードマスタ" を作り、フィールド"code" を新規に作り、Title, code に日本語名を与えて、インデックスを設定、ビューを作成しています。

```
 #リスト作成
    $Title = "商品コード"
    $InternalName="ProductCode"
    New-PnPList  -url  $InternalName -Title $Title -Template GenericList
    Add-PnPField -List $InternalName -DisplayName "code" -InternalName "code" -Type Text  -AddToDefaultView
    Set-PnPField -List $InternalName -Identity "Title" -Values @{"Title"="商品名"; "Indexed"=$true} 
    Set-PnPField -List $InternalName -Identity "code" -Values @{"Title"="商品コード"; "Indexed"=$true} 
    Set-PnPField -List $InternalName -Identity "Modified" -Values @{ "Indexed"=$true} 
    Set-PnPList -Identity $InternalName -EnableAttachments $false
    Add-PnPView -List $InternalName -Title "コード昇順" -Fields "code","Title" -SetAsDefault -Query "<OrderBy><FieldRef Name='code' Ascending='true'/></OrderBy>" -Paged
    Add-PnPNavigationNode -Title $Title -Url $InternalName -Location QuickLaunch #左のナビゲーション(クイックランチ)に登録
    Write-Host $Title を追加
```

やりたいこととコードがシンプルに対応していて、はかどりそうだと思いませんか？
次回から、この使い方を乏しい実例とともに紹介したいとおもいます。
モデルを継承して値を取得したい

IBeacon(子) < ShopTerminal(親)


モデル間の継承をしたいとする

##継承とは
簡単に言うと、親のモデルに定義されている内容は全部子モデルでも使えるよ〜ってこと


##値の取得

で、今回親のモデルの内容を子モデルを使って取得したい　と言うこと

コントローラでいつものように値を取得したいけどなぜか
`beacon = IBeacon.find_by_uuid(params[:uuid])`でbeaconの値が[ ]に。
`beacon = ShopTerminal.find_by_uuid(params[:uuid])`だとちゃんと値はいってるのに。。。


```beacons_controller.rb
class Api::BeaconsController < Api::AbstractSystemController

  def show
    return render_error('Please set uuid', 400) unless params[:uuid].present?
    beacon = IBeacon.find_by_uuid(params[:uuid])
    return render_error('beacon not found', 400) unless beacon.present?
    render json: beacon, serializer: IBeaconSerializer, root: nil
  end
end

```


##解決策
親モデルのShopTerminalにtypeカラム（String型）を追加

そして追加されたtypeカラムの中に`IBeacon`と書くことで上記のコード通り、子モデルでの値の取得ができるようになった！！



##今回やったことはSTIと言うらしい

typeという語はテーブルでSTI（Single Table Inheritance）を指定するために予約されている予約語で、この場合以外に使ったらエラーになるので気をつける。

STI（単一テーブル継承）はACtiveRecoredがサポートしている機能です。


参考：　[Rails4でSTI(単一継承テーブル)を行う](https://ruby-rails.hatenadiary.com/entry/20141206/1417839458)
numpyのaxisの適応順番で混乱したので備忘録

よくnumpyのaxisで迷うのでその備忘録。
<pre>
[[[1, 2, 3, 4, 5, 6],
  [2, 3, 4, 5, 6, 7],
  [3, 4, 5, 6, 7, 8]],
 [[1, 2, 3, 4, 5, 6],
  [2, 3, 4, 5, 6, 7],
  [3, 4, 5, 6, 7, 8]]]
</pre>

とかなっているとaxisが何が何だか解らなくなるので簡単な判別法
。
一番外の[]がaxis=0で内側の[]に入るごとにaxisの値が一つずつ増えていく。

例
<pre>
C=[[[1, 2, 3, 4, 5, 6],
    [2, 3, 4, 5, 6, 7],
    [3, 4, 5, 6, 7, 8]],
   [[1, 2, 3, 4, 5, 6],
    [2, 3, 4, 5, 6, 7],
    [3, 4, 5, 6, 7, 8]]]
</pre>
np.sum(C,axis=0)だと一番外のカッコ内レベルで計算されるので[3行5列]単位で計算され
[3行5列]＋[3行5列]
<pre>
array([[ 2,  4,  6,  8, 10, 12],
       [ 4,  6,  8, 10, 12, 14],
       [ 6,  8, 10, 12, 14, 16]])
</pre>
np.sum(C,axis=2)
外側から３番目のカッコ内を足すので
<pre>
[[[1行目5列分の和], [2行目5列分の和], [3行目5列分の和]]
  [4行目5列分の和], [5行目5列分の和], [6行目5列分の和]]]
</pre>で
<pre>
array([[21, 27, 33],
       [21, 27, 33]])
</pre>
になる


理解のためにもうちょっと話しましょうか。
<pre>
a = [[[1,2,6,4,6],     [9,8,0,-1,-5]],
     [[5,89,0.1,56,74],[666,2,15,45555,75]]]
</pre>

とあるとき
np.ndim(a)
で３が返るので３次元配列と分かる。
のでそれらの最小値を考えていきましょう！

次元数 - 1 = 2をaxisにセット
np.min(a,axis=2)
で一番内側の
[1,2,6,4,6]の最小値１,
[9,8,0,-1,-5]の最小値-5
[5,89,0.1,56,74]の最小値0.1,
[666,2,15,45555,75]の最小値2

となり

<pre>array([[ 1. , -5. ],
       [ 0.1,  2. ]])</pre>


np.min(a,axis=1)で一番内側から一つ次元が外側に行き、
<pre>
[[1, 2, 6, 4, 6],
 [9, 8, 0,-1,-5]]
</pre>の列の最小値
<pre>
[1, 2, 0,-1,-5]
</pre>と
<pre>
[5,  89, 0.1,    56, 74],
[666, 2,  15, 45555, 75]
</pre>
の列の最小値
<pre>
[5, 2, 0.1, 56, 74]
</pre>

に分けて計算され結果として
<pre>array([[ 1. ,  2. ,  0. , -1. , -5. ],
       [ 5. ,  2. ,  0.1, 56. , 74. ]])</pre>


がでます。


結局何が言いたいかというとaxis=0にして外側からの認識で計算していくか？
axis=次元数−１
にして最も内側の次元の認識で計算していくか？
お好きな方をどうぞ
という事です。
uGUIのImageを画面にフィットさせる

# 前提
- unity 2018.4.30f1で動作確認しました。

# 「画面にフィットさせる」とは?

画面への合わせ方として、以下の3種類が考えられます。

|名称|イメージ|説明|
|:---|:--:|:---|
|Stretch<br>伸縮|![Stretch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365845/20efb37d-22e9-822d-6b69-ea0ec9eaf7dd.png)|縦横比を無視して、画面いっぱいに拡縮する|
|Fit<br>内接|![Fit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365845/a23ee559-c618-5ba1-8035-d115c99adba5.png)|縦横比を保ち、画像全体が表示されるように拡縮する<br>画像と画面端に隙間ができる|
|Fill<br>外接|![Fill.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365845/51adb1c0-e8b3-5501-2c2e-b06aff66ab9d.png)|縦横比を保ち、画面に隙間なく表示されるように拡縮する<br>画像が画面からはみ出す|

# Stretch / Fit の場合

「Stretch - 伸縮」と「Fit - 内接」は、unityの標準機能だけで容易に実現できますね。
![Inspecter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365845/04d21523-c3d9-ce71-5ee8-33618fa0cae7.png)
RectTransformを、ルートCanvasの外周に沿って拡縮するように設定して、ImageのPreserv Aspectをチェックすると「Fit」、チェックしなければ「Stretch」になります。
また、こうするだけで、スマホの回転時などに生じる画面サイズ変化にも対応できます。

# Fill の実現

## アセットの入手 (GitHub)

ダウンロード ⇒ [FitForScreen.unitypackage](https://github.com/tetr4lab/FitForScreen/raw/master/FitForScreen.unitypackage)
[ソースはこちらです。](https://github.com/tetr4lab/FitForScreen)

## 使い方

- プロジェクトにアセットをインポートしてください。
- シーンのオブジェクトに、"FitForScreen"スクリプトをアタッチしてください。
- インスペクターでImageを設定し、Methodを選んでください。
- 画面サイズやMethodの変化にも対応しています。
- サンプル(SampleScene)も参考にしてください。

![Inspecter3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365845/a0b810eb-18c3-224b-3929-605301815eef.png) 　![SS4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/365845/35aabb51-e48e-79e7-7088-e4bd1d73f3ec.png)
[UNITY-CHAN! © Unity Technologies Japan/UCL](http://unity-chan.com/)
Meteor データサイズがどんどん大きくなっていく問題

ふとプロジェクトのサイズを見たら21GBとなっていて、なんなんだと思いました。

# 解決策
.meteor/local/bundler-cache/linker
この中のファイルをすべて消せばOK。19GBくらいここのディレクトリで占められていました。

キャッシュファイルが削除されずにどんどん膨れ上がっていっているようです。
消しても全く影響はありません。
Herokuで変更したConfig Vars(環境変数)が反映されないときの対処法

# 概要

Herokuのアプリケーションの設定画面(以下のURL)でConfig Vars(環境変数)が定義できる。
https://dashboard.heroku.com/apps/app_name/settings

※app_nameの部分は適宜、自身の環境に合わせて変更する

ここで定義したConfig Vars(環境変数)が反映されなくて困ったので対処法を以下に示す。

# 対処法

一度、Config Vars(環境変数)を削除して、もう一度Config Vars(環境変数)を定義する。

これで反映される。
Go言語（Golang）のmap

# Go言語　map関数について

Golangにおけるmapについてメモしておこうと思います．

### 基本文法
```map.go
package main

import "fmt"

func main() {
	m := map[string]int{"apple": 100, "banana": 200}
	fmt.Println(m)
    fmt.Println(m["banana"])

```
とします．こうすることで出力として

```
map[apple:100 banana:200]
200
```
と出力されます．
mapの作成，および中身の取り出し方は以上です．

### 要素の追加
さて，要素を追加したいときはどうするかですが

```map2.go
package main

import "fmt"

func main() {
	m := map[string]int{"apple": 100, "banana": 200}
	m["lemon"] = 500 
	fmt.Println(m)

```
とすることによって出力が
```
map[apple:100 banana:200 lemon:500]
```
となるのがわかります．

### 要素の有無の確認
mapが辞書型のように使われることがわかりました．
では，要素の有無を判断するにはどうしたらよいでしょうか．
返り値を２つ用意して中身とブール型の真偽を得ることが出来ます．

```map3.go
package main

import "fmt"

func main() {
	m := map[string]int{"apple": 100, "banana": 200}

	v, ok := m["apple"]
	fmt.Println(v, ok)
```
値(value)と，真理値(ok)を判断すると出力が以下のように得られます．

```
100
true
```

無事，appleの100，およびtrueが得られました．この指定された要素が存在しないときは0のみが返ってきます．また，補足ですが2つ目の返り値は必ずしも必要なく省略可能です．したがって

```map3-0.go
	v := m["apple"]
	fmt.Println(v)
```

としてもOKです．
【Unity】Windowsビルドのときに、音がおかしいとき

SEを鳴らすと、
exeだと音割れしてしまった。

備忘録


##参考
http://kan-kikuchi.hatenablog.com/entry/Windows_Audio__DSPBufferSize

##手順
Project Settings > Audio > DSPBufferSize が Best Latencyになってると、
これが原因の可能性アリ

Best Latency　> Default もしくは　Best performance　にする。