OmniAICreator/Qiita-1.07M huggingface dataset:
一括で開くVBA

一括でフォルダを開く
```
Sub フォルダを開く()
    CreateObject("Wscript.shell").Run "cmd.exe /c start C:\WINDOWS\system\"
    CreateObject("Wscript.shell").Run "cmd.exe /c start C:\WINDOWS\system32\"
    CreateObject("Wscript.shell").Run "cmd.exe /c start C:\WINDOWS\systemApps\"
End Sub
```
sudoerをぶっ壊したんですか！？

# 最初に
ここに来た人はおそらくこのようなエラーがsudoをしたときに出ましたね？
`Ricomac:~ jr485$ sudo ls
sudo: can't open /private/etc/sudoers: Permission denied
sudo: no valid sudoers sources found, quitting`
# 「とにかくどうやって直すのか教えて」っていうせっかちな人へ
`su`してrootにログインして`chmod g+x /`をする。
# 原因
sudoerファイルをvisudo以外で弄ると事故る。[1]

# 対策
sudoer弄る時visudo以外使わない。

[1]:https://teratail.com/questions/56697
scraping refurbished

```python
import requests
from bs4 import BeautifulSoup
import subprocess
import schedule
import time


daily_loop = True

# Function: Track refurbished product
def track_refurbished_products(model: str, chip: str, price: float, product="mac", memory="16gb", refurbised="整備済製品"):
    global daily_loop

    # Request Configuration
    url = f"https://www.apple.com/jp/shop/refurbished/{product}/{memory}"

    # Reference: http://myhttpheader.com/
    headers = {
        "User-Agent": "Mozilla/5.0...",
        "Accept-Language": "ja,en-US;q=0.9,en;q=0.8"
    }

    response = requests.get(url, headers=headers).content
    # print(response)
    soup = BeautifulSoup(response, "html.parser")
    # print(soup.prettify())
    li_tags = soup.find_all(name="li")
    # print(li_tags)
    product_list = []

    for li_tag in li_tags:
        if model in li_tag.text and chip in li_tag.text and refurbised in li_tag.text:
            # print(li_tag)
            product_info = li_tag.getText().split()
            # print(product_info)
            product_name = " ".join(product_info[:-2])
            # print(product_name)
            product_price = product_info[-1]
            # print(product_price)
            price_float = float(''.join(product_price.split("円")[0].split(",")))
            # print(price_float)
            # product_url = li_tag.select_one("div a")["href"]
            # print(product_url)
            if price_float < price:
                product_list.append(product_name + ": " + product_price + "\n\n")

    if product_list != []:
        print("Some products have been found!")
        product_list_str = "".join(product_list)
        applescript: str = f"""
        display alert "{product_list_str}"
        """
        # print(applescript)
        subprocess.call("osascript -e '{}'".format(applescript), shell=True)

        daily_loop = False

if __name__ == "__main__":
    schedule.every(1).minutes.do(track_refurbished_products, model="MacBook", chip="M1", price=150000, product="mac", memory="16gb", refurbised="整備済製品")

    while daily_loop:
        schedule.run_pending()
        time.sleep(1)
```
フリーランスエンジニアの作り方　その１

一念発起してフリーランスエンジニアになろうとしている
小規模派遣社員の徒然なるままを記録していく。

#これまで
６年前の2015年に友人の紹介で現在の会社に就職（正社員）。
以前はITとは全く無関係、というかバイトとバンドの生活。
大学も出てないし、いわゆるプー太郎だった。

入社後、数ヶ月経ってから大手SIerに派遣契約で入場。
もともとものづくりが好きなタチなので、
未経験のIT業界でのものづくりもそれほど抵抗なく入り込むことができた気がする。
（いや、最初は本当にわからなすぎて大変だったけど）

現在も変わらず同じ現場に居させてもらっており、
要件定義から末端の開発まで幅広く経験を積ませてもらっている。

#フリーランスエンジニアになろうと思ったきっかけ
一番大きいのは収入面。
今の会社も悪くはないけど、よくもない。
現場での今今の作業内容考えると安いとは思っている。

また、小規模な会社の割には人の出入りが多く、将来性についても不安を感じている。
その上、経営層の方針がいまいちわからず、
というかそこまで社員が考えて当たり前でしょ？スタンスなので、
社員の負荷が大きい。（どこの派遣会社もこんなもんなのか？）

そんなこんなで、現状を変えたいと思ったのと、
単純に今の会社では学べない何かを学びたいと思ったので、
フリーランスエンジニアになる覚悟を決めた（まだ決めかけている）のである。

#道のり
フリーランスエンジニアになるまでには、以下の道のりがあると考えている。
目標は来年2022年の4月。

* そもそも年収がどれくらい変わるのか、予定と計画を立てる
* 個人事業主としての手続きなど調べる
* 税関連のなんたるやを諸々調べる
* 今の会社を辞める算段をつける
* できれば今の現場に居続けたいとは思っているので探りを入れてみる
* エージェントの登録が必要か調べる

うん、調べることばっかり。

#と、とりあえず調べたことはメモ
・エージェントから案件を紹介してもらう場合、中間マージンとして単価の10〜20％
・<a href='https://game-of-life.net/freelance-demerit/'>フリーランスのメリデメ</a>
・<a href='http://blog.amanesiku.com/?p=397'>フリーランスになる場合、自分の価格相場は会社員給与のおよそ２倍</a>
pyqtgraphで表面形状分析グラフの作成

# はじめに
X, Y, Z列があるcsvから表面形状画像を作成する画面を作成したので紹介します。

例）
元データ.csv

| **X** | **Y** | **Z** |
| ----- | ----- | ----- |
| 0.0   | 0.0   | 4.0   |
| 1.0   | 0.0   | 5.0   |
| 2.0   | 0.0   | 7.0   |
| ...   | ...   | ...   |

表示結果
<img width=500 alt='screenshot2.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779817/4646413d-aa16-d2b3-d5c3-83084452a597.png'>

以下に保存しています。

https://github.com/shunta-m/SurfacePlot

操作可能な動作は次の通りです。

- 最大100点までの座標間補間
- 補間方法の選択
    - nearest
    - linear
    - cubic
- 表面グラフに元データ座標点の表示
- カラーバーの操作
- 縦横の断面データ取得
- 表面データ、断面データのcsv出力

# 環境
Mac OS
Python 3.8.8

pipでインストールしたもの
colorcet==2.0.6
numpy==1.20.1
pandas==1.2.3
pgcolorbar==1.1.0
PyQt5==5.15.4
pyqtgraph==0.11.1
scipy==1.6.1

# 動作方法
`main.py`と`surfaceplot`フォルダがコードです。
ダウンロードして環境を整えた後、 `main.py`を実行してください。
サンプルcsvはsampleフォルダ内に入っています。

```terminal
.
├── README.md
├── demo
├── export
├── main.py <- これを実行
├── requirements.txt
├── sample <- サンプルcsv有り
├── screenshot
└── surfaceplot <- コード有り

```

# 機能紹介
## 補間
`scipy.interpolate.griddata`を使用しています。

### 点数変更
座標間を1 ~ 100分割で補間できます。(1は補間無しの状態)
補間数：1
<img width=500 alt='補間数1.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779817/b51f1111-7d5d-0ee1-ea08-b4800c2def93.png'>

補間数：100
<img width=500 alt='補間数100.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779817/4e503aad-365e-c3cb-1b67-da04e82c1b10.png'>

### 方法変更
線形、３次スプライン、最近傍補間を選択できます。

<img=200 alt='補間方法.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779817/0fe889ef-e84d-b145-76b3-5c316d1948fb.png'>

## 元データ座標表示
黒点が元データのX, Y座標です。
<img width=500 alt='元データ座標点表示.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779817/9f65a5cd-62a7-5ad8-2e25-271076aa8829.png'>

## csv出力
<img width=300 alt='csv出力.png' src='https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/779817/f9ea29a5-ac49-bb4c-36f7-9550e55d16ff.png'>

以下がcsv出力可能です。出力したcsvはexportフォルダに保存されます。

- 表面画像(座標無)
- 表面画像(座標有)
- 横方向断面データ
- 縦方向断面データ


## その他

- 表示中の断面座標表示(右上)
- 表面形状データの最大・最小値表示(右下)
- マウスカーソル点の値表示(断面グラフ内の赤点)
RDKit ChEMBL を使ってみる

# RDKit

> RDKitインストールに関する参考
https://future-chem.com/rdkit-intro/

## RDKitで化学構造を取得する
試しに神経膠腫（グリオーマ）の投薬治療で使われるテモゾロミドを取得してみます。

分子式：$C_6H_6N_6O_2$
分子量：194.15

![530191_4219004F1025_1_03_fig07.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698282/fb4c1030-fc15-ba67-5f36-07119313cb76.gif)

> https://www.info.pmda.go.jp/go/pack/4219004F1025_1_03/
>


```python
from __future__ import print_function
from rdkit import Chem

# テモゾロミド
m2 = Chem.MolFromSmiles('O=C(C1=C(N2C=N1)N=NN(C)C2=O)N')
m2
```

![Unknown.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698282/3c276d9c-7005-10dd-87e6-60c7f4cb8666.png)

ちょっと回転がかかってますが、同じものが取得できました。

## SMILESについて
RDKitでは分子式ではなく、SMILESという表記に乗っ取って出力されるようです。
構造式から表記も辿れなくもないのですが、今回は分子式がわかっていたので、以下のSMILES検索サイトで分子式からSMILESを出力してもらいました。

https://www.nite.go.jp/chem/chrip/chrip_search/srhInput?shMd=1&txNumSh=&ltNumTp=1&ltNumMh=0&txNmSh=&ltNmTp=&ltNmMh=1&txNmSh1=&ltNmTp1=&txNmSh2=&ltNmTp2=&txNmSh3=&ltNmTp3=&txMlSh=&ltMlMh=0&ltScDp=0&ltPgCtSt=100&rbDp=0&txScSML=&txScSML2=&ltScTp=&txUpScFl=null&hdUpScPh=&hdUpHash=&rbScMh=&txScNyMh=&txMlWtSt=&txMlWtEd=&err=

