OmniAICreator/Qiita-1.07M huggingface dataset:
【Python】True/Falseを1行で切り替える

※コメントでたくさん指摘いただきましたので修正しました。
Pythonでは三項演算子が使えないので、

```php
if $hoge = $hoge ? false : true
```
みたいに書けません。
1行でトグルしたい場合のやり方をよく忘れるのでメモしておきます

```python
hoge = True
hoge = hoge == False

hoge = True
hoge = not hoge # scikit-learnで使われてたのはこっち

hoge = True
hoge ^= True # hoge = True ^ hoge(XOR)のショートハンド

hoge = True
hoge = bool(1 - int(hoge)) # False

hoge = True
hoge = False if hoge else True # False
```
Tomcatを起動しようとしたところ、Catalina.outに「using conf/server.xml: "[xX][mM][lL]"と一致する処理命令ターゲットは許可されていません。」と出ていた時の対処法

## はじめに
この記事は、以下の環境で発生・解決した問題について書いてます。

- CentOS 6.2
- Tomcat 7.0.63

### 2023年4月追記
文面の体裁を整えるため更新。新しい情報は何も入っていません。

## 起きたこと
### 事象
サーバに新規でtomcatをセットアップし、いざ起動→status確認。（この辺りは割愛します）
……**起動してなかった**。

### 確認
慌てず騒がずまずはlogs/catalina.outを確認

    org.apache.catalina.startup.Catalina load
    警告: Catalina.start using conf/server.xml: "[xX][mM][lL]"と一致する処理命令ターゲットは許可されていません。

エラーログの文言をググる。

### 対処
XMLをparseしようとしたときに、先頭バイトが「<?xml」から始まってないときに上記の文言が出るらしい。
ご丁寧に**using conf/server.xml**と書いてあるため確認したところ、先頭に謎の改行が入っていた。
改行を削除し、起動コマンドを叩いたら無事起動できた。
AWS上にDebian GNU/Linuxを構築して、Xを飛ばす

#背景
あまりにてこずったので記録。
ただし、全部必要とは思えない。

#1. 何はともあれ、Debian GNU/Linux手配
あまり考える事は無い。
EC2でインスタンスの作成を選んで、
AWS MarketplaceでDebian検索して
Debian GNU/Linux 9 (Stretch)
選んでみる。
この後色々遊ぶ予定なので大きめにt2.large、
もちろん外からアクセス可能なIPを手配、
ディスク60GB確保、
Nameタグ設定、
セキュリティグループは操作用に22、5901からいくつか開けておく、あと動作確認で80あたり開けておく、
で作成。

#2. デスクトップ環境インストール

これが無いと、Xが飛んでもかなり不便。というより、使えないと思った方が良い。
なお個人的には、vtwmが好きだったんだけど…

https://server-setting.info/ubuntu/vnc-remote-desktop.html
参考にしました。私はKDE派。他で見るmateとはGNOME 2であったか。
```$ sudo apt-get install kde-standard
```
結構待つ。

#3. VNC Serverインストール
デスクトップが飛ばせれば何でも良いんですが。

https://www.server-world.info/query?os=Debian_9&p=desktop&f=6
参照。

```$ sudo apt -y install vnc4server
```

パスワード設定します。
```$ vncpasswd
```

リードオンリーのパスワードとか放置。

一度起動して設定ファイルをこさえる。
:1は明示的にポート5901を指定するのであって、 :2で5902、:3で5903、:4で5904、:5で5905でも良い。
```$ vncserver :1
```

と書いたモノの、なんか意味あったのかな？
```$ vncserver -kill :1
```

ちなみに参考にしたページはGNOME2を使う事を前提にしてますな。

#4. トラブルシューティング用にダミー

繋がらない時の切り分けに。Web入れて80番見るのが楽かと。
```$ sudo apt -y install nginx
```

#5. おまじない兼、ぬか喜び対策用にリブート
```$ sudo shutdown -r now
```

#6. TigerVNCインストール

他でも良かったけど、こちらで成功したので。

https://mag.osdn.jp/10/05/28/0718252
参考に、
ただしバイナリはこちらから
https://www.tightvnc.com/download.php
ダウンロードしてセットアップ。

#7. テスト

トラブルシューティング用に80番を上げておく
```$ sudo /etc/init.d/nginx start
```

下記を参考、
https://www.server-world.info/query?os=Debian_9&p=desktop&f=6

VNC起動
```$ vncserver :1 -geometry 800x600 -depth 24 -localhost no 
```

ポートスキャンして、
80と5901が見えれば成功、80しか見えなければVNCがおかしい、80も5901も見えなければネットワークがおかしい。

8. VNC接続

TightVNC Viewer起動して、リモートホストにDebianのIPを入力、続けて:1を付与
ex) 192.18.0.10:1

で行けるはず…
Amazon Linuxでタイムゾーンを変更してcronの実行時刻にも反映させる


## タイムゾーンの変更

バックアップしてJSTに変更する。

```
$ cp /etc/sysconfig/clock /etc/sysconfig/clock.org
$ ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

このままでは再起動した際にUTCに戻ってしまうため、以下のファイルを編集する。


``` shell:/etc/sysconfig/clock
ZONE="Asia/Tokyo"
UTC=true
```

JSTに変更されていることを確認する。

```
$ date
2018年  5月 30日 水曜日 18:41:15 JST
```


## cronがUTCで実行されてしまう・・・

これでタイムゾーンが完全に切り替わったと思っていたら、以下のように設定していたcronのジョブが深夜の2時に実行されてしまった。。


```
$ crontab -l
0 17 * * *
```

UTCのままですね。

## crondを再起動する

タイムゾーンを変更した場合、cronのジョブに反映させるためにはcrondの再起動が必要らしい。

```
$ sudo service crond restart
```

これでJSTの時刻で実行されるようになった。
PythonからS3にあるcsvをデータフレームにして読み込む

#aws 上のpythonファイルから読み込む

```python
import pandas as pd
import boto3
df = pd.read_csv('s3n://バケット名/ファイル名.csv')
```

# ローカルのpythonファイルから読み込む

```python
import pandas as pd
import boto3
from io import StringIO

s3 = boto3.client('s3')
obj = s3.get_object(Bucket='バケット名', Key='ファイル名.csv')
body = obj['Body']
csv_string = body.read().decode('utf-8')
df = pd.read_csv(StringIO(csv_string))
```

上の方が楽だけど、ローカルからはなぜかできなかった。
Cognos のReport Server(BIBusTKServerMain)プロセスの動作調整

#概要
Cognos AnalyticsやCognos BIでレポートを実行する時、レポート実行の主たる処理はReport Server(BIBusTKServerMain)というC++のプロセス上で行われます。
このBIBusTKServerMainプロセスの動きを調整するパラメーターをまとめておきます。

ちなみに、Cognos Administrationで調整できる辺りの、プロセス数とかスレッド数の話はこちらをご参照下さい。
**Cognosのレポート同時実行時のパラメーターチューニングの考え方**
https://qiita.com/shinyama/items/1cb80e0440c17d6edaf9

#設定ファイル
レポートをオンラインで実行する際の Report Service、バッチで実行する際のBatch Report Service共に、BIBusTKServerMainプロセスを使用しますが、それぞれ、以下のファイルで動作を調整します。

**Report Service**
/opt/ibm/cognos/analytics/webapps/p2pd/WEB-INF/services/reportservice.xml

**Batch Report Service**
/opt/ibm/cognos/analytics/webapps/p2pd/WEB-INF/services/batchreportservice.xml

以降で記載のある、設定のデフォルト値はCognos Analytics 11.0.11でのものです。

#キューの待ち時間を設定
プロセスも低親和性接続も全て埋まっている場合、処理はキュー待ちとなります。
キュー待ちタイムアウトは、以下の箇所で設定が可能です。
Report Serviceの場合は30秒、Batch Report Serviceの場合は4時間がデフォルトになります。

```html
<param-name>queue_time_limit_ms</param-name>
<param-value>30000</param-value>
```

#Cognosサービス起動時に、BIBusTKServerMainプロセスを1つ起動
レポートやバッチを実行したタイミングで、必要に応じてBIBusプロセスは起動されますが、起動のオーバーヘッドは数秒程度あり、Cognos再起動後の最初のレポート実行が遅くて問題になる事があります。
そんな時、以下のパラメーターをtrueにしておくと、Cognos起動と共に、BIBusプロセスを1個立ち上げてくれます。
Report Serviceの場合は true、 Batch Report Serviceの場合は false がデフォルトになります。

```html
<param-name>prestart_process</param-name>
<param-value>false</param-value>
```
#BIBusTKServerMainプロセスが停止するまでのアイドル時間
何も処理が行われないアイドル状態になると、BIBusTKServerMainプロセスはデフォルトで15分で停止して無くなります。
アイドルタイムアウトの設定値は、以下の箇所になります。

```html
<child-proc-cmd>idleTimeLimitSec=900</child-proc-cmd>
```

#BIBusTKServerMainプロセスが停止するまでの処理回数を指定
BIBusプロセスで処理を行った回数により、プロセスの停止を行う事も可能です。
以下の設定値になります。

```html
<param-name>default_process_use_limit</param-name>
<param-value>0</param-value>
```

#処理が全然行われなくなっても、BIBusTKServerMainプロセスを停止しないようにしたい
こちらの設定値で、アイドル状態で15分経過しても、停止せずに残すプロセス数の指定ができます。
Report ServiceもBatch Report Serviceも、どちらもデフォルト 1 になります。
15分待ってもBIBusが落ちないぞ、という場合、実はこちらの設定になります。

```html
<param-name>linger_process</param-name>
<param-value>1</param-value>
```

以上です。
知っておくと、どこかで役立つ設定値だと思いますので、記憶の片隅に留めておいて頂ければと。
[python] Numpyで巨大な配列を効率的に処理するためのTips集

機械学習などで大規模なデータを扱っていると、ごくごく自然にそれらのデータをpandasやnumpy配列に突っ込んで処理したくなるときがあります。
Pythonの場合、forループを回すよりもnumpyの関数を使ったほうが圧倒的に高速なケースは多々あり、日々numpyの恩恵を受けています。

それでも、例えば数万✕数万の行列の演算をしようとすると途方もない時間がかかる、もしくはデータが巨大すぎて１つの配列にデータを保持したまま演算しようとするとメモリ不足でプロセスが強制終了するなど悩まされるケースもあります。
わたし自身、最近この問題で非常に悩まされたので、同じくビッグデータを扱うPythonユーザーたちの助けになればとこの記事を書きました。

# Numpyでも遅い問題

Numpyは普通に演算する分にはとても早いです。しかしそれでも配列のサイズが大きくなると演算が遅くなるケースがあります。その例をまずは見てみましょう。

使用したPCのスペックは以下の通りです。

| マシン | MacBook Pro (13-inch) |
| ---- | ----- |
| CPU | 2.5 GHz Intel Core i7 | 
| メモリ | 16 GB | 
| コアの個数 | 2 |

例として、10,000 ✕ 10,000の2次元配列の内積計算をしてみます。

```python
import numpy as np
import time

