OmniAICreator/Qiita-1.07M huggingface dataset:
MinGWのアンインストール手順

# はじめに

Windows10にインストールされているMinGWをアンインストールする方法について書いています。

<br>

# MinGWのアンインストール手順 

* エクスプローラーを開いて、Cドライブを開きます。<br>アドレスバーに `c:` と入力すれば開けます。

![000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614920/1ace8b9e-da52-b611-0b6d-39406d48bb41.png)
<br>

* Cドライブ直下にある `MinGW` フォルダを削除します。

![001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614920/71b83ebb-fcc2-46cf-9dd8-bf204f9a8b9d.png)
<br>

* `Windowsキー`を押して「kannkyo」（または「環境変数」）で検索し、「環境変数を編集」を開きます。

![002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614920/72660440-f984-716f-fab6-88865bb5e666.png)
<br>

* 「PATH」を選択し「編集(E)」をクリックします。

![003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614920/5f7f1b76-ebc4-7b03-8c0a-71f952da2d0c.png)
<br>

* `C:\MinGW\bin` を選択し「削除(D)」をクリックします。

![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614920/f51d8ff4-1908-f057-2c4b-5cf956e57c64.png)
<br>

* 削除されたのを確認したら「OK」をクリックします。

![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614920/846f7872-335d-7018-d684-712e0b171542.png)
<br>

* 最後に「OK」をクリックしてアンインストール完了になります。

![006.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614920/cc897930-6e39-f127-7757-d1382687eef1.png)
<br>

# MinGWのインストール手順

MinGWをインストールする方法は以下に記載しました。

