OmniAICreator/Qiita-1.07M huggingface dataset:
データで利用する性別の仕様（ISO 5218）

#はじめに
最近基本からDBの勉強を始めていて、その中で性別の規格が存在することを知ったので記録しておく。

#概要
ISO 5218とは、言語に依存しない1桁のコードによるヒトの性別の表記に関する国際規格。
国際標準化機構（ISO）のData Management and Interchange Technical Committee（データ管理と交換技術委員会）が、この国際規格の作成に携わり、1976年11月に勧告し、2004年7月に更新された。

#内訳
- 0 = not known（不明）
- 1 = male（男性）
- 2 = female（女性）
- 9 = not applicable（適用不能）

###項目名

- 「SEX」を利用する。
    - 生物学的性別を表記することが目的のため。

#日本工業規格は？
対応する日本工業規格として、JIS X0303（性別コード）が規定されていたが、廃止された。
ただし、ISO 5218に内容が包含されるため、廃止の影響は殆どない。JIS X0303における表記は以下のとおりである。

- 1 = male（男性）
- 2 = female（女性）

#所感
SDGsの促進で、世界的にLGBTが承認されつつあるのが影響しているのだろうか。
個人的にではあるが、単純な「男女」という切り分けから、より深い部分での人間の尊重を表現できるように仕様を変更していく、というのは良い流れだと思う。

#参考文献
ISO 5218
https://ja.wikipedia.org/wiki/ISO_5218
https://lab.syncer.jp/Document/ISO_5218/
https://www.iso.org/standard/36266.html
EclipseではYAMLファイルはFileで作成する

これまでにやったことがなくて戸惑った・・・いつか同じ過ちを繰り返すので記録しておく

## ことのほったんは、YAMLファイルの作成方法がわからなかった。
普通にファイルを作ろうと思って・・・

1. [Project Explorer] > `Ctrl + N`でダイアログ表示
1. 「yaml」を検索 > ない！
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/13ea6a5e-6da7-d318-d916-2212ebb2671c.png)

.propertiesファイル用にもプラグインをインストールしていたなぁ。

## プラグインをインストールする
- 環境
    - Windows10 Pro バージョン1909
    - Eclipse IDE for Enterprise Java Developers Version: 2020-09

1. [Help] > [Eclipse Marketplace..]でダイアログを表示
1. 「yaml」を検索 > [YEdit](https://marketplace.eclipse.org/content/yaml-editor)の[Install]ボタンでインストール![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/3a524943-0636-76f5-b5ad-58fbfc33ca4d.png)
1. メッセージに促されてEclipseを再起動
1. [Project Explorer] > `Ctrl + N`でダイアログ表示
1. 「yaml」を検索 > ない！

## YAMLファイルはFileで作成する
参考 : [Eclipseでymlファイルを作成するには](https://ja.narentranzed.org/894066-to-create-yml-file-in-HBFXPL)
YAMLファイルは、**File**で作るらしい・・・ぷっ馬鹿だな自分。

1. [Project Explorer] > `Ctrl + N`でダイアログ表示
1. [General] > [File] > [Next]ボタン
    - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/89e9227e-fabf-5944-e6f5-fa682f35a9f7.png)
1. ファイル名を拡張子`.yml`か`.yaml`にする > [Finish]ボタンで作成

# YEditはEclipseのバージョンによってはインストールできない
- 環境
    - Windows10 Pro バージョン1909
    - Eclipse IDE for Enterprise Java Developers Version: 2019-09 R (4.13.0)

1. EclipseでYAMLファイルを開こうとしたら
1. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/9f1f8534-95c9-b0bb-e0b8-69b114508bd0.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/f3c45d99-ad61-3e72-c53b-a58b3645729c.png)
2. じゃ、YEditをインストールしようと思って[Eclipse Marketplace]のダイアログで見たら[Install]ボタンがないので[Learn more]リンクで画面を開いて[Install]ボタンでインストール・・・できない
    1. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/0a090138-fe10-3fae-db21-ef14bb4588f0.png)
