OmniAICreator/Qiita-1.07M huggingface dataset:
VPN接続状態でVagrantを起動すると共有フォルダのマウントに失敗する


## 概要
Laravelで開発してたら、急にローカルで立ち上げてるサイトが開かなくなりました。
ずっとぐるぐるしてます。
<img width="1440" alt="スクリーンショット 2019-04-17 10.44.54.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/d0833d28-453e-97c7-4ec4-6fea1ab734b2.png">

試しにVagrantをリロードしてみると、共有フォルダのマウントのところでタイムアウトします。

```bash
$ vagrant reload

==> homestead-7: Attempting graceful shutdown of VM...
==> homestead-7: Checking if box 'laravel/homestead' version '7.1.0' is up to date...
#(省略)
==> homestead-7: Exporting NFS shared folders...
==> homestead-7: Preparing to edit /etc/exports. Administrator privileges will be required...
Password:
==> homestead-7: Mounting NFS shared folders...

The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!
mount -o vers=3,udp,actimeo=1,nolock 192.168.10.1:/Users/kurogi-kurumi/code /home/vagrant/code
Stdout from the command:
Stderr from the command:
mount.nfs: Connection timed out
```

`$ vagrant status`で確認すると、Vagrant自体は起動している状態です。


## 原因
VPN接続またはファイアウォールにより、セキュリティがかかっている。

## 解決策
VPNを切断またはファイアウォールを許可(または無効)します。
私の場合はVPNに使用していたCisco AnyConnectのソフトを終了しました。
<img width="1440" alt="スクリーンショット 2019-04-17 10.28.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140953/8aff4a86-7486-2114-72df-c36d2802835f.png">
~~その後、PCを再起動します。~~
PC再起動しなくても仮想マシンのネットワークの再起動を行えば解決するようです。

```
$ ifconfig
```

でPCのネットワーク一覧を確認します。
私の場合は**vboxnet0**と**vboxnet1**を再起動しました。

```
$ sudo ifconfig vboxnet0 down
$ sudo ifconfig vboxnet0 up
$ sudo ifconfig vboxnet1 down
$ sudo ifconfig vboxnet1 up
```

**参考**
https://serima.co/blog/?p=469
https://github.com/hashicorp/vagrant/issues/5802

## 最後に
あくまで原因&解決策の一つなのでご了承ください。
他にも`$ sudo nfsd restart`でNFSを再起動して直る場合もあるみたいです。
記事に間違いや不明な点があれば遠慮なくご指摘ください。
【BluePrism】複数の要素に一括で値を設定する

##概要
Yahoo!路線情報にて、検索画面の「日時」「手段」の各要素を
一括でセットしてしまえることに感動したという話ですｗ

- 「日時」はExcelの月日と9:00固定でセット
- 「手段」はすべてのチェックボックスをOFFにセット

とします。
※ちなみに「日時」9:00でセットしているのは、日中の路線検索結果を拾いたかったからです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/32028fdc-b5d1-1b66-f168-b1764fedb31d.png)

##方法
「日時」の箇所については、書き込みステージを使って、各要素を一括で設定してしまいます。
UiPathやWinActorだと一括設定ってできなかった気が。。。（できたらごめんなさい）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/671ed07f-5b6d-653e-3ab3-609fcd848c97.png)

「手段」の箇所についても同様です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/d5668b73-58c6-29f4-b5fb-db15ad183176.png)

##結果
一括でセットされます。美しいですねｗ

![blogmv2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186221/dea690b3-b054-9e86-f730-00bf4c2e5e0b.gif)


##注意
あまりにも多くの要素を一括でセットしてしまうと、例外が発生してしまった場合に
どの要素が原因なのかを解析しづらくなってしまいます。

できれば要素一つ一つに対して例外処理を書いてあげるのが丁寧ですが、
今回のように「日時」「手段」といった**一つのまとまり**であれば、
一括設定する実装にしてしまうのもアリかなと思います。
unsafeコンテキスト以外でIntPtrからSpan<T>またはReadOnlySpan<T>に無理矢理変換する方法

# How to force conversion from IntPtr to `Span<T>` or `ReadOnlySpan<T>` without unsafe context

[以前の記事](https://qiita.com/kenichiuda/items/fc0d389ee5117eb0638c)で`IntPtr`から`Span`/`ReadOnlySpan` に変換できないこと書いたが、無理矢理なんとかしてみる。

力技といえば動的コード生成。

## ソースコード

多分こんなので動くはず。

```csharp
using System;
using static System.Linq.Expressions.Expression;

namespace IntPtrToSpan
{
    public static class IntPtrToSpanExtention
    {
        public static Span<T> AsSpan<T>(this IntPtr pointer, int length) =>
            //return new Span<T>(pointer.ToPointer(), length);
            Impl<T>.Delegate(pointer, length);
        public static ReadOnlySpan<T> AsReadOnlySpan<T>(this IntPtr pointer, int length) =>
            //return new ReadOnlySpan<T>(pointer.ToPointer(), length);
            Impl<T>.ReadOnlyDelegate(pointer, length);

        private delegate Span<T> AsSpanDelegate<T>(IntPtr pointer, int length);
        private delegate ReadOnlySpan<T> AsReadOnlySpanDelegate<T>(IntPtr pointer, int length);
        static class Impl<T>
        {
            private static Func Generate<Func>(bool readOnly)
            {
                var pointer = Parameter(typeof(IntPtr), "pointer");
                var length = Parameter(typeof(int), "length");

                var constructor = (readOnly ? typeof(ReadOnlySpan<T>) : typeof(Span<T>)).GetConstructor(new[] { typeof(void*), typeof(int) });
                var lambda = Lambda<Func>(
                    New(constructor,
                        Call(
                            pointer,
                            typeof(IntPtr).GetMethod(nameof(IntPtr.ToPointer), Type.EmptyTypes)),
                        length),
                    pointer,
                    length
                    );
                return lambda.Compile();
            }
            public static AsSpanDelegate<T> Delegate = Generate<AsSpanDelegate<T>>(false);
            public static AsReadOnlySpanDelegate<T> ReadOnlyDelegate = Generate<AsReadOnlySpanDelegate<T>>(true);
        }
    }
}
```

## 個人的なハマりポイント

- `Func` の型引数で `ref struct` を指定できないので、デリゲートを定義した。
- Lambdaのパラメータと式中のExpressionで別々のインスタンスを使用していたら、`InvalidOperationException: variable 'someVariable' of type 'SomeType' referenced from scope '', but it is not defined`って例外が出て「定義されているやろ」って悩んだ。
- コンパイラの生成した式ツリーを参考にしようと`Expression<Func<IntPtr,int, Span<T>>> a = (pointer, length) => new Span<T>(pointer.ToPointer(), length);`をコンパイルしようとしたら、`ref struct`を式ツリーに含められないようでコンパイルエラーになった。
- 「`typeof(void*)` ってunsafeコンテキスト以外だとどうやっってとってきたらいいんだ？」って思ったら、unsafeコンテキストじゃなくても大丈夫だった。
SQLで日時の経過時間（hh:mm:ss）を抽出する

SQLServerで２つの日付の経過時間を抽出するには、以下のSQLで抽出できます。
処理に掛かった時間（タイムスパン）を求めたい時などに使えます。

## SQL
```sql

DECLARE @出勤時間 DATETIME = '2019-04-17 08:45:23.900'
DECLARE @終了時間 DATETIME = '2019-04-17 18:00:25.080'

SELECT                  
 @出勤時間 AS 出勤時間 
,@終了時間 AS 終了時間 
,CONVERT(CHAR(12), 
	DATEADD(SECOND, 
		DATEDIFF(SECOND, @出勤時間, @終了時間), CONVERT(DATETIME, 0)), 108) AS 経過時間
,CONVERT(CHAR(12), 
	DATEADD(MILLISECOND, 
		DATEDIFF(MILLISECOND, @出勤時間, @終了時間), CONVERT(DATETIME, 0)), 114) AS [経過時間(ミリ秒)];
```
## 抽出結果

|    出勤時間              |      退勤時間            |  勤務時間  | 勤務時間（ミリ秒） |
|:-----------------------:|:----------------------:|:--------:|:------------:|
| 2019-04-17 15:49:23.900 |2019-04-17 15:50:25.080 |  00:01:02  | 00:01:01:180 |
[WIP] Git コマンド集

# Git コマンド集

## 基本的な操作
|   　　　　 コマンド  　  　 　|      説明       |
|:----------------:|:----------------------------:|
| git init         |       リポジトリの状態を初期化     |
| git status       |         リポジトリの状態を確認     | 
| git add          |    ステージ領域へファイルを追加     |
| git commit       |    リポジトリの歴史を記録           |
| git log          |         コミットログを確認         |
| git diff         |          変更差分を確認         |

## ブランチの操作
|   　　　　 コマンド  　  　 　|        説明        |
|:----------------:|:----------------------------:|
| git branch         |      ブランチを一覧表示     |
| git checkout -b     |         ブランチを作成し切り替える     | 
| git merge （--no-ff）          |    ブラントをマージ （マージコミット）    |
| git log --graph       |    ブランチを視覚的に確認する      |

## コミットを変更する方法
|   　　　　 コマンド  　  　 　|      説明       |
|:----------------:|:----------------------------:|
| git reset         |      歴史を戻る     |
| git commit --amend   |         コミットメッセージを修正     | 
| git rebase -i     |    歴史を押しつぶして改変     |

## リモートリポジトリへの送信
|   　　　　 コマンド  　  　 　|       説明       |
|:----------------:|:----------------------------:|
| git remote add      |     リモートリポジトリを登録     |
| git push   |      リモートリポジトリへ送信     | 

## リモートリポジトリから取得
|   　　　　 コマンド  　  　 　|       説明       |
|:----------------:|:----------------------------:|
| git clone      |     リモートリポジトリを取得     |
| git pull   |    最新のリモートリポジトリブランチを取得     |
[Linux] Docker インストール

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137182/26efc0ff-902e-e17d-8c38-8a2ffce4c080.png)