自分で化合物をお絵かきして、オリジナルのものを作ってSMILEを取得することも可能です。
創薬的な観点からすると、既存のものを表示するよりも、こっちの方が価値があるのかもしれません。

## SDFで取得
SDFというのは「多数の構造式を一纏め」にしたテキストファイル。
テキストファイルゆえ、軽いので、試薬カタログや計算化学のデータ受渡しに有用らしいです。

```python
from rdkit.Chem import AllChem
AllChem.Compute2DCoords(m2)
print(Chem.MolToMolBlock(m2))
```

![スクリーンショット 2021-04-09 1.44.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698282/212be111-b66d-3c46-da62-aca85ca2f9ac.png)


私は解読不能です。


# ChEMBL
ChEMBLという公共データベースからデータを取得する。
> https://www.ebi.ac.uk/chembl/

ChEMBLでTemozolomideで検索をかけると、対応したIDが見つかります。
テモゾロミドの場合は CHEMBL810 がID。
![スクリーンショット 2021-04-09 1.22.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698282/15a25693-f71b-3674-3b07-384e07d6e84f.png)

```python
# pip install chembl_webresource_client
from chembl_webresource_client.new_client import new_client

# moleculeの初期化
molecule = new_client.molecule

# CHEMBL810のデータをChEMBLから取得する
m1 = molecule.get('CHEMBL810')
m1
```
dict型で大量のテモゾロミドに関する情報が得られます。

dictの中から欲しい指標を取得するのですが、今回は化合物名、分子量、極性、SMILESを取得します。

QED / Quantitative Estimate of Drug-likeness

という『薬らしさ』を直観的に創出する指標なんかもあったりして、
QEDに用いられるパラメータである
MW, AlogP, HBD, HBA, tPSA, RB, NAR, Structural Alertなども出力が可能です。


```python
print(m1['pref_name'], # 化合物名
      m1['molecule_properties']['full_mwt'], # 分子量
      m1['molecule_properties']['molecular_species'], # 極性
      m1['molecule_structures']['canonical_smiles'] # SMILES
      )
```
TEMOZOLOMIDE 194.15 NEUTRAL Cn1nnc2c(C(N)=O)ncn2c1=O

こんな感じの出力が得られます。


# まとめ
RDKit: SMILESになっていればよい。オリジナル化合物でもよい。  

ChEMBLE:既存のIDから取得。
令和3年度上期基本情報技術者試験(CBT)を受けた話

#### 基本情報技術者試験

タイトル通り受けてまいりました。

エンジニアの登竜門と名高い基本情報。

昨今のコロナウイルスの影響でテストセンターで受験する方式

所謂、CBT方式ってやつで受験しました。

#### 受験した感想

令和3年度上期からは午前試験と午後試験を別日で受けられるようになりました。

なので午前試験1月、午後試験3月と期間を設けて受けることが可能です。

また、受験する時間帯も受験者で選択可能となり、

午前試験を午後の時間帯、午後試験を午前の時間帯に受験することも可能です。

0次試験(早起き)を免除できるのは良いですね。

個人的には書くという行為が嫌なので、パソコンでの回答がやりやすかったですね。

#### 受験結果

受験後すぐにスコアレポートが届きだいたい何点取れたかがわかるようになってます。

午前試験
![基本情報午前.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1128288/f61490d6-c49b-0a76-9848-6c0cecced6ac.png)


午後試験
![基本情報午後.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1128288/253a8670-c5f8-6291-c824-a4e66dee4bd4.png)



アルゴリズムが残念な結果ですね。

正式な合格発表は午前と午後両方を受け終わった月の翌月末頃に発表、翌々月に合格証書の発送みたいです。

私は3月に受け終わったのでもうすぐ発表ですね。

選択チェックを忘れてなければ受かってると思いますが・・・。
質問すること、認識の確認をすることの大切さを学んだ話

「何をそんな当たり前のことを」ってことかもしれませんが
現場に入らせていただいて大切だなと思ったことを忘れないようにメモとして残します。

誰かの役には立たないと思いますが。

## 「〜の認識で合っていますか？」


今、要件定義や設計のフェーズなのですが、こんなにも決めることがたくさんあるのかとびっくりしています。
「〜の認識で合っていますか？」の言葉をたくさん聞くなと思っているのです。


私がプログラミングを学んで(プログラミングに限らずですが)毎日思っていることは

#### 絶対の正解はない

ということ。

同じ答えでもコードの書き方はたくさんあるし、実装したいことを実現する方法がたくさんある。
そこが楽しいところだと思っています。

私はそれを分かっていたはずなのに自分の勝手な考え作業をしてしまい1日無駄にしてしまいました。


私の場合データベースの設計を勘違いしていて途中で確認することもせず作業をしていました。

チームの皆さんは気軽に話を聞けるよう配慮してくれていますし
進捗を3時間ごとくらいにしているので単純に私のミスでした。

ミスって言うほど迷惑をかけたというわけでは無いのですが1日時間を無駄にしてしまったので悔しい気持ち。

そこで初めて先輩たちが「〜の認識で合っていますか？」と聞く意味が分かった気がしました。


プログラミングを学んで、`質問`というと`技術的な質問`のイメージでしたが
`認識を合わせるため、合っているか確認するための質問`も大事なんだなと思いました。

これは別にエンジニアに限らずですよね。
社会人経験10年以上なのにこんなこともできなかったのかと悔しいですが、誰かにものすごく迷惑をかける前に気づけて良かったです。

## 質問の仕方

こんな風に質問しようという戒め。

#### エラーの場合

①何を実装しようとしたのか
②どんなエラーが出たのか
③エラーを元に調べたこと
④調べたことを元に何が原因と考えたか
⑤考えた原因を元に何を試したか


#### 認識合わせ

〜の件について質問です。

私は○○○という認識ですが合っていますでしょうか？
理由は×××だからです。
（技術的な質問の場合はそう思った記事とか引用してこう思いました、みたいに伝える)
Slackでのやりとりが多いので伝わるように書くのが難しい...


#### 意見を聞きたいとき

今回の内容とは少し違う気がしますが、

例えば上司に判断を伺いたいときは

`どうすればいいですか？`

だけじゃなくて

`3つ方法があると思っています。AとBとCです。私は~の理由でAだと思うのですがいいでしょうか？`

みたいに聞くようにします。
前職のときはある程度経験があったからたくさんの案が出てきたけど、今はその案すら分からずですが自分で少しでも考えることが重要だから例え間違っていてもトンチンカンなこと言っててもいいからそうしようと思います。


以上です。
AdaptiveIcon を作る

# はじめに
業務のなかでAdaptive Iconを作ることがあったので自分用のメモです。
といっても、Adaptive Iconを作るというよりは、
Androidでアイコンを設定する方法と認識した方がいいと思います。

今回は、POに「Androidのアイコンを設定してほしい、デザイナーさんに元ネタは作ってもらっているよ」
という前提で手順を記載します。

# 手順、気をつけること
## 前提

今回、使う画像はこちらにしました（いずれもイラストや）

foreground

![kotowaza_neko_koban.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/fb7409b1-886e-b433-69db-4ae719d87213.png)

background

![bg_natural_ocean.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/99a94618-e6a6-bb29-b66b-5225b1f6ea08.jpeg)

## 手順 1　Android Studio の Image Assets を選択
![スクリーンショット 2021-04-06 23.34.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/99b767a1-20d5-bdc2-d54c-b3ec54d3de67.png)

## 手順 2　Foregroundの画像を設定、調整
![スクリーンショット 2021-04-06 23.52.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/5cd9c2e1-f0f3-7440-49c9-f9ba3c805410.png)

Scalling の Resize はデザイナーさんと相談していい感じに調整してください。

## 手順 3　Backgroundの画像を設定、調整
![スクリーンショット 2021-04-06 23.53.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/e04d260b-39ac-b3c9-6719-49dd8bea4792.png)



## 手順 4　Options を設定

### API25を含めた場合

![スクリーンショット 2021-04-06 23.53.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/43ca2e27-cb9d-d497-79af-0fa95f973c3f.png)

![スクリーンショット 2021-04-06 23.54.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/3750c8b0-b77d-193b-992d-8126d72664c7.png)

### API25を含めない場合

![スクリーンショット 2021-04-06 23.54.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/16e1d3dd-2ad5-419a-947b-43ec7bc1b0a1.png)

![スクリーンショット 2021-04-06 23.55.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/efaaeefa-5a9a-5d7e-c1dc-b3e0c4d9bb7d.png)


## 手順 5　作成
あとは「Finish」ボタンを押して完了です。

## 手順 6　おまけ
![スクリーンショット 2021-04-07 0.13.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/384422/a012940d-d265-41b9-b2f9-521c99583f99.png)

background を color 指定にすると、背景白のアイコンも作成できます。

# まとめ
android アプリ開発でアイコンを作ることは機会が少ないので、
手順を一度まとめて整理してみました。
これから行う誰かの参考になれば幸いです。
無名関数と即時関数

#無名関数

- 引数になる関数が<strong>1回きりしか使わない</strong>場合に使う（高階関数、即時関数）
- コードがシンプルになる
- 関数名の重複を防ぐ
- 関数名を考えずに済む
- 文頭にfunctionを書かなければ無名関数として定義できる
- 関数名がなくても困らない状況において使える

```php
const sum = (x,y) => {
 return x + y;
}
sum(3,5);
```
# 即時関数
- 即時実行される無名関数
- 関数を定義すると同時に実行するための構文
- 即時関数で使用された変数は「ローカル変数」となり即時関数外から参照することはできない
- グローバルスコープ名の汚染回避

