OmniAICreator/Qiita-1.07M huggingface dataset:
gpiozeroのAPIでボタンの長押、短押をシンプルにコーディングする。

# はじめに
* Raspberry piのGPIOにタクトボタンを接続し、長押しした時と短押しした時で別の機能を割り当てる方法です。いくつかの方法を試しましたが gpiozero　https://gpiozero.readthedocs.io/en/stable/index.html のAPIが使いやすいと思ったので紹介します。

# 1. インストール方法

https://gpiozero.readthedocs.io/en/stable/installing.html#

私は、Python3用をインストールしました。

# 2. ボタンの長押、短押サンプル
https://gpiozero.readthedocs.io/en/stable/faq.html#how-do-i-use-button-when-pressed-and-button-when-held-together
上記、FAQのページにサンプルがあります。ほんの少しだけ修正してわかりやすくしてみました。

``` 
#!/usr/bin/python3
# coding:utf-8

from gpiozero import Button
from signal import pause

Button.was_held = False

def held(btn):
    btn.was_held = True
    print("button", btn.pin.number, "長押検知")

def released(btn):
    if not btn.was_held:
        print("button", btn.pin.number, "短押検知")
    btn.was_held = False

btn_11 = Button(11)
btn_19 = Button(19)

btn_11.when_held = held
btn_11.when_released = released
btn_19.when_held = held
btn_19.when_released = released

pause()
```
Buttonクラスにある、when_held（ボタンを押した時間が設定時間を経過した時、指定した関数を実行する）とwhen_released（ボタンをリリースした時＝押すのをやめた時、指定した関数を実行する）を使って実現しています。ボタンをリリースした時のイベントは長押、短押両方で検知しますが、リリース時にbtn.was_heldの状態を確認することで「短押検知」を可能にしています。
ボタンに割り当てたい機能毎に関数を作成するか、上記関数内でpin番号毎に処理を割り振れば良いと思います。

# 3. その他
Mock pins を使えば、Raspberry Piが手元になくてもコードのテストが可能です。
https://gpiozero.readthedocs.io/en/stable/api_pins.html#mock-pins

iPython等を使って動きを確認することができるので便利です。
ちなみに長押はbtn.pin.drive_low()、一旦ボタンの状態を元に戻しbtn.pin.drive_high() 、短押はbtn.pin.drive_low();btn.pin.drive_high()でシミュレートできます。btn.pin.drive_low()が押した状態、btn.pin.drive_high()が放した状態です。

Raspberry PiのGPIOめちゃくちゃ楽しいです。
IPアドレスについて（はじめに少しサーバーについて）　

#はじめに
デプロイに取りかかる前に、学んだことをoutput致します。
もうすでにご存知の方、省略の仕方等ご存知でしたら、ご教授願います。


#サーバーについて
- サービスを提供するコンピュータのこと
- そのコンピュータにある様々な機能（処理）のこと
    
###サーバーが必要な理由
- 自身のPCだけでもサーバーが行うことを全て行うことができることを前提とする。

①サーバーをバックアップとしてデータを保存しておけば、自身のPCが壊れた際にデータを復旧することができる。
②外部のクライアントと接続する機能をサーバーに任せることにより、自身のPCの負荷を減らせる。
③サーバーと自身のPCの役割分担することにより、自身のPCでアプリケーション開発に集中することができる。
    
###サーバーの役割
①様々なデータを管理・保存する（データベースサーバー）
②パソコン同士の通信を行う。（Webサーバー）

####webサーバー
- スマホやPCから送られてきたリクエストに対して、リクエストにあったレスポンスを返す仕組みを持ったPC（ハード）やソフトウェアのことを指す。
- webサーバーが情報をもらったり送ったりするために必要なのが「IPアドレス」となる。
    

#IPアドレスについて
- コンピューターやサーバーに設定された住所のようなもの
- コンピュータが他のコンピュータやサーバーにファイルをメールを送受信する時に宛先として利用する。
    
**IPアドレス例）**

- IPアドレスは「183.79.139.228」のように表現される。この数字の集まりが住所。
- それぞれの数字は0-255までの値を取るので、全パターンは約42億通りになります。（256の4乗）
- Memoです。　→　現在、IPv4だが、将来IPv6（まだ先だが・・・）になる？



**IPv4は数も限られ、制限が多い**
対策としては・・・

- グローバルIPアドレス（WAN：wide Area Network)
- プライベートIPアドレス(LAN:Local Area Network)

###グローバルIPアドレス（WAN：wide Area Network)
- インターネットに接続する際に利用されるIPアドレス
- 光回線などのインターネット契約をするとISPから自動的にグローバルIPアドレスが付与される。

###プライベートIPアドレス(LAN:Local Area Network)
- ISPから自動的に振り分けられたグローバルIPアドレスをさらに小分けにしたIPアドレス
- 3つのクラスに分けられる。
   - 大規模ネットワーク - クラスA：10.0.0.0～10.255.255.255
   - 中規模ネットワーク- クラスB：172.16.0.0～172.31.255.255
   - 小規模ネットワーク- クラスC：192.168.0.0～192.168.255.255

####ルーターについて
- グローバルIPアドレスからプライベートIPアドレスへスイッチする役割
 - ルーターはWANとLANどちらも持っている。
      

##ドメインについて
- IPアドレスを文字列に変換したもの
   - この仕組みをDNS（Domain Name System )という。
       

例）URLから見るドメイン
  https://xxx.in/39  (何もないです。）

 →　この内ドメインとなるのは、xxx.in
  
- ドメインは.(ドット)の前後で分けれる。
- in はトップベルドメインと呼ぶ。
 - 他にも.comや.jpもある。
- xxxの部分はセカンドベルドメインと呼ぶ。
 - 早い者勝ち。同じものは使えない様です。

        

#さいごに
日々勉強中ですので、随時更新します。
皆様の復習にご活用頂けますと幸いです。
HTTPについて調べたことを書いていきます

#HTTPとは
- Hyper Text Transfer Protocolの略
- webサーバーとクライアントが、HTMLで書かれた文書などの情報をやりとりするときに使われる通信手段(プロトコル)を意味する。

- htmlファイルや画像ファイルなどの「ホームページの部品」を自分のパソコンにデータとしてダウンロードする手順のことをいう。
- PCやスマホ、PCでもWindowsやMac、Linuxなど環境が色々違うのに、その違いによって、ホームページのやりとりをする方法が異なっていると不便なので、共通の通信規約的なものを定めることで、ホームページのデータをやりとりすることができるようにしたもの
 
#HTTPSトハ？
- httpよりもセキュリティ的に安全なもの。
- 主な違いは、通信内容が暗号化されているか否かの違い
Ajaxについて

#Ajaxとは

- Asynchronous JavaScript + XML (AJAX)の略
- 非同期でブラウザページをリロードすることなく、HTTPリクエストを送ることができる


```main.js
var xhr = new XMLHttpRequest();
xhr.open('GET','sample.php');
xhr.onload = function (){
 console.log(xhr.response);
};
xhr.send();
```
が基本形となる。
これでmsample.phpに対してGETリクエストが発行される。
XMLHttpRequestオブジェクトのインスタンス作成
openメソッドでHTTPメソッドとのURIを指定。
イベントの設定
sendメソッドでリクエスト

がJavaScriptで非同期通信を行うのに必要な要素

## Ajaxイベントについて
addEventListenerでclickを指定することと同じくらいにhttpリクエストの進捗状況をトリガーにしてイベントを設定できる。
上記のonloadは「結果取得が完了」した時に発火するイベント。

|値|状態|説明|
|---|---|---|
|0|UNSET|クライアントは作成済み。open()はまだ呼ばれていない。
|1|OPENED|open()が呼び出し済み。|
|2|HEADERS_RECEIVED|send()が呼び出し済みで、ヘッダーとステータスが利用可能。|
|3|LOADING|ダウロード中。responeseTextには部分データが入っている。|
|4|DONE|操作が完了した。
SQL: JOINで2つのテーブルをまとめる。


一致するrowだけを得るのがINNER JOIN。

左のテーブルrowをそのまま残すのがLEFT JOIN。

一致するものはくっつけ、しないものもblank表示するのがFULL JOIN。

2つのテーブルの行のすべての組み合わせを表示するのがCROSS JOIN。

--

JOINの構文。ONが共通データを持つ前提でテーブルを合体。

```
FROM table_a
JOIN table_b
ON table_a.id = table_b.id
```

例。

