OmniAICreator/Qiita-1.07M huggingface dataset:
部分テンプレートを遅延ロードさせるGem作った

# 概要

簡単に部分テンプレートを遅延ロードさせるRailsプラグイン作った。
View template内で、`render 'partial'`を`step_render 'partial'`みたいに書き換えるだけ。

https://github.com/EastResident/step_render

# なぜ作ったか

まず、部分テンプレートを遅延ロード(あるいは非同期読み込み)させる目的のGemはすでに存在します。探した限り、以下の二つが見つかりました。

https://github.com/renderedtext/render_async

https://github.com/vexus2/lazy_render

しかし、これらのGemはテンプレートごとにアクションやルーティングを作成する必要があったりと、手軽にプロジェクトに組み込める感じではありませんでした(堅実な作りとも言えますが・・・)。

今回作成したGemでは、`render`メソッドで部分テンプレートを呼び出すところを`step_render`に変えるだけで遅延ロードを実現させるため、扱いが非常にシンプルです。まあ、いくつか細かい制約はありますが・・・

# 使用方法・解説

## 導入

まず、普通にbundle installします。

おそらくRails 4.2以上でしか動作しません。

リポジトリはここです
https://github.com/EastResident/step_render

```rb
gem 'step_render'
```

次に、jsのコードを挿入します。このプラグインはlazysizesというjsのライブラリを利用しているので、lazysizesをプロジェクトに導入してないなら、`application.html.erb`等に以下の記述すればCDNで読み込みます。

```html+erb
<head>
  〜〜〜
  〜〜〜
  <%= import_step_render %>
  〜〜〜
</head>
```

最後に、ルーティングを追加します。`routes.rb`に`mount_step_render`の記述を追加すれば、必要なルーティングが作成されます。

```rb
Rails.application.routes.draw do
  〜〜〜
  mount_step_render
  〜〜〜
```

これで準備は完了です。

## 使用例

後は、`render`メソッドと同じような感覚で使用できます。以下の例では、`Article`というモデルのインスタンスを引数に渡しています。Aが通常のパターンで、BがGemを利用した遅延読み込みのパターンです。

### A. renderの場合

```html+erb:app/views/articles/index.html.erb
<% @articles = Article.find(10) %>
<%= render 'article', article: @article %>
```

```html+erb:app/views/articles/_article.html.erb
<h2><%= article.title %></h2>
〜〜〜
〜〜〜
```

### B. step_renderでの遅延ロード

```html+erb:app/views/articles/index.html.erb
<% @articles = Article.find(10) %>
<%= step_render 'articles/article', article: @article %>
```

```html+erb:app/views/articles/_article.html.erb
<h2><%= article.title %></h2>
〜〜〜
〜〜〜
```

step_renderでの遅延ロードを行う際の違いは、`render`を`step_render`に置き換えることと、**部分テンプレートのファイルを絶対パス("app/views"からの相対パス)で指定することのみです**。部分テンプレート側の変更は必要ありませんし、actionやroutingを追加する必要はありません。

## 仕組みの説明
どのようにこれを実現させているかですが、まず、部分テンプレートの代わりに以下のような`div`タグが挿入されます。

```html
<div class="related-articles lazyloaded" data-include="/step_render/%04%08%5B%07I%22%0Carticle%06%3A%06ET%7B%07I%22%0Carticle%06%3B%00F%7B%06I%22%11_aj_globalid%06%3B%00TI%22%1Agid%3A%2F%2Fchai%2FArticle%2F32%06%3B%00TI%22%14_aj_symbol_keys%06%3B%00T%5B%06I%22%0Carticle%06%3B%00F">loading</div>
```

ここで、`data-include`属性の`/step_render/`以下の文字列は、**`step_render`メソッドに渡した引数をダンプしてCGIエスケープしたもの**です。ActiveRecordのモデルが引数に渡された場合は、Global ID化した上でダンプされます。

この`/step_render/~~~~`形式のURLにGETすることで本来のHTMLが返ってきます。
GETで渡せるURLには長さの制限があるので、これを超えるような引数を指定することはできません。
`step_render`Gemでは、2083文字を超える場合に、`StepRender::RequestURITooLarge`という独自例外が発生します。
試した感じだと、20~30個くらいのARインスタンスなら引数として渡せます。以下は実行可能です。

```html+erb
<%= step_render 'partial', articles: Article.limit(20).to_a %>
```

# まとめ

このGemの使用用途としては以下のようなものが考えられます。

- ページ読み込みが重い部分に適用
- fragment cacheの内側で一部書き換えたい場合
- 無限スクロール

いずれの用途でも最小限のコード変更で実現できますが、内部的には少し荒っぽいことをしてるので動作は少し不安です・・・


