OmniAICreator/Qiita-1.07M huggingface dataset:
ユビキタス言語について

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257568/476900b2-2c35-29c2-4bb2-ec06c330dd01.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257568/4d3f5477-8b6c-7395-1183-ca2c8c7bf8be.png)

こちら2つを読んで

## ユビキタス言語とは
**ソフトウェア開発チーム全体で作り上げる共有言語**

- ドメインのユーザーが使う用語とプログラムを構成する用語を一致させた言葉
- プロダクトオーナー、開発者間のコミニュケーションを円滑にするためのようなもの


## ユビキタスとは
「満遍なく」とか「どこにでもある」という意味 

## ユビキタス言語の考え方
その業務自体が、どのような考えでどのように動くのか

- プロジェクトにとっての最善の用語か
- ユビキタス言語における変更は、モデルに対する変更である
- ドメインエキスパートは用語や理解を伝えるために適切かどうかに、開発者は設計を妨害する不整合さがないかどうかに着目すべき

## ユビキタス言語のスコープ
- チーム。チームによって話されて、チームが開発する単一のドメインモデルで表現される
- 「業界全体で」とか「全社的に」あるいは「世界中で」共通なドメイン言語を想定したものではない(ユニバーサルではない)
- 境界づけられたコンテキストごとに、それぞれのユビキタス言語が存在する
- 境界づけられたコンテキストは、当初の想定よりも比較的小さくなる。
- 境界づけられたコンテキストは、ひとつの業務ドメインのユビキタス言語全体をとらえることができる程度の大きさにとどまるもの

## 具体的にやること
シンプルな定義をまとめた用語集や図を作る

## ポイント
- ユビキタス言語は日々変化していく(仕様や機能も変わっていくので)
- ユビキタス言語がそのままドメインモデル名となる

## 参考文献
Eric Evans. エリック・エヴァンスのドメイン駆動設計
https://amzn.to/2E2QmHB

ヴァーン・ヴァーノン. 実践ドメイン駆動設計
https://amzn.to/2E6uMlU

## 雑感
狭義では実際のコードと対応づく言葉だけを定義していくものな気がするが、広義では共有言語なので単語集くらいの気持ちで運用しはじめてみるのが大事そう

言葉に対する理解度は可視化しないと乖離も出やすいし、共通認識を合わせるスタンスの具体的アプローチとして適していそう
【Unity】複数のColliderが接触している場合の判定

# 実際に困ったケース
Unityで当たり判定を設定する場合`Colider`を利用するわけですが、細かいところに手が届かないことがあります。具体的には以下のような場合に困ったわけです。

- カンタンなゲームのルール
 - 青い枠に接触すればゲームクリア
 - 赤い枠に接触するとゲーム失敗

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412322/1527c891-f70f-de90-c209-1fc3e021ad05.png)


接触した瞬間に判定するだけなら大丈夫です。ただし、もしこれが接触した状態を「少しの間」待ってから判定する場合、以下のようなことを考える必要があります。

- 接触から少し時間が経過してから判定処理をする場合
 - 青い枠と赤い枠が同時に接触する場合がある
 - 同時に接触した場合に優先する仕組みが必要


# Unityにそういった機能はないの？

記事登校時の2019/05/16にはなかったように思います。接触してる状態を取得するなら`Collider.OnCollisionStay`を使えばイイんですが、それぞれの接触ごとに検知します。上記のように少し時間が経過してから判定をしたいのですが、それぞれに接触したときのオブジェクトを検知します。したがって時間差でどちらのオブジェクトを優先などの処理は工夫する必要があります。

# 複数の接触をどうやって検知するか？

答えはカンタンで`GameObject`の`List`を使えば検知できます。もう少し細かくいうと`Collider`で検知したオブジェクトを`List`に格納していき、その`List`に格納されている内容から判定を行えばよいです。青い枠に当たっていれば赤い枠に触れててもクリアする場合は以下のようにするとよいです。以前に投稿した記事のソースから説明用に削っています。
タブンですがそのままコピペしても動くかもしれません。アタッチしたオブジェクトについては、画面タップすると上にオラァ～って吹っ飛んでいきます。2Dのゲームなのでご注意をば・・・。

```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class C02_HandMove : MonoBehaviour {

    public float pushSpeed = 10.0f; //打ち出されるスピード

    bool isTouched = false; //タッチされたか

    private float stayTime = 0;

    List<GameObject> colList = new List<GameObject> ();

    void Update () {

        //タッチしたらアタッチされているオブジェクトを上に発射
        TouthPushHand ();

        if (isTouched) {
            stayTime += Time.deltaTime;
            //１秒後にcolListで判定を行う
            if (stayTime > 1.0f) {
                if (colList.Count == 1) {
                    foreach (GameObject checkObj in colList) {
                        if (checkObj.name == "PushHole") {
                            Debug.Log("クリアしました！");
                        } else {
                            Debug.Log("失敗しました！");
                        }
                    }
                }
                if (colList.Count > 1) {
                    Debug.Log("クリアしました！");
                }
                if (colList.Count == 0) {
                    Debug.Log("失敗しました！");
                }
            }
        }
    }

    void TouthPushHand () {
        Vector3 PushForse = new Vector3 (0, pushSpeed, 0);
        if (Input.GetMouseButtonDown (0)) {
            gameObject.GetComponent<Rigidbody2D> ().AddForce (PushForse, ForceMode2D.Impulse);
            isTouched = true;
        }
    }

    private void OnCollisionEnter2D (Collision2D col) {
        colList.Add (col.gameObject);
    }
}

```

`OnCollisionEnter2D`で接触してきたオブジェクトをリストに格納します。ガチャガチャと書いていますが、リストの中のオブジェクトを以下のような形で判定しています。

- リストの中のオブジェクトが１つだけの場合
 - 青い枠のオブジェクトに当たっていればクリアと判定
 - 赤い枠のオブジェクトに当たっていれば失敗と判定
- リストの中のオブジェクトが２つ以上の場合、青い枠を優先するのでクリアと判定
- リストの中のオブジェクトがない場合、失敗と判定

冗長的なカンジで拡張性もどうなのよ？っていうご意見はあるかもしれませんが、ifでの分岐でわかりやすいので初心者にはイイかなと思ってます。知っている人からすれば当たり前かもしれないんですが、こういうTIPSをわかりやすくまとめておきたいのです。

ちなみに上記のコードだとUpdateに記述されているため、接触後はコンソールにログが表示され続けます。解決したい場合は、別でゲームクリアフラグのようなモノで管理するか、判定後にゲームオブジェクトを生成する場合なら`!GameObject.Find`などの条件で１つだけ生成するようにするとイイかもしれません。多重生成を防ぐ件については別の記事で投稿しようかなと思います。
Prometheus 自身の監視　[ 確認 ]

##確認してみよう
- 初期の監視対象は・・・
- confファイル　//少し


## 参考
インフラ・サービス監視ツールの新顔「Prometheus」入門
https://knowledge.sakura.ad.jp/11633/

## 監視対象は？
[Status]>[Targets]
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77147/bdef2f6f-7a1d-d653-aad6-6e18e9e451f7.png" width=70%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77147/45e68ea0-df19-fb26-245f-8a255d6466b8.png" width=70%>

既になんかはいってる！


##conf解読してみる
##node_exporterてなんだ

[途中]
データサイエンティストだけど認定スクラムマスターになりました

# はじめに

Scrum Incが実施しているスクラムマスター研修を受講し、認定スクラムマスター（LSM)になりました。
研修を受けてみての感想を書きます。スクラム自体についての説明はありません。
また、データサイエンス要素はほぼ皆無です。タイトル詐欺すみません。

# 動機

データ分析の仕事をしているのですが、日々の業務内容が変動的でかつ必要なスキルが横断的になると感じています。こういった性質は、スクラムによる動き方と相性が良いと以前から考えていました。

スクラムチームは、アジャイルの思想を取り入れているため変動的な業務内容に強いです。また、成果を上げているチームは、自己組織化でかつ機能横断化といった特徴をもつ傾向にがあります。そのようなチームになるということは、メンバー自身のマインドとスキルが成長しているとも考えられ、最高のOJTになると思います。

上記の理由から、以前からスクラムに興味を持ち、実践も多少行っていたのですが、今回いい機会だったので研修を受講しました。

# 研修について

## 受講者

人数自体は、50人前後くらいでした。

オリエンテーションで参加者のスクラムの経験年数分布がなんとなくわかるんですが、未経験者が全体の25~30％くらいでボリュームゾーンだったと思います。経験が長い人は少なくて、1年以上の経験者は全体の10％くらいでした。

もちろん、経験年数は気にしなくていいと思います。でも、2~3ヶ月くらいのスクラム経験者でも、ばりばり工夫をこらしたプラクティスをしている優秀な方もいたので、良い刺激になりました。

## 研修

講義60%、グループワーク30%、質疑応答10%といった構成で進行します。

内容は、スクラムの起源についてから始まり、スクラムの構成する要素の概要を終えた後、細かな説明が行われます。
各トピックで関連する事例の紹介も聞くことができます。

研修前にスクラムガイドを読むようにアナウンスされますが、読まなくてもなんとかなる構成だったと思います。ただし、専門用語が大量に出てくるので、事前に読んだほうが理解のためにはよいかと思います。

## 認定試験について

研修の後に、認定試験を受検することができ、無事合格するとスクラムマスターとして認定されます。
難易度は研修をしっかりと受けていればそんなに高くないと思いますが、ところどころ日本語訳が不自然なので、もにょりながら受検するかと思います。

# 感想

## よかったこと

- ワークショップ形式のコンテンツで理解しやすかった点
- ティーチングにも役立つようなスクラムの起源と簡潔な説明を聞くことができた点
- 受講者全体でのディスカッションで、他の経験者のプラクティスを知れた点
- 既に経験済のワークショップがいくつかあり、メタ視点での分析ができたこと
- 結果的に、体系的なスクラム知識が得られ、自分の考えへのプラスになったこと
- プランニングポーカーのカードが貰えた！