```
docker rmi
```

```
docker rm -f
```


``` 
docker ps -a
```

```
docker images
```


```
docker run -d -p 9876:3306 -e MYSQL_ROOT_PASSWORD=password mysql:5.6
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/137182/1dd47d72-cc1c-81b3-b4ca-656a0349a229.png)

```
docker exec -it d84a2f925069 /bin/bash
```

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

```
 mysql -u root -p --host 172.17.0.2 --port 3306
```
【自分用メモ】Laravel5で開発環境作成

[Laravel5.4の環境構築]
参考サイト
Laravel5.4の環境構築 - Qiita
	https://qiita.com/Syo_pr/items/4994f71e8c9152ceee0d
CentOS7にApache2.4＋PHP7＋mysql5.7のLAMP環境構築 | イー・アルゴリズム
	https://e-algorithm.xyz/centos7-lamp-apache2-4-php7-mysql5-7/
さくらのクラウド CentOS7へPHP7+MySQL5.7+Apache2.4のインストール＆設定 | Webフリーランスとして働く
	https://adan.jp.net/blog/programing/1235
yumでCentOS6.7にPHP7をインストールする方法とハマった点 | Lancork
	https://www.lancork.net/2016/05/yum-centos67-php7-install/
 
```ruby:Linux
$ yum update
$ yum install -y git vim
$ setenforce 0
$ systemctl stop firewalld
$ vim /etc/yum.repos.d/epel.repo
編集画面で[epel]の中身を"enable=1"を”enable=0”にする。

$ yum install -y httpd
$ httpd -v
$ systemctl enable httpd
$ systemctl start httpd.service

$ yum -y remove mariadb-libs
$ rm -Rf /var/lib/mysql/

$ yum -y remove mariadb-libs
$ rm -Rf /var/lib/mysql/
$ yum -y localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
$ yum list | grep mysql
$ yum -y install mysql-community-server
$ mysqld --version
Ver 5.7.22
$ systemctl enable mysqld.service
$ systemctl start mysqld.service
$ grep password /var/log/mysqld.log
 eQ!3!SyjCwZq
$ /usr/bin/mysql_secure_installation
 pukupuku.Map29

$ yum install --enablerepo=remi,remi-php70 -y install php php-cli php-devel php-common php-mbstring php-mysql php-phpunit-PHPUnit php-pecl-xdebug php-fpm php-gd php-gmp php-mcrypt php-opcache php-pdo php-xml
 PHP 5.4.16
$ wget http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
$ rpm -Uvh ./remi-release-7.rpm
$ yum remove php-*
$ yum --enablerepo=epel install libmcrypt 
$ yum info --enablerepo=remi,remi-php72 php
$ yum search --enablerepo=remi,remi-php72 php
$ yum -y install --enablerepo=epel,remi,remi-php72 php php-mbstring php-xml php-xmlrpc php-gd php-pdo php-pecl-mcrypt php-mysqlnd php-pecl-mysql
$ php -v
PHP 7.2.7
$ vim /etc/yum.repos.d/remi-php70.repo
$ vim /etc/httpd/conf/httpd.conf
$ systemctl restart httpd.service

$ curl -sS https://getcomposer.org/installer | php
$ mv ./composer.phar /usr/local/bin/composer

$ vim /etc/httpd/conf/httpd.conf
"/var/www/release/public"

$ cd /var/www/
$ composer create-project --prefer-dist laravel/laravel release

$ systemctl restart httpd.service
```
Andoridで背景を押して、キーボードを非表示にする方法

Androidで背景を押して、キーボードをを非表示にできないとかなり不便ですよね？
キーボードの下に入力欄があったりすると入力できないですし。
戻るボタンを毎回押すのは大変だと思い、背景を押すと、キーボードを非表示にする処理を入れようと思います。

ただ、いろいろ調べていてもなかなかしっくりくるものがなくうーんと思っていたら、しっくりくる方法がありました。
手順は2つあります。

####①フォーカスされるViewの作成

まずはViewの作成です。
作成するViewは背景をタップしたときにフォーカスされるViewです。
フォーカスされるとキーボードの表示がなくなるので、そのためのものです。

```
<TextView
    android:id="@+id/focusView"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:focusable="true"
    android:focusableInTouchMode="true"
    app:layout_constraintBottom_toTopOf="parent"
    app:layout_constraintEnd_toStartOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />
```

実際に画面に表示はしないので、幅・高さは0dpにします。
そして、focusable="true"を設定します。

####②入力欄以外を押したときの処理を追加

フォーカスが変わったときの処理を追加します。
フォーカスが変わった時なので、フォーカスが合った時と外れたとき同様に通る処理になります。

```
titleEdit.setOnFocusChangeListener { v, hasFocus ->
        if (!hasFocus) {
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm.hideSoftInputFromWindow(v.windowToken, 0)
        }
    }
```

hasFocusがfalseのとき、つまり、フォーカスが外れたときにキーボードを非表示にする処理になります。

上記の手順で、キーボードが非表示になりました。
他に調べた方法だと、フォーカスが当たった時と外れたとき別々に処理を記載する等ありましたが、これが一番しっくりきました。
また、dispatchTouchEventで行うという方法もありましたが、他の入力欄がタップできなかったり、ソースコードが多くなったりとあり、見送りました。

他にいい方法があれば、教えていただきたいです。
iOSSnapshotTestCaseでスナップショットテストを行う実装のサンプル

iOSSnapshotTestCaseを使用してスナップショットテストを行う際の大まかな実装についての個人的なまとめ

iOSSnapshotTestCase: https://github.com/uber/ios-snapshot-test-case

# 前置き
スナップショットテストはViewのテストであり、ロジックのテストでは無い
ロジックはロジックでテストを実装すること

# スナップショットテストの目的
Viewのリグレッションテストを全て人間がやるのは辛いので、ある程度の自動化を図る

# 実装
`言語`と`デバイス`の組み合わせ毎のスナップショットテストを行うサンプル
テストクラスの外で実装したfunctionの挙動についてはソースコメント参照

``` swift
import FBSnapshotTestCase
@testable import SnapShotTestExample

class FBSnapshotTestCaseSwiftTest: TestCase {
    private let baseball = Sample.baseball
        |> Sample.lens.state .~ .successful // テスト用のtemplateデータをテストケースに合わせて再作成する(state = .successful)
    private let yamada = User.yamada
    private let xxx = Xxx.template

    override func setUp() {
        super.setUp()
        UIView.setAnimationsEnabled(false)
//        recordMode = true
    }
    
    override func tearDown() {
        UIView.setAnimationsEnabled(true)
        super.tearDown()
    }
    
