OmniAICreator/Qiita-1.07M huggingface dataset:
正規表現をデータとして扱う

正規表現はお好きでしょうか？この記事では、プログラミング言語Clojureで正規表現を通常より簡単に作成する方法を紹介しています。

## モチベーション

正規表現は複雑なものになると、かなりのタイピングを要し、ミスを犯しやすくなりがちです。

例えば、以下の正規表現

(?:(\w+)(?:\p{Space}*,\p{Space}*)(\w+)\p{Space}+(\d+)(?:\p{Space}*,\p{Space}*)(\d+))

は

Friday, December 27, 2019

のように表記された日付をパースするものですが、これを手動で作成するのはかなり苦痛です。

Emacsの[rx](https://www.emacswiki.org/emacs/rx)というライブラリーをご存じでしょうか。このライブラリーで提供されているrxというマクロを使うと上記のような正規表現をEmacsLispのコードから作成できるため、非常に便利だと感じました。

これと同様のことをClojureでもやりたいと思い、以下のような実装を試みました。

## 実装

### 準備

ネームスペースで

```clojure
(ns rx.core
  (:require [clojure.string :as str])
  (:refer-clojure :exclude [and or + * set repeat]))

(alias 'c 'clojure.core)
```
Clojureの正規表現はJavaクラスjava.util.regex.Patternやjava.util.regex.Matcherを使用しています。（以下Pattern, Matcherなどと表記）

Patternに対してstrを適用すると、正規表現を文字列として返します。

```clojure
(str #"\w")
;; => "\\w"
```
このことを利用し、正規表現を生成する関数を作成していきます。

### 定数を定義

```clojure

(def word  "\\w")

(def whitespace "\\s")

(def digit "\\d")

(def alnum "\\p{Alnum}")

(def space "\\p{Space}")

(def begnning-of-line "^")

(def end-of-line "$")

(def word-boundary "\\b")

(def non-word-boundary "\\B")

(def anything ".")

;; etc ...
```

### 論理オペレーター

```clojure
(defn non-capturing-group-s [s] (format "(?:%s)" s))

(defn and [& args]
(-> (map str args) str/join non-capturing-group-s re-pattern))

(defn or [& args]
  (->> (map str args) (str/join "|")   non-capturing-group-s re-pattern))
```
上記のand,orでは、任意個数の文字列あるいはPatternオブジェクトを受け取り、対応する正規表現を返します。

```clojure
(def re(or (and alpha digit) (and digit alpha)))

re
;; => #"(?:(?:\p{Alpha}\d)|(?:\d\p{Alpha}))"

(re-matches re "1a")
;; => "1a"
(re-matches re "a1")
;; => "a1"
(re-matches re "aa")
;; => nil
```
以下、同様のやり方で正規表現の文法に対応する関数を作っていきます。

### quantifier,set,groupなど

```clojure
(defn + [re] (re-pattern (str re "+" )))

(defn * [re] (re-pattern (str re "*")))

(defn ? [re] (re-pattern (str re "?")))

(defn set [& args] (re-pattern (format "[%s]" (str/join (map str args)))))

(defn except [& args] (re-pattern (format "[^%s]" (str/join (map str args)))))

(defn group [re] (re-pattern (format "(%s)" re)) )

(defn repeat
([n re] (re-pattern(format "%s{%s}" re n)))
([n m re](re-pattern (format "%s{%s,%s}" re n m))))

(defn at-least [n re] (re-pattern (format "%s{%s,}" re n)))
```
## 簡単な使用例

これまで定義した関数を使って、冒頭で触れた日付をパースする正規表現を作ってみます。

```clojure
(def sep (and (* space) "," (* space)))

(def date
  (and
   (group (+ word))
   sep
   (group (+ word))
   (+ space)
   (group (+ digit))
   sep
   (group (+ digit))))

(re-matches date "Friday, December 27, 2019")
;; => ["Friday, December 27, 2019" "Friday" "December" "27" "2019"]
```
この例では、groupでグループ化を行い、「曜日」、「月」、「日」、「年」に相当する部分を取り出しています。

## まとめ

EmacsLispとClojureはともにLispに属する言語なので、やはり互換性が高いと言えるでしょう。一般に、多くの言語に触れ、良いと思った機能を他言語で実装できることは素晴らしいと思います。とくにClojure含むLisp系の言語はマクロがあるため、DSL（Domain Specific Language)開発の可能性が開かれています。今回はマクロは使いませんでしたが、個人的にClojureマクロによるDSLの可能性に大きな魅力を感じています。
初学者によるプログラミングMemo　#7       スコープの概念

# はじめに
今回はスコープの概念についてお話しします
なお、本記述はMacにおいて、Railsでの開発を前提としています
また、まだまだひよっこですので、不備等ございましたらご指摘いただけると幸いです

# 目次
- スコープとは
- 田中呼び捨て
- ちゃんと呼んであげよう
- まとめ

## スコープとは
変数には、その変数が使える範囲というものが決まっています
これをスコープと言います
このスコープの範囲の外から変数を使おうとするとエラーが起こります
基本的にはメソッド内ではメソッド内で定義した変数しか使えません
これでは不便でならないので、引数（ひきすう）という概念を使います

### 引数とは
メソッドなどに渡すことのできる値のこと
スコープの外にある変数をメソッドの中で扱うことができます
メソッドの定義時に"()"の中に記述します

```
def test(argument)
  argument ** 2
end
```
これは仮引数と呼ばれます
また、呼び出し時にも同様に"()"内に渡す値を記述します

```
def test(argument) // ← 仮引数
  argument * 2
end

test(3) // ← 呼び出し（実引数）
```
仮引数とは対照的にこちらは実引数（本引数）と呼びます
上記の場合、"3"が"argument"に渡され、メソッド内で計算されます
ではここで、田中さんを呼んでみましょう

## 田中呼び捨て
先ほどスコープと引数の概念を述べました
以下のプログラムで田中さんを呼んでみましょう

```
  def call(name)
    name = "Mr.#{name}"
  end

  name = "Tanaka"
  call(name)
  puts name
```
どうでしょう
"Mr.Tanaka"と表示されたでしょうか
されませんでしたよね
結果は"Tanaka"と呼び捨てになってしまいました

### スコープの範囲
"call(name)"でメソッドを呼び出し、"name = "Mr.Tanaka" "としたはずがどうしてこうなってしまったのでしょうか
これは先ほど述べたスコープの範囲を外れているからです
"puts name"で呼び出せる"name"は"name = "Tanaka" "の"name"であって、"call(name)"メソッドの中の"name"とは全く別物だからです
ここで返り値という概念も説明します

### 返り値
返り値とは、そのものが結果としてどういう値を持っているかということです
メソッドの返り値がわかりやすいので今回の例で説明します
今回、"name = "Tanaka""によって"name"に"Tanaka"を代入しました（ここでの"name"の返り値は"Tanaka"とも言えます）
そして"call(name)"メソッドを使い、メソッド内で"name（先ほどとは別物）"に"Mr.Tanaka"を代入しました
ここまではいいでしょう
しかし、最初の"name"の返り値は"Tanaka"から変わっていません
今返り値が"Mr.Tanaka"となっているのは**"call(name)"メソッド内の"name"**と**"call(name)"メソッド自体**です

## ちゃんと呼んであげよう
前述したことを踏まえると

```
  def call(name)
    name = "Mr.#{name}"
  end

  name = "Tanaka"
  puts call(name) // 変更点
```
とするか

```
  def call(name)
    name = "Mr.#{name}"
  end

  name = "Tanaka"
  name = call(name) // 変更点
  puts name
```
とすることで"Mr.Tanaka"と呼ぶことができます
前者は"call(name)"メソッドの返り値が"Mr.Tanaka"なのでそのまま呼び出しをし、後者は"name"の変数に再代入をすることで、呼び出しを可能にしています


# まとめ
- スコープとは、変数が使える範囲のこと
- 引数とは、メソッドなどに渡すことのできる値のこと
- 返り値とは、結果としてそのもの（オブジェクト）がどういう値を持っているかということ
フロー図作成ツールLucidchartを使ってみる

#利用準備

最初にアカウント登録が必要です。
Googleのアカウントを使ってサインアップすることも可能ですが、今回はLucidchart専用のアカウントを作成します。メールアドレスを入力して「無料トライアル」をクリックします。
（gmailを使ったほうがカンタンかと思ったが、、調査の結果手間がかからないようなのでやってみた）
![l1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482202/f1e81763-8f42-ef08-a22b-7c45677f6c0d.png)

メールアドレス、IDとパスワードを入力して「登録」ボタンをクリック。
![l2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482202/4838bc0c-90b6-b871-5f98-7b4bbb7cacc0.png)

契約プランが表示るので、左下にある「無料アカウントの利用を開始」で無料利用を開始。20秒程度ですかね。



#特徴
LucidchartはMicrosoftのVisioで作成したしたものをインポートできるのが特徴。すでに作成されたものがある場合は便利といえます（これは有償の機能の模様）。基本的には無料だが、有償版も用途によっては検討がいるかもしれません。ユーザあたり月額1,000円です。

Pro版の内容（公式より）
無制限のドキュメント作成
図形使い放題
1GBのストレージ
Visioインポート/エクスポート
改訂履歴
プレミアム図形
プレゼンテーションモード
Chart A.I



