OmniAICreator/Qiita-1.07M huggingface dataset:
bashやfishの起動時設定ファイル整理

bashやzsh, fishの起動時に読み込むaliasや関数を、bashrcなどに定義しておくと思うんですが、だんだん肥大化して管理とか困るな〜という時に。

bashrcに以下を定義する。

```bash
for file in "$(find ~/mybash -name '*.bash')";
do
  source $file; 
done
```
mybash以下にお好きな構成でbashファイル作ればいい感じです。
色々他にもやり方はあるかなと思いますが。

ちなみに僕はfishを使ってるのでこんな感じにしています。

`~/.config/fish/config.fish`に↓を定義。
`~/.config/fish/functions/myfish`にお好きなfishファイル。

```bash
find ~/.config/fish/functions/myfish -name '*.fish' | while read file
  source $file
end
```

ちなみに定義を再読み込みさせる場合は以下実行でok。

```bash
exec $SHELL -l
```

fishの設定してみたい人はこちら↓
[ログインシェルをfishにしてみる](https://qiita.com/bleru/items/047a4e8ea2afb654d9e1)
iOS AdMobのインタースティシャル広告の実装方法

# はじめに
こんにちは :leaves:

![img](https://developers.google.com/admob/images/format-interstitial.svg)
アプリにて全画面表示される、AdMobのインタースティシャル広告の実装について書いて見たいと思います。

`Xcode9.2 Swift4.0.3`

<img src="https://qiita-image-store.s3.amazonaws.com/0/128250/1997d324-3b95-9c6f-b026-2ffdfe1f59b2.gif" width="250">

※実際は画面の切り替えタイミングなどで表示することが決まりのようです
> [インタースティシャル広告の導入における禁止事項](https://support.google.com/admob/answer/6201362?hl=ja)

# 導入について
今回は[CocoaPods](https://cocoapods.org/)を利用しました。

```rb
pod 'Google-Mobile-Ads-SDK'
```

インタースティシャル広告のテストユニットIDは以下になります。

```swift
ca-app-pub-3940256099942544/4411468910
```

# サンプルコード
```MainViewController.swift
import UIKit
import GoogleMobileAds

class MainViewController: UIViewController {

    let interstitialADTestUnitID = "ca-app-pub-3940256099942544/4411468910"
    
    fileprivate var interstitial: GADInterstitial!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.interstitial = GADInterstitial(adUnitID: interstitialADTestUnitID)
        self.interstitial.delegate = self
        self.interstitial.load(GADRequest())
    }
    
    @IBAction func buttonAction(_ sender: Any) {
        if self.interstitial.isReady {
            self.interstitial.present(fromRootViewController: self)
        }
    }
}
```

# デリゲートメソッド
```swift
// GADInterstitialDelegate
self.interstitial.delegate = self
```

```swift
//広告の読み込みが完了した時
func interstitialDidReceiveAd(_ ad: GADInterstitial) {}
//広告の読み込みが失敗した時
func interstitial(_ ad: GADInterstitial, didFailToReceiveAdWithError error: GADRequestError) {}
//広告画面が開いた時
func interstitialWillPresentScreen(_ ad: GADInterstitial) {}
//広告をクリックして開いた画面を閉じる直前
func interstitialWillDismissScreen(_ ad: GADInterstitial) {}
//広告をクリックして開いた画面を閉じる直後
func interstitialDidDismissScreen(_ ad: GADInterstitial) {}
//広告をクリックした時
func interstitialWillLeaveApplication(_ ad: GADInterstitial) {}
```

# 参考にさせていただいた記事
- [Interstitial Ads](https://developers.google.com/admob/ios/interstitial)

見て頂いてありがとうございます。
エラスティックリーダーシップを読んだ

![28443913_1.png](https://qiita-image-store.s3.amazonaws.com/0/23101/5bb86443-6047-fa2a-aecc-f790ad369a46.png)

エラスティックリーダーシップを読んだので読書メモ。

## チームリーダーマニュフェスト

### エラスティックリーダーシップって？
まず、チームの状態には「サバイバルフェーズ」、「学習フェーズ」、「自己組織化フェーズ」という3つの状態（後述）が存在する。エラスティックリーダーシップとは、この3つの状態に合わせて柔軟にリーダーシップスタイルを変化させるアプローチのこと。ある特定のリーダーシップスタイルを押し付けてはいけない。
※「エラスティック」には「伸縮自在の」という意味がある。

### エラスティックリーダーシップで目指すところ
チーム内のスキルを「自己組織化フェーズ」まで継続的に成長させることを目指す。幸せなチームは顧客と雇用主の両方を幸せにする。そのためには、以下を追求する必要がある。

* 全員が安全地帯にとどまるのではなく、自分自身とチームがより良くなるために挑戦していく
* 特定のリーダーシップスタイルを押し付けるのではなく、必要に応じてリーダーシップスタイルを変化させる
* マシンとばかり向き合うのではなく、人とのやりとりに参加する

## チームが持つ3のフェーズとそれぞれに合わせたリーダーシップスタイル

前述した通り、チームは「サバイバルフェーズ」、「学習フェーズ」、「自己組織化フェーズ」という3つの状態を持っており、それぞれの状態に応じてリーダーシップスタイルを柔軟に変化させる必要がある。

### サバイバルフェーズとリーダーシップスタイル
サバイバルフェーズとは、チームにゆとり時間がなくスケジュール遅延、常に残業して火消しをしている状態。一部の人は、本来は壊れていてはいけないはずの何かを直すことに居心地の良さを感じてしまっている。中毒症状に陥ると、今している火消しが自分達を楽にし、現状を切り抜ける唯一の手だと自分自身を納得させてしまう。

この状態で必要なリーダーシップスタイルは「指揮統制」スタイルである（所謂トップダウンというやつだろうか）。メンバーが参加する会議は避け、リーダー自らが判断し、メンバーに指示するスタイルで、メンバーの時間を作り出し早くサバイバルフェーズを抜けることを目的とする。また、チーム内の問題もリーダー自ら解決に動く。とにかく、メンバー管理をしっかり行い時には他のチームから自分のチームを守る等、このフェーズを抜けることを一番の目的として指揮統制を行うことが重要。

### 学習フェーズとリーダーシップスタイル
サバイバルフェーズを抜けると学習フェーズに入る。学習フェーズとは、チームがゆとり時間を持ち、それを新しいスキルの習得時間に充てている状態のこと（学習しながら業務をこなせている状態）。

この状態で必要なリーダーシップスタイルは「コーチ・メンター」スタイルである。チームを谷に飛び込ませ（例えば、新しいスキル習得のために宿題・課題を課す等）、チームメンバーが自分達で問題を解決できるように教え挑戦させることで、自己組織化フェーズへ近づけることを目的とする。このスタイルでは、メンバーの失敗を責めたり、過剰なプレッシャーを与えてはいけない。常に暖かく見守り、いつでもフォローできる状態にしておく。

### 自己組織化フェーズとリーダーシップスタイル
チームにスキルがあり（もしくはチーム自身でスキルを獲得する方法を知っていて）、また、メンバーそれぞれが問題を自分達で解決できるスキルがあり、自分達で意思決定ができている状態が自己組織化フェーズ。

この状態で必要なリーダーシップスタイルは「ファシリテーター」スタイルである。リーダーはファシリテーターとなってその状態を維持する必要がある。また、リーダーはチームの生産性には関与せず、チームの運営はチーム自身に任せながら、目的を達成するためにメンバーやチームに働きかけをする支援者ともなる。その分リーダー自身の時間が空いてくるので、その時間を使って実験をしたり、チームを発展させるためのアプローチを試したり、制約やチームの目標を探ったりできる。

冒頭の「エラスティックリーダーシップで目指すところ」でも述べた通り、チームリーダーはチーム内のスキルを本フェーズまで継続的に成長させることを目指す必要がある。

## 影響パターン
誰かの主要な振る舞いを変えたい場合、変化にまつわる6つの影響力を軸に考える。

|分類|影響力|
|---|---|
|個人|1. 個人レベルの能力<br>2. 個人レベルのモチベーション|
|社会|3. 社会レベルの能力<br>4. 社会レベルのモチベーション|
|環境|5. 環境レベルの能力<Br>6. 環境レベルのモチベーション|

それぞれの影響力の説明は以下の通り。

|影響力|説明|
|---|---|
|1. 個人レベルの能力|メンバーは必要なことを実行するための全てのスキルと知識を持っているか|
|2. 個人レベルのモチベーション|メンバーは正しい行動に満足を覚え、間違った行動を嫌うか。正しい行動をとるのが困難な時でも、それを行う自制を持っているか|
|3. 社会レベルの能力|とりわけ危機的な時、あなたや別の誰かによって、必要な支援、情報、リソースが提供されるか|
|4. 社会レベルのモチベーション|周囲の人々は正しい行動を積極的に促し、間違った行動を抑止しているか。あなたや他の人々は、効果的な方法で正しい行動の模範となっているか|
|5. 環境レベルの能力|環境（建物や予算等）には、正しい行動を便利にしたり手軽にしたり、安全にする側面があるか。道から外れないための手がかりや注意はあるか|
|6. 環境レベルのモチベーション|あなたや別の誰かが正しい方法で行動した時、明解で有意義な報酬（給与、手当、インセンティブ等）があるか。短期的な報酬は、起こしたいあるいは避けたいとあなたが望んでいる長期的な結果や行動に合っているか|

上記をチェックリストとして1つ1つ確認しながら、どの影響力に問題があるかを特定し行動を変える必要がある。

## 個人的にいいなと思ったワード
以下引用。

>* 幸せなチームは顧客と雇用主の両方を幸せにする。
>* 偉大なチームは成長によって作られる。雇うことで作られるものではない。
>* リスクをとる勇気がない者は、人生において何も達成することができない。
>* バス因子に対処する。
>* 問題を自力で解決できるよう教え挑戦させることで、自己組織化チームへ育てる。
>* マネジメントは厳しい仕事だ、だからこそ報酬も高い。
>* お前は向いていないんじゃない、やってないだけだ。
>* 谷は最終的には終わって、あなたは新しい知識ともに飛躍することになる。
>* 楽な方とリスクのある方だったら、リスクのある方を選ぶ。

## 最後に
リーダーシップについて語っている本は多数あるが、どれも一般ビジネス書籍としての本であることが多い。それに比べこの本は我々システム開発者に焦点を当てた本であるため、ここには書ききれなかった目から鱗ポイントが他にも多々あった。また、第Ⅴ部以降は寄稿を依頼した方々によるエッセイとなっていて、そちらにもかなり有用なことが書いてあった。興味のある人はぜひ手に取って読んでもらいたい。
ExpoアプリにReact Native Debuggerをセットアップする方法 [Mac OS用]

[2019年3月20日にアップデート]
フルフルの英語記事は[こちら](https://medium.com/@tetsuyahasegawa/how-to-integrate-react-native-debugger-to-your-expo-react-native-project-db1d631fad02)

ExpoのアプリでReduxデバッグをしたい時にはReact Native Debuggerがオススメです。React Native DebuggerならChrome Devtools, React Devtools, Redux Devtoolsの三種の神器が一つの画面に集約できます。

<img width="1384" alt="Screen Shot 2019-03-20 at 10.15.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/188054/9d77df6c-c894-ee4f-12a8-5f27134a5fa6.png">

##1. React Native Debuggerをインストールする。
```
brew update && brew cask install react-native-debugger
```
##2. React Native Debuggerを開く
```
open ‘rndebugger://set-debugger-loc?host=localhost&port=19001’
```
(デフォルトのportは8081ですが、Expoは19001を使っています。)
##3. Expoアプリをスタートし、デバッグモードをonにする
```
npm start
```
Expo Clientでアプリを開き、フリフリして、Debug Remote JSを選択。
これで、Chrome Devtoolsは繋がっているはずです。

##4. React Devtoolsのセットアップ
Docsによれば、実機でアプリを確認する際は、今一歩セットアップが必要な場合があるようです。
<img width="889" alt="Screen Shot 2019-03-20 at 9.42.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/188054/a80bc40b-e68b-eebb-6699-2a26fc975740.png">

setupDevtools.jsのファイルをnode_modules/react-native/Libraries/Core/Devtools/setupDevtools.jsから開き、connectToDevToolsにパスするobjectのprop、"host"に自分のlocal IPを入れます。
![1_HPw_QhsAAEgZOr7iMZxkAw.png](https://qiita-image-store.s3.amazonaws.com/0/188054/8f47a792-01b3-1740-31b1-74cfa7cea877.png)
Local IPはこの[サイト](https://www.whatismyip.com/)でチェックできます。

##5. Redux Devtoolsのセットアップ
window.REDUX_DEVTOOLS_EXTENSIONはデフォルトで与えられているので、Webの時と同様です。
<img width="842" alt="Screen Shot 2019-03-20 at 10.12.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/188054/7a7df429-9067-48e0-06ec-62a066d272d8.png">

ただし、古いバージョンではデフォルトで与えられていませんでした。その際は、[redux-devtools-extension](https://www.npmjs.com/package/redux-devtools-extension)をnpm iし、以下のようにする。
<img width="659" alt="Screen Shot 2019-03-20 at 10.32.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/188054/fe86c62c-e04b-66a2-559a-f4bb46e6452e.png">


以上で、セットアップ完了です。

P.S.ネットワークリクエストを見る際は、React DevtoolsとRedux Devtools辺りで、右クリックし、Enable Network Inspectを押してください。
<img width="1008" alt="Screen Shot 2019-03-20 at 10.55.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/188054/4c850daf-2d54-ccf3-e479-3898bdcb847f.png">
Python3でNEMのAPIを叩く-002-NISが稼動しているかどうかを判断する

#はじめに
[前回](https://qiita.com/oden_umai/items/df6dd02b2b6f2711ccd7)にNEM APIを叩くとき、NISへアクセスすると書きました。
つまり、NISが生きていないとアクセス出来ず、APIが叩けないわけです。
そこで、NISが稼動しているかどうかを判断するAPIを叩こうと思います。

#使うAPI
/heartbeat を使用します。ノードが起動して応答性がある場合に情報を提供します。
/status を使うと詳細な情報が得られますが次回に紹介します。

↓APIの解説は本家の書き方のほうが見やすいような・・・。
>![スクリーンショット 2018-03-10 20.49.38.png](https://qiita-image-store.s3.amazonaws.com/0/242994/d67b95c9-be33-7d68-3869-9fc5fe4d8c10.png)
>(解説：和訳)https://www.pr1sm.com/crypto-coin/nem-nis-api-documentation-in-japanese/#heart-beat-request

>![スクリーンショット 2018-03-10 19.34.04.png](https://qiita-image-store.s3.amazonaws.com/0/242994/633b2b35-296e-8830-26da-4d043b281fde.png)
>(解説：本家)https://nemproject.github.io/#heart-beat-request

#サンプル
##コード
実行環境が無い方はpaizaで試せます。
https://paiza.io/ja

```python:Python3

import requests
import json

r = requests.get('http://<サーバー名 or IPアドレス>:7890/heartbeat').json()

print(r)
```
##結果の例
```json:json
{"code":1,"type":2,"message":"ok"}
```

##解説
前回の記事では、結果がJSON形式で返ってくると書きました。
JSONとはある記載ルールに則ったデータ形式です。
記載ルールが決まっているため、取り出し方も決まっています。
結果の{"code":1,"type":2,"message":"ok"}であれば、
・codeに1という数字が入っているよ
・typeに2という数字が入っているよ
・messageにOKという文字が入っているよ
という意味になります。

この結果をPython3で扱いたいときは、例えばcodeの値だけ取り出したいときは、以下のように書きます。

```python:Python3
import requests
import json

r = requests.get('http://<サーバー名 or IPアドレス>:7890/heartbeat').json()

print(r['code'])
```
ソースコードを個別に解説してきます。
HTTP GETリクエストとjsonを使う場合は必須です。

```python
import requests
import json
```
HTTP GETリクエストでNEM APIを叩いて、結果をJSON形式で取得します。

```python
r = requests.get('http://<サーバー名 or IPアドレス>:7890/heartbeat').json()
```
codeの値を出力します。NISが生きていれば、1が表示されます。

```python
print(r['code'])
```

ここら辺の使い方は以下を参考にしました。
https://qiita.com/sqrtxx/items/49beaa3795925e7de666

#結果の値について
以下に詳細が記述されています。
https://www.pr1sm.com/crypto-coin/nem-nis-api-documentation-in-japanese/#nemRequestResult
##code
1: 成功の結果。典型的な例はノードが新しい有効なトランザクションを検証することです。
つまり、リクエストが成功しました。
##type
2：結果はheartbeatの結果です。
つまり、heartbeatリクエストに対する答えが返ってきたということです。
##message
記載がありませんが、OKということは「NISが生きてるよ！」ということなんだと思います。

#次回
[Python3でNEMのAPIを叩く-003-NISの状態を詳細に知る
](https://qiita.com/oden_umai/items/67cdef2cee97a84586c9)
Amazon Linuxのローカル環境を作成する

Amazon Linux 2のカーネルを使いDockerを使って開発することは出来ないものかと試してみました。

# VirtualBox で Amazon Linux 2の仮想マシンを作成する

[Amazon Linux 2 を仮想マシンとしてオンプレミスで実行する](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/amazon-linux-2-virtual-machine.html)

上記リンクの手順に沿ってローカル環境を作ってみます。

* **ローカルなのでパスワードとか適当です。**
* VirtualBoxを選んだのは私が使い慣れているからです。（VirtualBox以外のイメージもリンク先にあります）

VM イメージのリンクから先から`virtualbox/amzn2-virtualbox-2017.12.0.20180222-x86_64.xfs.gpt.vdi`をダウンロードします。

`2. cloud-init 設定 ISO を作成します。`とありますが、「自分Windowsだし！!」「 Linux環境よくわからんし！！」

という方のために、Linux環境がありましたので、[最低限の設定を入れたものを作っておきました](https://github.com/horikeso/Amazon-Linux-2-seed.iso-for-local)ので面倒な方やローカル環境でしか使わないよ、という方はこちらを使ってみてはいかがでしょうか。

seed.isoは以下の設定で作りました。

```:meta-data
local-hostname: amazonlinux.onprem
```

```:user-data
#cloud-config
# vim:syntax=yaml
users:
# A user by the name ec2-user is created in the image by default.
  - default

chpasswd:
  list: |
    ec2-user:local
# In the above line, do not add any spaces after 'ec2-user:'.
```





# VirtualBoxの設定

## 新規作成でダウンロードしてきたイメージを設定する

![1.png](https://qiita-image-store.s3.amazonaws.com/0/156195/a71714c4-a9d0-6b88-5c04-8ab5b5151ccb.png)

## 作成した仮想マシンにseed.isoを設定する

![2.png](https://qiita-image-store.s3.amazonaws.com/0/156195/f141f75f-b6c0-8fb6-ec67-8aecd34d0f32.png)

## SSH接続用に`VirtualBox Host-Only Network`を作成する

私の場合は以下のようにつくりました。（ipconfig /allで重複が出ないIPにすること。重複すると固定IPに出来なかった。）

![3.png](https://qiita-image-store.s3.amazonaws.com/0/156195/5b8a0377-759c-fc36-87f7-48959e3a1dc3.png)

## 作成した`VirtualBox Host-Only Network`をネットワークのアダプター2に設定する

![5.png](https://qiita-image-store.s3.amazonaws.com/0/156195/c9bbaa52-015f-d06d-38f9-62c4d5e85c18.png)

# 仮想マシン内の設定

## 仮想マシンを起動してログインする

```
user: ec2-user
pass: local
```

## rootになる

```
$ sudo su
```

## 日本語キーボードにする

```
# localectl set-keymap jp106
```

# パスワードでのSSH接続を許可する

```
# vi /etc/ssh/sshd_config
```

```diff:/etc/ssh/sshd_config
- PasswordAuthentication no
+ PasswordAuthentication yes
```

# eth1の設定を作成する

今回作成した`VirtualBox Host-Only Network`の設定を参考に設定ファイルを作成する。

```
# vi /etc/sysconfig/network-scripts/ifcfg-eth1
```

```:/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.56.100
NETMASK=255.255.255.0
NETWORK=192.168.56.1
```

# 再起動を行う

```
# reboot
```


# PuTTYでSSH接続を行う

```
IPアドレス
192.168.56.100

ポート
22

ユーザー
ec2-user

パスワード
local
```

![6.png](https://qiita-image-store.s3.amazonaws.com/0/156195/b373e5a0-fa4b-eb80-ba90-ec7ca6d2e05a.png)

## rootになる

```
$ sudo su
```

# ロケール設定

```
# localedef -f UTF-8 -i ja_JP ja_JP.utf8
# sed -i -e 's/.*/LANG=ja_JP.utf8/' /etc/locale.conf
# mv /etc/localtime /etc/localtime.origin
# cp -f /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

# 終わり

```
# uname -r
4.9.81-44.57.amzn2.x86_64
```

以降は
共有フォルダを作成して、
ホストからゲストにマウントして、
それをdockerにマウントしたりして、
開発環境の出来上がりです。

※dockerのインストールはyumでは出来ないようなのでamazon-linux-extrasを使います。
カジュアルに「NP困難」使ってみたい

いままでちゃんと使えてなかったのでメモ。

ムツカシそうな問題に対して、それっぽい発言したいときには「こいつぁNP困難っぽいや」って言っておけば大丈夫なはず。

- Wikipediaの[NP困難](https://ja.wikipedia.org/wiki/NP%E5%9B%B0%E9%9B%A3)の記述によると「NPに属する任意の問題と比べて、少なくとも同等以上に難しい」
- 停止問題やNPではないムツカシそうな問題（巡回セールスマン問題などのyes/noの判定問題ではないもの）に対しても「NP困難」は使えるらしい

## 誤用になりやすそうな用例など

- 「こいつぁNPっぽいや」
    - Wikipediaの[P](https://ja.wikipedia.org/wiki/P_(%E8%A8%88%E7%AE%97%E8%A4%87%E9%9B%91%E6%80%A7%E7%90%86%E8%AB%96))の記述では「PがNPに含まれることは自明である」らしいので、何も主張していないのに近くなってしまう
- 「こいつぁNP完全っぽいや」
    - 巡回セールスマン問題などのyes/noで答えられる判定問題ではないものが話題のときに使ってしまうとコイツ分かってねぇ系の烙印押されてしまうこわい

## その他の活用シーン

「あれ？これってむずかしそう...」って思ったとき、「NP困難」をつけてググると何がどうむずかしいのかのヒント探せそう

- [k匿名 np困難](https://www.google.co.jp/search?q=k%E5%8C%BF%E5%90%8D+np%E5%9B%B0%E9%9B%A3%90%8D)
Windows10 で RoR の環境構築した

ふと思い立って RoR の環境構築した。ハマったところのメモ。
終わってから思い出して書いてるので、細かい漏れがあるかも。

# 環境

* Windows 10 Pro
* 64 bit
* ターミナル：cmder から bash を起動
* ruby: 2.4.3
* rails: 5.1.5

# 手順

特別なことはなし。

1. 公式サイトから Ruby を DL する（RubyInstaller2 を使用）
2. gem で RoR をインストールする
3. RoR を起動する（目標達成）

# gem install rails が通らなかった

```
make: *** `websocket_mask.o' に必要なターゲット `ruby.h' を make するルールがありません.  中止.
```

こんな感じのエラーが出た。```gem install websocket```しても解決せず。

## 調査手順

ググった解決策を一通り試してもだめだったので、最初からやり直した。

## 解決

RubyInstaller2 を再度起動し、インストールをやり直すことで解決した。
正確に言うと、セットアップウィザードが終わった次の手順である MSYS2 のインストールからの諸々をやり直した。

推測だが、関連パッケージをきちんと DL できてなかったと思われる。

# rails s でエラーが出た

```can not load such file — sqlite3/sqlite3_native (LoadError)```

こんな感じのエラーが出た。```gem install sqlite3```しても解決せず。

## 調査手順

エラー文の中にフォルダ検索を失敗してる感じがあり、よく見たら 2.5.0 フォルダが存在していなかった。（使っていた Ruby が ver. 2.5.0）

```
\vendor\bundle\gems\sqlite3-1.3.13-x64-mingw32\lib\sqlite3\2.5.0
```

2.4.0 フォルダまでは存在していたため、原因として Ruby のバージョンを疑った。

## 解決

Ruby 2.4.3 を DL し、rails や bundle も合わせて入れ直した。
最後にターミナルを再起動することで、rails を起動できるようになった。
HEW2018 モダンなWebサービスの作成（入門編）

# 自己紹介

じゅんじゅんと言うニックネームで、関西を拠点に活動しているフロントエンドエンジニアです。

HAL大阪3回生です。（2018/03/11現在）

イベントや、勉強会に参加してるので是非お会いした際はお声掛けください！

## HEW2018とは

僕の学校（HAL大阪）ではHEW（HAL EVENT WEEK）と呼ばれる成果発表会みたいなコンテストがあります。

そこでは1~3年生までの全学生が日別でそれぞれ自分の制作物を展示したりします。
そこで僕は後輩に向けて、今だとこんな風にアプリケーションを作れるのか。とか今後自分はどんなことを勉強しようか、自分自身はなにに興味あるのか。みたいなことを考えてもらえればと思いつくりました。

## 今回の「モダンなWebサービスの作成」においての技術

- クライアント
    - Babel
    - Webpack
    - Vue
        - vue-router
    - axios
- サーバーサイド
    - Golang
        - gin
        - gin-cache
- データベース
    - Mysql
- インフラ
    - AWS
        - EC2 Container Service
        - Relational Database Service
    - Docker
    - CI (CircleCI)

HEWではこれを `クライアント` `サーバーサイド` `インフラ` の3部門に分けて解説していきたいと思います。

なお、3部門とも記事を上げているので聞きにこれなかった人や外部の方はそちらを参照ください。

# 記事一覧

- [クライアント](https://qiita.com/konojunya/items/2a0315e2f2bce236f91a)
- [サーバーサイド](https://qiita.com/konojunya/items/3dee37d1e9f45ccf474c)
- [インフラ](https://qiita.com/konojunya/items/5fa65c219227cdf9a737)

# あとがき

Twitterしています！ぜひフォローください。 [@konojunya](https://twitter.com/konojunya)

ソースコードは [konojunya/HEW2018](https://github.com/konojunya/HEW2018) にあります！
メモリまとめ

まず、キャッシュは、どこに存在しているか
キャッシュのSRAMはL1キャッシュ，L2キャッシュともにCPUに内蔵されている。

CPUの実メモリは、使用中メモリ、キャッシュ、空きメモリがあります。
スワップは、HDDに領域を持たせます。
※スワップは、無くてもいいがOSが落ちる前の緊急時の保険として使用する

- 使用中のメモリが増えると、空きメモリが減る。
- 空きメモリがある限り、基本的にキャッシュはどんどん増加する。
- 空きメモリが無くなれば、使用中のメモリの増加に応じて、キャッシュが減る。
- キャッシュに割り当てられるメモリが無くなると、パフォーマンスは低下する。
- 使用中のメモリが実メモリより大きくなりそうになると、あふれる部分をスワップへ書き出す。

# 基本的なメモリの種類(DRAMなど)のまとめ

## SRAM
Static Random Access Memory
　メモリ内容を保持するために、定期的な再書き込み(リフレッシュ)が不要
DRAMと比較して高価
揮発性
例：キャッシュメモリ

## SDRAM
Synchronous Dynamic Random Access Memory
　DRAMを改良。(システムバスと同期して動作)
さらにDDR,DDR2,DDR3(現在)進化している
揮発性
例：コンピュータの主記憶装置(メインメモリ)

## DRAM
Dynamic Random Access Memory 
コンデンサに電気を蓄えたか否かで1bitを表現する。
再書き込みが必須
揮発性
例：コンピュータの主記憶装置(メインメモリ)

## フラッシュメモリ
flash memory
　書き換え可能であり、電源を切ってもメモリ内容が消えない
不揮発性
例：USBメモリ, SSD

## EEPROM
Electronically Erasable and Programmable Read Only Memory
　1byteごとにデータの書き込み削除を行える。
不揮発性
例：旧型のUSBメモリ(現在はフラッシュメモリが主流)

## EPROM
Erasable Programmable Read Only Memory
　電源を切ってもメモリ内容が保持される。
ただし強い紫外線光を照射することで消去が可能
不揮発性
例：BIOS ROM

参考：
[いまさら聞けないLinuxとメモリの基礎＆vmstatの詳しい使い方](https://qiita.com/kunihirotanaka/items/70d43d48757aea79de2d)
[メモリの種類 | DRAM SDRAM SRAM DDR EPROM フラッシュメモリの違い](http://tooljp.com/jyosho/docs/Type-of-memory/Type-of-memory.html)
UnityプロジェクトをGitHubでバージョン管理する（コマンド編）

# 概要
Unityプロジェクトをバージョン管理（今回はGitHubで、かつコマンド操作）する人向けの記事です。

# 背景
[Leap Motion + Unity 2017.3 + Mac で、3Dお絵かきアプリを開発してみた
](https://qiita.com/hiesiea/items/f7031f91fe0ce0db5bb2)
上記で作成したUnityプロジェクトを、せっかくなのでGitHubで公開しようとした際に、以前仕事でUnityに携わっていた頃のことを思い出しました。
とあるUnityプロジェクトで、バージョン管理ツールとしてGitを使用していたようなのですが（自分は関わっていませんでしたが）、メンバーがやたら苦戦していて、どうやら不要なファイルをPushしてしまっていたようでした。
そのため、わずかな変更でも大量のファイルが変更された扱いになってしまい、Commit時に目視で一生懸命確認していたのがすごく大変そうでした。。
そこで、「Unityプロジェクトをバージョン管理する人向け」に、この記事をついでに書こうと思い立ちました。

# 外部のバージョン管理システムのサポートを有効化
外部のバージョン管理システムのサポートを有効化させるための設定を行います。
プロジェクトを開き、「Edit」 -> 「Project Settings」 -> 「Editor」を選択します。
そして、「Version Control」の「Mode」を「Visible Meta files」に設定します。

<img width="1392" alt="Visible_Meta_Files.png" src="https://qiita-image-store.s3.amazonaws.com/0/93963/e2ef23b2-d3b3-ea17-ba08-33ba7c300b16.png">

# リポジトリの新規作成
以下のように、GitHubでリポジトリを新規作成します。
一例として、「Repository name」は「3DPainting」とします。
ポイントとして、「Add .gitignore」を「Unity」に設定しておきます。
Unityプロジェクトには、バージョン管理が不要なファイルが存在するため、gitignoreを設定しておくことをおすすめします。

<img width="1280" alt="Create_Unity_Repository.png" src="https://qiita-image-store.s3.amazonaws.com/0/93963/b6428e5e-c1b7-7abd-9c2d-5c20121a1f57.png">

# UnityプロジェクトをリポジトリにPush

## Gitリポジトリの新規作成
```
cd [Unityのプロジェクトのパス]
git init
```

## リモートリポジトリとのリンク
```
git remote add origin https://github.com/hiesiea/3DPainting.git
git pull origin master
```

## UnityプロジェクトのCommit&Push
```
git add .
git commit -m "コミットメッセージ"
git push origin master
```

# Unity向けgitignore
Unity向けのgitignoreが下記にあります。
[gitignore/Unity.gitignore at master · github/gitignore](https://github.com/github/gitignore/blob/master/Unity.gitignore)

# 参考URL
[Unity - マニュアル: Unity で外部のバージョン管理システムを使用](https://docs.unity3d.com/jp/530/Manual/ExternalVersionControlSystemSupport.html)
C#で数学パズル - LINQを使って2乗した数値が1-9で構成される数を求める


小町数を使った数学パズルの第4弾です。

## 問題
３桁の数値とその数値を２乗した値の各数字が１から9までのすべての数字で構成されるような３桁の数値をすべて求めるプログラムを作成せよ。

例えば 763*763=582169 となるが、これは、1,2,3,5,6,7,8,9 からなり、4が抜けているからダメ。

## どうやって解くか

これまで、いくつかの小町数に関連するパズルをプログラム(例えば[ここ](https://qiita.com/gushwell/items/be9430a42313f13df8e1)とか[ここ](https://qiita.com/gushwell/items/fd31eb39c9e0b5b56a25))で解いてきましたが、この問題は、100から999までの数を一つずつ調べていけばいいだけなので、プログラム的には一番優しい小町パズルかな。

下一桁が1, 5, 6ならば解ではないという、知識を使えば、さらに速くできるかもしれませんが、そのための判断に時間がかかるし、コードも複雑になります。
たかだた、999回の試行なので、特に工夫することなく素直なコードにしてみました。


## LINQ使わないバージョン

```cs
static void Main(string[] args) {
    for (var n = 100; n < 1000; n++) {
        if (IsKomachi(n))
            Console.WriteLine($"{n}の2乗 = {n * n}");
    }
}

static private bool IsKomachi(int n) {
    char[] array = (n.ToString() + (n * n).ToString()).ToArray();
    Array.Sort(array);
    var s = new string(array); 
    return s == "123456789";
}
```

IsKomachi内の実装はいろいろな方法が考えられますが、ここでは、以下のようなロジックで判断しています。

nとnの２乗を文字列としてつなげ、それを　char[]に変換。
文字コード順にソートして、再度文字列に変換。
"123456789"と一致すれば、1-9の数字で構成されると判断。


## LINQ使ったバージョンも書いてみました。

```cs
class Program {
    static void Main(string[] args) {
        foreach (var n in Enumerable.Range(100, 900).Where(n => IsKomachi(n))) 
            Console.WriteLine($"{n}の2乗 = {n*n}");
    }
    
    static private bool IsKomachi(int n) {
        string s = n.ToString() + (n * n).ToString();
        return "123456789".All(c => s.Contains(c));
    }
}
```

LINQのWhereメソッド、Allメソッドを使っています。

ちなみに、IsKomachiメソッド内に以下のコードがあります。

```csharp
"123456789".All(c => s.Contains(c))
```

この式ですが、1がsに含まれているか、2がに含まれているか、3がに含まれているか、... 9がに含まれているかを調べ、すべてが成り立てば、trueになります。

```csharp
return s.Length == 9 && "123456789".All(c => s.Contains(c));
```

とする必要はありません。999 * 999 = 998001 なので、必ず s.Length <= 9 になりますから、
この式がtrueならば、1-9の数字は一つずつ存在することが保証されます。

無理やり感がありますが、こんなコードでも答えを見つけられます。


```cs
static void Main(string[] args) {
    Enumerable.Range(100, 900)
              .Where(n => {
                    string s = n.ToString() + (n * n).ToString();
                    return "123456789".All(c => s.Contains(c));
              })
              .ToList()
              .ForEach(n => Console.WriteLine("{0}の2乗 = {1}", n, n * n));
}
```        

## 結果

```
567の2乗 = 321489
854の2乗 = 729316
```

---

この記事は、Gushwell's C# Programming Pageで公開したものをに加筆・修正したものです。
cordovaでGPS機能を導入した際に詰まった話

# 前置き
[cordova-plugin-geolocation](https://github.com/apache/cordova-plugin-geolocation)を導入して普通にGPSを利用しようとした際に動作確認で色々うまくいかなかった際のお話です。

# 現象
実際に起きた現象は以下です。

1. Android4.4の実機で位置情報の取得に失敗した
1. Androidエミュレータで位置情報の取得に失敗した

※ iOSでは問題なく確認できました。

# 何が行けなかったか

## 1. Android4.4の実機で取得できない問題

```js:geolocationOptions
{ enableHighAccuracy: true };
```

currentPositionなどの関数の第3引数であるgeolocationOptionsに上記の条件でエラーが出ました。
enableHighAccuracyは使えないみたいで、falseにしたら取得できるようになりました。

## 2. Androidエミュレータで位置情報の取得に失敗した

エミュレータが悪いというより、擬似ロケーションのテストが失敗した話です。

### AndroidManifest.xmlにパーミッションの追加
```xml:AndroidManifest.xml
   <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
```
 cordova-plugin-geolocationにはACCESS_MOCK_LOCATIONは追加されないので、手動で追加が必要です。　

### geolocationOptionsの変更

```js:geolocationOptions
{ enableHighAccuracy: true };
```

エミュレータではenableHighAccuracyはtrueでないといけませんでした。

### エミュレータで擬似ロケーションを有効にする

```
設定 > 開発向けオプション > 擬似ロケーションの有効
```

以上です。
Google Cloud Functions で Post の引数を受け取る

引数のない場合の使い方はこちらです。
[Google Cloud Functions の使い方](https://qiita.com/ekzemplaro/items/2b300104f234094b6578)

```js:index.js
/**
 * HTTP Cloud Function.
 *
 * @param {Object} req Cloud Function request context.
 * @param {Object} res Cloud Function response context.
 */
exports.gcf_post = (req, res) => {
  var str_out = ""
  str_out += "これはテストです。\n"
  str_out += "Good Evening\n"
  str_out += "今晩は\n"
  str_out += "Mar/11/2018 PM 18:02\n"
  const user = req.body['user']
  const password = req.body['password']
  str_out += "user = " + user + "\n"
  str_out += "password = " + password + "\n"
  res.send(str_out)
}
```

![function_apr04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/6bcd1776-f5fe-2ad2-f850-179753c52f38.png)


## デプロイ

```bash
gcloud functions deploy function-nov25 \
--entry-point=gcf_post \
--trigger-http \
--runtime=nodejs22 --gen2 \
--region asia-northeast1
```

## URL の確認

```text
$  gcloud functions describe function-nov25 --region asia-northeast1  | grep url:
url: https://asia-northeast1-project-nov15-2024.cloudfunctions.net/function-nov25
```

## Curl でテスト

```bash:curl_post.sh
URL="https://asia-northeast1-project-nov15-2024.cloudfunctions.net/function-nov25"
curl $URL/gcf_post \
 -H "Authorization: bearer $(gcloud auth print-identity-token)" \
 -d 'user=jiro&password=123456'
```

実行結果

```text
$ ./curl_post.sh 
これはテストです。
Good Evening
今晩は
Mar/11/2018 PM 18:02
user = jiro
password = 123456
```

Httpie でテスト

```bash:httpie_post.sh
URL="https://asia-northeast1-my-project-aug-29-2016.cloudfunctions.net"
http $URL"/gcf_post" \
	"Authorization: bearer $(gcloud auth print-identity-token)" \
	user=jiro password=123456
```

Get の引数の受け取り方はこちら
[Google Cloud Functions で Get の引数を受け取る](https://qiita.com/ekzemplaro/items/ca82066278ad20e8baa1)
Google Cloud Functions で Get の引数を受け取る

引数のない場合の使い方はこちらです。
[Google Cloud Functions の使い方](https://qiita.com/ekzemplaro/items/2b300104f234094b6578)

## フォルダー構造

```text
$ tree 
.
├── index.js
└── package.json
```

```js:index.js
/**
 * HTTP Cloud Function.
 *
 * @param {Object} req Cloud Function request context.
 * @param {Object} res Cloud Function response context.
 */
exports.good_evening = (req, res) => {
  var str_out = ""
  str_out += "これはテストです。\n"
  str_out += "Good Evening\n"
  str_out += "今晩は\n"
  str_out += "Mar/11/2018 PM 17:35\n"
  const user = req.query['user']
  const password = req.query['password']
  str_out += "user = " + user + "\n"
  str_out += "password = " + password + "\n"
  res.send(str_out)
}
```

```js:package.json
{
  "name": "sample-http",
  "version": "0.0.1"
}
```

## デプロイ

```bash
gcloud functions deploy function-apr06 \
--entry-point=good_evening \
--trigger-http \
--runtime=nodejs22 \
--region asia-northeast1
```

## 関数の一覧

```text
$ gcloud functions list
NAME            STATE   TRIGGER       REGION           ENVIRONMENT
function-apr06  ACTIVE  HTTP Trigger  asia-northeast1  2nd gen
```

## URL の確認

```text
$ gcloud functions describe function-apr06 --region asia-northeast1 | grep url:
url: https://asia-northeast1-project-apr06-2024.cloudfunctions.net/function-apr06
```


## Curl でテスト

```bash:curl_get.sh
URL="https://asia-northeast1-project-apr06-2024.cloudfunctions.net/function-apr06"
curl $URL/good_evening?user="jiro"\&password="123456" \
        -H "Authorization: bearer $(gcloud auth print-identity-token)"
```

## 実行結果

```text
$ ./curl_get.sh 
これはテストです。
Good Evening
今晩は
Mar/11/2018 PM 17:35
user = jiro
password = 123456
```

## 関数の削除

```bash
gcloud functions delete function-apr06  --region asia-northeast1
```
ビットコイン株価の乱高下に合わせて音色を奏でるプログラム作ったんだよ

マンを持しての初投稿。
震災から７年目の今日、１４時４６分に黙祷を捧げて自分にも何かできることがあると７回目の自問をしながらQiitaを開くとトレンドに

- [Impostor Syndrome（詐欺師症候群）とQiitaについて](https://qiita.com/acro5piano/items/c4f2835a8e001e8335a8)

という記事があって見るとびっくり超訳すると「馬鹿でも役に立つ、さあ書け」と書いてあったからタイトルのプログラムを投稿します。

#作ろうと思ったきっかけ

先日、坂本龍一プロデュースの「[Is Your Time](http://www.ntticc.or.jp/ja/exhibitions/2017/sakamoto-ryuichi-with-takatani-shiro-installation-music-2-is-your-time/)」っていう音楽×テクノロジーの展示会があって色々と見ていたら思い浮かんだからです。

#ソースコード

```python
#!/usr/bin/env python
#-*- cording: utf-8 -*-

import requests
from bs4 import BeautifulSoup
from time import sleep
import IPython
import numpy as np
import pygame.mixer
import time

data = []

url = "https://cc.minkabu.jp/pair/BTC_JPY"

    # 音楽ファイルの読み込み
def beepSound(doremi):
    pygame.mixer.music.load(doremi)
    pygame.mixer.music.play(1)
    time.sleep(2)
    pygame.mixer.music.stop()

for i in range(10):
    res = requests.get(url)
    res.raise_for_status()
    soup = BeautifulSoup(res.text,"html.parser")


    elems = soup.select("#btc_jpy_top_bid")
    for elem in elems:
        data.append(elem.getText())
    
    #余分な配列の削除
    if len(data) > 2:
        data.pop(0)
    #取得した文字列の処理
    data[-1] = data[-1].replace(",","")
    data[-1] = float(data[-1])
    data[-1] = round(data[-1])
    rhythm = data[-1] - data[0]
    
    # mixerモジュールの初期化
    pygame.mixer.init()
    
    # 株価の高低差によって音階を変更
    if rhythm <= -501:
        beepSound("sound/do.ogg")
    elif rhythm <= -301 and rhythm > -500:
        beepSound("sound/re.ogg")
    elif rhythm <= -101 and rhythm > -300:
        beepSound("sound/mi.ogg")
    elif rhythm <= -1 and rhythm > -100:
        beepSound("sound/fa.ogg")
    elif rhythm >= 0 and rhythm < 100:
        beepSound("sound/so.ogg")
    elif rhythm >= 101 and rhythm < 300:
        beepSound("sound/ra.ogg")
    elif rhythm >= 301 and rhythm < 500:
        beepSound("sound/si.ogg")
    elif rhythm >= 501:
        beepSound("sound/do_h.ogg")
    
    print("現在のビットコイン：",data[-1],"円")
    print(rhythm)
    sleep(1)

```

リファクタリングもクソモネェカラキキナ状態なんですが動くっちゃ動くし動かないっちゃ動かないかもしれません。少なくとも僕のMACBOOKでは動いています。



##音楽再生にはpygameを使用
pygameなんてもう何百年ぶりに聞いたんだくらいなもんだと思ってたんですが使えますね。
pygameが入ってない人は
`pip install pygame`
でpygameをインストールしてください。
SDL.hが見つかりませんというエラーが出る方は
`brew install sdl sdl_image sdl_mixer sdl_ttf portmidi`
を入力してsdlを入れてください。

```python
def beepSound(doremi):
    pygame.mixer.music.load(doremi)
    pygame.mixer.music.play(1)
    time.sleep(2)
    pygame.mixer.music.stop()
```

このコードの
`time.sleep(2)`の2が「なぜ2なんだよ！」って思うかもしれませんが、音階の響きが最も良く聞こえるのが2だったのです。
それ以上でもそれ以下でもございません。

##スクレイピングでは、beautifulsoup4を使用
あ、そういえばスクレイピングを扱っている記事ではネコも杓子も岡崎図書館のことがベターって貼り付けるのが慣習になってた気が、する。
[岡崎市立中央図書館事件](https://ja.wikipedia.org/wiki/岡崎市立中央図書館事件)
スクレイピングするときは気をつけようねってことです。

##で、どんな音鳴るの？
ソの音を中心に株価が下がれば下がるほど低い音が鳴り、株価が上がれば上がるほど高い音がなります。
場合によっちゃいい曲が出来上がります。
**もし作曲に悩んでる方がいたらこのプログラムをヒントにしてくれたら幸甚です。**


# 参考文献

- [フリー音楽素材魔王魂](https://maoudamashii.jokersounds.com)
  - ドレミのogg使用させていだきました。
- [みんなの株価](https://cc.minkabu.jp/pair/BTC_JPY)
  - みんなの株価さんのビットコイン株価を使用させて頂きました。
日本人のための基本的なUbuntuのDockerイメージ

Docker Hubから入手できるUbuntuのDockerイメージは最小なので、せめて日本化（日本語、日本時間）してテキストエディタとテキストビューアが使えるものをベースにしたいと考え、Dockerfileを書いてみたので共有する。

```Dockerfile:Dockerfile
FROM ubuntu
RUN apt-get update && apt-get -y upgrade
RUN apt-get -y install apt-utils perl net-tools wget
RUN apt-get -y install language-pack-ja-base language-pack-ja
RUN locale-gen ja_JP.UTF-8
RUN update-locale LANG=ja_JP.UTF-8
RUN apt-get -y install tzdata
RUN mv /etc/localtime /etc/localtime.org
RUN ln -s /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN echo "cd $HOME" >> /root/.bashrc
RUN echo "source /etc/default/locale" >> /root/.bashrc
RUN echo "export LANG" >> /root/.bashrc
RUN apt-get -y install vim less
```

上記を適当なディレクトリに作成し、Dockerイメージを作成して実行すると、結構日本人としてはホッとする。

```bash
$ mkdir ~/docker/myubuntu
$ cd ~/docker/myubuntu
$ cat > Dockerfile
（ここで上記Dockerfileを貼り付けてから、Ctrl+Dを押下する）
$ docker build -t my/ubuntu .
$ docker run -it my/ubuntu bash
```

## 2018/09/18修正

2018/03/11時点では問題がなかったのに、久しぶりにここに記載したDockerfileでDockerイメージを作成しようとしたら、tzdataのインストール時に地域選択のプロンプトが出てきて先に進まなくなっていた。
これを解決するにはDockerfileを以下のように修正する。

```RUN apt-get -y install tzdata```
　↓
```RUN DEBIAN_FRONTEND=noninteractive apt-get -y install tzdata```
Ruby 勉強

#\#rubyの勉強
最近Rubyを使う仕事が舞い降りてきたので、勉強メモ
###▪️式展開
文字列の中に"式"を入れるために行うもの

```
name = "Cesaro"
puts "私の名前は#{name}です"
```
###▪️elseifの書き方はelsifと書く

###▪️ハッシュ内のkeyの書き方は、「:key_name」でok。「:」をシンボルと呼ぶ。
「:key_name」は「key_name:」に書き換えられる。ただし、取り出す際は、シンボルを用いる必要がある。

###▪️nullはRubyでは「nil」と呼ぶ

###▪️メソッド定義の仕方
```
def method_name
  puts "hello world"
end

method_name -> method実行
```

###▪️真偽値を返すメソッド名末尾に「?」をつける習慣がある

###▪️キーワード引数
複数の引数があるメソッドに対して、引数が何を示しているかわかるようにする書き方。
メソッドを呼び出す際に、ごちゃるので可読性はよくないように思えるがどうなんだろうか。

###▪️なぜクラス内のinisializeメソッドを定義するとインスタンス生成のタイミングでメソッド実行されるのか

###▪️外部ファイルの読み込みは、require "./file_name"と記述する

###▪️gets.chompでコンソール入力待機まち状態になれる（文字列のみ）
###▪️数値を待機状態にしたいときは、gets.chomp.to_iを使用する
###▪️親クラスにあるメソッドと同じ名前のメソッドを子クラスで定義すると、メソッドを上書き可能。これをメソッドの「オーバーライド」と呼ぶ。
###▪️クラスメソッドとインスタンスメソッドの違い
インスタンスメソッドは、インスタンスに対して呼び出すメソッドで、newした上で使う
クラスメソッドは、クラスに対して呼び出すメソッド
gzipなtarファイルを一括に解凍する方法 [R]

#はじめに
とある衛星画像を扱おうとしたらgzipファイルとして圧縮されたtarファイルで一括解凍するために四苦八苦した時の忘備録。

#実行
作業ディレクトリ（Rstudioではプロジェクトが保存されているところがデフォルト）に対象ファイルを入れておくようの"input"というフォルダを作成しておきます。このとき必要なデータは全て入れておきましょう。

```R: 
> list.files("input")
[1] "test.tar.gz"  "test2.tar.gz" "test3.tar.gz"
```

解凍するための関数は'untar'になります。
これを使用して、"input"内にあるファイルをforループにより解凍します。

```R:
#uncompression
files <- list.files("input")

for (file in files) {
  untar(paste0("input/", file))
}
```


ご参考になれば幸いです。
またこの場合、結果が出力されるのが作業ディレクトリになります。うまく出力先を指定できる方法を教えていただければ幸いです。
LocalStackをDockerコンテナ内で使う場合に、S3のバケット名がサブドメインになって接続できなくて困った話（解決済み）

## はじめに
[LocalStack](https://github.com/localstack/localstack)は、AWSの各サービスをローカルで再現するためのフェイク環境です。 
[公式のDockerイメージ](https://hub.docker.com/r/localstack/localstack/)を使うと便利です。

`localstack`は、`AWS Summit Tokyo 2017`での`@twada`の講演で聞いたことがありましたが、今回初めて使いました。

- [Testable Lambda: Working Effectively with Legacy Lambda // Speaker Deck](https://speakerdeck.com/twada/testable-lambda-working-effectively-with-legacy-lambda)
- [Testable Lambda｜AWS Summit Tokyo 2017 - YouTube](https://www.youtube.com/watch?v=C0zNc4bdWhY)

## Dockerコンテナ内でLocalStackを使う
下記のように、Dockerコンテナを構成していたとします。

```yml
# docker-compose.yml
version: '3'
services:
  app:
    build: .
    env_file: .env
    volumes:
      - .:/app
      - ~/.aws:/root/.aws
    working_dir: /app
    links:
      - localstack
  localstack:
    image: localstack/localstack
    ports:
      - '8080:8080'
      - '4572:4572' # For S3
```

`app`コンテナから任意の`Bucket`にアクセスしようとすると、エンドポイントが`http://{Bucket}.localstack:4572/`となり、下記のようにエラーが発生します。

```
Aws\S3\Exception\S3Exception: Error executing "CreateBucket" on "http://{Bucket}.localstack:4572/"; 
AWS HTTP error: cURL error 6: Could not resolve host: {Bucket}.localstack (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)
```

## 解決方法
サブドメイン付きのホストが名前解決できないのが原因ですが、`/etc/hosts`に追記するのは適切ではありません。 
パス形式のURLにすることが最適です。
パス形式にすることで、エンドポイントが`http://localstack:4572/{Bucket}`となります。

[Amazon S3 バケットの使用 - Amazon Simple Storage Service #バケットへのアクセス](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro)

```
パス形式のURLでは、バケット名は (リージョン固有のエンドポイントを使用しない限り) ドメインの一部にはなりません。
例:
- 米国東部 (バージニア北部) リージョンエンドポイント、http://s3.amazonaws.com/bucket
- リージョン固有のエンドポイント、http://s3-aws-region.amazonaws.com/bucket
```

PHPの場合は、`use_path_style_endpoint`を`true`にします。
https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.S3.S3Client.html#___construct

```
use_path_style_endpoint: (bool) Set to true to send requests to an S3 path style endpoint by default. 
Can be enabled or disabled on individual operations by setting '@use_path_style_endpoint\' to true or false. 
Note: you cannot use it together with an accelerate endpoint.
```

## おわりに
`@twada`が講演の中でおっしゃっていますが、LocalStackのようなFake Objectを使うことで、テストのために、依存ライブラリをインストールする必要がなくなり、テストもスッキリしますし、素早く開発が行えます。

今回のように、つまづくポイントがあったら、一つ一つ記事にしていきたいと思います。
ではでは。
safariをvim風キーバインドに変更する「Vimari」と「sVim」のインストールと比較

##追記(2018/9/29)
2018/9/19リリースのsafari 12へのアップデートを持ってvimariもsVimも利用できなくなりました．
セキュリティ対策のため、Appleが検査したアドオン以外は利用できなくなる様です。
~~こんな仕様で誰がsafari使うの？？？何考えてるの？？？~~

## はじめに
Firefoxのvimperator亡き今，我々はブラウザの移行を求められているのだ．

## Safariを選んだ理由
最近は，iPhoneで情報収集する機会が増えたため，連携のし易いブラウザを検討した結果，safariを利用することに．
（バージョン11.0.3）

### メリット
* iPhoneやiPadのメインブラウザとのブックマークとタブの共有が優秀
* iPhoneやiPadとパスワード等の連携が優秀
* （一応，）vimライクなキーバインドのアドオンがある
* （一説によると）バッテリー消費量が少ない
 
### デメリット
* アドオンが貧弱
* Windows機やLinux機との連携が取れない

### why safari?
* アドオンを多用する人間ではない
* win機等との連携が不要
ってことで，これを機にsafariを試してみることにしました！
Safariリリースの時の感動を思い出します！
（昔はIEとネスケの２択でしたよね…）

## インストール方法
基本的にはsafari機能拡張ファイルをダウンロードしてダブルクリックですね！
Chromeやfirefoxに比べて分かりにくい気が…
ググったら適当にヒットしたので，以下のURLからファイルをダウンロードしてインストールしました！
こんな感じにsafariの環境設定に入ってきます！

![スクリーンショット 2018-03-11 16.03.17.png](https://qiita-image-store.s3.amazonaws.com/0/61911/b30ccb9d-807a-4572-7b5b-9358a6df234e.png)


### vimari
[Release Release 1.12 · guyht/vimari · GitHub](https://github.com/guyht/vimari/releases/tag/v1.12)

### svim
[Release 1.0.6 · flipxfx/sVim · GitHub](https://github.com/flipxfx/sVim/releases/tag/1.0.6)

## 使用感と比較検討
どっちもvimperatorに及ばない〜！！！
とは言え，どちらかは使うと決めたので比較します．

### vimariについて
* システム環境設定で分かりやすいカスタマイズ
* サクサク動く（視差効果なし）
* デフォルトだと，ctrl押しっぱなしの左手小指地獄におちる…

### sVimについて
* Svimrcによる自由自在なカスタマイズ
* ヌルヌル動くよ（視差効果）
* ノーマルモードとインサートモードがきっちり分かれてる！

### 結果
vimariを使います！理由は視差効果なしのページ送りです！
Safariって実はデフォルトでページ送りのキーバインドがありますが，
それもヌルヌルスクロールなのです．（ctrl+Aとctrl+E）
それに耐えられなくてアドオン導入なので，
Vimari一択になるんですよね…

### 注意事項
タブの概要（他の端末のタブ）を見るときのショートカットって
⌘+shift+¥なのですが，デフォルトで¥→\に変更している人は，
⌘+⌥+shift+Y　じゃないと使えない呪いにかかってます．
お気をつけて下さい．

### あとがき
sVimの視差効果をオフにする方法を知っている人がいれば，教えてください！
あと，本文内の検索って/でできないんでしょうか…
MAMPに関するメモ


MAMPを利用する際の環境設定メモ。

## インストール

[ここ](https://www.mamp.info/en/downloads/)からダウンロードしてインストール。いつの間にかver4.x。そしてMAMP Cloudとかいうのも出してきてる・・・。

## PATHを通す

PHPとMySQLはMAMPに入っているものを利用します。
.bash_profile等に書きを追加。

```bash
#MySQL
export PATH=/Applications/MAMP/Library/bin:$PATH
#PHP
export PATH=/Applications/MAMP/bin/php/php7.2.1/bin:$PATH
```

なお、PHPのPATHはバージョンに依存するので、上記で7.2.1となっている部分を自分の環境に合わせて変更してください。

## php.iniの位置と設定

MAMPのWebサーバをスタートした際の「スタートページ」でphpinfoを表示させ位置を確認します。
必要なパラメータを変更します。変更した際にはMAMP（というかWebサーバ）の再起動を忘れず。

```bash
/Applications/MAMP/bin/php/php7.2.1/conf/php.ini
```

まあ、とりあえずいじるとすると、

```bash
#-1で制限なし
memory_limit = 256M
#0で制限なし
max_execution_time = 60
display_errors = On
```

あたり。

## my.cnfの位置と設定

/Applications/MAMP/conf/my.cnfに置くのが無難なようですが、標準では存在しません。
なので、/Applications/MAMP/Library/support-files/my-default.cnfをリネームしてコピーします。

```bash
cp /Applications/MAMP/Library/support-files/my-default.cnf /Applications/MAMP/conf/my.cnf
```

設定はこだわればきりがないですが、とりあえず、innodb_buffer_pool_sizeくらいは変えておきます。
まじめに使う際は物理メモリの80%くらいに。。

```bash
innodb_buffer_pool_size = 1G
```

### MySQLのデータファイルの位置

デフォルトのデータディレクトリの位置は下記のもよう。

* MAMP3 /Applications/MAMP/db/mysql
* MAMP4 /Applications/MAMP/db/mysql56
データベースの基礎！リスト同士を四則演算してみる

pythonだとわかりやすいので、pythonで説明します。

```python

A = [1,3,5,7,9,10]
b = [1,2,3,4,5]

```

足したり、引いたり、かけたり、割ったりしてみます。


#リスト同士を足す

リスト同士を足すということは、
Aにしかない要素 + Bにしかない要素 + AにもBにもある要素
みたいな感じ、
逆に難しく言ってしまった気もするけど、、、

この場合、
[1,2,3,4,5,7,9,10]　となります

#リスト同士を引く

リスト同士を引くのは、具体例で、
A-Bとした時、　Aの中から、AとB共通して存在するものを削除したら終わりです
A-Bの場合、
[1,3,5]

#リスト同士をかける

これどうなるんやろうと思ったら、リストの要素数 * リストの要素数になるみたいですね。

この場合、6*5=30
答え、30です

#リスト同士をわる

リストの要素数/リストの要素数になります
A/bにしたら、6/5= 1.2ですね。


はい、こんな感じです。
【Unity】JSONを整形するフォーマットクラス

# はじめに

json-formatterはJSONを整形するフォーマットクラスです。

# json-formatter

## 導入方法

[json-formatter](https://github.com/tomoriaki/json-formatter) (GitHub)からダウンロードして、インポートしてください。

## 使用例

```csharp:使用例
using UnityEngine;
using System;
using System.IO;
using HC.Common;


public class Example : MonoBehaviour
{
    #region イベントメソッド

    private void Start()
    {
        string json = ReadText("JsonFormatter/Demo/example.json");

        json = JsonFormatter.ToMinifyPrint(json);
        Debug.Log("MinifyPrint: " + Environment.NewLine + json);

        json = JsonFormatter.ToPrettyPrint(json, JsonFormatter.IndentType.Space);
        Debug.Log("PrettyPrint: " + Environment.NewLine + json);
    }

    #endregion


    #region メソッド

    /// <summary>
    /// テキストをファイルから読み込む
    /// </summary>
    /// <param name="path">Application.dataPath以降のファイルパス</param>
    /// <returns>読み込んだテキスト</returns>
    public static string ReadText(string path)
    {
        string text = string.Empty;

        try
        {
            using (var streamReader = new StreamReader(Path.Combine(Application.dataPath, path)))
            {
                text = streamReader.ReadToEnd();
                streamReader.Close();
            }
        }
        catch (Exception e)
        {
            Debug.LogAssertion(e.Message);
        }

        return text;
    }

    #endregion
}
```

```json:MinifyPrint
{"characters":[{"id":1,"name":"武闘家","EquipWeaponTypes":["片手剣","両手剣","槍","斧"],"hp":140,"mp":40,"power":80,"intelligence":20,"agility":14.0},{"id":2,"name":"遊び人","EquipWeaponTypes":[],"hp":60,"mp":0,"power":20,"intelligence":80,"agility":8.0}]}
```

```json:PrettyPrint
{
    "characters": [
        {
            "id": 1,
            "name": "武闘家",
            "EquipWeaponTypes": [
                "片手剣",
                "両手剣",
                "槍",
                "斧"
            ],
            "hp": 140,
            "mp": 40,
            "power": 80,
            "intelligence": 20,
            "agility": 14.0
        },
        {
            "id": 2,
            "name": "遊び人",
            "EquipWeaponTypes": [],
            "hp": 60,
            "mp": 0,
            "power": 20,
            "intelligence": 80,
            "agility": 8.0
        }
    ]
}
```

# 配布ライセンス

[MIT](https://github.com/tomoriaki/json-formatter/blob/master/LICENSE)
特殊な状況でのページングメモ

# ページング処理をしたい

フロントエンドの両方の開発で検索結果フィルタリングした結果を表示したいという場面がありました。
やったことは、サーバー側であるAPIをたたいた結果を内部でフィルタリングして、その結果をクライアントに渡すというものでした。また結果が多いときのためにページング処理を行うことになりました。

# 問題

ここで問題がありまして、利用しているAPIにはoffsetの概念があったので、それを指定してあげればページングを実現できそうだと思っていましたが、肝心のoffsetの指定がうまくできるのかという問題に直面しました。
というのも、サーバー側でフィルタリングしているのでフィルタリングではじいているものがある分、続きの検索結果がどこから始まるかが変わってしまうのです。（ページ番号×表示件数で表せない(´;ω;｀)）
いろんな利用者がいることを想定しており、サーバー側で値を保持するわけにもいかないのでクライアントに持ってもらうのがいいということになりました。

# 解決策

しかし、ここでどのように持ってもらうかが重要になるわけですね。
方法としては以下のようなものが考えられます。

- Cookieに保存
- HTMLに必要な情報を埋め込みリンクにクエリを仕込む
- jsで頑張る！

わざわざCookieで持ってもらうとデータ構造が複雑なときに対応できないだろうと思い却下。
HTMLに埋め込むのは一番簡単だなと思いましたがURLのバーにクエリが表示されるのは、パソコンに詳しくない人でも簡単にいじれてしまうため誤操作を招くだろうと却下。
ということでjsで頑張ってみました。

見るのは最新の結果がほとんどなので、ページング処理といっても"次へ"と"戻る"と"最初に戻る"くらいで済むと判断し、offsetの値をスタックで保持しておきます。
苦肉の策でhtmlに次のoffsetを記録しています。（この辺いい方法ありませんかねえ…）
また、jsでAjaxを使えば画面遷移無しで処理できるのでイケてるシステムの出来上がりです。


```html:index.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <h1>Test</h1>

    <div id="result">
        <p>ここに結果を表示</p>
    </div>

    <button id="top">Top</button>
    <button id="prev">PREV</button>
    <button id="next" value="${ここにサーバーからの値が入ります}">NEXT</button>
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script type="text/javascript" src="paging.js"></script>

</html>
```


```js:paging.js
// offset初期化
let offsets = ["0"];
// url設定
const url = "/index";


/**
 * nextボタン押下
 */
$('#next').on('click',() => {
    // query作成
    const query = "?offset="+$("#next").val();
    $.ajax({
        type : "get",
        url: url + query,
        dataType : "html",
    }).done((responseData, status, jqXHR) => {
        // 次のオフセットを保存
        offsets.push($("#next").val());
        $('#result').html(responseData);
    }).fail((responseError, status, errorThrown) => {
    });
});

/**
 * prevボタン押下
 */
$('#prev').on('click',()=>{
    // 前のページのオフセットを読み込み
    const preoffset = offsets[offsets.length-2];
    // query作成
    const query = "?offset="+preoffset;
    $.ajax({
        type : "get",
        url: url + query,
        dataType : "html",
    }).done((responseData, status, jqXHR) => {
        offsets.pop();
        $('#result').html(responseData);
    }).fail((responseError, status, errorThrown) => {
    });
});

/**
 * topボタン押下
 */
$('#top').on('click',() => {
    // オフセットをクリア
    offsets = ["0"];
    $.ajax({
        type : "get",
        url: url,
        dataType : "html",
    }).done((responseData, status, jqXHR) => {
        $('#result').html(responseData);
    }).fail((responseError, status, errorThrown) => {
    });
});
```

# 最後に

続きの検索結果がない場合の処理は省略しました。
皆さんはこんな状況なかなかないかもしれませんが、参考になれば幸いです。
SOLIDの原則ってどんなふうに使うの？に登場するTODOアプリを実装してみた

[SOLIDの原則ってどんなふうに使うの？](https://speakerdeck.com/hidenorigoto/solidfalseyuan-ze-tutedonnahuunishi-ufalse)に登場する「先輩」によるコード修正が入る前で一旦読むことをやめ、自分なりにコードを書いてみました。

以下書きなぐったコードです（雰囲気だけ掴んでもらえると嬉しいです）

```php:todo.php
class App
{
    public function show()
    {
        $allTodo = $this->todoRepository->findAll();
        foreach ($allTodo as $todo) {
            $todo->display();
        }
    }
}

Interface Displayable
{
    public function display();
}

abstract class Todo
{
    public function display()
    {
        echo '--';
        echo $this->getTitle();
        echo $this->getUrl();
    }

    abstract protected function formatStatus();

    abstract protected function formatTitle($statusLabel);

    private function getTitle()
    {
        $statusLabel = $this->formatStatus();
        return $this->formatTitle($statusLabel);

    }
}

class NormalTodo extends Todo implements Displayable
{
    protected function formatStatus()
    {
        $status = $this->getStatus();
        $map = [
            'pending' => '[未着手]',
            'running' => '[作業中]',
            'completed' => '[完了]'
        ];
        return $map[$status];
    }

    protected function formatTitle($statusLabel)
    {
        return sprintf('%s%s', $statusLabel, $this->getTitle());
    }

    protected function getUrl()
    {
        //urlを取得する処理
    }

    private function getStatus()
    {
        //statusを取得する処理
    }

    private function getTitle()
    {
        //titleを取得する処理
    }
}

class GoogleCalenderTodo extends Todo implements Displayable
{
    protected function formatStatus()
    {
        $date = $this->getEndDateTime();
        //googleCalender用のstatusを取得する処理
    }

    protected function formatTitle($statusLabel)
    {
        $title = sprintf('%s%s', $statusLabel, $this->getTitle());
        $title =. sprintf('($s)', $this->getLocation()); //メソッドに切り出す
        return $title;
	}

    protected function getUrl()
    {
        //urlを取得する処理
    }

    private function getTitle()
    {
        //titleを取得する処理
    }

    private function getEndDateTime()
    {
        //完了日時を取得する処理
    }

    private function getLocation()
    {
        //ロケーションを取得する処理
    }
}
```
という感じになりました。

反省点としては、クラスの責務をしっかり考えられなかったことが挙げられます。
「先輩」は表示処理の責務をPresenterクラスに移譲していたのに対し、私は表示処理の責務をTodoクラスに押し込みました。

自分の良くないところが認識できたので、とても良い経験になりました。
後藤さん素晴らしいスライドをありがとうございました。
LocalStackをDockerコンテナ内で使う場合に、SQSのQueueUrlがlocalhostになって困った話（解決済み）

## はじめに
[LocalStack](https://github.com/localstack/localstack)は、AWSの各サービスをローカルで再現するためのフェイク環境です。 
[公式のDockerイメージ](https://hub.docker.com/r/localstack/localstack/)を使うと便利です。

`localstack`は、`AWS Summit Tokyo 2017`での`@twada`の講演で聞いたことがありましたが、今回初めて使いました。

- [Testable Lambda: Working Effectively with Legacy Lambda // Speaker Deck](https://speakerdeck.com/twada/testable-lambda-working-effectively-with-legacy-lambda)
- [Testable Lambda｜AWS Summit Tokyo 2017 - YouTube](https://www.youtube.com/watch?v=C0zNc4bdWhY)

## Dockerコンテナ内でLocalStackを使う
下記のように、Dockerコンテナを構成していたとします。

```yml
# docker-compose.yml
version: '3'
services:
  app:
    build: .
    env_file: .env
    volumes:
      - .:/app
      - ~/.aws:/root/.aws
    working_dir: /app
    links:
      - localstack
  localstack:
    image: localstack/localstack
    ports:
      - '8080:8080'
      - '4576:4576' # For SQS
```

`app`コンテナから任意の`Queue`にメッセージを送信しようとすると、`QueueUrl`が`http://localhost:4576/queue/{QueueName}`となり、下記のようにエラーが発生します。

```
Aws\Sqs\Exception\SqsException: Error executing "SendMessage" on "http://localhost:4576/queue/{QueueName}"; 
AWS HTTP error: cURL error 7: Failed to connect to localhost port 4576: Connection refused (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)
```
`app`コンテナと`localstack`コンテナは、別のIPアドレスになるわけで、`localhost`ではなくホスト名の`localstack`でアクセスしたいのですが、何故か`localhost`の`QueueUrl`を返してきます。
もちろん、`endpoint`は、`http://localstack:4576`を指定しています。

## 解決方法
[README](https://github.com/localstack/localstack#configurations)に解決方法が記載されていました。

```
`HOSTNAME_EXTERNAL`: Name of the host to expose the services externally (defaults to `localhost`). 
This host is used, e.g., when returning queue URLs from the SQS service to the client.
```

要するに、環境変数`HOSTNAME_EXTERNAL`に`localstack`を指定すればいいのです。

```yml
# docker-compose.yml
  localstack:
    image: localstack/localstack
    environment:
      - HOSTNAME_EXTERNAL=localstack
```

無事、`QueueUrl`が`http://localstack:4576/queue/{QueueName}`となり、メッセージを送受信できるようになりました。

## おわりに
`@twada`が講演の中でおっしゃっていますが、`LocalStack`のような`Fake Object`を使うことで、テストのために、依存ライブラリをインストールする必要がなくなり、テストもスッキリしますし、素早く開発が行えます。 

今回のように、つまづくポイントがあったら、一つ一つ記事にしていきたいと思います。
ではでは。
ASP.NETcoreでMySQLを使えるようにするまでに行ったこと 

## 前提条件
- 開発はWindows上で行う
- 実行環境はLinuxサーバーを用いる

## プロジェクトを作成する
### この辺りのサイトを参考にプロジェクトを作成する
- [【C#】ASP.NET CoreでMySQLを利用する（プロジェクト作成編）][link-1]
- [ASP.NET MVC + MySQL で開発環境構築] [link-2]

## Databaseを作成するためのモデルを定義する
```
IDesignTimeDbContextFactoryを実装
DbContextを実装
Table定義を行う
```

## 各コマンド実行
### PowerShellを起動
- 表示→その他のウィンドウ→パッケージマネージャコンソール

### Migration用のコードを現在のモデルから自動生成
- Add-Migrations

### データベースに構成を反映
- Update-Database

### 確認
- MySQL WorkBenchなどからスキーマを確認する

### 作業を行う上で参考にしたサイト
- [【C#】ASP.NET CoreでMySQLを利用する（プロジェクト作成編）][link-1]
- [ASP.NET MVC + MySQL で開発環境構築] [link-2]


[link-1]:http://kawasaki-monster.hatenablog.jp/entry/asp_dot_net_core_use_mysql_1
[link-2]:https://qiita.com/midori44/items/ef7cdd1d37c353e44b5f