OmniAICreator/Qiita-1.07M huggingface dataset:
readxlでe-statのExcelデータを読んでみる

e-statの政府統計のexcelデータって、無駄な全角空白とか、セルの結合ゴリゴリとか、Rで食べさせるにはどうしても一旦Excelで整形しないとダメだと思っていて敬遠してたけど、readxlが思いのほかパワフルに読み込んでくれるので楽しくなってきたので、メモ。
APIで抜くほどでもないけど、Excelで整形するのは面倒なときなどに。

# 方針
readxlは、とりあえず空白を含んでいようがセルが結合されていようが読み込んでくれるので、読み込み段階では工夫せず。

- とりあえず読み込み
- 必要なところを切り出して整形。
下記の３つで分けて切り出すのは、行・列ラベルなどは、無駄な全角空白・セルの結合ゴリゴリなどを、それぞれ個別でやっつける方が楽な気がするので。
    - 行ラベル
    - 列ラベル
    - データ
- ひっつけて縦持ちにしたりなど
- ここまでくればあとはよしなに

# やってみる
ためしに、[学校基本調査の平成２９年度の卒業後の状況調査](https://www.e-stat.go.jp/stat-search/files?page=1&layout=datalist&tstat=000001011528&cycle=0&tclass1=000001110643&tclass2=000001110730&tclass3=000001110738&tclass4=000001110740&second2=1)の「産業別　就職者数」のデータで大卒の子でどの学科の子がどんな職業についているか？などをお題に。

## とりあえず読み込み
```r
# 何はともあれライブラリ読み込み
library("tidyverse")
library("readxl")

# 落としてきたファイルは適当なところに
working_dir ="C:/R/sample"  # 作業ディレクトリ名
input_file  ="./data/学校基本調査/076.xlsx"  # 読み込むファイル名
setwd(working_dir)

# なにはともあれ読み込む
input_data <- read_excel(input_file,trim_ws=T,sheet=1)
```
## 必要なところを切り出して整形
読み込んだデータ見てみるとこんな感じ。セルの結合とかはないけど、列名に無駄な空白など、、
![data](https://i.gyazo.com/d0ae0b119023a51090cc4b67f741bd1b.png)
経年で複数ファイルあって繰り返し読み込みとかしないのであれば、
抜き方を考えるのに時間をかけるくらいなら、場所決め打ちでもいいと思う。

```R
# 切り出すデータの範囲を決め打ち
cut_row <- 6:25
cut_col <- 5:15

# データ部分を切り出す
tmp_data <- input_data[cut_row, cut_col]
# 行名部分を切り出す
tmp_row <- input_data[cut_row, 1]
# 列名部分を切り出す
tmp_col <- input_data[3, cut_col]

# 列名・行名で整形が必要なものがあれば整形
# 今回は行名は整形不要、列名は無駄にスペースが入っているので適当に消す
tmp_col <- str_replace_all(tmp_col,"[　\\s]","")

# ひっつける時に備えて列名はつけておく
colnames(tmp_data) <- tmp_col
colnames(tmp_row) <- "職種"
```
列名は日本語か英語か？
昔はソースに日本語が混じるので、列名は基本英語だよねーと思っていたけど、
ほかの人が読んだり、後々の可読性を考えたり、これって英語でなんて言うんだっけ？などを考えたら、とりあえず動くのであれば日本語でもいいんじゃないかなと思う最近。英語にするなら切り出さずにつけてあげる。

## ひっつけて縦持ちにしたりなど
行名部分にデータ部分をひっつける。

```r
# つないで、縦持ちにして、数値データに
output_data <- tmp_row %>%  # 行名部分に
	bind_cols(tmp_data) %>%  # データをひっつけて
	gather(key=学科,value=人数,-職種) %>% # 縦持ちにして
	mutate(人数=as.numeric(人数)) # 数値が文字列なので数値に
```
（データ的に）readxlで読むと数値が文字列になることが多いけど、読み込んだ時がんばらずに、縦持ちにしたときに一括で数値にする方が楽。

## よしなに可視化など
それぞれの職種の入社する学生の学部の構成比など

```r
# グラフ用にデータ整形
tmp <- output_data %>% 
	group_by(職種) %>%   # 職種でしばって
	mutate(割合=人数/sum(人数)*100) # 割合を出す

# グラフで可視化
tmp %>% ggplot(aes(x=学科,y=割合)) +  # 横軸は学科で、縦軸は割合にしよう
	geom_col(aes(fill=学科)) +  # とりあえず棒グラフで、学科で塗り分けよう
	geom_text(aes(label=round(割合,0)))+ # 割合の数も入れておこう
	theme(axis.text.x = element_text(angle = 90))+ # 学科名は重なるので縦にして、
	facet_wrap(~職種) # 職種別にグラフを分けよう。
```
こんな感じ
![グラフ](https://i.gyazo.com/131dfcd1c8c4cd7e854f83d10a09c217.png)
【備忘録】クラウドサーバーを使ってみる(2)--Alibaba Cloud でLaravelを導入する



開発環境：
クラウドサーバー：Alibaba Cloud （Centos７＋Apache+php7+Mysql5.7+Laravel5.4）
ローカル：MacOS


##1.ローカル環境でLaravelプロジェクトを作成する
```
# composer create-project laravel/laravel testLaravel "5.4.*"
```
 その後、githubにソースファイルを置く。
```.gitignore```ファイルに

```
/node_modules
/public/hot
/public/storage
/storage/*.key
/vendor
/.idea
/.vagrant
Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
.env
```
があるので、クラウドサーバーにgit cloneでソースを取得後、クラウドサーバーに```node_modules``` ```vendor``` ```.env```をもう一度作成する必要があります。

##2.クラウドサーバーにgit clone でソースを取得し、composerをインストールする

```
# cd /var/www/html
# git clone https://xxxxxx

//cloneされたファイルに入る
# cd testLaravel 
# composer install

//vendorが生成される
# ls -a

```

##3.Apacheに関する設定

`httpd.conf`を開いていくつか確認すべき項目があります。
こちらは他人の設定に参考して変更されるもので、必要に応じて変更してください。



```
vi /etc/httpd/conf/httpd.conf 
```

以下の項目がありましたら、矢印の右の設定に変更しよう。

```
//CGI及びSSIが許される
Options Indexes FollowSymLinks->Options Includes ExecCGI FollowSymLinks

//.pl拡張子のスクリプトが許される
AddHandler cgi-script .cgi->AddHandler cgi-script .cgi .pl

//必ず変更してくだい
AllowOverride None->AllowOverride All 

//ディレクトリツリーを表示させないように
Options Indexes MultiViews->Indexesを削除してください

//トップページのファイルを設置する（必要に応じて）
DirectoryIndex index.html index.html.var->DirectoryIndex index.html index.htm Default.html Default.htm index.php Default.php index.html.var


KeepAlive Off->KeepAlive On

//これは必要に応じて
MaxKeepAliveRequests 100->MaxKeepAliveRequests 1000 
```



##4.Laravelの設定を補完する
[Laravelドキュメント](https://readouble.com/laravel/5.4/ja/installation.html)を見ると、いくつかの設定項目があります
1.Laravelをインストールした後に、多少のパーミッションの設定が必要です。storage下とbootstrap/cacheディレクトリをWebサーバから書き込み可能にしてください。

ディレクトリパーミッションをみる

```
# ls -l testLaravel
# ls -l bootstrap
```
ファイルパーミッションを変更する

```
# chmod -R 707 bootstrap/cache
# chmod -R 707 storage
```



2."次にインストール後に行うべきなのは、アプリケーションキーにランダムな文字列を設定することです。ComposerかLaravelインストーラを使ってインストールしていれば、php artisan key:generateコマンドにより、既に設定されています。

通常、この文字列は３２文字にすべきです。キーは.env環境ファイルに設定されます。もし、.env.exampleファイルをまだ.envにリネームしていなければ、今すぐ行ってください。"

まず、クラウドサーバーのソースディレクトリに.envファイルを作成する

```
# touch .env
```
ローカルファイルの.env.exampleを開いて、内容を先新しく作成された.envファイルにコピーして保存。
次に、アプリケーションキーを生成する

```
# php artisan key:generate
```

以上で完了で、サーバーをおう一度起動する

```
# service httpd restart
```


`http://あなたのIPアドレス/testLaravel/public/`を入力して訪問する。

##APPENIDX：エラー対策：
1.Apacheのエラーログを見る

```
# vi /etc/httpd/logs/error_log 
```

2.画面が真っ白、エラーメッセージが表示されない:
`config/app.php`のdebugをtrue に

```
'debug' => env('APP_DEBUG', true),
```
M5Stack MicroPython API調査記録 RTC編

※ 2018年3月2日現在

~~本家MicroPythonのESP32版ではまだESP8266版にあるようなmachine.RTCクラスが実装されていませんが、M5Stack版では実装されています。~~

M5Stack版はPycom版のAPI仕様がベースになっているようで、NTPによる時刻同期ができます。また、ピン入力でディープスリープから起こす設定のAPIが拡張されています。

# クラス machine.RTC

リアルタイムクロックのためのクラス。

```python3
from machine import RTC

rtc = RTC()
rtc.init((2018, 1, 7, 23, 13, 0, 0, 0))
print(rtc.now())
```

## コンストラクタ

### class machine.RTC()

RTCオブジェクトを作成する。

```python3
from machine import RTC

rtc = RTC()
```

## メソッド

### rtc.init(datetime)

RTCを指定した日時 *datetime* で初期化する。

*datetime* - RTCに設定する現在日時。次の形式のタプルで指定する: (year, month, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]])

tzinfo は指定しても無視される。したがって日時は標準時で与えること。

### rtc.now()

現在日時をローカルタイムで返す。返す形式は次の形式のタプル: (year, month, day, hour, minute, second, microsecond)

~~ローカルタイムは現状、常に UTC+8 になってしまう。~~


### rtc.ntp_sync(server, update_period=3600, tz=CST-8)

NTP (SNTP)を使って時刻同期を行う。

*server* -  NTP サーバ

*update_period* - 更新間隔(秒)。最小間隔は60秒

*tz* - タイムゾーン。日本時間の場合は 'JST-9' を指定しておけばよい。

```python3
rtc.ntp_sync('ntp.nict.jp', tz='JST-9')
```

※時刻同期できていなくても時刻を更新してしまうのはいまいち。

### rtc.synced()

直前の ntp_sync() による時刻同期が完了していれば True を返す。

```python3
rtc.ntp_sync('ntp.nict.jp')
for _ in range(100):
    if rtc.synced():
       break
```

### rtc.wake_on_ext0(pin=None, level=False)

ピンからのデジタル入力でディープスリープから起こす設定を行う。

*pin* - デジタル入力に設定した machine.Pin オブジェクト

*level* - デジタル入力の False/True どちらに反応するかを指定

```python3
# ボタンCを押したらディープスリープから起きるようにする
rtc.wake_on_ext0(machine.Pin(37, machine.Pin.IN), False)

# 60秒間のディープスループに入る
machine.deepsleep(60000)
```

### rtc.wake_on_ext1(pins=None, level=False)

複数ピンからのデジタル入力でディープスリープから起こす設定を行う。

*pins* - デジタル入力に設定した machine.Pin オブジェクトのリスト

*level* - デジタル入力の False/True どちらに反応するかを指定
リビングのnetatmo weather stationのデータをMacに喋らせてみた

寒波の到来でお布団から抜け出せなくなってきましたね。正月なので書き初めとして、毎朝枕元のMacからリビングの温度を喋らせて、布団から抜けるための決意を挫くためのコードを書きました。

[hidekingerz/netatmo](https://github.com/hidekingerz/netatmo)
<img width="401" alt="cap01.png" src="https://qiita-image-store.s3.amazonaws.com/0/125552/299502ff-8329-e5da-9ab5-ce6e7086af45.png">

温度を確認後、別途用意してあるhomekit経由irkitを操作すれば「Hey Siri。暖房をつけて」でリビングのエアコンが稼働し、部屋を温めることができます。

# netatmo connectのAPIの使い方
## 処理フロー
1. Netatmo Connectでアプリを登録する
1. Client idとClient secretを取得する
1. Client idとClient secretとユーザ認証を利用してアクセストークンを取得
1. アクセストークンを利用してデータを取得する

## ClientIDとClient Secretの取得
<img width="1131" alt="Netatmo_Connect02.png" src="https://qiita-image-store.s3.amazonaws.com/0/125552/faaf9f03-d5d5-f3c5-a587-3eb1e6ee5f5d.png">

## アクセストークンを取得して、Getstationsdataにアクセスする

[サンプルコード](https://dev.netatmo.com/en-US/resources/technical/samplessdks/codesamples)を参考にアクセストークンを取得すれば良いです。
自分しか使用しないので、ユーザー情報も使用するClient Credentials Authenticationの方を採用しています。

[API GUIDE](https://dev.netatmo.com/en-US/resources/technical/reference/weatherstation/getstationsdata)ではフォームに引数を書いて送信するとJSONが帰ってくるテストフォームがあるので、試す際は便利ですね。
特にデバイスが1台のみの場合は不要かもしれませんが、引数にMacアドレスを指定することで該当機器のデータのみ値が返ってくるようになるようです。

# Macに喋らせる
sayコマンドで実行すれば良いので、pythonのsubprocessモジュールでコマンドを実行しています。
なお、度にすると「たび」と発音するようなのでひらがなで「ど」と指定しています。
Remove SwiftLint's warnings for Pods

SwiftLint scans all of the files in your workspace, including the Pods folder. It would be a huge problem since quite a few pods following the rule of the Linter. 

Fortunately, we are able to silent those warnings in the pods.

First, add .swiftlint.yml to your project folder

```shell
touch .swiftlint.yml
```

Then, add the following code to the .swiftlint.yml file. The linter will ignore those folders the next time.

```shell
excluded: 
  - Pods
```

Done! :)
Unity備忘録、STG制作１:画面サイズの検討

※この記事は2年前くらい(2016年)に、当時在籍していた某社内で投稿したものの、誰一人として活用する人間がいなかったため、記事を全部引き上げ、個人的に再掲載してみることにしました。著作権を会社に渡した覚えは無いし、そんな規約も無かったので、まあ大丈夫でしょう。

UnityのVersion：5.3.5f1

#背景
以前に個人製作でWEBブラウザ上で遊べるシューティングゲーム（以下、縦シューとする）を作成したが、これをスマホに移植したいと思っている。

作品公開URL：
http://unitygameuploader.jpn.org/game/5899.html
※当時(Unity4.6)はWebPlayer形式で作成したが、Unity5.4以降ではWebPlayerは非対応となった（確かセキュリティ脆弱性という理由で）。ブラウザによっては動作しないので注意です（少なくともIE11では動作する。Google Cromeでは動作しない）。

というわけで、スマホに移植する上でのHow Toを記載していく。
今回は画面サイズ設定を中心に記載する。

#画面サイズの設定
初期設定だとアスペクト比しか項目がない。
![img01.png](https://qiita-image-store.s3.amazonaws.com/0/162164/b84bae33-ec9b-d3fd-acc5-5b4d4d649887.png)

Build Settingでターゲット機器（今回はスマホなのでAndroid）を選択してSwitch Platformする。
![img02.png](https://qiita-image-store.s3.amazonaws.com/0/162164/1e1a8179-6d46-f742-0ea6-b56367117939.png)

Androidにすることで、Android用の画面設定ができるようになった。今回は縦シューなのでWXGA Portrait(800x1280)にする。
※解像度で選択できるようになったが、実際にはこれもアスペクト比設定である。
![img03.png](https://qiita-image-store.s3.amazonaws.com/0/162164/0e8d0088-c4c5-66b9-a7cc-efaa7fcc71ca.png)

#カメラの設定
今回はこの64x64の画像を表示させる。
![img07.png](https://qiita-image-store.s3.amazonaws.com/0/162164/acf8e5bd-6ac9-60cd-3e36-edc4080ca8bd.png)


何も考えずに画像を登録して表示させようとすると、こんなことになるでしょう。
![img04.png](https://qiita-image-store.s3.amazonaws.com/0/162164/3c6a5971-36e6-16e2-3458-528ffa7ea585.png)

所々で画素が欠けていたり、縮尺がおかしいのが分かります。これはカメラ設定が画面解像度と一致してないからです。

参考サイト:
http://megamin.jp/?p=1430

さて、想定する画面はWXGA Portrait(800x1280)ですが、2Dゲームでこの解像度のゲームを作ろうとすると、画像データサイズがとんでもないことになってしまいます。
上記URLを参考に、
　・64×64 のスプライトを 400×640 の解像度に見立てたスクリーンに描画する
　・実際の解像度は 800×1280 とする
と定義し、半分の解像度で画面作成することにします。
つまり64×64 の画像が横に6.25個、縦に10個描画できるようにします。

まず登録画像については以下の通りに設定します。
![img05.png](https://qiita-image-store.s3.amazonaws.com/0/162164/3cde2263-7719-d5b6-6208-2a836a532b3b.png)
Pixels Per Unit = 64 は、1メートルあたり64ピクセルという意味です。
Unityでは1メートルは座標1つ分の扱いとなります。

カメラ設定は下記画像の赤枠の通りにします。
![img06.png](https://qiita-image-store.s3.amazonaws.com/0/162164/0a9f62cb-b6ed-4046-e990-ab77fced3ef9.png)
Size = 5 という設定は、縦方向が10メートルという意味になります。

以上の設定で、画面の縦方向に64x64の画像が10個まで並べられるようになったはずです。

#動作確認
PC上ではこんな感じになります（一部のみ抜粋）。
前よりはましになったが、まだ画素が欠けて見えるのは今回使用しているPC上ではWXGA Portrait(800x1280)を表現できないので、画面そのものが縮小されているためです。
(※画像紛失しました^^;)

で、こちらがスマホの画面（原寸大）。バッチリですね。
![img08.png](https://qiita-image-store.s3.amazonaws.com/0/162164/f9a6d95b-3acf-0bba-10cd-25337ee8e4ea.png)

以上
[Swift4] 地域に関わらず、日本時刻を取得する方法

# すること
端末の地域設定に関わらず、日本の現在時刻を表示する

# コード

```swift
let date = Date()

let format = DateFormatter()
format.dateFormat = "yyyy-MM-dd HH:mm"
format.timeZone   = TimeZone(identifier: "Asia/Tokyo")

print( "現在時刻： ", format.string(from: date) )
```

# 参考
[公式ドキュメント「DateFormatter」](https://developer.apple.com/documentation/foundation/dateformatter)
node.js VSCode実行時などでもスクリプトパスを取得する方法

少しはまったのでメモしておきます。
環境はWindowsですが、他のOSでも同じかもしれません。

```js:path.js
var path = require('path');
var filePath = process.cwd();
filePath = path.resolve(filePath, './path.js');
console.log(filePath);
```

これを、コマンド

```
> node path.js
```
で、実行すると、正しいパスが得られるのですが、VSCode のF5キーで実行すると、カレントディレクトリが、ホームディレクトリになる様子で、正しいパスになりませんでした。

次のようにすると、実行しているスクリプトファイルのパスが正しく得られます。

```js:path.js
var path = require('path');
var filePath = process.argv[1];
console.log(filePath);
```

また、```path.dirname(filePath);``` で、親ディレクトリのパスが得られます。

さらには、```__dirname ``` には、スクリプトファイルのあるパスが入っています。

# 参考
node.js で絶対パスや相対パスを取得する方法 npm __dirname · GitHub
https://gist.github.com/uupaa/da42698d6b2d2cbb3cca
Excel2010以降 クイックアクセスツールバーのオススメ配置

Excel2010以降は、リボンをカスタマイズできるようになって、非常に便利です。リボンのほかにクイックアクセスツールバーもカスタマイズできるわけですが、クイックアクセスツールバーには以下のような性質のものを配置すると良いでしょう。


●非常に良く使うコマンドで、いまいち使いやすいショートカットキーがないもの。ショートカットキーが簡単でも、気分によりマウス操作で実行することが多いコマンド。
●コマンドとかでなくても、いつも見えるようにしておきたい情報。フォント色とか。あと、計算方法が手動になってるとかいうのは、注意しとかないと見逃すので、これも入れておく。
●ボタンを図だけで見ても何の機能なのか分かりにくいものは、クイックアクセスツールバーではなくてオリジナルのリボンに配置する。オススメのリボンカスタマイズもいずれ書こうと思います。
●クイックアクセスツールバーの左から１番目はAlt+1、左から2番目はAlt+2・・・とショートカットキーを割り当てられるので、左端の方には重要なものを配置する。


クイックアクセスツールバーの配置のやり方は
http://www4.synapse.ne.jp/yone/excel2010/excel2010_quick.html
のページに譲るとして、私のオススメ配置を書こうと思います。
図に振った番号に対応させて、ツールバーの説明を書いていきます。Excel2016のツールバーで、どうも見づらい気がします。

![ツールバー01.png](https://qiita-image-store.s3.amazonaws.com/0/229452/82149543-3dc2-7ff3-063a-5e37e5fc34a2.png)

![ツールバー02.png](https://qiita-image-store.s3.amazonaws.com/0/229452/bc09a156-da09-735a-8a79-25fc20333b2e.png)



(01)ウインドウ枠の固定 ・・・ 押すと選択肢が分岐するやつもありますが、分岐しない方で。
(02)値の貼り付け ・・・ 超使いまくるコマンドなのに、これにボタン一発のショートカットキーがないのはなぜだ。
(03)数式の貼り付け
(04)書式の貼り付け
(05)リンク貼り付け ・・・ 例えばA1セルをコピーしてリンク貼り付けすると「=＄A＄1」という絶対参照式が入ります。A1～B3セルをコピーしてリンク貼り付けすると「=A1:B3」という相対参照式が入ります。実はかなり役立つコマンドです。
(06)リンクされた図として貼り付け ・・・ コピーしたセル範囲を、図として貼り付け、そのセル範囲へのリンクも貼られます。
(07)参照元のトレース ・・・ セルの数式がどこのセルを参照しているか。
(08)参照先のトレース ・・・ セルがどこのセルから計算式を使って参照されているか。
(09)中央揃え ・・・ これもよく使うのにいまいち有効なショートカットキーがない
(10)塗りつぶしの色 ・・・ セルや図形の色を、これですぐ変えたい。
(11)フォント ・・・ 明朝体とかゴシック体とか。この情報はいつも視界に入れておきたい。
(12)フォントの色 ・・・ 文字の色もいつも視界に入れておきたい。
(13)フォントサイズ ・・・ 文字のサイズもいつも視界に入れておきたい。
(14)拡大/縮小 ・・・ 印刷倍率が○○%という情報。いつも視界に入れておきたい。
(15)セルの結合
(16)セルを結合して中央揃え
(17)横方向に結合 ・・・ これは知らない人が多いのでは。
(18)セル結合の解除
(19)上書き保存 ・・・ Ctrl+sで楽勝だけど、気分的にマウスでやりたいことが多い。
(20)印刷プレビューと印刷 ・・・ Ctrl+pで楽勝だけど、気分的にマウスでやりたいことが多い。
(21)オートフィルター ・・・ Ctrl+Shift+Lでもできる。
(22)すべてのフィルターをクリア ・・・ オートフィルターで絞り込まれた状態を一気に解除するのに使う。
(23)オブジェクトの選択 ・・・ 図形とかを選択するのにこのボタンは必須。
(24)枠線の表示 ・・・ セルの枠線を表示するかどうか。
(25)コマンドボタン(ActiveXコントロール) ・・・ マクロの実行ボタンとして頻繁に使います。
(26)すべて更新 ・・・ 押すと選択肢が分岐するやつもありますが、分岐しない方で。ピボットの全更新とかで使います。
(27)トリミングツール ・・・ 図形のトリミングはしょっちゅうやります。
(28)自動 ・・・ 計算方法が自動になっているとき、チェックボックスがONになる。
(29)手動 ・・・ 計算方法が手動になっているとき、チェックボックスがONになる。
(30)図形 ・・・ 図形(オートシェイプ)を一覧から選ぶボタンです。
Mac High SierraでEDINET「XBRLからCSVへの変換ツール」を動かす

## 始めに
企業の財務分析をするにあたって、EDINETで公開されているXBRLはいい情報ですが、データ構造が複雑ですぐに使うことができません。
EDINETでは、XBRLをCSVに変換するツールを公開しているのですが、Javaのjnlpファイルで、最新のMac OSではセキュリティチェックが厳しく、そのままでは動かすことができません。
これを動かすためにした対応手順を備忘録として記載しておきます。

## 証明書のダウンロード
[アプリケーション認証局２](http://www.gpki.go.jp/apca2/index.html)のサイトで、「アプリケーション認証局２(Root)の自己署名証明書」をダウンロードします。

## Javaコントロールパネルのオープン
Macのシステムメニューから「システム環境設定」を選択し、画面下にある「Java」を選択します。
パネル上で、「セキュリティ」タブをクリックし、下記画面を表示します。

![スクリーンショット 2018-01-07 21.43.10.png](https://qiita-image-store.s3.amazonaws.com/0/206130/ccba12fc-16b2-c212-b899-a022f0987034.png)

##  証明書のインポート
画面右下の「証明書の管理」ボタンをクリックします


次の画面で「インポート」ボタンをクリックします。
![スクリーンショット 2018-01-07 22.21.10.png](https://qiita-image-store.s3.amazonaws.com/0/206130/4b2a148f-d113-b2e4-ec21-2a91ba99a7c8.png)


「ファイル形式」のドロップダウンを「すべてのファイル」に変更し、先ほどダウンロードした「APCA2Root.der」ファイルを選択します。

![スクリーンショット 2018-01-07 21.43.46.png](https://qiita-image-store.s3.amazonaws.com/0/206130/011dd55c-7d42-ee8e-eeb9-d438d0bec644.png)

下図のように「ApplicationCA2 Root」が増えているはずなので、それを確認した上で「閉じる」

![スクリーンショット 2018-01-07 22.25.21.png](https://qiita-image-store.s3.amazonaws.com/0/206130/ff5c374b-96f8-ca30-34f9-5b82d7f10a0a.png)

## サイト・リストの追加
Javaコントロールパネルの画面に戻ったら、今度は「サイトリストの編集」ボタンをクリックします。
下の画面が表示されたら「追加」ボタンをクリックし、"https://disclosure.edinet-fsa.go.jp:443" を追加して、「OK」ボタンで抜けます。

![スクリーンショット 2018-01-07 21.45.53.png](https://qiita-image-store.s3.amazonaws.com/0/206130/e683630e-4e29-13e8-30d2-f88742b14906.png)

## アプリケーションの起動
以上の準備で、EDINETのサイトからダウンロードした XBRLtoCSVTool.jnlp が起動できるようになったはずです。
JNLPファイルをダブルクリックすると以下の画面が表示されるので、「続行」を選択します。

![スクリーンショット 2018-01-07 22.32.20.png](https://qiita-image-store.s3.amazonaws.com/0/206130/f5c922ba-8566-76c8-7450-c361fed5e519.png)

うまくいくと、次のような画面が表示されるはずです。
ここから先の使い方は公式ガイドに従って下さい。

![スクリーンショット 2018-01-08 10.11.56.png](https://qiita-image-store.s3.amazonaws.com/0/206130/ede902ed-a471-50fa-8bd4-6d8353b5d9a1.png)
Rubyで外部APIにリクエストする

#やる事
1.gem 'httpclient'を使用し外部APIにリクエストする。
   外部APIは"http://yapi.ta2o.net/apis/mecapi.cgi" (リクエストの文字列を形態素解析するapi)を使用する
2.レスポンスをパースし出力する
   文章の名詞のみ取得する

# 前提
gem 'httpclient'がインストール済みであること

## 指定したワードを解析して名詞のみ取得する

```ruby:sample.rb
require 'httpclient'
require 'json'

uri = "http://yapi.ta2o.net/apis/mecapi.cgi"
params = {
  sentence: "解析する文章",
  format: "json"
}

client = HTTPClient.new
request =  client.get(uri,params)
response = JSON.parse(request.body)

words = []
resaponse.each do |res|
  word_list = res["feature"].split(",")
  words << word_list[6..8] if word_list[0] == "名詞"
end

p words.uniq
```
```
$ ruby sample.rb
=> ["解析", "カイセキ", "文章", "ブンショウ", "ブンショー"]
```
itamaeのgitリソースでエラーが起きたからメモ

itamaeのgitリソースを実行したところ「deployブランチがすでに存在しているためcheckoutできませんでした」という旨のエラーが出ました。  
その原因を調べたのでメモとして残しておきます。

## エラーの原因

itamaeでgitリソースを実行するときに以下をともに満たしている場合、deploy branch already existという内容のエラーが発生します。

- checkoutしているブランチがdeployブランチ以外(masterとか)
- deployブランチはすでに存在している

コードを見てみるとわかりますが、基本的にdeployブランチにcheckoutした状態で実行しないといけないようです。  

## gitリソースの挙動

ざっくりいうと以下の順でリモートのソースコードを同期するようです。

1. deployブランチをdeploy-oldブランチにrename
2. git fetch(このときrevisionオプションを渡していないと常に最新のソースコードを取得する)
3. deployブランチを作成してdeployブランチにチェックアウト
4. deploy-oldブランチを削除

deployブランチ以外のブランチにcheckoutした状態で実行すると、以下の分岐に入らずdeployブランチがrenameされません。  
その結果上記エラーが発生してしまいます。

```ruby
if current_branch == DEPLOY_BRANCH
  run_command_in_repo("git branch -m deploy-old")
  deploy_old_created = true
end
```

https://github.com/itamae-kitchen/itamae/blob/master/lib/itamae/resource/git.rb#L51
  
というわけで、deployブランチにcheckoutしたところ正しく動作しました。  
以上、メモでした。
フォアグラウンドでコマンドを実行した後でバックグラウンドジョブに変更する

バッチの手動実行など終了まで長時間かかるコマンドを実行する場合、
おそらくnohupでSIGHUPを受け付けないようにしてバックグラウンドジョブとして実行すると思います。
しかし、フォアグラウンドジョブとしてコマンドを実行した後で気付くことがたまにあるので、
コマンド実行後にログアウトしても実行されつづけるように変更する方法をメモしておきます。

## 1. ctrl-z
これでフォアグラウンドのプロセスは一時停止状態になります。
再開するときにはフォアグラウンドでの再開、もしくはバックグラウンドの再開ができます。

## 2. jobs -s
停止中のジョブ一覧を表示します。
一時停止したコマンドが表示されているので、その一番左の[n]の数字(=Job番号)をメモしておきます。

```
[1]+  Stopped                 bin/rake -T
```

## 3. bg job番号(PIDも可)
上記でメモしたJob番号を引数に指定してバックグラウンドジョブとして再開します。

## 4. disown %job番号
現在のシェルのジョブテーブルからジョブを削除します。
こうすることでシェルの終了時(ログアウト時)に投げられるSIGHUPを受け取らないようになります。

hオプションを付与して`disown -h`と実行した場合は、シェルのジョブテーブルからジョブを削除せずにSIGHUPを受け付けなくすることができます。
このときはnohupと同様の状態になるため、ログアウトするまでは起動中のシェルでジョブを管理できます。


シンプルですが、以上メモでした。
Swift4で書く、引数を取るコマンドラインプログラム

[Swiftはじめたい...その１１ コマンドラインで実行ファイルをつくる。 - Qiita](https://qiita.com/qoAop/items/0e059fd217573d6ef11b)
で紹介されていた、引数を取るコマンドラインプログラムを、2018/01/07現在の状況(swift4.0.3、macOS10.12.6)で動くように修正しました。

## コード

```take_arguments.swift
import Foundation

func main() -> Int {

    let argv = ProcessInfo.processInfo.arguments

    for i in 0 ..< argv.count {
        print("argv[\(i)] = \(argv[i])")
    }

    return 0
}

//返り値を取らないとwarningが出ます
_ = main()
```

## ターミナル上での実行結果

```bash
# コンパイル
$ swiftc -o arg.out take_arguments.swift

# 引数を与えて実行
$ ./arg.out a b c d -1 漢字

# 結果
argv[0] = /Users/user_name/Documents/arg.out
argv[1] = a
argv[2] = b
argv[3] = c
argv[4] = d
argv[5] = -1
argv[6] = 漢字
```
Microsoft Translator Hub を使い始める際に見ておくとよいリソース

:::note alert
Translator Hub は提供が終了しています。2002年9月時点では、[Custom Translator](https://learn.microsoft.com/ja-jp/azure/cognitive-services/translator/custom-translator/overview) が同等のサービスとなります。
:::

あまり需要は多くないと思っていますが、[Translator Hub](https://www.microsoft.com/ja-jp/translator/hub.aspx) を使う機会があるので少しまとめておきたいと思います。

# 注意事項
(2021年10月6日更新)
本記事で取り扱っている Translator Hub は提供終了となりました。後継サービスは Azure Cognitive Service の [Custom Translator](https://docs.microsoft.com/ja-jp/azure/cognitive-services/Translator/custom-translator/overview) です。
画面の使用感については異なる部分もありますが、データの準備方法、テストの考え方など共通する部分も多くあります。

# はじめに
この投稿のゴールは、Microsoft Translator Hub を使い始めようと思った人が、最初に読んでおいたほうがよさそうな情報をまとめることです。技術的な背景の解説は含みません。

# Translator Hub とは？
Microsoft Research の研究成果として公開されている、機械翻訳 API 作成のための仕組みです。

## 既存のサービスを使えばよいのでは？
一般的に利用できる翻訳サービスとしては、[Bing Translator](https://www.bing.com/translator) や [Google翻訳](https://translate.google.co.jp) があります。また、[Translate API](https://www.microsoft.com/ja-jp/translator/translatorapi.aspx) のような言語翻訳用の API を提供しています。これらのサービスなどをビジネス上のシステムで使おうとした場合、一般的に利用されない社内用語に対して適切な翻訳が行えないことが課題となるケースがあります。
Translator Hub は Translate API に対して、翻訳のスタイルや独自の用語を事前に学習させることで API をカスタマイズすることができ、この課題に対処することができます。

## 本当に使っても大丈夫なの？
ダメということはないのですが、気を付けたほうがよいポイントがあるかと思います。

- 一般提供開始済みのサービスではないため、コミュニティによる支援のみ
- 要望、アイデアに関しては受付用のサイトに対してのフィードバックが可能

という状態です。(2018年1月現在) 
自分たちで調べて解決していく必要があるということを念頭に、どのように利用可能かを検討することが重要だと思います。

# 初めの一歩として何を見ればいいの？
Translator Hub のサイト上のリソースや、Microsoft Research のリソースなどがありますが、遠回りのようで手っ取り早いと私が思ったのは、[利用者ガイド](https://hub.microsofttranslator.com/Help/Download/Microsoft%20Translator%20Hub%20User%20Guide.pdf) です。概念、利用開始までの手順がまとまっています。英語で書かれてはいますが、それこそ上述の一般的な翻訳サービスを使って、まずはざっくりと理解してみるのが良いかと思います。

# 重要な点のザックリ要約
全部読んで理解したほうがよいと思うのですが、ざっくり要約すると Translator Hub を利用して翻訳 API を準備するための方法は以下のような感じです。

- 元となる文章と翻訳先の言語に翻訳された文章が一対一で記入されているドキュメントを準備する
- 翻訳先の言語で記載された文章のみのドキュメントを準備する
- 元となる単語と翻訳先の言語で記述された単語の辞書を準備する
- 上述の三つを Translator API に学習させる
- 評価する

# まとめ
というわけで、利用者ガイドを読みましょう。
CentOS 7にRuby 2.3.6をインストール

（環境）

HW   : raspberrypi2 model b
OS   : CentOS 7.4
Ruby : 2.3.6

##gitをインストールする
途中でgit cloneする為

```git:
$ su -
# yum install git
```
##rbenvをインストール
rbenv(Simple Ruby Version Management)とはRubyのバージョンを簡単に切り替えられるコマンドラインツール

```rbenv:
# git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
#echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
# echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
# source ~/.bash_profile
```
##ruby-buildのインストール
ruby-buildはrbenvのプラグインでrbenv installが可能になる

```ruby-install:
# git clone git://github.com/sstephenson/ruby-build.git
# ~/.rbenv/plugins/ruby-build
# cd ~/.rbenv/plugins/ruby-build
# ./install.sh
```
##インストール可能なrubyバージョンを確認する。

```rbenv:
rbenv install -l
```
##ruby 2.3.6をインストールする
```install:
# rbenv install 2.3.6
```

##インストール後

```
rubyのバージョンを特定できていないので下記のように表示される
# ruby -v
rbenv: ruby: command not found

The `ruby' command exists in these Ruby versions:
  2.3.6
```

```global:
globalでバージョンを指定する
# rbenv global 2.3.6
```

（参考）
https://qiita.com/Fendo181/items/d14ebfb148223c8e5ecb
https://qiita.com/Kaisyou/items/34ea9b5800434c1e09e6
railsのi18n使い方


#1. 設定ファイル読み込み

```config/initializes/i18n.rb
# encoding: utf-8
I18n.default_locale = 'ja'
LOCALES_DIRECTORY = "#{Rails.root}/config/locales/"
LOCALES_AVAILABLE = Dir["#{LOCALES_DIRECTORY}/*.{rb,yml}"].map do |locale_file|
  File.basename(File.basename(locale_file, '.rb'), '.yml')
end.uniq.sort
```

# 2.使う

```config/locales/ja.yml
ja:
  activerecord:
    models: &models
      user: "ユーザー"
    attributes: &attributes
      user:
        name: ”名前”
```

とした場合、

```
$ I18n.t('activerecord.models.user')
=> "ユーザー"  
$ I18n.t('activerecord.attributes.user.name')
=> "名前"  
```
と使用できる

## viewで使う

```erb:sample.html.erb
<div>
  <%= t('activerecord.attributes.user.name') %>　#”名前”  
</div>
```

## ドキュメント
https://railsguides.jp/i18n.html
https://qiita.com/Kta-M/items/bd4ba36a58ad602a9d8b
Railsでgem twilio-rubyを使ってTwiMLを組み立てる

# やりたいこと
* RailsでTwiMLを組み立てたい(今後、ログを保存したり、転送先を動的にごにょごにょしたいため）
* XMLをテキストでレンダーするのではなくて、Twilio-rubyを使って行いたい(公式ドキュメントのAPIリファレンスのサンプルをそのまま使えるように)

Ref;
https://jp.twilio.com/docs/api/twiml/dial

# やったこと
### gemいれる
gemfileに下記を追記

```ruby
gem 'twilio-ruby', '~> 5.6.0'
```

### コントローラを作成

```bash
rails g controller calls oncall
```

### コントローラを修正
```ruby
class CallsController < ApplicationController
  def oncall
    response = Twilio::TwiML::VoiceResponse.new
    response.say('お繋ぎしています。しばらくお待ちください。', language: 'ja-jp')
    response.dial(
        record: true, //録音する
        callerId: "+8150*******", //購入した自分の番号を追加
    ) do |dial|
      dial.number('+81**********') //転送先の番号
    end

    render :xml => response.to_xml
  end
end
```

### router確認
```ruby

post 'calls/oncall'
```

# 参考
https://www.twilio.com/blog/2016/05/calling-rails-5-getting-started-with-twilio-on-rails.html
※ `Twilio::TwiML::Response`ではなく `Twilio::TwiML::VoiceResponse`にする必要あり。
最初なかなか気づかなくてはまりました。。
DragonBoard 410C のLinux(Debian)不安定になる問題への対策について

Linux (Debian) をインストールしたDragonBoard 410Cを久々に使い始めたら、Wifiが勝手に切れたり、勝手に固まって再起動するなどを繰り返すようになってしまいました。

いろいろ調べたところ、96Boards Bug Tracker上の[Bug 272 "periodic 10-15sec wifi connectivity loss" https://bugs.96boards.org/show_bug.cgi?id=272](https://bugs.96boards.org/show_bug.cgi?id=272) という情報ににたどり着きました。

とりあえず、この中に出てくる次のコマンド

iw dev wlan0 set power_save off

を実行したら、安定したようです。
（てっきり本体かACアダプタが壊れたかと思いました。）

/etc/rc.localに組み込んで恒久化しました。
ActiveRecord::PendingMigrationErrorの解決。rails db:migrateを！

#Rails5でlocalhost:3000にアクセスしたら、ActiveRecord::PendingMigrationErrorが出た。
![スクリーンショット 2018-01-07 21.19.48.png](https://qiita-image-store.s3.amazonaws.com/0/142296/a5ba7772-b48d-9c42-9bef-cf622f2c5c93.png)
ActiveRecord::PendingMigrationError (

Migrations are pending. To resolve this issue, run:

        bin/rails db:migrate RAILS_ENV=development

):
  


##Migrationをしろと、Pendingをしてくれている

$ rails db:migrate
== 20180105013951 CreateTopics: migrating =====================================
-- create_table(:topics)
   -> 0.0232s
== 20180105013951 CreateTopics: migrated (0.0233s) ============================

##Rails s でlocalhost:3000にアクセス
Started GET "/" for 127.0.0.1 at 2018-01-07 21:25:30 +0900
   (0.5ms)  SELECT "schema_migrations"."version" FROM "schema_migrations" ORDER BY "schema_migrations"."version" ASC
Processing by Rails::WelcomeController#index as HTML
  Rendering vendor/bundle/ruby/2.5.0/gems/railties-5.1.4/lib/rails/templates/rails/welcome/index.html.erb
  Rendered vendor/bundle/ruby/2.5.0/gems/railties-5.1.4/lib/rails/templates/rails/welcome/index.html.erb (3.2ms)
Completed 200 OK in 22ms (Views: 7.3ms | ActiveRecord: 0.0ms)

![スクリーンショット 2018-01-07 21.32.07.png](https://qiita-image-store.s3.amazonaws.com/0/142296/291e991c-fa32-3dd8-0adf-83fccaf6160e.png)

これでローカル環境でのブラウザ上のエラーは無くなりました。
エラーは好まないけど、エラーメッセージは友達になりたい。

参考にして頂けたら幸いです。
http://www.papa-programing.jp/entry/rails-migration-timestamps
Karabiner の設定ファイル private.xml を分割する


いくらかの単語で調べても実践している人が見当たらなかったのでメモ。

## 分けたい
とりあえず、大きくなったからカテゴリ毎に分割したいというのが考えられる。

今回の僕の場合は複数の Mac で`github`を使って管理している`private.xml`を共用しているのだけど、会社でしか使わないフレーズを記載したくなったので`private.xml`の他に`~/.karabiner/local.xml`を作りたかった。
会社でのみ頻繁に入力するメアドや URL や特定のフレーズを`option + A`とかで入力できるようにするととても便利だ。

## やり方
結論から言うと[公式ドキュメント](https://pqrs.org/osx/karabiner/xml.html#include)に記載があった。
`<include path = "xxx">`で出来た。

`private.xml`に大半を直接書いて、末尾で`<include path = "{{ ENV_HOME }}/.karabiner/local.xml" />`をすることで環境毎に異なるさらなる設定を足す形にした。
`private.xml`を`<include path = "conf1.xml" />`, `<include path = "conf2.xml />`みたいに`include`だけにすればカテゴリ毎にファイルを分ける形にも出来る。

ちなみに特に追加設定を入れる気がない環境では、とりあえず下の様なファイルを置いておけばエラーになったり存在チェックをしたりしなくて済むので楽。

```xml:local.xml
<?xml version="1.0"?>
<root>
</root>
```

## HOME ディレクトリ
公式ドキュメントに`{{ ENV_HOME }}`についての記載が無かったけど、そのまま書いたらどうやら`~`が展開されたみたい。
ちなみに`~/...`とか`{{ HOME }}`/...`ではエラーになった。

希望が満たせたので`<replacementdef>`については読まなかったけど、`{{ FOO }}`の部分は呼び元から引数のように設定するんじゃあないかと思ったんだけどな。
`ENV_HOME`だけは最初から設定されているのかな。
幻冬社　成功の法則９２ヶ条を読んで心に残った法則  



##1.考えて行動するのではなく、考えるために行動する。
　他の本でも、とりあえず行動して後から考えてみる等の事は書かれているのですがこの言い回しが自分の心に残りました。
　とりあえず行動してみるのと、考えるためという目的意識を持って行動する、のでは得られるものは全然違うと思いますし、難しく考える前に実行に移すということも再認識させてくれる言葉でした。

##2.右脳と左脳のキャッチボールをする。
　今まで生きてきて、中学受験や大学受験の時に「直感で答えがわかるようにするのではなく、理解してわかるように」というのはよく言われてきました。これは、右脳から左脳への理解のチェンジを表している言葉だと思います。
　しかし、三木谷さんはさらに左脳から右脳へ、そしてまた左脳へキャッチボールを幾度かしてアイデアの重要な部分を見つけ出していくそうです。単純なものを複雑化したものを、さらに単純化してみるというのは自分にはなかった考えでした。革新的だと思うアイデアが思い浮かんだ時には、この作業をすることにより自分の考えの根幹や修正点が鮮明に見えてくるのではないでしょうか。

##3.不調なときでも、その中に成功している人(部署)を探し、分析せよ。
　自分はチームが不調な時は他の成功しているチームや、業界から成功している理由を分析するという考えがありました。しかし、三木谷さんは不調なチームな中でも成功している人や部分はあるから、そのいい兆しを大きなものにしていくという考えでした。
　外のところに目を向けるのも大事だが、身近なところでの成功している部分にも目を向け分析するのは、意外に忘れているのかもしれないと思い心に残った法則になりました。

##4.Never too late
　この法則では、「ファースト・ムーバー・アドバンテージ」という、最初に行動したものに利があるという言葉と、「ベスト・ムーバー・アドバンテージ」という、最善の動きをしたものに利があるという言葉が挙げられていました。「人生に遅いなんて事はない」という言葉を横文字で表現するとなかなかにかっこいいです。かっこよさを感じたのと同時に、時間的な遅さでの不可能は無いという事を再認識させられました。
{lmerTest} packages ステップワイズするとき　回帰モデル 

lmer関数を用いるような混合モデルをやるときにもステップワイズを勿論行います。
ただしlibrary(MASS)のstepAICが使えないためにlibrary(MuMIn)のdrege関数でモデル選択をすると総当たりなため非常に遅くて悩んでいましたが、もっと高速な関数があったので比較した結果をメモしておきます。

```
library(lme4)
library(MuMIn)
library(lmerTest)

# 大気汚染のデータで回帰モデル
data(airquality)

# 一旦欠損値を取り除く
air_data <- airquality[!is.na(airquality$Ozone) & !is.na(airquality$Solar.R),]

# 月によって風の強さが違うと仮定
model_result <- lmer(Ozone~Solar.R+(Wind|Month)+Temp+Day, data= air_data)

# おまじない
options(na.action = "na.fail")

# dregeとstepでの時間比較
step_dredge_time <- system.time(drege_model_select <- dredge(model_result,rank = "AIC", fixed = NULL, m.lim = NULL,trace = TRUE))
step_step_time <- system.time(step_model_select <- step(model_result))
```

私の手元環境ではdregeが1.08秒でlmerTestパッケージのstep関数ならば0.58秒で約半分ぐらい速度的に異なりました。
QtにおけるJSONなどの扱い - Qtで作るAndroid目覚ましもどき #5 -

Qtで作るAndroid目覚ましもどきの第五話です。

* やりたいこと
目覚ましのときに使用する音声ファイル（画像ファイル）を選択できる機能（音声設定機能）の実現

* やること/今回のテーマ
  + JSONファイルの読み書き
  + c++とQMLとの間のコンテキストの共有

このプロジェクトの構成については気になる人は[第一話の記事](https://qiita.com/hakua-doublemoon/items/5d65cb248753000862e6)を見てください。

# JSONファイルの読み書き
Qt、特にQMLの部分はJavascriptがベースになっているせいかJSONファイルの扱いに強いです。`var`でとりあえずJSONオブジェクトが使える。なのでQMLとc++を共同して操作する情報はJSONでやるのが良い気がします。
しかしQtのc++はJSONファイルの読み書きがちょっとめんどいです。
……とうんちくたれようかと思いましたが下記ページを見つけたので参照してください。
（若干私の書き方と違いますが）
[QJsonDocumentとQJsonObjectを使って、JSON形式で読み書きする方法](https://qiita.com/tatsuteb/items/f7137a21b4daddfed18e)

## 余談：INIファイルの読み書き
QtはQSettingsクラスを使ってINIファイルも使えます。
[QSettings Class](http://doc.qt.io/qt-5/qsettings.html)のリファレンスを見ると簡単そう。
きっとJSONの方が色々できるとは思いますが、簡単な設定情報をc++で管理するだけならINIファイルを使った方が良いかもと気付きました。
QMLではSettings型オブジェクトを使うようです。

# c++とQMLとの間のコンテキストの共有
必要な時に互いのインターフェースにJSONオブジェクトを渡しても良かったのですが、渡すオブジェクトが決まってるのにそれをやるのはバカらしく感じて、コンテキストとしてJSONオブジェクトを共有してみることにしました。
やり方ですが、まず、main()として動くc++からQMLに`setContextProperty()`でJSONオブジェクトを設定します。`setContextProperty()`とは[リファレンス](http://doc.qt.io/qt-5/qqmlcontext.html#setContextProperty)では

> `void QQmlContext::setContextProperty(const QString &name, QObject *value)`
> Set the context object.

"コンテキスト・オブジェクトを設定する"という短い説明がされています。
まあ正式な詳細説明がどこにあるのか知りませんが、`setContextProperty()`は第二引数で与えられたオブジェクトをQML上で第一引数の文字列の名前のオブジェクトないしはプロパティとして使えるようにする、というもののようで。第二引数の型は一応`QObject`というクラスですが、`QObject`を継承したクラスとかQtのクラスならだいたいがむぎゅっと第二引数に入れられそうです。
で、改めてぐぐると下記記事を発見しました。
[QMLとC++のバインディング](https://qiita.com/DAR/items/400a1725ddedcaa6ef0e)
私がいう共有とは、他方で変えられれば他方にもそれが反映されるということで、バインディングという言い方になるわけですね。
やり方も上記記事のとおりで、さらにいろいろ書いてあるので是非今後の参考にしたい記事でした。
Excel VBA クイックページ設定

私はExcelのページ設定は、大体いつも同じ設定にします。横1ページに収めて印刷し、フッタにはページ数・総ページ数を表示し、余白は極力少なくするという感じです。それを、下記のようなマクロにしてPERSONAL.XLSBに記述し、毎回使用しています。


Sub quickPageSetup()
'よく使うページ設定を素早く実行
　　Application.ScreenUpdating = False '描画を省略

　　With ActiveSheet.PageSetup
　　　　.CenterFooter = "&P/&N" 'ページ数/総ページ数　→中央フッタ
　　　　.LeftMargin = Application.InchesToPoints(0.4)　　　'左余白。やや広く。
　　　　.RightMargin = Application.InchesToPoints(0.2)　　 '右余白。狭く。
　　　　.TopMargin = Application.InchesToPoints(0.4)　　　 '上余白。
　　　　.BottomMargin = Application.InchesToPoints(0.4)　　'下余白。
　　　　.HeaderMargin = Application.InchesToPoints(0.2)　　'ヘッダ。
　　　　.FooterMargin = Application.InchesToPoints(0.2)　　'フッタ。
　　　　.Zoom = False
　　　　.FitToPagesWide = 1 '横1ページに収める
　　　　.FitToPagesTall = False '縦のページ数は設定しない
　　End With
　　
　　Application.ScreenUpdating = True '描画する
End Sub
[Kotlin] enumに付加情報を付け加える

例えば `Int`型の`value`、`String`型の`message` の２つを加える場合は次のとおり。

```kotlin
enum class Code(val value: Int, val message: String) {
    CODE1(100, "message hoge"),
    CODE2(200, "message fuga"),
    CODE3(300, "message piyo"),
}
```

次のように利用できます。

```kotlin
print(Code.CODE1.value)   // 100 が出力される
print(Code.CODE1.message) // message hoge が出力される
```
日本語データを登録しようとするとハテナマークになってしまう SQL Server 2014

##SQLでテーブルに日本語データを登録しようとするとハテナマークになってしまう。


ググります。→Why is sql server storing question mark characters instead of Japanese characters in NVarchar fields?(https://stackoverflow.com/questions/761036/why-is-sql-server-storing-question-mark-characters-instead-of-japanese-character)
![SQLNvarcharANSWER.png](https://qiita-image-store.s3.amazonaws.com/0/210223/695ca24f-d884-df13-6f0e-bb1aa42e6d11.png)
このユーザー投票が多い回答をまず試してみます。

回答にある通り日本語データを登録したり検索したりする際にNを''(シングルコート)の前に付けると問題なくできました。
![SQLQuerySuccess.png](https://qiita-image-store.s3.amazonaws.com/0/210223/fcf08598-c6dd-2093-9b50-6e54849476a5.png)
気を付けたいのは検索する際もNを付けないと、
エラーは出ませんがSQL Serverが変更したいデータを認識せずデータを変更したはずなのにされてない！ということが起こってしまいます。
【Objective-C】.hファイルでswiftのクラスを呼び出す

# やりたいこと
Objective-C の .hファイルで、swiftのクラスを呼びだしたい。

# なぜ？
swiftで定義したスキーマクラスをObjective-Cのproperty（外部からアクセスできるインスタンス変数）に組み込みたかったから

# 前提
以下のようなクラスをswiftで実装したとします。
内部変数に深い意味はありません。少し複雑なスキーマだ、と想定してください。
**Objective-C側で呼び出せるようにNSObjectを継承していることには留意しておいてください。**

```swift:hoge.swift
class SwiftClass:NSObject{
    init(a:CGFloat, b:Int, c:String){
        self.a = a
        self.b = b
        self.c = c
    }
    var a:CGFloat
    var b:Int
    var c:String
}

```

# NG例
色々探りましたが、まず試したのは以下のような実装。
.mファイルではイケる方法ですが、、

```objective-c:hoge.h
#import "{Project名}-Swift.h"

@interface ObcClass : NSObject

@property SwiftClass *swift_schema;

@end
```

.hファイルでは、

```text
'{Project名}-Swift.h' file not found.
```
と、エラリます。


# OK例
importするのではなく、class宣言をしてください。

```objective-c:hoge.h

@class SwiftClass;

@interface ObcClass : NSObject

@property SwiftClass *swift_schema;

@end
```

# 参考
- [Importing Project-Swift.h into a Objective-C class…file not found](https://stackoverflow.com/questions/26328034/importing-project-swift-h-into-a-objective-c-class-file-not-found)

# おわり
僕は普段swiftで書いているんですが、アプリの既存コードをイジる際には、Objective-Cを触ることが多々あります。そこで躓きやすいのが、Swift連携の箇所で、今回の記事みたいなケースは結構あると思います。参考にしていただければ。
Excel VBA 高速化における基本設定構文

初投稿です。
Excel VBAで、高速化のための構文とか載ってますけど、なんか個別にぶつ切りで扱ってるものばかりなんですよね。私はいつも、下記の2つのマクロをセットにしてCallして使ってます。

```vbnet
Sub appSet()
'マクロ処理中に、描画など余計なものを省略して高速化
    With Application
        .ScreenUpdating = False '描画を省略
        .Calculation = xlCalculationManual '手動計算
        .DisplayAlerts = False '警告を省略。
'　　　　.EnableEvents = False 'DisplayAlertsよりこちらを設定した方が良いのかな？
    End With
End Sub

Sub appReset()
'描画などの設定をリセット
    With Application
        .ScreenUpdating = True '描画する
        .Calculation = xlCalculationAutomatic '自動計算
        .DisplayAlerts = True '警告を行う
    End With
End Sub
```

要は、描画の省略、手動計算の設定がメインで、Withでまとめられるのが良いところ。一定以上のVBAユーザは死ぬほど使うはずなので、もうこうやってまとめるべきですねえ。
これはPERSONAL.XLSにも入れてて重宝してます。
Android7.0以上のバージョンではPeriodicなJobのintervalを１５分以下にすることができない

タイトル通りです．

### サンプル

例えば，

```MainActivity.java

public class MainActivity extends AppCompatActivity {
    private ComponentName mServiceName;
    private final static int JOB_ID = 0x01;

    @Override
    public void onCreate(Bundle savedInstanceState, PersistableBundle persistableBundle) {
        super.onCreate(savedInstanceState, persistableBundle);
        setContentView(R.layout.activity_main);

        mServiceName = new ComponentName(this, MyJobService.class);
        Intent intent = new Intent(this, MyobService.class);
        startService(intent);

        JobScheduler scheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
        JobInfo jobInfo = new JobInfo.Builder(JOB_ID, mServiceName)
                .setPeriodic(10000)
                .build();
        scheduler.schedule(jobInfo);
    }

```

という感じで`JobInfo.Builder`で`setPeriodic`関数を使って，10秒後にJobが実行されるように設定すると，Logcatに

```
W/JobInfo: Specified interval for 1 is +10s0ms. Clamped to +15m0s0ms
W/JobInfo: Specified flex for 1 is +10s0ms. Clamped to +5m0s0ms
```

と出てきて，勝手にintervalを15分・flexを5分にされてしまう．

\# が，手元で試したら秒の単位でちょうど10分後に発火しました．
\# まぁinterval ± flexなんでしょう．


### 感想
酷いのは，[公式のリファレンス](https://developer.android.com/reference/android/app/job/JobInfo.Builder.html#setPeriodic(long, long))に何も書いてくれていないということですな．．

今回に限っては本番では15分以上にしてもいいんやけど，いかんせんデバッグがしにくいというか，ちょっと動くか試したいときに面倒すぎる．
下記参考の2では，毎回Jobが終わるたびに同じJobIDで```setMinimumLatency```のJobを作りなおすことで，15分以下のPeriodicなJobを無理やり作ってるけど感覚的にはちょっと気持ち悪いしなぁ．．

###参考
1. https://stackoverflow.com/questions/38344220/job-scheduler-not-running-on-android-n
1. https://stackoverflow.com/questions/39641278/job-scheduler-in-android-n-with-less-then-15-minutes-interval
USBカメラのカメラキャリブレーション（OpenCV）

# はじめに
OpenCVでUSBカメラを使って画像処理やAR的なことをしようとすると，カメラキャリブレーションをおこなう必要が出てくる。OpenCVのチュートリアルに全部書いてあるが，いちいち画像を保存しなくてもすぐカメラ定数や歪みを求められるようにした。

# OpenCV-Pythonを用いたUSBカメラのカメラキャリブレーション

cap = cv2.VideoCapture(0)の引数はパソコンに繋いだUSBカメラに割り当てられる番号で，ノートPCについてるようなカメラだと0，更にUSBにカメラをさしていくとは1,2,3,,,のようになる。

まず，OpenCVのサンプルフォルダにあるようなチェスボードと呼ばれる白黒のタイル画像を印刷する。
https://github.com/opencv/opencv/blob/master/samples/data/chessboard.png

その後下記のスクリプトを実行するとUSBカメラの映像が映るので，チェスボードが写っているときに，キーボードの「ｃ」を押すとタイルの角の場所が求まる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201397/d2f54de2-ef66-8e56-e501-971da1ee6395.png)

これを様々な角度から行い，キャプチャーした枚数が１０枚程度になったら「ｑ」を押すと，求めたタイルの角の場所からカメラ定数や歪み定数を計算することができる。

最後にCSVファイルにカメラ定数と歪み定数を保存しているので，使用するときは
mtx = np.loadtxt("mtx.csv",delimiter=",")
dist = np.loadtxt("dist.csv",delimiter=",")
で読み込めば良い。

なぜか，チェスボードの認識率が良くなかったが何度も「ｃ」ボタンを押せばうまく求めることが出来た。

```python3
import numpy as np
import cv2

cap = cv2.VideoCapture(0)

if cap.isOpened() is False:
    raise("IO Error")

# termination criteria
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)

# prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
objp = np.zeros((6*7,3), np.float32)
objp[:,:2] = np.mgrid[0:7,0:6].T.reshape(-1,2)

# Arrays to store object points and image points from all the images.
objpoints = [] # 3d point in real world space
imgpoints = [] # 2d points in image plane.

imgInd=0
while True:
    ret, img = cap.read()
    if ret == False:
        continue
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    
    cv2.putText(img,'Number of capture: '+str(imgInd),(30,20),cv2.FONT_HERSHEY_PLAIN, 1,(0,255,0))
    cv2.putText(img,'c: Capture the image',(30,40),cv2.FONT_HERSHEY_PLAIN, 1,(0,255,0))
    cv2.putText(img,'q: Finish capturing and calcurate the camera matrix and distortion',(30,60),cv2.FONT_HERSHEY_PLAIN, 1,(0,255,0))
    cv2.imshow("Image", img) 
    
    k = cv2.waitKey(1) & 0xFF
    if k == ord('c'):
        # Find the chess board corners
        ret, corners = cv2.findChessboardCorners(gray, (7,6),None)
        # If found, add object points, image points (after refining them)
        if ret == True:
            objpoints.append(objp)
    
            corners2 = cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
            imgpoints.append(corners2)
    
            # Draw and display the corners
            img = cv2.drawChessboardCorners(img, (7,6), corners2,ret)
            cv2.imshow('Image',img)
            cv2.waitKey(500)
            
            imgInd+=1
        
    if k == ord('q'):
        break

# Calc urate the camera matrix
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1],None,None)

# Save the csv file
np.savetxt("mtx.csv", mtx, delimiter=",")
np.savetxt("dist.csv", dist, delimiter=",")

cap.release()
cv2.destroyAllWindows()
```
Ruby：ファイルのaccess_modeの指定と文字コードの指定方法備忘録

# openメソッドでのaccess modeの指定
* 第二引数がaccess modeの指定になる
* wを渡すとファイルが存在しない場合は新規作成、存在する場合は上書きする

```ruby:test.rb
open(file_path, 'w') do |file|
  file.write(output_json)
end

```
# openメソッドでの文字コードの指定
* 第二引数にて`access mode:文字コード`の形式で文字コードを指定する

```ruby:test.rb
open(file_path, 'w:utf-8') do |file|
  file.write(output_json)
end

```


# まとめ
* rubyのversionは多分ですが2.3.1とか（今手元に無い）。
* 古いドキュメントが結構検索にヒットして、引数が大幅に変わっていたりするのでversionをよく確認した方が良い
クリックした文字の色を変える


## サンプルコード
```php:index.php
<!DOCTYPE html>
<html lang="ja">
<head>
	<title>test</title>
	<link rel="stylesheet" type="text/css" href="test.css">
</head>
<body>
<ul>
	<li class="choice">A1</li>
	<li class="choice">A2</li>
	<li class="choice">A3</li>
	<li class="choice">A4</li>
</ul>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="test.js"></script>
</body>
</html>
```
```css:test.css
body {
  font-size: 28px;
  font-family: font-family: "Avenir Next", Verdana, "ヒラギノ角ゴ Pro W3", "Hiragino Kaku Gothic Pro", "游ゴシック", "Yu Gothic", "メイリオ", Meiryo, Osaka, sans-serif;
}
.selected {
	color: red;
}
```
```javascript:test.js
$(function() {
	$('.choice').on('click', function() {
		// $(this)は.choiceを指す変数
		var $selected = $(this);
		$selected.addClass('selected');
	})
})
```
## 結果
![結果.PNG](https://qiita-image-store.s3.amazonaws.com/0/174554/ba256bc6-bfac-63d1-09fd-de2fee0a27cd.png)
MacのメニューバーからEmacsのメニューを消す

ちょっとしたTipsです．
Macのメニューバーをすっきりさせられます．

# Macのメニューバーってどれのこと

<img width="800" alt="Screen Shot 2018-01-07 at 19.06.55.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/144707/56f6c0b1-9c2e-5845-f48c-cb0cecacad7b.jpeg">

これのことです．
アイコンが多すぎると必要な情報が隠れちゃって困りますよね....


# Emacsのメニューを消す

<img width="800" alt="Screen Shot 2018-01-07 at 11.42.53.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/144707/9e60d200-41e3-582b-8bf9-8d7788bdd3af.jpeg">


こうなります．
やり方はこちら！（cf. [StackExchange](https://emacs.stackexchange.com/questions/941/emacs-and-os-x-menu-bar)）

```el
(define-key global-map [menu-bar options] "") ;; Optionsが消える
(define-key global-map [menu-bar edit] "") ;; Editが消える
(define-key global-map [menu-bar tools] "") ;; Toolsが消える
(define-key global-map [menu-bar help-menu] "") ;; Helpが消える
(define-key global-map [menu-bar file] "") ;; Fileが消える
(define-key global-map [menu-bar buffer] "") ;; Buffersが消える
```
Oracle Certified Java Programmer, Silver SE 8 認定資格 受験体験記

# 概要
2018年1月7日（日）にOracle Certified Java Programmer, Silver SE 8 認定資格（Oracle Java Silver）を受験して合格できたので日記を書いとく:point_up_tone1:

# 勉強方法
- [徹底攻略 Java SE 8 Silver 問題集[1Z0-808]対応](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-Java-Silver-%E5%95%8F%E9%A1%8C%E9%9B%86-1Z0-808/dp/4844339931)をわからないところが無くなるまで読み込む（だいたい3周くらい）

# かかったコスト
約32,500円（受験料：29,000円＋参考書：3,500円）

# 勉強期間
約5日

# 所感
黒本の参考書を徹底的に勉強すれば必ず受かる！私はPHPしか実装経験が無かったので「コンパイルエラー」と「実行時エラー」の違いなどとっつきにくい部分もあったが、お決まりごとのルールを正しく理解すれば満点合格も夢ではないレベル感だった:robot:
AWSとAzureとGCPを比較してみる - IaaS編

IaaSについて、AWSとAzureとGCPを比較してみました。
(2018.8.5修正)

注)
Azureについては、リソースマネージャーモデルについて記載しています。
GCPについては、サブネットネットワークについて記載しています。

# 1. ネットワークの構成要素

| | AWS              |Azure              | GCP                |
|:-------------------|:-------------------|:-------------------|:-------------------|
|1|リージョン|リージョン|リージョン|
|2|VPC|仮想ネットワーク|VPCネットワーク|
|3|アベイラビリティゾーン(AZ)|可用性ゾーン[^1]|ゾーン|
|4|サブネット|サブネット|サブネット|
|5|EC2|仮想マシン|Compute Engine|
|6|ネットワークインターフェイス|仮想NIC|ネットワークインターフェイス|
|7|セキュリティーグループ|ネットワークセキュリティグループ(NSG)|ファイアウォールルール|
|8|ネットワークACL|ネットワークセキュリティグループ(NSG)|ファイアウォールルール|

# 2. リージョンとアベイラビリティゾーンとVPCとサブネット

![IaaS比較vpc (1).png](https://qiita-image-store.s3.amazonaws.com/0/192584/7902d6d3-0e98-0f66-5179-22f39311fb8e.png)

リージョンは地理的に離れたロケーションことで、さらに1つのリージョンはデータセンターが設置される複数の独立したアベイラビリティゾーン（Azure:可用性ゾーン、GCP:ゾーン）から構成されます。

[^1]: 但しAzure:可用性ゾーンは日本未導入

VPC(Azure:仮想ネットワーク)は、他と論理的に切り離された仮想ネットワークのことで、その中に1つまたは複数のサブネットを定義してEC2(Azure:仮想マシン、GCP:Compute Engine)を配置します。

複数のアベイラビリティゾーン（Azure:可用性ゾーン、GCP:ゾーン）にEC2等を配置し冗長構成をとることにより、可用性を高めることができます。(AWS用語でMulti-AZ)

一方AWSは2017のre:InventでAzureの可用性セットと似た機能を提供する[スプレッドプレイスメントグループ](https://aws.amazon.com/jp/blogs/news/introducing-spread-placement-groups-for-amazon-ec2/)をリリースしています。こちらは複数のアベイラビリティゾーンにまたがることが可能です。

### ・各クラウド間での違い-その1
AWSはアベイラビリティゾーンをまたがってサブネットを構成することができませんが、Azureは可用性ゾーン・GCPはゾーンをまたがってサブネットを構成します。

### ・各クラウド間での違い-その2
AWSとAzureはVPC・仮想ネットワークに対しCIDR表記でIPアドレス空間を指定する必要があり、サブネットはVPCのIPアドレス空間の範囲に制限されますが、GCPはVPCに対しIPアドレス空間を指定せず、サブネットはRFC1918の範囲で自由に割り当てることができます。(例：192.168.0.0/24と10.0.1.0/24等)

## 3. セキュリティーグループとネットワークACL

![IaaS比較sg.png](https://qiita-image-store.s3.amazonaws.com/0/192584/fee37725-e35e-98a9-d7d2-c9602a7b31eb.png)

AWSはEC2のネットワークインターフェースに対しセキュリティグループを、サブネットに対しネットワークACLを関連づけることにより、INとOUTのネットワークトラフィックを制御します。
Azureは仮想マシンのNICやサブネットに対しネットワークセキュリティグループ(NSG)を関連づけることにより、INとOUTのネットワークトラフィックを制御します。
一方GCPはVPCネットワークに対しファイアウォールルールを設定することにより、INとOUTのネットワークトラフィックを制御します。設定がサブネット単位ではなくまた宛先をCIDRで指定できないため、サブネット単位で制御したい場合はタグを利用する場合もあります。

### ・各クラウド間での違い-その3
AWSのネットワークACLはセキュリティーグループと違いステートレスなので、明示的に戻りのトラフィックを許可する必要があります。

### ・各クラウド間での違い-その4
AWSのセキュリティーグループは、ネットワークACLやAzure・GCPと異なり許可のみ設定が可能です。

# 4.コスト

| | AWS              |Azure              | GCP                |
|:-------------------|:-------------------|:-------------------|:-------------------|
|インスタンスの課金単位[^4]|秒単位(最小課金時間60秒)|秒単位[^3]|秒単位(最小課金時間60秒)|
|長期利用割引の仕組み|リザーブドインスタンス(1年または3年)|Reserved VM Instances(1年または3年)|確約利用割引(1年または3年)・継続利用割引(自動適用)|
|短期利用割引の仕組み|スポットインスタンス|low-priority VM[^2]|プリエンプティブインスタンス|

[^2]: Batchでの利用はGA, スケールセットでの利用はプレビュー

[^3]: [*仮想マシンの実行時間に対して秒単位で課金しますが、超過した秒数に対して課金しません。例えば、仮 想マシンの実行時間が 6 分 59 秒だった場合、課金対象となるのは 6 分 (360 秒) のみです。*] (http://download.microsoft.com/download/6/1/6/6166d6c1-0ac3-4869-840d-53bcc85319db/1933-NOC1_MS_CnE_license_azure.pdf)

[^4]: [秒単位の課金は以下で起動されるインスタンスに適用されます。オンデマンドの予約済みスポットフォーム, すべてのリージョンとアベイラビリティーゾーン, Amazon Linux および Ubuntu](https://aws.amazon.com/jp/ec2/pricing/)

# 5. まとめ

AWS・Azure・GCP間でいくつか違いがあるものの、基本的な部分はそこまで大きな差はないようです。
他クラウドにあるがまだ無い機能がプレビュー提供中だったりと、どんどん違いが無くなって均質化していく感じがします。
php5.6以降で配列を定数に定義できるようになっていたのでメモ

#結論
以下はphp7移行で使える書き方
```
define('DEVICE', [
	'pc' => 'windows',
	'phone' => 'iphone',
	'tablet' => 'ipad'
];
```

#前提
php7、AWS sdk for phpのS3Clientクラスを使う際に設定する
オプション値を定数にして検証しています。
違う環境だと違う結果になるかもしれません。

#エラーになった書き方
```
const DEVICE = [
	'pc' => 'windows',
	'phone' => 'iphone',
	'tablet' => 'ipad'
];
```
```
const OPTIONS = array('region' => 'ap-northeast-1', 'version' => 'latest', 'signature_version' => 'v4');
```

#注意事項
define関数を使って定義するとグローバルに定義される。
constだと名前空間の定義が反映される。

色々と違いを検証してくれていたページを参考にさせていただきました。
[ページ１](http://yukiriru.hatenablog.com/entry/2015/08/07/102328)
[ページ２](https://qiita.com/Hiraku/items/bb0cb665d830f7cd37ff)
UMLモデリング技能認定試験　L2受験体験記

# 概要
2017年12月26日（火）にUMLモデリング技能認定試験　L2（UMTP L2）を受験して合格できたので日記を書いとく:point_up_tone1:

# 勉強方法
- [徹底攻略UMLモデリング技能認定試験問題集 L2対応](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5UML%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0%E6%8A%80%E8%83%BD%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93%E5%95%8F%E9%A1%8C%E9%9B%86-L2%E5%AF%BE%E5%BF%9C-IT%E3%83%97%E3%83%AD-IT%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5-%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE%E3%82%AA%E3%83%BC%E3%82%B8%E3%82%B9%E7%B7%8F%E7%A0%94/dp/4844326627)をわからないところが無くなるまで読み込む（だいたい3周くらい）

# かかったコスト
18,400円（受験料：16,200円＋参考書：2,200円）

# 勉強期間
約2ヶ月

# 所感
UML表記方法を暗記と言うより、要件に対して適切な表記を選択する問題が多いので、参考書を解く時「なぜこうなるのか？」を自分の口で言えるくらいに理解を深めれば合格できるレベル。試験当日までに懸念や不安を全て拭い去って挑むとよし:robot:
UMLモデリング技能認定試験　L1受験体験記

# 概要
2017年5月7日（日）にUMLモデリング技能認定試験　L1（UMTP L1）を受験して合格できたので日記を書いとく:point_up_tone1:

# 勉強方法
- [ITトレメ](http://jibun.atmarkit.co.jp/scenter/ittrain/110_cal.html) の問題集を3周
- [UMTPのL1サンプル問題](https://umtp-japan.org/pdf/sampleL1T2.pdf)を解く

# かかったコスト
16,200円（受験料：16,200円）

# 勉強期間
約5日

# 所感
ITトレメの問題を何周も解いて受験に挑んだら、割りと想定外な問題が出てきて面食らったけど無事合格できた。
素直に[徹底攻略UMLモデリング技能認定試験問題集](https://www.amazon.co.jp/%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5UML%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0%E6%8A%80%E8%83%BD%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93%E5%95%8F%E9%A1%8C%E9%9B%86%E2%80%95L1-T1-T2-IT%E3%83%97%E3%83%AD-IT%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E5%BE%B9%E5%BA%95%E6%94%BB%E7%95%A5/dp/4844324829)買って挑めばよかった。。
railsでLeftJoinする

Activeレコードの使い方について書くので`left join`って何？ってって場合は他の記事を参考にしてください。



## SQLからActiveレコードを考えてみた。

個人的にSQLからActiveレコードを考えてたほうが理解がはやいのでこの形で書いていきます。

```sql
select * from Groups g 
left join UsersGroups u
on g.id = u.group_id
where u.user_id = 1
```

上記のSQLをActiveRecodeで書くと

```ruby
Group.includes(:users_group).where(users_group: {user_id = 1})

```


いやー、Rails難しい。なんかアドバイスあればください！！
Sass学習メモ

##本日からSassを学びますので、メモ

##Sassとは
CSSをより効率的に書くことができる言語

- 主な記法
    - SASS記法(拡張子 => .sass)
    - SCSS記法(拡張子 => .scss)

##Sassを使用するメリット

- コードの記述量を減らすことができる
- コードを再利用できる

##使用例

■CSSで入れ子の記述

```ruby:stylesheet.css
.header {
  height: 60%;
}

.header ul {
  font-size: 15px;
}

.header ul li {
  font-size: 10px;
}
```

■SCSSで入れ子の記述

```ruby:stylesheet.scss
.header {
  height: 60%;
  ul {
    font-size: 15px;
    li {
      font-size: 10px;
    }
  }
}
```

若干ネストしますが、便利っちゃ便利ですね。
ノートPCでGoogle検索を見やすくする方法

# ズバリGoogleの検索結果を2カラムにする

## やりかた
- Chromeに[Stylish](https://chrome.google.com/webstore/detail/stylish-custom-themes-for/fjnbnpbmkenffdnngjfgmeleoegfcffe?hl=ja)をインストール
- Stylishに[google-show-search-result-in-two-columns](https://userstyles.org/styles/93103/google-show-search-result-in-two-columns)をインストール


## 結果
<img src="https://qiita-image-store.s3.amazonaws.com/0/210/58c5cbc6-6590-e270-86f3-6d02dd31ec99.png" width=70%>
ノートPCの高さでも全ての検索結果が、スクロールすることなく視認できるようになる。

## おまけ
[quick-custom-gsearch](https://chrome.google.com/webstore/detail/quick-custom-gsearch/dcdmfmmmmpjgfaffnaokjpifnihmhaon)を入れると期間指定も検索結果に表示されるので尚使い勝手が良くなる

<img src="https://qiita-image-store.s3.amazonaws.com/0/210/65db287f-0507-0ae9-c604-3f98f5155a84.png" width=70%>