OmniAICreator/Qiita-1.07M huggingface dataset:
ファイルアップロードでタイムアウトが発生する問題

# ■原因
HTTPHttpWebRequestクラスを使ってHTTP接続を作成する際に、
AllowWriteStreamBufferingプロパティに何も指定せず、初期値(true)のままとしていた。

以下URLの「実装時の注意」を見ると、「trueの場合、大規模なデータセットをアップロードするときにパフォーマンスの問題が発生する可能性がある」と記述がある。
https://msdn.microsoft.com/ja-jp/library/system.net.httpwebrequest.allowwritestreambuffering(v=vs.110).aspx

# ■対応策
以下の1行を追加する。
req.AllowWriteStreamBuffering = false;

```C#
//HTTPリクエストを作成する
HttpWebRequest req = PathUtil.getHttpWebRequest(uploadURL, true, new NetworkCredential("ユーザーID", "パスワード"));
req.Method = "POST";
req.ContentType = "multipart/form-data; boundary=" + boundary;
req.ContentLength = fs.Length + requestStart.Length + requestEnd.Length;
req.AllowWriteStreamBuffering = false; //デフォルト値はtrueだが、1GB近いサイズのファイルをアップロードした時の処理遅延対策としてfalseに変更する。
```

# ■結果
下表の通り、AllowWriteStreamBufferingプロパティをfalseにすることで、
1GB近いサイズのファイルをアップロードしてもタイムアウトせずアップロードすることが出来た。
![result.png](https://qiita-image-store.s3.amazonaws.com/0/15241/07c10493-aac2-990e-3311-bcdf4d2efcb3.png)
Laravel make:authで作成されたUserクラスをjenssegers/mongodb用に修正して見た

LaravelのMongodb操作パッケージjenssegers/mongodbを使って
Laravel同梱のAuthモジュールのデータベースをMongoDBに変えてみた。


ご参考程度で

# 環境情報
```
laradock
PHP7.2
Laravel 5.6
jenssegers/mongodb 3.4
```

```php:App\User.php
<?php

namespace App;

use Illuminate\Notifications\Notifiable;
// ## ここが入れ替えの部分
//use Illuminate\Foundation\Auth\User as Authenticatable;
use Jenssegers\Mongodb\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
}


```
css 構造理解

## 指定の仕方

## スクレイピングをするときなどに必要

ポイント idを起点にcssを設定していく
```
#id .class .class1.class2

<div id="id">
	<div class="class">
		<div class="class1 class2">
		</div>
	</div>
</div>

```

## レスポンシブ

```
@media only screen and (max-width: 768px) {
  #id .class .class1.class2{
    width: 35.333333% !important;
  }


```

## important!
この記述を入れることで、上書きされる。
WordPress-plugin作成方法

## はじめに
phpを使ってWordPressのプラグインを作成したいと思う。
その都度進捗に合わせて更新していく。
開発環境は、MAMPを使っていく。
MAMPのhtdocs内にwordpressをダウンロードしておく。

## pluginの作成方法
### 導入
1. plugin内に作成するプラグインをまとめておくディレクトリを作成。<br>
~/wp-content/plugin/作成するプラグインのディレクトリ（test-pluginとする）
2. WordPress管理画面のプラグイン内にtestが表示される。
3. test-plugin内にphpのfile（test-plugin.php）を作成する。
4. [標準プラグイン情報](https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E4%BD%9C%E6%88%90#.E6.A8.99.E6.BA.96.E3.83.97.E3.83.A9.E3.82.B0.E3.82.A4.E3.83.B3.E6.83.85.E5.A0.B1)の作成。<br>
プラグインの基本情報としてphpファイルの先頭に以下を書き込む。

```test-plugin.php
<?php
/*
Plugin Name: (プラグインの名前)
Plugin URI: (プラグインの説明と更新を示すページの URI)
Description: (プラグインの短い説明)
Version: (プラグインのバージョン番号。例: 1.0)
Author: (プラグイン作者の名前)
Author URI: (プラグイン作者の URI)
License: (ライセンス名の「スラッグ」 例: GPL2)
*/

```

一旦ここまで。
次回また更新。
gitで特定のファイルやディレクトリを前のバージョン(commit)に戻す方法

gitの`checkout`を使って実現します。

```terminal:単数ファイルの復元
git checkout [戻したいコミットのハッシュ] [戻したいファイルのパス]
```

複数ファイルを戻したい場合も、

```terminal:複数ファイルの復元
git checkout [戻したいコミットのハッシュ] [戻したいファイルのパス(1)] [戻したいファイルのパス(2)]
```

という感じで引数を増やしていけばOK。

特定のディレクトリ全体を復元したい場合は、

```terminal:ディレクトリの復元
git checkout [戻したいコミットのハッシュ] [戻したいディレクトリのパス] 
```

を実行しましょう。
電子レゴブロックを自作してみた

<h1>TL;DR</h1>

夏休みの自由研究代わりに、簡単な電子回路とレゴブロックで工作をしてみた

※ 本記事は、2018/10/12に[弊社スタッフブログ](https://www.northtorch.co.jp/archives/402)に投稿した記事をQiitaに転載しています。

<h2>発端</h2>

放っておくと一日中部屋に籠って遊んでいるレゴ好きの下の子に、何か追加で楽しめるものを、と考えてみた。<br />
どうせなら将来役に立つ知識の入り口になれば良いという下心もあり、簡単な電子工作と組み合わせて、LED付きのレゴブロックを作ってみた。

時期的には遅すぎるが、夏休みの自由研究ということで。。。

<h2>設計</h2>

<h3>電源</h3>

とりあえず、レゴブロックと連結できる仕組みがいい。<br />
ネットを探してみると、レゴブロックのサイズを実測している方がいた。

<ul>
<li><a href="https://sizeblog.net/entry/675/">サイズ比較。レゴブロックの大きさを検証してみた</a></li>
</ul>

上記を参考にすると、デュプロのサイズが単三電池２本の電池ボックスと大体同じサイズだった。<br />
電池には自宅にあるエネループを使用するとすると、電源電圧は1.2V x 2 = 2.4Vとすればよさそうだ。

<h3>回路用のケーブル</h3>

レゴの部品に目立たないように端子を付けてつなぐのは、工作の難易度が高い。<br />
すっぱりとあきらめて、ケーブルを作成する方向で検討。
端子には、一般的な基板用コネクタを流用することにする。<br />
レゴブロックのサイズから行くと、通常のレゴブロックの4x4ブロックが一辺16mmなので、そのブロック上にIN/OUTの2つ配置可能なサイズのコネクタで入手性の良いものを調べる。<br />
2ピンのPHコネクタを採用した。<br />
コネクタ、ポスト、コンタクトピンを多めに購入。

<h3>スイッチ</h3>

電池ボックスにスイッチがついているものもあるが、小さくてオン/オフしづらい。<br />
子供の手でも扱えるように、適当なトグルスイッチを用意することにする。<br />
サイズの目安は4x8ブロック上に、PHコネクタ2つと一緒に実装する。<br />
また、今回は単純なオン/オフのみ想定するので、1回路のスイッチで十分。

<h3>LED</h3>

できるだけ拡散するタイプのものを選んだ。<br />
サイズはこれまでの部品同様、4x4ブロック内に収まるようにする。<br />
抵抗は家にあるカーボン抵抗を適当に使用することにする。

<h3>土台となるレゴブロック</h3>

作成する部品に合わせて、必要なサイズと数をネットで注文。<br />
色は黒で統一した。

<ul>
<li><a href="https://www.brickers.jp/">ブリッカーズ</a></li>
</ul>

<h2>実装</h2>

<h3>電池ボックス</h3>

リード線付きの電池ボックスを購入。<br />
出ているリードにPHコネクタを圧着して、ハウジングに挿入する。<br />
グルーガンで、電池ボックス全体を土台になるレゴに接着して完成。<br />
簡単。

<img src="https://drive.google.com/uc?id=1ckdApHPxvPyoIvsKczTkBsw7C5IrdeXh" alt="電池ボックス" />

<h3>回路用のケーブル</h3>

赤い同線と黒い銅線にPHコネクタを圧着して、ハウジングに挿入する。<br />
注意点として、コネクタに接続した際に、<strong>2.4Vの銅線とGNDの銅線が同じ方向になるようにハウジングに挿入</strong>した方が、管理がしやすい。

<h3>スイッチ</h3>

PHコネクタを両端に、中央にスイッチを接続。<br />
スイッチによって2.4V側の銅線がオン/オフされるように接続する。<br />
GND側はスイッチを介さずに、コネクタ同士の接点をつなぐ。<br />
最後にレゴブロックにグルーガンで接着。<br />
ついでに、手で触れそうな金属部分やすきまはグルーガンで埋めて完成。

<img src="https://drive.google.com/uc?id=1OTXf_g71VBQ60V0CLvOlxmmIS7F8SNs6" alt="スイッチ" />

<h3>LED</h3>

ブレッドボードで使用する抵抗の大きさを決める。<br />
LEDの推奨電流値が20～30mAだったので、100Ωの抵抗を使用することにした。<br />
コネクタの2.4V側端子を、抵抗を介してLEDの足にはんだ付け。<br />
コネクタのGND側端子はそのままLEDの反対側の足にはんだ付け。<br />
例によってグルーガンでレゴブロックと接着し、むき出しの金属部分を埋める。

<img src="https://drive.google.com/uc?id=1EKSFERLBirW_SLpsVdhJa6d3jggZr0_m" alt="LEDブロック" />

<h2>反省点</h2>

<ul>
<li>大きさの合わない圧着工具を無理やり使用したため、コンタクトピンの圧着で結構失敗した </li>
<li>細かい部品のはんだ付けで結構苦戦。ヘルピングハンズ合った方が効率よさそう </li>
</ul>

<h2>使用例</h2>

デュプロと組み合わせてロボットにしていた。<br />
ケーブルはもっと短くても良かったかも。

<img src="https://drive.google.com/uc?id=1XzrognOj03RcecmVYk_XsELLKn6AwcOu" alt="使用例その１" />

<img src="https://drive.google.com/uc?id=1n1syCAMYTBd-C_d0QvAlckkg9_kRNbDq" alt="使用例その２" />
GPUとは何か　ざっくり書く

昨今、機械学習の分野でよく聞く「GPU」というワード。

ゲームをされる方だと当たり前のワードだと思います。



GPUとは何か、ざっくりとメモ代わりにかきたいとおもいます。


一言で言うと単純作業が得意な処理装置です。
(間違っていたらご指摘ください。)


わかりやすいように、CPUと比較して説明したいと思います。


CPUは普段使うPCやスマホで使われています。
様々な処理をこなしてくれるなくてはならないものです。

PCで複数のソフトを起動していてもCPUが処理をしてくれます。

それに対してGPUは単純な計算処理を得意としています。
CPUよりもコア数が多く、並列処理が可能なため、計算スピードが格段に速いです。


そのためグラフィックの表示や機械学習の際のニュートラルのベクトル計算がCPUでは時間が掛かっていたものがGPUだと人間の感覚で一瞬でできてしまうのです。
(もちろん程度によります。一瞬というのは場合によります。つっこまないでくださいね‥)



ゲーミングPCとよばれているものはGPUを搭載していて当たり前のようです。
複数の配列に共通する要素のみを抽出した配列を出力する

#コード

以下の関数で抽出可能

```js:
var getCommonElementsArray = function(){
  var i = 1, j = 0;
  function removeArrayDuplicates(array) {
    return array.filter(function(value, index, self) {
      return self.indexOf(value) === index;
    });
  }
  var cmnElmArray = arguments[0].slice();
  cmnElmArray = removeArrayDuplicates(cmnElmArray);
  var tgtElmArray = [];
  while(i < arguments.length){
    tgtElmArray = arguments[i++].slice();
    j = 0;
    while(j < cmnElmArray.length){
      if(tgtElmArray.indexOf(cmnElmArray[j])>=0){
        j++;
      }else{
        cmnElmArray.splice(j, 1);
      }
    }
  }
  return cmnElmArray;
};
```

#動作例
ChromeのConsoleにて実行・検証
##動作例1
関数の基本の動作について確認。
関数の引数に配列を1つ以上入れて実行すると、共通する要素のみ抜き出した配列が返る。

```js:動作検証コード
var array1 = [1,2,3,3,'hogehoge','foo','bar'];
var array2 = [2,1,0,3,'foo'];
console.log('common',getCommonElementsArray(array1,array2));
console.log('array1',array1);
console.log('array2',array2);
```
**動作結果**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/2d53b17f-fa2c-0dd7-4f1f-ef47a45fee76.png)
2つの配列に共通する要素のみが抜き出された配列が`getCommonElementsArray()`によって得られている。
結果として得られる配列内に同一要素は複数入らない。
また、値渡しを行っているので処理終了後、元の配列は加工されていない。

##動作例2
扱う配列が3つ以上になっても問題なく動作する

```js:検証用コード
getCommonElementsArray([0,1,2,3,4,5,6,7,8,9,10], [0,2,4,6,8,10], [0,1,2,3,5,8,13,21]);
```
**動作結果**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/88d48ea1-58c0-8af4-da3c-00f1d17a1d45.png)

##動作例3
共通する要素がなかった場合、空の配列が返る
![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/b55e0001-c462-9b31-2539-796e6abb96f1.png)
JHipsterをWindow7 32bitで動かす時ぶつかった問題

##作成中にハマったこと##

###PROXY設定###
作成完了後実行したら、repository見つからないのようなメッセージが表示されて終わる。

```
Exception in thread "main" java.net.UnknownHostException: repo.maven.apache.org
```

原因はmvnwのプロキシ設定してなかったため。

対応方法はこの[リンク](https://www.jhipster.tech/configuring-a-corporate-proxy/)にある。



```
Error: getaddrinfo ENOTFOUND selenium-release.storage.googleapis.com selenium-release.storage.googleapis.com:443
```

環境変数にHTTP_PROXYを追加で解決できた。

###そのほかエラー###

```
node --max_old_space_size=4096 node_modules/webpack-dev-server/bin/webpack-dev-server.js "--config" "webpack/webpack.dev.js" "--progress" "--inline" "--profile" "--port =9060"
```
package.jsonファイルから「--max_old_space_size=4096」を「--max_old_space_size=2048」にしたら問題なく通った。ちなみに32bitマシーンだったので、この問題にぶつかったと思う。
Jenkins on Azureをhttps化する

# Jenkins on Azureをhttps化をする

Jenkins on Azureで作成したJenkinsにログインするにはデフォルトでは
sshポート転送してlocalhostでログインする必要があり、https://ドメイン〜ではログイン出来ませんでしたので対応しました。
設定自体は簡単にできました。

### 環境確認
Azure on Jenkinsで作成したvmはすでにnginxが設定されているはずですので
nginxのインストールは必要ありません

```
$ nginx -v
nginx version: nginx/1.10.3 (Ubuntu)
```

### 証明書の作成
+ わかりやすいように証明書を保存するディレクトリを作成しておきます。

```
$ mkdir /etc/nginx/ssl
```

+ 証明書の作成(有効期限 -days は10年で作成しましたが、適応かえてください)

```
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt
```

入力項目はすべてEnterで飛ばしてます

### 設定ファイルの作成
設定方法はいくつかあると思いますが、自分は/etc/nginx/conf.d/以下にssl用のconfファイルを作成して設定いたしました

```
$ sudo vi /etc/nginx/conf.d/ssl.conf

# ファイル内容
server {
    listen       443 ssl;
    server_name  ドメイン名;

    ssl           on;
    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;

    location / {
        proxy_set_header        Host $host:$server_port;
        proxy_set_header        X-Real-IP $remote_addr;
        proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto $scheme;

        proxy_pass          http://localhost:8080;
        proxy_read_timeout  90;
    }
}
```

### ネットワークセキュリティーの設定
+ Azure Portalの対象のvmに紐付いているネットワークセキュリティーで443の許可をしてください
+ vm名-nsgの設定画面から適応必要な設定を行います。



これでnginxに設定適用したらhttps://ドメイン〜でログインが行えると思います。
UIViewにActionClosurableを使ってタッチイベントを付ける方法

こちらの#selectorと@objcを使わずにかけるActionClosurableをよく使うのですが、その際にいつもGestureRecognizerで訳わからなくなるのでメモ。
https://github.com/takasek/ActionClosurable
## やりたいこと
・UIViewにタップしたら（画面遷移などの）Action()
・UIViewをx秒以上ロングタップするとViewがグレーに代わり、話すとAction()

## 各単語の意味合い
Selector・・・actionの指定先である@objcで書いた時のメソッド名
Gesture・・・ユーザーの動作
GestureRecognizer・・・動作を認識する認識器
sender・・・Gestureを送るオブジェクト（UIButtonなど）

## UIViewにTapとLongPressジェスチャーを付けるサンプルコード

```Swift
func addTapGesture(action: @escaping () -> Void) {
        let tapGesture = UITapGestureRecognizer { (gr) in
            print("UITapGestureRecognizer fire")
            switch gr.state {
            case .ended:
                self.backgroundColor = UIColor.clear
                action()
            default:
                return
            }
        }
        
        let longPressGesture = UILongPressGestureRecognizer { (gr) in
            print("UILongPressGestureRecognizer fire")
            switch gr.state {
            case .began:
                self.backgroundColor = UIColor.lightGray
            case .ended:
                self.backgroundColor = UIColor.clear
                action()
            default:
                return
            }
        }
        longPressGesture.minimumPressDuration = 0.05
        longPressGesture.cancelsTouchesInView = false
        
        self.addGestureRecognizer(tapGesture)
        self.addGestureRecognizer(longPressGesture)
    }
```

## 参考URL
https://developer.apple.com/documentation/uikit/uitapgesturerecognizer
https://i-app-tec.com/ios/uigesturerecognizer.html
VBAが使えたらもう少し仕事が楽になるんじゃないかと思って勉強したことまとめ２

#はじめに

普段はpythonでopenpyxlを使ったりしてますが、もうちょっとVBAを使えたら便利だなと思ったので、勉強したことをまとめます。

#前回までの記事
こちらが「[VBAが使えたらもう少し仕事が楽になるんじゃないかと思って勉強したことまとめ１](https://qiita.com/hiroyuki_mrp/items/fd9ff00c3e9b5dfd5317)」が前回の記事になります。

#文字の結合

文字の結合は、エクセル関数とほぼ同じです。
以下はC1にA1とB1を結合したものを入れています。

```vb
Cells(1, 3).Value = Cells(1, 1).Value & Cells(1, 2).Value
```

以下の書き方では、strどうしは問題ありませんが、intどうしだと加算されてしまうので、注意が必要です。

```vb
Cells(1, 3).Value = Cells(1, 1).Value + Cells(1, 2).Value
'ここでは深くふれませんが、このように四則演算も簡単にできます。
```

また以下のようにも結合することができます。

```vb
Cells(1, 3).Value = Cells(1, 1).Value & "hello"
```


#ForNext構文

forループも簡単に各書くことができます。

```vb
Sub test1()
    Dim i
    Dim j
    Dim k
    
    For i = 1 To 10
        Cells(i, 1).Value = "hello"
    Next i

    For j = 1 To 10
        Cells(j, 2).Value = "world"
    Next j

    For k = 1 To 10
        Cells(k, 3).Value = Cells(k, 1).Value & Cells(k, 2).Value
    Next k
End Sub
```

デバッグ＞ステップイン＞F8で一つずつ実行していくことができます。

またステップを入れることで、１行飛ばしで処理ができます。

```vb
Sub test1()
    Dim i
    Dim j
    Dim k
    
    For i = 1 To 100 Step 2
        Cells(i, 1).Value = "hello"
    Next i

    For j = 1 To 100 Step 2
        Cells(j, 2).Value = "world"
    Next j

    For k = 1 To 100 Step 2
        Cells(k, 3).Value = Cells(k, 1).Value & Cells(k, 2).Value
    Next k
End Sub
```

#DoLoop構文

普段は使っている[pythonだとwhile文でループを書いている](https://qiita.com/hiroyuki_mrp/items/ca3166d4c08e063afcbc)ので、doっていうのはすこし慣れないです。。。

他の言語同様、ループ構文は、「真」である間に処理を行うものなので、演算子を知っておく必要があります。


比較演算子	意味
=	等しい
<>	等しくない
>	より大きい
>=	以上
<	より小さい
<=	以下
論理演算子	意味
And	論理積
Or	論理和
Xor	排他論理和
Eqv	論理等価
Imp	論理包含

|   演算子    |   内容    |
|:------------------:|:------------------:|
|        =           |    等しい    |
|       <>       |    等しくない    |
|        >        |    より大きい    |
|         >=         |    以上    |
|       <       |    未満    |
|      <=       |    以下    |

|   演算子    |   内容    |
|:------------------:|:------------------:|
|        and          |    論理積    |
|       or      |    論理和    |
|not|論理否定|
|        Xor        |    排他論理和    |
|         Eqv         |    論理等価    |
|       Imp       |    論理包含    |
Notは条件を満たさないとき真
Xorとは二つのうちどちらかが真の場合に真
Eqvとは両方満たすもしくは両方満たさない場合に真
※and　or　not以外はあまり使わない？

```vb
Sub 練習1()
    Dim i
    i = 1
    Do While i <= 10
    Cells(i, 1).Value = "hello"
        i = i + 1
    Loop
End Sub
```

#最終列行の取得

まず覚えておきたいもの

```vb
ctrl + ↓：xlDown
Ctrl + ↑：xlUp
```

を踏まえて

最終行を取得するプログラムです

```vb
Cells(Rows.Count, 1).End(xlUp).Row　'後ろから数える
または
Cells(1, 1).End(xlDown).Row　'前から数える
```

以下のようにすることでメッセージBOXでポップアップされる

```vb
Sub test1()
    Dim LASTROW As Long
    
    LASTROW = Cells(Rows.Count, 1).End(xlUp).Row
    MsgBox LASTROW & " 行目が最終行です。"
End Sub
```


同じ考え方で最終列を取得するプログラムです

```vb
Cells(1, 1).End(xlToRight).Column　'前から数える
または
Cells(1, Columns.Count).End(xlToLeft).Column '後ろから数える
```

以上を踏まえるとこんなことができる。エクセルのデータがあるところ全部に「test」の文字を入力。

```vb
Sub Get_LASTROW()
　　Dim LASTROW As Long
　　Dim LASTCOLUMNS As Long
　　
　　LASTROW = Cells（Rows.Count, 1）.End（xlUp）.Row
    LASTCOLUMNS = Cells(1,Columns.Count).End(xlToLeft).Column
　　Range（Cells（1, 1）, Cells（LASTROW, LASTCOLUMNS）).value = "test"
End Sub
```


#長くなってきたので
また続きを記載します。
javascriptで複数行文字列を定義する方法

# javascriptで複数行文字列を定義する方法
## やりたいこと

javascriptで
pythonでいうところのトリプルクオート、トリプルダブルクオートで囲んだときの
このような表現を行いたい。

```python
"""
1行目
2行目
3行目
"""
```

## 方法

`(バッククオート)で囲む

```javascript
`
1行目
2行目
3行目
`

```

以上
基本的な頭のトレーニングとして

今日はプログラミングというよりかは

自分が発達障害を持っているということで

どんな学習をしているかということをお話したいと思います。

四則混合計算１００問。

![2018-10-17.png](https://qiita-image-store.s3.amazonaws.com/0/200171/ea31ea77-82a4-e121-7df4-3c7972a61549.png)

加算１００問

![2018-10-17 (1).png](https://qiita-image-store.s3.amazonaws.com/0/200171/ecc8f39f-c722-03b9-8035-9625a7b68582.png)

減算１００問

![2018-10-17 (2).png](https://qiita-image-store.s3.amazonaws.com/0/200171/ba74de87-0d68-5eaa-18da-8f0ed52f02ae.png)

乗算１００問

![2018-10-17 (3).png](https://qiita-image-store.s3.amazonaws.com/0/200171/e98830ff-86a6-7814-8576-f27c2ce4f3c1.png)

新卒の頃、なぜSPIが課されるのかがわかりませんでした。
そして新卒の頃は、筆記試験を避けてきました。
筆記試験を避けてきた理由は、小学校中学校の頃の親族からの虐待です。

それが根強くトラウマになっているからか

避けてきました。

避けて通ってきた結果、短期離職ばかりの人生になりました。

私は文章読解能力が極めて低いのでそういったところが

発達障害の所以なのかもしれないと自己分析をしていますが

健常者のレベルにまで達することはないのだと思います。

それでも努力することから逃げてきてしまっていた私が

取り返すには非常に努力をしなければなりません。

これからは出来る範囲で努力をしていこうと思います。
ReactNative+TypescriptでFlatListを使った時につまずいたポイント

FlatListでkeyExtractorに値を割り当てるときに引っかかったのでメモ。


```typescript
interface Props {
  items: { id: number; title: string }[]
}
```

```typescript

<FlatList
 data={items}
 renderItem={({ item }) => <Text>{item.title}</Text>}
 keyExtractor={item => item.id}
/>
```

このようにkeyExtractorに要素のid(number型)を割り当てたところ以下のメッセージが出た。

```
[ts]
型 '(item: { id: number; title: string; }) => number' を型 '(item: { id: number; title: string; }, index: number) => string' に割り当てることはできません。
  型 'number' を型 'string' に割り当てることはできません。
```

keyExtractorにはstring型で一意になる要素を割り当てなければいけないらしい…。

```typescript
<FlatList
  data={items}
  renderItem={({ item }) => <Text>{item.title}</Text>}
  keyExtractor={item => `${item.id}`}
/>
```

item.idをstring型に変換して解決。
XcodeでMarkdownを利用する

# XcodeでMarkdownを利用するには?

**Markdown (.md) ファイルを配置しただけでは、後述画像のようにテキストとして表示されます。**

![swiftshot-readme-text.jpg](https://qiita-image-store.s3.amazonaws.com/0/85720/1e7840bf-1326-7dc1-dd10-beddc9eac11e.jpeg)

Apple公式のSample Code (画像2) の様にレンダリングを行うには、
**.xcodeproj 配下に .xcodesamplecode.plist というファイルを配置します。
配置するとレンダリングの設定がオンに切り替わります。**

#### デフォルトの場合

* `MyProject/MyProject.xcodeproj/.xcodesamplecode.plist`

#### CocoaPodsを利用している場合

* `MyProject/MyProject.xcworkspace/.xcodesamplecode.plist`

.xcodesamplecode.plist はファイル名さえあっていれば、空のテキストでもオンになりましたがAppleではこのような plist を配置しているようです。

```text:.xcodesamplecode.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array/>
</plist>
```

(画像2)
![swiftshot-readme-rendering.jpg](https://qiita-image-store.s3.amazonaws.com/0/85720/636b54b6-fb21-c161-026c-58bdb1bf52c2.jpeg)
[SwiftShot: Creating a Game for Augmented Reality | Apple Developer Documentation](https://developer.apple.com/documentation/arkit/swiftshot_creating_a_game_for_augmented_reality)

# Xcode ならではの Markdown記法ついて

XcodeはMarkdown記法を全面的にサポートしていますが、ならではの記法を紹介したいと思います。

## 画像の表示

画像ファイルを相対パスで指定することで表示されます。

```markdown:Markdown
![Swiftの画像](Documentation/Swift.png)
```

## ソースコードへのリンクを作る

１. ハイパーリンクのスキームに`x-source-tag`を指定し、

```markdown:Markdown
[GameManager](x-source-tag://GameManager)
```

２. コード側にタグを記述することで、Markdownからソースコードへのリンクになります。

```swift:Swift
/// - Tag: GameManager
class GameManager: NSObject {
```

## Xcode の Developer Documentation (画像3) を利用する

公式のframeworkを
ハイパーリンク( `[title](https://...)` )で記述すると

### Xcodeの場合は

* Xcode の **Developer Documentation** で開かれ、

### それ以外は

* 通常通りブラウザで開いてくれます。

`codable` へのリンクにしたい場合、このように記述すると**画像3**のように表示されます。

```markdown:Markdown
[Codable](https://developer.apple.com/documentation/swift/codable)
```

(画像3)
<img width="1440" alt="xcode-developerdocumentation.png" src="https://qiita-image-store.s3.amazonaws.com/0/85720/04a52d84-c93c-ed92-d174-0ef9df3b668a.png">

## 見出しにNoteを指定すると

`- Note: ` のように記述すると、**画像4**のようになります。

```markdown:Markdown
- Note: SwiftShot's bit-stream encoding is purpose-built for minimal data size, so it omits features of a general-purpose encoder such as resilience to schema change. 
```

(画像4)
<img width="1119" alt="note-rendering.png" src="https://qiita-image-store.s3.amazonaws.com/0/85720/db1637fd-36a0-3a7f-d9da-78c40be1f18f.png">

---

環境: Xcode 10.0
Azure VM(Windows Server)のシリアルコンソールでCMDとPowerShellを使う

Azure VMには、RDPやSSH以外にシリアルコンソール接続することができます。
Windows Server 2016にシリアルコンソール接続して、CMDやPowerShellを使う手順を残しておきます。

# 事前に
仮想マシンのブート診断設定がされていないと使えないので、仮想マシンのページから「ブート診断」を選択して設定します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/5531998f-dacf-049a-a43b-503a46f02446.png)

# 接続
* 仮想マシンのページから「シリアルコンソール」を選択します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/79af5f36-287f-cd1e-cfd6-1172b15eb4bd.png)

* こんな感じでSAC画面が表示されればOKです
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/b5e9d4da-20c8-9d1c-7b1d-0ca35db99437.png)

* 以下コマンドを実行して、新しいチャンネルを作ります

```
cmd
```

* 「Cmd0001」という名称のチャンネルができました
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/fdec3a10-d7b2-8c42-988b-7bbb64edcaac.png)

* 以下コマンドを実行して、チャンネルリストを表示します

```
ch
```

* 現在接続中のSACと、先程作ったCmd0001の2つのチャンネルが存在することが分かります
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/2c2957f1-82b6-4207-d470-642e1b180d9a.png)

* 以下コマンドを実行して、先程作ったチャンネルにスイッチします。1は一番左の列のチャンネル番号を意味します。

```
ch -si 1
```

* ここでEnterキーを押します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/729e5499-dd04-4950-67e4-477a0e7ff60b.png)

* ユーザー名、ドメイン名、パスワードを入力する画面になるので、入力します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/30fac4af-1ba2-66db-315d-522b2d70a780.png)

