OmniAICreator/Qiita-1.07M huggingface dataset:
Google スプレッドシートでJSONを出力する


#はじめに
ゲームで使うモンスターのパラメータを編集して、JSONに出力したい、
でもExcel持ってない、なのでGoogle スプレッドシートでやってみました。

スプレッドシートを開いてメニューの ツール->スクリプトエディタで
Google Apps Script(GAS)というJavaScriptベースな言語が書けます。

データ的にはこれを
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398685/0e9b2b24-c544-1b55-4da0-c1abedb7ab9a.png)


こうします

![aa.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/398685/fe8f18f4-567d-45d6-5507-10b5925b67cd.png)

#方法
スクリプトエディタを開くとできているマクロ.gsと
スクリプトエディタのメニューのファイル->新規作成->HTML ファイル
でdialog.htmlを作成します。

内容はそれぞれ

```js:マクロ.gs
function main() {
  var html = HtmlService.createTemplateFromFile("dialog").evaluate();  
  SpreadsheetApp.getUi().showModalDialog(html, "ファイルダウンロード");
}

function getData() {  
  var sheet = SpreadsheetApp.getActiveSheet();
  var maxRow = sheet.getLastRow();//行数 -
  var maxColumn = sheet.getLastColumn();//列数 |
  var keys = [];
  var ret = [];
  
  //1列目のkeyの名前取得
  for (var x = 1; x <= maxColumn; x++) {
    keys.push(sheet.getRange(1, x).getValue());
  }
  
  //データ
  for (var y = 2; y <= maxRow; y++) {
    var json = {};
    for (var x = 1; x <= maxColumn; x++) {
      json[keys[x-1]] = sheet.getRange(y, x).getValue();
    }
    ret.push(json);
  }
  
  //整形してテキストに
  return JSON.stringify(ret, null, '\t');  
}


function onOpen() {
  // メニューバーにカスタムメニューを追加
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "jsonで出力",
    functionName : "main"
  }];
  spreadsheet.addMenu("マクロ", entries);
};
```

```html:dialog.html
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script type='text/javascript'>
      function handleDownload() {
        var content = <?= getData(); ?>;
        var blob = new Blob([ content ], { "type" : "application/json"});
        document.getElementById("download").href = window.URL.createObjectURL(blob);
      }
  </script>
  </head>
  <body>
    <a id="download" href="#" download="test.json" onclick="handleDownload()">ダウンロード</a>
  </body>
</html>
```

これらのファイルを作成し、スプレッドシートの方に戻ると
メニューにマクロという項目が追加されているので、選択して実行します。

GASは付け焼き刃なので作法があまりよろしくないかも…

#失敗した方法
ファイル出力は以下のような方法でもできるとあったのですが、私の環境では
**Invalid argument: parent.mimeType**
と出てうまく行きませんでした。
この不具合ちゃんと追ってないです…

```js:マクロ.gs
function outputJson() {  
  var sheetfile = "myFileName";
  var destfolder = "フォルダのID";
  var sheet = SpreadsheetApp.create(sheetfile);
  var file = DriveApp.getFileById(sheet.getId());
  var destfolder = DriveApp.getFolderById(destfolder).addFile(file);
  var docfile = file.getParents().next().removeFile(file);
}

function onOpen() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "シートをjsonで出力",
    functionName : "outputJson"
  }];
  spreadsheet.addMenu("CUSTOM MENU", entries);
};

```

#記事を書いたときの環境
Google Chrome 74.0.3729.108
Windows 10

#参考
http://googleappsscript.hatenablog.com/entry/2017/09/06/120000
HTML_5 テキストの修飾

#物理スタイルタグ　

```
<b>...</b>   //太字（ボールド）
<i>...</i>   //イタリック体
<tt>...</tt>  //固定幅の文字（タイプライタフォント）
<u>...</u>   //下線つき
<strike>...</strike> 
...
   //横線抹消
<big>...</big>   //周囲より大きな文字
<small>...</small>  //周囲より小さな文字
<sub>...</sub>   //下付き添字（周囲より下げて表示）
<sup>...</sup>   //上付き添字（周囲より上げて表示）

<b><i>このテキストは太字かつ斜体です</ i></b>
```
#整形済みテキスト
```
<pre> ...</pre>  //記述されたスペース・改行などを、そのまま等幅フォントで表示
```
#強制改行
```
<br> //改行

柿食えば<br>
鐘が鳴るなり<br>
法隆寺<br>
```
ざっくりと理解するWebの仕組み

##目的
この記事の目的は「**大枠でWebの構造を理解すること**」です。
WebサイトやWebアプリケーションを見るために必要な概念やアプリケーションの解説などを中心に書き、Webの理解を促します。

##想定する読者層
- 基本情報を受験しようと考えている人
- 新卒エンジニア
- Webアプリケーションを作っている人、作ろうと思っている人
- Webナニモワカラナイ

大枠を理解することが目的なので、基本的に細部までの解説や難しい言葉は使いません。

##全体像

![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109300/3679e830-a6bb-cf57-b95b-fb9270178b81.png)

- **ブラウザ**
- **インターネット**
- **サーバ**
- **DNS**


##ブラウザ
![スライド2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109300/d71f99a5-74f4-ce35-fa73-f537c8746166.png)

Webサイトを見るときに必ず使用するのがこの**ブラウザ**です。
有名なものでGoogle ChromeやFire Foxなどが挙げられます。

ブラウザの主に三つの機能があります。

1. Webページの場所を指定する
2. **Webページを表示する**
3. Webページ閲覧のサポート

ブラウザはWebページを表示するためにHTMLファイルの解析➞整理➞画面表示(レンダリング)までを自動で行ってくれる優れ物です。

##サーバ
![スライド4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109300/db252f58-05f9-1404-31f3-4a9e57ecd118.png)

ブラウザがWebページを表示するために必要なデータを保持しているのが**サーバ**です。
ブラウザから「このデータがほしい！」といったリクエストに対してサーバがデータを返してくれます。
この一連の動作を「**HTTPリクエスト・HTTPレスポンス**」と呼びます。

最近の主流では**Webサーバ・アプリケーションサーバ・データベースサーバ**の三層構造に分けるのがベターとされています。
Webサーバ・・・サイトの表示に必要なデータをブラウザに送り返す役割
アプリケーションサーバ・・・動的な処理を行う役割
データベースサーバ・・・参照するデータを保持する役割

##インターネット
![スライド3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109300/607c6e87-0190-08b0-f864-c89d2de1d8ae.png)

見たい情報は**インターネット**を通じてサーバを探しに行きます。
インターネット上に無数につながっている情報機器の中から欲しい情報を保有している機器を判別するために**IPアドレス**を使用します。
IPアドレスは住所のようなものであり、一般的な通信はこれを利用して行います。


##DNS
![スライド5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109300/3aed127d-be29-f730-3789-c1aef17664ef.png)

IPアドレスは192.168~など人間にとって記憶しづらい数字の羅列です。
より人間が覚えやすく使いやすい名前に指定できる仕組みが**DNS（ドメインネームシステム）**です。
例えばgoogleのIPアドレスは216.58.199.227。これを人間に判別しやすくしたものがhttps://www.google.comです。
変換した名前のことを**ドメイン名**と呼びます。



###参考
いまさら聞けない「Webブラウザ」超入門
https://www.atmarkit.co.jp/ait/articles/0804/14/news107_2.html

サーバって何？初心者でもわかる4つのサーバの種類
https://www.marketingbank.jp/special/cat02/21.php
見たことなかったSQLコマンドを調べてみた。

#え？なにこの書き方は？？
今までただSELECTしてFROMし
WHEREしてORDERしてきた僕にとって
SQLとはこの4つで成り立っていると思っていました。

けど他人のコードを見てみると、結構色んな文があるみたい。
ちょっと調べてみました。

##INTERVAL
CURRENT_TIMESTAMPと組み合わせて現在から見た過去と未来を指す事が出来るみたい。

```sql
--現在から3日前
SELECT * FROM table WHERE time > CURRENT_TIMESTAMP - INTERVAL 3 DAY

--現在から200秒後
SELECT * FROM table WHERE time > CURRENT_TIMESTAMP - INTERVAL 200 SECOND
```

##UNION
複数のクエリの結果をあわせて出力出来るみたい。
でも合わせる結果のカラムとデータ型があってないとエラーが出てしまう。

```sql
SELECT id,name FROM men_table WHERE age < 35
UNION
SELECT id,name FROM woman_table WHERE age < 25
```

##COUNT
クエリの結果を数える事が出来るみたい。
後述のGROUP BYと合わせて使うと幅が広がる。

```sql
--tableのレコード数を数える
SELECT COUNT(*) FROM table 

--tableのidがnullではないレコードを数える
SELECT COUNT(id) FROM table
```

##GROUP BY
上記のCOUNTと合わせて、セルの内容でカウント出来る。

```sql
SELECT age,COUNT(age) FROM table GROUP BY age
```

