OmniAICreator/Qiita-1.07M huggingface dataset:
Rubyの自己代入（||=）とはこんな仕組みです

仕事などで人の書いたRubyのコードを見ていると、以下のようなコードを見かけることがあると思います。

```rb
test ||= 10
p test # => 10

sample = 20
sample ||= 'sample'
p sample # => 20

sample_txt ||= 'sample'
p sample_txt # => "sample"
```

`||=`これは、いわゆる自己代入とググればよく出てくるやつです。

しくみは、変数（`test` / `sample` / `sample_txt`）の中身が、
`nil`または、`false`であれば、`||=`の右辺にある値を変数に代入する。
`nil`または、`false`以外であれば、変数の値をそのまま利用する。

と言う感じです。

```rb
test ||= 1
```

上記のようなコードは、以下のようなコードを見ると理解しやすいかなと思います。

```rb
test || (test = 1)
p test # => 1
```

論理演算子である（`||`）は、式全体の真偽が確定した時点で評価された値が戻り値となります。

上記の場合、右辺の変数（`test`）は`nil`なので、1が評価され、戻り値として返されます。

参考

- https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html
- https://www.javadrive.jp/ruby/if/index4.html
Typora - Markdown最強エディタ

# はじめに
人に紹介する機会があったので、そのメモ。
メモとして Markdown を使うことの方が多いです。
殴り書きでもまとまってしまうのがたまりません。

Markdown を愛して止まない私が今回ご紹介するのは「**Typora**」です。

# 1. Typoraとは
マークアップ言語などに特化したエディタ。
Windows、MacOS、Linux ともに対応。
筆者は、Markdown エディタとして利用しています。

![スクリーンショット 2019-07-27 13.41.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242292/3f0535d6-bdfa-298d-bebf-9988fcf7c7e6.png)



# 2. 導入
公式サイトからダウンロード。

https://typora.io/

公式サイトもめっちゃオシャレ。
![スクリーンショット 2019-07-27 8.55.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242292/f2ca6af9-4071-e21a-4b70-1d96cda90bb5.png)
1ページ分下にスクロールし、上のメニューバーからダウンロード。
導入方法は簡単なので割愛。
# 3. メリット
- 動作が軽い
- シンプルなGUI
- 直感的に Markdown が書ける。
- 編集画面とプレビュー画面ではなく、一つの画面で完結
- 数式や表の整形なんかにも強い
- Excel の表とか、ローカルにある画像とか、D&D で持ってこれる

# 4. デメリット
- 補完機能がない
- 拡張に少し手間がかかる（後述）

これくらいでしょうか。
# 5. 使用時のメモ
HTML や PDF ファイルへの出力など、
大体の機能はメニューバーにあります。
比較的に使用頻度の高いショートカットは以下のチートシートで紹介しています。

## チートシート
下の表も Typora でさくっと作成しました。

| 機能               | Windows          | MacOS                                                   |
| ------------------ | -------------------- | ----------------------------------------------------------- |
| 改行ラグ           | Shift + Enter    | Command + Shift + Return                                |
| ソースコードモード | Ctrl + /         | command + /                                             |
| 表の挿入           | Ctrl + T         | Command + Option + T <br />(Command + T は新規タブ作成) |
| コードブロック     | Ctrl + Shift + K | Command + Option + C            |






