OmniAICreator/Qiita-1.07M huggingface dataset:
ファイルの文字コードを指定して読み込む方法

この記事ではR version 3.6.1、tidyverseパッケージを使っています。

##コード

```{r}
read.csv(
  "data.csv",
  fileEncording = "utf-8" ##文字コードの指定（"Shift_JIS"など）
  )
```

## 補足
Rstudioではデフォルトの文字コードを指定できます。
上のメニューの中の"File"内でファイルを文字コードを指定して読み込んだり、保存したりできます。
[PHP] mysqliでデータをSELECTした際に数値型がすべて文字列になってしまう件

# やりたかったこと
phpから、mysqliでもってSQL実行し取得したときに、データベースでINT型またはFLOAT型になっているのにすべてSTRING型になってしまうので、数値のものは数値として取得したい。なぜかと言うと、最終的にjavascriptに持ってきてid順とかで並べ替えたりするときに、1と2と10が文字列だと1→10→2と並んでしまったりする。いちいちparseIntしなければならない。

# 最終的なコード(PHP)

```php

// SQL実行
$result = $this->mysqli->query($sql); //何かしらSELECTしてくる

// 連想配列に格納
$data = array(); //格納先
while ($row = $result->fetch_assoc()) { //一行ずつ配列で取得して$dataに入れていく。これはよくある手法

    // --- ここから数値変換処理 ---
    foreach ( $row as $key => &$value ) {
        if(is_numeric($value)) $value *= 1; //すべての要素に対して、数値であれば1を掛けることで自動で型変換してもらう（PHPの仕様）
    }
    unset($value); //誤作動防止
    // --- ここまで ---

    $data[] = $row;
}

```
Scalaの環境構築

お仕事で少しScalaを触ることがあって、その環境構築についてまとめておきたいと思います。

基本的にMacに向けて解説していきますが、適宜環境に合わせて実行できるようにリンクを示していきますので、自身の環境に合わせて進めていってください。

本記事ではパッケージマネージャなどに頼らずに環境構築を行なっていきます。

# Scalaとは

Scalaはコンパイル方式の言語で、Scalaのコードを書いてコンパイルすることでJava VMの上で実行可能なclassファイルを出力します。
Scalaのためのビルドツールとしてsbtというものがあります。
sbtを使うことで、プロジェクトによって任意のバージョンのScalaを使い分けることも可能になるので、sbtを使ってScalaの環境構築を行います。


# Scalaの環境構築

まずは、Scalaを実行できる環境の構築を行います。

Scalaはsbtというビルドツールを使って実行やビルドなどを行うことができます。
sbtを使ってプロジェクトごとに指定のバージョンのScalaをインストールしたりすることが可能なので、まずはsbtをインストールしましょう。


