OmniAICreator/Qiita-1.07M huggingface dataset:
Unityで16進数そろばんアプリを作った

# はじめに
これは[クソアプリ2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/kuso-app2)の9日目の記事となります。

現在のそろばんは上珠1つ下珠4つで、0～9を表して繰り上がりは左隣で処理します。
つまり、10進数となるわけです。
それでは、上珠2つ下珠5つで 0～15と表せば16進数となるわけです。

情報処理試験では、16進数の計算問題が出てきます。
そろばんをそれなりのレベルまで習った人は、頭の中にそろばんを思い浮かべて素早い計算が出来るとのことです。
そんなのが出来れば、16進数の計算が素早く計算が出来るようになる・・・ま、訓練次第ではね。
そこがクソアプリ所以ってことですね。

# 16進数そろばん
## 10進 48 + 51 = 99
最初は通常の10進計算です。桁上りを10進にするためDecにチェックを入れます。
![48Plus51.gif](https://qiita-image-store.s3.amazonaws.com/0/14053/5816a2be-18a6-c26b-6fca-060c5e794c41.gif)

## 16進 F4 + 8A = 17E
桁上りを16進にするためHexにチェックを入れます。
![F4Plus8A.gif](https://qiita-image-store.s3.amazonaws.com/0/14053/61cb9f13-7a4d-ec10-0d8f-6117683644f4.gif)

# そろばんの歴史
* [アバカス(abacus) - wiki](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%90%E3%82%AB%E3%82%B9)
* [そろばん - wiki](https://ja.wikipedia.org/wiki/%E3%81%9D%E3%82%8D%E3%81%B0%E3%82%93)
* [そろばんの歴史 - 日本珠算連盟](http://www.shuzan.jp/gakushu/history/)
* [江戸の数学 年表](http://www.ndl.go.jp/math/chronology.html)

算盤の起源は中国です、当時の中国の算盤は上珠2つ下珠5つとなっていました。
中国の算盤が上珠2つ下珠5つだったのは、当時の目方(尺貫法)の単位が1斤を16両(16進法)としていたので、1桁に15までおけるものが重宝だったといわれています。

室町時代末期に宋(中国)の商人が日本に伝え、日本にもこの形が輸入されました。日本では16進数の計算は必要ではなかったのですが、江戸時代の乗算や除算の方法では、一時的に1桁に10以上溜まる場合もあったこともあり、江戸時代までは上珠2つの形式が多く使われていました。
中国から伝来した当初には枠が大きく珠の形状が丸かったが、日本では江戸時代にそろばんが広まっていくうち枠の大きさが手の大きさに合わせて小さめに珠の形状がすばやく計算しやすいよう円錐を2つ合わせた菱形のような形に変化していきました。

明治時代になって不要な5珠を1つ減らした上珠1つ下珠5つの形が普及しました、現在の上珠1つ下珠4つに統一されたのは1935年(昭和10年)となります。速算術では5珠だと遅くなってしまいます、一番下の珠は残して使ってた人も多いようです。
下珠5つは位が上がることを確認する意味があり、間違いが致命的になる商人の方には使われていました。

このように日本の算盤は高速で計算できるように工夫がなされてきており、このことが世界的な普及につながっています。国際的にメートル法が使用される現在では中国でも上珠1つ下珠4つの算盤が普及してきているとのこと。

# GitHubに公開
GitHubには、無料でWebページを公開できるGitHub Pagesというサービスがあります。
参照：[WebGL投稿先としてGithubを使ってみる](http://for.hatenablog.jp/entry/2017/07/11/021333)

![Abacus16.png](https://qiita-image-store.s3.amazonaws.com/0/14053/ebdeda18-f352-979e-1b9e-b2b9a0232aa7.png)
https://yaju.github.io/WebGLBuild/Abacus16/

10進モード(Dec)の際に全ての珠を使うと計算が合いませんが、これは仕様です。
昔の5珠時代は確認してから払いをして位を繰り上げるという手順になっていたからです。

ソースリストはこちらになります。
https://github.com/yaju/Abacus16

# 最後に
1年前に作ったものを問題文を出すように改良するつもりだったんですが間に合わず、そのまま記事をリライトした形になってしまいました。
[【Unity】8月8日はそろばんの日 16進そろばんを作ってみた。](https://qiita.com/yaju/items/9689903e294007fdeaee)
ローカル環境でCakePHPを使ってHello worldを出す

OS: Mac 
まずは公式サイトからインストール
https://book.cakephp.org/3.0/en/installation.html

なんかプロジェクト名をつける。
ターミナルで　bin/cake server  コマンド使ってサーバー起動
You must enable the intl extension to use CakePHP ってエラーが出る
PHPにintlって拡張モジュールがなかったみたいだったのでintl をインストール

Mac だとyumよりてbrewコマンドでインストールした方が上手く行くっぽい。
php で　intl のインストールが成功したらもう一度公式サイトから　CakePHPインストールしたら上手くいった。

指定されたURL、多分http://localhost:8765/ 入力すると初めの画面が出る。

MAMPのローカル環境を使ってたので次はMAMPのhtdogs内にインストールしたCakePHPフォルダを打ち込む

初めの設定として/config/routes.php の
$routes->connect('/', ['controller' => 'Pages', 'action' => 'display', 'home']);
 $routes->connect('/test', ['controller' => 'Test', 'action' => 'index']); //★ここを追加！
を追加

次にControllerの設定
/src/Controller/ 内にHelloController.php作成
//HelloController.php
namespace App\Controller;
use App\Controller\AppController;
class HelloController extends AppController {
    public function index() {
     $this->set("message”,”Helloworld!”);
	}
}
追加。

次にTemplateの追加
/src/Template/Test 内にindex.ctpを作成

<?php
//index.ctp
?>
<div>
    <h1>Helo Wrold!</h1>
    <p class="text-red"><?= $teststr ?></p>
</div>
追加。

次にsrc/ViewにHelloを作成してindex.ctp作成
<!DOCTYPE html>
<html lang="ja">
<head>
</head>
<body>
   <?php
echo $message;
?>
</body>
</html>
追加。
とりあえずこんな感じ。

これでHelloworldでるはず。
デバッガ活用方法をまとめてみる

今回はデバッガであるbinding.pryに関してまとめていきます。

##導入方法
```
$gem 'pry-byebug', group: :development
```

こちらをGemfileに記述し、`bundle install`です。

##使い方
コントローラーでデバッグを行いたい場合は

```
def show
  binding.pry
  @product = Product.find(params[:id])
end
```
viwesでデバックを行いたい場合は、

```
<h2>
   <%= product.name %>
</h2>
<% binding.pry %>
```
といったように差し込むことでブレイクポイントでデバッガが止まります。

ここからはコントローラーを例にして紹介していきます。

``binding.pry``を差し込み、``bundle exec rails s``をすると

ターミナル上では以下のようになります。

```
    2: def show
    3:   binding.pry
 => 4:  @product = Product.find(params[:id])
    5: end
```
このように表示されたらデバッグが成功している証しです。

自分が中身を見たい変数をターミナル上で直接打ち込むことで、中身が見れちゃいます！

便利ですね〜

```
[1] pry(#<ProductsController>)> @product
=> #<Product:0x00007fd17d0f99d8
 id: 1,
 name: "Bag",
 available_on: Tue, 30 Oct 2018 17:12:46 JST +09:00,
 deleted_at: nil,
 created_at: Tue, 30 Oct 2018 17:12:46 JST +09:00,
 updated_at: Tue, 30 Oct 2018 17:12:58 JST +09:00
```

例に出していたviewsでは、``product.name``を取り出したい場合は、``product.name``と変数名をターミナルに直接打ち込むことで、中身を確認することができます。

##関連付けも調べられる
仮にproductテーブルがtaxonsが関連付けされているとします。

その場合だと

```
[2] pry(#<ProductsController>)> @product.taxons
=> [#<Taxon:0x00007fd17bbd9ee0
  id: 6,
  parent_id: 5,
  position: 0,
  name: "Shirts",
  permalink: "categories/clothing/shirts",
  taxonomy_id: 1,
  lft: 7,
  rgt: 8,
  created_at: Tue, 30 Oct 2018 17:12:47 JST +09:00,
  updated_at: Tue, 30 Oct 2018 17:12:58 JST +09:00
```
といったように関連付けされている中身まで調べることができちゃいます！

##小技

他にもbinding.pryを差し込むことで利用できる小技を紹介していきます。

###next
```
 def show
    binding.pry
    @product = Product.find(params[:id]) 
    @product_properties = @product.product_properties.includes(:property)
 end
```
このようなコードだった場合、binding.pryを実行すると、先程のように``@product = Product.find(params[:id]) ``で止まってしまいます。

その際にnextを打ち込むことでブレイクポイントを次の行に移動させることができます。

```
    2: def show
    3:   binding.pry
    4:   @product = Product.find(params[:id])
 => 5:   @product_properties = @product.product_properties.includes(:property)
```

###step
次の行または、メソッドの内部に入ることができます。

```
   107: def #{name}
 =>108:   association(:#{name}).reader
   109: end
```

###finish
現在のメソッドを抜け出すことができます。

###exit,continue
次のブレイクポイントがある場合は、そこまで実行。

(ブレイクポイントがない場合は終了します。)

Ctrl+Dでも同様に機能します。

###!!!
ブレイクポイントがあったとしても強制終了。

強制的にデバッグを終わらせたいときは便利ですね！

##まとめ
私もデバッガに関しての理解はまだまだですが、デバッガを上手く活用することで、実装に大きく役に立つことは間違いないです。

ぜひPryを使いこなして効率良いデバッグを行ってください～！

また他に何かデバッガに関する便利な使い方などございましたら、教えてくださると幸いです。

【参考記事】
https://doruby.jp/users/takeshita/entries/Rails-%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%AE%E7%82%BA%E3%81%ABpry%E3%82%92%E4%BD%BF%E3%81%84%E3%81%93%E3%81%AA%E3%81%99
Laravelでsitemap.xmlを動的に作る！

# GameWith Advent Calendar 2018

この記事はGameWith Advent Calendar 2018 の11日目になります！

# はじめに

今回はLaravelに作ったサイトにsitemapl.xmlを追加する方法を書いていきます。

※実際にこんな感じで表示されます

[https://www.holy-place-photo.com/sitemap](https://www.holy-place-photo.com/sitemap)

<img width="789" alt="スクリーンショット 2018-12-09 12.52.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/81308/9b9eba23-e1ce-2177-b2b2-a633e10a4aa5.png">

# 前提

- Laravel version 5.6

# laravelium/sitemap

利用するのは[laravelium/sitemap](https://github.com/Laravelium/laravel-sitemap)というパッケージです。

まずインストールをします。

`composer require laravelium/sitemap`

githubにはLaravelのバージョンに合わせてパッケージのバージョンが書かれていたので、合わせたほうがいいかと思います。

#### For Laravel 5.7

`"laravelium/sitemap": "3.0.*"`

#### For Laravel 5.6

`"laravelium/sitemap": "2.8.*"`

#### For Laravel 5.5
`"laravelium/sitemap": "2.7.*"`

次に必要なファイルを生成します。

`php artisan vendor:publish --provider="Laravelium\Sitemap\SitemapServiceProvider"`

# コーディング

必要なファイルを生成したら、ルーティングとコントローラーを記述します。



```php:routes/web.php
Route::get('/sitemap', 'SiteMapController@sitemap'); 
```

```php:app/Http/Controllers/SiteMapController.php
<?php

namespace App\Http\Controllers;

use App\Model\Photo;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\URL;
use Carbon\Carbon;

class siteMapController extends Controller
{
    public function sitemap(){
        $sitemap = App::make("sitemap");
        $now = Carbon::now();
        $sitemap->add(URL::to('/'), $now, '1.0', 'always');
        $sitemap->add(URL::to('/photos/create'), '2018-10-28', '1.0', 'monthly');

        $photos = Photo::orderBy('updated_at', 'desc')->get();
        foreach ($photos as $photo)
        {
            $sitemap->add(URL::to('/photos/' . $photo->id), $photo->updated_at, '0.8', 'yearly');
        }

        return $sitemap->render('xml');
    }
}
```

詳しくはこちらの公式GitLabのWikiに書いてあります。

[https://gitlab.com/Laravelium/Sitemap/wikis/home](https://gitlab.com/Laravelium/Sitemap/wikis/home)

# おわりに

めちゃくちゃ簡単ですね！

最後の`$sitemap->render('xml')`を`$sitemap->store('xml', 'mysitemap');`とすることで、XMLファイルとして出力することも可能っぽいです。

ルーティングに新しく追加したら、サイトマップの更新も忘れずにやりましょう！

~~絶対忘れそう・・・~~
UIPageViewControllerをUITableViewCellに乗せるときにハマった話


先日、とあるアプリで、UIPageViewControllerをUITableViewCell上に乗せて表示してみたところ、少しハマるポイントがあったので、それを紹介します。（そもそもそんなことする必要ある？みたいな話は一旦置いておいていただけるとありがたいです。）

#サンプル
以下の画像のようなセル上にUIPageViewControllerを表示させるレイアウトを作成しました。
グレーの部分がUIPageViewControllerで、ページのViewController内のボタンをタップすると次の画面にプッシュで遷移するといった実装になっています。
![Simulator Screen Shot - iPhone 7 - 2018-12-09 at 13.29.37.png](https://qiita-image-store.s3.amazonaws.com/0/152335/971e940d-695c-43c0-58ae-db608c6bad55.png "Simulator Screen Shot - iPhone 7 - 2018-12-09 at 13.29.37.png")

少しスクロールした状態で、遷移した後に、この画面に再び戻ってくると、UIPageViewControllerの位置が下にずれて、UIPageViewControllerのviewをaddSubviewしたViewの背景色である緑色が出てきてしまいます。
![Simulator Screen Shot - iPhone 7 - 2018-12-09 at 13.37.28.png](https://qiita-image-store.s3.amazonaws.com/0/152335/5b688806-126e-844f-6d0c-9b6dc9a8845e.png "Simulator Screen Shot - iPhone 7 - 2018-12-09 at 13.37.28.png")

これは、iOS11やiOS12では起こらず、**iOS10でのみ起こる問題です。**

#原因
UIPageViewControllerの中に表示するUIViewControllerのViewがSafeAreaに対してレイアウトを指定していため、レイアウトの崩れが起こっていました。

![スクリーンショット 2018-12-09 13.43.04.png](https://qiita-image-store.s3.amazonaws.com/0/152335/58b6e69e-6200-9fad-4e2a-a335c7bc08e1.png "スクリーンショット 2018-12-09 13.43.04.png")

どういうことが起こっていたかというと、SafeArea対してレイアウトを設定していたため、スクロールされていない状態だと、UIPageViewControllerはSafeArea上にかぶらないので、うまく動作しますが、スクロールした後に画面遷移などをしてAutoLayoutが再レイアウトが行われると、スクロールしたことによってUIPageViewControllerがSafeArea上にかぶっているので、それに合わせて中のViewControllerが再配置してずれるというわけですね。

#解決法
Superviewに対して制約をつければ、スクロールしてSafeAreaに被っても、関係なくレイアウトされるようになるので、それで修正できました。
![スクリーンショット 2018-12-09 13.48.03.png](https://qiita-image-store.s3.amazonaws.com/0/152335/0534b05b-4cab-ef54-ac7a-cd103071eaf1.png "スクリーンショット 2018-12-09 13.48.03.png")
EC-CUBE4 AmazonLinux2 構築

## 概要
EC-CUBE4のシステム要件を満たすサーバーをAWSに構築します。

## 手順
```bash
# 既存パッケージの更新
yum update

# 最低限必要なソフトウェアのインストール
yum install \
    yum-utils \
    wget

# リポジトリの設定
cd /tmp
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm

yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
yum-config-manager --enable remi-php72

# 必要なソフトウェアのインストール
yum install \
    curl \
    git \
    gcc \
    gcc-c++ \
    glibc-langpack-ja \
    httpd \
    vim \
    which

# PHP
yum install \
   php72 \
   php72-php \
   php72-php-common \
   php72-php-ctype \
   php72-php-curl \
   php72-php-devel \
   php72-php-fileinfo \
   php72-php-gd \
   php72-php-hash \
   php72-php-intl \
   php72-php-json \
   php72-php-libxml \
   php72-php-mbstring \
   php72-php-mcrypt \
   php72-php-mysqlnd \
   php72-php-openssl \
   php72-php-opcache \
   php72-php-pdo \
   php72-php-pecl-apcu \
   php72-php-posix \
   php72-php-phar \
   php72-php-session \
   php72-php-simplexml \
   php72-php-soap \
   php72-php-xml \
   php72-php-xmlwriter \
   php72-php-xsl \
   php72-php-zip \
   php72-php-zlib \
   php72-php-pecl-memcached

ln -s /usr/bin/php72 /usr/bin/php

# Locale
export LANG=ja_JP.utf8
export LC_ALL=ja_JP.utf8
unlink /etc/localtime
ln -s /usr/share/zoneinfo/Japan /etc/localtime
```
android JNIサンプル

### プロジェクト取得する

https://github.com/YanHengGo/android-ndk

### 機能リストアップ
##### pthread_tによるサブスレッド作成

    //线程
    pthread_t       threadInfo_;
    //线程的属性
    pthread_attr_t  threadAttr_;

    //线程初期化
    pthread_attr_init(&threadAttr_);
    //设置线程属性
    pthread_attr_setdetachstate(&threadAttr_, PTHREAD_CREATE_DETACHED);
    //设置参数g_ctx
    pthread_mutex_init(&g_ctx.lock, NULL);
    jclass clz = (*env)->GetObjectClass(env, instance);
    g_ctx.mainActivityClz = (*env)->NewGlobalRef(env, clz);
    g_ctx.mainActivityObj = (*env)->NewGlobalRef(env, instance);
    //创建线程
    int result  = pthread_create( &threadInfo_, &threadAttr_, UpdateTicks, &g_ctx);


##### ネイティブ側でjavaのインスタンス作成

    //取得类
    jclass  clz = (*env)->FindClass(env,
                                    "com/example/hellojnicallback/JniHandler");
    //类的实例化
    g_ctx.jniHelperClz = (*env)->NewGlobalRef(env, clz);
    //取得构造函数方法
    jmethodID  jniHelperCtor = (*env)->GetMethodID(env, g_ctx.jniHelperClz,
                                                   "<init>", "()V");


##### ネイティブ側でjavaのインスタンスメソッド呼ぶ

    //取得类方法
    jmethodID memFunc = (*env)->GetMethodID(env, g_ctx.jniHelperClz,
                                            "getRuntimeMemorySize", "()J");
    //执行类方法
    jlong result = (*env)->CallLongMethod(env, instance, memFunc);


##### ネイティブ側でjavaのstaticメソッド呼ぶ

    //取得静态类方法
    jmethodID versionFunc = (*env)->GetStaticMethodID(
            env, g_ctx.jniHelperClz,
            "getBuildVersion", "()Ljava/lang/String;");
    //执行静态类方法
    jstring buildVersion = (*env)->CallStaticObjectMethod(env,
                                                          g_ctx.jniHelperClz, versionFunc);
【2018年】開発環境に導入してよかったもの3つ

2018年も残り1か月という事で、今年の開発業務を振り返りつつ、導入して特に効果のあったものを3つご紹介したいと思います。
いろいろあるのですが、大事なのは**特に**効果のあったものを3つ紹介します。

# 何？

- Docker
- デイリースクラム
- slack

# 1. Docker
皆さんご存知コンテナ型仮想環境プラットフォームです。

https://www.docker.com/

これは私の中では今年一番導入してよかったものです。何よりやってて楽しいです。なんでもっと早く勉強しなかったのかと後悔しています。
AWSがDockerを使ったサービスを導入し、それらを使いたくてDockerを学び始めたのがきっかけです。
しかしやってみるとこれが凄く便利。特に自分の作ったアプリケーションがコンテナ内で動けば、それはクラウド環境でも動くという所が凄く感動しました。今まで環境違いとかで右往左往してたのは何だったのか・・・
後は部署内で開発環境を作る時に、「こっちでは動くのにこっちでは動かないー」とかいう問題も解決できました。

- Dockerfileを共有する事で、どこでも誰でも同じ環境を構築できる。
- 開発環境と本番環境の差分を極限まで小さくできる。
- 環境構築にミスったらコンテナごと破棄してまたやり直せる。

ローカルの開発環境、部署内の開発環境、はたまたクラウド環境まで最近見ないといけなくなった中、こういった環境の差異を無くせるという事は環境要因の問題が起きる事も少なくなり、それだけ開発自体に時間を使うことができるので、生産性も劇的に向上しました。

# 2．デイリースクラム
今年は開発業務そのものを変えるという大きな事がありました。毎週の定例の在り方に対し、「本当に効果あるの？」という疑問を持つところから始め、開発部署全員でカイゼンを行いました。
いろいろやっているのですが、個人的に一番効果のあったのが、「デイリースクラム」でした。

毎日15分で全員が集まり、1人1分くらいで、

- 昨日やった事
- 今日やる事
- 困っている事
- 連絡事項（あれば）

を言います。これで全員が何をしたのか、何をするのかを共有します。それにより、自分が一日にやるタスクの粒度を揃えることができ、回数をこなすことで1日のタスク量を見積もることができるようになります。「これは〇〇分くらいかかるから今すぐできそう」とか「これは〇〇分くらいかかるから明日にして、今日はこっちをやろう」とかできるようになってきました。

# 3. slack
皆さんご存知のコミュニケーションツールです。

https://slack.com/intl/ja-jp/

全社導入ではないですが、開発部署内だけで導入しました。
メールはどうしても切り離せないので、slackの本当の効果は発揮できていませんが、それでも便利になりました。
特に監視系の通知をslackに寄せることで、メールに埋もれるという事がなくなったので、すぐに気づくことができるようになりました。
またチャンネル別にトーク内容を整理できるので、メールのように「念のためCCに入れておく」みたいな事がなくなり、自分が本当に確認しないといけないものに集中できるようになりました。
Rubyで円周率を計算してみた

#ファイル書き込みの練習も兼ねて、計算した値をファイルに書き込んでみる
円周率を計算で近似するために、モンテカルロ法を使用してみました


#モンテカルロ法とは？
簡単に説明すると、
>「乱数を用いて数値を見積もる計算方法」

らしいです。
つまり乱数（でたらめに点を打つ）なので、例えば2cm X 2cm の正方形とその中に半径1cmの円があったとして、正方形の中にでたらめに点を打った時に、円の中にある点の個数と全体の点の個数の比が面積に比例すると考えられるから、円周率が求められますよということ。

今回は１辺が1cmの正方形の中に、半径が1cmの1/4円を描き、点を10000個打ち（乱数をx軸、y軸でそれぞれ10000個発生）、円の中に入るかどうかで判定しました。

円の中に入るかどうかの判定は、　x*x + y*y <= 1
扇型の面積は、　1/4 * 1*1 * π = π/4
正方形と扇型の面積比は、　1 : π/4
発生させた点の個数(count)と扇型の中にある点の個数(count_in)の比は、　count : count_in = 1 : π/4
すると、円周率は　π = 4 * count_in / count として計算できる

イメージ
![alt](https://mathtrain.jp/wp-content/uploads/2015/07/montecarlo.png)


生成した乱数はMonte Carlo method.csvに、又その中から扇型の中に生成された点をpi.csvに保存します



```ruby:monte.rb
puts "Monte Carlo method.csvを作成します"
puts "pi.csvを作成します"

file = File.open("Monte Carlo method.csv", "w")
file2 = File.open("pi.csv", "w")

puts "乱数を10000行分生成します"
count = 0
count_in = 0

10000.times do
  count += 1
  x = Random.rand        # 発生させた乱数をxに代入
  y = Random.rand        # 発生させた乱数をyに代入
  puts "#{x},#{y}"       # x,yを画面に表示
  file.puts "#{x},#{y}"  # x,yをファイルに書き込み
  if x**2 + y**2 <= 1
    count_in += 1
    pai = 4.0 * count_in / count
    file2.puts  "#{count_in}, #{pai}"
  end
  puts count
  puts count_in
  puts pai
end

puts "乱数をMonte Carlo method.csvに保存しました"
puts "paiの近似値をpi.csvに保存しました"

file.close
file2.close
```



これで何回か計算してみたところ、3.14に近い値を得ることができました
Itermでカーソルを快適に動かすには（MACの場合）

丸パクリです：
http://heyrod.com/snippets/cursor-movement-keys-in-iterm2.html

長いコマンドを打つ時に、カーソルの動きにイライラ、してませんか？
調べると、ターミナルでは普通

- 行の先頭にいく
- 行の末尾にいく
- 一つ前のワードの先頭にいく
- 一つ後ろのワードの先頭にいく

ができるようです。

ただ、ネットで見つけたキーで、そのような動作ができませんでした。
**Itermが心なしに悪さをしてくれてるようです。**

（以下の設定はOSXを利用の場合）
Iterm利用の場合、デフォで`command + left` `option + left` `command + right` `option + right` が占拠されています。
そのため、まず 

- `iterm-preferences...-Keys`(グローバルな設定) 
- `iterm-preferences...-Profiles-Keys`（login userの設定）

の二箇所から上記ショートカットを削除します。

次に、ショートカットを追加します。場所は、お好みで、上記のどちらでも構いませんが、一応ローカルにした方が道徳的なような気がします。

- `command + left` は `Send Hex Code` `0x01` で、行の先頭にいくようにします
- `command + right` は `Send Hex Code` `0x05` で、行の末尾にいくようにします
- `option + left` は `Send Escape Sequence` `b` で、一つ前のワードにジャンプ
- `option + right` は `Send Escape Sequence` `f` で、一つ後ろのワードにジャンプ

これで方向キーの連打から救われた新米プログラマーでしたm
Splunk Streamを使って http通信のWire Dataを可視化

いつもの前置き
---
- Splunkには色々なAppがある。
- そこで私がトライした内容は後学のために共有したいと思いここに書き残します。
- ゆるい情報なので参考程度でご勘弁。

Streamって？何ができるの？
---
- Splunk Streamは、 WireデータのL2-L7レイヤーを対象にすべて解析し、詳細な情報を含むイベントを生成。イメージは電話の通話内容記録（＊FlowDataはホストとホスト間の接続を示すことができますが、これらの会話の内容は記録されていない＝電話の発着信履歴）

<img width="1033" alt="スクリーンショット 2018-12-09 8.17.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/185759/13c8a256-bdff-0e27-ab8d-c8d61ea68164.png">


Splunk Stream
---
- 今回使うAppです。Splunk BuildのためSplunk社が最新版についてサポートしてます
[Splunk Stream ダウンロードサイト](https://splunkbase.splunk.com/app/1809/)
- インストールガイドは英語で公式のものもあります
[Install Guide](http://docs.splunk.com/Documentation/StreamApp/7.1.2/DeployStreamApp/InstallSplunkAppforStream)



構成イメージ
---
<img width="936" alt="スクリーンショット 2018-12-09 8.39.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/185759/15c88389-274f-c8a4-c55f-8469f41c247c.png">

セットアップ手順
----
- Splunk App for StreamをSplunk（Deployment Server兼用）サーバにインストール
- Splunk_TA_streamを/opt/splunk/etc/deployment-apps/ディレクトリ配下にコピー
- ~/deployment-apps/Splunk_TA_stream/local/inputs.confを新規作成し、 (ServerIP)を任意に書き換え

```inputs.conf
[streamfwd://streamfwd]
splunk_stream_app_location = https://(ServerIP):8000/en-us/custom/splunk_app_stream/
```

- Splunk_TA_StreamをDeployment Server機能を使ってWeb Serverに配布
- UFの再起動


見える化
---
正常にWire Dataがキャプチャ出来ていると以下のような画面が見えてきます。
![スクリーンショット 2018-12-09 12.12.16.png](https://qiita-image-store.s3.amazonaws.com/0/185759/fbe5ef95-a48a-f021-e3be-9408d5717ac0.png)

そして同じsrcとflow_idを束ねて1つのtransactionとして集計
![スクリーンショット 2018-12-09 12.08.40.png](https://qiita-image-store.s3.amazonaws.com/0/185759/3f8cdeb5-a825-f810-7f7e-cc69ce86a32d.png)

パスワードフォームに入力されたパスワード文字列を抽出し、どのユーザ名とパスワードの組み合わせでログイン試行が行われたかが確認できる（参考元サンプルデータ：[Boss of the SOC (BOTS) Dataset Version 1](https://github.com/splunk/botsv1)）
<img width="1548" alt="スクリーンショット 2018-12-09 12.22.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/185759/9d922fd0-2857-b0cf-70db-223e465cb41d.png">


気づき
---
- apacheのアクセスログ(default)と比べると、数倍のサイズ量にはなる。同じアクセス１回分のイベントを比較して見るとわかるが、上がaccess_combinedで下がstream:httpのデータ内容。
![スクリーンショット 2018-12-09 12.56.47.png](https://qiita-image-store.s3.amazonaws.com/0/185759/77605866-b609-36b8-f882-f99d5b4c5949.png)
- サービスインしているWebサーバのPOSTデータを記録していない場合、apacheの出力レベルを変更する代わりにstreamで代用が可能と思われる。


Tips
---
- Estimate mode
    - いきなりstreamデータを取り込んでライセンス容量が越えるのが心配な方は、サイズだけ算出してくれるestimade modeをまずは利用してください。プロトコル単位で設定できます。![スクリーンショット 2018-12-09 12.26.46.png](https://qiita-image-store.s3.amazonaws.com/0/185759/a752155d-18d6-849d-ea22-3dbe2cdcb123.png)
- 必要なフィールドのみ選択して余計なデータをsplunkに溜めない。分析に使いたいフィールドのみを選択してstreamをキャプチャできます。
 ![スクリーンショット 2018-12-09 12.11.26.png](https://qiita-image-store.s3.amazonaws.com/0/185759/684fa95e-3a8d-3830-003d-a7201b30bc16.png)

- 手っ取り早くstreamデータのサンプルログが見たい人はgithub上にて公開中のBOTSデータを参考に。[Boss of the SOC (BOTS) Dataset Version 1](https://github.com/splunk/botsv1)

次回は
---
SSL Decryptの設定を行ってみたいと思います。https:アクセスログを可視化してみたいと思います。
GASのユーザープロパティを、別のスクリプトから読めるのか実験

# 知りたいこと

GASの `スタンドアロンスクリプト1` で、セットしたUserPropertyを、それとは別の `スタンドアロンスクリプト2` で読むことは可能なのか。

# 準備

`スタンドアロンスクリプト1`として `prop_1.gs` を作成する。

ユーザープロパティをセットする。

```js:prop_1.gs
function setProp() {
  PropertiesService.getUserProperties().setProperty('TEST_KEY', "test_key");
}
```

`スタンドアロンスクリプト2` として `prop_2.gs` を作成する。

ユーザープロパティの中を見る。

```js:prop_2.gs

function getProp() {
  var properties = PropertiesService.getUserProperties();
  var data = properties.getProperties();
  for (var key in data) {
    Logger.log('Key: %s, Value: %s', key, data[key]);
  }
}
```

# 実験

`prop_1.gs` を実行してから `prop_2.gs` 

１）先に `prop_2.gs` を実行するとログには下記が表示される。

```
ログが見つかりません。Logger API を使用してプロジェクトにログを追加してください。
```

２）`prop_1.gs` を実行してから `prop_2.gs` を実行したときのログ

```
ログが見つかりません。Logger API を使用してプロジェクトにログを追加してください。
```

## 結論

GASのユーザープロパティを、別のスクリプトから読むことはできない。

...まぁそりゃそうか。いろんなところでKeyが上書きされてるかもしれいし管理しきれないもんね。
スクリプトをまたいでデータを共有したかったら、データストアとして何か(スプレッドシートとか？)を使う、と。



# 補足：同じスクリプト内ならできる

(あたり前感あるけど比較として)

```js:prop_3.js

function prop() {
  PropertiesService.getUserProperties().setProperty('TEST_KEY', "test_key");

  var properties = PropertiesService.getUserProperties();
  var data = properties.getProperties();
  for (var key in data) {
    Logger.log('Key: %s, Value: %s', key, data[key]);
  }
}
```

↓ ログ出力結果

```
Key: TEST_KEY, Value: test_key
```
【rails5】今月の、月初と月末の日にちを表示させたい

###【実現したいこと】
###今月の、月初と月末の日にちを表示させたい

###【方法】


まず***Date.today***で今日の日付を作成する

```
today = Date.today
> Date.today
=> Sun, 09 Dec 2018 
```

デフォルトの表示から、***strftime("%Y-%m-%d")***でフォーマットを***mm/dd***のように変更する。
（）内の間のーハイフンを/スラッシュに変えたり、年Yは省略可能。

コンソールにて動作確認

```
月初はbeginning_of_monthで出力可
today.beginning_of_month.strftime("%m/%d")
=> "12/01"
```

```
月末はend_of_monthで出力可
today.end_of_month.strftime("%m/%d")
=> "12/31"
```

次にファイルを更新。

```
controller内
@firstday = Date.today.beginning_of_month.strftime("%m/%d")
@lastday = Date.today.end_of_month.strftime("%m/%d")
```

```
view内
初日 <%= @firstday %>
締め <%= @lastday %>
```
で月初12/1、月末12/31と出力出来ました。

![2018-12-09 (2).png](https://qiita-image-store.s3.amazonaws.com/0/287122/c800f477-534d-f3b3-26fb-d51d3f2ad1ea.png)
LINE Botを使ったGovHackのまとめ（島田商業）

#目次
[１．はじめに](#１はじめに)
[２．LineBotとは](#２LineBotとは)
[３．作成した行程について](#３作成した行程について)
[４．参加した高校生のレポート](#４参加した高校生のレポート)
[５．その他](#５その他)

#１．はじめに
　今回高校生が参加したGovHack　KAKEGAWAとは、LINE@を活用して掛川の地域課題を解決するサービスを開発する[ハッカソン][link-1]であり[オープンデータ][line-2]や市の施策情報とLINE@を組み合わせることで、市民向けの情報発信サービスを開発する取り組みです。
プランナー、エンジニア、自治体職員の三者の協働によって、実際に掛川市で生じている地域課題の解決を目指します！（高校生はエンジニアとプランナーで参加しました）
[link-1]:https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%AB%E3%82%BD%E3%83%B3
[link-2]:https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%83%87%E3%83%BC%E3%82%BF

#２．LineBotとは
LINE BOTとは、コミュニケーションアプリLINEで動く、チャットボットである。「チャットボット（chatbot）」とは、「チャット」と「ボット」を組み合わせた言葉で、人工知能を活用した「自動会話プログラム」のことである。
LINEBOTは、LINE上でユーザーの発言に対して自動応答するプログラムの総称でありLINEBOT2016年4月にLINEがMessaging API（旧：BOT API）を公開し開発しやすい環境提供を実施した。

#３．作成した行程について
　アイデア出し
【課　　題】どんな課題を対象にするか？
【アイデア】地域課題を解決するためにどんなアイデアがあるか？
【実　　装】どんなアプリケーションをつくるか？
※一人ずつワークシートに実施をしてそこから今回制作するものを考える。
今回の資料は[こちら][link-3]
[link-3]:https://code4kakegawa.org/wp/wp-content/uploads/2018/11/181124GovHack_intro_02.pdf

|実施の様子|ワークシート|
|---|---|
|![46662386_571861736589669_5179328807735132160_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/252831/7b572c58-ddf0-16ae-713f-903237d9cb64.jpeg)|<img width="516" alt="1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/252831/ecd41c2c-266a-0c7d-2524-0fbdbc3fe1b4.jpeg">
|![46749884_571861813256328_2922311424829030400_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/252831/b50e7431-ce5f-6c96-1e1b-360a8125180e.jpeg)|![46762096_571861836589659_6039380826049740800_n.jpg](https://qiita-image-store.s3.amazonaws.com/0/252831/3eab0287-a2c5-b4f9-97dd-027603cacd39.jpeg)



グループのテーマが決まり高校生が参加した3つのグループについてのことをまとめていく。


#４．参加した高校生のレポート
[教えて！茶金ちゃん][link-4]
[link-4]:https://qiita.com/Kanako_Ito/private/c51c72124c7ac428d38a

|役割|内　容|
|---|---|
|エンジニア|clovaを使った観光案内

[茶金ちゃんにきいてくりょー][link-5]
[link-5]:https://qiita.com/asami01ishida/private/5983e9077d718a143ac6

|役割|内　容|
|---|---|
|プランナー|市役所に問い合わせをする前にどこに連絡をすればよいかを教えてくれる公式アカウント


[シリスギ君][link-6]
[link-6]:https://qiita.com/nozomi01terada/private/fd40a8fb4cc503177856

|役割|内　容|
|---|---|
|プランナー|市役所職員のアップデート（引き継ぎなど）

<font color="Red">※タイトルをクリックしてください</font>

#５．その他

静岡県立島田商業高校　こちら[クリック][link-7]
[link-7]:http://www.edu.pref.shizuoka.jp/shimada-ch/home.nsf/IndexFormView?OpenView

Code for kakegawaサイト　こちら[クリック][link-8]
[link-8]:https://code4kakegawa.org/
Expo with Sentry設定メモ

# TL;DR
設定が二箇所で必要で忘れてつまづいたのでメモ
* `App.js`にPublic DNS
* `app.json`にorganization, project, authToken

# 前提
* dev環境とprod環境を`app.json`ファイルを切り替える構成
* Sentryのログ送出先は環境ごとにプロジェクトを分ける（`expo-sentry`ライブラリで環境を切り替える方法がわからなかったからです。バッドプラクティスだと思うんで真似しないで...

# Code
```app.dev.json
{
  "expo": {
    "name": "MyApp",
    ...
    "hooks": {
      "postPublish": [
        {
          "file": "sentry-expo/upload-sourcemaps",
          "config": {
            "organization": "ここにorganization",
            "project": "ここにproject",
            "authToken": "ここにauthToken"
          }
        }
      ]
    },
    ...
    "extra": {
      "sentryPublicDSN": "ここにPublic DSN（形式が二つあるけど、deprecatedじゃない方）"
    }
  }
}
```

```App.js
import { Constants } from 'expo';
...
import Sentry from 'sentry-expo';

Sentry.enableInExpoDevelopment = true;
Sentry.config(Constants.manifest.extra.sentryPublicDSN).install();

```

デプロイするときには `app.dev.json`を`app.json`に差し替えます。
`ln -fs app.dev.json app.json && expo publish`
GPUSound入門（４）　ドラムの作成、複数の音を鳴らす

## シリーズ

GPUSound入門
https://qiita.com/MachiaWorx/items/68f8691d0866e0e0ff68

GPUSound入門（２）
https://qiita.com/MachiaWorx/items/75c63dff12b4a6189a35

GPUSound入門（３）
https://qiita.com/MachiaWorx/items/43bc7868e9fc770b52f4

## ドラムの音

シンセサイザー部分の次はドラムを作ることにします。

作り方はいくつかありますが、今回はノイズだけで作ることにします。

### ノイズってどうやって出すの

まず再現性を高めるためのソースコードがある模様。

``` GLSL:SampleCode_noise
float random (vec2 st) {
    return fract(sin(dot(st.xy, vec2(12.9898,78.233)))* 43758.5453123);
}
```
・・・なんですけどこのコードだと上から下まで均等に音が出るとはならない上に、フィルタの実装が難しい状態で何個もノイズ使うと同じ周波数というかノイズが純増になり、あっさり音割れしたりピークを超えて、音が聞こえないケースが出てきます。
（ってかありました）
あと別のノイズ使うにも引数になるvec2の値をどうするかで悩むケースが多々あります。

ということで自分は上記コードを一部使いつつも、別アプローチとして「基本波形を加工して、それをノイズとみなす」ことで対応してます。

``` GLSL:SampleCode_crash
vec2 mainSound( float time )
{
    // A 440 Hz wave that attenuates quickly overt time
    return vec2( sin(6.2831*440.*time*sin(time*8000.))*exp(-3.0*time) );
}
```

この仕組は、基本波形を低周波数でFM変調させて鳴らしてます。
2種類振動を用いることで波形を複雑にしてる感じですね。
1秒あたり44100個のデータをプロットする関係上細かく振動させるとただのノイズになってしまうという考えから、振動を細かくしちゃいました。

この考えを使って実装していくと、周波数を変更することでノイズの種類をいくつか変更でき、なおかつ音の粒も比較的揃っているので耳にも優しい。

サイン波とかいくつかのオシレータ使ったんですがのこぎり波が今の所加工しやすいということで、デモではのこぎり波をFM変調させてます。
（今回乗っけたソースは実装の手間考えてサイン波にしてます）

また、新たに出てきたmax関数ですが何を実装してるかというと、減衰です。
すなわち前回とかで説明したexp関数でもOKです。
簡単に言うと、音量の最大値を取ってそれを反映させてます。

exp関数は弧を描くような減衰になるので、そうじゃない直線的な減衰・二次関数的な減衰等やりたいことによって種類を変えてくのが良いと思います。

直線：max関数
弧：exp関数

みたいな感じで。


### あとドラムって何が必要だっけ

必要そうなのを列挙します。

* バスドラム・・・低音を刻む
* スネア・・・中～高音域を刻む、フィルイン等
* ハイハット・・・高音域を刻む
* タム・・・低～中音域を刻む、音階を持つケースがある（シモンズドラムとか）

必要に応じて作ってしまうのでいいと思います。

### 他に必要なものは・・・和音

これで楽器は揃ったんですが・・・

・・・はて、他の楽曲聞くと・・・一度にいっぱい音が鳴ってますね。
これは単純な話です。例えばベースとピアノが同時に鳴っていたら、その分同時に振動しているんですね。

ということで、前回の結果と今回の結果を同時に発音してみましょう。
ついでにサイン波は和音で鳴らしてみます。（適当に値を入れたので平均律に準拠した和音ではないですがご了承ください）

あと、まだ書くネタはあるので、先出し要素として左右、もしくはトータルの音量も調整してみました。
結局のところ吐き出すwavは2ch想定なので、今のデータの並びだったらvec2で調整できちゃうんですね。

``` GLSL:SampleCode_total
vec2 mainSound( float time )
{
    // 和音とドラムのサンプル

    //クラッシュシンバルの音
    vec2 result = vec2( sin(6.2831*440.0*time*sin(time*20000.))*exp(-6.0*time) ) * vec2(1.0,0.2);

    //和音
    result += vec2( sin(6.2831*440.0*time)) * exp(-3.0*time);
    result += vec2( sin(6.2831*530.0*time)) * exp(-2.0*time) * vec2(0.5,0.7);
    result += vec2( sin(6.2831*670.0*time)) * exp(-2.0*time) * vec2(0.2,0.8);
    return result*0.8;
}
```
はい、これで複数の音が鳴りました。
上記みたいな記述をいっぱい積み重ねれば、曲ができてしまうんですね。

もちろんそんなまどろっこしいことを推奨しているわけではないですし、もっとコンパクトに書く方法はいたるところに転がってます。

### 次回以降

次回以降、応用というか自分が知っている範囲で実装できそうなシーケンス・音色・エフェクト等を記載してこうかと思います。

今回のデモ（a Stranger）で実装した要素やTDF後整理した実装等、
書くことはいくつかある（すでにリストアップした）ので、
これらを書いていく予定としておきます。

あと、実際のデモへの組み込みのソースコードとかも公開準備中です。
これでGPUSound使った提出作品が増えるといいなー。
俺の CWL ワークフローがこのエンジンで動かない件 (事件編)

# TL;DR
- `requirements` を使用した CWL ワークフローやツールは、CWL 準拠のワークフローエンジンであっても動かない場合がある
    - 使用している Requirement に対応しているエンジンを選ぶ必要がある
- 公式が提供している、準拠度を測るテストを実行することで、どのエンジンがどの Requirement に対応しているかがわかる
- そんなの見てられない。なんとかするべき。
- つづく。

# 注意！

本記事は二部構成になっています。

- (この記事) CWL で書かれたワークフローが、問答無用で CWL 準拠のワークフローエンジンで動くわけではない話
    - 対象
        - CWL でワークフローを書くユーザー
- ([次の記事](https://qiita.com/tm_tn/items/e70e4418f0f38eaa5605)) 上を解決するために、機能ごとの準拠度を表すバッジを付ける話
    - 対象
        - README に詳細な準拠度を表すバッジを付けてドヤ顔したいワークフローエンジン開発者
        - バッジが付いてないエンジンに対して、バッジを付けるプルリクエストを投げつけて「このエンジンはわしが育てた」とドヤ顔したいユーザー


# はじめに

CWL に対応しているワークフローエンジン一覧は、https://www.commonwl.org/ の Implementations で確認できます。
ここに載っているエンジンであれば CWL で書かれたワークフローを全部実行できる…と思いきや、実はそうでもありません。

問題は[仕様](https://www.commonwl.org/v1.0/)の3.3節の [Requirements and hints](https://www.commonwl.org/v1.0/CommandLineTool.html#Requirements_and_hints) にあります。
この節では、ツールを Docker コンテナで動かすための [`DockerRequirement`](https://www.commonwl.org/v1.0/CommandLineTool.html#DockerRequirement) や、ワークフローのネストをサポートする [`SubworkflowFeatureRequirement`](https://www.commonwl.org/v1.0/Workflow.html#SubworkflowFeatureRequirement) などの各 Requirement がどう動くべきかが記述されているのですが、ここを読むとこれらが optional な機能であることがわかります。

> If an implementation cannot satisfy all requirements, or a requirement is listed which is not recognized by the implementation, it is a fatal error and the implementation must not attempt to run the process, unless overridden at user option.

つまり、 `なんとかRequirement` が含まれるワークフローやツールを実行する場合、その Requirement に対応したエンジンを使用する必要があります。
じゃあどのエンジンがどの Requirement に対応してるの？と公式サイトの Implementations を確認すると、そういう情報が載っていないことがわかります。~~つらい。~~

# 各エンジンがどの Requirement に対応しているか知りたい

CWL プロジェクトでは conformance test という、エンジンの CWL 準拠度を測るテスト一式と、簡単に全テストを走らせるためのスクリプトが提供されています。

各テスト項目は以下のようになっています。

```yaml:v1.0/conformance_test_v1.0.yaml
- job: v1.0/bwa-mem-job.json
  tool: v1.0/bwa-mem-tool.cwl
  output:
    args: [bwa, mem, -t, '2', -I, '1,2,3,4', -m, '3',
      chr20.fa,
      example_human_Illumina.pe_1.fastq,
      example_human_Illumina.pe_2.fastq]
  label: cl_basic_generation
  id: 1
  doc: General test of command line generation
  tags: [ required, command_line_tool ]
```

大まかには、入力となる CWL ファイル (`tool`) 、パラメータファイル (`job`)、期待される出力 (`output`) などが書かれていますが、今回注目すべきは `tags` フィールドです。ここには `required` (対応が必須) や `command_line_tool` (ツール定義)、`docker` (`DockerRequirement` を使用)など、このテスト内で使用している機能が列挙されています。

つまり、成功・失敗したテストのタグを見ることで、あるエンジンが各機能に対応しているかどうかがわかります。**でもそんなのやりたくない。**

# つづく

CWL の conformance test を実行することで、エンジンの各機能への対応状況が確認できることはわかりました。でも全部のエンジンでテストを走らせて結果を目視するのなんてやりたくありません。

公式サイトの Implementation には `passing` とか `unstable` とかバッジが付いているので、同じ要領で各機能ごとのバッジとか付けて欲しいですね。

付けられるようにしました(まだ付いていない)。[次の記事](https://qiita.com/tm_tn/items/e70e4418f0f38eaa5605)で、README にバッジを付ける話をします。
AssemblyLoadContext

この記事は、[C# その2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/c-sharp-2) の9日目の記事です。

# AssemblyLoadContextとは
プラグインなどで他のアセンブリを動的に読み込む際そのままでは読み込めないケースがあります。
具体的には

- ホストするアプリケーションと同じライブラリに依存しているがバージョンが違う
- static変数をホストと分ける必要がある

.NET FrameworkではAppDomainを分けて別々にロードすることで解決できました。
しかし.Net Coreではエントリポイントからの実行における複数のAppDomainがサポートされていません [^1] 。
そこで.Net CoreではAssemblyLoadContextが用意されています。
AssemblyLoadContextが別であれば別アセンブリとして認識されるわけです。

# デフォルト空間へのロード
まずは起動時にランタイムによって作られたAssemblyLoadContextへ読み込んでみましょう。
Defautltプロパティで常に参照できます。

```c#

var asm = AssemblyLoadContext.Default.LoadFromAssemblyName(new AssemblyName("System.Xml"));
```

読み込みメソッドには以下のような種類があります。

```c#
Assembly LoadFromAssemblyName(AssemblyName assemblyName)
Assembly LoadFromAssemblyPath(string assemblyPath)
Assembly LoadFromNativeImagePath(string nativeImagePath, string assemblyPath)
Assembly LoadFromStream(Stream assembly)
Assembly LoadFromStream(Stream assembly, Stream assemblySymbols)
```

使い方はなんとなくわかると思います。わからない場合はソースコード[^2]を読みましょう。
ちなみに記事執筆時点で公式のドキュメントに説明はありません[^3]  [^4]。

# カスタムAssemblyLoadContext
AssemblyLoadContextは抽象クラスなので、継承することで新しいAssemblyLoadContextを作ることができます。
継承したクラスでは、読み込まれたアセンブリが依存するアセンブリを解決する際に以下のメソッドが呼ばれます。

```c#
 Assembly Load(AssemblyName assemblyName);
```
このメソッド内で独自にアセンブリを読み込めばいいわけです。
読み込むべきアセンブリが見つからない場合はnullを返しましょう。
ちなみにアセンブリが解決されるのは実行に必要になってからです。
必要になるまではGetType()しようがCreateInstance()しようがLoadメソッドは呼ばれません。

# アセンブリの解決順序
ランタイムはアセンブリを以下の順序で解決します。
すべてnullを返した場合に例外を発生させます。

1. カスタムAssemblyLoadContextのLoadメソッド
2. ランタイムでの解決
3. デフォルトAssemblyLoadContextのResolvingイベント
4. カスタムAssemblyLoadContextのResolvingイベント


# Assembly.Load
.NET Frameworkでは、AssemblyクラスのLoadメソッドからアセンブリをロードすることができました。
このメソッドは.Net Standard 2.0に含まれているため.Net Coreでも使用できます。
ただし.NET Frameworkでは同一AppDomainに読み込まれていましたが、.Net Coreでは以下のようになっています[^4]。

 - Assembly.Load - Loadメソッドを呼び出したAssemblyと同一のContext
 - Assembly.LoadFrom - デフォルトContext
 - Assembly.LoadFile - 匿名のコンテキストが作られ、そこに読み込まれる
 - Assembly.Load(byte[]) -匿名のコンテキストが作られ、そこに読み込まれる


[^1]: https://docs.microsoft.com/ja-jp/dotnet/core/porting/libraries
[^2]: https://github.com/dotnet/coreclr/blob/master/src/System.Private.CoreLib/src/System/Runtime/Loader/AssemblyLoadContext.cs
[^3]: https://docs.microsoft.com/en-us/dotnet/api/system.runtime.loader.assemblyloadcontext

[^4]: https://github.com/dotnet/coreclr/blob/master/Documentation/design-docs/assemblyloadcontext.md
Rubyist が罠にはまる Rust の範囲

# Ruby と Rust の範囲の書き方の違い

Ruby 使いが Rust を勉強しはじめて初日に驚くことの一つに，

> `1..10` は〈1 から 10 まで〉ではなく〈1 から 9 まで〉を意味する，

ということがある。

Ruby と Rust の範囲の書き方の対照は以下のごとし。

| Ruby     | Rust     |
|:---------|:---------|
| `1..10`  | `1..=10` |
| `1...10` | `1..10`  |

# やっちまった

Rust の `..` の仕様はとうの昔に分かっていたはずなのに，先日，1 から `size` まで繰り返そうとして，Ruby の癖で，うっかり

```rust
for i in 1..size {

}
```

と書いてしまった。
結果の違いがささいなことだったので，しばらくバグに気付かなかった。

# 恨みと和解（？）

Rust を勉強した初日，`..` に関して

> ったく，他言語のこともちゃんと調べて仕様を決めてほしいよな

と思った。

ところがこれは勘違いで，Rust の範囲の書き方については突っ込んだ議論が行われ，その際に当然（？）Ruby のケースについても俎上に上がっていた。

「Ruby のほうがおかしいんじゃ」というような話も確か出てたような（だいぶ前に読んだのでよく覚えてない）。

結論の当否は私には分からないけれど，きちんとした議論の末に決まった仕様であるらしいことは分かった。

で，ごめん，その議論のページ（たしか Rust の [issues](https://github.com/rust-lang/rust/issues?utf8=%E2%9C%93&q=) だったと思う）の URL を載せようと思ったんだけど，見つけられなかった。

誰か教えて〜　（ついでに議論の要点を解説してくれると嬉しいにゃ〜）

あと，なんか昔，Rust に `...` って無かったっけ？　今試したら `unexpected token` って怒られたんだけど。
【メモ】kubernetes上でIngress(nginx)利用時にclient-max-body-sizeを設定

Pod内のnginxのだけ変えてて、冷静になって考えればingress-controllerのnginxも設定しなくてはならなかった
Ingressのmetadataのannotationsに`nginx.ingress.kubernetes.io/proxy-body-size`を設定してやる

helmファイル

```yaml:templates/ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: {{ .Values.ingress.name }}
  namespace: {{ .Values.namespace }}
  labels:
    app.kubernetes.io/name: {{ .Values.app.name }}
    helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }}
    app.kubernetes.io/instance: {{ .Release.Name }}
    app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- with .Values.ingress.annotations }}
  annotations:
{{ toYaml . | indent 4 }}
{{- end }}
spec:
# 略
```

```yaml:values.yaml
ingress:
  name: my-app
  annotations: {
    nginx.ingress.kubernetes.io/proxy-body-size: 20m
　　　　　　　　# 略
  }
# 略
```
UbuntuにSublime Text 3をインストール

# 環境
Ubuntu 18.04 LTS

# インストールの前に
apt-transport-httpsをインストールしておく

```
sudo apt-get install apt-transport-https
```

# インストール
GPGキーをインストール

``` 
wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key add -
```

リポジトリ追加

```
echo "deb https://download.sublimetext.com/ apt/stable/" | sudo tee /etc/apt/sources.list.d/sublime-text.list
```

Sublime Text 3をインストール

```
sudo apt-get update
sudo apt-get install sublime-text
```

お疲れ様でした。

#
カメラ映像を分割してSkyWayで配信するアプリケーションを作ってみた

# はじめに
この記事は[SkyWay Advent Calendar 2018](https://qiita.com/advent-calendar/2018/skyway)の9日目の記事です。
8日目はkolifeさんの「[【爆速！】5分でビデオチャットを構築する](https://qiita.com/kolife/items/6b771676d7558254b3a6)」でした。
# 作ったもの
タイトルにある通り、Webカメラの映像を分割し、SkyWayを使ってP2Pで配信するWebアプリケーションを作りました。
イメージとしては「[HTML5 JUMBOTRON](https://webrtc.ecl.ntt.com/usecase/skyway/jumbotron/)」の逆のような感じです。
ソースコードは[こちら](https://github.com/Kadoshita/distributed-movie-player)で公開しています。
コミットログを見てわかるように、最初はVue.jsを使ってみようと思いましたが、よくわからずに挫折してしまいました。
SkyWay Advent Calendar 2018の4日目でn0bisukeさんが「[Nuxt.jsとSkyWayで1時間でビデオチャットを作ってみる](https://qiita.com/n0bisuke/items/efbe6e09e30ebd941105)」という記事を書いてくださっているので、こちらを参考に再挑戦してみたいと思います。
# 仕組み
## 映像取得
皆さんおなじみ(?)の`navigator.mediaDevices.getUserMedia`です。今回は映像のみを扱うため、`audio`は`false`を指定しています。
解像度の指定は1280x720としています。
映像が取得できたら`video`の`srcObject`に取得したストリームを指定し、映像を表示させます。
その後、`video`から`canvas`に映像の1コマを描画するようにしています。
記述としては、

```js
ctx.drawImage(video, 0, 0, canvas.width, canvas.height);
```
こんな感じです。これで映像の1コマが`canvas`に描画されます。
## 分割
`canvas`に描画した1コマの画像を分割していきます。
今回は2x2の4つのブロックに分割します。
まず、分割した画像を描画するために、4つの`canvas`を用意します。
あとは、それぞれの`canvas`に「元の画像のどの領域を描画するか」を指定して画像を描画します。
例えば、左上の分割画像は、

```js
ctxs[0].drawImage(video, 0, 0, canvas.width / 2, canvas.height / 2, 0, 0, canvas.width / 2, canvas.height / 2);
```
こんな感じで指定します。
`canvas`の`context`をあらかじめ取得して配列に格納しているので、こんな感じで書くことができます。
`drawImage`に関しては[MDNのドキュメント](https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage)が一番詳しいですが、要約すると、

```
ctx.drawImage(元のデータ,切り取る領域の始点x,切り取る領域の始点y,切り取る領域の幅,切り取る領域の高さ,描画先の始点x,描画先の始点y,描画先の幅,描画先の高さ);
```
といった感じで指定することで、画像の分割ができます。
あとはこれを4つ分行い、1コマ取得と分割を定期的に行うことで、映像の分割ができます。

## 配信
分割した映像を配信するためには`MediaStream`を取得する必要があります。
`MediaStream`の取得には`captureStream`メソッドを使用します。引数はフレームレートです。
今回は、

```js
for (let i = 0; i < splitCanvases.length; i++) {
    localStreams[i] = splitCanvases[i].captureStream(10);
}
```
こんな感じで分割した`cacnvas`4つ分を取得しています。
あとは、`localStreams`に`MediaStream`が4つ分入った状態になるので、クライアントごとに、それぞれ送ってあげればOKです。
SkyWayで`MediaStream`を配信する部分は[p2p-broadcast](https://github.com/skyway/skyway-js-sdk/tree/master/examples/p2p-broadcast)のコードを参考にしました。
配信側では、`clientscount`という変数を準備しておき、クライアントが接続するたびに1増やすようにしています。
クライアント側に配信する`MediaStream`は配列に入っているので、クライアントが接続するたびにまだ配信していない分を配信するようにしています。
クライアント側では、ページにアクセスするときにURLにクエリパラメータとして`sid=xxxx`という形式で、配信側のidを指定します。
映像を受信する際は、特に操作は不要で、ページにアクセスするだけで分割された映像が送られてきます。
# まとめ
このアプリケーションの使い道として、例えばベゼル幅が狭いFHDモニター4枚と4台のPCで疑似的に4K映像を表示する。といったことができます。
今回はP2Pで通信を行っているため、LAN内であればそれほど遅延は気になりません。
配信側のPCスペックに応じてコマ取得のレートを調節するなどすれば、よりスムーズに動くと思います。

SkyWayのライブラリは映像の取得を自分でコントロールできるため、今回のように加工したストリームを流すこともできます。
アイディア次第で面白いアプリケーションが作れるところもSkyWayの良いところだと感じています。
皆さんもSkyWayを使って、アプリケーションを作ってみてはいかがでしょうか?
individualとcivicとは。個人最適化は住民最適化ならず。

#さて皆さんは、幾つの地域団体に所属しているだろうか。または、幾つの地域団体と連携しているだろうか。

町内会、自治会、子供会など地域に密着したものから
商店街振興組合、商工会議所、社会福祉協議会、JCなど
組織として地域の一翼を担うものもあるだろう。

なぜこの話を書いているかというと、今年の前半、私はシビックテック活動を
する際に、地域にはどんな課題があり、どこにドライブをかけるとそれは展開が
進むか、どのような社会の仕組みが実装されて成り立つか、そんなことを
考えながら、模式図を作っていたわけだ。それがこれ。


![CodeforNumazu（第17回）.png](https://qiita-image-store.s3.amazonaws.com/0/221422/3e6ef4e3-cd8e-42bc-4e89-070cfdef3cdc.png)

「課題の源泉」に対して、どのリソースを組み合わせて、どう対応するのか。
そういうデザインの部分が、なかなかうまく行っていないことも多く
最近はこの図を念頭に、デザインをして足りない部分を補うことが多い。

みなさんは、幾つとのつながりで価値の連鎖を生み出しているかな？

#「開発」することだけが解決方法ではない。
・既に活動している団体同士を会わせることで解決するかもしれない
・ルールを変えれば（合意すれば）よいのかもしれない
・オープンデータではなく、自治体内のデータを活用してもらい行政サービスの形にするのがよいのかもしれない
・既に活動している団体にICTでサポートすればいいのかもしれない

手法は様々あるし、課題に対してのステークホルダーもたくさん組み合わせていけばいい。
既に社会的活動している人たちがいるわけで、地域と一緒に解決すればより進むこともあるだろう。

私がシビックテックを始めたばかりのころ、「情報の見える化」「課題の見える化」「活動団体の見える化」が進めば、地域の活動の糊代が増えていく。これが、公民連携のキモであったり、地域の活性化に繋がるよということをまとめたことがある。今でも、これはシビックテックにおいても重要な概念だと考えている。
個人の活動に閉ざさず、市民の活動と、どうリンクさせるか。テクノロジーが使える我々だからこそ地域の各プレイヤーが解決したい課題に対して、一緒にできることがあるのだろう。

![opendata_suginami.png](https://qiita-image-store.s3.amazonaws.com/0/221422/6e542c94-ea02-9584-6fe8-0c33e64dcbab.png)

#市民も数値が読めないと、空中戦になる
シビックテックを開始した当初から、市民の皆さんに言われ続けた事。
「データが大事だって言われても、データの見方がわからないから、どんなデータが必要かわからないよ」

せやな。
だからこそ、市民活動として「定例」ではデータの読み解き方や、それで何が課題かを見出す。
だからこそ、WikipediaTownやマッピングパーティなどで、データを作るということを経験する。
スマートスピーカーで、市内の有名な文化財を聞いてみなさいな。
Wikipediaで記事になっていれば、説明が聞けるでしょうよ、これが、オープンデータですよ。と、伝えるわけだ。

シビックテックを開始した当初から、行政の皆さんに言われ続けた事。
「市民からデータを出して欲しいという要望がないんです」

そりゃそうだ。啓蒙活動も告知もしていなければ、要望なんてでるわけがない。
だからこそ、まずは、職員が利活用して説明できるようになるよう、データ利活用研修をする。
だからこそ、市民と行政が共にいる場で、オープンデータ研修やワークショップを開催する。

ワークショップで、こんなデータが欲しいよ！がたくさん出てくれば、担当者もやる気がでるってわけだ。

![iOS の画像 (2).jpg](https://qiita-image-store.s3.amazonaws.com/0/221422/d0c95883-549e-6c9d-f97d-fade4e93f8f8.jpeg)

見える化が進まないと、議論はかみ合わず、思い込みだけの意見となる。
同じ情報をみて、同じ土俵で語ろう、そういう地域を作り出していこう。
私のシビックテックを行う大きな目的は、オープンガバナンスにある。
行政も市民も一緒に自治をする。データも使う、必要なところにはICTも使う。

![opendata_suginami2.png](https://qiita-image-store.s3.amazonaws.com/0/221422/f35a4641-99cd-cd1f-40b7-3aa68556f1f0.png)


#地域にICTを使うということは、自治に戻ること
町内の草むしりや、ドブさらい、清掃をする自治の活動に参加したことがあるだろうか。
21世紀の我々は、それと同じ感覚で、地域情報化、ICTの利活用を地域に向けてすればいい。
個人最適化ではなく、住民最適化するには、どのようなサービスや仕組みが必要なのか
それを、各地域で取り組む時がきているのではないか。

例えば、伊豆半島の最南端のエリアでは、都会と違い保育園マップは必要ない（なぜなら、保育園の数は数える程だし、どこにいくかは場所でだいたい決まる）。その代わり、避難所マップ・ハザードマップの方が必要である。
これらは、地域の特性を地域の人と一緒に考えて、どこから手をつけるのかを考えていけばいい。
結果を真似るのではなく、結果に至ったプロセスを真似る。
そうすれば、自然と地域で活用される、地域の効果を出す源泉となっていくだろう。


などということを、酔っ払う前に書いておく。
numpy.vectorizeの使い方と実行の速さについて


# やりたいこと

PythonのNumpyを用いて，行列計算を行いたいが，これらはnumpy同士の*, + , -, /　numpy.dotなどを使用しないと計算速度がむしろ，落ちいてしまう．
しかし，実際には，行列の各要素に複雑な計算を代入していきたいことがよくある．その時のために，np.vetorizeなるものがあるが，それの使い方と速さを検証していきたい


```python
##  今回の使う環境
import sys
import numpy as np
print("PythonのVerson:", sys.version)
print("NumpyのVersion:", np.__version__)
```

    PythonのVerson: 3.5.3 |Anaconda custom (64-bit)| (default, Mar  6 2017, 12:15:08) 
    [GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)]
    NumpyのVersion: 1.15.2


## np.vectoraizeの使い方


行列$A = (a)_{i, j}$に対して，$a_{i, j} = a_{i, j} + 1$のような操作を行いたい場合は

A = A + 1などで十分である．

間違っても
```
for i in range(A.shape[0]):
    for j in range(A.shape[1]):
        A[i, j] = A[i, j] + 1
```
というようにしてはいけない．

しかし行列$A = (a)_{i, j}$に対して，以下のような複雑な操作を行いたい場合は，例えば，

```
for i in range(A.shape[0]):
    for j in range(A.shape[1]):
        while A[i, j] < 100:
          A[i, j] *= 2
```
のような操作を行いたいとする

その場合は，


```python
def f(x):
    while x < 100:
        x *= 2
    
    return x

```


```python
vf = np.vectorize(f)
```


```python
A = np.random.random((1000, 1000))
```

そして，使い方は下のように，なる．書き方としてはとても簡潔であるように感じる．
ついでに，実行時間も計算してみる．


```python
%timeit vf(A)
```

    1 loop, best of 3: 1.49 s per loop


また，通常の書き方もやってみて，実行時間も計測してみる．


```python
def loop():
    A = np.random.random((1000, 1000))
    for i in range(A.shape[0]):
        for j in range(A.shape[1]):
            A[i, j] = f(A[i, j])
```


```python
%timeit loop()
```

    1 loop, best of 3: 650 ms per loop


実行してみたら，普通に書いた方が実行時間が早かった！vectorizeの方が早いと思っていただけに少しショックである．
また理由がよくわからない．
Smalltalk-72がちょっと分かってきたので、改めて「オブジェクト指向プログラミングとは何か」をできるだけ簡潔に

もとより、

> 「オブジェクト指向」は全く別の２つのアイデアの同音異義語

で良いような気もするのですが、これだとようやく自分の中で“折り合い”をつけた人たちをひどく混乱させてしまうみたいなので、

<br/>

> クラスやインターフェースを使ってデータ型を定義するアイデア（決定は早い方が好まれる）と、メッセージを使って決定をできるだけ先送りするアイデア（データ型や中身をどうするかはあまり気にしない）という相反する２つの側面が同居している考え方。
> 
> 当然、両側面を同時に突き詰めると矛盾が生じるので、局面によって適宜、都合のよい方に寄せるなどの運用上の工夫が必要。

というように、ワンクッションおくとどうだろうか…という思いつきです。^^;

<br/>

　オブジェクト指向についてもう少し詳しくは、こちらの冒頭のテンプレをご参照ください。

- [「Pythonのlen関数がいかにオブジェクト指向的」“でなく”、また“でありもするか”をSmalltalkの視点から読み解く](https://qiita.com/sumim/items/77bbd0e6acb454e89fe5)

<br/>

　Smalltalk-72 については、一部機能が制限＆「[Smalltalk-72 Reference Manual (PDF)](http://www.textfiles.com/bitsavers/pdf/xerox/alto/Smalltalk72_Manual.pdf)」が対象にする実装（バージョン）とのあいだに齟齬があるため読み替え等のある種のスキルが必要ですが、こちらで気軽に遊べます。ぜひ、お試しあれかし。

- [Alto-Smalltalk-72: Lively Web](https://lively-web.org/users/Dan/ALTO-Smalltalk-72.html)

　GitHub も[使える](https://github.com/pharo-vcs/iceberg) ようになるまで進化(?)した [Pharo](http://pharo.org/) などに代表される今の Smalltalk とはずいぶん勝手が違うのでこの点もお楽しみください。
アジャイル開発について取り組んでいること

こんにちは♪私は現在、新しくスタートした案件をアジャイル型開発で進めていこうとしております！
技術書やベテランの先輩方にたくさんご相談しながら、進め方を模索しているのですが
その中でも私が取り組んでみたことをご紹介していきます(*´∀`*)

# ドラッカー風エクササイズ

「アジャイルサムライ」という本の中で紹介されていました！
プロジェクトのキックオフ前に、メンバー同士で行うものです。

①自分は何が得意なのか？ 
②自分はどうやって貢献するつもりか？ 
③自分が大切に思う価値は何か？ 
④チームメンバーは自分にどんな成果を期待してると思うか？

上記の項目をプロジェクト開始前に話すことで、お互いの強みなどを共有し合っていく
チームビルディング手法です。

こちらを、私なりのこのエクササイズの解釈も加えながら、このエクササイズを実践しています！

#　①自分は何が得意なのか？

まず、ベテランも新卒も関係なく、自分の強みを話してもらいます！
ここで私が重きを置いているのが、「強みが必ずしも技術力だけでなくていい」ということを伝えるようにしています。
「物事の優先順位をつけることが得意」「記憶力には自信がある」「やらなければいけないことにすぐ気づくことができる」・・・など！
自分の得意なことを明言することで、若手メンバーでも自信に繋がりますし、「このメンバーが得意なのはこれだ」と知ることで、よりタスクの振り分けがしやすくなるのではと思っています。

#　②自分はどうやって貢献するつもりか？ 
こちらはタスクの振り分けをする前に、この問いかけに対して答えることで
自分がどうやってこのプロジェクトに貢献していくか、改めてしっかり自分で考えることが出来ます。
先にリーダーから「こういうことを期待している」と名言されるよりも
自分でどうやって貢献していこうか考え、名言することで自分自身に役割を持たせることができると考えています。

#　③自分が大切に思う価値は何か？ 
こちらは価値観の共有です。何が正解というものはないと思っています。
私がプロジェクトメンバーに問いかけをしたときは「顧客への価値の提供」と答えた人もいましたし「時間」と考えている人もいました。
よりよい開発をしていくうえで、お互いの大切に思う価値を共有することで
プロジェクトでの大切にしなければならない「価値」が増えていきます。
これらを守ることで、いいシステムになっていくのではと思います。

#　④チームメンバーは自分にどんな成果を期待してると思うか？
①で話した得意なことと結び付けて答えることができる問いかけです。
たとえばフロントサイドの開発が得意なメンバーは「マークアップを丁寧に行うこと」のように話してくれましたし、ベテランの先輩社員の方は「困ったときの相談役となること」のように答えてくださいました。
「困ったことはすぐに相談すること」というふうに話してくれた若手メンバーもいます。
トップダウンで期待を持たせていく前に、一度自分で期待されている成果を考え、達成できるように実践することで、よりよい成果が期待できるのではと考えています。

#　まとめ
いかがでしたでしょうか？？
このエクササイズはベテランも若手も一緒に行うことで、より効果を発揮すると思っています。

アジャイル型の開発を進めていくうえで、色々これからも取り組んでいきたいと思っています♪
最後まで読んで頂き、ありがとうございました！(´,,•ω•,,｀)
Azure Blob StorageのインデックスをAzure Searchで作成(JAVA)

##はじめに
Azure Blob Storageにデータを格納し、
格納したデータをインデックスにしてファイルの中を検索しようと思います。

##Azure Blob Storageの作成

まず、**[ストレージアカウント]**、**[追加]**の順でクリックして
下記を入力し、作成します。
![blobStorage.PNG](https://qiita-image-store.s3.amazonaws.com/0/310126/5aae4b95-b0a6-448f-9623-857e86c72004.png)

作成後、概要にある**[Blob]**、**[コンテナ]**の順にクリックしてコンテナを作成します。
コンテナを作成したら、お好きなファイルをアップロードしてください。
![container.PNG](https://qiita-image-store.s3.amazonaws.com/0/310126/ac72f13d-3de9-ab10-c668-df4e3c1ee08a.png)

■Blob Storageの概要
https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-blobs-introduction

##Azure Searchの作成
リソースの作成で**[Azure Search]**、**[作成]**の順でクリックして
下記を入力し、作成します。
※筆者はFreeをすでに作成しているのでエラーになってます。
![search.PNG](https://qiita-image-store.s3.amazonaws.com/0/310126/72c90cdb-9974-9426-e7b1-95a0136d4899.png)
■Azure Search とは
https://docs.microsoft.com/ja-jp/azure/search/search-what-is-azure-search

##インデックス等の作成
sampleを作成しましたのでどうぞ
https://github.com/mo-22/Azure-Search-Blob-Sample

下記が実行できます。
1. インデックスの作成
2. データソースの作成
3. インデクサーの作成
4. 検索

**config.properties**に記載の下記を適当に編集してください。
**SearchServiceName**はAzure Searchの名前
**SearchServiceApiKey**はAzure Searchの**[key]**をクリックして記載されてある**PRIMARY ADMIN KEY**
**DataSourceConnectionString**はストレージアカウントの**アクセス キー**をクリックして記載されてある**接続文字列**

```properties:config.properties
SearchServiceName=<SEARCH_NAME>
SearchServiceApiKey=<SEARCH_KEY>
DataSourceConnectionString={ "connectionString" : "DefaultEndpointsProtocol=https;AccountName=<BLOB_NAME>;AccountKey=<BLOB_KEY>;" }
```

##検索してみる

データ
![word.PNG](https://qiita-image-store.s3.amazonaws.com/0/310126/6fb0d94e-394f-d5b0-e218-0d0c8565f30f.png)


検索前
![検索前.PNG](https://qiita-image-store.s3.amazonaws.com/0/310126/80dd9102-0507-5665-dd38-e00912033f3e.png)

検索後
![検索後.PNG](https://qiita-image-store.s3.amazonaws.com/0/310126/f1d47f13-1813-9240-fd83-b02302eb2e81.png)

無事に検索できました。
一応試しに「サーチ」、「テスト」、「ワード」、「してください。」とかでも検索できました。

※テキストファイルですと「UTF-8」がデフォルトなので、「SJIS」とかだと検索できません。ご注意を!!

##参考資料
■Java での Azure Search の使用
https://docs.microsoft.com/ja-jp/azure/search/search-get-started-java

■Azure Blob Storage 内ドキュメントのインデックスを Azure Search で作成する
https://docs.microsoft.com/ja-jp/azure/search/search-howto-indexing-azure-blob-storage
シクシク素数列 (Crystal)


|シクシク素数列|https://qiita.com/advent-calendar/2018/4949prime-series|
|:--|:--|
|Crystal|https://qiita.com/cielavenir/items/4c95fdf14b7a247e51e0|
|Kuin|https://qiita.com/cielavenir/items/60993a2b2885690a3a4a|
|Swift|https://qiita.com/cielavenir/items/db4c93532a53bfa33ac2|
|Kotlin|https://qiita.com/cielavenir/items/f3ccdd5ebf245aba417c|
|Pascal|https://qiita.com/cielavenir/items/4c962db6825d9a5eb511|

```cr:4949.cr
#!/usr/bin/env crystal
def isqrt(n)
	return 0 if n<=0
	return 1 if n<4 # 1
	x,y=0,n
	while x!=y&&x+1!=y
		x,y=y,(n/y+y)/2
	end
	x
end

def isPrime(i)
	return false if i<2
	(2..isqrt(i)).each{|j|
		if i%j<1
			return false
		end
	}
	true
end

def is4949(i)
	return false if i<=0
	return true if i%10==4||i%10==9
	is4949(i/10)
end

n=gets.not_nil!.to_i
i=2
cnt=0
while cnt<n
	if is4949(i)&&isPrime(i)
		print i
		if cnt<n-1
			print ","
		else
			puts
		end
		cnt+=1
	end
	i+=1
end
```