ちなみにコードブロック追加は「```」を使った方が楽です。
# 6. 拡張機能
メニューバー/ヘルプ/More Topics/ か、
http://support.typora.io/ を参照してください。
テーマやオートセーブの追加方法などが載っています。

# 7. 最後に
拡張については、別記事にする予定です。
また、Linux 環境に関しては書いていません。
（私自身、Ubuntu サーバーは WindowsPC から SSH でリモート接続しているため）
ご要望が出れば検証して追記する次第です。

修正点、ご要望などがございましたらお知らせください。
以上です。お疲れ様でした。
UbuntuでMySQLのdata_dirを移動した時にPermission denied

前提：Ubuntu18.04でMySQL8.0.15を使っていた時の話です。

NVMeのSSDを遅ればせながら手に入れたので、
では、MySQLのデータ領域もそこに移そうかなーと思って移動したところ、
思わぬところでハマりました。

データを移動してMySQLを再起動するとPermission denied.
ファイルの権限を書き換えて再起動してもやはりエラーは変わらずで首を捻っていたところ
どうやらMySQLにはファイル自体のPermissionの他にも、
「どのデータをどこに置くか」を設定するファイルがあるみたいです。

そのファイルはこれ↓

```/etc/apparmor.d/usr.sbin.mysqld
# Allow data dir access
  /var/lib/mysql/ r,
  /var/lib/mysql/** rwk,
```

このファイルのこの部分に書かれている場所にしかデータ領域を置くことができないみたいです。
my.cnfでdata_dirで指定できるのは場所だけみたいですね。。。わかりづらい。

そのため、以下のように新しいデータ領域の場所を追記してあげたら再起動できました。

```/etc/apparmor.d/usr.sbin.mysqld
# Allow data dir access
  /var/lib/mysql/ r,
  /var/lib/mysql/** rwk,
  /mnt/nvme1/mysql/ r,
  /mnt/nvme1/mysql/** rwk,
```

もちろん、古い設定の方は紛らわしいので削除してしまっても大丈夫です。
指定できるのが1個だけじゃないよってことを書きたかっただけなので。


ちなみに、NVMe領域に乗せても速さを実感できなかったので結局OSを入れ直しました。


(´・ω・`)ではー
【備忘録】git logで文字化けした時の対処

# 環境
+ Windows10

# 現象
git logで以下のような文字化けが発生する。

```
$ git log

VS<E3><82><B3><E3><83><9E><E3><83><B3><E3><83><89><E3><82><92><E5><AE><9F><E8> <A3><85><E3><80><82>
    V<E3><82><B3><E3><83><9E><E3><83><B3><E3><83><89><E3><81><AE><E6><AD><A3><E5>
<B8><B8><E5><BD><A2><E3><82><92><E5><AE><9F><E8><A3><85><E3><80><82>
    .gitignore<E3><82><92><E8><BF><BD><E5><8A><A0>
```

# 対処法①(毎回やる必要がある)

`$ git --no-pager log`

# 対処法②(1回やればOK)

`$ open ~/.gitconfig`

config内のpagerをダブルクォーテーションで空に設定。

> [core]
    pager = ""

# 参考URL
+ [GitのPagerの設定](https://rcmdnk.com/blog/2018/08/26/computer-git/)
+ [Windowsでgit log見た時日本語が～みたいに化けた時の対処方法 - Qiita](https://qiita.com/Fushihara/items/c21172e707d57c833e7e)
（VimでSQLを書いてみた！）めっちゃビール飲みたくなるやん🍺

![Screen Shot 2019-07-27 at 13.31.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/149269/dc6890e3-8ff8-1807-d338-5d1efc472406.png)

# めっちゃビール飲みたくなるやん

🍺🍺🍺🍺🍺🍺🍺🍺🍺🍺🍺🍺🍺

```bash
#! /usr/local/bin/bash

passion="  \
  めっちゃ \
  ビール   \
  飲みたく \
  なるやん "

function message_sql () { 

  str=$1

sqlite3 << EOS

  select "${str}" ;

.exit
EOS

}

export -f message_sql
echo $passion \
  | xargs -n1 -I{} bash -c 'message_sql {}'
```

🍺🍺🍺🍺🍺🍺🍺🍺🍺🍺🍺🍺🍺

```vim
# vimrc
# スペース２回押して色付けを切り替える

nnoremap <leader><leader> :call <SID>exchangeshsql()<CR>
function! <SID>exchangeshsql() abort
  if &filetype == 'sh'
    set filetype=sql
  elseif &filetype == 'sql'
    set filetype=sh
  endif
endfunction
```



🍺🍺🍺🍺🍺🍺🍺🍺🍺🍺🍺🍺🍺


現場からは以上です

### 補足

ちょっとしたスクリプト

```bash

function foofunc () { 

sqlite3 foo.sqlite << EOS

  select * fooTable limit 3;

.exit
EOS

}

foofunc
```
Pandasで長いテーブルを表示する際にカラムとかを分かりやすくするライブラリを作った

個人的に、共有用のJupyterで出力したHTMLとか含め、Pandasで長いテーブルを表示する時があります。

そういった場合に、エクセルなどのようにカラム名のヘッダー部分を固定表示して、スクロールしてもどのカラムなのかが分かりやすいようにしたり・・・といったことがJupyterだとやり方がよく分かりません（Pandas関係とJupyter関係を軽く調べたくらいなのでもしかしたらもっと調べればあるのかもしれませんが・・・）。

![20190727_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/b46be10c-8e02-976c-8408-a0f574d16ae8.png)

![20190727_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/6c3dbefd-8385-f77e-45c1-aede87a01fcf.png)

そのため、2時間くらいあればPyPI登録まで含め終わるでしょ・・・という印象だったため、自分でライトなライブラリを書いてみました（[Github](https://github.com/simon-ritchie/pandas-table-tooltip)）。

データフレームから生成されたテーブルの、対象のセルにマウスオーバーするとインデックスとカラムの情報をツールチップで表示してくれます。

![20190727_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/a32de908-47da-f7ae-86cc-ed586a993848.png)

これで縦横に長いデータフレームでも安心:smiley:

# インストール方法

pipでインストールができます。

```
$ pip install pandastabletooltip
```

# 使い方

インターフェイスは1つの関数だけで、データフレームを放り込むだけです。

```py
from pandastabletooltip import make_table_html_with_tooltip
import pandas as pd

df = pd.DataFrame(data=[{
    'a': 100,
    'b': 200,
    'c': 300,
}, {
    'a': 1000,
    'b': 2000,
    'c': 3000,
}, {
    'a': 10000,
    'b': 20000,
    'c': 30000,
}])

make_table_html_with_tooltip(df=df)
```

![20190727_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228778/2b1dec32-2d65-ec54-3cc2-503e44cb27b4.png)

息抜きにこういったライトなプログラミングもいいですね:yum:
Qiitaでバズった「毎朝15分の勉強会」を実際にやってみた！

# 概要

先日Qiitaでトレンドに上がっていた [毎朝15分の勉強会で若手の行動が驚くほど改善した話](https://qiita.com/kojimadev/items/cd5dd5332e33b3ef46a6)に感銘を受け、7月から同じチームに配属になった新入社員と、同じような勉強会をしてみました。

# 筆者のこと

- エンジニアを始めて4年弱です(まだまだ修行中の身)
- 自社で取り扱うwebサービスのサーバサイドエンジニアをやっています
- 7月から同じチームに配属になった新卒新入社員のOJT担当になりました

# やることになった背景

~ ある朝、Qiitaのトレンドで[記事](https://qiita.com/kojimadev/items/cd5dd5332e33b3ef46a6)を読んだところから ~ 

私：(面白そうだな。ただ読むだけよりアウトプットしてもらったほうが良さそう)
私：「こんなのバズってるんだけど、どう思う？」
後輩：「へえー、なんか良さそうですねー」(※本心は本人のみぞ知る)
私：「んじゃ明日からやってみよう。本はどうしよっか？」
後輩：「今『[リーダブルコード](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655)』を読んでて・・・」
私：「お、んじゃそれで行こうぜ。」
後輩：「わかりました！楽しみです！」(※本心は本人の(ry)

こんな軽い感じで始めてみました。

まあ1日15分で知識や行動力が身につくなら有意義ですし、
仮に失敗してもコストは大きくないという計算は・・・あまりなかったですね笑

やっぱり完全にノリでした。

# やるにあたってのルール作り

[記事](https://qiita.com/kojimadev/items/cd5dd5332e33b3ef46a6#3-%E5%8B%89%E5%BC%B7%E4%BC%9A%E3%81%AE%E5%AE%9F%E6%96%BD%E6%96%B9%E6%B3%95)をベースにはしてますが、
チーム事情等がやはり異なりますので、
少しルールを変えてやってみました。

## ルール

1. 朝15分使って行う(記事と同じ)
2. 読んだ書籍について人に説明を行う(記事と同じ)
3. 月/水/金で後輩が書籍の内容や感想等を話す
4. 火/木は、私から業務知識やデータ構造などを話す
5. 進める量は後輩に一任する
6. 私自身も本を読んで、ある程度理解した上で聞く

### 毎日ではなく、月/水/金にした理由

まず毎日ではなく月水金にした理由は、
記事では新人が2人いらっしゃるようですが、こちらは1人だけなので、
毎日だと少し負荷が高い可能性があるとし、月/水/金に変えました。

代わりに私の方で今後必要になるであろう業務知識やデータ構造等を火/木で話して、
色々理解してもらおうという話になりました。

### 進める量を一任した理由

進める量に関しては、自主性を重んじて一任してます。
私発案ではありますが、自分ごととして捉えてもらわないと、
続けるのは厳しいかなと思っているからです。

本人がとても真面目で、必ず1章以上は用意してくれるので、今の所問題ないです。
私なら絶対「忘れました！」というのがありそうだなあ笑

### その他

個人的に一番大事だと思っているのは、
「私自身も本を読んで、ある程度理解した上で聞く」かなと思ってます。

何事も「自分はやってないけどお前はやれ」スタンスは私自身嫌いで、
負荷をかける以上、こちらも白けない空気作りが必須だと考えてます。

今回に関しては、
「本を読んでいる」「本に書いてあることを実践している」
は必須かなと思っています。

で、恥ずかしながら『リーダブルコード』をちゃんと読んだことがなかったので、
勉強会が決まった日の帰りに本屋に直行して購入し、速攻で読みました。

幸いにも、今まで別の本やネット等の知見から、
「本に書いてあることを実践している」方はある程度できていたので、
なんとか矜持を保てました。(本当によかった・・・)

# やってみてどうだった

現段階(2019/7末)で『リーダブルコード』が終わりかけ・・・という段階ですが、
ある程度の手応えは感じています。具体的には以下の2つです。

1. 読みにくいコードに関して、できることから前向きに改善している
2. 後輩本人のバックボーンを知ることができた

1に関しては、『リーダブルコード』の目的そのものです。
修正すべき箇所周辺の読みにくいコードを、
できる範囲でリファクタリングしてくれているのはとても嬉しいです。

2に関しては副産物ではありますが、教える身としてはよかった点です。
勉強会の中で「今までは〇〇と思っていたけど、・・・」みたいな話になり、
それを深掘りすると、「どんな開発をしてきたか」などの経緯を見えてきました。

# まとめ

[記事](https://qiita.com/kojimadev/items/cd5dd5332e33b3ef46a6)にある通り、簡単に導入でき、かつ効果も高い勉強会となりました。
[@kojimadev](https://qiita.com/kojimadev) さん、本当にありがとうございました。

* 形だけ真似るのでなく、本質を理解してよりベストなやり方を模索すること
* 無理やりやらせないこと(自主性をおもんじること)

個人的には上記2点はとても大事だと思っているので、
取り組む場合はこの辺りは頭の片隅に入れていただけるといいかなと思いました！

# 2019/7/31 追記

* なんと上記に登場した後輩が記事を書きました。
* 実際に勉強会を行なった側の意見として書いてあるので、よかったらどうぞ
* [Qiitaトレンド「毎朝15分勉強会」の機会を先輩に提供していただきました](https://qiita.com/YouBou/items/97205628a23f6a710e91#_reference-dc6e0ee0db37cb9f5f76)

# 参照にしたリンク

[毎朝15分の勉強会で若手の行動が驚くほど改善した話](https://qiita.com/kojimadev/items/cd5dd5332e33b3ef46a6)
Svelteでwatchする

[Svelte](https://svelte.dev/)で使える router ないかなーと思って[svelte-spa-router](https://github.com/ItalyPaleAle/svelte-spa-router) のソースを見ていたら、結構参考になったのでメモ。

### Svelteで変数をwatchする

Svelteの機能で、vuejs の computed にあたる`$:`記法があり、これは通常は vuejs 同様に

```javascript:svelte

$:fifth = $hogeStore.length * 5
$:tenth = $hogeStore.fuga.length * 10
```

みたいな感じで使うのだが

```javascript:svelte

let fifth = null;
let tenth = null;
$:{
  fifth = $hogeStore.length * 5
  tenth = $hogeStore.fuga.length * 10
}
```
こういう感じで hogeStore を watch 出来る、この例だとあんまり有難みがないが、下記みたいな感じで利用されていた。

```javascript:svelte-spa-router

/* routersListは最初に定義されているpathとcomponent名のセット */
/* $loc.location（現在のURL）が変更された場合に、
　そのpathに該当するcomponentを探してセットしている */

$: {
    component = null
    let i = 0
    while (!component && i < routesList.length) {
        const match = routesList[i].match($loc.location)
        if (match) {
            /* componentが表示されるコンポーネント */
            component = routesList[i].component
            componentParams = match
        }
        i++
    }
}
```


### Storeでイベントを監視する

Svelte の store で個人的に謎だったのが `readable` の存在で、どういう時に使うものなのか疑問だったのだが、こちらも svelte-spa-router で「監視しているイベントが発火したら store を更新する」という使い方をされていた。

```javascript:svelte-spa-router