1. しょうがないので[Yaml Editor](https://marketplace.eclipse.org/content/yaml-editor)をインストールした
2. それでもYAMLファイルは開ける

ん？2020-09にインストールできたのになぜ？

> Additional Details
> Eclipse Versions: 
> 2018-09 (4.9), Photon (4.8), Oxygen (4.7), Neon (4.6), Mars (4.5), Luna (4.4), Kepler (4.3), Juno (4.2, 3.8), Previous to Juno (<=4.1)
> [YEdit | Eclipse Plugins, Bundles and Products - Eclipse Marketplace](https://marketplace.eclipse.org/content/yedit?mpc=true&mpc_state=)
failed to connect: ** (MyXQL.Error) (1044) (ER_DBACCESS_DENIED_ERROR) Access denied forでUserの権限に原因があった記録

# 前提

今回の事象は通常起こることは無いかと思います。:sweat:
下記の前提条件で、表題のエラーに遭遇しました。

1. docker-compose（Elixir+MySQL)を実装中に発生
1. その時コンテナを作ったり消したりを繰り返していた
  1. DBコンテナのボリュームは消していないこともあった
1. mysqlで初回実行するクエリもいじっていた。
  1. クエリは下記のような権限に関するものだった。

  ```mysql
  GRANT ALL PRIVILEGES ON *.* TO 'app'@'%' WITH GRANT OPTION;
  FLUSH PRIVILEGES;
  ```

結論、上述のトライアンドエラーの中で必要だったことは、

* コンテナを整えるときは、DBコンテナのキャッシュやボリュームをちゃんと消す

です。

このエッジケースにおいて何が原因だったのかを後述します。

# 事象

```zsh

app_1  | [error] MyXQL.Connection (#PID<0.315.0>) failed to connect: ** (MyXQL.Error) (1044) (ER_DBACCESS_DENIED_ERROR) Access denied for user 'service'@'%' to database 'service_dev'
```

```
mysql> select * from user_privileges;
+----------------+---------------+----------------+--------------+
| GRANTEE        | TABLE_CATALOG | PRIVILEGE_TYPE | IS_GRANTABLE |
+----------------+---------------+----------------+--------------+
| 'service'@'%' | def           | USAGE          | NO           |
+----------------+---------------+----------------+--------------+
1 row in set (0.00 sec)

```

`INFORMATION_SCHEMA USER_PRIVILEGES`テーブルを確認してみる。
https://dev.mysql.com/doc/refman/5.6/ja/information-schema-user-privileges-table.html

`PRIVILEGE_TYPE`:`USAGE`というのは権限が全く無い。
参考：MySQLの権限一覧
https://dev.mysql.com/doc/refman/5.6/ja/privileges-provided.html

`PRIVILEGE_TYPE`:`Create`であるべき。
【Swift】画面遷移について

# 遷移先の画面をstoryboard上で作る時の注意点
`viewController`を追加したら、この画面用のプログラムファイルが必要なので、①ファイルを用意して②遷移先の画面の`class`にファイル名を追加する
# ボタンをタップした場合の遷移
①遷移元の画面に`Button`を追加する
②`Button`からドラックアンドドロップして遷移先の画面に繋げる
③`Present Modally`を選択
④矢印(segue)が出てくる

`modal`で画面遷移を実装した場合、デフォルトでは背景に遷移元の画面が残るようになっているので、これを映らないようにするには
①`segue`をクリック
②`presentation`を`Full Screen`に変更

`戻る`操作を実装するには
①遷移先の画面に`戻る`用の`Button`を設置
②`戻るButton`を押しながらプログラムにドラックアンドドロップし、`Action`を選択して名前をつける
③処理内容に

```swift
dismiss(animated: true, completion: nil)
```
を追加する。

# 任意のタイミングで画面遷移させる
例えば...
遷移元の画面にカウンターを実装し、カウント数が`10`になったら画面遷移させるという実装を行う場合...
(カウンターの数を表す変数を`count`とする)
①遷移元画面の`viewController`上部に表示されているバーの黄色く丸いボタンから、遷移先の画面にドラックアンドドロップし、`present Modally`を選択
②出現する`segue`をクリックし、`identifier`に適当な名前をつける
③カウンターを実装しているメソッド内の処理に、

```swift
if count == 10{
  performSegue(withIdentifier: "segueのidentifierに設定した名前", sender: nil)
// (中略)
}
```
# 値を渡しながら画面遷移を行う場合
↑の続き
①遷移先の画面に、遷移元の画面から受け取りたい値を格納するための変数を設置
`var count2 = 0`とします
②遷移元の画面に

```swift
override func prepare(for segue: UIStoryBoardSegue, sender: Any?) {
  if (segue.identifier == "segueのidentifierに設定した名前") {
    let nextVC(自由に名前つける) = segue.destination as! 遷移先の画面の名前
    nextVC.count2 = count
  }
}
```
を記述
何をやっているかざっくり言うと、
①遷移元の画面に遷移先の画面を変数として宣言する(`let~`の部分)
②遷移先の画面に作った、受け取る値を格納するための変数を呼び出し、渡したい値を代入する
これで、遷移先に値を渡すことができます。
HTMLの主な要素〜初心者だった自分に向けて〜　その②セクショニングと、主な区分化要素

#HTML・セクショニングの必要性・主な区分化要素
###はじめに
その①「[HTMLの主な要素〜初心者だった自分に向けて〜　その①メタデータ系](https://qiita.com/syun02051/items/013bb352bec614123b23)」はこちら
続いてセクショニングについてまとめていきます。

##なぜ、セクショニング（適切な要素によって区分）する必要があるか
HTMLにおいてテキストや画像を正確に区分化することは、読み手が内容を正しく理解するために必要不可欠です。
テキストなどを区分するだけであれば`<div>`要素一つで役割を果たすことができますが、それは正しい区分の仕方ではありません。<br>以下に、**適切なタグを使って区分すべき**理由を挙げます。
####理由① 他の端末やブラウザにWebサイトの構造を正確に伝えるため
####理由② 読み上げアプリや音声アシスタントなど、ユーザーに代わって文書を解釈する技術に構造的な意味を伝えるため
####理由③リンクやその他のナビゲーション構造は、ユーザーがサイトやページのコンテンツのどこにいるかを理解して移動するのに役立つ
<br>`<div>`要素は要素自体に意味を持たないため、`<div class="navigation">`のように記述しても内容の意味はブラウザなどに一切伝わりません。以前は区分化する役割を全て`<div>`が担ってましたが、HTML５から新しい意味づけする要素（navやsectionなど）が追加され、コンテンツの意味的な領域においてウェブサイトの区分化を進化・明確化することができるようになりました。結果として機械、人間の両方がそのWebサイトの構造を理解しやすくなり、扱いやすさが向上していきました。<br>ですから、HTMLを適切な要素によって区分することはWEBサイトを構築する上での必要不可欠ということができます。
<br>
ここからセクショニングに使用する要素を紹介していきます。
<br>
## header要素 `<header>`
導入コンテンツ、ナビゲーション群など、いわゆるヘッダー的な範囲を示すための要素です。<br>その`<header>`要素を含む最も近くの`<main>`要素またはセクション、もしくはページ全体のヘッダーになります。<br>見出し要素以外にもロゴや検索フォームなど入れることができますが、この要素内に`<main>`要素を入れることはできません。
## footer要素 `<footer>`
ページ下部でよく見る、いわゆるフッター的な部分の範囲を示すための要素です。<br>その`<footer>`要素を含む最も近い`<main>`要素またはセクション、もしくはページ全体のフッターとなります。<br>内容は一般的に著作者の名称やCopyright表記、関連ページへのリンクが含まれます。`<header>`と同じで、この要素内に`<main>`要素を入れることはできません。<br>多くの場合下部に配置されますが、必ずしもその必要があるわけではなく`<header>`と一緒に上部に配置することもできます。
##main要素 `<main>`
`<main>`要素は、そのページ内の主要な内容を示す要素です。<br>主要な内容とは中心的な主題、情報のことです。したがってこの要素の内容はそのページ内で固有のものであるべきで、セクションにまたがって繰り返されるもの（ナビゲーションや検索フォームなど）を入れることは基本的にありません。<br>通常は一つのページ内に一つしか配置できません。複数配置する必要がある場合は、１つを除いて全てのメイン要素に`hidden`属性を指定し、ユーザー側から見て存在していない形にしていなければなりません。<br>また、この要素は`<article>`、`<aside>`、`<nav>`、`<header>`、`<footer>`の中に配置することはできません。


_記述例_


```html:HTML
<body>
 <header>
  <img src = "image/logo">
 </header>

 <main>
  <h1>Apples</h1>
  <p>The apple is the pomaceous fruit of the apple tree.</p>
  <article>
    <h2>Red Delicious</h2>
    <p>These bright red apples are the most common found in many
    supermarkets.</p>
  </article>
 </main>

</body>
~~~

##nav要素 `<nav>`
この要素は、現在のページ内の他の部分や他のページへのリンクを提供するセクションであることを示します。<br>しかしページ内の全てのリンクをこの要素に入れる必要はなく、リンクの主要なブロックにのみ使用します。<br>`<fotter>`内でよくリンク集が置かれることがありますが、この要素に入れる必要はありません。読み上げアプリなどではこの要素の範囲の読み上げを省略することができます。
##section要素 `<section>`
この要素は、ページ内でのセクション（区間）を意味します。<br>この要素は、スタイル付けの目的のみで使用される`<div>`と違いページ内での文脈に沿って論理的な区切りとして現れるべきものです。通常、この要素には見出し`<h1~h6>`が含まれます。<br>内容が独立してページ外でも意味を持つものであれば、代わりに`<article>`要素を使用します。

_記述例_

```html:HTML
<h1>セクションについて</h1>
<section>
    <h2>セクションとは</h2>
    <p>セクションは文書の理解を助けるための区切りです。</p>
</section>

<section>
    <h2>セクションの種類</h2>
    <p>いろいろあります。</p>
</section>

~~~

##article要素 `<article>`
この要素は、ページ内において単独で自己完結している範囲やコンテンツに使用されます。<br>例えば、ネットや新聞の記事、ブログ記事、ユーザーの投稿したコメントなどがそうです。ちなみに、この要素の著者情報は`<address>`要素で提供することができます。
##aside要素 `<aside>`
ページの主な内容と直接関係のない部分を示す要素です。<br>サイドバーや広告、補足記事などに使用されます。
##見出し要素`<hi>~<h6>`
見出しを示す要素になります（h="heading"の略）。`<h1>`から始め次は`<h2>`と、数字順で使用します。`<h1>`が最上位で、`<h6>`が最下位となります。<br>テキストの大きさを変える目的のみで使用することはよくありません。その場合はCSSで`font-size`を使用します。<br>`<h1>`は、そのページの主題となるので１つのページに使用するのは１つまでにすべきです。複数使ってしまうと内容がわかりにくくなったり、SEO(Googleの検索順位)に悪影響があります。
Laravel モデルファイル作成

##Modelとは
ビジネスロジックを扱う部分で、テーブルデータベースと結びつきます。
Laravelでは、テーブル名（複数系）とモデル名（単数系）とすることで自動でデータベースとモデルを結び付けてくれます。

 - テーブル名：users
 - モデル名：User


##artisanコマンドでモデルを作成
Laravelでは、artisanコマンドを使うことでモデルファイルを作成することができます。

```
php artisan make:model モデル名
```

###モデルが作成される場所
```
/app
```

モデルは作成する際に、ディレクトリを指定することができます。
モデルが増えたときのことを考えて、Modelsディレクトリを作成し、Modelsディレクトリ内に作成するのがおすすめです。
```
php artisan make:model Models/モデル名
```
ReactNativeドラッグアンドドロップでリストを並び替え

### 目的

ReactNativeでドラッグアンドドロップでリストを並び替えることをしたい。

以下のようなライブラリがある様子。試していく。
react-native-sortable-list
react-native-draggable-flatlist
react-dnd(テーブルのソートは自分で..)

### react-native-sortable-list


https://github.com/gitim/react-native-sortable-list

iOSでは良い感じに動いたが、AndroidでScrollとかぶると上手く行かない...
さらにAnimationに関して以下のwarningがでてしまう。


```
Animated: `useNativeDriver` was not specified. This is a required option and must be explicitly set to `true` or `false
```

ボツ

### react-native-draggable-flatlist

https://github.com/computerjazz/react-native-draggable-flatlist

```
# 依存ライブラリのインストール
expo install react-native-reanimated
expo install react-native-gesture-handler

# 本体
expo install react-native-draggable-flatlist
```

![ace.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226284/49901f4a-2e24-3b2f-3fe3-e33babe0b369.gif)


これはiOSでもAndroidでも、scrollしてもいい感じにうごきました。

renderItemの引数に{ item, index, drag, isActive }が渡される。
このdragを実行するとdraggableの状態になる。
サンプルや自分の実装では、ItemのonLongPressで実行しているがボタンのpressなどでも実行出来る。
またisActiveで選択状態かわかるので、スタイルを変えるとわかりやすい。

onDragEndで引数に並びが変わったあとのdataが帰ってくるので、必要な情報を保存してして、 最初のdataを差し替えればよし。

画面外へのドラッグしながらスクロールする場合は、結構遅いのであんまり長い距離はこういうのでは移動させないほうが良いかも

```jsx
<DraggableFlatList
          style={styles.list}
          data={this.state.list}
          keyExtractor={(item, index) => `draggable-item-${index}`}
          renderItem={this.renderItem}
          onDragEnd={this._onDragEnd}
        />

```

```jsx
  renderItem = ({ item, index, drag, isActive }) => {
    const activeStyle = {
      backgroundColor: isActive ? "#ffdddd" : "#fff",
      borderColor: "red",
      transform: [
        { scale: this.state.itemScale },
      ],
    };
    const dStyle = isActive ? activeStyle : []

    return (
      <TouchableOpacity style={[styles.listItem, dStyle]} onLongPress={() => this._itemOnLongPress(drag)}>
        <Text> test me{item}</Text>
      </TouchableOpacity>
    );
  };
```
【Laravel】{{ config(‘app.name’, ‘Laravel’) }}について

知識を整理するための個人的な備忘録です。

#はじめに
![laravel-auth-title.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701834/9b3d60b4-91a4-2f09-24bd-f009715f92a7.png)
左上の`Laravel`の文字を任意のタイトルに変えたかったので、該当箇所のコードを見てみると

```php:resources/views/layouts/app.blade.php
<a class="navbar-brand" href="{{ url('/') }}">
  {{ config('app.name', 'Laravel') }}
</a>
```

どうやら`{{ config('app.name', 'Laravel') }}`がブラウザ上に`Laravel`と表示させているっぽいので調べてみた。

#{{ config('app.name', 'Laravel') }}とは
`config`というヘルパ関数を使って
`config/app.php`の`APP_NAME`を読み込んでいるらしい。`config`に飛んでみると

```php:config/app.php
'name' => env('APP_NAME', 'Laravel'),
```
今度は`env`というヘルパ関数を使って
`.env`ファイルの`APP_NAME`を読み込んでいる。見てみると1行目に

```:.env
APP_NAME=Laravel
```
という記述が。
なのでこの記述を、例えば

```:.env
APP_NAME=Sample
```
などとして、サーバーが立ち上がっている場合は落としてからもう一度立ち上げると
![laravel-auth-title-sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/701834/0c5c1d1d-e04d-c61f-6b20-d9abde042266.png)
解決。


#参考
* [{{ config(‘app.name’, ‘Laravel’) }}って何？](http://hpscript.com/blog/configapp-name-laravel-%E3%81%A3%E3%81%A6%E4%BD%95%EF%BC%9F/)
Gulpインストール後に、起きたエラー

##Gulpインストール後に、起きたエラー

1:以下のとおり、インストール。

```
$ npm install gulp --save-dev
```

2:バージョン確認として以下を打つと、エラー発生。。。。。。

```
xxxx-mbp:testwork xxxxxxx$ gulp --version
-bash: gulp: command not found
```

発生した原因をGoogleで探したら、PATHが通っていないこというの濃厚的でした。


私の場合、以下でパスを変更。

```
$ export PATH=/Users/xxxxxxx/.npm-global/bin:$PATH
```

解決！！

```
xxxx-mbp:testwork xxxxxxx$ gulp -v
CLI version: 2.3.0
Local version: 4.0.2
```


解決したのですが、
インストール先は以下のとおりでした。　※＄ npm root -gで確認。

```
xxxx-mbp:.npm-global xxxxxxx$ npm root -g
/Users/xxxxxxx/.npm-global/lib/node_modules
```


もう一度確認。binとlibはどう違うのか？？

```
xxxx-mbp:.npm-global xxxxxxx$ ls
bin	lib	share
```


以下のパスだと上手く行かなかったです。
謎です。

```
$ export PATH=/Users/xxxxxxx/.npm-global/lib:$PATH
```

ですが、解決できたのでよかったです。
今回は起きた事象を記載しているのみです。
ありがとうございました。
Windowsコンテナーワークショップのご紹介

#はじめに
ここ最近、[Windowsコンテナー](https://docs.microsoft.com/ja-jp/virtualization/windowscontainers/)が随分と身近になってきました。
Windows10に[Docker Desktop](https://store.docker.com/editions/community/docker-ce-desktop-windows)をインストールすることで、誰でも簡単にPCでWindowsコンテナーのビルドや実行ができるようになりました。
Kubernetesにおいてもv1.14からWindowsコンテナーが[サポート](https://kubernetes.io/blog/2019/04/01/kubernetes-v1.14-delivers-production-level-support-for-windows-nodes-and-windows-containers/)されており、利用方法などの[ドキュメント](https://kubernetes.io/docs/setup/production-environment/windows/intro-windows-in-kubernetes/)も整備されてきています。
Windwosコンテナーのエンハンスも[こちらのロードマップ](https://github.com/microsoft/Windows-Containers/projects/1)の通りしっかり実施されてきており、今後もさらに使い勝手が向上していくことが期待できます。

ユースケースとして、**<font color="Olive">既存のWindows環境で稼働するアプリをコンテナ化して、Kubernetesやコンテナ環境に移行したい</font>**、といった場合などには、Windowsコンテナーは非常に魅力的なのではと思います。

では早速Windwosコンテナーを利用してみたい！という方に、すぐに試せる環境としては、やはりクラウドのKubernetesサービスをお勧めします。AzureのマネージドなKubernetesサービスである[Azure Kubernetes Service(AKS)](https://azure.microsoft.com/ja-jp/services/kubernetes-service/)においても、Windowsコンテナーは[正式にサポート](https://azure.microsoft.com/ja-jp/blog/announcing-the-general-availability-of-windows-server-containers-and-private-clusters-for-azure-kubernetes-service/)されています。
そこで、AKSを利用したWindowsコンテナーのワークショップを[chack411](https://twitter.com/chack411?s=20)さんとともに作成しましたので、ご紹介させていただきます！！

#Windowsコンテナーワークショップ

↓こちらががワークショップのコンテンツへのリンクになります。
[**ASP.NET と Windows Containers & AKS ワークショップ**](
https://github.com/chack411/AspnetWinContainerApp)

内容としては、下記の２部構成になっています。

- **事前準備と Windows Container アプリケーションのローカル実行およびデバッグ**
  - *Visual StudioとDocker Desktopを用いてWindowsコンテナーをビルド・デバッグします*
- **Azure Kubernetes Service (AKS) クラスターの作成と Windows コンテナーのデプロイ**
  - *AKSとWindowsサーバーノードを作成してWindowsコンテナーをデプロイ・操作します*

お一人でもくもくと作業するのもOKですし、グループやチームで取り組んでいただくことも出来ます。

なお、このワークショップではAKSだけではなく、コンテナレジストリとしてAzure Container Registryも利用します。Azureのアカウントをお持ちで無い方は、お手数ですが作成をお願いいたいします。

[Azure無料アカウントの作成ページ](https://azure.microsoft.com/ja-jp/free/)
[Azure学生向けアカウント作成ページ(クレジットカード不要)](https://azure.microsoft.com/ja-jp/free/students/)

# WindowsコンテナーのFAQ

WindowsコンテナーとLinuxコンテナーの違いなど、色々な疑問点があると思います。下記のサイトによくある質問について記載されていますのでご参照ください。

- [Windowsコンテナーについてよく寄せられる質問](https://docs.microsoft.com/ja-jp/virtualization/windowscontainers/about/faq)
- [AKSのWindowsノードに関してよく寄せられる質問](https://docs.microsoft.com/ja-jp/azure/aks/windows-faq)
【Rails】form_withについて

#form_withとは

railsで情報を送信するためのヘルパーメソッド。簡単に入力に必要なHTMLを作成することができる。

#基本的な書き方

**入力された情報をデータベースに保存しない時**

```
<%= form_with url: "パス" do |f| %>
  フォーム内容
<% end %>
```

**入力された情報をデータベースに保存する時**

```
<%= form_with model: "モデルクラスのインスタンス" do |f| %>
  フォーム内容
<% end %>
```

引数に指定しているモデルクラスのインスタンスとは、保存したいテーブルのクラスのインスタンス。
今回はmemoというテーブルに新たにレコードを作成したいため、コントローラー側で以下の記述をします。

```
def new
  @memo = Memo.new
end
```

この`@memo`をform_withの引数に指定します。この、コントローラーで作成したインスタンスがnewメソッドで新たに生成されて、何も情報を持っていなければ自動的に`createアクション`へ、findメソッドなどで生成され、既に情報を持っている場合は`updateアクション`へ自動的に振り分けてくれるようです（便利）。

#フォーム内容の記述方法

form_withで使用できるHTMLタグを記述していきます。

| Center align | Left align  | 
|:-----------: |:------------|
| f.text_field       | 1行のテキストフォーム        |
| f.text_area     | 複数行のテキストフォーム      | 
| f.date_select       | 日付選択ボックス生成        | 
| f.number_field         | 数値入力のボックスを生成          | 
| f.submit       | 送信ボタンの生成       | 

他にも多数ありますが、現状使用したもののみをピックアップしてみました。
TypeScriptのチュートリアル見てて少しハマった話（jsファイル出力先(outDir)が指定しても出力されない）

# TypeScriptチュートリアル見てて少しハマった話

https://code.visualstudio.com/docs/typescript/typescript-tutorial

を試してて、
tsconfig.jsonに
jsファイルの出力ディレクトリを指定できるよって書いてあるんだけど
指定しても、そこに出力されず15分悩んだなので共有。

```typescript:tsconfig.json
{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "outDir": "out"
  }
}
```
このあとに、
**tsc をオプション指定なしで実行せよ**

Delete helloworld.js and run the command tsc **with no options**.


って書いてあるのを見落として、オプション指定つけて

```
tsc helloworld.ts
```

をずっとやっててハマりました。

```
tsc
```

で実行しないと、
tsconfig.jsonのオプションを読み込んでトランスパイルしてくれません。
作業効率化系ツールまとめ

#[You can book me](https://youcanbook.me/)
スケジュール調整が簡単になるツール。google スケジュールと連携したら空いてる時間に相手が予約できる


#[ToDoリスト](https://todoist.com)
直感的にToDoリストが管理できる。チーム共有とかはできないので、個人使用向け。
Nginx で Laravel をリバースプロキシーで動かす

次のプログラムを Nginx で動かして見ました。
[Laravel で HelloWorld](https://qiita.com/ekzemplaro/items/c74e7431a8a90e2feb03)

注意：　この方法では簡単な Laravel プログラムしか動かすことは出来ません。
>複雑なプロジェクトの場合は、こちらの方法があります。
>[Nginx で Laravel を動かす](https://qiita.com/ekzemplaro/items/cb04f241f463b4a610a4)

Larevel サーバーの起動

```text
$ php artisan serve --host 0.0.0.0
Starting Laravel development server: http://0.0.0.0:8000
[Mon Feb 15 09:58:22 2021] PHP 7.4.9 Development Server (http://0.0.0.0:8000) started
```

curl でアクセスして動いていることを確認

```text
$ curl http://localhost:8000/hello
<h2>Feb/15/2021</h2><!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>My First Page</title>
</head>
<body>
  <h2>Hello World!!</h2>
  <p>皆さん、こんにちは</p>
Feb/15/2021<p />
</body>
</html>
```

Nginx の設定変更


```text:/etc/nginx/sites-available/devault
server {
（省略）
location  ^~ /hello {
                proxy_pass   http://127.0.0.1:8000/hello;
        }
}
```

設定ファイルが正しいか確認

```text
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
```

Nginx の再起動

```bash
sudo systemctl restart nginx
```

クライアントからアクセス

```bash
curl http://localhost/hello
```
自宅のネットワーク構成を変えたときの話

## はじめに
最初の記事というところで、何をネタにするのか、、、すごく時間がかかりましたが、
最近自宅で行ったネットワーク構成変更を書いてみようと思います。
※ この記事では、RTX1200の設定を一部公開しています。マスクしてますが。

## この記事を実現するための材料
・ RTX1200 （YAMAHA）
・ NetGEAR AX5400 NIGHTHAWK
・ I-ODATA WN-AX1167GR2
・ NURO光
・ So-net光 v6プラス
・ LANケーブル（Category 5e以上）

## なぜネットワーク構成を変更したのか？
・ クリスマスプレゼントにWIFI6無線ルーターを妻が買ってくれたので（買わせた）、今利用しているAP親機を一新したかった。
・ NUROがマンションに通る事になった。（前から変えたかった）
の２点から大きく変更しました。
そして、もともと趣味で構築していたVLANは運用上かなり不便だった為、撤廃をしました。

## RTX1200を何故使っているのか？
いろんな方のサイトで書いてありますが、
・ もともと業務用のルーターとして利用されていたモデルの為、安定感抜群。
・ 以前の職場で、RTX1210を使っていた為、Yamahaルーターの信用性が個人的に高かった。
・ 現在RTX1200はかなり値段が下がっており、１万円程度で仕入れることができる。
というところから、自宅では現役で使っております。（なんなら２台ある。）

## 旧ネットワーク
![旧自宅ネットワーク図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771103/67f0aafe-53d0-24b9-bb89-d872e71a1c40.png)
・ YAMAHA RTX1200がSo-net V6プラスに対応しておらず、フロント用ルーターとしてI-ODATA WN-AX1167GR2 を設置し無線をOFFで利用
（プロバイダ側からレンタルしているルーターでは、LAN側有線が１００Mの為、別途1000Mのものを購入）
・ JCOM NETの売りである、DOWN３２０MBを、FireTVなど動画メディア閲覧用として利用。
・ Web会議などが頻繁にあるので、仕事用にSo-net V6プラス を利用（UPの確保）
・ 用途ごとにVLANを切りそれぞれ通信できないように分割。（なんとなく）
・ 各VLANセグメントごとにAP（アクセスポイント）を設置。基本部屋ごとに5GHz専用でWi-fi送出

結論としては、以下のように変更になっています。

## 新ネットワーク
![新自宅ネットワーク図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/771103/3da5dac9-ecc9-f133-0014-d8fea42f589c.png)
・ VLANを撤廃
・ メイン・サブの構成を変更。メインをNUROへ。
・ WIFI6の無線ルーターをアクセスポイントモードで利用

## RTX1200 設定上大きく変わった箇所の話
<summary></summary><div>

```
.
.
.
ip forward filter 110 1 gateway 192.168.XXX.XXX filter XXXX # 仕事用
ip forward filter 110 2 gateway 192.168.YYY.YYY filter YYYY # リビング用
ip forward filter 110 3 gateway 192.168.ZZZ.ZZZ filter ZZZZ # 管理用
.
.
.
```
という形でVLANごとにパケットをどこに投げるかを指定していましたが、
基本的にバックアップ回線にしたので、Nuro側になにか問題が発生しない限り利用することも無いと思うので、
手動でデフォルトゲートウェイの向き先を変更する形で運用することにしました。
<summary></summary><div>

```
.
.
.
# LAN2 nuroをメインにする場合
ip route default gateway dhcp lan2 filter XXXXXX gateway dhcp lan3
# LAN3 sonet v6プラスをメインにする場合
# ip route default gateway dhcp lan3 filter XXXXXX gateway dhcp lan2
.
.
.
```
あとは、DNSの切り替えが必要だったりするのですが、
こういうときに便利なのがパブリックDNSサーバですね。
プロバイダから提供されるDNSを使えば速いは速いのですが、切り替えの際にDNSも切り替えないとならず
どちらの回線でも利用できるDNSを指定しておくと楽だったりします。

</div>
## まとめ
そもそも、自宅にインターネット回線を２本引くということ自体不要な話で、あくまでも趣味の延長線上だったりします。
とはいえ、ちょっとした勉強にもなるので、個人的にはおすすめです！
いつかは、AWS、GCPなど現在利用しているクラウドサービスと連携している状態で記事を書いて見ようかとおもいます！
HP分析・SEOツールまとめ

#分析系
###・ 使っているサーバーを調べる「 [Netcraft](https://www.netcraft.com/) 」
サイトのURL入力したあとに出てくる画面のnet ownerの欄を見れば、会社がわかるのでサーバーが特定可能。

| net owner | レンタルサーバー |
|:-:|:-:|
|  SAKURA Internet Inc. |  さくらのレンタルサーバ |
| paperboy&co. Inc.  |  ヘテムル |
| XSERVER.Inc  |  エックスサーバ |
| GMO Internet, Inc.  | ロリポップ、Mixhost  |
| KDDI Web Communications Inc.  |  CPIレンタルサーバ |
|  Server Hosting Service(NTTPCCommunications,Inc.) | WebARENA  |
| Amazon  |  AWS |

	
###・　自社・競合問わずSEO分析可能な「 [シミラーウェブ](www.similarweb.com/) 」

###・ Wordpressテーマを調べる
拡張機能「 [WPSNIFFER - WordPress Themes Sniffer](https://ggle.io/3pmo) 」
これ使えたら便利だったのだけれど、私のMacOS10.15.7の環境じゃ動作しなかった。残念。

・URL入れて調べられるサイト[WordPress Theme Search](https://whatwpthemeisthat.com/)
ちょっと手間ですがこっち使ってます。使ってるWPバージョンまで調べられる。

#制作に役立つ系
###・ 簡単にワイヤーフレームを作る「 [Wirify by Volkside](https://www.wirify.com/) 」


#メディア
###・ [マーケターのよりどころ ferret](https://ferret-plus.com/)
[ディスプレイ広告のバナーサイズ一覧。GDN・YDNごとに紹介](https://ferret-plus.com/27941)
Rails おすすめの商品を表示させる(whenener)

##環境
Ruby'2.6.3'
Rails '5.2.4'


wheneverのgemを入れます。

```ruby:Gemfile
gem 'whenever', require: false
```

```:ターミナル
$ bundle install
$ bundle exec wheneverize
```
config/schedule.rbファイルが作られますので最後に記述します。

```ruby:config/schedule.rb
every 1.minute do #every 2.hours, every 4.daysなど変更できます。
  begin
    runner "Batch::DataReset.data_reset"#cronで起動するファイルです。

  rescue => e
    Rails.logger.error("aborted rails runner")
    raise e
  end
end
```
config/schedule.rbに記述した内容がcrontabに反映されます。
次にlib/batch/data_reset.rbを作成します

```ruby:lib/batch/data_reset.rb
class Batch::DataReset
  def self.data_reset
    Recommendation.destroy_all#Recommendationの中の空にします
    Item.all.shuffle.take(3).each do |item|
      Recommendation.create(recommendation_params(item))
    end
    #商品全て中から3つランダムに取得
    #Recommendationの中に商品を追加させる
    p "おすすめの商品"

  end
    #ストロングパラメータででgenre_id,item.user_id,item.idを判定する。
  def self.recommendation_params(item)
    {
      genre_id: item.genre_id,
      user_id: item.user_id,
      item_id: item.id
    }
  end
end
```

``` ruby:ItemsController.er
@recommendations = Recommendation.all#表示させたいところに記述
```

```:items/view.erb
<p>おすすめのアイテム</p>
 <% @recommendations.each do |recommendation| %>
   <%= link_to item_path(recommendation.item) do %>
     <%= recommendation.item.name %>
   <% end %>
<% end %>
```


```:ターミナル
 $ bundle exec whenever
 $ bundle exec whenever --update-crontab
```
cronへ反映させます。
ファイルなど変更をした際は
$ bundle exec whenever --update-crontab
を入力し、反映させてください。

```:ターミナル
crontab -l
crontab -e
```
crontab -lは情報が確認できます。
crontab -eは直接cronの編集ができます。

```:ターミナル
sudo systemctl start crond
sudo systemctl stop crond
```
二つのコマンドは
cronの起動と停止ができます。
Rで基礎分析結果をCSV出力②量的変数編

# はじめに

前回[Rで基礎分析結果をCSV出力①全体編](https://qiita.com/honda28/items/6b378ec1c51366f3ab21)にて、データ型と欠損数を出力した。続いて、量的変数について扱う。

# 量的変数と質的変数の分割

[default of credit card clients Data Set](https://archive.ics.uci.edu/ml/datasets/default+of+credit+card+clients)の説明によると、データは以下のような属性をもつ。

>Attribute Information:
This research employed a binary variable, default payment (Yes = 1, No = 0), as the response variable. This study reviewed the literature and used the following 23 variables as explanatory variables:
X1: Amount of the given credit (NT dollar): it includes both the individual consumer credit and his/her family (supplementary) credit.
X2: Gender (1 = male; 2 = female).
X3: Education (1 = graduate school; 2 = university; 3 = high school; 4 = others).
X4: Marital status (1 = married; 2 = single; 3 = others).
X5: Age (year).
X6 - X11: History of past payment. We tracked the past monthly payment records (from April to September, 2005) as follows: X6 = the repayment status in September, 2005; X7 = the repayment status in August, 2005; . . .;X11 = the repayment status in April, 2005. The measurement scale for the repayment status is: -1 = pay duly; 1 = payment delay for one month; 2 = payment delay for two months; . . .; 8 = payment delay for eight months; 9 = payment delay for nine months and above.
X12-X17: Amount of bill statement (NT dollar). X12 = amount of bill statement in September, 2005; X13 = amount of bill statement in August, 2005; . . .; X17 = amount of bill statement in April, 2005.
X18-X23: Amount of previous payment (NT dollar). X18 = amount paid in September, 2005; X19 = amount paid in August, 2005; . . .;X23 = amount paid in April, 2005.

1, 5, 12-23列目のカラムが量的変数、2-4, 6-11, 24列目が質的変数となっているので、それら2つに分割する。（なお d および h は前記事[Rで基礎分析結果をCSV出力①全体編](https://qiita.com/honda28/items/6b378ec1c51366f3ab21)ですでに読み込み済み。）

```r:divide.R
# divide the data into 2 parts (1: quantity, 2: quality)
quantity.idx <- c(1, 5, 12:23)
quality.idx  <- c(2:4, 6:11, 24)

d.1 <- d[, quantity.idx]
d.2 <- d[, quality.idx]
h.1 <- data.frame(header[quantity.idx, ])
h.2 <- data.frame(header[quality.idx, ])
names(h.1)[1] <- "ROWNAMES"
names(h.2)[1] <- "ROWNAMES"
```

# 量的変数の基礎統計量をCSV出力

量的変数に関して、平均値、標準偏差、最小値、第1四分位、中央値、第3四分位、最大値の7項目を求め、その後ヘッダーにひもづけてCSV形式にて出力。

```r:stats.R
five <- data.frame()
for (i in 1:length(d.1)) {
  five <- rbind(five, c(fivenum(d.1[, i])))
}

h.1$mean <- sapply(d.1, mean, na.rm=TRUE)
h.1$sd <- sapply(d.1, sd, na.rm=TRUE)
h.1$min <- five[, 1]
h.1$qualtile.1st <- five[, 2]
h.1$median <- five[, 3]
h.1$qualtile.3rd <- five[, 4]
h.1$max <- five[, 5]

write.csv(x=h.1, file="stats.csv")
```

出力結果は以下のようになる。

![quantity.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769545/cd482538-f2fb-bc13-8e2a-a4936a5a3480.png)

以降の記事で質的変数の基礎分析を行って、CSV形式で出力をしていく。
【Swift】TableViewについて

# TableViewとは
リスト型のパーツのこと。
下地として`Table View`があり、その上にセルが重なっていく。
ひとつ一つのセルの大きさや色などはカスタマイズできる。

<strong>`Table View`を構成するのに原則必要なメソッドが以下</strong>

* セルの数を決めるメソッド
* セルのセクション数を決めるメソッド
* セルを構築する際に呼ばれるメソッド
* セルの高さを決めるメソッド(任意)
* セルがタップされた時に呼ばれるメソッド(任意)

これらのメソッドは`UITableViewDelegate`を記述してデリゲートさせる

<strong>セルの数を決めるメソッド</strong>

```swift
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
  return セルの数
}
```
<strong>セルのセクション数を決めるメソッド</strong>

```swift
func numberOfSections(in tableView: UITableView) -> Int{
  return セクションの数
}
```
<strong>セルを構築する際に呼び出されるメソッド</strong>

```swift
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
// ここにセルに関する情報を記述する
  return Cell
}
```
<strong>セルの高さを決めるメソッド</strong>

```swift
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat{
  return view.frame.size.height/6
}
```
<strong>セルがタップされた時に呼び出されるメソッド</strong>

```swift
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) -> Int{

}
```

これらのメソッドが、表示させたい画面で使えるようにするために...
まずデリゲート。

```swift
class viewController: UIViewController, UITableViewDelegate, UITableViewDataSource{
}
```
`UITableViewDelegate`, `UITableViewDataSource`をデリゲートすると、`xcode`がエラーメッセージで、これらのクラスを継承するのに原則必要なメソッドを勝手に補完してくれる。

```swift
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // セルの高さ
    }
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // セルの構築
    }
