OmniAICreator/Qiita-1.07M huggingface dataset:
Jupyter で AtCoder 問題の入力が複数行にわたるときでも楽に入力できるようにしてみた

# はじめに

9 か月くらい前から [AtCoder](https://atcoder.jp/) のコンテストに参加しています。とても楽しいです。エンジョイ勢の緑なのであまりガチっぽいことは語れないですが…

僕はとても面倒くさがりで手元に開発環境を構築するのですら億劫だと感じているので、Docker で Jupyter Lab を立ち上げてそこでコンテストの問題を解いてます。そんな僕が面倒くさいなあと感じているのは、問題の入力が複数行にわたるときです。Jupyter は標準入力に一度に入力できるのが 1 行だけなので、複数行の場合だと入力例を 1 行ずつコピペして入力していかないといけません。2 行くらいならまだ我慢できるのですが、10 行とかになるとそれだけで投げ出したくなります。

これまでは我慢しながらやっていたのですが、そろそろ何とかしたいなあと思い、ちょっと考えてみました。所詮は Python のことをよく理解しておらず、かつ実行速度をキリキリにチューニングしないと解けないレベルの問題には手が届かないレベルの弱者が考えた拙いアイディアですが、どなたかのお役に立てたら幸いです。（試していないですが、Google Colab でも同じことができると思います）

# 本題

## 実現したいこと

実現したいことは主に以下の 2 点です。

* 同じ Notebook 上で解答と入力を同時に扱いたい（入力を別ファイルから読み込むとかはしたくない）
* Cell の内容をそのままコピペして解答を投稿したい（投稿する直前に部分的にプログラムを書き換えるとかはしたくない）

これが実現できていれば解答の実行時間が多少落ちてもまあ仕方がないかなという考えでいます。

## アイディアの説明

「解答部」と「入力部」をそれぞれ別の Cell に記述します。

### 解答部

以下のプログラムをテンプレートとします。

```python
import sys, os
from collections import deque

# ストリームを引数に指定して呼び出す（引数なしの場合は、標準入力を使う）
def main(f = sys.stdin):
    # ストリームの内容をすべて読み込み deque に詰め込む
    answer(deque(map(lambda s: s.rstrip(os.linesep), f.readlines())))

def answer(lines):
    # ☆★☆ ここに解答の処理を記述する ☆★☆
    # 入力は lines（deque）に詰め込んでいるので input() の代わりに lines.popleft() などを使えばよい

# debug という名前の変数が宣言されていなければ、引数なしの main メソッドを呼び出す
if 'debug' not in globals():
    main()
```

ポイントは最後の 2 行です。Jupyter 上で、最初に別の Cell で `debug = 1` などのように `debug` という名前の変数を定義しておけば  `main` メソッドが呼び出されなくなります。AtCoder に提出するときは、解答部の Cell だけを丸々コピペすれば `debug` という名前の変数が定義されていないことになるので、 `main` メソッドが呼び出されて標準入力からテストケースの入力が読み込めるようになります。

### 入力部

以下のプログラムをテンプレートとします。

```python
import io
​
main(io.StringIO("""\
# ☆★☆ この中に入力例を丸々コピペする ☆★☆
# 複数行にわたっていてもよい
"""))

# 複数の入力例を同時に試したいときは main メソッドの呼び出しを増やせばよい
main(io.StringIO("""\
# ...
"""))
```

[StringIO](https://docs.python.org/ja/3/library/io.html#io.StringIO) を使うとテキストをストリームとして扱うことができます。これを標準入力の代わりとすることで、Jupyter 上で複数行の入力も容易に扱えるようになるという仕掛けです。

## 実際に試してみた

AtCoder Beginner Contest 194 の [B - Job Assignment](https://atcoder.jp/contests/abc194/tasks/abc194_b) で試してみました。
（解答内容がショボいのは見逃してください…）

### Jupyter 上での動作結果

実際に Jupyter 上で実行した結果をキャプチャしました。`debug = 1` の呼び出し、解答部、入力部をそれぞれ別の Cell に分けて上から順番に実行しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295482/2caf0266-dfc5-8893-4142-d25859958c8f.png)

### AtCoder 上での動作結果

解答部の Cell だけコピペして提出してみたところ、期待どおり AC になってくれました。やったぜ。

https://atcoder.jp/contests/abc194/submissions/20845957

# おわりに

AtCoder 楽しいです！ みなさんもぜひやりましょう！
Djangoのチュートリアルに入門してみた。

# TL;DR

チュートリアルの中身自体には言及してません。日本語のチュートリアルがあるので大変進めやすかったです。

# Day 1

## 前提

* pyenv, venv, あたりで環境構築する。venvを使う理由は https://qiita.com/toast-uz/items/f2df428f75b049b1d172 この辺りを読んで納得したところがある。

## 環境構築

の前にDjangoがRequirementしてるpythonのバージョンなどを確認 > https://docs.djangoproject.com/ja/3.1/faq/install/

* pythonのインストール

```
$ pyenv install 3.9.0
$ pyenv local 3.9.0
$ pyenv versions
  system
  3.6.8
  3.7.2
  3.8.2
* 3.9.0 (set by /Users/yamato/Src/django-tutorial/.python-version)
```

* venvで環境作り

```
$ python -V
Python 3.9.0
$ python -m venv django-tutorial
```

* アクティベーションを`source django-tutorial/bin/activate`で行う（抜けるには`deactivate`だけで良い）以下はアクティベーションした環境ないで行う。

* Djangoのインストール

```
$ python -m pip install Django
```

* pipのバージョンが古いぞ。というワーニングが出たので、それにも対応

```
$ python -m pip install --upgrade pip
```

* pythonの対話シェルを使ってDjangoの確認

```
$ python
Python 3.9.0 (default, Mar 11 2021, 16:15:44) 
[Clang 12.0.0 (clang-1200.0.32.29)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import django
>>> print(django.get_version())
3.1.7
```

* settings.pyのSECRET_KEYの外部ファイル化はここを参考にした > https://qiita.com/haessal/items/abaef7ee4fdbd3b218f5


## Day1：雑感（チュートリアル3まで終了）

* 理解しやすく大変シンプルに出来てる印象。VSCodeでKite使って書いてると保管機能がヤバイ。
* TIME_ZONEの設定でなぜか’Asia/Tokyo'ではmigrateがうまくいかず、'Japan'とするとうまくいく。後でもう一度確認。
* 管理画面を作ってくれるのだがMT3時代を思い出す感じのデザインでほっこりした。というのはともかく、これを自動で用意してくれるのは大変便利だと思う。ここにデザインやUIの機能を足していく、となると大変そうなのでそういうのが必要になったらそれは別途必要なものだけを作った方がいいのか、この管理画面を拡張した方がいいのかは要検討。Django使いの先人たちの事例を知りたいところ。
* プロジェクトとアプリ、という分け方は便利そう。機能を拡張していくときにアプリケーションを分けて作っていくことができるなら拡張しやすいのではないか。

と言った感じ。Day2に続く。

## Day2:雑感（チュートリアル終了）

* 何か特別に難しい、という箇所はない感じ。
* 管理画面のカスタマイズが自由度が高く、ブログシステム程度ならすぐにできてしまうのでは？と思う。
* template engineについては一考の余地があるが、Djangoのものが使えない、というわけではない（が、ReactとかでSPAでフロントを置いてしまえばDjango側はAPIを切るだけなのでバックエンド側とフロントでテストの書き分け（担当わけ）も出来て良いだろうな、、というところ）。
* チュートリアル自体にはone to manyのリレーションはあるが、many to manyの例はない。この辺り（ https://djangobrothers.com/blogs/django_manytomany_through/ ）をみるとかなり簡単に中間のモデルを用意してmany to manyのリレーションも張れることがわかる（何かオレオレなアプリでも作って試しておきたいところ）
* 管理画面をカスタマイズしていくとデフォルトの色と文字の漢字がめっちゃMT3のころを思い出して懐かしい笑。

と言った感じ。概ね好印象なので積極的に使っていこうと思う。
HTTPとは

# HTTPとは
簡単にいうとWebブラウザでURLにアクセスし、HTMLを取得する際の通信プロトコルのひとつである。
以下詳細↓

クライアントから要求（HTTPリクエスト）を送り、サーバが応答（HTTPレスポンス）を返すプル型（リクエスト/レスポンス型）の通信を基本としており、WebブラウザやWebクローラなどのクライアントから送信する要求の形式や、Webサーバからの応答の形式などを定めている。HTTPリクエストおよびレスポンスは要求や返答の内容、資源の種類や形式などの情報、および関連する情報を記述したヘッダ部と、送受信する資源（ファイルなど）の本体であるボディ部で構成される。ボディ部は基本的にはレスポンスに存在するが、クライアント側からデータを送信する際にはリクエストにも付加される。
<br>
<br>
#### HTTPリクエスト
ブラウザ → サーバーに要求するのが「HTTPリクエスト」
HTTPリクエストは以下の3つの部品から成り立つ
1. HTTPリクエストライン（リクエストライン）
2. HTTPリクエストヘッダ（ヘッダ）
3. HTTPリクエストメッセージボディ（メッセージボディ）

HTTPリクエスト画面
![HTTPリクエスト画面](https://i.gyazo.com/77c0e36dc3ef90bd7d4e69ecab1d6b70.png )
<br><br>
- HTTPリクエストライン（リクエストライン）
 「何を、どうしたい」が書かれている.
   HTTPリクエストラインの書式は
【メソッド】[空白]【URI】[空白]【HTTPのバージョン】
【メソッド】は「どうしたい」を指定する場所で「GET」や「POST」などを指定する。
【URI】は「何を」を指定する場所です。
【HTTPのバージョン】は「どんなルールで」を指定する場所です。
    まとめて見やすくすると
【どうしたい】[空白]【何を】[空白]【どんなルールで】ということになります。
<br>
- HTTPリクエストヘッダ（ヘッダ）
 （Webブラウザ）から（Webサーバ）に伝えたい「お願いごとやお願い元に関するあれこれ」が書かれている場所。
 HTTPリクエストヘッダの書式は　【フィールド名】:【内容】　です。
この書式で必要な数だけ縦に並びます。
<br>
- HTTPリクエストメッセージボディ（メッセージボディ）
「補足のメモ書き情報」が書かれている場所。
例えばPOST通信の場合は、受け渡されるパラメータの内容が、ここに記述されます。
GET通信のように補足の必要がない場合は、特に何も書かれません。
<br>
<br>

#### HTTPレスポンス
サーバー → ブラウザが「HTTPレスポンス」
HTTPレスポンスは以下の3つの部品から成り立つ
1. HTTPステータスライン（リクエストライン）
2. HTTPレスポンスヘッダ（ヘッダ）
3. HTTPレスポンスボディ（レスポンスボディ）

HTTPレスポンスヘッダ画面
![HTTPレスポンスヘッダ画面](https://i.gyazo.com/01f003bb455f808ac896d77b599d6fb1.png)
HTTPレスポンスボディ画面
![HTTPレスポンスボディ画面](https://i.gyazo.com/d0adb233d051d8e844eb0fc051c99e2e.png)
<br>
<br>
- HTTPステータスライン（リクエストライン）
「HTTPレスポンスの部品で『HTTPリクエストの結果』が書かれている場所
<br>
- HTTPレスポンスヘッダ（ヘッダ）
『ステータスラインに書ききれないレスポンスの情報』が書かれている場所
<br>
- HTTPレスポンスボディ（レスポンスボディ）
サーバーから返ってきたHTMLファイルの中身です。

HTTPステータスコードは3桁の数字で表されます。よく使われるステータスコードは、次のように分類されます。
200番台は成功
200：OK、データを送ります
300番台はリダイレクト
301：新しい場所から取得してください（今後もずっと）
302：新しい場所から取得してください（今回だけ）
304：変更されていません（データ本体は送られない）
400番台はクライアント側のエラー
401：ユーザー認証が必要です
403：アクセスが禁止されています
404：見つかりませんでした
500番台はサーバー側のエラー
500：内部エラー
503：現在はサービス提供不可能
Gitとはなんぞや

## Gitとはなにか
Gitとは分散型バージョン管理システム。
簡単にいうとファイルのバージョン管理が簡単にできるツールです。

## Gitがないとなにがつらいか
編集した履歴を複数人で共有など共同開発が難しくなってしまう。

## ブランチとはなにか
ブランチは、1つのプロジェクトから分岐を作ることにより、プロジェクト本体に影響を与えずに開発を行える機能のことを言います。

## コミットとはなにか
追加・変更したファイルをGitに登録するためのコマンドです

## ローカルブランチとはなにか
ローカルリポジトリ（自分のPC上）で作成したブランチのこと。


## リモートブランチとはなにか
リモートリポジトリ上のブランチの状態を指すものです。

## コンフリクトとはなにか。どういった場合におきるか。
変更内容を統合する際に、もし同じファイルの重複する部分が変更されていると、変更同士が衝突し「コンフリクト」と呼ばれる状態を引き起こします。

## プルリクエストとはなにか
開発者のローカルリポジトリでの変更をGitにて他の開発者に通知する機能です。

## .gitignoreとはなんですか
Gitリポジトリにおいて、意図的に追跡対象から外したい（無視したい）ファイルを設定するためのファイルです
このファイルに書かれたファイルは上から順に処理されて、Gitのトラッキングの対象外になる。
Gitのトラッキングの対象外になるということは、Gitで管理していたディレクトリの中にあっても無視されるということです。ちなみに実際のファイル名は「.gitignore」で、隠しファイルとして存在する。
print関数を用いずにHello Worldを表示する

##1. はじめに
　pythonの勉強を始めて最初に書いたコードは何でしたか？恐らく多くの人は次のようなコードだと思います。

```python:helloworld.py
print('Hello World')
```

　引用符がシングルクォーテーション(')かダブルクオーテーション(")か、あるいは引用符内の文字が大文字か小文字かの違いはあったと思いますが、print関数を用いて文字を表示させたと思います。ちなみに自分はpythonをインストールした初日にこのコードを実行して**「やったー。これで自分もパイソニナンになれたぞ！」**って感動しました。
　pythonを勉強していてとふと次のような疑問を抱きました。**「print関数以外で文字を表示する方法はないのかな？」**その方法があればprint('Hello World')に対抗できるぞ！と思い記事にしました。

##2. 条件
この記事を執筆するにあたり条件は次のとおりとしました。
・Hello Worldを表示する
・print関数は用いない
・pythonだけを用いる
・コードの実行は1回だけとする

##3. やり方その1
　「python print以外」、「python 出力」と調べたら[Python Tips：改行なしで文字列を出力したい](https://www.lifewithpython.com/2013/12/python-print-without-.html)という記事がありました。どうやらsys.stdout.write()を用いるとできるそうです。sys.stdout.write()はこの記事で「Python2の場合」で紹介されていたのですが、python3.7でも実行できたのでやり方その1として紹介します。

>```python:alt_helloworld1.py
import sys
sys.stdout.write('Hello World'+ '\n')
```


##4. やり方その2
　やり方その2はinputを使う方法です。inputだとプログラムが入力待ちで一時停止してしまうのですが、今回はHello Worldを表示させただけなので要件を満たしたものとします。

```python:alt_helloworld2
str = input('Hello World')
```

##5.まとめ
　一応print関数を用いないでHello Worldを出力させることに成功しました？他のやり方を思いついた方がいらっしゃればぜひコメント欄で教えて下さい。あとprint関数の対抗にはなりませんね。


###参考文献
[Python Tips：改行なしで文字列を出力したい](https://www.lifewithpython.com/2013/12/python-print-without-.html)
Javaの環境構築（Windows）

# 概要
1. JDKのインストール
2. 環境変数の設定

# JDKのインストール
以下のリンクから、任意のバージョンのJDKをダウンロードしてください。

[https://jdk.java.net/](https://jdk.java.net/)

ダウンロードが完了したら、そのファイルを任意の場所で展開してください。

# 環境変数の設定

PCの画面左下にある検索バーに「環境変数」と入力し、「環境変数を編集」が表示されたらクリックして開きます。

ユーザー環境変数(U)に[新規(N)...]で展開先パスを以下のように設定してください。

![Picture1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557107/fdf96a1d-1d5a-73df-e81c-25a47872e81e.png)

さらに、ユーザー環境変数(U)の”Path”の中に以下の項目を追加してください。

```
C:\(展開先ディレクトリ)\jdk-13\bin
```

以下のコマンドを実行してみてください。

```
java -version
```

Javaのバージョンが表示されればインストール完了です！
CarrierWaveでファイルサイズをバリデーションする（1行で）

こちらの記事のトリビュート
https://qiita.com/tkiha/items/20216451845be2e4b1aa

gemを使う方法もあるので、それの紹介。


1). gemを入れる

```ruby
gem 'file_validators'
```

2). モデルに記述（例）

```ruby
validates :image, file_size: { less_than: 2.gigabytes }
```


https://github.com/musaffa/file_validators


## Rspecをどう書いたかmemo

上の例のバリデーションを入れているとして、テストするのに2ギガバイトのファイルを用意するのはしんどいので、
モックにしました。

```ruby
allow(some_model.image).to receive(:size).and_return(2.gigabytes)
```
Macのターミナルで実行したすごくつまらないピタゴラスイッチ

dockerのコンテナビルドをBEEP音で知らせてくれないかなと思い探してみたら、sayコマンドの存在に気づいたのでちょっと遊んでみた。


# 実行結果
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Macのターミナルで実行した<br>すごくつまらないピタゴラスイッチ。 <a href="https://t.co/VRz4v9rDLJ">pic.twitter.com/VRz4v9rDLJ</a></p>&mdash; みゃーはむ (@miyahamuchan) <a href="https://twitter.com/miyahamuchan/status/1370327011021836290?ref_src=twsrc%5Etfw">March 12, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


## 準備
最後に表示するテキストをお好みで作ります。

```
vi end.txt
```

```end.txt
　　終
制作・著作
━━━━━━━━━━
 Ⓝ　Ⓗ　Ⓚ
```


## 実行したコマンド
```
say "HELLO WORLD"
echo ...3 && sleep 1
echo ...2 && sleep 1
echo ...1 && sleep 1

say "ぴっ"
say "たっ"
say "ごらっ"
say "スイッチ"

cat end.txt && say "ずみっ"
```

# おにぎりの具だけしか喋らないターミナル

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おにぎりの具縛りでsayコマンド<a href="https://twitter.com/hashtag/%E5%91%AA%E8%A1%93%E5%BB%BB%E6%88%A6?src=hash&amp;ref_src=twsrc%5Etfw">#呪術廻戦</a> <a href="https://t.co/8dMwtEAjO9">pic.twitter.com/8dMwtEAjO9</a></p>&mdash; みゃーはむ (@miyahamuchan) <a href="https://twitter.com/miyahamuchan/status/1370331593705988097?ref_src=twsrc%5Etfw">March 12, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## 実行したコマンド
```
say "昆布"
say "梅"
say "しゃけ"
say "高菜"
say "いくら"
say "ツナマヨ"
```

# 完了音は何を喋らせるべきか？
終わりとか３文字の単語以上だと歯切れが悪いのでこれがいいと思う。

```
say "ずみっ"
```
【隠しメソッドフィールド】LaravelのルーティングでPUTを定義した際にエラーが出た話。

Larevelでupdate機能を作成中ルーティングでputを定義しました。
その際に`MethodNotAllowedHttpException No message` という
「`POST`か`GET`でルート指定がない」というエラーが発生してしまいました。

せっかくなので調べてまとめてみました。アウトプットのトレーニングも兼ねてやってみます。

### 結論から言うと、HTMLのformがputの形式をサポートしていないことによるエラーのようでした。

今回はformファサードを利用しているので以下のコードでした。

```PHP:edit.blade.php
// 修正前
{!! Form::open(['route' => ['report.update', $dailyReport ->id], 'method' => 'POST']) !!}
{!! Form::close() !!}
```


```PHP:edit.blade.php
//変更後
{!! Form::open(['route' => ['report.update', $dailyReport ->id], 'method' => 'POST']) !!}
   {!! Form::hidden('_method', 'put') !!}
{!! Form::close() !!}
```
実際にはLaravelでは`PUT`などの形式はPOST送信されています。
送信形式を判断してもらうためには、LaravelではPOST送信内に`hidden`で`_method`プロパティを指定する必要があります。
この`hidden`入力を利用し`PUT`のメソッド名を送信しましょう。
これは`PUT`, `PATCH`, `DELETE`なども同様です。

#####ちなみにformファサードを使わない場合は以下のように記述します。

```
<input type="hidden" name="_method" value="PUT">
```

#### さらに、bladeというテンプレートエンジンを使用していることからbladeディレクティブを使い、以下のようにも書くことができます。

```PHP:edit.blade.php
{!! Form::open(['route' => ['report.update', $dailyReport ->id], 'method' => 'POST']) !!}
   @method('put')
{!! Form::close() !!}
```
@method という隠しメソッドフィールド生成用の記述を使用するため、よりわかりやすい記述となっています。


####さらにさらに、Form::openの methodの値を PUT にしてしまえば隠しメソッドフィールドも必要なくなるとのこと。

```PHP:edit.blade.php
{!! Form::open(['route' => ['report.update', $dailyReport ->id], 'method' => 'PUT']) !!}
{!! Form::close() !!}
```

Formファサードのopenメソッドは `method`に`PUT`, `PATCH`, `DELETE`,を受けとった場合、隠しメソッドフィールドも一緒に返してくれる機能があり、こちらの記述でも正常に動作するようです。
Apache HTTP Serverの構築し、Tomcatに連携する手順

#目的
WebサーバとしてApache HTTP Serverをインストールし、外部からのリクエストをTomcatに連携させます。
※今回はTomcatとApacheは同じサーバ上で動作するように構築します。

#構築環境
Iaas：AWS EC2
OS：RHEL-7.6_HVM_GA-20190128-x86_64-0-Hourly2-GP2（コミュニティ AMI）
Apache：2.4.6

# Apache HTTP Serverをyumでインストール

```
$ sudo yum install httpd -y
```

#httpd.confを設定
```
$ sudo vi /etc/httpd/conf/httpd.conf
```

###1．[ServerName ディレクティブ](https://httpd.apache.org/docs/2.4/ja/mod/core.html#ServerName)
```
ServerName 'サーバ名'　（例）www.example.com:80
```

エラー画面を表示する時など、自分自身の名前を表示する際に使用されます。
設定しなかった場合、ApacheがIPアドレスから逆引きしてホスト名を検知し、ポートはリクエストを受けたポートを使用するようになります。

###2．[ServerTokens ディレクティブ](https://httpd.apache.org/docs/2.4/ja/mod/core.html#ServerTokens)
クライアントに送り返す、応答ヘッダ内にサーバのOS種別や組み込まれているモジュール情報を含めるかどうかを指定します。

```
ServerTokens Prod
```

###3．[TraceEnable ディレクティブ](https://httpd.apache.org/docs/2.4/ja/mod/core.html#TraceEnable)
TRACEメソッドでのHTTPリクエスト受け入れるか設定する項目。
XST対策のため、offを指定します。

```
TraceEnable off
```

###4．[\<Directory> ディレクティブ](https://httpd.apache.org/docs/2.4/ja/mod/core.html#Directory)
デフォルトのままだとサーバ内の/var/www/html配下がアクセス可能となり、ブラウザ上でディレクトリ一覧が表示されてしまう。
サーバ内が探索できてしまい、セキュリティ上よろしくないのでコメントアウトする。

```
<Directory "/var/www/html">
・・・
Options FollowSymLinks
・・・
</Directory>
```

###5．[リバースプロキシ設定](https://httpd.apache.org/docs/2.4/ja/mod/mod_proxy.html)
外部からのリクエストをtomcatに連携するように設定します。
今回はHTTP通信で行います。

```
# フォワードプロキシサーバとしての動作を有効/無効に設定します。
# Onだと公開プロキシになってしまうため、リバースプロキシとして設定する今回ではOffに設定します。 
ProxyRequests Off

# すべてのクライアントに対しアクセス許可する場合
<Proxy *>
Order deny,allow
Allow from all
</Proxy>

# 特定のクライアントのみアクセス可能にする場合
<Proxy *>
Order Deny,Allow
Deny from all
Allow from 許可するクライアントのDNSまたはIPアドレス
</Proxy>

# Tomcatにリクエストを連携する設定します。
# 後続で行うTomcatのアクセス制限を設定するとlocalhostでもアクセス出来なくなるため、
# 連携先はlocalhostではなく、ループバックアドレス(127.0.0.1)で指定します。
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
```

#httpdサービスを起動する

```
$ sudo systemctl start httpd

ストップやステータス確認するときは以下の通り
$ sudo systemctl stop httpd
$ sudo systemctl status httpd
```

#Tomcat側の設定
###1.アクセス制限
Webサーバを配置した場合、ユーザーがTomcatへの直接アクセス出来るのはセキュリティ上良くありません。
そのため、ループバックアドレスからのアクセスのみ許可するようにserver.xmlを修正します。

```
$ vi /opt/apache-tomcat-8.5.61/conf/server.xml 

<Host name="localhost"  appBase="webapps"  unpackWARs="true" autoDeploy="true">
  <!-- 以下のValueタグを追加します -->
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127.0.0.1" />
</Host>
```

#SELinuxの設定
特定のディストリビューションではSELinuxがデフォルトで有効になっており、httpd_can_network_connectが無効化(off)されているため、http通信が出来ない場合があります。
そのため、httpd_can_network_connectの設定を確認し、必要があれば設定を変更します。

```
$ getsebool httpd_can_network_connect
httpd_can_network_connect --> off
```

以下の通り、httpd_can_network_connectの設定を変更して外部通信を許可します。


```
$ sudo setsebool -P httpd_can_network_connect=1
```

#おわりに
以上の手順でWebサーバを通してアプリにアクセス出来れば成功です。

#参考文献
https://httpd.apache.org/docs/2.4/ja/
【Kotlin 初心者】ステータスバーの色変更方法

## ステータスバーの色変更方法
Androidアプリを作る際にステータスバーを適宜変更する必要があるかと思います。いつもやり方忘れるのでメモ変わりとして残ります

### イメージ画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320838/c37d97c5-d51e-d070-70bc-1b6ff51fb287.png)

### 変更方法
まずはAndroidManifestでThemaを変更していきます
`android:theme="@style/statusbar.theme">`AndroidManifestのthemeを変更します

```/app/src/main/AndroidManifest.xml 

<application
        android:name="core.CoettoApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="Coetto"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/statusbar.theme">
```

statusbar.xmlに好きな配色で指定すれば変更完了です！

```themes.xml
<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="statusbar.theme" parent="Theme.AppCompat.DayNight.NoActionBar">

        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>

        <!-- Primary brand color. -->
        <item name="colorPrimary">@color/purple_200</item>
        <item name="colorPrimaryVariant">@color/white</item>
        <item name="android:textColorPrimary">@color/white</item>
        <item name="android:background">@color/white</item>
        <item name="colorOnPrimary">@color/white</item>
        <item name="colorOnSecondary">@color/white</item>
        <item name="android:windowLightStatusBar">true</item>
        <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
        <!-- Customize your theme here. -->
    </style>
</resources>
```
【WordPress】【OnePress】お問い合わせセクションの表示を変更

WordPress のテーマ OnePress をHPを制作しています。
お問い合わせセクションに Contact Form 7 のプラグイン利用して表示したところ、右側に気になるスペースが。。。

![修正前.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25757/3576652b-ab95-582f-7a35-b58f677bcc51.jpeg)


原因を確認したところ、以下のコードを修正すればいいとのこと！
※教えてもらったところ bootstrap を使ってるんですね！

■修正前
![コード修正前_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25757/40d33f79-a5d4-3793-1ad8-fbb6473f0560.jpeg)


■修正後
![コード修正後_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25757/4a2d70ae-4f00-4229-3fdd-b4acfce31aaf.jpeg)


以下修正後の画面です。
わかりにくいですが、テキストの幅が右側まで無事広げることができました！

![修正後.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25757/cce58c35-5b65-0541-e81a-c23c2c57bbaa.jpeg)
wemosでsin波

#概要

シリアルプロッターで表示した。


#写真

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/264d0bc4-0033-48c0-26e7-6c66e8f358b4.jpeg)

#サンプルコード

```
#include <math.h>

float a = 0;

void setup() {
	Serial.begin(115200);
	while (!Serial)
	{
		;
	}
}
void loop() {
	a = a + 0.1;
	delay(100);
	Serial.println(sin(a), 6);
}


```


以上。
FlutterのStatelesswidgetでinitstateしたい時

#Statelesswidgetでも画面呼び出し時に処理実行したい...
と思って調べたら良さそうなのがあったので自分用メモ

###StatefulWrapperクラスを作る

```StatefulWrapper.dart
class StatefulWrapper extends StatefulWidget {
  final Function onInit;
  final Widget child;

  const StatefulWrapper({@required this.onInit, @required this.child});

  @override
  _StatefulWrapperState createState() => _StatefulWrapperState();
}

class _StatefulWrapperState extends State<StatefulWrapper> {

@override
  void initState() {
    if(widget.onInit != null) {
      widget.onInit();
    }
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return widget.child;
  }
}
```

###StatefulWrapperクラスを作る
StatefulWrapperで全体をラップする。

```HomePage.dart
class HomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return StatefulWrapper(
      onInit: () {
        _getThingsOnStartup().then((value) {
          print('初回の処理が実行される！');
        });
      },
      child: Text('ほーむ'),
    );
  }

  Future _getThingsOnStartup() async {
    await Future.delayed(Duration(seconds: 2));
  }
}
```

参考ページ: [リンク](https://www.filledstacks.com/snippet/how-to-call-a-function-on-start-in-flutter-stateless-widgets/)
【JavaScript】配列・オブジェクト（map, forEach）

## はじめに
プログラミングを勉強しはじめて、配列・オブジェクトなどの値をどう変化させるのか、どうとっていけばいいのかと悩むことが多くなってきたので、オブジェクトから配列へ、配列からオブジェクトへどう変化していくのかどうすればいいのかを書きました。

## 使うデータ(initialData)
```
const data = [
  { name: "taro", age: 17, gender: 0 },
  { name: "tarako", age: 18, gender: 0 },
  { name: "takeru", age: 19, gender: 1 }
];
```
配列の中にそれぞれのkeyを持つオブジェクトのデータ

## mapを使ってみる
```
const mapData = data.map((data) => ({
  name: data.name,
  age: data.age,
  gender: data.gender
}));

// 出力
console.log(mapData)

//　結果
[
  { name: "taro", age: 17, gender: 0 },
  { name: "tarako", age: 18, gender: 0 },
  { name: "takeru", age: 19, gender: 1 }
]
```


## forEachを使ってみる
```
const objList = {}
const arrayList = []

const foreachdata = data.forEach((data, index) => {
 const name = data.name
 objList[index] = name
 
 arrayList.push(data)
}

// 出力
console.log(objList)
console.log(arrayList)

// 結果

//objList
{
  "0": "taro",
  "1": "tarako",
  "2": "takeru"
}

//arrayList
[
  { name: "taro", age: 17, gender: 0 },
  { name: "tarako", age: 18, gender: 0 },
  { name: "takeru", age: 19, gender: 1 }
]
```


## 配列データをオブジェクトデータに
```
const objData = {...data}

// 出力
console.log(objData)
console.log(objData[0])
console.log(objData[0].name)

// 結果
{
  "0": { name: "taro", age: 17, gender: 0 },
  "1": { name: "tarako", age: 18, gender: 0 },
  "2": { name: "takeru", age: 19, gender: 1 }
}

{ 
  name: "taro", 
  age: 17,  
  gender: 0 
}

"taro"
```

## オブジェクトに変換してkeyを追加してみた
```
// key=id データ
const idData= [
  "3k3BY9fFF2orKZ2KK5iD",
  "PT5aOkhANVxVfFMRkTFJ",
  "cAdMjNY0vxPLgrKH6oNN",
]

// 処理
const newData = {}

idData.forEach((id) => {
  data.forEach((d) => {
     newData[i] = d
  }
}

// 出力
console.log(newData)

// 結果
{
  "3k3BY9fFF2orKZ2KK5iD": { 
     "name": "taro",
     "age": 17, 
     "gender": 0 
  },
  "PT5aOkhANVxVfFMRkTFJ": {
      "name": "tarako", 
      "age": 18, 
      "gender": 0 
  },
  "cAdMjNY0vxPLgrKH6oNN": { 
      "name": "takeru", 
      "age": 19, 
      "gender": 1 
  }
}

```

## 終わりに
まだまだ勉強中なもので、もっとこうしたらいいなどのアドバイス等があれば宜しくお願いします！
Modeler詰将棋！の線形補完をやってみた

IBMソリューションブログの[こちらの記事](https://www.ibm.com/blogs/solutions/jp-ja/modeler-tips-02/)にある、Modeler詰将棋！が面白かったので、気晴らしついでにやってみました。

### 例題１：「欠損の直前の値を代入する」
これは簡単ですね。同じ値をいれるので、置換ノードで`@OFFSET(@FIELD,1)`で上からコピーすればいけます。

ストリームは置換ノードの処理のみ。1手詰め。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397277/e154239f-142c-ca2c-e77f-9c4f467ac269.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397277/4b238864-9116-c3f5-e429-f053adc4d9bb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397277/638cead4-2117-6333-9992-c435a86e465f.png)



### 例題２：「欠損値を線形補間する」
これを７ノード未満でやることにチャレンジ。

実戦ではこういうケースでは集計ノードをうまく使えないか考えます。
色々考えて、６ノード(6手詰め）で出来ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397277/0d0590d1-9791-7c07-3acc-759fb4c68f03.png)

まず新規フィールド作成ノードで、sectionとして集計する区間にラベルをつける。nullと非nullの区間ごとにカウントアップさせます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397277/d5e8f6e0-f3a3-90b1-b75c-e1b491d082b4.png)

集計ノードでsection毎にTemperatureの最小と最大を集計します。このときに件数Record_Countも出しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397277/23658c25-963a-82ba-e905-37ab4bd6b9ef.png)

次の新規フィールド作成ノードがポイントで、null区間で加算する差分値diffをここで計算してます。CLEM式の意味は、1レコード後ろの最小値と１レコード前の最大値の差分（これがnull区間で埋めるべき値の幅)を、レコード件数で割って１レコードあたりの差分値としています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397277/b683504a-e412-477c-b390-e82d7896f8b0.png)

あとはこれを本流に結合して、結合で順番が狂ってしまったレコードをTimeの昇順でソートした後、Temperatureを置換ノードでnullの区間に「1つ前のレコード+diff」として埋めます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397277/463e0add-b6ba-a032-d281-ff1a64c94be3.png)

完成！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397277/1f5fde47-f017-dbc6-5561-876ad3f44bfa.png)

不要列を消すフィルターノードを入れたら7手になっちゃいますが、お題はTemperatureの補完なので、これでヨシとします。

---
（2021/3/19追記）　次のブログで紹介されました。ありがとうございます。5手詰できる猛者の登場に期待します。
https://www.ibm.com/blogs/solutions/jp-ja/modeler-tips-03/
Ruby on Rails6で新規アプリケーションを作る

初学者です。
今日から作りたいアプリケーションができたのでまとめがてらの備忘録をかきます。

**開発環境**

- 言語　Ruby2.6.5
- フレームワーク Rails6

## 前提に
前提に、すでに環境構築でRailsのインストールを終えています。
DB設計やテーブル設計、作りたいアプリケーションのエンティティなどはすでに洗い出しています。
そこからアプリケーションを作り上げていく記事です。

この記事では以下の流れで進めていきます。

1. アプリケーションの雛形を作る(rails newコマンド) + データベースの設定
2. データベースの作成
3. ローカルサーバー(localhost:3000)にてブラウザ確認

# アプリの雛形を作る
Rails6では、新規アプリケーションを作るのに**rails newコマンド**を使います。
このコマンドで雛形を作ってくれます。アプリの場所は、設置したいディレクトリです。
書き方は、以下の通り。

```
% rails _バージョン_ new アプリケーション名 -オプション(データベース管理システム名)
```

今回はバージョン6.0.0を使います。
※現時点でRails6.0.0のネット上のソースは限られているイメージなのでお好みのものを。
[Railsガイド](https://railsguides.jp/upgrading_ruby_on_rails.html)
(バージョンによってプログラムの書き方が変わりますので注意！)

アプリケーション名もお好きに！

オプションに関しましては、いくつかありますが、例えば使用するデータベースの指定なんかはここに書きます。
ここでは、データベースにMySQLを指定します。

```ruby:ターミナル
% rails _6.0.0_ new fav-shops -d mysql 
```
以下のようなエラーが出たらこちら様を参照に!(MacOSアップデートのあるあるらしいです)
https://apple.stackexchange.com/questions/254380/why-am-i-getting-an-invalid-active-developer-path-when-attempting-to-use-git-a

```ruby:ターミナル
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

下記のような表記がされれば成功です！

```
create  
      create  README.md
      create  Rakefile
      create  .ruby-version
      create  config.ru
      create  .gitignore
      create  Gemfile
        :
        :
✨  Done in 9.07s.
Webpacker successfully installed 🎉 🍰
```
# データベースの作成
**rails db:create**といきたいとこですが、まずDBの設定をしてからです。
設定方法は**database.yml**に記述します。

今回設定したいのはデータの保存形式です。
詳しくは[MySQLの公式](https://dev.mysql.com/doc/refman/5.6/ja/charset-unicode-utf8mb4.html)を確認してください

```ruby:config/database.yml
default: &default
  adapter: mysql2
  encoding: utf8   #←←←ここを修正します(元は　encoding: utf8mb4)
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  socket: /tmp/mysql.sock
```

設定ができたら**作ったアプリのディレクトリに移動**し、**rails db:create**します。
Created database 'アプリケーション名...'と表記されれば成功です！

```ruby:ターミナル
 % rails db:create
Created database 'アプリケーション名_development'
Created database 'アプリケーション名_test'
```

#  ローカルサーバーにてブラウザ確認
雛形とデータベースが完成したらローカルで確認できるかを見てみます。
そのために**rails sコマンド**を実行し、ブラウザ上のlocalhostで表示されるか確認が必要です。

**

```ruby:ターミナル
% rails s
```

http://localhost:3000
↑ここから確認できます！

以下のような画面が表示されれば成功です！
![railswel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1101585/35fddee6-d86f-3434-a7be-9a4993c9ace9.png)

と、ここまでは序盤です！
ここから本格的にMVCに触れながら機能が盛り込めます。
投稿する画像の大きさをええ感じにしたい！

## はじめに
最近Qiitaに記事を投稿し始めたのですが**「ん？なんか画像小さくないか？」**と思うことがあり、解決法を調べましたのでその内容を記載致します。結論としては、**画像のアップロード形式を変更して、サイズを指定する**ことで解決しました。もっと良い方法をご存じの方がいらっしゃいましたら是非共有ください。

※プログラミング関係の内容を他にも投稿していますので、よろしければ[こちら](https://qiita.com/oki_kosuke/items/34b1071224953776c211#%E6%8A%95%E7%A8%BF%E4%B8%80%E8%A6%A7)の一覧から他の投稿も見て頂けますと幸いです。

## 問題
ドラッグ＆ドロップでフォルダからQiitaの本文に画像をアップロードしていました。

```
# ![ファイル名](URL)の形式
![fp_ibuprofen_310.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/95151c7d-300f-b629-12aa-cd9a4bc693ce.jpeg)
```

このような感じで画像がアップロードされるのですが、**画像が小さい…**
![fp_ibuprofen_310.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/95151c7d-300f-b629-12aa-cd9a4bc693ce.jpeg)
ファイルの種類はJPG ファイルで、大きさは150ピクセル×150ピクセルです。

## 解決方法
形式を以下のように変更し、画像サイズを指定してアップロードしました。

```
# <img width="表示幅" src="URL">の形式に変更
<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/95151c7d-300f-b629-12aa-cd9a4bc693ce.jpeg">
```

<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/95151c7d-300f-b629-12aa-cd9a4bc693ce.jpeg">
形式を変更することで、画像のサイズが大きくなったことが分かります。画像のサイズはheight=""でも指定することができ、使用可能な単位は%, px, em, remです。**Qiitaに投稿する際は、widthの数値を触りながら画像の大きさを調整しているのですが、もう少し良い方法があればぜひ教えてください。**せっかくなので、widthの数値の違いによって画像の大きさがどのように変化するのか調べてみます。
##### width="100%"のとき
<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/95151c7d-300f-b629-12aa-cd9a4bc693ce.jpeg">

##### width="50%"のとき
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/95151c7d-300f-b629-12aa-cd9a4bc693ce.jpeg">

##### width="30%"のとき
<img width="30%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/95151c7d-300f-b629-12aa-cd9a4bc693ce.jpeg">

##### width="10%"のとき
<img width="10%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1057114/95151c7d-300f-b629-12aa-cd9a4bc693ce.jpeg">

そもそもですが、今回は画像サイズが小さくあまり鮮明とは言えない画像でした。なお、[こちら](https://www.wpbnavi.com/9665)を参考にするとスクリーンショットはpng形式で保存した方が解像度の観点から良いようです。

## まとめ
Qiitaにアップロードする画像のサイズの調整方法について説明致しました。

### 参考
- [Qiita(28)画像の大きさ調整](https://qiita.com/kaizen_nagoya/items/cef6ae1fcbdbec9e7be2)
- [【Qiita記事/Markdown】画像横並びの神となる](https://qiita.com/koshishirai/items/a86ce3bb569cc4652e2f)
- [パソコン初心者ナビ](https://www.wpbnavi.com/9665)
【K375s】US配列のWindowsノートでMacの英数・かな切替を使用する

ふわふわです。
在宅勤務で会社用と自宅PCを行き来するため、
3台まで切替可能なLogicoolのK375sキーボードを愛用しています。
このキーボードの特徴は日本語配列でありながらUS配列も印字されている所です。

## 手順
お急ぎの方へ
以下の手順で可能です。
(追記. こちらの方法はPowerToysをインストールできない方向けです）

1. Macで[Unifying Software](https://support.logi.com/hc/ja/articles/360025297913)をダウンロードしインストール
2. MacのUSB端子にレシーバーを接続する
3. K375sをペアリングする
4. ペアリングが完了したレシーバーをUS配列のWindowsノートに差し込む

英数・かな切替がWindowsで使用可能になります。
ちなみにoptionやcmdもaltとWindowsキーに割当てられるため人を選ぶかと思います。

## 必要だった経緯
会社用のPCがUS配列のWindowsノートPCでした。
Macで英数・かなを切り替えていたのでWindowsでも出来ないかと思っていました。

## 調べてわかったこと
US配列のキーボードを持つWindowsPCに日本語キーボードを接続すると
無変換・変換（Win表記　Macでは英数・かな）のボタンは仮想キーコード235・255に割当てされます。
ちなみに押しても何も操作が出来ません。　
IMEの無変換で切り替える方法も使えません。
※こちらの[wiki](https://w.atwiki.jp/ntemacs/pages/90.html)に詳しく書かれていました。

フリーソフトを使ってキーマップを変更する記事を見ていましたが、
私物PC以外での利用は難しいと思いました。

最後までご覧いただきありがとうございました。
Pythonの環境構築（Mac）

# 概要
1. Homebrewのインストール
2. pyenvのインストール
3. pyenvの設定
4. Pythonのインストール

# Homebrewのインストール

以下のコマンドをコピーしてターミナルで実行してください。

```
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

※インストールの途中で「Enterキー」を押すことが求められます。また、途中でPCにログインする時に使用しているパスワードの入力も求められます。

インストールが終わったら、以下のコマンドを実行してください。

```
brew -v
```

`Homebrew X.X.X`と表示されれば、正常にインストールされています！

# pyenvのインストール
以下のコマンドをターミナルで実行してください。

```
brew install pyenv
```

インストールが終わったら、以下のコマンドを実行してください。

```
pyenv -v
```

`pyenv X.X.X`と表示されればOKです！

# pyenvの設定

以下コマンドを順にターミナルで実行してください。

```
echo $SHELL
```

- 実行結果が `/bin/bash`の場合

```bash
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
```

- 実行結果が `/bin/zsh`の場合

```zsh
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
source ~/.zshrc
```

# Pythonのインストール

以下のコマンドをターミナルで実行し、インストール可能なPythonのバージョンを確認してください。

```
pyenv install --list
```

次に、以下のコマンドを実行して任意のバージョンのPythonをインストールしましょう。

```
pyenv install X.X.X
```

インストールが完了したら、以下のコマンドを実行してみてください。

```
pyenv versions
```

Pythonのバージョンが表示されればOKです！

最後に、使用するPythonを指定してあげます。

- グローバルで指定する場合

```
pyenv global X.X.X
```

- ローカルで指定する場合

```
pyenv local X.X.X
```

以下のコマンドを実行し、Pythonのバージョンが表示されればインストール完了です。

```
python --version
```
Power Automateのテンプレートを試した（Teams + Sharepoint リスト）


# はじめに
Teams内のPower Automateアプリのテンプレートを試してみました。
[前回](https://qiita.com/snow_sch/items/6042d40b2618fc0f06f6)の記事では以下のテンプレートを試しています。
・Schedule a meeting with a message sender
・Follow up on a message
この2個目のほうは、頻繁に使っています

# Notify a team when a new item is created in a SharePoint List

## 概要
選択すると以下の画像のような説明が出ます。
SharePointリストに新しいアイテムが作成されたときにチームに通知するもののようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895455/a2d8e034-4f18-eaec-ce96-a4811da6e669.png)

対象のSharepointのサイトのアドレスと、Teamsチームを追加します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895455/7dc32aee-92b1-bf79-baf3-3be2916c4599.png)

## 詳細確認
Sharepointにアイテムを追加します。
Power Automateとは無関係ですが、もうちょっとリッチな感じに詳細を入れたいな。。。
（これは複数行テキストというアイテムで詳細を入れています）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895455/6ccec573-b98a-1fc2-a9a0-daaca40d7157.png)

