OmniAICreator/Qiita-1.07M huggingface dataset:
【PowerShell】Get-Historyを強化してコマンドの全履歴を取得するモジュールを作成した

# ■今回つくったもの

PowerShellモジュール`Get-All-History`

# ■自分が試した環境

- Windows10
- PowerShell 5.1

# ■モジュール作成の経緯

## Get-Historyが使いにくい

- コマンドの全履歴をみたいのに、一回PowerShellを閉じちゃうとそこでの履歴は見れない。


# ■`Get-All-History`ができること

1. 過去に実行したコマンドすべての履歴を取得できる
2. 指定数だけ表示できる
3. ID指定ができる（ID表示未対応のため使いづらさマックス）

## 過去に実行したコマンドすべての履歴をする

```PowerShell
PS> Get-All-History
```

下記コマンドを実行すると、コマンドの全履歴が記録されたテキストファイルのパスが取得できる。
今回作成のモジュールは、これを参照して履歴を表示している。

```PowerShell
PS> (Get-PSReadLineOption).HistorySavePath
```

## 指定数だけ表示する

```PowerShell
PS> Get-All-History -Count 5
```

最新の5件分の履歴を取得

## 取得する履歴をIDで指定する

```PowerShell
PS> Get-All-History -Id 5
```

コマンドは実行できるものの、Id表示に対応してないのでどの履歴がどのIdに紐付いてるかがわかりにくいと思うので、ほぼ使えないオプションです...
一応説明しておくと、一番古い履歴のIdが1です。


