OmniAICreator/Qiita-1.07M huggingface dataset:
コマンドプロンプトからdnscmdコマンドでDNSサーバに登録する方法

# DNS登録をコマンドプロンプトで実施しよう

WindowsSeverでDNSサーバーにDNSを登録するとき、
レコードを1つ2つ追加するくらいならDNSマネージャーを使ってもよい。

けれど登録するレコードの件数が10や20、100を超えたらいちいちGUIで追加していくのは手間すぎる。

というわけで、DNSをコマンドプロンプトで一括登録してしまおう。

## 追加

```cmd
dnscmd /recordadd [ゾーン名] [ホスト名] A [IPアドレス]
```

少し解説しよう。

ゾーン名とはそのドメインが管理する範囲のことで、
多くは`.com`とか`.jp`とかであらわされる。

ホスト名とIPアドレスは言わずもがな。

で、一番厄介（覚えづらい）のが「A」の部分。
これはレコードタイプと呼ばれていて、DNSレコードの形式をあらわしている。
ちょっとわかりづらいので、コマンド全体から理解していきたい。

この追加コマンド全体を日本語に置き換えると、以下のようになる。

<font color="OrangeRed">「[ゾーン名]で管理される[ホスト名]と[IPアドレス]を（レコードタイプ）Aで紐づけてDNSレコードに追加」
</font>

```cmd
dnscmd /recordadd [ゾーン名] [ホスト名] A [IPアドレス]
```

だから、レコードタイプというのはホスト名とIPアドレスを紐づける「方法」だ。
このレコードタイプは複数あり、それによってコマンドの書き方も若干異なってくるが、
個人で使うレベルであれば基本的にAレコードで登録しておけば問題はない。

Aレコードとは最もオーソドックスなDNSの機能だからだ。
（キャッチしたホスト名からIPアドレスを呼び出し、返す）

サンプルは以下の通り。

```:Aレコードを追加する場合
dnscmd /recordadd qiitasan.com host-name A xxx.xxx.xxx.xxx
```

## 確認

当然、追加したレコードがちゃんと登録されているのかを確認したくなる。
まずは基本的な確認方法を紹介する。

DNSサーバー及びDNSサーバーと同じゾーンに存在するPCにて以下を入力。

```:nslookup
nslookup [ホスト名]

>出力結果は以下の通り
サーバー:  DNSサーバのホスト名
Address:  DNSサーバのIPアドレス

名前:    nslookupしたホスト名
Address:  nslookupしたIPアドレス
```

だが、これはこれで1つずつ実行していくのは手間だ。

DNSサーバーに追加したDNSレコードを一気に見たいんだよ！という場合は、
DNSサーバーのコマンドプロンプトで以下を入力する。

```:ZonePrint
dnscmd /ZonePrint [ゾーン名]
```
こうするとゾーンに登録されているレコードが一気に出力される。
僕はサフィックスで分けているホスト名とかをまとめてみたい場合に、
上のコマンドをfindでパイプすることで出力したりしている。CUIはこういうところがいいよね。

##以上

コマンドを羅列するだけじゃ味気ないと思って、簡単な解説も入れてみた。
間違えとかあったら指摘してください。

##おまけ

#### CNAME
ちなみに、（レコードタイプ）CNAMEを追加する場合は

```:CNAMEを追加する場合
dnscmd /recordadd qiitasan.com host-name<登録済のホスト名> cname <登録したいホスト名>
```
CNAMEは
IPアドレス=ホスト名A　でレコードに追加されていた場合、
ホスト名A=ホスト名B　という関係を追加するものになる。

つまりIPアドレス=ホスト名Bということになるので、一つのIPアドレスに
2つめのホスト名を追加することができるようになる。

####PTR
下記はPTRタイプと呼ばれる。

```:正引きと逆引きを同時に追加する場合
dnscmd /recordadd qiitasan.com host-name /createptr A xxx.xxx.xxx.xxx
```
これは正引きに加え逆引きを追加するコマンドになる。
正引きが「Aレコード」で、ホスト名をIPアドレスに変換することを意味する。
逆引きは「PTRレコード」と呼ばれ、IPアドレスをホスト名に変換することを意味する。

なんか意味あるの？という話だけど、一応セキュリティ対策として使うところはあるらしい。
でもIPv6の逆引きは大変だから今後は更に使われなくなる可能性もなくはない。
Excel から CSVを読み込む。

#きっかけ

CSVファイルをダブルクリックでExcelから開くと、ゼロ埋めが消える。
例えば、　01　は　1となる。



**これが嫌**



ゼロ埋めの値を消えないように表示されるには、［データ］から［外部データの取り込み］を選択し、ウィザードをちくちく選択しなければならない。


**これもめんどい**



なので、取り込むマクロを開発しました。


#プログラムの構成

色々試したが、以下のロジックがよさそう。

1. CSVファイルを１行ずつ読み込んで、全て［列Ａ］に書き込む
2. エクセル機能の［区切り位置］から一括で各列に反映させると効率的。
3. １セルでの改行対応済
4. カンマ区切り、スペース区切り、など対応できるようにアレンジ