#編集後記
入社19日目
人のソースコードをみると発見があるので楽しいです。
そしてSQLは見た目に反して奥が深いですね～。
こんな珍しいコマンドあるよ！ってあったらコメントで教えてほしいです！！
2019-04-25 Qiitadon (Mastodon) > create_app()のto_fileで保存されるclient_id.txtの中身 | AnyPointSystem始めました

```txt:動作環境
Ubuntu 18.04 LTS
Jupyter notebook
Python 3
```

### QiitadonのAPIの練習中....

- [【解答編】Mastodonで始めるPythonプログラミング！腕試しテスト50本ノック（初級編）](https://qiita.com/itsumonotakumi/items/1f9273a07f1f7189921f)

上記を参考にQiitadonへの接続を練習中

そもそも(in the first place)、client_id.txtのファイルフォーマットって？


### 公式ドキュメント

よくわからない
3行読んで眠杉謙信


### 公式（ソース）ドキュメント

https://github.com/halcy/Mastodon.py/blob/master/mastodon/Mastodon.py
の
[create_app()](https://github.com/halcy/Mastodon.py/blob/master/mastodon/Mastodon.py#L187)
の
[228行目の実装](https://github.com/halcy/Mastodon.py/blob/master/mastodon/Mastodon.py#L228)

(追記: 2019-04-28 ソースが変更され、228行ではなくなりました）

```py
        if to_file is not None:
            with open(to_file, 'w') as secret_file:
                secret_file.write(response['client_id'] + '\n')
                secret_file.write(response['client_secret'] + '\n')
```

client_idとclient_secretのwriteか

なるほど

### まとめ > client_id.txtの形式

- 1行目: client_id
- 2行目: client_secret

(client_id.txtという名前になっているのはわかりにくい原因?)


### あとがき

その後、QiitadonでTootでき、過去のTootを取得できましたとさ。
めでたしめでたし

### Special Thanks

@KEINOS さん
Qiitadonにて情報ありがとうございます。

### AnyPointSystem始めました

2019-04-25 冷やし中華はまだ始まってないようですが、AnyPointSystem始めました。

詳細はそのうち公開しますが。

- QiitadonのTootをデータとする
- ポイント加算、表示システム

出荷（未定）
eclipseインストール手順

#### 1. Pleiades All in Oneのダウンロード

[サイト](http://mergedoc.osdn.jp/)からEclipse 2019-03をダウンロード。
赤枠のリンクををクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6600/8e1c422f-4086-65a8-9fc8-7e98e5c2656c.png)


次にダウンロードするエディションを選択します。
Mac 64bit Full EditionのJavaをクリックしてダウンロード。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6600/cc74262c-cb15-e791-3b48-f0ece063cb3b.png)

#### 2. eclipseのインストール

ダウンロードしたイメージファイルを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6600/d6ebae39-d187-55dc-02d0-40514f1817a9.png)

案内に従ってEclipse_2019_03.appをApplicationsディレクトリコピーへコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6600/488d1c39-58de-489e-ba30-ec212da993e4.png)

インストールが完了後はイメージファイルは削除してもOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6600/e167547a-f8f7-b870-b519-0db6e9d98b58.png)


#### 3. eclipseの起動

アプリケーション→Eclipse_2019-03.appを右クリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6600/92996fa0-654e-dd83-1d54-25408cb3e206.png)

開くをリクックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6600/20ecd5d7-7802-55b8-6948-20aadd8e5266.png)

開発元の確認を聞かれるので開くをクリック。（初回の起動のみ表示されます。２回目以降の起動時は表示されません。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6600/686e6ee8-0c31-2157-0231-713bd830ad97.png)

ワークスペースの場所の入力を求められるので`/Users/ユーザ名/workspace`に変更します。
(ユーザ名はPCへログインしているユーザ名を入力)

入力完了後、起動ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6600/6b794ffe-f5c4-f53a-b46c-abe859049c3c.png)


この画面が表示されればインストール完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6600/ee55c671-bbf5-9bd9-0979-80cf436c7598.png)
p5.jsでレスポンシブ対応の簡単お絵かきアプリ

