OmniAICreator/Qiita-1.07M huggingface dataset:
複数ファイルの一行目の日付を抜き出すけど head を使わない方法

たぶん方法は色々あると思うんだけど、下記のようなログファイルがあったとする。具体的に言うと、Let's Encryptのログがこんな感じなんだけど、その各ファイルの一行目の日時が欲しい。コマンドの実行日時を知りたいのだ。実行環境は `macOS 10.14.5`。

```shell
$ ls
log1.log  log2.log  log3.log  log4.log  log5.log
$ head ./*
==> ./log1.log <==
2019/05/23 02:58:49,log1 desu
2019/05/23 02:58:50,log1 desu

==> ./log2.log <==
2019/07/06 02:58:53,log2 desu
2019/07/06 02:58:54,log2 desu

==> ./log3.log <==
2019/01/01 02:58:55,log3 desu
2019/01/01 02:58:56,log3 desu

==> ./log4.log <==
2019/09/23 02:58:57,log4 desu
2019/09/23 02:58:58,log4 desu

==> ./log5.log <==
2019/10/19 02:58:59,log5 desu
2019/10/19 02:59:00,log5 desu
```

一行目を取り出して、","までを出力すればいいから楽勝のはず。当然 `head` をまず使う。誰だってそうする。俺だってそうする。

```
$ head -n 1 ./* | cut -d , -f 1
==> ./log1.log <==
2019/05/23 02:58:49

==> ./log2.log <==
2019/07/06 02:58:53

==> ./log3.log <==
2019/01/01 02:58:55

==> ./log4.log <==
2019/09/23 02:58:57

==> ./log5.log <==
2019/10/19 02:58:59
```

楽勝だった。楽勝なんだけどちょっと思ってたのと違う。今回の場合はファイル名が不要だった。Macにデフォルトで入ってる `head` コマンドがファイル名を無視してくれない。マジかよ。オプションが下記しかない。何ならhelpもないって言っている。

```
$ head --help
head: illegal option -- -
usage: head [-n lines | -c bytes] [file ...]
```

