OmniAICreator/Qiita-1.07M huggingface dataset:
"failed: port is already allocated"の解決法

#docker-composeを立ち上げ時に、"failed: port is already allocated"とエラーが出た時の解決法
docker-composeを立ち上げた時に、上記のエラーが出る時がある。

##原因
同じポート番号で複数立ち上がっているので、「すでにそのポートは割り当てられているよ」と怒られる。

##解決策
まず調べる。`$lsof -i:ポート番号`
PIDが同じ番号のものが出てきたら、それキルする。`$kill -9 PID`
その後、`docker-compose up`すると立ち上がる。
バッチファイルを用いて、ATOMでAnacondaの仮想環境を開く方法

バッチファイルを用いて、ATOMでAnacondaの仮想環境を開く方法

```open_atom.bat
cd C:\Users\{USERNAME}
set root=C:\Users\{USERNAME}\Anaconda3
call %root%\Scripts\activate.bat %root%
call conda activate default
call atom --new-instance
```
面接官「『オブジェクト指向』について説明してください。」僕「…」

#はじめに
先日面接させていただいた企業の面接官から、タイトルの質問を受けました。構造的に説明することができなかったので、オブジェクト指向についてまとめてみました。

#もしオブジェクトがなかったら
ドラクエのようなRPGで考える。

- 剣士1は、Aボタンで攻撃、Bボタンで守る
- 剣士2は、Aボタンで攻撃、Bボタンで守る
- 剣士3は、Aボタンで攻撃、Bボタンで守る

剣士が3種類程度なら、追加で「Cボタンで魔法を使う」という機能を付け加えても、変更に対応できるかもしれない。しかし、これが1万種類の剣士がいたら、一万行の変更を加えなくてはならない。

この時、あらかじめ「剣士」というモノを作成しておけば、変更に対応しやすくなる。上の例では、あらかじめ「剣士」というモノを作成しておき、Aボタンで攻撃、Bボタンで守るというようにしておく。
そうすれば、

- 剣士1は、「剣士」をコピーして、装備だけ木の棒にする
- 剣士2は、「剣士」をコピーして、装備だけ鋼の剣にする
- 剣士3は、「剣士」をコピーして、装備だけエクスカリバーにする

のようにできる。このようにして置けば、あとで「Cボタンで魔法を使う」という機能を追加する場合でも「剣士」というモノだけ変更すればよくなる。

#オブジェクト指向の基本的4用語
##1. オブジェクト
下で説明するクラス（設計図）をもとに作られた実物がオブジェクト（インスタンス）。例えば、剣士。
##2. クラス
オブジェクトの設計図のようなもの。プロパティ（属性）やメソッド（操作）をまとめたもの。
##3. プロパティ
オブジェクトが持っているデータ。剣士の例だと、HP・MPや装備がプロパティにあたる。
##4. メソッド
オブジェクトが持っている操作。剣士の例だと、攻撃する・守る・魔法を使うなどの、何らかのアクションを起こす処理のこと。

#オブジェクト指向のメリット
メリットは、大きく2点。

1.大人数での開発に適している
2.同じようなモノをすぐに作成できる

上の例で言うと、「剣士」というプログラムの中身は、作成者だけが知っていればよく、他のメンバーは「Aボタンで攻撃する、Bボタンで守る」という機能を持っているということだけ知っていればいい。（ちょうど、なぜテレビが映るのかがわからなくても、リモコンでチャンネルを変えられるように）
また、「魔法使い」をゲームに登場させようとするとき、「Aボタンで攻撃する、Bボタンで守る」という機能は剣士と共通にすればよく、「剣士」というモノを再利用して「魔法使い」を作れば効率的に開発できる。

#おわりに
自分なりにオブジェクト指向についてまとめてみました。ふわふわした理解ですが、これからもっと勉強しつつ、理解を深めていきたいです。
C#手遊び(Aggregateと演算子：>>=)

#この記事、何?

少し前の記事でいろいろとこんな風にかけるよってコメントをもらった。
で、正直、一目見たときに意味不だったので理解してみた。
※流石に今回はVisual Studio使いました。

少し前の記事
■C#手遊び(指数計算: 37^95を323で除算したあまりを計算。少しラムダ式)
https://qiita.com/siinai/items/2b1d8d32b8dccb8381af


順番に行きますよ。

#1つ目

```csharp
Enumerable.Repeat(37, 95).Aggregate(1, (a, b) => a * b % 323)
```

ラムダ式だけはわかる。これ。「(a, b) => a * b % 323」。aにbをかけて323で割った余りを返すという関数。
ただ、EnumerableもRepeatもAggregateもわからん。。。何それ?

##1つ目の1つ目：Enumerable

参考にしたサイト
■未確認飛行：標準クエリ演算子（その他）> 生成演算子
https://ufcpp.net/study/csharp/sp3_stdqueryo.html

```csharp
//コード
Show(Enumerable.Range(5, 3));
Show(Enumerable.Repeat("abc", 3));
//出力
5 6 7
abc abc abc
```

なるほど。ひとまず、数を並べてどーにかするクラス(メソッド?)群の親ラスという理解で進めてみよう。

##1つ目の2つ目：Repeat(37, 95)
これも上記サイトからなるほど。と。
つまり、「Repeat」の言葉の通り、{37, 37, 37, 37, ... , 37 }と37を95個生成しますという意味。
だからこの後ろにLinqで.Sum()とか書くと37*95がReturnされる感じ。なるほど。近づいてきた。

##1つ目の3つめ：Aggregate(1, (a, b) => a * b % 323)
変数をおかっけてみようと思ってlambda式を分解して、F11をとんとんしておっかけてみた。

```csharp

Aggregate(1, GetInt)
private int GetInt(int a, int b){ return a * b; }
```

なるほどね。理解した。
最初のT(今回は多分int扱いの1)を起点として、次々とそのもとになる数列を処理する感じ。
直前に{37, 37, ..., 37}が来てるから、1回目で1*37%323が来て、2回目でその戻り値に「*37%323」する。
なるほどね。これで37を95回かけて処理する、が成立するのね。

じゃ、これで階上が計算できる?

```csharp

var tmp = Enumerable.Range(1, 6).Aggregate((a, b) => a * b);
```

できるね。
tmpに6!の解、720が入ってました。

もしかしてフィボナッチの数列も作れる?
・・・あっ、無理か。そりゃそうだ。


必要な場合が出てきそうなので覚えておこう・・・
というか、コーディングそのもののリテラルは忘れてしまいそうだから、この投稿か、未確認飛行のサイトを参照できるようにしておこう。




#2つ目

```csharp
    for (int i = 0x40000000; i > 0; i >>= 1) {
        answer = answer * answer % divisor;
        if ((exponent & i) > 0) {
            answer = answer * @base % divisor;
        }
    }
```

これもなるほどという感じでした。
これも分けていきます。

##2つ目の1つ目：int i = 0x40000000
いや、まあ、こういう書き方できるんだなぁ・・・と。
これからやろうとしていることの伏線ですね。

##2つ目の2つ目：>>=
これ、知識になかった。というか、見てもわからなかったなので調べた。

参考にしたサイト

参考にしたサイト
■未確認飛行：組込み演算子 > シフト
https://ufcpp.net/study/csharp/st_operator.html

(引用)
<< は左シフトを、 >> は右シフトを行う演算子です。

なるほど。自分で先の記事で「2進数で数えて7回ループ」とか言っていたこともあり、やろうとしていることを考えるとこれですね。
そして3つめに続くです。

##2つ目の3つめ：(exponent & i) > 0
はい、きましたこれ。
昔、6 and 13 = 4 とかって処理の意味が分からなくておっかけたことがあった。
それを考えると、わかるわ・・・
ビッグエンディアンとして上のビットから数えるということですね。

##2つ目の4つ目：＠base
※qiitaのエスケープがよくわからなかったので＠は全角文字で書いちゃました。。。

予約語のスペルも変数として定義できると。
確かに int ＠int = 3; とかできた。
ちょっと前に親クラスから継承して・・・とか記事書いてたので「おっ、これは呼び出し元の数をどうにかするのか?」とか思ったけどそうでもなかったみたい。


#感想
自分でZeroから書いた記事よりよっぽど勉強になった。
たんに書き方、というより、数を扱うということをそういう風にまとめるという考え方が参考になった。

本業は機械学習でPythonなのでそっちでpandasやnumpyあたりと向き合うとき、いいフィードバックになってくれることと思います。
(先の記事以外も含め)Qiitaでコメントくださる方々、ありがとうございます！
・・・というか、これからもよろしくです。
(をぃ！)


#忘れてた。。。
指摘の BigInteger.ModPow 調べてない。。。

また追記します。

#調べた!
なるほど。最初にPythonは10文字って書いたけど、C#もやるね。

```csharp

var bint = System.Numerics.BigInteger.ModPow(37, 95, 323);
```

流石に998!とかその100乗とかを平気で計算するPythonにはびっくりだけど。
演算子 一覧

# 演算子一覧
## ごっちゃになりがちな●●演算子、整理するためにまとめてみました。

