OmniAICreator/Qiita-1.07M huggingface dataset:
Manjaro で vim の clipboard を使いたい

## 問題

Manjaro で vim　の clipboard 機能を使いたかったが、```vim --version``` をすると ```-clipboard``` となっていて使えなかった。

## 環境

* Manjaro 18.0.4 Illyria

## 解決方法

gvim を入れればいい。

## 手順

```bash
$ sudo pacman -S gvim
$ vim --version | grep clipboard
+clipboard         +jumplist          +persistent_undo   +vartabs
+eval              +mouse_gpm         +syntax            +xterm_clipboard
```

Vimでyankしたときに、クリップボードに入るようにする。

```bash
$ vim ~/.vimrc
```

```.vimrc``` へ以下を追加。

```
set clipboard&
set clipboard^=unnamedplus
```

## 参考

* https://pocke.hatenablog.com/entry/2014/10/26/145646
* https://wiki.archlinux.jp/index.php/Vim#.E3.82.A4.E3.83.B3.E3.82.B9.E3.83.88.E3.83.BC.E3.83.AB
PyCharm備忘録

# Settings

### Inspections
#### メソッド名や変数名に日本語を使用しても、警告が出ないようにする。
「Non-ASCII identifier error」という警告を無効化する

https://intellij-support.jetbrains.com/hc/en-us/community/posts/115000553210-Non-ASCII-identifier-error-in-Python-3


### docstringのformatを変更
Setting -> Tools -> Python Integrated Tools -> Docstring format
デフォルトはreStructuredTextです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37903/fc14c04e-093b-ea83-394b-974bc9bece1b.png)

### システムメニュにPyCharmを追加（Ubuntu版？）
Toos Menu -> 「Create DeskTop Entry」で、システムメニュにPyCharmを追加できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37903/6274e4d8-5a4a-5c03-fd0b-ea871b76f6e9.png)

# Run/Debug Configurations
### テストメソッドの作業ディレクトリを変更する
テストメソッドの作業ディレクトリは、デフォルトではプロジェクト配下の`tests`ディレクトリです。
作業ディレクトリを変更する場合は、「Run/Debug Configurations」でダイアログを開き、 「Templates -> Python tests -> pytest」の「Working direcotry」を指定します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/99cf05c1-8fa6-df33-9d22-2a3259970ef7.png)


# Shortcuts

### コードブロックの先頭と終わりに、ショートカットキーで移動する
* `Ctrl + [` ：コードブロックの先頭に移動
* `Ctrl + ]`：コードブロックの終了に移動

https://www.jetbrains.com/help/pycharm/navigating-to-braces.html


# その他
### Python Consoleで `str.*find*?`を入力したときの結果がIPythonと異なる


```plain:IPythonでの結果
str.find
str.rfind
```

```plain:PythonConsoleでの結果
In [0]: str.*find*?
 .....:
 .....:
 .....: 
```

入力が続いていると判断されて、入力を終了させることができませんでした。
https://youtrack.jetbrains.com/issue/PY-30712


### 「Method 'xxx' may be `static`」という警告が出る理由

![image](https://qiita-image-store.s3.amazonaws.com/0/37903/f76977f9-d386-7480-7c71-add0a46d127e.png)

インスタンスメソッドが`self`を参照していないと、この警告がでます。

```python
class Sample:
    val = 100
    def hoge(self, x):
        # 「Method `hoge` may be `static`」という警告発生
        return x * x
        # 以下のように`self`を参照すれば、警告は出ない
        # return x * x * self.val
```

https://stackoverflow.com/questions/23554872/why-does-pycharm-propose-to-change-method-to-static/31788601
gitを利用して分析を展開する際に気をつけること

設計図などによる分析で、設計図からソースコードを生成する機能がある場合には、設計図、分析結果、ソースコードを一体で管理できるとよい。

前提として図はXMIファイルなどの文字ファイルになっていること。

#課題１　複数の人が、分析で追加する要素を別の名前をつけて作る。

システム内にすでに登録のある要素は、システム内の要素を使うとしても、
システム内に登録のない要素は、別々に作業をすると、同じものに別の名前をつける可能性がある。

###対策案：新たに作成した要素は、日、週、月の単位で見直し、同じ要素が別名でないか確認する。

#課題２　同じ現象の抽象度が違う事象を別々に記載する。

例：操作誤り　＞　右に操作すべきところを左に操作した

##対策案：包含関係を定義する
同じ結果をもたらす集合かどうか。
同じ対策が有効な集合かどうか。
同じ検出方法で検出できるか。

#課題３　結果の予測が異なる二つ以上の予想

###対策案：実験できることであれば、実験して確かめる。
実験結果として確率的にしか予想できないことであれば、確率または分布を割り当てる。

#課題４　設計の欠陥がわかり、設計し直した際に、分析結果を再利用できるかどうか。

### 対策案：新設計でも同じ分析をしたと仮定して複写し、内容の可否を確かめる。

新たに書き直した方が、抜け漏れがなくはないか。
【永久保存版】Excel VBA Color 変更 チートシート CRUD 「色付け・色読み取り・リセット」


# 概要

ExcelのVBAで色塗りをするときに、色の消し方を忘れがちです。
そのため、自分的に欲しかったチートシートを作りました。

C : Create : 色の設定
R : Read : 色の読み取り
U : Update : 色の更新
D : Delete: 色の削除
という感じで、
CRUD風にして見やすくしてみました。

過去の自分よ！これでラクをしてくれ！

# 対象

```vb
Dim myRange As Range
Dim myShape As Shape
```

# 塗りつぶし色

## Create・Update

細かく指定したい場合はRGB、色名があらかじめわかっている場合は列挙子を利用します。

```vb
myRange.Interior.Color = Excel.XlRgbColor.rgbYellowGreen '黄緑
myRange.Interior.Color = VBA.Information.RGB(255, 255, 255) '白
```

### Read

セルの塗りつぶし色を読み取ります。

```vb
Debug.Print(myRange.Interior.Color)
```

条件付き書式などで色が付いた結果の表示されているセルの塗りつぶし色を読み取ります。

```vb
Debug.Print(myRange.DisplayFormat.Interior.Color)
```

### Delete

```vb
myRange.Interior.ColorIndex = Excel.xlNone
myRange.Interior.ColorIndex = Excel.XlColorIndex.xlColorIndexNone
```

※たぶん`xlColorIndex`を使ったほうがスマート

## フォントの色

### Create・Update

細かく指定したい場合はRGB、色名があらかじめわかっている場合は列挙子を利用します。

```vb
myRange.Font.Color = Excel.XlRgbColor.rgbYellowGreen '黄緑
myRange.Font.Color = VBA.Information.RGB(255, 255, 255) '白
```

### Read

セルの文字色を読み取ります。

```vb
Debug.Print(myRange.Font.Color)
```

条件付き書式などで色が付いた結果の表示されているセルの文字色を読み取ります。

```vb
Debug.Print(myRange.DisplayFormat.Font.Color)
```

### Delete

```vb
myRange.Font.ColorIndex = Excel.xlAutomatic
myRange.Font.ColorIndex = Excel.XlColorIndex.xlColorIndexAutomatic
```

※たぶんxlColorIndexを使ったほうがスマート

## 図形の塗りつぶし色

### Create・Update

```vb
myShape.Fill.ForeColor.RGB = Excel.XlRgbColor.rgbYellowGreen '黄緑
myShape.Fill.ForeColor.RGB = VBA.Information.RGB(255, 255, 255) '白
```

### Read

```vb
Debug.Print(myShape.Fill.ForeColor.RGB)
```

### Delete

図形の新規作成時の色に戻します。テーマの色になります。

```vb
myShape.ShapeRange.ShapeStyle = msoShapeStylePreset9
```

## 図形の枠線色

### Create・Update

```vb
myShape.Line.ForeColor.RGB = Excel.XlRgbColor.rgbYellowGreen '黄緑
myShape.Line.ForeColor.RGB = VBA.Information.RGB(255, 255, 255) '白

```

### Read

```vb
Debug.Print(myShape.Line.ForeColor.RGB)
```

### Delete

図形の新規作成時の色に戻します。テーマの色になります。

```vb
myShape.ShapeRange.ShapeStyle = msoShapeStylePreset9
```

## RBGとColorIndexなど

Excel上にて`テーマの色`として表現されている色は、VBAでは`ColorIndex`で設定することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/fe07e373-677c-5443-d5e9-e7ea4a64ce1b.png)
`テーマの色`は`ObjectThemeColor`、標準の色は`SchemeColor`としてVBA上で使用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/2b390dbb-591b-1a93-9d87-606f7cd4cde6.png)
Excel上にて`色の設定`で表現される色は、`RGB()`もしくは、`XlRgbColor`で設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/81efa003-f4c7-2282-1271-5c0b9fda204c.png)