通知がきました。
作成者と、作成日付、あとSharepointのアイテムへのリンクが載っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895455/72d629d6-ff5a-00bc-e7f5-9718d1468a31.png)

## 結論
これはSharepointリストにアイテムが追加されると通知をしてくれるフローです

## カスタマイズ
詳細部分も通知にいれてみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895455/067ebf69-d4fc-c87b-5386-f3f0da2864b8.png)

こんなかんじになりました
全部の項目を追加していけば、書き込んだことがそのままお知らせになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/895455/5167359f-c074-0bee-1574-a6e8976c1d07.png)
【Ruby】割り算の計算結果で小数点以下を得る方法

# 使用環境
Ruby: 2.6.5

## 本題
基本的に、割り算の計算結果は整数値のみ出力されます。

```ruby
puts 120 / 100
=> 1
```
もし小数点以下も算出したい場合、簡単な方法としては以下の2パターンがあります。

#### 計算の最後に".to_f"をつける

```ruby
puts 120 / 100 .to_f
=> 1.2
```

#### 数値の末尾に".0"をつける

```ruby
puts 120.0 / 100.0
=> 1.2
```

## 何故必要か
　Rubyにおいて、数値は大きく"integer（整数）クラス"と"float（浮動小数点数）クラス"に分かれます。そのため、integerクラス同士の数値で計算を行うと、計算結果もintegerクラス…つまり整数値になるということです。
　そのため、小数点以下も算出する際は「floatクラスに変換する」「floatクラスの数値で計算する」必要があるということです。

