OmniAICreator/Qiita-1.07M huggingface dataset:
C++ Builder XE4 > TeeChart > 多量のプロットの描画高速化 > 実行可能コード (2019-04-11版)

```txt:動作環境
C++ Builder XE4
```

### 2016年3月31日の記事 > 分かりにくい

- [2016-03-31 c++ builder / teechart > Link > 多量のプロットの描画高速化 + 実装ミスの訂正(2019-04-11)](https://qiita.com/7of9/items/7b0ccc76525de542bbbc)

上記を参考に実装を進めようとしたが、分かりにくい。

さらに、実装ミスも見つかった。

もう、ほんと、ねぇ。


### 実行可能コード (2019-04-11版)

```Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
#include <VCLTee.Chart.hpp>
#include <VCLTee.Series.hpp>
#include <VCLTee.TeEngine.hpp>
#include <VCLTee.TeeProcs.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TChart *Chart1;
	TFastLineSeries *Series1;
	TButton *Button1;
	void __fastcall Button1Click(TObject *Sender);
private:	// ユーザー宣言
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <DateUtils.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
    Chart1->Series[0]->XValues->DateTime = true;
    Chart1->BottomAxis->DateTimeFormat = L"nn:ss";

    TDateTime dt;

    dt = Now();

	int cnt = 0;
	TDoubleDynArray xs, ys;

	// 1. 既存データの読込み
	xs.Length += Series1->XValues->Count;
	ys.Length += Series1->XValues->Count;
	for(int idx=0; idx < Series1->XValues->Count; idx++) {
		xs[cnt] = Series1->XValues->Value[idx];
		ys[cnt] = Series1->YValues->Value[idx];
		cnt++;
	}

	// 2. 追加
	const int numData = 10;  // 追加データの個数
	xs.Length += numData;
	ys.Length += numData;
	double yval;
	for (int idx=0; idx < numData; idx++) {
		yval = (1+ idx) % 2;
		xs[cnt] = dt;
		ys[cnt] = yval;
		cnt++;
		//
		dt = IncMilliSecond(dt, 100);
	}
	Series1->XValues->Value = xs;
	Series1->XValues->Count = cnt;
	Series1->XValues->Modified = true;
	Series1->YValues->Value = ys;
	Series1->YValues->Count = cnt;
	Series1->YValues->Modified = true;

	Series1->Repaint();  // 描画の更新に必要
}
//---------------------------------------------------------------------------
```

### 実行例

- ボタンを数秒おきに押下した結果が以下

![2019-04-11_19h46_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/34b67c0c-ba7d-f24c-5958-3402e5082ddb.png)


### 備考 > 資料として

- 動くことを確認したコードを載せること
- 閲覧者に分かりやすい書き方にすること
- 「40秒で支度しな」に答えられるように
SlackにGithubの通知情報を流す

いやもうほんと毎回忘れるので自分でメモがわりに残しておく

## slackでチャネル作成
これはなんでもいい
個人的には、`git-"リポジトリ名"` とかがわかりやすいな。

<img width="731" alt="スクリーンショット 2019-04-11 19.32.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98651/fbd2ee83-2193-7368-27f3-6448e9bf827c.png">

## Githubアプリをインストール
左下のアプリ追加からgithubをインストールしておく
<img width="697" alt="スクリーンショット 2019-04-11 19.34.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98651/aaaa5bec-064a-6f99-d8c8-393c909460ab.png">


インストールできたらこんな感じのメッセージがくるのでこれでOK
<img width="602" alt="スクリーンショット 2019-04-11 19.37.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98651/f7501b16-8dce-d8de-63d2-4d39f7399ccb.png">

## 通知を流したいチャネルでコマンドをうつ
いつもメッセージを送信する入力欄から以下のコマンドを打って送信すれば完了
なんかメッセージを入力して送信するのこわいって感じるかもだけど、問題ない、大丈夫！

```
/github subscribe (githubのリポジトリのURLをいれる), pulls,statuses,public,commits:all,releases,comments,branches,reviews
```

`commits:all` は正直うるさいので入れなくていいと思う！
UIColorで使っているRGBの値を取得する

## 概要
UIColor（例えば、UIColor.red）で使われているRGB、alphaの値を取得したい

## 前提
- Xcode 10.1
- Swift 4.2

## tl;dr

- `CGColor` から取ってくる。

```swift
(lldb) po UIColor.yellow.cgColor.alpha
1.0
```

```
(lldb) po UIColor.yellow.cgColor.components
▿ Optional<Array<CGFloat>>
  ▿ some : 4 elements
    - 0 : 1.0
    - 1 : 1.0
    - 2 : 0.0
    - 3 : 1.0
```

```swift
print(UIColor.red.cgColor.components![0]) // Red 1.0
```

## extend!

- UIColorのextensionとして定義して便利に使う

```swift

import UIKit

extension UIColor {
    var redColor: CGFloat? {
        return self.cgColor.components?[0]
    }
    
    var greenColor: CGFloat? {
        return self.cgColor.components?[1]
    }
    
    var blueColor: CGFloat? {
        return self.cgColor.components?[2]
    }
    
    var alpha: CGFloat {
        return self.cgColor.alpha
    }
}

```

```swift
print(UIColor.red.redColor) // Optional(1.0)
print(UIColor.red.blueColor) // Optional(0.0)
print(UIColor.red.greenColor) // Optional(0.0)
print(UIColor.red.alpha) // 1.0
```
#jq コマンドで配列を解除してまた囲む例

# Failed

this case make three JSONs 

```
$ echo '[1,2,3]' | jq '.[] | [.]'                                                                                                            1
[
  1
]
[
  2
]
[
  3
]
```

# Success

It makes one JSON has one whole array has multiple elements

```
$ echo '[1,2,3]' | jq '[.[]]'                                                                                                                1
[
  1,
  2,
  3
]
```

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
印刷用のCSSでデザインがページで分断されてしまわない為に

#印刷用のレイアウトを調整して欲しい
紙に印刷…
まだそんなレガシーな技術を使う人類が居るのか…
と愚痴ってる場合ではありません。
やって欲しいと言われたらやるのです。

##じゃぁ実際に印刷プレビューを見てみよう
まずは現状の確認から

```html
<div id="hitotume">
  <br>1
  <br>2
  <br>3
</div>
<div id="hutatume">
  <br>4
  <br>5
  <br>6
</div>
<div id="mittume">
  <br>7
  <br>8
  <br>9
</div>
```

例としてこんな感じのマークアップです。
で印刷プレビューを見てみると

```
---page1----------------------------------
1
2
3
4
5
---page2----------------------------------
6
7
8
9
```

という感じに`hutatume`の要素がpage1とpage2に分断されてしまいました。
これでは視認性が悪く、ページの把握に手間取ります。

##じゃぁどうするのか
cssにはプリンターで印刷する時に便利なプロパティがあります。
`break-before`
`break-after`
`break-inside`
の３つです。
このプロパティはページの区切りを制御します。
それぞれ解説します。

###break-before
[MDN web docs:break-before](https://developer.mozilla.org/ja/docs/Web/CSS/break-before)
このプロパティを指定された要素の**前**にページを区切るか否かを指定します。

`break-before:auto`は初期値、
`break-before:avoid`は区切るのを禁止、
`break-before:all`は強制的に区切ります。

今回の例なら
`hutatume`に`break-before:all`
を指定すると

```
---page1----------------------------------
1
2
3
---page2----------------------------------
4
5
6
7
8
---page3----------------------------------
9
```

となります。
`hutatume`の前である3と4の間でページが区切られます。

###break-after
[MDN web docs:break-after](https://developer.mozilla.org/ja/docs/Web/CSS/break-after)
このプロパティを指定された要素の**後**にページを区切るか否かを指定します。

`break-after:auto`は初期値、
`break-after:avoid`は区切るのを禁止、
`break-after:all`は強制的に区切ります。

今回の例なら
`hutatume`に`break-after:all`
を指定すると

```
---page1----------------------------------
1
2
3
4
5
---page2----------------------------------
6
---page3----------------------------------
7
8
9
```

となります。
`hutatume`の後である6と7の間でページが区切られます。

###break-inside
[MDN web docs:break-inside](https://developer.mozilla.org/ja/docs/Web/CSS/break-inside)
このプロパティを指定された要素がページ**に**区切られるか否かを指定します。

`break-inside:auto`は初期値、
`break-inside:avoid`は区切られるのを禁止します。

今回の例なら
`hitotume`、`hutatume`、`mittume`にそれぞれ`break-inside:avoid`
を指定すると

```
---page1----------------------------------
1
2
3
---page2----------------------------------
4
5
6
---page3----------------------------------
7
8
9
```

となります。
それぞれの要素に`break-inside:avoid`を指定しているので
要素の間でページが区切られることはないようにレイアウトされます。

##結局どのように使えばいいの？
「あ～、ココでセクションの終わりだからページを区切りたいな」
って時は`break-after`に`all`を指定。

「ココからセクションが始まるからページの始まりにしたいな」
って時は`break-before`に`all`を指定。

「このセクションは2ページに跨って印刷されたくないな」
って時は`break-inside`に`avoid`を指定。

って感じに使えば良い感じにレイアウトされると思います。

#編集後記
入社9日目
要素をページに区切られないようにするためにめっちゃ調べました。
多くのサイトは`break-before`と`break-after`は説明してくれるんだけど
求めていた`break-inside`を説明してくれるサイトはごく僅かでした…。
でもいくらメディアクエリで`print`を指定してCSSを書いてレイアウト整えても
ブラウザ間の印刷プレビューに差がありすぎて吐きます。
SlackのPollyでアンケートの詳細な仕様を設定する


イベントの出欠をSlackのPollyを使用する人は少なくないと思います。
そんな時に利用できるPollyのオプション設定を解説します。

##Pollyでアンケートを作成する
以下のような書式で記載をするとPollyでアンケートを作成できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360050/f59d0f65-3e76-07c1-48ae-048c1faf40cb.png)

```
/polly "どっちの試合にいける？？(タイトル)"
"5/22 柏レイソル-ベガルタ仙台(選択肢1)" "5/26 柏レイソル-大宮アルディージャ(選択肢2)"
```

##アンケートの仕様を設定する
アンケートを作成するために上記のコマンドを送信すると、アンケートの仕様の設定画面が出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360050/78f78a5f-f072-c118-690a-fd64b1932268.png)

上記の赤枠部分を押下すると回答の仕様を設定できる部分が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360050/039cd92e-5aca-fb57-a9e0-443c42902779.png)

各設定はそれぞれ以下の内容となります。
>Anonymous：誰が何に投票したか分からないようにする
>Show Responses：誰が何に投票したか見えるようにする
>Allow Multi-vote：複数回答可とする
>Allow Adding Choices：後から選択肢を追加できるようにする

それぞれ選択してから```Send to Channel```を押下すると、以下のようにアンケートが投稿されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360050/7b6f6c7e-d4c0-5589-7d99-703e4547b09c.png)

