OmniAICreator/Qiita-1.07M huggingface dataset:
SQL基本

テーブル：　　シート
カラム：　　　行
レコード：　　列
フィールド：　一つ一つの要素

![160425_DBword_04.png](https://qiita-image-store.s3.amazonaws.com/0/290512/928ea587-0603-2df4-5430-a8bf2c06ab01.png)

基本構文
select X(カラム名)
from Y(テーブル名)
where Z(条件式);

▶️Yテーブルから、Zの条件でXカラムを抽出する。

よく使う条件式
・order by (カラム名) desc(降順),asc(昇順)
 select... from... order by...;
・where (カラム名) like '(フィールド名)%';　←前方一致のワイルドカード
 select... from... where ... like...;

複数のカラム条件　：　AND演算子
select... from...
where (Aカラム)　= 'C'
AND (Bカラム) = 'D';
　▶️Aカラム＝C　かつ　Bカラム＝C　


同じカラムで複数条件
select... from...
where (Aカラム)
in('X', 'Y');
　▶️Aカラム＝XまたはY

重複したデータを省く
 select distinct(Aカラム)
 from...
　▶️Aカラムから重複したデータを省く。

レコードを削除する
delete
from...
where (Aカラム) = 'X'
　▶️Aカラム = X　のレコードを削除する。
Docker Windows Container で PowerShell　を実行する

Docker Windows Container で PowerShell　を実行する

やってみた時のメモ。

# 参考資料

+ [Get started with Docker for Windows](https://docs.docker.com/docker-for-windows/)
+ [Windows Containers – Getting started – A step by step guide, walkthrough, tutorial](https://blogs.msdn.microsoft.com/allthingscontainer/2016/09/15/windows-containers-getting-started-a-step-by-step-guide/)
+ [Windows コンテナを Compute Engine で動かす ](https://cloudplatform-jp.googleblog.com/2018/05/how-to-run-Windows-Containers-on-Compute-Engine.html)

# 環境

## Host

WindowsServer2016 になります。

```powershell
PS C:\Windows\system32> Get-WmiObject Win32_OperatingSystem


SystemDirectory : C:\Windows\system32
Organization    : Amazon.com
BuildNumber     : 14393
RegisteredUser  : EC2
SerialNumber    : 00376-40000-00000-AA753
Version         : 10.0.14393
```

# やってみる

以下を参考できるかやってみます。

[Windows コンテナを Compute Engine で動かす ](https://cloudplatform-jp.googleblog.com/2018/05/how-to-run-Windows-Containers-on-Compute-Engine.html)

```powershell
PS C:\Windows\system32> docker pull microsoft/powershell:6.0.1-nanoserver-1709
6.0.1-nanoserver-1709: Pulling from microsoft/powershell
a Windows version 10.0.16299-based image is incompatible with a 10.0.14393 host
```

早速エラー。
これは Host と pull するイメージが合っていない為にエラー。

これは以下に対応表がある。

[Windows Container Version Compatibility](https://docs.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility)


今回、Host OS が「Windows Server 2016 Builds: 14393.」にも関わらず、コンテナOSが「Windows Server version 1709 Builds 16299.」を選択しようとしてエラーとなった。

microsoft/nanosserer には Supported Windows Server 2016もあるのでこちらを利用する。

```powershell
PS C:\Windows\system32> docker pull microsoft/nanoserver
```

成功。
次にブログの記事にあるようにコンテナ内で PowerShell スクリプトを作成して `docker commit`して確認する

```powershell
# powershell commnad を指定しないと cmd がデフォルトで起動して、Add-Content が使えなかった
PS C:\Windows\system32> docker run -it microsoft/nanoserver powershell

Add-Content C:\Users\Public\helloworld.ps1 'Write-Host "Hello World"'

exit

# 変更を commit してイメージを作る
PS C:\Windows\system32>docker commit 5793026e326e poyo/helloworld
sha256:7d3b6bdb33202b100ae79974e985626cc4ad2768f6004c0d02f187af157b94d5

# 実行してみる
PS C:\Windows\system32> docker run --rm poyo/helloworld powershell c:\Users\Public\helloworld.ps1
Hi

```

OK.
次に Dockerfile を作る

```Dockefile
FROM microsoft/nanoserver
COPY hogefuga.ps1 C:/Users/Public/
```

これをビルド

```powershell
PS C:\Windows\system32> d docker build -t hogefuga/poyo .
ERRO[0000] Can't add file \\?\C:\Users\Administrator\AppData\Local\Application Data to tar: readlink \\?\C:\Users\Admini
・・・
```

エラーになる。

[Build with PATH](https://docs.docker.com/engine/reference/commandline/build/#examples)

>This example specifies that the PATH is ., and so all the files in the local directory get tard and sent to the Docker daemon. 

なるほど。
特にフォルダなどを作らずビルドしていたので、ローカルディレクトリのファイル群を送信しようとして問題になったようにみえる。
任意のフォルダを作成し、Dockerfile と ps1 ファイルのみであればビルドに成功した。

```powershell
PS C:\Windows\system32> docker run -d hogefuga/poyo powershell c:\Users\Public\hogefuga.ps1
```
匿名Proxyを1つ0.0016ドルで作成

![children-593313_1920.jpg](https://qiita-image-store.s3.amazonaws.com/0/293044/2a7557b3-e953-093a-fc8e-bb30ac904edf.jpeg)
私は日本から見る事ができない海外サイトを見るために、無料で公開されているプロキシを使用した事があります。しかしほとんどの無料プロキシはパスワードなどの個人情報を抜き取るために公開されています。通信速度はものすごく遅いです。

0.0016ドルというのは現在の価格で一番安いAmazon EC2のスポットインスタンスという物で1時間あたりの価格になります。一ヶ月継続して使うと30日×24時間×0.0016ドルなので1.152ドルになります。ひとつのインスタンスにつきCPUのコア数が2つと500MBのメモリがついているのでこの価格は安いと思います。最近公開されたT3.nanoというもので、従来のT2.nanoインスタンスより安く、さらに性能がいい物となっています。

Proxy作成にAmazon Web Servicesのアカウントが必要になります。登録されていない方は[こちら](https://aws.amazon.com/jp/)から登録してください

動作確認済み環境
・Windows10 64bit
・Ubuntu16.04 64bit

プログラムからAWSを操作するためにアクセスキーが必要なので作成します。[https://console.aws.amazon.com/iam/home#/users](https://console.aws.amazon.com/iam/home#/users)に移動しユーザーの追加をクリックします。

![create_keys.png](https://qiita-image-store.s3.amazonaws.com/0/293044/66b92e7c-cae1-62cb-25d0-da63c1d95038.png)

ユーザー名に「proxy-server」と入力してプログラムによるアクセスにチェックを入れて次のステップをクリックします。

![add_user.png](https://qiita-image-store.s3.amazonaws.com/0/293044/5117559c-fa44-a8c5-b3d1-f6173bfa758c.png)

既存のポリシーを直接アタッチを選択して、ポリシーのフィルタに「AmazonEC2FullAccess」と入力してチェックボックスにレ点マークをつけます。次のステップをクリックします。

![Screenshot from 2018-09-18 14-48-51.png](https://qiita-image-store.s3.amazonaws.com/0/293044/fb78fbcb-dc30-cc17-0ef3-de681ec339b7.png)

「ユーザーの作成」をクリックしてユーザーを作成します。

作成された「アクセスキーID」と「シークレットアクセスキー」を控えてください。

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/293044/e64d892f-786b-1c5a-4869-53768cdd65ce.png)

これで準備は整いました。

#無料ダウンロードはこちらから
[匿名プロキシ作成ソフトウェア無料版](https://shop.oldjpg.com/product/%E5%8C%BF%E5%90%8D%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E4%BD%9C%E6%88%90%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E7%84%A1%E6%96%99%E7%89%88/)
ROSでDSO-SLAM①

##目的
　ROSでDSO-SLAMを動かす．
##環境
OS　　 　 　Ubuntu16.04LTS　64bit 日本語版
メモリ　　 　8GB
プロセッサ 　Intel(R) Core(TM) i5-3340M CPU 

##ROSのインストール
公式サイトに従い，インストールします．
[ROS.org/kinetic/Installation/Ubuntu](http://wiki.ros.org/kinetic/Installation/Ubuntu)
 
```
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
$ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
$ sudo apt update
$ sudo apt install ros-kinetic-desktop-full
$ sudo rosdep init
$ rosdep update
$ echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
$ source ~/.bashrc
$ sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential
```
##ROSのワークスペースを作成
ROSのチュートリアルに従い，作成します．
[http://wiki.ros.org/ROS/Tutorials/InstallingandConfiguringROSEnvironment](http://wiki.ros.org/ROS/Tutorials/InstallingandConfiguringROSEnvironment)

```
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws/
$ catkin_make
```
##DSO-SLAMをインストール

DSOに必要なPagolinをインストールし，DSO本体をインストールします．

```
$ sudo apt install libsuitesparse-dev libeigen3-dev libboost-all-dev
$ sudo apt install libopencv-dev
$ sudo apt install libglew-dev cmake
$ git clone https://github.com/stevenlovegrove/Pangolin.git
$ sudo apt install cmake libglew-dev
$ mkdir Pangolin/build && cd Pangolin/build
$ cmake ..
$ cmake --build .
$ git clone https://github.com/JakobEngel/dso.git
$ cd dso
$ mkdir build
$ cd build
$ cmake ..
$ make -j4
```
##dso_rosをインストール
[公式のリポジトリ](https://github.com/JakobEngel/dso_ros/tree/catkin) からdso_rosを zip ファイルでダウンロードします(branchでcatkinを選択しても上手くcloneされなかったため）．
ダウンロードしたファイルを ~/catkin_ws/src に移動します．

```
$ cd ~
$ echo "export DSO_PATH=/home/user/dso" >> ~/.bashrc
$ source ~/.bashrc
$ cd ~/catkin_ws/src
$ unzip dso_ros-catkin.zip
$ cd ~/catkin_ws
$ catkin_make
$ source devel/setup.bash
```
次の記事ではUSBカメラを接続し，実際に動かしてみます．
ある PowerShell の起動時だけ、スクリプトの実行を `%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy RemoteSigned` のようにして許可する方法

![LGTM](https://media.giphy.com/media/diUKszNTUghVe/giphy.gif)

## 確認

```powershell
PS C:\Users\ジャバ> Get-ExecutionPolicy -list

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process    RemoteSigned       # <- これ
  CurrentUser       Undefined
 LocalMachine       Undefined
```

## 参考

* [About Execution Policies \| Microsoft Docs](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_execution_policies?view=powershell-6)
* [PowerShell\.exe Command Line Help \| Microsoft Docs](https://docs.microsoft.com/en-us/powershell/scripting/core-powershell/console/powershell.exe-command-line-help?view=powershell-6)
* [Get\-ExecutionPolicy](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.security/get-executionpolicy?view=powershell-6)
全くの素人が考える量子論とＡＩの似ているところ

これまでのコンピュータ
　⇒　ＡとＢを与えるとＣが返ってくる。
　⇒　論理的

ＡＩ
　⇒　ＡとＢを与えると９０％の確率でＣが返ってくる。
　⇒　統計的

量子論の考え方
　⇒　ＣがＣである確率は９０％
　⇒　ＣがＣであることを判定する測定器の精度（確率）による


では、論理的なコンピュータと統計的なコンピュータ、どっちが正確でしょう？
例えば、ＡとＢの組み合わせが、数億通りあった場合
そのすべてのルールをロジックに組み込んだとすると
そこに潜むバグの確率は規模に対して指数関数的に増加します。
また、必要な組み合わせを見逃す確率も指数関数的に増加します。

ＡＩの深層学習で実装した場合も
結局はＣであることの判定は人間が決めなければならないので
いくら学習しても、人間が不正解だと判断すれば、これまでの学習成果をリセットして
人間が好む結果を出すように仕向けることになります。

つまり、論理的にしても統計的にしても人間が介在する以上どっちが正しいかは五十歩百歩


ただ、ＡＩにしても、結局は人間が好まない結果を出すものはリセットされるわけですから
すべてを学習によって判断させるのではなく
人間と同じように、学習では得られない元々ある本能のようなものは書き換え不可能なＲＯＭとして
かならず実装するよう法律で決めるとかしてほしいですね。
Debian Stretch + systemd-nspawn でコンテナ環境を立ち上げる

# systemdのバージョンを確認する

```shell-session
$ systemd --version
systemd 232
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN
```


# セットアップ

- ホストは Debian 9.5 (stretch) on SakuraVPS
- ゲストも Debian 9.5 (stretch)
- コンテナ名として`stretch`を用いる

```sh
sudo apt-get update

# systemd-nspawnとdebootstrapをインストールする
sudo apt-get install systemd-container debootstrap

# ホストのsystemd-networkdを有効化して起動する
sudo systemctl enable systemd-networkd
sudo systemctl start systemd-networkd

# コンテナのrootfsをつくる
# コンテナにdbusがはいってないとmachinectlコマンドが使えないので、同時にいれる
sudo debootstrap --include=dbus stretch /var/lib/machines/stretch

# コンテナを起動する
sudo systemctl start systemd-nspawn@stretch.service

# ホスト起動時にコンテナを自動起動する設定
sudo systemctl enable systemd-nspawn@stretch.service

# コンテナのネットワークの初期設定を行う
sudo machinectl shell stretch /bin/systemctl enable systemd-networkd
sudo machinectl shell stretch /bin/systemctl start systemd-networkd

# コンテナのrootシェルを開く
sudo machinectl shell stretch /bin/bash
```

# NAT（インターネット -> コンテナ）の設定

コンテナの中で動かしているサービスを外部に公開するには、ポートのマッピングが必要。
宛先NAT（DNAT, Destination NAT）というらしい。
`systemd-nspawn`コマンドでコンテナを起動する場合は`--port`オプションでできるが、`systemd-nspawn@.service`でコンテナを自動起動する場合は、[systemd.nspawn](https://www.freedesktop.org/software/systemd/man/systemd.nspawn.html)で設定するのがよい模様。

## 例: ゲストのTCP:80をホストのTCP:8080で公開する

```systemd:/run/systemd/nspawn/stretch.nspawn
[Network]
Port=8080:80
```

# ハマったポイントとか

- 最初Ubuntuでやろとしていたが、パケットフィルタリングの初期設定（FORWARDチェインがデフォルトでDROP）のせいでハマった
- ネットワークが疎通しない場合は `sudo iptables -F; sudo iptables -F -t nat` でいちどルールを初期化してみるとよいかも
- systemd-nspawn自体は、IPMasqueradeを自動的に設定するような設定ファイルがデフォルトではいっているので、ホストとコンテナでsystemd-networkdが起動していて、かつ余計なフィルタさえなければ、ネットワーク周りは特になにも設定しなくても外部と通信できるようになっている


# 既知の問題

- `/var/lib/machines`からシンボリックリンクを張ったらデプロイ時のダウンタイム短くしたりフォールバックが簡単にできるんじゃね？と思ってやってみたらコンテナの起動に失敗した。[チケット](https://github.com/systemd/systemd/issues/2001)によると、[v233](https://github.com/systemd/systemd/milestone/10?closed=1)で修正されているようだが、Stretchのsystemdはv232だった、おしい
赤外線リモコンを解析してネットワーク経由で送信する！- その4「回路とESPr_Developerを使うための設定について」

前回は[送信用の関数](https://qiita.com/amosoisin/items/a1878284d5f49fa6b17a)を作ったので、今回からいよいよESPrDevelopperを使っていきたいのですが、その前に準備をしなくてはいけません。

# 回路設計
今回使うLED(LIR053)の[データシート]((https://www.marutsu.co.jp/contents/shop/marutsu/datasheet/LIR053.pdf))より

|Parameter|Maximum Rating |Unit|
|:-:|:-:|:-:|
| Peak Forward Current(Pulse width = 10us 1% duty cycle)  | 1 | A |

今回の信号はパルス幅は約8.8us、周期は26usのためデューティー比34%とデューティー比がオーバーしているため1Aも流せない（流す必要も無い)ので、500mAほどで計算します。トランジスタは[PN222](http://akizukidenshi.com/download/ds/fairchild/PN2222.pdf)、h_(FE)=100、V_{CE}=0.1, V_{BE}=0.7ほどと考えて(情報が少なくわからなかった、どう読めばよいかわかる人がいたら教えてほしい)、そして電源は1.5×3Vの電源を使用し、ESPr_Developerからは3.3V供給されると考えた。
![TransistorIRLED_回路図.png](https://qiita-image-store.s3.amazonaws.com/0/292890/14ec0cd0-a40e-2ada-51e9-a18a858018fa.png)

抵抗値は、

```math
R_c = \frac{4.5-1.2-0.1}{500mA} = 6.4\Omega
```
10Ωの抵抗しか持っていないので、5Ωとして計算すると、

```math
I_c = \frac{4.5-1.2-0.1}{5\Omega} = 640mA
```
と非常に大きいが、まあ大丈夫だろう、、、
またR_Bの値は、

```math
I_B \times h_{FE} > I_C\\
　　\\
R_B < \frac{3.3-0.7}{640mA}\times 100 \simeq 406\Omega
```
よって330Ωを使う。

またESPr_Developerの電源はmicroUSBを使いたいが、これも電池から供給したい。
そのためにmicroUSBケーブルを被覆して電源（赤）とGND（黒）のケーブルとワイヤを接続してブレッドボード上から取ってきた。

#ESP8266を使うためのArduinoIDEの設定
[Arduino IDE に Stable ( Staging )版 ESP8266 ボードをインストールする方法](https://www.mgo-tec.com/esp8266-board-install01-html)
以上を参考に設定した。

#SPIFFSの設定
ESPr_Developerでファイルシステムを使うために
[ESPr DeveloperでSPIFFSファイルシステム
](https://www.pentacreation.com/blog/2017/12/171210.html)
以上を参考にファイルをアップロードできるようにしました。

#次へ
次回はESPr_Developerを使いネット経由で送信できるにします。
【随時更新】vim参考記事まとめ

#　概要

vimの参考記事をまとめておきたかったため、投稿

#　まとめ

##[Vim 8.0 Advent Calendar](https://thinca.hatenablog.com/entry/vim8-advent-calendar) - thinca (id:thinca) さん
### 対象

vimscriptを初めて書く人が全体像を把握したい人

### 内容

Vimの関数の扱い方などについて一通りまとまっている。個人的には、すごく参考にさせていただいた。
QiitaのAdvent Calendar(2016/12)を参照しても良い(記事自体はそちらのまとめなので)。

## [vimのおすすめしたい小技集](https://qiita.com/y_hideshi/items/80c85e46360fbb0dbf91)

### 対象

vimの基本操作で使いやすいものが知りたい人

### 内容

vimの小技的なものは無数にあるが、業務で使いやすいものはやっぱりある。
個人的には、初めて知ったやり方もあってvimによりハマるきっかけの一つに・・・

## [Hack #17: Vimを終了することなく編集中ファイルのファイル名を変更する](https://vim-jp.org/vim-users-jp/2009/05/27/Hack-17.html)

### 対象

vimscriptを書き始めてファイル名のあたりを変更したくなった人

### 内容
ｋ近傍法の原理とpythonでの実装

# 内容
###・ｋ近傍法とは
###・pythonでの実装

#目標

###・正しさより、イメージしやすさ重視での理論の説明
###・可視化するために二次元データで実装

#ｋ近傍法とは
###ざっくりいうと・・・
####データの集まりのうち、異常度を調べたいデータをｐとする。
####ｐを中心とする円を考える。円を少しずつ大きくしていき、円に含まれる点の数がｋ個になったらその時の半径をεとする。
####これがｋ近傍法の基本的な考え方。
####ｐが正常なデータの集まりから離れているとき、ｋは小さくなり、ｐの周りに正常なデータが多く存在するとき、ｋは大きくなる。
![Ｋ近傍法の原理.jpg](https://qiita-image-store.s3.amazonaws.com/0/265548/4de43386-0b93-983e-ca8e-6d799de25d35.jpeg)


####ｋを決めてデータを含むｐを中心とする円の半径の最小値εの大きさで異常度を判定してもよい←今回はこれ

###局所外れ値や、多クラスなどの機械学習に使われるｋ近傍法の応用的な理論はもう少し複雑ですが、とりあえず簡単な理論で実装しましょう。

#pythonでの実装
##環境
###・python3.6
###・windows10

##データの生成
####numpy　の乱数で二次元データを作成
![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/265548/b9b208ee-9fbb-beda-e792-4cb3d5aac633.png)

####このまとまりから外れているデータを識別したい。

####先ほどの原理をそのままコードにする。

```python:knn.py
class KNN2d:

    def knn2d(self, x, y, k):
        num = x.shape[0]
        ipsilon_list = []
        for j in range(num):
            l_list = [] #k番目のデータに対するその他のデータの距離
            for i in range(num):
                xl = x[i] - x[j]
                yl = y[i] - y[j]
                l2 = (xl) ** 2 + (yl) ** 2
                l = l2 ** 0.5
                l_list.append(l)
            l_li = np.array(l_list)
            l_li = np.sort(l_li)
            ipsilon_list.append(l_li[k])
        abnormals = np.array(ipsilon_list)

        return abnormals/10


    def abnormal_decision(self, abnormals, treshold):
        result_list = []
        num = abnormals.shape[0]
        for i in range(num):
            abnormal = abnormals[i]
            if abnormal > treshold:
                result_list.append(i)
        return result_list

```

##判定結果
![Figure_2.png](https://qiita-image-store.s3.amazonaws.com/0/265548/4187cfcf-ded2-86d4-03b5-13044aa73f95.png)


####離れたところにあるプロットをおおむね識別できた。

####閾値εを手動で設定しないといけないなど、実用するには改良しないとだけど、イメージはつかめた。
Decentralandで仮想世界を構築する（その１）

# Decentralandとは
Decentralandとは、VR x Ethereumブロックチェーン技術を活用した、非中央集権型メタバース(仮想世界)を構築するためのプラットフォームです。
ユーザーはLAND(土地)と呼ばれる仮想空間内で自由に建物を建てたり、ショップを開いたり、マルチプレイゲームを楽しんだりすることが可能になります。決済はMANAという通貨（トークン）を使って行われ、そのやり取りはすべてEthereumブロックチェーン上に記録されるため、基本的に管理者不在で仮想世界が運用されていくことになります。

去年行われたICOでは2,400万ドルの資金をわずか35秒で調達し、ICOの資金調達記録を塗り替えたという[記事](http://thebridge.jp/2017/11/vr-startup-24m-35-seconds-ico)もあり、現在非常に注目されているプロジェクトです。

公式サイト
https://decentraland.org/

コチラの動画で雰囲気が掴めるかもしれません。
[![スクリーンショット 2018-09-19 1.08.00.png](https://qiita-image-store.s3.amazonaws.com/0/73643/604d2313-f89b-9138-f8ea-c2fa0ea03a94.png)](https://www.youtube.com/watch?time_continue=39&v=-HmXrOTEmxg)

# この記事で書いていくこと
この記事では主に開発者視点からDecentralandを覗いていきたいと思います。
Decentraland SDKを使ってLAND(土地)上に実際にコンテンツを作っていく過程を記事にし、最終的には自分の作ったゲームをデプロイするところまで書いていければと思います。

※ Decentraland SDKは2018.9現在、まだアルファ版のため今後APIが変更されることはありそうです。その場合はできる限り記事を更新していくつもりではおります。

# アーキテクチャ
コンテンツの開発に入る前にざっと全体のアーキテクチャを把握しておきたいと思います。
まず前提として、DecentralandはWebの技術を使って実装されています。
例えばVR空間の実装はWebVRで行なっていくため、Javascriptの知識が必要です。（実際にはTypescriptを使うのですが）
また、マルチプレイ用のリアルタイム通信部分(P2P)ではwebRTCが利用されています。
以下の図を見てください(ちょっと見辛いですが)。これは[whitepaper](https://decentraland.org/whitepaper.pdf)から抜粋しています。

<img src="https://qiita-image-store.s3.amazonaws.com/0/73643/6a186d1d-6e89-2d6c-a614-42cc69e94b77.png" width="500">

この図から分かるように、Decentralandは3つのレイヤーから構成されています。
### 1.Consensus layer
スマートコントラクトによってEthereumネットワークと接続するレイヤーです。商品の売買や、ゲーム内報酬の付与等でMANAトークンのやり取りが発生する際はこのレイヤーで行われます。また、（x、y）座標におけるLANDの所有権の参照もここで行われます。

### 2.Content Distribution Layer
コンテンツおよびアセットファイルを配信するレイヤーです。必要になる3Dデータ(メッシュ・テクスチャ)に加え、楽曲データなども含まれます。配信には[IPFS](https://ipfs.io/)(P2Pのハイパーメディア分散プロトコル)を利用します。

### 3.Real-Time Layer
ユーザーがP2P通信によってやり取りを行うレイヤーです。(中央サーバが存在しないため)
P2P接続の際はSTUNなどの仲介サーバが必要になりますが、これはLAND所有者か第三者が用意する必要がありそうです。

以上がざっくりとした概要です。
次の記事から実際にSDKを導入し、コンテンツを作って行こうと思いますので、上記レイヤー部分についての具体的な実装についてはその都度触れていきます。

[その２](https://qiita.com/shiruco/items/4dd80a0c670c8f8696c3)へ続く..

# 余談1: 土地の購入について
LAND(土地)の購入は下記リンクから行えます。
購入にはMANAトークンが必要なので、購入したい方はまずはMANAをゲットしてください。([Binance](https://www.binance.com/)で購入できるようです)

マーケットプレイス
https://market.decentraland.org/

LANDはパーセルという区画単位で売られており、人気エリアにいくほど高くなっています。いま一番安い土地でも10,100MANA = 686USDなので約7万円しますね。とても高価なので私もまだ買えてません。将来的には土地のレンタルなどもやってくれると嬉しいのですが。。ちなみにLANDがなくても開発自体はできますのでご安心ください。
<img src="https://qiita-image-store.s3.amazonaws.com/0/73643/9c562d08-4d32-d53e-51f4-a50fc6a88181.png" width="500">

# 余談2: Discordへの参加について
Decentralandに興味を持たれたら、Discordチャンネルがありますのでそちらへジョインしてみるといいかもしれません。毎日活発に意見交換が行われています。日本人の方がまだまだ少ないので是非。

Decentraland Discord
https://discordapp.com/invite/9EcuFgC
赤外線リモコンを解析してネットワーク経由で送信する！- その3「信号送信」

前回の[信号解析](https://qiita.com/amosoisin/items/ad09f18b4f27a8ff0a69)で得られた「Tの値」、「リーダー信号の長さ」、「16進数の値」を得たので、それを送信する関数を作って行きたいと思います。

#送信までの流れ
1. まず16進数から2進数へと変換する。
2. 次にその値に応じてON時間とOFF時間を導出し、その先頭にリーダー信号をつける。
3. その時間に沿ってLEDを光らせる。

# 16進数から2進数へと変換
意外と難しかった。。。もっと良い方法があるかもしれないがこれでうまく動いたため採用
1. 16進数の1文字ごと取り出し、2進数へ変換
2. それぞれをくっつける
3. 先頭bitから精査し"1"が出てくるまで消去、その"1"も消去
4. 完成!!

#ON,OFF時間の導出とリーダー信号の付与
ここは解析の逆をすればいいので省略

#導出された時間に沿ってLEDを光らせる
[Arduinoで赤外線リモコン信号を発信する](https://www.erestage.com/arduino/arduino-send-remo/)を参考に作りましたが、信号の周期は1/(38k) = 26usとなり、ON時間中はずっと光らせるわけではなく、約33%だけ光らせるので、8.7us光らせることで送信可能です。

#送信用の関数
```c:sendSignal
#define IRSEND_PIN 13
int last = 0;
unsigned long us = micros();
int base_time = 45;                  //前回求めたT
int leader_usec_on  = base_time*8;   //前回求めたリーダーのON時間
int leader_usec_off = base_time*4;   //前回求めたリーダーのOFF時間
int data[200];

void sendSignal(String hexSignal){ //16進数の信号を受け取る
  initializeSignal();
  Serial.println(hexSignal);
  generateSignal(hexSignal);
  int dataSize = arraySize();
  for (int cnt=0; cnt<dataSize; cnt++){
    Serial.print(data[cnt]);
    Serial.print(",");
    unsigned long len = data[cnt]*10;   // 10us単位で
    us = micros();
    do{
      digitalWrite(IRSEND_PIN, 1-(cnt&1));  // cnt偶数：ON, 奇数:OFFのまま
      delayMicroseconds(8.8);     // 38kHz
      digitalWrite(IRSEND_PIN, 0);
      delayMicroseconds(17.5);
    }while( long(us+len-micros()) > 0);
  }
  Serial.println();
}

void initializeSignal(){
  for (int i=0; i<sizeof(data)/sizeof(data[0]); i++){
    data[i] = 0;
  }
}

int arraySize(){
  int size = 0;
  while(data[size] != 0) {
    size++;
  }
  return size;
}

void generateSignal(String hexSignal){
  String binSignal = hexToBin(hexSignal);
  data[0] = leader_usec_on;
  data[1] = leader_usec_off;
  int j = 2;
  for(int i = 0; i < binSignal.length(); i++){
    data[j]   = base_time;
    data[j+1] = (int(binSignal[i]) == 48/*0*/) ? base_time : base_time*3;
    j+=2;
  }
}

String hexToBin(String hexSignal){
  String binSignal;
  int dec;
  char c_hex;
  for (int i = 0; i < hexSignal.length(); i++){
    c_hex = hexSignal[i];
    dec = (c_hex >= '0' && c_hex <= '9') ? (c_hex - '0') : (tolower(c_hex)-'a'+10);
    binSignal += decToBin(dec);
  }
  binSignal = deleteBit(binSignal);
  return binSignal;
}

String decToBin(int dec){
  String bin;
  int pad_num = 0;
  for (int i = 0; dec > 0; i++){
    bin = String(dec % 2) + bin;
    dec /= 2;
  }
  pad_num = 4-bin.length();
  for (int i = 0; i < pad_num; i++){
    bin = "0" + bin;
  }
  return bin;
}

String deleteBit(String binStr){
  while (binStr[0] == '0'){
    binStr = binStr.substring(1,binStr.length());
  }
  binStr = binStr.substring(1,binStr.length());
  return binStr;
}
```
#次に
次回は[回路とESPr_Developerを使うための設定](https://qiita.com/amosoisin/items/c4ee1c1896f94fc23553)についてです。
viveでトラッカーを増やす

VTuber用に、足をトラッキングしたくなったとき。

・Trackerを設定する
　HMDと両手を使う場合は、ドングルを用いる必要あり。
　ドングルをさしたのちに、Trackerのスイッチを入れると、
　SteamVR上で自然に王冠マークがトラッキングされるようになる。

・SteamVRPlugin のCameraRigのプレハブを入れる。
　①手のコントローラーをduplicateしてRename
　②CameraRig本体についているscriptでObjectの数を増やす。
　　(増やすトラっカーの数だけ)

以下の記事を参考
http://vrchatjp.playing.wiki/d/%A5%D5%A5%EB%A5%DC%A5%C7%A5%A3%A5%C8%A5%E9%A5%C3%A5%AD%A5%F3%A5%B0
http://hinzka.hatenablog.com/entry/2017/05/08/013337
Fastly 前提で設計したほうがいい理由

[Ginza.rb 63th](https://ginzarb.doorkeeper.jp/events/79974) で「新規開発で Fastly を使おうと思っている場合、最後に Fastly を入れるのではなく、最初から Fastly 前提で設計したほうがいいですよ」という話をチラッとしたんだけど、終了間際で時間も残っていなくて言葉足らずになってしまったので文章化しました。最初から Fastly 前提で設計すべきと思う理由は以下の3点です。

(1) サイドバーなど、メインのコンテンツとライフサイクルが異なるコンポーネントは非同期にすべきだから
(2) バックエンドのキャッシュ（例えば Rails の MemCacheStore など）はそもそも不要になる可能性があるから
(3) アクセスランキングやアクセスカウンタを作る場合、発想を根本的に変える必要があるため

## サイドバーなど、メインのコンテンツとライフサイクルが異なるコンポーネントは非同期にすべきだから

例えばウェブメディアを作っていて、記事の本文の部分も、サイドバーも Fastly でキャッシュしているとします。サイドバーには「人気の記事」といった感じで記事のアクセスランキングが表示されているものとします。記事の本文の部分は、本来その記事自体が更新されない限りキャッシュを purge する必要はないですが、サイドバーのアクセスランキングは1時間に1回更新されるものとします。ページ全体を丸ごとキャッシュしてしまうと、サイドバーのアクセスランキングが更新される度に、記事ページのキャッシュを丸ごと purge することになります。1時間に1回、アクセスランキングが更新される度に、すべての記事ページのキャッシュを purge するとこになるため、origin に無駄なリクエストが飛びます。なのでサイドバーなどメインのコンテンツとライフサイクルが異なるコンポーネントは非同期で取得するなど、何かしらの考慮をしたほうが良いです。

## バックエンドのキャッシュ（例えば Rails の MemCacheStore など）はそもそも不要になる可能性があるから

これも要件次第なのですが、Fastly がページキャッシュしていて、そもそも origin にはリクエストがほとんど来ない場合など、例えば Rails の cache_store（MemCacheStoreなど）のようなバックエンドのキャッシュはそもそも不要かもしれないです。上述のウェブメディアの例で言うと、記事の本文の部分をバックエンドでキャッシュした場合、記事の本文を更新して Fastly のキャッシュを purge すると同時にバックエンドのキャッシュも purge することになるので、バックエンドでキャッシュしていてもまったく無意味です。

## アクセスランキングやアクセスカウンタを作る場合、発想を根本的に変える必要があるため

例えば Redis の sorted set を使用してアクセスランキングを実装したとします。ブラウザが記事を開こうとして `GET /articles/42` といったリクエストを投げても、Fastly が記事をキャッシュしている場合は Fastly がレスポンスを返してしまうので、origin （例えば Rails アプリケーション） にはリクエストが届かず、記事詳細のエンドポイント（Rails であれば例えば `ArticlesController#show`） のフィルタなどでアクセス数をインクリメントするような実装ではアクセスカウンタが適切に更新されません。なのでアクセスカウント専用のエンドポイントを用意するなど、Fastly を前提とした設計をする必要があります。

## 蛇足: その他 Fastly について思うことなど

### 臭いものに蓋をされてしまう

例えば N+1 クエリーなど、コードベースに問題がある場合でも Fastly がページキャッシュさえすれば高速化できてしまうので、臭いものに蓋をされてしまう。それでも高速には動くので問題ないっちゃ問題ないんだけど、それって本当に問題ないのか？？

### fastly-rails がメンテされていない件

- https://twitter.com/ttanimichi/status/1029655045283823617
- https://twitter.com/ttanimichi/status/1029659293866328064
- https://twitter.com/ttanimichi/status/1036224049045635079

## 関連記事

- [部分SSR: SPAでSSRするけどサイドバーだけは非同期で取得したい - Qiita](https://qiita.com/ttanimichi/items/97a47584eca9d67d6032)
ローカルの PHP+Postgres な docker 環境を Azure VM にデプロイする

インフラど素人のメモです。

手元に PHP と PostgreSQL(正確には PostGIS)の docker/docker-compose 環境があり、これをインターネットに公開したい（開発しているシステムを顧客にも試してもらいたい）。

Azure のクレジットが訳あって余ってるんで Azure VM を使います。

CoreOS という VMイメージ には最初から docker が入っているらしいので、 Azure の Virtual Machine から CoreOS を検索して stable なイメージを起動。ケチなのでスペックは 「Standard B1ms (1 vcpu 数、2 GB メモリ)」。
あと自動シャットダウンも付けといたほうが無難。とりあえず user/password でログインできるようにした。
あ、ポートも開けておこう。 HTTP/HTTPS/SSH くらい。Postgres に繋ぎたいなら 5432 も必要。

この VM には docker は入っているが docker-compose は入ってないので 次に、

* [CoreOSにdocker-composeを導入 - Qiita](https://qiita.com/hiroseabook/items/50bda4b0fd85ab228c6d)

にしたがって  docker-compose をインストール。

さらに、このままだと ``docker-compose up`` をしたときに "Couldn't connect to Docker daemon at http+docker://localhost - is it running?" なんてエラーが出るので、
 
* [Dockerコマンドをsudoなしで実行する方法 - Qiita](https://qiita.com/DQNEO/items/da5df074c48b012152ee)

も実施。

次にローカルPCにある ``Dockerfile`` や ``docker-compose.yml`` やデータファイルを圧縮して VM に転送する。

* [sshでファイル転送の手順 - Qiita](https://qiita.com/sayama0402/items/c5c2795968ced798150a)

にある通り、 ``scp ./docker.zip amay077@xx.xx.xxx.xxx:/home/amay077`` のようなコマンドでアップロードできる。

今回使う ``docker-compose.yml`` はこんな感じ。

```yaml
version: "3"

services:
  php:
    # image: php:5.6.31-apache
    build: ./php
    expose:
      - "80"
    ports:
      - "80:80"
    volumes:
      - ../php/html:/var/www/html
    command: php -S 0.0.0.0:80
    links:
      - db
  db:
    image: mdillon/postgis:9.5
    # build: ./db
    ports:
      - "5432:5432"
    volumes:
      - ../../share/sql:/var/sql
      - ../../share/postgresql/data:/var/lib/postgresql/data
    environment:
      - "POSTGRES_USER=postgres"
      - "POSTGRES_PASSWORD=xxxxxxxx"
```

相対パスの配置に気をつけて、ローカルと同じようなディレクトリ構成にする。

そして、 ``docker-compose up`` を実行！ バックグラウンドで動かすなら ``docker-compose up -d`` 。
初回はイメージのダウンロードに時間がかかるが、以下のようなログが出て起動完了したっぽい（このログはローカルと同じだ）。

```
Creating network "docker_default" with the default driver
Creating docker_db_1 ... done
Creating docker_php_1 ... done
Attaching to docker_db_1, docker_php_1
db_1   | LOG:  database system was shut down at 2018-09-18 16:19:41 UTC
db_1   | LOG:  MultiXact member wraparound protections are now enabled
db_1   | LOG:  database system is ready to accept connections
db_1   | LOG:  autovacuum launcher started
```

外部からのルーティングとかよく分かってないけれど、とりあえず VM のグローバルIP で http アクセスしてみる。

…と、よく分からんが PHP のサイトが見られた。 ``docker-compose.yml`` の設定で 80 ポートは docker に流す、的な設定がしてあるんですかね。

とりあえず目的は果たせた。
TrendMicro CTF 2018 writeup(MISC_100)

# はじめに
初投稿になります。lovedと申します。
都内でアプリケーション開発エンジニアとして仕事を始めてはや数年。。

大好きなCTFに参加する余裕も出てきまして(素人に毛根が生えた程度ですが)

この機会に日々お世話になっているQiitaに貢献したく、
浅学者ながら、今回参加しましたTrendMicroCTF2018の
witeupを投稿致します。

どうぞ、お手柔らかにお願い致します。

# 対象読者
CTF初心者の方

# 投稿背景
熟練者からは簡単すぎる問題であるため、この問題のwriteupはネット上に詳細がほとんどなく、、
詳細に解説することで、CTF勉強中の方のお役に立てればと感じた次第です。
「こうしたらもっと簡単に解けた」などございましたらコメントにて補足頂けると嬉しいです。
(お、お手柔らかに・・・)
後に訪れた読者の方にも、少しでも有益な記事になればと思います。
# 問題
PDFファイルが与えられ、その中からflagを見つけ出せというものでした。
問題文がくせもので、「全てのツールを使用してください！」といった文言に惑わされてしまい、
画像の解析やPDFの詳細データの確認といった本質的でない部分に時間を取られました。。
# 使用環境
VirtualBox-Kali-Linux
WIndows
# 解法
0:binwalkコマンドにて与えられたPDFファイルを調査します。
![binwalk.jpg](https://qiita-image-store.s3.amazonaws.com/0/284143/18fec8db-626d-72ad-b54f-970284bcd372.jpeg)

PDFファイルのほかにJPGファイルとZIPファイルが埋まっていることがわかります。

1:Stirling等バイナリエディタを使用し、与えられたPDFファイルを読み込みます。
2:下記サイトを参考に(本当にありがとうございます。)ZIPシグネチャを確認し、
(http://www.tvg.ne.jp/menyukko/cauldron/dtzipformat.html)
ZIPファイルである部分(正確にはローカルファイルヘッダのシグネチャから、エンドセントラルディレクトリレコード終端まで)を切り取り、別ファイルに保存します。(a.zipといった感じでとりあえず置いておきます。)
3:2で保存したZipファイルをバイナリエディタで読み込み、セントラルファイルヘッダの上から2ファイルのファイル名称を、
ローカルファイルヘッダの2ファイルの名称(flag.txtとgalf.txt)に編集・変更し、
残りのセントラルファイルヘッダを削除した上で、さらに別ファイルに保存します。
4:3のZIPを解凍してflag.txtの中身をCTFの解答フォームにsubmit (おめでとう、100点GET!)
TMCTF{QWxpY2UgaW4gV29uZGVybGFuZA==}      

## ハマりどころ
「とりあえずbinwalkしてみたらファイルが複数埋まっとるわ」
「foremostでさっさと取り出したろ」
「お、zipあるやん、unzipしたるわ」

↓
![boom.jpg](https://qiita-image-store.s3.amazonaws.com/0/284143/1a3819ed-b080-5181-a3ed-e3be750950ce.jpeg)

Boooooom!(VM固まる)
「なんでや･･････」
「PDFファイルにあった画像のアリスとうさぎが関係あるんか？」
「原作に何かヒントがあるかもしれん、そっちも洗ってみよう」(後から考えると「ええっ･･･」って感じですが。。)

ご覧の通りローカルファイルヘッダが合っていませんよと堂々と言われているんですが、
当時の私はあたふたして結局時間を食ってしまいました。。。

# 反省と今後
一人でこっそり参加しては大した戦果も上げられずおめおめ帰国しているところで、、、
メンターの大事さと個人の限界を感じたりもしています。。
このまま独学で訓練を積んでも成長はできるでしょうが、やはりどこかよそ様のチームにJOINさせて頂き、
いろいろ盗みながら学んだ方が合理的かなと思っています。
というわけで次回CTFはチーム参加を目論んでおりますゆえ、
募集されているチームの方がいらっしゃいましたら御相談させて頂ければと思います。

以上です。
御観覧頂きまして、ありがとうございました。
Breadcrumb NavXTでarray_spliceを使うとErrorって出る

`bcn_after_fill`を使い、`array_pop`や`array_unshift`でBreadcrumb NavXTのナビゲーションを調整することはできたんですが、  
`array_splice`を使うと**Fatal error**が出て「？？？」ってなったんで、とりあえず解決法

## Array[i]とかで置き換え、挿入をする。

```php:sample.php
function my_bcn_after_fill($bcnObj) {
  // 新しいパンくず項目を作成
  $trail_add = new bcn_breadcrumb();
  $trail_add->set_title("sample");
  $trail_add->set_url( site_url().'/sample/' );

  // 入れたい箇所の項目を保管
  $home_trail = $bcnObj->trail[1];

  // 差し替え
  $bcnObj->trail[1] = $trail_add;
  // 保管したものを入れる
  $bcnObj->trail[2] = $home_trail;

  // 例えばこんな感じ
  // HOME > hoge
  // HOME > sample > hoge

  return $bcnObj;
}
add_action('bcn_after_fill', 'my_bcn_after_fill');
```

## なんでarray_splice使えないの？
入っているものを見ると、もともと入っている配列には`object(bcn_breadcrumb)`というオブジェクトで格納されていたんですが、 
`array_splice`で挿入したものは**`object(bcn_breadcrumb)`の中身がバラバラに入るようです。**

---

他にスマートな方法があると思いますが、とりあえず見つかるまでの応急処置にどうでしょうか。（他のいい方法をご教授いただけるととても喜びます）
kotlin開発中・・・（よくわからんぞシングルトン！

JVMで動くのは把握

とりあえずViewとその他のオブジェクトを橋渡しするためのシングルトンを入れようと思った。

AndroidStudioでいつも通理なんでも解決してくれるAlt+Enterボタンをおすと
↓以下のようなinvokeメソッドが出来上がってしまった。何を返せばいいのかわからない、とりあえずthisを返したらうまくいった。

```kotlin:アクティビティでViewを扱ってるクラスから、シングルトンを呼び出してみる
class MainView: AppCompatActivity{
    fun onCreate(　仮引数のなんか){
        Pipin().num = 1
    }
}
```

```kotlin:シングルトンにする側
object Pipin {
    var num = 0
    operator fun invoke(): Pipin {
        return this
    }
}
```

うまくいってるのかこれは・・・

こんな、中途半端な理解で、進めていってることの、恐怖！THE恐怖！恐山凶子


そして、実際にはこの逆をやりたいという罠
アクティビティの方をシングルトンにはできないのか的な事を調べ中・・・
glsl パターンまとめ


# デュプリケート

## 真ん中ドットパターン(偶数)
もっともオーソドックスなドットパターン、中央から2の倍数で分割されていくパターン、すべての基本
実はあまり使えない

```glsl
precision mediump float;
uniform vec2  m;       // mouse
uniform float t;       // time
uniform vec2  r;       // resolution
uniform sampler2D smp; // prev scene

void main(void){
	vec2 p = (gl_FragCoord.xy * 2.0 - r) / min(r.x, r.y);
	float n = t;
	p*=n;
	p=mod(p,2.)-1.;
	float l = length(p);
	l=step(0.,1.-l);
	gl_FragColor = vec4(vec3(l), 1.0);
}
```

![normalpattern.png](https://qiita-image-store.s3.amazonaws.com/0/135381/62152a41-36a2-c1ef-0c3f-ff17df16d1e0.png)
https://goo.gl/kRAsgs

このパターンの場合奇数で割れることはない

## 左下ドットパターン

左下から分割されていくパターン

```glsl
precision mediump float;
uniform vec2  m;       // mouse
uniform float t;       // time
uniform vec2  r;       // resolution
uniform sampler2D smp; // prev scene

void main(void){
	vec2 p = (gl_FragCoord.xy * 2.0 - r) / min(r.x, r.y);
	float n = t;
	p+=1.;
	p*=n;
	p=mod(p,2.);
	p-=1.;
	float l = length(p);
	l=step(0.,1.-l);
	gl_FragColor = vec4(vec3(l), 1.0);
}
```

これが足されただけ

```glsl
	p+=1.;
```

![leftdown.png](https://qiita-image-store.s3.amazonaws.com/0/135381/183df797-8f6d-7f5a-bda1-f647916575ec.png)
https://goo.gl/ungtFE

同様に

## 右上ドットパターン

```glsl
	p-=1.;
```

とすると右上

## 左上ドットパターン

```glsl
	p.x+=1.;
	p.y-=1.;
```

とすると左上

## 右下ドットパターン

```glsl
	p.x-=1.;
	p.y+=1.;
```

とすると右下から分割される

## 真ん中ドットパターン(奇数)

一番よく使う 奇数倍数で真ん中から割る場合、これはかなりはまる。
こちらは偶数で絶対割れないが、最初1つだったものを分割するパターンがほとんどなので、
だいたいこっちが使われる。

```glsl
precision mediump float;
uniform vec2  m;       // mouse
uniform float t;       // time
uniform vec2  r;       // resolution
uniform sampler2D smp; // prev scene

void main(void){
	vec2 p = (gl_FragCoord.xy * 2.0 - r) / min(r.x, r.y);
	float n = t;
	p*=n;
	p=mod(p+1.,2.)-1.;
	float l = length(p);
	l=step(0.,1.-l);
	gl_FragColor = vec4(vec3(l), 1.0);
}
```

![center.png](https://qiita-image-store.s3.amazonaws.com/0/135381/e00ea443-1e1a-ed1d-4ba3-11254c38bdf7.png)
https://goo.gl/6oPfZM

# 市松模様(チェック)

背景合成のテスト用に大活躍

```glsl
 precision mediump float;
 uniform vec2  m;       // mouse
 uniform float t;       // time
 uniform vec2  r;       // resolution
 uniform sampler2D smp; // prev scene
 
 float pCheckers(vec2 p,float n){vec2 q=p*n;return mod(floor(q.x)+floor(q.y),2.0);}

 void main(void){
    vec2 p = (gl_FragCoord.xy * 2.0 - r) / min(r.x, r.y);
    float l = pCheckers(p,5.);
    gl_FragColor = vec4(vec3(l), 1.0);
 }
```

![check.png](https://qiita-image-store.s3.amazonaws.com/0/135381/a18bd667-7095-dfb9-6ef7-c3b783b0b1fc.png)

https://goo.gl/bfr4eS
Kubernetes Applicationsを使って、GKE上にPrometheus + Grafanaを簡単構築

## Stackdriver Monitaringが使いにくい

GKEのモニタリングには、デフォルトでも利用できるStackdriver Monitaringを利用される場合が多いかと思われます。私もしばらくはStackdriverを使っていたのですが、以下のような不満があって別の方法を検討しました。

- 動作がとても重い
- メトリクスアラートが想定通りに動作しない
- GCPのダッシュボードと統合されてない

## Kubernetes Applicationsで簡単にPrometheus + Grafanaのモニタリング環境構築

GKE上に自分でモニタリング環境を作るのは大変かと思っていたのですが、Kubernetes Applicationsを使うことで、とても簡単に実現できました。

手順としては、GCPのダッシュボード上で`Kubernetes Engine -> Applications -> Marketplaceからデプロイ`と進んで、一覧から`Prometheus & Grafana`を選択して`構成`ボタンを押します。そして、必要ならば設定項目を変更した上で、`デプロイ`ボタンを押します。

基本的にこれだけで、GKE上にPrometheus + Grafanaのモニタリング環境が構築されます。

## Grafanaを外部公開する

あとは、以下の手順をベースにしてGrafanaを外部公開します

https://github.com/GoogleCloudPlatform/click-to-deploy/blob/master/k8s/prometheus/README.md#access-the-grafana-ui

Kubernetes Applicationsのデプロイで生成されたServiceを、各々の環境に合わせてアクセス可能にしましょう。
SOFT SKILLS ソフトスキルズで学び方を学ぶ

ソフトスキルズを読んでみました。
そこで特に興味深かった学び方を学ぶ方法についてアウトプットします。

#### 1回のみ行う(ステップ１から６まで)

### ステップ1全体像をつかむ
資格試験の勉強と同じだと感じました。
まず、全体像をとらえて、優先順位を決める時に使ったり、記憶をしやすくしたりと言った効果があります。

### ステップ2：スコープを決める
時間は有限です。
すべてをやることはできません。
やる範囲を決めましょう。


### ステップ3：成功の基準を決める
達成可能なもので、やる価値があるものを具体的に決めましょう。

### ステップ4：参考資料を見つける
可能な限りできるだけ集めたほうがよいようです。
自分が入手しやすいソースでいろいろ探してみましょう。

### ステップ5：学習プランを作る
どういうプランなら目標を達成できるか考えます。

### ステップ6：リソースをフィルターにかける
必要最低限なものを選びましょう。

以上、ステップ6までが1回だけ実行するステップです。

ここからは、繰り返すステップ ７から１０まで

### ステップ7：使い始められるようにする方法を学ぶ
具体的には環境構築や基本的な文法・hello worldのようなものです。

### ステップ8：遊び回る
自分の興味のおもむくまま遊ぶように学びましょう。
疑問があってもメモっておいて次のステップで答えを探します。

#### ステップ9：役に立つことができるところまで学ぶ
気になっていた疑問を調べましょう。

### ステップ10：教える
Qiitaに投稿したり、だれかに教えてみましょう。
教えるには、より深い理解が必要です。
相手に伝える準備をする段階で理解のレベルが上がります。


### まとめというか感想

この方法の好きなところは、特にステップ８「遊び回る」。
ゲームを買ってきた時、最初に何をやるか。僕は、説明書をだいたいさらっと一読してからやる感じだった。そこから必要に応じて説明書や攻略本今ならネットを見て、知識を保管していった。

ポケモンも最初から１５１匹覚えなくていい。(first赤、青、緑、黄時代)
必要に応じて覚えていけばいい。


参考文献
[SOFT SKILLS ソフトウェア開発者の人生マニュアル
ジョン・ソンメズ (著), まつもとゆきひろ(解説) (その他), 長尾 高弘  (翻訳)
456ページ]
(https://www.amazon.co.jp/SOFT-SKILLS-%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA%E8%80%85%E3%81%AE%E4%BA%BA%E7%94%9F%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB-%E3%82%B8%E3%83%A7%E3%83%B3-%E3%82%BD%E3%83%B3%E3%83%A1%E3%82%BA/dp/4822251551/ref=tmm_hrd_swatch_0?_encoding=UTF8&qid=&sr=)


[『SOFT SKILLS』の10ステップ勉強術がよさそう
It's okay to be weird
レールの無い道を行くプログラマーのブログ]
(http://tkykhk.hatenablog.com/entry/2016/06/18/192402)
Railsでbackground-image(背景画像)を設定する

#前提
初心者の初心者による初心者のための記事です:eyes:

#実行環境
Rails 5.2.1

#やりたいこと
Railsアプリ内で、よくあるホームページのトップページの一面に背景画像を設定するようなことを目指します。


#HTMLファイルを作成
まず、なんでもいいので適当にhtmlファイルを作りましょう

```hogehoge.html
<div class="main-container">
  <h1>This is my Portfolio Site</h1>
  <p>これは私のポートフォリオサイトです</p>
</div>
```

これでrails sでサーバーを起動して、ブラウザで確認するとこんな感じになりますね
⬇️
<img width="1440" alt="スクリーンショット 2018-09-18 23.51.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/281553/876a05bb-4821-24f4-56b4-a6534775afda.png">
このページの一面に背景画像を指定することを目指します

#画像を配置
皆さんは、rails newしたアプリ内に画像を指定するとき、画像ファイルをどこに置いておけばいいか、悩んだことありませんか？

候補としては下の二つのパターンが考えられるかと思います。

①assets/imagesの配下

②public/imagesの配下

railsのアプリで画像を配置しようと思ったらこのどちらかになるかと思います。
初心者でまだRailsの勉強始めたばかりだと、どっちに置いたらいいんだろう？って迷ってしまうかと思います。

**結論、どちらに置いても画像を読み込むことはできます。**

どっちに置いたらどうこうという細かい話は後回しにして、とりあえずこの２パターンで背景画像を指定するためのCSSファイルの書き方を先にお伝えします！！

#CSSファイルの書き方
それでは、CSSファイルを書いていきます。
まずは、
①のassets/imagesの配下に画像を配置した場合から。
この時の画像パスの指定方法で手っ取り早いやり方があるのですが、ちょっと一工夫が必要です。
まず、CSSファイルの末尾に、「erb」をくっつけて「hogehoge.css.erb」という形でRubyの記法が使用できるようにファイルの名前を変更します。("hogehoge"の部分は適当です)

↓こんな感じ

```hogehoge.css.erb
.main-container {
  background-image: url("<%= asset_path('hogehoge.png') %>")
  height: 800px;
  background-size:cover;
}
```
これでassets/images配下のhogehoge.pngというファイルを読み込んで、ブラウザ上で背景画像として読み込むことができます。
（heightやbackgroud-sizeの指定はわかりやすくするために明記していますが、ここは各自調整してみてください！）

`background-image: url(<%= asset_path('hogehoge.png') %>)`

こんな感じで、erb式を使って画像パスを指定するとうまくいきます。


次に、
②public/images配下の画像ファイルを読み込む際のCSSの書き方いきます！！！
今回はCSSファイルにerbを追記する必要はありません。

```hogehoge.css
.main-container {
  background-image: url("/images/hogehoge.png");
  height: 800px;
  background-size: cover;
}
```

これでブラウザ上で背景画像が表示されているはずです！！
先ほどとの違いは、
・Rubyのerb式を使っていない
・/imagesからパスを指定している

この２点ですね！！！

ここ、初心者の方だと、「なんで"public"からパスを指定しないでimagesからでいいんだろう？？」って疑問に思いませんか！？僕は思いました！！！

これは、Rails特有のルールで、public配下に配置した画像を読み込む場合は、最初からpublicを読み込むことは前提になっていて、「/images/ファイル名」みたいに/imagesからパスを指定すればいいっていうことになってるみたいです！！

#結局、assets配下かpublic配下、どっちがいいの？
これは、Railsのアセットプリコンパイルについての勉強をする必要があるので、詳しいことは　[Railsガイドのアセットプリコンパイルの章](https://railsguides.jp/asset_pipeline.html)
こちらを参照していただいた方が理解が深まるかと思います。

簡単に私の拙い理解（参考程度に（笑））で説明すると、

普段Railsでアプリケーション開発をしているときはDevelopment環境で開発しているかと思います。これをProduction環境にアップロードする際に、Railsではアセットプリコンパイルという作業をしなければなりません。
アセットっていうのはjsファイルとかcssファイルとか、画像ファイルとかのことですね。
これって開発していくうちにapplication.cssとか、hogehoge.cssみたいな感じでファイルがたくさん増えていってしまうと思うのですが、
それらをプリコンパイルする。つまり、たくさんあるファイルを事前にひとまとめにして、スッキリさせちゃおうみたいな、そんなイメージです。

ということは、assets配下に画像ファイルを置いた場合、もちろん、アセットプリコンパイルの対象に含まれます。

この時に、Railsは画像ファイルの名前にランダムな文字列を与えて変換してファイルを認識するので、画像を読み込む時に便利なんだそう←

逆に、public配下に置いた際にはアセットプリコンパイルの対象からは外れるので、ファイル名はそのままになってしまいますね。

#結論！！！

以上のことから、基本的に、Railsアプリでは、特別な理由がない限り、assets配下のimagesの中に画像ファイルを置いておくのが無難、ということで落ち着きました。
ただbackground-imageを指定するだけでも、Railsの中でやろうとするとこんなに奥が深いんですね！というお話でした。
pod install時における「No version of Xcode found that supports Swift ...」の対処方法

# 環境
- Xcode 9.3
- Swift 4.1.2
- CocoaPods 1.2.1

# 事象
各種ライブラリをPodfileよりインストール`pod install`時に、以下事象により`Realm`以降のライブラリが上手くインストールされない。

```console
$ pod install
Analyzing dependencies
Downloading dependencies
Using Alamofire (4.2.0)
Using CTFeedback (1.1.1)
Using Firebase (4.13.0)
Using FirebaseAnalytics (4.2.0)
Using FirebaseCore (4.0.20)
Using FirebaseInstanceID (2.0.10)
Using FirebaseMessaging (2.2.0)
Using GoogleToolboxForMac (2.1.4)
Using HockeySDK (4.1.6)
Using NendSDK_iOS (4.0.4)
Using NoticeObserveKit (0.3.0)
Using Protobuf (3.5.0)
Using R.swift (3.3.0)
Using R.swift.Library (3.0.2)
Installing Realm (2.10.0)
[!] /bin/bash -c 
set -e
sh build.sh cocoapods-setup

./scripts/swift-version.sh: line 59: [: =: unary operator expected
No version of Xcode found that supports Swift 4.1.2


[!] Smart quotes were detected and ignored in your Podfile. To avoid issues in the future, you should not use TextEdit for editing it. If you are not using TextEdit, you should turn off smart quotes in your editor of choice.
```
`No version of Xcode found that supports Swift 4.1.2`とあり、「Swift4.1.2をサポートするXcodeのバージョンが見つかりません」と言われている。


# 原因
- Xcode側のバージョンを指定していないことによるもの。

ただ今までは、Xcode側のバージョンを毎回こちら側で指定せずとも現在のXcodeのバージョンが自動で指定されていたはずだが、今回のように何かが原因でXcode側のバージョン指定が未選択状態になっていた。

# 対処
現在のXcodeバージョンに切り替える。

1. Xcode側で、`Xcode > Preferences > Locations`を選択する。
2. `CommandLineTools`にて現在のバージョンを指定する。

<img width="805" alt="Locations_と_AppDelegate_swift.png" src="https://qiita-image-store.s3.amazonaws.com/0/183618/bedaf32c-1cda-6780-44a7-569c3e7e510d.png">

# 参考URL
- [Installing Realm No version of Xcode……](https://www.jianshu.com/p/3405970a3335)
MySQLでテーブル定義を調べる方法

MySQLでテーブル定義を調べる方法

- 特定のテーブル内のカラムに関する情報を表示

```
SHOW FULL COLUMNS FROM hogehoge
```

　参考：https://dev.mysql.com/doc/refman/5.6/ja/show-columns.html

- テーブル構造またはクエリー実行計画に関する情報を取得

```
DESC hogehoge
```

　参考：https://dev.mysql.com/doc/refman/5.6/ja/describe.html

- 指定されたテーブルを作成する CREATE TABLE ステートメントを表示

```
SHOW CREATE TABLE hogehoge
```

　参考：https://dev.mysql.com/doc/refman/5.6/ja/show-create-table.html
VS Code 1.27 の気になった新機能(まとめ&小ネタ)

[Visual Studio Code](https://code.visualstudio.com) の バージョン 1.27 がリリースされたので、[リリースノート](https://code.visualstudio.com/updates/v1_27)を眺めてみて気になった機能をチェックしてみた。(以前のバージョンを眺めてみた時のやつはこちら。[1.26](https://qiita.com/12345/items/8ce4b6e045d50a6049ce) / [1.25](https://qiita.com/12345/items/e7b5b9954f5d721be2c8) / [1.24](https://qiita.com/12345/items/935770c6a3515ca80472) / [1.23](https://qiita.com/12345/items/627298550aab19f1d8a6) / [1.22](https://qiita.com/12345/items/8253a1eee38b6741905e) / [1.21](https://qiita.com/12345/items/71ce73c52cf2232fc10c) / [1.20](https://qiita.com/12345/items/1390c7cab11d968e7691) / [1.19](https://qiita.com/12345/items/a331c014a9d3fa9dac0e) / [1.18](https://qiita.com/12345/items/9b827138b5044ca82482) / [1.17](http://qiita.com/12345/items/28d83361341ce3ff3c9c) / [1.16](http://qiita.com/12345/items/5215293977dde2149c0f) / [1.15](http://qiita.com/12345/items/cebf4b4e9bfb2d2ef771))

# [設定画面のGUI変更](https://qiita.com/12345/items/1c6e752ffcce0b995cdc)
設定画面のGUIがようやく普通な感じになった。

# [階層リンク機能の改善](https://qiita.com/12345/items/ec1c5eb1e8b8c438c42a)
細かな改善。

# [自動閉じ括弧、自動括弧囲い機能の設定追加](https://qiita.com/12345/items/f10cca3cbfe4ba2f05f8)
既存機能に対する設定項目の追加。
　

**以下、小ネタ集。**
# [`タスク`メニューが`ターミナル`に変更](https://code.visualstudio.com/updates/v1_27#_new-terminal-menu)
今までの`タスク`メニューに統合ターミナル関連の項目が追加され、メニュー名も`ターミナル`に変更になった。

v1.26|v1.27
---|---
![menu_task.jpg](https://qiita-image-store.s3.amazonaws.com/0/181011/7211f923-4634-6de2-057e-df734a9f2242.jpeg)|![menu_term.jpg](https://qiita-image-store.s3.amazonaws.com/0/181011/c12dc152-aa8c-e970-5898-2c7d460ca7ba.jpeg)

ターミナルに乗っ取られた感じ？？

# [OSごとのキー定義が可能に](https://code.visualstudio.com/updates/v1_27#_platform-specific-keybindings)
キーボードショートカットの定義で、特定のOSか否かの指定ができるようになった。この定義は`keybindings.json`を開いて編集する必要がある。`when`句に`isWindows`,`isMac`,`isLinux`を指定することによって定義する。頭に`!`を付けると否定になる。
複数のOS環境でVS Codeを使用する人には便利そう。
VS Code 1.27 の新機能 - 自動閉じ括弧、自動括弧囲い機能の設定追加

https://code.visualstudio.com/updates/v1_27#_auto-closing-surrounding-characters

## 自動括弧閉じ機能の設定項目変更
`(`,`{`,`[`などの開始括弧文字を打つと、対応する閉じ括弧文字が自動的に挿入される機能の設定項目が変更になった。
従来の設定項目はON/OFFのみだったが、

![setting_autoclose_old.PNG](https://qiita-image-store.s3.amazonaws.com/0/181011/d43927ae-4a99-476a-b829-78c6f6537fbb.png)

今回、設定の選択肢が４つに増えた。

![setting_autoclose_new.jpg](https://qiita-image-store.s3.amazonaws.com/0/181011/327c3998-27d8-0764-aeb0-79fd3cbc34c8.jpeg)

- `always` 常にON
- `languageDefined` 言語ごとの設定を有効にする
- `beforeWhitespace` カーソルの右側に文字(閉じ括弧を除く)がない場合のみ動作
- `never` 常にOFF

言語ごとの設定の場合の設定値は各言語(resources/app/extensions/)の`language-configuration.json`の`autoClosingPairs`(未定義時は`brackets`？)の設定が使われているっぽい。

`always`と`languageDefined`の違いが不明。`always`を設定しても言語ごとの設定が反映されているように見える。

なお、一見`always`が設定されているように見えて設定値にマウスカーソルを合わせてみると`undefined`と表示される場合があるので、挙動が`always`っぽくない時は一旦別の選択肢を選んでから`always`を選択すると直る。

## 自動引用符閉じ機能の設定追加
同様に引用符についても自動的に閉じる機能があるが、こちらは今回設定項目が用意された。選択肢は括弧と同じ。

![setting_auto_quote.jpg](https://qiita-image-store.s3.amazonaws.com/0/181011/ca210221-925f-28f1-819f-bf0d44760ce9.jpeg)

## 自動文字囲い機能
文字列を選択した状態で、括弧文字や引用符を打つと自動的に文字列の両側を囲ってくれる機能についても、今回設定項目が用意された。選択肢は若干異なる。

![setting_auto_surround.jpg](https://qiita-image-store.s3.amazonaws.com/0/181011/5aaf5da6-298d-3d91-51cc-f31989274049.jpeg)

- `languageDefined` 言語ごとの設定を有効にする
- `brackets` 言語ごとの設定の括弧のみ有効にする
- `quote` 言語ごとの設定の引用符のみ有効にする
- `never` 常にOFF

ちなみに言語ごとの設定値は各`language-configuration.json`の`surroundingPairs`っぽい。
AWS勉強 -物理的なネットワークとAWS-

物理的な機器とAWS上のサービスとの関係を簡単にまとめる

## 「リージョン」と「アベイラビリティゾーン」

AWSは世界16カ所の分散されたデータセンター群で構成されている.
それぞれの地域に存在するデータセンター群を「リージョン」,
そのリージョンをさらに分割したものを「アベイラビリティゾーン」と言う.
詳細は以下.

[リージョンとアベイラビリティーゾーン](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html)

AWSで実運用する際には,

* エンドユーザーに近いリージョンを選ぶとレスポンスが早くなる
* 耐障害性を高めるために異なるアベイラビリティーゾーンに同じ構成のサーバーを立てて分散する

などの考慮が必要.

## 「ネットワーク」と「Amazon VPC」

Amazon VPCという領域を作成すると,
そこに自由なネットワークを作れる.

作っていく順序としては,

1. どんなIPアドレス範囲を使うのか指定
2. それをいくつかのネットワークに分割(サブネットという)
3. サブネットの中にサーバー(Amazon EC2インスタンス)を配置する

といった順序だ.

## 「サーバー」と「Amazon EC2 インスタンス」

AWSでは「Amazon Elastic Compute Cloud(EC2)」でサーバーを作る.
起動された各サーバーの個体は「インスタンス」と呼ばれる.
インスタンスを作るときは,

* CPUスペック
* ディスクの容量

を決めることができる.

## 感想

超基本用語とその概念が理解できた.
【まえがき編】Nuxt.js + Contentful + NetlifyでSPAブログを自作する

# はじめに

Nuxt.jsとContentfulとNetlifyでモダンな（？）SPAブログを作りました。[こちら](https://thinkshake.net/blog/)
これから何回かに分けて構築までの記録を残していきたいと思います。
今日はこういうアーキテクチャにした理由とか、選定するまでに悩んだポイントとかを書きます。

【シリーズの予定】
- まえがき編 ← この記事
- [Nuxt.js編](https://qiita.com/hitsuji-haneta/items/7e41bf5cdfde55b826a4)
- [Contentful編](https://qiita.com/hitsuji-haneta/items/6be4745b9bd6b098843f)
- [Netlify編](https://qiita.com/hitsuji-haneta/items/c6c1a9ddd74886116b72)

# アーキテクチャについて
今回のキモはNuxt.js、Contentful、Netlifyという３つのフレームワーク or サービスを組み合わせていることです。
それぞれの概要は以下のような感じです。

## Nuxt.js
![nuxt.png](https://qiita-image-store.s3.amazonaws.com/0/133447/372f1b4c-3df4-597f-bb48-7174a500e0f8.png)

[Nuxt.js](https://ja.nuxtjs.org/)はVue.jsでつくられたフレームワークです。
SPA（シングルページアプリケーション）の構築が容易であることや、SSR（サーバーサイドレンダリング）に対応していることなど特徴にあげられます。
また、```nuxt generate```のコマンドで簡単に静的サイトが作成できます。


## Contentful
![contentful.png](https://qiita-image-store.s3.amazonaws.com/0/133447/b16c7dd7-5cd5-d85c-4c73-d7ca18d28a4e.png)

[Contentful](https://www.contentful.com/)はAPIベースのCMS（コンテンツマネジメントシステム）です。
コンテンツ（ブログ記事）の作成・管理をオンライン上で行い、API経由で取得するため、自分で構築したWebシステムに乗せることができます。

 参考：[次世代Headless CMS「contentful」事始め](https://qiita.com/daikiojm/items/3fbde3c88a7d0a053675)
 

## Netlify
![netlify.png](https://qiita-image-store.s3.amazonaws.com/0/133447/e8bff05e-0cec-e946-2e51-3f1138ecc337.png)

[Netlify](https://www.netlify.com/)は静的サイトのホスティングサービスです。 
静的サイトというのはざっくり言うと、レスポンスの内容をサーバー側で（動的に）変更しないということですね。
すでに出来上がっているもの（HTMLとかCSSとかJavaScriptとか）をそのまま返すだけ、というサイトです。
Netlifyは静的サイトを簡単に公開できるホスティングサービスです。独自ドメインの設定やSSL通信などが簡単かつ無料でできます。

参考：[脱WordPress！静的サイトの特徴やメリットなどのまとめ](https://webdesign-trends.net/entry/2076)
参考：[高機能ホスティングサービスNetlifyについて調べて使ってみた](https://qiita.com/TakahiRoyte/items/b7c4d1581df1a17a93fb)

## 全体像
仕組みとしてはこんな感じです。
![概要図.png](https://qiita-image-store.s3.amazonaws.com/0/133447/e28e8286-26d4-5f1a-e07d-344a1a4d1d5b.png)


# なぜこういう形にしたのか
## 始まりはポートフォリオサイト
ブログの前にポートフォリオサイトを作ったんですが、なるべく安く独自ドメインもSSL化も対応したいなーと思ってました。
そしてSPAにしたいと思っていたので、いろいろ調べた結果、Nuxt.js＋Netlifyに落ち着きました。
SPA好きです。サクサク。

## ブログをどうするか
既存のプラットフォームを使って書くというのも考えたんですが、もうちょっとNuxtをいじりたかったので、自作することにしました。
ただNetlifyでやっちゃってるため、いまさらサーバーサイドを書く気にはならなかったのと、記事を静的ファイルでNetlifyにあげるのも、うーん（後述）だったので、Contentfulを使うことにしました。

## 悩んだポイント
それぞれのフレームワーク＆サービスは今回初めて使用したので、「これでいけんのか？」と心配して調べたことが結構ありました。
同じ様に悩んでいる人の参考になればいいなと思うので、残しておきます。

**■記事は静的ファイルで作って、Netlifyに直接あげるんじゃダメだったの？**
一番悩んだポイントです。書いた記事をQiitaとかに転載するようにしたかったし、ローカルで作って都度上げるのもありかなーと思ってたんですが、Contentfulにしました。
その理由はズバリ、タグの管理が楽そうだったからです！

**■タグとかカテゴリは使えるの？**
使えます。
Contentfulでは記事（コンテンツ）の構造をカスタマイズできるのですが、そこでちょっと工夫すればOKです。ただし、DBみたいに自由自在に操作できるわけではないです。

**■独自ドメインとか独自SSLは利用できるの？**
Netlifyなら楽ちんです！

**■SEO的にはどうなの？**
正直知識が少なくてわからんです。。
Wordpressとかと違ってノウハウも少ないし、最適化するにはいろいろ自力で工夫しないとなんでしょうね。
ただ静的サイト作成時（デプロイ時）にContentfulの記事は読みこんでいるので、記事が全く引っかからないということはなさそう。

**■第三者からコメント書けるの？**
考えてみたんですが、やり方がわからず。
知ってる人がいたら教えてください。

# おわりに
次回からもう少し細かい話を書いていこうと思います。
まずは【[Nuxt.js編](https://qiita.com/hitsuji-haneta/items/7e41bf5cdfde55b826a4)】から！

ではでは。
Expo v30.0.0でiOS Simulatorが立ち上がらない時の対処法

[Expo SDK v30.0.0](https://blog.expo.io/expo-sdk-30-0-0-is-now-available-e64d8b1db2a7)がリリースされましたね！
さっそく移行している方も多いと思います。

個人的に少しハマったのでメモ

## 問題

通常`$expo start --ios`とかやるとiOS Simulatorが立ち上がってアプリが開くはずですが、なかなか動いてくれずエラーも出ない状況でした。

## 解決方法
`expo-cli`とExponentが古かったのが原因でした (確証はないのでわかる方コメントいただけると嬉しいです)

`$npm update expo-cli`して、iOS SimulatorでExpoのアプリを1回削除して再起動後、`$expo start`すると正常に動作しました。
sympyとニュートン法の結果を比較してみた



ニュートン法は、素晴らしいですね。
(参考)[Pythonで数値解析](第4回)ニュートン法
https://qiita.com/Y_F_Acoustics/items/9288f614c23085db2d9b
#wolframalpha
(参考)x**2-2=0
http://m.wolframalpha.com/input/?i=x**2-2%3D0
sqr(2)

(参考)http://m.wolframalpha.com/input/?i=sqr%282%29
1.414213562373095048801688724209698078569671875376948073176...
(参考)exp(x**2)-2*exp(0)*x+exp(0)=0
This Wolfram|Alpha server is temporarily unavailable.
Click here to try another server.
(参考)exp((-1)**2)-2*exp(0)*(-1)+exp(0)
http://m.wolframalpha.com/input/?i=exp%28%28-1%29**2%29-2*exp%280%29*%28-1%29%2Bexp%280%29
3 + e 

#sympy
```python
from sympy import *
x = symbols('x')
ans =solve(x**2-2)
print(ans[0],ans[1])
print(float(ans[0]),float(ans[1]))
print('-------------------------')
f=exp(x**2)-2*exp(0)*x+exp(0)
print(f)
f1 = f.subs([(x, -1)])
print(f1)
print('-------------------------')
ans =solve(exp(x**2)-2*exp(0)*x+exp(0))
print(ans)

# -sqrt(2) sqrt(2)
# -1.4142135623730951 1.4142135623730951
# -------------------------
# -2*x + exp(x**2) + 1
# E + 3
# -------------------------
# Traceback (most recent call last):
#   File "C:/xxx/.PyCharmCE2018.2/config/scratches/aaa.py", line 12, in <module>
#     ans =solve(exp(x**2)-2*exp(0)*x+exp(0))
#   File "C:\/xxx\PycharmProjects\untitled4\venv\lib\site-packages\sympy\solvers\solvers.py", line 1065, in solve
#     solution = _solve(f[0], *symbols, **flags)
#   File "C:\xxx\PycharmProjects\untitled4\venv\lib\site-packages\sympy\solvers\solvers.py", line 1634, in _solve
#     raise NotImplementedError('\n'.join([msg, not_impl_msg % f]))
# NotImplementedError: multiple generators [x, exp(x**2)]
# No algorithms are implemented to solve equation -2*x + exp(x**2) + 1
```