OmniAICreator/Qiita-1.07M huggingface dataset:
Windows10が再起動する理由を探る

Windows10を起動したままにしておくと自動で再起動しているので以下のサイトを参考に原因を探る。
https://ascii.jp/elem/000/002/001/2001809/

なお、PowerShellは管理者権限で起動すること。

## 起動の時間帯を確認
```
 Get-WinEvent -Path C:\Windows\system32\winevt\Logs\System.evtx -FilterXPath "Event/System[EventID=12 and Provider[@Name='Microsoft-Windows-Kernel-General']]" | Select-Object RecordID,TimeCreated,Id,Message | Sort-Object RecordID

メモ：12を13とすればシャットダウンのタイミングを確認できる
```
## 再起動の理由を確認
```
Get-WinEvent -Path C:\Windows\system32\winevt\Logs\System.evtx -FilterXPath "Event/System[ (EventID=1073 or EventID=1074) and Provider[@Name='User32']]"
```
## Windowsアップデートの確認
```
Get-WinEvent -Path C:\Windows\system32\winevt\Logs\System.evtx -FilterXPath "Event/System[ (EventID=19 or EventID=43 or EventID=44) and Provider[@Name='Microsoft-Windows-WindowsUpdateClient']]"

結果：
   ProviderName: Microsoft-Windows-WindowsUpdateClient

TimeCreated                     Id LevelDisplayName Message
-----------                     -- ---------------- -------
2020/06/11 17:46:20             44 情報             Windows Update は更新プログラムのダウンロードを開始しました。
2020/06/11 17:46:20             44 情報             Windows Update は更新プログラムのダウンロードを開始しました。
2020/06/11 17:46:00             19 情報             インストールの成功: 次の更新プログラムが正しくインストールされました: 2020-06 x64 ベース システム用 Wi...
2020/06/11 17:46:00             19 情報             インストールの成功: 次の更新プログラムが正しくインストールされました: 2020-06 x64 ベース システム用 Wi...

```
AWS WAF Referer制限ってなに？

####前置き
毎日AWSについてまとめてみようシリーズ7日目です。
初学者ですが温かい目で見守ってください。(もちろん間違いは指摘お願いします)

#そもそもReferer制限ってなに？
**Referer(リファラ)**とは簡単に言うと、今見ているページを見る直前に見ていたページのURLのこと。
SEO対策する時には必須の知識らしいです。

よってReferer制限の意味は、**直前に開いていたサイトに応じてアクセスを制限する**という意味になります。