## 参考記事
https://www.javadrive.jp/ruby/numeric_class/index1.html
Railsチュートリアル第２章　ざっくり何やったか備忘録

#経緯
Railsチュートリアルを1日１章分以上終わらすことを目標にしている
今回は第２章でざっくり何やったかを自分用に残しておく

#scaffoldジェネレータを使ってアプリケーションをすばやく生成
Scaffold機能でコードを自動生成すると、Webのあらゆる部分からモデルデータにアクセスしてやりとりできるようになる

#RailsではWebアプリケーションの構成にMVC（Model-View-Controller）というモデルを採用している

####MVCの挙動
```
1.ブラウザ         -> Railsサーバー
2.Rails rooter   -> Controller
3.Controller     -> Model
4.Model      <-  -> DB
5.Model          -> Controller
6.Controller     -> View
7.View           -> Controller
8.Controller     -> ブラウザ
```
Railsが解釈するRESTには、標準的なURLセットと、
データモデルとやりとりするためのコントローラアクションが含まれている

#RESTアーキテクチャ

####users
| HTTPリクエスト | URL | アクション |  用途 |
|:-:|:-:|:-:|:-:|
| GET  | /users | index  | すべてのユーザーを一覧するページ  |
| GET  | /users/1  | show  | id=1のユーザーを表示するページ  |
| GET  | /users/new  | new  | 新規ユーザーを作成するページ  |
| POST  | /users  | create  | ユーザーを作成するアクション  |
| GET  | /users/1/edit  | edit  | id=1のユーザーを編集するページ  |
| PATCH  | /users/1  | update  | id=1のユーザーを更新するアクション  |
| DELETE  | /users/1  | destroy  | id=1のユーザーを削除するアクション  |

