OmniAICreator/Qiita-1.07M huggingface dataset:
mallocの宣言では何をしているのか

# はじめに
メモリの動的確保に使われるmalloc
実際に使うとき

```c:example.c
#include <stdio.h>

void main(){
  int num;
  array=(int*)malloc(sizeof(int)*num);
}
```

のように宣言する。
この書き方は何をしているのかを考える。

###追記
この記事はコメントを受けて一部を編集しました。

# mallocの宣言では何をしているのか
上で書いた通り、mallocは

```c
array=(int*)malloc(sizeof(int)*num);
```
のように宣言する。
後ろから考えると`sizeof(int)*num`の部分は確保するメモリの大きさを指示している。ここではint型のサイズの値が入る領域を５つ分確保している。しかし`sizeof`を利用すると返ってきた値は、size_t型となってしまう。~~そこで`(int)`によってint型にキャストしている。~~ mallocの前半（`(int*)`）では、割り当てられたメモリを`(int*)`にキャストして割り当てられたメモリを４つずつに分割しているということである。
Unity ちょこっとメモ

思い出すのが面倒なので、分野関係なくちょこっとメモをためる

Canvasの表示順序を操作するには**sort order** を切り替える。
番号が高いほど手前に表示される
（Screen Space – Overlay　の時）
http://albatrus.com/main/unity/7402


スクロールバー＋ビューの作り方
https://tech.pjin.jp/blog/2016/08/30/unity_skill_3/
Virtualboxでネットワーク接続をする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161713/5481718c-325e-d915-640e-c2e03a6da480.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161713/e7523ed8-cb10-dfd8-9f94-69d6c4ff5d99.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161713/68a45e06-935c-8922-db82-afdbdfe4b72b.png)
既にSuperViewを持っているViewオブジェクトを別のSuperViewにaddSubviewしたい！！！！！！！！

というときがあります。

# 問題意識
たとえば、

```swift:こんなとき
//高さ３０pt、横画面サイズのボタン
let frame = (略)
let button = UIButton(frame: frame, width: self.view.frame.size.width, height: 30)
view.addSubview(button)
```

こんなボタンがあったとします。
このViewは、ユーザーが操作することで、どんどん要素が増えていく仕様です。
（たとえばUITableView）
当初ボタンを配置した場所に追加された要素が達したら、このボタンとカブってしまいます。
選択肢としては、下記３つがあります。

1. ボタンをView Hierarchyで上の方に配置して、追加された要素の上に表示する
2. ボタンをView Hierarchyの下の方に配置して、追加された要素の下に表示する  
（つまり隠す）
3. 要素追加と連動して、位置を変える

選択肢１、２を選ぶのは実装的には楽ですが、あまり許容される状況はないかと思います。
大抵のケースは結局３にするしかないと思います。
そのときに困る（というか困った）のが、
**一度ルートviewにaddSubviewしちゃったけど、やっぱこれUITableViewの下にaddSubviewしなおしたいわ**
という場合がありました。

# 試行錯誤
## 常に再作成
最初に考えたのは、ViewWillAppear()の中で、必ず削除して、再作成するロジックにすることでした。

```swift:ViewWillAppear

var button: UIButton?

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    button?.removeFromSuperView()
    //ボタンの作成
}
```

単純なUIKitのボタンならこれでイケると思いますが、自前で作ったUI部品で、
中に状態持っているようなやつだと、再作成によってその状態がイニシャルされてしまうという問題があります。

そこで表題の
**既にSuperViewを持っているViewオブジェクトを別のSuperViewにaddSubviewしたい！！！！！！！！**
に至った訳です。

## removeFromSuperViewのオプション
removeFromSuperView()した時点で、SuperViewから接続が切れるだけでなく、SubViewのインスタンスの解放もしてしまいます。
解放しないオプションなんてないかな？　と思って調べてみましたが、ありませんでした。

## オブジェクトを退避できないか？
removeFromSuperView()の前にオブジェクトを退避できないか？　というのも考えました。
何を言っているのかというと、

```swift:
var button: CustomButton?

if let button = button {
    let tempButton = button
    button?.removeFromSuperView()
    targetView.addSubView(tempButton!)
}
```

これは一見イケそうなのですが、CustomButtonをClass（参照型）として作っていたので、
tempButtonに入れたのは、buttonのアドレスのため、addSubViewすると落ちます。
（試してないですが）
Structだったらワンチャンイケたんでしょうか？

## 解決法
解決法は簡単でした。
**何も考えずにaddSubviewすればいけます。**

```swift
var button: CustomButton?
var tableView: UITableView?

if (ボタンをルートViewにつけるか/tableViewにつけるかの判定条件) {
    targetView = view
} else {
    targetView = tableView
}

targetView.addSubView(button)

```

# なんで？？？
そういう仕様でした。