[sbt のインストール](https://www.scala-sbt.org/1.x/docs/ja/Setup.html)を参考に進めていきます。

手順としては

1. JDK(Javaの開発環境)をインストールする
1. sbtをインストールする

の二つだけです。
順番に進めていきましょう。

## JDKのインストール

まずは、JDKをインストールしていきましょう。

お好みのJDKをインストールしてください。
代表的なものはOracleのJDKとOpenJDKと呼ばれるオープンソースのJDKです。

Javaはオープンソースのプログラミング言語で、Oracle社が商品としてビルドして配布・サポートしているJDKとOSSのコミュニティなどがビルドして配布している様々な種類のJDKがあります。

今回は、sbtの公式で推奨されているOpenJDKのパッケージでのインストール方法で進めていきましょう。
[こちら](https://adoptopenjdk.net/)のリンクから`OpenJDK 11 (LTS)`と`HotSpot`を選択してダウンロードしましょう。



ダウンロードできたらダウンロードしたパッケージを実行してインストールしましょう。
インストールできたら、javaが実行できるか確認してみましょう。

```
java -version
```

インストールしたバージョンが表示されていれば大丈夫です。
今回の場合、以下のように表示されていると思います。

```
openjdk [version]
OpenJDK Runtime Environment AdoptOpenJDK (build 1[version])
OpenJDK 64-Bit Server VM AdoptOpenJDK (build [version], mixed mode, sharing)
```

上のように表示されない場合は、既に他のJavaがインストールされている場合です。

`JAVA_HOME`というシェル変数を書き換えることで、実行するJavaを切り替えることができます。
シェルの設定ファイル`.bash_profile`や`.zshrc`に以下のように追記し、`JAVA_HOME`を設定して、確認してみてください。

```sh:
export JAVA_HOME="/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home"
```

追記できたら、シェルを再起動して、結果を確認します。

```sh
exec $SHELL -l

java --version
```

`JAVA_HOME`を書き換えることで、今まで使えていたJavaを利用しているアプリケーションが使えなくなる可能性もありますので、注意してください。
そのような場合は、適宜切り替えるようにするかしたで解説するコマンド実行時のみ設定する方法で対応してください。


## sbtのインストール

次にsbtをインストールしていきましょう。

[こちら](https://www.scala-sbt.org/1.x/docs/ja/Installing-sbt-on-Mac.html)の

> ユニバーサルパッケージからのインストール

からZIPを入手してください。
ダウンロードできたらZIPファイルを展開して配置していきましょう。

```sh
unzip sbt-1.3.4.zip -d ~/[好きな場所]
```

最後に、sbtコマンドが実行できるようにpathを通します。
`.bash_profile`や`.zshrc`に追記してください。

```sh
export PATH="$HOME/[好きな場所]/sbt/bin:$PATH"
```

これで、sbtがインストールできたはずです。

シェルを再起動して確認してみましょう。

sbtは実行時に`target`というディレクトリを生成してプロジェクトの成果物やキャッシュを保存するので、実行後に削除できるようにして試してみましょう。

この時に、JDKは先ほどインストールしたOpenJDKのものを使いたいので、`JAVA_HOME`が正しく設定されているかも確認しておきましょう。

```sh
exec $SHELL -l

echo $JAVA_HOME
mkdir test && cd test
sbt --version
cd ../ && rm -rf test
```

また、コマンドの実行時のみ`JAVA_HOME`を指定したい場合は、以下のようにコマンドを実行することで`JAVA_HOME`を指定できます。

```sh
JAVA_HOME="/Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home" sbt
```

もしくは、新しいバージョンのsbtの場合以下のように指定することも可能です。

```sh
sbt -java-home /Library/Java/JavaVirtualMachines/adoptopenjdk-11.jdk/Contents/Home
```

sbtで仕様しているJavaのバージョンを知るには、sbtのシェルモードの中でconsoleコマンドを実行します。
すると、scalaのインタプリタが実行され、仕様しているJavaのバージョンなどが表示されます。

sbtシェルモードの中で以下のコマンドを実行することで、`JAVA_HOME`の場所を確認することもできます。

```
eval System.getProperty("java.home")
```


# まとめ

最後まで読んでいただきありがとうございます。
以上で環境構築は完了です。
Scalaの実行環境はこれで整ったので、これでいろいろ試すことができます。
続けて、sbtでのプロジェクトの作り方について書いていきたいと思いますので、よければそちらも読んでみてください。


# 参考

- https://www.scala-sbt.org/1.x/docs/ja/Installing-sbt-on-Mac.html
Djangoの組み込みタグforloop.counterに悩まされた話

# Djangoの組み込みタグとは
正式名はDjangoの組み込みテンプレートタグです．
簡単に説明すると，
HTML内でfor文やif文を使ったり，(get_context_data等で格納した)django側の変数をHTMLに入れるときに使います．
for文と言っても

```python
for i in range(1, 100):
  中身
```
みたいなことはできません．(自作とかしない限りは)
組み込みタグは自作することもできます．
詳しい説明は[Djangoドキュメントの組み込みタグ](#https://docs.djangoproject.com/ja/3.0/ref/templates/builtins/)に任せます．
というか，今回悩まされたやつもこのページを見れば一発で解決します(笑)

# 環境
python 3.8.2
Django 3.0.6

# 問題
for文を駆使して，５回ごとに<div></div>タグで区切りたい
問題のコード

```Django
{% for obj in object_list %}
  {% if forloop.counter0|divisibleby:"5" or forloop.first %}
  <div class="row">
  {% endif %}
    {{ obj }}
  {% if forloop.counter1|divisibleby:"5" or forloop.last %}
  </div>
  {% endif %}
{% endfor %}
```
これだと５回ごとに`</div>`がされませんでした．
Djangoに精通している方ならもうお気づきだと思いますが，forloop.counter1なんてものはないんですね

# 解決
forloop.counter0でfor文の回数を0をスタートにカウントし，**forloop.counter**だと1からカウントします．
**1**がいらなかっただけでした．

```Django
{% for obj in object_list %}
  {% if forloop.counter0|divisibleby:"5" or forloop.first %}
  <div class="row">
  {% endif %}
    {{ obj }}
  {% if forloop.counter|divisibleby:"5" or forloop.last %}
  </div>
  {% endif %}
{% endfor %}
```
普段，CやJavaを使っているとデフォルト？が1からスタートなのは違和感があって思い込みで書いていました.
ちなみに，or以降がないと下記のエラーがでます．
`int() argument must be a string, a bytes-like object or a number, not 'NoneType'`
~~これにかなりの時間悩まされたのはお恥ずかしい限りです~~
[AWS]苦労したエラー：Mysql2::Error: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'


#状況

AWS(EC2)で、railsサーバーを立ち上げるため
DBを新規作成したい。

しかし、実行すると下記のエラーが、、、

```:サーバー
[ec2-user@ip-●●● <リポジトリ名>]$ rails db:create RAILS_ENV=production
Mysql2::Error::ConnectionError: Access denied for user ''@'localhost' to database '<リポジトリ名>_production': CREATE DATABASE `<リポジトリ名>_production` DEFAULT CHARACTER SET `utf8`
Couldn't create '<リポジトリ名>_production' database. Please check your configuration.
rails aborted!
ActiveRecord::StatementInvalid: Mysql2::Error::ConnectionError: Access denied for user ''@'localhost' to database '<リポジトリ名>_production': CREATE DATABASE `<リポジトリ名>_production` DEFAULT CHARACTER SET `utf8`
/var/www/<リポジトリ名>/bin/rails:9:in `<top (required)>'
/var/www/<リポジトリ名>/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'

Caused by:
Mysql2::Error::ConnectionError: Access denied for user ''@'localhost' to database '<リポジトリ名>_production'
/var/www/<リポジトリ名>/bin/rails:9:in `<top (required)>'
/var/www/<リポジトリ名>/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:create
(See full trace by running task with --trace)
```

#解決策

結論は一番下に記載。
まずは試したことから。

解決先として一番解説されているのが、
mySQLの確認。

コマンドで立ち上げる。

```:サーバー
sudo service mysqld start
```

これでもダメで、変に作成されていないか
下記記事でリセットを試したが、これでも解決せず。

https://qiita.com/potterqaz/items/ea6db5c5be2be389c0bb

散々エラー文と、なぜ起こっているかを確認して
やはり
「設定がおかしいから」というのは間違いないようなので
再度、database.yamlのファイルを見直して間違いを発見！！

#結論

```:database.yaml
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock

```

この3行を編集したが、
編集をした項目を間違えていた。
default: &defaultをいじってしまっていたため
production:の方をしっかりと修正。

gitで編集前の記述も拾ってこれたので
再度修正し、無事にDB作成ができました！

以前はエラーにならなかったので
今回は新しい学びが多かったです。
閲覧しているページをツイートするブックマークレット

Bookmarklet を 2 つ紹介（動画再生速度の変更、ツイート） - Qiita https://qiita.com/irisTa56/items/c47cb1bc1ea74126dc0e#bookmarklet-%E3%81%A7%E3%82%A6%E3%82%A7%E3%83%96%E3%83%9A%E3%83%BC%E3%82%B8%E3%82%92%E5%8F%82%E7%85%A7%E3%81%97%E3%81%9F-tweet-%E3%81%99%E3%82%8B

の閲覧しているページをツイートするブックマークレットが
2020/05/30時点ではwindows10のchromeから稼働しないので試してみたら

```
/intent/tweet?text=
```
のパスがtwitter側で無効になったっぽい。
ios用のブックマークレットとして紹介されていた

```
/compose/tweet?text={text}&url={url}
```
だとpcでも稼働することを確認したので以下になります。

```
javascript:window.open("https://twitter.com/compose/tweet?text="+encodeURIComponent(document.title)+"&url= "+encodeURIComponent(location.href))
```
JSTLの導入

# JSTLの導入

➀「jstl-api-1.2」と「jstl-impl-1.2」を入手する(2020年5月30日現在)
➁WEB-INF/libフォルダに配置する。
➂jspでtaglib宣言する。<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

参考文献:https://sukkiri.jp/technologies/libraries/jstl/jstl_install.html
VSCodeのModalEditで簡易的なVimエミュレーション

#ModalEditとは
VSCodeにVimエミュレーションプラグインを入れようと思って探したけど、一番定番であると思われる[vscodevim](https://marketplace.visualstudio.com/items?itemName=vscodevim.vim)はイマイチ評判が良くない様子、重いという評もある
まあどうせ完璧な再現なんて無理だし、微妙に違うとイライラするので、もっと軽くて簡易的なやつがいいなぁ
いろいろ見てみると[ModalEdit](https://marketplace.visualstudio.com/items?itemName=johtela.vscode-modaledit)というのが私に合ってそう
コンセプトとしては

**ノーマルモードとインサートモードといくつかの内部コマンドだけ作ったから、あとは各自勝手にキーバインドしてくれ**

ってことらしい
自分に合わない部分は全部カスタムしてしまえばいいわけだし、軽そう
インサートモードになってる限りは普通にVSCodeをノーマルで使うのと一緒であるというのも調子良さそう

#プリセットがない！
さて[マーケットプレイス](https://marketplace.visualstudio.com/items?itemName=johtela.vscode-modaledit)からポチポチっとインストールして動かしてみる
jkjkっと……

```
ModalEdit: Undefined key binding: j
ModalEdit: Undefined key binding: k
ModalEdit: Undefined key binding: j
ModalEdit: Undefined key binding: k
```

工ｴｴｪｪ(´д｀)ｪｪｴｴ工
デフォルトでは何もbindingされてないの！？
たしかにコンセプトはそうかもしれないけど、さすがにプリセットあるでしょ！？
[チュートリアル](https://johtela.github.io/vscode-modaledit/docs/tutorial.html)を見てゼロから自分で作り上げろってこと！？

[issue](https://github.com/johtela/vscode-modaledit/issues/7)でも、プリセットあったほうがいいんじゃない？と突っ込まれているが、どうもポリシーをもってプリセットは無いみたい
ん？でも本人の設定が[ここ](https://gist.github.com/johtela/b63232747fdd465748fedb9ca6422c84 )にあるって？
おお、それでいい、それでいい
VSCodeの左下の設定アイコンからsettingsを開いて右上のアイコンをクリックすると`settings.json`が開かれるので適宜JSONが崩れないようにコピペすれば完了
jkjkっと……
工ｴｴｪｪ(´д｀)ｪｪｴｴ工
移動がjkhlじゃない笑

探したらVimの標準的なプリセットは[こっち](https://github.com/johtela/vscode-modaledit/blob/master/presets/vim.jsonc)に作ってくれてました
先月作ってくれたみたいですね、できたてほやほや
というわけで`settings.json`に貼り付けて、ようやく動きました
その中のコメントにもある通り`CTRL+なんとか`系のコマンドはsettings.jsonには書けないらしいのでkeybindings.jsonに書くみたい
こちらはわざわざJSONで書くよりもGUIを使ったほうが楽かも
左下の設定アイコンからKeyboard Shortcutを開いて検索窓に`modaledit`と入れれば独自の内部コマンドが全部出てきます
私の場合は`modaledit.enterNormal`を`CTRL+j`に直してとりあえず完了

#使い勝手
こういうコンセプトなのでVimを完全に再現しているということは全然なくって、そもそも置換などを含むコマンド類は一切なし
コピペもpとPの区別がなかったり、文字のコピーと行のコピーの区別がなかったりとか、Vimのエミュレーションとしてはまだまだオススメ出来ない感じです
だけど、たぶん頑張って`settings.json`をいじれば（あるいは誰かがいじってくれれば）いい感じになるのではないでしょうか
【Django】manage.pyで動くプロセス内からさらに自作したコマンドを叩く

記録用に。

# やりたかったこと
commandsディレクトリに自作のコマンドを作成し、テスト内から下記コマンドと同様のことを行おうとしました。

```
$ python manage.py create_initial_data
```
テストのセットアップ時にシェルでコマンドを流すのかと思いましたが、Djangoはここはしっかりサポートされていました

# やり方
対象のスクリプトに、 `call_command` 関数を埋め込みます。  

```
from django.test import TestCase, Client
from django.core.management import call_command


class TestSendEmailView(TestCase):
    def setUp(self):
        self.client = Client()
        call_command('create_initial_data') # ここ

    def test_success(self):
        response = self.client.get('/emails/')
        self.assertEqual(response.status_code, 200)
```

これで `python manage.py create_initial_data` と同じことが行われます。
[Javascript] Textareaの高さを自動調整しようとしてだいぶハマった件についてのメモ

# やりたかったこと
動的生成したTextarea群（Twitterのようなもの）について、textareaの内容のscrollHeightによって、生成時点で高さを自動調整したかった。

# 作りたい関数の流れ
- 対象のテキストエリアを取得する
- すべての要素に対してループ
 - テキストエリア1つ1つに対して最低行数を設定したい
 - scrollHeightを取得して、テキストエリアから溢れていれば大きくし、逆に余っていれば小さくしてscrollHeightに合わせたい


# 問題点と解決法
## 動的生成の件
1. 生成した時点で一旦調整したかったが、`$(document).on()`ではそもそもイベントが発生しないので無理。
 - 生成後に関数を実行することに。

## scrollHeight
1. `display:none;`だとscrollHeightを取得できない。
    - 取得してから`display:none;`する。
1. javascriptネイティブなら、`textareaオブジェクト.scrollHeight`でOK
1. `$(セレクタ).scrollHeight`はなぜか動かない。
 - `$(セレクタ).get(0).scrollHeight`とする。（オブジェクトが単体でもこうしないと動かない）
1. テキストエリア生成時、内容が1行分に収まる場合でも、なぜか2行になってしまう。
 - テキストエリアにはデフォルトでrows=2, cols=20が設定されているようだ。
 - そもそもscrollHeightというのはlineHeightにrowsを掛けたものである。
 - すると、scrollHeightを取得しても、lineHeight*1とならず、lineHeight*2となってしまう。
 - 1行まで小さくしたいテキストエリアには、rows=1を設定しておく必要がある。
1. 5行の内容を削って3行にした場合などに、小さくなってくれない。
 - scrollHeightは内容の高さを見るのではなく、表示領域全体の高さを参照しているようだ。
 - おそらく、5行分に大きくした時にrowsが5に更新されているためである。内容を削ってもrowsは小さくならないのでscrollHeightも減らない。
 - 一旦テキストエリアを小さくしてわざと溢れさせてから（rowsを変更してもいいかも？）、scrollHeightを取得する。

## lineHeight
1. javascriptネイティブだと、Textareaオブジェクト、もしくはElementオブジェクトにはlineHeightがない。
1. CSSで指定している場合、`オブジェクト.style.lineHeight`では取得できない。
1. DOMに`style="line-height:**px"`が直接書かれていれば取れる。



# 最終的なコード

jQueryの場合

```javascript
const adjust_textarea = (tab) => {
    //jquery
    const $target = $("#"+tab+"_data_area textarea");
    $target.each((i,elem) => {
        //最低高さ設定
        let minheight;
        const lineheight = parseInt($(elem).css("line-height").split("px")[0]);
        if($(elem).hasClass("ta_rows1")) minheight = lineheight;
            else if($(elem).hasClass("ta_rows2")) minheight = lineheight * 2;
            else minheight = lineheight * 3;
        //高さ変更
        $(elem).height(minheight); //scrollHeightはheightに満たない場合はheightが返るので一旦最小にしてあふれさせる
        const scrollheight = $(elem).get(0).scrollHeight; //lineheight * 行数が入る
        if(scrollheight > minheight) $(elem).height(scrollheight);
    });
};
```

Javascriptネイティブの場合（却下）

```javascript
    const taList = document.querySelectorAll("#"+tab+"_data_area textarea");
    const length = taList.length;
    if(0) for(let i=0; i<length; i++) {
        const scrollheight = taList[i].scrollHeight; //javascriptのscrollHeightは、rowsにline-heightを掛けたもの
        if(scrollheight > minheight) {
            if(scrollheight > taList[i].clientHeight) {
                taList[i].style.height = (scrollheight+2) + "px"; //style.heightはborder含む
            } else {
                taList[i].style.height = (minheight+2) + "px";
                if(scrollheight > taList[i].clientHeight) {
                    taList[i].style.height = (scrollheight+2) + "px";
                }
            }
        } else {
            taList[i].style.height = (minheight+2) + "px";
        }
    }

```
[AWS]git pull origin master

勘違いしていたため、メモ書き。

gitと連動させたので、自動で連携しているのかと思ったら
しっかりとサーバー側でもマスターを読み込む必要があるそうでした＞＜

[ec2-user@ip-●●● <リポジトリ名>] git pull origin master
Google Drive Api Tips(Python)

## サービスアカウントの場合の初期化
https://cloud.google.com/iam/docs/creating-managing-service-account-keys?hl=ja
こちらを参考にjsonファイルをを取得しておきます

```python
from google.oauth2 import service_account
from googleapiclient.discovery import build

SCOPES = ['https://www.googleapis.com/auth/drive']

credentials = service_account.Credentials.from_service_account_file(JSON_FILE_PATH, scopes=SCOPE)
self.service = build('drive', 'v3', credentials=credentials)
```

## 指定したディレクトリにファイルをアップロードしたい
ファイルIDは配列で渡しましょう（忘れがち）

```python
from apiclient.http import MediaFileUpload

# ディレクトリのファイルIDはパスの一番後ろ
# https://drive.google.com/drive/folders/FILE_ID
file_metadata = {'name': 'photo.jpg', 'parents': [FILE_ID]}
media = MediaFileUpload('files/photo.jpg', mimetype='image/jpeg')
file = self.service.files().create(body=file_metadata,
                                   media_body=media,
                                   fields='id').execute()
```

## アップロードする際のmimetypeって何を指定したらいい？
このあたりを参考
https://developers.google.com/drive/api/v3/mime-types
https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types

## ファイルのいろんな情報が見たい
`*`で全情報が返ります
必要な項目をカンマ区切りで渡しましょう

```python
self.service.files().get(fileId=FILE_ID, fields="*").execute()
```

## ファイルアップロードしたのにアクセスできない
多分権限がありません、つけてあげましょう
あらかじめ権限のあるディレクトリを作っておいて、そこにアップロードすればいちいち権限をつける必要はありません

```python

user_permission = {
        'type': 'user',
        'role': 'writer',
        'domain': 'hoge@gmail.com'
    }

self.service.permissions().create(
                    fileId=FILE_ID,
                    body=user_permission,
                    fields='id',
                )
```

## ダウンロードしたファイルを指定したパスに保存する
`getbuffer`で書き込みましょう

```python

import io
from apiclient.http import MediaIoBaseDownload

request = self.service.files().get_media(fileId=FILE_ID)
fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
    status, done = downloader.next_chunk()
    print("Download %d%%." % int(status.progress() * 100))

with open(SAVE_FILE_PATH, "wb") as f:
    f.write(fh.getbuffer())
```
Ruby と Python で解く AtCoder ABC138 D 隣接リスト

# はじめに
*[AtCoder Problems](https://kenkoooo.com/atcoder/#/)* の Recommendation を利用して、過去の問題を解いています。
AtCoder さん、AtCoder Problems さん、ありがとうございます。

# 今回のお題
*[AtCoder Beginner Contest D - Ki](https://atcoder.jp/contests/abc138/tasks/abc138_d)*
<font color="green">Difficulty: 923</font>

今回のテーマ、隣接リスト

以前解きました *[Ruby と Python と networkx で解く AtCoder ABC168 D 隣接リスト](https://qiita.com/superrino130/items/b274988b19ea1b281fa4)* の応用版といった問題です。

今回は、木の根から頂点へカウンターの値が送られますますので、カウンター用の配列を準備し、根から頂点へ探索を行うことによりカウンターの値の受け渡しを行います。
# Ruby
```ruby.rb
n, q = gets.split.map(&:to_i)
a = Array.new(n){[]}
n.pred.times do
    x, y = gets.split.map(&:to_i)
    a[x - 1] << y - 1
    a[y - 1] << x - 1
end
p = Array.new(n){0}
q.times do |i|
  x, y = gets.split.map(&:to_i)
  p[x - 1] += y
end
c = Array.new(n){0}
c[0] = 1
que = []
que << 0
while que.size > 0
  e = que.shift
  a[e].each do |i|
    next if c[i] > 0
    c[i] = 1
    p[i] += p[e]
    que << i
  end
end
puts p
```
```index.rb
    p[i] += p[e]
```
ここでカウンターの値の受け渡しを行っています。
# Python
```python.py
from sys import stdin

def main():
    from collections import deque
    input = stdin.readline
    n, q = map(int, input().split())
    a = [[] for _ in range(n)]
    for i in range(n - 1):
        x, y = map(int, input().split())
        a[x - 1].append(y - 1)
        a[y - 1].append(x - 1)
    p = [0] * n
    for i in range(q):
        x, y = map(int, input().split())
        p[x - 1] += y
    c = [0] * n
    c[0] = 1
    que = deque([])
    que.append(0)
    while len(que) > 0:
        e = que.popleft()
        for i in a[e]:
            if c[i] > 0:
                continue
            c[i] = 1
            p[i] += p[e]
            que.append(i)
    for i in range(n):
        print(p[i])
main()
```
```stdin.py
from sys import stdin
    input = stdin.readline
```
`stdin`を使用すると実行時間がかなり速くなります。

||Ruby|Python|Python (stdin)|PyPy|PyPy (stdin)|
|:--:|:--:|:--:|:--:|:--:|:--:|
|コード長 (Byte)|442|681|736|681|736|
|実行時間 (ms)|802|1734|1044|1959|864|
|メモリ (KB)|25468|53008|53040|105164|91852|
# まとめ
+ ABC 138 D を解いた
+ Ruby に詳しくなった
+ Python に詳しくなった
古いMacMiniでOpenCV環境整えメモ


●記載はじめ
2020/5/30

●MacOSバージョン
10.9.5 Mavericks

●Xcodeバージョン
6.1

developer.apple.com/download/more
から

●HomeBrewのインストール
https://brew.sh/index_ja

●Python　３．６
https://www.python.org/downloads/mac-osx/
Python 3.6.6 - June 27, 2018
Download macOS 64-bit installer

●opencv のインストールでエラー
brew install opencv

> Error: An unsatisfied requirement failed this build.

> Warning: You are using macOS 10.9.
> We (and Apple) do not provide support for this old version.

OSが古すぎるというWarningも出る。ですよね。

もう一つのワーニングをつぶす
brew cask install homebrew/cask-versions/adoptopenjdk8

こちらが、はいったら「brew install opencv」が通るようになった


pip install opencv-python
は通らなかったが

pip3 install opencv-python
は通った

export PYTHONPATH="/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/:$PYTHONPATH"

●import cv2　でエラー
python
import cv2
でエラーがでることから、 opnecv がインストールできてないことが判明

●brew install glib　でエラー
brew install opencv
の途中の、glibのインストールで、失敗している

Error: Failed to download resource "glib"
Download failed: https://download.gnome.org/sources/glib/2.44/glib-2.44.1.tar.xz

このサイトに入れない

/usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula
glib.rb

  url "https://download.gnome.org/sources/glib/2.64/glib-2.64.3.tar.xz"
を
  url "http://ftp.gnome.org/pub/gnome/sources/glib/2.64/glib-2.64.3.tar.xz"
に、テキストエディタ修正したら、

通った

＝＝＝　イマココ
マークアップ共通化：アクション毎にurlパスの変更

# 概要
前回の記事で、マークアップの共通化を掲載しました
コチラ↓↓
https://qiita.com/kazuko___3o3___/items/019174474f4f258ba19b

実は、この記事がメインでございましたっ:triumph:

newアクション、editアクション毎に指定したいURLが異なり、最初はif文でコードを書くもエラー続きでした:cold_sweat:
その解消法を備忘録として残します！

# 事象
以前、【form_forが自動的に生成してくれるパスは複数形のみ】という記事を書かせていただきました（https://qiita.com/kazuko___3o3___/items/cf8e6966772d629d5927 ）

そのため、HTMLは下記のように記載されています。

```html:_form.html.haml
#省略
.new_display
  = form_for @task, url: group_tasks_path do |f|
＃省略
```

【group_tasks_path】はnewアクションの時のみに有効で、editアクションではエラーになってしまいます:scream:

# 解決方法
共通ビューに記載されている**form_for**の箇所を別ファイルに記載します:writing_hand:

**before**

```html:new.html.haml/edit.html.haml
= render "form"
```

**after**

```html:new.html.haml
= form_for @task, url: group_tasks_path do |f| 
  = render partial: "form", locals: {f: f} |= render "new_main"
```

```html:edit.html.haml
= form_for @task, url: group_task_path do |f| 
  = render partial: "form", locals: {f: f} |= render "new_main"
```

上記内容に変更することで、newアクション時には新規登録画面、editアクション時には編集画面（入力されている内容も反映）されるようになり、create、updateもバッチリでした:laughing:

# 参考
https://qiita.com/seiya1121/items/fba02afcd8d54f1628ba
dmesgで出力されるシステムログにログをリダイレクトする

dmesgの出力ログに何らかのログを追加する場合、/dev/kmsgにリダイレクトするとよい

```"TESTLOG"をdmsegに追加する例
$ echo "TESTLOG" > /dev/kmsg
$ dmesg | tail -1
[7216583.480456] TESTLOG
```

リダイレクト時に権限エラーが出力された場合は、tee -a を用いるとよい

```
$ echo "TESTLOG" > /dev/kmsg
/dev/kmsg: 許可がありません
$ echo "TESTLOG" | sudo tee -a /dev/kmsg > /dev/null
$ dmesg | tail -1
[7216705.651341] TESTLOG
```

# 参考
[システムログ1](https://wiki.bit-hive.com/north/pg/%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%AD%E3%82%B01)
[sudoでリダイレクトするとエラーが出た時の解決法](https://linuxfan.info/post-1818)
WordPressホストのphpを5から7にアップグレードする

# 概要

Debian GNU/Linux 9.12 (stretch) のホストで、php 5とapache 2の組み合わせでWordPressを動かしていたのだが、WordPress 5.4.1にはサイトのヘルスチェックを行う機能が追加されており、このヘルスチェックが「php 5は古すぎる」と警告を出してくる。
ごもっともなので、phpを7.xにアップデートする。
ついでにOS/ディストリビューションもDebian GNU/Linux 10.4 (buster)にアップデートする。

## ポイント
そこそこ以前から運用してきたWordPressサイトの場合、charsetがlatin1に設定されたままのMySQLデータベーステーブルにutf8文字列が無理やり格納されているため、これを素直にアップデートしていくと、データベースの内容、つまりWordPressのコンテンツが無残に文字化けしてしまう。これを回避する必要がある。

## データベースをダンプする
```
mysqldump -u root --default-character-set=latin1 データベース名 -h localhost -p > dumpdata
```
WordPressで用いているデータベース名は、Debian GNU/Linuxの場合、`/etc/wordpress/config-WordPressホスト名.php`を見ればわかる。WordPressで用いているデータベースへの接続ユーザ名とパスワードもここを見ればわかる。
ただ、そのユーザ名義でmysqldumpしようとしても、データベース全体をロックできないと拒まれるので、`-u root`を付けてスーパーユーザ名義で実行している。あるいはapacheをいったん止めてからmysqldumpすればいいだろう。

mysqldumpする際`--default-character-set=latin1`をつけるのがポイント。charset=latin1なテーブルに(無神経に)utf8文字列が格納されてしまっている場合、それらを文字化けさせず、素直に、(ある意味無神経に)ダンプするには、こうする。ここで下手にutf8を指定してしまうと、歪んでいる現状を下手に正そうとする処理の結果、ダンプ結果が却って(人間にとっては)文字化けしてしまう。ダンプ結果を`lv -Ou8 dumpdata`などして確認すると、utf8文字列がそのまま無事ダンプされていることがわかるだろう。

## データベースのダンプをutf8にする
ファイルに含まれる文字列自体はすでにutf8なので、あとはtableのcharset指定などをutf8にしてやればよい。
いちおう念のため`grep latin1 dumpdata | lv`などして、文字列「latin1」の出現状況を確認のうえ、

```
sed 's/latin1/utf8/g' dumpdata > dumpdata.utf8
```

で置換してやればよい。
ブログ文中などコンテンツ自体にも`latin1`という文字列が含まれる場合は、よきに取り計らってください。
ここでは`utf8mb4`を指定しないほうがよい。ブログポスト本文(wp_posts)などは正常に見えたりするものの、例えばサードパーティーのthemeなど周辺に誤動作・文字化けが発生したりする。

## Debian GNU/Linux 10.4にupgradeする

```
vi /etc/apt/sources.list (stretchをbusterに置換)
apt update
apt dist-upgrade
```

ついでに

```
apt autoremove
deborphan | xargs dpkg -P
```

などして不要なパッケージを掃除しておくのもよいだろう。

## phpを7にする
php5系のパッケージをphp7.3系にアップグレードする。

ついでに、phpを稼働させるフレームワークもphp-fpmにした。[mpm_worker + php-fpm にする](https://www.downtown.jp/~soukaku/archives/2017/1019_233751.html)を参考にさせていただいた。

```
dpkg -P libapache2-mod-php5 php5-cli php5-common php5-curl php5-gd php5-json php5-mysql php5-readline
apt install libapache2-mod-php7.3 php7.3-cli php7.3-common php7.3-curl php7.3-gd php7.3-json php7.3-mysql php7.3-readline
a2dismod mpm_prefork
apt install php-fpm
a2enmod proxy_fcgi setenvif
a2enconf php7.3-fpm
a2enmod mpm_worker
a2enmod php7.3
```

このあたり(このあたりに限らないが)your mileage may varies.

## データベースを復旧する

この状態では、MySQLのlatin1テーブルに納められたutf8文字列が、php 5の時代は何も考えず無神経にutf8のまま扱われていたものが、きちんと? 文字化けするようになってしまっている。
なので、上の手順できちんとutf8にしておいたdumpdata.utf8を食べさせる。

```
mysql -u root データベース名 -h localhost -p < dumpdata.utf8
```

おしまい。
docker-compose up -d時にThe container name "/XXX" is already in use by container. 

docker-compose up -d時にThe container name "/XXX" is already in use by container. 

```
$ docker-compose up -d
Creating XXX ... error
ERROR: for XXX  Cannot create container for service XXX: Conflict. The container name "/XXX" is already in use by container. You have to remove (or rename) that container to be able to reuse that name.
```

以前に起動したコンテナと名前が重なっているので、以下の通りdocker rmで不要なコンテナを削除して再実行して解決

```
$ docker rm $(docker ps -aq)
```
mount.nfs: rpc.statd is not running but is required for remote locking

ubuntu16.04LTS にてmount.nfsで以下のエラーが出る際の解決策について備忘録です

```
mount.nfs: rpc.statd is not running but is required for remote locking.
mount.nfs: Either use '-o nolock' to keep locks local, or start statd.
mount.nfs: an incorrect mount option was specified
```

rpc.statdが起動していないようなメッセージが出る。

> [statd - システム管理コマンドの説明 - Linux コマンド集 一覧表](https://kazmax.zpp.jp/cmd/s/statd.8.html)
> rpc.statd は NFS ファイルロックサービスrpc.lockd が利用するもので、 NFS サーバマシンがクラッシュして復帰したときに、 ロックを回復するために用いられる。

rpc.statdを起動して解決

```
$ sudo service rpcbind start
```

# 参考
[mount.nfs: rpc.statd is not running but is required for remote locking.のエラーの対処法](https://www.geek.sc/archives/1135)
[Fixing rpc.statd is not running but is required for remote locking](https://backdrift.org/fixing-rpc-statd-running-required-remote-locking)
[CentOS6でのNFSマウントでエラー](https://teratail.com/questions/118578)
[statd - システム管理コマンドの説明 - Linux コマンド集 一覧表](https://kazmax.zpp.jp/cmd/s/statd.8.html)
マークアップの共通化【new,edit】

# 概要
新規登録画面(newアクション)や編集画面(editアクション)は登録項目は同じなので画面共通にしちゃた方が楽:relaxed:ということで備忘録のため残します。

# 変更点
①viewフォルダ内に _form.html.hamlファイルを作成し、表示内容を記載する
②viewフォルダ内にある edit.html.hamlと new.html.hamlに下記のコードを記載する

```html:new.html.haml/edit.html.haml
= render "form"
```

# 感想
あら！簡単:smile:
何ということでしょう！いとも簡単に画面の表示ができました！

しかし、、、
私が実装しているアプリには問題が発生。。。
form_forにurlを指定していたためエラーが発生してしまいました。。。。
こちらの解決法は下記URLをご覧くださいませ:rolling_eyes:

URL
https://qiita.com/kazuko___3o3___/items/37579db477c5f398c472
【laravel】シーダーにtimestamp()を付する

# 概要
テーブルにコードを作成する際に`create_at`や`update_at`を付する方法です。
簡単なのでメモ程度にサクッと書きます。
シーダーの詳細は以下をご参考ください。
[【laravel】シーディングによるレコードの追加](https://qiita.com/gone0021/items/fe2e9deffddf8b4b0114)

# new DateTime()
フィールドの値へ`DateTime()`をインスタンスします。
`time()`メソッドも試しましたが、`timestamp()`はdatetime型で作成されるため、値は入力されるものの型が合わず思うように使えませんでした。

```php:.php
$param = [
  'area' => '沖縄',
  'created_at' => new DateTime(),
  'updated_at' => new DateTime(),
];
```
Laravelでメールを送るときに$messageという変数を使ったら「htmlspecialchars() expects parameter 1 to be string, object given」というエラーが出る

もはやタイトルの通りなのですが、何度も引っかかるので備忘録としてメモっておきます。

# 環境

- Laravel6系※5系を利用していたときも同じエラーを踏んだ記憶があります

# 挙動1：Mailableを継承したクラスでprivateなメンバ変数$messageを持っていると表題のエラーが出る

```php
    private $message;

    public function __construct(UserDto $userDTO, string $message)
    {
        $this->userDTO = $userDTO;
        $this->message = $message;
    }

    ...中略...

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->subject('タイトル')
            ->to($this->userDTO)
            ->view('emails.sample.notified')
            ->with(['user_name' => $this->userDTO->name, 'message' => $this->message]);
    }
```

まあ、上記のようなメール送信を行うクラスがあったとしましょう。これを利用してメール送信を実行すると

```
local.ERROR: htmlspecialchars() expects parameter 1 to be string, object given (View: /app/packages/resources/views/emails/sample/notified.blade.php) {"userId":XXXX,"exception":"[object] (ErrorException(code: 0): htmlspecialchars() expects parameter 1 to be string, object given (View: /app/packages/resources/views/emails/sample/notified.blade.php) at /app/packages/vendor/laravel/framework/src/Illuminate/Support/helpers.php:251)
[stacktrace]
```

というエラーが出ます。

# 挙動2:$messageをpublicに変えると、何もエラーが出ないがメールも送られなくなる

こちらももっと謎なのですが、

```
    public $message
```

のように修飾子を変更すると、エラーも出なくなりますがメールも送られなくなります。いよいよ謎です。

# 対策

withの変数名を変えると動きます。例えばbodyなどに変更します。クラスのmessageプロパティの命名や修飾子は変えなくていいです。

```php
            ->with(['user_name' => $this->userDTO->name, 'body' => $this->message]);
```

# 原因はわからない

## 追記
コメントの方でこれが原因では、という推測をいただきましたので、原因が気になる方はコメントをご参照ください。
※コメントに至った会話の流れが見えなくなるので、下記記述は一旦消さないでおきます。

---

~~軽く追ってみたのですがさっぱりわかりません。ただ、Mailableクラスのここはちょっと怪しいなと感じました。~~

```php:Mailable.phpL297
        foreach ((new ReflectionClass($this))->getProperties(ReflectionProperty::IS_PUBLIC) as $property) {
            if ($property->getDeclaringClass()->getName() !== self::class) {
                $data[$property->getName()] = $property->getValue($this);
            }
        }
```

~~`ReflectionClass`を使って自クラスのpublicなプロパティを一覧で取得しており、それを`$data`に入れているので、ここで'message'という名前がカニバってしまっており、もともと期待されていた挙動をしなくなったのではないかと類推しました（そこから、挙動2のように修飾子を変える実験に至った）。が、もうちょっと追わないとわからないです。~~

~~あと、2020年5月現在のLaravel最新ソースが、僕の手元のソースから若干変更が入っており、現在は治っている可能性は一応あります。~~

~~https://github.com/laravel/framework/blob/7.x/src/Illuminate/Mail/Mailable.php~~

# 所感

~~この挙動に基づいたIssueとか見当たらなかったのですが、自社のなんらかの他のソースが影響しているのかなぁ・・・Mailableはそのまま使っているのでありえないとは思うのですが。~~
駆け出しエンジニアに与えられがちなタスク

##メーカーの社内SEになって、早一年

　こんにちは、ひかるです。私はとあるメーカーに、社内SEとして新卒入社しました。大学時代はプログラミングなんてやったことがなく、入社後の研修で知識を詰め込んだのですが、まあ現場ではなかなか通用しないこと……
　今回は私がそのとき、現場で先輩からもらったタスクの一部を紹介します。こういった「初心者がもらえる仕事」というのは、どこの職場でも似たようなものだと思ったので、何かしら参考になればと思います。なお、私の職場は、言語はJava、テンプレートエンジンにStruts、ビルドツールにAnt、バージョン管理はCVSと、レガシーな環境ですので、その点を踏まえていただけると幸いです……


##①画面に入力項目を増やして、DBに登録してくれ


先輩「ユーザーから、製品の在庫区分を追加できるようにしてくれって要望が来たから、実装してね」
一年目私「はい（白目）」

　ありがちなタスクですね。画面に入力項目を増やして、それをDBに登録するという実装です。このタスクでは以下の知識が求められます。

+ **htmlとテンプレートエンジンの連携における仕組み**
+ **DBに値を永続化するO/Rマッパーの使い方**

 初心者にはテンプレートエンジンとかO/Rマッパーなんて言葉は聞きなれないですよね。平たく言うと、**テンプレートエンジンは、画面に入力した値を次の画面に持っていくための仕組み**で、**O/Rマッパーはデータベースと入力した値を結びつける仕組み**です。

　この二つがないと、せっかくユーザーがせっせと入力した内容も、次の画面に移ったら綺麗さっぱり消えてしまうし、登録ボタンを押してもその内容がデータベースに反映されなくなってしまう。

　つまり典型的なCRUD処理の基本を押さえ、理解しておけばいいのです。そのためには、簡単なアプリケーションを自作してみることをお勧めします。今はQiitaやUdemyでいくらでもやり方を学ぶことができますし、ひとまずはコードを写経してみて、動く喜びを味わってみてはいかがでしょうか。学習のコツは**プログラムが動いてから、理解する**です。これが逆だとアウトプットが遅くなって実戦的な力が身に付きません。モチベーションの維持も大変です。

　駆け出しエンジニアの方は、そういった「画面上の値を保持する仕組み」に焦点を当てて学ぶと良いと思います。大丈夫、私も最初はさっぱりわかりませんでしたが、今はなんとか仕組みを覚えてやっていますから。



##②ユーザーが間違えて入力しないよう、バリデーションを設けてくれ


先輩「誤った値をユーザーが入力してしまうケースが多発している。そんなことがないように、次画面に遷移する前にチェック機能を設けてくれ」
一年目私「はい（白目）」

　このチェック機能はとても大切です。ユーザーは人間ですから、画面上の入力を常に正しく行うとは限りません。例えば製品名を**「HOGEHOGE2012」**と入力すべきところを**「OGEHOGE2012」**と先頭のHを抜かして入力してしまうかもしれません。

　では、どうやったらそれを防げるでしょうか？

　私は「HOGEHOGE2012」と**入力すべき**ところを、と言いました。つまり入力には正解があったはずです。ということは、その正解をあらかじめシステム上で登録しておき、時と場合によって、その正解と入力を照合すれば良いのです。

　バリデーションを設けることはシステム開発において基本中のことですが、大事なのは**いかに正解の基準をアプリケーションに定義しておくか**です。先ほどの製品名で言えば、マスタ（≒ひな形）にあらかじめ正解の製品名**「HOGEHOGE2012」**を登録しておき、入力するときにその正解と内容を照らし合わせる。で、少しでも間違っていたら**「OGEHOGE2012」なんてねえよ！**とエラーを表示させる。そこでユーザーは間違いに気が付くわけです。

　具体的には、製品名でデータベースを検索し、ヒットしなかったらエラー。ヒットしても、その画面で入力すべきデータでなかったら、やはりエラーを出す。例えばこの工程では**「HOGEHOGE2012」**が正解であって、**「FUGAFUGA2019」**は間違いですよ、と。その判断をするためには工程と製品をあらかじめ結びつけておく必要があります。

　ただ、そこまでやるくらいだったら、データベースから必要な値（製品名）を引っ張ってきて、プルダウン形式で選ばせる方が間違いはありません。今回はあくまでバリデーションという点に注目して説明しましたので、その方法は無視しています……

　初心者の方は、If文の使い方や、型の特性等を理解することも大事ですが、**どこから正解を引っ張ってくるか**というこにも注目してみてくださいね。

##終わりに

　初心者はわからないことだらけでしんどいと思います。私は今でもそうです（笑）　ただね、少しずつわかってくると、視野が広がっていって、「ああ、こういうことだったんだ」と納得できます。そのときまでどうかあきらめないでくださいね！
写真を正しい向きで表示する（EXIF情報を元に画像自体を回転する）

iPhoneなどで撮影した写真を開くと、思った通りの向きで表示されないことがある。
私が直面したのは、iPhoneの写真アプリだと正しい向きで表示されるが、PS4のメディアプレイヤーだと変な向きで表示されてしまう、というもの。

PS4でも正しい向きで表示されるようにする、というお話。

### 2020.05.31 追記

zshスクリプトで実装してみた。
→https://github.com/hosota9/ImageRotation

# どうして変な向きで表示されるのか？

iPhoneで撮影した写真はJPEG形式（もしくはそれに近い形式）で保存される。

JPEG形式の画像ファイルには、画像以外にも撮影日や撮影場所など様々な情報が記録されており、その中には撮影時のカメラの向き（回転情報）も含まれている。
この回転情報のおかげで、iPhoneを90°回転して撮影したとしても、表示するときにカメラの向きが考慮され、正しい向きで表示することができる。

ただし、世の中にはこの回転情報を無視して画像を表示するソフトがある。
PS4で変な向きで表示されたのは、これが原因と思われる。

# どうすれば良いか？

画像自体を回転して保存し、回転情報を削除すれば、どんなソフトでも正しい向きで表示されるはず。

# やってみた

### 回転情報の確認

まずは`exiftool`というツールで回転情報（EXIF情報）を確認する。
Homebrewが入っていれば簡単にインストールできる。

```
$ brew install exiftool
```

回転情報は **Orientation** という項目に格納されている。

```
$ exiftool <JPEG画像ファイル名> | grep Orientation | awk -F": " '{print $2}'
Rotate 90 CW
```

"Rotate 90 CW" すなわち「時計回りに90°回転（して表示する）」の意。

### 画像自体の回転

画像自体の回転は、MacOSに標準で入っている`sips`コマンドが利用できる。
時計回り90°回転する場合は、以下を実行する。

```
$ sips -r 90 <JPEG画像ファイル名>
```

### 回転情報の削除

ここまでの操作で、回転情報を無視するソフトで正しい向きで表示されるようになる。
ただし、回転情報を考慮するソフトでは変な向きになるため、回転情報を削除する。

回転情報を削除するには、`exiftool`で **Orientation** を "1"　すなわち「回転しない」に変更する。

```
$ exiftool -Orientation=1 -n <JPEG画像ファイル名>
```

以上です。
Arduinoのタイマー調査

#概要
今('20/5現在)、発売されている各種Arduinoに使われているマイコンに搭載されている**タイマー**のまとめ

#Arduinoとマイコン
- Arduino UNO/Micro: ATmega328
- Arduino Leonardo/micro: ATmega32u4
- Arduino Mega 2560: ATmega2560
- Arduino nano Every: ATMega4809
- Arduino ZERO/MKR ZERO: ATSAMD21G

#各マイコンのタイマー数
##Arduino UNO/Micro: ATmega328
- 8Bit TImer: 2
- 16bit Timer: 1

の計**3つ**

##Arduino Leonardo/micro: ATmega32u4
- 8Bit Timer: 1
- 16Bit Timer: 2
- 10Bit Timer: 1

の計**4つ**

##Arduino Mega 2560: ATmega2560
- 8Bit TImer: 2
- 16bit Timer: 4

の計**6つ**

##Arduino nano Every: ATMega4809
- 16bit TimerA: 1
- 16bit TImerB: 4

の計**5つ**

##Arduino ZERO/MKR ZERO: ATSAMD21G
- 16bit TImer1: 5
- 24/16bit Timer2: 4

の計**9つ**

#まとめ
後発のArduinoの方がタイマー数は多い。

ただ、元も子も無い話だが、ArduinoというPlatform、余りマイコンのレジスタを直接書き換えるようなプログラムを書くことには向いていないので、これらのタイマーを使いこなすのは、少々、大変。まあ、それが市場で受け入れられた理由でもあるので、それが悪いというのは筋違い。タイマーを多用するプログラムは、Arduinoでなく、STのNucleoを使う方が良さそう。
Explorerの右クリックからRemote WSLを開く

# 目的
Windows の Explorer から，右クリックでそのフォルダを VSCode Remote Development WSL で開けるようにします．


# 環境
- Windows 10 ver 2004 (2020年5月リリース)
- VSCode ver 1.45.1
- WSLでのVSCodeがセットアップ済み(Remote Development WSL)

要するに WSL 上で `code .` でそのフォルダを VSCode で開けるように Shell コマンドがインストールされている必要があります．

# 手順

レジストリに以下のキーを設定します

``` Open_VSCode_WSL.reg
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\VSCodeWSL]
@="Open with VSCode WSL"

[HKEY_CLASSES_ROOT\Directory\Background\shell\VSCodeWSL\command]
@="C:\\Windows\\System32\\wsl.exe code ."
```

# 解説

実は Windows 側のコマンドプロンプトで `wsl code .` の実行で VSCode Remote Development WSL が開けるので，コレで充分ってことですね．シンプル．
coc.nvim が IME の邪魔をして日本語入力出来ない

# 現象

coc.nvim を使っていると IME と競合して日本語の入力が困難になることがあります。

-   [neoclide/coc.nvim: Intellisense engine for Vim8 &amp; Neovim, full language server protocol support as VSCode](https://github.com/neoclide/coc.nvim)

`日本語` と入力したいけれど子音の入力で補完が発動し...


![`n` を入力すると補完候補が表示され...](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127827/1f817682-b759-4b74-5308-c238aaffafc8.png) ![`i` を入力すると `n` が確定して `い` が入力されていまう](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127827/aa0f49bc-2d04-7b0a-fd87-07a049f55d8a.png)

# 対処

子音の入力中に補完が発動しないように `suggest.minTriggerInputLength` を初期値の `1` から `3` に変更します。

# 手順

`:CocConfig` を実行して `coc-settings.json` を開き、以下の設定を追加します。

```json
{
  "suggest.minTriggerInputLength": 3
}
```
![`にほんご` と入力出来るようになった](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127827/870cc408-76e2-6d9c-75c8-b3e9c24ab0b6.png)


# 参考

```viml
:help coc-config-suggest
```
【cron】全ユーザのcronジョブを出力

# cronの設定ファイル
サーバーが重いので、cronで実行されているジョブの一覧を
取得したく調べたところ、、、

ジョブを登録時に**/var/spool/corn/[ユーザ名]**に
ファイルが生成されるようです。

ファイルが分かればあとは「cat」コマンドで出力するだけです。
# 全ユーザのジョブ一覧を出力
`$ cat /var/spool/cron/*`
# 特定ユーザのジョブ一覧を出力
`$ cat /var/spool/cron/[ユーザ名]`
LaravelでホストOSのフォルダーがvagrantから見られない時

この前久々にLaravel触って、なんだかうまく動かないからぐぐってみたら、自分がQiitaに投稿した記事が最初に出てきた。
知ってたんじゃん、俺。
成長していないな、俺。
そんな未来の俺のために、今日も嵌ったことを書いておく。

#vagrantからLaravelのプロジェクトが参照できない！？
Laravelのプロジェクト作って、vagrantでhomesteadの環境作って、なんだかい感じにできていたはずなのに、vagrantにsshでターミナルつないでlsとかしてみると、何故か作ったはずのLaravelプロジェクトが参照できない。
ホストOS上は確かに存在しているのに、つながっていない。
なんだ、VirtualBoxの設定か？と思って設定を見てみても、特に怪しいところはない。何しろその辺いじってないし。

そんな時はお客さん、どうやってvagrant立ち上げたか、じっくり思い出してみな。
VirtualBoxから直接仮想サーバー立ち上げたりしてない？

vagrant upのコマンドの中でいろいろ設定しているので、VirtualBoxから直接仮想サーバー立ち上げると、ホストOSとvagrantのフォルダがつながらないんだよ。

homesteadをインストールしたフォルダーから、vagrant upしたらつながると思うよ、きっと。

Virtual Boxを直接いじることが多いとついVirtualBoxから立ち上げてしまうが、基本に忠実に行動しましょう、というお話でした。
AugurOne（VAE1枚学習）の内容理解

※テキストをそのまま貼り付けており、失礼します。

##対象論文

AugurOne
Training End-to-end Single Image Generators without GANs

##概要

画像1枚をVAEで学習。
多重解像度。Data Augmentationに、thin-plate-spline（メッシュ変形）を利用。
GAN一択ではなく、目的・条件に応じて、VAEも検討。

##詳細

画像生成の代表は、GAN（Generative Adversarial Network）とVAE（Variational AutoEncoder）の2つ。
本論文は。VAE。
VAEは中間層で確率分布に変換するので、モデルを定義できている一方、表現力が劣り、高解像度情報を復元しにくい（ボケる）。
VAEなので、誤差は、KLダーイバージェンスとperceptual loss（画素単位loss）の2つ。
GANでないので、Adversarial lossはない。

段階的に解像度を上げることで、異なる解像度を学習。
このような方法は、RefineNet、PGGAN等でも行われている。

Data Augmentationは、一般的なData Augmentation手法＋thin-plate-spline（メッシュ変形。）。
メッシュ変形は位置合わせでも使われる方法。

結果画像は、SinGANがおかしな画像、VAEが妥当な画像を生成している。

ここで、
GANは、一般的には、大量の画像を学習することで、妥当でありながら、学習にはないような画像を生成することを特性としている。
VAEは、MNISTでも学習でき、中間変数を定義できることを特性としている。

GANの欠点に対し、画像1枚からどこまでできるかを研究したのがSinGAN。
SinGANの同じ条件をVAEに適用したのがAugurOne。
画像1枚の条件では、両方法の特性上、VAEの方が有用な結果を示すのは自然にも思われる。

上記を理解の上で、AI-SCHOLARさんの以下を文を読むと、こちらも自然のことに思われる。
「著者らはAugurOneはSinGANが苦手な大きなオブジェクトの画像の生成ができると主張しています。SinGANはテクスチャのような細かい模様の写真はうまく生成できますが、人の顔や動物などの大きなオブジェクトはうまく生成できません。逆にテクスチャの生成にはSinGANが若干の優位性を示しているそうです。」

まとめ、
GANとVAEは特性が異なるので、目的・条件に応じて使い分ける。
ここ数年、GANの進化が目覚ましかったですが、注意を促した、とも理解できます。

AI-SCHOLARさん、いつも先進的な文献を紹介いただき、ありがとう！

##参考

https://www.youtube.com/watch?v=Ow5Q_8nXjRM
https://ai-scholar.tech/articles/image-generation/gan-augurone-End-to-end-Single-Image-Generators-GANs
[Rails] herokuデプロイエラー　Precompiling assets failed.

# 備忘録です
Railsでアプリ作成し、herokuにデプロイしようとしたところgit push heroku masterでエラーが出たので、解決方法を残しておきます。

# デプロイまでの流れ

[【初心者向け】railsアプリをherokuを使って確実にデプロイする方法【決定版】](https://qiita.com/kazukimatsumoto/items/a0daa7281a3948701c39#heroku%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9Frails%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4)を参考にしました。

# エラー解決参考記事
[Uglifier::Error: Unexpected character '`'　Herokuデプロイ時のエラー解消方法](https://qiita.com/kazukimatsumoto/items/a0daa7281a3948701c39#heroku%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9Frails%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4)を参考にしました。


# 本題

herokuへデプロイするぞというところから書きます。
git push heroku masterを実行したところ、「Precompiling assets failed.」エラーが、、、


```
remote:  !
remote:  !     Precompiling assets failed.
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: !	Push rejected to golfmatch.
remote: 
To https://git.heroku.com/golfmatch.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/アプリ名'
```

**Precompiling assets failed.**

プリコンパイルってなんだ？
調べました。

プリコンパイルとは、
コンパイルするための事前処理（読んで字の如し）
コンパイラ(翻訳者)が理解できるソースにする処理だそう。


コンパイルとは、
コンパイルとは、エディタで書いたプログラミング言語（高水準言語）を機械語に変換する作業。
PC：機械語で命令
人間：機械語は書きにくいからプログラミング言語（高水準言語）で記述

ニュアンスが掴めればでいいでしょう。


調べていくうちに、**目立つところばかり見るな、ログを見よ**と言われた。
上に辿ってくと、

```
rake aborted!
remote:        Uglifier::Error: Unexpected character '`'

```

非同期通信の際に書いた、バックティック文字がUnexpectedですと。
ローカルではちゃんと動いていたので記述ミスではない。

とりあえずエラー文で検索。ドンピシャヒットしました。
config>environments>production.rbの下記を通り編集しました。

```ruby:production.rb
config.assets.js_compressor = :uglifier
#これをコメントアウトする

# config.assets.js_compressor = :uglifier
```

これで再度git push heroku masterを実行したらデプロイできました！

ログを辿る大切さが身に染みて分かりました。
ありがとうございました！！
.Net Coreネイティブのネットワークフレームワーク Sockety

# Sockety
.NET Coreで書いたネットワークフレームワークです。
[MagicoOnion](https://github.com/Cysharp/MagicOnion)にインスパイアを受け開発しました。

# 開発経緯
.Net Coreで利用しマルチプラットフォームで通信を行う必要があり、MagicOnionを用いて通信を行っていました。
MagicOnionは通信コアにgRPCを使っており、ネイティブコードを利用しています。マルチプラットフォームで通信を行う場合、残念ながらARM版Windowsでは利用できないこと画面しました。
※ARM版Windowsでの動作はあまり必要ないと思いますがHololens2で利用するためです。
そこで一念発起しネットワークフレームワークを作成した次第です。
ですので、目指したところは"通信をラッピングし相手のメソッドを簡単に呼ぶ"です。まだ速度までは至っていません。

# 概要
SocketyはTCPとUDPを利用することが出来ます。
[UDPはHolePunchingでNATを回避しています](https://qiita.com/k-yamamoto/items/1bc295f83c873921b408)

```
Client.Connect("localhost",11000,"MyApp",this);
```

これでクライアントは接続を開始しますが、この時にTCPとUDPを張ります。
ですので、高速通信を行いたい場合はUDPを利用することも、大事なデータはTCPで送ることも出来ます
クライアント(呼ぶ側)

``` 
client.Send("Join", DateTime.Now.ToString());
```
とやるとサーバのメソッド(この場合はJoin)を呼び、引数である現在時刻を渡すことが出来ます。

サーバ(呼ばれる側)

```
public void Join(ClientInfo sendclientInfo,string JoinDate)
```
サーバの受け側はこんな感じです。
ClientInfo→送信元のクライアント情報
JoinDate→client.Sendの第２引数

# パッケージ

```
dotnet add package Sockety
```
で取得してください
現状はバグがあることからGithubからソースをCloneしプロジェクトに追加することをお勧めします。

# 使い方
詳細な使い方は追って記述しますが、まずはExampleを参照してください。
・Sockety(本体）
・Example/SocketyServer(サンプルサーバ）
・Example/SocketyClient(サンプルクライアント）
・Example/SocketyClientUWP(サンプルクライアント版)

# 問題点
C#での利点である型チェックやメソッド名などを参照することが出来ず、相手のメソッドを呼ぶ時に文字列していとなっています。MagicOnionではこの点が解消されていて素晴らしいライブラリとなっています。
まだまだ至らない点はたくさんありますが、皆さんの熱いプルリクをお待ちしております。

[Github リポジトリ](https://github.com/kyamamoto03/Sockety)
機械学習に必要なpandas,numpy,matplotlibについての簡単な説明

機械学習について少し学びたいなと思い色々とサイト巡りをしていたらどうにもpandas,numpy,matplotlibというのが必要になるみたいで（※他にもまだまだたくさん必要なことはありますがその中から抜粋してますのでご了承ください笑）勉強&自分用がてらまとめられたらなと。
勉強したてほやほやなので間違いがあったりしたらご指摘いただけますと幸いです。

#pandasについて
pandasの読み方は（パンダス）と読みます。
pandasはpythonのライブラリで主に担当することは**csvの読み書き、編集、消去や1次元、２次元のデータを扱ってくれる**やつです。

##pandasの使い方
百聞は一見に如かずなので早速動かしてみましょう。

```
pip install pandas
```
これでインストールはok

```
import pandas as pd
s1 = pd.Series([1,2,3,5])
print(s1)
出力結果
0    1
1    2
2    3
3    5

p2 = pd.DataFrame({
    '名前' :['高橋', '田中', '佐藤'],
    '身長' : ['178', '171', '168'],
    '体重' : [67, 60, 59]
    })
print(p2)
出力結果
   名前   身長  体重
0  高橋  178  67
1  田中  171  60
2  佐藤  168  59
```
ざっくり説明しますと
まずinport pandas as pdは毎回毎回pandasって書くの大変だからpdにしよーぜみたいな感じ。
そして記述ですがまずp1の方のSerie（シリーズ）は
**1次元のデータ**を扱うときに使う記述です。
そして
DataFrame（データフレーム）は
**2次元のデータ**ということです。

#numpyについて
numpyの読み方は（ナンパイ）もしくは（ナムパイ）です。正直どっちでも大丈夫な気がします笑
numpyもpythonのライブラリで主に配列計算とかを簡単にやってくれます。

##numpyの使い方
さて早速使ってみましょう

```
pip install numpy
```

これでインストールはok

```
import numpy as np
n1 = np.asarray([1,2,3])
n2 = np.asarray([2,3,4])
print(n1 + n2)
出力結果
[3 5 7]

n3 = np.asarray([[1,2,3],[4,5,6]])
print(n3)
出力結果
[[1 2 3]
 [4 5 6]]

n4 = np.asarray([[1,2,3],[4,5,6]])
n5 = np.asarray([[7,8,9],[1,4,8]])
print(n4 + n5)
出力結果
[[ 8 10 12]
 [ 5  9 14]]
```
これも先ほどと同じでnumpyをnpにして使います。
そしてご覧の通りに配列同士の計算が簡単に行うことができました。
こりゃおったまげた

#matplotlib
最後はmatplotlibです。読み方は（マットプロットリブ）です。
こいつの主な仕事は**簡単にグラフ**を作ることです。

##matplotlibの使い方
さて早速書いていきましょう。

```
pip install matplotlib
```
いつものようにインストールをしてimportしていきます

```
import matplotlib.pyplot as plt
plt.plot([2,1,3])
plt.show;
出力結果
```
![img1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584106/cf1c0e97-7c18-8749-3b23-ca912e5d0bb4.png)


```
plt.plot([2,1,3],color="red")
plt.grid(True)
plt.show;
出力結果
```
![img2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/584106/87b0e90e-a4c5-b8bd-8963-439c30918dd1.png)
ざっくりこんな感じです。
上はただ表示させただけですが、下は線を青くしたのと背景にグリッドを入れました。
グラフになるだけでかなーり見やすくなりますよね。

#最後に
今日紹介したのはかなりざっくりした内容です。なのでpandasやnumpyやmatplotlibを使った楽しい事はまだまだまだあります笑
ってゆーか僕もかなり初心者なのでもっと勉強して記事に出来たらなと思います。
Androidの密度修飾子(ldpi, mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi)をコード上で判定する。

Androidの密度修飾子はDrawableリソースの場合、それぞれのフォルダを使うことで自動的に端末のDrawableリソースが使われます。
しかし、今の手持ちの密度修飾子は何なんだ？というときがあるので、コード上で判定してみたいと思います。

```kotlin:MainActivity.kt

   override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val densityDpi = resources.displayMetrics.densityDpi
        (findViewById<View>(R.id.textView2) as TextView).text = densityDpi.toString()
        if (0 < densityDpi && densityDpi <= DisplayMetrics.DENSITY_LOW) {
            textview.text = "ldpi"
        } else if (densityDpi <= DisplayMetrics.DENSITY_MEDIUM) {
            // mdpi
            textview.text = "mdpi"
        } else if (densityDpi <= DisplayMetrics.DENSITY_HIGH) {
            // hdpi
            textview.text = "hdpi"
        } else if (densityDpi <= DisplayMetrics.DENSITY_XHIGH) {
            // xdpi
            textview.text = "xdpi"
        } else if (densityDpi <= DisplayMetrics.DENSITY_XXHIGH) {
            // xxdpi
            textview.text = "xxdpi"
        } else if (densityDpi <= DisplayMetrics.DENSITY_XXXHIGH) {
            // xxxdpi
            textview.text = "xxxdpi"
        }
    }

```

ちょっとだけ解説
densityDpiがDPI(１インチあたりのピクセル数)として取得できます。
その取得できたDPIを以下の表に当てはめて、計算します。
![スクリーンショット 2020-05-30 15.38.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26257/54ddec9a-d46a-bb8f-0ea2-391c50ad7f32.png)
公式サイトから引用

### 参考
[各種のピクセル密度をサポートする](https://developer.android.com/training/multiscreen/screendensities?hl=ja#kotlin
)
Scanner 正常入力になるまで無限ループ

#Scanner 正常入力になるまで無限ループ

##[前回](https://qiita.com/hiroki2525/private/2d9bd9787ea1be6ca1ad) の振り返り

[前回](https://qiita.com/hiroki2525/private/2d9bd9787ea1be6ca1ad)はtry-catch構文を使って、例外クラスが使われた時の処理を実装するという内容をやりました。

今回は入力のパターンを全て考えてif文、try-catch構文、while文を使い入力が異なる場合ループさせる方法についてご説明します。

てことで例題いっちゃいましょ〜！

##例題

・入力が正の整数値の場合だけ数値を出力、他の場合は入力に戻る。

コンソール
<img width="476" alt="スクリーンショット 2020-05-30 17.43.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253875/be0ad50b-eda3-0d8c-1bc7-7b23c0b2e3bc.png">


まず、気をつけて欲しいのが０は正の整数ではないということです。（中学生内容）
ループごとの改行は見やすさのために行いました。
処理の通知の文を出力してコードの動きを追いやすくしてみました。

**特に```break;```と``` continue;```に注目してください。**
コメントアウトの詳しい説明は後ろの方に載っているので分からなくてもとりあえず読み進めてください(^^;;

コード
<img width="751" alt="スクリーンショット 2020-05-30 17.43.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253875/d16b3494-2433-4831-6c93-326cab762c15.png">

コンソール画面（もう一度）
<img width="476" alt="スクリーンショット 2020-05-30 17.43.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253875/be0ad50b-eda3-0d8c-1bc7-7b23c0b2e3bc.png">


###全体の構造

 * try-catch構文をwhile文でループさせています。特にエラーが起きる可能性のない処理をtryブロック内に入れているのは変数のスコープ(有効範囲）を広げないためです。合ってるかはわかりません。
 * 基本は無限ループ、```continue;```、```break```を使って流れを制御

 * 無限ループの書き方は```while(true)```や```for(;;)```などが簡単だと思います。

###プログラムの流れ（基本的には無限ループの中にあることを忘れずに）

1. まずint型変数num に標準入力を代入します。
2. ここで例外（文字や少数）が発生した場合はcatchブロックの処理を行いwhile文により次のループへ移行します。-> 1へ
3. 例外が発生しなかった（正or負の整数、０）場合、if文によってnumを場合分けします。
4. numが０または負の整数だった場合、メッセージを出力して```continue;```以下のwhileブロックの処理をスキップします。 -> 1へ
5. numが正の整数だった場合、ifブロック内の処理を行い、tryブロックの次の行に移行します。
6. 正常処理を終えた場合は無限ループから脱出しないといけないので```break;```を使って無限ループを抜けます。
7. Scannerクラスを閉じます。

これで入力に対して全ての場合わけをして、正常処理を行うまで再入力を求めるプログラムができました。


##無限ループについて

プログラム中に予期せぬ無限ループが発生したら```Ctrl + c```で止まるので焦らず対処しましょう。
Macユーザーは、環境設定 ＞ 一般 ＞ エディター ＞ キー の画面から終了のキーを設定しましょう。
以下、デフォルトの終了キー設定
<img width="915" alt="スクリーンショット 2020-05-30 14.52.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253875/c80d9e06-1a8d-c2e6-1374-86af1354cc7f.png">
JavaScriptの関数と宣言

# 概要
JavaScript Primerを読んでてワチャワチャしてきた部分を整理する。
基本的には書いてあることそのままです。
参考：https://jsprimer.net/basic/function-declaration/


# 関数宣言
functionから始まる文のこと。

```javascript
const huga = true;
function hoge(huga)
{
  return huga === true;
}

console.log(hoge(huga));  // => true
```
返り値を省略した場合、return文を省略した場合はundefinedを返す。

```javascript
function hoge()
{
  return;
}

function huga()
{
}

console.log(hoge());  // => undefined
console.log(huga());  // => undefined
```

## functionキーワードを使用した関数式
> 関数式とは、関数を値として変数へ代入している式のことを言います。

関数が値として扱えることを**ファーストクラスファンクション(第一級関数)**と呼ぶ。
関数式の定義方法は以下の通り。

```javaScript
const hoge = function()
{
  return 'hoge';
};
```
上記のように関数名を省略して書くことができる。
このような名前を持たない関数を**匿名関数（または無名関数）**と呼ぶ。

## Arrow Functionを使用した関数式

```javascript
const hoge = () =>
{
  return 'hoge';
}
```
カッコイイですね。
省略記法がいっぱいあるので使いこなしたいところです。
省略記法のルールは以下の通り。

 *  関数の仮引数が1つのときは()を省略できる。
 *  関数の処理が1つの式である場合に、ブロックとreturn 文を省略できる。
    * その式の評価結果を return の返り値とする。

```javascript
const hoge = () => {return 'hoge';}; // 仮引数がないとき
```
```javascript
const hoge = (huga) => {return 'huga';}; // 仮引数が1つのみのとき
```
```javascript
const hoge = huga => {return 'huga';}; // 仮引数が1つのみのときは()を省略可能
```
```javascript
const hoge = (huga, piyo) => {return huge + piyo;}; // 仮引数が複数のとき
```
以下の2つは同じ意味となる。

```javascript
const hoge = (huga) => {return huga * huga;};
```
```javascript
const hoge = huga => huga * huga; // 1行のみの場合はreturnとブロックを省略できる
```
【個人的メモ】AWS関連でよく使うコマンドまとめ

#強制的にgitで上書きしたいとき
```
$ git fetch origin master
$ git reset --hard origin/master
```

#インスタンスの再起動したら・・・
##MySQLの再起動
```
[username|app_name]$ sudo service mysqld start
```

##Nginxの起動
```
[username|app_name]$ sudo service nginx start
```

##Unicornの起動
```
[username|root]$ unicorn_rails -c /var/www/rails/app_name/config/unicorn.conf.rb -D -E production
```
【JavaScript】おみくじアプリを作ってみた

##学習ポイント
■ランダムメソッドの使い方

■配列から値を取り出す

■特定の値にアラートを出す

```
<body>

<h1>おみくじ</h1>
<button id = "start">おみくじスタート！</button>
<div id = "result">
  大吉
</div>

</body>
<script>
  //DOM操作でJSでHTMLの操作を可能にする
  const start = document.getElementById("start");
  const result = document.getElementById("result");

  const omikuji = ["大吉","中吉","吉","凶","大凶",]

  num = 0

  //スタート押したら開始されるメソッド
  start.addEventListener("click",function() {

      //ランダムに選ぶ
    const num = Math.floor(Math.random() * omikuji.length);

    //配列を表示する
    result.textContent = omikuji[num];

    //特定の値にアラートを出す
      if(result.textContent === "大吉"){
        alert("おめでとう！")
      }else if(result.textContent === "大凶"){
        alert("残念でした！")
      }
  })
</script>
```