![](https://i.gyazo.com/200670bca24d3f45f1955f13f6cdc552.gif)

作ってみました。

<strong>遊び方：</strong>

- クリックも何もせずにマウスを動かすと、ランダムな淡い色で円形が描かれていきます
- クリックしながらマウスを動かしていくと、チューリップ型の花が、暖色・黄色寄りのランダムな色で描画されていきます

<strong>仕様：</strong>

- HTMLなし
- CSSは背景色だけ
- 描画自体はp5.jsが自動的に仕組み作ってくれるので、jsの基礎知識だけで作れます
- 円弧を書く事はWebコーディングであまり無いので、チューリップの形だけちょっとはまりました
- 「クリックしているか or していないか」 で 「サークル描画 or チューリップ」 の描画がスイッチします
- 例えばこのスイッチのトリガーを手の位置の座標、連打の速さ、方角などを取得して条件分岐に置き換えればまた違ったUXが起こるのではと思います



<strong>CSS：</strong>

- 背景のみ
- 適宜自分の好きな背景設置しましょう
- ちなみにレンタルサーバーだと更新漏れなどで画像が無くなるケースも出てくるので、GithubのissueやWikiに画像倉庫として置いておくのも永続性があって良いですね。（あくまでテスト用途なので、アクセスが多いものは自身のサーバーに置きましょう）

```css
body {
 background: linear-gradient(-45deg, rgba(120,20,80,.5), rgba(35,95,228,.4)),url(https://git.io/fjsnV) center center / cover no-repeat;
}
```

<strong>javaScript：</strong>

- 全行に解説つけてるので、興味あれば参照にしてみてください

```js
/*
p5.jsを読み込んでおく => CodePenでは左上の歯車マークから設置出来ます
CodePenでjs新規設置する時は、Searchに「p5」っていれたら自動で検索結果が出てきます
=> 今回設置のバージョン https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.8.0/p5.min.js
*/

function setup() {
 //画面いっぱいにカンバスエリアを作製する
 createCanvas(windowWidth, windowHeight);
 // カンバス基準値を一応中央に
 rectMode(CENTER);
 // 背景を黒に => 背景はCSS側に任せた
 // background(0);
}

function draw() {
 // マウスが押された状態であるか無いかのコンソール表示
 console.log(mouseIsPressed);
 if (mouseIsPressed) {
  // もし マウスを押したら
  // 黄色を出す。cssのrgbaと同じ。最後は透明度、０−１００の範囲
  fill(random(250, 255), random(0, 255), 0, 80);
  // 円の大きさ
  // 円弧の形を作る
  arc(mouseX, mouseY, 50, 50, radians(-45), radians(235));
  // ellipse(mouseX, mouseY, random(20, 50), random(20, 50));
  // 線の太さ。円の線は無し
  noStroke();
  // 描画速度 遅め
  frameRate(15);
 } else {
  // もし マウスを押さなければ、
  //ランダムにcssのrgbaに値する、rgbを最低値１5０と最高値２５５の範囲で出す
  fill(random(150, 255), random(150, 255), random(150, 255), 70);
  // 円の大きさ
  ellipse(mouseX, mouseY, 120, 120);
  noStroke();
  // 描画速度 早め
  frameRate(25);
 }
}

// 画面がリサイズされた時はカンバスもリサイズさせる
function windowResized() {
 resizeCanvas(windowWidth, windowHeight);
}

```


参照：
p5.js本家リファレンス
<a href="https://p5js.org/reference/#/p5/">https://p5js.org/reference/#/p5/</a>

実装コード：
https://codepen.io/agdg/pen/xeQWgW?editors=0110


<p class="codepen" data-height="565" data-theme-id="0" data-default-tab="js,result" data-user="agdg" data-slug-hash="xeQWgW" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="P5 Draw Canvas">
  <span>See the Pen <a href="https://codepen.io/agdg/pen/xeQWgW/">
  P5 Draw Canvas</a> by Asagiri (<a href="https://codepen.io/agdg">@agdg</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
HTML_4 表 テーブル　

#テーブル
```
<table border="5" bordercolor="色"　bgcolor="yellow"　width ="100px" height="200px"　cellpadding="10"> 
// 枠線の太さ、色の指定　背景色 表のサイズ　セルの余白
    <tr>
      <th>名前</th>
      <th>年齢</th>
    </tr>
    <tr>
      <td>高橋</td>
      <td>2３</td>
    </tr>
    <tr>
      <td>佐藤</td>
      <td>２２</td>
    </tr>
 </table>
```
###セルを結合
```
//横方向に結合する
<td colspan="2">apple</td>
//縦方向に結合する
<td rowspan="2">りんご</td>
```

###文字のレイアウト
```
<tr align="left"> //左寄せ
<tr align="center">　//中央
<tr align="right">　//右寄せ
```
Leetcode #500: Keyboard row


```swift
func findWords(_ words:[String])->[String] {
    var answer = [String]()
    for word in words {
        let row = rowNumber(for: word.first!)
        var oneRow = true
        for char in word.dropFirst() {
            if rowNumber(for: char) != row {
                oneRow = false
                break
            }
        }
        if oneRow {
            answer += [word]
        }
    }
    return answer
}

func rowNumber(for char: Character)->Int {
    let row1: Set<Character> = ["q","w","e","r","t","y","u","i","o","p",
                                "Q","W","E","R","T","Y","U","I","O","P"]
    let row2: Set<Character> = ["a","s","d","f","g","h","j","k","l",
                                "A","S","D","F","G","H","J","K","L"]
    if row1.contains(char) {
        return 1
    } else if row2.contains(char) {
        return 2
    } else {
        return 3
    }
}
```
【VB】整数以外に\演算子(バックスラッシュ)をつかってはいけない

## 結論
基本的に`\`を使わない[^1]
代わりに`Int`等を使う

## 環境
おそらくVB6.0

## 発端
VBのコードを見てたら以下のような関数を見かけた

```VB
' 100で切り捨てる
Public Function func(cur As Decimal) As Integer
  func = (cur \ 100) * 100
End Function
```

これだと99.5は100が返ってくる

```VB
func(99.49) ' 0
func(99.5)  ' 100
```

## 解決

めんどくさがらずに`Int`等の切り捨て関数を使う[^2]

```VB
' 100で切り捨てる
Public Function func2(cur As Decimal) As Integer
  func2 = Int(cur / 100) * 100
End Function
```

```VB
func(99.99) ' 0
func(100)   ' 100
```

## 実際に動くコード
\(VB\) \| ブラウザでプログラミング・実行ができる「オンライン実行環境」\| paiza\.IO 
https://paiza.io/projects/HF3vtAn_qajYGVNKz93FpA



[^1]: [\\ Operator \(Visual Basic\) \| Microsoft Docs](https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/operators/integer-division-operator)
[^2]: 切り捨て関数もいろいろあるがマイナスの値が無いなら深く考えなくて良い
プログラミング学習記録68〜JavaScript〜

##今日やったこと
- Progate JavaScript1そのまま復習

今日はやる気がほとんどありませんでしたが、なんとかProgateのJavaScript1をやりました。
変数、比較演算子、条件分岐等のプログラミングの基礎の基礎です。

流石に忘れてなくてよかったです。

私が今、気になっている会社がJavaScript、React.js、node.jsを使った開発を行なっているので、JavaScriptをちゃんと勉強していこうと思います。

ドットインストールにも教材は多くあり、環境構築も楽なので勉強しやすいと思います。

ここ数日はYouTubeの沼にはまっていたので、まずはYouTube禁を徹底します。

おわり
irbでRubyVM::AbstractSyntaxTree.ofを使って雑にASTを取る

`~/.irbrc`に以下を足すだけでOK

```~/.irbrc
unless defined?(SCRIPT_LINES__)
  SCRIPT_LINES__ = {}
end

ast_happier = TracePoint.new(:call) do |tp|
  SCRIPT_LINES__['(irb)'] = tp.binding.local_variable_get(:statements).lines
end
ast_happier.enable(target: IRB::WorkSpace.instance_method(:evaluate))
```

## 例

```
% irb
irb(main):001:0> pp RubyVM::AbstractSyntaxTree.of(-> { puts :hi })
(SCOPE@1:35-1:48
 tbl: []
 args:
   (ARGS@1:35-1:35
    pre_num: 0
    pre_init: nil
    opt: nil
    first_post: nil
    post_num: 0
    post_init: nil
    rest: nil
    kw: nil
    kwrest: nil
    block: nil)
 body: (FCALL@1:38-1:46 :puts (ARRAY@1:43-1:46 (LIT@1:43-1:46 :hi) nil)))
=> #<RubyVM::AbstractSyntaxTree::Node:SCOPE@1:35-1:48>
```

## どうして動くのか

ここに書いた
https://dev.to/okinawarb/how-can-i-use-rubyvm-abstractsyntaxtree-in-irb-m2k

## 課題

うまく動かないケースは変数に入れてからofとかだと動かないんですが（たぶんね）、ファイル名を工夫して、`SCRIPT_LINES__`にこう入れる、というのが分かっていれば、実質自明なので頑張って改良してくれ〜の他力本願スタイルでいきます
AWS RDS を継続的に停止する

## はじめに
RDSはこの記事を執筆時点で、７日間以上継続的に停止することができない。

調べると、この制約を回避して停止し続けるためにLambdaとCloudWatchEventsを利用する方法が以下のようにいくつか見つかるが、業務で複数のAWSアカウント利用する状況があり、個別にこの設定を入れるのは非常に面倒だと感じた。

https://dev.classmethod.jp/cloud/aws/rds-auto-stop-start/
https://qiita.com/skyzt/items/1f971baaf915b1b90e89
https://qiita.com/aoi1/items/fe0caaedb036ab79773a

そこで、これらの設定を一発で行えるようにServerlessFrameworkを利用して設定を構築できるようにした。

https://github.com/shungok/rds_stopper

## ポイント
停止するRDSをDB識別子やインスタンスIDで指定する設定だとその都度LambdaFunctionのコードをいじったり、もしくは環境変数を設定したりするフローが目に浮かんだので、所定のタグが設定されているリソースを毎日停止するという仕組みを採用した。

## おわりに
タグを設定するだけで、RDSがどんどん停止できるので気持ちが良い。
うん、すごく気持ちがいい。

。。。ということでRDSを停止したくてたまらない方ぜひ使ってください。
似た名前のAttributeをたくさん作って削除する Houdini

使用ソフトはHoudini16.5です

配列ではアトリビュートの補間がうまく働かないのと、AttributeCreateSOPノードでSizeが４を超えるアトリビュートを作成しても値が操作出来ず意味がないようなので今回の方法を試してみました。

↓ **id_0からid_2まで作成**
![bandicam 2019-04-25 20-33-09-190.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308102/f187d7b1-0cbe-7cf0-e7b0-dfe8e4403225.jpeg)


**ノード全体**
![bandicam 2019-04-25 20-28-31-113.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308102/b3211104-b122-0664-98cb-bd24458f411e.jpeg)


アトリビュート作成
```VEX:set_att
string name  = chs("name");
int len = chi("len");
for(int i=0; i<len; ++i)
{
    setpointattrib(0,name+"_"+itoa(i),@ptnum,0.0);
}
```
![bandicam 2019-04-25 20-31-35-528.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308102/88f89c61-9b3e-0957-7faa-ee3aa13f2500.jpeg)

**アトリビュート消去**
![bandicam 2019-04-25 20-59-52-040.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308102/3694e5b9-7946-e32c-5106-16a6426c0927.jpeg)
正規表現を使って全て削除します

![bandicam 2019-04-25 21-02-13-719.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/308102/aa2e8165-e8b5-77b9-ec34-6db793265740.jpeg)
消えました

hipnc
http://www.mediafire.com/file/7ymtyabbyn8i8oz/cre_del_att.hipnc/file
LinuxにCloudWatchエージェントをインストールする

CloudWatchにログを転送するために、CloudWatchエージェントをインストールしました
CloudWatch Logsエージェントからの移行です
(CloudWatchエージェントは、ログストリームの集約可能なため)

OS は　AmazonLinux2 64bitです
```Linux ip-172-18-6-62.ap-northeast-1.compute.internal 4.14.77-81.59.amzn2.x86_64 #1 SMP Mon Nov 12 21:32:48 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux```

このあたりを参考にしました
[CloudWatch エージェントのインストール](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-on-EC2-Instance.html)



# モジュールを持ってくる
```shell
wget https://s3.amazonaws.com/amazoncloudwatch-agent/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm
```
[OSごとのモジュールダウンロードリンク](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/download-cloudwatch-agent-commandline.html)

# rpmをインストール
```shell
rpm -U ./amazon-cloudwatch-agent.rpm
```

# エージェントインストール
```shell
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
```
ウィザードになり、取得する値の設定をできます
CloudWatch Logs Agentからの移行もできます！！！！嬉しい

# # サービス起動(設定ファイル：/opt/aws/amazon-cloudwatch-agent/bin/config.json)
```shell
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s
```

# サービス起動確認
```shell
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
```
ここまで来ると、CloudWatchLogsに出力されているのを確認できます


# サービス停止
停止は以下

```
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a stop
```

# 停止して設定ファイルを編集して、起動もできます
```shell
# 編集
vi /opt/aws/amazon-cloudwatch-agent/bin/config.json
# 起動
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s

```

設定ファイルの書き方は下記に
[CloudWatch エージェント設定ファイルを手動で作成または編集する](https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html)

<br>
<br>

# その他
プライベートサブネットにNATゲートウェイを持っていない環境のため、
CloudWatchのエンドポイントにアクセスする用途で、VPCエンドポイントを使用しました
メトリクス用とログ用で異なるエンドポイントのため、少しハマりました笑

メトリクス用のエンドポイント名(東京リージョン)
```com.amazonaws.ap-northeast-1.monitoring```

CloudWatchLogs用のエンドポイント名(東京リージョン)
```com.amazonaws.ap-northeast-1.logs```


<br>

それでは、良いCloudWatchエージェントライフを
ABC094 C - Many Medians (300点)

#問題概要
[問題のリンク](https://atcoder.jp/contests/abc094/tasks/arc095_a)

$N$  個の数 $X_1,X_2,...,X_N$ が与えられる。($N$ は偶数。)

ここで、$i=1,2,...,N$ に対して，$X_1,X_2,...,X_N$ から $X_i$ のみを除いたもの、すなわち $X_1,X_2,...,X_{i−1},X_{i+1},...,X_N$ の中央値を $B_i$ とする。$i=1,2,...,N$ に対して，$B_i$ を求めよ。

#制約条件
- $2≤N≤200000$
- $N$ は偶数
- $1≤X_i≤10^9$
- 入力はすべて整数

#考えたこと
まず配列$X$から$X_i$を除いた配列を作って中央値を求めるという方法が思いつくが、この時C#だと `Remove` メソッドの計算量は$O(N)$となるので、全ての$X$に対して上の処理をすると$O(N^2)$となるのでTLEする。
よって$O(N)$以下に計算量を収めたい。

偶数個の要素($N$)をもつ配列$X$から$X_i$、つまり1つの要素を除いた配列の中央値を求めるので、中央値は$X_{n/2-1}$か$X_{n/2}$のどちらかとなる。
以下の入力例1での場合を見てみるとわかりやすい。
![IMG_1345.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326440/11e501e6-2870-943c-80de-3b663b55e735.jpeg)

よって、$X_i$が$X_{n/2-1}$より左側、すなわち$X_{n/2-1}$以下の場合は$X_{n/2}$が答えとなり、$X_{n/2}$より右側、すなわち$X_{n/2}$以上の場合は$X_{n/2-1}$が答えとなる。

この時計算量は$O(N)$となる。

#解答
```c.cs
using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main(string[] args) {
        int n = int.Parse(Console.ReadLine());
        List<int> x = Console.ReadLine().Split().Select(int.Parse).ToList();
        List<int> l = new List<int>(x);
        l.Sort();
        for(int i = 0; i < n; i ++) {
            Console.WriteLine(solve(n,l,x[i]));
        }
    }
    static int solve(int n, List<int> l, int x) {
        int ans = 0;
        if(x <= l[n/2-1]) ans = l[n/2];
        if(x >= l[n/2]) ans = l[n/2-1];
        return ans;
    }
}
```
pythonとフェルマーの小定理で１行FizzBuzz

#FizzBuzzでフェルマーの小定理が使えるらしい

フェルマーの小定理がFizzBuzzに使えると聞いて、調べてもわかりやすいコードと記事が見つけられなかったのでpythonで自分で作ってみました。以下のコードはできあがったものです。

```python
for n in range(1,101):print("FizzBuzz"[n**2%3*4:12-n**2%3*4-n**4%5*8] or n)

```

※【2021/03/17追記】記事の初回投稿後にコメント欄などでの意見を参考に改良を試みましたが最終的に以下のコードを頂きました。

```python
for n in range(1,101):print("FizzBuzz"[n*n%3*4:8-n**4%5*4]or n)
```

これを見ても普通はよくわからないと思うので作成時の思考過程をこの記事で書いていきます。

#フェルマーの小定理

まずはフェルマーの小定理の主張を確認しましょう。

```math
n^{p-1} ≡ 1 \quad (mod \hspace{5pt} p)
```
ただしpとnは互いに素で、pは素数。
$n^{p-1}$をpで割った余りが1になるということです。

※【2021/03/17追記】（読み飛ばし可能）$n^p≡n$と表現される場合がありますがnは自然数なので同値です。上記の表現のほうが今回は都合がいいです。また、より一般的な「オイラーの定理」（$n^{Φ(m)}≡1 $ (mod m)）への拡張（素数pに対してはトーシェント関数がΦ(p)=p-1）を考えても上の表記のほうが適しています。

#FizzBuzzへの応用

nがp（3または5）の倍数でないとき、nとpは互いに素だから

```math
n^{2} ≡ 1 \quad (mod \hspace{5pt} 3)\\
n^{4} ≡ 1 \quad (mod \hspace{5pt} 5)
```

が成り立ちます。
nがp（3または5）の倍数のとき、余りはもちろん0です。つまり3（または5）の倍数でないかどうかを1と0で表せるわけです。

#実装

以下の式はnが3の倍数のとき0、そうでないとき1になります。

```python

n**2%3
```

0と1を反転させたければ以下のようにします。

```python

1-n**2%3
```
5も同様です。

```python

n**4%5
1-n**4%5
```
これを利用すると次のようなFizzBuzzコードが書けます。

```python

for n in range(1,101):print((1-n**2%3)*"Fizz"+(1-n**4%5)*"Buzz" or n)
```

#文字列"FizzBuzz"からのスライス

上記のコードはn\*\*2%3などが数字であることを活かしきれていません。これではつまらないので"FizzBuzz"という文字列から必要に応じて必要な部分だけをスライスするプログラムを実装してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298838/daae50dc-a2bd-bc8e-1e2e-ba0bfc55eb5a.png)


手書き失礼しました。
上の画像は"FizzBuzz"の各文字のインデックスとスライスの開始（黒丸）および終了（白丸）の対応で、上から順に数字、Fizz、Buzz、FizzBuzzの場合に相当します。紫の数字はn\*\*2%3およびn\*\*4%5を並べたものです。

スライスに含まれるのはは開始点のインデックス以上かつ終了点のインデックス未満のインデックスを持つ要素です。また、終了点のインデックスが開始点のインデックス以下になると文字列を返しません。したがって例えば上の画像のような開始・終了の位置が考えられます。

n\*\*2%3およびn\*\*4%5の値をベクトル(x,y)で表し開始点と終了点を(X,Y)で表すと

```math

X = ax + by + c\\
Y=dx+ey+f

```

を満たすような6つのパラメータa,b,c,d,e,fを見つけます。上の図の通りだと拘束条件が8個で解は存在しない事になってしまいますが、(0,1)と(0,0)のときの開始点Xは4以下であればよく(1,0)と(0,0)のときの終了点Yは8以上であればよいので例えば(a,b,c,d,e,f)=(4,0,0,-4,-8,12)などを選びます。

```math

X = 4x \\
Y=-4x-8y+12

```

このX,Yで"FizzBuzz"[X:Y]のようにスライスします。これを実装したのが冒頭のコード(以下に再掲)です。

```python
for n in range(1,101):print("FizzBuzz"[n**2%3*4:12-n**2%3*4-n**4%5*8] or n)
```

#追記：平方の記述(2019/04/27)

コードゴルフとしてはn\*\*2ではなくn*nとしたほうがよいという指摘をいただきました。

```python
for n in range(1,101):print("FizzBuzz"[n*n%3*4:12-n*n%3*4-n**4%5*8] or n)
```

#追記2：n*n%3*4をまとめる(2019/04/28)

n*n%3*4が２回現れているのでoとして以下のようにまとめるとさらに2文字短くなるという指摘をいただきました。

```python
for n in range(1,101):o=n*n%3*4;print("FizzBuzz"[o:12-o-n**4%5*8] or n)
```

#追記3：Y=-4y+8とするとさらに短くなる(2021/03/16)

コメント欄で以下のコードでも良いことをご指摘いただきました。(x,y)=(1,1)のときY≦Xを満たせば良いので(X,Y)=(4,4)とするとYがyのみに依存する形になりコードがさらに8文字も短くなりました。これは数学的にもきれいです。

```python
for n in range(1,101):print("FizzBuzz"[n*n%3*4:8-n**4%5*4]or n)
```
windows環境で呼び出されるkotlincがkotlinc.batでハマった

お手製開発環境の構築中にハマりました

# 環境

- windows10 x64
- IntelliJ IDEA Community Edition 2019.1.1 x64
- intellij のプラグインとして、Kotlin v1.3.21-release-IJ2019.1-3 がインストールされている

# やろうとしたこと

- `intelljのインストールディレクトリ/plugins/Kotlin/` に Kotlin が入っていた
- `intelljのインストールディレクトリ/plugins/Kotlin/kotlinc/bin` にパスを通せば、コマンドラインから `kotlinc` が実行できると思った。これは動作した。
- ただし、コマンドラインでない別のプロセスから実行しようとする(例えば ruby で `system("kotlinc main.kt")` をする)と ENOENT を返して実行できない。

# 解決

- そもそも `intelljのインストールディレクトリ/plugins/Kotlin/kotlinc/bin` のフォルダをよく見ると、`kotlinc.exe`というファイルは存在せず、`kotlinc`、`kotlinc.bat` というバッチファイルが存在するだけだった。
- なので、`kotlinc.bat`を呼び出すようにする(例えば ruby で `system("kotlinc.bat main.kt")` をする)とコンパイルが出来る。
NexusでプライベートDockerリポジトリを作成

## 環境
* CentOS7
* java 1.8.0_212

## Nexus環境構築

１．アプリをダウンロード
 
```
wget https://download.sonatype.com/nexus/3/latest-unix.tar.gz
```

２．ダウンロードしたアプリを任意のディレクトリへ移動

```
sudo mv latest-unix.tar.gz /opt
cd /opt
```

３．対象ファイルを解凍、不要なファイルを削除、ディレクトリ名変更

```
sudo tar xvfz latest-unix.tar.gz
sudo rm -rf latest-unix.tar.gz
sudo mv nexus-3.16.1-02/ nexus3
```

４．権限変更

```
sudo chown -R centos:centos nexus3/ sonatype-work/
```

５．起動

```
nexus3/bin/nexus run
```
※「Started Sonatype Nexus.」がコンソールに出力されるまで待機
※「<http://nexus-ip-address:8081/>」へアクセス
※外部からアクセスする場合は、8081ポートの開放が必要

## サインイン

* デフォルトの管理ユーザー情報

| ユーザー | パスワード |
|:--------|:--------|
| admin | admin123 |

## Dockerリポジトリ作成

１．下記アイコンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301697/29a85593-b149-8cdf-771d-94a32563915d.png)

２．下記アイコンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301697/de9102c5-d62c-f0aa-13f7-64920b897966.png)