## 残念だったこと

- チーム外の人との交流があまり無かった点
- 基本的にエンジニア系の人が多く、自分と似た職業の人がいなかった
- スクラム形式のグループワークの質が、良くも悪くも所属したチームのスクラム経験度による質次第でまちまちになっていたように感じたこと

# 最後に

研修は2日間をまるまる使うので疲れますが、むっちゃ充実してました！
ある程度経験があったことも要因かもしれませんが、難易度は易しめで身構えるほどではないと思います。覚えることは多いのでそれなりの覚悟はいるかと思いますが。
未経験者だけだと導入も実践も難しいと思うので、スクラムに興味があれば参加してみるのはありだと思います。

プロダクトオーナーの研修も興味はありますが、こちらはプロダクトバックログへの追加する要求整理とかの話だそうで、職業柄慣れている内容かなと思っているので悩み中。。。
PHPでパスワード付きzipを作成

###作成方法

ネットを検索すると5系のexecなどを使わないとできないという情報のみだったのですが、PHP7.2以上は作成が可能です！

```php
<?php

$zip = new ZipArchive;
$res = $zip->open('test.zip', ZipArchive::CREATE);
if ($res === TRUE) {
    $zip->addFromString('test.txt', 'file content goes here');
    $zip->setEncryptionName('test.txt', ZipArchive::EM_AES_256, 'password');
    $zip->close();
}
```

ぜひ、お試しください！
Python3のfloat型の誤差について

(Project Eulerについてのネタバレを含みます)
　　
　　　　
　　　　
　　
　　　　
　　
　　


　　
　　

　　
　　　
　　
　　
　　
　　
　　
　　
　　
　　
　　
　　
　　
　　
　　
　　
　　
　　
　　
　　
　　　



　　
　　



　　
　　




　　
　　

　　

　　
　　

　　
Project Eulerの16を解いていた。

https://projecteuler.net/problem=16

やってること自体は単純で2^1000をひたすら0になるまで10で割った余りを出してそれを足して元の数を10で割ることを繰り返すだけ、なのだけど...
  
  
　　
　　
　　
最初に作ったのがこれ

```python:16.py
a = 2**1000
print(a)
sum = 0
while a>0:
    b = a % 10
    sum += b
    a = int(a / 10)
print(sum)
```

これだと出力が

```
1189
```

となる。しかしこれは正しい答えではなくて困惑してしまった。そこで調べてみてこんなものを見つけた。
　　
　　
<https://paiza.hatenablog.com/entry/2017/08/01/Python3%E3%81%A7%E5%B7%A8%E5%A4%A7%E3%81%AA%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E8%A8%88%E7%AE%97%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%8C%E5%A4%89%E3%81%A0%E3%81%A3%E3%81%9F%E3%81%AE%E3%81%A7%E7%90%86>

これによるとfloat型だと大分計算の誤差が発生してしまうらしい。`int(a / b)`という書き方を結構使っていた(つまりfloat型で計算→int型に変換)自分としては衝撃的な記事だった。これからは`//`を使っていこうと反省。
　　
　　　　
　　
コードを以下のように書き換えた。

```python:16.py
a = 2**1000
print(a)
sum = 0
while a!=0:
    b = a % 10
    sum += b
    a = a // 10 
print(sum)
```

すると以下の通り、計算結果がだいぶ違うことが分かる。

```
1366
```

こちらは正解だったのでやはりintで通すべきだったのだろう。誤差って怖いと改めて感じた。
PureScriptの日本語版ドキュメントを作成中です

# はじめに

純粋関数型AltJSとして名高いPureScriptのドキュメントを日本語に翻訳しています。