####microposts
| HTTPリクエスト | URL | アクション | 用途 |
|:-:|:-:|:-:|:-:|
| GET  | /microposts  | index  | すべてのマイクロポストを表示するページ  |
| GET  | /microposts/1  | show  | id=1のマイクロポストを表示するページ  |
| GET  | /microposts/new  | new  | マイクロポストを新規作成するページ  |
| POST  | /microposts  | create  | マイクロポストを新規作成するアクション  |
| GET  | /microposts/1/edit  | edit  | id=1のマイクロポストを編集するページ  |
| PATCH  | /microposts/1  | update  | id=1のマイクロポストを更新するアクション  |
| DELETE  | /microposts/1  | destroy  | id1のマイクロポストを削除する  |

２つの構造を比較すると、
``Users``が
``Microposts``に
置き換わっていること以外は一致している。

##Userリソースの問題点
* データの検証が行われていない。ユーザー名が空欄であったり、でたらめなメールアドレスを入力したりしても通ってしまう。
* ユーザー認証が行われていない。 ログイン、ログアウトが行われていない為、誰でも無制限に操作できてしまう。
* scaffoldのテストコードはデータ検証やユーザー認証、その他の必要な要求を満たしていない。
* レイアウトやスタイルが整っていない。 サイトデザインも操作法も一貫していません。
* scaffoldのコードの理解が困難