#フローチャートを作成してみる
それでは、実際にフローチャートを作ってみます。「マイドキュメント」の中にある「フローチャート」のボタンをクリックします。
![l4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482202/79a3c943-8443-4d9d-b727-91c41122cbde.png)


多くのフローチャートのテンプレートが表示されます。テンプレートをべースに作成することができます。とりあえず「BPMN2.0」をクリックします。
![l5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482202/0cb66456-ae40-9592-9b06-e5e7e7529392.png)
テンプレートの利用シーンなど、詳細な説明がプレビューとして出てきます。進める場合は、右下にある「文書を作成」のボタンをクリックします。
![l6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482202/6c43ed9a-52d3-459c-2274-99e6d7a38183.png)


フローチャートの編集画面が表示されます。左端の四角のアイコンをクリックすると、「テキスト」と書かれたボックスが現れます。
![l7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482202/130f085e-5ee2-fd8b-006f-17c044587da3.png)


四角形が追加されます。また、四角形をクリックすることで、文字を編集することもできます。
![l8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482202/a4356ba0-4cda-ba49-ccd8-16df6f271ea9.png)

他にも、矢印や様々なタイプの図形を挿入することができます。最後は「ファイル」→「保存」をクリックすると保存ができます。
![l9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482202/2670423a-1812-1d79-5a9b-d3af617cba9a.png)

この辺り、以前紹介したGliffyと近い感じですかね。
ドラッグで操作できるし、日本語がごちゃごちゃ書かれていないので自分はGliffyが好きかな～と個人的には思います。文字数がごちゃごちゃしているとみ見辛い。こういう時、日本語って目に優しくないですね。

使用感は、重くなることもなく、軽快に作図することができるので使いやすいです！





#デメリット
日本語の入力は少しコツがいるようです。。。テキストの入力は図形をダブルクリックして行いますが、
一度目は黒い四角になってしまいますので、一度削除してからもう一度入力します。ちょっと面倒かなあ。



#おわりに

おわりに

Visioを既にに使っている場合は有償版を使うと便利な気がします。また、公式で様々なカテゴリに分けた解説や動画もあって
手厚いヘルプが行き届いており結構リッチです。サクッと図を書きたい場合には以前紹介したGliffyで足りるかなという印象が個人的にはありますが、
公式サポートの安心感もあってかなり良いツールだと思います。

ここまで、いくつか作図ツールを試してきました。
方針としては、基本的に無償かつインストール不要でOSを問わない（Win OR Mac）ものを中心に調査して試してみています。
以前は有名なA5:SQL Mk-2というフリーツールでDB関連のドキュメント納品をしていましたが、今後これに関してもまとめてみます。
数が増えてきたらメリットとデメリットを整理してこういう時はコレ！というまとめ記事も作っていけたらいいかなと思います。

まあ、徐々に。