# np.ones() で取得できるデータ型は float64
arr = np.ones((10000,10000))

def npdot_time(arr):
  start = time.time()
  np.dot(arr, arr)
  return time.time() - start
  
npdot_time(arr)
# 30.2010498046875
```

10,000行なんてビッグデータでも何でもないような行数だと思われますが、実際に演算は30秒ほどかかっています。桁が増えるとどれほどの処理時間になるか想像したくないほどです。

今回はこの行列の内積演算を高速化・効率化してみましょう。

# 高速化・効率化Tips

## 1. データ型をfloat32にする

`np.float32` は32ビット、つまり単精度の浮動小数点数を表しています。このデータ型を指定することでメモリを効率的に使うことができます。

実際に float32を指定した場合の速度を見てみましょう。

```python 
arr = np.ones((10000,10000), dtype='float32')

npdot_time(arr)
# 14.641755819320679
```

データ型を指定しただけで実行時間が半分以下の14秒台まで出ました。これで倍速はなかなか強いです。

## 2. daskを使う

daskとは、numpyやpandasライクで並列処理、分散処理を行うことのできるライブラリです。入れてない人は

```
pip install dask
```

で入れておいてください。
daskの使い方は以下の記事が詳しいので参照してみてください。
[データ分析のための並列処理ライブラリDask](https://qiita.com/kodai_sudo/items/c2ff1e85da18eaf13b65)

では実際にdaskで内積演算を書いてみましょう。

```python
import dask.array as da

arr = np.ones((10000,10000))
# chunks は配列の長さの半分の 5000 の指定とする
darr = da.from_array(arr, chunks=(5000, 5000))

def dadot_time(arr):
  start = time.time()
  dadot = da.dot(darr, darr)
  dadot.compute() 
  return time.time() - start
  
dadot_time(darr)
# 28.194761991500854
```

30秒かかっていた処理からは2秒短縮です。このくらいの配列のサイズだと効果を実感しにくいですが、サイズが大きくなるに連れて分散処理の恩恵を感じられるようになります。


## 3. 行列を分割して処理をする

そもそも、配列が大きすぎるので処理に時間がかかったり、メモリに乗らなかったりするわけです。であれば、配列自体を小さくして処理するのが妥当でしょう。

今回は行数を100分割して処理をしてみようと思います。

```python 
arr = np.ones((10000,10000))
arrs = np.array_split(arr, 100)

def npdot_split_time(arrs, arr):
  start_time = time.time()
  dots = [np.dot(a, arr) for a in arrs]
  dot_matrix = np.concatenate(dots)
  return time.time() - start_time
  
npdot_split_time(arrs, arr)
# 27.128658771514893
```

これも30秒かかっていたころから3秒の短縮です。これも速度を劇的に改善する手法ではないのですが、配列のサイズが大きすぎて内積計算中にプロセスが強制終了（KILL 9）されることを防ぐための方法となります。

# まとめ

各手法の実行時間とどんなときに使えるかをまとめました。実際にはこれらを合わせて使うことで巨大な配列の演算を実現させます。

| 手法 | 実行時間[s] | どんなときに使えるか |
| --- | ---- | ---- |
| そのまま numpy.dot | 30.2 | --- |
| float32に変更 | 14.6 | 単純に関数の処理を高速化したい |
| daskを使う | 28.2 | 分散処理を使って複数のCPUで処理したい |
| 配列を分割する | 27.1 | メモリに乗らないくらいの巨大な配列計算を処理したい |


これらのTipsが皆さんの参考になれば幸いです！
言語の開発

# ある日思いついた
関数型、オブジェクティブのどちらも選択できる言語を作れば最強なのでは？と

# 既存の言語に対する偏見

|language||
|---|---|
C/C++|魔境
Ruby|よき
Python|スコープによる記法じゃないのでなんか見づらい
Ocaml|Windowsの環境構築が謎
Haskell|哲学
Javascript|スコープとは

# 言語傾向と目標
### 傾向
**Haskell + Ocaml + C/C++ + Ruby + Javascript**を足して割った感じ（雑）
### 目標
* ネイティブコードを生成できる
* JIT可能
* C/C++等の別言語からのライブラリ移植可能
* 最強


# コンパイラ作成環境
* C/C++
    * gcc/g++ = 7.x
    * libboost >= 1.64
    * LLVM
* cmake > 3.10
* gtest

# 進捗
syntaxを考えつつパーサーを実装中
リポジトリは以下のとおり

|type|repository|
|---|---|
syntax|[github.com/Angeart/sapphire-syntax](https://github.com/Angeart/sapphire-syntax)
parser/compiler|[github.com/Angeart/sapphire-cpp](https://github.com/Angeart/sapphire-cpp)

# 共同開発
今のところ友人とsyntaxを考えていますが、いっしょに開発してくれる方**募集してます**
連絡先 -> [@shinomiya_ag](https://twitter.com/shinomiya_ag)
GITワークフロー

今のチームでのワークフローです。

## 作業前にはPullをする
後々コンフリクトなどの可能性を下げるために作業を始める前に一度origin masterをpullする。
## 作業ブランチを切る
今回は登録時にあるバグを修正していきます。

```
git checkout -b bug/fix_registration
```
まず修正作業を行うブランチを作成しcheckoutします。
## Masterにマージする準備
作業を終えたらコミットをしてマージする準備を始めます。今のワークフローではプルリクなどはないので直接masterにマージしちゃいます。
まず最初にmasterを最新の状態にしておきます。

```
git checkout master
git pull
```
もう一度バグ修正ブランチに戻りmasterの上にリベースします。こうすることによって綺麗なコミット履歴を保つことができます。

```
git checkout bug/fix_registration
git rebase master
```
## ブランチをマージ
最後にmasterブランチに戻りバグ修正ブランチをマージします。

```
git checkout master
git merge bug/fix_registration
```
今回の行ったマージは*fast forward*マージと呼ばれるもので今回のようなマイナーなバグ修正などの時に使います。長期的な作業を行うブランチのマージの場合はマージコミットをするようにしている。

```
git merge --no-ff feature/add_module
```

マージコミットを作成することによって履歴上`feature/add_module`で行った作業を一つのコミットにまとめることができる。この追加が原因でアプリケーションが壊れた場合はこのコミットを*revert*することで簡単に戻すことができる。
Golang depでローカルpackage を使うときにハマったこと

# depでローカル開発してたpackageを参照しようとしてハマった

Golangで パッケージマネージャとして `dep` を使っていた。 ローカルにある**開発中の*** `package`を`import "..."`
していたのだが、 `dep ensure -updae`をすることで勝手に `Gopkg.lock`に 参照されていた
だが、いちいちgitのリポジトリにPushして `dep ensure -update`などとしていては効率が悪い。
ので、どうにかしたかった2日ぐらい悩まされ結局 [公式Document](https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md) に書いてあったのを思いっきり見落としていた

## 解決
`Gopkg.toml`に [ignored](https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md#ignored) という項目を追加することで、プロジェクト内で参照はされているが、
packageをダウンロードしてこないようにできた


```toml
ignored = ["github.com/user/project/badpkg"]

[[constraint]]
  name = "github.com/user/project1"
  branch = "master"
  source = "github.com/myfork/project1"

[[constraint]]
  name = "github.com/user/project2"
  branch = "dev"
  source = "github.com/myfork/project2"

