OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails】ユーザー情報変更後投稿一覧ページに遷移する

現在作成中のポートフォリオでは、ユーザー機能にdeviseを利用しています。

今回はユーザー情報変更後、指定のページに戻る方法を学びましたのメモしておきます。

#registrations_controllerの設定
registrations_controller.rbで以下の部分のコメントアウトを外してください。

```registrations_controller.rb
def after_update_up_path_for(resource)
    # ここにページ遷移したいパスをいれる
    home_show_path(resource)
  end
```
私の場合はhome/showページに飛ばしたかったのでhome_show_pathと記入しています。

#routesの設定
次はルートです。
以下のように記述してください。

```routes.rb
as :user do
  get 'home/show',:to =>'devise/registrations#edit',:as => :user_root
end
```
asメソッドを使うと、どのリソースがルートかを伝えてくれるため、指定ページに簡単にリダイレクトしてくれます。

#まとめ
今回のパターンを含め、他パターンは公式で紹介されているのでそちらもぜひ参考にしてください。
【[How To: Customize the redirect after a user edits their profile](https://github.com/heartcombo/devise/wiki/How-To:-Customize-the-redirect-after-a-user-edits-their-profile)】

deviseは便利ですが結構複雑な印象があるので、色々試してなれていきたいです。

この記事が誰かの助けになれば幸いです。
ではでは。
GradleのプロジェクトをGitHub Actionsでプッシュ時にReleaseを作成&成果物をアップロードする

タイトル通りです。メモ代わり。

``` ..github/release.yaml
name: CI

on:
  push:
    tags:
    - v*

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2

    - name: Set up JDK 11
      uses: actions/setup-java@v1
      with:
        java-version: 11

    - name: Grant execute permission for gradlew
      run: chmod +x gradlew

    - name: Build with Gradle
    #適宜変更
      run: ./gradlew build

    - name: Zip
    #適宜変更
      run: |
        zip -j artifact ./build/libs/artifact.jar

    - name: Create a Release
      id: create-release
      uses: actions/create-release@v1
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:`github.GITHUB_REF` when a user pushes a new tag
        tag_name: $${{ github.ref }}
        release_name: Release ${{ github.ref }}
        prerelease: false

    - name: Upload a Release Asset
      uses: actions/upload-release-asset@v1.0.2
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      with:
        upload_url: ${{ steps.create-release.outputs.upload_url }}
    #適宜変更
        asset_path: ./artifact.zip
        asset_name: artifact.zip
        asset_content_type: application/zip
```
helm便利系コマンド


## リポジトリ

```
helm repo list
```

```
NAME     	URL
stable   	https://kubernetes-charts.storage.googleapis.com
local    	http://127.0.0.1:8879/charts
incubator	http://storage.googleapis.com/kubernetes-charts-incubator
```

## チャートの検索

```
helm search mysql
```

```
NAME                            	CHART VERSION	APP VERSION	DESCRIPTION
incubator/mysqlha               	1.0.0        	5.7.13     	MySQL cluster with a single master and zero or more slave...
stable/mysql                    	1.6.2        	5.7.28     	Fast, reliable, scalable, and easy to use open-source rel...
stable/mysqldump                	2.6.0        	2.4.1      	A Helm chart to help backup MySQL databases using mysqldump
stable/prometheus-mysql-exporter	0.5.2        	v0.11.0    	A Helm chart for prometheus mysql exporter with cloudsqlp...
stable/percona                  	1.2.0        	5.7.17     	free, fully compatible, enhanced, open source drop-in rep...
stable/percona-xtradb-cluster   	1.0.3        	5.7.19     	free, fully compatible, enhanced, open source drop-in rep...
stable/phpmyadmin               	4.2.12       	5.0.1      	phpMyAdmin is an mysql administration frontend
stable/gcloud-sqlproxy          	0.6.1        	1.11       	DEPRECATED Google Cloud SQL Proxy
stable/mariadb                  	7.3.9        	10.3.22    	Fast, reliable, scalable, and easy to use open-source rel...
```

## アーカイブのダウンロード

```
helm fetch stable/mysql
```

```
mysql-1.6.2.tgz
```

## チャート作成
テンプレートが作られる

```
helm create sample
```

## アーカイブ
自作してWebサーバに公開する時とか

```
helm package sample
```

```
~/D/tmp ❯❯❯ helm package sample                                                               ✘ 127
Successfully packaged chart and saved it to: /Users/yuta/Desktop/tmp/sample-0.1.0.tgz
```

## 構文チェック

```
helm lint sample-0.1.0.tgz
```

```
==> Linting sample-0.1.0.tgz
[INFO] Chart.yaml: icon is recommended

1 chart(s) linted, no failures
```

## yamlファイルの中身を表示

```
helm template sample-0.1.0.tgz
```

```
---
# Source: sample/templates/serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: release-name-sample
  labels:
    app.kubernetes.io/name: sample
    helm.sh/chart: sample-0.1.0
    app.kubernetes.io/instance: release-name
    app.kubernetes.io/version: "1.0"
    app.kubernetes.io/managed-by: Tiller
---
# Source: sample/templates/service.yaml
apiVersion: v1
```

### 外部公開されているChartのyamlを取得したいとき

```
~/D/tmp ❯❯❯ helm fetch stable/mysql
~/D/tmp ❯❯❯ helm template mysql-1.6.2.tgz
```

## chartをクラスタへインストール

```
helm install sample
```
『SQLアンチパターン』読書メモ

『SQLアンチパターン』を読みました。
https://www.oreilly.co.jp/books/9784873115894/
せっかくなので内容を残しておきます。

## 『SQLアンチパターン』とは
DB設計やSQLクエリでやりがちな悪手＝アンチパターンを取り上げ、それぞれに対して具体的な問題点と解決法を紹介する書籍。

## 個人的に重要だと感じた部分
### 1. データベース論理設計のアンチパターン（1～8章）
#### 2章 ナイーブツリー
Twitterのツイートにリプライがついて、そこにさらにリプライがついて……のような深さが無制限の木構造を、ノードに親ノードのIDを持たせる単純なテーブル構造で表すと、あるノードの子孫ノード全てを取るようなSQLが書けないというアンチパターン。
代替の設計として3つのモデルが紹介されていましたが、それぞれ一長一短なので、場面によって使い分けが必要です。

ただし、WITH句で再帰クエリを書けるRDBMSでは、親IDを持つ単純な構造でも上手くクエリを書くことができます。
書籍にはMySQLやSQLiteではサポートされていないとありますが、いずれも2020年現在の最新バージョンでは実装済みのようです。

#### 3章 IDリクワイアド
自然キーを利用できるはずのテーブルにも`id`のようなカラムを持たせてしまうアンチパターン。

個人的にWebアプリ開発はrailsから入ったので、idというカラムがあるのが当たり前だと思っていた節がありましたが、確かに交差テーブルにまでidがあるのは過剰ですね。

### 2. データベース物理設計のアンチパターン（9～12章）
#### 10章 サーティワンフレーバー
例えば「進行中」「完了」「保留」のような文字列が入る属性列を作る場合、ただの文字列型の列だと「東京」のような関係ない言葉も入れられてしまいます。
CHECK制約を使うと変更に弱かったり、RDBMS間で仕様が異なるので移植しにくいという問題があるのでアンチパターンとされています（ただしデータの選択肢に確実に変更がないならあり）。
利用可能なデータを別のテーブルに格納し外部キー制約を掛けるのが解決法で、これなら追加もINSERT文だけで良く、論理削除を使えば既存のレコードでは使えるが新規では使えないなど、柔軟な対応も可能です。

#### 11章 ファントムファイル
画像などのファイルをDBのカラムとして保存するか外部ファイルとして保存するか問題。
この本の筆者は以下の理由からDBに保存することを推奨しています。

- レコードの削除時にファイルは自動的に削除されない
- トランザクション分離ができない
- ファイルの削除後にロールバックしても元に戻らない
- バックアップを別で取る必要がある
- DBのバックアップとファイルのバックアップの間に更新される可能性もある
- SQLのアクセス権限がファイルには適用されない
- 外部キー制約のように存在するファイルへのパスのみを格納させることができない

### 3. クエリのアンチパターン（13～18章）
#### 14章 アンビギュアスグループ
GROUP BY句に出てこない列はSELECTできません。それが必要な場合はサブクエリやJOINを上手く使って解決します。

なんですが、最近のPostgreSQLではGROUP BYに主キーを指定すると、そのテーブルの他の値も一意で決まるためSELECTできます（[参考](https://qiita.com/eggc/items/6dbb598302309da87eea)）。
新しいPostgreSQLで開発したアプリを古い環境で動かそうとしてハマったことがあります……

#### 15章 ランダムセレクション
レコードをランダムに1行取ってくる、といえば当然のように`ORDER BY RANDOM() LIMIT 1`だと思っていましたが、これはアンチパターンらしいです。
確かに言われてみれば`ORDER BY RANDOM()`ってコスト高そう……

#### 16章 プアマンズ・サーチエンジン
LIKE検索や基本的な正規表現での検索はパフォーマンスもよくないし、単語単位での検索もできない場合があるので、本格的な検索は専用の全文検索エンジンに任せます。
各RDBMSの標準機能や拡張機能を使ったり、DBとは別の検索エンジンを利用する方法が紹介されています。最近だとElasticsearchとかも候補に上がるんでしょうかね。

### 4. アプリケーション開発のアンチパターン（19～25章）
#### 22章 シー・ノー・エビル
DBエラーのデバッグ時に、SQLそのものでなくSQLを組み立てるコードの方から見てしまうアンチパターン。
仕事でエラー調査を行うこともありますが、エラー発生時には問題のSQLがメールで送信される仕組みになっています。もしどんなSQLでエラーが発生しているかわからなければ、調査の難易度は格段に上がるというのは感覚的にもわかります。
初心者によるプログラミング学習ログ 242日目

#100日チャレンジの241日目
twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。

すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

242日目は、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>242日目<br>・youtubeで、webサイト模写<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E7%B9%8B%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアと繋がりたい</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1229497258644688896?ref_src=twsrc%5Etfw">February 17, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
helm3系のインストール

ver2までは、tillerというのを使っていたんだけどver3からは必要なくなったみたいで消された
これすごく悩んだ

## インストール

```
brew install kubernetes-helm
```

## チャート作成

```
helm create testchart
```

## インストール

```
helm install testchart --generate-name
```

出力結果

```
NAME: testchart-1581969101
LAST DEPLOYED: Tue Feb 18 04:51:43 2020
NAMESPACE: default
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
  export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=testchart,app.kubernetes.io/instance=testchart-1581969101" -o jsonpath="{.items[0].metadata.name}")
  echo "Visit http://127.0.0.1:8080 to use your application"
  kubectl --namespace default port-forward $POD_NAME 8080:80
```
Swiftでポートフォリオ的なもの作ってみたい。Part1

#はじめに
Swift触り始めて2日目
軽いポートフォリオ的なものを作りたいなと。
完成イメージはこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206053/0645e3ae-a8cb-9e58-acea-e5a2e0bb6ba4.png)

moreを押してさらに詳しい情報をみれたりする。（未実装）

早速やっていこう。

#環境
macOS Mojave ver10.14.6
Xcode 11.3.1
iPhone 11 iOS 13 (simulator)


#Projectの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206053/099e9353-9b97-dea6-5f1e-d5b4ca1d0277.png)
iOS->Single View App
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206053/2ddd1604-ef53-1368-5e8a-a41501b460a2.png)
ProductNameを書いてOrganization Indentifierを書いてNext
Createをしたら、初期コードが出てきます。