最後になりますが、PORT株式会社では[自社サービスを支えてくれる優秀なRubyエンジニアを募集しています](https://www.wantedly.com/companies/port/projects)(Rubyエンジニア以外も)。
もくもく会も行なっていますので、ぜひ一緒にもくもくしましょう！
[PORTもくもく会](https://freestyle-mokumoku.connpass.com/)
機械学習論文読みメモ_110


[Image Segmentation by Iterative Inference from Conditional Score Estimation](https://arxiv.org/abs/1705.07450)
入力に条件付けされた出力の結合分布の構造を学習するための手法として逐次推論の手法を提案する。
この手法はvirtual cortexにおけるfeedforwardと逐次推論の組み合わせ、またdenoising autoencoderにおける結合分布の予測能力にインスパイアされている。
この手法はimage segmentationタスクに応用され、条件付き予測スコアの最大化を行う事で条件付き分布のモード値へ収束させる。
この手法はdenoising autoencoderによるスコア予測手法に関して、条件付き分布を利用した場合の手法として考えられ、特にノイズ付与のためのgaussian corruptionを新たなcorrupted feedforward predictorに置き換えている。
こうした手法の利点として、逐次推論をCRFなどのstructured inputに対して適用可能にする事が挙げられる。
つまり、従来のように出力の構造に合わせたenergy functionを陽に定義する必要がないという事である。

[Dilated Residual Networks](https://arxiv.org/abs/1705.09914)
CNNは特徴抽出の過程でresolutionを落としていく性質があり、
結果、spatial structureを十分表現出来ない問題があった。
この問題はresolutionの低下を防ぐdilation構造を用いる事で軽減出来る事が示されてきている。
本論ではまず、diltation構造を追加したresidual networksを用いるとdilationがないものとくらべて
性能が向上する事を示した。
またdilation構造を取り入れる事で現れるgridding現象について分析し、それを解決する
degridding手法について提案する。

[Self-Normalizing Neural Networks](https://arxiv.org/abs/1706.02515)
従来のdeep learningの手法は主にCNNやRNNといった特徴的の構造を持つネットワークにおいて成功を
収めてきたが、通常のFeedforward networkにおいてはあまりそうした成功例は少ない。
成功例もshallow networkに限ったものが多く、深い構造に対してはあまりうまく行っていない。
本論で提案するself-normalizing neural networks(SNN)は深い構造で特徴抽出を高性能に行う事が出来る
モデルである。
従来のbatch normalizationなどは陽にnormalizationを行う必要があったが、SNNは活性化関数が自動的に
平均０、分散１で収束するようになっている。
ここで用いられる活性化関数はscaled exponential linear unit (SELUs)と呼び、self-normalizationが可能な
構造を持つ。
特に、バナッハの不動点定理より、この活性化関数は最終的に平均０分散１へ収束する事を示す事が
出来る。
この特性を利用する事で、多層あっても発散する事なく特徴抽出が可能、強い正則化を導入可能、
学習を頑健、にする事が出来る。
conda環境の保存と再構築の仕方

# conda環境のセーブとリストア

pipの環境はpip freezeを使った環境の保存と再構築の方法があります。
同様のことをAnacondaやMinicondaで作った環境（conda環境）でもできないか調べたところ、[公式マニュアル](https://conda.io/docs/user-guide/tasks/manage-environments.html) にあったのでメモしておきます。

## 本記事での環境
Anaconda3/Miniconda3 4.3.30

## 方法
方法は2通りあります。
2の方法の方が利点が大きいです。

### 1. conda を使った方法

保存

```
conda list --explicit > env_name.txt
```

再構築(新規に環境をつくる場合)

```
conda create -n [env_name] --file env_name.txt
```

再構築(既存の環境に足す場合)

```
conda install --name [env_name] --file env_name.txt
```

[公式マニュアル](https://conda.io/docs/user-guide/tasks/manage-environments.html) によると、こちらの方法は、エクスポートしたマシンと同じOS・アーキテクチャのマシン上の移行に使う必要があるとのことです。
エクスポートしたtxtファイル内にエクスポートしたマシンのOS・アーキテクチャ情報が入っています。
上記再構築のコマンドは、実行時にOS・アーキテクチャのチェックはしないので注意する必要があります。


### 2. conda env を使った方法

保存

```
conda env export -n [env_name] > env_name.yml
```

再構築

```
conda env create -f=env_name.yml
```

こちらの方法は1と違い、アーキテクチャに依存しません。別のOS・アーキテクチャのマシン上へも移行できます。

※2018/5/22追記 別のOSだとcondaやpipのリポジトリの内容が異なるため、そのまま移行はほぼ不可能でした。同種別OSの別バージョンへの移行までが現実的と思われます。

また、condaパッケージだけでなくpipパッケージの情報も入っているので、pip含めて全環境を移行できます。
でもこちらはおそらく、既存の環境にパッケージ追加、はできません。あくまで移行用。

※2018/5/22追記 ymlに書き足せば追加できるし、当然ながら環境構築後に個別で追加・削除もできます。

## 備考

- whlファイルでしか入れられなくて後から入れたパッケージがあると再構築コマンドがエラーになるので、その時は上記の保存コマンドで生成したyamlファイルから該当パッケージの行を削除して実行する必要があります。

## 参考
- [公式マニュアル](https://conda.io/docs/user-guide/tasks/manage-environments.html)
    - 方法1: https://conda.io/docs/user-guide/tasks/manage-environments.html#building-identical-conda-environments
    - 方法2: https://conda.io/docs/user-guide/tasks/manage-environments.html#sharing-an-environment
非同期通信の書き方の理解の推進

ES8から正式にサポートしてくれたasync/awaitにより、Promise非同期処理をすっきりにする方法ですが、それを本当に理解する必要があります。

次の利用場面で具体的な例で考えましょう。

```
redux-thunkのActionCreatorで非同期通信を実行して、成功した場合、あるアクションをdispatchします。
通信する前に、ローディングインジケータを表示し、終わったら消す処理が必要です。
```

### 方法１（Promise案）

```javascript
export const doIt = () => {
  return (dispatch) => {
    dispatch(showLoading());
    return dispatch(doHttpAction())
    .then((res) => {
      dispatch(hideLoading());
      dispatch(refreshDisplay(res.data));
    })
    .catch(() => {
      dispatch(hideLoading());
    });
  };
};
```

### 方法２（Promise + await案）

```javascript
export const doIt = () => {
  return (dispatch) => {
    dispatch(showLoading());
    const isSuccess = await dispatch(doHttpAction())
    .then((res) => {
      dispatch(hideLoading());
      return true;
    })
    .catch(() => {
      dispatch(hideLoading());
      return false;
    });

    if (isSuccess) {
      dispatch(refreshDisplay(res.data));
    }
  };
};
```

### 方法３（await案）

```javascript
export const doIt = () => {
  return (dispatch) => {
    dispatch(showLoading());
    try {
      await dispatch(doHttpAction());
      dispatch(refreshDisplay(res.data));
    }
    finally {
      dispatch(hideLoading());
    }
  };
};
```

### **結論**
個人的には方法３のawait案がお好みです。メリットが２つあります。

- 正常系の流れで簡潔でわかりやすい
- 通信失敗の場合、Promise.rejectされたことが自動的に呼び出し元に伝えます

方法2のpromise+await混合案がawaitの良さに対する理解が中途半端の時、発生しやすいケースだと思います。旧来の考え方を捨てるのが時間かかるかもしれませんが、新生の物事に抵抗感が自然に発生することを覚悟した上で、常に新しい技術を受け入れることが大事ではないかと思います。
EC2 Parameter Storeから値を持ってくるスクリプト

# AWS EC2 Parameter Store とは

ご存知の方は読み飛ばしてください。

いわゆるVaultサーバみたいなKey-Value Storeです。シークレット情報やシステムパラメータを入れておいて、EC2やオンプレサーバ、ECSなどからパラメータ名をキーに参照できます。
格納できるパラメータの型は普通の文字列である`String`, 文字列のリストの` StringList`, 暗号化された文字列の`SecureString`の3種類です。

利用用途としては、RDSのパスワードや外部サービス(DockerHubやFacebookなど)の認証情報などをSecureStringで入れたり、本番環境や開発環境など環境ごとに異なるパラメータを格納したりがメインだと思われます。

ちなみに、`AWS Simple System Manager Parameter Store`とも言います。そのうち`AWS Systems Manager Parameter Store`になるかもしれません。
マネジメントコンソール上では今のところEC2のページに表示されるので`EC2 Parameter Store`とします。

## パラメータのパス階層

Parameter Storeではパラメータ名をファイルシステムのパスのような階層構造にできます。
階層構造といっても物理的に階層があるわけではなく、パラメータ名をスラッシュで区切るとパスとして扱われ、指定パス配下のパラメータに対してまとめて取得、削除ができます。S3のオブジェクトキーの考え方と同じですね。
ただし、S3と違ってパラメータ名の先頭は必ずスラッシュにする必要があります。
また、これが一番重要ですが、 **IAM認可もパス単位で指定** できます。

階層パラメータ名は、例えば`/myapp/staging/RDS_PASSWORD`みたいにサービス名 > 環境名 > 変数名 みたいな形式が一般的かと思われます。
必要に応じてサーバロール(web,apiなど)や、マルチテナントの場合はテナント名を階層として追加したりするでしょう。

# パス配下のパラメータを取得する

前置きが長くなりましたが本題です。スクリプトの本体は[Gist](https://gist.github.com/sonodar/b3c80c8b9e60f4e6dcda9108c46a6089)にあります。このスクリプトの説明です。

## 使い方

```shell
# Usage: ./get_ssm_parameters.xx "パス階層"
bash +x ./get_ssm_parameters.sh "/myapp/staging"
ruby ./get_ssm_parameters.rb "/myapp/staging"
python ./get_ssm_parameters.sh "/myapp/staging"
node ./get_ssm_parameters.js "/myapp/staging"
```

出力例

```shell
RDS_PASSWORD="hogehoge"
SECPET_KEY_BASE="hogehagehige"
```

実行すると標準出力に`変数名=変数値`の形式で出力されます。`SecureString`なパラメータは復号化されます。
変数名はパス階層の最後の値が使われます。勝手に大文字にしたりはしません。

例えば以下のようにすればこれから実行するプロセスに渡すことができます。

```shell
eval "$(bash +x ./get_ssm_parameters.sh "/myapp/staging" | sed -e 's/^/export /g')"
bundle exec rails start -p $SERVER_PORT
```

## 各スクリプトの説明

スクリプト置き場 => https://gist.github.com/sonodar/b3c80c8b9e60f4e6dcda9108c46a6089

AmazonLinuxであれば`ruby`と`python`は入っているので好きなスクリプトを使えばいいと思います。
逆に、LambdaとかだとRuntimeが限定なのでそのLambdaのRuntimeに合わせたものを利用すればいいかと。

ちなみに、手元の環境だと`python`が最速で`bash`が一番遅かったです。(予想通り)

### `bash` get_ssm_parameters.sh

シェルに関しては一行目がわりと重要です。

```shell
#!/usr/bin/env bash +x
```

シークレット情報を扱うシェルなのでオプション`+x`を付けています。これがないと、例えばElasticBeanstalkなんかだと`-x`オプション付きで実行されることが多いのでログファイルやCloudWatch Logsにシークレット値が平文で出力されます。
このスクリプトも標準出力に出すので、呼び出すシェルでも`+x`オプションを付けた方がいいです。

なお、`jq`コマンドがインストールされていることが前提となっています。
シェル変数展開で配列にしたりしているので、変数展開のされ方にはわりと気を遣っています。
なので`jq`や`aws`コマンドのインタフェース変更があったらエラーになっちゃう。

### 他言語

特に説明は必要ないです。
`node`版はAPIのレスポンス処理がcallbackになるので再帰処理をしています。
`Python`版, `Ruby`版は`yield`で逐次処理をしているくらいです。
`Java`版もありましたが誰も使わないだろうから消しました。
Ruby の coverage を使って一番長い条件式を調べる

ruby 2.5 では coverage の機能が増えて分岐カバレッジが取得出来るようになったので、試しに一番長い条件式を取得するコードを書いてみました。


チェック用のサンプルコード

```ruby:sample.rb
n = 5

if n < 5
  'low'
else
  'high'
end

case n
when 0
  'a'
when 1
  'b'
when 2
  'c'
when 3
  'd'
end
```

一番長い条件式を取得するためのコード (RUBY_VERSION >= "2.5.0")


```ruby:get_longest_branch_code.rb
require "coverage"

Coverage.start(branches: true)
require_relative "sample"
result = Coverage.result

max_branch_size = 0
location = ""
longest_branch_code = ""

result.each do |filepath, coverage_data|
  source_code = File.readlines(filepath)
  branches = coverage_data[:branches]

  branches.each do |branch, _clauses|
    _condition_type, _clause_id, from_row, _from_col, to_row, _to_col = *branch
    branch_size = to_row - from_row + 1

    if max_branch_size < branch_size
      max_branch_size = branch_size
      location = "#{filepath}:#{from_row}"
      longest_branch_code = source_code[(from_row-1)..(to_row-1)].join
    end
  end
end

puts location
puts "longest branch code: (size #{max_branch_size})"
puts "-" * 80
puts longest_branch_code
puts "-" * 80
```

実行結果

```console
~/Programming/ruby/sandbox ruby get_longest_branch_code.rb
/Users/siman/Programming/ruby/sandbox/sample.rb:9
longest branch code: (size 10)
--------------------------------------------------------------------------------
case n
when 0
  'a'
when 1
  'b'
when 2
  'c'
when 3
  'd'
end
--------------------------------------------------------------------------------
```

こんな感じで一番長い条件式が取得出来ました。

他にも有名なライブラリで試してみました。

* active_support (5.1.4)

https://github.com/rails/rails/blob/v5.1.4/activesupport/lib/active_support/inflector/methods.rb#L268

* rubocop (0.52.0)

https://github.com/bbatsov/rubocop/blob/v0.52.0/lib/rubocop/cop/variable_force.rb#L113


## 参考サイト

https://bugs.ruby-lang.org/issues/13901
Nodeknockout2017 の優秀作品を紹介する

## NodeKnockoutとは
11/11、11/12 今年も[NodeKnockout](https://www.nodeknockout.com/)が開催されました。
NodeKnockoutとは、Node.jsをテーマにした48時間のハッカソンです。
オフラインではなくオンラインのハッカソンになっているので、すべての工程がインターネット上で行われます。
herokuやmongoDB、circleciなどがスポンサーになっていて、優秀な作品に選ばれると、$500のギフトカードやGithubの1年間のライセンスなどが貰えることもあります。今回はNodeknockout2017で受賞した作品を紹介していこうと思います。
## 優秀作品
### [The 💯 Store](http://100.2017.nodeknockout.com)
絵文字付きのTシャツ、帽子、マグカップなどがデザインできます。
商品の色を変更できたり、絵文字を増やしたりもできます。
驚くべきことに、デザインした商品は実際に注文できます！

![100store.gif](https://qiita-image-store.s3.amazonaws.com/0/134076/4c51c1f5-126d-24b4-3d07-099becb4cd71.gif)

### [GitWords](http://nullpointer.2017.nodeknockout.com)
gitのコマンドを使った言葉合わせゲームです！
ゲームを開始すると、単語が文字ブロックごとにバラバラになっていますので、
順番が合うように[git add]をしていきます。
ゲームをプレイするのにgitコマンドを使うなんて新鮮ですね。

![gitwords.gif](https://qiita-image-store.s3.amazonaws.com/0/134076/4d3aacf6-701a-deba-860b-548f1908e7bf.gif)

### [PixelBeach](http://pixelbeach.2017.nodeknockout.com)
Pixel Beach は、ドット絵が可愛い2Dアクションゲームです。
画面をクリックするとプレイヤーがジャンプして、障害物をうまく避けていきます。
このクオリティのゲームが2日間で出来上がるのはすごいです。

![pixelbeach.gif](https://qiita-image-store.s3.amazonaws.com/0/134076/65441c26-d9f4-a0e3-f164-1fd857f1979d.gif)
ひとまずPowerShellコマンドをバッチファイルで出力できるよう対応する


 **【本記事が役に立つ可能性がある場合】**
・職場環境上、PowerShellスクリプトの実行ポリシーの変更が容易ではない
・パラメータ取得の自動化をしたい


PowerShellスクリプトは実行ポリシーがあり、古いWindowsのOSでは
デフォルトが「Restricted」という使用禁止の状態となっています。


ただWindowsのdiskpartコマンド等、
通常のコマンドでは期待した出力結果がでないこともあり、
PowerShellのコマンド使いたい。


そんな時はやっぱりバッチファイルを使います。


そして下記のようにPowerShellと頭につけて
PowerShellコマンドを書いてあげれば
バッチファイルで実行されます。


しっかりスクリプトを作成し運用自動化を図る場合は
ポリシー設定の変更から進めるべきです。


以下は参考です。
PowerShellコマンドの冒頭に「Powershell」を付与すればOKです。
-Commandや-NoProfileなどオプション指定がなくても起動します。
ちなみにFormat-Listするためにパイプ処理していますが、
"で囲ってあげればOKです。


```get.bat
@echo off

echo 【PowerShellの実行ポリシー】> out2.txt
Powershell Get-ExecutionPolicy >> out2.txt
echo ==================================================================== >> out2.txt
Powershell "Get-PSDrive -PSProvider FileSystem | Format-List" >> out2.txt
```


出力ログです。

![out2.JPG](https://qiita-image-store.s3.amazonaws.com/0/113556/a4f832e1-1013-a766-5ee0-c4f26e5a8dbe.jpeg)





下記は上記のバッチファイルでやりたいことの
PowerShellスクリプトです。ログ名は変えてます。

```get.ps1
Write-Output  "【PowerShellの実行ポリシー】" > out.txt
Get-ExecutionPolicy >> out.txt
Write-Output =========================================================== >> out.txt
Get-PSDrive -PSProvider FileSystem　>> out.txt
```



#####以上ですm(__)m
Slackのファイルを一括で保存・削除するやつを作った

こんにちは [hashibiroko](https://github.com/hashibiroko) です。

Slackにアップロードされたファイルを保存し、Slack上に残しておく必要がなければ削除するプログラムをGolangで作りました。

私が参加しているあるSlackでは、私を含めて**約40人の学生が無料枠で活動**しています。そんななか、いたるチャンネルで無差別にファイルのアップロードが行われ、知らないうちに**ストレージが無料枠の5GBを超え**てしまいました。ストレージ容量がなくなると新しいファイルがアップロードできなくなります。

そこで今回は、ファイルをどこかに保存しSlack上から削除してしまうことで、もう一度容量を確保することにしました。

# TL;DR

作ったものはこちらです ☞ [hashibiroko/slack-filesave](https://github.com/hashibiroko/slack-filesave)

このプログラムを実行すると、ファイルのダウンロードを並行に行います。
また、削除の指定を行うとダウンロードが完了したものから削除を行います。
削除は、1秒に1回ずつ行うため、ダウンロードが早く終わった場合は削除を待つ必要があります。

⬇以下のようにして使用します。

```shell
$ go get github.com/hashibiroko/slack-filesave
$ slack-filesave -token=xxxxxx-xxxxxxxxx
```

実行には、SlackのTokenを指定してください。
その他に、以下のようなオプションを指定できます。

## 指定できるオプション

| 名前 | 説明 | 初期値 |
|:--|:--|:-:|
| type  | ファイルのタイプ  | all  |  |
| private  | プライベートファイルを含める  |  |  |
| delete  | 保存後に削除を行う | |

例：`$ slack-filesave -token=xxxxxx-xxxxxxxxx -file=image -private -delete`

# その後

このプログラムの実行によってパブリックなファイルが全て削除され、**3GB近くの容量を確保**できました。とりあえずはこれで、ファイルのアップロードが出来ないという問題は解決されました。しかし、今後はファイルの管理方法自体を考えていかないと、またすぐ同じ状況になりかねないため、何か解決策を考えたいです。

# 作ってみた感想

やはり私も学生ということで、このプログラムを作ってみたあとの学びを感想という形で残したいと思います。今回、このプログラムはGolangで作ってみたのですが、以前からGolangを使って個人的なCLI等の作成をしていたため、導入で躓くことはとくになかったかなという感じです。ただ、ゴルーチンやチャネルは今まで一度も使ったことがなかったため、それぞれのゴルーチンの同期を考えたりするのが結構大変でした。正直なところ、まだどんな設計が良かったのかわかっていないのと、今回の設計がこれで大丈夫なのかという不安もあったりします。パッケージの分け方とか、ファイル分割の単位とかも良くわかりません！ということで、今後はGolangで書かれたオープンソースなコードを読んで勉強していきたいです。
Macでfishを使う

自分用メモ。
Macを初期化した状態からfishを追加しよう、というだけの記事です。

# 準備
## [Homebrew](https://brew.sh)をインストールする
参考：[Homebrewを使いこなせ！Macへのインストールや使い方。](http://original-game.com/homebrew/#Homebrew-4)

`$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`
`$ brew -v`

## [fish](https://fishshell.com)をインストールする
`$ brew install fish`
`$ fish -v`

準備はこれで終了です。

# 確認（飛ばしてok）
## 「変更できるshellの一覧」を確認する
```
$ cat /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
```

後でこの一覧の中にfishを追加します。

## fishのパスの確認
```
$ which fish
/usr/local/bin/fish
```

# 設定
## fishの追加
「確認」の項目で表示したshell一覧の中にfishを追加します。

```
$ sudo -e /etc/shells
# List of acceptable shells for chpass(1).
# Ftpd will not allow users to connect who are not using
# one of these shells.

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh
/usr/local/bin/fish
~                                                                  
~                                                                  
~                                                                  
~                                                                  
~                                                                  
~                                                                  
~                                                                  
~                                                                  
-- INSERT --

```

上記のように、`$ sudo -e /etc/shells`を実行したあと、`a`でインサートモード(編集モード)に入り、shell一覧の最後にfishのパス`/usr/local/bin/fish`を追加します。
追加し終わったら`Esc`でコマンドモードに戻り、`:wq`を入力してファイルを保存で終了です。

参考：[VIM (Vi) をターミナルで操作 / Mac OS X](http://feb19.jp/blog/archives/000226.php)


これで変更できるshell一覧の中にfishが追加されました。

## shellの変更
`$ chsh -s /usr/local/bin/fish`
上記を実行後、ターミナルを再起動して終了です。

## おまけ
現在使っているshellの確認
`$ echo $SHELL`


# 参考
[fishshellの導入方法 mac編](http://koulog.hatenablog.com/entry/%3Fp%3D37)
[【Mac】ログインシェルの変更方法について (chsh, chpass)](http://www.task-notes.com/entry/20150117/1421482066)
Jekyllが `Invalid date ~` でビルドできなくなったので解決したまとめ


## 背景
さっきまで動いていたJekyllがビルドできなくなった。

## 状況

[ここ（unable to build a jekyll site … invalid date #5267）](https://github.com/jekyll/jekyll/issues/5267)に書いてあるようなエラーが出てビルドができなくなった。

```
Invalid date '<%= Time.now.strftime('%Y-%m-%d %H:%M:%S %z') %>': Document 'vendor/cache/gems/jekyll-3.2.1/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb' does not have a valid date in the YAML front matter.
```

## 解決方法

_config.yml内のexcludeに`vendor/*`を指定する。
[参考:invalid date '0000-00-00' from template #2938](https://github.com/jekyll/jekyll/issues/2938)

そもそも_config.ymlには以下のような設定サンプルがコメントアウトされて載っている。

```YAML:_config.yml
# Exclude from processing.
# The following items will not be processed, by default. Create a custom list
# to override the default setting.
# exclude:
#   - Gemfile
#   - Gemfile.lock
#   - node_modules
#   - vendor/bundle/
#   - vendor/cache/
#   - vendor/gems/
#   - vendor/ruby/
```

私は直前に自作のスクリプトをここに追加した際に以下のように自作のスクリプトだけを追加していた。

```YAML:_config.yml
# Exclude from processing.
# The following items will not be processed, by default. Create a custom list
# to override the default setting.
exclude:
  - myscript.sh
#   - Gemfile
#   - Gemfile.lock
#   - node_modules
#   - vendor/bundle/
#   - vendor/cache/
#   - vendor/gems/
#   - vendor/ruby/
```

よく見ると上のコメント欄に

> The following items will not be processed, by default. Create a custom list to override the default setting.

と書いてあるが、どうやら一つでもexcludeを記載するとビルドの際にexcludeするファイルやディレクトリは全部記載しないとダメだった模様。

そんなわけでコメントアウトされていたところの#を消して対応

```YAML:_config.yml
# Exclude from processing.
# The following items will not be processed, by default. Create a custom list
# to override the default setting.
exclude:
  - myscript.sh
  - Gemfile
  - Gemfile.lock
  - node_modules
  - vendor/bundle/
  - vendor/cache/
  - vendor/gems/
  - vendor/ruby/
```

これで無事にビルドが出来たので解決。
WordPressのTinyMCEエディタへスタイルを追加する方法

独自のスタイルを適用する
![img.png](https://qiita-image-store.s3.amazonaws.com/0/187963/2be2cc7d-f49f-9d38-1f2b-ffce8226fcd7.png)


画像の回り込み（float）のスタイルを独自で作成して画像に適用する
## 完成図
![column_demo01.png](https://qiita-image-store.s3.amazonaws.com/0/187963/a93a6443-9c6d-00c0-831b-9453c11d12ec.png)

```functions.php
if ( !function_exists( 'initialize_tinymce_styles' ) ):
function initialize_tinymce_styles($init_array) {
  //追加するスタイルの配列を作成
  $style_formats = array(
    array(
      'title' => '画像回り込み(左)',
      'inline' => 'span', //spanタグを追加
      'classes' => 'fll' //class「fll」が付与
    ),
    array(
      'title' => '画像回り込み(右)',
      'inline' => 'span',
      'classes' => 'flr'
    ),
  );
  //JSONに変換
  $init_array['style_formats'] = json_encode($style_formats);
  return $init_array;
}
endif;
add_filter('tiny_mce_before_init', 'initialize_tinymce_styles', 10000);
```

参考
https://nelog.jp/wordpress-tinymce-custom
https://www.nxworld.net/wordpress/wp-custom-visual-editor.html
TwitterAPIを使ってタイムラインを収集

TwitterAPIを使ってデータ収集したときの忘備録
##APIを使ってタイムラインを収集

```tweetdeta.py
from requests_oauthlib import OAuth1Session
import json

CK = 'ここに入力する（この文は消してください）' # Consumer Key
CS = 'ここに入力する（この文は消してください）' # Consumer Secret
AT = 'ここに入力する（この文は消してください）' # Access Token
AS = 'ここに入力する（この文は消してください）' # Accesss Token Seceret

url = "https://api.twitter.com/1.1/statuses/home_timeline.json" #タイムライン取得用のURL

params = {'since':2017-12-24,'count': 100}

twitter = OAuth1Session(CK, CS, AT, AS)
req = twitter.get(url, params = params)

if req.status_code == 200:
    
    timeline = json.loads(req.text)
    for tweet in timeline:
        print(tweet["text"])

else:
    print ("Error: %d" % req.status_code)

```
収集できるデータの自分がフォローしているユーザーのタイムラインしかできない。
※開発用のTwitter
実行結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/211326/1b85d80a-f004-6c13-3cb8-182945fd1557.png)
改訂2版 パーフェクトRuby 初級者が読むべき所まとめ

# パーフェクトRubyまとめ

改訂2版 パーフェクトRuby Rubyサポーターズ (著)
という、Ruby界では有名な本をRuby初級者の自分が一通り読んでみました。
しかしこの本、全592ページあります。

初級者が全部読むにはなかなかしんどいので、初級者が読むべき所をまとめました。

○:初級者でも読むべき
△:そのうち読み返そう
×:必要が来た時に読もう

# Part1 概要
## ○第一章 Rubyを触ってみよう
読む
# Part2 言語仕様
## ○第二章 Rubyの基礎
読む
## ○第三章　制御構造、組み込み関数、メソッド
読む
## ○第四章　クラスとモジュール
読む
## ○第五章 主な組み込みクラス/モジュール
### △5-7 IO/File
Fileクラスの操作
ガッツリ使う日が来たら読み直そう
### △5-8 Dir
Dirクラスの操作
ガッツリ使う日が来たら読み直そう
### ×5-9 Thread
スレッドの操作
### ×5-10 Fiber
Fiber
ノンプリエンティブな軽量スレッド
### ×5-11 Process
Process
プロセスを管理するためのモジュール
### ×5-12 Struct
Struct
構造体を表現するクラス
### ×5-13 Marshal
Marhal
オブジェクトを永続化するためのモジュール
### ×5-14 ObjectSpace
実行中のRubyプロセス中に存在するオブジェクトを操作する

# Part3 メタプログラミング
## ○第六章 Rubyのクラスオブジェクト
読む
## 第七章 オープンなクラス
### ×7-2 Refinements
Module#refine
## ○第八章 Procオブジェクト
読む
## 第九章 Methodクラス
### ×9-1 Methodオブジェクト
### ×9-2 Methodクラス、UnboundMethodクラス
## ○第十章 リフレクションプログラミング
読む
# Part4 標準添付ライブラリ
## 第十一章 ライブラリ
### ×11-1 非同期プログラミング(fiber)
### △11-2 ファイル/ディレクトリを操作を極める
pathname,fileutils,tmpdir,tempfile
ガッツリ使う日が来たら読み直そう
### ×11-4 上級者のための文字列オブジェクト
StringIO
ガッツリ使う日が来たら読み直そう
### ×11-5 集合で遊ぶ(set)
### ×11-9 Rubyのベンチマークを簡単に

# Part5 実践プログラミング
## ×第十三章 gemパッケージの作り方
必要な時が来るまで触らないと思う。
## ○第十四章 よく使われる標準ツール
### ×14-2 YARD
ドキュメントが必要な時が来るまで触らないと思う
## ×第十五章 コマンドラインアプリケーション
CLIアプリケーション作る必要性が出来るまで触らないと思う
## ×第十六章 テストコード
test-unit
Rspecを普段使うなら流し見でいい
Swift3からSwift4へのアップデートによるバーコード読み取りができない不具合について

#はじめに
iPhone7の背面カメラでバーコードを読み取り、ISBN番号を取得するというプログラムを書いていました。
しかし、Swift3からSwift4にアップデートした結果、カメラの映像はリアルタイムで表示されるが、バーコードを読み取ることができなくなるという不具合が発生しました。
その不具合の解消方法について共有したいと思います。

#開発環境 (アップデート時)
- Xcode9
- Swift4
- iOS 10.0
- iPhone7

#不具合の解消方法
ただ単に、関数名が変わっていただけだった。

**swift3**   

```swift
    func metadataOutput(captureOutput: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {

    }
```

上記を下記の関数に変えてやれば良い。

**swift4**

```swift
    func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {

    }
```

#参考URL
[[Swift4 Xcode9]アップデートによるカメラの不具合(表示されない)](https://teratail.com/questions/96832)
terminalのコマンドラインでtxtの抽出/削除を行えるべんりツール

## どうして作った
普段はAndroidでいろいろやっています。
ログ解析は[Sublime Text](https://www.sublimetext.com)でやってます。
抽出とか簡単にできて楽なんですが、たまに失敗します。

`<binary>`

検索できてるのに抽出できてない……つらい……。

[sublime-text3のファイル検索結果がbinaryとなる件について](https://ja.stackoverflow.com/questions/32159/sublime-text3のファイル検索結果がbinaryとなる件について)

検索してみたらこんな情報が出てきました。
自分の場合はファイルサイズではなく、ログに絵文字が混ざって不正な文字として処理されていたせいでした。
出してるのはぜんぜん関係ない別のアプリでした。
__なんでリリースされてるアプリがログ大量出力しとるんじゃ！！！！！！！！！！しかも絵文字！！！！種類多いから検索して削除もできない！！！！！！！！！！！！！！！！！！！！むかつく！！！！！！！！！！！！！__

## そんなわけで
午前中サボってlogを処理するpythonスクリプト作りました。２つ。
要件は以下の3つ。

+ macのterminalから使える
+ 複数のキーワードを抽出/削除できる
+ ファイル名が何によって出力されたものかわかりやすい

#### 抽出

```python:extract.py
import sys
import os.path
import copy

args = sys.argv
if len(args) < 3:
    sys.exit('error. too short argument. filename key...')
print(args)
input_file = open(args[1], 'r')
extract = copy.deepcopy(args)
del extract[0:2]
name, ext = os.path.splitext(input_file.name)
output_file = open(name + "_" + extract[0] + '.txt', 'w')
for line in input_file:
    if any((key in line for key in extract)):
        output_file.write(line)
input_file.close()
output_file.close()
```

使い方

`python extract.py [抽出元txtのpath] [抽出したいキーワード]×任意の数`

`python extract.py momotaro.txt inu saru kuma`
たとえばこんな感じでterminalに打つとmomotaro.txtの中からinu,saru,kumaのいずれかを含む行だけを抽出したmomotaro_inu.txtができます。

#### 削除

```python:remove.py
import sys
import os.path
import shutil
import copy

args = sys.argv
if len(args) < 3:
    sys.exit('error. too short argument. filename key...')
print(args)
input_file = open(args[1], 'r')
remove = copy.deepcopy(args)
name, ext = os.path.splitext(input_file.name)
rem = name.endswith('remove')
if rem:
    input_file.close()
    shutil.copyfile(args[1], 'temp_' + args[1])
    input_file = open('temp_' + args[1], 'r')
    output_file = open(args[1], 'w')
else:
    output_file = open(name + '_remove.txt', 'w')
print(output_file.name)
del remove[0:2]
for line in input_file:
    if not any((key in line for key in remove)):
        output_file.write(line)
input_file.close()
output_file.close()
if rem:
    os.remove('temp_' + args[1])
```

使い方
`python remove.py [抽出元txtのpath] [削除したいキーワード]×任意の数`

`python remove.py tanuki.txt ishi miso hune`
たとえばこんな感じでterminalに打つとtanuki.txtの中からishi,miso,huneのいずれかを含む行だけを削除したtanuki_remove.txtができます。siruも消したいな……と思ったときは
`python remove.py tanuki_remove.txt siru`
で削除済みのファイルからsiruが消せます。後は↑で過去入力を何度も呼び出して、引数だけ変えれば気に入らない文字列を徐々に徐々に削除できます。

## 感想
そんなにべんりではない。
ｐython初体験でした。
Javaくらいしかまともにやったことのない自分でも午前中ちょっと検索しただけで作れるとかpythonすごい……。
あと、動的言語触るのも初めてでした。適当になんでも入ってるとかこわい。
どうも文字処理が変わった？　らしくPython3では動かないです。でもMacのterminalで呼ぶと基本2が出て来るっぽいので気にしません。なんか動いてるし。
経験者から見たらえぇ……って感じだと思うのですがこれから勉強するのでゆるしてね！
2017年11月に爆誕した仮想通貨Magnet[MAG]についてさらっとメモ

#はじめに
ひょんな事から知り合ったMagnetについて、日本語情報が皆無に近いため作ってみました。
仮想通貨界隈で名を馳せている方には遠く及ばない知識で書いております。
あくまでも「さらっと」メモな扱いとして、正確な情報はリンク先の一次ソースにてご確認頂ければ。

#概要
PoW/PoS/マスターノードの全てが実装された新鋭通貨。
シンボルはMAG。

公式サイト
http://www.magnetwork.io/
Bitcointalk.orgスレッド
https://bitcointalk.org/index.php?topic=2402932.0


#各種仕様
##基本仕様
* シンボル：MAG
* ブロックタイム：90秒
* 最大発行数：144,000,000MAG

##PoW(マイニング)
* アルゴリズム：X11
* ブロック報酬：200(ただし、半分はマスターノード報酬に割り当て)
* 半減期：36万ブロック毎

##PoS
* 年利：7%
* 最低保有期間：24時間
* 最大保有期間：48日(＝最大のPoS報酬獲得が始まるのが48日目以降という事)

##マスターノード
* 必要コイン数：10,000MAG
* マスターノード報酬：ブロック報酬の半分がマスターノードに配られる

##その他
* Darksend(いわゆるプライベートセンド)実装。
* マルチシグ(多分Ver,1.3.0から…)を実装。

#ウォレット
##ソフトウェアの入手
Windows
http://magnetwork.io/Wallets/magnet-qt-WIN.rar
Mac OS
http://magnetwork.io/Wallets/Magnet-Qt.pkg
Linux
http://magnetwork.io/Wallets/magnet-qt-LINUX.rar
Bootstrap
http://magnetwork.io/Wallets/bootstrap.zip


##初期設定
とりあえずWindows版のみ記載、他のOSについては公式サイト参照で。

1. ダウンロードしたmagnet-qt-WIN.rarを解凍し、任意のフォルダに配置する。
2. magnet-qt.exeを実行した後、一旦閉じる。(これによりウォレット用データフォルダが作成される)
3. エクスプローラを開き、アドレスバーに`%AppData%\Magnet`と入力し移動する。
4. magnet.confという空ファイルがあるのでメモ帳等で開き、以下をコピペし保存する。

```magnet.conf
rpcallowip=127.0.0.1
rpcport=17179
rpcuser="適当にユーザ名を設定"
rpcpassword="良い感じのパスワードを設定"
server=1
daemon=1
listen=1
staking=1
port=17177
debug=all
addnode=35.195.167.40:17177
addnode=35.199.188.194:17177
addnode=104.196.155.39:17177
addnode=35.197.228.109:17177
addnode=35.198.35.45:17177
addnode=35.197.145.93:17177
addnode=35.199.1.114:17177
addnode=35.201.4.254:17177
addnode=35.188.240.39:17177
addnode=35.199.48.8:17177
addnode=146.148.79.31:17177
addnode=104.196.202.240:17177
addnode=35.195.122.245:17177
addnode=35.198.82.29:17177
addnode=35.200.247.198:17177
addnode=35.200.22.69:17177
addnode=35.201.14.20:17177
addnode=35.198.23.18:17177
addnode=104.199.194.138:17177
addnode=35.185.189.143:17177
```

以上を行いmagnet-qt.exeを再度実行すると、チェーンの同期が始まりウォレットとして利用可能となる。
同期にかかる時間は2017/12現在なら大体1時間くらい。

##ウォレットが動かない時の確認点
* ファイアーウォールに通信を遮断されているか、magnet-qt.exeを例外に追加されているか。
* magnet.confに上記設定のコピペを忘れていないか。

これで解決出来なかったらDiscordで助けを求めてみましょう。


#関連リンク
##ソースコード
https://github.com/magnetwork/magnet

##Twitter
https://twitter.com/magnetwork_io

##Discord
https://discord.gg/EtEGyEn
※日本語チャンネル#japanese

##ブロックチェーンエクスプローラー
http://explorer.magnetwork.io/

##Magnet対応マイニングプール
http://magnetpool.io/
↑が公式プール。

##Slack
~~https://magnetworks.slack.com/~~
↑Discordがメインとなった事により、招待不可となりました。

##マスターノード
マスターノードセットアップガイド
ホットウォレットUbuntu17.04VPS版
http://magnetwork.io/MAGNET_MN_SETUP_LINUX.pdf
ローカルウォレット＆Ubuntu17.04VPS版
http://magnetwork.io/wp-content/uploads/2017/12/COLD-WALLET-MASTERNODE-SETUP-on-LINUX.pdf

マスターノードチェックサイト
http://magnetwork.io/checkmn/

##対応取引所
Cryptopia
https://www.cryptopia.co.nz/Exchange/?market=MAG_BTC
COINEXCHANGE.io
https://www.coinexchange.io/market/MAG/BTC?r=9897a909
https://www.coinexchange.io/market/MAG/LTC?r=9897a909
CryptoBridge
https://wallet.crypto-bridge.org/market/BRIDGE.MAG_BRIDGE.BTC
Crex24
https://crex24.com/exchange/MAG-BTC
https://crex24.com/exchange/MAG-USD
BiteBTC
https://bitebtc.com/trade/mag_btc
TimeDistributedでCNNを使った時の中間層の出力の抽出


# 0. はじめに
KerasでTimeDistributedを使った時に、中の畳込み層の出力を可視化したいと思ったんですが、
結構詰まったので記事にします。

# 1. 通常の中間層の出力の可視化
ここは実装していないんですが、以下の方法でできるみたいです。

```python3:get_feturemap.py
from keras import backend as K

#1層目の特長マップ
get_featurmap = K.function(model.layers[0].input, model.layers[0].get_output)

```
参考：https://github.com/keras-team/keras/issues/588

# 2. TimeDistributedの中身のConvolution層にアクセスする

GithubのTimeDistributedのコードを見てもget_outputがない．．．
どうやって中のConvolution層にアクセスしたものか．．．
TensorFlowだとノードでとりだせるから楽そうなんだけどなぁ

そこで，TensorFlowのページを見てみると
https://www.tensorflow.org/versions/r1.3/api_docs/python/tf/contrib/keras/layers/TimeDistributed#get_output_at
なんか使えそうなメソッドがあります。
このメソッドを使って中間層の出力を取り出します。

##2.2 とりだす学習モデルの構成
私が取り出した時の構成と少し変えていますが、動作するはずです。
下にあるような構成の学習済みモデルを作ったとしてください。

```python3:Model_Architecture.py
from keras.layers.wrappers import TimeDistributed
from keras.layers.convolutional import Conv2D, MaxPooling2D
model = Sequential()
model.add(TimeDistributed(Conv2D(32, (3, 3),
                                         kernel_initializer="he_normal",
                                         activation='relu'), input_shape=self.input_shape))
model.add(TimeDistributed(Conv2D(32, (3, 3),
                                         kernel_initializer="he_normal",
                                         activation='relu')))
model.add(TimeDistributed(MaxPooling2D()))
model.add(TimeDistributed(Conv2D(32, (3, 3),
                                         kernel_initializer="he_normal",
                                         activation='relu')))
model.add(TimeDistributed(Conv2D(32, (3, 3),
                                         kernel_initializer="he_normal",
                                         activation='relu')))
model.add(TimeDistributed(MaxPooling2D()))
model.add(TimeDistributed(Flatten()))
model.add(Dense(512))
model.add(Dropout(0.5))
model.add(Dense(self.nb_classes, activation='softmax'))
```
##2.3 Convolution層の出力を取り出す

```python3:get_featuremap_.py

from keras.models import load_model, Model
from keras import backend as K

# 学習済みモデルを読み込み
model = load_model(#saved_model)

#これでConvolution層にアクセスできる。
#get_output(0)の0はノード番号です。今回の場合0がConvolutionを表しています。
output_layer = model.layers[0].get_output_at(0)
#特徴マップ抽出関数を作ります．
get_output = K.function([model.layers[0].input], [output_layer])
#dataは入力データです．
#get_output()の出力は[array([..., ], dtype=tf.float32)とこんな構成になっているので、特徴マップを取り出したいときは[0]を指定してください。
output = get_output([data, ])[0]
```
上記の手順で，畳み込み層の出力が取り出せます。
最終出力ouputは(横, 縦, 枚数)と出てきますので注意してください．
これを自分の出力したいように整形、正規化してmatplotlibなりOpenCVなりで可視化してください．
ただし、注意ですが、出力枚数は**フィルタの枚数分**出力されます。
なので、可視化するときは1枚ずつだとか、3枚ずつにしないと可視化できません。
（32枚のチャネルって何！？ってなりますよね、一枚目が赤で、二枚目が緑で、三枚目が青、4枚目は透明度だとしても、5枚目からの扱いに困りますね）
TensorBoardのtf.summary.image()の出力も1チャネルか3チャネルか4チャネルの画像しか受け付けてくれません。

#3. さいごに
読んでいただきありがとうございます．
皆様の問題解決につながれば幸いです。
numpy.subtract.outer

```python
a = (10,4)
b = (2,3)
print(np.subtract.outer(a,b))
X = np.arange(3)
Y = X + 0.5
print(Y)
Z = np.subtract.outer(X, Y)
print(Z)
```
```
[[8 7] # 10-2,10-3
 [2 1]] # 4-2,4-3
[ 0.5  1.5  2.5]
[[-0.5 -1.5 -2.5]
 [ 0.5 -0.5 -1.5]
 [ 1.5  0.5 -0.5]]
```
# Refs
* [外積](http://www.deqnotes.net/acmicpc/2d_geometry/products)  
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1255804052
* [outer](https://deepage.net/features/numpy-outer.html)
ターミナルでアルファベットと数字を含む任意の桁数の乱数を発生させたい時に



## 環境
OS: macOS 10.12.6(Sierra)
ターミナル: iTerm2
シェル: zsh


## 実行コマンド
```zsh
❯ cat /dev/urandom | LC_CTYPE=C tr -dc 'a-zA-Z0-9' | fold -w 40 | head -n 8 | sort | uniq
```

## 実行結果例

```zsh
❯ cat /dev/urandom | LC_CTYPE=C tr -dc 'a-zA-Z0-9' | fold -w 40 | head -n 8 | sort | uniq
19ykz9OKn30QvWaE267fm8gLKpN2mIffQjdGbqAB
50Qmrd6gFDiYjee73HOyj5GYnCAkz7AUae2PEIBN
N9oJSBNNjxygfhjicl1yysMQRdOzYG1TlhALJKhs
UlBdrceE3Y6pZ7KiucIh6QuGrBA6hXTAZOgbeyoV
XtneY9EoADdp6tp44qEIZw8Ajh0a0Shr5CsRT1ZR
hKIwqztQ6kpwrK9Zp30CMDgCl4GcPJME5PcDPeup
lw6tzEQHnt1bZXLKSdxIhL6sMDY48bUrH8OQ2E23
oegreHK5w6zBDbcPOqXLtDjkySwFuOzZsO9PVP8B
```

LC_CTYPE=Cがないと

```zsh
❯ cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 40 | head -n 8 | sort | uniq
tr: Illegal byte sequence
```

とエラーを吐くので注意
備忘録　－　IPとTCPとUDPのメモ書き

アウトプットも兼ねた自分用備忘録。

##そもそもプロトコルとは

通信するときのお約束。
これがあるから、違う機器同士で通信できる。

##IPとは

Internet Protocolの略。データの送信元から宛先へ送る役目を持つ。
これがないとそもそも通信できない。
IPによって出来上がっている世界規模のネットワークをインターネットと呼ぶ。
ネットワークに接続された機器全てに固有の識別番号を割り当てる。これがIPアドレス。

ざっくり言うとネットワーク上の住所のこと。

よくある「192.168.1.XXX」みたいなのはIPv4アドレス。
世界中の機器に割り当てるには数が足りないので、だいたいLANでしか使えないやつ。
本当はグローバルIP（外部から見えてるIPアドレス）を持ってる機器じゃないとインターネットできない。

IPマスカレードっていう仕組みででグローバルIPからローカルIPの変換、
ついでにポート番号も変換してインターネット見れる機器を増やしてる。

##TCPとは

Transmission Control Protocolの略。
ネットワーク層とL4より上位の階層のプロトコルの橋渡し役。
3ウェイハンドシェイクを用いて信頼性の高い（切断しにくい）通信を実現する。

仕組みは以下のようなイメージ。つまり、相手が準備できたら通信を始めるから切れにくい。
送る側が受け手側にデータ送っていいか確認
↓
受け手側から送る側に、セッション張っていいか確認
↓
送る側がオッケーを返してから通信を始める。

###2017/12/30 追記
データの送信は、受信側から送信側へ「データをここまで受け取った」というのを報告しながら進む。
送信側は、この報告を受けつつ次の送信作業を行う。
また一定時間報告が来なければ、正常に受け取れなかったと判断してデータの再送も行う。

この仕組みで、確実にデータを送ることができる。

セッションを切断するときもハンドシェイクをしてから切断をする。

##UDPとは

User Datagram Protocolの略。
TCPと同じで、ネットワーク層とL4より上位の階層のプロトコルの橋渡し役。

TCPとの違いは、3ウェイハンドシェイク的な仕組みがないこと。
信頼性は落ちるけど、その分高速に処理できる。投げっぱなし。

###2017/12/30 追記
投げっぱなしである性質を利用して、複数の送信先に同じデータを送ることもできる。


**結論、使い分け大事**
遺伝子配列を奏でたら癒された


かねてから思っていたことがありました。
**「遺伝子配列を音階にしたらどんな旋律になるのだろう」**

ラズパイ付属のソフトを使って、遺伝子を演奏してみました。
結果は思いの外いい感じで、すさんだ心を癒してくれました。
これから自宅でくつろぐ時にはさまざまな遺伝子の調べを聞くのが習慣になりそうです。


## 実行環境
- Raspberry pi 3
  - ブレッドボード、赤色LED、抵抗330Ω、ジャンパーワイヤ（オスオス）×2、40ピンケーブル
  - 電子工作は [こちら]("https://liginc.co.jp/283979") を参考にさせていただきました
- Sonic pi 2.11（演奏ソフト）[^1]
- Python 3.4.2
  - BioPython（アミノ酸翻訳部分に使用）[^2]
  - python-sonic（Sonic piをPythonから呼ぶためのライブラリ）[^3]

## ソースコード
https://github.com/emihat/genome_sonic

### 処理内容
1. 入力されたｍRNA配列をBioPythonを使ってアミノ酸に翻訳する[^4]
2. アミノ酸配列を音階（ドレミ...）に割り当ててSonic piで演奏する
  - 分子量の大きい→小さい順に、低い→高い音（ドから2オクターブ上のシ）を割り当てる [^5]
  - コーディング領域（開始コドンと終止コドンの間）は音色を **派手な感じ** に変える
  - 終止コドンで **合いの手** を入れる（結果の動画ではわかりづらいですが、短い叫び？が入っています）
3. コーディング領域は **派手な感じを出したい** ため、ラズパイにつないだLEDを光らせる


## テストデータ
- お好きな遺伝子のｍRNA配列のFastaファイル（マルチFastaでもOK）
  - 今回は Serotonin 5-HT3 receptor(D49394.1)のｍRNA配列を使用[^6]

## 実行結果
https://twitter.com/emi_2sheds/status/945680716062265344
※音が出ます

### 感想
- ノンコーディング部分がオルゴールみたいでなかなか良い
- **画面表示と音とLEDが全部ずれている** のは味です


## 今後の課題
- コーディング部分の音色が汚いのをなんとかする
- ~~6フレームでの翻訳に対応する~~　※多分やらない
- ~~翻訳後修飾への対応（半音上げる下げるなど）~~　※多分やらない
- リピート領域を延々と聞いてみたい
- 変異を耳で検出できるようになりたい

[^1]: ラズパイに入っていたものを使用。Windows／Mac／Linuxにもインストールできるらしい。
[^2]: $ pip install biopython で入れた。
[^3]: $ pip install python-sonic で入れた。
[^4]: 塩基配列そのままだと4音しかないため、アミノ酸に翻訳して音を増やします。
[^5]: 「大きいものは低音な気がする」というフィーリングベースの独自ルールです。科学的根拠はありません。
[^6]: 配列情報はUCSC Genome Browserより取得。
sicpの両替問題を末尾再帰化

# SICPで宿題とされていた両替問題の末尾再帰化

今SICPを読んでいるのですが、1.2.2「木の再帰」の章に以下の一文があります。

> count-change は、fib の一つ目の実装同様、冗⻑な木の再帰のプロセスを生成 します (292 の計算にはかなりの時間がかかるでしょう)。一方で、答えを計算 するためのよりよいアルゴリズムをどう設計するかというのは自明ではありま せん。この問題は、読者への宿題とします。

これめちゃくちゃ気になってずっと考えていたのですがわからず、調べてみてもメモ化したコードばかりで末尾再帰化したものがありませんでした・・・
そんな諦め掛けていた時以下のコードを見かけました！！

```racket
(define (count-change-true-iterative amount)
  ;; penny is not in the signiture, bacause it equals (- amount
  ;;                                                     (* half-dollar 50)
  ;;                                                     (* quarter 25)
  ;;                                                     (* dime 10)
  ;;                                                     (* nickeli 5))
  (define (count-iter sum half-dollar quarter dime nickeli)
    (cond ((> (* half-dollar 50) amount)
           sum)
          ((> (+ (* half-dollar 50)
                 (* quarter 25)) amount)
           (count-iter sum(+ half-dollar 1) 0 0 0))
          ((> (+ (* half-dollar 50)
                 (* quarter 25)
                 (* dime 10)) amount)
           (count-iter sum half-dollar (+ quarter 1) 0 0))
          ((> (+ (* half-dollar 50)
                 (* quarter 25)
                 (* dime 10)
                 (* nickeli 5)) amount)
           (count-iter sum half-dollar quarter (+ dime 1) 0))
          (else (count-iter (+ 1 sum) half-dollar quarter dime (+ nickeli 1)))))
  (count-iter 0 0 0 0 0))

(count-change-true-iterative 100)
```

完璧じゃないですか・・・・！！
`50a + 25b + 10c + 5d + e = 100`あたりでアプローチを掛けていけばいいとネットでヒントを見つけていたのですが、末尾再帰というワードやSICPの本文中にある木の再帰にとらわれ過ぎて全然思いつかなかったです。
答えをみてみれば簡単なんですよね〜

一見、単にボトムアップで一番価値の低いコインから順に一つづつ場合の数を数えていくだけの地道な方法ですが、SICPのコードと計算時間を比較してみると一目瞭然でした。（100000とかで試してみてください！全然違います！）

いや〜面白い！！


SICP読まれるような方なら説明するまでもないと思いますが、簡単に処理の流れを自分のために書いておきます。

```

50セント,25セント,10セント,5セント,1セント // コインの価値と種類


<< 1ドル（100セント）を5種類の効果で場合分けする場合 >>
• 前提として1セントは100枚すでに設定されている。そこがスタートになる。
• 1セントは5セントの数で自動的に決まるので考慮に入れない(5セントが19枚の時は自動的に1セントは5枚になる)
• ボトムアップ方式で5からカウントアップしていく

- 1セントのみでまず場合の数をカウントアップ、同時に5セント硬貨の使用枚数を一枚増やす（一通りしかないので1回だけです）
- 5セントと1セントの場合の数を数えあげる（両替に使用する5セント硬貨の使用枚数を増やして、1セント硬貨の使用枚数を減らすイメージ）
- 10セントと5セントと1セントの場合の数を数えあげる(10セント硬貨を1枚増やしたらひたすら5セント硬貨の使用枚数を増やしていき、100を超えたら10セント硬貨を2枚にして5セント硬貨を0からサイドカウントアップ！これを10セント硬貨だけで100を超えるまで繰り返す)
- ....以下同様に続きます


```
Windows版Bitnami redmineでは氏名を漢字入力してはいけない

タイトル＝結論です。

# 問題発生から原因特定まで
* Windows7 32bit / Bitnami redmine 3.4.3.1
* 軽い気持ちでインストール（エラーなし）
* 当該ページにアクセスしても、Internal error 500とやらで開けない
* apacheのproduction.logを見ると、あるはずのDBテーブルがない模様。

```
ActiveRecord::StatementInvalid (Mysql2::Error: Table 'redmine.settings' doesn't exist: SHOW FULL FIELDS FROM `settings`):
```

* 海外で同じ事例でインストーラーログをみて原因特定しているのを見かけたので、同じ手法で調査を企む
    * [Redmine-3.2.0-0 access redmine occurs error: Internal error](https://community.bitnami.com/t/redmine-3-2-0-0-access-redmine-occurs-error-internal-error/38763)


## インストーラーログの有効化
* [Windows インストーラーのログの記録を有効にする方法](https://support.microsoft.com/ja-jp/help/223300/how-to-enable-windows-installer-logging)
    * HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Installerを追加
    * キーLoggingを追加して値:voicewarmupxで設定
* 同様にインストーラー実行するとC:\Users\ユーザー名\AppData\Local\Tempにlogファイルが生成される

## インストーラーログファイルの中身
* bitrock_installer.log

```
Script stderr:
 rake aborted!
SyntaxError: D:/Bitnami/redmine-3.4.3-1/apps/redmine/htdocs/db/migrate/001_setup.rb:291: invalid multibyte char (UTF-8)
D:/Bitnami/redmine-3.4.3-1/apps/redmine/htdocs/db/migrate/001_setup.rb:291: invalid multibyte char (UTF-8)
D:/Bitnami/redmine-3.4.3-1/apps/redmine/htdocs/db/migrate/001_setup.rb:291: syntax error, unexpected end-of-input, expecting keyword_end
    user = User.new :firstname => "***文字化けした文字列***",
```

* ユーザー名が文字化けしてるということは、、、
![bitnami1.jpg](https://qiita-image-store.s3.amazonaws.com/0/202646/d5ed993b-9091-3841-632d-fa6cdf14eacd.jpeg)

**ここの表示用氏名って日本語NGかよ！エラーもなくDB初期化がabortすんなよー！**

# 後始末
* インストーラーログの無効化

> 注: この変更はトラブルシューティング目的にのみ行ってください。また、システムのパフォーマンスとディスク領域に悪影響があるため、変更したままにしないでください。

# こんなことで実働4～5時間掛けてしまったがそんなもん？
今日のワンライナー

自分用メモ

```ps1

# Windowsサーバのディスク使用率を出力したパフォーマンスCSVファイル1ヶ月分(30ファイル)から、使用率のトップ３を取得する

gc [CSVを置いた場所]¥*.csv |sort |select-string "^`"20"|% {$b = "$_" -replace "`"","";$arr = new-object psobject -property @{date=($b).split(",")[0];time=($b).split(",")[1];use=($b).split(",")[2] -as [double]};$arr}|group use |sort name -desc|select -first 3

```
xdebugでリモートデバッグ (apache on docker,Visual Studio Code)

# 環境

- macOS High Sierra
- Docker Version 17.09.1-ce-mac42 (21090)
- Visual Studio Code バージョン1.19.1 (1.19.1)

# Visual Studio Code

- 拡張機能[PHP Debug]をインストール
- デバッグしたいソースのあるフォルダを開き[shift + cmd + d]を押下しデバッグウィンドウを開く
- 構成の追加から以下の構成を追加する

~~~ 
{
    "version": "0.2.0",
    "configurations": [

        {
            "name": "XDebug on docker",
            "type": "php",
            "request": "launch",
            "port": 9000,
            "pathMappings": {
                // {apache上のdocument root}:{ローカルのdocument root}
                "/var/www/html":"${workspaceRoot}/"
            }
        }
    ]
}
~~~ 

###### 例


|docker上のソースのパス|ローカルのソースのパス|Visual Studio Codeで開いたフォルダ|
|:--|:--|:--|
|/var/www/html/hello.php|~/www/html/hello.php|~/www/html|
UniRx Quiz

# 背景

前回 [作りながら理解する UniRx](https://qiita.com/mattak/items/106dfd0974653aa06fbc) という記事を書きました。
Rxの基本の仕組みを解説したのですが、それからもう一歩次にUniRxの理解を深めてくれるような何かがないかなと考えていました。

もう少し踏み入って実際のUniRxの関数など知ってもらえる手段として、Quiz形式にしてみたらどうかと思い立って作ってみました。

# UniRx Quizとは？

nunitで書かれたQuizTestのFIXMEの該当箇所を変更することで、答えていくQuizです。

<img width="271" alt="quiz.png" src="https://qiita-image-store.s3.amazonaws.com/0/15000/945a913d-531f-9122-2a81-37e2fa93a39e.png">

QuizTest.csにクイズが、AnswerTest.csに答えが載っています.
すべてのQuizTestをpassする頃には、一人前のRx使いになれるでしょう(たぶん).

## Q1: 1を出力する Cold Observable をつくれ

```csharp
[Test]
public void Q1()
{
    var observer = new TestObserver<int>();

    // Q. 1を出力する Cold Observable をつくれ
    var observable = (IObservable<int>) null; // FIXME
    observable.Subscribe(observer);

    // CHECK
    Assert.AreEqual(1, observer.CountNext);
    Assert.AreEqual(1, observer.NextList[0]);
}
```

みたいな感じの問題がひたすら書かれています。

# 解きかた

レポジトリ
- https://github.com/mattak/UniRxQuiz

手順:

1. [UniRxQuiz](https://github.com/mattak/UniRxQuiz)をcloneしてそのまま開くか、[unitypackage](https://github.com/mattak/UniRxQuiz/releases)をDLしてimportします.
2. Unitテストを実行します. (Window > Test Runner > Run All)
3. QuizTest.cs のFIXMEを修正して、testをpassするように修正します
4. 最後に AnswerTest.cs の中身と比べて正答かどうか確かめてみてください.

# その他

まずは初学者向けにということで、基本的な関数の使い方を紹介するようなQuizしか用意してないです。
なんか面白い応用的なQuizあれば、PRくれると嬉しいです！
WordPress管理ページ上でドメイン変更を行った瞬間ログイン出来なくなった。

# 環境
- ConohaのVPS
- WordPress
- KUSANAGI
- nginx
- centOS 7.4.1708

# ここまでのいきさつ
1. お名前.comでドメイン取得。  
2. お名前.com上でDNSレコード設定を行った。
3. 新ドメインでアクセスしたらnginxの初期ページだった。  
→本当はWPのトップに遷移してほしいなと思ってた。
4. WordPressの管理画面の方で、新ドメインに変更。<img width="613" alt="スクリーンショット 2017-12-26 23.17.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/226532/7f89a9bf-b3a5-be48-cfeb-876633e21373.png">
5. **"変更を保存"した瞬間、ログインできなくなった。**

# 行ったことについて
参考にさせていただいたサイト
[KUSANAGIで検証したWordPressサイトを本番用に変更する 【KUSANAGI 移行日誌FINAL】](http://web-sticky.com/2017/05/03/kusanagi%E3%81%A7%E6%A4%9C%E8%A8%BC%E3%81%97%E3%81%9Fwordpress%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92%E6%9C%AC%E7%95%AA%E7%94%A8%E3%81%AB%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B/)
## 1. nginxのドメイン指定を変更する。
1.ターミナルからsshでログイン
<img width="385" alt="スクリーンショット 2017-12-26 23.35.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/226532/a4b3a754-93b0-b0b3-6cf6-b4239968e8f7.png">

2.rootに変更。 
```su```

3.【プロビジョン名】_http.confのバックアップをとっておく。(万が一の為に)

```cp /etc/nginx/conf.d/【プロビジョン名】_http.conf /etc/nginx/conf.d/BU_【プロビジョン名】_http.conf```

4.confファイルのserver_nameを書き換え
```# vi /etc/nginx/conf.d/【プロビジョン名】_http.conf```
７行目あたりにserver_nameと記載されているはずなのでそこを新ドメインに変更し上書き保存。
<img width="204" alt="スクリーンショット 2017-12-26 23.50.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/226532/9a75396c-b87d-59fc-a5b5-daf646be348d.png">
## 2. KUSANAGIプロファイルのドメイン設定を変更
1./profile.confのバックアップをとっておく。
```# cp /etc/kusanagi.d/profile.conf /etc/kusanagi.d/BU_profile.conf```

2.プロファイルのKUSANAGI_FQDNを書き換え
```# vi /etc/kusanagi.d/profile.conf```
４行目あたりにKUSANAGI_FQDNという箇所があるのでそこを新ドメインに変更し、上書き保存。
<img width="213" alt="スクリーンショット 2017-12-27 0.04.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/226532/e0702861-ea41-bb26-8af5-a62a26d3a5b8.png">

3.サーバーの再起動
```reboot```

### ここまでやって新ドメインでアクセスしてブログトップが表示されれば成功！
Lambdaの環境変数を用いた、条件分岐の注意点

#はじめに
*「Python、、、。あぁ、あまり型気にしないでかけるやつでしょ！」*位の認識しかないPython初学の私が、Lambdaの環境変数を使用して条件分岐をする関数を作成した時にハマったところについてです。

#検証環境
Lambda関数の、ランタイムはPython2.7を使用しています。
（3.6でも同じだとは思いますが、未検証です。）

#つまずいたポイント
Lambda関数内での、環境変数の取り出し方についてはネット等で検索してみて下さい。

私が今回実装しようとしたのは、次の要件のものです。

- Lambda環境変数(キー名：number）より、数値を取得する
- 環境変数より取得した値に応じて、if文を用いて処理を分岐させる

ひとまず、ネット等々で調べつつ次のように実装。

```python:lambda_function.py
import os

def lambda_handler(event, context):
    if os.environ['number'] > 20:
        return 'OK, Your Number is over 20.'
    else:
        return 'NG, Youe Number is under 20.'
```
###実行結果（number=30の時）
<img width="872" alt="スクリーンショット 2017-12-26 23.43.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/218674/e7daa910-0beb-7fb4-c2ca-94969cce5495.png">

さて、このような状態でLambda環境変数の値を、２０⇨１０としてみたいと思います。

###実行結果(number=10の時）
<img width="873" alt="スクリーンショット 2017-12-26 23.49.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/218674/dc3bc9e9-84d4-a055-d85c-f014dff21396.png">

なんということでしょう、、、実行結果がうまく変わりません。以後、どんな値を入れ続けても'OK, Your Number is over 20.'を返し続けます。

#解決
「ん？環境変数から取得した値って、本当に“数値”として認識しているのかな？」と思った私は、次のようにコードを改変しました。

```python:lambda_function.py
import os

def lambda_handler(event, context):
    if int(os.environ['number']) > 20:
        return 'OK, Your Number is over 20.'
    else:
        return 'NG, Youe Number is under 20.'
```
改変後に、先ほどと同じテストをしてみると。。。
###実行結果(number=30の時）
<img width="873" alt="スクリーンショット 2017-12-26 23.57.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/218674/e7510636-df91-b072-9b50-9a41e6b2fbc2.png">
###実行結果(number=10の時）
<img width="875" alt="スクリーンショット 2017-12-26 23.57.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/218674/ff6c5e50-b9ab-8dd4-8a23-4779ee594ec0.png">

なんと！！予想していた通りの実行結果になりました！！

#まとめ
【環境変数を取得して使用する場合には、“型”をしっかりと明記する！】

間違いやアップデートがあり次第、追記していきたいと思います。
以上、お付き合いいただきありがとうございました！！また！！！
UnityのAndroidアプリを作っていたら使っていないのに電話権限を要求されるようになった。

> ## 追記2019/04/12
もう、このremoveで権限要求のポップアップを削除するのはできなくなったようです。
最新版のadmobやapplovinSDKを入れると表示されなくなるので、がんばってそちらを入れましょう。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/e48ad7da-9ee2-f9f3-a5a3-194d30d6330d.png)


**READ_PHONE_STATE**
このパーミッションを、、
ソースコード全体をGrepで横断検索しても見つからず、、




Unityや、AndroidSDK、各facebookSDK等色々のもの関係があり、
Unityでビルドする際にREAD_PHONE_STATEなどのパーミッションが付与されているようです。

それで、解決策！

https://github.com/facebook/facebook-sdk-for-unity/issues/58

上記記事より、
**神コード**発見！
権限上書きリムーブ！

```

<uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove" />

```

### 味噌はこれです！
```
〜tools:node="remove"〜
```



## 追記

* 最近わかったのですが、READ_PHONE_STATEの許可せずにAdmobSDKの動画リワードを再生すると、動画再生されない事象がありました。（許可すると再生された。）
* Admobのインタースティシャルや、バナー広告は許可しなくて表示されたなので、
パーソナライズで使っているのでしょうか。。。
（直近EUの**GDPR**問題もあるので、パーソナライズ周り気をつけないとですね。）

※最近はアプリはこの権限要求のダイアログ当たり前のようにでますね、、w
Excel VBA フィルダウンをコードで書くと

#使い道
Excelで１つのセルに関数を書いたのちに、
対象の行分フィルダウンすることありますよね？
（フィルダウンすると勝手に関数の中の行番号や、列名が変わってくれるやつ）

VBAでは.copyをして、.pasyをする手ももちろんありますが、
実は１つのメソッドで書けるのだ。

#メソッド
Range("A1:Z1").AutoFill Destination:=Range("A1:Z10")

最初の"A1:Z1"がフィルダウンしたいセル群。
最後の"A1:Z10"がフィルしたい範囲
最初に選択した部分も範囲に含めることがポイント
※含めないとエラーになります。