* いつものコマンドプロンプト画面が開きます
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/4868c38e-4ab7-9dd3-7c16-869b8f384ea2.png)

* powershellコマンドを実行すると、プロンプトがPowerShellに変わります
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/d3a402fb-cdef-793e-ea8c-abfcf7597b58.png)
nuxt2 + TypeScriptでプロジェクトスタートする

2018.10.17

* 前提
  * [vue-cli](https://cli.vuejs.org/guide/installation.html) `3.0.1`
  * [yarn](https://yarnpkg.com/ja/docs/install#mac-stable) `1.10.1`
  * [Nuxt TypeScript Starter](https://github.com/nuxt-community/typescript-template) `6af12b0`

## 一旦nuxt1で初期化（templateをそのまま使う）

```zsh
// 'nuxt2ts'はプロジェクトディレクトリ
$ vue init nuxt-community/typescript-template nuxt2ts

? Project name nuxt2ts
? Project description Nuxt.js TypeScript project
? Author ****

   vue-cli · Generated "nuxt2ts".

   To get started:

     cd nuxt2ts
     npm install # Or yarn
     npm run dev

$ cd nuxt2ts
$ yarn
$ yarn dev
```

`http://localhost:3000`にアクセスすると下記の様に表示される。
![スクリーンショット 2018-10-17 13.49.04.png](https://qiita-image-store.s3.amazonaws.com/0/195818/f266dd94-54ef-e1da-f3de-37ca1a3595f0.png)



## nuxt2に上げると同時に必要な調整を行う


### 各package更新

```diff:package.json
@@ -4,7 +4,7 @@
   "private": true,
   "dependencies": {
     "@nuxtjs/axios": "^5.0.0",
-    "nuxt": "^1.3.0",
+    "nuxt": "^2.2.0",
     "nuxt-property-decorator": "^1.2.0",
     "vuex-class": "^0.3.0"
   },
@@ -16,7 +16,7 @@
   },
   "devDependencies": {
     "@types/node": "^9.4.6",
-    "ts-loader": "^3.5.0",
-    "typescript": "^2.7.2"
+    "ts-loader": "^5.2.1",
+    "typescript": "^3.0.3"
   }
 }

```

### typescriptのビルド設定調整

```diff:modules/typescript.js
@@ -1,6 +1,6 @@
-module.exports = function() {
+export default function() {
   // Add .ts extension for store, middleware and more
-  this.nuxt.options.extensions.push("ts")
+  this.nuxt.options.extensions.push("ts", "tsx");
   // Extend build
   this.extendBuild(config => {
     const tsLoader = {
@@ -21,7 +21,8 @@ module.exports = function() {
     // Add TypeScript loader for vue files
     for (let rule of config.module.rules) {
       if (rule.loader === "vue-loader") {
-        rule.options.loaders.ts = tsLoader
+        if (!rule.options.loaders) rule.options.loaders = {};
+        rule.options.loaders.ts = tsLoader;
       }
     }
     // Add .ts extension in webpack resolve
```

### package更新、ローカル起動

```sh
$ yarn
$ yarn dev
```

上記スクショと同じ状態で起動する。

---
* diffでセミコロンがついてるのはフォーマッタによるもので、無くても問題ない。
* `create-nuxt-app`なんてものが出来てるので、こちらでTypeScriptがサポートされたらそっちで始める感じになるかな。 
   * https://github.com/nuxt/create-nuxt-app/issues/23
Ansible AWX インストール時のエラー

Ansible Towerの OSS 版である AWX をインストールしてみました。

# インストール
```install
$ git clone https://github.com/ansible/awx.git
$ cd awx/installer
$ ansible-playbook -i inventory install.yml
```

ansible 実行時、以下のエラーが発生。

```error
TASK [local_docker : Activate AWX Web Container] ************************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "failed": true, "msg": "Error creating container: unhashable type: 'list'"}
        to retry, use: --limit @/root/awx/installer/install.retry

PLAY RECAP **************************************************************************************************************************************************
localhost                  : ok=10   changed=3    unreachable=0    failed=1   
```

とりあえずコンテナを停止、削除して再度試すも状況変わらず。

```
$ docker stop $(docker ps -q)
$ docker rm $(docker ps -aq)
```

# 解決策

Activate AWX Web Container の処理を確認。
project_data_dir、ca_trust_dir の変数が定義されていないとだめっぽい。

/root/awx/installer/inventory の project_data_dir と ca_trust_dir のコメントアウトを外して再実行すると、正常に終了した。


```/root/awx/installer/inventory
# AWX project data folder. If you need access to the location where AWX stores the projects
# it manages from the docker host, you can set this to turn it into a volume for the container.
#project_data_dir=/var/lib/awx/projects

# CA Trust directory. If you need to provide custom CA certificates, supplying
# this variable causes this directory on the host to be bind mounted over
# /etc/pki/ca-trust in the awx_task and awx_web containers.
# NOTE: only obeyed in local_docker install
#ca_trust_dir=/etc/pki/ca-trust
```
fastlaneを使ってiOSアプリをCrashlytics Betaにアップロードしてみる

fastlaneを使ってBetaへアップロードしてみたいと思います。

今回は公式のセットアップ手順を元に作業を行いました。

1. セットアップ
2. iOSプロジェクトにfastlaneを導入する(init)
3. Fastfileの編集
4. 実行

公式ページはこちら↓
https://docs.fastlane.tools/getting-started/ios/setup/

## 1. セットアップ
#### 最新のコマンドラインツールをインストール
まずは最新のコマンドラインツールをインストールします。

```
$ xcode-select --install
```

#### fastlaneのインストール  
RubyGemsを使う方法とHomebrewを使う方法があるようですが、今回はRubyGemsを使ってインストールしました。  

```
# インストール
$ sudo gem install fastlane -NV
...
Successfully installed fastlane-2.106.2
53 gems installed

# バージョン確認
$ fastlane --version
fastlane installation at path:
/usr/local/lib/ruby/gems/2.4.0/gems/fastlane-2.106.2/bin/fastlane
-----------------------------
[]  
fastlane 2.106.2
```  

## 2. iOSプロジェクトにfastlaneを導入する(init)
iOSプロジェクトに移動してfastlaneのセットアップを行います。

```
# プロジェクトディレクトリに移動
$ cd {プロジェクトディレクトリ}

# init
$ fastlane init
```

実行するとプロジェクトディレクトリの直下に`fastlane`ディレクトリが出来上がりました。この中の`Fastfile`にコマンドを記述していくことになります。

## 3. Fastfileの編集
目的の「自動ビルド > Betaへアップロード > Slackへ結果の通知」ができるように記述しました。

```
default_platform(:ios)

platform :ios do

  before_all do
    # Gitのステータスチェック
    ensure_git_status_clean
    # pod install
    cocoapods
  end

  desc "Crashlytics Betaへのアップロード"
  lane :beta do
    # 最終コミット取得
    commit = last_git_commit
    # Config -> Debug
    configuration = "Debug"
    ENV["GYM_CONFIGURATION"] = configuration
    # AdHoc用プロビジョニングプロファイルの取得
    sigh(
      app_identifier: "xx.xxx.xxxxxx",
      username: "xxxxxx@xxxx.xx",
      force: false,
      adhoc: true
    )
    # アプリのビルド
    build_app(
      clean: true,
      scheme: "xxxxx",
      export_method: "ad-hoc",
      workspace: "xxxxxx.xcworkspace"
    )
    # Betaにアップロード
    crashlytics(
      api_token: "api_token",
      build_secret: "build_secret",
      crashlytics_path: "./Pods/Crashlytics/iOS/Crashlytics.framework",
      notes: "[#{configuration}] #{commit[:commit_hash]}\n#{Time.new.to_s}"
    )
  end
end
```

### 説明
#### before_all
ビルド実行前の処理になります。
Gitのステータスがクリーンな時のみビルド実行を行うようにしています。
あとはpod installも毎回するようにしています。

#### lane :beta
こちらがbetaアップロードするためのlaneになります。  

| Action | 説明 | オプション |
| -------- | -------- | -------- |
| sigh     | プロビジョニングプロファイルを取得します。(ここではAdHoc用)<br>※初回実行時はパスワードを聞かれました。(キーチェーンに登録されるので次回からは省略できると思います) | **app_identifier:**<br>Bundle ID<br>**username:**<br>Apple Developer Accountのユーザ名を記述 |
| build_app     | このアクションでアプリをビルド(アーカイブ)します。 | **schme:**<br>ビルド対象のTARGET名を記述します。<br>**export_method:**<br>ad-hoc用のプロビジョニングプロファイルでアーカイブするので「ad-hoc」としています。<br>**workspace:**<br>workspace名を記述します。 |
| crashlytics | build_appでアーカイブしたものをBetaにアップロードします。 | **api_token, build_secret:**<br> Crashlyticsで取得したapiトークンとシークレットを設定します。<br>**crashlytics_path:**<br>crashlyticsのライブラリのpathを指定します。cocoapodsで管理している場合は記載のままで大丈夫です。<br>**notes:**<br>リリースノートです。ここでは「[Debug] commit_hash (改行) アップロード日時」という感じで掲載されます。 |

## 4. 実行
ここまでできたらlaneを実行してみます。

```
# プロジェクトのTOPディレクトリに移動して実行
$ bundle exec fastlane beta
...
[13:10:01]: fastlane.tools just saved you 6 minutes! 🎉
```

成功するとちゃんとBetaにアップされていることが確認できます。
![fastlane完了後のReleaseNote.png](https://qiita-image-store.s3.amazonaws.com/0/247690/9f2c235c-fb33-5a8b-154f-31d210bb25e2.png)
Tableauを利用したUser Filter Tips

業務でTableauを利用した際にちょっとひねった技を使う必要があったのでその備忘録として

# 課題1 自部署内の人別の売り上げを比較するデータを見せたい
通常のTableauであればFilterをユーザーに設定してもらって見せるというのが一般的な流れになると思います。ただ、今回の場合はユーザーがログインした段階で見せたいというものになります。

### 前提条件　組織のマスタ情報がある
組織の階層を持ったマスター情報があるということが前提になります。
データイメージ

~~~
row, 部門, 部署, 人 
1   Sales, 第一, 山田
2   Sales, 第一, 田中
3   Sales, 第一, 中田
4   Sales, 第二, 佐藤
5   Sales, 第二, 松井
~~~

それとTableauServerを利用した環境になります。
### 課題1の動き
山田さんでログインした際に山田、田中、中田のデータを取得したい

### 解決策
とりあえず誰でログインしたかは
`USERNAME()`で取得できます。
次に新しいDimension [User_Flag]を作成します。

~~~
[User_Flag]
CASE [人] == USERNAME()
  THEN 1
  ELSE 0
END
~~~

[User_Flag]にはログインした人に1それ以外には0が入ります。なので山田さんでログインすれば

~~~
row, 部門, 部署, 人, [User_Flag]
1   Sales, 第一, 山田, 1
2   Sales, 第一, 田中, 0
3   Sales, 第一, 中田, 0
4   Sales, 第二, 佐藤, 0
5   Sales, 第二, 松井, 0
~~~

次に[Same_Org] という同じ部署なら1、それ以外なら0を返すDimenstionを作成します。
ここで利用するのがFIXED関数になります。
下記のリンクとかわかりやすいです。
https://ex-ture.com/blog/2017/12/04/%E5%88%86%E3%81%8B%E3%82%8A%E3%82%84%E3%81%99%E3%81%84lod-fixed%E7%B7%A8/ 

~~~
[Same_Org]
{FIXED [部門], [部署]: MAX([User_Flag])}
~~~

[部門], [部署]が同一のデータの中から[User_Flag]の最大値を取得します。
そのため、Sales　第一の人であれば1　それ以外の部署であれば0が値として入ります。

~~~
row, 部門, 部署, 人, [User_Flag], [Same_Org]
1   Sales, 第一, 山田, 1, 1
2   Sales, 第一, 田中, 0, 1
3   Sales, 第一, 中田, 0, 1
4   Sales, 第二, 佐藤, 0, 0
5   Sales, 第二, 松井, 0, 0
~~~

フィルター条件をSame_Org=1にすることでほしいデータが取得できます。

以上
【PHP】array_mergeと+演算子の比較

# array_mergeと+演算子の違いを忘れないためのメモ

## 使用する配列
```
$array_1 = [
    'a'   => '1-A',
    'b_1' => '1-B1',
    'c'   => [
        'c_1' => '1-C1',
        'c_2' => '1-C2',
    ],
    'd'   => [
        'd_1' => '1-D1',
        'd_2' => '1-D2',
    ],
];

$array_2 = [
    'a'   => '2-A',
    'b_2' => '2-B2',
    'c'   => [
        'c_1' => '2-C1',
        'c_2' => '2-C2',
    ],
    'd'   => [
        'd_1'   => '2-D1',
        'd_2_2' => '2-D22',
    ],
];
```

## それぞれの処理
```
var_dump('テスト１：array_merge');
var_dump(array_merge($array_1, $array_2));

var_dump('テスト２：+演算子');
var_dump($array_1 + $array_2);
```

## 結果
```
string(27) "テスト１：array_merge"
array(5) {
  ["a"]=>
  string(3) "2-A"
  ["b_1"]=>
  string(4) "1-B1"
  ["c"]=>
  array(2) {
    ["c_1"]=>
    string(4) "2-C1"
    ["c_2"]=>
    string(4) "2-C2"
  }
  ["d"]=>
  array(2) {
    ["d_1"]=>
    string(4) "2-D1"
    ["d_2_2"]=>
    string(5) "2-D22"
  }
  ["b_2"]=>
  string(4) "2-B2"
}
string(26) "テスト２：+演算子"
array(5) {
  ["a"]=>
  string(3) "1-A"
  ["b_1"]=>
  string(4) "1-B1"
  ["c"]=>
  array(2) {
    ["c_1"]=>
    string(4) "1-C1"
    ["c_2"]=>
    string(4) "1-C2"
  }
  ["d"]=>
  array(2) {
    ["d_1"]=>
    string(4) "1-D1"
    ["d_2"]=>
    string(4) "1-D2"
  }
  ["b_2"]=>
  string(4) "2-B2"
}
```

## まとめ
### array_merge
* キーが同じ場合、後の引数の配列で上書き
* 多次元配列であろうが、第1階層の引数のみで比較
* 

### +演算子
* キーが同じ場合は、先の引数が優先(上書きされない。)
* こちらも、第1階層のみ比較

※第2階層以降も比較したい場合は、別の処理が必要。
Reactの実装パターン (Render Callbacks)

# あらすじ

React Routerで使う `<Route>`コンポーネントの使い勝手で、 `render` propsでサクッと画面を実装するにはどうすればいいんだろう。
あわよくば、状態に応じて表示するものを切り分ける時にサクッと切り分けたいな。

```jsx
import { Route, Redirect } from 'react-router'

<Route exact path="/" render={() => (
  <span>Top Page</span>
)}/>
```
# 方針

サクッと実装するためにrecomposeの `toRenderProps()` を使う。


# 実装

下記の実装はindex.jsで一筆書きです。

```jsx
import React from "react";
import ReactDOM from "react-dom";
import { toRenderProps, withState, lifecycle, compose } from "recompose";
import { Dimmer, Loader, Segment } from "semantic-ui-react";
import "./styles.css";
import "semantic-ui-css/semantic.min.css";

function App() {
  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>
    </div>
  );
}

const enhance = compose(
  withState("isLoading", "updateLoading", true),
  lifecycle({
    componentDidMount() {
      const { updateLoading } = this.props;
      setTimeout(() => {
        updateLoading(false);
      }, 1000);
    }
  })
);
const Component = toRenderProps(enhance);

const rootElement = document.getElementById("root");
ReactDOM.render(
  <Component>
    {({ isLoading }) =>
      isLoading ? (
        <Segment>
          <Dimmer active>
            <Loader />
          </Dimmer>
        </Segment>
      ) : (
        <App />
      )
    }
  </Component>,
  rootElement
);

```
Laravel の Mailable で CSVファイルを添付したメールを送る

Laravel の Mailable を使って、CSVファイルを添付してメールを送る方法

## 使うもの
`->attachData()` を使う。

## コード
```
<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class OrderMail extends Mailable
{
    use Queueable, SerializesModels;

    public function build()
    {
        $file = $this->makeFile();
        return $this->view('emails.order')
                    ->attachData(stream_get_contents($file), "order.csv");
    }

    public function makeFile()
    {
        $header = [
            "受注日",
            "受注番号",
            "商品名",
            "単価",
            "個数",
            "小計",
        ];

        $body = [
            "2018/10/17,
            "AB1001",
            "おいしい林檎ジュース",
            100,
            12,
            1200,
        ];

        $stream = fopen('php://temp', 'w');

        fputcsv($stream, $header);
        fputcsv($stream, $body);
        rewind($stream);
        return $stream;
    }
}
```

### 参考

https://laravel.com/docs/5.7/mail#attachments
https://stackoverflow.com/questions/28313121/laravel-email-attach-text-file-without-actually-creating-the-file
VRでLightningTalkやってみた

研究室内のLightningTalkでFinalIKを紹介する際、せっかくなのでVRでやろうと思って色々調べた時に参考にさせて頂いたサイトをまとめました。誰かの参考になれば＆備忘録として:eyes:

#参加者に見せる画面用カメラの用意
「UnityでOculus側とディスプレイ側に別々の視点の映像を表示する」
https://qiita.com/Rauziii/items/5fc45844b551f33184b3
こちらを参考にさせて頂きました
この方法で自分はキャラクター目線、ディスプレイはスライドを正面に捉えたカメラに設定できます

#「コントローラを使ったスライドの変更」
スライドごとにMaterialを作成してPlaneに貼り付け、適宜切り替える
いちいちMaterialを作る手間がかかるため他にもっといい方法がありそうですが:thinking:
1.Materialに張り付けるスライドをJPG出力します
2.UnityでMaterialを作成
3.MaterialのShaderを"LegacyShader/Diffuse"に変更
4.JPGをMaterialのInspectorの赤丸部分へドラッグ＆ドロップ
![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/257894/b98ece6a-d450-625f-6cee-688b3c25f003.jpeg)
5.Materialのリストを作成する 
　　Planeにつけたスクリプト内で```public Material[] _slids;```のように宣言し、PlaneのInspectr内でリストのサイズを指定し、手順4で作ったMaterialをドラッグ＆ドロップ
![1.JPG](https://qiita-image-store.s3.amazonaws.com/0/257894/f6556e9f-80d8-01bf-9761-18ac9056db1c.jpeg)

6.コントローラの入力などに応じてリスト内のMaterialを切り替えます

```c#
if(OVRInput.GetDown(OVRInput.RawButton.RIndexTrigger))
        {
            if(i<5)
            i++;
            //スライド進める
            this.GetComponent<Renderer>().sharedMaterial = _slids[i];
        }
        else if (OVRInput.GetDown(OVRInput.RawButton.LIndexTrigger))
        {
            if(i>0)
            i--;
            //スライド戻す
            this.GetComponent<Renderer>().sharedMaterial = _slids[i];
        }
```

#その他細かい点など
・指示棒はCylindarをキャラの右手の子オブジェクトとして作成し、色を付けてます　
・指示棒などを使う場合はカメラのすぐ後ろに鏡を置くとどこを指しているかわかるので便利です僕は"Magic Mirror"というAssetを使いました[アセットストアのURL](https://assetstore.unity.com/packages/tools/particles-effects/magic-mirror-lite-reflection-for-unity-34824?aid=1011lGbg&utm_source=aff)
・UnityのGameウィンドウを会場のスクリーンに映したためにスライドの文字が小さいと文字がつぶれてしまうので、文字サイズを大きくしたり太字を活用したりが必要です
#やって思ったことなど
Vtuberが流行っているからか、そこそこ反応は良かったです
ただ今回声はOculusのマイクではなくスマホで通話しながらマイクで拡散するというかなりの力技だったので、もし機会があれば次回は恋声なども使ってみたいですね
.bash_profile を分割する話

`cron.d` みたいな感じで bash でログインしたときに自動実行されるファイル群が `/etc/profile.d/` にあるけど、
これを各ユーザ毎にも実施したい話。

## コンセプト

各ユーザごとに `~/.bash.d` 配下の実行権限がついてるファイルをログイン時に読み込むようにする。

### rootで準備

こんな感じで配置。

```sh:/etc/profile.d/bash.d.sh
[ -d ~/.bash.d ] && while read x; do source $x; done < <(find ~/.bash.d/* -type f -executable)
```

### 各ユーザで準備の例

```sh:~/.bash.d/hoge
export HOGE=123
```

`chmod +x ~/.bash.d/hoge` で実行権限付けておく。

これでログイン時に `$HOGE` が設定される。

## ハンズオン

```rb:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "centos/7"
  # とか
  #config.vm.box = "bento/ubuntu-16.04"
end
```

```hosts.yml
servers:
  hosts:
    default
  vars:
    ansible_ssh_common_args: -F ssh_config
```

```yaml:main.yml
---
- hosts: servers

  tasks:
    - name: init bash.d
      become: yes
      become_user: root
      shell: >
        echo
        '[ -d ~/.bash.d ] && while read x; do source $x; done < <(find ~/.bash.d/* -type f -executable)'
        > /etc/profile.d/bash.d.sh
      args:
        creates: /etc/profile.d/bash.d.sh

    - name: init user dir
      file: path=~/.bash.d
      state: directory

    - name: sample env
      shell: |
        echo 'export HOGE=123' > ~/.bash.d/hoge
        chmod +x ~/.bash.d/hoge
      args:
        creates: ~/.bash.d/hoge
```

### 構築

`vagrant up` してから　`vagrant ssh-config > ssh_config` しておく。

```sh
ansible-playbook -i hosts.yml  main.yml
```

### 確認

```sh
vagrant ssh -c 'echo $HOGE'
```

## その他

### 何が嬉しいか？

単純に `~/.bash_profile` を分割できるのと、

`ansible` の冪等チェックに `args.creates` を使うことが多いと思うけど、
タスクごとに `~/.bash.d/{env_for_some_task}` を放り込んでおけば、
それがそのまま環境変数と冪等チェックに両方使えて嬉しい感じ。

二重追記されて汚くなった、みたいなことがなくなる。はず。

あと、副次的に cron 起動する際 `~/.bash_profile` 一気読みだと都合が悪い時とかに、必要な環境変数だけ読むようにできたり。

### 実行権限要る？

on/off の切り替えが楽なのでやってるけど、趣味の範囲。
そのへんはお好みで。

## 参考

https://mattintosh.blog.so-net.ne.jp/2012-10-07-4
pycurlをmacOS Sierraで動くようにする

# まだ Sierraなの？

ほっとけ、会社勤めだといろいろあるんや。。。

# これが出て辛かった

```shell-session
$ python -c "import pycurl"
pycurl: libcurl link-time ssl backend (none/other) is different from compile-time ssl backend (openssl)
```

# none/otherってなんやねん

```shell-session
$ /usr/bin/curl --version
curl 7.54.0 (x86_64-apple-darwin16.0) libcurl/7.54.0 SecureTransport zlib/1.2.8
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz UnixSockets 
```

SecureTransportってなに？

## こうあって欲しい

```shell-session
$ curl --version
curl 7.61.1 (x86_64-apple-darwin16.7.0) libcurl/7.61.1 OpenSSL/1.0.2p zlib/1.2.8
Release-Date: 2018-09-05
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp 
Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP UnixSockets HTTPS-proxy 
```

# とりあえずcurl

```shell-session
brew uninstall curl
brew install --force curl --with-openssl
echo 'export PATH="/usr/local/opt/curl/bin:$PATH"' >> ~/.bash_profile
source ~/.bash_profile
```

これであって欲しい姿になった。

# そして、pycurl

```shell-session
PYCURL_SSL_LIBRARY=openssl LDFLAGS="-L/usr/local/opt/openssl/lib" CPPFLAGS="-I/usr/local/opt/openssl/include" pip install --no-cache-dir --user pycurl
```

## 多謝

[Installing PycURL on macOS High Sierra](https://cscheng.info/2018/01/26/installing-pycurl-on-macos-high-sierra.html)

# いいたいこと

requestつかってくれ、お願いだから。
Xcodeにコンパイルエラーが表示されないときの対処法

Buildがfailedするのに、XcodeでIssue Navigator, Issue Navigatorになにも表示されなくなったときの対処法備忘録。
Xcode10のせいかと思っていたら結構前からあるバグみたいです。

結果以下のステップで直りました:ok_hand:
今回のケースに限らずXcodeの不具合はだいたいこれで直る気がしてます。

#### 1. DerivedDateを消去
```rm -rf ~/Library/Developer/Xcode/DerivedData```

#### 2.キャッシュを消去
```rm -rf $HOME/Library/Caches/com.apple.dt.Xcode/```

#### 3.XCode再起動
[Java]jarコマンドで圧縮・無圧縮が混在したjarファイルを作る

# JDK しかない、だと…

**ビルドツールのない環境**（使えるのは JDK のみ）で Spring Boot の実行可能な jar ファイル（`fat jar` が正式名称なんですかね？）に含まれるリソース（コンパイル不要）の一部の **差し替え** が必要になって、**jar コマンドでなんとかした** ときのメモ。

## とっさの対応

時間がなくて思いつきで **えいや** でやった方法です。
※オリジナルの jar ファイルの **展開** と リソースの **差し替え** については割愛

```text:作業用パス構成（一部）
+ (作業ディレクトリ)
  + work
    + BOOT-INF
      + classes
      + lib
    + META-INF
      + MANIFEST.MF
    + org
      + springframework
        + ...
```

```shell:コマンド
jar cvfm0 Hoge.jar ./work/META-INF/MANIFEST.MF -C ./work .
```

実行可能な jar ファイルはできたものの、`0 オプション` で **全ファイルを無圧縮** としたため、ファイルサイズが **数倍** に膨れ上がりました。。。

## まっとうな対応

無圧縮にしたかったのは `BOOT-INF/lib` 配下の jar ファイルだけだったので、落ち着いてからやり方を調べてみました。

事前準備として `BOOT-INF/lib` 配下の jar ファイルだけ別のパスに移動させておきます。

```text:作業用パス構成（一部、BOOT-INF/lib移動後）
+ (作業ディレクトリ)
  + work
    + BOOT-INF
      + classes
    + META-INF
      + MANIFEST.MF
    + org
      + springframework
        + ...
  + work2
    + BOOT-INF
      + lib
```

```shell:コマンド
jar cvfm Hoge.jar ./work/META-INF/MANIFEST.MF -C ./work .
jar uvf0 Hoge.jar -C ./work2 .
```

オリジナルの jar ファイルと同じように、`BOOT-INF/lib` 配下の jar ファイルだけが無圧縮で格納された実行可能な jar ファイルができました。
C++ Builder XE4 > TTabControlの説明（抜粋）、主なイベント（抜粋）、私見: TTabControlでできそうなこと

```txt:動作環境
C++ Builder XE4
```

### 参考文献

- C++ Builder 6 コンポーネント活用ガイド & 実践プログラミング Vol.1
    - 基本コンポーネント編
    - 田中和明様、手塚忠則様
    - カットシステム
    - 第二版
    - p342

### 説明（抜粋）

> TabControlコンポーネントを利用するのは単純なタブセットを扱う場合のみで、プロパティベースなどの多くの場合ではTPageControlコンポーネントを利用します。

### 主なプロパティ (抜粋)

- HotTrack : ...
- Images : ...
- MultiLine : ...
- MultiSelect : ...
- Style : ...
- TabHeight : ...
- TabIndex : ...
- TabPosition : ...
- Tabs : ...
- TabWidth : ...

詳細は本を参照。

### 主なイベント（抜粋）

> - OnChange : ...
> - OnChanging : ...

詳細は本を参照。

### 私見

TTabControlでできそうなこと

- OnChangeイベントを使った、TTabControl上コンポーネントの書換え
- OnChangeイベントを使った、タブごとの情報書出し/読込み
- Tabの追加・削除
- タブボタンとしてのタブ切替
- ...

OnChangeのコンポーネント書換えを考えるとTPageControlの方がいいかもしれない。
Next.jsでstyled-componentを使う

## 概要

- next.jsを使用している時にstyled-componentsをデフォルトでは使うことができない
- モジュールを追加することで使えるようになる

## 手順

- モジュールをインストール

```
yarn add -D babel-plugin-styled-components
```

- `.babelrc`を追加

```json:.babelrc
{
  "presets": ["next/babel"],
  "plugins": ["styled-components"]
}
```

- ServerSideでrenderingされるhtmlにCSSを埋め込むためのファイルを追加

```jsx:pages/_document.js
import Document, { Head, Main, NextScript } from 'next/document';
import { ServerStyleSheet } from 'styled-components';

export default class MyDocument extends Document {
  static getInitialProps({ renderPage }) {
    const sheet = new ServerStyleSheet();
    const page = renderPage(App => props => sheet.collectStyles(<App {...props} />));
    const styleTags = sheet.getStyleElement();
    return { ...page, styleTags };
  }

  render() {
    return (
      <html>
        <Head>{this.props.styleTags}</Head>
        <body>
          <Main />
          <NextScript />
        </body>
      </html>
    );
  }
}
```

- これでOK！
intelliJ  + Groovy 備忘録 


IntelliJ に**無料版**がある事を今更知ったので使用してみた。

今回、intelliJ上で既存のgroovyを動作させることを目標とする。
※既存のgroovyプログラムは以前作ったもので、造りの詳細は覚えていない

下記からコミュニティ版をDL
https://www.jetbrains.com/idea/download/#section=windows

日本語化するためPleiadesをインストール
`pleiades-win.zip`

groovyを読み込ませるためのPJを作成しようとしたが
JDKが別途必要な様子なので、JDKも以下をDLしインストール
`jdk-8u162-windows-x64.exe`

groovyも必要な様子なので以下をインストール
`groovy-2.6.0-alpha-2-installer.exe`

groovyのプロジェクトを新規作成し、既存のgroovyプログラムをsrc配下にコピー

ファイル＞プロジェクト構造
　プロジェクト設定＞プロジェクト
　　でjdk1.8に設定
　プラットフォーム設定＞グローバルライブラリ
　　でgroovyを設定

この状態ではアノテーションを正常認識してくれないため、intelliJのライブラリを設定必要
  InttelliJのライブラリフォルダ内にある、
`annotaion.jar`
之をプロジェクト構造で、ライブラリに追加

上記では使用ライブラリが足りないため追加する
今回使用したライブラリで設定が必要だったのは以下で
　jersey
無いので、↓をDLする
`jaxrs-ri-2.27.zip`
zipを解凍後、内包されるjarをビルド時に参照できるように
プロジェクト構造で、ライブラリに追加

ビルドは通り実行結果も帰ってくるが一部文字化けしているため、修正が必要だった。

文字化けについて
ideaの設定に追記が必要
ユーザ下のconfigに設定する必要がある。
　今回は↓
`C:\Users\XXXXXX\.IdeaIC2018.2\config\idea64.exe.vmoptions`
上記のファイルに↓を追記する必要があった。

```
-Dfile.encoding=UTF-8
```

※作業後のメモの為、漏れあり得ます。
数学オンチのプログラマが数学を学習し直すらしいです【集合】

# はじめに

この記事は [数学オンチのプログラマが数学を学習し直すらしいです](https://qiita.com/manzyun/items/af84c34c15c90539569f)シリーズの「集合」についての記事です。

このシリーズは、
「まず数学記号を読めて、意味が理解できるようになろう」
「ついでにそれをソースコードで表せるようになろう」
が目標の、かなり小馬鹿にしたようなものとなります。

# 背景

集合、組合せ、それに伴う確率の問題は筆者は苦手である。
しかし、アルゴリズムの最大計算量や深層学習を学ぶ上では避けては通れない話である。

高校時代にベン図を書かれて「この条件に該当する人はここの範囲に入り……」
などと説明を受けてもピンとこなかった。更に居眠りグセがあり、自宅での復習もろくにしない筆者は、
集合の記号が途中で読めなくなって諦めた気がする。

# 本題

ということで、やっていこう

## 記号は覚えてます？

```math
a \in A \\
A \subset B \\
```

こちら、上から

* 要素 `a` は `A` に *属する*
* 集合 `B` は 集合 `A` を含む（部分集合）

ということだ。
「基本すぎるだろう」
って？　いや、自分は真面目に忘れていた。

せっかくなので一つPythonで書いてみよう。

```python
fruit = {"apple", "banana", "tomato", "orange"} # 集合 `fruit` を定義
print("apple" in fruit) # `True` と表示されるはず。
```

Haskellだとこうかな？

```haskell
import qualified Data.Set as Set
main :: IO ()
main = do
    let fruit = Set.fromList ["apple", "banana", "tomato", "orange"]
    putStrLn $ Set.showTree $ fruit
```

`in` 演算子で左辺が右辺の集合に属するか調べることができることがわかったと思う。

部分集合の表し方は今回省く。

### 論理和・論理積

こちらも記号が読めれば簡単にコードに落とし込める。

```math
A \cap B \\
A \cup B
```

上から順番に、

* 集合 `A` , 集合 `B` どちらの条件にも属するもの（積集合）
* 集合 `A` もしくは集合 `B` またはどちらの条件にも属するもの（和集合）

Pythonだとどう書くのだろうか。

```python
fruit = {"apple", "banana", "tomato", "orange"} # 集合 `fruit` を定義
vegetables = {"eggplant", "tomato", "carrot", "broccoli"} # 集合 `vegetables` を定義

print(fruit.intersection(vegetables)) # 積集合なので、 `{"tomato"}` が表示されるはず。
print(fruit.union(vegetables)) # 和集合なので、 `{'tomato', 'apple', 'broccoli', 'carrot', 'banana', 'eggplant', 'orange'}` が表示されるはず。
```

## ド・モルガンの法則

ここまで話すと、高校数学の難所「ド・モルガンの法則」が出てくる。
言われてもピンとこないと思うが、こういうことが成り立つらしい。
なお、上に線が引いてある部分は「〜ではない（否定）」の意味になる。

```math
\overline{A \cap B} = \overline{A} \cup \overline{B} \\
\overline{A \cup B} = \overline{A} \cap \overline{B}
```

日本語にうまく直せない。

# まとめ

* 最近のプログラミング言語は集合が扱えるかもよ（Pythonは標準で扱える）
* ド・モルガンの法則未だにわからないな……。
* そもそもド・モルガンの法則を考え初めてしまったのなら、分岐処理を分割したほうが良いかもしれない。

# 参考資料

* [ネイティブデータ型 - Dive Into Python 3 日本語版](http://diveintopython3-ja.rdy.jp/native-datatypes.html)
* [高等学校数学A/集合と論理 - Wikibooks](https://ja.wikibooks.org/wiki/%E9%AB%98%E7%AD%89%E5%AD%A6%E6%A0%A1%E6%95%B0%E5%AD%A6A/%E9%9B%86%E5%90%88%E3%81%A8%E8%AB%96%E7%90%86)

# P.S.

* Haskellのコード追加したい。
* ド・モルガンの法則の証明をしたい……。
Sequel Pro で踏み台サーバ経由で接続したサーバからデータベース接続する方法

# 概要
本番環境など、個人鍵を利用した踏み台サーバ経由でしか接続できないサーバがあり、そこからしか接続できないデータベースにアクセスしたいケースで Sequel Pro で接続したいときに調べた方法です。 

# やりたいこと

以下の状態で、クライアントから Sequel Pro で本番データベースに接続する。

![SS2.png](https://qiita-image-store.s3.amazonaws.com/0/132495/3e9eb7b7-b349-88ed-e81e-6cd07954ce1d.png)

# 設定手順

## 1. ~/.ssh/config を作成する。

~/.ssh/config に以下の内容を記載する。

```bach:~/.ssh/config
#　踏み台サーバへの接続設定
Host step-server
  Hostname xx.xx.xx.100
  Port 22
  User step-server-user-name
  IdentityFIle ~/key/step-server-key

# データベースに接続できるサーバへの接続設定
# SSHホストに記入する名前
Host production-server
  Hostname xx.xx.xx.101
  Port 22
  # SSHユーザに記入する名前
  User prudouction-server-user-name
  ProxyCommand ssh step-server nc %h %p
  # SSH鍵に記入する鍵
  IdentityFIle ~/pem/production-server.pem
```

## 2. Sequel Pro の設定を記載する。

![ss.png](https://qiita-image-store.s3.amazonaws.com/0/132495/dcb79d5b-0a34-b241-93a4-76306f47ccfa.png)

## 3. 接続する。

接続時に、 **step-server-key** のパスワードを求められるので、それを入力すると目的のデータベースに接続できます。
公式Dockerイメージ PostgreSQL メモ

https://hub.docker.com/_/postgres/

# 筆者環境
- Docker for Mac Version 2.0.0.0-beta1-mac75 Channel Edge

# 初期設定

- ユーザ postgres
- データベース postgres

については何も定義しなくても最初から存在している。
コンテナを動かすにはこれらに加えて最低限postgresユーザのパスワードを設定する必要がある。

```
docker run -d -e POSTGRES_PASSWORD=mysecretpassword postgres:10-alpine
```

# 永続化

`/var/lib/postgresql/data` をマウントする。

```
docker run -d -e POSTGRES_PASSWORD=secret -v `pwd`/pgsql-data:/var/lib/postgresql/data postgres:10-alpine
```

## Docker Compose

postgresユーザのパスワードの設定、永続化、ポートフォワードの設定を行った場合。

```yml:docker-compose.yml
version: '3'
services:
  postgres:
    image: postgres:10-alpine
    # 任意のパスワード
    environment:
      POSTGRES_PASSWORD: secret
    # ホスト側は任意のディレクトリ
    volumes:
      - ./pgsql-data:/var/lib/postgresql/data
    # ホスト側は任意のポート
    ports:
      - 5432:5432
```

起動する場合は、 `docker-compose.yml` のあるディレクトリで、

```
docker-compose up -d
```

を実行。

# 接続

上記 `docker-compose.yml` 設定の場合、ホスト環境からの接続は、

- ホスト localhost
- ポート 5432
- データベース postgres
- ユーザ postgres
- パスワード secret

を指定することで接続できる。
iPhoneの端末サイズ判定用【2018/10/17最新】


端末サイズを知りたい！

つ![image.png](https://qiita-image-store.s3.amazonaws.com/0/55864/b6957b67-e63e-440a-8f69-3400af5a8e4a.png)




違う違うのだ...swift上での判定がしたいのだ...

ということで判定用のCGSizeの一覧

| 機種        | width           | height          |
| ------------- |:-------------:|:-------|
| iPhone6 | 375 | 667　|
| iPhone6plus | 414   |   736 |
| iPhone7 | 375 | 667　|
| iPhone7plus | 414   |   736 |
| iPhone7 | 375 | 667　|
| iPhone7plus | 414   |   736 |
| iPhoneX | 414   |   736 | 
|iPhoneXS| 375|812
|iPhoneXSMax|414| 896|
|iPhoneXR|414| 896|


これを UIScreen.main.bounds.sizeと比較して判定する

他に良いやり方ありますかね？


参考記事
CGSize
https://iphone-tora.sakura.ne.jp/uikit_size.html