##Railsではデータのバリデーション（validation）がサポートされており、データモデルの属性の値に制限をかけることができる



```app/models/micropost.rb
# MicropostクラスがApplicationRecordクラスを継承しているが、
# 大元になる基本クラスはActionController::Base
class Micropost < ApplicationRecord
  #1つのマイクロポストは1人のユーザーにのみ属する。
  belongs_to :user

  # 140文字制限を加えたい場合、lengthを使う。
  validates :content, length: { maximum: 140 }

  # マイクロポストのコンテンツが存在するか確認(herokuデプロイ時にエラー回避の為削除)
  presence: true

end
```

1人のユーザーに複数のマイクロポストがある。

```app/models/user.rb
class User < ApplicationRecord
  has_many :microposts
end
```
##Railsコンソールを使うと、コマンドラインからRailsアプリケーションとやりとりすることができる

```
#コンソール起動
$ rails console

first_userにUserデータベースの一番最初に登録されているデータを代入
>> first_user = User.first

first_userに全てのMicropostを結びつける
>> first_user.microposts

micropost変数にfirst_userの最初のmicropostを代入。
>> micropost = first_user.microposts.first

micropostが属するユーザーを取り出す
>> micropost.user

>> exit
```
#3 Slack/ChatbotのGoogle Map対応 ｜リーガテックの神を目指す駆け出しITコンサルがインフラエンジニアに転身するまで