```

## 新たな問題点
Docker内で開発をしていたのでどのみち、ローカルのpackageを参照するにはvolumeを指定する必要があり、
これなら、今までどおり、開発して `push` して `dep ensure -update` してのながらでも変わらないような気もする。
`import "app/..."` というのも考えたが、非推奨なためどうしたものか

## 参考

[依存関係管理ツール dep を試してみた](https://dev.classmethod.jp/go/dep/)
MySQLのinformation_schemaから、直近更新されたデータがどのテーブルかを調べる

WEBアプリケーションの調査をする上で、データの登録・更新を行った際にどのテーブルが変更されたのか、知りたい場合がある。
ソースを読んだりログを見たりといくつかやり方はあるが、更新されたテーブルがどれかを調べる場合は、以下のクエリで抽出できる。

```sql
SELECT * FROM information_schema.TABLES
where TABLE_SCHEMA in ('DB名')
order by UPDATE_TIME desc ;
```
Cloud9でUbuntu18.04LTSを使う

# 概要
普段僕はいろいろなPCをいろいろな場所で使って作業をしているのだが、開発環境をそれぞれのPCに用意するのが面倒だったため**Cloud9**を使って統一環境を用意したいと思ったのが事のあらまし
備忘録程度に

# Cloud9のデフォルト環境はAWS Linuxしか選べない！
**Ubuntuで開発したい（強い意志）**

# 前提条件
* AWSアカウントを所持している

# Setup

### EC2インスタンスの作成
Ubuntuが使いたいので探す

ここでは18.04 LTS bionicインスタンスを選択
![](https://i.gyazo.com/b2cc0428763fdbece6ac6e5607b33f3d.png)

Continue
![](https://i.gyazo.com/2cbc777402ab94d5235432cdf15f7257.png)

インスタンスタイプ
**m5.large**がおすすめやでと強く推されたのでそのまま作成
![](https://i.gyazo.com/0b451f82ee17d761c95b118305d863b2.png)

EC2にSSHで接続して初期アップデートをかける

```bash
sudo apt update
sudo apt upgrade
```

Cloud9はnodejsを要求してくるので良しなにインストールしてやる

```bash
sudo apt install -y nodejs
```

[Cloud9](https://aws.amazon.com/jp/cloud9/)にログインする

### CreateEnvironment
名前と説明を入れてNext Step
![](https://i.gyazo.com/9912b5455e5a62786201f9ee6a81a6d1.png)

ここでSSHモードを選択する
![](https://i.gyazo.com/f7143e3eb52319d813396368231f0b32.png)
Userは**ubuntu**に設定し
Hostはインスタンスのホスト名を入力する

**Copy key to clipboard**を押してSSH keyをコピーしたらログイン済みの端末で`~/.ssh/authorized_key`に追加してやる

端末はここで必要なくなるので閉じてよい

authorized_keyの設定が終わったらCloud9に戻り、Next step
するとEC2へCloud9のインストールが始まるので後は画面に従った後、優雅にインストールが終わるのを待てば完了
Ethereum  Solidity ノウハウ

# Solidity ポイント抜粋　（from クリプトゾンビ）

##　お作法
注：グローバル変数と区別をつけるために、関数パラメーター変数名はアンダースコア(_)をつけるのが通例（必須ではありません）です。このチュートリアルでは通例に従います。


## 構造体配列と配列
```ruby:sample
struct Person {
  uint age;
  string name;
}
Person[] public people;

// 新しいPersonを作る：
Person satoshi = Person(172, "Satoshi");

// それを配列に格納する：
people.push(satoshi);

// こうやると一気にできる
people.push(Person(16, "Vitalik"));

// 通常の配列へのPUSH
uint[] numbers;
numbers.push(5);
numbers.push(10);
numbers.push(15);
// 数字は [5, 10, 15]
```

## 配列返却する時
```ruby:sample
contract EtherTest{

    // 配列宣言して、登録があるたびにPUSHして、増やしていく。eth_sendtransactionでPUSHしていくイメージ
    // ポイントviewするときの通信経路。マイニングに関係がないことを明確に
    string[] Stations;

    // フォームから値を取得してPUSHする関数
    function StationRecord(string _station) public{
      Stations.push(_station);
    }

    // 配列の長さを返却して、javascript側で、インクリメントしないとダメ？っぽいのでそうしてみる
    function StationLeng() public view returns (uint32){
      return uint32(Stations.length);
    }

    function StationDisplay(uint32 _number) public view returns(string){
      return Stations[_number];
    }
}
```
Kotlin

<h1>Kotlinの特徴</h1>
Kotlinとは、JetBrainsが開発したプログラミング言語です。
・行末のセミコロンが不要
・静的型付け
・型記述が省略可能（型推論）
・JVM（Java Virtual Machine、Java仮想マシン）上で動作する
・Javaコードと相互運用ができるため、Javaからの移行が容易
といった特徴があり、Javaよりも簡潔に記述できます。今後はAndroidアプリに限らず、サーバサイドのJavaも置き換えていくかもしれません。
Refinementsで定義したメソッドをusingより前の行で呼び出すテクニック10選

Refinementsはレキシカルスコープという説明をよく聞くけど、どこにコードが書かれているかというよりは`using`を呼んだ後の環境で評価されるかどうかというのが重要。なのでコードの字面でRefinementsで定義したメソッドの呼び出しが`using`より前に書かれていても、先に`using`の方が評価されていれば呼び出せる。

> Refinements are only active within a scope after the call to using.
https://docs.ruby-lang.org/en/2.5.0/syntax/refinements_rdoc.html

## その1. `BEGIN`の中で`using`

`BEGIN`で`using`を使うとどのコードよりも先に`using`が実行されるため先頭行で`using`を書いたのと同じように働く。

```rb
hi
# hi

BEGIN {
  using Module.new {
    refine(Object) do
      def hi
        puts "hi"
      end
    end
  }
}
```

## その10. `binding`を使う

`eval`の第二引数に`using`が効いた環境の`binding`を渡すと`using`で定義したメソッドが使える。

```rb
def greeting(b)
  eval('hi', b)
end

using Module.new {
  refine(Object) do
    def hi
      puts "hi"
    end
  end
}

greeting(binding)
```

`Binding#eval`してもよし。

```rb
def greeting(b)
  b.eval('hi')
end

using Module.new {
  refine(Object) do
    def hi
      puts "hi"
    end
  end
}

greeting(binding)
```

## 10ないじゃん

```rb
"10".to_i(2)
# => 2
```
dockerについて理解した事をまとめた

# dockerを触った経緯
---------- iOSのアプリ開発中----------
ぼく「このAPI毎回違う値返して来てテスト書けねぇからswaggerでスタブ作ってみるか」

----------swagger学習中----------
ぼく「ちょっと動かせるぐらいになった！社内の凄腕エンジニアにMRお願いしよう。」

凄腕エンジニア「ローカル環境によって実行できたりできなかったりするので、docker化しました。MR出しました！」

ぼく「docker触った事ないけど、これを機に使い始めるか！」

# dockerの理解を阻んでいた唯一の原因
**Macで動くdockerって何？Linuxで動いてるんじゃないの？**
→ [Docker for Mac](https://www.docker.com/docker-mac)があるが、これはハイパーバイザでMacOS上にLinuxを立てて、その上でDocker Engineを動かしている。

この疑問がにわか知識では混乱の元になっていた。

**DockerはLinux上でしか動かないよ！！！**

# 今の所感じる便利なところ
## ローカルの依存環境に左右されない。
複数の開発者間での共有が楽。ぶっちゃけ個人で使う場合には、ローカルで環境構築しても全く困らないが、1年後の自分とか別の人が使う時に手間が生まれる。それをdockerは楽にできる。

## コンテナを作ったり壊したりできる。
ローカルへの影響を考えなくて良い。

# Dockerについての理解まとめ
## コンテナ
コンテナとは、ホストOSのkernelを使い複数のルート/ファイルシステムを実行する。各々のリソースを持つ独立した環境で、基本的にコンテナ外のリソースは参照できない。(volumeをマウントするなどの方法もある)

これらはLinuxカーネルの技術によって実現される。
→ **Namespaces**(名前空間によるプロセスの間の隔離、分離: isolation)
→ **Cgroups**( CPU・メモリ・Disk I/Oのリソース制限)

## Docker Engine
CLIからの操作を受け取ってコンテナを操作するのは、このDocker Engine。デーモンとして動いている。

## Docker Image
- コンテナを実行する時に必要なファイルシステム
- イメージ・レイヤの集合体
- レイヤーには親子関係ある
- 差分情報のみを記録する
- レイヤーはRead Onlyで書き込みできない

Dockerfileに`RUN npm install` とか書いておくと、新規レイヤーにnpm installして変更内容をコミットして、イメージをビルドしてくれる。

Docker imageを起動する時には、書き込み可能な新しいイメージレイヤが自動的に割り当てられる。

### イメージの作成方法
1. docker hubから取得
2. コンテナの内容を手動コミットし、新しいイメージを取得する
3. Dockerfileを使ってイメージを自動構築する。(docker build)
(1/4)Tsunagu 連携アプリパック for 勘定奉行 を使ってみる！～準備編～

#<B>1.はじめに</B>
これから何回かに分けて、Tsunagu 連携アプリパック for 勘定奉行の使い方について書いてみようと思います。

##1.1.ご注意ください
●本資料および本資料に関する弊社からの提供物は、使用者の責任で使用ください。
●本資料に記載されている会社名、製品名、サービス名等は各社の商標または登録商標です。

##1.2.必要なもの

###1.2.1.kintone のアカウント
●kintoneのアカウント（お試し版可、ライトコース不可）が必要です。
●kintoneのアカウントは、あらかじめ用意しておいてください。

###1.2.2.Tsunagu 連携アプリパック for 奉行
●［Tsunagu 連携アプリパック for 奉行］のスペーステンプレートが必要です。
●スペーステンプレートは、[kintone連携サービス](https://kintone-sol.cybozu.co.jp/integrate/ndknet002.html)の［お問い合わせ］から問い合わせて、あらかじめ入手しておいてください。

#<B>2.kintoneアプリを作る！</B>
まず、はじめに、スペーステンプレートをアップロードし、次にスペースを作成します。

では、まず、スペーステンプレートのアップロードから作業を行いましょう。

##2.1.スペーステンプレートをアップロードする！
スペーステンプレートのアップロードは**［kintoneシステム管理］**画面から行います。

1.画面上部の**［設定メニューを表示する］**アイコンをクリックし、**［設定メニュー］**を表示します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132039/e1337f08-8542-1222-b8af-7ad8879831e1.png)

2.表示された［設定メニュー］から、**［kintoneシステム管理］**をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132039/d09fdabd-0c62-23e1-795a-ec4d4d61d6a5.png)