    func testXxx() {
        // Mockを用意する
        let service = MockService(fetchXxxResponce: self.xxx)
        
        // LanguageとDeviceの組み合わせのタプルを回す
        combos(Language.allCases, [Device.phone4_7inch, Device.phone5_8inch, Device.pad]).forEach {
            language, device in
            withEnvironment( // テスト用の一時的な環境を作ってテストを実行する
                apiService: service,
                language: language
            ) {
                let controller = SampleViewController.configuredWith(sample: self.baseball, user: self.yamada)
                
                // 指定した `デバイス(サイズ)` と `向き` のviewcontrollerを作る
                let (parent, _) = traitControllers(device: device, orientation: .portrait, child: controller)

                // スナップショットテスト
                FBSnapshotVerifyView(parent.view, identifier: "lang_\(language)_device_\(device)")
            }
        }
    }
    
    func testXxx_Canceled() {
        // テスト用のtemplateデータをテストケースに合わせて再作成する(status = .canceled)
        let xxxCanceled = .template |> Xxx.lens.status .~ .canceled
        let service = MockService(fetchXxxResponce: xxxCanceled)
        
        combos(Language.allCases, [Device.phone4_7inch, Device.phone5_8inch, Device.pad]).forEach {
            language, device in
            withEnvironment(
                apiService: service,
                language: language
            ) {
                let controller = SampleViewController.configuredWith(sample: self.baseball, user: self.yamada)
                let (parent, _) = traitControllers(device: device, orientation: .portrait, child: controller)
                
                FBSnapshotVerifyView(parent.view, identifier: "lang_\(language)_device_\(device)")
            }
        }
    }
}
```
``` swift
extension Sample {
    internal static let template = Sample(
        id: 1,
        name: "Sample",
        state: .live
    )
    
    // 代表的なテストデータtemplateを定義する(id = 50, name = "Baseball")
    internal static let baseball = .template
        |> Sample.lens.id .~ 50
        |> Sample.lens.name .~ "Baseball"
}
```

# 最後に
makefileなどを使ってコマンドでテストを実行できるようにすると良い
Excel VBAでユーザーフォームを作成する時

ExcelVBAを個別受講している方から、「どうしてもフォームを作りたい」との要望があったため、必要な点をまとめてみた。

#前提
ExcelVBAを使用して、ある程度のコーディングができる方

#ユーザーフォームの作成
１．VBEのプロジェクトエクスプローラでユーザーフォームを挿入

２．フォームのプロパティを設定

３．ツールボックスで、必要なオブジェクトを追加

４．各オブジェクトのプロパティを設定
　　できればオブジェクト名を分かりやすいものに変更し、Tabstopの順番を整える

５．必要な処理をVBAでコーディング
　　Excelシートを使用した場合よりも、フォームの入力制御等しっかりやるイメージ

６．フォームの呼び出し元をコーディング
　　ファイルを開いた時にするなら、Workbook_Openイベント

７．テストしてできていたら完成

#必要知識
・ツールボックスの各オブジェクトの機能とプロパティ
・各種イベント
※使いそうなものだけでOK

#個人的なつぶやき
フォームを作るとなると、結構システムちっくになるので、ある程度システム屋としての観点も必要なのではと思います。
Excelで作るツールなんて、ざっくりした要件しか言われなかったり、きちんと設計せずに実装し始める場合も多いけど、「システムだったらこれって普通こうなってるよね？」という暗黙の要件を入れていく必要ありそう。

ExcelVBAの場合、Excelシートにもフォームコントロールが挿入できるため、よっぽど作りこむ時以外はユーザーフォームは必要ないんじゃないかな。。。

ただ、AccessVBAへのステップ的な勉強にはなる！
LiveDataのあれこれ

#LiveDataを使ってみて

###LiveDataとは
**ライフサイクル**に応じて自動的に購読解除してくれる通知プロパティ

公式ドキュメント：[AndroidDevelopers](https://developer.android.com/topic/libraries/architecture/livedata.html)

####コード例
``` kotlin
class A {
  
  private liveData = MutableLiveData<String?>() 
  
  override fun onCreate(savedInstanceState: Bundle?) {
     super.onCreate(savedInstanceState)

     liveData.observe(this, Observer { value ->
       value?.let {
         Log.d("#######", "liveData Value : $value")
       }
     })
   }

  override fun onResume() {
    super.onResume()
    liveData.value = "test"
  }

  ......
}
```

onCreate内でLiveDataの監視を始め、onResumeでLiveDataに値を代入した際に、変更が通知され、Log.dが実行される

####LiveData使用する際に気をつけること
1. 使用できる条件
2. 値のnullチェック
3. 監視を始める場所

> 使用できる条件

**ライフサイクル**に合った実装になっていること
LibeDataが通知を受け取るのは、Observerがアクティブになっていることが条件
もし、Activity Aでobserveした後、Activity Bに遷移し何らかの方法でLiveDataに値を代入したとしてもActivity Aはアクティブではないため、通知がない
**※基本的にLiveDataの変数宣言はViewModelで行い、監視を始めるのはActivityで行なう**

> 値のnullチェック

基本的にLiveDataの値はNullableになっているため、nullチェックを行なう
nullチェックはif文で行なうのも良し、letなどのスコープ関数を用いても良し

> 監視を始める場所

**監視を始める場所＝observeする場所**
監視を始める場所は公式のサンプルでもonCreate内になっている
もし、onResumeなどで開始をするとどうなるか
onResumeにobserveするとバックグラウンドでの起動状態からアプリに復帰した際に、何度も監視されてしまう
そのため、値が変更された時に何度も通知が起こってしまい、何かのAPI通信のトリガーに用いている場合に多重リクエストしてしまう恐れがある
なので、一度だけ監視が呼ばれるようなライフサイクルを用いる

###まとめ
ニュアンス的にはRxに似ているので捉えやすいかもしれない
LiveDataは使いやすい反面、使い方を間違えると思っていたより面倒くさい事になりそう
まだまだ細かい部分に関してはまだ触れられていないが、気づいたらまた近いうちに、まとめます
Git よく使うコマンドまとめ

#初期設定

###ユーザとメールアドレスを登録する

```
git config --global user.name "XXX"
git config --global user.email "XXX@hogehoge.com"
```

上記のコマンドで、次のように作成されます。

```~/.gitconfig
[user]
    name = XXXX
    email = XXXX@hogehoge.com
```

###リモートリポジトリからプロジェクトのコピー

```
git clone https://github.com/hogehoge.git //https://github.com/hogehoge.gitをコピー
git clone <URL> //URLをコピー
```

#ファイルの更新

###ローカルの変更を確認する

```
git status
```


###ファイルを追加する

```
git add test.go
git add <ファイル名>
```

###addを取り消す

```
git reset HEAD test.go
git reset HEAD <ファイル名>
```

###ファイルをコミットする

```
git commit -m "コメント"
```

###コミットを取り消す

```
git reset --soft HEAD~2 // 最新のコミットを含め過去3件分をワークディレクトリの内容を保持し取り消す
git reset --hard HEAD~2 // 最新のコミットを含め過去3件分のワークディレクトリの内容とコミットを取り消す
```

###ブランチを更新する

```
git push origin master  //masterを更新する
git push origin <ブランチ>　//ブランチを更新する
```

###pushを取り消す

```
git revert HEAD~3 // 最新をふくめ、過去4つ分のコミットを打ち消す
```

#リモートから変更を取得する

###変更履歴を取得する

```
git fetch
```

###ローカルにマージする

```
git pull
```

#ブランチ

###ブランチの作成
```
git branch test  //testを作成する
git branch <ブランチ名>  //ブランチを作成する
```
###ブランチの移動
```
git checkout test  //testへ移動する
git checkout <ブランチ名>  //ブランチへ移動する
```

###ブランチの削除
```
git branch -d test  //testを削除する
git branch -d <ブランチ名>  //ブランチを削除する
```

###ブランチの一覧表示
```
git branch // ローカルブランチの一覧を表示する
git branch -a //リモートとローカルのブランチの一覧を表示する
git branch -r //リモートブランチの一覧を表示する
```

###リモートブランチへチェックアウト
```
git checkout -b test origin/test //リモートブランチへチェックアウト
git checkout -b <ブランチ名> origin/<ブランチ名> //リモートブランチへチェックアウト
```

###merge

```
git checkout master  //masterへ移動
git merge <ブランチ名>  //差分をマージ
git push origin master  //ファイルの更新
```
tortoiseGitのOpenSSH形式での接続の設定（Windows10環境）

#結論
## 「TotiseGit > 設定 > ネットワーク」のSSHクライアントにWindows10標準のsshクライアントを指定する

# 経緯
### GitHubにSSHの公開鍵を設定しているのに、TotiseGitでclone出来ない
原因は、sshクライアントがTotoiseGitのPuTTY形式のSSHクライアントがデフォルトで指定されていること  
つまり、コマンドラインでssh-keygenで作成したものがホームディレクトリ直下の.sshにid_rsaで吐き出されているとしても、このデフォルトのsshクライアントでは見に行ってくれない  

なので、「tortiseGit > 設定 > ネットワーク」のSSHクライアントをWindows10標準のsshクライアントに変更すれば、ssh接続ができるようになる  
Windows10標準のsshクライアントは「C:\Windows\System32\OpenSSH\」にssh.exeがある  

# 参考
https://www.clear-code.com/blog/2009/7/8.html
http://www.freia.jp/taka/blog/windows-native-ssh-client/index.html
python2の環境でLet's Encryptで./certbot-auto renewがエラーになった場合の対処

## 前提
対象読者:以下を満たす方
- 安いVPSサーバー等、環境構築に制限がありpython2を使っている
- Let's Encryptを使って証明書管理をしている/したい

## 本文
python2でLet's Encryptを利用する為certbot-autoを実行したところ、以下のようなエラーが発生して証明書のupdateが出来ませんでした。

```
/opt/eff.org/certbot/venv/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail.
```

なんかSSL周りでエラーになっていますね。速攻エラーログの内容をそのままぺってググった結果以下をインスト―ルすることに。(logにも出ているurllib3です)

```
# pip install urllib3
Collecting urllib3
  Downloading https://files.pythonhosted.org/packages/62/00/ee1d7de624db8ba7090d1226aebefab96a2c71cd5cfa7629d6ad3f61b79e/urllib3-1.24.1-py2.py3-none-any.whl (118kB)
    100% |################################| 122kB 8.2kB/s