#WAFってなに？
WAFはWeb Application Firewallの略で、検出パターンを設定することで、ウェブサイトとウェブサイト利用者との間の通信の内容を機械的に検査することができます。([Wikipediaより](https://ja.wikipedia.org/wiki/Web_Application_Firewall))

WAFで検出するものは**HTTP通信(リクエスト、レスポンス)**です。そのHTTP通信に基づいて、通信をそのまま通過させたり、遮断したり、エラーを出したりします。
例えば、HTTPリクエストにはリクエスト発信元の情報が入っています。それを利用すると、WAF側で設定して、発信元が日本だった場合は通信を遮断させるなんてことも可能になるわけです。

#AWS WAFってなに？
AWS WAFはAmazon CloudFrontなどに転送されるHTTPおよびHTTPSリクエストをモニタリング可能にするウェブアプリケーションファイアウォールです。簡単にAWSで使えるWAFって感じでいいと思います。

もちろんリクエストに含まれる情報(=リクエスト発信元の国、リクエストの文字列など)に応じたコンテンツへのアクセス制限もできます。

#AWS WAFの基本動作3選
**指定したリクエスト以外のすべてのリクエストを許可する**
特定の攻撃者からのリクエストを排除するときに利用します。

**指定したリクエスト以外のすべてのリクエストをブロックする**
制限されたウェブサイトを作りたい時に利用します。
例 :  日本国内以外からのアクセスは出来ないようにしたい。

**指定したプロパティに一致するリクエストをカウントする**
テスト用。全てのアクセスを拒否するようになっていないか確認するために使うことがあります。確認した後はリクエストを許可または拒否するように動作を変更できます。

#まとめると AWS WAF Referer制限とは
HTTPリクエストに含まれている情報である直前に閲覧していたページのURLに基づいて、自分のサイトへのリクエストを制限すること。

外部リンクから自分のサイトに置いてあるファイルをダウンロードされたくない時とかに使うみたい。

#最後に
ここまで見てくださってありがとうございます。

参考
https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/what-is-aws-waf.html
https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/distribution-web-awswaf.html

※公式ドキュメント以外の記事などは練習のため基本的には読まないようにしています(個々の分からない単語はもちろんググります)。
fish_user_paths を config.fish で設定するな

fish shell の使い方について調べると、`$fish_user_paths` を使うのが "fisher way" である（fish ユーザー的に良い書き方である）ことがしばしば紹介されています。

```sh
set -U fish_user_paths /usr/local/bin $fish_user_paths
```

`$fish_user_paths` を使うメリットとしては、ここで一度内容を設定すれば、自動的に今開いているセッション及び将来開くセッション全ての `$PATH` に永久的に設定が保存されるという点です。

逆に言えば、`$fish_user_paths` を `~/.config/fish/config.fish` で設定しては**いけません。** `config.fish` は fish 起動時に毎回呼び出されるので、もし `$fish_user_paths` を `config.fish` で修正してしまうと、毎回 fish 起動時に `$PATH` に新しい内容が追加されてしまい、`$PATH` がどんどん長くなっていってしまいます。

`config.fish` で書くべきなのは、以下のようなコマンドです。

```sh 
set -x PATH /usr/local/bin $PATH
```

<br>

参考: https://fishshell.com/docs/current/tutorial.html#path

> The advantage is that you don't have to go mucking around in files: just run this once at the command line, and it will affect the current session and all future instances too. (Note: you should NOT add this line to config.fish. If you do, the variable will get longer each time you run fish!)
何気なく使っていたaxiosを初心者向けにまとめてみる

こんにちは、主にReactでWEBサービスを作っています。
何気なく使っているREST-APIを使っての通信を簡単に行える、[axios](https://github.com/axios/axios)を復習という意味合いでまとめました。

## axiosとは？
- ブラウザからのXMLHttpRequestsを作成できる
- node.jsからhttpリクエストを作成できる
- promiseAPIをサポートしている
- リクエストとレスポンスを受け取り、データを変換できる
- リクエストをキャンセルしたり、カスタマイズできる
- jsonデータを自動変換してくれる

## 環境構築
### インストール
```npm install axios```
```yarn add axios```
### CDN
```
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
```

## 読み込み

```js
const axios = require('axios').default;
```
ES6のモジュールインポートなら

```js
import axios from 'axios'
```

## 通常のリクエスト
###GET
APIのURLを指定

```js
axios.get('http://localhost:3333/api/users')
```
### POST

APIのURLと送りたい値を指定

```js
axios.post('http://localhost:3333/api/users',{
  name: 'test'
})
```

### 成功、失敗の切り分け
また、上記らはpromiseが使えるので、下記のようにレスポンスを元に、
成功、失敗でのコールバックも指定できる

```js
axios.post('http://localhost:3333/api/users',{
  name: 'test'
})
.then(response => {
 console.log(response)
})
.catch(error => {
  console.log(error)
})
```
### 詳細に設定を渡してリクエスト

```js
axios({

//URL ※必須
  url: '/api/users'

//メゾット ※指定しないとデフォルトでget
  method: 'get',

//ベースURL
//urlオプションが絶対パスでない場合、先頭につくURL
  baseURL: 'http://localhost:3333',

//カスタムヘッダー
//受け取る側、送る値の形式に合わせて変更
  headers: {
    'Content-Type': 'application/json'
  },

//パラメーター
//urlオプションでもつけれるがオプションとしても存在する
//下記で送ると　http://localhost:3333/api/users?ID=999
  params: {
    ID: 999
  },

//bodyとして送信する値
//PUT, POST, DELETE, 'PATCH'で適用可能
  data: {
    name: 'test'
  },

//リクエストしてから中止するまでの時間
  timeout: 2000,

//サーバーが応答するファイルを指定 
//デフォルトがjson あんまり変えることはない
  responseType: 'json',

//ステータスコードによって、Promiseでresolveかrejectを返すかを分岐できる
//trueでresolve、falseでrejectを返す
//下記はdefault
  validateStatus: status => status >= 200 && status < 300,

//HTTPBasic認証を使う場合に記載
//今時つかうことはないと思う
  auth: {
    username: 'test',
    password: 'testtest'
  },
})
```
ほかにもあるのですが、使うかなというのはこれくらいかと思います。
ちなみに認証で```Bearer tokens```を使いたい場合は下記として下さい

```js
headers: { 'Authorization': `Bearer ${token}` },
```


## レスポンス
axiosによってAPI通信して返ってくるのはオブジェクトです。
用途によって、そのオブジェクトの中身を取得することになります。

```js
axios.get('http://localhost:3333/api/users')
  .then(response => {
    console.log(response)
  })

//下記がresponseの中身

{
  // サーバー側で明示的に指定したデータが入ってくる。
  //こちらを使って、viewを更新したりする。
  data: { 
    name: 'test',
    id: 999
  },

  // HTTPリクエストした結果のステータスをコードで表す
  //200 = success、404 = not found　など
  status: 200,

  // HTTPリクエストした結果にまつわるメッセージ
  statusText: 'OK',

  // コンテンツタイプやキャッシュ制御などの各種の状態を示す情報が入れられている部分
  headers: {},

  // axiosで設定している値
  config: {},

  // リクエストとして送った情報
  request: {}
}
```

オブジェクトなので、```response.date```のようにとりだしてあげましょう

さらに応用部分は[こちら](https://qiita.com/natuuu0831/items/2601dc9ade7e31bf2317)にまとめてますのでよかったらみてください
Android デバイスの現在地情報を変更するアプリケーションサンプル


# 概要
Androidデバイスの現在位置を変更するアプリケーションのサンプルです。
(Androidエミュレータの場合には Android Studioから変更できますが、実機でも欲しかった)

* このアプリケーションは Bluetooth を使用し、位置情報を受け付けます。受信した位置情報へ現在位置を変更します。
* 位置情報の送信はデスクトップアプリケーションやAndroidアプリケーションでもいいのですが、ここでは ```Web Bluetooth API``` を使用してブラウザから行います。
* ```Google Maps API``` を使用しています。

※ 最後の2点については試してみたかっただけです。
※ Bluetooth を使用したのは adb 用に USB を空けておきたかったからなのですが、wireless接続ができることを忘れてました..

# リポジトリ
https://github.com/kakizaki/fakeLocationProviderBLE

## 構成

### Android アプリケーション
```ACCESS_MOCK_LOCATION``` パーミッションを付加。開発者設定から「仮の現在地情報アプリを選択」に本アプリを選択する必要がある。

BLE ペリフェラル。BLE セントラルから位置情報を受信する。
位置情報は、緯度、経度、高度、水平精度。

受信した位置情報を基にして、1秒毎に ```LocationManager.setTestProviderLocation``` を行う。

### web ページ
BLE セントラル。BLE ペリフェラルへ位置情報を送信する。

マップをダブルクリックするとクリックした位置の位置情報を送信する。


# 動作の様子

logcat に ```Google Play Services Location API``` から取得した位置情報を出力しています。

![fake_location_privider_demo_.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16480/08cd596b-35f5-f72d-fa6c-83fc2d6f936a.gif)

Androidデバイスで Google Mapアプリを起動していれば、位置情報が変わることを確認できると思います。


# 参考

以下のページを参考にしました。

* [Androidで現在地情報を偽装する](https://qiita.com/misoca12/items/d55a3991d3b03fdb9c45)
* [AndroidをBLEペリフェラルにしよう](https://qiita.com/poruruba/items/f74c447dd61be26b4ac2)
* [Web Bluetooth APIでBLE通信](https://tech.pfq.jp/blog/985/)

Google Map 以外は、掲載されているソースコードそのままだったりします。
(そのままで動作してしまったので😅)

ありがとうございます。


# 感想

```Web Bluetooth API``` はまだ experimental だと思いますが、ブラウザからAndroidデバイスと通信できることはおもしろい体験でした。

# 追記

https://github.com/kakizaki/MockLocationServer

BLEをやめて、Androidデバイス側でwebサーバーを立てるようにしました。

位置情報の変更は web api で提供しています。

curl等を使用して、PCからAndroidデバイスへリクエストすることで変更できます。
digitaljs その4

# 概要

digitaljsやってみた。
8bitシフトレジスタ、書いてみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/6df2051d-be2c-e507-ba5d-b27c08ce3ce4.png)

# サンプルコード


```
module sr8(input _in, clk, output _out);
    reg b1;
    reg b2;
    reg b3;
    reg b4;
    reg b5;
    reg b6;
    reg b7;
    reg b8;
    assign _out = b8;
    always @(posedge clk)
    begin
        b8 <= b7;
        b7 <= b6;
        b6 <= b5;
        b5 <= b4;
        b4 <= b3;
        b3 <= b2;
        b2 <= b1;
        b1 <= _in;
    end
endmodule

```

以上。
チェックデジット　とは


#<h3>1.目的

現場で調べる機会があったので覚え書きついでに記事にしました。
今後も覚えたことを単語区切りで記事にしていきたいと思います。

#<h3>2.今回やること

チェックディジットってなんだっけ？を簡単におさらいできる内容にまとめる。

#<h3>3.チェックディジットとは


IT用語辞典には次のように書かれていました。
>チェックディジットとは、数字列の誤りを検知するために付加される検査用の数字のこと。また、そのような数字を用いた誤り検出方式。バーコードや銀行の口座番号などに利用されている。


#<h3>4.特徴

・データがおかしくないかチェックするための値です。
・元のデータに追加でくっつけてある数字や記号のことです。
・どうして違う値になってしまったのかまではわかりません。

#<h3>5.チェックディジット算出方法

またまたIT用語辞典から引用すると次の算出方法が代表的みたいです。
ちなみに私が現場で見たチェックディジットもおそらくは同じ算出方法でした。
>最もよく用いられる方式は、各桁の値に一定の規則に従った係数を乗じた値の和を求め、それを定められた係数で割った余りを末尾に付加する方法である。

下の画像は13桁のJANコードのチェックディジットの計算方法です。
※JANコード：商品識別コード、バーコード規格のひとつ。EANコードって呼ばれたりもする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527590/cdf2ca4e-0003-773a-59d7-28e1c8a43a8f.png)


#<h3>6.まとめ

チェックディジットとってなんだったっけかな～？となった時は、
「データがおかしくないかチェックするための値か」
ぐらいは思い出せるように記憶にとどめておきたいと思います。

調べているうちに「Luhnチェックも似たようなことしてたな～」なんてふと思ったのでついでに軽く検索してみると、Luhnチェックもチェックディジットのひとつでした。
機会があればLuhnチェックについても触れていきたいと思います。


#参考
・チェックディジット計算方法
https://www.dsri.jp/jan/check_digit.html

・IT用語辞典
http://e-words.jp/w/%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%83%87%E3%82%B8%E3%83%83%E3%83%88.html
digitaljs その3

# 概要

digitaljsやってみた。
フリップフロップ、書いてみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/018a49fc-1820-0d47-30df-c4ff9e56c3a2.png)

# サンプルコード


```
module rs_ff(input s, r, output q, o);
    assign q = ~(r | o);
    assign o = ~(s | q);
endmodule
```

以上。
AzureDataFactoryにExcelデータセットが登場

## ADFをいじっていたら見つけました


**Excel 使えるようになってる！**

思わず勢いそのままつぶやく
<img width="447" alt="01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/bc9dd0d8-8c32-9c97-5833-cdd34971b956.png">



## 早速使ってみた

### 手順

1. Datasetを作成します。
<img width="309" alt="02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/8a223f3f-eda2-bb6b-f9c8-fc5f908c2d38.png">

2. Excelを置いたStorageのあるLinked Serviceを選択して、Excelを選択します。
<img width="459" alt="03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/58323a3f-5744-4c3d-c18c-8b64fa756d03.png">

3. ファイル、シートを選びます。
<img width="469" alt="04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/49106dde-8cf4-4d79-701a-6497ac6b16b5.png">

4. データセットができあがります。
<img width="641" alt="05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281819/6758c2b7-2193-e23b-e8e1-9f2f6322d671.png">

5. あとはCopy ActivityでDBに書き込むもよし、型を変換してParquetにして保存するもよしです

## 所感

Twitterでご質問をいただき「Excel 内のSheetのリストを取得するにはどうするか」を検証しましたが、現時点では難しそうでした。※Sheet名自体に変数を利用することは可能なので、Sheet"n"など、規則があればループも可能です。
ただし、公式DocsのほうもまだExcelに関する記載がないので、なにかいい感じの変数があるのかもしれません。
updateに期待です
digitaljs その２

# 概要

digitaljsやってみた。
全加算器、書いてみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c69b95b7-cb1f-54d0-f8e4-939c05585d07.png)

# サンプルコード

```
module ha(input a, input b, output o, output c);
  assign o = a ^ b;
  assign c = a & b;
endmodule

module fa(input a, input b, input d, output o, output c);
  wire t, c1, c2;
  ha ha1(a, b, t, c1);
  ha ha2(t, d, o, c2);
  assign c = c1 | c2;
endmodule
```

以上。
play-json-extensions 0.42.0 の not found: value encoder エラー

Play-Jsonで、case classのフィールド数が22を超えると `Format` オブジェクトの自動生成ができなくなる。そんなときに使えるやつ。

https://github.com/xdotai/play-json-extensions

でも、

```scala
case class Bar(
  s: String,
  i: Int
)

object Bar {
  implicit lazy val format: Format[Bar] = Jsonx.formatCaseClassUseDefaults[Bar]
}
```

このコードは `Jsonx.formatCaseClassUseDefaults` に必要な暗黙パラメータがないということでエラーでる。

```
[error] xxx/src/main/scala/sample/Bar.scala:13:75: could not find implicit value for parameter encoder: ai.x.play.json.NameEncoder
[error]   implicit lazy val format: Format[Bar] = Jsonx.formatCaseClassUseDefaults[Bar]
```

ちなみに、0.40.x系ではこのエラーはでない。というか `NameEncoder` というトレイト自体存在しない。

とりあえずBarのコンパニオンオブジェクトに `NameEncoder` 型implicit変数を定義してやると

```scala
object Bar {
  implicit val jsonxNameEncoder: NameEncoder = CamelToSnakeNameEncoder()
  implicit lazy val format: Format[Bar] = Jsonx.formatCaseClassUseDefaults[Bar]
}
```

暗黙パラメータがないエラーは消えるけど、謎エラーでる。

```
[error] xxx/src/main/scala/sample/Bar.scala:13:75: not found: value encoder
[error]   implicit lazy val format: Format[Bar] = Jsonx.formatCaseClassUseDefaults[Bar]
```

ここでないと言われている `encoder` というのは、マクロが生成しているコード内で参照されている変数で、どうも、`NameEncoder` 型変数は `encoder` という名前でなければいけないっぽい。ええ・・・、こんな一般的な名前の変数をスコープ内に・・・？

```scala
object Bar {
  implicit val encoder: NameEncoder = CamelToSnakeNameEncoder()
  implicit lazy val format: Format[Bar] = Jsonx.formatCaseClassUseDefaults[Bar]
}
```

いちおう、これでOK。
digitaljs

# 概要

digitaljs、やってみた。
半加算器、書いてみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/72d9ea64-002e-1bfd-1559-abd23619ad2d.png)

# サンプルコード


```
module ha(input a, input b, output o, output c);
  assign o = a ^ b;
  assign c = a & b;
endmodule

```

以上。
Strong Parameterについて

# StrongParameterとは
Web画面上から入力された値を安全に受け取る仕組みです。
ストロングパラメータを実装する目的は、Webブラウザ上で意図的にパラメーターを書き換えられた際に、エラーとして弾くことができるようにするためです。
このように、書き換えられたくないカラムが書き換えられてしまうことをマスアサインメント脆弱性といいます。
要するにストロングパラメータは、このマスアサインメント脆弱性の対策です。

## 使用例

```ruby:samples_controller.rb
def create
  Sample.create(params[:sample])
  redirect_to new_sample_path
end
```

create(params[:sample])とすることで、sampleテーブルのカラム情報をまとめて渡すことができます。
これをマスアサインメントといいます。

しかし、このやり方にはセキュリティ上の問題があります。params[:sample]は、「sampleに紐づくパラメータであれば、何でもcreateメソッドに渡してしまう」ということです。

そこで、ストロングパラメータを使用します。
ストロングパラメータは、送られてきたパラメータを取得する際に、「何を許可するか」を指定します。

つまり、予め使用するパラメータを指定しておくことで、予期せぬパラメータを取得してしまうことを防ぎます。

```ruby
params.require(:sample).permit(:title)
```

上記のコードは、sampleキーのtitleのみ取得を許可します。

```
"sample"=>{"title"=>"hello", "content"=>"world"}
```

パラメータは上記のように送られてくるので、このtitleの値だけを取得します。
上記のように設定することで、「hello」などの文字列だけがアクションの内部に入ることができ、もしそれ以外の値が何か入っても、すべて削ぎ落とすようになっています。

## 使用方法
実際に先ほどのコードに追記すると、以下のようになります。

```ruby:samples_controller.rb
def create
  Sample.create(params.require(:sample).permit(:title))
  redirect_to new_sample_path
end
```

## まとめ

Strong Parameterとはセキュリティのために、予め受け入れるデータを指定する機能のこと
Rails5.2のcredentialsの使い方

皆様こんばんは。
暑いですね。
風が強いですね。
なかなかカリキュラムが進まないですね。

さぁ今回はcredentialsの使い方！！！
rails5.2以上に導入された機能みたいですね。

#1.まずcredentialsとはなんぞや！！

皆様気になってますよね。
credentialsは簡単に言うと

###「チーム開発をしていて、パスワードなどgithubにpushしたくない内容を保管しておいてくれる場所」

(語彙力皆無)

もっと簡単に言うと
###「外部に漏らしたくない値を保管しておく場所」
(これでどうだ！？)

って感じですね。

とりあえずイッテミヨウ！！！！

#2.アクセスの仕方

見てる方「おいおい直接vs codeからいじれるんちゃうんかい！！」

そんなツッコミ大歓迎です。
まず設定がひつようなんですYO!!

#コマンド+pで
<img width="1155" alt="bc90bb723ad7d6a1f74c38295bfc0cf3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596765/aabc076a-fa82-f46f-64f1-8587b5a57e9e.png">

これでVS CODEでいじれる様になったデェ

#3.いじっちゃおうZE!

VS CODEから直接アクセスしても訳わからんコードしか有馬店。
なので

```ターミナル:コンソール
EDITOR='code --wait' rails credentials:edit
```

すると<img width="883" alt="スクリーンショット 2020-06-11 19.29.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596765/5c601586-3854-d468-9cc7-f5ba0d1eb651.png">

こんな感じで表示されます。
vs codeに飛ばされます。

#4.どうやって保存すれば良いだんYO!!

全世界のあなた必見よ。
まず先ほどの画像を説明すると。

```vscode:credential
aws:←キー
 access_key_id: 123
    ↑　　　　　　　↑
キーの中のキー　　　値
```
簡単に言うとこんな感じで
(語彙力皆無2)

取り出し方は

```ターミナル:ターミナル
Rails.application.credentials[:aws][:access_key_id]
```

簡単でしょ？ヘイヘイ。

そんで登録し終わったらvs codeで右上の❌をクリックすれば戻れます。
(credentialsをいじっている最中は他のディレクトリをいじれないので注意！！）

これで平和に重要な値を管理だぜ！！！！

次回もシクヨロです。
SAS 変数定義 dataステップ

SASの変数定義についてのメモ
変数の型や変数長、フォーマット等を指定できる

SQLプロシジャなどでも変数の型や変数長、フォーマット等を指定できるが、ここではdataステップでの方法を紹介する

# attribステートメント
length,label,formatなどを同時に指定可能

```sas
data xxx;
  attrib
    変数1 length = $10 label = "aaaaa"
    変数2 length = $20 label = "bbbbb"
    変数3 length = 8
    変数4 length = 8   format = time5.
    変数5 length = 8   label = "eeeee" format = yymmdd10.
  ;
...
run;
```

などと指定

# lengthステートメント
文字数値の設定や長さの設定するだけなら、こっちの方が楽

```sas
data xxx;
length 変数1 8 変数2 $50;
...
run;
```
で、変数1は数値変数、変数2は長さ20の文字変数

# arrayステートメント
配列定義のときに、新規変数を定義可能

```sas
data xxx;
array AAA[10] $1111 VAR1 - VAR10;
...
run;
```
など


# 変数の順番だけ変えたいときは

```sas
data xxx;
  format 変数1 変数2 ...;
  set xxx;
run;
```

https://support.sas.com/documentation/cdl_alternate/ja/lestmtsref/68024/HTML/default/n1wxb7p9jkxycin16lz2db7idbnt.htm
https://support.sas.com/documentation/cdl_alternate/ja/lestmtsref/68024/HTML/default/p08do6szetrxe2n136ush727sbuo.htm
SASによるxptファイルとsasデータセットの変換

xptファイルをSASデータセットに変換する
SASデータセットをxptファイルに変換する
SASのcopyプロシジャを使用

# 準備

```sas
libname SAS "SASデータセットのパス";
libname XPT xport "XPTファイルのパス\xptファイル名.xpt";
```

xptファイル名までをlibnameで指定していることに注意
また、xptには変数名の長さなど制限あり

# sas→xpt

```sas
proc Copy in = SAS out = XPT memtype = data;
  select SASデータセット名;
run;
```

# xpt→sas

```sas
proc Copy in = XPT out = SAS memtype = data;
  select xptファイル名;
run;
```

https://documentation.sas.com/?docsetId=proc&docsetTarget=p0wpwv5w54k35gn11y3rpqusf5s3.htm&docsetVersion=9.4&locale=en#p0wpwv5w54k35gn11y3rpqusf5s3
SPSS ModelerのフィルターノードをPythonで書き換える。フィールドのフィルタリングまたは名前の変更

SPSS Modelerで列を絞り込んだり、列名を変更するフィルターノードをPythonのpandasで書き換えてみます。

# 1.加工のイメージ
以下のデータのUP_TIMEとERR_CDの列を削除し、
「M_CD」という列名を「MCD」に、「POWER」という列名を「VOLT」に変更します。

■加工前

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/403b2da3-bcfd-da0f-c4eb-0eeba39f51cd.png)

■加工後

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ac904a34-5d8f-fe3c-012b-4a35c5492539.png)

# 2.　Modelerフィルターノードでの指定
削除したい列に×のチェックをいれ、変更したい名前を右のフィールド名の欄に書きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a9be8f06-0ba1-cac6-bfd4-f24942446526.png)

