OmniAICreator/Qiita-1.07M huggingface dataset:
カラムデータの順序をviewで切り替える（昇順・降順）

それでは、今回はカラムデータを昇順・降順で並び替える機能を実装します。

#まずは、カラムデータの用意をします
今回は、"rails console"からデータを投入します。
Textsテーブルを作成済みです。

```Ruby:terminal
$ rails c
Running via Spring preloader in process 8195
Loading development environment (Rails 5.2.2.1)
irb(main):001:0> text = Text.new(genre:"△△△",title:"xxxxxx")
=> #<Text id: nil, title: "xxxxxx", contents: nil, genre: "△△△", created_at: nil, updated_at: nil>
irb(main):002:0> text.save!
   (0.2ms)  begin transaction
  Text Create (1.9ms)  INSERT INTO "texts" ("title", "genre", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["title", "xxxxxx"], ["genre", "△△△"], ["created_at", "2019-04-15 14:24:55.534682"], ["updated_at", "2019-04-15 14:24:55.534682"]]
   (1.6ms)  commit transaction
=> true
```

ちなみに、少しボケていたんですが、"rails c"にてデータを入れるときは、きちんと"save!"しましょう。
saveした時点でidも追加されます。

なぜか、データが反映されないな、と少し悩んでしまいました。



#viewでテーブルを作ります！
今回はBootstrapを利用します。

```Ruby:index.html.erb
<table class="table table-striped m-auto">
  <thead class="thead-color">
    <tr>
      <th scope="col">
        <%= link_to 'スキル', texts_path(id: @sort)  %>
      </th>
      <th scope="col">
        ジャンル
      </th>
      <th scope="col">
        内容
      </th>
    </tr>
  </thead>
  <tbody>
    <% @texts.each do |text| %>
      <tr>
        <th scope="row">
          <%= "Lv.#{text.id}" %>
        </th>
        <td>
          <%= text.genre %>
        </td>
        <td>
          <%= text.title %>
        </td>
      </tr>
    <% end %>
  </tbody>
</table>
```

- table-striped：テーブルレコードをストライプ状に色分けする
- m-auto："margin: 0 auto;"と同じ意味。



#モデルにscopeを実装
これは以前の記事に記載しましたので、説明は割愛します。

```php:text.rb
class Text < ApplicationRecord
    scope :asc_sort, ->{ order(id: :asc)}
    scope :desc_sort, ->{ order(id: :desc)}
end
```


#コントローラに実装
if文を使い、降順と昇順を切り替えます。

以下がコントローラ部分です。

```Ruby:texts_controller.rb
class TextsController < ApplicationController

    def index

        if request.fullpath.include?('desc')
            @texts = Text.all.desc_sort
            @sort = "asc"
        else
            @texts = Text.all.asc_sort
            @sort = "desc"
        end

    end

end
```
流れとしては、

1. 一旦、ルーティングroot:toでtexts#indexに飛ぶように設定
2. localhost:3000にアクセスし、indexビューへ飛ぶ（＠sortに"desc"代入される）
3. indexのlink_toのパスをtexts#index（texts_path)に設定し、クリックで再びindexコントローラ(if文）を経由させる
5. その際にpathの引数をid: @sortなどとしておく
4. indexコントローラにてカラムデータが降順になった後、＠sortに"asc"が代入される
5. 以下、繰り返し

ちなみに、

```Ruby
request.fullpath.include?('desc')
```

は、pathに'desc'という文字列を含んでいるかどうかを判定します。
実装されましたら、URLがどのように変化するのかを見てみると、よくわかります。
bazelでGoのldflagsを使う