## ポイント

セルの色について、C・R・U はColorプロパティですが、D はColorIndexプロパティを操作します。
本記事では単色の場合のみを示しています。網掛けやグラデーション、半透明などの設定はまた機会があれば書きます。

Excelの機能「`書式のコピー`」を使って、セルと図形の間で書式のコピーペーストはできません。
おそらく、セルの枠線が Top, Left, Bottom, Right とで書式を変えられることが最大の要因と思われます。
しかし、塗りつぶし色だけでもコピーペーストできたほうが便利な気がする今日この頃です。

**Excelsior!**
Vue.js: 複数のクラスをバインディングする場合どのような書き方があるか

たとえば、[Bootstrap](https://getbootstrap.com)でスタイルを当てると、要素に`class`属性値がいくつも与えられたりします。採り上げるのは、そこにさらに、動的にバインディングしたいクラスが加わった場合です。公式サイトを含め、具体例が少なく感じたのでまとめてみました。


# クラスバインディングの基本構文
[HTMLクラスのバインディング](https://ja.vuejs.org/guide/essentials/class-and-style.html#binding-html-classes)の基本は[オブジェクトへのバインディング](https://ja.vuejs.org/guide/essentials/class-and-style.html#binding-to-objects)です。`v-bind:class`(省略記法`:class`)ディレクティブにオブジェクトを与え、クラス名をプロパティにして、値となる式を定めます。式のブール(論理)値評価が`ture`なら、クラスが適用される仕組みです。

```vue
<button type="button" :class="{active: isActive}">button</button>
```

# クラスが複数与えられた場合
たとえば、Bootstrapでつぎのようなボタンのクラスを定めたとします(「[Outline buttons](https://getbootstrap.com/docs/5.2/components/buttons/#outline-buttons)」参照)。これにバインディングしたいクラスが加わった場合、どのように扱うかです。

```vue
<button type="button" class="btn btn-outline-info btn-sm">button</button>
```

実は、クラスバインディングは`class`属性を上書きしません(「[コンポーネントでの使用](https://ja.vuejs.org/guide/essentials/class-and-style.html#with-components)」参照)。ですから、`v-bind:class`(`:class`)ディレクティブでクラスバインディングを加えれば済んでしまうのです。

```vue
<button type="button" class="btn btn-outline-info btn-sm"
	:class="{active: isActive}">
	button
</button>
```

けれど、クラスバインディングするのなら、ディレクティブに統一したいところです。オブジェクト構文では、つぎのように定めることになるでしょう。冗長さは否めません。なお、ハイフン(`-`)は識別子に使えませんので、クォーテーションで文字列にすることを忘れないでください。

```vue
<button type="button"
	:class="{btn: true, 'btn-outline-info': true, 'btn-sm': true, active: isActive}">
	button
</button>
```


# 配列構文を使う
もうひとつ、クラスは[配列へのバインディング](https://ja.vuejs.org/guide/essentials/class-and-style.html#binding-to-arrays)もできます。これなら、与えたいクラスを配列要素に加えるだけです。条件によって動的に切り替えたいクラスは、条件(3項)演算子で定められます。

```html
<button type="button"
	:class="['btn', 'btn-outline-info', 'btn-sm', isActive ? 'active' : '']">
	button
</button>
```

配列構文の要素には、オブジェクト構文も含められます。この例では、こちらの方がすっきりするでしょう。

```html
<button type="button"
	:class="['btn', 'btn-outline-info', 'btn-sm', {active: isActive}]">
	button
</button>
```

さらに、複数のクラスはスペース区切りでひとつの要素にまとめてしまえます。固定のクラスと動的にバインディングされるクラスがわかりやすくなりました。

```html
<button type="button"
	:class="['btn btn-outline-info btn-sm', {active: isActive}]">
	button
</button>
```


# 条件演算子を使った方がよい場合
条件に応じてふたつのクラスを切り替える場合は、オブジェクト構文では要素をふたつ使わなければならないところが、条件演算子ならひとつにまとめられます。

```html
<button type="button"
	:class="['btn btn-outline-info btn-sm', isActive ? 'active' : 'disabled']">
	button
</button>
```

複数のクラスバインディングは、書き方がいろいろ考えられます。書きやすさ、わかりやすさから、適した手法を選びましょう。
DockerとNginxとLet's Encryptで雑に静的サイトを配信する

![ssllabs](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47823/1a77f815-7448-ebd7-5c7b-9849189d398d.png)

ホストOS側のメンテが地味に面倒になってきてVPSからFirebase Hostingへ移行するので備忘録。ホスト側にDocker Compose、certbot(Let's Encrypt)が入っている事が前提

```dockerfile:compose.yml
version: '2'
services:
  http:
    container_name: http
    build:
      context: ./
      dockerfile: NginxDockerfile
    volumes:
      - "../public:/usr/share/nginx/html:ro"
      - "./nginx.conf:/etc/nginx/nginx.conf:ro"
      - "./nginx.vh.default.conf:/etc/nginx/conf.d/default.conf:ro"
      - "/etc/nginx/ssl/dhparam.pem:/etc/nginx/ssl/dhparam.pem:ro"
      - "/etc/letsencrypt:/etc/letsencrypt:ro"
      - "/etc/localtime:/etc/localtime:ro"
    ports:
      - "80:80"
      - "443:443"

```

今はversion3とかになってるらしいですね。設定ファイルや証明書周りはホスト(CentOS)側からべったりマウントしてる。../publicが公開ディレクトリ。静的コンテンツ自体もここらへんの設定ファイルと一緒にgithubのprivate repositoryからcloneしてきている。

```nginx:nginx.vh.default.conf
server {
    listen 80;
    listen [::]:80;
    return 301 https://$host$request_uri;
}

server {
    listen        443 ssl http2;
    listen        [::]:443 ssl http2;
	  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    server_name   ${serverName};

    ssl_certificate           /etc/letsencrypt/live/${serverName}/fullchain.pem;
    ssl_certificate_key       /etc/letsencrypt/live/${serverName}/privkey.pem;
    ssl_prefer_server_ciphers on;
    ssl_ciphers               ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!aNULL!eNull:!EXPORT:!DES:!3DES:!MD5:!DSS;

    ssl_dhparam          /etc/nginx/ssl/dhparam.pem;
  	add_header           Strict-Transport-Security 'max-age=31536000; includeSubDomains;';
  	client_max_body_size 64M;

    ssl_stapling            on;
  	ssl_stapling_verify     on;
  	ssl_trusted_certificate /etc/letsencrypt/live/${serverName}/fullchain.pem;
  	resolver                8.8.8.8;

    charset UTF-8;
    charset_types text/css;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
```

合わせて読みたい：https://qiita.com/harukasan/items/fe37f3bab8a5ca3f4f92

ssl_ciphersの関係で古すぎるIEからのアクセスは出来なくなる設定だった気がする。うろ覚えだけどたぶん。

あとStrict-Transport-Security(HSTS)をincludeSubDomains付きで有効にしているので、サブドメインを運用する場合はそっちもHSTSの影響を受ける事を忘れないようにしましょう、などの教訓がある。

HSTSというのが何なのかというと、いきなりHTTPSのExpiresヘッダみたいなものです。ワイルドステーキの付け合わせをコーンからブロッコリーに変えて、塩胡椒で食べるのが好きです。

```docker:NginxDockerfile
FROM nginx:mainline-alpine
```

まっさら。

```shell:crontab
docker-compose down
certbot renew
docker images -aq | xargs docker rmi -f
docker-compose build --no-cache
docker-compose up -d
```

crontabから起動しているシェルスクリプト。証明書の更新ついでにイメージを再生成してる。その間はサイトがダウンする。
WSLにzshを入れたときに警告が出る場合の対処法

## 事象

WSL(Windows Subsystem for Linux)のUbuntuにzshを導入したのですが、起動のたびにこんなメッセージが出て困ってました。

```
zsh compinit: insecure directories, run compaudit for list.
Ignore insecure directories and continue [y] or abort compinit [n]?
```

oh-my-zsh関連のフォルダの権限設定が適切ではないのが原因でした。
自分は**WSL上のUbuntuのホームディレクトリをWindowsのホームディレクトリに変えていた**ので、Ubuntuからすると**すべてのファイルパーミッションが777の状態**になっていました。

## 対処法

ホームディレクトリは変更したくなかったので、**対象のファイルをUbuntuのホームディレクトリにコピーし、シンボリックリンクを作成**します。

`/mnt/c/Users/UserName/.oh-my-zsh`が問題のファイルの場合の例が以下です。

```bash
$ cd
$ cp .oh-my-zsh /home/[Ubuntu側ユーザ名] -r
$ mv .oh-my-zsh .oh-my-zsh_BK //念のためバックアップ
$ ln -s  /home/[Ubuntu側ユーザ名]/.oh-my-zsh .oh-my-zsh
$ chmod 755 .oh-my-zsh -R
```

これで対象ファイルはUbuntu側のファイルシステム上に移動するので、パーミッションが設定でき、警告が表示されなくなりました。
macでのword2vec_boostpythonによるグラフ表示

まず最初にmacOS (Sierra)にプリインストールされているpythonだとpip installで不具合がでることがあるのでbrewで入れ直して/usr/local/bin/pythonで使えるようにするか、pyenvなどで使えるようにしておく。

---

オライリーの<a href="https://www.oreilly.co.jp/books/9784873116839/">word2vecの教科書</a>に従って、sudo python setup.py install しても “fatal error: 'numpy/arrayobject.h' file not found” と怒られる。そこで、まず

```console:console
$ find / -name arrayobject.h -print 2&gt; /dev/null
```

でarrayobject.hが入っているディレクトリを探す。複数あると思われるので、適当に一つ選び(例えば、/usr/local/lib/python2.7/site-packages/numpy/core/include)、下のようにsetup.pyのinclude_dirsを

```py
include_dirs = ['/usr/local/lib/python2.7/site-packages/numpy/core/include'],
```

に変更する。あとimport numpyも一応書いておく。

---

Macの場合はこれに加えて、word2vec.cppにおける31行目を変更する。


```
// #include &lt;malloc.h&gt;
#include &lt;stdlib.h&gt;
```

これで、sudo python setup.py install が通る。


---

さらに、vis.pyにおけるfilenameのpathをword2vecのvector.binなどを指定してやることで、やっとpython vis.pyでqueryが出現する。これで例えば、kingなどの単語を入力するとグラフが書かれたpngファイルが生成される。

# 参考サイト
[Caffe Macインストール (numpy/arrayobjectのエラーの参考)](http://wiki.ruka-f.net/index.php?Caffe%20Mac%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
[word2vec_boostpython (教科書で紹介されているツール)](https://github.com/nishio/word2vec_boostpython)
[word2vecを使って、日本語wikipediaのデータを学習する (word2vecの基本的な使い方、vector.binの作成)](http://qiita.com/tsuruchan/items/7d3af5c5e9182230db4e)
【Docker】Railsでgemをcacheする

# 概要
以下のようなスタンダードな`docker-compose.yml`が存在するとします。
このままではgemを追加する度に`docker-compose build`をする必要があり、`build`の度にかなりの時間がかかります。これは、buildの度にgemファイルを一からインストールし直すためです。

そこで、gemを追加する際に追加したgemのみインストールする方法を紹介します。

```yml:docker-compose.yml
version: "3"
services:
  app:
    build: .
    volumes:
      - .:/app
    depends_on:
      - postgres
  postgres:
    image: postgres
    ports:
      - "5432:5432"
    volumes:
      - postgres-data:/var/lib/postgresql/data

volumes:
  postgres-data:
```

# 設定
以下の手順で対応を行います。

- (1) `environment`を使用し、`BUNDLE_PATH`を設定。
- (2) 名前付きvolumeの`bundle_path`を設定し、トップレベルの`volumes`に追加します。

実際に書き換えた`docker-compose.yml`は以下のようになります。

```yml:docker-compose.yml
version: "3"
services:
  app:
    build: .
    volumes:
      - .:/app
      - bundle_path:/bundle # 追加箇所
    environment:
      - BUNDLE_PATH=/bundle # 追加箇所
    depends_on:
      - postgres
  postgres:
    image: postgres
    ports:
      - "5432:5432"
    volumes:
      - postgres-data:/var/lib/postgresql/data

volumes:
  bundle_path: # 追加箇所
  postgres-data:
```

# 使用方法

## gemのcache作成
`docker-compose.yml`を以下のように変更したらgemのキャッシュを作成する為に以下のコマンドを実行します。

```
$ docker-compose app bundle install
```

## 新しいgemの追加

- (1) 使用しているコンテナがあれば停止します。

```
$ docker-compose down
```

- (2) gemをGemfileに追加し、インストールします。(新たに追加されたgemの更新のみ実行されます。)

```
$ docker-compose run app bundle install
```

- (3) 再びコンテナを立ち上げます。

```
$ docker-compose up
```

以上でgemを追加する度に`docker-compose build`を実行する必要がなく、より効率的に開発を行うことができます。


# 参考
- [Zero to Up and Running a Rails Project only using Docker](https://blog.codeminer42.com/zero-to-up-and-running-a-rails-project-only-using-docker-20467e15f1be)
30 mins intro to Q/KDB+ via Python (Part 1)

# Goal of the blog
The goal is to introduce a programming skill, [Q/KDB+](https://en.wikipedia.org/wiki/Kdb%2B), that is widely used in the financial sector, among others, and to get a glimpse into the power of vector processing concepts. The latter can help one write efficient code, especially when there is need to manipulate/aggregate mass amount of data, like in machine learning. 

The blog does not judge if the programming language is worth learning or if it's superior than others. I'll leave the judgment to the reader.

# Layout of the blog
The blog targets readers with basic programming knowledge (string, array, loop, arithmetic operations). I'll use Python as the starter to illustrate the programming concepts, and then replicate the code in Q for the reader to relate, compare and deepen understanding. 

The code demonstrated here attempts to implement a simple linear regression machine learning model, but I won't go into the details. It is merely to add some flavor to the blog.

# Takeaway
At the end of the blog, I hope the reader will get

- A good feel of Q/KDB+
- A good feel of the power of vector processing
- References for readers who decide to pursue further

#### Topics covered
- Data types, like date, boolean and their arithmetic operations
- Data structures, like list, table and their manipulation, Q-SQL
- Lambda, vector processing

# So, what's Q/KDB+?
KDB+ is a column based, in-memory database. While it's named DB, one can think of it like an internal cache of a C process designed to hold 2-dimensional data (ie table), powered with a SQL-like query capability. Read [this Wikipedia](https://en.m.wikipedia.org/wiki/Kdb%2B) for more info.

Q, on the other hand, is a scripting language that can be used to build those KDB+ databases, or other sort of programs like pub/sub engine, batch processes etc. Read [this Wikipedia] (https://en.m.wikipedia.org/wiki/Q_(programming_language_from_Kx_Systems)) more info.

# Let's get started
[Part 2](https://qiita.com/jay_l/items/ab65d4551dc3c519b81b)

# Disclaimer
- Q/KDB+ is a trademark of [Kx Systems](https://kx.com/)
複数の文字列を出力　Ruby練習

<img width="701" alt="Ruby_学習コース_Ⅱ___プログラミングの入門なら基礎から学べるProgate_プロゲート_.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378273/c23e57b1-9c7b-96a3-bbf9-cac50ff378e2.png">
上は正解図
putsのとなりのlanguagesに=を入れてしまった。ため、変換がおかしくなった。＝は変数になるためおかしくなった。
クロージャー

##クロージャーを使った書き方

```go
func main() {
	x := 0
	increment := func() int {
		x++
		return x
	}
	fmt.Println(increment()) //1
	fmt.Println(increment()) //2
	fmt.Println(increment()) //3
}
```
xが書き換えられてしまう可能性があるので、あまりこういう書き方はしない。下記のようにしよう。

```go
func incrementGenerator() func() int {
	x := 0 //クロージャーとしてこの中だけで使える
	return func() int {
		x++
		return x
	}
}

func main() {
	counter := incrementGenerator()
	fmt.Println(counter())
	fmt.Println(counter())
	fmt.Println(counter())
}
```

```go
func circle(pi float64) func(diameter) float64) float64 {
	return func(diameter float64) float64 {
		return pi * diameter
	}
}

func main() {
	c1 := circle(3.14)
	fmt.Println(c1(2))
	fmt.Println(c1(3))

	c2 := circle(3)
	fmt.Println(c2(2))
	fmt.Println(c2(3))
}
```

>【参考】
現役シリコンバレーエンジニアが教えるGo入門(https://www.udemy.com/share/100BhMB0obeFpbTX4=/)
Oracle PGXでERROR: org.apache.commons.vfs2.FileNotFoundExceptionが出た時の対処法

##Oracle PGXを動かす
[こちらの記事](https://github.com/ryotayamanaka/pgx-training/wiki/Hero-Network)のチュートリアルを実行しようと思い、Oracle PGXを動かしてみました。

また、チュートリアルについて詳しく知りたい方は[こちらの記事](https://qiita.com/aadoxsin/items/fd7623af4534da3190cb)をご覧ください！今回は、チュートリアル実践中に出てきたエラーについて書いていきます。


[以前構築したWindows環境](https://qiita.com/kk31108424/items/529dd319ad642c1ecde7)で実行します。

##手順通りにPGXを動かす
記事にある手順通りに進めてみます。

###1. データの入手
[Exposedata.com](http://syntagmatic.github.io/exposedata/marvel/)にある`Hero Social Network Data`をダウンロードします。 
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/248756/4f4db280-fd1d-32ff-842e-78776ed32a2e.png)

###2. JSON形式に加工
1で入手したデータをPGXに読み込んでもらうため、データの定義づけをします。今回はjsonファイルで記述します。

```:hero-network.csv.json
{
  "uri": "hero-network.csv" #どのデータかを教えてあげる
, "format": "edge-list"     #形式を指定
, "node_id_type": "string"　#ノード番号のデータ型を指定
, "separator": ","          #どこで区切るかを指定
}
```

###3. データの保存
上記2つのデータをpgx-server.zipを保存したディレクトリと同じディレクトリに保存し、PGXシェルにグラフをロードします。

```
pgx> G=session.readGraphWithProperties("hero-network.csv.json")
ERROR: org.apache.commons.vfs2.FileNotFoundException: Could not read from "file:///work/hero-network.csv.json" because it is not a file.
```

・・・ん？？？
ファイルが読めない？？
（このエラーを解決することだけに2日注力しました笑）

##解決法
###1. 上記2つのファイルを保存してあるディレクトリに移動する

```
> chdir 上記2つのファイルを保存してあるディレクトリ
```

###2. 以下のコマンドを実行

```
> docker run -it --rm -v %cd%:/work pgx:19.1.0 pgx
```
###3. グラフをロードする

```
pgx> G=session.readGraphWithProperties("hero-network.csv.json")
==> PgxGraph[name=hero-network,N=6426,E=574467,created=1560123745814]
```
ロードできました！

##終わりに
他にもこういう解決策あるよ～などとご存じの方がいらっしゃいましたら、ご教授頂けると幸いです。
決定木剪定、分割ルール

過学習の防止（汎用性のあるモデル）に剪定を使う。
剪定の時に、不純度の計算に葉っぱノード数のpenaltyをつける。

https://www.slideshare.net/hirsoshnakagawa3/bias-variance1a
noise, bias, variance in machine learning
noise   : 
bias    :機械学習による推定値が、損失の期待値を最小化する
variance:機械学習による推定値が、教師データ集合によって変動する度合いの期待値。教師データに依存しすぎるモデルになって新規データの予測誤差が悪化する度合い
herokuでルートドメイン設定を行う(with さくらのドメイン)

Herokuのドメイン設定でハマったので、備忘しておきます。

## 前提条件
- ドメインはさくらのドメインで取得
- Herokuは有料プランに設定済み

## 手順
今回はダッシュボードからドメインを設定します。
コマンドは使いません。

### ドメインを追加する
アプリのページに飛んで、Settings > Domains and certificatesで
ドメインを追加します。

![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409314/999fe546-dfa8-8460-3f20-a8dc690952c9.png)
Add domain を押して
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409314/6f956557-094b-ae08-7cd0-8c9b5d4a7c04.png)
登録したいドメインを入力して Save changes

### 「PointDNS」アドオンをHerokuアプリに追加する
Resources > Add-onsで
PointDNSを検索して追加します。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409314/ce857d55-9ed5-594f-31a6-cb95a0195c58.png)
追加したら、PointDNSに移動します。

![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409314/efa8c740-a71b-6fab-5b74-4b30d723d07d.png)
先ほど追加したドメインが一覧に表示されいます。

ドメイン名をクリックして、レコード設定に移動します。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409314/546e0744-373c-518c-3f35-11f00c682228.png)
書かれているネームサーバのドメインをコピーしておきましょう。

### さくらのドメインでネームサーバ設定を行う
さくらのドメインにジャンプして、取得したドメインのゾーン設定ページに移動します。
![07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409314/d8e2f05c-dc5b-a491-6b42-194f99695757.png)
こんな感じに初期設定されているかと思いますが、無視して削除ボタンを押します。

![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409314/95cc314b-394b-2c49-913d-900c6e556406.png)
削除が完了するとこんなページが表示されます。
ここに先ほどPointDNSでコピーしたネームサーバのドメインを入力して送信します。
送信後、設定完了までに少し時間がかかるようです。

### PointDNSでALIASレコードを追加する

Herokuの Settings > Domains and certificates に戻ります。
![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409314/4c5a48a5-2d40-a7ed-c960-ded7398ce460.png)
DNS targetをコピーします。

PointDNSに移動し、Add record をクリックします。
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409314/025203d4-dca9-85e1-36cd-462cbd9b644d.png)
Record typeはALIAS、Nameは空白のまま、Targetは先ほどコピーしたDNS targetを入力して、
Update recordをクリックします。

### SSLを有効化する
![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409314/ebab5b75-e409-7233-6dc9-0618b55acae7.png)
Herokuの Settings > Domains and certificates で
Configure SSL をクリックしてSSL設定を行います。

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409314/2f2ed414-dbb3-33a6-be1f-de5ccc9c67e9.png)
ACM Status がOKになったら完了です。

## まとめ
Herokuのルートドメイン設定について、詳しく書いてある日本語の記事があまりなかったのでちょっと苦戦しました。
さくらのドメインでのネームサーバ設定については、最初はゾーン設定を削除せずに上書くやり方でやってみたのですがうまく行かず……（もしかしたら時間経過でできたかもしれない）
ゾーン設定削除でサクッとネームサーバ設定ができたので、そのやり方で書かせていただきました。


参考にしました。
https://qiita.com/kenjikatooo/items/07c3d911210a4ca96781
ABC 129惨敗

♯ABC 129惨敗
Atcoder始めて3日目。案の定、Cも解けない惨敗。組み合わせがどうなるか思いつかなかった。
なので、解けなかった問題をやる。

## C Typical Stairs
壊れてない連続する階段の組み合わせ数の掛け算で出来るのは分かったが、組み合わせ数が分からないという。
改造フィボナッチで出来るらしいが、思いついたのは壊れている前後で分離して掛ける方式であった。

連続する階段数をxとすると組み合わせ数yは
$y=f(x)=fib(x+1)$
である。
壊れている階段aiなら、(ai-1)-posが連続段数xとなり、後は掛け算するだけでよかった。
ただし、1段目とN-1段目が壊れているとき、長さ0になるので、長さから直接計算しようとして0のことを忘れているとバグってREになる。
コードはオフセットすべきなのを無理矢理動くようにしたので、後で修正する。

でも改造フィボナッチの方が簡単だと思った。

```python:qiita.py
def mulmod(x,y,p):
    return x*y % p

def test(n):
    if n<1:
        return 1
    memo = [0]*(n+1)
    memo[0] = 1
    memo[1] = 1
    for i in range(2,n+1):
        memo[i] = (memo[i-1] + memo[i-2])%1000000007
    return memo[n]

n,m = map(int,input().split())
a =[]
pos = 0
result = 1
last = -1
for i in range(m):
    x = int(input())
    if (last+1) == x:
        print(0)
        exit(0)
    last = x
    a.append(x)

for i in a:
    result = mulmod(test(i-pos-1),result,1000000007)
    pos = i+1
 
result = mulmod(test(n-pos),result,1000000007)
print(result)
```

#反省点
数学的知識の欠如。フィボナッチなんて頭の片隅にもなかった。
過去のC問題を見ると問題文の日本語が理解出来ない。
パズルと同じで慣れないとうまくいかないから、過去問をやってどんな問題文の傾向とかを理解する必要があった。
Cargo.lockはcargo installで参照されない

# はじめに
Rustの`Cargo.lock`ファイルは実際にビルドしたときに使った全ライブラリのバージョンを列挙したものです。
この`Cargo.lock`の存在を意識することはあまりないと思いますが、バイナリクレートを作る場合（すなわち`cargo new --bin`した場合）デフォルトでgitにコミットされるよう`.gitignore`が生成されます。
これによって、`git clone`したリポジトリで`cargo build`するとコミットされた`Cargo.lock`が参照されて、そこに書かれたバージョンのライブラリが使われることで確実にビルドが成功するだろう、ということです。

しかしこの`Cargo.lock`は`cargo install`でバイナリをインストールする際には使われません。
今回それが原因でビルドに失敗するという[Issue](https://github.com/dalance/procs/issues/18)を貰ったので、関連して調べた話を書きます。

# `cargo install`での`Cargo.lock`の扱い
これは正確には`cargo install`の問題ではなく、`cargo publish`の問題です。
クレートをcrates.ioに公開する時に`cargo publish`を使いますが、この時パッケージされるファイルに`Cargo.lock`は含まれません。
`cargo install`はcrates.ioからパッケージ化されたソース一式をダウンロードしてきて`cargo build`しますが、そのソース一式に`Cargo.lock`は入っていないので使われない、というわけです。

# `Cargo.lock`がないとどうなるのか？
ライブラリのAPIに破壊的変更が入って、それがSemantic Versioning(SemVer)によって適切に表現されていない場合に問題が発生します。
（RustのSemVerに関しては「[Rust (Cargo)におけるクレートのバージョンと互換性について](https://qiita.com/tesaguri/items/f06409c13df428e1152d)」が詳しいです。）

例えば今回のビルド失敗はlibcクレートの破壊的変更の影響です。
libcクレートのv0.2.56で`getrlimit64`の引数の型が変更されました。

```rust
//v0.2.55
pub fn getrlimit64(resource: ::c_int, rlim: *mut rlimit64) -> ::c_int;
```

```rust
//v0.2.56
pub type __rlimit_resource_t = ::c_uint;
pub fn getrlimit64(resource: ::__rlimit_resource_t,
                   rlim: *mut ::rlimit64) -> ::c_int;
```

`resource`の型が`c_int`から`c_uint`に変わっているので、この関数を呼んでいる箇所は修正が必要な場合があります。
実際にこの関数を呼んでいるpalaverクレートのdependenciesはこんな感じです。

```Cargo.toml
libc = "0.2.47"
```

このようにv0.2.47を指定していますが、`=`によるバージョン指定はパッチバージョンをなるべく上げようとするので、2019/6/9時点ではv0.2.58が使われます。

本来APIの破壊的変更はSemVerではメジャーバージョンの変更（つまり1.0.0 → 2.0.0のような感じ）で表現されるべきですし、
Rustではバージョン1.0.0未満の場合はマイナーバージョンの変更（つまり0.1.0 → 0.2.0）にするようRFCで規定があります。
しかし今回のようにそれに従わないバージョンアップがあった場合はビルドが壊れてしまいます。

もし`Cargo.lock`があれば、実際にビルドが成功したバージョン（手元の`Cargo.lock`ではv0.2.48でした）を再現することができるので、`cargo install`でのビルド失敗は防ぐことができます。

# CIでの検出
この問題によるビルド失敗は普通に設定したCIでは検出できません。CIではgitからクローンしたリポジトリに対して`cargo test`や`cargo build`を行うので、この場合は`Cargo.lock`が参照されてビルドは成功します。
検出するためには明示的に`cargo install`を行うテストを追加する必要があります。

# publish-lockfile
この問題は2016年頃から指摘されていて、このようなIssueが立っています。

[Packages for binary crates should include Cargo.lock](https://github.com/rust-lang/cargo/issues/2263)

これを受けて、`cargo publish`で`Cargo.lock`をパッケージできるようにするunstable featureが入りました。

[Package lock files in published crates](https://github.com/rust-lang/cargo/pull/5093)

この機能はnightlyのcargoでは実際に使用することができて

```Cargo.toml
cargo-features = ["publish-lockfile"]
[package]
publish-lockfile = true
```

として`cargo +nightly publish`とすると`Cargo.lock`をパッケージできるようです。
（が、次に書く通りこの機能は安定化されずに消える予定です）

# 安定化に向けて
この機能の安定化は現在final comment periodまで来ているようです。

[Publish lockfile for binary crates](https://github.com/rust-lang/cargo/issues/5654)

安定化に向けての提案は次の通りです。

- binaryあるいはexamplesを持つクレートをpublishするときは必ずCargo.lockを含める。
- `cargo install`はデフォルトでは`Cargo.lock`を参照しない。`cargo install --locked`で参照する。
- `publish-lockfile`は安定化せず削除する。

というわけでユーザから見た挙動はこれまで通りで、`Cargo.lock`を使ったビルドをしたい場合は`cargo install --locked`を使う、ということになったようです。
デフォルトで`Cargo.lock`を使わない理由としてはセキュリティの観点（依存ライブラリに脆弱性の修正があった場合に`cargo install`ですぐに反映される）が書かれていました。

安定化のターゲットは8月リリースの1.37です。
php-master-changes 2019-06-09

この日は ZEND_BIND_STATIC の行番号が誤っていた問題の修正、Azure Pipelines のアカウント修正があった！

# 2019-06-09
## krakjoe: Fix [#78132](https://bugs.php.net/bug.php?id=78132) wrong line number on ZEND_BIND_STATIC for lexical vars
- https://github.com/php/php-src/commit/006b1911268fca9e6fa9243c2296d614f46e2ccc
- [7.4~]
- ZEND_BIND_STATIC の行番号が誤っていた問題の修正

## krakjoe: azure image update [not skipping on purpose to test new configuration]
- https://github.com/php/php-src/commit/d116343818ac4f786302a903ef6cd62f8eb5e973
- [7.4~]
- ビルドステータスのバッジで、Azure Pipelines のアカウントで krakjoe の人個人のになってたのを phpazuredevops に修正
php-master-changes 2019-06-07

この日はドキュメントの更新、libxslt / libexslt 検出の pkg-config への移行、pdo_mysql で \PDO::PARAM_BOOL を PDO::ATTR_EMULATE_PREPARES 有効時サポートしていなかった問題の修正、mysqlnd で MYSQL_TYPE_TINY のサポート追加、Azure Pipelines の設定修正、extract() で EXTR_SKIP 指定時に $this の書き換えでエラーになってしまう問題の修正があった！

# 2019-06-07
## petk: [ci skip] Catch up with [642b8d00e01170eb934c1adb56bcf43c9c4aecd4](https://github.com/php/php-src/commit/642b8d00e01170eb934c1adb56bcf43c9c4aecd4)
- https://github.com/php/php-src/commit/30a34eab814490e4926056d314a55b95ea9febad
- [7.4~]
- typo の修正、ぽいかな

## hughmcmaster: ext/xsl: Use PKG_CHECK_MODULES to detect the XSLT library
- https://github.com/php/php-src/commit/ab66179227dfce5c916592f47a66cd5f09e86359
- [7.4~]
- ext/xsl で、libxslt の検出を pkg-config へ移行

## hughmcmaster: ext/xsl: Use PKG_CHECK_MODULES to detect the EXSLT library
- https://github.com/php/php-src/commit/d4c275d8acdc3012da2aef191c1cac1389eaaef8
- [7.4~]
- ext/xsl で、libxeslt の検出を pkg-config へ移行

## camporter: Fixed bug [#38546](https://bugs.php.net/bug.php?id=38546)
- https://github.com/php/php-src/commit/7d1aa7534d756477d45f8fa63b5467589ccca031
- [7.2~]
- ext/pdo_mysql で、[PDOStatement::bindValue()](https://www.php.net/manual/ja/pdostatement.bindvalue.php) で [\PDO::PARAM_BOOL](https://www.php.net/manual/ja/pdo.constants.php) を [PDO::ATTR_EMULATE_PREPARES](https://www.php.net/manual/ja/pdo.setattribute.php) 有効時でもサポートするよう修正
- ext/mysqlnd で、MYSQL_TYPE_TINY のサポートを追加

## nikic: Use batch mode on Azure
- https://github.com/php/php-src/commit/c72bc4475e6c901649100a36fbd2ef5445a79aee
- [7.4~]
- Azure Pipelines の設定で、バッチモードを有効化
- [ドキュメント](https://github.com/microsoft/azure-pipelines-yaml/blob/master/design/pipeline-triggers.md)で雑に検索した感じ、ジョブのキューのされ方が変わる感じだろうか

## dstogov: Fixed bug [#77135](https://bugs.php.net/bug.php?id=77135) (Extract with EXTR_SKIP should skip $this)
- https://github.com/php/php-src/commit/83cdb89f8a6cbc656f2f95aeb6ce1c97691e197f
- [7.2~]
- extract() で [EXTR_SKIP](https://www.php.net/manual/ja/function.extract.php) 指定時に $this の書き換えでエラーになってしまうのを修正

## nikic: Enable STRICT_TRANS_TABLES in new test
- https://github.com/php/php-src/commit/d7c7522be9ac94847d4f861c898c1e5969d05e0b
- [7.2~]
- ext/pdo_mysql で、[先の修正](#camporter-fixed-bug-38546)のテストに STRICT_TRANS_TABLES が抜けてたのを修正

## dstogov: Restored NEWS entry
- https://github.com/php/php-src/commit/10b208f28dd14b57c7d86ccad90a8cd386482e89
- [7.2~]
- NEWS で↑の修正の際間違って消してた箇所を復活
Markdown記法の振り返り

はじめて投稿します。どうぞよろしくお願いします。

そもそも最初にMarkdown記法で書く、というところから戸惑っていたので、メモ。

#マークダウンとは？

Markdown（マークダウン）は、文書を記述するための軽量マークアップ言語のひとつ。プレーンテキスト形式で手軽に書いた文書からHTMLを生成するために開発されたもの。

#　タイトルの記載

######こう書くと、、、

\# 見出し１
\## 見出し２
\###　見出し３
\####　見出し４
\#####　見出し５
\######　見出し６

######こうなる
# 見出し１
## 見出し２
###　見出し３
####　見出し４
#####　見出し５
######　見出し６
 

#　コードの挿入
######こう書くと、、、
\`\`\`kotlin:quiita.kt
val x: Int = 10
\`\`\`

######こうなる
```kotlin:quiita.kt
 val x: Int = 10
```

#テーブル（表）

######こう書くと、、、
\|商品名|価格|
\|:---:|:---:|
\|りんご|100円|
\|みかん|60円|
\|メロン|800円|

######こうなる
|商品名|価格|
|:---:|:---:|
|りんご|100円|
|みかん|60円|
|メロン|800円|

#　終わりに
これからも少しずつ勉強していきたいと思います。
Xilinx AXI GPIO の使い方

## 概要
Xilinx AXI GPIOをZynqやMicroblazeで使う方法について、公式のBaremetal Driverを使って書いていきます。

## 環境
* Vivado 2018.3

## Bitstreamの作成
2個のLEDをGPIO1に、2個のスイッチをGPIO2に接続しました。
GPIO1は`All Outputs`、GPIO2は`All Inputs`のフラグを有効にしています。
![axi gpio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/410452/32b4e484-bd04-1a6a-ea97-8a5843f5a983.png)

## サンプルコード
いきなりですが、LEDの点灯とスイッチの読取りを行うコードは下記のとおりです。
`Hello World`のテンプレートにこれをコピペすれば初期化と基本動作を試せます。

```c
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xgpio.h"

#define LED_CHANNEL 1
#define SW_CHANNEL 2

XGpio gpio_0;

int main(){
	int status;

    init_platform();

    // AXI GPIOドライバの初期化
    status = XGpio_Initialize(&gpio_0, XPAR_GPIO_0_DEVICE_ID);
    if(status != XST_SUCCESS){
    	xil_printf("XPAR_GPIO_0_DEVICE_ID initialization failed.\n");
    	return XST_FAILURE;
    }

    // 入出力方向の設定 0:出力 1:入力
    XGpio_SetDataDirection(&gpio_0, LED_CHANNEL, 0x0);        // all output
    XGpio_SetDataDirection(&gpio_0, SW_CHANNEL,  0xFFFFFFFF); // all input

    // LED点灯 (32bitを一度にセット)
    XGpio_DiscreteWrite(&gpio_0, LED_CHANNEL, 0b11);

    // 指定したビットだけクリア (0にセット)
    XGpio_DiscreteClear(&gpio_0, LED_CHANNEL, (1<<1));

    // 指定したビットだけセット (1にセット)
    XGpio_DiscreteSet(&gpio_0, LED_CHANNEL, (1<<0));

    // スイッチの値を読み出し
    u32 sw_state = XGpio_DiscreteRead(&gpio_0, SW_CHANNEL);
    xil_printf("SW=%08x\n", sw_state);

    cleanup_platform();
    return 0;
}
```

## Interruptの有効化
```C
// AXI GPIOの割り込みを有効化 (GPIO2のみ有効)
XGpio_InterruptEnable(&gpio_0, SW_CHANNEL);
// AXI GPIOのグローバル割り込みを有効化
XGpio_InterruptGlobalEnable(&gpio_0);
```

```C
// 割り込みハンドラ
void GpioHandler(void *CallbackRef){
	XGpio *GpioPtr = (XGpio *)CallbackRef;
	// 割り込みをクリア
	XGpio_InterruptClear(GpioPtr, SW_CHANNEL);
}
```

MicroBlazeでGPIO割り込みをテストした記事はこちらです。
http://taltalp.hatenablog.jp/entry/2018/09/24/005413

## 参考
https://github.com/Xilinx/embeddedsw/tree/master/XilinxProcessorIPLib/drivers/gpio/examples

私が以前書いたブログですが、ブログ名が原因で記事が検索しにくかったのでQiitaに再掲載しています。
http://taltalp.hatenablog.jp/entry/2017/11/06/204748
開発日記 6/9~6/10（Railsでレシピアプリを作成）

# 概要

Railsを使用したポートフォリオの製作過程を記録していきます。作成しているアプリはマクロ（炭水化物・タンパク質・脂質）計算が可能なレシピアプリです。

# 方針
まずは「完成させること」を目標にします。そのため、テストは未実装ですし、レイアウトも簡素にしています。

# 環境
* Docker 18.09.2
* docker-compose 1.23.2
* ruby 2.5.5
* Rails 5.2.3

# 進捗

### ユーザモデルの作成
Railsチュートリアルを参考にしてます。Railsチュートリアルは本当に優秀だと思います。
### ER図の作成
『達人に学ぶDB設計入門』によると、プログラムの設計よりもデータ設計からはじめる方が効率的らしいので、ER図を作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353542/43b8e46f-83f1-4ae8-f363-abce9504a451.png)
### 材料データの作成
本当はAPIを利用して食材の栄養素データをとってきたかったのですが、良さそうなAPIが見つからなかったので、あらかじめ栄養素データをデータベースに入れておく方法をとります。

具体的には、[日本食品標準成分表2015年版（七訂）：文部科学省](http://www.mext.go.jp/a_menu/syokuhinseibun/1365297.htm)のcsvデータをRailsアプリにインポートします。

そのままインポートはできないので、データを整形したのちにインポートします。
*[参考]*
[食品の栄養価をAPIで取得できるクラウド・データベースを構築する - Qiita](https://qiita.com/nkjm/items/53a0bb172d12ad169493)
[RailsでのCSVデータ投入 - Qiita](https://qiita.com/yoshito410kam/items/40b675760bd8a1f8e728)
[日本食品標準成分表2015年版（七訂）：文部科学省](http://www.mext.go.jp/a_menu/syokuhinseibun/1365297.htm)
[railsでcsvを読み込んで、DBへ保存する - Qiita](https://qiita.com/SoarTec-lab/items/50e046ea2a2764c12c21)
###

# つまづいたとこ&自分用メモ
### csvのインポート
* nameカラムだけインポートされていない（nilになる）
* logを見てみると「invalid multibyte char (US-ASCII)」と表示されたので、文字コードの問題でした。『# coding: utf-8』をseeds.rbの冒頭に追加して解決

### Dockerの操作
* rails db:migrateができない？
* `docker-compose run`を使用し、コンテナ内でコマンド実行する必要がある

(例)
`docker-compose run web rails db:migrate`

*[参考]*
[*docker-compose で Rails の開発環境を作る*
](https://qiita.com/skyriser/items/2cf98b747ed6577cc5ee)

### bootstrap4の導入
* `File to import not found or unreadable: bootstrap-sprockets.`というエラーが出た
* Bootstrap4からはRailsへのBootstrapの導入方法が変更になっている

*[参考]*
 [Railsアプリで Bootstrap 4 を利用する - Qiita](https://qiita.com/NaokiIshimura/items/c8db09daefff5c11dadf)

## rails generateをやり直す
> $ rails generate controller FooBars hage
> 「あ、やっちゃった！」
> $ rails destroy controller FooBars
> 「ふ～、助かった」

*[参考]*
[開発中に rails generate や db:migrate をやり直したい時 - Qiita](https://qiita.com/histori/items/7b76aaaa69f2e3ab4f06)

## コメント
csvデータの整形とインポートにかなり苦戦しました。エラーログの見方がまだしっかりと理解できていないので、そこは復習していきます。

それと、「日本食品成分表」のデータはかなり細かく食材が分類されています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/353542/13aad068-6f8b-66d0-9667-60fd887a300e.png)
ユーザがレシピを登録する際に食材を選択するのがかなり煩雑になるので、このあたりも解決していかないといけないですね。
なぜ計画づくりに失敗するのか ?

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257568/37d61c35-e123-b1ff-7526-6489328aa884.png)

こちらを読んで

## 目的
上手くいかない要因を理解するため

## 通説
- プロジェクトの2/3近くは、コスト見積もりを大幅に超過する
- プロダクトのフィーチャーの64%は、めったに、あるいは全く利用されない
- 平均的なプロジェクトは予定スケジュールの2倍以上かかる

## 5つの問題
- 作業の完了を基準にしている
- マルチタスク化
- フィーチャーの優先順位の欠如
- 不確実性の無視
- 見積もりのコミットメント化

### 作業の完了を基準にしている
**フィーチャーの提供**を重視していない

- **作業**は早く終わらない
  - **パーキンソンの法則**
  - 「
仕事の量は、完成のために与えられた時間をすべて満たすまで膨張する」
- 作業スケジュールは相関性がある
  - 独立していないので先行の遅れは後行の遅れに繋がる
  
->フィーチャー基準にする(フィーチャーとは特徴、特質を包含した機能)

### マルチタスク化
個人が3つ以上を平行すると生産性が大幅に下がる
複数作業の遅延時に問題が発生

**マルチタスクとスケジューリングにおける問題**

- 割り振りと着手までに開きがある
  - リアルタイムな作業分担ができていない
- 個人の割り当て、稼働率にフォーカスしてしまう
  - ゆとり(slack)がなくなる

->グループに割り当てる 

### フィーチャーの優先順位の欠如
作業の完了を目的にした順序づけはフィーチャーの優先順位とは違う

- 作業は開発側面からの観点、フィーチャーは顧客側面の観点
- 作業視点の順序では、遅延時に本来必要なフィーチャーも削られる

->フィーチャーで順序づけする事で必要なものから実現できる 

### 不確実性の無視
プロジェクトの初期とは不確実性は最大

- 完了見込みに幅をもたせる
- 小さく繰り返しフィードバックを反映する

->計画そのものから計画づくりに視点が移る

### 見積もりのコミットメント化
見積もりは確率だが、コミットメントは確率ではない

- 見積もりをコミットメントとするならば、作業が完了する確率は100%になる
- 確率を100%にするならば、様々なビジネス要素、リスクも分析・検討できている事も前提になる
- 不確実性コーンの考え方からも初期での完全な分析・検討は不可能
- 暗黙のコミットメントとする事は確率を下げることにしかならない
- 従来の見積もりによる完成する確率は0%になる

->**100%に近づける行動**視点で見積りと計画づくりをしなければ意味がない

## 書籍情報
Mike Cohn (著), 安井 力  (翻訳), 角谷 信太郎  (翻訳)
アジャイルな見積りと計画づくり ～価値あるソフトウェアを育てる概念と技法
https://amzn.to/30CRfjU

## 雑感
章頭に「敵がいれば計画は変わる」ということわざが記載されている。
敵の想定数だけ計画にもバリエーションをもたせることが重要そう
その想定をいかにできるかも大事そう
link_toメソッドの使い方について


#link_toメソッドとは？
link_toは、Rubyタグ(<%= %>)の中で使用することができるメソッドである。このメソッドは、引数を指定することで様々なリンクを生成する。

```html
<%= link_to 'ツイート一覧へ', '/tweets' %
```

通常、HTMLコード内でリンクを生成する際はaタグを使用する。

```html
<a href="http://sample.htm">サンプルサイトへ飛びます。</a>
```

しかし、link_toメソッドを使って記述を行うと、HTMLコードが読み込まれる際にaタグに変換される。そのため、サイトを表示した際には、aタグと同様にリンクとして表示される。

ログインや新規登録ボタンを実装する時も、このメソッドを利用する。


#link_toメソッドの使い方

削除ボタンなどをビューに設定したい時は、link_toメソッドの後に引数をつけるとできる。

第一引数が文字列の指定、第二引数がパスの指定、第三引数がhttpメソッドの指定をする。第二引数がパスは、rake routseコマンドで調べることができる。

rake routesコマンド

```
$ rake routes
```

例）.削除機能の場合

```ruby
<%= link_to '削除', "/tweets/#{tweet.id}", method: :delete %>
```

例）.グループ編集機能の場合(Editボタンとして表示)

```ruby
= link_to 'Edit', edit_group_path(@group.id)
```

ちなみに、rake routesコマンドでパスを調べると、以下のような表示が出る。

```
new_group GET    /groups/new(.:format)                groups#new
              edit_group GET    /groups/:id/edit(.:format)           groups#edit
                   group PATCH  /groups/:id(.:format)                groups#update
                         PUT    /groups/:id(.:format)                groups#update
```

2行目の/groups/:id/editというパスを第二引数に代入し、GETを第三引数に代入する(小文字で代入する)。
URLからHtmlを取得する関数

	Option Explicit
	Dim oHttp      As Object

	Public Function GetHtmlsource(strURL As String)

	  If oHttp Is Nothing Then
	    Set oHttp = CreateObject("MSXML2.XMLHTTP")
	  End If

	  oHttp.Open "GET", strURL, False
	  oHttp.setRequestHeader "If-Modified-Since", "Thu, 01 Jun 1970 00:00:00 GMT"
	  oHttp.Send

	  GetHtmlsource = oHttp.responseText
    
	  If (oHttp.Status < 200 Or oHttp.Status >= 300) Then
	    MsgBox "URL読み込みに失敗しました", vbExclamation + vbOKOnly, "Error!"
	    GetHtmlsource = ""
	  End If
    
	End Function
プログラムの本質について考えてみた。

#プログラムの本質を自分なりにアウトプットしてみた。

プログラムの本質は、**限界値を決めて、単純化する**ことであると考えた。
どういうことかというと、「どこからどこまでが〇〇で、どこからどこまでが△△である」という限界値（線引き・仕切り）を設定して、１つのまとめて単純化することである。

よく変数は箱に例えられ、配列やテーブルは引き出しやタンスに例えられる。この理由はおそらく、変数や配列は**仕切り**を設定するものであると考えた。これは、どこまでが合法で、どこまでが違法なのかという法律の勉強と全く同じであることを実感した(ちなみに現役の法学部生)。

話を戻して、例えば、以下のようなコードであれば、

```ruby
age = 22
```
22という数字は、年齢という１つの仕切りが設定される。一般に22といわれたら、日付のことかもしれないし、物の個数を示しているかもしれない。しかし、上記のようにageという変数を用意することで、22が年齢という枠組みに収められる。

```ruby

class Human
    def initialize(myname = "Ruby")
        @name = name
        @age  = age
        @gender=gender
    end
end
```

上記の例のように、どこからどこまでがnameというインスタンス変数の値であり、どこからどこまでがageというインスタンス変数の値であるかの限界値を設定して、それを１つにまとめて、単純化することが、自分なりのプログラムの本質であると考えた。

　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　以上
openatについて

openatについてメモ

# openat
```
int openat(int dirfd, const char *pathname, int flags);
int openat(int dirfd, const char *pathname, int flags, mode_t mode);
```

openatはディレクトリファイルディスクリプタを指定することで、そこを起点とする相対パスでファイルを指定できるopen。

ただし、pathnameが絶対パスの場合には、dirfdは無視される。
また、dirfdにAT_FDCWDが指定されている場合は、pathnameはワーキングディレクトリに対する相対パスとして解釈される。

そして、openatはopenと比較して、次のようなメリットがある。

- openatはスレッド毎にワーキングディレクトリを管理できる（マルチスレッド環境ではワーキングディレクトリは共有されるため）
- openしたいファイルのあるディレクトリのディレクトリファイルディスクリプタを指定する事で、ファイルの存在確認とファイル作成の間に意図しない処理が走ってしまうというレースコンディションを避ける事ができる。→TOUTTOU問題への回避策。

# 参考

https://linuxjm.osdn.jp/html/LDP_man-pages/man2/open.2.html
https://ja.wikipedia.org/wiki/Time_of_check_to_time_of_use
https://wiki.bit-hive.com/north/pg/openat%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%82%B3%E3%83%BC%E3%83%AB
Bot Builder v4 : DevOps リリースパイプライン作成

今回は、前回用意した環境にボットをリリースしていきます。

# 概要

今回リリースパイプラインでは以下のような作業を行います。

- 1 つのパイプラインでテスト環境と本番環境にボットをリリース
- ビルドされたパッケージをテスト用 App Service へ展開
- 手動での承認を設定
- 本番用 App Service へ展開

# Azure DevOps リリースパイプラインの作成

1\. Azure DevOps の「Pipelines」より「Release」を選択し「New pipeline」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/e7fbcc7f-67fe-0e40-8e0e-b9749e2b2a57.png)

2\. テンプレートより「Azure App Service deployment」の「Apply」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/dcf9c445-3051-7f62-186f-7e25c4a6ec26.png)

3\. パイプラインより「＋ Add an artifact」をクリック。作成済のビルドパイプラインを指定。ソースアリアスはここでは artifact と設定。「Add」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/a00e004e-6977-2294-dcb4-2d92f0be3d4e.png)

4\. ジョブの編集リンクをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/2d72f2b9-7868-8478-fcef-cbeb668c88de.png)

5\. まず Azure の接続を構成。サブスクリプションを選択して「Authorize」をクリック。ウィザードに従って構成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/93af731c-b7a8-0ae6-9b3c-b905c0419dd6.png)

6\. App service name を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/c4825fd3-9d9c-0e04-8762-0f2fad70c2cb.png)

7\.「Deploy Azure App Service」タスクを選択し「Deploy to Slot or App Service Environment」のチェックを入れて、作成済の Test スロットを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/45a93d65-405f-9eb1-bab2-0ad99609380f.png)

8\. Pipeline に戻り「New stage」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/6d398d15-54b4-3c72-af2e-ae54f5ad27d0.png)

9\.「Azure App Service deployment with slot」テンプレートを「Apply」。既にデプロイは終わっているため、初めのタスクを削除。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/2976f770-93f4-51f0-c607-71008b9cf216.png)

10\. ステージレベルで必要な情報を指定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/6b5f8d10-1265-305a-a3b7-ae4fa62388f8.png)

11\. パイプラインに戻り、ステージ 2 のトリガーをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/3494a76f-287d-c327-b9dd-e20175d26f21.png)

12\. Pre-deployment approvals を有効にして、認証者を設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/5e877324-6dd7-c8b4-6a57-ed580e082aa0.png)

13\. パイプライン名を変えて、保存。リリースの作成を実行。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/cb069b5b-93f0-8872-c45b-a7999be1bf31.png)

14\. リリースの実行中リンクが表示されるので、クリックして移動。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/e2805344-38eb-fe91-bb88-ba25432b6606.png)

15\. ステージ 1 が完了して認証まちになることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/78c9601d-37fd-b9b2-4385-738ded308790.png)

16\.「Approve」ボタンをクックすることで、スワップも完了することを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/971d5998-290b-fef1-6773-cc4e1ed668b2.png)

# まとめ

今回の構成は、あくまで最小限構成のため、要件によってより複雑な構成が必要となります。まずは最小構成を作ってどのように動作するか試してみてください。

[目次に戻る](https://qiita.com/kenakamu/items/6dc043cfc1f199032883)
4行のコードでクリップボードを翻訳しよう。

毎回Google翻訳開くのめんどくさい。  
クリップボードを翻訳してくれるPythonスクリプトあったら便利やん。  
Google翻訳APIのおかげでサクッと書けた。
(Python3系で書いたけどprint文修正すれば2系でも動くはずです。)
## 使い方

googletransのインストールが必要。

~~~bash
$ pip3 install googletrans
~~~

英文(Hello World !!!)コピーして、以下スクリプトを動かす。

~~~trans.py
import pyperclip
from googletrans import Translator
sentence = pyperclip.paste() #クリップボードから取得
print(Translator().translate(sentence,src = "en" ,dest = "ja").text)  #翻訳
~~~

すると翻訳できる。

~~~bash
$ python3 trans.py 
こんにちは世界 ！！！
~~~

一時変数使わなければ3行で書けるけど可読性的に。

## aliasに登録しておこう

.bashrcにaliasとして登録しておくと便利。  
alias名とファイルパスは適宜変えてください。

~~~bash:.bashrc
alias jp='python3 $HOME/Python/MiniCodes/trans.py'
~~~

~~~bash
$ jp
こんにちは世界 ！！！
~~~

srcとdestを適宜書き換えれば英語→日本語以外もいけます。[言語対応表](https://cloud.google.com/translate/docs/languages?hl=ja)

以上。
【Rails】サーバ起動時、Address already in use と表示される

経緯：
railsを使ってサーバを起動する際に時々直面するエラーなので何が起こっているエラーなのかと対処法をまとめてみようと思いました。
間違いがあればご指摘いただければ嬉しいです。



##エラー内容

```
$ rails s
=> Booting Puma
=> Rails 5.2.3 application starting in development 
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.1 (ruby 2.6.3-p62), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
Exiting

--省略--

 Address already in use - bind(2) for "::1" port 3000 (Errno::EADDRINUSE)

```


記のエラー` Address already in use - bind(2) for "::1" port 3000 `に着目して頂くとポート3000はすでに使われていますよと警告されているのが分かります。

では、この3000のポートを使っているプロセスを見つけてあげて接続を切ってあげれば解決できそうですね。


##ポートを使用しているプロセスを見つけて接続を切る


```
#port:3000を使用している実行中のプロセスを見つける
$ lsof -i :3000

COMMAND     PID USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
com.docke 50404 a-33   32u  IPv4 0x6a977ba10ee7a7a1      0t0  TCP *:hbci (LISTEN)
com.docke 50404 a-33   34u  IPv6 0x6a977ba0ec0720e1      0t0  TCP localhost:hbci (LISTEN)
```


####lsofコマンドとは
プロセスが開いているファイルを表示するコマンド
`-i`オプションでネットワークソケットの指定をすることができます。
（今回ははport:3000を指定しています）
`PID`というのがプロセスIDになります。

```
#PIDを指定してポートを切る
$ kill -9 [PIDの番号]
```

`-9`オプションは強制的にという意味があります。
なので指定したプロセスを強制的に切ってくれます。


最後に、立ち上がるか確認

```
$ rails s
=> Booting Puma
=> Rails 5.2.3 application starting in development 
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.1 (ruby 2.6.3-p62), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:3000
Use Ctrl-C to stop
```

 成功です。
非同期通信の仕組みについて


#同期通信の実装に詰まっているため、一度、非同期通信の仕組みについて、アウトプットしてみた。

##1.非同期通信とは？

非同期通信とは、コンピュータ間で送信者のデータ送信タイミングと受信者のデータ受信タイミングを合わせずに通信を行う通信方式である。
つまり、送信者と受信者の両方がオンラインである必要がなく、片方が接続しているだけで通信が成立する。

非同期通信の対義語として、同期通信というものがある。
同期通信とは、コンピュータ間で送信者のデータ送信タイミングと受信者のデータ受信タイミングを合わせなければならない通信を行う通信方式であう。
つまり、送信者と受信者の両方がオンラインで繋がっている必要があり、片方が接続しているだけでは通信が成立しない。

非同期通信の身近な具体例としては、GoogleMapやLINEが挙げられる。
GoogleMapでは、ユーザーが、地図を拡大・縮小するとそれに合わせて、画面上における地図の詳細が変化したり、ユーザの周りの位置情報が変化したりする。LINEでは、メッセージを送信した時に、メッセージ画面の下に送信したメッセージがスクロールされる。

##2.非同期通信の仕組み

同期通信と非同期通信との仕組みをそれぞれ比較しつつ、説明していく。

まず、同期通信の仕組みについて説明する。
同期通信では、ユーザーがWebブラウザ(ビュー)上から、Webサーバーにリクエストを送信する。次に、それを受け取ったサーバー側が、表示するHTMLファイルを作成し、それがユーザー側へレスポンス（応答）として、Webブラウザ(ビュー)上に表示されるという仕組みである。
つまり、同期通信では、リクエストを出してからレスポンスが返ってくるまでは、他の処理を行うことはできず、サーバーからのレスポンスを待ち続けなければならないのである。

次に、非同期通信の仕組みについて説明する。
リクエストがされた時、クライアント側(Webブラウザ上)で動くjavascriptが直接サーバーとのやりとりを行う。そして、それによって取得したデータを元に、HTMLファイルを更新するという仕組みである。この時、送受信するデータはHTMLではなくXMLで行われる。
つまり、非同期通信では、リクエストを出してからレスポンスが返ってくるまでの間、ブラウザ上で他の処理を行い、サーバーからのレスポンスが返ってきた時にサーバー側から所得した情報をWebブラウザ(ビュー)上に表示するのである。
 

## 3.私見における同期通信と非同期通信の違い

私見では同期通信と非同期通信とでは、アルゴリズムが組まれてその処理が実行されている場所にも違いがあると考えている。

つまり、同期通信では、アルゴリズムが組まれてその処理が実行されている場所は、サーバー側(バックエンド)のみであり(Rubyなど)、ビュー側(フロントエンド)では一切それがない。よって、サーバー側からのレスポンスが返ってくるまでの間、ビュー側での処理は止まる。

他方、非同期通信では、アルゴリズムが組まれてその処理が実行されている場所は、サーバー側(バックエンド)だけでなく、ビュー側(フロントエンド)においてもなされている（Javascriptなど）。よって、サーバー側からのレスポンスが返ってくるまでの間、ビュー側での処理は続行される。　

つまり、非同期通信では、、サーバー側(バックエンド)も、ビュー側(フロントエンド)も常に処理が実行され続けているということになる。
                                                  以上