このサンプルでは```Show Responses```、```Allow Multi-vote```、```Allow Adding Choices```を選択しているので、一人の人が複数回答を選択し、誰が回答しているのかも見え、選択肢の追加もできます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360050/b65e1378-3175-4be8-beaf-e7a27913b8a8.png)

ランチの店決めから会議の設定まで、便利だと思いますので是非ご活用ください！
クラスタリング環境で発生した検証値エラー

# クラスタリング環境で検証エラーが発生する
## 開発環境
- JavaSE8
- JavaEE7
- Payara5
- JSF2.2
- Eclipse Oxygen4.7.2

## 事象
パラメータによって選択肢が変化するラジオボタンがある。
任意の項目を選択しポストすると**「j_idt39: 検証エラー: 値が有効ではありません 」**が発生。
ローカルやシングルインスタンス環境だと発生しない。
## 原因
プロジェクトの要件でスティッキーセッションを使用せず、通信の都度ランダムにサーバに割り振られていた。
そのためセッション内にBeanが複製されまくり、その中には初期値のない（null）のラジオボタンの選択肢リストが存在した。
ポストしたときに運悪くリストがnullのBeanに当たった時に検証エラーが発生していた。
### 問題のソース
XHTML

```
<form jsf:id="form" jsf:prependId="false">
            <h:selectOneRadio name="choiceName" value="#{choiceBean.choiceName}" styleClass="radio_list">
                <f:selectItems value="#{choiceBean.choiceList}" var="prize" itemLabel="#{item.labelName}" itemValue="#{item}" />
            </h:selectOneRadio>

        <button jsf:action="#{pageControlBean.toConfirm()}" class="btn_orange">
            次へ
        </button>
    <span jsfc="h:messages" class="form_error_text" />
</form>
```

Bean

```
@Named
@SessionScoped
public class ChoiceBean implements Serializable {

	private static final long serialVersionUID = 1L;

	@NotNull
	@Getter @Setter
	private ChoiceType choiceName;

	@Getter @Setter
	private List<ChoiceType> choiceList;
}
```
Enum

```
public enum ChoiceType {
	TYPE1("タイプ１", 0),
	TYPE2("タイプ２", 1),
	TYPE3("タイプ３", 2);

	@Getter
	private final String labelName;

	@Getter
	private final int index;

	private ChoiceType(String labelName, int index) {
		this.labelName = labelName;
		this.index = index;
	}
}

```
## 解決
コンストラクタで初期値を設定してやる。

Bean

```
@Named
@SessionScoped
public class ChoiceBean implements Serializable {
	private static final long serialVersionUID = 1L;

	@NotNull
	@Getter
	@Setter
	private PrizeType choiceName;

	@Getter
	@Setter
	private List<ChoiceType> choiceList;

	/**
	 * Constructor
	 * NotNull変数の初期値設定
	 */
	public ChoiceBean() {
		choiceList = new ArrayList<>();
		choiceList.add(ChoiceType.TYPE1);
		choiceList.add(ChoiceType.TYPE2);
		choiceList.add(ChoiceType.TYPE3);
	}
}
```


## 調査のコツ
最終的にセッションの中身が見えるIDE（有料版Intellijとか）で調査してbeanの複製が分かった。
JavaEEだとNetBeansでも見れるそうですね。
Ajaxでテキストをgzipして他のパラメータと一緒にPOSTするテスト

