OmniAICreator/Qiita-1.07M huggingface dataset:
Tinkercad > link: API TINKERCAD PARAMETRIC DESIGN > パラメータ付きBox | Autodesk Creative Platform Core Version 1.19.0

ブラウザ動作するAutoDeskのTinkercad。

## 関連

- [Tinkercad > Shape Generator > Icosahedron > vert()とtri()で形状定義](https://qiita.com/7of9/items/aeb42205f7c3ed90822a)
- [Tinkecad > Shape Generator > JavaScriptによる形状の生成](https://qiita.com/7of9/items/e3f6f0613157a6bbdcf1)

## link1

Shape GeneratorのAPIについて調べているうちに以下を見つけた。

[API TINKERCAD PARAMETRIC DESIGN](http://blascarr.com/api-tinkercad/) @ Blascarr by Adrián

フランス語かと思ったが、スペイン語かもしれない。
スペイン語はさっぱりわからないでござる。

プログラムとリンクは参考になるかもしれない。

### パラメータ付きBox

> El código para crear un trapecio es el siguiente.

意訳「台形を作成するコードは次のとおりです。」

以下のコードをShape generatorのmain.jsに上書きしてみた。

以下のパラメータを持つBoxが出来上がった。

- 上面半径
- 底面半径
- 長さ

オブジェクト名が「Empty」になってしまう (main.jsの作成時に「Empty」を選択している）。
オブジェクト名は左メニュー「Settings」で変更できる。

```main.js
var Conversions = Core.Conversions;
var Debug = Core.Debug;
var Path2D = Core.Path2D;
var Point2D = Core.Point2D;
var Point3D = Core.Point3D;
var Matrix2D = Core.Matrix2D;
var Matrix3D = Core.Matrix3D;
var Mesh3D = Core.Mesh3D;
var Tess = Core.Tess;
var Solid = Core.Solid;
var Vector2D = Core.Vector2D;
var Vector3D = Core.Vector3D;
 
var Generator = {
 
   parameters: function(callback) {
      var params = [
         { "id": "r1", "displayName": "Top radius", "type": "float", "rangeMin": 1, "rangeMax": 100, "default": 20.0 },
         { "id": "r2", "displayName": "Bottom radius", "type": "float", "rangeMin": 1, "rangeMax": 100, "default": 20.0 },
         { "id": "length", "displayName": "Length", "type": "float", "rangeMin": 1, "rangeMax": 100, "default": 20.0 }
      ];
      callback(params);
   },
 
   evaluate: function(params, callback) {
      var path = new Path2D();
      //creacion del trapezoide
      var r1 = params["r1"];
      var r2 = params["r2"];
      var l = params["length"];
 
      path.moveTo(r1,0);
      path.lineTo(-r1,0);
      path.lineTo(-r2,l);
      path.lineTo(r2,l);
      path.close();
      var solid = Solid.extrude([path], 20);
 
      var trap_mesh = solid.mesh;
      trap_mesh.debug();
 
      var s = Solid.make(trap_mesh);
     callback(s);
   }
};
 
// Returns the object-oriented shape generator,
function shapeGenerator() {
   return Generator;
}
```

複雑な形状はSTLファイルを外部コードで生成し、Tinkercadに読込めばいいと思っていた。
しかしながら、その場合、パラメータによる形状の変更ができない。
上記のようなコードを用意すれば、ユーザ自身がパラメータを変更できる。

Gaussian random sphereやballistic-cluster-cluster aggregatesなどをパラメータで変更できるだろうか。


## link2

上記からたどったリンク

https://api.tinkercad.com/libraries/1vxKXGNaLtr/0/docs/index.html
2014年の内容。


### スペイン語

El código para crear un trapecio es el siguiente.

意訳「台形を作成するコードは次のとおりです。」

- El código
    - the code
- para crear 
    - to create
- un trapecio 
    - 台形
    - a trapezoid
- el siguiente.
    - is following???

Salobreñaで飲んだトルコーティーは絶品だった。
OS別 設定画面へのリンク

通知画面へのリンク iOS11以下

```swift
guard let bundle = Bundle.main.bundleIdentifier else { return }

if #available(iOS 11.0, *) {
    let path = "app-settings:root=NOTIFICATIONS_ID&path=" + bundle
    if let url = URL(string: path) {
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
    }
} else if #available(iOS 10.0, *) {
    let path = "App-prefs:root=NOTIFICATIONS_ID&path=" + bundle
    if let url = URL(string: path) {
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
    }
} else {
    let path = "prefs:root=NOTIFICATIONS_ID&path=" + bundle
    if let url = URL(string: path) {
        UIApplication.shared.openURL(url)
    }
}

```

通知画面以外のURLスキーマは[こちらから](https://qiita.com/shnj884/items/1bb1b2b3360a009f154c#url%E3%82%B9%E3%82%AD%E3%83%BC%E3%83%A0%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB)
AutoScaling概要

AWSコンソール上ではコンピューティング -> EC2の中にある
管理ツールにある「AWS Auto Scaling」とは[別物](https://aws.amazon.com/jp/autoscaling/?sc_channel=PS&sc_campaign=acquisition_JP&sc_publisher=google&sc_medium=ec2_b&sc_content=auto_scaling_e&sc_detail=aws%20auto%20scaling&sc_category=auto_scaling&sc_segment=172823837232&sc_matchtype=e&sc_country=JP&sc_brand=brand&ef_id=Wg0sEAAAAITAKyhr:20180305000018:s)っぽい。
今まで使用していたのものは「Amazon EC2 Auto Scaling」になるのかな。

### Amazon EC2 Auto Scalingの構成要素
- 起動設定
- Auto Scalingグループ
- Scalingポリシー

### 起動設定
- AMI
- インスタンスタイプ
- 起動設定の名前
- IAMロール(なしでもOK)
- スポットインスタンス利用する/しない(価格設定)
- 詳細モニタリングを有効化するか
- ストレージ・セキュリティグループ
- key pair

### Auto Scaling グループ(起動設定含む)
- グループ名
- グループサイズ(開始時のインスタンス数:0も可)
- ネットワーク(VPC/SUBNET)
- ClassicLoadBalancerのAutoScalingに紐づけるか
- ヘルスチェック(インスタンスサービス開始からの猶予時間。ロードバランサーと紐づけるとELB,EC2の選択もある)
- インスタンスの保護(スケールインしない)
- [サービスにリンクされたロール](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/using-service-linked-roles.html)
- 通知設定
- Tag

上記で作成したAuto Scalingグループに対して、ポリシーを設定する
(グループ作成時、作成後のどちらでも可)

### Scalingポリシー
- 名前
- メトリクスタイプ(ターゲット別リクエスト数/CPU平均使用率/平均NW入力バイト/平均NW出力バイト)
- ターゲット値(メトリクスタイプの閾値)
- ウォームアップする秒数(この間はグループのメトリクスに入らない)
- スケールインの無効化


### 補足
基本的に素のAMIを使用することはないはずなので、カスタムしたAMIか、ユーザデータを利用して初期設定をするかの選択。カスタムAMIをAWSではGolden AMIと呼ぶ  

運用方法として下記が考えられる  
負荷に合わせてスケールさせるケース

- スケジュールベース: ピーク時間がわかる場合に採用する。Pre-Warmingの申請との違いがよくわからない
- ルールベース: スケーリングポリシーで設定したメトリクス/ターゲットでスケールさせる

障害時に備えるケース

- オートヒーリング: 最小台数を希望台数を合わせることによって台数を維持する。
      インスタンスの起動時間を待てるサービス(最低15分程度のサービス停止)であれば、最低1台は動く様に設定することで自動化できる
JSON文字列の判定。これ一行で動くけれどもこれ以外に方法はないのか？

### いつも使っている判定。一度パースできるかチェック、エラーならJSON文字列ではない、、、という強引さ。
```js
let is={}
is.jsonString =function(d){ try{JSON.parse(d);return true}catch(e){return false} }
```
### これ以外に方法はないのか。二重にparseするのが欠点。

### テスト用
```js
let is={}
is.jsonString =function(d){ try{JSON.parse(d);return true}catch(e){return false} }
;
let plainurl ='https://gist.githubusercontent.com/gnjo/a4605298aa876a7e0ebb98406ceb6d34/raw/ee252adbc06d24af96cbeada70b55c745271f7c0/test.md'
,jsonurl='https://gist.githubusercontent.com/gnjo/3714ba74ea32f760c552b26a0b482e89/raw/53e5f8e63aa7233394e3d1b7ce6d6856e9c782b7/___oldimgur___'
,log=(d)=>{console.log(d);return d}
,check=(d)=>{return is.jsonString(d)? JSON.parse(d) : d}
//,check=(d)=>{return is.XXXXXXXXXXXXXXXXX(d)? JSON.parse(d) : d}
;
fetch(plainurl)
  .then(res=>res.text())
  .then(log)
  .then(check)
  .then(log)
;
fetch(jsonurl)
  .then(res=>res.text())
  .then(log)
  .then(check)
  .then(log)
;

```
CSVを取得する

ボタンクリックでCSVを取り込むスクリプト

```Excel:getCSVSample.vba
Private Sub CommandButton1_Click()

Dim varFileName As Variant
Dim ro As Long
Dim date_time As Variant
Dim ws As Worksheet

Set ws = ThisWorkbook.Sheets(2)　'CSVを書き込むシート番号
'--------< 画面を更新と計算を止める >--------------------
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
'------------------------------------------------------
ro = 0
ro = ws.Cells(Rows.Count, 1).End(xlUp).Row

'-----------------getFilename--------------------------
varFileName = Application.GetOpenFilename(FileFilter:="CSV(*.csv),*.csv", Title:="SelectCSV")
    If varFileName = False Then
        Exit Sub
    End If

i = 1
    Open varFileName For Input As #1
    Do Until EOF(1)
        Line Input #1, buf
        tmp = Split(buf, ",")
        ws.Cells(i, 1).Resize(1, UBound(tmp) + 1).Value = tmp
        i = i + 1
    Loop
    Close #1
    MsgBox (i & "件のCSVデータを取り込みました")
    
'--------< 画面を更新と計算を再開　 >--------------------
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
'------------------------------------------------------
End Sub
```
パブリッククラウド推進の為に理解すべき3つの事

唐突ですが AWS、Azure、GCP等のパブリッククラウドに対して、適切な理解を進める為に、私が掲げる3項目を備忘録代わりに残しておきます。

## 1.利用するという考え方へのシフト

「クラウドに預ける、任せる」という考え方から脱却し、単に利用者がそれぞれのサービスを使うかどうかというドライな考え方をしましょう。
AWSやAzureは「任された」なんてこれっぽっちも思ってくれません。
彼等が提供しているのはただの標準サービスです。

標準サービスというのは、身近な所ではコインロッカーなんかがいい例です。
コインロッカーというサービスは、だいたい以下のような仕様で提供されているでしょう。

 * 施錠可能なスペースのレンタルサービス
 * サイズは 30cm～数メートル 四方まで様々
 * (主に)材質はスチール
 * (主に)鍵はディスクシリンダー錠
 * 設置されている場所は公共のスペースや私有地内である
 * 利用料は100-500円程度で明示されている
 * 連続使用は3日-1週間程度に制限されていて、明示されている
 * 管理者はマスターキーをもっている

このように仕様や料金が、一定且つ明確に提供されているサービスの総称が標準サービスだと理解ください。

こうした仕様を基に、利用者は「どのくらいの期間」「どの程度貴重なものを」預けるか検討します。
また、例えば「2番のスペースをピッキングに強いディンプルキーに変更してくれ...」等、要望を出すこともありませんね。
よほど大規模なケースでない限り、標準サービスに対してこのようなRFPを出すような事もないでしょうから、提供されているありのままを使う形で検討をスタートさせるでしょう。

AWSで言うところのEC2やS3も同じような標準サービスと捉えて下さい。

**「AWSに○○を任せられるか、預けられるか」**ではなく、**「○○を構築するにあたって、EC2やS3が適しているか」**という視点で議論を進めたほうが良いです。

そうする事で、オンプレシステム比でどういった点が懸念かが見えてくるでしょうし、懸念を払拭出来るのか、それともリスクを受容しなければいけないのか等、議論を前に進める事が出来るでしょう。

## 2.単純にコストが下がるという幻想からの脱却

必要最低限の稼働時間でインスタンス利用する等、しっかりとパブリッククラウドの料金体系にフィットさせる事が出来れば結果的にオンプレミス比でTCOを削減出来る可能性は高まります。
しかし、システム全体を単純に移行した場合、コストはむしろ上昇する傾向があります。

コストについての議論を進める場合にはこうした側面を正しく理解し、現状抱えている課題に対して、付加価値を以ってコスト比較をするアプローチが適切だと考えます。
例えばこのような比較をした場合は、ほぼ間違いなくAWSにコストメリットがあるでしょう。

  * BCPの観点からバックアップデータをリモートサイトへ転送したい
   * オンプレミスの場合:追加DCの契約やデータ転送のオペレーションによるコストを試算
   * AWSの場合:別リージョンのS3利用料、データ転送料、バッチジョブを実行する為のコストを試算

その他にもコスト削減につながりやすい代表的な仕組みとしては、AWSだと以下のようなものがあります。

　・オンプレミスでは出来ない事(実現難易度が高い事)
　　・マネージド型サービスの利用
　　・ネットワーク、コンピューティングの迅速なデリバリー
　　・世界規模でのDR、BCP

　・豊富なエコシステムの活用
　　・Cloudwatch利用
　　・ACMによるSSL証明書取得

移行初期では利用しないにしても、将来的にこれらのサービスを使う予定があるのならば、必要になったタイミングで余計なキャッシュアウト無く直ぐに利用可能だという付加価値に追加コストを払ってもいいんじゃないでしょうか。

## 3.セキュリティへの不安は明確に持つべし

「AmazonやMicrosoftやGoogleといった超大企業で超優秀な人間が揃いまくってる会社が開発し、運用しているインフラやアプリを使うのと、自社のオンプレミスを比較する意味がよく分からない。戦う相手にしてはでかすぎる。」
　～ロードバランスすだちくんブログ からの引用～

痛快ですね、この方のブログエントリはタテマエとかが無いのでスッと入ってきます。
ご興味の有る方は最後にリンク貼りますので原文をどうぞ。

単純なアウトサイダー型攻撃に対するセキュリティという事だと、一企業レベルで構成可能なインフラを遥かに凌駕するレベルで考え抜かれている事はあえて言うまでもないですね。

しかし、セキュリティは結局の所自己責任です。
具体的なリスクをリストアップして、そのリスクに対して、EC2・EBS・ELB等ではどのように対策可能なのか、どういった部分にコントロールが必要なのかを「個別に解決」していく必要があります。

Gartner社は 「完璧なセキュリティ」 を目指すのではなく、ビジョンとして「レジリエンス (回復力)」を掲げ、まずは説明責任が果たせるレベルを目指すといいんじゃないかと言っています。
ここで定義されている「説明責任」とは「個別に解決」した上記のプロセスそのものですね。

第三者が運用するという事そのものに対して漠然とした懸念があるという事だと、SaaS型の Office365や、GMail等、同様の理由で採用を見送らなければいけないサービスが山のように出てきてしまいます。

まずは漠然とした不安を、「個別に解決」するプロセスを経て、明確化していく事が不安解消への近道です。 


## 最後に

### 本稿の作成にあたり、参考にさせていただいた内容は以下の通りです。

 * ロードバランスすだちくんブログ
  * https://blog.animereview.jp/gartner_cloud_2017_q1/
  * https://blog.animereview.jp/20170121/

 * Gartner社レポート
  * 「2018年の展望：日本におけるサイバーセキュリティ」INF-18-18
Omise Schedule APIのリトライ機能について

# Schedule API（定期課金）のリトライ機能について

OmiseのSchedule APIにはリトライ機能があります。

[Omise Schedule APIのリトライ機能](https://www.omise.co/how-retries-work-for-scheduled-transactions)

上記リンクの内容をまとめると、

課金のためのスケジュールAPI(**Charge Schedule API**)は、リトライできます。
振込のためのスケジュールAPI(**Transfer Schedule API**)は、リトライできません。


## 課金スケジュール(Charge Schedule API)のリトライ
**Charge Schedule API**のリトライは例えば以下のシナリオです。

1. 顧客Aに対し、あなたが毎月28日に課金をするスケジュールを作成したとする。
2. 顧客Aのカードが何らかの理由（盗難カード、残高不足など)で使えないやつだった
3. 2.により、例えば1/28の課金が失敗する。
4. すると、翌日の1/29日に自動的に課金がリトライされる（**1回目のリトライ**）
5. 4.が失敗した場合、さらに翌日の1/30日にまた課金がリトライされる（**2回目のリトライ**）
6. 5.が失敗した場合、スケジュールは停止される。

<img width="426" alt="Screen Shot 2018-03-05 at 11.51.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/148353/389bda84-8503-b6f7-c01f-1ac24b889871.png" height=499>

### 2/28が定期課金の日付だったらどうするのか

この場合、3/1, 3/2という風にリトライされます。

## 注意事項

現時点では、Omiseの Schedule APIは最大28日までしか日付を選ぶことができません。
28日より後を選ぶと、以下のようなレスポンスが返ってきます。

```
curl -s https://api.omise.co/schedules \
    -X POST \
    -u skey_test_5b3qimoominjmcm0omin: \
    -d "every=1" \
    -d "period=month" \
    -d "on[days_of_month][]=31" \
    -d "start_date=2018-03-05" \
    -d "end_date=2118-02-09" \
    -d "charge[customer]=cust_test_5bmoominal49amoomin2k" \
    -d "charge[amount]=100" \
    -d "charge[description]=Membership fee"

{
  "object": "error",
  "location": "https://www.omise.co/api-errors#bad-request",
  "code": "bad_request",
  "message": "on [days_of_month] must be an array of integer values (1 - 28)"
}
```

## まとめ

定期課金には最大２回のリトライ機能（なので最大３回の課金トライ）が備わっています。基本、定期課金は28日までしか設定できません。また、リトライは1日間隔で行われ、2/28からのリトライは、3/1, 3/2と繰り越されます。
標準入出力まとめ

様々な言語での標準入出力をまとめていきたいと思います。
随時言語を追加していきます。
[目次](https://qiita.com/ebiyuu1121/items/686682be61bf8ccc1a63)
## 注意
C,C++に関しては

```c
#include <stdio.h> //c
#include <iostream> //c++
```
をヘッダに書くことは前提としています。
CのものはもちろんC++でも作動し、こちらの方が高速なことが多いです。

# 入力

## 1行に一つの値
### Python3
```Python
s = input() #s:string
i = int(input()) #i:int
f = float(input()) #f:float
```
### Python2
```Python
s = raw_input() #s:string
N = input() #入力を式として解釈
```
### C
```c
scanf("%c", &c); //c:char
scanf("%d", &i); //i:int(10進数)
scanf("%f", &f); //f:float
scanf("%s", s); //s:文字列配列
```
### C++
```cpp
std::cin >> a;
```

<font color="Red">
※追記
C,C++の例は意図しない結果を引き起こすことがあるとの指摘をコメントでいただきました。
説明して頂いている記事があったので貼っておきます。詳しくはこちらを参照ください。
https://qiita.com/yumetodo/items/238751b879c09b56234b
</font>

## 1行にスペース区切りで複数の値をリストに
### Python3
```python
l = input().split() #文字列で入力 l:list
l = list(map(int, input().split())) #整数に変換 l:list
l = [int(i) for i in input().split()] #同上 リスト内包表記を用いたもの
#mapとリスト内包表記のどちらが速いかは場合により異なる
```
### Python2
```python
l = raw_input().split() #文字列で入力 l:list
l = map(int, raw_input().split()) #整数に変換 l:list
```
### C
```c
for(int i=0,i<N,i++) scanf("%d", &l[i]); //スペースを自動的に区切りとして認識する
```
### C++
```cpp
std::cin >> a; //遅い
```

## 1行にスペース区切りで複数の数値を変数に
### Python
```python
a, b, c = map(int,input().split())
```
### C
```c
scanf("%d%d%d", &i, &j ,&k); //スペースを自動的に区切りとして認識する
```

# 出力
### Python2
```python
print a
print a, #改行をスペースに変更
print(a) #かっこはあってもなくても良い
```
### Python3
```python
print(a) #かっこは必要
print(a, b, c) #複数出力(スペース区切り)
print(a, b, c, sep=',') #区切りを変更
print(a, end=' ') #最後に出力する文字を変更
```
### C
```c
printf("%s %s", "Hello", "world"); //'Hello, world'
printf("%c",'a'); //char
printf("%f", 3.14); //float
printf("%d", 334); //int(10進)
printf("%10s", "I'm fine."); //文字幅(10)指定
printf("%.2f", 3.14159); //"3,14" 小数点以下桁数(2)指定 この二つは同時設定可
printf("%.2e", 114.514); //"1.15e+02" 指数表示
printf("%05d", 34); //"00034" 0詰め
printf("%-10s", "Hello"); //左づめ
printf("%+d", 10); //"+10" 符号表示
```

### C++
```cpp
std::cout << a << std::endl; //改行あり 遅い
std::cout << a << '\n'; //改行あり 速い
std::cout << a; //改行なし
```
VisualStudioでJSONからクラスを簡単に作成する


# 開発環境
Visual Studio 2017 (C#)

# 初めに
自分で作成したAPIであれば、クライアント側のクラスもそのまま流用できますが、他の方（他社）が作成したAPIから返されるJSONの場合は、クラスの作成がめんどくさいと思ったことはないでしょうか？
VisualStudioの機能で簡単にJSONからクラスを作成することができます。

# 手順
## 作成したいクラス名をまず追加します。

- 今回は、サンプルなので、SampleJSON.csにしています。

![WS000000575.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/50287a57-e70a-bd5c-5662-d2a79219798f.jpeg)

## JSONをコピーします。
- APIをコールします。（GETの場合）
- Chromeであれば、ブラウザで表示されるているのでそれをコピー。
- IEであれば、ファイルがダウンロードされるので、それを開いてコピー。

![WS000000576.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/614c0534-7924-b84e-e386-001c0634b9a0.jpeg)

## VisualStudioに貼り付け
- 最初に作成したクラス内に張り付ける際に、「`編集`」 > 「`形式を選択して貼り付け(S)`」 > 「`JSONをクラスとして張り付ける(J)`」を選択します。

![WS000000577.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/986e1895-bea7-b891-296b-8704275cfd03.jpeg)

- この際、張り付ける場所は、既に作成したクラス名の下に張り付ける良いかもしれません。

```csharp:SampleJSON.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace WpfApp1
{
    class SampleJSON
    {
    }

    // ここに張り付ける
}
```

- 貼り付けが完了するとクラスが生成されています。

![WS000000578.JPG](https://qiita-image-store.s3.amazonaws.com/0/90597/9b63b382-51cb-c2f7-d9c5-cd57378c3147.jpeg)

- あとは、`Rootobject`となっているところをクラス名に変更してあれば、完了
- 例としている`class SampleJSON`は削除する。

```csharp:変更前
    class SampleJSON
    {
    }

    // ここに張り付ける

    public class Rootobject
    {
        public Result[] result { get; set; }
    }
```

```csharp:変更後
    public class SampleJSON
    {
        public Result[] result { get; set; }
    }
```

# まとめ
- 自動判断されている部分を若干修正するだけで、ある程度が作成してもらえるので、JSON取得できれば、比較的楽にクラスを生成することができます。
- また、List\<T>型としてであれば、RootObjectを削除するだけで済みます。
Project Euler 46 「もうひとつのゴールドバッハの予想」

# Problem 46 「もうひとつのゴールドバッハの予想」
Christian Goldbachは全ての奇合成数は平方数の2倍と素数の和で表せると予想した.

9 = 7 + 2×1^2
15 = 7 + 2×2^2
21 = 3 + 2×3^2
25 = 7 + 2×3^2
27 = 19 + 2×2^2
33 = 31 + 2×1^2

後に, この予想は誤りであることが分かった.
平方数の2倍と素数の和で表せない最小の奇合成数はいくつか?

```python
def hoge():
    N = 33
    while True:
        N += 2 # 奇数なので+2ずつカウントアップ
        # 合成数 = 素数ではない
        if not is_prime(N) and \
           not any(is_prime(N - n**2 * 2)
                   # 最小の平方数の2倍（2）をNから引いておく
                   for n in range(1, int(((N-2) / 2) ** 0.5) + 1)):
            return N

def is_prime(n):
    if n < 2: return False
    if n == 2: return True
    if n % 2 == 0: return False
    return all(n % i != 0 for i in range(3, int(n ** 0.5) + 1, 2))

print(hoge())
```
fluentdクイックツアー

#概要
fluentdをインストールして動作確認する。

社内セキュリティに幽閉されてる人はproxy設定をする。

#手順

#### (1) proxyの設定(curlを使うため)
```shell
$ tail ~/.bashrc
PROXY=http://ユーザ名:パスワード@IPアドレス:ポート/
export http_proxy=$PROXY
export http_proxy=$PROXY
```

#### (2) インストール(centos)
```shell-session
$ curl -L http://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
```
※Amazon Linuxの場合は少し違う。以下参考
https://docs.fluentd.org/v1.0/articles/install-by-rpm#step-0:-before-installation

#### (3) 設定
設定ファイルのデフォルトは/etc/td-agent/td-agent.confです。
今回はローカルで設定ファイルを作成して、-cで指定して実行してみます。

```shell
$ vi  td-agent.conf
$ cat td-agent.conf
<source>
  type tail
  # [path] 監視対象となるログファイル
  path /tmp/hoge_input.log
  # [format] 上記の出力で想定する書式. (?<name>pattern) の記述はRubyの「名前付きキャプチャ」。
  # 以下のように'time'を指定すると、出力側でその日付で出力される。
  format /^(?<time>\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d) (?<level>\w+): (?<message>.*)$/
  # [tag]タグ。<match>のところで使用する。
  tag hoge.01
  # [pos_file] 監視対象のログファイルを見てる位置。予めディレクトリ作成する必要あり。
  pos_file /tmp/hoge.pos
</source>

<match hoge.**>
  type file
  path /tmp/hoge_output.log
</match>
```

#### (4) 実行
```
$ td-agent -vv -c ./td-agent.conf
```

別窓で/tmp/hoge_input.logにログを出力する風に文字列を出力してみます。

```
$ echo "2018-11-11 11:11:11 error: どうやらエラーです。" >> /tmp/hoge_input.log
```

出力を確認してみます。

```
$ cat /tmp/hoge_output*
2018-11-11T11:11:11+00:00       hoge.01 {"level":"error","message":"どうやらエラーです"}
```
/tmo/hoge_output側に出力されました。
「2018-11-11T11:11:11+00:00」は名前付きキャプチャの"time"で取得した値です。
なので、メッセージのほうには"time"は(冗長なので?)省略されているっぽいです。

#### (4) メモ
- ログの形式がjsonとか一般的な形式ならば「format json」と書けばよい。
- time_formatは例えばログが「{"time":"2018--11--11 11:11:11","message":"何とかエラーです。"」
  といった場合は「time_format "%Y--%m--%d %H:%M%S"」と指定する。そうするとその通りに解析してくれる。
- timeの文字列がtime_formatにちゃんとマッチしていないと出力側のログにでる時間が
  「1970-01-01T00:33:38+00:00」とかになってしまう。
- time_formatは「format json」以外にも例のように自ら指定したformatでも"time"キーがあれば有効となる。
- time_formatに使える値は
  https://docs.ruby-lang.org/en/2.4.0/Time.html#method-c-strptime
  を確認。

- 出力(matchのpath)はflushされるまで以下のようなディレクトリ状態になる。

```
$ ll hoge_output.log
合計 8
-rw-r--r--. 1 vagrant vagrant 150 2018/03/07 06:25:05 buffer.q566cc9eb0270286108c3d767992f308a.log
-rw-r--r--. 1 vagrant vagrant  68 2018/03/07 06:25:05 buffer.q566cc9eb0270286108c3d767992f308a.log.meta
```

flush_intervalを短く設定すればすぐxxx.logに出力される。

```
<match hoge.**>
  type file
  path /tmp/hoge_output.log
  flush_interval 10s　★ここを設定
</match>
```
新たにページを作るまでもないメモ

### ESXiのSSHを有効化する
構成＞セキュリティ プロファイル＞サービス＞プロパティ＞SSHを有効化
### ubuntuを入れたらまずsudo apt-get updateでパッケージリストの更新
必ずやらねば…
### VMWare共有フォルダのLinuxゲストマシンからのアクセスは/mnt/hgfs/から。
その下に共有フォルダが作成される。
WRF > link > eta levels | The Eta coordinate

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

WRF(Weather Research and Forecasting Model)とその前処理であるWPS、およびWRFの後続処理のF***T関連。

シミュレーションにおいて高さ方向の定義を再確認している。

とある論文においてWRFでは eta levelsという定義を使っていることを知った。

以下に関連情報を見つけた。
http://forum.wrfforum.com/viewtopic.php?f=8&t=1621

上記のリンク先のwikirogerによるポストで下記のリンクが紹介されている。
http://collaboration.cmc.ec.gc.ca/cmc/CMOI/product_guide/docs/eta_info_doc_e.html

> As shown by the red curves below, the Eta coordinate ranges in value from 1 at the surface of the earth and decreases to a value of 0.0 at the top of the atmosphere as defined by the computer model.
modalwindow

モーダルウィンドウ

１．初期設定

```xxx.html
<!-- modal window -->
<script>
$(function(){
  $('.btns').click(function(){
    wn = '.' + $(this).data('tgt');
    var mW = $(wn).find('.modalBody').innerWidth() / 2;
    var mH = $(wn).find('.modalBody').innerHeight() / 2;
    $(wn).find('.modalBody').css({'margin-left':-mW,'margin-top':-mH});
    $(wn).fadeIn(500);
  });
  $('.close,.modalBK').click(function(){
    $(wn).fadeOut(500);
  });
});
</script>
<!-- 任意で -->
<style>
/* modal window besic css */
.modal{ display:none; }
.modalBody{
  position: fixed;
  z-index:1000;
  /*background: #000;*/
  border: 1px solid #ccc;
  background: white;
  left:50%;
  top:50%;
  width: 1000px;
  height: 500px;
}
.modalBK{
  position: fixed;
  z-index: 999;
  height: 100%;
  width: 100%;
  left: 0;
  top: 0;
  background: #000;
  opacity: 0.9;
  filter: alpha(opacity=90);
  -moz-opacity:0.90;
}
/* modal window option css */
/*.btns{font-size: 80px; width:150px; background:#111; height: 150px; line-height:150px; text-align:center; font-family: arial; color: #fff; float: left; margin:10px; cursor: pointer}*/
.close{cursor: pointer;}
.modal{width:690px; color: #eee;}
.modal p{font-size:12px; text-align:justify;}
.modal h1{font-weight:bold; font-size: 30px;}
.modalBody{padding: 10px;}
</style>
```

２．適用箇所
`data-tgt="wd001"`の数字を変えれば複製できる。


```xxx.html
<td><a data-tgt="wd001" class="btns"><?php echo $value['Orders']['order_no']; ?></a></td>

<div class="modal wd001">
 <div class="modalBody">
  <p class="close">×close</p>
  <p>
   <table>
    <tr><th>注文番号</th><th>商品名</th><th>明細小計</th></tr>
    <tr>
     <td>1234567890</td>
     <td>アイテム01</td>
     <td>1,000</td>
    </tr>
   </table>
  </p>
 </div>
 <div class="modalBK"></div>
</div>
```
AWS LambdaのServerlessでpythonライブライをデプロイする方法

## 既存ディレクトリ構成
```
my_prj
|
├── src
|    ├── lambda
|    |     └── lambda_function.py
|    ├── api
|    |     └── api.py
|    |
|    ├──requirements.txt
```

## 必要なlibを ` requirements.txt `にまとめる

```requirements.txt
boto3==1.4.7
requests==2.18.4 
```


## libインストール

```
$ pip install -r requirements.txt -t /Users/user/git/my_prj/src/lib
```



## libインストール後ディレクトリ構成
```
my_prj
|
├── src
|    ├── lambda
|    |     └── lambda_function.py
|    ├── api
|    |     └── api.py
|    |
|    ├──requirements.txt
|    |
|    ├──lib
|    |    └── boto3
|    |          └── ...
|    |    └── requests
|    |          └── ...
```



## deploy

```
sls deploy --region us-east-1
```


## その他
もしlibのrequests中から ` ImportError: No module named urllib3 ` などが発生する場合
requestsのlib中に ` urllib3 `をインストールして、import先を以下のように変更する必要がある

```
import urllib3
↓↓↓
from .packages import urllib3

```

他にも` ImportError: No module named urllib3 `場合はインストール後import先を書き変える必要がある
cakephp 2.x いろいろ

自分がよく使う書き方を残しておきます。

１．エラーレポーティング0
cakephp上ではエラーはでないけど、phpエラーが発生してしまう場合には書く。
基本的には`public function index() {`などのすぐ真下に書いてます。

```Controller.php
error_reporting(0);
```

２．検索条件「期間設定」
これが複雑で結構めんどい機能。もっと簡単な方法があればいいな。

```Controller.php
// 期間指定
if(!empty($_GET['date_before']) && !empty($_GET['date_after'])){
  $option['conditions']['Orders.order_date BETWEEN ? AND ?'] = array($_GET['date_before']." 00:00:00", $_GET['date_after']." 23:59:59");　
  $getform['date_before'] = $_GET['date_before'];
  $getform['date_after'] = $_GET['date_after'];
}elseif(!empty($_GET['date_before']) && empty($_GET['date_after'])){
  $option['conditions']['Orders.order_date >='] = $_GET['date_before']." 00:00:00";
  $getform['date_before'] = $_GET['date_before'];
}elseif(empty($_GET['date_before']) && !empty($_GET['date_after'])){
  $option['conditions']['Orders.order_date <='] = $_GET['date_after']." 00:00:00";
  $getform['date_after'] = $_GET['date_after'];
}
```

３．検索条件「フリーワード」
こんな感じ

```Controller.php
// フリーワード
if(!empty($_GET['keyword'])){
  $keys = preg_split('/[\s|\x{3000}]+/u', $_GET['keyword']);
  foreach($keys as $key => $value){
    $option['conditions'][$key]['OR']['Orders.order_no like'] = "%".$value."%";
    $option['conditions'][$key]['OR']['Orders.campany_name like'] = "%".$value."%";
    $option['conditions'][$key]['OR']['Orders.order_name_sei like'] = "%".$value."%";
    $option['conditions'][$key]['OR']['Orders.order_name_mei like'] = "%".$value."%";
}
```

４．アップデート後とかにリダイレクト

```Controller.php
header('Location:'.$_SERVER['HTTP_REFERER']);
exit;
```
スライスを返すときはcapに注意しよう

次のコードの出力を予想してみてください。

```go
package main

import (
	"fmt"
)

func splitbyzero(xs []int) ([]int, []int) {
	for i, x := range xs {
		if x == 0 {
			return xs[:i], xs[i:]
		}
	}
	return xs, []int{}
}

func main() {
	data := []int{1, 2, 3, 0, 1, 2, 3}
	x, y := splitbyzero(data)
	fmt.Printf("x: %v\n", x)
	fmt.Printf("y: %v\n", y)
	x = append(x, 42)
	fmt.Printf("x: %v\n", x)
	fmt.Printf("y: %v\n", y)
}
```

https://play.golang.org/p/3ILJsxhR_9b

結果はこうなります。

```
x: [1 2 3]
y: [0 1 2 3]
x: [1 2 3 42]
y: [42 1 2 3]
```

`x = append(x, 42)` により、y 側のデータが上書きされてしまっています。

これは、 `xs[:i]` によって作られるスライスの capacity が cap(xs) になっており、 append で再利用できると判断されているからです。

Go プログラマーは一般的に append を安全な操作だと認識しているので、 append() によって他のデータを破壊してしまう可能性があるスライスを返してはいけません。

この場合、 `xs[:i]` を `xs[:i:i]` に書き換えれば、 x の capacity は len と同一になるので安全になります。

https://play.golang.org/p/fwWsuPv7Bki

このスライスの構文は "Full slice expression" と呼ばれます。([Slice expressions を参照](https://golang.org/ref/spec#Slice_expressions))

Full slice expression の3つ目の添字は、 capacity ではなくて max です。途中をスライスするときは、 `xs[a:b:b]` になります。 (`xs[a:b:b-a]` ではありません)

個人的には、よく使われる max を省略する方のスライス式 `xs[begin:end]` で、 max が end ではなく cap(xs) として扱われるのはGoの設計ミスだと思います。
テストしてても気づきにくいバグを生み出しやすい ([例](https://github.com/go-sql-driver/mysql/issues/765)) ので、デフォルトが安全側で、パフォーマンスを気にするときだけ再利用可能な領域を指定する方が良かった。
SRDebuggerでOptionContainersを使って表示カテゴリを制御する

UnityでSRDebuggerを使ってデバッグをする際に、特定のシーンやタイミングでのみ使いたいオプションなどがあったり、オプションの表示順をいろいろあれこれしたい時にOptionContainersを利用したら割とお手軽に調整できたのでメモ

# OptionContainers
OprionContainersはC#のObject単位でオプションのプロパティやメソッド群を管理するものです  
以下は公式のページより引用したものです![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/141004/967d7d3e-6660-6c78-4b4e-72aa35fd85ef.png)
[SRDebugger公式サイト](https://www.stompyrobot.uk/tools/srdebugger/documentation/#api)  
今回は以下のようにベースクラスを作りました

```csharp
/// <summary>
/// 各カテゴリーのオプション群のベースクラス
/// </summary>
public class OptionsBase<T> where T : class, new()
{
    private static T _current;
    public static T Current => _current ?? (_current = new T());

    /// <summary>
    /// 全オプションに必要そうなオブジェクト
    /// </summary>
    protected DataObject _dataObject;
    protected DataObject DataObject
    {
        get
        {
            if (_dataObject == null)
            {
                //初期処理
            }

            return _dataObject;
        }
    }
}
```
後はベースに従ってカテゴリ単位で表示するオプション群を指定します（別にカテゴリ単位でなくてもよい）

```csharp
/// <summary>
/// 特定のカテゴリのデバッグオプション
/// </summary>
public class TestOptions : OptionsBase<TestOptions>
{
    /// <summary>
    /// カテゴリー名
    /// </summary>
    private const string CATEGORY_TEST = "カテゴリ名";

    /// <summary>
    /// PlayerPrefsきれいにしたり
    /// </summary>
    [Category(CATEGORY_TEST)]
    [SROptions.DisplayName("PlayerPrefs削除")]
    [SROptions.SortAttribute(0)]
    public void DeletePlayerPrefs
    {
        PlayerPrefs.DeleteAll();
    }
}
```
そしてこれらを任意のタイミングでオプションパネルに追加したり削除したりします  

```csharp
 private void Start()
 {
     // 開始時にオプションを表示
     SRDebug.Instance?.AddOptionContainer(TestOptions.Current);
 }

 private void OnDestroy()
 {
     // シーン破棄時にオプションを非表示
     SRDebug.Instance?.RemoveOptionContainer(TestOptions.Current);
 }
```
本来カテゴリ単位でのソートはSRDebuggerに用意されてない（されてたら指摘してください）のですが、追加の順序などを制御することで任意の場所に置くことができます
これに従って裏でAttributeを拡張すれば表示順を結構自由にいじれそうですし、一度作ってみると楽かもしれません
OmiseGo SDK install 手順

OmiseGo SDK Betaがでていたので、試してみました。環境は、CentOS Linux release 7.4.1708 (Core) on AWSとなります。
上手くいきました。
下記を参考。
https://github.com/omisego/ewallet


```
#CentOS Linux release 7.4.1708 (Core) on AWS
yum update

#git unzip wget install
yum install -y wget unzip git

#Image Magick install
yum install -y libXt libtiff libtool-ltdl pango ghostscript fftw3 libwmf
wget https://www.imagemagick.org/download/linux/CentOS/x86_64/ImageMagick-7.0.7-26.x86_64.rpm
wget https://www.imagemagick.org/download/linux/CentOS/x86_64/ImageMagick-libs-7.0.7-26.x86_64.rpm
rpm -ivh ImageMagick-libs-7.0.7-26.x86_64.rpm
rpm -ivh ImageMagick-7.0.7-26.x86_64.rpm

#Erlang Dependencies install
yum install -y epel-release
yum install -y gcc gcc-c++ glibc-devel make ncurses-devel openssl-devel autoconf java-1.8.0-openjdk-devel git wget wxBase.x86_64

#libsodium install
wget https://download.libsodium.org/libsodium/releases/libsodium-1.0.16.tar.gz
tar xvzf libsodium-1.0.16.tar.gz
cd libsodium-1.0.16
./configure
make
make install

#postgres 9.6 install
yum install -y https://yum.postgresql.org/9.6/redhat/rhel-7-x86_64/pgdg-redhat96-9.6-3.noarch.rpm
yum install -y postgresql96-server postgresql96-contrib
/usr/pgsql-9.6/bin/postgresql96-setup initdb
systemctl start postgresql-9.6.service

#nodejs install
wget https://rpm.nodesource.com/pub_8.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm 
rpm -ivh nodesource-release-el7-1.noarch.rpm
yum install nodejs
npm install -g yarn

#Erlang + Elixir install
su - XXXXX
git clone https://github.com/asdf-vm/asdf.git ~/.asdf
echo '. $HOME/.asdf/asdf.sh' >> ~/.bash_profile
echo '. $HOME/.asdf/completions/asdf.bash' >> ~/.bash_profile
. ~/.bash_profile

asdf plugin-add erlang https://github.com/asdf-vm/asdf-erlang.git
asdf plugin-add elixir https://github.com/asdf-vm/asdf-elixir.git
asdf install erlang 20.2.2
asdf global erlang 20.2.2
asdf install elixir 1.6.0
asdf global elixir 1.6.0

# eWallet install
git clone https://github.com/omisego/ewallet && cd ./ewallet
mix deps.get
cd apps/admin_panel/assets/ && yarn install
cd ../../../
mix do ecto.create, ecto.migrate
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/lib
mix omg.server

```
Java8で始めるラムダ式とEclipse環境構築ことはじめとおすすめの参考書

需要があれば書きます.
大体はこんな感じで‥

<blockquote class="hatena-bookmark-comment"><a class="comment-info" href="http://b.hatena.ne.jp/entry/302580189/comment/miruzouq" data-user-id="miruzouq" data-entry-url="http://b.hatena.ne.jp/entry/ascii.jp/elem/000/001/238/1238080/" data-original-href="http://ascii.jp/elem/000/001/238/1238080/" data-entry-favicon="https://cdn-ak.favicon.st-hatena.com/?url=http%3A%2F%2Fascii.jp%2F" data-user-icon="/users/miruzouq/profile.png">ASCII.jp：Java入門書、ベストな選び方の、その先へ｜最強のJava入門書はどれか？（2016年秋）</a><br><p style="clear: left">漫画で分かるJavaは良い‥“この本も、わりとマンガっぽく見せてる部分もあるし。わたしも数年前に、このシリーズのC++版編集注8を書いたんだよ。”</p><a class="datetime" href="/miruzouq/20180305#bookmark-302580189"><span class="datetime-body">2018/03/05 09:57</span></a></blockquote><script src="https://b.st-hatena.com/js/comment-widget.js" charset="utf-8" async></script>
          

導入文をここに書く
ここに書く内容が[人気の記事ページ](http://qiita.com/popular-items)やはてブなどでシェアされる際の概要文となる

# TL;DR

記事が長くなる場合は要約をつける
最後まで読まなくても記事の内容がわかるようにする
TL;DRを書かずに、導入文で概要がわかるようにするのも可

# 対象読者 or 前提条件 or 環境

必要に応じて書く

# 記事見出し1

## 記事見出し1-1

### 記事見出し1-1-1

# 参考

参考にしたWebサイトや技術書などを列挙する

- [参考にしたWebサイト](http://example.com)
[ASCII.jp：Java入門書、ベストな選び方の、その先へ｜最強のJava入門書はどれか？（2016年秋)](http://ascii.jp/elem/000/001/238/1238080/)

# 次にやること

記事を読んだあとに読んだ方が良いWebサイトなどがあれば書く

# あとがき



# 投稿する前に

記事の内容を知らない人になりきって読みなおす

- 誤字脱字がないか（ライブラリなどの大文字小文字があっているか）
- リンク先は間違っていないか
- サンプルとして書いたコードは正しく動作するか
FCM curl コマンド

FCMからリッチプッシュを送ろうとした時調べたのでメモしておきます。

```sh
curl -X POST --header "Authorization: key={SERVER_KEY}" \
--Header "Content-Type: application/json" \
https://fcm.googleapis.com/fcm/send \
-d @- << EOF
{
	"to": "{DEVICE_TOKEN}",
	"data": {
		"videoURL": "{URL}"
	},
	"notification": {
		"body": "{MESSAGE}"
	},
	"priority":10,
	"mutable_content":true
}
EOF
```
cakephp 2.x ページング機能

cakephpのマニュアルを解読するのは結構疲れるので、自分でわかりやすく記載しておきます。
他の人も参考になれば。

１．コントローラーにcomponentsを追加
基本的には`public $uses = array(`と`public function index() {`の間でいいと思います。


```xxxController.php
public $components = array('Paginator');
```

２．SQLでデータ取得時の書き方
基本的にはpaginateでfiledsの設定やjoinsを設定します。
その前で検索条件を`$option['conditions']`で作っておき、取得時に指定してあげます。
`$this->Paginator->settings = $paginate;`で設定を保存してから検索をかけるのですが、try&catchを使い再検索時に現在のページ位置を１に戻すようにしています。

```xxxController.php
$paginate['fields'][] = 'Orders.*, OrderDetails.*, Members.member_flg, Members.pref';
$paginate['joins'][] = array(
 'type' => 'Inner',
 'table' => 'N_order_detail',
 'alias' => 'OrderDetails',
 'conditions' => 'Orders.order_no = OrderDetails.order_no',
);

$paginate['joins'][] = array(
 'type' => 'Inner',
 'table' => 'N_Member_list',
 'alias' => 'Members',
 'conditions' => 'Members.member_id = Orders.login_id',
);

$paginate['limit'] = 30;
$paginate['order']['order_date'] = "desc";

$this->Paginator->settings = $paginate;
try{
 $orders = $this->paginate('Orders', $option['conditions']);
}catch(Exception $e){
 $this->request->params['named']['page'] = 1;
 $orders = $this->paginate('Orders', $option['conditions']);
}
```


３．ctpにページングを機能を付ける
好きなところに下記を記載するだけ。送り文字変えたりいろいろできるみたいですが、それは各自で調べてください。

```index.ctp等
<!-- ページング -->
<div id="paginate">
  <span class="prev"><?php echo $this->Paginator->prev('< 前へ', array(), null, array('class' => 'prev disabled')); ?></span>
  <span class="pageno"><?php echo $this->Paginator->numbers(array('separator' => '')); ?></span>
  <span class="next"><?php  echo $this->Paginator->next('次へ >', array(), null, array('class' => 'next disabled')); ?></span>
</div>
```
http-serverを使用してNode.js上で簡単にローカルサーバーを立ち上げる

#http-serverを使用してNode.js上で簡単にローカルサーバーを立ち上げる

##http-serverとは
https://www.npmjs.com/package/http-server
コマンド実行で簡単にローカルサーバーが立ち上げられるのでちょっとしたデバック等に便利です。

##インストール
グローバルにインストールします。npmがインストール済みならこれだけで大丈夫だと思います。
`$ npm install -g http-server`

##オプション
`-p` 使用するポート（デフォルトは8080）
`-o` サーバーの起動後にブラウザウィンドウを開く
他にもありますが、自分はコレしか使用してないです。

##使い方
ルートにしたいディレクトリ上で下記実行するだけでローカルサーバーが立ち上がります。
`$ http-server -o`

また、ルートディレクトリやポートを指定したい場合は以下のように指定すればOKです。
`$ http-server ./XXXX -o -p 8888`
SPI > DCピン > Data | Command pin > LOSSI MODEで使う

[メモ：ESP32のSPIについて混乱していることの整理](https://qiita.com/cattaka/items/48f0853c2ac7552c833e)

> VSPIやHSPIの一次情報にたどり着けず、SPIのDCが何の略で何者なのかが結局わからなかった。


SPIのDCピンについてはあまり理解してなかった。

上記記事のコメントに書いたが、コメントの検索はできないので記事とする。

### Data/Command pin

https://github.com/jandelgado/arduino/wiki/SSD1306-based-OLED-connected-to-Arduino

> DC | A0 | Data/Command

http://www.aitendo.com/product/1622

> pin 7 - Data/Command select (A0)

### LOSSI MODE

https://www.raspberrypi.org/documentation/hardware/raspberrypi/spi/README.md

LOSSI MODE (LOW SPEED SERIAL INTERFACE)

> The LoSSI standard allows issuing of commands to peripherals (LCD) and to transfer data to and from them. LoSSI commands and parameters are 8 bits long, but an extra bit is used to indicate whether the byte is a command or parameter/data. This extra bit is set high for a data and low for a command. The resulting 9-bit value is serialized to the output. LoSSI is commonly used with [MIPI DBI](https://mipi.org/specifications/display-interface) type C compatible LCD controllers.

LOSSI MODEで使う機能のようだ。

LCDなどでDCピンを使うのはLOSSI MODEを使っているということだろうか。
[Survey] Kaggle - Mercari上位陣解法一覧

Mercari Price Suggestion Challenge 上位陣解法一覧です．

https://www.kaggle.com/c/mercari-price-suggestion-challenge

## 概要

- 決済した商品の価格推定
- 与えられる情報は商品説明やカテゴリ，ブランド品かなど(画像やユーザー情報はない)
- Kaggle Kernelで60分以内に動作する必要がある．

## 結果

| 順位 | 名前 | スコア | コード |
| --- | --- | --- | --- |
| [1位](https://www.kaggle.com/c/mercari-price-suggestion-challenge/discussion/50256)| Paweł Jankiewicz | 0.37758 | [Kernel](https://www.kaggle.com/lopuhin/mercari-golf-0-3875-cv-in-75-loc-1900-s) |
| [2位](https://www.kaggle.com/c/mercari-price-suggestion-challenge/discussion/50499) | mchahhou | 0.38875 |  [Kernel](https://www.kaggle.com/mchahhou/second-place-solution) |
| [3位](https://www.kaggle.com/c/mercari-price-suggestion-challenge/discussion/50272) | whitebird | 0.39134 | - |
| [4位](https://www.kaggle.com/c/mercari-price-suggestion-challenge/discussion/49678) | Chenglong Chen | 0.39299 | - |
| [6位](https://www.kaggle.com/c/mercari-price-suggestion-challenge/discussion/50431) | Mohsin hasan | 0.39713 | - |
| [9位](https://www.kaggle.com/c/mercari-price-suggestion-challenge/discussion/50319) | LeeYun | 0.39752 | [Kernel](https://www.kaggle.com/leeyun/ensemble-model) |
| [13位](https://www.kaggle.com/c/mercari-price-suggestion-challenge/discussion/50260) | Muhammad Alfiansyah | 0.40080 | [Kernel](https://www.kaggle.com/muhammadalfiansyah/push-the-lgbm-v19) |
| [14位](https://www.kaggle.com/c/mercari-price-suggestion-challenge/discussion/50275) | liuyongqi | 0.40208 | - |
| [16位](https://www.kaggle.com/c/mercari-price-suggestion-challenge/discussion/50322) | toshi_k | 0.40527 | [Kernel](https://www.kaggle.com/toshik/test-60) |
| 17位 | DataGeek | 0.40604 | [Kernel](https://www.kaggle.com/peterhurford/lgb-and-fm-18th-place-0-40604) |
| [18位](https://www.kaggle.com/c/mercari-price-suggestion-challenge/discussion/50252) | Peter Hurford | 0.40604 | [Kernel](https://www.kaggle.com/peterhurford/lgb-and-fm-18th-place-0-40604)|
| [22位](https://www.kaggle.com/c/mercari-price-suggestion-challenge/discussion/50300) | olivier | 0.40660 | [GitHub](https://github.com/goldentom42/kaggle_mercari_2017) |
mdconf でドキュメントから JSON Schema を生成する


※ 「JSON Schema からドキュメントを生成する」ではなく，「ドキュメントから JSON Schema を生成する」です．

# はじめに

SDD (Specification Driven Development) では，Swagger，RAML といった API 定義フォーマットや，JSON Schema といった JSON Object 定義フォーマットなどがよく利用されます．これらのフォーマットからコードジェネレートしつつ，ドキュメントも生成することで，仕様と実装の乖離がなくなるといったメリットがあります．

よく見かけるのは，JSON (YAML) をソースとして管理し，それから HTML ドキュメントを生成するようなものですが，エンジニア以外のステークホルダがいる環境で運用するにあたっては，HTML のホスティングサーバを用意したり，それをアップデートし続けるジョブを用意したりと少々面倒なこともあります．

そこで今回は，JSON からドキュメントを生成するのではなく，__ドキュメントから JSON を生成する__ ことで，上記の解決を試みます．ドキュメントはマークダウンで記述します．GitHub などは，マークダウンを HTML に変換して表示してくれるので，記述したマークダウンそのものがドキュメントとなります．つまり，ドキュメントが生成物ではなくソースになるため，GitHub などでソース管理するだけで，常に最新のドキュメントを閲覧することができます．

# mdconf を使って JSON にパースする

例として，以下のような JSON Schema を利用します．

```json:user.json
{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "user",
  "type": "object",
  "additionalproperties": "false",
  "required": [
    "id",
    "lastName",
    "firstName",
    "state"
  ],
  "properties": {
    "id": {
      "type": "number"
    },
    "lastname": {
      "type": "string"
    },
    "firstname": {
      "type": "string"
    },
    "state": {
      "type": "number",
      "enum": [
        "1",
        "2"
      ]
    }
  }
}
```

マークダウンをパースして JSON にするために， [mdconf](https://github.com/tj/mdconf) を使います．mdconf では，`#` と `-` を用いてプロパティや値を表現します．これらのいずれも付いていない行はパースの対象外なので，自由に記述することができます．

以下は，上記の JSON Schema を生成するマークダウンを記述したものになります．


```md:user.md
- $schema: http://json-schema.org/draft-04/schema#

- id: user

- type: object

- additionalProperties: false

# required

- id

- lastName

- firstName

- state

# properties

## id

user id

- type: number

## lastName

user's last name

- type: string

## firstName

user's first name

- type: string

## state

user state

- type: number

### enum

active

- 1

inactive

- 2

```

GitHub では，以下のように表示されます．スキーマ定義が見やすいドキュメントになっていますね．このドキュメントをメンテナンスしていくことになります．

![mdconf.png](https://qiita-image-store.s3.amazonaws.com/0/7113/6316e78b-3ed4-b35d-8e76-40baf845ec47.png "mdconf.png")

以下が，このマークダウンをコードで利用し，バリデーションをおこなう例です．mdconf により簡単にパースすることができます．

```js
import fs from 'fs'
import path from 'path'
import isMyJsonValid from 'is-my-json-valid'
import parse from 'mdconf'
import assert from 'assert'

// マークダウンを読み込み, JSON にパース
const mdFilePath = path.resolve(__dirname, 'user.md')
const schema = parse(fs.readFileSync(mdFilePath, 'utf8').toString()))

const userData = { id: 1, lastName: 'Yamada', firstName: 'Taro', state: 1 }

// データが想定しているフォーマットかどうか検証
const validator = isMyJsonValid(schema)
assert(validator(userData), validator.errors)
```

# おわりに

マークダウンで Schema 定義を記述することで，ドキュメントとして利用しつつ，かつコードからも直接利用することができるようになりました．少々アグレッシブではありますが，Swagger や RAML などでも汎用的に使える方法ですので，興味を持たれた方はぜひ試してみてください．
rails フォームの大きさをcssで変更する

#cssでレスポンシブするときの悩み
最近サービスをスマホでも使えるようにしたいということで、レスポンシブ対応させています。
デバイスの大きさによって可変するやつ。。。
でもあの可変て、css内で区切りますよね。だからhtmlに直でcssが書けないという罠にはまっています。。。
styleとかでごまかしごまかしやっていたのが、全てバレてしまいました。。。。。
今回はそんな悩みの中で一つ解決策を学んだので、メモ。

#ログインフォームの大きさって変えられるんですか？
![スクリーンショット 2018-03-04 11.17.34.gif](https://qiita-image-store.s3.amazonaws.com/0/147990/6bf3ce45-5e52-0672-d518-a365c0be07f8.gif)

ログインフォームです。初期の状態ってみなさんこれだと思います。
最初自分はこんな感じで書いていました。

```example.html.erb
<%= f.label :ユーザー名%>
<%= f.text_field :username , placeholder: "ユーザー名"%>

<%= f.label :パスワード%>
<%= f.password_field :password, placeholder: "パスワード"%>
```

では、このフォームの大きさを変えるにはどうすれば良いのか。。。
調べてみると、こんな書き方を見つけました。

```example.html.erb
<%= f.label :ユーザー名 %>
<%= f.text_field :username, placeholder: "ユーザー名", :size => "30*30" %>
```
sizeというオプションを追加しました。

で、結果をみてみると。。。。。
![スクリーンショット 2018-03-04 11.20.56.gif](https://qiita-image-store.s3.amazonaws.com/0/147990/1167865e-96bc-53e0-f0b2-f68ac1d21c07.gif)

確かに、横長にはなってるけれども！　（笑）
この書き方には問題点が２つあります。。。

1.縦の長さを変えられない
2.レスポンシブに対応できない（htmlに直書きのため、デバイスの大きさで条件分けができない）


#解決策

そこで色々な方に教わり、解決策わかりました！

cssの部分に下のコードを追加

```example.scss
input[type="text"] {
        width: 300px;
        height: 40px;
    }

input[type="password"] {
        width: 300px;
        height: 40px;
    }

```
typeの部分には、fieldの前の部分を入れれば対応します。

こうすると。。。。

![スクリーンショット 2018-03-03 22.57.45.gif](https://qiita-image-store.s3.amazonaws.com/0/147990/28f3a513-e2ae-8f3b-0d03-93a8d6d2d026.gif)

できました！
縦幅も変えられるし、何よりcssに書くのでレスポンシブもできます！
俺言語 その15

#概要

俺言語をやってみた。
avrにアセンブラで実装してみた。
ROM化の検討。

#環境

avr studio 4
attiny85 1mhz
tera term
usb-serial

#何故、ROM化。

現在は、電源投入して、シリアルを繋いで、プログラムを入力して、実行となる。
電源投入して、即、実行がしたい。

#attiny85で、ROMは、無理でしょう。

attiny85には、eepromが512byte搭載されている。
これを、利用する。

#eeprom読み書き、できるの。

できてます。
https://qiita.com/ohisama@github/items/dc4f9ceba5dc9decc0aa

#読み込み手順は

２通りあります。
A案
eepromから、sramに読み込んで、sram上で実行。
B案
ソースアドレスポインタをeepromにして、直接読み込み実行。

#書き込み手順は。

ソースリストを実行した時、eepromに書き込む。

#起動プロセス

起動時、eepromから、フラグを読み込み、trueなら、sramに、eepromから、ソースプログラムを読み込み、実行。

#フラグは、どうする。

変数＾を導入する。

#ループから、抜けるには。

PB0に、LOWを投入。常時、high。

以上。
個人的なPycharmのキーバインド設定

Pycharm大好きです。

私はホームポジションから動きたくない人なので、
前はvimのキーバインドにするプラグインを使っていたのですが、動作しない場合がたまにあるのでやめました。
Pycharmのキーバインド設定にデフォルトであるemacsのキーバインドにしてます。

ですが少し物足りない部分もあるので、Pycharmデフォルトのemacsキーバインドから変更した点を書きます

# 自分で変更したキー

|キー|機能|
|---|---|
|C-u|Delete to Line Start|
|C-h|Backspace|
|M-h|Delete to Word Start|
|C-r|Replace|
|C-TAB|Switcher|
|C-S-b|Find Usages|
|C-S-a|Find Action|
|C-M-l|Reformat Code|
|C-S-d|Duplicate Line or Selection|
|TAB|Tab|
|C-S-e|Recently Changed Files|
|C-Backspace|Delete Line|
フリーランスとして食っていくための読むべき記事についてのまとめ


はじめに
-----

退職してから１ヶ月ほどが過ぎようとしているが、未だにどのような工程をえて、自分自身で収益を上げるのか方向性が見えていない部分がある。やりたいことととしては、エンジニアの助けになる活動をしていきたいと考えているが、そればかりしても食っていけるわけではない。

技術力についての向上は必須なので、活動する上において有益になりそうな情報を下記にまとめることにする

リンク集
-----

### テストカバレッジ

#### 概要
- 「カバレッジが高ければ、ソースコードの品質が高い」という誤解
- なぜなら、それは「テストケースがバグを適切に検出できる」という前提に成り立っているため
- 検出できないテストケースは無意味

#### 参考リンク
- [テストカバレッジ100%を追求しても品質は高くならない理由と推奨されるカバレッジの目標値について](https://qiita.com/bremen/items/d02eb38e790b93f44728)


### Rails使用時に役に立つgemまとめ
- [新米エンジニアが月300万PVのサイトを作った時に役立ったGem20選（+SEOの小技）](https://qiita.com/naotaka1128/items/e7451ac6b8154dadd47e)


### Stripeについて

#### 概要
- 入金サイクルは約1週間ごと 

#### 参考リンク
- https://san6go.com/archives/5247
- https://crosspiece.jp/stripe-review/
- https://webooooo.com/stripe-2491.html


### 15ソフトウェア開発インフルエンザ(ちょっと読めばいい感じ)
- https://apiumhub.com/tech-blog-barcelona/software-development-influencers/
- 

<!--
title: 新米エンジニアが最初に読むべき記事についてのまとめ
-->
RamNodeでマイニングしていたらVPSを止められた話

[RamNode](https://www.ramnode.com/)という1月3.5ドルから使える結構優秀な海外VPSがあります。これでCPUマイニング（BitZeny）をしていたら**怒られてVPSを止められました**。復旧させることができたので対応を含めて書いておきます。

## 状況
CPU Limitを使ってCPUマイニングしてた。CPU使用率は65％に制限してた。

## 怒られた＆復旧
初めて数日ぐらいでこんなメールが飛んできました。メールより引用。
![ramnode.png](https://qiita-image-store.s3.amazonaws.com/0/232088/2391bd78-1d5d-5210-1c2a-7b19c22ef3f1.png)

（あっ、これガチなやつやん…どうすればいいねん）。他にも2通ほど送られて来て読んでると管理画面のSupport Tickerに送られているからそこでリプライしろと。
![ramnode2.png](https://qiita-image-store.s3.amazonaws.com/0/232088/71259080-7990-d9ff-0ea4-818d7ef6ae6c.png)

ここにリプライすればいいらしい。このリンクを読んでるとそもそもRamNodeではマイニング禁止らしい（知らなかったよ）。ということで、

> I didn't know that mining is banned in the VPS. Sorry, I'll quit this.
> (このVPSではマイニング禁止であることを知りませんでした。すみません、それやめます)

とリプライしておきました。

## 凍結解除された！
ちょっと時間かかるかなと思いましたが、リプライ送ったあと**数分で凍結解除されていました。RamNodeの対応神**やん（どっかの青い鳥のSNSも見習ってほしい）。ログインして当該のプログラムを止めておきました。

## 補足
メールのリンクを読むと禁止事項におもいっきり書いてありました。

> STRICTLY PROHIBITED USES
> The following are strictly prohibited uses and may result in immediate suspension and/or termination if discovered on your account:
> (中略)
> ・Virtual currency / cryptocurrency (*coin) mining

https://clientarea.ramnode.com/aup.php

strictly prohibitedとかimmediate suspensionとか怖い単語が見える。禁止事項が多くて、Facebookクローラーや中国のゲームサーバーもダメみたいですね（まさかここでHentaiの文字列を見るとは思わなかったよ）。

## 教訓
VPSを契約するときは禁止事項にちゃんと目を通しましょう。Tos（terms of service）の中にリンク張ってありましたが見落としてしまった。マイニングについてはCPU制限すれば特に問題ないとこと、ここのようにマイニングそのものがダメなとこがあります。
1年半の文系卒エンジニアが効果があったと感じた学習習慣

#1年半の文系卒エンジニアが効果があったと感じた学習習慣
文系卒エンジニア1年半です。独学でいろいろ難しかったりしましたが、振り返ってみてやってよかったなと思った事です。フェーズごとにあった学習方法は変わっていくので比較的初期の人のためのまとめです。

##1.簡単な事から理解する
難しい設計に見えていた事も、超基本的なメソッドの10個くらいの組み合わせだったりします。10個が無意識で使えるくらいになってからまた見ると、複雑に見えていた事も簡単に見えるようになります。「自分は難しい事を読み解いて理解したすごい」という感覚になっていたら多分遠回りしています。

##2.片っ端から理解する
最初は目的に必要な事から逆算して理解しようとしていましたがうまくいきませんでした。理由は、圧倒的に常識がないからです。例えば、集合論を理解しようとするときに、代数学は関係ないからと言って足し算を知らなくていいかというと、そんなことありません。足し算は直接関係ないですが、足し算や引き算の概念がないと話になりません。学習して1年くらいはずっと足し算引き算すらわからないような状態です。どう役立つかは見えなくても、ほとんどが最低限必要な知識なので、片っ端から理解していけばいいと思います。ただし、優先順位は,1の簡単な事から。

##3.公式リファレンスを読む
できるだけ公式リファレンスにあたりましょう。gemの使い方、メソッドの使い方、ツールの使い方など、ありとあらゆる事でです。公式リファレンスには、「なぜそうなのか」など、体系的な説明とともにプログラムが書いてあります。Tips的なものをググっているだけではその辺の知識が積み重なりません。そしてググった知識は体系に組み込まれない無いのですぐ頭からこぼれ落ちていきます。リファレンスは慣れるまでつらいですが「リファレンスを読める」のも身につけるべき技能です。慣れるまで根気づよく読んでいきましょう。

##4.書き写す、書き換える、自分で書く
必ず調べたメソッドなどは自分でも書いて動かしてみます。ただし、書き写すときの注意点は、「自分で考えている」感覚を感じながら書く事です。思考停止で書き写しても学習効率は悪いので、書き換えたり、自分で思考プロセスをたどりながら書くとよいです。何度も何度も書き直しているとスラスラかけるようになります。

##5.タイポに注意する
プログラミングで一番時間を無駄に消費するのがバグです。(プログラミング作業を録画して計測すると、6割くらいバグに費やしていたりしました。)。そして意外と見つからず厄介なバグの原因がスペルミス(IDEだと発見してくれますが)。思考と関係ないミスのタイポで時間を失うのは非常にもったいないです。タイポを減らすには、指をばたばた動かさず最小限に動かす、ホームポジションを意識するなどを心がけるといいでしょう。

#逆にやらない方がいいこと

##1.MSDNのリファレンスを読み込む
リファレンスを読み込んだ方がいいといいましたが、マイクロソフトのMSDNは読むのが難しすぎました。体系が複雑すぎる気がします。自分はあのリファレンスでけっこう時間浪費したので、ああ普通に読めるなってタイミングで読めばいいのかなと思います。

##2.ゲーム
やめましょう。はまって後悔しました。時間と金返せパズ○ラ。

##3.知識習得すべきか悩む
「この知識いるのかな？効率悪くないかな？」そんなよくある悩み。悩みたくなる誘惑と戦い続けましょう。判断すらできないひよっこのうちは足りない知識だらけ。とっとと習得してしまいましょう。悩んで何もせず時間浪費するより、知識を習得してから後で不要だったとわかった方がずっと成長しています。そして、応用の効かない知識などほぼないので安心してください。コネクティングドッツ。


#総評
まとめると、**簡単**な事から**体系的**に**理解**して**慣れる**を**大量**にってことですかね。
Railsのdevelopment環境のメール送信でWe're sorry, but something went wrong.になった

##はじめに
Qiitaに初めて投稿します。
Railsを勉強中で気になる点があり、ネットで探してもあまり情報が見つからなかったので投稿させていただきます。

##発生したdevelopment環境でのエラー画面


development環境で出るエラー画面は以下のようなものしか見たことなかったのですが、

<img width="500" alt="スクリーンショット 2018-03-05 1.55.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/169997/6f296c08-c067-f094-ecf3-a25efe49a001.png">


今回は以下のようなエラー画面が発生しました。

<img width="500" alt="スクリーンショット 2018-03-05 1.51.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/169997/95010f87-84d7-bff9-0935-a6f44cb4f38b.png">

これってHerokuとかの本番環境で出る画面なのでは？
ログを見てみると、

>Completed 401 Unauthorized in 45ms (ActiveRecord: 16.0ms)

と出力されていました。
他の部分も見てみると、直前までに行われていた更新処理は完了しており、その後のメール送信に問題がありそうでした。


##何をしているか
- 更新処理後にActionMailerでメールを複数人に送信している。

##やったこと
[Action Mailerの基本 | Rails日本語ドキュメント | Ruby STUDIO](http://ruby.studio-kingdom.com/rails/guides/action_mailer_basics)

>2.3.3 メールの複数の宛先への送信
>`:to`キーにメールのリストを設定することで、1つのメールを複数人に配信することが可能です。 (例: 新しく登録されたユーザーの情報を全管理者に伝えるなど) メールのリストは、メールアドレスの配列またはカンマ区切りの文字列を指定することが出来ます。

こちらを元にmailメソッド内の`:to`キーに複数のユーザーのメールアドレスをカンマで区切って設定しました。

###❌ダメだったやつ
```ruby
mail to: @user1.email, @user2.email
```
上記の注意書きをちゃんと読まず、mailの第二引数にメールアドレスを設定したためか、エラー（We're sorry, but something went wrong.）が発生しました。

###⭕️よかったやつ
```ruby
mail to: [@user1.email, @user2.email]
```
```ruby
mail to: @User20130401  + "," + @user2.email
```

とりあえず上記のように書き換えて複数ユーザーにメールを送信することができるようになりました。

##所感
原因自体は明確になっていないので、わかる人がいれば教えていただきたいです。

しかし、「We're sorry, but something went wrong.」は原因も掴みにくいので、なるべく赤いバーのエラー画面に出会いたいなと思った次第でした😅