[addSubview(_:)](https://developer.apple.com/documentation/uikit/uiview/1622616-addsubview)
> Views can have only one superview. If view already has a superview and that view is not the receiver, this method removes the previous superview before making the receiver its new superview.

> (拙訳)Viewは１つしかSuperViewを持てません。もし既にSuperviewを持っていて、かつそのViewが今回のSuperViewとして指定されていないなら、このメソッドは前回のSuperviewを削除してから、指定されたSuperViewを新たなSuperViewとします。

よかったですね。
Android10の強制ダークモードは割としっかりダークしてくれる

本日PixelシリーズにAndroid10の正式版がリリースされました。
目玉機能の1つがダークテーマ(ダークモードはiOSのほう)ですよね。

アプリがダークテーマに対応するにはきちんと対応する方法と、Androidの方でそれっぽくダークにしてくれる方法の2つがあります。
後者の強制ダークモードですが、Googleの謎技術でかなりいい感じにダークになります。

# 設定方法
## アプリ
targetSdkVersionを29にするだけです。以上。ダークテーマ用リソースを用意する必要も追加のコード改修も必要ありません。

## スマホ
Pixel3aでは以下の方法で有効にできます。

設定->ディスプレイ->ダークテーマをON
![theme_on_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/e819843c-883a-8f76-cb70-e4807c3077a9.png)

設定->システム->開発者向けオプション->フォースダークのオーバーライドをON
![Screenshot_20190904-133542.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/99ce1c78-d011-0072-f99e-38476ec71125.png)

これでAPI Level29でビルドされたアプリはダークテーマで表示されます。

# 結果
弊社のプロダクトであるCASTというアプリで試してみました。

イントロ画面
![Screenshot_20190904-134515.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/a3446545-8350-90a4-fc88-4f17e17d10a3.png)![Screenshot_20190904-134437.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/aee7b14d-af7d-0bbf-7ebe-040acd0c9b6b.png)

びっくりしたのが、イントロの画面にLottieというアニメーションライブラリを利用しているのですが、そのアニメーションに使っているロゴタイトルがダークテーマの時に白黒反転しています。でも上のアイコンは色味が変わっていないように見えます。もちろんダーク用リソースなぞ用意していません。Androidがよしなにダークにしてくれています。

ステータスバーは流石に対応していないようです。

メイン画面(BottomNavigationを使用)
![Screenshot_20190904-134536.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/6b4902fa-a8c2-2808-dad6-679de0766c09.png)![Screenshot_20190904-132950.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/ae83e667-c0bc-2622-80b7-2324054d8da4.png)

もともと白いテキストは白のまま、黒いテキストは白っぽくなり、黒いアイコンは白に変換してくれているようです。アクセントカラーに青を採用していますが、アクセントカラーは変わらないようです。

ダイアログ
![Screenshot_20190904-134553.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/46349c18-5087-b953-b5be-42aced3156de.png)![Screenshot_20190904-133005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/a2833149-67f5-0531-b154-24af36ee260c.png)

# 強制ダークモードを外すには
この強制ダークモードですらダークにしたくないという場合はThemeから無効にできるようです。

```values-v29/styles.xml
<style name="AppTheme" parent="Theme.MaterialComponents.Light">
    <item name="android:forceDarkAllowed">false</item>
</style>
```

---

ダークテーマ | Android Developers
https://developer.android.com/preview/features/darktheme

とはいえ開発者向けのオプションを有効にしないといけないので使う人は少なそうです。後でちゃんとダークテーマに対応しましょう。
IISの404エラーページが返るようになった時の対処法

## はじめに

IISを使っているプロジェクトで404エラーページを表示させるときにハマったことがあったので紹介します。


アプリケーション側でエラーページを実装したところローカルでは表示されるのに、
外部からアクセスすると**「404 ファイルまたはディレクトリが見つかりません。」**というページが表示されます。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442396/11019c77-b868-2359-00b9-ccca1be9d321.png width=800>


実はこのエラーページへはIISの404カスタムエラーページで、
IISのApplicationHost.config/httpErrorsの設定が影響するようです。

## httpErrorsとは

statusコード400以上のレスポンスの振る舞いを設定できるconfig項目です。
ApplicationHost.config/httpErrors配下の属性のうち、今回関連のあるerrorModeについて説明していきます。

### errorMode属性

HTTP エラーを有効にするかどうかを指定する。デフォルトはDetailedLocalOnly。

|errorMode|説明 |
|---|---|
|DetailedLocalOnly|アクセスがローカルPCからの場合は詳細エラーを返し、外部PCからの場合はカスタムエラーを返す。 |
|Custom|サーバーが生成する詳細エラーをカスタムエラーで置き換えて返す。  |
|Detailed|サーバーが生成する詳細エラーを返す。|

<details><summary>※ApplicationHost.config/httpErrorsの設定はIISの構成エディターからできます。</summary><div>
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442396/19ac9977-e86f-9eea-1342-05f22ca0bc77.png width=500>

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442396/15b4e89b-ed55-f2bd-b7c8-9835d35c8233.png width=500>
</div></details>

[リファレンス](https://docs.microsoft.com/en-us/previous-versions/iis/settings-schema/ms690497(v=vs.90))

### わかりづらいので補足すると
**詳細エラー**というのは**アプリケーション側で実装したエラーページ**、**カスタムエラー**というのは**IISのカスタムエラーページ**を指しています。

- **DetailedLocalOnly**はローカルアクセスのときはアプリケーション側で実装したエラーページを表示して、外部アクセスの時はIISのカスタムエラーページを表示します。

- **Custom**はローカル・外部アクセス問わずIISのカスタムエラーページを表示します。

- **Detailed**はローカル・外部アクセス問わずアプリケーション側で実装したエラーページを表示します。

## つまり・・・

今回はerrorMode属性がデフォルトのまま**DetailedLocalOnly**だったことにより
IISのカスタムエラーページが表示されました。
なので**Detailed**に設定することでIISのカスタムエラーページが表示されなくなりました。

<details><summary>※IISのカスタムエラーページを使用する場合はこちらから設定可能です。</summary><div>
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442396/4467f2f5-db80-699f-e29b-2ad54379580c.png width=500>

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/442396/31ecdd54-6789-11ca-9d2d-fb6b73e14073.png width=500>
</div></details>

## 検証環境
IIS: 10.0
VSCode設定



### 日本語化
1. viewを選択
1. comanndo palette を選択
1. configure display languageを選択
1. localeをenからjaに書き換える。

### Markdown
* 設定-[Default Language]をmarkdownにする

### 見た目
* ファイル-基本設定-配色テーマ

### 初期設定
* Setting-TextEditor-Mouse Wheel Zoom：Ctrl+マウスくるくるで表示倍率変更

### VSCodeの拡張機能
* Power Mode：https://marketplace.visualstudio.com/items?itemName=hoovercj.vscode-power-mode
  - 炎噴いたりするエフェクト 
  - 改造する
①設定メニューの追加
\.vscode\extensions\hoovercj.vscode-power-mode-2.2.0\package.json
powermode.presetsにメニュー名を追加
②アニメーションの追加
\.vscode\extensions\hoovercj.vscode-power-mode-2.2.0\out\src\config\
に[メニュー名].jsを追加する（中にエンコードされた画像情報が入っている）
\.vscode\extensions\hoovercj.vscode-power-mode-2.2.0\out\src\extension.js
に[メニュー名].jsの定義を追加


* Insert Date String：https://marketplace.visualstudio.com/items?itemName=jsynowiec.vscode-insertdatestring
  - Ctrl+Shift+Iで日付を入れられる
  - 日付のフォーマットも自由に変えれる、便利
Apex Specialist Super Badge 復習[Challenge 2]

#WarehouseEquipmentクラス

responseされたJSONをデシリアライズするためのクラス。

```java
public class WarehouseEquipment {
    public String name;
    public Boolean replacement;
    public Integer quantity;
    public Integer maintenanceperiod;
    public Integer lifespan;
    public Integer cost;
    public String sku;
    public String x_id;
    
    public List<WarehouseEquipment> parse(String json){
        json.replace( '"_id":', '"x_id":' );
        return (List<WarehouseEquipment>) System.JSON.deserialize(json,List<WarehouseEquipment>.class);
    }
}
```

##System.JSON.deserializeメソッドについて
trailなどでは`System.JSON.deserializeUntyped(String json)`が紹介されています。これはObjectが返されるので、`Map<String,Object>`にキャストすることで扱うことができるようになります。
私は`System.JSON.deserialize(String json,apexType)`を使いました。(上記コード)
戻り値は同じくObjectなので、型変換をする必要があります。キャストしたコレクションは、
作成したクラスの対応するフィールドに格納されます。型変換も行われるので下記コールアウトクラスが簡潔になるのがメリット。
もちろん、項目名の対応などが間違っているとエラーになります。

# WarehouseCalloutServiceクラス

厳密には単純なupsertだと適切な動作をしない(全部insertになってしまう)がとりあえずその辺は保留。
正常なレスポンスが返ってきたらJSONを変換してupsert
<details><summary>コード</summary><div>

```java
public with sharing class WarehouseCalloutService {
    private static final String WAREHOUSE_URL = 'https://th-superbadge-apex.herokuapp.com/equipment';
    // complete this method to make the callout (using @future) to the
    // REST endpoint and update equipment on hand.
    @future(callout=true)
    public static void runWarehouseEquipmentSync(){
        Http http=new Http();
        HttpRequest request=new HttpRequest();
        request.setEndpoint(WAREHOUSE_URL);
        request.setMethod('GET');
        request.setHeader( 'Content-Type', 'text-xml' );
        HttpResponse response=http.send(request);
        if(response.getStatusCode()==200){
            List<Product2> listp=new List<Product2>();
            for(WarehouseEquipment eq:new WarehouseEquipment().parse(response.getBody())){
                Product2 p=new Product2(Id=eq.x_id);
                p.Replacement_Part__c=true;
                p.Cost__c=eq.quantity;
                p.Lifespan_Months__c=eq.lifespan;
                p.Maintenance_Cycle__c=eq.maintenanceperiod;
                p.Name=eq.name;
                p.Warehouse_SKU__c=eq.sku;
                listp.add(p);
            }
            upsert listp;
        }
    }
}
```
</div></summary>

# Challenge2をクリアするには

> Before checking this section, run the WarehouseCalloutService.runWarehouseEquipmentSync() method at least once

DebugタブのOpen Execute Annopnymous Windowから実行すればよいようです。

続き：[Apex Specialist Super Badge 復習[Challenge 3]](https://qiita.com/jitao/private/a5c9511030c905f74f81)
deviseで間違って作ったtableを消したい

deviseで間違って作ったtableを消したい

`rials db:rollback`

これを２回？
例えばbookテーブルを消したいとしたらそれが消えるまでそしたら次に、

`rails d devise Book`

そして最後に

`rails db:migrate`

終わり
HTTP POST でデータを送って中身を確認したい 

## はじめに
POSTで送るデータの中身を簡単に見たい場合、
AWSのAPIGatewayに投げるのが楽ですが、'HTTPS'でしかPOST出来ません。
訳あって'HTTP'でPOSTしたい場合どうしよう…と思い、Apacheのログで見ることにしました。

## EC2上にApacheをインストール＆設定
### まずはインストール
```
# yum -y install httpd
..(インストール完了)..
# httpd -version
Server version: Apache/2.4.39 ()
Server built:   Apr  4 2019 18:09:28
```

### 自動起動の設定
インスタンスを立ち上げた時にApacheも同時に起動するように設定。

```
# systemctl enable httpd.service
```

起動して、無事にアクセスできることを確認。

```
# systemctl start httpd.service
```

EC2インスタンスに割り当てられたIPアドレス叩いてApacheのテストページが出たらOK:ok_woman:

### POSTログを残すための設定
dumpioモジュールが入っていることを確認

```
# httpd -M | grep dumpio
dumpio_module (shared)  ←やったー、入ってる！
```

configファイルにモジュールを使用する旨&ログ出力の部分の記載をする

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

下記を追記。(レスポンスの出力は不要なのでDumpIOOutput は記載しません)

```httpd.conf
LoadModule dumpio_module      modules/mod_dumpio.so
DumpIOInput On
```

ログレベルを変更する(元は`LogLevel warn`となっていました)

```
LogLevel debug dumpio:trace7
```

変更を終えたらApacheを再起動。

```
# systemctl restart httpd.service
```

## フォームを持ったindex.htmlを用意
/var/www/html内にindex.htmlを作る

```index.html
<html>
<head><meta charset="utf-8"></head>
<body>
<form method="POST">
        <input type="text" name="id">
        <input type="submit" name="submit" value="send message">
</form>
</body>
</html>
```

## POSTしてみる！

```
$ curl -X POST -F "id=testID" http://xxxxxxx  ←EC2インスタンスのIP
```

## ログ調査

```
# tail -n 20 /var/log/httpd/error_log
```

ありましたー。

```
[Wed Sep 04 00:49:42.398487 2019] [dumpio:trace7] [pid 3497] mod_dumpio.c(103): [client xx.xx.xx.xx:xxxxx] mod_dumpio:  dumpio_in (data-HEAP): --------------------------1ebdfe62e1c40235\r\nContent-Disposition: form-data; name="id"\r\n\r\ntestID\r\n--------------------------1ebdfe62e1c40235--\r\n
```

見づらいので、ログを整形して、欲しい部分だけ抜き出します。

```
# grep 'name="id"\\r\\n\\r\\n' /var/log/httpd/error_log | sed -e 's/^.*name="id"\\r\\n\\r\\n\([0-9a-zA-Z_]*\).*$/\1/'
testID
```

とれたー:raised_hands:
とりあえず確認用だったら割と簡単に出来るので良いなぁと思いました:grinning:

## 参考にさせていただいたサイト
[ApacheでPOSTデータをログに記録したい](https://qiita.com/shyamahira/items/417234d169e331138c2c)
[Apache 2.4でPOSTの内容をログに出力するときは"LogLevel debug"だけじゃ出てこない](https://qiita.com/whywaita/items/fa6f83f4f62fc431bf55)
[【sed / awk / grep】文字列の置換・抽出・検索と正規表現 | Linux Cheat Sheet](https://qiita.com/shuntaro_tamura/items/e4e942e7186934fae5e7)

## さいごに
いつもお世話になってばかりのQiitaに初めて投稿してみました:sunny:
記事に需要があるか分かりませんが、備忘録ということで…。
他に楽にPOSTが受付られる方法あればぜひ教えてください:heart_eyes:
温湿度センサ(BME280)＋ESP8266＋AzureIoTCentralを使って、オフィス環境を可視化する

#困りごと
オフィスが暑かったり、寒かったり。
エアコン調整も出来るのですが、人によって感じ方がバラバラだったり、そもそも「えっ、もうエアコン付けるの？」みたいな声も出たりすると、こういった微妙な問題はなかなか白黒がつきません。
なので、そういったのが手間を省く為に、オフィスの温度をセンシングして、「ほら、暑いでしょ」みたいな話が出来れば、平和的に解決すると思い、とりあえず可視化を進めることにします。

#実現手段
- EPS8266＋BME280で温度・湿度をセンシングする
- ESP8266からAzureIoTCentralにデータをアップする
- AzureIoTCentral側でデータを可視化する

#基本構成
・[ESPr® Developer](https://www.switch-science.com/catalog/2652/)
・[ESPr® Developer用環境センサシールド(BME280搭載)](https://www.switch-science.com/catalog/2703/)
・[Azure IoT Central](https://azure.microsoft.com/ja-jp/services/iot-central/)


#EPS8266をAzure IoT Centralに繋ぐ
基本的に以下に記載されている通りにやれば、データをアップするところまでは簡単に実現できます。
ESP8266をArduino IDE環境で使ったことがある人なら難しいことを考えずに、srcフォルダ以下をinoファイルと同じ階層に入れておけばOKです。
https://github.com/Azure/iot-central-firmware/tree/master/ESP8266

#Azure IoT Centralの準備
Azure IoT Centralの作成も通常通りにやれば大丈夫。
あとは、EPS8266のソースに書き込む必要があるID関連ですが、以下から取得できるので、ESP8266のソースコードに記入します。

- Azure IoT Central側で設定を確認
![ID.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/3b774f4b-e050-dfb1-8d95-56c2f92c4166.jpeg)

- スコープID／デバイスID／主キーをメモ
![key.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475457/d2e8438a-fb0e-85b7-a4e7-952e098157b7.jpeg)

- ESP8266のここの直接書く

```
const char* SCOPE_ID = "<ENTER SCOPE ID HERE>";
const char* DEVICE_ID = "<ENTER DEVICE ID HERE>";
const char* DEVICE_KEY = "<ENTER DEVICE primary/secondary KEY HERE>";
```

#BME280の温度がちょっと高い？
実際にオフィス内で動作させてみると、なんか温度が高めになってるような気がします。Googleで検索すると同じように言ってる方も多くいて、そもそもBME280のデータシート上も湿度・気圧の補正処理に使うか、環境温度の推定には使えますと記載があるので、確かにだいたいの値になります。詳細は以下の記事が参考になると思います。なので、今回は同じオフィス内で使い続けるので、壁掛けの温度計を比較した差分値を固定値で引いて計算するようにしました。
https://tool-lab.com/make/pic-practice-28/

#まとめ
この問題は季節の変わり目に起きやすいと思いますが、しばらくは暑かったのでエアコンを付けて当たり前って感じだったので、しばらく問題は起きてません。なので、次は急激に寒くなる時期がターゲットになるので、そのあたりにもう少し考察できると思います。可視化は簡単にできました。
MicrosoftFlowでteamsの長文コメントをExcelに記入する際に、テキストのみを記入する方法

いつもお世話になってます。
MicrosoftFlowについて質問が一点ございます。
https://flow.microsoft.com/ja-jp/

環境：Windows10　ブラウザ（chrome）

作りたいもの：teamsのコメントをExcelにテキストとして記入するFlow

現状：・チームスのコメントをExcelに記入するとHTMLのタグが付いてくる。（<div>などが入ってしまう）
・一文のみならテキスト記入されるが、teamsコメント上で段落を使うと、HTMLタグが出現。

教えていただきたいこと：・Excelのセルの中からテキストのみを取得する方法
・Flow上でチームスからエクセルに記入する際にHTMLでなくテキストで入力する方法

よろしくお願いいたします。
Rials / 外部キー同士(組合せ)のUnique制約の追加と確認(MySQL)

外部キー同士の組合せの重複保存ができないようにUnique制約を追加します。
尚、作成するテーブルはcommentsテーブルとし、カラムである外部キーはuser_id</span>とpost_idとします。

```MigrationID_MigrationName.rb
class CreateComments < ActiveRecord::Migration[6.0]
  def change
    create_table :comments do |t|
      t.references :user, null: false, foreign_key: true
      t.references :post, null: false, foreign_key: true
      t.text :text, null: false
      t.timestamps
    end
    add_index :comments, [:user_id, :post_id], unique: true #user_id × post_id = 一意の値としてUnique制約を追加
  end
end
```
<br>

テーブルの設計が完了したら作成する。

```
$ bundle exec rake db:migrate
```
<br>
テーブルの作成とindexの確認をした後に、検証する。

```
$ rails db

mysql> show tables;
+-----------------------------+
| Tables_in_name_development |
+-----------------------------+
| comments                    |
    .
    .

mysql> show index from comments;
+----------+------------+---------------------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table    | Non_unique | Key_name                              | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------+------------+---------------------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| comments |          0 | PRIMARY                               |            1 | id          | A         |           1 |     NULL | NULL   |      | BTREE      |         |               |
| comments |          0 | index_comments_on_user_id_and_post_id |            1 | user_id     | A         |           1 |     NULL | NULL   |      | BTREE      |         |               |
| comments |          0 | index_comments_on_user_id_and_post_id |            2 | post_id     | A         |           1 |     NULL | NULL   |      | BTREE      |         |               |
| comments |          1 | index_comments_on_user_id             |            1 | user_id     | A         |           1 |     NULL | NULL   |      | BTREE      |         |               |
| comments |          1 | index_comments_on_post_id             |            1 | post_id     | A         |           1 |     NULL | NULL   |      | BTREE      |         |               |
+----------+------------+---------------------------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
5 rows in set (0.00 sec)

mysql> insert into comments (user_id, post_id) values(有効なUserID, 有効なPostID);
Query OK

mysql> insert into comments (user_id, post_id) values(上記同様, 上記同様);
ERROR 1062 (23000): Duplicate entry '5-17' for key 'index_comments_on_user_id_and_post_id'
```

Done.
kind で HPA をしてみる


https://qiita.com/tksarah/items/b61ad205338b5688c4df

上記からの、https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/ を実施してみる。

# kind でクラスタ準備
HPA なのでスケールアップさせるための worker ノードは増やしておく。

kind のための config yaml は以下のように。

```shell-session
$ more config-cluster.yaml 
kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha3
nodes:
- role: control-plane
- role: worker
- role: worker
```

クラスタ作る

```shell-session
$ kind create cluster --config config-cluster.yaml
・・・略・・・
$ kind get clusters
kind

$ kind get nodes
kind-worker
kind-control-plane
kind-worker2

$ kubectl cluster-info
Kubernetes master is running at https://127.0.0.1:45537
KubeDNS is running at https://127.0.0.1:45537/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
```

# metrics-server 入れる

HPA するのに必要なのでセットアップしないといけない。

https://github.com/kubernetes-incubator/metrics-server/

がしかし、上記を元に、以下のようにやるとうまくいかない。

```shell-session
kubectl apply -f deploy/1.8+/
```

Pod は Running になるが、できあがったログみると、ノードや Pod の metrics フェッチできないよというエラー。

```shell-session
unable to fetch node metrics for node "kind-control-plane": no metrics known for node
```

ISSUE 確認すると 2019/9/4 現在で OPEN 中。

> https://github.com/kubernetes-sigs/kind/issues/398
> minikube とか microk8s みたく専用の addon にしたらいいんじゃないのとか、

途中に kind 用の metrics-server デプロイするための YAML 提示しているのがあり、
それを apply させていただいたら、いけた。

```shell-session
$ kubectl top nodes
NAME                 CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
kind-control-plane   107m         5%     438Mi           5%        
kind-worker          431m         21%    297Mi           3%        
kind-worker2         208m         10%    277Mi           3% 
```

> Henning Jacobs さんご提供
> https://gist.github.com/hjacobs/69b6844ba8442fcbc2007da316499eb4



# HPA リソース作る

```shell-session
$ kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
```

Workthrough の php-apache が作った HPA リソースにももとづき、負荷あげるとスケールアップ、なくなるとスケールダウンする。
Laravel 6.0 だけどLaravel-Adminを試したい

# Laravel-Adminのインストール拒否された

Laravel 6.0 でLaravel-Adminをインストールしようとすると失敗。

```
$ composer require encore/laravel-admin
Using version ^1.7 for encore/laravel-admin
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Conclusion: don't install encore/laravel-admin v1.7.6
    - Conclusion: don't install encore/laravel-admin v1.7.5
    - Conclusion: don't install encore/laravel-admin v1.7.4
    - Conclusion: don't install encore/laravel-admin v1.7.3
    - Conclusion: don't install encore/laravel-admin v1.7.2
    - Conclusion: don't install encore/laravel-admin v1.7.1
    - Conclusion: remove laravel/framework v6.0.0
    - Installation request for encore/laravel-admin ^1.7 -> satisfiable by encore/laravel-admin[v1.7.0, v1.7.1, v1.7.2, v1.7.3, v1.7.4, v1.7.5, v1.7.6].
    - Conclusion: don't install laravel/framework v6.0.0
    - encore/laravel-admin v1.7.0 requires laravel/framework ~5.5 -> satisfiable by laravel/framework[5.5.x-dev, 5.6.x-dev, 5.7.x-dev, 5.8.x-dev].
    - Can only install one of: laravel/framework[5.5.x-dev, v6.0.0].
    - Can only install one of: laravel/framework[5.6.x-dev, v6.0.0].
    - Can only install one of: laravel/framework[5.7.x-dev, v6.0.0].
    - Can only install one of: laravel/framework[5.8.x-dev, v6.0.0].
    - Installation request for laravel/framework v6.0.0 -> satisfiable by laravel/framework[v6.0.0].


Installation failed, reverting ./composer.json to its original content.
```

## 対応

dev-masterを使う

```composer.json
    "require": {
        "php": "^7.2",
        "fideloper/proxy": "^4.0",
        "laravel/framework": "^6.0",
        "laravel/tinker": "^1.0",
        "laravel/ui": "^1.0",
        "encore/laravel-admin": "dev-master" //追加
```

```
$ composer update
```


あとは公式ドキュメント通りに

```
$ php artisan vendor:publish --provider="Encore\Admin\AdminServiceProvider"
$ php artisan admin:install
```

[![Image from Gyazo](https://i.gyazo.com/9d6159cfa89c3921166a184bbde81e28.png)](https://gyazo.com/9d6159cfa89c3921166a184bbde81e28)

[![Image from Gyazo](https://i.gyazo.com/bfc2f29cc7d7446499bf4c4dd7696e73.png)](https://gyazo.com/bfc2f29cc7d7446499bf4c4dd7696e73)

Laravel 6.0 でも行けた！

## 追記

デフォルト画面は行けますが、他の画面がほとんど動きません... ~~当たり前~~

https://github.com/z-song/laravel-admin/issues/3871

Issueが上がっているので、対応待ちが無難そうです。

## 追記2019/11/15

もうdev-masterつけなくても、普通にインストールして普通にある程度動くっぽいです。
kubectl applyをすると「Failed to download OpenAPI (the server could not find the requested resource), falling back to swagger」と出る

## メッセージ内容
```
W0901 16:58:07.005324   45203 factory_object_mapping.go:423] Failed to download OpenAPI (the server could not find the requested resource), falling back to swagger
error: error validating "test-deployment.yaml": error validating data: the server could not find the requested resource; if you choose to ignore these errors, turn validation off with --validate=false
```

`--validate=false` をつけると確かに`apply`できるけれど。。。

## kubectlのClientバージョンがなんか古いみたい
```
~/D/gerrit-k8s-new ❯❯❯ kubectl version
Client Version: version.Info{Major:"1", Minor:"8", GitVersion:"v1.8.7", GitCommit:"b30876a5539f09684ff9fde266fda10b37738c9c", GitTreeState:"clean", BuildDate:"2018-01-16T21:59:57Z", GoVersion:"go1.8.3", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.2", GitCommit:"f6278300bebbb750328ac16ee6dd3aa7d3549568", GitTreeState:"clean", BuildDate:"2019-08-05T09:15:22Z", GoVersion:"go1.12.5", Compiler:"gc", Platform:"linux/amd64"}
```

## kubectl再インストール
```
curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/darwin/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
```

## バージョンがServerと並んだ
```
~/D/gerrit-k8s-new ❯❯❯ kubectl version
Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.3", GitCommit:"2d3c76f9091b6bec110a5e63777c332469e0cba2", GitTreeState:"clean", BuildDate:"2019-08-19T11:13:54Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.2", GitCommit:"f6278300bebbb750328ac16ee6dd3aa7d3549568", GitTreeState:"clean", BuildDate:"2019-08-05T09:15:22Z", GoVersion:"go1.12.5", Compiler:"gc", Platform:"linux/amd64"}
```

## OK
```
~/Desktop ❯❯❯ kubectl apply -f sample-pod.yaml
pod/sample-pod created
```
Ruby初学者が単純なプログラムを書いてみた。

# はじめに
初投稿です。Rubyを勉強し始めて３日目になります。
改めてメソッドの多さに驚いています。見よう見真似ですが、
単純すぎるプログラムを書きました。単純なプログラムと言ってもエラーが出たので
備忘録も兼ねて、紹介していきたいと思います。

# どの人生を選んでも幸せになれない女のプログラム。
```ruby

scene = 'life'
while true
case scene

    if scene == 'life'
        puts 'あなたはどの人生を生きたいですか'
        sleep 1
        puts '1 仕事に生きる'
        puts '2 専業主婦になる'
        puts '3 仕事も結婚も手に入れようとする'
        x = gets.to_i
        case x.to_i
        if x.to_i == 1
            scene = 'work'
        elsif x.to_i == 2
            scene = 'marry'
        elsif x.to_i == 3
            scene = 'get happy'
        else '???'

        end

    when 'work'
        puts '私は仕事に生きる。結婚は遅くてもいいや'
        sleep 1
        puts 'ー　気づけば周りは既婚者ばかり　ー'
        sleep 1
        puts '孤独で寂しい…'
        puts 'the end'
        exit
    end

    when 'marry'
        puts '早く結婚して、幸せな専業主婦になりたい'
        sleep 2
        puts '晴れて結婚したけど'
        sleep 2
        puts '専業主婦は…暇！'
        sleep 1
        puts 'the end'
        exit
    end

    when 'get happy'
        puts '幸せな結婚もしたいし、仕事も充実させたい'
        sleep 1
        puts '二兎を追う者は一兎をも得ず'
        sleep 2
        puts '仕事も恋愛も追い求めすぎて空回り…'
        sleep 3
        puts 'the end'
        exit
    end
end
```
内容はあまりにも批判を受けそうなので気にしないでほしいです。
Ruby入門書でif文をcase文に書き直すとシンプルになると学んだため、両方組み合わせて書いてみました。
しかし、このままではエラーがたくさん出ます。

# 間違いから学んだこと。

上のプログラムを実行すると、
*unexpected*や*expecting*などのエラーが出てきました。
すぐさま意味を調べてみると、
*unexpected*　→　予想外
*expecting*　→　期待して
と、出てきました（英語力…）

*unexpected　keyword_when*や*expecting　keyword_end*は
whenは予想外だった…！や、endを期待しているよ。などと言っているのだな。。ふむ。。

とりあえず英語が出てきても焦らず調べるべきだなと感じました！
訂正後はこちら。

```ruby:


scene = 'life'
while true
case scene
when 'life'
        puts 'あなたはどの人生を生きたいですか'
        sleep 1
        puts '1 仕事に生きる'
        puts '2 専業主婦になる'
        puts '3 仕事も結婚も手に入れようとする'
        x = gets.to_i
        case x.to_i
        when 1
            scene = 'work'
        when 2
            scene = 'marry'
        when 3
            scene = 'get happy'
        else '???'

        end

    when 'work'
        puts '私は仕事に生きる。結婚は遅くてもいいや'
        sleep 1
        puts 'ー　気づけば周りは既婚者ばかり　ー'
        sleep 1
        puts '孤独で寂しい…'
        puts 'the end'
        exit
    
    when 'marry'
        puts '早く結婚して、幸せな専業主婦になりたい'
        sleep 2
        puts '晴れて結婚したけど'
        sleep 2
        puts '専業主婦は…暇！'
        sleep 1
        puts 'the end'
        exit
    
    when 'get happy'
        puts '幸せな結婚もしたいし、仕事も充実させたい'
        sleep 1
        puts '二兎を追う者は一兎をも得ず'
        sleep 2
        puts '仕事も恋愛も追い求めすぎて空回り…'
        sleep 3
        puts 'the end'
        exit
    end
end
```

# さいごに
このようにエラーから学び取れることはたくさんあるということに気づけました。もっと複雑なプログラムが書けるようにまだまだ勉強頑張りたいです。
プログラミングを学ぶに当たって、とにかくサンプルでもなんでも、書いて動かして見ることが大切だと感じます。
たくさん試すことで、新しいものやアイデアが生み出せるのではないかという信念を貫きたいです…！（プログラミングに関わらず…）
terraformハンズオン

## 各種ツールのインストール

* [tfenvをmacOSで使う方法 - Qiita](https://qiita.com/reoring/items/dc42f7b60f0d0ce3a97f)
* [macOSにAWS CLIをインストールする方法 - Qiita](https://qiita.com/reoring/items/56bf7c92c56aecc7c005)
* [macOSにpackerをbrewでインストールする - Qiita](https://qiita.com/reoring/items/11e0ef558cc4b88dcc0e)

## ハンズオン用レポジトリのclone

```
git clone git@github.com:reoring/terraform-handson.git
```

移動しておく。

```
cd terraform-handson
```

## AWSアカウントの作成

AWSでアカウントを作成して、自動化用のユーザをIAMで作成してアクセスキーを作成します。

[aws cliで任意のプロファイルに認証情報を追加する - Qiita](https://qiita.com/reoring/items/6d43cf31f4e646e0dee4)

プロファイル名は`terraform-handson`や自分がわかりやすい名前にする。

## AWSプロファイルに認証情報を入れる

```
aws configure --profile プロファイル名
```

regionは`ap-northeast-1`とする。

このコマンドを実行すると、認証情報が聞かれるので入力する。
`~/.aws/credentials` に正しい認証情報が書かれているか確認する。

## packerでdocker入りのamazon linux2をビルドする

```
cd amazonlinux2-with-docker
AWS_PROFILE=プロファイル名 packer build amazon-linux2-docker.json
```

## terraformのエイリアスを作る

[terraformで開発するときに便利なalias - Qiita](https://qiita.com/reoring/items/6f2878d52803f8dcab03)

## terraformを初期化する

```
cd ../terraform-ec2
terraform init
```

[terraformのproviderってなに？ - Qiita](https://qiita.com/reoring/items/cbd219dbd678ea62d7d4)

## terraformのplanを確認する

```
terraform plan
```

## terraformでAWSに環境をつくる

```
terraform apply
```
node-devはデフォルトでNODE_ENV=developmentの環境変数をセットしてくれる

node-devはデフォルトでNODE_ENV=developmentの環境変数をセットするという仕様がある。

`NODE_ENV=development`をセットしている該当コード: https://github.com/fgnass/node-dev/blob/4423c169f17466f30c75322de1a260c1b3d45c7f/lib/wrap.js#L18

```js
// Set NODE_ENV to 'development' unless already set
if (!process.env.NODE_ENV) process.env.NODE_ENV = 'development';
```

## 所感

ts-node-devでTypeScriptコードを実行したときに、なぜか`process.env.NODE_ENV`に`"development"`がセットされていて、「誰がセットしているんだろう？」と疑問に思い調べてみた。そうしたら、ts-node-devが依存しているnode-devのほうでセットしていたことが分かった。
バッチのfor周回〜血反吐まみれのデスク〜

#【結論から言うと】
for /f "delims=" で
バッチファイルの文法を読み込み
別ファイルへ書き出す。
だいたい for /f "delims=" %%i in ( ファイルA ) do ( ファイルBに1行ずつ解釈してコピー & echo %%i ぱいぷ findstr /b /c:"rem " )って感じにしてあるが
###こいつを回すとファイルA中で作成するログファイルが作成される。
やったこととか試したこととか色々書くので
ログファイルがどの程度元気に誕生しているのかも書く予定。

原因は未だ判明していない
この8月からエンジニアになった
バチバチの初学者にはキツい

ナレッジ的なのが既出であれば
教えてくださいお願いします。

とりあえずバッチで乗り越えるのは諦めて
VBSの勉強を始めた。


##【この記事は編集中です】

##すべての始まり
めでたくお仕事をいただいたジョンソン。
デスクへの道のり。ジョウシは言った。
「バッチやったことある？」
ジョンソンは素直だ。
「全くないです、すみません」
ジョウシはスパルタだった。
「じゃあ、やろうか」

##時間ができた
色々な要件に挫折しそうになりながら、最低限の機能を用意して、実機の到着を待った。
来ない。

えてして、先方様は納期をぶっちぎってくる。

ぜんぜん来ないらしいということだったので（ほんとはもっとちゃんとスケジュール感をジョウシに聞いてあるけどたぶんまた遅れる）、ジョンソンは考えた。
「今動かれたら困るところはrem にしてある。コメントはREM で書いてある。置換用に分けたが、ファイルがそもそもいくつかあるのだから一括置換ができればよいのではなかろうか」

「バッチちょろくね」とか思っていたのだ。

#「rem をまとめて削除しよう」
とりあえず、この時点でバッチファイルを50くらい試作して消して8つくらいまで厳選を3周くらいしていたジョンソンは、考えた。

###なにからやるべきか
それが分からないとなにもできない。

・やりたいことの洗い出し
  ・「削除くん（仮）」を保存したフォルダ以下に保存してあるバッチファイルのrem を消したい
  ・でも元ファイルを上書きするのは怖いから、元ファイルは置いたままコピーを取って、コピーの方のrem を消したい
  ・コピーは実行用としてひとつのフォルダにまとめたい

#つくった
ざっくり分けて３つのセクションがある。
ここはあまり大切ではない認識なのでざっくりしか書かない。ご要望があれば追記します。

1)下準備とfor文
  せっとろーかる〜〜をしたり
  カレントのパスを変数に格納したり（set）
  最終的にファイルをまとめるフォルダを作ったり（mkdir）
  あと一応移動したりする（pushd %〜dp0）

  for文はざっくりいうと
  for /f "usebackq" %%a in ( 'dir ぱいぷ findstr ) do ( call :2 %%a )

2)コピーしたり書き出したりする
  *「削除くんより下のバッチ」*を対象にするのでdirには/sがついている。/bよりも/sが強いらしく、併記してもフルパスで出てくるのだ。
  1で見つけたファイルのフルパスを、%1として預かってきているので、*%〜nx1*とかができる。（入れ子読みにくいから嫌いってだけではない）（なんかスマートなやり方があったら教えてください）
  とりあえず%〜ナンヤラで欲しい形にしたパスをsetで変数に格納してfor文を回す。

  for /f "delims=" %%A in ( 元 ) do ( set line=%%A
    echo !line! ぱいぷ findstr >nul
    if not !ERRORLEVEL!==1 (
      echo !line:〜4! >> 先 )
    else ( echo !line! >> 先 )

〜だいたいこんな感じ〜

3)使い終わったやつを消す
  これがもう１つトラブルを招いたわけだが今なんとかしようとしてるところなので、なんとかなったか、もしくは戦略的撤退を選べるとこまで詰まったらまた書きます。


#がんばった
これを回す。
黒背景の画面に白いのがブワァーー行ってなんかテンションが上がる。しかしジョンソンは気づく。

##なんかファイル増えとる
ジョンソンはAtomを使っており、主に「フォルダを開く」の機能を愛しているため分かるのであるが、左側になんか増えたのだ。
###増えたファイルは*%LOG%*と*%eLOG%*

誰も作れ言うてへん
そんなんいらん

ちなみに拡張子もない

つづく

#0906_ログが作られないようにはできたけどその辺はちょっとまだ待ってて
golangで画像サイズ/拡張子を変換するCLIツールを作ってみた

画層サイズ・拡張子を変更するCLIツールを作りました。

## 使用したパッケージ

### flag
flag管理パッケージ（ コマンドライン引数とかを扱う時に便利。という理解。 ）
### image
画像を取り扱う標準パッケージ
### golang.org/x/image/draw
ある画像を別の画像に描画するパッケージ。imageパッケージだけではやってくれないっぽい。準標準パッケージらしい
### github.com/urfave/cli
CLIツール作成のに便利なパッケージ。
usageとかいろいろいい感じに出してくれる。

## 処理の大まかな流れ

### flagを使ってコマンドライン引数を取得

必要なパラメータをflag形式で受け取り `flag.Parse()`でコマンドラインのパラメータがパースされ、
各変数に値が格納される。

```golang
	// 引数を取得
	srcImagePath := flag.String("src_path", "", "source image path")
	dstImagePath := flag.String("dst_path", "", "destination image path")
	dstFormat := flag.String("dst_format", "", "destination image format. e.g) png,jpeg,gif")
	height := flag.Int("height", 0, "height size")
	width := flag.Int("width", 0, "width size")
	flag.Parse()
```

### 画像をリサイズ

ファイルを開き画像情報を取得する。
取得した画像情報をもとに
出力用の画像を作り保存する。

```golang
	// srcファイルを開く
	srcImgFile, err := os.Open(*srcImagePath)
	if err != nil {
		fmt.Fprintln(os.Stderr, err)
		return
	}
	defer srcImgFile.Close()

	// 画像読み込み
	srcImg, _, err := image.Decode(srcImgFile)
	if err != nil {
		fmt.Fprintln(os.Stderr, err)
	}

	srcRct := srcImg.Bounds()
	dstImg := image.NewRGBA(image.Rect(0, 0, *width, *height))
	dstRct := dstImg.Bounds()
	draw.CatmullRom.Scale(dstImg, dstRct, srcImg, srcRct, draw.Over, nil)
	if err != nil {
		fmt.Fprintln(os.Stderr, err)
		return
	}
```

### 指定の画像形式にエンコードする

画像ファイルを作成し、作成した画像をエンコードしてファイルに保存する。

```golang
	// 指定の拡張子にエンコード
	dstImgFile, err := os.Create(*dstImagePath)
	defer dstImgFile.Close()
	switch *dstFormat {
	case "jpeg":
		err := jpeg.Encode(dstImgFile, dstImg, &jpeg.Options{Quality: 100})
		if err != nil {
			fmt.Fprintln(os.Stderr, err)
		}
	case "gif":
		err := gif.Encode(dstImgFile, dstImg, nil)
		if err != nil {
			fmt.Fprintln(os.Stderr, err)
		}
	case "png":
		err := png.Encode(dstImgFile, dstImg)
		if err != nil {
			fmt.Fprintln(os.Stderr, err)
		}
	}
```

# 参考
[flagパッケージ使用メモ](https://qiita.com/178inaba/items/7f412a1acb435a202f5c)
[GoでCLIを作る時に便利なurfave/cli](https://blog.hatappi.me/entry/2017/12/24/134451)
ddbcliを使ってDynamoDBをSQL操作する

# 類似ツール

DynamoDBをSQL操作できるツールはddbcliとDQLがあるようだが、今回はddbcliを使ってみた。

| | https://github.com/winebarrel/ddbcli | https://github.com/stevearc/dql
|---|---|---|
|言語|Ruby|Python|
|Stars|36|81|
|Last commit|8 months ago|6 months ago|
|Contributors|3 | 4|


# ddbcliのインストール

公式に書いてある通り

1. `gem install ddbcli`する方法
2. Releaseから単一ファイルを落としてきてパスの通っているディレクトリに放り込む方法

がある。今回は2の方法をとった。

```
wget https://github.com/winebarrel/ddbcli/releases/download/v0.6.0/ddbcli-0.6.0.gz
gunzip -c ddbcli-0.6.0.gz > ddbcli
chmod 755 ddbcli
```

本当に単一のスクリプトファイルになっており、aws-sdkすらrequireしていないので持ち運びに便利そう。

# 使ってみる

`SELECT ALL`を使うとscanになる。`SELECT`を使うとqueryになる。

```
SELECT ALL id, name FROM people;
```

scanの場合、`ORDER BY`は無いのでRubyパイプ機能を使う。

```
SELECT ALL id, name FROM people | sort_by {|x| x["name"]};
```

条件をつけてアイテム削除もできる。

```
DELETE ALL FROM people WHERE id = '1';
```


## 取得したアイテムリストをパイプ（`|`）でRubyスクリプトに渡せる（すごい！）

```
  ex) SELECT ALL * FROM employees WHERE gender = 'M' | map {|i| Time.parse(i["birth_date"]) };
      [
        "1957-09-16 00:00:00 +0900",
        "1954-12-16 00:00:00 +0900",
        "1964-05-23 00:00:00 +0900",
        ...
```

## 取得したアイテムリストを`!`でシェルコマンドに渡せる

```
  ex) SELECT ALL * FROM employees LIMIT 10 ! sort;
      {"birth_date"=>"1957-09-16", "emp_no"=>452020,...
      {"birth_date"=>"1963-07-14", "emp_no"=>16998, ...
      {"birth_date"=>"1964-04-30", "emp_no"=>225407,...
      ...
```

## 取得したアイテムリストをファイルに保存する（ファイル名をシングルクォートで囲むことに注意）

```
Overwrite
  SELECT ALL * FROM employees > 'foo.json';

Append
  SELECT ALL * FROM employees >> 'foo.json';
```

# 参考

[公式のREADME](https://github.com/winebarrel/ddbcli)
sequelizeでテーブルに変更を加える手順メモ

#### version
`Sequelize CLI [Node: 10.15.3, CLI: 5.4.0, ORM: 5.8.0]`

## テーブルに変更を加える
### 手順
1. migrationファイルの作成
2. 加えたい変更に合ったファイルの編集
3. migrationの実行

## 1.migrationファイルの作成
以下のコマンドを入力すると、migrationファイルの雛形が生成される。

```bash
$ sequelize migration:create --name テーブル名

もしくは

$ sequelize migration:create
```
以下のファイルが生成されます。

```javascript
'use strict'

module.exports = {
  up: (queryInterface, Sequelize) => {
    /*
      Add altering commands here.
      Return a promise to correctly handle asynchronicity.

      Example:
      return queryInterface.createTable('users', { id: Sequelize.INTEGER });
    */
  },

  down: (queryInterface, Sequelize) => {
    /*
      Add reverting commands here.
      Return a promise to correctly handle asynchronicity.

      Example:
      return queryInterface.dropTable('users');
    */
  }
}

```
`up`には、バージョンアップによる処理を記載する。
`down`には、ロールバックにより処理を記載する。


## 2. 加えたい変更に合ったファイルの編集
[公式](https://sequelize.org/master/manual/migrations.html)のマニュアルを参考に。
クエリ操作は[ここ](https://sequelize.org/master/class/lib/query-interface.js~QueryInterface.html#instance-method-addColumn)。
型については[ここ](https://sequelize.org/master/manual/data-types.html)。

複数の操作をする時は、transitionの記述も必要。



## 3. migrationの実行
```bash

$ sequelize db:migrate --env development
```

#### ロールバックはこれ
```bash
$ sequelize db:migrate:undo --env development
```
AWS Organizationsで許可されているデフォルトの組織の数は、

*4*

## 引用

> 組織で許容されるアカウントのデフォルトの最大数は 4 です。制限を増やす必要がある場合は、AWS サポート にお問い合わせください。コンソールの右上隅にある [サポート] を選択し、[サポートセンター] を選択します。[サポートセンター] ページで、[Create Case (ケースの作成)] を選択します。

> アカウントに送信された招待はこの制限に対してカウントされます。招待されたアカウントが拒否された場合、マスターアカウントが招待をキャンセルした場合、または招待状の有効期限が切れた場合は、カウントが返されます。

## 参考

[AWS Organizations の制限 - AWS Organizations](https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_reference_limits.html)
[Unity][Shader] シェーダーのビルドターゲット簡易まとめ

# UnityでのShader実行環境環境について
Shader の簡単な実行環境まとめ

結論的には、モバイルでも全部動かすなら、`#pragma target 2.0`で動くようにする。
2.0が殆どの機種依存を考慮した最低限の環境と考えるのがよさそうではある。

## コンパイルターゲット`#pragma target`

 * 2.0 が DX9シェーダーモデル2.0
 * 2.5 が ShaderLab のデフォルト値
 * 3.0 が DX9シェーダーモデル3.0
 * 3.5 から OpenGL ES 3.0 (ジオメトリシェーダーは含まない)
 * 4.0 から DX11 + ジオメトリシェーダー
 * 4.6 基本的には、これが最高レベル。 Mac にサポートされる OpenGL レベル。セッテレーション対応。


## ジオメトリシェーダー
 * `#pragma geometry`で自動的に target 4.0 になる。
 * Metalではサポートしない。実装に否定的らしいので、当面は将来的にも微妙かもしれない。

## セッテレーション
 * `#pragma hull`で 自動的にtarget 4.6

## GPU インスタタンシング
 * Windows DX11 以上
 * Metal はサポートしている為、Mac、Iphoneは対応できる
 * その他、Vulkan、PlayStation 4、Xbox One、WebGL などに対応

## 参考資料
https://docs.unity3d.com/ja/2018.2/Manual/SL-ShaderCompileTargets.html
など
【Android】テキストの横にアイコンをつける方法

#テキストの横にアイコンをつけるには
UIを変更する際に、**テキストの横にアイコンを表示したい場合の記述方法**について調べてみました。小さいアイコンであれば、下記を追加すれば表示できる

```ruby:.xml
<TextView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:drawableLeft="@drawable/icon_hoge"
    android:text="hoge"/>

```

**android:drawableLeft="@drawable/icon_hoge"**　


該当ファイルの`TextView`に上記一行を追加し、
`@drawable/`の後ろにアイコン名をつける。



参照元：https://qiita.com/tmf16/items/b96ecf2284a7d0b4f997

#アイコンの保存場所

- `res`
  - `drawable-hdpi`
  - `drawable-mdpi`
  - `drawable-xhdpi`
  - `drawable-xxhdpi`
  - `drawable-xxxhdpi`

アイコン画像は5種類書き出しをし、
`res`ディレクトリ内の各フォルダにそれぞれ保存する。
 
#アイコンが表示されたかをbuildして確認する
buildして画面でテキストの横にアイコン画像が表示されているか確認する

テキストとアイコンが近すぎて気になる場合は、先程の行の下に下記を追記する
`android:drawablePadding="Ndp"`

```ruby:.xml
<TextView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:drawableLeft="@drawable/icon_hoge"
    android:drawablePadding="2dp"
    android:text="hoge"/>

```
参照元：https://stackoverflow.com/questions/3337371/androiddrawableleft-margin-and-or-padding

##memo
・アイコンのファイル名はサイズ５種類に対して１つだけ定義すれば良い

--以上
packerでAWSのプロファイルを指定する方法

variablesにaws_profileを宣言し、環境変数(env)から取得するようにします。
builderのprofileにその変数を使うように指定します。

```json
{
  "min_packer_version": "1.4.2",
  "variables": {
    "aws_region": "ap-northeast-1",
    "aws_profile": "{{env `AWS_PROFILE`}}"
  },
  "builders": [
    {
      "profile": "{{user `aws_profile`}}"
    }
  ]
}
```

## 実行

```
AWS_PROFILE=sandbox packer build ファイル
```
サイコロ2個の場合の分散をpython3で解く

###実行環境
python3.4.3

###分散とは

分布の広がりを表します。今回のサイコロ2つの例で言えば、2つのサイコロの目の合計2~12がどれくらいの確率で表れるのか、その分布広がり具合を示す指標です。

###再現したい数式

```math
V(X) = E(X^2) - E^2(X)
```

サイコロが2つなので確率変数は2~12まで、確率の幅は1/36~6/36までです。

###コード例
```python
#SXOEはSquared X of Expectation(Xの2乗の期待値の頭文字SXOEをとりました)
def sxoe():
  xi = [2**2,3**2,4**2,5**2,6**2,7**2,8**2,9**2,10**2,11**2,12**2]
  pi = [1/36,2/36,3/36,4/36,5/36,6/36,5/36,4/36,3/36,2/36,1/36]
  expectation = 0
  for x,p in zip(xi,pi):
    expectation += x*p
  return(expectation)

#SEはSquared E(Xの期待値の2乗の頭文字SEをとりました)
def se():
  xi = [2,3,4,5,6,7,8,9,10,11,12]
  pi = [1/36,2/36,3/36,4/36,5/36,6/36,5/36,4/36,3/36,2/36,1/36]
  expectation = 0
  for x,p in zip(xi,pi):
    expectation += (x*p)
  return(expectation**2)

def dispersion():
  return(sxoe() - se())

print(dispersion())

```

出力結果

```
5.833333333333336
```

###終わりに
numpyを使えば一瞬ですが、今回は自分で実装しました。
もっと効率のよい書き方や分かりやすい変数名があるよという方はコメントで是非ご意見ください。
APIを叩く時はパーセントエンコーディングしよう

salesforceでAPI叩く時に username に Gmail のエイリアスを使用してハマったので備忘録

salesforceのusernameにGmailのエイリアスを使用していた場合、 `+` をパーセントエンコーディングしないと弾かれる

上記の場合、 hoge`%2B`dev@gmail.com として username を送ると成功する

例：
salesforce 登録時、 hoge@gmail.com の エイリアスとして hoge`+dev`@gmail.com を username でユーザ登録した場合、APIを叩く時のパラメータは `username=hoge%2Bdev@gmail.com` になる

なお、 `.` や `@` はエンコードしなくてよいみたい （しても成功する）
古いアプリでテキストボックスの文字化け

下記現象がありました。
・VC6時代の古いアプリケーション
・テキストボックスへの入力文字が文字化け（フォントは「ＭＳ　Ｐゴシック」）
（文字幅が極小で表示されてしまう。下記画像では「123456789」を入力）
![入力例（文字化け）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/baddd756-7b2c-8ffb-e959-e0d609704cd7.png)

・Windows10で発生 (バージョン1607 (LTSB2016）と1903で再現環境あり）
・PCによって発生する、しないが異なる

対策として色々試しましたがWeb検索で出てくる方法は全滅だったのですが、下記設定で回避できましたので参考までに。

・「カラーモードを制限する」にチェック
![対策設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/aa8f3c49-ca9e-fcce-ff17-942a2c1e458d.png)

対策後、以下のように正常表示できました。
![対策後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/243968/be6ab3d3-7695-9c7b-d6fe-92b052d42936.png)
IPアドレスの計算方法を簡単にしてみた

第１回目の初投稿です！
ということで、これからネットワークやサーバーを勉強しようと
思ったのですがいきなりIPアドレスでつまずいたので
備忘録として残します。

参考サイト様：https://miyabi-lab.space/blog/8

<h1>そもそもIPアドレスって？</h1>
IPアドレスとはなんだ？
というところですがこれは他サイトなどでたくさん調べれば出てきます。

そう！
ネットワーク上の住所！！！（詳しくは他サイトで知らべ・・・て・・）

もう少しだけ掘り下げると、
自宅のパソコンやスマートフォンでネット検索したことありますよね？
その時にどこどこのだれだれのサイトだよーーっていうのがわかるために
存在するのがIPアドレスってやつ（らしい笑）

そして、日本の住所とかだと何丁目の何番地のどこどこマンション～
って感じで住所がわかるけど、パソコンは全て数字しか理解してくれないので
IPアドレスは数字で構成されてるのだ。（ドヤー）

そしてIPアドレスは数字の「0」と「1」だけで成り立ってる

ここまでいけてる？（・・・おそらく・・・）

<h2>２進数と１０進数</h2>
前説はこのくらいにしてさっそくその計算方法を・・・
の前にそもそもIPアドレスが数字で構成されてるのはわかったけど
数字でどうやって住所がわかるの？？
ってことで２進数、１０進数ってのがでてくるのだ

数学得意な人はわかるかもだけど、僕みたいに文系、学歴底辺の人は
？？？？？？ってなるのがこれ。

<h3>簡単に説明</h3>
８桁(8bit)を４つずつに区切り(4ｵｸﾃｯﾄ)それの合計が３２bitになる
８ケタで可能な組み合わせは2の8乗で256通り
１０進数では0～255の256通り。
8bit 4オクテットでは、2の32乗 約４３億通りになる

まぁよくわからないようなわかるような・・・ってところで
２進数でいうと、

最小：00000000.00000000.00000000.00000000

最大：11111111.11111111.11111111.11111111

↑のように最小～最大の間で43億通り組み合わせがあるのだ！


補足：
上記で話したのはIPv4というIPアドレスだが４３億通りだとネット普及の昨今では足りないのでIPv6というほぼ無限に使えるIPアドレスへの移行が進んでる



ただこの２進数だと人間には読みずらいので、１０進数に変換するって
ことでここで１０進数様が登場！

<h3>変換方法がこちら</h3>

０１０１０１０１という2進数が
10進数の85になる仕組み

0 * 2^7 = 0 * 128 = 0
1 * 2^6 = 1 * 64  = 64
0 * 2^5 = 0 * 32  = 0
1 * 2^4 = 1 * 16  = 16
0 * 2^3 = 0 * 8   = 0
1 * 2^2 = 1 * 4   = 4
0 * 2^1 = 0 * 2   = 0
1 * 2^0 = 1 * 1   = 1
↑の数字の計算結果を足し合わせる
0 + 64 + 0 + 16 + 0 + 4 + 0 + 1
合計：85


ということになるのだー

計算終わり。
webarenaでubuntu その44

#概要

webarenaでubuntu18.04やってみた。
apache2.4 perl5.26 やってみた。
cgiやってみた。

#設定


```
sudo a2enmod cgid
```

#000-default.confの修正


```
<VirtualHost *:80>
	ServerName hoge.com
	ServerAdmin hoge@localhost
	DocumentRoot /home/hoge/public_html/
	<Directory /home/hoge/public_html>
		AllowOverride None
		Require all granted
	</Directory>
	ScriptAlias /cgi-bin /home/hoge/cgi-bin
	<Directory "/home/hoge/cgi-bin">
		Options +ExecCgi
		AddHandler cgi-script .cgi
		AddHandler text/html .html
		AllowOverRide All
		Require all granted
	</Directory>
</VirtualHost>
```

#サンプルコード

```
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<html>\n";
print "hello\n";
print "</html>\n";
```

以上。
読書

##### こころえ　的な何か
読書するにあたって。

>長い人生において、恐らくはセミナーや講義に参加するよりも本を読むことのほうが
>遥かに多かったことでしょう。  
>しかし、読書は他の体験的な学習と比べ最も効果の低い学習法なのです。  
>- Andy Hunt 『リファクタリング・ウェットウェア』

より効果的に、意識的に読書するにはどうしたら良いか？

#### SQ3R という技術

##### ・Survey 調査  
全体の要旨をつかむため、目次と各章の要約を流し読みする。
##### ・Question 質問
質問点を書き出す。  

##### ・Read  読書　　
全文を読む。
##### ・Recite 復唱
要約し、ノートに書き、ポイントを纏める。
##### ・Review まとめ
もう一度読み、さらにノートに書きだし、仲間と議論する。
MATLABで株価データ自動取得　その3　アプリの作成

# これまで
MATLABでYahoo Financeから自動データ収集、移動平均計算、可視化までができた。

# アプリの作成
これまで作った機能をまとめてアプリを作成してみた。
MATLABのアプリ開発環境はAppDesignerというのが最近できて、昔のGUIDE機能よりずいぶん使いやすくなった。

GUIの作成画面と
![CreateApp1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/9a8dae1a-b56e-305c-1371-1111bae790e2.png)
コードを書く画面を
![CreateApp2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/a454a599-742e-d840-1002-e82745dd6194.png)
行ったり来たりしやすくなった。
コード量が多くなってくると、ちょっと動きがもっさりしてくるのがイマイチだけど。

あと、コンポーネントブラウザ上でコンポーネントの順番を入れ替えられないのも不便。
コンポーネントが多くなってくると、どこにどのコンポーネントがあるのか探しにくい。
（誰か知ってたら教えて欲しい！）

#作成したアプリ
細かい説明は置いておいて、作成したアプリはこちら。

##左側タブグループ
###チャート
全銘柄リスト（右枠）から銘柄選択したり、社名や株価コードを入力して、ローソクチャートと移動平均を表示。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/b132ed3e-6432-8361-50b3-54ce19d0ddb3.png)

時間軸の表示期間は期間と開始日を1日単位で調整できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/49584efa-da21-77db-63ce-d3b6e17e973b.png)

GUI左下にあるデータアップデートボタンを押すと、Yahoo Financeからデータをスクレイピングして、データを自動的にアップデートしてくれる。

###スクリーニング1
ここは銘柄のスクリーニングを行う画面。時価総額、PER、PBRなどの値と不等号の向き（≧または≦）を設定して、スクリーニングする条件を設定する。社名に含まれる文字列、上場している市場や業種でもスクリーニング可能。スクリーニングされた銘柄は右側タブグループの「スクリーニング」および、中央タブグループの「指標」に表示される。

例えば時価総額1000億以上、PER15以下、PBR0.8以下、EPS200以上という条件を入れて、大企業で利益もあるのに、安値に放置されている銘柄をスクリーニングすると、出てきた銘柄がこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/95dc5b1c-e54b-80fe-6827-c83f154d08d0.png)

###スクリーニング2
ここがオリジナルで、更に移動平均の連続上昇または連続下降している銘柄、つまり一定方向に継続して値動きしている銘柄をスクリーニングできる。開始日を0、連続継続期間を3～11日に設定して、最終的にスクリーニングされた銘柄が、1662石油資源開発と4631DIC。下はDICのチャートで、継続して上昇が連続していることがわかる。今後も大きな情勢の変化が無ければ、上がることが予想できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/e8269667-5c66-b392-15e9-a0137babb30e.png)

空売りにも対応しているので、画面のマイナスボタンを押せば、下降している銘柄を抽出することもできる。

##中央タブグループ
###チャート
上にローソクチャート、5, 10, 15日移動平均線を表示する。
下側は、移動平均の5日>10日>15日が継続した日数をPPP、逆に5日<10日<15日が継続した日をNNNとして、その日数と各日の値幅を上昇/下降のエネルギーとみなして表示する。市場がどれぐらいの盛り上がりを持って、上昇または下降しているのかを判断する指標となっている。

###指標
ここにはスクリーニング1で使用する各銘柄の指標がリスト化されて表示してある。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/0bb678fb-6b0c-beee-4264-964477289882.png)

###センチメント
ここは作成中。Webニュースから得た文字列データを使って、ワードクラウドを作成しようと思っている。
以下はテスト中の画面だが、有効なデータを意図したようにふるい分けできていないので、どうでも良い単語ばかりが表示されてしまっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/477651/54eef6d5-644c-c7ad-5955-4ba64e362187.png)


※投資判断には一切責任を負いませんので、各自の判断でお願いいたします。

#今後
とりあえずデータ収集～表示までできたので、今後は解析機能を充実させていきたい。
Taskってなにもの


Taskは非同期処理


、、、？

非同期の説明が上手く出来ないから図で。

![Task.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364768/b5c4c488-6bb9-b513-2528-ef0d336e0d7d.png)


裏がわで平行していく処理的な感じ。
terraformでAWSのキーペアを作成する方法


```hcl
resource "aws_key_pair" "master-key" {
  key_name   = "master-key"
  public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCys/I6ntEqt2g9zHgb4Wa1rww05YgcZYHs8lhGmFYjBcySur1uD2/HTSLYvm12373hKDaACJu9OiwJPugd5BE4a6PC2xozTyBJfHBxAZO3aoQn/qQNmAG+v8WTsToQGvQiLxg91r8JXDbr1tofdBTQua+UiEIFifQB4yFaHNo2UyA2WR9gSfY7hmScNDYlcU7OKsO/B45hl+41/iyBeJeBdBucW7iC7JDFPjaboBTi7h6BZeVP1kp8wWk3Ox8woCtiBcsahk/fn9EXiDRq+1IPCcNzPGlhF5dyjwKAWYdFC59tGxaIeKpXMNgPI+J3b8UqY68DCM/9FNzwDH7ojjXn dummy@local"
}
```

`public_key` にOpenSSH形式の公開鍵を指定します。

(サンプルに指定している鍵はダミーです。)
Task使用のメソッドを使いたい



処理が同じなのに型がTaskでどうやって使ったらいいかわからない…

 ```
private async Task<ReportSettingModel> GetReportSettingAsync()
        {
            Control control;

            if (OptionInfo.XXX== true)
            {
                control = AAA
            }
            else
            {
                control = BBB
            }
            if (control == null)
            {
                await ShowMessage("000009", "エラーありま～～す");
                CloseWindow();
            }
            return new ReportSettingModel(control);
        }

```
- Controlモデルの中のCCCだけを取り出したい!!!!!!!

呼び出し側で⇓⇓⇓のように記述

```
ReportSettingModel reportSetting = await GetReportSettingAsync();
SearchCondition.ReportTitle = reportSetting.CCC;
```

VSでは親切に使い方書いてくれてた、、、

```
ReportSettingModel XXX = await GetReportSettingAsync();
```