3.［kintoneシステム管理］はkintoneの管理や保守に関する設定を行う画面です。ここでは**［スペーステンプレート］**をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132039/806feb6a-ccb0-9e2d-5038-6d704977c4a4.png)

4.スペーステンプレートを読み込むために、**［読み込む］**ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132039/976f6924-04a6-a2e1-625d-a9792b86c0ec.png)

5.**［参照］**ボタンをクリックし、あらかじめ入手しておいたスペーステンプレートを選択し、**［読み込む］**ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132039/b55a8a8a-e1dd-f349-1bc8-897d6d3a7d85.png)

6.［読み込む］ボタンをクリックすると、スペーステンプレートがアップロードされます。アップロードが完了すると一覧に読み込んだテンプレートが表示されます。確認できたら、画面左上の**［ポータル］**をクリックし、ポータル画面を表示します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132039/40ac24af-ce9d-d3de-2b7a-5af741535c21.png)

##2.2.スペースを作成する！
スペースの作成は、ポータル画面の**［スペースを作成する］**ボタンから行います。

1.**［スペースを作成する］**アイコンをクリックし、さらに**［スペースを作成］**を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132039/66f649ab-d6e1-c73b-e11a-49f38956c875.png)

2.**［アプリパック for 勘定奉行］**をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132039/6ddd3c23-81ea-1d5d-5048-808c14f72cd3.png)

3.自動的に［スペース］画面が表示されます。画面右端の［アプリ］欄にはスペースに含まれるアプリが表示されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/132039/30e737bb-1ee3-95d8-937b-322431fd23ed.png)

4.ここまでの手順でスペースとアプリの作成は完了です。

#<B>3.最後に</B>
ここまでの手順で［Tsunagu 連携アプリパック for 勘定奉行］を使ったスペースとアプリの作成は完了です。次回はアプリの概要を説明したいと思います。
Macで IPv6 を 無効化 / 有効化 する

`<networkservice>` の一覧は `networksetup -listallnetworkservices` で取得できます。

# 手順

## 無効化

```shell-session
$ sudo networksetup -setv6off <networkservice>
```

## 有効化

```shell-session
$ sudo networksetup -setv6automatic <networkservice>
```

# 例

```shell-session:Wi-FiのIPv6を無効化
$ sudo networksetup -setv6off Wi-Fi
```
Kubernetesクラスタ 名前空間のアクセス制御


ネットワークのアドオンとして、IBM Cloud Kubenetesサービスでは、Calicoが採用されています。このCalicoはネットワークのポリシーを設定できるので、ネームスペース間のアクセスの分離を検証しました。

Kubernetesのクラスタ・ネットワークを Flannelで構築している場合は、動作しません。



## ネームスペースの準備

テスト環境と本番環境のそれぞれに名前空間を作る

~~~
$ kubectl create namespace testing
namespace "testing" created

$ kubectl create namespace production
namespace "production" created
~~~


## アクセス・ポリシーを設定

他の名前空間からのアクセスを禁止するネットワークポリシーをセットする。

~~~deny-from-other-namespaces.yml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: deny-from-other-namespaces
spec:
  podSelector:
    matchLabels:
  ingress:
  - from:
    - podSelector: {}
~~~


本番環境へ適用する

~~~
$ kubectl apply -f deny-from-other-namespaces.yml -n production
networkpolicy "deny-from-other-namespaces" created
~~~



## アプリの準備

本番環境とテスト環境に、ウェブサーバーをデプロイする。

~~~
imac:bluemix-k8s maho$ kubectl apply -f webserver.yml -n production
deployment "web" created
service "web" created
imac:bluemix-k8s maho$ kubectl apply -f webserver.yml -n testing
deployment "web" created
service "web" created
~~~


サービスとポッドのIPアドレスをリストする

~~~
$ kubectl get svc -n production
NAME      TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
web       ClusterIP   172.21.194.171   <none>        80/TCP    37s

imac:bluemix-k8s maho$ kubectl get pod -n production -o wide
NAME                  READY     STATUS    RESTARTS   AGE       IP              NODE
web-6d95c64d8-kw88r   1/1       Running   0          8m        172.30.26.204   10.132.253.17


$ kubectl get svc -n testing
NAME      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
web       ClusterIP   172.21.52.107   <none>        80/TCP    37s


imac:bluemix-k8s maho$ kubectl get pod -n testing -o wide
NAME                  READY     STATUS    RESTARTS   AGE       IP               NODE
web-6d95c64d8-77ldv   1/1       Running   0          7m        172.30.184.125   10.132.253.30
~~~




テスト環境内にUbuntuのポッドを起動して、サービスとポッドの両方にアクセスできる。

~~~
$ kubectl run ubuntu -n testing --image=ubuntu --restart=Never -- /bin/sh -c "sleep 3600"
pod "ubuntu" created

$ kubectl exec -it -n testing ubuntu bash
root@ubuntu:/# apt-get update
root@ubuntu:/# apt-get install -y dnsutils iproute2 iputils-ping curl
...
~~~

同一名前空間 テスト環境で、サービスとポッドのアドレスにアクセスすると、正常応答が帰る。

~~~
root@ubuntu:/# curl -I --connect-timeout 3 172.21.52.107
HTTP/1.1 200 OK
...

root@ubuntu:/# curl -I --connect-timeout 3 172.30.184.125 
HTTP/1.1 200 OK
...
~~~


本番環境へのサービスとポッドへアクセスすると、ブロックされる。

~~~
root@ubuntu:/# curl -I --connect-timeout 3 172.21.194.171
curl: (28) Connection timed out after 3000 milliseconds

root@ubuntu:/# curl -I --connect-timeout 3 172.30.26.204 
curl: (28) Connection timed out after 3001 milliseconds
~~~


## 参考資料

[1] Calicoプロジェクト https://docs.projectcalico.org/v2.6/getting-started/kubernetes/
[2] Kubernetes Network Policy Recipes https://github.com/ahmetb/kubernetes-network-policy-recipes
[3] ネットワーク・ポリシーによるトラフィックの制御 https://console.bluemix.net/docs/containers/cs_network_policy.html#network_policies
Default interface methods are only supported starting with Android N (--min-api 24)の対処法

apkをビルドしようとして

```
Default interface methods are only supported starting with Android N (--min-api 24)
```
とか

```
com.android.build.api.transform.TransformException: com.android.builder.dexing.DexArchiveBuilderException: com.android.builder.dexing.DexArchiveBuilderException: Failed to process 
```

とかのエラーが出てビルドできないときの対処法


#　原因
Java8の機能を使うようなコードを書いているのに、コンパイルオプションでJava8の指定を忘れている

# 解決方法

```
android {
    ...
defaultConfig {
        ...
        compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    }
   
}

```
build.gradleのdefaultConfig{}の中にJava8のコンパイルオプションを指定する

-  ライブラリだけがjava8の機能使うっていう時にライブラリモジュールのbuild.gradleにだけ書いていて、app/build.gradleには書いていなかったらビルド通らなかったので注意
-  starting with Android N (--min-api 24)とか言っている割にminSdkVersionは21でも全然大丈夫だった
データ可視化のテクニックvol.3 - 表計算

# はじめに
前回のLODの続きです.（前回の記事 : [データ可視化のテクニックvol.2 - LOD](https://qiita.com/hiro_alt/items/04d71c7fe017c5afba44)）
今回は表計算について紹介します. LODより簡単でとっつきやすいかと思います. 

# 表計算とは
表計算とはクエリの結果が返された後の結果を使用して値を計算します. 端的にいうと画面に表示されている項目だけを使って計算する方法とも言い換えることができるかと思います.

まず表計算の式の作り方ですが、表計算は任意のメジャーを右クリックして"表計算の追加"を選択するとポップアップが出ます. 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/95824/7a479e6a-7e2c-737f-76e9-082ec75441b9.png)

