OmniAICreator/Qiita-1.07M huggingface dataset:
日本語プログラミング言語「プロデル」でSVMを構築する

## はじめに

ニューラルネットワーク全盛期のいま，SVMを見聞きすることはなくなってしまったのですが，手軽に使えて好きなので，プロデルで実装したいと思います。

* 高村大也著「言語処理のための機械学習入門」（コロナ社）

を参考にしました。

## 実装する

### 使い方

```
［サポートベクタマシン種類のインスタンス］が【訓練用データ】と【正解ラベル】を【｛閾値，学習率｝】で学習する
［サポートベクタマシン種類のインスタンス］が【推定したいデータ】を推定する
```

という文法で学習と推定を行えるようにします。

### カーネルを作る

まず，カーネル関数を作ります。RBFカーネルが基本ですが，一旦線形カーネルを実装しました。

```
線形カーネルとは
	＋全部
	【学習用データ】
	はじめ（データ）の手順
		全部は，データを転置したものにデータを左からかけたもの。
		学習用データは，データ。
	終わり
	自分で【推定用データ：行列】を計算する手順
		推定用データを転置したものに学習用データを左からかけたものを返す。
	終わり
終わり
```

これからサポートベクタマシン種類を作りますが，宣言時にカーネル関数種類のインスタンスを引数として要求します。

### SVMを作る

```
サポートベクタマシンとは
	【カーネル】を持つ。
	【切片】を持つ。
	＋パラメータ
	はじめ（使用カーネル）の手順
		カーネルは，使用カーネル。
	終わり
終わり
```

コンストラクタでは，カーネル関数を指定しておきます。

パラメータというのは，$\alpha$のことです。

次に，学習部分を実装します。

方針としては，双対問題のラグランジュ関数を最大化（マイナスをつけて最小化）するのに，最急降下法を用います。

```
自分が【データ：行列】と【正解：行列】を【引数：配列】で学習する手順
	【閾値】は，引数（1）。
	【学習率】は，引数（2）。
	パラメータは，行列（データの大きさ（1），1）を作ったもの。
	今回勾配は，100.0。
	今回勾配の絶対値が閾値以下になるまで繰り返す
		勾配は，正解を転置したものを正解に右からかけたものにカーネルの全部をかけたものにパラメータを右からかけたものに-1を全部かけたものに1を全部足したもの。
		パラメータは，勾配に学習率を全部かけたものをパラメータに加算したもの。
		今回勾配は，勾配の各列の和の中身（1）（1）。
		今回勾配をコンソールに表示して改行。
	繰り返し終わり
	【あ】は，｛｝。
	あは，パラメータを転置したものを［カーネルの全部に正解を全部かけたもの］に左からかけたものの中身（1）。
	切片は，あの平均。
終わり
```

途中で謎の配列`【あ】`が宣言されていますが，これはコンパイル済みコンソールアプリで配列を扱う際に生じるエラーを回避するためのものです。本当は，

```
切片は，パラメータを転置したものをカーネルの全部に正解を全部かけたものに左からかけたものの中身（1）の平均。
```

とやりたいのですがエラーが出ます。

勾配の初期値を100にしていますが，特に意味はありません。

次に，推定部分を実装します。推定は，学習時に作ったサポートベクタをかけて正負の判定をするだけです。

```
自分が【データ：行列】を推定する手順
	結果は，パラメータを転置したものを（カーネルでデータを計算したものに正解を全部かけたもの）に左からかけたものを転置したものから切片を全部引いたもの。
	【計算後】は，行列（結果の大きさ（1），1）を作ったもの。
	結果の大きさ（1）回，カウンタにカウントして繰り返す
		もし結果の中身（カウンタ）（1）が0.0より大きいなら
			計算後の中身（カウンタ）（1）は，1。
		でないなら
			計算後の中身（カウンタ）（1）は，-1。
		もし終わり
	繰り返し終わり
	計算後を返す。
終わり
```

ここで正負の判定時に0.0という表記をしていますが，これを怠ると，コンパイル済みコンソールアプリでは整数型になってしまい上手く動作しません。

以上で完成です。
pipの早見表

