OmniAICreator/Qiita-1.07M huggingface dataset:
elm & servantでwebアプリ - その２．Elm導入

# Elmの導入

[前回(その１)](https://qiita.com/niruneru/items/e85e7f22bc0192892466)で、servantを導入しアプリケーションルートへのGET要求に対してHTML(top.html)を返すところまで作りました。
今回はElmを導入してtop.htmlをelmで生成するところまでやってみたいと思います。

導入にあたっては[こちら](https://guide.elm-lang.jp/install.html)を参考にしました。

```
[user@remote ~]$ sudo yum install nodejs npm
```
でnode.jsとnpmをインストールして、npmを使ってインストールしました。

```
[user@remote ~]$ sudo npm install -g elm
[user@remote ~]$ elm --version
0.19.1
```

## プロジェクトの作成
さっそくプロジェクトを作成してみます。前回作ったwepapp/frontend/に移動し、`elm init`と打ち込みます。

```
[user@remote ~/webapp/frontend]$ elm init
Hello! Elm projects always start with an elm.json file. I can create them!

Now you may be wondering, what will be in this file? How do I add Elm files to
my project? How do I see it in the browser? How will my code grow? Do I need
more directories? What about tests? Etc.

Check out <https://elm-lang.org/0.19.1/init> for all the answers!

Knowing all that, would you like me to create an elm.json file now? [Y/n]: Y
Okay, I created it. Now read that link!

[user@remote ~/webapp/frontend]$ tree
.
├── elm.json
├── src
└── top.html

1 directory, 2 files
[user@remote ~/webapp/frontend]$
```

srcディレクトリとelm.jsonが出来上がりました。
早速elmを書いてtop.htmlを生成したいと思います。/webapp/frontend/src/Main.elmを以下のように作成します。
すぐ書き換えるので内容は気にしないでください。

```elm:Main.elm
module Main exposing (..)

import Html exposing (..)


main : Html msg
main =
    h1 [] [ text "hello, elm" ]


```

これをコンパイルします

```
[user@remote ~/webapp/frontend/src]$ elm make Main.elm --output ../top.html
Starting downloads...

  ● elm/time 1.0.0
  ● elm/browser 1.0.2
  ● elm/json 1.1.3
  ● elm/core 1.0.4
  ● elm/html 1.0.0
  ● elm/url 1.0.0
  ● elm/virtual-dom 1.0.2

Dependencies ready!
Success! Compiled 1 module.

    Main ---> ../top.html

[user@remote ~/webapp/frontend/src]$
```

これでtop.htmlが作成されました。
`--output`は出力ファイルを指定するオプションです。
省略するとデフォルトの./index.htmlで作成されます。

## 表示
さっそく前回作ったサーバを起動しブラウザから見てみましょう。

```
[user@remote ~/webapp/backend]$ stack exec backend-exe
```
![top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318524/abfd756e-1683-85cf-39b7-cc267e30a944.png)
無事表示することができました。

次回はこのトップページを動きのあるページに変えてみたいと思います。

## elm-formatについて

私はvim使いなので、elm-formatをvimのプラグインに追加しました。
elmファイルを保存するときに自動的にフォーマット整形・文法チェックを行ってくれますのでとってもオススメです。

### elm-format
npmでインストールできます。

```
[user@remote ~]$ sudo npm install -g elm-format
```

### vim-plug
vim-plugを用いてelm-formatを追加しましたので、まずvim-plugを導入します。
すでに導入済みならこのステップは不要です。

```
[user@remote ~]$ curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 76585  100 76585    0     0  75593      0  0:00:01  0:00:01 --:--:-- 75676
[user@remote ~]$
```

### vimのプラグインに追加
続いて~/.vimrcに以下を加えます。

```
call plug#begin()
Plug 'elmcast/elm-vim'
call plug#end()

```
そうしましたら、vimを起動してコマンドモードから`:PlugInstall`と打てば完了です。
elm-format以外にelm-testなども用意してくださってます。詳細は[こちら](https://github.com/ElmCast/elm-vim)をご確認ください。
HoloLens 2 開封の儀！

HoloLens2が2台届きました。

![80889749_2773066549451364_3343778871982948352_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/f0f41dd9-011e-45a8-005b-0b7a8d375593.jpeg)

開封！おおお！

![80431811_791001044700675_3714060195983261696_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/3b417ee1-2efb-64a2-d257-f77b4eae1b57.jpeg)

箱は、HoloLens 1 に比べて大きめ、しかし、マジックテープで収納するスペース、イケてます。

![81789137_2378130369165551_6771962978137800704_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/2863f6ea-62b4-ccb1-c8b7-3f0ad43a95f2.jpeg)

内容は、鼻あてやバンドがなくなってシンプルになりました。

- HoloLens 2 本体
- 説明書
- クリーニングクロス
- USB（Type-C）充電器

本体は、HoloLens 1 に比べて軽め、どこを持てばいいのでしょうか。

![80888042_458081365109247_1969879272772337664_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/1e8ee5bd-7e64-2d15-63af-b7a5a66ece28.jpeg)

電源ボタンと充電（Type-C）、ヘッドバンドが頭にフィットするように調整するノブ。

![01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/07f051a9-0a35-fe2e-7c03-7449f5ca6ad6.png)

左側に画面の明るさ調整ボタン、右側に音量調整ボタンがあります。

![02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/5fd3b7f1-0ef6-05a4-36b8-08660af97d8b.png)

環境認識カメラ。手のトラッキングと自己位置推定と地図作成（SLAM）を行います。ハンドトラッキングによって、仮想物体を掴んだり、ボタンを押したりすることが可能になりました。

![81462622_851719431925608_1803681342840373248_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/926695ab-59fd-227e-92b8-7d1730613a39.jpeg)

フリップアップ。作業するときはフリップアップして、すぐに現実に戻れます。

![80710566_481950292747867_5086603783824211968_n.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/b2c1e2ae-16b0-47f7-0d6e-6c1f5e824eba.jpeg)

レンズの中についてるアイトラッキングカメラ。これで目線を追跡しています。HoloLens 1では頭の向きでカーソルを合わせていましたが、これからは、目線もしくは手から出る光線で選択することが可能です。

![03.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/396abf36-c9e5-a1a7-9d88-f701e6c980e0.png)

12/29は、Kumamoto HoloLens ミートアップ vol.2 でお触り会です。初めての方が体験すべきアプリやMRTKなど紹介していきますね。
Raspberry Pi で .Net の Web アプリケーションを作成

次のバージョンで確認しました。

```text
$ dotnet --version
6.0.302
```

プロジェクトの作成

```bash
mkdir Web01
cd Web01
dotnet new web
```

```text
$ mkdir Web01
$ cd Web01
$ dotnet new web
The template "ASP.NET Core Empty" was created successfully.

Processing post-creation actions...
Running 'dotnet restore' on /home/uchida/tmp/Web01/Web01.csproj...
  /home/uchida/tmp/Web01/Web01.csproj の復元が 424.71 ms で完了しました。

Restore succeeded.
```

次のようなファイルが作成されます。

```text
$ tree
.
├── appsettings.Development.json
├── appsettings.json
├── obj
│   ├── project.assets.json
│   ├── project.nuget.cache
│   ├── Web01.csproj.nuget.dgspec.json
│   ├── Web01.csproj.nuget.g.props
│   └── Web01.csproj.nuget.g.targets
├── Program.cs
├── Properties
│   └── launchSettings.json
└── Web01.csproj

2 directories, 10 files
```

次の２つのファイルを修正します。

１）　localhost 以外からもアクセスできるようにします。

```json:appsettings.Development.json
{
      "urls": "http://*:5000",
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  }
}
```

2) html ファイルを送るようにします。

```cs:Program.cs
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello World!");
app.MapGet("/morning", () => "Good Morning!");
app.MapGet("/afternoon", () => "Good Afernoon!");
app.MapGet("/evening", () => "Good Evening!");


app.MapGet("/html", async context =>
	{
	String ssx = "<!DOCTYPE html>";
	ssx += "<html lang='ja'>";
	ssx += "<meta charset='UTF-8'>";
	ssx += "<body>";
	ssx += "<p>こんにちは<p />";
	ssx += "<hr />";
	ssx += "<p>Aug/06/2022<p />";
	ssx += "</body>";
	ssx += "</html>";
	await context.Response.WriteAsync(ssx);
	});

app.Run();
```

コンパイルと実行

```text
$ dotnet run
Building...
info: Microsoft.Hosting.Lifetime[14]
      Now listening on: http://[::]:5000
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /home/uchida/tmp/Web01/
```

ブラウザーで http://host:5000/html にアクセス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/31163e96-c21c-ff7b-f354-b72c495a973c.png)
【Unity】スクロールビュー

# 使い方
## スクロールバーを作成する。
・Create -> UI -> Scroll View を追加する。
・Scroll View -> Viewport -> Content下に表示したいオブジェクトを配置する。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/78090da1-cdf3-454a-42e4-cd3e1407e301.png)

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/50fb5857-0742-c13a-cd0a-24b125f061ee.png)