３．下記アイコンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301697/1d64cd00-72c0-5f8d-8f00-58770702df69.png)

４．下記アイコンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301697/e2ae6a88-145c-3dbe-a7d3-6236d0680668.png)

５．Dockerリポジトリ情報を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301697/0d6da393-c64c-9e5a-6912-d5b3f0251258.png)
※ここでは

* リポジトリ名をdocker-reposに設定
* 8083ポートでHTTP公開

６．下記アイコンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/301697/63693387-01cb-999f-258a-51ffbd9bb6f0.png)

## Nexusへイメージをプッシュ（クライアント操作）
１．下記のファイルを/etc/dockerディレクトリへ作成

```json:daemon.json
{
  "insecure-registries": ["nexus-ip-address:docker-repos-port"],
  "disable-legacy-registry": true
}
```
※http://docs.docker.jp/engine/reference/commandline/dockerd.html
※今回の場合、docker-repos-portは8083

２．Dockerサービスを再起動

```
sudo systemctl restart docker
```

３．Dockerリポジトリへログイン

```
$ sudo docker login -u admin -p admin123 nexus-ip-address:docker-repos-port
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
```

４．プッシュしたいイメージに対して下記の形でタグを打つ

```
sudo docker tag target-image:target-tag nexus-ip-address:docker-repos-port/image:tag
```