``算術演算子``
 exp1 **+** exp2
 exp1 **-** exp2
 exp1 * exp2
 exp1 **/** exp2
 exp1 **%** exp2
 exp1 ** exp2

 var++　(後置インクルメント演算子)
 ++var　(前置インクルメント演算子)
 var--　(後置ディクルメント演算子)
 --var　(前置ディクルメント演算子)
<hr>


``比較演算子``
 exp1 **==** exp2
 exp1 **!=** exp2

 exp1 **<** exp2
 exp1 **<=** exp2
 exp1 **>** exp2
 exp1 **>=** exp2

<hr>

``論理演算子``
 a==b **&&** c==d  (aとbが等しいがtrue、**かつ**cとbが等しいもtrue)
 a==b **||** a==b　(aとbが等しいがtrue、**または**cとbが等しいがtrue)
 **!**(a==b)　　　　(aとbが等しいときはfalse、等しくないときはtrue)
haskell-ide-engine導入

[vscode と haskell-ide-engine で Haskell 開発環境を構築する](https://qiita.com/waddlaw/items/b83cd10311200095fe87#vscode-%E3%81%AE%E8%A8%AD%E5%AE%9A)

こちらを参考にvscode+haskell-ide-engine環境を導入するメモ。

# 環境
- OSX Mojave

# 導入手順

## vscode拡張

`Haskell Language Server` 拡張をインストールするだけ。

## haskell-ide-enine

```
git clone https://github.com/haskell/haskell-ide-engine --recursive
cd haskell-ide-engine
./install.hs build-all
```

cloneする際の `--recursive` は必須なので注意。

`./install.hs build-all` を叩くと、

```
Installing GHC ...                                                                 
Received ExitFailure 2 when running
Raw command: /usr/bin/make install
```

このようにエラーで落ちたが、下記の記事が参考になった。

[GHC 8.6 がインストールできなかった](https://matsubara0507.github.io/posts/2018-10-28-ghc-8-6-error-no-gmp.html)

```
brew reinstall gmp
./install.hs build-all
```

gmpをインストールしてから再度実施すると解決できた。

`./install.hs` のビルド時間は結構長い。

```
Build completed in 1h18m
```

1時間以上かかった。
まあ気長に待つと良い。

# フォーマッター

[Haskellを書くときはstylish-haskellとhlintを使って労せずして綺麗なコードを書きましょう](https://www.ncaq.net/2017/10/07/)

を参考。

```
stack install stylish-haskell
stack install hlint
```

vscodeも

- stylish-haskell
- hlint

の拡張がそれぞれ存在するのでインストール。

# Ubuntu 18

別のUbuntu18のマシンにも入れようとした所、下記エラーが発生。

```
エラー: -ltinfo が見つかりません
```

[Link error: “Cannot find -ltinfo” on Ubuntu 12.04 on a 32-bit arm processor](https://stackoverflow.com/questions/21137879/link-error-cannot-find-ltinfo-on-ubuntu-12-04-on-a-32-bit-arm-processor)

こちらに従って `libtinfo-dev` をインストール。

```
sudo apt install libtinfo-dev 
```

再試行すると解決。
プログラミング学習記録21〜GitHubの便利さをちょっとだけ知れた〜

##今日やったこと
- Udemyの「Web開発入門完全攻略コース - プログラミングをはじめて学び創れる人へ！未経験から現場で使える開発スキルを習得！」のセクション16の249~277

セクション15のrailsをやっていたのですが、詰まってしまったので、気分転換のために先にセクション16のgitをやりました。

以下、パートごとの学習メモです。

###セクション16Git/Github入門 -ソースコードバージョン管理入門

####249.イントロダクション-ソースコード管理入門 git/github-

ソースコードのバージョン管理を行うと、誰がいつ、どのファイルのどの場所を編集したかが簡単に管理できるため、非常に便利です。

####250.Git概要
ファイルを管理するデータベースをリポジトリと呼びます。

分散型の図がわかりやすかったです。

こちらのサイトにもわかりやすく書かれていました↓

履歴を管理するリポジトリ【Gitの基本】 | サルでもわかるGit入門【プロジェクト管理ツールBacklog】（https://backlog.com/ja/git-tutorial/intro/intro1_2.html）


####251.Gitホスティングサービス
リモートリポジトリのサービス（ホスティングサービス）を提供しているのは、主にgithub、BitBucketなどがあります。

このセクションではGitHubを使います。


####252.環境構築
ローカルリポジトリを利用するための初期設定を行いました。

####253.リポジトリの初期化
Initコマンドで初期化しました。

####254.コミット
a.jsとb.jsをaddコマンドを使ってステージに登録させた後、commitさせてローカルリポジトリに登録させました。

###255.ログの確認
`$ git log`で履歴を確認しました。

####256.差分の確認
ワーキングツリーとステージ、ステージとローカリリポジトリの内容の差を確認しました。


####257.コミットを取り消す
特定のコミットを打ち消す場合→revert
コミット自体を無かったことにする→reset

####258.ファイルの削除
Rmコマンドでファイルを削除しました。

####259.ブランチ
ブランチは別々の作業をブランチ間に影響を与えることなく、並行して行うために利用します。

実務では、マスターブランチを直接編集することはないそうです。

####260.ブランチのマージ
259で作ったfeature-Aというブランチをマスターブランチにマージしました。

####261.競合の解消
競合（コンフリクト）とは、例えばブランチBとブランチCで同じ箇所のソースコードを編集した時に発生するもののことを言います。

これは良くないので、取り除く必要があります。

このパートでは、あえて競合させて競合を取り除く練習をしました。

実務ではできる限り競合が生まれないように、話し合いながら開発を行っていく必要があるみたいです。

####262.コミットメッセージの修正
直前のコミットメッセージを修正しました。

####263.リモートリポジトリへ送信　概要
リモートリポジトリとして実務で一番使われるgithubについて学習します。

####264.補足：GitHub 無料ユーザーもプライベートリポジトリを使用できるようになりました

####265.補助教材：GiyHubアカウントの新規作成

####266.GitHubアカウント作成
　
####267.リモートリポジトリの作成
Githubでリポジトリを作成しました。

####268.GitHubにSSH keyを設定
安全のために鍵を設定しました。

####269.リモートリポジトリへプッシュ１
先ほど作ったファイルをgithubにアップロードしました。

####270.リモートリポジトリへプッシュ２
新たに作ったfeature-Zというブランチをプッシュしました。

####271.リモートリポジトリをクローン
先ほどプッシュしたファイルのクローンを作りました。

####272.リモートリポジトリからプル
プルしてみました。

####273.Gitのワークフローについて
Git flowとGitHub flowではGitHub flowの方がシンプルでわかりやすいです。

####274.GitHub Flow ルールと流れ

####275.GitHub Flow 模擬体験１

####276.GitHub Flow 模擬体験２

####277.ブランチの削除
使わなくなったブランチは削除しましょう、ということでローカルブランチ、リモートブランチ共に使わなくなったブランチを削除しました。

###セクション15Git/GitHub入門　全体の感想
まだまだ理解は甘いですが、1回一通りやってみたことでなんとなく理解できました。

Githubに対する抵抗感をちょっと減らせてよかったです。

<br>
明日は、今日詰まってしまったrailsにもう一度挑みたいと思います。

おわり
【JaCoCo（Java Code Coverage）】NetBeansでの使用


#ライブラリの読み込み
公式サイト（[www.jacoco.org](https://www.jacoco.org/jacoco/trunk/doc/index.html)）の内容を参考にpomに下記を追記

```xml:pom.xml
<project>
	<build>
        <pluginManagement>
            <plugins>
               <plugin>
                    <groupId>org.jacoco</groupId>
                    <artifactId>jacoco-maven-plugin</artifactId>
                    <version>***</version>
                    <executions>
                        <execution>
                            <id>default-prepare-agent</id>
                            <goals>
                                <goal>prepare-agent</goal>
                            </goals>
                        </execution>
                        <execution>
                            <id>default-report</id>
                            <goals>
                                <goal>report</goal>
                            </goals>
                        </execution>
                        <execution>
                            <id>default-check</id>
                            <goals>
                                <goal>check</goal>
                            </goals>
                            <configuration>
                                <rules>
                                    <!--  implementation is needed only for Maven 2  -->
                                    <rule implementation="org.jacoco.maven.RuleConfiguration">
                                        <element>BUNDLE</element>
                                        <limits>
                                            <!--  implementation is needed only for Maven 2  -->
                                            <limit implementation="org.jacoco.report.check.Limit">
                                                <counter>COMPLEXITY</counter>
                                                <value>COVEREDRATIO</value>
                                                <minimum>0.60</minimum>
                                            </limit>
                                        </limits>
                                    </rule>
                                </rules>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>
```

#使い方
mavenで下記を実行すると、target/site/jacoco/index.htmlにレポートが生成されます。

```
mvn clean jacoco:prepare-agent test jacoco:report
```

（NetBeansでは、[プロジェクトを右クリック]→[Mavenを実行]→[ゴール]）
時系列データの変化点検知

#■時系列データの変化点検知を実装する

時系列データの変化点検知の手法を勉強したのでメモ。

##問題設定
閾値を超えたときに異常を知らせる仕組みがある。

単発での閾値超えではなく、継続して閾値を超えた場合にのみ、
異常検知したいときがある。(サーバやサイトのレスポンスetc)
単純に閾値設定すると単発での閾値超えも拾ってしまい、
不要なアラートが発生することになる。

そこで、変化点検知の手法を用いて、
継続して閾値を超えた場合にのみ検知する手法を実装してみる。

##手法

変化点検知の手法で、見つけたのは下記。 [^1]

　1.過去のデータから予測値を計算し、実測値と予測値の差を計算する方法
　2.k近傍法を用いた手法

1で、SARIMAモデルから予測値を計算する方法に取り組んだが、
パラメータのチューニングが大変で、かつ実装もそこそこ面倒であるため、
今回は見合わせた。(実装が面倒だと業務に使いづらい)

この記事では、2.k近傍法を用いた手法に取り組んでみる。


##

まず、データを用意する。
ある株価の時系列データと仮定。(あくまで仮)

```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

#パラメータ
myu1=10 #異常発生前の平均
myu2=20 #異常発生後の平均
sd=1 #標準偏差

#時系列データ 正規分布に従う時系列データをそれぞれ100個
data1 = np.random.normal(myu1,sd,100)
data2 = np.random.normal(myu2,sd,100)

#可視化
data=np.hstack((data1,data2))
df = pd.DataFrame(data)
plt.plot(df)
plt.xlabel("time")
plt.ylabel("Stock Price")

```


![データ.png](https://qiita-image-store.s3.amazonaws.com/0/367093/5676647f-5901-fb6b-d13f-dfb43a444566.png)



K近傍法で学習する前に、部分時系列データを作る。
時間的に近いデータをまとめて作成する。

```python
from sklearn.neighbors import KNeighborsClassifier

#時間的に近いデータをまとめる。
x = data.reshape(1,-1) #shape(1,190)
M = 10
Train_data=x[:, 0:M] #shape(1,M)

for i in range(1, x.shape[1]-M):
  X = x[:, i:i+M] #shape(1,10)
  Train_data=np.vstack((Train_data,X))

Train_data.shape #(190, 10)

```
コードにある通り、xには時間*i*から時間*i*+Mまでの時系列データが格納されている。
*i*を0から(200-M)まで回して,Train_dataにxを連結して
Train_dataを作るので、Train_dataのサイズは(190,10)となる。

これは、データがM=10次元であり、それが190個あると考える。
K近傍法に食わしてみる。

```python

clf =  KNeighborsClassifier(n_neighbors=2) #近傍点(自分と自分以外)を探す
clf.fit(Train_data, np.zeros(Train_data.shape[0])) #ラベルはすべて0とする

dist, ind = clf.kneighbors(X) 
distances=dist[:,1]

```
ちなみに中身はこんな感じ。

```python
dist[:5,:]#dist：近傍点との距離 [自分,　自分の次に距離が近いデータ]
```
array([[0.        , 1.37597833],
       [0.        , 1.38991142],
       [0.        , 1.60854258],
       [0.        , 1.61022187],
       [0.        , 1.94213876]])

```python
ind[:5,:] #ind:近傍点の時間[自分,　自分の次に距離が近いデータ]
```
array([[ 0, 26],
       [ 1, 27],
       [ 2, 67],
       [ 3, 68],
       [ 4, 73]])

あとは下記のように、閾値を決め打ちして、変化点を見つける。

```python
thred=8 #仮
henka=ind[distances > thred][-1,0]

plt.plot(df)
plt.axvline(x=henka, color='red', linestyle='--')
plt.xlabel("time")
plt.ylabel("Stock Price")
```

すると変化点検知ができる。


![変化点検知結果.png](https://qiita-image-store.s3.amazonaws.com/0/367093/a2c75192-0cb3-2499-85d3-976a15995643.png)

この手法を使うにあたって、

・閾値をトップダウンで決めないといけないこと。
　データの傾向を考慮して、決め打ちで人間が設定することになる。
　
・変化点前後でのデータの平均に大きな差がない場合。
　　⇒データの標準偏差が大きい場合。
　　　この場合は、上記の例のようにきれいに変化点を検知することができない。
　　　なぜなら、自分の次に最も近い点を変化点付近と認識することが難しくなるためである。

　　⇒データの標準偏差が小さい場合。
　　　どの程度小さいかによるが、検知はできるかと。

[^1]: ほかにありましたら教えてください。
Anacondaにmecab_pythonを入れる（Homebrewなし）

## Motivation
- 普段使っているmacOSのAnaconda環境のJupyter Notebook、PythonでMeCabを使いたい。
- いろいろ検索するとHomebrewというパッケージ管理システムを使うと簡単にインストールできるらしい。
- でもAnacondaを先にダウンロードして入れてしまった人はHomebrewをインストールできないらしい（こうなった）

```
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 
dyld: Library not loaded: @rpath/libssl.1.0.0.dylib
  Referenced from: /anaconda3/lib/libssh2.1.dylib
  Reason: image not found
```

- Anacondaを一旦消してHomebrewをインストール、その上で pyenv からAnacondaをインストールすると両者共存できるらしい。([参照](https://qiita.com/aical/items/2d066801a7464a676994)、しかし難しそうだ)
- bash_profileでAnacondaのPATHを削除することでインストール可能らしい（[参照](https://yaritakunai.hatenablog.com/entry/2017/08/18/181000)、でも元に戻せるのか、Anacondaがその後ちゃんと動くのか不安だ）
- ん、このやり方でやれば２分でできると書いている人がいる（[参照](https://spjai.com/mecab/)）。これでやってみよう  

##Environment
macOS Mojave 10.14.3
Anaconda3, Python3

##Steps
####Mecab本体をインストール

```
cd {git_repo_path}
git clone https://github.com/taku910/mecab.git
cd mecab/mecab
./configure  --enable-utf8-only
make
make check
sudo make install
```
####Mecab ipadic をインストール

```
cd ../mecab-ipadic
./configure --with-charset=utf8
make
sudo make install
```

####Mecab Python bindingのインストール
これが簡単にはいかなかった。

インストラクション通りに`sudo pip install mecab-python3`とするとエラーが出る。確かunable to execute 'swig': No such file or directory。いろいろ調べた結果、swigというやつがたりなくて、これもやっぱり普通はHomebrewで入れるらしいが、なんとかcondaから入れてみた。


```
conda install -c anaconda swig
```

もう一度`sudo pip install mecab-python3`とするとエラーが出る。今度は`error: command 'gcc' failed with exit status 1`。これも調べた結果、[XCodeの最新版のバグで少し前の9.4を入れると解消されるという](https://teratail.com/questions/163226)のでその通りにする。

- https://developer.apple.com/download/more/から "Command Line Tool (MacOS 10.13) for XCode9.4"をダウンロードしてインストール。
    
3度目の正直、なんだかわからないけどAnacondaの人はJupyter notebookから実行した方がいいとの噂を聞いて、新しいNotebookを作って

```
!pip install mecab-python3
```

これで無事にJupyterのPythonでMecabが使えるようになった。

```python
python
import sys
import MeCab
mecab = MeCab.Tagger()
mecab.parse("今日驚きの努力だ")
```
```
今日	名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
晴れ	名詞,一般,*,*,*,*,晴れ,ハレ,ハレ
EOS
```
## Conclusion
あとで聞いたところ、私のやり方は全くおかしいということがよくわかった。そもそも[参考にしたページ](https://spjai.com/mecab/)をよく見たらUbuntuのインストラクションだった。Mac OSを使っているならHomebrewがないとまずおかしいとの見解らしい。そしてAnacondaを素直にダウンロードしてインストーラーを使ってインストールしたのも間違いという説（AnacondaのページではDownloadボタンに誘導されるのにだ！）。正しくはおそらく、

- bash_profileを一時的に書き換えてAnacondaへのPATHを消し、Homebrewをインストールする（実際に次の日に夫がこの方法でさっくりHomebrewをインストールしてくれた）
- Anacondaを一度きっぱりきれいにアンインストールして、Homebrewを入れてそこからAnacondaをインストールする。

のどちらかだったのだろうと思う。ただいろいろやってみたので勉強になりました。それにMeCabも使えるようになったし。
JavaScriptで「undefined + 1」を「NaN」ではなく「1」にする

JavaScriptでこういう式を書くとNaNになります。

```javascript
var x = {};
x.key += 1; // NaN
```

perlなら1になるのになぁ〜

対処法として、このように書くことが多いのではないでしょうか？

```javascript
var x = {};
x.key = isNaN(x.key) ? 1 : x.key + 1; // 1
```

x.keyがあるかどうかで見てるんですね。hasOwnProperty()を使うこともあるかも知れません。

実はこうも書けます。

```javascript
var x = {};
x.key = Number([x.key]) + 1; // 1
x.key = Number([x.key]) + 1; // 2
x.key = Number([x.key]) + 1; // 3
x.key = Number([x.key]) + 1; // 4
```

こちらのほうが分岐もありませんし、簡単ではないでしょうか？

## なぜでしょう？

でもなぜこういう挙動になるのでしょう？まず、単体でNumber()の挙動を確かめてみます。

```javascript
Number(null); // 0
Number(undefined); // NaN
Number(""); // 0
Number(); // 0
```

また、未定義のメンバの値はどうなるのでしょう？

```javascript
var x = {};
x.key // undefined
```

x.key が未定義なのでundefined + 1 → NaN + 1 → NaN となるわけですね。

ではなぜ [x.key] が 0になったのでしょう？

```javascript
var x = {};
[x.key] // [undefined]
```

undfinedのままですね。

ここでNumber(値）の処理がポイントになります。

Numberの値が数字っぽく評価されるように変換されるんですね。

配列の場合は.join()が呼ばれるようです。

なので、Number([undefined]) →  Number([undefined]. join()) → Number("") → 0 となるわけです。

複雑怪奇ですねw
CentOS7にChromeをインストールする

Red Hat CodeReady WorkspacesのサポートブラウザがChromeなので
Chromeをインストールします。

# yumインストール

```bash
# vi /etc/yum.repos.d/google.chrome.repo
```

```bash:google.chrome.repo
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
```

```bash
# yum install google-chrome-stable
```

あとはアプリケーション＞インターネット＞Google Chromeをクリックし
デフォルトにするか聞かれるのでYesでOK
ざっくりROS理解（入門）

#概要
この章では自動車を例にROSの概念を理解します。

#ROSとは
時間がない人に向けて。
**ROSとは、JavaやC#のようなオブジェクト指向をロボットに取り入れたフレームワークである。**
です、これを理解できた人は手を動かさなくとも大丈夫かもしれません。
それ以外の人は手を動かしながらROSを理解していきましょう！


#準備
以下のファイルを`catkin_ws/src/`以下に入れて
```catkin_make```してくコンパイルしてください。
[https://github.com/Keisuke08aw/robot-lecture](https://github.com/Keisuke08aw/robot-lecture)



<img width="80%" alt="セットアップ.png" src="https://qiita-image-store.s3.amazonaws.com/0/304482/3022c5e8-26d2-ab1e-b2f9-5753433fce3e.png">

コンパイルが通ったら、早速ロボットを立ち上げます。


#ロボットファイルの実行
```roslaunch robot-car main.launch```で立ち上げましょう。
コマンドの意味はロボットが立ち上がったあとに解説します。

<img width="80%" alt="セットアップ.png" src="https://qiita-image-store.s3.amazonaws.com/0/304482/1d54fd9c-e7c2-509b-719a-64a6eb14acb9.png">

ここまでうまくいったでしょうか。
うまく行っていない場合、考えられるエラーとして

1. パスが通っていない
　　一度bashrcを開いて、しっかりとcatkin_wsがパスとして入っているか確認してください。もしくは一度ターミナルを閉じて再度コマンドを実行してみてください。 

2. 必要なパッケージが入っていない。
　　エラーの中で必要なパッケージが入っていないと赤字でそのパッケージ名が表記されるので、そのパッケージをインストールしてください。

#ROSの概念
それでは、今回動かしたこの自動車を使ってROSの概念について説明していきたいと思います。
今、ロボットが動いている状態で次のコマンドを打ってください。
```rosnode list```
すると以下のような表示がされると思います。
<img width="80%" alt="セットアップ.png" src="https://qiita-image-store.s3.amazonaws.com/0/304482/42b2bd0d-38af-c7ff-db9d-b05754a7746e.png">
これらの一つ一つのファイルらしき物（ノード）が、今回扱うメインのトピックです。

#ROSにおけるノードという概念

ROSはC++とPythonでかけます。以下のように一つ一つのファイルが独立してお互いに情報をやり取りしながら動いています。
さっきのコマンド、```roslaunch robot-car main.launch```は具体的には
ノードの立ち上げを以下の図のように行っています。

<img width="80%" alt="セットアップ.png" src="https://qiita-image-store.s3.amazonaws.com/0/304482/623b29a3-18c6-204b-584d-f8916af7b10c.png">

ノードというとわかりずらいですが、要はJavaやC#でいうインスタンスのことです。
```roslaunchコマンド```で複数のインスタンスを一気に立ち上げ
**立ち上げたインスタンス同士がプロパティのやり取りを行っている**と考えられれば、ほとんどROSは理解したといっても過言ではありません。
これがいわば**ROSにおける原点にして頂点**なるものです。


車を動かすときに、今回は大きく4つのファイルを作成する必要がありました。

1. コントローラ
2. 車
3. シミュレーター
4. 画面表示

です。上の図から見てわかるように、要はROSというのは
**javaやC#のようなオブフェクト指向言語**のように
実現したいものを部品単位に分けて、情報をやりとりするように設計されています。
#ROSにおける考え方
今回の場合、車のシミュレーションを作りたかったのでオブジェクト指向っぽく考えると
**操作する人、車、シミュレーター、画面表示**の４つに分解され、それぞれを独立して実装させました。
<img width="40%" alt="セットアップ.png" src="https://qiita-image-store.s3.amazonaws.com/0/304482/c977cdfc-3126-4ce7-3a0c-a46bd7014a4b.png">


ROSではこの、オブジェクト一つ一つのことをノードと呼びます。
また、オブジェクトが他のオブジェクトにメソッドを通してプロパティを渡す時があると思いますが、
ROSではメソッドのことをトピック、プロパティはメッセージと呼ばれます。
なので。```roslaunch robot-car main.launch```とは、
**4つのノードが独立してトピックを通じ、メッセージのやり取りを行っていた**
というのが正しい解釈です。

#その他
おおざっぱにROSを理解するため、ノードの説明はざっくりと行っています。
tfは本来画面表示をするものではありませんが、便宜上そのように書きました。
興味がある人はコードをいじくり回して、色々と遊んでみてください。
面接でデータサイエンティストの良し悪しを予測する５つの質問(Mediumより)

データサイエンティストになりたい自分として、世の中でどのような資質が求められているのかというのが非常に気になる次第です。
たまたまMediumを見ていて役立つ記事を見つけたので、備忘のため記録しておきます。
元記事は[こちら](https://medium.com/predict/five-interview-questions-to-predict-a-good-data-scientist-40d310cdcd68)。

#記事の概要
####これはデータエンジニアの採用ではなく、データサイエンスの役職に就く人間を採用する時のポイントをまとめたもの。
####機械学習の基礎から実行可能な戦略の構築、実際の問題解決まで出来る人間を見極めるためのポイント。
####質問①：データサイエンスにとっての正規分布の重要性は何か？
・データサイエンスで最も基礎的な部分の理解を試す質問
・中心極限定理が絡められているとより良い。
・ただ、数学的な話は細かい話は置いておいて、正規分布は平均、中央値、最頻値が全て同一であり、平均と分散のみで分布が決定されること、その線形回帰における重要性などに言及されていれば尚良い。
・線形回帰における重要性とは、検定における誤差の分布の仮定のことかと思われる。

####質問②：データサイエンスに対する情熱を教えて下さい。例えばmeetupやKaggleへの参加、世の中のためのデータ活用方法の探索、カンファレンスでのスピーチ、本や記事の執筆、等。
・データサイエンスや数学への情熱を確認するための質問。

####質問③：最近自分が関わったデータサイエンスプロジェクトで味わった挫折と、それをどうやって克服したか詳しく説明して下さい。
・データサイエンスプロジェクトは一筋縄でいくものではないので、困難にどうやって立ち向かったのか知ることで、知識と経験が十分なものかを確認するためのもの。

####質問④：過去自分が関わったプロジェクトを思い出して下さい。もしデータソースの一つを変更できたとすると、どのようにソリューションを変更しますか？
・レベルの低いデータサイエンティストは与えられたデータや予測手法をそのまま受け入れそれ以上考えないが、能力が高ければデータセットの選択、特徴量エンジニアリングや統計的分析を行う。

####質問⑤：調査によると23億人が過去20年に洪水の被害を受けている。あなたならどうやって今後100～500年で発生する洪水を予測しますか？
・損失を最小限にするためにはどこにダムをつくるべきか、の予測。
・問題の定義、データ収集、データラングリング(データ(Data)を飼いならす(Wrangling))、EDA、特徴量エンジニアリング、モデリング、データ解釈など、データサイエンティストとしての業務への習熟度合いを図る質問。



#所感
・やはり大事なのは、主体的に問題を特定し、具体的に課題解決に導く能力だと感じた。
・前提として、現職務でもデータサイエンスに関する業務をしていることがあるようだ。
・自分自身が今の職務でこのような作業に従事できていないので、プライベートででも何とかして実績を残したいと思った。
[Python]便利な組み込みString定数

# 概要
Pythonでは全ての半角英字から成るString型の定数が組み込みで用意されています。  
なので、以下のような文字列をハードコーディングしたり、定数として新たに用意する必要はありません。

``` python
lower_alphabet = "abcdefghijklmnopqrstuvwxyz"
```

# 使い方
以下のコードでstringライブラリのimportから定数の呼び出しまでを行えます。

``` python
# stringをimport
>>> import string
# 大文字、小文字の半角英字
>>> string.ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

# 小文字の半角英字
>>> string.ascii_lowercase
'abcdefghijklmnopqrstuvwxyz'

# 大文字の半角英字
>>> string.ascii_uppercase
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

# 0~9までの数字
>>> string.digits
'0123456789'

# 16進数の数字
>>> string.hexdigits
'0123456789abcdefABCDEF'

# 8進数の数字
>>> string.octdigits
'01234567'
```

また、これらの定数は+演算子で組み合わせて使うことができます。

``` python
>>> string.ascii_letters + string.digits
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
```

~~この定数を使用して文字列が半角英数のみで構成されているかどうかを以下のコードで判別できます。~~  

``` python
# 半角英数字のみで構成された文字列"HelloWorld2019"をチェック
>>> input_string = "HelloWorld2019"
# 入力された文字列に含まれる文字の集合が半角英数字全体の部分集合であるかをチェック
>>> set(input_string).issubset(set(string.ascii_letters + string.digits))
True

# 半角英数字以外の文字を含む文字列"HelloWorld!!!"
>>> input_string = "HelloWorld2019!!!"
>>> set(input_string).issubset(set(string.ascii_letters + string.digits))
False
```

# 追記
文字列が半角英数のみで構成されているかどうかはisalnum()で判別可能です。

``` python
>>> "HelloWorld2019".isalnum()
True
>>> "HelloWorld!!!".isalnum()
False
```
GitHubで複数のリポジトリをネストさせる

# GitHubで複数のリポジトリをネストさせる

---

※ 追記
本記事では submodule を避けていますが、最近では自分は submodule を積極的に使うようになりました。
https://zenn.dev/statham/articles/gatsby-source-with-submodule

---

GitHubで、あるリポジトリ内の特定のディレクトリだけを、別のリポジトリでも管理したいと思った。

調べていくと、[サブモジュール](https://qiita.com/sotarok/items/0d525e568a6088f6f6bb)という機能を使えば良いようであったが、これは[クセが強すぎた](https://www.d-wood.com/blog/2014/05/22_6257.html)。

自分のやりたいこととしては、親のリポジトリはプライベートにして、その子のリポジトリのみパブリックにも公開したいだけであり、あまり面倒くさい管理は行いたくない。

しかし、普通に作ると勝手にサブモジュール化されてしまうので、それを避ける方法をメモしておく。

## サブモジュール化されてしまうとは

以下の手順でリポジトリをpushすると、childリポジトリはサブモジュール化される。

やっていることは、親のリポジトリを作成した後に、子リポジトリをクローンして取ってきているだけ。

```
root$ mkdir parent && cd parent
root/parent$ git init && git remote add origin git@github.com:自分の親リポジトリ
root/parent$ touch README.md && git add .
root/parent$ git commit -m"first commit"
root/parent$ git clone git@github.com:自分の子リポジトリ
root/parent$ git add . && git commit -m"add child repository"
root/parent$ git push
```

サブモジュール化されてしまうとは、[この「githubにpushしたファイルがgithubで開けない」](https://qiita.com/Ryosuke-Hujisawa/items/f7eb3a634acbf4f2b744)記事の画像のように、フォルダが開けなくなることである。リポジトリからフォルダを開くことができなくなる。恐らく、`.gitmodules`ファイルを作って設定を書けば何とかなるのかもしれないが、管理のクセが強くなりそうで、やりたくない。

## サブモジュール化を回避する

サブモジュール化を回避するには、親のリポジトリ内で子のリポジトリをクローンする前に、一度何かしらの適当なファイルを含めたフォルダを作ってコミットしておく必要がある。具体的には以下の通り。

```
root$ mkdir parent && cd parent
root/parent$ git init && git remote add origin git@github.com:自分の親リポジトリ
root/parent$ touch README.md && git add .
root/parent$ git commit -m"first commit"
root/parent$ mkdir child && touch child/README.md && git add . // もしpushが失敗する場合はchild/README.md には何か適当なことを書いておく
root/parent$ git commit -m"add child folder"
root/parent$ git push
root/parent$ rm -rf child
root/parent$ git clone git@github.com:自分の子リポジトリ
root/parent$ git add . && git commit -m"add child repository"
root/parent$ git push
```

これで、普通にイメージする通りの、複数リポジトリ管理が行える。

### 大事なポイント

大事な箇所は、cloneしたいリポジトリをcloneする前に、フォルダを作成してコミットを済ませている点。

```
root/parent$ mkdir child && touch child/README.md && git add .
root/parent$ git commit -m"add child folder"
```

これにより、childフォルダーがサブモジュール化されることなく、普通のフォルダとして認識される。そのため、後からこのフォルダの中身を、クローンしてきたchildに差し替えてもサブモジュール化されてクリックできなくなるような事態にならないのだと思われる。

## 参考
[Gitリポジトリ内で特定のディレクトリを別なリポジトリでも管理する](https://bit-part.net/blog/2014/11/multiplerepository.html)

[git submodule は癖がすごいとの噂だったが素直につきあっていけそうという話](https://www.d-wood.com/blog/2014/05/22_6257.html)
純粋なHTML5だけで、データバインディング"ぽい"ことをする

## 追記 (2019/03/11)
「`<output>`タグがすごい」と勘違いしてる記事です。特に下の例は、`<output>`でなくても動きます。「Named access on the Window object（詳細: [@rryu さんコメント](https://qiita.com/nwtgck/items/1d34864b6adb6cfe5b59#comment-15bc21b690f24de50a16)）」を知らなかったがために勝手にシンプルに書けるとと勘違いしてしまってます。
（コメントで、@yuta0801 さん、 @rryu さんに教えていただきました。 ）

## 見つけたこと

`<output>`タグという存在を初めて知り、ピュアなHTMLだけで、ちょっとしたデータバインディングぽいことが可能だとわかったので、メモです。（追記：特に`<output>`タグに限った話でないことがわかりました。） （ぽいってだけでデータバインディングとは呼べないかもしれません。）

でも、ちょっと初めて知ってDOMとかいじらずに簡単に使えそうなので、紹介します。
HTML5から`<output>`タグっていうのがあったみたいです。（全然知りませんでした）


## 例

[MDN](https://developer.mozilla.org/ja/docs/Web/HTML/Element/output)の例を引用します。以下のように、`oninput=`属性のJavaScriptが評価されるみたいです。

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="html,result" data-user="nwtgck" data-slug-hash="VRWWGN" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="例セクション">
  <span>See the Pen <a href="https://codepen.io/nwtgck/pen/VRWWGN/">
  例セクション</a> by Ryo Ota (<a href="https://codepen.io/nwtgck">@nwtgck</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

- - -

例えば、以下のように自分で作った関数(`myLogic()`)などを書くこともできるので、汎用性はある程度あると思います。以下の例では入力文字を逆にします。


![output-tag-demo](https://qiita-image-store.s3.amazonaws.com/0/84451/60c89ac0-2541-b172-4fa9-e45f9ff0f503.gif)


```html
<form oninput="x.value = myLogic(my_text.value)">
  <input id="my_text">
  <output id="x"></output>
</form>

<script>
function myLogic(text){
  return text.split("").reverse().join("");
}
</script>
```

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="html,result" data-user="nwtgck" data-slug-hash="ZPyyma" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="&amp;amp;lt;output&amp;amp;rt; example">
  <span>See the Pen <a href="https://codepen.io/nwtgck/pen/ZPyyma/">
  &amp;lt;output&amp;rt; example</a> by Ryo Ota (<a href="https://codepen.io/nwtgck">@nwtgck</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


~~`<output>`タグのメリットは、シンプルで、`document.getElementOooo()`系のメソッドやライブラリとか使わずに、Angular/React/Vueみたいなことを、HTML5標準の機能でできるところだと思います。~~ （追記: `<output>`タグの力ではなく`oninput`属性と「Named access on the Window object」を使った方法です（@yuta0801 さん @rryu さんに教えてもらいました ）。） すばやく何か単純なものを作りたいときに役立ちそうです。


上記の例ではシンプルにするために、`for=`属性などを書かずに使っています。ちゃんと書くには、https://developer.mozilla.org/ja/docs/Web/HTML/Element/output が参考になると思います。
Mac OSのDocumentRoot変更方法


DocumentRootを変えるたび、
httpd.confのありかを調べてたり、su -をやり忘れたり...
だったので、備忘録としてまとめておきます。


<h1>Documentroot編集方法</h1>

- apacheを起動

```
sudo apachectl start
```

- rootユーザーになる

```
su -
```

- viでhttpd.confを開く


```
vi /etc/apache2/httpd.conf
```

- DocumentRootを探す 
<br >次の検索候補に進む場合は、**N**を押す

```
/DocumentRoot
```

-  修正したら完了

```
:wq
```
- apacheを再起動

```
apachectl restart
```
MW WP Formの管理者宛メール送信機能から画像の添付をなくす

WordPressのメールフォームプラグイン[MW WP Form](https://ja.wordpress.org/plugins/mw-wp-form/)の管理者宛メール送信機能は、画像アップロードタグ `mwform_image` でのアップロード画像添付と画像ファイルへのリンクを含めることができます。これはとても便利なのですが、画像ファイルのサイズが大きいと(メガ単位？)、場合によってはメールサーバで拒否られることもあるため、使いどころが難しいです。

アップロードした画像は添付せず、画像ファイルへのリンクだけをメール本文に記述できればいいんじゃなかろうか？ということで対応してみました。(ページ下部に注記したことがあるのでそのへんも必ず読んで)

まず、管理者宛メールに画像添付および画像ファイルへのリンクを含めるには、WM WP Form管理画面の「管理者当てメール設定」の本文に、mwform_imageタグのname要素を書き込みます。

例えばフォーム画面で

```
[mwform_image name="画像ファイル" id="image"]
```

のようなタグを利用した時は「管理者当てメール設定」の本文には、

```
何か色々管理者当てメールの本文をだらだらと

{画像ファイル}

そのほか何か色々管理者当てメールの本文をだらだらと
```

このように `{画像ファイル}` というタグを埋め込みます。
こうするとアップロードした画像添付と画像ファイルへのリンクがメール本文に貼り付けられます。ここの画像添付でファイルサイズが大きいとメールサーバから拒否られる、ということです。

ということで、メール本文から画像添付をなくします。
例によって `functions.php` を編集することになるのですが、`functions.php` はテーマディレクトリの下に配置するのが通例のようでプラグインのカスタマイズなのになぜテーマのほうをいじらなきゃならないか、若干解せないです。
またテーマによってはディレクトリを直接変更するのは良しとしないこともあるみたいで子テーマを作ってから `functions.php` を設置してくれ、などもあります。
いちいち面倒くさい。まあしかし、こういった手間も作業時間として計上できるのでWordPress案件が賑わっているのでしょうね(辛口)。

(しれっと…)さて、テーマ(もしくは子テーマ化してから)のディレクトリに `functions.php` を以下の内容で作成します。
`mwform_admin_mail_mw-wp-form-xxx` に対する `add_fileter()` でメール本文の画像ファイルの添付を無しにしてしまうフィルターです。

```php
function delete_attachment_for_admin_mail( $Mail, $values, $Data ) {
        $Mail->attachments = '';

        return $Mail;
}

add_filter( 'mwform_admin_mail_mw-wp-form-xxx', 'delete_attachment_for_admin_mail', 10, 3 );
```

`mwform_admin_mail_mw-wp-form-xxx` の `xxx` の部分はMW WP Formが割り当てた番号(`[mwform_formkey key="ここの数字"]`)に置き換えてください。例えば `[mwform_formkey key="123"]` であれば、

```php
add_filter( 'mwform_admin_mail_mw-wp-form-123', 'delete_attachment_for_admin_mail', 10, 3 );
```

上記のように `mwform_admin_mail_mw-wp-form-123` になります。
これで管理者宛のメールはアップロードされた画像へのリンクがあるだけでファイル添付がなくなります。

ところで注記です。この方法は `mwform_image` タグだけではなく `mwform_file` タグでも使えそうな気がします。そして「管理者当てメール設定」にタグの要素名を記述すると**閲覧可能な添付ファイルへのリンク**がメールに含まれます。つまり、そのメールを見ることができれば誰であって添付ファイルがみれてしまう、ということです。
なのでそのリンク先のファイルに対してはそれ相応のリスクを考えておかなければなりません。「取引先リスト.xlsx」や「登録者会員個人情報リスト.xlsx」などのようなファイル名を見るだけで一部の界隈がざわめき立つような添付ファイルが発生するWordPress案件においてはこういった方法は使わないほうがいいですよ、というかWordPressで何しているの？という話です。
CS193p class note - 5 Drawing

##### Memo:
- `Any` & `AnyObject` are special types used to be commonly used for compatibility with old Objective-C APIs.
- `as?`: the conversion generates an optional
- `NSObject` is the base class for all Objective-C classes

##### Views:
1. A view (i.e. UIView subclass) represents a rectangular area.
2. A view has only one superview but it can have more (or zero) subviews.
3. `init(frame: CGRect)` is the initializer if the UIView is created in code
4. `init(coder: NSCoder)` is the initializer if the UIView comes out of a storyboard
5. `awakeFromNib` is only called if the UIView came out of a storyboard. It is called immediately after initialization is complete.
6. In view coordinate system, origin is upper left and units are points, not pixels.
7. You can use the property `contentScaleFactor` in UIView to find out how many pixels per point are there.
8. `bounds` is the rectangle containing the drawing space in its own coordinate system
9. `frame` is the rect containing a UIView in its superview's coordinate system. 
10. Never call `drawRect` directly. Instead, call `setNeedsDisplay()` or `setNeedsDisplay(_ rect: CGRect)`
11. If you want to draw in your view with transparency, you must let the system know by setting the UIView `var opaque = false`
12. To draw text in draw(CGRect), use `NSAttributedString`

```swift
let path = UIBezierPath()

path.move(to: CGPoint(x: 80, y: 50))
path.addLine(to: CGPoint(x: 140, y: 150))
path.addLine(to: CGPoint(x: 10, y: 150))

path.close()

UIColor.green.setFill()
UIColor.red.setStroke()
path.lineWidth = 3.0
path.fill()
path.stroke()
```

##### Font:

```swift
let font = UIFont(name: "Helvetica", size: 36.0)
let metrics = UIFontMetrics(forTextStyle: .body)
let fontToUse = metrics.scaledFont(for: font)
```
Unreal Engine 4メモ：UE4のエディタ上での実行時の解像度の設定

通常のプレビュー画面は可変のアスペクト比で自由に大きさを変えられる反面、UMG UIのHUDやメニューの確認にはレイアウトが変動するので確認環境に向きません。
実際の画面の見栄えを確認するには実際のアスペクト比である必要があります。

#設定の仕方
1.プレイのプルダウンから「新規エディタウインドウ」にチェック
![1.png](https://qiita-image-store.s3.amazonaws.com/0/175864/5910a2c8-9101-1af4-8713-6f889cc13087.png)

2.エディタの環境設定から「プレイ」→「Play in New Window」でウインドウの各種設定を行う
![2.png](https://qiita-image-store.s3.amazonaws.com/0/175864/055026b1-8168-2306-3134-35847a436942.png)



#参照
[UE4 ANSWERHUB/Editor viewport aspect ratio](https://answers.unrealengine.com/questions/297846/editor-viewport-aspect-ratio.html)
Qiitaの記事の書き方

マークダウン記法とか使ったこと無いので、練習も兼ねて。

# 見出しの書き方
"# 見出し"で大きい見出し。
'#'を増やすと小見出しが作れるみたい。

# 強調
"\*\*強調\*\*"と書くと"**強調**"<-の様に文字が太くなり強調される。

# リンク
```
[リンク](http://...)
```
[twitter](https://twitter.com/Chirokaz127)

# コード
"```（バッククォートx3）"で囲む。

```test.py
import numpy as np
#importしただけ
print("Hello World!")
```

# リスト
```
- リスト 1
- リスト 2
```
と書くと、

- リスト 1
- リスト 2

4つスペース入れてインデントすると、

```
- リスト 1
    - リスト 1-1
```

- リスト 1
    - リスト 1-1

```
1. 番号付きリスト 1
2. 番号付きリスト 2
3. 番号付きリスト 3
- [ ] チェックボックス 1
- [ ] チェックボックス 2
- [x] チェックボックス 3
```
は、
1. 番号付きリスト 1
2. 番号付きリスト 2
3. 番号付きリスト 3
- [ ] チェックボックス 1
- [ ] チェックボックス 2
- [x] チェックボックス 3

という具合。

# とりあえず
ここまで。
とにかく、最初のうちは質にこだわらず、量をこなしていくとこを考えようと思う。
CentOS 7でDNSの設定を変えるメモ

CentOS 7でDNSの設定を変える際に詰まったのでメモ.

CentOS 7で結構ネットワーク周りの設定方法が変わっているっぽい.
`/etc/resolv.conf` や `/etc/sysconfig/network-scripts/ifcfg-XXXX` を直接編集せず, `nmcli` コマンドで変更することが推奨されている.
というか `resolv.conf` を直接編集してもNetworkManagerに上書きされる. なんでやねん.

- インタフェースの名前や種別, 状態, 接続を表示する

```bash
# nmcli device
```

- DNSの追加

```bash
# nmcli connection modify <CONNECTION> ipv4.dns "<IPアドレス>"
```

- DHCPからDNSを自動で取得するのを無効にする

```bash
# nmcli connection modify <CONNECTION> ipv4.ignore-auto-dns yes
```

※ IPv6の場合は `ipv4` を `ipv6` にする.

- 変更を反映する

```bash
# systemctl restart NetworkManager
```

- 変更を確認する

```
# cat /etc/resolv.conf
```
もっと見るボタンの実装


記事などを読んでいて一番下に出てくる「もっと見るボタン」をつくってみます。
今回はもっと見るボタンを押すと6個ずつ要素が増えていく設定です。
<img width="544" alt="スクリーンショット 2019-03-09 20.31.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/265805/3ee30113-a748-b5b7-f9fd-6a6de5ae2afb.png">




```gemfile.
gem 'kaminari'
```
bundle installする


手を加える前のindexページです。

```index.html.erb
 <h2 class="heading">最新記事</h2>
=========================================
 <% @articles.each do |article| %>
  <div class = "article-box">
    <div class = "image">
      <%= link_to image_tag("#{article.image_url}",:class=>"image"), top_path(:id => article.id) %>
    </div>
    <h3 class="title"><%= link_to article.title , top_path(:id => article.id)%></h3>
    <p class="desc"><%= link_to article.article.truncate(50) , top_path(:id => article.id)%></p>
    <time class="date"><%= article.created_at.strftime("%Y-%m-%d") %></time>
  </div>
<% end %>
=========================================
```


点線部分切り取って_article_list.html.erbにいれます。


```_article_list.html.erb
<% @articles.each do |article| %>
  <div class = "article-box">
    <div class = "image">
      <%= link_to image_tag("#{article.image_url}",:class=>"image"), top_path(:id => article.id) %>
    </div>
    <h3 class="title"><%= link_to article.title , top_path(:id => article.id)%></h3>
    <p class="desc"><%= link_to article.article.truncate(50) , top_path(:id => article.id)%></p>
    <time class="date"><%= article.created_at.strftime("%Y-%m-%d") %></time>
  </div>
<% end %>
```

そして、中身がなくなってしまったindexページにrenderで_article_list.html.erbを呼び出します。
kaminariをいれたことによってlink_to_next_pageというヘルパーメソッドを使用することができます。（次のページへのリンクをレンダリングする）

```index.html.erb
 <h2 class="heading">最新記事</h2>
 <div id="article_lists"><%= render 'article_list' %></div>
 <div class="more"><%= link_to_next_page @articles, 'もっと見る', remote: true, id: 'view_more' %></div>
```

index.js.erbというjavascriptのファイル（Ajax）を作成し、escape_javascriptメソッドで文字列のエスケープ処理をします。

```index.js.erb
$('#article_lists').append("<%= escape_javascript(render 'article_list', object: @articles) %>");
$("#view_more").replaceWith("<%= escape_javascript( 
link_to_next_page(@articles, 'もっと見る', remote: true, id: 'view_more')) %>");
```

何個ずつ要素を表示させるか（今回は６刻み）

```article.rb
paginates_per 6
```

kaminariのpageメソッドを使用。

```articles_controller.rb
@articles = Article.where(status: :true).order(created_at: :desc).page(params[:page])
```







一通りこれで実装は完了ですが、もしこんなエラーが出たら
<img width="444" alt="スクリーンショット 2019-03-09 20.25.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/265805/df4fea48-b071-d83e-42f9-2e70fd83b618.png">




```gemfile.
gem "jquery-rails"
```
bundle installしてから以下二行を一番上に付け足す。
上にかかかなきゃ上手く読み込まれなくて動かない模様。

```application.js
//= require jquery　　←
//= require jquery_ujs　　←
//= require activestorage
//= require turbolinks
//= require_tree .
```
bundle install --path vendor/bundleと、bundle listとgem listの違いについて

# 動機

今日とある方（エンジニア歴約1ヶ月）とメンタリングをしていて、`bundle install --path vendor/bundle`がなんのためにあるのかとか、`bundle list`と`gem list`はどう違うのかなどが話題に上ったのでまとめようと思いました。

# 背景知識

最低限、bundlerを自身で使ったことがある方を想定して書かれています。

# 本編

## `bundle install --path vendor/bundle`について

### 結論

結論を先に言うと、`--path`オプションをつけるのは開発時においては必要ありませんが、異なるバージョンのgemが混ざるのが嫌な人はつけましょう。

### 目的

`--path`オプションをつける目的としては、プロジェクト下のディレクトリ（例えば`vendor/bundle`）にgemをインストールすることで、グローバルにインストールされたgemとbundlerが管理するgemを分離することが挙げられます。他にも、ctagsなどを利用する際にgemがプロジェクト下にインストールされていると便利である可能性があります。

### 背景

この`vendor/bundle`ですが、由来は`--deployment`オプションにあるようです。
https://bundler.io/v2.0/man/bundle-install.1.html#DEPLOYMENT-MODE に記載されているように、`bundle install --deployment`でインストールを実行した場合、`--path`の指定がないなら`vendor/bundle`にgemがインストールされます。
これを開発環境で模倣するのが先述の`--path vendor/bundle`の由来ということになりそうです。

### 問題点

`bundle install --path vendor bundle`は利点もありますが欠点もあります。
特に重大なのは、同じようなアプリケーション（特にRailsアプリケーション）を何個も並行して開発する場合に、同一のgemを各アプリケーション下に重複してインストールすることになってしまい、ディスク容量を圧迫する恐れがあるという点です。
`bundle install`のみでインストールを行う場合、グローバルにgemがインストールされ、以後はそちらのgemを単に参照するだけになるため、ディスク容量の面では効率的になります。

## `bundle list`と`gem list`の違いについて

### `bundle list`

`bundle list`コマンドは、「あるプロジェクトがbundlerによって管理されている場合に、そこで使用されているgemを一覧表示するコマンド」です。
ここで重要なのは、`bundle install`コマンドにどんなオプションを渡していても、ここで表示される内容は変わらないということです。
もちろん、そもそもbundlerを使っていない場合はこのコマンドは単にエラーになります。言い換えると、どのプロジェクトにいるか（ワーキングディレクトリがどこか）によって結果が変わります。

### `gem list`

`gem list`コマンドは、「グローバルにインストールされたgemを一覧表示するコマンド」です。
このコマンドはグローバルなコマンドなので、ワーキングディレクトリがどこであろうと結果は同じです。一方、`bundle install --path vendor/bundle`などでインストールされたgemについては表示されません。

### 両コマンドの違いと使い分け

違いは上に書いた通りですが、使い分けとしては、基本的にRailsアプリケーションの開発においては`bundle list`コマンドを使用することが多いと思われます。
一方、例えばtmuxinatorやforemanのようなコマンド利用が主目的のgemをインストールしているケースにおいては`gem list`を使うことも多いでしょう。これは単純にgemが今の環境にインストールかどうかを調べる一つの有力な方法が`gem list | grep 'GEM_NAME'`であるということによります。

## Rubyのバージョンについての余談

上に書いてある「グローバル」という単語は厳密には「あるRubyのバージョンについて」という但し書きが必要になります。
現代のRuby開発環境においては、`rbenv`や`chruby`を使って複数のRubyをインストールするのは珍しくありません。この場合、使用するRubyのバージョンをスイッチするとインストールされているgemについても変更されます。換言すると、`gem list`の結果はRubyのバージョンによって異なる可能性があります（`bundle list`の結果については、どのRubyバージョンであっても`bundle install`を実行してさえいれば結果は同じになります）。
また、現状複数のRubyに同じgemを同時にインストールする方法は特に用意されていないと思われます。一応、[rbenv-default-gems](https://github.com/rbenv/rbenv-default-gems)というものはありますが、事前に決められたものしかインストールできないので融通性に欠けます。

# さらに余談

rubygemsとbundlerは（かなり先の話になりますが）統合される計画もあるという話を聞きました。興味深いですね！

# 終わりに

今回書いた内容に間違いがありましたら編集リクエストを送ってください！
Mozilla deepspeech で speech-to-text する(English). アン・ハサウェイさんのスピーチの文字起こしにもチャレンジ

# 目的

機械学習ベースで高品質な感じの結果を得られつつも, お手軽に speech(音声データ)からテキストを生成(文字起こし. transcribe)したい.
(できればモバイル対応していそうなもので)
 
## wav2letter++

SoTA っぽい(2019 年 3 月時点) OSS な speech-to-text では, wav2letter++ がありますが, ビルドがめんどくさいです...

flashlight と wav2letter++ をビルドするメモ
https://qiita.com/syoyo/items/e30d1612dae28b05e5e1

モバイルで動かせるかは不明です(flashlight が依存している arrayfire は, モバイル対応版ありますが, mobile 版は closed で有償っぽい)

## DeepSpeech

https://github.com/mozilla/DeepSpeech

Mozilla が Baidu の DeepSpeech (論文)をベースに TensorFlow 実装してくれているものがあります. ありがたいですね.

```
$ pip install deepspeech
```

でお手軽に使えます. 素晴らしいですね.
tensorflow-lite に変換(+ Android 動作)もできるので, モバイルで動かすのもできる... はず.
(ただし english の pretrained model は 2GB くらいあるので注意) 

deepspeech は sampling rate 16kHz です. 違う sampling rate の wav を入力してもスケーリングして処理してくれますが, "結果がおかしくなるかもね" という warning が出ます.
  

## text に変換してみる.

LJspeech の LJ001-0001.wav を変換させてみました.

```
TensorFlow: v1.12.0-10-ge232881
DeepSpeech: v0.4.1-0-g0e40db6
2019-03-09 20:40:42.254208: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
Loading model from file models/output_graph.pbmm
Loaded model in 0.00833s.
Loading language model from files models/lm.binary models/trie
Loaded language model in 0.178s.
Warning: original sample rate (22050) is different than 16kHz. Resampling might produce erratic speech recognition.
Running inference.
Inference took 4.193s for 13.306s audio file.
printing in the only sense with which we are at present concerned differs from most if not from all the arts and crafts represented in the exhibition
```

Voila! いい感じに transcribe されました.
CPU でも, 13.3 秒の入力に対して 4.19 秒で処理しています.

deepspeech には nodejs のバインディングもあるので, うまくスクリプトを組めばリアルタイム or 逐次で speech-to-text できそうですね!

## アン・ハサウェイさんのスピーチを起こしてみる

いい感じに transcribe できるのを確認しましたので, 
マイ・インターン(原題は The Intern)のアン・ハサウェイさん

「マイ・インターン」アン・ハサウェイに学ぶ、大人可愛いオフィスファッション
https://matome.naver.jp/odai/2144524807974815301

のスピーチを文字に起こしたくなりますね!

international women's day でのスピーチを試してみます.

Anne Hathaway on International Women's Day
https://www.youtube.com/watch?v=wdw8KNmr2pc

結果はこちら.
(一応ビデオ全部(12 分)の文字起こし処理できましたが, 最初の数 term だけ抜き出します)

```
THANK YOU SO MUCH FOR THOSE WORDS FOR A PRESIDENT OF THE GENERAL ASSEMBLY UNITED NATIONS YOU IN DEPUTY SECRETARY GENERAL EXECUTIVE DIRECTOR ON WOMEN THE SINGERS LADIES AND GENTLEMEN WHEN I WAS A VERY YOUNG PERSON I BEGAN MY CAREER AS AN ACTRESS WHENEVER MY MOTHER WASN'T FREE TO DRIVE ME INTO MANHATTAN FOR AUDITIONS I WOULD TAKE THE TRAIN FROM...
```

Voala!

素晴らしいですね.

### Alignment してみると...?

ただ, この起こした文字で MFA(Montreal Forced Aligner)で LibriSpeech Lexicon でアラインメント処理しようとしたら未知の word があると warning が出ました. いくつか Lexicon に足りないものがあるようです.  deepspeech で使っている lexicon があればそちらを使ってみるのがよさそうです.

## TODO

* 他の speech-to-text ツールを試す(openseq2seq など)
* 日本語で学習ができるか検討してみる
* モバイルで動かす
* node.js あたりで逐次で speech-to-text web アプリを作成してくれる優秀な web ッ子若人を探す旅に出たい.
git check outで、ブランチの変更ができないとき


現在のブランチAから、移動したいブランチBへgit check outをしたところ、このようなエラーがでた。

```
error: Your local changes to the following files would be overwritten by checkout:
        ファイル名
Please commit your changes or stash them before you switch branches.
Aborting
```
**解決法**
---
「現在のブランチではコミットはしたくない」というときに。
`stash`で、コミットしていない変更を一時退避させ、ブランチの切り替えを行うことができる。

```
git stash
```
メッセージをつけて一時退避させたい時は。

```
git stash save “message”
```

`stash`そのほかのコマンド。

```
git stash list　　 #一時退避の一覧表示
git stash pop   #一時退避を戻す（stash popで、stashは破棄される）
git stash clear #一時退避しているものを全削除する
```
GR-ADZUKIでうさぎを光らせてみた #Lチカ #電子工作

ぽかぽかお昼寝びよりな3月9日
卒業式シーズンですね、ご卒業される皆さんおめでとうございます

春がきたのでうさぎをパリピっぽく光らせました、うさぎはかわいい🐰(３Dプリンタでまた生えてきてる)
見えないけどピンクの[がじぇるね](http://gadget.renesas.com/ja/)が春っぽい🌸

はんだ付けもちょっとずつ慣れてきて成長してる、といいなぁ

**光るうさきばん**
![41f39075f6824947a388cb5720d4aa88.gif](https://qiita-image-store.s3.amazonaws.com/0/124011/424945f3-f1e2-30e2-2f62-55506d39f6bf.gif)

![IMG_2549.JPG](https://qiita-image-store.s3.amazonaws.com/0/124011/f697b533-617b-e184-3e32-eed6e1fd1314.jpeg)

はんだめもめも
![IMG_2550.JPG](https://qiita-image-store.s3.amazonaws.com/0/124011/7fe68e3a-9539-c193-1a76-5ca051975dd0.jpeg)


コードのメモ

```c
/*
  Blink
  Turns on an LED on for one second, then off for one second, repeatedly.
 
  This example code is in the public domain.
 */
 