参考：
[Lucidchartヘルプセンター公式](https://lucidchart.zendesk.com/hc/ja)
[Lucidchartを使ってみたらなかなか良かった件](https://www.nqou.net/2014/04/05/162159/)
ファイアウォール学んだときのメモ

## 背景
セキュリティーに詳しくなりたいと思い立ちファイアウォールについて学んだ際の自分向けのメモ書きです。
[CyberSecurityTimesのサイト](https://www.shadan-kun.com/blog/measure/2775/)を参考に勉強させていただきました。

## ファイアウォールはセキュリティーの基本

ファイアウォールは、インターネットと自分のパソコンの間に位置する壁のようなもの。
インターネットを利用する際に、例えるなら、僕らは自分の家の窓を開けてここから情報もらいますよ！と情報の入ってくる入り口を開けます。
この窓のことをポートと呼びます。
その入り口から入ってきた情報にウイルスやおかしなデータが混ざっていると、パソコンが誤作動を起こしてしまうらしい。
そこで、このファイアウォールの役目は、ウイルスなどに気付いたら窓をしめてくれる役割があります！（門番みたいな）
さらに、侵入したウイルスが中で悪さをして、そのウイルスを外にメールなどで拡散しようとするケースがありますが、この場合もファイアウォール門番が、今度は外部への窓口をしめてくれます。
とても優秀な門番です！

## どんな種類のファイアウォールがある？？
・パケットフィルタリング型
情報を荷物に例えると、この型のファーアウォールはどの地域からの荷物は受け取るのかを設定し、
それ以外から来た荷物に関してはが遮断します。門前払いですね。。。
これが主流のファイアウォール型らしいです。

・アプリケーションゲートウェイ型
パケットフィルタリング型は不審な荷物は受け取り拒否してくれますが、指定した場所から来た荷物に関しては中身はチェックせずに通れるのでなりすまされても通してしまいます。
これに対して、アプリケーションゲートウェイ型はパッケージの中身までチェックしてくれるので、より安心です。
やることが増えるので、ネットの速度も遅くなってしまいますがより安全ですね！

・サーキットゲートウェイ型
パケットフィルタリング型の動作に加えて、使用するアプリケーションごとに設定が可能で特定のシステムやソフトにだけ通信を制御できる。

## 設定時の注意点
情報の入り口（ポート）を塞ぐだけではだめー>なりすましに対応できない。
アプリケーションゲートウェイとパケットフィルタリングのコンビで設定するとより強固なセキュリティーを築区ことができる！

とは言っても、調べているとWindowsではファイアウォールがそもそも有効になっていたりと設定する必要がない場合も多いみたいです。
ただ、これらのワードを目にした時になんとなくわかっているだけでもグッと違うかなと思いますので今回はメモとして残しました。
参考になれば幸いです。
お読みいただきありがとうございました。
Office365(AzureAD)アカウントでAWSにSSOする

#はじめに
社内で使用しているOffice365のアカウントを検証用に使用しているAWSにSSOしたい、という要件があったため対応したので手順の共有です。
今回はAWS側でSSOをするのではなく、AzureADでSSOしてAWSにログインします。
IdPがAzureAD、SPとしてAWSを追加する形です。

##前提として
・Office365を使用していること(AzureADに登録があること)
・Office365の全体管理者が必要

#設定方法
こちらを参考にやりました
[Azure Active Directory シングル サインオン (SSO) とアマゾン ウェブ サービス (AWS) の統合](https://docs.microsoft.com/ja-jp/azure/active-directory/saas-apps/amazon-web-service-tutorial)

##AzureADの設定
###エンタープライズアプリケーションの追加
1．まずは[AzurePortal](https://portal.azure.com/)に管理者でログイン
2．ホーム画面から左ペインの「Azure Active Directory」を選択します。
3．エンタープライズアプリケーションを選択します。
4．「新しいアプリケーション」を選択します。
5．「ギャラリーから追加する」の検索欄に"amazon"と入力すると、いくつか候補が出てくるので、「Amazon Web Services (AWS)」を選択し、追加します。
　　(そうすると、エンタープライズアプリケーション-すべてのアプリケーションの一覧にAWSが追加される)

###Amazon Web Services (AWS)の設定
1．AzurePortal⇒Azure Active Directory⇒エンタープライズアプリケーション⇒Amazon Web Services (AWS)を選択します。
2．シングルサインオンを選択し、シングルサインオンの方式⇒SAMLを選択します。
3．「基本的なSAML構成」を編集で開き、「識別子 (エンティティ ID)」に以下URLを入職します。
"https://signin.aws.amazon.com/saml?＜任意の値＞"
4．「SAML署名証明書」から「フェデレーション メタデータ XML」をダウンロードします。
5．「Amazon Web Services (AWS) のセットアップ」からログイン URL、Azure AD 識別子、ログアウト URLをコピーして控えておきます。

##AWSの設定
1．IAMを編集できるアカウントでAWSマネジメントコンソールにログインします。
2．IAMの画面を開き、「IDプロバイダー」を選択します。
3．「プロバイダの作成」をクリックし、「プロバイダーのタイプ」から SAML を選択し、「プロバイダ名」には、AzureADで設定した「識別子 (エンティティ ID)」の任意の値(URI)を入力し、メタデータにはダウンロードしたものを選択し、プロバイダを作成します。
4．左ペインから「ロール」を選択し、「ロールの作成」を選択します。
5．「SAML2.0フェデレーション」を選択します。
6．SAMLプロバイダーに、作成したものを選択し、「プログラムによるアクセスとAWSマネジメントコンソールによるアクセスを許可する」を選択、属性はたしかそのまま(SAML;aud)、値に以下URLを入力します。
https://signin.aws.amazon.com/saml
7．ポリシーの選択では、SSOしてAWSにログインする際の権限を設定します。
　　(今回はPowerUserAccessに設定しました。)
8．タグは何も設定せず、スルーでいいです。
9．ロール名に任意の値を入れ、ロールを作成します。
10．左ペインから「ポリシー」を選択し、「ポリシーの作成」を選択します。
11．JSONタブを選択し、以下の通り編集します。

```
{
    "Version": "2012-10-17",　　　　　
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
            "iam:ListRoles"
            ],
            "Resource": "*"
        }
    ]
}
```

Vesionの部分の日付は適当で大丈夫です。

12．ポリシーの名前を任意のものを入力し、ポリシーを作成します。
13．左ペインから「ユーザー」を選択し、「ユーザーの追加」を選択します。
14．ユーザー名を任意に指定し、アクセスの種類は「プログラムによるアクセス」を選択します。
15．アクセス許可の設定で、「既存のポリシーを直接アタッチ」を選択し、先ほど作成したポリシーを検索して選択します。
16．タグはスルーで、ユーザーを作成します。ここで、CSVのダウンロードと「アクセスキーID」「シークレットアクセスキー」をコピーして控えておきます。

##再びAzureADの設定
1．AzurePortal⇒Azure Active Directory⇒エンタープライズアプリケーション⇒Amazon Web Services (AWS)⇒プロビジョニング　を選択します。
2．clientsecretに「アクセスキーID」、シークレット トークンに「シークレットアクセスキー」を入力し、テスト接続を押下して右上に緑のチェックマークが出ることを確認し、一旦保存します。
3．プロビジョニング状態がオフになっているので、オンにして保存します。

##SSOの確認
1．Azure Active Directoryの「ユーザーとグループ」を選択し、「ユーザーの追加」を選択します。
2．SSO対象のユーザを選択し、AWS側で作成したロールを選択し、ユーザーを追加します。
3．対象のアカウントで[Office365ポータル](https://www.office.com/)にログインします。
4.「すべてのアプリ」を選択し、Amazon Web Services (AWS)のアプリアイコンを選択します。
5．AWSのマネジメントコンソールにSSOしてログインできる(はず)

#個人的な感想
個人的にはエンタープライズアプリケーションに登録してSSOできるってのがなんかかっこよかったので気に入ってます。
運用自体もAzureADでユーザの出し入れ、もしくはグループの出し入れだけなので簡単かと思いました。

画像つきのものは近々noteにも記事をupします。
SwiftUI Pickerの値をenumと連動

#やりたいこと
Pickerの表示項目と選択を、モデル内のenumで管理したい

|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59249/f2d630ce-3784-536e-0784-5729c5bf2154.png)|![image.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59249/159e1305-5bf0-2788-0f42-0ca004ac6de4.gif)|
|:-:|:-:|

##enumの値をモデル内に設定

ポイントは、enumをCaseIterableに指定すること

```swift:Model
class Model:ObservableObject{
    //enumはrawValueとしてString
    //PickerのForeachで使えるようにCaseIterableに指定
    enum Mode:String,CaseIterable{
        case a = "A"
        case b = "B"
        case c = "C"
    }
    @Published var currentMode:Mode = .a   //この値をPickerのselectionとバインド
}
```

##Pickerにenumの値を表示し、選択と連動するように設定

Pickerのselectionで選択している項目を制御できるので、model内の値と紐付ける

```swift:ContentView
struct ContentView: View {
    //EnvironmentObjectなので、SceneDelegateに設定しておくこと
    @EnvironmentObject var model:Model
    
    var body: some View {
        VStack{
            Spacer()
            Text("Pickerで選択")
            //selectionでmodel内のcurrentModeとバインド 
            Picker("", selection: self.$model.currentMode) {
                //CaseIterableなenumからはallCasesでcase値を列挙できる
                ForEach(Model.Mode.allCases, id: \.self) { (mode) in
                    //rawValueの値をPickerの項目に表示
                    Text(mode.rawValue).tag(mode)
                }
            }
            .pickerStyle(SegmentedPickerStyle())
            .padding(.horizontal)
            Spacer()

            Text("選択された Mode")
            Text(self.model.currentMode.rawValue)
            .font(.largeTitle)
            Spacer()
        }
    }
}
```
![image.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59249/159e1305-5bf0-2788-0f42-0ca004ac6de4.gif)

##外部からmodeを変更した場合でも連動していることを確認

外部のボタンでmodeが変更された場合でも、Pickerの値が連動することを確認

``` swift
            Text("ボタンで選択")
            HStack(spacing:40){
                ForEach(Model.Mode.allCases, id: \.self) { (mode) in
                    Button("Set:\(mode.rawValue)"){
                        //ボタンでmodeを切り替えた場合
                        self.model.currentMode = mode
                    }
                }
            }
            Spacer()
```

![image2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59249/c40d315e-603f-d3d8-b90d-cbefa4a9eb29.gif)
コマンドラインで操作するSNSサービスのdocker-image

# Twitter
## tw
- [GitHub](https://github.com/shokai/tw)
- [DockerImage](https://hub.docker.com/repository/docker/toru2220/tw)

# Youtube
## youtube-dl
- [GitHub](https://github.com/ytdl-org/youtube-dl)
- [DockerImage](https://hub.docker.com/repository/docker/toru2220/youtube-dl/general)

# Google翻訳
## translate-shell
- [GitHub](https://github.com/soimort/translate-shell)
- [DockerImage](https://hub.docker.com/repository/docker/toru2220/translate-shell/general)
ufw を使っている時に ping を使えるようにする

Arch Linux (5.4.6-arch3-1) と Ubuntu 19.04 で確認しました。

/etc/ufw/before.rules の COMMIT の前に次のように加えます。

```text:/etc/ufw/before.rules
（省略）
# allow outbound icmp
-A ufw-before-output -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
-A ufw-before-output -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT
#
#
# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT
```

変更後

```bash
sudo ufw reload
sudo ufw enable
```
[WordPress]パーミッション設定

最近の勉強で学んだ事を、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです！

#WordPressの理想的なパーミッション設定
WordPressのパーミッションのチェックが必要になったので確認する事になったのですが...

そもそもWordPressのパーミッションってどんな設定が良いんだ？
分からない...

調べてみた！
おお！これによると
・[WordPressの理想的なパーミッション設定は？権限を見直してセキュリティ強化しよう](https://www.webernote.net/wordpress/wp-permission.html/)
・[パーミッション \| レンタルサーバー【エックスサーバー】](https://www.xserver.ne.jp/manual/man_server_permission.php/)

・wp-config.php
安全なのは「400」共有サーバーの場合「400」で設定できないケースも多いようで、WordPress.org では「600」を推奨しています。当ブログで利用しているホスティング会社も「600」を推奨しているため、その設定で運用しています。

・その他のファイル・ディレクトリについては、一般的には

　ディレクトリは「705」
　ファイルは「604」

であると！

早速、パーミッションの設定を確認！

最初はこれを見てから確認してみても良いかもです！
[Linuxのパーミッション（権限）とは？確認や変更方法も一緒に紹介！ \| キツネの惑星](https://kitsune.blog/linux-permission/)


確認してみるとwp-config.phpのパーミッションが604だったので600に変更！

```apache

$ chmod 600 wp-config.php
```

[Linuxの権限確認と変更(chmod)（超初心者向け） - Qiita](https://qiita.com/shisama/items/5f4c4fa768642aad9e06//)

今日はこんな感じで終わりです！
ER図ツールwwwsqldesignerを試してみる




#はじめに

プロジェクトの標準化、資料化について調査しており、作図ツールに関しても日々調査しています。
前回、ERDPlusが無料かつインストール不要ということなので試してみましたが、
10年以上昔からあるらしいwwwsqldesignerもインストール不要で使えて便利！ということなので
試していきます。



本家サイト:http://code.google.com/p/wwwsqldesigner/

本家サイトが英語で、かつ、かなりあっさりした説明しかないようですが、直観的に操作できるのと
方眼紙になっているので個人的にテンション上がります。


旧バージョンの情報はwebサーバにインストールして利用するという記述がありますが、現行のバージョンではwebサーバがなくてもブラウザだけで利用できます。
この場合、保存と読込にはxmlを使用するようです。


![xml.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482202/69352b29-7a92-35ed-f583-b2a5302da98e.png)



#機能まとめ（公式より）

言語選択
対象DBの選択（mysql, sqlite, web2py, mssql, postgresql）
CREATE文の作成（選択した対象DBの形式で出力）
ER図の作成
既存DBからER図を作成（mysqlのみ）
ER図の保存、読込
クライアント側
XMLでの入出力（コピペで保存、再開）
サーバ側(phpまたはperlの動作環境が必要)
ファイルに保存（phpまたはperl）
DBに保存（phpのみ、mysqlまたはsqlite）


#基本操作など

ここにアクセスすることでとりあえず即利用できます。
→https://ondras.zarovi.cz/sql/demo/?keyword=default

右側に操作ツールがまとまっており、クリックすることで操作できる。
![addTable.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482202/405cac0e-bd4e-0062-ca62-2e11b1574edf.png)


ダブルクリックすると作成済みのアイテムを編集できるのも直観的でよい感じ。
![doubleCL.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482202/f76414d9-ac9c-b11e-b243-af119ae10196.png)


#直感的でない操作について

wwwsqldesignerはそのシンプルさでほとんどの操作を直感的に行なえますが、いくつかの操作でやや分かりにくい部分があるので、それについて補足memoを残してていきます。
（他はほとんど迷いようがないと思われる。素晴らしい！）


外部キーの設定、追加、削除
あるテーブルの主キーを別のテーブルの外部キーにする操作は、既存のフィールドに対する操作と、外部キーとしてフィールドを追加する操作の2種類があり、それぞれ手順が異なります。

１．親テーブルに子テーブルのキーを追加する
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482202/44c8ba2d-4e4f-9e77-4434-b36b930f8dfb.png)

まず、「子テーブルの主キー」を選択します。
「Create foreign key」、「Connect foreign key」のボタンがアクティブになるので、「Create foreign key」をクリックします。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482202/800b2d58-6505-d01e-fdfa-f54154a46f1b.png)


ボタンのラベルが「[click target table]」に変化するので、親テーブル（テーブル名部分）をクリックします。
これで親テーブルに子テーブルへの外部キーが作成完了。
なお、「[click target table]」ボタンを押したり、テーブル以外のエリアをクリックするとキャンセルできます。
また、作成されるフィールド名の初期値はオプション画面で設定できます。

２．親テーブルのフィールドを子テーブルの外部キーにする
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482202/122ae515-fadb-3214-adb2-8871545ed196.png)

まず、「子テーブルの主キー」を選択します。
「Create foreign key」、「Connect foreign key」のボタンがアクティブになるので、「Connect foreign key」をクリックします。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482202/7202a7b0-655b-4c1c-4985-dfe5eb980f75.png)

ボタンのラベルが「[click target row]」に変化するので、親テーブルの対象フィールドをクリックします。
これで対象フィールドが子テーブルの外部キーになりました。
なお、「[click target row]」ボタンを押したり、フィールド以外のエリアをクリックするとキャンセルできます。

リレーションのみを削除する機能がないため、一旦フィールドごと削除しなければいけないので注意が必要です。

再読み込みの必要な設定
オプション機能として、ER図をデザイン/CREATE文を出力するターゲットDBを変更できるのですが、変更後にリロードしないと有効になりません。
これは設定項目がクッキーに保存され、初期化時にのみ評価されているからのようです。
それゆえ当然、クッキーが有効でないと利用できませんので注意。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482202/a5384d59-3996-1adc-882c-cba5642142fb.png)

オプション項目名に「*」がついている項目（言語、ターゲットDB、リレーションの線）はリロードが必要です。


#おわりに
見た目の色合いや操作感は個人的にかなり好きです。
サーバにインストールして使う場合にはセキュリティ対策が必要かと思うので、そこは考慮して運用するべきかと。



参考：
[wwwsqldesigner本家サイト](http://code.google.com/p/wwwsqldesigner/)
PHP 変数に値を格納する

# 目的

- PHPで変数に値を格納する方法をまとめる

# 書き方の例

- 下記に変数への文字列の格納方法を記載する。

```php
<?php
$変数名 = 格納する値;
?>
```

# 具体的な書き方の例

- 下記に変数`name`に「miriwo」を格納し出力する処理を記載する。

```php
<?php
$name = "miriwo";
echo $name;
?>
```

- 下記に変数`number`に数値の「3」を格納し出力する処理を記載する。

```php
<?php
$number = 3;
echo $number;
?>
```
Laravelのフラッシュメッセージをreturn viewの時にもやりたい

# 概要
エラーメッセージや完了メッセージなどを表示したい時にアラートを表示したりしますが、リロードした時には表示させたくないので、フラッシュメッセージを使いたい場面が多々あると思います。Laravelでも簡単にフラッシュメッセージを出すことができるのですが、コントローラーでの`return redirect`と`return view`ではフラッシュメッセージの振る舞いが変わるので、まとめておきます。

# 動作環境
Laravel 5.8

# 前提知識

まず`Controller`から`view`にデータを受け渡す方法として、今回の記事では2種類扱っています。

- Controllerからviewに受け渡す変数
- PHPのSession

前者はviewでデータを表示させるために普段使うやつです。コードでは以下のような使い方をします。

```HomeController.php
public function index() {
    return view('home.index')->with('message', 'Hello!');
}
```

```home.blade.php
<p>{{ message }}</p>
```

後者はPHPのセッションを用いてデータをやりとりする方法です。上と同じメッセージをセッションで実現すると下の通りになります。

```HomeController.php
public function index() {
    Session::put('message', 'Hello!');
    return view('home.index');
}
```

```home.blade.php
@if (Session::has('message'))
    <p>{{ session('message') }}</p>
@endif
```

# 本題

フラッシュメッセージを扱う時にはセッションを用います。

## Controllerの処理

### リダイレクトする場合

```HomeController.php
public function redirect() {
    return redirect()->route('home')
                ->with('message', 'Hello!');
}
```

### ビューを返す場合

```HomeController.php
public function index() {
    Session::flash('message', 'Hello!');
    return view('home.index');
}
```

## Viewの処理
```home.blade.php
@if (Session::has('message'))
    <p>{{ session('message') }}</p>
@endif
```

# ややこしいポイント

リダイレクトの際の`redirect()->with()`の`with`はセッションのフラッシュメッセージを保存するメソッドになっています。しかし、ビューを返す際の`view()->with()`の`with`は前提知識でも書いたように、変数をセットするメソッドです。なので、ビューを返す場合の処理は2行になっています。逆にリダイレクトの場合でも`with`を使わずに下のように書くことも可能です。

```HomeController.php
public function redirect() {
    Session::flash('message', 'Hello!');
    return redirect()->route('home');
}
```

# 最後に

ビューを返すときはフラッシュメッセージの内容を変数に入れて表示すれば良いのでは？という方もいそうですが、テンプレートでフラッシュメッセージ表示部分を共通化しているので、ビューを返す時にもセッションを使いたいという気持ちになり、記事を書きました。

# 参考記事
https://stackoverflow.com/questions/42417865/how-to-return-view-with-flash-message
初心者によるプログラミング学習ログ 196日目

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

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

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

196日目は

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おはようございます<br><br>196日目<br><br>udemyでjquery<br><br>寝落ちした<a href="https://twitter.com/hashtag/100DaysOfCode?src=hash&amp;ref_src=twsrc%5Etfw">#100DaysOfCode</a> <a href="https://twitter.com/hashtag/%E6%97%A9%E8%B5%B7%E3%81%8D%E3%83%81%E3%83%A3%E3%83%AC%E3%83%B3%E3%82%B8?src=hash&amp;ref_src=twsrc%5Etfw">#早起きチャレンジ</a><a href="https://twitter.com/hashtag/%E9%A7%86%E3%81%91%E5%87%BA%E3%81%97%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%A8%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8A%E3%81%9F%E3%81%84?src=hash&amp;ref_src=twsrc%5Etfw">#駆け出しエンジニアとつながりたい</a></p>&mdash; ぱぺまぺ@webエンジニアを目指したい社畜 (@yudapinokio) <a href="https://twitter.com/yudapinokio/status/1210329716516769792?ref_src=twsrc%5Etfw">December 26, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
ERDPlusを使ったER図およびSQL文生成

#はじめに

プロジェクトの標準化、資料化について調査しており、作図ツールに関しても日々調査しています。
今回、ERDPlusが無料かつインストール不要ということなので試してみます。
とりあえず、ER図の生成とSQL文の発行をやってみます。


#導入

[ERDPlus](https://erdplus.com)

ここにアクセスしてアカウント作って右上のDiagramsを押すとER図の作成ページに移ります。

必要な情報

・名前
・メールアドレス
・パスワード





#ER図生成

ログイン後NEW DIAGRAMから新しいダイアグラムの作成を始めます。
まずER図作成のため、Relational Schemaを選択します。



![ERD.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482202/48dadf95-548d-3ccf-fa27-4832044ca838.png)


テーブルの追加はTABLEをクリックして行います。その後、カラムの追加は↓部分。

![colum.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482202/f61f0f99-914a-5b71-79ef-c3b52a1beba6.png)


インターフェースがさっぱりしているので、操作しやすい印象です。
connectでつなぐと外部キーの対応関係を作れます。



直観的な操作で作図できるので、もしエクセルなどで作図しているようなら最初からこのようなツールので
設計・作図やったほうが早い気がします。

![comp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482202/397ec72a-061e-e774-8818-42ba135c09b4.png)




#SQL文発行

作図したはものは、Generate SQLからSQL文を発行することができます。

今回の例↓

```
CREATE TABLE Users
(
  User_ID INT NOT NULL,
  name VARCHAR(30) NOT NULL,
  age INT NOT NULL,
  sex VARCHAR(10) NOT NULL,
  mail VARCHAR(100) NOT NULL,
  address VARCHAR(100) NOT NULL,
  PRIMARY KEY (User_ID),
  UNIQUE (mail)
);

CREATE TABLE Posts
(
  Post_ID INT NOT NULL,
  title VARCHAR(100) NOT NULL,
  body VARCHAR(1000) NOT NULL,
  User_ID INT NOT NULL,
  PRIMARY KEY (Post_ID),
  FOREIGN KEY (User_ID) REFERENCES Users(User_ID)
);

CREATE TABLE Categories
(
  Category_ID INT NOT NULL,
  cname VARCHAR(100) NOT NULL,
  PRIMARY KEY (Category_ID)
);

CREATE TABLE Category_Post_Reg
(
  RegID INT NOT NULL,
  Category_ID INT NOT NULL,
  Post_ID INT NOT NULL,
  PRIMARY KEY (RegID),
  FOREIGN KEY (Category_ID) REFERENCES Categories(Category_ID),
  FOREIGN KEY (Post_ID) REFERENCES Posts(Post_ID)
);
```

手作業で書こうと思ったら少し手間ですが、これならタイプミスもないから良い。（当然、手作業のミスは可能な限り根絶したい！）
まあ、一からDB作るのに手作業で書くステップを取る人が今ドキどれだけいるのか少々疑問ですががが。。。！


#おわりに
基本的に英語で書かれているが、シンプルかつ難しい表現はないのでそれほど困らないかと個人的には思います。
機能はかなり充実しているようなので、使い慣れたらなかなか良さそう。
なにより、名前とメールアドレス入れたらすぐ使えるので、インストールもいらずすぐどこでも作業できるのが
一番の魅力かなと思います。


#おまけ

以下、公式よりERDPlusの特徴を翻訳。公式の解説書も売っている模様。（高いけど！）
個人的には、解説書よりも誰かが試してまとめてくれた記事のほうがインタラクティブで分かりやすいので
好きです。良い記事があったらどなたかシェアしてください…！

データベースモデリング
ERDPlusはWebベースのデータベースモデリングツールであり、すばやく簡単に作成できます。

・エンティティ関係図（ERD）
・リレーショナルスキーマ（リレーショナルダイアグラム）
・スタースキーマ（次元モデル）

その他の機能

・ER図をリレーショナルスキーマに自動的に変換する
・SQLのエクスポート
・図をPNGとしてエクスポート
・サーバーに図を安全に保存する

SQL DDLステートメント
標準SQLのエクスポート

・リレーショナルスキーマとスタースキーマからSQLを生成する
・一般的なデータタイプとデータサイズから選択
・Oracle、MySQL、Microsoft SQL Server、PostgresSQL、Teradata、IBM DB2、Microsoft Accessなど、最新のRDBMSツールと連携します。

教科書
ERDPlusを使用した教科書は、新しい出版社からはるかに低価格で入手できます。 電子書籍は51.50ドルで、ペーパーバックは74.50ドルで入手できます。


参考：
[ERDPlus](https://erdplus.com)
PHPの超基本

# 目的

- PHPをまだ部にあたり、超基本となることをまとめる

# PHPはどこに書くの？

- HTMLファイルの中に記載する。
- 独立したファイルとして記載することも可能である。

# HTMLファイル内にどうやってPHPを書くの？

- PHPのコードは`<?php`と`?>`で囲む。
- PHPのコードをHTMLファイルの中に記載する方法を例として下記に記載する。

    ```html
    <?php PHPの命令 ?>
    ```

# PHPのコメントアウトはどうするの？

- `//`の後ろがコメントとなる。
- もちろんコメントも`<?PHP ?>`の中に記載する。

# 文末に記号は必要なの？

- PHPは文末記号が必要である。
- 文末には必ずセミコロン`;`をつける。

# PHPでHello Worldはどうすればいいの？

- 環境構築が完了しているPCで`.php`ファイルを作成して下記のコードを記載してブラウザで確認する

    ```php
    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <title>Progate</title>
      <link rel="stylesheet" type="text/css" href="stylesheet.css">
    </head>
    <body>
      <?php
       echo "Hello, world!";
      ?>
    </body>
    </html>
    ```

- PHPのコードを実行できるWebサイトにて下記のコードを記載して実行する。[https://paiza.io/projects/nHmsVLuX9kEybNsetTz7Tg](https://paiza.io/projects/nHmsVLuX9kEybNsetTz7Tg)

    ```php
    <?php
    echo "Hello World";
    ?>

# VM環境のローカルビルトインサーバの起動

```
$ cd phpのファイルがあるディレクトリ
$ php -S 自分のIP:8000
```
【css】IEと戦うためのTips集

おはこんばんちは、ゆるすぎて投稿を忘れていた[ちーず](https://qiita.com/cheez921)です。(反省)
本日は、IEと戦うためのTipsを、IE滅びろという気持ちを抑えて書きます。

## なぜこの記事を書く？
新卒として働き初めてから、新規立ち上げサイトのCSS設計を担当させていただいた経験がありましたが、
その中で一番失敗したこと、反省したことが**IE対応**だったからです。
自戒の念を込めて、この記事を書こうと思いました。

## 基本的なIE対応
まずはじめに、基本的なIE対応をする際に考えるべきことをざっくりと説明します。

### 1. [Can I use](https://caniuse.com/) でプロパティがIEに対応しているかを調べる
<img width="100%" alt="caniuse" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142322/773ef90f-8394-5caa-5522-d6a5d54fc69e.png">

[Can I use](https://caniuse.com/)とは、HTMLやCSSなどのブラウザ対応状況が調べられるサービスです。
自分が使用したいプロパティがIEに対応しているかを簡単に調べることができるため、ブラウザ対応しているか不安なプロパティを使う際は必ず調べましょう。

* 緑　 : 対応 
* 黄緑 : 部分的に対応 (hoverすると詳細が見れます。)
* 赤　 : 未対応

### 2. [Autoprefixer](https://autoprefixer.github.io/)でベンダープレフィックスを自動で付与する

ベンダープレフィックスとは、`-moz-`や`-webkit-`などのプレフィックス(接頭語)をプロパティや値につけることで、わりと新しめなCSSの機能を特定のブラウザで使用できるようなものであり、[Autoprefixer](https://autoprefixer.github.io/)は、指定したブラウザ対応に必要なベンダープレフィックスを自動で付与するツールです。

ツール自体の導入は今回は割愛させていただきます。下記記事がわかりやすいと思います。

> [CSSベンダープレフィックス-webkit-を今この瞬間に辞める為のAutoprefixerの導入](https://qiita.com/tonkotsuboy_com/items/377913c51b1ac00deffe)

また、対応するブラウザの対象を設定するには、[browserlist](https://github.com/browserslist/browserslist) を用いて設定すると良いでしょう。
設定の書き方は下記記事が分かりやすかったです。

> [.browserslistrcで対象ブラウザを指定する](https://qiita.com/takeshisakuma/items/0bc1c39ee976bd1f52d7)

また、[browserl.ist](https://browserl.ist/)で、`browserlist`の設定から対応ブラウザの一覧を確認できます。

<img alt="browserlist" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142322/79833e5a-1c4e-d920-e4e8-1e1aed9cca13.png">


## 見落としがちなIE対応
ここからは`Can I use`も`autoprefixer`も教えてくれなくて、自分がまんまとハマってしまったIE対応をご紹介します。

### flexショートハンドでdefault値を省略するとIEで崩れる
flexプロパティのショートハンドでは、以下のような順で指定ができます。

```css
.example {
  flex: flex-grow flex-shrink flex-basis;
}
```

省略して`flex: 1`と書くこともできますが、default値を省略するとIEでバグります。

```css
/* NG */
.example {
  flex: 1;
}

/* OK */
.example {
  flex: 1 1 auto;
}
```

私はこれで、footerを固定するような書き方をしていましたが、
MVが大幅に崩れる不具合を出してしまいました。。。
あの背筋が凍った経験を2度と忘れません。。。
(GAを確認したら、なぜかCVR上がってましたが...)

### imgタグでsvgを指定すると崩れる
imgタグでsvgを指定し、IEで確認してみたら、なんと指定範囲からはみ出たサイズ表示になっていました。

#### 解消法
下記記事を参考に、svgタグに`width`,`height`,`viewbox`を指定したらなおりました。

> [SVGをimgで表示した場合にIEだけサイズが変になる現象を直す](https://qiita.com/Shitsu/items/4edf6fae3329c4904f29)

### svgをbackgroundで設定すると、background-positionが効かない
背景画像にsvgを大量に用いていて、`left: 0`で見出しのアイコンとして用いていたのですが、
IEで確認したところ、中央によっていました...

#### 解消法
svgタグに`width`,`height`,`preserveAspectRatio="xMinYMid"`を指定したらなおりました。

> [IE11で背景に指定したSVGが正しく表示されない件](https://qiita.com/soh-web/items/e4d2209b896d8ad70d35)

## 最後に
IE対応で不具合を起こさないようにするには、実機確認がマストだと感じました。
MacでIE確認できる機能もありますが、スタイル崩れが再現できるとは限りません。
なるべくユーザーと同じようにWindowsで、IEを開いて確認するよう徹底しましょう。

また、アドベントカレンダーは指定の日にちに投稿しましょう.........
【Python】super()を使ってオーバーライドする理由

# 本記事について
Djangoのソースコードを見ていたところ、クラスのオーバーライドに`super()`を用いているものがたくさんありました。`super()`とは何なのか、用いないでオーバーライドする場合と何が違うのかを整理します。

## オーバーライドとは
基底クラスと同じ名前のメソッドを派生クラス内に定義することです。基底クラスのメソッドに機能を追加・変更をすることができます。


# 基底クラスを定義する

```python

# 基底クラス
class Coffee(object):
    def __init__(self, color, fragrance, price, taste, elapsed_time):
        self.color = color
        self.fragrance = fragrance
        self.price = price
        self.satisfaction = ((taste + fragrance) * price) - elapsed_time
        
    def drink(self):
        print(f'満足度が{self.satisfaction}点のホーフィーを飲む')


coffee = Coffee('brown', 10, 200, 10, 300)
coffee.drink() # <--- 満足度が3700点のホーフィーを飲む
```

基底クラスを定義したので、以下に`super()`を使った場合とそうでない場合の派生クラスを作ってみます。（両者とも機能は同じ）


# 基底クラスをオーバーライドする（super()を使わない）
`Coffee`クラスを継承し、メソッドをオーバーライドしたクラスを作ってみます。

```python

# Coffeeを引き継いだ後、機能を拡張したい！！

class Override(Coffee):
    # 普通にオーバーライドすると基底クラスの処理が無効化されてしまうので、処理を拡張させたいなら基底クラスと同じ処理を記述する必要がある。
    def __init__(self, color, fragrance, price, taste, elapsed_time, size):
        self.color = color
        self.fragrance = fragrance
        self.price = price
        self.satisfaction = ((taste + fragrance) * price) - elapsed_time + size * 55
        self.size = size
        
    def size_up(self):
        self.price += 100
        self.size += 1
        print(f'サイズが{self.size}になった！代わりに価格が高くなった...')
        
    # 基底クラスのメソッドも、再度イチから定義しなければならない
    def drink(self):
        print(f'満足度が{self.satisfaction}点のホーフィーを飲む')
        print(f'サイズが{self.size}はちょっと多すぎたかな...')

# 実行結果　普通のオーバーライド
override = Override('brown', 10, 200, 10, 300, 10)
override.drink() # <--- 満足度が4250点のホーフィーを飲む, サイズが10はちょっと多すぎたかな..
override.size_up() # <--- サイズが11になった！代わりに価格が高くなった....
```

基底クラスの`__init__()`と`drink()`メソッドをオーバーライドしました。
普通にオーバーライドすると基底クラスの処理が無効化されてしまうので、単純に処理を拡張させたい場合は基底クラスと同じ処理を記述する必要があり、冗長的なコードになってしまいます。


# super()を使ってオーバーライドする

```python

class SuperOverride(Coffee):
    # Super関数で基底クラスのコンストラクタを呼び出すことで、初期化のコードはもう書かなくて良い
    def __init__(self, color, fragrance, price, taste, elapsed_time, size):
        super().__init__(color, fragrance, price, taste, elapsed_time,)
        self.satisfaction = ((taste + fragrance) * price ) - elapsed_time + size * 55
        self.size = size
        
    def size_up(self):
        self.price += 100
        self.size += 1
        print(f'サイズが{self.size}になった！代わりに価格が高くなった...')
        
    # 基底クラスのメソッドは呼び出されるので、冗長性がある
    def drink(self):
        super().drink()
        print(f'サイズが{self.size}はちょっと多すぎたかな...')

# 実行結果　super()関数を使ったオーバーライド
super_override = SuperOverride('brown', 10, 200, 10, 300, 10)
super_override.drink() # <--- 満足度が4250点のホーフィーを飲む, サイズが11はちょっと多すぎたかな... 
super_override.size_up() # <--- サイズが12になった！代わりに価格が高くなった...
```

SuperOverrideの`__init__`メソッドのパラメータ（color, fragrance, price, taste, elapsed_time）に渡された値を基底(Coffee)クラスのパラメータに代入し初期化しています。super()で基底クラスのメソッドを丸々呼び出しているので、satisfactionも引き継がれています。

なお、`super().drink()`は`super(SuperOverride self).drink()`と同義です。
つまり、`super(自クラス, self).メソッド名`の書くこともできますが、上記コードのように省略することもできます。


# まとめ
以上のように、`super()`は基底クラスのメソッドを継承した上で処理を拡張させたい時に使うことで、記述を節約してコードを見やすくすることができます。
【コード無し】卒論で楕円曲線とブロックチェーンについて書いたので、勉強方法をまとめてみた

# What is この記事
タイトルの通り、卒業論文でビットコイン、ブロックチェーンに使われている楕円曲線暗号について書きました。楕円曲線、ブロックチェーンそれぞれ分けて文献紹介します。
対象読者は、ブロックチェーンとか興味あるけど、勉強したことないよ、って方です。また、紹介した文献はごく一部のため、あくまで勉強時の選択肢の1つとして見ていただければと思います:relieved:
ちなみに、アフィリエイトではなくガチでわたしが利用させていただいたものしか載せてませんので、他におすすめ文献等ありましたらぜひご指摘の方お願いします！


# 誰
初投稿です。偏差値50くらいの可もなく不可もなく大学で数学やってますが、数学は全然わかりません。ただ、暗号学専攻なので書きました。一応エンジニアやってます。
~~わたしの拙い卒業論文が見たい方は下のURLのAbout Meからぜひ見ていただきたいです。フィードバック等もいただけると全力で感謝いたします。~~
~~こちら→  https://ishihaya.com/~~
現在サイト停止しております🙇‍♂️


# 参考文献一覧


## ブロックチェーン・ビットコイン(基礎知識)

### 【経済】5G 時代の最終兵器「ブロックチェーン」
〜前編〜 人類の未来を変える大発明！
https://www.youtube.com/watch?v=HfIqAQUPrjA
〜後編〜 GAFAを倒す革命的な技術
https://www.youtube.com/watch?v=H2jP94Fpoi0

しょっぱなからYouTubeを紹介していきますが、あの有名な中田敦彦氏の動画です。
最初に持ってきた理由は、面白いし、超わかりやすいからです。それだけ。

### ビットコインとブロックチェーン
https://www.amazon.co.jp/dp/B072JJL66R/ref=cm_sw_em_r_mt_dp_U_zfBbEbH3TCN62
著者: アンドレアス・M・アントノプロス 翻訳: 今井 崇也・鳩貝 淳一郎
名著と呼ばれる。とりあえず読んでおいていいと思います。途中からコードも出てきます。
### ブロックチェーン・プログラミング 
https://www.amazon.co.jp/dp/4061538314/ref=cm_sw_em_r_mt_dp_U_RJBbEbYBJMFJ1
著者: 山崎 重一郎・安土 茂亨・田中 俊太郎
Ruby言語でブロックチェーン等の実装を体験できます。2冊目に読んで良いと思える本でした。

### ブロックチェーンについて何もわからない人へ
https://qiita.com/hirotoyoshidome/items/0d7e18f81b4076416735
Qiitaの記事です。題名の通りです。
Advent Calendarの記事を一通り見るのもおすすめです。


## ブロックチェーン・ビットコイン(実践)
ブロックチェーンの仕組みを実際に動かして学ぶには、以下のQiitaの記事が参考になりました。

### ブロックチェーンを作ることで学ぶ 〜ブロックチェーンがどのように動いているのか学ぶ最速の方法は作ってみることだ〜
https://qiita.com/hidehiro98/items/841ece65d896aeaa8a2a
とりあえずこの記事見て実装してみるのが一番手っ取り早いかもしれません。

### Goでブロックチェーンを作る Part1:基本型
https://qiita.com/seitauc/items/553d315b84b0e7bfc4d0
Golangでの実装例も挙げておきます。

## 楕円曲線暗号
以下、数学的な内容を知りたいといった方におすすめの文献です。楕円曲線云々の前に、暗号理論面白いなってなった本があるので先に1冊だけ紹介させてください。
### 現代暗号入門　〜いかにして秘密は守られるのか〜
https://www.amazon.co.jp/dp/4065020352/ref=cm_sw_em_r_mt_dp_U_BqDbEb72T2TC0
著者: 神永正博
読みやすいです。数学専攻でなくても普通に読めると思います。そして面白いです。シーザー暗号など暗号の歴史から、公開鍵暗号(RSA,楕円曲線)の具体的な話もありました。

さらに深く知りたい方は次の書籍がおすすめです。

[暗号技術のすべて](https://www.amazon.co.jp/dp/4798148814/ref=cm_sw_em_r_mt_dp_U_3uDbEbMRFBJDH)
[暗号理論と楕円曲線](https://www.amazon.co.jp/dp/4627847513/ref=cm_sw_em_r_mt_dp_U_itDbEbV7KV3Y7)

1冊目は読みやすい本です。高校数学で理解できるレベルではあると思います。
2冊目は個人的には少し難しいなと感じましたが、楕円曲線の様々な形態がしっかり書かれているので
数学の本を読むのが好きな方は是非おすすめします。



文献の紹介は以上になります。
次の記事では楕円曲線の数学的な内容に踏み込みたいと思います。

お読みいただきありがとうございました。
初学者によるプログラミングMemo　#6       ハッシュオブジェクト"登録・呼び出し"

# はじめに
今回はハッシュに関してのお話です
なお、本記述はMacにおいて、Railsでの開発を前提としています
また、まだまだひよっこですので、不備等ございましたらご指摘いただけると幸いです

# 目次
- ハッシュの定義の方法
- 応用

## ハッシュの定義の方法
まず、ハッシュとは何かを説明します

### ハッシュとは
ハッシュとはデータを格納できる入れ物のことです
ハッシュにはデータ（value）とキー(key)をセットで格納します


ハッシュの定義の方法です

```
status = {}
```
この記述だけで「空」のハッシュの定義ができました
次に、このハッシュにデータを格納していきます

```
ハッシュ名[:"キー（key）"] = "データ（value）"
```
上記記述でハッシュへのデータ登録ができます

### ハッシュの「キー」
「キー」とはハッシュに格納したデータを取り出す際に使う「鍵」の役割をします
取り出し方は

```
ハッシュ名[:"キー名（key）"]
```
これだけです
では実際に使ってみましょう

## 応用
では具体的に使ってみましょう
よくあるBMIを求める計算式を使ってみましょう

＊BMIの計算方法は 体重(kg)　÷　身長(m) の二乗　とします。

### ハッシュへの登録
実際にハッシュへ登録してみましょう

```
status = {}
status[:name] = "Ikuy"
status[:height] = 1.8
status[:weight] = 75
```

これで登録完了です
あとは求めるだけですね

```
status = {}
status[:name] = "Ikuy"
status[:height] = 1.8
status[:weight] = 75
BMI = (status[:weight]/status[:height]**2).round(1)
puts "#{BMI}"
```
これで完了です
"status[:weight]","status[:height]"これでそれぞれの値を取り出しています

".round()"は少数第○位を四捨五入するメソッドです
何位を四捨五入するかは"（）"内の数字に依存します
Pythonで遊ぶ浪人生

皆さんはじめまして、BAMと申します。
普段は浪人生をやっていて、その合間にPythonで遊んでいます。

Pythonの学習を始めたのは今年の夏ですので、正直全く詳しくもなければ、cordingが天才的にうまいわけでもありません。

Pythonで書いたコードや、その際に考えたことなどを日記感覚で投稿していこうかと思いますのでよろしくお願いします。

また、私は独学形態で学習を進めているので、Pythonの独学を考えている人が読むと、一番ためになるような記事を投稿できたらと思っています。

もちろん独学でない方が読んでも面白くなるように努めていきます。

それでは次回また会いましょう。
JestでTypeError: Cannot read property 'have' of undefinedが出てしまった時

JSのテストフレームワークの`Jest`とテストユーティリティ`Enzyme`で Reactの、とあるコンポーネントが子コンポーネントをもっているかどうかをテストするコードを書いていたら、テスト実行時に以下のエラーに遭遇した。

```
    TypeError: Cannot read property 'have' of undefined

      14 | 
      15 |   //
    > 16 |   expect(wrapper.find(Foo)).to.have.length(1)
         |   ^
      17 | })
      18 | 

      at Object.<anonymous> (src/App.test.js:16:3)
```

Enzymeの[Enzyme - API Reference](https://airbnb.io/enzyme/docs/api/ShallowWrapper/find.html)をみても、`to.have.`という書き方が掲載されていたのに、haveがないと言われてしまうので調べて見た。

## 原因

結論からいうと、上記のメソッドはChainのアサーションの書き方で、自分はChaiを利用してなかった為に起こったものだった。

https://airbnb.io/enzyme/

を良く見てなかったが、以下のような記述がある。


> Enzyme is unopinionated regarding which test runner or assertion library you use, and should be compatible with all major test runners and assertion libraries out there. The documentation and examples for enzyme use mocha and chai, but you should be able to extrapolate to your framework of choice.

このドキュメントは、要するにアサーションライブラリとして mochaとchaiを利用しているため、`Chai`のチェーン可能なメソッドで書かれていたのだった。

参考: [Chai Assertion Library](http://aaronsofaly.github.io/chai-docs/api/bdd/)


したがって、自分が確認すべきドキュメントは [こちら](https://jestjs.io/docs/ja/expect)で以下のように書くべきであった。

```js
expect(wrapper.find(Foo).length).toBe(1)
```

## 参考

https://github.com/airbnb/enzyme/issues/1974

https://stackoverflow.com/questions/43813802/enzyme-simple-to-have-not-working
Zephyr > west build時 > STM32F769:SPI2で成功, STM32L476:SPI2で失敗 > device treeファイルの定義に違いがある

```txt:動作環境
Ubuntu 18.04 LTS
ボード: STM32L476 Nucleo_64 (以下、STM32L476)
ボード: STM32F769 Discovery Kit (以下、STM32F769)
Zephyr 2.1.0-rc1
```

### 状況

- STM32F769ではSPI2を指定してビルドできる
- STM32L476ではSPI2を指定してビルドできない
    - 以下のようなエラーが出る
    
```
zephyr/include/generated/generated_dts_board_fixups.h:199:27: error: 'DT_ST_STM32_SPI_FIFO_40003800_IRQ_0_PRIORITY' undeclared (first use in this function); did you mean 'DT_ST_STM32_SPI_FIFO_40013000_IRQ_0_PRIORITY'?
 #define DT_SPI_2_IRQ_PRI  DT_ST_STM32_SPI_FIFO_40003800_IRQ_0_PRIORITY
```

https://docs.zephyrproject.org/latest/boards/arm/nucleo_l476rg/doc/index.html
にはSPI1, SPI2, SPI3の定義はある。

なぜSPI2がビルドエラーになるか調べた。


### `./build/zephyr/include/generated/generated_dts_board_fixups.h`

west buildした結果に違いがある。

STM32F769の場合、以下のような定義がある。 

```
#define DT_SPI_2_BASE_ADDRESS		DT_ST_STM32_SPI_40003800_BASE_ADDRESS
#define DT_SPI_2_IRQ_PRI		DT_ST_STM32_SPI_40003800_IRQ_0_PRIORITY
#define DT_SPI_2_NAME			DT_ST_STM32_SPI_40003800_LABEL
...
```

STM32L476の場合は上記のような定義がない。
この差はdevice treeの定義によるものと考えられる。

### device treeの差異

```stm32f7.dtsi
		spi2: spi@40003800 {
			compatible = "st,stm32-spi";
			#address-cells = <1>;
			#size-cells = <0>;
			reg = <0x40003800 0x400>;
			clocks = <&rcc STM32_CLOCK_BUS_APB1 0x00004000>;
			interrupts = <36 5>;
			status = "disabled";
			label = "SPI_2";
		};
```

上記の定義がstm32l4.dtsiにはない。

STM32L476の場合、SPI2のMemory Mappingの定義がなく、上記のエラーが出ているようだ。
同じことがSPI3でも発生する。

`<BOARD>.overlay`にspi2の定義を足すとビルドできるのかもしれない（未調査）。
Raspberry Pi 3B+で起動時プログラム自動起動　systemdまとめ

#Raspberry Piで起動時プログラム起動
Raspberry Piのプログラムを実行するのに、いちいちRaspberry Piのコマンドを開いて実行するのって不便ですよね。今回は起動時にsystemdというものを使って、プログラムを自動起動する方法を簡潔にまとめます。

#systemdについて
systemdはLinuxの起動処理やシステム管理を行う仕組みです。サービスを1つのシェルスクリプトではなくUnitという単位で、ファイルとして管理します。このため処理を細分化でき個別に実行することが可能です。また処理ごとの流れを明確にすることが出来るので、並行処理も可能です。今回は起動時のプログラムの実行の設定方法を扱いますが、起動時以外にも終了時やタイマーなどのトリガーでも実行が可能です。

#設定の流れ
設定の流れですが、基本的にはserviceファイルというものを作成して、serviceファイルを使える状態にすることで可能です。

##serviceファイル作成
serviceファイルは/etc/systemd/system/のディレクトリに作成してください。よって以下のコマンドを実行します。test.serviceのtestの部分は好きな名前で大丈夫です。

```
$ sudo nano /etc/systemd/system/test.service
```

中には以下のように記述します。

```:test.service
[Unit]
Description = do test

[Service]
ExecStart=/home/pi/systemd/test.sh
Restart=always
Type=simple
User=pi

[Install]
WantedBy=multi-user.target
```

[unit]
ユニット自体の定義をします。
Descriptionは動作に影響しないので、自分で決めてください。

[service]
ここで起動時のコマンドを決定します。RestartとTypeで設定すればサービスが停止した際の再起動などの設定もできます。また、Userで実行権限も設定できます。デフォルトではsudo権限で実行するのに加え、systemdには権限に応じたmoduleしか探しません。従って、user権限でpip installしたmoduleはno moduleと判定されてしまうので、sudo pip installするか、サービスファイルの権限の設定をpiに変えてください。

ExecStart: サービス起動コマンド
Type: サービスプロセスの起動完了の判定方法。デフォルトは「simple」。
「simple」: ExecStartで指定したコマンドを実行した時点でサービスが立ち上がったと判断
Restart: サービスプロセス停止時の再起動条件（デフォルトは「no」）
「always」: 常に再起動を試みる
User: 実行する権限（デフォルトは「root」）


[install]
このセクションは決まり文句として書いてください。
これがないと次の動作ができません。

#サービスファイルの再読み込み
サービスファイルが完成したら、デーモンに読み込みを行います。

```
$ systemctl daemon-reload
```

#サービスファイル動作確認

サービスファイルは以下のコマンドで起動停止が可能です。実行時は.seviceを抜いて自分の設定したサービスファイル名を入力してください。

```
$ systemctl start test（起動）
$ systemctl stop test　（停止）
```

#serviceファイルを有効化する
動作の確認ができたら、以下のコマンドでサービスファイルを起動時に実行する(enable)するか、オフにするか(disable)にするかを決定します。

```
$　systemctl enable test 　（デーモン起動）
$　systemctl disable test　（デーモン停止）
```

#起動時の実行状況をコマンドで確認する
起動時に実行した場合、コマンド上に流れないのでエラーが起きていても確認ができません。起動後、このコマンドを実行すれば、起動時のプログラムの実行のログが確認できます。

```
sudo LANG=C systemctl status -l test.service
```

#参考にしたもの
今回は以下の記事を参考にしました。
https://qiita.com/sinsengumi/items/24d726ec6c761fc75cc9
https://qiita.com/molchiro/items/ee32a11b81fa1dc2fd8d
https://tomosoft.jp/design/?p=11697
https://qiita.com/marumen/items/e4c75a2617cb5d0113ce
https://www.souichi.club/technology/systemd/

#おわりに
今回でRaspberry Piで起動時の自動実行が可能になりました。自動実行ができれば、起動時にslackbotを起動させて、スマホからの操作も可能になります。より実用的にRaspberry Piを扱うことができそうです。
エラー D8040 子プロセスの作成中または更新中にエラーが発生しました。

Visual Studio にて

*構成プロパティ -> C/C++ -> 複数プロセッサによるコンパイル -> はい（/MP）*

と、マルチコアによるビルドを有効にしている時に、ある日突然出るようになったコンパイラ（もしくはリンカ？）の内部エラー。
状況によっては直ることもあり、とりあえず解決したのでメモ。

**プロジェクトを日本語パスに置かないこと**

あとは、パスの文字数制限の可能性もあるかも？
私の場合は、日本語パスを英字パスのみに変えたら直りました。
BigQueryサンドボックスでSQLの勉強を始める~CREATE VIEW~

# 前回の記事
→[BigQueryサンドボックスでSQLの勉強を始める](https://qiita.com/minetta30/items/67a6017cde77cda7a602)
前回は以下の点について調べたことをまとめました。
>1. **そもそもBigQueryって何？？**
>2. **BigQueryは個人が勉強用に使えるものなのか**
>3. **買った参考書を活かせる（そのまま実装できる）のか**


# 目的
[参考書（SQL 第2版 ゼロからはじめるデータベース操作](https://www.amazon.co.jp/dp/B01HD5VWWO/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)）の5-1のコードでは動かなかったので備忘録として、
**PostgreSQL vs BigQuery で CREATE VIEW の違い**についてまとめます。

# BigQueryでのCREATE VIEW
既存のテーブル「Shohin」からフィールド「shohin_bunrui」別にレコード数を集計して、
新たにフィールド「shohin_bunrui, cnt_shohin」を持つビュー「ShohinSum」を作成するという問題です。

## コード比較
最終的に動いたコードを載せておきます。

```sql:参考書5-1
CREATE VIEW ShohinSum (shohin_bunrui, cnt_shohin)
AS
SELECT shohin_bunrui, COUNT(*)
FROM Shohin
GROUP BY shohin_bunrui;
```
```sql:BigQuery
CREATE VIEW `training-262712.shop.ShohinSum`
AS
SELECT shohin_bunrui, COUNT(*) as cnt_shohin
FROM `training-262712.shop.Shohin`
GROUP BY shohin_bunrui;
```
## 何を変えたのか
参考書（PostgreSQL）ではビュー名の直後でフィールド名を指定します。

```sql:参考書5-1
CREATE VIEW ShohinSum (shohin_bunrui, cnt_shohin)
```
BigQueryで同様にフィールド名を指定するとエラーになりました。

```sql:BigQueryではエラーが出る
CREATE VIEW `training-262712.shop.ShohinSum` (shohin_bunrui, cnt_shohin)
AS
SELECT shohin_bunrui, COUNT(*)
FROM `training-262712.shop.Shohin`
GROUP BY shohin_bunrui;

>>> Syntax error: Expected keyword AS but got "(" at [1:46]
```


**フィールド名をSELECT文の中に書く**ことで解決しました。

```sql:BigQuery修正後
CREATE VIEW `training-262712.shop.ShohinSum`
AS
SELECT shohin_bunrui, COUNT(*) as cnt_shohin
```

# view_option_list（今後調べる予定）
調べる中で、BigQueryでは CREATE VIEW にオプションが付けられることが分かったので、次の記事でまとめたいと思います。
>構文
>>{CREATE VIEW | CREATE VIEW IF NOT EXISTS | CREATE OR REPLACE VIEW}
view_name
[OPTIONS(view_option_list)]
AS query_expression

>~中略~
>view_option_listを使用すると、ラベルや有効期限などのビュー作成オプションを追加で指定できます。


# 参考にしたページなど
[データ定義言語ステートメントの使用（公式）]
(https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language?hl=ja#create_view_statement)
[How do I create a BigQuery View（stackoverflow）]
(https://stackoverflow.com/questions/25718707/how-do-i-create-a-bigquery-view)
Pug+Bladeで要素の属性を設定したりしなかったりする

# はじめに
Pugを使うと、HTMLを直接記述するよりもシンプルにコードを書くことができる。
しかし、Blade等のテンプレートエンジンと組み合わせるとなると、思うように書けなくなることもある。
今回、職場の先輩に解決してもらった厄介な問題について書きたいと思う。

# 分かりやすい例

```html
<div class="@if($flag) class-A @endif">
  <!-- ... -->
</div>
```
`$flag`が`true`の時のみ`class-A`を付与したいというとき、このように書くことができる。

```
div(class="@if($flag) class-A @endif")
  // ...
```

このように、属性*の内容*を操作することについては、資料が多いこともあり、恐らくそこまで苦戦せずに辿り着くことができる筈である。

# 本題
今回書きたいのは、Bladeの条件分岐で属性そのものを付与する場合の話である。

例えばラジオボタンのような`input`要素にBladeの条件分岐で`checked`属性を付与する場合であるが、HTMLに詳しくなければまずこのようにしようとするだろう。

```
input(type="radio" name="example" value="0" checked="@if($flag) checked @endif")
```
これは次のように変換される。

```html
<input type="radio" name="example" value="0" checked="@if($flag) checked @endif">
```

もし`$flag`が`false`ならば、ブラウザ上では次のように表示される。

```html
<input type="radio" name="example" value="0" checked="">
```

しかし、これではラジオボタンが選択された状態になってしまう。`checked`属性は存在するだけで選択された状態にしてしまうのだ。
このように、属性そのものの付与を条件分岐させたい場合が存在する。
これは次のようにして解決することができる。

```
input(type="radio" name="example" value="0" "@if(flag) checked @endif")
```

`属性="..."`の形ではなく、`()`内に直接ダブルクオートで括った判定条件を書き込むことで、属性そのものの付与を条件分岐させることができる。

# おわりに
この方法を知る前、どのサイトを調べても情報が見つからず、しかし実装できなければ記述が煩雑になってしまうと、困り果てていました。
そんな中、時間を割いてこの方法を見つけて下さった先輩に深く感謝しています。ありがとうございました。
いつの間にかwhileループもgenerater化していた件

Windows7 下で、Powershell v3を使用していたころ、

```powershell
function f1 {
  $x = 0
  while ($true) {
    $x
    ++$x
  }
}

f1 | select -First 10
```

と書いても、ループが回り続けるだけで結果をyieldしてくれなかった。

一方で、

```powershell
function f2 {
  $x = 0
  for (;;) {
    $x
    ++$x
  }
}

f2 | select -First 10
```

とした場合、適切に結果をyeildしつつ、きっちりループから抜け出してくれていた。

ふと気になって、Windows10下のPowershell Core 6で同じコードを実行してみたところ、両社とも適切に結果をyeildしつつ、きっちりループから抜け出してくれた。

Windows10にプリインされているPowershell 5.1でも試しても同様の結果となった。

どこまで遡ったら無限ループするか調べたところ、

```powershell
> powershell -Version 2.0
> $PSVersionTable.PSCompatibleVersions

Major  Minor  Build  Revision
-----  -----  -----  --------
1      0      -1     -1
2      0      -1     -1
```

で起動した場合だった。
ただしforによる無限ループも抜け出せなかった。

また現環境では、Powershell v3で起動した場合、両者とも結果をyeildしつつ、きっちりループから抜け出してくれた。

```powershell
> powershell -Version 3.0
> $PSVersionTable.PSCompatibleVersions

Major  Minor  Build  Revision
-----  -----  -----  --------
1      0      -1     -1
2      0      -1     -1
3      0      -1     -1
4      0      -1     -1
5      0      -1     -1
5      1      18362  145
```

v5.1までの互換性が保証されているためなのかもしれない。

**結論**
*for*による無限ループでも、*while*による無限ループのどちらも*Select-Object*コマンドレットでループを打ち切れるので、好きな方を使えばよい。
【CSS】border

## border
:sunny: 要素に枠線をつける
:sunny: 枠線の太さ、種類、色を指定して使用

```例.html
<p>枠線だよーん</p>
```

```例.css　
p {
  width: 300px;
  border: 3px solid red;
}
```

<img width="316" alt="スクリーンショット 2019-12-27 18.55.38.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/532773/acd7c291-4185-a6e8-3199-2d2c619203cd.png">

３px・・・線の太さ
solid・・・実線
red・・・赤

ちなみに・・・

border・・・上下左右に線をつける
border-top・・・上に線をつける
border-bottom・・・下に線をつける
border-left・・・左に線をつける
border-right・・・右に線をつける
#Ruby の pry で Tempfile が削除されるのを確認する例

pryで

```
[1] pry(main)> Tempfile.new.path
=> "/var/folders/nt/brt3bhdn50v57vqgz5t6xqc40000gn/T/20191226-7101-okbue4"
```

consoleで

```
$ ls /var/folders/nt/brt3bhdn50v57vqgz5t6xqc40000gn/T/20191226-7101-okbue4
/var/folders/nt/brt3bhdn50v57vqgz5t6xqc40000gn/T/20191226-7101-okbue4
```

pry で

```
[2] pry(main)> exit
```

console で

```
$ ls /var/folders/nt/brt3bhdn50v57vqgz5t6xqc40000gn/T/20191226-7101-okbue4
ls: /var/folders/nt/brt3bhdn50v57vqgz5t6xqc40000gn/T/20191226-7101-okbue4: No such file or directory
```

https://docs.ruby-lang.org/ja/latest/class/Tempfile.html

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->