５．プッシュ

```
sudo docker push nexus-ip-address:docker-repos-port/image:tag
```

## 参考URL
* https://help.sonatype.com/learning/repository-manager-3/first-time-installation-and-setup/lesson-1%3A--installing-and-starting-nexus-repository-manager
* https://www.youtube.com/watch?v=arAXOnvOSyY
* https://help.sonatype.com/repomanager3/installation/run-as-a-service
【C#/WPF】WriteableBitmapで点を打って、テレビの放送終了後の砂嵐をつくる(Taskで処理)

# タイマーでやる場合
[こちら](https://qiita.com/tera1707/items/96dc5af566081c74ad22)を参照。

# Taskで処理を行うパターン

上の例では、UIとバインドしているプロパティへのアクセス'(MyWBitmap.WritePixels()の部分)'はUIスレッドでしか実施できないため、別スレッドで実施されるTaskを使用せず、タイマで処理をしていたが、
Taskを使った場合でも、UI周りの処理の時だけUIスレッドで処理してもらうということができる。

下記が、そのサンプル。
Dispatcherを使用し、UIスレッドに処理を渡している。


```cs
using System;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Threading;

namespace WpfApp1
{
    class ViewModel : BindingBase
    {        
        public WriteableBitmap MyWBitmap { get; set; } = new WriteableBitmap(1280, 720, 96, 96, PixelFormats.Pbgra32, null);

        Dispatcher MainViewDispatcher = null;

        public ViewModel(Dispatcher dispatcher)
        {
            MainViewDispatcher = dispatcher;

            Task.Run(() =>
            {
                while (true)
                {
                    int width = (int)1280;
                    int height = (int)720;

                    // 計算用のバイト列の準備
                    int pixelsSize = (int)(width * height * 4);
                    byte[] pixels = new byte[pixelsSize];

                    Random rnd = new System.Random();    // インスタンスを生成
                    int rndMax = 256;                    // 0～256の乱数を取得

                    // バイト列に色情報を入れる
                    for (int i = 0; i < width * height; i++)
                    {
                        pixels[4 * i] = (byte)rnd.Next(rndMax);        // blue;
                        pixels[4 * i + 1] = (byte)rnd.Next(rndMax);    // green;
                        pixels[4 * i + 2] = (byte)rnd.Next(rndMax);    // red;
                        pixels[4 * i + 3] = (byte)255;                 // alpha
                    }

                    // バイト列をBitmapImageに変換する
                    int stride = width * 4; 

                    // TaskはUIスレッドと別のスレッドのため、ビットマップにバインドしたプロパティの操作はUIスレッドでやってもらう
                    // そのために、Dispatcherを使う
                    MainViewDispatcher.BeginInvoke(new Action(() =>
                    {
                        MyWBitmap.WritePixels(new Int32Rect(0, 0, width, height), pixels, stride, 0, 0);
                    }));

                    Thread.Sleep(33);
                }
            });
        }
    }
}
```

今回は、砂嵐の画面データをつくる処理がそれほど重い処理ではないので問題ないが、なにか重い処理をするような場合は、タイマーでやっているとUIが固まったように見えてしまうことが考えられる。
その場合、上記のように、TaskとDispatcherで、重い処理の部分を別スレッドで実施すればよい。
【VisualStudio】ビルドをバッチで行う

# もくじ

https://tera1707.com/entry/2022/02/06/144447

**ビルドの自動化関連**

- [【VisualStudio】ビルドをバッチで行う](https://qiita.com/tera1707/items/018e8390207c5b2212b2)
- [[バッチ] bitsadminでファイルをダウンロードする](https://qiita.com/tera1707/items/78c2a4d1fb175a8f8b8d)

# やりたいこと
複数のソリューション(sln)が絡むシステムをまとめて変更するときに、それぞれのslnをVisualStudioで立ち上げてメニューからビルド、とするのが面倒かつ間違いが発生しやすい。
batをダブルクリックしたら、決まった手順でビルドをしてくれるようにしたい。

# MSBuildを使う

MSBuildは、VisualStudioがない環境でもアプリケーションをビルドできるツール。
MSBuildを使うと、VisualStduioのメニューから行っていたビルドを自動化できる。

※1つのプロジェクト、ソリューションだけをビルドするときはメニューからの操作で問題ないが、例えばライブラリ作成用のソリューションと、それを使う側のソリューションを別に作っている場合などは、各ソリューションから手でビルドすると大変なので、コマンドで一括ビルドできるようにしておくと便利。

# 前提
- 普段はVisualStudioで開発をしていて、ソリューションファイル(.sln)が存在している状況を想定。

# 処理の流れ

処理の流れとしては、

- 開発者用コマンドプロンプトを起動
- MSBuildでビルド実施

となる。以下、サンプル。

``` build.bat
rem まず開発者用コマンドプロンプトを起動してから
call "C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\Tools\VsDevCmd.bat"

rem MSBuildでビルドする
cd %~dp0
MSBuild %slnファイルのパス% /t:clean;rebuild /p:Configuration=Release;Platform="Any CPU"
if %ERRORLEVEL% neq 0 (
    echo ErrorLevel:%ERRORLEVEL%
    echo ビルド失敗
)
```

# 参考

MSBuildでコマンドラインからビルドする
http://sh-yoshida.hatenablog.com/entry/2017/05/27/012755

MS Build
https://docs.microsoft.com/ja-jp/visualstudio/msbuild/msbuild?view=vs-2019

MSBuild command-line reference
https://docs.microsoft.com/ja-jp/visualstudio/msbuild/msbuild-command-line-reference?view=vs-2019

=======

# (おまけ)Nugetパッケージ復元の自動化

nugetも、コマンドで復元できる。
slnをnuget.exeに食わせてやれば、slnから必要なパッケージを読み取って、復元してくれる。

バージョン管理(svnなど)に外部のパッケージは入れたくないが、ビルドするときにはそのへんも復元したい、という場合に、上のMSBuildと組み合わせて、まずnuget復元してからビルド、とかすると便利。

### やり方
nuget.exeを置いたフォルダで

``` a.bat
cd %~dp0
.\NuGet restore <slnファイルのパス>
```
カタパルトの暗号化メッセージは447バイトまで

# はじめに

nemのトランザクションには、任意のメッセージがつけられます。

カタパルトも同様で、任意のメッセージがつけられます。

これまでは、平文メッセージだけだったのですが、暗号化メッセージが送れるようになりました。

平文メッセージは、1023バイト、おおよそ半角1023文字まで可能でした。暗号化メッセージではどうなっているのか試してみます。

# 環境

このウォレットを使います。

http://walletcow.z31.web.core.windows.net/

以下のように、平文か暗号化かを選べます。暗号化の際には、受信者の公開鍵が必要になります。別に受信者のでなくてもよいのですが、そうすると受信者は復号できなくなります。

また、メッセージ欄は、1023を超えて入力できます。超えた場合、カウンターが赤くなるだけです。

あと、一時的に、送信した際にトランザクションのバイト列とその長さを表示するようにしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/29499d80-4020-b871-c548-01e63c7bfcce.png)


時がたつと再現性がなくなるかもしれないですが、その時にはカタパルトの仕様もまた変わっている可能性があるので、気にしないでおきます。

接続先

http://54.178.241.129:3000

# やってみる


## 平文

### 1023文字

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/fb73cbb3-3877-2d67-2b0c-ad45a2bd9ed4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/41272fd2-387e-7ba3-9069-d7e49a9be39c.png)

送れます。

### 1024文字

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/a7f1e0f9-4018-8c96-26a5-429067609f0a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/c6f1e778-2415-aefa-026f-1fa2e72aefad.png)

