OmniAICreator/Qiita-1.07M huggingface dataset:
Python: 町丁目の座標に基づいてmapにマーカーを描画

## SAMPLE 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51324/48bd7cba-c3c0-139b-035a-62d4083f2817.png)

## REFERENCE
[folium 事始め](https://qiita.com/pork_steak/items/f551fa09794831100faa)
[Folium: Pythonでデータを地図上に可視化](https://qiita.com/nanakenashi/items/824c0cb16860ca59a424)

## DATA
国土交通省国土政策局のページから[町丁目レベル位置参照情報と](http://nlftp.mlit.go.jp/isj/)をダウンロードする。
=>ここではテーブル名[locate_lt_lg]としてSQL Serverに格納。

## PYTHON 
ここでは
・千代田区
・大字・字・丁目区分コード3
のデータのみを利用する。

```python
import pypyodbc

connection_string ='Driver={SQL Server Native Client 11.0};Server=ServerName;Database=DatabaseName;Uid=UserName;Pwd=Password;'
connection = pypyodbc.connect(connection_string)
SQL = """
  SELECT todofuken_name,shichoson_name,choson_name,lt,lg
  FROM [locate_lt_lg]
  WHERE chomoku_code = '3'
     AND shichoson_name = '千代田区'
"""

cur = connection.cursor()
cur.execute(SQL)
 
rows = cur.fetchall()
ltlg_data = []
for row in rows:
    ltlg_data.append(row)
 
cur.close()
connection.close()
```

中心座標を東京駅に設定して丁目ごとの代表座標をマーカーとして設置。htmlとして保存する。

```python

import folium

copyright_map = '&copy; <a href="http://osm.org/copyright">OpenStreetMap</a> contributors'

map0 = folium.Map(location=[35.681167, 139.767052],
                  attr=copyright_map,
                  zoom_start=15)

states = []
for row in ltlg_data:
   state = {}
   state['todofuken_name'] = row[0]
   state['shichoson_name'] = row[1]
   state['choson_name'] = row[2]
   state['lt'] = row[3]
   state['lg'] = row[4]
   states.append(state)

for state in states:
   folium.Marker(
            [state['lt'], state['lg']],
            popup=state['shichoson_name']+state['choson_name'],
    ).add_to(map0)


map0.save('sample0.html')
```
PEP 572, Assignment expressions

最近、Pythonの新たな実装追っかけを怠っていたので、この時間でお勉強してみた。
吉祥寺でゆるく仕事帰りの勉強会をやっていて、そこで調べたことを記録したノートです。
https://kichipy.connpass.com/event/149625/

# PEP 572, Assignment expressionsについて
参考 [syntax-and-assignment-expressions-what-and-why
](https://stackoverflow.com/questions/50297704/syntax-and-assignment-expressions-what-and-why)

`:=` という表記のAssignment expressions（代入演算子と言ったら良いのかな）が追加されました。例えば、 `if` や `while` の条件式の条件内で、変数に値を代入しながら処理を実行したりする時に使うと良さげです。

まずは、、、、

## if statement（if条件式）
### 今まで

```python
match = pattern.match(line)
if match:
    return match.group(1)
````

### Assignment expressions（代入演算）にすると
```python
if match := pattern.match(line):
    return match.group(1)
```


## Infinite while statement（whileの条件式）
### 今まで:

```python
while True:
    data = f.read(1024)
    if not data:
        break
    use(data)
```

### Assignment expressions（代入演算）にすると

```python
while data := f.read(1024):
    use(data)
```

だいぶコードがシンプルに書けることがわかります。
こんな処理は実際書くことを無いのですが、動作のおさらい。

```python
>>> if a := None:  # a に None を代入して、a を評価
...     print(a)
...
>>> if a := 1:  # a に 1 を代入して、a を評価
...     print(a)
...
1
```

## その他stackoverflowに上がっていた例

```python
stuff = [(lambda y: [y,x/y])(f(x)) for x in range(5)]
```

が

```python
stuff = [[y := f(x), x/y] for x in range(5)]
```

こうなります。読みにくい `lambda` を使わなくてよいので、いい感じです。

inputを以下様に処理もできます。

```python
command = input("> ")
while command != "quit":
    print("You entered:", command)
    command = input("> ")
```

が

```python
while (command := input("> ")) != "quit":
    print("You entered:", command)
```

なります。

## 感想
実践でも使い所は結構ありそうなのと、そこまで可読性が下がる印象はないので、積極的に使っていこうかなと思った次第。
IBM MTM 2019 接続まとめ

# IBM MTM 2019 接続まとめ

## はじめに
IBM MTM 2019 Learning Systemを始めたものの、環境が毎回行方不明になるため、わからなくならないようにメモします。

## IBM MTMとは？
IBMが毎年開催している学生向けにメインフレームに親しんでもらおうというイベント（コンテスト）です。
日本IBMではメインフレーム・コンテストと呼んでいるようです。
WWではMaster the Mainframe と呼んでいます。
本来は学生がメインフレームに触る機会を提供する場ですが、社会人にもLearning System として環境が提供されています。

## IBM MTMで習得できること
メインフレームにおけるファイル操作や簡単なスクリプトを学びます。
わかる人向けにいうと、3270端末エミュレータを利用した接続（黒画面、グリーンスクリーン）を使用してTSO,USSの操作を行い、EBCDICの作りや数字の表し方(パック十進数),REXXコーディングなどを行います。
なお、Part Two, Part Three を修了すると、IBMからデジタルバッジがもらえます。

## IBM MTMでできること
本来のコンテスト向け課題に挑戦してみるのももちろんですが、かなり自由にシステムが触れるので社会人も「ちょっと動きを確かめる」ことができます。
もちろんSYS1.やRACF、DB2などの基盤部分は触れませんHMCもダメですが、2019/10時点でz/OS V2R3なのでほぼ最新環境が楽しめます。
また、システムパラメタなどを眺めてIBMのお手本構成（たぶん）を堪能することができます。

## IBM MTM Learning System への登録
[Master the Mainframe Learning System Registration](https://www-01.ibm.com/events/wwe/ast/mtm/audit.nsf/enrollall?)で登録します。
登録から2～3日すると、メールでユーザIDなどのお知らせが来ます。

## IBM MTM 2019 のweb（課題などが記載されているweb）
[Welcome to the 2019 Master the Mainframe Challenge](http://mtm2019.mybluemix.net/index.html)
です。
メインフレームをご存知の方はざっと課題を眺めるとホホウという感じで面白いと思います。

## IBM MTM 2019 の接続先（TN3270）
IPアドレス：192.86.32.91
TCPポート番号：23
～～～
ユーザ名、初期パスワードはIBMからのお知らせメールに記載されています。

## 参考になるweb
純粋にコンテストをクリアすることを目指すなら[Kevin's coding blog](https://kevindurant.be/)がとても参考になります。
あとは[「メインフレーム・コンピューター」で遊ぼう](http://www.arteceed.net/)や、もちろんIBMマニュアルを読みましょう。
ios13のWKWebViewのWebRTC対応状況まとめ

# はじめに
iOS12までは、iOSのWebRTC対応状況はSafariのみで、WKWebViewでは対応していませんでした。
この記事では、iOS13になって対応されているか検証を行いました。

# 結論
iOS12と変わらず、getUserMediaが実装されていないため動きませんでした。
[メモ書き]Catalina のクリーンインストールで戸惑った話

## 待ってました！ macOS Catalina！

やっと公開されました，macOSCatalina．
すごい楽しみにしていたのに，sidecarがMacBookAirのEarly2015では使えないじゃないか！と，
アップデートしてから気づいた私です．

まぁ，sidecarの為だけに，iPadをこれから調達しようと考えていたので，
無駄にお金を払う前に気づけてよかったです．

さて，そんな私がCatalinaをクリーンインストールする際に，
「あれ，なんか違う」と戸惑った箇所がありましたので，メモ書き程度に
ここに書いておこうと思います．誰かの参考になれば幸いです．

※2019/10/14追記
ストックといいねが想像以上にきていたので，クリーンインストール時のユーザボリュームについて触れてある記事が他にないのかなとググっていました．私の検索能力では見つからないんです，これが．
というわけで，「[[完全版]macOS Catalinaをクリーンインストールする方法](https://qiita.com/PaSeRi/items/59e9785580dbd518ac93)」を書きました．
正直，Qiitaを普段から読んでいるような方にはいらない内容だと思います．

## とりあえず基本の情報

- MacBook Air (13-inch, Early 2015)
- プロセッサ: 1.6 GHz デュアルコアIntel Core i5
- メモリ: 8 GB 1600 MHz DDR3
- アップデート前: macOS Mojave


## 大まかな流れ

1. Mojaveの状態でTime Machineによるバックアップを取る
2. 一度Catalinaに上書きアップデートをする
3. リカバリーモードで起動し，ディスクを初期化してからOSを再インストールする

## 詳細

以下のサイトを参考に進めていきます．というか，私もこのサイトを参考に進めていました．

- [macOS Catalinaをクリーンインストールする方法](https://ischool.co.jp/2019-10-09-how-to-clean-install-macos-catalina/)

これを見ながら進めている時，「あれ？」と思ったところがありました．
その時はあまり気にせず進めたので，(少し)面倒なことになりました．

それは，「3. ストレージを初期化」の部分です．
掲載されている画像をよく見てもらうとわかると思うのですが，
**Macintosh HD -Data**というのが存在しています．
これがCatalinaから変わったところであり，
この方法でクリーンインストールする時に注意しなければならない新たなポイントです．

Google検索で一番上に出てきた記事を参考として上げておきます．

- [macOS 10.15 CatalinaではシステムボリュームがRead-Onlyになり、アプリはユーザーデータのみにアクセス可能に。](https://applech2.com/archives/20190605-macos-10-15-catalina-system-volume-read-only.html)

つまり，今まで**Macintosh HD**のみだったものが，
システムボリュームは**Macintosh HD**
ユーザボリュームは**Macintosh HD - Data**
という2つに分けられたのです．

よって
「クリーンインストールするにはユーザボリュームは削除(not初期化)しなければならない」という
新要素が追加されました．

知るかよ()

というわけで，皆さんはクリーンインストールする時に，
ユーザボリュームを忘れず削除しましょう．

## 最後に

ユーザボリュームを削除する必要があるなんて知らなかった私は，
システムボリュームだけ初期化し，画面の指示通り新たなユーザを作り，
よっしゃ綺麗な状態で始めるぞ〜！なんて意気込んでおりました．

なんとなく左上リンゴマークから，ストレージを見に行ったことだけが
不幸中？の幸いです．

あれ，めっちゃストレージ使われとる...
クリーンインストールしたのに，「コンテナ内のほかのボリューム」とかいう奴が
300GB近くも容量を食っている...

それに気づかなければ，もうしばらくの間，この"アクセスできない300GB/500GB"と一緒に
過ごすことになっていたかもしれません...
iOS13からAirDrop痴漢ができなくなった。Appleの痴漢対策か！？

以前、AirDrop痴漢に気をつけましょうという記事を書きましたが
https://qiita.com/a-nishimura/items/b1f709126227a4876146

なんとiOS13からAirDropの仕様変更がありました。
画像を受け入れるまでプレビューされなくなりました。

ということで、わいせつな画像を送りつける「AirDrop痴漢」ができなくなったのです。
これはまさかAppleのAirDrop痴漢対策なのでしょうか。
はたまたただの仕様変更なのでしょうか。
理由は定かではないのですが、犯罪に使われるのもよくないのでコンプライアンス的な背景もあったのかもしれませんね。

ただ、プレビュー機能自体はとても便利なものだったので、
その便利なものを悪用する人がいて、仕様が変わっていくのは少し残念ですね。

うちのブログでも書いているのでよかったらぜひご覧ください
https://www.wow-creators.com/2019/07/12/【まとめ】airdrop痴漢やってみた/
React Jest enzymeのテスト早見表（今後追加予定ver2019/10/17）

# この記事について
Reactのテストを書くときにみる早見表

## 前提
テスト対象コンポーネント(tsx)

```tsx:index.tsx
import * as React from 'react'

type TestProps = {
  propsNum: number
  onProps: () => void
}

type TestState = {
  stateNum: number
  stateBool: boolean
}

class TestComponent extends React.Component<TestProps, TestState> {
  constructor(props: TestProps) {
    super(props: TestProps)
    this.state = {
      stateNum: number,
      stateBool: boolean,
    }
  }

  handleOnClick = () => {
    this.setState({ stateNum: stateNum + 1 })
    this.props.onProps()
  }
  
  render() {
    return(
      <div className="TestComponent">
        <button className="button-element button-element2" onClick={this.handleOnClick} />
      </div>
    )
  }
}

export default TestComponent

```

テストコードは次のようになっている

```jsx:test.jsx
import React from 'react'
import { shallow } from 'enzyme'
import Stepper from '.' // テスト対象のコンポーネントは同じ階層のディレクトリにあると仮定して

describe('<TestComponent />' () => {
  let wrapper
  let propsNum
  let onProps

  beforeEach(() => {
    propsNum = 0
    onProps = jest.fn()
    wrapper = shallow(<TestComponent propsNum={propsNum} onProps={onProps} />
  })
  // === ここにテストを追加していく ===
}
```

## propsを変更する

```js
wrapper.setProps({
  propsNum: 1
})
```

## stateを変更する

```js
wrapper.setState({
  stateNum: 1
})
```

## stateが期待通りの値かをテストする

```js
expect(wrapper.state('stateNum')).toBe(0)
```

## コンポーネント内にあるhandleとかをテストする

```js
wrapper.instance().handleOnClick()
```

## あるクラスが存在するかをチェックする

```js
expect(wrapper.find(.button-element).length).toBe(1)
```

次のようにすると、より厳密

```js
expect(wrapper.find(.button-element.button-element).length).toBe(1)
```

## ボタンをクリックする

```js
wrapper.find('.button-element').simulate('click')
```
routingの分割

```
| class ActionDispatch::Routing::Mapper |
|:--|
|   def draw(routes_name) |
|     instance_eval(File.read(Rails.root.join("config/routes/#{routes_name}.rb"))) |
|   end |
| end |
|  |
| BCX::Application.routes.draw do |
|   draw :api |
|   draw :account |
|   draw :session |
|   draw :people_and_groups |
|   draw :projects |
|   draw :calendars |
|   draw :legacy_slugs |
|   draw :ensembles_and_buckets |
|   draw :globals |
|   draw :monitoring |
|   draw :mail_attachments |
|   draw :message_preview |
|   draw :misc |
|  |
|   root to: 'projects#index' |
| end |
```

https://gist.github.com/dhh/2492118
(自分用メモ)IOSアプリの評価ランク別の割合をスクレイピングで取得する

# 自分用メモです
色々調べたらItunesSearchAPIではトータルの評価数、及び平均評価ランク(0.5で区切っているらしく、大ざっぱな数になる)を取得する事はできるが、ランク別の評価数を取得する事は不可能な模様。
よって、”トータルの評価数*評価ランクの全体中の割合”でなら大まかにだが取得できるだろうという考え。


AppStoreのアプリ別のページをスクレイピングすればできるできた。

以下、サンプルコード


```
import urllib.request as url_req
import re
from html.parser import HTMLParser


class AppStoreScraping(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.cnt = 5
        self.__rating = {}
        self.avarage_flg = False

    @property
    def rating(self):
        assert isinstance(self.__rating, dict), 'Sorry, Can not Get Ratingg.'
        return self.__rating

    def handle_starttag(self, name, attrs):
        attrs = dict(attrs)
        if name == "div":
            if 'class' in attrs \
                    and attrs['class'] == 'we-star-bar-graph__bar__foreground-bar':
                h_r = re.match('^width: ([0-9]+)%;$', attrs['style'])
                h = str(h_r.group(1) + '%') if h_r else 0
                self.__rating = {**self.__rating, **
                                 {'Rating{cnt}Percentage'.format(cnt=self.cnt): h}}

                self.cnt -= 1

        elif name == "span":
            if 'class' in attrs \
                    and attrs['class'] == 'we-customer-ratings__averages__display':
                self.avarage_flg = True

    def handle_data(self, data):
        if self.avarage_flg:
            self.__rating = {**self.__rating, **
                             {'AverageRating': data}}
            self.avarage_flg = False

    @classmethod
    def req_exec(cls, appstoreID):
        request = url_req.Request(
            url='https://apps.apple.com/jp/app/id{}'.format(appstoreID)
        )
        tmp = url_req.urlopen(request, timeout=15)

        parser = cls()

        charset = tmp.info().get_content_charset()

        parser.feed(str(tmp.read().decode(charset)))

        return parser.rating


res = AppStoreScraping.req_exec(appstoreID='任意のAppleID')
print(res)
```


以下、フォトンドリヴン世界救済RPGで実行した結果


```
>>{'AverageRating': '4.8', 'Rating5Percentage': '84%', 'Rating4Percentage': '12%', 'Rating3Percentage': '3%', 'Rating2Percentage': '1%', 'Rating1Percentage': '1%'}
```


自分の環境だとリクエスト投げた際に結構な頻度で500コードが返ってくる事が多かったので、割としっかり例外処理しなければならないと思います。人気の高いアプリのページが調子が悪い傾向にあると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302014/52fe3eb0-7736-cec8-dc3c-57b7ec36f676.png)

以上です。
[Rust] Read と BufRead の違い

ふたつのトレイト `std::io::Read`, `std::io::BufRead` の使い分けに毎回立ち止まるので, 覚えるために両者の役割の違いをまとめました. 具体的にユースケースが定まっているなら「[Rustでファイルの入出力](https://qiita.com/fujitayy/items/12a80560a356607da637)」という記事の方が便利だと思いますが, このふたつのトレイトの区別が曖昧な誰か (つまりこの記事を書く前の私と同じ状態の人) の役に立つと思うので公開します.

# 役割の違い

## `std::io::Read`

`Read` が提供する `read` メソッドはシステムコールを呼ぶことが想定されていて, かなり低水準 (低レイヤー) なトレイトです. ですから提供するメソッドは `read_to_end` や `read_to_string` のようにまるっと読み込む系だけです. 特定のバイトが現れたら読み込みをストップする, というような高水準な操作はこのレイヤーで扱う範疇には含まれません.

```rust
pub trait Read {
    fn read(&mut self, buf: &mut [u8]) -> Result<usize>;

    fn read_vectored(&mut self, bufs: &mut [IoSliceMut]) -> Result<usize> { ... }
    unsafe fn initializer(&self) -> Initializer { ... }
    fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize> { ... }
    fn read_to_string(&mut self, buf: &mut String) -> Result<usize> { ... }
    fn read_exact(&mut self, buf: &mut [u8]) -> Result<()> { ... }
    fn by_ref(&mut self) -> &mut Self
    where
        Self: Sized,
    { ... }
    fn bytes(self) -> Bytes<Self>
    where
        Self: Sized,
    { ... }
    fn chain<R: Read>(self, next: R) -> Chain<Self, R>
    where
        Self: Sized,
    { ... }
    fn take(self, limit: u64) -> Take<Self>
    where
        Self: Sized,
    { ... }
}
```

## `std::io::BufRead`

一方の `BufRead` はより高水準なトレイトで, 手元にバッファーを保持しておき, 必要になったら内部で自動的にシステムコールする, という機能を提供するインスタンスを表します. それに見合って提供するメソッドも比較的高機能で, 特定のバイトまでを返す `read_until`, 1 行だけを返す `read_line`, 特定のバイトまでのバイト列を返すイテレータ `split`, 1 行ずつ返すイテレータ `lines` となっています. `Read` と違い, 手元にデータを保持しているために「特定のバイトまでを返す」といった処理ができるのです.

```rust
pub trait BufRead: Read {
    fn fill_buf(&mut self) -> Result<&[u8]>;
    fn consume(&mut self, amt: usize);

    fn read_until(&mut self, byte: u8, buf: &mut Vec<u8>) -> Result<usize> { ... }
    fn read_line(&mut self, buf: &mut String) -> Result<usize> { ... }
    fn split(self, byte: u8) -> Split<Self>
    where
        Self: Sized,
    { ... }
    fn lines(self) -> Lines<Self>
    where
        Self: Sized,
    { ... }
}
```

なお `std::fs::File` は `Read` ですが `BufRead` ではありません.

# 使い分け

* 最後まで読み込みたい, あるいは必要なデータがファイル冒頭から X byte と決まっているというケース. この場合は必要な分だけ読み込むシステムコールを 1 回発行すれば十分ですから, `Read` を使えばよく, `BufRead` を持ち出す必要はありません.
* ファイルの中身を 1 行ずつ読みたい, あるいは区切り文字を指定して順に読みたい, といったケース. `Read` では必要な分を動的に判断して読み込むという器用なことはできないため, `BufRead` の範疇です.

こう考えれば `.lines()` したいときには `Read` ではなく `BufRead` を `use` しておく必要があることがすんなり理解できます. 

## `BufReader` について

ファイルの中身を X byte ずつ順番に読み込みたい, という状況では, 毎回システムコールするのは動作が遅いため, 一気にある程度読み込んで保持してくれる `std::io::BufReader` の出番です ([関連記事](https://qiita.com/gyu-don/items/50f4239fc856bed00dc4?from_id=12a80560a356607da637)). これは `BufReader` が `BufRead` であることに本質的に基づいていますが, X byte 読む (`read` する) 際に必要なのはあくまで `Read` です.

なお `&[u8]` それ自体 `Read` かつ `BufRead` であるため, 小さなファイルならファイル全体を `Vec<u8>` として読み込んで `BufReader` の代わりとして扱う, ということも可能です ([参考](https://keens.github.io/blog/2016/12/01/rustdebaitoretsuwoatsukautokinotips/)).

# 参考文献

* [Read - The Rust Standard Library](https://doc.rust-lang.org/std/io/trait.Read.html)
* [BufRead - The Rust Standard Library](https://doc.rust-lang.org/std/io/trait.BufRead.html)
三項演算子の省略形

こんな処理があって

```
const hoge = true
piyo = hoge === true ? 1 : 0
```


false時の処理がいらないとする時に

```
piyo = hoge === true ? 1 : ‘’
piyo = hoge === true ? 1 : null
```
とかしないで

```
trueの時
piyo = hoge === true && 1
```

```
falseの時
piyo = hoge === true || 0
```

と書くことができる
AWS LambdaからPython Boto3を使用してDynamoDBを操作してみた

DBとtableを自分の環境に書き換えてもらえれば、コピペで試せます。

バージョン
Python3.7

##準備

```python

import boto3
dynamoDB = boto3.resource('dynamodb')
table= dynamoDB.Table('sample')

def main(event, context):

    search(event)
    insert(event)
    update(event)
    delete(event)

    return
```

##取得処理

```python
def search(event):
    query_data = table.get_item(
        Key={
            'id': event['id']
            }
        )
    print("GetItem succeeded:")
    
    # 取り出す時は
    sample_value = query_data['Item']['sample_value']

	return
```

##登録処理

```python

def insert(event, context):

    table.put_item(
        Item = {
            'id': event['id'],
            'sample_value': event['sample_value']
        }
    )
    print("PutItem succeeded:")
    
    return
```

##更新処理

```python

def update(event):

    table.update_item(
        Key= {'id': event['id']},
        UpdateExpression='set sample_value = :s',
        ExpressionAttributeValues={
            ':s' : event['sample_value']
        }
    )
    print("UpdateItem succeeded:")

    return
```

##削除処理

```python

def delete(event):
    
    table.delete_item(
        Key={
            'id': event['id']
        }
    )

    print("DeleteItem succeeded:")

    return
```

##参考
ステップ 3: 項目を作成、読み込み、更新、削除する
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/GettingStarted.Python.03.html
Catalinaにして外部ディスプレイが使えなくなった時


I/O Data のUSB-RGB/D2とか displaylink のドライバを使っている場合は、以下に対応が載ってます。

[macOS Catalina 10.15: Black screen or only one monitor is working after upgrade](https://support.displaylink.com/knowledgebase/articles/1925041-macos-catalina-10-15-black-screen-or-only-one-mon)


（一応、ググればすぐに出てくるけど、、、）
【AWS】MacからEC2へSSH接続する際に、Permission denied (publickey,gssapi-keyex,gssapi-with-mic).と出た際の対処法

MacからEC2インスタンスにssh接続する際に、

```
$ ssh ec2-user@x.xxx.xxx.xx -i /Users/xxxx/.ssh/xxxx.pem

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/Users/xxxx/.ssh/xxxx.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/Users/xxxx/.ssh/xxxx.pem": bad permissions
```

`pemファイルの権限が甘いよ`とエラーが出ました。

```
$ chmod 400 /Users/xxxx/.ssh/xxxx.pem
```
400番は、`所有者のみが読み込み可能`という権限を与えます。

chomdコマンドについて詳しくは[こちら](http://itdoc.hitachi.co.jp/manuals/3021/3021313320/JPAS0348.HTM)

として権限に制限を与えると

```
$ ssh ec2-user@x.xxx.xxx.xx -i /Users/xxxx/.ssh/xxxx.pem
Last login: Fri Oct  4 02:52:48 2019 from 58.138.187.2

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
1 package(s) needed for security, out of 3 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-xxx-xxx-xx ~]$ 
```
接続できました！
AtCoder Beginner Contest 132 D問題について

#はじめに
 今回は、AtCoderコンテンツの[ABC132_D問題](https://atcoder.jp/contests/abc132/tasks/abc132_d)において、思案したもののWA(不正解)が覆らず、なぜ自分の実装では誤った出力になってしまうか、その根本的なところを解決したいと思い、投稿致しました。なお、問題に掲載されている入力例１、例２についてはクリアしています。

#問題文(引用)
引用ページ：https://atcoder.jp/contests/abc132/tasks/abc132_d
---引用始まり---
K 個の青いボールと N−K個の赤いボールがあります。同じ色のボールは区別が不可能です。すぬけ君と高橋君はこれらのボールで遊んでいます。

まず、すぬけ君が、N個のボールを左から右に一列に並べます。

次に、高橋君は、これらのうち K
個の青いボールのみを回収します。高橋君は、1 回の操作で連続して並ぶ青いボールを何個でも回収することができます。高橋君は、常に K個の青いボールを回収するのにかかる操作の回数が最小になるように行動します。

K個の青いボールを回収するために高橋君がちょうど i 回操作をする必要があるボールの並べ方は何通りあるでしょうか。 1≤i≤K をみたす i それぞれについて答えを計算し、10^9+7で割った余りを答えてください。

制約
1≤K≤N≤2000

入力
入力は以下の形式で標準入力から与えられる。

N K


出力
i行目 (1≤i≤K) に高橋君がちょうど i 回操作をする必要があるボールの並べ方の総数を 10^9+7 で割った余りを出力せよ。
---引用終わり---
#実装(WA判定)
```Main.java
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int K = sc.nextInt();
		sc.close();

		for(int i = 1;i <= K;i++) {
			long combi1 = combination(N-K+1,i);
			long combi2 = combination(K-1,i-1);
			System.out.println(combi1*combi2%1_000_000_007);
		}
	}

	public static long combination(int i,int j) {
		if(j==0) {
			return 1;
		}
		return combination(i-1,j-1)* i  / j;
	}
}
```

以上、ご指摘いただけますと嬉しいです。
Node.js: stream.Readableのデータの前後にデータを追加する方法

Node.jsのstream.Readableのデータの前後にデータを追加する方法を紹介する。


```javascript
const { Readable } = require('stream')

// 元データのストリーム
const source = Readable.from(['source content\n'])

// 元データの前後にデータを追加する処理(ジェネレーターを使う)
const wrap = (stream) => (async function *() {
	yield 'prepended content\n'
	yield* stream[Symbol.asyncIterator]()
	yield 'appended content\n'
})()

// データが追加されたストリーム
const wrappedContent = Readable.from(wrap(source))
wrappedContent.pipe(process.stdout)
```

実行結果

```
prepended content
source content
appended content
```

stream.Readableには当然ながらwriteメソッドが生えていないので、Readableオブジェクトを初期化する段階で加工済みのデータを渡してやる必要がある。

しかし、ストリームの内容をすべてバッファに入れると、メモリーを消費したりと、ストリーム処理ではなくなっていまうので、ジェネレーターを使う。
2019-10-11 LPC > LPCXpresso54628 > rit.c > kCLOCK_GPIO3 > LEDの操作はポート3-14であるためGPIO3のクロックをオンにする

```txt:動作環境
OS: Ubuntu 18.04 LTS
基板: LPCXpresso54628
IDE: MCUXpresso IDE v11.0.1 [Build 2563] [2019-09-01]
```

### 関連

- [2019-10-08 LPC > LPCXpresso54628 > RIT (Repetitive Interrupt Timer ) > kCLOCK_Gpio3 > 3以外ではLED点滅しない](https://qiita.com/7of9/items/ccbbe6954f5f9408bf53)

### 概要

- SDK Example(s)からRITを選択
- kCLOCK_GPIO3を設定している
- その理由をフォーラムで質問した

フォーラムの質問

- [Interval of RIT (Repetitive Interrupt Timer) SDK example](https://community.nxp.com/message/1216255)

> Because the LED function used the port3_14, need enable the clock of GPIO3.

ということらしい。

提供されている様々なドキュメントのどこにこういう情報が記載されているか、初学者には分からない。


### Port3-14

User LED D12のポートについては以下の資料にある。

- [UM11035 Rev 2.1](https://www.nxp.com/docs/en/user-guide/UM11035.pdf)

p10
> D9, D11, D12: User LEDs
> P2-2 (D9), P3-3(D11) and P3-14(D12)

シルク印刷を確認すると
LED1: D12
LED2: D11
LED3: D9

これに関連して、kCLOCK_Gpio3をオンにせよ、という正式情報が見つからない。

### LED3 (P2-2: D9)

試しにLED3に変更したところ、LEDは点滅しなくなった。
LED3の場合はkCLOCK_Gpio2をオンにすることになる。
実際にそのようにしたらLED3は点滅するようになった。

### 正式情報

正式な情報としては、以下に記載があった。

UM10912 Rev 1.8 - 28 April 2017
Chapter 11: LPC546xx General Purpose I/O (GPIO)
11.3 Basic configuration

> For the GPIO port registers, enable the clock to each GPIO port in the AHBCLKCTRL0 register (Table 137).
line-heightについて考えませんか

Webサービスの制作におけるline-heightの扱い方とかをまとめました。

## コーディングのポイント
CSSをリセットしてから、bodyにline-heightを入れていると思いますがそれは大きな間違いです。
bodyにline-heightを入れてしまうと全ての要素に適応されてしまうため、buttonやinputにもline-heightが入ってしまいます。

```css
button {
  height: 56px;
  line-height: 56px;
}
```

上のように実装している場合はそこまで影響はないですが、下のように実装するとデザインに崩れが生じます。

```css
button {
  padding: 16px 32px;
}
```

文字が一行で収まるような要素にはline-heightを1に指定し、複数行になる場合は個々にline-heightを指定すると良いです👇

```CSS
body {
  line-height: 1;
}

p {
  line-height: 1.8:
}

button {
  padding: 16px 32px;
}
```

## 和文フォントと欧文フォント

和文フォントの14pxと欧文フォントの14pxでは、和文フォントの方がはるかに大きく見えます。
仮想ボディの占有率が違うため、大きく見えてしまうのです。

font-sizeは、**和文は13〜16px**、**欧文フォントは15〜18px**
line-heightは、**和文は1.4〜1.8**、**欧文フォントは1.2〜1.4**
くらいを目安に指定するとユーザビリティを考慮したものになると思います。

##太字と細字
上で、ある程度のline-heightがきまりましたが、太字と細字でもline-heightは変えた方が良いです。
強調の意図があって太文字を選ぶと思うので、そういうときは普通のline-heightより少し値を小さくしてあげると文字のバランスが整います（文字が1行で収まる想定の場合はこの記述はそもそもline-heightいりません）👇

```CSS
body {
  line-height: 1;
}

h1, h2, h3 {
  line-height: 1.4:
} 

p {
  line-height: 1.8;
}
```

## 印象のつけかた

line-height、font-sizeだけでサービスの印象が大きく変わります。
どんな印象にしたいかを考えて、サイズを決めていきます。

以下、参考になれば。（スマホ画面での情報です。）

### ニュース系メディア

ニュース系メディアの特徴はとにかく1画面に対しての情報量が多いです。
**font-sizeは16px**、**line-heightは1.7前後**。
左右marginは10px前後なのでmarginを大きく取らない代わりにline-heightを多めにとって、文字のつまりを最小限に抑えながら可読性を重視しています。

### 女性向けキュレーションメディア

女性向けのメディアはかわいらしさを重視しています。
そのため、フォントサイズを小さめにしていて、letter-spacingをとっているケースもあります。
**font-sizeは14px**、**line-heightは1.5前後**。
写真と文章を切り分けるためにline-height少なめに、写真とのmarginは大きめに取っています。

### IT企業のブログ

**font-sizeは16px**、**line-heightは1.8前後**。
letter-spacingを入れていることもあります。
左右marginは多くとりませんが、letter-spacingを入れることで文字の間隔が空き、marginの狭さをカバーしつつ、1画面のコンテンツ表示量を多くしています。
漢字をたくさん含んでいる文章でも詰まっていると感じないように工夫されています。

### 技術系メディア

**font-sizeは16px**、**line-heightは1.8前後**。
文章内にコードが挿入されるので、line-heightは多めにとっています。
文章間のmarginが少ないので、hrやコードをうまく利用する設計になっています。


## おわりに
参考になるものはまだまだたくさんあるので随時更新できればと思います。
メディアに限らず、文字の可読性は重要です。
読む時やクリック、タップをするときに少しでも違和感があるとそれだけで機会損失をする恐れがあります。
ターゲットを見極めて、綺麗なコードと見た目の設計を心がけましょう
Excel と Access で建築コスト管理を作成する(Tips1)

# 建築コスト管理システムを作成する
建築コスト管理（工事原価管理）システムを作成する。

Access で入力して、Excel に出力する方法で作成しようと思う。


## 画面や印刷は、Excel に出力する
建築コスト管理は、多くの経費・管理費が発生し、実行予算や実績・支払管理など、かなり複雑で1画面での表現機能も多彩でないといけない。

そのため、画面や印刷の出力は、Excel を採用する。

Excel は、ブックにプログラムコード(マクロ)を記述するために、プログラムの保守がやりづらい。

そのようなことを避けるために、Excel のブックは、出力用の作業領域として利用し、作業用ブックに記述するプログラムコードは、メニューを開く処理だけにして、主要なExcelのプログラムは、マクロファイル(xlam)で作成し、作業用のデータブックとは切り離して作成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/b6a77bd5-ec47-0543-ac10-4caff064e8b1.png)



## データ入力は、すべて Access で行う

Excel には、[Accessの起動]と［Accessデータの集計］の2つのメニューを作成する。

- Accessの起動・・・［入力データベースを起動する］
- Accessデータの集計・・・［支払台帳を再集計する］

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/88e8bfc8-d4fc-21b5-226b-da522498164d.png)

［入力データベースを起動する］を押すと、Access が起動するようにする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/62625a06-f747-213c-94ce-4c3a4aa78a71.png)

Accessでは、下図のような画面で、実行予算や支払い実績などのデータを入力する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/c09b6020-0437-a225-0ac7-fdd5b00cc5d7.png)

## 集計作業は、Excelのプログラムで、入力したデータを集計する。

［支払台帳を再集計する］を押すと、下図のような画面が表示され、指定した月のデータを集計する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/1267c689-645e-7651-e463-0fc11b29be75.png)

集計データは、Excelに転記される。
データの分析などの計算式は、Excel で設定する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/b72f3ac1-dd9a-37b5-5773-b01b9281acdc.png)

このような方法で、ExcelとAccessを連携したシステムを作成しています。


### このプログラムを改良して作成しています。
ExcelとAccessを利用することで、効率よくプログラムが作成できます。

[<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93227/e732b622-6860-185e-4beb-841d3eeb95fc.png" width="70%">](https://access-cloud.hatenablog.com/entry/cardbox-bari)
https://access-cloud.hatenablog.com/entry/cardbox-bari
ストアドやビューの名前と内容を検索する方法【SQLServer】


```sql
sp_helptext '名前'
```

これでは一つずつしか検索できずに不便な時がある。


一度に関連するストアドを検索したり、検索したい内容が決まっている場合などに便利。


```sql
SELECT sysobjects.type
      ,sysobjects.name
      ,sys.sql_modules.definition
FROM sys.sql_modules
LEFT OUTER JOIN sysobjects
ON sysobjects.id = sys.sql_modules.object_id
ORDER BY sysobjects.type
```

後は WHERE句 で条件指定してあげればOK。
タイプを指定することが多いかと。
P：ストアドプロシージャ
V：ビュー
みたいな感じで。

ちなみに、ストアドプロシージャとストアドファンクションのみの場合、
ROUTINE_DEFINITION を使用できるが、定義の最初の4,000文字しか検索できないので注意が必要。

```sql
SELECT ROUTINE_TYPE
      ,ROUTINE_NAME
      ,ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
ORDER BY ROUTINE_TYPE
```
Node.js: stream.Readableを作るシンプルな方法

本稿では、どのようにしてNode.jsの`stream.Readable`を作ったらいいかを示す。

## `stream.Readable`を作るサンプルコード

```js
const { Readable } = require('stream')
const stream = Readable.from(['hello'])
stream.pipe(process.stdout)
```

実行結果

```
hello
```

## 説明

`Readable.from`メソッドは`Readable`オブジェクトを生成するユーティリティメソッドで、第一引数に`Iterable<any>`または`AsyncIterable<any>`を取る。

上のサンプルコードでは`Array<string>`を渡しているが、`Iterable`は[反復処理プロトコル](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Iteration_protocols)を実装しているオブジェクトなら何でもいいので、配列の他にジェネレーターを渡すこともできる:

```js
const gen = function *() {
	yield 'hello'
	yield 'world'
}
const stream = Readable.from(gen())
```
今更ながらSeleniumIDEのお引越し

# はじめに
要点：Firefox 55以前で動いていたSelenium IDEのテストケーススクリプトをSideEXベースのものに変換するPythonツールを作りました。


何とかFirefox 55以前のバージョンを使ってSelenium IDEを使い続けていましたがとうとう使わないでという(ごもっともな)事を言われたのでSideEXベースのSelenium IDEにお引越しすることにしました。テストケースに互換性が無いので変換するPythonツールを今更ながら作りました。

# 変換ツール
## リポジトリ
https://github.com/takuya1981/selenium-ide-scripts-converter

## 必要なパッケージ
- beautifulsoup4 4.8.1+
- Python 2.7+

Python3系は未評価です。

## 使い方
```
Usage: python selenium_convert.py dir_in project_name file_out
args:
    dir_in: Firefox 55 以前で使用したSelenium IDEのスクリプト(.html)が格納されたディレクトリ. 
    project_name: プロジェクト名(新しいテストスクリプト上でのプロジェクト名)
    file_out: 変換されたスクリプトファイル(.side)のパス
```

# 注記
割とシンプルな変換しかサポートしていません。
- 対応するコマンドが無い場合があります
- clickAndWaitはclickに, selectAndWaitはselectに置き換えます(必要な時は待ってくれるというのがSideEXの方針らしい)
赤外線アレイセンサAMG8833(Grid-EYE)のデータを表示

# 今回やること

[前回](https://qiita.com/tm_nagoya/items/904ba8a23868ddcdcc54)でAMG8833(Grid-EYE)のデータ取得ができましたが、ただ数字が出るだけだったので画像として表示してみようと思います。

# ２次元配列データの可視化

matplotlibを使って2次元配列を表示させます。

```python:amg8833.py
# -*- coding: utf-8 -*-

import time
import busio
import board

import adafruit_amg88xx

import matplotlib.pyplot as plt

# I2Cバスの初期化
i2c_bus = busio.I2C(board.SCL, board.SDA)

# センサーの初期化
sensor = adafruit_amg88xx.AMG88XX(i2c_bus, addr=0x68)

# センサーの初期化待ち
time.sleep(.1)

# imshowでsensor.pixelsの２次元配列データを表示させる
fig = plt.imshow(sensor.pixels, cmap="inferno")
plt.colorbar()

plt.show()
```

実行すると画像が表示されます。
センサーの上部で手をパーにしてかざして実行しました。

```bash
$ python3 amg8833.py
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120476/c387c385-983d-7142-460f-4d93196c34b9.png" width=300px>

# bicubic補間を使ってみる

とりあえず熱画像っぽいのは表示することができましたが、AMG8833は8x8ピクセルのため解像度が低すぎてよくわからないので、bicubic補間を使ってみます。
imshowのinterpolationオプションでbicubicを指定すると補間されます。

```python:amg8833.py
# -*- coding: utf-8 -*-

import time
import busio
import board

import adafruit_amg88xx

import matplotlib.pyplot as plt

# I2Cバスの初期化
i2c_bus = busio.I2C(board.SCL, board.SDA)

# センサーの初期化
sensor = adafruit_amg88xx.AMG88XX(i2c_bus, addr=0x68)

# センサーの初期化待ち
time.sleep(.1)

# 8x8ピクセルの画像とbicubic補間をした画像を並べて表示させる
plt.subplots(figsize=(8, 4))

# データ取得
sensordata = sensor.pixels

# 8x8ピクセルのデータ
plt.subplot(1, 2, 1)
fig = plt.imshow(sensordata, cmap="inferno")
plt.colorbar()

# bicubic補間したデータ
plt.subplot(1, 2, 2)
fig = = plt.imshow(sensordata, cmap="inferno", interpolation="bicubic")
plt.colorbar()

plt.show()
```

実行すると、オリジナルと補間画像の２枚が並んで表示されます。

```bash
$ python3 amg8833.py
```
![Figure_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120476/e1f0d3be-1a8f-f895-1403-8cc2fe4e3356.png)

少しは手の形がわかるようになったかなと思います。

# 動画にしてみる

１枚の静止画では何かと不便なので、ループさせて動画にしてみます。

```python:amg8833.py
# -*- coding: utf-8 -*-

import time
import busio
import board

import adafruit_amg88xx

import matplotlib.pyplot as plt

# I2Cバスの初期化
i2c_bus = busio.I2C(board.SCL, board.SDA)

# センサーの初期化
sensor = adafruit_amg88xx.AMG88XX(i2c_bus, addr=0x68)

# センサーの初期化待ち
time.sleep(.1)

# 8x8ピクセルの画像とbicubic補間をした画像を並べて表示させる
plt.subplots(figsize=(8, 4))

# ループ開始
while True:
    # データ取得
    sensordata = sensor.pixels

    # 8x8ピクセルのデータ
    plt.subplot(1, 2, 1)
    fig = plt.imshow(sensordata, cmap="inferno")
    plt.colorbar()

    # bicubicのデータ
    plt.subplot(1, 2, 2)
    fig = plt.imshow(sensordata, cmap="inferno", interpolation="bicubic")
    plt.colorbar()

    # plt.showだと止まってしまうので、pauseを使用
    # plt.clfしないとカラーバーが多数表示される
    plt.pause(.1)
    plt.clf()
```

手を左から右に動かして撮影してみました。

```bash
$ python3 amg88333.py
```

![vJ1V2GMUXPXJASCorNWY1570759864-1570759904.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120476/7b8d3f55-195d-27dd-6271-39c4fb5de5bf.gif)
WRF > WPS > bash: met_em*ファイルの層数を表示するプログラム > show_num_metgrid_191011_exec

```txt:動作環境
CentOS Linux release 7.7.1908 (Core)
```

WRF (Weather Research and Forecasting Model)関連。


### 前置き

WPSに使うFNLデータがGFS v15.1へ変更となった時点で層数が31層から34層へ変更となった。
2019-06-20のデータを処理したときに何故か層数が31のままであった。
入力データであるFNLファイルのサイズを見ると、他の日のファイルよりも小さい。
再度FNLファイルを取得すると、他の日と同等サイズになった。

このような失敗再発を防ぐため、WPSで生成されるmet_em*ファイルの層数を表示するプログラムを必要と考えた。

### met_em*ファイルの層数を表示するプログラム

ncdumpの変数名を表示する`-c`オプションを使う。
https://explainshell.com/explain?cmd=ncdump+-c

```bash:show_num_metgrid_191011_exec
#!/usr/bin/env bash

for elem in $(ls met_em*);
do
	echo -n "$elem :" 
	ncdump -c $elem | grep "num_metgrid_levels ="
done
```

以下は実行例です。

```
$ bash CODE_170613/show_num_metgrid_191011_exec
met_em.d02.2019-06-19_06:00:00.nc :     num_metgrid_levels = 34 ;
met_em.d02.2019-06-19_12:00:00.nc :     num_metgrid_levels = 34 ;
met_em.d02.2019-06-19_18:00:00.nc :     num_metgrid_levels = 34 ;
met_em.d02.2019-06-20_00:00:00.nc :     num_metgrid_levels = 31 ;
met_em.d02.2019-06-20_06:00:00.nc :     num_metgrid_levels = 34 ;
met_em.d02.2019-06-20_12:00:00.nc :     num_metgrid_levels = 34 ;
```

2019-06-20だけ31層であることが分かる。

### 関連

- [2019-10-10 WRF v4.1.1 > ./real.exe > FATAL CALLED FROM FILE: <stdin> LINE: 1284 > num_metgrid_levelsが31層と34層で不整合を起こしている > FNLファイルのサイズが小さかった](https://qiita.com/7of9/items/f70a9114ccae31040c79)
ROLL-A-BALL TUTORIAL #1

#**My First Unity**
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512084/cce1e8e9-3106-dc6a-5dda-ae8fb9244997.png)
#1. Create a Project
At first, we create a new project for our game. Take some operations following terms.

1. Invoke Unity editor. Click “New Project…” from “File” on the menu bar. (after here, write this operation as “File -> New Project…”)
2. Click the “New Project” button in the upper-right.
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512084/12f54778-eede-9832-42af-34885a38babd.png)

3. Display dialog is shown. Input the name of the game in “Project Name”. In this time, the name is “Roll-a-Ball”.
![図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512084/e22ddd75-460f-5e78-dc43-de34738366f5.png)

4. Select a folder for saving the project in “Location”.
5. Select the 3D game.
6. At last, click the “Create project” button.

#2. Save a scene
Take some operations following terms for making a scene. After these operations, the Scene file(***.unity) is made.

1. Click “File -> Save Scene”.
2. Input the scene name. At this time, the name is “stage01”.

*note: relation about project and scene
At Unity, the composition of the whole game is called “Project”. And each stage or scene which compose a game is called “Scene”. One game “Project” has some stage or scene.

#3. Get editor layout ready
Get editor layout ready for explaining easier.

1. Click “Layout” on the upper-right. And select “2 by 3”.
2. Click the “Game” tab. And select “Free Aspect” to “4:3”.
3. Slide to left at the below of “Project Browser”.
![図4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512084/0e543073-ae9c-c5cb-3bd6-e59c9f0dc570.png)

#4. Way to use about the interface
1. Scene View
This shows a game scene being made. We can watch the scene from various points and angles.

2. Game View
This is a game display. The player watch game through this view when playing.

3. Inspector View
This shows some object information that is selected in “Scene View”. And we can edit it.

4. Hierarchy View
This shows a list of objects which exist in “Scene View”. We can edit it, copy, paste or change the object’s name, etc.

5. Project Browser
This show resource files included project (scene, script, graphic, sound, etc.). We can import some packages from outside at here.
![図5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512084/8a81164e-312f-5855-d34e-1dd6d7ff5538.png)

#5. Way to move “Scene View”
We can move a viewpoint in “Scene View”

| Operation        |    Action    |
|:-----------------|:-------------------|
| Scroll a mouse wheel  |  Scale up or down a “Scene View” |
| Drag clicking right   |  Rotate viewpoint |
| Drag clicking left    |  Parallel move a “Scene View” |
| Double click object   |  Focus the object clicked |    

![図6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512084/dbc80f6d-85d6-1a95-e305-401437b6a1d7.png)
コマンドラインでアカウント作成

# 概要

単なるメモです。
OrganizationsのAPI経由でアカウントを新規に払い出すコマンド。

# 変数

```bash:変数
ACCOUNT_NAME=hoge
EMAIL=hogehoge+${ACCOUNT_NAME}@hogehoge.mail #個人的には+でアカウントエイリアスつけるのがいいと思う。
```

# コマンド

```bash:command
aws organizations create-account \
    --email ${EMAIL} \
    --account-name ${ACCOUNT_NAME} \
    --iam-user-access-to-billing ALLOW 
```

メモ。
Flutter NoSuchMethodError: The getter 'references' was called on null. のエラーが出てやったこと


## はじめに

Flutterのプロジェクトで `json_serializable` を使ってモデルの作成を行なっていますが、
新しくモデルを作ろうとしたら以下のエラーが発生してやったことを残しておきます。

環境は以下の通り

```
$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, v1.9.1+hotfix.4, on Mac OS X 10.14.6 18G95, locale ja-JP)
[✓] Android toolchain - develop for Android devices (Android SDK version 28.0.3)
[✓] Xcode - develop for iOS and macOS (Xcode 10.3)
[✓] Android Studio (version 3.5)
[✓] VS Code (version 1.38.1)
[✓] Connected device (1 available)
```

```
  json_serializable: 3.2.2
```

## 起きたこと

モデル作成を実行したら

```
flutter packages pub run build_runner build --delete-conflicting-outputs
```

以下のようにエラーが発生した。

```
You have hit a bug in build_runner
Please file an issue with reproduction steps at https://github.com/dart-lang/build/issues


NoSuchMethodError: The getter 'references' was called on null.
Receiver: null
Tried calling: references
dart:core                                                         Object.noSuchMethod
package:analyzer/src/summary2/linked_bundle_context.dart 22:47    new LinkedBundleContext
package:analyzer/src/dart/analysis/library_context.dart 407:11    LibraryContext._createElementFactory
package:analyzer/src/dart/analysis/library_context.dart 94:7      new LibraryContext
package:analyzer/src/dart/analysis/driver.dart 1439:29            AnalysisDriver._createLibraryContext
package:analyzer/src/dart/analysis/driver.dart 1380:28            AnalysisDriver._computeUnitElement.<fn>
package:analyzer/src/dart/analysis/performance_logger.dart 34:15  PerformanceLog.run
package:analyzer/src/dart/analysis/driver.dart 1378:20            AnalysisDriver._computeUnitElement
package:analyzer/src/dart/analysis/driver.dart 997:34             AnalysisDriver.performWork
package:analyzer/src/dart/analysis/driver.dart 1931:24            AnalysisDriverScheduler._run
package:analyzer/src/dart/analysis/driver.dart 1865:5             AnalysisDriverScheduler.start
package:build_resolvers/src/analysis_driver.dart 54:13            analysisDriver
package:build_resolvers/src/resolver.dart 138:18                  new AnalyzerResolvers
package:build_runner_core/src/generate/options.dart 193:19        BuildOptions.create
package:build_runner/src/generate/build.dart 85:36                build
package:build_runner/src/entrypoint/build.dart 28:24              BuildCommand.run
package:args/command_runner.dart 197:27                           CommandRunner.runCommand
package:args/command_runner.dart 112:25                           CommandRunner.run.<fn>
dart:async                                                        new Future.sync
package:args/command_runner.dart 112:14                           CommandRunner.run
package:build_runner/src/entrypoint/run.dart 24:31                run
.dart_tool/build/entrypoint/build.dart 22:22                      main
```

## やったこと

```
flutter packages pub upgrade
```

flutterのバージョンアップしたら pub upgrade をしないといけないんだなというメモ
Raspberry Pi 3 model B+上のUbuntu Mate（16.04LTS）でGPIOのエラーが出た場合

# gpioが動かない件
Raspberry Pi 3 model B+ Rev 1.3上でROS Kineticを動作させるために、下記の手順に従ってROS Kineticを動作させるところまでは上手くいった。
> [Raspberry Pi 3B+(Ubuntu Mate 16.04LTS)にROS kinetic をインストールしてturtlesimを動かす](https://qiita.com/seigot/items/ce88174c1123400fc2a4) 

```
$ uname -a
Linux ros-desktop 4.14.52-v7+ #1123 SMP Wed Jun 27 17:35:49 BST 2018 armv7l armv7l armv7l GNU/Linux
```

が、GPIOが上手く動かない。

```
$ gpio readall
Unable to determine hardware version. I see: Hardware	: BCM2835
,
 - expecting BCM2708 or BCM2709.
If this is a genuine Raspberry Pi then please report this
to projects@drogon.net. If this is not a Raspberry Pi then you
are on your own as wiringPi is designed to support the
Raspberry Pi ONLY.
```
```
ros@ros-desktop:~/ros_ws$ gpio -v
gpio version: 2.32
Copyright (c) 2012-2015 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Unable to determine hardware version. I see: Hardware	: BCM2835
,
 - expecting BCM2708 or BCM2709.
If this is a genuine Raspberry Pi then please report this
to projects@drogon.net. If this is not a Raspberry Pi then you
are on your own as wiringPi is designed to support the
Raspberry Pi ONLY.
```

`gpio`コマンドはRaspberry PiのGPIOライブラリである[WiringPi](http://wiringpi.com/)を用いているが、どうもUbuntu Mate 16.04LTSのarmhf用aptにはBCM2835に対応した最新版が入っていないようだ。

```
$ sudo apt search wiringpi
Sorting... Done
Full Text Search... Done
wiringpi/now 2.32 armhf [installed,local]
  The wiringPi libraries, headers and gpio command
```

# WiringPiのマニュアルインストール
そこでマニュアルでWiringPiをインストールする。
**※この記事を書いた時点では、公式のgitリポジトリ https://git.drogon.net/ がダウンしていたため、githubのミラーを用いた（ただし最新版ではなくv2.46）。**

## aptでインストールされたWiringPiを削除
```
$ sudo apt-get purge wiringpi
$ hash -r
```

## githubからソースコードをダウンロード
```
$ git clone https://github.com/WiringPi/WiringPi.git
$ cd WiringPi/
```

## インストール
```
$ cd WiringPi/
$ ./build
```

## gpioのバージョン確認
```
$ gpio -v
gpio version: 2.46
Copyright (c) 2012-2018 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Raspberry Pi Details:
  Type: Pi 3+, Revision: 03, Memory: 1024MB, Maker: Sony
  * Device tree is enabled.
  *--> Raspberry Pi 3 Model B Plus Rev 1.3
  * This Raspberry Pi supports user-level GPIO access.
```

# 問題なく動作することを確認
GPIOの5番ピンにボタンを付けて、入力が取れることを確認した。

## ボタンを押してない状態
```
$ gpio -g read 5
0
```
## ボタンを押した状態
```
$ gpio -g read 5
1
```
ブラウザのタブ別にセッションを分ける方法を考えてみた

＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊
＊ 2020/08/13 追記
＊ コメントでCSRFについてのご指摘をいただきました。
＊ セキュリティに関わる事ですので、注意して自己判断で参考にして頂ければと思います。
＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊＊
　
　
　

Webサイトによくある導線として、「入力画面→確認画面→完了画面」というのがあると思います。

1. 入力画面で入力された内容をセッションに入れて、
2. 入力内容を確認画面で表示して、
3. 完了画面でセッションの情報を登録する

という処理が想像できます。

ここでたまに起きる問題として、別タブで同じ画面を開き、タブ同士を行ったり来たりしながら完了画面に行くと確認画面と違う内容が登録されてしまうというもの。

# なぜ？

セッションの仕組みはcookieにセッションIDを保存して成り立っているので、通常「1ブラウザ = 1cookie = 1セッション」となります。
だから、ブラウザのタブを複数開いていた場合でも、セッションはタブ毎ではなく全タブで共通となる。

つまり、同じキーでセッションに値を格納したら後勝ち（上書き保存）になるのです。

# 例

|手順|タブ|操作内容|備考|セッションの中身|
|---|---|---|---|---|
|１|タブ1|入力画面を開く|-|-|
|２|タブ1|入力して確認画面に遷移する|ここでセッションに入力内容を格納する|入力内容1|
|３|タブ2|新しいタブで入力画面を開く|-|入力内容1|
|４|タブ2|タブ1の時とは違う内容を入力して確認画面に遷移する|ここでセッションに入力内容を格納する|入力内容2|
|５|タブ1|タブ1に戻って完了画面に遷移する|セッションにある入力内容2の情報を登録する|入力内容2|

このような手順で操作をした場合、ユーザー的には「タブ1」の確認画面で入力した内容（入力情報1）が表示されているので、当然それが登録されると思うが、実際は「手順4」でセッション内容が「入力内容2」に上書きされているので、最終的には「入力内容2」が登録されている。


# 対策

そこで、セッションの中身をちょっと工夫してみます。
セッションに格納する時のキーをタブ毎に用意して、その中でさらにkey:valueにしてデータを格納します。

イメージはこんな感じ。

```セッションのイメージ.
[
    タブ1のキー => [
     'name' => 'やまだたろう',
     'email' =>'yamada@example.com',
    ],
    タブ2のキー => [
     'name' => 'たなかいちろう',
     'email' =>'tanaka@example.com',
    ],
]
```

## ポイント

- タブ毎のキーは、ミリ秒単位のタイムスタンプとかUUIDとか絶対に被らないIDを生成する
- タブ毎に生成したキーを画面に隠し持たせる。`<input type="hidden" name="tab_key" value="【生成したタブのキー】">`
- ビジネスロジックでセッションを使うときはリクエストの生成したタブのキーを使ってデータを取得する。（セッションに値を追加する時も）

## さらに

- セキュリティー的には、生成したタブのキーは画面遷移毎とか一定時間毎に生成しなおすと良いかも
- セッションタイムアウト機能を持たせておいて、一定時間過ぎたタブのセッションは削除する様にするとcookieを圧迫しないで済むかも
MQL5で、StringBuilderを実装する（簡易版）

mql5を使って、EA作成に挑戦しています。普段の仕事では、.net を主に使っているので、便利な関数を移植しようと思います。

## StringBuilder

文字列をくっつけてくれたり、改行しておいてくれたりです。

### コード

```C++
class CStringBuilder {
private:
    string _s;
public:
    CStringBuilder(){};
    ~CStringBuilder(){};
    
    //+--------------------------------------------------------------+    
    void Clear(){_s="";}
    void Append(string s){ _s+=s;}
    void AppendLine(string s){ _s+=s+"\n";}
    string ToString(){return(_s);}
};
```

### 利用方法

```c++
CStringBuilder sb;
sb.Append("123");
sb.Append("abc");

Print(sb.ToString() );
```

## まとめ

StringBuilder以外にも、移植したら、別記事でまとめていきます。
Azure API Managementサービスのアップデート

# はじめに
この記事は2019/10/8に発表された[Azure API Management update—October 2019](https://azure.microsoft.com/en-us/updates/azure-api-management-update-october-2019/)の翻訳記事です。 

 Azure API ManagementサービスとはAPIゲートウェイと開発者ポータルを数分で作成することができるAPI管理サービスです。  
このサービスによって、マイクロサービスアーキテクチャをAPIとして公開、発行、管理することができます。  

2019/10/3にAzure API Managementサービスのアップデートが始まりました。  
このアップデートがすべてのAzure API Managementサービスのインスタンスに展開されるまでには1週間以上かかりますので、ご注意ください。  
それでは以下に追加された新機能、バグ修正、変更などを具体的に紹介していきます。  

# 新機能
## ```Authentication-managed-identity``` が ```clientId``` フィールドをサポート
```clientId``` フィールドを用いることで認証するIDを選択することができます。  
この機能を利用するためにはAPI Managementサービスに最初に管理されたIDを割り当てる必要があります。  
また、Azureポータルとツールのドキュメントは近日中に提供される予定です。

# 修正
1. ```Context.LastError.Source```は```retry```ポリシーにネストされたポリシー内で発生した障害について適切に設定されるようになりました。  
2. Byte-Order-Mark (BOM)文字に関するエラーなしで、JavaやPythonといったSDKクライアントはJSONペイロードを正しくデシリアライズできるようになりました。この問題は[GitHub](https://github.com/Azure/azure-sdk-for-java/issues/5475)で詳細に記述されています。  
3. リクエストペイロードの送信中にバックエンド接続が失敗した場合、```forward-request```ポリシーの```Buffer-request-body```オプションは期待通りに機能するようになりました。

# 変更
API Managementサービスの作成メールは新しい返信不可のメールアドレスから送信されるようになりました。


# おわりに
今回は2019/10/8に発表された[Azure API Management update—October 2019](https://azure.microsoft.com/en-us/updates/azure-api-management-update-october-2019/)を翻訳・追記させていただきました。  
それぞれのリリース状況や変更ログは[こちらのGitHub](https://github.com/Azure/api-management-developer-portal/releases)から確認することができます。
中身を切り替えできるお手軽モーダルウィンドウの作り方（HTML/SCSS）

# はじめに

中身を切り替えできるお手軽モーダルウィンドウの作り方。

使用言語

- HTML
- SCSS（CSSでも可）


#コード

<p class="codepen" data-height="300" data-theme-id="37936" data-default-tab="result" data-user="k1-web" data-slug-hash="JjjYvOG" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="JjjYvOG">
  <span>See the Pen <a href="https://codepen.io/k1-web/pen/JjjYvOG">
  JjjYvOG</a> by k1-web (<a href="https://codepen.io/k1-web">@k1-web</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

#やってること

ラジオボタンを判定にしてチェックされているかどうかで表示非表示を切り替えている。
「#close（閉じる）」か「#overlay（背景）」を押すなどのチェックしている状態だと、モーダルウィンドウを非表示にする。
「#handle-1」にチェックが付いていたら閉じる・背景・コンテンツを表示させる。
表示させるコンテンツは「#handle-1」に隣接する次の要素を表示させる。

``` xxx.html
	<input type="radio" name="modal" id="close">
	<input type="radio" name="modal" id="overlay" checked>

	<input type="radio" name="modal" id="handle-1">
		<div id="modal-1" class="wrap wrap-1"></div>


```

``` xxx.css
	#handle-1 + #modal-1 {
		display: none;
	}
	#handle-1:checked + #modal-1 {
		display: block;
	}

```

#背景がスクロールするのがイヤな人向け追加jQuery

PCとSPとで少し記述は違いますが、以下のjQueryを追加することで、背景スクロールも制御できます。

PC用

``` pc.js
	$('input[name="modal"], label.handle').on('change blur click focus', function(){
		if ( $('input#close').prop('checked') || $('input#overlay').prop('checked') ){
			$('html, body').removeAttr('style');
		} else {
			$('html, body').css({'overflow':'hidden'});
		}
	});
```


SP用

``` sp.js
	$('input[name="modal"], label.handle').on('change blur click focus', function(){
		if ( $('input#close').prop('checked') || $('input#overlay').prop('checked') ){
			$('html, body').removeAttr('style');
			$('body').off('.noScroll');
		} else {
			$('html, body').css({'overflow':'hidden'});
			$('body').on('touchmove.noScroll', function(e) {
				e.preventDefault();
			});
		}
	});
```
Google共有ドライブをLinuxサーバーにマウントしてWindowsユーザーに公開する

表題の通り

* とあるGoogle共有ドライブ（旧チームドライブ）がある（が、アクセス権は私にしかない）
* が、他のメンバーにもアクセスできるようにしたい
* メンバー全員はWindowsユーザーである

という状況を解決したので、その方法を整理するついでに書いておきます。

0. 適当なUbuntu機を用意します
1. 共有用のアカウントを適当に作ってそこで作業します（id: pjfooとします。また、ここで他メンバーに直接アクセスされることを防ぐため、PWログインを無効化しておくことをおすすめします）
1. Ubuntu機で[google-drive-ocamlfuse](https://github.com/astrada/google-drive-ocamlfuse)をインストールします
2. 手順に従って、自分のgoogleアカウントの認証を通します
3. [チームドライブの設定](https://github.com/astrada/google-drive-ocamlfuse/wiki/Team-Drives)をします（分かりにくいですが、`~/.gdfuse/<label>/config`の`team_drive_id`を設定するだけです。ラベルはpjfooとします）
4. `/etc/fuse.conf`で`user_allow_other`を追加orコメント解除します。後でWindowsからアクセスするのに必須です。
4. 適当に作ったディレクトリ`/home/pjfoo/gdrive`にgoogleドライブをマウントします：`google-drive-ocamlfuse -o allow_other -label pjfoo /home/pjfoo/gdrive`（`-o allow_other`を忘れずに、後でWindowsからアクセスするのに必須です）
5. `ls /home/pjfoo/gdrive`などで、中身が見えていることを確認します
6. SAMBAをインストールし、sambaアカウントを作ります：`sudo sambapasswd -a pjfoo`。パスワードは後で他のメンバーにも公開になるので良い感じのをつけましょう。
6. [pjfooアカウントのホームを公開](http://pdkz.hateblo.jp/entry/20120927/1348709980)します
7. Windowsから`\\servername\pjfoo\gdrive`が見えれば完成です
D3.jsとは

こんにちは
未来電子という会社でインターンをさせてもらっているものです。
プログラミング経験が浅いので、おてやわらかにお願いします。

今回はD3.jsについて紹介していきます。

#D3.jsとは
D3.jsとはData Driven Documentのことで、データのヴィジュアル化を簡単にします。
具体的に説明すると、D3.jsとはデータをもとにSVGでを描画するJavaScriptライブラリのことです。

[こちら](D3.js is a JavaScript library for manipulating documents based on data. D3 helps you bring data to life using HTML, SVG, and CSS. D3’s emphasis on web standards gives you the full capabilities of modern browsers without tying yourself to a proprietary framework, combining powerful visualization components and a data-driven approach to DOM manipulation.)のサイトにサンプルがあります。


#D3.jsで使われる技術
D3.jsでは
HTML
DOM
SVG
CSS
JavaScript
が使われます。
これらを知っておくことは前提条件となります。



#まとめ
D3.jsはテンプレートが用意されているわけではないため、知識の無い状態では簡単に使うことができなさそうです。
しかししっかりとドキュメントを読んで行くと、非常に便利に感じることができるでしょう。
私も使いこなせるようにがんばります！

＃参考サイト
https://d3js.org
https://shimz.me/blog/d3-js/2977