```
`viewDidLoad`内に、継承したメソッドを使えるように以下の記述を行う。

```swift
override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.delegate = self //<-
        tableView.dataSource = self //<-
    }
```
オイラーの等式～虚数の虚数乗を考える～

#はじめに
次の記事のための準備．式自体は知ってたけど，証明を知らなかったり何が美しいのか実は知らなかったり(苦笑

証明とか興味ない人もいるだろうから先に結論から行きましょう．最後に証明します．

#オイラーの等式
この名前を知らない人は少なからず，いる気がする．でもこの式は知ってる！って人は多くいるでしょう．

```math
{
e^{i\pi}+1=0
}
```
これが**オイラーの等式**．Tシャツとかに書かれてそう．

#美しい理由
さて，この等式，何が美しいのか？数Ⅲの範囲になってしまうが，この文字たちにはそれぞれ意味がある．


* e=2.71828182846$\cdots$　　；自然対数(ネイピア数)
数Ⅲの極限の範囲で初めて登場する．理系ではおなじみの，

```math
{
e=\displaystyle\lim_{n\to\infty}\left(1+\dfrac{1}{n}\right)^n
}
```

である．

* $\pi$=3.14159265359$\cdots$　　；円周率
100桁まで覚えた人もいそう．いわゆる3.14ってやつ．

* $i$　　；虚数単位
存在しない数を文字でおくということに慣れなかった人もいるよね．

```math
{
i^2=-1
}
```
です．

* 1　　；乗法単位元
* 0　　；加法単位元

さてこの2つは大学範囲の単語．え？ただの0と1じゃないの？？って．違うんです．意味は簡単．要はある数aに対して

```math
{
a\times 1=a，a+0=a
}
```
と，掛け算，足し算したのに，その数を変えない値を**乗法単位元**，**加法単位元**，という．少し考えれば分かるが，**実数全体$\mathbb{R}$の乗法単位元，加法単位元はそれぞれ1，0のみなんです．**そう考えると，ちょっと特別な数って思いません？？

以上から，もう一度オイラーの等式を見てみよう．

```math
{
e^{i\pi}+1=0
}
```

一見関係ないような数たち$e，\pi，i，0，1$が一堂に会するこの等式美しいと思いませんか！！私は~~さっきこれを~~知ったときは，なるほどな～ってなりました．感動まではしなかったけど．

# ここまで読んでほしい！
心の声が出てしまった．さて，ここから虚数の虚数乗を考えていこう．
実はオイラーの公式というものがあって，

```math
{
e^{i\theta}=\cos \theta+i\sin\theta
}
```
右辺は複素数の極形式表示ですね．実は左辺のように表せたりするんです．なにが言いたいって，この$\theta$を$\theta=\pi$とすれば，あら不思議．オイラーの等式が現れました．

と，これだけではなく，$\theta=\frac{\pi}{2}$とするとどうだろう．

```math
{
\begin{align*}
e^{\frac{i\pi}{2}}&=\cos \frac{\pi}{2}+i\sin\frac{\pi}{2}\\
&=i
\end{align*}
}
```
これを両辺$i$乗してみよう．

```math
{
\begin{align*}
i^i&=\left(e^{\frac{i\pi}{2}}\right)^i\\
&=e^{\frac{i\pi}{2}・i}=e^{-\frac{\pi}{2}}\\
&=\dfrac{1}{\sqrt{e}^\pi}\\
&=0.2078795763507619\cdots
\end{align*}
}
```
**控えめに言ってやばい．何がやばいって，存在しない数を存在しない数乗したら存在する数になるんだもん．**というわけで以降証明していきましょう．
#証明1(マクローリン展開)
さてここから，オイラーの公式

```math
{
e^{i\theta}=\cos \theta+i\sin\theta
}
```
の証明をしていこう．証明の1つとしてマクローリン展開を利用する．まず，準備として，

```math
{
\begin{align*}
e^x=&1+x+\frac{x^2}{2!}+\frac{x^3}{3!}+\cdots\\
&=\sum_{k=0}^\infty \frac{x^k}{k!}
\end{align*}
}
```
これがどのように近似されているかを考察し始めるときりがないのでここでは割愛．この$x$を$ix$に変えると，

```math
{
\begin{align*}
e^{ix}=&1+ix+\frac{(ix)^2}{2!}+\frac{(ix)^3}{3!}+\cdots\\
&=1+ix-\frac{x^2}{2!}-i\frac{x^3}{3!}+\cdots\\
\end{align*}
}
```
さらに，

```math
{
\begin{align*}
\sin x&=x-\frac{x^3}{3!}+\frac{x^5}{5!}+\cdots=\sum_{k=0}^{\infty}\frac{x^{2k+1}}{(2k+1)!}(-1)^k\\

\cos x&=1-\frac{x^2}{2!}+\frac{x^4}{4!}+\cdots=\sum_{k=0}^{\infty}\frac{x^{2k}}{(2k)!}(-1)^k
\end{align*}
}
```
三角関数もマクローリン展開した．ここまでくればいいでしょう．$\cos\theta+i\sin\theta $を計算することで，$e^{i\theta}$と一致する．以上！

# 証明2(微分方程式)
2つ目の証明として微分方程式を使ってみよう．
$f(x)=\cos x+i\sin x$とすると，

```math
{
\begin{align*}
f'(x)&=-\sin x+i\cos x\\
&=i(\cos x+i\sin x)=if(x)
\end{align*}
}
```
この微分方程式の一般解は$f(x)=Ce^{ix}$である．初期条件$f(0)=1$から，$C=1$とわかる．より，$f(x)=e^{ix}$とわかる．

#まとめ
虚数の虚数乗，考えたくもなかったがオイラーの公式を使えば案外簡単(?)にわかるのね．このオイラーの公式は次の記事で使うので頭の隅っこにでも置いておいてください．

別に証明なんて知らなくても，**少しでも，へ～，ってなってくれれば当方は満足です．**




(注釈)
複素関数のところもっとしっかり証明しなきゃダメでしょとか，当たり前だわこんなの！！とか，そういう指摘はナンセンス．少しでも数学に興味をもってもらうのがこの記事の趣旨なので，そういう議論は(もちろん必要だけど)この記事では必要なし．興味をもったら自分で調べてね．当方もよくわかってない☆
転職コースでやったこと

# Ruby on Rails
### MVC,ルーティング
#### 今回はM(モデル)
#### アソシエーション
has_many(has_one) :モデル名(manyの時は複数形が自然)
belongs_to :モデル名(単数形)

#### バリデーション
validates_to :モデル名　   presence: true(⇦Null値を許容しない場合)
Djangoのモデルでカラム名を動的に指定する

# Djangoのモデルでカラム名を動的に指定する
## 概要
　「Django」のデータベース操作でDBオブジェクトのカラム名を変数で指定する

## 例
Modelオブジェクトの__dict__メソッドを使用してカラムを指定する。

```sample
for index1 in range(1, 5):
    for index2 in range(1, 5):
        hogehoge.__dict__['column_' + str(index1) + '' + str(index2)] = str(index1) + str(index1)