# 3. pandasで書き換える
列の選択はいくつかありますが、第一には下のようにリストで残したい列名を列挙する方法があります。

``` python
df1=df[['M_CD','POWER','TEMP']]
````

また、削除したい列を指定するというdropというメソッドもあります。こちらの方がModelerのフィルターのイメージに近いかもしれません。

``` python
df1_1=df.drop(['UP_TIME','ERR_CD'],axis=1)
```

どちらの方法でも以下のような結果が返ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/8fb4b418-73ee-e940-2998-26e10dea5d6e.png)

次に列名の変更はrenameというメソッドが使えます。変更前と変更後の列名のセットをディクショナリで与えます。

``` python
df2=df1.rename(columns={'M_CD': 'MCD', 'POWER': 'VOLT'})
```
以下のような結果が返ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/6ca3f3f0-f3e4-3d60-1b37-dda030ff26b5.png)

# 4. サンプル
サンプルは以下に置きました。

ストリーム
https://github.com/hkwd/200611Modeler2Python/raw/master/filternode/FilterNode.str
notebook
https://github.com/hkwd/200611Modeler2Python/blob/master/filternode/FilterNode2.ipynb
データ
https://raw.githubusercontent.com/hkwd/200611Modeler2Python/master/data/Cond4n_e.csv

■テスト環境
Modeler 18.2.1
Windows 10 64bit
Python 3.6.9
pandas 0.24.1

# 5.参考サイト
pandasのインデックス参照で行・列を選択し取得 | note.nkmk.me 
https://note.nkmk.me/python-pandas-index-row-column/
pandas.DataFrameの行名・列名の変更 | note.nkmk.me 
https://note.nkmk.me/python-pandas-dataframe-rename/
ExcelとPHPとJavaScriptの数値丸めの話

# はじめに

システム開発の仕事をしているとお客様からExcelの計算式で仕様を渡されることがあると思います。
え、ないですか？　私は最近あったんですよ。
んで、なんの変哲もない数式ならいいのですが、`ROUND` `ROUNDUP` `ROUNDDOWN` 関数が入ってきたときにどうしたもんかなって話です。

# 置き換えよう

`ROUND` `ROUNDUP` `ROUNDDOWN` は下記の感じで対応しています。

|丸め方|Excel|PHP|JavaScript|
|---|---|---|---|
|四捨五入|ROUND(値, 丸める桁数)|round(値, 丸める桁数, 丸めモード)|Math.round(値)|
|切り上げ|ROUNDUP(値, 丸める桁数)|ceil(値)|Math.ceil(値)|
|切り捨て|ROUNDDOWN(値, 丸める桁数)|floor(値)|Math.floor(値)|

こうしてみると、**JavaScriptが一番融通がきかない**のがわかります。。。
PHPのround関数は丸めモードを変えることによって四捨五入を五捨六入にしたりもできます。日本人で五捨六入したい人はちょいちょい居ますけど、外国の案件でも需要があったりするんでしょうか？

# そもそもExcelに `ceil` と `floor` はないの？

実はあるのですが、引数がだいぶ違います。

* [CEILING 関数](https://support.microsoft.com/ja-jp/office/ceiling-%e9%96%a2%e6%95%b0-0a5cd7c8-0720-4f0a-bd2c-c943e510899f?ui=ja-jp&rs=ja-jp&ad=jp)
* [FLOOR 関数](https://support.microsoft.com/ja-jp/office/floor-%E9%96%A2%E6%95%B0-14bb497c-24f2-4e04-b327-b0b4de5a8886)

第２引数が「基準となる倍数」とか言ってて、若干ピンとこないですよね。
かなり柔軟な丸めができるのでしょうけど、実用的かと言われると微妙な気がしますね。
Microsoft Power Query M 学習記録

Microsoft Power Query Mの学習記録です。主にM言語です。

# この投稿の方針

- 糖衣構文である`each ...`は可能な限り使いません。元の表現`(_) => ...`を使います。

# Windows 10でPower Query Mを試す

Windows 10ではMicrosoft StoreからPower BI Desktopが無償でダウンロードできます。Power Query Mはこのソフトウェアで試せます。

- [Power BI Desktop—対話型レポート | Microsoft Power BI](https://powerbi.microsoft.com/ja-jp/desktop/)

1. Power BI Desktopの起動後、アプリケーション上側のリボン→「データを取得」の下矢頭→「空のクエリ」でPower Query Mがクエリエディタが起動します。
1. 単一行の場合は数式に記入します。複数行の場合は上側のリボンから「詳細エディタ」をクリックします。

# 公式ドキュメント

- [Power Query M 数式言語のリファレンス - PowerQuery M | Microsoft Docs](https://docs.microsoft.com/ja-jp/powerquery-m/)

# `List.Generate`関数の概要

`List.Generate`は他の言語の`for`文に該当する関数です。

```plaintext
List.Generate(
    initial as function,
    condition as function,
    next as function,
    optional selector as nullable function) as list