```sql
SELECT teams.conference AS conference,
       AVG(players.weight) AS average_weight
  FROM benn.college_football_players players
  JOIN benn.college_football_teams teams
    ON teams.school_name = players.school_name
 GROUP BY teams.conference
 ORDER BY AVG(players.weight) DESC
```
COTOHA でキーワードの抽出 (Node.js)

[COTOHA API Portal](https://api.ce-cotoha.com/contents/index.html) の使用例です。

次と同じことを Node.js で行いました。
>[COTOHA でキーワードの抽出](https://qiita.com/ekzemplaro/items/30793b21237a08b2160c)

フォルダー構造

```text
$ tree -a
.
├── akai_rousoku.txt
├── .env
├── get_config.js
├── get_token.js
└── key_word.js
```

```js:key_word.js
#! /usr/bin/node
// ---------------------------------------------------------------
//
//	key_word.js
//
//					Feb/23/2020
//
// ---------------------------------------------------------------
var fs = require("fs")
var get_config = require('./get_config.js')
var get_token = require('./get_token.js')
// ---------------------------------------------------------------
function key_word_proc(config,doc)
{
	var Client = require('node-rest-client').Client

	const headers={
		"Content-Type": "application/json",
		"Authorization": "Bearer " + config.access_token
		}

	const data = {
		"document": doc,
		"type": "default"
		}

	const str_json = JSON.stringify (data)

	const url = config.developer_api_base + "v1/keyword"

	const args = {
		data: str_json,
		headers: headers
		}

	var client = new Client()

	client.post(url, args, function (data, response) {
	llx = data["result"].length
	console.log("llx = " + llx)
	for (it in data["result"])
		{
		const unit = data["result"][it]
		console.log(unit['form'] + "\t" + unit['score'])
		}
		console.error ("*** 終了 ***")
	})
}

// ---------------------------------------------------------------
console.error ("*** 開始 ***")

const filename=process.argv[2]
console.error (filename)

if (fs.existsSync(filename))
	{
	const doc = fs.readFileSync (filename,'utf8')

	const config = get_config.get_config_proc()

	try
		{
		get_token.get_token_proc(config,doc,key_word_proc)
		}
	catch (error)
		{
		console.error ("*** error *** from get_token_proc ***")
		console.error (error)
		}
	}
else
	{
	console.error ("*** error *** " + filename + " doesn't exist. ***")
	}
// ---------------------------------------------------------------
```

get_config.js get_token.js はこちら
[COTOHA API で構文解析 (Node.js)](https://qiita.com/ekzemplaro/items/3baa38780e881163dda7)

実行コマンド

```bash
export NODE_PATH=/usr/lib/node_modules
./key_word.js akai_rousoku.txt
```
Debian 10でプリンタを使う

# とても簡単だと思った。

EPSONのサイトでLinuxドライバが配布されている。
https://www.epson.jp/support/taiou/os/linux_se.htm

1. 型番で対応しているか確認する
2. ESC/P-R Driver (generic driver), Epson Printer Utility, All-in-one package のdebファイルをダウンロードする
3. dpkg -i でインストールする。

```bash
# dpkg -i epson-*.deb
以前に未選択のパッケージ epson-inkjet-printer-escpr を選択しています。
(データベースを読み込んでいます ... 現在 236410 個のファイルとディレクトリがインストールされています。)
epson-inkjet-printer-escpr_1.7.7-1lsb3.2_amd64.deb を展開する準備をしています ...
epson-inkjet-printer-escpr (1.7.7-1lsb3.2) を展開しています...
以前に未選択のパッケージ epson-printer-utility を選択しています。
epson-printer-utility_1.1.1-1lsb3.2_amd64.deb を展開する準備をしています ...
epson-printer-utility (1.1.1-1lsb3.2) を展開しています...
dpkg: 依存関係の問題により epson-inkjet-printer-escpr の設定ができません:
 epson-inkjet-printer-escpr は以下に依存 (depends) します: lsb (>= 3.2) ...しかし:
  パッケージ lsb はまだインストールされていません。

dpkg: パッケージ epson-inkjet-printer-escpr の処理中にエラーが発生しました (--install):
 依存関係の問題 - 設定を見送ります
dpkg: 依存関係の問題により epson-printer-utility の設定ができません:
 epson-printer-utility は以下に依存 (depends) します: lsb (>= 3.2) ...しかし:
  パッケージ lsb はまだインストールされていません。

dpkg: パッケージ epson-printer-utility の処理中にエラーが発生しました (--install):
 依存関係の問題 - 設定を見送ります
libc-bin (2.29-10) のトリガを処理しています ...
処理中にエラーが発生しました:
 epson-inkjet-printer-escpr
 epson-printer-utility
```
だめでした。

# 成功した方法

```bash
# apt install printer-driver-escpr psutils cups
```

debパッケージが置いてあるサイトにアクセスすると分かるのだけれど、このパッケージはepson-inkjet-printer-escpr_<version>.tar.gzから作成されている。

あとはプリンタの電源を入れておき、gnomeの設定画面で自動追加されたのを確認する。

# 参考にした文献

- [Qiita: EP-805AをUbuntu 16.04 LTSで使えるようにする方法](https://qiita.com/SUZUKI_Masaya/items/67e281d16e36c9ac09d2)
- [debian/amd64/printer-driver-escpr](https://packages.debian.org/jessie/amd64/printer-driver-escpr/download)
SQL: SELECT文を活用する

INはORのように働く。

```sql
SELECT *
  FROM tutorial.billboard_top_100_year_end
 WHERE year_rank IN (1, 2, 3) -- 1か2か3の値のもの
```



DISTINCT

```sql
SELECT DISTINCT year -- 一意のyearでまとめる
  FROM tutorial.aapl_historical_stock_price
 ORDER BY year
```

GROUP BYでまとめる。

```sql
SELECT year,
       COUNT(*) AS count
  FROM tutorial.aapl_historical_stock_price
 GROUP BY year -- yearごとにまとめる
```


HAVING（GROUPでまとめた後に対して処理される）

```sql
SELECT year,
       month,
       MAX(high) AS month_high
  FROM tutorial.aapl_historical_stock_price
 GROUP BY year, month
HAVING MAX(high) > 400 -- GROUP BYを処理した後で、400より大きいもの
 ORDER BY year, month
```


「CASE WHEN」「END AS」で値によって出力を変える方法。

```sql
SELECT player_name,
       year,
       CASE WHEN year = 'SR' THEN 'yes'
            ELSE NULL END 
            AS is_a_senior -- column名は「is_a_senior」
  FROM benn.college_football_players
```

「CAST」で文字列を数値に、または数値を文字列に変換する。

```sql
SELECT CAST(funding_total_usd AS varchar) AS funding_total_usd_string,
       founded_at_clean::varchar AS founded_at_string
  FROM tutorial.crunchbase_companies_clean_date
```


「::timestamp」と「INTERVAL」で時間に変換して処理。

```sql

SELECT companies.permalink,
       companies.founded_at_clean,
       companies.founded_at_clean::timestamp +
         INTERVAL '1 week' AS plus_one_week
  FROM tutorial.crunchbase_companies_clean_date companies
 WHERE founded_at_clean IS NOT NULL
```

今の時間からの差分。

```sql
SELECT companies.permalink,
       companies.founded_at_clean,
       NOW() - companies.founded_at_clean::timestamp AS founded_time_ago
  FROM tutorial.crunchbase_companies_clean_date companies
 WHERE founded_at_clean IS NOT NULL
```
Gmailアカウントに届いたメールを複数ユーザに転送する。

# Gmailアカウントに届いたメールを複数ユーザに転送する

あるGmailのアカウントに届いたメールを1人の人に転送するのは比較的簡単にできます。しかし、複数の人に転送することは、Gmailの通常の使い方では想定されていないようです。今回は、Gmailに届いたメールを、フィルタの機能を使って複数の人に転送する方法をご紹介します。

## たとえば、こんなとき
・会社内で、お問い合わせ専用のメールアカウントを設定しているが、そこにメールが届いたときに複数の担当者に転送したい。
・少人数のグループでメールアカウントを共有しているが、たまにしかメールが来ないので頻繁にメールチェックはしていない。そのため、なにかメールが届いたら携帯やスマホのメールに転送して気がつくようにしたい。

## サンプルケース
一般のお客様から info@xyz.xxx.jpに届いたメールを複数の担当者aaa@xyz.xxx.jpとbbb@xyz.xxx.jpに転送する。

##　設定方法
操作はパソコンの画面から行うことをおすすめします。スマホやタブレットから操作する場合は、機能が制限されていたり、表示が簡略化されていたり、操作方法が異なっている場合があります。

1. info@xyz.xxx.jpのGmailアカウントにログインする。

2. メールの一覧ウィンドウが表示される。

3. 画面右上にある歯車マーク(設定ボタン)をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586772/f69fad13-2673-fce3-c4c8-bd60bb7b61e1.png)

4. メニューから「設定」を選択する。

5. 設定画面が表示される。「設定」と書かれているすぐ下の行から、「メール転送とPOP/IMAP」のリンクをクリックする。

## 1人の人に転送するとき

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586772/ebb0cad4-595f-de39-c393-622153399f0d.png)

1. 「転送先アドレスを追加」ボタンを押す。画面の指示にしたがってメールアドレスの確認を行う。(例)aaa@xyz.xxx.jp

2. メールアドレスの確認が済んだら「転送:」のエリアにある「受信メールを____に転送して・・・」の項目のラジオボタンをONにする。
「受信メールを・・・」のプルダウンリストから、いま登録したメールアドレスを選択する。(例)aaa@xyz.xxx.jp

3. 画面の一番下にある「変更を保存」ボタンをクリックする。


## 複数の人に転送するとき

複数の人に転送する場合も、送りたい相手を上に示した方法(1人の人に転送するときの方法)でメールアドレスを登録・確認をしておきます。(例)bbb@xyz.xxx.jp

1. 設定画面の「設定」と書かれているすぐ下の行から、「フィルタとブロック中のアドレス」のリンクをクリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586772/d5522153-d79d-fb71-ebc2-1f6a35008e7a.png)

2.　画面に表示されている「新しいフィルタを作成」のリンクをクリックする。

3.　フィルタの設定画面が表示される。Toのところに、転送元となるアドレスを入力する。(今回の例では、info@xyz.xxx.jp) 「フィルタを作成」ボタンをクリックする。
※少し分かりにくいかもしれませんが、外部からTo:info@xyz.xxx.jpと指定されて届いたメール(つまり自分のところに届いたメール)が転送元のメールになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586772/dfa2c2b9-9609-f1a7-9c1c-3ee73a9cf2d3.png)
 
4.「この検索条件に一致するメールが届いたとき」という画面が表示される。「次のアドレスに転送する」のチェックボックスをONにする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586772/f18a169d-f4e7-9790-58cf-af08f8db8da1.png)

