OmniAICreator/Qiita-1.07M huggingface dataset:
PythonでスクレイピングしてDBへ

#はじめに
webサイトの情報を取得し解析したい
そんな考えから、PythonでスクレイピングしてDBに保存
ある程度たまったら解析しようとなった

その手順をまとめたもの（備忘録的な）

# 動作環境
・Windows7 64bit
・Python 3.6
・MySQL 8.0.12

#スクレイピング
###　手順
　1. モジュールのインストール
　2. 指定URLからHTML情報の取得
　3. HTMLから指定の情報を取得

###　モジュールのインストール
　・URLに接続しHTML情報を取得するためには**requestsモジュール**が必要
　・早速インストール　

```shell-session:コマンドライン
$ py -m pip install requests
```
＊Windows環境では`py -m`を入力しないといけない

###　指定URLからHTML情報の取得
　requestsモジュールをインストールしたので、実際に取得していきます。

```python:
import requests

res = requests.post("URL")
res.encoding = res.apparent_encoding

html = res.text
```
・``equests.post("URL")``でpost通信で接続経路を作成
・``res.apparent_encoding``で接続先のエンコードを取得し設定
・``res.text``でHTML情報を取得

これでHTML情報の取得ができました
ここから欲しい情報を取得していきます

### HTMLから指定の情報を取得
取得したHTMLからタグを指定して表示されている情報を取得します
今回は指定タグの情報を取得する関数を作成しました。

```python:
def getTagInfo(html, ntag):
    #タグ定義
    stag = "<" + ntag + ">"
    etag = "</" + ntag +  ">"

    #取得タグ
    tagList = []

    #HTML情報を改行コードで区切る
    lhtml = html.split("\n")

   for l in lhtml:
       ifl.find(stag) != -1 and l.find(etag) != -1 and l.count("<") == 2:
           l = l.strip(stag)
           l = l.strip(etag)
           tagList.append(l)

    return tagList  
```

引数の``html``にHTML情報、``ntag``に取得するタグ名を設定
HTML情報から、指定されたタグで囲まれ、他にタグがない行を取得し
その行のタグを排除する
この関数でhtml内の欲しい情報を取得できます。

この関数を使い

```python:
import requests

res = requests.post("URL")
res.encoding = res.apparent_encoding

html = res.text

h1list = getTagInfo(html, "h1")
plist = getTagInfo(html, "p")
```

欲しい情報をHTML情報から取得する


## DBに登録

### 手順
 1.モジュールのインストール
 2.MySQLに接続

### モジュールのインストール
　・MySQLに接続するのに**mysql-connectorモジュール**が必要
　・早速インストール　

```shell-session:コマンドライン
$ py -m pip install mysql-connector
```
＊Windows環境では`py -m`を入力しないといけない


### MySQLに接続

``` python:
import mysql.connector

connect = mysql.connector.connect(host="ホスト名", port="ポート番号", db="DB名", user="ユーザ名", password="パスワード")
ctrl = connect.cursor()

ctrl.execute("SQL")
```

・``mysql.connector.connect``を使用し、MySQLとの接続経路を確保
・``connect.cursor()``を使用し、接続したMySQLの操作権を獲得（カーソル的なイメージ？）
・``ctrl.execute("SQL")``で、SQLを実行

これで、取得した情報を登録できます。


## まとめ
 ・HTML,MySQLの接続関連に関してはあやふやな部分も多いが、実際に接続することができた
　 ⇒あやふやなので、間違った接続をしているかもしれない
 ・実際にHTMLから欲しい情報を取得しDBへ登録することができるようになった
　 ⇒しかし、タグ基準なので取得漏れがありそう
　　　今後は、上手く取得できる方法を考えていく

 ・今回は備忘録的な感じで作成したので、とりあえずこれでいいと思う
TIPS:WindowsでPingが通らない場合はファイアウォールを見直そう

ネットワークは通じているはずなのになぜかPingが通らない･･･。