### 前回まで＆今回のテーマ

https://qiita.com/nyaku/items/b6e4e8122b5ecf335da0

……では、次はherokuを理解うんぬんと言いましたが、同期さまのリクエストで、Google Mapへのリンク機能を追加することになりました！

### 今までは？
いままでの当botでは、ユーザーからの入力（ランチの種類）にたいし、予め用意された**会社付近のランチ一覧表**から、ユーザーが好みそうなジャンルの店をランダムで一つ表示する、というものでした！
![スクリーンショット 2021-03-11 16.47.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319381/79705d85-2b2b-058d-7926-6c7ca4f3e963.png)

しかし、表示されるのは食べログのページだけで、そこに行く、というアクションまでにワンステップ必要だったのです。マーケ論で一番良くないっていわれるやつですね……
今回はこれを、Google Mapへのリンクを付けることで解消してみます。

### 具体的には？
1. ここへ行く、という趣旨のボタンを設置し、
2. そのボタンを押すと、GoogleMapにジャンプする（SP環境ならアプリを呼出し）。

#### ボタンの設置方法（失敗）
恐ろしいことに、調べたところ、ボタンがあるというだけでslackbotではなく**slackapp**になり、根本的に世界観が変わるそう。

https://github.com/scrapinghub/slackbot

⬆今回使っているのはこちらのpythonのslackbotライブラリ。当然ながらslackappにはアクセスできないのであきらめた。

#### GoogleMapのリンク設置
GoogleMapは、基本的なリンクであれば、検索であれルートであれ緯度経度であれ、参考文献記載の方法で掲載が可能。