4番目はJavascriptで書いたので、Qiitaに載せられなくなってしまった。
[こちらに用意しました。]( https://onmayapg.azurewebsites.net/VBA/Tips/2019012901.aspx )
MeCabの辞書への語彙追加方法【Windows 10, Ubuntu 18.04】

# はじめに

本記事では、MeCabの辞書にオリジナルの語彙を追加し、新たなユーザ辞書を作成する方法を記述します。

- 対象のOSは、Windows 10とUbuntu18.04です
- 作成したユーザ辞書をPythonで利用する方法も記載しています

[参考](#参考)のように、参考になる記事はたくさんありますが、毎回調べている気がしたので自分の環境用に整理しました。

# 追加方法

### Windows 10

※ `C:\Program Files\MeCab\bin`へパスが通っている前提

```common-lisp:コマンド
> mecab-dict-index -f utf-8 -t utf-8　-d <辞書のディレクトリ>  -u <作成する辞書> <追加する語彙>
---
(実行例) > mecab-dict-index -f utf-8 -t utf-8 -d "C:\Program Files\MeCab\dic\ipadic" -u ipcdic_plus_keyakizaka.dic keyakizaka.csv
reading keyakizaka.csv ... 456
emitting double-array: 100% |###########################################|

done!
```

### ubuntu 18.04

```bash:コマンド
$ /usr/lib/mecab/mecab-dict-index -f utf-8 -t utf-8 -d <辞書のディレクトリ> -u <作成する辞書> <追加する語彙>
---
(実行例) $ /usr/lib/mecab/mecab-dict-index -d /usr/share/mecab/dic/ipadic/ -f utf-8 -t utf-8 -u ipcdic_plus_keyakizaka.dic keyakizaka.csv
reading keyakizaka.csv ... 456
emitting double-array: 100% |###########################################| 

done!
```

#### メモ
- <作成する辞書>は任意のファイル名
- <辞書のディレクトリ>の探し方
 - windows: たぶん`C:\Program Files\MeCab\dic\ipadic`にある
 - ubuntu: 紹介しているサイトごとに結構違う?ので`find / -name "dicrc"`とかで探すと良い
- <追加する語彙>の作り方
  - [参考サイト](https://taku910.github.io/mecab/dic.html)
  - csvファイルの例 (本ファイルは[こちら](http://guinevere.s25.xrea.com/k46/blog_count/descend.html)より拝借しております)
  - ![image.png](https://qiita-image-store.s3.amazonaws.com/0/264359/fa768548-7832-4584-aeab-2cbd2b0733e4.png)

# Pythonで辞書を読み込み

pythonでmecabパッケージをインストールしている状態で以下のように定義すれば、作成した辞書を使うことができます。

```python:pythonスクリプト
import MeCab
mecab = MeCab.Tagger (r"-Ochasen -u ipcdic_plus_keyakizaka.dic") # ここで作成した辞書を読み込む
```

#### 実行例

![image.png](https://qiita-image-store.s3.amazonaws.com/0/264359/aa065925-1455-70a1-4318-f11edecb84a0.png)


# 参考

- https://obel.hatenablog.jp/entry/20170218/1487418388
- https://qiita.com/nnahito/items/16c8e214d71fbc23ed8e
初めてのJavaScript②

昨日の学習内容です。

------
**else(エルス)**
else{}
if文に組み合わせると
「もし〇〇なら●●を行う、そうでなければ■■を行う」
という処理ができるようになる。

**else if**
else if{}
if文に条件分岐を追加することができる。

**&&**
かつ

**||**
または

**switch文**
switch(){}
ある値によって処理を分岐する


**case（ケース）**
case 値:
switch文の中に追加することで処理を分けることができる。

**break(ブレーク)**
break;
breakがないと、合致したcaseの処理を行った後、その次のcaseの処理も実行してしまう。

**default（デフォルト）**
default:
caseのどれにも一致しなかった時、defaultのブロックが実行される。

**while（ホワイル）**
while(){}
意味：〜の間
繰り返し処理。更新するコードを書き忘れると無限ループになる。

**for文**
for()
出来ることはwhileと同じだが、while文と比べてシンプルに書くことが出来る。
「変数の定義」「条件式」「変数の更新」の3つを括弧の中に書く。
括弧の中ではそれぞれをセミコロン（;）で区切る。


・「number += 1」は**「number ++」**のように省略して書くことが出来る。
・引き算の場合にも、「number -= 1」を**「number --」**と省略することが出来る。


--------
躓いた点：条件式がいる文といらない文が理解出来ていなかった。
気づいた点：英語の意味を調べながらやると覚えやすい。

------

次は配列からです。
Nkkei

C

```
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<math.h>
#include<queue>
#include<deque>
#include<stack>
#include<cstdio>
#include<utility>
#include<set>
#include<list>
#include<cmath>
#include<stdio.h>
#include<string.h>
#include<cstdio>
#include<iomanip>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using piii = pair<pii, pii>;
const int INF = 1e9 + 7;
int main() {
	ll N;
	cin >> N;
	ll A[100010];
	ll B[100010];
	vector<ll>C(N);
	vector<pair<ll,ll>>P(N);
	for (int i = 0; i < N; ++i) {
		cin >> A[i] >> B[i];
		C[i] = A[i] + B[i];
		P[i].first = C[i];
		P[i].second = i;
	}
	sort(P.begin(), P.end(),greater<pair<ll,ll>>());
	ll ans = 0;
	for (int i = 0; i < N; ++i) {
		if (i % 2 == 0) {
			ans += A[P[i].second];
		}
		else {
			ans -= B[P[i].second];
		}
	}
	cout << ans << endl;
	return 0;
}
```
A+Bがデカい順に取っていく
Iのうち高橋君が食べるものの集合をa,青木さんが食べる分をbと表すことにし、
X=ΣAi (iはaに含まれる）- ΣBi (iはbに含まれる)とする。
高橋君はAを最大化し、青木さんは最小化するように料理を選ぶ
これを変形すると
X=Σ（Ai+Bi) (iはaに含まれる）- ΣBi （1<=i<=N)の自然数
二つ目のΣは一定なのでAi+Biを最大化すればいいことがわかる

D
グラフ問題.ちょっと持ってる知識が少なすぎる。
根から各頂点への距離が最大になるような辺のみを残せばよい

```
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include<map>
#include<math.h>
#include<queue>
#include<deque>
#include<stack>
#include<cstdio>
#include<utility>
#include<set>
#include<list>
#include<cmath>
#include<stdio.h>
#include<string.h>
#include<cstdio>
#include<iomanip>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using piii = pair<pii, pii>;
const int INF = 1e9 + 7;
vector < vector<int>> chi;
vector<int>nPar;//各頂点iについての親の数nPar[i]
vector<int>dist;//探索でiに達する度にnPar[i]をデクリメントする
vector<int>ans;//nPar[i]=0になったときに以降の探索を行う
void dfs(int n) {
	if (chi[n].size() == 0)return;
	//葉に達したら探索を終える
	int nChi = chi[n].size();
	//頂点nの子の根からの距離を求める
	for (int i = 0; i < nChi; ++i) {
		int nxt = chi[n][i];
		nPar[nxt]--;
		if (dist[nxt] < dist[n] + 1) {
			//距離が更新される時に親を更新する
			dist[nxt] = dist[n] + 1;
			ans[nxt] = n;
		}
		//頂点nxtへのnPar[nxt]回目の参照の時以降の探索を行う
		if (nPar[nxt] == 0)dfs(nxt);
	}
}
int main() {
	int N, M;
	cin >> N >> M;
	chi = vector<vector<int>>(N + 1);//chi[i][j]は頂点iのj番目の子
	//各頂点の親の数を数えておく
	nPar = vector<int>(N + 1, 0);
	for (int i = 0; i < N + M - 1; ++i) {
		int A, B; cin >> A >> B;
		chi[A].push_back(B);
		nPar[B]++;
	}
	//根を求める
	vector<bool>rootCand(N + 1, true);
	for (int i = 1; i <= N; ++i) {
		int nChi = chi[i].size();
		for (int j = 0; j < nChi; ++j) {
			rootCand[chi[i][j]] = false;
		}
	}
	int root;
	for (int i = 1; i <= N; ++i) {
		if (rootCand[i])root = i;
	}
	//dist[i]は根から頂点iへの距離
	dist = vector<int>(N + 1, 0);
	//ans[i]は頂点iの親
	ans = vector<int>(N + 1, 0);
	dfs(root);
	for (int i = 1; i <= N; ++i) {
		cout << ans[i] << endl;
	}
	return 0;
}
```
理解はできるけどこういうのを自分でぼかすか書けるようになるにはまだまだ道がながそうや
Azure Pipelines から Android アプリを DeployGate に配信するスクリプト Ver.2

[Android/iOSアプリを Azure Pipelines から DeployGate に配信する - Qiita](https://qiita.com/amay077/items/1c1f55d09760fa57b448) の続き。スクリプトを汎用化した。

Pipelines のタスクに Bash を追加して、こんな感じで設定。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8227/25e3550f-b09d-8e2b-ac22-2df0c176cc43.png)

**Script の内容**

↓をコピペで。

```bash
TOKEN="$deploygate_token"
DEPLOYGATE_USER="$deploygate_user"
APK_DIR="$deploygate_apk_dir"
APK_FILTER="$deploygate_apk_filter"
MESSAGE="$deploygate_message"

echo "DEPLOYGATE_USER=$DEPLOYGATE_USER"
echo "APK_DIR=$APK_DIR"
echo "APK_FILTER=$APK_FILTER"
echo "MESSAGE=$MESSAGE"

FILES=$(find $APK_DIR -name $APK_FILTER -type f)
for f in ${FILES[@]}
do
    echo "APK_PATH=$f"

    curl \
      -F "token=$TOKEN" \
      -F "file=@$f" \
      -F "message=$MESSAGE" \
"https://deploygate.com/api/users/${DEPLOYGATE_USER}/apps"
    break
done
```


**Environment Variables**

* deploygate_token - DeployGate の APIキー
* deploygate_user - DeployGate の ユーザーID
* deploygate_apk_dir - DeployGate に配信する APK が出力されたディレクトリ。普通は ``$(build.binariesdirectory)/$(BuildConfiguration)`` 。
* deploygate_apk_filter - ``deploygate_apk_dir`` の中から APK を見つけるためのフィルタ。なので ``*.apk`` でいいはず。
* deploygate_message − DeployGate の配信バージョンにつけるコメント。``By Azure Pipelines $(Build.BuildId) - $(Build.SourceVersionMessage)`` としておくと、良い感じに Azure Pipelines のビルド番号と最終コミットメッセージが伝搬される。

次の Ver.3 は iOS との共通化を図る予定。
macOS標準sedをGNU sedに置き換える

macOS標準添付 sed コマンドはGNU拡張非対応のため、下記のようなワンライナーが期待通り動作しない。

```bash
$ find . -name "pattern" | xargs sed -i "s/old/new/g"
```

Homebrew経由でインストールされるGNU sed (`gsed`)を導入し、標準 sed コマンドより探索優先度を上げる。（オリジナルを呼び出す場合は`/usr/bin/sed`）

```
$ brew install gnu-sed
$ echo 'export PATH="/usr/local/opt/gnu-sed/libexec/gnubin/:$PATH"' >> ~/.bashrc
```

2019年1月現在、一部記事で紹介されているbrew install時の`--with-default-names`オプションは機能しない模様。

動作環境

* macOS 10.14.3
* GNU sed 4.7
画像の透明部分の色情報の注意点

今回も研究中に小一時間ほどハマってしまったので, 
その悔しさを糧に投稿します.
## 環境について

本投稿での使用環境は,
- python 3系
- open CV
- GIMP
- png形式の画像
を用いています.

## 筆者がやりたかったこと
今回私は, 画像の一部分を切り抜き(マスク処理), 
そこから画像の色情報等を分析しようと考えていました.

その際に, 画像処理ソフトGIMPを用いて背景を消去しています.
これが
![colorful.jpg](https://qiita-image-store.s3.amazonaws.com/0/176438/258f8169-047a-1de9-4b99-b9538f0d260c.jpeg)


こんな風に
![colorful_.png](https://qiita-image-store.s3.amazonaws.com/0/176438/ccaf45e0-e590-dff5-8898-75a726ed7eeb.png)


そうすれば, 切り取った部分の色情報が入手できるんじゃないかと思ってました.

そこで, python上で色情報をヒストグラム化するコードを動かしてみました.
(ソースコードはお借りしています. 引用元→[【openCV】画像の色の判別・抽出](https://blog.trial-and-error-diary.fun/entry/opencv-color-detect)

```py
import numpy as np
import matplotlib.pyplot as plt
import cv2
from collections import Counter

# 画像を読み込み
img_scr = cv2.imread("hoge/piyo/sorekara_dositano.png", -1)

# BGR->HSV に変換
img_hsv = cv2.cvtColor(img_scr, cv2.COLOR_BGR2HSV)

height = img_hsv.shape[0]
width = img_hsv.shape[1]

pixels = []

for y in range(height):
    for x in range(width):
        if (img_hsv[y, x, 1] > 45 and 32 < img_hsv[y, x, 2]):
            pixels.append(img_hsv[y, x, 0])

plt.xlim(0,180)
plt.xticks([0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180])
plt.hist(pixels, bins=12, range=(0,180), align="mid",rwidth=1.0,color="blue")

bins = np.linspace(0, 180, 13)
print(bins)
index = np.digitize(pixels,bins)
c = Counter(index)
print (c)
mode = c.most_common(1)
print(mode[0][0])
```

そして出力されたヒストグラムは以下のようです.

![ダウンロード (1).png](https://qiita-image-store.s3.amazonaws.com/0/176438/10af11c7-c1f7-192b-0b9b-c345dbbfa885.png)


ってことで赤部分だけ切り取ったはずが, ヒストグラム上では色が残ってしまっています.><

## 画像の透明部分には色情報が残ってた

どうやら画像処理ソフトで切り取り部分を消去しても,
根本に元の色情報が残ってしまっているというのが原因のようです.

### 解決策として, 一回塗りつぶしちゃう

という事で, もとの色情報を書き消すために透明部分を黒色などの
影響の出なそうな色に塗りつぶして,その後再度分析を行えばいいのではないかと思います.

（※ただ, 黒色はHSV表色系だと色相0で赤色と同じ部分に該当するので, 要注意です)

といったわけで, 分析結果がおかしいなぁとハマった症状と解決策についてでした.
~~（これで本当にエンジニアになれるのだろうか･･･？)~~
Laravelでのモデル作成とマイグレーションファイル作成

# php artisan make:model モデル名 -m

Laravelにてデータベースにデータを保存したいとき、
まずモデルとマイグレーションファイルを作成しますが、
モデルを生成するartisanコマンド

php artisan make:model Company 
※例でモデル名：Companyとしました。

にオプションで-mをつけて

php artisan make:model Company -m

とするとCompanyモデルに関連したマイグレーションファイルが
自動で生成されるみたいです。

また、その自動生成されたマイグレーションファイルを確認すると、
テーブル名も複数形のCompaniesとなっており、命名規則に従っています。
※Companysではなく、きちんとCompaniesというiesの複数形で
テーブル名がつけられていました。かしこい！
ちなみにChildでモデルを作った場合でもテーブル名は複数形のChildlenになります。
rails gem 'chartkick' エラーが検出

<%= javascript_include_tag "//www.google.com/jsapi", "chartkick" %>
ここの部分でエラーが検出されたとき


ActionView::Template::Error (Asset was not declared to be precompiled in production.
Add **`Rails.application.config.assets.precompile += %w( chartkick.js):eye:`** to `config/initializers/assets.rb` and restart your server):

のエラーが表示されてます


太字の部分を　config/initializers/assets.rb に書き加えて



再起動で完了です。


今回のエラーは、**エラー文**をしっかりと読むことで解決できます。
heroku でdatabase mysql2 sequel proを使いたい

herokuでgit push heroku masterするときに、dbと繋ぎたい。
初期ではherokuはPostgreSQLをしようする流れになっていたかと思いますが、今回はsequel proでdbを作りたいと思います。

```ruby 2.5.1
rails 5.2.1
mac high sierra 10.13
```
```group :production do
gem 'rails_12factor'
end
```
gemを入れますrails_12factor　　＃＃これはもしかしたらいらなかったかも？？

必要であればmysqlのgem versionを指定してあげるといいかも。(~> '0.0.1')みたいに。

`config/environments/production.rb`に
`config.assets.compile = true`
追記。自分はfalseになってました。


`heroku create`とか実行

`heroku addons:add cleardb`
`heroku config | grep CLEARDB_DATABASE_URL`

実行すると、
`mysql://b00000008:0000000e@us-00000000.cleardb.net/heroku_8000000003?reconnect=true`
みたいなのが出てくると思います。


`mysql://ユーザー名:パスワード@ホスト名/データベース?reconnect=true`
の順番になっているので、メモ。

`heroku config:add DATABASE_URL='ここにメモしたものをmysql2にして貼り付け'
実行！！！


できなかったらごめんなさい。
一度、addons:detachを試してみてもいいかも。
Golangで日本語PDFを出力する方法

Golangを使ったアプリケーションでPDFを出力する機会がありました。
その時に日本語出力に苦労したので、その対応について紹介していきます。

# 結論
以下ライブラリを利用することで、比較的簡単に日本語のPDFを出力することができました。
https://github.com/signintech/gopdf

# 経緯
はじめGolangのPDFライブラリを調べていると以下のライブラリを見つけました。
https://github.com/jung-kurt/gofpdf
日本語の紹介記事などもあったので、これで行けるかなと思ったのですが、どうやらUTF-8フォントをサポートしていない影響で、日本語出力を行うことが難しいようでした。

> However, support is provided to automatically translate UTF-8 runes to code page encodings for languages that have fewer than 256 glyphs.

という説明もあったので、頑張れば何とかなるのかもしれませんが、issueなどを読んで色々試してもうまくいかなかったため、別ライブラリを探すことにしました。

## signintech/gopdfについて
そんな時の見つけたのが冒頭で紹介した[signintech/gopdf](https://github.com/signintech/gopdf)です。

こちらのライブラリはスター数はgofpdfに劣りますが、READMEにもある通り日本語出力への対応が行われており、フォントの読み込みもシンプルに行えるため、なかなかいい感じです。

使い方は本家READMEに十分に記載されており、[サンプル](https://github.com/oneplus1000/gopdfsample)も十分提供されており、基本的な使い方で困ることは少ないでしょう。
フォントについてもttfフォーマットのファイルを用意できれば簡単に適用可能なので、つまずく機会は少ないはずです。(フォントのライセンスには注意しましょう)

ただ触ってみた感じ、機能の豊富さや使い勝手は[jung-kurt/gofpdf](https://github.com/jung-kurt/gofpdf)の方が上です。こちらのライブラリで日本語出力ができた方は是非方法を教えていただきたいです。

signintech/gopdfも基本的な描画機能は揃っているので特に困ることはないはずです。
# 締め
閲覧いただき、ありがとうございました。
記載内容に疑問点・不適切な内容がありましたら、ご指摘頂けますと助かります。
AWSで独自ドメインのメールアドレスを作成してメールを送受信できるようにしてみた時の参考サイトメモ

# 前提
　AWSのアカウントがある
　独自ドメイン取得済み

# 独自ドメインでメールの送受信ができるようにする
https://qiita.com/ysKey2/items/2b019337772f8499beec

# メールの管理をWorkMailから別のメールアプリへ(今回はサンダーバード)
https://dev.classmethod.jp/cloud/aws/amazon-workmail-smtp-support/
※ メーラーのセットアップからを参考

この2つを参考にして進めるだけで出来た！
わかりやすい記事感謝です^^
UnityのTPSカメラで悩むなという話

#TPSカメラのスクリプト、書きすぎでは…?
teratailや技術系記事などで、「TPSカメラを実装しました/実装方法を教えてください」みたいなのを読むと「まずオフセットを設定して、回転角を保存して、RotateAroundが…」みたいな100行以上ある1つのスクリプトをツラツラ書いてあることが多いんですが、「なんでそこまでスクリプト書くんだ…？」と思ったので、「自分流の超簡易的なTPSカメラを作ろう」と考えました。

#計算も保存もUnityに任せましょう
書くスクリプトは2つ(2018.2以上なら1つ)だけ。実質的には6行ぐらいです。

```cs:CameraScript
using UnityEngine;

public class CameraScript : MonoBehaviour {

    public Transform PlayerCenter;
    void Update()
    {
        transform.LookAt(PlayerCenter);
    }
}

```

もし、2018以前ならこちらも

```cs:PositionFollower
using UnityEngine;

public class PositionFollower : MonoBehaviour
{
    public Transform PositionTarget;
    public Vector3 offset;

    void Start()
    {
        offset = transform.position - PositionTarget.position;
    }
    void Update()
    {
        transform.position = PositionTarget.position + offset;
    }
}

```

これらを、以下の画像のように配置します。
![スクリーンショット (1).png](https://qiita-image-store.s3.amazonaws.com/0/254776/26017299-e032-f1e0-d8b3-56792a168a72.png)
![スクリーンショット (2).png](https://qiita-image-store.s3.amazonaws.com/0/254776/4dddd5cc-44ee-b693-6a1a-97c0bd42c50a.png)

今回はPlayerをCubeと仮定。2018.2以降なら、PositionConstraintを有効にすればOK。

#その他
これでカメラが、「PositonはPlayer、RotationはPlayerFollowerに追従」するようになったので
動かしたいときはそれぞれをTranslateなりRotateなりを使えば簡単に動かせます。

CameraとPlayerの距離を変えたい時は、MainCameraのLocalPositionの値を変更してあげれば大丈夫。
Tech系Podcastまとめ

# TL;DR
私が聴いているTech系Podcastの紹介

# なぜ聴いてる？
- 単純にTech関連の話が好きなので
- 英語力強化（リスニング力がかなり向上しました）

# いつ聴いてる？
通勤時に聴くことが多いです。スタバとかで勉強している際に、息抜きとして聴くこともあります。

# どうやって聴いてる？
ただ聴き流すだけだとBGMと何ら変わりない（翌日には何も覚えていない）ことに気づいてからは、できるだけメモを取るように（Google Docsを使っています）。以下の項目それぞれについて、一言二言程度の量でメモを取っています。

Title: 
summary：
Take away：
To do(optional)：

# どのアプリ使ってる？
[Castbox](https://castbox.fm)と呼ばれるアプリを使っていて、以下の機能を利用してます。

- Wi-Fi接続時に最新エピソードを自動ダウンロード（通信容量を節約するため）
- 再生速度の変更（1.3倍速に設定しています）
- 再生済みのエピソードの自動削除
- Dark Theme

# チャンネル紹介

## [Learn to Code with Me](https://learntocodewith.me/)
- カバーしているトピックは、Tech業界でのキャリアやプログラミング学習が中心
- 「非Tech業界からTech業界へキャリアチェンジした」というエピソードが多いので、エンジニアへの転職を検討している方は参考になるかも
- 女性のゲストが多い（チャンネルの運営者が女性だからか？）
- １エピソードの長さ：４０分前後
- 更新頻度：週１


## [Python Bytes](https://pythonbytes.fm/) & [Talk Python to Me](https://talkpython.fm/)
- Python関連のトピックを幅広く紹介している（Pythonの動向、Hotなライブラリ、Pythonの活用事例など）
- Pythonが好きな方にオススメ
- １エピソードの長さ：Python Bytes ２５分前後、Talk Python to Me １時間前後
- 更新頻度：週１

## [This Week in Machine Learning & AI](https://twimlai.com/)
- 機械学習とAIの活用事例や最新の研究結果について紹介しているチャンネル
- １エピソードの長さ：１時間前後
- 更新頻度：週１〜２


## [Software Engineering Daily](https://softwareengineeringdaily.com/)
- 「Software Engineering」に関連する事柄を幅広く取り扱っているチャンネル
- 扱っているトピックの範囲が他のチャンネルとは比較にならないくらい広い
- 「自分の専門分野以外の知見も広げたい」という方にオススメ
- １エピソードの長さ：１時間前後
- 更新頻度：週３〜４

まだまだ紹介したいチャンネルが沢山あるので、暇を見つけて追加していく予定です

# 最後に
私が紹介したもの以外にも沢山Tech系のチャンネルがあります。是非、自分の興味に合ったお気に入りのチャンネルを探してみて下さい！
ビットコインの最適なブロック生成間隔，ブロックサイズについて考えてみた．


#はじめに
ビットコインでは，ブロック生成間隔が長いこととブロックサイズが限定されていることが原因で承認スループットが他の決済システムと比べ非常に低くなっていることはこれまでに多くの人が指摘してきたと思います．([ビットコインのスケーラビリティ問題](https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%83%88%E3%82%B3%E3%82%A4%E3%83%B3%E3%81%AE%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%A9%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%E5%95%8F%E9%A1%8C))
単純にブロック生成間隔を短くし，ブロックサイズを大きくすれば問題は解決するように思えますが，そうすると安全性の面で支障をきたす可能性が大きくなります．（"Information propagation in the Bitcoin network"等を参照してください．）この論文でも言われていますが，ブロック伝搬遅延を小さくすると安全にブロック生成間隔を短くできるよってことが分かっています．ブロック伝搬遅延のことが指摘されて以来，多くのエンジニア，学者が伝搬遅延を下げる工夫をしてきました．その結果2019年現在ブロック伝搬遅延は非常に小さくなってきています．[Bitnodes](https://bitnodes.earn.com/api/)のAPIを叩くと，ブロック伝搬遅延が現在どんなかんじかわかったりします．ってなわけで，現在のブロック伝搬遅延にあった最適なパラメータ(ブロック生成間隔，ブロックサイズ)を今回計算してみたいと思います．
#現在のビットコインのパラメータ
ブロック生成間隔：約10分
ブロックサイズ：約1MB
#使用したAPI
- [Blockchain.info](https://www.blockchain.com/ja/explorer)
- [Bitnodes](https://bitnodes.earn.com/)

# 参考にしたサイト，論文
[BitcoinStats](http://bitcoinstats.com)
On Scaling Decentralized Blockchains
# 最適なパラメータの計算式
$$ (X\%実行スループット):= \frac{(ブロックサイズ)}{(X\%ブロック伝搬遅延)}
$$

$$ \frac{(ブロックサイズ)}{X \% 実行スループット} < (ブロック生成間隔) $$

Xは公平性を考慮して90にします．
#手に入った情報
Blockchian.infoで2019年ブロック高558400~559400(2019/1)の平均ブロックサイズは1.065MB
Bitnodesで2019年ブロック高558400~559400(2019/1)10％ブロック伝搬遅延平均1132ms
bitcoinStatsで2017年1月~3月90%ブロック伝搬遅延平均11.77s
Blockchain.infoで2017年1月~3月の平均ブロックサイズは約950KB
#結論
2017年時点で90%実行スループットは645Kbps.
つまり，上の式に当てはめると，ブロックサイズが1MBで固定の場合，ブロック生成間隔は1s.
ブロック生成間隔を10分で固定すると，ブロックサイズは387MB.
2019時点で10%実行スループットは7272Kbps.(90%実行スループットは計算できませんでした．)

#感想
Bitnodesでは上位1000ノードのブロック伝搬遅延の情報しか提供していないので，
10%実行スループットしか計算できませんでした．
90%実行スループットが計算できるようになったらいいのになー．
bitcoinStatsの出してるデータが本当に結構正しいなら，ビットコインのパラメータを変更して，物凄い性能あげられますね．
ghq getを踏み台経由で行うときのコマンド

ローカルのgitlabなど踏み台サーバ経由でアクセスするようなクローズドなgit環境からghq getしたいときの書き方です

https://＜ホスト名＞/gitlab/＜親の名前＞/＜リポジトリ名＞/tree/master
にアクセスしたいとき、
下記のコマンドをたたく

```
ghq get git@＜ホスト名＞:＜親の名前＞/＜リポジトリ名＞.git
```

事前に~/.ssh/configに下記のように書いておく

```~/.ssh/config
Host ＜ホスト名＞
    HostName        ＜ホスト名＞
    Port            22
    IdentityFile    ~/.ssh/id_rsa
    User            git
    ProxyCommand    ssh -qCW %h:%p ＜踏み台接続名＞

Host ＜踏み台接続名＞
    HostName        ＜踏み台サーバのIPアドレス＞
    Port            22
    IdentityFile    ~/.ssh/id_rsa
    User            ＜あなたのユーザ名＞
```

参考
http://jetglass.hatenablog.jp/entry/2015/04/23/184339
flow:checkが対象をチェックしない問題

#はじめに
携わっているプロジェクトではflowを利用しているがほぼ使っていない。とりあえず入れて見たというノリらしく、ほんの一部のファイルをチェックしているだけという状況だった。自分にふられたタスクは他のファイルも少しづつflowでチェックしていこうというゆるーいもので、そこで問題にぶち当たった話。

#問題
flowはファイルの先頭に `// @flow` とかかけばそのファイルとかそこにimportされているものとかをチェックしてくれるので、部分的にチェックする際には便利。とりあえず適当なファイルを見つけて `// @flow` を付けて見たのだが、一向にエラーが出てこない。明らかなエラー文を入力してもエラーが出てこなかった。

#解決
configファイルを漁った。

```:.flowconfig
[ignore]
.*/node_modules

[options]
module.system.node.resolve_dirname=node_modules
module.system.node.resolve_dirname=src
module.ignore_non_literal_requires=true
```

原因としては`module.system.node.resolve_dirname=src`が悪さをしていた。
以下のサイトで原因はわかった。

>node_modules以下に配置されたコードは、Flowの検査対象になっているコードから使用されていない限り、検査されない（つまり遅延検査される）ようになりました
[Flowがエラーを表示しない、または奇妙なタイミングでエラーを表示することへの対処療法](https://developer.feedforce.jp/entry/2017/11/17/185508)

src配下指定しちゃったので検査対象ではなくなってしまったみたい。バージョンが上がってからこうなってしまったらしいですね。
上記記事では別のjsから参照させる、みたいなことしていましたがそもそも`module.system.node.resolve_dirname=src`をする意味がなさそうだったのでそこ消しまして、出てきたエラーたちと戦いました。大体frow-typedを追加していく作業でしたね。

#感想
flow入れてみる系記事に`module.system.node.resolve_dirname=src`さらっと書いてあるところもあったので、そこ見たら割とやっちゃいそうなミスだなーと思う。flow自体もうTSでいいじゃん的な流れになっていそうなので、中々新しい記事見ないし…。
sbtでstormを使うには


```build.sbt
name := "StormTest"

version := "0.1"

scalaVersion := "2.11.8"

resolvers += "clojars" at "https://clojars.org/repo/"

// https://mvnrepository.com/artifact/junit/junit
libraryDependencies += "junit" % "junit" % "4.12" % Test

// https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient
libraryDependencies += "org.apache.httpcomponents" % "httpclient" % "4.5.6"

// https://mvnrepository.com/artifact/org.jsoup/jsoup
libraryDependencies += "org.jsoup" % "jsoup" % "1.11.3"

// https://mvnrepository.com/artifact/org.apache.solr/solr-solrj
libraryDependencies += "org.apache.solr" % "solr-solrj" % "7.6.0"

// https://mvnrepository.com/artifact/org.apache.storm/storm-core
libraryDependencies += "org.apache.storm" % "storm-core" % "1.2.2"

// https://mvnrepository.com/artifact/com.digitalpebble.stormcrawler/storm-crawler-core
libraryDependencies += "com.digitalpebble.stormcrawler" % "storm-crawler-core" % "1.13"
```

- resolverの設定が必要
- https://stackoverflow.com/questions/49112397/stormcrawler-maven-packaging-error
- ないと，Could not find artifact ring-cors:ring-cors:jar:0.1.5 in central 的なエラーが
ROS2 Crystalでopenspliceに切り替える

せしまるです。

ROS2 ardentの時にopenspliceを使っていたので、crystalでもopenspliceを使おうと思いました。

追記 2019/01/30
ROS2をソースからビルドするときに、openspliceを入れ忘れたときの方法となります。
（せしまるはopenspliceいれてビルドしたと思い込んでいました）

# 環境
・ROS2 crystal
・ubuntu 16.04

# ardentの時は？

.bashrcに下記一文を追加していただけなきがします？

```console:console
export RMW_IMPLEMENTATION=rmw_opensplice_cpp
```

端末を再起動して、ソースコードのビルドを行い動かすという感じでした。


# crystalだと？

最初はardentの時と同じように.bashrcに書いただけでした。

端末再起動してビルド～('ω')なんてしてたら

***エラーでた***

```console:console
CMake Error at /opt/ros/crystal/rmw_implementation/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:47 (message):
  The RMW implementation has been specified as 'rmw_opensplice_cpp' through
  the environment variable 'RMW_IMPLEMENTATION', however it is not in the
  list of supported rmw implementations, which was specified when the
  'rmw_implementation' package was built.

```

日本語訳

>/opt/ros/crystal/rmw_implementation/share/rmw_implementation/cmake/rmw_implementation-extras.cmake:47（メッセージ）でのCMakeエラー：
  RMW実装は、次のようにして「rmw_opensplice_cpp」として指定されています。
  環境変数 'RMW_IMPLEMENTATION'です。
  サポートされているRMW実装のリスト。
  'rmw_implementation'パッケージが構築されました。

んー何がだめなんだろうと思い調べていると、crystalではやり方が違うことがわかりました。

追記 2019/01/30

ちなみにros2コマンドを叩いてもエラーが出ます。

```console:console
```

これは、librmw_opensplice_cpp.soファイルが見つからないと言っていますね。
つまり、openspliceは入ってない・・・
libファイルがあるべき場所は「~/ros2_ws/install/rmw_opensplice_cpp/lib/」

# openspliceを入れる

ここからopenspliceを入れていきます。
まずdebianパッケージからopenspliceを取得。

```console:console
$ sudo apt install libopensplice69
```

その後、~/.bashrcに下記を追加します。

```c
export OSPL_URI=file:///usr/etc/opensplice/config/ospl.xml
```

# ROS2の再インストール

16.04なのでソースからのビルド＆インストールになります。
ソースを落としてくるところから始まります。

```console:console
// ros2インストールフォルダを削除
$ sudo rm -rf ~/ros2_ws/install
$ mkdir -p ~/ros2_ws/src
$ cd ~/ros2_ws
$ wget https://raw.githubusercontent.com/ros2/ros2/release-latest/ros2.repos
$ vcs import src < ros2.repos
$ sudo rosdep init
$ rosdep update
$ rosdep install --from-paths src --ignore-src --rosdistro crystal -y --skip-keys "console_bridge fastcdr fastrtps libopensplice67 libopensplice69 python3-lark-parser rti-connext-dds-5.3.1 urdfdom_headers"
$ cd ~/ros2_ws/
$ colcon build --symlink-install --packages-ignore qt_gui_cpp rqt_guicpp
```

終わったら
「~/ros2_ws/install/rmw_opensplice_cpp/lib/librmw_opensplice_cpp.so」ファイルが存在するかを確認します。

# opensplice適用

~/.bashrcに追記します。

```console:.bashrc
export RMW_IMPLEMENTATION=rmw_opensplice_cpp
```

端末を再起動して、下記コマンドを実行

```console:console
$ echo $RMW_IMPLEMENTATION
rmw_opensplice_cpp
```

rmw_opensplice_cppとでたら成功です。
colcon buildもエラーが出ずに通ります。


# 最後に

最初に書いていたものからだいぶ変わりました。申し訳ございません。
また、インストールする場所が同じなら--merge-installでもよかったのかな…


今回はここまでです。
ご意見等お待ちしております。
C# Dictionaryのkeyとvalueを連結する

# やりたいこと
```.cs:Dictionaryの例
// サンプルデータ
var profile = new Dictionary<string, string>() {
	{"name", "お名前"},
	{"age", "３０歳"},
	{"address", "日本"},
	{"blood", "AB型"},
};
```
という `Dictionary` を、以下のように keyとvalueを `:`で連結し、さらにそれらを 改行コード`\n` で連結する。
結果として、以下のような出力をしたい。

```:結果
name : お名前
age : ３０歳
address : 日本
blood : AB型
```

# やり方
以下のように、 `String.Json` と Linqの`Select` で ワンライナーで実装する

```.cs:実装
// サンプルデータ
var profile = new Dictionary<string, string>() {
	{"name", "お名前"},
	{"age", "２０歳"},
	{"address", "日本"},
	{"blood", "AB型"},
};

var result = String.Join("\n", profile.Select(kvp => kvp.Key + " : " + kvp.Value));
Debug.Log(result);
```

# おまけ：拡張メソッド
よく使われそうなので拡張メソッドにする

```.cs:拡張メソッド実装
public static class DictionaryExtensions {

	public static string ToJoin<TKey, TValue>(
		this IDictionary<TKey, TValue> source, string separator, string join) 
	{
		return string.Join(separator, source.Select(kvp => kvp.Key.ToString()+join+kvp.Value.ToString()));
	}
}
```


```.cs:使用例
// サンプルデータ
var profile = new Dictionary<string, string>() {
	{"name", "お名前"},
	{"age", "２０歳"},
	{"address", "日本"},
	{"blood", "AB型"},
};

var result = profile.ToJoin("\n", " : ");
Debug.Log(result);
```


# 参考
[How to use Aggregate method of Dictionary<> in C#?](https://stackoverflow.com/questions/14033529/how-to-use-aggregate-method-of-dictionary-in-c)
Analytics のカスタムアクションでレコードを取得する

##Analytics のカスタムアクション
Analytics では、テーブルウィジェットから任意の Visualforce ページを開くカスタムアクションを作成出来ます。Visualforce ページには SAQL 文が渡され、Analytics の Rest リソースにアクセスする事で、テーブルに表示されているレコードを取得する事ができます。

##ユースケース
Salesforce の公式のヘルプでは、テーブルに表示される取引先に対し、Visualforce と Apex を使って一括で商談を作成する処理が紹介されています。
[SALESFORCE ヘルプ - Analytics から複数の Salesforce レコードへの一括アクションの実行](https://help.salesforce.com/articleView?id=bi_dashboards_configure_bulk_actions.htm&type=0)


##サンプルコードと設定
Analytics から渡された SAQL の表示とレコードの取得を行う Visualforce ページと Apex のサンプルです。

```html:SampleCustomActionPage.vfp
<apex:page controller="SampleCustomActionPageController" >
    <script>
    // SAQL クエリを取得し、エンコードしておく。
    const query = '{!JSENCODE(query)}';
    console.log(query);        
    
    // Analytics の REST リソースに対しクエリの発行をリクエストする。
    // 結果からレコードリストを取り出し、コンソールに出力する。
    fetch('https://[yourdomain]/services/data/v44.0/wave/query', {
        method: 'POST', 
        headers: {
            'Authorization': 'Bearer {!$Api.Session_ID}',
            'Content-Type': 'application/json'
        }, 
        body: JSON.stringify({'query': query})
    })
    .then(function(response) { return response.json(); })
    .then(function(json) { console.log(json.results.records); })
    </script>
</apex:page>
```

```java:SampleCustomActionPageController.apxc
public class SampleCustomActionPageController {
    public String getQuery() { // 今回はゲッターのみ作成。VF からは {!query} でアクセス
        return ApexPages.currentPage().getParameters().get('query');
    }
}
```

作成した Visualforce ページをカスタムアクションとして登録

![Screen_Shot_2019-01-29_at_15_45_04.png](https://qiita-image-store.s3.amazonaws.com/0/26378/979cf9b4-cd25-050d-96b8-7afe3a44865e.png)


##実行結果
- コンソールの出力結果は以下の通り。
 - 1 行目は SAQL 文
 - 2 行目はレコードの取得結果です。

![Screen Shot 2019-01-29 at 15.51.29.png](https://qiita-image-store.s3.amazonaws.com/0/26378/eecd545f-5c87-1c86-c55a-4d88956e09b7.png)


##注意点
- テーブルウィジェットで表示するレコード数は、デフォルトで 100 件(q = limit q 100)となっているが、UI 上の設定で変更で最大 10000 件(q = limit q 10000)まで取得出来ます。
- 10000 件以上取得したい場合は、取得したい件数で SAQL 文を変更する必要があります。

```
変更前: q = load "XXXXX/XXXXX"; q = foreach q generate 'Id' as 'Id'; q = limit q 100;
変更後: q = load "XXXXX/XXXXX"; q = foreach q generate 'Id' as 'Id'; q = limit q 20000;
```
Universal Packageで何でもパッケージ管理

# Universal Package

Azure ArtifactsはAzure DevOpsの一部で、ビルドに必要なパッケージや生成物を管理することができます。Azure ArtifactsはMaven、npm、NuGetといったメジャーなパッケージマネージャーに対応していますが、それ以外のファイルを管理するにはどうしたらいいでしょうか。

Universal Packageはどんなファイルでも、１つにまとめて名前とバージョンをつけて保存できるパッケージ管理システムです。

大きなファイルでも効率的に転送できるよう設計されているので、ソースコードだけでなく、テストデータや学習データのようなgitで管理するには不向きなものを置いておく場所に使えそうです。

Universal Packageは現在、パブリックプレビューです。


## フィードを作成

Azure DevOpsのプロジェクトページから「Artifacts」→「New feed」で任意の名前を入れてフィードを作成します。
![Create new feed](https://qiita-image-store.s3.amazonaws.com/0/83164/160e1650-6bff-2301-4e03-744ac51f74c1.png)

フィードが空の状態
![Empty feed](https://qiita-image-store.s3.amazonaws.com/0/83164/f2f18362-b1d3-7056-315a-209ec6802801.png)

## VSTS CLIをインストール
https://docs.microsoft.com/en-us/cli/vsts/install?view=vsts-cli-latest
上のURLの通り、VSTS CLIをインストールします。
Windowsの場合、vsts-cli-0.1.4.msiをダウンロードしてインストールします。

## VSTSの認証
### Personal access token (PAT)を作成 
https://docs.microsoft.com/ja-jp/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azdevops
自分のプロフィール→「Security」→「Personal access tokens」→「New Token」でtokenを作成。tokenをメモしておきます。

### CLIでログイン
```
> vsts login --token xxxxxxxxxx
```
先ほど取得したtokenを指定します。

## Publish

パッケージしたいディレクトリに移動して、コマンドを実行します。
`{myorg}`は、自分のOrganizationに置き換えてください。

```powershell

> vsts package universal publish `
  --instance "https://dev.azure.com/{myorg}" `
  --feed "testfeed" `
  --name "my-package" `
  --version "1.0.0" `
  --description "My description" `
  --path .
```
フィード名、パッケージ名、バージョンを指定します。オプションで説明をつけることもできます。

すると、このようにフィードに追加されます。
![publish1](https://qiita-image-store.s3.amazonaws.com/0/83164/3d030fe8-cf55-ba0f-b5d4-fb106b4d9cd0.png)

## Download

パッケージをダウンロードしたいディレクトリに移動して、コマンドを実行します。

```powershell
vsts package universal download `
  --instance "https://dev.azure.com/{myorg}" `
  --feed "testfeed" `
  --name "my-package" `
  --version "1.0.0" `
  --path .
```

## 更新

publishコマンドをそのままもう一度実行すると、すでにそのバージョンがあると怒られます。フィードから削除したとしても、履歴は残っていて、一度公開したバージョンを変更することはできません。

バージョン番号を変えて、Publishします。

```powershell
> vsts package universal publish `
  --instance "https://dev.azure.com/{myorg}" `
  --feed "testfeed" `
  --name "my-package" `
  --version "1.0.1" `
  --description "My description" `
  --path .
```

フィードに２つのバージョンが追加されています。
![publish2](https://qiita-image-store.s3.amazonaws.com/0/83164/388b634b-20b2-81ca-41ef-6d48de2f96a2.png)

# まとめ

VSTSのUniversal Packageのコマンドは`publish`と`download`の２つだけです。
例えば、既にローカルにダウンロードしたバージョンが何なのかを調べる方法はありません。

## Azure CLIの使用について

Universal Packageの操作には、Azure CLIを使うこともできるはずです。

https://docs.microsoft.com/en-us/azure/devops/artifacts/quickstarts/universal-packages?view=azdevops&tabs=azuredevops

最初は、こちらの手順に沿って、Azure CLIを使ってやってみていたのですが、

`az artifacts uinversal publish`コマンドを実行しても、
> Encountered an unexpected error.
Microsoft.VisualStudio.Services.Common.VssServiceException: TF400813: The user '#####################' is not authorized to access this resource.

というエラーが出て失敗しました。認証の問題だと思いますが、よく分からなかったので、今回はVSTS CLIの方を使ってみました。
Contact form7のスパム対策メモ

#起
メモなので突っ込み不要。
ちなみにこのドキュメントは2019年1月29日に書いている。
**Changelog**：1月30日に**Invisible reCaptcha**の記述を行った。

#reCAPTCHAv3に関して
Contact form7の保護とWordPress領域の保護の2つの内容を書いた。
どちらを使って問題はあまりない。ただし、Invisible reCaptchaの場合reCAPTCHAのアイコンはContact form7領域のみに表示されるようだ。

##Contact form7のみの設定の場合
**reCAPTCHA**はv3からフォームへのタグがいらなくなった。
単純にインテグレーションの設定に**サイトキー**と**シークレットキー**を入れたらお終いである。
また、**Contact form7**の最新版では**reCAPTCHAv2**の設定ができなくなったので、注意が必要となる。もし、reCAPTCHAv2を使いたいのであれば、Contact form7のバージョンを落とさないと行けないが、セキュリティを考えるとバージョンダウンをお奨めできない。

##Invisible reCaptchaを使った保護
また、サイト全体をカバーするのであれば**Invisible reCaptcha**を導入するのもいいだろう。
導入自体はInvisible reCaptchaのプラグインをインストールし、有効にする。
その後はSettingから**サイトキー**と**シークレットキー**を入れ、**WordPress**タブに移動し、すべてにチェック、また**Contact Forms**タブにある**Enable Protection for Contact Form 7**にチェックを入れる。
これでWordPress関連に関してはreCAPTCHAv3で保護されることになる。
ただし、この際Contact form7でインテグレーションの設定をしている場合は必ず破棄することを忘れてはならない。破棄しておかないとフォームエラーとなり、送信できなくなる。
また、Invisible reCaptchaを使用するとreCaptchaのアイコンがContact form7領域のみに表示されるようだ。

#Really Simple CAPTCHAを使うスパム対策
何かの理由でGoogleサービスが使えない場合は、**Really Simple CAPTCHA**を使う方法がある。
使い方はReally Simple CAPTCHAのプラグインをインストールし、有効にする。
その後、フォーム内に次のようにタグを入れる。

```
[captchac captcha-1] [captchar captcha-1]
```

数字は任意。
注意点は必ずタグは2つでセットとであり、`captchac`と`captchar`の数字は必ず揃えること。
後は保存すれば次の様に表示される。

<img width="710" alt="Safari001.png" src="https://qiita-image-store.s3.amazonaws.com/0/125657/b1ceb00b-a59e-6975-159d-289d051d0254.png">

しかし、現在のフォームスパムはOCRとAIが実装されており、いくら文字を変形させても突破する。なので、本来的には**reCAPTCHAv3**の使用をお奨めする。

#結
結構Contact form7のスパム対策の記事は多いけど、大概の記事が古くなっており、あまり役に立たなかったので、ここにまとめた。
もし何かの参考になったら幸いだ。
ちなみに自身が管理しているWordPressではreCaptchav3を入れたらスパムが全く来なくなった。
Swift 今いるStackViewのコンテンツに差し替え、追加を行う処理

~~~Swift
IBAutolet @let stackView
~~~
パラメータ

~~~Swift
var stackCell = StackCell(frame: baseStackCell.bounds)
// 元々のビューの位置はそのままキープ
if index.section < self.stackView.arrangedSubviews.count,let view = self.stackView.arrangedSubviews[index.section] as? StackCell {
                if self.stackView.arrangedSubviews.contains(view) {
                    self.stackView.insertArrangedSubview(view, at: index.section)
                }
            } 
// 元のビューにいない場合は、追加する
else {
                self.stackView.addArrangedSubview(stackCell)
            }
~~~


---


## 関連記事

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

---

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

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

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

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

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

https://workshop.themedia.jp/

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

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

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

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

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

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

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

#スポンサー募集
DNSサーバーの正引き/逆引きリストの整理

#DNSサーバーに古いPCが残ってしまっている事がある。

ADのマシンアカウントは削除しても、DNSサーバーと連動していないのか、ゴミ情報が溜まってしましまった。
DNSマネージャからゴミは確認できるものの、多すぎて、GUI操作では全部削除は困難。
一覧出力　⇒　コマンドで一括削除がよい

↓これが、全部ゴミ情報
![image01.png](https://qiita-image-store.s3.amazonaws.com/0/284238/aafce3c8-93ab-ffd4-8a43-fc84d131e2a5.png)

#整理手順

## Step 1. 以下のコマンドでDNSに登録されているPCを一覧出力する。

```powershell
dnscmd {DNSサーバー名} /ZonePrint {ゾーン名} >c:\temp\log.log
```


## Step 2. Active DirectoryからPC一覧を取得

```powershell
powershell 
$op = "C:\temp\AD_Workstations.csv"
$Datas = @()
$Data  = get-adcomputer -LDAPFilter "(name=*)"   -SearchBase "OU=Workstations,OU={対象のOUパス},DC={Domain名},DC={com}"    -Properties *   | select Name,Description,Enabled,LastLogonDate
$Data  | Export-Csv  $op -encoding Default -NoTypeInformation
```

## Step 3. 出力された両方のファイルから削除対象を見つける。


## Step 4. DNSに対して削除コマンドを投げる

***エディタか何かを利用して、PC名の前に、「dnscmd {DNSサーバー名} /RecordDelete  」を付ける。

```powershell
dnscmd {DNSサーバー名} /RecordDelete  {PC名}
```

## Step 5. 逆引きリスト
逆引きリストも整理する場合は、Step1の{ゾーン名}を逆引きリストに変えて実施する

## 終わり
【備忘録】画像をその場で拡大する方法

こんにちは。
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている@hotoke6です。
今回はwebページでページを移動せずその場で画像を拡大できる「[LightBox2](https://lokeshdhakar.com/projects/lightbox2/)」の使い方について備忘録を残しておきます。

##LightBox2とは
LightBox2とはJavaScriptのアプリケーションで、[Lokesh Dhakar](https://lokeshdhakar.com/)というエンジニアによって開発されました。
LightBox2を利用することで別ページを開かずそのページ上でサムネイルを拡大することが可能になります。

**公式サイトの例**
<img width="1280" alt="スクリーンショット 2019-01-29 15.49.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/301887/ba13e19e-4a72-aa12-8572-d3fdc6bd4582.png">

任意の画像をクリックすると、、、
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

<img width="1280" alt="スクリーンショット 2019-01-29 15.50.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/301887/5e0b17d8-65bb-2e16-751f-b0816e0ba83c.png">

このように画像を拡大した窓が開きます。

##LightBox2の使い方

まずheaderでLightBox2のファイルを読み込みます。

```
<head>
---------------------
    <link href="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.7.1/css/lightbox.css" rel="stylesheet">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js" type="text/javascript"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.7.1/js/lightbox.min.js" type="text/javascript"></script>
</head>
```
1つ目のscriptタグは[Google Hosted Libraries](https://developers.google.com/speed/libraries/#jquery)から拾ってきたjqueryのファイルですので、すでに書かれている場合は省略可能です。

次に拡大させたいimg src=""の画像ファイルを以下のようにa hrefタグで囲みます。

```
<a href="animal/monkey.jpg" data-lightbox="group">
　　<img src="animal/monkey.jpg">
</a>
```

a hrefの中には画像のリンクとdata-lightboxに任意のグループ名をつけます。
また必要な場合はdata-titleで画像にキャプションをつけることができます。


##まとめ
以上、今回はLightbox2を用いて画像を拡大する方法をまとめました。
Firebase Analyticsで集めたデータをBig Queryで分析する時にuserIdをセットする方法

[Firebase Analytics](https://firebase.google.com/docs/analytics/?hl=ja)のドキュメントにはユーザープロパティについての説明はあるものの[setUserId](https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.html#setUserId(java.lang.String))についての説明がありません。

ですが、[Firebase AnalyticsのAPIのドキュメント](https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.html#setUserId(java.lang.String))にはsetUserIdというのがあり、これをセットすることで、BigQueryで分析する時のユニークIDとして使える模様です。

```swift
import Firebase

Analytics.setUserID(id)
```

Googleのブログに書いてありました↓

>Firebase’s custom user id value can be set using the setUserId API and is stored in the user_dim.user_id field in BigQuery.
[How to do cross-platform analytics with Google BigQuery](https://cloud.google.com/blog/products/gcp/how-to-do-cross-platform-analytics-with-google-bigquery)


# 参考にしたリンク
- [FirebaseのBigQueryを使ってみた](https://qiita.com/_natsu_no_yuki_/items/729ce9bec67ced8d1cb3)
- [How to set user identity | stackoverflow](https://stackoverflow.com/questions/38568864/how-to-set-user-identity)
- [Firebase Analytics Filter By User ID | stackoverflow](https://stackoverflow.com/questions/42137190/firebase-analytics-filter-by-user-id)
- [Firebase Analytics調査メモ](https://gist.github.com/yamacraft/f2ee0dcea410dfa1b7cc91579304c2ba)
- [How to do cross-platform analytics with Google BigQuery](https://cloud.google.com/blog/products/gcp/how-to-do-cross-platform-analytics-with-google-bigquery)
- [Firebase 向け Google アナリティクス](https://firebase.google.com/docs/analytics/?hl=ja)
axiosを使ってReactでUnsplash APIを叩いてみた

#概要
今回はaxiosを使って外部APIを叩いてみたいと試みます。

#Unsplashについて
外部APIとして使ったUnsplashというのはサンプル画像を提供している場所です。
これを使い、ボタンをクリックしたら写真一覧が表示されるといったものを作っていきます。

詳細
>https://unsplash.com/developers

#コードを書いていく
とりあえずcreate-react-appでディレクトリを作成して、axiosをインストールします。

```terminal
create-react-app react-unsplash
cd react-unsplash
npm install --save axios
npm start
```
次にindex.jsはこちらになります。
今回の構成要素としてはデータを取得しstateに保存するApp.jsと、そのデータを表示するImageList.jsになります。

```javascript:src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import App from './components/App';

ReactDOM.render(
  <App />,
  document.querySelector('#root')
);
```

次にApp.jsはこちらになります。

```javascript:src/components/App.js
import React, { Component } from 'react'
import ImageList from './ImageList';

class App extends Component {
  state = { images: [] };

  getPhotos = () => {
    //apiからデータを取得してstateに保存する処理
  }

  render() {
    return (
      <div>
        <input 
          type="button" 
          value='get photos'
          onClick={this.getPhotos}
        />
        <ImageList images={this.state.images} />
      </div>
    );
  }
}
```
上記のコードからボタンをクリックしたらgetPhotosが呼ばれ、そこでデータを取得してstateに保存し、ImageListで表示するというイメージがわかると思います。

次にUnsplashと通信する処理を書いていきます。

ここでaxiosを使うのですが、axiosにはcreateやgetといったメソッドがあるのですが今回はデータを取得するgetメソッドを使っていきます。これは第一引数にエンドポイント、第二引数にパラメーターや認証情報を書いていきます。
以下、getPhotos関数のコードになります。

```javascript
import axios from 'axios';

getPhotos = async () => {
  const response = await axios.get("https://api.unsplash.com/photos", {
    headers: {
      Authorization: "Client-ID YOUR_ACCESS_KEY" //YOUR_ACCESS_KEYは登録時に取得できる
    }
  });

  this.setState({ images: response.data });
}
```

非同期通信はasync/awaitで書いています。
また、bindする必要があるのでアロー関数で書いています。

以下、App.jsの全コードです。

```javascript:src/components/App.js
import React, { Component } from 'react';
import axios from 'axios';
import ImageList from './ImageList';

class App extends Component {
  state = { images: [] };

  getPhotos = async () => {
    const response = await axios.get("https://api.unsplash.com/photos", {
      headers: {
        Authorization: "Client-ID YOUR_ACCESS_KEY"
      }
    });
    
    this.setState({ images: response.data});
  }

  render() {
    return(
      <div>
        <input 
          type="button" 
          value='get photos'
          onClick={this.getPhotos}
        />
        <ImageList  images={this.state.images} />
      </div>
    );
  }
}

export default App;
```

最後にImageList.jsで表示します。

```javascript:src/components/ImageList.js
import React from 'react';

const ImageList = (props) => {
  const images = props.images.map(image => {
    return <img key={image.id} src={image.urls.regular} alt={image.description} />;
  });

  return (
    <div>
      {images}
    </div>
  );
}

export default ImageList;
```

.dataや.id、.urlsなどはconsole.log(response);で調べていくとどういったデータが帰ってきているのかわかるので、そこから取っています。
あとはstateの配列をmapで回して写真一覧を表示する、といった流れになります。

#まとめ
今回はaxiosを使って外部APIとの通信を行いました。
getメソッドしか使っていないので今後色々試してみたいと思います。
他にも面白い外部APIはあると思うのでたくさん触っていきたいと思います。
正規表現とは。。。

【正規表現】
・文字列の一部分を置換する
・文字列が制約を満たしているか調べる
・文字列の一部分を抽出する

◎JavaScriptにおける正規表現利用のメソッド
・replacs()メソッド

→任意の文字列を別の文字列に置き換える（置換）ことができるメソッド

・match（）メソッド

→引数に指定した文字列がレシーバの文字列に含まれているか否かをチェックするためのメソッド

◎使い方
replaceメソッド（電話番号からハイフンを
取り除く）

```
var tel = '090-1234-5678';
undefined
 tel.replace(/-/g, "");
"09012345678"
```
解説
【グローバルマッチ】
/ の後に　ｇ　と書かれているところに注目！
文字列内で指定した文字が含まれている場合、その全てを置換えするするというオプションです。
ｇをつけない場合は、初めの一つだけ置換えられます。


match()メソッド（パスワードに英数字８文字以上という制約を設定）

```
> var pass = 'Hoge1234';
=>  undefined
> pass.match(/[a-z\d]{8,}/i);
=> ["Hoge1234"]
```

解説
[a-z]: 角括弧で囲まれた文字のいずれか 1 個にマッチする
⇒-(ハイフン)を使用することで範囲を設定することができます

\d: 数字にマッチする
⇒、\dは角括弧の内部にあるので、[a-z\d]は「英数字のいずれか１つにマッチ」という意味です。

{n, m}: 直前の文字が少なくとも n 回、多くても m 回出現するものにマッチする
⇒{8, }は、直前の文字が少なくとも８回出現するもにマッチという意味です。

i: 大文字・小文字を区別しない検索

◎正規表現のパターン記述
--------------------------------------
[a-z]  角括弧で囲まれた文字のいずれか 1 個にマッチ
/d     数字にマッチ
{n, m} 直前の文字が少なくとも n 回、多くても m 回出現するものにマッチ
.      どの一文字にもマッチ
+　　　　　　　　　　　　直前の文字の 1 回以上の繰り返しにマッチ

---------------------------------------
オプションフラグ
ｇ　　　　　　　　　　　　グローバルマッチと呼び、文字列内で指定した文字が複数含まれている場合、その全てを置換
i      大文字・小文字を区別せずに検索

---------------------------------------

例：
"good friend".match(/good/)
⇒["good"]

'Cat'.match(/cat/);
=> null　
'Cat'.match(/cat/);
=> null
＊大文字小文字の区別なし

> var mail = 'aaaa@gmail.com';
=>  undefined
> mail.match(/@.+/);
=> ["@gmail.com"]
Bootstrap4の使い方を簡潔にまとめる

#はじめに
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているkento_oです。
この記事は、Bootstrapの使い方を紹介していきます。

##Bootstrapとは
Bootstrapは、フレームワークの一種です。
Webサイトやホームページがこれを使うだけで、効率的・簡素に作成することが可能です。
それでは、以下に使い方をご紹介します。



##Bootstrapの使い方
[Bootstrapの公式ダウンロードページ](https://getbootstrap.com/docs/4.2/getting-started/download/)から「CSSファイル」「JSファイル」の二種類がダウンロードできます。
次に、公式ページ内にあるBootstrap 4 ドキュメントの[Getting started](https://getbootstrap.com/docs/4.2/getting-started/introduction/)にアクセスし、「Starter template」をコピーします。
「Starter templete」を「任意の名前.html」ファイルで保存すれば、Starter templeteのページが完成します。
Web上にもBootstrapでググるだけで、様々なWebサイト・ホームページのテンプレートや部品が発見できます。
また、Javascriptを使っての挙動も用意されているので、汎用性が非常に高いフレームワークです。








##まとめ
Bootstrapの使い方をご紹介しました。
現在BootstrapをAtomで使いやすくするべく、方法を模索中です。
後、Linuxがプログラミングに向いているとWebで良く見かける理由を、最近やっと理解し始めている段階です。
VPC超入門! VPCの中にEC2を作りSSH接続する方法 - AWS

[できる](https://off.tokyo/blog/vpc%e3%81%ae%e4%b8%ad%e3%81%abec2%e3%82%92%e4%bd%9c%e3%82%8assh%e6%8e%a5%e7%b6%9a-aws/)
【Blender】アニメーションで3Dモデルを動かす

<img width="500" alt="スクリーンショット 2019-01-29 15.21.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/258078/b80d8778-582a-5398-3dd4-f914a6c4ea4d.png">


今までの記事
1. [【超初心者向】Blenderで3Dモデルを作る](https://qiita.com/mochifuture/items/2b79c27bcd0faa2d26e8)
2. [【Blender】 ボーンを入れてウェイトペイント、ポージング](https://qiita.com/mochifuture/items/a12151edb9362dda4ab6)

# アクションを作る

左下ヘッダーより、`ドープシート`を選択
`アクション`に変更（アクションエディター）
`新規`をクリック
<img width="700" alt="スクリーンショット 2019-01-29 13.12.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/258078/8b7a0f09-c5c3-657b-41d9-fa4e614227e1.png">

例としてアクション名をWalkとします

**アクション名の横にあるFボタンを押しておく！！**
<img width="219" alt="スクリーンショット 2019-01-29 13.20.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/258078/21a6c74b-b96e-1200-3992-e7c76041f89c.png">

クリック後↓　これでOK
<img width="240" alt="スクリーンショット 2019-01-29 13.20.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/258078/79493405-b253-6f49-9f92-cbdd0c4d74d0.png">

**押し忘れるとアクションが消えます｡ﾟ(ﾟ´Д｀ﾟ)゜｡**

# 3D Viewでポーズモードを表示

パンダのポーズをリセット
Aで全選択し　移動解除`Option+G`、回転解除`Option+R`

# タイムラインウィンドウでキーフレームを打つ

<img width="883" alt="スクリーンショット 2019-01-29 15.28.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/258078/59b702d2-b9c5-8d82-94ad-ec6d4a908bc5.png">

+ タイムライン　緑のライン。現在のフレーム。
+ 黄色い線　キーフレームを挿入した位置（最初はなし）
+ 開始/終了　アニメーションの長さを決めます。
+ 現在のフレームの数値
+ 再生パネル　アニメーションを再生、早送りなど

エンドタイムを　48にする（任意）
現在のフレームを 1にする
3D View上、ポーズモードでポーズをつける
Bone全体を選択し、3D Viwe上で`I` ->「位置、回転」キーフレームを打つ

`Ctrl+C`でポーズをコピー

24フレーム目に移動し、
`Shift+Ctrl+V`　ポーズを反転してペースト
3D Viwe上で`I` ->「位置、回転」キーフレームを打つ

48フレーム目に移動し、
`Ctrl+V`最初のポーズをペースト
3D Viwe上で`I` ->「位置、回転」キーフレームを打つ

キーフレームを削除したいとき
3D Viwe上で`option+I` ->「キーフレームを削除」

アニメーションを再生すると、モイちゃんが歩きます！
![ezgif.com-video-to-gif (1).gif](https://qiita-image-store.s3.amazonaws.com/0/258078/23404af0-d6f4-6af0-e493-b5c675212e44.gif)

アニメーションを追加するときは
ドープシートに戻り、アクションを追加 ->タイムラインで編集
`F`ボタンを押すのを忘れずに！

### 参照記事
[初心者のための！作って学ぶBlenderの基礎：⑤アニメーションを設定する](https://nvtrlab.jp/column/2-5)