というときに意外と忘れがちなこと。
![スクリーンショット (44).png](https://qiita-image-store.s3.amazonaws.com/0/199750/cac2987a-8371-ef38-b3a7-c59d79baf89f.png)

ファイルとプリンターの共有(エコー要求 - ICMP受信)を有効に。
fastai 1.0をKaggleで動かすためにしたこと


### :warning: こちら、Kaggleが安定するようになってしまったのか、`pip`でライブラリをインストールしてもKernelが止まらず、ライブラリの再読込が不可能になってしまいました:warning:

その代わり、[Kaggle/docker-python#340のコメント](https://github.com/Kaggle/docker-python/issues/340#issuecomment-430353119) によると、`pip install`が動くように開発中のようです。fast.aiの新しいコースが近々始まるのもあって、そちらはfastai 1.0を使うことになると思うので、近い内に改善されそうです。

### 以下、メモ目的で残しておきますが、ほぼ**意味のない**記事です。

[fastai 1.0をGoogle Colaboratoryで動かすためにしたこと - Qiita](https://qiita.com/diskshima/items/0a194d3996010b2d89f3)

に続き、Kaggleで動かせるか試してみました。
ちょっと（だいぶ？）ハックですが、動くには動きました。

## 課題1: もともと古いfastai（0.7）が入っていること（2018年10月13日以前）

こちらはアップグレードすれば大丈夫でした。

```python
!pip install torch_nightly -f https://download.pytorch.org/whl/nightly/cu90/torch_nightly.html
!pip install -U fastai
```

なお、この問題は2018年10月13日にKaggle Kernelの元になっているDockerイメージが更新されたそう（[GitHubのコメント](https://github.com/Kaggle/docker-python/issues/315#issuecomment-429450335)）なので既に自然解決しています。

ただし、以下の課題2の内容は発生しますので、そちらの対応は必要です。

## 課題2: Pytorchのバージョンが古いこと

fastai 1.0は新しいだけあって、正式リリース前のPytorch 1.0に依存しています。
[fastaiのGitHub README](https://github.com/fastai/fastai) にも書いてありますが、Nightlyビルドを入れる必要があります。

```python
!pip install torch_nightly -f https://download.pytorch.org/whl/nightly/cu90/torch_nightly.html
```

こちらはPytorch 1.0が標準でKaggleのKernelに入れば良いのですが、既存のコードのことを考えると結構時間がかかるのではないかな、と思います。

## 課題3: ライブラリのバージョンを変えても読み込まれない

課題2の延長なのですがKaggleのKernelは既にPytorch 0.4.1をロードしてしまっているので、そのまま機械学習をさせようとしても、Pytorchの後方互換でない部分でコケます。

上記インストール時に90%ぐらいの確率で下の警告が表示され、Kernelがリスタートされます。その副作用で自動的に新しいPytorch 1.0が読み込まれます。

<img width="858" alt="kaggle_kernel_restart.png" src="https://qiita-image-store.s3.amazonaws.com/0/29305/c1ca6344-0efb-6837-ff2e-979bca74e6a7.png">

その後、残りのコードを走らせると、新しいライブラリを拾うようになります。
ちなみに、Pytorchの場合は下のコードで読み込まれているバージョンが確認できます。

```python
import torch
print(torch.__version__)
```
<img width="278" alt="kaggle_pytorch.png" src="https://qiita-image-store.s3.amazonaws.com/0/29305/4cb65c1a-166f-4a2c-34a8-d5b496e70af0.png">

## 課題4: CUDA 9.0でないと遅い

こちらは論理的な理由はわかっていないのですが、PytorchはCUDAを内蔵しているので、いろいろなCUDAのバージョンを試したのですが、どうもCUDA 9.0でないと遅い模様です。

先程のインストールコード：

```python
!pip install torch_nightly -f https://download.pytorch.org/whl/nightly/cu90/torch_nightly.html   # <- cu90 でないとGPUコードが遅い
```

## 結論

```python
!pip install torch_nightly -f https://download.pytorch.org/whl/nightly/cu90/torch_nightly.html
```

を最初の方で実行して、課題2の`Kernel Restarting`が表示されたら、OKを押して、その先のコードを実行していきましょう。
log出力を抑制する

ライブラリがログを出力して他の出力を見失ってしまうときに。

_Python3.6.2で試してます_ 

パッケージの名前（文字列）を指定して取り出したLoggerのログレベルをERRORにでもしてしまえば良いですね。
ライブラリをいじるのではなくて、Pythonインタプリタに引数として渡してるスクリプトの最初の方にでも書いておけば良いです。

```
import logging
logging.getLogger(PACKAGE_NAME).setLevel(logging.ERROR)
```

---

以下蛇足

Pythonのログ出力のイディオムは以下のように自身のファイルパスをドットで区切ったものをただ指定しておきますよね。

```
import logging

logger = logging.getLogger(__name__)
```

ダンダーネーム（_\_\_name\_\__）は `oozappa/record/spam.py` 内で参照された場合は `oozappa.record.spam` が格納されていますもんね。

logging.getLoggerはドット区切り単位で絞り込めるので、oozappaパッケージ以下のログを全部抑制したい場合には冒頭のコードのPACKEGE_NAMEは `'oozappa'` を、oozappa.record 以下を抑制したい場合には `'oozappa.record'` を指定すれば良いですね。

ERRORも出したくない場合にはFATALで。

ゴミ書いてこ
ARKit事始め

# ARKit事始め
UdemyでARKitの講座を受講したので内容をざっくりと振り返って行きます。
随時更新

# 誰のための記事か
・ARKitを初めて触る方
・ARKitで何ができるのかを知りたい方

# 開発環境
Xcode 10.0
Swift4


# ARKitのアプリテンプレートを作成しよう

Xcodeを起動し、新規アプリケーションを作成します。
「Augmented Reality App」を選択しましょう。
<img width="693" alt="スクリーンショット 2018-10-13 2.05.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/201127/ff310439-78ea-d07d-e2d3-78d80c4a1859.png">

初期状態ではscenekitのshipが入っていると思います。
※ shipはart.scnassetsディレクトリにあります。
<img width="990" alt="スクリーンショット 2018-10-13 2.06.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/201127/c4f577fc-b9a0-cafe-32ee-7b93e2351f0a.png">

そのまま自身のIPhomeにビルドしてみるとスペースシップが表示されるはずです。
※ 画像はSimulatorです
<img width="203" alt="スクリーンショット 2018-10-13 2.07.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/201127/35bcab04-0e3f-dab6-6f8a-e7c31180c0e4.png">


# オブジェクトを配置してみよう
続いて様々な形のオブジェクトを配置してみましょう。

まず、先ほどのスペースシップをdeleteキーを押して削除します。
画面右下から様々な形状のオブジェクトをD&Dで配置することができます。
<img width="1054" alt="スクリーンショット 2018-10-13 1.32.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/201127/c9575a10-7da4-63d8-dd1f-8c68bebc3e34.png">

コードで生成することもできます。

```swift:ViewController.swift
// 20cmのBoxを生成
let box = SCNBox(width: 0.2, height: 0.2, length: 0.2)

// 20cmのPyramidを生成
let pyramid = SCNPyramid(width: 0.2, height: 0.2, length: 0.2)
```

そのままビルドすればBoxやPyramidが現れます。

# 壁をトラッキング
...
GAN の学習に必要な教師データ数を MNIST で検証してみた。

##**【背景】**
深層学習のトレーニングには，精度の確保のために大量の教師データが必要な事が知られています。（特に画像認識）
　・https://www.youtube.com/watch?v=NKpuX_yzdYs (Andrew Ng 氏の講演動画)
　・http://yusuke-ujitoko.hatenablog.com/entry/2017/07/15/004540
例えば，有名なデータセットの枚数は下記ととても多いです。
　ImageNet：1400 万枚（～700 枚／クラス）
　CIFAR10： 60000 枚（10000 枚／クラス）
　MNIST： 65000 千枚（10000 枚／クラス）
特に MNIST に至っては手書きの数字を認識させるのに，1 種類当たりおよそ 1 万枚もの教師画像が存在することに驚きすら感じます。
(もちろん，クラス分類するだけなら SVM などを使えばデータは少なくて済むとは思いますが）

一方で，2014 年から研究が盛んな GAN は，一般に学習が難しいと言われていますが，
画像認識のように教師データの数 (GAN で言うところの Real データ数) と学習の成否の関連はあまり論じられていないように思えます。
GAN の研究で頻出する LSUNベッドルームで 300 万，CelebA で 20 万とこれもまた膨大なデータ数です。

今回，どれだけの Real  データと競争させれば Generator がそれらしい画像を生成するようになるのか、MNIST で試してみました。
（画像認識のタスクで必要な教師データの補充に GAN の生成画像を活用できるとよく言われるので，必要な画像のオーダーとしては GAN の方が少ないだろうと予想はできます）

##**モデル条件**
　Collection of generative models (https://github.com/hwalsuklee/tensorflow-generative-model-collections) の
  　GAN.py コードを参考に，データのロード部分だけ変更。

```python:utils.py
def load_mnist(dataset_name):

    x_train = pd.read_csv('x_train_df_10000.csv')
                          #x_train_df_10000.csv:  MNIST のデータから 10000 行分だけ残したファイル
    x_train = np.array(x_train)
    trX = x_train.reshape(200, 28, 28, 1)

    t_train = pd.read_csv('t_train_df_10000.csv')
    t_train = np.array(t_train)

    X = trX 
    y = t_train.astype(np.int)

    return X, y
```

##**結果**
学習に用いた MNIST の Real データ数と Generator の生成画像です。
![Fig_65000.png](https://qiita-image-store.s3.amazonaws.com/0/287001/a138f945-fbe6-568b-7f46-5a7946547923.png)
![Fig_10000.png](https://qiita-image-store.s3.amazonaws.com/0/287001/c037a551-6613-f3fe-d18c-3f503ab2a741.png)
1 万枚での生成画像は 6.5 万枚より少しぼやけているように見えますが，さほど変わりません。
![Fig_1000.png](https://qiita-image-store.s3.amazonaws.com/0/287001/f0bfaf4a-f55e-3017-c419-a190a324567d.png)
1000 枚では生成が少し遅くなるものの，手書き数字は生成されます。ノイズのようなドットが散見されます。
![Fig_500.png](https://qiita-image-store.s3.amazonaws.com/0/287001/1d2cb88f-9c76-def1-f6b8-953923992890.png)
500 枚の学習では，生成画像が一部崩れていますが，それでも大部分の数字は生成できています。
![Fig_200.png](https://qiita-image-store.s3.amazonaws.com/0/287001/b44feedb-7ea5-24f2-35ae-edd1612f14d3.png)
200 枚では，手書き数字が生成されません。閾値は 200 枚と 500 枚の間のようです。

もちろんこれはあくまで 28×28 と画像サイズの小さい MNIST での結果ですので，サイズ の大きな画像になると必要な枚数はもっと増えてくると思います。

GAN の用途は今後色々と提案されて行くと思いますが，実用途においては対象がニッチになる程，Real データの確保が課題の一つになると考えているので，今回興味本位でやってみました。
RユーザのためのRStudio[実践]入門を読んだ感想

[RユーザのためのRStudio[実践]入門](https://gihyo.jp/book/2018/978-4-7741-9853-8)を読みました。その感想と良かった点などを書こうと思います。

## 感想
某大学の某研究会にて[dplyr](https://dplyr.tidyverse.org/)に触れる機会があり、[Tidyverse](https://www.tidyverse.org/)に興味を持ったことがきっかけで読み始めました。
Tidyverseに触れたことがない方にはおすすめの本だと思います。  

例えば、`%>%`というパイプ演算子をTidyverseでは利用しますが、利用方法や意味などについて完璧にとは言いませんが理解することができたような気がします。
個人的には`command + shift + M`で`%>%`のショートカットができることを知れたのが一番良い点でしたw

## 良かった点

* [dplyr](https://dplyr.tidyverse.org/)についてある程度まとまって書いてある
    * dplyrのページでも学習できますが、一度書籍を読んでからの方が理解しやすかったです
* [ggplot2](https://ggplot2.tidyverse.org/index.html)のページがカラーになっている
    * 引数fillとcolourの違いをようやく理解できました
* RStudioの設定や機能が紹介されている
* 比較的最近出版されている

## いまいちな点

* [purrr](https://purrr.tidyverse.org/)や[stringr](https://github.com/tidyverse/stringr)などの説明がない
    * 実際の前処理などでは関数を適用したりすることが多いので、解説が欲しかったなと思いました
* 第2章のスクレイピングはいらなかったかも知れない...
    * 分析フロー全体を紹介する本なので必要な理由はわかりますが...

## まとめ
いまいちな点も書きましたが、これからTidyverseを使ってみようと思う方には間違いなくおすすめできる本です。  

今は書籍の中でも紹介されていた[R for Data Science](http://r4ds.had.co.nz/)を英語で読んでいます。かなり体系的に解説されており、Rで前処理をする上では読む価値がとてもあるなと思います。
【Game a Week】10週間目

# Game A Week
1. 一週間（月曜日から日曜日）に一本ゲームをリリースする。
2. 日曜日（まで）に制作したゲームを何らかの手段で公開する。
3. 制作したゲームはGame A Weekが終わるまで改変しては行けない。

# 前置き
先週の作品：[【Game a Week】9週間目](https://qiita.com/hota1024/items/e0c11be14359096ea59c)

# 今回作ったゲーム
今回は以前Scratchで作った格闘ゲームの一人プレイバージョンを作ってみました。

# 使った技術
| 名前 | 説明 |
|:-:|:-:|
| [Scratch](https://scratch.mit.edu/)  |  子供向けプログラミング環境  |

# ゲームの詳細
名前は「SmashCats vs AI」。

黄色い猫が自分の操作するキャラクターです。
青い猫が敵の猫で、自動的に動きます。

<img width="482" alt="スクリーンショット 2018-10-13 16.05.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/154299/4d4dec48-802c-6f56-1011-3cfe805c5346.png">


操作方法は矢印キーで移動、スペースキーで攻撃です。
HPが0になるか端の壁に当たるとゲームオーバーです。



# 9週間目の感想
今回はAIじゃないですけど、敵を自動的に動かすようにプログラミングしました。
敵を自動的に動かすプログラムは以下のとおりです。

<img width="258" alt="スクリーンショット 2018-10-13 16.06.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/154299/cac02270-d8c2-9701-0739-5b571c9dd034.png">

壁に触れないようにプレイヤーの攻撃に当てられないようにしています。

# 最後に
今週で当初の目的の10週間目が終わりました。
これからはゲームだけではなくアプリを一・二週間でリリースするものを考えています。

ここまで読んでいただきありがとうございます。
良ければアドバイスや質問よろしくおねがいします。
PHP基礎（１３）ポリモーフィズム

オブジェクト指向の特徴である、継承、カプセル化をやりましたので、最後にポリモーフィズムを取り上げます。

#ポリモーフィズム

ポリモーフィズムとは簡単に言うと、異なるインスタンス（オブジェクト）を、同じ名前のメソッドでそれぞれを操作することです。テクニックとしてインターフェースを使った例を書きます。

```php
<?php
/* 商品インターフェース */
interface Product {
    function getSalePrice();
}

/* 食べ物クラス */
class Food implements Product {
    private $price = 100;
    public function getSalePrice() {
        // 3割引
        return $this->price * 0.7;
    }
}

/* 飲み物クラス */
class Drink implements Product {
    private $price = 180;
    public function getSalePrice() {
        // 2割引
        return $this->price * 0.8;
    }
}

$food = new Food();
$drink = new Drink();
//それぞれのインスタンスを配列要素に入れる
$products = array($food, $drink);
//それぞれの価格を表示する
foreach($products as $product) {
    echo "セール価格は".$product->getSalePrice()."円です。\n";
}
?>
```
クラスFoodとクラスDrinkはインターフェースProductを実装したクラスになります。インターフェースではセール価格を返すgetSalePriceメソッドを定義せよ、と言っていますので、クラスFoodとクラスDrinkにはgetSalePriceメソッドを持たせます。
クラスFoodとクラスDrinkのインスタンス（オブジェクト）を配列に入れて、その配列を列挙しながらgetSalePriceメソッドを呼ぶとそれぞれのオブジェクトのセール価格が取得できます。

このテクニックの利点は、異なったオブジェクトを同じレベルで参照・操作できることです。ポリモーフィズムと言うと仰々しいですが、プログラムのある機能やデータを一つの塊として捉え、その塊の似て非なる集合を、ある同じ切り口で扱えるので便利です。

[＜＜PHP基礎（１２）カプセル化]
(https://qiita.com/taka027/items/c821b089b1e88fe8a241)
pytestのfixture、基本のき


# 概要

『テスト駆動Python』を読んでpytestのfixtureの機能を理解したので、基本的な考え方と使い方をまとめる。

私はfixtureについてドキュメントを読んでもよくわからず使っていなかったので、同じような人の参考になればうれしい。

# fixtureとは

次の説明が簡潔でわかりやすい。

> フィクスチャは、実際のテスト関数の実行に先立って（またはその前後に）、pytestによって実行される関数です。（『テスト駆動Python』P.59）


つまり、テストデータの用意や、テスト前後に行いたいデータベースのセットアップと後始末などに使える。


# サンプル
Python3.7.0とpytest3.8.2で実行した。

## fixtureでテストデータを用意

```python
import pytest

# fixtureであることを示すデコレータ
@pytest.fixture()
def my_fixture_1():
    return "hello"

# fixtureを引数として渡す
def test_foo(my_fixture_1):
    assert my_fixture_1 == "hello"
```


## fixtureでテスト前後の処理を行う

```python:test_pytest.py
import pytest

@pytest.fixture()
def my_fixture_2():
    # 前処理
    print("fixture start")

    # ここでテストを実行
    yield

    # 後処理
    print("fixture end")

def test_foo(my_fixture_2):
    print("in test_foo")
    assert True
```

### 実行

コマンドラインから実行。

```
# print関数の結果が見れるように"capture=no"を追加
$ pytest --capture=no
```

結果。（出力は一部省略）

```
test_pytest.py fixture start
in test_foo
.fixture end
```

少しわかりにくいが、テストの前後で、fixtureに定義した"fixture start"と"fixture end"が表示されている。
（`test_pytest.py`はモジュール名、"fixture end"の前に出ている`.`は実行されたテストごとに表示されるpytestのいつものアレ。）

# その他fixtureのあれこれ

* 上記の例ではテストデータで"hello"を作成したが、配列や辞書などデータ型は自由
* fixtureのスコープ（実行の単位）は設定可能
    * session, class, module, functionがある
    * 例えば、データベースのセットアップはsessionで良さそう。（各テスト実行につき一度だけ実行される）
    * デフォルトはfunction（テストメソッド・関数の実行毎にfixtureが実行される）
* fixtureをテストモジュール間で共有したいときは、`conftest.py`に書く


# 参考資料
* [『テスト駆動Python』](https://www.shoeisha.co.jp/book/detail/9784798157603)
楽天アフィリエイトをシングルページアプロケーション(SPA)に表示させる in Vue.js

SPAで構築されたサイトに楽天アフィリエイトのモーションウィジェットを表示させたかったのだが、ただアフィリエイトソースをコピペするだけでは、表示することができなかったので解決法をご紹介。


## 表示させたかったアフィリエイトバナー

楽天モーションウィジェットという、ユーザーにレコメンドされた商品が表示されるウィジェット。


<img width="991" alt="スクリーンショット 2018-10-13 15.15.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/92083/bf822081-2d12-1b6e-bf3e-a5ace345f423.png">

ソースはscriptタグで構成されており、読み込むとこのソースを貼り付けた箇所にiframeが表示される仕様のようだ。

```
<script type="text/javascript">rakuten_design="slide";rakuten_affiliateId="114d4165.28f68287.114d4166.99077420";rakuten_items="ranking";rakuten_genreId="100804";rakuten_size="300x250";rakuten_target="_blank";rakuten_theme="gray";rakuten_border="off";rakuten_auto_mode="off";rakuten_genre_title="off";rakuten_recommend="on";rakuten_ts="1539408256268";</script><script type="text/javascript" src="https://xml.affiliate.rakuten.co.jp/widget/js/rakuten_widget.js"></script>
```

通常であれば、ただhtmlファイルにコピペするだけで済むのだが、今回表示させようとしたサイトは、Vue.js＋SSR（SPA）で作成されているがために、上手く動かなかった。

<img width="960" alt="スクリーンショット 2018-10-13 15.26.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/92083/72d08115-8870-5561-381c-e4aa862b019e.png">
ソースはあるのだが、表示されていない。


## 解決策

アフィリエイトのソースだけの静的ページを用意して、iframeで読み込むことで、表示することができた。

`rakuten_motion_widget.html`というファイルを用意して、https://sample.jp/public/html/rakuten_motion_widget.html で表示できるようにする。

```rakuten_motion_widget.html
<script type="text/javascript">rakuten_design="slide";rakuten_affiliateId="114d4165.28f68287.114d4166.99077420";rakuten_items="ranking";rakuten_genreId="100804";rakuten_size="300x250";rakuten_target="_blank";rakuten_theme="gray";rakuten_border="off";rakuten_auto_mode="off";rakuten_genre_title="off";rakuten_recommend="on";rakuten_ts="1539408256268";</script><script type="text/javascript" src="https://xml.affiliate.rakuten.co.jp/widget/js/rakuten_widget.js"></script>
```

<img width="883" alt="スクリーンショット 2018-10-13 15.32.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/92083/b534fc5f-ab02-704e-0214-1ec09066615b.png">

あとは、この静的ページをウィジェットを表示させたいページからiframeで読み込めばよい。

```sidebar.vue
div(ref="rakuten_motion_widget")
  iframe(
    src="/public/html/rakuten_motion_widget.html",
    scrolling="no",
    border="0",
    marginwidth="0",
    marginheight="0",
    style="border:none;",
    frameborder="0",
    width="300",
    height="250"
  )
```

<img width="1013" alt="スクリーンショット 2018-10-13 15.40.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/92083/a015a5c7-1b94-fede-fa2a-b2ac4a0ff0a9.png">
ソースを見ると、用意したiframeの中に、楽天ウィジェットのiframeが読み込まれている方になる。


## 最後に

今回は、楽天アフィリエイトのウィジェットを使って説明したが、このiframeを一度通す方法は、SPAでは今後もなにかしらの役に立ちそう。
Amazonアソシエイトのサーチウィジェットも楽天アフィリエイトのウィジェットと似たソースだから、この方法で表示させることができる。
Addメソッドを使って新規ワークブックの作成

こんにちは！

本日はタイトルの通り、Excel VBAで新規ワークブックの生成を

行いました。

新規ワークブックの複数作成、複数コピーなどができるようになれば

その月ごとのバランスシートの作成などが

可能になるからです。

そして格納するフォルダを指定してあげれば

PHPのinclue.onceなどでファイルを持ってきて

公開することだってできるようになるかもしれません。

そう言ったところから考えて、本日はworkbookの連続生成のプログラムを下記に記載します。

Sub Oct13()
Dim NewWorkBook As Workbook
    Dim i As Integer
        For i = 1 To 10
Workbooks.Add
        Next i

End Sub

このような形でプログラムを作成しました。

workbookプロパティとAddメソッドの合わせ技！

先日、ワークシートの連続生成もできているので

if構文など使えばそれぞれのワークシートに月ごとの

バランスシートを格納しておくことだって

可能になってくるでしょう。

まだまだExcel VBA初心者の私でございますが

日進月歩してまいります。
VSCodeでLaravel bladeをフォーマットできない件への対処

#目的
VSCodeでLaravel bladeをフォーマットしたい

#環境
OS: MacOS Mohave
IDE: VSCode 

#作業内容
VSCodeのコード整形プラグインであるBeutifyをインストール
Alt + Shift + Fキーで、コード整形ができるようになるはず

しかし、laravelのbladeファイルはこれでは整形されなかった

#類似事例
下記に同様のIssueがあったので、回避策を試してみる
https://stackoverflow.com/questions/41330707/how-to-format-php-files-with-html-markup-in-visual-studio-code/48339700#48339700

#回避策
原文

```
I added to my user config"beautify.language": { "js": { "type": [ "javascript", "json", "jsonc" ], "filename": [ ".jshintrc", ".jsbeautifyrc" ] }, "css": [ "css", "scss" ], "html": [ "htm", "html", "blade" ] },
```

VSCodeのPreferenceに上記を追加する。
Commando + P でsettings.jsonを開き、User settings内に追記


以上で、bladeファイルもAlt + Shift + Fキーで整形できるようになる。
NCalcがけっこう便利な件について

## 背景

ちょっとわけあってフリーフォーマットで入力された式を解析して計算するという処理が必要となった。
例えば「売上」といったテーブルがあったとする。

```
CREATE TABLE Sale '売上'
  (
    product_id       INT PRIMARY KEY , '商品ID'
    price            INT, '価格'
    unit             INT, '売上数量'
  ) ;
```

で、ユーザーが数式として
**価格 ×　売上数量**　で商品の総売上額を算出する、みたいなイメージだ。

この手はパーサーを活用して文を定義したりするのが王道のようだが、なかなか難しい分野でもある。
それでなんかもっと直感的に楽に使えるライブラリとかないかなーと探していたら**NCalc**がひっかかった。

## NCalcとは

一番最初に引っかかったページが以下だ。
http://gottaniprogramming.seesaa.net/article/458949172.html

で、そこからNCalcについて調べてみるとまず以下のサイトがヒットした。
https://archive.codeplex.com/?p=ncalc

なるほど使い方自体はそれほど難しくない。
インスタンス生成時に計算式を与えてEvaluateを実行すればobject型で計算結果を返してくれるようだ。

変数を与えた場合でもパラメータとして定義すれば計算してくれる。これは確かに便利そうだ。

## NuGetから取得するか自力でビルドするか

NuGetパッケージで提供されているようなのでNuGetパッケージマネージャーからインストールを試みる。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/130149/97423fdd-ef8d-2d09-6d0b-063bf82f81ff.png)

ncalc自体はすぐに見つかる。他にもいくつかあるようだがこれで大丈夫そう……ん？


公開日が2011年11月で最新のバージョンが1.3.8？　やけに古い。嫌な予感がしてプロジェクトURLへジャンプしてみる。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/130149/8912207e-4dac-7e3a-20e8-e1af1b2bd2fa.png)

どれも7年前で更新が止まってるやんけ…
ライセンスも確認したいが見当たらない。これは使えないかと諦めつつページを漁っていると
https://github.com/sheetsync/NCalc/issues/5
要はyallieさんという人がこのプロジェクトを引き継いで新しいプロジェクトを作成してくれているみたいだ。
それがこれ↓
https://github.com/ncalc/ncalc

ライセンスも明示されており、更新もそこそこされている。

使いたい場合はこちらを使用する方が確実だろう。
ただしこちらはNuGetパッケージではないので使用したい場合はGitHubからソースをダウンロードする必要がある。


## NCalcのその他注意点

使用できる計算記号は↓。大小判定によるtrue/falseの返却もできる。
https://github.com/ncalc/ncalc/wiki/Operators

使用できる関数は↓。関数内にパラメータを使用することももちろん可能。
https://github.com/ncalc/ncalc/wiki/Functions

いろいろ検証してみたが単純な四則演算レベルならまったく問題ない。
注意点としては全角文字が使えないくらいだろうか。
これはNCalcというよりもNCalcが利用しているAntlrのせいだ。そもそもプログラム言語で全角を使おうという魂胆がもう甘えである。
ちなみに日本語は当然のことだが計算記号の全角（＋）みたいなのも認識しない。

※Antlrのバージョンを3から4にあげれば対応できるみたいな記事も見かけたが、あまり確証はないし、Antlr 3からAntlr 4 へのマイグレーションはかなり困難をきわめる。文法自体が大きく変わっているのだ。

なので最初の例にあげた**価格 ×　売上数量**みたいな計算はそのままではできないので、UI上は日本語入力させておきながら裏側では日本語名と英語名（price, unit）をマッピングしておけばいいだろう。

あとは項目名と計算記号そのものの解析をどうするかといった仕様は人によって変わるだろうからそこらへんは突っ込まない。

このライブラリは非常に使いやすいので**文字列のまま計算したい**みたいな需要が発生した時は候補のひとつとしてもいいと思う。
Scrum Inc.認定スクラムマスター(LSM)取得

2018-10-09～2018-10-10にScrum Inc.認定スクラムマスターになるための研修とオンラインのテストを受け、無事取得しましたので、研修内容について軽く説明いたします

## <a id="index" href="#index">目次</a>
* [いきさつと経歴](#section1)
* [研修内容](#section2)
* [所感](#section3)


# <a id="section1" href="#section1">いきさつと経歴</a>
いきさつと経歴としては、私はウォーターフォール型の開発しかしたことないです。4年前にいた現場でスクラム導入しようとしたとき、誰も知識を持っていないこともあり、立ち消えしました。しかし、現在のビジネス変化にWF開発の限界があると思い、研修を受けて知識とマインドをもとうと考えました。


<p class="ec__link-index"><a href="#index">[↑ 目次へ]</a></p>

# <a id="section2" href="#section2">研修内容</a>
研修内容は細かく書くと意味がないと思いますので簡単に箇条書き。
・3つの役割、スクラムマスター・プロダクトオーナー・チームについての説明
・5つのイベントについての説明
・3つの成果物についての説明
をスクラムガイドをベースに徹底して理解させるようなプログラムになっていました。
研修の中では紙飛行機作成やポーカーなどの体験をします。

<p class="ec__link-index"><a href="#index">[↑ 目次へ]</a></p>

# <a id="section3" href="#section3">所感</a>
8.5時間×2の研修かつQ&Aの量も多く、内容が濃いので非常に疲れました。会社によっては10人規模で研修を受けにきており、スクラムの重要性も感じました。

<p class="ec__link-index"><a href="#index">[↑ 目次へ]</a></p>


編集後記
この研修を受けたからと言ってスクラムマスターになれるわけではないです。ここで得た正しい知識を活かして、現場で実践しないと意味がないと思います。

初稿：2018-10-13
X.509 ルート証明書、ルート認証局をOpenSSLで作成する

# この記事について
OpenSSLを使ったルート証明書(オレオレ証明書)の作成方法を記載します。

# OpenSSLコマンド


## ルート証明書(オレオレ証明書)の作成

発行者とサブジェクトが同名のルート証明書を作成します。

### RSA秘密鍵の生成
鍵長2048bitのRSA秘密鍵を生成する

```bash
$ openssl genrsa -des3 2048 > server.key
```

#### 出力例

```
Loading 'screen' into random state - done
Generating RSA private key, 2048 bit long modulus
..............+++
.......................+++
e is 65537 (0x10001)
Enter pass phrase:test
Verifying - Enter pass phrase:test
```

### 署名リクエスト（request.csr）の作成

68年=24820日有効の設定例です。対話形式で証明書に記載するCN等の入力が促されます。

```bash
$ openssl req -new -x509 -days 24820 -key server.key -out request.csr
```

#### 出力例

```
Enter pass phrase for server.key:
Loading 'screen' into random state - done
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Your City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Your Company
Organizational Unit Name (eg, section) []:Your Section
Common Name (e.g. server FQDN or YOUR name) []:Your FQDN
Email Address []:Your Email
```

### 証明書の作成

```bash
$ openssl x509 -in request.csr -out server.crt
```




## ダミーのCA認証局を使ってX509v3のサーバー証明書を発行する

ルート証明書では発行者とサブジェクトが同一でした。以下ではOpenSSL付属のCA.plツールを使って、発行者とサブジェクトの異なるサーバー証明書を発行します。


### テスト用のルート認証局を新規作成

```bash
$/usr/lib/ssl/misc/CA.pl -newca
```

CAの秘密鍵のパスワードや、署名局の情報入力が促されるので適宜入力します。

```
 C  => JP
 ST => Tokyo
 O  => Dmy Inc
 OU => Dmy OU
 CN => Dmy CN
```

成功すると、/usr/lib/ssl/misc/demoCAが作成され、必要な情報が格納されます。

### テスト用のサーバー秘密鍵を作成

PEM形式の秘密鍵newkey.pemを作成します。

```bash
$openssl genrsa -des3 2048 > newkey.pem
```

### 作成した秘密鍵のパスワードを削除

```bash
$openssl rsa -in newkey.pem -out newkey.pem
```

### テスト用のサーバー証明書署名要求(CSR)を作成
```bash
$openssl req -new -key newkey.pem -out newreq.pem
```

サーバー証明書のサブジェクトの入力が促されるので適宜入力します。

```bat
C  => JP
ST => Tokyo
O  => Corporation
OU => Management Center
CN => www.dmy.co.jp
```

### テスト用のルート認証局を使って、サーバー証明書を発行する

PEM形式の証明書を発行します。

```bash
$/usr/lib/ssl/misc/CA.pl -signCA
```

### 生成されたnewcert.pemをcrtに変換

crtコンテナにPEM形式の証明書を格納します。

```bash
$openssl x509 -in newcert.pem -out server.crt
```

### 秘密鍵newkey.pemと証明書server.crtのペアをPKCS #12形式に変換

pfxコンテナに秘密鍵と証明書を格納します。

```bash
$openssl pkcs12 -export -inkey newkey.pem -in server.crt -out server.pfx

Password => test
```

この場合、パスワードが事実上の秘密情報になりますので、保管には十分注意が必要です。
(今は亡き)java.util.Calendarで誰も踏まなそうな地雷を踏んだ

#おことわり
ネタです。普通に使っていればハマらない地雷を踏んでしまったので共有します。

#結論
駄文なので先に結論だけ書いておきます。
変なソースコードを書く人がいるので、CalendarではなくDateTimeを使おう。

#問題のソース
とある製品で見つけた「月曜日」に「2を足す」という謎のソースコードです。
仕様書がないのでどんな動作を期待してこのコードを書いたのかわかりませんが、動作検証をしてみました。

```java
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MONDAY, 2);
// これどんな結果になるの…
```

#結果
なんということでしょう。2ヶ月後の日付になりました。

```java
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime());
// Sat Oct 13 14:48:40 JST 2018

calendar.add(Calendar.MONDAY, 2);
System.out.println(calendar.getTime());
// Thu Dec 13 14:48:40 JST 2018
```

#理由
Calendarの実装に理由が隠されていました。
Calendarクラスを継承しているGregorianCalendarクラスのaddメソッドを見てみます。

以下のようにaddメソッドではint型のfield変数によって、if文で処理を分けているのがわかります。

```java
    @Override
    public void add(int field, int amount) {
        //略
        if (field == YEAR) {
        //略
        } else if (field == MONTH) {
        //略
    }
```

ところで、`Calendar.MONTH`とか`Calendar.MONDAY`って数値だと何で表されているんでしょう。

```java
    //略
    public final static int MONTH = 2;
    //略
    public final static int MONDAY = 2;
    //略
```

はい、どうもありがとうございました。月と月曜日で定数の値が同じなので、「月曜日に2を足す」というコードを書くと、「日付が2ヶ月進む」ということです。怖いぞ。

#最後に
最後までネタにお付き合いいただきありがとうございました。

普通は踏まない地雷を踏む人がいるかもしれないので、今から日付の操作を行う場合はDateTimeAPIや、jodaTimeライブラリなどを積極的に使いましょう。

以下、DateTimeAPIの使い方に関して見つけた記事です。
[Java 8 DateTime API をじわじわと使っていきたい（今更）](https://qiita.com/wingsys/items/87b247dac4575c9b4fc8)
[java.util.Calendar を Date and Time API に置き換える](https://qiita.com/toastkidjp/items/63d64303d2efdb9f5f1b)
PHP基礎（１２）カプセル化

#アクセサメソッド
インスタンス変数を読み書きするためのメソッドをアクセサメソッドと言います。（値をセットするセッターと、値をゲットするゲッターという２つのメソッドの総称です）

例として以下のコードを考えます。四角の縦（height）、横（width）を管理するクラスです。

```php
<?php
/* 四角クラス */
class Square {
  /* 縦 */
  private $height;
  /* 横 */
  private $width;
  function __construct($height,$width) {
    $this->height = $height;
    $this->width = $width;
  }
  /* 縦setter */
  function setHeight($height) {
    $this->height = $height;
  }
  /* 縦getter */
  function getHeight() {
    return $this->height;
  }
  /* 横setter */
  function setWidth($width) {
    $this->width = $width;
  }
  /* 横getter */
  function getWidth() {
    return $this->width;
  }

  /* 面積計算 */
  function calcArea() {
    return $this->height * $this->width;
  }
  /* 正方形か？ */
  function isSquare() {
    if ($this->height == $this->width) {
      return true;
    } else {
      return false;
    }
  }
}

//呼び出し
$sq = new Square(40,20);
$area = $sq->calcArea();
echo "area = $area ";// => 800
//正方形か否か
$b = $sq->isSquare();
var_dump($b);// => false
//縦を変更
$sq->setHeight(20);
$area = $sq->calcArea();
echo "area = $area ";// => 400
//正方形か否か
$b = $sq->isSquare();
var_dump($b);// => true
?>
```

縦（height）、横（width）のインスタンス変数をセットするセッターメソッドとゲットするゲッターメソッドがそれぞれあります。そして面積計算メソッド（calcArea）と、正方形か否かを判定するメソッド（isSquare）が内部でインスタンス変数を使って面積計算したり、縦と横の比較を行なっています。
つまりオブジェクトはメソッド呼び出しが外と繋がる手段になっています。

このようにインスタンス内部で持っている値（privateなインスタンス変数）に触ることができるメソッドは、オブジェクトの言わば出入口です。オブジェクトは薬の粉を包むカプセルのようなイメージですので、これらメソッドはオブジェクトの内と外の世界を繋げる細いトンネルのような物です。

#カプセル化

オブジェクト指向のカプセル化の概念はこのトンネル（メソッド）を使ってオブジェクトを操作させよう、と考えることです。
カプセル化を適切に考えると、オブジェクト同士の紐付き（関係性）を薄くし、独立性を高め、再利用や交換といった保守性を高めることになります。
プログラムは常に改善、改造を繰り返し、より良いものになって行きます。その作業を行うプログラマーは、一人とは限りません。多くの人が関係します。また、時間経過が長く、作ったものを忘れてしまうときもあります。そういう人のたずさわるプログラムにミスやバグが入り込まないようにすることが目的です。


上記のコードはクラスを使う側から考えたときに依存度は最小限です。インスタンス化のときに縦、横の数値を渡し、必要に応じて縦、横の数値をセッターで変更し、各メソッドを呼び出せば計算値が受け取れます。

もしこれをアクセサメソッドを使わずに書くとどうなるでしょうか。

```php
<?php
/* 四角クラス */
class Square2 {
  /* 面積計算 */
  function calcArea($height,$width) {
    return $height * $width;
  }
  /* 正方形か？ */
  function isSquare($height,$width) {
    if ($height == $width) {
      return true;
    } else {
      return false;
    }
  }
}

//呼び出し
$sq = new Square2();
$area = $sq->calcArea(40,20);
echo "area = $area ";
//正方形か否か
$b = $sq->isSquare(40,20);
var_dump($b);
//縦を変更
$area = $sq->calcArea(20,20);
echo "area = $area ";
//正方形か否か
$b = $sq->isSquare(20,20);
var_dump($b);
?>
```
コンストラクタは不要になり、各メソッドの呼び出しで引数として縦、横の数値を渡すことになります。

このクラスSquare2を使う側はインスタンス化は１箇所で行うとして、各メソッドが色々なところから呼ばれるコードになっているとするとメソッドの引数の数値２つは冗長です。いつも縦、横の数値が必要になります。縦、横の数値管理の役目がSquare2には無くなります。

さて、もしこの縦、横の数値管理の役目がないインスタンス変数を持たない四角クラスSquare2を、立体も扱うように改造しようとする必要が出てきたとき、奥行（depth）という変数を各メソッドの引数に加える必要があり、メソッドの呼び出し箇所を一斉に変更する必要が出てきます。呼び出し側では縦、横、奥行きの３値を管理する必要が出てきます。

しかし、最初に紹介したクラスSquareの場合での改造は、インスタンス変数に奥行（depth）を追加し、各メソッド内でその値を内部で使い演算方法を修正すればいいだけになります。（もちろんメソッド名に変更はないということが前提ですが）

このようにいろんな箇所から呼ばれることを想定し、仕様変更があったとしても構造的な影響が最小限になるよう考えてそのオブジェクトの管理すべきデータ、操作する内容を適切な所属や扱い方にしておくことが、つまりは結果的にオブジェクトを疎結合にすることになります。

[＜＜PHP基礎（１１）変数たち]
(https://qiita.com/taka027/items/8beccec15fde098067df)

[PHP基礎（１３）ポリモーフィズム＞＞]
(https://qiita.com/taka027/items/a64740e2b64a51e37765)
PocketBeagle シリアルポート接続時にオートログインする

# 概要
PocketBeagleをシリアルポートから操作する際、
起動のたびにユーザー名/パスワードを打ち込まずに済むよう
自動ログインを設定します。

# 環境
OSイメージのバージョン：Debian 9.5 2018-10-07 4GB SD IoT
接続：MicroUSB経由(ttyGS0)


# 設定方法
` /lib/systemd/system/serial-getty@.service `内に
` ExecStart=-/sbin/agetty --keep-baud 115200,38400,9600 %I $TERM` 
と書かれている行があるので下記のように変更します。(ユーザー名debianの例)

` ExecStart=-/sbin/agetty --keep-baud 115200,38400,9600 -a debian　%I $TERM` 

# 具体例
下記のコマンドを打つ。
` sudo nano /lib/systemd/system/serial-getty@.service `
現在ログインしているユーザーのパスワードを聞かれるので入力。
ファイルが開くので、上記の行(ExecStart=...)を探して変更。
Ctrl+Xで終了。保存するかどうか聞かれるのでyを入力しEnter。
` sudo reboot`
で再起動しオートログインしていることを確認する。

出来ていない場合、上記内容を確認するとともに
`sudo systemctl daemon-reload` 
で設定を再読み込みさせる。

#参考資料 
https://yoheikoga.github.io/2016/08/14/raspbian-jessie-auto-login-by-cui/
シリアル接続の場合は` serial-getty@.service` を編集する点が異なる。
(` getty@.service` 内に記載されていました。)
pomera DM200のLinuxでスマホをマウスにする方法(改訂版)

#概要

pomeraにはポインティングデバイスがついていませんので、必要な場合はマウスを外付けしたりキーボードでエミュレーションしているかと思いますが、さらなる選択肢のひとつとしてスマホを（Wifi経由で）マウス（タッチパッド）として利用するアプリを探してみたのでメモ。

iPhoneは持っていないので未確認です。

#対応アプリ

執筆現在で使えそうなアプリは２つありました

１． [XMouse Remote Mouse & Keyboard](https://play.google.com/store/apps/details?id=com.stripe1.xmouse
)
2. [Unified Remote](https://play.google.com/store/apps/details?id=com.Relmtech.Remote
)

どちらもplayストアにありますのでスマホにそのままインストールできます
pomeraで使えるようにするにはpomera側でもインストールと設定が必要です

#XMouse

このアプリは広告なしの無料アプリです。[オープンソース](https://github.com/bradand/XMouse)のようです。

XMouseはマウスやキーボードのイベントをコマンドラインから送信するxdotoolコマンドをSSH経由で送ることでマウス操作を実現しているようです。
ですので、sshdとxdotoolが必要ですがpomeraにはxdotoolは入っていないのでインストールします。

```
$sudo apt install xdotool
```

sshdは最初からpomeraに入っており、特に設定しなくても有効になっているようです。

スマホからXMouseを開き、左上のメニュー（三のようなアイコン）をタップして「Manage Hosts」→右下の「＋」をタップしIPアドレス、ユーザー名、パスワードを入力します。

（ローカルの）IPアドレスを確認するにはipコマンドを使います

```
$ip -f inet adress
```

pomeraの場合wlan0のinetの横に書かれているアドレスになります。

右上のコンセントのようなアイコンか、左上のメニューからディスプレイのようなアイコンをクリックするとうまく行っていればpomeraに接続してマウス操作ができるようになります。

仕組上SSHにログインできればネットワークに関わらずどこからでも使えるんじゃないかと思いますが（未確認）、セキュリティと速度から通常はスマホとpomeraを同じwifiネットワーク上に接続して利用したほうがいいと思います。

#Unified Remote

このアプリは広告・機能制限付きの無料版がある有料アプリです。マウス操作は無料版でも可能です。専用のサーバーソフトを経由することでマウス操作を実現しているので、サーバーソフトをインストールする必要があります。

pomeraではraspberry pi版のdebパッケージがそのまま使えるようですのでダウンロードしてインストールします

```
＄wget https://www.unifiedremote.com/download/rpi-deb
$sudo dpkg -i rpi-deb 
$/opt/urserver/urserver-start --no-manager --no-notify
```

このアプリはスマホとpomeraを同じwifiネットワーク(未確認ですが多分テザリングでも可)に接続しておく必要があります。

一度インストールするとxfce4ではログイン後にサーバーを自動起動するように設定してくれるようですが、ウィンドウマネージャーによっては個別に設定する必要があるかもしれません。

スマホからUnified Remoteを開くとサインインを求められますがスキップします。うまく行っていれば接続先の候補にdm200というのがあるはずなのでタップします。

操作項目の一覧が出てきますが、その中の「Basic Input」がマウス操作になります。初回は有料版の案内と操作方法の案内がありますがスキップすればマウス操作ができるようになります(2回目以降はどちらも出てこないようです)。

#使用感

個人的にはXMouseはスマホの操作と実際のポインタの動作のズレが大きいのか指を止めてもポインタは少し動いているなど違和感がありますが慣れの問題かもしれません、Unified Remoteは有料アプリだからかそんなことはありませんが、有料であることや無料版の広告などに抵抗がある人は辛いかもしれません。
C#とPowerShellで遊ぶ

# C#で出来るものをPowerShellで書く

C#実装できたものをPowerShellでもやってみる

## プログラム

### 主な動作

* `*.mp3` に前方部分一致したファイルの一覧を表示する

### 動作条件と検索対象

* コマンドライン引数の `第1個目の引数` を検索対象のディレクトリ場所とする
* コマンドライン引数が無い場合は, `My Musicフォルダ` から検索する

## C# ##

```csharp:SearchMP3.cs
using System;
using System.IO;

namespace SearchMP3
{
    class Program
    {
        /// <summary>
        /// "*.mp3" ファイルを検索し表示
        /// </summary>
        /// <param name="args">コマンドライン引数</param>
        /// <example>ディレクトリにファイルが存在した場合はコンソールに表示</example>
        static void Main(string[] args)
        {

            string path = null;

            if (args.Length == 1)
            {
                // コマンドライン引数があるとき
                path = args[0];
            }
            else
            {
                // コマンドライン引数がないとき
                path = Environment.GetFolderPath(Environment.SpecialFolder.MyMusic);
            }

            // *.mp3に一致するファイルの取得
            string[] files = Directory.GetFiles(path, "*.mp3", SearchOption.AllDirectories);

            // ファイルパスの出力
            foreach (string file in files)
            {
                Console.WriteLine(file);
            }
        }
    }
}
```

## PowerShell

### プログラム

```powershell:SearchMP3.ps1
<#
.SYNOPSIS
 "*.mp3" ファイルを検索し表示
.DESCRIPTION
 コマンドライン引数に指定したディレクトリのファイルが存在した場合はコンソールとウィンドウに表示
#>

if ($Local:args.Length -eq 1) {
    # コマンドライン引数
    $Local:path = $args[0]

} else {
    # MyMusicフォルダ
    $Local:path = [System.Environment]::GetFolderPath([System.Environment+SpecialFolder]::MyMusic)    
}

$Local:files = [System.IO.Directory]::GetFiles($Local:path, "*.mp3", [System.IO.SearchOption]::AllDirectories);

# コンソール出力
$Local:files | Write-Output

# 画面出力
$Local:files | Out-GridView -Title "*.mp3のファイル一覧"
```

### PowerShellファイルの実行方法

`C:\`のフォルダから検索するには以下のようにして実行

```PowerShell:PowerShell
> .\SearchMp3.ps1 "C:\"
```

#### 実行できないとき

以下のサイトが参考になります。
http://qiita.com/tomoko523/items/df8e384d32a377381ef9

要するに、PowerShellの実行ポリシーを変更すればOK!

```PowerShell:PowerShell(管理者権限で実行)
> Set-ExecutionPolicy RemoteSigned
```

#### 2018/10/13 追記
管理者権限が不要で、ユーザー単位で実行ポリシーを変更できる方法があるようです。
詳しくは、本記事のコメントを参照ください。
「プログラマのためのGOOGLE CLOUD PLATFORM入門サービス本」でハマった時のメモ

# この投稿について

うまくいかなくて検索しても出てこないので、自分でまとめることにする。

## リスト2.16 サンプルアプリケーションのデプロイと起動で失敗する場合

以下のエラーが出てしまう。

```
● dengonban.service - Message Board Application
   Loaded: loaded (/etc/systemd/system/dengonban.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Sat 2018-10-13 04:12:01 UTC; 13s ago
  Process: 24828 ExecStop=/bin/kill -TERM $MAINPID (code=exited, status=1/FAILURE)
  Process: 24825 ExecStart=/opt/dengonban/v2/app.py (code=exited, status=1/FAILURE)
 Main PID: 24825 (code=exited, status=1/FAILURE)
```
journalctlコマンドで、ログを確認してエラーを見て見る。

```
$ journalctl | less
```
`Shift-G` 　で最新にスクロールしてエラーを確認する。

### SQLALCHEMY_TRACK_MODIFICATIONS がログにある場合

以下のエラーが出る場合

```
SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future.  Set it to True to suppress this warning.
```

書いてあるとおりで、SQLALCHEMY_TRACK_MODIFICATIONSを　trueにすれば良い。
app_v2/app.pyに `app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True` を追記する。

こんな感じ。

```
app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
```
（でもこのWARNINGは気にしなくてもいいのかもしれない）

### Access denied for user の場合

以下のエラーの場合はmysqlユーザのユーザ名とパスワード名を確認する。

```
Oct 13 04:16:05 webserver app.py[24927]: sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (1045, u"Access denied for user 'appuser'@'cloudsqlproxy~XX.XX.XX.XX' (using password: YES)")
Oct 13 04:16:05 webserver systemd[1]: dengonban.service: Main process exited, code=exited, status=1/FAILURE
```
GCPコンソールのCloudSQLから `Cloud Shellを使用して接続` からシェルを起動する。

この時に、ログインコマンドを、ユーザ名とパスワードでログインできるか試してみる。

```
$ gcloud sql connect websql --user=appuser --quiet
```
本のとおりだと、パスワードは `pas4appuser` なんだけど、これでログインが出来なかったらパスワードの設定でミスっているので、SQLからパスワードを変更する必要がある。
または、ログインパスワードがわかれば、app_v2/app.pyのパスワードを変更する。
Python3でExcelファイルのすべてのシートを別々のCSVファイルに保存する

データがExcelで提供されている。でもcsvで欲しい...
そんなことありますよね。
ひとつのシートならともかく、複数のシートが入ったExcelファイルをシートごとにcsvで出力するのは面倒です。
ググるとマクロとか出てくるんですが、CLIでやりたいですよね！GUI苦手です...
そこでPython3で解決できたのでメモ。

##　方法


まず、必要なパッケージをインストールします。

```
 pip3 install xlrd pandas
```

では本題のpython3のコードです。簡単にできました。

```python
import sys
import pandas as pd

target = sys.argv[1]
df = pd.read_excel(target, sheet_name=None)
for k in df.keys():
    out = "./mutations/" + k + ".csv"
    df[k].to_csv(out, index=False)
```

データ分析でよく使われる`pandas`でExcelファイルが読めたので助かりました。
以下に簡単に解説します。

1. `pd.read_excel`を使うことで、引数で与えたExcelファイル`target`を読みます。`sheet_name=None`とすることで、すべてのシートを読み込み、シート名をキーとし、データフレームを値として持つ辞書が得られます。
2. `for`文でそれぞれのシートをcsv形式で書き込みます。`out`変数は出力ファイル名です。`index`はお好みで。`False`にすると　indexは書き込まれません。
UICollectionViewController作っていてCustomCellのlabelにテキスト入れようとするとlabelがnilでエラー

## 事象
<img width="1311" alt="スクリーンショット 2018-10-13 13.52.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/199256/15cca6bc-72f5-06be-5c08-ad2016ec1fd2.png">

cellはあるのにtitleLabelはnil
- StoryboardでcellにreuseIdentifierは設定ずみ
- CustomCellクラスにStoryboardからlabelのリンクはきちんと行われている

`Fatal error: Unexpectedly found nil while unwrapping an Optional value`が出た

## 解決
```swift

    override func viewDidLoad() {
        super.viewDidLoad()

        // ここいらない！
        // Register cell classes 
        // self.collectionView!.register(CheckBoxCollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)
    }

```

CocoaTouchからUICollectionViewControllerを作成しましたが、その時できるself.collectionView!.register()がいらなかったみたい
どこからでも .vue をすぐにブラウザで実行確認したかった

# 方法

vue-cli のおかげで .vue をいきなり実行できるようになりました。ありがてぇ。

とはいえ `@vue/cli` を入れた程度では pug も sass も使えません。関連するライブラリも事前にインストールしておく必要があります。

というわけで次の一連のコマンドを実行すればOKです。コピペで流せば一発でブラウザが開いて動作確認できます。

```shell
yarn global add @vue/cli-service-global
yarn global add @vue/cli

yarn global add vue-cli-plugin-pug

yarn global add sass-loader
yarn global add node-sass

cat << 'EOS' > Hello.vue
<template lang="pug">
  h1
    | {{message}}
</template>

<script>
export default {
  data() {
    return {
      message: 'Hello',
    }
  },
}
</script>

<style lang="sass">
  h1
    color: blue
</style>
EOS

vue serve Hello.vue -o
```

# 全部グローバルに入れておくことはできない？？？

ところが、追加で lodash を使いたくて `yarn global add lodash` としても、なぜか`import _ from 'lodash'` がエラーになります。

```shell
To install it, you can run: npm install --save lodash
```

とか表示されてんです。**なんで pug とかグローバルに入って lodash は入らないのか**は謎です。

とりあえず `yarn add lodash` としたら動きましたがしっくりきません。
辞書のvalueを片っ端から変換するマン

ex: 辞書の中で、valueのtypeがDecimalの場合のみintに変換する

```python
from decimal import Decimal
before = {'a': Decimal(100), 'b':20, 'c':'cccc', 'd': Decimal(200)}
after = dict([(k, int(v) if type(v) is Decimal else v) for k,v in before.items()]) 
print(after)
# {'a': 100, 'd': 200, 'c': 'cccc', 'b': 20}
```

最初にkey,valueのタプルにしてから、変換して再度dictに戻している。
走査関数でもっとどうにかできないものか。
OSXのjenvでjavaのバージョン管理


## jenvのインストール

まず

```bash
brew install jenv
```

でインストールする。
次に

```bash
echo 'export PATH="$HONE/.jenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(jenv init -)"' >> ~/.bash_profile
```

でPATHを通しておく。
※javaをインストールしている場合は次の「javaのインストール」という手順をスキップする


## javaのインストール

最新版（2018/8 現在に置いてはjava10）のインストールであれば


```bash
brew cask install java
```

で可能。
ただ、今回はDigdag起動のためにインストールするのでjava8を選択したい

```bash
brew cask install java8
```

とやっても、

```bash
Error: Cask 'java8' is unavailable: No Cask with this name exists.
```

とエラーになりインストールできない。
一応、下記の方法でbrewインストールすることはできるが今回は、[Oracleの公式](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)から
se8 kitのdmgをダウンロードしてきてインストールを行う（今回インストールに使ったのは「jdk-8u181-macosx-x64.dmg」）
(zuluとは、Azulが出しているオープンソースのJava SE標準に完全準拠したOpenJDKの認証ビルド)


```bash
brew cask install caskroom/versions/zulu8
```

インストーラーを起動したら、特に設定をいじる必要もなくすぐインストールも終わるので、
終わったら

```bash
$ java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
```

という感じでバージョン確認すると、java8がインストールされていることがわかる。

## javaをjenvでの管理対象に加える

jenv addコマンドで管理対象に加えるためにJVM Homeのパスを調べておく


```bash
~$ /usr/libexec/java_home -V
Matching Java Virtual Machines (1):
    1.8.0_181, x86_64:	"Java SE 8"	/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home
```

という感じに出てくるので、「/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home」の部分をコピーし

```bash
jenv add /Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home
```

として、jenv versionsで確認すると

```bash
* system (set by ....)
  1.8
  1.8.0.181
  oracle64-1.8.0.181
```

みたいな感じに出てくるので、あとはjenv globalやjenv localなどのコマンドで好きなバージョンのjavaを都度設定すればOK
jupyterのcheckpoints関連ファイルをgit管理から外す


.ipynb_checkpoints/以下のファイルまでgit管理の対象とすると、mergeやpullなどで、以下のようなエラーが発生する場合がある。  

```bash
error: The following untracked working tree files would be overwritten by merge:
```


なので、gitignoreファイルを作成し、git管理から外す。  
まず

```bash
touch .gitignore
```

で空のファイルを作成し、ファイルの中に


```
notebookが置いてあるフォルダパス/.ipynb_checkpoints/
```

と書いて保存する。
※/.ipynb_checkpoints/以下のファイルはすべて管理対象から外す、という記述


すでに一度git管理下に置いてしまっている場合（エラーが出るということはgit管理しているということ）は

```bash
git rm -r --cached .
```

でいったん、git管理からすべて外す。
※rmコマンド入ってますが、ファイル自体を消すわけじゃないです。

あとは普通にgit addすればよいが、それをやるまえに
ほんとに管理対象から外れているか確認するには、以下のコマンドを叩けば、管理外のファイルが表示される


```bash
git ls-files --other --ignored --exclude-standard
```
超初心者のAngular学習〜1日目〜

# 最初に
まず1ヶ月に1回の更新予定が、一回更新して終わってしまう危機に！！
と思っていたのだが、仕事の関係でフレームワークでAngularを使うことになり四苦八苦
ということで、備忘録ついでに1日目は環境構築手順とAngularで使われるTypeScriptの基本の型をおさらいする。
# 開発環境（ハード）

| OS      |       CPU |   メモリ     |SSD(HDD)|
|:-----------------|------------------:|:------------------:|:------------------:|
| Ubuntu 18.04.1 LTS         |             Xeon(R) CPU E31240 @ 3.30GHz |  12GB  |240GB+120GB+1.8TB(HDD)|
| macOS High Sierra    |           Intel Core i7 @ 2.2GHz |       16GB      |256GB(使用領域約160GB)|
| Windows10 Pro (Bootcamp)           |              Intel Core i7 @ 2.2GHz |        16GB        |256GB(使用領域約90GB)|

#開発環境（実行環境）
まずはnode.jsのインストールお願いします。

- Macの場合

Homebrewをインストールしたあとにこのコマンドでインストールできます

```
$ brew install nodebrew  //node.jsのバージョン管理ソフト
$ nodebrew ls  //node.jsのバージョン参照
$ nodebrew use v0.8.00  //バージョン指定してインストール
```
- Ubuntuの場合(バージョン指定はググってください)

普通にコマンドでインストールできます。

```
$ sudo apt-get install -y nodejs npm
```

- Windowsの場合

nodistをインストールしたあとにコマンドでインストールします

```
$ nodist dist  //node.jsのバージョン参照
$ nodist + 8.0.0  //バージョン指定してインストール
```



基本的なコマンドは"node -v"、"npm -v"、"npm install"などがあります。
あとデバッグは**Google Chrome**のデバッグを使います。（Windowsの方はF12押せば行けます。それ以外の方はその他ツールからデベロッパーツールで使ってくださいな）

# 基本的なTypeScriptのプリミティブ型
まず簡単な説明するとTypeScriptはその名の通り型付けの強いスクリプト言語、要は真面目なJavaScript
ここのニュアンスはたぶんしっかりとした考え方を持ってる方には怒られそう（爆）
※あとプリミティブ型というのは言語が指定したデータ型のみを入れれるようにする箱みたいなもんです。
基本的にはこんな感じです。

| 表記    |       型 |   
|:-----------------|------------------:|
| const s : string            |              文字列 | 
| const n : number         |           数値 | 
| const b : boolean      |              論理 | 

null,undefinedは変数としての定義はありません。
※ちなみにnullは空っぽ、undefinedは未定義の型を指してます。

#１日目終了
まあここは開発環境の部分と基礎的な知識のまとめなんで深くはありません。
次からAngularインストールと実際にチュートリアルを動かして行きたいと思います。
画像の任意の領域のクリック判定のやり方

#やろうとしていること
画像をクリックして、特定の範囲だったらアイテムを取得するように判定したい。
下記のサイトを参考に、実装してみた。

http://www110.kir.jp/Android/ch0505.html


#つまった部分
##tryとcatch

tryとはjavaにおいて**例外**を処理する基本の操作方法である。

```java

try{
例外をスローする可能性のある処理
}
catch(例外クラス型　引数名){
例外処理(例外ハンドラ)
}　
finally　{
　　最後に必ず実行される処理　　//fainallyは無くても実行できる
}
```
今回try内で実行しているのはInputstreamでファイルを開き、mBitmapに渡している。assetsフォルダ(下記で説明)の中に指定したファイルが無い時などにcatch内のコードが実行される。
参考にしていたコードでは例外が発生したときに何も実行しないようになっていたが、e.printStackTrace()を実行することで標準出力に原因が出力される。

```java
try {
   InputStream is = getResources().getAssets().open("sirokuma.jpg");
   mBitmap = BitmapFactory.decodeStream(is);
} catch (Exception e) {
   e.printStackTrace();
}
```
##InputStream is = getResources().getAssets().open("sirokuma.jpg");でしていること
###Inputstreamとは
バイナリファイルを読み込むクラス。isは頭文字をとって命名されている。
###Assetsフォルダー
\AndroidStudioProjects\Test_Application(アプリ名)\app\src\mainの中に置かれているフォルダー。複数の画像ファイルなどをまとめておいておける。res/drawableと何が違うかよくわからない。

![スクリーンショット (20)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/297994/15a3f41b-107f-8d41-2fbb-50411e718527.jpeg)
ここにいれておけばgetResources().getAssets().open("ファイル名")で開くことが出来る。
複数のファイルを読み込むなど、何度も記述する場合はgetResources().getAssets()の部分をAssetManagerとしてまとめると可読性が高まる。
AssetManager assetManager = getResources().getAssets();
assetManager.open("ファイル1");
assetManager.open("ファイル2");

####Assetsフォルダーの作り方
mainファイルを選択し右クリック/New/Folder/Assets Folderとすると作成してくれる。
![スクリーンショット (21)_LI.jpg](https://qiita-image-store.s3.amazonaws.com/0/297994/4e97ff4e-0c69-4f3c-afa9-c56b21dab279.jpeg)

_参考にしたサイト_
http://pentan.info/android/app/sample/asset_manager.html
RailsでのURLの取得

#はじめに
エンジニア1年生です。
日々の学びのメモとしてコツコツと記事を書こうと思っています。
今回は第一弾としてRailsでのURLの取得について書いていきます。

#RailsでのURLの取得
URLの取得にはリクエストを送ってきたユーザのヘッダー情報や環境変数を取得する**request**を使用します。

例としてリクエスト元を`https://hoge.com/show`現在地を`https://hoge.com/new`とします。

####１，現在のURLを取得したい

```ruby:controller.rb
#newアクションに記述
@url = request.url
```
`@url = https://hoge.com/new` となります。

####２，リクエスト元（遷移元）のURLを取得したい

```ruby:controller.rb
#newアクションに記述
@url = request.referer
```
`@url = https://hoge.com/show` となります。

以上です。
PHP基礎（１１）変数たち

#変数たち

変数には大きく分けて、インスタンス変数（privateなメンバ変数＝プロパティ）、クラス変数（staticプロパティ）、ローカル変数、グローバル変数の４つがあります。
各々は、下記のようなルールでその使い所や、スコープ（有効範囲）が決まります。


##1.インスタンス変数
インスタンス変数はインスタンスごとに独立して値が保持される変数です。同じクラスの複数のインスタンス同士で異なる値になります。

インスタンス変数の使い方として典型的なのは、コンストラクタ（__construct）で受けた引数を使ってインスタンス変数を初期代入し、その後、それぞれのインスタンスメソッドで参照・変更される使い方です。

作り方としては、クラス内にprivateの変数として宣言し、この変数の参照・代入が必要なメソッドでは$this->変数名で参照します。

```php
<?php
/* 四角クラス */
class Square {
  /* 縦 */
  private $height;
  /* 横 */
  private $width;
  function __construct($height,$width) {
    $this->height = $height;
    $this->width = $width;
  }

  /* 面積計算 */
  function calcArea() {
    return $this->height * $this->width;
  }
}

//呼び出し
$sq = new Square(40,20);
$area = $sq->calcArea();
echo "area = $area ";// => 800

$sq2 = new Square(4,3);
$area = $sq2->calcArea();
echo "area = $area ";// => 12

$area = $sq->calcArea();
echo "area = $area ";// => 800
?>
```

ただこのインスタンス変数はstaticと付けたクラスメソッドからは呼べません。
下記はエラーになります。静的な領域からインスタンス変数は呼べないのです。

```php
<?php
/* 四角クラス */
class Square {
  /* 縦 */
  private $height;
  /* 横 */
  private $width;
  function __construct($height,$width) {
    $this->height = $height;
    $this->width = $width;
  }

  /* 面積計算 */
  public static function calcArea() {
    return $this->height * $this->width;// ここでエラー
  }
}

//呼び出し
$area = Square::calcArea();
echo "area = $area ";
?>
```

##2.クラス変数

クラスの静的変数はそのクラスの全てのインスタンスで共有される変数で、同一クラスのインスタンス間で共有変数になります。staticプロパティとも言います。
インスタンス間で共有されるので、そのクラス固有の唯一の変数として扱えます。

```php
<?php
/* 四角クラス */
class Square {
  /* 縦 */
  public static $height;
  /* 横 */
  public static $width;
  function __construct($height,$width) {
    self::$height = $height;
    self::$width = $width;
  }

  /* 面積計算 */
  function calcArea() {
    return self::$height * self::$width;
  }
}

//呼び出し
$sq = new Square(40,20);
$area = $sq->calcArea();
echo "area = $area ";// => 800

$sq2 = new Square(4,3);
$area = $sq2->calcArea();
echo "area = $area ";// => 12

$area = $sq->calcArea();
echo "area = $area ";// => 12
?>
```



##3.ローカル変数
メソッドの中をスコープとする、変数名に$を付けた形で宣言される普通の変数です。メソッドの引数もメソッドの中で生きられるローカル変数です。

##4.グローバル変数

関数の外で初期化した変数を関数の中で使うときはglobal文を使ってその変数を参照します。

```php

<?php
$a = 1;
$b = 2;
function sum() 
{
    global $a, $b;

    $b = $a + $b;
} 
sum();
echo $b;
?>
```
関数の外と内では変数スコープ（有効範囲）が異なるという意味です。

#演習

**2-7-1）**
適当なクラスを作り、インスタンス変数を定義し、そのクラスのコンストラクタと、任意のメソッドの中でそのインスタンス変数の値を変更、表示できることを確認して下さい。

**2-7-2）**
2-7-1で作ったクラスを別のインスタンスとしてメソッドを呼び出し、インスタンス変数が共有化されていないことを確認して下さい。

**2-7-3）**
2-7-2で作ったクラスの中で、静的変数を定義し、任意のメソッドの中でその値を変更、表示できることを確認して下さい。

**2-7-4）**
2-7-3で作ったクラスを別のインスタンスとしてメソッドを呼び出し、クラス変数が共有化されていることを確認して下さい。

[＜＜PHP基礎（１０）公開レベル]
(https://qiita.com/taka027/items/7937ad9ea1130d73feb2)

[PHP基礎（１２）カプセル化＞＞]
(https://qiita.com/taka027/items/c821b089b1e88fe8a241)
GitHubからリポジトリをcloneし、pushするまで

# GitHubからリポジトリをcloneし、pushするまで

新しい環境を作るたびに忘れるので、簡単なメモ

まずgitのユーザ名など登録を行う。
ここでのユーザ名はcmmmitログなどに表示される

```bash
git config --global user.name "ユーザ名"
git config --global user.email "メールアドレス"
```

次にsshキーの作成と確認を行う

```bash
ssh-keygen -t rsa -b 4096 -C "メールアドレス"
```

キーが作成できたら、publicの方をコピーしてgithubのSSHキーに追加する
以下コマンドで確認できる

```bash
cat ~/.ssh/id_rsa.pub
```

pushできるようにリモートブランチを追加しておく

```bash

git remote add origin リモートリポリトリのURL

```

次にリモートからリポジトリをCloneしてくる

```bash
git clone リモートリポリトリのURL
```

必要な内容変更を行ったら、以下のコマンドでpushできる

```bash
gid add .
git commit -m "メッセージ"
git push origin master
```
Conohaの設定3種目@備忘録

## はじめに
今回も主にリンク集です。

## Webサーバの設定
[Conoha初期設定](https://qiita.com/ongaeshi/items/bb17ebfbd4d22057c8fd)

## DBサーバ分離

[Conoha DBサーバ](https://hombre-nuevo.com/vps/vps0006/)
[Conoha 公式サイト](https://www.conoha.jp/guide/dbnetwork.php)

## メールサーバも立てようね

[Conoha Mailサーバ](https://superspeed-fall.com/entry/2015/06/03/223850)
[Conoha Mailサーバ2](https://superspeed-fall.com/entry/2015/06/03/223850)