#pip
今回はpipの基本について書いていきます
(筆者はUbuntu環境で実行しています。環境によって入力するコマンドは少し異なります）

#pipの基本
**pip**とはPythonパッケージのインストールをするための**道具**です。
まずは最初にpipの基本からおさえていきましょう。
操作はすべて**コマンド上**で行います！！

##pipのインストール
何をするにもまずはインストールからですね！
実は僕はインストールする際に

```
sudo apt update
```
を忘れていて１日悩んだので、まずはこれを**最初に**コマンドで実行しましょうね！

```
sudo apt install python-pip
```
##バージョンを確認する
大体どこのブログも最初はバージョン確認から始まりますよね。テンプレート通りに参りましょう。

```
pip -v
//または
pip --version
```
##インストール済みのパッケージを全て確認する
```
python -m pip list
```
##特定のパッケージがインストールされているか確認する
```
python -m pip freeze |grep パッケージ名
```
##パッケージのインストール
```
pip install パッケージ名
```
##既にインストールされているパッケージの確認
```
pip freeze
```
##パッケージをアンインストールする
```
pip uninstall パッケージ名
```
VeeValidate 3.xでバリデーションメッセージを簡単に日本語化するTip

# 公式ドキュメントの転載まんまですが

```vue
<template>
  <validation-provider rules="required" v-slot="{ errors }">
    <input v-model="value" name="myinput" type="text" />
    <span>{{ errors[0] }}</span>
  </validation-provider>
</template>

<script>
import { ValidationProvider, extend } from "vee-validate";
import { required } from "vee-validate/dist/rules"; 
extend("required", {
  ...required,
  message: "{_field_}は必須です"
});
export default {
  components: {
    ValidationProvider,
  },
  data: () => ({
    value: ''
  })
</script>
```

extendオプションで直接バリデーションを編集し、それを日本語で設定するだけ。
少ないバリデーションであれば、わざわざlocalizeしなくてもいいんじゃないかと思いました。


詳細は[VeeValidate公式ドキュメント](https://logaretm.github.io/vee-validate/)を参照。
macにmecabをインストールする

terminalに以下を入力

```
brew install mecab mecab-ipadic
```

mecab-ipadicはmecabで使用する辞書

## mecabをPythonから呼び出す

mecabをPythonから呼び出すためには、mecab-pythonをインストールする必要がある

```
pip install mecab-python3
```
zipファイルを解凍しようとしたら`Illegal byte sequence`エラーになった


パスワード付きzipファイルを解凍しようと思ったらエラーが出て時間がかかってしまった

```
error:  cannot create hoge.pdf
        Illegal byte sequence
```

以下のコマンドでパスワード聞かれるので
解凍パスワードを入力すれば解凍できるはず

```
ditto -V -x -k --rsrc --password hoge.zip ./hoge
```

以上です
エラー対処[Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR]

# はじめに
tensorflowを使いたいなーと思ってCudnnをインストールしたら、また新しいエラーが出てきました。結構困ったのでメモります。

# エラー内容
GPU自体はtensorflowで読み込めているのだが、実行するとなんだかエラーが発生する。エラー内容は以下。

```sh:error
...:...: E tensorflow/stream_executor/cuda/cuda_dnn.cc:329] Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
...:...: E tensorflow/stream_executor/cuda/cuda_dnn.cc:329] Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
Traceback ...
...
```

# 解決方法
以下のコマンドを実行すると無事解決した。

```sh:
$ export TF_FORCE_GPU_ALLOW_GROWTH=true
```

# 参考
- https://github.com/tensorflow/tensorflow/issues/24496
- https://github.com/tensorflow/tfjs/issues/1469
【Laravel】No 'Access-Control-Allow-Origin' header is present on the requested resource.


## 環境

 - PHP 7.2.13
 - Laravel 5.8.7

## インストール

今回は`barryvdh/laravel-cors`のライブラリを使ってCORS対応をしていきます

[barryvdh/laravel-cors](https://github.com/barryvdh/laravel-cors)

## 設定

`app/Http/Kernel.php` に設定を追加

```
protected $middlewareGroups = [
    'web' => [
       // ...
    ],

    'api' => [
        // ...
        \Barryvdh\Cors\HandleCors::class,
    ],
];
```

`config/cors.php` CORS設定ファイルを生成

```
$ php artisan vendor:publish --provider="Barryvdh\Cors\ServiceProvider"
```

デフォルトだとallowedOriginsが全てに対して許可されているので
特定のルールを設定したい場合には変更する

## 確認

リクエストを送って`HTTP/1.1 200 OK`が返って来ればOK
`403 Forbidden`が返ってくる場合は設定できていない

curlの場合

```
$ curl -X GET -I -H "Origin: http://sample.jp" {テストするURL}
```
【Ruby】文字列で使用出来るメソッド調べてみました①

※初めての投稿ですm(__)m
<h1>文字列の定義</h1>
文字列(String)の指定はダブルクオーテーション("")で文字列を囲うことで定義出来ます。

```ruby:sample.rb
変数 = "文字列"
```


<h1>分割する</h1>
**split（文字列の分割）**

```ruby:sample.rb
string = "pockemon, ruby, pikachu"
p string.split(",")
=> ["pockemon", " ruby", " pikachu"]
```

<h1>変換する</h1>
**capitalize, capitalize!（先頭の文字を大文字に変換する）**

```ruby:sample.rb
string = "poCkemon, pikachU"
p string.capitalize
=> "Pockemon, pikachu"
```

**reverse, reverse!（文字列を反転する）**

```ruby:sample.rb
string = "pockemon"
p string.reverse
=> "nomekcop"
```

**downcase, downcase!（大文字を小文字に変換する）**

```ruby:sample.rb
string = "POCKEMON, pikachU"
p string.downcase
=> "pockemon, pikachu"
```

**upcase, upcase!（小文字を大文字に変換する）**

```ruby:sample.rb
string = "pockemon, pikachu"
p string.upcase
=> "POCKEMON, PIKACHU"
```
fizzbuzz問題　備忘録

```
<?php
    $max = 100;
    for ( $i = 1; $i <= $max; $i++ ){
        print fizzbuzz($i) . PHP_EOL;
    }
    function FizzBuzz ($i) {
            if ( ($i % 3 == 0) && ( $i % 5 == 0) ){
            return 'FizzBuzz';
            }
            elseif ($i % 3 == 0){
            return 'Fizz';
            }
            elseif ($i % 5 == 0){
            return 'Buzz';
            }
            else {
            return $i;
            }
    }
?>

```


スコープの認識不足でエラー発生↓

```
<?php
    $max = 100;
    function FizzBuzz ($i){
        for ( $i = 1; $i <= $max; $i++ ){
            if ( ($i % 3 == 0) && ( $i % 5 == 0) ){
            return 'FizzBuzz';
            }
            elseif ($i % 3 == 0){
            return 'Fizz';
            }
            elseif ($i % 5 == 0){
            return 'Buzz';
            }
            else {
            return $i;
            }
            
        }
    }
    
 print FizzBuzz ($i) . PHP_EOL; 
?>

```

#### エラーメモ
- 理由：関数内外における、変数のスコープ（有効範囲）の理解不足
  -  `$max`は関数外で定義されている変数なので、関数内（`$i <= $max;`）では参照されない。
  -  `$i`は関数内で定義されている変数なので、関数外（`print FizzBuzz ($i) . PHP_EOL;` ）では参照されない。
- 有効範囲(スコープ)について
  - 変数には有効範囲(スコープ)があるため、範囲が異なると参照することができない。
     - グローバル変数・・・関数外で定義していた変数、プログラムのどこからでも参照可能
     - ローカル変数・・・関数内などで定義されている、有効範囲が限られた変数
  - 関数内で参照できる変数は、<b>関数内で定義された変数のみ</b>。関数外で定義した変数を使おうとしても参照することはできない。
  - 逆に関数内で定義された変数を関数外で使うこともできない。
- global宣言することで、関数内でローカルではなくグローバル変数を参照するようになる。ただしあまり使わないほうが良い。

参考
[ゼロから始めるPHP講座Vol.40　ユーザー定義関数①](
https://blog.codecamp.jp/php_func_application01)
python tkinter うまく作動しない

pythonのtkinterについての質問です。下のソースコードを実行してみたところ、
　　
  ~~~~~~~~~~~~~~~~~~~
  import tkinter as tk
  root = tk.Tk()
  root.mainloop()
  ~~~~~~~~~~~~~~~~~~~

エラーが発生してしまいました。↓
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 KeyboardInterrupt                         Traceback (most recent call last)
   \<ipython-input-7-059cbc39a2a6\> in \<module\>
         1 import tkinter as tk
         2 root = tk.Tk()
   ----> 3 root.mainloop()

   ~/anaconda3/lib/python3.7/tkinter/\_\_init\_\_.py in mainloop(self, n)
      1281     def mainloop(self, n=0):
      1282         """Call the mainloop of Tk."""
   -> 1283         self.tk.mainloop(n)
      1284     def quit(self):
      1285         """Quit the Tcl interpreter. All widgets will be destroyed."""

   KeyboardInterrupt: 
   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


原因がわかる方よろしくお願いします。
ちなみに環境として、MacからanacondaのJupiter->python3->consoleで実行しました、
【Unity】異なるバージョンのインポート

# やりたいこと
　・古いバージョンのUnityプロジェクトをインポートしたい。

# インポートまでの流れ
・Unity Hubから「リストに追加」を選択する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/84cd74c6-ca5e-da4b-80af-d44f86c7277d.png" width = 80% />

・対象のプロジェクトを選択する。（Assetフォルダより1つ前のフォルダを選択する。）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/da93d654-45fe-27c1-5cf8-46637360e991.png" width = 80% />

・警告マークが出るがとりあえず、最新のバージョン(2019.2.9f1)をプルダウンから選択してプロジェクトを開く。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/77f5ee67-cb0c-6883-21eb-f6d6be0b81f8.png" width = 80% />

・バージョンが違うことについての警告メッセージが出るがOK(確認)を選ぶ。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505426/7dcaaac2-cb71-64ad-761e-5c86c6c53608.png)

・一度プロジェクトを閉じて、再度Unity Hubから開きなおしたところ、警告メッセージは解消されていた。

# 結論
　・インポートする段階で自動的にバージョンアップされる。
　　警告メッセージに「再構築される**可能性があります**」とあるので、今回はたまたまだったかもしれない。
　・もしも、インポート時にバージョンアップされない場合は下記手順で対応が可能らしい。（参考サイト参照）
　　　１．メニューのAssets -> Reimportを行う。
　　　２．プロジェクト内に何かしらの変更を加え保存する。

# 参考サイト
・[Unityバージョンアップ時のプロジェクトのアップデート](https://qiita.com/mintcandy/items/8937768ab88d2d57c495)
Donkey Carのプロポ対応その３（Donkey car設定編）

### はじめに

既存のジョイスティック種別（CONTROLLER_TYPE)と混乱しないようにするために、新しく`ArduinoHID`という種別を追加して説明します。

### myconfig.pyの変更

```python
CONTROLLER_TYPE='ArduinoHID'               #(ArduinoHID|ps3|ps4|xbox|nimbus|wiiu|F710)
```

### controller.pyの変更

#### コントローラタイプの追加

二行追加

```python
def get_js_controller(cfg):
    cont_class = None
    if cfg.CONTROLLER_TYPE == "ps3":
        cont_class = PS3JoystickController
    elif cfg.CONTROLLER_TYPE == "ps4":
        cont_class = PS4JoystickController
    elif cfg.CONTROLLER_TYPE == "nimbus":
        cont_class = NimbusController
    elif cfg.CONTROLLER_TYPE == "xbox":
        cont_class = XboxOneJoystickController
    elif cfg.CONTROLLER_TYPE == "wiiu":
        cont_class = WiiUController
    elif cfg.CONTROLLER_TYPE == "F710":
        cont_class = LogitechJoystickController
    elif cfg.CONTROLLER_TYPE == "ArduinoHID":
        cont_class = ArduinoHIDJoystickController
    else:
        raise("Unknown controller type: " + cfg.CONTROLLER_TYPE)

```

#### ArduinoHIDのインターフェイスの設定

stickの番号は、Arduinoのジョイスティック定義と一致しているので、変えなくても大丈夫だと思います。ボタンはArduinoのボタン番号(0, 1, 2, ...)に0x120を足したものとなっています。

```python
class ArduinoHIDJoystick(Joystick):
    '''
    An interface to a Arduino HID joystick available at /dev/input/js0
    '''
    def __init__(self, *args, **kwargs):
        super(ArduinoHIDJoystick, self).__init__(*args, **kwargs)

        self.axis_names = {
            0x00 : 'left_stick_horz',
            0x04 : 'right_stick_vert',
        }

        self.button_names = {
            0x120 : 'mode',    #288
            0x121 : 'R1',      #289
            0x122 : 'L1',      #290
        }

```



#### ArduinoHIDのクラスの定義

この例では、左側スティックのＸ軸、右側スティックのＹ軸、および３つのボタンにDonkey Carの動作を割り当てています。

```python
class ArduinoHIDJoystickController(JoystickController):
    '''
    A Controller object that maps inputs to actions
    '''
    def __init__(self, *args, **kwargs):
        super(ArduinoHIDJoystickController, self).__init__(*args, **kwargs)

    def init_js(self):
        '''
        attempt to init joystick
        '''
        try:
            self.js = ArduinoHIDJoystick(self.dev_fn)
            if not self.js.init():
                self.js = None
        except FileNotFoundError:
            print(self.dev_fn, "not found.")
            self.js = None
        return self.js is not None


    def init_trigger_maps(self):
        '''
        init set of mapping from buttons to function calls for RC controller
        '''

        self.button_down_trigger_map = {
            'mode' : self.toggle_mode,
            'L1' : self.increase_max_throttle,
            'R1' : self.decrease_max_throttle,
        }

        self.axis_trigger_map = {
            'left_stick_horz' : self.set_steering,
            'right_stick_vert' : self.set_throttle,
        }
```

### 終わりに

近藤科学のMC-8のプロポを試したのみで本格的なプロポは実際に持っていないため、もし何か間違いがあったら、指摘のほどお願いします。
calc()とCSS変数の分かりにくい挙動

## CSSのcalc()関数とは

`calc()`を使うと、プロパティ値の中で数値の四則演算ができる。単純な数値同士の計算はSassなどのプリプロセッサでも可能だが、`calc()`は異なる単位系同士の足し引きができるのが便利なポイントだ。

```scss
.foo {
  // SCSSなら同じ単位同士の足し引きは可能だが…
  margin-top: 30px + 30px;
  // これはコンパイルエラー
  margin-top: 2em + 30px;
  // 異なる単位系同士の演算はcalc()が必要
  margin-top: calc(2em + 30px);
}  
```
## calc()での加算減算は単位なしのゼロを受け付けない

このとき通常のプロパティ値と異なる点として、**たとえ0であったとしても、単位のない数値の利用に制約がある**という仕様がある。

>That is, width: calc(0 + 5px); is invalid, even though both width: 0; and width: 5px; are valid.
[CSS Values and Units Module Level 3: 8.1.2. Type Checking](https://drafts.csswg.org/css-values-3/#calc-type-checking)

もちろん、掛け算の係数や割り算の除数に単位なしの値を使うことは問題なくできる。しかし、`calc()`の中の足し算・引き算に単位のない数値が含まれていると、`calc()`を使った値を含むプロパティ全体が無効になる。**これは数値が0のときも例外ではない**。

```scss

.foo {
  // これは当然問題がない
  margin-top: 0 + 100px; // 1
}

.foo {
 // これはNG
  margin-top: calc(0 + 10px); // 2
}
```

**上の例の場合`// 2`の行全体が無視されるので .foo は margin-top: 100px; が適用される。**

- `calc(0 + 10px)`のようなブラウザにとって無効な記述があっても、Sassのコンパイルエラーにはならない
- Sassの通常の演算機能で `0 + 10px` や `10 + 10px`は普通に計算されるので一見違和感がない
- `margin-top: 0;`のような書き方はCSSで普通にする
- sass-lintで`0`からは単位を外す書き方を推奨されることが多い（`zero-unit`ルール）
- あんまりネットでこの仕様が紹介されていない（ような気がする）

このような分かりにくさがあり、`calc()`のこの挙動は気付きにくい。

とはいえ、あえてゼロを`calc()`の中に混ぜたいというのは中々実際の作業としては考えにくい。本当に注意が必要なのは`calc()`とCSS変数を組み合わせた場合だ。

## calc()とCSS変数を組み合わせたときは特に注意

`calc()`が単位なしの0を加算減算で認めないという仕様は、CSS変数を組み合わせたときも変わらない。直接CSS変数の値がどうなっているのかが見えないため、値が単位なしの数値のときが更に分かりにくい。

```scss

:root {
  --my-margin: 30px;
  --foo-margin: 2em;
}

.foo {
  // これだけだったらもちろん有効
  margin-top: calc(var(--my-margin) + var(--foo-margin));
}

.bar {
  // もし .foo の外側でCSS変数が上書かれていたら……
  --foo-margin: 0;
}
```
```html
<p class="foo">このfooは margin-top: calc(30px + 2em); になる</p>
<div class="bar">
  <p class="foo">このfooは margin-top が解釈されない!</p>
</div>
```

上の例のように、CSS変数は普通のプロパティと同じように上書きができる。自分の意図しないところでいつのまにか値が上書かれてしまっていたりすると、あるところでは正常に動いていた`calc()`がある場所では動かないということも十分起こりうる。

## 単位のないゼロによるバグに注意

この`calc()`の仕様を把握しておけば、意図しないスタイルの挙動が発生したときにデバッグがしやすくなる。CSS変数と`calc()`の組み合わせは便利な場合もあるが、意図せず単位のない値が入らないかを十分に注意したい。
Railsを使って、イベントのイマココを管理するサービスをリリースした話

# はじめに
サラリーマンをしている傍、自宅で個人開発をしている「[にゅ〜ぶる(@newburu)](https://qiita.com/newburu)」です。
新しいサイトを立ち上げるたびに、何かしらアウトプットしていこうと思い、
「[BLOG](http://blog.newburu.com/)」と、ここQiitaに投稿していきます！

# こんなサービス作りました
イベントの進捗（イマココ）を管理できるサービスを作りました❗️❗️
その名も、「[イマココアラート](https://imakoko-alert.com/)」
よかったら使ってみてくださいね❤️

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/%E6%8B%A1%E6%95%A3%E5%B8%8C%E6%9C%9B?src=hash&amp;ref_src=twsrc%5Etfw">#拡散希望</a><br>🥳🎉🎊サービスリリース🎊🎉🥳<br><br>イベントのイマココを管理・共有しよう❗️<br><br>・イベントの進行管理に<br>・学校行事の共有に<br>・タスク管理に<br><br>リリースしました‼️<a href="https://twitter.com/hashtag/%E3%82%A4%E3%83%9E%E3%82%B3%E3%82%B3%E3%82%A2%E3%83%A9%E3%83%BC%E3%83%88?src=hash&amp;ref_src=twsrc%5Etfw">#イマココアラート</a><a href="https://t.co/NHi62SQsmk">https://t.co/NHi62SQsmk</a></p>&mdash; イマココアラート公式 (@imakoko_alert) <a href="https://twitter.com/imakoko_alert/status/1179009323801800705?ref_src=twsrc%5Etfw">October 1, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# なぜ作ったのか？
きっかけは、道で声をかけられた事から始まります。
その日は、近くの小学校で運動会でした。🏃‍♀️🇯🇵🏃‍♂️🇺🇸

おばさん「すみません。もう運動会終わっちゃいましたかね？」
私「う〜ん。わかりませんね…💦」
おばさん「ありがとう。とりあえず行ってみます…」

そうなんですよね。
学校行事って、開始時間だけが決まっていて、現在何をやっているかって、現地にいる人に確認するしかないんですよね…

そこで思いついたのが、当サービスのアイディアでした。

イベントの進捗を、皆んなで共有・連携できるサービスがあれば、暑いし遠い場所まで確認のために行く必要はないですよね。
※そのおばさんがスマホを使いこなせるかはまた別のお話🤣

# システム構成(2019/11/16時点)
* Rails6
* Bootstrap4
* ConoHa VPS
* Nginx / Puma

Railsはバックエンド専用としてAPIのみにして、フロントエンドにはモダンでリッチなの使って
あーだこーだした方が、スキルや記事的には良いのかもしれませんが、
Simple is Best❗️

いわゆる「駆け出しエンジニア」と言う方々にも、取り組みやすく？真似しやすく？みたいな感じを主に考えて取り組んでます。

開発機能としては、

* Trelloで機能出し
* 実装するとなったら、GitHubにIssuesを作って、GitFlowで開発

独りでの個人開発ですが、この辺りはチーム開発も見据えて取り組むようにしています。

# いちばんハマったところ
現在、どのプログラムが進行中なのかの判断ロジックにはハマりました…

既にご利用頂いた方はわかると思いますが、イベントの計算する情報としては、

* イベント実施日時
* プログラムの長さ
* イマココボタンが押された最終プログラム

<img width="1152" alt="イベント編集画面.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118481/080fc8f5-e2d6-1ffe-9e70-2c0cef1b10a4.png">

この３つの情報から、イマココのプログラムを求める必要がありました。

基本の判定ロジックとしては、
`実施日時を開始として、プログラムの長さを足しながら、プログラムの開始・終了時刻を求めます。
その範囲に現在日付が入っていれば、そこが現在プログラム。`

ここに、イマココボタンが押されたと言う情報を足して計算します。

<img width="491" alt="イマココ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118481/6ad5b1e1-6d13-f8b7-5bd5-6d8f5326f462.png">

`イマココの種類としては、３パターンを用意しています。
それぞれ、プログラムの長さを３分割して、プログラムの開始時間を調整します。
そこから本来の長さを足して行って、あとは基本と同じ考えですね。`

もっと他に良いロジックやデータの持ち方があったのかもしれませんが、当サービスでは、このロジックを採用しています。

# イマココアラートの使い方って？
さて、ここからは、サービスの説明を少しさせてください。
最初に説明させて頂いた、学校行事への利用の他にも、イマココアラートは色んな場面での利用が可能と思っています。

* イベントのイマココ管理
 * もくもく会のスケジュール管理
 * LT大会のスケジュール管理
* ライブなどのイマココ管理
 * セットリスト管理
* タスク管理
 * １日の作業管理

などなど…
他にも皆さんの考えひとつで、色んな使い方は無限にあると思っています。
ぜひ、自由に使ってみてください！

# これから
少しずつかもしれませんが、機能追加をどんどんしていこうと思っています。
次のサービス案も既にあったりしますが笑

きちんと運用していくところも学ぶために、しばらくはイマココアラートを続けていく予定です。
#docker の volume と mount の基本が分からない ( docker run であそぼ )

今さらながら分かってなかった。
だいたいdocker-compose とかでやっちゃうじゃないですか、はい。

環境はdocker for mac

# まとめ

- `-v host:guest` で volume を指定する
- host の指定方法によって 

# docker volume

- docker volume を `-v host:guest` で指定する
- カレントディレクトリをマウントしようとしても、そうはならない様子

```
$ docker run --rm --name alpine-volumed -v foo:/bar -it alpine ash
/ # echo "ABC" > /bar/abc.txt
/ # exit
```

```
$ docker run --rm --name alpine-volumed -v foo:/bar -it alpine ash
/ # cat /bar/abc.txt
ABC
```

# docker inspect

- host側の絶対パスを指定しなかった場合は、docker的などこかにマウントされてそう

```
$ docker volume inspect foo
[
    {
        "CreatedAt": "2019-11-18T04:56:31Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/foo/_data",
        "Name": "foo",
        "Options": null,
        "Scope": "local"
    }
]
```

Host にはそんなディレクトリないってさ
部活やめるってさ

```
$ ls /var/lib/docker/volumes/foo/_data
ls: /var/lib/docker/volumes/foo/_data: No such file or directory
```

# Hostのディレクトリにマウントする

Host にディレクトリ作成しておく

```
$ mkdir -p ~/foo
$ cd ~/foo
$ pwd
/Users/yumainaura/foo
```

- Host の絶対パス `/Users/yumainaura/foo` を docker container の `/bar/` にマウントする
- docker container でマウントディレクトリにファイルを作成する

```
$ docker run --rm --name alpine-volumed-on-host -v /Users/yumainaura/foo:/bar -it alpine ash
/ # echo "XYZ" > /bar/xyz.txt
```

Hostにファイルが作成されていいる

```
$ cat ~/foo/xyz.txt
XYZ
```

# チルダでのパス省略指定 - Hostでエイリアスされているディレクトリ

駄目だろうと思い Docker for Mac で試したところ、こちらもいけるようだ

```
$ docker run --rm --name alpine-volumed-on-host -v ~/foo:/bar -it alpine ash
/ # echo "CTO" > /bar/cto.txt
```

```
$ cat ~/foo/cto.txt
CTO
```


# 参考

[【Docker】Dockerでホストのディレクトリをマウントする - Qiita](https://qiita.com/Yarimizu14/items/52f4859027165a805630)

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
ストックすることの大切さと、一歩踏み出す大切さ

# はじめに
サラリーマンをしている傍、自宅で個人開発をしている「[にゅ〜ぶる(@newburu)](https://qiita.com/newburu)」です。
新しいサイトを立ち上げるたびに、何かしらアウトプットしていこうと思い、
「[BLOG](http://blog.newburu.com/)」と、ここQiitaに投稿していきます！

※書いていたのをすっかり忘れて半年たって公開…笑

# 作ったサイトの紹介
今回作ったサイトは、こちら。
　「[JobLvマネージャー](https://joblv-manager.herokuapp.com/)」です。

自分のJob（職業）を管理、LvUpをしながら、Twitterと連携（現時点では、名前変更）することが出来ます。

<img width="1111" alt="スクリーンショット 2019-04-19 22.22.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/118481/24d49170-feba-5d5b-c900-aabce0268d16.png">

# 作ろうと思ったキッカケ
Twitterで繋がったユーザーさんが、名前の後ろに「〇〇Lv1」みたいなのをつけているのを見て思いつきました。
いつの間にか、こっそりLvアップしていたり、新しいものに変わっていたり。
そういう遊び心に興味が湧いて、この仕組みをもっと簡単に、管理や変更ができるようにしたサービスを作ってみたいと思ったのが始まりです。

# ストックすることの大切さと、一歩踏み出す大切さ
これをタイトルした理由は、本システム、３日（時間だと８時間）で作りました。
内容からして、これが早いのかわかりませんが、これだけの時間でサービスリリースまでいけたのは、
・Railsのおかげ
・素材サイト様のおかげ
・API(Twitter)のおかげ
・今まで色々プロダクトを作ったおかげ（機能のより集め（コピペ））

Railsを使うと、簡単のWebシステムが作れます。
いろんなGemが用意されています。
規約にそえば、簡単に作れます。

素材サイト様、画像にアイコンにフォントまで、いろんなものが無料で使えます。
いつもありがとうございます！

API使えば、別のシステムの機能を自分のもののように使えます。
どんどん使いましょう！

新しいもの、面白そうなものがあったら、とりあえず触ってみましょう！
形にならなくても問題ありません。いつか使える時が来ます。ストックしておきましょう。
最新の技術だからと追いかけて、サービスリリースする必要も無いと思います。
触ってみてストックする事が大事。
背景画像の比率を保ったまま、レスポンシブ対応する

>背景画像の比率を保ったまま、レスポンシブ対応する
https://taneppa.net/responsive_background_image/

これ！これを探していた！
画像ではなく背景画像として画像を表示したい場合に使用できるcssの書き方。

画像が幅300px 高さ200pxの場合の例

```css:style.css
div{
    width: 95%;
    height:0;
    /* (画像の高さ(200) / 画像の横幅(300)) × 95(widthのパーセンテージ) */
    padding-top: 63.33333333333333%;
}
```
bashシェルの操作を快適にするキーバインド

普段のタイピングからホームポジションを意識して、こまめに`Tab`を押すことを意識するといいことがあるぜ。ちなみに`Tab`は小指でおすんやで。
#キーバインド一覧
見やすいかなと思って大文字で書いたけど小文字で使えます

|キー|効果|
|---|---|
|Ctral+A|カーソルを行の先頭に移動する|
|Ctrl+E|カーソルを行の末尾に移動する|
|Ctrl+D|一文字削除(Delete)|
|Ctrl+H|一文字削除(Backspace)|
|Ctrl+P|上キーと同じ|
|Ctrl+N|下キーと同じ|
|Ctrl+F|一文字右へ|
|Ctrl+B|一文字左へ|
|Ctrl+Y|ヤンクする|
|Ctrl+L|clearコマンド|
|Ctrl+S|画面への出力を停止する|
|Ctrl+Q|画面への出力を再開する|
|Ctrl+C|実行中のコマンドを中断する|
|Tab|ディレクトリやコマンドの補完|
指適当タイピングだと`Ctrl+?`系は使っても恩恵が得られなかったりするかもだけど、`Tab`は入力ミスも防げるしとっても便利だからたくさん使って。

ちなみにこれはbashのemacsモードで、`set -o vi`でviモードになるよ。僕はemacsモードを使ってるけどvim信者になりたいから移行予定。
新人が今後の業務効率化のために色々なTera Termマクロ作ってみた1(初めの一歩loginマクロ)

# 初投稿なのでまずは自己紹介

普段は東京某所でネットワークエンジニアやってます。
大学は文系でネットワークエンジニアとしても新人なので全くの0からスタート。
日頃、CentOSのエラーメッセージやExcelなどと格闘してる。
意外と学生時代には自作PCを計3台組んだり、文系だけどプログラミングの授業を取ったり、全く知識がなかったかと言えばそうでもない。
しかし、ネットワーク系は人生でほとんど触れてこなかったので頑張ってる。

#自分語りはこの辺にして本題

###何でTera Termのマクロなんてやろうと思ったか？

理由としては、自己紹介にあったようにお世辞にもLinuxのことをよく知っていてコマンドなんて早くぱっぱと打てる訳でもない自分なので、何かしらやろうとするとグダグダと時間がかかってしまうわけです。
で、何回も「これさっきもやったコマンドだな。」とか「ログインする度に毎回やってるじゃねぇか！？めんどくさい！！」という状況がある事に気付きました。
そして、「そういえば、Tera Termでマクロ作ってログイン簡単にしてる先輩居たな。あれって更にコマンド実行とかもできるのかな？」というのが、始まりでした。(そして、思いのほか効率化するの楽しくてハマっていくのですがw)

###ログインだけ自動化してみる

参考:https://qiita.com/yasushi-jp/items/ec578da715f139542886

```login.ttl
username = 'XXXX'                                          ;ログインするサーバーのユーザー名
hostname = 'XXX.XXX.XXX.XXX'                               ; ログインするサーバーのホスト名またはIPアドレス
passwdfile = 'passwd.dat'                                  ; パスワード暗号化ファイル
portnum = '22'                                             ;port番号の指定

getpassword passwdfile username userpasswd                 ; パスワード暗号化ファイルからパスワード取得

msg = hostname                                             ;まず文字列の変数msgに先に定義した文字列の変数hostnameを入れる
strconcat msg ':portnum /ssh /auth=password /user='        ;定義した文字列変数msgの後にさらに文字を付け足す
strconcat msg username                                     ;更に先に定義した文字列の変数usernameを付け足す
strconcat msg ' /passwd='                                  ;またまた文字を付け足し
strconcat msg userpasswd                                   ;更に先に取得したパスワードである文字列の変数userpasswdを付け足す
strconcat msg inputstr                                     ;ここは要らない気がする??

connect msg                                                ;ここまで作ってきたmsgの文字列を元に接続
```
loginだけ自動化するとこんな感じになる。
このログインをするマクロは初回だけパスワードを聞いてきて自動でパスワード暗号化ファイルも作ってくれる。
だいたいはコードの中のコメントで簡単に説明してるつもりだが、付け足して説明したい所を説明する。
###割と複雑なconnectコマンド
[Tera Termコマンドリファレンス](https://ttssh2.osdn.jp/manual/ja/macro/command/index.html)を見ればわかるのだが、connectコマンドの仕様がとても複雑、、、しかし、その代わり色々な接続の仕方が可能になっている。
このマクロではstrconcatコマンドを使って文字列を付け足していってるせいで少し分かりにくいが、
`connect 'myserver /ssh /auth=password /user=username /passwd=password'`
という書式で使うconnectコマンドを使っている。
###これだけで少しセキュリティ的に安全!!getpasswordコマンド
これもまた[Tera Termコマンドリファレンス](https://ttssh2.osdn.jp/manual/ja/macro/command/index.html)を見ればわかるのだが、getpasswordコマンドはconectコマンドと打って変わって簡単な仕様になっている。
書式は一種類しかなく
`getpassword <filename> <password name> <strvar>`
という書式だ。
しかも、`<filename>`の部分で指定した暗号化ファイルがなければ新しく暗号化ファイルを作ってくれて、更に指定されたパスワードがファイルの中になければ、パスワードダイアログボックスが現れ、入力されたパスワードは文字列変数 `<strvar>` に保存される。
同時に、その新しいパスワードは暗号化されパスワード識別子 <password name> と共にファイルに書き込まれる。
というとても気の利いたコマンドである。

#次回予告
次の投稿はいつになるか分かりませんが、マクロの中でrootに昇格したりするマクロや忘れがちなlog取りを自動化するマクロを紹介&解説したいと思います。
年末まで毎日webサイトを作り続ける大学生 〜31日目 自動再生＆ループするスライダーをCSSだけで書く〜

##はじめに
こんにちは！@70days_jsです。
以前もSliderを作りましたが、今日は自動で画像が切り替わるタイプのものをcssのみで作りました。

扱う技術レベルは低いですが、同じように悩んでる初心者の方を勇気付けられれば幸いです。
今日は31日目。(2019/11/18)
よろしくお願いします。

##サイトURL
- https://sin2cos21.github.io/day31.html

##やったこと
自動で画像が切り替わるSliderをcsのみで作りました。主に[参考欄1に載せてあるサイト] (http://css.programming.jp/pages/slideshow_slide&fade_responsive.html)の方法を使わせていただきました。↓

![test2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/46a66a92-827f-d2c6-5789-cbc5874741bd.gif)


html部分は少しだけなので全部載せます。↓

```html
<body>
    <div class="wrapper">
        <div id="photo1" class="image"><img src="day31_image/1.jpg"></div>
        <div id="photo2" class="image"><img src="day31_image/2.jpg"></div>
        <div id="photo3" class="image"><img src="day31_image/3.jpg"></div>
        <div id="photo4" class="image"><img src="day31_image/4.jpg"></div>
        <div id="photo5" class="image"><img src="day31_image/5.jpg"></div>
        <div class="boxDisplay"></div>
    </div>
</body>
```

少ないですね。
imgタグをそれぞれdivで囲んで、それをまたdivでwrapしてるだけです。

次にcss部分です。こちらも少しなので全部載せます。↓

```css
.wrapper {
    position: relative;
    margin: 100px auto;
    max-width: 600px;
    overflow: hidden;
}

.image img {
    position: absolute;
    top: 0;
    left: 100%;
    width: 100%;
    animation: imgTrans 10s infinite;
}

#photo1 img {
    animation-delay: 0s;
}

#photo2 img {
    animation-delay: 2s;
}

#photo3 img {
    animation-delay: 4s;
}

#photo4 img {
    animation-delay: 6s;
}

#photo5 img {
    animation-delay: 8s;
}

@keyframes imgTrans {
    0% {
        left: 0%;
        opacity: 0;
    }
    5% {
        left: 0%;
        opacity: 1;
    }
    20% {
        left: 0%;
        opacity: 1;
    }
    21% {
        left: 0%;
        opacity: 0;
    }
    100% {
        left: 0%;
        opacity: 0;
    }
}
.boxDisplay {
    padding: 30%;
}
```
お分かりだと思いますが、animationを使って実装しました。
画像は最初left:100%;なのでボックス外にありますね。
delayで2秒ずつの間隔でleft: 0%;にして表示されるようにしています。
ループの境目でうまくつなぎ合わせるために21%でopacityを0にしています。これは今回画像が5枚だからですね。（10s/5枚=2秒)
ついでに言うと、これ1回目と2回目以降のループでは少し動きが違うんですが、分かりづらいので表示順をgifで見てみましょう。↓
![test.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516248/d0d87ec2-5713-fd26-d98d-2988f06e1647.gif)

すみません、逆に混乱させてしまったかもしれませんね。1回目は実は画像は全て表示されています。2回目からは消える（ように見える）のですが、ここら辺は秘伝のタレ的な感じなのでやりやすい方法は人それぞれかもしれません。

ちなみにソースに戻りますが、最後の.boxDisplayでpaddingを入れている部分も重要です。

>.boxDisplay {
    padding: 30%;
}


今回表示するもの（コンテンツ）は画像しかなくて、画像のサイズも直接に値を指定しているわけではありません。
なので、ここでpaddingを入れておかないとボックスが潰れて画像が表示されなくなります。


##感想
最近cssの勉強が多いのですが、cssはこの先どうなるのだろうか・・・なんてたまに考えます。
flex boxやgridなんか便利だなとは思うんですが、まだどこか痒いところに手が届かないというか、全体で見たら少し煩雑な気がします。
何だろう、できない言い訳かな。勉強しなきゃな。

最後までお読みいただきありがとうございます。明日も投稿しますのでよろしくお願い致します。

##参考
1. css_animation2 (http://css.programming.jp/pages/slideshow_slide&fade_responsive.html)
2. 写真が画面の端から端へ流れる無限ループするアニメーション｜chocolat (https://demos.chocolat5.com/loop-image-animation/)
3. 無料の写真素材はフリー素材のぱくたそ (https://www.pakutaso.com/)

大変参考にさせていただきました。ありがとうございます。
[Rails] VSCodeでSolargraphを使おうとしたら、Bundlerが無いというエラーが出たときの解決策

# 環境
+ VSCode v1.40.1
    + (extension) Ruby 1.1.2
    + (extension) Ruby-Solargraph 0.21.1
+ Ruby 2.5.1
+ rbenv 1.1.2
+ Rails 5.2.2.1

# 状況
普段はGoを書いているのですが、急遽別案件でrailsを書くことになり、VSCodeで開発環境を構築しようとしました。
補完のために「Ruby-Solargraph」というVSCodeの拡張を入れたところ、

```
/Users/me/.rbenv/versions/2.5.1/lib/ruby/2.5.0/rubygems/dependency.rb:312:in `to_specs': Could not find 'bundler' (1.16.3) required by your /Users/me/proj/Gemfile.lock. (Gem::MissingSpecVersionError)
To update to the lastest version installed on your system, run `bundle update --bundler`.
To install the missing version, run `gem install bundler:1.16.3`
Checked in 'GEM_PATH=/Users/me/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems:/Users/me/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0', execute `gem env` for more information
```

このようなエラーが発生しました。

# 調査
参加したプロジェクト自体、結構古いbundlerでgem管理がなされていました。

```Gemfile.lock
...
BUNDLED WITH
   1.16.3
```

念の為bundlerのバージョンを確認すると、指定されているbundlerはインストールされているようでした。

```
$ bundler -v
Bundler version 1.16.3
```

このプロジェクトから出て、Ruby-Solargraphを導入した際にインストールされたsolargraphを動かしてみると、

```
$ cd ..
$ solargraph -v
0.37.2
```

問題なく動きました。

[rubygems.orgで、solargraphの依存を確認する](https://rubygems.org/gems/solargraph)と、インストールされたsolargraph(v0.37.2)は、bundlerのv1.17.2以上を要求していました。

# 対応
対応策は、いくつか考えられます。
本質的には同じで、使っているbundlerで動くsolargraphを入れる、ということになります。

1. Projectでsolargraphを管理する。
2. solargraphのバージョンを下げる。

## 1.Projectでsolargraphを管理する場合

Gemfileにsolargraphを追加します。

```
...
group :development do
  ...
  gem 'solargraph'
end
```

bundlerでインストールします。

```
$ bundle install
```

VSCodeで使用するbundlerを、プロジェクトのものに切り替えます。

```setting.json
{
...
  "solargraph.useBundler": true,
...
}
```

これでVSCodeを再起動すると動きました。

## 2.systemで使うsolargraphのバージョンを下げる
調べると、solargraphのv0.31.2以降では、bundler(=> v1.17.2)を要求していました。
そこで、システムにv0.31.2のsolargraphをインストールします。

```
$ gem install solargraph -v 0.31.2
```

これでVSCodeを再起動すると、無事Language serverが起動しました。

# まとめ

globalを汚すのに抵抗がある場合は「１」を、
自分しか使わないgemをprojectに管理させるのに抵抗がある場合は「2」を行うのが良いかと思います。

私の場合は、他がruby mineを使っている方々だった(&rubyは滅多に使わない)ので「２」で対応しました。

本当は、うまいこと、システムのsolargraphを動かすときにだけbundlerの依存関係チェックをすり抜けるようにできたらよかったのですが...

同じ症状でお困りの方の参考になれば幸いです。
初心者によるプログラミング学習ログ 162日目

# 100日チャレンジの162日目

twitterの100日チャレンジ#タグ、#100DaysOfCode実施中です。
すでに100日超えましたが、継続。

100日チャレンジは、ぱぺまぺの中ではプログラミングに限らず継続学習のために使っています。

162日目は

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br>162日目<br><br>メンターさんのwebサイトコーディング課題<br>コンテンツ部分<a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a> <a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアとつながりたい</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1196154927539638272?ref_src=twsrc%5Etfw">November 17, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
【python】画像処理その4 ~フィルター~

#SciPy#
「サイパイ」って読むらしいです.
この中にある`ndimage`と`signal`を使っていきますです.

#ガウシアンフィルタ#
今回はガウシアンフィルタをかけていきます.
画像が平滑化されます.
とりあえずやってみましょう.
ガウシアンフィルタとはなんぞ?って人はこちら→[ガウシアンフィルタの解説](https://imagingsolution.blog.fc2.com/blog-entry-88.html)

##コードと結果##

```python
from PIL import Image
import numpy as np
from matplotlib import pylab as plt
from scipy import ndimage
#画像を開いてグレーにしてNumPy配列にする
img = np.array(Image.open('lena.jpg').convert('L'), 'f')
#ガウシアンフィルタをかける
img_gaussian = ndimage.filters.gaussian_filter(img, 10)
#表示
plt.imshow(img_gaussian, cmap='Greys_r')
plt.show()

```

![gaussian_10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294646/0d7e0302-5694-7960-8dfd-2b54b925d8c3.png)

ぼやっとしましたね.
因みに,`ndimage.filters.gaussian_filter(img, 10)`
この引数の二番目は`標準偏差σ`のことらしいです.
この値が大きとよりぼやっとします.
さっきの例は`σ=10`でした.
`σ=2`だとこんな具合です.

![gaussian_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294646/0c1f2ba1-688f-75a1-57a6-600bf1157adb.png)

さっきよりハッキリしてますね.

#ウィーナーフィルタ#
お次はウィーナーフィルタです.
ウィーナーフィルタとはなんぞ?って人はこちら→[ウィーナーフィルタの解説](http://www.allisone.co.jp/html/Notes/DSP/Filter/Wiener-filter/index.html)

##コードと結果##

```python
from PIL import Image
import numpy as np
from matplotlib import pylab as plt
from scipy import ndimage
from scipy import signal

#画像を開いてグレーにしてNumPy配列にする
img = np.array(Image.open('lena.jpg').convert('L'), 'f')

#ウィーナーフィルタをかける
img_wiener = signal.wiener(img, 151, 1999.0)

#画像を連結して表示する
#連結するために配列を用意する
images = [img, img_wiener]
#concatenateは連結するって意味
img_show = np.concatenate(images, axis=1)

#表示
plt.imshow(img_show, cmap='Greys_r')
plt.show()
```

![gray_and_wiener.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294646/ea3897ed-3163-7006-4063-117124ac8d26.png)

なんかいい感じですね(小並感)

#参考#
・http://www.turbare.net/transl/scipy-lecture-notes/advanced/image_processing/index.html
・http://www.mwsoft.jp/programming/computer_vision_with_python/1_4_scipy.html
vim-clap で MRU

ポップアップウィンドウで CtrlP や unite や Denite のように fuzzy マッチしてくれる [vim-clap](https://github.com/liuchengxu/vim-clap) が、だいぶ使い勝手が良くなってきました。
MRU も vim-clap で使ってみたいと思い始めたのですが、あいにくまだない provider （そう呼ぶらしい）のようです。

ということで CtrlP の MRU で使用しているファイルを clap-vim から使うようにしてみました。

``` vim
let g:clap_provider_mru = {
      \   'source': filter(readfile(expand('~/_vim/.ctrlp/mru/cache.txt')), { i, x -> filereadable(x) }),
      \   'sink': 'edit',
      \}

```

Ctrlp と vim-clap を使っていれば、このような設定を .vimrc に加えると `:Clap mru` で clap-vim が MRU を使えるようになります。

## 追記

この設定だと読み込むファイルが変更されても、`:Clap mru` には反映されないみたい。
意図した結果なのか、バグなのか？
【SQL入門】よく使うSQL

## 概要
Railsに頼りすぎてSQLがわかってない！
ということでSQLについて少し勉強してみました。

データベースに関わる言語ってちょっと難しそう・・と思ってたのですが、基本は意外と簡単なのかなと思いました。

この辺は抑えとこ〜ってとこだけでもまとめようかなと思ってます。

## 勉強に使ったサイト
[SQLZOO](https://sqlzoo.net/)ってサイトです。
日本語訳にも対応してますし、決して難しくはないので初心者にはいいんじゃないかと思います。


## そもそもSQLとは
> SQLはデータベース言語の中で、最も普及している言語の一つです。DBMS（データベース管理システム）上でデータやデータベースを制御するための言語であり、ユーザーやシステムからの命令を受けてRDB（リレーショナルデータベース）にクエリ（問い合わせ）を行い、結果を返します。返ってきた結果はモニターなどに表示されます。

とのこと
ちなみに[参考はこちら](https://hnavi.co.jp/knowledge/blog/sql/)

つまりはRDB(リレーショナルデータベース)とおしゃべりするための言語ってことかな。

## 前提のデータベース

### worldテーブル
|name|continent|area|population|gdp|
|:-:|:-:|:-:|:-:|:-:|
|Afghanistan|Asia|652230|25500100|20343000000|
|Albania|Europe|28748|2831741|12960000000|
|Algeria|Africa|2381741|37100000|188681000000|
|Andorra|Europe|468|78115|3712000000|
|Angola|Africa|1246700|20609294|100990000000|

## SELECT
SELECTを使うと指定したカラムの値を出してくれます。
書き方は、下記の通り。

```sql
SELECT <カラム名> FROM <テーブル名>
```

上記のデータベースを参考に、nameカラムを出力してみましょう。

### 入力
```sql:sql
SELECT name FROM world
```
### 出力
|name|
|:-:|
|Afghanistan|
|Albania|
|Algeria|
|Andorra|
|Angola|

こんな感じです。
SELECTは出力結果の大枠を決めるようなイメージですかね。

## WHERE
さっきのSELECTでヒット取得した値の中から、WHEREで条件を与えて表示数を絞ってあげます。。
今回はこんなお題で出力を考えてみます。
**areaが28000以上の国を表示するための条件とする。出力結果では、nameとareaを表示すること**

では、書いてみます。まずはnameカラムとareaカラムを表示する必要があるので、こんな感じ。

```sql:sql
SELECT name, area FROM world;
```
これで、worldテーブルの中からnameカラムとareaカラムだけ取得した状態になります。
ここでさらにWHEREを使って条件を与えてあげましょう。

### 入力
```sql
SELECT name, area FROM world
  WHERE area >= 28000;
```
こいつの出力がどうなるかというと・・・。

|name|area|
|:-:|:-:|
|Afghanistan|652230|
|Albania|28748|
|Algeria|2381741|
|Angola|1246700|

areaが28000よりも小さかったAndorraがなくなり、nameとareaカラムを同時に取得する。という形になります。

WHEREの基本的な使い方はこんな感じです。

```sql
  WHERE <カラム名> <検索条件>;
```

## LIKE
WHEREと組み合わせて使うことが多いのが、このLIKEというもの。
今までは条件を指定してあげて、表示数をコントロールしている感覚でしたが、LIKEは「検索」のために使います。
つまり、**レコードの値は何か**を見ようとしてくれる、ということです

こんなお題で検索をしてみましょう。
**continentに「a」を含む物を検索し、nameとcontinentを併せて出力する。**

今回もまずはSELECTから。nameとcontinentが必要になります。なので・・・

```sql
SELECT name, continent FROM world
```
こんな感じです。
ここまでは慣れてきた方も多いのではないでしょうか。

ではいよいよ**continentに「a」を含むものを検索**します

### 入力
```sql
SELECT name, continent FROM world
  WHERE continent LIKE  '%a%'
```

### 出力

|name|continent|
|:-:|:-:|
|Afghanistan|Asia|
|Algeria|Africa|
|Angola|Africa|

こんな感じになります。
aを含まないEuropeは検索にヒットせずに表示されないということですね

この検索方法、**%をつける位置によって意味が変わります。**
ですが今回は割愛させてください。

参考までにリンクを貼っておきますのでご覧ください。
[【SQL】LIKE句](https://qiita.com/chihiro/items/46da8571d4cf37d3123c)

## まとめ
就職活動をしていると、やはりSQLの理解がどこにいっても問われます。
当然といえば当然ですよね・・・重要なデータを管理するための言語ですし・・・。

本記事ではあまり深掘りはできていないのですが、SQLに苦手意識のある方、抵抗感がある方は多いんじゃないかなと思います。
ただ、ひとまずは**SELECT、WHERE、LIKEの3つ**が使えれば、なんとなくデーターベースを操作するという感覚をつかみ、苦手意識が薄れるのではないかと思います。
[ゼロから作るDeep Learning]Momentum手法とAdaGrad手法の実装

#はじめに
この記事はゼロから作るディープラーニング 7章学習に関するテクニックを自分なりに理解して分かりやすくアウトプットしたものです。
文系の自分でも理解することが出来たので、気持ちを楽にして読んでいただけたら幸いです。
また、本書を学習する際に参考にしていただけたらもっと嬉しいです。


#Momentum手法実装

```python
class Momentum:
    def __init__(self, lr=0.01, momentum=0.9):
        self.lr = lr # 学習率
        self.momentum = momentum # モーメンタム定数
        self.v = None # 速度
    
    def update(self, params, grads):
        if self.v is None: # 最初だけ各パラメータの速度を初期化する
            self.v = {}
            for key,val in params.items():
                self.v[key] = np.zeros_like(val) # 各パラメータの速度にゼロを入れて初期化する
            
        for key in params.keys():
            self.v[key] = self.momentum *self.v[key] - self.lr * grads[key] # 現在の地点での速度を求める
            params[key] = params[key] + self.v[key]
```

Momentum手法では速度という概念を使うので、まず最初にインスタンス変数で速度を作成します。

勾配から現在の地点の速度を求め、それを現在の重みパラメータにそれぞれ足して、パラメータを更新します。


#AdaGrad手法の実装

```python
class AdaGrad: # 学習係数の減衰を各パラメータに行える
    def __init__(self, lr=0.01):
        self.lr = lr
        self.h = None
        
    def update(self, params, grads):
        if self.h is None:
            self.h = {}
            for key,val in params.items():
                self.h[key] = np.zeros_like(val)
        for key in params.keys():
            self.h[key] = self.h[key] + (grads[key] * grads[key]) # 各パラメータの勾配の二乗和をhに入れていく
            params[key] = params[key] - ((self.lr * grads[key] )/ (np.sqrt(self.h[key]) + 1e-7))
```

AdaDrad手法に関しては、前回の記事に書いた式をそのまま実装するだけなので、解説する必要はありません。

学習係数を少しずつ小さくしていき、SGDのように引き算をします。
Javaプログラミング　(変数とデータ)

#プログラミングと変数
この記事では変数について紹介します。変数はプログラミングで避けては通れないものです。結局、プログラミングは変数を操作してどうなっていくかとか、情報をやり取りさせるわけですから。
##変数の型
Javaでは変数に型というものが定義されています。
「これは文字列の型」とか「整数の型」、「実数の型」とかいろいろあります。
一覧にすると

|型|中身|
|---|---|
|String|文字列|
|int|整数|
|double|実数|
|boolean|真 or 偽|
他にもありますがこれくらい知っていればいいでしょう。
##変数の使用
Javaでは変数は勝手に使っていいものではないです。
使う前に、この文字をこの型の変数で使いますと宣言しないといけません。

```java
double a;
int b = 2;
String c;
boolean d;
```

こうすることで例えば変数を

```java
a = 0.5;
a = a + 1.2; 
```
と操作することが出来ます。
この時点で変数aは1.7となります。
また、変数は宣言をするときに値を決めてもいいですし、あとから値を入れてもいいです。

ちなみに、変数に何も入っていない状態ではnullという状態になっています。
#今後の記事について
今後はJavaについて解説していきます。今の状態ではなんにもわからないと思います。
しかし、念のために変数について紹介しておきました。
次の記事
クラスについて(しばらくお待ちください。)
Nginx の設定ファイル

Nginx で PHP,Python,Let's Encrypt を使う時の設定ファイルです。

Ubuntu 18.04 で確認しました。
>サーバー名は、example.com とします。

```text:/etc/nginx/sites-available/default
#
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;

        index index.html index.htm index.php;

        server_name _;

        location / {
                try_files $uri $uri/ =404;
        }

#
        location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.2-fpm.sock;
        }

#
location ~ \.py$ {
        gzip off;
        include fastcgi_params;
        fastcgi_pass unix:/var/run/fcgiwrap.socket;
        fastcgi_index index.py;
        fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
        }
#
        listen  443 ssl;
        server_name     example.com;
        ssl_certificate         /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key     /etc/letsencrypt/live/example.com/privkey.pem;

}
#
```
学習したこと

scssの子要素は
＿＿より前は＆で省略できる
その代わりに親要素の｛｝で囲ってあげないといけない

DMR
insert 登録
updateデータの更新
deleteデータの削除
selectデータの操作

制約のバリテーション
not null制約　
一意性制約
主キー制約
外部キー制約
エンティティ　＝　テーブル
カラム　エンティティの属性

主キー　レコードを判別する識別子
devise のヘルパーメソッド
before_action :authenticate_user! コントローラーに設定して、ログイン済ユーザーのみにアクセスを許可する 
user_signed_in? ユーザーがサインイン済かどうかを判定する 
current_user サインインしているユーザーを取得する 
user_session ユーザーのセッション情報にアクセスする 

require メソッドを利用することで、引数に設定した key の 値だけを取得することができます。 

require メソッドを利用することで、引数に設定した key の 値だけを取得することができます。
KiCAD ライブラリ ver4.0.7 再インストールした場合）#ほぼ自分用メモ

KiCADについて

中途入社時に最新だった
 Ver: kicad-5.1.2

からdowngradeした。
⇒ Ver: kicad-4.0.7 へ。

…という時のお話。

---------------------------
---------------------------
Eeschema -- 回路図で、標準defaultには無く、
https://componentsearchengine.com/ga/

から、downloadしてきた部品を配置しよう！

…と思った際、自分ローカル用部品ライブラリのフォルダを参照しているはずなのに、検索しても、その部品が出てこない！…という現象になった。。

そんな際、なんとなく勘で、ライブラリ検索パスに追加すればいいんだろう…とぐらいにしか考えていなかったが、今一歩足りなかったorz

★★★
改めて、RSオンラインの、下記のちゃんと手順を踏めばよかったので、という気づきでした。
https://www.rs-online.com/designspark/pcb-part-library--kicad

上記、
PCB Part Library 使い方 (KiCad編)　にて
　> 手順6. 
 『コンポーネントライブラリ ファイル: 』箇所でも、ローカルパスの中にある、「SamacSys_Parts.lib」を、指定して、追加。

<img width="290" alt="KiCAD)191118_ライブラリファイルへの、Parts-libの追加.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519122/9f656f33-1b2c-5522-e195-61f3253f62c6.png">




そうすることで、これまでDownloadして、zipのまま保管してあったものも使えるようになった。

基本に立ち返るのが大事…んですかねぇ…というのを忘れていた、
そんな時代でした、とさ。

// G
Python-docx保存するとアイコンが変になる。→解決(Python-docx→pywin32へ変更)

趣味でプログラム書いています。pythonでword文書を作成しようとしていますが、
保存するとアイコンが変になります。画像の左のファイルのようなアイコンになります。どなた様かご教授お願いします。

```python:guide.py
import docx
　doc = docx.Document()
　doc.add_paragraph('Hello world!')
  doc.save(r"C:\Users\deer\Desktop\aaaaaaaaaaaaaa.docx")           
```
![aaaaaaaaaaa無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433444/6694fd45-a4d5-3f5c-f3ba-e67b821c6608.png)


※Python-docxからpywin32に変更したら、アイコンが正常になりました。
路線変更します。

```python:guide.py
import win32com.client
import docx
import pythoncom

pythoncom.CoInitialize()  # Wordを起動する前にこれを呼び出す
#Wordを起動する : Applicationオブジェクトを生成する
Application=win32com.client.Dispatch("Word.Application")
#Wordを画面表示する : VisibleプロパティをTrueにする
Application.Visible = True
doc = Application.Documents.Add()
doc.Content.Text = "あいうえおかきくけこ"
doc.SaveAs("C:\\Users\dokar\Desktop\\bbaaaaaaaaaaaaaa")
#Wordを終了する　: Quitメソッドを呼ぶ
Application.Quit()
pythoncom.CoUninitialize()  # Wordを終了した後はこれを呼び出す
```
G suiteを使っている企業のメールテンプレート共有用のGAS付きスプレットシートと作成して、70時間作業効率が上がった話

#最初に
期待してきてくださってたら、申し訳ないのですが、

パソコンがあまり得意ではない人も一緒に働いてます。
キーボードのショートカットはもちろん
メールが過去分を参考にしてメールを作成するため
間違いも多かったりします。
リテラシーの高いとは言えない会社で働いてます。

##要件
1. テンプレートを共有したい。
2. 一部の人がメールのテンプレートを編集
3. 組織に属している人はテンプレートを使える


##施策
###返信定型文を使う。
NG:個人単位更新ができない。
ちょっと使いにくいと言われた

###chrome拡張機能
NG:ソースが公開されているとはいえ、
企業には導入できない。
個人単位更新ができない。

##なければ自作しよう

##なにで作るか。
###chromeの拡張機能
共有が難しそう。保存領域をDBをWEBにする？
APIの開発とか時間からはいらないといけない。

###URLを生成してアクセスする。
https://mail.google.com/mail/?view=cm&to=hoge_to@example.com&cc=hoge_cc@example.com&bcc=hoge_bcc@example.com&su=hogehoge&body=hogehoge
NG:テンプレートが長すぎて、動かないテンプレートがある

###スプレットシートとGMAIL
権限はスプレットシートで管理
https://developers.google.com/apps-script/reference/gmail/gmail-app

createDraft(recipient, subject, body, options)を使えばできそう。
イメージとしては、スプレットシートをインラインフレームで表示。
ボタンを押せば、メールができる。

============
##ユーザ設計
最善案gmailの拡張で組み込む。UI UX的に一番いいかなって思う。 
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175837/55653091-248e-fbf1-5699-68e3d7a56162.png)


妥協案NASに、HTMLを設置。
インラインフレームでスプレットシートを表示ボタンを押すと作成される。http://192.168.1.1/index.html とか。
それをお気に入りにする。

##
============
##開発してみて
様々な制約があって、こうなりました。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175837/ce0efa59-b616-45e1-0575-7eecfb926896.png)

###GAS開発の問題点
- GASでボタンを自動生成できない。
- GASでメニューファンクションに引数を持たせられない。

そのためリンクをGET処理でもってこれるよう調整

この赤いところを押すだけで
gmail上に、下書きとして保存されている！

##まとめ
このスプレットシートは、ドメイン内の人しか開けなくて
管理者にしか公開してません。
時間があれば、ちゃんとgooglemail上に表示されるように拡張機能つけたいです。
中身みたら、choromeの拡張はjavascriptで動くようなので比較的簡単にできそうだと思ってます。


以下の要件が満たせたかな。と思います。
1. テンプレートを共有したい。
2. 一部の人がメールのテンプレートを編集
3. 組織に属している人はテンプレートを使える

##工数
1日に一人70通のメールを1通あたり7分から4分になりました。
20名* 70通 * 3分　= 4200分　= 70時間

###テンプレートの更新もしっかりされて企業としての体制もよくなりました。

##このスプレットシートに書かれているGASは
要望が多かったら販売する予定です。

以上、よろしくお願いいたします。
AngularでURLからURLハッシュを取得する方法

ここで言う**URLハッシュ(url hash)**というのはページ内リンクを踏んだときにURLに`#`から始まる文字列で表されるアレのことです。URLフラグメント(url fragment)とも言います。
(例: `https://myblog.com/page1#intro`の`#intro`)

## 結論
[ActivatedRoute](https://angular.io/api/router/ActivatedRoute)の[fragment](https://angular.io/api/router/ActivatedRoute#fragment)プロパティを参照しましょう。`fragment`の型は`Observable<string>`です。

[StackBiltzのサンプル](https://stackblitz.com/edit/activated-route-fragment)

```typescript:app.component.ts
@Component({
  selector: 'app-root',
  template: `
    <div>Current URL fragment: {{ fragment | json }}</div>
    <div id="url-fragment"></div>
    <a routerLink="/" fragment="url-fragment">Jump to the URL fragment</a>
  `
})
export class AppComponent implements OnInit {
  fragment: string;

  constructor(private route: ActivatedRoute) { }
    
  ngOnInit(): void {
    this.route.fragment.subscribe(fragment => {
      console.log(`ActivatedRoute.fragment: ${fragment} (typeof: ${typeof fragment})`);
      console.log(`window.location.hash: ${window.location.hash}`);
      this.fragment = fragment;
    });
  }
}
```

## 注意点
[StackBuiltzのサンプル](https://stackblitz.com/edit/activated-route-fragment)を動かしてみるとわかりますが、URLにURLハッシュが含まれない場合、この`fragment`は**空文字列が流れた後、nullが流れます。**
また、`window.location.hash`と異なり、先頭の**#**は含まれません。
言語別『来月の今日』一覧


3月31日に「来月の今日」と聞かれたらどちらと答えますか？

・4月30日
・5月1日

文字どおりに取ると『4月31日』であり即ち『5月1日』になります。
しかし一般人であれば『4月30日』をイメージすることが多いでしょう。

これはどちらが正しいというものでもなく、定義が曖昧なので解釈の隙があるというだけですね。
そんなわけでプログラミング言語においても、どちらを取るかは言語によってバラバラです。

以下はざっくりなんとなくの範囲で調べたものです。
言語機能にある場合はそれを、なければ一番有名っぽそうなライブラリを使っています。


# 4月30日

## Csharp

```csharp
DateTime.Parse("2020/03/31").AddMonths(1); // 2020-04-30
```

## Java

```java
var dt = LocalDate.parse("2020-03-31")
dt.plusMonths(1); // 2020-04-30
```

## Kotlin

```java
import java.time.LocalDate;
LocalDate.of(2020, 3, 31).plusMonths(1); // 2020-04-30
```

## MySQL

```sql
SELECT '2020/03/31 00:00:00' + INTERVAL 1 MONTH // 2020-04-30
```

## Oracle

```sql
SELECT ADD_MONTHS(DATE '2020-03-31', 1) FROM DUAL // 2020-04-30
SELECT DATE '2020-03-31' + INTERVAL '1' MONTH FROM DUAL // ORA-01839: date not valid for month specified
```

INTERVALを存在しない日付に使うとエラーになる。

## PostgreSQL

```sql
SELECT timestamp '2020-03-31 00:00:00' + INTERVAL '1 MONTH' // 2020-04-30
```


## Python

```python
import datetime
from dateutil.relativedelta import relativedelta

print(datetime.datetime(2020, 3, 31, 0, 0, 0) + relativedelta(months=1)) // 2020-04-30
```

## Ruby

```ruby
from dateutil.relativedelta import relativedelta
from datetime import datetime

datetime(2020,3,31) + relativedelta(months=1) // 2020-04-30
```

## Swift

```swift
import Foundation;

var calendar = Calendar.current;
let day = calendar.date(from: DateComponents(year: 2020, month: 3, day: 31))!;
let modifiedDate = Calendar.current.date(byAdding: .month, value: 1, to: day)!; // 2020-04-30
```


## VisualBasic

```vb
Dim dt As DateTime = DateTime.Parse("2020/03/31").AddMonths(1) // 2020-04-30
```

## 民法

```text
ただし、月又は年によって期間を定めた場合において、最後の月に応当する日がないときは、その月の末日に満了する。
```


# 5月1日


## bash

```bash
date -d "2020/03/31 00:00:00 1 month" // 2020-05-01
```

## Go

```go
t := time.Date(2020, 3, 31, 0, 0, 0, 0, time.Local)
t.AddDate(0, 1, 0) // 2020-05-01
```

## JavaScript

```js
dt = new Date("2020/03/31 00:00:00");
dt.setMonth(dt.getMonth() + 1 ); // 2020-05-01
```

## Perl

```perl
use Time::Piece;
Time::Piece->strptime("2020/03/31", "%Y/%m/%d")->add_months(1); // 2020-05-01
```

## PHP

```php
\DateTimeImmutable::createFromFormat('Y-m-d', '2020-03-31')->modify('next month'); // 2020-05-01
```

## なでしこ

```なでしこ
「2020/03/31」に「+0/1/0」を日付加算。
それを表示。 // 2020-05-01
```

# その他

## C

2020年4月31日。

```c
int main(void){
        time_t mk;
        struct tm tm_mk;
        struct tm *tm_lt;

        tm_mk.tm_year = 2020 - 1900;
        tm_mk.tm_mon = 3 - 1;
        tm_mk.tm_mday = 31;
        tm_mk.tm_hour = 0;
        tm_mk.tm_min = 0;
        tm_mk.tm_sec = 0;
	    mk = mktime(&tm_mk);
        tm_lt = localtime(&mk);
        tm_lt->tm_mon++;
        
        printf("%04d/%02d/%02d", tm_lt->tm_year + 1900, tm_lt->tm_mon + 1, tm_lt->tm_mday); // 2020/04/31
}
```

## Rust

一ヶ月後を[探し出せなかった](https://docs.rs/chrono/0.4.9/chrono/struct.Duration.html)。


# まとめ

4月30日派が多いけど、決定的というほどでもないですね。