## スクロールバーで端点以上にスクロールさせない。

Scroll Viewの「Scroll Rect」コンポーネントにおいて、
MovementTypeを「Elastic(弾性)」から「Clamped」にする。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/ac07ca8c-facd-bd92-1d79-114f88d75be2.png)

| movementType | 説明 |
|:--|:--|
| Elastic  | スクロールバーの外側にはスクロールできない。  |
| Clamped  | スクロールしている間は外側にスクロールできる。（離すと戻る）  |
| Unrestriced  | スクロールバーに制限されずスクロールできてしまう。  |

## 水平（垂直）スクロールバーを削除する。
・ヒエラルキービューからScrollbar Horizontalを削除する。
・Scroll Viewの「Scroll Rect」コンポーネントのHorizontail Scrollbarを
「None(未割当)」にする。
・シーンビューで垂直スクロールバーの画像の高さを、ViewPortに合わせる。

## Viewportの存在意義
・Maskコンポーネントが付与されていることにより、Viewportの領域外のContentsを
非表示にすることができる。

## コンテンツの高さ（幅）を動的に切り替える。
表示するコンテンツの量が異なる場合、それに合わせたスクロール量を決定する必要がある。
・Contentに「Content Size Filtter」を追加する。
・Vertical Fitを「Preffered Size」にする。