# ■コマンドレットを初めて作成してみた
これを見てつくりました。
[▼PowerShell のモジュール詳解とモジュールへのコマンドレット配置手法を考える](https://tech.guitarrapc.com/entry/2013/12/03/014013)

今回モジュールのファイル名を`getAllHistory.psm1`にしたので、
`$env:USERPROFILE\Documents\WindowsPowerShell\Modules`ディレクトリ内に、
ファイル名と同じ名前のディレクトリを作成しました。

# ■よくわからなかった点

## PowerShell ISEで実行したコマンドの履歴ファイルが作成されない

このエントリーで言及している「コマンドの実行履歴」はPowerShellで実行したものを指します。
**※ISEでの履歴は含まれません。**


# ■改良したい点

## Idと履歴が表示できるようにしたい

現状は履歴のみ

# ■コード

```PowerShell:getAllHistory.psm1
function Get-All-History {
    Param(
        [Int]$Id,
        [Int]$Count = -1
    )

    # (Get-PSReadLineOption).HistorySavePath 実行で出てくるテキストファイルパスを指定します。
    $historyFile = "テキストファイルのパス"
    $hls = (Get-Content -Encoding utf8 $historyFile -Tail $Count) -as[string[]]

    # int型の初期値は0
    If($Id -ne 0) {
        Write-Host $hls[$Id]
    } Else {
        foreach($h in $hls) {
            Write-Host $h
        }
    }
}

Export-ModuleMember -Function Get-All-History
```

https://gist.github.com/itsumoonazicode/e16fec1d16d0369291c7c3a0cb5ba123
Collection.stream().map()からの拒絶を経て

# 実装したかったこと
Listの要素のクラスから2つの`String`を抽出し、
その2つの`String`を格納したPairのListを生成する。

<img src=https://qiita-image-store.s3.amazonaws.com/0/202689/3cb1e664-5cdb-8842-f4fb-f3a1e9878de6.png width=55%>


Stream使えばいけそう^^

## ビルドできない
```java
List<Hogehoge> list;

list
.stream()
.map(Pair.of(Hogehoge::getFoo, Hogehoge::getBar)) 
// ↑↑ Object is not a functional interface ↑↑
.collect(Collectors.toList())
```

ん！？

## Functional Interface !?

> 関数型インタフェースは、
> 関数メソッドと呼ばれる単一の抽象メソッドが含まれているインターフェース
> ref . [パッケージjava.util.function](https://docs.oracle.com/javase/jp/8/docs/api/java/util/function/package-summary.html)
> ref . [Java8 in Action](https://www.manning.com/books/java-8-in-action)

加えて...

> ラムダ式を使うことで、
> 関数型インターフェースの抽象メソッドの実装をインラインで明示でき、
> その全体式を関数型インターフェースのインスタンスとして扱うことができる。
> （つまるところ、関数型インターフェースの実装となる）
> ref . [Java8 in Action](https://www.manning.com/books/java-8-in-action)

なるほど。
ここで、以下の2つのことを理解。
1. 関数型インターフェースは、単一の抽象メソッドが含まれているインターフェース
2. ラムダ式により、関数型インターフェースを実装可能

## そもそもStream.map()の定義って ^^;
> <R> Stream<R> map(Function<? super T,? extends R> mapper)
> パラメータ: mapper 
- 各要素に適用する非干渉でステートレスな関数
> [インタフェースStream\<T\>](https://docs.oracle.com/javase/jp/8/docs/api/java/util/stream/Stream.html#map-java.util.function.Function-)

引数mapperの型であるFunctionは、
単一抽象メソッド`apply`を持つ「関数型インターフェース」
ref. [Interface Function\<T,R\>](https://docs.oracle.com/javase/8/docs/api/java/util/function/Function.html)

## 本題に戻って
関数型インターフェースであるFunctionをラムダ式で実装して、
mapに渡せばよいことがわかった。

```java
List<Hogehoge> list;
Function<Hogehoge,Pair<String,String>> makePairsFromObj = 
hoge -> Pair.of(hoge.getFoo(), hoge.getBar());

List<Pair<String, String>> pList = list
                .stream()
                //.map(makePairFromObj::apply) 
                .map(makePairFromObj) // Function型の変数を渡せばよい by @swordone 
                .collect(Collectors.toList());
```

もしくは、直接ラムダ式を渡す（@swordoneさんからの指摘）

```java
List<Hogehoge> list;

List<Pair<String, String>> pList = list
                .stream()
                .map(hoge -> Pair.of(hoge.getFoo(), hoge.getBar()))
                .collect(Collectors.toList());
```

＼(^o^)／
エンジニアがこれからブログではなくQiitaで記事を書くべき理由

# はじめに
アウトプットした記事をどこに積極的に投稿すればいいかの一つの参考点になればと思って書きました。

# 提言
私は[この記事](https://tcrn.ch/2C2Rdr6)をみて、
**オリジナルブログではなく、Qiitaで書いた方がコスパいいのではないか**
と思いました。

以下記事
https://tcrn.ch/2C2Rdr6

# 理由
エンジニアの転職支援 の機能がより強まってくる
==> エンジニアを採用する側が見る機会が多くなる　
==> エンジニア採用に当たるのはその会社の技術系の上層部が多い。
==>(仮説)エンジニアで有名な人ってだいたいTwitterとかSNS発信盛ん 
<img width="589" alt="スクリーンショット 2019-03-10 11.28.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/220683/477f0ea1-98a5-0e94-3ae9-a56853c74c66.png">

==> SNSでのその人たちからFFがあったりして、そこから接点もちやすくなる 
https://www.wantedly.com/companies/favy2/post_articles/146857
==> 自分の周りのレベルが上がる 
==> 周囲の見る目も変わる（周りが強いとその人も強く見られる), 記事も見られやすくなる 
==> 自分の認知高まる

## 上級者に限っては自分のブログのほうがいいかもしれない
しかし、上級者になる程 Qiitaではやらないほうがいいかもと思っています。
普通にブログ書いても技術力による内容の質向上でView数も上がって、QiitaのSEOよりも自分のブログ書いた方が上位に記事が表示されやすくなる。それによって、認知高まったり、アドセンス収入獲得というメリットがでるからです。

# 中級者までにとってはコスパいいのではないか
記事を書くことで私のやりたいこと
• アウトプットによる技術力向上
• 認知向上

逆に優先度低いこと
• アドセンス収入

将来的に見て、ブログの方が認知高まるんじゃないかという以前はブログとQiitaで迷っていましたが、Qiita に転職支援のサービスが入ることで技術系採用担当は Qiitaを見る頻度高くなるんじゃないかと思いました。少なくとも技術系のオリジナルブログを見るよりは頻度は高いということで、Qiitaを積極的な技術系の記事投稿ツールに使おうと思いました。
CentOS7.6にGUIリモートデスクトップ接続

# はじめに
CentOSのDesktop環境にリモートデスクトップ接続をインストールしたので、手順をメモします。

# 環境情報
  VirsualBoxの仮想マシンに、GNOMEをインストール済み、まだ仮想ネットワークはNATです。  

```bash
[user@localhost ~]$ cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[user@localhost ~]$ uname -a
Linux localhost.localdomain 3.10.0-957.5.1.el7.x86_64 #1 SMP Fri Feb 1 14:54:57 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[user@localhost ~]$uname -a
```

# インストール及び設定手順
## インストール  
  XRDPをインストールします。

  ```bash 
  sudo -E yum install epel-release -y
  sudo -E yum install xrdp tigervnc-server -y
  ``` 

## 起動と自動起動設定
   XRDPを起動します。まだ、次回から自動起動させるため自動起動を設定します。  

  ```
  sudo systemctl start xrdp
  sudo systemctl enable xrdp
  ```

## ファイアウォール設定
 ファイアウォールにリモートデスクトップ接続用ポートを許可するように設定します。

  ```
  sudo firewall-cmd --permanent --zone=public --add-port=3389/tcp
  sudo firewall-cmd --reload
  ```

## 仮想マシンの設定
  今回は仮想マシンのNATネットワークにホストPCから接続するためにポートフォワーディングを設定します。  

1.  Oracle VM VirtualBox マネージャーから該当する仮想マシンを選択し、「設定」⇨「ネットワーク」⇨「アダプター１」⇨「高度」⇨「ポートフォワーディング」の順にポートフォワーディングルール画面を開きます。  
2. 「＋」ボタンを押して、追加されたルール行に下記値を入力します。  

    |項目|値|
  |:-:|:-:|
  |ホストIP|127.0.0.1|
  |ホストポート|13389|
  |ゲストポート|3389|

3. 「OK」を押してルールを確定します。

#接続確認
  Windowsから接続できることを確認します。  

1. Windowsから```mstsc```コマンドでリモートデスクトップクライアントを起動します。  
2. 「コンピュータ」に「127.0.0.1:13389」を入力し「接続」をクリックします。
3. CentOSのRDPログイン画面にユーザーIDとパスワードを入力して接続します。

#参考資料
- [CentOS7にWindowsリモートデスクトップ接続する方法](https://qiita.com/SkyLaptor/items/56c9b5f5784f19cac225)  
- [CentOS7にxrdpを導入しWindowsからリモートデスクトップで接続](https://qiita.com/shinoere/items/35793d9c6155145cb37c)
`onBlur` がテストしづらい時はBreakpointを使おう

## 困っていたこと

https://jedwatson.github.io/react-select/

![Peek 2019-03-10 11-11.gif](https://qiita-image-store.s3.amazonaws.com/0/112393/97b6b429-d4f0-d572-ddb0-4cde97e03381.gif)

React用のSelectコンポーネント `React-Select` をテストするときに、コンポーネント以外の箇所をクリックすると選択肢が閉じちゃうんですが、 **DeveloperToolをクリックしても反応する** ので、開いた状態のDOM要素がどうなっているか見られず困っていました。

## 解決方法

### DOM Breakpointを使う

![image.png](https://qiita-image-store.s3.amazonaws.com/0/112393/9e2ea307-27df-4c78-0455-b80ba7908451.png)

`Elements` タブで、Breakpointを仕込みたい要素を右クリックして、 `Break on > subtree modification` を選択します。
この状態で当該要素をクリックすると、画面全体が暗転して、上の方に`Paused in Debugger` と出てきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/112393/94eb203f-a75f-b786-0c22-ccfc4b8b1a05.png)
一番右の![image.png](https://qiita-image-store.s3.amazonaws.com/0/112393/a37d8b75-7fd2-8a9b-1646-34c3915661b9.png)をクリックするとステップ実行されます。
DOMの状態を確認したいところまでポチポチ進めていきましょう。

Debuggerを解除したいときは![image.png](https://qiita-image-store.s3.amazonaws.com/0/112393/c5c71406-e976-06f9-ad60-3ed6c3254fd2.png)をクリックすると次のBreakpointまで実行されます（他にBreakpointが無ければ最後まで実行されます）。
（備忘録）Vue.js + Firebase Hosting を用いたWebサイト作成

# 1. はじめに
2019年3月9日に[UEQareer](https://ueqareer.connpass.com/)様主催にて開催された[Firebase勉強会](https://ueqareer.connpass.com/event/120412/)でのVue.js + Firebase Hosting を用いたWebサイト作成について、自分への備忘録としてまとめてみました。ご参考になれば幸いです。

# 2. 学べる内容

- Vue.js
- vue-cliコマンド操作
- Firebase
- メール認証
- Googleアカウント認証
- Realtime Database
- firebase-toolsコマンド操作
- Firebase Hosting

# 3. 学習サイト

- [Vue.js + FirebaseでToDoアプリを構築](https://ueqareer.net/2770)
- [イベントサイト](https://ueqareer.connpass.com/event/120412/)

# 4. コマンドメモ
- [Vue.js + FirebaseでToDoアプリを構築](https://ueqareer.net/2770)の参考コマンドメモです。
- [Node.jsのインストール](https://nodejs.org/ja/)
- [yarnコマンドのインストール](https://ics.media/entry/13838)

```shell
# vue-cliのインストール
$ sudo yarn global add @vue/cli

# vueコマンドのバージョン確認
$ vue --version

# vue GUIの実行
$ vue ui

# vue GUIをブラウザで表示
localhost:8000/dashbord
localhost:8080/project/create

# プロジェクトマネージャに移動して作成をクリックする
# vue-todo
# デフォルトプリセット
# （5分くらい時間がかかる）

# http://localhost:8080/
# http://localhost:8080/signin
# http://localhost:8080/signup

# firebase-toolsのインストール
$ sudo yarn global add firebase-tools

# ローカル環境の作業中vueプロジェクトフォルダに移動
$ cd firebase-todo/

# Firebaseログイン
$ firebase login

# Firebaseプロジェクトの設定
$ firebase init

# firebase initで当該Firebaseプロジェクトが表示されなかった場合
$ firebase init --project <FirebaseプロジェクトID>

# デプロイ
$ firebase deploy

# デプロイ後の完成したWebサイトへのアクセス
https://XXX-XXXX-99999.firebaseapp.com

```

# 5. おわりに
Vue.js学習の参考になれば幸いです。
ハンズオン開催してくださいました[UEQareer](https://ueqareer.connpass.com/)様、感謝いたします。

2019/03/09 TAKAHIRO NISHIZONO
vagrant基本操作

#仮想環境にcentosを入れる
vagrant box add [name] url

# 確認
vagrant box list

#vagrant 初期化
vagrant init [box name]

# ネットワークの設定
vi Vagrantfile
config.vm.network "private_network", ip: "192.168.33.10"

# vagrant-vbguestをインストトール
sudo vagrant plugin install vagrant-vbguest

#vagrant を実行する
vagrant up

#vagrant をシャットダウンする
vagrant halt

# guest hostのファイル共有
vi Vagrantfile
config.vm.synced_folder "../host_path", "/home/vagrant/guest_path"

#vagrantfileの変更を反映するため、vagrantを再起動
vagrant reload

# 仮想環境にログイン
vagrant ssh

# 仮想環境から抜く
exit

# 仮装サーバ削除
vagrant destroy

# 仮装サーバの状態表示
vagrant status
 
# box list の確認
vagrant box list
Easy-ISLispでビット演算

#はじめに
Easy-ISLisp（以下「EISL」）にはC言語を取り込む、Cラッパがコンパイラに組み込まれています。これを使うとC言語の機能をフルに使うことができます。使い方の例としてビット演算をする関数の書き方をご紹介します。

#Cラッパ
EISLのコンパイラはISLispのコードをGCCのCコードに変換する方式に拠っています。CラッパはここにCのソースを直接に記述するものです。下記の特殊形式を用意してあります。

(c-include x)  #include x に変換される
(c-option x)  コンパイルとのきのオプションにxを追加する。
(c-lang x)　C言語ソースに文字列xを挿入する。

#ビット演算の例
Cラッパを利用するとCommonLispのash関数は次のように記述できます。

```lisp
(c-include "<stdio.h>")

(defun ash (n m)
  (if (>= m 0)
      (c-lang "res = INT_FLAG | ((INT_MASK & N) << (INT_MASK & M));")
      (let ((m1 (- m)))
        (c-lang "res = INT_FLAG | ((INT_MASK & N) >> (INT_MASK & M1));"))))

```

#実行例

```
eisl -c compiler.lsp
Easy-ISLisp Ver0.91
> (compile-file "bit.lsp")
type inference
initialize
pass1
pass2
compiling ASH 
finalize
invoke GCC
T
> (load "bit.o")
T
> (ash 5 -2)
1
> (ash 5 -1)
2
> (ash (+ 5 2) -2)
1
> (ash 10 2)
40
> 

```

#補足説明
変数はすべて大文字に変換されています。このためn,m変数はC言語ではN,Mとなります。
小整数は効率化のために即値となっています。最上位から２番目のビットを立てることにより内部的に小整数と認識されます。C言語の演算子を使う場合にはこのビットが邪魔になります。そこでINT_MASKとのＡＮＤをとりそのビットを下ろしています。Cでの演算が終了した場合には即値に戻さないといけません。これはINT_FLAGとのＯＲをとることにより第二ビットを立てています。これらの値はfast.hに記述してあります。
S式の返り値はC言語内ではresという変数が保持しています。resに値を代入します。

#ラズパイでの利用
EISLは主にラズパイでの利用を想定しています。C言語による細かな操作や、WiringPIのようなCライブラリが必要なときはこのCラッパを使うことにより容易にCの機能を取り込むことができます。

#リポジトリ
EISLは現在OSSとなり、GitHubにて公開されています。BSDライセンスです。
https://github.com/sasagawa888/eisl
BeagleBoneGreenのGPIO端子の設定

[BeagleBoneGreenでGPSを受信する02](https://qiita.com/pata128/items/77516d81db2aa9bf835e)で書いた/boot/uEnv.txtを編集する方法で端子設定をすると```config-pin```を使ったGPIOの機能設定ができなくなります。(他の方法があるかもしれない。。)
PCのu-centerからGPSモジュールの設定を変更したい場合にUART端子にPCからのUART入出力を接続するのですが、出力(送信)がBeagleBoneと衝突してしまい、現在の設定値を取得するコマンドや設定するコマンドが正しく送信できません。BeagleBoneの端子設定をGPIO入力にすれば回避できますが、/boot/uEnv.txtを編集して再起動を毎回するのは面倒ですので他の方法でGPIOの設定を行います。

参考:https://gist.github.com/pdp7/d4770a6ba17e666848796bf5cfd0caee

#スタートアップスクリプトの作成
GPIO端子をUART端子に変更する設定を記述します。

```
$ sudo nano /usr/bin/enable-uart-pins.sh
```

```enable-uart-pins.sh
#!/bin/bash

config-pin p9.24 uart
config-pin p9.26 uart
```

enable-uart-pins.shのパーミッションを変更します。

```
$ sudo chmod 755 /usr/bin/enable-uart-pins.sh
```

#サービス起動スクリプトの作成
enable-uart-pins.shが起動時に実行されるようにします。

```
$ sudo nano /lib/systemd/system/enable-uart-pins.service
```

```enable-uart-pins.service
[Unit]
Description=Enable UART pins
After=generic-board-startup.service

[Service]
Type=simple
ExecStart=/usr/bin/enable-uart-pins.sh

[Install]
WantedBy=multi-user.target
```

#サービス起動設定
システム起動時に作成したサービスが起動するようにします。

```
sudo systemctl daemon-reload
sudo systemctl enable enable-uart-pins.service
```

#動作確認

再起動後にサービスが起動されていることとGPIO設定が変更されていることを確認します。

```
$ sudo systemctl status enable-uart-pins.service

● enable-uart-pins.service - Enable UART pins
   Loaded: loaded (/lib/systemd/system/enable-uart-pins.service; enabled; vendor
   Active: inactive (dead) since Sun 2019-03-10 09:31:34 JST; 1h 16min ago
  Process: 2061 ExecStart=/usr/bin/enable-uart-pins.sh (code=exited, status=0/SU
 Main PID: 2061 (code=exited, status=0/SUCCESS)

 3月 10 09:31:33 beaglebone systemd[1]: Started Enable UART pins.
lines 1-7/7 (END)
```
```
$ config-pin -q p9.24 && config-pin -q p9.26
P9_24 Mode: uart
P9_26 Mode: uart
```

これでu-centerの設定を行うときは```config-pin p9.24 gpio```で一時的にBeagleBoneの送信端子をGPIOに変更しUART出力を無効にできます。UARTに戻すときは```config-pin p9.24 uart```で。

#GPIOの入出力設定
GPIOは通常は入力がデフォルトです。GPIOが出力の場合、これもPCのUART出力と衝突してしまうため設定変更が必要です。BeagleBoneのP9.24とP9.26は初期状態は入力です。
(ちなみに、JTAG兼用端子などはデフォルトが出力に設定されている場合があります。これはプロセッサまたはマイコンによって異なるためデータシートで確認して下さい。)
GPIOの入出力設定は```/sys/class/gpio/gpio**/direction```に```in```または```out```を書き込むことで設定できます。

```
$ sudo echo in > /sys/class/gpio/gpio24/direction
```
個人または家族で使える自宅用のWebポータルシステム「MyHome Portal」

PHPで作成した個人または家族で使える自宅用のWebポータルシステム「MyHome Portal」をオープンソース/フリーソフトとして公開しています。
2008年から2016年にかけて、こつこつとバージョンアップを繰り返して作成したものです。
中級プログラマの作品ですので、ソースコードはあまりきれいとは言えません。バージョンアップを繰り返したことでコードがきたなくなってしまっている部分もあります。モジュールの構造を複雑にしすぎたかもしれません。
2016/08/02以降、バージョンアップしていません。Webサービスを利用している機能など一部は、Webサービスの停止等の理由により動作しなくなっています。
# 公開ページ
[https://ok2nd.github.io/myportal/](https://ok2nd.github.io/myportal/)
# ブログ
最近、更新はほとんどありません。
[中級プログラマの自宅でPHP ブログ](https://ok2nd.hatenablog.com/)
#コンセプト
- 自宅でポータルとして使えるシステム。(家庭内グループウェア)
- データはインターネット上ではなく、ローカルPCまたはローカルサーバに保管。
- 初級、中級プログラマにも理解可能なシステム。
- PHP、SQL、JavaScript、HTML、CSSの知識だけで理解可能なシステム。
- PHPの良さを生かしたHTMLインラインコーディング。(なるべくprint文を使わない。)
- ブラックボックスの少ないシステム。
- オブジェクト指向型プログラミングを使わない。手続き型(関数型)プログラミングを採用。
- MVCを使わない。
- フレームワークに頼らないシステム。
- テキストエディタ以外の開発ツールを必要としない。

#対象者
- 自分または家族専用のWebポータルサイトが作りたい。
- Webポータルサイトをインターネット上ではなく、ローカルPCまたは自宅サーバーで立ち上げたい。
- 日常的に良く使う機能が、個々のアプリケーションを起動せずに、ブラウザの中で出来たらうれしい。
- スケジュールその他自分の個人情報をインターネット上に置きたくない。
- パスワードなどのID情報をインターネット上に置きたくない。
- Webプログラム開発初心者。
- プログラミングを仕事でなく、趣味でやりたい。
 - オブジェクト指向が苦手。
 - MVCは面倒。
 - システム全体を把握したい。(ブラックボックスは少ない方が良い。)
 - フレームワークを使いたくない。(PHP、SQL、JavaScriptだけで開発したい。)

#機能一覧

- ホームページインデックス(ブックマーク)＆検索
 - ブログパーツ貼り付け
- 付箋
- カレンダー(スケジューラ)
 - 天気出現率表示
- 旅行記
- ToDo
- 掲示板
- RSSリーダー
- メモ
- フォトアルバム
 - スライドショー
 - 動画サムネイル
 - FLV,MP4,WMV,MPG,MOV,M2TS(AVCHD)動画再生
- 学習
- 住所録
 - PDF葉書宛名書き
- メール(一括受信)
- SVGお絵かき
- ペン画
- チャット(Chat)
- ID・パスワード管理
- GPSログ(GPX)ビューワ
- 預貯金管理
- 縦計だけの表計算
- HTML URL抽出&ファイルダウンロード
- テキスト縦書き表示 
- Excel to グラフ
- ソースコード表示&編集＋ファイルマネージャー 
- MySQL管理ツール
- ファイル暗号化/復号化
- タイマーアラート

#特徴・補足
- 自宅で個人や家族で使えるシステムを目指して作りました。家庭内LANでの利用を想定しています。
- 少人数の会社のイントラでの利用も可能かもしれません。
	  セキュリティは万全ではないので、スケジュール共有など機能を限定して利用願います。
- ユーザー登録など、インターネット上での利用を想定した機能も付けています。ただし、セキュリティ等保障はできませんので、インターネット上での実利用は、自己責任にてお願いいたします。あくまで、LAN内またはPC単体での利用を想定しています。
- 簡単なユーザー管理機能もあります。
- 認証機能もあります。
- ユーザー単位で他のユーザーに対して参照・書込の権限設定ができます。
- レコード単位での非公開の設定もできます。
- ただし、システム管理者はデータベースを直接見ることで全ての情報を参照ができてしまいますので、悪用しないように。
- ID管理では、二重の認証が必要なしくみにしています。
- ID管理では、パスワードを独自の方式で暗号化しています。ID情報は、２つのテーブルに分割して保存します。
		暗号化のキーと２つのテーブルを別々にバックアップすれば、ID情報の復元はしづらい(?)と思います。
- 簡単なログ機能も付けています。
- 簡単なシステム管理者機能も付けています。
- コンテンツを追加しやすい構造にしています。
- ページ分割有りの一覧形式のページを簡単に作れる共有ライブラリを用意しています。一覧形式での編集もできます。
		/_myhome/__common__/include-common-mp-list.php
	  各コンテンツのlist.php、category.phpを参考にしてください。
- 一覧形式の表示部分のみを、独自のphpソースに置き換えられます。($mp_list_arg['template_view'])

#開発環境
- （Ver.3.27以降）XAMPP 1.7.1 (Windows)
 - Apache 2.2.11
 - MySQL 5.1.33 (Community Server)
 - PHP 5.2.9 + PEA

- （Ver.3.26以前）XAMPP 1.6.6a (Windows)
 - Apache 2.2.8
 - MySQL 5.0.51a
 - PHP 5.2.5
【PowerApps Tip's】SPOカスタムリスト(大量列)からアプリ生成した際の注意点

#はじめに
SharePoint Online（SPO）のカスタムリストからPowerAppsアプリが自動的に生成できるコトを皆さんご存知でしょうか。手軽にアプリのベースが生成されるので、活用されている方も多いかと思います。

■参考URL
　[PowerApps で SharePoint リストからキャンバス アプリを作成する](https://docs.microsoft.com/ja-jp/powerapps/maker/canvas-apps/app-from-sharepoint)

SPOのカスタムリストは列を追加することでデータを格納することが可能です。アプリで格納したい情報（データ）にあわせてカスタムリストを作成して、PowerAppsのデータソースすることが簡単に実現できるのでサンプル等でよく利用されていますね。

カスタムリストは自由に列が追加・削除できます。アレもコレもストアしよう、なんて思って…気づいたら大量の列(入力項目)になっていた、なんてコトもあるかと思います。さて、そんな状態からアプリを生成したら、どうなるでしょう？

#大量列のリストからアプリ自動生成してみた
実際に試してみた。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/SharePoint?src=hash&amp;ref_src=twsrc%5Etfw">#SharePoint</a> Oninle のカスタムリストに大量の列（動画では a~z 26個の1行テキスト）がある状態で、<a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> アプリを自動生成すると、タイトル＋a～g までの8列しかEditForm等に自動設定されない。なので、PowerApps側で追加しないといけない。 <a href="https://t.co/kYtaj79ScE">pic.twitter.com/kYtaj79ScE</a></p>&mdash; やま (@yamad365) <a href="https://twitter.com/yamad365/status/1104544486972043264?ref_src=twsrc%5Etfw">March 10, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#検証と結果
SPOのカスタムリストを準備して、PowerApps アプリを自動生成するだけで皆さんも実際に試していただけます。

1. リストを準備してPowerAppsアプリを自動生成
![01.png](https://qiita-image-store.s3.amazonaws.com/0/215892/5c319596-31f4-4db3-08d1-01e7e88a49cd.png)
上の例ではイメージにあるとおり、タイトル＋a～ｚまでの列で合計27列があります。その状態から、PowerAppsアプリを自動生成してみました。

2. PowerAppsアプリ EditFormを確認する
![02.png](https://qiita-image-store.s3.amazonaws.com/0/215892/c2652e88-b3f9-06ff-c9c9-e7506a1c19f5.png)
完成したアプリのEditFormを確認してみましょう。データソース側は大量（27列）準備しておいたのに、アプリ側はタイトル＋a～gの8列しか自動生成されていません。ここまでくれば予想通りだとは思いますが、DetailFormも同様に8列しか自動設定されてません。

#考察
記事投稿時点（2019/03/10）で、カスタムリストからアプリを自動生成した場合、EditForm等に反映される列は最大8列のようです。今後の更新で変更になる可能性はありますが、全ての列が自動的にアプリ側へ反映される・・・ようになるかは不明ですね。
前回の記事でネタにした名古屋の勉強会（#easyapp758 第二回）に登壇した際にも公言しておりますが、当方は「入力項目が大量にあるアプリ」はおススメしておりません。理由は、データ構造の複雑さというか煩雑さもあるのですが、それ以上に『使い勝手が悪い』からです。大量データを登録させたい場合は、例えば入力画面を複数にわける事や、そもそもPowerAppsアプリでやるべきか？を再検討するべきかな、と思っています。「ホントにそんなに入力項目が必要なの？」に立ち戻るコトもおススメですね。CDS投入も視野になる部分だと思います。

#まとめ
- SPOカスタムリストからアプリ生成した場合、自動で反映されるのは最大8列まで
- 9列目以上はアプリ側で自ら追加設定する必要がある
    - DisplayForm、EditForm 両方ともに対応必須なのでチョッとメンドクサイｗ
- そもそも「そんなに列が必要なの？」は考えるべき（個人的意見
    - 使い勝手が悪いよね？データ入力大変だよね？
    - メンテナンスも大変だよね？
- 大量データ登録が必要な場合は画面設計や導線をチャンと考えよう！
- 大量データを保持するならCDSを考えましょう

PowerAppsアプリ、作るのも利用するのも簡単で非常に便利です。ただ、簡単な反面、システム屋さんがフルスクラッチで作成してくれるアプリケーションやシステムに比べて制約も多く存在します。つまり、自由度が低いポイントがある、ということですね。本日紹介した制約？もそんなポイントなのかな、と思っている次第です。PowerAppsの得意な点、不得意な点を把握して「楽して業務効率をUp」を目指したいですねー。

それでは、皆さま、素晴らしい Power Platform Life を！


■参考URL
　[リストおよびライブラリの列の種類とオプション](https://support.office.com/ja-jp/article/リストおよびライブラリの列の種類とオプション-0d8ddb7b-7dc7-414d-a283-ee9dca891df7)
[Ruby] Array から Hash を生成

## 概要

このコードの動作は？

```
array = []
n.times do
  array << [:a, :b].zip(gets.split().map(&:to_i)).to_h
end
```

```
array
  # => [{:a=>1, :b=>2}, {:a=>3, :b=>4}]
```

## 動作

```
# zip でまとめる
a = [:a, :b].zip([1, 2])
  # => [[:a, 1], [:b, 2]]

# Hash に変換
h = a.to_h
  # => {:a=>1, :b=>2}
```

## サンプル

```
array = [1, 2]
[:p, :b].zip(array).to_h
  # => {:p=>1, :b=2}
```

```
array = [1, 2, 3].map { |id| User.new(id) }
array.map(&:id).zip(array).to_h
  => {1=>#<User:0x00007fc97da12950 @id=1>, 2=>#<User:0x00007fc97da12928 @id=2>, 3=>#<User:0x00007fc97da12900 @id=3>}

class User
  attr_accessor :id
  def initialize(id)
    @id = id
  end
end
```

## 資料

- [【Ruby】Array から Hash を作る方法７選（a.k.a. やっぱり Array#zip はかわいいよ](https://tech.raksul.com/2018/02/06/ruby_array_to_hash/)
- [zip(Array)](https://ref.xaio.jp/ruby/classes/array/zip)
ネットワークの人間がNetmikoを試してみた

#Netmikoとは？
"""""""""""""""
Netmikoとはネットワークデバイスとかにsshやtelnetで接続してなんやかやをやってくれるpythonのライブラリの一つらしい。
前身にParamikoとかいうものがあるらしいがtelnet接続に関するドキュメントをあまり拾えなかったので自分Paramikoあんまりわかんないです( ;∀;)

#使うきっかけ
"""""""""""""""
最近自分の仕事環境が変化し、ネットワークエンジニアなのに自動化とか触るようになりました。20台とか複数のデバイスに一人で設定投入とか手動でやっていたら残業三昧になって機器より先に人間壊れますよ....。ということでつまんない作業とか全部自動化したいなぁと思い最近netmikoとかautomationを勉強し始めています。なのでpythonの勉強自体も始めたのが少し前くらいになるのでプログラミングについてはズブの素人です。自分はもともとサポートの人なので基本的には機器で発生した不具合の検証とかしています。

#記事の目的
"""""""""""""""
Netmikoのライブラリでどんなことができるのか。というより自分ができるようになったのか。そちらの紹介です。
netmikoとかの勉強初めて2か月くらい？（正確には１か月とちょっと）のド素人でもこんなことができるよーになりましたという備忘録と
いやもっとこんな便利なことができるぞ！という知見を頂きたいという願望をもとにかいています。

#作ったもの
"""""""""""""""
簡単に言うと複数機器からバックアップのためにshow runをとってtxtファイルを作成し、ファイル名にタイムスタンプかいてます。devices.txtにはバックアップを取りたい機器のIPアドレスを入れてます。

これで一つ一つのIPアドレスに接続して、show run　打ってtxtファイルに出してくれます。
一日の仕事の始めに検証に使う機器や設定しないといけない機器のバックアップとっとけという私の現場だと
このプログラムを起動している間にトイレいったり、コーヒーいれにいったりできるので大変便利になりました。

```
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from netmiko import ConnectHandler
with open('devices.txt') as f:
        #一行ずつ読み込む
        devices = f.read().splitlines()

for ip in devices:
    cisco_device = {
            'device_type': 'なんでも_telnet',#telnet接続なら必須
            'ip': ip,
            'username': 'なんでも',
            'password': 'なんでも',
            'secret': 'なんでも',
            }

    print('Connecting to ' + ip)
    #ssh = connection ,telnet = net_connect
    net_connect = ConnectHandler(**cisco_device)

    print('Entering enable mode ...')
    net_connect.enable()


    output = net_connect.send_command('show run')
    prompt = net_connect.find_prompt()
    hostname = prompt[:-1]

    list = output.split('\n')
    list = list[3:]
    config = '\n'.join(list)
 
    import datetime
    #取得した日のタイムスタンプ
    now = datetime.datetime.now()
    today = str(now.year) + '-' + str(now.month) + '-' + str(now.day)
    file = today + '-' + hostname + '.txt'


    with open(file + '.txt', 'w') as backup:
        backup.write(config)
        print('Backup of ' + hostname + ' completed successfully')
        print('#' * 30)

    net_connect.disconnect()

```

#課題
このプログラム。自動でやってくれるのはいいんですが結構遅いんですよね(-_-メ)
手動でやるよりはだいぶ早いんですが、プログラムとしては遅いなぁという実感しかないです。


#所感
こんな感じで今後も自分の備忘録として残していきたいなぁと思ってます。
環境が変わって戸惑いながらEC2を作成しました。。

#はじめに
AWSでインターネット接続のできるEC2を作成したときのメモです。それだけです。
たったそれだけなんですが、プロジェクト変更による作業環境の違いによってここまで焦るものなのか。。と学んだため、初心忘れるべからずで記事を作成しました。

ちなみに作業環境の違いとは、
・以前：IAMでロール管理していないrootアカウントとMacで好き勝手にバリバリやってOK
・現在：IAMで管理されたReadOnlyのアカウント（作業時にロールの切り替えが必要）、踏み台複数経由、マシンのスペックが低い
です。

面倒でもパラメータシート書いたほうがいいなとか、サービスローンチ後の運用を考慮したときにIAMでガチガチに管理するのは大切（当然かもしれませんが）だしそうあるべき、とか学びは多いのですがそれでもやっぱりパフォーマンスは発揮しにくいですね。

ちなみに今回久しぶりに[Amazon Web Services 基礎からのネットワーク&サーバー構築 改訂版](https://www.amazon.co.jp/Amazon-Web-Services-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89/dp/4822237443/ref=sr_1_3?ie=UTF8&qid=1552136614&sr=8-3&keywords=aws)を読み直しました。よき。

#作業開始
##ターゲットの把握と手順を妄想

今回は「適当にEC2作る」「それをインターネット接続できるようVPCも触る」です。

今までですとEC2から作りはじめていたのですが、今回はサーバを立てるNW環境から作成します。
こっちのほうがわかりやすいというか頭の整理がしやすい。

##VPCの作成
最初にVPCを作成します。VPCってEC2のおまけくらいにしか当初思ってなかったのですが（マジです）、今考えると全然そんなことないですね！w
CIDRは10.0.0.0/16で作成します。
AWSアーキテクチャでNWとか基盤の設計構築って完全に独学なのですが、VPC作成したら連動してACLとかルートテーブルってできるの今手を動かしてて知りました。。

##サブネットの作成
先ほどのVPCの中にサブネットを作成します。NW領域（VPC）の中に更にNWを作る。
RDSを考慮して2つ作成します。アベイラビリティゾーンは別にする。
CIDRは10.0.1.0/24と10.0.2.0/24で。

##インターネットゲートウェイの作成&アタッチ
VPCにGWを作ります。オンプレでこれやるならコストかかるんだろうなーと思いました。抽象化すごい。

##セキュリティグループの作成
インバウンドのルールにsshを追加します。IPはip nowとかでググったグローバルを指定。よくわからなければ0.0.0.0/0でも構いませんがセキュリティの観点から大変よろしくないのでw、モジュールを載せる前の環境に限るなど限定した方が望ましいと思います。

##ルートテーブルの設定
Destinationは0.0.0.0/0、先ほど作成したゲートウェイと紐付けます。

##EIPの割り当て
ここでVPCの作業は完了。EC2を立てるNWが完成しました。

##インスタンスの作成
CentOS7で。EIPも紐づけてグローバルIPを付与します。
この時点で外部との接続可能になっています、それでもsshできなければNW（社内ルールとか踏み台とか）を確認しましょう。自分のせいではないですw

#所感
NWの口（全社的な出入り口）のセキュリティが高いプロジェクトに参画した際、プロキシしてたりACLでがっちりコントロールしてたりで、my ipでヒットしたグローバルIPをセキュリティグループに入れたくらいじゃアクセスできないことを知りました。
それを知らずに作業していたらEC2に一生sshできませんでして。
なぜおれはこの作業にこんな時間かかっとーとや。。（福岡出身です）と、自分が情けなくなったので今回改めて整理した次第です。

おそらくですが金融系とかになるともっとキツそうな気がします。
システム受託開発系の作業環境とか作業ルールはよく確認＆管理者に質問しまくりましょうっていうお話でした。

以上です。
Unity初心者やってみた2

前回：https://qiita.com/akagane99/items/92a1ca9bfb841d9b63a8
次回：https://qiita.com/akagane99/items/dc0291df28f84e192ffd
一覧：https://qiita.com/akagane99/items/2dd005511a8d50f5634d

### Unity 5でコインプッシャーゲームを作ろう（前編） | Think IT（シンクイット）
https://thinkit.co.jp/story/2015/07/22/6223

Unity 5の記事だけど、Unity最新版（2018.3.8f1）でも使える

#### AddComponent > ［Physics］→［Rigidbody］

> rigidbodyはオブジェクトに物理演算を適用するための機能です。これを追加するだけで、自然落下運動などの物理運動を再現してくれます。

### 行動予定: Unityで作った途中経過をWebで公開する。

#### 操作

1. メニューバー > File > Build Settings
2. WebGLを選択 > Swich Platformボタン押下
3. Player settingsボタン押下
4. 設定変更
5. Buildボタン押下
6. ビルド中（結構時間かかる）

#### ビルド中

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109904/b16e49e8-dae0-3b68-5d82-9db2eb1fff8a.png)

#### ビルド時間

* WebGLをビルドした場合の時間：
  * 9分22秒
* ビルドPCスペック：
  * VAIO Z
    * CPU: Intel(R) Core(TM) i7-5557U CPU @ 3.10GHz
      * コア:	2
      * 論理プロセッサ数: 4
    * メモリ: 16GB
    * 型番：VJZ13A (2015年モデル)

#### github pagesにアップ

https://akagane99.github.io/WebGLGames/coin1/

単にコインが少し下がるだけのWebGL。
時間はかかるけど、さくっと出力できるのは良い感じ。

#### 参考記事

UnityのWebGLで書きだしたゲームをGitHubを使って公開する - Qiita
https://qiita.com/kenta71/items/c32760e1cc2ba01e8f9a

### 細かめメモ

* コーディングルールっぽいもの
    * Hierarchyのオブジェクト名は、とりあえず頭大文字で統一

### // 行動予定・行動結果

* 行動予定
    * 記事投稿日は、随時更新
* 行動結果
    * 30分行動した（1.5時間/20時間）
M5StackでFirebaseからメッセージ受信させるコードをPlatformIO IDE でビルドする

# はじめに
M5StackでFirebaseからメッセージ受信させるコードについて、PlatformIO IDE for VSCodeの環境
でビルドするためにはいくつか対処が必要だったので書いておきます。

# ビルド環境変更
今回試したことの元ネタは以下ページの内容になります。
https://fabcross.jp/category/make/20180425_kodomo_messenger_03.html
上記ではArduino IDEを使用していたのですが、今回、PlatformIO IDE for VSCodeでビルドしました。

ビルド環境変更した手順は、
・使用するライブラリ(*.hと*.cのファイル)を、プロジェクトのlibフォルダに展開
自分の環境では、以下フォルダ名にしました。
/lib/IOXhop_FirebaseESP32
/lib/ESP32_SD_ShinonomeFNT
/lib/ESP32_SD_UTF8toSJIS

・ArduinoJsonをインストール
IOXhop_FirebaseESP32でArduinoJsonが必要になるため、こちらはPIO HomeのLibraryから検索してインストールします。
また、M5Stackもインストール済みでなければ追加が必要です。

・platformio.iniに以下定義を追加

```
lib_extra_dirs = /lib/IOXhop_FirebaseESP32, /lib/ESP32_SD_ShinonomeFNT, /lib/ESP32_SD_UTF8toSJIS
lib_deps =
  ArduinoJson@5.13.4
```

ArduinoJsonの最新版は6.9.1でしたが、そのままではビルドが通らず１個前のバージョンに戻す必要がありました。

・main.c修正
M5.Speaker.playMusicは、PlatformIOの環境では通らないため取り合えず削除しておきます。
（音は出なくなります）
また、WIFI_SSID、WIFI_PASSWORD、FIREBASE_DB_URLの定義内容は自分の環境に合わせて適切な値に変更しておきます。


#その他トラブルについて
今回作業している途中でVSCodeのアップデート(version 1.32)を行ったのですが、
ビルドすると、
UnicodeDecodeError: 'ascii' codec can't decode byte 0x83 in position 22: ordinal not in range(128)
が発生するようになってしまいました。
pythonの環境に問題があるようでしたのでGoogle検索で調べたところよくあるエラーのようで、
http://shu223.hatenablog.com/entry/20111201/1328334689
を参照し、以下にsitecustomize.pyを作成したところエラーは解消しました。
E:\bin\Python27\Lib\site-packages
GitLab wiki で目次を自動生成する


## はじめに
GitLabのWikiを使っていて、目次が欲しくなる。
`[[_TOC_]]`を入力することで、目次を入れてくれることがわかる。

## 入力例
以下のように入力すると

```markdown
[[_TOC_]]

# wiki_test
## first
aaa

## second
bbb

## third
ccc
```

## 表示例
以下のように目次が入る

<img width="888" alt="スクリーンショット 2019-03-10 9.34.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/122764/6e25415e-0cb3-c7b6-923a-bb644745d817.png">
docker版 gitlab-runner のinstall


## はじめに
docker版 gitlab-runner のinstall手順。
よく忘れてしまうのでメモ。
(OSはCentos7.6を利用)

## インストール
gitlab-runner(latest) インストール
dockerが動いている環境で以下を実行

```bash
# docker run -d --name gitlab-runner --restart always \
>   -v /srv/gitlab-runner/config:/etc/gitlab-runner \
>   -v /var/run/docker.sock:/var/run/docker.sock \
>   gitlab/gitlab-runner:latest

Unable to find image 'gitlab/gitlab-runner:latest' locally
Trying to pull repository docker.io/gitlab/gitlab-runner ...
latest: Pulling from docker.io/gitlab/gitlab-runner
```

## 登録
インストールされたgitlab-runnerコンテナをGitLabサーバに登録

```bash
# docker exec -it gitlab-runner gitlab-runner register

Running in system-mode.
（あとは表示にしたがって必要項目を入力していく）
```

登録時に入力求められるTokenは、GitLabのダッシュボード(設定 > CI/CD)から確認する
例）※Tokenはリセット済み
<img width="400" alt="スクリーンショット 2019-03-10 9.23.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/122764/1e1347c9-c9fa-d3cd-aa9a-4bde6968940c.png">

## ref
以下が公式ドキュメント
https://docs.gitlab.com/runner/install/docker.html
Leetcode #2 Add Two Numbers

```swift
class Solution {
    func addTwoNumbers(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? {
        let dummyHead = ListNode(0)
        var currentNode = dummyHead
        var p = l1
        var q = l2
        var carry = 0
        while p != nil || q != nil {
            let x = (p != nil) ? p!.val : 0
            let y = (q != nil) ? q!.val : 0
            let sum = carry + x + y
            carry = sum / 10
            currentNode.next = ListNode(sum % 10)
            currentNode = currentNode.next!
            p = p?.next
            q = q?.next
        }
        if carry > 0 {
            currentNode.next = ListNode(carry)
        }
        return dummyHead.next
    }
}
```

######Memo:
1. use a dummy head
2. The sum could have an extra copy of one at the end, which is easy to forget.
3. Time complexity: O(max(m,n)). Assume that m and n represent the lengths of l1 and l2 respectively, the algorithm above iterates at most max(m,n) times.
4. Space complexity: O(max(m,n)). The length of the new list is at most max(m,n) + 1
ブロックチェーン でカジノ（ルーレット）DAppを作ってみた

Etherを賭けて当たったらEtherが貰えるルーレットアプリを作ってみました。
Ropsten上にアップしたので良かったら遊んでください。
テストネットなので賭博法的なものには引っかからないです！はずです！

https://akira-19.github.io/roulette/

## 遊び方
メタマスクを使う場合にはRopstenのアカウントを選んでください。
あとは好きなマスを選んでEtherを賭けてStartボタンを押すだけです。

トランザクションが処理されたらルーレットが回り始めます。

当ったら選んだマスに応じてEtherがゲットできます。（一般的なルーレットの返還率）

## コントラクト

### 胴元
デプロイ時に3etherをコントラクトに渡しています。
掛け金の最大は0.03ehterで、仮に数字を当てたとしても36倍の返金（1ether強）なので、誰かがいきなり数字を3回連続で当てなければ大丈夫でしょう。

### 判定
ブロックのタイムスタンプを使って乱数を出力しています（0~37）。
0は0で00は37です。

あとは別に大した処理は入れていません。偶数に賭けて当たればベットの2倍を返したり、そんな処理です。

ブロックのタイムスタンプに関してはマイナーが操作できちゃうっぽいのであまり良い乱数の生成方法ではないと思いますが、お遊びなので今回はその方法を使いました。
Javascriptで乱数を生成してコントラクトに送る方法も考えたのですが、それも結局ユーザーが操作できてしまうので、コントラクト上で乱数生成してます。

## テスト
シンプルなDAppなので、簡単に2種類のテストを作りました。
1. デプロイときに1etherを渡したら、ちゃんとコントラクトが1etherを持っている。（コンストラクタが正常に動いている）
2. ベットが当たれば賭けた場所に応じた返金があり、外したらコントラクトの所持するEtherが増える

## フロントエンド
ルーレットを回すのにCanvas機能を使いました。
<img width="395" alt="Screen Shot 2019-03-09 at 3.09.34 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/312001/0ab2672e-683e-8471-22ad-cb4c3bcc5417.png">

一度本を読んだ程度の知識しかなく、初めて実装したので正直ここに一番時間かかりました。
手順として、下記の手順で作りました。
####ルーレット背景
1. `context.arc()`を使って扇を書く。38要素あるので中心角は38/360度
2. 上の扇を38個描画する
3. 半径の小さい背景色白の扇を内側に同じように描画

####ルーレット数字
基本的には0から順番に数字を入れました。基本的にはコンテキストの中心（ルーレットの中心）から右側に半径弱分移動してから数字を描画しました。ただ、各数字はその右側からずれているのでコンテキスト自体を回転させて各数字を描画しました。
1. コンテキストの左上をコンテキストの中心に移動
2. コンテキストを`rotate()`を使って回転
3. コンテキストを元の位置に戻す
4. コンテキストがルーレットの中心から回転しているので、この状態で右側半径弱分のところから数字を描画
5. これを38要素分行う

コンテキストは左上からしか回転が行えないので、コンテキストの左上を中心にずらして回転させてから元に戻しました。

###ルーレット回転
ルーレットの回転は[こちら](https://tech-blog.s-yoshiki.com/2019/01/1024/)のサイトを参考に作りました。回転を行うメソッドにどこで止まるかの引数を与えて、指定のところに止まる様に作りました。
どこで止まるかの引数はコントラクトが実行された時点でブロックチェーンからブラウザが情報を受け取る様になっています。

1. 最初にルーレットが15回転くらい止まる様に設定
2. 止める数字に応じてもう少しだけ回す
3. 少しずつ減速して最終的に目的のところで止まる

一周が38要素あるのに対して11要素ずつ回る設定（11要素分移動したルーレットを描画する）をしたので、例えば始点を0とすると、38*2 % 11*6 = 76 % 66 = 10になるので6回描画すると10に止まります。

こんな感じで各数字の時にどのくらいの回数再描画すれば目的のところに止まるかを配列にして、メソッドに渡すことで、止めたいところにルーレットが止まる様にしました。

今考えると簡単なのですが、かなり時間かかりました。。。

## まとめ
### できたこと（学んだこと）
- payableを使ってEtherを送るコントラクトの作成
- Canvas機能の基本的な使い方

### やりたいこと（疑問点）
- 安全な乱数の生成([oraclize](http://docs.oraclize.it/#ethereum-quick-start-the-query-id)とか)
- privateとかinternalのファンクションはテストできない？（今回はテストの時だけpublicにした）

https://ten-weeks-dapps-project.herokuapp.com/
ループからコレクションクロージャメソッドへ(Replace Loop with Collection Clousure Method)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257568/fdaf5b9d-a029-52fa-35b6-44022684defa.png)


1つずつリファクタリング技法まとめ
個人的に簡単かつ取り入れ易いと思うものから

## 目的
すぐ引き出せるようにする

## 基本作業サイクル
- システムを動かして仕様を精査
- テストメソッドを作成
- テストの失敗を確認
- テストの成功を確認
- 小さい変更、随時テスト実行(パターン追加失敗確認->成功確認)
- 最後テスト実行
- 最後動作確認

## ループからコレクションクロージャメソッドへ(Replace Loop with Collection Clousure Method)とは
each系の処理をmap系の処理にすること
ブロック内でのループ処理の記述から、メソッドチェーンを実現可能な記法にすること

 
## ポイント
- Ruby特有のリファクタリングともいえそう
- 繰り返し処理した結果を返却したい場合に、ループの外から変数として渡す必要がなくなる
- 複数の処理をループ内で行っている場合は、メソッドチェーンで実現できる


## 例

```
fruits = []
foods.each do |food|
  fruits << food.values_at(
    :apple, :orange
  )
end
```
　　　↓

```
fruits = foods.map {|food|
  food.values_at(
    :apple, :orange
  )
}
```

## 書籍情報
Jay Fields (著), Shane Harvie (著), Martin Fowler (著), Kent Beck (著),
長尾 高弘(訳), リファクタリング:Rubyエディション
https://amzn.to/2VlyWML

## 雑感
チェーンが長すぎるとわかり易いとはいえなくなるので、コレクションクロージャ単体をメソッドとして切り出す方が良さそう
③ ConoHa VPS ロードバランサーを導入して複数Webサーバーの割り振り

前回記事：[② ConoHa VPS で複数WebサーバーとDBサーバーの構成を作る](https://qiita.com/mtitg/items/1fec73fa063e9b8b6372)

# この記事でやること

前回まででロードバランサを導入する準備が整ったので、今回は

- Conoha VPSでロードバランサを導入して複数Webサーバーを紐づけ
- Webサーバー側の設定
- ロードバランサによる振り分け実験

あたりを実施していきます。

# Conoha VPSでロードバランサを導入して複数Webサーバーを紐づけ

さっそくConohaメニューの`ネットワーク`>`ロードバランサー`からロードバランサを追加、下記キャプチャのような設定を行います。

![スクリーンショット 2019-03-09 23.47.58.png](https://qiita-image-store.s3.amazonaws.com/0/113133/fdf09e0e-a648-f7a1-a9ab-dbfa8825f8e5.png)

今回はヘルスモニターは無視し、いきなりロードバランサーを構築。各設定は下記です。

- バランシングポート：httpリクエストのみで実験するので80のみ
- バランシング方法：ラウンドロビン方式
- バランシング先IPアドレス：前回までで作成した`testVPS1`と`testVPS2`

ロードバランサーのバーチャルIPアドレスが`157.7.94.72`と割り振られています。
このアドレスにhttpリクエストがくると、ロードバランサーが`testVPS1`と`testVPS2`のWebサーバーにリクエストをうまい具合に振り分けるという設定ができました。

# Webサーバー側の設定

Conoha公式ドキュメントにあるように、それぞれのWebサーバー側で設定を行います。
ifcfg-lo:0というファイルを作り、そこにロードバランサーとの接続情報を記載します。

```terminal
# vi /etc/sysconfig/network-scripts/ifcfg-lo:0
```

```vi:ifcfg-lo:0
DEVICE=lo:0
IPADDR=157.7.94.72
NETMASK=255.255.255.255
ONBOOT=yes
```

ネットワークサービスの再起動を行います。

```terminal
# service network restart
```

# ロードバランサによる振り分け実験

ここまでできると、`157.7.94.72`に連続してアクセスすると`testVPS1`と`testVPS2`の2つのWebサーバーにリクエストが割り振られる様子を実験できます。

こちらが実験の様子です。
最初のタブでは`testVPS1`を直接見ていて、次のタブでは`testVPS2`を直接見ています。
そして3つめのタブではロードバランサーのIPアドレスを叩いていて、さらに連続でリロードすることで`testVPS1`と`testVPS2`の2つのWebサーバーにリクエストが割り振られる様子が見て取れると思います。

![名称未設定.gif](https://qiita-image-store.s3.amazonaws.com/0/113133/1a904211-3500-8c7d-604a-f3f227ea60d7.gif)

# まとめと考察と疑問

ということでこれまで3回に分けてConoha VPSでロードバランサを利用するところまでを書いてきました。

DBサーバーの分離やロードバランサの導入はドキュメントを見ながら進めましたが、なんとかなるものですね。
ロードバランサは元々負荷分散の目的で活用されることが多いですが、個人的にはデプロイのダウンタイムを無くすという目的で使ってみたいと思います。片方のWebサーバー（環境）をロードバランサから切り離してデプロイを行い、デプロイが終わったらつなぎ直してもう一方のWebサーバー（環境）でも同じことをやれば良さそうです。

とはいえなんか非効率的な感じもするので、

- そもそも複数環境に対してデプロイを行う時の良い方法は何か
  - それぞれにPushするのか、環境のコピーをするのか
- Webサーバーの数が多くなったらどうするのか
- ローリング・デプロイ / ブルーグリーン・デプロイ / イミュータブル・デプロイ とかあるがどれが良いのか
  - というか負荷分散を考えなかったら、毎回新しい環境に乗り換えるヤドカリ方式のイミュータブル・デプロイでいいんじゃないか

といった考えが頭をよぎります。

はーインフラ難しい。
WebAPIをPowerShellからテストする

# はじめに
WebAPIを作ってブラウザでテストしていたら、GETはいいけど、POSTのテストで簡単なHTMLフォームを作るのすらめんどくさいと思ったので、PowershellからPOSTしてみました。

# 参考
以下のURLを参考にWebAPIをSpringBootで作成しました。
[SpringBootに入門する為の助走本（随時更新）] (https://qiita.com/sugaryo/items/5695bfcc21365f429767)

大変わかりやすく記載されており、たくさんSpringBootの入門ページを見させていただいた中で一番参考になったと感じております。
執筆ありがとうございます。

# Powershellから実行
ここからは、前述の参考URLをもとに、WebAPIが構築されている前提で話を進めさせていただきます。

## GET
パラメータの無い、ただのGETは以下です。

```powershell:ただのGET
invoke-restmethod -uri "http://localhost:8080/api/hello" -method get
SpringBoot!
```

SpringBoot!と言う文字列が返されました！

## GET - パス変数有り
パス変数のあるGETは以下です。

```powershell:パス変数のあるGET-1
invoke-restmethod -uri "http://localhost:8080/api/test/xxx" -method get
受け取ったパラメータ: xxx
```

xxxがパラメータとして渡されました。
invoke-restmethodのuriオプションのパラメータのうち、xxxの個所を変えると、WebAPIに渡すパラメータを変更することができます。

```powershell:パス変数のあるGET-2
invoke-restmethod -uri "http://localhost:8080/api/test/検索したい文字列" -method get
受け取ったパラメータ: 検索したい文字列
```

## POST
POSTでパラメータを送る例は以下です。

```powershell:POST-1
$data = @{param = 10}
invoke-restmethod -uri "http://localhost:8080/api/test/" -method post -body $data
受け取ったパラメータ: 10
```

一行目の、@{param = 10} はPowershellのHashtableオブジェクトです。
ユーザー情報のようなオブジェクトを渡す場合、以下のようになります。

```powershell:hashtable
$data = @{name = "wakoit"; phone_number = "000-0000-0000"
```

WebAPI側でparam変数を待っているので、合わせてあげないと例外が発生しました。

```powershell:POST-2
$data = @{name = "wakoit"; phone_number = "000-0000-0000" }
invoke-restmethod -uri "http://localhost:8080/api/test/" -method post -body $data
invoke-restmethod : リモート サーバーがエラーを返しました: (400) 要求が不適切です
発生場所 行:1 文字:1
+ invoke-restmethod -uri "http://localhost:8080/api/test/" -method post ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod]、WebExce
    ption
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
```

この場合、WebAPI側で受け取るように改修する必要があります。

```powershell:POST-3
$data = @{param = "wakoit"; phone_number = "000-0000-0000" }
invoke-restmethod -uri "http://localhost:8080/api/test/" -method post -body $data
受け取ったパラメータ: wakoit
```
paramにすれば、うまくいきますが、2つ目のphone_numberパラメータは出力していないので無視されています。

# まとめ
Invoke-RestMethod素敵！

以上です。
デザインしながらコンポーネント名とか変数名とか考える時のルール

**※オレオレルールです**
**※順次追記・書き直ししながら整形予定**

Figmaとかでカラースタイルを作ったり、コンポーネントを作ったり、
CSS（SASS）で変数を作ったり、クラス名をきめたり、
コーディングやプログラミングと同じように、デザインの現場でも、「命名規則」を意識することが多くなってきました。

Sketch以降デザインツールもコンポーネントとか再利用性を意識した機能をもったものが増えてきたので、
自分のメモとしてまとめます。

# 色は基本的に必ず変数化

## 色の変数名は、値が変化する可能性を考えてつける

### 👎（なるべく）避けるパターン

- `color-red`
- `赤`

### 👍こうする

- `color-alert`
- `警告`

### ❓なんで？

変数化（スタイル化）するということは、デザインを作っていく中でその変数の値を変更する可能性があるということです。
なので`color-red`とか`赤`とか、値を変数名・スタイル名にいれてしまうと、あとで変更したときに、名前と値の辻褄が合わなくなる場合があります。
（CSSを書いた経験があるとよく分かる話）

### 例外もある

例外的に、色の話でいうと、`赤`や`白`とかその色であることをあえて変数名・スタイル名に入れるというケースもあります。
その色であることが、その変数・スタイルにとっての存在意義である場合は、値をそのまま名前に入れる場合もあります。

# 値の重複を妨げない。（意味のある重複）

## 👎避けるパターン

- 赤（#f00）

## 👍こうする

- 通知（#f00）
- アクセント（#f00）

## 色などの見た目ではなく、意味で命名する

「名前に値を入れない」という前の話とも関係する話。

例えば、警告として利用する「赤」と、単なるデザインとして「赤」は、仮に同じ色で作ったとしても、用途・意味が違うので、あとで値を分けるということも考えられます。
結果としての見た目ではなく、その意味を捉えた命名をしましょう。

## 意味での命名がどうしてもう難しい場合は連番

[CSSの命名規制はBEMを使っている](https://qiita.com/nibushibu/items/1c56a1e7b3f6d6c22615)んですが、
例えば特定のクラスに複数のバリエーション（Modifier）を作る場合、それぞれのバリエーションを意味で命名するのが難しい場合もあります。
（汎用的に使うバリエーションだったりすると、意味付けが複数ある場合もあってなおさら）

その場合は、最後の手段として

```css
.class { /* ... */ }
.class--type-2 { /* ... */ }
.class--type-3 { /* ... */ }
```

という命名をしています。
phpMyAdminにサーバーを追加する phpMyAdmin 4.4.15.10

* Ec2にインストールしたphpMyAdminでRDS上にある開発データベースと本番データベースを切り替えられるようにする

なんか、webに落ちているやり方だと（マニュアルを含めて）上手くいかなかったのでなんとか成功したやり方をメモ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/42407/120dd7f7-f76c-6829-332e-8dfb766502ee.png)

## 環境

centos 7

![image.png](https://qiita-image-store.s3.amazonaws.com/0/42407/4703bcab-1c36-afcb-aea4-f26418c7f7b8.png)

## 参考

参考https://docs.phpmyadmin.net/ja/latest/setup.html#setup  

RedHat系は、/etc/phpMyAdminにカスタマイズ項目を記載しないと効かない


## 手順

複数行を変更するので、config.inc.phpをFTPでローカルにコピーしてから作業しました。
ただ、config.inc.phpは書き込み禁止設定されているので、ルートになる必要があります

1. 管理者ユーザーとなる  
  sudo su -
2. FTPでファイルのアップロードが可能なように、phpMyAdminディレクトリの権限変更
    `chmod o+wx phpMyAdmin`
3. cd /etc/phpMyAdmin  
7. ls -al で config.inc.phpがある事を確認、無ければ、/usr/share/config.inc.phpをコピーしてくる  
8. /etc/phpMyAdmin/config.inc.phpをローカルにダウンロード
9. 下の様に変更後、サーバーにアップする。けど、念のためバックアップを取る
10. `mv config.inc.php config.inc.php.bk`  (config.inc.phpは書き込み禁止なので、ルートにて名前を変更する）
11. FTPでconfig.inc.phpをアップロード
12. 権限の変更  `chmod o-w config.inc.php`

以下を追加  

```
$i++;
$cfg['Servers'][$i]['host'] = '******.cmurclmkincr.ap-northeast-1.rds.amazonaws.com';
$cfg['Servers'][$i]['verbose'] = 'staging
```
Laravelのバリデーション処理

Laravel5.4のバリデーションについて記載




1.Routeにフォームの送信先を記述

```
Route::post('/formurl/','ServiceController@validateRequest');
```



2.Controllerにvalidateを行う項目と内容を記述

```
public function validateRequest(Request $request){
    $this->validate($request, [
        //処理内容の指定（useridは必須、最大4文字）
            'userid' => 'required|max:4',
        ],

        //エラー文言の指定
        [
           'userid.required' => ':attributeは必須です。',
           'userid.max'  => ':attributeは４文字を超えています。',
        ], 

        //attributeに表示される表示名称の指定
        [
            'userid' => 'ユーザーID',
        ]);
}
```

3.続いてエラー処理の記述
エラーメッセージ、入力内容をリダイレクト先に付与

```
     if($validator->fails()){
         return redirect('/formurl')
             ->withErrors($validator)
             ->withInput();
     } else {

     }
```

4.失敗時にリダイレクト先でエラーメッセージの取得
index.blade.phpでの取得

```
     @foreach ($errors->all() as $error)
                        <li>{{ $error }}</li>
                    @endforeach
```

Controllerや、view composerで取得したい場合

```
     //エラーメッセージ
     $_session = session()->all();
     $_error_msg = $_session['errors']->default;

     //前回の入力内容
     $_session = session()->all();
     $_old_input = $_session['_old_input'];
```



以上
Rails5のgeneratorを変更する

generatorをデフォルト以外の設定に変えるには、```config/application.rb```を変更します。

自動生成を封じるためには、falseを指定します。

```rb:config/application.rb
    config.generators do |g|
      g.stylesheets false
      g.javascripts false
      g.helper false
      g.template_engine :haml # gem 'haml-rails'
      g.test_framework false
      g.fixture_replacement false
    end
```
[Mohave] brew install protobufに失敗

以下の2つのエラーでhomebrewでprotobufをインストールできなかった。
あんまり社内でも話題になってないから、Mohaveで新規に入れようとした時に問題になる？

```console
Error: Calling needs :cxx11 is disabled! There is no replacement.
Please report this to the homebrew/core tap:
  /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/protobuf.rb:38
```

```console
Error: Calling 'fails_with :clang' with 'build' < 600 is disabled! There is no replacement.
Please report this to the homebrew/core tap:
  /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula/python.rb:60
```

（というか1つ目をコメントアウトしたら2つ目が出てきた。）

`/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/` 配下にあるファイルを以下の通り編集。

```diff
diff --git a/Formula/protobuf.rb b/Formula/protobuf.rb
index 6ccb4552..f2ed1515 100644
--- a/Formula/protobuf.rb
+++ b/Formula/protobuf.rb
@@ -32,7 +32,7 @@ class Protobuf < Formula
     sha256 "70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9"
   end
 
-  needs :cxx11
+  #needs :cxx11
 
   # Upstream PR from 3 Jul 2018 "Add Python 3.7 compatibility"
   patch do
diff --git a/Formula/python.rb b/Formula/python.rb
index 9dbcf52e..f3b7dfd9 100644
--- a/Formula/python.rb
+++ b/Formula/python.rb
@@ -51,10 +51,10 @@ class Python < Formula
     sha256 "0a2e54558a0628f2145d2fc822137e322412115173e8a2ddbe1c9024338ae83c"
   end
 
-  fails_with :clang do
-    build 425
-    cause "https://bugs.python.org/issue24844"
-  end
+  #fails_with :clang do
+  #  build 425
+  #  cause "https://bugs.python.org/issue24844"
+  #end
 
   # Homebrew's tcl-tk is built in a standard unix fashion (due to link errors)
   # so we have to stop python from searching for frameworks and linking against
```

これでとりあえず、 `brew install protobuf` 成功..
これで良かったのかな。
#python で #Github #API を叩いて Issue を 新規作成するスクリプトの例



# Ref

https://gist.github.com/JeffPaine/3145490

# Token

Personal Access Token を作っておく

https://github.com/settings/tokens

# Example

```
$ USERNAME=YumaInaura REPOSITORY=playground PASSWORD=[PersonalAccessToken] TITLE=testing BODY=testing_body LABELS=example,some_label python create-issue.py
```

# Script

```py
# https://gist.github.com/JeffPaine/3145490

import os
import json
import requests

# Authentication for user filing issue (must have read/write access to
# repository to add issue to)
USERNAME = os.environ.get('USERNAME')
PASSWORD = os.environ.get('PASSWORD')

# The repository to add this issue to
REPO_OWNER = os.environ.get('USERNAME')
REPO_NAME = os.environ.get('REPOSITORY')

TITLE = os.environ.get('TITLE')
BODY = os.environ.get('BODY')

if os.environ.get('LABELS'):
  LABELS = os.environ.get('LABELS').split(',')
else:
  LABELS = ''

def make_github_issue(title, body=None, labels=None):
    '''Create an issue on github.com using the given parameters.'''
    # Our url to create issues via POST
    url = 'https://api.github.com/repos/%s/%s/issues' % (REPO_OWNER, REPO_NAME)
    # Create an authenticated session to create the issue
    session = requests.Session()
    session.auth = (USERNAME, PASSWORD)
    # Create our issue
    issue = {'title': title,
             'body': body,
             'labels': labels}
    # Add the issue to our repository
    r = session.post(url, json.dumps(issue))
    if r.status_code == 201:
        print ('Successfully created Issue {0:s}'.format(title))
    else:
        print ('Could not create Issue {0:s}'.format(title))
        print ('Response:', r.content)

make_github_issue(TITLE, body=BODY, labels=LABELS)



```


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/716








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
CentOS 7でBINDの設定をするメモ

セキュリティ意識した設定とかではないです.
ゆるーく適当に動かすためのメモです.

- BINDのインストール

途中でインストールして良いか聞かれたら `y` を入力してEnter.

```bash
# yum install bind bind-utils
```

- ファイアウォールの設定

デフォルトではブロックされているのでDNSを許可するようにする

```bash
# firewall-cmd --add-service dns --permanent // 再起動しても設定を有効化する
# firewall-cmd --reload // リロード
# firewall-cmd --list-services // 通信が許可されているか確認
```

- named.confの設定

BINDの設定ファイルである `named.conf`, また正引き, 逆引きの設定ファイルである `<ドメイン名>`, `<ドメイン名>.rev` という名前のファイルを作成しておく.
それぞれのファイルはどこかから雛形を引っ張ってくるなり, 自分で書くなりする.

```bash
# touch named.conf
# touch <ドメイン名>
# touch <ドメイン名>.rev
```

`named.conf` のシンボリックリンクを貼る

```bash
# ln -sf /var/named/named.conf /etc
```

`named.conf` をゴリゴリ書く.
いろいろ端折ってる.

```vim
options {
    listen-port 53 { 127.0.0.1; };
    ...
    directory    "/var/named"
    ...
    allow-transfer {};
    allow-query {};
    allow-recursion {};
    allow-query-cache {};
};

...

zone "hoge.piyo" {
    type master;
    allow-query { any };
    file "hoge.piyo";
};

zone "X.0.168.192.in-addr.arpa" {
    type master;
    allow-query { any };
    file "hoge.piyo.rev";
};
```

`listen-port` にはDNSのサービスを動作させるポート番号と, IPアドレスを指定する.

`directory` には, `named.conf` が存在するディレクトリを指定する.

`allow-transfer` にはセカンダリDNSサーバのIPアドレスを指定する.
セカンダリDNSサーバを用意しない場合は `//` でコメントアウトする.

`allow-query` にはクエリ(問い合わせ)全般を受け付けるかどうかを書く.
`any` ならどこからでも, ネットワークアドレス(プレフィックス表記)を指定したら指定したネットワークの範囲のみ.

`allow-recursion` には再帰問い合わせを受け付けるかどうかを書く.
つまりフルサービスリゾルバとして動作させるかということ.
`any` ならどこからでも, ネットワークアドレス(プレフィックス表記)を指定したら指定したネットワークの範囲のみ.

`allow-query-cache` にはキャッシュを返すのを許可するかどうかを書く.
`any` ならどこからでも, ネットワークアドレス(プレフィックス表記)を指定したら指定したネットワークの範囲のみ.

`zone` にはゾーン情報を書く.
正引きは `"<ドメイン名>"`, 逆引きは `"<IPアドレスの逆順>.in-addr.arpa"` を指定する.
また, `file` にはそれぞれのドメインのゾーン情報を記述するファイルのパスを書く.

- 正引き・逆引きの設定

イイ感じにやる(めんどいので省略).

- BINDの起動

```bash
# systemctl start named.service // すでに起動している場合はrestart
# systemctl enable named.service // 再起動しても設定を有効化する
```

- 動作確認

```bash
$ ping <IPアドレス> // IP到達性があるか
$ nmap -sU -p 53 <IPアドレス> // UDPポート53番が開いているか
$ dig <ドメイン名> // DNSのサービスとしてちゃんと動いているか
```

ぼくは `listen-port` の設定ミスで動かなかったので注意してネ.
実力＝収入

とてつもなくわかりやすい広告だなと思った。

「実力」＝「収入」というのがそれだとすると

実力とは何なのか？
プログラミングスキルが実力ということならば
プログラミングスキルが高ければ収入が高いということになる。

ただプログラミングスキルだけが高ければ収入につながるというわけでもないのは定義しておきたい。

プログラミングスキルが高いと収入が高いというよりは
コミュニケーションスキルが高くてプログラミングスキルが高いというのもまた定義しておいたほうがいいかなとも思う。

プログラミングスキルが高くても低い金額の人もいるからですね。

安く見積もって、１ヶ月単価１人月「100万」という営業マンがいたとして、営業マンが？？％としてプログラマーがどんだけ頑張ってもというところはある。

そう。つまりプログラミングスキルと営業スキルおよびコミュニケーションスキルが高くて手は収入には繋がらないのかなと思うので是非　営業スキルやプレゼン力にも目を向けて欲しいと思うですね。


---


## 関連記事

【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/

#スポンサー募集