OmniAICreator/Qiita-1.07M huggingface dataset:
Webで長押し処理を実装する

Reactなどを使っているWebアプリでたまにボタンを長押しできるようにしたいことがありました。
onMouseDownでフラグを立てて、onMouseUpでフラグを折るだけかと思ったらモバイルで色々困りました。

## 何が困ったか

Webなので長押しした先に画像があれば画像を保存メニューを出すし、テキストがあればコピーやペーストのメニューを出してくる。
それらを停止させねば必要なイベントにたどり着けませんでした。

iOSとデスクトップはCSSで制御できるという情報はすぐに見つかったけど、Androidは見つからず。
結論としてはonContextMenuを停止させる必要がありました。

今後他の人が同じような状況に陥らないように解決手段をおいておきます。

## 解決

JSとCSS、両方で対応することになります。

### JS

使っていたのがReactなのでJSXを使っていますが、
VueでもVanilla JSでも同じことができると思います。

```Javascript
  <button
    onClick={this.onClickHandler}
    onMouseDown={this.onMouseDownHandler}
    onMouseUp={this.onMouseUpHandler}
    onTouchStart={this.onMouseDownHandler}
    onTouchEnd={this.onMouseUpHandler}
    onContextMenu={e => {
      e.preventDefault();
    }}
  >
    <img src="/images/caret-right.svg" alt="" />
  </button>
```

### CSS

色々書いてますがメニューやコピー機能を停止させてます。
AndroidもCSSで対応できたら楽だったのに…。

```css
.long-touch-button {
  user-select: none;
  -moz-user-select: none;
  -khtml-user-select: none;
  -webkit-user-select: none;
  -ms-user-select: none;
  -webkit-touch-callout: none;
}
```
PowershellのString型をBoolean型へ変換


## `true`という文字列を代入
```
$a = "true"
$a.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object
```

## `[System.Convert]::ToBoolean($a)`でBooloan型へ変換
```
$TrueorFalse = [System.Convert]::ToBoolean($a)
$TrueorFalse.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Boolean                                  System.ValueType
```
kotlin elvis演算子 ?: のあとにブロック{}を使用する

elvis演算子のあとにブロックを書いてごにょごにょ初期化したいときの書き方。
`run`を使うのがポイント。

```
val hoge:Int = fuga ?: run {
  val piyo = 1
  piyo = 2
  piyo // fuga が null なら hoge に piyoが代入される
}
```
Git補完 bash

## hub

```
$ brew install hub
$ curl https://raw.githubusercontent.com/github/hub/master/etc/hub.bash_completion.sh -o ~/.hub.bash_completion.sh
$ chmod a+x ~/.hub.bash_completion.sh
```

## git-completion
```
$ curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash -o ~/.git-completion.bash
$ chmod a+x ~/.git-completion.bash
```

## git-prompt
```
$ curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh -o ~/.git-prompt.sh
$ chmod a+x ~/.git-prompt.sh
```

## .bashrc か .bash_profile を編集

#### 例 `~/.bashrc`
```
eval "$(hub alias -s)"
alias git='hub'
alias gco='git checkout'
source ~/.git-completion.bash
source ~/.hub.bash_completion.sh
source ~/.git-prompt.sh
GIT_PS1_SHOWDIRTYSTATE=1
GIT_PS1_SHOWUPSTREAM=1
GIT_PS1_SHOWUNTRACKEDFILES=1
GIT_PS1_SHOWSTASHSTATE=1
PS1='\W $(__git_ps1 "[%s]") $ '
```

## 確認
```
$ source ~/.bashrc

別タブで

カレントディレクトリ (ブランチ名) $

カレントディレクトリ (ブランチ名) $ git p
p              pr             pull           pull-request   push 
```

プロンプトに現在のブランチとステータスが追加されGit(hub)コマンドの補完も効いていると思います。
positionセレクタを指定した時の画像のセンタリング方法

#はじめに

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているsaijoと申します！

プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

ここではposition:absolute;と指定した要素のセンタリング方法をご紹介していきます！



#まずは配置を指定する
まずは挿入したい画像の位置（最初は高さのみ）を指定します。

```html:index.html
<div class="top-wrapper">
   <img class="top-image" src="miraidenshi.png">
</div>
```

```css:style.css
.top-wrapper {
   width:1140px;
   position:relative;
}

.top-image {
   position:absolute;
   bottom:0px;
}
```

これでtop-wrapperクラスの左下に接するように画像が配置されたかと思います！



#いよいよセンタリング
次に先ほどの状態から画像を左右対称の位置に持っていきたいと思います。
style.cssのtop-imageの中に、

```css:style.css
.top-image {
   position:absolute;
   bottom:0px;
   left:0px;
   right:0px;
   margin:0px auto;
}
```
とプロパティを指定してみましょう！するとセンタリングができましたね！

#原理とまとめ
通常leftとrightを併用することは無いかと思われますが、

>* left, width, rightがauto以外の値である。
>* margin-leftとmargin-rightがautoである。

CSSでは上記の特殊な条件を満たす場合、左右のマージンが等しくなるよう自動的にマージンを生成するといった仕様があるみたいです。

CSSではまだまだこのような一風変わった文法事項が多そうです。全て暗記していくのは大変ですが、今回のような比較的実践的なものは覚えていくようにしていきましょう！
ABC139参戦記（A問題〜D問題）

先日行われたABC139に参加したのでコンテスト中のあれこれをメモしておこうかと思います。使用言語はpython3、結果はABCD4完で1623位(順位表情報)でした。コンテストへのリンクはこちら→https://atcoder.jp/contests/abc139

#A - Tenki
各$S[i],T[i]$の値を比較して同じだった回数をカウントしていけば良さそうです。提出コードを次のようになりました。

```python:ABC139_A.py
S = str(input())
T = str(input())
cnt = 0
for i in range(3):
    if S[i] == T[i]:
        cnt += 1
print(cnt)
```

#B - Power Socket
電源タップを一つ増やすと、元々あった差込口が一つ減り、$A$個増えます。つまり$A-1$ずつ増やしていって$B$を超えるまでに追加するタップの数をカウントしていきます。提出コードは以下になります。

```python:ABC139_B.py
A,B = map(int, input().split())
cnt = 1
ans = 0
while cnt < B:
    cnt += A-1
    ans += 1
print(ans)
```

#C - Lower
左から順番に見ていって広義単調減少になっている箇所の長さを調べ、その最大値を求めれば良さそうですね。このタイプの問題はAtCoderで何度か見かけたような気がします。
![IMG_2EDE7B2068DE-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478399/effc1283-5249-dddf-6399-43f8d0fd0599.jpeg)

 ```python:ABC139_C.py
N = int(input())
H = list(map(int, input().split()))
ans = 0
cnt = 0
for i in range(N-1):
    if H[i] >= H[i+1]:
        cnt += 1
    else:
        ans = max(cnt,ans)
        cnt = 0
ans = max(cnt,ans)
print(ans)
```

#D - ModSum
{$N, 1, 2, 3, ... , N-1$}にすると最大になりそうだなぁと思いつつも一応$N=4$くらいまで実験してみました。とりあえずここまでは最大値をとるようなのでそのまま実装してみたところACでした。

```python:ABC139_D.py
N = int(input())
if N == 1:
    print(0)
elif N == 2:
    print(1)
else:
    print((N * (N-1)) // 2)
```

#E - League
1から順番に見ていって試合ができなかったら次の日に...という貪欲(?)な解法で実装してみたのですがWAが出たりTLEが出たりしてうまくいきませんでした...精進します...

#反省
今回はD問題まで通すことができました。時間配分は大体A-3分(ロードに時間がかかった)、B-4分、C-7分、D-14分という感じでした。Dでもうすこし思い切りよく実装してしまえばもっとパフォーマンス上がったかなぁと思います(あんまりよろしくはないですね)。
MySQL関係まとめ

## コネクションプール