## 構文
```php
(() => {
  //いろいろ処理
})();
```
```php
const sum = ((a,b) => {
    const result = a + b;
    return result;
  })(1,2);
  console.log(sum);//3
```
MySQL OFFSET句

#【MySQL OFFSET句】

##テーブルから取得するデータの行数と開始位置を指定

※LIMIT句を省略して、OFFSET句だけを記述することは出来ない。

###・OFFSET句を使用する場合

LIMIT句に取得するデータの行数を指定。
OFFSET句に取得するデータの開始位置を指定。
（先頭からではなく、指定した位置からデータを取得可能）

```sql:MySQL
-- 1~10番目を飛ばして、11番目から50件取得 
SELECT culumn_name FROM table_name LIMIT 50 OFFSET 10;
```

###・OFFSET句を使用しない場合

LIMIT句に取得するデータの開始位置を指定し、取得するデータの行数を指定。

```sql:MySQL
-- 1~10番目を飛ばして、11番目から50件取得
SELECT culumn_name FROM table_name LIMIT 10, 50;
```
AVIFアニメーションを作成する

# はじめに
`AVIF`は、静止画だけでなくアニメーションを作成することもできます。
この記事ではアニメーション形式ファイルを作成します。

[AVIFファイルの作成](https://qiita.com/devmynote/items/7fdd3801a19618eacc44)で、静止画の`AVIF`ファイル作成方法について、書いています。

# 環境
AVIFファイルを作成するために、[libavif](https://github.com/AOMediaCodec/libavif)を使用します。

* Windows 10
* dmd v2.096.0
* libavif v0.9.0
* libaom v2.0.2
* libdav1d v0.8.2
* Chrome v89.0.4389.114

`AVIF`アニメーションは、`Chrome`で動作確認しています。まだ未対応のブラウザもあるのでご注意ください。

# ソースコード
複数の`AVIF`ファイルから、アニメーション形式の`AVIF`ファイルを作成する処理を実装しました。

```d:avifanim.d
/+ dub.sdl:
	name "avifanim"
	dependency "libavif-d" version="~>0.9.0"
	lflags "/NODEFAULTLIB:libcmt.lib"
+/
// dub build --single --build=release avifanim.d
import std.stdio;
import std.string;
import core.stdc.stdio;
import core.stdc.string;
import avif.avif;

pragma(lib, "lib/avif_x64_Release.lib");
pragma(lib, "lib/aom.lib");
pragma(lib, "lib/libdav1d.lib");

ubyte[] loadAvif(string ifile)
{
	auto file = File(ifile, "rb");
	scope(exit) file.close();
	auto size = file.size();
	ubyte[] buf = file.rawRead(new ubyte[size]);
	return ( buf );
}

void saveAvif(string ifile, string ofile)
{
	ubyte[] buf = loadAvif(ifile);
	auto file = File(ofile, "wb");
	scope(exit) file.close();
	file.rawWrite(buf);
}

void saveAnimatedAvif(string[] ifiles, string ofile, ulong timescale)
{
	avifEncoder* encoder = avifEncoderCreate();
	scope(exit) avifEncoderDestroy(encoder);
	encoder.timescale = timescale;
	avifDecoder* decoder = avifDecoderCreate();
	scope(exit) avifDecoderDestroy(decoder);
	
	foreach ( i, ifile; ifiles ){
		ubyte[] buf = loadAvif(ifile);
		avifDecoderSetIOMemory(decoder, buf.ptr, buf.length);
		avifDecoderParse(decoder);
		while ( avifDecoderNextImage(decoder) == avifResult.AVIF_RESULT_OK ){
			avifEncoderAddImage(encoder, decoder.image, 0, avifAddImageFlags.AVIF_ADD_IMAGE_FLAG_NONE);
		}
	}
	
	avifRWData avifOutput;
	avifEncoderFinish(encoder, &avifOutput);
	scope(exit) avifRWDataFree(&avifOutput);
	auto f = fopen(ofile.toStringz, "wb");
	scope(exit) fclose(f);
	fwrite(avifOutput.data, 1, avifOutput.size, f);
}

void main(string[] args)
{
	if ( args.length == 3 ){
		saveAvif(args[1], args[2]);
	} else {
		ulong  timescale = 4;	// Hz
		saveAnimatedAvif(args[1 .. $-1], args[$-1], timescale);
	}
}
```

# ソースコード補足
`main`関数で、`timescale`をパラメータとして引き渡しています。
`timescale`はアニメーションの表示間隔です。単位は`Hz`です。
実装例では`4`を設定することで、一秒間に4回画像を切り替えるスピードに設定しました。

# コンパイル、実行例

```text:コマンドプロンプト
D:\Dev\Avif> dub build --single --build=release avifanim1.d
Performing "release" build using D:\Dev\dmd2\windows\bin\dmd.exe for x86_64.
avifanim1 ~master: building configuration "application"...
Linking...

D:\Dev\Avif> avifanim out1.avif out2.avif ani.avif
```

ファイル作成例は、[こちら](https://devmynote.github.io/ImageSample/avif1.html)です。
`Chrome`で動作確認しています。

# 参考
[AVIFファイルの作成](https://qiita.com/devmynote/items/7fdd3801a19618eacc44)
初学者がLaravelを学び始める1

##はじめに
ララベルでアプリにアクセスし処理を行うにはアドレスと処理を関連づけるルーティングと全体の制御を行うコントローラーが必要となる。

##ルーティング
一般的なウェブサイトではwebサーバーの公開フォルダの中にファイルを用意しておくとそのままファイルが表示されます。例えばwebappというフォルダにhelo.htmlと言うファイルを用意すれば、http://〇〇/webapp/helo.htmlというアドレスにアクセスすると自動的にそのファイルが読み込まれ表示されます。

しかしLaravelを使っている場合はそうはできません。
Laravelでは特定のアドレスにアクセスされるとそのアドレスに割り振られたプログラムが実行されそれによって必要な処理や画面が表示されます。

このような〇〇アドレスにアクセスした場合に✖️✖️という処理を行うというのがルーティングです。

##routesフォルダについて

web.phpのファイルは一般的なwebページにアクセスするためのルーティングです。
基本的にwebページに後悔するものは全てこのweb.phpにルート情報を記述すると考えてよい。（当分の間はそれ以外のファイルは使用しない。）


##ルート情報の記述

```
<?php
Route::get('/', function () {
   return view('welcome');
});
```
このようにweb.phpに書かれていた場合ですが
今回はトップページにアクセスした際の処理を記述しています。Laravelのアプリではデフォルトでトップページの処理が記述されています。

ルートの基本情報の見方ですが
Route::get('アドレス', 関数など );
というふうになっています。
第一引数には割り当てられるアドレス、第二引数には処理を指定します。
ちなみに第二引数には関数以外にもコントローラーを指定することもあります。
getを使ってアドレスと処理を割り当てることがルートの情報設定の基本です。


##トップページのルート情報

今回は第二引数には関数を指定しておりますが、引数なしの無名関数（グロージャ関数）となっております。
内部ではreturnで戻り値を指定しておりここで返される戻り値がそのアドレスにアクセスした際に表示される内容となります。ここではviewという関数を使って戻り値を用意しています。これは以下のように使用します。

```
view（テンプレート名）
```

このviewは指定されたテンプレートファイルをロードしてレンダリングして返すという役割があリます。
要するに今回はwelcomeとあるのでwelcomeのviewが表示されることになります。（正確にはwelcome.blade.php）

また、基本的にビューはHTMLのコードが書かれているように見えますが＠マークから始まるような文も多く存在します。
これはbladeと呼ばれるテンプレートエンジンをつかて書かれたソースコードです。
ララベルではPHPをそのまま使ってウェブページを作ることもできますが、bladeテンプレートエンジンを使うことの方が多いです。
簡単に仕組みを解説するとviewフォルダの中にテンプレートファイルが用意され、それをview関数で読み込んで表示しているということになります。
PATHを通す、環境変数についてまとめてみた

何かしらのプログラムをインストールした時や、環境構築の時などで出てくる`PATHを通す`をまとめてみました。

## PATHはコマンドサーチパスのこと

**そもそもコマンドとは：**
コマンドの実態は、特定の操作を実行するための実行ファイルを呼ぶこと

**コマンドサーチパスとは：**
コマンドサーチパスはそのコマンドの実行ファイルまでのパスのこと
このパスは`環境変数PATH`に設定されます。 コマンドが実行されると、シェルは環境変数PATHに設定されたディレクトリからコマンドの実行ファイルを探します。
*シェルに関しては別途記事を書きますのでここでは省略します。

例えばLinuxコマンドのlsであれば、ファイルの場所は `/bin/ls`
```
/bin/ls
ls
```
上記の2つのコマンドどちらを実行しても結果は同じですが、毎回フルパスを指定するのは面倒なので、シェルにあらかじめ実行ファイルの場所（=パス）を知らせておく必要があります。

このように、環境変数PATH にコマンドサーチパスを追加することを**PATHを通す**と言います。

これによって、毎回フルパスを指定せずに、どこのディレクトリにいても**ファイル名だけでコマンドを叩くことができ、作業効率を高めてくれる、とても便利なものなのです。**

*`cd`や`echo`のようなシェルのビルトインコマンド(シェル内部に組み込まれているコマンド)は、パスを通さずとも初めから使えます。それ以外のコマンドは外部コマンドで、PATHを通す必要があります。またツールによってはインストールした時に自動でPATHの設定をしてくれるモノもあったりします。

#### カレントディレクトリにパスを通さない
カレントディレクトリにパスを通すことは危険です。
通常、コマンドサーチパスは一般ユーザーがアクセスできないディレクトリに設定することで安全性を高めています。
しかし、カレントディレクトリ、つまり作業中のディレクトリにパスを通してしまうと、コマンドサーチパスが管理者以外にもアクセス可能なディレクトリに設定される事となり、悪意のあるプログラムが実行される危険性が増大します。

セキュリティの大原則で
・余計なディレクトリにパスを通してはいけない
・パスを通す際は安全なディレクトリに絞って設定する。

カレントディレクトリのファイルを実行したい場合にはファイル名の先頭に`./`をつけて実行することになっています。これは「今私のいるディレクトリのこのファイルを実行して！」というように、一時的にカレントディレクトリにパスを通してあげているイメージです。


## 環境変数とは
コンピュータ上の全てのプロセスで有効な変数のこと。
私たちが使っているOS上に定義されたグローバル変数のようなもの。OS上で動くアプリケーションから、ちょっとしたスクリプトまで、実行中のプロセスは環境変数を参照して、その動作を切り替えられます。

macOSやLinuxなどUNIX系のOSでは、環境変数は基本的には.bashrcや.zshrcなどに設定し、シェルを起動すると常に同じ値が適用されます。

通常はこれで問題ありませんが、開発するアプリ毎に`固有の環境変数`を設定したい場合
（例：あるアプリのフォルダ内でだけ、環境変数としてAWSの認証キーを設定して使用したい）だと不便です。
その環境変数を毎回設定するのも大変ですし、忘れてしまいます。
また.bashrcなどに全部設定しロードしておく事もできますが、プロジェクトが増えてくると煩雑になり困ります。

そこで便利なツールが**direnv**なのです。

**本記事では、このdirenvを使い、そのディレクトリ固有の環境変数ファイルを作って読み込ませる設定をしてみようと思います。**

**direnvとは**
Shellのエクステンションツールで、ディレクトリ毎に環境変数を定義して、そのディレクトリがカレントになった時だけ、その環境変数を有効/無効にしてくれるツール。
direnvはディレクトリ毎に環境変数を定義できて、`.envrc`というファイルに環境変数を適用します。
`.envrc`があるディレクトリがカレントディレクトリになった時に環境変数が有効になります。

`.envrc`を探すので、存在しなければ関係ない

ちなみにdirenvは、directory environmentの略だと思います。そのディレクトリ固有の環境変数という事ですね。

### 実際にやってみましょう

まずは、direnvをインストールする
mac上でHomebrewを利用しているのであれば、`brew install direnv`

環境変数を設定したいプロジェクトのルートディレクトリに、`.envrc`ファイルを作ります。

```
touch .envrc
```

使いたい環境変数を下記のように設定します。

```
export 環境変数名 = 値
```

bashにシェルのフックを設定する（zshでもOK）
自動で読み込むための設定です。

ルートディレクトリに移動して、vimで`bashrc`か`zshrc`を開く

```
vim ~/.bashrc
もしくは
vim ~/.zshrc
```

キーボードの`i`を押して、insert（入力）モードにして、以下を記述

```
eval "$(direnv hook bash)"
もしくは
eval "$(direnv hook zsh)"
```

キーボードで`:wq`と入力すると保存終了。

`.bashr`cを再読み込みする
source [ファイルパス]で、パスの設定を読み込んで現在のシェルを実行するコマンド
シェルの設定ファイル（.bashrc）を更新した後で、変更内容を実行中のシェルに反映させる。

```
source ~/.bashrc
もしくは
source ~/.zshrc
```

`.envrc`を置いたディレクトリに移動すると、こんなエラーが出ると思うので、
`direnv allow`を実行してdirenvを許可すれば大丈夫です。これで設定完了。

```
direnv: error .envrc is blocked. Run `direnv allow` to approve its content.
```

cdコマンドで別のディレクトリ（.envrcのないディレクトリ）に移動すると、この様に環境変数がunloadされます。

```
direnv: unloading
```

再び移動するとloadされます。なので、上記の設定は最初だけやればOKです。

```
direnv: loading .envrc
```

もし.envrcファイルの設定を書き換えた場合は、自動で.envrcを読み込み直してくれますが、稀に`direnv allow`を求めるエラーが出るので、そしたら`direnv allow`してあげればOKです。


最後に、環境変数にはアクセストークンやAPIキーなどが第三者に渡ってしまうとまずいデータを設定することが多いと思うので、`.gitignore`に`.envrc`を追加するのが一般的です。

## envrc, bashrcのrcとは？
サクッと調べたらおそらく`run commands`の略という説が濃厚です。
プログラミングの初歩(3) 

みなさん、こんにちわ

私はSE歴5年の、ごくごく一般的なサラリーマンです。
仕事を始めてからＩＴ系の勉強を始めましたし、IT業界に入ってからすぐにプログラミングができるようになった、いわゆる才能があるわけでもありません。

それでも今、多少プログラミングのことがわかりましたし、それで仕事もいただけています。
この知識が誰かの役に立つと思って、この記事を書くことにしました。


プログラミングの初歩(2)の続きです。

(2)では、プログラミングする内容をまとめてみよう、というお話を書かせていただきました。

ようやく実際に作ってみるところに入っていきます。


では、何か自分が使いたいプログラミングの言語を1つ決定してください。
各プログラミング言語の種類などについては、この記事では紹介しません。

qiitaのほかの記事に、分かりやすくまとめてあるかと思うので、
ぜひ探してみてください。
(まさかの丸投げ💧)


個人的なおすすめだけお話しておくと、pythonがおすすめです。



なので、この記事ではpythonを例にプログラムを作ります。


今回のゴールは、プログラムを実行すると言葉が出力される、です。

それではやってみましょう。

<br>
<br>
<br>
<br>

が、まずpythonのインストールが必要です。

インストールもqiitaにたくさん記事があると思うので、そちらを参考にしていただければいいと思います。

<br>
<br>
<br>
<br>

pythonがインストールされているか確認してみましょう。

まず、WINDOWSのメニューから、「WINDOWSシステムツール」→「コマンドプロンプト」を開きます。

※
「１」→「２」 は「１」というものをクリックしたあとに、「２」というものをクリックするという意味です。
よく出てくる書き方かと思うので、覚えておくと便利かと思います。

<br>

コマンドプロンプトを開くと、黒背景に白字で何か書かれているものが表示されるはずです。
これが「コマンドプロンプト」です。
いかにもIT系というか、ハッカーというか、ドラマでよく見るやつ！です。

そうですそれですｗ
<br>

コマンドプロンプトはざっくりいうと、普段マウスで操作しているものをキーボードだけで操作するためのものです。

pythonはこのコマンドプロンプトから実行します。
(実行方法は色々ありますがここでは割愛)

<br>
<br>
<br>

まず。pythonがインストールされているかを、

    python --version

と入力して、enterを押してみます。
すると、Pythonのバージョン情報が表示されるかと思います。

    $ python --version
    Python 3.7.3 --version

これが表示されていればインストールはできています。

python以外の方も[〇〇〇 -version]と実行すれば、そのバージョン情報が表示されると思います。
詳しくは、各言語のインストールの方法をご確認ください。

<br>
<br>
<br>
<br>

次は、コマンドプロンプトに好きな言葉を表示させてみましょう。

    python

このように入力してみます。
すると、

    C:\Users\ユーザー名>

と表示されている部分が

    >>>

と変わると思います。
この状態だと、pythonに命令を送ることができます。
テストとして、

    print('ABC')

と入力して、Enterを押すと、

    ABC

と出力されると思います。
printは('')の中に書かれた文字をそのまま表示する機能です。
どんな言語の開発でも基本中の基本として出てくるものですので、文字を変えたりして試してみましょう。

とにかく、これでpythonが使えてしかも文字を出力することができました。

言語開発の一歩目を踏み出せましたね！！
おめでとうございます！！

あとは、こんなかんじで文字を出力したり、ファイルを操作したり、計算したり、、、
それをファイルに保存しておいて、まとめて実行できるようにしたり、、、

まだまだやることがたくさんですね(*_*;


ですが最初なので、ゆっくり慣れていけばいいと思います。


今回は、言語のインストールとテストとしてprintで決まったワードを出力してみました。
<br>

この記事に関して、ご意見や相談があればぜひぜひコメントをお寄せください。

では次に続きます。
sendメソッドを調べてみた

## はじめに
railsで複数のカラムに、ある処理をして出力された値を入れたい場面で、sendメソッドが使用されていたので調べてました。

## sendメソッドとは
レシーバが持っているメソッドをして、呼び出すメソッド

## 構文
```
send(name, *args)
```
name: メソッド名（文字列かシンボルで指定）
args: メソッドに渡す引数

## 使用場面
条件別にメソッドを呼び出したい、カラムに値を入れたい時に使用する

## サンプルコード

```ruby
class Exam
  def japanese(score)
    puts "国語は#{score}点です"
  end
  def math(score)
    puts "数学は#{score}点です"
  end
  def english(score)
    puts "英語は#{score}点です"
  end
end

exam = Exam.new
exam.send("japanese", 74) # => 国語は74点です
exam.send(:math, 69) # => 数学は69点です
exam.send(:english, 58) # => 英語は58点です
```

＊カラムに値を入れる場合、
send("カラム名=", 入れたい値)
```=```を忘れないよう注意する必要がある。

```ruby
# テーブル作成してある程で。
exam = Exam.new
exam.send("japanese=", 74) 

exam.japanese
=> 74
```

## おわりに

'はじめに'で話した使用場面では、
name: 複数カラムを配列に格納
args: あるメソッド通って出力された値
に当てはめ、each文を使用して、3行で該当するカラム全てに値を入れ直すことが出来ていたので便利に感じた。


### 参考記事
- [【Ruby on Rails】sendメソッドのいろんな書き方 ](https://qiita.com/ngron/items/05d3a9624c2c3ec5dbb6)

- [Rubyのsendメソッドを使用するメリットと注意点](https://qiita.com/hogucc/items/79da134520ee731fe298)

- [Object#send (Ruby 3.0.0 リファレンスマニュアル)](https://docs.ruby-lang.org/ja/latest/method/Object/i/send.html)
tailで複数ファイルの内容を一括で確認する

#### testディレクトリに以下３つのファイルがあるとします。
```
[oracle@db01 test]$ ll
合計 12
-rw-r--r-- 1 oracle oinstall 12  4月 10 23:09 aaa
-rw-r--r-- 1 oracle oinstall 12  4月 10 23:09 bbb
-rw-r--r-- 1 oracle oinstall 12  4月 10 23:09 ccc
```

#### cat * で開くと全部つっくいてどれがどのファイルなのか分かりにくいですね。
```
[oracle@db01 test]$ cat *
aaa
aaa
aaa
bbb
bbb
bbb
ccc
ccc
ccc
```

## grepを使う方法

#### 「grep "" *」でどの中身がどのファイルなのか表示することができます。
```
[oracle@db01 test]$ grep "" *
aaa:aaa
aaa:aaa
aaa:aaa
bbb:bbb
bbb:bbb
bbb:bbb
ccc:ccc
ccc:ccc
ccc:ccc
```

# tailを使う方法

#### 「tail -n +1 *」でもファイル名を表示することができます。
```
[oracle@db01 test]$ tail -n +1 *
==> aaa <==
aaa
aaa
aaa

==> bbb <==
bbb
bbb
bbb

==> ccc <==
ccc
ccc
ccc
```
#### 以下のオプションを付けることでファイル名に色付けすることも可能です。
```
[oracle@db01 test]$ tail -n +1 * | grep -E --color=auto "==>.*<==|$"
==> aaa <==
aaa
aaa
aaa

==> bbb <==
bbb
bbb
bbb

==> ccc <==
ccc
ccc
ccc
```
qiitaのコード内の色付けの仕方がわからないのでここだと同じに見えてます。。。
NPOIでWord文書を操作する

##はじめに
需要があるかは知らないけれど、Apache POIでMicrosoft Word文書を操作できます。
普通はOLEやらマクロやらを使うけれど、POIでも操作できます。

POIはJavaのライブラリですが、今回はC#用のNPOIでWord文書を操作してみました。

##準備
まず、なにはともあれ新規プロジェクトを作成します。
VisualStudio2019を使って、コンソールアプリケーションを作成しました。
![fig1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1266682/d69865da-4aa4-a84f-2954-6adaba391203.png)


次に、NugetでNPOIを参照します。
![fig2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1266682/69bbc852-12ca-9efd-7667-ac0bf413cc44.png)


##操作
そしてコードを書きましょう。
今回は
1. 新規ファイル作成
2. テキストを追加
3. 名前をつけて保存

というシンプルなものを作成します。
本来はクラス化するのが良いですが、サンプルのため1ファイルにベタ書きします。

##実装
XWPFDocumentインスタンスを生成します。
XWPFDocumentは拡張子がdocx、HWPFDocumentはdocです。
引数にFileStreamを渡すと、既存ファイルを開くことができます。

Paragraph(段落)を追加します。

Run(文字の塊)を追加します。

Runの文字列を「テスト」にします。
これまた例文のセンスが無い。。。

もうひとつRunを追加して、文字列を「モード」にします。
Runのフォントサイズを大きく太字にしてやります。

ここまで設定したら、保存を行います。
書き込み用のFileStreamを用意して、保存します。

```C#
using NPOI.XWPF.UserModel;
using System.IO;

namespace ConsoleAppNPOI
{
    class Program
    {
        static void Main(string[] args)
        {
            XWPFDocument Doc = new XWPFDocument();
            XWPFParagraph Paragraph = Doc.CreateParagraph();
            XWPFRun RunTest = Paragraph.CreateRun();

            RunTest.SetText("テスト");
            RunTest.FontFamily ="Meiryo UI";

            XWPFRun RunTest2 = Paragraph.CreateRun();
            RunTest2.SetText("モード");
            RunTest2.FontFamily = "Meiryo UI";
            RunTest2.FontSize = 18;
            RunTest2.IsBold = true;

            FileStream s = new FileStream("sample.docx", FileMode.OpenOrCreate, FileAccess.Write);
            Doc.Write(s);
            s.Close();
        }
    }
}
```

##確認
保存されたファイルを開くと、無事に指定した文字が入っていることがわかります。
(「モード」の主張が強い！)
![fig3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1266682/a5f05f59-96bd-1691-23ac-db8743d2f91d.png)

##おわりに
今回はものすごくシンプルに文字を入れるだけの超カンタンな操作でした。
実際は表挿入などもっといろいろなことができます。
いつかまたもう少し掘り下げたものを書こうと思います。
【Python】pandasというライブラリを使ってCSVファイルを読み込み、横棒グラフを作成する。

---
pythonを使用してExcelファイルの操作を勉強しています。
本日の気づき(復習)は、CSVの読み込みとグラフ作成に関しての続きです。
pythonでExcelを操作するため、openpyxlというパッケージを使用しています。

```csvs:売上.csv
部門,１月,２月,３月
商品A,600,700,800
商品B,4100,3800,4500
商品C,2900,1800,3000
商品D,800,900,1000
商品E,600,550,720
```

上記のようなCSVファイルを読み込み

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927441/076c157b-d69e-3b59-ec17-a2ec6c59723c.png)

この様な棒グラフを作り貼り付けたいです。

CSVを読み込み、張り付け
そちらを元に、グラフを作成します。
違いは縦棒グラフか横棒グラフかだけで
BarChartオブジェクトで使用できる属性の値を変更することで縦を横にします。

ここまでは前回と同じです。

ついでに他の属性も見つけたので主要そうなものを羅列します。

# BarChartオブジェクトで使用できる属性

1. type：縦棒グラフは'col'、横棒グラフは'bar'
1. bar.x_axis.scaling.min：横軸の最小値
1. bar.x_axis.scaling.max：横軸の最大値
1. bar.y_axis.scaling.min：縦軸の最小値
1. bar.y_axis.scaling.max：縦軸の最大値
1. width：グラフの幅
1. height：グラフの高さ
1. varyColors：系列ごとの色を変える際は「True」
1. legend.position：凡例項目の位置。右は'r'、左は'l'、上は't'、下は'b'

ここで気を付けないといけないのは

見た目的に横軸になっている値の属性は縦軸(y_axis)で設定する

ということです。

上手く表現できないのですが

先ず、縦軸でグラフの内容を設定してから、
横軸グラフになるように、９０度傾ける。

と、表現すればいいのでしょうか。(前回に引き続き語彙力が欲しい)

# 最終的なコード

```python
import pandas as pd
from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference
from openpyxl.utils.dataframe import dataframe_to_rows

wb = Workbook()
ws = wb.active

# CSVファイル読込み
df = pd.read_csv('売上.csv', encoding='utf-8')
for row in dataframe_to_rows(df, index=None, header=True):
    # データを１行ずつ追加
    ws.append(row)

# 棒グラフを選択
bar = BarChart()

# 横棒グラフに設定
bar.type = 'bar'

# グラフのデータ範囲を設定
data = Reference(ws, min_col=2, min_row=1,
                 max_col=ws.max_column, max_row=ws.max_row)

# ラベルの範囲を設定
labels = Reference(ws, min_col=1, min_row=2, max_row=ws.max_row)

# グラフにデータを追加
bar.add_data(data, titles_from_data=True)

# 縦軸(グラフ上では横軸)のラベルを追加
bar.set_categories(labels)

# 縦軸(グラフ上では横軸)の最小値を設定
bar.y_axis.scaling.min = 0

# 縦軸(グラフ上では横軸)の最大値を設定
bar.y_axis.scaling.max = 4200

# グラフの幅
bar.width = 15

# グラフの高さ
bar.height = 7.5

# 凡例項目の位置を設定
bar.legend.position = 'b'

# 横軸(グラフ上では縦軸)タイトルを追加
bar.x_axis.title = '部門'

# 縦軸(グラフ上では横軸)タイトルを追加
bar.y_axis.title = '売上高(千円)'

# グラフのタイトルを追加
bar.title = '部門別売上高'

# 棒グラフをシートに追加
ws.add_chart(bar, 'A9')

wb.save('部門別売上_横棒グラフ.xlsx')

```

# 補足

bar.add_data(data, titles_from_data=True)でデータを追加してから
bar.set_categories(labels)で、ラベルを追加しないと
上手くラベルが反映されないようです。
Macでpython code実行するためのターミナル起動

めちゃくちゃ初歩的なことだけど、python3のコードを実行すために自分の備忘録として。
＞ターミナルを起動するには、controlキーを押しながらフォルダをクリックする。
＞コードをターミナル内で実行するときは、python3と入力する。
プロトコルとは

# プロトコルとは
**プロトコル**とはネットワークに接続された機器同士が通信をするときの共通ルールや手順のことを指す。用途によってさまざまなプロトコルが存在する。
## TCP/IP
**TCP/IP（Transmission Control Protocol/Internet Protocol）**はインターネットにおけるさまざまなサービスを実現するためのプロトコルの集まりを指す。インターネットへのアクセスが可能な機器はすべてTCP/IPに対応している。
以前はOSや機器ごとに独自のプロトコルが利用されていたがインターネットの普及に伴い、TCP/IPが標準となった。中心的な役割を担うものがTCPとIPであったことから、このように名付けられた。
## TCP/IPの階層
TCP/IPは役割ごとに、以下の４つの階層（レイヤー）に分かれている。（データの流れはレイヤー１からレイヤー４）

* アプリケーション層（レイヤー４）
* トランスポート層（レイヤー３）
* インターネット層（レイヤー２）
* ネットワークインターフェース層（レイヤー１）

| レイヤー名           | 役割用途                       | プロトコルの例         |
| --------------- | -------------------------- | --------------- |
| アプリケーション層       | アプリケーションごとのやりとりを規定         | HTTP、SMTP、FTPなど |
| トランスポート層        | データの分割や品質保証を規定             | TCP、UDP         |
| インターネット層        | ネットワーク間の通信を規定              | IP、ICMPなど       |
| ネットワークインターフェース層 | コネクタ形状、周波数といったハードウェアに関する規定 | イーサネット、Wi-Fiなど  |

階層化によって、各階層でそれぞれのプロトコルに基づいた処理を行うことで、他の階層の処理がわからなくても同一階層間で通信が行える。

### アプリケーション層
アプリケーション層では、Webブラウザやメールソフトなどのアプリケーションごとのやりとりを規定している。アプリケーションの多くはクライアントとサーバー間のサービスの要求と応答で成り立っている。
また、この層では扱うデータをネットワーク転送に適した形式に変換し、逆に受け取ったデータを我々が理解できるように変換する役割もある。
## TCPとUDP
アプリケーション層のデータの転送処理をしているのがトランスポート層に位置するTCPと**UDP（User Datagram Protocol）**といったプロトコルである。データの転送は分割して行われるが、TCPは分割データの順序や欠落をチェックする（ステートフル）のに対し、UDPはそれらを保証しない（ステートレス）。
前者は信頼性が求められるWebサイトやメールで利用されており、後者は信頼性が低いが、通信の手続きが簡略化されているぶん、効率よく通信できるため、動画ストリーミングなどで利用されている。
# 参考
[イラスト図解式 この一冊で全部わかるWeb技術の基本](https://www.amazon.co.jp/gp/product/B06XNMMC9S/ref=ppx_yo_dt_b_d_asin_title_o05?ie=UTF8&psc=1)
よく使われるステータスコード


##200　OK　-　リクエスト成功
リクエストが成功したことを示します。

GETの場合はボディにリソースの表現が入ります。

##201　Created　-　リソースの作成成功
リソースを新たに作成したことを示し、POSTとPUTのレスポンスとして返ります。

POSTの場合、
新しく作成したリソースのURIはレスポンスのLocationヘッダに絶対URIとして入ります。

##301　Moved Permanentry　-　リソースの恒久的な移動
リクエストで指定したリソースが新しいURIに移動したことを示します。

古いURIを保ちつつ、新しいURIに移行する際に301ステータスコードを使います。

新しいURIはレスポンスのLocationヘッダに絶対URIとして入ります。

##303　See Other　-　別URIの参照
リクエストに対する処理結果が別URIで取得できることを示しています。

ブラウザからPOSTでリソースを操作した結果をGETで取得するときによく使います。

##400　Bad Request　-　リクエストの間違い
リクエストの構文やパラメータが間違っていたことを示します。

クライアントにとって未知の4XX系ステータスコードが返って来た場合、
Bad Requestと同じ扱いで処理するよう仕様で定められています。

##401　Unauthorized　-　アクセス権不正
適切な認証情報を与えずにリクエストを行ったことを示します。

レスポンスのWWW-Authenticateヘッダで、クライアントに対して認証方法を伝えます。

##404　Not Found　-　リソースの不在　
指定したリソースが見つからないことを示します

##500　Internal Server Error　-　サーバー内部エラー
サーバー側に何らかの異常が生じていて、正しいレスポンスが返せないことを示します。

クライアントにとって未知の5XX系ステータスコードが返って来た場合、
500　Internal Server Errorと同じ扱いで処理するよう仕様で定められています。

##503　Service Unavailable　-　サービス停止
サーバーがメンテナンスなどで一時的にアクセスできないことを示します。

レスポンスのRetry-Afterヘッダで、
サービス再開時期がおよそ何秒後であるかを通知することができます。
$()や``の結果は必要がなくても代入とかechoとかするべき

# 概要
$() や `` で関数を実行して、その結果を放置すると、内部でechoされたものをコマンドとして実行しようとしてエラーになる

実行したい関数名を引数でとってきて、
$()や``で関数を実行して、
戻り値に用がなかったので代入せずにいたらはまった。

# 結論
$() や `` で関数等を実行し、その戻り値を代入等する必要がない場合は、エラー回避のためにechoしておくべき。

# サンプル
（概要にそぐわない箇所があったので差し替えました）

```shell
#!/bin/bash

function func1() {
		echo "$(date '+%H:%M:%S') func1 $1"
}
function func2() {
		echo "echo $(date '+%H:%M:%S') func2 $1"
}
function doFunc() {
	`$1 $2`
	echo `$1 $2`
}

doFunc 'func1 aaa'
doFunc 'func2 bbb'
```


結果

```shell
./test.sh: line 10: 09:31:44: command not found # 'func1 aaa' -> `$1 $2` の結果。先頭の日付をコマンド扱いして実行してエラー。
09:31:44 func1 aaa           # 'func1 aaa' -> echo `$1 $2` の結果。結果をechoしているのでちゃんと出る。
09:31:44 func2 bbb.          # 'func2 bbb' -> `$1 $2` の結果。結果の先頭にechoがあるのでそれを実行する。
echo 09:31:44 func2 bbb.     # 'func2 bbb' -> echo `$1 $2` の結果。結果をechoしているので、結果の先頭にあるechoはechoの引数の一部とみなされた。
```


## 追記
呼んだ先で標準出力に何も出なかった場合は空echoになってしまうので、``や$()の結果を使わないとき用の関数を用意しておくのがいいかもしれない


```shell
function doFunc() {
	RESULT=`$1`
	if [ "$RESULT" != '' ]; then
		echo "$RESULT"
	fi
}
```
テストは先に書くか後で書くか

Railsチュートリアルでは細かくテストを書かされます。

開発に慣れてくると最初にテストを書くらしい。
テストを書く手間はあるが、バグを追う時間が短縮されるので結果的に開発速度が上がるそうです。

ポートフォリオ用アプリケーションなどはテストなどの細部まで作り込むと時間効率が悪くなるので、後から必要な部分のテストを書いていくというやり方でもいいのではないかと考えてます（相対的に優先度が低いだけで重要なのは変わりない）。
テストを”先に書く”場合と”後で書く”場合の違いをまとめてみました。

#先に書く
・アプリケーションのコードよりも明らかにテストコードの方が短くシンプルになる（=簡単に書ける）
・セキュリティが重要な課題またはセキュリティ周りのエラーが発生した場合
・バグを見つけたら再現する。回帰バグを防ぐ体制を整えてから修正に取りかかる
・リファクタリングするとき。特に、エラーを起こしそうなコードや止まってしまいそうなコードを集中的にテストする

#後で書く
・動作の仕様がまだ固まりきっていない場合、アプリケーションのコードを先に書き、期待する動作を書く。
・すぐにまた変更しそうなコード（HTML構造の細部など）

#テスト駆動開発のサイクル
失敗するテストを最初に書く
→アプリケーションのコードを書いて成功させる（パスさせる）
→必要ならリファクタリングする
Linux メモ ユーザー入力を受け付ける

# サンプルコード1
```sh
echo -n 'input something: '
read input

echo "$input"
```

# サンプルコード2

```question.sh
read -p 'USER NAME: ' user_name
stty -echo
read -p 'PASSWORD: ' password
stty echo

echo -e '\n'
echo "Hi! $user_name"
echo "$password"
```

複数入力を受け付ける方法はこちら

https://www.server-memo.net/shellscript/key_read.html

パスワードの非表示入力をしたい場合

https://blog.enjoitech.com/article/36


# ユーザー入力部分をパイプラインで渡す

パイプラインで**サンプルコード2**のスクリプトにユーザー名・パスワードを渡す

```
$ printf 'hello\npass' | sh qustion.sh
stty: standard input: Inappropriate ioctl for device
stty: standard input: Inappropriate ioctl for device


Hi! hello
Your Password: pass
```

# コメントにて

コメントで教えて頂きました。
ユーザーの入力文字を非表示にしたい場合、`read -s -p` のように`-s`オプションをつけると、`stty`が不要になります。`stty: standard input: Inappropriate ioctl for device` のエラーも消えました。


```question.sh
read -p 'USER NAME: ' user_name
read -s -p 'PASSWORD: ' password

echo -e '\n'
echo "Hi! $user_name"
echo "Your Password: $password"
```

```
$ printf 'hello\npass' | sh qustion.sh


Hi! hello
Your Password: pass
```

# 参考記事

https://www.server-memo.net/shellscript/key_read.html

https://blog.enjoitech.com/article/36
RedshiftのAQUAはNetezzaのFPGA？

#はじめに
re:Invent2019でRA3インスタンスとともに発表されたAQUAのGAが待ち遠しいですが、以前に「AQUAはNetezzaのFPGAと同じ」というコメントを聞き、恥ずかしながら「FPGA・・?」というレベルだったため、私の頭の中をまとめるための記事になります。

#AQUAとは
ざっくりいうと、Redshiftのコンピュートとストレージ(S3)の間のキャッシュレイヤ的な機能です。
クラメソさんの記事がわかりやすいのでそちらを参照ください。
[【速報】 AQUA (Advanced Query Accelerator) for Amazon Redshift がついにプレビュー開始になりました！](https://dev.classmethod.jp/articles/20201201-aqua-for-amazon-redshift-preview/)

#FPGAとは
Field Programmable Gate Arrayの略で、Wikipediaさんだと、
>製造後に購入者や設計者が構成を設定できる集積回路であり、広義にはPLD（プログラマブルロジックデバイス）の一種である。現場でプログラム可能なゲートアレイであることから、このように呼ばれている。

と書いてあり、ほぼ理解できないですが、書き換え可能なCPUというイメージでしょうか。

#NetezzaのFPGA
「[超並列DWHとユーザー定義関数](https://thinkit.co.jp/article/1161/1)」の記事が非常にわかりやすいので、そこから抜粋しています。

>“SQL処理をするハードウエア”だなんてまったく想像がつかないかもしれませんが、『FPGA』というものを知っていただくと実態が理解できると思います。FPGA（Field Programmable Gate Array）は任意の論理回路の書き込み／書き換えができるLSIであり、近年ではDVDプレーヤーや画像処理ボードなど、少し複雑な処理が必要でかつ高速に動作する必要がある機器に多く採用されています。
>一般的なデータベースの検索処理は、ディスクから共有メモリにデータを読み込み、メモリ上でクエリを実行します。メモリに読み込まれるデータはクエリ（SELECTやWHERE）でカラムとレコードを絞り込む前のデータブロックですので、サイズが大きいままです。データ・ウエアハウスではシステム内部で大量の「データの移動」が発生し、処理時間が遅い原因の1つとなります。
>Netezzaは、このデータ自体を極力移動させないことでCPUが処理すべきデータ量を最小限に抑えています。ディスクI/Oコントローラのところで、レコードの可視化制御やSELECT句のカラム、WHERE句など条件の絞り込みを行ってしまい、メモリ上にデータブロックすべてを読み込まなくても良い仕組みとなっています。ここに使用されているのが『FPGA』です。
>Netezza社はディスクからデータを読み込みながら不要なデータをフィルタリングする機能をFPGAに実装しました。さらに、圧縮してディスクに格納されているデータの解凍もこのFPGAで行われます。普通の解凍はOSの上のソフトウエアがサーバのCPUを使って処理しますが、Netezzaのデータの解凍はFPGAで行うため非常に高速なのです。

つまり、メモリにデータを持ってきてから絞り込むのではなく、ディスクから抜く時点でデータを絞ってしまおうという発想の仕組みということですね。

#RedshiftのAQUAとNetezzaのFPGA
AWSさんの記事で明確に共通点として記載されていました。
[Netezza データウェアハウスの Amazon Redshift への移行](https://aws.amazon.com/jp/blogs/news/migrating-your-netezza-data-warehouse-to-amazon-redshift/)
>Netezza では、CPU に到達する前のデータに対し、FPGA を使ってシンプルな計算処理を行っています。この、Netezza における FPGA 機能を適用するように設計されたアプリケーション (特定の集約関数やデータフィルタリングに強く依存するクエリなど) は、AQUA を使う Amazon Redshift クラスターに効率良く変換できます。
【GitHub】よく使うコマンド集

#GitHubコマンド種類

##GitHubにデータを送信する時に使うコマンド

```terminal:zsh
・現在のディレクトリをgit管理下に置く
$ git init

・全ての変更、新規ファイルをステージング
$ git add -A

・コミット（セーブ）
$ git commit -m "コメント"

・Github上のリポジトリと紐付け
$ git remote add origin https://github.com/xxx/xxx.git

・変更、追加したコードをoriginというリモートリポジトリのmasterブランチにアップロード
$ git push origin master
```

##プッシュしたデータを変更・更新する時に使うコマンド

```terminal:zsh
・全ての変更、新規ファイルをステージング
$ git add -A

・コミット（セーブ）
$ git commit -m "変更内容"

・データの送信
$ git push origin master
```

##取り消しや修正に使うコマンド

```terminal:zsh
・直前のコミットを取り消す(ファイルはそのままでコミット前の状態に戻す)
$ git reset --soft HEAD\^

・コミットメッセージを修正
$ git commit --amend

・コミット前の変更を破棄
$ git reset --hard
$ git clean -df .

・コミット履歴を確認
$ git reflog

・過去のバージョンに戻る
$ git reset --hard <commitのID>(git reflogで確認)

・現在の状態を確認
$ git status

・git管理から外す
$ git rm -r --cached hoge.html
```

##Githubで管理する時に使うコマンド

```terminal:zsh

・Github上のリポジトリと紐付け
$ git remote add origin https://github.com/<ユーザー名>/<プロジェクト名>.git

・Push（初回、masterブランチ）
$ git push -u origin master

・Push（2回目以降、masterブランチ）
$ git push
```

##ブランチを分けて開発する時に使うコマンド

```terminal:zsh
・他のブランチに移動
$ git checkout <ブランチ名>

・新規ブランチを作成して移動
$ git checkout -b <新規ブランチ名>

・他のブランチの変更を取り込む
$ git merge <取り込みたいブランチ名>

・Push（masterブランチ以外）
$ git push origin HEAD

・ブランチ一覧を表示
$ git branch

・ブランチを削除
$ git branch -d <削除したいブランチ名>

・ブランチ名にfeatureという文字列を含むブランチを削除
$ git branch | grep feature | xargs git branch -d

・変更を退避
$ git stash -u

・退避リストを表示
$ git stash list

・退避した作業を適用（stash@{0}の部分は$ git stash listで確認）
$ git stash apply stash@{0}

・退避した作業を全て消す
$ git stash clear
```

##Githubのリモートリポジトリを手元に持ってくる時に使うコマンド

```terminal:zsh
・リポジトリのファイル一式をダウンロード
$ git clone https://github.com/<ユーザー名>/<プロジェクト名>.git

・手元のファイルをリモートリポジトリの内容に合わせる
（git remote addで紐付けができている状態で）
$ git pull 

```
Javascript 備忘録3<変数について>

■変数の宣言について
→Javascriptは「静的片付け言語」
→変数を宣言する時に、型まで宣言する必要がない

■andの応用的使い方

```js
function hello(name) {
    // nameに値が入っている場合は、その値で、入っていない場合はAnyoneが返る
    // なぜなら、nameがfalseの場合には||の性質上、後ろのtrueとなる値が返却されるため
    // ただし、引数が0の場合trueとして評価されてしまうので注意すること
    name = name || 'Anyone';
    console.log(name);
}


let name;

// nameに値が入っていた場合に、hello関数を実行する
if (name) {
    console.log(name);
}
// 上のと同じ処理だが、１行で済む
name && hello(name);
```
【Unity】クラス名のミスがないのにスクリプトがアタッチできない現象の解決策

#概要
Unityを使用していて、スクリプトのファイル名とクラス名が一致しているにも関わらず

インスペクターに「No MonoBehaviour scripts in the file～」、
アタッチしようとすると「Can't add script component [コンポーネント名] because the script class～」

と表示され、スクリプトをアタッチできなくなった現象が発生しました。また既にアタッチしてあったスクリプトは全てエラーとなってしまいました。
自分はUnity初心者ではありますが、本現象を解決する方法が分かったので、備忘録＆誰かの役に立てばいいなぁと思いここに残しておきます。

#筆者の環境
+ Unity2019.4.20f1(LTS)
+ VisualStudio2017

#解決法
結果的には、
```C:\Program Files\Unity\Hub\Editor\2019.20f1\Editor\Data\Tools\RoslynScripts```
内の __unity_csc.bat__ ファイルをメモ帳で管理者権限で開き、

```
@ECHO OFF
set APPLICATION_CONTENTS=%~dp0..\..
"%APPLICATION_CONTENTS%\Tools\Roslyn\csc.exe" /shared %*
exit /b %ERRORLEVEL%
```
>引用：https://www.programmersought.com/article/60285000064/

こちらに書き換えることで直りました。

#解決までの流れ
まず検索より、この記事にたどり着きました。

https://qiita.com/samezi/items/fe2e91b5004be46bb0ec


この記事の追記にあった

https://helpdesk.unity3d.co.jp/hc/ja/articles/360037037212

から

```C:\Program Files\Unity\Hub\Editor\2019.20f1\Editor\Data\Tools\RoslynScripts```

内の __unity_csc.bat__　ファイルをメモ帳で管理者権限で開き、
記事内で修正すべき文とされている

```"%APPLICATION_CONTENTS%\Tools\Roslyn\csc" /shared %*```

を探しましたが、見つかりませんでした。
そこでさらに検索を重ね、こちらの記事を見つけました。

https://www.programmersought.com/article/60285000064/

こちらも前の公式記事と言っていることは同じなのですが、書き直した後のファイルの中身が記載されていました。そこでその内容を__unity_csc.bat__内に書いたところ、エラーが直りました。
#備考
Unity2019.4.2~系のバージョンでは時々起こる現象のようです。
Flutter 「CocoaPods could not find compatible versions for pod "FirebaseFirestore":」の解決法

#FlutterFireのセットアップでつまずく。。。

https://firebase.flutter.dev/docs/overview/

FlutterでFirebase使おうと公式ドキュメントを見ながらセットアップ。
しかし、ドキュメント通りに進めてもうまいかない場面があった！:unamused:

**Improve iOS Build Times**という項目の部分で、

「iOSのビルド時間を短くするためには、下記のコードを`ios/Podfile`に追加してね！」
という内容だ。

```
# ...
target 'Runner' do
  pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '6.26.0'
# ...
end
```

で、公式ドキュメント通りに追加してiOSシュミレーターで実行すると。。。

```console
 Resolving dependencies of `Podfile`
      CDN: trunk Relative path: CocoaPods-version.yml exists! Returning local because checking is only perfomed in repo update
    [!] CocoaPods could not find compatible versions for pod "FirebaseFirestore":
      In snapshot (Podfile.lock):
        FirebaseFirestore (= 7.3.0, ~> 7.3.0)
      In Podfile:
        FirebaseFirestore (from `https://github.com/invertase/firestore-ios-sdk-frameworks.git`, tag `6.26.0`)
    None of your spec sources contain a spec satisfying the dependencies: `FirebaseFirestore (from `https://github.com/invertase/firestore-ios-sdk-frameworks.git`, tag `6.26.0`), FirebaseFirestore (= 7.3.0, ~> 7.3.0)`.

Error: CocoaPods's specs repository is too out-of-date to satisfy dependencies.
To update the CocoaPods specs, run:
  pod repo update

Error running pod install
Error launching application on iPhone 12 Pro Max.

```

こんな感じのエラーが発生（実際のエラーはもっと長文ですw）

#エラーメッセージに記載されてるバージョンに変更してみよう
要するに、`ios/Podfile`で公式ドキュメント通りに追加したコードで指定してるバージョンが古いようです。

今回私が遭遇したエラーによると**`7.3.0`**にするべきだと言うことです。。。
と言うわけで、バージョンだけ変更。

```tex:ios/Podfile
target 'Runner' do
  use_frameworks!
  use_modular_headers!
  pod 'FirebaseFirestore', :git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git', :tag => '7.3.0'

  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end
```

それから`pod install --repo-update`を iOS directoryで実行

https://stackoverflow.com/questions/64443888/flutter-cocoapodss-specs-repository-is-too-out-of-date-to-satisfy-dependencies

これで解決！
Docker上のphpMyAdminでアップロードサイズの上限が発生したときの解決法

# 前提
DockerでphpMyAdminのイメージを利用してめでたくphpMyAdminがローカルで利用できるようになっていること。

# この記事で解決する問題
インポート機能で大きなサイズのファイルをインポートした時に、次のようなエラーが発生した。
> ファイルサイズが PHP の設定で許可された最大値を超えています。

# 解決方法

## 概要
php.iniのupload_max_filesizeを修正し、phpMyAdminのファイルアップロー上限を変更する。

- docker-compose.ymlで次のようにapacheイメージのphp.iniをvolumeでマウントする

```yaml:docker-compose.yml
  web:
(中略)
    volumes:
      - ./web/php.ini:/etc/php.ini
```
- マウントしたphp.iniの upload_max_filesizeを修正する

```ini:php.ini
upload_max_filesize = 256M
```
- docker-compse.ymlでphpMyAdminのファイルアップロード上限を変更する。

```yaml:docker-compose.yml
  phpmyadmin:
(中略)
    environment:
      UPLOAD_LIMIT: 256M
```

これで、デフォルトで(最長: 2,048KiB)のところを、256Mまでのファイルをアップロードできるようになります。
（Rails6）link_to....method: :delete設定してもNo route matches [GET]エラーが発生します


Viewファイルの記述は以下

```rb:view/devise/registrations/new.html.erb
<%= link_to 'ログアウト', destroy_user_session_path, method: :delete, class: "logout" %>
```

エラーメッセージ画像
![20210410-145452.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/960935/dcfccadd-1b32-a9ba-99fd-5fba316b0d97.png)

`method: :delete`の記述もあるのに「GET」で読み込まれているようです。？？？

引用
-
HARUPONdeさんの質問「投稿を削除したら、No route matches [GET] "/posts/1/destroy"がおきる」の解答にヒントがありました。ありがとうございました。
>https://teratail.com/questions/256667

引用サイトの解答
-
link_toでGET以外のメソッドを投げるには、JavaScriptの力が必要です。
jquery-ujsあるいはrails-ujsといったJavaScriptライブラリは、読み込んでいますでしょうか。


引用サイト解答内の「JavaScriptの力」とは
-
Deviseを利用しているとたまに遭遇する問題で、原因は主にrails-ujsが読み込まれていないことのようです。


rails-ujsとは
-
#####ujsとは
　　railsガイドによれば「Unobtrusive（控えめな）JavaScript」からUJSだそうです。
※ひかめ目なとはrailsのコードとJavaScriptが正しくきちんと分離されていて「ぐいぐい食いこんで」きてJavaScriptがRailsコードに「混ざっていない」ということを「控えめ」と表現しているようです。
#####ujsの機能
　　ujsはリンククリック時に発火します。発火時セキュリティトークンという自サイトしか識別できない暗号を組み込みヘルパーに自動的に含まれるようにします。セキュリティトークンがマッチしない場合には、`RailsはGET以外のリクエストを受け付けなくなります。`（きっと原因はこれ）
#####Get以外受け付けない理由
　　Railsがもつサイバー攻撃対策。名前はCross Site Request Forgeryといいます。外部サーバーから送信フォーム装ったリクエストを送るサイト攻撃に対する防御策です。決まったフォーム（付加されたセキュリティートークン）しか受け付けないように設定されています。この対策が「CSRF対策」だそうです。

＊railsガイドを参照いたしました。
＊「Ruby on Rails6超入門」秀和システム　掌田津邪乃著


参照①2.6 セッション固定攻撃
参照②はじめてのAjax

解決策１（私の場合）
-
私の場合、application.js(rails6.0)が全てコメントアウトだったので

```rb:javascript/packs/application.js
require("@rails/ujs").start()
// require("turbolinks").start()
// require("@rails/activestorage").start()
// require("channels")
```

一部コメントアウトを外しました。
⇨require("@rails/ujs").start()をコメントアウトを解除

解決策２ link_toをbutton_toへ変更（リンク回避策）
-

（誤）

```rb:viewfile
<%= link_to 'Delete', post, :method => :delete %>
```

（正）
```rb:viewfile
<%= button_to 'Delete', post, :method => :delete %>
```

解決策３　セキュリティー対策であるCSRF対策を部分解除
-
※クロスサイトリクエストフォージェリ (CSRF)悪意のあるリンクやコードを仕込んでのサイト攻撃

destroyアクションを実施したいコントローラーに以下を追記する。
`protect_from_forgery` を使います。

deleteを使用したいコントローラーからdestoryアクションを除外
（※今回はdevise_contollerなので編集できずに、こちらは無理でした）

```rb:item_controller
  protect_from_forgery :except => [:destroy]
```

参考 require("@rails/ujs").start(　)について 
-

####application.js内に記述があります。
（１）application.jsの場所の変更点
　　　rails5.0→[プロジェクト]/app/assets/javascripts/application.js
　　　rails6.0→[プロジェクト]/app/javascript/packs/application.js

(2)記述の仕方の変更点

```rb:rails5.0
//= require rails-ujs
//= require turbolinks
//= require_tree .
```


```rb:rails6.0
require("@rails/ujs").start()
require("turbolinks").start()
require("@rails/activestorage").start()
require("channels").
```
includeとrequireの違い

1つのファイルに共通するコードを書いておき、個別のファイルからそのファイルを読み込んでプログラムを効率的に作成する方法です。
# includeとrequire
書き方は、下記のような書き方です。
これはどちらも変わりません。

````
include 'ファイル名';
````

# include
指定されたファイルが読み込めない場合でも処理を継続します。

# require
指定されたファイルが読み込めない場合は処理中止。

# include_once
すでに同じファイルが読み込まれている場合はincludeを実行しない。

# require_once
すでに同じファイルが読み込まれている場合はrequireを実行しない。
WindowsにAnacondaをインストールする

いくらでも記事はありますが個人的な備忘録として。
参考：[Windows版Anacondaのインストール](https://www.python.jp/install/anaconda/windows/install.html)

1.　[公式サイト](https://www.anaconda.com/products/individual)からWindows版をダウンロードする。
2.　ダブルクリック→基本的に「Next」を押して行けば良い。
3.　インストール完了。スタートメニューからAnaconda Navigatorをクリックすればホーム画面が起動する。
 <img width="300" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/6786ca82-cf15-383c-86fd-8634fee99c87.png">
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363491/65e30784-ad35-e4b0-5e1a-728fa8f460c8.png)

4.　Windows PowerShellからも起動できるように設定する。まず、スタートメニューから「Anaconda Prompt (anaconda3)」を起動し、下記コマンドを実行する。

```sh
conda init
```

5．次にwindows PowerShellを起動し、下記コマンド実行する。

```sh
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
```
6.　以降はPowerShellを起動することでAnaconda環境を利用できる。
Numerical Analysis for Statisticians,Kenneth Lange,Springer

```{r}

#p.111

x=sample(1:5,20,replace = T)/10

Y=exp(x)

x=cumsum(x)

n=length(x)

R=array(0,dim=c(n-1,n-1))

Q=array(0,dim=c(n-1,n))

h=c()

for(j in 2:length(x)){
  
h=c(h,x[j]-x[j-1])  
  
}

R[1,1]=2*h[1];R[1,2]=h[2]

R[(n-1),(n-1)]=2*h[n-1];R[(n-1),(n-2)]=h[n-2]

for(j in 2:(n-2)){

R[j,(j-1)]=h[j-1]  
    
R[j,j]=2*h[j-1]+2*h[j]

R[j,(j+1)]=h[j]
  
}

Q[1,1]=-1/h[1];Q[1,2]=1/h[1]

Q[(n-1),(n-2)]=1/h[n-2]

Q[(n-1),(n-1)]=-1/h[n-2]-1/h[n-1]

Q[(n-1),(n)]=1/h[n-1]

for(j in 2:(n-2)){
  
Q[j,(j-1)]=1/h[j-1]

Q[j,j]=-(1/h[j-1]+1/h[j])

Q[j,(j+1)]=1/h[j]
  
}

W=diag(1,length(x))

alpha=0.9

f=solve(alpha*W+(1-alpha)*(t(Q)%*%solve(R)%*%Q))%*%(alpha*W%*%Y)

sig=solve(alpha*R+(1-alpha)*Q%*%solve(W)%*%t(Q))%*%(alpha*Q%*%Y)

plot(x,Y,xlim=c(0,max(x)),ylim=c(min(Y),max(Y)),col=2)

par(new=T)

plot(x,f,xlim=c(0,max(x)),ylim=c(min(Y),max(Y)),col=3)



```

```{r}

#Numerical Analysis for Statisticians,Kenneth Lange,Springer

#p.135

#Gauss-Newton Algorithm

Quater=c(1:14)

DEATH=c(0,1,2,3,1,4,9,18,23,31,20,25,37,45)

Z=as.matrix(cbind(rep(1,length(Quater)),Quater))

Y=DEATH

b=c(1:ncol(Z))/100

w=rep(1,nrow(Z))

sig=1

ite=10^5

eta=10^(-1)

for(l in 1:ite){

mu=exp(Z%*%b)

db=t(Z)%*%t(t(c((w*(Y-mu)*mu/sig))))

J=array(0,dim=c(ncol(Z),ncol(Z)))

for(j in 1:nrow(Z)){
  
J=J+w[j]*t(t(c(mu[j]*Z[j,])))%*%t(c(mu[j]*Z[j,]))  
  
}

b=b+eta*solve(J)%*%db

sig=sum(w*(Y-mu)^2)

print(sig)

}


```