#実際にやってみよう！

```swift:Tutorial.swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        Text("Hello, World!")
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
```
ダブルクオートで囲まれた部分を変えればテキストが変えれます。

~~~swift:Tutorial.swift
struct ContentView: View {
    var body: some View {
        Text("Hello, World!")
            .font(.title)
    }
}

~~~
.font(.title)をつけることで上のTextに文字サイズの変更などを行えます。

#要素を追加しよう！
このままだと、Textが1行しか表示されないので・・・

~~~swift:Tutorial.swift
struct ContentView: View {
    var body: some View {
        VStack {
            Text("Hello, World!")
                .font(.title)
            Text("System Engineer")
        }
    }
}
~~~
VStackを追加してTextも1行追加しました
このVStackは<b>Vertical Stack</b>で囲われている要素を縦に配置するものです。
また別にHStackと言うものもあり<b>Horizontal Stack</b>、横並びに配置するものもあります。

なぜVStack、HStackを使うのか・・・
それは、1番上のTextの要素しか表示されないのです・・・
って解釈してます。

#途中経過

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206053/e717f5dd-6359-04c4-6cbf-71ba2013d2f3.png)

こんな感じ。
もうほぼ近い。

#まとめ
とりあえずここまで
次は画像入れるところやります。

ステータスバーみてもらえばわかると思うんですが、もう早朝4時なんです。眠いです。
おやすみなさい。
Excelのワークシートコピーで名前の定義やブック参照に煩わされない方法

普通に他のブックからワークシートをコピーすると「名前の定義」や「元ブックへの参照」とかがごっそり付いてきますが、「証跡として使いたいだけなのにうっとおしい！」という場合は下記の方法を。

# コード

コピー部分だけ。

```vb
    'Dim sWS as Worksheet 'コピー元
    'Dim dWS as Worksheet 'コピー先
    sWS.Cells.Copy
    With dWS.Range("A1")
        '一括ではPasteSpecialできないみたいです
        .PasteSpecial xlPasteFormats
        .PasteSpecial xlPasteColumnWidths
        .PasteSpecial xlPasteValuesAndNumberFormats
    End With
    'シート全部が選択された状態なってしまうので解除
    dWS.Activate
    dWS.Range("A1").Select
    'おまじない
    Application.CutCopyMode = False
```

# あとがき

枠線（≠罫線）を消したい場合は、

```vb
    dWS.DisplayGridlines = False
```

を追加で。
Donkey Car 物理シミュレーター作ってみた【お披露目編】