どんな計算をどんな向きで追加するか設定します. ちょうどExcelのような感覚だと思います. 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/95824/552d5e1b-7e10-76cf-1fb7-a28210214f0a.png)

今回はランクで表計算式を作成しました. 新規に表計算用の数値項目が作成されるので、もう一度売上を追加しました. 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/95824/04446888-444e-7e93-8674-6bb34dbf565b.png)

表計算がLODと違うところは、表示されている数値の範囲内で計算がされることです. では年度にフィルターを設定して、特定の年度に絞って表示してみましょう.

![image.png](https://qiita-image-store.s3.amazonaws.com/0/95824/4bd2ff2d-117d-3215-c1c1-4a9c5f9e05b4.png)

すると、表示されたデータの中でランキングを返してくれています. このように動的に値を変更させたいときは表計算式を使うことがとても有効です.

# まとめ
いかがでしたでしょうか. 表計算は実際に使うケースが多いかと思います. そしてこれをExcelでやろうとすると大変だったりするのでTableauは本当に便利なツールだと思います.
GCEにFreeBSDをインストールする

#

Google Compute Engineに公式のFreeBSDイメージは存在しない。

コミュニティ版あり。
https://www.cyberciti.biz/faq/howto-deploying-freebsd11-unix-on-google-cloud/

インスタンス動くけど動作が微妙。ssh鍵のセットアップがうまくいかない。

GCE用エージェントプログラムが古いらしい。

    > pkg install py27-google-compute-engine

```/etc/rc.conf
google_instance_setup_enable="YES"
google_accounts_daemon_enable="YES"
google_ip_forwarding_daemon_enable="YES"
google_clock_skew_daemon_enable="YES"
```

入れ替えたら使えそう。

ntp同期が調子悪い。

    > sysctl kern.timecounter.hardware
    kern.timecounter.hardware: TSC

タイマーソース変えてみる。

    sysctl kern.timecounter.hardware="ACPI-fast"

同期した。
Spring WebFlux WebClientにタイムアウトを設定する

```java
@Bean
public WebClient webClient() {
    ReactorClientHttpConnector connector =
            new ReactorClientHttpConnector(builder -> {
                builder.onChannelInit(c -> {
                    c.config().setConnectTimeoutMillis(2 * 1000);
                    c.pipeline().addLast(new ReadTimeoutHandler(5, TimeUnit.SECONDS));
                    return false;
                });
            });
   return WebClient.builder().clientConnector(connector).build();
}
```

[reactor \- Spring 5 webflux how to set a timeout on Webclient \- Stack Overflow](https://stackoverflow.com/questions/46235512/spring-5-webflux-how-to-set-a-timeout-on-webclient)
基本的にここに書いてある内容、なのだが……。  
まず、`SO_TIMEOUT`は設定しても`warn`でそんなオプションはないと警告が出る。多分使えないと思う。
`onChannelInit`だが、booleanを返すInterfaceになっている。とりあえず`true`を返しておけばいいだろうと雑な対応をすると`channel`が閉じられ、使おうとするとNIO系のなんかExceptionが出て死ぬ。使いたかったら`false`で返す必要がある。
一応動作確認したので、これで動くと思います。
C#でClosedXMLを使ってExcelのシートを新規追加

自分用メモ

指定したExcelファイルにシートを新規追加したい～
同じ名前のシートがあったら削除して新規追加します。

開発中は try catch なしでやらないとどこでエラーになったのかわからんので注意。

```CreateNewSheet.cs
public void CreateNewSheet()
{
	string sheetName = "新規追加したいシート名";
	string excelFilePath = (Excelファイルがあるフルパス);

	try
	{
		var book = new XLWorkbook( excelFilePath );
		var sheet = book.Worksheet( 1 );

		//シート「新規追加したいシート名」が存在している
		if (book.TryGetWorksheet( sheetName, out sheet ) == true)
		{
			book.Worksheet( sheetName ).Delete();   //削除
		}

		//シート「新規追加したいシート名」を新規追加
		book.AddWorksheet( sheetName, 1 );

		//保存
		book.Save();
	}
	catch( Exception e )
	{
		string error = "";
		error += "使用するファイルが開かれています。\n";
		error += "選択したExcelファイルを閉じてください。。\n\n";

		string title = "入力ファイルの読み込みエラー";

		MessageBox.Show( error, title, MessageBoxButtons.OK, MessageBoxIcon.Error );

		throw e;
	}
}
```
pecoでartisanとcomposerを超簡単に実行したい

内容は下記の記事のartisan/composer版です。
https://qiita.com/hogesuke_1/items/46f009f31b5f2ec8c02c

何もひねりがなくてすみません。
@hogesuke_1 さん、ありがとうございます。

# 設定方法

前提として [peco](https://github.com/peco/peco) と [jq](https://stedolan.github.io/jq/) を事前にインストールしておく必要があります。
各自の環境に合わせてインストールを行なってください。

次に下記コードを`.bash_profile`や`.bashrc`に貼り付けてください。
私は`.bashrc`に貼りました。
また、スクリプトは参考にした記事と少し異なります。

```bash:.bashrc
function arun () {
  if [ -f ./package.json ]; then
    local cmd="$(php artisan list --format=json | jq -r '.commands[].name' | peco)"
    if [ -n "$cmd" ] ; then
      php artisan "$cmd"
    fi
  else
    echo 'artisan not found' >&2
  fi
}

function crun () {
  local cmd="$(composer list --format=json | jq -r '.commands[].name' | peco)"
  if [ -n "$cmd" ] ; then
    composer "$cmd"
  fi
}
```

貼り付けたら反映をしてください。
私の場合はmacなので下記のようにしました。

```
$ source ~/.bashrc 
```

# 使い方


artisan/composerファイルがある位置に移動して`arun`または`crun`と叩くだけです。
コマンド一覧が表示されて、選択するとそのコマンドを実行します。

# まとめ

よく`composer dump-autoload`とか忘れてしまうので、便利に使わせていただいています！
応用範囲は広く、他にも使える気がします。

＊追記
よくよく考えてみると、artisanは引数やオプションを必要とする場合が多いので、あんまり役に立たないかもしれません…
Android Studio

※自分のメモ用に書いています
環境:windows10 Android Studio 3.1.2

---

今回はイベントとリスナの勉強のためのプロジェクト作成をする。
プロジェクトを作り、初めにstrings.xml内にプロジェクトで使う文字列を追記する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/ce282c02-5b09-2a8e-862b-ef6cb30dfacb.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/2188a16e-63f8-aa32-82a4-fa59aa94ab22.png)
次にメイン画面で使うものを作成するために追記する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/76332d30-305a-71c6-a3a8-f51ce00fab2b.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/2364b5ee-740f-284e-f6ea-adaf47e410b4.png)
次にボタンなどをタッチした時のリスナの設定をjava内に記述する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/64ce2aa6-68c7-6934-038b-4169a0d49787.png)
次に記入して出てきたメッセージを削除するボタンを作成する。
まずボタンで使用するテキストを用意する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/35a0d131-e35c-8717-8467-53a16e21962d.png)
次にメイン画面用のボタンの設定をする。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/98651573-6f25-b6a9-d3af-8e8eca4ca0da.png)
最後にjava内にボタンを押された時の処理をswitch文で制御する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/4e75dfa1-f139-8880-a662-dfa6be295f40.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/5a11f4e5-b8a7-9d37-afbe-0a6fecd49056.png)
結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/ca6d9901-5db0-0f27-af03-11ac0af0bc31.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/10e3f362-96eb-d4f3-775a-aaa6de2d86ae.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/5e79b1aa-b40d-52f4-b87c-b648fbd4f3f0.png)
C#でClosedXMLを使ってExcelデータを読み込むメモ

自分用メモ。

他人が作成したExcelデータを受け取ってみると予想外の書式設定が多く、すべての書式設定に対応したいとソースをいじり始めたのがはじまり。

> string value = sheet.Cell(i, j).GetString();
> string value = sheet.Cell(i, j).GetFormattedString();

GetString() だけだと数値または日付が読み込めない現象
GetFormattedString() だけだと文字列が読み込まれない現象

…が起こったので以下のようなソースにしたらなんとなくうまくいった。
読み込まれない…とは、プログラムに空欄だと認識されてしまうこと。


``` memo.cs
IXLCell cell = sheet.Cell(i, j);	//読み込みたいセルを定義
string value = "";

switch (cell.DataType)		//読み込みたいセルのデータ型で分岐
{
	case XLDataType.Number:		//数値
		value = sheet.Cell(i, j).GetFormattedString();
		break;

	case XLDataType.DateTime:	//日付
		DateTime dt = sheet.Cell(i, j).GetDateTime();
		value = dt.ToString("yyyyMMdd");
		break;

	case XLDataType.Text:		//文字列
		value = sheet.Cell(i, j).GetString();
		break;
}
```

もう数値もすべて文字列として受け取って、必要ならプログラムのほうでキャストすることにした。


2018/06/15追記
セルのデータタイプがDatetimeだったらDatetime型でとって、文字列にする処理を追加。
セル書式設定の日付が、西暦ならこれで問題ない。

が、セル書式設定の日付が和暦表示だとNumberだと認識してしまうらしい。
このNumberがシリアル値だと判断できない場合、セルの書式設定で和暦は使わないでほしいと周知しなきゃダメだなあ…
データ可視化のテクニックvol.2 - LOD