```
複数のクラスでPAppletを動作させる（Eclipse）

# 困ったこと

`setup`や`draw`メソッドが存在するメインクラスでは Processing の機能が適切に動作しますが，メインクラス以外のクラスでは PApplet による Processing の機能が適切に動作しませんでした．

# 【失敗】試したこと

どうしようもないため，とりあえずメインクラスと同様に PApplet を継承すれば動作するだろうと期待し，

```Java:ClassSub(Java)
public class ClassSub extends PApplet
{
    ...
}
```

と記述しましたが，`rect`や`image`といったメソッドは使用できませんでした．

# 【成功】試したこと

結果としてメインクラスからのインスタンス生成時に PApplet 型の変数を対象のクラスに渡すことで解決しました．

```Java:ClassSub(Java)
private PApplet root;

public class ClassSub
{
    ClassSub(PApplet root, ...)
    {
        this.root = root;
        ...
    }
}
```

```Java:ClassMain(Java)
public class ClassMain
{
    ClassSub subClass = new ClassSub(this, ...);
}
```

また，Processing のメソッドを呼び出すときは

```Java
root.image(imagePath, x, y);
root.rect(x, y, width, height);
```

のように，先頭にPApplet型の変数からの静的呼び出しで使えます．

# 補足

ちなみに Processing エディタにおいて，クラス管理のために複数のタブにクラスを分けて記述しますが，内部的にはすべて**インナークラス**としてコンパイルされているようです．（下記）

```Java
class ClassMain
{
    setup() {...}
    draw() {...}
    