Installing collected packages: urllib3
Successfully installed urllib3-1.24.1
```

結果、無事にrenewが通るようになりました。
手元の環境だと証明書の期限が来ていないのでこんな感じでupdateは実行されません

```
# ./certbot-auto renew
/opt/eff.org/certbot/venv/lib/python2.7/site-packages/cryptography/hazmat/primitives/constant_time.py:26: CryptographyDeprecationWarning: Support for your Python version is deprecated. The next version of cryptography will remove support. Please upgrade to a 2.7.x release that supports hmac.compare_digest as soon as possible.
  utils.PersistentlyDeprecated2018,
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/server.developerkikikaikaienjoy.work.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not yet due for renewal

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

The following certs are not due for renewal yet:
  /etc/letsencrypt/live/server.developerkikikaikaienjoy.work/fullchain.pem expires on 2019-06-21 (skipped)
No renewals were attempted.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
```

renew出来ることが確認できたら、定期実行を仕込んでおきましょう

## その他

Python 2.7のサポートは2020/1/1までです。update出来る環境ならupdateしましょう。

```
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.
```

## 参考
[python 2.7.5 の requests モジュールを用いたら warning が表示される理由は？](https://ja.stackoverflow.com/questions/31278/python-2-7-5-%E3%81%AE-requests-%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E3%82%89-warning-%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E7%90%86%E7%94%B1%E3%81%AF)
UnityでImageを設定しても画像が表示されない時の対処法

## UnityでImageを設定しても画像が表示されない時の対処法
「Color」を選択して、「A(透過率)」の値を255にして下さい。
<img width="213" alt="Screen Shot 2019-04-17 at 23.49.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/250231/a233226e-d3a4-5b7d-d535-6ec7ae9691f3.png">
もしも、上のようにAの値が0のままImageを設定しても画像が表示されないので注意してください。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
Zabbix3.0 ログ監視設定（アイテムとトリガー）について

Zabbix監視設定の備忘録です。

###やりたいこと
ログで指定したエラーメッセージ（ERRORやerror）が出力された場合にアラート検知したい。
但し、特定のメッセージ(notice)は除外し、１０分以上エラーメッセージを検知しない場合はステータスを元に戻す。

###前提条件
- Zabbix3.0を利用
- ログ監視にZabbix Agentを利用
- メール通知する為には別途設定が必要

###内容
①アイテム設定
まずは監視したいログファイルを指定するアイテムを作成する。重要なのは下記３点で、あとは任意でOK。

・タイプ：Zabbixエージェント(アクティブ)
・キー：log
・データ型：ログ

<!--![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207381/2205c78f-3d16-b0bc-7078-7c1cbac672b1.png)-->

②トリガー設定
条件式に①で作成したアイテムを選択肢して、検知したいメッセージ（ERRORやerror等)を記載し正規表現を利用する為"regrexp"で指定して、検知したい場合に"1"を指定する。
除外したいメッセージ（notice）の場合は"0"にする。
このままでは、一度検知するとZabbix上でステータスが"軽度の障害"のままになるので１０分間エラーメッセージがない場合、ステータスを元に戻す設定を"nodata=600秒"を用いて設定する。

```bash:トリガー設定
({Templete App Zabbix Agent:log{/var/log/messages,,,,skip}.regrexp{[E|e][R|r][R|r][O|o][R|r]}=1 and
{Templete App Zabbix Agent:log{/var/log/messages,,,,skip}.regrexp{notice}=0) and
{Templete App Zabbix Agent:log{/var/log/messages,,,,skip}.nodata{600}=0
```
<!--
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/207381/24b1ac20-966a-ca0c-39b6-342ce4a1a344.png)
-->
LaravelでDBのデフォルト文字セットと照会順序を変更する

使用するMySQLのデフォルト文字セットと照会順序と、Laravelの設定を合わせたい時に。

## 使いたいMySQLの設定
![_ 2019-04-17 23.36.54.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6121/5b19eba8-a93a-0417-489d-f43e0a505300.jpeg)

## Laravelの設定を変えるため、database.phpを編集する

```config/database.php
'mysql' => [
            〜略〜
            // 'charset' => 'utf8mb4',
            // 'collation' => 'utf8mb4_unicode_ci',
            'charset' => 'utf8',
            'collation' => 'utf8_general_ci',
            〜略〜
        ],
```

これでmigrationでテーブルを作り直せば、文字セットと照会順序が統一できる。

#### 参考
https://qiita.com/n-funaki/items/6ce33602d096da0968f4
https://www.playfulit.net/articles/kzvXJM6YfWT1mUP492odNfBR
supervisordでpythonのpyramidフレームワークをデーモン化する

# supervisord

知っていますか。
デーモン化するやつです。
これでスタートとかすると、起動します。
ストップとかすると止まります。
なんと、スーパーユーザじゃなくて出来ます。

# 手順
今回は、pythonのpyramidフレームワークでWEBアプリを作ってデーモン化します

## 仮想環境の作成

```
python3 -m venv env3
source env3/bin/activate
```

## 使用するライブラリのインストール

```
pip install pyramid
pip install mr.laforge
pip install supervisor
```

## 使用できるpyramidのテンプレートを確認する
今回はstarterでやろう

```
pcreate --list-templates
Available scaffolds:
  alchemy:  Pyramid project using SQLAlchemy, SQLite, URL dispatch, and Jinja2
  starter:  Pyramid starter project using URL dispatch and Jinja2
  zodb:     Pyramid project using ZODB, traversal, and Chameleon
```

## プロジェクトの作成してインストール

```
pcreate -t starter hello
cd hello
pip install -e .
```

## 通常起動を確認する
http://localhost:6543にアクセス

```
pserve development.ini
```
<img width="844" alt="スクリーンショット 2019-04-17 21.35.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52386/04c7fb9d-0d7a-6dd1-e87c-268a22c887fd.png">

## supervisord.conf作成

```
[supervisord]
childlogdir = log
logfile = supervisord.log
logfile_maxbytes = 50MB
logfile_backups = 10
loglevel = info
pidfile = supervisord.pid
minfds = 1024
umask = 022
nodaemon = false
nocleanup = false

[inet_http_server]
port = 127.0.0.1:7001
username =
password =

[supervisorctl]
serverurl = http://localhost:7001
username =
password =

[ctlplugin:laforge]
supervisor.ctl_factory = mr.laforge.controllerplugin:make_laforge_controllerplugin

[rpcinterface:supervisor]
supervisor.rpcinterface_factory=supervisor.rpcinterface:make_main_rpcinterface

[program:hello]
command = /Users/xxx/env3/bin/pserve /Users/xxx/hello/development.ini
process_name = hello
directory = /Users/xxx/hello/
priority = 10
numprocs = 1
redirect_stderr = true
autostart = false
```

## supervisorの起動
こちらでsupervisordが立ち上がります

```
suppervisord -c supervisord.conf
```

## supervisorctlの対話モードに入ります

```
supervisorctl
```

## supervisorctlの使い方
これで、デーモン化した、pyramidが起動します。http://localhost:6543/

```
supervisor> start hello
```
これで、デーモン化した、pyramidが終了します。

```
supervisor> stop hello
```
対話型supervisorctlから抜けます。

```
supervisor> exit
```
これで、supervisorctlを終了します。

```
supervisor> shutdown
```
Javaの別ファイルのクラスをnewした時のシンボルが見つけられませんエラー

/java/hello/Main.java
/java/hello/Hello.java

~~こういうディレクトリ構造でMain.javaからHello.javaにあるクラスをnewしようとした場合どうやってもコンパイルが通らずわからなかったが親フォルダのjavaフォルダからjavacするとコンパイルが通った。理屈がわからない-verboseで調べても[ソース・ファイルの検索パス: .]と出てくるので余計に混乱した。このディレクトリ構造の場合は以下でできました。ソースコードが間違ってなかったのでこの程度の事に気がつくのに半日かかりました。~~

コメント欄を見ていただいてもいいですがclassファイルがないことが原因だったようです。
その為、Hello.javaを先にjavacすると実行できます。

一応これでも通ったのでこれも載せときます。
`javac hello/Main.java`
ハッシュ関数とは

ハッシュ関数とは

プログラミング初心者なりに『ハッシュ関数とは』何かをまとめてみた。

ハッシュ関数とは

一言でいうと『入力されたデータに対して適当な値を返してくれる関数。』

そしてその返ってきた値をハッシュと呼ぶ。

ちなみに関数にいれるものは『引数』呼ぶ。

ハッシュは引数として関数にいれた値をぐちゃぐちゃにしてハッシュとして返してくれる特性があるため、第三者にばれてはいけないパスワードなどの設定になどに使われる。

ちょっと汚い話になるけれど、

ラーメン（引数）を食べたら
それが体（関数）に入って
うんち（ハッシュ）としてでてくる。

うんちを見た人は一体何を食べたのか分からない。

つまりハッシュは、入力されたデータに対して適当な値を返してくれる関数。だと思えばOKだと思う。
【Swift】UITableViewのセルのタップでキーボードを表示する


1.はじめに
テーブルビューのセルにUITextFieldを設置し、セルのタップでテキストフィールドのキーボードを表示させます。
その際、テキストフィールドをタップしたことによるキーボードの表示は避けます。
なぜかというと、テキストフィールドをタップしてキーボードを表示した場合、セルが選択状態にならないからです。
あくまでも`tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)` からキーボードを表示させるのが目的です。

セルの選択契機とテキストフィールドのタップ契機では微妙に見た目が違うので、セルの選択のみを契機としてキーボードを表示させます。

2.テキストフィールドの設定
`isUserInteractionEnabled` を`false` にする。これはstoryboardから設定できます。この設定により、テキストフィールドのタップを無効化します。
`canBecomeFirstResponder` を`true` にする。これによってテキストフィールドでキーボードを表示できるようします。ただ、このプロパティはget onlyのため、テキストフィールドを継承したサブクラスを定義し、そこで設定します。

```swift
class TextFieldSub: UITextField {
    override var canBecomeFirstResponder: Bool {
        return true
    }
}
```

3.セルの選択時にキーボードを表示する
あとは`UITableViewDelegate` のメソッドでセルのタップを捕まえてキーボードを表示するだけです。

```swift
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath)  // 選択したセルの取得
    cell.textField.becomeFirstResponder()           // セルのテキストフィールドでキーボードを表示する
}
```
CLIからTwitterを投稿できる様にしたい

# CLIからTwitterを投稿できる様にしたい

## 開発背景
- CLI(Command Line Interface)でTwitterを使えないかな?
- Twitter API というものがあるぞ、試そう
- ~~CLIでTwitterできれば、サーバーにアクセスしながらTwitterライフが送れる~~

## 実行環境
- OS  
  何でもOK. 私はMacとCentOSです
- python version >= 3.7  
Python実行環境を準備してください。
- Twitter API のアクセストークン  
Twitter API を利用します。[こちら](https://qiita.com/kngsym2018/items/2524d21455aac111cdee)を参考に、Developer登録してアクセストークンを取得してください。

### 外部ライブラリ
git に requirement.txt を用意しますが、一応記載

- tweepy

```
# pip install tweepy
```

pip はPython3ではインストールすると基本的にインストールされるはずです。  

## ソースコード
そのうちGitに公開用のコードを上げます。

### config.py
TwitterAPI のアクセストークンを置いておきます。
以下のコードは各自のアクセストークンと置換する必要があります。

```python:config.py
# Twitter APIを使用するためのConsumerキー、アクセストークン設定