// Pin 23 has an green LED connected on most KURUMI boards.
// give it a name:
int led = 3;
int led2 = 2;


// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);     
 pinMode(led2, OUTPUT);  

}

// the loop routine runs over and over again forever:
void loop() {
  digitalWrite(led, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(70);               // wait for a second
  digitalWrite(led, LOW);    // turn the LED off by making the voltage LOW
  delay(60);               // wait for a second
  
  digitalWrite(led2, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(80);               // wait for a second
  digitalWrite(led2, LOW);    // turn the LED off by making the voltage LOW
  delay(90);               // wait for a second 
}
```

うさきばんふやしていきたいな

**生えるうさぎ**
![4d4d28a998c543b2adfbb458e6b764aa 2.gif](https://qiita-image-store.s3.amazonaws.com/0/124011/207e511f-d89e-e4b5-49bd-4d379d8dbaaa.gif)
個人的備忘録、laravelとnuxtを併用する時に参考にしたサイト

個人的な備忘録となっております。
申し訳ありませんが、
URLを参考にすれば思い出せるため、URLの記載のみとなっております。
[LaravelとNuxt.jsを同一レポジトリで管理するときの構成](https://techblog.scouter.co.jp/entry/2017/11/02/120748)
[composer updateの使い方を調べたくて参照](https://qiita.com/suke/items/770bccf8a43f9247daf5)
[CORS問題参照①](https://qiita.com/nunulk/items/0d50ac8cf7e16287f915)
[CORS問題参照②](https://medium.com/@KrishaWeb/cross-origin-request-blocked-error-in-laravel-5-5-a733232795e4)
[Route書き方](https://medium.com/@KrishaWeb/cross-origin-request-blocked-error-in-laravel-5-5-a733232795e4)
ダウンロードしたHTMLをエクセルで開く際の警告メッセージを表示させない

アメダスデータを保存し、エクセルデータで編集する。
ファイルを開く際に表示される、
*.cssがない、という
エラーメッセージを表示しないようにする。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/366114/1517b468-a347-6216-1b5e-67f733e14208.png)

f12で表示させて、必要なデータをダウンロードしておく。
git pushコマンドで起きたエラー

## エラー内容
Fork先（自分のレポジトリ）にpushしようとした時に起こったエラーがこちら

```
$ git push origin [開発ブランチ名]
 ! [rejected]        [開発ブランチ名] -> [開発ブランチ名] (fetch first)
error: failed to push some refs to '[git_url]'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
```

#原因
Hintのところを見ればわかるがこれが置きた原因は、
プルリクを送った後、GitHub上でconflictを解消したので
ローカルとリモートで内容が異なってしまっているらしい。
ローカルとリモートで差が出ているとpushできないとの事。
#解決法
①リモートとの差分を取ってくる

```
$ git fetch origin
```

②rebeseもしくはmergeで最新状態を反映させる

```
$ git rebase origin/[開発ブランチ名]
```
または

```
$ git merge origin/[開発ブランチ名]
```

そしてもう一度Push。以上。

##参考記事
https://www.softel.co.jp/blogs/tech/archives/3569
Go で関数に渡したポインタの値を変更するには

## TL;DR

https://play.golang.org/p/q6hv6IlUBsu

```go
package main

func change(s *string) {
  *s = "changed"
}

func main() {
  s := "hoge"
  change(&s)
  fmt.Println(s)
}
```

## 解説

Go ではポインタを扱えることができますが、 `&` や `*` をどうつけたらいいか、よくわからなくなってしまいがちです。
まずは一旦整理してみます。

### 構文

整理すると、2 種類の構文があるのではないかと思います。

#### 演算子として利用される場合

- `&` は値型変数からポインタ(メモリのアドレス)型変数を取得する演算子
- `*` はポインタ型変数から値型変数を取得する演算子

```go
var tmp string = "tmp"

// ポインタ
tmpPointer := &hoge
// 値
tmpValue := *tmpPointer

fmt.Println(tmpPointer) // 0x40c128
fmt.Println(tmpValue)   // tmp
```

#### 型として利用される場合

`*` は任意の型のポインタ型

```go
// ポインタ型
type stringPointer *string
```

### 回答

ここでは関数にポインタ型を渡して、ポインタが指す値を変更したいと考えています。
状況的には、以下のような形です。

```go
func change(s *string) {
  // 値を変換する。
}
```

##### 補足
そもそも、なぜポインタ型を渡す必要があるかですが、値型の場合は関数内での変更が関数外へ伝搬しないためです。つまり、関数内で引数の値をいくら変更しても、関数の呼び出し元には一切影響しません。
これは、Go の引数の受け渡し方が値渡し (値をコピーして関数に渡す方法) に由来します。

--- 
実際の変更コードですが、以下になります。

```go
func change(s *string) {
  *s = "changed"
}
```

まず、関数の引数の `s` ですが、ポインタ型になっています。Go の関数は値渡しで引数をわたすので、`s` はポインタ型変数のコピーになっています。ですが、ポインタ型の変数の中身(アドレス)がコピーされただけなので、ポインタが指す先の値は同じになっています。
つまり、関数内でポインタが指す先の値を変更することで、値を変更することができます。

実際の値取得ですが、変数 `s` はポインタ型のため、 `*` 演算子をつけることで取得できます。取得した値に "changed" という新しい文字列を代入することで、値を変更することができました。

## 所感

とても基礎的なところですが、よくわからなくなるためまとめてみました。
参考になりましたら、嬉しいです。

## 参考

- [A Tour of Go](https://tour.golang.org/moretypes/1)
- [Go のポインタ - はじめての Go 言語](http://cuto.unirita.co.jp/gostudy/post/pointer/)
- [Go で学ぶポインタとアドレス - Qiita](https://qiita.com/Sekky0905/items/447efa04a95e3fec217f)