export const loc = readable(
    /* getLocationは現在のURLとQueryを返してくる */
    getLocation(),
    
    function start(set) {
        const update = () => {
            set(getLocation())
        }
        /* hashchangeイベントが発火したらupdateを実行してstoreを更新する */
        window.addEventListener('hashchange', update, false)

        return function stop() {
            window.removeEventListener('hashchange', update, false)
        }
    }
)
```
入門React redux ~reduxの概念は繰り返し使ってなれよう~

# Reduxとは
Reactでのフロントアプリケーション開発の際にセットで扱われることの多いのがこのreduxです。

A predictable state container for Javascript apps.
[公式サイト](https://redux.js.org/)より。

以下の4つを特徴としています。

・予測可能
・中央化
・デバックがしやすい
・柔軟性のある

### なぜこれを使う必要があるのか

あるコンポーネントで定義した値を別のコンポーネンントでも使いたいという場合に、ReactではPropsというものを使って親コンポーネントから子コンポーネントへと値を渡します。必ずこの方向になっていて、単方向データフローはReactの三代特徴のうちの1つです。

しかし、孫やさらに別の複数のコンポーネントで値を使いたいといった場合に、バケツリレーで渡していくのはしんどいということでこのReduxというものを使ってコンポーネント全体で値を管理できる仕組みが作られました。

## 【Reduxのアーキテクチャー】
![redux_archtecture.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274080/a023fc6c-66c5-6d25-6dc3-2f4e0191025f.png)


これによってデータが単方向になることが保証され、状態の変更が追いやすく破綻しにくいシステムを作ることができます。

## Reduxの構成要素
[redux公式のサンプル](https://github.com/reduxjs/redux/tree/master/examples/counter)を元にreduxの構成要素の概要について説明します。

#### state
コンポーネントの状態を表す値を保管するためのものです。コンポーネントの「現在の状態」を扱うためのものです。コンポーネントの表示を変えたりするためにstateを更新します。

公式では stateとして数値リテラルの0が直接reducerに渡されています。

```
export default (state = 0, action) => {
```

#### Reducer
Actionとstateを受け取って、新しいStateを返します。

※語源は化学の Reduce(還元)です

```
CuO + H2 → Cu + H2O
```

```
export default (state = 0, action) => {
  switch (action.type) {
    case 'INCREMENT':
      return state + 1
    case 'DECREMENT':
      return state - 1
    default:
      return state
  }
}
```
https://github.com/reduxjs/redux/blob/master/examples/counter/src/reducers/index.js#L1

#### store
state(データ)を保管し管理するもの。

```
const store = createStore(counter)
```
https://github.com/reduxjs/redux/blob/master/examples/counter/src/index.js#L7

#### action
actionとは 実態は[Javascriptのオブジェクト](https://developer.mozilla.org/ja/docs/Learn/JavaScript/Objects/Basics#Object_basics)。
actionは必ずtypeというメンバを必ず持ちます。

```
{type: 'DECREMENT'}
{type: 'INCREMENT'}
```
https://github.com/reduxjs/redux/blob/master/examples/counter/src/index.js#L13


#### dispatch
dispatchがreducerを呼び出して、よびだされたreducerにより値が操作されます。

```
onIncrement={() => store.dispatch({ type: 'INCREMENT' })}
onDecrement={() => store.dispatch({ type: 'DECREMENT' })}
```

## まとめ
Reducer、action、 storeなど複数の新しい概念が登場するためはじめは理解するのが簡単ではないと思いますが、繰り返しコードを読んだり実際に書いたりしてならしていきましょう。

## 参考
https://redux.js.org/
https://github.com/reduxjs/redux/tree/master/examples/counter
変数名の付け方 違和感7選

#はじめに
仕事柄、他人の書いたソース（主に発注先から引き取ったソース）を読む機会が多々あるが、その中でも読みづらさの原因の一つである「変数名の付け方」について、違和感を感じる頻度の高かったものをリストアップしてみた。

もちろん自分の書いたソースについても、あとから自分が見ずらくならないよう、自分自身も気を付けたいと思う。

以下、パターンを列挙する。

# 1. やたら省略されている
× res -> 〇result
△ prop -> 〇property
× pat -> 〇pattern
× enz -> 〇enzyme
× idx -> 〇index (2019/7/30追加)
× tbl -> 〇table(2019/8/24追加)

昔のマシンリソースが限られていた時代ならいざ知らず、現在では、可読性が大幅に下がるため、省略するメリットはほとんどない。
"prop"は、そこまで違和感はないが、一貫性という観点から"property"とした方が、より「違和感」を感じない。
"enz" にいたっては、めったに出くわさないような（おそらく）重要な単語を省略されても...と思う。

# 2. 微妙な綴りミス
× propaty -> 〇property
× canceld -> 〇canceled
× spacified -> 〇specified

"propaty" は最初から違和感を感じていたものの、あまり見かけるミスでもないため、綴りが間違えていることに気が付くのに時間がかかり、気づいた時には胸のつかえが取れすっきりした。"canceld"も、過去形にしたいのはわかるが、正しく書いてほしい。
最近の開発ツールは綴りミスも指摘してくれるものが多いため、それらを活用すればよい。

# 3. 具体性がなく目的が分かりづらい
× count -> 〇progressCount
× max -> 〇progressCountMax
等

小さなループや関数の中等、スコープが狭い場合はありだと思うが、大きなクラスのインスタンス変数等で使うのであれば、もう少し具体的に書かないと、当該箇所を読んでいるときに「何の変数だっけ」となってしまう。

これはプリミティブ型だけではなく、クラス型変数にもいえる。
例えばCalculationResult クラスのクラス型変数の名前としては、

× result -> 〇calculationResult

とのように具体的にすべきである。前者では、何のresultか即座にイメージできない。

# 4. 意味が逆
isValidというboolean型の変数名を付けたはいいが、妥当でない場合に"true"、妥当な場合に"false"が入るようになっていた。
論外としか言いようがない。こうなると確信犯的なものさえ感じるのだが...

```java
boolean isValid = false;

if(!inputFile.exists()){
    isValid = true;
}

if(isValid){
  printUsage();
}
```

2019/7/30 追記
後日、元々のソースを見る機会があり、isValidではなくexitFlag なる名前だった。推測するに、別の目的に利用しようとして名前を変えたが、true/falseの意味は変えなかった、というオチのようである。元の開発者と、改変者は別人である。ザ、よくあるアンチパターン。少年よ、視点を高く持とう。

# 5. 型がイメージできない
自分はデータがどう処理されていくかをイメージしながらソースを読むことが多いため、変数名から目的と型が一目で分かることが望ましいと考えている。データ処理でよく使うものは、プリミティブ型以外では、配列、List、Map等がある。Listには〇〇List(〇〇はListに格納されるるものを表す名前）、Mapには〇〇△△Map(〇〇はMapのキーを表す名前、△△はMapの値を表す名前）などつけられていると分かりやすく感じる。

Map型に対して、以下の例を挙げる。

× names  ->  〇 nameValidMap

後者は、少なくとも名前と何かの対応が格納されたマップということが分かるが、前者では全くわからない。リストと勘違いし、読み進むうちにあれ？っと思い、定義したた箇所に戻って確認というループを繰り返すことになる。

# 6. 単数、複数がイメージできない

前項と近いが、データの処理の流れを追うにあたり、その変数が"単数"のデータなのか"複数"のデータなのかの理解が重要である。
したがって単数データであれば単数形にし、配列やリストなど複数のデータを格納可能な変数は複数形にした方がとても分かりやすい。

# 7. 慣用的な名前をわざわざ変更している

Javaならおなじみのメイン関数である。こう書いてある。

```java
public static void main(String[] option){
   　
}
```

違和感を感じないだろうか。
そう、main関数の引数の名前は、"argv"と相場が決まっているにも関わらず、わざわざ別の名前に変更している。

main関数の引数には、プログラムの”引数”が格納されるのであり、"オプション"が格納されるわけではない（結果として格納されるとしても）

このoptionという変数はどこで定義されているんだろうと結構悩んでしまった。
慣用的に使う名前を変更するのであれば、よほどの積極的な理由が必要ではないだろうか。

# おわりに

今格闘してるソースは他にも「空行の入れ方」、「変数のスコープの取り方」、「コメントの書き方」、「処理の順番」などの違和感が大量にあるのだが、別の機会にまとめたい。
YouTubeのチャンネルを分析するサービスで利用したYouTube Data APIについて

新たにYouTubeのチャンネルを分析してチャンネルの登録者数、総再生回数を取得して表示する他、動画の再生数の多い順に表示するWebサービスを作ったので、その中で利用したYouTube Data APIの関数について解説します。

作ったサービスはこちらになります。
Bestub -ベスチューブ-
https://www.bestub.net/
![スクリーンショット 2019-07-22 20.01.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/390800/1e4542a5-db08-7eb0-4e0f-ce5925331a69.png)

YouTubeのAPIは複数用意されていて、訪問者が視聴した時間、視聴者の離脱率など主に自分の管理している動画に関する情報を取得するAPIであるYouTube Analytics API、YouTube Reporting APIと、認証なしでYouTube上の動画やチャンネルの情報を取得できるYouTube Data APIがあります。

BestubではYouTube Data APIを利用してチャンネル情報や動画情報を取得しています。

具体的には、まず、Google Developer Consoleでアカウント登録をしてプロジェクトを作成します。
その上でプロジェクトのYouTube Data APIを有効化し、認証キーを作成します。
認証キーを取得したら、Google API LibrariesをGitHubから取得してインストールします。
言語はそれぞれ適切なものを利用するものとしますが、BestubはPHPで書かれていますので、こちら(https://github.com/googleapis/google-api-php-client?hl=ja) からダウンロードしました。

Bestubではチャンネル情報を取得する時に以下の処理をしています。

1.チャンネルのIDからチャンネルの情報(紹介文、サムネイル、総再生回数など)を取得する。→Channelsのlistメソッドを呼ぶ(https://developers.google.com/youtube/v3/getting-started) 。

2.チャンネルに登録されている動画を検索し、チャンネルに投稿されている動画のIDを全て取得する。→Searchのlistメソッドを呼ぶ(https://developers.google.com/youtube/v3/guides/implementation/search) 。

3.取得した動画のID(複数を同時に取得可)から動画の情報(統計情報やサムネイルなど)を取得する。 →Videosのlistメソッドで取得(https://developers.google.com/youtube/v3/guides/implementation/videos) 。

この三つの過程によってYouTubeチャンネルの動画人気ランキングを作成します。一度にこれらの情報を取得できれば楽なのですが、チャンネルの情報に加えてチャンネルに投稿された動画の詳細情報についても掲載する必要があるので自分の知る限りですとこれらの処理が必要になってくると思われます。

YouTube APIは定められたクォータ(利用可能なAPIのコール制限)内でしか使用できないきまりになっています。このチャンネル情報の取得では必要となるクォータの量がかなり多いので、それをどうにか圧縮することが今後の課題です。

改善点が見つかったらまた追加いたします。
画像の読み込み時に「Thread 1: EXC_BAD_INSTRUCTION 」エラーが出る

UIImageを読み込む際、
Buildは成功するが、画面描画の際に、下記エラーが出ていた。

```
Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) image literal
```

UIImageViewで直接読み込もうとした際も下記エラーが出ていた。

```
Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
```

解決法：
Assetsフォルダ内のContents.jsonで
「properties」
を丸ごと削除したら描画した。
JavaとC++は学ぶな！！初心者が学ぶべき言語【さらに厳選】

# 注意事項

この記事には以下の要素が含まれます。苦手な方はご注意くださいね。

- Pythonへの熱いdisり
- C言語なんてなかった
- JDK問題について深く知らないので怖がっている
- いわゆる関数型言語に言及しないスタイル(`F#`とか`Scala`とか?)