- [原文Github（英語）](https://github.com/purescript/documentation)
- [日本語翻訳版Github（本記事のテーマ）](https://github.com/matoruru/documentation)

まだ翻訳途中です。応援してもらうとペースが上がります。

- [トップ](https://github.com/matoruru/documentation)
    - [言語リファレンス](https://github.com/matoruru/documentation/blob/master/language/README.md)
        - [型](https://github.com/matoruru/documentation/blob/master/language/Types.md)
        - [構文](https://github.com/matoruru/documentation/blob/master/language/Syntax.md)
        - [型クラス](https://github.com/matoruru/documentation/blob/master/language/Type-Classes.md)
        - [パターンマッチ](https://github.com/matoruru/documentation/blob/master/language/Pattern-Matching.md)
        - [モジュール](https://github.com/matoruru/documentation/blob/master/language/Modules.md)
        - [外部関数インタフェース(FFI)](https://github.com/matoruru/documentation/blob/master/language/FFI.md)
        - [レコード](https://github.com/matoruru/documentation/blob/master/language/Records.md)
        - [Haskellとの違い](https://github.com/matoruru/documentation/blob/master/language/Differences-from-Haskell.md)
    - [エコシステム](https://github.com/matoruru/documentation/tree/master/ecosystem)
        - [代替バックエンド](https://github.com/matoruru/documentation/blob/master/ecosystem/Alternate-backends.md)
        - [エディタとツールのサポート](https://github.com/matoruru/documentation/blob/master/ecosystem/Editor-and-tool-support.md)
        - [メンテナンスされたパッケージ](https://github.com/matoruru/documentation/blob/master/ecosystem/Maintained-Packages.md)
        - [PureScriptの会合](https://github.com/matoruru/documentation/blob/master/ecosystem/PureScript-Meetups.md)
        - [PureScriptに関する動画](https://github.com/matoruru/documentation/blob/master/ecosystem/PureScript-Presentations.md)
    - [歴史](https://github.com/matoruru/documentation/tree/master/historical)
        - 0.5以前の変更履歴
        - 0.10移行ガイド
    - [ガイド](https://github.com/matoruru/documentation/tree/master/guides)
        - 共通の演算子
        - 準標準ライブラリのガイドライン
        - 型エラーの自作
        - エラー指摘
        - 外部関数インタフェース(FFI)のコツ
        - 外部関数インタフェース(FFI)
        - 入門
        - PSCi
        - Nodeを使わないPureScript
        - ライブラリ作成ガイド
        - 部分型クラス
        - psc-ideのよくある質問

また、間違いや改善点などはたくさん指摘してほしいです。

## PureScriptとは

> PureScriptは、小さくて、JavaScriptへコンパイルされる強い型付け言語です。

私が訳したPureScriptの紹介文です。とりあえずは、魅力的な言語であるということをわかって頂ければいいと思います。

## PureScriptの特徴
**AltJSである**
これが一番大事でしょうか。

**純粋関数型言語である**
大切な特徴です。副作用を排除するように作られていて、テストとか再利用が楽です。

**強力な型付け**
コンパイラにたくさん怒られます。はじめは「なぜ怒られているのか」どころか、「何を怒られているのか」すらわからないかもしれません。しかし型によって間違いを発見してもらえるので、コンパイラは頼もしい味方です。

**Haskellと似ている**
コード片だけを見せられたら違いがわからないかもしれません。Haskellの嫌なところが改善されているらしいです。PureScriptのコンパイラはHaskellで書かれています。


## 役立つサイト
[Pursuit](https://pursuit.purescript.org/)
PureScriptのライブラリがたくさん置いてあります。古いものは動かすのが大変だったりします。

[公式サイト](http://www.purescript.org/)
PureScriptの公式サイトです。ここを見ればいろいろわかります。
Salesforce の指定ログイン情報 (Named Credential) を利用した AWS へのリクエスト

Summer '19 リリース(API バージョン 46.0)で、指定ログイン情報(Named Credential, 外部システムへの認証情報を保存する設定のこと)が[AWS の署名バージョン 4 のリクエストをサポート](https://releasenotes.docs.salesforce.com/ja-jp/summer19/release-notes/rn_security_more_auth_protocols.htm)するようになりました。指定ログイン情報を利用するとコールアウトの際に煩雑な署名計算を行う必要がなくなります。ここでは、S3 へのリクエストを例に、実際の設定方法を紹介します。

指定ログイン情報は、Salesforce の設定で [セキュリティ] - [指定ログイン情報] - [新規指定ログイン情報] から設定できます。

## 設定例
* 表示ラベルと名前には任意の名称(名前はプログラム内で使用します)を設定
* URL には``https://BUCKETNAME.s3.amazonaws.com`` を設定
* ID 種別は``指定ユーザ`` を選択
* 認証プロトコルは``AWS 署名バージョン4`` を選択
* AWS アクセスキーとAWSシークレットアクセスキーに、適切なIAMユーザのアクセスキーとシークレットキーを設定
* AWS リージョンには該当するリージョンを設定 (``ap-northeast-1`` 等)
* AWS サービス には``s3`` を設定
* 認証ヘッダーを生成のチェックをON

![aws_s3_namedcred.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184624/77788817-7def-dff6-1a9d-b416fc654d68.png)

## サンプルコード
```Java
HttpRequest req = new HttpRequest();
req.setEndpoint('callout:AWS_S3/hogedir/hogefile.txt'); //callout:の後ろは指定ログイン情報の名前とファイルパス
req.setMethod('GET');
Http http = new Http();
HttpResponse res = http.send(req);
System.debug(res); //System.HttpResponse[Status=OK, StatusCode=200]
```

## おわりに
現状、全てのサービス・リクエストに対して利用できる訳ではなさそうです(例えばヘッダに `x-amz-target` が必要な場合は直接計算が必要だと思います)が、もし利用できる場合はシンプルにリクエストが実装できることが分かります。ぜひ試してみてください。
ASP.netでレーダーチャートを表示する

急ぎASP.netでレーダーチャートを描く事になった。
sin、cosで計算して描くのかとげんなりしたのだけど、Visual Studio 2013には幸いにもChartコントロールがあったので、事なきを得た。
画面にコントロールを配置して、レーダーチャートを指定、Y軸に表題、X軸に値を指定する。

```asp.net
<asp:Chart ID="Chart1" runat="server" Height="400px" Width="400px">
  <Series>
    <asp:Series Name="Series1" ChartType="Radar" XValueMember="subject" YValueMembers="point">\</asp:Series>
  </Series>
  <ChartAreas>
    <asp:ChartArea Name="ChartArea1"></asp:ChartArea>
  </ChartAreas>
</asp:Chart>
```

ソースコードはこんな感じ

```c#:c#
dt.Columns.Add("subject", Type.GetType("System.String"));
dt.Columns.Add("point", Type.GetType("System.Int32"));
String[] titles;
titles = new String[4] { "国語", "算\n数", 
"理科", "社\n会"};
Int32[] points;
points = new Int32[4] { 5, 3, 3, 1 };
for (Int32 i = 0; i < 4; i++)
{
    DataRow row = dt.NewRow();
    row["subject"] = titles[i];
    row["point"] = points[i];
    dt.Rows.Add(row);
}
Chart1.ChartAreas[0].AxisX.IsReversed = true;
Chart1.ChartAreas[0].AxisY.Maximum = 5;		//最大値指定
Chart1.ChartAreas[0].AxisY.IsStartedFromZero = true;
Chart1.DataSource = dt;
Chart1.DataBind();
```

開発環境では発生しなかったのだけど、サーバに配置すると、TempImageFiles フォルダがないとか言われた。
チャートは画像として生成されるのだけれど、その出力先がないとの事なので、
Web.Configの
\<add key="ChartImageHandler" value="storage=file;timeout=20;dir= <b>c:\TempImageFiles\ </b> ;" />
上記dir=以下を書き込み可能なフォルダに修正して解決。
バックスラッシュ記法について (Ruby)

#バックスラッシュ記法
この記法を使うと文字列の中でただの文字ではなく改行や、タブなどができる
日本語キーボードでは「option + ￥」でバックスラッシュを打つことが出来る

###\n　改行
(例)
puts　"改行したい改行したい**\n**改行した"
=>改行したい改行したい
　改行した
###\t　タブ
(例)
puts　"タブしたいタブしたい**\t**タブした"
=>タブしたいタブしたい　　タブした



他にも
**\b　バックスペース**
などがある
【Ruby】main 関数を記述する方法

# rubyにおける main 関数の書き方

Rubyにおいて直接スクリプトファイルとして呼び出すときだけ実行される
main 関数を記述する方法について。

## 結論：__FILE__ 変数を使用すればよい。

```ruby
if __FILE__ == $0
　# main method
end
```

上記の様に記述すればモジュールとしてインポートされる時には実行されない。
直接スクリプトファイルとして呼び出すときだけ実行される main 関数の様な動作をする。
【Ruby】Rubyにおける正しいshebangの書き方

# shebangとは？
shebangとはUNIXのシェルスクリプトの業界標準で、
シェルスクリプトの一行目のコメントの、 #! がそれにあたる。
起動するインタプリタを指定することができる。  

例えばbashであれば以下の通りとなる。

```bash
#! /bin/sh
echo 'Hello world!'
```

# rubyにおけるshebangの指定  

Rubyを指定する場合には以下の様に書かれることがあるが、
Rubyが必ずしも ```/usr/bin/ruby```にあるとは限らない。

```ruby
#! /usr/bin/ruby
puts 'Hello world!'
```

この問題を避ける為には、env コマンドを使えばよい。

```ruby
#! /usr/bin/env ruby
puts 'Hello world!'
```

しかし、移植性を考えると上記でもまだ問題がある。  
FreeBSDでは、標準の ```/etc/crontab``` は以下の様になっており
```/usr/local/bin``` が含まれていない。  

```sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
```

そのため、上記のshebangのスクリプトを ```/etc/crontab``` に登録すると、
FreeBSD においては ruby は ```/usr/local/bin``` にあるのが標準であり、
インタープリタを見つけられずにエラーとなる。  

結論としては以下の様に記載するのがベストプラクティスの様である。

```ruby
#!/bin/sh
exec ruby -x "$0" "$@"
#!ruby
puts "Hello, World!"
```

但し、```#! /usr/bin/env``` は実用上極めて広範囲に動く為、
デフォルトとして無難ではある。
必要に駆られた時に、 ```exec ruby -x "$0" "$@"``` 方式にする運用で
良いのではないかと感じる。

# 参考：
Ruby 2.5.0 リファレンスマニュアル > Rubyの起動　　
<https://docs.ruby-lang.org/ja/2.5.0/doc/spec=2frubycmd.html>
Elixir 入門覚書

Elixirの勉強を個人的に始めたので覚書を残す。

# dockerでElixirを使えるようにする

以下コマンドでdocker imageをpullする

```
docker pull trenpixster/elixir
```

docker上のelixir imageを起動する

```
docker run --rm -v /Users/kei/takakuda/elixir_tutorial:/elixir_tutorial -it trenpixster/elixir /bin/bash
```

あまりdockerを使ったこともなかったのでoptionも調べる

`--rm` : コンテナ終了時に自動的にコンテナを削除する
`-v` : ホスト側のディレクトリがコンテナにマウントされ、コンテナ上で作ったファイルがホストの方に残る
`-it` : ターミナルでコンテナを実行できる

iexで対話シェルが動くことを確認。

# Elixirのプロジェクトを作成する


```elixir
mix new project
```

`mix`はビルドツール。
以下のようにフォルダ、ファイルが作成されます

```bash
.
├── README.md
├── config
│   └── config.exs
├── lib
│   └── project.ex
├── mix.exs
└── test
    ├── project_test.exs
    └── test_helper.exs
```

ここからelixirで開発していきます
プログラミング学習記録89〜華氏温度をセ氏温度に〜

##今日やったこと
- 華氏温度を入力するとセ氏温度に変換して表示してくれるプログラムを書く

大学のJavaの講義で出た課題です。

具体的にどんなコードを書いたのかは、課題なので公開できませんが、なんとなく書き留めておきます。

まず、Javaには変数を宣言するときに整数の型、実数の型など、同じ数字でも表示形式によって予約語を変えなければなりません。

今回は小数点第一位までを含めて表示する必要があったので、実数で宣言しました。
Javaでは実数を`double`で宣言します。

宣言した変数はFahとCelで、Fahには華氏温度、Celにはセ氏温度が代入されるようにしました。

最初に華氏温度を入力させるコードを書き、入力された華氏温度をセ氏温度に直したものをCelに代入します。

華氏温度をセ氏温度に変換する式は以下の通りです。

`C=(5/9)×(F-32)`

この式により、華氏温度を我々が普段使っている温度の単位(℃)で表現することができます。

そして、最後に以下のコードでCelを表示させることができれば完成です。

```Java
System.out.printf("摂氏温度（℃）%.1f\n",Cel);
```

`1f\n`で実数を小数点第一まで表示して、１行改行することできます。

いろいろJava特有のルールはありますが、考え方は基本的に同じなので、なんとかクリアすることができました。

おわり
【Linux】エイリアスの設定方法


Linuxでエイリアスを設定する方法について、
備忘録も兼ねて書いていきます。

## エイリアスってなんぞや？
> エイリアス 【alias】
> エイリアスとは、偽名、別名、通称などの意味を持つ英単語。
> 引用元： [エイリアスとは : IT用語辞典 e-Words](http://e-words.jp/w/%E3%82%A8%E3%82%A4%E3%83%AA%E3%82%A2%E3%82%B9.html)

つまり、コマンドの別名を設定します。
例えばいくつかのコマンドをまとめて別の名前に設定することが出来ます。
例えば、``ls -al `` と打っていたのを ``ll`` と打つだけで実行出来るようにする事が出来ます。

## 設定方法
以下のように、エイリアスを指定してコマンドを実行すれば一時的にエイリアスは有効になります。
しかし、これだけだとマシンをシャットダウンすると、エイリアスの情報が消えてしまいます。  

```bash
alias ll='ls -al'
```

そこで、``.bashrc``というファイルを編集していきます。

# .bashrcってなんぞや？
> （ログインした後に画面上から）bashを起動したときに読み込まれる設定ファイル
> 引用元: [.bashrcとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word13649.html)

主な用途としては以下のようなものが挙げられます。

* エイリアスを定義する  
* シェルの関数を定義する  

## 改めて設定方法

### 1. .bashrcにエイリアスを定義する

ターミナルを開いて、お好きなテキストエディタで``.bashrc``を開きます。  
例：viの場合  

```bash
vi ~/.bashrc
```

.bashrcを開いたら、エイリアスを記述します。

```bash
alias ll='ls -al'
```

### 2. .bash_profileに.bashrcを読み込ませる設定

もし``.bashrc``に書いても、設定が反映されない場合は``.bash_profile``というファイルに``.bashrc``を読み込ませてあげる設定が必要です。

## .bash_profileってなんぞや？
> ログインシェルがbashの状態でログインしたときに読み込まれる設定ファイル  
> 引用元: [.bash_profileとは｜「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典](https://wa3.i-3-i.info/word13650.html)

ターミナルを開いて、お好きなテキストエディタで``.bash_profile``を開きます。  
例：viの場合  

```bash
vi ~/.bash_profile
```

.bash_profileを開いたらファイルの一番下に以下のコマンドを記述します。

```bash
source ~/.bashrc
```

そしてこの変更自体も反映させなければいけないので、以下のどちらかを実施して下さい。

* ``source ~/.bash_profile`` の実行
* ターミナルの再起動

以上で設定は完了です。  

## エイリアスの確認方法
エイリアスが登録出来ているかを確認するには、aliasコマンドを実行するだけでOKです。
設定されているエイリアスの一覧が出力されます。

```bash
alias
```

## 参考資料
<http://blog.maplesystems.co.jp/programming/18533.html>
<http://qiita.com/yutat93/items/b5bb9c0366f21bcbea62>
【Linux】シェルスクリプトのシンタックスチェックの方法

長いスクリプトを書いていたりすると、
書き終わって実行した時にシンタックスエラーが沢山出たりして辛い思いをする事があります。  
そこで今日は、凄く簡単に出来る、
シェルスクリプトのシンタックスチェックの方法について書いていきます。

# シンタックスチェックってなんぞや？
> プログラムの構文が正しいかどうか調べることをシンタックスチェックと言います。
> 引用元: [ナレッジベース：FAQ](http://tech.4d-japan.com/FAQ/101/)

つまり、シェルスクリプトの文法のチェックが出来ます。
しかも、とても簡単に出来ます。

## その1 " -n オプションをつけて実行"
以下のように -n オプションをつけて実行すればOKです。

```bash
# bashの場合
$ bash -n hoge.sh

# shの場合
$ sh -n hoge.sh

# zshの場合
$ zsh -n hoge.sh

# dashの場合
$ dash -n hoge.sh
```

非常に簡単ですね。
※但し、変数のタイプミスなどはエラーにならないので注意が必要です。

## その2 "ShellCheck"
ShellCheckはシェルスクリプトのシンタックスチェックをしてくれるツールです。
[koalaman/shellcheck](https://github.com/koalaman/shellcheck)

### インストール方法
各ディストリビューション毎に記載しています。
▼Macも記載。

```bash
# Debianベースのディストリビューション
$ sudo apt-get install shellcheck

# EPELベースのディストリビューション
$ sudo yum -y install epel-release
$ sudo yum install ShellCheck

# OS X
$ brew install shellcheck
```

### 使い方
ターミナルを開いて、以下の様に実行すればOKです。

```bash
$ shellcheck [options] hoge.sh
```

### 主なオプション

|オプション|意味|
|---|---|
|-e [CODE1,CODE2..]| shellcheckが返すエラーコードを指定して、そのエラーや警告を無視します。カンマ区切りで複数指定可能です。|
|-f [FORMAT]|チェック結果の出力形式を指定します。指定可能な出力形式については後述します。|
|-s [target]|ターゲットをsh、bash、dash、kshから指定できます。デフォルトでは、ファイルのシバンを使用するか、ターゲットシェルを判別できない場合はbashを使用します。|
|-V|バージョン情報を出力して終了します。|

### 指定可能な出力形式

|指定フォーマット|意味|
|---|---|
|tty|デフォルトの出力形式。|
|gcc|GCC互換の出力形式。|
|checkstyle|Checkstyle互換のXML出力。|
|json|Json形式での出力。|

# 参考資料
<http://www.atmarkit.co.jp/flinux/rensai/linuxtips/780chshsyntax.html>
<https://www.mankier.com/1/shellcheck>
<https://rcmdnk.com/blog/2014/11/26/computer-bash-zsh/>
memo :Prometheus win10 インストール

##やってみる
- Prometheusダウンロード
- インストール
- 実行

## ダウンロード
Windowsファイルのインストール [Windows] 
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77147/a2b1d402-e188-4fa9-8815-c7af07a9d9e1.png" width=70%>



### .gzの解凍
//これわかんないのハズカシイ(/ω＼)
http://www.kyoshin.bosai.go.jp/kyoshin/man/targzip.html

ちなみに私は7zipに
https://sevenzip.osdn.jp/
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77147/135c19c7-d18a-ddb9-ed7f-47410f4429de.png" width=30%>
closeにて完了。
使い方：右クリックで展開する～

### .tarの解凍
これも7zipで。

## 起動
「prometheus.exe」
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77147/8ee6b6ee-642b-877b-8620-4a73c75e8063.png" width=80%>


動いた？

## 確認
下記をブラウザにて入力
http://localhost:9090/
or
http://[IPアドレス]:9090/
　→　IPアドレスはネットワークプロパティ確認（省略）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/77147/8c633e25-0489-4dca-2f9c-15e12c21b955.png" width=90%>

！！！
なんかできたきがする。

Thank U Next　
☺yucco
Twitter APIをPostmanで叩く方法

Twitter APIをPostmanで気軽に叩くための設定方法です。

1. Authorizationタブを選択
2. TypeをOAuth 1.0を選択
3. Twitter APIキーを入力
4. Add authorization data toにRequest Headersを選択

以上です。
後は実行したいエンドポイントを入れて叩くだけです😎

<img width="910" alt="スクリーンショット 2019-05-16 21.13.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226008/38dfefb4-1c14-e060-a824-bba794e2f214.png">
とあるSaaSをSSOしたら、便利になったけどセキュアじゃなかった

とあるSaaSを、AzureADでSSOする構成にしてみた。・・・が、要件と仕様のはざまで困るケースもある、というお話。

#背景

SSOは、目的が2つある。

１つは、ユーザーの利便性を上げること。
システムごとにアカウントとパスワード覚えるなんて大変なので、同じアカウントとパスワードでログインできるようになったら覚えるものが減ってうれしい。
システムごとにログインするのは面倒なので、あるシステムでログインしてたら別のシステムでもログインしているようになったら、手間が減ってうれしい。

もう1つは、セキュリティを上げること。
複数のシステムがSSOで連携してたら、アクセス元の制御やアクセス条件を、強制できる。
複数のシステムがSSOで連携してたら、あるアカウント無効化すれば、対象のシステム全部ブロックできる。

もちろん費用が掛かるケースもあるけど、安全を保ちやすくなる。
というわけで、SaaS導入するときはSSOしよう！ということであるSaaSのSSO連携設定も終わったよ！という状態だったのだが、問題発生。

#困った

そのSaaSは、SSO「も」できる、だった。せっかくAzureADでのSSO構成も作成したのだけど、SNSとのSSOや、単純にアカウントとパスワードでのログインもできてしまう。特定の認証プロバイダーのSSOだけに制限する機能がないらしい。

さっきのメリットの、前者は満たせるが、後者が満たせない。

これはサービス側が悪いと言うつもりは毛頭なく、そのサービスに対して、潜在的なユーザーがそういったことを求められているか否か、そのニーズに対して実装することが費用対効果的にメリットがある否かという経営判断なのだと思う。正直そんなん実装しようと思ったらお金かかるし。


ある程度の規模、例えば[Salesforce](https://qiita.com/hisssa0102/items/0d7f55e97faf850d387b)ぐらいの規模だったら、認証プロバイダーを1つにすることも、複数にすることも設定可能なオプションを用意している。それは、そういったニーズがあるからに他ならない。

#まとめ

気になるSaaSはいっぱいあるし、ユーザーが使いたい！と言ってくるSaaSは便利だから入れたい、と言ってくる。SSOに対応してます、と言われても特定の認証プロバイダーだけに制限する機能があるかはとっても重要。今後は必ずここ確認すると誓った。

ある程度セキュリティを気にするような規模の会社にアプローチするには、上記の機能を実装するか、それが難しいようならせめて特定のIPだけにアクセス制限する機能は実装したほうが、セキュリティを気にする会社への間口は広がると思いますが、いかがでしょう？
演算子について (Ruby)

#演算子
計算処理をする際に使用する数式記号

#### +
使用用途：足し算
(例)　　1000　　+　　1000　　=>　　2000
#### -
使用用途：引き算 
(例)　　2000　　-　　1000　　=>　　1000
#### *
使用用途：掛け算
(例)　　5　　*　　8　　=>　　40
#### /
使用用途：割り算
(例)　　100　　/　　2　　=>　　50
#### %
使用用途：剰余（余りを求める）
(例)　　5　　%　　2　　=>　　1
##### **
使用用途：べき乗
(例)　　5　　**　　2　　=>　　25
#比較演算子(<,>,==)
値を比較する際に使用する
式が真であればtrue,偽であればfalseを返す

(例)
1　　**<**　　7　　=>　　true

1　　**>**　　7　　=>　　false

7　　-　　1　　**>=**　　8　　=>　　false

6　　/　　2　　**==**　　12　　/　　4　　=>　　true    
#not演算子(!)
否定の意味で使う
式が偽であればtrue,真であればfalseを返す

(例)
3　　+　　5　　**!=**　　20　　=>　　true
firebase functions post curl叩き方

#curl叩き方

```:bash
$ curl -X POST -H "Content-Type:application/json" https://us-central1-project-id.cloudfunctions.net/app/createToken/ -d '{"user_id":"something"}'
```

#コード

```
import * as functions from 'firebase-functions';
import * as Express from 'express';

const app = Express();

app.get('/createToken', async(req: Express.Request, res: Express.Response) => {
    const user_id = req.body.user_id;
    res.send(user_id);

})

exports.app = functions.https.onRequest(app);
```
「Pythonista3」Django2.0をインストールする方法

#Pythonista3にDjango2.0をインストールする方法
iOS用のアプリであるPythonista3にはStaShというツールを使用してDjango2.0をインストールできます。

※現時点ではDjango2.0以降では原因不明のエラーが出るらしく、2.0のインストールしか確認していませんが、2.0以降のインストールができるようになればまた追記いたします。

##Django2.0のインストール
- 参考サイト -
（https://blog.peddals.com/install-django-2-0-in-pythonista-3/）

##StaShの導入はこちらをご参考ください。
- 参考サイト -
（https://qiita.com/maboy/items/cef5dee13d5b2e9ac843）


####1.まず初めにStaShを起動し、以下のコマンドを実行します。
```
$ pip install Django==2.0
```

実行完了後に、Pythonista3 を終了し、再度開きます。
<b>※Pythonista3ではファイルなどを更新した際にはほとんどの場合アプリの再起動が必要になります。
期待通りの動きにならない時はアプリタスクを終了し、再起動を試してください。<b>


####2.Djangoのインストールが完了したら、Pythonista3のメニュー画面（右へスワイプ）を開いてPython Modules内のフォルダにDjangoがインストールされているかを確認する。
site-packages...という名前でインストールされていると思います。


####3.StaShで以下のコマンドを実行し、Djangoのプロジェクトを作成します。
プロジェクト名は任意、今回はprojectという名前で作成します。

```
  $ django-admin.py startproject プロジェクト名
```

実行完了後に、Pythonista3 を終了し、再度開きます。


####4./project/manage.py を開き通常のコンソール（左ヘスワイプ）で以下のコマンドを実行します。

```
  $ import sys
  $ sys.path
```

####5.表示結果から、以下のような行を見つけ、Docmentまでのアドレスをコピーします。
 「…」の部分は、iOS端末固有の情報です。

```
/private/var/mobile/Containers/Shared/AppGroup/………/Pythonista3/Documents/
```
####6.manage.py の編集画面に戻り“import sys” の下に以下を追加します。
「ここに貼り付け」の部分を、上記でコピーした内容に置き換えます。
また、Docment/の後に、3.で作成したプロジェクト名を追記します。

```
sys.path.append=(“ここに貼り付け”)
```

貼り付け後、下記のようになります。

```
  sys.path.append("/private/var/mobile/Containers/Shared/AppGroup/「固有情報」/Pythonista3/Documents/「プロジェクト名」/")
```

完了後に、Pythonista3 を終了し、再度開きます。

####7./project/manage.py を開き、右上の実行ボタン (右三角のボタン) を長押しする。
開いた画面の argument 下記コマンドを入力します。


```
runserver --noreload
```

ハイフン 2つをうまく入力できない場合は、ハイフンとの間にスペースを入れて入力しスペースを消すと上手くいくと思います。

入力したらRunを押して実行すると、以下のような内容が Console に表示されます:

```
Performing system checks...

System check identified no issues (0 silenced).

  You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
  Run 'python manage.py migrate' to apply them.
  November 03, 2017 - 20:46:35
  Django version 1.11.6, using settings 'mysite.settings'
  Starting development server at http://127.0.0.1:8000/
  Quit the server with CONTROL-C.
```

以上と同じ内容が表示されたら、http://127.0.0.1:8000/ のアドレスをクリックするか、ウェブブラウザに入力して開きます。
“It Worked!” ページが表示されたら Django のインストールと初期設定は完了です。

あとはDjango のチュートリアルなどを参考に、ご自身のプロジェクトやアプリケーションを作りましょう。


##【初心者におすすめの学習サイト】

・[Django公式チュートリアル（無料）](https://docs.djangoproject.com/ja/2.2/intro/tutorial01/)

・[paizaラーニング(一部無料)](https://paiza.jp/works)

＜Qiita @okoppe8さん＞
・[Djangoチュートリアル - 汎用業務Webアプリを最速で作る（無料）
](https://qiita.com/okoppe8/items/54eb105c9c94c0960f14)

＜note @sinyさん＞
・[Django WEBアプリ開発コース（有料）
](https://note.mu/shinya_hd/m/m7c72d8925919)
devise実装の流れ：メモ

#deviseの実装
```ruby:Gemfile
gem'devise'
```
test環境とかに分けて記述や、全体に適応させるように記述について調べる.

```ruby:ターミナル
bundle install
```
```ruby:ターミナル
rails g devise:install
```
devise設定ファイル作成

```ruby:ターミナル
rails g devise user
```
devise用のuserマイグレファイル等作成
####userマイグレファイルに必要カラム等を編集。

```ruby:ターミナル
bundle exec rails db:migrate
```
テーブル作成

```ruby:ターミナル
rails g devise:view
```
devise用のビューファイル作成
最小二乗法による線形回帰をSwiftでおさらい

最近数学を勉強し直したほうがいいかなみたいな話を聞くので私もおさらいがてらとりあえず線形回帰（単回帰）をswiftで実装してみたのでメモしておきます。

### 線形回帰とは
> 統計学において、Y が連続値の時にデータに Y = f(X) というモデル(「定量的な関係の構造[1]」)を当てはめる事。

> 回帰で使われる、最も基本的なモデルは Y = AX + B という形式の線形回帰である。
 [回帰分析 - Wikipedia](https://ja.wikipedia.org/wiki/%E5%9B%9E%E5%B8%B0%E5%88%86%E6%9E%90)

たとえば住宅を売るときに、その住宅の敷地面積がどれくらい広ければいくらくらいになるのか推測したりするのに使えます。

いくつかのサンプルデータ（適当です）があるとして、それを表にプロットします。
なんとなく敷地面積が大きければ価格が高くなるような相関が伺えます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14751/55ee18e5-8263-4e0d-2255-4a2947c50d63.png" width=500>

この敷地面積と価格の関係を表すのに y = ax + b という式を利用すると以下のようになります。

```math
価格 = a \times 敷地面積 + b
```

このデータセットから上の式の a と b を求めるのに最小二乗法というのを使用します。

### 最小二乗法とは
> 測定で得られた数値の組を、適当なモデルから想定される1次関数、 対数曲線など特定の関数を用いて近似するときに、想定する関数が測定値に対してよい近似となるように、 残差の二乗和を最小とするような係数を決定する方法、あるいはそのような方法によって近似を行うことである。
[最小二乗法 - Wikipedia](https://ja.wikipedia.org/wiki/%E6%9C%80%E5%B0%8F%E4%BA%8C%E4%B9%97%E6%B3%95)


先程の表に y = ax + b の線を引いてみます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14751/b4280df9-31ad-be65-f38a-5f351d83376d.png" width=500>

最小二乗法の定義は上に書いてあるとおりですが、図で示すと赤い線（推測された値と実データ間の差）が最小になるような式を求めることになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14751/9c96771a-0fe4-3986-f494-f4e1b5f8ba78.png" width=500>


### 計算式
先程の y = ax + b で a は回帰係数、b は切片となります。
それぞれを求める式は

```math
回帰係数 = \frac{xとyの共分散}{xの分散}\\
切片 = yの平均 - 回帰係数 \times xの平均
```

共分散と分散って何だっけ…ってなってしまったのでこれもおさらいしておきます。

#### 分散
データの散らばりの度合いを表す数値で「偏差（それぞれの数値と平均値の差）の二乗の平均」で求められます。

```math
\frac{1}{n}\sum_{i=1}^{n} (x_i - \bar{x})^2
```
	
#### 共分散
二組の対応するデータの間の関係を表す数値で「xの偏差 × yの偏差 の平均」で求められます。

```math
\frac{1}{n}\sum_{i=1}^{n} (x_i - \bar{x})(y_i - \bar{y})
```

これがわかればあとは実装するだけです。

### 実装してみる
実際のデータを取り込んでとかはめんどくさいので、画面をタップするとプロットされて、それらをデータセットとして最小二乗法により回帰係数と切片を求めて線を描画します。
※ Viewの座標は左上が原点なので左下が原点になるようにy座標は反転します。

それぞれの値の求め方は以下のようになります。
タップされた座標は samples に保持しておくことにします。

```
var samples: [CGPoint] = []

@IBAction func handleTap(_ tap: UITapGestureRecognizer) {
    let location = tap.location(in: view)
    samples.append(CGPoint(x: location.x, y: view.frame.height - location.y))
}
```


```
let x = samples.map{$0.x}
let y = samples.map{$0.y}
let m = samples.count

// 平均
let plus = { (a: CGFloat, b: CGFloat) -> CGFloat in a + b }
let aveX = x.reduce(0, plus)/CGFloat(m)
let aveY = y.reduce(0, plus)/CGFloat(m)

// XとYの共分散
let sXY = zip(x.map{$0-aveX}, y.map{$0-aveY}).map(*).reduce(0, plus)/CGFloat(m)

// Xの分散
let sX = x.map{pow($0-aveX, 2)}.reduce(0, plus)/CGFloat(m)

// 回帰係数
let a = sXY/sX

// 切片
let b = aveY-a*aveX
```

以上。
あとは、これらの値を使ってViewに描画すれば完成。

![capture.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14751/c7d11b83-dde1-da9e-c041-6150546ab763.gif)


### まとめ
昔やったことがあるはずなのですが、結構忘れているものですね…
最小二乗法の計算方法を理解するところが主で、swiftで書いてみる部分に関してはおまけな感じになってしまいましたが、実際に自分で書いてみたことで公式が何をしているのか理解しやすかったです。

どうでも良い話ですが、大学時代に統計学が必須であったのですが、数学選択は難しいクラスで、数学選択以外の人は簡単なクラスにわけられるんですね。
私は数学選択だったのですが、簡単な方のクラスで「サイコロを100回振って実際に1/6の確率になるか試す」みたいな課題が出されていると聞いてそんな簡単な課題があるのかと衝撃を受けたのを思い出しました。
多重継承のアップキャスト問題(C++)(未解決)

手当たり次第にググっても希望の結果を見つけられなかったので、まずはメモとして残します。

# 多重継承するとアップキャストするときに途中の経路へキャストしなければならない

``` c++
class I1  {};
class C1 : public I1  {};
class C2 : public I1  {};
class C12 : public C1, public C2  {};

int main()
{
	I1* ar[3];
	ar[0] = new C1;
	ar[1] = new C2;
	//ar[2] = new C12;	あいまいですエラー

	C12 c12;
	ar[2] = static_cast<C1*>(&c12);
}
```
これだとクラスを使う側がキャスト経路を意識する必要があります。
operator で解決しようと考えてもポインタとしてのキャストができません。

``` c++
class C12 : public C1, public C2  {
public:
	operator I1*() { return static_cast<C1*>(this); }
};

int main()
{
	...

	C12 c12;
	ar[2] = c12;
	ar[2] = *( new C12 );
	ar[2] = C12();
}
```
ポインタに実体を代入するというようなソースになるので気持ち悪いです。
キャストの経路をクラス提供側で解決する術は無いのでしょうか。
一般的には次の方法で解決します。

``` c++
class I1  {};
class C1 : public virtual I1  {};
class C2 : public virtual I1  {};
class C12 : public C1, public C2  {};

int main()
{
	I1* ar[3];
	ar[0] = new C1;
	ar[1] = new C2;
	ar[2] = new C12;	// OK!
}
```

しかしこれは本質的な解決と言えない気がします。
キャストの経路を明示したのではなく経路をすっ飛ばすやり方です。
またI1の実体が2個から1個になるためC1,C2の実装に影響する恐れがあります。
【PHP】(ふつうの)配列操作 まとめ

## 定義
### 空
```php
$normal_array = [];
```

### 中身あり
```php
//方法1　かんたん php5.4から使える
$normal_array = ['AAA', 'BBB'];

//方法2  array関数　昔ながらの方法？
$normal_array = array('AAA','BBB');
```


## 要素の追加
### 一つずつ
```php
$normal_array[] = 'AAA';
```

※左辺で[]をつけておくこと。

### 複数
```php
array_push($normal_array,'CCC','DDD');
```

複数だと上記の方法は使えない。array_pushという関数で頑張る。


## 要素の上書き（＝再定義
```php
$normal_array[0] = 'CCC';
```

## 要素の取り出し
```php
$item = $normal_array[0];
echo $item;
```

インデックス番号で指定。そのままechoしても良し。


## メモ
ふつうの配列、とか言いつつ、PHPの配列はキーがあるのが基本らしい。
正式名称は「数値添字配列」。
キーを省略してるだけなので、部分的にキーをつけることも可能だとか。

https://www.php.net/manual/ja/language.types.array.php
お手軽にカレントディレクトリをhostするlocal httpsサーバーを立てる[caddy]

caddy https://caddyserver.com/

ヤバイ。すごい。

```
brew install caddy

cat << EOF > Caddyfile
localhost {
  tls self_signed
}
EOF
caddy
```

たった httpsサーバーがたった
変数、定数について (Ruby)


#変数とは...
任意の名前で作られた、オブジェクトを格納することができるもの。
また、定義しなおせば何度でも格納したオブジェクトを更新することができる。

###命名規則
・頭文字は小文字にする
・頭文字以外には大文字も使える
・スペースを入れてはいけない
・予約語（Rubyに初めから与えられた単語）

(例)
text (変数） =  "今日も勉強頑張った" (オブジェクト)
puts text
  =>今日も勉強頑張った

text = "明日も勉強頑張るぞ"
puts text
  =>明日も頑張るぞ


#定数とは...
任意の名前で作られた、オブジェクトを格納することができるもの。
しかし、変数とは異なり、はじめに定義したオブジェクトを変更することはできない。

###命名規則
・頭文字は必ず大文字にする
・スペースを入れてはいけない
・予約語（Rubyに初めから与えられた単語）

(例)
text (定数) = "今日も勉強頑張った"
puts = text
  =>今日も勉強頑張った
VSCodeプラグインsftpを使って踏み台サーバを超えて同期をする

# はじめに
VSCodeには、便利なプラグインがたくさんあります。
その中の一つに、"sftp"というプラグインがあって、これを利用することによって、ローカルで作業した内容をVSCode内でかんたんにリモート（サーバー上）にアップロードすることができる、というものです。

この記事の対象者は、タイトル通りですが、踏み台サーバーを超えてリモートのファイルを"VSCode"で編集したいという人
つまり
####Local - Server1 - Server2　(Server2へLocalから直接アクセスすることはできない）
という状態において、Server1を意識することなく、Server2と同期を取って編集したい、という人が対象になっています。

# 環境
Local : Ubuntu 18.04 LTS
Server1 : redhat:enterprise_linux:7.4
Server2 : SUSE Linux Enterprise Server 12 SP2
　　　　 　Ubuntu 18.04.2 LTS(WSL環境）

# json設定
SFTPプラグインのインストール方法等は、別のわかりやすい記事がたくさんあるので、割愛させていただきます。(私はこの記事を参考にさせていただきました）
Visual Studio Codeでリモート開発環境と完全同期する:[Qiita](https://qiita.com/mimizq/items/2bfe2ab147544591e0bc)

踏み台サーバーを超える場合の記述方法はsftpプラグインの解説ページにありました。:[SFTP](https://marketplace.visualstudio.com/items?itemName=liximomo.sftp)
これは、一つの踏み台サーバを超える場合で、複数の踏み台サーバを超えたい場合は、URL先に乗っているので確認してみてください。

> ```json:sftp.json
>local -> hop -> target
>
>{
>  "name": "target",
>  "remotePath": "/path/in/target",
>  
>  // hop
>  "host": "hopHost",
>  "username": "hopUsername",
>  "privateKeyPath": "/Users/localUser/.ssh/id_rsa", // The key file is assumed on the local.
>
> "hop": { // target 
>   "host": "targetHost",
>   "username": "targetUsername",
>   "privateKeyPath": "/Users/hopUser/.ssh/id_rsa", // The key file is assumed on the hop. 
>  } 
>}
```

この設定で動作した方は、公式が出している方法なのでそのまま利用する形で良いと思います。(なお、コメントアウトされている場所はjsonではエラーになってしまうので、実際に使う場合は消しておきましょう。ターゲットのキーは、Localではなくhop(踏み台サーバ)において置く必要があります。)

## この設定のままでは私の環境では動かなかった。
この設定のままでは、私の環境ではちゃんと踏み台サーバを超えてくれませんでした。(次のようなエラーが出ました）

```
[05-16 19:48:41] [info] hopping from Server1 to Server2
[05-16 19:49:48] [info] config at (working Directory) {jsonの設定の内容}
[05-16 19:49:48] [error] Error: No response from server
	at Socket.<anonymous> (/*/node_modules/ssh2/lib/client.js:319:15)
	at Socket.emit (events.js:182:13)
	at TCP.Socket._destroy._handle.close [as _onclose] (net.js:596:12) 
```

一行目のinfoを見る限り、踏み台サーバまではたどり着いているようなので、そこからServer2に行くことに失敗しているみたい。
そこで、いくつかの設定を追加してみました。

```json:sftp.json
{
  "name": "Server2 via Server1",
  "remotePath": "/home/remotePath",
  "host": "Server1 IP Address",
  "username": "Server1 username",
  "uploadOnSave": true,
  "hop": {
    "host": "Server2 IP Address",
    "username": "Server2 username",
    "privateKeyPath": "/Server1/.ssh/key",
    "passphrase":true,
    "port":22
    }
}
```

主な変更点は、"hop"の"port"と、"passphrase"の項目追加でした。
SFTPのデフォルトのポートは22で、指定しない場合22になるらしいのですが、どうやら踏み台サーバの場合では私の環境では超えてくれませんでした。また、"passphrase"も認証するときに必要になるみたいです。

この変更で踏み台サーバを超えて編集することが私の環境でもできるようになりました。
解決するまでに少しはまってしまったので、もし誰かの役に立てば幸いです。
Alibaba Cloudのイントラネット

## Alibabaクラウドのネットワーク

はじめにAlibabaクラウドには、pubulicとイントラネット、プライベートというのがある。
publicは、その名の通り全世界に対してオープンなネットワーク、プライベートはその名の通り、ローカルな環境。

そして最後にイントラネット。ここがすごくハマった。APIGatewayとRedisやRDSなどのイントラネットでは違いがあった。(2019年5月21日現在)

通常イントラネットというとインターネットに出たりもするが、そこは閉域網になっており、例えばA支店とB支店、本社をイントラネットで結ぶとなると、あくまで外部からは閲覧できないクローズドな環境を意味する。

ところが、APIGatewayでのイントラネットは他のアカウントから参照できてしまう。

##APIGatewayのイントラネットについて

APIGatewayで下記のように「インターネットアクセスを防ぐ」というところにチェックを入れると世界中からAPIGatewayにアクセスにアクセスはできないが、Alibabaクラウドを使用しているユーザからはアクセスができてしまう。(実際に別のAlibabaアカウントから試したところレスポンスが返ってきた)

<img width="1004" alt="スクリーンショット 2019-05-16 20.41.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79473/262e5619-5200-efa9-d456-aca21819b7cb.png">

では「IPアクセス制御」で制限できるかと思いきや、こちらはあくまでグローバルからの制限のためローカルIPは指定しても無駄となる。

素直に、外部に出して「IPアクセス制御」と「APIKey」や「署名鍵」などで制御する方法がまだセキュリティが確保されている気がする。

## Redisでの制限
Redisはホワイトリスト形式で接続を制限できる。例えばローカルセグメントの `192.168.0.0/24` から接続を許可したい場合は、イントラネットアドレスに対して、素直にローカルセグメントのIPのレンジを入力すれば良い。

## まとめ
APIGatewayのイントラネットは他のAlibabaアカウントから接続が可能
Redisなどのイントラネットはアカウントに紐づけされており他のAlibabaユーザからのアクセスはできない。
Golangでパスワードをハッシュ化したいんじゃあー

#パスワードをハッシュ化したい。
タイトル通りどうしても私はハッシュ化をしたい・・・

###Code###

~~~Go
package db

import (
	"golang.org/x/crypto/bcrypt"
)

func UserPassHash(pass string)(string,error){
	hash, err := bcrypt.GenerateFromPassword([]byte(pass), bcrypt.DefaultCost)
    if err != nil {
        return "", err　　//特に意味はなし
    }
    return string(hash), err
}

func UserPassMach(hash,pw string)bool{
		return bcrypt.CompareHashAndPassword([]byte(hash), []byte(pw)) == nil
}
~~~
##解説
#####`UserPassHash(pass string)(string,error)`
stringでは読み取ってくれないのでパスワードを**byteスライス**に変えます
そんでもって`bcrypt.GenerateFromPassword([]byte,const int)`にぶち込む
引数の2個目の`bcrypt.DefaultCost`の他にMinCost,MaxCostがあり全て定数です。
ちなみに　MinCost=4,DefaultCost=10,MaxCost=31となっている。たぶん・・・

#####UserPassMach(hash,pw string)bool
こちらはログインする際に**パスワード**と**ハッシュ**が合致しているか確認する関数
`bcrypt.CompareHashAndPassword([]byte,[]byte)error`
戻り値が**error**なのでnilと比較しその後　true or false で返却する

###参考文献
[Password Hash & Salt Using Golang](https://medium.com/@jcox250/password-hash-salt-using-golang-b041dc94cb72)

###最後に
うん、難しかった
変なところあったら教えてください。
pthreadの使い方

### はじめに
pthreadの使い方

### ソース

pthread_create()でスレッドを作る

スレッドの処理の終了を待ちたいときはpthread_join()
待たないときはpthread_detach()
どちらか必ず呼ぶ

```c:main.c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *thread_func(void *param);

int main(void) {

	pthread_t thread;
	int ret = 0;

	// スレッドの作成
	// int pthread_create(pthread_t * thread, pthread_attr_t * attr,
	//                    void * (*start_routine)(void *), void * arg)
	// 第4引数に渡した値が、スレッド関数の引数に渡される
	ret = pthread_create(&thread, NULL, thread_func, NULL);
	if (ret != 0) {
		// pthread_createが失敗した場合は0以外の値を返す
		exit(1);
	}

	// スレッドの終了を待機
	// int pthread_join(pthread_t th, void **thread_return)
	ret = pthread_join(thread, NULL);
	if (ret != 0) {
		// pthread_joinが失敗した場合は0以外の値を返す
		exit(1);
	}

	/*
	// スレッドの終了を待たない
	// int pthread_detach(pthread_t th)
	ret = pthread_detach(thread);
	if (ret != 0) {
		// pthread_detachが失敗した場合は0以外の値を返す
		exit(1);
	}
	*/

	return EXIT_SUCCESS;
}

void *thread_func(void *param)
{
	// 非同期に実行する処理
}
```
AWS APIGateWayのペイロードサイズは最大10MB(S3へのファイルアップロードは別の方法で)

#きっかけ
APIGateWayでS3へのファイルアップロードを行う、LambdafunctionのRestAPIを作成していた

#問題発生
動作確認、調査をしようとしていたところ
APIGateWayのペイロードサイズは最大10MBである事が判明
https://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/limits.html

#回避策
下記のページにて回避策を発見
https://sookocheff.com/post/api/uploading-large-payloads-through-api-gateway/

AWS-SDKを使用すればS3への一時的なアップロードURLを生成できるので
それを使用してアップロードを行う。

#具体的な対応
下記の動作仕様を下記の様にする
1. アップロードするファイルを格納する（クライアント）
2. アップロードボタンをクリックする（クライアント）
3. Rest-APIにてS3への一時的なアップロードURLを生成する（サーバサイド）
4. S3への一時的なアップロードURLを受け取る（クライアント）
5. 生成されたURLでファイルをアップロードする（クライアント）
RISCV で動く軽量な Linux

Linux が動く RISCV プロセッサを自作してみたいと思っており、それにあたって RISCV で動く軽量な Linux について調べていた。
結論からいうと SiFive の Freedom-U-SDK (https://github.com/sifive/freedom-u-sdk) に入っているものが使えそうなのだが、少しハマるポイントもあったのでメモ。

# 注意点

* スムーズにビルド可能なリビジョンは限られる
* リポジトリのサイズが大きく、筆者の環境ではビルドに 30 分ほどかかる
* 環境変数 RISCV が定義されているとビルドに失敗する (Readme.md に書いてあるが、よくハマる)

# チェックアウト・ビルド手順

筆者の環境では、hifiveu-2.0-alpha タグはすんなりビルドできた。当時の master はビルドに失敗した。

```
unset RISCV
git clone git@github.com:sifive/freedom-u-sdk.git -b hifiveu-2.0-alpha
cd freedom-u-sdk
git submodule update --init --recursive
make qemu
```

# root のパスワード

上記の tag において、root のパスワードは "sifive" (https://groups.google.com/a/groups.riscv.org/forum/#!topic/sw-dev/HCINLe18mzs)
AlibabaでFunction Computeを動かしてみる

# Function Computeとは
Alibabaの「Function Compute」とは、サーバレスでコードを実行できる機能です。AWSでいうLambdaが該当します。ここでは、実際にPythonを使用してECS(AWSで言うところのEC2)をシャットダウン、スタートさせてみます。
AWSだとマニュアルが充実しているため、難なくできますが、Alibabaはそのあたりまだまだ発展途上のためgithubでソースを見たりして解読する必要があります。しかし、こちらの手順を覚えてしまえば見るポイントは絞られます。


# Python3系でセットアップする
まずは、サービスを作成します。このサービスの中に関数を作成するイメージです。今回はECSのサービスを作成して、その中に関数(Function)をいくつか作成します。


# 最初にコードから
最初に最終系であるコードを記載します。

```
# -*- coding: utf-8 -*-
import os
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkecs.request.v20140526 import StopInstanceRequest
from aliyunsdkecs.request.v20140526 import StartInstanceRequest


ACCESSKEYID = os.environ["ACCESSKEYID"]
ACCESSKEYSECRET = os.environ["ACCESSKEYSECRET"]
REGIONID = "ap-northeast-1" 
STOP_INSTANCEID = "i-6we733XXXXXXXXXXXXXXX"
START_INSTANCEID = "i-6wejYYYYYYYYYYYYYYY"

def handler(event, context):
  client = AcsClient(ACCESSKEYID, ACCESSKEYSECRET, REGIONID)
  
  # Stop Instance (インスタンスをストップする
  stop_request = StopInstanceRequest.StopInstanceRequest()
  stop_request.set_InstanceId(STOP_INSTANCEID)
  stop_request.set_ForceStop("true")
  client.do_action_with_exception(stop_request)
  
  
  # Start Instance (インスタンスを起動する)
  start_request = StartInstanceRequest.StartInstanceRequest()
  start_request.set_InstanceId(START_INSTANCEID)
  client.do_action_with_exception(start_request)
  
  return
  
```
##ライブラリはどれ?
まず、最初に当たったのがこの問題でした。マニュアルを見るとなんとな～くわかりますが、自分は理解ができなかった。
ということで [alibaba python sdk](https://github.com/aliyun/aliyun-openapi-python-sdk)を見ました。
その中から [aliyan-python-sdk-ecs]→[aliyansdkecs]→[request]→[v20140526]とたどっていったところそこに何やらECSに関するものが発見!!
そこには「StartInstanceRequest.py」と「StopInstanceRequest.py」が有りました。

以下のようにクラス化されています。

```
class StartInstanceRequest(RpcRequest):
```
ということで、マニュアルと見比べて以下のように記載。

```
from aliyunsdkcore.client import AcsClient
from aliyunsdkecs.request.v20140526 import StopInstanceRequest
from aliyunsdkecs.request.v20140526 import StartInstanceRequest
```

次に下記の部分

https://github.com/aliyun/aliyun-openapi-python-sdk/tree/master/aliyun-python-sdk-ecs/aliyunsdkecs/request/v20140526

ここの配下に[StopInstanceRequest.py]なるものがあり、インスタンスを停止するものだと名前でわかった。通常、インスタンを停止するには当然、停止するインスタンスを何かしら指定しなければならない。
この中でいうと下記が該当する。

```
def set_InstanceId(self,InstanceId):
  self.add_query_param('InstanceId',InstanceId)
```
これを使えばいいので下記のようにセットして実行してみた。
なお、 `client.do_action_with_exception` の部分は `do_action` でも実行できるが
こちらのほうが、良い。

```
# Stop Instance (インスタンスをストップする)
  stop_request = StopInstanceRequest.StopInstanceRequest()
  stop_request.set_InstanceId(STOP_INSTANCEID)
  client.do_action_with_exception(stop_request)
```

以上で、スクリプト完成。
password_hashのデフォルトのストレッチング回数が10回だと思っている人が見る記事

タイトル通り。
ストレッチングってなんぞやという人はまずはそちらを調べた後、再訪していただければと。

## さっそく本題

PHPのpassword_hash関数の第3引数には配列形式でoptionを指定することができます。

optionの中にcostというパラメータがあります。
password_hashのドキュメント[^1]を読むと以下のようにあります。

```
利用するアルゴリズムのコストを表します。
省略した場合のデフォルトは 10 です。
この値でもかまいませんが、 ハードウェアの性能が許すならもう少し高くすることもできます。
```

デフォルトが10だからといって、反復処理（ストレッチング）の回数が10回というわけではありません。

ただ、password_hash関数のドキュメント内にはこの10の値が具体的に何の値かは書いていません。
password_hash関数はcrypt関数のラッパー関数であり、コストの詳細についてはcrypt関数のドキュメント[^2]を参照せよとありました。

コストについての記述を確認すると、以下のようにあります。

```
2 桁のコストパラメータは反復回数の 2 を底とする対数で、 これは Blowfish ベースのハッシュアルゴリズムで使います。
```

なんのこっちゃとなった方（特に文系出身エンジニア）のために簡単に説明すると以下の計算式で反復回数は計算されます。

```
2の（コストパラメータ）乗 = 反復回数
```

つまり、コストが10のときは、2の10乗で1024回実施されるというわけですね。

## おまけ
NISTのガイドライン[^3]では、ストレッチングは最低でも10,000回するべき(SHOULD)とあります。
なので、それを満たそうと思うとコストの値は14(16384回)以上に指定するべきですね。
もちろんサーバー負荷なども考慮する必要があるので、必ずしも10,000回以上にする必要はありませんが。


[^1]: https://www.php.net/manual/ja/function.password-hash.php
[^2]: https://www.php.net/manual/ja/function.crypt.php
[^3]: https://pages.nist.gov/800-63-3/sp800-63b.html
ユビキタス言語を作るために、方向を決める

『[今日からはじめる情報設計　センスメイキングするための7ステップ](https://www.amazon.co.jp/%E4%BB%8A%E6%97%A5%E3%81%8B%E3%82%89%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E6%83%85%E5%A0%B1%E8%A8%AD%E8%A8%88-%E3%82%BB%E3%83%B3%E3%82%B9%E3%83%A1%E3%82%A4%E3%82%AD%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AE7%E3%82%B9%E3%83%86%E3%83%83%E3%83%97-%E3%82%A2%E3%83%93%E3%83%BC%E3%83%BB%E3%82%B3%E3%83%90%E3%83%BC%E3%83%88/dp/4802510012/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=&sr=)』を参考にした考察です。

参考：
　第四章：方向を決める

# まとめ

- 言語的不安定度を減らしてみよう
- 「使わない言葉」をリスト化して、ステークホルダー同士の混乱を防ごう
- 名詞と動詞を使って、要件を表現してみよう

# 言語的不安定度を減らしてみよう
エンジニアと営業、経営者、顧客とでは言葉の意味するところが違う。
混乱を避けるために、用語をできるだけシンプルにしてみよう。

「デフォルト」という言葉は、エンジニアにとっては「初期値」のことだが、金融関係者にとっては「債務不履行」のことだ。
もっとシンプルに、「初期設定では～」と言ったほうが良いかもしれない。

そもそも、専門用語を使いたいときというのは、分かっている人同士のコミュニケーションコストを下げる目的と、より深いコミュニケーションをしたいときに使う目的があるように思う。

だったら、「認識を合わせる」ために使う言葉は、専門用語である必要はない。

# 「使わない言葉」をリスト化して、ステークホルダー同士の混乱を防ごう
ユーザーのメンタルモデルとは違った言葉、ユーザーとステークホルダーとでは意味がことなった言葉、
解釈の違いを促進させる略語や専門用語は使うのを避ける。

特に、「同形異義語」は使用を避けたほうがいい。

船舶情報の取り扱いシステムを開発したときは、専門用語の嵐だった。
「Dailyレポート」と開発サイドのエンジニアが言うのと、「船長報告」と運用サイドのオペレータが言うのとでは、同じ事実に対することを喋っていても、情報としては違う。

とくにスケジュールが押し迫ってイラついているときは、
運用サイドの言った言葉を自分の中で翻訳することがストレスとなった。

そのせいで、ムダな軋轢が生まれたことも沢山あった。

厳密に定義しすぎるとメンテナンスが大変だから、コアな概念だけを開発の最初に認識合わせしておくだけでも随分と違うように思う。
**自身の体験から言うが、互いに不信感を覚えた組織はとてもパフォーマンスが落ちる**。

業界に詳しくない場合は、相手の喋ってる言葉を使って話してみると良い。
「こちらを理解しようとしてくれているんだな」ということが相手に伝わり、信頼につながることがある。

# 名詞と動詞を使って、要件を表現してみよう
名詞に、それに合わせた適切な動詞を結びつけると、作ろうとしているものに対しての「要件」になる。

例）　ツイッターの機能について、名詞と動詞を使って表現
「読者」は、「投稿」を「共有する」ことができる。
「投稿者」は、「投稿」を「執筆する」ことができる。

これは、図で表すと、ユースケース図となるのだろう。
Go lang を使用してGETでJSONを受け取る

##まえがき
2週間前に始めたGo言語　
A Tour of Goを終えていろいろと遊んでみました。
今回はタイトルの通り JSONを取り扱います。

#それでは行っていこう
Goのバージョンはこちら　　`go version go1.12.4`

##Code
~~~Go
package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

type Test struct {
	IP            string `json:"ip"`
	About         string `json:"about"`
	Pro           string `json:"Pro!"`
	RejectFascism string `json:"reject-fascism"`
}

func main() {
	url := "https://jsonip.com/"
	req, _ := http.Get(url)
	defer req.Body.Close()
	bytearray, _ := ioutil.ReadAll(req.Body)

	data := new(Test)

	if err := json.Unmarshal(bytearray, data); err != nil {
		log.Fatal(err)
	}
	fmt.Println(data.IP,data.About,data.Pro)
}

~~~
##それでは解説
**その前に**
まず　https://jsonip.com/  というサイトがある。
ここはJSONを返してくれるので今回はこれを利用する。



~~~Go
type Test struct {
    IP            string `json:"ip"`
    About         string `json:"about"`
    Pro           string `json:"Pro!"`
    RejectFascism string `json:"reject-fascism"`
}
~~~
ここで**JSON用**の構造体を宣言する
<br>


~~~Go
url := "https://jsonip.com/"
	req, _ := http.Get(url)
	defer req.Body.Close()
	bytearray, _ := ioutil.ReadAll(req.Body)
~~~
http.GETに(url)を食わせて結果を"req"と"_"に入れる。
本当はerr判定をした方がいい  
deferでreqをmain関数が終わったのちにCloseさせる。
**ioutil**(入出力系のpackage)でreq.Bodyを読み取る。


####1番重要なところ

~~~Go
	data := new(Test)//ゼロ初期化

	if err := json.Unmarshal(bytearray, data); err != nil {
		log.Fatal(err)
	}
	fmt.Println(data.IP,data.About,data.Pro)
~~~
dataをTest型として宣言をし待機させる

そして`json.Unmarshal`でJSONからTest型に変更させる。


###最後に
初めて書いた・・・。
変なところあったら教えてください。

###参考文献

[Go言語でJSONを扱う](https://qiita.com/nayuneko/items/2ec20ba69804e8bf7ca3)
勉強会で登壇してみた。

先日、とある勉強会にて登壇させていただきました。ユーザーグループでの登壇は実は初めてで、大変緊張しました。発表終わった後も、緊張が抜けきりませんでした。
しかし、やっぱり登壇してよかった！と思っています。初のユーザーグループでの登壇を終えて思うところをつらつらと書いてみます。

#参加している勉強会

自業務にかかわるような内容の勉強会、例えばOffice365のUGやPowerBIのUGに何度か参加させていただきました。
業務柄、こういったソリューションに触れることが多いので、自分の業務に生かすため参加させていただいています。主催されている方々や発表された方々には、常々尊敬と感謝の念をいだいています。

#登壇した経緯

理由は主に2つです。

以前からこれらのイベントで登壇したい、と思っていました。これらの勉強会で得たことで、いくつものなく課題を解決できたこと、そして場合によってはビジネスにつながったことがありました。こういったコミュニティで得たことが自分の成長にもつながっていますので、その成長の機会をくれたコミュニティに恩返しがしたかったことが1つ目です。

もう1つが、ビジネスで関わりがあった方からお声がけいただいたことです。
詳しくは書けませんが、上記の恩返ししたいという思いも相談したことがある、とある方から登壇のお声がけをいただき、「これはチャンスだ！」と二つ返事でお受けしました。

唯一の誤算は、最初はライトニングトークで経験を積んでからでと思ってたものの、いきなりの45分枠でああったこと。普段の業務とは別枠で45分程度の登壇内容をまとめるのは、楽しく、そして推敲しても推敲しても不安でした。


#登壇してよかったこと

###1. 改めて振り返りができたこと

選定の目的やポイント、得られる効果、現状の懸念や課題などを改めてまとめることができました。漠然と考えていることでもいざ資料とトークにまとめるには、内容をコアな箇所に集約しスリムにせねばなりません。
特にクラウドの分野では日々アップデートがありこれまで～現状の課題と、今後の方向性について考える良い機会となりました。

###2. 自分だけの疑問かと思っていたことが、皆さんの疑問か、そうでないか切り分けできたこと

説明の数か所かで、皆さんの頷きポイントがいくつかあったこと。それから質問コーナーでも(ペース配分んミスって時間の余裕ができたから、とはいえ）私の疑問に対して同意や追加の質問を受けたこと。その場でUser VoiceにVoteしていただいたこと。もちろん、そうでないポイントはあったけど、これが製品に取り込まれたらなおうれしい。

###3. 勉強会の管理者の方々とお話できたこと

本当にこれはうれしい。いわゆるインフルエンサーの方の考え方は参考になります。クラウドは日々アップデートがあるのだけど、なぜそういうアップデートをしたのか、その背景にある考え方を踏まえて将来対策を打つ、という考え方はとても参考になりました。また、皆さんの秀でた部分を見て、自分もこうありたい、とモチベーションにつながる。それが、社内外の評価につながればなおうれしいと思います。



#反省

###1.ペース配分はしっかりと

割とゆっくり目に話すつもりの資料にしていたけど、ペースがだいぶ早い目になってしまった。資料から削った部分をトークでカバーできたものの、結構時間があまってしまった。司会者の方に質問時間を多めにとってもらったが・・・。

予行演習は、数回はやっておくほうがいいな、と反省。


###2. 必要な道具は持ち歩く（特にSurfaceユーザー）

会場によっては、ディスプレイ系のアダプタが必要なケースも。今回は会場に設置されていたし、もしもの時は借りられそうな状況だったので回避できたけど、もしも過剰になかったら、と思うと滝汗。必要な道具はちゃんと持ち歩きましょう。



###3. ネガティブな部分に対する表現が、度を過ぎないように

ソリューションの気になる点はないとは言えないし、いくつか織り交ぜた資料にしていて、こうなったらいいなぁ、という内容で話していた。しかし、質問コーナーで受けた内容を話す際に結構きつい表現を使ってしまい、結構ディスってしまったこと。緊張のあまり舞い上がってしまっていたとはいえ、もうちょっとマイルドな表現を心掛けたい。

[これぐらいの表現](https://www.google.com/search?q=%E3%83%AC%E3%83%99%E3%83%ABe+%E3%83%8F%E3%83%9E%E3%82%8B&source=lnms&tbm=isch&sa=X&ved=0ahUKEwjkt8PA_JXiAhUZxYsBHYUiB5QQ_AUIDigB&biw=1368&bih=721)が一番いいんじゃないかな、と個人的は思ってる。


#まとめ

登壇することになり、リソースはかなり費やしました。でも、登壇にはそれに見合うだけの価値はあると思います。
また機会があれば、登壇したい、です。

登壇はいいぞ。