    class ClassSub()
    {
        ...
    }
}
```

だから，Processing では複数のタブに分けてクラス管理をしても Processing の機能が使えるんですね...
（すべてメインクラスにぶち込んだら動くに決まってる！笑）

そのため，初めは Eclipse も Processing と同様に複数のタブにクラスを記述しても動作するだろうと思っていました...（数時間ロス）
通信の流れを参照サイトでまとめてみた

#はじめに
通信の流れを大まかに説明してるものはあれど、全体として理解しづらかったので、自身が調べたわかりやすいサイトと共にまとめてみました。

#通信のモデル
通信は以下のOSI参照モデルの処理を介して行われます。

OSI参照モデルの説明
https://www.infraexpert.com/study/networking3.html
（ちなみに現在はTCP/IPモデルが主流だが、エンジニアで話をするときはOSI参照モデルを元に話をする。）

データは上記のようにパソコン内などでカプセル化という、データの通信をするための通信処理の情報が入ります。

最初はL1、L2・L3、L4でそれぞれで順番にやり取りをして通信を確立したのち、データのやり取りができるそうです。
それぞれでやり取りというのは、一度対向機器まで通信を行えたら、データまでの通信を行う前に、通信元まで戻っくることを言っています。
例えば、L3（IP）での通信がちゃんとできないとL4（TCP）のやり取りまで通信は行われません。

#通信の流れ
通信を行う際に、カプセル化されたデータの通信はL1で電気信号として繋がったあとに、
対向機器でL2,3までカプセル化されたデータが剥がされて情報を取得し、通信元にカプセル化されたデータが戻ってくることでお互いの通信情報を知ります。
https://www.seraku.co.jp/tectec-note/industry/network-layer/

そのあと、L4までデータを剥がしてTCPのやり取りでコネクションを確立したのち、
L5～L7のアプリケーション処理を経て、データを送ります。
https://www.itbook.info/study/tcp1.html

まとめると以下のようになります。
・L1は電気信号なので物理的な繋がってれば繋がる
・L2はL3のARP処理というやり取りを行なってお互いの通信情報を知る
　※DHCPのやり取りはIPを知る通信なのでまた別
・L4はTCPでスリーウェイハンドシェイクという技術で接続を確立する
　※これもL2,3と同じようにやり取りを行なっている
　※UDPというやり取りを行わず、送りっぱなしの通信もある
・L5～L7のそれぞれのプロトコルに沿ったやり取りを行い、データを断続的（MTUの限界値）に送りまくる
　※L2,3は宛先の情報が入った状態、L4はコネクションを張っている情報が入った状態

簡単に言うとL1〜4でそれぞれ送信元機器と宛先機器でやり取りが何回か行われてからデータの受け渡しなどが始まります。

#L2〜4の参照サイト
◯Macアドレス（L2）
Macは例えばの流れでルータまでやり取りをしてL2の通信を確立、ルータは次のルータまたは宛先PCとやり取りをして通信を確立する
https://milestone-of-se.nesuke.com/nw-basic/grasp-nw/ethernet-ip-address/

〇IPアドレス（L3）
https://www.kagoya.jp/howto/network/ipaddress/

◯ARP（L3）
IPからMacアドレスを知る
https://www.infraexpert.com/study/tcpip2.html

◯TCP　スリーウェイハンドシェイク（L4）
https://www.infraexpert.com/study/tcpip9.html

#L5～7の参照サイト
〇こちらは参照程度
https://www.linuxacademy.ne.jp/lablog/infrastructure/155/

#その他
◯MTUの話(「IP フラグメンテーションと TCP セグメンテーションの違い」の図がわかりやすい)
https://milestone-of-se.nesuke.com/nw-basic/grasp-nw/mtu-mss-fragment-segment/amp/

◯インターネットの繋がり方は以下がわかりやすい
https://www.google.com/amp/s/milestone-of-se.nesuke.com/nw-basic/grasp-nw/about-internet/amp/

◯NATの説明
https://www.itbook.info/study/nat3.html

◯NAPTの説明
https://www.itbook.info/study/nat4.html

IPだけ変換するのがNAT、IPとポート番号を合わせて変換するように設定するのがNAPT。
NATの場合、1対1の変換になるので変換元のPCがいっぱいあると対応できないのでNAPTを使う。

〇通信全体の参照サイト
通信の流れとしては以下がすごくわかりやすい。
https://www.isc.meiji.ac.jp/~mizutani/ict/communication.pdf


#さいごに
CCNAを取得してから10年近く経ちましたが、忘れてた部分ややっと腑に落ちたものがあり、理解が深まりました。
やっぱり何回か反復しないと覚えないですね〜。。
※参照サイトの誤りがあったため、一部修正しています
Flutter On The WebでSVGが使えなくて暫定対応

# あらすじ

Fluterで一時的にSVG拡張が使えなくなっていたので、暫定対策を取りました。
その流れを紹介します。

※現在の Flutter On The web は Beta です。2021年には Stable Release の予定です。

# 現象

SVGをFlutterで使用するときは[flutter_svg](https://github.com/dnfield/flutter_svg)を使います。

Buildをすると、エラーがでています。

```js
~/.pub-cache/hosted/pub.dartlang.org/flutter_svg-0.19.2+1/lib/src/picture_provider.dart:57:59: Error: No named parameter with the name 'nullOk'.
    context != null ? Localizations.localeOf(context, nullOk: true) : null,
                                                        ^^^^^^