# ツイッターの文字数制限の変更に対応させるため変数として定義
MAX_TWEET_LENGTH = 140

CONSUMER_KEY = 'XXXXXXXX'
CONSUMER_SECRET = 'XXXXXXXX'
ACCESS_TOKEN = 'XXXXXXXX'
ACCESS_TOKEN_SECRET = 'XXXXXXXX'
```

## post_tweet.py
コマンドラインで実行すると、プロンプトでツイートする内容の入力を求められます。
ツイートする内容が確定したら、 "EOF"(End Of File)と入力して入力を終了し、ツイートの可否を質問されますので、回答すればツイートできます。

```python:post_tweet.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json, config
from requests_oauthlib import OAuth1Session
import sys


def post_tweet(arg_post_text):

    CK = config.CONSUMER_KEY
    CS = config.CONSUMER_SECRET
    AT = config.ACCESS_TOKEN
    ATS = config.ACCESS_TOKEN_SECRET
    twitter = OAuth1Session(CK, CS, AT, ATS)

    url = "https://api.twitter.com/1.1/statuses/update.json"
    tweet = arg_post_text

    params = {"status" : tweet}

    res = twitter.post(url, params=params)

    if res.status_code == 200:
        print("Tweet Success.")
    else:
        print("Failed. : %d" % res.status_code)


if __name__ == '__main__':

    print("内容を入力してください。'EOF'と入力するまで入力を続けます。")
    post_text = '\n'.join(iter(input, 'EOF'))
    print('*******************************************')
    if len(post_text) > config.MAX_TWEET_LENGTH:
        print("【警告】入力文字数が上限値を超えています。ツイートをキャンセルします。")
        sys.exit()

    while True:
        inp = input('本当に投稿する？ yes/no >>')
        if inp == 'yes' or inp == 'y' or inp == 'Yes' or inp == 'Y':
            break
        if inp == 'no':
            print('ツイートをキャンセル')
            sys.exit()

    post_tweet(post_text)

