OmniAICreator/Qiita-1.07M huggingface dataset:
[React-native] reactnavigation


## エラーメッセージ①
(0, reactNavigation.StackNavigator) is not a function...

→ バージョン変更によって StackNavigatorが非推奨
→ 今 → createStackNavigator 


## エラーメッセージ②
`createStackNavigator()` has been moved to `react-navigation-stack`. See https://reactnavigation.org/..../stack-navigator.html for more details.

→ 参考リンク②
https://medium.com/@vnbnews.vn/reactnative-react-navigation-error-createstacknavigator-has-been-moved-to-f90deacbdba9
Health Planet API でトークンのリフレッシュ

# Health Planet API で refresh_token の使い方
Health Planet API で Access Token の期限切れとなった場合、以下のパラメーターを POST することで、Access Toke をリレッシュできる。
https://www.healthplanet.jp/apis/api.html 参照

| パラメータ       |       値
|-----------------:|:-----------------:
| client_id        |  アプリケーションの client_id      |
| client_secret    | アプリケーションの client_secret | 
| redirect_uri     | 処理完了時、もしくはエラー発生時のリターンURL。アプリケーション登録にて指定したドメインのURLもしくは https://www.healthplanet.jp/success.html が指定可能
| grant_type| "refresh_token" |
| refresh_token| Access Token 取得時に一緒に返されて refresh_token の値|

Access Token 取得時にしているする "code" の代わりに、"refresh_token" を指定することと、"grant_type" として "refresh_token" を指定すればリフレッシュできました。
第３章まとめ

今回は第３章で学んだところのポイントを記していきます。

#3.2 静的ページの作成
```terminal
 $ rails generate contoroller "コントローラー名””アクション名”
```
`rails generate`でコントローラーを生成します。

例

```terminal
$ rails  generate controller StaticPages home help
```
上記のようにコントローラー名をつける時は複数形にして、アクション名を入れる時はスペースを作ることで複数作る事ができます。

##キャメルケースとスネークケース
コントローラーを生成する時は基本的にはキャメルケース（単語の頭文字を大文字にする）で生成します。
そうする事で自動でコントローラーのファイル名をスネークケース（単語をアンダーバー（_）でつなぐ。）で作ってくれます。（例static_pages_controller)
ちなみにキャメルとは日本語でラクダのことで途中に入っている頭文字をコブに見立てたものです。

#生成されたページの見方

仮に上記のコントローラーを作ると

```ruby:app/controllers/static_pages_controllers.rb
 def home
#=> "app/views/static_pages/home.html.rb"というファイルが呼び出される
 end

 def help
 end
end
```
と表示されます。

次に

```html:"app/views/static_pages/home.html.rb"
<h1>Static_pages#home<h1>
```
は `static`ページの中のホームアクションに対応しているviewであることを示しています。


次に`routes`を見ていきます。

```ruby:config/routes
get 'static_pages/home'
```
これはstatic_pages/homeにアクセスすることでhomeアクションを取得(get)できましたよという意味になります。
便利なショートカットキー 　まとめ

##基本ショートカットキー 

アプリケーション共通のショートカットキー

| キー        |  機能         | キー        |機能          |   
|:-----------:|:------------:|:-----------:|:-----------:|
|｛Ctrl｝+｛A｝| すべて選択   |  ｛Ctrl｝+｛O｝  | ファイルを開く|
| ｛Ctrl｝+｛C｝|   コピー   |｛Ctrl｝+｛W｝|ファイルを閉じる|
|｛Ctrl｝+｛X｝| 切り取り|｛Ctrl｝+｛N｝|新規作成|
|｛Ctrl｝+｛V｝| 貼り付け|｛Ctrl｝+｛ALT｝+｛V｝|形式を選択して貼り付け|
|｛Ctrl｝+｛Z｝| 元に戻す|｛F4｝|繰り返し|
|｛Ctrl｝+｛Y｝|やり直し|｛F12｝|名前を付けて保存|
|｛Ctrl｝+｛S｝|上書き保存|｛Alt｝+｛F4｝|プログラムを閉じる|
| ｛Ctrl｝+｛F｝ | 検索    |｛Alt｝+｛Tab｝|ウィンドウの切り替え|
| ｛Ctrl｝+｛H｝| 置換       | ｛Windows｝|スタートメニューの表示|
| ｛Ctrl｝+｛P｝    | 印刷      | ｛Windows｝+｛D｝|デスクトップの表示|

文字入力のショートカットキー

| キー        |  機能         | キー        |機能          |   
|:-----------:|:------------:|:-----------:|:-----------:|
|｛半角/全角｝ |日本語入力の ON/OFF|｛F9｝|全角英字変換|
|｛F6｝|ひらがな変換|｛F10｝|半角英字変換|
|｛F7｝|全角カタカナ変換|｛Shift｝+｛Space｝|半角スペースの入力|
|｛F8｝|半角カタカナ変換|｛Ctrl｝+｛BackSpace｝|確定の取消|


Qiita初心者（とりあえず投稿してみたい）