送れませんでした。


## 暗号文

### 447文字

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/da697ada-d08a-6020-aef6-9d3bce69d7e0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/3f5fe582-f58e-d3d4-b9ed-a0f662f21bef.png)


送れます。


### 448文字

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/d42bbca7-5c9b-fe8e-99b9-87b273b182e7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/c606ebce-c3ab-916c-15eb-5299b8471324.png)

送れませんでした。

# 考察とか

## 暗号化したメッセージのサイズが1023バイト以下

元のメッセージが447文字の場合、暗号化メッセージは993バイトになりました。
また、元のメッセージが448文字の場合、暗号化メッセージは1025バイトになりました。

なので、暗号化したメッセージが1023バイトを下回っている必要があるということになります。

## 128bitのブロック長

元のメッセージが432～447文字の場合、暗号化メッセージは同じサイズになりました。

これは、使っているアルゴリズムが、固定サイズで区切って処理しているということになると思います。

メッセージの暗号化には、AESが使われています。該当のコードは以下になります。

https://github.com/nemtech/nem2-library-js/blob/master/src/crypto/crypto.js#L249

AESでは、ブロック長が128bitなので、16文字増える毎に暗号化メッセージのサイズが変わる感じだと思います。

# おわりに

平文は1023文字まで。

暗号化する場合は447文字まで。
複数の SFTP ユーザーに対しディレクトリ制限をかける際の色々な書き方

Web サイトを構築する際、技術的な事にあまり明るくない人でも簡単に更新作業ができるよう、SFTP 専用ユーザーを用意する事も多いと思います。

そのユーザーに対しディレクトリの移動制限をかける際、どのような書き方があるかをまとめました。

--------------------------------------------------------------------------------

## よくあるディレクトリ制限の設定方法

軽くググってみると、`/etc/ssh/sshd_config` に対して以下のように設定する方法がよく紹介されていますが…

### 1.Match User で直にユーザー名を指定して制限（非推奨）

```
Match User hoge
    ChrootDirectory /home/hoge/dir
    ForceCommand internal-sftp

Match User fuge
    ChrootDirectory /home/fuge/dir
    ForceCommand internal-sftp
```

…ユーザーが増えた時の管理の手間を考えると、この方法はあまりオススメできません。

--------------------------------------------------------------------------------

### 2.Match group で制限

SFTP ユーザー専用のグループ(`sftp`等) を作成し、Match group を利用して 1 つの設定で済ませるという方法です。

```
#-- 「sftp」グループに所属する全てのユーザーに対しChrootする
Match group sftp
    ChrootDirectory ~
    ForceCommand internal-sftp
```

分かりやすい考え方だと思います。

--------------------------------------------------------------------------------

### 3.Match User のワイルドカードを活用して制限

SFTP ユーザー名には、特定の  prefix(`sftp-`等) を付けるというルールを設け、ワイルドカードを利用して 1 つの設定で済ませるという方法です。

```
#-- 「sftp-」から始まる全てのユーザーに対しChrootする
Match User sftp-*
    ChrootDirectory ~
    ForceCommand internal-sftp
```

これはこれでアリだと思います。

--------------------------------------------------------------------------------

## マイナーな(？)ディレクトリ制限の設定方法

こういう書き方もできるという事が、あまり紹介されていないようです。

```
#-- root以外の全てのユーザーに対しChrootする
Match User *,!root
    ChrootDirectory ~
    ForceCommand internal-sftp
```

使いどころは限られるかもしれませんが、知っておいても損はないのではないでしょうか。
感謝の機械学習 : SageMaker で Keras の RNN を使ってみる