/flutter/packages/flutter/lib/src/widgets/localizations.dart:413:17: Context: Found this candidate, but the arguments don't match.
    static Locale localeOf(BuildContext context) {
```

`Localizations.localeOf()`というメソッドの`nullOk`という引数が無いのに使おうとしているようです。
しかし、使った覚えはありません。flutter_svgが内部的に利用しているのでしょう。

# 解決の糸口

Githubにて、[No named parameter with the name 'nullOk'. # 解決の糸口

「Flutterのバージョンアップに追従しきれずエラーになっている」という趣旨の会話が行われています。

Flutterユーザーとしての対応は、３つに分かれると思います。

1. SVGをあきらてラスター系ファイル形式を選ぶ
2. Flutterに細工をして最新のflutter_svgを使う
3. flutter_svgに細工をして最新のFlutterを使う

もしくはプルリクするかもしれません。

2,3の「細工」というのが鍵です。「細工」と言っても、単にバージョンを下げるのか、Stable、LTS、previewなどのバージョンを指定する方法があります。また、バージョンそのままで、`nullOk`ってのを無視するオプションがあるかもしれません。

# 結論

結局どれがいいの？という話です。私の方法だと下記コマンドを実行して解決させました。

```bash
flutter channnel beta
flutter upgrade
flutter pub upgrade --null-safety
```

ひとまずBetaチャンネルを使う感じです。

# 公式情報

[Dart sound null safety: technical preview 2](https://medium.com/flutter/null-safety-flutter-tech-preview-cb5c98aba187)
[Announcing Dart null safety beta](https://medium.com/flutter/announcing-dart-null-safety-beta-4491da22077a)

**Excelsior!**
Error Occurred: The flow tried to update these records: null. This error occurred: LIMIT_EXCEEDED: System.LimitException: Apex CPU time limit exceeded. 

このエラーの時の対処方法。

https://trailblazers.salesforce.com/answers?id=9064S000000DcA9QAK

1.1つのオブジェクトに複数のプロセスビルダーがあることです。 -->1つにまとめるか、数を減らす。

2.ほとんどの場合、障害はフローまたはApexトリガーにあります。また、循環ロジック、または更新の長いチェーンが原因で他の更新が更新される場合もあります。

更新する前にフローがある時：そこで多くの処理が行われている場合は、レコード処理に多くの時間を残していない可能性があります。

トリガーがある時：それらが非効率的である可能性があります。
windowsでiverilog その90

#概要　

windowsでiverilogやってみた。
Xorshiftのテストベンチ書いてみた。

#参考にしたページ

https://qiita.com/takenawa/items/8a4221ee5cb8448187f2

#サンプルコード

```
module test;
	reg clk;
	reg rst;
	wire [31:0] result;
	xorshift u(.clk(clk), .rstn(rst), .rand(result));
	initial
	begin
		clk = 0;
		rst = 1;
		$monitor("%h", result);
		#2
			rst = 0;
		#2
			rst = 1;
		#20
			$finish;
	end
	always
	begin
		#1
			clk = ~clk;
	end
endmodule

```

#実行結果

```


xxxxxxxx
00000000
05491333
0549139a
dca34543
1b51164f
95104903
d88d0019
95150d51
535acbed
c02a4ca7
d7655df0


```


以上。
GoogleDataPotalで緯度経度データからMapを作成

PostgreSQLでgeometry（緯度経度）として管理しているデータをGoogleDataPotalのMapとして作成する方法をまとめる。

# やりたいこと
- DBデータをGoogleMapに反映させる
- 拡大縮小に併せて表示領域も変化する

完成イメージ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110262/938e3387-0540-b733-6c2e-c93217a2bbb7.png)

# 準備：GoogleDataPotalで扱う「緯度経度」形式の変換

DBではgeometoryとして管理
> select geopoint from data;
> => geopoint: "0101000020E6100000F42FEEAB1751444031F9556F03976140"

GoogleDataPotalでの「緯度,経度」の形式にする
select concat(ST_X(geopoint), ',', ST_Y(geopoint)) AS geo from data;
> => geo: "40.6335349,140.7191693"

# GoogleDataPotalのデータソースで緯度経度として取り込む

- 上記の形式変換が必要なので、「Custom Query」としてSQLを書いて取り込む
- カラムの種別を「緯度、経度」に設定する（画像）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110262/34f3cf97-29f1-52a7-d67c-fb5a4e9feb18.png)


# GooleDataPotalでマップを作成

- グラフ->GoogleMap->「バブルマップ」を選択
- 下の画像を参考に情報を設定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110262/55368b21-9895-6508-dd9b-0a623b90d6f3.png)

# 最後に
- ざっと漁った限りだと、緯度経度の形式とか書いてなくて手探りで試したので共有しました。
- 他のMapとかアメリカだと州ごと設定できるけど、日本含め他の国は対応してなさそう。
wemosで俺言語

#概要

wemosで俺言語やってみる。
spiffsで、プログラムのロード、セーブを実装する。
構想編。

#fizzbuzz

```
10 a=0
20 a=a+1
30 b=a/15
40 #=%=0*120
50 b=a/5
60 #=%=0*140
70 b=a/3
80 #=%=0*160
90 ?=a
100 #=a<100*20
110 #=200
120 ?="fizzbuzz "
130 #=100
140 ?="buzz "
150 #=100
160 ?="fizz "
170 #=100

```

#文法

```
行番号、スペース、ステートメントの順
ラインエディタあり
文は、代入文しか無い
演算子は、+,-,/,*,<,>,=の7個
変数は、a,b,c,d,e,f,#,%の8個
数値は、8bit
行番号は、1から255
メモリは、256バイト
行番号なしで、ダイレクト実行

30で、行30が消える
0で、ソース表示
#=1で、実行
?="ok"で、OK表示
?=aで、変数aの値を表示
#=120で、120行へジャンプ
#=a<10*120で、if a<10 goto 120
a=2+3*5で、(2+3)*5で25が変数aへ代入
%は、/した時の余り


```

#追加文法

```
1で、spiffsのルートディレクトリを表示する。
?=(/ss.ore)で、プログラムをセーブ。
?=</ss.ore>で、プログラムをロード。
```

以上。
DartでMapにスプレッドを使って条件次第で値を追加する

Dartについてのメモ。

DartでMapにスプレッドを使って条件次第で値を追加する方法。


```dart
void main() {
  bool test = false;
  Map<String, String> myMapA = {
    "a": "1",
    "b": "2",
   ... test == true ? {"c":"3"} : {}
  };
  Map<String, String> myMapB = {
    "a": "1",
    "b": "2",
   ... test == false ? {"c":"3"} : {}
  };

  print(myMapA);
  print(myMapB);
}
```

実行結果：

```
{a: 1, b: 2}
{a: 1, b: 2, c: 3}
```

Javascriptでも似た様な事が出来るけど、dartの`Map`はJavascriptでは`Object`。`{}`の代わりに`null`が使える。Dartでは`null`を代わりに代入しようとしたら、エラーが出てしまう。また、javascriptの`===`が、dartでは`==`になる。

```javascript
let test = false;
const myMapA = {
  a: '1',
  b: '2',
  ...(test === true ? { c: '3' } : null),
};
const myMapB = {
  a: '1',
  b: '2',
  ...(test === false ? { c: '3' } : null),
};

console.log(myMapA);
console.log(myMapB);
```
Github Surfをご紹介します！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1111329/c54c66c0-5a4a-8830-851c-101c182afec1.png)

皆さん、こんにちは！

🏄 CLI"surf."とchrome extensionが内蔵されたGithub surfをご紹介します。

github.surfはgithubでボタンクリック、またはアドレスウィンドウをsurfに変更し、ブラウザ上ですぐにコードをサーフィンすることができるサービスです。

CLI"surf."とchrome extensionを内蔵して提供します。

ローカルジョブ中、他のブランチのコードを見るときはアンセーブドコミットではなく、"surf.-b<branch-name>"を使えば他ブランチのコードをブラウザでvscode環境でサーフィンできます。

ブログClapとGithubスターも参加してください 🌟🌟

[ブログを見に行く](https://medium.com/bridgedxyz/%EF%B8%8Fgithub-surf%E3%82%92%E7%B4%B9%E4%BB%8B%E3%81%97%E3%81%BE%E3%81%99-%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E3%82%B5%E3%83%BC%E3%83%95%E3%82%A3%E3%83%B3%E3%81%99%E3%82%8B%E3%81%AB%E4%B8%80%E7%95%AA%E6%97%A9%E3%81%8F%E3%81%A6%E3%82%AF%E3%83%BC%E3%83%AB%E3%81%AA%E6%96%B9%E6%B3%95-cli-extension%E3%81%AE%E6%94%AF%E6%8F%B4-a509539a9a6
)
【Spring Boot】 Registration and Login with MySQL Database, Bootstrap and HTML5, Spring Security

#今回のプロジェクトでは、Spring Securityを使っています:closed_lock_with_key:
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/4c157956-7a82-6f86-3053-d2bf490a9533.png" width="300">

#学べたこと
:star:　Junitテスト
:star:　pom.xmlにbootstrap用のdependencyを記述　（参考URL：https://mvnrepository.com/artifact/org.webjars/bootstrap)
:star:　HTML5によるvalidationの記述方法
:star:　Hibernateを使ってデータベースに自動でテーブルを作成する方法　（⇦これは、チョー便利です:sparkles::sparkles:）

#参考動画

[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/aRLoSDOlU3w/0.jpg)](http://www.youtube.com/watch?v=aRLoSDOlU3w)
YouTube:https://youtu.be/aRLoSDOlU3w

#Software programs
>[Spring Tool Suite 4](https://spring.io/tools)
>[Bootstrap](https://getbootstrap.com/)
>[MySQL Database server](https://www.mysql.com/)

#完成:gift:
![2021-02-15_05h23_35.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/2cf0f72e-74c1-08d8-1ced-d5c8db836794.gif)

#まとめ
Spring Securityを使う上で、新たな概念がいくつか増えました:seedling:

それが今回登場した
　　:star:　UserDetailsクラス
　　:star:　UserDetailsServiceクラス
　　:star:　WebSecurityConfigurerAdapterクラス
　　:star:　BCryptPasswordEncoderクラス

達です:bangbang:

あと、Junitテストに登場したアノテーションです:closed_lock_with_key:
　　@DataJpaTest
　　@AutoConfigureTestDatabase(replace = Replace.NONE)
　　@Rollback(false)
　　@test

これらの役割を一通り理解すれば、オリジナルで簡単なログイン機能の実装もできそうです:muscle:

#次回は、
次は、ReactとSpringBootを連携させて、フルスタックアプリケーションにトライしてみたいと思います
【React.Js and SpringBoot】➡ https://qiita.com/iwasaki-hub/items/089a57e8529fc0576094
ブロックチェーンを破壊する方法

ブロックチェーンを利用したBitcoin。
このブロックチェーンにはPDFを埋め込むことができる。

https://techmedia-think.hatenablog.com/entry/2021/01/28/225538

そこで、このPDFに公衆送信権に違反するデータやポルノデータを格納する。
(私はやりませんけど)

個人で利用する分には問題なしと割り切れるが、
企業がこのブロックチェーンを利用したり、
所有するサーバーにTxを保管している場合、
それなりに社会問題になるはずだ。

現在ATHを更新し続けているが、
次の暴落はおそらくコレが理由になりそう。

というか、既にどこかのTxで実行されている可能性もある。
minicondaの使い方メモ

## インストール
```bash 
# Linux
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
chmod +x ./Miniconda3-latest-Linux-x86_64.sh
./Miniconda3-latest-Linux-x86_64.sh

# macOS
brew install miniconda
```

.zshrcに以下を足す。多分 `/home/k0kubun/miniconda3/bin/conda zsh hook` でもできる。

```bash
eval "$(/home/k0kubun/miniconda3/bin/conda shell.zsh hook)"
```

## environment.yml

```yml 
name: envname
dependencies:
  - python=3.6.5
  - matplotlib
  - nose
  - numpy
  - pandas
  - scikit-learn
  - scipy
  - python-dateutil
  - pip
  - pip:
    - datetime
```

みたいになってるのを、

```bash
conda env create -f environment.yml
```

として読み込む。

## activate
```bash 
conda activate envname
```
とすると使っているシェル内で環境が有効になる。

## deactivate
```bash 
conda deactivate envname
```
というのもできるらしい。

## remove
```
conda env remove -n envname
```
プログラミング初学者メモ(3)　デジタルデータの表現法

#この記事について
プログラミング学習の基礎づくりのため、基本情報技術者の参考書で学習したことをまとめています。
今回はデジタルデータの表現法についてまとめました。

##1.目次
1.目次
2.デジタルデータで用いられる単位
3.文字の表現方法
4.マルチメディアデータの表現方法
5.アナログデータのコンピュータ制御

##2.デジタルデータで用いられる単位

コンピュータで使用する最小の単位は**bit(ビット)**であり、
1bitだけでは0か1しか表せない。
そのため、8bitでひとまとめにして**byte(バイト)**という単位を用いる。
1byteでは、2^8つまり256通りの数を表すことが出来る。

このbyteにも、メートル法の補助単位が利用される。
k(キロ) => 10^3
M(メガ) => 10^6
G(ギガ) => 10^9
T(テラ) => 10^12

##3.文字の表現方法
あらかじめ番号を割り振られた図形データを表示するという形式で、文字を表現する。
割り振り方**(文字コード)**によって表現できる文字の種類や量が異なる。

###Unicode
全世界の文字を表せることを目指したコード。ISOで標準化されている。
文字数が多いため、現在は1文字を4byteで表す。

###S-JIS
ひらがなや漢字、カタカナが扱える。Windowsでも使われており、1文字を2byteで表す。

##4.マルチメディアデータの表現方法
画像や音声などは、それぞれに適した形で細かくしてから扱う。

###画像
ビットマップ方式と呼ばれる、ドットの集合による表現形式を用いる。
ドットの一つ一つに色情報というデータが必要になり、
フルカラーでは1ドットにつき24bitの情報量が必要になる。

###音声
PCM方式と呼ばれる、単位時間ごとに区切りを作る方式。
大まかには2段階の工程がある。

####標準化(サンプリング)
音声データを単位時間で区切り、それぞれの音の高さを抽出する作業。
この単位時間の長さをサンプリング周期という。

####量子化
音の高さを何段階で表現するかを定めて、
サンプリングしたデータを整数値に置き換える。

=>サンプリング周期:短,量子化ビット数:多　になるほどオリジナルに近くなる。

##5.アナログデータのコンピュータ制御
機器の制御は以下の流れで行われる。

センサ…アナログデータを計測し、コンピュータに伝える(A/D変換)。
↓
コンピュータ…情報を整理して次に行う動作を決定し、電気信号を送る。
↓
アクチュエータ…電気信号を受け取り、物理的な動作に変換する(D/A変換)。

###機器の制御方式
一般的な制御方式としては、以下の二つがある。

####シーケンス制御
あらかじめ定められた条件に従って、段階を踏んで制御を実行する。
洗濯機など。

####フィードバック制御
現在の状態を定期多岐に測定し、目標値とのずれを修正するように動作する。
エアコンなど。
学び直し Rubyがミニツク Part6

今日の教科書
[メソッド](http://www.minituku.net/courses/566428009/contents/574938540.html)

#メソッド

##メモ

###メソッドとは&メソッド呼び出し

```
def ＜メソッド名＞
  ＜オブジェクトの手続きにしたい処理＞
end
```

 > オブジェクトを操作する手続きのことをメソッドと呼びます。キーワードのdefを使うことによって、そのオブジェクトに手続きを追加できます。

 > オブジェクトはデータとそのデータに対する手続きがひとつになったものでした。オブジェクトに手続きをおこなうように頼むことが、他の人に仕事を頼む様子に似ていることから「メッセージパッシング」と呼びます。
つまりメソッド呼出しをおこなう時は、オブジェクトへメッセージを送り、そのメッセージを受け取ったオブジェクトはメッセージに対応する処理をおこないます。メソッド名のメッセージを受け取ったオブジェクトは、そのメッセージに対応した処理を知っていればおこないますが、知らない時はエラーになります。このようなメッセージに対応する処理のことをメソッドと呼びます。
また、メッセージを受け取るオブジェクトのことをレシーバと呼びます。以下のような「レシーバ.メソッド名」や「レシーバ::メソッド名」の形でもメソッドを呼び出せます。
レシーバ.メソッド名
レシーバ::メソッド名
レシーバを書くことによって、メッセージを送るオブジェクトを指定しています。

###関数的メソッド

 > これまでの引数を端末へ表示するのに使ったメソッドなどは、レシーバがないので何かのオブジェクトへメッセージを送っているようには見えません。
`print("foo")
puts("bar")
p "baz"`
実は、これらのメソッドも同じようにオブジェクトがメッセージを受け取ってからメソッドを実行しています。これらのメソッドはレシーバを省略する形でしか呼び出せません。
ただし、省略されているだけで実際にはオブジェクトから呼び出されています。
なぜレシーバを省略する形でしか呼び出せないのでしょうか。それはレシーバにオブジェクトを指定しないでメソッドを呼び出すということは、どのオブジェクトでも呼び出せて、同じような動きをすることが期待されているからです。

###名前付き引数としてのハッシュ

 > メソッドを呼び出す時は正しい順番で引数を指定しないといけません。メソッドの引数が多くなってくると、引数の正しい順番を覚えておいてメソッドを呼び出すのは難しくなります。そのような時に他の言語では仮引数という機能を使うことで、メソッドの引数の順番を覚えておかなくてもよくなります。
Rubyでは仮引数名を指定してメソッド呼出しをする機能をサポートしていません。
ただし、メソッドの引数にハッシュオブジェクトを指定することによって、似たような機能をメソッドに持たせることができます。キーを名前のように使うことによって、キーに指定した引数へ値を渡すことができます。

```
def cubage(args)
  # デフォルト値の設定
  x = args[:x] || 10
  y = args[:y] || 10
  h = args[:h] || 10
  return x * y * h
end
p cubage(:h => 100)  #=> 10000
```

 - ハッシュオブジェクトをメソッドの最後に指定するなら囲む{}はなくてもいい。
 - キーと値だけでメソッドの引数に指定することができる。

###ブロック付きメソッド呼び出し

####yield
ブロック付きメソッド呼び出しの時に`yield`が中にあるとブロックの中に処理を移し、
ブロックの処理を全て行ってから、メソッドに戻りyieldの下から処理を行う。
ブロックはdo~endや{}で囲まれた処理のこと。

```
def show
  puts "Enjoy!"
end
show { puts "Programming!" }  #=> Enjoy!
 
def show
  puts "Enjoy!"
  yield
end
show { puts "Programming!" }  #=> Enjoy! Programming!

```

メソッドからブロックへの移動を2回行うこともできる。

```
def double
  yield
  yield
end
double { puts "Two" }
```

yieldの引数として式を指定することでブロックパラメータにもなる

```
def foo
  yield "Hello!", "Enjoy", 42 + 23
end
foo {|x, y, z| puts x, y, z }
```

###メソッドの別名
メソッドは複数の名前を持つことができ、aliasを使って新しい名前をつける。

```
def hello
  puts("Hello!")
end
alias new_hello hello
new_hello
```

別名を与えることでメソッドの拡張ができる。元の機能を別名で残しておき、新しい機能を新しい名前で定義する。
複数の名前をメソッドは持てる。複数の名前を持たせてから既存だけ拡張し、元のメソッドの機能を残すことができる。ただし、異なるメソッドが同じ名前を持つことはできない。

####演算子メソッド
`[]`は文法ではなく実はメソッド。演算子はメソッド呼び出しの形でも使える。

```
p 10.+(20)  #=> 30
```

配列オブジェクトに要素を加える際も[]=をメソッドとして使える。
()内の先頭の引数をインデックスの位置として後ろの引数を加える。

```
ary = []
# 第1引数がインデックスの指定で、第2引数が代入する値
p ary.[]=(1, 10)  #=> [nil, 10]
p ary.[](1)       #=> 10
```

[再定義できる演算子](http://www.minituku.net/courses/566428009/contents/100704553.html)