```

`as function`が繰り返されるので複雑に感じますが、要は次の`for`文です。

```cpp:c++
std::vector<std::any> v;
for (const auto& _ = initial(); condition(_); next(_))
{
    v.push_back(selector != nullptr ? selector(_) : _);
}
```

# 整数のリストを作成する

[リストの特別な整数シークエンス表現](https://docs.microsoft.com/en-us/powerquery-m/m-spec-values#list)と`List.Generate`関数が利用できます。

```plain:1ずつ増加する整数の範囲
{0..100}
```

`each ...`は`(_) => ...`の糖衣構文です。[https://docs.microsoft.com/en-us/powerquery-m/understanding-power-query-m-functions](https://docs.microsoft.com/en-us/powerquery-m/understanding-power-query-m-functions)のEach Keywordをご覧ください。

```plain:1ずつ増加する整数の範囲
List.Generate(() => 0, (_) => _ <= 100, (_) => _ + 1)
```

```plain:5ずつ増加する整数の範囲
List.Generate(() => 0, (_) => _ <= 100, (_) => _ + 5)
```

```plain:1ずつ減少する整数の範囲
List.Generate(() => 100, (_) => _ >= 0, (_) => _ - 1)
```

```plain:5ずつ減少する整数の範囲
List.Generate(() => 100, (_) => _ >= 0, (_) => _ - 5)
```

# リストを変形する

`List.Transform`関数を使います。

```plain:全要素に2を乗じる
List.Transform({0..100}, (_) => _ * 2)
``````

```plain:型のリストを得る
List.Transform({0, 1, 2, "a", "b", "c"}, (_) => Value.Type(_){0})
```

```plain:整数から"偶数"と"奇数"のリストを得る
List.Transform({0..10}, (_) => {"偶数","奇数"}{Number.Mod(_, 2)})
```

# リストを選択する

```plain:偶数のみ選択
List.Select({0..100}, (_) => Number.Mod(_, 2) = 0)
```

```plain:奇数のみ選択
List.Select({0..100}, (_) => Number.Mod(_, 2) = 1)
```

```plain:テキスト型のみ選択
List.Select({0, 1, 2, "a", "b", "c"}, (_) => Value.Type(_) = type text)
```

```plain:数値型のみ選択
List.Select({0, 1, 2, "a", "b", "c"}, (_) => Value.Type(_) = type number)
```

# リスト、レコード、テーブルの変形と選択

|型|変形|選択|
|:--|:--|:--|
|List|Transform|Select|
|Record|TransformFields|SelectFields|
|Table|TransformColumns<br>TransformRows|SelectColumns<br>SelectRows<br>SelectRowsWithErrors|

# リストを列としたテーブルを作成する