手動検索で出てきたURLでもslackのサムネイルはちゃんと出る。
![スクリーンショット 2021-03-11 18.14.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319381/78cad4ca-b1c8-1088-f885-3292ca10a2ed.png)

しかし、ボタンが頓挫した以上、これぐらいはオートメーションで勝ち取りたい。

そこで……
![スクリーンショット_2021-03-11_18_34_42.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319381/1e1b03a6-cdf5-e4db-ac05-43e96589e30a.jpeg)

Google Mapのplace idだけを手動で調査し、

```追加したコード
restaurant_wo_space = restaurant.replace(' ', '')
gmap_id = df_database.iloc[picked_row][9] #Gmapのplaceid
gmap_url = 'https://www.google.com/maps/search/?api=1&query=' + restaurant_wo_space + '&query_place_id=' + gmap_id 
          
```

連結演算子でシンプルにまとめました。

###結果

動いてます！
![スクリーンショット 2021-03-15 21.36.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319381/ffa09419-1fb9-acc2-0e0e-118dc455f67f.png)




### 参考文献
https://qiita.com/hiron2225/items/8d5cd1b6728b4d63434b
![Something went wrong]()
![Something went wrong]()
inputの使い方

PaizaやAtcoderの問題をやる上で、入力値の読み込みをしなければなりません。
さて、入力値を受け取るには
`` input_value = input()``#input_valueに入力値を代入
というように書きますが、私がつまづいてしまったポイントがあります。
それは、一行に空白(スペース)で区切られた値が入力されることです。C言語などを扱う方ならご存知かと思いますが、``scanf()``は空白や改行で入力が終わるので、入力をEOF(End of file)までとすればよいです(と記憶しています)。しかし、Pythonにおいての入力``input()``は一行を読み込むようなので私の知識では空白で区切られた入力値は読み込めませんでした。
私のようにこのポイントでつまずく方へ、私が普段書いている一例をご紹介できればと思います。

~int型の入力値が空白区切りで入力される時~
``input_value = list(map(int,input().split()))``
これで``input_value``にリスト(配列)として数値が代入されます。
str型で代入したい時は、``list(map(str,input().split()))``のように変更して利用できます。

~int型の2つの入力値が空白区切りで入力される時~
``a,b = map(int,input().split())``
これで、aとbそれぞれに数値が代入されます。

私はまだ``map``であったり、``list``のようなオブジェクト(オブジェクトと関数の違いはまだわかっていません。勉学に励みます。)をはっきりと理解はしていませんが、ひとまずある程度の入力値は受け取ることができています。いまのところ。



もしこの記事に間違いや指摘したいこと、加えたいことがあれば遠慮なく言っていただけると嬉しいです。
初学者のみなさん、一緒にがんばりましょう。
Chefのデバックのやり方

Chefの情報がネットにも少なかったので、ひとつメモがわりに。。

cookbookなどで定義した値が実際何が入っているかを確認したいとき
デバックをやるのですが、やり方ですが、
`Chef::Log.debug`を追加して
chefを実行するだけです。


```ruby:cookbook/
test = "hello"
Chef::Log.debug "test=#{test}"
```


```
cat chef-client.log | egrep "test"
```

などで

ログをみてみると

```
test=hello
```
と表示されるので、
これで色々調査ができます！
【Node.js】asyncの使い方

