OmniAICreator/Qiita-1.07M huggingface dataset:
SlackApiでユーザ宛てとユーザグループ宛てのメンションについて

Slackを運用していると、 @channel, @here などとは別に、特定のメンバーだけをまとめたusergroupsを作成することがあるかと思います。

APIから `@hogehoge` のようにメンション付きでメッセージを送信する場合、 `<@hogehoge>` のようにして送っても正しく送信されなかったので、
備忘録として残しておきます。

## ユーザ宛てにメンションを送る場合

`<@username>` ではなく `<@userID>` を使う必要があります。

ユーザIDを調べる方法は
https://api.slack.com/methods/users.list/test
↑からWEBテスターを実行して調べてください。

## ユーザグループ宛てにメンションを送る場合

`<!subteam^取得したID|グループ名>` を使う必要があります。
なんだこれ・・・。

ユーザと同様に
https://api.slack.com/methods/usergroups.list/test
↑のWEBテスターから実行して調べてください。

**ID**が`取得したID`
**グループ名**が`handle`（を私は使いました）

これでメンションが送信出来るかと思います。

```
curl -XPOST -d "token=TOKEN" -d 'channel=channellname' -d "text=<@userID> <!subteam^取得したID|グループ名> こんにちは"  -d 'as_user=true' 'https://slack.com/api/chat.postMessage' >&/dev/null
```
[バッドノウハウ][Swift]「\\U30ec\\U30c3\\U30c9」を「レッド」に変換する


### 文字化け

Swift製のツールでFinderのラベル名を使いたくて検索した結果`defaults`で取得が可能なことが分かりました。

早速試してみると

```bash
$ defaults read com.apple.Finder FavoriteTagNames
(
    "",
    "\\U30ec\\U30c3\\U30c9",
    "\\U30aa\\U30ec\\U30f3\\U30b8",
    "\\U30a4\\U30a8\\U30ed\\U30fc",
    "\\U30b0\\U30ea\\U30fc\\U30f3",
    "\\U30d6\\U30eb\\U30fc",
    "\\U30d1\\U30fc\\U30d7\\U30eb",
    "\\U30b0\\U30ec\\U30a4"
)
```
文字化け...

意味は分かるが**自力で元に戻すのが面倒くさい**。

###バッドノウハウ

悪知恵を働かせた結果、JSONにして JSONDecoder or JSONSerializationを使って元に戻すというのを思いつきました。


```
"\\U30ec\\U30c3\\U30c9"
```
この部分に注目します。
これはJSONとしては正しくありません。
正しいJSONは

```
"\"\\u30ec\\u30c3\\u30c9\""
```
になります。
前後に 

```
"
```
を付けて、

```
\\U
```
を

```
\\u
```
に置換すればOKということです。

出力自体は `NSArray<NSString>`なPropery Listですので、`PropertyListDecoder`で簡単に`[String]`に変換することができます。

###以下ソース

```swift
func readFinderLabels() ->  [String] {
    
    let defaultsCommand = Foundation.Process()
    defaultsCommand.launchPath = "/usr/bin/defaults"
    defaultsCommand.arguments = ["read", "com.apple.Finder", "FavoriteTagNames"]
    
    let pipe = Pipe()
    defaultsCommand.standardOutput = pipe
    
    defaultsCommand.launch()
    defaultsCommand.waitUntilExit()
    
    do {
        
        return try PropertyListDecoder()
            .decode([String].self, from: pipe.fileHandleForReading.readDataToEndOfFile())
            .map { $0.replacingOccurrences(of: "\\U", with: "\\u") }
            .map { "\"" + $0 + "\"" }
            .compactMap { $0.data(using: .utf8) }
            .compactMap { try JSONSerialization.jsonObject(with: $0, options: .allowFragments) as? String }
        
    } catch {
        
        print(error)
        
        return []

    }
}
```

`JSONDecoder` は文字列だけのJSONをデコードできないので、`JSONSerialization`を使用しました。

`JSONDecoder`を使う場合は

```
"[\"\\u30ec\\u30c3\\u30c9\"]"
```
と文字列の配列にして、そこから取り出す形になります。
【A Tour of Go】Concurrency/Channels (2/11)

A Tour of Go の Exercise を実施したときのメモ。

* goroutine の呼び出し順と x、y が一致しない
    * 実行結果が`-5 17 12`になる
* sleep を入れると goroutine の呼び出し順どおりになる
    * 実行結果が`17 -5 12`になる
* スレッドなので実行順は不定となる。

```channels.go
package main

import "fmt"
import _"time"

func sum(s []int, c chan int) {
	sum := 0
	for _, v := range s {
		sum += v
	}
	c <- sum // send sum to c
}

func main() {
	s := []int{7, 2, 8, -9, 4, 0}

	c := make(chan int)
	go sum(s[:len(s)/2], c)
	//time.Sleep(1 * time.Second)
	go sum(s[len(s)/2:], c)
	x, y:= <-c, <-c // receive from c

	fmt.Println(x, y, x+y)
}
```
Steamworks.NETを使ってみた（メモ１）

# やったこと
- STEAMWORKSへの参加
- AppIDの取得
- UnityにSteamworks.NETを導入する
- サンプルスクリプトの実行

# STEAMWORKSとは
　Steamにゲームを出品するための登録システム。
　アカウント情報取得やマッチングシステムなど便利な機能も提供してくれる。

## STEAMWORKSへの参加
　Steamのアカウントを作ってから、https://partner.steamgames.com/ で登録を始める。
　登録には『銀行の口座情報』『100ドル分のお金』『身分証明書』などが必要になる。
　登録したメールアドレスに『身分証明書を送ってくれ』など届くので、メールボックスは要チェック。だいたい3日～1週間くらいで登録完了する。

## AppIDの取得
　無事登録できたら、『ホーム』からアプリを作成できるようになっているので作成する。
　100ドル支払うごとに1アプリ作成できるらしい。
　このときゲーム名を入力するので、あらかじめ決めておくとよい。
　作成できたらゲーム名に並んで（）内に数字が表示されていると思う。その数字がAppIDだ。

## Steamworks.NETの導入
　Unity用のSteamworks SDK、それがSteamworks.NET。
　http://steamworks.github.io/installation/
　↑のサイトから提供している。

　http://ttwco.blogspot.com/2016/03/unitysteamworkssteamworksnet.html
　邦訳された文を載せてくれているサイトもあるので、日本語でも簡単に理解できる。

## サンプルスクリプトの実行
　導入の参考サイト

- http://steamworks.github.io/gettingstarted/
- http://ttwco.blogspot.com/2016/03/unitysteamworkssteamworksnet.html

に載っているものを続けてそのままやるだけ。

　ただ引っかかった点が一つだけあったので紹介する。

　まずはSteamScript.csを作成し、下記のコードを書く。
　そして適当なオブジェクトにアタッチして実行。

```SteamScript.cs
using UnityEngine;
using System.Collections;
using Steamworks;

public class SteamScript : MonoBehaviour {
	void Start() {
		if(SteamManager.Initialized) {
			string name = SteamFriends.GetPersonaName();
			Debug.Log(name);
		}
	}
}
```

　ただし実行するとき、**『Steamクライアント』を起動中でなければならない**。
　『Steamクライアント』とは、Steamのゲームで遊ぶ時のアレだ。自分のダウンロードしたゲームとか選んで起動できるやつ。

　どうやらそこからアカウント情報などを引っ張ってくるらしく、Steamクライアントを起動していないとエラーが起こってしまう。
　さらに、Steamクライアントにはこのゲームを作成しているアカウント（要するにSTEAMWORKSに登録したアカウント）でサインインしていなければならない。

# まとめ
　単純なスクリプトだが動かすことができた。
　次はマッチングシステム周りを試していきたい。
OculusGoで左利き設定時、アプリ内でコントローラが表示されなかったときの確認箇所

FacebookのOculusデベロッパー助け合い所で見た質問に返答した内容の備忘録

#現象（unity開発→実機テスト

〇：OVRCameraRigをSceneに配置し、RightHandAnchorにTrackedRemoteを配置、OculusGo利き手設定を右手→アプリ内でコントローラ表示される
×：OVRCameraRigをSceneに配置し、LeftHandAnchorにTrackedRemoteを配置、OculusGo利き手設定を左手→アプリ内でコントローラ表示されない

#原因
入門記事などを見たときにTrackedRemoteのインスペクタでControllerの値変更記載がなかったか見落としたかでLeftHandAnchorに配置したTrackedRemoteのController値の設定漏れ。利き手左手設定で左手コントローラ表示するはずが非表示の右手コントローラが指定されているためコントローラが表示されない模様。

#確認箇所
LeftHandAnchor配下のTrackedRemoteのインスペクタでControllerの値を「L Tracked Remote」に変更すると利き手左手設定時にコントローラが表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/9596/bca4c5ee-2958-5139-7359-7649a024cf5c.png)
ネットワーク入門 Macのターミナルからssh接続する場合なぜポート番号を指定しなくていいのか

# はじめに
サーバーにssh接続をする際には一般的に、

- WindowsならTeraTermなどのアプリケーション
- Macならデフォルトのターミナル

を使用して接続すると思います。

TeraTermでssh接続をする際にはポート番号を設定するフォームがあるのですが、Macでssh接続をする場合は大半の人はポートの指定をしていないのではないでしょうか？