```

今思うと、エラー処理try文にすべきだった

## 動かしてみる
centos7 で動かしてみる。

```
[root@centos twitter_app_cli]# python3.6 post_tweet.py
内容を入力してください。'EOF'と入力するまで入力を続けます。
test
tweet
desu
EOF
*******************************************
本当に投稿する？ yes/no >>yes
Tweet Success.
[root@centos twitter_app_cli]#
```

ツイートできてる。

## 纏めると
- tweepy のライブラリ使ってみたかっただけ
- タイムライン表示、ふぁぼのスクリプトも作ってあるので別途紹介します
- Twitter最高
【JavaScript】if ( value == false ) と if ( value != true ) の違いを答えよ

#テスト用コード
検証モードに以下のコードを貼り付けて、テスト。

```JavaScript
function test( value ) {
  if ( value == false ) {
    console.log('value == false です');
  }
  if ( value != true ) {
    console.log('value != true です');
  }
}
```

`test(true)` など値をいろいろ入れて見る。

#答え
JavaScriptは変数宣言がないため、valueにくる値がboolean型とは限らない。つまり
`if ( value == false )`　は「valueがfalseのとき」
`if ( value != true )`　は「valueがtrue以外の値のとき(**false以外の値でも**)」

## 例えば
`test('a')`
→ value != true です

`test([])`
→ value == false です
value != true です

`test(['a'])`
→ value != true です

`test(undefined)`
→ value != true です
#まとめ
if文を書くときは注意。
変数宣言だけして値をいれてない変数がある場合は値が undefined となるため、上記のif文の使い分けをして扱うことができる。
macの開発環境構築 メモ

# macの開発環境構築 メモ
初めてmacで開発環境を構築することになったので、メモとして残しておきます。

## homebrew のインストール
とりあえず、homebrew（らしい）のでインストール  
https://brew.sh/index_ja

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

### gitのインストール
バージョンが古いので再度インストール

```
brew install git
```

### yarnのインストール

```
brew install yarn
```

### mysqlのインストール

```
brew install mysql
```

## anyenvのインストール
いろいろな開発環境言語の管理用のパッケージ

```
brew install anyenv
echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(anyenv init -)"' >> ~/.bash_profile
exec $SHELL -l
```

すると、`You can initialize it by:> anyenv install --init` とのことなので

```
anyenv install --init
```

を実行する。

## PHPの開発で必要なものを用意する。
### phpenvのインストール
phpの開発環境を作るために

```
anyenv install phpenv
exec $SHELL -l
phpenv install 7.2.17
```

ここで、7.2.17をインストールしようとしたところ、インストールできず、下記のエラーが発生。

```
configure: WARNING: This bison version is not supported for regeneration of the Zend/PHP parsers (found: 2.3, min: 204, excluded: ).
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers
configure: error: Cannot find OpenSSL's <evp.h>
```

bison, re2c, opensslがないかバージョンが古いかなので、下記のコマンドでインストールする。

```
brew install bison
brew install re2c
brew install openssl
```

で、再度実行するも、opensslが見つけられないとエラー。。。  
エラーの回避方法を探したところ、Mojaveでxcode-selectの最新でmacOS SDK headerがないらしい、、、
https://polidog.jp/2018/11/28/mojave_phpenv/

とりあえず、言われた通りに実行

```
# macOS_SDK_headers
sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /

# openSSLのパスを指定して？インストール
env PHP_BUILD_CONFIGURE_OPTS="--with-openssl=$(brew --prefix openssl)" phpenv install 7.2.17

# phpを7.2.17に
phpenv global 7.2.17
```

やっと、完了。。。

### phpenvのcomposerをインストール
composerコマンドを実行したら勝手にインストールされるみたい。

```
composer --version
```

## rbenvをインストール
```
anyenv install rbenv
exec $SHELL -l
rbenv install 2.5.0
exec $SHELL -l
```

## bundleのインストール
```
# rubyがインストールされているか確認
ruby -v

# bundlerのインストール
gem install bundler

## version指定してインストール
gem install bundler -v 1.16.1
```
Mac に Open AI Gymをインストールしてサンプルコードを動かす．

強化学習の勉強をしたかったので，自分のMacにOpen AI Gymをインストールしてサンプルを動かしました．


インストール自体は簡単でpipでインストールできます．
以下では必要最低限のものをインストールしています．

```
pip install gym  
```

もしくは，

```
pip3 install gym  
```

インストールできたら，[公式リファレンス](https://gym.openai.com/docs/#getting-started-with-gym)にあるサンプルコードを実行してみます．

```python:cartpole.py  
import gym   
env = gym.make('CartPole-v0')  
env.reset()  
for _ in range(1000):  
    env.render()  
    env.step(env.action_space.sample()) # take a random action  
env.close()  
```

上記のコードはランダムに行動を選択するコードです．

```
python cartpole.py  
```
もしくは

```
python3 cartpole.py  
``` 

すると，画面中央でゲームが実行されました．

<img width="598" alt="Screen Shot 2019-04-17 at 22.59.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300084/0bb8cb19-810b-9127-548c-a2e422858138.png">

参考文献

[Getting Started with Gym](https://gym.openai.com/docs/#getting-started-with-gym)
【Flutter】RxDart と Streamの関連性

# 【Flutter】RxDart と Streamの関連性

## 概要

Flutterにおいての、
`Stream` は

RxDartにおいての、
`Observable`


Flutterにおいての、
`StreamController`は

RxDartにおいての、
`Subject`

`Observable<T> class`は
RxDartにおいての
基盤となるクラス（継承の元）

## Reference

[Udemy Dart and Flutter: The Complete Developer's Guide](https://www.udemy.com/dart-and-flutter-the-complete-developers-guide/learn/lecture/10875300?start=21)
Deployment Targetを11.0以上にしたらArchive Buildできなくなった

# 対象になりそうなプロジェクトの条件
1. iOS 10以下のサポートを切るために`Deployment Target`を11.0にしようとしている
2. Projectのみで`Deployment Target`を指定し、各Targetでは参照（未指定）にしている
3. OSSをCarthageで利用している
4. `Embedded Framework` をプロジェクト内で自作して利用している。
5. OSSのframeworkもembedded frameworkもFrameworkフォルダに書き出している。
5. Build PhasesのRun Script`＊１`にてlipoコマンドを利用しFrameworkフォルダ内のframeworkをすべて`Slicing` をしている(-extractなどを利用)

# Archive Buildできなくなった原因
- arm64アーキテクチャのみでbuildされたembedded frameworkをslicingしようとしたから。

### Deployment TargetのversionがbuildされるBinaryのarchitectureに影響する

Release build時のDeployment Targetが`11.0`以上の場合は`arm64`の`non fat file`としてbuildされる。（`10.x`以下だと`armv7`,`arm64`の`fat file`)
そのため、`embedded framework`も`arm64`の`non fat file`でbuildされ、`*1`のslicingのscriptでerrorとなる。（スクリプトの書き方にもよる）

（注）10.x以下の説明はdefaultのarchitectureとvalid architecturesの場合です。10.x以下でも設定次第でarm64のみのbuild可。

# 通常のアプリの最低動作保証バージョン変更方法
- Project（もしくはTarget）のDeployment targetを最低動作保証バージョンに設定する

# iOS10.x以下からiOS11.xにする場合の変更方法
- 対応方法
    - ProjectのDeployment targetを最低動作保証バージョンに設定する
    - アプリのTargetのDeployment targetを最低動作保証バージョンに設定する
    - 自作Embedded frameworkのtargetは11.0未満にする(指定されていなければtargetに設定しfat fileにする）


# その他、Deployment targetを11以上に設定してビルドエラーのとき確認したいこと
1. ３２bitのArchitecture(`armv7`,`armv7s`...)を`Project` or `Target` -> `Architecture`と`Valid Architectures`に同時に設定していないか。(`Architecture`が`${ARCHS_STANDARD}`の場合確認不要)
2. Carthageでbuildされたbinaryを取得し、そのまま利用していないか。
3. Embedded Frameworkのdeployment targetがarchitectureにbuild時の影響しないか

# 現時点で不要だった対応(2019/04/17)
- info.plistの`Required Device Capability`を`armv7`から`arm64`への変更
【Java】配列ノート

#配列#
 - 配列の種類
    - 配列
    - 多次元配列
 - 配列のfor構文
    - 拡張for構文
 - int配列要素の平均計算のサンプルプログラム

##配列の種類##
###配列###
略記法が楽だから使っていきたいが、ガベージのことを考えると、`new`を使う正式な書き方もしっかり覚えておきたい。**ガベージコレクション**があるとはいえ、省略されているところに`new`があると、しっかり自覚を持って略記法を書くこと。

```java
// 正式な書き方
int[] scores; //配列変数の宣言
scores = new int[3]; //配列要素の宣言
scores[0]=10; //配列要素代入
scores[1]=20;
scores[2]=30;

// 略記法
int[] scores = new int[]{10,20,30};
int[] scores = {10,20,30};

// すべて等価
```

###多次元配列###

```java
// 正式な書き方
String[][] scores = new String[2][3];
scores[0][0]="A1";
scores[0][1]="A2";
scores[0][2]="A3";
scores[1][0]="B1";
scores[1][1]="B2";
scores[1][2]="B3";

// 多次元配列の略記法
String[][] scores = {{"A1","A2","A3"},{"B1","B2","B3"}};

// すべて等価
```

##配列のfor構文と拡張for構文

`配列名.length`：これで配列要素の個数を取得して利用

```java
// 配列の作成
int[] scores = {10,20,30};

// 一般的なfor構文
for (int i=0; i<scores.length; i++){
	System.out.println(scores[i]);
}

// 拡張for構文
for (int value:scores){
	System.out.println(values);
}
```

###多次元配列の場合###

```java

// 配列の作成
int scores[][]={{10,11,12},{21,22,23}};