# はじめに
分析する際にデータの可視化以上に大切なことがあります. それは**データ加工**です. 例えば月別の累積の売上を出したり、利益率を出したりなどです.

今回はTableauの中で必要なデータ加工のテクニックを紹介します

# 1. LOD
これは level-of-detailの略で"詳細レベル式"と呼ばれるものです. はい、これで理解できる人はまずいないと思います、そしてTableauのマニュアルを見てもすぐ理解できる人は少ないと思います（私もさっぱりでした）. 簡単に説明したいと思います.

## LODとは
簡単に言うとTableauの標準操作ではできないデータハンドリングを使用というもので、集計をする前に集計する計算式といった具合だと思います.
この計算式の種類は3種類あります.
  FIXED   : 
  INCLUDE : 
  EXECUDE : 

それぞれの計算式のイメージを張っておきます（これが一番わかりやすいかも. まずは集計表から作成したほうがわかりやすいですよね）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/95824/a1445092-5104-26b6-e166-9eff167f1f8b.png)


順に開設していきます
### FIXED
- FIXED[カテゴリ]:MAX([売上])
    - 売上がカテゴリの中で一番大きい値を取得しています. この時年月は無視して取得しているためすべての年度でおなじ値を取得していることがわかると思います
- FIXED[サブカテゴリ]:MAX([売上])
    - 売上がサブカテゴリの中で一番大きい値を取得しています. またカテゴリは複数のサブカテゴリを持っているため、複数のサブカテゴリの中で一番大きい売上を合計(メジャーバリューの属性を見ると合計になっているのがわかるかと思います)の値を表示しています
    - またこの値も上記と同様に年度を無視しているのでどの年度も同じ値になっています

## INCLUDE
- INCLUDE[カテゴリ]:MAX([売上])
    - カテゴリの単位でMAXを計算しています. この場合はINCLUDEがない場合のMAXと結果は同じです
- INCLUDE[サブカテゴリ]:MAX([売上])
    - 年度の集計後に、サブカテゴリの単位でMAXをSUMしています. この場合は合計ではなくMEANにした方がいいですね、分析軸をカテゴリの粒度までしか設定していませんがこの式があることでサブカテゴリの最大額の平均などを計算することができます

## EXCLUDE
 - EXCLUDE[カテゴリ]:MAX([売上])
    - 分析軸の年度の範囲内でカテゴリを無視して、最大の売り上げを取得しています
 - EXCLUDE[サブカテゴリ]:MAX([売上])
    - 分析軸の年度の範囲内でサブカテゴリを無視して、最大の売り上げを取得しています. そのためカテゴリに拘束された売上の最大値を取得しています. （結果として普通のカテゴリのMAXと一致しています）


# まとめ
いかがでしたでしょうか. LOD...難しいですよね、私も理解するまで時間がかかりました. ぜひ実務の中で使いながら覚えていこうかと思います. 本当は表計算まで行きたかったのですが次回に使用と思います.
Pythonコード内の関数一覧を取得する

# 結論
以下でPythonコード(スクリプトファイル)内の関数一覧を取得できる。bashシェルなどでcat,|(パイプ),grepが使える前提。

``` shell:bash
cat target.py | grep def

```

# 経緯
他人の書いたコードを整理するときにPython自体にそんな機能無いかなぁと本気で少し探してしまった。
webpackの設定慣れないのでメモ

普段node.jsでweb開発するときにwebpackを使ってtsやらscssやらを使えるようにしているのですが、いつも他人頼みでいざ自分でやるとなるとめちゃめちゃ時間がかかってしまうので忘れないためのメモ

## やったこと

webpackを使って

* scss
* typescript

を使えるようにしました

## インストールしたモジュール

* webpack
* extract-text-webpack-plugin
* ts-loader
* style-loader
* node-sass
* postcss-loader
* webpack-cli

多分こんな感じ...足りなかったり間違ってたりしたら教えてください...

## webpackの中身

先輩が残してくださったものを引っ張ってきていらないところ削除〜ってして使いました
自分自身なんとな〜くでしか理解できていないものを載せるのは恐縮なので今回は内容は割愛。(すみません)

ちなみにディレクトリ構成は以下の感じ

```
webpack
 |- develop.config.js
 |- production.config.js
 |- style.js
 |- typescripts.js
```

## ハマったとこ

extract-text-webpack-pluginをインストールしてwebpack動かしたら

```
Error: Chunk.entrypoints: Use Chunks.groupsIterable and filter by instanceof Entrypoint instead
```

って怒られました。