```
let
    List1 = {0..10}
in
    Table.FromColumns(
        {
            List1,
            List.Transform(List1, (_) => {"偶数", "奇数"}{Number.Mod(_, 2)})
        },
        {"リスト", "偶奇"}
    )
```
LIRCインストールから受信テストまで備忘録2020

# 00 LIRC is なに
RaspberryPiなどで赤外線を送受信するために作られたデーモン。
めちゃくちゃ仕様が変わるので悪名めっちゃ高い。(~~だから私はwiringPi~~)

# 01 環境
- Raspberry Pi ZeroW
- 赤外線リモコン受信モジュールOSRB38C9AA

# 02 LIRCをインストール(2020年6月現在)
LIRCをインストールします。
(raspberryPi$はターミナルの部分)

```bash
raspberryPi$ sudo apt update
raspberryPi$ sudo apt upgrade
raspberryPi$ sudo apt install lirc
```
`/boot/config.txt`の５１行目を以下のように変更
(ここが以前との変更点らしく、私含め詰まっている人が多く見受けられました。)

```bash:/boot/config.txt
# Uncomment this to enable the lirc-rpi module
dtoverlay=gpio-ir,gpio_pin= inputに使いたいGPIOピン番号
dtoverlay=gpio-ir-tx,gpio_pin= outputに使いたいGPIOピン番号
```
ここで一旦再起動(serviceのrestartでいいとは思いますが念の為)

```bash
raspberryPi$ ls -l /dev/lirc*
crw-rw---- 1 root video 252, 0  6月 20 0:23 /dev/lirc0
crw-rw---- 1 root video 252, 1  6月 20 0:23 /dev/lirc1
```
再起動して、上のコマンドを実行すると、無事ここまでの設定が完了しているかわかります。
このlirc0は送信用で、lirc1は受信用です。

次に以下のコマンドを実行してみてください

```bash
raspberryPi$ lsmod | grep gpio
pio_ir_recv           16384  0
gpio_ir_tx             16384  0
```
このようになっていればLircがgpioピンを使う準備ができています。

# 03 リモコンの信号を受信するテスト
先ほど設定したinput用のGPIOピンを赤外線受信モジュールにつなぎます。
今回使ったモジュールではこのような繋ぎ方でした

|RaspberryPi側|モジュール側(受信部分が自分に向いている状態)|
|:------------:|:-------------------------------------:|
|input用GPIO|左|
|GND|中央|
|3.3V|右|

## 受信テスト

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

```
raspberryPi$ mode2 -d /dev/lirc1
```
するとボタンを押すたびに数値が画面に表示されます。

受信テストも終わったところでirrecordコマンドを用いて送信用ファイルを生成するのですが、部屋の環境が悪いせいか、うまく記録してくれないのでうまくいき次第記事にします。