// 一般的なfor構文
for(int i=0; i<scores.length; i++){
	for(int ii=0; ii<scores[i].length; ii++){
		System.out.println(scores[i][ii]);
	}
}
```

#参考書籍#
[スッキリわかるJava入門第２版]
(https://www.amazon.co.jp/dp/B00MIM1KFC/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
Pp.138-166
RailsプロジェクトのGitHubリポジトリ主要言語判定がHTMLになってしまうのをRubyにする

# 経緯
- ずっと気になっていて、ググってはわからん、ググっては諦めるを繰り返していたのですが、ついに解決方法を見つけました。

# 解決法
- ルートディレクトリ直下に `.gitattributes` を作成し、以下のように記述してコミット＆プッシュします。
- ただ、erbファイルをRubyとみなさせているだけなので、それで良いという方のみ行ってみてください。

```text:.gitattributes
*.html.erb linguist-language=Ruby
```

# 参考
- [github – 言語学者のためのgitattributesの使用例](https://codeday.me/jp/qa/20190324/471957.html)
mrubyでの３０日開発日記（５日目）

#今日やったこと

* 数学を学ぶ
* hiroを読んでみた

#やってわかったこと

* 構造体でのポインタのこととポインタのことが少しわかった。
　記事を書いたので読んでみてください！https://qiita.com/eizi2342/items/d568286582c5364c5387
* 数学は四元数がゲームで使われているのを知ってびっくりした。

#今日のコラム

　昨日、ゲームを朝にやったどうなるか、ということを言ったが、結果は成功だった。
　まじで目が覚める。１５分ゲームやってみたけどすぐに目が冴えた。本当におすすめ！

###Ciao!!
サーバーについて

###はじめに
初学者のアウトプット備忘録記事です。
ご指摘アドバイスございましたらよろしくおねがいします。



今日はIPアドレスとかを習いました。
ってことで軽く復習。

##サーバーとは

1.テニス・卓球・バレーボールなどで、サーブをする人。
2.飲食物を給仕するために用いる、大型のフォークやスプーン、またはポットなど。
**3.ネットワーク上で、複数のユーザーやプログラム、すなわちクライアントにサービスを提供するコンピュータ。**


今回は3番のサーバーついて学びました。

ネットスラングでは「鯖（サバ）」と表記することもあります。


サーバー（server）とは、ホームページを表示するために必要となる情報を格納しておく場所のことです。
サーバーから情報を受け取る側をクライアント（client）と呼び、サーバーはクライアントからのリクエストに応じて、保管しておいたファイル（HTMLファイル・画像ファイル・音楽ファイル・映像ファイルなど）を提供します。そのデータによって、指定されたホームページが表示されるとのこと。

サーバーという言葉には、WEBサーバーやファイルサーバー、メールサーバー、DNSサーバー、FTPサーバーなど多数の用途があるようです。

・様々なデータを管理・保存をする（データベースサーバー）
・パソコン同士の通信を行う（WEBサーバー）

様々なデータを管理・保存する役割はデータベースサーバーが担います。Webアプリケーションとは違うサーバーでデータベースの管理を行うことによってサーバーへの負担を減らします。
WEBサーバーとは、スマートフォンやパソコンから送られきたリクエストに対して、リクエストに合ったレスポンスを返す仕組みを持ったコンピュータ（ハード）やソフトウェアのことを指します。
WEBサーバーは、利用者の送ったリクエストに対して、情報を処理し、レスポンスをする役割を持ちます。

今回は異常になります。。。。
以上でした！
nuxt.js middlewareについて

>ミドルウェアを使うと、特定のページやいくつかのページのグループがレンダリングされる前に実行されるカスタム関数を定義することができます。

公式ドキュメントに上記の記述があります。
簡単に言うとページ固有の処理を書くのがnuxt.jsのmiddleware機能

サンプルコード


```nuxt.config.js
  router: {
    middleware: "mypage"
  },
```

上記ソースを記述することで全ページで動作する

```page/mypage.vue
  export default {
    middleware: 'mypage',
}
```

上記ソースを記述することで`/mypage`でのみ動くmiddlewareが完成。

あとは`middleware`のディレクリ内で適当に`middleware/mypage.js`を作り
処理を記述すると完成。

```middleware/mypage.js
export default function() {
    console.log("mypage")
}
```
C言語のポインタで躓いたところ

#なんで書こうとしたのか

　今、mrubyでゲームを作ろうとしていて、どうしてもCを使わなければならなくなりました。それでqiitaで@elct9620が作ってくれた「ヒーロー」というゲームフレームワークを読んでいると、構造体のポインタがでてきました。一応Cでポインタがあってなんとなく分かっているつもりでいました。
　ただし、つもりはつもり。本当に理解をしていませんでした。大体、どこを参照したらいいかとか、アドレスが住所だとか表面的なことしか理解できていませんでした。こう書いている今も当然まだ表面でしか理解ができていません。ですので、忘れないためにも記事を書くことにしました。
　それで、新しい試み。試しに、カラメルさんの「デーモンコアくん」を模した書き方で解説していきます。
　まあ、気軽に読んでください。

#はじまるよ〜！

ポインタくん「こんにちは、僕ポインタっていうんだ！
　　　　　　　あ〜でも、みんなポインタってなにかわかるかな？」



#そもそも、ポインタってな〜に？

おにいさん「おにいさんがおしえるよ〜！」

ポインタくん「おにんさん！」

おにいさん「ポインタっていうのは、特定の型のアドレスを入れる箱みたいなものだね。例えば

```C
int n = 10;
int *ptr;

ptr = &n;
```

っていうコードがあったとします。ptrにnが代入しているように見えるようね？見えない？見えていることにするの！

ここではptrというポインタにnのアドレスが代入されているって言うことになるんだよ。これがポインタの使い方っていう感じかな？」

ポインタくん「僕ってそういうふうになっていたんだ！」

お兄さん「君、一体何年ポインタくんやってるのかな？」


#ポインタってどこで躓くの？

ポインタくん「でもさ、おにんさん。
　　　　　ぼくってなぜかみんなから難しいって言われるんだよね。
　　　　　どうして？」

おにいさん「それはね、すぐに理解されずらいからなんだよ。」

ポインタくん「僕が？どうして？」

おにいさん「ぼくも、ポインタくんと最初に出会った時すごく緊張したんだ。
　　　　　　それは、おにいさんだけじゃなくて、ほかの人もそうだった。
　　　　　　それじゃあ、ポインタくん。僕が君と最初に会ったときのことで振り返ってみよう！」

ポインタくん「うん！」


おにいさん「では、まずは出会いのコードから見てみようか。」

```C:test1.c
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  struct xyz {
    int x;
    long y;
    double z;
  };

  struct xyz* a;
  int n = 10;

  a->x = n;

  printf("a.x = %d\n", b->x);
  return 0;
}
```

ポインタくん「ぼくとおにいさんがはじめて会ったときのところだね！」

おにいさん「そう！このとき、おにいさんはxyzっていう構造体を作っておいて、構造体をポインタにしておいてa.xに代入しようとしていたんだよね。」

ポインタくん「でも、このあとコンパイルはしたけど、コアアダプタになっちゃったんだよね。」

おにいさん「そうなんだよ。
　　　　　　ぼくもポインタくんと会ってすぐであせっちゃったんだよ。
　　　　　　でも、このあとにポインタくんのことを理解して、もう一度作り直したんだよね！
　　　　　　それじゃあ、書き直したコードを読んでみよう！」


```c:test.c
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  struct xyz {
    int x;
    long y;
    double z;
  };

  struct xyz* a;
  int n = 10;

  a = (struct xyz*)malloc(sizeof(struct xyz));
  a->x = n;

  printf("a.x = %d\n", a->x);
  return 0;
}
```

ポインタくん「あ！mallocっていうのが増えている！」

おにいさん「そうだね！これはbのポインタにメモリを確保したんだ！
　　　　　　そうすることで、ちゃんとbにメモリが確保されて数字をいれられるようになったんだ！
　　　　　　それで、返ってきた数字は１０だったんだ！」

ポインタくん「そうだったんだ。おにいさん、僕を理解しようとしてくれたんだね。ありがとう！おにいさん！」

おにいさん「こちらこそ！
　　　　　　それじゃあ、みんなバイバイ(^_^)/~！」

#おわり

ためしに作ってみた。後悔はしていない。

#参考文献

ヒーロー：https://github.com/elct9620/hiro

ポインタ完全攻略：https://www.amazon.co.jp/%E6%96%B0%E3%83%BB%E6%98%8E%E8%A7%A3C%E8%A8%80%E8%AA%9E-%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E5%AE%8C%E5%85%A8%E6%94%BB%E7%95%A5-%E6%98%8E%E8%A7%A3%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%9F%B4%E7%94%B0-%E6%9C%9B%E6%B4%8B/dp/4797388536/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E5%AE%8C%E5%85%A8%E6%94%BB%E7%95%A5&qid=1555422930&s=books&sr=1-1-catcorr
moment.jsはライブラリ。JavaScriptで日時を扱う上で、標準のDateの機能だけでは足りない機能を提供する。

Moment.jsではmoment()としてmomentのオブジェクトを作成することができます。

Dateからはnew Date()として日時のオブジェクト（インスタンス）を作るのと同じです。
次のように、引数を指定しない場合、現在の日時が設定されます。

```js