#プログラミング勉強日記
2021年3月12日
JavaScriptの非同期処理については[こちら](https://qiita.com/mzmz__02/items/6b83805bc4917810dfb7)の記事で詳しく触れてる。

#asyncの基本的な書き方


```:asyncの導入
$ npm install async
```

```js
// require()を使って使えるようにする
var async = require('async');
```

　メソッドの第1引数に配列、オブジェクトで複数の関数処理を記述することで非同期処理が実行できる。

```js:基本的な書き方
async.メソッド名([関数, 関数, 関数, ...], 関数);
```

#seriesで非同期処理を行う

```js
async.series([
  function(callback) {
    callback(null, "1");
  },
  function(callback) {
    callback(null, "2");
  },
  function(callback) {
    callback(null, "3");
  }
], function (err, result) {
  console.log(result);
});
```

```:実行結果
[1, 2, 3]
```

#参考文献
[【JavaScript】 async / await の使い方](https://laboradian.com/use-js-async-await/)
[【Node.js入門】asyncの使い方と非同期処理の制御方法まとめ！](https://www.sejuku.net/blog/79055)
CSS/javascriptで文字列・背景色を反転で点滅する


CSS3の方法と点滅する方法はあったが、反転で点滅する方法が無かったので作成。

```html
<html>
<head>
<style>
p {
	font-size: 8ex;
	font-weight: bold;
}
</style>
<script>
	function blink() {
		obj = document.getElementsByTagName("body");
		obj2 = document.getElementsByTagName("p");

		obj[0].style.backgroundColor = "#FF0000";
		obj2[0].style.color = "#FFFF00";
		obj2[1].style.color = "#FFFF00";

		setTimeout("blink2()", 1000);
	}
	function blink2() {
		obj = document.getElementsByTagName("body");
		obj2 = document.getElementsByTagName("p");
		
		obj[0].style.backgroundColor = "#FFFF00";
		obj2[0].style.color = "#FF0000";
		obj2[1].style.color = "#FF0000";
		
		setTimeout("blink()", 1000);
	}
</script>
</head>
<body onload="blink()">
<p>予定より作業が押しています。</p>
<p>今しばらくお待ちください。</p>
</body>
<html>
```

ネタ元
CSS/javascriptで文字列・背景色を点滅する | いなかんSE
https://ameblo.jp/sirokuma-takano/entry-11540390191.html
Oracle DockerをUTF8化する

# まとめ
環境変数ORACLE_CHARACTERSETにAL32UTF8を設定してデータベース作成することでUTF8化される。

# OracleのDocker化
Oracle Docker化のやり方は他に情報がたくさんあるので省略する。下記あたりを参照。
https://github.com/oracle/docker-images/blob/main/OracleDatabase/SingleInstance/README.md
https://qiita.com/gorilla0513/items/f22e8cce4e08da031abe

# docker-compose.yml
```yml:docker-compose.yml
version: "3"
services:
  oracle:
    image: oracle/database:19.3.0-ee
    volumes:
      - ./oracle/oradata:/opt/oracle/oradata
      - ./oracle/init:/docker-entrypoint-initdb.d/startup
    ports:
      - 1521:1521
      - 18080:8080
      - 5500:5500
    environment:
        - ORACLE_PWD=testpwd
        - ORACLE_PDB=testdb
        - ORACLE_CHARACTERSET=AL32UTF8
        - NLS_LANG=Japanese_Japan.AL32UTF8
```

```sql:charset確認
SELECT NLS_CHARSET_NAME(NLS_CHARSET_ID('CHAR_CS')),
       NLS_CHARSET_NAME(NLS_CHARSET_ID('NCHAR_CS')) FROM DUAL;

NLS_CHAR NLS_CHARS
-------- ---------
AL32UTF8 AL16UTF16
```
ASUSTOR 版Dropbox, ASUSTOR EZ Sync の使い方

ASUSTOR EZ Sync(AES) はASUSTOR NAS 版Dropbox である。
公式ドキュメントを読んでもよくわからなかったので自分なりに調べたメモ。
なお私が動作したNAS はAS1002T という最下位モデルである。

概要
----
Windows/Android/iPhone クライアントから事前に作成したEZ Sync 用のユーザーでログインし、EZ Sync 用に指定したフォルダ上にファイルを置くとDropbox のようにシンクロできる。


NAS の通常のファイル領域(NAS の管理画面であるADMから「ファイルエクスプローラー」で見ることのできる領域) とは別に、ユーザー毎のEZ Sync専用の領域ができ、そこで管理される。
ユーザー毎に管理する場所が異なるので、異なるユーザーからは見ることができない。（たとえ管理者であっても。）

残念なお知らせ
--------------
[2021-03-12] 時点ではmacOS ではEZ Sync アプリが存在しません。(Windows/Android/iPhone 版ならあります)
ASUSTOR にMacOS 版EZ Sync を出荷するようにみんなで促しましょう。
 - https://twitter.com/ASUSTORJapan
 - https://www.facebook.com/ASUSTOR.INC

EZ-Connect のセットアップ
---------------------------------------------
名前が似ていて混乱するが、EZ Sync はEZ-Connect の機能を使っている。EZ-Connect の設定を行っておく。

	ADM(NAS の管理画面) にadmin でログイン
	[設定]-[EZ-Connect]
		-> ASUSTOR ID(アカウント) を取れと言ってくるので作成する。
	✅EZ-Connect サービスを有効にする
	クラウドID 名を[自分で決めた好きなクラウドID名]とする。

新しいEZ Sync 領域を開始する時
------------------------------
例としてEZ Sync 専用のユーザー「EZSyncUserA」を作成する。

ADM(NAS の管理画面) にadmin でログイン

	[アクセスコントロール]-[ローカルユーザー]-[追加]-[新規ユーザーの追加]
		名前：			EZSyncUserA
		パスワード：		kJAVPQQVyd7ABx38w6J5	※弱いパスワードでは登録できない
		パスワードの確認：	kJAVPQQVyd7ABx38w6J5
		[次へ]
		●このユーザーの役割と権限の定義を希望します
		[次へ]
		✅ users     default user group
		[次へ]
		このユーザーのアクセス権を設定して下さい。
		Public		✅DA		※DAとはアクセス不可を示す(お好みに応じて)
		Web			✅DA
		[次へ]
		このユーザーのクオータ（データ容量上限）をセットアップしますか？
		●いいえ
		[次へ]
		このユーザーのアプリ権を設定してください。
		(何もしない)
		[次へ]
		[終了]

Windows/Android/iPhone 用のクライアントをダウンロードし、インストール。
- Windows https://www.asustor.com/admv2?type=5&subject=21&sub=136
- Android https://play.google.com/store/apps/details?id=com.asustor.aidata.plus&hl=ja&gl=US
- iPhone https://apps.apple.com/tw/app/aidata/id685976052
- macOS 版は現在はありません！

Windows 版を元に説明します。

	インストール後、EZ Sync アプリが起動します。
	[スタート]
		Host IP またはクラウドID: 
			[自分で決めた好きなクラウドID名]
		ユーザー名：
			EZSyncUserA
		パスワード：
			kJAVPQQVyd7ABx38w6J5	
		✅安全な接続(HTTPS) をします。
		[次へ]
		同期設定：	[同期(2方向)]
		PCの場所：	(フォルダを作成してそれを指定)
		NASの場所：	EZ Sync
		[次へ]
		ここではフィルターを設定できます。
		(特にやることなし)
		[終了]
		[OK]
これでおしまい。PCの場所に指定したフォルダにファイルを入れ初めることができる。

チームでこの領域を共有することもできる
-----
チームで作業ファイルを共有するというような使い方をする場合は、プロジェクト単位でユーザーを作り、そのユーザーのアカウント(ID/PW) をチーム全員で共有して作業を行うスタイルとなる。この点はDropbox と使い勝手の異なる部分となる。
PHP オブジェクト指向　abstructとは

#abstructとは
クラスを抽象化するための仕組み。
abstructクラスを親として他のクラスを継承させる。

##abstructクラスを使わない場合
もし子クラスのshowメソッドを消してしまっても、
親クラスにshowメソッドがあるので、問題なく動いてしまう。


```php

class Post
{
  protected $text;
  
  public function __construct($newText) 
  {
    $this->text = $newText;
  }

  public function show()
  {
   echo $this->text . PHP_EOL;
  }
}
class SponsoredPost extends Post
{
  private $sponsor;
  
  public function __construct($text, $sponsor)
  {
    parent::__construct($text);
    $this->sponsor = $sponsor;
  }
//  間違って消してしまう
//  public function show()
//  {
//    echo $this->text . PHP_EOL;
//    echo $this->sponsor . PHP_EOL;
//  }
}
```

##そこでabstructを使う
###使い方

①定義したクラスの前にabstructクラスを作成する。
②クラスの中に、子クラスでその都度定義してもらいたいメソッドの名前を書く。
③abstructクラスが親クラスとなるように、それぞれのクラスに継承させる。
(④)親がBasePostに移ったので、共有の部品はBasePostに移す

```php

abstract class BasePost
{
　//④
  protected $text;
  
  public function __construct($newText) 
  {
    $this->text = $newText;
  }
  //

  abstract public function show();
}

class Post extends BasePost
{
  public function show()
  {
   echo $this->text . PHP_EOL;
  }
}

class SponsoredPost extends BasePost
{
  private $sponsor;
  
  public function __construct($text, $sponsor)
  {
    parent::__construct($text);
    $this->sponsor = $sponsor;
  }

  public function show()
  {
    echo $this->text . PHP_EOL;
    echo $this->sponsor . PHP_EOL;
  }
}
```
NuttX for Raspberry Pi Picoで有線LAN接続

NuttX for Raspberry Pi PicoでSPIが使用できるようになったので、以下のSPI接続のネットワークモジュールを使ってネットワークに接続します。
デバイス側からの割り込みを受けられる必要があるので、GPIOドライバに割り込み対応を追加しました。

https://www.amazon.co.jp/HiLetgo-ENC28J60-%E3%82%A4%E3%83%BC%E3%82%B5%E3%83%8D%E3%83%83%E3%83%88-LAN%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-Arduino%E3%81%AB%E5%AF%BE%E5%BF%9C/dp/B010SHKIRE/ref=sr_1_5?dchild=1&keywords=enc28j60&qid=1615417094&sr=8-5

# 接続

Raspberry Pi PicoとENC28J60を以下のようにつなぎます。

[この記事](https://ht-deko.com/arduino/ether_spi.html) などでも触れられていますが、Amazon等で売られている上記のENC28J60モジュールはシルク印刷の端子の表記が一部おかしいので注意が必要です。

|ENC28J60|Pico端子|Pico ピン番号|
|:----------:|:----------:|:-----------------------:|
|GND|GND|3, 38 などのGNDピンのどれか|
|3.3 (Q3)|3V3|36|
|SI (ST)|GP15 (SPI1 TX)|20|
|SCK|GP14 (SPI1 SCK)|19|
|CS|GP13 (SPI1 CSn)|17|
|SO|GP12 (SPI1 RX)|16|
|INT (LNT)|GP11|15|
|RST|GP10|14|



# NuttXのビルド

コンフィグレーションに`raspberrypi-pico:enc28j60`を指定してビルドします。
ENC28J60、SPIの他に、ネットワーク周りの機能が有効にされています。

```
$ git clone https://github.com/apache/incubator-nuttx.git nuttx
$ git clone https://github.com/apache/incubator-nuttx-apps.git apps
$ cd nuttx
$ ./tools/configure.sh raspberrypi-pico:enc28j60
$ make
```

ENC28J60の接続先は、.configの以下の箇所で設定します。これらを変更することで、接続するSPI、GPIOピン番号を変えることができます。

```
CONFIG_RP2040_ENC28J60_SPI_CH=1
CONFIG_RP2040_ENC28J60_INTR_GPIO=11
CONFIG_RP2040_ENC28J60_RESET_GPIO=10
```

ネットワーク周りは、以下のような設定になっています。

- IPアドレスはDHCPで取得
- DNSサーバはGoogle Public DNS (8.8.8.8)を使用
- NTPクライアントを起動して時刻取得

それぞれ、.configの以下の箇所で設定されています。

```
CONFIG_NETINIT_DHCPC=y
CONFIG_NETINIT_DNS=y
CONFIG_NETINIT_DNSIPADDR=0x08080808
CONFIG_SYSTEM_NTPC=y
```

# 起動

NuttXを起動して、ネットワーク周りをいろいろ操作してみます。
(起動時にDHCPでアドレスを取得しているため、最初のプロンプトが出るまで少しかかります)

![nuttx-enc28j60.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642667/62ab0b46-80fc-38dd-3252-e1ea6f23f273.gif)
class 基本　名前空間

#namespaceの基本覚える

例を参考に読み解いていく

例)1~3

```php

<?php 
//例１
namespace Eat;

class Fruit{
    public static function want($fruit){
        print "あなたの食べたい果物は{$fruit}です\n";
    }
}

\Eat\Fruit::want('バナナ');// あなたの食べたい果物はバナナです


//例２
namespace Eat\Eating;

class Fruit{
    public static function want($fruit){
        print "Its{$fruit}! do you want to eat?\n";
    }
}
\Eat\Eating\Fruit::want('りんご');// Itsりんご! do you want to eat?
\Eat\Fruit::want('バナナ');// あなたの食べたい果物はバナナです


//例３
use \Eat\Eating\Fruit as Eating;
Eating::want('スイカ');//Itsスイカ! do you want to eat?

use \Eat\Fruit as Bite;
Bite::want('メロン');// あなたの食べたい果物はメロンです

全体の結果
/*
あなたの食べたい果物はバナナです
Itsりんご! do you want to eat?
あなたの食べたい果物はバナナです
Itsスイカ! do you want to eat?
あなたの食べたい果物はメロンです
*/
```

###例1について
・namespaceはclassの定義の前に記述する
・呼び出す際は```\Eat\Fruit::want('バナナ');```のように
```バックスラッシュ + namespace名 + バックスラッシュ + クラス名 + :: メソッド名```
で呼び出す。

###例２について
・名前空間を使用しないと同じクラス名を使用することは出来ないが```namespace Eat\Eating;```と
新しい名前空間を記述することでクラス名```Fruit```が使用出来るようになっている。
・呼び出す方法は例１と同じ


###例３について
毎回```バックスラッシュ + namespace名 + バックスラッシュ + クラス名 + :: メソッド名```
で呼び出すのは記述が大変。そこで**use**を使用する
・```use \Eat\Eating\Fruit as Eating;```のように定義する
・定義したものは```Eating::want('スイカ');```のように```use名 + :: + メソッド名```で呼び出せる。

この考え方はフレームワークでも役立つので押さえておく。