[ここ](https://github.com/webpack-contrib/extract-text-webpack-plugin/issues/701)を見てみたらなんか今のバージョンがいけてない。みたいな感じのことが書いてありました。(解釈間違ってたらすみません)

`extract-text-webpack-plugin@next` をインストールしたらいけるよ、とのことだったのでこれで解決:thumbsup_tone1:

ただこれベータ版だけどいいのかな...う〜ん...

## おしまい

これで `webpack --config ./webpack/develop.config.js --watch --mode development` って実行したら無事いけました。
`--mode development` とか `--mode production` がなかったら

```
WARNING in configuration
    The 'mode' option has not been set, webpack will fallback to 'production' for this value. Set 'mode' option to 'development' or 'production' to enable defaults for each environment.
    You can also set it to 'none' to disable any default behavior. Learn more: https://webpack.js.org/concepts/mode/
```

って警告が出るので注意！


webpackのconfigファイルの中身まで説明できるくらい理解して書けるようになりたいな
ElectronでブラウザのHTTPプロキシ設定を利用する

Electronのアプリで、Web APIの呼び出しなどのためにHTTPリクエストを発行すると、外部サービスにHTTPプロキシ経由での接続のみを許している社内ネットワーク環境下では、何もしないとネットワークエラーになってしまいます。

これを回避するには、HTTPリクエストの送信時にHTTPプロキシ情報を設定する必要があります。もし[axios](https://github.com/axios/axios#request-config)などを使っているのであればリクエストのオプションに`proxy`を指定してあげることでこの指定が可能です。

```javascript
const res = await axios.request({
  method: 'GET',
  url: 'https://api.example.com/v1/resource.json',
  proxy: {
    host: 'proxy.intranet.examle.org',
    port: 8000,
  },
});
```

しかし、そもそもそのHTTPプロキシの情報をどこからとってくればいいの？という問題があります。
もちろんユーザにプロキシ設定などの環境情報を入力させるのも一つの手ですが、エンドユーザに配布するときに無用な設定を強いるのはできるだけ避けたいところです。

ユーザのPC上のOSには、すでにHTTPプロキシの接続設定は保持されているはずです。現にChromeなどのブラウザはその情報を読み取って利用しています。なので、開発したElectronアプリでもそのようにしたいところです。

今回、Electronの[Session](https://github.com/electron/electron/blob/master/docs/api/session.md)を使うことで、その設定を流用することを試みました。

以下のようにしてデフォルトのsessionオブジェクトから`resolveProxy()`を呼び出して、任意のURLに対して必要になるプロキシ設定の情報を読み取り可能です。

```javascript
const { app, session } = require('electron');

app.on('ready', () => {
  session.defaultSession.resolveProxy('https://api.example.com', (proxyInfo) => {
    console.log(proxyInfo); // => "PROXY proxy.intranet.examle.org:8000"
  });
});
```

ただし、こちらの方法では認証を必要とするプロキシサーバについては対応ができない模様です（返却されるプロキシ情報の文字列に認証情報が含まれない）。
引き続き方法について探っていきたいところです。
Swift4 IB上で色やTextFieldの高さのカスタマイズができるUISearchBarの実装

# はじめに
こんにちは:leaves:
**UISearchBar**の**TextField**の高さを変更したくなりました。

<img width="500" alt="sample.png" src="https://qiita-image-store.s3.amazonaws.com/0/128250/48f0af87-ccf8-3425-18c0-04be82044e12.png">

UITextFieldsの色などについては以下の記事があります。分かりやすくて参考になります。
ありがとうございます。

- [【iOS】UISearchBarのbackgroundカラーを変更する Qiita](https://qiita.com/nadioo/items/930f3fa6a20555e2666a)
- [[Swift] UISearchBarの背景色を変える Qiita](https://qiita.com/kaktaam/items/da52e0ebc593b4393fa5)

しかし、UISearchBarの中のUITextFieldの高さは上の記事のように`subViews`の`frame`プロパティでの変更はできなくて少し悩んだので書いてみたいと思います。
至らぬ点など多々あると思いますが、コメントなど頂けたら幸いです。

# 実装について
**UISearchBarのUITextfieldの高さは、Imageの高さと同じになる**ようで、
[setSearchFieldBackgroundImage(_:for:)](https://developer.apple.com/documentation/uikit/uisearchbar/1624307-setsearchfieldbackgroundimage)メソッドが使えるようでした。

# ソースコード
カスタムクラスとして実装してみました。クラス名などご自由に変更してください。

```CustomSearchBar.swift
import UIKit

@IBDesignable class CustomSearchBar: UISearchBar {

    var textField: UITextField {
        return self.value(forKey: "_searchField") as! UITextField
    }

    @IBInspectable var textFieldColor: UIColor = .lightGray {
        didSet { textFieldUpdate() }
    }
    
    @IBInspectable var textFieldHeight: CGFloat = 38 {
        didSet { textFieldUpdate() }
    }
    
    @IBInspectable var textFieldCornerDadius: CGFloat = 18 {
        didSet { textFieldUpdate() }
    }
    
    fileprivate func textFieldUpdate() {
        let image = UIImage.instantiate(size: CGSize(width: UIScreen.main.bounds.size.width, height: textFieldHeight), fillColor: textFieldColor, cornerRadius: textFieldCornerDadius)
        self.setSearchFieldBackgroundImage(image, for: .normal)
    }
}

extension UIImage {
    static func instantiate(size: CGSize, fillColor: UIColor, cornerRadius: CGFloat) -> UIImage? {
        let rect = CGRect(origin: CGPoint.zero, size: size)
        let path = UIBezierPath(roundedRect: rect, cornerRadius: cornerRadius)
        UIGraphicsBeginImageContextWithOptions(size, false, 0)
        fillColor.setFill()
        path.fill()
        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }
}
```

# 使い方
**StoryBoard**で変更することができます。

<img width="625" alt="screen.png" src="https://qiita-image-store.s3.amazonaws.com/0/128250/076c4957-562e-9295-b433-306269ab0599.png">

※CornerRadiusはTextFieldHeightの半分の値を指定すると、丸フチになるなど独自で設定するといいかと思います。

# 参考にさせていただいた記事
- [Can the height of the UISearchbar TextField be modified?
 Stackoverflow](https://stackoverflow.com/questions/30858969/can-the-height-of-the-uisearchbar-textfield-be-modified)
display flex とinline-blockの違いを勉強してみた

#違いを意識するようになったきっかけ
ページを作る際に、横に二つ並べたいとかいうことってありますよね。その時にinline-blockで二つ並べていたのですが、他の人のコードを見て見るとflexで並べていると気づいたことから違いが気になって調べて見ました。

#それぞれの特徴
##display: inline-blockの特徴
まず、要素の表示形式には三つ種類があります。inline要素、block要素、inline-block要素の三つです。inline-blockはinlineとblockの特徴を持ってるハイブリッドみたいな感じだと思ってます。
###横に並べるのに有効
 divタグなどのblock要素を横に並べたいときなどに使います。inlineのように横に並べていくことができます。また、inline要素とは違って、widthとheightも指定することができるので便利です。

##display: flexの特徴
display: flexは親の要素につけることで、子要素を横並びにする時などに使います。要素間のスペースなど、高さを整えるのにすごく便利です。justify-contentやalign-itemsなど便利なものがたくさんあります。

#まとめ
 自分は要素を横に並べる時に二つとも使ってみてflexの方が使いやすいと感じました。flexだと一つの要素を中央に寄せたい時などにも使えますし、flexboxでやりたいことはなんでもできるのではと感じます。
Datastoreのローカル環境を削除する方法

GAE/DataStoreで開発中に、ローカル環境のデータを全削除したくなったら、便利のオプションがあったのでメモで残しておきます。

`--clear_datastore=yes`というオプションを付けると、起動時に全削除してくれます。

実行例）
```
dev_appserver.py --clear_datastore=yes app.yaml
```

参考
https://cloud.google.com/appengine/docs/standard/python/tools/using-local-server#clearing_the_local_datastore
大学のプロキシ環境下で、プロキシを通すのに、Vimを使ってapt-get用のコンフィグを叩こうとしたら発狂したので、代用した話

#まえがき
ある日友達から、「大学のプロキシ設定通らないんだけど！！お前詳しいからわかるだろぉ！？8時間調べても分からなかったんだ！助けてくれ！！」
ということで、友人の頼みを聞き、私は研究室へと赴きました・・・
![image.png](https://qiita-image-store.s3.amazonaws.com/0/244181/e539ff18-3c55-c634-92f8-b0a355f4c30c.png)


#注意事項！
この説明はUbuntu17.10でのみ、検証したため、ほかのDebian系や、RedHat系では話が違うので注意されたし。

#方針
デフォルトでのOSインストールを試みると、プロキシが通っていないため、（GUIの通しも可能ではあるが、apt-getまでは,適用されない。GUIでの方法もおまけで書いておくことにする。）
この状態でコンフィグをたたこうとすると、Tiny-Vimで起動してしまうため、うまくプロキシを通すどころの騒ぎではなく、Vimに慣れ切ってる人にとっても以下の理由で発狂ものとなります。

* 十字キーを使うことができない（hjklでできるけども、うっかり押してしまうと、A,B,C,Dが入力される）
* 挿入モードがうまく動作せず、もとの文章を汚しかねない

![image.png](https://qiita-image-store.s3.amazonaws.com/0/244181/990d27fd-c0d9-622f-b1e3-856e2987a7fc.png)


geditをSudoから起動することで、この問題を回避しましょう。

#手順
## 端末での操作
端末を開いて、

```
sudo gedit /etc/apt/apt.conf 
```


を入力すると、geditが管理者権限で起動するため、これで晴れてシステムでのコンフィグいじりも可能となります。

# プロキシの項目の記述

```
Acquire::http::proxy "http://<プロキシアドレス>:<ポート番号>/";
Acquire::https::proxy "http://<プロキシアドレス>:<ポート番号>/";
```
新規作成されるので、上の2行を入力しましょう。こちらの記事を参考にしました。

proxy環境下の設定（ubuntu 14.04)
https://qiita.com/showsuzu/items/9ee031208d38ff8ac889

```
sudo apt-get update
sudo apt-get upgrade
```

を実行し、プロキシが通れば、アップデートなどができるはずです！

# おまけ
デスクトップ右上の電源ボタンをクリックし、
有線のアイコンをクリックすると
有線設定という欄がでてくるので、これをクリック。そうすると、ネットワークプロキシが出てくるので、
http,https,socksの項目に、それぞれ先ほど設定したアドレスとポート番号を入れましょう。

# まとめ 
Linuxの設定はGUI環境と、コンフィグの二つあることを友人は知らなかったわけですが・・・
他の大学様もLinuxはサポートしているのでしょうか・・・？よくわからない。

* Sudoで、GUIのエディタを起動させれば、解決可能だぞ！
* ちなみに、Root権限で、エクスプローラを動かせば、コピペでも同じことは可能だぞ！（sudo nautilus）


ごめん。記事にしたわ。
AWSでEC2のLoad AverageをCloudWatch metricsに追加するScript

# はじめに

AWSでEC2インスタンスを起動すると、自動的にCPUやNetwork I/O, Disk I/OなどのMetricsがCloudWatchに追加される。
しかし、実運用ではこれだけでは微妙に"かゆいところに手が届かない"ことが多い。
例えば、メモリやSWAPの使用率はパフォーマンス改善を検討する上でボトルネックを探る重要な情報な情報だし、Disk使用率を監視して枯渇を防ぐことは障害を未然に防ぐことにつながる。
これらの項目は、Amazonが提供している以下のScriptを導入することで、CloudWatchで監視することができる。

Amazon CloudWatch Monitoring Scripts for Linux
https://aws.amazon.com/jp/code/amazon-cloudwatch-monitoring-scripts-for-linux/

同様に、よく用いられる総合的な負荷の指標として、Load Averageがある。
Load Averageの概要については、Wikipediaを参照。

ワークロード
https://ja.wikipedia.org/wiki/%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%89

しかし、EC2インスタンスのLoad AverageをCloudWatchで収集する方法は、AWSのデフォルトでは用意されていないし、上記の"Amazon CloudWatch Monitoring Scripts"でも対応していない。

そのため、Load Averageを取得してCloudWatchに登録するScriptを書いてみた。

# 必要なもの
- awscli.noarch
- bc.x86_64
- IAM: `CloudWatchFullAccess`権限

# Source
以下のScriptを任意の名前で作成し、Cronで定期実行して使用する。

```CloudWatch-LoadAverage.sh
#!/bin/bash
export LANG=C
LOADAVERAGE=`uptime`
LOADAVERAGE=`echo ${LOADAVERAGE##*average: } | awk '{print $1}' | sed -e "s/\,//g"`
CORE=`grep "processor" /proc/cpuinfo | wc -l`
LA_UTIL=`echo "scale=2;$LOADAVERAGE * 100 / $CORE" | bc | sed -e "s/^\./0./"`
aws cloudwatch put-metric-data --namespace "System/Linux" --value $LA_UTIL --metric-name 'Load Average' --dimensions "InstanceId=`cat /var/tmp/aws-mon/instance-id`" --unit "Percent"
```
*(2018/6/14 不具合が発生する場合があったので少し修正)*

Load Averageは、そのマシンが使用できるCPU Core数によって性能限界時の最大値が違う。
例えば、1 Coreのマシンであれば1.00が性能限界だし、96個のvCPUを積んでいるm5.24xlargeであれば96.00が性能限界ということになる。
なので、このScriptではLoad AverageをCPU Core数で割った%にすることで、負荷状況を直感的に理解したり、異なるインスタンスタイプ間でも容易に比較できるようにした。
また、他のMetricsとの比較を容易にするため、上記の `Amazon CloudWatch Monitoring Scripts`と併せて使用することを想定している。

これまでのMetricsと併せて分析・使用することで、例えばAuto ScalingのTrigger pointを設定したり、負荷テストなどで最適なインスタンスの選定をしたり、Scalabilityの設計をする上で役立つのではないだろうか?
Linux ユーザ作成＆鍵作成シェルスクリプト

#　Linux ユーザ作成＆鍵作成シェルスクリプト

毎回ユーザ作って、鍵設定してってのは面倒だったのでスクリプトを作成しました。
Ubuntu16 CentOS6,7で動作しているのは確認済み

鍵のパスフレーズなし、ユーザのパスワードも無しなので、SSH設定で鍵認証のみにする事をお勧めします。

```
#!/usr/bin/env /bash
set -eu
TODAY=`date "+%Y%m%d_%H-%M-%S"`
HOSTNAME=`hostname -s`
CURDIR=`dirname $0`
if [ -e ${CIRDIR}/log ]; then
    mkdir -p ${CIRDIR}/log
fi
echo "${TODAY} : user :$1 ">> ${CURDIR}/log/adduser.log

if [ "`cat /etc/passwd | grep ${1}`" = "" ]; then
    echo "## useradd $1"
    useradd $1
else
    echo "## user $1 already exists. skip useradd"
fi
if [ "`cat /etc/passwd | grep ${1} | awk -F: '{print $7}'`" = "" ]; then
    echo "## setting loginshell"
    sed -i '/'${1}':x:/ s/$/\/bin\/bash/' /etc/passwd
else
    echo "## already loginshell setting. skip"
fi

mkdir -p /home/${1}/.ssh
chmod 700 /home/${1}/.ssh
if [ -f /home/$1/.ssh/${HOSTNAME}-$1 ]; then
    echo "## ssh key already exists"
else
    echo "## ssh key generate"
    ssh-keygen -f /home/${1}/.ssh/${HOSTNAME}-${1} -t rsa -N ""
    sed -i 's/root/'${1}'/' /home/${1}/.ssh/${HOSTNAME}-${1}.pub
    cat /home/${1}/.ssh/${HOSTNAME}-${1}.pub >>/home/${1}/.ssh/authorized_keys
fi
chown -R ${1}.${1} /home/${1}
cp -p /home/${1}/.ssh/${HOSTNAME}-${1} ${CURDIR}/log/

echo "## display $1 privatekey"
cat /home/${1}/.ssh/${HOSTNAME}-${1}

```
9年前にデザインされた管理画面フォームを改善してみる


##　概要

社内システムの管理画面のフォームをどうデザインすべきか。
9年前に作られた社内システムの改修作業が舞い込んできたので、まずは管理画面で大量生産するフォームについてググりながら改善案を作ってみました。

※本物をのせると色々角が立つので、大まかなデザインだけ作ってます。ご容赦をば。

#### 既存システムのフォーム

![form_demo1.png](https://qiita-image-store.s3.amazonaws.com/0/184721/412d4f53-e95e-4136-900a-0108b71fcfab.png "form_demo1.png")



#### 改善案

![form_demo2.png](https://qiita-image-store.s3.amazonaws.com/0/184721/bfaad052-2002-ff6e-4f0d-dbdab63ce1f2.png "form_demo2.png")



## よいフォームとは

今回参考にしたのは、[こちらの記事](https://popinsight.jp/blog/?p=4113#i)。
以下の15個のルールを元に考えてみました。

```
1.フォームは縦一列配置にする
2.ラベルは入力データの上に配置する
3.ラベルと入力データはグループ化する
4.すべて大文字での表記は避ける
5.6項目以下の選択肢はすべて表示する
6.プレースホルダテキストをラベルとして使わない
7.チェックボックスとラジオボタンを縦に配列する
8.CTAに説明を加える
9.エラー表示はインラインで
10.入力途中でのリアルタイムアラート（バリデーション）は使わない
11.基本的なヘルプテキストを表示する
12.現在のアクションと次のアクションをわける
13.入力フォームの幅を適切に
14.*ではなく任意表示を設ける
15.関連情報ごとにグループ化を
```

既存システムでできてなさそうなのは、

```
1.フォームは縦一列配置にする
2.ラベルは入力データの上に配置する
7.チェックボックスとラジオボタンを縦に配列する
8.CTAに説明を加える
9.エラー表示はインラインで
11.基本的なヘルプテキストを表示する
13.入力フォームの幅を適切に
```

↑の7個のルールを意識しながら改善してきます。

## 改善してみた

出来上がったのがこちら。

![form_demo2_text.png](https://qiita-image-store.s3.amazonaws.com/0/184721/d7605810-bd0b-60a2-d071-902dfc480c56.png "form_demo2_text.png")


不必要と判断した項目はなくし、項目数も減っています。
ヘルプは、あんまり付けたくないナーと思ったので、必要そうなとこだけ付けました。

あと悩んでいるのは、
会社登録したあとに行うであろうことへの動線をつけようか、つけまいかという点。

保存ボタンの横に「○○に進む」みたいなボタンがあって、
それを押すと、保存と同時に、次のフローに進めたら便利だなと。

## 雑感

toC向けシステムだと、これらのルールに加えて離脱率低下の施策を考えないといけないそう。

自分の場合、仕事で使う管理画面だから離脱=仕事放棄になるから、そこらへん考えなくていいかな。
いや、本当は考えたほうがいいんだろういや、そこらへんはスケジュールと戦いながら頑張る。
画像のアップの方法(メモ)

今回は画像アップの仕方について、書いていきます。
ほぼrails tutorialまんまですので、気になった方は下記を見ましょう。
https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-micropost_images

# 全体の流れ
1.Gemの導入 (gem 'carrierwave')
2.uploaderの作成
3.Modelにおける :pictureプロパティの作成
4.uplaoderとModelの紐付け (mount_uploaderメソッド)
5.form作成 (file_field)
6.表示方法  (image_tagヘルパー)

全体の流れは以上です。簡単ですね。

では見ていきます。
1.Gemの導入

```ruby:Gemfile
gem 'carrierwave',             '1.2.2'
gem 'mini_magick',             '4.7.0'

group :production do
  gem 'fog', '1.42'
```

基本はcarrierwaveだけで良いのですが、validationやresizeなどをしたい方は残り２つもインストールしておきましょう。便利です。(今回では触れませんが)
bundle installしちゃってください。

2.uploaderの作成

rails g uploader Picture 

これでUploaderが作成されます。
app/uploaders/picture_uploader.rbというやつです。

3.Modelにおける :pictureプロパティの作成
これは知っていると思います。

今回はPostモデルにpicure属性を追加します。

rails generate migration add_picture_to_posts picture:string

上記でmigrationファイルを作成。add_"属性名"_to_"モデル"s で覚えましょう。

rails db:migrateしちゃってください。

4.uploaderとModelの紐付け (mount_uploaderメソッド)

```ruby:post.rb
mount_uploader :picture, PictureUploader
```

モデルに上記を追加して両者を紐付けます。
ここでseverの再起動をしないとエラーが起きる時があります。

5.form作成 (file_field)

これは普通ですね。省略します。
 <%= f.file_field :picture %>

これでfile_fieldが表れます。そして,:pictureに格納されます。

6.表示方法  (image_tagヘルパー)

Controllerでformからデータを受け取り、DBに保存した後の表示方法。
これはimage_tagヘルパーを使います。

 <%= image_tag post.picture.url %>

これでOKです。
image_tag(画像ファイルへのパス, [, (オプション or HTMLオプション)])

<%= image_tag post.picture.url if post.picture %>
こうした方が少し親切ですね。

以上で終わりです。
ありがとうございました。
HoloLensアプリをローカルで配布する方法（RS4用）

先日HoloLensのWindows 10 April 2018 Update (RS4)がリリースされました。

リリースノートはコチラ
https://docs.microsoft.com/en-us/windows/mixed-reality/release-notes

RS4から一気にデバイスポータルのレイアウトが変更されました。
RS4にするとHoloLensは工場出荷状態に戻り全ての設定が初期化されます。
今まで作成したアプリを再度インストールするのに、今までとは違う部分からインストールするようになったのでその備忘録です。

# アプリパッケージ作成
アプリパッケージの作成はコチラの記事に詳しく書かれています。
本記事はアプリパッケージ作成後の話です。
https://m2wasabi.hatenablog.com/entry/2017/03/04/160356

# デバイスポータル
HoloLensのデバイスポータルを開きます。
ViewsのAppsをクリックしてAddボタンをクリックします。

![wk110.jpg](https://qiita-image-store.s3.amazonaws.com/0/154355/fd4cc5a9-3e4d-3f6e-b016-9281d1f32f43.jpeg)

Addボタン押下するとポップアップが表示されますので、
先程作成したアプリパッケージファイルappxbundleをドラッグアンドドロップします。
最後にNextボタンをクリックするとHoloLensにインストールされます。

![wk111.jpg](https://qiita-image-store.s3.amazonaws.com/0/154355/5a163e61-d6ef-ad80-c9cf-3823927fbc2f.jpeg)

#RS4の感想
空間認識の更新速度が大幅にアップしている印象を受けました。
それ以外に全体的な操作がキビキビと動いている感じです。
やはり両手操作も助かりますね。

システム化のご検討やご相談は弊社までお問い合わせください。
https://i-enter.co.jp/contact/