# はじめに

[JavaとC++は学ぶな！！初心者が学ぶべき言語【厳選】](https://qiita.com/ClubNaggi/items/ffaa53928f67ed4a1df8)

という記事が出ているのですが、C++erとしては遺憾の意を示さざるを得ません。そのうえでこれからプログラミングを始める人におすすめする言語を紹介します。え、C++？初心者にはおすすめできません。

# 初心者におすすめする言語が満たすべき要件

- 人口がそこそこいる
- Windowsでも容易に開発環境が構築できる
- 動作結果が目で見てわかる
- コンパイルしなくていい
- 言語規格が少なくとも5年以内に更新されている
- 言語規格が後方互換性を備えていること
- 日本語資料が豊富にあること
- 非力なPCでも開発できる

## 人口がそこそこいる

プログラミング言語を作っている人もたくさんいるので無限にプログラミング言語は存在し得るわけですが、さすがにある程度ユーザー数がいない言語を薦めるわけにはいきません。

## Windowsでも容易に開発環境が構築できる

例えばPythonはなぜかWindowsだと動かないという事態によく遭遇します(私だけ・・・？)。初心者にエラー文を読んで原因を切り分けさせるのは無理です。

他の言語でもWindowsで完璧に動くぜ！って言うのは以外と少ないです。Rubyはだいぶ頑張っていると思いますがそれでも特に音声やグラフィックが絡むと`cannot load such file`と言われがちです(なぜかmsys2 mingw64 rubyでruby2dが使えない、[チャット](https://gitter.im/ruby2d/ruby2d)で問い合わせ中)。

## 動作結果が目で見てわかる

初心者はコンソールなんてまともに扱えませんし、"Hello world!"っていう文字を見せられても感動できません。

なんか図形が動くとかそういう視覚に容易に訴えられるのが望ましいです。

C++はGUIを作るのが極めて難しいのでこういうのは無理です(2D graphics標準化は頓挫したしな)。

言語標準ライブラリに2D描画ライブラリがあるか、十分メンテされてユーザーが居る2Dライブラリがあることが望ましいですね。

## コンパイルしなくていい

コンパイルはなれている人でもやっぱり面倒だと思います。もちろんいろいろ自動化することは出来ますが、自動化を組むのが今度は面倒です。

ちなみに面倒くさがれない人は多分プログラミングにあまり向いていません。

## 言語規格が少なくとも5年以内に更新されている

プログラミング言語も切磋琢磨し日々様々な改善がなされているべきです。ある程度保守的なC++ですら3年おきに更新しているんですから5年経っても更新されない言語は死んでます。え？C言語？2017年末にC11と全く同じ内容をリネームして出してたけどあれはないでしょ。

## 言語規格が後方互換性を備えていること

初心者が頑張ってググって出てきた情報どおりに書いて動かそうとしたら動かないとなるとモチベーションが吹き飛びます。初心者じゃなくても心が折れます。セキュリティ上の懸念などからdeprecatedになる機能が出るのは仕方ないとしても、Pythonみたいに巨大なbreaking changeを噛ましてくる言語はおすすめできません。

## 日本語資料が豊富にあること

ただでさえわからないプログラミング言語を学ぶのに、自分の母国語じゃない資料で勉強するとか脳みそがパンクしてしまいます。

## 非力なPCでも開発できる

プログラミングするのに15万超えるようなPC買えと言われても多くの人は困ってしまいます。Unityとかは結構メモリー持っていくのでつらそうです。一般に出回っているPCはメモリーが4GBのものが多いです。

# おすすめしたい言語

これらを満たす言語を残念ながら私の狭い知識では一つしか上げることが出来ませんでした。

## `JavaScript`

ブラウザ上で動くのがやっぱり大きいです。Canvas APIを叩くことで図形が描画できます。実行環境をブラウザにすることで、ChromeかFirefoxを入れてもらえば(運が良ければすでに入っている)ほぼセットアップが終わります。
[そのままのJavaScriptを使ったブロックくずしゲーム - ゲーム開発 | MDN](https://developer.mozilla.org/ja/docs/Games/Workflows/2D_Breakout_game_pure_JavaScript)
というStep-by-StepでCanvas APIを使う資料がなんとMDNにありますし実に良いです。

言語の人口も計算不能なレベルで大きく、開発も盛んです。

# おすすめしたかった言語

## `Ruby`

Ruby自体はかなりいい言語で、日本語資料も開発者が日本人ですからたくさんあります。グラフィックではRuby2dが結構良さそうなライブラリなんですよね、動けば。うごけー。

# おすすめできない言語の例

## `C++`

C++erが言うんだから間違いない(確信)。Visual Studioはコンソールアプリケーションを作る分には手順を簡単にしてくれますが、外部ライブラリを使うには不向きです。外部ライブラリをまともに使うにはCMakeという別の言語の助けが必要になります。ものすごく難しいってわけではないですが、他の言語より難しいのは確かです。

C++自体もC++17以降を使う分には極端に難しいということはないと思うのですが(C++er基準)、何分古い情報が多いのとまともな入門書がないのが辛い気がします。

グラフィックライブラリ自体はopennframeworksとかDXライブラリとかがあります。

## `C#`

Unityはゲーム業界でもっとも使われているライブラリです。これはC#で書くことが出来ますが、Unityで使えるC#のバージョンがものすごく古いという問題がありました。ようやく新しいC#への追従の動きが一昨年くらいからあるわけですが果たしてC#の進化に追いつけるのか・・・？

C#自体はC#7.0とかC#8.0で書く分には悪くないと思いますが古い情報に出くわしやすい印象です。

## `Java`

広く使われている言語で進化を続けています。が！Oracle JDK vs OpenJDK問題を経て(Oracle) JDK8で止まる勢とOpenJDKに移る勢で分裂している気がします。おなじくJVMで動く言語`Scala`のドキュメントにはJDK8をいれろって書いてあります。C++erとしては言語そのものよりJVMレベルのゴタゴタが気になってしまいます。

ちなみにOpenJDKは自分でPATH通さないといけない問題はchocolatey使えやって思ってます。

2Dグラフィックは言語標準ライブラリにある気がします。
IBM Cloud の 仮想サーバー（RHEL v7.0） に Docker CEを インストールする

IBM Cloud  の 仮想サーバー（VSI）（OS RHEL v7.0）にdocker をインストールするコマンドをまとめました。

#0.前提事項
- Redhat EL 7.0-64 を前提に記載しています。
- SSHはMacのデフォルトのターミナルを使用しています。
- この記事ではRHELにDocker CEをインストールしていますが、Docker CEは RHELを正式にはサポートしていませんので、ご注意ください。
    - [対応プラットフォーム](http://docs.docker.jp/engine/installation/)より抜粋
    <img width="737" alt="DockerCE-Support-list.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/05f517f3-c99a-d97c-8d6d-b387ae29bb2f.png">



#1. IBM Cloud の 仮想サーバー（VSI）にSSHで接続する
IPアドレスとパスワードの確認方法は[こちら](https://qiita.com/Asuka_Saito/items/128bf1148f4d0e048724#1-2-ssh%E3%81%A7%E6%8E%A5%E7%B6%9A%E3%81%97%E3%81%BE%E3%81%99)をご覧ください。

#2. Dockerをインストールする
#####2-1.yum-utilsをインストールします。

```yum install -y yum-utils```

#####2-2.yumリポジトリを追加します。
```yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo```

#####2-3.subscription-managerを有効化します。
```subscription-manager repos --enable=rhel-7-server-extras-rpms```

#####2-4.Docker-ceをインストールをインストールします。
```yum install -y docker-ce```


#####2-5.Dockerを起動します。
```systemctl start docker```


#####2-5.バージョンを確認します。
```docker version```

```terminal
[root@xxxxxx ~]# systemctl start docker
[root@xxxxxx ~]# docker version
Client: Docker Engine - Community
 Version:           19.03.1
 API version:       1.40
 Go version:        go1.12.5
 Git commit:        74b1e89
 Built:             Thu Jul 25 21:21:07 2019
 OS/Arch:           linux/amd64
 Experimental:      false


Server: Docker Engine - Community
 Engine:
  Version:          19.03.1
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.5
  Git commit:       74b1e89
  Built:            Thu Jul 25 21:19:36 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
[root@xxxxxx ~]# 
```

以上、IBM Cloud の 仮想サーバー（RHEL v7.0） に Docker CEを インストールする方法でした。

:smiley_cat: :smiley_cat:
【TCP/IP用語集】ポートとは？【初心者向け】


TCP/IP用語の１つにポートというものがあります。

ポートを開くだのIPとの違いだの訳の分からない部分が沢山ある用語に感じるかも知れませんね。

さて今回は、ポートとは何か？初心者向けに解説していこうと思います。

#ポートってどういう意味？
ポートとはつまり「住所」の事。

IPアドレスという似た概念がありますが、あちらとの違いは、

***・どこのルーター(家・施設)に情報を届けるか？***
***・そのルーターに接続された”誰”に情報を届けるか？***
の、差になります。

##ポートに関する覚書「IPと何が違うの？」

宛名と宛先の差だと思えば大体合ってます。

実社会にあるもので例えると、手紙が近いです。
例えば、以下のような手紙の宛先&宛名をイメージしてみましょう。

「●●県〇〇市○○町○○番　鈴木太郎様」
「××県◆◆市▽▽町○○-○○番　山田一郎様」


***IPは住所。***
「●●県〇〇市○○町○○番」や「××県◆◆市▽▽町○○-○○番」の部分を指します。

***ポートは名前・宛名部分。***
「鈴木太郎」や「山田一郎」の部分を指します。


手紙に宛先と宛名があるように、IPにも「IP」(宛先)と「ポート」(宛名)があるという訳です。


#サーバー(サービスを提供する側)のポート事情

さて、何かのサービスを提供しようと思えばポートは常に開いていないといけないという事になります。
となれば、***ポート番号を固定化***していつでもだれでも入れるようにしないといけません。
なので、慣例として

***・「http通信」の場合なら80番***
***・「https通信」の場合なら、443番***
が、宛がわれます。


あなたが今、Qiitaに繋いでこの記事を見ているという事は、
***・Qiitaが443番のポートを開けている***
***・あなたが443番のポートに繋いでいる。***
という事です。

#クライアント(サービスを受ける側)のポート事情

サービスは発信する側があれば、受け取る側が存在しているものです。

受け取る側の方でのポート番号は***「OS側が決めた49152~65535番のうちいずれか」***となります。
なぜ"いずれか"で"●番"という形にならないか？と言えば、固定化するとセキュリティ上の問題になる可能性があるからです。

ポートは常に切り替わる事により、長く見ても数秒程度しか同じポートで繋ぎませんので、外部からの不正な侵入を防ぐ事が出来るという訳なのです。


#具体的なクライアントとサーバー側のポート動き

上記の説明をふまえ、下記にて実際にポートがどのように変遷するのか書いてみます。

例：Qiitaに繋ぐ時

１、クライアント側「51234番ポート」を開く。
２、Qiitaに、443番ポートでアクセス。
３、Qiitaに通信が届く。51234番に返信を返す。
４、クライアント側の画面にQiitaの投稿が映る。この時点で51234番を閉じる。
５、クライアント側で別ページをリクエスト、今度は「55555番ポート」を開く。
６、Qiitaに443番ポートでアクセス。(最初と同じで、サーバーサイドは常に443番を開ける。)
７、Qiitaに通信が届く。55555番に返信を返す。
８、クライアント側にQiitaの通信内容が届く「55555番ポート」が閉じる
MSYS2インストールメモ

####環境
Windows10

####ダウンロード、インストール
https://www.msys2.org/

####MSYS2が起動されますので、以下のコマンドを入力
pacman -Syuu pacman

####必要なパッケージのインストール
pacman -S git

####PATHの設定
MSYS2_PATH_TYPEにinherit
PATHにC:\msys64\usr\bin　※インストールした先を設定
RustでOption型のサイズを調べた

RustでOption型を入れる大きな配列を作ったときに、もしかしてメモリ倍つかってるんじゃと気になったので確認してみました。

# 環境
64bit Windows 10, rustc 1.34。

```
>rustup show
Default host: x86_64-pc-windows-msvc

installed toolchains
--------------------

stable-x86_64-pc-windows-msvc
nightly-x86_64-pc-windows-msvc (default)

active toolchain
----------------

nightly-x86_64-pc-windows-msvc (default)
rustc 1.34.0-nightly (aadbc459b 2019-02-23)
```

# Option型の大きさ
std::mem::sizeofを使うと型のサイズが求められます。i32、Option<i32>, i32×4の配列、Option<i32>×4の配列のサイズを調べました。
  
```rust
use std::mem;

type Array4 = [i32; 4];
type OArray4 = [Option<i32>; 4];

fn main() {

    println!("size of i32 = {}", mem::size_of::<i32>());
    println!("size of Option<i32> = {}", mem::size_of::<Option<i32>>());
    println!("size of [i32: 4] = {}", mem::size_of::<Array4>());
    println!("size of [Option<i32>: 4] = {}", mem::size_of::<OArray4>());
}

```
 
実行結果を確認すると、やっぱり容量倍とってますね。

```
size of i32 = 4
size of Option<i32> = 8
size of [i32: 4] = 16
size of [Option<i32>: 4] = 32
```
  
気になったのでi64でも調査。

```
size of [i64: 4] = 32
size of [Option<i64>: 4] = 64
```
Noneかどうかで4バイト取るのでは無く、単純に倍の容量を確保するようです。
  
# バイト列の確認
メモリ上の並びも確認しました。
  
```rust
    let arr1 :[i32; 4] = [1, 2, 3, 4];
    let arr2 :[Option<i32>; 4] = [Some(1), Some(2), None, Some(3)];

    println!("arr1 = {:?}", arr1);
    let view = &arr1 as *const _ as *const u8;
    for i in 0 .. mem::size_of::<Array4>() as isize {
        print!("{:02x} ", unsafe {*view.offset(i)});
    }
    println!("");

    println!("arr2 = {:?}", arr2);
    let view = &arr2 as *const _ as *const u8;
    for i in 0 .. mem::size_of::<OArray4>() as isize {
        print!("{:02x} ", unsafe {*view.offset(i)});
    }
    println!("");

```
  
実行結果です。

```
arr1 = [1, 2, 3, 4]
01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00
arr2 = [Some(1), Some(2), None, Some(3)]
01 00 00 00 01 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 03 00 00 00
```
配列の容量を倍取ってNoneかどうかで0と1を入れています。
  
メモリの厳しい環境でOption型を使うときは注意しようと思いました。
  
いかがでしょうか。
【個人メモ】開発でよく使うWebサービスまとめ

ブックマークだとどこでも見れないのと、使いたいときに探すのが大変なので…
開発でよく使うWebサービスをメモ。

---

# データ

## 整形

### JSON

#### JSON Pretty Linter
https://lab.syncer.jp/Tool/JSON-Viewer/

#### JSONきれい ～JSON整形ツール～
https://tools.m-bsys.com/development_tooles/json-beautifier.php

### HTML

#### ＨＴＭＬ整形ツール（プチ・デバッグ機能付き）
http://u670.com/pikamap/htmlseikei.php

## 形式変換

#### Transform
https://transform.tools/

#### オンラインBase64のエンコーダ - Convert String
http://www.convertstring.com/ja/EncodeDecode/Base64Encode

#### Base64 URL
http://www.base64url.com/

#### URLエンコード・デコード
https://tech-unlimited.com/urlencode.html

#### JSON Web Tokens - jwt.io
https://jwt.io/

#### バイト変換 ビット、キロ、メガ、ギガ、テラ計算
https://byte.yonelabo.com/

#### ハッシュジェネレータ
https://www.milk-island.net/javascript/hashgenerator/readme.html
# プログラミング

## 実行環境

### 全般

#### paiza.io
https://paiza.io/ja

### Java

#### Dokojava
http://dokojava.jp/pc/index.html

### Brainfuck 

#### Brainfuck Online Simulator
https://arkark.github.io/brainfuck-online-simulator/

## 正規表現

#### 正規表現チェッカー PHP: preg_match() / JavaScript: match()
http://okumocchi.jp/php/re.php

#### Regexper
https://regexper.com/

## 命名

#### codic: プログラマーのためのネーミング辞書
https://codic.jp/

## データベース

### SQL

#### dokoQL 学習用オンラインSQL実行環境
https://dokoql.com/

### Oracle

#### Oracle Live SQL
https://livesql.oracle.com/

# エディター

## バイナリエディタ

#### HexEd.it
https://hexed.it/

## Markdown

#### Dillinger
https://dillinger.io/

## Swagger

#### Swagger Editor
https://editor.swagger.io/

# ネットワーク

## IPアドレス

#### IP確認
http://www.cman.jp/network/support/go_access.cgi?ac=on

## DNS

#### nslookup(dig)テスト【DNSサーバ接続確認】
https://www.cman.jp/network/support/nslookup.html

#### WHOIS検索
https://tech-unlimited.com/whois.html

# 画像

## 加工

### 透過・リサイズ

#### 画像や写真のサイズを変更（拡大・縮小・リサイズ）する : オンラインイメージエディタ
https://www.peko-step.com/tool/resize.html

### favicon

#### ファビコン favicon.icoを作ろう!
https://ao-system.net/favicon/

## 素材

#### いらすとや
https://www.irasutoya.com/

#### いらすとや検索
https://irasutoya-sear.ch/search

## チェッカー

### Twitter cards

#### Card validator
https://cards-dev.twitter.com/validator

### OGP（Open Graph Protocol）

#### シェアデバッガー
https://developers.facebook.com/tools/debug/sharing/

---

## 追記
[desktop.com](https://desktop.com/)がそのものズバリなサービスだったのでこっちに移行
<<メソッド   配列オブジェクトの 要素追加 について

生成した配列オブジェクトに新しい要素を追加するときは `<<` メソッドを使って、追加ができる

配列オブジェクト << 追加する要素

```rb
  food_case = ["穀物", "野菜", "肉"]
  food_case << "果物"
  puts food_case
```

`<<` メソッドで追加すると配列の一番最後にその要素が追加される
Goで並行処理練習(Goroutine,Channel)

# Golangによる並行処理
最近Golangを使って過去に書いたプログラムを書き直して勉強している。CライクでありCのめんどくさい記述が省けるとこに魅力を感じている。Golangは並行処理の記述が書きやすいらしい。では、手を出してみよう。ちなみに私は先輩にコードが汚い、センスがないと言われているので、見にくいかもです。これでも頑張ってます。
# 定積分の台形法による近似
今回Goroutineの練習に用いた題材は「定積分を台形法を用いて近似する」というもの。
アルゴリズムについては、ググってもらえばたくさん出てくる。いたってシンプルかつ簡単というのがGoroutine入門に向いているのではないか？的なノリで採択。

そして今回用いた数式はこちら。

```math
\int_{0}^{1}\frac{4}{1+x^2}dx = \pi
```

計算の方針として、積分区間を任意の幅で分割し台形の計算を並行処理する。
日本語が下手くそすぎる故、コードをみてもらった方が早いです。

```go
package main

import (
	"fmt"
	"sync"
)

const (
	p_num = 15   //区切りはば
	low   = 0.0  //積分区間
	high  = 1.0
)

func main() {
	ch := make(chan float32)
	var dx float32
	var x, sum float32
	var wg sync.WaitGroup
	point := make([]float32, p_num)
	dx = (high - low) / p_num
    x = low
	for i := 0; i < p_num; i++ {  //区切った時のXの値を記憶
		point[i] = x
		x += dx
	}

  for i := 0; i < p_num; i++ {
    wg.Add(1)
    go calculate(ch, i, point[i], dx, &wg)
    //go func(i int){
    //  wg.Add(1)
    //  fmt.Println(i)
    //  x := point[i]
    //  gx := 4 / (1.0 + x*x)
    //  hx := 4 / (1.0 + (x+dx)*(x+dx))
    //  ch <- (gx + hx) * dx / 2
    //  wg.Done()
    //}(i)
  }

  go func(){
    wg.Wait()
    close(ch)
  }()

  for v := range ch {
    sum += v
	}
	fmt.Println(sum)
}

func calculate(ch chan float32, i int, x, dx float32, wg *sync.WaitGroup) {
	gx := 4 / (1.0 + x*x)
	hx := 4 / (1.0 + (x+dx)*(x+dx))
	ch <- (gx + hx) * dx / 2
	wg.Done()
}
```

今回はmain関数の外に別でcalculate関数を用意しているが、コメントアウト部分のように、mainの中に並行処理部分を記述しても良い。しかし、注意する点として、変数iをgoroutineに参照させるために

```go
go func(i int){
// do something
}(i)
```
と書く必要がある。
仮に書かなかったら、どうなるかをわかりやすい例で書くと

```go
package main

import (
  "fmt"
  "time"
)


func main() {
  for i := 0; i < 10; i++ {
    go func(){
      fmt.Println(i)
    }()
  }
  time.Sleep(time.Second*5) //goroutineが始まる前にmainが終了するのを防ぐため
                            //WaitGroupeを用いるのがオススメ
}

/**********************
10
8
10
10
10
10
10
10
10
10
**********************/
```
うまく変数iの値が参照されない。iを参照するように変更すると

```go
package main

import (
  "fmt"
  "time"
)


func main() {
  for i := 0; i < 10; i++ {
    go func(i int){
      fmt.Println(i)
    }(i)
  }
  time.Sleep(time.Second*5) //goroutineが始まる前にmainが終了するのを防ぐため
                            //WaitGroupeを用いるのがオススメ
}

/**********************
1
0
7
6
8
9
3
5
4
2
**********************/
```

以上
# はまったポイント
今回の練習ではまったポイントと言えば、WaitGroupeを用いて同期を取っているのだが、
全てのGoroutineがdeadlockしたよってpanicメッセージが飛んでくることがあった。これは、Wait()
もGoroutine化してあげることで解決。

```go
go func(){
  wg.Wait()
  close(ch)
}()
```

全てのGoroutineが完了したらデータ受け渡し用のchannelをcloseしてあげることで、

```go
  for v := range ch {
    sum += v
    }
```
を用いてchannelの中の値をエラーなくrangeで参照することができる。
closeせずにchannelから値を参照しようとすると、エラーが発生する。これは少し手間取った。
以上
# おわりに
次は、チャットアプリをTCPを用いてごにょごにょしているから、完成したら投稿しようと思う。
macOSMojave  でのR のライブラリがインストールできない場合の対処方法

先日、R Studio でライブラリをインストールできず困惑したときのこと。

【環境】
　MacOS Mojave (10.14.5（18F132）)
  R Studio Version 1.1.456 
　
　※元々MacOS El Capitan(10.11)上にR Studio インストール済み。
　　最近　OSを　Mojave（10.14）にアップデート。
　
【現象】
　　R Studio 上で　install.pakage にて　複数のパッケージをインストール
　　したところ、全てのパッケージで次の現象が発生。
　　　（1）ダウンロード完了後、インストール作業を行おうとしてエラー発生。
　　　　　　Remove が走る。
　　　（2）インストール時のログを確認すると、
　　　　　　 ``fatal error: 'ctype.h' file not found``
　　　　　が表示されている。

【原因】
　　Mac OS を最新版のMojave にアップデートしたときにCのヘッダファイルが削除されたよう。
　　こちら↓の記事を参考に対応しました。
　　[Xcode10 の /usr/include インストール方法](https://qiita.com/yoya/items/630c991a98e4554e6e87)@yoyaさん

【対応方法】
　　 1) Finder で以下のディレクトリを開きます。
　　　　　/Library/Developer/CommandLineTools/Packages/

　　2) 上記ディレクトリにある次のパッケージをダブルクリックで展開・実行
　　　　　macOS_SDK_headers_for_macOS_10.14.pkg

　　3) R Studio上でパッケージインストール実施。完了。
Bootstrap の グリッドシステム で ある画面幅以上で col を 表示 にする

# 目的
Bootstrapのレスポンシブデザインに対応したグリットシステムの記載方法を応用して、ある画面幅以上になったら該当divを表示する方法をまとめる。
※グリットシステムの基本を知りたい方は[こちら](https://qiita.com/miriwo/items/e7487ea94d46d951cc91)を参考にしてください。
※レスポンシブデザインの基本を知りたい方は[こちら](https://qiita.com/miriwo/items/7a5f066a42f32467e894)を参考にしてください。

# 押さえるポイント
- colで指定するとき、該当要素を表示しないd-noneを指定して通常状態で要素の内容を表示しない状態を作る。
- 表示したい画面幅のタイミングと表示領域を指定して要素を表示させる。
- ある画面以上で要素を表示したいときの鉄則「常に非表示設定にしておいて、表示させておきたい画面幅を設定して表示させる」
- d-noneで非表示
- 非表示の要素をMedium(md)の画面幅から該当要素を12領域を使用して表示したいときのクラス名は下記となる  
class="d-none col-md-12"
- colやdを用いて表示領域を指定するときに画面幅を指定しないとすべての画面幅で指定された領域を使用して表示する設定となる。

# グリッドシステムの書き方の例
- 画面幅がMedium(md)以下の時には12分割された内の8領域を使用した「おはよう」のみ表示し、Medium(md)以上のときに、12分割された内の8領域と4領域を使用してテキストを表示する。
- 下記にHTMLファイルの内容を記載する。

``` html
<div class="container">
  <div class="row">
    <div class="col-md-8">
      <h1>おはよう</h1>
    </div>
    <div class="d-none col-md-4">
      <h1>こんにちは</h1>
    </div>
  </div>
</div>
```

↓プレビュー  
![colを表示する_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/d9793af2-0ce6-41d1-4538-6eef7528c88e.png)

![colを表示する_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/1f6ce21a-5a08-4857-0738-e305e199b618.png)



- 画面幅がLarge(lg)以下のときには何も表示せず、Large(lg)以上のときに12分割された内の1領域と1領域と10領域を使用してテキストを表示する。
- 下記にHTMLファイルの内容を記載する

``` html
<div class="container">
  <div class="row">
    <div class="d-none col-lg-1">
      <h1>おはよう</h1>
    </div>
    <div class="d-none col-lg-1">
      <h1>こんにちは</h1>
    </div>
    <div class="d-none col-lg-10">
      <h1>こんばんは</h1>
    </div>
  </div>
</div>
```

↓プレビュー
![colを表示する_3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/fe21686b-4a20-b252-fb7f-a2e1099edfa2.png)

![colを表示する_4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/8fc41c93-b877-1c4b-8e2e-1373469fb2b6.png)
EditTextのbackgroundの色を変える時につまづいたこと

はじめての投稿です！
分かりづらい、書いてる内容が間違ってる、こうした方がいいよなどありましたら
ぜひコメント欄までお願いします！  
  
今回はandroidのEditTextのbackgroundの色を変えたいときにハマった話です。  


みなさんご存知のEditText。文字が入力できるやつですね。
[通常のEditText]
![edit_text_qiita1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456836/7104c27f-cddf-d5ad-7e7e-f9054b2cdb43.png)
上の画像は高さをwrap_contentで指定してあります。  
  
でもこれより高さを小さくしたい時ありますよね。
高さを小さくするとこんな感じの見た目になります。  
[layout_heightをwrap_contentよりも小さくしたEditText]
![edit_text_qiita1のコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456836/4ab56692-b2e9-e29e-602d-7d3adf590a8d.png)
あれなんかNameが消えましたね。。  


でもこれbackgroundを指定すると見えるようになるんです。
[android:background="@color/color"を追加]
![edit_text_qiita_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456836/48186b40-a176-85d2-b40e-7d38b178bbef.png)
おおー見えた。
もちろん透明が良ければ*@color/color*のところを*@android:color/transparent*に変えてあげればオッケーです。  

ここまでは僕も知っていました。ですが今回コード上からbackgroundの色をセットしたら、予想と違う結果になったのです！  

先ほどのxmlでbackgroundの指定を消して代わりに以下のコードを追加しました。
`editText2.setBackgroundColor(resources.getColor(R.color.color))`

そしてこれの結果がこちら。
![edit_text_qiita_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/456836/c99aa21a-243d-9374-4c9d-39e0bd27c8c6.png)
Nameという文字が表示されていない！！
(すいません。キーボード開いている状態でキャプチャをとったので下に何か写り込んでるのは気にしないでください)

ただよく見ると赤い線がありますよね。つまり入力カーソルはこの位置にあるのです。でも文字が見えていない。。  

試行錯誤した結果、最終的にはxmlの方で
`android:padding="0dp"`
を指定することによって直りました！



ここからは推測なのですが、xmlで*android:background*を指定した時はただ色や画像をセットするだけではなく
paddingなど他のプロパティも変更されてるのかなーと思いました。
詳しいことがわかる方がいらっしゃいましたらぜひ教えてください:bow_tone2: 

setBackgroundしてるのに！コードは間違ってないはずなのに！と1時間くらいハマったので
もし同じような方がいらっしゃったらぜひ参考にしていただけたら嬉しいです！！  

以上、EditTextのbackgroundの話でした。  

我ながら読みづらい文になったな。。。
androidの勉強とともに文章力も鍛えていこう。。
WebAPIのプラクティス本「Web API ~The Good Parts~」を読んで参考になったことまとめ

## はじめに
　オライリー社出版の[「Web API ~The Good Parts~」](https://www.amazon.co.jp/Web-API-Parts-%E6%B0%B4%E9%87%8E-%E8%B2%B4%E6%98%8E/dp/4873116864/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=Web+api&qid=1564188061&s=gateway&sr=8-1)というWeb APIの運用のプラクティス本があり、個人的に参考になった点のまとめです。基本的には引用になります。Web APIについて漠然と使っていたが、いざ作るとなると考え方が分からなくなり悩んでいたが、この本を読むことでだいぶ考え方がわかるようになってきました。内容もTwitterやFacebookがどうAPIを提供しているのか等具体例を交えて説明しているのでわかりやすくかなりの良書です。:)
　対象読者は以下です。

- Web APIの初学者
- Webについての基本的な知識を持つ方

## Web APIの運用方針
### 基本的な考え方
　Web APIを運用していく上では、基本的に以下の考えで行うと良いです。そもそもWeb APIとは、社内のみの運用を除いては一般の知らないユーザに使ってもらうことで、より良いサービスを展開してもらって、さらにAPIを公開しているサーバ。

- 仕様が決まっているものに関しては仕様に従う
- 仕様が存在していないものに関してはデファクトスタンダードに従う
    - デファクトスタンダードに従うことによって、他人がAPIをみたときの理解が容易になるため、開発効率の向上や開発者のストレス軽減につながります。できるだけオリジナルの要素を排除して一般的に使われているような、公開の仕方をマネすると良いと思います。

### エンドポイント（URI）の設計

> **覚えやすく、どんな機能を持つURIなのかがひと目で分かる**

具体的には以下のような方針です。

- 短く入力しやすいURI
- 人間が呼んで理解できるURI
    - `api.example.com/sv/u`のようなURIだとユーザは"sv"が本当にserviceなのか"u"がuserなのかを判断できない。 
- 大文字小文字が混在していないURI
    - 基本的にはすべて小文字でスネークケースを使うのがデファクトスタンダードです。
- 改造しやすいURI
    - ドキュメントをみなくてもエンドポイントのみで内容を推測できるようにすることが大切。
- サーバ側のアーキテクチャが反映されていない
    - `api.example.com/cgi-bin/get_user.php?user=100`のようなエンドポイントに関しては、ユーザにとっては「CGIを使っている」とか「PHPで実装されている」とかの情報は不要で、わざわざエンドポイントで示すことは、ユーザの開発ストレスにつながります。
- ルールが統一されている

### バージョン運用について
- エンドポイントにバージョンを含める
　以下のようにエンドポイントにバージョンを含めることで、APIを改善（JSON構造の変更etc.）し互換性を持たないことを明示することができる。
    - ```api.example.com\v1
```


- 旧バージョンのサポート期間を公示する
　v2を出してすぐにv1をサポートを完全終了すると、クライアントアプリケーションを作ってくれているユーザが移行に時間を設けることが難しく、利用してくれるユーザが離れてしまう可能性が高くなります。公式サイト等に公示しておき、最低でも1~2年間は旧バージョンをサポートしてあげることが大事です。

### HTTPメソッドを正しく使う

　HTTPには以下のようなメソッドが一般的に使われており、これらを正しい用法で使うことが大切です。

| メソッド名       |説明  |
|:-----------------|:------------------|
| GET             | リソースの取得 |
| POST           | リソースの新規登録 |
| PUT             |既存リソースの更新 |
| DELETE               |リソースの削除|
| PATCH             |リソースの一部変更|
| HEAD             |リソースのメタ情報の取得|

 例えば、「プロフィールの説明文を更新したい」という場合にはPOSTではなくPATCHを使ったりといった具合です。こうすることによって実装者がそのAPIへアクセスすることに意味を理解しやすくなります。ただ、HTMLのFormの場合はPOSTとGETのみしかサポートされていない場合があります。その時は、X-HTTP-Method-Overrideなどリクエストヘッダに利用したいメソッドを追記しておく方法とかがあります。


### エラーの返し方

- 適切なエラーコードを返す
    - エラーコードにも色々あるが、まずは以下を覚えておくと良い。
 
|ステータスコード       |意味  |
|:-----------------|:------------------|
| 100番台             |情報 |
| 200番台           | 成功 |
| 300番台             |リダイレクト |
| 400番台               |クライアント側のエラー|
| 500番台             |サーバ側のエラー|

- エラーの詳細を返す

　例えば"404 Not Found"がステータスコードが返ってきてもユーザはエンドポイントがそもそも間違っているのか、クエリの引数が間違っているのかが、一見分かりません。そのような場合に、レスポンスボディ等にエラーの詳細を返すことによって理解しやすくなります。

```json
{
    "error": {
        "message": "Not found user id included in the query",
        "info": "http://docs.example.com/api/v1"
    }
}
```

## おわりに
　本には今回紹介した以外にもセキュリティはどうするか、最近のWeb APIの動向など多くの情報が盛り込まれていますので、気になった方はぜひ呼んでみてください！
IntelliJ IDEA 2019.2の新機能プロファイラーを試してみた

[IntelliJ IDEA 2019\.2の新機能 \| 株式会社サムライズム](https://samuraism.com/jetbrains/intellij-idea/intellij-idea2019-2)

今回の新機能はチョー豪華！

ぼくは、パフォーマンス改善をよくやるんですけど、IntelliJ IDEAにもプロファイルングツールがつくようになったので、使ってみました。
便利そうだったので、これからのメインウェポンはこれになりそうです。

前提: Ubuntu19.04, Scala(Javaでもいけました)

# 設定方法

↓のように+を押して一通りのプロファイラーを追加してOKを押す
![Screenshot from 2019-07-27 10-01-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196806/739ba6f9-eef7-e77d-f04a-200183c8dfd1.png)

そうすると実行するときのメニューになんか増えてるんで、とりあえず`Run 'なんとか' with 'Profiler'`を押してみる
![Screenshot from 2019-07-27 10-34-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196806/f11bc46c-9776-b2ae-4824-ce666954e528.png)

↓のモーダルが出てくるので、
![Screenshot from 2019-07-27 10-00-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196806/f5afef22-a411-3527-77f1-6c7309c59f56.png)
指示の通りに、

```
sudo sh -c 'echo 1 > /proc/sys/kernel/perf_event_paranoid'
sudo sh -c 'echo 0 > /proc/sys/kernel/kptr_restrict'
```
を実行。
調べてみたら、この設定は、カーネルのパフォーマンスに関する情報の収集や解析に必要な設定らしいです。
Linux以外だと要らないか別の設定方法が出てくるかも？

↓関連記事
[第52章 コンパイラーとツール \- Red Hat Customer Portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/7.3_release_notes/known_issues_compiler_and_tools)
[Linux\* カーネルの解析を有効にする](https://www.isus.jp/file/VTuneHelp2018/GUID-D7D2B2E3-9182-4646-BC25-A66B41EF70AE.html)

# プロファイルしてみた
## Frame Graphタブ
うーんあまり使わないかも？
![Screenshot from 2019-07-27 10-08-52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196806/3484fee3-612b-5dfb-2275-c8edefcfc44e.png)

## Call Tree
ツリーになってそれぞれ%で出るようになった。
VisualVMでプロファイルするとこんな感じのが出ますよね。
%の右の青い数字は折り畳まれてる件数みたいです。
![Screenshot from 2019-07-27 10-11-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196806/bfe5bc1d-9155-26ed-0ed8-1664b2050962.png)
## Method List
サンプリングされた順でソートされるようになった。
選択したメソッドからBack TraceタブとMerged Calleesタブが選べる。
Back Traceタブはどこから呼ばれたのかをたどることができる。
![Screenshot from 2019-07-27 10-52-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196806/4112f913-d855-f7ac-23d9-239c8e888259.png)

Merged Calleesタブは、そのメソッド内で呼ばれたメソッドっぽい。
![Screenshot from 2019-07-27 10-53-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196806/28948085-8fee-f3a9-3912-977e27d83bbc.png)

# Java Flight Recorderも使ってみた
GCのログやら、弱参照の個数やらなんか色々出ますね。
![Screenshot from 2019-07-27 10-25-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/196806/2b447e3f-de96-63c7-f332-4378ff014e0c.png)
不完全性定理を勉強したら数学の景色が変わった

# 概略
不完全性定理を勉強したら 数学への見え方が変わった、という話です。

菊池『不完全性定理』をベースにいくつかの教科書を読みました。この教科書は哲学的な考察や 俯瞰的な観点での議論が多く ウェットなのですがその分納得がしやすかったです。

# 知見1: 関数の見え方が変わった
数学やプログラミングをしていると、様々な場面で 関数 やそれに類似した概念に遭遇します。それらは、多くの場合互いに非干渉なので、あまり困ったことはないのですが、どうもモヤモヤしたものが残っていました。具体的には以下に挙げるような諸概念です

- 関数（プログラミング/計算論の世界）
- 計算・プログラム（プログラミング/計算論の世界）
- アルゴリズム（プログラミング/計算論の世界）
- 算術・自然数論（数理論理学）
- 演算・作用・関数（代数学）
- 写像・関数（集合論）
- グラフ（集合論の写像の表現としてのグラフ）

不完全性定理を学ぶと、上記の概念がほぼ全部登場し、それぞれの定義に従って明確に連携しあい定理を導きます。計算可能であるとは？表現可能であるとは？定義可能であるとは？公理化可能であるとは？理論の無矛盾性を理論の中で展開するには？といったトピックの中で、上記に挙げた諸概念を初めて理解したと思えるようになりました。

# 知見2. 数 の見え方が変わった

[菊池]では、自然数に関連する概念を少なくとも3つに分類し論じています。それらは等しいかもしれないですし、異なるかもしれません。これらの同一性は 哲学（マイルドに言えば数学観）によって答えが異なりえます:

- $\mathcal N$: 数学をしていない時 人が了解している素朴な数の概念
- $\mathbb N$ : ペアノ・デデキントらによって議論・発明された数学的構造
- $\omega$: 集合論の中で展開された $\mathbb N$ を表現すると解釈可能な、一意に存在すると証明された対象につけられた名前。

これらに対する議論や、算術での対象 $U$ と集合論での対象 $V$ の間に $U⊂V$なる関係があるのか？という並行した議論、および（可算・非可算の）PAの超準モデルの存在などが絡み合って「数とは何か」に関して（確定的な理解に至らなくても）理解を深めることができました。

# 知見3. 形式化の強力さを知った
論理学の勉強ですでに、形式化することの重要性は理解しているつもりでしたが、不完全性定理においてその思いがさらに強くなりました。桁違いな発想の自由度を手に入れたという実感があります。「証明できる」とか「無矛盾である」などが形式化されるのはもちろん、それらに関する言明（典型的には不完全性定理自身）すら形式化することで、メタのメタの議論も容易になり、人間の思考を形式化する強力な道具になったと思います。この辺り様相論理的なアプローチが応用としてあるようで興味がわいてきました。参考: [証明可能性論理 - Wikipedia](https://ja.wikipedia.org/wiki/%E8%A8%BC%E6%98%8E%E5%8F%AF%E8%83%BD%E6%80%A7%E8%AB%96%E7%90%86)

# まとめ
不完全性定理は、理解するまでにとても色々な知識と忍耐が必要なのですが、それを上回る利益をもたらしてくれました。これからも少しずつ詳細を勉強していこうと思います。
plunkerでvue その7

#概要

plunkerでvueやってみた。
波形表示、やってみた。

#参考にしたページ

https://jsfiddle.net/bc_rikko/1b7vhkqp/

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/f1b6160b-8e73-4d30-e965-5765c3dfb5d1.png)


#成果物

https://embed.plnkr.co/oEPnmzyn8L3PU9e8ODvR/

以上。
JSON-SchemaからTypeScriptの型定義を生成する

REST APIの通信も型で守りたい！となった時に便利なライブラリがあったので紹介します。
[json-schema-to-type](https://github.com/bcherny/json-schema-to-typescript#readme)を使えばjson-schemaからTypeScriptの型定義を自動で生成することができます。

# [json-schema-to-type](https://github.com/bcherny/json-schema-to-typescript#readme)

## 使い方
コマンドラインの使い方です。
Qiita API v2のjson-schemaで試します。

これだけ。

```
curl https://qiita.com/api/v2/schema | npx json2ts > qiita-types.d.ts
```

一瞬で型定義が生成できます。

```qiita-type.d.ts
/* tslint:disable */
/**
 * This file was automatically generated by json-schema-to-typescript.
 * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
 * and run json-schema-to-typescript to regenerate this file.
 */

/**
 * In this schema file, we represents the public interface of Qiita API v2 in JSON Hyper Schema draft v4.
 */
export interface QiitaAPIV2JSONSchema {
  access_token: AccessToken;
  authenticated_user: AuthenticatedUser;
  comment: Comment;
  expanded_template: ExpandedTemplate;
  group: Group;
  item: Item;
  like: Like;
  project: Project;
  reaction: EmojiReaction;
  tag: Tag;
  tagging: Tagging;
  team: Team;
  team_invitation: InvitedMember;
  template: Template;
  user: User4;
  [k: string]: any;
}

...
```
ZABBIXとは

#Zabbix(ザビックス)とは
Zabbixについての忘備録です。むずかしいことは苦手なのでざっくり書きます。

[参考]
・[Zabbixとは(Zabbix公式サイト)](https://www.zabbix.com/jp/features)
・[Zabbixは「自動化」で運用管理者の負担をどう減らしてきたのか](https://www.atmarkit.co.jp/ait/articles/1812/11/news011.html)
・[zabbixとは](https://yacchi1123.hatenablog.com/entry/2018/11/08/215508)



#1.Zabbixとは
・サーバー、ネットワーク、アプリケーションを監視するためのソフトウェア。
・無料のオープンソースで、複数のアプリケーションを監視できる統合監視システム。

-> WEB管理画面で監視設定がかんたんにできる。日本語設定もあるよ。
　オリジナルでカスタマイズ可能。


##2.Zabbixの構成
Zabbixは、Zabbixサーバ＋Zabbixエージェントで構成されています。

監視用のサーバにZabbixサーバ(①)をインストール、
実際の監視対象にZabbixエージェント(②)をインストールして利用する。(下図)

zabbixエージェント(②)をインストールすることで、
Zabbixサーバ(①)とZabbixエージェント(②)が疎通できるようになります。

![IMG_3946.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366833/6d3ea3e8-ec08-c91b-03c1-91cd06555c87.jpeg)


##3.代表的なZabbixでできること

(例)
ネットワークのトラフィック量が閾値を超えたら発報
CPUの負荷が閾値を超えたら発報
ディスクの残り容量が閾値を下回ったら発報
ディスクの残りinodeが閾値を下回ったら発報
メモリーのフリー容量が閾値を下回ったら発報
WEBページからのレスポンスに200 OKが返らなくなったら発報　など

・発報方法：メール、Slack通知など
・発報内容：カスタマイズ可能

##4.ZabbixのブラウザのUI
実際にdockerで仮想環境を作ってログインしてみました。
Zabbixは日本語設定もあって、慣れたら使いやすいと思います。
<img width="1279" alt="スクリーンショット 2019-07-15 2.29.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/366833/f966e155-aedc-1fa4-b501-e8e284bacefc.png">
Strong Paramertersについてまとめてみた

##はじめに
Railsで開発をする際に、セキュリティを高める方法のひとつとしてStrong Patamertersがあります。今回はStrong Patamertersの使い方について調べてみました。間違っている部分ありましたらご指摘いただければと思います。

##Strong Patamertersとは
モデルの便利な機能に、複数の属性を一括代入できる機能があります。例えば次のようなコードではUserオブジェクトを生成する際に、nameとemailという2つの属性値を一括で代入しています。

```ruby:Railsコンソール
> user = User.new(name: '田中太郎', email: 'taroutanaka@gmail.com')
```

もしこの機能がなければ、

```ruby:Railsコンソール
> user = User.new
> user.name = '田中太郎'
> user.email = 'taroutanaka@gmail.com'
```

と書く必要があるので少々面倒ですね。

またコントローラーで受け取ったパラメーターの一部を次のように直接モデルに渡して複数の属性を一括で取り出すこともできます。

```ruby:Railsコンソール
> user = User.new(params[:user])
```

しかしここにセキュリティ上の危険が潜んでいます。パラメーターに意図せぬ属性が紛れ込んでいるときに、想定外の属性についても登録・更新が行えてしまう問題が生じます。

例えば、Userには有料ユーザーか無料ユーザーを判別するpremiumフラグを持っているとします。このような場合、有料ユーザーでなくてもサーバーに送るリクエスト・パラメーターを加工して、premiumフラグが無課金になるようなリクエストを送ることが技術的には可能です。

これを防ぐためにはパラメーターのどの属性を許可してどの属性を許可しないのかを制御する必要があります。この時に利用できるのがStrong Parametersという機能です。

```ruby:コントローラーファイル
user_params = if user.premium
  #specialは有料ユーザーのみ使える
  params.require(:user).permit(:name, :email, :special)
else
  params.require(:user).permit(:name, :email)

User.new(user_parmas)
```

これで許可しない属性情報を無視することができます。

##おわりに
Raislには様々なセキュリティを高める機能が用意されています。開発者側がセキュリティを高める方法を理解し、安心して使えるサービスを作る必要がると思います。今後も勉強を続けて行きたいと思います。