OmniAICreator/Qiita-1.07M huggingface dataset:
Universal Render Pipelineでパーティクルが表示されない場合の対処法

[PR: CADDiではバックエンドエンジニア、フロントエンジニア、アルゴリズムエンジニア、SRE等などを募集しています](https://corp.caddi.jp/recruit/eng)。

UnityでUniversal Render Pipelineを使っている場合、パーティクルが表示されなくなる場合がある。

この時、そのパーティクルのマテリアルがSoft Particlesを有効化している場合、Scriptable Render Pipeline SettingsのDepth Textureを有効化することで問題が解決する場合がある。

これは、Soft Particlesを利用するためには深度テクスチャが必要だが、デフォルトではそれが無効になっているために発生する問題である。

尚、今後のアップデートで警告を表示する計画があるようだが、Unity 2019.4.12f1、Universal RP 7.3.1ではまだ実装されていない。

- [a very weird bug. URP particles shader problem - Unity Forum](https://forum.unity.com/threads/a-very-weird-bug-urp-particles-shader-problem.869980/)

> I will make a PR, hopefully next week, that addresses this issue. Basically soft particles need the depth texture in order to work correctly but we need to warn people when Depth Texture turned off in the Asset plus also prevent particle disappearing in builds.

以下の場合、問題が顕在化しなかったり、再現する条件が分かりづらくなるので注意する。

- ゲームビューとシーンビューを同時に表示している場合、問題が顕在化しない。
- ゲームビューをFree Aspectにしている場合、プレイ開始後に一度シーンビューをアクティブにしてからゲームビューに戻ると問題が潜在化してしまう。
- ゲームビューをFree Aspect以外にしている場合、シーンビューではパーティクルが表示されるが、ゲームビューでは表示されない。[^1]

[^1]: シーンビューを表示してからゲームビューを表示すると、再描画されるまでは表示されたりする。
【Ruby on Rails】cookieを使い、初回アクセス時に一度だけ表示（jquery.cookie.js使用）

# 目標
![表示.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700999/86607699-5d33-b176-36c3-79d13f1ecdfe.gif)

※新しくブラウザを立ち上げるか、
 1日（設定で変更出来ます）経った後に表示させるようにします。

# 開発環境
ruby 2.5.7
Rails 5.2.4.3
OS: macOS Catalina

# 流れ
1 gemの導入
2 jquery.cookie.jsの読み込み
3 viewの編集

# gemの導入
Railsでjqueryを使えるようにします。

```rb:Gemfile
gem 'jquery-rails'
```
```:ターミナル
$ bundle insatll
```
```js:app/assets/javascripts/application.js
//= require jquery　←追加
//= require jquery_ujs　←追加
//= require activestorage
//= require turbolinks
//= require_tree .
```

# jquery.cookie.jsの読み込み
head部分に下記を追加し、jquery.cookie.jsの読み込みます。
```<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>```

```erb:app/views/layouts/application.html.erb
<head>
  <%= csrf_meta_tags %>
  <%= csp_meta_tag %>
  <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
  <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>　←追加
</head>
```
# viewの編集
今回はhtmlで完結させています。

```erb:app/views/homes/top.html.erb
<div class="indication">
  <div class="box">
    <p>下記の表示終了ボタンを押すと、<br>更新しても見ることは出来ません。<br>
      新しいブラウザを立ち上げると表示されます。
    </p>
    <button>表示終了</button>
  </div>
</div>

<style>
.indication{
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100vh;
  background: rgba(0,0,0,0.5);  
  z-index: 1;
}
.box{
  position:absolute;
  top:40%;
  left:35%;
  width:400px;
  height:150px; 
  background-color: #ffffff;
  z-index:2;
}
.box p{
    padding:15px;
}
.box button{
  display:block;
  margin:0 auto;
}
</style>

<script>
  $(function(){
    $(".indication").show();
    if($.cookie('Flg') == 'on'){
      $(".indication").hide();
    }else{  
      $(".indication").show();
    }
    $(".box button").click(function(){
      $(".indication").fadeOut();
      $.cookie('Flg', 'on', { expires: 1,path: '/' });
    });
  });
</script>
```
# 考え方
```if($.cookie('Flg') == 'on')```にて
```on```の記述がなければindicationクラスを表示しています。

また、ボタンがクリックされると、indicationクラスを表示させず、
```$.cookie('Flg', 'on'```の記述で
cookieに’on’の値を入れ、

```{ expires: 1,path: '/' });```の記述で
cookieの保存期間を１日、対象範囲は”/”でサイト全体を指定しています。
※保存期間の指定はこちらのサイトを参考にしてください。
[jquery.cookie.jsの使い方とCOOKIEの寿命(保存期間)を秒・分・時間で指定する方法](https://qiita.com/hiroshido/items/06e88a53f101ae8d2700)


# まとめ
使用頻度はそこまで高くないかもしれませんが、
注意しないといけないサイトや、登録をさせたいサイト等には有効だと思います。

またtwitterではQiitaにはアップしていない技術や考え方もアップしていますので、
よければフォローして頂けると嬉しいです。
詳しくはこちら　https://twitter.com/japwork
form_withのフォーム部品の属性

初めて記事を書きます。
スクール学習中にform_withについて学習した事をここに記録します。

- 使用環境
  - Rails 6.0.0
  - Ruby 2.6.5

## form_withとは

###form_withメソッドとは、、、
フォームを実装するための**ヘルパーメソッド**です。
###ヘルパーメソッドとは、、、
railsにおいて主にビューでHTMLタグを出現させたり、テキストを加工するためのメソッドの総称。
HTMLでも同様の機能を果たす事ができますが、ヘルパーメソッドを使う利点があります。
1.パスの指定やRubyの埋め込みなどの記述がシンプルになるため
2.セキュリティ上の問題を解消するため
**ヘルパーメソッドで書けるのであれば優先的にそうしましょう。**

## form_withのフォーム部品
```ruby:
<h1>新規投稿ページ</h1>
<%= form_with url: "/posts", method: :post, local: true do |form| %>
  <%= form.text_field :content %>
  <%= form.submit '投稿する' %>
<% end %>
```
該当部分、、、
<%= form.text_field :content %>
<%= form.submit '投稿する' %>

## form_withのフォーム部品の属性
上記該当部分に属性を追加する事ができる。
属性として指定できるのは
**.1 name属性**
**.2 value属性**
**.3 id属性**

```ruby:
     <%= f.text_area :tag_name, name:'item', value:@item.tags[0].tag_name, id:"tag-name" %>
```

**.1 name属性**
nameで定義されている文字列がHTTPリクエストで送信するパラメーターのkeyとなります。そしてフォーム欄に記入した文字列がvalueとして格納されて送信されます。パラメーターの中身が複数になってしまった時などにはここを指定する事で1つのパラメーターに揃える事ができます。

**.2 value属性**
初期値を指定できます。元々その値を入力しておく事ができます。

**.3 id属性**
JavaScliptで指定する。

そして、上記で紹介した属性を記述しなくても、実際にHTMLファイル内ではじめに紹介した属性指定なしのコードを記入するだけで、実は裏では自動で**input要素**に置き換えられ、細かな設定をしてくれています。
それを確認するにはコードを打ってから、ブラウザの**検証ツール**を開いて確認してみてください。
ですので、あくまで指定しないといけない状況の場合指定すればいいと思います。
また、form_withの中身を見るには、createもしくはupdateアクション直下で**bindin.pry**を記入して中身を確認してください。
DatePickerをスピナー指定してもカレンダー部分が消えない(Tablet端末のみ？)



# 前提
- エミュレータおよび実機で検証 (API 28以降)
- htmlをWebViewで表示(Chrome for android)
- DatePickerをスピナーのみの表示にしたかった
- 結果的にスピナーのみの表示をあきらめています

# input type="date"の表示
### まずはデフォルト設定
#### Pixel 3a XLの場合
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548237/a6b54dde-da17-400d-d47b-36a3d2c69600.png)
#### Nexus 10 の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548237/f4558d80-3cf4-dc2e-93a2-c8b7b372ebcb.png)
デフォルト表示だとスマートフォンでもタブレットでも同様の表示


### 次にスピナーのみ表示する設定
        <item name="android:datePickerMode">spinner</item>
        <item name="android:calendarViewShown">false</item>
#### Pixel 3a XLの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548237/e5c2d607-e030-7824-2fb4-0a3e22047723.png)

#### Nexus10の場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548237/3bd5e546-7bc6-01ab-3c0c-203258cb3412.png)
何この右の空間・・・

### 何が起きているのか
本来右の空間にはカレンダーが表示されるが、カレンダーを非表示にしたために
このような空間が生まれてしまったと思われる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548237/095ee28a-e00b-6785-72ae-bdb2760eb302.png)

### おわりに
泣く泣くDatePickerの使用をやめ、生年月日をリストで選択してもらうようにしました・・・
pandas.read_excelで読み込んだExcelの日付がシリアル値だったのでdatetime.datetimeに変換した

# ことのほったん
[pandas.read_excelでExcelの日付を読み込むと書式設定によってデータが数値のシリアル値になった。](https://qiita.com/ponsuke0531/items/be8dce9107620492ac60#%E6%97%A5%E4%BB%98)
datetime.datetimeで統一して処理したいので変換することにした。

# `int`のシリアル値をdatetime.datetimeに変換する方法
- 参考
    - [Python - python pandas にて　シリアル値　から　日付へ　列ごと変更｜teratail](https://teratail.com/questions/186070)
    - [幻の1日に惑うExcelの59日間 | 日経クロステック（xTECH）](https://xtech.nikkei.com/it/pc/article/NPC/20070118/259068/)

```py
# date_int : シリアル値
if date_int < 60:
    # 1900-03-01より前の場合
    days = date_int -1
else:
    # 1900-03-01以降の場合
    days = date_int - 2
date_time = pandas.to_datetime('1900/01/01') + datetime.timedelta(days=days)
```

## こんな感じでやってみた
- 環境
    - macOS Catalina バージョン10.15.7
    - Microsoft Excel for Mac バージョン16.42
    - Python 3.8.5
    - pandas 1.1.3
- 参考
    - [pandasで日付・時間の列を処理（文字列変換、年月日抽出など） | note.nkmk.me](https://note.nkmk.me/python-pandas-datetime-timestamp/)
    - [pandas.Timestamp &#8212; pandas 1.1.3 documentation](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Timestamp.html)

読み込むExcelファイルはこんな感じ
![スクリーンショット 2020-10-14 22.48.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/2517e804-7c67-bcd2-3e01-5d26996da89b.png)


```py
import datetime
import pandas


def get_datetime(val: object) -> datetime.datetime:
    """日付を取得する.
    :param val: 日付の元になる値
    :return: 日付かシリアル値であれば日付、それ以外はNone
    """
    val_type = type(val)
    # datetime.datetimeだったらそのまま返却
    if val_type is datetime.datetime:
        return val
    # pandas.Timestampはdatetime.datetimeを継承していてdatetime.datetimeとして処理できそうなのでそのまま返却
    if issubclass(val_type, datetime.datetime):
        return val
    # intだったらシリアル値としてdatetime.datetimeに変換して返却
    if val_type is int:
        if val < 60:
            # 1900-03-01より前の場合
            days = val -1
        else:
            # 1900-03-01以降の場合
            days = val - 2
        return pandas.to_datetime('1900/01/01') + datetime.timedelta(days=days)
    return None


if __name__ == '__main__':
    # pandasでExcelを読み込む
    sheet = pandas.read_excel('Book.xlsx', sheet_name='Sheet1', header=None)
    for index, row in sheet.iterrows():
        date = get_datetime(row[0])
        if date is not None:
            print(date.strftime('%Y/%m/%d'))
```

```bash:出力
2020/10/14
2020/10/15
2020/10/16
2020/10/17
```
swift実践入門output　Chapter４ コレクションを表す型　後編

##CollectionとしてのString型

String型は単一の文字を表すCharacter型のコレクションとして定義されており、文字の列挙や文字数のカウントなどの機能を持つ


```chapter4.swift

//StringIndex型　文字列内の位置を表すかた
let string = "abcdefghijelmnopqustuvwxyza"
let startString = string[string.startIndex]
print(startString)

//a

//n番目、最後のindexを取得するには
let string2 = "abcdefghijelmnopqustuvwxyza"
let startString2 = string2.startIndex

let bIndex = string.index(startString2, offsetBy: 8)
print(bIndex)
let bb = string[bIndex]
print(bb)

//i

let endString = string2.endIndex
let cIndex = string.index(endString, offsetBy: -1)
let cc = string[cIndex]
print(cc)

//countプロパティを用いて要素数を取得
print(string2.count)
//27

```

#シーケンス　
その要素に一方向から順次アクセス可能なデータ構造

コレクションはシーケンスを包括する概念
一方向からの順次アクセスと特定のインデックスの値へ直接アクセスが可能なデータ構造

###Sequenceプロトコル　要素へ順次アクセス

```chapter4.swift
//forEach(_:)メソッド　要素に対して順次アクセス

let darray = [1,2,3,4,5,6,7]
var enumerated = [] as [Int]
darray.forEach ({ element in enumerated.append(element)
})

print(enumerated)

//[1, 2, 3, 4, 5, 6, 7]

//filterd(_:)メソッド　要素を絞り込む
let filtered = darray.filter ({ element  in element % 2 == 0
})
print(filtered)
//[2, 4, 6]

//map(_:)メソッド　要素を変換する
//全ての要素を特定の要素を用いて変換
let double = darray.map({element in element * 2})
print(double)
//[2, 4, 6, 8, 10, 12, 14]


//別の型のシーケンスへと変換　Int → String

let farray = [1,2,3,4,5]
let converted = farray.map({element in String(element)})
print(converted)

//["1", "2", "3", "4", "5"]


//flatMap(_:)メソッド　要素をシーケンスに変換し、それを一つのシーケンスに追加

let sss = [1,2,3]
let ttt = sss.flatMap({value in [value, value * 2]})
print(ttt)

//compacttMap(_:)メソッド　要素を、失敗する可能sるのある処理を用いて変換する

//全ての要素を特定の処理で変換するが、変換できない値は無視する

let ggg = ["abc","123","kjg","456"]
let integers = ggg.compactMap({value in Int(value)})
print(integers)
//[123, 456]


//reduce(_:)メソッド　要素を１つの値にまとめる
let sarray = [1,2,3,4,5,6,7,8,9]

let sum = sarray.reduce(0, {result, element in result + element} )
print(sum)
//45

let concat = sarray.reduce("", {result, element in result + String(element)})
print(concat)

//123456789




//Collectionプロトコル　サブスクリプトによる要素へのアクセス
let warray = [1,2,2,3,2,1,2,3,4]

print(warray.count)
//9

print(warray.isEmpty)
//false

print(warray.first)
//Optional(1)

print(warray.last)
//Optional(4)

print(warray[3])
//3


```
pandasで欠損値nanじゃないデータを抽出する方法

[pandasで欠損値nanじゃないデータを抽出する方法](https://qiita.com/ponsuke0531/items/7df79686a660e6b025cb)

ちょうど千葉県 Go To EATの加盟店一覧の抽出方法考えてたところだったので記事を参考にまとめました

```python
import pandas as pd
import io

data = """
名前,回数,開始,終了
ぽんすけ,1,9:00,18:00
ぽんすけ,2,18:00,
ぽんすけ,3,9:00,13:00
ぽんすけ,4,,
ぽんすけ,5,9:00,
ぽんすけ,6,18:00,
ぽんすけ,7,12:00,
ぽんすけ,8,12:00,
ぽんすけ,9,,18:00
ぽんすけ,10,,
"""

df = pd.read_csv(io.StringIO(data))

df
```
|    | 名前     |   回数 | 開始   | 終了   |
|---:|:---------|-------:|:-------|:-------|
|  0 | ぽんすけ |      1 | 9:00   | 18:00  |
|  1 | ぽんすけ |      2 | 18:00  | nan    |
|  2 | ぽんすけ |      3 | 9:00   | 13:00  |
|  3 | ぽんすけ |      4 | nan    | nan    |
|  4 | ぽんすけ |      5 | 9:00   | nan    |
|  5 | ぽんすけ |      6 | 18:00  | nan    |
|  6 | ぽんすけ |      7 | 12:00  | nan    |
|  7 | ぽんすけ |      8 | 12:00  | nan    |
|  8 | ぽんすけ |      9 | nan    | 18:00  |
|  9 | ぽんすけ |     10 | nan    | nan    |

# 1つのカラムがNaNじゃないデータを抽出する
```python
df[(df.loc[:, "開始"].notnull() == True)]
```

# 2つのカラム両方NaNじゃないデータを抽出する
```python
df[(df.loc[:, ["開始", "終了"]].notnull() == (True, True)).all(axis=1)]
```

# 2つのカラムどっちかがNaNじゃないければデータを抽出する
```python
df[(df.loc[:, ["開始", "終了"]].notnull() == (True, True)).any(axis=1)]
```

# 「1つのカラムがNaNじゃない」&「1つのカラムがNaN」のデータを抽出する
```python
df[(df.loc[:, ["開始", "終了"]].notnull() == (False, True)).all(axis=1)]
```
Mac 環境構築メモ

MacBookProを購入した際に開発環境構築を行ったのでそのメモ。

## 3本指ドラッグ

https://support.apple.com/ja-jp/HT204609

## デフォルトのシェルをzshからbashに変更

bashに慣れているため変更する。

https://qiita.com/___xxx_/items/c9a30e78196998f4160c

## brewインストール

とりあえずインストール
https://brew.sh/index_ja

```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```

## bashのアップデート

Macのbashはバージョンが古いみたいなのでアップデート
https://qiita.com/zaburo/items/1b990436ca45545959e9
→5.x系にアップデートされた


```bash
$ bash --version
GNU bash, バージョン 5.0.18(1)-release (x86_64-apple-darwin19.5.0)
Copyright (C) 2019 Free Software Foundation, Inc.
```

## Vim設定

とりあえず最低限の設定だけ行う

```:~/.vimrc
syntax enable
colorscheme desert
```

## Gitのアップデート

MacのGitは少し古いみたいなのでアップデート
https://qiita.com/normalsalt/items/f200ba50363ebfd46df0
→v2.28.0にアップデート

```bash
$ git --version
git version 2.28.0
```

## ターミナルを見やすく&Gitのブランチを表示

https://qiita.com/hmmrjn/items/15d0fe15e5d03586ad46

VSCodeのターミナルも文字化けするので下記設定が必要

```json
{
    "terminal.integrated.fontFamily": "Menlo for Powerline"
}
```

## Docker Desktop for Macのインストール

https://hub.docker.com/editions/community/docker-ce-desktop-mac/

## anyenvのインストール

https://anyenv.github.io/

```bash
brew install anyenv
```

```bash:~/.bash_profile
# 追記
eval "$(anyenv init -)"
```

```bash
source .bash_profile
anyenv install --init
mkdir -p $(anyenv root)/plugins
git clone https://github.com/znz/anyenv-update.git $(anyenv root)/plugins/anyenv-update
```

### nodenvのインストール

```bash
anyenv install nodenv
exec $SHELL -l
nodenv --version
```

### pyenvのインストール

```bash
anyenv install pyenv
exec $SHELL -l
pyenv --version

# Pythonインストール
pyenv install <バージョン>
pyenv global <バージョン>
```


### goenvのインストール

```bash
anyenv install goenv
exec $SHELL -l
goenv --version

# Goのインストール
goenv install <バージョン>
goenv global <バージョン>
```

## PyCharmのターミナルシェル変更

https://pleiades.io/help/pycharm/settings-tools-terminal.html

## PyCharmでPipenvを使えるようにする

基本は公式ドキュメントの通りすることで使えるようになる。
https://pleiades.io/help/pycharm/pipenv.html

pyenv環境の場合、PATH指定先を変える必要がある

```bash
$ which python
/Users/xxx/.anyenv/envs/pyenv/shims/python
```

```bash:.bash_profile
# which pythonの/pythonを削除したパスをPATHとして指定する
export PATH="$PATH:/Users/xxx/.anyenv/envs/pyenv/shims"
```

PyCharmを起動してPipenvが自動で検出されていない場合はPCを再起動してみる。

## Java インストール

```bash
brew tap homebrew/cask
brew tap homebrew/cask-versions
brew tap adoptopenjdk/openjdk
brew cask install adoptopenjdk14 # Java14
brew cask install adoptopenjdk15 # Java15
```

### jEnvでバージョンを切り替えられるようにする

```bash
jenv add /Library/Java/JavaVirtualMachines/adoptopenjdk-14.jdk/Contents/Home
jenv add /Library/Java/JavaVirtualMachines/adoptopenjdk-15.jdk/Contents/Home
jenv versions # インストールされているJavaバージョン確認
jenv global <バージョン>
```

## 参考サイト

- https://github.com/AdoptOpenJDK/homebrew-openjdk
- https://qiita.com/seijikohara/items/56cc4ac83ef9d686fab2#jenv%E3%81%AE%E5%88%A9%E7%94%A8
- https://blogenist.jp/2019/06/30/8863/
swift実践入門output　Chapter４ コレクションを表す型　前編

#コレクションとは値の集まりのこと

配列を表す
Array< Element>型

辞書を表す
Dictionary< Key, Value>型

範囲を表す
Range< Bound>型

##配列を表す  Array< Element >型
実際にはArray< Int >型、Array< String >型のように使う

```chapter4.swift
let a = [1,2,3]
let b = ["a","b","c"]

let array :[Int] = []

var strings = ["aaa","bbb","ccc"]
var strings1 = strings[0]
print(strings1)

//aaa

strings[2] = "gagaga"
print(strings)

["aaa", "bbb", "gagaga"]

//末尾に追加
strings.append("yamato")
print(strings)

//["aaa", "bbb", "gagaga", "yamato"]

//任意の位置に追加
strings.insert("mama", at: 2)
print(strings)

//["aaa", "bbb", "mama", "gagaga", "yamato"]


//削除は３タイプ
var integer = [1,2,3,4,5]
integer.remove(at: 2)
integer

integer.removeLast()
integer

integer.removeAll()
integer
```

##辞書を表す　Dictionary<　Key, Value　>型

```chapter4.swift
let dictionary = ["Key":1]
let value = dictionary["key"]
print(value)

//["key": 1]

//変更
var dictionary1 = ["key": 2]
dictionary1["key"] = 1
print(dictionary1)
//追加
var dictionary2 = ["key":3]
dictionary2["key2"] = 4
print(dictionary2)

//["key2": 4, "key": 3]

//削除
var dictionary3 = ["key":5]
dictionary3["key"] = nil
print(dictionary3)

//[:]

```

##範囲型　範囲を表す型

```chapter4.swift
//末尾を含まない範囲　countableRange<Bound>型
let range = 1..<4
for value in range {
    print(value)
}

//1
//2
//3

//... 末尾を含む型 CountableClosedRange<Bound>型

let range2 = 1...4
for value in range2 {
    print(value)
}

//1
//2
//3
//4


let range3 = 1...5
print(range3.upperBound)
print(range3.lowerBound)

//5
//1


//値が範囲に含まれるかの判定

let range4 = 1..<10

print(range4.contains(4))
print(range4.contains(10))

//true
//false
【AzureAD】ユーザプロビジョニングで特定の文字列を含む場合に、違う値をSaaSアプリに組み込む設定をやってみた　

ユーザープロビジョニングはAzureADの属性値をSaaSアプリに連携できる便利な機能ですが、
ADの属性値をそのまま連携させるだけではなく、色々応用が利くように教えて頂いたので自分でもやってみました。3分で読み終わります。

#プロビジョニングの設定


AzureADで以下のユーザーを作りました。
会社ではADのユーザーを特定の文字列と数字の組み合わせを利用して、社員やスタッフ等分けていることがあると思います。
今回はUPNが12ab34＠ドメインのユーザを作成しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/f5c645b5-9db9-ea92-cf4d-a1069d1f5597.png)

userPrincipalNameの文字列が
最初の2文字を数字　次の2文字をアルファベット、後半2文字が数字の場合は、Saasアプリのdivisionに"スタッフ"が入るようにしてみます。

azureADで対象のアプリケーションを開き、プロビジョニング/属性マッピングの画面で、属性の編集画面をひらきます

マッピングの種類を"式"にし、

式に以下設定をいれます。
IIF(IsString(Left([userPrincipalName], 2)), "", IIF(IsString(Mid([userPrincipalName], 3, 2)), IIF(IsString(Mid([userPrincipalName], 5, 2)), "", "スタッフ"), ""))

UPNの左から2文字は文字列でない＝数字
3文字目から2文字（つまり3文字目と4文字目）は文字列
5文字目から2文字（つまり5文字目と6文字目）は文字列でない＝数字

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/5c8692c4-e13c-79d8-5d9c-126d6c06a16f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/6929359a-82b6-0667-9b0e-a3ac0ba51b81.png)

12ab34＠ドメインのユーザーをプロビジョニングしてみます。
今回のように属性マッピングの値を変更すると差分ではなく、フルプロビジョニングが走るのですが、わかりやすいように要求時にプロビジョニングでもやってみます。

要求時にプロビジョニングユーザー単位で出来るので、トラブルシューティングに役立ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/2e56b71a-53c4-5e7e-1ef5-699ec61a8774.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/455d2a31-2052-5dfd-ba0d-7170263e9e91.png)

無事"スタッフ"が反映しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/6dc790ef-2515-b137-badc-1d92008bf3f1.png)

サーズアプリにも連携されてます。部門に"スタッフ"が入っていますね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480057/5cecee04-1a2a-e2dd-cd22-84ab3b1654fb.png)

ADで属性値を作れば解決する話ですが、プロビジョニングの小ネタということでご紹介してみました！誰かのお役に立てれば光栄です
【CRUD】【Django】PythonフレームワークDjangoを使ってCRUDサイトを作成する～1～

# CRUDとは？

Create（登録）、Read（参照）、Update（更新）、Delete（削除）機能のことを指します。
これらの機能をDangoで実装していきます。

# アプリを作るのか

ブログサイトを作りたいと思います。
設計図などは考え中ですが、主な機能を以下に挙げます。

***ブログ機能***

- 記事投稿(Create)
- 記事参照(Read)
- 記事更新(Update)
- 記事削除(Delete)

***ユーザ管理機能***

- ユーザログイン
- ユーザログアウト

## 開発環境を作成する

今回の開発では仮想環境を使っていきます。
仮想環境だとPipFileを参照すれば各パッケージのバージョンがまとまっているので、複数人開発などでは開発環境を共有しやすいと思います。

```python:Pipfile
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]
flake8 = "*"
autopep8 = "*"

[packages]
django = "==3.1.1"

[requires]
python_version = "3.8"
```
ちなみに以下コマンドで私と同じ環境が構築できます。

```python
pip install pipenv 

pipenv shell

pipenv install django==3.1.1

pipenv install --dev flake8 autopep8
```

## プロジェクトを作成する

プロジェクト名は何でもよいのですが、このコマンドで作成されるフォルダはプロジェクト全体の設定ファイル群が格納されるフォルダなのでconfigとしています。

```python
django-admin startproject config .
```

## アプリケーションを作成する

Djangoではプロジェクトの中にアプリ(機能)を作成していきます。
まずは、ブログ機能を作成するのでblogとします。

```python
python manage.py startapp blog
```

アプリを作成したらプロジェクトに「アプリ作成しました！」と設定してあげなければいけません。
/crud/config/settings.pyに以下を追加します。
ついでに言語設定、タイムゾーン設定も行っていきましょう。

```python:/crud/config/settings.py
INSTALLED_APPS = [
    'blog.apps.BlogConfig',
    ***
]

LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'
```

本日はここまでです。以下のようなディレクトリ・ファイルはできているでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763383/44ebfcfd-8f1b-9e1a-c34b-faadb9b873ea.png)


ありがとうございました。
[rails]navbarやヘッダーをTOPページのみ非表示にする

# 概要
railsでオリジナルアプリ製作中に躓いた出来事。
下記の`赤い枠`で囲まれた部分を、部分テンプレートとして呼び出していました。
![スクリーンショット 2020-10-14 21.51.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702799/4468827f-a294-bb20-c935-84abdc8f207c.png)
※↑ユーザー登録画面、作成中なので見づらいです。。


トップページは以下のような構成で、ヘッダーを呼び出したくないので、どうしようかと考えてました。
![スクリーンショット 2020-10-14 21.47.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702799/b350faff-4fd9-b8e6-7ddd-10611d614d18.png)
※↑オリジナルアプリのTopページ

## 部分テンプレートの呼び出し方
トップページ以外には全てヘッダーを表示させたいので`application.html.erb`で部分テンプレートをレンダーしています。

```erb:application.html.erb
<!DOCTYPE html>
<html>
  <head>~省略~</head>
  <body>
    <%= render "shared/header" %>　<%# ここでヘッダーを呼び出している。
    <%= yield %>
    <%= render "shared/footer" %>
  </body>
</html>
```
## current_page?で場合分けしてみた
[こちらの記事](https://qiita.com/ITmanbow/items/dc9b2e2b48f4901049f4)を参考に現在のページがtopページ`(root_path)`でない場合は、部分テンプレートを呼び出さないようにしてみた。

```erb:application.html.erb
<body>
  <% unless current_page?(root_path) %> <%# unlessで現在のページがrootなら呼び出さない
    <%= render "shared/header" %>
  <% end %>
  <%= yield %>
  <%= render "shared/footer" %>
</body>
```

# まとめ
部分テンプレートを呼び出すページを指定する時に、[コントローラーに記載](https://qiita.com/hacchi56/items/afee36935586c5507edd)したり
[JavaScriptで呼び出すページを発火させたり](https://teratail.com/questions/33560)、様々な手段がありそうですが
自分の場合は1ページのみ非表示なのでこのやり方が良いかなと思いました。

もしこの記載方法が推奨されてない理由などありましたら、ご指摘いただければと思います。
Laravel　アウトプット

# controller editアクションメソッドを追加
LaravelではArticleモデルのインスタンスのDI(依存性の注入)が行われます。
DIが行われることで、editアクションメソッド内の$articleにはArticleモデルのインスタンスが代入された状態となっています。
![スクリーンショット 2020-10-14 18.10.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663122/641a5c3a-6dd8-5aed-000b-2957a631ff79.png)
# ログイン
ログインしているIDと記事の投稿したIDが同じであれば表示する。
![スクリーンショット 2020-10-14 18.32.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663122/f22a7e43-f827-7cd4-5cea-5c71978fce95.png)

# Null合体演算子(??)
$article->title ?? old('title')となっているコードの??はNull合体演算子と呼ばれるものです。
null合体演算子は、式1 ?? 式2という形式で記述し、以下の結果となります。

式1がnullでない場合は、式1が結果となる
式1がnullである場合は、式2が結果となる
![スクリーンショット 2020-10-14 18.53.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/663122/d62e3063-bdf9-64aa-959d-6bbb07b00b67.png)
Ruby 文字列の n 文字目と n + 1 文字目

# はじめに
学習用のメモになるます。

## 例題
文字列 s が入力されるので、n 文字目と n + 1 文字目を出力してください。 n + 1 文字目がない場合は何も出力しない

```
入力例1
2
read
```

```
出力例1
e a
```

# ソースコード
```rb

n = gets.chomp.to_i
str = gets.chomp

puts "#{str[n - 1]} #{str[n]}" if str[n]
```

# 解説
```rb
n = gets.chomp.to_i
str = gets.chomp
```

・nに何番目の文字列なのか読み取る
・strで文字列の指定

```rb
puts "#{str[n - 1]} #{str[n]}" if str[n]
```

・この文でstrのn番目の文字とn+1の文字を呼び出している
・if文でstr[n]を記述することで一番初めの文字や最後の文字を呼び出したら出力しないようにしている
＊数字が０から始まってしまうので-1で調整している

# 最後に
if文の説明がわかりづらいかもしれません。
間違っているところがありましたらご指摘いただけるとありがたいです。
環境構築, Build, デプロイまで - Vue-Laravel→Heroku 編 -

#私のスタイル
初めまして。翁と申します。
ミニマルで強迫観念やストレスなく、かつ最大限を提供する
"Huge Minimalism"
を提唱し、スタイルとして活動させていただいてます。
お手柔らかによろしくお願いいたします。

あくまで"より高みへ。"を意識しており
一記事執筆5分以内と制限しております。ご理解いただけたらと思います。

少しでも痒い所に手が届くような貢献が出来たらと思います。

<!-- 
![lo-ske.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791056/d34ae6c5-0abd-c26f-82c3-7c2cce947b29.png)
-->

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/791056/d34ae6c5-0abd-c26f-82c3-7c2cce947b29.png" width="300px">

#デプロイまで

###１．ローカルコミット
基本ルートディレクトリでコマンドを打っていきます。

```
>git init
>git add .
>git commit -m "first commit"
```


```
//ここで行うことで自動でデプロイ先が設定されます。
>heroku create 
```


```php:.git/config
[remote "heroku"]
	url = https://git.heroku.com/okinaofficial.git
	fetch = +refs/heads/*:refs/remotes/heroku/*
```


###２．デプロイ
```
//行く先確認
>git remote -v
heroku  https://git.heroku.com/~~.git (fetch)
heroku  https://git.heroku.com/~~.git (push)
```

```
//Herokuにデプロイ
>git push heroku master
```

```
//App keyを設定する。
//これをする前はアクセスしても500エラーになるはず
>php artisan --no-ansi key:generate --show

>heroku config:set APP_KEY="一つ上の結果"
```

```
//Githubへと
//originを設定
>git remote add origin https://github.com/~~/~~.git

//行く先確認
>git remote -v
heroku  https://git.heroku.com/~~.git (fetch)
heroku  https://git.heroku.com/~~.git (push)
origin  https://github.com/~~/~~.git (fetch)
origin  https://github.com/~~/~~.git (push)

//デプロイ
>git push origin master
```
PHPセキュリティ入門【これだけはやろう】

セキュリティについて、
"安全なWebアプリケーションの作り方 第二版(徳丸浩著)"を読みましたので
アウトプットとして、
細かいところは置いといて
最低限の守るべきところをまとめました！

#### 1. POSTの値を使うときはfilter_inputをかける
#### 2. 外部からコードやファイル名を取り込むのは避け、どうしても使うときはエスケープする
#### 3. バリデーションはアプリケーション要件に沿って行うだけでも効果あり
#### 4. eval関数は使わない
#### 5. APIを呼ぶときはMIMEタイプを正しく指定する
#### 6. hiddenパラメータ、クッキーは書き換え可能という前提を持つ
#### 7. htmlspecialchars関数の文字コード指定は必須
CSS Grid のすべてのプロパティをまとめてみた

## CSS Grid は 2 つのプロパティだけですべてを設定可能

CSS Grid には 15 個のプロパティがあります。そのうち 8 つがグリッドコンテナに設定するプロパティで、7 つがグリッドアイテムに設定するプロパティです。

しかし、実際にはこれら 15 個のプロパティのうち必須なのはグリッドコンテナに設定する `grid` とグリッドアイテムに設定する `grid-area` の 2 つだけです。

なぜそうなるのかという説明の前に、CSS Grid の 15 個のプロパティを見てみましょう。以下がプロパティの一覧です。

グリッドコンテナ用の ８ つのプロパティ：

* grid
* grid-auto-flow
* gird-auto-rows
* grid-auto-columns
* gird-template
* grid-template-areas
* grid-template-rows
* grid-template-columns


グリッドアイテム用の 7 つのプロパティ：

* grid-area
* grid-row
* grid-row-start
* grid-row-end
* grid-column
* grid-column-start
* grid-column-end

お気付きの通り、これらのうちのほとんどのプロパティは `grid` と `grid-area` のロングハンド記法に過ぎません。つまり、`grid` や `grid-area` の機能を細分化して小分けしたプロパティになります。

`grid-template` は `grid-template-rows` と `grid-template-columns` とのショートハンド（簡略表記法）になります。

そして `grid` は `grid-auto-flow`、`grid-auto-rows`、`grid-auto-columns`、`grid-auto-flow`、そして `grid-template` とのショートハンドになります。

`grid-row` は `grid-row-start` と `grid-row-end` とのショートハンドです。

`grid-column` は `grid-column-start` と `grid-row-end` とのショートハンドです。

そして `grid-area` は `grid-row` と `grid-column` とのショートハンドになります。

`grid` と `grid-area` の 2 つのプロパティが他のすべてのグリッドのプロパティの機能を併せ持つため、この 2 つのプロパティだけで CSS Grid のすべてのプロパティを設定可能となっています。

CSS Grid のプロパティは [CSS Grid Layout Module Level 1](https://www.w3.org/TR/css-grid-1/) にて定義されています。

> **[CSS-GRID-1]**
> Tab Atkins Jr.; Elika Etemad; Rossen Atanassov. CSS Grid Layout Module Level 1. 14 December 2017. CR. URL:https://www.w3.org/TR/css-grid-1/

## グリッドアイテムの整列や配置に使用する 12 個のプロパティ

最初に CSS Grid には 15 個のプロパティがあると書きました。しかし、CSS Grid では、グリッドアイテムの整列や配置のために以下の 12 個のプロパティも使用します。

 
グリッドアイテムの整列や配置のための 12 個のプロパティ：

* align-content
* align-items
* align-self
* justify-content
* justify-items
* justify-self
* place-content
* place-items
* place-self
* gap
* row-gap
* column-gap

上記のプロパティは CSS Grid とは別に [CSS Box Alignment Module Level 3](https://www.w3.org/TR/css-align-3/) で定義されています。

> **[CSS-ALIGN-3]**
> Elika Etemad; Tab Atkins Jr.. CSS Box Alignment Module Level 3. 21 April 2020. WD. URL: https://www.w3.org/TR/css-align-3/

## グリッドアイテムの表示順序を指定する `order` プロパティ

CSS Grid では、 Flexbox と同様に `order` プロパティが使用可能です。

任意のグリッドアイテムの `order` プロパティを指定することで、グリッドアイテムの表示順序を HTML 文書の構造をそのままに変えることができます。

order プロパティは [CSS Flexible Box Layout Module](https://www.w3.org/TR/css-flexbox-1/) にて定義されています。

> **[CSS-FLEXBOX-1]**
> Tab Atkins Jr.; et al. CSS Flexible Box Layout Module Level 1. 19 November 2018. CR. URL: https://www.w3.org/TR/css-flexbox-1/

## まとめ

CSS Grid で使用するのは、CSS Grid の 15 個のプロパティと、CSS Box Alignment の 12 個のプロパティ、そして CSS Flexible Box Layout の 1 個のプロパティの計 28 個です。

これらのプロパティを活用して CSS Grid で素敵なレイアウトをつくりましょう。

この投稿が何かしらの役に立てれば幸いです。
BeautifulSoupより気軽に使えるスクレイピング用モジュール「ガスパチョ」

最近知った`gazpacho`というPythonモジュールが素敵だったので紹介します。

## gazpachoとは

gazpachoは、「シンプルかつ高速で、モダンなウェブスクレイピング用のライブラリ」です。

> gazpacho is a simple, fast, and modern web scraping library. The library is stable, actively maintained, and installed with **zero** dependencies.
> (https://pypi.org/project/gazpacho/)

Star数は400とまだマイナーなため、個人利用に留めるのがよいかと思います。

## メリット

- このライブラリひとつで、HTMLの取得と解析ができる
    - `BeautifulSoup`などを使う場合は、まずrequestsなどでHTMLを取得する必要がありました
- 覚えるメソッドが少なくてすむ
    - `find`コマンドひとつで解析します
- 依存しているモジュールがない

## 使い方

まずはモジュールをインストール。

```bash
pip install gazpacho
```

チュートリアルで取り上げられている下記のサイトより、本のタイトルをスクレイピング、出力してみます。

https://scrape.world/books

```python
from gazpacho import get, Soup


# 指定されたURLをもとに、HTMLを取得
html = get('https://scrape.world/books')

# 解析用のインスタンスをつくる
soup = Soup(html)

# 必要な要素を取得。複数見つかればList[Soup]を返す（単数の場合はSoup）
# 1つめの引数はHTMLタグ
# 2つめの引数はidやclassの指定
# 3つめの指定は部分一致を許すかどうか
#   例では、クラスが"book-"となっているので、"book-early"などがマッチする
books = soup.find('div', {'class': 'book-'}, partial=True)

for book in books:
    name_header = book.find('h4')
    # textフィールドにタグの中身が入っている
    name = name_header.text
    print(name)
```

## まとめ

個人的には、下のような感じで使い分けています。

1. 簡単なスクレイピング -> gazpachoを使う
2. gazpachoでは難しい（※） -> selenium(chromedriver-library)BeautifulSoupを使ってなんとかやる

※とくに動的なサイトを指しています。

gazpachoはモジュール自体もシンプルなので、時間を見つけて読んでみようかなと思っています。

この記事を読んで使ってみる人が増えれば嬉しいです！
SwiftでProperty List(.plist)への書き込みと読み込みを実装する

Property List(.plistファイル)へのデータ書き込みとデータ読み込みを、`PropertyListEncoder(Decoder)`と`Codable`に準拠したモデルを利用して行います。

# 前提
Swift: 5.0

# 実装
## モデルの用意
Property Listに保存したいデータのモデルを、`Codable`に準拠する形で作成します。
今回は例として、タイトルと著者名を要素に持つ`Book`をモデルとします。

``` Book.swift
struct Book: Codable {
    var title: String
    var writerName: String
}
```
## データの書き込み
ファイル操作は`FileManager`を用いて行います。
先程用意したモデルを、`PropertyListEncoder`を使ってエンコードすることで、Property Listへの書き込みが行えます。

``` BookManager.swift
class BookManager {
    // 扱うProperty ListのURL Path
    static private var plistURL: URL {
        let documents = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
        return documents.appendingPathComponent("book.plist")
    }

    static func write(book: Book) {
        let encoder = PropertyListEncoder()
        // 保存したいデータをエンコード
        guard let data = try? encoder.encode(book) else { return }
        // すでにProperty Listが存在する場合は上書き。そうでない場合は新しく作成
        if FileManager.default.fileExists(atPath: plistURL.path) {
            try? data.write(to: plistURL)
        } else {
            FileManager.default.createFile(atPath: plistURL.path, contents: data, attributes: nil)
        }
    }
}
```

## データの読み込み
データの書き込みと同様に、ファイル操作は`FileManager`を用いて行います。
`PropertyListDecoder`を用いてProperty Listから読み込んだデータを`Book`モデルにデコードしています。

``` BookManager.swift
class BookManager {
    // 省略 //

    static func load() -> Book {
        let decoder = PropertyListDecoder()
        // 保存先のProperty Listからデータを読み込んでデコード
        guard let data = try? Data.init(contentsOf: plistURL), 
              let book = try? decoder.decode(Book.self, from: data) else { 
              return Book(title: "", writerName: "")
        }
        return book
    }
}
```

# 終わりに
`Codable`及び`PropertyListEncoder(Decoder)`を使うことで、Property List(.plist)でのデータ操作を楽に実装することができました。

# 参考
- [Using Swift Codable With Property List](https://useyourloaf.com/blog/using-swift-codable-with-property-lists/)
- [Reading and writing Property List files with Codable in Swift](https://www.donnywals.com/reading-and-writing-property-list-files-in-swift/)
（自分用）スムーズにいかなかった点と解決方法①

自分用で投稿しますが、参考になれば幸いです。


1.floatを使用して二つの要素を左右に並べたときに下の要素が上に押し寄せてきた。
　→floatさせた要素に対して高さを持たせる。

2.aタグの下線を消したい。
　→aタグのcssにtext-decoration: none; を入力する。

3.liタグをdisplay: flex;で横並びにした時に、先頭のli要素の左側に謎の隙間が存在していた。
　→ul要素にpadding-left: 0; を指定する。

4.liタグをdisplay: flex;で横並びにした時に、中の文字数によって枠の大きさが変わってしまう。
　→下記3点を満たすとき、自動で均等幅になる。
　 ・display: flex;の要素が改行不可
　 ・子要素の幅がすべて統一指定
　 ・子要素の幅合計が親要素の幅を超える(width: 100%;を指定する)

5.liタグの中にあるaタグの縦位置を中央に揃えたい。
　→aタグにmarginを設定する
[ Ruby ]クラスインスタンス変数などなど

# はじめに
ここでは、rubyのクラス変数やインスタンス変数、アクセサなどの
基礎となる部分を書いていきます。

## クラス変数
そのクラス自身、サブクラスや
クラスメソッド、インスタンスメソッドから参照することができる変数です。

定義の仕方は頭に`@@`を付けます。

```
class SuperKlass
  @@super_klass_var = :super_klass_val
end

class Klass < SuperKlass
  @@class_var = :class_val
  def self.class_method
      puts "class_method called"
      puts @@super_klass_var
      puts @@class_var
  end

  def instance_method
      puts "instance_method called"
      puts @@super_klass_var
      puts @@class_var
  end
end

klass_instance = Klass.new
Klass.class_method  
  # => class_method called
  # => super_klass_val
  # => class_val
  
klass_instance.instance_method
  # => instance_method called
  # => super_klass_val
  # => class_val
```

## インスタンス変数
インスタンス変数に値を保持することで、オブジェクト固有の状態を保持できるようするものです。
なお、インスタンス変数はオブジェクトの外部からは直接アクセスすることが出来ないため、
アクセスするために`attr_accessor`メソッドを使用する必要があります。

```
class Famiry
  attr_accessor :name
end

father = Famiry.new

father.name
# => nil
father.name = "Namihey"
father.name
# => Namihey
```

attr_accessorを使用しない場合はNoMethodErrorとなります。

```
class Famiry
end

father = Famiry.new

father.name = "Namihey"
# => undefined method `name=' for #<Famiry:0x00007f8a97908bd8> (NoMethodError)
```

なお、インスタンスメソッド内で頭に`@`を付けるて定義すると、インスタンス変数になります。

```
class Geinin
  def initialize(val)
    @val = val
  end

  def tukkomi
    puts @val
  end

end

east = Geinin.new("なんでだよ")
east.tukkomi

north = Geinin.new("なんでやねん")
north.tukkomi
```

### attr_accessor
インスタンス変数に対して、`参照`、`代入`を許可するメソッドです。
代入は拒否し参照のみを許可する場合は`attr_reader`
参照は拒否し代入のみを許可する場合は`attr_writer`
などを使い分けます。
このようなメソッドを`アクセサ`と呼びます。

なお、上記のメソッドを使用することで以下のメソッドが定義されます。

```
# 参照メソッド
def name
  @name
end

# 代入メソッド
def name=(val)
  @name = val
end
```

## クラスインスタンス変数
クラスはClassクラスのオブジェクトであるため、クラスオブジェクト自体に
インスタンス変数を持たせることができます。

selfがクラスを指すコンテキストで、上記のインスタンス変数と同じように
頭に`@`をつけて定義するとクラスインスタンス変数となります。

なお、参照できるのも`self`がクラスを指すコンテキスト内となります。

```
class klass
  # 定義
  @class_instance_val = :class_instance_val
    
  def self.class_method
    # 参照
    @class_instance_val
  end
end
```

#### クラス変数とクラスインスタンス変数の違い
クラス変数とクラスインスタンス変数が、同じように感じるかもしれませんが
クラスインスタンス変数は、クラスオブジェクトのインスタンス変数であるため
そのクラスで定義されたインスタンスメソッド内では、参照することができません。

また、クラス変数はそのクラスを継承したクラスから参照、変更できますが
クラスインスタンス変数はできません。
まとめると、以下の2点が違いです。

- インスタンスメソッドから参照
    - クラス変数・・・できる
    - クラスインスタンス変数・・・できない
- 継承したクラスから参照、変更
    - クラス変数・・・できる
    - クラスインスタンス変数・・・できない

# おわり
うちの子（VRoid製アバター）は身長何センチなのか？

緊急事態宣言あたりからVRイベントの沼にズブズブ嵌っています。
これは業務だ…業務なんだ……。

閑話休題。

VRoidで可愛い子を作ったはいいけど、どのくらいの身長が適切なのか？
と悩んだわけです。
可愛ければいいんだよ！
はい正論。

でもほら、設定って大事じゃん？
中学生の頃、推しキャラの身長体重暗記したじゃん？？？（しないか？）

しかもVRoidは脚とかを長くすると比率が変わるのではなく、身長が伸びる。
のでリアル身長がよくわからなくなる。
自分の探した範囲では公式で出してるキャラの設定身長くらいしか出てこなかったので、メモ。
このためにClusterでワールド自作したよ。

# 前提条件
- VRoid Studio ver0.11.2（2020/10時点最新）
- 女子素体のみ
- 厳密には、数字手打ちで限界突破が可能だが、そこまではやらない
- 頭身パラメータはうちのこ標準をベースとする（ちょっと胴が短く、頭小さめ）


# 結果
スクショー！
![VRoid身長.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570991/0718305c-c482-72af-74f8-21f96f5ccc28.png)

# 詳細
- 箱アバター
    - 130cm…？
    - 浮いてるし
    - 頭になんか生えてるし
    - まあでも一人称視点としてはこれくらい
- 小人さん
    - 80cmくらい
    - 全身：身長を低く=1
    - 腰：胴を短く=1
    - 脚：脚を短く=1
- 幼女
    - 110cmくらい
    - 全身：身長を低く=1
    - 小学一年生幼女先生
    - VR界隈にはたくさん生息している気がする（偏見）
- うちのこ（仮）
    - 155cmくらい
    - 全身：身長を低く=0.13
    - 腰：胴を短く=0.37
    - 脚：脚を長く=0.1
    - すらっとさせつつ、やや幼め？に調整したつもりが、女性の標準身長くらいか…（悩
- 女子標準
    - 165cmくらい
    - 全身：身長を低く=0、身長を高く=0
    - 現代っ子！
- のっぽさん
    - 185cmくらい
    - 全身：身長を高く=1
    - パリコレモデルかな？
- ナナちゃん
    - 210cmくらい
    - 全身：身長を高く=1
    - 腰：胴を長く=1
    - 脚：脚を長く=1
    - なんか名古屋の駅前にいるとかいうあれ




以上、報告になります。


このために3時間くらいで作ったワールド。
clusterたのしいよ！！！！！

[アバター身体測定室｜バーチャルSNS cluster（クラスター）](https://cluster.mu/w/3a15b2a0-9a7c-4d53-bbdf-0117aa7ee5df)
【活性化関数】活性化関数の基礎

最初に断って起きますが、間違いあったらすみません><

とりあえず有名な活性化関数の良い所と悪い所を見て行きたい！


<h1>活性化関数に求められること</h1>

1. 非線形である事=>非線形を表現する為に活性化関数を使うのに線形だったら意味がない！

2. 負の入力に対して出力の値がほぼ0であること=>データには無視したい情報(ノイズ)があり、それを無視する為負の値の入力に対して出力は0を出力すると良い？(ちょっと定かではない)

3. 微分の最大値が1であること=>勾配を計算していくのに活性化関数の微分を何層も掛けていく時、1以下の値を掛けると0に近づいていく。

4. 活性化関数滑らかであること=>連続的な関数の方が精度が良くなる



<h1>sigmoid</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/b0ff01f3-eea2-9db7-5bcf-5c8f2e1b4851.png)

sigmoidの微分の最大値は0.25となっているため、sigmoid関数をかけ合わせていくと値がどんどん小さくなり、勾配消失問題を起こす。



<h1>tanh</h1>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/ddd02e07-446a-1802-0ea8-401b2a4777ea.png)

最大値が1となりsigmoidであった勾配消失問題が起こりにくくなった。
入力が極端に大きい所と小さい所では微分が0になる問題がある。学習が進まないよ〜



<h1>ReLU</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/87e41fce-dfbc-57f8-76fc-2f8019ed7268.png)

利点は正の入力の時傾きが1になり勾配消失が起きないこと。欠点は負の入力の時傾きが0になり学習が進まないこと。


<h1>leaky-ReLU</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/512a34ca-f499-6548-e9a1-f11300e1729e.png)

ReLUの入力が負の時に学習が進まない問題に対して負の入力が来た時に小さな傾きをつける。
でもあんまり効果がなかったっていう人がいた。


<h1>Swish</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/3dd33e76-9e36-d8bb-4c7c-6d4544be7c8f.png)

ReLUに近いが滑らかな点が精度を上げてれる。ただ計算コストがちょいと上がる。

<h1>Mish</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/a9ad498a-fda6-ba88-27cb-47e99f538163.png)

Swishの進化系？1次微分の傾きがより急なので、収束が早い。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/046ffe38-1dca-f989-1ce3-057f138ded93.png)


<h1>tanhExp</h1>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/34a571a0-b138-8284-0d59-61b43682a449.png)

Swishの進化系？Mishより1次微分の傾きがより急なので、収束が早くなる所が良い所?!(後日論文確認します)
勾配が1を超えている範囲が小さくなっているのも高評価！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482094/f106de6b-1e46-ea09-5172-baf6099912cf.png)


<h1>結論</h1>
絶対じゃないけどこの4つが活性化関数では重要そう
1. 非線形である事
2. 負の入力に対して出力の値がほぼ0であること
3. 微分の最大値が1であること
4. 活性化関数滑らかであること



<参考文献>
Swish
https://arxiv.org/pdf/1710.05941.pdf
Mish: A Self Regularized Non-Monotonic
Activation Function
https://arxiv.org/pdf/1908.08681v3.pdf
活性化関数一覧 (2020)
https://qiita.com/kuroitu/items/73cd401afd463a78115a
javascriptのLocalStorage を使ってお気に入り機能を自作してみた ①準備編

# どうも7noteです。プラグインより多機能なお気に入り機能を作成。まずは準備編。

どうも7noteです。
この記事は以下へ引っ越しました。

https://naruweb.com/coding/jsfavorite-1/
[ Ruby ]クラスメソッド、インスタンスメソッドなど

# はじめに
前回は、クラスの継承やネストなどの記事を書きましたが、
今回はクラスメソッドなどの基礎知識を書いていきます。

## メソッド
### クラスメソッド
その名の通り、クラスオブジェクトが呼び出せるメソッドです。

インスタンスオブジェクトでは呼ぶことが出来ません。
そのため、よく対比されるものとして、`インスタンスメソッド`がありますが
これについては後述します。

定義の仕方として以下の方法があります。


##### メソッドを定義する際にメソッド名の前に self. を付ける
メソッド内で自身のクラスをレシーバとする際は、`クラス名`や`self`を
省略することが出来ますが、定義の際の`self`は省略できません。

```
class Klass
  def self.method_a
    new
    puts "created Klass instance"
  end
end

Klass.method_a
# => created Klass instance
```

##### class << self, end で囲む
この間に定義されたものは、全てクラスメソッドとなるため
複数定義する際に便利です。

```
class Klass
  class << self
    def method_a
      new
      puts "created Klass instance"
    end
  end
end

Klass.method_a
# => created Klass instance
```

ちなみに、これに近い形でこのようにも出来ます。

```
class Klass
end

class << Klass
  def method_a
    new
    puts "created Klass instance"
  end
end

Klass.method_a
# => created Klass instance
```

### インスタンスメソッド
インスタンスオブジェクトが呼び出せるメソッドです。
こちらは、先ほどのクラスメソッドとは対象に
クラスオブジェクトからは呼び出すことができません。

定義の方法は以下です。

```
class Klass
  def method_a
    puts "method_a called"
  end
  
  def method_b
    method_a
    puts "method_b called"
  end
end

klass_instance = Klass.new
klass_instance.method_b
# => method_a called
# => method_b called
```

### 特異メソッド
オブジェクト固有のメソッドのことです。
定義するメソッド名の前に、オブジェクト名を書くことで定義できます。
なお、定義する際に、そのオブジェクトが既に存在していないといけません。

```
class Klass
end

apple = Klass.new
orenge = Klass.new

def apple.tokui_method
  puts "I'm apple"
end

apple.tokui_method
# => I'm apple
orenge.tokui_method
# => undefined method `tokui_method'
```

もしも定義する際にその指定するオブジェクトが存在していなかった場合、エラーとなります。

```
class Klass
end

def apple.tokui_method
  puts "I'm apple"
end

apple = Klass.new

apple.tokui_method
# => undefined local variable or method `apple' for main:Object (NameError)

````

特異メソッド内で`super`を呼ぶと、クラスに定義されている同名のメソッドが呼ばれます。
また、そのメソッドのオーバーライドが出来るという便利な点もあります。

```
class Klass
  def my_name
    puts "I'm fruits"
  end
end

apple = Klass.new
orenge = Klass.new

def apple.my_name
  super
  puts "I'm apple"
end

apple.my_name
# => I'm fruits
# => I'm apple
orenge.my_name
# => I'm fruits
```

# おわり
【React+TypeScript】GETエラーを感知して、404ページに遷移させる

めちゃめちゃ久しぶりの投稿です。
先日までコミットしていたプロジェクトの中で自分のリサーチとスキルではどうにもできなかった404ページへのリダイレクトの処理について。
先輩に教えていただいたので備忘録として書いておきます。
# 今回実現させたかったこと
今回実現させたかったのは、大きく分けて2つです。

- **/hogehoge/token**のようなURLが叩かれたときにtokenが正規のものか判断する
- 正規のものである場合、tokenが合致するデータをデータベースからGETする
- 正規のものでない場合、404ページへリダイレクトさせる

これらをReact+TypeScriptのプロジェクト内で実現させるというタスクでした。

# 行き詰まった点
**「tokenが正しいかどうかとか、どうやって判断したらいいん。。。」**
大きくいってこの点でした。
今までHTMLとCSSでやってきたので、もう何を使えばいいんかもわからずどう調べればいいのかも分かりませんでした。

あとは今までリダイレクトさせる処理は**.htaccess**で記載してたので、それ以外でどうやった手法があるのかもわからず行き詰りました。

## エラーを検知するtry...catch文
tokenの正誤判別にはtry...catch文を使いました。
MDNのドキュメントのリンクを貼っておきます。

[try...catch文](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Exception_Handling_Statements/try...catch_Statement)

で、サンプルコードです。

```
try {
  // テストする文
}
catch (e) {
  // エラー時に走る処理
}
```
このような感じにtry...catch文は使われます。
なので、今回私が実現したかったことを実現しようとすると


```
try {
  const { data: hogehogeList } = await request.get({
    uri: '/hoge',
    params: { token },
  });
}
catch (e) {
  // リダイレクト処理
}
```
みたいな書き方になります。
こうすることで、tokenが正規のものである場合はデータベースから該当するリストをGETしてきて、
もしtokenが正規のものでない場合は、errorとなりリダイレクトの処理が走ります。

ちなみにuriはAPIが置いてある場所で、paramsはデータをGETする際に必要なパラメータです。

## リダイレクト処理をさせるモジュールhistory
リダイレクトさせるにあたって、今回はhistoryというモジュールを使用しました。

[history](https://www.npmjs.com/package/history)

これを使用してリダイレクトの処理を実装しました。
参考にした記事は以下の記事になります。

[history.push();でアクションを起こした時にページ遷移をする](https://qiita.com/kuropp/items/b1d35e43af6bc248b911)

実際に書いたコードは以下になります。

```
try {
  const { data: hogehogeList } = await request.get({
    uri: '/hoge',
    params: { token },
  });
}
catch (e) {
  history.push('/not-found');
  window.location.reload();
}
```
このようにすることで、先ほど書いたGETが失敗に終わった際には
404ページに遷移させることができました。

# まとめ
今回の総括ですが、

- try...catch文を使うことで、ある処理が失敗したときには別処理を走らせることができる
- historyを使うと、遷移させたいページに遷移させる処理を行うことができる

なお、このプロジェクトではreact-router-domを使用してルーティングさせてましたので、
上記の処理を実装する流れとなりました。

先輩曰く、もっと良い処理があるらしいのですがそれはまた別の機会に。
JLD2を使って計算結果を保存しグラフを描く

# 序
私はこれまで数値計算の結果の保存にCSVフォーマットを用いていました。
しかし結果が増えるにつれファイルの管理が大変になったので，階層構造を使えるJLD2に目を付けました。
そこで今回の目的は
1.JLD2フォーマットでデータを書き込む
2.データを読み込んでグラフを作成する
とします。
他に階層構造を使えるフォーマットにHDF5とJLDがあり，HDF5とJLDとJLD2の違いは@Lirimy様の"[Julia でデータを読み書きする](https://qiita.com/Lirimy/items/04dde74376e04d607f80)”の記事内にあります。

# 環境
* Jupyter Lab v1.2.6
* julia v1.4.0
* JLD2 v0.2.3
* Plots v0.29.9

#1.JLD2フォーマットでデータを書き込む
保存するデータとして，適当なエルミート行列

```math
H = \left[
\begin{array}{ccc}
\epsilon_1+2t\cos k&s&0\\
s&\epsilon_2+2s\cos k&s\\
0&s&\epsilon_3+2t\cos k
\end{array}
\right]
```
の固有値と固有ベクトルを保存することにします。
用いるパッケージを宣言し，固有値を計算する関数を以下のように書きます。

```julia:
using JLD2
using LinearAlgebra
using Plots
gr(framestyle=:box)

function egtest(k)
    #適当なパラメータ
    ϵ1 = -1.0
    ϵ2 = 0.0
    ϵ3 = 1.0
    t = -2.0
    s = 1.0
    H = [ϵ1+2*t*cos(k) s 0.0;s ϵ2+2*s*cos(k) s;0.0 s ϵ3+2*t*cos(k)]
    v,w = eigen(H)
    return v,w
end
```

続いてパラメータ$k$を$-\pi$から$\pi$まで変化させたときの固有値と固有ベクトルを
"example.jld2"に書き込みます。

```julia:
function test_write()
    k = collect(-pi:0.01*pi:pi)
    val1(k) = egtest(k)[1][1]
    val2(k) = egtest(k)[1][2]
    val3(k) = egtest(k)[1][3]

    vec1(k) = egtest(k)[2][1]
    vec2(k) = egtest(k)[2][2]
    vec3(k) = egtest(k)[2][3]


    jldopen("example.jld2", "w") do file
        file["eig/k"] = k
        file["eig/value/1"] = val1.(k)
        file["eig/value/2"] = val2.(k)
        file["eig/value/3"] = val3.(k)

        file["eig/vector/1"] = vec1.(k)
        file["eig/vector/2"] = vec2.(k)
        file["eig/vector/3"] = vec3.(k)
    end
end
test_write()
```

ここで

```julia:
jldopen("example.jld2", "r")
```

を実行すると下図のように階層構造になっていることが分かります。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677437/76520537-d3db-fb6d-3b05-440301d29f3b.png)

これで書き込みは完了です。

#2.データを読み込んでグラフを作成する
structを定義してその中にデータをいれます。

```julia:
struct dispersion
    k::Array{Float64,1}
    E1::Array{Float64,1}
    E2::Array{Float64,1}
    E3::Array{Float64,1}
end

function data_arr()
    jldopen("example.jld2", "r") do file
        k = file["eig/k"]
        E1 = file["eig/value/1"]
        E2 = file["eig/value/2"]
        E3 = file["eig/value/3"]
        return dispersion(k,E1,E2,E3)
    end
end

plot(data_arr().k,[data_arr().E1 data_arr().E2 data_arr().E3])
savefig("test.png")


```

プロットしてみると以下のような図が得られます。

![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/677437/61ed29f8-4253-e56b-e8e4-b642007ea995.png)

一応これでプロットできましたので目的達成です。

#参考文献
JLD2公式ドキュメント: https://github.com/JuliaIO/JLD2.jl

@Lirimy様 Julia でデータを読み書きする: https://qiita.com/Lirimy/items/04dde74376e04d607f80
pandasのread_excelでExcelファイルを読み込んだ後の型

`pandas.read_excel`でExcelを読み込んだ後のデータ型はExcelでの書式設定が影響するようなのでちょっと気になったので実験してみた。ちょっとづつ貯めていく。

![スクリーンショット 2020-10-14 21.01.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/a2cdfdc9-ec9e-df51-dd36-f0344d9fd4c7.png)


# 日付
- 環境
    - macOS Catalina バージョン10.15.7
    - Microsoft Excel for Mac バージョン16.42
    - Python 3.8.5
    - pandas 1.1.3


|Excel書式(分類)|Excel書式(表示)|pandasで読み込んだ後の型|
|:-:|:-:|:-:|
|標準|43831|int|
|日付|2020/1/2|datetime.datetime|
|日付|2020年1月3日 金曜日|datetime.datetime|
|日付|2020-01-04|pandas.Timestamp|
|日付|2020年1月5日|pandas.Timestamp|
|日付|2020年1月|pandas.Timestamp|
|日付|1月7日|pandas.Timestamp|
|日付|2020/1/8|pandas.Timestamp|
|日付|2020/1/9 12:00 AM|pandas.Timestamp|
|日付|2020/1/10 0:00|pandas.Timestamp|
|日付|1/11|pandas.Timestamp|
|日付|1/12/20|pandas.Timestamp|
|日付|01/13/20|pandas.Timestamp|
|日付|14-Jan|pandas.Timestamp|
|日付|15-Jan-20|pandas.Timestamp|
|日付|16-Jan-20|pandas.Timestamp|
|日付|Jan-20|pandas.Timestamp|
|日付|January-20|pandas.Timestamp|
|日付|J|pandas.Timestamp|
|日付|J-20|pandas.Timestamp|

- [pandas.read_excelで読み込んだExcelの日付がシリアル値だったのでdatetime.datetimeに変換した - Qiita](https://qiita.com/ponsuke0531/items/4ddbc6438a817790dfa3)

# 時間
- 環境
    - macOS Catalina バージョン10.15.7
    - Microsoft Excel for Mac バージョン16.42
    - Python 3.8.5
    - pandas 1.1.3


|Excel書式<br/>(分類)|Excel書式<br/>(種類)|Excel書式<br/>(表示)|Excel値|pandasで読み込んだ後の型|
|:-:|:-:|:-:|:-:|:-:|
|ユーザー<br/>定義|24時未満<br/>[h]:mm|0:00<br/>23:59|0:00:00<br/>23:59:00|datetime.time(00:00:00)<br/>datetime.time(23:59:00)|
|ユーザー<br/>定義|24時以降<br/>[h]:mm|24:00<br/>26:00|1900/1/1 0:00:00<br/>1900/1/1 2:00:00|datetime.datetime(1900-01-01 00:00:00)<br/>datetime.datetime(1900-01-01 02:00:00)|
|時刻|-|10:00||datetime.time|

- [pandas.read_excelで読み込んだ24時以降の時間は隣接するセルによってデータ型が変わる？ - Qiita](https://qiita.com/ponsuke0531/items/f91434566c4aa4a9684b)
【エラー】canvasでSecurityError: The operation is insecure が出て困った

# 状況
Webでcanvasを使った開発をしている際にエラーに遭遇（iOS13 safari）
※しかし何故かPC ChromeやiOS14ではエラーが出ず正常に動作。

# エラー内容
```
SecurityError: The operation is insecure
```
このようなエラーが`canvas.toDataURL();`の部分に出ていました。
このcanvas書き出し前に、srcが外部ページの静止画をdrawImageしていたのでどうやらここのCORSが原因ぽい。

# 試して失敗したこと
canvasにdrawImageしている画像は、JS側で`new Image();`で生成していたので
同じようにJS側で以下のようにcrossOriginを設定しました。

```script.js
img.crossOrigin = "Anonymous";
```

これでPC Chrome、iOS14などではエラーがなくなりましたが
iOS13ではエラーが出現。。。

# 成功したこと
JSで生成していた画像をそもそもhtml側で用意して置いとくことにしたらエラーが消えました。


```index.html
<img crossOrigin="Anonymous" id="canvas-img" class="canvas-img" src="">
```

```style.css
.canvas-img {
  display: none;
}
```

```script.js
canvasImg = document.getElementById("canvas-img");
context.drawImage(canvasImg, x, y, w, h);
```
AWS Lambdaでmimetypesを使う際はtypes_mapを確認しよう(Python)

## 前提・環境
AWS Lambda Python環境

## 事象

AWS LambdaのPython環境で`.webp`を`guess_type`しようとしたところ。

```python:
import mimetypes
print(mimetypes.guess_type('.webp'))
# none
```

noneになってしまった。

```python:
import mimetypes
print(mimetypes.types_map['.webp'])
# none
```

types_mapにwebpが存在しないので、追加してあげて

```python:
import mimetypes
mimetypes.add_type('image/webp', '.webp')
print(mimetypes.guess_type('.webp'))
# image/webp
```

解決した。

## まとめ
mimetypesの辞書は環境依存なので、`guess_type`や`guess_extention`できないときは辞書に対象が存在するか確認する。
存在しない場合は`add_type`で追加することができる。

参考)https://note.nkmk.me/python-mimetypes-usage/
Ruby  length,size,count使い方

# はじめに
学習用のメモになります。
rubyでは配列の要素数を取得するためにlengthメソッド、またはsizeメソッドを使用します。

また、条件を指定して配列の要素を取り出すにはcountメソッドを使用すると便利です。

この記事では、基本的な使い方を学習していきます。

# lengthメソッド
配列に入っている要素の数を知りたい場合は「lengthメソッド」か「sizeメソッド」を使用しますが、lengthにはarrayクラスとstringクラスの二種類があります。

arrayクラスのlengthメソッドは配列に対して使用し、配列の要素数を返します。

また、strignクラスのlengthメソッドは文字列が入っている変数に対して使用すると文字の数を返します。

```
array  = ["red","blue","yellow"]
str = "エンジニア"
 
p array.length
p str.length
```
[実行結果]

```
3
6
```

# sizeメソッド
sizeメソッドはlengthメソッドとまったく同じ結果を返します。

```
array  = ["red","blue","yellow"]
str = "エンジニア"
 
p array.size
p str.size
```
[実行結果]

```
3
6
```

# countメソッド
配列の要素を条件付きで数えたい場合はcountメソッドを使用します。

引数に条件を指定することで条件に合った要素の数だけを取得できます。

“red”の要素数が知りたい場合、

```
array = ["red","blue","yellow","red","green"]
p array.count("red")
```

[実行結果]

```
2
```

他にも引数にブロックを渡すことで少し複雑な条件を指定することもできます。

要素を２で割った余りが０の数、つまり偶数の数を数えてみましょう。

```
array = [1,2,2,2,3,3,4,5,]
p array.count{ |num| num % 2 == 0}
```

[実行結果]

```
4
```
また、引数を指定しないでcountメソッドを使用した場合はlengthやsizeと同じように要素数を返します。

## countでnil(空の要素)を除いた要素数を数える方法

配列にnilが入っていた場合、nilをカウントしたくない！という時にはcountメソッドに条件を指定します。

```
array = ["red","blue",nil,"yellow"]
p array.count{ |num| !num.nil? }
```
[実行結果]

```
3
```

# 最後に
今回は length,size,countメソッドの使い方について学習しました。
もし間違っているところがあればご指摘いただけると幸いです。