[MinGWによるC言語の開発環境の構築手順](https://qiita.com/karakuri-t910/items/b98f49cb7bcdf70c0813)
ECRのイメージをプルするCodebuildをTerraformで作る

## はじめに
ECRに保存しているイメージをCodebuildで使用したかったので、その設定をTerraformでやってみました。
Terraformを使用したからといって特別なことをやっているわけではありませんが、備忘録として。

## 環境
- Terraform : 0.12.29
- Terraform aws provider : 3.3.0

## ECRリポジトリ

以下のようなECRリポジトリを作成します。
このリポジトリにCodebuildで動かすイメージを保存していきます。

```.tf
resource "aws_ecr_repository" "example" {
  name                 = "example"
  image_tag_mutability = "MUTABLE"

  image_scanning_configuration {
    scan_on_push = true
  }
}
```

公式のガイドを参考に、CodebuildからイメージをプルできるECRのポリシーを設定します。 

[AWS ECRサンプル](https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/sample-ecr.html#sample-ecr-running)

>　[アクション] で、プル専用アクションとして [ecr:GetDownloadUrlForLayer]、[ecr:BatchGetImage]、および [ecr:BatchCheckLayerAvailability] を選択します。

また、今回はCodebuildとECRリポジトリでクロスアカウントを行わないので
>　プロジェクトで CodeBuild の認証情報を使用して Amazon ECR のイメージをプルする場合は、[サービスプリンシパル] に「codebuild.amazonaws.com」と入力します。

以上を参考にTerraformでポリシーを書くとこうなります。

```.tf
resource "aws_ecr_repository_policy" "example" {
  repository = aws_ecr_repository.example.name

  policy = data.aws_iam_policy_document.example.json
}

data "aws_iam_policy_document" "example" {
  statement {

    actions = [
      "ecr:BatchCheckLayerAvailability",
      "ecr:BatchGetImage",
      "ecr:GetDownloadUrlForLayer"
    ]

    principals {
      type        = "Service"
      identifiers = ["codebuild.amazonaws.com"]
    }
  }
}

```

ECRリポジトリの設定は以上です。

## Codebuildプロジェクト

今回は、ECRからのプルを検証することが目的なのでシンプルなプロジェクトを作成します。

ECRの方でCodebuildの認証情報を用いてプルするようにしたので
`image_pull_credentials_type = "CODEBUILD"`を設定する必要があります。
特に指定しない場合、デフォルトで`CODEBUILD`が設定されるようですがここでは明示的に
設定しています。

[Terraform codebuild_project image_pull_credentials_type](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/codebuild_project#image_pull_credentials_type)

```.tf
resource "aws_codebuild_project" "example" {
  name          = "example-project"
  description   = "example-project"
  service_role  = aws_iam_role.this.arn

  artifacts {
    type = "NO_ARTIFACTS"
  }

  environment {
    compute_type                = "BUILD_GENERAL1_SMALL"
    image                       = "{ECRリポジトリー内のイメージURI}"
    type                        = "LINUX_CONTAINER"
    image_pull_credentials_type = "CODEBUILD"
  }

  source {
    type            = "GITHUB"
    location        = "{ビルドに使用するGitリポジトリのURL}"
    git_clone_depth = 1
  }
}
```

ECR側でプルを許可しているため、Codebuildのにアタッチするポリシーは
ログの作成に関わるものだけでいいみたいです。

```.tf
resource "aws_iam_role_policy" "example" {
  name = "example"
  role = aws_iam_role.this.id
  policy = data.aws_iam_policy_document.example.json
}

data "aws_iam_policy_document" "example" {
  statement {

    actions = [
      "logs:CreateLogStream",
      "logs:PutLogEvents"
    ]

    resources = [
      "*",
    ]

  }
}
```

これらの設定でECRのイメージを使用してビルドができます。

Codebuild側にもプルするために権限が必要だと思っていたのですが、
不要だったみたいです。
laravel ルーティングまとめ

#ルーティングとは
viewからリクエストされたURLと、Controller内に定義されたActionを結び付ける役割
アクセスしたアドレスに応じて対応するControllerのActionを呼び出す仕組みのことをRoutingという


#基本的なRoutingの書き方


```php
Route::get('user/news/create', 'user\NewsController@create');
```
http://XXXXXX.jp/user/ からはじまるURLを指定することになる。
user/news/create というURLにアクセスしたら NewsController の create Actionに割り当てますという意味

#ルーティングのgroup化

ルーティングの設定で Route::group を使用すると一括して定義することができるよ
主に使うものは、
・プレフィックス（URLをまとめるときに使用）
・ミドルウェア（主に認証をかけるときに使用）
だよ

下記のコードは
プレフィックスを使って同じURLを経由するroutingを一括りにして、誰が見てもわかりやすく、変更にも簡単に対処できるように整理しているよ


```php
Route::group(['prefix' => 'user'], function() {
    Route::get('news/create', 'user\NewsController@create');
    Route::get('news/edit', 'user\NewsController@edit');
});
```
PythonでABC176 Eを解く

### はじめに
昨日のABCで解けなかった[E - Bomber](https://atcoder.jp/contests/abc176/tasks/abc176_e)をやります。

### [E - Bomber](https://atcoder.jp/contests/abc176/tasks/abc176_e)
gridを二次元配列で保持すると管理が面倒なのと時間が厳しいので、$H,W$それぞれの軸で爆弾の数を管理します。
$H,W$軸でそれぞれの爆弾の数の最大値を選んで、それぞれの最大値の和を返せば正解になりそうですが、それだけだと不十分です。これだと、交差している点に爆弾がある場合に対応できていないからです。交差している点に爆弾があるときは、それぞれの最大値の和-1になります。

交差している点はdictにtupleを入れて保持します。0は爆弾が無い点、1は爆弾がある点です。

```python
from collections import defaultdict

h, w, m = map(int, input().split())

cnt_h = [0] * h
cnt_w = [0] * w
dic = defaultdict(int)

for _ in range(m):
    h_m, w_m = map(int, input().split())
    cnt_h[h_m - 1] += 1
    cnt_w[w_m - 1] += 1
    dic[(h_m - 1, w_m - 1)] += 1

max_h = max(cnt_h)
max_w = max(cnt_w)

mh = []
mw = []

for i in range(h):
    if max_h == cnt_h[i]:
        mh.append(i)

for i in range(w):
    if max_w == cnt_w[i]:
        mw.append(i)

flag = False
for i in mh:
    for j in mw:
        if dic[(i, j)] == 0:
            flag = True #0の点があるならそれが最大値になるのでbreakします。
            break
    if flag:
        break

if flag:
    print(max_h + max_w)
else:
    print(max_h + max_w - 1)
```
WordPressのログインURLを変更する方法【.htaccess】

##はじめに

WordPressのログインURLは、デフォルトでは以下のURLで共通になっていて、誰でもアクセス可能な状態になっています。

`https://hogehoge.com/wp-login.php`

ログインURLがわかってしまうと、アカウント名やパスワードの総当たり攻撃をするブルートフォースアタックによりログインされてしまう可能性があり、セキュリティ上の懸念があります。

セキュリティ上の問題はログインURLに誰でもアクセスできることにあるので、ログインURLを攻撃者からわからないものに変更しておけば、ブルートフォースアタックを受けるリスクは大きく軽減できます。

`https://hogehoge.com/wp-login.php?xxxxxxxxxx`

この記事では、WordPressのログインURLをサーバー側のファイルである`.htaccess`の編集によって変更する方法について紹介していきます。

##WordPressのログインURLを変更する方法

サーバーのドメイン直下に置かれた`.htaccess`にアクセスし、以下のコードを設置してください。
レンタルサーバーなどでは、管理画面から`.htaccess`を編集できるようになっています。

```.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^enter/?$ /wp-login.php?xxxxxxxxxx [R,L]
RewriteCond %{HTTP_COOKIE} !^.*wordpress_logged_in_.*$
RewriteRule ^dashboard/?$ /wp-login.php?xxxxxxxxxx&redirect_to=/wp-admin/ [R,L]
RewriteRule ^dashboard/?$ /wp-admin/?xxxxxxxxxx [R,L]
RewriteRule ^register/?$ /wp-login.php?xxxxxxxxxx&action=register [R,L]
RewriteCond %{SCRIPT_FILENAME} !^(.*)admin-ajax\.php
RewriteCond %{HTTP_REFERER} !^(.*)hogehoge.com/wp-login\.php
RewriteCond %{HTTP_REFERER} !^(.*)hogehoge.com/wp-admin
RewriteCond %{HTTP_REFERER} !^(.*)hogehoge.com/enter
RewriteCond %{HTTP_REFERER} !^(.*)hogehoge.com/register
RewriteCond %{HTTP_REFERER} !^(.*)hogehoge.com/dashboard
RewriteCond %{QUERY_STRING} !^xxxxxxxxxx
RewriteCond %{QUERY_STRING} !^action=logout
RewriteCond %{QUERY_STRING} !^action=rp
RewriteCond %{QUERY_STRING} !^action=register
RewriteCond %{QUERY_STRING} !^action=postpass
RewriteCond %{HTTP_COOKIE} !^.*wordpress_logged_in_.*$
RewriteRule ^.*wp-admin/?|^.*wp-login\.php /not_found [R,L]
RewriteCond %{QUERY_STRING} ^loggedout=true
RewriteRule ^.*$ /wp-login.php?xxxxxxxxxx [R,L]
</IfModule>
```

上記のコードをベースに、各自の環境に応じて変更する箇所が2つあります。

1つ目は、
`xxxxxxxxxx`の部分を任意の文字列に変更してください。(6箇所)
`https://hogehoge.com/wp-login.php?xxxxxxxxxx`がWordPressのログインURLになります。

2つ目は、
`hogehoge.com`の部分をWordPressを設置しているドメインに応じて変更してください。(5箇所)

上記のコードにより、ログインURLは以下のURLに変更されます。

`https://hogehoge.com/wp-login.php?xxxxxxxxxx`

ログインURLの変更により、`?xxxxxxxxxx`のパラメータを知らない攻撃者がアクセスした場合は、404 Not Foundになります。
deno(typescript)でインタプリタを作る

# はじめに
[Go言語でつくるインタプリタ](https://www.amazon.co.jp/Go%E8%A8%80%E8%AA%9E%E3%81%A7%E3%81%A4%E3%81%8F%E3%82%8B%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%97%E3%83%AA%E3%82%BF-Thorsten-Ball/dp/4873118220)という本を最近読みました。

この本はmonkeyと名付けられた独自言語が動くインタプリタをgoで作る本なのですが、理解を深めるためそのインタプリタをdenoで再実装をしました。
https://github.com/pokotyan/deno-monkey

そして、これをwebで実行できるようなプレイグランドにしました。
https://monkey-playground.netlify.app/
※herokuにデプロイしているのでサーバーが落ちてた場合、レスポンスが返ってくるのが遅いです
![スクリーンショット 2020-08-23 13.59.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131625/d9025156-4b5f-6c56-36f1-9ce8b98342ea.png)

# Go言語でつくるインタプリタ
この本では、字句解析 => 構文解析 => 評価 の順に実装していき最終的にツリーウォークインタプリタが完成します。構文解析で作成したASTを直接評価してくやり方です。

ASTを直接評価するのではなく、ASTからIR（中間表現）を作成し、それを実行時に仮想マシンでJITコンパイルさせるという方法は「Go言語でつくるインタプリタ」の続編の書籍である [Writing A Compiler In Go](https://compilerbook.com/) で解説しているみたいです。（勉強したい）

字句解析や構文解析ってそもそもなんぞやっていうのは[こちらの記事](https://speakerdeck.com/dqneo/how-to-make-a-compiler)がイメージが掴みやすかったです。

## 字句解析
1文字ずつソースコードを読んでいき、トークンを作っていく。マルチバイト文字には対応していない。

## 構文解析
再帰下降構文解析という方法で構文解析していきASTを作っていく。
演算子の優先順位を実現する方法がなるほどなあと思いました。（語彙力）


## 評価
作成したASTを一つずつ辿っていき、ノードが表現していることをそのまま評価する。
変数束縛、クロージャの実現の仕方がなるほどなあと思いました。（語彙力）


# 感想
- goの標準ツール以外は使うことなく、フルスクラッチで書いていくので理解がしやすい。
- インタプリタ、コンパイラの大枠を掴むとっかかりになる。
- 静的解析で何かツールを作ってみようという気になる。
- この本はコード生成などの部分はすっ飛ばしているので、次の学習としてコンパイラを学んでみたくなる。
- go言語自体の学習にもなりそう
- denoで書き換えるにあたって、goのコードをそのまま置き換えたので、ポインタ使ってるところとかは型の定義が雑になっているところがある。ちゃんとtsっぽいコードに直したい。

# 最後に
Go言語でつくるインタプリタ の本をもし勉強する際には、今回作った[プレイグランド](https://monkey-playground.netlify.app/)も利用して勉強してもらえたら嬉しいです！
Ruby　得点計算プログラム

簡易得点計算のプログラムを書いたので自分用備忘録

まずは下記コード

```ruby:qiita.rb
k,n = gets.chomp.split(" ").map{|i| i.to_i}
a = []
d = []

k.times do
  d_1,a_1 = gets.chomp.split(' ').map{|i| i.to_i}
  d.push(d_1)
  a.push(a_1)
end

num = 0
check = []


while k > 0
  if d[num].between?(1,9)
    check.push(((a[num].fdiv(n) * 100) * 0.8).floor)
  elsif d[num] >= 10
    check.push(0)
  else
    check.push((a[num].fdiv(n) * 100).floor)
  end


  if check[num] >= 80
    puts "A"
  elsif check[num] >= 70
    puts "B"
  elsif check[num] >= 60
    puts "C"
  else
    puts "D"
  end
  num = num + 1
  k = k - 1
end
```
１つめのif文は提出期限に対する点数の減点の可否をチェックしてます。
提出期限（d_1）を想定して期限ないであれば原点なし
1~9日遅れたら二割減点
10日以上は０点にしてます。

２つめのif文で最終的な点数に対する評価を４段階で返しています。

今回新しく使ったメソッドは　fdiv です。
一言で言うとto_fとほぼ同じです。

x / y.to_f
ってなるのを
x.fdiv(y)
って直しているだけ
【JavaScript】型を意識してないと、余計な時間を使うよって話

## 結論：.val()で取得した値を変数に代入した数値同士を足し算する時は文字列結合されます

### やりたい事
- テキストボックスAに任意の数値を入力する
- テキストボックスBにはDBから`MAX(id)`のデータを取得している
- テキストボックスAとテキストボックスBの値を足してテキストボックスCに出力する

### 参考
> 足し算でうまくいかないのはなぜ？
http://www.dicre.com/ols/jvs/body29.html
> parseInt
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/parseInt

### HTML

```HTML
<table>
 <tr>
  <th>テキストボックスA(ここに任意の数字を入力)</th>
  <td><input type="number" id="inputNumber"></td>
 </tr>
 <tr>
  <th>テキストボックスB(ここにDBからMAX(id)のデータを表示)</th>
  <td><input type="number" id="getId" readonly="true"></td>
 </tr>
 <tr>
  <th>テキストボックスC(ここに計算結果を出力)</th>
  <td><input type="number" id="setValue" readonly="true"></td>
 </tr>
</table>
```

### JS

イベントハンドラはkeyupとしてます

```JS
$(document).ready(function() {
 $("#inputNumber").keyup(function() {
  var getInputNumber = $("inputNumber").val();
  var getIdNumber = $("getId").val();
  $("#setValue").val(getInputNumber + getIdNumber);
 });
});
```

### 計算結果

```Js
var getInputNumber = 10
var getIdNumber = 20
getinputNumber + getIdnumber
→1020
```

!!??
文字列結合になっている...掛け算・割り算をした時には問題なく正しい計算結果を返してくれていたのに、足し算はうまくいきません

文字列には掛け算・割り算は存在しないので、暗黙の型変換が行われ、文字列を数値に変換して掛け算・割り算をしてくれますが、足し算の場合は文字列結合が当てはまってしまいます。(ご指摘頂きました。val()でテキストボックスから値を取得する場合は、基本的に文字列です。なので文字列+文字列の結果は文字列ですね…勉強になりました！)

```JS
var hoge = "私は"
var fuga = "おにぎりを食べたいです"
hoge + fuga
→"私はおにぎりを食べたいです"
```

この結果と同じく、先ほどの10 + 20 は文字列結合されて1020と返ってきます

### parseInt関数を使いましょう

```Js
$(document).ready(function() {
 $("#inputNumber").keyup(function() {
  var getInputNumber = $("inputNumber").val();
  var getIdNumber = $("getId").val();
  $("#setValue").val(parseInt(getInputNumber) + parseInt(getIdNumber));
 });
});
```
parseInt関数は文字列の引数を解析して、整数と解釈して値を返してくれます

```JS
var getInputNumber = 10
→文字列"10"
var getIdNumber = 20
→文字列"20"
parseInt(getinputNumber) + parseInt(getIdnumber)
→引数を整数"10" + 整数"20"と解析して値を返してくれる
→30
```

これで求めていた"30"という結果を得る事ができました


### まとめ
動的型付け言語(rubyやphpなど)や暗黙の型変換のおかげ(??)で、あまり型を意識せずともプログラム側がよしなにやってくれます。単純に足し算をしただけの簡単な処理を書くだけなのに、型の意識が薄く余計な時間を使ってしまったので、型を意識したプログラムを書けるようにならなければいけませんね

##### おわり
rails db:migrate時のエラーの解決

#エラーに陥った経緯
下記のマイグレーションファイルでスペルミスをしてしまい、悪いことにreferenceの部分でミスをしたのでめんどくさいことになりました(涙)。

```ruby:マイグレーションファイル.rb
    add_column :posts, :lunch_text, :text
    add_column :posts, :lunch_image, :text
    add_column :posts, :lunch_address, :string
    add_column :posts, :lunch_link, :string

    add_reference :posts, :place, foreign_key: true
    add_reference :posts, :sub_place, foreign_key: true　
#最後の行でsubplaceと入力すべきところをsub_placeとして、指定するテーブル名のスペルをまちがえてしまう。
```
スペルを間違えたのでrails db:rollbackをし書き直し、rails db:migrateを行ったところエラーに陥る。

#エラー内容
rails db:migrateした際に下記のエラーが出る

```
Mysql2::Error: Duplicate column name 'lunch_text': ALTER TABLE `posts` ADD `lunch_text` text
```
postsテーブルにlunch_textというカラムが重複していると言われているのですが
rails db:statusで確認すると当該ファイルはdownになっている。
ここで、マイグレーションファイルがdownになっているのにDBに当該マイグレーションファイルが反映されているという矛盾した状態になってしまいました。

#SQLを使用し解決
矛盾した状態を解決するためSQLで直接重複しているとされているカラムを削除しました。
その際下記のコマンドでカラムを削除します

```
ALTER TABLE posts DROP COLUMN lunch_text, DROP COLUMN lunch_image , DROP COLUMN lunch_address, DROP COLUMN lunch_link;
```
外部キー削除も同じように

```
ALTER TABLE posts DROP COLUMN place_id, DROP COLUMN sub_place_id;
```
とすると
ERROR 1553 (HY000): Cannot drop index 'index_posts_on_place_id': needed in a foreign key constraint
というエラーが出ます。
これは外部キー制約がかかっているのでindexが削除できないといっています。
よって外部キー制約を先に削除してあげなければいけません。
外部キー制約名を下記のコマンドで確認します。

```
SHOW CREATE TABLE テーブル名;
```
CONSTRAINTの右側にあるのが外部キー制約名です。
この外部キー制約名を使い外部キー制約を削除してから、外部キーカラムを削除するとうまくいきます。

#rails db:migrateのエラー解決
SQLで重複しているカラムを削除し、マイグレーションファイルと実際のDBの矛盾がなくなったので
rails db:migrateがエラーをはかず実行されます。
【React】【textarea】改行のみ、文字未入力の際に送信ボタンを無効化する

都内スタートアップでフロントエンドエンジニアとしてReactを書いております。
最近業務でチャット機能を実装する際、タイトルどおりの実装が必要だったのでメモ程度に残していきます。

## 全体イメージ

```jsx
import React, {useState} from 'react';

const MessageForm = () => {
    const [message, setMessage] = useState('');
    const isExistTextInInput = !!message.match(/[^\n]/)
    const sendMessage = () => {
      if(!isExistTextInInput) return
      //inputの値を送信!!
    }
    return (
        <div>
            <textarea
             value={message}
             onChange={e => setMessage(e.target.velue)}
            />      
            <button 
              onClick={() => isExistTextInInput && sendMessage}
              className={isExistTextInInput ? 'btn' : 'btn--disable'}
            >
             送信
            </button>
        </div>   
    );
};
```

##解説
きもは下記変数です

```js
const isExistTextInInput = !!message.match(/[^\n]/)
```

### `String.prototype.match()`
正規表現全体に一致したすべての結果を配列で返します
何もないとnullになります
### `!!`でboolに型変換
配列ならfrue, nullならfalseが返ります

###条件である`[^\n]`
- `^`は、〜以外という正規表現
- `\n`は改行の正規表現

なので下記条件分岐になります。
改行以外の文字列がある　=>  配列が返る
文字列がない、改行しかない => nullが返る

##まとめ
あとは`isExistTextInInput`を使ってボタンのメゾット発火を無効にしたり、クラスを付け替えるだけです
めちゃめちゃ簡単なのでお試しあれ

キーボード操作系の
エンターシフトで送信や、","でタグを追加だったりも実装したので後にまとめようかなと思います！
Linuxコマンド集

よく使うLinuxコマンドをジャンル別にまとめていこうと思います。
環境：CentOS

## 基本操作
~~~bash
# ▽clear【概要】画面のクリア【Tips】[Control] + [L] でも可）
clear

# ▽pwd (print working directory)【概要】現在のディレクトリパスを表示
pwd

# ▽cd (change directory)【概要】ディレクトリを移動する
cd          # 現在ログインしているユーザのホームディレクトリへ移動する
cd -        # 一つ前のディレクトリに戻る
cd ..       # 一つ上の階層に移動する
cd /etc/ssh # パスを指定して移動する

# ▽history【概要】コマンドの履歴を見る。
history
!30    # history の実行結果に表示された  30 のコマンドを実行する
!254   # history の実行結果に表示された 254 のコマンドを実行する
~~~



## 日付・時間
~~~bash
# ▽date【概要】現在の日時を表示する
date                      # => Sat Aug 12 08:50:30 JST 2017
date +%Y/%m/%d            # => 2017/08/12
date +"%Y %m %d %H %M %S" # => 2017 08 12 08 50 30
date +"%Y-%m-%d %H:%M:%S" # => 2017-08-12 08:50:30

# ▽cal【概要】カレンダーを表示する
cal         # コマンド実行月のカレンダーが表示される
cal 2020    # 2020年        のカレンダーが表示される 
~~~



## ユーザ管理
~~~bash
# ▽id【概要】ユーザーの情報を表示する
id          # ログインしてるユーザーの情報を表示する
id apache   # apache  ユーザーの情報を表示する => uid=48(apache) gid=48(apache) groups=48(apache)
id hogehoge # hogehogeユーザーの情報を表示する => uid=1000(hogehoge) gid=1000(hogehoge) groups=1000(hogehoge)

# ▽useradd【概要】ユーザーを追加する【Tips】管理者権限を持つユーザーで実行する必要有り
useradd hogehoge                # hogehogeユーザーを追加する
cat /etc/passwd | grep hogehoge # 確認

# ▽passwd【概要】ユーザーのパスワードを設定、変更する
passwd hogehoge    # hogehogeユーザーのパスワードを変更する
passwd -S hogehoge # hogehogeユーザーの状態確認

# ▽usermod【概要】ユーザーの設定を変更する【Tips】管理者権限を持つユーザーで実行する必要有り
usermod -L hogehoge       # hogehogeユーザーをロックする
passwd -S hogehoge        # 確認 => ...(Password locked.)
usermod -U hogehoge       # hogehogeユーザーをアンロックする
passwd -S hogehoge        # 確認 => ...(Password set, SHA512 crypt.)
usermod -G wheel hogehoge # hogehogeユーザーをwheelグループに追加する

# ▽userdel【概要】ユーザーを削除する
userdel hogehoge    # hogehogeユーザーを削除する
userdel -r hogehoge # hogehogeユーザーを削除する。ホームディレクトリも一緒に削除する
~~~
AsciiDocのAdmonitionでリストを使う

# 使い方
利用するAdmontion（NOTE、TIPS、CAUTIONなど）を`[]`で囲い、箇条書き部分を`====`で囲う。

# サンプルコード
```sample.adoc
[NOTE]
====
* Pro tip..
* Blah blah blah..
* Yada yada yada..
====
```

# 出力イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402149/8993cc8f-a28e-3ba4-25b9-62e81891ce83.png)
【React】デフォルト値もundefinedチェックもいらないcreateContext【Typescript】

# Introduction
Typescriptによる型定義とContextによるState管理で、ReactのDX（Developer Experience）は劇的に進化しました。

しかし、素晴らしい型定義によって、謎に苦しめられることもあります。

# Problem
`createContext`にはデフォルト値を渡す必要がありますが、往々にしてそのデフォルト値は`undefined`です。

```typescript
const AuthContext = React.createContext<authContextType | undefined>(undefined);
```


これの何が問題なのでしょうか？
それはContextを使用する際に致命的になります。

```typescript
// どこかでuseContextして作られたuseAuth関数
const Auth = useAuth()!;
```

`createContext`のデフォルト値として`undefined`を指定したことで、Contextを使用する際にその値が`undefined`でないかを”全ての場所で”逐一確認する必要があります。


根本的に、`undefined`はアプリケーションにとって何の意味もなさない値です。
それを、わざわざ確認しなければいけないということは、バグやエラーの温床になります。

# Solution
デフォルト値を`undefined`とせず、未定義チェックを行える`cretaeContext`のwrapperを作成して解決します。

```typescript
function createCtx<ContextType>() {
  const ctx = React.createContext<ContextType | undefined>(undefined);
  function useCtx() {
    const c = React.useContext(ctx);
    if (!c) throw new Error("useCtx must be inside a Provider with a value");
    return c;
  }
  return [useCtx, ctx.Provider] as const;
}
```

今回の問題は、デフォルト値`undefined`のContextに対して、useContextをしてしまうとで`undefined`がuseContextに紛れ込んでしまうことでした。

そこで、wrapper関数に未定義チェック関数を定義し、`useContext`が`undefined`である場合はエラーをthrowします。

これで、wrapper関数`createCtx`で定義された`useCtx`は、`<ContextType>`で渡されるジェネリック型を返します。
無事、useContextから`undefined`を駆逐しました。

# Example
ユーザー管理、ログイン、ログアウトなどを管理するContextのExampleを作ってみました。

```tsx
type User = {
  id: string;
  name: string;
};

type authContextType = {
  user: User | null;
  signIn: () => void;
  signUp: () => void;
  signOut: () => void;
};

function createCtx<ContextType>() {
  const ctx = React.createContext<ContextType | undefined>(undefined);
  function useCtx() {
    const c = React.useContext(ctx);
    if (!c) throw new Error("useCtx must be inside a Provider with a value");
    return c;
  }
  return [useCtx, ctx.Provider] as const;
}

const [useAuth, SetAuthProvider] = createCtx<authContextType>();

const AuthProvider: React.FC = (props) => {
  const auth = useAuthCtx();
  return <SetAuthProvider value={auth}>{props.children}</SetAuthProvider>;
};

const useAuthCtx = (): authContextType => {
  const [user, setUser] = React.useState<User | null>(null);
  const signIn = () => {
    // Some sign in action
  };
  const signUp = () => {
    // Some sign up action
  };
  const signOut = () => {
    // Some sign out action
  };

  return { user, signIn, signUp, signOut };
};

export const App = () => {
  const auth = useAuth();
  return (
    <AuthProvider>
      <button onClick={() => {auth.signIn()}}>ログイン</button>
      <button onClick={() => {auth.signUp()}}>サインアップ</button>
    </AuthProvider>
  );
};
```

# Sample
【Qiita記事準備中】 React.createContextで管理するFirebase Authentication

# Happy Hacking!!😎
苦情受付中...✍️
【Ruby基礎】ブロックを使う頻度の高いメソッド

ブロック構文を使う頻度の高いメソッドを使用例と一緒にまとめます。

## map(エイリアスメソッドはcollect)
**各要素に対してブロックを評価した結果を新しい配列にして返す**
空の配列を用意して、他の配列をループ処理した結果を空の配列に詰め込んでいくような処理の
大半はmapメソッドに置き換えられる。


```ruby:コンソール

irb(main):026:0> numbers
=> [1, 2, 3, 4, 5]
irb(main):027:0> new_numbers = numbers.map {|n| n * 10}
irb(main):028:0> new_numbers
=> [10, 20, 30, 40, 50]
irb(main):029:0> numbers
=> [1, 2, 3, 4, 5]

```

## select/find_all/reject
**selectメソッドは各要素に対してブロックを評価し、その戻り値が真の要素を集めた配列を返すメソッドです。**

```ruby:コンソール

irb(main):003:0> numbers = [1,2,3,4,5,6]
irb(main):004:0> even_numbers = numbers.select {|n| n.even?}
rb(main):006:0> even_numbers
=> [2, 4, 6]

```

**rejectメソッドはselectメソッドの反対で、ブロックの戻り値が真になった要素を除外した配列を返す**

```ruby:コンソール
irb(main):007:0> numbers = [1,2,3,4,5,6]
irb(main):008:0> non_multiples_of_three = numbers.reject {|n| n % 3 == 0}
irb(main):010:0> non_multiples_of_three
=> [1, 2, 4, 5]

```

## &とシンボルを使って簡潔に書く

```ruby:コンソール
irb(main):012:0> ['ruby', 'java', 'perl'].map(&:upcase)
=> ["RUBY", "JAVA", "PERL"]
```

## 参考文献
「プロを目指す人のためのRuby入門」
イラストレーターでいろんな波形を作る

直線が、波になって、その波が、ハートの形になるようなアニメーションを作りたいと思った。

ハートの形の波形になるようにイラストをかく方法。


https://magnets.jp/web_design/2821/

上のページが分かりやすかった。

こんな図を作りたい
![ハートの波形.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197731/71f60f18-d527-9f36-7593-1969883f17c5.png)




まずハートの形となるマークを持ってくる
それに上のリンクのページを参考に波線を作り　振幅をハートの輪郭に揃えていく



![ハートの波形作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197731/35696c4e-2862-a03c-4156-29aba445e0bf.png)
Python から Excel を編集し､ピボットテーブルを作成する

# Python を使って効率化したい

作業効率化のために､ Pandas で作成した Excel ファイルをピボットテーブルを作成し､フィルターの有効化や日時のグループ化をしたいと考えました｡

日本語での資料があまりなかったため､ご参考になればと思い共有します｡

[参考資料](#参考資料)に示した URL にピボットテーブルを作成する関数が示されているため､もっと色々なことをしたい場合はそちらを参考にする方が良いと思います｡

## サンプルファイルの作成

特に意味のないピボットテーブル用のデータを作成します｡
エクセルファイルとして吐き出すファイル名を編集して下さい｡
指定したファイル名が同一ディレクトリにないよう注意してください｡
上書きされても責任はとれません｡

```python
import pandas as pd 
import random
from datetime import datetime as dt

record = []
for y in range(2015, 2020):
    for m in range(1, 13):
        for shop in ['A', 'B', 'C']:
            date = dt(year=y, month=m, day=1).strftime('%Y-%m-%d')
            price = 200 + random.randint(0,100)    
            record.append([date, shop, price])

df_record = pd.DataFrame(record)
df_record.columns = ['date', 'shop', 'price']
df_record['date'] = pd.to_datetime(df_record['date'])
df_record.to_excel('ここを編集してください.xlsx', index=None)
```


## ピボットテーブル作成

[サンプルファイルの作成](#サンプルファイルの作成) で指定したファイル名を､読み込みファイル名にも指定して下さい｡


```python
import win32com.client as win32
import os
win32c = win32.constants

## win32.Dispatch でもできたが､ pyinstaller で exe 化した際にエラーになったため､
## win32.gencache.EnsureDispatch を使用したほうが無難かもしれない
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = True  

## 読み込み時に絶対パスを指定しなければエラーになる
fpath = os.path.join(os.getcwd(),'ここを編集してください.xlsx')
wb = excel.Workbooks.Open(fpath)

## Sheet 1 指定し､フィルターを有効にする
wbs1 = wb.Sheets('Sheet1')
wbs1.Columns.AutoFilter(1)

## ピボットテーブルの作成
wbs2_name = 'pivot'
wb.Sheets.Add().Name = wbs2_name
wbs2 = wb.Sheets(wbs2_name)
pvt_name = 'pvt'
pc = wb.PivotCaches().Create(SourceType=win32c.xlDatabase, SourceData=wbs1.UsedRange)
pc.CreatePivotTable(TableDestination='{sheet}!R3C1'.format(sheet=wbs2_name), TableName=pvt_name)

## ピボットテーブルの設定
wbs2.PivotTables(pvt_name).PivotFields('date').Orientation = win32c.xlRowField
wbs2.PivotTables(pvt_name).AddDataField(wbs2.PivotTables(pvt_name).PivotFields('price'), 'Ave/price', win32c.xlAverage).NumberFormat = '0'
wbs2.PivotTables(pvt_name).PivotFields('price').Orientation = win32c.xlPageField

## 日付のグループの選択
## Periods=(秒, 分, 時, 日, 月, 四半期, 年)
wbs2.Cells(4, 1).Select()
excel.Selection.Group(Start=True, End=True, Periods=(False, False, False, False, True, False, True))

## ファイルを閉じる
wb.Close(True)
excel.Quit()
```


## 参考資料
[How to Create a Pivot Table in Excel with the Python win32com Module](https://trenton3983.github.io/files/solutions/2020-06-22_pivot_table_win32com/create_pivot_table_with_win32com.html)
AWSのDynamoDBのテーブルをCSVファイルでエクスポートするPythonスクリプトを作成しました

# 目的
AWSのDynamoDBのテーブルをCSVファイルでエクスポートをするPythonスクリプトを作成しました。

※下記の記事を参考にさせていただきました。
[DynamoDBのテーブルをscanするPythonコード](https://qiita.com/shinsaka/items/fc5be926ef51d75b2cfa)

# 前提条件
- Python3がインストール済みであること
- [AWS CLI バージョン2](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2.html)がインストール済みであること
- [aws configure コマンド](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-files.html)で認証情報、リージョン、出力形式を設定済みであること
- AWSのDynamoDBにテーブルが存在すること

※今回は、DynamoDBに以下のテーブルが存在している前提です。
※テーブル名：GPSLog（GPSログデータ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205045/f5ff318e-890c-ec8d-ef18-b74c36d4a017.png)

# 実行
- 出力CSVファイルを指定してください。
- Pythonスクリプトを実行してください。

```python:DynamoDBtoCSV.py
import os
import csv
import json
import datetime
import boto3
from boto3.session import Session

# 出力CSVファイル指定
output_csvfile = "出力CSVファイルを指定してください"

# 出力CSVファイルの存在チェック(ヘッダー有無の判断)
if(os.path.exists(output_csvfile)):
    header_flg = 0
else:
    header_flg = 1

# boto3でDynamoDBに接続
dynamodb = boto3.resource('dynamodb')

# テーブルをフルスキャン
def get_records(table, **kwargs):
    while True:
        response = table.scan(**kwargs)
        for item in response['Items']:
            yield item
        if 'LastEvaluatedKey' not in response:
            break
        kwargs.update(ExclusiveStartKey=response['LastEvaluatedKey'])

records = get_records(dynamodb.Table('GPSLog'))

# 出力CSVファイルに書き込む
with open(output_csvfile, 'a', encoding='shift_jis') as output_csvfile_fp:
    fieldnames = ['datetime', 'lat', 'lon', 'status', 'mode', 'speed', 'epx', 'epy']
    csvfile_writer = csv.DictWriter(output_csvfile_fp, fieldnames=fieldnames, lineterminator='\n')
    
    # 出力CSVファイル新規作成時、ヘッダー出力
    if header_flg == 1:
        csvfile_writer.writeheader()
        header_flg == 0

    for record in records:
        # print(record)
        # 出力CSVファイルに書き込む
        csvfile_writer.writerow({
            'datetime': record['datetime'] + '+09:00',
            'lat': record['lat'],
            'lon': record['lon'],
            'status': record['status'],
            'mode': record['mode'],
            'speed': record['speed'],
            'epx': record['epx'],
            'epy': record['epy']
        })

print(u'処理終了')
```
【Swift】Cloud FirestoreのドキュメントにcreatedAtとupdatedAtを登録する実装

## はじめに
createdAtとupdatedAtはRDBだと自動的に生成してくれますが、Cloud Firestoreでは基本的にはクライアントからデータを登録する必要があります。
しかし、クライアント側で生成した日付データは改竄可能なので、Firestoreに適切ではない日付が登録される可能性があります。
そこでFirestore側には、**ドキュメントがFirestoreに登録された時点での日付**を設定できる関数が用意されています。
今回はその関数を使って、createdAtとupdatedAtを実装したいと思います。

## ドキュメントの定義
まずはcreatedAtとupdatedAtを付与するドキュメントを下記のように定義しました。

``` SampleData.swift
import Firebase

struct SampleData: Codable {
    internal let createdAt: Timestamp? = nil
    internal let updatedAt: Timestamp? = nil
}
```
このSampleDataをFirestoreに登録した時に、createdAtとupdatedAtに登録した日付が保存されていることがゴールとなります。


## Firestoreに登録された日付をcreatedAtとupdatedAtに設定する
Firestoreに登録された日付を設定するには**FieldValue.serverTimestamp関数**を使用します。
この関数をメンバに持たせておくことで、そのデータがFirestoreに保存されたタイミングで、日付を自動的に設定してくれるというものです。
具体的には下記のように実装します。

``` SampleData.swift
struct SampleData: Codable {
    internal let createdAt: Timestamp? = nil
    internal let updatedAt: Timestamp? = nil
    // ①
    enum CodingKeys: String, CodingKey {
        case createdAt
        case updatedAt
    }
}

extension SampleData {
    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        // ②
        if self.createdAt == nil {
            try container.encode(FieldValue.serverTimestamp(), forKey: .createdAt)
        }
        // ③
        try container.encode(FieldValue.serverTimestamp(), forKey: .updatedAt)
    }
}

```

①では、SampleDataをEncode&Decodeする対象のメンバを指定しています。
②のcreatedAtでは、登録された日付を保持したいので、登録時のみ(つまり初期値nilの場合)設定するようにしています。
③のupdateAtでは、更新されるたびに日付を上書きしたいので常にFieldValue.serverTimestamp()を設定します。

SampleDataを新規で登録する際はcreatedAtとupdatedAt両方に日付データが保存され、更新時にはupdatedAtだけ更新されるようになります。
EntityをEncode&Decodeする実装は[こちらの記事](https://qiita.com/tsuruken/items/7fe6da11c01311e73cd7)で解説しています。
[Rails6 / jQuery導入] Uncaught TypeError: $ is not a function のエラー解決

#開発環境
Ruby 5.2.1
Rails 6.0.3.2

#はじめに
rails 5の頃はgemを使ってjQueryをインストールしていましたが、
rails 6からはWebpackerを用いてjQueryをインストールするようになりました。

[Rails6でjQueryの導入方法](https://qiita.com/masahisa/items/eaacb0c3b82f4a11fc13)
[Introducing jQuery in Rails 6 Using Webpacker](https://www.botreetechnologies.com/blog/introducing-jquery-in-rails-6-using-webpacker)

このあたりの記事を参考に導入していきましたが、このようなエラーが…。
![スクリーンショット 2020-08-23 8.42.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686617/ef152bd5-4058-daf9-b5a0-01bb06902ae6.png)
```Uncaught TypeError: $ is not a function```
どうやら 「$」が機能していないみたい。

ちなみにjsファイルに```console.log('test');``` だけ入力すると、
このようにjavascriptが動作しているため、jsファイルを読み込めていない系の
トラブルでは無いことがわかる。
![スクリーンショット 2020-08-23 13.03.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/686617/a66d4cb7-11e4-a93b-0b62-2d276e101d25.png)


#解決方法
結論：webpackの環境ファイルを修正して、解決しました
## 修正前

```ruby:config/webpack/environment.js__(修正前)
const { environment } = require('@rails/webpacker')

const webpack = require('webpack')
environment.plugins.prepend('Provide',
    new webpack.ProvidePlugin({
        $: 'jquery/src/jquery',  # ここを修正します
        jQuery: 'jquery/src/jquery'
    })
)
module.exports = environment
```
#修正後
```ruby:config/webpack/environment.js
const { environment } = require('@rails/webpacker')

const webpack = require('webpack')
environment.plugins.prepend('Provide',
    new webpack.ProvidePlugin({
        $: 'jquery',        # 修正完了　　　　　
        jQuery: 'jquery/src/jquery'
    })
)
module.exports = environment
```

#最後に
これでrails6環境でjsが使える！

ブログに今回実施したjQuery導入手順をまとめたので、よかったら見てください。

<TABLE>
  <TR>
    <td colspan=2>
      <A HREF="https://nakauchannel.hatenablog.com/" TARGET="_blank"><strong>nakauの技術ブログ 〜プログラミングを学ぶ〜</strong></a>
    </TD>
  </TR>
  <TR>
    <TD WIDTH=150px>
<a href="https://nakauchannel.hatenablog.com/entry/2020/08/25/003417">
      <IMG STYLE="float:left;margin-right:.5em;" src="https://cdn-ak.f.st-hatena.com/images/fotolife/n/nakau_tech/20200825/20200825002721.png" ALT="" WIDTH="120" HEIGHT="120" /></a>
    </TD>
    <TD WIDTH=400px>
            <A HREF="https://nakauchannel.hatenablog.com/entry/2020/08/25/003417" TARGET="_blank"><strong><u>Rails6 - jQuery導入方法</u></strong></a>
    </TD>
  </TR>
</TABLE>
boto3-stubs を使って、boto3 でコード補完を有効にしよう

Python で AWS 系のプログラムを組んでると、必ずといっていいほど、boto3 という AWS SDK のお世話になるはずです。

この boto3、AWS のサービスをすべて叩けるたくさんの機能持ちなのに、型がないためコード補完が聞きません。`boto3.client("s3")` などと、サービス名を文字列で受け取るので、型定義としては `BaseClient` 型になっていて、各サービス用のクライアントの型になってないんですね。普段、補完がガンガン聞く環境で開発しているので、これがなかなかにつらい。

なんとかならないものかと思って探してみたところ **[boto3-stubs](https://pypi.org/project/boto3-stubs/)** というパッケージを見つけました。このなかで、s3 や ec2 などの各サービス用のクライアント・リソースの型が定義されているので、この型をつけてあげると、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141307/98d888ad-013a-8049-8469-c85d085cbf09.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141307/a692d6c0-735f-e1ad-bddc-dbecaa567220.png)


こんなかんじで補完をしてくれるようになります！ これはいい！！

# インストール

```bash
pip install boto3-stubs[essential]
```

バージョンは boto3 と合わせてつくようになっているので、特定の boto3 を使っている場合も、同じバージョン番号を指定してあげれば、問題なく利用できます。パッケージは自動で更新されていて、boto3 が更新された日に boto3-stubs もリリースされているようです。

上記の `[essential]` 指定では、 "ec2, s3, rds, lambda, sqs, dynamo, cloudformation" のクラスが入ります。これだけで 7MB ぐらい必要ということで、いきなり全部入るようにはなってないようです。他に必要なのがあれば、 `[essential,ecs]` といった形で適宜、指定してあげれば OK です。

# 使い方

```python
import boto3
from mypy_boto3_s3 import S3Client, S3ServiceResource  # from boto3-stubs

s3: S3Client = boto3.client("s3")
s3_r: S3ServiceResource = boto3.resource("s3")
```

これで、`s3`, `s3_r` 変数にコード補完が聞くようになります。型を指定してあげるので、VSCode など型に基づく補完がきくエディタなら、なんでも同じやり方で OK です。

# 余談

- boto3-stubs を mypy で使うと、型指定を手で書かなくても型チェックできる仕組みがあるようです。
- boto3 プロジェクトでも、stub を用意する動きはあるっぽいです。将来的には、このあたりも動きがある、かもしれません。
[初心者向け]UITableViewでCellのハイライトをゆっくりと消す方法（画面遷移した先から戻ってきたタイミングで）

#はじめに
・Swift5,Xcode11.6を使用しています。

#できること

・UITableView上でCellを選択したときにゆっくりとハイライトさせる
・画面遷移先から戻ってきたときに、ゆっくりとハイライトを終わらせる





```swift:swift
 override func viewWillAppear(_ animated: Bool) {
        navigationController?.isNavigationBarHidden = true

        //ゆっくり付けたり消したりする
        if let indexPathForSelectedRow = tableView.indexPathForSelectedRow {
            tableView.deselectRow(at: indexPathForSelectedRow, animated: true)
        }
    }
```

#結果
以下のような効果のハイライトが実装できます。
![N0PFF6c49xCIBZmrkbWF1598155405-1598155417.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691642/35fed22c-95a3-0a9d-9f2f-64c906381dcc.gif)
【A-Frame】AR-marker上に3DCGを出してみよう！

#コード全体
https://github.com/i-am-ethan/aframe_tutorial_gltf-ARmarker

#書いた日
2020年8月23日

#書いた目的
WebARの業界を盛り上げたい

#最低限これはできて欲しい
・前回の記事をみている
https://qiita.com/e_san_desuyo/items/5e1ab41553a8738e7693
・VSCodeをインストールしている

#手順
前回の記事で解説したものとほとんど一緒です。

"Hiro"というマーカーの読み込みが新しい部分です。
完成イメージのGIFにでてくるマーカーです。

これはデフォルトのマーカーです。
なぜHiroなのかが気になる方はこちらの記事を読んでください。

https://note.com/e_san_note/n/n30ead6ce9a74


```html:index.html
<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Hello, WebVR! • A-Frame</title>
    <meta name="description" content="Hello, WebVR! • A-Frame">
    <script src="https://aframe.io/releases/1.0.4/aframe.min.js"></script>
    <script src="https://raw.githack.com/AR-js-org/AR.js/master/aframe/build/aframe-ar.js"></script>
  </head>
  <body style="margin : 0px; overflow: hidden;">
    <a-scene embedded arjs>

      <!-- 3Dオブジェクト読み込む -->
      <a-assets>
        <a-asset-items id="bird" src="scene.gltf" ></a-asset-items>
      </a-assets>

      <!-- マーカーを読み込む -->
      <a-marker preset="hiro">
        <!-- <a-box position="0 0.5 0" wireframe="true"></a-box> -->
        <!-- 3Dオブジェクト配置-->
        <a-entity gltf-model="#bird" scale="0.0008 0.0008 0.0008"></a-entity>
      </a-marker>
      <a-entity camera>
      </a-entity>
    </a-scene>
  </body>
</html>


```

#完成イメージ
![20200823_125513.GIF](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/251713f4-81c5-7f9c-facc-b3d388533624.gif)
【Golang】goroutineのチャネル(channel)で意図せず無限ループした話

# 要約

- goroutineのfor-selectパターンでは、ゼロ値を受信して予期せず無限ループすることがある
- 受信チャネルから値を受け取る時は、第2返り値でゼロ値チェックをしよう

```golang
for {
  select{
  case v, ok := <-ch:
    if ok {
      // 正常系処理
    } else {
      // 異常系処理
    }
  }
}
```


# 発生状況

無限ループが発生したコードがこちら。

```golang
package main

import (
	"bufio"
	"context"
	"fmt"
	"io"
	"os"
	"strings"
	"time"
)

func main() {
	if err := start(); err != nil {
		fmt.Fprintf(os.Stderr, "Error: %s\n", err)
		os.Exit(1)
	}
}

func start() error {
	bc := context.Background()
	timeout := 5 * time.Second // 制限時間5秒
	ctx, cancel := context.WithTimeout(bc, timeout)
	defer cancel()

	// wordCh := input(os.Stdin)
	wordCh := input(strings.NewReader("hey"))

	for {
		select {
		case input := <-wordCh:
			fmt.Printf(">> %s\n", input)
		case <-ctx.Done():
			fmt.Println("Done")
			return nil
		}

	}
}

func input(r io.Reader) <-chan string {
	wordCh := make(chan string)

	go func() {
		s := bufio.NewScanner(r)
		for s.Scan() {
			wordCh <- s.Text()
		}
		close(wordCh)
	}()

	return wordCh
}
```

標準入力(`os.Stdin`)から値を受け取るgoroutineを起動し、チャネル経由でその値を無限ループ内に渡して、標準出力に出すコード。

無限ループ内でselect-caseを使い、送信チャネルからの値を待つ、いわゆる(?)for-selectパターン。

処理を簡素化するため、標準入力を静的なモック(`strings.NewReader("hey")`)に差し替えている。

https://play.golang.org/p/n5zEwPZUkst

問題は、チャネル経由で1回しか値を送信をしていないのに、制限時間(5秒)まで無限ループが止まらないこと。

実行結果

```
timeout running program
>> hey
>> 
>> 
>> 
>> 
>> 
>> 
........
```


# 原因

チャネルがCloseされた後に、ゼロ値を受信していた。

https://golang.org/ref/spec#Close

```
After calling close, and after any previously sent values have been received,
receive operations will return the zero value for the channel's type without blocking.
```

`close(ch)`でチャネルを閉めた後に受信チャネルを呼ぶと、処理をブロックせずにゼロ値が返される。

無限ループ内で閉めた受信チャネルを呼んでいたので、制限時間まで処理が続いていた。


# 解決方法

受信チャネルの第2返り値には真偽値が入っていて、
そのチャネルを通ってきた値が、送信チャネルから帰ってきた値(true)なのか、ゼロ値(false)なのかという判別をすることができる。

https://golang.org/ref/spec#Receive_operator

```
x, ok := <-ch
The value of ok is true if the value received was delivered by a successful send operation to the channel,
or false if it is a zero value generated because the channel is closed and empty.
```

送信チャネルから送られた値のみを処理するようにif文を追記。

```golang
for {
  select {
  case input, ok := <-wordCh:
    if ok {
      fmt.Print(">> %s",input)
    } else {
      return nil
    }
  case <-ctx.Done():
    fmt.Println("Done")
    return nil
  }
}
```

https://play.golang.org/p/KvtOgE8Xr_e


実行結果

```
>> hey
```

# 参考
- [Go の channel 処理パターン集](https://hori-ryota.com/blog/golang-channel-pattern/)
- [Go言語でチャネルとselect](https://qiita.com/najeira/items/71a0bcd079c9066347b4)
- [Why do I receive values from a closed channel?](https://stackoverflow.com/questions/29269850/why-do-i-receive-values-from-a-closed-channel)
[Scala] Function.chainを使う

## 環境

macOS Mojave 10.14.4
scala 2.13.1

## 経緯

複雑な関数をいい感じに連結させて処理したいなと考えてたところ、`Function.chain`に出会った。

## 実装

実際に、簡単な例で使ってみた。

```scala

def reverse(list: List[Int]): List[Int] = {
  list.reverse
}
    
def add(list: List[Int]): List[Int] = {
  list.map(_ + 1)
}

val result: List[Int] => List[Int] = Function.chain(Seq(reverse(_), add(_)))
// _は、以下のように展開される。
// Function.chain(Seq(list => reverse(list), list => add(list)))

result(List(1, 2, 3))

```

## 利用用途

実装例では、簡単な処理しかしていないので `list.reverse.map(_ + 1)`を繋げるだけで良いが、
それぞれのメソッドの中で、もっと複雑な処理をする際に使えると思う。

それぞれのメソッドでテストすることも可能、責務が分けられるといったメリットもありそう。


## 注意

chaninメソッドの引数を見ると、`T => T`になっている。

```scala
def chain[T](fs: scala.collection.Seq[T => T]): T => T = { x => fs.foldLeft(x)((x, f) => f(x)) }
```

なので、以下の例のように、inputとoutputの型が変化するメソッドでは、Function.chainは使えないのが残念。

```scala

def reverse(list: List[Int]): List[Int] = {
  list.reverse
}

// List[Int] => List[String]になる
def convert(list: List[Int]): List[String] = {
  list.map(_.toString)
}

// reverse: List[Int] => List[Int]
// add Int => List[Int] => List[String]
// になって、chainメソッドの引数の型（Seq[T => T]）に合わなくなる。
val result = Function.chain(Seq(list => reverse(list), list => convert(list)))
result(List(1, 2, 3))

```
rescueとrescue_from

### はじめに
プログラミングにおいてエラーは無いにこしたことはありませんが、開発者も人間なのでミスすることもあるし、ネットワークのエラーで開発者がどうしようもなくエラーが発生することもあります。
エラーと言っても色々な種類があります。「こういうエラーが起きた場合はこうする」という処理を書いておくべき場面は多々ありますが、そんな時に使えるrescueとrescue_fromについての基礎的な使い方です。

### rescue
rescueを使うと、エラーが発生した場合それを拾って次に行う処理を書くことができます。
以下はrescueがない場合とある場合の違いです。

Userクラスはnameカラムしか持たないようにして、あるuserを作ります。

```ruby
> user = User.new('山田')
=> #<User:0x00007ff0fa896758 @name="山田">

> user.name
=> "山田"
```

Userクラスにputs_infoメソッドを作り、実行します。

```ruby
class UsersController < ActionController::Base

  def puts_info
    "名前は" + name
  end
end

> user.puts_info
=> 名前は山田
```


puts_infoメソッドに存在しないageメソッドを加え、実行します。

```ruby
class UsersController < ActionController::Base

  def puts_info
    "名前は" + name
    "年齢は" + age
  end
end

> user.name
=> "山田"
> user.puts_info
=> NameError (undefined local variable or method `age' for #<User:0x00007fdeb98f3ed8 @name="山田">)
```
NameErrorになりました。
rescueを使って、エラーの場合の処理を書いてあげます。

```ruby
class UsersController < ActionController::Base

  def puts_info
    "名前は" + name
    "年齢は" + age
  rescue => e
    "エラーです"
  end
end

> user.puts_info
=> "エラーです"
```

:::note info
rescue NameError => e
のように例外クラスを指定して拾うこともできます。
詳しく知りたい方は以下の記事がおすすめです。
:::
https://qiita.com/kasei-san/items/75ad2bb384fdb7e05941


## rescue_from

`rescue_from`は、特定の種類または複数の種類の例外を1つのコントローラ全体およびそのサブクラスで扱えるようになります。

#### 例：404エラー(そんなページありませんよ)の場合に`record_not_found`というメソッドを実行させる。

```ruby
class UsersController < ActionController::Base
  rescue_from ActiveRecord::RecordNotFound, with: :record_not_found

  private

    def record_not_found
      render plain: "404 Not Found", status: 404
    end
end

```

#### 例：adminユーザー以外はeditページに入れない、という仕様を実装する

1, Clientコントローラーで、editアクション実行前に`before_action`で権限チェックの処理を行います。
`check_authorization`メソッド内で`current_user.admin?`を行い、管理者ではない場合は、`raise`を使って`User::NotAuthorized`という例外を発生させます。

```ruby

class ClientsController < ApplicationController
  before_action :check_authorization

  def edit
    @client = Client.find(params[:id])
  end

  private

    def check_authorization
      raise User::NotAuthorized unless current_user.admin?
    end
end
```

2, ApplicationControllerに、`User::NotAuthorized`というエラーの場合に`user_not_authorized`メソッドを実行させる処理を書きます。

```ruby
class ApplicationController < ActionController::Base
  rescue_from User::NotAuthorized, with: :user_not_authorized

  private

    def user_not_authorized
      flash[:error] = "あなたはこのページにアクセスする権限がありません。"
      redirect_back(fallback_location: root_path)
    end
end

```

こうすることで、権限エラーの場合には「権限がありません」という表示をしてあげることができますし
、editアクション内では権限に関して心配する必要がなくなります。
edit以外にも管理者権限を必要とするメソッドがある場合には、before_actionを使って`check_authorization`を実行してあげればいいですね。

### 参考
https://railsguides.jp/action_controller_overview.html#rescue
AWS LambdaにてPython3でS3でファイルが追加されたイベントを取得し、実行する。

# 概要
調べたので備忘録

# 手順

1. Lambda上部のデザイナーから「トリガーを追加」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/2e3c8db7-3228-1ecc-63e0-c28b5a6c5e88.png)


2. S3を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/ed6ae4b7-03d2-8fb8-0038-f5d64c409b9f.png)


3. 対象バケットを選択、「全てのオブジェクト作成イベント」を選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89227/02db54d1-ac97-33c9-5cb0-d2a6441aa4db.png)

※必要あればプレフィックスなどは自由に設定してください。

変更後、「保存」をクリックしてください。

4. コードはこんな感じで取得できます。

```python3
def lambda_handler(event, context):
    for record in event['Records']:
        bucket = record['s3']['bucket']['name']
        key = record['s3']['object']['key']
        exec(bucket,key)
```
※アクセス権限の設定がない場合は失敗する可能性があります。

## 参考

サンプル Amazon S3 関数コード
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-s3-example-deployment-pkg.html#with-s3-example-deployment-pkg-python
inputのrangeのデザインを変えたいので1から作成した

#はじめに
皆様はrangeのつまみ部分のデザインを変えたいと思ったことはないでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234613/9780aa85-97b9-a5cf-a53f-bffcf02130d5.png)
知らべてみると、```::-webkit-slider-thumb```で変更出来ますが、[非標準](https://developer.mozilla.org/ja/docs/Web/CSS/::-webkit-slider-thumb)です。しかもこれには擬似要素が付与出来ません。
困った時の[stackoverflow](https://ja.stackoverflow.com/questions/69701/input%e3%81%aerange%e3%81%ae%e3%81%a4%e3%81%be%e3%81%bf%e3%81%ae%e3%83%87%e3%82%b6%e3%82%a4%e3%83%b3%e3%82%92%e5%a4%89%e3%81%88%e3%81%9f%e3%81%84)で質問してもやはり無理とのこと...。

じゃあ、作るか!

#前提知識
##rangeの見た目はブラウザによって違う
rangeの見た目はブラウザによって違います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/234613/0cc55ba7-c68e-ffc7-cd3a-e673e92e1aa0.png)
[input type=range タグをカスタマイズするために](https://www.g200kg.com/archives/2017/12/input-typerange.html)

これは2017年の記事ですが、例えばchromeではデザインが変更されていたりします。
[Chrome のフォーム コントロールとフォーカスのアップデート](https://developers-jp.googleblog.com/2020/04/chrome_7.html)
このため、今後もずっと同じ見た目とは限りません。
##素のままでは変更する量が多い
[input type=range タグをカスタマイズするために](https://www.g200kg.com/archives/2017/12/input-typerange.html)
この記事を見てもらえればわかりますが、ブラウザによって変更する擬似要素が違います。
つまり、全ブラウザで同じ見た目にする場合は全てリセットしなければなりません。その上、全要素を指定しなければなりません。

#本編
上記を踏まえ、作成していきます。
属性は、min,max,valueをつけます。step?知らんな(すみません実装出来ませんでした)

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

今回はChromeのrangeに似せて作成しました。個人的にほぼ似ていると思います。
###良い点
- つまみが好きにデザイン出来る
    - つまみ単体を一つの要素で作成しているので好きにデザインすることが出来ます。
- その他も好きにデザイン出来る
    - その他も一つ一つを別の要素で作成しているので好きにデザインすることが出来ます。
- 挙動を自分で変えることが出来る
    - 中の挙動は全てJSで作成しているので自分で挙動を変えることが出来ます。


###悪い点・反省点
- ドラッグが出来てしまう
    - 今回実装するにあたって、一つ一つをdivで作成したため、つまみをスライドする際にドラッグしてしまい、挙動がおかしくなってしまう時があります。
- stepが実装できなかった
    - 段階を踏んでつまみを動かすのが難しかった。こればかりは実力不足。
- スマホ対応していない
    - スマホ対応むず～い。

#まとめ
HTMLのタグ作ってる人偉いね。
でも開発が止まってる以上自分で開拓しなければならないジレンマ。
次のバージョンで変更できるようになってるといいな。
QB(CBT)の学内演習順位を数え上げるスクリプト

こんにちは。
医学部4年になると、CBT対策としてQB(クエスチョンバンク)に取り組むかと思います。
このQB、学年内での演習状況がプロットで表示されますが、現在(2020/8/23)の仕様だと、自分の演習問題数の順位が何位、等の表示がされません。
1周してしまえばカウントがカンストするのでどうせ同率1位にはなるのですが、それ以前ではやはり気になるところ。
プロットを1つ1つ上から数えるのは大変なので、自動で数え上げるスクリプトを書きました。
twitterにて「共有してほしい」との要望を頂いたので、共有します。

※当方プログラミング、githubともに始めたばかりの初心者です。コードが汚い、githubの使い方がおかしい等があるかと思いますが、ご容赦ください🙇

##■できること
```:result
あなたの演習数ランキングは 〇〇位 です！
あなたの正解率ランキングは 〇〇位 です！
あなたの昨日の演習数ランキングは 〇〇位 です！
```

##■大まかな仕組み
①seleniumでmediLinkアカウントにログイン、順位表のページのhtmlを取得
②BeautifulSoup4で取得したhtmlから各プロットの要素を取得
③各プロットのx座標、y座標から自分の順位を数え上げ

##■動作確認環境
・Python 3.8.1
・macOS Catalina ver.10.15.5
(2020/8/23)
※QB側のサイト表示に依存するため、時間帯によってはエラーとなってしまいます。

##■コード
https://github.com/fumiyacyrus/qb_cbt_ranking

##■使い方
####◆使用ライブラリのインストール
- selenium
- BeautifulSoup4

####◆ChromeDriverの準備
https://chromedriver.chromium.org/downloads
からお使いChromeのverに合ったドライバーをダウンロード。
場所は好きな場所でOK。

####◆コード上での設定
```python:6行目
DRIVER_PATH = ''    # ブラウザのドライバーのpath:str
```
`''`の中に先程ダウンロードしたChromeDriverのpathを記述

```python:55,56行目
    type_text(email_form, '')   # アカウントのemailアドレス:str
    type_text(pass_form, '')    # アカウントのパスワード:str
```
`''`の中にご自身のmediLinkアカウントのメールアドレス・パスワードを記述

####◆ターミナル上
```
$ python3 qb_cbt_ranking.py
```
html取得に少し時間がかかりますが、15秒ほどで結果が表示されるかと思います。
CSSで文字を含む要素において、上下中央揃えにする

`line-height: 要素の高さ;`で上下中央揃えになる。
例えば、\<a>タグでログインボタン作成するとき、\<a>タグの高さ(height)と同じに指定すると、上下中央揃えのボタンが作成できる。
ObservableのGenericsにAssociated Values付きEnumを利用したExtensionを作る

# 結論
- enumにアクセス用のProtocolを適用することで可能.

# 検討したきっかけ
- Rxで反復して行なっているAssociated Values付きEnumへの処理を共通化したかった.
   - 新メンバーのイニシャルコスト.（説明する労力、理解してもらう労力）
   - 実装コスト.（数行の労力、レビューの労力）

# 実践

サンプル: Result型
ケース: SuccessとFailureをそれぞれに分けるオペレータを作る.

問題: Elementの型条件にResultにしたときのコンパイルエラー。

- ResultのGenericsの指定が必要.
- 具体的な型を指定すると旨味が少ない.

解決方法:
`ResultType`というアクセス用プロトコルを定義しenum適用する.

以下サンプルコード.

```ObservableType+Extension.swift
extension ObservableType where Element: ResultType {
    func mapToSuccess() -> Observable<Element.SuccessType> {
        compactMap { $0.success }
    }

    func mapToFailure() -> Observable<Element.FailureType> {
        compactMap { $0.failure }
    }
}
```

```ResultType.swift
protocol ResultType {
    associatedtype SuccessType
    associatedtype FailureType: Error

    var success: SuccessType? { get }
    var failure: FailureType? { get }
}
```

```Result+Extension.swift
extension Result: ResultType {
    typealias SuccessType = Success
    typealias FailureType = Failure

    var success: Success? {
        switch self {
        case .success(let success):
            return success
        default:
            return nil
        }
    }
    
    var failure: Failure? {
        switch self {
        case .failure(let error):
            return error
        default:
            return nil
        }
    }
}
```

# おまけ
Successをさらに操作する定義など.
Barcodeよりもう少し抽象的なenumであれば実用的かも.

```Omake.swift
enum Barcode {
    case qr(String)
    case upc(Int, Int, Int, Int)
    
    var qrValue: String? {
        switch self {
        case .qr(let code):
            return code
        default:
            return nil
        }
    }
    
    var upcValue: (Int, Int, Int, Int)? {
        switch self {
        case .upc(let digit1, let digit2, let digit3, let digit4):
            return (digit1, digit2, digit3, digit4)
        default:
            return nil
        }
    }
}

extension ObservableType where Element: ResultType, Element.SuccessType == Barcode {

    func mapToQrCode() -> Observable<String> {
        compactMap { $0.success?.qrValue }
    }
    
    func mapToUpc() -> Observable<(digit1: Int, digit2: Int, digit3: Int, digit4: Int)> {
        compactMap { $0.success?.upcValue }
    }
}
```