# sshといえばポート22番
TeraTermでssh接続をする際もポートは大半の方が22番に設定していると思います。
実は**ウェルノウン・ポート**というものがあり、よく利用されているポート番号は予め定められているのです。
[主要ウェルノウン・ポート番号一覧](http://bashalog.c-brains.jp/09/05/29-103157.php)

# Macでssh接続するときは...
ターミナルからssh接続をする場合も```-p```でポートを指定することはできます。
しかしこれは省略が可能で、省略した場合**ウェルノウン・ポート**がポート番号として指定されるのです。

# 終わりに
**ウェルノウン・ポート**と言いたいだけの人生でした。

ブログで見たい方はこちら
[ネットワーク入門 Macのターミナルからssh接続する場合なぜポート番号を指定しなくていいのか](http://nabesys.com/article/2018/06/11549/)
AdobeAnalyticsのAPIをpythonで使ってみる

#なぜpython？なぜlambda？
特に理由はなく、サーバーレスを試してみたかったので、pythonで作ってみました。
OAuthで問題なくtoken取得できていますが、そのtokenを使用するとtokenエラーが出てしまうため、今回はwsseでの使用方法を紹介します。

phpでのAPIは下記が参考になります。
[Adobe AnalyticsのReporting APIを使うシンプルなPHPコード](https://qiita.com/hsano/items/20bd6e3f02fd9c4a4556)　← OAuth
[AdobeAnalytics ReportAPIの使い方メモ](https://qiita.com/yteeq/items/abaaf146ed2b3b20ab23) ←　wsse


### 前準備 (管理者にお願いする)
(1)ユーザーID、暗号鍵の作成。
(2)ユーザーにWeb Service Accessへのアクセス権の付与。
(3)レポートスイートIDの確認

### 構成
![kousei.png](https://qiita-image-store.s3.amazonaws.com/0/263539/9be78080-1e80-b007-ce11-4aefd8954d8a.png)

ajaxでAPI GatewayのURLにアクセスし、chart.jsを使用してデータをグラフ化しています。
APIの値が返ってくるのに3秒以上かかっているので、1日に1回API実行、それ以外はDynamoDBから取得することを考えています。
このあと記載するプログラムではやってませんが・・・・

### 使用するAPI
・Report.Queue　→　jsonに作ってほしいレポート内容を記載してリクエストすると、reportIDが返ってくる
・Report.Get　　→　Queueで取得したreportIDを使用してreport内容を取得(まだできてないとエラーが返ってくることも・・・)

[APIのrequestの項目とresponseの値を確認するにはこれが便利](https://marketing.adobe.com/developer/api-explorer)
[上記でもわからない項目があれば、こちらのページ上部にあるPDFから確認](https://marketing.adobe.com/developer/documentation/analytics-reporting-1-4/get-started)

WEBサイトがカオスなので、非常にわかりにくいです・・・・・

### ReportをQueueしてGetするpythonコード
日別のサイトセクション毎のPV数と売上げデータの取得

```python:lambda_function.py

import os
import json
import time
import uuid
import requests
import hashlib
import base64

aa_endpoint = os.environ['aa_endpoint']
aa_username = os.environ['aa_username']
aa_password = os.environ['aa_password']

def lambda_handler(event, context):
    data = {"reportDescription":{"reportSuiteID":aa_rsid,"dateGranularity":"day","metrics":[{"id":"pageviews"},{"id":"revenue"}],"elements":[{"id":"sitesection"]}]}}
    return get_report_data(data)

def generate_xwsse_header():
    timestamp = datetime.datetime.utcnow().isoformat()[:-4] + 'Z'
    nonce = str(uuid.uuid4())
    password_digest = hashlib.sha1((nonce + timestamp + aa_password).encode('utf8')).digest()
    password_digest_base64 = str(base64.encodebytes(password_digest), 'utf8').rstrip()
    nonce_base64 = str(base64.encodebytes(nonce.encode('utf8')), 'utf8').rstrip()
    return {'X-WSSE': 'UsernameToken Username="%s", PasswordDigest="%s", Nonce="%s", Created="%s"' %
                      (aa_username, password_digest_base64, nonce_base64, timestamp)}
 
def get_report_data(data):
    url = aa_endpoint + '?method=Report.Queue'

    body = requests.post(url,data=json.dumps(data),headers=generate_xwsse_header()).json()
    reportID = body['reportID']
    return get_summarydata(reportID,0)

def get_summarydata(reportID,cnt=0):
    url = aa_endpoint + '?method=Report.Get'
    body = requests.post(url,data=json.dumps({"reportID": reportID}),headers=generate_xwsse_header()).json()
    if 'error' in body:
        if cnt==3:
            return {"error":"get_summarydata()"}
        else:
            time.sleep(2)
            cnt+=1
            return get_summarydata(reportID,cnt)
    else:
        return body

```

Report.Queue後、Getした際にnot readyのエラーが返ってきた場合は、2秒間隔で最大4回実行するようにしています。

### 困った点
・ajaxでアクセス　→ クロスドメインになるのでAccess-Control-Allow-OriginをHTTPヘッダに追加しないといけない。
*API Gatewayから簡単に設定できる。デプロイが必要と知らずになかなか反映されないなと困りました。*
CentOS 7でTorqueのセットアップ


# CentOS 7にTorqueをセットアップする際のメモ

計算サーバは１台でヘッドノード兼用とする。

主に
http://www.fiatlux.co.jp/faq/build/html/MFmyPresto_Other_Torque.html
の方法でOK。

ホスト名が設定されているか

```
$ hostname
```

で確認する。
※localhost.localdomainではダメ
※ホスト名が数字から始まっているとダメ

ホスト名からIPアドレスが引けないと問題になるので、予め設定しておいたほうが良い。
IPアドレス: 192.168.0.10
ホスト名: HostA
の場合、/etc/hostsに

```
192.168.0.10	HostA
```

を追加する。
※ループバックアドレス(127.0.0.1)ではダメ

```
# yum install -y epel-release
# yum install -y torque-client torque-mom torque-server torque-scheduler

# create-munge-key

# pbs_server -t create -f -D &
# pbs_server_pid=$!

# kill $pbs_server_pid

# echo "$HOSTNAME np=$(nproc) num_node_boards=1 numa_board_str=$(nproc)" > /var/lib/torque/server_priv/nodes
# hostname > /etc/torque/server_name
```

/var/lib/torque/mom_priv/configが

```
$pbsserver localhost
```
になっていたので、

```
$pbsserver HostA
```
に変更。

```
# systemctl start munge
# systemctl start trqauthd
# systemctl start pbs_server
# systemctl start pbs_sched
# systemctl start pbs_mom
# systemctl enable munge trqauthd pbs_server pbs_sched pbs_mom
```

下記コマンドでキューL0を設定する。
キュー名は別の名前でも良い。

```
# qmgr -c "create queue L0 queue_type=execution"
# qmgr -c "set queue L0 started=true"
# qmgr -c "set queue L0 enabled=true"
# qmgr -c "set queue L0 resources_default.nodes=1"
# qmgr -c "set queue L0 resources_default.walltime=3600"
# qmgr -c "set server default_queue=L0"
# qmgr -c "set server scheduling=true"

# qmgr -c 'p s'
```

で設定内容を確認する。

```
# pbsnodes -a
```

state = free

になっていることを確認。

※スクリプトを作って一気にやってしまっても大丈夫だが、デーモンの立ち上げ等で待たなければいけないところもあるので、適宜sleepを入れましょう。
docker-cmpose buildでnode.jsのインストール時にエラー

gnupgが必要らしい

```error:error
d -   && curl -sL https://deb.nodesource.com/setup_9.x | bash -   && apt-get update   && apt-get install -y nodejs
 ---> Running in 6c9ae273f351
E: gnupg, gnupg2 and gnupg1 do not seem to be installed, but one of them is required for this operation
```

Dockerfileに以下を追記

```Dockerfile:Dokerfile
RUN apt-get update \
  && apt-get install -my wget gnupg
```
ScalaでAWS(S3)にアクセスするライブラリ

# 概要
ScalaからS3へのアクセスする必要がありました。
しかしSDK的なものがいくつかあり、どれを使うか迷いました。
非常に主観的ですが、メモとして残します。

個人的に普通にS3にアクセスするなら、「seratch/AWScala」が良さそうだと思っています。

# 調べたツール
## seratch/AWScala
- EC2, S3, IAMなどなどのサービスアクセスに利用できるSDK
- 定番っぽいし更新が続いているので、対象に入っているサービスならこれが良いのかなという気がする
- リンク
  - https://github.com/seratch/AWScala
  - https://static.javadoc.io/com.github.seratch/awscala_2.11/0.7.1/index.html#package

## atlassian/aws-scala
- アトラシアン製というのが安心ポイント
- seratch/AWScalaとは対象サービスが異なる(個人的にはRDSが入っているのが目に入った)
- 使うと、関数型プログラミング的なコードになるらしい
- 更新も続いている
- リンク
  - https://bitbucket.org/atlassian/aws-scala

## awslabs/aws-scala-sdk
- awslabsはAWS公式(らしい)
- 最初はこれを使おうと思っていたが、2016年から更新がないのでやめた
- リンク
  - https://github.com/awslabs/aws-scala-sdk

## bizreach/aws-s3-scala
- S3専用のAPIで、基本的にはseratch/AWScalaのラッパー
- Local環境で動くS3クライアントのモック実装が付いているので、テストなどで便利という理解
- リンク
  - https://github.com/bizreach/aws-s3-scala

## AWS SDK for Java
- Scala用SDKから使えないサービスはこれを使うことになるようだ
- リンク
  - https://aws.amazon.com/jp/sdkforjava/


# 参考にさせていただいたブログ
- http://takezoe.hatenablog.com/entry/20150519/p1
jsファイルの更新が反映されない

#jsファイルの更新がサーバーで反映されない
キャッシュが残っていると更新したjsファイルの変更が反映されない

```html
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="Expires" content="0">
```

htmlではmetaタグを使用しキャッシュを無効にすればいい
jsファイルではこの方法が使用できないので他の方法を探すことに

#Cache Busting
ファイルにクエリー文字列を付加することで毎回新しいファイルとして扱わせることを海外ではCache Bustingと呼ぶらしい

``` html
<script src="./js/input.js?date=yyyymmddhhss"></script>
```

このようなクエリー文字列を追加すれば毎回読み込んでくれる
文字列を自動生成するメソッドを追加しないといけないけれど
VMRCでESXi上のサーバを直接起動して活用する

# 目的
ESXi上のVMを活用するにあたって、CLIならSSHでいいけども、Windows等をGUIで操作したいときに
RemoteDesktopや、VNCだとパフォーマンスに不満があるよ。という場合に、vSphireやWebUIから
VMware Remote Consoleを利用しますが、いちいち開くの面倒だから直接起動したい。

# ESXiのバージョンなど
### ESXi
|項目| 値|
|--------|----------|
|WebUIバージョン|1.1.0|
|ビルド番号|3731936|
|ESXi version|6.0.0|
|ESXi build number|3620759|

* 自宅ではHPのサーバを利用しているので、HP用のESXiイメージを使っています

### VMRC
|項目| 値|
|--------|----------|
|バージョン|10.0.2 build-7096020|

# VMRCのインストール
ESXi5.5以降に搭載される `WebUI` や `VMware vSphere Client` 上でホストを右クリックして
`コンソール` -> `VMRCのダウンロード` というのがあるので、それをクリックするのが最適です。
飛ばされるURLはこちらでした。
http://www.vmware.com/go/download-vmrc
インストールはそのまま各OSバージョンの物などに従ってインストールしてください。

# VMRCから起動
VMRCが入っていると、ホスト名を右クリックして `コンソール` -> `リモートコンソールの起動` ができます。
こちらを使用すると、VMware Playerで動かしたときのように、直接コンソールを操作しているカンジになり、
クライアント側に接続されたデバイスなどもそのまま転送し、利用することが可能になります。

# VMRCを直接起動（本題）
いちいちWebUI等から右クリックして開くのはめんどくさいので以下の書式でコマンドライン起動が可能です。

```console
vmrc vmrc://[esxiのログインユーザ]@[esxiサーバの接続先]/?moid=[vmid]
```
vmidはESXiで登録されているIDです。WebUIの場合は、ホスト名のリンクテキストにマウスオーバーした際のURL末尾です。
`https://hogehoge/ui/#/host/vms/20` の場合は 末尾の `20` にあたります。

`例： vmrc vmrc://root@hogehoge/moid=20`
Create React App で dotenv

# 1. ライブラリのインストール

```
yarn add dotenv
```

# 2. .env ファイルの作成

`REACT_APP_` という接頭辞を付けないと認識しない。

```bash:.env
NODE_PATH=./src
REACT_APP_API_URL=http://api.example.com
```

# 3. 読み込み

`import` 文よりも先に書くと、ルールによっては ESLint に怒られるので、無効にしておく

```javascript:src/index.js
/* eslint-disable */
require('dotenv').config()

import React from 'react'
import ReactDOM from 'react-dom'
import App from './App'
import './index.css'
import registerServiceWorker from './registerServiceWorker'

/* eslint-enable */

ReactDOM.render(<App />, document.getElementById('root'))
registerServiceWorker()
```

# 参考

`REACT_APP` という接頭辞を付けないと認識しないことに、ちょっとはまった。


- https://github.com/facebook/create-react-app/issues/865
- https://github.com/facebook/create-react-app/blob/master/packages/react-scripts/template/README.md#adding-custom-environment-variables
- https://medium.com/@danieljameskay/create-react-app-dotenv-281693a19ecd
【Unity】BGMのpitchを弄ってお手軽に雰囲気を出そう

#  **ピッチ変化でお手軽に雰囲気を出そう**
UnityのAudioSourceコンポーネントではpitchを操作することができ、ここの数値を弄るとBGMのテンポを速くしたり遅くしたりすることができます。


```C#
using UnityEngine;
using UnityEngine.UI;

public class AudioPitch : MonoBehaviour{
    public AudioSource audioSource;

    void PitchChange(){
       audioSource.pitch = 1.5;
    }

}
```

こんな感じにするとピッチが1.5になり、audioSourceに設定したBGMのテンポが速くなります。

ちなみにpitchを負の値にすると逆再生されます（以下のゲームでも使用）
https://unityroom.com/games/spaceneko

ピッチを弄るとゲームの雰囲気をお手頃に操作することができます。例えば、
・「残り10秒！」みたいな時に上げてみる
・ ゲームオーバー時にTweenさせてピッチを下げる
・攻撃が連続ヒットする度にSEのピッチを上げてみる
…などなど。
git windowsでno proxyを利用するときの注意点


はまる人が他にもいるかもしれないので

#環境
windows7
git version 2.16.2.windows.1

#現象
システムプロパティから環境変数NO_PROXYを設定しても有効にならない

#原因
有効にならないパターンがある。
他のアプリケーションだと有効なことがあるため注意が必要。

## 無効なパターン
1. ""をつける
変数名: no_proxy 変数値: "10.0.0.1"

2. ワイルドカード
変数名: no_proxy 変数値: 10.0.0.*

## 有効なパターン
""無で、明示的にipアドレスやホスト名を指定する
変数名: no_proxy 変数値: 10.0.0.1

# 余談
ワイルドカードが使えないのは不便。
仕様なのだろうか・・・？
Azure Custom Vision Serviceを使った危険物（ナイフ）検知

（＊）http://ichiyos11.hateblo.jp/entry/2017/03/27/120000
![zu5.JPG](https://qiita-image-store.s3.amazonaws.com/0/177932/3a9b1166-4f69-600d-2547-95b813dd28e1.jpeg)

#凶器の検知と持ち物検査
　現状新幹線での無差別な殺人事件があり、新幹線の持ち込み荷物をチェックするかという問題になっています。２４時間営業のコンビニエンスストアでは問題になっておりますし、過去小学校が襲われたり、バスの中で事件が起こったり等凶器の所有を検査することは物理的に難しい状況です。
　ただ、最近は監視カメラが広く普及し、現状は捜査資料としての利用がメインですが、問題が起こった時に検知できる可能性も多いにあると思います。
#Azure Custom Vision Service
 Custom Vision Serviceに物体検知機能が５月より公開されています。物体検知を作成しようとすると兎角学習に手間取る場合が多いのですが、この機能はかなり簡単に実現できるようになっています。
　このCustom Vision Serviceの応用として凶器（ナイフ）の検知を実施してみました。
##Custom Vision Serviceにアクセスする
![図１.JPG](https://qiita-image-store.s3.amazonaws.com/0/177932/251af0b6-fff9-7b06-54b1-8edca10e2afd.jpeg)
すでにアカウントをお持ちの場合は、Sign Inボタンを押していただければプロジェクト作成画面に直接は入れますし、アカウントをお持ちでなければ、試用用のマイクロソフトアカウントを作成いただき、無料で、試していただくことが可能です。
#プロジェクト作成する
物体検知を利用するため、プロジェクト作成時、Object Detectionを選択します。
![画面１.JPG](https://qiita-image-store.s3.amazonaws.com/0/177932/1f0ca9b4-d6cf-504b-c034-e23aa6263008.jpeg)
##教師データを登録し、ラベル付けを行う
教師データの登録は、Add Imagesボタンを押していただくと下記の画面が表示されるため、URLで指定するか、ローカルのファイルを選択します。複数のファイルの同時アップロードも可能です。
![zu2.JPG](https://qiita-image-store.s3.amazonaws.com/0/177932/76c368ad-9c8a-ba85-bcda-c32f7b74ba80.jpeg)
![custom vision.JPG](https://qiita-image-store.s3.amazonaws.com/0/177932/1cf08bc3-3681-aae7-b694-ad37bfbfa20f.jpeg)
教師データは刃物の写真に加えて、いくつか動画の格闘シーンから登録しました。

ラベル付けですが画面から行うことができます。画像を選択するとラベル付けの画面が表示されるので、オブジェクトの位置と、ラベル情報を入力します。Object Detectionの場合は学習データとして15枚最低必要となります。
![画面２.JPG](https://qiita-image-store.s3.amazonaws.com/0/177932/619c3bdc-047c-e3e3-b8e0-6ec10a55b1e0.jpeg)

##学習する
学習はTrainボタンを押すだけ実行できます。
![画面３.JPG](https://qiita-image-store.s3.amazonaws.com/0/177932/43c239e9-3b3b-5605-4ad4-84c4eb124208.jpeg)

##テストする
Quickテストを使うと簡単に評価することができます。
![画面４.JPG](https://qiita-image-store.s3.amazonaws.com/0/177932/a493894c-56d7-5d6e-c2c4-a13424f71792.jpeg)

（＊）画像はhttps://plaza.rakuten.co.jp/greatest29/diary/201206130000/
[Django] プロジェクト構成のベストプラクティスを探る - ２．設定ファイルを本番用と開発用に分割する

##この記事について

Djangoで本番運用やチーム開発を行うに当たって、プロジェクトの初期構成にどのように手を入れたらよいかを、[The Twelve Factors](https://12factor.net/ja/)などを参考にまとめたメモです。

参考：

- [The Twelve Factors](https://12factor.net/ja/)
- [Two Scoops of Django 1.11] (https://www.amazon.co.jp/dp/0692915729)
- [cookiecutter-django](https://github.com/pydanny/cookiecutter-django/)
- [Django の settings を切り替えるようにした話](https://qiita.com/ukisoft/items/8912d0a66151609d9ff9)
- [Django の設定ファイル settings.py の環境毎の切り替え方法について検討する](https://leben.mobi/blog/python_django_settings/python/)
 
##設定ファイルの分割の目的

### 問題点

Djangoの設定ファイルを本番用と開発用に分ける方法としては`local_settings.py`を使う方法がよく紹介されます。

参考：https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/deploy/

しかし、[Two Scoops of Django 1.11] (https://www.amazon.co.jp/dp/0692915729) ではこの方法に以下の問題点があると指摘しています。

- 設定が増えてくると本番環境と開発環境の設定の違いがわかりづらい。
- 開発環境の設定（`local_settings.py`）がリポジトリに無いので、開発ノウハウが開発者個人に留まり共有されない。

Djangoのベストプラクティスを集めたテンプレート出力ツール「cookiecutter-django」では、本番用と開発用の両方の設定ファイルを作成し、起動スクリプトでどちらを呼ぶか指定する方法を採っています。今回はこれを手法を模倣します。

## 設定方法

初期構成から変更を加えるファイルは以下の通りです。
設定ファイルを読み込む場所はプロジェクト内で２か所なので、そこを本番用と開発用に分けてしまうという方針です。

```tree
base_dir
  ├ manage.py               # [更新] 開発環境の起動スクリプト
  └ config
      ├ wsgi.py             # [更新] 本番環境の起動スクリプト
      └ settings            # [新規] 設定ファイルディレクトリ
          ├ __init__.py     # [新規] 
          ├ base.py         # [新規] 共通設定 ※元のsettings.pyを使う
          ├ local.py        # [新規] 開発環境設定
          └ production.py   # [新規] 本番環境設定
```

##作業手順

### 手順１

まず元々の設定ファイル`settings.py`のあるディレクトリにsettingsディレクトリを作ります。

### 手順２
ディレクトリ「`settings`」に`settings.py`を移動して、ファイル名を`base.py`に変更します。

### 手順３

`base.py`の最初の方の`BASE_DIR`の指定を編集します。設定ファイルの場所が１階層深くなるので入れ子を一つ増やします。


```python:project/settings/base.py
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# ↓↓
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
```

※ django-environを使って以下のようにもできます。

```python
import environ
ROOT_DIR = environ.Path(__file__) - 3
```

### 手順４

個別設定になる項目を共通設定より削除します。

個別設定の例：

- DEBUG：デバッグフラグ（開発：Ture / 本番：False）
- DATABASE：データベース接続
- MEDIA_ROOT等：ストレージ設定
- STATIC_ROOT：静的ファイル配置
- LOGGING：ログ出力

### 手順５

新規に開発用設定ファイル（local.py）と本番用設定（production.py）ファイルを作ります。ファイルの先頭には共通設定ファイルへの参照を記述します。

```python
from .base import *
```

その後、それぞれの個別設定を追加します。

※ 共有設定の項目（配列）に追加する場合は以下の様にする

```python:config/settings/local.py
INSTALLED_APPS += (
    'debug_toolbar', # and other apps for local development
)
```

### 手順６

起動スクリプトとなる manage.py（開発用）とwsgi.py（本番用）の設定ファイルの指定箇所をそれぞれ変更します。

変更前

```python:manage.py,wsgi.py共通 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")
```
変更後

```python:manage.py
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local")
```
```python:config/wsgi.py
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.production")
```

##注意点

本番環境でmanage.pyコマンドを実行する場合は、あらかじめ環境変数`DJANGO_SETTINGS_MODULE`に`config.settings.production`を設定するか、manage.pyの起動オプションに`--settings config.settings.production`を指定する必要がある。

例：Heroku

```shell
heroku config:set DJANGO_SETTINGS_MODULE=mysite.settings.production
```
[VCCW2.x] XHProfを追加する

phpの拡張モジュールのXHProfをVCCWの環境に追加しました。その備忘録です。
＊現在はVCCWの3系がメインなので、あまり使う場面は無いかもしれないです。

## 環境
| CentOS | 6.7 |
|:-:|:-:|
| PHP | 5.4.45  |
| VCCW | 2.21 |

## XHProfのインストール
### PEARでインストール
PHPの拡張ライブラリであるPECLを利用してインストールします。

```
$ sudo yum -y install php-pear
$ sudo pecl install channel://pecl.php.net/xhprof-0.9.4
```

### php.iniの編集

```/etc/php.ini
[xhprof]
extension=xhprof.so
xhprof.output_dir="/var/log/xhprof/"
```

php.iniでアウトプットディレクトリとして指定した場所に
ディレクトリを作成します。

```
$ sudo mkdir /var/log/xhprof/
$ sudo chmod 777 /var/log/xhprof/
```

### phpinfo で確認

```[document_root]/phpinfo.php
<?php phpinfo(); ?>
```
<img width="1101" alt="phpinfo" src="https://qiita-image-store.s3.amazonaws.com/0/10263/a5932254-cf3e-a7ea-4f7f-1ad6a6cc6b82.png">


## 参考
[xhprofを使ってみた（インストール編）](https://qiita.com/ttsan/items/6816772143cf2ddacef5)
[XHProfでPHPを解析する](https://tech.akat.info/?p=1197)
Pythonでランダムの値を出す

メモ用です

```py
import random
random.randint(50, 100)
```

50と100の間のランダム値を出す

![スクリーンショット 2018-06-11 15.33.13.png](https://qiita-image-store.s3.amazonaws.com/0/251595/314715c6-23c4-f418-a4d3-70249d63f2e4.png)
Mediapartners-Google からのクローリングがエラーを起こして無言で帰っていく

弊社サイト [あなたのマイスター](https://yourmystar.jp/)のアプリケーションログを確認していると、定期的にエラーが発生していたので、その調査の過程で Mediapartners-Google が何者かを明らかにしたの備忘のためにメモ。


# TL;DR

- Mediapartners-GoogleはAdSense広告を掲載しているサイトを見に来てる
- 認証が必要なページに対してエラーが起きてても悪影響はない
- robots.txtとかで適切にはじいてあげましょう
    - [触らぬ神に祟り無し](https://productforums.google.com/forum/#!topic/adsense-ja/GkwvGeBKiFI)的な風潮もある

# 背景

弊社サイト [あなたのマイスター](https://yourmystar.jp/)の注文フォームでたまにエラーが起きていた。
ログを見てみると、数秒前にお客様へは200ステータスでレスポンスは返却できている。

※ログのイメージ

```
08/May/2018:11:31:41  status:200  uri:/xxxxxxx/yyyyyyyy  ua:Mozilla/5.0 (iPhone; CPU iPhone OS 11_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.0 Mobile/15E148 Safari/604.1
08/May/2018:11:31:42  status:400  uri:/xxxxxxx/yyyyyyyy  ua:Mediapartners-Google
```

このエラーを解消するにはどうしたらよいか、が調査の起点になっている。

# User Agent を調べてみた

`Mediapartners-Google`

参考：https://support.google.com/webmasters/answer/1061943?hl=ja

- Google Adsense のクローラーの一種で、AdSense広告を掲載しているサイトを見に来る
- サイトを評価するのが目的だが、いわゆるGoogleの検索順位とは無関係のため、SEOとは関連がない
- 関係があるとすれば、AdSense広告収入の単価が変わってくるだろう

# もう一度ログをあさってみると

- UAが `Mediapartners-Google` のアクセスは注文フォームに限らず広範囲かつ頻繁に起きていた
- 画面を触りながら検証した結果によると、
    - ユーザーが閲覧する直後にMediapartners-Googleからのアクセスを「呼び水」する
    - 一度呼び水をしたら、その後リロードしても「呼び水」しない制限は入っている

おそらくMediapartners-Googleが見たいのは、サイト全体のページだろうと予想されるので、まだMediapartners-Googleがクロールしたことがないページがあれば、「呼び水」に応じるというサーバーサイドの処理があると予想されます。

よって、認証が必要なページ等へのリクエストは必ず認証エラーとなりますのでMediapartners-Googleに対してはエラーレスポンスが返されるというのが繰り返される、という状況でした。

おそらく、これからもこの状態は解消されないと思うので、よっぼど邪魔になりそうだったら、robots.txtとかで制限かけていこうと思います。（ただし、できるだけ触らないほうがいいと言っている人が多く、ちょっと怖い）

# 参考ページ
- Mediapartners-Googleとは？
https://upblo.com/contents/?id=10030
railsでtitleを各ページ個別に動的に生成する方法

##なぜタイトルを動的に生成するのか
google検索の結果は基本的にtitleを参照しているため、
その部分にページ個別の内容を使いたかった。

検索時にもtitleの中身が表示されているはず。

##1, application.html.haml

title部分を以下で置き換え

```haml:application.html.haml
    %title
      = page_title
```
##2, application_helper.rb

以下を追加。


```ruby:application_helper.rb
  def page_title
    title = "なろはい" #デフォルトのタイトル
    title = title + "：" + @page_title if @page_title
  end
```

##3, show.html.haml (タイトルを個別で作成したいところを入力)

以下を追加。
ハイフンも必要なので注意。

ここでは@topicで渡した変数からtitleを取得している。

```haml:show.html.haml
- @page_title = @topic.title
```
Firebirdで、テーブルのSelect結果をストアドプロシージャに渡しJoinして返す

# 準備
## サンプルテーブル

```sql
create table T (
  X1 integer not null,
  constraint T_PK primary key (X1)
);
```
## サンプルデータ投入

とりあえず20件ほど

```sql
insert into T
with recursive V_SEQ as (
  select 1 as X1 from rdb$database
  union all
  select X1+1 from V_SEQ
  where
    X1 < 20
)
select * from V_SEQ;
commit;
```

## テスト用ストアドプロシージャ定義

ひとつ前と次の整数値を返すだけのストアドプロシージャ

```sql
set term # ;
create procedure f(X1 integer)
returns (X_PRED integer, X_SUCC integer)
as
begin
  X_PRED = X1-1;
  X_SUCC = X1+1;
  suspend;
end#
set term ; #
```

# 方法解説

以下のように、そのまま直積取ってもエラーになります

```sql
select * from T
cross join f(T.X1)
```

> Invalid request BLR at offset 32
> Procedure F is not selectable (it does not contain a SUSPEND statement)
> ステートメント: select * from T
> cross join f(T.X1)

ではどうすればよいかといえば、外部結合を使います。

```sql
select * from T
left outer join f(T.X1) on 1=1
```

on 以降は等価結合になれば、なんでもいいです。

ちゃんととれました。

```
          X1       X_PRED       X_SUCC
============ ============ ============
           1            0            2
           2            1            3
           3            2            4
           4            3            5
           5            4            6
           6            5            7
           7            6            8
           8            7            9
           9            8           10
          10            9           11
          11           10           12
          12           11           13
          13           12           14
          14           13           15
          15           14           16
          16           15           17
          17           16           18
          18           17           19
          19           18           20
          20           19           21
```

Firebird 2.1系と2.5系で試しましたが、おそらく2.0系でもいけるとおもいます（希望的観測）

# 元ネタ

[How to JOIN a table and selectable stored procedure?](http://www.firebirdfaq.org/faq143/)
【Vue.js】 Element UIのレイアウトコンポーネントをhtmlファイルで使いたい（Rails + Webpacker + Vue.js）

#概要：Element UIではコンパイルが必要である。
Vue.jsとRailsを使用して、webアプリを作成しているが、UIライブラリとしてElement UIを採用した。
Element UIはbootstrapやbootstrap-vueなどと比べてデザインが非常に自分好みかなり気に入っている。コンポーネントの機能に関してもかなり充実している。

しかし、コンパイルが必要である等、いろいろ複雑な点もあり苦労している。

自分の現状としては、コンパイルに関してよく理解していない。
特にRailsにwebpackerを使ってvueを導入したため、自動でコンパイル関係の設定をやってくれたため、どこでコンパイルが必要で、どのタイミングでコンパイルが行われるのかよくわかっていない。
そもそも、コンパイルの意味を誤解しているかもしれない。
そのうえで、どうしたらhtmlに直接Elementを書けるのかを考えた結果がこの記事である。

#問題：htmlではコンパイルされない？
アプリの開発に当たってはVue.jsのメリットを最大限に生かすべく*.vueファイルを活用してコンポーネントを積極的に行っているが、いろいろな都合があり、レイアウトに関してはhtmlで行いたい。
vueファイルでコンポーネントを作り、view（html）ファイルに組み込み、レイアウトはそのhtml上で行うということである。

Element UIには、bootstrapのようにレスポンシブなレイアウトを書く機能がある。
bootstrapではhtml上のタグのclassにレイアウトを書くが、Elementでは、vueファイルにレイアウトをタグそのものとして書き、それがコンパイルされてhtmlに反映される。

そこで、問題は発生した。
html上にElementのタグを書いてもコンパイルしてくれないのだ。（そりゃ、当たり前か...）

Element UIでのレイアウトの記述方法は以下の通りである。

```vue:sample.vue
<el-row type="flex">
  <el-col :span=12></el-col>
  <el-col :span=8></el-col>
  <el-col :span=4></el-col>
</el-row>
```
Elementはbootstrapと違い、レイアウトの指定をclassではなく、タグ自体で表現する。
なので、これをhtmlに適用させるにはコンパイルをする必要がある。
上記の様なタグ```<el-col>```をhtmlに書いても反応してくれない。
そこがbootstrapなどのcssフレームワークとの違いで、難しいところ。

#解決策：タグをclass名に変換して書く！
そこで、考えた解決策がElementがコンパイルされた後のタグを書く方法である。
Elementでレイアウトを作ると、それはclass名に変換されるので、最初から、変換されたものを書くということ。
上記のレイアウトの例だと、以下の通りになる。

```html:sample.html
<div class="el-row el-row--flex">
  <div class="el-col el-col-12"></div>
  <div class="el-col el-col-8"></div>
  <div class="el-col el-col-4"></div>
</div>
```
タグよっては変化の法則に例外はあるが、規則性がある。
（```<el-container>```は```<section class="el-container">```になるなどが少し例外）

このように、htmlファイルにElementを適用させるときには変換後のタグを調べて、classに書けば何とかなる。
こうすれば、ほとんどbootstrapと同じ感じで使える。

ならば、レイアウトにはbootstrapを使えばいいじゃん！とも思い試してみたが、それは大問題が発生した。
Elementで使用するclass名とbootstrapで使用するclass名が競合してしまい、Elementのコンポーネントのデザインがめちゃくちゃになってしまった。

なので、上記の通り、Elementのタグをclass名に変換して書く方法を採用することにした。
この方法が、スマートであるかは分からない。
そもそも、コンパイルについてしっかり理解して、設定をうまくできれば、htmlにも直接Elementが使えるのかもしれない。
詳しい人がいましたら、コメントで教えていただけると助かります。

#おまけ
レイアウトまでvueファイルで作ればいいじゃん！思った（というか最初はそうやって書いていた）がそうすると、ファイルの構成が｛vueコンポーネント→vueコンポーネントをまとめたコンポーネント→html｝という3段構成になり、データの受け渡しとかでいろいろ複雑になってしまうので、レイアウトはhtmlで書きたいと思ったのが、この記事のきっかけです。

#感想
RailsもElementもBootstrapも便利で機能モリモリのフレームワークが増えて私のような未熟者でもアプリやデザインが簡単に作れるようになっているが、その故に、内部でどんな処理が行われているかの把握は困難（知らなくてもどうにかなってしまう）になっている。
しかも、それぞれが高性能なために複数のフレームワークを同時に使うと競合してしまったりしてしまう。
なので、まずは、ライブラリやフレームワークに頼りすぎずに基礎となる知識をしっかり学ぶことが大事であると痛感させられました。
Golang の echo を使う (template)

echo で template を使う例です。
次のページを参考にしました。
[【Go】Echoでのテンプレート(html/template)の使い方メモ](http://kimagureneet.hatenablog.com/entry/2017/01/12/210553)

次のようにファイルを配置します。

```text
├── server.go
└── views
    ├── header.html
    └── page1.html
```

```golang:server.go
// ---------------------------------------------------------------------
/*

	server.go

						Jun/11/2018
*/
// ---------------------------------------------------------------------
package main

import(
  "html/template"
  "net/http"
  "io"

  "github.com/labstack/echo"
)

type Template struct {
  templates *template.Template
}

// ---------------------------------------------------------------------
func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
  return t.templates.ExecuteTemplate(w, name, data)
}

// ---------------------------------------------------------------------
// サイトで共通情報
type ServiceInfo struct {
  Title string
}

var serviceInfo = ServiceInfo {
  "サイトのタイトル",
}

// ---------------------------------------------------------------------
func main() {

  t := &Template{
    templates: template.Must(template.ParseGlob("views/*.html")),
  }

  e := echo.New()

  e.Renderer = t

  e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "こんにちは!")
	})

  e.GET("/page1", func(c echo.Context) error {
    // テンプレートに渡す値

    data := struct {
      ServiceInfo
      Content_a string
      Content_b string
      Content_c string
      Content_d string
    } {
      ServiceInfo: serviceInfo,
      Content_a: "雨が降っています。",
      Content_b: "明日も雨でしょうか。",
      Content_c: "台風が近づいています。",
      Content_d: "Jun/11/2018",
    }
    return c.Render(http.StatusOK, "page1", data)
  })

  e.Logger.Fatal(e.Start(":1323"))
}

// ---------------------------------------------------------------------
```

```html:views/header.html
{{define "header"}}
  <h1>{{.ServiceInfo.Title}}</h1>
{{end}}
```

```html:views/page1.html
{{define "page1"}}
  {{template "header" .}}
<blockquote>
  <div>{{.Content_a}}</div>
  <div>{{.Content_b}}</div>
  <div>{{.Content_c}}</div>
  <div>{{.Content_d}}</div>
</blockquote>
{{end}}
```

サーバーの起動

```bash
go run server.go
```

クライアントで、
>http://localhost:1323/page1
にアクセスします。
![echo_jun1102.png](https://qiita-image-store.s3.amazonaws.com/0/179446/1552c229-66dd-c621-053c-c544ef7e4b48.png)

次のバージョンで確認しました。

```text
$ go version
go version go1.13.6 linux/amd64
```
よくある力技O(n^3)らしい回文検出 / すべての部分文字列の検出

スクラッチパッドでささっと

```js
var text = document.documentElement.textContent
text = text.replace(/\s|\n/g, '')
//console.log(text)

var kaibun = '' // ローマ字！
for (var i = 0; i < text.length; i++) {
  var before = i - 1
  var after  = i + 1
  if (before == -1 || after == text.length) {
    continue;
  }
  
  // 真ん中が同じ2文字なタイプの回文の場合は？3文字は1文字の場合で検出できそうだから、1になっても3になってもいいのか？
  if(text[i] == text[before]) {
    --before
  }
  if(text[i] == text[after]) {
    ++before
  }

  while(text[before] == text[after]) {
    kaibun = text.substring(before, after + 1)
    //console.log('回文',kaibun) // 回文の部分回文なので最長になるまでは回文としない
    --before
    ++after
    if (before == -1 || after == text.length) {
      break;
    }
  }
  
  // 面白いものがほしいので日本語&長さ制限をつける
  if (kaibun != '' && kaibun.length >= 5 && kaibun.match(/[\u30a0-\u30ff\u3040-\u309f\u3005-\u3006\u30e0-\u9fcf]/) /* 日本語を含んでいる */) {
    console.log(kaibun)
    kaibun = ''
  }
}
```

推敲・検証なし。

作ってから他のコードをちらちら見ると、もっと変数数も少なくて判定もスマートで凹む。

日本語遊びは結局漢字をひらく(やカナもひらがな化)部分がネックになって、回文や575検出などは詰まってしまいます。
英文だけでは面白くないですしね…。

***

[回文 - Wikipedia](https://ja.wikipedia.org/wiki/%E5%9B%9E%E6%96%87)
で実行すると

```
ともついにいつもと
五・七・五
わかみかものとかなかとのもかみかわ
んどこどん
いた（たい
たいもくよとんとことんとよくもいた
かな（なか
かしみしか
なかしみしかししかしみしかな
かしみしか
みなくさのなははくとしれくすりなりすくれしとくははなのさくなみ
たのむそのいかにもにかいのそむのた
さかのなはやとりたりとやはなのかさ
の世しばしよしばし世の
よしはしよ
はかなのよしはしよしはしよのなかは
よしはしよ
にわのわに
まさかさかさま
たび浴びた
アニマルマニア
サ・カ・サ
せとちとせ
しぶいぶし
こたつたこ
スキトキメキトキス
12月21
アニマルマニア
んだ(だん
だんしがしんだ
```



# 参考

* [回文に親しもう - pixiv inside \[archive\]](https://devpixiv.hatenablog.com/entry/2014/12/22/184143)
* [回文を列挙する - Qiita](https://qiita.com/Shiho_tksam/items/17ed870cd4c8c0f1f478)

* [javascript 日本語チェックです - Qiita](https://qiita.com/graminume/items/2ac8dd9c32277fa9da64)
* [回文 - Wikipedia](https://ja.wikipedia.org/wiki/%E5%9B%9E%E6%96%87)
pathlibのjoinを使わずパスを追加する時に拡張子を固定したい

こんなマニアックな使い方をする人がいるか分からないけど、備忘録

``` expansion.py
from pathlib import Path

path = Path('任意のパス')
dirname = path.parent  #フルパスが欲しい場合はpath.resolve().parentでも取れる
filename = path.stem  #拡張子を除いたファイル名を取得

Path(dirname) / '{}.ext'.format(filename)  #.extはいい感じに
```

説明用にdirnameやfilenameにPathを使っているけど、実際はstrを想定。
こんな面倒な事をしなくてもいいはずなんだけど、方法が見つからなかった。

# 参考
<a href="https://docs.python.jp/3/library/pathlib.html">pathlib — オブジェクト指向のファイルシステムパス(Python.org)</a>

# 読了後いいね！をお願いします。
どれだけの方に読んでもらっているか知りたいので、お手数をおかけしますがご協力いただけると嬉しいです。
Rails:[Don't know how to build task 'db:']の対処方法

#はじめに
初歩的なエラーかと思いますが、私が初心者のため備忘録を含め記録として残したいと思います。


#結論:`rails db: migrate`ではなく、`rails db:migrate`を実行する。

ターミナルで`$ rails db: migrate`と入力した際に以下のエラーが返ってきました。

```Swift:ターミナル
rails aborted!
Don't know how to build task 'db:' (see --tasks)
/usr/local/rvm/gems/ruby-2.4.1/gems/railties-5.0.7/lib/rails/commands/rake_proxy.rb:14:in `block in run_rake_task'
/usr/local/rvm/gems/ruby-2.4.1/gems/railties-5.0.7/lib/rails/commands/rake_proxy.rb:11:in `run_rake_task'
/usr/local/rvm/gems/ruby-2.4.1/gems/railties-5.0.7/lib/rails/commands/commands_tasks.rb:51:in `run_command!'
/usr/local/rvm/gems/ruby-2.4.1/gems/railties-5.0.7/lib/rails/commands.rb:18:in `<top (required)>'
bin/rails:4:in `require'
bin/rails:4:in `<main>'
(See full trace by running task with --trace)
```

#`rails db: migrate`ではなく、`rails db:migrate`を実行することで解決。


```Swift:solved
rails db:migrate
```

ご参考になれば幸いです。
Pythonでサーバークライアント通信を実装してみた【TCP】


#ソケットプログラミング
サーバークライアント通信方式を採用し、クライアントとサーバー間のチャットを実装しました。
socketというライブラリを活用すると、特に不自由なく動かせました。
1024バイトずつデータを受信します。

```
self.socket.listen(1)
```

が無いと、ノンブロッキングのように接続を待たずに、処理を始めてしまうので、今回はエラーを吐くのでご注意。

サーバー側のプログラム

```Python:server.py
"""This is a test program"""
import socket

class Server:
    """Server側のクラスを設定"""
    def __init__(self, server_ip, server_port):
        """初期化関数"""
        #ソケットを設定
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        #ブロッキングモードに設定
        self.socket.setblocking(True)

        self.socket.bind((server_ip, server_port))
        self.socket.listen(1)


    def start(self):
        """実行関数"""
        client, addr = self.socket.accept()
        print("connection_by" + str(client))

        while True:
            data = input("server>").encode()
            client.send(data)

            data = client.recv(1024).decode()
            print("crient>", data)

            if not data:
                client.close()
                break

ip = input("ip:")
port = int(input("port:"))
server = Server(ip, port)
server.start()
```

クライアント側のプログラム

```Python:client.py
"""This is client.py"""
import socket

def main():
    """This is a program when it comes to crient"""
    socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    ip = input("ip:")
    port = int(input("port"))
    socket.connect((ip, port))

    while 1:
        data = socket.recv(1024).decode()
        print("server>", data)
        data = input("crient>").encode()
        socket.send(data)

        if not data:
            socket.close()
            break

if __name__ == '__main__':
    main()

```


#おまけ
##pylintで文法に関する数々のエラーが出たので

①モジュールや関数に関する説明書きが無い

```
Missing module docstring
Missing function docstring
```

②変数が短すぎ

```
Variable name "s" doesn't conform to snake_case naming style
```

③whileのあとのカッコの必要なし

```
Unnecessary parens after 'while' keyword
```
弟にAPIについて説明したのだが。

# 弟にAPIについて説明したのだが

昨日の出来事

弟「APIってなに？」

兄「アプリケーションプログラミングインターフェースの略」

弟「アプリケーションプログラミングインターフェースってなによ。」

兄「うーん。。」

# APIってなに？

「API」この用語はIT界隈にいるとよく聞くことになるが、その使われ方が色々ありすぎて最初のころは戸惑った。なので弟に説明した内容をここにも書いときます。

## Wikipediaには

> アプリケーションプログラミングインタフェースとは、広義の意味ではソフトウェアコンポーネントが互いにやりとりするのに使用するインタフェースの仕様である。 APIには、サブルーチン、データ構造、オブジェクトクラス、変数などの仕様が含まれる。　（wikipedia参考）

wikipediaには上のように書いてあります。しかし正直言って全く想像がつかないです。

## APIって何するものなの？

APIというのは何かをするものを表すのではなく何かをするもののスイッチみたいなもののことを言います。

なのでプログラムという範囲から離れれば、部屋の電気をつけたり、消したりするスイッチもAPIと言ってもいいでしょう（注：プログラムではないですが）。

部屋の電気をつけたり消したりするスイッチは押されることで「部屋の電気をつけたり消したりする機能」が動き出すわけです。

このように何かの動作を動かす際のとっかかりの部分をインターフェースと呼ぶわけです。

## APIを提供するって何？

じゃあAPIを提供するということはどうゆうことなのでしょうか？

先の部屋の電気の例で言えばスイッチが部屋の電気をつけたり消したりする機能を呼び出すために提供されていると考えられます。

## 実際にプログラムとしてはどうなっているの？

実際にプログラムに落として理解してみましょう。

```

├── api
│   └── Add.go
└── app.go
```

このような感じでディレクトリを作ってみました。

今回では以下のような機能を作ってみます

```
//api/Add.go

package api

//こっちがAPIとなる
func API(x int, y int) (int) {
  return add(x, y)
}

//これが機能
func add(x int, y int) (int) {
  return x + y
}

```

この例でいうと`add`という関数のインターフェースとして`API`という関数を作ってます。

> 注意：goがわからない方へ。
> goでは関数名の一番最初の文字が大文字の場合のみ他のファイルで呼び出すことができます。ですのでこの例ですと、add関数は直接他のファイルから呼び出すことはできないのです。

```
//app.go

package main

import (
  "fmt"
  "./api"
)

func main() {

  x := 3
  y := 9

  fmt.Printf("x : %d\n", x)
  fmt.Printf("y : %d\n", y)

  //ここでAPIを利用しています。
  sum := api.API(x, y)

  fmt.Printf("sum: %d\n", sum)

}
```

こちらでは提供されているAPIを利用しています。引数に整数型を二ついれて、`API`という関数を呼び出せば`add`関数が使えるようになっているのです。

実際に動かすと

```
x : 3
y : 9
sum: 12
```

こうなります。

### あれ、でもこれライブラリを利用してるだけじゃない？

そうなのです。だからAPIというのはわかりにくいのです。APIというのはいわゆる抽象名詞になるのでこれといったものがないのです。

だから、例のようにある機能を使う際の呼び出しのポイントと呼び出す際のルールのことをAPIであるという風に考える必要があるのです。

> 「ある機能を使う際の呼び出しのポイントと呼び出す際のルールのことをAPI」
> プログラム上では`api.API`で、ルールは整数の引数が２個という風になってます。

# 俺の知ってるAPIはURLがウンタラカンタラ

弟「えー、でも俺の知ってるAPIはURLを使ってなんかやれって言われたよ。」

兄「URLも一つのAPIになるんだよ。」

web系の人が思い浮かべるAPIはこっちのパターンが多いでしょう。URLも一つのAPIの形なのです。

```
# request
GET http://sample.com/users
```

```
# response
[
  {
    "name":"兄"
  },
  {
    "name":"弟"
  }
]

```

このような形でAPIは提供されていると思います。これがなんでAPIと言えるのでしょうか？

難しいことは考えずに単純に考えてみてください。

```
# request
GET http://sample.com/users
```

言ってしまえば、このURLは一つのルールになってます。sample.com/usersとやればさっきのレスポンスが返って来るわけですから。このURLを覚えとけばこのレスポンスは必ず受け取れるのです。

# まとめ

弟「うーん。まあなんかの機能使うときの決まりごとのことをAPIって呼ぶってことでいいの？」

兄「それでおk」

・・・・

読んでくれた方の理解の少しでも助けになれば幸いです。ありがとうございました。


# 補足

## APIを叩くって何？

「叩く」というのは「利用する」と同じ意味と考えて大丈夫です！

## APIサーバーって何？

APIサーバーはさっきのURLの例のように、あるURLでリクエストを受けたときに、なんらかの処理を起こして規定のレスポンスを返すサーバーになります。
axiosを使ってfile属性をPUTで投稿



axiosを使ってfile属性をPUTで投稿

[注意]
・FormData()を利用してfile属性を取得する
・POSTで送って、PUTで上書きする


```javascript

// 呼び出すAPIのURL
        let api_url = 'http://127.0.0.1:8080/';

// file属性にidをつけ、そのidを取得する
        let element = document.getElementById("image_file_path_update_id");

// fileをputもしくはpostしたい場合はFormDataを使用する
// FormDataをせずに送った場合、valueにファイルのパスを指定して送っているので注意する
        let data = new FormData();
// FormDataにimage_file_pathをキーとして、ファイルを追加する
        data.append('image_file_path', element.files[0]);


        // 非同期通信 axios
        axios({
// POSTを指定する
            method: 'POST',
//　APIのURLを指定
            url: api_url,
            headers: {
//　ファイルを送れるようmultipart/form-datを指定する
                'Content-Type': 'multipart/form-data',
// ここでPUTに置き換える
                'X-HTTP-Method-Override': 'PUT',
            },
// ファイルが入ったデータ
            data: data,
        })
            .then(response => {
                console.log('成功');

            })
            .catch(error => {
                console.log('失敗');
            })

```
エクスプローラーを改造する

# エクスプローラー

ついにここまで手が入ってしまいました・・・
前回[「ファイル名を指定して実行」を改造](https://qiita.com/RAWSEQ/items/54fd6b8dc99ad5fc5f1c)しましたが、それを流用して今回はエクスプローラのアドレスバーも同じようにできないか試してみたら、うまくはまったのでご紹介いたします。

![ee1.gif](https://qiita-image-store.s3.amazonaws.com/0/65983/29c52b9f-da0b-6e2f-c2fe-d0aa323d656e.gif)

<kbd>/</kbd> で次の階層移動(￥)と <kbd>Tab</kbd>, <kbd>Shift + Tab</kbd> でサジェスト移動（↑↓）しています。
これで玄人っぽい動きができるでしょう。

こちらも[スクリプトファイル一枚](https://github.com/RAWSEQ/ee-explorer-extension/blob/master/ee.ahk)でできています。

EE Explorer Extension
https://github.com/RAWSEQ/ee-explorer-extension

## 利用方法

- 上記リポジトリを取得し、「ee.exe」を起動する。（※SmartScreen(水色のウィンドウ)が表示される場合があります。その場合は「詳細情報」から続行できます。）
- エクスプローラ上で<kbd>/</kbd>を押すと発動。

# ショートカット機能

こちらも健在。**ショートカットをショートカットする機能**

![ee2.gif](https://qiita-image-store.s3.amazonaws.com/0/65983/851a2461-512a-1cdd-e2f0-33860ec1ce62.gif)

ショートカットで <kbd>/</kbd>

# フォルダ作成機能

フォルダを作成。エクスプローラで実行できるので、より手軽で便利になりました。

![ee3.gif](https://qiita-image-store.s3.amazonaws.com/0/65983/ba5da0f9-96fe-79e0-fd57-e16dd95871ce.gif)

<kbd>Ctrl + S</kbd> で、日付入力、 <kbd>Ctrl + D</kbd> 入力したパスでフォルダ作成。

# 注意

Windowsのバージョンアップで利用できなくなる場合があります。あくまで、「ちょっとしたスクリプトでWindowsはもっと便利になる」という事を紹介する企画になります。
iDracのリモートコンソールが起動できない場合の対処



DellのR220サーバーにリモートコンソールで接続しようとしたが、セキュリティエラーで接続できない場合の対処法

#環境
クライアント
-MacOSX Sierra
-Java 8

サーバー
-Dell R220II
-iDRAC6

#対処
1. Javaのコントロールパネルからホスト名またはIPアドレスを例外追加する
2. javaのセキュリティ設定ファイルの内容を更新する

/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/java.security
から下記の設定をコメントアウトする
jdk.jar.disabledAlgorithms=
jdk.tls.disabledAlgorithms=

＊）最初jarだけコメントアウトしたが、tlsのほうもコメントアウトしないと起動できなかった
【2018年最新】画面共有ツールを徹底比較！

リモートワークをする機会が多くなってきたので、その場でアイデアをカンタンに共有することができるツールをまとめてみました。

# wimy
https://wimy.design/

長所：
・無料
・ブラウザのみで利用可能
・ログインも必要なく、リンクのコピー＆シェアだけですぐに使うことができる
　Skypeのようにログインが前提のサービスだと面倒に感じるときはこれ一択。
・複数人で使うこともできる。

短所：
・音声通話に対応していないこと。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/5805/725a3853-22e8-0098-c9ac-fe9f4781a95c.png)

# Zoom
https://zoom.us/jp-jp/feature/share.html

長所：
・モバイル画面の共有ができる
・コンテンツ共有をデバイスをまたいで行うことができる
・本格的なビジネス向け（BtoBがメインか）

短所：
・複数人で使うと有料
・インストールがめんどい
・使い方を覚えるまでに少し時間がかかる

# Screenleap
http://www.moxbit.com/2012/10/screenleap-review.html

長所：
・無料
・ブラウザだけで画面共有可能

短所：
・Javaが必要。インストールめんどい。
・日本語対応してない
とあるフロントエンドエンジニアのchrome拡張機能


フロントエンドエンジニアのみなさんはどんな拡張機能を使っていますか？
オススメはありますか？

今回は個人的に使っているchrome拡張機能をざーーーっとご紹介。

## 拡張機能

### はてなブックマーク
https://chrome.google.com/webstore/detail/%E3%81%AF%E3%81%A6%E3%81%AA%E3%83%96%E3%83%83%E3%82%AF%E3%83%9E%E3%83%BC%E3%82%AF/dnlfpnhinnjdgmjfpccajboogcjocdla

記事を後で読むために保存したり、
検索結果ページでどれくらいブックマークされている記事なのかチェックして情報の信用度の参考に
そして、情報リテラシーのサポートに。

### WhatFont
https://chrome.google.com/webstore/detail/whatfont/jabopobgcpjmedljpbcaablpmlmfcogm

なんのフォントだろうな。確認用。

### Website IP
https://chrome.google.com/webstore/detail/website-ip/ghbmhlgniedlklkpimlibbaoomlpacmk

ここのIPなんだろうな。IPアドレスの確認用。

### Wappalyzer
https://chrome.google.com/webstore/detail/wappalyzer/gppongmhjkpfnbhagpmjfkannfbllamg

サイトで使っているCMSやアクセス解析など使われているツールをのぞき見。

### The QR Code Extension
https://chrome.google.com/webstore/detail/the-qr-code-extension/oijdcdmnjjgnnhgljmhkjlablaejfeeb

サクッとQRコード生成してレスポンシブの実機確認。

### PerfectPixel by WellDoneCode
https://chrome.google.com/webstore/detail/perfectpixel-by-welldonec/dkaagdgjmgdmbnecmcefdhjekcoceebi

ピクセルパーフェクトなページになっているか確認できる便利な機能。

### Page Ruler
https://chrome.google.com/webstore/detail/page-ruler/jlpkojjdgbllmedoapgfodplfhcbnbpn

いつもの。定規。

### Markdown Viewer
https://chrome.google.com/webstore/detail/markdown-viewer/ckkdlimhmcjmikdlpkmbgfkaikojcbjk

mdファイルをブラウザ上でよしなに見せてくれるツール。
メモをmd形式でよく書くので。

### ~~Jety~~ (2018年に終了しました)
https://chrome.google.com/webstore/detail/jety/dhomkpgdpmacfncgmnibklioinjbjmmd

主にタブ管理用。New Tabページがちょっとおしゃれになる。
To-doやNotes機能もあるので、ちょっとしたタスク管理やメモに使ってもよさそう。

### Google 翻訳
https://chrome.google.com/webstore/detail/google-translate/aapbdbdomjkkjkaonfhkkikfgjllcleb

エラー文の翻訳とか、英語サイトの翻訳に。

### （Clear Cache）
https://chrome.google.com/webstore/detail/clear-cache/cppjkneekbjaeellbfkmgnhonkkjfpdn

ワンクリックでキャッシュを削除してくれる。
シークレットタブで事足りている気がするので出番は少なめ。

### Checker Plus for Gmail™
https://chrome.google.com/webstore/detail/checker-plus-for-gmail/oeopbcgkkoapgobdbedcemjljbihmemj

Gmailの通知を表示してくれる。

### Awesome Screenshot: キャプチャーと注釈
https://chrome.google.com/webstore/detail/awesome-screenshot-screen/nlipoenfbbikpbjkfpfillcgkoblgpmj

いわずとしれたキャプチャーツール。
特にWindowsはキャプチャーが不自由なので。（主観）




以上
【html】文字コード指定の小さなサンプルメモ

- htmlのheadのmetaタグに文字コードを指定する
- 実際のファイルの文字コードと同一である必要がある

# サンプル

## 文字化けする場合

UTF-8で指定するけど、実際のファイルはEUC-jpで保存したら、↓

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>index.html</title>
</head>
<body>
ほげほげ
</body>
</html>
```

![ScreenClip.png](https://qiita-image-store.s3.amazonaws.com/0/50690/7277dc77-58bc-718c-89af-ef4e8e164a4b.png)


ブラウザで開くと文字化けする

```console:結果
�ۤ��ۤ�
```

## しない場合

ファイル内でもeuc-jp指定で保存すればおｋ

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="euc-jp"> ★
<title>index.html</title>
</head>
<body>
<a href="category1.html">category1.html</a>
<a href="category2.html">category2.html</a>
<a href="recent.html">recent.html</a>
ほげほげ
</body>
</html>
```

# 参考

FileCode Checkerの詳細情報 : Vector ソフトを探す！ https://www.vector.co.jp/soft/winnt/util/se478635.html?ds

文字のエンコードを指定する：HTMLタグ辞典 - HTMLタグボード http://www.dspt.net/html_tag/001_data/017.html
USB経由のデーター転送スピードのチェックと向上

##USBの現在の転送スピードをチェックする
パソコン上にスマホのカメラで映像を読み込んで映し出しているので、映像の遅れが生じる問題を解決しようと調査中です。
おそらく、USBの転送スピードをしらべることができれば解決の糸口になると思います。
この問題を解決しようと思っている理由は、Droidcamを使って、USB経由からスマホのカメラを使って、パソコン内に映し出す作業をしている時に、その映像に少しラグが起きている問題を解決しようとしているわけです。
今使っているTOSHIBAのパソコンは１０年ほど前のパソコンですから、USBのタイプが１．０か２．０のモルのはずです。USBケーブルはタイプCで１００円ショップで買ったのですが、一応高速データー通信ができるらしいですね。
ということはこの遅れは画質の問題か、USB転送スピードを調整できる何かがあるに違いないということです。
それをこのブログでは調べて、調査報告していこうと思っています。
STM32でSWDピンをGPIOにしちゃった場合

やらかしたので復帰方法をメモしておきます。

#STM32でSWDをGPIOにするとPCから接続できない

STM32でSTM32CubeMXを使っているのですが、間違えてPA13とPA14をGPIOに設定してプログラムを書き込んでしまいました。すると、PCから接続できなくなります。さて、どうやって復帰するかと色々試行錯誤しました。

#SWDデバッグ端子にNRSTもつながっている場合
これは一番easyで、STLINK-UtilityのTarget->SettingでConnect Under Resetに変更します。これで接続してMass Eraseします。
最近出てきたSTM32CubeProgrammerの場合、ST-LINKのRESET modeをHardware resetでOKです。

#SWDデバッグ端子がSWCLK、SWDIO、GNDの三線の場合

##方法1
この場合、BOOT0をHにして、bootloaderが起動するようにします。ユーザープログラムは起動していないので、SWD接続可能です。

##方法2
1. NRST=Lにします
2. STLINK-Utilityで接続します
3. NRST=Hにします
4. Mass Eraseします
メモ（conohaにrubyをインストールしたい）

メモです。

conohaでルビーをインストールしたい
http://ame4053.hatenablog.com/entry/2016/03/15/233305

しかし、CentOSでssh鍵を指定した方が良いと書かれていたので、調べて見た。

CentOS7.3でSSH接続(公開鍵認証)する方法
https://qiita.com/uhooi/items/137de4578534c8e7e7f2

すると、Windowsの場合はGit bashを使えとのことなので、調べて見た。

WindowsにGitをインストールする
https://www.granfairs.com/blog/cto/install-git-for-windows
・ローカルのWindowsにgitを入れて、鍵を作ってみたが、アップロードの仕方がわからず、ただいま放置中。

途中です。
[Photon]ルームのカスタムプロパティをロビーから取得する

# ルームのカスタムプロパティ

Photonでは、ルームにカスタムプロパティを設定して、ルーム内で共有することができます。用途としては、ゲームのステージの情報（プレイヤーに紐づかない情報）を格納します。

# ロビーでは取得できない

ルームのカスタムプロパティは、その性質上、ルームに入っているクライアントには同期されますが、ロビーにいてルームに入っていないクライアントには同期されません。

しかし例えば、ロビーからルームの一覧を取得して、そのルームの情報（プレイの残り時間や、遊んでいるステージなど）を表示したい、という場面はよくあると思います。

# RoomOptionsを使用して、ロビーから見えるプロパティを作成する

ロビーから見えるルームのカスタムプロパティを作成するには、ルームを作成する際にRoomOptionsを使用します。

```
public void JoinRoom()
{
    RoomOptions roomOptions = new RoomOptions()
    {
        MaxPlayers = 2,
        IsOpen = true,
        IsVisible = true,
        CustomRoomPropertiesForLobby = new string[] { "StageName", "RestTime" }
    };
    PhotonNetwork.JoinOrCreateRoom("testroom", roomOptions, null);
}
```
CustomRoomPropertiesForLobbyに設定したプロパティについては、ロビーから参照可能になります。

# サンプルコード

https://gist.github.com/torikasyu/df3c0236049eb44f0f63e2c0a093d366

上記スクリプトを空のGameObjectにアタッチします。
また、UIのButtonを作成し、ClickイベントをJoinRoom()にアサインします。

Unityを2つ起動、もしくは１つはWindows/Macのスタンドアロン版に書き出して起動します。
２つ起動して、１つはボタンを押してルームに入室し、もう１つはそのまま放置します。

放置した方（ルームに入室していない方）の画面に、ルームの情報が表示されます。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/31032/d44dd859-003f-5bcc-4d66-d2612ca21bbd.png)