# ■ はじめに
常々AIを使ってみたいと思っていたところ、AIカーなるものがあることを知り、社内の勉強会に参加しました。
AIカー(Donkey Car)は、ラジコンカーをラズパイで操縦するものですが、ラジコンカーはそこそこのお値段しますし、何よりも走行コースにそこそこ場所が必要となります。手持ちの部材を組み合わせて、狭い場所で、いつでも実験できるようにできたらかぁと考え、ラジコンカーの物理シミュレーターを作ってみようと思い立ちました。
箱庭のようなコースにミニカーを走らせるとか。。。ン？　子供の頃、デパートの屋上で遊んだ「アレ」はどうだろうか。何度も遊んだ記憶はあるのに名前を覚えていないなんて。。。で、ネット検索して「アレ」は「[ミニドライブ](https://www.google.com/search?q=%E3%83%9F%E3%83%8B%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96+%E3%82%B2%E3%83%BC%E3%83%A0&sxsrf=ACYBGNR1U0vAJimogLw721NJbO6cKEm9bg:1581785577008&source=lnms&tbm=isch&sa=X&ved=2ahUKEwjonra7gtTnAhWEMd4KHbtxAuwQ_AUoAXoECAwQAw&biw=1503&bih=803)」という名前であることがわかりました。

# ■ ミニドライブとは
ミニドライブは、ベルトコンベアのような路面がスクロールして、ハンドルと連動した模型の自動車を操縦し、路面に沿って正確に操縦すると得点になるゲームです。アクセルが付いていて路面のスクロール速度が変わるものもありました。ミニドライブについては「ミニドライブ ゲーム」でググると画像や動画がたくさんみつかりますのでご覧ください。

# ■ Donkey Car 物理シミュレーターを作ってみよう
### 方針

- Donkey Carのアプリケーションには手を入れない
- configファイルの修正だけで動作すること
- 筐体から新規に作るので、段階的に作る
 
    **① 操舵の自動走行＋基本筐体**
　Donkey Carは、画像＋操舵角度＋速度のデータセットで学習させますが、第1段階では、画像＋操舵角度＋一定速度(固定値)で学習させて自動走行させます。ミニドライブの見た目から、路面の速度変化よりもミニカーが右往左往する方が面白いですし、物理シミュレーターなのでメカで作るべき部分です。また、メカ部分は調整後に固定する必要があるので、筐体の基本部分も作ります。路面は、固定画像では走行中の学習画像の変化がないので学習が難しいと思い、液晶ディスプレイで路面をスクロール表示させることにしました。
     **② 操舵＋可変速度での自動走行**
　路面のスクロール速度を可変にできるように対応します。Donkey Carの物理シミュレーターとしてはこれで完成です。
    **③ ミニドライブ化**
　自動走行は①②で完成しているので、ゲーム部分を作る予定です。主に得点系です。下３つは大分先になりそうですが。。。
 - 路面マークのセンシング
 - 得点のパネル表示
 - コントローラーのハンドル化 → 学習時に使うゲームパッドを筐体に付けたハンドルでの操作に変更
 - 路面の物理化 → ディスプレイ表示ではなくベルト式に変更
 - 操舵角度とミニカーの進行方向の連動 → 現状は平行移動なので不自然さをなくす

# ■ 第1段階でできたもの

**筐体部分はハリボテですが、①までできたものが↓これです。** 正面パネルの上に載っているのがカメラで、下を向いています。
![DSC_1952s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308714/ad00c95f-23fe-eec2-213f-f4c369f22429.jpeg)
**筐体を外すと↓こんな感じ。** サーボモーターでアームを左右に振って、スライダーで円弧動作を平行動作に修正しています。 **使用した部材や機構の説明は別記事でまとめたい** と思います。
![DSC_1951s.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308714/348a2498-7574-68cb-f4e7-7dab020d3fa1.jpeg)
**↓自動走行させた様子です。**
[自動走行の様子(Youtube)](https://youtu.be/ybA4eJdWWjc)

**キープレフトで走るように3000データセットで学習させたものです。** 撮影の為に自動走行時は天井灯がディスプレイに写り込まないよう、暗闇で撮影したので多少困惑した感じで走行しています。

---
いかがでしょうか。
もしかして、Donkey Carを(走行コース含めて)実験する物理環境としては世界最小ではないでしょうか?!
敢えてRubyで学ぶ「ゼロから作るDeep Learning」基本関数群

以下の関数群をRubyに変換してみる。
これを持って、次回以降、ニューラルネットを実装していく。

https://github.com/oreilly-japan/deep-learning-from-scratch/blob/master/common/functions.py

```ruby
require 'numo/narray'

def identity_function(x)
    return x
end

def step_function(x)
  grad = Numo::Uint32.zeros(x.shape)
  grad[x>=0] = 1
  grad
end

def sigmoid(x)
  1 / (1 + Numo::DFloat::Math.exp(-x))
end

def sigmoid_grad(x)
  (1.0 - sigmoid(x)) * sigmoid(x)
end

def relu(x)
  copy = x.copy
  copy[x < 0] = 0
  copy
end

def relu_grad(x)
  grad = Numo::DFloat.zeros(x.shape)
  grad[x>=0] = 1
  grad
end

def softmax(x)
  if x.ndim == 2
    x = x.transpose
    x = x - x.max(0)
    y = Numo::DFloat::Math.exp(x) / Numo::DFloat::Math.exp(x).sum(0)
    return y.transpose
  end

  c = x - x.max
  exp_x = Numo::DFloat::Math.exp(x - c)
  sum_exp_x = exp_x.sum
  exp_x / sum_exp_x
end

def sum_squared_error(y, t)
  0.5 * ((y-t)**2).sum
end

def cross_entropy_error(y, t)
  if y.ndim == 1
    t = t.reshape(1, t.size)
    y = y.reshape(1, y.size)
  end
  if t.size == y.size
    t = t.argmax
  end

  delta = 1e-7
  batch_size = y.shape[0]
  seq = Numo::UInt32.new(batch_size).seq(0,1)
  -(Numo::NMath.log(y[seq,true][true,t] + delta)).sum / batch_size
end

def softmax_loss(x, t)
  y = softmax(x)
  cross_entropy_error(y, t)
end
```
laravel クエリビルダ プレーンなselect文でカラム同士の足し算

こんにちは！

lravelでカラム同士の足し算がしたくていろいろやったけどうまくいかず、リファレンスを読んだところ便利なクエリビルダの方法があったので紹介します！

laravel6.x系です
紹介するコードを参考にするのであれば、データベースに対応するモデルが作成済みであることを前提とします！

```〇〇Repository.php
<?php

namespace App\Repositories\Cost;

use App\Models\Cost;
use Illuminate\Support\Facades\DB;

class CostRepository implements CostRepositoryInterface
{
    protected $cost;

    public function __construct(Cost $cost)
    {
        $this->cost = $cost;
    }

    /**
     * ユーザーの全ての情報+spendingの合計をゲット
     */
    public function getAllRecordByUser($user_id)
    {
        return $this->cost->select(DB::raw(' *, morning_spending + daytime_spending + night_spending AS spending_all'))->where('user_id', '=', $user_id)->get();

    }
}
```

ファイルはRepositoryですが、基本ファサードのDBをuseすればコントローラとかでも使えるはず

```
select(DB::raw('この中に記述したいselect文を記載'))
```

こうするとプレーンなsqlのselect文を記載することができます！

このクエリビルダで得られるsql文は

```
"select  *, morning_spending + daytime_spending + night_spending AS spending_all from `costs` where `user_id` = ?"
```

こんな感じになります

上のコードで得られるテーブル構造はuser_idカラムが引数で渡したuser_idの

|colmun1|colmun2|mroning_spending|daytime_spending|night_spending|spending_all|
|---|---|---|---|---|---|
|***|***|100|200|300|600|

のようなテーブル構造を得られます！

laravel使い始めてまだまもないですが、sqlベースで手っ取り早く値を取得したいときはプレーンなsql文を書いた方が楽ですね！

まぁ、クエリビルダをもっと勉強すれば、多分プレーンなsql文を書かなくてもできると思うのですが・・・
iOSのsafariでinput[type="file"]を見た目をいい感じにしたかった

Nuxt.jsで組んでいたアプリをiOS端末でデバッグしてみたらいい感じに動かなかったので、いろいろ探ってみて分かったことをメモ。

## 問題の起きたコード
とりあえずinputを非表示（`display: none`）にして、inputの代わりのボタンをクリックしたときに、非表示のinput要素をクリックするイベントを発火させるやつ。
<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="html,result" data-user="keyakko" data-slug-hash="ZEGWPmW" 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="image select(included bug)">
  <span>See the Pen <a href="https://codepen.io/keyakko/pen/ZEGWPmW">
  image select(included bug)</a> by keyakko (<a href="https://codepen.io/keyakko">@keyakko</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>

PCでは動く。
safariではいい感じに動かない。

## よくわからない動き
問題のコードでも、画像選択の画面は出てくるんですよね。
ただ、選択後に`onchange`のイベントが発火されない。（alertがでない)

試しにinput要素を表示して、inputの要素をクリックしたら当たり前のようにイベントは発火されてalertは出る。
JS経由でクリックさせて、ファイル選択させてもイベント発火されないのはなんで...？


## 対処
とりあえず今回の対処。

### 1. buttonとinputの要素の順番を変える
codepenにコード書いててたまたま気づいた。完全に知識不足。
<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="html,result" data-user="keyakko" data-slug-hash="ExjKJWo" 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="image select(fix pattern1)">
  <span>See the Pen <a href="https://codepen.io/keyakko/pen/ExjKJWo">
  image select(fix pattern1)</a> by keyakko (<a href="https://codepen.io/keyakko">@keyakko</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>

```html
<label>
  <button>アップロード</button>
  <input type="file" />
</label>
```


### 2. ボタンの上に透明にしたinput要素を乗せる
[Buefyのソース](https://github.com/buefy/buefy/blob/dev/src/scss/components/_upload.scss)が参考に。
<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="html,result" data-user="keyakko" data-slug-hash="oNXxOGa" 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="image select(fix pattern2)">
  <span>See the Pen <a href="https://codepen.io/keyakko/pen/oNXxOGa">
  image select(fix pattern2)</a> by keyakko (<a href="https://codepen.io/keyakko">@keyakko</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>


## さいごに
いろいろ探すと、`display:none`はちゃんと動かないから`width:0; height:0; overflow:hidden;`で対応しようねって出たりするけど、それではいい感じにならなかった。
最終的には対処方法の2番に行き着いた感じ。

話はそれるけど、iPhoneのsafariのコンソールが見たいのにsafariの開発タブにデバイスがすんなり表示されないの自分だけ...？
そっちでも苦しめられた...（[ここ](https://stackoverflow.com/questions/27060116/iphone-not-appearing-in-develop-menu-in-safari)を参考にWi-FiとBluetoothをオフにしたらなぜかちょっと表示されたけど）





<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
pyocr+tesseract+anaconda+win環境で詰まったこと

## はじめに

[解決した症状](#解決した症状)と同じエラー吐かれている人は無事にOCRでウハウハできると思われます
そうじゃ無い人もwindowsでanaconda使ってpyocrとtesseractをインストールしてウハウハできると思われます

## 解決した症状

```command
pyocr.error.TesseractError: (-1, 'Unable to find output file "日本語のディレクトリ名"...
```

## 背景
自前のPC（Mac）とDockerで動いていたOCRの環境をwindowsに移植する必要があった．

## 環境

動けばいいや，だったので基本的にうろ覚え
上の4つはすべて2020/02/17のlatestバージョン

- anaconda
- python3.XX
- pyocr
- tesseract
- windows：とりあえず64bitなのはたしか

## コマンド

次の順番で打っていけば大丈夫．（私はこの順でやっていきました）

```command
pip install pyocr
conda install --all
conda install -c conda-forge tesseract
```
## ここからが罠？

デフォルトでは，英語しか対応していない＆tesseractのconfigファイルがない？
（断言できないが，私のはこうだった）

1. anacondaのディレクトリを探す
2. tessdataディレクトリを探す
3. [公式](#https://tesseract-ocr.github.io/tessdoc/Data-Files)から言語ファイルをダウンロード
4. 解答してtessdata内に置く
5. configsがフォルダじゃなくてディレクトリなら[ここ](# https://drive.google.com/uc?id=)のファイルコピーして持っていってください
→このやり方が賢いかはわかりませんww

## おわりに

メモ書き程度にまとめたので，なにかあればおっしゃって下さい
少なくとも自分が調べた限り，全く同じ内容では記事がなかったので公開しておきます
AWS Certifired BigData Specialtyに今さら合格しました。

#いまさら受験した経緯
<a href= "https://qiita.com/Eine_Iris/items/53ec0200102ebbb263a9" >こちら</a>に軽々しく「受けましょうかね」と書いたものの、
2020年4月にAWS Cetified Bigdata Specialtyの試験がなくなるとはつゆ知りませんでした。
情弱ですね。

## 受験した感想
結論から言うと、非常に受験してよかったと思っています。
Hiveとか、Prestoとか、業務ではあまり触らない仕組みについてハンズオンを行うことで、エンジニアとして多少レベルアップできたかなと思います。普段はあまり触れることがないKinesisやEMRについても理解が深まりました。
あと2か月ほどでこの試験はなくなってしまいますが、勉強して無駄なことは一切ないと思います。

## AWS認定資格　取得状況
こんな感じ↓
ソリューションアーキテクト - アソシエイト (2017年10月)
SysOpsアドミニストレーター - アソシエイト (2017年11月)
デベロッパー - アソシエイト (2019年2月)
セキュリティ専門知識 (2019年7月)
ソリューションアーキテクト - プロフェッショナル (2019年9月)
DevOpsエンジニア - プロフェッショナル (2019年12月)
ビッグデータ専門知識 (2020年2月)

##試験受験～感想
今回は東銀座の歌舞伎座でした。
ちなみに、DevOpsスペシャリスト以外は歌舞伎座で受験しています。
理由は以下の通りです。

- 駅直結。雨が降っていても気がめいらずに受けに行ける。
- 本人確認が楽。チャットとか、ない。
- ウォーターサーバーがある（！）
- トイレがきれい（！）

なお、午前中に受験しました。

## 勉強方法 
Udemyの講座とQiitaの以下の記事をなめるようにして読みまわした後、不明な点はハンズオンを行いました。
参照したQiitaの記事は以下の通りです。
本当に勉強になります。

<a href= "https://qiita.com/ieiringoo/items/6db077210eeea1c74c9d" >AWS認定Big Data勉強記 - 10: 合格しました</a>
こちら、本当に勉強になります。各サービスについてわかりやすくまとまっていました。

<a href= "https://qiita.com/yShig/items/500d4139efed91bc432d" >[AWS]kinesisまとめ</a>
Kinesisはハンズオンしても正直わかりにくかった部分がありますが、
この記事をなめるようにして読みました。本当にわかりやすいです。

Udemyはこちらを勉強しました。
https://www.udemy.com/course/aws-big-data/
わかりやすいと思います。

また、<a href= "https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/" >ブラックベルト</a>で3回以上読み込んだサービスは以下でした。本番でもたくさん出てきました。
・Kinesis
・Redshift
・QuickSight
・Aurora
・DynamoDB

## 本番で悩んだところ
- SQS vs Kinesis

→ずーっと悩みました。最後は勘。
SQSについてもっと勉強しておけばよかったです。

- DMSによる移行 vs DMS + SCTによる移行 

→こんなんで悩むとはまだまだだと思われるかもしれませんが…
悩みましたorz

以上です。
次は高度なネットワーキングでも受験してみます。
Railsのannotateでハマった話

### ハマったところ
Railsでannotateのgemを入れて

```
group :development do
  gem 'web-console',           '3.5.1'
  gem 'listen',                '3.1.5'
  gem 'spring',                '2.0.2'
  gem 'spring-watcher-listen', '2.0.1'
  gem 'pry-byebug'
  gem 'annotate'
end
```
インストールしたのに

```
bundle install
```

annotateコマンドが反映されない，なぜか

```
$ bundle exec annotate
// なにも結果が帰ってこない
```

### こうやって解決
Railsのプロジェクトに明示的に導入しないと使えないみたい．

```
$ rails g annotate
// これでannotateできるようになった
```

gemがinstallされていることと，今作業しているプロジェクトで使えることは別モノだということに気づけた．
VRをノリで買って、Amazon Sumerianで遊んでみた

## 概要
ノリでVR(Oculus Quest)を買ってみたので、Amazon Sumerianで遊んでみた。
結論、Unityよりはマシだけど、ううむ、ムズイ…。


## 参考サイト
ここら辺を参考にやってみた。

- Oculus Questを買ったのでAmazon SumerianでVR世界に飛び込んでみた
https://dev.classmethod.jp/cloud/aws/0702diveintovrworld/

- Amazon SumerianでRoll a Ballを作ってみた
https://qiita.com/mechamogera/items/ce4cb2181340b5f36c76


## Output
https://6ab30cb5a982452cb4f54a03be63373c.ap-northeast-1.sumerian.aws/?

うーむ…「剛体＆衝突あり」にしてるのに球体がすべて即座に重力で落ちていく…。
参考どおりにしてるのに、イミフ。


## 結論
- VR楽しい。
- VR依存はまずい。本当に歩くのがめんどくさくなってしまう。
  
- VRコンテンツ、これを遊びでない何かに出来るのかしらん。
  リハビリにも利用されているとか。人間の脳って単純で良い。
  https://lipronext.com/blog/vr-rehabilitation/
晒したくない情報をgithubに間違えてpushしてしまったときの復旧メモ

# 状況
First-Commit ← 見せたくない情報が混じっている
Second-Commit ← README.md を足しただけ

# 概要
まずは Second-Commit をなかったことにして、直前のcommitが First-Commit になるようにした。
次に、 First-Commit のファイルに上書きcommitして見せたくない情報を消した。

# 行った操作
Second-Commit をなかったことにする

```
$ git reset --hard {First-Commitのハッシュ値}
HEAD is now at {First-Commitのハッシュ値} First-Commit
$ git push -f origin master
Total 0 (delta 0), reused 0 (delta 0)
To github.com:{ユーザ名}/{リポジトリ名}.git
 + {Second-Commitのハッシュ値}...{First-Commitのハッシュ値} master -> master (forced update)
```

First-Commit のファイルに上書きcommitする

```
(ファイルを編集して、見せたくない情報を消してから)
$ git add {例のファイル}
$ git commit --amend --no-edit
$ git push -f origin master
```

Second-Commitで作ったREADME.mdを作り直す(手順省略)

# 備考
一見うまく消えたように見えるが、もとのハッシュ値を直接指定されると元のデータが見えてしまうらしいので、ガチの個人情報やら機密情報やらをpushしてしまった場合はこの手法では不十分。
パスワードやキーをpushしてしまった場合はパスワードの変更やキーの再生成を必ず行う。

また、今回たまたまSecond-Commitの内容が大したことなかったのでこの手法が使えたが、commitを積み重ねたあとで結構前のcommitにまずいものが見つかった場合などはこの手法は現実的ではない。

gitもgithubもほぼ使っていないド素人なので、[機密データをリポジトリから削除する - GitHub ヘルプ](https://help.github.com/ja/github/authenticating-to-github/removing-sensitive-data-from-a-repository)の内容はよくわからなかった。

# 参考
[github に誤ってしたpushとcommit履歴を取り消したいです - teratail](https://teratail.com/questions/86068)
[[git] 直前のコミットメントに無理矢理コミットを追加する方法](https://blog.norioegi.com/git-commit-amend-no-edit)
【Django】Build web apps　～1章：プロジェクト作成～

## 以前準備
### Install pip
`sudo easy_install pip`
`sudo pip install --upgrade pip`
### install django2.2
`pip install django==2.2`
## Django project 作成
### create project
`django-admin startproject [project_name]`
### run
[project_name]へディレクトリし、次のコマンドを実行する
`python manage.py runserver`
デフォルトリンクは http://localhost:8000/
### Projectの仕組み
[project_name]

1. [project_name]
    1. settings.py
    2. urls.py
    3. wsgi.py
2. db.sqlite3
3. manage.py

## Django app 作成
### create app
`django-admin startapp [app_name]`
or
`python manage.py startapp [app_name]`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581348/770bc664-6c29-b978-fd83-ada65a818d43.png)
### Appの仕組み

[app_name]

1. migrations
2. admin.py
3. apps.py
4. models.py
5. tests.py
6. views.py

## 関連記事
[・【Django】Build web apps　～2章：ViewsとURL Patterns～](https://qiita.com/huong/items/22ef5de404a6f823602b)
[・【Django】Build web apps全章で使ったコマンド](https://qiita.com/huong/items/cfcb338db55957925e39)
axiosでエラーになった時のリトライ処理をinterceptorsで実行する



## TL;DR

エラーオブジェクトにリクエスト時の設定が含まれているので、これを `axios.request` メソッドに渡す事で再実行することが出来ます

```js
import axios from 'axios'
const client = axios.create({ baseURL: 'https://hoge.example/api/v1/' })

client.interceptors.response.use(
  (response) => {
    return Promise.resolve(response)
  },
  (err) => {
    // json文字列になっているままだとエラーになる為
    if (typeof config.data === 'string') {
      config.data = JSON.parse(config.data)
    }

    return axios.request(err.config)
  }
)
```

## リトライの無限ループ対策

configにプロパティを追加して、リトライ回数を見るように実装しました

```js
import axios from 'axios'

const LIMIT_RETRY_COUNT = 2

client.interceptors.response.use(
  (response) => {
    return Promise.resolve(response)
  },
  (err) => {
    if (config.retryCount > LIMIT_RETRY_COUNT) {
      return Promise.reject(err)
    }

    if (Number.isInteger(config.retryCount)) {
      config.retryCount += 1
    } else {
      config.retryCount = 1
    }

    return axios.request(err.config)
  }
)
```

ただしaxiosのv0.19.0ではこのやり方(custom config）が効かなくなっているので、もしこのバージョンを使用している場合はバージョンを上げる必要があります。
0.18系は問題ありません。
ivyインターフェイスを用いたispell/aspellに基づく英単語補完

かなり前の記事に、ispell / aspell による英単語補完をhelmインターフェイスを使って実装した話があった。

- http://syohex.hatenablog.com/entry/20131123/1385184659

今回はそれをhelmでなくivyで実装したわけである。英語アルファベット３文字以上を入力して、`M-x ivy-ispell` とすれば補完が走る。適当なキーバインドをアサインするのも一興だろう。ちなみにバイナリはispell/aspell/hunspellのどれかを用意しておく必要がある (cf. `ispell-program-name`)。

```emacs-lisp
(require 'ispell)
(require 'ivy)
(require 'thingatpt)

(defvar ivy-ispell--word-at-point nil)

(defun ivy-ispell--case-function (input)
  (let ((case-fold-search nil))
    (cond ((string-match-p "\\`[A-Z]\\{2\\}" input) 'upcase)
          ((string-match-p "\\`[A-Z]\\{1\\}" input) 'capitalize)
          (t 'identity))))

(defun ivy-ispell--compare-length (a b)
  (< (length a) (length b)))

(defun ivy-ispell--make-candidate ()
  (let ((input (downcase ivy-ispell--word-at-point))
        (case-func (ivy-ispell--case-function
                    ivy-ispell--word-at-point)))
    (when (string-match-p "\\`[a-z]+\\'" input)
      (mapcar case-func
              (sort (ispell-lookup-words (concat input "*")
                                         ispell-complete-word-dict)
                    'ivy-ispell--compare-length)))))

(defun ivy-ispell ()
  (interactive)
  (setq ivy-ispell--word-at-point (thing-at-point 'word))
  (if (not ivy-ispell--word-at-point)
      (message "Nothing to complete.")
    (let ((candidate (ivy-read "Completion: "
                               (funcall 'ivy-ispell--make-candidate)
                               :initial-input ivy-ispell--word-at-point))
          (curpoint (point)))
      (backward-word 1)
      (delete-region (point) curpoint)
      (insert candidate))))

```

動作例
"nece"と入力し、ivyインターフェイスで絞り込みを行って"necessarily"を入力している様子。
![ezgif-2-a058b0cde611.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25380/fd4faf1c-1515-79e7-1b46-6e66ee13ec95.gif)
flexboxを使用してグリッドレイアウトを実装することになった僕

## 今日の内容について

これは、2ヶ月前くらいの話です。
IE対応でflexboxを使用してグリッドレイアウトを実装することになった僕がいました。

自分で考えてやってもできるが
「考えるの面倒くさいし調べてコピペしよー」と思い、
**「flexbox grid layout」「display:flex grid layout」**と検索していたがflexboxとcss gridの使い分けの記事ばかりでした。

なので、
**「自分と同じ、めんどくさがり屋の人にこの記事を残そう」**ってことです。
(つまり、「flexbox grid layout」「display:flex grid layout」で検索したら見つかるといいね)



## 書いてみた。



<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="html,result" data-user="pokocy" data-slug-hash="eYNZRBN" 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="grid-layout">
  <span>See the Pen <a href="https://codepen.io/pokocy/pen/eYNZRBN">
  grid-layout</a> by pokocy (<a href="https://codepen.io/pokocy">@pokocy</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
Azure Functions PowerShellで blobコンテナへの書き込み

## 概要

気がつけばAzure FunctionsでPowershellがGAされていて、
[Azure Functions の PowerShell 開発者向けガイド](https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-reference-powershell)を読んでたら依存関係にAzライブラリの記載があったので、
Functions上でAzコマンドが使えるのか確認。

## 目次

1. 今回やること
2. 準備
3. コード
4. 結果
5. 次にやること(予定)

## 今回やること

Azure Functions(PowerShell)をデプロイして、
FunctionsからAzure Storage AccountのBlobコンテナにファイルをアップロードする。

また、Azコマンドを使う際にUser/Passは使いたくないので、
Managed Identity(MSI?)でFunctionsに対して権限を付与する。

## 準備

1. こんな感じに設定してAzure functionsをデプロイ
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407754/eb66952b-c709-3bbe-ba8c-a37b57bf2cc6.png)

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407754/0a6446f5-c9bb-1279-6b2e-3651b9e701ba.png)


2. ID機能？を有効にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407754/eb799589-654b-79d5-0f9a-04a9a2cbf4eb.png)

  - statusをoff→onへ
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407754/f656726a-c74c-9b30-a955-6dc523068b6e.png)

  - 確認がでるのでYesを
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407754/a9238884-8c93-d51f-a8ee-eca6f3df5b85.png)

3. さっき作ったSubscriptionからFunctionsに権限を割り振る。  
   今回はとりあえずOwnerに  
   （Functionsを作り直したので名前が変わっています）
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407754/2dc9a188-2373-e50a-e98b-678d01d17223.png)

## コード
適当に書く。
確認をし易いようにHttpTrrigerで
適当に現在日時をBlobコンテナに書き込む

```powershell
using namespace System.Net

# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)

# Write to the Azure Functions log stream.
Write-Host "PowerShell HTTP trigger function processed a request."

# Interact with query parameters or the body of the request.

(get-date) > .\date.txt

Connect-AzAccount -Identity

(Get-AzSubscription)[0]| Select-AzSubscription 

$storageName = "hogehoge"
$storageAccount = Get-AzStorageAccount | ?{$_.StorageAccountName -eq $storageName}  
$storageAccount | Get-AzStorageContainer  | ?{$_.name -eq "logs"} |Set-AzStorageBlobContent -force -File .\date.txt


# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = [HttpStatusCode]::OK
    Body = "end"
})

```

## 結果
書き込みができた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407754/fd92c0b4-99e4-9b5c-29aa-c88569703866.png)

結構簡単に書けたのでローカルで動かしてるPowerShellをFunctionsに移植できそう。

## 次にやりたいこと

 - CustomRoleの作成  
     FunctionsにOwner権限を割り当てているので必要最低限の権限だけつけたい   
 - ARM templateの記述  
     Storageとか停止できないサービスを使うときだけ使いたい。
 - Functions上でAzコマンド実行時のNW経路
     調査方法の検討つかないけど、いつか確認したい。
Pythonでの機械学習の環境構築にAnacondaはいかがでしょうか

# 主張
ほぼタイトルで完結しています。
Anacondaでは余計なパッケージが多すぎるという場合には、Minicondaで必要なパッケージだけをインストールすればいいと思います。

# 主張の理由
定期的に初心者向けにPythonの環境構築の記事が投稿されています。
そして、その多くで一緒にTensorflowかPytorchもインストールしていると思います。

環境構築で問題になるのがCUDAです。
CUDAのバージョンとTensorflowやPytorchのバージョンを正しく選んでインストールする必要があります。

これは、以下のような面倒くささがあると思います。

- 単純に対応するバージョンを調べてインストールするのが面倒くさい
- ついでにCuDNNのインストールも面倒くさい
- 迂闊にTensorflowやPytorchのバージョンを上げられない
- 複数のバージョンのTensorflowやPytorchを切り替えたい場合にCUDAのバージョンの切り替え（パスの設定）が面倒くさい

Anacondaではこれらの面倒くささを解決してくれます。

# Anacondaがお勧めの理由
## Pythonのパッケージと一緒にCUDAもインストールできる
TensorflowやPytorchの依存するパッケージとしてCUDAも紐付けられているので、適切なバージョンが自動的に選択されてインストールされます。
また、CUDA以外にもgitやcmakeなどのツールもインストールできるので、ルート権限がない場合にも重宝します。

## 仮想環境ごとCUDAのバージョンも切り替えられる
複数のPythonの環境を共存させるための仮想環境の機能がAnacondaにもあります。
Anacondaを使うとCUDAがその仮想環境の内側にインストールされるので、複数のCUDAの環境を共存できます。
この時、CUDAのパスの設定で苦しむことはありません。

# Anacondaがダメかもしれない点
## pipを使うと環境が壊れる場合がある
pipでインストールしようとした仮想環境だけでなく他の仮想環境も一緒に壊れるようです。
そのため、pyenvで仮想環境を作ってその上でAnacondaをインストールすべきという主張もあります。
（pyenvでは各仮想環境は完全に独立だが、Anacondaでは仮想環境にインストールされたパッケージがハードリンクされているために他の仮想環境にも影響するという違いがあります。）

ちなみに私はpipで環境が壊れたことはありませんが、Anacondaのパッケージマネージャcondaのバグで環境が壊れたことがあります。

## ライトユーザーには過剰かもしれない
大学や会社でそれなりにTensorflowやPytorchを利用する人が対象ということでお願いします。

## 他のパッケージマネージャの方が優れているかもしれない
pyenvやpipenvなどがありますが、それらについては全く調査していません。
もっといい方法があるという場合は、是非ともご教授お願い致します。

# 最後に
意見、反論、コメントなどいろいろ歓迎です。
特に、繰り返しになりますが、もっといい方法があるという場合はコメントか記事の投稿をお願いします。
初心者のうちに知っときゃよかったCSSセレクター

#今回の話って誰向き？
この記事の内容は、CSSセレクターを初めて使う人、初心者にはぜひ見てほしい...
(初心者じゃなくても復習がてら見ていただきたいです。)

今になって、初めてCSSセレクターを使用したときに、
**知っていればよかった**
**知っていたがこんなに使用するものだと思っていなかった**
と感じたものを紹介していきます。

#CSSセレクター３つ紹介
今回、紹介するものは３点！
1.`.A.B`
2.`.A:nth-child()`
3.`.A + .B`

では、さっそく...

###1.`.A.B`
こいつ、すごい出てきたんですけど、そんなに重要なものだと思っていなかった。
君の存在は知っていたんだよ....

何がめちゃめちゃ使えるポイントかって？
とりあえず使用例を見てみようー.........


```css

.button {
  width: 200px;
  background-color: red;
  border-radius: 4px;
}

.button.is-small {
  width: 100px;
}

.button.is-large {
  width: 300px;
}

.button.is-blue {
  background-color: blue;
}
```

`.button`にクラスを一つ追加するだけで大きさや背景色を変更することができる。
また、`.button.is-small`とクラス名が２つ続いていたら、`.button.is-small`の`width: 100px;`が適用される。(`.button`の`width: 200px;`は上書きされてるよ。ディベロッパーツールで見たら~~width: 200px;~~ってなってる。)


###2.`.A:nth-child()`

```html
<div class="box">
  <p>サンプルテキスト<p>
  <p>サンプルテキスト<p>
  <p>サンプルテキスト<p>
</div>


<style>
.box:nth-child(2) {
  font-size: 20px;
}
</style>
```

上記の例では`.box`の2番目の子要素のみにスタイルを適用することができる。

`:nth-child()`　←( )内に記載する値によって、該当箇所のスタイルを変更することができる。

[詳しくはこちら](https://developer.mozilla.org/ja/docs/Web/CSS/:nth-child)


###3.`.A + .B`
こいつを知ったときはマジですごいと思った。
使用例は

```html

<ul class="box-list">
  <li class="box-list-item">
    <div class="box"></div>
  </li>
  <li class="box-list-item">
    <div class="box"></div>
  </li>
</ul>

<style>
.box-list-item + .box-list-item {
 margin-top: 30px;
}
</style>
```

`.box-list-item`の後に`.box-list-item`が書かれてたら、`margin-top: 30px`をとる。

CSSを勉強し始めの時に、覚えておけばもっと楽に実装できた箇所があったかもしれない。。。。
基本情報技術者試験の勉強計画　第18週（2/17週）

## 目標と結果
### 目標
・自分で理解できそうな問題を見つける
・毎日継続する
### 結果
・表計算で理解できるところがあった
・毎日継続した
## 振り返り
### keep
・毎日継続すること
### problem
・ある程度の時間を作れないこと
### try
・長く時間をとれる日を見つけて理解を深めること
Irisデータを使ってAutoencoderを試してみた

# 目的
前回Autoencoderを使って直線回帰がうまくできたので、今回は”みんな大好き”irisデータを使って試してみたいと思います

#内容
IrisデータのTarget毎に別々の特徴量データフレームを作り、それぞれを使ってAutoencoderを作り、入力と出力の差分からTarget（つまり同じ種類のIris）の違いを識別できるかの確認
イメージとしてはAutoencoderによる故障検知をIrisを使ってやるということです

#コード
初期設定

```python:iris_autoencoder.ipynb
import seaborn as sns

from sklearn.datasets import load_iris
from keras.models import Sequential
from keras.layers import Dense
import pandas as pd
import numpy as np

iris=load_iris()

X=pd.DataFrame(iris["data"])
y=iris["target"]
Xa={}
Xa[0]=X.loc[y==0]
Xa[1]=X.loc[y==1]
Xa[2]=X.loc[y==2]
```

モデル定義と可視化関数

```python:iris_autoencoder.ipynb
def engine(j):
    encode_dim=2
    hidden_dim=50
    model=Sequential()
    model.add(Dense(hidden_dim,input_dim=X.shape[1]))
    model.add(Dense(encode_dim))
    model.add(Dense(hidden_dim))
    model.add(Dense(X.shape[1]))
    model.summary()

    model.compile(optimizer="adam",loss="mean_squared_error")

    model.fit(Xa[j],Xa[j],epochs=500,
              batch_size=150,verbose=0)

    import matplotlib.pyplot as plt
    for label in range(3):
        plt.scatter(Xa[label].iloc[:,0],Xa[label].iloc[:,1],label=label)
    pred=pd.DataFrame(model.predict(X))
    plt.scatter(pred.iloc[:,0],pred.iloc[:,1])
    plt.legend()
    plt.show()
    delta=pred-X
    for label in range(3):
        delta1=delta.loc[y==label]
        plt.scatter(delta1.iloc[:,0],delta1.iloc[:,1],label=label)
    plt.legend()
    plt.vlines([0],ymax=2,ymin=-2)
    plt.hlines([0],xmax=2,xmin=-2)
    plt.savefig("fig_1_"+str(j)+".png")
    plt.show()

    norm=[]
    for i in range(len(X)):
        norm.append(np.linalg.norm(delta.iloc[i,:]))
    norm=pd.DataFrame(norm)

    for i in range(3):
        normd=norm.loc[y==i]
        sns.distplot(normd)
    plt.savefig("fig_2_"+str(j)+".png")
    plt.show()
```

実行部分

```python:iris_autoencoder.ipynb
for i in range(len(Xa)):
    engine(i)
```

#実行結果と考察

下のヒストグラムは、入力ベクトルから出力ベクトルを引き算してノルムから算出したものです（要するに誤差の距離のヒストグラム）。みてわかる様にターゲットのみを学習しているので、ターゲットは比較的に0に近い値となり、それ以外のデータは距離が離れているのがわかります
なので、この程度はっきりした特徴量の差があればAutoencoderを使って故障検知ができると言えます。
この場合で言うと異なる種類の花の特徴量が混じっていればそれを指摘できると言うことになります



![fig_2_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517750/5e2d7c74-3b37-506b-4505-24a468c5fd85.png)
ターゲットは青です
![fig_2_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517750/39e8132e-c70d-87d6-92b2-d24bc9d257b6.png)
ターゲットはオレンジです
![fig_2_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517750/774ff558-f527-5b4b-4522-28eb4c650170.png)

ターゲットは緑です
macOS Mojave にしたらJupyter Notebook が起動しなくなった件。


# はじめに

久しぶりに、Jupyter notebookを起動しようとしたら、以降にRedirectが進まない。

# 調べてみた

- 設定ファイル
- ポートが起動していないのか。(いやでも、起動してなかったら早々に繋がりませんが出るはず。)
- anaconda ぶっ壊れた? でもanaconda 使ってるけど殆どpipで入れてる。

色々試したんですが、結局 macOS Mojaveにアップデート後にlocalhost の設定が書き換わっていたのが原因っぽい。

(この辺りあんまり詳しくないんですが、)今までは、`localhost = 127.0.0.1`が成立していたんだが、ここをなぜか許さないような設定に変わってしまった模様。そして、localhostは特定のポートからしか許してない(?ちゃんと調べてないけど) のか、
アクセスできず・・・。

# 結論

`jupyter_notebook_config.py`のipアドレス指定を, `127.0.0.1`にしたら治った。
JavaとGoの値渡し/参照渡しを整理する

自分はこれまでにJava, Goを勉強してきた。この二言語における値渡し/参照渡しをここで整理してしまう。

# そもそも定義

* `値渡し`(call by value): メソッドの引数に、新たに値のコピーを作って渡す方法のこと。
* `参照渡し`(call by reference): メソッドの引数に、変数そのものの参照を渡す方法のこと。

# Javaの場合

* メソッドへの引数は100%`値渡し`で渡される。
* が、Javaのオブジェクトが変数に収納されている時、そこに収納されているのは「そのオブジェクトが収納された場所を示す`参照値`(reference value)」である
* よって、オブジェクトを引数として渡すときにはその`参照値`(reference value)のコピーが渡されている。
* この結果、「引数に渡したオブジェクトが参照渡しで書き換えられている」かのように勘違いしそうになる。

# Goの場合

* ポインタを引数として渡すことで`参照渡し`を実現する。
* Golangの構造体/Arrayは(Javaのオブジェクトとは違って)`値型`。すなわちその全てのフィールド/要素を収納する場所を確保し、それを構造体を表す変数に収納しているイメージ。
* よって構造体を`値渡し`すると、そのフィールドの全てがコピーされる。これを書き換えても元の構造体は書き変わらない。
* 一方で、map/sliceは(Javaのオブジェクトと同様)`参照型`。すなわち変数に入っているのは要素のポインタが入った容器であり、各要素にアクセスするにはポインタを辿っているイメージ([参考](https://christina04.hatenablog.com/entry/2017/09/26/190000))。
* このため、これらを`値渡し`したとしても、元のmap/sliceが書き換わってしまう。よって、普通これらを`ポインタ渡し`する意味はなく、普通そうしない([参考](https://qiita.com/ruiu/items/e60aa707e16f8f6dccd8))。

# 補足
* `参照渡し ≒ ポインタ渡し`であるかのように書いたが、そこの細かいところは[こちら](https://qiita.com/agate-pris/items/05948b7d33f3e88b8967)に詳しい。
* `値型`/`参照型`の説明は正確ではないかもしれないのであくまでイメージとして捉えてほしい。

# 参考
* [もう参照渡しとは言わせない](https://qiita.com/mdstoy/items/2ef4ada6f88341466783)　(だいぶ参考にさせていただきました)
* [Goの値型と参照型](https://qiita.com/celclow/items/4ff8828727f0b1d9afee)
javascript基礎

## 変数

`var` 変数 → ES6から `let` 変数、`const` 変数

## 配列

```js
let list = [.....]
console.log(list)
```

## オブジェクト

```js
let obj = {}
```

## for文　繰り返し

```js
for(let i = obj. <回数 ; i += 1>) {
}
```

## function文　

```js
function　関数名(引数) {
}
```
引数はなくても()はいる
ec2インスタンスを停止して起動したら中身が別物になった

###問題発生の経緯

ec2インスタンスがメンテナンスのため再起動すると通知があった。
そのため、事前に影響を調査してインスタンスを停止・起動すると中身が別のものになってて動いていたサービスが動かなくなってしまった。


### 原因
起動時のデバイスの自動マウントはetc/fstabで設定できる。

設定内容はこんな感じ(一部省略)

```
LABEL=/         /             ext3  defaults    1 1
```

このLABELというのはe2labelでデバイスをラベルにマッピングできる機能を使っている。
例えば以下のように設定したら/dev/sda1というデバイスをLABEL=/hogeという形で参照できる

```
e2label /dev/sda1 /hoge
```

問題の原因は停止・起動前に、別のデバイスへ/のラベルをe2labelで割り当ててしまってそのまま放置していたことだった。

EBSで別ボリュームをec2インスタンスにアタッチ → e2labelで別ボリュームにラベルを割り当てる → メンテナンス時に停止・再起動しサーバーの中身が別物になったように見える。

### 対応

mountコマンドでec2インスタンスにアタッチされていたボリュームをマウントし、中身を確認後、元々ルートにマウントされていたデバイスに再度e2labelで/のラベルを割り当て直した。
その後はec2インスタンスを停止・再起動して元に戻った。


### 反省点
今回の直接的な原因はe2labelでラベルを割り当て直してそのまま放置していたことである。
作業ログを残していれば原因がすぐ分かったし、作業内容を忘れていたのがまずかった。

後は不要なボリュームをec2にアタッチしていたまま放置していたのもよくなかった。
ここら辺の無駄なリソースはきちんと整理して置かないと後で、必要・不要の判断ができなくなってしまうし、今回のような問題につながってしまうこともある。
FormDataでオブジェクトの階層があるデータを送る

## 概要
`multipart/form-data`形式で、JavaScriptからPostを投げる場合、FormDataを使うケースがあると思います。例えば、RailsのStrong Parametersに対応（Strong Parametersについては[【Rails】requireとpermitメソッド](https://qiita.com/morikuma709/items/2dc20d922409ae7ce216)参照）するなど、FormDataをオブジェクトの階層形式で送る場合の対応方法について記載します。
なお、FormDataの使い方については[FormData は multipart/form-data で application/x-www-form-urlencoded は URLSearchParams](https://qiita.com/Jxck_/items/769766853a90b7b435b0)にてまとめられています。

## サンプルデータ
Json形式で下記の通り表現すると、parantObjectの配下にparamが存在するケースになります。

```sample.json
{
  "parantObject" : {
    "name1": "value1"
  }
}

```

## 対応方法
以下の通り、FormDataに入れる変数名を`親オブジェクト名[子の変数名]`の形式で、登録することで親子関係の認識をします。

```sample.js
form.append("parantObject[name1]", "value1");
```

## その他参考
* 配列を送信したい場合、[axoisにFormDataを使ってArrayデータを送信する](https://qiita.com/k5690033/items/717f280266dee3e1f741)が参考になります。ちなみにオブジェクト配下の配列項目を送りたいときは、`親オブジェクト名[子の配列変数名][]`で送信します。
* [axiosでFileオブジェクトを含むデータをFormDataに変換する共通処理](http://imejin.biz/magazine/axios-transform-to-formdata/)で、オブジェクトをFormDataに変換するロジックが紹介されています。
PebbleSDK on Ubuntu on WSLでエミュレータを動かす

## これはなんですか？
素人が[WSLのUbuntuにPebble-SDKの構築に成功](https://qiita.com/221fu_nibo/items/68e7e5302f9566c0ff1c)したので、
今度は`pebble install --emulator basalt`を動かしてみます。
**素人発言・知識が山積みです。私みたいにプログラムのプの字も知らない人でもPebbleウォッチに触れられる解説を目指したい。**

## 動かす環境
* windows10 Education 64bit 1909 build18363.535（実質Proと違い無いはず・・・？
* WSL
* Ubntu18.04LTS
* Pebble-SDK4.5 w/ SDK-core4.3
* [VcXsrv1.20.6.0](https://sourceforge.net/projects/vcxsrv/)

## 手順と参考にしたもの
素人なので正直なところこのソフトウェアが何を意味するのかほとんど分かってないですが、XサーバーというものでLinuxがグラフィックを描画する際に、その機能を代替させるらしいですね。
わからないことだらけなので、Qiitaとかredditから色々断片を拾ってきてなんとか動作にこぎつけました。
そもそもこの記事いる？

## Windows側でインストール
**Windows側での作業です。**
[VcXsrv](https://sourceforge.net/projects/vcxsrv/)インストーラーをダウンロード。
緑色のボタンをクリックすれば、ダウンロードページに飛んで数秒でダウンロードが始まります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573787/bf7fbda7-087f-afde-1afd-4b36027d722b.png)

インストーラーについては略、基本的に右下のNextをクリックしてれば終わります。

## VcXsrvを起動する
**起動**
デスクトップなりスタートメニューにアイコンが有るはずなので起動すれば下記の画面が出ます。
左上から順にウィンドウ表示、フルスクリーン、大きいウィンドウ、タイトルバーなしの大きいウィンドウ。
基本、左上のウィンドウでOKです。
次へを押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573787/ff94a3c5-c2cb-e05b-9b80-7bca066bd1c3.png)<br>


**起動時の設定**
起動時になにかプログラム動かす？と聞いてるので、そのまま次へを押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573787/026570ed-4da6-d00f-c2ab-d5fb17c6474b.png)<br>


**クリップボード等の設定**
基本的にこのままでOK。次へを押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573787/1f7de08f-6305-e52f-a9b0-567e11b63c9e.png)

**設定の保存**
設定を保存するか聞かれるので押しても押さなくてもOK（弄ってないので）。
完了を押下、VcXsrvが起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573787/74913f64-add1-5921-f222-b0370c52a4fa.png)


## Ubuntu側の設定
Ubuntuを起動して、

    export echo DISPLAY=:0.0 >> ~/.bashrc

を実行。
これは.bashrcという設定ファイルに、「描画関係はこのディスプレイポート？を通せ」と記述するもの。
これで、本来Ubunutが描画するものはVcXsrvが代わりに描画＝表示してくれるようになりました。
※私の環境だと、上記操作をせずとも下記のエミュレーターが動作しました。
　`echo $DISPLAY`を実行して、

    localhost:0
と出れば、windows側で上記の描画設定が指定されているので不要な模様。

## 実際にエミュレーターを動かす

    pebble install --emulator basalt
これを実行すると、しばらくの間ののち、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/573787/68ef240c-e5b9-0ae1-0463-48e1b0efb231.png)
エミュレーターが動きます。（QEMUというウィンドウ）おめでとうございます。
本来はこのコマンド、インストールしたい`.pbw`ファイル(Pebbleのアプリケーション)があるディレクトリで
`pebble install emulator [プロジェクト名.pbw]`を 実行すると、指定したpbwファイルをエミュレートしてくれるみたいです。
今回は`basalt`を指定しましたが、他にも`aplite`、`chalk`などPebbleウォッチ本体の仕様に合わせたものが指定できるみたいですね。
ここでようやく、Rebble(有志によるPebble維持プロジェクト)にあるドキュメントが役に立ち始めます。
PC側のエミュレータで加速センサーの数値をQRで生成してスマホブラウザで読み取ったり、何でもできそうです。

## 総括
**楽しい。**
ここに来てようやく、開発環境整った感じがあります。
早いところなにか作って実機にインストールしてみたいものです。
次はきっと多分、実機へのインストール。
『Kaggle備忘録』One-hotベクトルへの変換

## 目的
質的変数（カテゴリー変数）をOne-hotベクトルに変換する

## 使用データ・環境
データ：kaggleの[Titanic](https://www.kaggle.com/c/titanic)データ

環境：kaggle notebook

## 方法

```python:onehot_encoding.py
#モジュールのインポート，osの準備
import numpy as np
import pandas as pd 
import matplotlib as plt 
import os
for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))
```

データを読み込む

```python:onehot_encoding.py
train_data=pd.read_csv('../input/titanic/train.csv')
test_data=pd.read_csv('../input/titanic/test.csv')
```

データを見てみる

```python:onehot_encoding.py
train.data.head()
```
<img width="964" alt="スクリーンショット 2020-02-17 23.13.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584227/0a4f407e-a3a5-d63c-93dc-e43e46821c43.png">

カテゴリー変数のデータフレームがいくつかあることがわかる．これらををOne-hotベクトルに変換することを狙う.

とりあえず，文字列のままだと扱いにくいので，各カテゴリーに異なる数値を割り当てる．
Pandasの`factorize()`を使う．

`factorize()`は，数値のデータ（emb_cat_encoded）とカテゴリーのリスト(emb_categories)の両方を返す．

```python:onehot_encoding.py
train_cat=train_data['Embarked']
train_cat_encoded,train_categories=train_cat.factorize()

#見てみる
print(train_cat.head())
print(train_cat_encoded[:10])
print(train_categories)
```
<img width="352" alt="スクリーンショット 2020-02-17 23.17.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584227/d267e047-0acf-cd22-61e1-acb69dd2d2f2.png">

次にone-hotベクトルへの変換

scikit-learnが提供しているOneHotEncoderを用いる．

```python:onehot_encoding.py
#scikit-learnからOneHotEncoderをインポート
from sklearn.preprocessing import OneHotEncoder

#one-hotベクトルに変換
oe=OneHotEncoder(categories='auto')
train_cat_1hot=oe.fit_transform(train_cat_encoded.reshape(-1,1))

#中を見てみる
train_cat_1hot
```
<img width="236" alt="スクリーンショット 2020-02-17 23.21.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584227/faaf6fed-bf20-32d1-ca2c-6d1e064450e7.png">

変換完了．
date型で絞り込み検索を実装後、herokuにデプロイしたらエラーが出た

#内容
Ruby on Railsのアプリをherokuにデプロイした際に、絞り込み検索でエラーが出てしまったので解決策を備忘録として残していく。

#やりたいこと
heroku上で、date型を使用して要素の絞り込み検索をしたい。

| 2019-08-12 | 検索 |
|:--|:--|

| date | name | expense |
|:-----|:-----|:-------:|
| 2019-08-12     | food | ¥890 |
| 2019-08-12 |CD |   ¥1500   |
| 2019-08-12  | laptop | ¥190000 |

####問題のコード
@expenses = current_user.expenses
@results = @expense.where('date LIKE ?', "%#{params[:date]}%")

費用の全データを取ってきて、date型で検索文字と当てはまったものを@resultsに入れている。


#エラー
上記のコードでheorkuにデプロイしたら下記のエラーが出現。

```
No operator matches the given name and argument types. You might need to add explicit type casts.
ActionView::Template::Error (PG::UndefinedFunction: ERROR:  operator does not exist: date ~~ unknown

簡単に翻訳すると、与えられた名前と型がオペレーターに合ったものがない。ちゃんとした型が必要。
エラー： date ~~ unknown ていうのはない。
```

とのこと。
どうやらdate型では正しくないから、date型を文字列に直す必要があるらしい。

#試したこと
@results = @expense.where('date::text LIKE ?', "%#{params[:date]}%")

::textをdateにつけることでdate型が文字列になっている(と思われる。）

#MySQLの場合
MySQLの場合は、::textは必要なく普通に動いた。

#まとめ
詳しくは理解できていないが、PostgreSQLのバージョンによってはdate型などは自動で判断されていたらしい。
しかし、現在のバージョンでは変更する必要があるとのこと。
CentOS8でcppcheckがインストールできない

# 環境
- CentOS Linux release 8.1.1911 (Core)

# 現象
dnfでcppcheckがインストールできない。

```bash:shell
dnf install cppcheck
```
ないよって言われる。

# 原因
cppcheckのパッケージはいつものリポジトリにないようだ。

# 対策
PowerToolsのリポジトリから借りてくる。

```bash:shell
dnf --enablerepo=PowerTools install cppcheck
```
【小ネタ】一定時間応答が返らないコマンドを強制終了するコマンド（timeout）


# はじめに

今日はちょっとした小ネタ。

別件で調べものをしていた際にスクリプトなどで「一定時間コマンドが返って来なかった場合」的なロジックを組み込む時に使えそうなコマンドを見つけたので、備忘がてら紹介します。
自分はwhileで回しながらsleepをかけたり、みたいなことをしていたのですが、今時のLinuxはそんなことしなくても良さそうですよ、という話です。

# timeoutコマンドとは

timeoutコマンドは、指定したコマンドの実行時間を指定し、その間に終われば正常終了、終わらなければ異常終了（打ち切り）とするものです。

- 書式 : `timeout (num) (command)`


詳細なオプションなどは下記の記事（@IT）を参照。

https://www.atmarkit.co.jp/ait/articles/1906/27/news008.html

※タイムアウトの単位を秒（デフォルト）以外に分や時間で指定したり、終了時のシグナルを指定したり等、割とかゆいところに手が届く仕様になっているようです。


# 試してみました

    ### 正常時 ###
    $ time timeout 3 sleep 2 ; echo $?

    real    0m2.002s
    user    0m0.002s
    sys     0m0.000s
    0

      →時間内に終わった場合はRC=0が返ります
    
    ### 異常時 ###
    $ time timeout 3 sleep 6 ; echo $?
    
    real    0m3.001s
    user    0m0.002s
    sys     0m0.000s
    124
    
      →指定した時間に到達した時点でコマンドは強制終了（RC=124）となります