OmniAICreator/Qiita-1.07M huggingface dataset:
Nimでポインタ操作

# はじめに
Nimだけでコーディングしていると、ポインタってあんま使わないような気がするけど、
C言語のライブラリとか使おうとすると配列のポインタとか返すやつがいるので、
ポインタ操作が必要になってくる。

# ポインタ型は演算できない
C言語だと++とかでポインタを進められるけどNimだと演算できない

```nim
type pair = (int, int)
var array = [(1, 2), (3, 4), (5, 6)]
let array_ptr = array.addr
let new_ptr = array_ptr + 1   
```

```text
Error: type mismatch: got <ptr array[0..2, tuple of (int, int)], int literal(1)
```

# ポインタはuintにcastして計算する。
こんな感じ

```nim
type pair = (int, int)                                                                                                       
var array = [(1, 2), (3, 4), (5, 6)]                                                                                         
let array_ptr = array.addr                                                                                                   
for i in 0..array.len-1:                                                                                                     
  echo cast[ptr pair](cast[uint](array_ptr) + uint(sizeof(pair) * i))[]
```
```text:実行結果
(1, 2)
(3, 4)
(5, 6)
```


# 関数化
こんな感じのジェネリクス関数を定義しておくと便利かもしれない

```nim
proc `[]`[T](p: ptr T, index: int): T =                                                                                      
  cast[ptr T](cast[uint](p) + sizeof(T)*index)[]                                                                             
                                                                                                                             
var array = [(1, 2), (3, 4), (5, 6)]
let array_ptr = array.addr                                                                                                   
for i in 0..array.len-1:                                                                                                     
  echo array_ptr[i]    
```

以上〜。
【アウトプット前提で】もくもく＆成果発表会 #2 に行ってきた話

# 目的

- 人生初のもくもく会に参加したフィーリングを書く。
- より多くのエンジニアのもくもく会参加を後押しする。

# もくもく会とは？

- エンジニアが集まり黙々と勉強などをする集まりのこと。
- 何についてもくもくするかは決まっていないことが多い。
- 「教えてもらう」より「集中して作業をする」場所である。
- エンジニアのコミュニティや企業が主体となって実施していることが多い。

# もくもく会実施の情報はどこで手に入れるの？