5.「次のアドレスに転送する」のところにある「アドレスを選択」のリンクをクリックする。転送したいアドレスを1つ選択する。(例)bbb@xyz.xxx.jp
すでに登録済みであればbbb@xyz.xxx.jpが選択できるようになっている。登録がまだの場合は「転送先アドレスを追加」のリンクをクリックして登録を行う。

6.　画面の一番下にある「フィルタを作成」ボタンをクリックする。

7.　設定画面に戻り、今作成したフィルタが表示されていれば完了

8.　転送先メールアドレスをさらに増やしたい場合は、フィルタの作成を繰り返す。

### 補足
　メールの検索条件としてfromの欄に「@」を書き、すべてのメールを対象にする方法もあるようです。メールボックスを単純に検索する場合は、このやり方でうまく検索ができました。
　しかし、フィルタの検索条件としてfrom欄に「@」を書いた場合は条件に引っかからず、転送がうまくできませんでした。(検索条件がゆるすぎる、検索ワードが短か過ぎる、一般的すぎる等)
検索条件の書き方によって、思ったとおりにフィルタが反応しない場合もあるようですので、いろいろと試してみてください。

Collab KM
sidekiqざっくりまとめ

Railsで非同期処理を実現するsidekiqについて調べてわかったことをまとめます。
sidekiq自体はRails以外でも使えるものらしいです。

##何ができるか
非同期処理を実現する。
例えば画像アップロードの処理を非同期にすることで、ユーザーは画像アップロードが終わるまで待つことなく他のページに遷移できて、快適。

##必要なもの
- redisサーバー
- gem: `sidekiq`

##使い方
###`app/workers/◯◯_worker.rb`にクラスとメソッドを作成する

```rb:worker
class HogeWorker
  include Sidekiq::Worker

  def perform(id)
    @event = Event.find(id)
    @event.calculate_rank!
  end
end
```

###controller内で`<クラス名>.<メソッド名>_async`でキューに入れる
```rb:controller
def ranking
  HogeWorker.perform_async @event.id
end
```

###トリガーを発火して実行する
コマンドラインでコマンドを実行したり、あらかじめ定義した条件に合致した時、キューに入った処理が実行されます。