[GNUのhead](https://www.gnu.org/software/coreutils/manual/html_node/head-invocation.html#head-invocation)であれば `-q` でファイル名除外できるので目的は達成できた。Macの標準だとないみたい。headコマンドを入れ替えるのが一番簡単だと思うけど、悔しいから他の方法考えた。

```
$ ls -1 | xargs -I {} sh -c 'sed -n 1P {}' | cut -d , -f 1
2019/05/23 02:58:49
2019/07/06 02:58:53
2019/01/01 02:58:55
2019/09/23 02:58:57
2019/10/19 02:58:59
```

こうしたかった。awkでもできるだろうし、もっとスマートな方法もあると思う。
[memo] Huskyのエラーでgit commit できない問題

## 背景

husky@^1.3.1　を使う時、git commitを実行すると以下のエラーが出てきました。

```bash
➜  test(master): git commit

husky > pre-commit (node v8.11.4)
/bin/sh: lint-staged: command not found
husky > pre-commit hook failed (add --no-verify to bypass)
```

## 解決

以下のコマンドで解決できました。

```
rm -rf .git/hooks/
npm i -D husky
```

lint-staged がインストールされてなかったため
資格取得のためのシンプルな時間の作り方

##結論
- 通勤時間のスマホゲームの時間を勉強に充てる
- 仕事の休憩中のスマホゲームの時間を勉強に充てる
- ひとりあそびの時間を勉強に充てる
- 仕事から帰宅したときに１時間だけ勉強に充てる

##具体的な１日
|名前|時間|
|:--|:--|
|通勤時間（往復）|２時間|
|仕事の休憩|１時間|
|ひとりあそび|１時間|
|帰宅すぐ|１時間|

１日５時間を勉強時間に充てられる。
１週間だと２５時間。
１ヶ月だと１００時間。

##補足
- 休日（週末２日間）は遊ぶ
- 週に１回以上は運動する
- 酒はほどほどに

##で、どうすればいいの？
いますぐ、勉強法を調べるのをやめる。
必要なことは参考書に全部書いてるよ。
SpringIntegrationで動的に接続先を作る

# 発端
- TCP/IPで複数のサーバへ同時に接続し受信する。
- 接続先は固定数では無く、運用中に不定期に追加される。

ってのが開発の前提条件
XMLファイルで設定する<int-ip:tcp-inbound-channel-adapter>等は静的な設定しか出来ないっぽくて接続先分予め用意する必要があるためやりたいことが出来ない。
従ってjavaでadapterの生成やchannelの設定を行うことにした。

# 事前準備
- bean生成用クラスに@Configuration()を設定
- メソッドに@Beanと@Scope("prototype")を設定する
- scopeをprotptypeにしないとsingletonとなるので注意

# サンプルコード
## TCP/IP受信アダプター
```java
@Bean
@Scope("prototype")
public TcpReceivingChannelAdapter gettcpadapter(AbstractConnectionFactory connectionfactory) {
	TcpReceivingChannelAdapter adapter = Tcp.inboundAdapter(connectionfactory)
			.clientMode(true).autoStartup(false).get();
	return adapter;
}
```

bean名を設定したい場合は、生成後に呼び出し元で付けないと反映されなかった。

## &lt;int&#58;bridge&gt;相当のオブジェクト生成
```java
@Bean
@Scope("prototype")
public EventDrivenConsumer getBridge(SubscribableChannel input, MessageChannel output) {
	// ハンドラも@bean生成した方が良いのか不明
	BridgeHandler handler = new BridgeHandler();
	handler.setOutputChannel(output);
	EventDrivenConsumer bridge = new EventDrivenConsumer(input, handler);
	return bridge;
}
```

受信データを最終的にXMLで定義したchannelに流したいので必要だった。

## &lt;int&#58;header-enricher&gt;相当のオブジェクト生成
```java
@Bean
@Scope("prototype")
public EventDrivenConsumer getHeaderEnricher(SubscribableChannel input, MessageChannel output, String setmessage) {
	Map<String, HeaderValueMessageProcessor<?>> headersToAdd = new HashMap<String, HeaderValueMessageProcessor<?>>();
	headersToAdd.put("HOGE", new StaticHeaderValueMessageProcessor<String>(setmessage + "_hogehoge"));

	HeaderEnricher transformer = new HeaderEnricher(headersToAdd );
	MessageTransformingHandler handler = new MessageTransformingHandler(transformer );
	handler.setOutputChannel(output);
	EventDrivenConsumer consumer = new EventDrivenConsumer(input, handler);
	return consumer;
}
```

ヘッダーに色々情報を付加したかったのでこれも必要だった。

# 終わりに
以上で必要なパーツは揃ったので今回はここまで
もう少し簡単な方法や他のパーツも必要な時は追記します。
Unityで"please enter the key in a valid format "と怒られたとき

![スクリーンショット (236).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106327/05f39510-5734-aa3b-0ba3-78a5bed4d227.png)

　にダッシュボードへ行くリンクがあるからクリックする

[追記]

https://developer.cloud.unity3d.com/projects/

最新のUnityリンクが消えてる……
AutoML Vision API を使って簡単な画像選別サイトを作りたい

AutoML Vision APIを使って画像選別をクライアント上で出来るサイトを作りたい。
完成するまでの過程をメモしていく

#準備
- GoogleCloudSDKのインストール
- サービスアカウント設定
- 環境変数の設定(必須だったかは後日確認)
    - GOOGLE_APPLICATION_CREDENTIALS = webコンソール上でサービスアカウントから”鍵を作成”で得られるjsonファイルのパス
    - PROJECT_ID = プロジェクトのID
- gcloud auth activate-service-account --key-file=＜キーファイルのパス＞　キーファイルの設定
- gcloud auth application-default print-access-token でトークンを取得

#成功したリクエスト
```php
<?php
//リクエスト用url
$url = "https://automl.googleapis.com/v1beta1/projects/###プロジェクトID###/locations/us-central1/models/
###利用するデータモデル###:predict";

//セキュリティトークン。gitとかに挙げる時は要注意。
$token = "###gcloud auth application-default print-access-token で取得したトークン###";

//画像をbase64文字列にエンコード
$img = base64_encode(file_get_contents('###画像パス###'));

//json作成
$data = array("payload"=>array("image"=>array("imageBytes"=>$img)));

$header = [//ヘッダ情報
    'Authorization: Bearer '.$token,//トークン
    'Content-Type: application/json',//テキストタイプ
];

$curl = curl_init();//cURL セッションを初期化する
//以下curl詳細設定
curl_setopt($curl, CURLOPT_URL, $url);//取得するURLの指定。curl_init() でセッションを初期化する際に指定することも可能。
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST'); //HTTPリクエストで"GET"あるいは"HEAD"以外に使用するカスタムメソッドの指定
curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($data)); //HTTP "POST" で送信するすべてのデータの指定
curl_setopt($curl, CURLOPT_HTTPHEADER, $header); //ヘッダーの指定

//curlはデフォルトでセッション終了後にレスポンスを出力する。以下の文でそれを止める
//TRUEを設定すると、curl_exec()の返り値を文字列で返します。通常はデータを直接出力
curl_setopt ( $curl, CURLOPT_RETURNTRANSFER, true );

$response = curl_exec($curl);//cURLセッションを実行。レスポンスが返されるっぽい

curl_close($curl);//cURLセッションを閉じる

$arr = json_decode($response,true);//trueで連想配列の指定

//ラベル名の取得、出力
echo $arr["payload"][0]["displayName"];

```
#OAuthからリフレッシュトークン、アクセストークン生成
1. GCPのwebコンソールページからOAuth client IDを作成する  
  ※リダイレクトURIは`www.google.co.jp`等でも大丈夫
2. 作成時の①クライアントID、②クライアントシークレット、③リダイレクトURIをメモしておく
3. 使いたいapiのスコープを調べる=>④(autoMlは`https://www.googleapis.com/auth/cloud-platform`)
4. ブラウザから`https://accounts.google.com/o/oauth2/auth?client_id=①クライアントID&redirect_uri=③リダイレクトURI&scope=④apiのスコープ&response_type=code&approval_prompt=force&access_type=offline`にアクセス
5. 確認後にリダイレクトされたサイトのurl欄から`code=`以下をメモする=>⑤
6. curlを実行`#curl -d client_id=①クライアントID -d client_secret=②クライアントシークレット -d redirect_uri=③リダイレクトURI -d grant_type=authorization_code -d code=⑤ https://accounts.google.com/o/oauth2/token`  
7. 取得したjsonをメモ⑥(リフレッシュトークンが含まれています)
8. `curl --data "refresh_token=⑥リフレッシュトークン" --data "client_id=①クライアントID" --data "client_secret=②クライアントシークレット" --data "grant_type=refresh_token" https://www.googleapis.com/oauth2/v4/token`
9. apiに必要なアクセストークンが得られる

ここで得たリフレッシュトークンには有効期限がない  
8,9の手順をphp等でまとめれば自動でトークンを更新できる



#解決していない問題
winのコマンドプロンプトのcurlを使って試しにリクエストを送ろうとしていたが401エラーの解決法がわからず断念
コマンド内のoauthトークン発行がうまくいってなかったのかもしれない
まだローカルでしか確認できていないためherokuに挙げても実行できるのかわからない
gcloudコマンドをもう少し調べる
これでいけるなら他言語の実装も何とかなりそう
なぜか公式のcurlがうまくいかない


更新予定....
リスト内包表記をつかってみた

@shiracamus さんに教えていただいた内包表記が
かっこよかったので自分も使って見ました。

#リスト内包表記を使用しない場合

```
# 麻雀牌のクラス
class Tile:
    def __init__(self, kind, value, pic):
        self.kind = kind  # 麻雀牌の種類（萬子・筒子・索子・四風牌・三元牌）
        self.value = value  # 麻雀牌の値（1~9 東南西北白発中）
        self.pic = pic  #画像ファイル名
    
        def __repr__(self):
        return f'{self.kind}, {self.value}, {self.pic}\n'

# 山牌　シャッフルされた１３６個のTileオブジェクトリストを返却
def create_yamahai():...

yamahai = create_yamahai() #山牌作成
haipai = []                #配牌リスト
for i in range(14):
    tile = yamahai.pop(0)  #山牌から一つ取り出す
    haipai.append(tile)    #配牌リストに加える
print(haipai)              #出力！      

```
出力結果は以下のようになりました。
<img width="1186" alt="スクリーンショット 2019-05-17 1.19.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/deb8494d-cea4-61b0-4309-e4c65e575e1f.png">

この書き方でも配牌リストを作成するっていう目標は達成できているんですが、
forループにせずにリスト内包表記で書きたいと思います。

※ちなみにですが、Tileクラスに \_\_repr\_\_メソッド を作成すると
printメソッドで出力するときに各オブジェクトの\_\_repr\_\_メソッドの結果を
出力するみたいです。
参照：https://gammasoft.jp/blog/use-diffence-str-and-repr-python/


#リスト内包表記を使用した場合

リスト内包表記を使用した場合、配牌リストを一行で作成することができます。

```　変更前.py
haipai = []                #配牌リスト
for i in range(14):
    tile = yamahai.pop(0)  #山牌から一つ取り出す
    haipai.append(tile)    #配牌リストに加える
```
```　変更後.py
haipai = [yamahai.pop(0) for i in range(14)]  # 配牌リスト
```
ずいぶんスッキリしました！
yamahai.pop(0) 処理を
for i in range(14)ループ内にて実行する。
って意味になるんですね。


#おまけ
PyCharmだと、リスト内包表記をforループに変換する機能があるみたいです。
<img width="692" alt="スクリーンショット 2019-05-17 1.39.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/16491d73-a3d7-c604-688a-09d7b3601b3a.png">
これが
↓
<img width="692" alt="スクリーンショット 2019-05-17 1.41.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363095/a2112366-c675-1e3f-7d85-00ee07900bde.png">
こうなる

最近のIDEツールはほんとにいろんな機能がありますね。
機械学習向き　Ubuntu18.04 最初にやること(GPU編)

#目的
計算用の端末を借りたり、にっちもさっちも行かなくなってOS再インストールしたりした直後にやること。
今回は（個人的な理由で）Ubuntu 18.04の環境を作ります。


#大前提
NVIDIAのグラフィックアクセラレータのドライバー（あれば）
Chrome
Dropbox
vim
git
curl

そもそもGUIが動かない場合、まずは端末のみの起動でNVIDIAのドライバーをインスコしておく。

```terminal
sudo apt-get update
sudo apt-get install nvidia-384
reboot
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
sudo apt update
sudo apt install google-chrome-stable
sudo apt install -y nautilus-dropbox
sudo apt install vim
sudo apt install byobu
sudo apt install git
sudo apt install curl
sudo apt install g++
```

#必ず使うもの
Python3,Jupyter notebook
Python3 各種パッケージ

```terminal
sudo apt install python3-pip
sudo pip3 insatall numpy scipy pandas
sudo apt install jupyter-notebook

```
注意：
pip3 install --upgrade pip
をしてはいけない。

理由と対策はリンク参照。
https://mem-archive.com/2018/10/28/post-996/

# GPUで計算をさせる場合
このリンクを参照。
https://blog.amedama.jp/entry/2017/03/13/123742

<b>ただし、tensorflow-gpuの最新版はcuda10.0しか対応していない。10.1はダメなので、必ず以下のリンクより10.0をダウンロードすること。</b>

https://developer.nvidia.com/cuda-toolkit-archive


cuda-repo-ubuntu1804_10.0.130-1_amd64.debをダウンロードしたディレクトリで、以下を実行せよ。

```terminal
sudo dpkg -i cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda-10-0

```

また、今回はUbuntu 18.04なので、「cuDNN をインストールする」の節は以下のように読み替えよ。

## Ubuntu18.04版cuDNNインストール

### Step 1
https://developer.nvidia.com/rdp/cudnn-download
↑のリンクにアクセスして、Download cuDNN v7.5.1 (April 22, 2019), for CUDA 10.1をクリックせよ。

### Step 2
cuDNN Runtime Library for Ubuntu18.04 (Deb)

cuDNN Developer Library for Ubuntu18.04 (Deb)

cuDNN Code Samples and User Guide for Ubuntu18.04 (Deb)

の3つのファイルをダウンロードせよ。


### Step 3

端末で以下を実行せよ。

```terminal
sudo dpkg -i libcudnn7_7.5.1.10-1+cuda10.1_amd64.deb
sudo dpkg -i libcudnn7-dev_7.5.1.10-1+cuda10.1_amd64.deb
sudo dpkg -i libcudnn7-doc_7.5.1.10-1+cuda10.1_amd64.deb

```
「libcupti-dev をインストールする」まで実行したら先程のページを読むのをやめて良い。
ベンチマークをするには、もう少し読み続けよ。ちなみに私は今回は仮想環境を作らなかった。

kerasとtensorflow-gpuをインストールし、cuda-10.0へパスを通す。

```terminal
pip3 install keras tensorflow-gpu
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda-10.0/lib64/
```

```python
from keras.datasets import mnist
mnist.load_data()
```
実験用コードを取ってくる。
そして時間を測りながら実行。

```terminal
curl -O https://raw.githubusercontent.com/fchollet/keras/master/examples/mnist_cnn.py
echo 'K.clear_session()' >> mnist_cnn.py
time python3 mnist_cnn.py
```

# 付録１．うっかりcuda-10.1をインスコしたとき
慌てずcuda関係をpurgeして、10.0を再インスコせよ。

```terminal
sudo apt purge libcuda*
sudo apt purge nvidia-cuda-*
sudo apt purge cuda*
```

# 付録2.　tensorflowとcudaのバージョン対応
tensorflowはかなり厳密にcudaのバージョンを要求してくるので注意せよ。対応表は以下。

![Screenshot from 2019-05-17 01-26-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282790/d161ef41-0da3-d743-88e3-c7e97cf1a7ea.png)

引用元：https://www.tensorflow.org/install/source#linux

# 付録3.
## slack
https://slack.com/intl/ja-jp/downloads/linux
をダウンロードして実行
webプログラミングに興味あるので勉強します

#導入
初めてQiitaの記事を書きます。webプログラミングには大変興味があるので、Markdownの書き方を覚えながらノート代わりとして勉強法を記事に残していこうと思います。
もっとこうした方が良い、このサイトや本は大変参考になるといったものがあれば教えてくださると嬉しいです！

#とりあえず目標は
- [x]  HTML、CSSを使ってブログを書く
- [x]  PHPで掲示板を作れるようにする
- [x]  JavaScriptでブログに動きや機能を実装
- [x] Vue.jsで簡単なwebアプリを作成<br>
      →聖地巡礼ノート作ってみました！https://pilgrimagenote.web.app/
- [x] Laravelを用いて皆が共有できる聖地巡礼マップを作成<br>
      → 聖地巡礼マップではなくLunchMapアプリを作りました！！！！<br>　まだ作成中ですが、GitHubURLはhttps://github.com/RitaChan0401/LunchMapApp

#どうやって勉強するか。分かりやすいサイトはどれか？
以下1、2、3の順で勉強していきます。
##1. HTML、CSS
#####基本中の基本! 書き方やどんなタグがあるのか？ id、classの違いをおさえる。

- [HTMLとCSSの基本をサルでもわかるようにまとめた【入門・初心者向け】](http://www.ituore.com/entry/html-css-basic#box)
- [初心者向けHTML入門：書き方の基本とタグの使い方](https://saruwakakun.com/html-css/basic/html)

#####次に、margin paddingの違いと使い方の把握、displayの使い方をマスター 

* [CSSのmarginとは？paddingとは？余白の指定方法まとめ](https://saruwakakun.com/html-css/basic/margin-padding)
* [displayの使い方を総まとめ！inlineやblockの違いは？](https://saruwakakun.com/html-css/basic/display)

#####その他、良いサイトまとめ

- [実践型のプログラミング学習サービス CODEPREP](https://codeprep.jp/)
- [articleとsectionについて(Qiita記事)](https://qiita.com/piotzkhider/items/faffbc4a107e7e495998)
- [意外と知らない!?CSSセレクタ20個のおさらい](http://weboook.blog22.fc2.com/blog-entry-268.html)

##2. PHP
#####基本操作を知る！

- [実践型のプログラミング学習サービス CODEPREP PHP編](https://codeprep.jp/books/category/PHP)
- [ドットインストール PHP入門](https://dotinstall.com/lessons/basic_php_v2)

#####実際にコードを書きながら学習していく

- [【PHP初心者向け】セキュアな掲示板を最小構成から作る](https://qiita.com/mpyw/items/2c54d0ea95423bd88f60)
- [【PHP超入門】クラス～例外処理～PDOの基礎](https://qiita.com/7968/items/6f089fec8dde676abb5b#static%E3%81%AE%E6%84%8F%E5%91%B3%E3%81%AFstatic%E3%81%A8public%E3%81%AE%E9%81%95%E3%81%84%E3%81%AF)
- [PHPオブジェクト指向入門（前半）](https://qiita.com/mpyw/items/41230bec5c02142ae691)
- [PHPでデータベースに接続するときのまとめ](https://qiita.com/mpyw/items/b00b72c5c95aac573b71)
- [ファイルアップロードの例外処理はこれぐらいしないと気が済まない](https://qiita.com/mpyw/items/939964377766a54d4682)<br>

とてもわかりやすい記事有難う御座います:bow_tone1:

#####コメントで教えて頂いたサイト(有難う御座います！)

- [PHP The Right Way](http://ja.phptherightway.com/)
- [PHP7 で堅牢なコードを書く - 例外処理、表明プログラミング、契約による設計 / PHP Conference 2016](https://speakerdeck.com/twada/php-conference-2016)

#####最低限PHP言語の知識を習得し、ある程度理解できるようになってきたら・・・

- [PHP マニュアル 日本語翻訳版](https://www.php.net/manual/ja/index.php)
- [PHP マニュアル 英語版](https://www.php.net/manual/en/)

今後より正確に言語を把握するためにはマニュアルが読めるようになるというのは必須条件ですね・・・
たまに日本語の意味が通じない箇所もあるようなので、英語も読めるようにならないとダメみたいです:frowning2:


##3. JavaScript
#####入門
- [ドットインストール JavaScript入門](https://dotinstall.com/lessons/basic_javascript_v3)

#####その他、jQuery等も

- [ドットインストール jQuery入門](https://dotinstall.com/lessons/basic_jquery_v2)
- [JavaScript(jQuery)からPHPのAPIを利用する](https://qiita.com/mpyw/items/62e6e415f86eb30a5ff4)

##4. 上の3つ全てやりきったら・・・ 
ここでVue.jsやLaravel、React等に手を出していくべきかなと思っています。
色んな方の記事を参考にしてでた結論です。当たり前かもしれませんが・・・

#おわりに
今年の12月までには全ての目標を達成できるようにしたいです。とにかく時間を費やしてコードをいくつも書いていき、経験値UPしていきたいと思っています。
swiftでemailのバリデーションかけたけど、前後に日本語・スペースを許容してエラー文が表示されない

メモメモ。


## 目標
emailにバリデーションをかけること。
日本語やスペースは許容しない。


## なにごと

こういう書き方はたくさんみたけど

```swift
var isValidEmail: Bool {
    return (self =~ "[A-Z0-9a-z._+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}")
    }
```

前後に日本語なりスペースを入れた時にエラーがバリデーションをすり抜けた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233386/6acbcc99-a972-5dc1-686d-ab7451a2b542.png)

（エラー出ない。。）

バックエンドではちゃんとバリデーションかかるように実装済なのでサーバーエラーとして
返されちゃって気持ち悪い。

## 解決する

「前後に日本語なりスペース〜」を考慮した書き方にする。

```swift
    var isValidEmail: Bool {
        return (self =~ "^([A-Z0-9a-z._+-])+@([A-Za-z0-9.-])+\\.([A-Za-z]{2,})$")
    }
```
やったのは
・それぞれのパーツ[@と.の前後]を（）で各要素を区分け
・始まり[ˆ]と終わり[$]を明記

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233386/613c949c-2da1-a48a-bb88-3da274d74780.png)

（エラーでた😌）

全然見つからなかったのでメモメモ。
これだけなのにちょっと時間食われた。。

もっといい書き方あったらウェルカムです🍺
Angular 入門

#はじめに
![angular.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368226/f16ca9c3-796a-d613-8c85-c4d8a5af64b8.png)

サクッとAngularを動かしてみる方法を以下の2点の方法で解説していきます。

- 環境構築
- アプリケーションの開発

基本的に公式のチュートリアルを真似ているので、詳しいことを知りたい方は[Angular公式サイト](https://angular.jp/guide/quickstart)をご覧ください。

- Angularってなに？って方は[こちら](https://qiita.com/NS19960207/items/961ddfa32bd1faa43b80)。
- Angularに改修を加えて、自動テストをしてみたい方は[こちら](https://qiita.com/NS19960207/items/56cfeae9459b9c73b14a)。

#環境構築
必要な環境を構築します。
以下の環境は整っていますか？整っている方はここを飛ばしてください。

- node.js
    - 確認方法：ターミナル or コンソールで ` node -v ` 
- npmパッケージマネージャ
    - 確認方法：ターミナル or コンソールで`npm -v`
- AngularCLI
    - 確認方法：ターミナル or コンソールで`ng --version`


##各環境のインストール
####node.jsのインストール
こちらの[サイト](https://nodejs.org/ja/download/)から自分のOSに合ったものをダウンロードしましょう。

---
####npmパッケージマネージャのインストール
npmはnode.jsをインストールすれば、一緒にインストールされるはずです。

---
####AngularCLIのインストール
ターミナル orコンソールで


```
npm install -g @angular/cli
```


を実行してください。


#アプリケーションの開発

ここから簡単なサンプルサイトを開発します。
開発すると言うほどのことはしませんが…


####新しいワークスペースと初期アプリケーションプロジェクトを作成
ターミナル orコンソールで

```
ng new my-app
```
を実行してください。

何か聞かれると思うので、Enterを押してデフォルトのままにしてください。
これで、新しいワークスペースと初期アプリケーションプロジェクトが作成されました。
簡単ですね:thumbsup_tone1:

---

####サーバーの起動
次にサーバーを起動してローカルで動かしてみましょう。

まずはワークスペースに移動します。

```
cd my-app
```
次にサーバーを起動します。

```
ng serve --open
```

正しく起動できれば、サンプルサイトが立ち上がるはずです。:tada:

#参考サイト
[Angular](https://angular.jp/guide/quickstart)
Firebase Crashlyticsで.dSYMを手動アップロードする

App Store Connect -> マイ App -> アクティビティ -> すべてのビルド -> 対象のバージョンを選択 -> dSYM をダウンロード リンクを選択 -> ダウンロードしたappDsymsをzipに圧縮してCrashlytics側にアップロード。
rails sをしたらtmp/pids/server.pidというエラーが出る件について

#今回の目的
rails sをしたらtmp/pids/server.pidというエラーが出た時の対処方法

```
/Users/ユーザー名/projects/test/tmp/pids/server.pid.
```

#手順
####「server.pid」の削除
下記ファイルを削除しましょう。ディレクトリは読みかえてください。

```
/Users/ユーザー名/projects/test/tmp/pids/server.pid
```

####処理の終了
下記で該当の処理を確認します。

```
lsof -i:3000
```

こんな感じで処理の一覧ができるので

```
COMMAND     PID      USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
Google    45385 ユーザー名   43u  IPv6 0x839bb4867fea3c69      0t0  TCP localhost:64733->localhost:hbci (ESTABLISHED)
Google    45385 ユーザー名   47u  IPv6 0x839bb48685588da9      0t0  TCP localhost:64734->localhost:hbci (ESTABLISHED)
ruby      67430 ユーザー名   21u  IPv4 0x839bb4869b17f329      0t0  TCP localhost:hbci (LISTEN)
ruby      67430 ユーザー名   22u  IPv6 0x839bb4868abc95e9      0t0  TCP localhost:hbci (LISTEN)
ruby      67430 ユーザー名   40u  IPv6 0x839bb4867fea5ee9      0t0  TCP localhost:hbci->localhost:64437 (CLOSE_WAIT)
ruby      67430 ユーザー名   44u  IPv6 0x839bb4868abc9029      0t0  TCP localhost:hbci->localhost:64196 (CLOSE_WAIT)
ruby      67430 ユーザー名   45u  IPv6 0x839bb4867fea7029      0t0  TCP localhost:hbci->localhost:64733 (ESTABLISHED)
ruby      67430 ユーザー名   46u  IPv6 0x839bb4868558aa69      0t0  TCP localhost:hbci->localhost:64734 (ESTABLISHED)
```

「COMMAND」に「ruby」と記載のある行のPIDをコピーして(今回でいうと67430)
処理を終了させます。

```
kill -9 67430
```
終わったら再度「rails s」を行なってみましょう。
問題なくできるはずです。

以上です。
AWSの本番環境でMySQLを触った時の初歩の初歩の覚書

#今回の目的
AWSの本番環境でMySQLを触った時の覚え書きを書く

#手順
####MySQLにログイン
AWSの本番環境ログイン後、下記コマンドを実行

```
mysql -u root -p
```

パスワードを求められるので入力(表示はされません)

```

Enter password: 
```

####DBの確認方法
MySQLではいきなりSELECT文を入力しても、テーブルやデータは表示されません。
まずはDBを選択する必要があります。下記コマンドで一覧を確認することができます。

```
SHOW DATABASES;

+-------------------------+
| Database                |
+-------------------------+
| information_schema      |
| testDB                  |
| mysql                   |
| performance_schema      |
+-------------------------+
4 rows in set (0.01 sec)

```

####DBの選択
```
use 確認したいDB名
```

####DBのテーブル一覧
下記で確認できます。

```
SHOW TABLES FROM 確認したいDB名;
```

####テーブルのカラム名一覧
下記で確認できます。

```
show columns from 確認したいテーブル名;
```


以上です。
作ってもらったAWSの本番環境にログインする際に行なったことの覚書

#今回の目的
作ってもらったAWSの本番環境にログインする際に行なったことを書く

#手順
証明書(pemファイル)を教えてもらう
「ダウンロード」フォルダにとりあえず置く
下記コマンドを実行します。

```
cd
mv Downloads/(ファイル名).pem .ssh/
cd .ssh/
chmod 600 (ファイル名).pem
ssh -i (ファイル名).pem ec2-user@作成したEC2インスタンスと紐付けたElastic IP
```
下記がでたら「yes」でOK

```
The authenticity of host 'EC2インスタンスと紐付けたElastic IP (EC2インスタンスと紐付けたElastic IP)' can't be established.
ECDSA key fingerprint is SHA256:5mN2CCRZmBDty4pZRFOTebQ/NuuyEh8/M2rdw4l5SZQ.
Are you sure you want to continue connecting (yes/no)? yes
```
ログインが完了します。
以上です。
create-react-appでデコレータを使う

# TL;DR
create-react-app（以下，**CRA**）で生成したプロジェクトでESNext構文のデコレータを利用します．CRAではejectすることで内部の設定ファイルを編集することができますが，それはCRAを利用しないのと同義です．一方，CRAでデコレータを利用するためには隠蔽された内部設定を書き換える必要があります．本稿はejectせずにデコレータを有効にする手段を記します．具体的には次の2通りの手段で解決できます．

1. [customize-cra](https://github.com/arackaf/customize-cra)と[react-app-rewired](https://github.com/timarney/react-app-rewired)を利用して，内部設定を書き換えます．
1. プロジェクトにTypeScriptを採用します．その場合，`tsconfig.json`に`"experimentalDecorators": true`を記載するだけです．

# CRAのインストール〜プロジェクト作成
本稿では`yarn`を利用します．まず`create-react-app`コマンドを利用できるようにします．
インストール後，CRAでプロジェクトを生成します．TypeScriptプロジェクトの場合は`--typescript`オプションをつけて実行します．

```sh
yarn global add create-react-app
create-react-app hello-decorators
cd hello-decorators
```
# 設定を書き換える（JavaScript）

## customize-craとreact-app-rewiredとプラグインのインストール

書き換えに必要なツールとデコレータを有効にするためのBabelプラグインをインストールします．

```sh
 yarn add --dev customize-cra react-app-rewired @babel/plugin-proposal-decorators
``` 

## package.jsonの編集

`package.json`内の実行コマンドを編集します．`react-scripts`を`react-app-rewired`に変更します．`eject`の行はそのままにしておきます．

```package.json
"scripts": {
  "start": "react-app-rewired start",
  "build": "react-app-rewired build",
  "test": "react-app-rewired test",
  "eject": "react-scripts eject"
},
```

## config-overrides.jsを作成

プロジェクトルート下に`config-overrides.js`を以下の内容で作成します．
ここで内部設定の修正内容を記載します．

```{config-overrides.js}
const { override, addDecoratorsLegacy } = require('customize-cra')

// Adds legacy decorator support to the Webpack configuration.
module.exports = override(addDecoratorsLegacy())
```

## 確認

作業は以上になります．
実際にデコレータが利用可能か確認します．`App.js`を編集してデコレータを記載します．
保存後，`yarn start`で開発サーバを起動してください．

```jsx:App.js
import React from 'react'
import './App.css'

// Decorator that passes on a 'message' property to a class.
const addMessage = (str) => (component) => {
  component.prototype.message = str
}

@addMessage('Hello world!')
class DecoratorTest extends React.PureComponent {
  render() {
    return <div>{ this.message }</div>
  }
}

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <DecoratorTest />
      </header>
    </div>
  )
}

export default App
```

```
yarn start
```

`Hello world!`が表示されれば無事完了です．

# tsconfig.jsonを編集する（TypeScript）

プロジェクトにTypeScriptを採用する場合，設定ファイルである`tsconfig.json`が内部に隠蔽されていないため容易にデコレータを有効にできます．以下の設定を`"compilerOptions"`内に追加します．

```json
"experimentalDecorators": true
```


# 参考
* [How to (not) use decorators](https://mobx.js.org/best/decorators.html)
* [Adding decorator support to Create React App projects using react-app-rewired](https://medium.com/@michielsikma/adding-decorator-support-to-create-react-app-projects-using-react-app-rewired-df48e7ffd636)
How to determine height of UICollectionView with FlowLayout

```
class DynamicCollectionView: UICollectionView {
  override func layoutSubviews() {
    super.layoutSubviews()
    if !__CGSizeEqualToSize(bounds.size, self.intrinsicContentSize) {
      self.invalidateIntrinsicContentSize()
    }
  }

  override var intrinsicContentSize: CGSize {
    return collectionViewLayout.collectionViewContentSize
  }
}
```
self sizing cell

# FlowLayout
```
flowLayout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize
```

#collectionViewCell
```
class CollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var titleLabel: UILabel! {
        didSet {
            titleLabel.text = nil
        }
    }
    @IBOutlet weak var textLabel: UILabel! {
        didSet {
            textLabel.text = nil
        }
    }
    @IBOutlet weak var separator: UIView!
    @IBOutlet weak var widthLayout: NSLayoutConstraint?

    override func awakeFromNib() {
        super.awakeFromNib()
        // 本当は CollectionView の幅とかを指定したほうが良い
        setCellWidth(UIScreen.main.bounds.width)
    }

    func setCellWidth(_ width: CGFloat) {
        widthLayout?.constant = width
    }

    class func nib() -> UINib {
        return UINib(nibName: "\(self)", bundle: nil)
    }

    override func prepareForReuse() {
        super.prepareForReuse() // Don't forget!
    }
}
```
エラー内容が変わった

# ♪大当たり〜
- 使用しているディレクトリ名「type」は予約語だと@zetamatta からコメントをもらった
- @zetamatta 情報ありがとうございました
- 軽く検索するだけまぁ出てくる出てくる[予約語](https://qiita.com/rock619/items/db44507d02814e490902#%E4%BA%88%E7%B4%84%E8%AA%9E)

# 予約語をやめてみる
- 予約語（使ってはダメ）をやめて、同じ「種類」を意味する`sort`を使用するとエラーが変わった
- 修正前のエラーメッセージ

```
type/sake.go:1:9: expected 'IDENT', found 'type'
type/sake.go:2:2: expected ';', found 'EOF'
```

- 修正後のエラーメッセージ

```
*******:~/go/alcohol$ go run main.go 
# command-line-arguments
./main.go:10:17: cannot refer to unexported name sort.beerfamous
./main.go:10:17: undefined: sort.beerfamous
./main.go:11:17: cannot refer to unexported name sort.sakefamous
./main.go:11:17: undefined: sort.sakefamous
./main.go:12:17: cannot refer to unexported name sort.whiskeyfamous
./main.go:12:17: undefined: sort.whiskeyfamous
```

# 気にせずまた明日挑戦
- 引き続きエラーが表示されるが、まあまあ適当に書いたのでまあこんなもんかと
- 明日また挑戦し今度こそ意図した通りに動かすぞ❤️
react-notification-systemで通知機能をつける

# 話の流れ
 - 前書き
 - 導入
 - 使い方
 - 後書き
 
# 前書き
今回React.jsでTodoを作るにあたって、通知機能をつけたいと思い、使ってみました。
シンプルにでき、そのままでも綺麗に実装されますが、通知の中もコーディングで独自のスタイルを当てられるのが、自由度があっていいと思います。

公式ではデモが見れるのでぜひ参考にしてみてください。
公式：http://igorprado.com/react-notification-system/
GitHub: https://github.com/igorprado/react-notification-system

# 導入
npmまたはyarnでインストールします。

```
npm install react-notification-system
yarn add react-notification-system
```
そして、サンプルコードは以下になります。
想定は、ボタンを押すと、通知が現れるというものです。（GitHubのUsingと一緒ですが...）

```index.js
import React, { Component } from 'react';
import NotificationSystem from 'react-notification-system';

class App extends Component{
    constructor(props){
        super(props);
        this.notificationSystem = React.createRef();
        this.addNotification = this.addNotification.bind(this);
  }
  addNotification() {
        const notification = this.notificationSystem.current;
        notification.addNotification({
            title: "Notification",
            message: "Hi, I'm information!",
            level: "info"
        })
    }
    render() {
        return (
          <>
            <button onClick={this.addNotification}>通知する</button>
            <NotificationSystem ref={this.notificationSystem} />
          </>
    )
  }
}
```
これでボタンをクリックすると画像のような通知が出てきます。
![スクリーンショット 2019-05-16 23.35.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405522/43972d1b-eac9-4760-a219-1b714c7a8353.png)

このtitleとmessageの部分をhtmlで以下のように記述することができます。
（必要な箇所だけ抜粋しています。また、スタイルにはstyled-componentsを利用しています。styled-componentsの仕様につきましては、他の記事を参照ください。）

```index.js
const Notification = styled.div`
    text-align: center;
    button{
        background: rgba(54, 156, 199, .1);
        padding: 4px 1rem;
        width: 80%;
        border: solid 2px rgb(54, 156, 199);
        border-radius: 6px;
        color: rgb(54, 156, 199);
        cursor: pointer;
        text-align: center;
        font-weight: bold;
        &:hover {
            background: rgba(54, 156, 199, .4);
        }
    }
`;
addNotification() {
        const notification = this.notificationSystem.current;
        notification.addNotification({
            level: 'info',
            autoDismiss: 10,
            children: (
                <Notification>
                    <h2>削除してもよろしいですか</h2>
                    <button onClick={console.log("Compolete")}>Delete</button>
                </Notification>
            )
        });
    }
```
これにより、以下のようなデザインになります。
![スクリーンショット 2019-05-17 0.00.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405522/f85cf5c8-a22d-511f-6836-647bb9a3de39.png)

ボタンもデフォルトのスタイルでよければ、childrenプロパティを用いずにactionプロパティを使えば同様に実装が可能なのですが、上の画像のように、ボタンだけでなく、自分のスタイルを使いたい！という場合は、こちらで実装してみてください。
あと、今回はやっていないですが、Font Awesomeを使ってもおしゃれになりますね！！

# 後書き
ページに通知機能がつくと、なんか気持ちいいですね笑
思っていたよりも簡単に実装ができたので、ご参考までに。
ありがとうございました。
GitHubのリポジトリをorganizationアカウント（別Owner）に移譲した際の手順

# 概要
個人アカウントで作成したリポジトリをorganizationアカウントへ移譲する手順です。
GitHubの設定からすべて完了します。
また、下記の状態になっていることを確認できました。

- issue、commit、pull requestが引き継がれる
- Webhookの設定も引き継がれる
- 参照されているリンクはリダイレクトされ、移譲後のリポジトリに遷移する
- ローカルのリモートリポジトリの向き先も変更する必要がない

## 移譲するリポジトリのSettingsを選択
<img width="1041" alt="スクリーンショット 2019-05-16 22.57.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226008/ef171a5e-d9ad-abc2-8b53-cdb1f8f8368b.png">

## Settings > Transfer ownershipを選択
<img width="777" alt="スクリーンショット 2019-05-16 22.58.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226008/1180e22d-045e-dfdf-36e0-7bceea5d057e.png">

## 移譲するリポジトリ名と移譲先のアカウントを入力
<img width="447" alt="スクリーンショット 2019-05-16 22.59.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226008/13ea17a3-6b84-cd32-1f98-d7041e4a21fe.png">

## 移譲完了
<img width="997" alt="スクリーンショット 2019-05-16 23.27.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226008/a4a25c54-eb42-ec9b-173f-bf60de10370e.png">

## リダイレクト確認
他プロジェクトからリンクされている箇所を確認したところ、`301 Moved Permanently`でリダイレクト設定になっていました。
<img width="659" alt="スクリーンショット 2019-05-16 23.08.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226008/fb86bf02-be1d-8916-27b2-e3c03b4dff73.png">

## その他
slack⇔GitHubをしている場合は、再度organizationアカウントにslack appを入れる必要があります。
<img width="1030" alt="スクリーンショット 2019-05-17 0.02.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226008/14fd2441-a4b7-ba8f-cfad-eefb196c66fc.png">

# 参考サイト
[GitHubのリポジトリを別のOwnerに引き渡す](https://qiita.com/do7be/items/fa845240bc58b2153a44)
0から始めるJava入門 その1

# はじめに
今年の春からIT企業に入りました。自分自身、大学でC言語触ってたくらいのスタートでした。
そんな中、プログラミング研修を受けてて思ったのが、分かりづらい....でした。結局、研修が充実していると聞いて入ったものの、自習で全て賄う形になってしまいました。
そんなプログラミング完全初心者の新入社員(新入生?)に向けて、プログラミングってこんなんだよというのを伝えられればと思い書き始めました。

※ 一部、分かりやすさ重視で実際とは異なる記述をしています。(コンパイルなど)
　完全な初心者に向けての記述なので、分かっている人はスルーしてください。

## 環境
プログラミングをやるには環境が必要です。
javaはなんかめんどくさくて、jdkを入れないと動かなかったりなんだりがあります。
プログラミング自体、色々な開発環境や実行環境などありますが、とりあえずjavaを始めるならDokojavaでいいと思います。**Dokojava**で検索すれば出てきます。
いちいちパスワード打つのめんどいという人は、eclipse をダウンロードしましょう。"pleiades"で検索して(おそらく)トップに出てくるサイトに行けば、ダウンロードできます。

今回はDokojavaを想定して書いていきます。
## 書いてみる
では、実際に書いてみましょう。
dokojavaにログインすると、

```java:Main.java
public class Main{
  public static void main(String[] args){
    System.out.println("Hello World");
  }
}
```
と書いてあると思います。
public~~はとりあえず気にせず、**弄らない**ようにしておいてください。
`System.out.println("");`
は標準出力といって、画面に" "で囲まれた文字を写してくれます。

これから使う文法ですので、覚えておいてください。
では、上のを見ながらで構わないので、好きな文章をもう一行追加してみましょう。

```java:例
public class Main{
  public static void main(String[] args){
    System.out.println("Hello World");
    System.out.println("Hello Java");
  }
}
```
## 実行してみる
追加できたら今度は実行します。

Dokojavaの人は簡単で、画面の上の方に"コンパイル"という文字があると思うので、そこをクリックしてください。パスワード(?)を求められるので、入力してください。**(半角しか認識されないので注意してください！！)**
右側に、"エラーはありません"という文字が表示されていればOKです。
よくわからないメッセージが出ている方は、上の例を見ながら、;や()や{}を確認してみてください。最初は丸写しでも問題ないです。

さて、これでコンパイル(エラーのチェックみたいなもの)が終わりました。やっと実行です。
これもDokojavaの人は簡単で、コンパイルの右に"実行"という文字があるので、クリックしてください。これもパスワード(?)を求められますので、入力してください。**"詳細を指定して実行"と出る人は、もう少し左側をクリックしてください。**

下の方に、
`Hello World
Hello Java
`
と出たらOKです。**"Hello Java"の部分に自分の打った文字が書かれているか確認してください。**
できたプログラムを動かすときは**"コンパイル"して"実行"**です。覚えておきましょう。

## 変数
最後は変数です。数学でいうx,yみたいなもので、値を入れておけます。
とは言っても分かりづらいと思うので、Dokojava のコードを下のように書き換えてください。

```java:Main.java
Public class Main{
  Public static void main(String[] args){
    String str = "Good Morning";
    System.out.println( str );
  }
}
```
書き換えたら"コンパイル"して"実行"してみましょう。(分からない時は上の内容を見ながら進めてみてください)
実行した結果、下の方に
`Good Morning`
と出ていればOKです。
Good Morningを自分で置き換えて、出力されることを確かめてみてください。

## 終わりに
さて、ここまで進めてみていかがでしたでしょうか？
まだまだ続きますが、とりあえず一区切りです。
これからキーボードで入力を受け付けたりするのですが、**問題があります。**
Dokojavaでキーボード入力を受け付けるには、**Dokojavaの会員登録をするか、JDKと呼ばれる開発ツールをインストールしなければなりません....**
ここまでやってみてついてこれている人は是非、**JDKをインストールしてみてください**。Dokojavaの右上の歯車をクリックすると、**JDK導入ガイド**という項目があります。そこの指示にしたがって進めれば、インストールできます。もちろんDokojavaをそのまま使っても大丈夫です。

まだ分からないという人は繰り返し触ってみてください。
先に進むのも良いですが、もう一回だけ今回の内容を復習してみましょう。
Monacaのデバッグメニューをどかす

Monacaで実機デバッグを行う際、右下に表示されるデバッグメニューが邪魔で、右下にフローティングしたボタンが押せなくなる現象。

以下の二つが重なる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253985/350637e6-2947-1e11-40dd-81fc108b1f95.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253985/19fdc670-4703-060f-a81e-c333767b9d80.png)

デバッグメニューはドラッグできるので、事なきを得ました。
[Unity]特定のコンポーネントだけ表示/非表示を切り替える方法

## [Unity]特定のコンポーネントだけ表示/非表示を切り替える方法
![Screen Shot 2019-05-16 at 23.44.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250231/df0bbe50-bbad-c358-e17e-888833c2a628.png)
このようにヒエラルキービューの左端に目の形をしたアイコンがあるので、ここをクリックすることで切り替えることができます。
もしアイコンが見当たらない場合は、Unityを2019年版にアップデートしてみて下さい。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
5/16 本日の勉強記録　RoR　Bootstrap

今後よく使うことになるであろう、Bootstrapの導入の流れをまとめる。



Gemfileに

```rb
gem 'bootstrap', '~> 4.○.○'
gem 'jquery-rails', '~>4.○.○'
```
と記入し、`bundle install`

インストールできたら、
ターミナルで`mv app/assets/stylesheet/application.css app/assetes/stylesheets/application.scss`
でapplication.cssをapplication.scssに変更。

```application.scss
@import "bootstrap";
```
と記入。

その後、

```application.js
//= require jquery3
//= rwquire popper
//= require bootstrap-sprockets
```
を追加。

これでできた。
何か間違っているところがあれば、指摘していただけると幸いです。

そういえばキーボードの「o」だけなんか打ち込んだ時に違和感があるんですが、なんでだろう。ホコリとか入っちゃったのかな。
StringBuffer and StringBuilder Class in Java

Both StringBuffer and StringBuilder are two important classes in Java which represents mutable String i.e. the String object, whose value can be changed. Since String is Immutable in Java, any change or operation on String object e.g. converting it to upper or lower case, adding character, removing a character, or getting a substring, all results in a new String object.

Anyway, when StringBuffer was introduced it has its own problem e.g. it was synchronized, methods like append have synchronized and hence they were slower. Even if you use them by just one thread and don’t share with other threads, the cost of acquiring and releasing lock due to Synchronization is still significant.

Since StringBuffer is mostly used as local mutable String variable making it synchronized wasn’t a great decision and Java designer realized their mistake and corrected it in Java 1.5 by introducing the StringBuilder class.

As I have said that both StringBuffer and StringBuilder are a mutable alternative of String class and you can change the content without creating additional objects. With String example program in java

Here are some more key differences between StringBuilder and StringBuffer in Java:

1) StringBuffer is present in Java and StringBuilder was added in Java 5.

2) Both StringBuffer and StringBuilder represents mutable String which means you can add/remove characters, substring without creating new objects.

3) You can convert a StringBuffer into String by calling toString() method.

4) Both StringBuilder and StringBuffer doesn’t override equals() and hashCode() method because they are mutable and not intended to be used as a key in hash-based collection classes e.g. HashMap, Hashtable, and HashSet.

5) StringBuffer is synchronized which means all method which modifies the internal data of StringBuffer is synchronized e.g. append(), insert() and delete(). On the contrary, StringBuilder is not synchronized.

6) Because of synchronization StringBuffer is considered thread safe e.g. multiple threads can call its method without compromising internal data structure but StringBuilder is not synchronized hence not thread safe.

7) Another side effect of synchronization is speed. Since StringBuffer is synchronized its lot slower than StringBuilder.

8) The default length of StringBuffer is 16 characters. You should explicitly define the size of it, especially if you know that size would be less or more than 16 to avoid wasting memory and spending time during resize.

9) In general, you should always use StringBuilder for String concatenation and creating dynamic String unless and until you are absolutely sure that you need StringBuffer.

10) The string concatenation done using + (plus) operator internally uses StringBuffer or StringBuilder depending upon which Java version you are using. For example, if you are running in Java 5 or higher than StringBuilder will be used and for the lower version, StringBuffer will be used.

**Related blog:**

[Spring boot interview questions](http://candidjava.com/tutorial/spring-boot-interview-questions/)
LSTMのための正規化例（sklearn.preprocessing.MinMaxScaler)

## 概要
LSTMのためのデータ正規化の例。
sklearn.preprocessing.MinMaxScaler
**環境**
 - Google Colaboratory
 - Keras
**参考**
- https://machinelearningmastery.com/how-to-scale-data-for-long-short-term-memory-networks-in-python/


### MinMaxScalerインポート、データ定義

```python

from pandas import Series
from sklearn.preprocessing import MinMaxScaler

## define contrived series
data = [10.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 80.0, 90.0, 100.0]
series = Series(data)
print(series)

# 0     10.0
# 1     20.0
# 2     30.0
# 3     40.0
# 4     50.0
# 5     60.0
# 6     70.0
# 7     80.0
# 8     90.0
# 9    100.0
# dtype: float64
```


### 正規化の定義 : fit 
```py

## prepare data for normalization
values = series.values
values = values.reshape((len(values), 1))

## train the normalization
scaler = MinMaxScaler(feature_range=(0, 1))
scaler = scaler.fit(values)
print('Min: %f, Max: %f' % (scaler.data_min_, scaler.data_max_))

# Min: 10.000000, Max: 100.000000
```

### データセットの正規化 : transform
データを0から１の間に変換する

```py
## normalize the dataset and print
normalized = scaler.transform(values)
print(normalized)

# [[0.        ]
#  [0.11111111]
#  [0.22222222]
#  [0.33333333]
#  [0.44444444]
#  [0.55555556]
#  [0.66666667]
#  [0.77777778]
#  [0.88888889]
#  [1.        ]]
```
### 正規化したデータセットをもとに戻す：inverse_transform
```python
## inverse transform and print
inversed = scaler.inverse_transform(normalized)
print(inversed)
# [[ 10.]
#  [ 20.]
#  [ 30.]
#  [ 40.]
#  [ 50.]
#  [ 60.]
#  [ 70.]
#  [ 80.]
#  [ 90.]
#  [100.]]

```
各言語の公式ドキュメントに見る、参照渡しはありません

# 各言語の公式ドキュメントに見る、参照渡しはありません

Java や ECMAScript も探してみたんですが、残念ながら見つかりませんでした. まあ、値渡ししか無いんですが.

## Go 言語

[When are function parameters passed by value?](https://golang.org/doc/faq#pass_by_value)

> everything in Go is passed by value.

はっきりとすべて値渡しだと言っています.

## Ruby

[Official Ruby FAQ](https://www.ruby-lang.org/en/documentation/faq/4/)

> There is no equivalent of other language’s pass-by-reference semantics.


はっきりと他の言語の参照渡しと同等のものはないと書かれています.

## Python

[How do I write a function with output parameters (call by reference)?](https://docs.python.org/3/faq/programming.html#how-do-i-write-a-function-with-output-parameters-call-by-reference)

> no call-by-reference per se.

はっきりと参照渡しはないと言っています.
Magic Leap MagicScript Landscape Application. TryOpenApplication

**Prepare**
Magic Leap One
https://www.magicleap.com/magic-leap-one

mlsdk v.0.20.0
https://creator.magicleap.com/downloads/lumin-sdk/overview

magic-script-cli v2.0.1
https://www.npmjs.com/package/magic-script-cli

magic-script-polyfills v2.1.1
https://www.npmjs.com/package/magic-script-polyfills


**Create Project**

```
magic-script init my-open org.magicscript.open "Open App"
cd my-open
```

**Code**

Change app.js

```javascript
import { LandscapeApp
       , ui
       , TryOpenApplication } from 'lumin';
const { UiLinearLayout, UiButton, Alignment} = ui;

export class App extends LandscapeApp {
  onAppStart () {
    const prism = this.requestNewPrism([0.5, 0.5, 0.5]);
    const layout = UiLinearLayout.Create(prism);
    const ms_button = 
          UiButton.Create(prism, 'Magic Script', 0, 0.1);
    const s_button = 
          UiButton.Create(prism, 'Social', 0, 0.1);

    layout.setAlignment(Alignment.CENTER_CENTER);
    ms_button.onActivateSub(function (uiEventData) {
        TryOpenApplication("https://www.magicscript.org");
    });
    s_button.onActivateSub(function (uiEventData) {
        TryOpenApplication("social://");
    });
    layout.addItem(ms_button
      , [0.01, 0.01, 0.01, 0.01]
      , Alignment.TOP_CENTER);
    layout.addItem(s_button
      , [0.01, 0.01, 0.01, 0.01]
      , Alignment.BOTTOM_CENTER);
    prism.getRootNode().addChild(layout);
  }
}
```

**Build**

```
magic-script build -i
```

**Run**

```
magic-script run --port=10000
```

**Reference**
TryOpenApplication (MagicScript API)
https://docs.magicscript.org/lumin.html#.TryOpenApplication

magicscript
https://www.magicscript.org/

Thanks!
Brew taplocal作った/ homebrew拡張コマンドの作り方


Homebrewのコマンドは、ユーザーが勝手に拡張することができます。
その機能を使って[Cj-bc/brew-taplocal](https://github.com/Cj-bc/brew-taplocal)を作ってみました。


# 拡張コマンドの作り方

[本家のURL](https://docs.brew.sh/External-Commands)を参照するとわかりやすいですが一応書いておきます。
(ほぼただの和訳です)

## 拡張コマンドとは

gitのそれと同様なもので、

```bash:brew.shから引用したコード
$ brew mycommand --option1 --option3 <formula>
```

といった自作コマンドが使えるようになります。

## 拡張コマンドの種類

拡張コマンドの作り方は二種類あり、それぞれ微妙に異なる部分があります。
それぞれ共通の事項としては
- 実行可能(-x)であり
- `PATH`内のどこかに置かれている
ことが挙げられます。

### Ruby製のコマンド

`extcmd`と言うコマンドをrubyで書きたい場合、`brew-extcmd.rb`というファイル名にしてください。

コマンドは、絶対パスで`require`されることで実行されます。そのため、`homebrew`の"環境(environment)"への完全なアクセス権限があります
i.e. 内部コマンドが使用する全てのグローバル変数やモジュール
`homebrew`の内部コマンドを使用しないように気をつけてください。警告なしに変更される可能性があります。

必要があれば、ステータスコード付きの`Kernel.ext`を使うことができます。そうしなかった場合、`homebrew`が0を返します。


### そのほかのコマンド

`extcmd`というコマンドを書きたい場合、`brew-extcmd`というファイル名にしてください。
適切なシェバング(`#!`)ならなんでも使えます。bashは勿論のこと、ruby、python等でも書くことができます。
Ruby製のコマンド(上記)と違い、ファイル名に拡張子を持つことはできません。
このコマンドは`exec`で実行され、いくつかのHomebrewに関連した環境変数が設定された状態で、さらにコマンドライン引数をそのまま与えられます。

| 環境変数 | 説明 |
|:-:|:-:|
| `HOMEBREW_CACHE ` | homebrewがtarballをダウンロードする場所。デフォルト: `~/Library/Caches/Homebrew` |
| `HOMEBREW_CELLAR` | ソフトが格納されているCellarの場所。ディレクトリが存在すれば`HOMEBREW_PREFIX/Cellar`、なければ`HOMEBREW_REPOSITORY/Cellar` |
| `HOMEBREW_LIBRARY_PATH` | homebrew自身のコードがある場所 |
| `HOMEBREW_PREFIX` | homebrewがソフトウェアをインストールする場所。大抵homebrewの実行可能ファイルの二つ上のディレクトリ。デフォルト: `/usr/local` |
| `HOMEBREW_REPOSITORY` | Git cloneからインストールされている場合、そのレポジトリのディレクトリ(i.e. where Homebrew’s .git directory lives). |

## `--help`オプション

`--help`オプションはhomebrew側で処理されます。
ruby・そのほかの言語どちらでも、`#:`で始まる行がhelpとして出力されます。
例として[brew-services.rbのヘッダー](https://github.com/Homebrew/homebrew-services/blob/a58a1fe9145de4e50e1cbfb5b0e8a30087826393/cmd/brew-services.rb#L1-L23)が挙げられています。


**これだけです**
めっちゃ簡単


# brew taplocal

`brew taplocal`は**主にはhomebrew formula作成者向けのサブコマンドです**。

## 作成動機

homebrew formulaを作る時、一々リモートにpushしてbrew upgradeするのは面倒なので、ほかのTapと同じディレクトリ(/usr/local/Homebrew/Library/Taps/)で開発することがあると思います。
しかしgitレポジトリを`ghq`で管理している場合、レポジトリの場所がバラバラになるのは嫌だ。
ということで、ローカルにあるレポジトリをシンボリックリンクつければいいじゃん!ということで作りました。

## 使い方

```
$ brew taplocal ~/.ghq/github.com/Cj-bc/homebrew-brew-taplocal/
# これは殆ど以下と同様です
#   $ brew tap Cj-bc/brew-taplocal
# 内部でやっていることはほぼ以下と同様です:
#   $ ln /User/THISISME/.ghq/github.com/Cj-bc/homebrew-brew-taplocal /usr/local/Homebrew/Library/Taps/cj-bc/homebrew-brew-taplocal
```

---

いかがでしたk
Rubyのyieldと多重ブロック構文にnextとbreakを使った結果

### ブロックの中にブロックを作ってyieldしてnextしてみる

```ruby:next.rb
hoges = [ "hoge", "hogehoge", "hogehogehoge" ]

count = 0

def updown
  p "up"
  yield
  p "down"
end

hoges.each do |hoge|
  updown do
    count += 1
    if count == 2
      p 123456789
      next
    else
      puts "#{count} : #{hoge}"
    end
  end
end
```

```html:出力結果
"up"
1 : hoge
"down"
"up"
123456789
"down"
"up"
3 : hogehogehoge
"down"
```

### ブロックの中にブロックを作ってyieldしてbreakしてみる

```ruby:break.rb
hoges = [ "hoge", "hogehoge", "hogehogehoge" ]

count = 0

def updown
  p "up"
  yield
  p "down"
end

hoges.each do |hoge|
  updown do
    count += 1
    if count == 2
      p 123456789
      break
    else
      puts "#{count} : #{hoge}"
    end
  end
end
```

```html:出力結果
"up"
1 : hoge
"down"
"up"
123456789
"up"
3 : hogehogehoge
"down"
```
React子コンポーネントから親の引数付きメソッドを実行する

```親コンポーネント.js
  // 実行したいメソッド
  myMethod(i) {
    console.log(i);
  }

  render() {
    return (
      <View>
        <Child callMethod={(i) => this.myMethod(i) } />
      </View>
    );
  }
```

```子コンポーネント.js
    return (
      <TouchableHighlight onPress={() => {this.props.callMethod(1)}}>
        <View>
          <Text>...</Text>
        </View>
      </TouchableHighlight>
    );
```

```子コンポーネントをクリックした時の結果
1
```

以上
Rails チュートリアル  第12章　学習内容のメモ

#第12章パスワードの再設定
- 本章ではパスワードを忘れてしまった際に、パスワードを再設定するための機能を構築する

#つまづいたところ
- 開発環境ではパスワードの再設定に成功するのに、本番環境ではうまくいかない。
- 再設定用のメールは送信されるが、リンク押下時にホーム画面にリダイレクトし、再設定用の画面が表示されない

#解決策
- アカウントが有効化されていないユーザで再設定処理を行なっており、`password_resets_controller`のバリデーションに引っかかっていた

```app/controllers/password_resets_controller.rb
class PasswordResetsController < ApplicationController
  before_action :valid_user, only: [:edit, :update]
  .
  .
  .
  def edit
  end

  private

    # 正しいユーザーかどうか確認する
    def valid_user
      unless (@user && @user.activated? &&
              @user.authenticated?(:reset, params[:id]))
        redirect_to root_url
      end
    end
end
```

- herokuのコンソールから、`activated`の値を`true`に設定し、解決

#覚えたこと
- `git diff HEAD`→全開のコミットからの差分を表示
- `heroku logs`→herokuのログを確認する（-t リアルタイムで確認する）
ABC - 019 - A&B&C

#AtCoder ABC 019 A&B&C
[AtCoder - 019](https://atcoder.jp/contests/abc019)

今更ながら問題名がないと自分が探しづらいことに気付いたのでこれから問題名を埋めていこう。

**2019/05/17:AとBのコードを修正**

#A - 高橋くんと年齢
 - sortはstreamで共に処理可能とコメントでご指摘いただいたためコード修正
    - sortも同時にできるのか。。。やれること多すぎて理解追っつかないわ。

 - 中央値なのでソートして真ん中

```java
	private void solveA() {
		int[] wk = IntStream.range(0, 3).map(i -> nextInt()).sorted().toArray();

		out.println(wk[1]);
	}
```

old
---

	private void solveA() {

		int[] wk = IntStream.range(0, 3).map(i -> nextInt()).toArray();

		Arrays.sort(wk);

		out.println(wk[1]);
	}

---

#B - 高橋くんと文字列圧縮

 - **2019/05/19追記**：コメント欄に@swordone様のコードあり。そちらの方がシンプル。

 - 同じ文字列がいくつ連続しているのを数えてappend
    - ループ抜けた後cntが0になっている=最後の1文字は最後-1文字とは違う文字なのでカウント
    - ループ抜けた後cntが0ではない=最後は同じ文字なので++

```java
	private void solveB() {
		char[] wk = next().toCharArray();
		StringBuilder builder = new StringBuilder();
		int cnt = 0;
		for (int i = 0; i < wk.length - 1; i++) {
			if (cnt == 0) {
				builder.append(wk[i]);
				cnt++;
			}
			if (wk[i] != wk[i + 1]) {
				builder.append(cnt);
				cnt = 0;
			} else {
				cnt++;
			}
		}
		if (cnt != 0) {
			builder.append(cnt);
		} else {
			builder.append(wk[wk.length - 1]);
			builder.append(1);
		}

		out.println(builder.toString());

	}
```

#C - 高橋くんと魔法の箱：setとlist利用

 - $x入れても2x入れても同じ整数$
    - $x,2x,4x,8x・・・$となる値は1としてカウント
 - setにもlistにも同じ値を入れて、listをベースにループさせてsetから値を取り除いていけば。

```java
	private void solveC() {
		Set<Long> wk = new HashSet<Long>();
		List<Long> base = new ArrayList<Long>();
		int n = nextInt();
		for (int i = 0; i < n; i++) {
			long val = nextLong();
			wk.add(val);
			base.add(val);
		}

		Collections.sort(base);
		long max = base.get(base.size() - 1);
		long res = 0;
		for (Long longVal : base) {
			if (wk.contains(longVal)) {
				wk.remove(longVal);
				res += recursiveC(wk, max, longVal);
			}
			if (wk.size() == 0) {
				break;
			}
		}

		out.println(res);
	}

	private int recursiveC(Set<Long> wk, long max, long current) {
		if (current > max || wk.size() == 0) {
			return 1;
		}

		current <<= 1;
		wk.remove(current);
		return recursiveC(wk, max, current);
	}
```

#C - 高橋くんと魔法の箱：setのみ利用

 - ループでACしたあと、「これ、結局は奇数の個数をかぞえているだけでは？」となったので試してみたらAC
    - $1を2倍している数は2で割っていったら最後は1になる$
    - $奇数を2倍したら必ず偶数$

```java
	private void solveC2() {
		Set<Integer> wk = new HashSet<Integer>();
		int n = nextInt();
		for (int i = 0; i < n; i++) {
			int val = nextInt();
			while ((val & 1) != 1) {
				val /= 2;
			}
			wk.add(val);
		}

		out.println(wk.size());
	}
```