OmniAICreator/Qiita-1.07M huggingface dataset:
MATLABで簡単システム同定（簡易）



# データ取得
まずは適切な入力を作成して入出力のデータを得る。

## Chirp信号作成
簡単に作れて，かつそこそこの同定をするならChirp信号を用いる。
simulinkのブロックはなんか挙動が思ったように行かなかったので，Mfunctionで作成。

Linearな信号で良ければ1行で作成可能。
下記wikipediaの記事を参照。
https://ja.wikipedia.org/wiki/%E3%83%81%E3%83%A3%E3%83%BC%E3%83%97%E4%BF%A1%E5%8F%B7


- u: clockから得た時間
- f0: 最小の周波数
- f1: 最大の周波数
- Tchirp: 一度のsweep時間
- phi0: 初期位相（0でよさそう）

```matlab

sin(phi0+2*pi*(f0*rem(u,Tchirp)+(f1-f0)/2/Tchirp*rem(u,Tchirp)^2))
```

こんなかんじ。rem関数を使って周期的な動作を可能にしているのがミソ。

# 解析
そんでもって得たデータをin,outとする。

以下のがその一例。
(https://qiita-image-store.s3.amazonaws.com/0/188863/1243447c-53d8-b6a2-4eee-6a1d2d42dfa3.png)


## 周波数応答の同定

freqは当然周波数だが，winsizeは得られたデータをどのサイズで窓関数に打ち込むかを与える。
感覚的には`Tchirp*freq`で良さそうだが，間違ってたら指摘してください。

```matlab

[PXX,FREQ] = tfestimate(in,out,winsize,[],[],freq);
Txx = frd(PXX,FREQ*2*pi,1/freq);
```

2行目でFREQに2*piをかけているのはHzからradに変換する必要があるため。どこかパラメータ設定すればこんなことしなくて済んだ気もする。

ボード線図を引いて見ればキレイに表示されていることと思う。

```matlab

Bode(Txx)
```

また，Coherenceを取得するのもコマンド一つで済む。

```matlab
[COHER,cFREQ] = mscohere(in,out,winsize,[],[],freq);
semilogx(cFREQ,COHER);
```

coherenceが小さいほどあんまり信用できないデータということになる。


## お手軽フィッティング＆システム同定

invfreqsという関数を用いることで簡単にフィッティングができる。学生はmatlabに課金すべき。

コマンドの使い方は以下の通りで先程tfestimateで生成したPXXとFREQを用いる。（必要に応じてradに変換すること！）

```matlab
[num den] = invfreqs(PXX,FREQ*2*pi,nd,dd,weight,iter)
```

- 3,4番目のnd,ddは分子と分母の字数で1次/2次なら,1,2と綴る。![octave-online-line-30.png]
- weightは重み関数である。Coherenceから作成するとスムース。
- iterはイテレーション回数。大体10回やっておけばまぁまぁ近い値になる。

### 重み関数作り方例

周波数帯がminf～maxfの間の情報のみかつ，Coherenceが0.95以上の周波数応答を用いてfittingするとする。
こんなかんじに書ける。簡単でしょう。

```matlab
weight = zeros(size(COHER));
weight(COHER>0.95) = 1;
weight(cFREQ >= fmax)= 0;
weight(cFREQ <= fmin)= 0;
```


# Sample Code（バグあり）
今matlabが消えたPCでやってるので後でちゃんと内容を確認する。あとで。

```matlab
%% simulation set
close all
freq = 1000; %1000hz

%% 0. Define system
% system (ground truth) 
sys = tf([0.6],[0.02,10]);
figure;bode(sys);

%% 1. read data and set in/out data example

% make chirp signals
time = 0:1/freq:10;
CHP=chirp(time,0.5,2,50);
out=lsim(sys,CHP,time);
in=CHP;

%%load('result.data');
%time = result(:,1);
%in = result(:,2);
%out = result(:,3);

figure(1); plot(time,in,time,out);
xlabel('time[s]')
ylabel('in[A]/out[rad/s]')
legend('In','Out')
grid on;

%% 2. Get bode plot with tfestimate
windowsize = 2000;% this is not nessesary
[PXX,FREQ] = tfestimate(in,out,windowsize,[],[],freq);
Txx = frd(PXX,FREQ,1/freq);

figure(2); 
%opt = bodeoptions('cstprefs');
%opt.PhaseWrapping = 'on';
%opt.PhaseWrappingBranch = -180;
%bode(Txx,opt);
bode(Txx);
title('Freq responce')

%% 3. Get coherence mscoherence
[COHER,cFREQ] = mscohere(in,out,windowsize,[],[],freq);

figure(3); semilogx(cFREQ,COHER);
title('coherent')
xlabel('Freq [Hz]')
%% 4. fitting1
% Chirp Sweep Range
fmax = 50;
fmin = 0.5;

% choose weight from coherence
weight = zeros(size(COHER));
weight(COHER>0.95) = 1;
% use only 0.5--50 Hz
weight(cFREQ >= fmax)= 0;
weight(cFREQ <= fmin)= 0;

% estimate transfer function !
[num den]=invfreqs(PXX,2*pi*FREQ,0,1,weight,10);

% figure;bode(tf(num,den));
fitsys = tf(num,den);

figure(4);bode(sys,fitsys);
legend('ground truth','Estimated')
xlim([fmin fmax])

```
[python] リストから複数のインデックスを指定して値を取得・削除するまとめ

## やりたいこと
タイトルの通り，リストから複数のインデックスを指定して値を操作する．

## 環境
```
python 3.6.6
numpy 1.12.1
```
## 指定した複数のインデックスの値を取得

```python:input
sentence = ["why","japanese","people","!!"]
```

イメージとしては`sentence[0,2]`とした時に`['why','people']`が取れてほしい．
ではどうするか...

```python:python3
from operator import itemgetter
print (itemgetter(0,2)(sentence)) # ('why', 'people')
```

`itemgetter`はpython2.5以降から使えるようになったみたい．それ以前は内包表記などでベタ書きだったのか？その方がわかりやすい気もするが．

参考：[リストのインデックスを複数指定する（Python）](https://qiita.com/knqyf263/items/657d5f96cf7540ba59d2)



## ランダムな複数のインデックスの値を取得
インデックスの指定をランダムにするだけ．2つのリストから複数の同じインデックスで値を取得したい時に．
`np.random.choice`の引数`replace`を指定しなければ，重複ありでサンプルする．

```python:python3
from operator import itemgetter
import numpy as np
datasetA = ["a","b","c","d"]
datasetB = [1,2,3,4]
data_size = len(datasetA)
sample_size = 2

shuffled_idx = np.random.choice(np.arange(data_size), sample_size, replace=False)
datasetA_random_pickup = itemgetter(*shuffled_idx)(datasetA)
datasetB_random_pickup = itemgetter(*shuffled_idx)(datasetB)
```

## 複数の指定したインデックスを削除

```python:input
sentence = ["why","japanese","people","!!"]
```

イメージとしては`del sentence[0,2]`とした時に`['japanese','!!']`だけ残ってほしい．
ではどうするか...

```python:python3
dellist = lambda items,indices: [item for idx,item in enumerate(items) if idx not in indices]
del_idx = [0,2] # 削除するインデックス
sentence_deleted = dellist(sentence, del_idx) # ['japanese','!!']
```

結局，内包表記で行う操作を`dellist`というラムダ式で隠蔽してるだけ．
`itemgetter`の削除バージョンのようなものはないのだろうか…

参考：[pythonリストの複数要素削除](https://qiita.com/saa/items/d18a36d764c74fc8bf26)


### 追記(2019.7.22)
`itemgetter`の仕様に合わせた、`itemremover`なるものを自作するとすれば以下のような関数になります。
@shiracamus さんのコメントより。ありがとうございます！


```python:python
def itemremover(*items):
    def g(obj):
        if hasattr(obj, 'keys'):
            return tuple(obj[key] for key in obj.keys() if key not in items)
        if len(items) == 1:
            if isinstance(obj, str):
                o = list(obj)
                del o[items[0]]
                return ''.join(o)
            else:
                o = list(obj)
                del o[items[0]]
                return tuple(o)
        if isinstance(obj, str):
            return ''.join(o for index, o in enumerate(obj) if index not in items)
        else:
            return tuple(o for index, o in enumerate(obj) if index not in items)
    return g
```


## まとめ
`itemremover`、公式実装されないかな…
Rails serverのプロセスを素早く落とす

あー、ローカル環境のRailsバグったなと思った時に待つのめんどいので強制的にプロセスを終了させる時のメモです。いつも自分でやってますが、久しぶりにQittaに投稿してみようと思ってサクッとメモに残しました。

```
$ rails server
=> Booting Puma
=> Rails 5.1.4 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.10.0 (ruby 2.4.1-p111), codename: Russell's Teapot
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
```

ご丁寧に `Use Ctrl-C to stop` で止めてねって書いてあるので、 `control + c` でサクッと消える時もあります。以下のように。

```
Use Ctrl-C to stop
^C- Gracefully stopping, waiting for requests to finish
=== puma shutdown: 2018-10-24 01:06:40 +0900 ===
- Goodbye!
Exiting
```

しかし、待てど暮らせどダメな時もあります。
そんな時は、 `lsof` コマンドで動いてるものを探し出してきて、killしましょう。

```
# 3000番で動いてるプロセス探す
$ lsof -i:3000
COMMAND   PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
ruby    33783 kanuu   19u  IPv4 0x1ee1c75a9552b9ad      0t0  TCP *:hbci (LISTEN)

# 上記のPIDの番号をkillする

$ kill -9 33783
```

```
# サーバーのログ

Killed: 9
```

これで止まったはずです。

以上です。

# 追記
ゴニョゴニョ書きましたが、ワンライナーでいけると教えていただきました。
便利です。勉強になりました。

```
$ kill -9 $(lsof -i tcp:3000 -t)
```

pumaをkillすることでもいけました。

```
$ pkill -f puma
```

# 参考記事

[Rails sのプロセスが切れない時](https://qiita.com/motty93/items/d22c1eb8f5128f8cd7f8)
[lsofコマンド入門](https://qiita.com/hypermkt/items/905139168b0bc5c28ef2)
ずんだの表見出し++問題 awkワンライナー 編

元ネタ: 
[ずんだの表見出し++問題 Ruby 編](https://qiita.com/tbpgr/items/427d35f981cd9675efb9) 
[ずんだの表見出し++問題 Go編](https://qiita.com/kentfordev/items/83f68b64b928a64e1e16)

# プログラム
```bash
echo -e "0|col1|col2|col3\n1|col1|col2|col3\n2|col1|col2|col3\n3|col1|col2|col3\n4|col1|col2|col3" | awk 'BEGIN {FS="|";OFS="|"} {print $1+1,$2,$3,$4}'
```

# 出力
```bash
1|col1|col2|col3
2|col1|col2|col3
3|col1|col2|col3
4|col1|col2|col3
5|col1|col2|col3
```
「特定のユーザと共有」設定のGoogleカレンダーをiOS標準カレンダーで表示

ひよこさんはGoogleカレンダーをiPhone標準カレンダーアプリで使用しており、
他アカウント（ハリネズミさん）が公開しているカレンダーを追加したい。

「一般公開」カレンダーの場合、勝手にカレンダー一覧で選択できるようになるため、アプリ上で簡単に設定できる。

「特定のユーザと共有」カレンダーの場合、カレンダーの一覧に表示されず、
[https://www.google.com/calendar/syncselect](https://www.google.com/calendar/syncselect)
でも、**「同期できません」**という欄に表示され、チェックボックスがグレーアウトされて選択できないようになっている。

シャイなハリネズミさんは「一般公開」してくれないので、ひよこさんは以下の方法で追加した。

参考記事：
https://discussions.apple.com/thread/2389534?answerId=2389534021#2389534021

環境：
iOS 12.0.1 
Languege English


## 共有するカレンダーの設定

ハリネズミさんは共有したいカレンダーを、Googleカレンダー上で「特定のユーザと共有」に設定し、ひよこさんのアカウントに権限を付与しておく。
権限の設定は何でも構わない。（たとえば予定の有無だけでも）

## iPhoneにCalDAVアカウントを追加

ひよこさんはiPhoneのホーム画面より、
Settings > Passwords & Accounts > Add account > Other > Add CalDaV account

- Server : https://www.google.com
- User Name : ひよこ@gmail.com
- Password : ***
- Description : （自動入力される）

を入力し、> Next へと進む。
認証が完了し項目の選択へ進んだら、「Calendar」を有効にして Save する。
この時点でカレンダー更新して開くと、ひよこさんのカレンダーが見える。

## CalDAVアカウントの設定を変更

上記で作成したCalDAVアカウントの設定を変更する。
Settings > Passwords & Accounts > ACCOUNTS: My CalDAV Account > Account > Advanced Settings

- Use SSL : 変更なし
- Port : 変更なし
- Account URL : https://www.google.com/calendar/dav/はりねずみ@gmail.com/user

に変更。

## カレンダーを確認

カレンダーアプリを起動し、Calendars の一覧を更新すると、

ハリネズミのカレンダー
Shared by はりねずみ@gmail.com

が追加されている。
チェックを入れればカレンダーの予定が表示される。

## [補足]Macのカレンダーに追加

Googleカレンダーで共有設定してもらうところまでは同じ。

環境設定で Googleアカウントを追加し、Calendar を同期対象に含めておく。
Calendar を開き、Preference > Accounts でひよこさんのアカウントを選択する。

Delegation タブに共有カレンダーの一覧が表示される。
「Show」をチェックした共有カレンダーが、Calendars 一覧に表示されるようになる。
jupyter lab でTerminal使えない方へ

# jupyterlabでTerminalが表示されない方いませんか？
pythonはずっとanaconda経由でjupyterlab使ってるのですが、会社のサーバー上のjupyterlabでは普通に使えるTerminalがなぜか自分のラップトップだと表示されないので、なんとかできないかと思っていました。
どこを調べても「jupyterlabはTerminalも使えて便利！！」みたいな資料しか見つからず困っていましたが、なんといまやっと解決方法見つけました。
```
pip install jupyter-console
```
だけでした！！

![スクリーンショット 2018-10-24 0.49.42.png](https://qiita-image-store.s3.amazonaws.com/0/265221/4cf48153-d760-0491-814a-66d4c45679fd.png)
やっとTerminalが使えました！！

もし困っている方いたらぜひ！
Web Storageとは-LocalStorage/SessionStorageの使い方-

みなさん、こんばんは！こんにちは！

今回は、ブラウザ内臓のweb storage（ウェブ ストレージ）についてです。

## storage（ストレージ）とは

webブラウザに内蔵されているデータを保管する場所のこと。
データベースなどを用いずにブラウザ自身にデータを持たせることが出来る。

※よく似たものとして、**クッキー**があるが全く違うものなので注意！

| 特徴      | ストレージ | クッキー     |
| ------- | ----- | -------- |
| データの期限  | なし    | あり（指定する） |
| データのサイズ | 5MB   | 4KB      |
| 通信      | しない   | する       |

## ストレージの種類

ストレージには大きく分けて２種類ある。

* **Local Storage**（ローカルストレージ）

  * ブラウザを閉じてもデータを維持。
  * 破棄にはJSでデータのクリアまたは、ブラウザキャシュ/ローカルのクリアが必要
* **Session Storage**（セッションストレージ）

  * ブラウザ（または、タブ）を閉じるとデータは破棄される。

※一見するとLocal　Storageのほうが良さそうに見るが注意点がある。

Local Storageは明示的にデータを消さない限りは、ストレージにデータが残るので、

思わぬバグを引き起こす可能性がある。

## 使用中のブラウザでweb storageが使えるかの確認

web storageは、すべてのブラウザで使用できるわけではございません。

[こちら](https://developer.mozilla.org/ja/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API#testing_for_availability)のページを参考にお使いのブラウザで使用できるか確認しましょう。

## ストレージにデータを保存する／取得する

ストレージを使う場合は、localStorage , sessionStorageプロパティを使う。

```javascript
var storage = localStorage; // または、sessionStorage
```

ストレージへの**保存**は、***setItem***メソッド。

データの**取得**は、***getItem***メソッド。

```javascript
storage.setItem(key, value);
storage.getItem(key);
```

## データを削除する

データの削除は以下である。

```javascript
storage.removeItem(key);
storage.clear(); //すべてのデータを削除
```

## オブジェクトをストレージに保存する

今までのやり方で、ストレージにデータを保存することが出来る。

しかし、一つ一つ、keyとvalueをデータ化するには**手間がかかる**し、**管理が難しくなってしまう**。

そこで、**オブジェクトをストレージに保存する**。

前提として、ストレージに保存することが出来る型は、**String型**である。

そのため、オブジェクトをオブジェクトに似た記法で書かれている**JSON形式**（String型）に変換する。

1. **オブジェクト** => **JSON文字列** => 保存
2. **JSON文字列** => オブジェクトに**復元** => 取得

```javascript
var cat = {
	name: 'ねこ',
	color: 'white',
	age: 5
};

storage.setItem('cat', JSON.stringify(cat));
//Key=>cat/Value=>{"name":"ねこ","color":"white","age":5} - ①

var getData = JSON.parse(storage.getItem('cat'));
console.log(getData['name']); 
//=>　ねこ - ②
```

## 使用上の注意点

web storage（Localstorage/SessionStorage）は、とてもシンプルな仕組みです。

容量にも制限があります。

使用する場合は、以下のデータに当てはまる場合を推奨いたします。

> * 重要な情報を一切含まない
> * 極端なハイパフォーマンスを要求されない
> * 5 MBに収まる
> * stringデータだけの情報
>
> 引用：[HTML5のLocal Storageを使ってはいけない（翻訳）](https://techracho.bpsinc.jp/hachi8833/2019_10_09/80851)

ユーザーの個人情報、クレカ情報、IDなど。

他者にデータを取得されてはいけないデータに関しては情報漏洩に繋がりますので使用をしないようにしましょう。

## まとめ

シンプルで便利な半面、セキュアでは無い一面も。

使用用途を明確にした上で取り入れましょう！

ただ、プログラミングを始めたばかりの方は、データのやり取りの勉強になるので一度触ってみてはいかがでしょうか？

以上。

## 参考ページ

* [Web Storage API の使用](https://developer.mozilla.org/ja/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API#testing_for_availability)
* [Storage](https://developer.mozilla.org/ja/docs/Web/API/Storage)
* [Window.sessionStorage](https://developer.mozilla.org/ja/docs/Web/API/Window/sessionStorage)
自作 Git GUIクライアント Guitar, v0.9

本日、Git GUIクライアント Guitar バージョン0.9のバイナリを公開しました。
http://files.soramimi.jp/guitar/0.9.0/

詳細は昨年12月の記事とGitHubのページをご覧ください。
https://qiita.com/soramimi_jp/items/8425196ddc28bf283333
https://soramimi.github.io/Guitar/v.0.9.0.html

自前ビルドする方は、C++とQt5の開発環境を構築して、下記からソースコードを取得してください。OpenSSLやzlibも必要です。ビルドにはQt SDKのほか、Rubyが必要になります。
https://github.com/soramimi/Guitar

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/61222/861e7518-c2ae-ab3a-2700-935e9c30a8ef.png)

PTYプロセス対応と簡易ターミナル機能を実装し、未知のSSHホストへのアクセス確認や、http(s)認証のユーザーID／パスワードの、GUIによる入力に対応しました。

GPG署名に対応しました。（鍵のインポートなどはコマンドラインでやる必要があります）

ダークテーマを実装しました。
![darktheme.png](https://qiita-image-store.s3.amazonaws.com/0/61222/ba4c62c0-0132-ba64-5330-98697edf5239.png)
ある程度動作しますが、描画が崩れるなど、完全ではありません。この機能は、バージョン1.0に向けての課題となっています。

macOS Mojaveでは、OSの機能でダークモードがサポートされましたが、Qt5側の対応が完全でないようで、白背景に白文字で描画されて、文字が読めなくなるなどの問題があり、ライトモードで使う方が良さそうです。一方、Guitarの設定でダークテーマを利用すると、ボタンの座標が他の要素と重なって描画されるなど、描画崩れが発生しますので、あまりおすすめできません。当方macOS Mojaveの環境がないため、ダークモードで使いたい方は、気長にお待ちください。
Rでちょっとだけ複雑なグラフをプロット(最大値にマーク、x軸と垂直に破線、矢印、グラフ中にテキスト、ライブラリshapeをインストール)

# 作りたいグラフ
みどりぼん（データ解析のための統計モデリング入門)にあるグラフ。

shapeを使わない方
![likelihood_2.png](https://qiita-image-store.s3.amazonaws.com/0/196857/5d70ce99-88c3-2cc0-884b-55b7f456ff4b.png)
shapeを使う方
![likelihood_3.png](https://qiita-image-store.s3.amazonaws.com/0/196857/db276aea-e08c-4c7a-8bb0-2556b0b9012d.png)


# コード
以下のようにすればかける。

```r:shapeを使わない方
# y用の関数
logL <- function(m) sum(dpois(data, m, log = TRUE))
# xデータ
lambda <- seq(2, 5, 0.1)
# プロット
plot(lambda, sapply(lambda, logL), type = "l")

# 最大値に該当するxを抽出
likelihood.max.x <- lambda[which.max(sapply(lambda, logL))]
# 最大値を抽出
likelihood.max.y <- max(sapply(lambda, logL))
# 最大値のプロット
points(likelihood.max.x,likelihood.max.y, pch=4)

# x軸と垂直な破線
abline(v=likelihood.max.x, lty=2)
# 矢印
arrows(4.0, -115, likelihood.max.x, -121)
# テキスト
text(4.1, -113, expression(hat(lambda)))
```

```r:shapeを使う方
# shapeのインストールおよびインポート
install.packages("shape")
library(shape)

# y用の関数
logL <- function(m) sum(dpois(data, m, log = TRUE))
# xデータ
lambda <- seq(2, 5, 0.1)
# プロット
plot(lambda, sapply(lambda, logL), type = "l")

# 最大値に該当するxを抽出
likelihood.max.x <- lambda[which.max(sapply(lambda, logL))]
# 最大値を抽出
likelihood.max.y <- max(sapply(lambda, logL))
# 最大値のプロット
points(likelihood.max.x,likelihood.max.y, pch=4)

# x軸と垂直な破線
abline(v=likelihood.max.x, lty=2)
# 矢印
Arrows(4.0, -115, likelihood.max.x+0.1, -122+1, arr.type = "triangle") 
# テキスト
text(4.1, -113, expression(hat(lambda)))
```
# 説明(shapeパッケージを使わないバージョン)

```r:最大値の抽出
# 最大値に該当するxを抽出
likelihood.max.x <- lambda[which.max(sapply(lambda, logL))]
# 最大値を抽出
likelihood.max.y <- max(sapply(lambda, logL))
```
which.maxは最大値に該当するインデックスを返す[[1]](#参考文献)。
最大値になっているxの値を求めるたいので、xのデータであるlambdaのインデックスをwhich.maxで指定すれば良い。
maxは最大値を返すので、そのまま代入すれば良い。

```r:x軸と垂直に破線
abline(v=likelihood.max.x, lty=2)
```
abline(v=x)またはabline(h=y)でx軸に垂直または水平に直線が引ける[[2]](#参考文献)。

```r:矢印作成
arrows(4.0, -115, likelihood.max.x, -122)
```
arrowsは(始点x, 始点y, 終点x, 終点y)の順[[3]](#参考文献)。

```r:テキストおよび数式
text(4.1, -113, expression(hat(lambda)))
```
テキストはtext(x, y, 内容)。今回はハットをつけてたλを出力したかったのでexpressionを用いている[[4]](#参考文献)。

これで上記のプロットが出力される。
矢印がダサいのでライブラリをインポートしてそれっぽく見せてみる。

# 説明(shapeを使うバージョン)
```r:shapeをインストールおよびインポート
install.packages("shape")
library(shape)
```
外部ライブラリを使うためにinstall.packagesを使ってインストールし、libraryを使って呼び出す[[5]](#参考文献)。

```r:shapeを使った矢印
Arrows(4.0, -115, likelihood.max.x+0.1, -122+1, arr.type = "triangle")
```
shapeを使った矢印は最初が大文字のArrowsを使えば良い。arr.typeで"triangle"を指定すればそれっぽい矢印になる。(詳細はshapeのマニュアル[[6]](#参考文献)を参照。)
また、今回の例では、"矢印が棒に三角形が組み合わさって矢印になっている"と考えた時の、棒の座標を指定している。
そこに三角形がたされるので、矢印で指している座標がずれてしまう。
そのために座標を微調整する必要があるので注意が必要。

# 参考文献

[1] https://qiita.com/stkdev/items/6aba2c1db2fa056170ae
[2] http://d.hatena.ne.jp/myopomme/20111222/1324551313
[3] http://cse.naro.affrc.go.jp/takezawa/r-tips/r/51.html
[4] https://stats.biopapyrus.jp/r/graph/expression.html
[5] https://stats.biopapyrus.jp/r/basic/package.html
[6] https://cran.r-project.org/web/packages/shape/shape.pdf
[Laravel 5.7] Eloquent Modelのfillableとguardedの違い

# 前提知識

以下のように大雑把にモデルを作成するとき、ユーザー入力値を反映したくない属性を保護する必要があります。
ちなみに、このように配列を渡してモデルを作成することをドキュメントでは複数代入と言っています。

```php
Model::create($request->all());
// または
new Model($request->all());
```

保護するには、モデルにfillableまたはguardedプロパティを指定します(どちらか片方のみ)。
fillableはホワイトリストで、guardedはブラックリストです。

```php:BarModel
protected $fillable = ['name', 'hobby'];
// または
protected $guarded = ['id', 'created_at', 'updated_at'];
```

保存時に結構違いが出ます。

# fillableを指定した場合

モデルがその属性以外を持ちません。

```php
// protected $fillable = ['name', 'hobby'];

$model = new Model([
    'id' => 9999,
    'name' => 'Suzuki',
    'hobby' => 'Music',
    'created_at' => '2000-01-01 12:00:00',
    'updated_at' => '2000-01-01 12:00:00',
    'hoge' => 'fuga',
]);

$model->getAttributes(); // ['name' => 'Suzuki', 'hobby' => 'Music']

$model->save(); // 成功
```

# guardedを指定した場合

モデルからその属性が取り除かれます。

```php
// protected $guarded = ['id', 'created_at', 'updated_at'];

$model = new Model([
    'id' => 9999,
    'name' => 'Suzuki',
    'hobby' => 'Music',
    'created_at' => '2000-01-01 12:00:00',
    'updated_at' => '2000-01-01 12:00:00',
    'hoge' => 'fuga',
]);

$model->getAttributes(); // ['name' => 'Suzuki', 'hobby' => 'Music', 'hoge' => 'fuga']

$model->save(); // エラー。hogeカラムはテーブルにない
```

# どちらがおすすめか

保存するときは$request->all()でも何でもブチ込めるfillableの方が楽です。
どういうモデルにguarded使うと良いのでしょうかね・・・
ActiveModel::Attributes.attribute で配列を使う

# 概要
仕事でActiveModelを利用した時にはまった内容。

# 内容
## やりたかったこと
```ruby:app/model/hoge.rb
class Hoge
  include ActiveModel::Model
  include ActiveModel::Attributes

  attribute :fuga, :array # 配列で保持できるようにしたい
end
```
はい、無理でした。。
そもそも`ActiveModel::Type`で配列は定義されていない。。（[ref](https://github.com/rails/rails/blob/master/activemodel/lib/active_model/type.rb#L41)）

## どうしたか
とりあえずsourceを見つつ以下のようにしてみたら動いた

```ruby:app/model/hoge.rb
class Hoge
  include ActiveModel::Model
  include ActiveModel::Attributes

  attribute :fuga, array: :integer
end
```

## とりあえずは動いたが...
本当にこれでいいのかちゃんと調べないとなぁ...
あなたの会社を魅力的にする方法

無料ドリンクバーがある。

ドリンクバーはファミレスでも低価格で提供しているくらいなので、もともと原価はとても安いはず。
それなのに社員サービスとして提供している会社は少ない。
こういうちょっとしたサービスが無料で受けられるだけで、求職者にとってはとても居心地のよさそうな会社に見えるはず。

自販機やコンビニで飲み物を毎日買うと値段もバカにならないので、これは結構いい気がする。
エンジニア（プログラマ）が成長するために大事なこと（環境編）

働きながらスキルを高めて、
　将来高いお給料をもらいたい！
　楽しく働きたい！
　毎日定時で帰りたい！
と思っているエンジニアの方は多くいらっしゃることでしょう。

ただ、技術的なスキルはなかなか身につくものではないというのも誰しも感じていることではないでしょうか？

そこで、最大限スキルを伸ばすために、大事なポイントだと思った点を忘れないように記載しておきます。

##スキルが同じくらいの人と一緒に仕事をする
#####スキルが同じくらいの人とは相談がしやすく、一緒に教えあいながら仕事ができる。
#####スキルに差があると良い関係でないとなかなか教えてくれない.

##定時退社
#####当たり前だが、とても大事なポイント。
#####平日もしっかり勉強する時間として活用する。
社会人になって良く使う様になったGit集

学生の頃は
「statusで状態みて、addして、commitして、pushすればOK!」
くらいしか考えてなかった ﾋｯｸ(ฅωฅ`)ﾋｯｸ

# git diff
どうやってコミットを分けるか見たいときや、
自分が変えたコードがどうなってるか見たいときに使用。
`git status`と併用してこれを使うことが多くなりました

# git add -p
gitを一定のひとかたまりごとにaddしていける!!
今までは脳死でファイルでコミット（というか`git add .`）してたけど、
コミットごとにやっていることを分けたかったので、最近はもっぱらこれ。
`y`でそのひとかたまりをコミットする
`n`でそのひとかたまりはコミットしない
さらに、gitが提示してきたコミットが大きかったら`s`でさらに分割。べんり。

# git log --oneline
logが
`XXXXXXX commitしたよ-‼️`
の様に、1行で出て、コミットidも7文字しか出なくなる！
何がいいって、bitbucketへのコミットidの貼り付けが簡単にできる。べんり。
わたしはこれを'logg'という名前でエイリアスはっています。

# git stash系
他ブランチに移動したら「これコミットしてから移動しなさいよ！！」って
怒られること...あるある〜〜〜😃
そういう時は`git stash`で、コミットを別の場所に一時保存しておけます。
何個でも保存しておけます。
他ブランチに移動して、作業を終えて、元のブランチに戻ってきたときは
`git stash pop`で、最新のstash を元に戻せます。
どのコミットか選びたかったら
`git stash list`
で、`git stash apply stash@{X}` (Xには数字が入ります)
popで失敗したことがあるので、↑を使うことをおすすめします

# git merge --no-ff origin XXXX(ブランチ)
自分のブランチに、XXXXのブランチの差分を取り込み、かつ
それが差分として出ないやつ！！！！！！
メリットは、自分の変更分として出ないことで、bitbucketのプルリクが汚れない😆
これはでもあれですね、チーム開発してて、XXXXのブランチに他の人のコミットが出る可能性がある時にしか使わないですね

---

ぱぱぱ〜〜と思いつくのはこれくらいですかね〜〜〜〜
いや〜〜〜〜gitちょっと夢があるなぁって思っています。
でもいまだにgitで業務時間潰されたりすることがあるので、まだまだだなぁって思います・
もっと高度なgitコマンド集がかけるように精進します(´･_･`)
AWSでWindowsを立ち上げRDPで作業する方法(2018年版)


1. AWS EC2でWindowsのインスタンスを作成し

2. ローカルPC(Windows)からリモートデスクトップで入って作業する

## AWS EC2でWindowsのインスタンスの作成方法
図解


EC2のダッシュボードからEC2インスタンスを作成する

![スクリーンショット 2018-10-23 23.19.38.png](https://qiita-image-store.s3.amazonaws.com/0/62413/28be4055-63f9-3cdd-d3d6-95c59bb863b9.png)

Windows Serverはよく分からないので、
新しそうなWindows Server 2016 Baseを選ぶ

![スクリーンショット 2018-10-23 23.19.48.png](https://qiita-image-store.s3.amazonaws.com/0/62413/b76a7a00-5e31-0171-fadb-491d28bdc281.png)

インスタンスは適当に選ぶ
※ ストレージタイプはまずは「EBS」でよいでしょう
[5分でわかるAmazon　EBS　 | ナレコムAWSレシピ](https://recipe.kc-cloud.jp/archives/7534)

![スクリーンショット 2018-10-23 23.20.21.png](https://qiita-image-store.s3.amazonaws.com/0/62413/de94112b-42de-4300-9535-29607dff0a98.png)

ネットワークの設定をする

※ ここでパブリックIPが設定されてないと、
インスタンスが作成されたあとインスタンスに接続できないことがある
※ 青枠の部分はデフォルトで良いはず
* 一番したのネットワークインターフェイスは新しいネットワークインターフェイスになっていれば、多分大丈夫

![screencapture-us-west-2-console-aws-amazon-ec2-v2-home-2018-10-23-23_20_46.png](https://qiita-image-store.s3.amazonaws.com/0/62413/7c5756c2-40ef-9e73-3fd8-5c5373d51758.png)


ストレージの設定

※ デフォルトで

![スクリーンショット 2018-10-23 23.21.55.png](https://qiita-image-store.s3.amazonaws.com/0/62413/90f1cf6c-9348-3c6e-2365-cca2b13207a8.png)

キー

※ タグにNameを追加しておくと、あとでわかりやすくなる

![スクリーンショット 2018-10-23 23.22.13.png](https://qiita-image-store.s3.amazonaws.com/0/62413/e85e4f0e-86f5-f095-13e0-85e02a8955f9.png)


セキュリティグループ

※ デフォルト
windowsインスタンスの場合は、RDP用に3389が空いている

![スクリーンショット 2018-10-23 23.22.16.png](https://qiita-image-store.s3.amazonaws.com/0/62413/1125aa98-85e5-cd26-f730-cb03113674c8.png)


おしまい

![screencapture-us-west-2-console-aws-amazon-ec2-v2-home-2018-10-23-23_22_22.png](https://qiita-image-store.s3.amazonaws.com/0/62413/3ec4c00c-5647-348b-98cf-a8490040b3ed.png)

![スクリーンショット 2018-10-23 23.23.08.png](https://qiita-image-store.s3.amazonaws.com/0/62413/89567414-56b4-52c2-935f-2cdfe836c8df.png)

適当な名前でキーペアを作って、ローカルにダウンロードする。絶対に無くしてはいけない。一回しかダウンロードできない

![スクリーンショット 2018-10-23 23.23.01.png](https://qiita-image-store.s3.amazonaws.com/0/62413/d99baeda-7918-79dd-ce7b-3429ced7f217.png)



## 2. ローカルPC(Windows)からリモートデスクトップで入って作業する

EC2のダッシュボードに、今回つくったインスタンスがあるか確認できるはずです
※ キー["Name"]に設定した名前があるはず

![スクリーンショット 2018-10-23 23.24.11.png](https://qiita-image-store.s3.amazonaws.com/0/62413/b781abf8-6062-0b7a-92dd-072434cdef0c.png)

「接続」を押す


![スクリーンショット 2018-10-23 23.24.27.png](https://qiita-image-store.s3.amazonaws.com/0/62413/2da0057a-7481-d310-e019-164978e2c1cd.png)

1. リモートデスクトップファイルのダウンロードをおして、リモートデスクトップ用のアクセスファイルを落とす. 

2. パスワードの取得をクリック

(画像がない) キーペーアをアップロード => 「パスワードの復元」を押すとパスワードが表示される

3. ユーザ名とパスワードを「メモ」

準備完了

## 3. リモートデスクトップでアクセス

(画像なし)

先ほどダウンロードした. 
「ec2-*******.us-west-2.compute.amazonaws.com.rdp」を「クリック」
すると、リモートデスクトップが立ち上がるはず

そして、先ほど「メモ」したユーザ名とパスワードでログインできる!


エンジョイ！

(追記 2019/2/16)
- Windows7系を使いたい場合は Windows Server 2008 R2を使うと良い. 例えば、Windows_Server-2008-R2_SP1-English-64Bit-Base-2019.02.09 (ami-0b29b8fc87f1aecd5)
mysql.server startで発生したThe server quit without updating PID fileエラーの解決方法

`mysql.server start`をすると`. ERROR! The server quit without updating PID file (/usr/local/var/mysql/mynameMacBook-Pro.local.pid).`と出たので備忘録として書きます。


エラー文を読んでみると、更新しないといけないよって言われている。
とりあえず、`cat /usr/local/var/mysql/mynameMacBook-Pro.local.err` でエラーログを確認



```
[ERROR] [MY-012526] [InnoDB] InnoDB: Upgrade after a crash is not supported. This redo log was created with MySQL 5.7.21. Please follow the instructions at http://dev.mysql.com/doc/refman/8.0/en/upgrading.html
```
このエラー文を発見
クラッシュしたままアップデートしてしまったためサポートされないらしいです

一旦、前のバージョンのmysqlをインストールして起動し、停止する

```
$ brew install mysql@5.7
$ /usr/local/opt/mysql@5.7/bin/mysql.server start
$ /usr/local/opt/mysql@5.7/bin/mysql.server stop
```

```
$ mysql.server start
Starting MySQL
... SUCCESS! 
```
成功しました。

やっとこれで使えると思い、
`mysql -u root`を入力し、`show databases;`とすると、

```
mysql> show databases;
ERROR 1449 (HY000): The user specified as a define ('mysql.infoschema'@'localhost') does not exist
```
次はこのようなエラー文が、、、

これはmysqlをアップグレードした時にユーザー設定がうまくいっていないため起こるエラーだそうです。


こちらの記事に解決方法が載っていました。助かります🙏
　　　　　　　　　　　　　⇩
[2018/6/30【番外編】MySqlの基礎を学ぶ2、Error Code: 1449 The user specified as a definerのエラーを解決させる](https://dailytextmining.hatenablog.com/entry/2018/06/30/203132)

こちらの記事を参考に、
`mysql_upgrade -u root`でアップグレード


[MySQLドキュメント](https://dev.mysql.com/doc/refman/5.6/ja/mysql-upgrade.html)にもアップグレードしてねって書いてました。。

これで無事使えるようになりました。
VS Code 1.28 の新機能 - パネル開閉ショートカットキーの挙動の変更

https://code.visualstudio.com/updates/v1_28#_toggle-panel-changes

パネル（出力、デバッグコンソール、ターミナル、問題）の開閉を行うショートカットキーの挙動が変更になった。

今まではパネルが開いている状態でショートカットキーを押せば必ずパネルが閉じたが、今回のリリースでは、パネルが表示されていてかつフォーカスが別の場所にあるときにショートカットキーを押すと、パネルを閉じるのではなくそのパネルにフォーカスが移動するようになった。

![panel_close.gif](https://qiita-image-store.s3.amazonaws.com/0/181011/9eaccb58-f695-7604-27e9-ebaf672fc1c4.gif)

なるほどねー。確かにこれはこれで便利かも。
PHPUnitのデータプロバイダーを試す

phpunitの[データプロバイダー](https://phpunit.readthedocs.io/ja/latest/writing-tests-for-phpunit.html)を試したというお話。

composer.jsonの作成

```
{
    "require-dev": {
        "phpunit/phpunit": "*"
    },
    "autoload": {
        "psr-4": {
            "Sample\\": "src/"
        }
    }
}
```
```
$ composer update
$ tree

/
|--composer.json
|--composer.lock
|--src
| |--Sample.php
|--tests
| |--SampleTest.php
|--vendor
```

Sample.phpとSampleTest.phpを作成
SampleTest.phpのadditionProviderがデータプロバイダー

```Sample.php
<?php
namespace Sample;
class Sample {
    // $a + $b を返す
    public function Add($a, $b) {
        return $a + $b;
    }
    // $a - $b を返す（実際は間違っている）
    public function Sub($a, $b) {
        return $a + $b;
    }
}
```
```SampleTest.php
<?php
use PHPUnit\Framework\TestCase;
use Sample\Sample;
class SampleTest extends PHPUnit\Framework\TestCase {
    public function test_add() {
        $sample = new Sample();
        $this->assertEquals(10, $sample->Add(4, 6));
    }
    /**
     * @dataProvider additionProvider
     */
    public function test_sub($ans, $a, $b) {
        $sample = new Sample();
        $this->assertEquals($ans, $sample->Sub($a, $b));
    }
    public function additionProvider() {
        return [
            [1, 7, 6],
            [2, 8, 6]
        ];
    }
}
```

```
PHPUnit 7.4.0 by Sebastian Bergmann and contributors.
.FF                                                                 3 / 3 (100%)
Time: 28 ms, Memory: 4.00MB
There were 2 failures:
1) SampleTest::test_sub with data set #0 (1, 7, 6)
Failed asserting that 13 matches expected 1.
/tests/SampleTest.php:18
2) SampleTest::test_sub with data set #1 (2, 8, 6)
Failed asserting that 14 matches expected 2.
/tests/SampleTest.php:18
FAILURES!
Tests: 3, Assertions: 3, Failures: 2.
```
Android Studio 開発　はじめてみた（初心者向け）

#androidアプリを開発しようとしたきっかけ
アプリ開発に元々興味があったが、いざ始めてみると難しい・・・（初めにやったときはeclipseでの開発）
最近android studioでの開発が主流になっているとのことなので初めてみた

#androidアプリのいいサンプル
最初何作ろうかなーと考えたときに最初に浮かんだのが「メモ帳」
色々記事を見ながら参考にしてきたが、下記記事が一番勉強になった。

[Android Studio] メモ帳を作ろう！（その１）
https://high-programmer.com/2017/09/01/android-studio-memo-app-1/

めちゃくちゃ参考になる＆便利なメモ帳が作れるということでめちゃめちゃおすすめです

#実際にリリースしたアプリ
参考にして、バージョンアップしたのをGoogle Playにあげてみたので
興味があればぜひインストールしてみてください

**メモめも**
https://play.google.com/store/apps/details?id=com.miyas.simplememo
SlackにWebHookを送るときに+記号がスペースに置き換えられる問題の対応

SlackにWebHookを送るときに+記号がスペースに置き換えられる問題の対応です。
この問題の解決に1,2時間掛かったのでメモしておきます…。

こんな感じでSlackにWebHookを送ろうと思っていたのですが、この例では+の部分がスペースに置き換わってしまいす。

```PHP
$params = [
    'title' => "タイトル",
    'text' => "プラス記号がスペースに置き換わる→+←",
    'channel' => $channel,
    'username' => $username,
    'icon_emoji' => $icon_emoji,
    'mrkdwn' => true,
    'attachments' => [$attachments]
];
$payload = 'payload=' . json_encode($params);
$ch = curl_init($webhook_url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
```

バッククォートやダブルクォーテーションで括っても結果は同じ。
いろいろ試したり検索したりしていくうちにURLエンコードをすれば良いことに気が付きました。

ということでこのようにして解決。

```PHP
    'text' => urlencode("プラス記号がスペースに置き換わる→+←"),
```

後からよくよく調べてみるとドキュメントにちゃんとURLエンコードしろと書いてありました…
https://api.slack.com/docs/message-formatting
foreverコマンドでファイル変更すると自動再起動されるオプション

nodejsでファイルを変更するたびに再起動するのは手間がかかりますので、特定のディレクトリ以下のファイルを変更すると自動で再起動されるようにします。

## 環境
nodejs v4.2
centos6.9

foreverコマンドを使っています。
foreverを使えば、nodeコマンドでスクリプトを起動させなくても、起動したままになります。
インストール方法は
https://qiita.com/h1y0r1n/items/a2cf8f2e8d3d31ccba49


## コマンド
```
forever start -w --watchDirectory ./ script.js
```
`-w`オプションはファイルの変更を監視します。
`--watchDirectory`以下で監視対象のディレクトリを指定します。
上記では`./`なので、カレントディレクトリ以下を監視します。

上記のようにすれば、ファイルを書き換えるたびに再起動する必要がなく、自動的に再起動されるので、開発効率が上がります。


`forever -h`でも確認できます。

```
-w, --watch      Watch for file changes
--watchDirectory Top-level directory to watch from
```

<br>
以下を参考にさせていただきました。
https://github.com/foreverjs/forever/issues/590
processingの実行ボタンでprocessingが固まるあなたへ

学校の授業でプロセシングを使う機会があって、processing3をいざ入れてみたもののサンプルが動かない。てか実行ボタンを押したらプロセシングが固まる。
再ダウンロードしてみても、置く場所を変えても、プロセシングを変えても動かない。いろいろ不必要と思われるソフトをアンインストールするも状況は変わらない。いろいろ試すこと3週間....

そんなあなたに向けた記事です。

まずタスクマネージャーを起動しましょう(Ctrl + Alt + Del)
↓
スタートアップに行ってこんなアプリがスタートアップで立ち上がっていませんか？
「Adobe GC Invoker Utility」
![image.png](https://qiita-image-store.s3.amazonaws.com/0/289194/615f1219-43a1-e0a9-b07a-749bbcd73947.png)

これを無効にしましょう。

↓

再起動後、プロセシングのサンプルを起動

↓

動いた...

お役に立てれば幸いです。
たぶんおなじグラフィック系のソフトで競合したんじゃないかと思います
PHPでSimpleXMLElementを持ったオブジェクトをキャッシュしたい時

結論：__sleep()と__wakeup()を使う

以下のようなSimpleXMLElementをプロパティとして持ったクラスのオブジェクトを、Serializeしてキャッシュしたい場合があります。

```MyClass.php
<?php
namespace App;
use SimpleXMLElement;

class MyClass
{
    /**
     * @var SimpleXMLElement
     */
    public $xml;

    /**
     * @param  SimpleXMLElement  $xml
     * @return void
     */
    public function __construct(SimpleXMLElement $xml)
    {
        $this->xml = $xml;
    }
}
```

例えばこのクラスのオブジェクトをLaravelでそのままキャッシュしようとすると、「SimpleXMLElementをシリアライズできないよ」というエラーで怒られます。

解決策としてPHPのマジックメソッドである__sleep()と__wakeup()を使用します。
先ほどのMyClassに以下のメソッドを追記。

```php
    public function __sleep()
    {
        $this->xml = $this->xml->asXml();

        return ['xml'];
    }

    public function __wakeup()
    {
        $this->xml = simplexml_load_string($this->xml);
    }
```

シリアライズされる前に__sleep()が呼ばれ、その中ではSimpleXMLElementをXML文字列に変換しています。
そしてアンシリアライズされる時に__wakeup()の中で再度SimpleXMLElementに変換するような形。

参考：PHP: マジックメソッド - Manual
http://php.net/manual/ja/language.oop5.magic.php

## Laravelの時の注意点
Laravelではrememberという**キャッシュがなければオリジンを取得し、そして保存して返す**というメソッドがあります。
保存して返すというところがミソですが、これは以下のような問題を引き起こします。

1. MyClassをキャッシュへ保存しようとする
2. 保存する際に__sleep()メソッドによりxmlプロパティがstringへ変換される
3. xmlプロパティがstringであるオブジェクトがrememberメソッドより返される

このように、初回（オリジンを取得する際）に__wakeup()が呼ばれないという事態に陥ってしまいます。
これは以下のように対処します。

```php
$item= Cache::remember('item', 30, function () {
    return new MyClass($someSimpleXMLElement);
});

if (is_string($item->xml)) {
   $item->__wakeup();
}

return $item;
```
macOS High Sierraでbrew cask --versionしたらCalling `brew cask --version` is deprecated and will be disabled on 2018-10-31! Use `brew --version` instead.となったときの対応方法

# 事象 : Homebrew Caskのバージョンを見ようとしたら警告が出た
```bash
$ brew cask --version
Warning: Calling `brew cask --version` is deprecated and will be disabled on 2018-10-31! Use `brew --version` instead.
Homebrew 1.8.0
Homebrew/homebrew-core (git revision e8065; last commit 2018-10-23)
Homebrew/homebrew-cask (git revision 26980; last commit 2018-10-23)
```

# 原因 : `brew cask --version`は使えなくなるから

限りなくつたない和訳
> `brew cask --version`は非推奨で、2018-10-31で無効になります！ 代わりに `brew --version`を使ってね。

# 対応 : 警告に従って`brew -v`を使う
```bash
$ brew -v
Homebrew 1.8.0
Homebrew/homebrew-core (git revision e8065; last commit 2018-10-23)
Homebrew/homebrew-cask (git revision 26980; last commit 2018-10-23)
```
外部ファイルをjs,cssファイルに読み込ませる方法

#Datarangepicksというカレンダーでの範囲指定ライブラリを使用した時の備忘録
datarangepickerの使い方としては、
以下の読み込みコードを、application.html.erbのheadの中に記入。

```
<script type="text/javascript" src="https://cdn.jsdelivr.net/momentjs/latest/moment.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/daterangepicker/daterangepicker.css" />
```

次に表示させたいページにviewのコードをコピペするだけで使える。
http://www.daterangepicker.com/ ←ここを参照。

#管理しやすいようにassetsにjs/cssファイルを作りそれを読み込む
このままでもいいのだが、管理しやすいように、application.html.erbに描き込みすぎないように
assetsにjs/cssファイルを作りそれを読み込むスタイルに変更する。

###①読み込み用のファイルを作る
assets/javascriptディレクトリ配下に以下の２ファイル作成
・moment.min.js
・daterangepicker.min.js

assets/cssディレクトリに配下に以下のファイル作成
・daterangepicker.css


###②それぞれのCDNのURL先に飛んでコピー　⇨　各ファイルに貼り付ける。

```<script type="text/javascript" src="https://cdn.jsdelivr.net/momentjs/latest/moment.min.js"></script>```

＊上記の以下部分に飛んで、そこのコードをコピペするってこと。⇨***https://cdn.jsdelivr.net/momentjs/latest/moment.min.js***

###③作成したファイルをapplucation.js, application.cssから読み込む


```application.js
//= require moment.min　　　　　　←jsとかの拡張子はいらない
//= require hoge/daterangepicker.min　　←ディレクトリがあればこのように考慮する
```

```application.css
 *= require daterangepicker　　←拡張子いらない。
```

たまに表示されないとかいう時は、位置に注意する。
同じディレクトリ以下の行に揃えるとかすると、表示されます。
docker-composeを使わずにnginx+php-fpm環境構築

自分の勉強の為にタイトルの件をやってみる
ただ環境を作りたいだけならdocker-composeを使ったほうがいいし、もっと言うとnginx+php-fpmのイメージをpullするのが早い

参考
[DockerでNginxとPhp-Fpmを起動する手順](https://inamuu.com/docker%E3%81%A7nginx%E3%81%A8php-fpm%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%99%E3%82%8B%E6%89%8B%E9%A0%86/)
[dockerのlinkオプションがレガシーなので、コンテナ間で名前解決できるようにネットワークを用意する](https://qiita.com/tamanobi/items/8b8dd64ae1f959f9ff9f)

### イメージのpull
nginxとphp-fpmのイメージをpull

```
$ docker pull nginx
$ docker pull bitnami/php-fpm
```
### ディレクトリやファイルの準備
マウントするディレクトリとか表示するPHP、nginxの設定ファイルを作る
php-fpmのコンテナ名はphpfpmとしてます

```
$ mkdir nginx-php
$ cd nginx-php
$ mkdir nginx
$ mkdir php

echo "<?php phpinfo(); ?>" > php/index.php
vi nginx/default.conf 
```
```default.conf
server {
    listen       80;
    server_name  localhost;
    root   /var/www/html;

    location / {
        index  index.html index.htm index.php;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        fastcgi_pass   phpfpm:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}
```

### ネットワーク作成
nginxとphp-fpmを接続するためのネットワーク作成
とりあえずネットワーク名をnginx_phpfpmに

```
$ docker network create nginx_phpfpm
```

### コンテナ起動

```
$ docker run --name phpfpm --network nginx_phpfpm -v $PWD/php:/var/www/html -d bitnami/php-fpm
$ docker run --name nginx --network nginx_phpfpm -v $PWD/nginx:/etc/nginx/conf.d -p 80:80 -d nginx
```

あとはブラウザから`http://localhost/index.php`へアクセスすればphpinfoの情報が見れるはず

docker-composeを使いこなせればdocker networkコマンドなんてほぼ使うことないのかな？
Railsでテンプレートに変数を渡す方法

## テンプレートに変数を渡す方法
複数のファイルから同じテンプレートファイルを読み込むときに、
それぞれの読み込みもとのファイルから異なる変数を値を渡したいとする

#### 読み込みもとのファイル

```erb:test.html.erb
<%= render "test/form", url: test_path %>
```


#### 部分テンプレート
読み込まれるpartialファイルでは特に何も定義せず、下記のように使えます

```erb:test/form.html.erb
<%= link_to "test", url %>
```
lseek関数とwrite関数でテキストデータからバイナリデータを作る（Windowsでうまくいかない）

テキストデータを読み込んで、バイナリとして吐くプログラムを書きました。
実行すると、Windowsでは失敗しましたが、Linuxではうまくいきました。原因は不明です。

Windows：Windows10、Eclipse、MingWG
Linux：CentOS7、Eclipse、CrossCompiler（VMWare Workstation上）

rawData.txtには1000～3000くらいの4桁の整数が適当に入っています。

Windowsで実行すると、17～18個目のデータを入れるときに、今まで「下位 上位」で書き込まれていたものが「下位 0D 上位」になって、それ以降のデータがおかしくなりました。後半の読み込みも、エラーで止まります。
（原因不明ですが、バイナリファイルが手に入ったので、個人的には完結しました）

【備考】
テキストデータをバイナリにした、という話をしたら「俺はfprintfで書く」と言われました。
手元にファイルディスクリプタでバイナリデータを読み書きするコードがあったから流用してしまったけれど、確かに普通はそうするなと思いました。

以下、コードです。
（includeとかもろもろそのまま）

```C++:main.cpp

#include <iostream>
#include <fstream>
#include <unistd.h>
#include <fcntl.h>

using namespace std;

int main(){
        cout << "start processing." << endl;
        string in_path = "rawdata.txt";
        string out_path = "binaryData";

        ifstream ifs(in_path.c_str());
        int fd;

        if(ifs.fail()){
                cout << "cannot read file." << endl;
                return 0;
        }

        string str;
        int ret;
        unsigned short writeData;
        int offset = 0;

        while(getline(ifs, str)){
                writeData = (unsigned short)stoi(str); // 65,535以下の場合、普通にキャストしても大丈夫

                cout << "writedata:" << writeData << endl;

                fd = open(out_path.c_str(), O_RDWR);
                ret = lseek(fd, offset, SEEK_SET); // 書き込む位置を調整
                if(ret < 0){
                        cout << "cannot seek data." << endl; // writeエラー
                        break;
                }
                ret = write(fd, &writeData, sizeof(unsigned short));

                if(ret < 0){
                        cout << "cannot write data." << endl; // writeエラー
                        break;
                }
                if(ret == 0){
                        cout << "failed to write data." << endl;
                }
                close(fd);
                offset += sizeof(unsigned short);
        }
        ifs.close();

        cout << "finished writing data to binary file." << endl;
        cout << "read binary." << endl;

        int fd2;
        unsigned short data;
        int dataLen;

        fd2 = open(out_path.c_str(), O_RDONLY);
        dataLen = sizeof(data);

        while(true){
                ret = read(fd2, &data, dataLen);
                if(ret < 0){
                        cout << "memory read error" << endl;
                        break;
                }
                if(ret == 0){
                        cout << "finish reading." << endl;
                        break;
                }
                cout << "read:" << data << endl;
        }
        close(fd2);
        return 0;
}

```

以上です。
NetBeans 9でJava EEを使えるようにする

初投稿です。わざわざ書く必要もなさそうだし、備忘録にもならなさそうですが、日本語の記事がなかったので。。。
# NetBeans 9でJava EEが使えない？？
最近（？）リリースされたNetBeans 9を早速（？）インストールしてみたら、Java EEでプロジェクトが作れなかったので、調べてみました。JDKとか、そういうのは入ってる前提でいきます。

## 開発環境
- mac OS High Sierra version 10.13.5


### 手順1: NetBeans 9をインストール
方法は問いません。私はターミナルからgit cloneして行いました。

参考) https://www.youtube.com/watch?v=I8gdC7BBtbs&t=12s
`cd Downloads`
`$git clone https://github.com/carljmosca/netbeans-macos-bundle.git`
`cd netbeans-macos-bundle`
`./install.sh`

### 手順2: Java EEサポートを有効にする
Tools > Pluginsを選択、Settingをクリック
真ん中右のaddをクリック
Name: NetBeans8.2 (名前は何でもいいです)
URL: http://updates.netbeans.org/netbeans/updates/8.2/uc/final/distribution/catalog.xml.gz
![image.png](https://qiita-image-store.s3.amazonaws.com/0/306009/d27cfdc2-7874-e17d-e647-b31da7352d58.png) 
(私はすでに追加済みなのでエラー出てます)

その後、Pluginsに戻りAvailable Pluginsの検索窓に`Kit`と入力
以下にチェックをつけInstallをクリック

- HTML5Kit
- JSF
- SOAP Web Services
- EJB and EAR
- RESTful Web Services
- Java EE Base


NetBeansをリスタートすれば、これで完了です。
その他glassfish5を入れるとかはまた気が向いたら書きます。

参考) https://vorozco.com/blog/2018/2018-07-30-NetBeans-9-JavaEE-JakartaEE.html
CSV出力時にページネーションの範囲だけじゃなくて、全件表示させたい。

#CSV出力で、ページネーションで設定した件数しか表示されない時
例えば下記のようなコードの場合だと、CSV出力させた時に***per(5)***でページネーションに指定した分のユーザーしか出力されない。

```
  def index
    @users = User.all.page(params[:page]).per(5).without_soft_destroyed
    #CSV出力
    respond_to do |format|
      format.html
      format.csv do
        send_data render_to_string, filename: "hoge.csv", type: :csv
      end
    end
  end
```



#11月9日:追記　CSV出力を全件表示
現状だと、CSV出力は最初に表示されている部分だけだった。
全件表示させるために以下のように修正。一行足すのみ。

```
  def index
    @messages = current_user.messages.page(params[:page]).per(3).order('updated_at DESC').search(params[:search])
    
    #CSV出力
    respond_to do |format|
      format.html
      format.csv do
      @messages = current_user.messages     ←ここ
        send_data render_to_string, filename: "message.csv", type: :csv
      end
    end
  end
```

CSV出力前に、再度定義し直すだけでOK

参考：https://teratail.com/questions/65361

csv出力参考
https://qiita.com/ngron/items/60915083cb2bc3622c79
pythonで3つの行列A,B,Cの内積はA@B@C

行列、A,Bの内積は

```Python:inner_product.py
import numpy as np
np.dot(A,B)
```

なので、ABCは

```Python:inner_product.py
np.dot(np.dot(A,B),C)
```
でもいいのですが、これだと少し、まどろっこしい。そこで、

```Python:inner_product.py
A @ B @ C
```

とすればスマート。次元さえ合っていれば、行列にかぎらず、ベクトルの内積でもOK.
gem mysql2がインストールできなかった時の対処


railsをインストールしてプロジェクトを作成し、サーバーを起動して
とりあえずHello worldしようと思った。　が、こけた

```
$ rails new [project_name] -d mysql -B
```


mysql2のgemがないと言われている

```
$ rails server
Could not find gem 'mysql2 (< 0.6.0, >= 0.4.4)' in any of the gem sources listed in your Gemfile.
Run `bundle install` to install missing gems.
```


検索して
https://qiita.com/nakki/items/e15c6b024d27edb2b96b
この辺りの記事を見つけたのでxcodeをアップデートとか必要なのかな・・・・？

と思っていたが、単にこの環境にmysqlが入っていなかっただけだった・・・

```
$ brew install mysql
$ brew upgrade mysql
```

このあとpumaとかsassとか古いgemがいくつかあったのだが、

```
$ bundle install
$ gem update
```
などしてrailsに必要なgemを揃えた。

```
$ rails server
=> Booting Puma
=> Rails 5.2.1 application starting in development 
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.0 (ruby 2.5.1-p57), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
Started GET "/" for 127.0.0.1 at 2018-10-23 22:14:02 +0900
```

localhostに3000番ポートでアクセスしていけました。


### 参考
https://qiita.com/unsoluble_sugar/items/1403ddf0ac9709b1aae6
OpenOffice( Calc )のMacro(Python)をコマンドラインで実行する等

# コマンドライン(Powershell)からMacro(Python)を実行する。

```powershell:sample.ps1
 C:\LibreOffice\program\scalc.exe
 C:\LibreOffice\program\soffice.exe 'vnd.sun.star.script:a1.py$a1?language=Python&locati
on=share'
```

## Python Scriptの置き場所
C:\LibreOffice\share\Scripts\python

### 参考
https://ask.libreoffice.org/en/question/40234/how-to-open-document-and-launch-python-macro-from-command-line/
https://blue21neo.blogspot.com/2016/12/libreofficecalcbasicpython.html
https://qiita.com/zanjibar/items/fa4d4c690cd07828d4f9
lambdaでAuroraを停止する

# やりたいこと

lambdaでAuroraを停止したい！

ただし[前回](https://qiita.com/blux2/items/fe0caaedb036ab79773a)同様の手順で行おうとすると、エラーが出ます。
エラーは以下の通り。

```
'RDS' object has no attribute 'stop_db_cluster'
```

調べると以下がひっかかります。
https://github.com/boto/boto3/issues/1723
lambdaがデフォルトで使用するboto3にはまだstop_db_clusterが実装されていないということですね。

というわけで基本的には[前回](https://qiita.com/blux2/items/fe0caaedb036ab79773a)と同様の手順を踏みますが、lambda関数をデプロイする部分だけ変更します。


# 準備
デプロイ用のディレクトリを作成します。

```
$ mkdir stop-aurora
```

上記ディレクトリに以下のpythonのファイルをおきます。

```stop-aurora.py

import boto3


def lambda_handler(event, context):
    dbcluster = 'testdb'
    client = boto3.client('rds')
    response = client.stop_db_cluster(DBInstanceIdentifier=dbcluster)
    print(response)
    return 0                          
```

# デプロイパッケージの作成
以下のドキュメントにしたがってパッケージを作成します。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html

1.最新のboto3をダウンロードする

```
$ pip3 install boto3 -t ./stop-aurora
```

2.zip圧縮する

```
$ cd stop-aurora
$ zip -r stop-aurora .
```

ここで注意したいのは、ドキュメントにもある以下の内容です。

> ディレクトリ自体ではなく、ディレクトリ内に含まれているディレクトリのコンテンツを圧縮します。ZIP ファイルの内容は、Lambda 関数の現在の作業ディレクトリとして利用できます (例: /project-dir/codefile.py/lib/yourlibraries)。この場合、/project-dir に含まれているコンテンツを圧縮します。

ディレクトリ自体を圧縮してしまうとlambda実行時に以下のエラーが出るので注意してください

```
"errorMessage": "Bad handler 'lambda_handler'"
```

3.aws cliで関数を作成する

以下のコマンドで作成できます。

```
$ aws lambda create-function \
--function-name stop-aurora \
--runtime python3.6 \
--role <lambda作成用ロール> \
--handler stop-aurora.lambda_handler \
--zip-file fileb://stop-aurora.zip
```

![test-aurora.png](https://qiita-image-store.s3.amazonaws.com/0/210944/c90b196e-88f8-c8b9-fd6f-8245f9349e00.png)

関数ができています！やったね！

あとは[前回](https://qiita.com/blux2/items/fe0caaedb036ab79773a)と同様の手順で実行できます。
Mojave 更新後の xcrun: error について

# 概要
- Mojave に更新後に `bundle install` した際に発生した `xcrun: error ...` の解決方法です。

# Error内容

```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

・・・・

xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

make failed, exit code 1

・・・

```

# 解決方法

```
$ xcode-select --install
```
baserCMS3.xで「(type:csrf)CSRF対策によるエラーです」でログインできなくなった時の一時的対策

> 不正なリクエストと判断されました。(type:csrf)CSRF対策によるエラーです。リクエストに含まれるCSRFトークンが不正または無効である可能性があります。
> エラー: The request sent to the address '/admin/users/login' was invalid.

ローカル環境で baserCMS3系を触っていると、以下のエラーに遭遇してログインできなくなった時の一時的対策メモ

<font color="Red">**※注意
baserCMSのコアファイルの修正は自己責任でお願いします！
決して本番環境には反映しないように！**</font>

# CSRFチェック機能をOFFにする

cakePHP2系のセキュリティのCSRFチェックを無効にします。

/lib/Baser/Controller/BcAppController.php

```php:/lib/Baser/Controller/BcAppController.php
if(BC_INSTALLED && (!$this->plugin || in_array($this->plugin, $corePlugins))) {
	// $this->Security->csrfCheck = true;
	$this->Security->csrfCheck = false; // カスタマイズ CSRF対策を無効に
} else {
```

これでローカル環境でも無事ログインできるようになりました。


参考記事）

- [Re: baserCMS3で、過去の「会員制サイトの構築」の情報はそのまま使えますか？｜フォーラム｜baserCMSユーザーズ](http://forum.basercms.net/modules/newbb/viewtopic.php?topic_id=1525&forum=5&viewmode=flat&order=ASC&start=10)
- [CakePHP2のセキュリティコンポーネントでCSRF対策のみ行う \- cakephperの日記\(CakePHP, Laravel, PHP\)](http://d.hatena.ne.jp/cakephper/20120204/1328281332)
- [CakePHP セキュリティ \- 2\.x](https://book.cakephp.org/2.0/ja/core-libraries/components/security-component.html#id5)
- [basercms3\.012で突然管理画面にログインできなくなる｜フォーラム｜baserCMSユーザーズ](http://forum.basercms.net/modules/newbb/viewtopic.php?topic_id=2763&forum=4)
-[Re: ブログ投稿時に「不正なリクエストと判断されました。\(type:csrf\)CSRF対策によるエラーです。リクエストに含まれるCSRFトークンが不正または無効である可能性があります。」がでる｜フォーラム｜baserCMSユーザーズ](http://forum.basercms.net/modules/newbb/viewtopic.php?topic_id=2868&forum=8&post_id=10111)
fishシェルの設定方法

# はじめに
想定読者はコマンド操作を始めたばかりの方などです。

# シェル(shell)とは
一言で言うと、「人間がコンピュータを操作するためのもの」

貝殻のようにkernel(OSの核)を覆っているイメージから名付けられた。bashやzshなど

ubuntuの標準(インストールしたときについてくる)はbash

# alias(エイリアス)とは

長いコマンドなどを打つ手間を省くためにユーザが設定できるもの

# fishシェルとは

とても便利な補完機能と予測機能を標準搭載している

プロンプト（左に表示されるやつ）の見た目や色をGUIで変更可能

## 色やプロンプトの変更
fishシェルで以下を打つとブラウザが起動し好みのテーマを選択できる。

    $ fish_config

## aliasの設定
~/.config/fish/config.fishに以下のように記述する。

    alias new_name='old_name'
Eclipseにてivyをantのコマンドに含める方法

１.ダウンロード
http://ant.apache.org/ivy/download.cgi 
上記のサイトから
apache-ivy-＊.＊.＊-rc＊-bin.zip
のbinaryファイルをダウンロードして
任意のディレクトリに解凍する。
２.設定
Eclipseを起動し、メニューバーから下記を選択
ウィンドウ → 設定 → Ant → ランタイム → 「クラスパス」のタブを選択
「外部JARの追加」→先ほど解凍したディレクトリ内のivy-＊.＊.＊.jarを選択して「適用」
Djangoでパッケージをアップグレードしたらrequirements.txtとProcfileを更新する

Djangoでパッケージ（ライブラリ、モジュール）をアップグレードしたら

    pip freeze > requirements.txt

でrequirements.txtを更新します。さらに

    pipenv install -r requirements.txt

でProcfileを更新する。

Procfileはローカルの開発ではあまり問題になりませんが、本番の環境に入れたときに変な問題を起こすことがあります。

Procfileの更新は割と時間がかかる。

## 参考

[Pythonのpipで特定のパッケージをアップグレード（アップデート）する](https://www.mathpython.com/ja/pip-upgrade/)
XPathでチェックボックスやラジオボタンにチェックをいれる

xpath職人のものを参考にしたり、調べたりして作った。

こういうinputタグがあったとして、

```
<input type="text" id="your_name" name="your_name" maxlength="40" value>
<input type="text" id="your_email" name="your_email" maxlength="40" value>
<input type="checkbox" id="your_checkbox" name="your_checkbox" value>
<input type="radiobox" id="your_radiobox" name="your_radiobox" value>
```





ブラウザのコンソールを開いて以下を入力して、Enterを押すと
フォームに値が入ったり、チェックボックスやラジオボックスにチェックが入ったりします。

```
$x('//*[@id="your_name"]')[0].value = 'あなたのなまえ';
$x('//*[@id="your_email"]')[0].value = 'youremail@xxx.co.jp';
$x('//*[@id="your_checkbox"]')[0]["checked"]= 'true';
$x('//*[@id="your_radiobox"]')[0]["checked"]= 'true';
```