var m = moment();
```

Moment.jsは入力値のフォーマットを指定することができます。

```js

var m = moment('2012年10月20日', 'YYYY年MM月DD日');
```

このように、2012年10月10日という文字列からmomentオブジェクトを指定することができます。
この機能を使うと、例えばAPIが返す日時形式が独自のものになっていても、
そのフォーマットを指定することができます。

####そのほか例文
moment.jsの時間取得の書き方など
https://momentjs.com/docs/
https://qiita.com/taizo/items/3a5505308ca2e303c099

```js

moment().format();
"2019/04/17"
```

当日

```js
moment();
r {_isAMomentObject: true, _isUTC: false, _pf: {…}, _locale: C, _d: Wed Apr 17 2019 18:47:21 GMT+0900 (日本標準時), …}
```

前日

```js

moment().subtract(1, 'days')
r {_isAMomentObject: true, _isUTC: false, _pf: {…}, _locale: C, _d: Tue Apr 16 2019 18:46:56 GMT+0900 (日本標準時), …}
```

#フォーマットを変えるには
以下のように指定するとよい。

```js
moment().format('YYYY年MM月DD日 HH:mm');
"2019年04月18日 10:27"

moment().format('YYYY-MM-DD');
"2019-04-18"
```

#まとめ
moment.jsは日付をパースするときに簡潔に指定して生成できるようにする、ライブラリである。
CloudFormationでVPCを作るだけ

# CloudFormationでVPCを作るだけ

- VPCが出来る
- VPCはサブネットを一つ持っている
- IPv6は無効化
- 個人的な趣向によりタグを定義している

```yaml
AWSTemplateFormatVersion: 2010-09-09
Resources:
  EC2VPC3RXEF:
    Type: 'AWS::EC2::VPC'
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: false
      EnableDnsHostnames: false
      InstanceTenancy: default
      Tags:
        -
          Key: Project
          Value: Mastodon
  EC2S4A90T:
    Type: 'AWS::EC2::Subnet'
    Properties:
      CidrBlock: 10.0.0.0/24
      MapPublicIpOnLaunch: false
      VpcId: !Ref EC2VPC3RXEF
      Tags:
        -
          Key: Project
          Value: Mastodon
```
ValetでLaravel開発環境を構築してみた

# 概要

MacミニマニストのためのLaravel開発環境である「Valet」を実装してみました。

# 注意事項、留意点

- 基本的には[公式ドキュメント](https://readouble.com/laravel/5.8/ja/valet.html)を参考にしてます
- というよりほぼこれを見ながらやりました
- Valetは「ベレット」と読むらしいです

# 前提条件

- バージョン
    - OS: MacOS 10.14.2
    - Homebrew: 2.0.5 (当時の最新版)
- 更新日
    - 2019/04/17

---

# 構築手順

## 1. Homebrewのインストール

- ここでは割愛します
- 基本的には[公式ページ](https://brew.sh/)を参照するといいと思います
- 私は[こちら](https://qiita.com/pypypyo14/items/4bf3b8bd511b6e93c9f9)をはじめとしたQiita記事を参考にしました
- `brew doctor`で`Your system is ready to brew.`と出てこればOKらしいです
- 私は以下のようなメッセージが出ましたが、「気にするな」と書いてあるので気にせず次に進みました

```
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!
```

## 2. インストール

- php7.3をhomebrewでインストールします

```
brew install php
```

- [composer](https://getcomposer.org/)をインストールします
    - ここでは割愛します。私は以前curlで入れたもので問題なかったので、brewでなくてもいいらしいです

- Valetをインストールします
    - これによりValetとDnsMasqがインストール/設定され、システム起動時に起動するValetのデーモンが登録されるとのことです。

```
composer global require laravel/valet
valet install
```

### 3. サイト動作

- 任意の場所でディレクトリを作成し、移動します  
(ここでは `laravel/valet/`を再帰的に作成します)

```
mkdir -p laravel/valet/
cd laravel/valet/
```

- parkコマンドを実行します
    - サイト検索の親ディレクトリとして登録されるとのことです

```
valet park
```

- pathsコマンドで、実際にparkされたかを確認します

```
valet paths
```

- 以下のような形で出力されればOKです

```
[
    "/********/laravel/valet"
]
```


- Laravelプロジェクトを作成します  
(ここでは`startlaravel`という名前のLaravelプロジェクトを作成します)

```
laravel new startlaravel
```

- サイトを動かします(http://{プロジェクト名}.test/で開きます)

```
http://startlaravel.test/
```

# 参照

以下のサイトを参考にしました。

[Laravel 5.8 Laravel Valet](https://readouble.com/laravel/5.8/ja/valet.html)
[GitHub](https://github.com/laravel/valet)
Unityの Visual Effect Graph (VFXGraph) で遊べるようになるまでの備忘録(2019.1.0f2)

# Unityの Visual Effect Graph (VFXGraph) で遊べるようになるまでの備忘録(2019.1.0f2)

GPUパーティクルを使うことで、膨大な表示が出来る強力な機能です。

2019.1.0f2 です。
自分がいじれる状況になるまでにやったすべてのことを記載します。

**注**
この記事に書いてることですが、プロジェクトの新規作成時の設定次第で半分くらいとばせます。
そちらについては
[Unity の Visual Effect Graph (VFXGraph) を弄れるようになるまでの備忘録(別バージョン)](
https://qiita.com/chibi_miikun/items/ce363831b60b163a6e91)
に記載しました(2018.3.7f1 のものですが)
合わせてご確認お願いします。
**ただこちらの記事の方が、普通と何が違うのかわかるのでいい気がします**

## ① カラースペースをリニアにする

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136196/74b94222-7bff-566b-93a9-ae7b38868b8f.jpeg)

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136196/59524e1d-0339-6e0d-df13-5bd7b08f1aa3.jpeg)


## ② Render Pipeline HD と Visual Effect Graph を Import する

![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136196/5d20a04f-3241-5cad-6de2-033fa7088089.png)

![4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136196/e7fa7764-8998-9c5e-f7a3-dcb315fc8ed7.jpeg)

少し待つと表示が増える。

![5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136196/1a36f052-f2f1-080a-a7b4-ac5805e41775.jpeg)

![6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136196/9641a632-225d-c54f-1155-44831b05bd54.jpeg)

## ③ Pipeline Asset を作って設定する

![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136196/8031aab0-b81b-eb95-a86e-7eabe7de116e.png)

デフォルトで「New HDRenderPipelineAsset」というアセットが作成されます

![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136196/d9e372a6-4b7f-a4b0-95e8-df0c3ba5430a.png)


![7.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136196/9697b391-8f77-0522-54ae-d0beded126b5.jpeg)

![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136196/cb67cc42-349f-6e03-935d-3b5e7f840b59.png)

## ④ ヒエラルキー上に Scene Settings を配置する

![12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136196/717c89e7-acb8-50fb-6b2c-219d106d35fb.png)

## ⑤ Visual Effect Graph を配置する！

![13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136196/e497d60f-af4f-54cd-bca6-7df78007e9ac.png)

![14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136196/b0faba85-0b8f-2e66-6a02-3bc13caf22ec.jpeg)

![15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136196/48944e93-e2d5-7f62-dead-4593e6b0d283.jpeg)


やったー！！！！

![16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136196/dba2f779-5959-d36d-d11c-51979cda01a5.png)


あとは
https://youtu.be/uvGX8GPdfTE?t=853
とか見て勉強するだけだー！
わーい！！