OmniAICreator/Qiita-1.07M huggingface dataset:
開発者イベント・カンファレンスまとめ

私が毎年チェックしている開発者イベントの一覧を作成しました。テーマはWebアプリ、インフラ、Android、セキュリティ、Java、JavaScript（Node.js）、Pythonにフォーカスしています。

* 4月
  * [Google Cloud Next](https://cloud.withgoogle.com/next18/sf/)（海外）
  * [AMP Conf](https://amp.dev/ja/events/amp-conf-2019)
  * [Facebook Developer Conference F8](https://www.f8.com/)（海外）
  * [Go Conference](https://gocon.jp/)
* 5月
  * [Microsoft Build](https://www.microsoft.com/en-us/build)（海外）
  * [Google I/O](https://events.google.com/io/)（海外）
  * [Japan IT Week 春](https://spring.japan-it.jp/)
  * [JJUG CCC Spring](http://www.java-users.jp/)
  * [Microsoft de:code](https://www.microsoft.com/ja-jp/events/decode/)
  * [Oracle Day Tokyo](https://www.oracle.co.jp/events/code/2019/) （旧：[Java Day Tokyo](http://www.oracle.co.jp/events/javaday/2018/)）
* 6月
  * [Interop Tokyo](https://www.interop.jp/)
  * [AWS Summit Tokyo / Osaka](https://www.awssummit.tokyo/)
  * [Android Bazaar and Conference Spring](https://abc.android-group.jp/)
  * [DeNA Technology Conference Summer](https://techcon.dena.com/)
* 7月
  * [Developer Summit 夏](https://event.shoeisha.jp/devsumi)
  * [JULY TECH FESTA](https://www.techfesta.jp/)
  * [Google Cloud Next in Tokyo](https://cloud.withgoogle.com/next/tokyo)
* 9月
  * [SpringOne](https://springone.io/)
  * [HTML5 Conference](https://events.html5j.org/)
  * [GMO Developer Day](https://developers.gmo.jp/developersday/)
  * [CI/CD Conference by CloudNative Days](https://event.cloudnativedays.jp/)
* 10月
  * [Japan IT Week 秋](https://www.japan-it-autumn.jp/)
  * [Rakuten Technology Conference](https://tech.rakuten.co.jp/) (最後の開催は2019年)
  * [Android Bazaar and Conference Autumn](https://japan-android-group.connpass.com/)
  * [Kaigi on Rails](https://kaigionrails.org/)
  * [PyCon JP](https://www.pycon.jp/)
  * [CODE BLUE](https://codeblue.jp/)
  * [Serverlessconf](http://serverlessconf.io/) (最後の開催は2019年)
* 11月
  * [LINE DEVELOPER DAY](http://linedevday.linecorp.com/)
  * [JJUG CCC Fall](http://www.java-users.jp/)
  * [東京Node学園祭](https://nodefest.jp/) (最後の開催は2018年)
  * [AWS re:Invent](https://reinvent.awsevents.com/)（海外）
  * [CloudNative Days Tokyo](https://event.cloudnativedays.jp/)
  * [DroidKaigi](https://droidkaigi.jp/)
* 11月
  * [FRONTEND CONFERENCE](https://2019.kfug.jp/) (最後の開催は2019年)
* 12月
  * [Nulab Conference (NuCon)](https://nucon.nulab.com/) (最後の開催は2020年)
* 1月
  * [Yahoo! JAPAN Tech Conference](https://techconference.yahoo.co.jp/)
* 2月
  * [Developer Summit](https://event.shoeisha.jp/devsumi)
  * [NTT Tech Conference](https://ntt-developers.github.io/ntt-tech-conference/)
* 3月
  * [DeNA TechCon](https://techcon.dena.com/)
  * [Cookpad TechConf](https://techconf.cookpad.com/) (最後の開催は2019年)
* その他
  * [JPCERT主催イベント](https://www.jpcert.or.jp/event/)
    * [Japan Security Analyst Conference](https://jsac.jpcert.or.jp/)
  * [OWASP Japan主催イベント](https://www.owasp.org/index.php/Japan)
  * [オープンソースカンファレンス](https://www.ospn.jp/)
LaravelでのテストでsetupでDBいじりたい場合の対処

## 経緯

- 今担当しているプロダクトのテストコードを動かしていたら、特定のテストを実施した際にDBのレコードが変更され、他のテストが通らなくなる事態が発生してた.
- [データベースのテスト 5.4 Laravel](https://readouble.com/laravel/5.4/ja/database-testing.html)にあるようにDatabaseTransactions使ってるのになんでかなーと色々調べた結果、setupでDBいじってたのが原因とわかった.
    - DatabaseTransactionsは`各テストケースをデータベーストランザクションでラップしてしまう`ので、setupはトランザクション外なのね.
- setupでDBいじってるテストが結構あったので、楽な感じに直す方法を調べてみた.

## 対応

- 単純にDatabaseTransactionsでやってたトランザクションの開始と終了をsetupで明示的にやることで対処.
- DatabaseTransactionsは取り除く.

```TestCase.php
class TestCase extends Illuminate\Foundation\Testing\TestCase
{
//    use DatabaseTransactions;

    public function setUp()
    {
        parent::setUp();
        $this->app->make('db')->beginTransaction();

        // データベースの処理
    }

    public function tearDown()
    {
        $this->app->make('db')->rollBack();
        parent::tearDown();
    }
}
```

## 補足

ちなみに、MySQLのtruncateはトランザクション外の処理になるので、上記のやり方でもDBのデータが壊れます.

truncate使ってる場合は `DB::table($table)->delete();` とすればトランザクション内での処理になります.
PC-98 キーボードBIOS

```ksens2.asm
comment *
        ksens2.asm for MASM32
ml /c /AT /Fl ksens2.asm
link16 /t ksens2;
*
        .model  tiny
        .code
;       org     100h            ; .com
        org     0h              ; IPL
start:
        mov     ax, 0a000h
        mov     es, ax
mloop:
        mov     ah, 04h
        mov     al, 09h
        int     18h

        mov     di, 0
        mov     cx, 8
@@:
        shl     ah, 1
        mov     al, 0
        adc     al, '0'
        mov     es:[di], al
        inc     di
        inc     di
        loop    @b
        jmp     mloop
        end     start
```

![ksens2.png](https://qiita-image-store.s3.amazonaws.com/0/257554/4b10b7db-c180-11fa-ea32-bdf735dde7f2.png)
Reactで、動作に必要なAjaxデータを非同期にロードする

ユーザー操作と非同期的にAjaxでデータを取得するケースもよくありますが、Reactと組み合わせようとしたときに少し悩むこととなりました。

# Ajaxロードだけど悩まない例

「ボタンを押す」→「あるJSONデータを取ってくる」→「とってきたJSONデータをもとに、ポップアップウィンドウを開く」というような動作を考えてみます。

```jsx:シンプルなコンポーネント
class SimpleComponent extends React.Component {

  handleClick = () => {
    fetch('some.json').then(data => {
      // 実際にはもっと複雑な処理だけど、解説のためごく簡単に
      alert(data.str);
    });
  }

  render() {
    return <button onClick={handleClick}>ボタン</button>;
  }
}
```

この場合、`fetch`でとってきたデータはそのまま`then`で処理されるだけなので、Reactとは何も関係せず処理が完結します。

# Ajaxロードしたデータを、コンポーネントの「状態」にしたい

とはいえ、この方法では取得したデータが完全にReactの外の世界に置かれたままとなるので、「ロードしたデータをReactの表示の上でも活用したい」とか、「ボタンクリック以外のタイミングでデータの取得を駆動したい」という目的ではうまく使えません。

そして、コンポーネントが状態を持つときは`state`に入れるものなので、データは`state`に持たせることにしましょう。なお、`Promise`はそれ自体の状態が破壊的に変化しますので、`state`に直接入れるとうまく動かないことが見込まれます。

```js
doFetch() {
  if(this.getterPromise) return;
  this.getterPromise = fetch('some.json').then(
    data => this.setState({data});
  );
}
```

## Ajaxロードとボタンクリックを連動させる

これでデータを取れるようにはなりますが、ボタンとの同期はまた考えないといけません。

* ボタンを押したあとにロードが完了した場合→ロード完了の時点でポップアップを表示
* ロード完了したあとにボタンを押した場合→ボタンを押した時点でポップアップを表示

どうしようか考えたところで、「ボタンを押したときにはフラグだけ立てて、`componentDidUpdate`でフラグとデータが揃っているかチェック」という形にすることにしました。なお、今後のReactでは非同期でレンダリングを行うこととなるため、`componentDidUpdate`以外のコールバックは複数回呼ばれうることになる、とのことです。

```js
componentDidUpdate() {
  if(this.state.data && this.state.willShowPopup) {
    alert(this.state.data);
    this.setState({willShowPopup: false});
  }
}

handleClick = () => {
  this.setState({willShowPopup: true});
}
```

Reactは枠組みがしっかり決まったライブラリですが、その中でも充分なことが可能です。枠をはみ出せば、一気に茨の道となります。
Azure CLI で自動的にk8sのクレデンシャルを取得する

最近 WSL をバージョンアップしたときに、前の設定が消えてしまった。よくよく考えると当たり前なので、次回アップデートしたときに、環境をセットアップできるようにしておこうと思った。

Azure CLI のインストールスクリプトは作ったので、後は、kubectl と kubeconfig の取得を自動化したい。Azure CLI で簡単にできたので、忘れないようにメモしておく

# 前提

下記のコマンドを実施ずみであること。これを前提にすると、Azure CLI でいろいろ自動化しやすい。
```
az login
```


# スクリプト

```bash
#!/bin/bash

# Install kubectl
# This requires your password.
sudo az aks install-cli

# install jq
sudo apt install jq -y

# fetch all credentials of your k8s clusters
aks_list=$(az aks list)

# create a small list which gets name and resoruceGroup
sample=$(echo ${aks_list} | jq -c '[.[]| {name: .name, resourceGroup: .resourceGroup}]')

for row in $(echo "${aks_list}" | jq -r '.[] | @base64'); do
 _jq() {
    echo ${row} | base64 --decode | jq -r ${1}
 }
 az aks get-credentials -n $(_jq '.name') -g $(_jq '.resourceGroup')
done
```

`az aks list` は、aks のリストを取得するコマンド。次のこの行はおまけ。本来必要ない。

```bash
sample=$(echo ${aks_list} | jq -c '[.[]| {name: .name, resourceGroup: .resourceGroup}]')
```

結果はこうなる

```json
[{"name":"sadevopsoh","resourceGroup":"RemoveDevOpsOH"}]
```

jq を使うと簡単にクエリできる。実は同じようなことが、`--query` パラメータでもできる。

```bash
$ az aks list --query "[].{name: name, resourceGroup: resourceGroup}"
```

結果

```
[
  {
    "name": "sadevopsoh",
    "resourceGroup": "RemoveDevOpsOH"
  }
]
```

`--query` パラメータの文法は、jq に似た構文の [JMEPATH](http://jmespath.org/tutorial.html#list-and-slice-projections)というやつ。この`--query` は自動化したいとき例えば、シークレットを取得して、ほかのコマンドに渡したいときとか頻繁に使われる。

# ループして特定のコマンドを実行する

さて、bash で JSON をループさせて、何かのコマンドを実行したいときはどうしたらいいだろう。

```bash

for row in $(echo "${aks_list}" | jq -r '.[] | @base64'); do
 _jq() {
    echo ${row} | base64 --decode | jq -r ${1}
 }
 az aks get-credentials -n $(_jq '.name') -g $(_jq '.resourceGroup')
done
```

この部分。解説すると、bash で for 文はワードごとに繰り返しを行う。

```bash
aaa="a b c d e"
$ for i in ${aaa}; do
> echo item: $i
> done
item: a
item: b
item: c
item: d
item: e
```

もちろん、JSONだとそんなうまくかない。だからどうするか？というと、jq を使って配列の要素ごとに繰り返しをする。

```bash
$ echo ${sample}
[{"name":"ushio"}, {"name":"yamada"}]
${sample} | jq -r '.[]'
{
  "name": "ushio"
}
{
  "name": "yamada"
}
```

で、尚且つ各エレメントをbase64 にしてしまえばそれぞれが１ワードになるわけ。

```bash
$ echo ${sample} | jq -r '.[] | @base64'
eyJuYW1lIjoidXNoaW8ifQ==
eyJuYW1lIjoieWFtYWRhIn0=
```

考えた人賢すぎる。これをイレートさせて、使うときはデコードして、`_jq` メソッドの第一パラメータで
検索しているというロジック。素晴らしい。

# Resource 

* [jq Manual](https://stedolan.github.io/jq/manual/)
* [Bash for Loop Over JSON Array Using jq](https://starkandwayne.com/blog/bash-for-loop-over-json-array-using-jq/)
* [Bash programming: loop](http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html)
IPv6 IPoEっていうの、やめない？

フレッツ光ネクスト関連で目にする「IPv6 IPoE」っていうキーワード、ずっと昔からもにょってた。
そろそろ「IPv6 IPoE」っていうの、やめない？

# フレッツ系で言われる「IPv6 IPoE」にある2つの意味と、そう言われるようになったであろう理由
## 1つ目「PPPoE接続ではない」
NTTではADSLの頃から、「PPPoE」と呼ばれる接続方式を使って、プロバイダに接続していました。当然、IPv6インターネット接続も同様で、PPPoEを利用していたのですが、フレッツ光ネクスト(NGN)からIPv6通信はVNE(仮想固定通信提供者)を介して直接インターネットに接続（ネイティブ接続）できるようになりました。
「PPPoEを利用したIPv6インターネット接続」と「PPPoEを利用しない（ネイティブ接続）」を対比して、「IPv6 IPoE接続」等と言われるようになったのではないかと思います。

## 2つ目「PPPoEを利用しないIPv4接続」
フレッツ光ネクスト以降、IPv4もPPPoEを使わないでインターネットに接続する方法が出てきました。
それは、IPv6（ネイティブ接続）を使ってIPv4接続を行う、「IPv4 over IPv6接続」です。
IPv6ネイティブ接続を利用するため、「IPv6 IPoE接続方式」などと言われるようになったのではないかと思います。

# 感じる違和感
もはや趣味の領域といってしまえばそうなのですが、「IPv6 IPoE」という呼び方に違和感を感じます。
## IPv6 IPoEの本来の意味
**「IPv6通信をEthernet上で行っていますよ」**という意味です。
※Ethernetはごくごく普通のLANやWiFiなどで利用されている通信規格です。
つまり、「車が地面を走っています」に近い何かを感じるわけです。
車が空を飛ぶようになったとしたら、既存のような車は「地面を走る車」などと言われるようになるのでしょうか。或いは、「一般的な車」や「普通の車」などとわざわざ言うのでしょうか。

# 近い感覚
J( 'ー｀)し「たかし、もうファミコンやめてご飯にしなさい」
('A`)「ファミコンしてるんじゃなくて、PCで夏休みの自由研究の調べ事してるんだよ」
J( 'ー｀)し「あらそう？じゃあきりの良いところでご飯にしなさいね」

# こう呼んだらいいんじゃないかな
「IPv6 IPoE」ではなく
「IPv6ネイティブ接続」…PPPoEを使わずにIPv6でインターネット接続を行うこと
もしくは
「IPv4 over IPv6ネイティブ接続」…PPPoEを使わずにIPv6ネイティブ接続上でIPv4接続を行うこと

# 結論
 - 割とどうでもいいかもしれない
 - ただ、このまま会話が噛み合わなくなる可能性が割と高い気がする
 - そもそも[PPPoEの輻輳問題](https://qiita.com/chopin117/items/9a67457c1cfe60fe819d)を改善していれば、こんなことにはならなかった気がする
PHPとRubyの基本構文まとめ

PHPとRubyの基本構文の簡易まとめです。
ごっちゃにならないための自分用。

### コメント
```php:PHP
// コメント

/* コメント */
```

```ruby:Ruby
# コメント

=begin
コメント1
コメント2
...
=end
```

### HTML埋め込み
```php:PHP
<?php
  // PHPコードをここに記載
  echo 'hello, world';
?>

※1行の場合はセミコロン省略可
<?php echo 'hello, world' ?>

※閉じタグを省略する場合(PHPコードのみのファイルの場合。詳細は下記リンク参照)
<?php echo 'hello, world'
```
[PHPの最後の終了タグ ?> は付けないでおこうねというお話](https://thesaibase.com/php/end-tag)

```ruby:Ruby
<% ... %>    <!-- Rubyスクリプトをその場で実行 -->

<%= ... %>   <!-- 式を評価した結果をその場に挿入 -->

※HTML埋め込み機能は標準ライブラリ(eRuby)にて提供
```

### 変数の定義

```php:PHP
$変数名 = 値;
```

```ruby:Ruby
変数  # ローカル変数

@変数 # インスタンス変数

$変数 # グローバル変数

```

### 条件分岐(if)
```php:PHP
/* if */
if (式) {
  // 式が真の場合の処理
}

/* if～else */
if (式) {
  // 式が真の場合の処理
}　else {
  // 式が偽の場合の処理
}

/* if～elseif */
if (条件式1) {
  // 式1が真の場合の処理
}　elseif (条件式2) {
  // 式1が偽かつ、条件式2が真の場合の処理
}

```

```ruby:Ruby
# if
if 式
  # 式が真の場合の処理
end

# if～else
if 式
  # 式が真の場合の処理
else
  # 式が偽の場合の処理
end

# if～elseif
if 条件式1
  # 式1が真の場合の処理
elsif 条件式2
  # 式1が偽かつ、条件式2が真の場合の処理
end
```

### 条件分岐(switch/case)
```php:PHP
/* switch */
switch ($変数) {
  case 0:     // caseの右は文字列でも可
    // 処理0
    break;    // break;が無い場合、直後のcaseの処理を実行する
  case 1:
    // 処理1
    break;
  case 2:
    // 処理2
    break;
  default:
    // どれにも該当しない場合
    break;
}
```

```ruby:Ruby
# case
case $変数
when 0      # whenの右は文字列でも可
  # 処理0
when 1
  # 処理1
when 2
  # 処理2
else
  # どれにも該当しない場合
end
```

### 繰り返し(foreach/each)
```php:php
/* foreach(配列Ver) */
foreach ($配列 as $仮変数) {
  // 実行する処理
}

/* foreach(連想配列Ver) */
foreach ($連想配列 as 仮キー => 仮変数) {
  // 実行する処理
}
```

```ruby:Ruby
オブジェクト.each do |仮変数|
  # 実行する処理
end
```

### 繰り返し(その他)
```php:php
/* while */
while (式) {
  // 式が真の場合の処理
}

/* do～while */
do {
  // 実行する処理
  // ループの終わりで評価されるため、最低1回の実行が保証される
} while (式);

/* for */
for (式1; 式2; 式3) {
  // 式1で初期化、式2は条件式、ループの終わりで式3が実行
}
```

```ruby:Ruby
# while
while 式
  # 実行する処理
end

# for(任意の回数n繰り返す)
for 変数 in 1..n
  # 実行する処理
end
```

### 関数/メソッド
```php:PHP
/* 関数定義 */
function 関数名($仮引数1, $仮引数2,  ...,  $仮引数n)
{
  // 関数の処理

  return $戻り値;  // 戻り値がある場合
}

/* 関数呼び出し */
関数名($引数1, $引数2,  ...,  $引数n);
```

```ruby:Ruby
# 関数定義
def 関数名(キーワード引数1:, キーワード引数2:, ..., キーワード引数n:)
  # 関数の処理

  return 戻り値  # 戻り値がある場合
end

# 関数呼び出し
関数名(キーワード引数1:引数1, キーワード引数2:引数2, ..., キーワード引数n:引数n)
```

### 配列
```php:PHP
/* 配列の初期化 */
$配列 = array(要素1, 要素2, /* ..., */ 要素n)

/* 要素の取り出し */
var = $配列[インデックス]
```

```ruby:Ruby
# 配列の初期化
配列 = [要素1, 要素2, 要素3]

# 要素の取り出し
配列[インデックス]
```

### 連想配列
```php:PHP
/* 連想配列の初期化 */
$配列 = array(
          キー1 => 要素1,
          キー2 => 要素2,
          ...,
          キーn => 要素n
);

/* 要素の取り出し */
var = $配列[キー]
```

```ruby:Ruby
# 連想配列の初期化
配列 = {
      キー1 => 要素1,
      キー2 => 要素2,
      ...,
      キーn => 要素n
}

# 要素の取り出し
配列[キー]
```

## 参考
* [PHPマニュアル](http://php.net/manual/ja/langref.php)
* [RubyLife](https://www.rubylife.jp/)
pythonでファイルを2進ダンプして，復元する

諸用でファイルを符号化して画像化したくなったので，その途中でやりました．
まずは以下のコードでファイルのバイナリをテキストとしてダンプします．

```python:genbin.py
import sys

argv = sys.argv
argc = len(argv)

if argc < 2:
    print("利用方法:python genbin.py [inputfile] [outputfile]")
    quit()

file_binary = ''

count = 0

with open(argv[1], 'rb') as f:
    for c in f.read():
        crbin = bin(c)[2:]
        if len(crbin) < 8:
            crbin = ((8 - len(crbin)) * '0') + crbin
        print(crbin, end='')
        file_binary += crbin
        count += 1
        if count % 6 == 0:
            print()
        else:
            print(' ', end='')

print(count*8)

with open(argv[2], 'w') as f:
    f.writelines(file_binary)
```
利用法はコード中にもある通り，`python genbin.py [バイナリ化対象ファイル] [ダンプ先ファイル]`です．ダンプ先は新規作成されます．
試しに以下の画像ファイルをダンプしてみます．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/225893/4c59432e-a957-73bf-c487-f387e05575d2.png)
ダンプされたファイルの先頭1000文字だけ一応載せます．

```binary:python.bin
1000100101010000010011100100011100001101000010100001101000001010000000000000000000000000000011010100100101001000010001000101001000000000000000000000000111001001000000000000000000000010000011100000100000000110000000000000000000000000110100110011101011110110111000000000000000000000001000000000000001001001010001000100000101010100011110000000000111101100101111011110100110010011011001011100011101110101001001111001011001010101110101010001101110111010101100011001001000000000000010000000001010100100101110001000000110001011011001001000101000100000010001111100101101001000001000111000111001100110010001100011000101100011110001010111100000001001010011110111100000111100111000010111000011111000100000111111111100101010011111110001100001111111101100111100001101001011100010000010001110000101001111001101011001000110100011110100010001010011000100101100010100011101000000000000100100010000001010111011000100110111000110101101110111101000011111011010110110111101111010100011110111000111001110011011111111110011
```

実際はこの01の羅列が718344[文字|バイト]ダンプされました．これはテキストの01なので，それぞれが1バイトを占有しており，ダンプされたファイルは元ファイルの8倍の容量になります．

なお，以下のコードでダンプした2進テキストファイルからもとのファイルを復元することができます．

```python:revbin.py
import sys
import struct

argv = sys.argv
argc = len(argv)

if argc < 2:
    print("利用方法: python rebin.py [inputfile] [outputfile]")
    quit()

binary = ''
with open(argv[1], 'rb') as inf:
    binary = inf.readline()
binary_str = binary.decode()

with open(argv[2], 'wb') as outf:
    for i in range(int(len(binary_str) / 8)):
        # print(hex(int(binary_str[:8], 2)) ,end="")
        outf.write(struct.pack("B", int(binary_str[:8], 2)))
        binary_str = binary_str[8:]

```
ここでは`python revbin.py python.bin python.out.png`として復元してみます．

出力された`python.out.png`は以下のものとなります．
![python.out.png](https://qiita-image-store.s3.amazonaws.com/0/225893/83ea7823-b2a5-ebe2-048e-992779d91d57.png)

まあ，見た目には上で貼ったものと全く同じものが復元されました．コマンドラインでdiffも取ってみます．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/225893/62d37dc2-e3cf-2a16-57c1-57b2c5657088.png)
同じらしいです．

今回はダンプしたバイナリを記述したテキストファイルは，この後別のプログラムに読ませて利用するので，人間に見やすいようにフォーマットを行ってはいません．ダンプ中に標準出力に表示するものは一応カラムを分けていますので，書き換えればダンプ内容をフォーマットしたものにすることももちろん可能です．というか標準出力するならファイルに渡せばいいですね．
NTTフレッツ光ネクストでインターネットが遅い話

最近よく耳にします。フレッツ網の混雑だとか、プロバイダを変えたらいいとか、ルーターを変えたらいいとか、色々言われています。酷い時は1Mbpsを切る場合もあるようです。
**実は原因はプロバイダでもルーターでも無い場合があります。**

# 何が原因なのか
当然ながら、フレッツ網の混雑やプロバイダでの混雑などもありますが、ここ最近顕著なのは**PPPoE接続時の速度低下**です。

### PPPoEってなに？
従来、NTTのフレッツ光系サービス（BフレッツやフレッツADSLなど）は、PPPoEと呼ばれる接続方式でインターネットに接続していました。
簡単に言えば、「**IDとパスワードを使って接続する方式**」です。

## なぜPPPoE接続時に速度低下するのか
理由は簡単。**PPPoE接続先の装置(網終端装置)がとっても混雑**しているからです。
PPPoE接続先の装置はNTTの装置ですが、動画コンテンツなど負荷の高いサービスが増えてきた影響で混雑しています。
また、光コラボレーション（光卸し）の開始により、ユーザー数が増えた事もあるでしょう。
*総務省によるISP事業者へのアンケート結果にも網終端装置が起因する速度低下について触れられています。
http://www.soumu.go.jp/main_content/000528647.pdf*

# 速度を改善するにはどうすればよいか
PPPoE接続ではない、別の接続方法で接続すれば改善する場合があります。
具体的は「DSLite」「v6プラス」「IPv6高速ハイブリッド」などの**IPv6を利用したIPv4インターネット接続(IPv6 IPoEと呼ばれている事が多い）方式**に変更することです。
但し、全てのプロバイダで提供しているわけではありません。
代表的なところでは、「@nifty」「So-net」「IIJmio（旧IIJ4U）」「ソフトバンク光」などなどです。

## 注意点
IPv6を利用したIPv4インターネット接続は、PPPoEとは異なり、制約があります。
いくつかある中で、一番気を付けるべきは**ポート開放（NAPT）**の制約です。
接続サービスにもよりますが、**80番などのWell-Knownポートの開放**がほぼほぼ出来なくなります。
Well-Knownポート以外でも利用できないポートがあったりしますので、**RDP接続やAirVideoServer**なども影響を受けます。
他にも、**HGWやIPv6 IPoE対応ルーターが必須**であることや**HGWでPPPoE設定ができなくなる**などがありますので、導入を検討される場合は十分に気を付けて下さい。
*GMOとくとくBBは、対応ルーターとセットになってたりします。*

#まとめ
- フレッツ光ネクストでインターネットが極端に遅い場合はPPPoE接続であることが原因かもしれない
- PPPoE接続が起因であれば続に言うIPv6を利用したIPv4インターネット接続に変更すれば改善することで改善する
- 制限もあるので注意が必要



※少し技術的な話について別でまとめる予定です。
Heroku本番環境にて、Assetが正常に反映されない。

# 開発環境
```
Ruby  2.3.1p112 (2016-04-26 revision 54768) [x86_64-darwin15]
Rails 4.2.10
Heroku
```

# 起こった問題
Ruby on Railsで作成したアプリケーションを、Herokuでデプロイしました。その際、development環境では正しく表示されていたビューが、**Herokuデプロイ後のproduction環境では以下のように崩れてしまいます**。アセットパイプラインでの処理に問題があるようです。

## スクリーンショット
### development環境では正しく表示されていたビューが
[![Image from Gyazo](https://i.gyazo.com/754043a584ff1c117e8f056ffac2d504.png)](https://gyazo.com/754043a584ff1c117e8f056ffac2d504)
### production環境では崩れている
[![Image from Gyazo](https://i.gyazo.com/f8bc9a32383527407d0e4a958fa576ce.png)](https://gyazo.com/f8bc9a32383527407d0e4a958fa576ce)

 わかりにくいですが、サービスロゴが表示されない、フォントカラーやボーダーカラーが指定したものと異なる。などなど


# 原因
Herokuではアセットパイプラインに関して必ず設定が必要です。以下に手順を記載します。

### 1. config/application.rbに下記コードを追記
```
config.assets.initialize_on_precompile = false
```


### 2. ターミナルにて下記コマンド実行
```
$ heroku run bundle exec rake assets:precompile RAILS_ENV=production -a [appname]
```
#### 説明

```heroku run [コマンド] -a [appname]```
  Herokuサーバーにてコマンドを実行するために必要なコマンド。Herokuに登録されているアプリ名をオプションで指定する必要あり。
```bundle exec rake assets:precompile RAILS_ENV=production```
  アセットのプリコンパイルを手動で実行するためのコマンド。production環境を指定し実行している。
```

※以下に[Herokuドキュメント](https://devcenter.heroku.com/articles/rails-asset-pipeline)の抜粋を記載します。

> 
Troubleshooting
Failures in the assets:precompile task
In Rails 3.x, you can prevent initializing your application and connecting to the database by ensuring that the following line is in your config/application.rb:
```config.assets.initialize_on_precompile = false```
Do not forget to commit to git after changing this setting.
Before you can compile your assets on Heroku, you’ll need to be able to compile them locally, run this command to debug your assets:
```$ RAILS_ENV=production bundle exec rake assets:precompile```
This should complete with no errors. Do NOT check in the assets into git after running this command.


## 参考
[RailsGuidesアセットパイプライン](https://railsguides.jp/asset_pipeline.html)
[Rails Asset Pipeline on Heroku](https://devcenter.heroku.com/articles/rails-asset-pipeline)
[RubyStudioアセットパイプライン](http://ruby.studio-kingdom.com/rails/guides/asset_pipeline)
[Rails4 asset pipeline関連設定まとめ（Heroku対応込）](https://qiita.com/tomomomo1217/items/fa8dfa094cc4c0e4e350)
[Rails初学者がつまずきやすい「アセットパイプライン」](https://www.transnet.ne.jp/2016/02/28/rails%E5%88%9D%E5%AD%A6%E8%80%85%E3%81%8C%E3%81%A4%E3%81%BE%E3%81%9A%E3%81%8Dcolnr%E3%80%8C%E3%82%A2%E3%82%BB%E3%83%83%E3%83%88%E3%83%91%E3%82%A4%E3%83%97%E3%83%A9%E3%82%A4%E3%83%B3/)

# 最後に
どなたかの助けになれば幸いです。間違っている点、アドバイスなどあればコメントいただければと思います。
logmonのログをTypetalkに通知する

## はじめに
企業や組織によっては、不正アクセス防止・検知の観点から、リモートサーバーへのSSHログイン履歴をログに保存したりリアルタイムに検知することが求められる場合があります。
簡易的な方法として、logmonで検知した結果を[Typetalk](https://www.typetalk.com/ja/)に通知する設定を行ってみます。

セキュリティ監査などの証跡とする場合や、本番サーバーでの運用にのせる場合は、"どのようなログを検知するか" "そもそもそのログは改ざんされてないか" など考慮することがあると思いますが、ここではそれには触れません。

## 前提条件
- Typetalkのアカウントがあり、利用していること。
- logmonが動作するOS環境があること。(ここでは、CentOS 6や、Amazon Linuxを想定)

## 参考情報
- https://developer.nulab-inc.com/ja/docs/typetalk/
- https://qiita.com/inouet/items/cc1eacef237f2328e98f

## Typetalk bot の設定

1. 通知を行いたいトピックを開き、トピックタイトルの隣にある歯車のアイコンをクリックします。
<img width="600" alt="bot-Typetalk01.png" src="https://qiita-image-store.s3.amazonaws.com/0/61809/7a8c3b22-bc65-0df8-39a7-0a6b7c5aa3a4.png">

2. "ボット" をクリックし、ボット一覧画面の "新規作成" をクリックします。
<img width="600" alt="bot-Typetalk02.png" src="https://qiita-image-store.s3.amazonaws.com/0/61809/759e11d0-6c4c-1681-df38-fd117f9bb692.png">

3. "ID" と "名前" は任意の名称を設定します。ここでは、logmon_botとします。 "topic.post"にチェックをいれます。
<img width="500" alt="bot-Typetalk03.png" src="https://qiita-image-store.s3.amazonaws.com/0/61809/50162dea-fe10-93ab-4cf5-12d719655791.png">

4. さきほどのボット一覧画面に、作成したボットが表示されました。歯車のアイコンをクリックし、内容を確認します。
5. "メッセージの投稿コマンドのサンプル" に表示されている curl コマンドを、後述の logmon で使用します。

## logmon

### インストール

```shell
$ git clone https://github.com/moomindani/logmon.git
$ cd logmon
$ sudo ./setup.sh
```

### 設定
公開鍵認証でSSH接続に成功したログを検知する例。
curlコマンドの行には、Typetalkでlogmon_botを作成した際の "メッセージの投稿コマンドのサンプル"をコピペします。

```shell
$sudo vi /etc/logmon/logmon.conf
```

```shell
:/var/log/secure
(Accepted publickey)
curl --data-urlencode 'message=<%%%%>' -d 'typetalkToken=xxxxxxxxxxxxx' 'https://typetalk.com/api/v1/topics/xxxxx'
```

設定内容をチェックし、サービスを再起動します。
logmon.conf を編集した場合は、サービスの再起動が必要です。再起動しなければ設定内容が反映されません。

```shell
$ sudo service logmon check
$ sudo service logmon restart
```

ログ検知と通知が成功すると、Typetalkのトピックにメッセージが表示されます。
<img width="600" alt="bot-Typetalk06.png" src="https://qiita-image-store.s3.amazonaws.com/0/61809/15357cef-1239-0ef7-d13d-50bcb2a797d5.png">
AWS CodeCommitを使ってソースコード管理


# やりたいこと
AWS CodeCommit でソースコード管理したい。
または
AWS CodePipleine のトリガーにCodeCommitを使いたい。 ← 私の場合はこちら

# 前提
- AWSアカウントがある。
- AWS CLIがローカルにインストールされている。

# 大まかな流れ
1. AWS CodeCommitにリポジトリと、アクセスするためのIAM User作成
3. AccessKey設定
4. gitにCodeCommit認証設定
4. CodeCommitにpush


# 手順
## CodeCommitにリポジトリとアクセスするIAM User作成する。

今回は、以下の内容で設定する。

CodeCommitリポジトリ名：MyRepoName
IAM User：
 - ユーザ名：codecommit-user-test
 - グループ名：codecommit-group-test
 - 権限ポリシー：AWSCodeCommitPowerUser


CloudFormation yamlファイル

```yaml
AWSTemplateFormatVersion: 2010-09-09
Description: CodeCommit Test
Resources:
  MyRepo:
    Type: AWS::CodeCommit::Repository
    Properties:
      RepositoryName: MyRepoName
      RepositoryDescription: My test repository
  IamUserCodeCommit:
    Type: AWS::IAM::User
    Properties:
      UserName: codecommit-user-test
      Groups:
      - !Ref 'IamGroupCodeCommit'
  IamGroupCodeCommit:
    Type: AWS::IAM::Group
    Properties:
      GroupName: codecommit-group-test
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AWSCodeCommitPowerUser

```

上記 yamlをCloudFormationでstackを作成して実行



## IAM Userのアクセスキー発行

- AWS マネージメントコンソール → [IAM] → [Users] → 今回対象のユーザ[codecommit-user-test] → [Security credentials] → [Create access key]   
- 上記で  [Access key ID] と、[Secret access key] が発行されるので、メモるかcsvでダウンロードする

- aws設定ファイルにプロファイルを追加する。
- 複数プロファイルを扱う場合は、下記のようにプロファイルに名前をつける。今回は、CodeCommitTest という名前をつけた。

```~/.aws/config

[profile CodeCommitTest]
output = json
region = ap-northeast-1  ← 今回使うリージョンを指定

```



- 先ほど発行した[Access key ID] と、[Secret access key] をcredentialsファイルに設定

```~/.aws/credentials
[CodeCommitTest] ← 上記で設定したプロファイル名
aws_access_key_id = AAAAAAAAAAAAAAAAAAAAAAAA
aws_secret_access_key = SSSSSSSSSSSSSSSSSSSSSSSSSSS

```


## gitコマンドにCodeCommit認証情報を設定

   - 複数リポジトリを扱う場合、credential の横に対象のリポジトリURLを指定する。
(リポジトリURLはコンソールのCodeCommitのリポジトリの画面で　[Clone URL] ボタンを押すと出てくる。)

```~/.gitconfig

     :

[credential "https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/MyRepoName"]
        helper = !aws codecommit --profile CodeCommitTest credential-helper $@
        UseHttpPath = true

```



## CodeCommitから git cloneし、ファイルを作成してcommit, pushする

```bash
$ git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/MyRepoName
$ cd MyRepoName/
$ echo "# My test repo" > README.md
$ git add .
$ git commit -m "My first commit."
$ git push origin master

```

あとはいつものGit操作で引き続き・・

もし、すでにリモートリポジトリがあるGit管理のソースの場合、以下のように git push --mirror すれば一度で全部 pushできる。

```bash
$ git push --mirror https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/MyRepoName


```
ionicで進捗を表すアニメーションを使う

# 簡単に進捗を表すアニメーションを実装したい

iPhoneアプリ・AndroidアプリをIonicで実装中。

円形のアニメーションを表現したく、
https://github.com/kimmobrunfeldt/progressbar.js
を発見。
実際にionicでこれを使ってみることに。

## インストール
```
npm install progressbar.js
```

## 早速使ってみる
```
ionic start progressbarSmpl
```

インストールが完了すると以下が追記されているはず。

```package.json
"dependencies": {
  "progressbar.js": "^1.0.1",
}
```

空のプロジェクトを作成して、早速```home.ts```で使ってみる

```home.ts
const ProgressBar = require('progressbar.js'); ← add line

@Component({
  selector: 'page-home',
  templateUrl: 'home.html'
})
....
```

このままだと```require```が使えないので

```home.ts
declare function require(x: string): any;
```

これを追加して、準備完了。

LineとCircleのサンプル

```home.ts
  ionViewDidLoad() {
    const element = document.getElementById('example-line-container');
    const line = new ProgressBar.Line(element, {
      color: "#FCB03C",
      trailColor: "#aaa"
    });

    line.animate(1, function() {
      line.animate(0);
    })
    const container = document.getElementById('example-circle-container');
    const bar = new ProgressBar.Circle(container, {
      strokeWidth: 6,
      easing: 'easeInOut',
      duration: 1400,
      color: '#FFEA82',
      trailColor: '#eee',
      trailWidth: 1,
      svgStyle: null
    });

    bar.animate(1.0);
  }
```
モバイル通信において電波の状態に影響を与える要因

# 電波の状態に影響を与える要因

* 基地局との距離
* アンテナの種類
* アンテナの向き
* 障害物
* 遮蔽物
* 水分 (水分によって電波が減衰する)

https://www.nttdocomo.co.jp/support/area/feature/

https://www.nttdocomo.co.jp/area/network/

https://www.nttdocomo.co.jp/corporate/technology/rd/tech/network/base_and_mobile_stations/index.html

https://bbs.kakaku.com/bbs/J0000020125/SortID=20660367/

https://www.teradas.net/archives/16654/
NodeでRedisのBLPOPを試す

Redisのことを調べている途中、BLPOPの挙動のイメージがつかなかった為、実際にNodeで動かして動作を試してみた。

```js:nodeRedis.js
const redis = require('redis')
const client = redis.createClient()
const clientBlocking = client.duplicate()

client.on('error', err => {
  console.log(`Error ${err}`)
})

let count = 0

const rpushQueue = () => {
  console.log('rpush called')
  client.rpush('dataQueue', `This is message${count}`)
  count += 1
  setTimeout(rpushQueue, 1000)
}

const blpopQueue = () => {
  console.log('blpop called')
  clientBlocking.blpop('dataQueue', 5, (err, data) => {
    console.log('brpop returned')
    console.log(data)
    setTimeout(blpopQueue, 1000)
  })
}

rpushQueue()
blpopQueue()
```

```
実行結果

rpush called
blpop called
rpush returned
blpop returned
[ 'dataQueue', 'This is message0' ]
rpush called
rpush returned
blpop called
blpop returned
[ 'dataQueue', 'This is message1' ]
rpush called
blpop called
rpush returned
blpop returned
[ 'dataQueue', 'This is message2' ]
rpush called
blpop called
blpop returned
[ 'dataQueue', 'This is message3' ]
rpush returned
rpush called
blpop called
rpush returned
blpop returned
[ 'dataQueue', 'This is message4' ]
rpush called
blpop called
rpush returned
blpop returned
[ 'dataQueue', 'This is message5' ]
rpush called
blpop called
rpush returned
blpop returned
[ 'dataQueue', 'This is message6' ]
```

```
Redisサーバーが受け取ったコマンドをモニタリング

127.0.0.1:6379> monitor
OK
1534090072.046673 [0 127.0.0.1:64628] "info"
1534090072.047025 [0 127.0.0.1:64629] "info"
1534090072.048497 [0 127.0.0.1:64628] "rpush" "dataQueue" "This is message0"
1534090072.049054 [0 127.0.0.1:64629] "blpop" "dataQueue" "5"
1534090073.050424 [0 127.0.0.1:64628] "rpush" "dataQueue" "This is message1"
1534090073.051476 [0 127.0.0.1:64629] "blpop" "dataQueue" "5"
1534090074.054616 [0 127.0.0.1:64628] "rpush" "dataQueue" "This is message2"
1534090074.055912 [0 127.0.0.1:64629] "blpop" "dataQueue" "5"
1534090075.056934 [0 127.0.0.1:64628] "rpush" "dataQueue" "This is message3"
1534090075.057328 [0 127.0.0.1:64629] "blpop" "dataQueue" "5"
1534090076.058631 [0 127.0.0.1:64628] "rpush" "dataQueue" "This is message4"
1534090076.058961 [0 127.0.0.1:64629] "blpop" "dataQueue" "5"
1534090077.060440 [0 127.0.0.1:64628] "rpush" "dataQueue" "This is message5"
1534090077.060917 [0 127.0.0.1:64629] "blpop" "dataQueue" "5"
1534090078.065384 [0 127.0.0.1:64628] "rpush" "dataQueue" "This is message6"
1534090078.065597 [0 127.0.0.1:64629] "blpop" "dataQueue" "5"
1534090079.071470 [0 127.0.0.1:64628] "rpush" "dataQueue" "This is message7"
1534090079.071899 [0 127.0.0.1:64629] "blpop" "dataQueue" "5"
1534090080.072054 [0 127.0.0.1:64628] "rpush" "dataQueue" "This is message8"
1534090080.072165 [0 127.0.0.1:64629] "blpop" "dataQueue" "5"
1534090081.077364 [0 127.0.0.1:64628] "rpush" "dataQueue" "This is message9"
1534090081.077900 [0 127.0.0.1:64629] "blpop" "dataQueue" "5"
1534090082.078408 [0 127.0.0.1:64628] "rpush" "dataQueue" "This is message10"
1534090082.079060 [0 127.0.0.1:64629] "blpop" "dataQueue" "5"
```
UnityでGetComponentできないときに見て欲しい、AwakeとStartについて

Unityではオブジェクトにつけたスクリプトを読み取りたいときにGetComponentを使います。
そのようなときにどうしてもGetComponentができない！となった時に見直して欲しい事です。
#1.インスペクタには取得したいスクリプトがついている
インスペクタ上ではスクリプトがオブジェクトにアタッチされていて、値もしっかり入っている

#2.GetComponentがAwakeのタイミングで行われている
取得したいオブジェクト自体がStart関数で初期化されているが、GetComponentを行っているスクリプトはAwakeでGetComponentを行っている

***
このようにインスペクタの見た目上では値が入っているのに、なぜかGetComponentでNullPointerExceptionを吐くというときにはAwakeとStartの読み込み順番が関係している可能性があります。
GetComponentされるほうが先にStart関数もしくはAwake関数を読み込んでいないことがあるので注意です。
PC-98 MASM32でランダムドット

```pset.asm
comment *
        pset.asm for MASM32

path %path%;C:\masm32\bin
ml /c /AT /Fl pset.asm
link16 /t pset;
*
        .model  tiny

        .code
;       org     100h            ; .com
        org     0h              ; IPL
start:
        call    crtini
        push    cs
        pop     ds
mloop:
        mov     dl, 1           ; pset
        mov     dh, 0
        call    paint
        mov     dh, 1
        call    paint

        call    rndot

        mov     dl, 0           ; preset
        mov     dh, 0
        call    paint
        mov     dh, 1
        call    paint

        call    rndot
        jmp     mloop

;       mov     ax, 4c00h
;       int     21h

rndot:
        mov     cx, 50000
rndot1:
        push    cx
@@:
        call    rnd
        cmp     al, 160
        jae     @b
        and     ah, 7fh
        cmp     ah, 100
        jae     @b
        mov     cx, ax
        mov     dl, 1
        call    pset
@@:
        call    rnd
        cmp     al, 160
        jae     @b
        and     ah, 7fh
        cmp     ah, 100
        jae     @b
        mov     cx, ax
        mov     dl, 0
        call    pset

        pop     cx
        loop    rndot1
        ret

rnd:
        mov     ax, seed
        add     ax, ax
        mov     dl, ah
        jnc     @f
        xor     dl, 02h
@@:
        test    dl, 02h
        jnz     @f
        inc     al
@@:
        mov     seed, ax
        ret

seed    dw      0cafeh

paint:
        mov     ch, 0
paint1:
        mov     cl, dh
@@:
        call    pset
        inc     cl
        inc     cl
        cmp     cl, 160
        jb      @b
        inc     ch
        cmp     ch, 100
        jb      paint1
        ret

crtini:
        mov     ax, 0a000h      ; T-VRAM
        mov     es, ax
        mov     al, 01h         ; 簡易グラフモード
        out     68h, al         ; T-GDC ライトモードレジスタ1

        mov     di, 2000h       ; アトリビュート
        mov     al, 0b1h
        mov     cx, 80*25
@@:
        mov     es:[di], al
        inc     di
        inc     di
        loop    @b

        push    es              ; 画面クリア
        pop     ds
        mov     si, 0h
        mov     word ptr ds:[si], 0h
        mov     di, 2h
        mov     cx, 80*25-1
        cld
        rep movsw
        ret

; ch=y cl=x dl=pset/preset
pset:
        mov     al, ch
        and     al, 0fch
        mov     ah, 40
        mul     ah
        mov     di, ax
        mov     al, cl
        and     al, 0feh
        mov     ah, 0
        add     di, ax

        mov     bl, ch
        and     bl, 03h
        mov     bh, 0
        test    cl, 01h
        jnz     @f
        mov     al, pbits0[bx]
        jmp     pset1
@@:
        mov     al, pbits1[bx]
pset1:
        test    dl, 01h
        jz      @f
        or      al, es:[di]     ; pset
        mov     es:[di], al
        ret
@@:
        not     al              ; preset
        and     al, es:[di]
        mov     es:[di], al
        ret

pbits0  db      01h,02h,04h,08h
pbits1  db      10h,20h,40h,80h

        end     start
```

![ipl.png](https://qiita-image-store.s3.amazonaws.com/0/257554/14ac1320-c674-a091-2c9d-a9c2fa8e8a87.png)
Docker Community Edition のインストール

インストールメモ。とは言ってもそのまま手順をなぞっただけだけど。

# 手順
1. 依存ライブラリをインストールする

    ```
    # yum install -y yum-utils \
     device-mapper-persistent-data \
     lvm2
    ```

2. Docker Community Edition のリポジトリを登録する

    ```
    # yum-config-manager \
     --add-repo \
     https://download.docker.com/linux/centos/docker-ce.repo
    ```

3. Docker をインストールする

    ```
    # yum install docker-ce
    ```

4. Docker を起動する

    ```
    # systemctl start docker
    ```

# 参考
- [Get Docker CE for CentOS](https://docs.docker.com/install/linux/docker-ce/centos/#upgrade-docker-ce)
php-master-changes 2018-08-12

コミットログから記事の雛形を吐くスクリプトを雑に用意したりした

# 2018-08-11
- 11 日は master にコミットが入らなかったのであって、別にサボっていたとか忘れていたとかではない
- なお「そういえば今日は何もないな」と気付いたのは夜中の 2 時だったし完全に寝る前だった

# 2018-08-12
## morrisonlevi: Quell GCC warning on mixing || and &&
- https://github.com/php/php-src/commit/29b56a878aa22310d645c3266110417e07ebe683
- GCC が || と && を混ぜて使うことへ親切にも警告を出してくれるのを、括弧つけて黙らせる

## crrodriguez: Fix bug #76030 RE2C_FLAGS rarely honoured
- https://github.com/php/php-src/commit/e0fe667421bfd49d25f0052d873cef7c344ebb74
- PHP 5.3 から字句解析器の生成に使われている re2c で、RE2C_FLAGS があまり参照されてなかった問題の修正
- ext/json の JSON パーサや ext/pdo の SQL パーサ、ext/phar のパスチェック、ext/standard のアンシリアライザと [url_rewriter](http://php.net/manual/ja/outcontrol.configuration.php#ini.url-rewriter.tags) などで使われる URL スキャナで、RE2C_FLAGS を参照して字句解析器を吐くよう修正
- computed goto が一貫して適用できるように

## petk: [ci skip] Update NEWS
- https://github.com/php/php-src/commit/326d3d480c8187545f3e794c68c1fde09206fad9
- ↑の RE2C_FLAGS の修正を NEWS に追加

## pmmaga: Fix #76688: Disallow excessive parameters after options array
- https://github.com/php/php-src/commit/a16aee6cee77571e3af604117bdc48b75d8a3315
- SameSite cookie 対応でオプションを配列で受けるようになった関数について、オプション配列利用時に余分なパラメータを渡すと叱るよう修正

## carusogabriel: Fix some misspellings
- https://github.com/php/php-src/commit/84b195d9fc5ba2b65ceb46d8ec3d4676bf51a538
- ソースコード中のスペルミスを修正
- [スペルチェッカかけた](https://github.com/php/php-src/pull/3433)くさい
    - https://github.com/vlajos/misspell-fixer

## carusogabriel: Drop spl/internal documentation
- https://github.com/php/php-src/commit/9003d8a4cfe810b9222273a36b9be89dda94a35b
- SPL のドキュメント用 PHP コードの削除
- 元々 PHP で例示コード的に作っていたファイルを C 実装に移行した時の名残とか？
    - https://github.com/php/php-src/commit/b9470609ad6ccb27ec38c8dd1fdbe121a41f33b5#diff-a5f02e120405de40357eb0724036f65e
久しぶりにPaperclip x Cloudinary使って詰まったので、メモ残す

# はじめに
RailsにPaperclip x Cloudinaryを久々に導入したのですが、エラーでいろいろ詰まってしまったので、その時のメモを残そう。
ちなみにgem 'paperclip-cloudinary'も使っています。

# Paperclip::Errors::InfiniteInterpolationError

パス指定しないとこのエラーが出るようです。

```ruby:article.rb 
has_attached_file :image,
:path => ':id/:style/:filename'
```
# Invalid image file

avatarのimageだけで使う場合は問題ないと思いますが、
mp3、mp4のような形だと引っかかる可能性があるので、気をつけましょう。

```ruby:mp3の場合
has_attached_file :mp3, 
:cloudinary_resource_type => :raw
```
mp3の場合はraw指定で試して本番環境の動作確認もできました。(もしかしたら、audioでもいけるかも、、)
他のxlsといった形式もrawのようです。

```ruby:mp4の場合
 has_attached_file :mp4,
:cloudinary_resource_type => :video
```

# 参照
[Raw file uploading](https://cloudinary.com/documentation/node_image_upload#raw_file_uploading)
[Paperclip::Errors::InfiniteInterpolationError #1
](https://github.com/GoGoCarl/paperclip-cloudinary/issues/1)
地球温暖化

#地球温暖化を研究してみよう
　というわけで、jaxaのg-portalからSST（海面温度）のデータをダウンロードする。
 https://gportal.jaxa.jp/gpr

#g-portalはよくわからん

とりあえず、フォーマット変換ツールをダウンロードする。
ついでに、qgisもインストールしておく。

#GeoTiffを作成する
　ダウンロードした中に
　GW1AM2_20180600_01M_EQMA_L3SGSSTLB3300300.h5
といった、「1M」のデータがある。これが、１ヶ月分のデータで
あとは、1Dで一日分なので、歯抜けだらけである。このデータが
１ヶ月に２ファイルあるので、それをフォーマット変換ツールでGeoTiffにする。
ただし、この1Mのデータ160MBもある・・お気をつけて・・

#Qgisで確認する
　とりあえず、レイヤーにラスタレイヤを追加するのだが、色が表示したいですね。
　レイヤのプロパティでレンダリングタイプをsingleband pseudocolorに
変更して、0-4000までの分類で色づけする。0.01度単位にGeoTiffを作成している
ようである。


そのあと、500単位でラスタ→抽出→等高線で、等高線も作ってみる。

っでこんな感じですかね
　![image.png](https://qiita-image-store.s3.amazonaws.com/0/60225/5e8c3bb9-ae9b-0b9d-da47-c9d61e08d439.png)

これは、2018年７月のデータである。

なんだか、ここまで来るのに、完全に１日費やしてしまった。ただの、図だけだと
http://images.remss.com/amsr/amsr2_data_3day.html?&keep=0
 あたりの方がいいと思うんだけど、GeoTiffがほしかったんですよね
[cocoa][swift]Cocoa.swift 2018-09のご案内

<p>次回勉強会の案内です。</p>

<p>秋に特別な勉強会の開催を検討しています。各自取り組んでいることをしっかりと発表できる場になればと考えています。場所も何時もの池袋以外を考えているのですが、このタイミングで勉強会の名称の修正を考えています。</p>

<p>Cocoa勉強会 関東 Swift分科会ということで、Cocoa.swiftでどうでしょうか？</p>

<p>今後も池袋以外での開催の可能性があるとうことで名称に場所を含めない。そして、Cocoa勉強会の分科会ということでBUKUROをCocoaに差し替える。ご意見がある方は、九月の勉強会でお聞かせください。</p>

<hr />
<b>■ 第114回 Cocoa勉強会 関東 のご案内</b>
<dl>
<dt>日時：</dt><dd>2018/09/12(水) 19:30-22:00</dd>
<dt>会場：</dt><dd>池袋コワーキングスペース OpenOffice FOREST<br />http://co-forest.com</dd>
<dt>集合：</dt><dd>現地</dd>
<dt>座席代：</dt><dd>夜間ドロップイン 一人1,000円</dd>
</dl>
<hr />

<b>■出欠の登録</b>
<p>以下のconnpassサイトからお願いします。<br />
https://cocoa-kanto.connpass.com/event/97193/</p>

<pre><code>
[スケジュール]
18:00  自習
19:30  自己紹介
20:00  発表
- 20:00〜20:30 「募集中」未定
- 20:30〜21:00 「符号化について」村上幸雄
  ASN.1, JSON, MessagePack, ProtocolBuffers, FlatBuffers, Avro
- 21:00〜21:15 「募集中」未定
21:15 モブプログラミング
- Master-Detail App を実装する（モデルをどう持つ？etc）
21:30 秋の大勉強会について考える
21:45  次回日程の決定、片づけ
22:00  解散
</code></pre>

【関連情報】
<a href="https://cocoa-kanto.connpass.com/event/97193/">Cocoa.swift 2018-09</a><br />
<a href="https://cocoa-kanto.connpass.com/">Cocoa.swift</a><br />
<a href="https://www.facebook.com/groups/cocoa.kanto/">Cocoa勉強会 関東</a><br />
<a href="http://www.bitz.co.jp/weblog/">Cocoa練習帳</a><br />
<a href="https://qiita.com/m_yukio">Qiita</a><br />
TypeScript 3.0のunknown型 - タイプセーフなany

TypeScript3.0で**unknown型**が追加されました。
[TypeScript 3\.0 # New unknown top type · TypeScript](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-0.html#new-unknown-top-type)

unknown型は、any型のタイプセーフ対応版のようです。unknown型には任意の値を代入できる点はany型と同一ですが、型アサーション等が無いと利用できません。

例として、`String.indexOf()`メソッドを`string`でないインスタンスで実行してみます。

```typescript
var one: any = 1;
var two: unknown = 2;

one.indexOf("1"); // 実行時エラー (>_<)
two.indexOf("2"); // コンパイルエラー \(^o^)/

if (typeof two === "string") {
  two.indexOf("2");  // これはOK \(^o^)/
}
```
unknown型ならば、未知のデータを代入できるというany型の恩恵を受けつつ、型の違いによる不具合をコンパイル時のエラー(`$ tsc`コマンド等)で事前に検知することができ、安全になります。

Webサービスやユーザ入力値等に対する利用が想定されていて、たとえば`JSON.parse()`の返り値に適用できる点が、[TypeScript公式のissueでも言及](https://github.com/Microsoft/TypeScript/issues/10715)されています。イメージとしてはこんな感じでしょうか。

```typescript
const json: string = '{"1": "1", "2": "2"}'

const json_any: any         = JSON.parse(json);
const json_unknown: unknown = JSON.parse(json);

json_any["1"]     + json_any["2"]     // 3ではなく"12"になってしまう (>_<)
json_unknown["1"] + json_unknown["2"] // コンパイルエラー \(^o^)/
```

参考: [DefinitelyTyped/types/parse-json/index.d.ts](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/e2894b2b7a46620d8beaf8274a5a6eeeeea6c810/types/parse-json/index.d.ts)

## 環境
- TypeScript 3.0.1
HTML,CSS実装編

1. htmlファイル内にはhtmlタグだけ、cssファイル内にはcssだけにするとあとから見やすく修正もしやすい。
2. `vertical-align:middle;`はインライン要素、テーブルタグに対してだけ使えて、親要素に対して上下中央揃えにできる。
3. `float`を使ったら、親要素で必ず`overflow:hidden;`を使って回り込みを解除。
4. CSS3から使える`box-sizing:border-box;`を使うことで`padding`や`border`の幅も指定したwidth内に自動でおさめてくれる。
5. `width`に100%を指定すると親要素の`width`幅いっぱいという指定に。
6. ブラウザによってデフォルトでタグにスタイルが設定されている。実際はデフォルトのスタイルが邪魔なので、リセットCSSを使ってデフォルトのスタイルをリセットする。ネット上にあるものを使えばよし。

>[ウェブカツ！！](https://webukatu.com/?afid=p5lxu1kvh03rayd2ctjsw4e9bgzq8nom)
【メモ】CUDAインストールに-lnvcuvid が見つからない

# はじめに
自分へのメモです。CUDAのインストールが上手くいかない記事は死ぬほどあるので。

# 環境
OS: Ubuntu 14.04 LTS
GPU: GeForce 1070

# インストール
## Cuda インストール
[CUDA Toolkit | NVIDIA Developer](https://developer.nvidia.com/cuda-toolkit)

上のリンクからCUDA8.0をダウンロードする。
自分は Linux -> x86_64 -> Ubuntu -> 14.04 -> deb

```bash
sudo dpkg -i cuda-repo-ubuntu1404-8-0-local-ga2_8.0.61-1_amd64.deb
sudo apt update
sudo apt install cuda
```

## bashrcに記述
```bashrc
export CUDA_HOME=/usr/local/cuda-8.0
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${CUDA_HOME}/lib64
export PATH=$PATH:${CUDA_HOME}/bin
```

```bash
source ~/.bashrc
```
再起動

```
nvidia-smi 
```
で上手くGPUの状況が帰ってくればドライバーは動いている。
CUDAが上手く動くかためす。

## サンプルを動かす
サンプルをダウンロード

```bash
cuda-install-samples-8.0.sh ~
cd NVIDIA_CUDA-8.0_Samples/
sudo make
```

# 問題
```bash
/usr/bin/ld: -lnvcuvid が見つかりません
collect2: error: ld returned 1 exit status
make[1]: *** [cudaDecodeGL] エラー 1
```
libを上手く読み込めていないようです。
理由は`3_Imaging/cudaDecodeGL/findgllib.mk`の61行目で`UBUNTU_PKG_NAME = "nvidia-375"` という風にnvidia-375を用いることを前提としているからです。ここを変えます。

```
dpkg -l | grep nvidia
```
インストール？されているnvidia pkgが全部みれます。
何個かあったので自分は全部試しました。

自分は`nvidia-384`だったので
`3_Imaging/cudaDecodeGL/findgllib.mk`の61行目を`UBUNTU_PKG_NAME = "nvidia-384"`に変更

もう一度

```
sudo make
````

これで上手くいきます。
試しに

```
./smokeParticles
```
で煙がふおおおおあああああんって動くプログラムが動き出します！！

初CUDA!!!! 次はcuDNNです





# おまけ (cuDNNのインストール)
[公式サイトからインストール](https://developer.nvidia.com/rdp/cudnn-download)

```
tar -zxf cudnn-8.0-linux-x64-v7.2.1.38.tgz 
sudo cp cuda/lib64/libcudnn* /usr/local/cuda-8.0/lib64/
sudo cp cuda/include/cudnn.h /usr/local/cuda-8.0/include
```
Python 2.7の class変数で PyCharmのコード補完(Type Hints?)を可能にする

PyCharm でclassの変数にコード補完をさせたい。百聞は一見にしかず。

## コード補完が効かない書き方
```py:no_type_hint.py
import redis

class MyRedis(object):
  def __init__(self):
    self.client = None

  def connect(self):
    self.client = redis.StrictRedis()

# 以下を入力してもコード補完されない
MyRedis().client.
```
<img width="694" alt="スクリーンショット 2018-08-12 23.22.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/973/76b49baf-583b-b386-01f3-ca2eeafe1a14.png">


## コード補完を効かせる書き方
```py:type_hint.py
import redis

class MyRedis(object):
  def __init__(self, client=None):
    # type: (redis.StrictRedis) -> None  # ←ポイント
    self.client = client

  def connect(self):
    self.client = redis.StrictRedis()

# 以下client後のピリオドを入力すると、 `redis.StrictClient` のコード補完が行われる
MyRedis().client.
```
<img width="692" alt="スクリーンショット 2018-08-12 23.23.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/973/239a5871-50ee-bd39-42c8-e592a14b2702.png">
`redis.StrictRedis` のメソッドである `incr(..)` などが補完候補されていることが確認できる

## 動作確認
- PyCharm 2018.2 CE

## いいわけ
`Type Hints` や `PEP 484` について、著者は正しく理解しているわけではないです。実績ベースの `できた！` を本記事にて共有させてください。

## 参考文献
- [Python 2 と型ヒント (Type Hints) - ymyzk’s blog](https://blog.ymyzk.com/2016/02/python-2-type-hints/)
- [[翻訳] PEP 0484 -- 型ヒント (Type Hints) - Qiita](https://qiita.com/t2y/items/f95f6efe163b29be59af)
- [Suggested syntax for Python 2.7 and straddling code - Python.org](https://www.python.org/dev/peps/pep-0484/#suggested-syntax-for-python-2-7-and-straddling-code)
Ruby 例外について

## 例外とは
プログラム実行時に発生したエラー(予想外の動作)のこと

例えば以下のような動作のことをいう

- 存在しないメソッドが呼び出された
- 存在しないカラムにアクセスした
- APIでリクエストを投げたがレスポンスが返ってこない

例外が発生した際は、そのままプログラムを走らせると予期しない結果になる可能性があるため、例外に応じてリカバリ処理を入れたり処理をスキップさせるなどの対応が必要になる(例外処理)。

## 例外をつかまえる(例外を処理する)
- begin〜rescue〜end

```ruby:構文
begin

  #例外を発生させる可能性のある処理

rescue [捕まえたい例外]

  #例外が起こった場合の処理

end
```

#### rescueの第1引数には捕まえたい例外クラスを指定
第1引数で指定した例外クラスの下の階層にある例外だけを捕捉する。
デフォルト(引数省略時)は、StandardErrorクラスを指定したとみなす。

## 例外を発生させる
- raiseメソッド
Kernelモジュールで定義されているメソッド。

```ruby:raiseを実行
# 引数に文字列を指定した場合
#    ==> 文字列をメッセージとする`RuntimeError`例外を発生させる
raise "エラー発生"
RuntimeError: エラー発生

#引数に例外クラスを指定した場合
#    指定した例外クラスの例外を発生させる
raise ArgumentError
ArgumentError: ArgumentError

```


## 独自の例外クラスをつくる
独自の例外クラスとは？
Rubyで用意されている標準例外クラスとは別で独自の例外クラスを使いたい時に、独自例外クラスを定義して任意の例外に対して独自の例外を発生できるようにする。
独自の例外クラスを作成したいときは、
独自の例外クラスをつくるには、```StandardError```を継承する(推奨)。

例
・独自例外クラスを定義

```ruby:XXXApiTimeException
class XXXApiTimeException < StandardError
end
```

・独自例外を発生させ、捕捉する

```ruby:begin〜rescue〜end
begin
  xxxxxx #APIがタイムアウトするような例外が発生する処理
  raise XXXApiTimeException

rescue XXXApiTimeException
  xxxxxx #リカバリ処理

end
```

## 継承にStandardErrorクラスが推奨される理由
例外クラスを実装する場合には、標準の例外クラスのどれかを継承すれば良いとあるのになぜ```StandardError```の継承が推奨されるのか？

そもそも標準例外クラスとは？
階層は以下の通り。

```ruby:標準例外クラスの階層(一部を抜粋)
Exception #最上位
  |--NoMemoryError
  |--ScriptError
  |    |--LoadError
  |    |--SyntaxError
  |
  |--StandardError #独自例外クラスを生成する際に継承を推奨されているクラス
  |   |--ArgumentError
  |   |--NameError
  |   |    |--NoMethodError
  |   |
  |   |
  |   |--RuntimeError
  |   |--TypeError
  |   |--ZeroDivisionError
  |
  |--SystemExit
  |--SystemStackError
```

- Exceptionクラスを継承して独自例外クラスをつくるとどうなるのか
上記の例外クラスの階層を踏まえて、例えば`StandardError`クラスよりも上位となる`Exception`クラスを独自例外クラスの継承クラスとする場合を考えてみる

```ruby:Exceptionクラスを継承した場合_例1
class TestError < Exception #独自例外クラス
end

begin
  p "hello world"
  raise TestError

rescue Exception => error
  p "例外をキャッチしたよ"
  p error

end

# 結果
"hello world"
"例外をキャッチしたよ"
#<TestError: TestError>
```

```ruby:Exceptionクラスを継承した場合_例2
class TestError < Exception #独自例外クラス
end

begin
  p "hello world"
  test = 1/0 #0で除算するとZeroDivisionErrorが発生
  raise TestError

rescue Exception => error
  p "例外をキャッチしたよ"
  p error

end

#結果
"hello world"
"例外をキャッチしたよ"
#<ZeroDivisionError: divided by 0>
```
上記の例1では、`TestError`クラスの例外を捕捉、例2では`ZeroDivisionError`を捕捉している。ここで問題なのは、`Exception`クラスを`rescue`で捕捉する場合、捕捉する対象が全ての例外クラスとなるので`rescue`でのリカバリ処理に何を書けばいいか特定できない点にある。

以上から`Exception`クラスを継承した独自例外クラスを作成した場合は、例外処理がコントロールしにくいことがわかる。結果として、その下位の`StandardError`クラスの継承が現実的。また`rescue`の引数を省略した場合も捕捉するクラスは`StandardError`クラスとなっていることも`StandardError`クラスの継承を推奨する理由の1つとしても良いと思う。

```ruby:StandardErrorクラスを継承した独自例外クラスをつくろう
class TestError < StandardError #独自例外クラス
end
ROS講座41 ros timerで処理を行う

# 環境
この記事は以下の環境で動いています。

| 項目 | 値 |
|:-:|:-:|
| CPU | Core i5-8250U |
| Ubuntu | 16.04 |
| ROS | Kinetic |

インストールについては[ROS講座02 インストール](https://qiita.com/srs/items/e0e0a9dc3f94c2d3348e)を参照してください。
またこの記事のプログラムはgithubにアップロードされています。[ROS講座11 gitリポジトリ](https://qiita.com/srs/items/25a56a6abda41dcf396e)を参照してください。

# 概要
一定間隔で処理を行いたいときは基本的にはwhile文と`loop_rate.sleep()`と`spinOnce()`を使います。しかしこの方法ではループを1種類しか回せません。timerを使うことでメインループを使わずに一定間隔の処理を行えます。

# ソースコード
## ros timerを使うROSノード

```c++:basic_lecture/src/basic_timer_talker.cpp
#include <ros/ros.h>
#include <std_msgs/String.h>

ros::Publisher chatter_pub;
void timer_callback(const ros::TimerEvent& e)
{
  std_msgs::String msg;
  msg.data = "hello world!";
  ROS_INFO("publish: %s", msg.data.c_str());
  chatter_pub.publish(msg);
}

int main(int argc, char** argv)
{
  ros::init(argc, argv, "basic_timer_talker");
  ros::NodeHandle nh;
  chatter_pub = nh.advertise<std_msgs::String>("chatter", 10);

  ros::Timer timer = nh.createTimer(ros::Duration(0.1), timer_callback);
  ros::spin();
  return 0;
}
```
下から4行目の`ros::Timer timer = nh.createTimer(ros::Duration(0.1), timer_callback);`でタイマーを生成しています。1つ目の引数は実行間隔です。つまり10Hzで動作させたいなら`ros::Duration(0.1)`と入れます。2つ目がtimerが起動したときに起動するコールバック関数です。またデフォルトだとタイマーは繰り返しになります。つまり無限に0.1秒ごとにコールバック関数が呼ばれます。
コールバック関数は`void timer_callback(const ros::TimerEvent& e)`のように宣言します。引数でいろいろと情報をくれますが、あまり大事でないので今のところは触れません。
publishを行うのがコールバック関数内に移ったので、publisherの宣言をグローバル領域で行わないといけないことに注意です。

## CmakeList

```cmake:basic_lecture/CMakeLists.txtに追加
add_executable(basic_timer_talker src/basic_timer_talker.cpp)

target_link_libraries(basic_timer_talker
  ${catkin_LIBRARIES}
)
```

# ビルド
```shell
cd ~/catkin_ws
catkin build
```

# 実行
3つのターミナルで実行します。

```shell:1つ目のターミナル
roscore
```

```shell:2つ目のターミナル
rosrun basic_lecture basic_timer_talker 
```

```shell:3つ目のターミナル
rostopic echo /chatter
```

すると3つ目のターミナルで以下のような出力があります。およそ10Hzで出力されているのが見えます。

```text
data: "hello world!"
---
data: "hello world!"
---
data: "hello world!"
---
```

# 目次ページへのリンク
[ROS講座の目次へのリンク](https://qiita.com/srs/items/5f44440afea0eb616b4a)