>[Canon 便利なショートカットキー 一覧](https://www.edifist.co.jp/event/mos_excel/images/shortcut_list.pdf)
【置換】コメントアウトを削除して改行を残さない方法【正規表現】

#はじめに
rails newで作成されたファイルにあるデフォルトのコメントアウトをテキストエディタでまとめて削除したい。
でも普通に置換えたら改行が残ってしまう。
そんな時に少し便利な正規表現。

#使用環境
- Visual Studio Code (version 1.45)

#やり方
**検索する文字列：**　　~~`^\s*#.+\n`~~ `^[ \t]*#[^\n]*(?:\n|$)`
**置換え後の文字列：**　`指定しない（空白）`

#サンプル
###置換前
```ruby
require_relative 'boot'

require 'rails/all'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module SampleApp
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 6.0

    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration can go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded after loading
    # the framework and any gems in your application.
  end
end
```

###置換後
```ruby
require_relative 'boot'

require 'rails/all'

Bundler.require(*Rails.groups)

module SampleApp
  class Application < Rails::Application
    config.load_defaults 6.0

  end
end
```

#注意点
使用するテキストエディタによっては挙動が異なるかもしれませんので、異なる環境で使用する際は調整をお願いします。
~~元々ある空行は基本的に削除しないのですが、__コメントアウトの前行が空行の場合、その空行は削除されてしまいます。__~~
_※2020.5.31追記　上記の点は解決することができました。ご協力をいただきました@earthdiver1さん、誠にありがとうございます！_
Setup PC  memo にゃ


## Bluetooth

### iClearver

1. pairing : fn + Bluetooth key


### hhkb

1. pairing : fn + Crtl + Q  & fn + Ctrl + <1, 2, 3, 4>
2. switch : fn + Ctrl + 1,2,3,4

## Windows

* wsl2
   * bios : WIndows Setting > Update & Security > Recover > Others Options
* key binding
   *  IME > Setting > on Configuration > Ctrl + Space IME On/Off
rsync でとにかくファイル転送したいときのコマンドライン

## 前置き

SSH でファイルを転送するには昔から scp コマンドを使ってゐたけれども、今はもう [scp コマンドの使用は推奨されてゐない](https://www.openssh.com/txt/release-8.0)ので、代はりに rsync を使ひたい。が、rsync コマンドはオプションがいっぱいあってこんがらがるのでここにメモっておくことにする。

## オプション

### ファイル属性を維持しない場合

取り敢へず `-lr` を付けとけば `cp -R` によるファイルコピーとだいたい同じ感じで転送される。

* `-l` `--links`
  * シンボリックリンクを維持する
* `-r` `--recursive`
  * ディレクトリーを再帰的にコピーする

必要に応じて以下も足す。

* `--devices`
  * キャラクターデバイスファイルやブロックデバイスファイルを維持する (要転送先 root 権限)
* `--specials`
  * ソケットや FIFO を維持する

### ファイル属性を維持する場合

`-a` を付けるだけで `cp -pR` によるファイルコピーとだいたい同じ感じで転送される。

* `-a` `--archive`
  * `-lr --devices --specials` に加へて以下のオプション四種類をまとめて全部乗せする
* `-p` `--perms`
  * パーミッションを維持する
* `-t` `--times`
  * ファイルの更新日時を維持する
* `-o` `--owner`
  * ファイルの所有ユーザーを維持する
* `-g` `--group`
  * ファイルの所有グループを維持する

(ACL とかまで気にするならマニュアルを読んで必要なオプションを調べよ)

### 気が向いたら付けるオプション

* `-H` `--hard-links`
  * ハードリンクを維持する
* `-h` `--human-readable`
  * 数字を分かりやすくする (12,345 → 12.05K)
* `-P` = `--partial --progress`
  * 途中で中断しても転送先にそのままファイルを残す + 進捗を表示する
  * 巨大ファイル転送時に便利
* `-s` `--protect-args`
  * ファイルパス名に含まれる空白などの特殊文字を維持する
* `-v` `--verbose`
  * ファイル名とかファイルサイズとかを表示する
* `-z` `--compress`
  * 圧縮により転送を高速化する

## オペランド

### 転送元

転送**元**のファイルパス名は、末尾に `/` が付いてゐるとそのディレクトリーの中身を一つづつ転送先ディレクトリーの中に置くといふ意味になる。つまり下の三つはだいたい同じ意味。

* `rsync -r from/foo to`
* `rsync -r from/foo/ to/foo`
* `rsync -r from/foo/* to/foo`

### 転送先

転送**先**のファイルパス名は、以下の全ての条件を満たすときを**除いて**、転送したファイルを中に置くためのディレクトリー名とみなされる (と思ふ。ちゃんと調べてゐない)。逆に以下の全ての条件を満たすときは、転送先ファイルパスに直接ファイルが置かれる。

* 転送先ファイルパス名の末尾に `/` がない
* 転送先ファイルパス名がディレクトリーではない (つまりファイルが存在しないか、ディレクトリー以外のファイルである)
* 転送元ファイルが一つだけで、ディレクトリーではない

……これいちいち覚える気にならんし、転送先にディレクトリーが存在するかどうかで結果が変はるなんてめんどいので、「転送先ファイルパス名は常にディレクトリー名を指定し、末尾に `/` を付ける」ルールで統一しよう。なほ、rsync には `--no-target-directory` 的なオプションはない模様。
vscode 関数 正規表現 置換

# vscode 関数 正規表現 置換
自分がCIの改善（主にソースコード周り）やる時に見る用。
vscodeの左の方でてくるテキストボックスのsearchとreplaceに入れること。

## method名

```
method(arg1)　→　new_method(arg1)
```


### search

```
method
```

### replace

```
new_method
```


## 引数

```
method(var1)　→　method(1)
method(var2)　→　method(1)
method(var3)　→　method(1)
```

### search

```
method\((.*)\)
```


### replace

```
method(1) 
```


## methodの中にmethod

```
assert_equal 1, method(value, method2(100)) →　assert_equal 1, method(value, method3(100)) 

assert_equal 1, method(value, method2(200)) →　assert_equal 1, method(value, method3(200)) 
```

### search

```
method2\((.*)\)
```

### replace

```
method3($1)
```

## 引数の順番入れ替え

```
method(var1, var2) →　method(var2, var1)
method(a, b) →　method(b, a)
method(99, 2) →　method(2, 99)
```

### search

```
method\((.*), (.*)\)
```

### replace

```
method($2, $1)
```

## 括弧なし
```
assert_equal 1, var1 →　assert_equal 1, var3
assert_equal 1, var2 →　assert_equal 1, var3
```

### search

```
assert_equal (.*), (.*)
```

### replace

```
assert_equal $1, var3
```
「有限要素法入門」を読んでみた

![EYq0hgKU8AAZbMt.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174906/0dbcd4b2-7a75-e9d6-679a-36dad5937c81.png)
1978年発行という古い本。入門の名にふさわしく、基礎から順序だてて体系的に説明しており、高校数学程度の前提知識だけで理解できる。大部分が基本的な数学と力学の説明で、有限要素法自体の内容は少ない。最後に第二部として応用的な内容が紹介されているが詳細な説明はなく、次のステップへの道しるべのようになっている。

論理は明解で、混乱を招くような定義漏れや誤字脱字などもなく整っており、自分のような初学者も安心して読める。素晴らしい良書だった！古くから読み継がれている本というのは洗練されている。

#構成
最初の1/3は基本的な線形代数のみ。大学数学でやるような抽象的なベクトルの定義からのスタートではなく、数のセットとしてベクトルを定義するやり方。分かりやすさに重点を置いている。

線形代数の後は複数のバネからなる系を表す剛性マトリクスの説明。一見 有限要素法と関係ない話のように見えるのだが、実は有限要素法はこの理論から発祥したものらしい。そのことが後になって分かる。

剛体マトリクスの次は弾性体力学の解説。基本的なことから明解に解説しており、弾性体力学を学んだことがない自分でもすんなりと理解することが出来た。

ここまでが本書の半分を占めるのだが、有限要素法の説明はまだ始まらない。この本では有限要素法を理解するための前提知識の解説に多くの紙面を費やしている。有限要素法の理論自体はとても単純なので、このやり方はとても良いと思う。

次でようやく有限要素法の開始。かと思いきや、剛性マトリクスを利用した骨組構造解析の手法の解説が始まる。棒からなる構造物を考えるとき、棒を一つのバネ要素とみなし、バネ要素一つ一つに剛性マトリクスを求め、それらを合成した行列を作る。その行列からなる連立方程式を解くことで力やひずみの解析が出来る。

その後 本当に有限要素法が始まる。有限要素法は骨組構造解析を一般化しただけのもの。計算のやり方は全く同じ。結局のところ、有限要素法としての説明は、紙面上はわずか15ページほどにしか過ぎない。拍子抜けするほど簡単で、入門としてはとても分かりやすい。
![EYjXtYUUEAA7VP-.jfif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174906/df6f5cc7-28eb-f35e-a420-9fd55f664359.jpeg)

このあとは第II部 応用編となっており、説明は大雑把で結論しか載ってない。詳細説明は他の書籍に譲るといったところか。Fotranによる具体的な解析例も記載されているが、今となってはいささか古いので参考として読み流してもいいと思う。自分の好きな言語で実装してみると良い勉強になる。

#本書の特徴
もともと有限要素法はこのように骨組み構造解析から生まれたものだそうである。しかしこれを一般の物理現象を表す微分方程式を解く手法として一般化することが出来る。初めから一般化して数学的に有限要素法を説明している本もあるようだが、この本では歴史的な道筋の通りに説明している。最初から抽象的な説明を受け入れるのはなかなか難しい。初心者にとっては、たとえ特殊な一つの例にすぎなかったとしても、具体的なものから導入して説明された方がずっと分かりやすい。
この本を読んだことで有限要素法の全てが分かるわけではないが、入門書としては間違いなく良書であると思う。

#C#で実装してみた
この基礎理論に基づいて2次元弾性解析を実装してみた。
![EZMpXaeUEAAtb6Y.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174906/5d2a13cb-2160-dfbb-1d0d-34d6a43fada9.png)

それっぽい変位・ひずみ・応力の分布が得られた。やっていることは単に小さい三角形ごとに行列を作って、それらを重ね合わせた行列がなす連立方程式を解いているだけ。こんなシンプルなプログラムでこんな凄いことが出来る。結果が出ると楽しいし、数値計算や画像表示のプログラミングのいい練習にもなる。

ここでは規則正しく並んだ要素からなる正方形という簡単な形状を解析対象としているが、これは単に入力の形状データを作る作業を楽にしたかったためである。有限要素法の凄いところはどんな複雑な形状をしていようと全く同じ方法で計算出来るところである。自分で適当に節点を設定して細かい三角形に分割してその座標を入力するだけで、どんな問題も同じように解ける。

任意形状に対する分割データの作成作業自体もプログラム化することは出来るが有限要素法の本質と関係ないので今回は実装しなかった。それはまた別の機会に考えよう。

コードはGitHubに置いた。WindowsFormsApp2/WindowsFormsApp2/Form1.csがメインのコード。
https://github.com/MhageGH/FEM-exmaple
reactでアニメーションを実装する

最近の勉強で学んだ事を、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです！

#アニメーションの実装
gifファイルの場合、実装は簡単だが容量が大きくなることも

```
import animation from "images/animation.gif";
・
・
<image src={animation} alt="トップ画像" />
```

#Lottieで実装する！
Lottieとは？
>Lottieという動画をアプリに組み込むためのライブラリを使うといいよ
JSONファイルを組込むので格段に軽くなる
必要なものをAirbnbがほとんど用意してくれててすごい👏

[以下の手順でJSONを書き出した後に実装していく!](https://qiita.com/17genai/items/37e988d0f68ffe6b44ef/)
>1.ZXPInstallerをDL：http://aescripts.com/learn/zxp-installer/
2.BodymovinをDL（Aeのプラグイン）：https://github.com/airbnb/lottie-web/
3.アプリに組み込みたい動画をAeで作成
4.動画をBodymovinでJSONで書き出し
5.プレビューでエラーがないか確認
6.問題なければ実装（orデータの受け渡し🙏）

実装の際はLottieをインストールし
```
$ npm i react-lottie
```

これでOK！

```react
import React, { Component } from 'react'
import Lottie from 'react-lottie'
import animationData from '../lotties/4203-take-a-selfie.json'

class UncontrolledLottie extends Component {


  render(){

    const defaultOptions = {
      loop: true,
      autoplay: true,
      animationData: animationData,
      rendererSettings: {
        preserveAspectRatio: 'xMidYMid slice'
      }
    };

    return(
      <div>
        <h1>Lottie</h1>
        <p>Base animation free from external manipulation</p>
        <Lottie options={defaultOptions}
              height={400}
              width={400}
        />
      </div>
    )
  }
}

export default UncontrolledLottie
```

細かいオプションはLottieのドキュメントで確認できる！

#参考資料
・[Lottie](https://airbnb.design/lottie//)
・[How To Add Animations to React Apps with React-Lottie](https://www.digitalocean.com/community/tutorials/how-to-add-animations-to-react-apps-with-react-lottie/)
font-awesome-sassを使用する[rails, slim, FontAwesome]

# 参考文献

- RailsでFontAwesomeを使う (https://qiita.com/fumikao/items/59ab20af33047d06e6e3)
- gem 'font-awesome-rails'は最新版に対応してない... 代わりにfont-awesome-sassを使おう! 
 (https://qiita.com/paudorino/items/d54348f6d48eefcee6c7)
- FontAwesome::Sass (https://github.com/FortAwesome/font-awesome-sass)

# FontAwesome
> Get vector icons and social logos on your website with Font Awesome, the web's most popular icon set and toolkit.
> webで人気のあるアイコンセットやツールキットのFontAwesomeを使うことで, ベクターアイコンやソーシャルロゴを取得することができます。
> FontAwesome公式サイト: (https://fontawesome.com/)

# font-awesome-sass
#### 利用手順
今回はfont-awesome-sassを利用します。  
詳細な情報については以下のサイトを参照してください。
https://github.com/FortAwesome/font-awesome-sass

##### Gemfileに記述
```:Gemfile
gem 'font-awesome-sass', '~> 5.13.0'
```
##### 実行
terminalで以下のコマンドを入力

```
bundle install
```

##### application.scssへ記述
```scss:app/assets/stylesheets/application.scss
@import "font-awesome-sprockets";
@import "font-awesome";
```

#### 使用例[slim]
##### 今回使用するアイコン
![スクリーンショット 2020-05-30 13.16.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256678/3f3a09dd-546f-2e69-1eb3-19f576fe573b.png)

##### 記述
```slim
p
  |
    test
  = icon 'far', 'surprise'
/<p>
/  test
/  <i class="far fa-surprise"></i>
/</p>
```

##### 出力結果
![スクリーンショット 2020-05-30 13.25.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256678/37d9733f-94cb-378a-9351-e40359ee0d1a.png)
【Rails/RSpec】mockの戻り値はOpenStructを使えば仕事が捗る

こういうコードに対して

```ruby
class SomeClass
  include Service # これを include することで SomeClass.call(foo) という形で呼べるようにしています。↓のYourClassを同様です。

  def initialize(foo)
    @foo = foo
  end

  def call
    response = YourClass.call(@foo)
    unless response.success?
      raise StandardError, 'your error message comes here'
    end
    ...
  end
end
```

こういう mock と mock response を書く。

```ruby
let(:mock_response) { OpenStruct.new(success?: true, body: { bar: 'bar' }.to_json) }

before do
  allow(YourClass).to receive(:call).and_return(mock_response)
end
```

異常系のテストをする時は、`mock_response` を `success?: false` とする。


```ruby
let(:mock_response) { OpenStruct.new(success?: false, body: { bar: 'bar' }.to_json) }
```
【VSCode拡張機能】Turbo Console Logでconsole.logをショートカットで効率化しよう！

# console.logのコピペがめんどくさい
JavaScript/TypeScriptで開発していると、console.logの使用は避けて通れません。
適宜console.logをコピペして中の変数書き換えて、どこのconsole.logか分かるように文字列で名前を記述したり...とても面倒くさいとモヤモヤしておりました。
スニペットでconsole.log()は補完してくれますが、中身書くのがめんどくさい。。。

そんな時にショートカットコマンド一発でconsole.logできるVSCodeの拡張機能を見つけました。

# Turbo Console Log
「Turbo Console Log」という拡張機能です。
VSCodeの拡張機能Marketplaceから検索。
これです。設定とかは不要でインストールするだけ。
<img width="800" alt="スクリーンショット 2020-05-30 12.27.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530688/efa1a44d-60e1-94a9-483b-19e5dab25827.png">

# 使い方
使い方は簡単で

- console.log対象の変数を選択
- ショートカットコマンドを入力
- (Mac) shift + option + L
　(フォーマッターを入れている場合上記コマンドと被るのでcontrol + option + Lの場合あり)
- (Windows) ctrl + alt + L

どこの変数なのかプレフィックスまでつけてくれます。
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530688/66b85aa5-eebd-0610-f8d8-aa7b1cb21080.gif)


### その他のショートカット
※Macでフォーマッターを入れている場合control + option + ~の場合あり

- **(Mac): Option + Shift + C / (Win): ctrl + alt + C**

拡張機能で出力した全部のconsole.logをコメントアウト

- **(Mac): Option + Shift + U / (Win): ctrl + alt + U**

拡張機能で出力した全部の出力したすべてのconsole.logのコメントアウトを削除

- **(Mac): Option + Shift + D / (Win): ctrl + alt + D**

拡張機能で出力した全部の出力したすべてのconsole.logを削除
![ezgif.com-video-to-gif (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530688/dbb74bfc-021d-be09-c442-757721a6b59f.gif)

## 細かな設定
拡張機能の設定画面から
console.log末尾のセミコロンの有無や、シングルクオート/ダブルクオートの選択
プレフィックスのルール設定ができるので自分の好みに合わせて設定できます。
<img width="500" alt="スクリーンショット 2020-05-30 13.25.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530688/0d268d6b-46bf-22bf-136b-ca9b7a64f99d.png">

<img width="1228" alt="スクリーンショット 2020-05-30 13.26.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530688/a202e247-48e1-53c8-a622-a80a8f552f68.png">

地味だけど使い始めると快適な拡張機能のご紹介でした。
最後まで読んで頂きありがとうございました。
C言語のヘッダーファイルをD言語用に変換する dstep の使い方

# はじめに
D言語からC言語のライブラリを使うにあたり、`dpp` や `dstep` などのツールを使ってヘッダーを変換するのが簡単です。

というわけで、使うのが簡単な `dstep` というツールを使い方メモです。
CのヘッダーファイルとDのモジュールは大体1対1対応になるので、ファイル毎に変換するなら `dstep` を使うのが恐らく一番簡単です。

# 概要

- `dstep`
    - DUB : https://code.dlang.org/packages/dstep
    - GitHub : https://github.com/jacob-carlborg/dstep

__使い方__

```console
dub run dstep -- libapi.h -o source/libapi.d
```

ヘッダーファイルを用意して第1引数に指定、第2引数に `-o` オプションと出力先ファイルを指定、だけです。

# 補足

- 複雑なマクロなどで変換に失敗してもある程度出力されます。あとは手で微調整すればOKです。
- 微調整のための公式のC言語連携ドキュメント
    - https://dlang.org/spec/interfaceToC.html
- 実用参考：D言語でUSBカメラを使う
    - https://qiita.com/nonanonno/items/6cc1baac2acd780ee2e4
Pandasを使って競馬のデータベースを取得してみた

#はじめに

**2020/06/19修正しました**

　データ解析テーマとして、興味を持ったので実施してみました。

　参考にしたサイトはこちらです。

+ [競馬予想で始めるデータ分析・機械学習](https://www.youtube.com/channel/UCDzwXAWu1zIfJuPTTZyWthw)

##競馬予測までの流れ

　一から予測モデルを構築しようとすると、下記手順を踏む必要があります。


1. 競馬サイトからデータをスクレイピング
2. データの前処理
 + 予測したい説明変数及び特徴量を決める
 + 文字列→数値型へ変換
 + カテゴリ変数のダミー変数化 
3. 訓練データとテストデータに分ける
4. モデル構築
 + 訓練データで学習させたモデルでテストデータを確認
 + 過学習していればモデルの最適化
5. 予測したいレースについて予測

今回は1.のスクレイピング関連について簡単にまとめます。


## スクレイピングについて


[net.keiba.com](https://db.netkeiba.com/)こちらのサイトからスクレイピングを行いました。

**注意点**
 
　一度に大量のデータを取得すると、サーバーへの負荷となります。`time.sleep(1)`を入れることで1秒ごとに`race_id_list`をリクエストする際に待つようにしています。これによるサーバー負荷軽減を行うことがマナーとされています。
　

```python
import pandas pd
from tqdm import tqdm_notebook as tqdm
import time

def scrape_race_results(race_id_list):
    race_results={}
    for race_id in tqdm(race_id_list):
        try:
            url = 'https://db.netkeiba.com/race/'+ race_id
            race_results[race_id]= pd.read_html(url)[0]
            time.sleep(1)
        except IndexError:
            continue
        except:
            break
    return race_results
```

この`race_id`に確認したいレースを入れます。例えば、`202009020611`というIDがあったとします。
これは、

```
2020→開催年数
09→場所(09であれば阪神、10であれば小倉、等）
02→　第~開催　
06→　第~開催の何日目
11→レース数
```

を示しています。


試しにこのような形で見ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567823/06d03af6-2e1c-1e1d-022a-c2941980e400.png)






基本pandasを用いてデータ解析を行っていきます。保存は安心のために、`pickle`ファイルと`csv`として吐き出しておきます。

取得したデータを`resluts_new`に格納しているとすると、下記になります。

```python
results_new.to_pickle('results_new2017-2020')
results_new.to_csv('results_new2017-2020.csv',encoding="SHIFT-JIS")
```



#終わりに

　簡単にデータ取得の方法をまとめました。
SageMakerでセッションタイムアウトせずに学習を実行する方法

## トラブル内容

SageMakerのjupyter Notebookで数時間くらい必要な処理を行う場合、12hでセッション切れになってしまい、セルの出力が消えてしまう。



## 解決策

基本的にスクリプトにしてから実行するしかない。


通常のノートブック内で
`!python xxxx.py >> log.txt`
のように実行してもいいが、任意のconda環境を利用したい場合は下記のようにactivateできる。

```shell

sh-4.2$ conda info --envs
# conda environments:
#
base                     /home/ec2-user/anaconda3
JupyterSystemEnv      *  /home/ec2-user/anaconda3/envs/JupyterSystemEnv
R                        /home/ec2-user/anaconda3/envs/R
amazonei_mxnet_p27       /home/ec2-user/anaconda3/envs/amazonei_mxnet_p27
amazonei_mxnet_p36       /home/ec2-user/anaconda3/envs/amazonei_mxnet_p36
amazonei_tensorflow_p27     /home/ec2-user/anaconda3/envs/amazonei_tensorflow_p27
amazonei_tensorflow_p36     /home/ec2-user/anaconda3/envs/amazonei_tensorflow_p36
chainer_p27              /home/ec2-user/anaconda3/envs/chainer_p27
chainer_p36              /home/ec2-user/anaconda3/envs/chainer_p36
mxnet_p27                /home/ec2-user/anaconda3/envs/mxnet_p27
mxnet_p36                /home/ec2-user/anaconda3/envs/mxnet_p36
python2                  /home/ec2-user/anaconda3/envs/python2
python3                  /home/ec2-user/anaconda3/envs/python3
pytorch_p27              /home/ec2-user/anaconda3/envs/pytorch_p27
pytorch_p36              /home/ec2-user/anaconda3/envs/pytorch_p36
tensorflow_p27           /home/ec2-user/anaconda3/envs/tensorflow_p27
tensorflow_p36           /home/ec2-user/anaconda3/envs/tensorflow_p36

sh-4.2$ source /home/ec2-user/anaconda3/bin/activate pytorch_p36
(pytorch_p36) sh-4.2$ 

```

これでjupyterlabのターミナルから任意の環境を利用できる。

## 参考
[AWS Developer Forums: Jupyter Notebook Session Expiring after ...](https://forums.aws.amazon.com/thread.jspa?messageID=914749)
PHPテストフレームワークPestを試してみる

### 参考
[Pest \- An elegant PHP Testing Framework \| Installation](https://pestphp.com/docs/installation/)

### やり方
記事を書きながら公式の方が絶対いいなと思いながら書き残します。
個人的につまったところは、composer.jsonの"minimum-stability"など書くところが分からず、ずっと怒られてました。

Dockerでやるならこちらをcloneしてもらったほうがいいかもしれません。
[yoshinyan/pest\_test](https://github.com/yoshinyan/pest_test)

phpunit.xmlは次からコピペする。
[pest/phpunit\.xml at master · pestphp/pest](https://github.com/pestphp/pest/blob/master/stubs/Laravel/phpunit.xml)

```bash
# 前提composerが入っていること

composer require phpunit/phpunit:"^9.0" --dev --update-with-dependencies

composer require pestphp/pest --dev
```

```composer.json
{
    "require-dev": {
        "phpunit/phpunit": "^9.0",
        "pestphp/pest": "^0.1.5"
    },
    "minimum-stability": "dev", // <= エラーが起こったらこれを追加
    "prefer-stable": true // <= エラーが起こったらこれを追加
}
```

ファイル名はXXXTest.phpに固定っぽい。

```php:./tests/Unit/CalcTest.php
<?php
# シンプルでとてもよい。
test('足し算のテスト', function () {
    $sum = 1 + 1;
    assertEquals(2, $sum);
});

// もしくは
it('引き算のテスト', function () {
    $sum = 2 - 1;
    assertEquals(1, $sum);
});
```

```
# テスト実行
./vendor/bin/pest

# result
   PASS  Tests\Unit\CalcTest
  ✓ 足し算のテスト
  ✓ it 引き算のテスト

  Tests:  2 passed
  Time:   0.43s
```


### 感想
- PestはJestに結果出力のところが似ていて、かっこいいなと思いました
- PHPUnitと共存できるらしい。
- Laravelと相性が良さそう。
- Pestの英訳が「害虫」と面白い
- Jestと名前が似ている

### よければこちらも見てください
[PHPテストフレームワークPestのAssertionsの書き方例 \- Qiita](https://qiita.com/yoshinyan/items/b7af2bcbe995f09b6b35)
12分でファームウェア4種類インストールできるモバイルルータGL-AR150の凄まじさ

はじめに
---

お気に入りモバイルルータ[GL-AR150](https://www.gl-inet.com/products/gl-ar150/)に、下記４種類のオープンソース・ファームウェアを入れてみました。DLリンクは記事掲載時の最新バージョンです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63318/61089b63-baa6-9dc7-b13a-6ff6e69c2aa9.png">

- [GL-AR150 Original](https://www.gl-inet.com/products/gl-ar150/) / [DLリンク](https://dl.gl-inet.com/firmware/ar150/clean/gl-ar150-3.0-1011_clean.bin)
- [OpenWrt](https://openwrt.org/) / [DLリンク](http://downloads.openwrt.org/releases/19.07.3/targets/ath79/generic/openwrt-19.07.3-ath79-generic-glinet_gl-ar150-squashfs-sysupgrade.bin)
- [Gargoyle](https://www.gargoyle-router.com/) / [DLリンク](https://www.gargoyle-router.com/downloads/images/ar71xx/gargoyle_1.9.2-ar71xx-generic-gl_ar150-squashfs-sysupgrade.bin)
- [DD-WRT](https://dd-wrt.com/) / [DLリンク](https://download1.dd-wrt.com/dd-wrtv2/downloads/betas/2020/05-27-2020-r43266/GL.iNet-AR150/factory-flash-uimage.bin)

ファームウェアを焼く方法
---

１．パソコンのIPアドレスを **192.168.1.2** に設定し、パソコンのLANポートと**GL-AR150のWANポート**を
　　LANケーブルで接続します。
２．GL-AR150の**Reset**ボタンを**押したまま**、USB電源ケーブルを差し込みます。
　　赤色LEDがゆっくりと5回点滅した後、緑色LEDが2つ同時に点灯したタイミングで**Reset**ボタンを**離す**と、
　　今度は赤色LEDが速く点滅します。
　　これでファームウェアを焼ける準備が整います。
３．パソコンのブラウザで**http://192.168.1.1**に接続すると下記画面が出るので、後はファームウェアを指定し、
　　**Update firmware**を押すだけです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63318/4a0a3333-f356-d82b-d233-c9f8d68cfc03.png">

４．GL-AR150のLEDの状態をよく確認し、GL-AR150が再起動したら、LANケーブルを**GL-AR150のLANポート**に
　　切り替え、パソコンのLANポートを切断・接続すると、**http://192.168.1.1**で管理画面にログインできる
　　ようになります。

おわりに
---

ただただ続けざま4種類のファームウェアを、焼いて、ログインして、たったの12分。
無料で、簡単に、高機能ルータを使えることの素晴らしさを実感できた瞬間でした。
ちょっと旧式だけど、ちっちゃめだけど、GL-AR150はできる子ですよ。(=^・^=)
jqueryプラグインの使い方

<h1><font color="red">jqueryプラグインとは</font></h1>
プラグインとはjQueryの拡張機能で、さまざまな種類かつ、膨大な量のプラグインが公開されており（自作も可能）
基本的にはjQueryを使えるようにしておけば、容易に導入／カスタマイズすることが可能。
<br>
**基本的な使い方**
１．jQuery本体を読み込む
２・jQueryプラグインを読み込む(ダウンロード)
３．(プラグインに付属のCSSがあれば、)CSSを読み込む
４．プラグインを適用する HTML を書く
５．プラグインの起動スクリプトを書く
<br>
**基本的な注意点**
jQuery本体は一番最初に一度だけ読み込む
jQuery本体とプラグインはなるべく最新バージョンを使う
jQuery本体やプラグインを書き換えようとしない

---

<h1><font color="red">ライブラリとプラグインの違い</font></h1>
> 
|                  |       意味 |    特徴　　 |用語|
|:-----------------:|:------------------:|:------------------:|:------------------:|
| ライブラリ       |       機能や言語の使い方を再定義したものでかなり広い意味で使われます。|   関数が簡素化しており、非常に使いやすくなっています。従って、結果は同じでも、使える関数はJavascriptとjQueryでは違います。jQueryの方が簡潔に書けます。  |        jQueryはJavascriptの「ライブラリ」です。       |
|       プラグイン     | 	特定の機能を補助するための拡張機能を提供するもので、比較的狭い意味で機能に特化して使われます。  |      例えば、スライド機能を実装したい場合に、この機能に特化して、デザインや追加の機能を提供してくれます。     |          プラグインを使って、サイトにスライドショーを加えたよ。※「ライブラリを使って、サイトにスライドショーを加えたよ」とは言わないと思います。    |
> 

引用元のサイトです。詳しくはここ。
[【入門】jQueryの導入方法から使い方まで！わかりやすく解説します](https://creive.me/archives/19581/)

[jQuery] メソッド・プロパティ一覧
[コピペで使える JavaScript逆引きリファレンス](https://javascript.programmer-reference.com/jquery-list-method/)
Ruby ボーナスドリンク問題 解いてみた(解答例あり)

# はじめに
『プロを目指す人のためのRuby入門』通称チェリー本を学習後のプログラミング初心者です。
インプットしたものを手を動かして実践してみたいなと思ったら、作者の記事を見つけました。
[「アウトプットのネタに困ったらこれ！？Ruby初心者向けのプログラミング問題を集めてみた（全10問）」](https://blog.jnito.com/entry/2019/05/03/121235)

この４つ目の問題を解いてみました。

他の問題はこちら
[一問目](https://qiita.com/u_nayama/items/389b229bd569fdfc1874)：カレンダー作成問題（たのしいRuby　練習問題）
[二問目](https://qiita.com/u_nayama/items/6009dcfe148e15ad9e1b)：カラオケマシン作成問題
[三問目](https://qiita.com/u_nayama/items/7be7e6c5661d93272de8)：ビンゴカード作成問題
[四問目](https://qiita.com/u_nayama/items/82edf9500c0cdfc263f7)：ボーナスドリンク問題
[五問目](https://qiita.com/u_nayama/items/53c2a4b58840dbccaaf9)：電話帳作成問題

# 問題
詳細は[ここから](https://github.com/JunichiIto/bonus-drink)

>ある駄菓子屋で飲み物を買うと、空き瓶3本で新しい飲み物を1本プレゼントしてくれる。
最初に購入した飲み物の本数から、トータルで飲める本数を算出するプログラムを作成せよ。
また、最初に100本購入した場合、トータルで何本飲めるか。

>**備考**
この問題は小学校3年生の算数の問題をベースとしている。

>**例**

>| 購入した本数 | 飲める本数 |
|--:|--:|
| 0 | 0 |
| 1 | 1 |
| 3 | 4 |
| 11 | 16 |
| 100 | (プログラムで算出する) |

# 解答例
こんな感じになりました

```ruby
class BonusDrink
  def self.total_count_for(amount)
    if amount.zero?
      0
    elsif amount.odd?
      3 * amount / 2
    elsif amount.even?
      3 * (amount - 1) / 2 + 1
    end
  end
end
```
テストコードはこちらです。

```ruby
require_relative '../Bonus_drink/drink'

RSpec.describe BonusDrink do
  it "total_count_for" do
    expect(BonusDrink.total_count_for(0)).to eq 0
    expect(BonusDrink.total_count_for(1)).to eq 1
    expect(BonusDrink.total_count_for(3)).to eq 4
    expect(BonusDrink.total_count_for(11)).to eq 16
  end
end
```

# 解説
プログラムとして成立してるとは思うのですが、プログラミングの問題の趣旨としてこの解き方で良かったのかなという感じは若干あります。
（ほとんど紙とペンを動かして算数的に解きました。）

### まず
問題にもある通り、`「空き瓶3本と新たな1本を交換」`してもらえます。
交換して受け取った新たな瓶１本も交換対象になるのがこの問題の肝です。

ですので

```
購入した本数：３　新たに交換した本数:1  合計で飲んだ本数：4
```
となりますが、受け取った瓶を追加して３本に達するとさらにもう一本交換できるのです。
例えば、

```
購入した本数：5  新たに交換した本数:1  さらに追加で交換した本：１　合計で飲んだ本数：７
```
ということになります。
したがって購入した本数が増えれば増えるほど、追加の交換が何度も繰り返されます。

これをプログラミングで表現して合計の瓶の本数・交換済みの本数などを繰り返し代入して最大の合計本数に近づけていく問題なのかと思ったのですが、思い付かず、諦めました。
何か解答例あればコメントで教えていただけますと幸いです。

### ここから解説
ではどう解いたかというと、購入した本数と飲める本数をとりあえず少し書き出してみました。

| 購入した本数 | 飲める本数 |
|--:|--:|
| 0 | 0 |
| 1 | 1 |
| 2 | 2 |
| 3 | 4 |
| 4 | 5 |
| 5 | 7 |
| 6 | 8 |
| 7 | 10 |
| 8 | 11 |
| 9 | 13 |
| 10 | 14 |
| 11 | 16 |

そうすると、***「購入した本数nが奇数の時、(n * 3)の値はnの時の飲める本数と(n+1)の時の飲める本数の合計と一致する」***ということがわかりました。
ちなみに0の時は成立しません。
(他にも色々法則性はありますが、今回はこの方程式を使います。）
具体的には、

| 購入した本数 | 飲める本数 |
|--:|--:|
| 5 | 7 |
| 6 | 8 |

```
５ * 3 = 15
7 + 8 = 15
```
なりますね！
つまり***「nを３倍にしたものを２で割ると飲める本数を求められる」***ことがわかりました。
これをプログラミングに直すと、

```ruby
# 奇数の時
3 * amount / 2
# 偶数の時は1つ前の奇数から求めました
3 * (amount - 1) / 2 + 1
```

以上の内容をまとめたものが、[上記の解答例](#解答例)です。

### さいごに
こういう法則が成り立つな、というのは分かったのですが、**「なんでこうなるのか」**がいまいちわからないです。
わかりやすく説明していただける方いましたらお恥ずかしながらご教授お願いしたいです。

よろしくお願いします！
ターミナルでgit branch名を表示する

## ターミナルにブランチ名を表示

いいかげんgit branchって打ちたくないのでターミナルでブランチ確認できるように設定追加するようにしました。

```$ sudo vim ~/.bash_profile```

```bash
# Git branch in prompt.
parse_git_branch() {
  git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}
export PS1="\W\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "
```

最後に```$ source ~/.bash_profile```で更新すれば良い。

## 参考URL
https://gist.github.com/joseluisq/1e96c54fa4e1e5647940

## 余談
ちなみにユーザ名とホスト名も表示したかったら以下のように書けば良い。
\uはユーザ名で\hはホスト名らしいです。長いので自分は表示しない。

```bash
export PS1="\u@\h \W\[\033[32m\]\$(parse_git_branch)\[\033[00m\] $ "
```
ESLintでautofixに対応していないルールをautofixする

# やりたいこと
ESLintでは、autofixに対応しているルールと、していないルールがあります。
たとえば
`no-var`はautofixされますが、
`no-unused-vars`はautofixされません。

勝手に修正されると困るものはautofixされない仕様なのでしょうが、
それでも「`no-unused-vars`を一括で修正したいなー」みたいなケースはあります。

# eslint-plugin-autofixで解決

https://www.npmjs.com/package/eslint-plugin-autofix
これを使うと、標準ではautofixできないルールをautofixしてくれちゃいます！

`plugins`の設定を入れて、
`"autofix/ルール名"`で列挙すればOK！

```json:.eslintrc
{
  "plugins": ["autofix"],
  "rules": {
    "autofix/no-unused-vars": "error",
    "autofix/no-plusplus": "error"
  }
}
```

```js:before
var hoge = 1
var fuga = 2
hoge++
console.log(hoge)
```
↓

```js:after
var hoge = 1

hoge+=1
console.log(hoge)
```

いい感じ！

# 補足

全部のルールに対応しているわけではないっぽくて、
試したら`eqeqeq`なんかはダメでしたねー。
ドキュメント読んでも、未対応ルールは良く分らなかった。
まずは試してみるのが良いと思います。

常に有効にしてしまうとコードが壊れることもありそうなので、
「ここぞ」というタイミングで使うのが良いのかなーと思います。


ではまた～。
【grover】RailsでPDFの生成をする【2020年度版】

Rails で PDF を生成する際はどうされていますか？
少し調べると wicked_pdf や prawn などの gem が出てきます。

今回は [grover](https://github.com/Studiosity/grover) という Puppeteer/Chromium を使って HTML から PDF や画像を生成する gem の存在を知り、試してみたのでメモを残します。

# 手順

puppeteer をインストール

```sh
npm install puppeteer
```

Gemfile に記述

```ruby
gem 'grover'
```

config/initializers/grover.rb に以下を追加。

```ruby
# frozen_string_literal: true

Grover.configure do |config|
  config.options = {
    format: 'A4',
    margin: {
      top: '5px',
      bottom: '10cm'
    },
    viewport: {
      width: 640,
      height: 480
    },
    prefer_css_page_size: true,
    emulate_media: 'screen',
    cache: false,
    timeout: 0, # Timeout in ms. A value of `0` means 'no timeout'
    launch_args: ['--font-render-hinting=medium', '--lang=ja'], # 日本語表示のため --lang=ja を追加
    wait_until: 'domcontentloaded'
  }
end
```

controllers/api/sample_controller.rb に以下を記述。
ルーティングの記述も忘れずに。

```ruby
# frozen_string_literal: true

module Api
  class SampleController < ApplicationController
    include ActionController::MimeResponds # API モードで respond_to を使うために必要

    def show
      controller = ActionController::Base.new
      html = controller.render_to_string(template: 'api/hoges/show', layout: 'pdf')
      pdf = Grover.new(html).to_pdf
      respond_to do |format|
        format.html
        format.pdf do
          send_data(pdf, filename: 'your_filename.pdf', type: 'application/pdf')
        end
      end
    end
```

pdf 生成用の layout ファイルを作成

views/layouts/pdf.html.erb

```erb
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <style>
    </style>
  </head>
  <body>
    <%= yield %>
  </body>
</html>
```

api/sample/show.html.erb

```erb
<p>請求書</p>

<style>
p { font-size: 20px; }
</style>
```

# 結果

<img width="839" alt="スクリーンショット 2020-05-30 11.48.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/38580/e0fab201-bc61-c445-bafd-7e95ca7b0284.png">

# 最後に

簡単に pdf を生成することができました。
処理時間も気にならないレベルです。

## 追記

余談ですが、私は Grover を Heroku で使っていました。

Grover を動かすために Google Chrome と Puppeteer の buildpack が必要になり、slug サイズが大きく増えてしまったので、結局 prawn に乗り換えました。
firebase web codelab 11. show notifications をWindowsで突破する

#はじめに
firebaseのweb codelabをWindowsで試していたら、「11. show notifications」でハマりました。
Windows 10で試しています。
curlはいつの間にかインストールされていましたが、node.jsとセットで入るのかな？

#事象
こちらを参照。
https://codelabs.developers.google.com/codelabs/firebase-web/index.html#10

Google様の通知用プラットフォームを介して、WebAPI経由でDeviceにNotificationするっていう内容だと思います。

curlでこのコマンド投げろ＾＾って言われます。
けど、投げたら`JSON_PARSING_ERROR: Unexpected character (') at position 0.`でエラーになってしまいます。

```curl:curl_template_by_google
curl -H "Content-Type: application/json" \
     -H "Authorization: key=YOUR_SERVER_KEY" \
     -d '{
           "notification": {
             "title": "New chat message!",
             "body": "There is a new message in FriendlyChat",
             "icon": "/images/profile_placeholder.png",
             "click_action": "http://localhost:5000"
           },
           "to": "YOUR_DEVICE_TOKEN"
         }' \
     https://fcm.googleapis.com/fcm/send
```

#解決法
エラー内容の通り、jsonのparseに失敗しています。
以下で解決。

* json中の`"`を`""`にエスケープ
* 文字列を括る記号を`'`→`"`に変更
* コマンドの途中改行をやめて1行に

```curl:curl_template_by_me
curl -H "Content-Type: application/json"      -H "Authorization: key=YOUR_SERVER_KEY"      -d "{""notification"": { ""title"": ""New chat message!"", ""body"": ""There is a new message in FriendlyChat"", ""icon"": ""/images/profile_placeholder.png"", ""click_action"": ""http://localhost:5000"" }, ""to"": ""YOUR_DEVICE_TOKEN"" }"      https://fcm.googleapis.com/fcm/send
```

#その他
1行にまとめる必要は特にないけど、cmdで`^`使ってやっても、powershellで`使ってもうまくいきませんでした。
問題が重なって特定が面倒くさくなって1行にまとめました。

さっさと諦めてcodelabに書いてある通り、SaaSのcurl使うのも手だと思うけど、ServerKey公開するの危険だから、refreshしてねって書いてあったので、ちょっくら戦ってみました。

Windowsの環境でこれやってる人って絶滅危惧種何だろうなー。
【Golang】ゴルーチン（並行処理）

#【Golang】ゴルーチン（並行処理）
Golangの基礎学習〜Webアプリケーション作成までの学習を終えたので、復習を兼ねてまとめていく。 基礎〜応用まで。

```
package main
//goroutineとsync.WaitGroup
//goroutinの基礎

//軽量のスレッド 並列処理のこと
//暗黙的にGoはやってくれるため、他の言語ほど深い知識がなくても
//勝手にやってくれる

import (
	"fmt"
	"sync"
	"time"
	"runtime"
)


//並列処理
//3
//引数でポインタを宣言
func goroutin(wg *sync.WaitGroup){
	//3
	//wgを終了する
	defer wg.Done()
	for i := 0; i < 5; i++ {
		time.Sleep(100 * time.Millisecond)
		fmt.Println(i)
	}
}
/*
wg.doneが無かったり、wg.Add(1)が複数あるとエラーになる。
*/



//1
//通常の処理
func normal(){
	for i := 1; i < 5; i++ {
		//1秒待つ
		time.Sleep(1000 * time.Millisecond)
		fmt.Println(i)
	}
}

func main() {
	/*
	//1
	//通常の処理
	normal()
	//2
	//関数の前に go を書くだけで並列化できる。
	//関数内のtime.sleepを消すと、並列処理のスレッド生成中にループが終了してしまうため、
	//normalが終わったら、終了してしまう為、goroutinは実行されない。
	//time.sleep(2000 * time.Millisecond)で時間を開けると、実行を確認できる。
	go goroutin()
	go goroutin()
	*/

	//3
	//上記を防ぐ
	//sync.WaitGroupを宣言
	var wg sync.WaitGroup

	//並列処理が１つあることを設定する。
	wg.Add(2)

	//引数でwgのアドレスを渡す
	go goroutin(&wg)
	go goroutin(&wg)
	
	//NumCPU Goランタイムが動作する環境のCPUを表す。使用できるCPUのコア数。
	fmt.Printf("CPU: %d\n", runtime.NumCPU())
	//NumGoroutin Goのランタイム上で動作しているゴルーチンの数を表す
	fmt.Printf("NumGoroutin: %d\n", runtime.NumGoroutine())
	//Version Goのバージョン
	fmt.Printf("Version: %s\n", runtime.Version())

	//通常
	normal()

	//wg,Doneが行われるまで、待ってくれる
	wg.Wait()

}
```
2020-05-30 PYNQ-Z1 > MicroBlaze + IOP for PMOD > BSPの情報 > repositoryから取り除かれた

```txt:動作環境
Windows 10 Pro (v1909) 
PYNQ-Z1 (Digilent) (以下、PYNQと表記)
Vivado v2019.1 (64-bit)
```

### 概要

- PMODを使うMicroBlazeのBSPを探している
    - BSP: Board Support Package

### Adam Taylorさんの記事

- PYNQ Edition! Interfacing with Pmods, Arduino and Raspberry Pi
    - https://www.hackster.io/news/pynq-edition-interfacing-with-pmods-arduino-and-raspberry-pi-61676f9f0fab
    - 2019年の記事?

> If you clone the PYNQ git repository and examine the IOP elements in the library, you will notice under /lib/pmod the MicroBlaze BSP along with applications for specific Pmods (although not all).

### PYNQ git repository

関連しそうなのはここ

https://github.com/Xilinx/PYNQ/tree/master/pynq/lib/pmod

ただし、commit messageに下記がある。

>「remove bsp and bin from pmod(#919)」

Adam Taylorさんの記事以降でXilinxの方でBSPの位置を変えたのかな。

### BSPはrepositoryから取り除かれた (2020-06-07)

- [Where is bsp_iop.pmod in git repository?](https://discuss.pynq.io/t/where-is-bsp-iop-pmod-in-git-repository/1310)

BSPはregenerateが簡単だからrepositoryから取り除いた。
build.shが再作成をする。
PYNQ release fileのpynq/lib/pmodから取得もできる。
とのこと。

pynq/lib/pmod以下に「bsp_iop_pmod」は見つかった。
![2020-06-07_07h37_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/4fd3edcc-f9e2-b15a-71ce-dc07dcfa775e.png)
Ubuntu上のJupyterサーバーでRも動かす

こちらで紹介したGCP（Ubuntu 20.04 LTS）環境のJupyterサーバー上で、R言語も動かしたかったので、その方法。
https://qiita.com/inoccu/items/3be6f89ade75317db886

ちなみに、Ubuntu 18.04 LTS環境上でも同様の方法で動作することを確認しました。

```bash
conda install r r-essentials
```

インストールにしばらくかかる。

```bash
conda install rstudio
```

ここまでインストールした後、Jupyterを再起動してNotebookを開くと、R言語のノートブックを新規で作成できるようになっている。ただ、コードを書いて実行してみると、カーネルエラーになってしまう。

```bash
apt install libxrender1
```

このパッケージをインストールすると、きちんと動作するようになる。
Terrafrom で Cloud Run から Cloud SQL の設定でハマったこと

備忘録です。

`resource "google_cloud_run_service"` に参照する Cloud SQL の **インスタンス接続名** の指定が必要なのだが、これを勘違いして**インスタンス名**を指定していた...。

```hcl
resource "google_cloud_run_service" "cloud-run" {
  ...

  template {
    spec {
      containers { ... }
      service_account_name = google_service_account.main.email
    }
    metadata {
      annotations = {
        // ↓ name ではなく connection_name を指定しなければならない。
        "run.googleapis.com/cloudsql-instances" = google_sql_database_instance.my-instance.connection_name
      }
    }
  }
  traffic { ... }
}

resource "google_sql_database_instance" "my-instance" { ... }
```

いまになって考えてみるとそりゃそうだという感じだが。作業してるときはログをみても何が間違っているのかわからんかった。

```shell-session
dial unix /cloudsql/my-project:us-central1:my-instance: connect: no such file or directory 
Cloud SQL instance named my-project:us-central1:my-instance is not specified in the list map[my-instance:true]. 
```

ちゃんとドキュメント読もうな。
https://www.terraform.io/docs/providers/google/r/cloud_run_service.html#example-usage-cloud-run-service-sql
Unityライセンスを3台目以降に登録する手順

Unity Pro/Unity Plusのライセンス 1つにつき「1人」のユーザーが同時に「2台」までのPCにUnityをインストールして使用することができる。
3台目のPCでアクティベーションしたい場合は、他のPCのアクティベーションを解除してから、アクティベートする必要がある。
（PCを買い替えた時のメモです）

## アクティベーション解除
管理ページに移動
https://unity.com/
![0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/f22b5300-f6b2-00c4-01d0-f96e8fca1cef.png)

My Account > My Seats
該当ライセンスの左にある歯車アイコンをクリック
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/9fc6c963-2dab-8a99-7f3e-d1078ac5a6c6.png)

Serial key 部分をクリック
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/38aca463-6190-5cec-a0d9-c1a63f735049.png)

アクティベーションされているPC一覧が表示されるので、
解除したいPCを選択して「Remove selected activations」をクリック
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/2101e13f-da6c-8fed-1be5-36d66cde3161.png)

## 3台目のPCにてアクティベーションする
Unity Hub を起動して、画面下の「ライセンスを管理」をクリック
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/1ba10bf0-79f7-e25c-94fd-767d5ff7f980.png)

「新規ライセンスの認証」をクリック
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/3cc365ee-80a3-1a1c-bca2-414fcd333465.png)

シリアル番号を入力して実行をクリック
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/edef9ff7-bbea-d061-2ffd-a8250fb3564d.png)
主成分分析が非線形データ扱えないっておかしくね？

#1 主成分分析は線形手法？

世の中的には「非線形データを扱うときは主成分分析ではだめ」というのが通り相場になっている。しかし、[Unsupervised Feature Extraction Applied to Bioinformatics](https://qiita.com/Yh_Taguchi/items/84eff8f04976a0552466)と題する本を昨年出版し、バイオインフォマティクスに主成分分析を用いた解析の論文を一杯出している僕としては「生命現象って非線形データの最たるものでは？」という思いがあり、内心、忸怩たる思いがある。主成分分析が非線形データ解析に適してないなら、なんで僕は一杯論文を書けたのか？そこで、ここでは簡単な例で「主成分分析が非線形データに弱い」というのは一種の「迷信」であることを主張したい。

#2 円の主成分分析
まず円を考えよう。具体体には$x_{i1} = \cos \left ( 2 \pi \frac{i}{N} \right) \in \mathbb{R}^N$,$x_{i2} = \sin \left ( 2 \pi \frac{i}{N} \right) \in \mathbb{R}^N$,みたいなことを考える。

```circle.R
N<-100
theta <- seq(0,2*pi,length=100)
x <- cbind(cos(theta),sin(theta))
plot(x) 
```
![Rplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199087/92d94ea6-2e32-53ec-fd15-dad373fd0ca6.png)
こんな感じである。ここで点$i_1$と点$i_2$のユークリッド距離行列$d_{i_1 i_2} = \sqrt{\sum_{j=1}^2 (x_{i_1j} -x_{i_2j})^2} \in \mathbb{R}^{N \times N}$を考え、これに特異値分解を適用してみましょう。

```SVD.R
D <- data.matrix(dist(x))
SVD<- svd(D)
plot(SVD$u[,2:3])
```
![Rplot01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199087/47b69488-c18c-e9f0-477a-fb055571e77f.png)
あれ、おかしいですね？円が再現されています。距離に直した段階で「非線形データ」になってしまったのだから、円は再現されないのではなかったでしたっけ？
いやいや、これは、ユークリッド距離だからでしょう？　二乗とって平方根だから結局、ほぼ線形の依存性だから。そうですね、じゃあ、$d^2_{ij}$を特異値分解してみましょう！

```SVD2.R
SVD2 <- svd(D^2)
plot(SVD2$u[,2:3])
```
![Rplot02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199087/9e31fb12-927c-57ca-0aaa-d5b2bf23d24b.png)
へんですね。やっぱり円が再現されています。主成分分析は非線形データを扱えないというのは嘘だったんでしょうか？

いやいや、これは円みたいなものだからでしょ？もっと複雑だったらだめなのでは？

#3 正規分布に従う乱数の主成分分析

そうですね、じゃあ、１００個の正規乱数を並べて、ユークリッド距離行列を作って２乗してから特異値分解をしてみましょう。さすがにここまでやったらダメなのでは？

```normal.R
set.seed(0)
ran <- matrix(rnorm(200),ncol=2)
SVD0 <- svd(ran)
D2 <- data.matrix(dist(ran))
SVD3 <- svd(D2^2)
plot(SVD0$u[,1:2])
points(SVD3$u[,2],-SVD3$u[,3],col=2) 
```
![Rplot03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199087/27f65dec-ad8c-5083-ebbe-ae91dadb7742.png)

黒が元データ、赤が「ユークリッド距離行列を作って２乗してから特異値分解」の結果です。見事に再現していますね？

ということで「主成分分析が非線形データを扱えない」というのは迷信だということがよくわかりましたね？

ありがとうございました！
便利なコマンドのくみあわせ

# ~/.bashrcの便利な設定


## 個人的にお気に入りな設定

### cdしたら、絶対パスとディレクトリの中身を表示
 
```bash:cdpwdls
cdpwdls ()                                                                                          
{                                                                                                   
    \cd $@ && pwd -P && ls                                                                             
 } 
alias cd='cdpwdls'
```

### head か tailしたら、lessで表示

```bash:hless                                                                                             
 hless ()                                                                                            
 {                                                                                                   
   \head $@ | less                                                                                 
 }   
```

```bash:tless                                                                       
tless ()                                                                                            
 {                                                                                                   
     \tail $@ | less                                                                                 
} 
 ```
     
モデルが落ちてSYSOUTをみたいとき、SYSOUT*がたくさんあるしファイルサイズ大きいし面倒だなあと思うんですが、
`tless SYSOUT*`
って打つと全部一気にtailしてlessしてくれます。便利！

### qsubのオプション設定
jobを投げるときに、前のjobがおわるまでholdしておく場合、よく使うオプションをまとめました。

1つ目の引数が、前のjobのjob ID、2つ目の引数が、次に投げたいjobスクリプト。

```bash:qsubok
qsubok ()
{
    \qsub -W depend=afterok:$1 $2
}
 ```

```bash:qsubany
qsubany ()
{
    \qsub -W depend=afterany:$1 $2
}
 ```

```bash:qsubfail
qsubfail ()
{
    \qsub -W depend=afternotok:$1 $2
}
 ```

### sshでポートフォワーディングで接続

`jupmonitor [ポート番号]`だけでウインドウを立ち上げてくれます。

```bash:jupmonitor
jupmonitor ()
{
     \ssh -N -L localhost:"$@":localhost:"$@" kanon@servername & \
     open http://localhost:"$@"/ &
```
insert時にパラメーターを7つ以上指定すると ArrayIndexOutOfBoundsExceptionエラーになる


# Why

- Insert処理時にパラメーターを7つ以上指定すると ArrayIndexOutOfBoundsExceptionエラーになる
- H2では問題なく処理される
- Oracleでは項目が増えるとInsert処理失敗


### 結果の例
```
Index 10 out of bounds for length 8
java.lang.ArrayIndexOutOfBoundsException: Index 11 out of bounds for length 8
	at oracle.jdbc.driver.OracleSql.computeBasicInfo(OracleSql.java:1552)
	at oracle.jdbc.driver.OracleSql.getSqlKind(OracleSql.java:976)
	at oracle.jdbc.driver.OraclePreparedStatement.<init>(OraclePreparedStatement.java:1233)
	at oracle.jdbc.driver.T4CPreparedStatement.<init>(T4CPreparedStatement.java:25)
	at oracle.jdbc.driver.T4CDriverExtension.allocatePreparedStatement(T4CDriverExtension.java:65)
	at oracle.jdbc.driver.PhysicalConnection.prepareStatement(PhysicalConnection.java:4080)
```



# Why
なぜ？

Jdbc6 ver 10.2.0.0.0 to 11.1.0.7.0)にバグがある
[JDBC \- Oracle ArrayIndexOutOfBoundsException \- Stack Overflow](https://stackoverflow.com/questions/277744/jdbc-oracle-arrayindexoutofboundsexception)

https://github.com/JetBrains/Exposed/issues/231

# What


Jdbc6を最新に上げる
https://www.google.com/search?q=latest+ojdbc6.jar&oq=latest+ojdbc6.jar&aqs=chrome..69i57j0l2.1512j1j1&sourceid=chrome&ie=UTF-8

最新バージョンは11.2.0.4のもよう

[Oracle Database 11.2.0.4 JDBC Driver](https://www.oracle.com/database/technologies/jdbcdriver-ucp-downloads.html)
[C++]XORによる1文字の暗号化, 復号

# 環境
- Ubuntu 18.04.4 LTS
- g++ 7.5.0
- GNU Make 4.1

# はじめに
自分の知識の`C++`が旧石器時代のものだったので, `C++17`の機能を使ってやってみました.
また, 簡単のために, 文字列ではなく, 文字を対象とします.
1文字暗号化(復号)できれば, 文字列にも応用できると思います.

# おおまかな流れ
- `a`を`ASCII`の2進数で表示
- 鍵である8bitの`key1`でXORによる暗号化, 復号
- 確認のために`to_integer`で整数型へ変換した後, `if`で評価

#仕組み
8bitの並びAと, 8bitの並びB(ただし, AとBは異なる)をXORしたものをCを,BでXORするとAに戻る.

例)
aは`ASCII`の2進数で`0110 0001`.
これを, 鍵`1011 0011`でXORすると`1101 0010`.
これを鍵`1011 0011`でXORすると`0110 0001`.

#ソース
```main.cpp

#include <cstddef>
#include <iostream>

using namespace std;

byte encode_xor(byte input, byte encode_key);
byte decode_xor(byte input, byte decode_key);

int main(void){

	byte a_ascii{0b01100001};
	byte key1{0b10110011};

	if(to_integer<uint8_t>(encode_xor(a_ascii, key1)) == 0b11010010){
		cout << "sucsess" << endl;
	}

	byte encoded{0b11010010};

	if(to_integer<uint8_t>(decode_xor(encoded, key1)) == 0b01100001){
		cout << "sucsess" << endl;
	}

return 0;
}

byte encode_xor(byte input, byte encode_key){
	return input ^ encode_key;
}

byte decode_xor(byte input, byte decode_key){
	return input ^ decode_key;
}

```

Makefile(マークダウンがうまく行かなかった)

```Makefile
build:
	g++ -std=c++17 -g -o main main.cpp

run:
	./main
```

#参考文献
[暗号技術入門 第3版 秘密の国のアリス (結城 浩 著)](https://www.kinokuniya.co.jp/f/dsg-01-9784797382228)
【python】スキルチェックのために最低限必要な必要なメソッド一覧

###0.はじめに～まず愚痴から始めてみる～

求人を見ていると、気になる企業がpythonで募集をしていた。
ついこの前まではPHP,そしてrubyの記事を中途半端な知識で書いている癖に、
今度はpythonだと！！！
エンジニアの風上にもおけなければ、風下にもおけない！！
機械学習のプログラムを少し、改修しただけだったがトライすることにした。
PHPと違って色々なやりづらさがある。
###「pythonの一歩はインデントとのコミュニケーション」
と言っても過言ではない。
コミュ障気味の方々や、美しさとは無縁のプログラムを書く人には辛い。
インデントでループや関数の処理が決まるのだ。
条件につける`:(コロン)`も慣れない。

とりあえずスキルチェックに必要な文法をまとめてみた。


###１．標準入力を受け取るinput()
`s=input()`

```python
dino=input()
print(dino)
```

![dino1_python.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494408/1ce1ec5c-ee6e-b0d0-c7d1-c2b954aee781.jpeg)

###2.出力
`print(s)`
文字列等を出力する関数


###３．文字列の分割関数
`文字列.split('区切り文字列')`

###４．配列の初期化
`配列名=[]`

###５．配列に要素を追加

`配列名.append(要素)`

```python
i=0
dino=[]
while i<3:
    s=input()
    dino.append(s)
    i=i+1
print(dino)    

```

![dino1_python_array1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494408/5b1e3853-3363-d18d-90ec-acf2e60ea94c.jpeg)
![dino1_python_array2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494408/ee709c03-2732-ee75-e2eb-5b38c90265dd.jpeg)


###６.判定文　if
`if 条件:`

###７．文字列型に変換str
`str(数字変数)`

###８．数値型に変換int
`int(文字列)`


###９.コメント

一行コメントは
\#コメント
複数行コメントはコメントの開始と終わりに
シングルコーテーションまたはダブルコーテーションを３つ記述

`'''
コメント
あいうえお
'''`

`"""
コメント
あいうえお
"""`


###１０．サンプルプログラム

今までの知識を総動員してサンプルプログラムを作成してみた。
３体の恐竜名と体重をスペース区切りで入力して、
5000㎏より重ければ「デブ」と表示、それ以下なら「そんなデブじゃない」
と表示するプログラム。

```python


#名前　体重
'''
Tyrannosaurus 8000 ティラノ
Velociraptor 1500　ブルーたん
IndominusRex 8800　ミナス

'''
i=0
dino2=[]
while i<3:
    s=input()
    dino2.append(s)
    i=i+1
    
i=0
while i<3:
     arr2=dino2[i].split(' ')
     if int(arr2[1])>5000:
        print(str(arr2[0])+' too fat')
     else:
        print(str(arr2[0])+' not fat')
     i= i+1
    
```

###実行例

![python_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494408/f4684597-ff7a-3aee-862d-4772c36cb88a.jpeg)
【Unity】Destroy()とDestroyImmediate()を使い分けなくていいようにする

# はじめに
Unityのエディタ拡張など非再生時に動くものを作ってると`Destroy()`と`DestroyImmediate()`を使い分けるのが地味に面倒なので、意識しなくてもいいようにします。

# 拡張メソッドを足す

```ObjectExtensions.cs
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif

public static class ObjectExtensions
{
    public static void Destroy(this Object self)
    {
#if UNITY_EDITOR
        if (EditorApplication.isPlaying == false)
        {
            GameObject.DestroyImmediate(self);
        }
        else
#endif
        {
            GameObject.Destroy(self);
        }
    }
}
```

```cs
// Before
#if UNITY_EDITOR
if (EditorApplication.isPlaying == false) {
    GameObject.DestroyImmediate(go);
} else
#endif
{
    GameObject.Destroy(go);
}

// After
go.Destroy();
```
Pythonにおける値の入れ替え

Pythonにおける配列等の要素の入れ替えは、一時的な変数を使わなくても表現できる。
結論を言ってしまうと、**アンパックを使えばよい**ということ。

例えば、以下のような配列があるとする。

```list.c
int lst[] = [2, 7, 4, 9, 13, 6, 3];
```


ここで配列の要素を入れ変えたい。
この時、C言語等の場合は一時変数を用意しなければならない。
例えば、上記配列の0番目と4番目を入れ替えたい場合、

```exchange.c
// 書き方の一例
int tmp;
tmp = lst[4];
lst[0] = lst[4];
lst[0] = tmp;
```

しかし、Pythonの場合はアンパックを使って以下のように書くことが出来る。

```list.py
lst = [2, 7, 4, 9, 13, 6, 3];
```

```exchange.py
lst[0], lst[4] = lst[4], lst[0]
```

こういう観点からも、Pythonはシンプルに書けるので良いですね(^^)