クライアント側でgzipをした後、バイナリで送信してみた。
gzipはこちらを使用してみる
[https://www.npmjs.com/package/zlibjs](https://www.npmjs.com/package/zlibjs)

バイナリはファイルとして送信するといいらしい。

```ruby:クライアント(javascript)
let a = "クライアント側でgzipをした後、バイナリで送信してみた。";
console.log("元データ："+encodeURIComponent(a).replace(/%../g,"x").length+"Bytes");

var gzip = new Zlib.Gzip(unicode2utf8_uint8array(a));
var compressed = gzip.compress();
console.log("圧縮："+compressed.length+"Bytes");

let fd = new FormData();
fd.append('hoge', "aaa");
fd.append('hoge2', "bbb");
fd.append('hoge3', new Blob([compressed], {type: "application/octet-binary"}));

 $.ajax({url: "https://xxxx.com/hoge.php",
  type: "POST",
  contentType:false,
  processData: false,
  cache: false,
  data: fd,
  }).then(function(data, textStatus, jqXHR) {
     alert(data);
  },function(jqXHR, textStatus, errorThrown) {});
}

```

unicode2utf8_uint8arrayは、[https://qiita.com/ukyo/items/1626defd020b2157e6bf](https://qiita.com/ukyo/items/1626defd020b2157e6bf)から。
ありがとうございます！

送信後は、サーバーにファイルとして保存されている。

```ruby:サーバー側(PHP)

header('Content-Type: text/html; charset=UTF-8');
header("Access-Control-Allow-Origin: *");

echo "hoge:".$_POST["hoge"];
echo "hoge2:".$_POST["hoge2"];

var_dump($_FILES["hoge3"]);

echo "[". gzdecode(file_get_contents($_FILES["hoge3"]["tmp_name"])) ."]";

```

```ruby:テスト結果

元データ：82Bytes
圧縮：98Bytes
hoge:aaa
hoge2:bbb
array(5) {
  ["name"]=>
  string(4) "blob"
  ["type"]=>
  string(24) "application/octet-binary"
  ["tmp_name"]=>
  string(14) "/tmp/phpHlyZxg"
  ["error"]=>
  int(0)
  ["size"]=>
  int(98)
}
[
クライアント側でgzipをした後、バイナリで送信してみた。

]

```

普通のパラメータとバイナリが一緒に送られていますね。
gzip後のサイズと送信後に受け取ったサイトが同じなので、そのまま送られているはず。たぶん。

よく見ると圧縮後のサイズが増えとるよ…

送信前にバイト数を確認して、そのまま送るか圧縮するか判断するべきですね。
MockeryのshouldReceiveはonceをつけないと意味がない

## はじめに

* `Mockery`でハマったので他の人がハマらないようにメモ書きを残す

## 通常サンプル

```php:MyClass.php
class MyClass {
    public function get_message($name) {
        return $this->get_hello() . $name;
    }

    public function get_hello() {
        return 'Hello ';
    }
}
```

```php:MyClassTest.php
class MyClassTest {
    public function test_get_message(){
        $object = new MyClass();
        $result = $object->get_message('TEST');
        $expect = 'Hello TEST';
        $this->assertSame($expect, $result);
    }
}
```

普通に使う場合はこんな感じで書けるかと思います

## 該当のソース

```php:MyClassTest.php
class MyClassTest {
    public function test_get_message(){
        $testDouble = \Mockery::mock(MyClass::class)->makePartial();
        $testDouble->shouldReceive('dummy_method');

        $result = $testDouble->get_message('TEST');
        $expect = 'Hello TEST';
        $this->assertSame($expect, $result);
    }
}
```

`dummy_method`という存在しないメソッドが`shouldReceive`（呼び出されていること）をテストしています。
`dummy_method`は存在しないし呼び出してもいないので当然テストは失敗する、と思いたかったんですが実はこのテスト成功してしまいます。

## 対策

以下のように書けばうまくいきます

```php:MyClassTest.php
class MyClassTest {
    public function test_get_message(){
        $testDouble = \Mockery::mock(MyClass::class)->makePartial();
        $testDouble->shouldReceive('dummy_method')->once();

        $result = $testDouble->get_message('TEST');
        $expect = 'Hello TEST';
        $this->assertSame($expect, $result);
    }
}
```

```bash
E                                                                   1 / 1 (100%)

Time: 12.39 seconds, Memory: 26.00MB

There was 1 error:

1) XXX::test_get_message
Mockery\Exception\InvalidCountException: Method dummy_method(<Any Arguments>) from Mockery_0_XXX should be called
 exactly 1 times but called 0 times.
```

1回呼び出されることを想定していて0回呼び出しだったので正しく失敗してくれています

## まとめ

この動きが正しいのかよく分かりません
もしかしたら使い方が間違っているだけなのかもしれないので有識者の方コメントをお願いします
ひとまずは「呼び出されたこと」をテストしたい場合は必ず`once`などの回数指定のものを設定しましょう
DockerでFailed to fetch debian

# 突然Dockerが起動しなくなった。
Macのストレージが一杯になったので、Dockerimage系ファイル全部消しました。
(50GBくらい減った。)
いざ再起動しようとすると、、
`$ ./docker/bin/compose build`
![スクリーンショット 0031-03-29 17.47.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47874/b3d373cd-638b-3771-7fe8-3439eae2bc53.png)

```
W: Failed to fetch http://deb.debian.org/debian/dists/jessie-updates/main/binary-amd64/Packages  404  Not Found.
```


debian触ってないし、先月まで動いていたし、、

# 先人の知恵

皆困ってた。
https://stackoverflow.com/questions/55361762/apt-get-update-fails-with-404-in-a-previously-working-build

Dockerfileの`apt-get update`する前に

```
RUN sed -i '/jessie-updates/d' /etc/apt/sources.list 
```
入れたらできました！:dancer:

debianのライブラリの置き場所が変わったみたいです。

(3月後半から起き始めたみたいで、stackoverflowに感謝です)
[問題提起] 普通のHTTPS経由でアクセスは少し怖いのではないか？

### 本投稿の目的
このあと記載する攻撃手法が発生しうるのであれば、
今まで使ってきたいろいろなサイトで機密情報などをアップロードしたりダウンロードしたりするのが少し怖いな、と感じました。
「そんなの前から常識だろ」とか「いや攻撃可能性はほぼないでしょ」等、いろいろとコメントをいただきたいな、と考え投稿します。
忌憚のないコメントをお願いします！

### 攻撃手法 概要 （1から順に実施）
1. あらかじめ、攻撃対象クライアントと、攻撃対象サーバ（サイトのFQDN）を選定（攻撃対象クライアントが example.com へよくアクセスしている等の情報があれば絞りやすい）
2. サーバ証明書を簡単に発行してくれる認証局（典型例は、Let's Encrypt）に対し、中間者攻撃を行い、サーバ証明書を入手
3. 攻撃対象クライアントに対し、先ほどのサーバ証明書を用いて中間者攻撃を行い、情報窃取・改ざん等の不正行為を行う（サーバ→クライアント、クライアント→サーバのいずれの方向でも可能）

### 攻撃手法 1. について
- 以下、攻撃対象Let's Encryptを前提に記載する
- まず、サーバ証明書が作られるまでのフローについて
    - 前提: Let's Encrypt は、「サーバ証明書発行申請をしてきた者が真正かどうか」をチェックするために、チェックを行い、通れば申請者に証明書を渡している
    - 以下、フローの流れ
    - 申請者は後のチェックで用いるプロトコル（HTTPやDNS（のTXTレコード）といった手法がある）を選択し、Let's Encryptに伝達
    - Let's Encrypt 側は、申請者に対し秘密情報（申請者以外に渡していない情報）を渡す
    - 申請者は、先程伝達したプロトコルで秘密情報を開示する（HTTPサーバでファイルを公開する等）
    - Let's Encrypt側がチェックし、問題なければ申請者に証明書を渡す
- ここで、攻撃者が「平文であれば攻撃対象サーバになりすまし、中間者攻撃できる」というような状態であるとすると、先ほどのチェックプロセスで平文のプロトコルを選べば、攻撃対象サーバのFQDNに対するサーバ証明書が入手できる

### 攻撃手法 2. について
- あまり説明は不要と思われるが、先ほど入手したサーバ証明書を使用すれば、攻撃対象クライアントに対してはサーバとして、攻撃対象サーバに対してはクライアントとして、それぞれなりすますことで中間者攻撃が可能

### ありうる対策
- [クライアント側] ユーザがブラウザで機密情報などを扱うサイトを見るときは証明書情報を確認する
    - 攻撃者に、ユーザがつないできたあと数分はパケットを素通りさせ、その後なりすましを始める、とかをされると、ユーザとしては気づきにくいので、部分攻撃はできるのではないか

- [クライアント側] 絶対に信頼できるルート証明書しかインストールしない（プリインストールのものは消す）
    - サーバ側になりすますのが困難→攻撃は困難になる
    - が、ユーザ側の利便性観点でのデメリットは大きい
    - クライアントが、WebAPIのリクエスト側であればこれもよいかも（使用するHTTPクライアントライブラリで、CAを絞れたりすることが多いはず）

- [サーバ側、クライアント側] クライアント認証を入れ、サーバ側で絶対にできるクライアントしか許可しない
    - クライアント側になりすますのが困難→攻撃は困難になる

- [サーバ側、クライアント側] 素のインターネットを使わない
    - 安全なインターネットVPNや、安全な専用線ネットワークとすれば、攻撃は困難になる

- [サーバ側] （未検討） DNSSEC と [CAA] (https://blog.qualys.com/ssllabs/2017/03/13/caa-mandated-by-cabrowser-forum?_ga=2.69639056.1856498811.1554972329-1322448050.1554972329) 導入
    - CAAはまさにこういう問題に対処するためのもの？
    - DNSSECについてよくわかっていないため、未検討扱い

### （参考）その他のプロトコル
- SSH: パスワード認証ではなく、公開鍵認証を普通に使っていれば中間者攻撃は不可能
    - 正当なクライアント側の公開鍵だけが登録されている前提
    - 参考 https://www.gremwell.com/ssh-mitm-public-key-authentication
- IPSec VPN: あまり詳しくないので未検討
AWS DeepRacerを理論的に考えてみた 

## はじめに
AWS DeepRacerを始めるにあたり、Reward関数をどのように変更すればいいのか考えてみました。<br>
理論先行型であるため、動作は保証しておりません。<br>

## waypointとyaw

![yaw.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392765/a9ccafb0-5f33-2f99-aba2-fbff04858353.jpeg)

deepracer_env.py内の[報酬関数](https://docs.aws.amazon.com/ja_jp/deepracer/latest/developerguide/deepracer-train-models-define-reward-function.html)の入力パラメータにwaypoints、closest_waypoints、car_orientationがあります。<br>
waypointsはトラックの中心点の座標であり、closest_waypointsは車両に一番近いwaypointsとなっています。<br>
car_orientationは車両のヨーイングとなっています。<br>
そこで、次に向かうwaypointと車両のヨーイングがわかれば最短距離でコースを走れるのではないかと考えました。<br>

## 車両がどのwaypointsを目指すか
![waypoint.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392765/91f7e304-1a93-c56e-b69c-f97752b5ae63.jpeg)

closest_waypointsは車両に対する直線の距離で一番近いwaypointsとなっています。<br>
そのため、車両の後方にclosest_waypointsが存在する可能性があります。<br>
そこで、closest_waypointsとその前後のwaypointsの線分の間に車両が存在するかどうかを判定し、closest_waypointsを更新する必要があります。<br>
closest_waypointsとその前後のwaypointsの線分の間に車両が存在するかどうかの判定は、点と線分との距離の公式から判定することができます。<br>
公式については[こちら](https://tokibito.hatenablog.com/entry/20121227/1356581559)を参考にさせていただきました。<br>

簡単にいうと、2点間を通る直線に対して離れた点Pから垂線を下ろし、交点(内分点)が存在すれば、2点間の間に点Pが存在するというものです。<br>
closest_waypointsをBと置き、その前後のwaypointsをそれぞれA,Cと置きます。<br>
線分AB、線分BCとの間に上記の公式を使い、車両から垂線を下ろした交点が存在するかどうかを判定します。<br>

- 線分ABとの間に交点が存在し、線分BCにはない場合は線分ABの間に車両は存在するため、closest_waypointsをBとする。<br>
- 線分ABとの間に交点が存在せず、線分BCに交点が存在する場合は、線分BC間に車両が存在するため、closest_waypointsをCとする。<br>
- 線分AB、線分BCそれぞれに交点が存在する場合にはclosest_waypointsをCとする。<br>

これにより、車両が目指すべきclosest_waypointsを指定することができます。<br>
<br>

## 車両のヨーイングとx軸に対する線分との角度の差から報酬を決定
```python
        diff_yaw = waypoint_yaw - car_orientation

        if diff_yaw == math.radians(0):
            reward += 10.0
        elif (abs(diff_yaw) < math.radians(5) and diff_yaw * steering > 0):
            reward += 8.0
        elif (abs(diff_yaw) < math.radians(10) and diff_yaw * steering > 0):
            reward += 5.0
        elif (abs(diff_yaw) < math.radians(15) and diff_yaw * steering > 0):
            reward += 3.0
        elif (abs(diff_yaw) < math.radians(20) and diff_yaw * steering > 0):
            reward += 1.0
        else:
            reward = 1.0e-3
```
目指すべきwaypointを求めることができたので、次は車両のヨーイングと交点が存在する線分のヨーイングとの角度の差を求めます。<br>
その差が小さいほどReward値を高く設定しました。<br>

## まとめ

![Time.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/392765/b7450dfe-0e0f-3c25-c7f8-be8f90b82a6d.png)

defaultの5時間の学習をした結果1周38秒という結果でした。
waypointと車両のヨーイングから報酬を決定し理論的に考えてみましたが、そこまで速くなっている感じは見受けられませんでした。<br>
また、closest_waypointにしても車両と全waypointに対して直線の距離を求めているため、車両の前後ではなく、想定していない箇所のwaypointを参照することがあります。<br>
そこは注意が必要です。
Rのspdepパッケージで空間的自己相関の分析

前回の記事[「投票率と高齢化率の関係をsfパッケージで可視化する」](https://qiita.com/ishiijunpei/items/4d5cd8123660888d8b99)では、投票率と高齢化率の相関をsfパッケージを利用して可視化しました。今回は空間データの統計解析では避けて通れない「空間的自己相関」の分析を行います。

### データと空間配置に相関があるか
「空間的自己相関」という字面だけだとなんのことかさっぱり想像がつかないのですが、今回のケースで言うと、「投票率に地域性があるか」を分析することになります。つまり、投票率と投票所間の距離に相関があるかどうかを分析します。 

### spdepパッケージを使う
spdepパッケージが今回の目玉機能になります。空間統計の定番パッケージだそうです。

```r
## パッケージの読み込み
library(tidyverse)
library(sf)
library(spdep)  #空間自己相関分析を行うパッケージ
```

続いて使用するデータを読み込みます。

```r
# 投票率データ
touhyou<-read.csv("senkyo/senkyo2019.csv")
# 投票所座標データ（shp）
touhyou_p<-st_read(dsn="tohyou",layer="tohyou")
# 投票区ポリゴン（shp）
assabu_t<-st_read(dsn="shp",layer="assabu_touhyou")

## 投票率データと投票区ポリゴンを結合
data_t<-inner_join(assabu_t,touhyou ,by="投票区")
```

### 隣り合う関係を定義する
投票所間の距離を分析指標とするわけですが、正確には「隣り合う投票所間の距離」です。したがって「隣り合う投票所」を決めるのが最初のステップになります。「隣り合う投票所」の関係性は「空間隣接行列」として定義されます。

spdepパッケージのtri2nb()関数でドローネ三角網図を作成します。

```r
# 投票所の座標を抜き出す
touhyou_c<-st_coordinates(touhyou_p)
# 投票所の座標からドローネ三角網図を作成
touhyou_d<-tri2nb(touhyou_c)
```

### ドローネ三角網図の図示
touhyou_dにドローネ三角網が付置されていますので、投票区のポリゴンデータと重ねて表示します。sfクラスのままだとうまく重ならないので、投票区ポリゴンをspクラスに変換しています。

```r
## 投票区と三角網図の図化
data_sp<-as(data_t,"Spatial")	#投票区のデータをspクラスに変換
plot(data_sp)
plot(touhyou_d,touhyou_c,add=TRUE)
```

![02.png](https://qiita-image-store.s3.amazonaws.com/0/60438/2e0ef855-21d2-7cfa-965d-ce004d29c580.png)

### Moran'sIテストで空間自己相関の検定　
moran.test関数は連続量のベクトル型データと空間重み付け隣接行列を引数にとります。連続量のベクトル型データは投票率のデータです。重み付け隣接行列はnb2listw()関数で作成します。
nb2listw()の引数はnbクラスの隣接行列（tri2nb()関数で作成したtouhyou_d）です。

```r
# moran.test関数を実行する
moran.test(data_t$投票率,nb2listw(touhyou_d,style="W"))

##　実行結果
Moran I test under randomisation

data:  data_t$投票率  
weights: nb2listw(touhyou_d, style = "W")    

Moran I statistic standard deviate = -1.2643, p-value = 0.8969
alternative hypothesis: greater
sample estimates:
Moran I statistic       Expectation          Variance 
      -0.25293925       -0.08333333        0.01799764 
```

p-value = 0.8969
statistic = -0.25293925
という結果となりました。

Moran Iのstatisticは相関係数と同じように1〜-1の範囲をとり、正の値では投票率が近い地域が隣接する傾向が強く、負の値では投票率が近い地域が遠方に位置する傾向が強くなります。

つまり、上記の結果からは、投票率と投票所の間に空間的自己相関があるとはいえないことを示していると思われます。投票率は投票区単位で独立しており、いわゆる「地域性」は薄いと考えられます。
Cognos Analytics レポート 他のレポートに遷移するドリルスルーの設定

#他のレポートに遷移するドリルスルーの設定
ドリルスルーとは、遷移元レポートの特定の場所をクリックすると、
![007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/59b552a9-6180-1807-0edd-1f113cfc540c.jpeg)

以下のように別のレポートに遷移し、その際にクリック場所の情報を持って遷移する事ができる機能となります。
![008.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/86a167bb-e7ec-3a68-1923-4e5782bfb5c3.jpeg)


#手順
A1のレポートとA7のレポートを開始点とします。
※A1レポートをコピーしてA8レポートとして、A8レポートからA7レポートへのドリルスルー設定を行います。

赤枠の箇所の製品ラインの「リスト列の本体」を選択し、プロパティからドリルスルー定義の「・・・」を選択し、下記のドリルスルー定義ボックスを表示。
![001.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/273bbb66-c826-7e7a-8dad-78e6246458a9.jpeg)

赤枠の「＋」をクリック。遷移先を定義する「ドリルスルー定義1」が作成される。
![002.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/b2df219b-ce59-84ad-b723-bc8e9d07e64a.jpeg)

赤枠の「・・・」を選択し、遷移先のレポートを選択する。
![003.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/a498d5c7-a208-239a-c43c-35cbc902d0fb.jpeg)

A7.Reportを選択し「開く」。
![004.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/8b5e6ccc-b46c-c48f-7fc6-78619d16648e.jpeg)

レポート遷移時に引き継ぐパラメーターを設定するため、赤枠の鉛筆マークをクリック。
![005.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/8d1b1f0a-4a9d-7f65-5594-10ee4c588827.jpeg)

以下のように設定する。
方法の「データ・アイテム」とは、リストに表示されている「製品ライン」のデータ・アイテムの値をクリックした時に、クリックした対象を持って遷移するという意味。
方法の「パラメーター」とは、リストに表示されているデータアイテムではなく、レポート内にプロンプトがあった場合に、プロンプトで選択されている値(パラメーターの値)を持って遷移するという意味。
![006.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/75a9e4c0-b771-e8d0-c988-3954c4647ea7.jpeg)

「OK」→「OK」でドリルスルー定義ウィンドウを閉じ、レポートを保存して、実行してみる。

このようにドリルスルー可能な箇所は青色下線表示になっている。
赤枠の「キャンプ用品」をクリックする。
![007.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/59b552a9-6180-1807-0edd-1f113cfc540c.jpeg)

A7.Reportに遷移され、「キャンプ用品」が値のプロンプトで選択され、リストも絞り込まれている事がわかる。
しかしながら、A8レポートで選択したキャンプ用品は、「2013年」の売り上げの行だったが、「年(pYear)」は引継ぎ対象にしていないので、あくまでA7.Reportデフォルトの「2011年」の表示になっている。
![008.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/86a167bb-e7ec-3a68-1923-4e5782bfb5c3.jpeg)


#自己学習記事一覧
**Cognos Analytics をエンドユーザーの方に自己学習して頂くためのサイト**
https://qiita.com/shinyama/items/95885c7246dc413b6448
SourcetreeでBeyondCompareをDiffツールに設定する

ExcelやUnity特有のアセット比較など、なにかと便利だったので設定しました。
すぐ設定できます！:baby:

# 環境情報

- macOS Mojave 10.14.4
- Beyond Compare 4.2.9
- Sourcetree 3.1.1

# 設定方法

1. [ここ](https://www.scootersoftware.com/download.php)からBeyondCompareをダウンロードする
2. BeyondCompareを開き、メニューバーからBeyondCompare > インストールコマンドラインツール...を選択する
3. Sourcetreeの環境設定からDiffを選択し、「差分表示ツール」、「マージツール」にBeyond Compareを設定する
Python Web スクレイピング

スクレイピングを今後勉強していこうと思うので、記事を書いていきたいと思います。
基本的に学習記録です。
[こちらの本を参考にさせていただきました。](https://www.amazon.co.jp/Pythonによるスクレイピング-開発テクニック-BeautifulSoup-scikit-learn-TensorFlowを使ってみよう/dp/4802610793)

##スクレイピング(Scraping)とは
スクレイピングとは、webサイトから任意の情報を抽出する技術です。
スクレイピングすることにより、web上で情報を自動収集できます。

つまり、**効率的に情報を収集できる技術**です。
スクレイピングを調べていると、クローリングという言葉がよく出てきます。
では、クローリングとは何か以下にまとめます。
###クローリングとは
クローリングとは、プログラムがwebサイトを定期的に巡回して、
情報をダウンロードする技術のことです。

定期的に巡回することによって、最新情報を検索することが可能です。
　

#データのダウンロード
##web上の情報を取得する方法

Pythonでは、**urllibライブラリ**を使います。このライブラリを使用すると、HTTPやFTPを利用してデータをダウンロードできます。その中でも、**urllib.requestモジュール**は、Webサイトにあるデータにアクセスする機能を提供します。

#Webサイトからファイルをダウンロードする方法

```download_sample.py
import urllib.request

ulr = "(URL)"
savename = "sample.png"

urllib.request.urlretrieve(url,savename)
print("save the image")

```

*urlretrieve func : 直接ファイルをダウンロードできる。


#クライアントの接続情報を表示してみる

```download.py
import urllib.request

url = "(URL)"
res = urllib.request.urlopen(url)
data = res.read()

#convert binary to string
text = data.decode("utf-8")
```






簡単ですが、今回はこのぐらいで
随時、勉強したことをアップしていきます。
初心者Pythonistの日記 Day1

ども

かつてのプログラマー兼研究者
しかし、ここ15年は、経営コンサルだったり、事業開発で買収交渉したり、海外いたり、スタートアップを経営したり、飲食店やったり、プログラムから離れてました。

昔はこんな感じのスペックです
C, C++, Java, html, css, perl, Pascal, VHDL, csh などをいじりつつ、IT系論文を5本ほど執筆
unix, linux, free bsd, mule, emacs
GUI系経験ゼロ

そこから浦島太郎状態で、いまから、Python, javascript, swiftをちょっとやろうと思ってます。現在43歳。

これはそんなおじさんの復活の物語（になるか？）

ということで、まずは、Pythonから。
友人の天才プログラマーに、まずは、これからということで教えてもらった

Flask
https://a2c.bitbucket.io/flask/index.html

まずはこれを動かしてみようと。

前提、Pythonいじるのが、今日が初日。
まずは、環境構築・・・

だが、当然ながら、いろいろと、コマンドがインストールされない
進んでいくが、まずつまったのが、Python3.6が、BUILDされない

```
~ $ pyenv install 3.6.6
python-build: use openssl from homebrew
python-build: use readline from homebrew
Downloading Python-3.6.6.tar.xz...
-> https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tar.xz
Installing Python-3.6.6...
python-build: use readline from homebrew
BUILD FAILED (OS X 10.14 using python-build 20180424)
Inspect or clean up the working tree at /var/folders/d4/2z2crny959n4sbybccx45jhm0000gn/T/python-build.20181001145113.76758
Results logged to /var/folders/d4/2z2crny959n4sbybccx45jhm0000gn/T/python-build.20181001145113.76758.log
Last 10 log lines:
  File "/private/var/folders/d4/2z2crny959n4sbybccx45jhm0000gn/T/python-build.20181001145113.76758/Python-3.6.6/Lib/ensurepip/__main__.py", line 5, in <module>
    sys.exit(ensurepip._main())
  File "/private/var/folders/d4/2z2crny959n4sbybccx45jhm0000gn/T/python-build.20181001145113.76758/Python-3.6.6/Lib/ensurepip/__init__.py", line 204, in _main
    default_pip=args.default_pip,
  File "/private/var/folders/d4/2z2crny959n4sbybccx45jhm0000gn/T/python-build.20181001145113.76758/Python-3.6.6/Lib/ensurepip/__init__.py", line 117, in _bootstrap
    return _run_pip(args + [p[0] for p in _PROJECTS], additional_paths)
  File "/private/var/folders/d4/2z2crny959n4sbybccx45jhm0000gn/T/python-build.20181001145113.76758/Python-3.6.6/Lib/ensurepip/__init__.py", line 27, in _run_pip
    import pip._internal
zipimport.ZipImportError: can't decompress data; zlib not available
make: *** [install] Error 1
```
BUILD FAILURE

むむ、ということで、そこで気づいたのが、そもそもXcodeなどないもしてなかった・・・
それをインストール。待つこと30分。（ファイル、大きいね、Xcode）

それでも動かない・・・

```
xcode-select --install
```
これをしても動かない・・・

と思っていたら、また別の天才プログラマーの友人から、これをやってみたら？と。
https://medium.com/@digitalnauts/pyenv-install-error-mac-dcbd28fdc9db

```
CFLAGS="-I$(brew --prefix readline)/include -I$(brew --prefix openssl)/include -I$(xcrun --show-sdk-path)/usr/include" \
LDFLAGS="-L$(brew --prefix readline)/lib -L$(brew --prefix openssl)/lib" \
PYTHON_CONFIGURE_OPTS=--enable-unicode=ucs2 \
pyenv install -v 3.6.6
```
こちらのコマンド。な、長い・・・

コピペで、Enter！

できました。

とりあえず、初心者Pythonist、環境構築できました。

localでうごくところまで行きました。
https://gyazo.com/c62c80bd84459e8d1c45e4b76857a468/

初日はこれにて終了。

Python環境構築
インストールで、BUILD　FAILURE
その対策
でした。

2時間
D-Oceanで遊ぶ

# はじめに
こんにちは。
現在、東京大学で主にシステムデザインを学んでいる学生です。
今回は授業で簡単なデータの解析を行いましたので、備忘録もかねてその過程を記したいと思います。

# D-Oceanとは
株式会社ディーオーシャンが提供しているソーシャルデータプラットフォームで、誰でも無料でデータを利用することができる。2019年2月14日よりサービスが提供されている。

[D-Oceanのホームページはこちら](https://www.docean.io/)

## D-Oceanの使い方
### 1. 画面右上の「ログイン」へ進む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309501/3baa147a-dc42-2137-5ed5-54e8adafafac.png)

### 2. 持っているアカウントでログイン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309501/6cf501e6-a7b1-b71f-3ba4-27f7dbb264c8.png)

### 3. データを選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309501/fb464f06-ef41-3cef-32f7-2c2fa06c9a58.png)

### 4. 「Query」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309501/f451ae62-4a51-be0a-9482-18bf1e66b91b.png)

### 5.「Execute」を選択
とりあえずデフォルトで書かれているSQLを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309501/152286ee-0a3d-e5f4-d29e-8ab933afbd73.png)

### 6. 結果
無事テーブルを見ることができました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309501/eeb70c15-49df-7ea7-72d8-c70633790346.png)
Laravelのクエリビルダを使い回す際の注意

## はじめに

* `Laravel`初心者向け
* 自分がハマったので他の人がハマらないように残す

## 該当ソース

```php
        $company_where = Company::where(['is_valid' => '1']);
        $company1 = $company_where->where(['id' => '1'])->toSql();
        var_dump($company1);
        // "select * from `companies` where (`is_valid` = ?) and (`id` = ?)"
        $company2 = $company_where->where(['id' => '2'])->toSql();
        var_dump($company2);
        // "select * from `companies` where (`is_valid` = ?) and (`id` = ?) and (`id` = ?)"
```

やりたいことは`is_valid`が1の企業（有効な企業）の中でid=1のもの、2のものを取得したい
`is_valid`の条件は共通なので変数に持ち、それを使いまわそうと思って書いたコードなのですが見事にハマりました
id=1は無事に取れるが、id=2が何故かとれない…レコードはあるしis_valid=1なのに何故…

## 解説

もうソースにコメントで書いてありますが`toSql`で発行されるクエリに注目です

```sql
-- 1つ目
select * from `companies` where (`is_valid` = ?) and (`id` = ?)
-- 2つめ
select * from `companies` where (`is_valid` = ?) and (`id` = ?) and (`id` = ?)
```

2番目のクエリにidの検索条件がANDで2つついているのが分かるかと思います
1つ目のクエリのwhereでid=1の検索条件がつき、2つ目のクエリで上書きされるかと思いきや同じカラムでもAND検索で追加される仕様のようでした
（まぁメソッドチェーンでAND検索になるんだから当然っちゃ当然なんですが。。。）

## 解決策

大人しくインスタンスを分けましょう

```php
        $company_where1 = Company::where(['is_valid' => '1']);
        $company1 = $company_where1->where(['id' => '1'])->toSql();
        var_dump($company1);
        // "select * from `companies` where (`is_valid` = ?) and (`id` = ?)"
        $company_where2 = Company::where(['is_valid' => '1']);
        $company2 = $company_where2->where(['id' => '2'])->toSql();
        var_dump($company2);
        // "select * from `companies` where (`is_valid` = ?) and (`id` = ?)"
```

もしくはクエリを分けなくても良い方法を考えましょう

```php
        $companies = Company::where(['is_valid' => '1'])
            ->whereIn('id', ['1', '2'])
            ->toSql();
        var_dump($companies);
        // "select * from `companies` where (`is_valid` = ?) and `id` in (?, ?)"
```

## おわりに

自分と同じ状況でハマっている人が解決したなら良かったです
普通の恋人ができないのは「次元の呪い」のせい

前にビックデータについてのセミナーに行ったときに次元の呪いという言葉を聞いたので調べることに。

要約するとデータの次元数が増えることで、データの距離が離れる現象。
1次元のデータは平均値に最もデータが集中するのに、複数次元になると平均値にはデータがなくなってしまうんです。

機械学習をやっていくと突き当ったりするらしい。
カーネル法はこれを利用することで、分類の難しいデータ間のマージンを作り出しているとか・・・

とりあえず次元の呪いをRで確認する。

まず1次元でプロット

```R
cur_of_dim <-data.frame(matrix(rnorm(1000,0,1),nrow=100,ncol=1))
mean(dist(cur_of_dim))
[1] 1.110581
hist(dist(cur_of_dim))
```
![hiss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/d01dc586-3541-969c-abb1-3334dc9ad079.png)

とりあえず一次元のデータを発生させた。
平均0, 標準偏差1のデータの平均からの距離をヒストグラムにした。
平均からの距離の平均は1.11だった。
距離は絶対値的なものなので、正規分布を半分に折りたたんだような図になった。
2次元にしてみる。

```R
cur_of_dim <-data.frame(matrix(rnorm(1000,0,1),nrow=100,ncol=2))
mean(dist(cur_of_dim))
[1] 1.801263
hist(dist(cur_of_dim))
```
![hiss2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/1a32941c-7588-aac3-6b1d-75a45e00585d.png)

2次元にしただけでも平均の0の数が減っていた。
なんで同じ平均のデータが減るんでしょう？
2次元をプロットしてみます。
平均に近い部分として、0±0.5ほどを点線にしてみます。
ついでにこの点線の中に何個のデータがあるのか確認してみます。

```R
plot(cur_of_dim)
abline(h=c(0.5,-0.5),lty=2)
abline(v=c(0.5,-0.5),lty=2)

kakunin <-cur_of_dim[cur_of_dim[,1] >= -0.5 & cur_of_dim[,2] >= -0.5 & 0.5 > cur_of_dim[,1] & 0.5 > cur_of_dim[,2],]
nrow(kakunin)
[1] 16
```

![plo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/077ad4b5-9ade-b3ab-64de-29af7734d405.png)

100個のデータ中で0の周辺にあるデータは16個と少なくなっていました。
（ちなみに一次元では38個ありました。）

これを繰り返していくから平均にぴったり乗るデータは少なくなるんですね。

このまま次元を増やしていきます。

```R
#5次元
cur_of_dim <-data.frame(matrix(rnorm(1000,0,1),nrow=100,ncol=5))
mean(dist(cur_of_dim))
[1] 2.92333
#10次元
cur_of_dim <-data.frame(matrix(rnorm(1000,0,1),nrow=100,ncol=10))
mean(dist(cur_of_dim))
[1] 4.394134
#50次元
cur_of_dim <-data.frame(matrix(rnorm(1000,0,1),nrow=100,ncol=50))
mean(dist(cur_of_dim))
[1] 10.15969
#100次元
cur_of_dim <-data.frame(matrix(rnorm(1000,0,1),nrow=100,ncol=100))
mean(dist(cur_of_dim))
[1] 14.55681
```
どんどん離れていくのが確認できました。

```R
hist(dist(cur_of_dim))
```
![hiss3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275572/df03b49c-0995-bfed-d9a6-0debbab7b9ee.png)

ヒストグラム見てみるとほとんど平均の0にありませんでした。
これが次元の呪いなのでしょう。

正規分布でやりましたが、分布が変われば結果も変わりそう。
それはまた今度に。



普通の人でいいから恋人が欲しいという人がいますが、
平均的を求めるのは逆に難しそうです。
きっと普通の恋人ができないのは次元の呪いのせいなんです！
それは話が違う？


以上です


（一次元でもピッタリ平均値なんて存在せんやろ！って言われたことがありましたが、それはイプシロン-デルタ論法の話だったようなので、もしそちらを探している人がいたらそれとは別の話です。）
データベースプラットフォームD-Oceanを使ってみた

#こんにちは
初投稿です。まっつんと言います。東京大学工学部システム創成学科システムデザインアンドマネジメントコースに在籍してます。
この記事では、今学科でやっている基礎プロジェクト（大規模データ分析）という授業で学んだことを書いていきます。
#データベースとは
データベースについては、僕自身詳しくはわかっていませんが、[こちらの記事](https://qiita.com/sntkazu/items/777c4e88bf90a5560e3d)などに詳しく書いてあります。

#D-0cean
[D-Ocean](https://sdp.docean.io)はGoogleが作ったデータベース、BigQueryを操作するためのプラットフォームです。2019年2月に出来たばかりのようです。

D-Oceanのページ↓
<img width="1101" alt="スクリーンショット 2019-04-11 15.09.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376011/5d11aa69-5f77-8673-c0aa-adc7cc15ff39.png">

どれかのデータをクリックすると、SQLを入れるボックスが出てきます。SQLはデータベースの操作をするための言語です。後々、SQLのメモ記事もあげる予定です。

実際にSQLを入れてクエリを投げた結果↓
<img width="993" alt="スクリーンショット 2019-04-11 15.10.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/376011/dd2597b9-92d7-7ef3-3e6c-123609e8be09.png">

出来たばかりということと、僕が他のデータベースプラットフォームを使ったことがないというのもあり、D-Oceanが使いやすいのかはわかりませんが、見た目はかっこいいと思います。機会があったら積極的に使っていこうと思います。
Githubにdeploy用の鍵を追加する


リポジトリごとに設定できて、git cloneとかができる。
そんなものがあったなんて知らなかった。専用のユーザーとかを作らなくて(・∀・)ｲｲ!!

やり方はデプロイユーザーで鍵を作って登録するだけです。
GHEにもあるのかなぁ。

# 1. デプロイユーザーで鍵を作ります

すでにある場合はソレを使ってもよい。

```bash
[ec2-user@ip-10-21-12-201 ~]$ ssh-keygen -t ed25519
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/ec2-user/.ssh/id_ed25519): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/ec2-user/.ssh/id_ed25519.
Your public key has been saved in /home/ec2-user/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:/qSeuz07bmLo+8coz9FLr1SGQN8OR3d2Ow3yxyte4/c ec2-user@ip-10-21-12-201.ap-northeast-1.compute.internal
The key's randomart image is:
+--[ED25519 256]--+
|        .   o o +|
|       . . o + =+|
|        . o o .o+|
|         . =   .o|
|        S . +. + |
|       . . o. + .|
|       .oo=  . ..|
|      o.+X*o    o|
|     .oBXBB=.   E|
+----[SHA256]-----+
```

# 2. 公開鍵をgithubに登録します。

SettingsからのDeploy keysからのAdd deploy key

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/13685f94-261f-a4bd-945c-9de97ce315d2.png)

こんな感じになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/79c06c61-484c-9899-0679-f499f5fd3bc3.png)



# 3. clone pullできます。

```bash
[ec2-user@ip-10-21-12-201 workspace]$ git clone git@github.com:mercury-inc-cc/gascenter.git
Cloning into 'gascenter'...
The authenticity of host 'github.com (192.30.255.113)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
RSA key fingerprint is MD5:16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.255.113' (RSA) to the list of known hosts.
remote: Enumerating objects: 368, done.
remote: Counting objects: 100% (368/368), done.
remote: Compressing objects: 100% (239/239), done.
remote: Total 2631 (delta 187), reused 288 (delta 115), pack-reused 2263
Receiving objects: 100% (2631/2631), 4.98 MiB | 6.22 MiB/s, done.
Resolving deltas: 100% (744/744), done.
[ec2-user@ip-10-21-12-201 workspace]$ ll
total 0
drwxrwxr-x 9 ec2-user ec2-user 277 Mar 12 08:20 gascenter
```
push権限もつけられるみたい。いるの？いるか？いらんような？




GHEにもありました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/6e4c3b68-add7-fceb-8bf3-b43f0278ef75.png)
android lintで javax.xml.bind.JAXBException がでる

新しいPCを手に入れたぞ! (社用)

AndroidLintをCIに入れようと思って、ローカルでLintを回そうとしたら謎のエラーが出て詰まった。


```
./gradlew lint --stacktrace
...(省略)
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
```

Android Studioのinspectは通るのになんでや...

と小一時間調べた結果、ローカル環境でPathが通っているJavaのバージョンがよくないらしい。
https://sun0range.com/information-technology/jaxb-exception

Android StudioはビルトインのJavaを使っているからIDEでのInspectは問題ないけど、
gradlewスクリプトで実行するとグルーバルにPATHが通っているJavaが使われるのかな？

### 対処方法
以下を参考にJavaのバージョン下げた。

https://qiita.com/seijikohara/items/56cc4ac83ef9d686fab2

jenvとか使えばここら辺楽になるのかしら。。。

(javaのバージョン管理システムって使いづらかった印象あるから入れてない)
Python で 1次元的 2次元リストを 1次元化［スニペット的備忘録的に］

CSV から 1次元リストを読み込んだと思ったらなぜか 2次元だった：

```
[[1, 2, 3, 4, 5]]
```
これを 1次元化したい：

```
[1, 2, 3, 4, 5]
```
とりあえず，最小コーディング労力で 1次元化したかった自分的に最良の方法は「元リストの第一要素を新変数に格納する」：

```python
>>> ls = [[1, 2, 3, 4, 5]]
>>> ls_new = ls[0]
>>> print(ls_new)
[1, 2, 3, 4, 5]
```
こんなコードを記事にするのは申し訳ないと思うのですが，作業中は心理的盲点？をつかれたのか，若干ハマってしまったので，備忘録的に書き残します

ハマってしまった一因は，

```
[[1, 2, 3], [4, 5]]
```
のような「普通の」2次元リストを 1次元化する無数の方法の中から，最小コーディング労力のものを探そうとしてしまったことでした．教訓があるとすれば「ググるだけでなく自分でも考えよう」でしょうか

ちなみに上記のような「普通の」2次元リストの場合，最小コーディング労力という観点から，
「元 2次元リストで 2重に iterate し，要素を新 1次元リストに順次格納する」
というコンセプトのコードを，某 overflow あたりで見た記憶があるのですが，再発掘できなかったので，これも自分への備忘として残しておきます

```python
>>> ls = [[1, 2, 3], [4, 5]]
>>> ls_new = []
>>> for i in ls:
...     for x in i:
...         ls_new.append(x)
... 
>>> print(ls_new)
[1, 2, 3, 4, 5]
```
C++ Builder XE4 > debug > 実装: 処理時間(msec)を計測して返す関数 > debug_getElapsedTime()

```txt:動作環境
C++ Builder XE4
```

### 処理時間を計測したい

- 処理時間を計測したい
- 処理の合間のコール文を１行に抑えたい
    - 処理の合間に複数行のデバッグ用処理を入れたくはない

### 実装

static定義したpreTime に「前の時刻」を保持することで、コール文を一行に圧縮する。


```cpp
DWORD __fastcall TFormMain::debug_getElapsedTime(void)
{
	static DWORD preTime = 0;

	if (true) {

	}
	DWORD elapsed;
	if (preTime > 0) {
		elapsed = GetTickCount() - preTime;
	} else {
		elapsed = 0;
    }
	preTime = GetTickCount();

	return elapsed;
}
```

### 使用例

```cpp
DWORD elapsed; // 経過時間(msec)

elapsed = debug_getElapsedTime();
// 何かの処理
elapsed = debug_getElapsedTime();
int nop; // for breakpoint
```

nop(No Operation)の行でブレークポイントによる停止をすると、「//何かの処理」の処理時間を計測できる。


### 備考

- 処理時間計測の精度は追及してはいない
    - だいたいのオーダーが分かればよい程度
システム開発における設計書等々を作成するためのツール

# 建前～現場の実情として
実際各部署等の現場は回っていると、独自Excelが様々な形で管理されて
作成者本人しか操作方法や手順がわからないものが跋扈している。


そんな中で自分が書類を作る際、作成資料に合わせて利用しているサイトをまとめた。
主に無料ライセンスで使えるものが大半である。
(有料ライセンス使ってみたいが、身銭切ってやる勇気が今の所無いため)
いい方法等があれば随時コメント入れていただければ記事に載せてより良くしていきたい。



##ER図
サーバーエンジニアの方々が求める資料がこれかと思う。
まあBtoB系の仕事ではビックデータの保管から予測分析,帳票の出力などは
ここが理解できていないと難しい。

自分が使っているのは__A5:SQL Mk-2__である。

サンプル
![2019-04-11_17h48_07 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46786/04044281-144c-e3cc-bd04-b8067a37347a.png)

特に設計が終わっていてDBに反映済ならばリバース生成等で定義一発で戻せるので便利。
後は共通列の排除等も出来るので「登録者」「更新者」みたいなデータあってもビジネスロジックにはいらないのでまとめて設定で
消せるのは大きい。



## ガントチャート
PM関係や上流工程を行う人は恐らく必要な資料。
流行りのアジャイル開発でもショートスパンでマイルストーンの生成は必要かと思うので、
PJによるが、２週間単位等で作るのが良さそうなのでは？
ちなみに現場はウォーターフォールなので、数ヶ月とかザラである。
そんな中のオススメは__みんなでガント.com__である。

サンプル
![2019-04-11_17h56_34 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46786/f0fb8a09-af41-ea3d-3a34-4e81c4377f0e.png)


大分類中分類の階層切り分け可能、
担当者記載可能、
色可能
まあ基本的な要素は押さえていますので無償版でも全然使いやすそうです。
ちなみに、上司にはこれのURLだけ送りつけて進捗見てもらったりたまにします。

## クリティカルパス図(プロジェクトマップ)
上記記載のガントチャートはPJを外部から見るマネージャや客先に対して有効な図です。
これは、わかりやすさや「結局いつ終わるん？」といったものが明確でわかりやすいからです。

ただ、段階を踏んで開発を進める場合、工程の関連性が理解できる必要があります。
EX)
>  PM「予定表組んだから各自確認しておいて」  
PG(SE) 「作業Bが終わらないと作業Aに入れないのでこのスケだと破綻してますよ」  

みたいなやりとりでスケの組み直し等は大いにあると思います。
特に少人数で回す場合はまあ、そこそこ踏ん張りでなんとかなりますが、請負等が発生する案件では
中々悲惨なことになります。

そこで各工程の関連性や順序性を記載した帳票が必要ですがオススメは__Mammoth Project__です。

![2019-04-18_14h58_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46786/cc51dfa5-cd4c-c28a-ed1b-a1006d7511d9.png)

タスクを追加した後に、関連図の記載を割と直感的にかけるのでオススメです。
また、タスク記載後、ガントチャートやカレンダーにも反映されるので良いかなと
画像の場合、
Aタスク完了
↓
Bタスク,Cタスク並列可能
↓
Dタスク

みたいな形なので人を同時投入で効果が出るのはB,Cの作業時期かなと
目算が付けれますね。
使える人数がそんなにいない場合はなくてもまあ良いかと思いますが、
少し増えてくるとあれば、メンバー同士の意思疎通は容易になります。




---
続きはまた後日頑張って書きます。

もしこんなのあるよ等あればぜひ教えてほしかったりですコメントお待ちしております。
ECRにイメージをpushし、pullする

# ECRを使ってみた

ECRどんなものかな〜と思い、開発環境セットアップを楽にするのも含めてECR使ってみました！

## 使用環境

pushするPC: mint 19
pullするPC: ubuntu 16.04LTS

## 事前準備
- ビルドしたいイメージを用意する
- awscliを使えるようにしておく

## 基本的な流れ

AWSのドキュメントの通りにやればいいだけです。
[イメージのpush](https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/docker-push-ecr-image.html)

pushするPCでの手順
1. イメージをビルドする
2. レジストリの認証を行う
3. タグを打つ
4. pushする

pullするPCでの手順
1. レジストリの認証を行う
2. pullする

では順番に見ていきましょう。

## イメージをビルドする

こちらはECR関係ない手順ですが、一応。
Dockerfileを置いたディレクトリ以下で以下のコマンドをうつ。

```
$ docker build -t image_name
```

オプションは適宜追加してください。

# レジストリの認証

12時間の有効期限を持つキーを発行してログインします。

- awscliでECRにログインする

```
$ aws ecr get-login --region region --no-include-email
docker login -u AWS -p <password> https://<aws_account_id>.dkr.ecr.ap-northeast-1.amazonaws.com
```

- 上記コマンドの出力結果（docker login XXXX)をターミナルにコピペしてenter

```
Login Succeeded
```

これで成功。

## タグを打つ

こちらはdockerコマンドでの操作になります。
imagenameのあとにはるxxx.dkr.ecr.xxxはECRのマネジメントコンソール上からも取得できます。

```
$  docker tag image_name <aws account id>.dkr.ecr.<リポジトリのリージョン>.amazonaws.com/<ECRのリポジトリ名>
```
## pushする

GO!GO!

```
$ docker push <aws account id>.dkr.ecr.<リポジトリのリージョン>.amazonaws.com/<ECRのリポジトリ名>
```

## pullする

```
$ docker pull <aws account id>.dkr.ecr.<リポジトリのリージョン>.amazonaws.com/<ECRのリポジトリ名>
```

以上です！簡単ですね！！！
ruby nokogiriのインストールエラー

## Nokogiri嫌い

Ubuntu ruby2.5 ( rbenv利用 )

今回の（いつもの）Nokogiriインストール時のエラーです（抜粋）

```shell
$ bundle install --path vendor/bundle
...
Fetching nokogiri 1.10.2
Installing nokogiri 1.10.2 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

ERROR: cannot discover where libxml2 is located on your system. please make sure `pkg-config` is installed.

An error occurred while installing nokogiri (1.10.2), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.10.2' --source 'https://rubygems.org/'` succeeds before bundling.
```


#### 参考にしました

Installing Nokogiri
https://nokogiri.org/tutorials/installing_nokogiri.html

Ubuntu 14.04 LTSにnokogiriインストール失敗する時
https://qiita.com/ozy-san/items/0eb6c0a88a4cf8acc0ca

## 今回対処したこと

### 色々インストール

```shell
sudo apt install -y libxml2-dev libxml2 libxslt1.1 libc6-dev libc6 
sudo apt install -y build-essential patch zlib1g-dev libxslt1-dev
```

### pkg-config のインストール

aptでインストール

```shell
# エラーに書いてある gem install pkg-config を行なっても改善しなかった
sudo apt install pkg-config
```


### ruby2.5-devの利用（たぶん不要）

```shell
# sudo apt～ だとダメだった。rootユーザで実行
sudo su -
apt install -y autoconf bison
edit
rbenv install 2.5.0-dev
rbenv global 2.5.0-dev
gem install bundler
```

### システムライブラリの利用

```shell
bundle config build.nokogiri --use-system-libraries
```


## 成功

色々やって、うまくいきました。

`sudo apt install -y build-essential` や `sudo apt install pkg-config` あたりが重要と思います。
xcodeのビルドが反映されないとき

今回はひどい目に遭ったので書き留めておきます



タイトルの通り、xcodeのビルドが反映されませんでした。
キャッシュが残ってるとか、よくわからん原因があるのかなと思い調べてみたのですが、一般的な手法として書かれているのは

①xcodeを再起動
②OSを再起動
③xcode上の、product > clean build holderを(optionキーを押しながら）クリック
④DerivedDataの中身を削除(ググると出ます)

ここまでの情報は真っ先に出てきますが、それでもできなかった人が次に行き当たるのは恐らく

⑤ビルドのターゲットの指定ミス(xcode上の左上のプロジェクト名をクリックして、edit scheme > Buildで確認）

最初はこれかなと思いました。
debug buildはできるのにrelease　buildはできなかったので、ビルドしてるのはリリースでも、実機に落とされてるのはデバッグのビルド結果だったり。。。。
なんて思いましたが、別段異常なし


⑥edit scheme > Run > Zombie Objects のチェックを外す

![スクリーンショット 2019-04-11 17.45.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367893/01569e80-3ab0-81af-1e44-291eec21dbe3.png)


上の画像のZombie　Objectsです。
こいつを外したらなぜか直りました。
八方塞がりな人はやってみてください。

「EXIT　CODE　ERROR」的なエラーが出てきたときに、デバッグに使えると聞いてオンにした記憶があります。（すぐに原因がわかったので使わなかったのですが）

もう散々です。。。
SassをVisualStudioCodeで書きたい

VisalStudioCodeでSassを利用する場合、rubyは不要で、
拡張機能「Easy Sass」をインストールするだけ。

デフォルトではscssファイル保存時に、cssを生成してくれる。

↓このサイト参照
[VSCode(Visual Studio Code)で簡単にSASS/SCSSファイルのコンパイルができる拡張機能「Easy Sass」がお勧め](https://www.karelie.net/vscode-easy-sass/)