# 目次はこちら
[感謝の機械学習](https://qiita.com/asahi0301/items/46e7da4518417cfe0eb5)

# TL;DR
[感謝の機械学習 : SageMakerでKerasを使う](https://qiita.com/asahi0301/items/5804b928c6a7fd5bc2d0) とほぼ同じ内容ですが、CNNではなくRNNを使いました。
Qiitaで紹介されていたサンプルコードをSageMaker上で動くように少し書き換えました。
localでのトレーニング/推論、SageMakerのトレーニングジョブ/推論エンドポイント作成/推論を試しています

# ソースコード
https://github.com/asahi0301/sagemaker-demo/tree/master/keras-rnn-sin
Notebookインスタンス上でgit cloneしてお使いください。
基本そのままnotebookを実行すれば動くはずです。

元ネタはこちらを参考にさせていただきました - [深層学習ライブラリKerasでRNNを使ってsin波予測](https://qiita.com/yukiB/items/5d5b202af86e3c587843) 



# 説明
notebookにも記載済みですが、いくつか変更ポイントを述べさせていただきます。

## トレーニングデータをS3にアップロードする必要があります
SageMakerはlocalでもトレーニングジョブでも、S3からデータを取得し、'/opt/ml/input/data/training/' へ保存する動きになっているため、S3にデータを保存するのは必須です。
手動でアップロードいいですが、SageMaker python SDKでデータをアップロードできますのでそれを利用しました。
具体的には以下の部分です。

```py

import os

os.makedirs("./data", exist_ok = True)

np.save('./data/X_train.npy', X_train)
np.save('./data/y_train.npy', y_train)


import sagemaker
sagemaker_session = sagemaker.Session()
bucket_name = sagemaker_session.default_bucket()
input_data = sagemaker_session.upload_data(path='./data', bucket=bucket_name, key_prefix='dataset/keras-rnn-sin')
print('Training data is uploaded to: {}'.format(input_data))

```

## def train と def saveを作るのは相変わらずです
最初はめんどくさいですが、すぐに慣れますし、それさえやれば、local環境が貧弱でも、GPUを使ったトレーニングを実行することができるようになります。


## mainガード部分にargumentを書きます
それに伴って import argparseとかも必要になりますが、これも慣れです。
batch-site, validation_split, epochs のハイパーパラメータは、job実行時に指定します。(指定しない場合はデフォルト値をソースコード上で指定しています)

model-dir、trainはおまじないに近いのでそのままでコピペでOKです。


````py
if __name__ == '__main__':
    parser = argparse.ArgumentParser()

    # hyperparameters sent by the client are passed as command-line arguments to the script
    parser.add_argument('--batch-size', type=int, default=600)
    parser.add_argument('--validation_split', type=float , default=0.05)
    parser.add_argument('--epochs', type=int, default=15)

    # input data and model directories
    parser.add_argument('--model-dir', type=str, default=os.environ['SM_MODEL_DIR'])
    parser.add_argument('--train', type=str, default=os.environ['SM_CHANNEL_TRAINING'])

    args, _ = parser.parse_known_args()
    train(args)

```
【PHP8.0】PHPの三項演算子が他言語の実装に一歩近付く

[Deprecate left-associative ternary operator](https://wiki.php.net/rfc/ternary_associativity)というRFCが投票に入っています。

提案者の[Nikita](https://nikic.github.io/)は、最近[アロー関数](https://qiita.com/rana_kualu/items/7fbdd520a7e355599f7d)やら[Always generate fatal error for incompatible method signatures](https://wiki.php.net/rfc/lsp_errors)やら[Consistent type errors for internal functions](https://wiki.php.net/rfc/consistent_type_errors)やら立て続けに凄い勢いで活躍してて[すごい草生えてる](https://github.com/nikic)。
過去一年のcontributions2000超えって何なの…？

# Deprecate left-associative ternary operator

## Introduction

ほとんど(全て？)の他言語と異なり、PHPの三項演算子は右結合ではなく左結合です。
左結合の振る舞いは一般的に有用ではなく、複数言語を使い分けるプログラマにとって混乱の元になっています。
このRFCでは三項演算子の左結合性を廃止・削除し、かわりに括弧の明示的な使用を強制します。

例として以下のコードを上げます。

```php
return $a == 1 ? 'one'
     : $a == 2 ? 'two'
     : $a == 3 ? 'three'
     : $a == 4 ? 'four'
               : 'other';
```

大抵の言語ではこのように解釈されます。

```php
return $a == 1 ? 'one'
     : ($a == 2 ? 'two'
     : ($a == 3 ? 'three'
     : ($a == 4 ? 'four'
               : 'other')));
```

これは直感的であり便利な解釈です。
PHPではそうではなく次のようになります。

```php
return ((($a == 1 ? 'one'
     : $a == 2) ? 'two'
     : $a == 3) ? 'three'
     : $a == 4) ? 'four'
               : 'other';
```

これは一般的に考えられるような動作ではありません。


## Proposal

PHP7.4では、括弧を使わずに三項演算子のネストを使用すると非推奨の警告を表示します。
PHP8では、コンパイルエラーになります。

```php
1 ? 2 : 3 ? 4 : 5;   // deprecated
(1 ? 2 : 3) ? 4 : 5; // ok
1 ? 2 : (3 ? 4 : 5); // ok
```

これはエルビス演算子においても同様です。

```php
1 ?: 2 ? 3 : 4;   // deprecated
(1 ?: 2) ? 3 : 4; // ok
1 ?: (2 ? 3 : 4); // ok
 
1 ? 2 : 3 ?: 4;   // deprecated
(1 ? 2 : 3) ?: 4; // ok
1 ? 2 : (3 ?: 4); // ok
```

ただし例外として、エルビス演算子を2回重ねる場合は括弧が必要ありません。

```php
1 ?: 2 ?: 3;   // ok
(1 ?: 2) ?: 3; // ok
1 ?: (2 ?: 3); // ok
```

なぜかというと、`($a ?: $b) ?: $c`と`$a ?: ($b ?: $c)`は左結合であろうと右結合であろうと常に同じ結果になるからです。

三項演算子の中央を三項演算子にする場合も括弧は必要ありません。
これは解釈を間違えることがなく、結合性の影響を受けないからです。

```php
1 ? 2 ? 3 : 4 : 5 // ok
1 ? 2 ?: 3 : 4    // ok
```

Null合体演算子`??`は既に右結合なので、このRFCによる影響はありません。


## Backward Incompatible Changes

三項演算子の左結合性を悪用するコードは、PHP8ではエラーになります。
左結合の三項演算子を使っているようなコードはほぼ確実にバグなので、このRFCによる影響は最小限に抑えられます。


## Future Scope

しばらくエラーにしておけば、いずれ正しい三項演算子にすることができます。


## 投票

2019/04/23に投票開始、2019/05/07に投票終了。
有権者の2/3+1の賛成で受理されます。

2019/04/25時点では賛成22、反対8で、賛成が優勢ですが、まだ簡単にひっくり返る程度の差です。
果たしてどうなることでしょうか。


# 感想

一気に他言語と同じ動作にしてしまうと、同じ書き方でもPHPのバージョンによって動作が完全に異なってしまい、間違いなく大混乱になるでしょう。
そのためいったん動かないようにして、順次移行するという形にしたようです。

前[三項演算子について調べた](https://qiita.com/rana_kualu/items/748dba779148152301ff)とき、PHPと同じ解釈をする言語がひとつだけあったと思うんだけど何だったっけ。
その言語にとっては遂に仲間が居なくなってしまいますね。

まあそもそも根本的に、三項演算子をネストするなって話ですが。
[遊ぶと楽しい](https://qiita.com/rana_kualu/items/0e9b48b4361ee567c7e6)のは確かですが、会社でこんなコードを書いてきたらぶん殴られて当然です。
Windows10にOracle12cを入れようとして躓いた話

初投稿。

検証用にWindows10に初めてインストールを試みたけど、
なぜかDBを作ろうとするとエラーが発生したので
同じような事象が発生した人向けに記事に残しておきます。

# DBCAでDIM-00019 O/S-Error:(OS 5)が発生した

DBCAを起動して、いざ作成！と思って
ボタンを押したら DIM-00019 O/S-Error:(OS 5) でDBCAが落ちました。。。

<img width="390" alt="スクリーンショット 2019-04-25 19.20.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404417/d52ddd69-a932-f08b-d9ec-f6373d69d735.png">




なんでや？と思って色々調べたら、以下の記事を見つけました。

■12c Cannot create service/ sid using ORADIM (DIM-00019: create service error O/S-Error: (OS 5) Access is denied.)
∟https://meerathil.blogspot.com/2013/09/12c-cannot-create-service-sid-using.html


どうやら、DBCAを管理者として実行しなければならないみたいですね・・・


さっそくコマンドプロンプトを管理者として実行し、DBを作成してみましょう。

<img width="154" alt="スクリーンショット 2019-04-25 19.30.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404417/669193c2-f140-452b-9d38-6293bc37aab4.png">

<h３>**よろしくお願いしまああーーーーす！！！！**


![b88a45a38c1c3f96d28c13fa8ff5b900.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/404417/b0899ff5-7cee-cb89-ed33-f24ea21d7910.png)






うまくできましたね！
次回はRACの構築方法とかをつまずいた事含めメモ程度で投稿しようと思います。
eclipseでtomcat起動時に「ClassNotFoundException」が表示されて起動できない

表題の通り、eclipseでtomcatを起動した時に、「ClassNotFoundException」が表示されたて起動せず
約半日はまったのでメモ。

<b>＜対処方法＞<b>

●mavenのローカルリポジトリの再作成
　※基本的に、.m2フォルダ内にrepositoryフォルダが無ければプロジェクト更新時に勝手に再作成するので、
　　以下の手順で一度repositoryフォルダを削除すればOKです。
<ol>
 <li>Eclipseをクローズする。（起動したままだと、ローカルリポジトリ内のファイルを掴んだままで以下の手順が失敗する可能性があるため）</li>
 <li>.m2フォルダに移動する。（通常は、『C:/Users/{UserName}/』フォルダ下にあるはずです。）</li>
 <li>repositoryフォルダを削除する。（他の場所に移動、またはフォルダ名を変えるだけでもいいです）</li>
 <li>Eclipseを起動する。</li>
 <li>Alt+F5(MavenのUpdate Project。※上記のrepositoryフォルダを作り直して必要なjarファイルをダウンロードしてくるので、時間がかかります)</li>
 <li>Tomcatを起動する。</li>
</ol>
Rails5 で credentials を利用して、 外部 API の設定を yml に保存して読み出す

Rails 5.2 から導入された credentials.yml.enc を利用して、
外部 API 実行の際の access_token 等を YAML から読み出して
利用する方法

YAML.load する際に、 一回 ERB を通すと credentials の中身の置き換えてくれる 


```hogehoge.rb
yaml = Rails.root.join('config/hogehoge.yml')
Rails.application.config.hogehoge_config =
  if yaml.exist?
     YAML.load(ERB.new(yaml.read).result)[Rails.env].to_options
  else
    {}
  end
```

```hogehoge.yml
default: &default
  endpoint: https://api.hogehoge.com/
  access_token: <%= Rails.application.credentials.dig(:hogehoge, :access_token) %>

development:
  <<: *default

production:
  <<: *default

test:
  <<: *default
```

```credentials.yml.enc
hogehoge:
  access_token: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```
子ディレクトリにある実行ファイルから、親ディレクトリのライブラリを参照するためにsys.path.appendするコードは、pyhton-fireで解決できる

親ディレクトリにあるライブラリを使うために、実行ファイルからの相対パスを使ってimportするコードをたまに見かける。

```python:bin/hoge.py
import os
import sys

sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
import library


def hoge():
    library.echo('hoge')


if __name__ == '__main__':
    hoge()

```

```bash
$ python bin/hoge.py 
hoge
```

このコードは`import library`の部分でWARNINGが出る。
> Python | PEP 8 coding style violation

これは、親ディレクトリに実行ファイルを作り、[python-fire](https://github.com/google/python-fire)経由で子の関数を見るようにすると綺麗に解決できる。

```python:run.py
import fire
import bin

if __name__ == '__main__':
    fire.Fire(bin)
```

```python:bin/__init__.py
from .fuga import fuga
from .hoge import hoge
```

```python:bin/fuga.py
import library


def fuga():
    library.echo('fuga')
```

```bash
$ python run.py fuga
fuga
```

[python-fire](https://github.com/google/python-fire)は、いいぞ。

[サンプルコード](https://github.com/Hiroshiba/import-parent-library-wo-add-path)
VirtualBox 6.0.6にアップデートするとvagrant upでフォルダが共有されなくなった。

VirtualBoxとVagrantを久しぶりにアップデートしたところ、
`vagrant up`実行時に以下のメッセージが出力され、フォルダの共有ができなくなりました。

```bash:メッセージ内容
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

 setup

Stdout from the command:


Stderr from the command:

bash: line 4: setup: command not found
```

一先ず、事象が解消したので共有したいと思います。

更新したバージョン
VirtualBox：6.0.6
Vagrant：2.2.4

結論として、VirtualBoxのバージョンが問題でした。
VirtualBoxのバージョンを`6.0.4`にダウングレードすることで改善しました。

参考：https://github.com/dotless-de/vagrant-vbguest/issues/278
参考をみると時折発生する事象のようです。

ちなみに、以下のコマンドによるプラグインの更新などでは解消しませんでした。

```
vagrant provision
とか
$ vagrant plugin update vagrant-vbguest
とか
$ vagrant plugin update 
```

既にVirtualboxへのissueも上がっているようです。
ざっくりな内容ですが、以上です。
列挙型を利用してフラグの定義をする(C++)

# フラグに名前をつけて定義したらたまに間違う問題

この対応のための方法をいくつか考えていまして。
C++14から2進数での記述に対応したこともあって以下のような手法を最近使っています。

``` C++
static const unsigned char FLAGID_HAGE = 0b1;
static const unsigned char FLAGID_HIGE = 0b10;
static const unsigned char FLAGID_HUGE = 0b100;
static const unsigned char FLAGID_HEGE = 0b1000;
static const unsigned char FLAGID_HOGE = 0b10000;
```

=の位置を揃えておけば斜面の滑らかさで変なところに気づけるという具合。
このやり方では間に何か挟もうとするとそれ以降の数値を全部書き換えないといけません。
というわけで次の方法を考えました。

``` C++
#define	Flag(x)	flag_##x = 1 << x
enum
{
	Hage = 0,
	Hige,
	Huge,
	Hege,
	Hoge
};
static const unsigned char Flag( Hage );
static const unsigned char Flag( Hige );
static const unsigned char Flag( Huge );
static const unsigned char Flag( Hege );
static const unsigned char Flag( Hoge );
```
マクロでユニークなビット定数のフラグを生成できます。
これだと定義を追うのが大変という問題が残ります...それに2回ずつHageなきゃいけない...
`static const unsigned char` をマクロに含めてやるとスッキリしそうですな。

``` C++
#define	CreateFlag(x)	static const unsigned char flag_##x = 1 << x
enum
{
	Hage = 0,
	Hige,
	Huge,
	Hege,
	Hoge
};
CreateFlag( Hage );
CreateFlag( Hige );
CreateFlag( Huge );
CreateFlag( Hege );
CreateFlag( Hoge );
```
なんとか1回で済ませる術はないものか。
Git Bashを任意のディレクトリで開く方法

##Git Bashを任意のディレクトリで開く方法
普段はVS codeやPhpStormを使ってるので、
コマンドラインツールのデフォルトディレクトリを気にせず使ってるんですが、
Git Bashやコマンドプロンプトで操作しないといけないときは、
作業ディレクトリまで階層を移動しないといけませんよね。

職場がwindows環境なのでGit Bashをまれに使用するのですが、
毎回ディレクトリを移動するのが面倒だと感じていました。
しかし、
######簡単に任意のディレクトリで開く方法を発見しました！！
ので記しておきます。

アホみたいに簡単な方法です。
知ってる人はとっくにご存知でしょう。
何をいまさらと、、わざわざ載せることちゃうやろ、、と思われるでしょう。

ただ僕は今初めてしりました。そして思いのほか嬉しかった笑

コマンドラインツールを使いなれてない僕みたいな人の
せめてもの助けになれれば嬉しいです。

**環境はwindows10です。**

##「右クリック」→「Git Bash Here」
![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256945/98e4d7f7-921d-1cc6-bcc5-afaf7af7280c.png)


デフォルトディレクトリとして開きたい場所で
**「右クリック」→「Git Bash Here」**

以上です。
新人プログラマがスピードタイプを目指した方がいい5つの理由

# はじめに

**この記事は持論ですので絶対ではありません。絶対なんて絶対にないじゃないですか。**
 
春ですね。 
新人エンジニアの皆さん、プログラミングしてますかー？ 
時が経つのは早いもので僕はもうプログラミング歴10年、実務経験6年と中堅クラスの仲間入りしています。
どこにいっても戦力になれないと無能の烙印を押されそうな経験年数になってきました。^q^

一言言わせてくれ、
**<font color="red">新米エンジニアはまずスピードタイプを目指せ！**
超スピード...

今回は新人エンジニアさん方にはスピードタイプを目指して欲しい自分なりの理由を何点か挙げてみたいと思います。 

# そもそもタイプって
僕の中ではプログラマは大きくわけて

- スピードタイプ 
- クオリティタイプ 

の2種類どちからに属しています。
自分がどっちか答えられない？
自分の強みくらい持ってた方がいいと思うよ。
(プログラマに限った話ではないと思うけど)

っていうかタイプ分けとかした方が面白いやん。
ポケモンだってタイプなかったらつまらんやろ。
 
## スピードタイプとは
コーディングが早い人のことです。 

多分口癖は「一瞬です」、「余裕です」

## クオリティタイプとは
バグが少ない人のことです。 
また、エラーハンドリングが適切など保守の仕事を軽減させられる人です。
（※クオリティの指標論争はここでは起こさないように）

多分口癖は「完璧です」、「間違いないです」
 
## 日本で多いのは？
前の会社、今の会社の同僚と話したり、
ビジネスパートナーの面談をした感じだと
**1:9**くらいで**クオリティタイプの方が多い**です。
そうじゃない？
(Web系とかスタートアップは知らん) 
 
# スピードタイプを目指した方がいい理由
新人こそスピードタイプを目指した方がいいと思うんですよ僕は。
スピードは若い時しか身につけれられないってスポーツ界隈でよく聞きますしね。

## ハードルが下がる
まず、スピードが早いことでクライアントのハードルが下がります。
個人的にこれが一番大きいと思います。
10人日の作業を5人日で上げてきたら多少バグがあっても許せませんか？
（ただし最低限の動作すらできないクソみたいなバグお前はダメだ）
 
## まわりと差をつけることができる
そもそもスピードというのはまわりとの比なので、他の人より確実に評価されるようになります。
モチベが上がり、幸せスパイラルがおきます。

## 本質的要求を早い段階で盛り込める 
早いうちにプロトタイプ的な気持ちでさっとクライアントに機能を見せることができます。
納期ギリギリまでクオリティを高めたクライアントの意思に沿っていないものを納品しても意味ないでしょう。

## 指標を立てやすい
そもそも**バグがないということを確定することは不可能ですし、バグはありまあす！**
「バグ0」より、「見積もりの半分で納品」の方が明確ではないでしょうか？
 
## ナウい開発モデルとマッチする
アジャイルやらスクラムやらナウい開発モデルとマッチするんじゃないですかね？
詳しくないので深く突っ込みませんが
 
# スピードタイプになるには
目指したくなってきたよね？

## 他人を意識する
スピードは相対評価です。
チーム内で一番を目指しましょう。
大抵の大きな会社は同僚がみんなダレているのですぐ一番になれます。
過去にアサインしたプロジェクトで、社会人2年目の僕と他のおっさん7人のバグfix数が同じだった時は一気に成り上がりました。
 
## コーディングに入る前に工数を見積る 
自分の成長を把握しておくことは重要です。
気づいたら井の中の蛙になっていたなんてことはあってはなりません。
難しく考えなくていいのです。
見積もりは自分なり物のでいい、自分で見るだけなんだから。 みつを
 
## コピペの達人になる
実際これが一番の近道です。
しかし、ネットにあったものを内容も理解しないで貼り付けるのはダメです。
いけないいけないこれだけはやってはいけない。ダレもわからないコードが出来上がってしまう。
 
## Google力を磨く 
文法なんて無駄に覚えなくていいんです。
検索すればいいんですから。
なんというキーワードで検索するかで目的までたどり着く時間には雲泥の差がでます。
そういったキラーワードを頭にパッと出せる人は有能です。

というかエンジニアに一番重要なのはGoogle力です。他言はないよね？

# 最後に
色々並べましたが、結局自分に合ったタイプになるのが1番ですよ。 （え？）
また、現場の方針に沿うのが一番評価を得られるのは間違いありません。 
 
納期までにクオリティの高いものを納品できる人は間違いなくプロです。 
しかしそこに行き着くのは至難の業ではないでしょうか？ 
まずは納期の6割くらいの時間で7割のクオリティのものを作り、テストレビュー修正をガンガン回せばいつか両刀になれるでしょう。

先輩エンジニアたちの共感、 苦言待ってるぜ！！
っていうかクオリティタイプのアンサー記事待ってるぜ！！

ブログで見たい方はこちら
http://nabesys.com/article/2019/04/25671/