##参考
- [sidekiqの使い方
Ruby](https://qiita.com/nysalor/items/94ecd53c2141d1c27d1f)
ずぶの素人がAWSでRailsアプリを作るメモ

仕事でRailsを使うので、この機会に自分でも何かしようと思い行動に移すことにしました。

やりたいことリスト：
    - Railsでサンプルアプリケーションをつくる
    - 自分流にアレンジする
    - 仕事で使わないような技術に触れる

ひとまずやってみようの精神で、失敗しながら学びます。


というわけでまずは環境から。
いろいろとローカルに用意するのは挫折しそうだったので、手っ取り早くAWSのCloud9を使用します。
ありがたいことに必要なものはそろっている（素人目線）ので、
![create_env.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534558/bcbb3607-5995-396b-d048-3ed417973045.png)

新しく環境を作ったら、さくっと始めていきます。
新規作成した環境には初めは何もないので、Railsアプリをつくるときは
`rails new sample -d mysql`
でディレクトリから作成します。
（個人的にMySQLのほうが好きなのでDBを軽率に変更しています、「-d　～」はなくてもOKです）

用意ができたのでさっそくRailsサーバーを立ち上げて（`rails s`）、まっさらなアプリを起動しよう…
としたのですが、エラーメッセージが。
仕事でも見たことないメッセージだったのでここでしばらくワタワタしました（素人感）。
![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534558/69acffe6-bdac-f7de-e2e9-ea5df1503f50.png)

まだしっかり理解してないですが、MySQLが起動してないのでDBに接続できないと怒られているようです。
ネットで調べると以下のような記事が。
[MySqlのソケットエラーを解決する](https://qiita.com/kanohisa/items/564035efd74d9c75bdcb)

ありがたく以下のコマンドを拝借して、実行します。
`sudo /etc/init.d/mysqld restart`
そうするとエラーの種類が変わりまして、”sample_development”なんてDBはねえよ、と言われました。
これは仕事場でも見たことがあったので、おとなしく
`rake db:create`
します。（rails db:createでもいいはず？）

今度こそうまく動いて、Railsの初期アプリの画面が表示されました。
![Rails.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/534558/3ebd839d-a425-e682-c287-c9bfb5ac2842.png)

DBをSQLiteからMySQLに変更するだけでこんなにわたつく滑り出しで、今後どういった艱難辛苦があるか想像できませんが、ひとまず進めるだけは進めたいと思います。

ネタがあったり、詰まっていた部分が解決したらまたメモします。
COTOHA で固有名詞の抽出 (Node.js)

[COTOHA API Portal](https://api.ce-cotoha.com/contents/index.html) の使用例です。

次と同じことを Node.js で行いました。
>[COTOHA で固有名詞の抽出](https://qiita.com/ekzemplaro/items/c60d97b1f9101b280aa1)

フォルダー構造

```text
$ tree -a
.
├── .env
├── get_config.js
├── get_token.js
└── proper_noun.js
```

```js:proper_noun.js
#! /usr/bin/node
// ---------------------------------------------------------------
//
//	proper_noun.js
//
//					Feb/23/2020
//
// ---------------------------------------------------------------
var get_config = require('./get_config.js')
var get_token = require('./get_token.js')
// ---------------------------------------------------------------
function proper_noun_proc(config,sentence)
{
	var Client = require('node-rest-client').Client

	const headers={
		"Content-Type": "application/json",
		"Authorization": "Bearer " + config.access_token
		}

	const data = {
		"sentence": sentence,
		"type": "default"
		}

	const url = config.developer_api_base + "v1/ne"

	const args = {
		data: data,
		headers: headers
		}

	var client = new Client()

	client.post(url, args, function (data, response) {
	llx = data["result"].length
	console.log("llx = " + llx)
	for (it in data["result"])
		{
		const unit = data["result"][it]
		console.log(unit['form'])
		}
		console.error ("*** 終了 ***")
	})
}

// ---------------------------------------------------------------
console.error ("*** 開始 ***")

const sentence = "特急はくたかで富山に向かいます。それから、金沢に行って、兼六園に行きます。"

const config = get_config.get_config_proc()

get_token.get_token_proc(config,sentence,proper_noun_proc)

// ---------------------------------------------------------------
```

get_config.js get_token.js はこちら
[COTOHA API で構文解析 (Node.js)](https://qiita.com/ekzemplaro/items/3baa38780e881163dda7)


実行コマンド

```bash
export NODE_PATH=/usr/lib/node_modules
./proper_noun.js
```
ExcelやSpreadSheetで冒頭の0を消さない

以下のように、顧客IDや電話番号など0から始まる数字の冒頭の0が消されてしまう問題を解決します。

```rb
09011112222 #=>9011112222
0123456789 #=>123456789
```

##原因
数値型と判断されてしまっている

##自分で数値を追加する場合
###解決策1: セルの冒頭に`'`を入れる
`'090`のように入力すると、文字列として識別されます

###解決策2: セルの書式設定を変更する
該当のセルを選択 > 右クリック > セルの書式設定 > 文字列 で文字列として識別されます。

###その他
TEXT関数でもいけるらしいです。

##すでにあるファイルを開く場合
すでにあるファイル、特にcsvファイルやtsvファイルを開く時に起こりやすい問題です。
私はここで苦戦しました。

###解決策: Excelの場合
1. 空のシートを開く
2. **データ**タブを開く
3. **テキストファイル**をクリック
4. 開きたいcsvファイル等を選択
5. 取り込み開始行等を選択し、次へ
6. 区切り文字を選択し、次へ
7. 「0」を残したい列を選択し、「文字列」にチェック
8. 既存のシートを選択し、開くをクリック

##解決策: Google Spread Sheetの場合
1. 空のシートを開く
2. ファイル > インポートをクリック
3. 開きたいファイルを選択 or アップロード
4. `テキストを数値、日付、数式に変換` > `いいえ`を選択
5. データをインポート
Azure Sphere技術セミナー@Fingate KAYABA 参加レポート

#イベント
[Azure Sphere技術セミナー@Fingate KAYABA](https://algyan.connpass.com/event/161513/) に参加してきました。
当日(19/2/6)はマイクロソフト主催の [IoT in Action Tokyo](https://www.iotinactionevents.com/ja/event/tokyo) もあったので、そちらに参加した後に電車で移動してセミナーに参加しました。最終の新幹線で金沢に帰ったので、講演のレポートは途中まで。

以下が会場の雰囲気になります。
![2020-02-06_19-14-27_935.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/387ca213-d1fd-be89-2ef7-604e25584646.jpeg)

#講演１：Azure Sphere概要
講師は、アヴネット株式会社の細倉さん。資料は、[こちら](https://www.slideshare.net/ssuserbe2462/azure-sphere-overview) に公開されてます。

* 本来、ビジネスでユーザーがやりたいところはお金を生むところ。
* セキュリティは必要だけど、見方を変えるとコストになりがち
* Azure SphereはセキュアなIoTプラットフォームのことで、チップ単体の話ではない
* ハードウェアとしてセキュリティを担保する仕組みが考慮されている
* Plutonって仕組みがハードウェアとしても実装されている（この辺りは自身が勉強不足ですが、キーワードで検索するといろいろ情報が出てきます）
* 半導体メーカーが順次対応製品を開発中。Qualcommはセルラー対応版が出るか？？？
* セキュリティ面はOTAで自動更新機能あり

#講演２：Azure Sphereのセキュリティ
講師は、マイクロソフトの太田さん。資料は、[こちら](https://www.slideshare.net/HiroshiOta4/microsot-azure-iot-security-for-iot-algyan-tech-seminar-202026) に公開されてます。

* セキュリティはハードだけでもソフトだけでも駄目
* Azure Sphereはハード・ソフト・サービスでデバイスのセキュリティを達成する為のテクノロジー
* 世の中のセキュリティは仮にシステムに侵入されたとしても大丈夫ってぐらいの流れになりつつある
* Azure Security Center Architectureは、AWSやVMwareでも使える
* デバイスの基本管理はアイデンティティ管理
* とりあえず動くシステムではなく、ちゃんと動くが大切（運用管理含めて）。それを提供できるのがAzure Sphereって流れか。


#講演３：Azure Sphereのハードウェア
講師は、マイクロソフトの梅津さん。

* 各メーカーから販売されているハードウェアの紹介
* Bluetooth内蔵しているモジュールなども計画にあり
* グリーンフィールドとブラウンフィールドの話
* アットマークテクノからは順次４種類のインターフェイスに対応したモジュールが計画されている

#講演４：Azure Sphereのマルチコア
講師は、Seeed株式会社の松岡さん。資料は、[こちら](https://www.slideshare.net/TakashiMatsuoka2/azure-sphere-227128702) に公開されてます。
ここで一足先に退席。。。（金沢行きの最終新幹線に乗る為に）
本当はここが聞きたかった。資料を見てのイメージでの感想になります。

* 定番のMT3620とReButton
* ガチ組み込みエンジニアには面白みがない
* ARM Cortex-AとARM Cortex-M
* MT3620(Cortex-M4F x 2、Cortex-A7）
* HLCore(Cortex-A7)、RTCore(Cortex-M4F)
* HLApp Code：ライブラリのAPIでIO操作する感じ
* RTApp Code：レジスタ操作できるような感じか。。。
* BSPレイヤーあって、ドライバ層あって、その上位にアプリケーション層。触れるのが、このアプリケーション層なのかな。おそらく。
* マルチコア・マルチOSなので、どこでどこまでやるかの基本設計が重要なのかも。

#まとめ
Azure Sphereが狙っているところや全体概要を把握するには良い機会であったと思います。当日のプレゼンでもありましたが、そもそもセキュリティって分野自体がお守り要素が強いと思っているので、ユーザープログラムのアップデートの仕組みを含めて、デバイス管理が担保されているのが魅力的な気がしますね。ということで、何か作りたいものが明確ならば面白いデバイスだとは思います。（なので、何したいかが大切）
scoop でインストールした powershell-core (pwsh) を VSCode に認識させる

`scoop` でインストールした powershell-core (pwsh) は、Visual Studio Code (code) から認識されないのでターミナルの候補に出てきません。なので、自分で指定する必要があります。

## scoop で powershell-core のインストール

[こんな感じ](https://github.com/OpenJNY/my-scoop-bucket/blob/master/bucket/powershell-core.json) で manifest を書くと、scoop 公式にないアプリもインストールできるようににある。

ちなみに、自分の非公式 bucket のレポジトリは以下。

[OpenJNY/my-scoop-bucket: This is a repository for my own scoop bucket.](https://github.com/OpenJNY/my-scoop-bucket)

```
# 非公式 bucket を追加するとインストール出来るようになる
scoop bucket add openjny https://github.com/OpenJNY/my-scoop-bucket.git
scoop install powershell-core

# マニフェストを直接指定しても OK
scoop install https://raw.githubusercontent.com/OpenJNY/my-scoop-bucket/master/bucket/powershell-core.json
```


## vscode のターミナルに指定

`terminal.integrated.shell.windows` で pwsh のパスを教えてあげるだけ。

* [Integrated Terminal in Visual Studio Code](https://code.visualstudio.com/docs/editor/integrated-terminal#_configuration)

まずはパスを調べます。

```
PS> scoop which pwsh
~\scoop\apps\powershell-core\current\pwsh.exe
```

version 6.2.3 の powershell-core では
を見てみると

```powershell
PS> ConvertTo-Json $($HOME + "\scoop\apps\powershell-core\current\pwsh.exe")
"C:\\Users\\username\\scoop\\apps\\powershell-core\\current\\pwsh.exe"
```

### settings.json

設定例

```json:settings.json
{
    "terminal.integrated.shell.windows": "C:\\Users\\username\\scoop\\apps\\powershell-core\\current\\pwsh.exe",
    "terminal.integrated.fontFamily": " 'Fira Mono for Powerline'",
    "terminal.integrated.fontSize": 13,
    ...
}
```
ビーコンのManufactureDataを取得できるノードを作成しました。

#概要
Raspberry PiとNode-REDとAzureを使って、
簡易なIoTシステムをいろいろ開発をしています。

最近使うセンサーが、BLEのAdvertising Messageで
データを送信するものが多いんですが、iBeacon仕様とかではなくて・・・。

iBeaconやEddystoneであれば、
Node-REDのノードがすでに存在するんですが・・・。

ということで、メッセージを解析して、iBeaconやEddystoneでなければ、
ManufactureDataを取得するノードを作成しました。

#ソースコード
gitに上げています。
https://github.com/yossihard/node-red-contrib-blebeacon-scanner

README.mdにも記載していますが、
futomiさんという方がNode.js用に開発されていたコードを流用しています。


#インストール方法
ラズパイで使用するには、先に以下のコマンドを実行してください。

```
> sudo apt-get install libbluetooth-dev libudev-dev pi-bluetooth
> npm install @abandonware/noble
```

今回作成したコードは、node-red-contrib-blebeacon-scannerという名前で
npmにも登録してみました。

~~Node-RED上の「パレットの管理」から「ノードの追加」画面で追加できるようになるはず・・・なんですが、
今はまだ追加されていないようです（汗）。
⇒README.mdの記載量が足りない？？？~~

Node-RED上の「パレットの管理」から「ノードの追加」画面で追加できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/930b1a70-5f13-5aae-9b55-fbc218b70651.png)

Node-RED公式サイトでのフロー紹介ページはこちら
https://flows.nodered.org/node/node-red-contrib-blebeacon-scanner

~~ということで、以下のコマンドでインストールしてください。~~
以下のコマンドでもインストールできます。

```
> npm install node-red-contrib-blebeacon-scanner
```

#使い方
こんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/146789/8fa06e2c-d1b2-9fac-ccb3-1fd028d6ca88.png)

ものすごく大量のデータが取得されるので、
switchノードで欲しいビーコンのIDを指定してくださいませ。
AWS CodeCommit (自分用メモ1)

#####1 IAMでCodeCommitの権限を全て持っているユーザーを作成
・ユーザー名は`aws_cli_user`
・リージョンは`us-east-1`
で作成
#####2 Access Key、Secret Access Keyを保存

#####3 [CodeCommit](https://console.aws.amazon.com/codesuite/codecommit/start?region=us-east-1 "CodeCommit")　でリポジトリを作成

#####4 自分のパソコンに(ローカルに)Gitを入れていること

```console:ターミナル
# ローカルにaws cliを入れる
katoatsushi$ pip install awscli --upgrade --user

# 設定
katoatsushi$ aws configure --profile CodeCommitUser
AWS Access Key ID [None]: ASDFGHJKIUYTRFGHJKUYTGFGH
AWS Secret Access Key [None]: sdfgtyujkj/+tgh/mjyRestdH&^FGHJ
Default region name [None]: us-east-1
Default output format [None]: json

katoatsushi$ git config --global credential.helper '!aws --region us-east-1 --profile aws_cli_user codecommit credential-helper $@'
katoatsushi$ git config --global credential.UseHttpPath true
```

次にgit clone でローカルに落とす
そしてpush

```console:ターミナル
katoatsushi$ git clone https://git-codecommit.us-east-1.amazonaws.com/v1/repos/go-sample-master
Cloning into 'go-sample-master'...
warning: You appear to have cloned an empty repository.

katoatsushi$ cd ~/sample-repo && touch main.go
katoatsushi$ git add .
katoatsushi$ git commit -m"first commit"
katoatsushi$ git push origin master
```

確認してみると、、、
<img width="1069" alt="スクリーンショット 2020-02-23 15.14.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239663/2da5fae6-267b-b9a0-665f-395f1ead1b5b.png">

上手くpush できてました。

次はCodeDeploy、CodePipeline、CodeCommitを使った自動デプロイです
Let's Encrypt で "ImportError: XXX" になった場合の対応

```
unset PYTHON_INSTALL_LAYOUT
```

例えば、以下のようなエラーになった場合の対応


> ImportError: No module named cryptography
> ImportError: No module named enum
> TypeError: 'type' object is not iterable


実行例

```
# unset PYTHON_INSTALL_LAYOUT
# certbot-auto certonly --webroot -w /var/www/html -d example.com --email foo@example.com --agree-tos --debug
```
You must use Bundler 2 or greater with this lockfile.の対処法


Dockerを動かそう```docker-compose up --build```をしたところ、次のエラーが表示されDockerを立ち上げることができませんでした。

```
You must use Bundler 2 or greater with this lockfile
```


## 原因

最近（2019年）に表示されることが多くなったエラー。
・根本原因は不明だが、Bundlerのバージョン2.0.1が悪さをしているらしい。








## 対処法

Gemfile.lockを右クリックでゴミ箱に移す（削除する）


```gem install bundler -v 1.17.3 ```を実行し、古いgemを取得。

```docker-compose up --build```をしたところ、

```
Your Ruby version is 2.5.1, but your Gemfile specified 2.6.3
```

というエラー文が表示されたのでgemfile内の上記部分を

```gemfile

ruby '~> 2.5.1
```

に書き換え、再び```docker-compose up --build```。

dockerが正常に動きました。







参考URL
https://qiita.com/kHigasa/items/2e9764e7e80d1bdd8186
TypeScriptでちょっと便利かもしれない拡張メソッドを書いてみたので見てほしい

```typescript
const hoge : string = 'hoge';

if(hoge === 'fuga' || hoge === '(｢･ω･)｢がおー'){
  return true;
}
else{
  return false;
}
```

みたいに、

> 比較対象(今回は`String`)がいずれかの候補と同じものであれば`true`
> そうでなければ`false`を返す

こういうケース、そんなに多くないけど実際書くと面倒くさいよね
(この例は最悪なもので、普通なら候補を `Array` に突っ込んで `map` で順に比較みたいなのが多いと勝手に思う)

本記事では、このめんどくさいを解決する拡張メソッドを深夜テンションで書いてみた話をお送りいたします。

# メソッド命名から入ってみる  
私は残念なことに英語を雰囲気で読むくらいしかできないので命名はGoogle先生に頼ることにしました  
![Screen Shot 2020-02-23 at 3.31.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320738/93d33724-c345-a321-27a2-c6bb8b4c0d7d.png)

**ながったらしい**。 結局少し考えて`.anyIn()`で行くことで決めた。ソッチのほうが自然そう。

# メソッドの仕様

```typescript
'hoge'.anyIn('fuga', 'hoge'); // => true
'fuga'.anyIn('f')             // => false
```

だいたいこんな感じの記述デザインにしてみた。可変長引数を使えば実装も難しくはなさげ

# 実装
こちらのサイトを参考にさせていただきました。
https://kakkoyakakko2.hatenablog.com/entry/2018/06/12/003000

```typescript:string_extention.ts
// これないとエラーが出る
export {};

declare global {
  interface String {
    /**
     * 引数のStringと呼び出し元のStringをORで比較して  
     * どれかと等しければ `true` でなければ `false`
     * @param word string 1つ目(**require param**)
     * @param args string 2つ目以降(option)
     */
    anyIn(word : string, ...args: Array<string>): boolean;
  }
}

// ここはArrow Functionにしてはいけない(後述)
String.prototype['anyIn'] = function(word: string, ...args: Array<string>) : boolean{
  if(this === word){
    return true;
  }
  else{
    // ここからはもうちょっと楽にかけたかも
    let result : boolean = false;
    args.forEach((char) => {
      if(this === char){
        result = true;
      }
    });
    return result;
  }
};
```
`...`は可変長引数の宣言をしているだけ。使用する際2つ目以降の引数が順番に`Array`に突っ込まれる。
あとはJSでの拡張定義に型の注釈が増えたくらい。

あとは使うタイミングで `import` してやれば`String`にぶら下がるメソッドとして使用可能。

```typescript:main.ts
import './string_extention';

console.log('hoge'.anyIn('ho', 'hoge')); // => true 
```

VSCodeでもJSDocが出てくる。
![Screen Shot 2020-02-23 at 3.51.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320738/c7632968-e97f-dbf4-3254-ff40c8112828.png)

# ArrowFunctionについて気をつけること

ほぼほぼのFunction定義は`() =>`で書けるが、今回のケースでは**呼び出し元をthisで拾える**ことが前提となる。(`'hoge'.anyIn()`の中で`'hoge'`を拾えるようにする)
ここで気をつけないといけないのが、Arrow Functionにおける`this`の束縛について。

[MDNのドキュメント](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Functions/Arrow_functions)には以下のように記述されている
>アロー関数式は、より短く記述できる、通常の function 式の代替構文です。また、this, arguments, super, new.target を束縛しません。

どういうこっちゃ？🤔
まあ言いたいことはぶっちゃけ[mejileben氏の記事](https://qiita.com/mejileben/items/69e5facdb60781927929)で解説されているので要約すると

+ `function()`では`this`を実行する段階で確定している。
+ それに対し`() =>`の`this`は宣言の段階で確定している。
+ そのためレシーバを拾う必要のあるメソッドは`function()`で定義する
+ 今回の場合`'hoge'.anyIn()`で書きたいのでArrow Functionは使えない

という感じ

# まとめ

+ 意外と簡単に拡張メソッドを作れる　あと書いていて気持ちいい命名になったかも
+ Arrow Functionは楽に書けるし視認性も上がるのでほぼ置き換えても良い。
  + 今回のように例外となるケースもあることは理解しておくこと。
画像をDBに保存する際の留意点

#前提
アプリをローカルで完結させる場合。

#そもそもDBに保存すべきなのかを検討する
**ファイルパスだけを保存することで問題がない場合はわざわざDBに保存する必要はない。**

私のサービスの都合上、ファイルパスの保存では問題があった。
私のサービスでは写真が肝であり、データを消されるとまずい。
存在確認をして、「ファイルが削除された可能性があります」ではダメなのだ。

基本的にはギャラリーには保存せず、必要なときにアプリの方から写真を復元というかダウンロードさせればよい。

#検索(パフォーマンス)は大丈夫なのか
画像データはバイトの集まりで、近年はカメラの解像度も上がってきているため、サイズはバカにならない。前回の記事ではバイナリーだけを保存しただけであったが、これは問題である。
大きなバイナリーの比較には相当の時間を有するため、非機能要件を満たせなくなる。
そこで、md5などのアルゴリズムを使ってハッシュ値を求めて、レコード内に保存しておく。ハッシュ値で比較することによって、大幅に検索時間が短縮できるであろう。
記憶領域が増えるが、パフォーマンスを優先しようとなったときには、是非実装すべきである。

#追記(2020/4/11)
写真はファイルとして内部ストレージに保存するのが良さそうです。
通常、ユーザーが操作することはないでしょうし、DBのパフォーマンスやカーソルのメモリ制限などを考慮しました。
COTOHA API で構文解析 (Node.js)

[COTOHA API Portal](https://api.ce-cotoha.com/contents/index.html) の使用例です。

次と同じことを Node.js で行いました。
>[COTOHA API で構文解析](https://qiita.com/ekzemplaro/items/283f608c8623a725827a)

フォルダー構造

>```text
$ tree -a
.
├── .env
├── get_config.js
├── get_token.js
└── parsing.js
```

```js:parsing.js
#! /usr/bin/node
// ---------------------------------------------------------------
//
//	parsing.js
//
//					Feb/23/2020
//
// ---------------------------------------------------------------
var get_config = require('./get_config.js')
var get_token = require('./get_token.js')
// ---------------------------------------------------------------
function parse_proc(config,sentence)
{
	var Client = require('node-rest-client').Client

	const headers={
		"Content-Type": "application/json",
		"Authorization": "Bearer " + config.access_token
		}

	const data = {
		"sentence": sentence,
		"type": "default"
		}

	const url = config.developer_api_base + "v1/parse"

	const args = {
		data: data,
		headers: headers
		}

	var client = new Client()

	client.post(url, args, function (data, response) {
		for (it in data["result"])
			{
			for (jt in data["result"][it].tokens)
				{
				const token = data["result"][it].tokens[jt]
				console.log (token.form + "\t" + token.pos)
				}
			}
		console.error ("*** 終了 ***")
	})
}

// ---------------------------------------------------------------
console.error ("*** 開始 ***")

const sentence = "特急はくたか"

const config = get_config.get_config_proc()

get_token.get_token_proc(config,sentence,parse_proc)

// ---------------------------------------------------------------
```

```js:get_config.js
// ---------------------------------------------------------------
//
//	get_config.js
//
//					Feb/23/2020
//
// ---------------------------------------------------------------
exports.get_config_proc = function ()
{
	const dotenv = require('dotenv')

	dotenv.config()

	const config = {
		client_id: `${process.env.CLIENT_ID}`,
		client_secret: `${process.env.CLIENT_SECRET}`,
		developer_api_base: `${process.env.DEVELOPER_API_BASE_URL}`,
		access_token_publish_url: `${process.env.ACCESS_TOKEN_PUBLISH_URL}`,
}

	return config
}

// ---------------------------------------------------------------
```

```js:get_token.js
// ---------------------------------------------------------------
//
//	get_token.js
//
//					Feb/23/2020
//
// ---------------------------------------------------------------
exports.get_token_proc = function(config,sentence,callback)
{
	var Client = require('node-rest-client').Client

	const data = {
		"grantType": "client_credentials",
		"clientId": config.client_id,
		"clientSecret": config.client_secret
		}

	const url = config.access_token_publish_url

	const headers={
		"Content-Type": "application/json"
		}

	const args = {
		data: data,
		headers: headers
	}

	var client = new Client()

	client.post(url, args, function (data, response) {
		config['access_token'] = data.access_token
		callback(config,sentence)
	})
}

// ---------------------------------------------------------------
```

実行コマンド

```text
export NODE_PATH=/usr/lib/node_modules
./parsing.js
```
【Rails】SQL文を直接実行する

ActiveRecordを使わずに、自分で作成したSQL文を使ってDBに問い合わせをする方法です。

```rb
name = 'サンプル太郎'
email = 'tarou@example.com'
now = Time.zone.now
args = ['INSERT INTO users (name, email, created_at, updated_at) VALUES (?, ?, ?, ?)', name, email, now, now] #下準備
sql = ActiveRecord::Base.send(:sanitize_sql_array, args) #sql文を作成
ActiveRecord::Base.connection.execute(sql) #sql文を実行
```

##注意点
- 謎の戻り値が返ってくるので、`SELECT`はできません。
- 実行速度やサーバーへの負荷をかなり抑えることができますが、バリデーションや外部キー制約が効かなくなるなど懸念点も多いので注意が必要です。
- いわゆる「Railsのレール」からは外れた実装だと思うので、ActiveRecordではどうにもならない時にだけ使う感じです。
Python Programingの入門備忘録

#programをやる上での備忘録

##目次
1. はじめに
2. 動作環境
3. 本文

##1. はじめに
　この記事は筆者が学習したことを忘れてしまうため、この記事に備忘録として記載することで学習した物事を定着させると同時に、自身の物事の説明する能力を向上させようという狙いがある。Pythonの出来ることをいろいろやりたいのでタグはPython以外に特に決めていない。

##2. 動作環境
 - windows 10（ノートパソコン）
 - visual studio code (version 1.42.1）
 - anaconda 1.9.7　（pythonを動かすための仮想環境 VSCodeと連結）
 - ほか

##3. 本文
 - ゼロから始めるDeepLearning を読み進める

読み進める上で参考にしたサイト
[github][https://github.com/oreilly-japan/deep-learning-from-scratch]

１章　Python入門
　ここはpythonのインストールから基本的なpythonの動作やNumpy,Matplotlibといったライブラリの説明などが書いてある。

２章　パーセプトロン
　パーセプトロンは複数の信号を受け取り、その内容により一つの信号を出力する。
パーセプトロンを入力信号x1,x2、重みw1,w2、閾値θを用いて出力信号yは

```math
f(x) = \left\{
\begin{array}{ll}
1 & (w1x1+w2x2\geq θ) \\
0 & (w1x1+w2x2 \lt θ)
\end{array}
\right.
```
と表すことが出来る。
また、ANDゲートやNANDゲート、ORゲートをパーセプトロンを用いて実装し。

~~~ruby
def AND(x1,x2):
    w1,w2,theta=0.5,0.5,0.7
    tmp=x1*w1+x2*w2
    if tmp>theta:
        return 1
    else:
        return 
~~~
行列を用いると以下の通りになる。

~~~ruby
import numpy as np
def AND(x1,x2):
    w=np.array([0.5,0.5])
    x=np.array([x1,x2])
    b=-0.7
    tmp=np.sum(w*x)+b
    if tmp>0:
        return 1
    else:
        return 0
~~~
x1,x2に適当な値(x1,x2)=(0,0),(0,1),(1,1),(1,0)を入力すると

~~~ruby
a=AND(0,0)
b=AND(0,1)
c=AND(1,1)
d=AND(1,0)
print(a,b,c,d)

>> 0 0 1 0
~~~
となり、正しく動作していることが分かる。
この先編集中
DirtectX11でゲーム制作をしてみよう:その①「セットアップ編」

# はじめに
DirectXってゲーム業界では結構使われている部分がありますが、学んでみようと思うと結構難しい・・・。
インターネットで調べると初期化などは結構乗っていますが、その先に進んでみたいと思うと資料ないんですよね。
私もDirectXは初期化回り、基本的なことは学んでその先に進もうと思ったら頭に？が浮かびまくりましたね（笑）。
なので、一通り学んだけどゲームとしてはどうやって作っていくんだろう？というのをわかりやすく？書いていこうと思います。
#対象
一応DirectXの知識がなくても何とかはなりますが、初期化回りや基本的なことを学んでいる人向けに書いていきます。
三角形を描画できる人なら問題ないと思います。
#環境
・DirectX11
・Visual Studio Community 2019
#ゲーム画面を表示してみよう
この記事では一からプログラミングを組んでいくわけではありません。あらかじめMicrosoftさんが用意してくれているフレームワークを使用していきます。
皆さんはXNAというC#のフレームワークをご存じですか？知らない人は一度検索してみてください。これから使用するのはC++のXNAのようなものです。
では、準備を進めていきましょう。
まずは下記のURLからテンプレートをダウンロードします。
赤線で囲ってある部分のVS 2017/2019 VSIXをクリックしてください。

[DirectXTK 基本的なゲームループ](https://github.com/microsoft/DirectXTK/wiki/The-basic-game-loop "Github")

![コメント 2020-02-23 140137.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482043/451d20ed-56bb-f976-0e72-236ed9b37b90.jpeg)

URLに飛ぶといろいろ書いてあると思いますが、DirectXTKというもはすでにいろいろ用意してある便利なものという認識でとりあえずは問題ないです。
ダウンロードした後は起動させてセットアップをしてください。
完了したらプロジェクトを作っていきましょう。
Visual Studioを起動させ、「新しいプロジェクトを作成」を選択します。
テンプレート「はDirect3D Win32 Game」を選択し、名前を決めてプロジェクトを作成しましょう。
![コメント 2020-02-23 140719.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482043/5c5e9297-7619-3ac9-91ef-7e61c6c78923.jpeg)

新しいユニバーサルWindowsプラットフォームと出たらターゲットバージョン、最小バージョンは画像の通りにします・

![コメント 2020-02-23 141123.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482043/5d8d1b25-265e-308a-5a87-169a33a4c1d7.jpeg)


このテンプレートはDirectX11の初期化回りをすでにやっているもので、ゲームをすぐ作れる状態になっています。
プロジェクトが作れたらF5を押して実行してみましょう。青い画面が出たら成功です。

![コメント 2020-02-23 141428.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482043/4e9ab33b-080e-15f3-0093-82a1e9f721b0.jpeg)

XNAをやっていたものとしてはすごく懐かしい画面ですね・・・（笑）
っとはい！これで今回の目的を達成しました！次回は一通りのクラス、メソッドの説明とこのゲーム制作の要となる「DirectXTK」をプロジェクトに導入し、画像を動かしてみましょう。

#あとがき
実は先ほどのURLにDirectXTKの使い方やセットアップの方法などが載っています。英語ですが、翻訳をかけると普通に読めます。なのでおそらくこのセットアップが終了した人はそこから使い方を学ぶのが一番かと思います（笑）
実際公式の人が書いているのでわかりやすいかと・・・。
それでも記事は続いていくので心の広い方は読んでいただけると嬉しいです！
では、また次の記事でお会いしましょう。
Laravel プロジェクトに郵便番号データ、都道府県、市区町村データを簡単に作成する

Laravel プロジェクトに郵便番号データ、都道府県、市区町村データを簡単に作成するライブラリを作成しました。

Github
[https://github.com/ShibuyaKosuke/laravel-postalcode-japan](https://github.com/ShibuyaKosuke/laravel-postalcode-japan)

# laravel-postalcode-japan

[郵便番号データ](https://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip)を取り込んで住所マスタを作成します。

## Install 

```
composer require shibuyakosuke/laravel-postalcode-japan
```

## Setup

マイグレーションを実行します。

```
php artisan migrate
```

postal_codes, cities, prefectures テーブルが作成されます。

```
php artisan postalcode:update
```

を実行すると、自動的に[郵便番号データ](https://www.post.japanpost.jp/zipcode/dl/kogaki/zip/ken_all.zip)をダウンロードし、
各テーブルにデータを投入します。同じコマンドを再度実行しても、cities, prefectures のデータは updateOrCreate() で更新されます。

## Usage

あらかじめルートが設定されており、`ajax/prefectures/` にアクセスすると都道府県の一覧、`ajax/cities/{prefecture}`
にアクセスすると市区町村の一覧をJSONデータで取得することができます。
Scannerを用いた入力内容の取得(Java)

#Scannerとは
コンソールに値を「入力」し、その値をプログラム内で使用するための外部ライブラリです。
この記事では、文字列を受け取る方法と、数値を受け取る方法について記述します。

##文字列で受け取る方法について
文字列で受け取る手順は以下になります。

1. ライブラリの読み込み
1. Scannerの初期化
1. 入力内容を受け取るための処理

###ライブラリの読み込み
Scannerを利用するためには外部ライブラリを読み込むための記述が必要になります。
まず、class定義より上にimport java.util.Scanner;の記述を追加します。

```Main.java
import java.util.Scanner;

class Main {
  public static void main (String[] args) {
    System.out.print("名前： ");
  }
}
``` 
###Scannerの初期化

次に、Scannerを初期化するために、Scanner scanner = new Scanner(System.in);の記述を追加します。
new Scanner(System.in)でScannerを初期化し、変数scannerに代入しています。

```Main.java
import java.util.Scanner;

class Main {
  public static void main (String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("名前： ");
  }
}
``` 
###入力内容を受け取るための処理
最後に、String name = scanner.next();の記述を追加します。
scanner.next()と記述することで、変数nameに入力された文字列を代入できます。

```Main.java
import java.util.Scanner;

class Main {
  public static void main (String[] args) {
    Scanner scanner = new Scanner(System.in);
    System.out.print("名前： ");
    String name = scanner.next();
    System.out.println("こんにちは" + name + "さん");
  }
}
``` 

##数値で受け取る方法について
数値で受け取る手順についても以下の手順になりますが、文字列で受け取る手順と共通部分があるため、1と2は省略します。

1. ライブラリの読み込み
1. Scannerの初期化
1. 入力内容を受け取るための処理

###入力内容を受け取るための処理
以下のファイルに数値で受け取るための記述を追加していきます。
(手順1、2を終えた状態です)

```Main.java
import java.util.Scanner;

class Main {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    
    System.out.print("年齢：");
    
    System.out.print("身長(m)：");
    
  }
}
```

年齢の値を受け取るために、
int age = scanner.nextInt();
の記述を追加します。
文字列で受け取る手順との相違点としてnextInt()と記述することで、データ型を指定しています。
なお、文字列で受け取るときに、nextString()などと記述するとエラーになるので注意です。

```Main.java
import java.util.Scanner;

class Main {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    
    System.out.print("年齢：");
    int age = scanner.nextInt();
    
    System.out.print("身長(m)：");
    double height = scanner.nextDouble();

  }
}
```
今日のpython error:  HTTPError: 404 Client Error: Not Found for url: 

```
# pip install python3-requests
Collecting python3-requests
Exception:
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/usr/lib/python2.7/dist-packages/pip/commands/install.py", line 353, in run
    wb.build(autobuilding=True)
  File "/usr/lib/python2.7/dist-packages/pip/wheel.py", line 749, in build
    self.requirement_set.prepare_files(self.finder)
  File "/usr/lib/python2.7/dist-packages/pip/req/req_set.py", line 380, in prepare_files
    ignore_dependencies=self.ignore_dependencies))
  File "/usr/lib/python2.7/dist-packages/pip/req/req_set.py", line 554, in _prepare_file
    require_hashes
  File "/usr/lib/python2.7/dist-packages/pip/req/req_install.py", line 278, in populate_link
    self.link = finder.find_requirement(self, upgrade)
  File "/usr/lib/python2.7/dist-packages/pip/index.py", line 465, in find_requirement
    all_candidates = self.find_all_candidates(req.name)
  File "/usr/lib/python2.7/dist-packages/pip/index.py", line 423, in find_all_candidates
    for page in self._get_pages(url_locations, project_name):
  File "/usr/lib/python2.7/dist-packages/pip/index.py", line 568, in _get_pages
    page = self._get_page(location)
  File "/usr/lib/python2.7/dist-packages/pip/index.py", line 683, in _get_page
    return HTMLPage.get_page(link, session=self.session)
  File "/usr/lib/python2.7/dist-packages/pip/index.py", line 795, in get_page
    resp.raise_for_status()
  File "/usr/share/python-wheels/requests-2.18.4-py2.py3-none-any.whl/requests/models.py", line 935, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
HTTPError: 404 Client Error: Not Found for url: https://pypi.org/simple/python3-requests/
docker-composeでRails6開発環境

[docker-composeでRails5.2開発環境](https://qiita.com/lumbermill/items/f5d04035753c1ea4c3e1)に続いて、Rails6の環境も作ってみます。5.2から移行してくるとyarnとwebpackerがなかなか最初はややこしく感じます…。最下部に理由を書いていますが、alpine版のイメージをベースにしています。

必要なファイルは2つです。

```yml:docker-compose.yml
version: '3'
services:
  db:
    image: postgres
    volumes:
      - ./postgresql/data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: "secret"
  web:
    build:
      context: .
      dockerfile: docker-web
    command: "rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/railsapp
    ports:
      - "3000:3000"
    depends_on:
      - db
```

```dockerfile:docker-web
FROM ruby:2.6-alpine

RUN apk update && apk add libxml2-dev curl-dev make gcc libc-dev g++ nodejs \
  postgresql-client postgresql-dev tzdata yarn \
  && gem install rails -v "~> 6" -N

RUN mkdir /railsapp
WORKDIR /railsapp
# 後で有効化します
# COPY . /railsapp
# RUN bundle install && yarn install
```

まずは以下の手順で新しいプロジェクトを生成します。

```bash
docker-compose build
docker-compose run web rails new . --database=postgresql --skip-git
```

その後、上記Dockerfile内の最後の2行を有効化します。

```
COPY . /railsapp
RUN bundle install && yarn install
```

データベースの接続設定も修正が必要です。

```yml:railsapp/config/database.yml
host: db
username: postgres
password: secret
```

以下のコマンドを実行します。

```bash
docker-compose build
docker-compose up
```

あとは、いつもの手順でrailsの開発が開始できます！以下はデータベースを作成するコマンドです（`docker-compose up`をしたのと別のターミナルを立ち上げて実行します）。

```bash
docker-compose exec web rails db:create
```

![Screen Shot 2020-02-23 at 13.45.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50780/9163937f-c18e-328f-117b-fadd510d65c3.png)

```bash
docker-compose exec web rails g scaffold post title:string body:text published:boolean
docker-compose exec web rails db:migrate
```


## ハマりどころ
`ruby:2.6`や`ruby:2.7`のイメージを使ってみたところ、yarnのバージョンが適合せず動作しなかったため（下記エラー）、`ruby:2.6-alpine`イメージを使用しています。軽量さが特徴のようですが、逆に言うと、何か追加のgemを入れるたびにOS側のパッケージ追加が必要になるのが大変そうです…。

```
ArgumentError: Malformed version number string 0.32+git
```

初回の`bundle install`がかなり重たいのに、この手順だと2回それが走ることになり、待ち時間が長いです。もし最初から使える`Gemfile`が手元にあれば、それをrailsappに置いた状態でスタートすると速いです（公式の手順などで案内している方法）。

ある時点から？postgresqlのイメージがパスワードなしでは立ち上がらなくなりました（上記のサンプルは対応ずみのものです）。

```
PG::ConnectionBad
could not translate host name "db" to address: Name does not resolve
```

### 参考URL

- [Dockerを使って「Rails / PostgreSQL」の開発環境を作ろう！](https://opiyotan.hatenablog.com/entry/rails-tips-docker-development)
ModuleNotFoundError: No module named 'requests'。今日のpython error 

【Webスクレイピング】Qiitaのキーワード検索結果をいいね順にソート
https://qiita.com/h_no/items/b0f62fef31462035a31c

を動かしてみようとした。

Python Webスクレイピング テクニック集「取得できない値は無い」JavaScript対応@追記あり6/12
https://qiita.com/Azunyan1111/items/b161b998790b1db2ff7a

Python Webスクレイピング 実践入門
https://qiita.com/Azunyan1111/items/9b3d16428d2bcc7c9406




apt update; apt -y upgrade;  apt install vim wget python3 python-pip sudo apt-utils

```
# python3 qiitas.py
Traceback (most recent call last):
  File "qiitas.py", line 1, in <module>
    from requests.exceptions import ConnectionError, TooManyRedirects, HTTPError
ModuleNotFoundError: No module named 'requests'
```

pip install python3-requests

# 文書履歴(document history)
ver. 0.01 初稿 20200223
ver. 0.04 URL追記　20230305

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
#GoogleChrome で Cookie / セッション / LocalStorage のデータなどを確認・削除するダイレクトURLはこちら

localhost の データを削除する場合

chrome://settings/cookies/detail?site=localhost&search=site+data

GoogleChromeのアドレスバーに上記のURLを入力する

ここで削除したいデータのバツボタンを押していけば削除できる
たまに画面リロードしないと削除ボタンが効かないことがある

![image](https://user-images.githubusercontent.com/13635059/75085584-21336000-556e-11ea-9d91-816cf2c3fb23.png)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【VSCode】Code Runner+wslで一発コードテスト

VSCodeの拡張機能[Code Runner](https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner)を使うとショートカット（Ctrl+Alt+N）あるいはボタン一発でソースコードのコンパイルから実行までをやってくれる。
Windows用VSCode上のwsl（ubuntu）でC++で書かれたソースコードを実行するための、Code Runnerの設定について備忘録を残しておく。wsl、VSCodeの環境構築はできている前提。
同じ環境ができている方は[4.まとめ](#4まとめ)の記述をsettings.jsonにコピペすればok。
# 1.出力先をターミナルに変更する
初期状態では実行結果が「出力」に出るため、標準入力が使えない。
settings.jsonに以下の設定を追加すると出力先がターミナルに変更される。
```"code-runner.runInTerminal": true,```
規定のシェルがコマンドプロンプトになっている人はここまででok。
# 2.wsl用にディレクトリの書式を変更
C++で書かれたコードに対してCode Runnerを実行すると
```cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt```
というコマンドが既定のシェルで実行される。パラメーターの意味は以下の通り。
　　```$dir```:ソースコードのあるディレクトリ
　　```$fineName```:ソースコードのファイル名
　　```$fineNameWithoutExt```:ソースコードのファイル名から拡張子を除いたもの
この時初期設定では```$dir```がwindowsの書式（c:\foo\bar）になってしまう。そのため規定のシェルがコマンドプロンプトなどであれば以上の設定で使えるが、wslを使っている場合はC++を動かせない。
そこで```"code-runner.terminalRoot":"/mnt/"```
をsettings.jsonに書き込むと```$dir```がLinuxの書式になって実行できるようになる。

# 3.その他設定
## 3-1.コマンドの詳細設定
code-runner.executorMapをsettings.jsonに書き込むと、Code Runnner実行時のコマンドは書き換えることができる。この設定は言語ごとに行う。cとc++では以下の通りに書く（初期設定そのまま）。

    "code-runner.executorMap": {
        "c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
        "cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",
    }

コードテストのために使いたいので、ファイル名は`a.out`に統一し実行時には`./`を付け加えれば次の通り。

    "code-runner.executorMap": {
        "c": "cd $dir && gcc $fileName -o a.out && ./a.out",
        "cpp": "cd $dir && g++ $fileName -o a.out && ./a.out",
    }

## 3-2.実行後すぐにターミナルにフォーカスする
初期設定ではCode Runnerを実行してもエディタがフォーカスされたままだが、settings.jsonに以下の記述を加えると実行後自動的にターミナルがフォーカスされる。
```"code-runner.preserveFocus": false,```
何度も同じサンプルでテストしたいときに便利。

# 4.まとめ
settings.jsonに次のように記述すればよい。

    "code-runner.executorMap": {
        "c": "cd $dir && gcc $fileName -o a.out && ./a.out",
        "cpp": "cd $dir && g++ $fileName -o a.out && ./a.out",
    },
    "code-runner.runInTerminal": true,
    "code-runner.preserveFocus": false,
    "code-runner.terminalRoot": "/mnt/",

# 参考
[Code Runner - Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner)
Railsで間違えて作成したcontrollerやmodelを削除する方法

railsでプログラミングをするにあたって、間違えてcontrollerを作成してしまうことが僕はたまにあります。一文字間違えとか、あるあるです。

僕の場合はコントローラーの作成にこういったミスをするとどうしたらいいかわからなくなって、一からアプリケーションを作り直すということをプログラミングを学び始めの時などはやっていたりしました。

この方法を知って「なんて便利なんだ」と感動した覚えがあるので、備忘録もかねて残しておこうと思います。

#controllerやmodelを間違えて作成した時の対処法
方法はシンプルかつ簡単です。例えばusers controllerを削除したいときは、。

```
rails destroy controller users
```

User modelを削除したいときも同じように

```
rails destroy model user
```

とすることで間違って作成したものを削除することができます。参考になれば幸いです。