# 04 参考
[LIRC-ArchWiki](https://wiki.archlinux.jp/index.php/LIRC)
[Raspberry Pi Zero で赤外線リモコンを作る](https://qiita.com/ww24/items/32d2a78c20e6dcc2e68c)
[Raspberry Pi 3 Model B+とlircを使ってリモコンをコントロールする 1](https://qiita.com/s_ponta/items/0ad51f3642de4bad1a62)
僕はね、voidが戻りの関数を三項演算子みたいに使いたかっただけなんだ

こんなクラスがあって

```csharp
class Test
{
    public void Kill()
    {
        Console.WriteLine("kill you baby!");
    }

    public void Death()
    {
        Console.WriteLine("kill me baby!");
    }
}
```

こんな風に呼び出してる時

```csharp

static void Main(string[] args)
{
    var test = new Test();
    var trigger = true;

    if (trigger)
    {
       test.Kill();
    }
    else
    {
       test.Death();
    }
}
```

if-elseを一行にできないかな？と思っていて

```csharp
static void Main(string[] args)
{
    var test = new Test();
    var trigger = false;

    (trigger ? (Action)test.Kill : test.Death)();
}
```

ってやったらできた気がするけど
何で左だけキャストが必要なのかは分からん
HTTPリクエストを投げて、レスポンスを受け取る vbscript

#[Excel郵便番号住所変換](https://qiita.com/granpa/items/a86ea18a77ef08e8749d)のHTTPリクエストをVBScriptで書いてみた
関連
[ExcelのVBAでYahoo!路線情報からHTMLを取得して運賃を取得してみる](https://qiita.com/granpa/items/c0a06011654b40bd6e16)
[Excel 郵便番号→住所変換　MSXML2.XML HTTP.3.0](https://qiita.com/granpa/items/a86ea18a77ef08e8749d)

#VBSCriptだけで書いてみる
[BASP21](http://www.hi-ho.ne.jp/babaq/basp21.html)を使った処理は書いた事があるが、標準機能だけで書いてみる。

[サンプルはこれを使わせてもらいました。](https://necoyama3.hatenablog.com/entry/20090424/1240592349)

改造は２点
１．一時ファイル名UUID化する。
２．バイナリ→テキスト変換はFunctionで完結する

#UUIDの取得
[VBSCriptの一時ファイル名取得(GetTempName)は重複](https://www.toyfish.blog/entry/20040507/p1)が発生して、痛い思い出がある。その時の解決策は別であったが、今回はUUIDを使ってみた。[これでも完全ではないらしい](https://www.330k.info/essay/create_uuid_vba/)
[UUID v4って規格？](http://www.ietf.org/rfc/rfc4122.txt)があるようで、同じ内容のサンプルが幾つかみつかったが今回は[こちら](http://chris.wastedhalo.com/2013/01/generate-valid-version-4-uuids-with-aspvbscript/)を参考にした。

#バイナリ→テキスト変換はFunctionで完結する
バイナリ情報を一時ファイルに書き込み、読み出しでテキスト変換するそうです。
この一時ファイル名を固定にしたくなかったので、UUIDを使ってみました。

```
'************************************************************
'関数ID ：binReadTextAll
'説明   ：バイナリデータをテキストで返す
'			responseText は、euc か utf-8 のページの場合 unicode として変換されます
'			Shift_Jis は、responseBody でいったんバイナリ保存してから、読み込む
'戻り値 ：バイナリデータのテキスト
'************************************************************
Function binReadTextAll(binData)
	Dim objFSO    											'ファイルシステムオブジェクト
	Dim oStream    											'ADODB.Streamオブジェクト
	Dim strTempFolder   									'一時フォルダ名
	Dim strTempFile     									'一時ファイル名
	Dim resStream    										'テキストストリームオブジェクト

	Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

    strTempFile = objFSO.GetSpecialFolder(2)				'2:TemporaryFolder 特殊フォルダ 
    'strTempFile = strTempFile & "\"& objFSO.GetTempName()	'一時ファイル名 GetTempName では重複する場合がある
    strTempFile = strTempFile & "\"& UUID()				'一時ファイル名 
	
	Set oStream = CreateObject("ADODB.Stream")				'一時ファイルへバイナリデータを書き込む
	oStream.Open
	oStream.Type = 1                            			' バイナリ
	oStream.Write binData
	oStream.SaveToFile strTempFile
	oStream.Close

	Set resStream = objFSO.OpenTextFile(strTempFile, 1)		'一時ファイルから読み出す
	binReadTextAll = resStream.ReadAll
	resStream.Close
	objFSO.DeleteFile strTempFile							'一時ファイル削除
	
	Set resStream = Nothing
	Set oStream = Nothing
	Set objFSO = Nothing
End Function
```
#HTTPリクエスト
```VBScript:HTTPリクエスト
' 参考先 https://necoyama3.hatenablog.com/entry/20090424/1240592349
'************************************************************
	Dim oXMLHTTP   ' MSXMLオブジェクト
	Dim resData    ' レスポンス

	Set oXMLHTTP = CreateObject("MSXML2.XMLHTTP.3.0")
	oXMLHTTP.Open "GET", URL, False                              ' FALSE:同期処理
	oXMLHTTP.Send                                                ' 受信

	If oXMLHTTP.Status = 200 Then
		resData = binReadTextAll(oXMLHTTP.responseBody)
		MsgBox resData
	Else
		resData = "Error returnCode:" & oXMLHTTP.Status
		MsgBox resData
	End If

	set oXMLHTTP = nothing
```

こんなテキストが取得できました。
![VBSHTTP2020061101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/646883/d627afbd-9dbe-2e03-c71a-cc0c4a91eea0.png)


[物忘れ防止 VBScript MSXML2.XMLHTTP.3.0.vbs ](https://github.com/sugita0301/douzo)
[Nuxt] Nuxtを使ってグラフ（vue-chart.js）をインタラクティブに操作してみた

#1 はじめに
vue-chart.jsを使ってグラフをインタラクティブに操作することをやってみたので，その概要です．完成目標は下記の感じのようになります．
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/460757/9e5fad38-6287-399d-8716-f3b195eacac0.gif)

参考：
https://qiita.com/Sa2Knight/items/fe9cf2373e5c73a3a678

#2 インストール
今回使うモジュールをインストールします．*私はNuxtを使っているが別にVueのみを使ってもできるので，そっちがいい場合はそれにしてください．ちなみに，vuetifyを利用．

```bash
npx npx create-nuxt-app [プロジェクト名]
```
このコマンドを打つと色々聞かれると思いますが，各自適当に入力してください．


```bash
 npm install  chart.js vue-chartjs --dev
```
グラフを描くためのモジュールをインストールします．


#3　実装

## 3.1 グラフの実装
この記事で使うグラフはレーダーチャートを使います．特に理由もないので，これは好きなように変えてください．
最初に行うことはこのレーダーチャートをグローバルコンポーネントで利用できるようにすることです．nuxtではこれをpluginsで書くことで可能になります．単一のVueではmain.jsで記述すれば大丈夫かと思います．

```plugins/chart/rader.js
import Vue from "vue";
import { Radar, mixins } from "vue-chartjs";
const { reactiveProp } = mixins;

Vue.component("rader-chart", {
  extends: Radar,
  mixins: [reactiveProp],
  props: {
    options: {
      type: Object,
      default: () => {}
    }
  },
  mounted() {
    this.renderChart(this.chartData, this.options);
  }
});
```
グローバルにするにはnuxtのconfigを修正する必要があります．

```nuxt.config.js
  plugins: [
    {
      src: "@/plugins/chart/rader.js",
      //ssr:false この部分は記述してもどっちでもいい
    }
  ],
```

以上でグローバルで適用可能となります．

## 3.2　テンプレートの実装
```lauout/default.vue
<template>
  <v-app>
    <v-row class="ma-auto">
      <v-col md="6">
        <div class="rader">
          <rader-chart :chart-data="chartData" :options="{}"></rader-chart>
          <div>
            <v-row>
              <v-col md="6" v-for="(n,idx) in 6">
                <v-subheader class="pl-0">{{sliderHeaderTexts[idx]}}</v-subheader>
                <v-slider v-model="data[idx]" thumb-label="always" step="0.01" :max="1" :min="0"></v-slider>
              </v-col>
            </v-row>
          </div>
        </div>
      </v-col>
    </v-row>
  </v-app>
</template>
```
- rader-chartでグローバルにグラフを適用
- v-sliderで値を変更 thumb-labelで値を可視化 v-rowで横に二つ並ぶ

続いて，script

```lauout/default.vue
<style scoped>
.rader {
  width: 400px;
  max-height: 300px;
}
</style>
<script>
export default {
  data() {
    return {
      chartData: {
        labels: ["数学", "古典", "現代", "英語", "政治", "統計"],
        datasets: [
          {
            label: "hoge",
            data: [0.1, 0.2, 0, 0.5, 0.1, 0.4],
            borderWidth: 1
          }
        ]
      },
      data: [0.1, 0.2, 0, 0.5, 0.1, 0.4],
      sliderHeaderTexts: ["数学", "古典", "現代", "英語", "政治", "統計"]
    };
  },
  watch: {
    data() {
      this.updateChartData();
    }
  },

  methods: {
    updateChartData() {
      const newChartData = Object.assign({}, this.chartData);
      newChartData.datasets[0].data.forEach((value, idx) => {
        // 変更がある場合
        if (value !== this.data[idx])
          newChartData.datasets[0].data[idx] = this.data[idx];
      });

      this.chartData = newChartData;
    }
  }
};
</script>
```
- watchでsliderの値の変更を監視．変更点はリストにすることで変数一個一個を監視可能
- chartDataの中身は変更があった値を代入


以上です．

#4 終わりに
今回はnuxtを使ってrader-chartをインタラクティブに操作する方法についての記事を書きました．少し首を傾げるところはforEach文の変更があった場所のみを代入するところでした．この適用事例はrader-chartだけでなく，他のグラフでも適用可能だと思うのでぜひやってみてください！！！
[光-Hikari-のPython]05章-09 制御構文（for文とwhile文の使い分け）

#[Python]05章-09 その他～for文とwhile文の使い分け～
ここまで、制御構文の繰り返し構文として、for文とwhile文を使用してきました。
この2つについては処理の内容が同じであることを確認しました。for文からwhile文への書き換えも前節で触れました。

しかし、このfor文とwhile文は使い分けることができます。今回はその使い分けについて触れてみます。

##決まっていない回数の繰り返しにはwhile文を使用する
例えば、**「ある鍋にコップ10杯の水を入れてください。」**と言われたら、水を10杯入れることがわかっています。しかし、**「ある鍋にいっぱいになるまで、このコップで水を入れてください」**と言われたらどうでしょう？その時点で何杯の水を入れればよいかは事前にわかりません。

このように予め**回数がわかっていなかったり、回数を決めないで**繰り返し処理を書く際にはwhile文が適しています。

例えば、以下のプログラムでその例を見てみましょう。
プログラムの内容としては以下の通りです。
<font color="3333ff">
「クラスの生徒のテスト点数の**合計点**と**平均点**を求めるプログラムを作成します。ただし、クラスの生徒の人数はクラスごとに代わるため、何人いるかはわかっていません。点数を順番に入力していき、マイナスの値が入力されたらそれまでの合計点と平均点を求めるプログラムを作成します。なお、点数は100点満点とします。」
</font>

<font color="#00cccc">chap05</font>の中に、<font color="#00cccc">samp05-09-01.py</font>というファイル名でファイルを作成し、以下のコードを書いてください。

```samp05-09-01.py
i = 1  #iはクラスの人数
total = 0 #クラスの合計点をtotalに加算していく
score = 0 #生徒の点数

while score >= 0:
    total += score
    score = int(input(f'{i}人目の点数を入力してください（点数は100点満点です。負の値の入力で処理終了）：'))
    i += 1

i -= 1 #人数が1人多いため1人分減らします
print(f'合計点：{total}')
print(f'平均点：{total/i}')
```

＜samp05-09-01.py実行結果＞
><font color="#090" bgcolor="black">【実行結果】</font>
1人目の点数を入力してください（点数は100点満点です。負の値の入力で処理終了）：90
2人目の点数を入力してください（点数は100点満点です。負の値の入力で処理終了）：75
3人目の点数を入力してください（点数は100点満点です。負の値の入力で処理終了）：83
4人目の点数を入力してください（点数は100点満点です。負の値の入力で処理終了）：-1
合計点：248
平均点：62.0

プログラムの内容については特に問題ないかと思います。これを見ると、クラスには何人いるかどうかがわからないため、処理開始時点では1人として、それを1人ずつ加算していっています。
ただし、while文を抜けた時点では、人数が1人増えているので、1を減らしています。

##最後に
for文とwhile文の使い分けについてわかりましたでしょうか？人数や処理回数がわからないのに繰り返し構文を使うことはよくあります。
よく使う技術なので、ぜひ押さえておきましょう。

###[【目次リンク】へ戻る](https://qiita.com/ko0821/items/379e8bd9e6ea01089419)
python 入門

#python入門

自粛期間もあり、自分のスキルの棚卸しなど含めて、業務に使っているスキルを復習ということで基礎から学習していこうと思います。

## 環境構築

環境構築はvenvで環境構築をつくり、仮想環境で開発環境を整えます。


作業ディレクトリを作成

```
mkdir [作業ディレクトリ]
```

作業ディレクトリ内で仮想環境を作ります。

```
cd [作業ディレクトリ]
```

仮想環境を作成

```
python3 -m venv　[任意の名前]
```

### active

仮想環境に入る

```
source [任意の名前]/bin/activate
```

仮想環境に入ることが出来たと思うのでPythonのVersionを確認します。
正常に動作していればVersionが表示されます。

```
python -V
Python 3.7.3
```

開発環境が出来たので次回からはPythonの文法について学習していこうと思います。
Nuxt.jsでローディングアニメーションを設定する方法

Nuxt.jsでページ読み込み時などに独自のローディングアニメーションを設定する方法です。

## Loadingコンポーネントを作成する
まずは、ローディング時にアニメーションさせたいコンポーネントを作成します。

```vue:Loading.vue
<template>
  <div v-if="loading" class="loading">
    <div class="loading__loader">Loading...</div>
  </div>
</template>

<script lang="ts">
import Vue from "vue";
export default Vue.extend({
  name: "Loading",
  data() {
    return {
      loading: false
    };
  },
  methods: {
    start() {
      this.loading = true;
    },
    finish() {
      this.loading = false;
    }
  }
});
</script>

<style lang="scss" scoped>
.loading {
  position: fixed;
  top: 0;
  left: 0;
  bottom: 0;
  right: 0;
  width: 100vw;
  height: 100vh;
  z-index: 9999;
  transition: all 1.2s ease;
  background: rgba(255, 255, 255, 0.5);
  &__loader {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    font-size: 18px;
  }
}
</style>

```

`start()`ルートが変更されたときに呼び出されるメソッド。
`finish()`ルートがロード（及びデータ取得）されたときに呼び出されるメソッド。
上記の2つは必ず設定する必要があります。

他にも任意のメソッドで`fail(error)`、`increase(num)`があり、ロードができない時の処理もおこなえます。

## nuxt.config.jsでローディングコンポーネントを読み込む

```js:nuxt.config.js
module.exports = {
 loading: '~/components/Loading.vue',
}
```

nuxt.config.jsで作成したローディングコンポーネントを読み込むことで、独自で作ったコンポーネントをローディングアニメーションとして設定できます。
rails×Docker導入でのエラー①[docker-compose: command not found]

必要なファイルを作成して、いざrails new

```
[***MacBook-Pro:docker_sample]$ docker-compose run web rails new . --force --no-deps --database=postgresql --skip-bundle
-bash: docker-compose: command not found
```

なぜに？？？

調べたところ、Dockerをインストロールをしていないのが悪いとのこと。

参考記事
http://it-knowledge.tank.jp/docker-insall/

あれ？ちゃんとしたはずなのに、、、

立ち上げてみたところ、
「ログイン」しないと意味がなかったです！！

・Dockerアプリをインストロール
・アプリを立ち上げてログイン

この上で、再度コマンドを入力すれば問題ありませんでした！
SSL,TLSとは何か

##初めに
SSL,TLSとはなにかを学習したので自分のアウトプット用に記そうと思う

##SSL/TLSとは
SSL(Secure Sockets Layer)とTSL(Transport Layer Security)は,インターネット上でデータを暗号化して送受信をする仕組み.
SSL/TLSを使用してないとデータの暗号化がされないため,ハッカーなどがデータを送受信する際に,クレジットカードなどの情報を盗まれてしまう.
###SSL/TLSの役割
・通信の暗号化
　　「共通鍵暗号方式」と「公開鍵暗号方式」を利用して通信を暗号化することによってデータを盗まれなくなる

・運営元の確認
SSL/TSL通信ではwebサイトの運営元が誰なのかをわかるようにするために,サイトを運営しているものはSSL/TLSを使用する際にSSL証明書というものを認可局から発行してもらわなければならない.
要するにサイトユーザーがサイト運営者がだれなのかをわかっていれば安心だねってことだ

##SSL/TLSの種類
大きく分けて3つある

###・ドメイン認証SSL
・低コストでデータ通信やアーカイブを安全に行う
・SSL認証もあまり手間がかからない
・フォームの送信を含まないランディングページや組織内限定サーバーなどに利用

###・企業実在認証SSL
###・EV　SSL

※製作途中
[Swift5]オシャレなボタン(角丸・影付きボタン)の作成

本記事では、__オシャレでモダンな__ボタンの作成の仕方を紹介します！
とても簡単に作成できるので、ぜひ試してみてください！

## Before
<img width="501" alt="スクリーンショット 2020-06-11 17.54.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588214/15d1c99d-4af3-264b-0ea2-28eaf0298f0d.png">

## After
<img width="501" alt="スクリーンショット 2020-06-11 17.53.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/588214/710899c0-f425-7bad-d5a4-fcefa1faa4ad.png">

ボタンの角が丸くなり、影が付いたことでオシャレになりましたね！
`ViewController.swift`上で少しのコードを書くだけで簡単に実装可能なので試してみてください！
詳しくは下記のサンプルコードを見てください！

## サンプルコード
```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {
    
    @IBOutlet var shadowButton: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 1.角丸設定
        // UIButtonの変数名.layer.cornerRadius = 角丸の大きさ
        shadowButton.layer.cornerRadius = 10
        
        // 2.影の設定
        // 影の濃さ
        shadowButton.layer.shadowOpacity = 0.7
        // 影のぼかしの大きさ
        shadowButton.layer.shadowRadius = 3
        // 影の色
        shadowButton.layer.shadowColor = UIColor.black.cgColor
        // 影の方向（width=右方向、height=下方向）
        shadowButton.layer.shadowOffset = CGSize(width: 5, height: 5)
    }
}
```
プレーンテキストとしてコピーするブックマークレット

```javascript

javascript:(()=>{const%20e=getSelection().toString();if(e){const%20t=document.createElement("textarea");t.textContent=e,document.body.appendChild(t),t.select(),document.execCommand("copy"),t.parentNode.removeChild(t)}})();
```

# 何ですか、これは？
iPhone Safariでテキストをコピーしてメモにペーストすると余計な装飾がついてきます。
このURLのリンクや太字、カラーなどいわゆるリッチテキストのフォーマットの設定は、正直言って要らないと思うことがしょっちゅうです。
そんな時に使うと、ひと手間省けて得した気分になる便利なやつです。

# 使い方
ブラウザで文字列を選択した状態で、ブックマークレットを実行します。
プレーンテキストがクリップボードに保存されるので、あとは自由にペーストして下さい。

```copyplaintext.js
(
    () => {
// ---------------------------------------------------------------
const text = getSelection().toString();
if (text) {
    // textarea
    const ta = document.createElement('textarea');
    ta.textContent = text;
    document.body.appendChild(ta);

    // select text
    ta.select();

    // copy to clipboard
    document.execCommand("copy");    
    
    // remove textarea
    ta.parentNode.removeChild(ta);
}
// ---------------------------------------------------------------
    }
)();
```

# 簡潔な説明
大体の流れは次の通りです。

1. 選択された文字列を取得する。
2. textareaを用意して、取得した文字列をそこに流し込む。
3. textareaの内容を選択する。
4. 選択した内容をクリップボードにコピーする。
5. textareaを削除する。

# テスト環境
iPhone 6s
iOS 13.4.1
Safari

# まとめ
コードは割と短く、いい感じに仕上がりました。
以上、Qiita2度目の投稿でした。
お疲れ様でした。

# 参考
次の記事にお世話になりました。
- https://qiita.com/butakoma/items/642c0ec4b77f6bb5ebcf
Devise パスワードリセットの照合プロセス - トークンはどのように照合されるのか

Rails devise でパスワードリセットを行う際のトークンの照合プロセスは次のようになっています。
掲載している devise のコードは 2020-06-11時点での Devise のマスターブランチです。


パスワードをリセットする際に、メールでトークン付きのURLが送られます。
パスワードのリセットは、次のようにコンソールで実行すると行われ、メールが送信されてトークンが生成・保存されます。

```ruby
u = User.find(XX)
u.send_reset_password_instructions
```


トークン付きのURLを開いてパスワードをリセットするフォームを送信すると、複雑なカスタマイズをしていない限り、 次の update メソッド が実行されます。
ここで `resource_params` は 次のようなパラメータ(入力値)です。

`{"reset_password_token"=>"xxx_token_xxx", "password"=>"password", "password_confirmation"=>"password"}`


```ruby
class Devise::PasswordsController < DeviseController
  # PUT /resource/password
  def update
    self.resource = resource_class.reset_password_by_token(resource_params)
    yield resource if block_given?

    if resource.errors.empty?
      resource.unlock_access! if unlockable?(resource)
      if Devise.sign_in_after_reset_password
        flash_message = resource.active_for_authentication? ? :updated : :updated_not_active
        set_flash_message!(:notice, flash_message)
        resource.after_database_authentication
        sign_in(resource_name, resource)
      else
        set_flash_message!(:notice, :updated_not_active)
      end
      respond_with resource, location: after_resetting_password_path_for(resource)
    else
      set_minimum_password_length
      respond_with resource
    end
  end
```

update メソッド ではこの `resource_params` を `reset_password_by_token` 関数 に渡して、 その中でトークンの照合を行います。

URLについていたトークンから `Devise.token_generator.digest` によってダイジェスト値が生成されます。
その値がデータベースの `reset_password_token` の値で、 それをキーにして resource を探します。

```ruby
module Devise
  module Models
    module Recoverable
      module ClassMethods

        # Attempt to find a user by its reset_password_token to reset its
        # password. If a user is found and token is still valid, reset its password and automatically
        # try saving the record. If not user is found, returns a new user
        # containing an error in reset_password_token attribute.
        # Attributes must contain reset_password_token, password and confirmation
        def reset_password_by_token(attributes={})
          original_token       = attributes[:reset_password_token]
          reset_password_token = Devise.token_generator.digest(self, :reset_password_token, original_token)

          recoverable = find_or_initialize_with_error_by(:reset_password_token, reset_password_token)

          if recoverable.persisted?
            if recoverable.reset_password_period_valid?
              recoverable.reset_password(attributes[:password], attributes[:password_confirmation])
            else
              recoverable.errors.add(:reset_password_token, :expired)
            end
          end

          recoverable.reset_password_token = original_token if recoverable.reset_password_token.present?
          recoverable
        end
```

たとえば、 token の値を ABC にしたかったら(ユーザが使用するトークンをABCにしたかったら)、 `Devise.token_generator.digest(User, :reset_password_token, 'ABC')` を実行して、 出てきた値を データベース に登録すればいいことになります。
github サブアカウントで pullした後にすること

基本天気な設定はこれを見てやる

https://qiita.com/takaaki4cards/items/6a8ef36069629257976f

1~4までやって、
いざ、 git clone をして、
5をやろうとしてその時の対処法のメモ。




> [5.アカウントBのリポジトリの設定](https://qiita.com/takaaki4cards/items/6a8ef36069629257976f#5%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88b%E3%81%AE%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E8%A8%AD%E5%AE%9A)

この部分の、

- git remote add origin

うまくいかな方のでそのメモ

エラーはこのように出る

```
fatal: remote origin already exists.
```

ので

```
$ git remote rm origin
```
を実行してから

`git remote add origin`のやつをやる

こでおk



## 参考記事
- https://qiita.com/takaaki4cards/items/6a8ef36069629257976f#5%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88b%E3%81%AE%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E3%81%AE%E8%A8%AD%E5%AE%9A
- https://qiita.com/yu-ki0718/items/3c8aae2c81ca3f82f522
Spockで強制的にエラー[Exception]を発生させる

```groovy:ServiceImpl
    def "異常系"() {
        setup:
//        service.createBody(_ as boolean) >> { throw new RuntimeException("dummy") }
        service.createBody(_) >> { throw new RuntimeException("dummy") }

        
        when:
        String testString = service.send(to, hash)

        then:
        RuntimeException e = thrown()
        e.getMessage() == expected

        where:
        testcase | to          | hash       | expected
        "test"   | "aaa@co.jp" | "testhash" | "dummy"

    }
```
IntelliJでservice.createBody(\_)の`_`の部分が黄色くなってていつも補完してたけど
`_`だけならしっかりExceptionが発生してくれる。
booleanのときは特殊なのかな？
無理やりException発生させたいときは覚えておくと便利かも
SPSS Modeler (Jython) でパラメータ指定した日付をスクリプト内で処理する

SPSS Modelerのスクリプト (Jythonベース) で、日付型のストリームパラメータの値を取得してスクリプト内で加工するときのTipsです。
日付型で作成したパラメータをスクリプト内でgetParameterValueで受け取ってみると、Jythonのjava.util.Date型だったため、java.util.Dateをdatetimeに変換する必要があります。軽くハマったので記録として残します。

例として、SPSS Modeler上で以下のようなDATE_Xという日付型のストリームパラメータを定義します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397277/131a204a-56bc-e74f-082b-f46d7c5732bf.png)

スクリプト内でdatetimeのdate型に変換するコード例です。

```python
from datetime import datetime
stream = modeler.script.stream()

# パラメータDATE_Xの値を取得
date_x = stream.getParameterValue("DATE_X")
# java.util.Date型をdatetime型に変換
date_x_trans = datetime.fromtimestamp(date_x.getTime()/1000).date()
```

SPSS画面上
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397277/a22574cc-50c3-00c9-aa3e-42e5942400bb.png)

（補足）

* modeler.sciript.stream()は、スクリプト内でSPSS Modelerストリームオブジェクトを扱うためのおまじない
* .getTime()で、java.util.Dateでのエポック時間を取得。単位はミリ秒。秒にするため```/1000```する
* .date()で、datetimeをdateに変換

参考にしたStackoverflow ： [リンク](https://stackoverflow.com/questions/7798120/how-do-you-convert-a-datetime-type-of-jython-to-java-util-date)
【技術紹介】マイクロサービス（microservice）とは？

마이크로서비스란 무엇입니까?
마이크로서비스는 소프트웨어가 잘 정의된 API를 통해 통신하는 소규모의 독립적인 서비스로 구성되어 있는 경우의 소프트웨어 개발을 위한 아키텍처 및 조직적 접근 방식입니다. 이러한 서비스는 독립적인 소규모 팀에서 보유합니다.

마이크로서비스 아키텍처는 애플리케이션의 확장을 용이하게 하고 개발 속도를 앞당겨 혁신을 실현하고 새로운 기능의 출시 시간을 단축할 수 있게 해 줍니다.

모놀리식 아키텍처와 마이크로서비스 아키텍처 비교
모놀리식 아키텍처의 경우 모든 프로세스가 긴밀하게 결합되고 단일 서비스로 실행됩니다. 따라서 애플리케이션의 한 프로세스에 대한 수요가 급증하면 해당 아키텍처 전체를 확장해야 합니다. 코드 베이스가 증가하게 되면 모놀리식 애플리케이션의 기능을 추가하거나 개선하기가 더 복잡해집니다. 그리고 이러한 복잡성으로 인해 실험에 제한을 받고 새로운 아이디어를 구현하기가 어려워집니다. 종속 관계를 이루며 긴밀하게 결합된 많은 프로세스로 인해 단일 프로세스의 실패로 인한 영향이 증가함에 따라 모놀리식 아키텍처는 애플리케이션 가용성에 대한 위험을 가중시킵니다.

마이크로서비스 아키텍처의 경우, 애플리케이션이 독립적인 구성 요소로 구축되어 각 애플리케이션 프로세스가 서비스로 실행됩니다. 이러한 서비스는 경량 API를 사용하여 잘 정의된 인터페이스를 통해 통신합니다. 서비스는 비즈니스 기능을 위해 구축되며 서비스마다 한 가지 기능을 수행합니다. 서비스가 독립적으로 실행되기 때문에 애플리케이션의 특정 기능에 대한 수요를 충족하도록 각각의 서비스를 업데이트, 배포 및 확장할 수 있습니다.

모놀리식과 마이크로서비스 비교
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579289/90d6d9f9-5622-8837-a10a-cfd683aff341.png)


모놀리식 애플리케이션을 마이크로서비스로 분할

마이크로서비스의 특징
자율성
마이크로서비스 아키텍처의 각 구성 요소 서비스는 다른 서비스의 기능에 영향을 주지 않으면서 개발, 배포, 운영하고 확장할 수 있습니다. 서비스가 해당 코드 또는 구현을 다른 서비스와 공유할 필요는 없습니다. 개별 구성 요소 간의 통신은 잘 정의된 API를 통해 이루어집니다.

전문성
각 서비스는 일련의 기능을 위해 설계되며 특정 문제를 해결하는 데 중점을 둡니다. 개발자가 시간이 지남에 따라 서비스에 더 많은 코드를 제공하여 서비스가 복잡해지면 더 작은 서비스로 분할할 수 있습니다.
~~Free~~@ Manly Sea Eagles vs Brisbane Broncos_Live StreaMs 2020

 Manly Sea Eagles vs Brisbane Broncos ? Live StreaMs 2020

<h1><a href="http://totalsportshd.com/rugby/" target="_top">CLICK HERE🔴►Sea Eagles vs Broncos</a>

<h1><a href="http://totalsportshd.com/rugby/" target="_top">CLICK HERE🔴►Sea Eagles vs Broncos</a>

<a href="http://totalsportshd.com/rugby/" rel="nofollow noopener" target="_blank"><img src="https://i.imgur.com/nU7oJaM.gif" alt=""></a>

<h1><a href="http://totalsportshd.com/rugby/" target="_top">CLICK HERE🔴►Sea Eagles vs Broncos</a>

<h1><a href="http://totalsportshd.com/rugby/" target="_top">CLICK HERE🔴►Sea Eagles vs Broncos</a>

![nrl-social-image-2019.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653801/6c485103-fe7f-1648-614c-de63d6bd37c5.jpeg)
SwiftでEurekaを使おう

swiftで簡単に入力フォームつくれないのー？って調べていたら
Eurekaというライブラリを見つけました。

早速、セットアップしていきます。

ただの技術メモなので、ご了承下さい。

まず、Swiftのライブラリ管理ツールCocoaPodsを導入します。

インストールコマンド
`sudo gem install cocoapods`

セットアップしていきます
`pod setup`

**Setup completed**と表示されれば完了です。

次にEurekaの導入です。

Teminalを起動して作成したプロジェクト先に移動して以下のコマンドを実行し、podファイルを作成します。
`pod init`

作成したpodファイルを下記のように編集します

```
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'
 
target 'EurekaSample' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  source 'https://github.com/CocoaPods/Specs.git'
  platform :ios, '9.0'
  use_frameworks!
 
  # Pods for EurekaSample
  pod 'Eureka'
end
```

編集が終わったらいよいよインストール
`pod install`

これでプロジェクトにEurekaの導入が完了しました。