1. connpass
    - エンジニアのイベントがまとめられているサイトである。→[https://connpass.com/](https://connpass.com/)
    - 「もくもく会」などで検索するとイベントがヒットする。
    - 自分の居住地の近くのもくもく会を探して参加してみよう。
1. Twitter
    - 「〜さんが〇〇のもくもく会に参加しました。」など周りの人が参加しているもくもく会の情報をゲットできる。
1. テック系podcast
    - パーソナリティの方やゲストの方が主催するもくもく会を告知する場合がある。
    - どんなもくもく会なのか少し深堀話も聞けるのでハードルが下がる。

# 今回参加したもくもく会

- 株式会社ランチェスターのざきさん主催[【アウトプット前提で】もくもく＆成果発表会 #2](https://lanchester-tech.connpass.com/event/149897/)である。
- もくもくする内容は問はず、ひたすらもくもくするもくもく会だった。
- 参加人数は自分と主催者さん含めて５人だった。
- 最初に軽い自己紹介と今日何を実施するかを話す。
- ４時間弱もくもくする。
- その日に実施したことを簡単に発表した。

# 筆者が感じたもくもく会のメリット

1. 誰かに見られているのでサボれない。
1. そのひの作業進捗具合を客観的に評価してくれる方がいる。
1. 作業内容に対してフィードバックをもらえる。
1. 何より集中できる。
1. 発表を行うことでLTなどの練習になる。
【Python】Seleniumでスクリーンショットを撮る

- seleniumで遷移したウェブページのスクショを撮った時のメモ
- 以下のコードと同ディレクトリ内に```image```という名前のディレクトリを作成し実行してください



```python
import os
import sys
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# File Name
FILENAME = os.path.join(os.path.dirname(os.path.abspath(__file__)), "image/screen.png")

# set driver and url
driver = webdriver.Chrome('./chromedriver')
url = 'https://www.rakuten.co.jp/'
driver.get(url)

# get width and height of the page
w = driver.execute_script("return document.body.scrollWidth;")
h = driver.execute_script("return document.body.scrollHeight;")

# set window size
driver.set_window_size(w,h)

# Get Screen Shot
driver.save_screenshot(FILENAME)

# Close Web Browser
driver.quit()
```

撮られたスクショがこのようにディレクトリ```image```内に保存されています．

![screen.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/377231/52a731a4-8dc0-a2a0-d364-1f293565f76a.png)

[GitHub](https://github.com/shutokawabata0723/selenium_screenshot)をクローンして```exe.sh```を実行するのもありです．
初めてPayJPを使ったので操作方法をまとめた

# PayJpの操作について
PayJPのコンソールの操作について、テスト・運用の観点でまとめました。

## PayJp決済テストの方法
テストで使用するクレジットカードの番号には以下のURLに書かれてある番号が使用できます。
カード期限切れや与信枠オーバなどは以下URLに書かれている番号にてテストすることができます。

https://pay.jp/docs/testcard

## APIの調べ方
PayJPのAPIは以下のURLにドキュメントがあります。
https://pay.jp/docs/api/
<img width="1241" alt="payjp_api_doc_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342/92503c61-f6ba-0be0-0bbb-663f7e2f5148.png">
APIをテストするにはコマンドラインからcurlコマンドにて確認することで、APIのリクエスト・レスポンスのインプット・アウトプットが確認できます。
<img width="1241" alt="payjp_api_doc_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342/4a4899cb-db25-4041-4267-ae249d05134f.png">
また、右上のタブを選択することにより、各言語のサンプルを確認することができます。

## 管理・運用
以下のURLからPayJPの管理コンソールへアクセスできます。
運用に関わるメニューについて以下に記述いたします。

https://pay.jp/

### 顧客
<img width="1274" alt="payjp_user_list.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342/16a5a098-015c-e7f3-67f9-00d8665a09cb.png">
PayJPのコンソールの「顧客」メニューを選択するとユーザの一覧が表示されます。

### プラン
<img width="1274" alt="payjp_plan_list.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342/285b6f48-3825-3ea5-4dc3-fec845ca8b0e.png">
PayJPのコンソールの「プラン」メニューを選択するとプランの一覧が表示されます。
コンテンツや商品が増える度にこのメニューからプランを追加します。

### 定額課金
<img width="1274" alt="payjp_subscribe_list.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342/5e921a25-6d1a-a247-b632-1b282f4fdbbb.png">
PayJPのコンソールの「定額課金」メニューを選択すると現在定額課金中の状態を確認することができます。

### イベント
<img width="1274" alt="payjp_event_list.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342/11501185-c284-79d0-9000-4d5fbd38e0db.png">
PayJPのコンソールの「イベント」メニューを選択すると課金処理のイベント一覧を確認できます。
トラブルの際、原因調査に利用できます。

### API KEY
<img width="1274" alt="payjp_api_key.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3342/8ece6866-549c-971b-f891-a2581bb49f62.png">
PayJPのコンソールの「API」メニューを選択するとAPIのキーを確認できます。
API KEYはAPIにアクセスする際に利用するKEYとなります。
最初に設定した後は利用することは、ほぼありません。
[mac] 新OS Catalina にアップデートした際に、gyazoが動作しない

## 現象
OSをCatalinaにアップデートした際に、gyazoがきちんと動作しなくなった。
gyazoでキャプチャーしようとすると、なぜか背景しかキャプチャーできない。

https://gyazo.com/6b0efcfde14939fa4a2ab2d07d38b295

## 解決策

公式から、以下のtweetがありました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">[For Mac users] After updating to Mac OS <a href="https://twitter.com/hashtag/Catalina?src=hash&amp;ref_src=twsrc%5Etfw">#Catalina</a> a dialog will appear on the first startup. To continue using Gyazo please press &quot;Open System Preferences&quot;, select &quot;Image Recording&quot; from &quot;Security and Privacy&quot;, and check Gyazo and Gyazo GIF.<a href="https://t.co/VMKPPgLoaD">https://t.co/VMKPPgLoaD</a> <a href="https://t.co/WHfaI3BBiq">pic.twitter.com/WHfaI3BBiq</a></p>&mdash; Gyazo (@gyazo) <a href="https://twitter.com/gyazo/status/1182169533382983680?ref_src=twsrc%5Etfw">2019年10月10日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

公式のヘルプにも記載があります: [Gyazo ヘルプ \- 目的の場所ではなくデスクトップがキャプチャされてしまう](https://helpfeel.com/GyazoJP/--5e181caab9f6660017be792d)

### 画面収録を許可に設定する

システム環境設定>セキュリティとプライバシー>画面収録
に入り、`Gyazo.app` `Gyazo GIF.app` にチェックマークを入れます

![スクリーンショット 2019-10-23 21.13.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142616/715cdbfe-4157-bdec-3c44-441d381f59a1.png)

この方法で無事解決できました！

## 同様の現象
他のアプリでも同じようなことが発生しているので、設定で変更してあげましょう。
https://qiita.com/bbapexx/items/208ded6064e8ae08294e
AWS認定 SysOps アドミニストレーター アソシエイト（SOA）の受験記録

**2019/10/21に試験に合格しました。**

9/23にソリューションアーキテクトプロフェショナルに合格したので、その勢いで勉強しました。

https://qiita.com/murapon/items/ae5778ae221a62ed9d21

ネットでは、SAAに合格できたら、他のアソシエイト資格はさほど学習しなくても合格できると書かれてたので、SAPに合格するレベルだったら楽勝だろうと思って勉強始めたのですが、意外とわからないことが多く、ちゃんと勉強としてなかったら落ちてたと思います:sweat_smile:
やはり、分野が異なるので、それなりに学習した方がより確実に合格できるかと思います。

## 学習内容
### 1. 試験ガイドの確認
まずは試験ガイドを確認します。

https://aws.amazon.com/jp/certification/certified-sysops-admin-associate/

（ざっと読む程度でいいです。）
試験ガイドより、こちらの

https://aws.amazon.com/jp/certification/certification-prep/

sysopsの欄にある、「AWSホワイトペーパーおよびよくある質問」が参考になります。
ここに掲載されているホワイトペーパーやよくある質問、対象サービスのBlackbeltは読んだ方がいいです。
ここに記載はないですが、CloudFormationに関する問題もよく出たのでそちらのサービスも学習した方がいいです。

### 2.黒本で学習

https://aws.koiwaclub.com/

前回SAPの為に契約した期間(3ヶ月)のうち、1ヶ月余っていたので、こちらでまず勉強しました。
簡単かと思って始めたのですが、初回の正解率が50%ほどで少し焦りました。
3回ほど繰り返して9割以上正解できるようにします。

### 3.Udemyで学習

https://www.udemy.com/course/aws-certified-sysops-administrator-associate-practice-exams-soa-c01/

黒本だけだと不安だったのでこちらも解いて覚えました。
こちらも4,5回繰り返して9割以上正解できるようにしました。

## 試験振り返り
813/1000で合格しました。
SAPの時は手探り状態だったこともあり、4ヶ月ほどかかりましたが、こちらは1ヶ月で合格できました。
アーキテクトと違い、コマンドや定数名が問題に出てきますが、数は多くないので問題集で出たものを都度覚えていくで問題ないかと。
今回の試験でも、コマンドラインを問う問題は1問だけでした。
Rubyの基本箇所についての復習②(#{ })

#はじめに
[前回の記事](https://qiita.com/Moon1126Snow/items/972e9b16822453384d4e)でRubyの最も基本的な部分について書かせて頂きました。
今回はもう少し詳しくRubyの基礎について書きます。
#内容
変数の応用的な使い方
#実行
前回の記事を読んで頂ければ、Rubyを使って文字を出力させる方法がわかって頂けると思います。
例えば'私の趣味は読書です'と出力したい場合は、

```ruby
puts "私の趣味は読書です"
```
という風にすればよいのでした。
同じように'私の趣味はスポーツです'と出力したい場合は、

```ruby
puts "私の趣味はスポーツです"
```

とすればいいです。

しかし、このコードを見てみると無駄が多いですね。
どちらの文章も'私の趣味は'と'です'の部分は共通していて、
'読書'と'スポーツ'の部分だけ変更すれば良さそうです。

そこで、前回にも登場した変数を使ってコードを書いてみたいと思います。

```ruby
hoby = "読書"
puts "私の趣味はhobyです"
```

こうすれば'私の趣味は読書です'と出力されるでしょうか？
残念ながらそうはなりません。
[前回の記事](https://qiita.com/Moon1126Snow/items/972e9b16822453384d4e)の最後で、
```puts "word"```という風に、変数をダブルクォーテーション（")で囲んでしまうと、そういう文字だと認識され、'word'と出力されてしまうという事を書かせて頂きました。
今回も同じ事が起き、実際に出力されるのは`私の趣味はhobyです`という、狙いとは違った文章が出力されてしまいます。

それでは、どうすれば狙い通り`私の趣味は読書です`と出力できるのでしょうか？

Rubyでこのような事を行いたい場合は、下記のようにコードを書けば良いです。

```ruby
hoby = "読書"
puts "私の趣味は#{hoby}です"
```

このようにコードを書けば、狙い通りの'私の趣味は読書です'という文章が出力されます。
さっきと変わった部分は、```hoby```の部分を```#{hoby}```と書き換えただけです。
同じように、

```ruby
hoby = "スポーツ"
puts "私の趣味は#{hoby}です"
```
とすれば、'私の趣味はスポーツです'という文章が出力されます。

このように```#{}```を使えば、代入する変数を変えるだけで、違う文章を出力させることができます。
今回のような短い文章ではありがたみが分りにくいですが、もっと長い文章を出力したり、または１つだけではなくもっと多くの文章を出力しなければならなくなった時に、この方法のありがたみが解ってきます。

#終わりに
今回の記事の方法だと、変数を一々コード内に書かなければいけないという弱みがあります。
[次回の記事](https://qiita.com/Moon1126Snow/items/33066b3c09a873690c85)では、これを解決する方法について書きたいと思います。
EclipseにLombokを設定する方法

# Eclipseに設定する
- 環境
    - Windows 10 Pro 64bit バージョン1909
    - java 11
    - Eclipse Version: 2020-03 (4.15.0)

1. Eclipseを開いている場合は閉じる
1. [projectlombok.org](https://projectlombok.org/download)からjarファイルをダウンロードする
    - 今回ダウンロードしたのは、lombok-1.18.10.jar
1. jarを実行してダイアログを開く
    - `$ java -jar /path/to/lombok-1.18.10.jar` でjarを実行してダイアログを開く
    - jarファイルをダブルクリックしても開く 
1. Lombokをインストールする
    1. [IDEs]を確認する![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/5428342b-7f9e-8a5d-e692-1a4ea92fdb7d.png)
    1. 使うEclipseが表示された場合
        - チェックを入れて[Install/Update]ボタンでインストールする
    1. 使うEclipseが表示されない場合
        - メッセージダイアログが表示されてEclipseが認識されないこともある![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/ea5acab7-2777-4b04-1ce9-505bdb17984a.png)
        - [Specify location...]ボタンからEclipseのインストールディレクトリを指定する
1. ダイアログを閉じる
    1. [Quit Installer]ボタンでダイアログを閉じる
    1. eclipse.iniに以下が追記される

```ini:eclipse.ini
-javaagent:C:\path\to\eclipse\lombok.jar
```

# プロジェクトでLombokを設定する
## Mavenを使っている場合
1. [Maven Repository: org.projectlombok » lombok](https://mvnrepository.com/artifact/org.projectlombok/lombok)からインストールしたバージョンのMaven用の記載をコピーする
2. pom.xmlにコピーした内容を貼り付ける
1. [Project Explorer]でプロジェクトを選択 > 右クリック > [Maven] > [Update Project](Alt + F5)でダイアログを表示する
4. [OK]ボタンで更新する
5. [Maven Dependencies]にLombokが追加される

```xml
...省略...
  <dependencies>
...省略...
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.10</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
...省略...
```
![スクリーンショット 2020-07-27 22.31.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/8e779b99-fecd-eba1-7c6c-569eb8e58758.png)

## Maven以外の場合
1. [Project Explorer]でプロジェクトを選択 > 右クリック > [Build Path]/(ビルド・パス) > [Configure Build Path...]/(ビルド・パスの構成)でダイアログを表示する
2. [Libraries]タブ > [Classpath] > [Add External JARs...]/(外部Jarの追加)ボタン > lombokのjarを選択する
    - lombokのjarの場所 : インストールでeclipse.iniに追記された`-javaagent`にあるパスの場所
3. [Apply and Close]ボタンでダイアログを閉じる
4. [Referenced Libraies]にLombokが追加される
![スクリーンショット 2020-07-27 22.49.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/05a482c0-096d-df59-0f9a-09cdd6a282b7.png)
![スクリーンショット 2020-07-27 22.54.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/949955eb-b781-f481-8d7a-13120f58d55a.png)
CloudSQL(MySQL)でutf8mb4を使う

# 概要
ユーザの投稿時に絵文字 (😁) を入れたら、SQL内でエラーが起きた。
その対応のために、テーブルに保存するには `charset = utf8mb4` という文字コードにしないといけない。
かつ、それを検索するためには、 `collate = utf8mb4_bin` にする。
collateの値については試行錯誤していたのもあり、確実ではないが、他のblogなどを色々参照していくと、binにするのが良さそうということ、たしかに検索もできた。

## 前提
すでに以下のようなテーブルがあり、この中のnameに絵文字が入るという要件があるとする

```sql
CREATE TABLE `users` (
  `id` varchar(255) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `photo_url` varchar(255) DEFAULT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
```

## 環境
CloudSQL(MySQL 第2世代 5.7)

## やり方
1. 対象のカラムのcharsetとcollateを変更する
2. プログラムの方でdbにアクセスする際にcharsetを utf8mb4 にする
あとは
* テーブルのデフォルトの文字列を変更する
* データベースのデフォルトの文字列を変更する
などの処理をしたほうが後々はいいが、ここでは割愛する（そんな全部絵文字対象ですか？ってこと + CloudSQLでの設定がよくわからん

### 1. 対象のカラムのcharsetを変更する
charset を utf8mb4、 collate を utf8mb4_bin にする

```sql
alter table users modify name varchar(255) character set utf8mb4 COLLATE utf8mb4_bin;
```

以下のようになっていればOK

```sql
mysql> show create table users;

CREATE TABLE `users` (
  `id` varchar(255) NOT NULL,
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `photo_url` varchar(255) DEFAULT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
```

### 2. CloudSQLにアクセスする charsetを utf8mb4 にする
Goでsqlxを使っている例であるが、他の言語でもあまり変わりはないはず
charset=utf8mb4 にする

```golang
db, err := sqlx.Connect("mysql", fmt.Sprintf("%s:%s@unix(%s/%s)/%s?charset=utf8mb4", user, password, socDir, connectionName, databaseName))
```

## まとめ
とりあえずutf8mb4を使うとデータを入れることができ、また utf8mb4_bin を利用すると検索ができる。

~~utf8mb4_bin の他にいろいろあるが、果たして一番何が正しいのかがまだわかっていない（indexを貼るような場合が鍵なはず~~

まとめてくださっていた。厳密な検索をしたいならbinでいいですね。
https://qiita.com/tfunato/items/e48ad0a37b8244a788f6

## その他

ちなみにDBの方だけ対応している場合は以下のようにエラーになる(in句に顔文字を入れた場合

```
Error 1271: Illegal mix of collations for operation ' IN '
```

ローカルからCloudSQLProxyを使って、CloudSQLにアクセスする方法が便利
https://cloud.google.com/sql/docs/mysql/sql-proxy?hl=ja
[ゼロから作るDeep Learning]交差エントロピー誤差のバッチ対応・Not One Hot対応の方法を分かりやすく解説してみた

#はじめに
この記事は**ゼロから作るディープラーニング 5章ニューラルネットワークの学習**を自分なりに理解して分かりやすくアウトプットしたものです。
文系の自分でも理解することが出来たので、気持ちを楽にして読んでいただけたら幸いです。
また、本書を学習する際に参考にしていただけたらもっと嬉しいです。

#様々な場合に対応させるために
前回の記事で実装した交差エントロピー誤差は１つのデータを処理する事しか出来ない実装方法を使いました。
このままでは、一つのデータにしか対応ができなくバッチデータ（複数データ）やNotOneHotの正解データなどに対応することができません。
そこで今回は、**バッチデータの対応・Not One Hotの対応**をそれぞれ行っていこうと思います。

#バッチデータの対応
バッチデータに対応した交差エントロピー誤差を実装する時に一番重要になるのが平均を求めることです。
今まで通りの実装では、データの数だけ交差エントロピー誤差に処理された値が出力されてしまいます。それを全て人間の処理能力で処理しきるのは不可能です。
そこで、たくさんの処理された値から平均を出す事でその問題を解消します。

```python
#複数データに対応した　２次元配列に対応した
def cross_entropy_errors(t,y):
    if y.ndim == 1:
        t = t.reshape(1,t.size)#データを２次元配列にする
        y = y.reshape(1,y.size)
    batch_size = y.shape[0]
    return -(t*np.log(y + 1e-7)).sum() / batch_size
ts = np.array([[0,0,0,0,1],[0,0,1,0,0]])#正解データ
ys = np.array([[0.1,0.05,0.05,0.1,0.7],[0.1,0.2,0.4,0.1,0.2]])#softmax関数の出力値
cross_entropy_errors(ts,ys)
0.636482641477893
```

バッチデータへの対応を行うと今までの単体データを処理することができなくなってしまいます。
そこで上の実装では、if文の部分で単体データをバッチデータと同じ２次元配列の形にすることで問題を解消しています。

#Not One Hotの対応
今までの正解データは全て正解ラベルが１でそれ以外は０のOne Hot法のものを使用して来ましたが、これから使うデータの中に正解ラベルのindex番号がそのまま使用されたラベルデータなどのNot One Hotの正解データがあるかもしれません。

これから下でそのようなデータに対応した実装法を行いたいと思います。

```python
#正解データがone_hot法ではなくラベルデータの場合
def cross_entropy_errors_label(t,y):
    if y.ndim == 1:
        y = y.reshape(1,y.size)#データを２次元配列にする
    batch_size = y.shape[0] 
    return -(np.log(y[np.arange(batch_size),t]).sum()) / batch_size
t_label = np.array([4,2])#正解データ
y_label = np.array([[0.1,0.05,0.05,0.1,0.7],[0.1,0.2,0.4,0.1,0.2]])#softmax関数の出力値
cross_entropy_errors_label(t_label,y_label)
0.6364828379064438
```

交差エントロピー誤差は数式の性質上、本当に必要なデータは正解ラベルのsoftmax関数の出力値だけです。

交差エントロピー誤差の数式は**正解データ✖️logネイピア数(softmax関数の出力値)の総和✖️-1**です。
しかし、one hot法の正解データは正解ラベル以外は０のためほとんどが０になります。その為、正解ラベルのsoftmax関数の出力値しかいらないのです。

上の実装では、ラベルデータを使って正解ラベルのsoftmax関数の出力値を取得し、計算処理を行っています。
※上の実装はバッチデータにも対応してます。
初心者によるプログラミング学習ログ 134日目

# 100日チャレンジの134日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

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

134日目は、

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>134日目<br><br>・サンプルサイトのコーディング<br>・sassの書き方<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/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</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/sass?src=hash&amp;ref_src=twsrc%5Etfw">#sass</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1185303647795609600?ref_src=twsrc%5Etfw">October 18, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 


技術書のサンプルサイトのコーディングをある程度すすめてから、前に戻ってCSS部分をSassで書いてみる練習です。

webサイトコーディングもできて、sassの書き方も学習できるのでおすすめ。
RAIDをざっくり理解したい

##RAIDとは
複数のハードディスクを組み合わせて仮想的な１台のハードディスクとして認識させ、冗長性と高速性を向上させる技術。
1988年に提唱され、デジタルデータの重要性が上がる中で普及した。

###冗長性（冗長化）とは
同じ機能や目的のリソースを複数台用意しておき、１台に障害が起きてもシステムを継続して運用できる状態にし、耐障害性を高めること。
例えば、Webアプリを２台のWebサーバーで運用して、１台が障害で落ちてももう１台のサーバーで運用し続けられるようにする・・・みたいな。

##RAIDの種類
RAIDにはバックアップのレベルや方法によっていくつかの種類がある。主要なものだけざっくり紹介。

###RAID0
複数のディスクに対してデータを分散し、並行して同時に読み書きすることで高速化する。
ストライピングとも呼ばれる。
例えば、ディスクを２台使用すると、１台のときの２分の１の時間で読み書きが完了する。
単にデータを分散して保存するため、冗長性はない。
<img width="307" alt="スクリーンショット 2019-10-22 14.29.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191739/71142102-5de0-6089-c7b8-466841f35513.png">


###RAID1
複数のディスクに同じデータを書き込む（＝コピー）。
ミラーリングとも呼ばれる。
一方のディスクがダメになっても、もう一方が生きていればデータは保たれる。
<img width="287" alt="スクリーンショット 2019-10-22 14.29.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191739/bb218003-5836-9d03-8821-f5f71d4d2d39.png">

###RAID5
データ保存時に、パリティと呼ばれる”データを復元するためのデータ”も生成して保存する。
パリティからデータの復元が可能なため、ディスクが１台故障してもデータに影響が出ない。
<img width="526" alt="スクリーンショット 2019-10-22 14.46.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191739/6415b830-84ca-0e56-ac79-b100bb2ac527.png">

###RAID6
同じデータのパリティを２つ用意し、異なるディスクに保存することで冗長性を高める方法。
RAID5よりもさらに耐久性が必要な場合に用いられる。
パリティの算出方法が何種類かあるので気になる方は調べてみてください。

###その他
高速化、冗長化の向上や条件に応じて上記を組み合わせる手法もある。
(RAID1+0(=RAID10)、RAID1+5など）

###参考
[RAID - Wikipedia](https://ja.wikipedia.org/wiki/RAID "RAID - Wikipedia")


###さいごに
パリティのイメージとか今までよくわかっていなかったので改めて整理、まとめてみました。
【Kotlin】「is~」で始まるメソッドでBoolean?を返す場合AssertTrue / AssertFalseでバリデーションできない【BeanValidation】

記事内容はタイトル通りです。

こうなる原理は以下の記事をご参照ください。

- [【BeanValidation】「is~」で始まるメソッドでjava\.lang\.Booleanを返す場合AssertTrue / AssertFalseでバリデーションできない【Java】 \- Qiita](https://qiita.com/wrongwrong/items/d9e72a16c044af8d8981)

# 概要
メソッドに`AssertTrue`を付けた場合、バリデーションできる/できないは以下のようになります。

```kotlin
// バリデーションできる
@AssertTrue
fun getHoge(): Boolean? = false

// バリデーションできない
@AssertTrue
fun isHoge(): Boolean? = false

// バリデーションできる
@AssertTrue
fun isFuga(): Boolean = false
```

# 原因
以下は上記コードのデコンパイル結果です。

`Kotlin`は`Boolean?`型を`java.lang.Boolean`にコンパイルします。
そして、冒頭に貼り付けた記事の通り、`java.lang.Boolean`はオブジェクトなので、`BeanValidation`は`is~`から始まるメソッドを無視してしまうため、バリデーションは機能しません。

```java
@AssertTrue
@Nullable
public final Boolean getHoge() {
   return false;
}
@AssertTrue
@Nullable
public final Boolean isHoge() {
   return false;
}
@AssertTrue
public final boolean isFuga() {
   return false;
}
```
書き込むと自動的に拡大するTEXTAREA

#textareaは自動的に拡大してもらいましょう。
スクロールしながら長文を入力するのは嫌ですね。
下記のファイルを置いて、各htmlページに
```<script src="./auto_resize.js" type="text/javascript"></script>
```の1行を追加すると、すべてのtextareaが自動拡縮になります。

```javascript:auto_resize.js
document.addEventListener('DOMContentLoaded',function(event){
	autoResize_all();
},false);

function autoResize_all()
{
	nodes=document.getElementsByTagName('TEXTAREA');
	for(n=0;n<nodes.length;n++){
		autoResize(nodes[n]);
		nodes[n].addEventListener('input',function(event){autoResize(event);},false);
	}
}

function autoResize(event)
{
	node=event.target;
	if(node){
		if(node.scrollHeight < node.offsetHeight){
			node.style.height="initial";
		}
		if(node.scrollHeight > node.offsetHeight){
			node.style.height = node.scrollHeight + "px";
		}
	}
}
```
いちいち見出しに「必須入力」と書く労力

#自動的に「必須入力」を付記させる
```html:form.html
<label>
	<span>メールアドレス（※必須）</span>
	<input type=…>
</label>
```
…なんてことをしますが、書き忘れたり、仕様変更で必須ではなくなったりしますね。表記と挙動が違うのは避けたいものです。

inputタグに"required"が付いているものが必須なわけですから、自動的に「必須」と付記させましょう。下記のファイルを置いたら、各htmlページに
```<script src="./check_required.js" type="text/javascript"></script>
```の1行を追加してください。

```javascript:check_required.js
document.addEventListener('DOMContentLoaded',function(event){
	check_required();
},false);

function check_required()
{
	for(i=0;i<document.forms.length;i++){
		for(j=0;j<document.forms[i].elements.length;j++){
			e=document.forms[i].elements[j];
			if(e.attributes.getNamedItem("required")){
				e.placeholder+="[必須]";
				e.previousElementSibling.innerHTML+="[必須]";
			}
		}
	}
}
```
これで少しは手間が省けますね。
（個人メモ） Rails5モデルの関連付けるとき　気をつけましょう

# 前提

Railsでモデルを更新するようなコードを書こうとして、思いの外ハマって変更しない関連させていたモデルもロードさせる

## テーブル構造

以下簡単なテーブルを作ってみます。

<img width="470" alt="Untitled_Diagram_drawio_-_draw_io.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134137/85059973-63b9-6829-9dec-64efd536a466.png">



### とりあえず書いてみる

ひとまず自分の思うがままにコードを書いていく。


```Ruby
# app/models/product.rb

class Product < ApplicationRecord
  belongs_to :category
  belongs_to :main_image, class_name: 'PublicImage', foreign_key: :main_image_id
  
  validates :name, uniqueness: true
end
```

いい感じにコードを書いているが。。。

## しかし、問題が起きる…

既存レコードを更新してみるとログで無駄なqueryが出ているな

`Product.first.update(name: "test")`

```SQL
  Product Load (0.7ms)  SELECT  `products`.* FROM `products` ORDER BY `products`.`id` ASC LIMIT 1
   (0.1ms)  BEGIN
  Category Load (0.6ms)  SELECT  `categories`.* FROM `categories` WHERE `categories`.`id` = 1 LIMIT 1
  PublicImage Load (0.2ms)  SELECT  `public_images`.* FROM `public_images` WHERE `public_images`.`id` = 1 LIMIT 1
  Product Exists (0.8ms)  SELECT  1 AS one FROM `products` WHERE `products`.`name` = BINARY 'black-ball' AND `products`.`id` != 1 LIMIT 1
   (0.2ms)  COMMIT
=> true
```

なぜかProductの更新だけのにCategoryとPublicImageもロードさせいるか
調べてみると「Rails5からbelongs_to関連はデフォルトでrequired: trueになる」ということがわかりました。

## 改善

required: falseにしたい時はoptional: trueと書けるようになる。
実感required: trueにしたいですが、そのまま書いてると無駄なqueryが発生されていたまま気持ち悪いです。

じゃ、以下の書き方で解決しましょう。
単純に外部キーを更新するとき、バリデーションかける。

```Ruby
# app/models/product.rb

class Product < ApplicationRecord
  belongs_to :category, optional: true
  belongs_to :main_image, class_name: 'PublicImage', foreign_key: :main_image_id, optional: true
  
  validates :name, uniqueness: true

  validates :category, presence: true, if: :validate_category_presence?
  validates :main_image, presence: true, if: :validate_main_image_presence?

  private
  
  def validate_category_presence?
    new_record? || category_id_changed?
  end

  def validate_main_image_presence?
    new_record? || main_image_id_changed?
  end
end
```

## 結果

簡単な改善ですが、スピードの効果はすごいです。
以下は簡単に検証して観ます

```ruby
a = Time.now
1000.times{Product.first.update(name: "test")}
b = Time.now
b - a
```

修正前:  15.837107
修正後:  5.362079

以上
Cocos2d-x 3.17.2をiOS, Androidでコンパイルできないんですけど

現在（2019/10/23)の最新版v3.17.2でCocos2d-xで久々にiOSとAndroidでHello worldをコンパイルした。
プロジェクトデフォルトのHello worldのコンパイルをするのにググったり苦労したのでヒントなど。

##iOS

xcode 11でコンパイルするとエラーになる。

```
error : Argument value 10880 is outside the valid range [0, 255] btVector3.h
```

btVector3.hの

```c++
#define BT_SHUFFLE(x,y,z,w) ((w)<<6 | (z)<<4 | (y)<<2 | (x))
```
を

```c++

#define BT_SHUFFLE(x, y, z, w) (((w) << 6 | (z) << 4 | (y) << 2 | (x)) & 0xff)
```

に置き換える


https://stackoverflow.com/questions/58064487/xcode-11-cocos2dx-compilation-problem-argument-value-10880-is-outside-the-vali



##Android

###NDK

NDKは、cocos2d-x 3.17.1時点で16なので、Android NDK 16bを選んだ。

https://discuss.cocos2d-x.org/t/which-ndk-to-use-on-3-17-1/45584
We still used NDK16.

ダウンロードはこちらから
https://developer.android.com/ndk/downloads/older_releases.html?hl=ja



### Android Studio
そして、Android Studio 3.5が最新であるがコンパイルができない。

```
Caused by: org.gradle.internal.UncheckedException: Build command failed.

make: *** No rule to make target `cocos2djs'.  Stop.

```

Android Studio 3.2を使うとコンパイルできる。
（https://teratail.com/questions/178744
のコメント欄より）


ダウンロードはこちらから
https://developer.android.com/studio/archive.html

とりあえずは動かせた。

cmake推奨となっているようでAndroid Studioの最新版でコンパイルしたい場合はビルドツールをndk-buildからcmakeに変更するといいのかもしれない。
https://qiita.com/ugonight_nanase/items/0cab13437dfa2ae003bd
Ruby 入門＃２（変数、定数）

Rubyの勉強アウトプット
今回は、変数、定数について記載します。
## 変数

####命名ルール
●先頭文字を大文字にすることはできない。
●１文字目に数字を使用することはできない。
●宣言と初期化を同時に行うこと（変数の宣言のみはNG）

####変数種別
●変数の１文字目により、変数種別が決まります。
●種別ごとに、スコープの範囲が違います。

##ローカル変数
●１文字目が、小文字または'_'で始まる変数は、ローカル変数になります。
●スコープは、定義された場所の範囲内のみ利用可能です。

```
name = "田中"
puts name
```

##グローバル変数
●１文字目に、「$」をつけるとグローバル変数となります。
●スコープは、メソッドやクラスを超えて参照することができ、定義した場所に限らず、参照や変更をすることができます。

```
$name = "田中"

class NameClass
  def nameShow
    puts $name
  end
end

nameClass = NameClass.new
nameClass.nameShow
```


##インスタンス変数
●１文字目に、「@」をつけるとインスタンス変数となります。
●スコープは、宣言されたクラスまたはサブクラスから参照することができます。
●オブジェクト毎に、異なる値を割り当てることができます。

```
class ClassName

  def setName(setName)
    @name = setName
  end

  def showName()
    puts @name
  end

end

name = ClassName.new
name.setName("田中")

name2 = ClassName.new
name2.setName("佐藤")

name.showName  #=>田中
name2.showName #=>佐藤

```

##クラス変数
●変数の先頭に、「@@」をつけるとクラス変数となります。
●スコープは、宣言されたクラス、インスタンスメソッドから参照、変更をすることができます。
●宣言されたクラスの、全てのインスタンスで共有されます。

```
class ClassName

  def setName(setName)
    @name = setName
  end

  def showName()
    puts @name
  end

end

name = ClassName.new
name.setName("田中")

name2 = ClassName.new
name2.setName("佐藤")

name.showName  #=>佐藤
name2.showName #=>佐藤

```

##定数
●先頭文字をアルファベット大文字にすると定数となります。
●Rubyでは、定数定義後に再代入を行うと、警告が発生しますが値は変更されます。

```
Name = "aaa"
Name = "bbb"
puts Name
#出力
warning: already initialized constant Name
warning: previous definition of Name was here
佐藤
```
【mastodon】bundle install でエラーが出たのでメモ

#はじめに
mastodonを読むと勉強になるということで、
bundle installしたらさっそくエラーが発生したのでメモ
##Failed to locate protobuf
```
current directory:
/mastodon/vendor/bundle/ruby/2.5.0/gems/cld3-3.2.2/ext/cld3
.rbenv/versions/2.5.0/bin/ruby -r ./siteconf20180326-69724-1yq4plx.rb extconf.rb
Failed to locate protobuf

To see why this extension failed to compile, please check the mkmf.log which can be found here:

/mastodon/vendor/bundle/ruby/2.5.0/extensions/x86_64-darwin-16/2.5.0-static/cld3-3.2.2/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in
/mastodon/vendor/bundle/ruby/2.5.0/gems/cld3-3.2.2 for inspection.
Results logged to
/mastodon/vendor/bundle/ruby/2.5.0/extensions/x86_64-darwin-16/2.5.0-static/cld3-3.2.2/gem_make.out

An error occurred while installing cld3 (3.2.2), and Bundler cannot continue.
Make sure that `gem install cld3 -v '3.2.2'` succeeds before bundling.
```

`gem install cld3 -v '3.2.2'` をやってみたけどダメで、
`protobuf`というパッケージが必要だということで　
`brew install protobuf` を実行したら通った。

##今度はこれが出てきた。

```
ERROR: could not find idn library!
current directory:
/mastodon/vendor/bundle/ruby/2.5.0/gems/idn-ruby-0.1.0/ext
/.rbenv/versions/2.5.0/bin/ruby -r ./siteconf20180326-5783-ruj5ss.rb extconf.rb
checking for -lidn... no
ERROR: could not find idn library!

  Please install the GNU IDN library or alternatively specify at least one
  of the following options if the library can only be found in a non-standard
  location:
    --with-idn-dir=/path/to/non/standard/location
        or
    --with-idn-lib=/path/to/non/standard/location/lib
    --with-idn-include=/path/to/non/standard/location/include

*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=.rbenv/versions/2.5.0/bin/$(RUBY_BASE_NAME)
	--with-idn-dir
	--without-idn-dir
	--with-idn-include
	--without-idn-include=${idn-dir}/include
	--with-idn-lib
	--without-idn-lib=${idn-dir}/lib
	--with-idnlib
	--without-idnlib

To see why this extension failed to compile, please check the mkmf.log which can be found here:

/mastodon/vendor/bundle/ruby/2.5.0/extensions/x86_64-darwin-16/2.5.0-static/idn-ruby-0.1.0/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in
/mastodon/vendor/bundle/ruby/2.5.0/gems/idn-ruby-0.1.0 for inspection.
Results logged to
/mastodon/vendor/bundle/ruby/2.5.0/extensions/x86_64-darwin-16/2.5.0-static/idn-ruby-0.1.0/gem_make.out
An error occurred while installing idn-ruby (0.1.0), and Bundler cannot continue.
Make sure that `gem install idn-ruby -v '0.1.0'` succeeds before bundling.
```

これも `brew install libidn` したら通ったが
なぜこの２つが必要なのかは、よく分かっていないので
教えていただけら嬉しいです。
Javascriptのgetter setterメモ

# getter/setterとは
以下のようにオブジェクトのpropertyにget/setを付けることにより、
プロパティの呼び出し時やプロパティへの値の代入時に関数が呼び出されるようになる。
正確には、getあるいはsetを付けるとpropetyの記述子が特別な「アクセサー記述子」になる。
(通常のpropertyはデータ記述子)

``` javascript
const hoge ={
 get hoge(){
    return "hoge";
 }
 set hoge(h) {
   console.log(h);
 }
}

hoge.hoge//hoge
hoge.hoge = "fuga"//consoleにfugaと出る

```
クロージャと組み合わせてオブジェクトのカプセル化やWrapperオブジェクトの作成に使える。

# getterの挙動
getterの挙動は一見、通常のデータ記述子に対するアクセスするのと変わらない。
オブジェクト宣言中でgetterを定義した場合、通常アクセスの外、
スプレッド構文やfor...inループにも表れる。

# getter、setter内で同名プロパティにアクセスした場合
getterやsetterはJavaなどの言語におけるgetterやsetterと異なり、
そのプロパティに紐づくもの自体をアクセサーに変える。
よって下記のようなコードは無限ループを引き起こす

```javascript
get hoge(){
  return this.hoge;
}

```


# getterやsetterを片方しか定義しなかった場合の挙動
getterしかないpropertyに値を代入しようとした場合には何も起こらない。
(そのプロパティが通常のデータ記述子型プロパティに変わったりはしない)
同様にsetterしかないプロパティに対して値を読みだそうとするとundefinedになる。

getterかsetterを一つでも定義した時点で、そのpropertyはアクセサー型のpropertyになるので、
未定義の側もデータ記述子型のように扱うことは出来ない。

# 消したい場合、更新したい場合
* deleteを用いればpropertyごと消えるので、getter/setter共に消滅する deleteにはpropertyの種類がデータ記述かアクセサー記述かは関係ない
* 上書きしたい場合はObject.definePropertyあるいはObject.definePropertiesを利用する。
* 上記のdefineProperty系はプロパティの属性ごと書き換えることが可能なので、アクセサ型のpropertyの書き換えも可能。
* かつては``Object.__defineGetter__``とかdefineSetterもあったが非推奨になった
* definePropertyを使うことで後からgetterやsetterの追加も可能。ただし、definePropertyをデフォルトオプションで使ってPropertyを追加すると、通常のプロパティ宣言とかなり挙動が異なる。(キーが列挙されない、書き換え不可になるなど)注意が必要
Kerasでk-fold cross validation使って学習するときに発生したエラー「ValueError: Tensor must be from the same graph as Tensor」への対応

## TL;DR

- 1つのプログラム内で複数のモデルをトレーニングする際、Optimizerのインスタンスはトレーニングごとに新しいインスタンスを作る必要がある

## 起こったこと

クロスバリデーションなどを使って、1つのプログラム内で複数のモデルをトレーニングする際、学習率やOptimizerなどのハイパーパラメーターを複数の学習で使い回すために変数に保存しておくことがありますが、その際にOptimizerのインスタンスを保存して使いまわそうとしたところ、以下のようなエラーが発生しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149333/1a273371-3b6d-f11a-b75c-a399948f663b.png)

## 対応

 複数のトレーニング間でOptimizerのインスタンスを使い回していることが問題のため、トレーニングごとにOptimizerのインスタンスを作り直すことで解決しました。

原因はおそらくAdamなどの適応的に学習率を変化させるOptimizerが、1次モーメントなどの状態を内部に持っているためだと考えられます。

ちなみに損失関数では発生しません。
状態を持っているはずがないのであたりまえといえばあたりまえですが紛らわしいですね。

## 参考情報

- [ValueError: Tensor must be from the same graph as Tensor with Bidirectinal RNN in Tensorflow](https://stackoverflow.com/questions/42616625/valueerror-tensor-must-be-from-the-same-graph-as-tensor-with-bidirectinal-rnn-i)
IEのインターネットオプション設定バッチ、コマンド

```IEのホームページと新しいタブをYahooに変更するバッチ.bat
@echo off

reg add "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main" /v "Start Page" /t REG_SZ /d "https://www.yahoo.co.jp/" /f

reg add "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\TabbedBrowsing" /v "NewTabPageShow" /t REG_DWORD /d "1" /f
pause

exit
```

```IEのホームページをYhooにする.bat
reg add "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main" /v "Start Page" /t REG_SZ /d "https://www.yahoo.co.jp/" /f
```

```デフォルトに戻す.bat
reg add "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main" /v "Start Page" /t REG_SZ /d "http://go.microsoft.com/fwlink/p/?LinkId=255141" /f
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main" /v "Secondary Start Pages" /f
pause
```

```新しいタブを開いたとき、最初のホームページにする.bat
reg add "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\TabbedBrowsing" /v "NewTabPageShow" /t REG_DWORD /d "1" /f
pause
```
AWS Cloud9でのpython2からpyhton3に変更する方法(pyenv利用）

# 概要
aws cloud9でslackbot用のラムダ関数を作成しようとした時に，python2からpython3への変更に手間取ったので，忘れないように書いておきます．結局，cloud9では，「Preference」=> 「Python Support」から2から3への変更が可能だったので，次回からはそうするようにします．
間違えてしまった理由として，前回，EC2サーバを自分で建てたとき，python2しか入っていなかったので，cloud9でサーバを立てた場合でも，python3は入っていないと思ってしまったためです．ですので，python3を入れるのがめんどくさいなら，cloud9を立ててec2を利用するのもいいかもしれません．

今回は，python2からpyenvからとってきたpython3.6.2に変えます．
# 利用環境
amazon linux2

# バージョン確認
pythonとpipのバージョンを確認しましょう．

```
$ python -V
Python 2.7.14
$ pip -V
pip 9.0.3 from /usr/lib/python2.7/dist-packages (python 2.7)
```

# pyenvのインストール
pyenvをgitから落としてきて.bash_profileにpyenvのpathを書き込む
その後sourceコマンドで.bash_profileを改めて読み込み（もしくは再起動）

```
$git clone https://github.com/yyuu/pyenv.git ~/.pyenv

$echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$echo 'eval "$(pyenv init -)"' >> ~/.bash_profile

$source ~/.bash_profile
```

pyenv へのpathが通っているか確認

``` 
$pyenv --version
pyenv 1.2.13-19-gf3d008fd
```

pyenvでインストール可能なバージョンを指定

```
pyenv install --list
  2.1.3
  2.2.3
  2.3.7
  2.4.0
  2.4.1
  2.4.2
  2.4.3
  2.4.4
  2.4.5
  2.4.6
  2.5.0
  2.5.1
  2.5.2
  2.5.3

```

いろいろ出ますが，今回は3.6.2を選択する．以下に保存される．

```
$pyenv install 3.6.2

$find . -name python3.6 
/home/ec2-user/.pyenv/shims/python3.6 2>/dev/null
/home/ec2-user/.pyenv/versions/3.6.2/lib/python3.6
/home/ec2-user/.pyenv/versions/3.6.2/bin/python3.6 
```

systemになっているので，3.6.2に変更

```
$pyenv versions
* system
  3.6.2 (set by /home/ec2-user/.pyenv/version)
$pyenv global 3.6.6
$pyenv rehash
```

これで

```
$pyenv versions
  system
* 3.6.2 (set by /home/ec2-user/.pyenv/version)
```

3.6.2のほうにチェックが入りました．
ただ，これでもpython2のままです．

```
$python  --V
python2.7.?
```

これは，.bash_rcで利用するpythonがすでに決められているためだ．
そこで，

```
$sudo vim ~/.bashrc

alias python='python27'
```
上の部分を削除します．
さらに，

```
$find / -name python3.6  2>/dev/null
/usr/lib/python3.6
/usr/bin/python3.6
/usr/local/lib/python3.6
/usr/local/lib64/python3.6
/usr/lib64/python3.6
/opt/c9/python3/lib/python3.6
/opt/c9/python3/bin/python3.6
/home/ec2-user/.pyenv/shims/python3.6
/home/ec2-user/.pyenv/versions/3.6.2/lib/python3.6
/home/ec2-user/.pyenv/versions/3.6.2/bin/python3.6
/home/ec2-user/environment/.c9/metadata/environment/calif/venv/lib/python3.6
~/.pyenv/shims/python3.6
```

とpythonのフォルダは２つ（はじめからあるもの(/usr/bin)と今入れたもの(home/ecs-user/.pyenv）ので，pythonを指定したときに，先に呼び出すファルダを決めます．
今は，

```
$which python
/usr/bin/python3.6
```
とかがでます．

そこで，

```
$ sudo vim /etc/paths

/home/ec2-user/.pyenv/shims
/usr/bin
/bin
/usr/local/bin
/usr/sbin
/sbin
/usr/local/sbin
```

として，pyenvのpythonを先に読み込むようにしましょう．
すると，

```
$which python
/home/ec2-user/.pyenv/shims/python3.6
```

となります．
ならないようなら，一度，サーバを落としてください．
これで，pyenvを使ってpython3.6.2を利用できるようになりました．
環境によって，バージョンは変えてください．
ちなみに，現状では，あらかじめ入っているpython3
3.6.8です．
ちなみに，

```
$pip -version
pip 19.3.1 from /home/ec2-user/.pyenv/versions/3.6.2/lib/python3.6/site-packages/pip (python 3.6)
```
となっており，pipはpython3を利用されるようになっている．
python2も共存しているので，pipコマンドを利用しているのか確認するとよい．
【windows CMD】現在のセッションで実行したコマンドの履歴を取得する（Linuxのhistoryコマンドlike）【TL;DR】

メモとして残します。


#■やり方
##一覧取得
```shell
doskey /h


#on linux↓
# history
```
##絞り込んで取得
```shell
doskey /h |find "キーワード"


#on linux↓
# history |grep キーワード
```
フルコントロールアクセス権付き共有フォルダ作成バッチ

##複合機に登録するスキャンフォルダの宛先を手動で設定するのが面倒なので作成した。

```共有フォルダ作成バッチ.bat
@echo off

rem scanフォルダを作成
md C:\scan

rem 1秒停止
timeout /t 1 /nobreak

rem scanフォルダ　共有をかける
net share scan=C:\scan /grant:Everyone,full

rem scan　アクセス権にEveryoneを追加＆フルコントロール
icacls C:\scan /grant Everyone:(OI)(CI)F /T

exit
```
バッチファイル作成後、ショートカット作成
⇒ショートカットを右クリック プロパティを開く
⇒ショートカットタブの詳細設定（D）  ☑管理者として実行（R）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462058/8941df0b-9323-f069-d92a-1fceeb561894.png)
⇒OK

※フォルダを共有フォルダに設定するには管理者権限が必要なため、このショートカットを実行する必要がある。
.NETFrameworkのConvert.ToDateTimeにハマった件

多言語対応のWindowsアプリケーションを実装している際に、FormatExceptionではまりました。

DBから日付を取得する際に形式をdd/mm/yyに設定し、String型で取得。
その後Convert.ToDateTimeへその文字列を渡すと、OSの地域、日付形式の設定に依存してFormatExceptionが発生しました。

公式リファレンスを読むと、内部的にDateTime.Parseが呼び出されており、これはOSの地域、日付形式に依存しているので、上記問題が発生しました。
[Convert.ToDateTime公式リファレンス](https://docs.microsoft.com/en-us/dotnet/api/system.convert.todatetime?view=netframework-4.8#System_Convert_ToDateTime_System_String_)

そこで、関数をDateTime.ParseExactへ変更し、形式を指定してあげることで解決しました。

多言語対応の場合は、使う関数がOSの設定に依存しないか確認する必要がありますね。
nuxt.jsでdotenvを使って環境変数を設定する

# 概要
nuxt.jsでAPIキー等のハードコーディングをやめて環境変数を使いたかった。

# 設定方法
プロジェクトに`dotenv`をインストール。

```shell
npm install --save dotenv
```

プロジェクトのルートに`.env`ファイルを作成して環境変数を記述

```
HOGE=hogehogehoge
```

`nuxt.config.js`で`dotenv`使えるようにする

```javascript
require('dotenv').config()

module.exports = {
...
}
```

`nuxt.config.js`に`.env`で記述した環境変数を定義

```javascript
module.exports = {
...,
  env: {
    HOGE: process.env.HOGE
  }
},
...
```

コードの中でこんな感じで使えます

```javascript
console.log(process.env.HOGE);
// hogehoehoge と表示される
```
jQuery フォームでのEnterキーによる誤作動封じ

#フォームでのEnterキーによる誤作動封じ



###enterキー封じ

```js

window.onload = function() {
        //formの部分はdom要素、id、クラスなどのセレクタを指定
        $('form').on('keydown', function(ev) {
            if ((ev.witch && ev.witch === 13) || (ev.keyCode && ev.keyCode === 13)) {
                ev.preventDefault();
            };
        });
}
```

###js読み込み時にenterキー効いてしまう問題対策
jsの読み込みが終わるまで、イベントが発火しない様にする

css

```css

.pointer-none {
  //イベントを発火できないようにする
  pointer-events: none;
}
```

html

```html
//あらかじめフォーム内は何も押せないようにしておく
<form class="pointer-none" >...</form>
```

js

```js

<script type="application/javascript">
window.onload = function() {
    //formの部分はdom要素、id、クラスなどのセレクタを指定
    $('form').on('keydown', function(ev) {
    //13がenterのkey-code
        if ((ev.witch && ev.witch === 13) || (ev.keyCode && ev.keyCode === 13)) {
            ev.preventDefault();
        };
    });
    //pointer-events: none;が設定してあるクラスを外す
    //jsが読み込まれてから操作できるようにするため、最後に記述
    $('form').removeClass('pointer-none');
}
</script>
```

以上
【初心者向け・基本】HTMLの階層とタグについて

勉強のため自分用のメモとして残しておきます。
基本的なことですが、最初は忘れやすいので、
私と同じようにHTMLを勉強している人は、ぜひ参考資料として使ってください。



#HTMLの階層について

`<!--　ここに文字を入力してね　-->`でブラウザに表示させずコメントを追加できる。
以下`<!--　-->`でそれぞれのタグの意味を記載しています。

```

<!-- !DOCTYPE htmlでhtmlで書きますよってことを宣言している -->
<!DOCTYPE html>
<html>
    <!-- Webのデザインや装飾をする時はheadの中に書く -->
    <head> </head>
    <!-- 本文を書く時は、bodyの階層の中に書く -->
    <body> </body>
    
</html>

```

#タグの種類

ざっとタグの使い方をメモしておくよ。

```
<title></title>
```

下の画像の赤枠で、印をしたところのタイトルを変更できるタグ。
headタグの間に書く。

<img width="609" alt="スクリーンショット 2019-10-23 18.05.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516799/a6d6b111-2701-9d92-f39d-353db44f2fde.png">


```
<h1></h1>
```
見出し。h1~h6まである。
見出し2を使いたい時は、h1をh2に変更しよう。
hの後の数字を変えるだけで、好きな大きさの見出しを使えるよ。

例）
<img width="497" alt="スクリーンショット 2019-10-23 12.49.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516799/5df65791-0980-72b9-af58-21de6cb24bd7.png">

```
文字を<strong>太く</strong>する
```
文字を太くする時は、strongタグ。

例）
<img width="233" alt="スクリーンショット 2019-10-23 12.59.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516799/9bec65c2-6080-b384-c10d-b7424ae65d4a.png">


```
<ins></ins>
```
下線を引きたい時に使う。Inserted。

例）
<img width="141" alt="スクリーンショット 2019-10-23 17.52.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516799/9c05c86c-976e-1abf-78ca-9085730b719a.png">


```
<em></em>
```
イタリック。emphasize、強調するという意味。

例）
<img width="176" alt="スクリーンショット 2019-10-23 17.54.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516799/a272fb9e-786f-1121-b037-6a6dd5d147d0.png">


```
<sup></sup>
```
上付き文字。superscripted

例）
<img width="114" alt="スクリーンショット 2019-10-23 17.55.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516799/88efba1f-3d3c-00f7-9c5a-8854b8ce7044.png">


```
<sub></sub>
```
下付き文字。subscripted

例）
<img width="150" alt="スクリーンショット 2019-10-23 17.55.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516799/6c1e4d50-e63a-9382-8516-91ef96f181cd.png">


```
<mark></mark>
```
マーカーを引きたい時。

例）
<img width="143" alt="スクリーンショット 2019-10-23 17.56.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516799/d030d788-6935-29c9-829a-3dd9683768c1.png">

```
<hr>
```
まっすぐな線を引ける

例）
<img width="498" alt="スクリーンショット 2019-10-23 17.58.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516799/2254c95c-b3bf-6a93-948e-e436a6711d1d.png">

```
<p></p>
```
段落を作れる


```
<br>
```

文の途中で段落を作りたい時に使用できる。
役割としてはpタグと同様。

```
<del></del>
```

文字に線を引く。
例）
<img width="155" alt="スクリーンショット 2019-10-23 17.56.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516799/8be98bba-3d7d-7a1a-7e1c-a1bb99718ec7.png">

```
<div></div>
```
要素を作る時に

```
<a href>
```

リンクを作る
ポートの操作

#Linuxでプロセスが何のポートを使っているかを確認して、キルするまでの流れ


現在使用しているプロセスの内容確認

```
$ ps r
//PIDがボートID
PID   TT  STAT      TIME COMMAND
26821 s007  Ss     0:00.08 /bin/bash -l
26559 s006  S+     0:14.53 node /Users/.../node_modules/.bin/xxxxx
26526 s006  S+     0:00.41 npm   
26247 s006  Ss     0:00.02 /bin/bash -l
26189 s005  S+     0:15.90 node /Users/.../node_modules/.bin/xxxxx
26526 s006  S+     0:00.41 npm   
26156 s005  S+     0:00.39 npm
```


ポート番号から使用しているプログラムを表示する


```
//これで使っているプログラムのPIDがわかる
$ lsof -i:9000
COMMAND   PID   USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node    25687   xxxx   00x  IPv4 xxxxxxxxx      0x0  TCP localhost:xxxxxx (LISTEN)
```

PIDを使ってプログラムを調べる


```
$ ps -afx | grep 25687
  502 25687 25654   0  1:59PM txyx001    0:17.05 node /Users/.../node_modules/.bin/xxxxx
  502 30827 26821   0  4:48PM txyx000    0:00.00 grep 25687
```

プロセスをキルする

```
$ kill 25687
xx-x-xxxxx:xxxxx_xxx xxxxx$ ps -afx | grep 25687
  502 30838 26821   0  4:48PM txyx000    0:00.00 grep 25687
```


以上
Neo4jをMacで使う時の基礎

### Installation
インストールはhomebrewで

```bash
$ brew install neo4j
```

### 利用ポート

|Port|説明|
|---|---|
|7687|Neo4j本体|
|7474|管理コンソール(Neo4j Browser)のホスティング用|


### 初期パスワード

|ID|Password
|---|---|
|neo4j|neo4j|


### Neo4jの起動と停止と状態確認

起動

```bash
$ neo4j start
```

停止

```bash
$ neo4j stop
```

状態確認

```bash
$ neo4j status
```



### 管理コンソールを開く

```bash
$ open http://localhost:7474
```
インストール後初めて起動するとパスワードの変更を要求される


###接続情報

プログラムから接続する場合の接続先。
http/https か、 boltと呼ばれるプロトコルで接続できる

```
# http base
http://localhost:7474/db/data

# bolt base
bolt://localhost:7687
```


###各種ディレクトリのPath

```
# Baseディレクトリ
/usr/local/Cellar/neo4j/3.5.8/libexec/import/

# configファイル
/usr/local/Cellar/neo4j/3.5.8/libexec/conf/neo4j.conf

# plugin
/usr/local/Cellar/neo4j/3.5.8/libexec/plugins/

# Data
/usr/local/var/neo4j/data/databases

# Log
/usr/local/var/log/neo4j/neo4j.log
```
ElixirのPlugで作ったWebサーバのログ出力をカスタマイズする

## まえがき

以前の記事「[ElixirとPlugで静的Webサーバを作ってみる](https://qiita.com/kanehara/items/a572c8b4140052b59650)」で、Plug.Loggerモジュールの標準の形式でアクセスログの出力を行った。しかし、このままでは、出力サンプル程度のログ情報しか出力されないので、出力内容をカスタマイズする。

## PlugパイプラインでのPlug.Loggerモジュール呼び出し

上記の記事のプログラムでは、Plugパイプラインの中でPlug.Loggerモジュールを呼び出している。ログ出力をカスタマイズするには、Plug.Loggerモジュールの代わりに、カスタマイズしたモジュールを呼び出す。

``` lib/simple_httpd/plug_top.ex
defmodule SimpleHttpd.PlugTop do
  ...
  def call(conn, [app: app]) do
    ...
    conn = Plug.Logger.call(conn, :debug)
    ...
```

## ログ出力モジュールのカスタマイズ

Plug.Loggerモジュールの挙動は単純で、Plugパイプラインから呼び出される call/2ファンクションで、Conn.register_before_send/2ファンクションを使って、リクエストに対する処理が終わったときに、Logger.log/2ファンクションを呼び出して、ログ出力を行う。

Plugモジュールに組み込まれている Plug.Loggerモジュールの大まかな構成を図示する。

``` logger.ex
defmodule Plug.Logger do
  ...
  def  call(conn, level) do
    Logger.log(level, ...)      # リクエストに対する処理開始時点のログ出力
    ...
    Conn.register_before_send(conn, fn conn ->
      Logger.log(level, ...)    # リクエストに対する処理終了時点のログ出力
      conn
    end)
  end
end
```

ログ出力をカスタマイズするには、Plug.Loggerモジュールをひな形にして、自身のログ出力モジュールを作成すれば良い。以下に、サンプルを掲げる。

``` lib/simple_httpd/logger.ex
defmodule SimpleHttpd.Logger do
    require Logger

    def init(plug_opts) do
        plug_opts
    end

    def call(conn, level) do
        start = System.monotonic_time()
        Plug.Conn.register_before_send(conn, fn conn ->
            Logger.log(level, fn ->
                stop = System.monotonic_time()
                diff = System.convert_time_unit(stop - start, :native, :microsecond)
                # ログ出力データ。不正な文字のエスケープ等、適切なフォーマッティングを行うこと。
                [to_string(conn.scheme), ?,,
                 conn.method, ?,,
                 conn.request_path, ?,,
                 conn.query_string, ?,,
                 Integer.to_string(conn.status), ?,,
                 conn.host, ?,,
                 Integer.to_string(diff)]
            end)
            conn
        end)
    end
end
```

最後に、Plugパイプラインから、作成したモジュールを呼び出す。

```elixir
    conn = SimpleHttpd.Logger.call(conn, :debug)
```

あるいは、Plug Builderで呼び出す。

```elixir
    plug SimpleHttpd.Logger, log: :debug
```

Loggerによるログ出力は、実行のやり方に応じて、コンソールやファイルに出力される。
Nuxt.jsで異なるコンポーネントから共通で利用できる関数を定義する（inject編）

異なるコンポーネントから共通で利用できる関数を定義したかったので、試してみました。

[以前の記事](https://qiita.com/itouuuuuuuuu/items/67afb038e2af5956148e)ではmixinを使って実現しましたが、この方法では `asyncData` や `fetch` 内で共通の関数を利用できませんでした。
そのため、今回は[inject](https://ja.nuxtjs.org/docs/2.x/directory-structure/plugins/#root-%E3%81%A8%E3%82%B3%E3%83%B3%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%81%AE%E6%8C%BF%E5%85%A5)を使って実現しています。

この方法では、 `asyncData` や `fetch` 等のSSR時も関数を利用できるため、こちらの方が良いかもしれません。

# 共通の関数を定義する

`plugins/` 内に `utils.js` というファイルを作成し、ここに関数を定義していきます。
今回は例として `hoge()` と `fuga()` という、2つの関数を定義するものとします。

使用する際は `this.$huga()` のように記述します。

```plugins/utils.js
const hoge = () => {
  return "hoge";
}

const fuga = () => {
  return "fuga";
}
 
export default ({}, inject) => {
  inject('hoge', hoge);
  inject('fuga', fuga);
}
```

# nuxt.config.jsに設定を追加

`nuxt.config.js` に設定を追加します。

```nuxt.config.js
plugins: [
  '@/plugins/utils'
],
```

# コンポーネントからの利用

`<template>` 内での利用は、関数名の前に `$` を付けて呼び出します。

```pages/index.vue
<template>
  <button @click="$hoge()">hogeを実行</button>
</template>
```


`<script>` 内の `asyncData` や `fetch` 内で使用したい場合は、 `context` から呼び出します。
こちらも関数名の前に `$` が付きます。

```pages/index.vue
<script>
export default {
  asyncData(context){
    context.app.$hoge();  // ここで呼び出し
  }
}
</script>
```

SSR時以外は、 `this.$hoge()` のように呼び出します。

```pages/index.vue
<script>
export default {
  methods: {
    hoge() {
      return this.$hoge();  // ここで呼び出し
    }
  }
}
</script>
```

便利！

TypeScriptでも同じように利用したい場合は、こちらを参考にしてください。
参考: [Nuxt.js + TypeScript で injectを利用した関数の呼び出しを定義する](https://qiita.com/itouuuuuuuuu/items/14e35ad08880b39267ab)
グラフ理論の用語

この記事にグラフ理論( graph theory )に関する用語をまとめる

### グラフの種類
|用語|説明|
|---|---|
|Graph|物の関係をNodeとEdgeに分けて整理するデータ構造|
|Directed Graph|Node間のEdgeに指向性を持つグラフ|
|Undirected Graph|Node間のEdgeに指向性がなく、２つのNodeの関係が双方向であるグラフ|
|Weighted Graph|Node間のEdgeに重みがあるグラフ|
|Unweighted Graph|Node間のEdgeに重みがなく、どのEdgeも同等の強度であるグラフ|

### Resources in Graph
|用語|説明|
|---|---|
|Node|Ontologyで言うところの entity|
|Edge|Ontologyで言うところの relation|
|Properties|Node, Edgeに付随する情報|
|Label|Ontologyで言うところの Role|

### Properties on Node
|用語|説明|
|---|---|
|title|Nodeの名前|
|caption|Nodeの説明|

### Properties on Edge
|用語|説明|
|---|---|
|Directionality|繋がりの方向|
|Weight|繋がりの重み|

### Data Collection
|用語|説明|
|---|---|
|Node List|全Nodeの一覧|
|Edge List|全Edgeの一覧|
|Adjacency Matrix|全Node x 全Nodeの二次元表。各項目には、Edgeの状態が数値表現される（ex: -1:繋がりがない、1~N:Weight）|
|Neighbors|あるNodeに隣接するNodeの一覧|
【windows CMD】windowsのfindコマンドでコマンドの結果を絞り込む（Linuxのgrepコマンドlike）

メモとして残します。


#■やり方

```shell
コマンド |find "キーワード"

#on linux↓
# コマンド |grep キーワード
```
ほとんど変わらないですね。
但し、powershellでは使えないみたいです。。。