OmniAICreator/Qiita-1.07M huggingface dataset:
デジタルソルジャー教訓、。MacBook + Wi-fi での接続が本当にストレスフルなので優先度・自動接続・リストを見直す

デジタルソルジャー教訓、。MacBook + Wi-fi での接続が本当にストレスフルなので優先度・自動接続・リストを見直す

# Wi-fiリストの果てしなく下にある設定から

![image](https://user-images.githubusercontent.com/13635059/50732913-c488b080-11c6-11e9-91ee-db478b0a3936.png)

# 右下の Advancedをたどり

![image](https://user-images.githubusercontent.com/13635059/50732833-ce5de400-11c5-11e9-8c26-771ea24c2627.png)

# Wi-fi設定へ

![image](https://user-images.githubusercontent.com/13635059/50732850-0e24cb80-11c6-11e9-90ce-4715cf0b8a97.png)

![image](https://user-images.githubusercontent.com/13635059/50732858-2ac10380-11c6-11e9-84e1-a8ee6fd9c680.png)


# Wi-fi戦略の見直し

- 優先順位を並び替えて、つながってほしいSSIDほど上に持っていく
- Auto join の設定を見直す、ログインが必要系は自動接続しないようにしておく
- Wi2 と W2 club など、前者がパスワードなしで後者がパスワードありで絶対両方同じ場所に存在するとか、上位互換がある場合は下位の方は設定から削除する、何度も別のSSIDでログインを促されるのがつらすぎるので

![image](https://user-images.githubusercontent.com/13635059/50732889-6f4c9f00-11c6-11e9-8b1f-5bc89d9e5b68.png)

# Wi-fiは人権、Wi-fi設定は命

命保全のためのデジタルソルジャーのための教訓


---

https://twitter.com/yumainaura

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

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
GitHub API で Create a Rlease をしようとしたら  422 Unprocessable Entity となった原因

## 使用したAPI
GitHub API - REST API v3

## 422 Unprocessable Entity になったコード
422の意味 => https://tools.ietf.org/html/rfc4918#section-11.2

```js:index.js
const request = axios.create({
	baseURL: data.url,
	method: 'POST',
	headers: {
		Authorization: 'token ' + state.token,
	},
	data: {
		tag_name: data.tag,
		target_commitish: data.target,
		name: data.title,
		body: data.description,
		draft: data.isDraft,
		prerelease: data.isPreRelease
	}
})
const response = await request('/releases')
```

## 正解

```js:index.js
	data: {
		"tag_name": data.tag,
		"target_commitish": data.target,
		"name": data.title,
		"body": data.description,
		"draft": data.isDraft,
		"prerelease": data.isPreRelease
	}
})
```

### 参考
https://developer.github.com/v3/repos/releases/#create-a-release
![Screen Shot 2019-01-06 at 15.14.10.png](https://qiita-image-store.s3.amazonaws.com/0/109241/1550f28e-e6f3-19fa-6431-ad4a97df54bd.png)
LaravelでStripeを導入しようとしたらStripe\Stripeが無いよとなる件

# 環境
Laravel5.5
PHP7.0.26
Cloud9

##コマンド
```terminal
$ sudo apt-get install php7.0-curl
$ composer require stripe/stripe-php
```
▼Stripeをcomposerでインストールする手順は以下のURLが公式ページを参照
https://stripe.com/docs/libraries#php
##ビュー（blade側）の記述
▼参考URL
https://stripe.com/docs/checkout#integration-simple

```resources/views/stripe.blade.html
<form action="/payment" method="POST">
    {!! csrf_field() !!}
    <script
        src="https://checkout.stripe.com/checkout.js" class="stripe-button"
        data-key="pk_test_************************"
        data-amount="12000"
        data-name="TakayukiNJ"
        data-email="g181tg2061@dhw.ac.jp"
        data-description="description"
        data-image="https://stripe.com/img/documentation/checkout/marketplace.png"
        data-locale="auto"
        data-currency="jpy"
        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        })
    >
    </script>
</form>
```
##コントローラー側（web.php）の記述
▼参考URL
https://stripe.com/docs/quickstart

```routes/web.php
Route::post('/payment', function () {

    //ここにstripeアカウントのAPIキーをコピペ
\Stripe\Stripe::setApiKey("sk_test_*******************");

    // Token is created using Checkout or Elements!
    // Get the payment token ID submitted by the form:
    $token = $_POST['stripeToken'];
    
    // Create a charge: this will charge the user's card
    try {
        $charge = \Stripe\Charge::create([
            'amount' => 12000,
            'currency' => 'jpy',
            'description' => 'Example charge',
            'source' => $token,
        ]);

    } catch(\Stripe\Error\Card $e) {
      // The card has been declined
    }

    // サンクスメール送る...

    return view('home');
});

```

# 今回の闇（エラー内容）
stripe/stripe-phpを使いたくて
composer update もしくは composer require stripe/stripe-phpを実行しても
下記のエラーが出てしまう。

```terminal
- stripe/stripe-php v6.28.0 requires ext-curl * -> the requested PHP extension curl is missing from your system.
```

ブラウザでテスト実行すると、当然下記のweb.phpの該当箇所で怒られる。

```web.php
FatalThrowableError in web.php line ***:
Class 'Stripe\Stripe' not found
```
闇は深かったが、解決しました。

# ターミナルで順番にやるべきこと
```
$ sudo apt-get install php7.0-curl
$ cp /usr/lib/php/20151012/curl.so ~/workspace/ext/curl.so
$ sudo service apache2 restart
$ composer require stripe/stripe-php
```

# 考察
Cloud9でLaravelを動作するために、PHPのバージョンを5から7にした為、本来extファイルにcurl.soが入る必要があったのだが、別のファイルにcurl.soが保存されてしまったと考えられる。その為、コピーしたら、composerが無事に動いてくれた。
もっと違うやり方があるのかもしれないが、一旦動いたので、他にも同じことで困っている方がいたらお試しあれ！

## Special Thanks
今回、G's Academyの先輩でありデジタルハリウッド大学院の同期である酒井氏（@sakateu）に、多大なるご協力をいただきました。ありがとう！！
DotEditorで分散ソフトのノードグラフを書く

# はじめに
ROSを始めとするロボットのミドルウェアでは、多く分散システムとして設計され、互いをつなぐための通信のライブラリなどが提供されています。

ロボットだけでなく、IoTの分野でもセンサーデータを収集などに、軽量なpub/subのライブラリ[MQTT](http://mqtt.org/)を利用し、分散系でソフトウェアを組むということが行われているようです。

分散系でソフトウェアを作るには、ノード同士がどうつながるか設計することが大切になります。
以降で、ノードのグラフを制作するツールDotEidtorを紹介し、分散ソフトウェアの設計に利用します。

# 利用ツール
- [DotEditor](https://vincenthee.github.io/DotEditor/)
- [Graphviz](https://www.graphviz.org/)

# DotEditor
graphvizのDOT言語をGUIを使って記述することができるツールです。

グラフをテキスト形式で記述できるため、git等で変更の履歴が追いやすいという利点を担保しつつ、テキストで記述しなければならないハードルを下げてくれるのが良いです。

大枠をDotEdiotorで作成し、細かい修正はテキストで直接編集するもの良いでしょう。

# 準備
1. Graphvizをインストールする。
    - windowsでchocolateyを利用する場合は、```cinst graphviz -y```
2. Graphvizのバイナリにパスを通しておく。
    - windowsなら```C:\Program Files (x86)\Graphviz2.38\bin```あたり。
    - バージョンは適宜置き換える。
3. DotEditorを適当なディレクトリにダウンロードする

Linuxでもgraphvizと、Linux用のDotEdiotorをインストールすれば以降の使い勝手は一緒。

# 使い方
[ROS wiki](http://wiki.ros.org/ja/ROS/Tutorials/UnderstandingTopics)にある、turtle_simのノードグラフ相当のものを作ってみる。

ただし、rqt_graphは実行時のネームスペースが付与されて表示されている。（wikiのケースではルート/)

この例では、ネームスペースを変更できるよう設計するのでルート/は記述しない。

1. DotEditorを起動する。
2. 画像のような画面が出てくる。
3. 最初に表示されているサンプルはマイナスボタンで消す。
4. +ボタンを押してノードを作成(teleop_turtleとturtlesim)
5. 作成したノード同士をつなぐエッジでつなぐ。矢印の先がnodeBになるように選択し、ラベルにトピック名(turtle1/cmd_vel)を指定する
6. 完成した図をsaveボタンを押して保存する
7. 画像として貼り付ける場合はexportしておく。

![使い方](https://qiita-image-store.s3.amazonaws.com/0/99189/a31030ff-76ca-7281-8d9a-d8129cef1d9a.gif)
![保存](https://qiita-image-store.s3.amazonaws.com/0/99189/5438b94b-f2d2-526e-6a80-8c427df00a04.jpeg)

# 出来上がったファイル
アニメーションgifの中で作成したグラフを以下に示します。

## dotファイル
```
digraph G {
    rankdir=LR;
    fontname="sans-serif";
    penwidth="0.1";
    edge [comment="Wildcard edge", 
          fontname="sans-serif", 
          fontsize=10, 
          colorscheme="blues3", 
          color=2, 
          fontcolor=3];
    node [fontname="serif", 
          fontsize=13, 
          fillcolor="1", 
          colorscheme="blues4", 
          color="2", 
          fontcolor="4", 
          style="filled"];
    "turtlesim";
    "teleop_turtle";
    "teleop_turtle" -> "turtlesim"  [label="turtle1/cmd_vel"];
}
```

フォントや色の指定が書かれていることがわかります。GUIを使うとこういう細かい指定を手書きしなくて済むのが利点だと思っています。

ROSの場合は、pub/sub、service、actionなどで色わけするなど使い分けると良いかと思います。

## 画像ファイル(svgがアップロードできなかったためpngファイル)
export機能で出力したpngは以下のようになります。

![turtlesim](https://qiita-image-store.s3.amazonaws.com/0/99189/4df9f2a6-ee4d-61b8-559b-0eda9fffd052.png)
手が不器用なエンジニアでもiPad Pro + Apple Pencil なら絵や図を上手に描ける！ ほんと神デバイスなので買うしかないと何百万回でも叫びたい！

手が不器用なエンジニアでもiPad Pro + Apple Pencil なら絵や図を上手に描ける！ ほんと神デバイスなので買うしかないと何百万回でも叫びたい！

# こんな絵が10秒ぐらいで描ける

- 自分の字がものすごく上手になったような感覚がある、何らかの補正がすごそう
- 紙に書くよりも書き味が良いなんて信じられない
- MacBookのタッチパッドで絵を書くのの100万倍、iPad Mini + 指で描くのよりも600倍ぐらい素晴らしい、ほんとやばいやばいやばいやばいやばいやばいやばい

![image](https://user-images.githubusercontent.com/13635059/50732738-05cb9100-11c4-11e9-8856-cb2e07283197.png)

# iPad 標準のメモアプリが最強、なんの問題もない

![image](https://user-images.githubusercontent.com/13635059/50732740-15e37080-11c4-11e9-90c1-4c69da1bc0d0.png)

# 状態ごとに写真を保存することで、完成図だけじゃなく、途中の遷移状態も明らかにできる

![image](https://user-images.githubusercontent.com/13635059/50732745-2562b980-11c4-11e9-8757-fa7a4fd27b05.png)

# iPad から MacBook への共有は AirDrop で一瞬で可能

- いろいろな手段があるが AirDrop最強かもしれない
- icloud 共有 google photo 共有 twitter 共有もスピード感の点で劣る
- Airdropなんのために存在するの？と思っていたが今回見直した
- 写真からのコピペでアップロード周りが難しそうなので、とりあえずこの画面からスクリーンショット撮影しているがなんの問題もない

![image](https://user-images.githubusercontent.com/13635059/50732751-3d3a3d80-11c4-11e9-9c35-fe49e8ce41c1.png)



---

https://twitter.com/yumainaura

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


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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
公平なあみだくじって何回横線を引けばいいの？

#あみだくじの公平性
あみだくじは公平でないことで有名ですが，
できるだけ"公平らしく"行うにはどうすれば？ということで調査。

パラメータとしていじれるのは縦線数，横線数くらいですかね。
今回は横線の数であみだくじがどう変化するのか見る。

#あみだくじの定義

あみだくじの中身の部分を定義する。
横線の数（N_vertical）分，要素をランダムに入れ替えるだけ。
行いたいシミュレーションの特性上，初期値を以下のように設定。

```Python

GL_start = np.arange(N_vertical) #あみだくじ初期値
#print(GL_start) #縦線8本の場合
#[1,2,3,4,5,6,7,8]

def GhostLeg(GL_start, N_horizontal):

    for i in range(N_horizontal):        
        attention = np.random.randint(N_vertical) #横線位置
        if attention == 0:
            GL_start[0], GL_start[1] = GL_start[1], GL_start[0]
        elif attention == N_vertical-1:
            GL_start[-1], GL_start[-2] = GL_start[-2], GL_start[-1]
        else:
            which = np.random.choice([-1, 1]) #左右どちらと交換するか選択
            GL_start[attention], GL_start[attention + which] = GL_start[attention + which], GL_start[attention]
    return GL_start

```

#シミュレーション

今回は縦線8本で固定して，”横線何本あれば公平なの？”をシミュレーションしてみる。
どこのスタート地点を選んでも，移動距離（スタート地点からどれだけ離れた地点にゴールしたか）が同じになれば，ひとまず公平と言えるかもしれない。
したがって，横線の数を増やしていき，それぞれの移動距離の信頼区間をとることにする。


それぞれの横線数ごとに，10回試行の移動距離平均を100回出して，信頼区間を出す。
グラフ表示部分は割愛。

``` Python
N_vertical = 8 #縦線の数
Ntrial = 10 #試行回数
Nsample = 100 #標本数
const = 0

for i in range(len(N_horizontal)): #横線の数を変化
    for sampleIte in range(Nsample): 
        for trialIte in range(Ntrial):
            
            GL_temp = copy.deepcopy(GL_start) #あみだくじ初期化
            GL_end = GhostLeg(GL_temp, N_horizontal[const])
            
            #移動距離の平均
            for moveIte in range(1, N_vertical+1):
                tmp = list(GL_end).index(moveIte)
                GL_goal[moveIte-1] = tmp + 1 #ゴール地点がどこか（引数+1）
            movements_mean = np.mean(abs(GL_goal - GL_start))
            
        GL_result[sampleIte, i] = movements_mean
    const = const + 1
```

#結果
愚直なプログラムでしたが，結果はとりあえず出ました。
![movement_distance_8.png](https://qiita-image-store.s3.amazonaws.com/0/329432/b0e51faa-e36f-fd76-1041-3f51ccabda1d.png)

横軸は単純な横線数でなく，8人で1回ずつ線を引く動作を何周したかを表します。
これを見ると，およそ16周以降で移動距離が2.50~2.75に収束します。

8人のあみだくじを公平にするには，最低16周，128本の横線を引きましょう。
うーん，多いな！

しかし，選んだところから2,3本離れたところにしか行けないので
当たりから近い棒を選ぶのがやはり無難でした。
[Firebase] GitHub API で private リポジトリにアクセスしたりwriteしたい場合はscopeの設定が必要

## 使用したAPI
GitHub API - REST API v3

## `addScope()` を使う

```javascript:index.js
const provider = new firebase.auth.GithubAuthProvider()
provider.addScope('repo') //これが必要
const result = await firebase.auth().signInWithPopup(provider)
const token = result.credential.accessToken
```

### 参考
https://firebase.google.com/docs/auth/web/github-auth?hl=ja#-_1

### 関連（Scopeについて）
https://developer.github.com/apps/building-oauth-apps/understanding-scopes-for-oauth-apps/
pythonで特定のディレクトリ・ファイルを探す

`os.walk` を使います。

以下は、`root` というディレクトリの中で、`targetdir`という文字がディレクトリ名に含まれるディレクトリと、`targetfile`という文字がファイル名に含まれるファイルを探してprintする例です。

```python
import os

for dirname, dirnames, filenames in os.walk('root'):
    for subdirname in dirnames:
        if subdirname.find('targetdir') >= 0:
            print(os.path.join(dirname, subdirname))

    for filename in filenames:
        if filename.find('targetfile') >= 0:
            print(os.path.join(dirname, filename))
```

以上です。
Github をホームにして Medium はてなブログ Qiita にソーシャル投稿 。私のアウトプット戦略 2019/01/06

Github をホームにして Medium はてなブログ Qiita にソーシャル投稿 。私のアウトプット戦略 2019/01/06

From Github home to Social post on Medium Hatena Blog or Qiita. my output strategy on 2019/01/06

# Github is my Home for never lost my articles

![image](https://user-images.githubusercontent.com/13635059/50732665-b9338600-11c2-11e9-9aee-135e2af4b56a.png)

# New Post to other social services for content sharing

Japanese Qiita Hatena blog or English Medium

![image](https://user-images.githubusercontent.com/13635059/50732677-e718ca80-11c2-11e9-889c-5dd329c58e43.png)

# After post to social services twitter or Facebook sharing

i usually use particular social service sharing features

![image](https://user-images.githubusercontent.com/13635059/50732682-fdbf2180-11c2-11e9-85c1-eb9d017ce8ae.png)

---

https://twitter.com/yumainaura

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

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
H8/3664ではじめるマイコン制御3  7segLED-Rotation

今回はビットシフトを用いて二つの7segLEDの外周を順に点灯させていくプログラムです。

```c:7segRotation.c

//7segLEDの外周を順に点灯させ1の位で一周すると10の位で1つ移動するプログラム
#include <stdio.h>

#define	BRR		(*((unsigned char *)0xFFA9))
#define	TMA		(*((unsigned char *)0xFFA6))

#define	PMR1	(*((unsigned char *)0xFFE0))
#define	PMR5	(*((unsigned char *)0xFFE1))

#define	PCR1	(*((unsigned char *)0xFFE4))
#define	PCR5	(*((unsigned char *)0xFFE8))
#define	PCR7	(*((unsigned char *)0xFFEA))
#define	PCR8	(*((unsigned char *)0xFFEB))

#define	PDR5	(*((unsigned char *)0xFFD8))
#define	PDR7	(*((unsigned char *)0xFFDA))
void wait();

main()
   {
	int i,cnt=1;
	unsigned char Seg1,Seg10;//表示用変数
	unsigned char rot;//1の位シフト用
	unsigned char rot10;//10の位シフト用
	
	BRR=12;			//16MHZ時には12を　デフォルトは７　ボーレート変更	
 	PMR1 = 0x00;			/*ポート１を汎用ＩＯに設定*/
 	PMR5 = 0x00;			/*ポート１を汎用ＩＯに設定*/

	TMA = 0x98 ; 

 	PCR1 = 0xff;	//アドレス　FFE4
    PCR5 = 0xff;	//FFE8
    PCR7 = 0x00;	
    PCR8 = 0xff;	//FFED		//00入力　　ff出力
    
    
    if(cnt==1){//初期化
		Seg1=0x01;Seg10=0x81;rot=0x01;rot10=0x81;cnt=0;
		}
		
		
    for (;;) {/* 無限ループ */
		    
		
		wait(2000);
		PDR5=Seg1;
		wait(2000);
		PDR5=Seg10;
		wait(2000);
		
		
		if(rot==0x40){//1の位が1周したときの条件文
			rot=0x01;
			Seg1=rot;
			rot=rot<<1;
			
			//10の位のシフト
			rot10=rot10<<1;
			rot10=rot10 | 0x80;
			Seg10=rot10;
			}
		else{
			Seg1=rot;
			rot=rot<<1;
			}

		if(rot10==0xC0){//10の位が1周したときの条件文
		rot10=0x81;
		Seg10=rot10;
		}
		else{}
				
    }
    return 0;
   }

void wait(int n)
{
	int i;
 	for(i=0;i<n;i++);
}
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/333756/62b3ab6c-f42b-86ac-9c9e-211541551a6f.png)
以前にも述べましたが7segLEDは上図のようなビットとの対応をしているので、順にAから順に左シフトさせていくことで外周を順に点灯させていくことができます。そしてFを点灯後Gを飛ばしてAへ戻るようにします。

次へ　[H8/3664ではじめるマイコン制御4 ](https://qiita.com/kiki0817/items/aca98759437b7ce80b51)
railsでエラー処理

#初めに
エラーハンドルの忘備録

#rescue_from

application_controllerに

```ruby
rescue_from Exception, with: :rescue_from_exception


def rescue_from_exception(e)
  @exception = e 
  render 'errors/500'
end 

```

みたいな感じで使えます。

あとはactive_recordのエラーハンドルで

```ruby
rescue_from ActiveRecord::RecordNotFound, with: :record_not_found 

def record_not_found(e) 
  @exception = e
  render 'errors/record_not_found'
end 
```

とすればモデルなりデータがなかった時のエラーハンドルができる。


#その他のエラーハンドルを実装する

例えばForbiddenというエラーを実装したい場合は

ActionControllerErrorでForbiddenを定義してあげればよいです。

```ruby 
class Forbidden < ActionController::ActionControllerError
end 

rescue_from Forbidden, with: :forbidden  

def forbidden(e)
  @exception = e 
  render 'errors/500'
end 
```


みたいな感じで使い


```ruby 
raise Forbidden,"テキスト"
```

で呼び出せます。

テキストに関してはあってもなくても大丈夫です。



次にrouting_errorの実装の仕方です。


routes.rbに

```ruby
get '*wrong_routes' => 'routing_errors#index'
```

```
rails g controller routing_errors
```

として


routing_errors_controller.rbに

indexを定義する

```ruby
def index 
  raise ActionController::RoutingError,"以下のurlにはアクセスできません => #{request.path.inspect}"
end 
```

あとはapplication_controller.rbに

```ruby 
rescue_from ActionController::RoutingError, with: :routing_error 

def routing_error(e)
  @exception = e 
  render 'errors/routing_error'
end 
```

と書いてerrorsフォルダの中にrouting_errorを書いたらおわり。

これに関してはrouting_errorsフォルダの下でもいいのかも知れないけどとりあえずまとめている。


とりあえずこんな感じだけどapplication_controllerの中身がでかくなるのでその場合はconcernに入れてすっきりさせればOK
Ubuntu 18.04 壊れてしまったswapfileの復元

# システムモニタなどで、スワップが「利用できません」と表示されたり、swapfileシステムが壊れてしまった時の復元方法

・以下のコマンドを実行する。（スーパーユーザーで作業します）

```
rm -f /swapfile
dd if=/dev/zero of=/swapfile bs=2M count=2048
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
vi /etc/fstab
```

fstabはスワップファイルが壊れてしまって再起動したら、スワップの行が消されてしまっているので、以下のように追加する。

```
/swapfile swap swap defaults 0 0
```
[PHP]クラス定義 / インスタンス化 / インスタンス実行の例

#今回のコード
```php5:例
<?php

//クラスの定義
class User{ //class名は1文字目が大文字
	// property（プロパティ：クラスが持つ変数のこと）
	public $name; //クラス内で使える変数を定義

	// constructor（コンストラクター）
	public function __construct($name){
		$this->name = $name; // nameプロパティ（$this->name）に、渡ってきた引数（$name）を代入している
	}

	// method（メソッド：クラスが持つ関数のこと）
	public function sayHi(){
		return "Hi, " . $this->name . "!"; //上の__construct()で代入されたものが出力される
	}
}

//$user1と$user2を、それぞれ太郎と花子という名前でオブジェクトを作る(インスタンス化）
$user1 = new User("太郎");
$user2 = new User("花子");

//インスタンスを実行
echo "$user1->name<br>"; //$user1のnameプロパティに代入されているものを表示
echo $user2->sayHi(); //$user2のインスタンスから、sayHiメソッドを実行し、結果を表示
```
```text:実行結果
太郎
Hi, 花子!
```
#クラス定義のポイント
```php5:例の上半分
<?php

//クラスの定義
class User{
	// property（プロパティ）
	public $name; //クラス内で使える変数を定義

	// constructor（コンストラクター）
	public function __construct($name){
		$this->name = $name; // nameプロパティ（$this->name）に、渡ってきた引数（$name）を代入している
	}

	// method（メソッド）
	public function sayHi(){
		return "Hi, $this->name!"; //上の__construct()で代入されたものが出力される
	}
}
```
 - クラス名：1文字目は大文字
 - プロパティ：クラス内で使える変数
 - コンストラクター：プロパティに引数を代入
 - メソッド：クラスが持つ関数、まとめた処理

#インスタンス化の例
インスタンス化とはオブジェクトを作ること。今回のコードでは、

```php5:例の下から6行目
$user1 = new User("太郎");
```

ここの部分。
オブジェクトを新しく作る命令である「new」の後に、クラス名「User」、「 ( ) 」内に、引数「"太郎"」とすることで、オブジェクトが作られる。（インスタンス化されている。）
今回であれば、引数が「"太郎"」というオブジェクトを新しく作り、$user1に代入した。ということ。

#インスタンスの実行例①
```php5:例の下から2行目
echo $user1->name;
```
```text:実行結果
太郎
```
$user1のnameプロパティに代入されているものを表示する。

#インスタンスの実行例②
```php5:例の下から1行目
echo $user2->sayHi();
```
```text:実行結果
Hi, 花子!
```
$user2のインスタンスから、sayHiメソッドを実行し、結果を表示する。

#応用編：引数を2つ使ってインスタンス化
```php5:応用例
<?php

//クラスの定義
class User{ //class名は1文字目が大文字
    // property（プロパティ：クラスが持つ変数のこと）
    public $id;
    public $name; //クラス内で使える変数を定義

    // constructor（コンストラクター）
    public function __construct($id, $name){
    	$this->id = $id;
        $this->name = $name; // nameプロパティ（$this->name）に、渡ってきた引数（$name）を代入している
    }

    // method（メソッド：クラスが持つ関数のこと）
    public function sayHi(){
        return "Hi, " . $this->name . "! あなたのIDは" . $this->id . "です!"; //上の__construct()で代入されたものが出力される
    }
}

//$user1と$user2を、それぞれ太郎と花子という名前でオブジェクトを作る(インスタンス化）
$user1 = new User(1,"太郎");
$user2 = new User(2,"花子");

//インスタンスを実行
echo "IDは、$user1->id<br>";
echo "名前は、$user1->name<br>"; //$user1のnameプロパティに代入されているものを表示
echo $user1->sayHi(); //$user2のインスタンスから、sayHiメソッドを実行し、結果を表示
```
```text:応用例の実行結果
IDは、1
名前は、太郎
Hi, 太郎! あなたのIDは1です!
```
もう一歩だけ応用して、名前だけでなく、ID番号も引数に入れてインスタンス化したもの。

[参考サイト①](https://dotinstall.com/lessons/basic_php_v2/34118) / [参考サイト②](https://dotinstall.com/lessons/basic_php_v2/34119)
X-Server VcXsrvでROSのGUIが使えない

Windows用Xserver のVcXsrvでrvizを起動すると次のエラーが出て動作しない。
gazeboも同様。

VcXsrvの起動オプションに-nowglを追加すると起動できる

```
libpng warning: iCCP: known incorrect sRGB profile
libpng warning: iCCP: known incorrect sRGB profile
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
libGL error: No matching fbConfigs or visuals found
libGL error: failed to load driver: swrast
```
エンジニアリングのリファクタリング、ツール環境改善は「株投資」や「タワーディフェンスゲーム」に似てるっていつも思ってる

エンジニアリングのリファクタリング、ツール環境改善は「株投資」や「タワーディフェンスゲーム」に似てるっていつも思ってる

I remember Tower defense game when improve my digital soldier life 

![image](https://user-images.githubusercontent.com/13635059/50732451-175e6a00-11bf-11e9-9f85-322ed9ddb8fb.png)

# タワーディフェンスゲーム

- 昔ニコニコ系のサイトでやったタワーディフェンスゲーム、名前なんだっけ
- 初期投資、ポイントが売買に増えるアイテムに投資をするのが好きだった
- まずは地盤固めをする、最初は伸びないけれど、最後がどんどん楽になっていくパターン

最近だとlineレンジャーとかかな

 
![image](https://user-images.githubusercontent.com/13635059/50732502-d581f380-11bf-11e9-8a13-aab9c4454aee.png)

# 人生もエンジニアリングも同じじゃないだろうか

- よく言われることだけれど、リファクタリングしないとコードも何もかもが滅びて行く
- 環境改善やツール改善をしないとだんだんと首が回らなくなって死ぬ
- ポイントの増加率のためにポイントを割り振ることは最初は苦しいけれど、手遅れにならないうちにたくさんの投資をしておきたい

# かねもちとうさんびんぼうとうさん

おっとこれはマルチ商法の人がよく使ってる本だ‥だけどエンジニアリングも株の世界と同じ、投資が売買に利益を生むゲームだと思う

![image](https://user-images.githubusercontent.com/13635059/50732480-88058680-11bf-11e9-8658-21659d1acac0.png)

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


---

https://twitter.com/yumainaura

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









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
文字列操作あれこれ-Java編-

#文字列操作あれこれ-Java編-
とりあえず備忘録としてまとめています。
実践的ではないかもしれません。
とりあえずJavaから書きます。
変なこと書いてたら指摘してください。

#文字列結合
```java:Sample1.java
/**文字リテラルや定数の結合**/
String final CONSTSTR = "A";
String strA = "A" + "B" + CONSTSTR; // リテラルや定数は+で結合すると良い
System.out.println(strA); // ABA

/**その他の結合**/
String strB = "B";
String strC = "C";
StringBuilder buff = new StringBuilder();
buff.append(strA);
buff.append(strB);
buff.append(strC);
```


この記事が詳しいです
https://qiita.com/yoshi389111/items/67354ba33f9271ef2c68

#文字列を数字に変換
```java:Sample2.java
/**普通に文字列から数字に変換**/
String strA = "1";
int numA = Integer.parseInt(strA);

/**例外処理を考慮し、とりあえず例外時は0を返却**/
String hoge = "hoge";
try {
    int numB = Integer.parseInt(hoge);
} catch (NumberFormatException e) {
    return 0;
}
```

#文字列を切り出す(範囲指定)
```java:Sample3.java
/**切り出す始点と終点を指定して切り出し**/
String strA = "12345";
strA.substring(0,3); // 123
strA.substring(1,3); // 23

/**切り出す始点のみを指定して切り出し**/
strA.substring(2); // 345
```

#文字列を一文字だけ切り出す
```java:Sample4.java
/**一文字だけChar型で切り出し**/
String strA = "12345";
Char charA = strA.charAt(3); // 4
```

#前後の空白を削除する
```java:Sample5.java
/**前後の空白(半角のみ)を削除**/
String strA = " ABC ";
strA.trim(); // ABC
```

#文字列を置換する
```java:Sample6.java
String strA = "ABCABCABC";
/**全てのAをXに置き換える**/
strA.replace('A', 'X'); // XBCXBCXBC
/**一番最初のAのみXに置き換える**/
strA.replaceFirst('A', 'X'); // XBCABCABC
```

#文字列の完全一致判定
```java:Sample7.java
String strA = "ABC";
String strB = null;

/**完全一致しているか判定**/
"ABC".equals(strA); // true
"CBA".equals(strA); // false
/**判定する文字列がnullの場合はfalse判定**/
"ABC".equals(strB); // false
```

#大文字小文字を無視して文字列の一致判定
```java:Sample8.java
String strA = "ABC";
String strB = "xyz";

/**大文字小文字を無視して一致しているか判定**/
"abc".equalsIgnoreCase(strA); // true
"XYZ".equalsIgnoreCase(strB); // true
```

#文字列を前方一致か後方一致か判定
```java:Sample9.java
String strA = "ABCDE";

/**前方一致、あるいは後方一致しているか判定**/
strA.startsWith("AB"); // true
strA.endWith("DE"); // true
```

#文字列が空文字か判定
```java:Sample10.java
String strA = "";

/**文字列が空文字か判定**/
strA.isEmpty(); // true
```

#特定の文字列が含まれているか判定
```java:Sample11.java
String strA = "ABCDEFGHIJ";

/**特定文字列が含まれているか判定**/
strA.contains("DE"); // true
```
ScrollViewを持ったAlertDialogを表示する

## はじめに
利用規約画面などの文章を見せるためだけの画面を作成する際に、ActivityやFragmentで一画面作るのが正攻法だとは思います。
しかし如何せん面倒なのでもう少しライトに使えるAlearDialogでサクッと作った際の自分向けメモを残しておきます。

## 実装方法
まずはScrollViewを持つレイアウトファイルを作成します。
今回は要素として複数個のTextViewを持つためLinearLayoutを挟んでいますが、もっと手抜きをするならScrollView直下にTextViewをそのまま入れてしまっても大丈夫です。

```view_scrollable_text.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="hoge" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="fuga" />
    </LinearLayout>
</ScrollView>
```

あとは任意のタイミングでAlertDialogを表示するだけです。
このときsetMessageはせず、上記で定義したレイアウトファイルをsetViewします。
※ここではMainActivityのonCreateで表示するものとします。

```MainActivity.kt
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    AlertDialog.Builder(applicationContext)
        .setTitle("title")
        .setView(R.layout.view_scrollable_text)
        .setPositiveButton(
            "OK"
        ) { _, _ ->
            // Do nothing
        }
        .show()
}
```

## 使用例
![image.png](https://qiita-image-store.s3.amazonaws.com/0/68671/203e23c7-8e26-ab36-78de-c5490b5df7a3.png)


## おわりに
枝葉に時間をかけすぎるのも辛いので適度に手を抜いていきましょう。
Angular で超簡単に画面の自動スクロールを実装する方法

## 概要

Angular で画面スクロールを実現する方法（いわゆる、画面内アンカーにジャンプする動き）

静的 HTML コンテンツにおいて、画面内スクロールはよく使われる機能だが、Angular はブラウザが要素を探すタイミングが Router によるコンポーネント生成より早いためうまくいかなかった。
スクロールを無理やり実現しようと思ったら、ディレクティブとか頑張ってイジったり、別ライブラリ入れたりと苦労する。

しかし、v6.1 から導入された Router Scroller という機能でスクロールが超簡単に実現できるようになったため、その実装方法の備忘録。

ただし、ヌルヌルっと動くようなアニメーション動作の実装は説明していない。あくまで目的の位置をパッと表示するスクロール処理に関する内容となっている。

### 前提条件

- Angular バージョン 6.1.0 以降のみ対応
- RouterModule による画面ルーティングが実装済みであること

### Router Scroller の基礎知識

Angular のマイナーバージョンアップで v6.1.0-beta.1 から導入されたスクロール関連機能。
実際には、内包される以下のモジュールを利用することで実現する。

#### Scroll Position Restoration

スクロール位置の記憶と復元を行う機能を提供する。
Router によるナビゲーションを行うたびに、その時点でのスクロール位置を記憶し、ブラウザバックした時などに遷移前のスクロール位置に復元する。

この復元処理は Router によってタイミングが制御されているため、前の画面のルーティング処理が終わったあとにスクロールが移動するため『先にスクロールが走ってしまい後からコンポーネントが描画されてしまい位置がずれる』ということはない。

#### Anchor Scrolling

URL に `#hoge` のようなフラグメントがある場合、同値の **id** を持つ要素が静的 HTML ページ内にあれば、そこに自動でスクロールされる機能を提供する。

Router によるナビゲーションだけでなく、リロード（画面更新）でも同様にスクロールしてくれる。

#### Scroll Offset

オフセットを指定する機能を提供する。 ヘッダーが「fixed」や「sticky」の場合などに、スクロール位置をズラしたい場合に設定できる。
具体的には、RouterModule.forRoot メソッド内で設定するため、部品単位ではなく全体的な設定になる。

例えば、Anchor Scrolling で自動スクロールした時に、上部のヘッダーが sticky なので、y座標を 50px だけ少し下にズラして見栄えを整える、といったことが出来る。

## 手順

### Router Scroller を使用可能にする

デフォルトでは無効になっているため、そもそも機能を使えるように有効化設定する必要がある。
既に有効化している場合は、手順省略可。

```ts:**/**/app-routing.module.ts
...

@NgModule({
  // RouterModule.forRoot(routes) の第２引数に、以下のようにオプションを追加
  imports: [RouterModule.forRoot(routes, {
    scrollPositionRestoration: 'enabled', // enabled で有効化
    anchorScrolling: 'enabled', // enabled で有効化
    scrollOffset: [0, 50] // [x, y] 設定：オフセットを使用する場合のみ記載
  })],
  exports: [RouterModule]
})
export class AppRoutingModule { }
```

### Scroll Position Restoration の使い方

有効化の設定が完了した時点で、特にやることはない。
今まで通りアプリのナビゲーションでページ遷移等を行い、ブラウザバックを行えば、勝手に最後のスクロール位置で前画面に戻ってくれる。

### Anchor Scrolling の使い方

特定のページの、特定の場所に、画面遷移後に自動スクロールさせたい場合

#### まず、遷移先に id を設定する

```html:**/**/foo.html
...

<div id="hoge">
  この要素に飛んで来たい！！！
</div>

...
```

当然のことながら画面内において一意なので、他の要素の **id** とカブらないように注意。

#### フラグメント付き URL を発行する処理を書く
アンカータグにプロパティを指定

```html
<!-- パス /foo#hoge に遷移する -->
<a routerLink="/foo" fragment="hoge">飛べ！！！</a>
```

HTML のプロパティではなく、メソッド内の処理として実装する場合は以下のように書く。

```ts
import { Router } from '@angular/router'; // 追加

...

export class TestComponent {

  constructor (private router: Router) {} // 追加

  // 何かの契機で呼ばれるメソッド
  jumpToHoge () {
    // パス /foo#hoge に遷移する
    this.router.navigate(['foo'], {fragment: 'hoge'});
  }
}
constructor (private router: Router) {}
```

あとは、a タグをクリックするか、JS処理を実行すれば、 **id="hoge"** がページ上部に来るように、画面遷移およびスクロールを勝手にやってくれる。

### Scroll Offset の使い方

こちらも、ルーティング設定のオプションで設定が完了した時点で、特にやることはない。

Anchor Scrolling でフラグメント付き URL で遷移した時に、オフセットをしていないと、ブラウザの上部のギリギリにピッタリくっつくように文字が表示されると思うので、オフセットの Y 軸値を適当な数値にすれば少し縦にズレるのが確認できるので、各自で良い感じの余白ができるように数値を微調整してください。


以上で、スクロールの実装は完了。
H8/3664ではじめるマイコン制御2 押した回数を7segLEDで表示

前回は押しボタンそれぞれに数字を割り振っていましたが今回はボタンが押された回数を数えるプログラムです。


```c
//黒の押しボタンが押された回数を一桁で数字を表示するプログラム　
#include <stdio.h>

#define	BRR		(*((unsigned char *)0xFFA9))
#define	TMA		(*((unsigned char *)0xFFA6))

#define	PMR1	(*((unsigned char *)0xFFE0))
#define	PMR5	(*((unsigned char *)0xFFE1))

#define	PCR1	(*((unsigned char *)0xFFE4))
#define	PCR5	(*((unsigned char *)0xFFE8))
#define	PCR7	(*((unsigned char *)0xFFEA))
#define	PCR8	(*((unsigned char *)0xFFEB))

#define	PDR5	(*((unsigned char *)0xFFD8))
#define	PDR7	(*((unsigned char *)0xFFDA))
void wait();//プロトタイプ宣言

main()
   {
	int i,count=0;
	unsigned char LED[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x27,0x7f,0x67};
	BRR=12;			//16MHZ時には１２を　デフォルトは７　ボーレート変更	
 	PMR1 = 0x00;			/*ポート１を汎用ＩＯに設定*/
 	PMR5 = 0x00;			/*ポート１を汎用ＩＯに設定*/

	TMA = 0x98 ; 

 	PCR1 = 0xff;	//アドレス　FFE4
    PCR5 = 0xff;	//FFE8
    PCR7 = 0x00;	
    PCR8 = 0xff;	//FFED		//00入力　　ff出力
    
    for (;;) {/* 無限ループ */
    	while ((PDR7 & 0x40)!= 0);/* 押されていないとき待機 */
        wait(30000); /* チャタリング対策 */
        	if(count<9){
        		count++;
        	}
        	else{
        		count=0;
        	}
        PDR5=LED[count];
        while ((PDR7 & 0x40) == 0);/* 押されているとき待機 */
        wait(30000); /* チャタリング対策 */
    }
    return 0;
   }

void wait(int n)
{
	int i;
 	for(i=0;i>n;i++);
}
```

前半部分はほとんど同じです。変更点はmain内のfor文と関数wait()の追加です。

```c
while ((PDR7 & 0x40)!= 0);// 押されていないとき待機 
        wait(30000); // チャタリング対策 
            if(count<9){
                count++;
            }
            else{
                count=0;
            }
        PDR5=LED[count];
        while ((PDR7 & 0x40) == 0);// 押されているとき待機 
        wait(30000); // チャタリング対策 
```


```c

while ((PDR7 & 0x40)!= 0);// 押されていないとき待機 
        wait(30000); // チャタリング対策 
```

```c
while ((PDR7 & 0x40) == 0);// 押されているとき待機 
        wait(30000); // チャタリング対策 
```

このwhileでスイッチの立ち上がり、立下りを見ています。
さらにその後wait()でチャタリングが起こる時間より長い時間処理を待たせます。
もしこのプログラムでもチャタリングがおこるなら()内の数字を増やしてください。最後は表示プログラムです。

```c

 if(count<9){
                count++;
            }
            else{
                count=0;
            }
        PDR5=LED[count];
```
前回用意した0~9を表示する配列をcountによって変化させていき9をこえたら0に戻す条件文です。

![93164.jpg](https://qiita-image-store.s3.amazonaws.com/0/333756/8bf5e313-4567-7682-6c3d-814542c534a2.jpeg)

次へ[H8/3664ではじめるマイコン制御3 7segLED-Rotation](https://qiita.com/kiki0817/items/235a773d267a1f8fbdae)
基礎からのVMware Cloud on AWSーその８

VMware Cloud on AWSの基礎を
おさらいするための記事を書いてます。

過去７回は以下の内容をお届けしました。
今回最終回です。

第１回　物理構成の理解
https://qiita.com/hiroito1118/items/48d8d66fab24acd16c1d

第２回　管理方法と初期デプロイの概要
https://qiita.com/hiroito1118/items/8ed96c156b8577ca4749

第３回　ユースケース
https://qiita.com/hiroito1118/items/2669fc0ef64d8e07eb08

第４回　調達方法
https://qiita.com/hiroito1118/items/3ebbf3ce7a555d2f39f6

第５回　ハイブリッドクラウドを支えるネットワークサービス・製品
https://qiita.com/hiroito1118/items/7e57393e72d72e00d4a2

第６回　AWSネイティブサービスとの連携
https://qiita.com/hiroito1118/items/80b05507f7e77c14e9db

第７回　サポートとメンテンナンス
https://qiita.com/hiroito1118/items/ba5b6ca4f11b153ab867


最終回はサードパーティー製品との
連携に関する話題です。

# １．VMware Cloud on AWSでサードパーティー製品を使う
VMware Cloud on AWSの発表時に
パートナーエコシステムが発表されている通り、
複数のサードパーティー製品の動作や
サポートがされています。
オンプレミス環境でもサードパーティー製品と
組み合わせて環境構築するケースは多分にあるので、
知っておきたいところです。

## １）どんな場合に必要か
VMware Cloud on AWS自体、
（少々乱暴な言い方をすると）
動いているのがAWS環境内というだけで、
全体的にはオンプレミスのVMware環境と大差ありません。
その為、オンプレミスで必要だから導入している
サードパーティー製品は大体必要に
なるものと思ってよいと思います。
わかりやすいところではバックアップとかですね。

VMware Cloud on AWSで、特別に何かバックアップの仕組みが
用意されているわけではないため、
ここは利用者がサードパーティー製品を組み合わせ
デザインを行う必要があります。

## ２）なんでもかんでも使えるわけじゃない
じゃあオンプレミスと同じだね、
いつも使っているサードパーティー製品をもって来よう！
と考えた場合、失敗するかもしれません。

残念ながら、オンプレミス環境で
サポートされているサードパーティー製品が
VMware Cloud on AWSで使えるとは限りません。

VMware Cloud on AWSでのコンパチビリティが
取得できていないケースがあるからです。
実はオンプレミス環境とは別に、
VMware Cloud on AWSとしてのコンパチビリティがあります。

コンパチビリティガイドは以下を参照してください。
https://www.vmware.com/resources/compatibility/search.php?deviceCategory=vsanps&details=1&releases=290&page=1&display_interval=10&sortColumn=Partner&sortOrder=Asc

## ３）なぜ使えない場合が起こるのか
まずそもそも、ESXiのバージョンが違っていたりします。
クラウド環境用に特別にカスタムされたものが利用されている様にも見えますが、
残念ながら中の人ではないので、そこまで詳しくはわかりません。
このような背景から、通常の環境とは違う＝個別のコンパチビリティと
なっているようです。

また、ほかに推測されることとして、
サードパーティー製品の実装によっては、
全てのvCenter権限がないことによるエラーなども
発生する可能性があるため、
独自にコンパチビリティをとっているのではないかと思われます。

ここでは詳細を割愛しますが、
実際に検証を行った際、ある製品では
この環境特有のエラーが出ていましたので、
やはり確認されていることは非常に大切だなと感じています。
（本エラーに関する情報はVMさんも持っていません）

いずれにしてもコンパチビリティ掲載がない場合、
サポートされなかったりしますので、注意してください。

## ４）課題はサードパーティーベンダー側のサポート追従
VMware Cloud on AWSというクラウドサービスとなったことで、
従来塩漬けの選択ができたVM環境が
否応なしにバージョンを上げられていくこととなり、
サードパーティー製品ベンダーはこのアップデートに
追従していく必要がでてきました。

連携性の深さ次第とは思いますが、
アップデート直後だとコンパチビリティがとれていない
期間が発生してしまうので、
ここはサードパーティー製品ベンダーさんが
どのようなサポートポリシーで対応していくのか、
注意して確認する必要があると言えます。


# ２．連載の締め括り
さて、全８回でVMware Cloud on AWSに関する
投稿を行ってきました。

投稿のきっかけは、あるエンドユーザー様で、
RFP案にVMware Cloud on AWSについての
誤った記載があったことからでした。

今後サービスも改善されて内容が変わってくるかもしれませんが、
少なくとも今の時点のものを理解していただく
読み物として、少しでも役に立てればと思います。

VMware Cloud on AWS自体、
オンラインのカリキュレータなど使って試算すればわかりますが、
月額で数百万円レベルになるので、安い買い物ではないです。
クラウドサービスなので、ほぼそこで試算した額が実際の利用料です。
目的と用途としっかり理解して、
自社の戦略にあっていると思えば、活用してみてください。


【2019/12　追記】
本記事に関連し、ハイブリッドクラウドを実現する新たな選択肢である、
[Nutanix Clusters on AWSの記事](https://qiita.com/hiroito1118/items/9bd291f2fc5ec7e11b76)も作成してます。
VMware Cloudでは実現できなかった利用の一時停止など、
より活用しやすいサービスとして今後提供されてきます。乞うご期待。

連載は以上です。
SwaggerHubで更新するたびにGitHubにコミットさせる方法

# 目的
Swaggerを更新したら、コミットされてGitHubに反映され、GitHubに草が生えたら最高ですよね。
それを実現しようと思ったら、意外と日本語の記事が出てこなかったので書きました。

## 方法
GitHub Syncを使いましょう。
基本は以下のチュートリアルビデオに沿って操作すれば実現できました。
[GitHub Sync チュートリアル](https://www.youtube.com/watch?v=SvDml_BChnE)
しかし、上記のチュートリアルビデオは少し古く、最新バージョンのOpenAPI3.0では少し異なるところがありました。
それは、`Basic Sync`と`Advanced Sync`を選べるところです。

## Basic SyncとAdvanced Syncの違い
`Basic Sync`を選ぶと、SWAGGERHUBというブランチが作成され、そちらにコミットされてしまいます。
しかし、masterブランチでないとGitHubに草が生えないため、これでは困ります。正直Swaggerは何個もブランチ作って管理する程のものでもないので、直接masterブランチにコミットしてもらいたいと思いました。
`Advanced Sync`を選ぶと、ブランチ名、Output Folder、SwaggerHubが管理もしくは無視するファイルやフォルダーの選択が可能になります。
ですので、今回は`Advanced Sync`でmasterブランチを選択しようと思います。

## Advanced Syncの設定
`Branch`のところを`master`に、
`Fully Managed Paths`のところを`*`と設定すれば、無事GitHubのmasterブランチにコミットされて草が生えました！
ちなみに、`Fully Managed Paths`は指定したファイルやフォルダーがGitHub上になければ作成され、あれば変更分が上書きされるというものです。要するにバージョン管理の対象になるってことですね。`*`をつければ全てが対象になります。
Ubuntu16.04にFFmpegをバイナリでインストールした話

aptではなく、バイナリを持ってきてのイントールの記事があんまりなかったので投稿しておきます。

# バイナリを持ってくる
https://www.johnvansickle.com/ffmpeg/
ここから持ってきました。
自分の環境に合わせたものをwgetしてください。

私の場合は、AMDだったので以下のようにバイナリをダウンロード

```bash:command
wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
```


最新のversionはrelease: 4.1 でした。
versionが違うとDL用のURLが違う可能性があるのでご注意ください。

# インストール
DLしたtar.xzファイルを展開しようと思ったところエラー。
xzを展開するためにはtarだけでは足りないらしい。
xz-utilsが必要らしいのでインストール


```bash:command
apt-get install xz-utils
```

インストール後に展開

```bash:command
tar xvf ffmpeg-release-amd64-static.tar.xz
```

展開したファイルをbinにコピー

```
cp ./ffmpeg-4.1-64bit-static/ffmpeg /usr/local/bin
```

以上

# 今回実行したコマンド

```
wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
apt-get install xz-utils
tar xvf ffmpeg-release-amd64-static.tar.xz
cp ./ffmpeg-4.1-64bit-static/ffmpeg /usr/local/bin
```
【ReactNative】環境構築

# 開会式
今までWebアプリしか作ったことがなかったので、そろそろスマホアプリを開発したいと思います。
iOS, Androidどちらも作りたいので、Swift, Kotlinを学習しようと思いましたが、片方で燃え尽きそうなので共通して開発が可能なReactNativeで開発しようと思います。

# 作るもの
出会い系じゃないマッチングアプリ

# 環境構築
以下のドキュメントにしたがってget start!（一旦iOSだけ）
https://facebook.github.io/react-native/docs/getting-started

## nodeとwatchmanをinstall

```
$ brew install node
$ brew install watchman
```
`node`のバージョンは、8.3以上推奨
`watchman`はReact Nativeを開発したFaceBookが推奨しているファイル変更管理ツール

## The React Native CLIのinstall

```
$ npm install -g react-native-cli
```
`npm`はnodeと共にinstallされるので、すでに使用できる状態になっていると思います。
CLI（Command Line Interfaceの略）

※もしエラーが出た場合以下で実行

```
$ curl -0 -L https://npmjs.org/install.sh | sudo sh
```

## Xcodeのinstall

こちらはAppStoreにてダウンロード（結構時間と容量がかかります）

## React Native Projectの作成と、シミュレーター起動

```
$ react-native init ProjectName
$ cd ProjectName
$ react-native run-ios
```

すると、以下のようなシミュレーターが立ち上がる

<img width="403" alt="スクリーンショット 2019-01-06 13.03.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/174991/c7bd1c9e-c1fd-bc3a-a4c3-3d55d943045d.png">

`index.js`が読み込まれると、以下のような画面になります

![image.png](https://qiita-image-store.s3.amazonaws.com/0/174991/5943aea3-5182-cbd4-e24e-039786cd5e24.png)

# まとめ
基本的にドキュメントだけみていれば問題ないです。
2の際に、エラーが出続けたのですが、nodeのバージョンが`v10.2.1`とかだったのを、`brew node upgrade`して`v11.6.0`にしたらできました。
CentOS7 kubernetes Pod作成時のContainerCreating stuckエラー

##現象##
CentOS7上のKubernetes環境でPodの作成がContainerCreating状態で止まり失敗する

```
[root@master ~]# kubectl get pods
NAME           READY     STATUS              RESTARTS   AGE
sample-label   0/1       ContainerCreating   0          2d
sample-pod2    0/1       ContainerCreating   0          2d
```

##原因##
root証明書が存在しない

```
[root@master ~]# kubectl describe  pods
Name:           sample-label

------- 中略 ------
      Reason:           ContainerCreating
    Ready:              False
    Restart Count:      0
    
  2d            3m              791     {kubelet worker}                       Warning          FailedSync      Error syncing pod, skipping: failed to "StartContainer" for "POD" with ErrImagePull: "image pull failed for registry.access.redhat.com/rhel7/pod-infrastructure:latest, this may be because there are no credentials on this request.  details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)"

```

##解決策##
https://bugs.centos.org/view.php?id=14785
上記の手順を実施

```
# wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
# rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem
```
Podの作成が成功

```
[root@master ~]# kubectl create -f label.yaml
pod "sample-label" created
[root@master ~]# kubectl get pods
NAME           READY     STATUS              RESTARTS   AGE
sample-label   0/1       ContainerCreating   0          3s

[root@master ~]# kubectl get pods
NAME           READY     STATUS    RESTARTS   AGE
sample-label   1/1       Running   0          52s
````

masterのみでなく、worker側でも必要
※worker側での作業前は、ReplicaSetのworkerでの作成が失敗

```
[root@master ~]# kubectl get pods -o wide
NAME                 READY     STATUS              RESTARTS   AGE       IP             NODE
sample-externaldns   1/1       Running             0          57m       172.17.0.131   master
sample-label         1/1       Running             1          3h        172.17.0.130   master
sample-rs-5cr60      0/1       ContainerCreating   0          3s        <none>         worker
sample-rs-6w9fp      1/1       Running             0          3s        172.17.0.132   master
sample-rs-r1t7l      0/1       ContainerCreating   0          3s        <none>         worker
```

workerでの作業後、成功

```
[root@master ~]# kubectl get pods -o wide
NAME                 READY     STATUS    RESTARTS   AGE       IP             NODE
sample-externaldns   1/1       Running   0          1h        172.17.0.131   master
sample-label         1/1       Running   1          4h        172.17.0.130   master
sample-rs-5cr60      1/1       Running   0          3m        172.17.0.3     worker
sample-rs-6w9fp      1/1       Running   0          3m        172.17.0.132   master
sample-rs-r1t7l      1/1       Running   0          3m        172.17.0.2     worker
```

※参考
https://qiita.com/kamaboko123/items/80f3161c5d781dfc7700
関数のデフォルト引数は一度しか評価されない（python）

# 関数のデフォルト引数は一度しか評価されない（python）
* 関数のデフォルト引数は__定義された時一度しか評価されない__ので注意が必要
* 以下の例だと、`get_num`が宣言された時の`nums`(=0)が`i`のデフォルト値になり、途中で更新されることはない

```python
nums = 0

def get_num(i=nums):
	print(i)

get_num()	# 0
nums=10
get_num() # 0
get_num(34) # 34
```

* これはクラス内のメソッドでも同じで、__クラス及びそのメソッドが宣言された時一度だけ評価される__

```python
nums = 0

class A:
    def get_num(self,i=nums):
        print(i)

a = A()
a.get_num() # 0

nums=10

b = A()
b.get_num() # 0

b.get_num(34) # 34
```
Raspberry PiにElasticsearch/Kibanaのインストール

前の記事ではWSL環境で試験的に環境設定を行った．今回は手元にあったRaspberry Pi2にElasticsearchをインストールしたので，手順と詰まったところをまとめておく．ラズパイ自体久しぶりに起動したのでapt-getで最新版に更新しておいた．ついでに言うと，Javaはなぜかインストール済みだったのでそのまま利用した．

次のサイトを参考にした．

- [Raspberry Pi 3(Raspbian)でElasticsearch 6.1.1+Kibana 6.1.1を使う](https://tech.taiko19xx.net/entry/2018/01/14/210400)
- [RaspberryPiでログの見える化するよ（Elasticsearch×kibana×Fluentd）](http://www.cyamax.com/entry/2017/03/08/060000)

```bash
$ java -version
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) Client VM (build 25.65-b01, mixed mode)

$ pinout
,--------------------------------.
| oooooooooooooooooooo J8     +====
| 1ooooooooooooooooooo        | USB
|                             +====
|      Pi Model 2B V1.1          |
|      +----+                 +====
| |D|  |SoC |                 | USB
| |S|  |    |                 +====
| |I|  +----+                    |
|                   |C|     +======
|                   |S|     |   Net
| pwr        |HDMI| |I||A|  +======
`-| |--------|    |----|V|-------'
```

# 環境設定

Elasticsearchをダウンロードしてきて設定．公開用ではないので，古いバージョンでそのまま試した．ついでにconfig/jvm.optionsを編集して，1Gから256Mに設定．またconfig/elasticsearch.ymlを修正して，外部からのアクセスと，起動時のフィルタ的な物（詳細不明）をfalseに設定した．

```bash
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.1.1.tar.gz
$ tar zxvf elasticsearch-6.1.1.tar.gz
$ cd elasticsearch-6.1.1/
```


```txt
bootstrap.system_call_filter: false
network.host: 0.0.0.0
```

このままラズパイで起動すると怒られるので，以下の設定をしておく．ただしsysctlの設定は再起動するとリセットされていたので，永続的にするにはちゃんとどこかに書く必要がある（未調査）．

```bash
$ sudo sysctl -w vm.max_map_count=262144
```

起動して別PC(SSH元)からアクセスし，次のようにJSONが返ってくることを確認．

```json
{
  "name" : "rFLJjqP",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "F1PiMal1S6669hQ7520iHQ",
  "version" : {
    "number" : "6.1.1",
    "build_hash" : "bd92e7f",
    "build_date" : "2017-12-17T20:23:25.338Z",
    "build_snapshot" : false,
    "lucene_version" : "7.1.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}
```

次に上の参考にしたブログ記事の通り，Kibanaをインストールする．特に変更点はなし．動作確認するときに0.0.0.0の設定を忘れない（elasticsearchと同じ）．elasticsearchとkibanaを両方起動させ，動作を確認する．WSLとバージョンが違うので画面が少し異なるけど，ブラウザから起動確認できた．

<img width="705" alt="kibana_els.png" src="https://qiita-image-store.s3.amazonaws.com/0/7181/e2c8f1c3-8d92-85bb-109b-df43f8d29c59.png">
typehintとmypyを使ったpythonの型チェック

# typehintとmypyを使ったpythonの型チェック
## typehintとは？

```python
def add_nums(num1: int, num2: int) -> int:
    return num1 + num2
    
add_nums(5,3)
>> 8
```

* python 3.5以降のみ対応している機能
* typehintとは関数作成時に、引数・返り値の型を設定しておくことで、関数使用時・あるいはデバッグ時にわかりやすくするための機能
* 実行時に型チェックをするわけではないので、設定された型に反しいてもエラーも警告も出ず、そのまま実行できる
* mypyを使った型チェックがデバッグに便利

## 使い方
* 冒頭のスクリプトにあるように、関数の引数・返り値の型を設定するのが基本的な使い方。
* `int`や`str`といった通常のtypeだけでなく、以下で紹介するカスタムな型を用いることで、もう少し柔軟な設定も可能となる。

## エディタ使用時の注意点
* SublimeのSublimeLinter-flake8など、構文エラーチェックツールを入れている場合、構文バージョンをpython3.5以上にしないと、typehintの部分がsyntax errorとなってしまう
* SublimeでSublimeLinter-flake8を使っている場合、以下のように設定を更新する。
	* [基本設定]->[Package Settings]->[Python Flake8 Lint]->[Settings-User]で設定ファイルを開く。
	* `"python_interpreter": "auto"`となっている`auto`の部分を自身の使っているpythonの絶対パス(例:`"/User/username/.../python"`)に置き換える。(pythonの絶対パスはターミナルで`which python`と入力すれば得られる)

## カスタムな型

### カスタムな型1: 型エイリアス
* 型のショートカット（エイリアス）である型。元の型と同値になる。使うと複雑になるだけのでここでは省略。

### カスタムな型2: NewType(継承型)
* ある型を継承したサブクラス型を定義する方法。型エイリアスのように別名の型変数を生成するところは似ているが、作った型は元と同値ではなく、サブクラスになる。

```python
from typing import NewType
Newnum = NewType('Newnum', int)

def return_int(num: int) -> int:
    return num

def return_num(num: Newnum) -> Newnum:
    return num

return_num(Newnum(5)) # 入力型Newnumがtypehintの指定と一致しているのでOK
return_int(Newnum(5)) # 入力型Newnumはtypehintの指定にあるintのサブクラスなのでOK
return_num(5) # 入力型intはtypehintの指定にあるNewnumのスーパークラスなのでNG -> mypy Error
return_num(Newnum("5")) # Newnumはintのサブクラスなので関係のないstrはNG -> mypy Error
```

* 最後の例のように`int`も`str`も入れたいNewTypeを作るときは、objectのサブクラスとしてNewTypeを作成する

```python
Newobj = NewType('Newobj', object)
Newobj(5)   # intはobjectのサブクラスなのでOK
Newobj("5") # strはobjectのサブクラスなのでOK
```

### カスタムな型3: TypeVar(型変数)
* 型の種類を変数として持つことができる
* 第２引数以降にtypeを与えることで、持つことができる型の種類を制限することができる
* ただし、１種類に制限することはできない(それならtypeエイリアスを使うべき)

```python
from typing import TypeVar
T = TypeVar('T') # 型変数Tを定義
O2 = TypeVar('O2',int, float) # intかfloatに型の種類を制限
O1 = TypeVar('O1',object) # 1種類の型に制限はダメ
O11 = TypeVar('O11',int,int) # ただし、これはできてしまう
```

* TypeVarをジェネリクスに使うこともできる
	* ジェネリクス(総称型): コンテナの中に入れるオブジェクトの型を指定する方法。

```python
from typing import TypeVar, Sequence

T = TypeVar('T', int, float)      # Declare type variable


def first(l: Sequence[T]) -> T:   # Generic function
    return l[0]

print(first([1, 2, 3, 4, 5]))  # mypy OK
print(first(["a", "b"]))  # mypy error: Value of type variable "T" of "first" cannot be "str"
```

## mypyを使った型チェック
* まず、mypyをpipでインストールする
``pip install mypy``

* 次のようなpythonスクリプトを作成する

```python
def add_nums(num1: int, num2: int) -> int:
    return num1 + num2

add_nums("5", "3")
```

* 上記pythonスクリプトをmypyで実行する(`mypy [スクリプト名]`)と次のようなエラーが出て、typeが間違っていることがわかる。なお、typeが間違っていない場合、何も出力されない。

```shell
$ mypy check_type.py 
>> check_type.py:4: error: Argument 1 to "add_nums" has incompatible type "str"; expected "int"
>> check_type.py:4: error: Argument 2 to "add_nums" has incompatible type "str"; expected "int"
```
[CSS] marginとpaddingをたとえて考えて見た。

#注意:warning:
この記事の投稿者は、

**`margin`と`padding`を正しく全て理解していません。**

わかったことがあり次第、臨時更新をしていく。
備忘録兼・投稿者成長型の記事です。（読者は何も得をしない記事ですね）

#marginとpaddingの基本
`content` 要素の中身
`padding` 要素内の余白
`border` 要素の線
`margin` 要素外の余白
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183735/167c0716-64c4-ed8c-3e3c-208f9bf76d2e.png)

このようなCSSの余白の考え方を**ボックスモデル**と呼ぶ。

#marginの無効
##噛み砕いて見てみる
**「譲り合いがたくさん行われている」**
某Dリゾートでは、毎日楽しいパレードやショーが行われている。
見たことある人はわかると思いますが、だいたい席取りをしてから見ますよね？
もちろんですが、席で見るということは隣の席がある訳です。
隣の席の人からすれば、あなたは隣の席の人です。
ということは、`席の間の若干の空間`の譲り合いがあるわけです。
荷物をほとんど置いていない人。赤ちゃんの荷物をたくさん置いている人。見ながら食べる食べ物を置いている人。たくさんお土産を買った人。ミニゲームで大きなぬいぐるみを取った人。訳わからんけどたくさん荷物ある人。いろんな人がいると思います。
そんなとき、私たちは荷物を`席の間の若干の空間`に置きます。（今回はそういうことにします。）
日本人はいろいろな場面において、**譲り合い**が発生します。
そして`席の間の若干の空間`は、とても狭いスペースです。
そうすると、だいたい人間は席やスペースを詰めて全てが入るようにします。
そうしても、無理があるほど狭いときがあります。
そう、どちらが多めに`席の間の若干の空間`を使うか**譲り合い**が発生する訳です。
ここでは、**荷物が少ない方**が`席の間の若干の空間`を**荷物が多い方**に譲ります。

##真面目に見てみる
###01. ことばを変換
`席の間の若干の空間` を `margin`
**譲り合い** を **無効**
**荷物が少ない方** を **marginの値が小さい方**
**荷物が多い方** を **marginの値が大きい方**

という風に変換します。そして、解説していきます。
###02. コード
```index.html
<body>

  <div class="bottom">
    <h1>margin-bottom: 10px;</h1>
  </div>

  <div class="top">
    <h1>margin-top: 30px;</h1>
  </div>

</body>
```
```style.css
* {
  margin: 0;
  padding: 0;
}

body {
  color: #fff;
  font-family: 'Noto Sans JP', sans-serif;
}

div {
  padding: 10px;
  width: 100%;
  height: 200px;
}

.bottom {
  margin-bottom: 10px;
  background-color: #2fd3a1;
}

.top {
  margin-top: 30px;
  background: #6730d1;
}
```
###03. 結果
上の要素が**marginの値が小さい方**、下の要素が**marginの値が大きい方**である。
上の要素の方が`margin`の値が小さいので、**無効**となる。
[DEMO]()
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183735/e69fed61-eb90-5a5a-e7d0-4aa73421583f.png)

#参考にさせていただきました
[CSSのmarginとは？paddingとは？余白の指定方法まとめ](https://saruwakakun.com/html-css/basic/margin-padding#section1)
PowerShell : Invoke-Webrequestメモ

#動機
Windows PowerShell上でcurlが正常に動いてくれなかった(文字列のエスケープ処理)ので、代替となるコマンドを探してみた。

#コマンド
```powershell:Invoke-Webrequest
Invoke-WebRequest -Headers @{"Content-type"="application/json"} -Method Post -Body '{"jsonrpc":"2.0","id":1,"method":"eth_accounts","params":[]}' http://localhost:8545
```
curlを利用する場合、bodyのjsonキーや値を囲む「"」をエスケープすることで解決可能。
(Invoke-Webrequestではエスケープ不要)

```shell:curl
curl -H "Content-type: application/json" -X POST -d "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"eth.accounts\",\"params\":[]}" http://localhost:8545
```

Invoke-Webrequestの結果は以下のとおり。

```
StatusCode        : 200
StatusDescription : OK
Content           : {"jsonrpc":"2.0","id":1,"result":["0x6a66af57467ca3c9d5c52ea00b582662706974ce","0x70967e3578a254f09
                    ff6ed5fd31cbb3c1a0ec719"]}

RawContent        : HTTP/1.1 200 OK
                    Vary: Origin
                    Content-Length: 126
                    Content-Type: application/json
                    Date: Sun, 06 Jan 2019 03:49:18 GMT

                    {"jsonrpc":"2.0","id":1,"result":["0x6a66af57467ca3c9d5c52ea00b582662706974ce...
Forms             : {}
Headers           : {[Vary, Origin], [Content-Length, 126], [Content-Type, application/json], [Date, Sun, 06 Jan 2019 0
                    3:49:18 GMT]}
Images            : {}
InputFields       : {}
Links             : {}
ParsedHtml        : mshtml.HTMLDocumentClass
RawContentLength  : 126
```