# tldr
サンプルは[こちら](https://github.com/kentakozuka/go-ldflags/)

# 解説
bazelでldflagsを使うには2通りあります。
- `BUILD.bazel`にベタ書きする
- `bazel`コマンド実行時に`--workspace_status_command`に渡す

## ベタ書きする方法
簡単な方法。`BUILD.bazel`のルールに`x_defs`属性を追加します。
例）

こんなコードがあったら

``` go
package version

var Version = "redacted"
```

こんな感じで埋め込みます

``` python
go_binary(
    name = "cmd",
    srcs = ["main.go"],
    deps = ["//version:go_default_library"],
    x_defs = {"example.com/repo/version.Version": "0.9"}, # here!
)
```

## bazelコマンド実行時に--workspace_status_commandに渡す方法

上記と同じコードがあった場合、
埋め込みたい情報を変数として波括弧で囲んで書いておきます。

``` python
go_binary(
    name = "cmd",
    srcs = ["main.go"],
    deps = ["//version:go_default_library"],
    x_defs = {"example.com/repo/version.Version": "{STABLE_GIT_COMMIT}"}, # here!
)
```

bazelに渡す情報を導出するスクリプトを書いておきます。


``` sh
#!/bin/bash

echo STABLE_GIT_COMMIT $(git rev-parse HEAD) // STABLE_GIT_COMMIT hogehoge みたいになります。複数渡したいときは複数行書く
```

あとは`bazel`コマンド実行時に`--workspace_status_command`フラグにスクリプトのパスを渡せばOKです！
下記のドキュメントでは相対パスが書かれてますが、私の環境では絶対パスでないとダメでした。要調査。

``` sh
bazel build --workspace_status_command=${PWD}/status.sh //:cmd
```

# 参考にしたもの
[rules_go: Defines and stamping](https://github.com/bazelbuild/rules_go/blob/master/go/core.rst#defines-and-stamping)
AWS SESでバウンスメールをハンドリングしてみた

# はじめに
AWS-SESって使ってますか？
簡単にメール送信サービスを作成することはできるが、
やれ東京リージョンにはないわ、サンドボックスになってるわと中々にめんどくさい子です。
特にバウンスメール（送信失敗）や迷惑メール扱いされることをAWSは嫌っており、
下手にバウンスメールを大量に送信してしまうと、最悪AWS使用停止すらありえます。
そうならないように、きちんとハンドリングする必要があるわけです。

# 今回やること
SESのバウンスをハンドリングして、Lambdaまでデータを送ります。
そこまでやっちゃえば、あとはLambdaでよしなにできますからね。
図にすると、こんな感じです。
![SES.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148269/e2de196d-2597-d73d-948c-256e37483e29.jpeg)

図にするとスゴク＝シンプル！

# Lambdaの設定
送信される順番の逆側から設定する必要があるので、まずはLambdaを作成します。
といっても、普通に作るだけなんで詳細は省略します。
今回はハンドリングするだけなので、コードも以下の通りです（Python3.7で作成）

```python
import json

def lambda_handler(event, context):
    print(event)
    print(context)
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
```

はい、初期のHello from Lambdaにeventとcontextを出力するようにしただけです。

# SNSの設定
SESを作成予定のリージョンと同じリージョンを選択し、新規にトピックを作成します。
<img width="1392" alt="ses-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148269/dbd2da26-f747-7299-7453-3b101bb51acd.png">
名前を任意に入力して作成します
<img width="1011" alt="ses-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148269/84e09955-557a-4b1d-00c7-b97fbf952619.png">
作成されたSNSトピックを選択しサブスクリクションを作成します。
![ses-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148269/97c8555f-711a-ae13-e8bf-728142b00155.png)
プロトコルでLambdaを選択し、作成したLambdaをエンドポイントに設定します。あとはデフォルトで問題ありません。
![ses-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148269/1d3b8c26-a520-cb06-b909-f0bc10b11bb4.png)
以上です。簡単ですね！

# SESの設定
SNSを作成したリージョンと同じリージョンで、新規にSESを作成します。
画像にある「Verify a New Email Address」選択するとメールアドレスを入力するポップアップが表示されます。
SESで送信したいメールアドレスを入力してください。確認メールが届くのでメール本文にあるURLをクリックすることで使用できるようになります。
![ses-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148269/f62da0d0-db9b-c646-722a-60436a435ffe.png)
作成されたSESトピックを選択し、Notificationsの「Edit Configuratiuon」を選択します。
![ses-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148269/9a95464c-7dce-648e-0d4b-64827055dbe4.png)
すると下のような図が表示されます。
Bouncesを選択すると、作成したSNSを選択できるはずなので選択肢て保存します。
<img width="798" alt="ses-7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148269/ccf4f5a3-9216-06fa-8926-97c33fa76f39.png">
設定は以上です。

# 実際にやってみた
「Send a Test Email」から「bounce@simulator.amazonses.com」を送信するとバウンスメールのテストができます。
CloudWatchから、作成したLambdaのログを確認して、上記のメールアドレスをハンドリングできたら処理は正常です。
あとはLambdaでよしなに処理していただければと。

# おわりに
やってみるとすこぶる簡単なんですが（ポチポチするだけでできちゃうし）、
あまりしっかり解説されてなかったので、今回記事にしてみました。
AWSに怒られないように楽しいAWS-SESライフをすごしましょう。
【Vim】必要な時だけカーソル行をハイライトする

Vim には `'cursorline'` という機能があります。これは名前の通り、カーソルのある行を強調し、目立たせてくれるものです。

* [options - Vim日本語ドキュメント](https://vim-jp.org/vimdoc-ja/options.html#'cursorline')

便利な機能なのですが、常時有効にしていると以下のような問題がありました。

* 有効のまま画面をスクロールすると動作が重い。
* （カラースキームによっては）文字が背景と同化して見づらい。

そもそもこれはカーソルの位置を見失わないようにするための機能ですから、必要な時だけ有効になってくれると便利です。具体的には、以下のように切り替わって欲しいです。

* カーソルを動かすと**無効**にする。
* ウィンドウを開いたり、移動したりした時に**有効**にする。
* しばらくカーソルが止まっている時も**有効**にする。

----

……と、ここまでは以下のエントリーに書いてあることの要約です。

* ['cursorline' を必要な時にだけ有効にする - 永遠に未完成](https://thinca.hatenablog.com/entry/20090530/1243615055)

エントリー内のスクリプトでまさにこれが実現できるのですが、後述の理由により一つのプラグインとしてまとめました。

* [delphinus/vim-auto-cursorline: Show / hide cursorline automatically](https://github.com/delphinus/vim-auto-cursorline)  
  ![demo](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8880/272a5f40-7df4-942d-8e43-e1e1c1328fa1.gif)

インストール方法などは README を読んでみてください。以下は、どうしてこのプラグインを作ったのかについて書いています。

## `CursorHold` イベントの功罪

従来の Vim では、他の言語にはよくある「タイマー機能」というものがありませんでした。例えば JavaScript の `setTimeout()` のような、「一定時間が経ったら〇〇を実行する」ということができなかったのです。

その不便をある程度解消するために使われていたのが `CursorHold` イベントです。

* [autocmd - Vim日本語ドキュメント](https://vim-jp.org/vimdoc-ja/autocmd.html#CursorHold)

これはカーソルを移動させた後、`'updatetime'` に指定した時間が過ぎた時に発動するイベントです。おそらくユーザーはカーソルを留めて何か考え中のはずですから、多少重たい動作をさせても構わないだろう、というわけです。このため、なるべくユーザーの操作をブロックしたくないプラグインは、みんなこの `CursorHold` イベントで関数を呼び出していました。

ただこの `'updatetime'` の値は、Vim 全体で一つしか設定できません。例えば [vim-gitgutter][] のようなプラグインではこの値を小さく（100ms）設定することが[推奨されています][updatetime]。

[vim-gitgutter]: https://github.com/airblade/vim-gitgutter
[updatetime]: https://github.com/airblade/vim-gitgutter/blob/afa4f2ddf0fecb37914ec37357636abb18013422/doc/gitgutter.txt#L229-L231

しかし今回の要件のためには 100ms という時間は短すぎます。上述の thinca 氏のエントリー内のスクリプトでは `CursorHold` を使っているのですが、vim-gitgutter のために、頻繁に cursorline が on/off されるのが悩みのタネでした。

## `CursorHold` の代わりにタイマー機能を使う

Vim8.0 ではまさにこのために、タイマー機能が実装されました。

* [vim-jp » Vim 8.0 新機能解説](https://vim-jp.org/blog/2016/09/13/vim8.0-features.html)

使い方は簡単で、`timer_start()` の引数に時間と関数を指定するだけです。

```vim
function! EchoHoge(timer_id) abort
  echo 'hoge'
endfunction

" 1秒後に hoge と表示する
let timer_id = timer_start(1000, 'EchoHoge')
" 関数リファレンスも使える
let timer_id = timer_start(1000, function('EchoHoge'))
" Lambda も OK
let timer_id = timer_start(1000, {-> execute('echo "hoge"', '')})
```

今回はこれを使って、以下のような処理を実装しています。

```vim
autocmd CursorMoved,CursorMovedI * call s:cursor_moved()

function! s:cursor_moved() abort
  " cursorline を消す
  setlocal nocursorline
  " すでに起動しているタイマーを止める
  call timer_stop(s:timer_id)
  " 新しいタイマーを起動
  let s:timer_id = timer_start(1000, function('s:enable_cursorline'))
endfunction

function! s:enable_cursorline(timer_id) abort
  setlocal cursorline
endfunction
```

基本的にはこれだけです。ただ、このままだとカーソルを動かすたびに `setlocal nocursorline` していて無駄ですし、他にもいろんなエッジケースがあったのでもう少し複雑なことをやっています。詳しくはソースを読んでみてください。

## まとめ

これからは `CursorHold` じゃなくてタイマー機能を使おうぜ！という話でした。
クリップボードのデータを入力フォームに投入するブックマークレット

# やりたいこと
SpreadSheetなどに書いたデータをコピーして入力フォームに流し込みたい。

# 流し込みたい対象の入力フォーム

```html
<html lang="ja">
<head>
<meta charset="utf-8">
<title>clipboard test</title>
</head>
<body>
<form action="">
  <div>番号<input name="no"></div>
  <div>氏名<input name="name"></div>
  <div>よみ<input name="yomi"></div>
  <div>誕生日<input name="birthday"></div>
</form>
</body>
</html>
```

# コピー元データ

![入力データ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75498/f1d480bd-8a4d-468f-31c2-0a1fb3660d2b.png)


# ブックマークレット

```javascript
javascript:(function(){
  navigator.clipboard.readText().then(
    clipText => {
      var cols = clipText.split("\t");
      document.querySelector("input[name='no']").value = cols[0];
      document.querySelector("input[name='name']").value = cols[1] + cols[2];
      document.querySelector("input[name='yomi']").value = cols[3] + cols[4];
      document.querySelector("input[name='birthday']").value = cols[5];
    }
  );
})()
```

上記を改行を消して1行にしてブックマークに保存します。

```javascript
javascript:(function(){navigator.clipboard.readText().then(clipText => {var cols = clipText.split("\t");document.querySelector("input[name='no']").value = cols[0];document.querySelector("input[name='name']").value = cols[1] + cols[2];document.querySelector("input[name='yomi']").value = cols[3] + cols[4];document.querySelector("input[name='birthday']").value = cols[5]})})()
```

`navigator.clipboard.readText()`はクリップボードへのアクセス許可が必要なので、Chromeの場合はアドレスバーの左の鍵マークを押して『サイトの設定』を開き、権限のところにある『クリップボード』を『許可』にします。(httpsじゃないと許可にできません)

コピー元データをコピーして(クリップボードにある状態にして)、保存したブックマークのボタンを押したら入力フォームにデータが入ります。

参考：[MDN web docs - Navigator​.clipboard](https://developer.mozilla.org/ja/docs/Web/API/Navigator/clipboard)
An example of #markdown #HTML conversion from standard input / output using #ruker gem's redcarpet / reverse_markdown with #docker

<h1> Dockerfile </h1><pre> <code>FROM ruby RUN gem install reverse_markdown redcarpet</code> </pre><h1> EXE </h1><pre> <code>docker build . -t ruby-gems</code> </pre><pre> <code>$ echo &#39;&lt;h1&gt;hey&lt;/h1&gt;&#39; | docker run -i ruby-gems reverse_markdown # hey $ echo &quot;abc&quot; | docker run -i ruby-gems redcarpet &lt;p&gt;abc&lt;/p&gt;</code> </pre><p> # Maybe badcase </p><pre> <code>$ docker run ruby-gems /bin/bash -c &quot;echo &#39;&lt;h1&gt;head&lt;/h1&gt;&#39; | reverse_markdown&quot; # head $ docker run ruby-gems /bin/bash -c &quot;echo &#39;# h1&#39; | redcarpet&quot; &lt;h1&gt;h1&lt;/h1&gt;</code> </pre><h1> ref </h1><p> <a href="https://docs.docker.com/engine/reference/run/">| Docker Documentation</a> </p>

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1319








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
I want to do something like binding.pry for #ruby with #python (follow the loop with IPython InteractiveShellEmbed)

<ul><li> <code>continue</code> does not work </li><li> <code>next</code> is something different </li><li> Let&#39;s go next with <code>exit</code> # script <code>py #!/usr/bin/env python3 from IPython.terminal.embed import InteractiveShellEmbed for i in range(5): ipshell = InteractiveShellEmbed() ipshell()</code> 2 (default, Jan 13 2019, 12: 50: 01) Type &#39;copyright&#39;, &#39;credits&#39; or &#39;license&#39; for more information IPython 7.4.0-An enhanced Interactive Python. Type &#39;?&#39; For help. In [1 ]: i Out [1]: 0 In [2]: i Out [2]: 0 In [3]: continue File &quot;&lt;ipython-input-3-6ca52a340915&gt;&quot;, line 4 SyntaxError: &#39;continue&#39; not properly in loop </li></ul><p> In [4]: break File &quot;&lt;ipython-input-4-6aaf1f276005&gt;&quot;, line 4 SyntaxError: &#39;break&#39; outside loop </p><p> In [5]: next Out [5]: &lt;function next&gt; In [6]: i Out [6]: 0 In [7]: i Out [7]: 0 In [8]: exit Python 3.7.2 ( default, Jan 13 2019, 12: 50: 01) Type &#39;copyright&#39;, &#39;credits&#39; or &#39;license&#39; for more information IPython 7.4.0-An enhanced Interactive Python. Type &#39;?&#39; for help. In [1]: i Out [1]: 1 In [2]: exit Python 3.7.2 (default, Jan 13 2019, 12:50:01) Type &#39;copyright&#39;, &#39;credits&#39; or &#39;license&#39; for more information IPython 7.4.0- In [1]: i Out [1]: 2 In [2]: exit Python 3.7.2 (default, Jan 13 2019, 12: 50: 01) Type &#39;-An enhanced Interactive Python. copyright &#39;,&#39; credits&#39; or &#39;license&#39; for more information IPython 7.4.0-An enhanced Interactive Python. Type &#39;?&#39; for help. In [1]: i Out [1]: 3 In [2]: `` ` </p><h1> ref </h1><p> <a href="https://qiita.com/taise/items/063829ac89bf1def36d0">Launch an interactive shell while running Python-Qiita</a> </p>

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1318








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Cordaの技術的優位性

#Cordaとは？
ここではCordaの基本的な特徴について説明し、Cordaというブロックチェーン技術に興味を持ってもらうきっかけになればと考えている。
Cordaは他ブロックチェーンが抱えている欠点を克服したエンタープライズグレードの技術でありビジネスにおいて次の３つを実現する。

◉安全かつ実証された“金融サービスレベル”の基盤提供
◉ビジネスコンソーシアム全体でのTCO（Total Cost of Ownership）
低減
◉業務プロセスの効率性および透明性の向上

Cordaの主な特徴は「プライバシー」「インターオペラビリティー」「スケーラビティー」「プロダクティビティー」の４点だ。

#プライバシー
プライバシーとはつまり取引を「知る必要のある範囲内で」で共有するというものだ。パブリック・ブロックチェーンのように取引をネットワークの参加者全員と共有する仕組みは採用していない。これはエンタープライズでの利用を想定した際の必須の条件である。

#インターオペラビリティー
インターオペラビリティーとは、対改ざん性や二重支払い防止といった効果を個々のビジネスネットワークを超えて有効に働かせるものである。一つのビジネスネットワークから別のビジネスネットワークにデータを移転した時、なぜ対改ざん性と二重支払い防止（二重契約執行の防止）が保証されるのか。これはトランザクションごとにチェーンを持つCorda独自の構造と、「ノータリーノード」と呼ばれる仕組みによる。対改ざん性はBitcoinと同じトランザクションモデルであるUTXOモデルによりを実現している。また二重支払い防止はノータリーノードと呼ばれる仕組みにより実現している。ノータリーノードでは、過去に一度使用されたインプットデータのハッシュ値を一覧で保存しており、取引の当事者は都度インプットデータをノータリーに問い合わせることによって過去に使用されていないかを確認できるわけだ。（ノータリーノードはクラスター化されており、保有データはハッシュ値化されているのでプライバシーの問題もない。）

#スケーラビリティー
次にスケーラビリティーだ。CordaはBitcoinと同じUTXOモデルを採用しているが、トランザクションをブロックにまとめる作業はせず、トランザクションが発生するごとにノータリーノードを通じて「ファイナリティー」を与える。つまりBitcoinのようにブロック生成を待つ必要がなく、トランザクションごとに処理を並行して走らせることが可能なのだ。

#プロダクティビティー
最後にプロダクティビティーだが、これは開発生産性のことである。CordaはKotlinという言語でコーディングされている。KotlinはJVM上で動作するJavaをさらにシンプルかつ安全にしたプログラミング言語である。そのため開発者の確保・教育が容易である。
#python で #ruby の binding.pry みたいなことがやりたい ( IPython InteractiveShellEmbed で loop を次に進む )

- `continue` が効かない
- `next` はなんか違う
- `exit` で次に行けそう

# script

```py
#!/usr/bin/env python3
from IPython.terminal.embed import InteractiveShellEmbed
for i in range(5):
  ipshell = InteractiveShellEmbed()
  ipshell()
```

# exe

```
Python 3.7.2 (default, Jan 13 2019, 12:50:01)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.4.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: i
Out[1]: 0
In [2]: i
Out[2]: 0
In [3]: continue
  File "&lt;ipython-input-3-6ca52a340915&gt;", line 4
SyntaxError: 'continue' not properly in loop

In [4]: break
  File "&lt;ipython-input-4-6aaf1f276005&gt;", line 4
SyntaxError: 'break' outside loop

In [5]: next
Out[5]: &lt;function next&gt;
In [6]: i
Out[6]: 0
In [7]: i
Out[7]: 0
In [8]: exit
Python 3.7.2 (default, Jan 13 2019, 12:50:01)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.4.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: i
Out[1]: 1
In [2]: exit
Python 3.7.2 (default, Jan 13 2019, 12:50:01)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.4.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: i
Out[1]: 2
In [2]: exit
Python 3.7.2 (default, Jan 13 2019, 12:50:01)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.4.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: i
Out[1]: 3
In [2]:
```
# ref
[Pythonの実行中にインタラクティブシェルを起動する - Qiita](https://qiita.com/taise/items/063829ac89bf1def36d0)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1315








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Oracle12c NOARCHIVELOGモードのDBを全体バックアップより復元 1

## 目標 ##

NOARCHIVEモードで運用しているデータベースがあります。事故で電源が落ちてしまい、データファイルを格納しているハードディスクが壊れました。
別の場所のリモートストレージで、全体のバックアップがあります。
既存のバックアップ計画は条件に示しています。
サーバー構成およびDBソフトインストールが完了前提で、DBをリカバリしようとしています。

## 条件 ##

1. 既定のバックアップ計画

   毎日DBの全体バックアップを取ります。

   ~~~sql
   rman TARGET /
   (略)
   RMAN> SHUTDOWN TRANSACTIONAL;
   (略)
   RMAN> STARTUP MOUNT;
   (略)
   RMAN> BACKUP DATABASE;
   (略)
   backupが完了しました。(略)

   ※無関係の出力情報は「(略)」で表記
   ~~~

## 検証環境構成 ##

[oracle_12c_検証環境](https://qiita.com/linxuesong/items/7adb08bb0bfa28e8fb0e)

~~~bash
# oracleユーザ
export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1
export PATH=$ORACLE_HOME/bin:$PATH
export ORACLE_SID=orcl
# データベース起動
rman TARGET /
RMAN> startup mount
# バックアップ実施
RMAN> backup database;
# データベースファイル削除(データファイル,制御ファイル,オンラインREDOログ・ファイル)
rm -r /u01/app/oracle/oradata/ORCL
# エラー状態確認
sqlplus / as sysdba
SQL> select * from dba_objects; # ORA-01116,ORA-01110,ORA-27041 データファイル見つかりません。
SQL> select * from v$parameter; # 正常
SQL> shutdown abort
SQL> exit
~~~

## 現状 ##

データベースファイルのデータファイル,制御ファイル,オンラインREDOログ・ファイルがすべて無くしたので、データベースをOpenできません。
SPFILEが残るため、NOMOUNTでインスタンスの起動は可能なので、Sqlplusで接続し、パラメータcontrol_filesでバックアップした制御ファイルの位置がわかります。
正常状態の制御ファイルを指定位置にコピーしてから、RMANでリスドア・リカバリして復元できます。

## リカバリ手順 ##

~~~bash
# oracleユーザ
sqlplus / as sysdba
SQL> startup nomount;
SQL> show parameter control_files
(略)
# /u01/app/oracle/oradata/ORCL/controlfile/o1_mf_gc0cx9od_.ctl
# /u01/app/oracle/fast_recovery_area/orcl/ORCL/controlfile/o1_mf_gc0cx9qw_.ctl
SQL> exit
# 制御ファイルをコピー
mkdir /u01/app/oracle/fast_recovery_area/orcl/ORCL
mkdir /u01/app/oracle/fast_recovery_area/orcl/ORCL/controlfile
cp /u01/app/oracle/fast_recovery_area/orcl/ORCL/controlfile/o1_mf_gc0cx9qw_.ctl /u01/app/oracle/oradata/ORCL/controlfile/o1_mf_gc0cx9od_.ctl

rman TARGET /
RMAN> startup nomount
RMAN> alter database mount;
RMAN> restore database;
RMAN> select * from v$database;
RMAN> recover database;
RMAN> alter database open resetlogs;
RMAN> exit

sqlplus / as sysdba
SQL> select * from dba_objects;
(略)
SQL> exit
~~~

## 補足 ##

制御ファイルがない場合、alter database mountの時にORA-00205が発生します。詳細情報は/u01/app/oracle/diag/rdbms/orcl/orcl/alert/log.xmlにあります。
Serverlessについて思いを馳せる一夜 - cndjp第11回 レポート

#cndjpのserverless初心者向けミートアップ参加レポート

- 運営メンバーや登壇者の方々、会場提供していただいている企業さんのお陰で勉強させていただきました。今回の大きな収穫は、クラウドでのサーバーレス実行環境や開発ツールが各社から展開されていることを知れたことです（Lambdaだけじゃない）。
- 何か貢献できるように努力していきたいものと思い、今回はちょっとだけですが片付けを手伝わせていただきました。
- 受付のぬいぐるみ達に癒されました。キリンさん（Phippy）かわいいですね:grinning:
![20190417_cndjp#11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280358/a758f121-ebd1-e36d-7393-6caeee770220.jpeg)

1.[AWS Lambdaを中心にした今からでも十分簡単に活用できるサーバーレス・ユースケース](https://app.box.com/s/19j6k8z837l4fn5jic602iw7uc82gly9)
- セッションの中で「おっ！！」と感じたのは**「中身が透けて見える位の技術力を身につける」**と言われてたことですね。クラウドベンダ側には物理的な機器が必ず存在しているので、その見えない技術要素が分かるエンジニアに価値があると思いました。
サーバレスだけではないと思うのですが、クラウドは何でそうなっているのか見えない技術要素があるので、気になったことは質問したり、調べたり、その結果のアウトプットを継続していきたいですね。
- システムの可視性、CI/CD、運用、が劇的にエンタープライズなシステムと違うな...進んでるな...

2.[結局のところKnativeって何者なの？](https://speakerdeck.com/jacopen/jie-ju-falsetokoroknativetutehe-zhe)
クラウドの本質や有効活用について考える良い資料です！:grinning:
**μs、msの世界で「人間が介在すること自体がボトルネック」**

3.[Firebase/Firestoreから覗くmobile backendのサーバレス](https://speakerdeck.com/nnao45/firebase-firestore-find-mbaas)
Firebaseを使ったモバイルアプリのデモがあったのでイメージが掴めました。また、エンドユーザが約立つスマホアプリのアイデア考えてみよう。

4.FaaS開発フレームワーク『Fn Project』の話
Fn project ・・・Faasのフレームワーク、OracleのOSS。

5.[雲の世界の共通語 CloudEvents って何？](https://speakerdeck.com/ytaka23/cloud-native-developers-jp-11th)
**サーバレスの共通仕様がないのでベンダロックインには注意**した方が良いとのことです。クラウドサービスを使う上で注意が必要で、特定のクラウドベンダにはロックインされたくないです。

6.[Firestoreを使って純広告配信機能を作った話](https://speakerdeck.com/mahiguch/firestorewoshi-tutechun-guang-gao-pei-xin-ji-neng-wozuo-tutahua)
serverless=lambdaのレベルなのでGoodleのFirestoreによるユースケースは聴けてよかったお話でした。プログラムできればインフラ構築しなくてもアプリケーション開発できるんですね。
採用フォームクラス名参考リスト

* Google for jobsにも合わせているため、表記のゆれがあります
* autocomplete用に作成
https://developer.mozilla.org/ja/docs/Web/HTML/Attributes/autocomplete
* クライアントによってニュアンスの違う言葉があるため、なるべく多めに記述しています


## 基本情報

* `age` - 年齢
* `agree` - 利用規約に同意する
* `current-password` - パスワード
* `email` - E-mail
* `email-confirm` - E-mail (確認)
* `name` - 氏名
* `name` - 担当者名
* `sex` - 性別
* `tel` - 電話番号
* `url` - サイトURL
* `username` - ID 

## 住所

* `address` - 住所勤務地 (住所)と同じ
* `addressLocality` - 住所：市区町村
* `addressRegion` - 住所：県
* `postalCode` - 住所：郵便番号
* `streetAddress` - 住所：市区町村以降（番地など）


## 会社情報

* `business` - 業務内容
 * 自由入力：contents
* `capacity` - 募集人数
 * 数：`number` 定員：`capacity`
* `employment` - 雇用形態 
 * Google for jobsでは：`employmentType`
* `jobLocation` - 勤務地 (住所)
 * フォームであれば住所と同じaddressが好ましい
* `objective` - 募集職種 
* `organization` - 法人名 
* `qualifications` - 技術・専門分野 
* `section` - 部門名 

## 勤務

* `adopted` - 着任時期・採用予定日
* `hire-date` - 勤務開始日
* `holiday` - 休日・休暇
* `hours` - 勤務時間
* `term` - 任期
* `remark` - 特記事項

## 雇用形態
- `full-time` - 正社員
- `part-time` - パート
- `contractor` - 契約社員
- `temporary` - 派遣社員
- `per-diem` - 日雇い
- `volunteer`　- ボランティア

## 給与・福利

* `allowances` - 手当福利厚生
* `salary-description` - 給与説明
 * Google for jobsでは：`baseSalary`
* `benefits` - 福利厚生・待遇
 * https://www.writing-buzz.com/trans/post-170
* `payslip` - 給与明細
 * https://eikaiwa.dmm.com/uknow/questions/38676/
* `salary` - 給与・給料 
 * https://eikaiwa.dmm.com/uknow/questions/35195/
 * Google for jobsでは：`baseSalary`
* `maxValue` - 給与最大
* `minValue` - 給与最小 
* `raise` - 昇給
* `bonus` - 賞与

## 学歴・職歴

* `education` -　学歴
* `major` - 専攻
* `degree` - 学位
* `diploma` - 終了証書
* `related-experience` - 経験
* `work-experience` - 過去の職種
* `eligible` -応募資格 
* `license` - 経歴・免許・資格
* `skill` -スキル・求める人材・資格
* `type` - 人材タイプ・求める人材 

## 自由入力

* `appeal` - アピールポイント自由入力 
* `contact` - お問い合わせ内容自由入力 
* `free` - 内容自由入力 
* `contents` - 応募方法・お問い合わせ先自由入力 
* `other` - その他自由入力
AWS Lambdaのオンラインセミナー受けてみた Part1

「[AWS Black Belt Online Seminar Let’s dive deep into AWS Lambda Part1](https://www.slideshare.net/AmazonWebServicesJapan/20190402-aws-black-belt-online-seminar-lets-dive-deep-into-aws-lambda-part1-part2)」の自分向けメモ
Lambda使ったことない......レベルの人向け



## サーバーレス概要
### アプリケーション開発者の目的はなにか
 - 価値を届けること（価値＝差別化）
 - 価値を生み出すところに集中したいが現実では……

### アプリを動かすためにはサーバーが必要だった
以下、オンプレで必要な作業

 - サーバーのセットアップ
 - スペックの管理
 - 冗長化
 - セキュリティパッチの適用
 - 差別化につながらない機能の実装
    - スロットリング
    - 認証認可の実装
 - サーバーの見積もり、購入といった手続きで時間も必要

### サーバーレスとは
差別化につながらない重労働を削減できる

 - 物理マシン：ハード、ソフトともに管理が必要
 - 仮想マシン：マシンスペックの制限内での管理が必要
 - コンテナ：サーバーの設定周りの管理は必要
 - サーバーレス：ビジネスロジックのみ管理すればよい！

#### 特徴
 - インフラの供給、管理が不要
 - シームレスに上限なくオートスケール可能
 - 実際の処理量に対する課金（価値に対する支払い）
 - メンテナンスやダウンタイムなし

#### （参考）AWSのComputeサービス
AWSでアプリを動かす場合、よく比較されるサービスがEC2とLambda
まずはLambdaで検討し、厳しい場合は自由度の高いEC2を検討していく流れがよい

 - EC2は自由度が高いが、管理の手間が多い 
 - Lambdaは自由度が低いが、管理の手間が少ない


#### サーバーレスなアプリケーションモデル
 - イベントソース
    - サービスの状態が変化する
 - ファンクション
    - 処理内容
 - サービス
    - 処理の実行先（AWSや他サービス）

Lambdaを中心に数多くのサービスと組み合わせが可能

## イベントソース
 - AWSサービスまたはアプリケーションを指定可能

## ファンクション
 - 実行されるアプリケーション
 - 隔離されたコンテナ内で実行され、1つのコンテナで複数イベント処理はしない

### Lambda関数基本設定

#### メモリ
 - メモリ容量にCPUの能力も比例する
 - マルチコアの利用可能

#### タイムアウト
 - 最大15分まで秒単位で設定可能

#### 実行ロール
 - IAMロールで制御
 - 最低限CloudWatchへのアクセス許可が必要

### Lambda関数の制限
 - サーバーのようにリクエストを待ち続けるような使い方はできない
 - 利用できるアウトバウンドはTCP/IPとUDP/IPだけ

### Lambdaの種類
3つに分類される

<TABLE>
    <TR>
        <TH COLSPAN=2>ポーリングベース</TH>
        <TH ROWSPAN=2>それ以外</TH>
    </TR>
    <TR>
        <TH>ストリームベース</TH>
        <TH>それ以外</TH>
    </TR>
    <TR>
        <TD>Kinesis、DynamoをイベントソースとしてLambda自身がポーリングする</TD>
        <TD>SQSをイベントソースとしてLambda自身がポーリングする</TD>
        <TD>他AWSサービス（S3など）をイベントソースとして他AWSサービスがLambdaを呼び出す</TD>
    </TR>
</TABLE>

#### 呼び出しタイプ
2つに分類される

 - 非同期呼出し：リクエストが正常に受け付けられたかどうかのみレスポンスする
 - 同期呼出し：レスポンス内容を実装し、Lambda実行完了時に返却される

### ライフサイクル
 - コールドスタート：1.から実行
 - ホットスタート　：1.～3.を再利用して4.を実行

 1. ENI作成
 - コンテナ作成、パッケージのロード、展開
 - ランライム起動。初期化
 - 関数実行
 - コンテナの破棄

### Lambdaの実行環境
Lambdaの実行環境は、最新バージョンのOSやSDKが使われていて、開発者が意識する必要はない
ただし以下の場合は、Lambdaの実行環境のバージョンを気にする必要がある

 - 任意のOSやSDKバージョンを利用したい
 - DBドライバーを利用する

#### 同時実行数
 - 1000で制限されているが実績に応じて制限緩和申請することが可能
 - 関数単位で任意の割合で割り振ることが可能
 - 実行数の見積もりはイベントソースの種類によって異なる
    - ポーリングベースでストリームベース：シャード数
    - ポーリングベースでそれ以外：自動スケールアップ
    - それ以外：秒間呼び出し×平均実行時間

### リトライ
Lambdaの種類と呼び出しタイプによって挙動が異なる

<TABLE>
    <TR>
        <TH COLSPAN=2>ポーリングベース</TH>
        <TH COLSPAN=2>それ以外</TH>
    </TR>
    <TR>
        <TH>ストリームベース</TH>
        <TH>それ以外</TH>
        <TH>非同期呼出し</TH>
        <TH>同期呼出し</TH>
    </TR>
    <TR>
        <TD>データの有効期限が切れるまでリトライを行う<br>リトライ時はブロックされる</TD>
        <TD>一度イベントソースに処理がもどる<br>リトライ時はブロックされない</TD>
        <TD>自動的に3回までリトライされる</TD>
        <TD>エラー内容が返却される</TD>
    </TR>
</TABLE>

#### バックグラウンドプロセスの凍結と再開
 - 再度実行されたときに再開する

## サービス
### EC2の場合
 - アクセス権限にVPCサブネットおよびセキュリティグループの指定が可能
    - AZごとに複数のサブネットを指定しておくとIPアドレス枯渇時やAZ障害時も耐えうる
 - EC2はインターネットアクセスができなくなる
 - EC2のリクエスト数でIP枯渇の可能性

Part1はここまで。
俺はブラウザでラッパーになる part 1

ある日、abema.tvを見ていて男は思った。
「ラッパーになりたい！」

# tl;dr
  * Windowsの合成音声で音素のファイルを作成。
  * `Tone.js` で任意の言葉をつなげて再生し、ラップさせる。
  * http://uniqode.qiita.s3-website-ap-northeast-1.amazonaws.com/rap/1/

# 音声ファイルの準備
  * Windows10環境では下記をPowershellプロンプトで実行し、wavファイルを生成する。
  * MacOSXな人は、 `Say` コマンドでも使ってください。

```Powershell
Add-Type -AssemblyName System.speech
$speak = New-Object System.Speech.Synthesis.SpeechSynthesizer
0x3041..0x3093 | %{ # ぁ～ん
  $s = [string][char]$_
  $speak.setOutputToWaveFile("$($s).wav")
  [void]$speak.Speak($s+"ー")
}
```

  * 通常の日本語環境なら `Microsoft Haruka Desktop` の声になっていると思います
  * 下記コマンドでインストールされている音声を確認し、設定するもよし。

```Powershell
  $speak.GetInstalledVoices() | ?{$_.VoiceInfo.Culture -eq "ja-JP"} | %{$_.VoiceInfo}
  $speak.SelectVoice("Microsoft Haruka Desktop")
```

  * 出来上がったwavファイルを [ffmpeg](https://ffmpeg.org/) でmp3とoggに変換します。

```Powershell
gci *.wav | %{$f=$_.fullname;$g=$f -replace ".wav$",".mp3"; cmd /c "C:\path\to\ffmpeg.exe -i $($f) -af silenceremove=1:0:-60dB $($g)"}
gci *.wav | %{$f=$_.fullname;$g=$f -replace ".wav$",".ogg"; cmd /c "C:\path\to\ffmpeg.exe -i $($f) -af silenceremove=1:0:-60dB $($g)"}
```

# Tone.jsでしゃべらす
  * http://uniqode.qiita.s3-website-ap-northeast-1.amazonaws.com/rap/1/
  * `push`を押すと、、 `M.C. MS Haruka a.k.a. Windows` のラップが！
  * `おれがえむしーえむえすはるかーーこのこえがきみにとどきますかーー`
  * 単純に一定のリズムで再生しているだけです。HTMLソース見てもらえば、 `Tone.js` のおかげで簡単なコードしか書いていないと分かります。
  * おまけとして、Text入力欄に `とどいたぜーそのこえがーーとどろかせーおとのれんさーー` などと入力して、`push`しなおせば、任意のラップができます(対応はひらがなのみ)！

# 反省/まとめ
  * じゃじゅじょ、などの拗音付きの音は個別に準備した方がよさそう…
  * Tone.jsのサンプラーを使えばピッチ指定も出来て、よりリアルに出来るのでは
  * part2でさらなる改善を図りたいです。改善案のコメントをください！
  * Respect to [Cylob Rewind](https://www.youtube.com/watch?v=mpQLFeGwoWc) !
Githubとりあえず使えるようになってみる編

コマンドライン恐怖症なのでSourcetreeを崇めているけどGitBashの操作に憧れるお年頃なんです。
すでにリポジトリ作成とかは済んでることが前提になります。

## 目標の流れ

1. 新しいブランチをチェックアウト
2. ステージに追加
2. コミット
3. プッシュ
4. 元のブランチをチェックアウト
5. Github上でブランチをマージさせる
5. 作ったブランチを削除
6. 元のブランチでプル

## ブランチを作る

```
git checkout -b "作りたいブランチ名"
```

## ステージに追加
Sousetreeで言うとIndexにステージしたファイルリストに載せる作業。

### ステージに追加する

```
git add .
git add "ファイル名"
```

### ステージを取り消す
≠変更の取り消し

```
git reset
git reset "ファイル名"
```

### ステージを確認

```
git status
```

### 差分を見る

```
git diff --chached "ファイル名"
```

### 変更を破棄する

```
git checkout HEAD "ファイル名"
```

## コミット

``` 
git commit -m コミットログ1行目
```
-m はコミットログつけるためのオプション。 
-m テキスト１ -m テキスト２　とかやると複数行できる。
git commit だけだとvimが起動する。
vimは```i```の後にメッセージ入力して、```:wq```で保存する。（よくわかってない）


## プッシュ

1回目はリモートにローカルのブランチ名のブランチを新規作成＆追従する必要があるので、-u 以降が必要。

```
git push -u origin "branch名"
```

2回目以降は```git push```だけでOK。

## 元ブランチをチェックアウト

```
git checkout "branch名"
```

```git branch```でローカルブランチの一覧が出るのでブランチ名確認はそこで。
ちなみに```git branch -a```だとリモート含めたブランチ名が出る。

## ブランチの削除

```
git branch -d "branch名"
```

ブランチにコミットされてない内容が残っているとエラーになる。
```-D```使えば強制的に削除できる。

## 元のブランチでプル

```
git pull
```
[RuntimeError at / Refile.secret_key was not set.]というエラーにハマった話

#RuntimeError at / Refile.secret_key was not set.
refileを利用して画像を扱えるようにしようと思っていた
画像の格納を済ませ、表示をしようとすると上記のエラーが発生した。
なーんか見たことあるなぁなんだろうなぁ、と思いながら２分ほどハマった。
自分と同じような人たちがいるかも知れないと思い、記事を投稿します。
（自分用のメモでもある。）

##利用環境
Ruby 2.6.2　Rails 5.2.3

##とりあえずなんのエラーなのか考えてみることにした
refileのsecret_keyが登録されていないということは以下のエラーの文章から理解した。
Refile.secret_key ~とやらを設定しなくてはいけないようだ。
secret_keyはエラー画面に表示されている物をコピーして記述すれば良い。

```
RuntimeError at / Refile.secret_key was not set.

Please add the following to your Refile configuration and restart your application:

Refile.secret_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
```

##解消方法
secret_keyを書き込めば良いとのことなので
/config/initializers/application_controller_renderer.rb
に追記する。

```/config/initializers/application_controller_renderer.rb
# Be sure to restart your server when you modify this file.

# ActiveSupport::Reloader.to_prepare do
#   ApplicationController.renderer.defaults.merge!(
#     http_host: 'example.org',
#     https: false
#   )
# end

#以下を追記
Refile.secret_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
```
追記を終えたらrailsを起動し直し
該当するページにアクセスしてみるとしっかりと画像の表示ができた。

記事を閲覧していただきありがとうございました。
同様のエラーに悩んでる方の解決につながれば嬉しいです。
おかしい点、修正点などございましたらコメントにて教えていただけると嬉しいです。
【Git】チーム開発まとめ

##チーム開発1年目のオレがGitに苦戦しまくって調べまくった経験からGitコマンドをわかりやすくまとめてみた


###git cloneまとめ

リポジトリのコードをローカルにコピー

```
$ git clone https://github.com/RepositoriesURL
```

gemのインストール

```
$ bundle install
```

データベースの作成

```
$ bundle exec rails db:create
```

データベースにテーブルを作成

```
$ bundle exec rails db:migrate
```

※その他
seedファイルの実行(seed.rbにあるデータをデータベースに格納)

```
$ rails db:seed
```




###git branchまとめ

ローカルブランチの作成

```
$ git branch ブランチ名
```

ブランチの切り替え

```
$ git checkout ブランチ名
```

上２つを同時に行う

```
$ git checkout -b ブランチ名
```

masterの情報を統合する

```
$ git rebase master
```

ローカルブランチの確認

```
$ git branch
```

リモートブランチの確認

```
$ git branch -r
```

全ブランチの確認

```
$ git branch -a
```

ローカルブランチ名の変更

```
$ git branch -m 旧ブランチ名 新ブランチ名
```

ローカルブランチの削除

```
$ git branch -d ブランチ名
```

ローカルブランチの強制削除

```
$ git branch -D ブランチ名
```

リモートブランチの削除

```
$ git push --delete origin ブランチ名
```


###git addまとめ
※git addとはファイルの変更をステージする事

リポジトリの初期化(初addの前にやる)

```
$ git init
```

変更したファイルを指定して追加する

```
$ git add ファイル名
```

変更したファイルを追加する

```
$ git add -u
```

ファイルの全てをadd

```
$ git add .
または
$ git add *
または
$ git add -A
```

すべてのCSSファイルをadd

```
$ git add *.css
```

addしてしまったファイルを指定してリセット

```
$ git reset HEAD ファイル名
```

間違ってaddしてしまった全addを取り消す

```
$ git reset
```

addしたファイルの確認

```
$ git status
```

add取り消し前と取り消し後のファイル(履歴)の削除
前者`Changes not staged for commit:`
後者`modified:`

```
$ git checkout .
これやっとくとconflictが起きにくい
```

上でも消せない`Untracked files`の削除

```
$ git clean -n     //削除するUntracked filesを確認
$ git clean -f     //Untracked filesを削除
```



###git commitまとめ

```
$ git commit -m "任意のコメント"              //普通のcommit
$ git commit -am "任意のコメント"             //addとcommitの一括処理
$ git commit --amend                      //commitしたファイルに、別のaddを追加するとき
$ git commit -a -m "任意のコメント"           //(-aオプションは変更を自動検出してくれる)
$ git commit -a                           //変更のあったファイル全部

[commitの取り消し]
$ git reset --soft HEAD^                  //直前のワークディレクトリの内容を保持し取り消す
$ git reset --hard HEAD^                  //commitを取り消す
```

```
$ git status                         　   //commitしたファイルを確認する
```

###git pushまとめ

```
$ git push origin リモートリブランチ名         //普通のpush
//※注意：ローカルブランチ名とリモートブランチ名が合致してないとpushできない

$ git push -u origin リモートリブランチ名      //これをすると次回からgit pushだけで指定したリモートリブランチにpushされる
```


参考
：https://qiita.com/syougun360/items/013229aeddec08121474
：https://qiita.com/konweb/items/621722f67fdd8f86a017

#告知
今、`進撃のIT`コミュニティで一緒に活動してくれる方を募集しています。
参加は無料です。
下に参加URLを貼ってます。
管理者はブロックチェーン実務経験あります。
参加資格はプログラマーからマーケター、AIやブロックチェーン、動画編集者やディレクター、youtuber、インスタグラマーも対象です。
<img width="702" alt="進撃のIT.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319526/960664e5-ed8c-0b3a-8e92-bbe585b9b0a6.png">

進撃のIT Facebook
https://www.facebook.com/groups/612023275874253/
進撃のIT Slack
https://attack-on-it.herokuapp.com/
進撃のIT Twitter
https://twitter.com/IT13389135
進撃のIT Qiita記事
https://qiita.com/f___juntaro_/items/81136c85a8002cc442ac
【メモ】さくらのレンタルサーバで、Laravelで作成したプロジェクトを動かす

前回[【メモ】さくらのレンタルサーバにLaravelをインストールする](https://qiita.com/kyoruni/items/93169398a75656246c25)の続きです。
次回も同じことができるようにメモです。

# やりたいこと
* 作成していたLaravelプロジェクトをさくらで動かしたい！

# 前提
* さくらのレンタルサーバ スタンダードプラン契約済
* mac使用
* プロジェクト名：hoge
* ユーザ名：hogename
* 作成したプロジェクトはgithubにpush済

# 目次
1. [サーバに接続する](#1サーバに接続する)
1. [githubのソースを持ってくる](#2githubのソースを持ってくる)
1. [composerで必要なライブラリをインストール](#3composerで必要なライブラリをインストール) 
1. [アプリケーションキーを作成](#4アプリケーションキーを作成)
1. [マイグレーション実行](#5マイグレーション実行)
1. [ブラウザで表示確認](#6ブラウザで表示確認)

# 1.サーバに接続する
前回と一緒で、SSH接続でレンタルサーバーにログインする。
ユーザ名@ユーザ名.sakura.ne.jp

```Console:
$ ssh hogename@hogename.sakura.ne.jp
```

# 2.githubのソースを持ってくる
持っていきたいディレクトリまで移動してから、下記を実行。

```Console:
$ git clone githubの対象リポジトリURL.git
$
$ # hogenameの、hoterepoリポジトリであれば、
$ git clone https://github.com/hogename/hogerepo.git
```

# 3.composerで必要なライブラリをインストール
さくらのファイルマネージャーで、composer.jsonを開く。
cloud9等で作成していたcomposer.jsonの中身をコピーして貼り付け＆上書き保存する。
保存できたら、下記を実行する。

```Console:
$ composer.phar install
$
$ # 下記の通り表示されたら成功
$ Package manifest generated successfully.
$ # 念のためupdateもしておく
$ composer.phar update
```

### composer update中に止まってしまったら…
下記のような表示が出て、途中で止まってしまった！

```Console:
# Token (hidden): 
```
下記の手順で対処
・ githubにログイン
・ 画面右上のプロフィール画像をクリック
・「Settings」をクリック
・ 左側のメニューから、「Developer settings」をクリック
・ 左側のメニューから、「Personal access tokens」をクリック
・ 右側に表示される「Generate new token」ボタンをクリック
・ パスワードの入力を求められたら、githubのパスワードを入力して「Confirm password」ボタンをクリック
・「Token description」欄に、好きな文字列を入力する。
・「Select scopes」欄の、「repo」にチェックを入れる
・ 画面一番下の、「Generate token」ボタンをクリック
・ トークンが生成されるので、緑背景の部分の文字列をコピーして、ターミナルにペーストする

# 4.アプリケーションキーを作成
Laravelプロジェクトのフォルダまで移動してから、下記を実行。

```Console:
$ php artisan key:generate
$
$ # 下記の通り表示されたら成功
$ Application key [ここにアプリケーションキーが入る] set successfully.
```

# 5.マイグレーション実行
下記を実行。

```Console:
$ php artisan migrate
```

# 6.ブラウザで表示確認
トップページが無事表示された！
DBを操作する処理も正しく動作した！


<font color="#cccccc">composer.jsonの中身を書き換えていないことに気が付かず、4時間ぐらい詰まってしまいました…
次からは詰まらないと思うので良かったと思うことにします。</font>
簡易な設定読み込みモジュールを作ってみた♪

# 動機
深層学習モデルなど、いろいろとプロトタイプを作成するとき、
起動パラメータを設定ファイルにして、履歴に残るようにしたいときがある。
そんなときのために、簡易に使える設定読み込みモジュールがあるといいな、ということで作成。

# 環境
- OS: 18.04.2 LTS (Bionic Beaver)
- CPU: Intel(R) Core(TM) i7-7700K CPU @ 4.20GHz / cpu cores: 4
- Memory: 約60GiB
- HDD: 約1.7TiB (Avail)
- Python 3.6.5 (GCC 7.3.0) on pyenv
- pycharm-community-2019.1.1

# リポジトリ
[ここ](https://github.com/tkosht/simple_config.git)

# インストール
`pip` で、リポジトリを指定してインストールします。

```bash
$ pip install git+https://github.com/tkosht/simple_config.git
```

# 動作確認

## リポジトリをclone
example を実行するため、リポジトリをclone しておきます。

```bash
$ git clone https://github.com/tkosht/simple_config.git
$ cd simple_config/
```

## example を実行
以下のようにして、`example.py` を、実行します。

```bash
$ cd $(git rev-parse --show-toplevel)/examples
$ python example.py
OK    # <- 出力されればOK
```

# 中身を見ていく

## 設定ファイル(.yml)

### まずは、head (model1 カテゴリ)

```bash
$ head -n 5 config/project.yml 
model1:
    batch_size: 2048
    samples: 10000
    vector_size: 128
    epochs: 10
```

### 次は、tail (visdom カテゴリ)
```bash
$ tail -n 3 config/project.yml 
visdom:
    server: 0.0.0.0
    port: 8097
```

## example.py の中身
`example.py` の中身は、こんな感じ。

```python
# -*- coding: utf-8 -*-

from sconfig.config import Config


if __name__ == '__main__':
    cfg = Config()
    assert cfg.model1.batch_size == 2048
    assert cfg.model1.samples == 10000

    vis = cfg.get("visdom")
    assert vis.server == "0.0.0.0"
    assert vis.port == 8097

    cfg = Config('config/project.cfg', 'config/project.spc')
    assert cfg.model1.batch_size == 2048
    assert cfg.model1.samples == 10000

    vis = cfg.get("visdom")
    assert vis.server == "0.0.0.0"
    assert vis.port == 8097

    print("OK")
```

cfg から、カテゴリ名を変数名としてアクセスします。
カテゴリ `model2` の サブカテゴリ`train` の`lr` にアクセスする場合は、

```python
assert cfg.model2.train.lr == 0.001
```
または、

```python
train = cfg.get("train")
assert train.lr == 0.001
```
のようにして、アクセスします。`train` までのパスがわからなくてもアクセスできる点が、プロトタイプ向きです笑。

ただ、cfg.get("train") は、辞書で最初に見つかった`train` という名称のオブジェクトを返すので、複数の`train` という名称の変数（or サブカテゴリ）がある場合は、どのオブジェクトが返されるかは、保証されない点（辞書オブジェクトのkeys の順序が保証されないことに起因）に注意が必要です。あくまで、シンプルなモジュールなので、そこはケアしない予定です。。

ということで、`cfg.get()` をご利用の際は、サブカテゴリ or 変数の名称が一意になるように、うまいこと設計してください♪
Ubuntu 18.10のインストールメモ (と19.04へのアップグレート)

久しぶりに最新バージョンのUbuntuをインストールしたので、以前と違う点をメモしました。
前は16.04 LTSを使用していたので、それとの比較です。

## パッケージ管理コマンドが apt に
以前は `apt-get` と `apt-cache` だったのが [^1] 、 `apt` というコマンドに統一された。サブコマンドは同じ模様。

[^1]: 個人的には `aptitude` を使用してました

```sh
$ apt install XXX  # インストール
$ apt remove XXX  # アンインストール
$ apt search YYY  # 'YYY'というキーワードで検索
$ apt update  # パッケージ情報を更新
$ apt upgrade  # パッケージを全て更新
```

## apt とは別に snap というパッケージ管理コマンドがある

[snapcraft](https://snapcraft.io/) で参照できるアプリは `snap` コマンドでインストール出来て、リッチなGUIを持つアプリが多い印象。
`/snap` 以下にインストールされるので、 `~/.bash_profile` などに

```:~/.bash_profile
export PATH=/snap/bin:$PATH
```

と追記する必要がある。

* `libreoffice` はaptでもsnapでもインストール出来るが、バージョンが違うようだ。
* `slack` をsnapで入れると `fcitx` での日本語入力を受け付けなかった。[公式サイト](https://slack.com/intl/ja-jp/downloads/linux)からダウンロードしたものは問題は無かった。


## 以下防備録

### パーティション

今回はノートPCにインストール。Windowsパーティションはリカバリメディアの作成したので全消去。
またUbuntuは自分でスワップファイルを作成するようなので、スワップパーティションは必要なし。
リカバリ用のパーティションを残す必要がある場合は、Windowsパーティションの後ろに加える。

```
1. EFIパーティション: 128MB
2. /boot (ext2): 500MB
3. / (ext4): 50GB
4. /home (ext4): 残り
```

### ネットワーク情報

`ifconfig`ではなく`ip`を使う。

```sh
$ ip address show
```

## 文字化け対策

いくつかのソフトで文字化けがあったのでまとめてメモ。

### unzip

ファイル名がShift-JISで記述されていると発生する模様。`-O sjis`を付ければうまくデコードされる。

```sh
$ unzip -O sjis XXX.zip
```

### wine

普通に日本語環境を設定しているなら問題ないが、システムメッセージなどを英語で表示している場合は、
コマンド起動する際に環境変数`LANG`を指定する必要あり。

```sh
$ LANG=ja_JP.UTF-8 wine xxx.exe
```

個人的にはこちらのほうが好み。


## 19.04にアップグレード

19.04がリリースされたのでアップグレードしました。

```sh
$ do-release-upgrade
```

インストールしているパッケージによっては、確認画面が表示されるので適切な回答を選ぶ。[^2]

アップグレード終了後は再起動が必要になる。

再起動後に不要なパッケージを削除する。

```sh
$ apt autoremove
```

[^2]: 今回は`postgresql`が`10.10`から`11.2`に更新された。
Golang+Ginについての備忘録(ちょこっとGorm)

#はじめに
　こんにちはRIN1208です。
　今回は最近GolangのフレームワークGinを使ったので備忘録を書こうと思いこの記事を書きました。   
  間違っている点がございましたらコメントにて教えていただけると幸いです。  
#Ginとは
[GitHub](https://github.com/gin-gonic/gin)  
Goのwebフレームワークです  
#環境
golang 1.12.4

#基本的なコード
``` go
package main

import (
    "github.com/gin-gonic/gin" 
)


func main() {
    r := gin.Default()
    r.GET("/hoge/:number", rest) //rest api
    r.GET("/path", path) //今回はクエリを受け取るところです。
    r.DELETE("/:number", deletenumber)// deleteメゾット
    r.POST("/post", post)//postメゾット

    r.Run()//portを指定する場合はr.Run(":10000")みたいに書きます
}
```

#Rest APIの部分について
ここでは上記のRestの部分の説明  

``` go
    r := gin.Default()
    r.GET("/hoge/:number", rest) //numberが変数名で/hoge/なんちゃらの時にrestが処理するようにします
     //numberが変数  

//省略...

func rest(c *gin.Context) {
    key := c.Param("number")//ここではqueryではなくてParamを使います   
    fmt.Println(key)//もし/hoge/114だと114が出力されます  
}

``` 

#Query
r.GET("/path", path)の部分については上記と同じです

```go
//省略... 
    r.GET("/path", path)//クエリの型はstring型
//省略...

func path(c *gin.Context){

    hoge := c.Query("hoge")//パスは/path?hoge=114
    //hoge = "114"

    hoge, _ := c.GetQueryArray("hoge")//クエリをarrayに入れます
    //パスが/path?hoge=1&hoge=234の場合は
    //hoge =[1,234]となります。ちなみにarrayなのでポインタではないです。


    hoge := c.DefaultQuery("hoge", "514")
    //この場合はデフォルトで514が設定されているため、パスが/pathでもhoge=514となります
    //パスが/path?hoge=1の場合はhoge=1になります

}
```


#POST
postについてはpostでJsonを受け取ります。postに関してはcurl等で送ってください
[参考ページ](https://qiita.com/sensuikan1973/items/b2085a9cdc6d1e97e8f8)

```go
//省略... 
    r.POST("/post", post)
//省略...
type Alice struct {
    Id        string `json:"id"`
    Name      string `json:"name"`
}
//curl -X POST -H "Content-Type: application/json" -d '{"ID":"1", "Name":"hoge"}' localhost:8080/post
//curlの例
func post (c *gin.Context){
    var hoge Alice //alice型の変数の定義
    c.BindJSON(&hoge)//hogeに受け取ったJsonを代入
}
```

#Delete
Deleteに関しては論理削除について書こうと思います。ORMは[GORM](http://gorm.io/ja_JP/docs/index.html)を使用しました。
DBはMysqlを使用しました。どうやらGORMはDELETEで受け取ると自動で論理削除してくれるらしいです(多分自動.....)

```go
//省略... 
    r.DELETE("/:number", deletenumber)
//省略...

type Alice struct {
    gorm.Model
    No        string `json:"no"`
    Name      string `json:"name"`
}
func deletenumber (c *gin.Context){
    key := c.Param("number")//rest apiの所と同じです
    db, err := gorm.Open("sqlite3", "test.db")//それぞれの環境によって変わります
    if err != nil {
        panic("データベースへの接続に失敗しました")
    }
    defer db.Close()
    // スキーマのマイグレーション
    db.AutoMigrate(&Alice{})
    db.Where("no = ?", key).Delete(&Alice{})//例えば/112の場合はNOが112のDBのデータを論理削除
}
```
ここで注意しなくてはいけないのがIDはGORMの方で使ってしまっているのでこちらの構造体の方でIDを設定してしまうとカラム名が重複してしまします（言い方が適切ではないかもしれないですがご了承ください....



#最後に
ここまで読んでくださり有難うございます。最近GinやGORMに触るようになったので覚えることが多くて基本的なことだけでも忘れないようにと思いこの記事を書きました。前回はcliについて書くとか言っていましたが多分誰も読まないだろと思ったので備忘録にしました。この記事で間違ってることがありましたら本当にごめんなさい......
D-Ocean使ってみた感想

##はじめに
課題でD-Oceanを使ってみたので手触りや使い方を簡単にまとめておきます。

##D-Oceanとは
D-Oceanはデータを通じて人と企業をつなげるソーシャルデータプラットフォームです。

・データの共有（パブリックまたはグループ内）
・データ・サイエンティストと企業の交流
・データ収集・解析のリクエスト

などが行なえます。
データサイエンティストを志す人は利用する価値があると思います！

[D-Ocean](https://www.docean.io/)

##D-Oceanの使い方
まずはログインしましょう。Github,Facebook,Googleいずれかのアカウントを使ってログインすることができます。
ログインが完了すると以下のような画面になります！

![2019-04-18 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396625/4751ac0e-d901-3905-f120-9d8d50f9ed1b.png)

###PUBLIC
PUBLICからは一般に公開されたデータにアクセスすることができます。
アクセスしたいデータを選び、Queryというボタンを押すとSQL文を打ち込む画面が出ます。
![2019-04-18 (2)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396625/875d9edd-3ec5-2e25-50ff-385d90c13d6c.jpeg)

![2019-04-18 (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396625/8a81685b-896e-87af-6126-7e5b31c1c5ff.png)

SQL文を書いてExecuteボタンを押すとデータが画面に表示されます。そのあと、CSVを選択してもう一度Executeボタンを押すとデータをCSVで出力できます。
SQL文の書き方については他の記事を参考にしてください！

また、データの公開主とコメントをやり取りすることもできます。
活用していきましょう！

###GROUP
GROUPではグループを作り、その内部でデータをやり取りすることができます。
仕事等で一般に公開できないデータを扱う場合に利用します。

少しわかりにくいですが、、、
参加している**グループの管理をしたいとき**は「GROUP」と書かれているところをクリックし、
グループで扱っている**データにアクセスしたいとき**は「GROUP」と書かれているところにマウスカーソルを合わせてからアクセスしたいデータを持つグループをクリックしましょう。
「GROUP」をクリックしてもデータにアクセスできないので気をつけてください！

他の操作は基本的にPUBLICと同じかと思われるので割愛します！

##感想
GROUPの使い方が少しわかりにくかったですが、デザインがオシャレでかっこいいです！
SQL文を打ち間違えたときも自動で「ここが間違ってるよ！」と教えてくれるので、慣れてない僕でも扱いやすかったです。
気になった方はぜひ利用してみてください！
aws-cliやaws-sdkが動かない時は時刻が正しいか確認する（原因と対応）

VirtualBox等の仮想化環境でawsコマンド(aws-cli)やaws-apiライブラリを使用したシステムよりAWSの各種APIへアクセスすると、次のようにエラーが表示される場合があります。

```
An error occurred (RequestTimeTooSkewed) when calling the ListBuckets operation: The difference between the request time and the current time is too large.
```

特に、ノートPCの場合はその現象が顕著に発生する傾向があります。

## 原因

ノートPCでVM起動中にスリープ（サスペンド、ハイバネーション）を行うと、スリープ復帰後に時刻ずれが生じる場合があります。

スリープ復帰後は時刻が自動的に補正されない場合があるため、次のいずれかの対応が必要となります。

A)手動で時刻補正を行う
B)VMを一旦停止（シャットダウン）してから起動し直す


## 対応

ここでは、Aの方法をもとに説明を進めます。

### １．時刻が正しいか確認します

Linux（VM）の日時を確認します。

```
# date
Thu Apr 18 00:05:58 JST 2019
```

次に、ホストOSの日時を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/176e5885-0008-8f8a-333d-8611b268dafe.png)

以上を見てみると、ホストOSとVMで異なる時刻を示していることがわかります。

### ２．時刻を合わせます

ntpdateで時刻を合わせます。（以下はNICTのタイムサーバを使用する例です）

```
# ntpdate ntp.nict.jp
```

上記コマンドを実行すると、次のように結果が返され、時刻が補正されます。

```
18 Apr 01:21:42 ntpdate[15103]: step time server 133.243.238.243 offset 4325.436029 sec
```

### ３．awsコマンドを実行する

awsコマンドで何らか実行を行い、意図した結果が返ってくれば解決となります。
Pythonで単語の数え上げの実行速度比較

# はじめに
自然言語処理の前処理で単語数をカウントするプログラムを作成することがよくありますが，一体どのように数え上げるのが早いのか検証してみました。今回、数え上げに使用したクラスは以下の3クラスです。

- dict
- defaultdict
- Counter


この3種類のクラスで単純な数え上げ方法にて実行速度を検証します．


## それぞれのクラスについて
### dict
Pythonで標準的に実装されている辞書型
辞書型は通常存在しないkeyを参照しようするとエラーが発生するために，数え上げをする際には`get("key",0)`を使用する．

### defaultdict
Pythonの特殊なコンテナデータ型で，ファクトリ関数を呼びだして存在しない値を供給する辞書型のサブクラス
宣言をする際に ` defaultdict(int)` とすることで，存在しないkeyが出現した時は，マッピングが存在しないため  ` default_factory() ` 関数が ` int() ` を呼んでデフォルトのカウント0を生成する．

### Counter
Pythonの特殊なコンテナデータ型で，ハッシュ可能なオブジェクトを数え上げる辞書のサブクラス


## 検証
### サンプル
```Python3
import random
source_str = 'abcdefghijklmnopqrstuvwxyz'
sample = ["".join([random.choice(source_str) for x in range(3)]) for x in range(10**7)]
```
a-zの文字からランダムに3文字選択した文字列を$10^7$個用意し,リストにしたもの．

### 検証方法
Jupyterの%%timeitメソッドを用いて計測する．
また，defaultdictとCounterは事前に読み込んでおく．

```Python3
from collections import defaultdict, Counter
```

### 計測
#### dict
```Python3
%%timeit
D = dict()
for s in sample:
    D[s] = D.get(s,0) + 1
```
結果: 2.31 s ± 20.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

#### defaultdict
```Python3
%%timeit
D = defaultdict(int)
for s in sample:
    D[s] += 1
```
結果: 1.47 s ± 18.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

#### Counter
##### その1
Counter宣言時に同時に数え上げを行う．

```Python3
%%timeit
D = Counter(sample)
```
結果: 1.33 s ± 283 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
##### その2
forループで1単語ずつ数え上げを行う．

```Python3
%%timeit
D = Counter()
for s in sample:
    D[s] += 1
```
結果: 3.57 s ± 25.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

##### その3
forループである程度まとまてCounterの更新を行う．

```Python3
%%timeit
D = Counter()
L = list()
for s in sample:
    L.append(s)
    if len(L)>10000:
        D.update(L)
        L = list()
```

結果: 2.5 s ± 20.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

### 結果
実行速度は

| Rank | クラス | 実行速度(per loop) |
|:---:|:---:|:---:|
| 1 | Counter その1| 1.33 s ± 283 ms |
| 2 | defaultdict | 1.47 s ± 18.7 ms |
| 3 | dict | 2.31 s ± 20.7 ms |
| 4 | Counter その3 | 2.5 s ± 20.4 ms |
| 5 | Counter その2 | 3.57 s ± 25.6 ms |

の順に早い結果となった。
Counterも `update()`メソッドを用いると実効速度を改善できることが確認出来る．

### まとめと補足
今回は、単語数が$10^7$のリストを数えあげの対象としたが、実際の**大規模コーパスにおける単語の数え上げでは、Counter その1 のパターンでOut of Memoryとなってしまう**ことが多々ある（体験談）．この場合はdefaultdictの方が安定した数え上げが可能なこともある．そのため，コーパスサイズによっては、defaultdictとCounterを使い分けることが必要になるだろう．
GoCVのResize

gocvを使っていて躓いたところがあったのでメモ.
#gocv.Resize
C++やPythonととる引数の名前が違ったため困惑した.


####理由
引数で切り取る場所と切り取り範囲を指定できる(第3引数がPointだったため)と, 思っていたがどうやら違うみたい.

####実際
詳しくgodocを読んでみると, image.Point{}でサイズを絶対値指定するみたい.その場合fx, fyは0にする.

+ 例
 
```go
    //画像をカラーで読む
	img := gocv.IMRead("./sample.jpg", 1)
    //縦1080横720
    gocv.Resize(img,&img,image.Point{1080,720},0,0,gocv.InterpolationDefault)

```
一方, サイズを何倍かしたい場合, Pointを空にしfx, fyで指定する.

+ 例

```go
    //画像をカラーで読む
	img := gocv.IMRead("./sample.jpg", 1)
    //縦横を0.1倍する
    gocv.Resize(img,&img,image.Point{},0.1,0.1,gocv.InterpolationDefault)

```