* [DNSラウンドロビンで負荷分散しているDB（Aurora等）にコネクションプールを使って接続すると設定次第で負荷分散ができないっていう話と解決法](https://qiita.com/k_hoso/items/73443cc38ab0ae75ac2c#)

## 文字コード

* [MySQLの文字コードUTF８対応](https://qiita.com/k_hoso/private/0607e711b7b16a3148de)

## Python

* [Python3でMySQLdbを求められたときの問題と解決](https://qiita.com/k_hoso/items/b47d78df5e7b92d35bfa)
* [Lambda上でmysqlclientを動かす](https://qiita.com/k_hoso/items/6bab9eb288cba01cdb18)
* [Linux上でPython3でMySQLへアクセスするためのyumコマンド](https://qiita.com/k_hoso/items/578503e10b2bbbcc9c1c)
* [libmysqlclient.so.18がないといわれる](https://qiita.com/k_hoso/items/f1a2b42e85099d8bc9fb)

## 小ネタ

* [MySQLで採番する（採番用のテーブルを作る）](https://qiita.com/k_hoso/items/9f7c1f4d1b438b3588e8)
* [MySQLのデータベースのバックアップとリストア](https://qiita.com/k_hoso/private/a9af7611a090061168f5)
* [MySQLに接続すると"java.sql.SQLException: The server time zone value"が出る](https://qiita.com/k_hoso/items/230e720b79317939da60)
ubuntu内でHeroku CLIをインストールできない方(certificate has expired or is not yet valid))

# Heroku CLIをインストールする

```ruby:qiita.rb
vagrant@ubuntu-bionic:~$ sudo snap install --classic heroku
error: cannot perform the following tasks:
- Download snap "core" (7396) from channel "stable" (Get https://fastly-global.cdn.snapcraft.io/download-origin/fastly/99T7MUlRhtI3U0QFgl5mXXESAiSwt776_7396.snap?token=1567764000_9696ad515c77cc35b28a63cdd87f4d8b98845441: x509: certificate has expired or is not yet valid)
```

## 原因
ローカルとの時刻が合っていない可能性が高い。
参照記事
https://qiita.com/celeron1ghz/items/c8a9276d7d71e4f52760




# 解決策
NTPサーバで現在時刻の取得を行う。
Ubuntu 18.04 LTS環境では、ntpdateコマンドがデフォルトでインストールされていないそうなので、インストールを行う

```
vagrant@ubuntu-bionic:~$ sudo apt install ntpdate
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following NEW packages will be installed:
  ntpdate
0 upgraded, 1 newly installed, 0 to remove and 24 not upgraded.
Need to get 51.8 kB of archives.
After this operation, 183 kB of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu bionic-updates/universe amd64 ntpdate amd64 1:4.2.8p10+dfsg-5ubuntu7.1 [51.8 kB]
Fetched 51.8 kB in 2s (33.7 kB/s)                    
Selecting previously unselected package ntpdate.
(Reading database ... 90216 files and directories currently installed.)
Preparing to unpack .../ntpdate_1%3a4.2.8p10+dfsg-5ubuntu7.1_amd64.deb ...
Unpacking ntpdate (1:4.2.8p10+dfsg-5ubuntu7.1) ...
Setting up ntpdate (1:4.2.8p10+dfsg-5ubuntu7.1) ...
Processing triggers for man-db (2.8.3-2ubuntu0.1) ...
```


ntp.nict.jpと時刻を合わせる

```ruby:qiita.rb
vagrant@ubuntu-bionic:~$ sudo ntpdate ntp.nict.jp
 6 Sep 06:14:41 ntpdate[5718]: step time server 133.243.238.163 offset 130672.522992 sec
```
## インストールとversionの確認



```ruby:qiita.rb
vagrant@ubuntu-bionic:~$ sudo snap install --classic heroku
2019-09-06T06:16:33Z INFO Waiting for restart...
heroku v7.29.0 from Heroku✓ installed
vagrant@ubuntu-bionic:~$ heroku --version
heroku/7.29.0 linux-x64 node-v11.14.0
```

参照記事
(https://www.atmarkit.co.jp/ait/articles/1906/21/news013.html)

一助になれば幸いです。
OpenCV 地面空間認識、駐車場監視、駐車空間検知

## 駐車スペースを自動チェックする

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/SszV59YBn_o/0.jpg)]

## コード
https://www.pyimagesearch.com/2015/06/15/install-opencv-3-0-and-python-2-7-on-osx/
【JavaScript】「分割代入」について

最近paizaで問題を解いていて下のようなコードをずっと書いていました。

```javascript

const line = '1 2 3';
let a = line.split(' ')[0];
let b = line.split(' ')[1];
let c = line.split(' ')[2];
```

このコード分割代入を使用するとかなりすっきりします。

```javascript

const line = '1 2 3';
let [a, b, c] = line.split(' ');
```

## 分割代入とは

[MDN web docs](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment)
>分割代入 (Destructuring assignment) 構文は、配列から値を取り出して、あるいはオブジェクトからプロパティを取り出して別個の変数に代入することを可能にする JavaScript の式です。

## 配列の分割代入

配列の分割代入は冒頭の分割代入と同じで  
左辺に配列リテラルのような変数宣言を書き、右辺に配列を書きます。

```javascript

const arr = [1, 2, 3];
const [a, b, c] = arr;

console.log(a, b, c);
// 出力　1 2 3
```

配列数が足りない場合は```undefined```となります。

```javascript

const arr = [1, 2];
const [a, b, c] = arr;

console.log(a, b, c);
// 出力　1 2 undefined
```

## オブジェクトの分割代入

配列の分割代入と同じで  
左辺にオブジェクトリテラルのような変数宣言を書き、右辺にオブジェクトを書きます。

```javascript

const languages = {
  ja: '日本語',
  en: '英語'
};
const { ja, en } = languages;

console.log(ja, en);
// 出力　日本語 英語
```

## レスト構文と分割代入

レスト構文と組み合わせることによって残りの値を集約することが出来ます。
日本では残余代入と言うようです。

レスト構文に関してはこちら。
[【JavaScript】「スプレッド構文」と「レスト構文」について](https://qiita.com/kamijodev/private/89543ca267ac9ad51529)

```javascript

const arr = [1, 2, 3, 4, 5];
const [a, b, ...c] = arr;

console.log(a, b, c);
// 出力 1 2 [3, 4, 5]
```
【JavaScript】「スプレッド構文」と「レスト構文」について


## はじめに
 
どちらも同じ演算子「...」を利用する為  
混乱するかもしれないので初めに簡単に違いを説明すると。

| スプレッド構文 | レスト構文 |
|----------------|------------|
| 展開           | 集約       |

だと個人的には考えていますです。  

これを踏まえた上で詳しく見ていきましょう。

## スプレッド構文とは

[MDN web docs](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Spread_syntax)
>スプレッド構文を使うと、関数呼び出しでは 0 個以上の引数として、Array リテラルでは 0 個以上の要素として、Object リテラルでは 0 個以上の key-value のペアとして、Array や String などの iterable オブジェクトをその場で展開します。

ようするに 関数呼び出しの引数, 配列リテラル, オブジェクトリテラル に対してオブジェクトを展開出来るって事ですね。  
実際にコードを書いていきます。

### 関数呼び出し

例 配列の中から最大値を取得したい場合

```javascript

const nums = [3, 1, 4, 1, 5, 9, 2, 6];

console.log(Math.max(...nums));
// 出力 9
```

また、何番目の引数でも利用することができます。

```javascript

const nums = [3, 1, 4, 1, 5, 9, 2, 6];

console.log(Math.max(0, ...nums, 20, 8));
// 出力 20
```

new演算子の引数にも使用できます。

```javascript
const dateFields = [1970, 0, 1];
const d = new Date(...dateFields);

console.log(d);
//出力 Thu Jan 01 1970 00:00:00 GMT+0900 (日本標準時)
```

### 配列リテラル

例 配列を複製したい場合

```javascript

let arr    = [1, 2, 3];
let newArr = [...arr];

console.log(newArr);
// 出力　[1, 2, 3]
```

例 配列を結合したい場合

```javascript

let arr1   = [1, 2, 3];
let arr2   = [4, 5, 6];
let newArr = [...arr1, ...arr2];

console.log(newArr);
// 出力　[1, 2, 3, 4, 5, 6]
```

### オブジェクトリテラル

例 オブジェクトを複製したい場合

```javascript

const obj = {
  name: 'kamijo',
  age: 22
}
const newObj = {...obj};

console.log(newObj);
// 出力 {name: 'kamijo', age: 22}
```

## レスト構文とは

スプレッド構文とは逆で  
複数の要素を集約して 1 つのオブジェクトにまとめることが出来ます。
関数の引数や分割代入での不特定多数の値を配列として受け取る際に利用します。  

分割代入に関してはこちら。
[【JavaScript】「分割代入」について](https://qiita.com/kamijodev/private/ca007a264a3a0f1d1c8b)

### 可変長引数の関数

```javascript

function outputArgs(...args) {
  for(const a of args){
    console.log(a);
  }
}
outputArgs('a', 'b', 'c', 'd');
// 出力 a  b  c  d
```

### 分割代入(配列)

```javascript

const arr = [1, 2, 3, 4, 5];
const [a, b, ...c] = arr;

console.log(a, b, c);
// 出力 1  2  [3, 4, 5]
```

### 分割代入(オブジェクト)

```javascript
const obj = { a: 1, b: 2, c: 3, x:10 };
const { x, ...props } = obj;

console.log(x);
// 出力 10
console.log(props);
// 出力 {a: 1, b: 2, c: 3}
```

### おまけ

文字列にも使えます。

```javascript

const [a, b, ...c] = 'aiueo';
console.log(a, b, c);
// 出力 a i ['u', 'e', 'o']
```
python Bottleの基本5 独自のデコレーター

デコレータは、関数の変更をせずに機能を追加する機能を言います。
例えば関数Test()は

```test.py
def Test():
    return "Hello World"
```
これは、"Hello World"の文字列を返す関数です。

```H1_deco.py
def H1(f):
    def f0(*a,**b):
        return "<h1>%s</h1>"%f(*a,**b)
    return f0
@H1
def Test():
    return "Hello World"
print(Test())
```
H1関数は、h1タグを追加するデコレート関数です。
実行すると

``` result
<h1>Hello World</h1>
```
を返します。

下記は、デコレータにパラメータを渡す例です。

```tag0.py
def tag(t):
    def f0(f):
        def f1(*a,**b):
            return "<%s>%s</%s>"%(t,f(*a,**b),t)
        return f1
    return f0
@tag('div')
def test():
    return "Hello World"
print(test())
```
この例は、tag関数にタグ名を渡す例です。
実行結果は、下記の通りです。

```
<div>Hello World</div>
```

```tag1.py
def tag(t):
    def f0(f):
        def f1(*a,**b):
            return "<%s>%s</%s>"%(t,f(*a,**b),t)
        return f1
    return f0

@tag('div')
@tag('h1')
def test():
    return "Hello World"

print(test())
```
デコレータを2重にした例です。

```result
<div><h1>Hello World</h1></div>
```
C++ Builder 10.2 Tokyo > FastReport > TfrxLineViewerで線を引く > performance:20万本の描画は不可能

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3
Fast Report VCL 5
```

### 概要

- FastReportを使って動的に線を描画する
    - デザインでなく、コードで追加
- 20万本の線の描画の事前調査

### 参考

4本の赤い線を引く実装例 (ただし、ロシア語)
https://www.fastreport.ru/ru/forum/index.php?showtopic=8995

Delphiコードを参考に、C++ Builderでの実装を検討した。

### 実装

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

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include "frxClass.hpp"
#include "frxExportPDF.hpp"
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TfrxPDFExport *frxPDFExport1;
	TfrxReport *frxReport1;
	TButton *Button1;
	void __fastcall frxReport1BeforePrint(TfrxReportComponent *Sender);
	void __fastcall Button1Click(TObject *Sender);
private:	// ユーザー宣言
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
```

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

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "frxClass"
#pragma link "frxExportPDF"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::frxReport1BeforePrint(TfrxReportComponent *Sender)
{
	static TfrxLineView *lines[200];

	for(int idx=0; idx < 200; idx++) {
		lines[idx] = new TfrxLineView(Sender);
		lines[idx]->SetBounds(10, 10 + idx * 3, 30, 2);
		lines[idx]->Printable = true;
		lines[idx]->Frame->Color = clRed;
		lines[idx]->Frame->Width = 2;
	}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	frxPDFExport1->FileName = L"test.pdf";
	frxPDFExport1->ShowDialog = false;
	frxReport1->PrepareReport(true);
	frxReport1->Export(frxPDFExport1);
}
//---------------------------------------------------------------------------
```


### 実行例

生成されたPDFファイルのキャプチャ。
緑色の線はもともとFastReportのデザイナで自分で追加しておいたもの。
赤の線が動的に追加した線。
(200本を下方向にずらしながら追加)

![2019-09-06_15h33_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/d89ee12d-2746-94ea-3c44-0f6be1d065fe.png)


### Performance

200本の線を描画したが、200本を超すと処理が固まるようになった。
FastReportにてTfrxLineView を動的に追加する本数としては200本未満になりそう。

20万本の描画は無理と分かった。
PHPのストリームがわからない

[プログラミング始めて1か月の超初心者がPHP7技術者認定初級試験を受けてみた]()で勉強していたとき、ストリームという単語が出てきた。
[file_get_contents() ](https://www.php.net/manual/ja/function.file-get-contents.php)の第三引数にストリームコンテキストを渡すという話の中で。
その際にあまり理解できなかったので、自分なりに調べて、(正しいかどうかは別として)自分なりに理解した内容をまとめてみました。

## 私なりの理解
### ストリーム
データが出入りする、メモリやファイル、ネットワーク等をプログラム中で扱えるように抽象化したもの。

### ストリームラッパー
ただし、"ファイルとネット"のように異なるものでは扱い方が異なる。そこで、ストリームラッパーを使用して、file_get_contents() 等、同一の関数で、同様に扱えるようにしている。

### ストリームコンテキスト
そして、実際にファイルやネットを扱う際に、どのように扱うのかを指定するのがストリームコンテキスト。
例えば、HTTP で扱うときには GET なのか POST なのかを指定したり、リクエストのヘッダを指定したりできる。


## 参考にさせていただいたもの

### 1. [PHPマニュアル](https://www.php.net/manual/ja/intro.stream.php)
> ストリームは、 ファイル、ネットワーク、データ圧縮などに関する、 共通した一連の関数群と利用法を持つ操作の一般化の手法です。 もっとも単純な定義では、ストリーム というのは、ストリーミング可能な動作を体現する resource オブジェクトといえます。つまり、ストリームには線的に読み出したり、 あるいは書き込んだりすることが可能で、かつ、 ストリーム上の任意の場所に fseek() できる場合もあります。

……難しくてよくわかりません。


### 2. [初めてのPHP](https://www.oreilly.co.jp/books/9784873117935/)
> PHPエンジンがプログラムとデータをやり取りするための基盤となる仕組みをストリームと呼びます。

……なんとなくわかった気になれる表現。


### 3. [「PHPストリーム概説」 hanawaさん](http://hnw.jp/pdf/phpcon-20100925.pdf)
> 外部データに対するI/Oを透過的に扱う
何でもファイルのように扱える

……ちょっとずつ見えてきた気がします。


### 4. [IBM チュートリアル「PHPの学習」](https://www.ibm.com/developerworks/jp/opensource/tutorials/os-phptut3/index.html)
> ファイルなどのリソースに実際にアクセスする方法は、ファイルが保管されている場所とファイルを保管する方法によって決まります。ローカルにあるファイルにアクセスする方法と、リモート・サーバー上にあるファイルに HTTP や FTP によってアクセスする方法は、まったく違います。
幸い、PHP では「ストリーム・ラッパー」を使用できます。たとえどこにあるリソースを呼び出したとしても、PHP で使用可能なラッパーがあれば、そのラッパーが呼び出し方法を見つけ出してくれます。

なるほど、ストリームラッパーについてイメージを掴めた気がします。


### 5. [YYPHP#87「PhpStorm有効活用術」「自社サービス開発と受託開発の違いとは？」「ポートフォリオにどんな内容が必要？」「PHPのストリーム」](https://qiita.com/suin/items/93dd258fccfe926bbba3#phpのストリーム)
> 川からちょっとずつデータを取り出して処理するのがPHPのストリーム
PHPではfileの読み込みがストリーム処理

ストリームという名前の理由。


### 6. [【PHP】ストリームってなに？](https://qiita.com/tkek321/items/f1acd84569aca353ed9e)
>入出力を扱う機能。
CSVを1行ずつ読み込んで、DBに保存したりするイメージ
※file_get_contensはPHPの関数としてはストリーム処理ではないが、file_get_contensの内部（C言語レベル）ではストリーム処理を行なっている（多分）。

[fgetcsv() ](https://www.php.net/manual/ja/function.fgetcsv.php)で一行ずつ読み込むイメージ。
[file_get_contents() ](https://www.php.net/manual/ja/function.file-get-contents.php)についても補足されています。


### 7. [IT用語辞典](http://e-words.jp/w/%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%A0.html)
> プログラミングの分野では、データの入出力全般を扱う抽象的なオブジェクトやデータ型を意味する場合が多い。データが出入りする何らかの対象（メモリ領域やファイル、ネットワークなど）をプログラム中で扱えるように抽象化したもので、接続や切断、書き込みや読み込みなどを簡易な操作で行うことができる。

オブジェクトだと思うとかなりスッキリするのですが、これで理解してしまって良いのでしょうか・・・？

## さいごに
かなり勝手に納得した気になっていますが、これで正しいのかどうかは正直わかりません。
正しい理解をご指摘いただけますと大変助かります。

[初めてのPHPを読んで詳細に調べたくなったところまとめ](https://qiita.com/desho/items/1c7dfec14c9c79630f3c)でストリーム以外についてもまとめています。
【ffmpeg】ffmpegコマンドの備忘録(タイムラプス、切り抜き、アニメGIF、ビットレート指定、コーデック、音消し、手振れ補正、明るさ）

# 概要
- ffmpeg カンペです
- （必要に応じて適宜追加）

## タイムラプス風

以下のようにする

**例**

20倍速・・・**setpts=PTS/20**
15FPS・・・**-r 15**

```
ffmpeg -i in.mp4 -filter:v "setpts=PTS/20" -pix_fmt yuvj420p -r 15 out.mp4
```
## 動画の一部分を切り抜く(矩形領域)

以下のように指定する

ffmpeg -i in.mp4 -vf crop=**width:height:left:top** -y d.mp4

width:切り抜く横幅
height:切り抜く高さ
left:切り抜く矩形の左上のx座標
top:切り抜く矩形の左上のy座標

**例**
動画上の座標(0,0)から320x160の領域を切り抜く

```
ffmpeg -i in.mp4 -vf crop=320:160:0:0 -y out.mp4
```


# 動画の一部分を切り抜く（指定時間でトリミング）

以下のように指定する

ffmpeg -ss **開始時間(秒)** -i in.mp4 -t **トリミングしたい長さ(秒)** out.mp4

--ssは-i より前に書くのが吉

**例**
動画を10秒目から5秒間トリミングする

```shell:再エンコードあり
ffmpeg -ss 10 -i in.mp4 -t 5 out.mp4
```

```shell:再エンコードなし
ffmpeg -ss 10 -i in.mp4 -t 5 -vcodec copy out.mp4
```



## 動画からアニメーションGIFを作る

動画からキレイなアニメーションGIFを作るとき2段階で処理する

1.palette.png をつくる
2.アニメGIFを生成する

```
ffmpeg -i in.mp4 -vf fps=15,palettegen=stats_mode=diff -y palette.png
ffmpeg -i in.mp4 -i palette.png -lavfi fps=15,paletteuse -y out.gif
```

(-y は強制上書き）

## ビデオのビットレートを指定する

以下のように指定する

ffmpeg -i in.mp4 **-b** ビットレート(bits/s) out.mp4

ffmpeg -i in.mp4 **-b:v** ビットレート(bits/s) out.mp4

ffmpeg -i in.mp4 **-vb** ビットレート(bits/s) out.mp4



**例**

ビットレート 1200K に指定する

```
ffmpeg -i in.mp4 -b 1200K out.mp4
```

## ビデオコーデックを指定する

以下のように指定する

ffmpeg -i in.mp4 -vcodec **コーデック** out.mp4

**例**

```
ffmpeg -i in.mp4 -vcodec wmv2 out.wmv
```

おまけ：使えるコーデックを調べる

```
ffmpeg -codecs
ffmpeg -encoders
ffmpeg -decoders
```

## オーディオを消す

```
ffmpeg -i in.mp4 -vcodec copy -an out.mp4
```

## コントラスト、明るさ（輝度）、サチュレーションを調整する

**例**
明るさ(brightness,輝度) 0.1、彩度(saturation)1.5、コントラスト(contrast)1.5 に設定する

```
ffmpeg -i in.mp4  -vf eq=brightness=0.1:saturation=1.5:contrast=1.5 out.mp4
```

## Android Wearのウォッチ側のスクリーンキャプチャ(screenrecordでスマホ画面を録画する)した動画をffmpegでmp4にする

以下のようにする

画面を録画する

```shell
adb shell screenrecord --size 320x320 --o raw-frames /sdcard/out.raw
```

(--size は 幅(width)x高さ(height) で指定する)

スマホの画面を録画したファイルをPCにダウンロードする

```
adb pull /sdcard/out.raw
```

スマホの画面を録画したファイルをmp4に変換する

```
ffmpeg -f rawvideo -vcodec rawvideo -s 1920x1080 -pix_fmt rgb24 -r 10 -i out.raw -an -c:v libx264 -pix_fmt yuv420p out.mp4
```

### おまけ：Androidスマホのスクリーンキャプチャ

端末指定、録画時間指定でキャプチャ

```shell
adb -s CBXXXXXX shell screenrecord --bit-rate 40000000 --time-limit 120 --size 1080x1920 /sdcard/out.mp4
```

## 動画の上に画像をオーバーレイ、ロゴを入れるなど

以下のようにする

```
ffmpeg -i in.mp4 -i overray.png -filter_complex overlay out.mp4
```

## 音を消す

```
ffmpeg -i in.mp4 -vcodec copy -an out.mp4
```

## 手振れ補正

ステップ１.手振れ情報ファイル(transforms.trf)を生成する

```
ffmpeg -i in.mp4 -vf vidstabdetect -an -f null -
```

ステップ２．手振れ情報(transforms.trf)をつかって、手振れ補正済の動画を生成する

```
ffmpeg -i in.mp4 -vf vidstabtransform -y out.mp4
```
DDD Talk MeetUp #2 まとめとLT資料

昨日、2019年9月5日に 「DDD Talk MeetUp #2」というイベントを開催しました。
その名の通り、DDDに関してトークしようぜ？ というイベントで、当日は大盛況でした！

DDDトークもさることながら、イベント内の8本のLTがとても有益だったので資料をここにまとめておきます。

ところで、参加された方はぜひともアンケートの回答をよろしくおねがいしますね。
[2019\.9\.5 DDD Talk Meetup \#2アンケート](https://docs.google.com/forms/d/e/1FAIpQLSe1_heFs-gahNO15ePaKHu_uGBAXZee6ATKT4Pi6Lbw8X8RkQ/viewform) 


## この記事に書いてある3つのこと
1. イベントに関する簡単な統計
1. DDDコミュニティの関連リンク集
1. LTのタイトルと資料リンク(WIP)

## 1.  簡単な統計
### 応募人数と参加人数
- 応募総数は 140名
- 募集枠: 72名
    - LT枠: 7名
    - 一般参加枠: 65名
- 最終的な参加数:  68名(運営メンバー3名も含) 


### DDDに興味がある人や経験者がこの1年で増えたのでは？
- 厳密な比較はできませんが、この1年で裾野が広がったのではないかと思います！

![image.png (21.5 kB)](https://img.esa.io/uploads/production/attachments/6586/2019/09/06/21054/e3df5138-a2fb-4b50-91b5-22f2a8d1c1d4.png)


## 2. コミュニティの関連リンク集
- [DDD Talk MeetUp \#2 \- connpass](https://ddd-community-jp.connpass.com/event/141712/)
- [DDD Talk MeetUp \#2の様子 \- Togetter](https://togetter.com/li/1400278)
    - 会場でのトークが中心だったのでイベント中のつぶやきは結構少なめです(参加者同士のトークが盛り上がった証拠！)
- [DDD communiy jp 招待リンク](http://discord.gg/fBTE9wf) 
    - Twitterでのハッシュタグは `#dddcj` です
    - 一見過疎っているように感じるけど、質問するやいなや爆速で議論が始まるコミュニティです 

## 3. LTタイトルと資料リンク
- 以下、資料です
- 発表順で記載しています
- アカウント名はTwitterアカウントで統一しています

### [@carotene4035](https://twitter.com/carotene4035) DDD以前とDDD以降、そしてRDRAへ
- 資料リンク: https://docs.google.com/presentation/d/1hf5F0X77gFUBO4DRNK7tGZOoMyRGURX4Dy5ZqQzeOj8
- 勝手なひとくちメモ: DDD導入以前から試行錯誤までのお話。受付作業に追われ、あまり聴けず。。。

### [@hirodragon112](https://twitter.com/hirodragon112)   DDD導入に踏み切れない方へ贈る 2層 + CQSアーキテクチャ 〜 軽量DDDにならないための軽量なDDDのすゝめ 〜
- 資料リンク: https://speakerdeck.com/hirodragon112/ddddao-ru-nita-miqie-renaifang-hezeng-ru-2ceng-plus-cqs-akitekutiya
- 勝手なひとくちメモ: 80ページを5分で駆け抜けたマッハ系LT。まるで映画の予告編。本編がとても気になる。
- 動画リンク: [YYPHP](https://yyphp.connpass.com)というイベントで本編が公開されました！ → [動画(16分): YYPHP#99 放課後LT『DDD導入に踏み切れない方に送る2層+CQSアーキテクチャ: 軽量DDDにならないための軽量なDDDのすゝめ』hirodragon112さん](https://www.youtube.com/watch?time_continue=2&v=NZLFNmL0peU)

### [@hori_ryota](https://twitter.com/hori_ryota)   DDDなら概念層だけ触っていたい！ with Code Generator
- 資料リンク: https://speakerdeck.com/horiryota/dddnaragai-nian-ceng-dakehong-tuteitai-with-code-generator
- 勝手なひとくちメモ: 集中すべきことだけに集中する。ならば、面倒なところは自動化だ！


### [@j5ik2o](https://twitter.com/j5ik2o)       DDDお悩み相談事例 シーズン1
- 資料リンク: https://speakerdeck.com/j5ik2o/dddonao-mixiang-tan-shi-li-sizun1
- 勝手なひとくちメモ:  自分のお悩みも解決されたので嬉しい(対象や規模によらずDDDは有用か？)。その後のトークテーマにも貢献するお悩み相談パターンは効用が高い。

### [@suke_masa](https://twitter.com/suke_masa)   「なんか違う」ジャーニー
- 資料リンク: 求む
- 勝手なひとくちメモ: 違和感を頼りにブラックジャックを改善していくストーリー。手を動かしたくなってくる。

### [@Tanaka9230](https://twitter.com/Tanaka9230)   DDD学習指導要項
- 資料リンク: https://speakerdeck.com/tanaka9230/dddxue-xi-zhi-dao-yao-xiang-draft-2
- 勝手なひとくちメモ: DDDをはじめるならどこから？ DDD入門から上級まで。そして、いかにして指導するかのリアルなお話。

### [@nrslib](https://twitter.com/nrslib) DDD Propaganda
- 資料リンク: https://speakerdeck.com/nrslib/ddd-propaganda
- 勝手なひとくちメモ: DDD、実は当たり前のことを言っている。そしてそれが最も難しいのだ。


## 編集リクエストのお願い ∠( ﾟдﾟ)／
発表資料の正確なタイトルが怪しいです(ちゃんとメモってなかった...！)。
もし間違っていたら、これはもう大変なことです。

というわけで、こういうときは編集リクエスト機能ですよね！ どうぞよろしくお願いします。


おわり
ASP.NET Core WebアプリケーションをAzureにデプロイする

###ASP.NET Core Webアプリケーションを新規作成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/46c5028e-a62f-d022-220a-d43e5b1f73ae.png)


###ASP.NET Core Webアプリケーション

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/6a81ea07-df15-31b7-b75b-ced1f63feb98.png)

###テンプレートを選択
これを選ぶとMVCモデルのひな形が付いてきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/330258e6-8e3e-eebd-6f85-2c4b545ede19.png)

###発行する
プロジェクト名を右クリックで発行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/4074bdb4-6d6c-21b7-7e82-a0c92d9a2b3a.png)


###発行画面（更新モード）
すでに発行されている場合にはこちらの画面が表示される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/0da29b80-c8e3-5e8f-eccb-9a9e229a028d.png)



###IP制限
アプリケーションルートの直下にweb.configを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346533/f4b576fc-2c54-b091-6d6f-ea3d6c34c99e.png)


ipAddress="XX.XX.XX.XX" に許可したいIPアドレスを入力する

```wwwroot/web.config
 <system.webServer>
    <security>
      <ipSecurity allowUnlisted="false">
       <!-- YOUR IP Address -->
       <add allowed="true" ipAddress="XX.XX.XX.XX" subnetMask="255.255.255.0" />
      </ipSecurity>
    </security>
  </system.webServer>
```

参考：https://docs.microsoft.com/ja-jp/azure/app-service/app-service-web-get-started-dotnet
ゲストマシンのyum update中に、ホストマシンが落ちたら、再起動後にサービスが起動しなかった件

それは今日、ホストマシンを管理している友人Tから、
「ホストにパッチあてて再起動したいです。ゲストの方にもパッチあてておきますよ。」
と言われ、それは助かるなと思ってお願いしたら、しばらくして悲鳴が。
「やっべー。。。ゲストのyum update中に、間違えてホストをrebootしちゃった。」

その時はたいして気にしていなかった。
そのゲストマシンのOSはCentOS 7.6で、dockerでGitLabやJenkinsなど各種開発系のアプリを動かしているだけなので、データのサルベージさえできれば、最悪、再構築は大した手間ではない(筈な)ので。

しばらくして、「ゲスト起動して、yum updateも再実行して完了した」との連絡があり、確認してみたところ、、、あれっdockerデーモンが起動してない and 起動しない。

```console
# docker ps
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

# systemctl status docker
● docker.service
   Loaded: masked (/usr/lib/systemd/system/docker.service; masked; vendor preset: disabled)
   Active: inactive (dead)

 9月 06 11:53:18 inet-devill systemd[1]: Cannot add dependency job for unit docker.service, ignoring: Unit is masked.
```
サービスがmaskされているとのこと。
なんだろう、yum update中にサービスが起動しないようにmaskでもするのかなぁ？じゃあ解除すればいいか。

```console
# systemctl unmask docker.service
```
なにも出力されないし、mask状態も解消しない。
正常なCentOS 7.6の環境で同じコマンドを実行してみると、

```console
# systemctl mask nginx.service
Created symlink from /etc/systemd/system/nginx.service to /dev/null.
# systemctl unmask nginx.service
Removed symlink /etc/systemd/system/nginx.service.
```
のようにmaskで/dev/nullへのシンボリックリンクが作成され、unmaskでリンクが削除されることが判った。
しかし、問題の環境では/etc/systemd/system/docker.serviceのようなリンク自体が存在していない。

じゃぁ、どこでmask状態かを管理しているのか?と途方にくれたが、偶然、___docker.serviceファイルの中身を覗いてみたら空っぽ___なことに気付いた。serviceファイルのリンク先が/dev/nullならmask状態と判断されるように、serviceファイルのサイズが0でもmask状態と判断されるのだろう。
yum updateでserviceファイルの更新中に落ちたからサイズ0になったのだろうか。

ということで、正常環境よりserviceファイルをコピーして、systemctl daemon-reloadを行うとmask状態は解消されました。めでためでたし?
GREおよびTOEFLの準備をしている学生向けのチャットボット

# A chatbot for looking for vocabulary while preparing for GRE and TOEFL

I am a graduate of National Taiwan University. Recently, I am preparing for TOEFL and GRE, and I need to search for difficult words very often. I usually look for vocabularies in mainstream English dictionaries to find meanings and examples. However, GRE words are too rare so that a dictionary does not necessarily have definitions or example sentences.

At this point, it is necessary to check another dictionary. This process is very lengthy. So I developed a Chatbot called "Vocabulary Titan" and it helps go straight to the definitions, examples, synonyms, and origin from the data of Cambridge and Dictionary.com. This reduces users' queries on dictionary websites.

Currently, the chatbot is built on the Line platform. Students who are preparing for the exams can use it for free. It must be helpful for you. Befriend Vocabulary Titan to start!

**Line Link**

https://line.me/R/ti/p/%40340chkoc

**Source code**

Https://github.com/tigercosmos/vocabulary-titan

---

***Example***
<img width="924" alt="螢幕快照 2019-09-06 下午2.19.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223272/90afaf19-b028-242d-cece-155612fc6a96.png">
JavaScriptで基本色に対する濃淡色を返す関数を作った

クライアントと打合せをする際にモックアップを見せるんですが、
その際に全体のテーマ色（ベースカラー）を決定するだけで各コンポーネントの色を変更したかったのがきっかけです。

### 引数

- 「ベースカラー(`#ffffff`形式)」
- 濃淡倍率（0.0～1.0）
（値が小さいほどベースカラーに近く、値が大きいほど`#ffffff`または`#000000`に近い）

### 戻り値

- 濃淡度合いを反映したカラーコード(`rgb(255,255,255)`形式)

```moc.js

/**
 * ベースカラーコードから淡色のカラーコードを取得する
 * @param {String} baseColorCode #ffffff
 * @param {Number} lightWeight 0.0 ~ 1.0
 * @returns {String} カラーコード(rgb(255,255,255))
 */
function getLightColor(baseColorCode, lightWeight) {
    let red = parseInt(baseColorCode.substring(1, 3), 16);
    let green = parseInt(baseColorCode.substring(3, 5), 16);
    let blue = parseInt(baseColorCode.substring(5, 7), 16);

    let redNew = red + Math.round((255 - red) * lightWeight);
    let greenNew = green + Math.round((255 - green) * lightWeight);
    let blueNew = blue + Math.round((255 - blue) * lightWeight);

    return 'rgb(' + redNew + ',' + greenNew + ',' + blueNew + ')'
}

/**
 * ベースカラーコードから濃色のカラーコードを取得する
 * @param {String} baseColorCode #ffffff
 * @param {Number} darkWeight 0.0 ~ 1.0
 * @returns {String} カラーコード(rgb(255,255,255))
 */
function getDarkColor(baseColorCode, darkWeight) {
    let red = parseInt(baseColorCode.substring(1, 3), 16);
    let green = parseInt(baseColorCode.substring(3, 5), 16);
    let blue = parseInt(baseColorCode.substring(5, 7), 16);

    let redNew = Math.round(red * (1 - darkWeight));
    let greenNew = Math.round(green * (1 - darkWeight));
    let blueNew = Math.round(blue * (1 - darkWeight));

    return 'rgb(' + redNew + ',' + greenNew + ',' + blueNew + ')'
}
```

### 使い方
jQueryと純JSが混在しているのは私のスキル不足ですのでご容赦ください。

```moc.js
$(function () {
    $('input[name="color"]').on("change", function () {
        let baseColorCode = $(this).val();
        // 淡色（ベースカラーの0.7）を取得
        let lightColorCode = getLightColor(baseColorCode, 0.7);
        // 濃色（ベースカラーの0.3）を取得
        let darkColorCode = getDarkColor(baseColorCode, 0.3);

        $(':root').css('--base-color', baseColorCode);
        $(':root').css('--base-color-light', lightColorCode);
        $(':root').css('--base-color-dark', darkColorCode);
    });
});
```

※CSS変数を利用しております。


# 参考URL
[［teratail］カラーコードをrgb情報に変えたい](https://teratail.com/questions/21946)
GCP のプロジェクトを保護する

### 調べた動機

- プロジェクトも分けて請求アカウント分けたり BigQuery のカスタムコストを分けたりしたくなりました
- 色々な理由でプロジェクトを分ける運用にするとプロジェクトが大量になり始めます
- 不要になったプロジェクトを整理したりとか消すこともあるでしょう
- プロジェクトの作成から自動化した時のバグとか、人為的ミスでのプロジェクト削除とかで必要なプロジェクトが消えたら目も当てられません...
- どんなに削除権限を持ってるユーザーでも特定のプロジェクトの削除操作は禁止したい！

### 結論

- `gcloud alpha resource-manager liens create` するだけ！

#### 試しにやってみた

```bash
$ docker run --rm -it --name gcloud -w /operation google/cloud-sdk bash

% gcloud auth login
Go to the following link in your browser:

    https://accounts.google.com/o/oauth2/auth?redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&prompt=select_account&response_type=code&client_id=xxxxxxxxxxx.apps.googleusercontent.com&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fappengine.admin+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcompute+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Faccounts.reauth&access_type=offline


Enter verification code: 4/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

WARNING: `gcloud auth login` no longer writes application default credentials.
If you need to use ADC, see:
  gcloud auth application-default --help

You are now logged in as [user@example.com].
Your current project is [None].  You can change this setting by running:
  $ gcloud config set project PROJECT_ID


To take a quick anonymous survey, run:
  $ gcloud alpha survey

% gcloud alpha resource-manager liens create --project pj-example --reason="This project must not be deleted" --restrictions="resourcemanager.projects.delete"

% gcloud projects delete pj-example
Your project will be deleted.

Do you want to continue (Y/n)?  Y

ERROR: (gcloud.projects.delete) FAILED_PRECONDITION: A lien to prevent deletion was placed on the project by [user@example.com]. Remove the lien to allow deletion.
- '@type': type.googleapis.com/google.rpc.PreconditionFailure
  violations:
  - description: A lien to prevent deletion was placed on the project by [user@example.com].
      Remove the lien to allow deletion.
    subject: liens/pxxxxxxxxxxxxx-lxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
    type: LIEN
```

- lien が理由でプロジェクト削除できないことはわかる
- lien で設定した readon はわからない (現状)
- [公式ドキュメント](https://cloud.google.com/resource-manager/docs/project-liens) が **Last updated December 13, 2017.** なんだけどいつまで alpha なんだろうか

### メモ

- そのうち他にも permission を指定してみる
Openlink Virtuoso を Windows にインストールする

## ３行でまとめると

- 無償で使えるRDFトリプルストアのうち、もっとも質がいいらしい「[Openlink Virtuoso](http://vos.openlinksw.com/owiki/wiki/VOS/VOSUsageWindows)」(Win版)をインストールする
- 環境変数をいじって、ローカルPC上にサーバーを建てる
- ローカルホストからアクセスしてみる

## 1. [SourceForge](https://sourceforge.net/projects/virtuoso/files/) でインストーラーを入手する

![sourceforge_20190906.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219661/3548fc6c-4bae-05f2-3827-e08e7d702e6b.png)

[OpenLink Virtuoso (Open-Source Edition) - Browse Files at SourceForge.net](https://sourceforge.net/projects/virtuoso/files/)

上記から、ページ真ん中あたりにある緑のボタンをクリック
Win版のインストーラーがダウンロードできるのでそれを実行する

## 2. 環境変数を変更する

### 2.1 ダウンロードされた場所を確認し、絶対パスをコピーする

 - ex.)  `C:\Program Files\OpenLink Software\Virtuoso OpenSource 7.2`
   - 配下に、`bin`, `lib`, `database`, `doc`, `hosting`, `vad`, `vsp`などが並んでいるフォルダが `%VIRTUOSO_HOME%` になる　(次節を参照)

### 2.2 システム環境変数に「%VIRTUOSO_HOME%」を追加

※ windows キーを押して「cont」または「こんと」と入力すると、「コントロールパネル」が現れる

`スタートメニュー` >> `コントロールパネル` >> `システム` >> `システムの詳細設定` >> `環境変数`

![system_environment_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219661/44dc135f-88f8-c6ca-abf1-f7da9b491f62.jpeg)


システム環境変数の「新規」を押して、以下の情報を入力しOKを押す
> - 変数名：`VIRTUOSO_HOME`
> - 変数値：`(前節 でコピーした絶対パス)`

さらに、システム環境変数の「Path」を探し出し、以下の２つのpathを追加
> - `%VIRTUOSO_HOME%\bin`
> - `%VIRTUOSO_HOME%\lib`

（※ Windowsにおいては、バックスラッシュの扱いに気をつけること）

## 3. サーバーを起動し、[localhost:8890](http://localhost:8890/) へアクセスしてみる

インストールがうまく行っていれば、スタートメニューに「Virtuoso Services Control」なるものが追加されていると思う
これを実行すると、許可こそ求められるものの見た目には何も変化がない
そこでブラウザから、[localhost:8890](http://localhost:8890/) へアクセスすると以下のような画面になっているはず
![local_vos.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/219661/56e8bfa1-34af-cfb0-4bde-37ee3b9b79f3.png)

インストール　完了！


## 4. うまく行かない可能性について

### 4.1 インストーラーがコケる

前提として、Visual C++ 2010 (2012~ ? かもしれない)　が必要となるかもしれない。

- cf. バイナリ版での [Prerequisites] (http://vos.openlinksw.com/owiki/wiki/VOS/VOSUsageWindows#Prerequisites)

### 4.2 ローカルサーバーが起動しない

まずは環境変数を確認する
Openklink社がいうに「システム環境変数に設定してね」とのことなので、ユーザー環境変数に追加した場合うまく機能しないかもしれない

また、絶対パスをコピペしたときに場所を間違えているかもしれない
末尾のスラッシュやら、ディレクトリの正しい位置やらを確認されたい


## 参考文献

- [vos.openlinksw.com/owiki/wiki/VOS/VOSDownload](http://vos.openlinksw.com/owiki/wiki/VOS/VOSDownload)
- [vos.openlinksw.com/owiki/wiki/VOS/VOSUsageWindows](http://vos.openlinksw.com/owiki/wiki/VOS/VOSUsageWindows)

### zip版でインストールする方法について

- [VirtuosoをWindowsにインストールする « OKBPのブログ ](http://semweblog.mond.jp/okbp/?p=24) （最終更新 2014-05-27）
分析や予測を行う際に重要な４つの分析手法

分析や予測を行う際に重要な４つの分析手法について説明

### 1. 新規・継続率分解

アクティブユーザを新規・継続・出戻り(リザレクション)に分ける。
継続は、データが増えるとn回継続と定義することもできる。

<img width="886" alt="スクリーンショット 2019-07-24 14 16 47" src="https://user-images.githubusercontent.com/589443/61766971-b1b19280-ae1d-11e9-9d23-553268006fc6.png">

### 2. ロイヤルユーザ分析

コアユーザ、マージナルユーザ(コアとライトの中間)、ライトユーザなどユーザのロイヤリティによってレベルを分ける。アクセス頻度で分けることも多いが、支払う額やアクション(応募、ブックマーク)によっても分類できる。
分けることで、継続率や支払う額が明確に分かれると良い。

<img width="840" alt="スクリーンショット 2019-07-24 14 17 54" src="https://user-images.githubusercontent.com/589443/61767027-d9a0f600-ae1d-11e9-976b-c031f54d684d.png">

### 3. ファネル

割合を示すことで、ファネルで最も失っている割合が高い場所が分かる。
時系列で比較したり、サービスごとでの違いを見ることも良い。

<img width="487" alt="スクリーンショット 2019-07-24 14 19 43" src="https://user-images.githubusercontent.com/589443/61767110-1a007400-ae1e-11e9-8938-4e893281a12a.png">

### 4. セグメント

属性や流入経路でユーザを分類する。

<img width="746" alt="スクリーンショット 2019-07-24 14 21 12" src="https://user-images.githubusercontent.com/589443/61767168-503df380-ae1e-11e9-94e8-6258797e9386.png">

## まとめ
実際に活用する時は、1-4の分析を組み合わせて分析する。
例えば、セグメントごとのファネルや、セグメントごとの新規・継続分析など。

1と2を合わせた図として、以下をよく使う。アクティブはユーザの満足しているかどうかで定義する。

<img width="1069" alt="スクリーンショット 2019-07-24 16 13 01" src="https://user-images.githubusercontent.com/589443/61772721-ed545880-ae2d-11e9-829d-53babbe06b79.png">

### Q&A

- Q: ロイヤルユーザ分析とセグメントの違いは何か
    - セグメントは、ユーザの属性や流入経路によってそのまま決まるが、ロイヤルユーザは指標ごとに適切に分割する必要がある
- Q: ロイヤルユーザはどのように分類するのが良いか
    - シンプルに進めるときは、コアユーザのみを定義する
    - 最も良く行う分類は、アクセス頻度。継続率で評価を行う
    - 分類は、ファネルに違いがあるように分ける。例えば、継続率に違いがあるなど
- Q: 他企業はどのように分けているか
    - pinterestは、3つに分けている。(Core, Casual, Marginal) https://www.slideshare.net/jwegan/data-driven-growth/12
- Q: ビジネスサイドとも、ロイヤルユーザの定義をどのように行うかは議論を良くしている
    - データがある場合は各パラメータによってどれだけ継続するか、支払うかの予測モデルを作って評価を行うこともできる
- Q: ロイアルユーザの分類の際の違いはファネルでのみ見るのか
    - CAC(獲得単価)、LTV(ライフタイムバリュー)などで見ることもある

### 参考
* レコメンデーションのターゲットメトリックスでもコアユーザを定義して利用している https://speakerdeck.com/reikubonaga/ml-loft-3
* Data Driven Growth https://www.slideshare.net/jwegan/data-driven-growth
* How Pinterest drives sustainable growth https://medium.com/@Pinterest_Engineering/how-pinterest-drives-sustainable-growth-1a3f150a1f98
* The 27 Metrics in Pinterest’s Internal Growth Dashboard https://jwegan.com/growth-hacking/27-metrics-pinterests-internal-growth-dashboard/
JenkinsのHTML ReportでCSSが読み込まれない時の対応

# 結論

スクリプトコンソールから

```
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")
```
を実行

##　参考

[Jenkins – HTML Publisher Plugin – Jenkinsサーバーでレポートを表示してもCSSが表示されない](https://codeday.me/jp/qa/20190210/240009.html)
Lambda+S3でどうしようもなく恥ずかしい失敗をしたので自戒の意味でメモを残してみる


割と本当に恥ずかしいかつ、見ればすぐわかるレベルのエラーに結構な時間を費やした自分への自戒目的記事です

# そもそも何をやろうとしていたのか？

kinesis streamから取ってきたrecordを中身のデータによってs3のkeyを作りこみながらputする（本当にそれだけ）

# 何が起こったか？

## S3へputObjectするとネットワークエラーが頻発する

例１

```bash
    "message": "write EPROTO :SSL routines:ssl3_get_record:wrong version number:../deps/openssl/openssl/ssl/record/ssl3_record.c:332:\n",
    "errno": "EPROTO",
    "code": "NetworkingError",
```

例２

```bash
    "message": "socket hang up",
    "code": "NetworkingError",
```

例３

```bash
    "message": "write EPROTO",
    "errno": "EPROTO",
    "code": "NetworkingError",
```

## S3へputするロジックはどうだったのか？

sdkのfunctionを実行するのみ
※コールバックは割愛

```javascript
s3.putObject({
        Bucket: buket,
        Key: Key,
        Body: JSON.stringify(payload),
        ContentType: 'application/json'
    })
```


# 何が悪いのか？

`putObject` がnon blockingだったため、S3へのputが終わる前にlambdaがcloseしようとしたため、エラーが発生した

# 対応どうしたか？

promise化し、awaitしました。
※より正確には1回の処理で10件程度のrecordを処理していたので、まとめてpromise.allで処理しました。

```javascript
await s3.upload({
        Bucket: buket,
        Key: Key,
        Body: JSON.stringify(payload),
        ContentType: 'application/json'
    }).promise()
```

# まとめ
nodeのsdkがnon blockingなのも、promise使えるのもしばらく気づかず自滅
かなしいです😢
今日のmruby エラー


SWESTでのmruby ワークショップでの作業。

今日のmrubyコンパイルエラー


```ruby:chat1.rb
t_ary = [100, 500 1000]
t_idx = 0
while true
  if SW() == 0 then
    t_idx = (t_idx + 1) %3
  end
  $t = t_ary[t_idx]
end
```

```ruby:chat2.rb
while true
  leds_write 1
  sleep_ms $t
  leds_write 0
  sleep_ms $t
end
```
mruby.ideでの表示

```shell-session:mrubc
mrbc.exe chat1.rb
syntax error unexpected tINTEGE. expecting ']'
```
カンマが抜けていた。


```ruby:chat1.rb
t_ary = [100, 500,  1000]
t_idx = 0
while true
  if SW() == 0 then
    t_idx = (t_idx + 1) %3
  end
  $t = t_ary[t_idx]
end
```
【Swift】 Xcode10下でのkeyWindow取得方法の代替（iOS13 beta）

開発中アプリのiOS13対応を調査していた際、

```
let window = UIApplication.shared.keyWindow
```

で定義していたロジックがDeprecatedになったらしく、想定通りの動きをしないという現象が発生してしまった。
本来なら、Xcode11から使用可能な、

```
let window = UIApplication.shared.connectedScenes.filter({$0.activationState == .foregroundActive}).map({$0 as? UIWindowScene}).compactMap({$0}).first?.windows.filter({$0.isKeyWindow}).first
```

のような書き方でどうにでもなるのだが、残念ながら現状のアプリはしばらくXcode10でビルドする必要があるため、UIWindowSceneを使った判定ができない。
というわけでUIWindowSceneを使わず、暫定的にkeyWindowを取得する方法を考えてみた。

```swift:sample.swift
        var window = UIWindow()
        for win in UIApplication.shared.windows {
            if win.isKeyWindow {
                window = win
            }
        }
```

上記のようにすることで、ひとまずXcode10 + iOS13 betaでもkeyWindow取得できるようになった。
ちなみにこの、keyWindowが想定通りの動きをしてくれない現象は、シミュレータでは発生せず、実機でのみ発生したので、もしかしたら今後のアップデートによっては改善したり、改悪したりするかもしれない。
[JS] 非破壊的にソートしたいなら、slice()をsort()の前に

### やりたい事
オブジェクト配列の特定のkeyで昇順でソートしたい

### やった事
`sort(compareFunction)`を使ってソートしたら、処理自体はうまくいったが
元の配列を使用している処理にエラーが発生した

[参考](https://qiita.com/PianoScoreJP/items/f0ff7345229871039672)

### 解決策:slice()を途中にはさむ
sort()は、破壊的なメソッド(元の配列を変更してしまう)なので、別の処理に影響が出る。
非破壊的にソートしたかったら、slice()を挟んでソートする。


例えばこんな感じ

```javascript
var array = ['E', 'B', 'A', 'C', 'D'];
var sortedArray = array.slice().sort();
console.log(sortedArray); // [ 'A', 'B', 'C', 'D', 'E' ]
console.log(array) // [ 'E', 'B', 'A', 'C', 'D' ]
```

[slice](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/slice)は、beginからendまでをコピーして、配列を生成する。
引数に何も指定しかなったら全てコピーできるので、そのコピーにsort()をする事で、非破壊的なソートが可能となる。


## 追記
コメントいただきました。ありがとうございます！
`Array.from()`を使う方法

```javascript
var array = ['E', 'B', 'A', 'C', 'D'];
var sortedArray = Array.from(array).sort();
console.log(sortedArray); // [ 'A', 'B', 'C', 'D', 'E' ]
console.log(array) // [ 'E', 'B', 'A', 'C', 'D' ]

```
Windows10上のDocker DesktopとVagrant(VirtualBox)を共存させる（ほぼ成功、詳細は未検証）

# なぜこの記事を書いているか

Windows10で開発を行っている人には一定量居るはずの「DockerとVagrant共存できないんだよね」「VirtualBox 6.0から対応しているはずなのに、、、」をクリアしたく色々とドキュメントやフォーラムを読んだ結果、手元で共存することができたので情報共有です。
ただし現時点でVMの起動に失敗したり、HOST=>GUEST間でvagrant-vbguestのSCPが失敗することがあるなど制限付きです。ご利用は計画的に。

# まとめ

1. Docker Desktop, VirtualBox, Vagrantをアンインストール後、改めてインストール（アンインストールはしなくても良いかも）
2. Docker Desktopは終了しておく（念のため）
3. Hyper-Vが有効になっているか確認する（念のため）
4. 以下をPowerShell（管理者）から実行（パスなどは読み替えて下さい）

```powershell:powershell
> cd "C:\Program Files\Oracle\VirtualBox"
> VBoxManage.exe setextradata global "VBoxInternal/NEM/UseRing0Runloop" 0
```

あとはDocker Desktopを起動してDockerとVirtualBoxが共存して動作することを確認します。

# 自分の手元で起こった現象

1. VMが起動中にカーネルパニックを起こして起動しない
2. VT-xで動作していたよりもVirtualBoxのVMの起動時間が遅い（これはある程度わかっていた事）
3. Hyper-VとVirtualBoxでネットワーク周りの相性が悪いのか、HOST=>GUEST間のSCPがエラーで異常終了することがある（vagrantがrubyのエラー画面を出して止まる）

# 最後に

まだ起動に成功しただけなのでちゃんとは動作確認をしていません。まずは皆さんに情報共有をと思い簡単にまとめました。Dockerだけで良い環境になればハッピーなんですが、世の中そうもいかず、、、

# 参考にしたサイトなど

- https://qiita.com/takotakot/items/94d3218cf8de5b2c1da8
- https://forums.virtualbox.org/viewtopic.php?f=6&t=90853&sid=110194cc8e88778f9675f93d06ddd51e&start=150

ほかにも色々見たと思うのですが、どのサイトを参考にさせて頂いたのか既に記憶に無く（スミマセン）
Unity - 現在再生されているアニメーションのクリップ名を取得する

以下のように記述すると取得できる。

```csharp
Animator animator = GetComponent<Animator>();
var clipInfo = animator.GetCurrentAnimatorClipInfo(0)[0];   // 引数はLayer番号、配列の0番目
Debug.Log("AnimationClip名 : " + clipInfo.clip.name);
```
Project Euler 007を解いてみる。「10001番目の素数」

# Project Euler 007
[007](http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%207)
>素数を小さい方から6つ並べると 2, 3, 5, 7, 11, 13 であり, 6番目の素数は 13 である.
10001 番目の素数を求めよ.

## Sympyにありました。

```Python
import sympy

print(sympy.prime(10001))
```

->[次の問題](https://qiita.com/radiol/items/8198018250307ebdb594)

## 考え方
順番に素数判定してリストに加えていく方法も試しましたが、エラトステネスの篩を使ったほうが早かったので適当な大きさの数を入れて計算しました。
任意のnについて計算できるようにしたかったので篩の大きさもnから計算したいと思い調べてみました。
nが十分に大きい場合、n番目の素数Pnは

```math
Pn \approx n \bigl( \ln n + \ln(\ln n) \bigr)
```
で近似できるようです。
実際に試してみたところ、素数が13以上の場合(6番目以降の素数を予測する場合)は予測値Pnが実際の素数より大きくなるようなので、6番目以降の素数を計算する場合はPnまでのサイズの篩を作って計算すればn番目の素数を計算できそうです。
Pnを小数点以下切り上げて+2すれば2番目の素数から使用可能です。

## コード
```Python:euler007.py
from math import log, ceil
from math_functions import prime_generator # 以前に作った指定した数値以下の素数を返すgenerator


def main():
    n = 10001
    #エラトステネスの篩のサイズを計算
    max_number = ceil(n * log(n) + n * log(log(n))) + 2
    prime_list = list(prime_generator(max_number))

    print(f'{max_number}以下の素数{len(prime_list)}個を生成')
    print(f'{n}番目の素数は{prime_list[n - 1]}')


if __name__ == '__main__':
    main()
```

```Python:math_functions
import numpy as np


def prime_generator(n: int) -> int:
    """
    n以下の素数を返すgenerator
    :param n: int
    :return: int
    """
    num_arr = np.arange(2, n + 1)
    while num_arr.size > 0:
        prime = num_arr[0]
        yield prime
        num_arr = num_arr[num_arr % prime != 0]
```
`結果
114322以下の素数10818個を生成
10001番目の素数は104743
main処理時間: 1.0734169483184814 sec.
`
時間がかかってしまいますが、大きめのサイズの篩を用意して計算する以外にいい方法が思いつきません(；・∀・)
またn=1のとき、log 0でエラーが発生してしまうのでn=1の場合に処理をスキップするifを追加したほうがいいかもしれません。
Addressable AssetsのSimplify Entry Nameでアドレス名にラベル追加で重複回避

## 名称の重複について
UnityのAddressable AssetsではAsset Addressを文字列で名前指定して参照することができます。
Asset Referenceを使用していても、内部的にはこの文字列を使います。
これにより、重複する名称を設定すると正しく参照されないため、名前には気を付けないといけません。

例えば、うちに鯛と味噌という猫がいるんですが、このモデルをゲームで使うとします。
![before.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45094/6d4a8ff4-4917-acb2-b0e3-641ca36f1bbc.png)
どちらもNeko.prefabという名前にしてしまうと、Simplify Entry Nameしたときに下のようにアドレスがNekoになってしまい、重複してしまいます。
![before2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45094/2c796cf8-939d-d8bd-9045-9455bc5bb2ee.png)
（prefab名変えるのが普通だと思うので、これは極端な例です。）
## 同名でもラベルで分けたい

プロジェクトにあるLibrary内のAddressable Assetsのパッケージキャッシュに手を加えます。
なので、パッケージのアップデートがあった際などに巻き戻ったりするかもなので注意です。

Editor\GUI\AddressableAssetsSettingsGroupTreeView.csの657行目あたりに以下を追記

```csharp:Editor\GUI\AddressableAssetsSettingsGroupTreeView.cs
menu.AddItem (new GUIContent ("Simplify Entry Names With Label"), false, SimplifyAddressesWithLabel, selectedNodes);
```

同884行目あたりに以下を追記

```csharp
protected void SimplifyAddressesWithLabel (object context) {
    List<AssetEntryTreeViewItem> selectedNodes = context as List<AssetEntryTreeViewItem>;
    if (selectedNodes == null || selectedNodes.Count < 1)
        return;
    var entries = new List<AddressableAssetEntry> ();
    HashSet<AddressableAssetGroup> modifiedGroups = new HashSet<AddressableAssetGroup> ();
    foreach (var item in selectedNodes) {
        if (item.entry.labels == null || item.entry.labels.Count < 1) {
            item.entry.SetAddress (Path.GetFileNameWithoutExtension (item.entry.AssetPath), false);
        } else {
            string label = m_Editor.settings.labelTable.GetString (item.entry.labels, 200);
            item.entry.SetAddress (label.Replace (", ", "_") + "_" + Path.GetFileNameWithoutExtension (item.entry.AssetPath), false);
        }
        entries.Add (item.entry);
        modifiedGroups.Add (item.entry.parentGroup);
    }
    foreach (var g in modifiedGroups)
        g.SetDirty (AddressableAssetSettings.ModificationEvent.EntryModified, entries, false, true);
    m_Editor.settings.SetDirty (AddressableAssetSettings.ModificationEvent.EntryModified, entries, true, false);
}
```

これでラベルを追加するSimplify Entry Name With Labelが増えます。
![menu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45094/e6a6164f-54c0-327b-ef13-a30956724c74.png)

実行すると、{ラベル}_ファイル名というアドレス名になります。
![after1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45094/3d956dd3-3c7e-3a43-7d89-1ab83c027144.png)

ラベルが複数ある場合は以下のようになります。
![after2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45094/b3a9812a-34d2-6c4d-7adf-550033019ead.png)

できたけど、はたしてこういうラベル運用でいいのか・・・