# 参考サイト
[自動レイアウト](https://docs.unity3d.com/ja/2017.4/Manual/UIAutoLayout.html)
[【Unity】uGUIの自動レイアウトが分かりにくいと評判なので解説してみる](http://tsubakit1.hateblo.jp/entry/2017/05/14/163456)
[【Unity】動的に要素が増える背景画像付きのScroolViewの実装方法 ](http://blog.chatlune.jp/2018/01/18/unity-scrollview-dynamic/#i-3)
【Laravel】ミドルウェアを利用しよう！

#はじめに
今回はミドルウェアの実装方法について説明します。
#ミドルウェアとは
ミドルウェアとは指定したアドレスにリクエストを送ると自動で処理を行う仕組みのことです
処理が行わられるタイミングは以下の2つの場合です
**1. ビューからコントローラーにアクセスした時
2. コントローラーからビューにレスポンスを送る時**
#ミドルウェアの作成
では、実際にミドルウェアを作成しましょう
`OldMiddleware`という名前のミドルウェアを作成します

```:ターミナル
php artisan make:middleware OldMiddleware
```

`app/Http/Middleware/OldMiddleware.php`が作成されます。

#ミドルウェアの編集
作成されたミドルウェアを編集します。
アクセスした時にアクションにリクエストを送る前に
`age`の値が２０以下なら`home`にリダイレクトさせる機能を実装します。

```php:app/Http/Middleware/OldMiddleware.php
<?php

namespace App\Http\Middleware;

use Closure;

class OldMiddleware
{
    public function handle($request, Closure $next)
    {
        if ($request->input('age') <= 20) {
            return redirect('home');
        }

        return $next($request);
    }

}
```

`return $next($request);`でアクセスした先に`$request`を送ります。

##前処理
上記でアクションに送る前にミドルウェアを挿入する方法を説明しました。

```
<?php

namespace App\Http\Middleware;

use Closure;

class BeforeMiddleware
{
    public function handle($request, Closure $next)
    {
        // ここに前処理を書く

        return $next($request);
    }
}
```

##後処理
次にアクションからレスポンスを返す時に挿入するミドルウェアの実装方法について説明します。

```
<?php

namespace App\Http\Middleware;

use Closure;

class AfterMiddleware
{
    public function handle($request, Closure $next)
    {
        $response = $next($request);

        // ここに処理を書く

        return $response;
    }
}
```

後処理は`$response = $next($request);`と`return $response;`の間に書きます。

#ミドルウェアの実行
上記の機能をアプリケーションから呼び出す方法を説明します。
`index`にアクセスした時に`OldMiddleware`に接続します。

```routes/web.php
Route::get('/index', 'MyController@index')->middleware('OldMiddleware::class');
```


#グローバルミドルウェア
グローバルミドルウェアとは全てのルートに対して呼び出されるミドルウェアのことです。
下記のように`app/Http/Kernel.php`の`$middleware`の変数内に追加しましょう

```php:app/Http/Kernel.php
protected $middleware = [
//                      :
//                      :
     \App\Http\Middleware\OldMiddleware::class,
]
```


#ミドルウェアのグループの利用方法
##ミドルウェアグループの登録
複数のミドルウェアをグループ化してまとめることができます。
下記のように`app/Http/Kernel.php`の`$middleware`の変数内に
`mygroup`を追加しましょう

```php:app/Http/Kernel.php
protected $middlewareGroups = [
//                      :
//                      :
    'mygroup' => [
         \App\Http\Middleware\OldMiddleware::class,
    ],
]
```

##ミドルウェアグループの呼び出し
グループ化したミドルウェアを呼び出しましょう
上記で登録した`mygroup`を呼び出します。

```routes/web.php
Route::get('/index', 'MyController@index')->middleware('mygroup');
```

以上でミドルウェアの利用方法の説明を終わります。

**疑問、気になるところがございましたら、質問、コメントよろしくお願いします！！！**
WSLでWindows10のフォントを使用する

# 表題部分について
WSLにフォントを追加する場合、以下の記事で~/.fontsというディレクトリにttfファイルを置いて参照する方法を紹介した。
https://qiita.com/query1000/items/4b0b8db872adc1a5e2e9

だが、Windows10にもともと入っているMS明朝や游明朝をまとめて参照する場合、WSLなのだから、同じマシンに入っているWindowsのフォントを直接使った方が早い。
その方法について。

以下の記事をまるまる参考にした。
https://www.atmarkit.co.jp/ait/articles/1812/27/news033.htmlc/

- root権限で/etc/fonts/local.confというファイルを作成し、以下のような内容にして保存。

```/etc/fonts/local.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <dir>/mnt/c/Windows/Fonts</dir>
</fontconfig>
```

これで

```
$ fc-cache -fv
```

すればWindowsにインストールされているファイルを直接使える。

# /etc/fonts/local.confについて

以下の記事を参考にした。
https://ponu2.blogspot.com/2016/03/fontconfig.html

Linuxではフォントはデフォルトでインストールされる/etc/fonts/fonts.confに指定されている。
しかしこのファイルを直接いじってしまうと、あとのアップデートで上書きされたり、アップデートに追従できなくなったりする。

そこで、同じディレクトリにlocal.confというのを書いて、そのマシンのroot独自の設定を入れる。
local.confの方がfonts.confより優先される。

さらにユーザー単位では~/.fonts/というディレクトリにフォントファイルを入れれば、そっちの方が優先される。

まとめると

- ユーザーの~/.fonts/
- そのマシンのrootが作った/etc/fonts/local.conf
- デフォルトでインストールされ、アップデートされる/etc/fonts/fonts.conf
の順に優先される。

ぼくはWindowsのマシンは自分ひとりしか使わないのでlocal.confの設定でいいことにした。

（上記の記事にはより細かい設定が書いてあるようだ）

# Windows10にフォントをインストールする

以下の記事を参考にした。
https://opentype.jp/fontinst10.htm


最初に掲げた拙記事では、~/.fontsにフォントファイルを直接ぶちこむ方法を紹介している。

しかし、WindowsにフォントをインストールしてそれをWSLで使う場合は、C:\Windows\Fontsにフォントファイルをぶちこんでもうまくいかない。
この場合は、ダウンロードしたフォントファイル（*.ttfやttc）を右クリックし「すべてのユーザーに対してインストール」するとうまくいく。（管理者権限が必要）
単純に「インストール」だと今度はWindowsのユーザーごとのフォルダ「C:\Users\(ユーザ名)\AppData\Local\Microsoft\Windows\Fonts」に行ってしまうので注意。

おいらなんも知らんなー。。

（この項おわり）
DockerでDjango+MySQLを構築

# 環境

- macOS Mojava version 10.14.6
- Docker version 19.03.5

# 準備

ディレクトリを作成し、Dockerfile, docker-compose.yml, requirements.txtを作成します。

```bash
$ mkdir sample
$ cd sample
$ touch {Dockerfile,docker-compose.yml,requirements.txt}
```

作成したそれぞれのファイルに以下を記述します。

## Dockerfile

```:Dockerfile
FROM python:3
ENV PYTHONBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
```

## docker-compose.yml

```:docker-compose.yml
version: '3'
services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: django_db
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      TZ: Asia/Tokyo
    ports:
      - 3306:3306
    volumes:
      - ./mysql:/var/lib/mysql
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
```

## requirements.txt

```:requirements.txt
Django>=2.0,<3.0
mysqlclient
```

# コンテナの起動

## Djangoプロジェクト作成

```bash:ターミナル
docker-compose run --rm web django-admin startproject config .
```

## プロジェクトのデータベースの設定
作成したプロジェクトのconfig/settings.pyのデータベースの設定をmysql用に設定。

```python:config/settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django_db', # MYSQL_DATABASE
        'USER': 'user', # MYSQL_USER
        'PASSWORD': 'password', # MYSQL_PASSWORD
        'HOST': 'db',
        'PORT': '3306',
    }
}
```

## startapp,migrate

```bash:ターミナル
docker-compose run --rm web python manage.py startapp app
docker-compose run --rm web python manage.py migrate
```

## ローカルサーバーの起動

```bash:ターミナル
docker-compose up -d
```

[localhost:8000](http://localhost:8000)へアクセスし、以下の画面が表示されれば成功です。
<img width="1308" alt="スクリーンショット 2019-12-28 13.56.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/348229/3d9fc06e-f0dc-16ca-b9a1-9ea8805723fc.png">

# 参考文献
- [Quickstart: Compose and Django | Docker Documentation](https://docs.docker.com/compose/django/)
- [DockerでDjangoを動かしてみる - Djangoの学習ができるチュートリアルサイトDjangoBrothers](https://djangobrothers.com/blogs/django_docker/)
- [【Docker Compose】設定内容を1行ずつ理解しながらLaravel環境構築（PHP-FPM、Nginx、MySQL、Redis） - Qiita](https://qiita.com/minato-naka/items/8b31d28823cabaa9487a)
初学者によるプログラミングMemo　#11 fizz,buzz問題

# はじめに
今回はfizzbuzz問題についてすこしお話しします
なお、本記述はMacにおいて、Railsでの開発を前提としています
また、まだまだひよっこですので、不備等ございましたらご指摘いただけると幸いです
 
# 目次

- fizzbuzz問題
- 注意点


## fizzbuzz問題
fizzbuzz問題とは「1から100まで数を数える時に、3の倍数なら「fizz」、5の倍数なら「buzz」、そして15の倍数なら「fizzbuzz」、それ以外はその数を答える」というものです
なんか世界のナ○アツが似たようなことしていましたね
数え方としては「1,2,fizz,4,buzz...」と言った形ですね

これはプログラミング界隈で試験的な扱いになっているようです
色々と背景があるようですね
答えは一つではなく、色々な書き方があります


### while文 その１

```.rb
num = 1
while num <= 100

  if num%15 == 0
    puts "fizzbuzz!"
  elsif num%3 == 0
    puts "fizz!"
  elsif num%5 == 0
    puts "buzz!"
  else
    puts num
  end

  num += 1

end
```
これはnumが100以下の時にずっと繰り返す式です
まず15かどうかのフィルターにかけて、次に3かどうか、そして5かどうかを判断し、どれにも該当しなければelseを返します
%は割り算をして、あまりがあるかどうかを調べています
あまりがない場合、あまりは"0"、つまり"== 0"が成り立ちます


### while文　その２

```.rb
num = 1
while num < 101
  str = ""

  if num % 3 == 0
    str = str + "fizz"
  end
  if num % 5 == 0
    str = str + "buzz"
  end
  if str == ""
    str = str + num.to_s
  end

  puts str
  num += 1
end
```
elsifを使わないパターンです
今回は、"str"という変数を用いています
まず、前回同様割り算にてあまりがあるかどうかで判定します
~~この文の欠点は、"fizzbuzz!"にできず"fizzbuzz"か"fizz!buzz!"になる点です~~
コメント欄にそうならない方法を書いていただきました、ありがとうございます


 ### for文

```.rb
for num in 1..100

  if num%15 == 0
    puts "fizzbuzz!"
  elsif num%3 == 0
    puts "fizz!"
  elsif num%5 == 0
    puts "buzz!"
  else
    puts num
  end

end
```
１行目でnumに1~100を順番に代入していきます
あとは一緒です

### each文

```.rb
(1..100).each do |num|

  if num%15 == 0
    puts "fizzbuzz!"
  elsif num%3 == 0
    puts "fizz!"
  elsif num%5 == 0
    puts "buzz!"
  else
    puts num
  end

end
```
each文で1~100を順番に並べます
あとは一緒です

### ~~times文~~ upto文

```.rb
#1..100.times do |num| ←こちらは間違いです０〜９９までの結果しか出ませんので修正します
1.upto(100) do |num|

  if num%15 == 0
    puts "fizzbuzz!"
  elsif num%3 == 0
    puts "fizz!"
  elsif num%5 == 0
    puts "buzz!"
  else
    puts num
  end

end
```
~~times文で1~100までを繰り返します~~
upto文で1~100までを繰り返します
あとは一緒です


## 注意点
3と5の判定順は入れ替えても問題ない（互いに素数のため）ですが、15の判定位置は記述位置でないといけません
先に約数である3,5の判定がなされた場合、そちらが優先されるからです
そういう点ではwhile文のその2は優位に立っていると言えます
「libv8とtherubyracerが入らない時の対処法」をやっても入らないとき

macOS Catalinaでrbenv環境の場合です。

libv8とtherubyracerがbundle install で入らない問題に遭遇しました。
ネットで調べるとよくある問題のようで、v8のバージョン問題だから、v8-315をインストールして、.bundle/configを設定する記事が多くみつかります。

macOS Mojaveで古いlibv8とtherubyracerが入らない時の対処法
https://qiita.com/shimx/items/32e85093f21e673c7127

私の場合は、別の問題と複合だったようで、この設定だけでは解決しませんでした。
原因は、rbenv環境だったのですが、bundleがrbenv内のgemを使っていないのが問題のようでした。
rbenvにbundleをインストール後に、bundle installが通りました。

```
# Macデフォルトのbundleを使っている
$ which bundle
/usr/bin/bundle

$ rbenv exec gem install bundler
Fetching: bundler-2.1.2.gem (100%)
Successfully installed bundler-2.1.2
Parsing documentation for bundler-2.1.2
Installing ri documentation for bundler-2.1.2
Done installing documentation for bundler after 4 seconds
1 gem installed

# rbenvのbundleに変更
$ which bundle
/Users/abc/.rbenv/shims/bundle
```
Slackの全チャンネルからPythonで投稿順に1000件を取得してtxtファイルにまとめる

## なぜそれをやろうと思ったのか
形態素解析のためのデータがほしくてやった。しかたなかった。

## 手順
まずはslackのTokenを取得してください。
こちらの記事などが参考になると思います。
https://qiita.com/ykhirao/items/0d6b9f4a0cc626884dbb

## コード
githubにまとまっているので基本はこちらを見ていただいてpullして必要ライブラリをインストールして実行していただければ問題ありません。まとまったoutput.txtが出てきます。
https://github.com/hiwatee/get-txt-slack-python

```
import os
import requests
from os.path import join, dirname
from dotenv import load_dotenv


def main():
    # .envから環境変数を読み込み
    dotenv_path = join(dirname(__file__), '.env')
    load_dotenv(dotenv_path)
    token = os.environ.get("TOKEN")
    host = os.environ.get("HOST")
    # チャンネルリストを取得・整形
    url = host + 'channels.list?token=' + token + '&exclude_archived=true'
    r = requests.get(url)
    data = r.json()
    channels = [{'id': channel['id'], 'name': channel['name']}
                for channel in data['channels']]
    for channel in channels:
        # 各チャンネルから上位1000件を取得する
        url = host + 'channels.history?token=' + \
            token + '&channel=' + channel['id'] + '&count=1000'
        r = requests.get(url)
        data = r.json()
        # ファイルに書き込む
        with open(dirname(__file__) + 'output.txt', 'a') as f:
            for message in data['messages']:
                print(message['text'], file=f)


if __name__ == '__main__':
    main()

```

## より詳しい解説
実際の利用にあたってはpython-dotenvが必要となります。
利用している意図としては環境変数を.envで使いまわし権限管理をしやすくするとともにgit上に自分のTokenが流出しないために利用しています。

python-dotenvは
```pip install python-dotenv```
でインストール可能です。

.env.txtとしてサンプルの書き方を載せてありますので書き換えてご利用ください。

## ちなみに
取り出したtxtファイルはリアクションやbotメッセージ、Reactionが入っていてそのままでは形態素解析には使えません。各自クリーニングしてご利用ください。
git pushって？？

git push。まあ、パッと見でなんとなく、どういう事はかは想像はつくが。
てな感じだったので書き記す事にします。

#ローカルからリモートへ：リポジトリの共有

Gitはそもそも、ファイルを変更した履歴を管理できるようにしたツールですよね。

他の方と共に開発する際には、ファイルに共有が必要になるわけです。

その際、ローカル環境→リモート環境へ反映しなければ、コードは元のままです。

そこで必要となるのが『git push』です。

```ruby:filename.rb
git remote -v
```
⇧リモートリポジトリ名が表示される

```ruby:filename.rb
git push リポジトリ名
```

初投稿でした。
間違いがあればご指摘ください。
virtualboxが急に起動できなくなった

MacBookAirで、virtualboxを使っています。
MacのOSのversionは、Catalinaです。
virtualboxのversionは、6.1.0 r135406 (Qt5.6.3)です。

今まで使えていたのに、数日前急にvirtualboxを起動しようとしたら、下記のエラーが出て起動できなくなりました。

**VirtualBox COMオブジェクトの作成に失敗しました。**

エラーのコードは、こちらです。

VirtualBox/VirtualBox.xml (line 40) -- UUID "{00000000-0000-0000-0000-000000000000}" has zero format.

vbox/tinderbox/mac-rel/src/VBox/Main/src-server/VirtualBoxImpl.cpp[740] (nsresult VirtualBox::init()).

ネットで色々と調べていて、アンインストールしてから再インストールすると良いという記事がいくつかあり試しましたが駄目でした。

引き続き調べていたら、VirtualBox.xmlの中身が空という記事もありました。
それで、VirtualBox.xmlを確認しました。
そして、バックアップファイルとして、VirtualBox.xml-prevがあることも知りました。

VirtualBoxが起動しない時は、このVirtualBox.xml-prevをVirtualBox.xmlに上書きするなどして対応すると起動できるようになると記事も、ありました。

私も、試しました。
でも、起動できませんでした。
落ち着いてVirtualBox.xmlのソースコードを確認したら、

```xml

     <MachineEntry uuid="{*****}" src="/Users/***/***.vbox"/>
    

```
とUUIDがゼロの場所がありました。
そのため、この部分をコメントアウトしました。
そして、ファイルを保存してからVirtualBoxを起動しました。

無事に、起動できました。

##結論

VirtualBoxのエラーが発生したら、まず、表示されているコードを確認しましょう。
そして、VirtualBox.xmlのソースコードで、エラーメッセージで書かれている行番号のコードの記載を確認します。
もし、ゼロフォーマットなら、コメントアウトしてみましょう。

なお、起動に成功してからもう一度VirtualBox.xmlのソースコードを確認したところ、設定している仮想マシンのUUIDが全て正常に設定されていました。

###緊急回避策
なぜかMacBookAirでゲストでログインしてVirtualBoxを起動すると、正常に起動できました。
ただ、起動の度に実際に仮想マシンのファイルがあるディレクトリを指定しないといけないので、手間があります。
ilasmでstack machine その5

#概要

ilasmでstack machineやってみた。
俺言語をjavascriptで、実装してみた。

#サンプルコード


```
var out = document.getElementById("out");
var src = document.getElementById("src"); 

function run() {
  var str = src.value;
  str = str.replace(/\t/g, " ");
  str = str.replace(/  /g, " ");
  str = str.replace(/  /g, " ");
  str = str.replace(/  /g, " ");
  var codes = str.split("\n");  
  var pc = 0;  
  var sp = 0;
  var len = codes.length;
  var i;
  var label = {};
  var val = {};
  var ram = [];
  var res = "";
  for (i = 0; i < len; i++)
  {
    if (codes[i].indexOf(":") > -1) 
    {
      label[codes[i]] = i;
    }
  }
  while (i > 0)
  {
    var code = codes[pc].split(" ");
    switch (code[1])
    {
    case "pushi":  
      ram[sp] = code[2];
      sp++;
      pc++;
    break; 
    case "push":  
      ram[sp] = code[2];
      sp++;
      pc++;
    break;
    case "set":  
      sp--;
      val[code[2]] = ram[sp];
      pc++;
    break;
    case "get":  
      ram[sp] = val[code[2]]; 
      sp++;
      pc++;
    break; 
    case "call":
      sp--;
      if (code[2] == "printi")
      {
        res += ram[sp] + " ";
      }
      if (code[2] == "prints")
      {
        res += ram[sp].replace(/\"/g," ");
      }
      pc++;
    break;
    case "if": 
      sp--;
      if (ram[sp] == 0)
      {
        pc = label[code[2] + ":"];
      }
      else
      {
        pc++;
      }
    break;
    case "if<":
      sp--;
      if (ram[sp] < ram[sp - 1])
      {
        pc = label[code[2] + ":"];
      }
      else
      {
        pc++;
      }
    break; 
    case "%":  
      sp--;
      ram[sp - 1] = parseInt(ram[sp - 1]) % parseInt(ram[sp]);
      pc++;
    break;
    case "+":  
      sp--;
      ram[sp - 1] = parseInt(ram[sp - 1]) + parseInt(ram[sp]);
      pc++;
    break;
    case "jp": 
      pc = label[code[2] + ":"];
    break;
    case "ret":  
      i = 0;
    break;
    default:
      pc++;
    break;
    }
  }
  alert("ok");
  out.value = res;
}


```

#成果物

https://embed.plnkr.co/LGPn9uxNrcChoWPNX7tF/


以上。
認定スクラムマスター(CSM)研修&試験まとめ

## このページについて
![seal-csm (1)_65.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385780/b59c74f7-144a-b2b0-4521-5e5da4bb4a9a.png)

Odd-e Japan社が主催する[認定スクラムマスター（Certified Scrum Master）研修](https://www.odd-e.jp/service_csm/)に参加しました。
研修後、Webテストに合格し、晴れて認定スクラムマスターとなりました。
このページは3日間の研修で学んだことのまとめメモとなります。

## 認定スクラムマスターについて

 * CSMの他にも、Scrum Inc.Japan社主催の[認定スクラムマスター（Licensed Scrum Master）研修](https://scruminc.jp/training/master/)があります。
  * 共にスクラム創始者のひとりであるJeff Sutherland氏公認の組織
  * 資格としては同格（どちらも世の中的に認められた資格）という理解
 * 共に研修費+受験費用は高額な部類です
  * 2019/12現在、CSMは3日間で33万、LSMは2日間で22万円(税込)
 
## Webテストについて
 
 * 研修受講後、講師より受験資格が与えられます（ちゃんと取り組めばまず受験資格者になれます）
 * 試験はWebで受験。テキスト参照可。2019/12現在、60分で50問⇒37問正解で合格となります
 * 試験は2回まで無料で挑戦できます。3回目以降は、1回25米ドルかかるそうです
 * アジャイル開発宣言とスクラムガイドより出題されます
 * 正直、ふるいにかける様なテストでは無いです。資格者に対して、アジャイル開発宣言とスクラムガイド（＝正しい理解）がキチンと定着して欲しいという意図の取り組みだと思います

## 総括

### アジャイル開発宣言とスクラムガイドを穴が開くまで読んだ

3日間＋テストを通して何回読んだか判らない位読みました。
（読ませるようなワークも非常に多かったです）
そして、この活動こそ最も重要だと感じました。

スクラムの正しい姿勢は全てここに書いてあります。
案件に適応した形に変化する点が特徴のスクラムですが、この最低限のルールは崩れません。

数々の案件が「なんちゃってスクラム」に陥るのは、スクラムガイドをちゃんと読んでいない点が大きいのではないかと推測します。
ただし、この様な研修を受けないと（＝まとまった時間を作って、他人とインタラクションを取るなど工夫しないと）中々読む気にならない（または正しく理解出来ない）のではないかと思います。

このギャップが、組織にスクラムを定着させるにあたって大きな課題となっています。

### 学ぶべきことがまだ沢山ある

組織にスクラムを定着させるためには、組織の抱える課題に対して明快にコーチング出来る様になる必要があります。

 * 開発チームが組まれる前に工期工数を見積もるにはどうすれば良いのか
 * バックログではタスク同士の依存関係を表現出来ないのではないか
 * スクラムは優秀な人材でなければ扱えないプラクティスなのではないか
 * 優秀な人材をスクラムの様な小規模チームに長期間アサインすることは不可能ではないか
 * 途中で計画を変更すると、ステークホルダとスコープや金で揉めるのではないか
 * 初期のプロダクトバックログはどこまで作れば（どうやって作れば）良いのか
 * 時短勤務やテレワークにどう対応していけばよいのか
 * 大規模開発に使えるのか

残念ながら、今回の研修でこれらのすべてに答えられる様にはなりません。
継続して学習して、ひとつひとつ潰していこうと思います。
例えば、事前の見積は[アジャイルな見積りと計画づくり ～価値あるソフトウェアを育てる概念と技法～](https://www.amazon.co.jp/dp/B00IR1HYGW/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)から整理している所です。

### LeSS（大規模スクラムに対するフレームワーク）について

![certified-less-basics_65.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/385780/718c5ff4-2bd5-ac5d-84ca-db5f36dfa361.png)

私の受けた回では、Michael James（マイケル・ジェームズ）氏・榎本 明仁氏（通訳兼講師）の両名にご教示を頂きました。
MJ氏は[大規模スクラムのフレームワーク(LeSS)](https://less.works/jp/less/principles/overview.html)の考案者のひとりであり、本研修ではLeSSの基本を修めたとして、この認定資格も得られました。有難い。
うちの会社なら大規模スクラムもお手伝い出来ますよ！って言いたい。是非言えるようになりたい。

## 各日の様子

別ページに記載しました。本研修は講義式ではなくワーク中心であり、メモとしてあまり体系立てられていない点はご容赦ください。

 * [1日目（基本姿勢編）](https://qiita.com/ketman55/private/f357b056606535b8ddf5)
 * [2日目（大規模スクラム編）](https://qiita.com/ketman55/private/ff7d08e1b8cdc96e3349)
 * [3日目（実践編）](https://qiita.com/ketman55/private/f22903306ed7ae10d5e4)

### (忙しい人向け)

講義で用いられていた動画のうち、特におすすめだと思う動画を以下にピックアップしました。

 * [「経験的」な学習の重要性について](https://www.youtube.com/watch?v=H0_yKBitO8M)
 * [アジャイルな組織が取るべき「連携」](https://www.ted.com/talks/yves_morieux_how_too_many_rules_at_work_keep_you_from_getting_things_done
)
 * [アジャイルな組織にするためには](https://www.youtube.com/watch?v=cr2rjaGmUzo&feature=youtu.be)
ダミーアバターを応答してくれるAPI「joe schmoe」

アカウントのアバターを表示するWebアプリを作成している時、
本物のデータが揃わなくて、とりあえずなんか適当にいい感じのアバターを表示してくれるのないかな〜って探していたら見つけた素敵なAPIサービス。
[joe schmoe](https://joeschmoe.io/)
![Screen Shot 2019-12-14 at 16.17.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431109/7289655b-090b-8727-8da8-de12f92951c8.png)


URLに名前を指定するだけで、そのキャラクターを応答してくれます。
ランダムに生成することもできるようです。

## 使い方
1. [joe schmoe](https://joeschmoe.io/)にアクセスして、「`Try the Tool`」をクリック。（下にスクロールするでもOK）

2. URLのカーソルが当たっている所(`<seed>`)にアバターの名前を入力。
![Screen Shot 2019-12-14 at 16.20.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431109/3c4c813e-5f3d-2982-d0f6-04024faedde9.png)


※名前の一覧は下にスクロールすると「`all the schmoes`」に一覧があるので好きなアバターの名前を確認してください。
![Screen Shot 2019-12-14 at 16.23.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431109/e916f63e-e11b-b953-1c05-122a918d02b1.png)

3.「`Copy`」ボタンをクリックするとURLがコピーされるので、もうすぐに使うことができます！ 
こんな感じ :point_down_tone2:　簡単ですね〜。

![Screen Shot 2019-12-14 at 16.25.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431109/f2375005-ecdb-9b24-61df-b02f827faf97.png)


## サンプルURL
名前を指定するだけでなくランダムに返すURLも用意されているので、用途に合わせて使ってください。

〜URLの例〜

- ランダムに生成
    - https://joeschmoe.io/api/v1/random
- 男性アバターをランダムに生成
    - https://joeschmoe.io/api/v1male/random
- 女性アバターをランダムに生成
    - https://joeschmoe.io/api/v1/female/random
- jenniさんアバターを生成
    - https://joeschmoe.io/api/v1/jenni


## 無料で使えるの？
サイトに下記の記載があったので、サイトに表示する分には問題ないようです。
> Free for personal and commercial use. Just don’t sell the artwork, please. :)
α版、β版、内部テスト版、オープンテスト版、クローズドテスト版ってどのように進めればいいのか？[Android]

#はじめに
テストする際にどのように進めればいいのか迷ったので記事にしました。:blush:

参考は
[「アルファ版」と「ベータ版」の違い](https://wa3.i-3-i.info/diff75version.html)
[オープンテスト版、クローズド テスト版、内部テスト版をセットアップする](https://support.google.com/googleplay/android-developer/answer/3131213?hl=ja)
です。

#では早速！
まず気になる出来ることですが、『α版』、『β版』、『内部テスト版』だろうと出来ることはほとんど変わらないという認識でいてもらった方がいいです。
じゃなぜ分けるか？答えは、どの状態のものかをはっきりさせるため。

| 分類       |       詳細 |
|:-----------------|:------------------|
| 製品版             |              通常のリリース |  
| β版         |            だいたいOKのものをテストするとき |  
| α版             |              完成にはほど遠いがとりあえずできたものをテストするとき |       
| 内部テスト版              |                まだ完成には程遠いものをテストするとき |     
   
一旦これはここで終了です。
次に『オープンテスト版』と『クローズドテスト版』の説明をします。

図では少し詳細を書いていますが、
`ある程度人を制限したい`→『クローズドテスト版』
`誰でもいいからテストしてーー、とりあえず出してるけどこれ完成版じゃないから！！テスト版だから！！`
『→オープンテスト版』

偏見ですが『オープンテスト版』はどっちかというと個人開発の方はやる方いそうだなと思いました。

| 分類       |       詳細 |
|:-----------------|:------------------|
| オープンテスト版            |   不特定多数に向けたテスト、Google Play で公開される、誰もが非公開のフィードバックを送信できる、そのまま製品版に移行できる            |  
| クローズドテスト版         |     ある程度制限をかけたテスト、大人数、そのままオープンテストに移行できる)

正直ここまでだとまだなんとなく？だと思います。
今は、これらがどういうものなのかをはじめに知っておいて欲しかったので先に説明させていただいたという感じです。
勘のいい方なら次の表を予測していたのではないでしょうか？:herb:

| 分類       |       詳細 |出来るテスト|
|:-----------------|:------------------|:------------------|
| 製品版             |              通常のリリース |  |  
| β版         |            だいたいOKのものをテストするとき |  オープンテスト版、クローズドテスト版  |  
| α版             |              完成にはほど遠いがとりあえずできたものをテストするとき |      クローズドテスト版   |  
| 内部テスト版              |                まだ完成には程遠いものをテストするとき | 内部テスト版    |  

※一度リリースしているものはβ版でクローズドテスト版が選択できない模様でした。

:frowning2:内部テスト版の中に内部テスト版?
:relaxed:出来ることはほぼ同じなんですけどね…『内部テスト版』は『オープンテスト版』に移行できない分素早く配信出来るのですよ。だから表にはあえて『内部テスト版』と書かさせていただきました。と言いたいのですがそれは昔の話のようです🙇‍♀️次の事項でも言いますが、『α版』から『β版』に移行できないため『内部テスト版』も『α版』も出来ることは同じという考えでいいと思います。昔の名残でそのまま存在しているのではないかと憶測しています。
ちなみに、ちなみに何ですけど素早く配信出来る内部テストも審査はあるのでどっちにしろ審査に時間がかかるので素早くないと思っています(｡･ω･｡)審査！審査！これも最近追加されたことなのですもんね(｡･ω･｡)


移行という言葉が出てきました！
この移行出来る部分がわかるとしっくりくると思います！
`内部テスト`→`α版 `
`α版 `→`製品版 `
`β版 `→`製品版 `
:frowning2:あ…内部テスト版はオープンテストできないんだ…。
:frowning2:分類をはっきししなくてもよかったら最初から『β版』でテストした方が良さそう？
:relaxed:そう思ったんですが、一度リリースしていると『β版』で『クローズドテスト版』が出来ない模様です(/ω＼)
:frowning2:というか`内部テスト`→`α版 `→`製品版 `でもいい気がした…
:relaxed:そうですね！色々なパターンで出来るようにGoogleさんはしてくれているみたいですね！

**:sunny:色々なパターンで出来るようにGoogleさんはしてくれている:sunny:**
これが全てだと思いました。

#まとめ
**:sunny:色々なパターンで出来るようにGoogleさんはしてくれている:sunny:**
α版やβ版とか分けてちゃんとしたいなら
`内部テスト版`→`α版`→`β版`→`製品版`という順序でテストすればいいと思ったし、
そんな分類どうでもいいよという場合はテストごとに出来ること自分の要件を満たす方法でやるのもいいと思いました。

ただ自分としては、、、

リリースまで不特定多数に公開したくない場合で、まだリリースしていなければ
`内部テスト版`→`β版(クローズテスト)`→`製品版`

リリースまで不特定多数に公開したくない場合で、もう一度リリースしているなら
`内部テスト版`→`α版(クローズテスト)`→`製品版`

リリースまでに不特定多数に公開するテストも行いたい場合で、まだリリースしていなければ
`内部テスト版`→`β版(クローズテスト)`→`β版(オープンテスト)`→`製品版`

リリースまでに不特定多数に公開するテストも行いたい場合で、もう一度リリースしているなら
`内部テスト版`→`α版(クローズテスト)`→`β版(オープンテスト)`→`製品版`

という流れば最短なのかな〜〜とか考えています。
分類とかすっ飛ばして考えるのなら…。
あとTWAとかだと、そもそもアプリの中で表示するサイトは変更するけど…とかあるのでα版から製品版に行くのはなんらおかしくないと考えています(*´ω｀*)

#最後に
何かこれは違うよ！などあれば指摘していただけると助かります。
よろしくお願いします。:bow_tone1:
VSCode、デフォルトで HTML タグの変換出来た件

まぢか

### シンボル名の変更 ( `Ctrl` + `Tab` )

すごくて、えらくて、かしこい、お世話様の機能。HTML でも使えた
言っといてや、出来るんやったら...

![sample-symbol](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525849/20debaf8-10f5-916a-633b-5435dd80d6f3.gif)

### ミラーカーソル

こっちは最近の機能らしい: [VSCode November 2019 (1.41)](https://code.visualstudio.com/updates/v1_41#_html-mirror-cursor)
自動で対応するタグにミラーカーソルが入る

![sample-miror](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525849/480f264d-e6d3-b39e-802c-d226230a8ea9.gif)

これの設定 (デフォルトで無効化された: [Vscode January 2020 (1.42)](https://code.visualstudio.com/updates/v1_42#_html-mirror-cursor-off-by-default))

![config](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/525849/644c563b-2409-69fb-fdf3-329f275df6b1.png)
multiple dispatchでのコード

mulitple dispatchを書いて、効果的なコードを書こうと思ったとき、とまどったこと/整理できたことをすこしだけ書く。
当たり前のことだけれど。

## multiple dispatchによる場合わけ

multiple dispatchでコードを書くとき、場合わけの部分を別の定義で書くことができる。
つまり、こういうコード

```julia
function myfunc(x::All)
  if x isa NUmber; ...n
  elseif x isa String; ...t
  elseif x isa Symbol; ...y
  else ...e
  end
end
```
を、こういうふうに定義できるということ。

```julia
function myfunc(x::Number) ...n end
function myfunc(x::String) ...t end
function myfunc(x::Symbol) ...y end
function myfunc(x) ...e end
```

入力データに対する場合わけの、型による部分はmultiple dispatchでこう書けるというはなし。
Juliaの場合、Union型を作ることができるので、もうすこし型階層を複雑にできる。

昔、よくわかっていないときには、入力の場合わけをすべてこの形で書けるかもしれないという幻想を抱いていたのだけれど、よく考えればそういうことはなく、型による場合わけだけがこの方法で書ける。
同じ型の値についての場合わけは、定義の中に書く必要がある。
つまり、Numberの型の中で、0の場合と正の場合を分けたコードを書きたいときは、myfunc(x::Number)の定義の中で場合わけが必要ということ。

{0}とか{x|x>0}とかいう型が定義できれば、値による場合わけもmultiple dispatchで書けるのだろうけれど、その場合は、methodを呼ぶ前に型で判定するという部分が、曖昧になってしまいそう。理論としてはおもしろいかもしれないけれど。

juliaのマニュアルを読んでいたら、この場合わけに相当する定義の書き方は細かすぎると性能が悪くなる場合があるので、気をつけようみたいなことが書いてあったのだけれど、うろ覚えでその基準はいまだよくわかっていない。
(↑がどこに書いてあったのか忘れた)

###デバッグするときの話

この書き方をした場合、デバッグ時に、分岐する前のxの値を@showでみるというようなことが、場合によっては書けない/書きづらい。
つまり、こういうコード。

```julia
function myfunc(x::All)
@show x
  if x isa NUmber; ...n

```

それぞれの書き方に応じたテスト/デバッグのやりかたがあるというだけなのだろうけど、ずっとはっきり意識していなかったことなので、ここでまとめてみた。

しばらくぶりにマニュアルを見たが、Methodsの項長い・・・読まないと・・・つらい・・・
pandas従業員総数欠損値補完

従業員総数が記載された有価証券報告書は年に1回しかでないため，従業員数総数に欠損値が出る．
そこで，間の欠損を補完しようと思います！
今回は，前期の従業員数を参照するように補完を行いました．

現状

![スクリーンショット 2019-12-28 12.19.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206657/975c8a06-7241-52a2-7cee-771ffae4a966.png)

目標
![スクリーンショット 2019-12-28 12.22.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206657/fc957f0d-6018-737d-0198-5c8414550533.png)

```python:
df['従業員総数'] = df.groupby(['ティッカー'])['従業員総数'].apply(lambda d: d.fillna(d.interpolate(method='pad', limit=3)))
```
iPhoneからSlackの任意のワークスペースのチャンネルに投稿する方法

# はじめに
昔から実現できていた方法かもしれませんが、最近知ったので備忘録として残します。

# 前提
* iPhoneのSlackアプリをインストールしておきます。
    * 私の環境では、```ver19.12.10```を使用しています。

# 手順

* 投稿したいサイトのURLを任意のブラウザで開きます。
    * 画像を投稿したい場合は、写真アプリから複数枚の画像を投稿することもできます。
* ブラウザの共有アイコンを押下します。
* アイコン一覧にSlackアイコンが表示されるので、Slackアイコンを押下します。
* 投稿ダイアログが表示されるので、ワークスペースと共有先のチャンネルを選択します。
* 最後に```Post```ボタンで記事を投稿します。
初学者によるプログラミングMemo　#10 View基礎知識

# はじめに
今回はViewの基礎知識についてそこしお話しします
なお、本記述はMacにおいて、Railsでの開発を前提としています
また、まだまだひよっこですので、不備等ございましたらご指摘いただけると幸いです

# 目次
- Viewの役割
- application.html.erbデフォルトでの役割

## Viewの役割
Viewの役割はもちろん画面の表示処理です
それだけだとMemoにならないので、Viewファイルの階層構造も一緒に説明します
一例がこちら
<img width="225" alt="スクリーンショット 2019-12-28 11.26.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522204/5a4b7a25-9a36-70f6-6dd1-781b4976bdb5.png">
＊hamlを使っていますが、ファイル名としては末尾が.hamlか.erbかの違いだけで、置き場所や役割は同じです

Viewsの中がアプリケーションのViewファイルの置き場所です
"rails new"をした場合、自動的にこのディレクトリが作成されますが、中身として"layouts"のディレクトリも同時に作成されます
画像内での"groups"や"users"は、他のモデルやコントローラと連動する名前にしなければいけません
そうすることで、Railsが自動的に各モデルやコントローラーとの関係を認識し、処理を行ってくれます
コントローラーの話が少し入ってきますが、例えば"groups_controller"に"index"アクションを加えたとしましょう
そのアクションに対応する"view"は、"views/groups/index.html.erb"となります
このようにたかだかファイル名と思われるかもしれませんが、非常に重要になってきます

## application.html.erbのデフォルトでの役割
先ほど少し触れた"layouts"のディレクトリ内には"application.html.erb"というファイルも自動生成されます
イメージとしてはviewの統括者とでも思っていただければいいです
例えばこのQiita記事のheaderにあたる部分はどの記事を閲覧しに行っても、マイページを開いても共通ですよね
このように、どのページでも共通している部分に関しては、application.html.erbに記述するだけで、各viewファイルに書かなくても、全てに反映させることができます
これは、デフォルトでは全てのビューが読み込まれるときに、application.html.erbが読み込まれるからです
基本的にはヘッダーとフッターを書くことが多いかと思います
また、装飾となるcssを全体に反映させるのもこのファイルへの記述で行います

### cssの読み込み
application.html.erbにstylesheet_link_tag 'application'という記述があります
この記述により"app/assets/stylesheets/application.css"が読み込まれます
そして、"application.css"には"require tree ."という記述があるので、この記述のおかげで、同じディレクトリにあるcssファイルを全て読み込むことができます


## まとめ

- viewの役割は画面への表示
- ディレクトリ名やファイル名はコントローラーやモデルと連動した名前にする
- application.html.erbには共通して表示させたい項目を記述する
Android で OpenCV を使って QRコードを検出する

[AndroidStudio で OpenCV をインポートする](https://qiita.com/ohwada/items/71eb18296aac46f9f5ee)
の続きです。

### OpenCV　の QRコード検出

OpenCV 4.0 から QRコード検出用のAPIが追加された。
今回はこれを試す。

[opencv : cv::QRCodeDetector Class Reference](https://docs.opencv.org/3.4/de/dc3/classcv_1_1QRCodeDetector.html)

下記を参考にした。

[QRコード検出APIの解説](https://qiita.com/tomoaki_teshima/items/f136e51fa1da6927471b)

### アプリを作成する

まず、下記を読んでください。
[Android　で OpenCV のサンプル camerapreview を試す](https://qiita.com/ohwada/items/53305d29f33bd14e6683)

CameraActivity を継承して MainActivity.java を作成する。

```
public class MainActivity extends CameraActivity implements CvCameraViewListener2 {

private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
    public void onManagerConnected(int status) {
// QRCodeDetector を準備する
        mQRCodeDetector = new QRCodeDetector();
        mPoints = new MatOfPoint2f(QUAD);
    }

public Mat onCameraFrame(CvCameraViewFrame inputFrame) {

    mGray = inputFrame.gray();

// QRコード を検出する
    mQRCodeDetector.detect(mGray, mPoints);

// QRコードに枠を表示する
    drawQuadrangle();

// QRコードを解読する
    String result = mQRCodeDetector.decode(mGray, mPoints);

private void drawQuadrangle() {
    // 詳細　略
```

注意:
アプリを実行すると、
メモリ不足 (Out of Memory) で異常終了する。
カメラからの画像を連続して処理するのがまずいようです。
検出は連続でもいいようですが、解読がダメみたいです。

対策として
(1) AndroidManifest　に
android:largeHeap="true"  を追加した。
(2) 画面にタッチした時に解読し、
一度解読したら次からスキップすようにした 。

### アプリを実行する

アプリが起動すると、
カメラのアクセス許可を要求する。
![opencv53_permission.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/a3cd378e-8a9c-a090-7647-d9e79b8cb421.png)

スクリーンショット
QRコードを検出解読した例
![opencv53_decode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64075/c2a32ac4-aae9-fada-2836-067bd6038ade.png)

サンプルコードをgithub に公開した。
 https://github.com/ohwada/Android_Samples/tree/master/Opencv53
sklearn.metrics.classification_reportの出力結果をCSVファイルで出力する


[sklearn.metrics.classification_report](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html)を使ってクラス分類結果をCSVファイルに出力したいという気持ち、あると思います。というわけでCSVファイルを出力するまでのサンプルコードを作成しましたので御覧ください。

# サンプルコード

```python:classification_report2csv.py
import numpy as np
import pandas as pd
from sklearn.metrics import classification_report

# https://scikitlearn.org/stable/modules/generated/sklearn.metrics.classification_report.html
y_true = np.array([0, 1, 2, 2, 2])
y_pred = np.array([0, 0, 2, 2, 1])
target_names = ['class 0', 'class 1', 'class 2']

report = classification_report(y_pred=y_pred, y_true=y_true,
                               target_names=target_names, output_dict=True)

# 転置しているのはmetrics名をheaderにするため
report_df = pd.DataFrame(report).T
report_df
"""
	precision	recall	f1-score	support
class 0	0.5	1.000000	0.666667	1.0
class 1	0.0	0.000000	0.000000	1.0
class 2	1.0	0.666667	0.800000	3.0
accuracy	0.6	0.600000	0.600000	0.6
macro avg	0.5	0.555556	0.488889	5.0
weighted avg	0.7	0.600000	0.613333	5.0
"""

# index=Falseにするとラベル名が消えてしまうので注意
report_df.to_csv("report.csv")

pd.read_csv("report.csv", index_col=0)
"""
	precision	recall	f1-score	support
class 0	0.5	1.000000	0.666667	1.0
class 1	0.0	0.000000	0.000000	1.0
class 2	1.0	0.666667	0.800000	3.0
accuracy	0.6	0.600000	0.600000	0.6
macro avg	0.5	0.555556	0.488889	5.0
weighted avg	0.7	0.600000	0.613333	5.0
"""
```

# 参考
- [scikit-learn - sklearn.metrics.classification_report](https://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html)
C# WinFormsのListViewで複数項目選択時に、最後の項目が選択された際に一度だけ処理を実行するテク

#WinFormsのListViewの項目選択時にデータ呼び出しを行う場合のテクニック

## 前提
- WinFormsでイベントハンドラを使ってアプリケーション作っているような比較的プログラミング初心者向け
- コード記述量少なめ

## やりたいこと
WinFormsのListViewの項目選択時に、そのリスト項目を利用したデータを呼び出す処理があるとして、複数項目選択した際には選択項目すべてを利用したデータ呼び出しをしたい。
データの呼び出しはファイルIOが絡むもので、処理の回数は極力減らしたい。

## ListView.SelectedIndexChangedイベントの挙動
SelectedIndexChangedイベントは複数項目選択時には選択項目数分の回数発生する。
SelectedIndexChangedのイベントハンドラにデータ呼び出し処理を記述すると項目の数だけ連続で呼び出し処理が行われ時間がかかってしまう。

例えば MultiSelect = true の ListView に項目A, B, C, Dがあったとして、Aが選択されている状態でShiftを押しながらDをクリックすると、

    A, Bが選択状態
    A, B, Cが選択状態
    A, B, C, Dが選択状態

というようにSelectedIndexChangedイベントが3回発生する。

A, B, C, Dを利用したデータ呼び出しが1回行われることを期待して、SelectedIndexChangedイベントハンドラに ListView.SelectedItems を利用したデータ呼び出し処理が書かれていると、

    A, B を利用したデータ呼び出し
    A, B, C を利用したデータ呼び出し
    A, B, C, D を利用したデータ呼び出し

というように3回データ呼び出しが行われてしまう。
データ呼び出し自体時間がかかる処理の場合、ListViewの項目がひとつずつ選択されていく様子が見えてしまう。
これでは呼び出しの完了まで待ち時間がかかるし、見た目の挙動も美しくない。
これを解決したい。

## 解決方法
複数選択完了後に一度だけデータ呼び出しをするには Timer を活用する。

TimerのTickイベントハンドラでTimerのStopとListView.SelectedItemsを利用したデータ呼び込み処理を行うようにする。

SelectedIndexChangedが連続で発生している間、そのイベント発生間隔より長いインターバルのTimerをSelectedIndexChangedイベントハンドラ内でStop→Startする。
するとSelectedIndexChangedが連続で発生している間はTimerのTickイベントが発生する前にTimerのインターバルがStop→StartでリセットされるためTickイベントが発生せず、最後の選択が終わった後インターバル経過後にTickが発生する。

これにより選択が全て終わってからデータの呼び込みが1度だけ行われるようになる。

## コード例
~~~csharp
private Timer LoadingDelayTimer = new Timer(){ Interval = 100 };

//DelayTimerのTickイベントハンドラ
private LoadingDelayTimer_Tick(object sender, EventArgs e)
{
    LoadingDelayTimer.Stop();
    LoadData();
}

//ListViewのSelectedIndexChangedイベントハンドラ
private ListView_SelectedIndexChanged(object sender, EventArgs e)
{
    LoadingDelayTimer.Stop();
    LoadingDelayTimer.Start();
}

//データ呼び出し処理
private void LoadData()
{
    ...
}
~~~

- LoadingDelayTimerのIntervalはSelectedIndexChangedが連続的に発生する間隔より明らかに長い時間にする
- 逆にLoadingDelayTimerをあまりに長くしすぎると選択が終わってからデータ呼び出しまでその時間分の遅延を体感できてしまう
- そのあたりを加味して短すぎず長すぎずの時間を設定する
年末断捨離 クラウドストレージサービス料金まとめ

年末大掃除！
パソコンのなかも断捨離しましょ！

いやちょっと待て、まだ消すのは怖い。
どこかにしまっておけないか？
というひとのためのクラウドストレージサービス料金まとめです。


# 料金表

料金は200GBあたりの月額です。

| サービス名 | 料金（円） | GBあたり単価 | 最低料金 | 無料枠|
|:--|:--|:--|:--|:--|
| Amazon AWS S3[^a] | 550[^e][^c] | 2.75 (0.025USD) || 1年間5GB |
| Amazon Drive | 1,150[^d] | 1.15 | 2,490円/100GB （年払い） | 5GB |
| Apple iCloud  | 400 | 2 | 130円/50GB   | 5GB |
| Dropbox | 1,200 | 0.6 | 1,200円/2TB | 2GB |
| Google Drive  | 380  | 1.9 | 250円/10GB〜  | 15GB |
| Google GCP Cloud Stroage (Standard)[^a] | 503[^c] | 2.51 ||| 
| Google GCP Cloud Storage (Coldline)[^a] | 131.36[^c] | 0.7 (0.007USD)|||
| Google GCP Cloud Storage (Archive)[^a] | 88 (0.8USD)[^c] | 0.4(0.004USD) |||
| Microsoft Azure Storage [^b] | 448[^c] | 2.24 || 30日間22,500円分 |
| Microsoft OneDrive  | 448  | 2.24 | 224円/100GB  | 5GB |

[^a]: 東京リージョン
[^b]: BLOBストレージ、LRS冗長、東日本リージョン
[^c]: 操作料金、データ転送料金が別途必要です。
[^d]: 料金は年払いです。ひと月当たりの換算額です。年間13,800円/1TB
[^e]: 請求はUSドル建てです。5USドルです。


# 考察

Google GCP Cloud Storage for Achiveがとても安いです。操作料金はStandard版の10倍かかりますが、それでも1万操作で50円と安いです。

普通に使うのであれば、15GBまでなら、Google Driveに置くのがよさそうです。
iPhoneやMacがあるのなら、Apple iCloudがなにかと使えそうです。

ところで、クラウドストレージの価値は、どこでも使えること。

でも、実際のところは家でしか使わないのですよね。
家でしか使わないのなら、外付けSSDで十分なような。

年間5,000円分の料金で、240GBが買えちゃいますね。

https://www.yodobashi.com/category/19531/19532/19545/19667/

おかしい。断捨離なのに物が増える。。。


# 料金リンク集

* Amazon AWS S3 https://aws.amazon.com/jp/s3/pricing/
* Amazon Drive https://www.amazon.co.jp/photos/storage
* Apple iCloud https://support.apple.com/ja-jp/HT201238
* Dropbox https://www.dropbox.com/ja/individual/plans-comparison
* Google GCP Cloud Stroage https://cloud.google.com/storage/pricing?hl=ja
* Google Drive https://one.google.com/about
* Microsoft Azure Storage https://azure.microsoft.com/ja-jp/pricing/details/storage/blobs/
* Microsoft OneDrive https://onedrive.live.com/about/ja-JP/plans/
Github Actions を API から実行する

# 背景

ある workflow から別の workflow を起動したくなることありますよね。
最近では circleci がようやく workflow（circleciではworkflowも含む概念としてpipelineといいますが） を起動するAPI v2がGAになりました。

Github Actions では repository dispatch event API を利用することで、任意の actions を実行できるようになりますのでご紹介します。

# repository dispatch event とは

https://developer.github.com/v3/repos/#create-a-repository-dispatch-event

から作成できます。
以下の2つのパラメータを指定することができます。

* event_type
    * **必須** 
* client_payload
    * 任意のjsonを指定できます

こんな感じで手元から試すことができます
 
```console
$ curl -vv \
    -H "Authorization: token ${{ secrets.REPO_GITHUB_TOKEN }}" \
    -H "Accept: application/vnd.github.everest-preview+json" \ 
    "https://api.github.com/repos/okitan/actions-sandbox/dispatches" \
    -d '{"event_type": "build", "client_payload": {"hoge": "fuga"}}'
```

# repository dispatch event を受け取る action

https://help.github.com/en/actions/automating-your-workflow-with-github-actions/events-that-trigger-workflows#external-events-repository_dispatch

です。
12月28日現在、`types`（event_typeを指定する機能のことと予想）はサポートしてないとドキュメントに書いてありますが、普通にtypesでfilterしてくれるようになってます。

Communityのproposalにも返答ないみたいだし、つい最近実装された機能なのでしょうか？

こんな感じで `repository_dispatch` を使うとよいと思います。
こうすることで、普段のactionsを簡単にAPI経由で起動できるようになって非常に便利だと思います。

ただし master ブランチに対して event が発行されてしまうので、 branch に対して実行するには、client_payload を使って branch を指定しておいて checkout を頑張るとか工夫が必要になります。

```yaml
name: build

on:
  repository_dispatch:
    types: [build]
  push:
    branches:
      - master
```

## event_type にアクセスする

types で filtering できるために多くの場合不要かと思うのですが、
以下のように何故か `action` という名前で取得できます。

```yaml
  steps:
    - run: echo "${{ github.event.action }}"
```

## client_payload にアクセスする

普通に github event context から取得できます。

```yaml
  steps:
    - run: echo "${{ toJSON(github.event.client_payload) }}"
```

# repository dispatch event を簡単に送る Github Actions

そもそも、なくてもまぁ `curl` 叩くだけなのでそんなに難しくはないとは思いますが、あるものは使ったほうが楽になるので、使うといいと思います。

https://github.com/marketplace/actions/repository-dispatch

# まとめ

repository dispatch event を利用することで、
外部システムからのAPI連携以外にも、
github actions内から動的なworkflowの制御ができるようになります。

よりはかどりますね。
KotlinとSpring BootのアプリケーションでHello Worldを返すエンドポイントを実装する

## Spring Initializrを使って生成する

- Gradle
- Kotlin
- Spring Boot
- Spring Boot Web

Spring Initializr、12月28日現在ですがまだクリスマス仕様ですね。

<img width="1557" alt="Screenshot 2019-12-28 10.43.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79990/dd738974-fe88-c38d-85ae-cfdf695883c1.png">

## APIエンドポイントを作成する

`@RestController`アノテーションを利用してBeanを作成、APIリクエストした際のエンドポイントを用意します。

```kotlin
package com.example.helloworld

import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.RestController

@RestController
class HelloWorldController {

    @GetMapping("/hello-world")
    fun helloWorld() = "Hello, World!"

}
```

## Applicationを起動する

`gradle bootRun`でアプリケーションを起動、デフォルトポートは8080です。

```
$ helloworld gradle bootRun
> Task :bootRun
    .   ____          _            __ _ _
    /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
    \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
        '  |____| .__|_| |_|_| |_\__, | / / / /
    =========|_|==============|___/=/_/_/_/
    :: Spring Boot ::        (v2.2.2.RELEASE)
2019-12-28 11:00:58.215  INFO 48835 --- [           main] c.e.helloworld.HelloworldApplicationKt   : Starting HelloworldApplicationKt on noguchiasanoMBP with PID 48835 (/Users/noguchi_tsukasa/Downloads/helloworld/build/classes/kotlin/main started by noguchi_tsukasa in /Users/noguchi_tsukasa/Downloads/helloworld)
2019-12-28 11:00:58.218  INFO 48835 --- [           main] c.e.helloworld.HelloworldApplicationKt   : No active profile set, falling back to default profiles: default
2019-12-28 11:00:58.873  INFO 48835 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2019-12-28 11:00:58.882  INFO 48835 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-12-28 11:00:58.883  INFO 48835 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.29]
2019-12-28 11:00:58.946  INFO 48835 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-12-28 11:00:58.946  INFO 48835 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 686 ms
2019-12-28 11:00:59.086  INFO 48835 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-12-28 11:00:59.259  INFO 48835 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-12-28 11:00:59.264  INFO 48835 --- [           main] c.e.helloworld.HelloworldApplicationKt   : Started HelloworldApplicationKt in 1.339 seconds (JVM running for 1.694)
```

## APIにcurlでアクセスする

```bash
$ curl localhost:8080/hello-world
Hello, World!
```

Hello, World!
【Laravel】Homesteadで複数アプリを管理しよう！

#困った現象
Homesteadで`laravel new`して新しいアプリケーション作って、
`artisan serve`でサーバー動かした、
でも、新しいアプリケーションに繋がず、前に作っていたアプリケーションに繋がる

#解決策
では、この現象を解決していこう！やることは以下の手順です！
1. [http://localhost:8000/](http://localhost:8000/)にアクセスした時に繋がるファイルを設定する
2. 設定を反映する

##[http://localhost:8000/](http://localhost:8000/)から繋がるファイルを設定する
その設定をしているファイルはHomestead.yamlです。編集していきましょう
ホストOSで`~/Code`をゲストOS上で`/home/vagrant/Code`として扱っています

```yaml:/home/vagrant/Code/Homestead/Homestead.yaml
folders:
    - map: ~/Code
      to: /home/vagrant/Code
sites:
    - map: homestead.test
      to: /home/vagrant/Code/public
    - map: homestead.test
      to: /home/vagrant/Code/new_app/public
```

上から順に読み込まれるため、`sites`内の一番下が読み込まれます。

##設定を反映する
上記の設定を`vagrant`に読み込ませましょう
まず、vagrantから出ます

```:ターミナル
$ exit
```

vagrantを再起動させましょう

```:ターミナル
vagrant reload --provision
```

以上で設定完了です。
[http://localhost:8000/](http://localhost:8000/)にアクセスしてみましょう！

**疑問、気になるところがございましたら、質問、コメントよろしくお願いします！！！**