OmniAICreator/Qiita-1.07M huggingface dataset:
いろいろな言語のAPIコール

## 導入
webAPIの叩き方を各言語でまとめました。
後で見返す用です。
2021年11月23日時点：Postリクエスト送信

### json リクエストのサンプルパラメータ

```python
sample_endpoint = "http://localhost:8888/sample"
sample_parameter = {
    "title": "トマトスープ",
    "making_time": "15分",
    "serves": "5人",
    "ingredients": "玉ねぎ, トマト, スパイス, 水",
    "cost": "450"
}
```
### Curl
```terminal
curl --location --request POST 'http://localhost:8888/recipes' \
--header 'Content-Type: application/json' \
--data-raw '{
    "title": "トマトスープ",
    "making_time": "15分",
    "serves": "5人",
    "ingredients": "玉ねぎ, トマト, スパイス, 水",
    "cost": "450"
}'
```

### Go
```golang
package main

import (
  "fmt"
  "strings"
  "net/http"
  "io/ioutil"
)

func main() {

  url := "http://localhost:8888/recipes"
  method := "POST"

  payload := strings.NewReader(`{
    "title": "トマトスープ",
    "making_time": "15分",
    "serves": "5人",
    "ingredients": "玉ねぎ, トマト, スパイス, 水",
    "cost": "450"
}`)

  client := &http.Client {
  }
  req, err := http.NewRequest(method, url, payload)

  if err != nil {
    fmt.Println(err)
    return
  }
  req.Header.Add("Content-Type", "application/json")

  res, err := client.Do(req)
  if err != nil {
    fmt.Println(err)
    return
  }
  defer res.Body.Close()

  body, err := ioutil.ReadAll(res.Body)
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(body))
}
```

### php
```php
<?php
require_once 'HTTP/Request2.php';
$request = new HTTP_Request2();
$request->setUrl('http://localhost:8888/recipes');
$request->setMethod(HTTP_Request2::METHOD_POST);
$request->setConfig(array(
  'follow_redirects' => TRUE
));
$request->setHeader(array(
  'Content-Type' => 'application/json'
));
$request->setBody('{\n    "title": "トマトスープ",\n    "making_time": "15分",\n    "serves": "5人",\n    "ingredients": "玉ねぎ, トマト, スパイス, 水",\n    "cost": "450"\n}');
try {
  $response = $request->send();
  if ($response->getStatus() == 200) {
    echo $response->getBody();
  }
  else {
    echo 'Unexpected HTTP status: ' . $response->getStatus() . ' ' .
    $response->getReasonPhrase();
  }
}
catch(HTTP_Request2_Exception $e) {
  echo 'Error: ' . $e->getMessage();
}
```

### python
```python
import requests
import json

url = "http://localhost:8888/recipes"

payload = json.dumps({
  "title": "トマトスープ",
  "making_time": "15分",
  "serves": "5人",
  "ingredients": "玉ねぎ, トマト, スパイス, 水",
  "cost": "450"
})
headers = {
  'Content-Type': 'application/json'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)
```

## これから
getパラメータの記述方法なども追記していく
実行ユーザチェックロジック（シェルスクリプト）

```usercheck.sh
#パラメータチェック

#やっぱりwhoaimがいい。suしてもきちんと変わってくれるから。
CURRENT_USER=`whoami`

if [ "${CURRENT_USER}" != "root" ]
then

   echo "無効なユーザ" >&2
   exit 100
fi
```
引数チェックロジック（シェルスクリプト）

```paracheck.sh
#パラメータチェック
#パラメータが1つでない場合エラー終了

if [ $# -ne 1 ]
then
　　#標準出力を標準エラー出力に変更。まぁ好み次第で不要でもOK。
   echo "パラメータが1でない" >&2
   exit 100
fi
```

シェルのこういうところ大事だよね。
https://zenn.dev/a5ob7r/articles/8591ff9cf238c7
sql:3値論理

-- 3値論理票の確認

```
-- FALSE > unknown > TRUE
SELECT FALSE and NULL;
SELECT NULL and TRUE;
SELECT TRUE and FALSE;

-- TRUE > unknown > FALSE
SELECT TRUE OR NULL;
SELECT NULL OR FALSE;
SELECT TRUE OR FALSE;
```

```
drop table if EXISTS rei;
create table rei
(a integer,
b integer,
c integer);
insert into rei VALUES(1,100,NULL);

SELECT *
from rei;

-- (TRUE and UNKNOWN)= UNKNOWN
select a<b and b>c
from rei;

-- (false or UNKNOWN)= UNKNOWN
select a>b or b<c
from rei;

-- (TRUE or UNKNOWN) = TRUE
select a<b or b<c
from rei;

select ;

-- ３値論理notの真理値表
-- not(unknown) = unknown
select not(b<>c)
from rei;
-- not(true) = false
select not(b=b)
from rei;
-- not(false) = true
select not(b<>b)
from rei;


-- aとbが等しくない
select a<>b
from rei;
-- aとbが等しくなくない
select not(a<>b)
from rei;
```

```
-- 排中律を使った全探索
select *
from shohin
WHERE shiire_tanka is DISTINCT from null
or shiire_tanka is not DISTINCT from null;
```
Raspberry Pi Zeroでイルミネーションする

# この記事について
クリスマスなので、Raspberry Pi Zeroでイルミネーションしてみました:christmas_tree:

![iOS の画像 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502127/8da1971a-582a-bf16-53c9-c87e9689b8ef.jpeg)

# コード
```
import RPi.GPIO as GPIO
import time

Led_red_pin = 17
Led_green_pin = 27
Led_blue_pin = 4

GPIO.setmode(GPIO.BCM)
GPIO.setup(Led_red_pin, GPIO.OUT)
GPIO.setup(Led_green_pin, GPIO.OUT)
GPIO.setup(Led_blue_pin, GPIO.OUT)

def main():
  try:
    while True:
      blinking_led(Led_red_pin, 3)
      blinking_led(Led_green_pin, 3)
      blinking_led(Led_blue_pin, 3)
      blinking_all_led(3)

  except KeyboardInterrupt:
    GPIO.cleanup()

def blinking_led(pin, count):
  for i in range(count):
    GPIO.output(pin, GPIO.HIGH)
    time.sleep(0.1)
    GPIO.output(pin, GPIO.LOW)
    time.sleep(0.1)

def blinking_all_led(count):
  for i in range(count):
    GPIO.output(Led_red_pin, GPIO.HIGH)
    GPIO.output(Led_green_pin, GPIO.HIGH)
    GPIO.output(Led_blue_pin, GPIO.HIGH)
    time.sleep(0.1)
    GPIO.output(Led_red_pin, GPIO.LOW)
    GPIO.output(Led_green_pin, GPIO.LOW)
    GPIO.output(Led_blue_pin, GPIO.LOW)
    time.sleep(0.1)

if __name__ == '__main__':
    main()
```

## 詳しい説明

- GPIOを指定するおまじないです  
今回は使用するGPIOを変数で指定しています

```
Led_red_pin = 17
Led_green_pin = 27
Led_blue_pin = 4

GPIO.setmode(GPIO.BCM)
GPIO.setup(Led_red_pin, GPIO.OUT)
GPIO.setup(Led_green_pin, GPIO.OUT)
GPIO.setup(Led_blue_pin, GPIO.OUT)
```

- main関数で点灯させる関数をループさせます  
`Ctl + c`でループを停止し、GPIOの設定をクリアします

```
def main():
  try:
    while True:
      blinking_led(Led_red_pin, 3)
      blinking_led(Led_green_pin, 3)
      blinking_led(Led_blue_pin, 3)
      blinking_all_led(3)

  except KeyboardInterrupt:
    GPIO.cleanup()
```

- 指定したGPIOを点滅させる関数

```
def blinking_led(pin, count):
  for i in range(count):
    GPIO.output(pin, GPIO.HIGH)
    time.sleep(0.1)
    GPIO.output(pin, GPIO.LOW)
    time.sleep(0.1)
```

- すべてのGPIOを点滅させる関数

```
def blinking_all_led(count):
  for i in range(count):
    GPIO.output(Led_red_pin, GPIO.HIGH)
    GPIO.output(Led_green_pin, GPIO.HIGH)
    GPIO.output(Led_blue_pin, GPIO.HIGH)
    time.sleep(0.1)
    GPIO.output(Led_red_pin, GPIO.LOW)
    GPIO.output(Led_green_pin, GPIO.LOW)
    GPIO.output(Led_blue_pin, GPIO.LOW)
    time.sleep(0.1)
```

- Pythonでmain関数を呼び出すおまじない

```
if __name__ == '__main__':
    main()
```

# 動かしてみる

[![IMAGE ALT TEXT HERE](https://img.youtube.com/vi/9CJ12YU_rNY/0.jpg)](https://www.youtube.com/watch?v=9CJ12YU_rNY)
偉大なスクリプトたち part1

今回は、jarファイルを追加していきたい場合の手順

jarを追加するときは、ls -1 がいいですね。
フルパスでファイルを取得できるので。

```jaradd.sh

JarFiles=`ls -1 /tmp/test/*.jar 2> /dev/null`

JP_AP=""

for JarFile in ${JarFiles}
do
  if (test "X${JP_AP}" = "X" )
     then
         JP_AP=${JarFile}
     else
         JP_AP=${JP_AP}:${JarFile}
     fi
done
#必要に応じてexportしてください。

```
Scala : パターンマッチング

## match式
比較する式の値がどのcase節にマッチするかをチェック出来る。

## Code Sample
```Scala
    def intValueCheck(x: Int) = {
        x match {
            case 1              => "Value is 1"
            case 2              => "Value is 2"
            case 3 | 4          => "Value is 3 or 4"
            case 5 | 6          => "Value is 5 or 6"
            case 7 | 8 | 9 | 10 => "Value is 7 to 10"
            case _              => "Value is other than 1 to 10"
        }
    }

    def valueTypeCheck(x: Any) = {
        x match {
            case a: String    => a + " is String"
            case a: Int       => a.toString + " is Int"
            case a: Double    => a.toString + " is Double"
            case a: Boolean   => a.toString + " is Boolean"
            case a: List[Any] => a.toString + " is list"
            case _            => "Another type"
        }
    }

    def anyTypeCheck(x: Any) = {
        x match {
            case 2         => x.toString + " is Int"
            case 5.3       => x.toString + " is Double"
            case "Dog"     => x.toString + " is String"
            case true      => x.toString + " is Boolean"
            case 3 | "Cat" => x.toString + " is Int or String"
            case _         => x.toString + " is Another type"
        }
    }
```

## GitHub
https://github.com/GL-Kageyama/Scala_PatternMatching
Scala : 関数型キュー

## 関数型キュー
先頭取得、Enqueue、Dequeueのデータ構造。
Enqueue / Dequeue処理であっても、内容は変更されず、新しいキューが返される。

## Code Sample
```Scala
case class Queue[T](front: List[T] = Nil, rear: List[T] = Nil) {

    // Returns the first element
    def getHead = {
        if (front.isEmpty && rear.isEmpty)
            "Queue is Empty"
        else
            mirrorQueue.front.head
    }

    // Add a new element to the end and return the queue
    def enqueue(x: T) = {
        new Queue(front, x :: rear)
    }

    // Returns a queue with the first element removed
    def dequeue = {
        new Queue(mirrorQueue.front.tail, mirrorQueue.rear)
    }

    // Invert the queue
    private def mirrorQueue = {
        if (front.isEmpty)
            new Queue(rear.reverse, Nil)
        else
            this
    }
}
```

## GitHub
https://github.com/GL-Kageyama/Scala_FunctionalTypeQueue
Scala : ケースクラス

## ケースクラス
紋切り型コードが少ないオブジェクトのパターンマッチングを可能にするクラス定義。

## Code Sample
```Scala
case class PhoneNumber(x: Int, y: Int)

val map = Map(PhoneNumber(180, 43218765) -> "Alex")

println(map(PhoneNumber(180, 43218765))) // Alex
```

## GitHub
https://github.com/GL-Kageyama/Scala_CaseClass
Scala : カリー化

## カリー化
関数に、複数のパラメータリストを持たせること。
それにより、引数一つずつに対して処理を行う関数に分割させることが出来る。

## Code Sample
```Scala
    // Curried function
    def curriedSum(x: Int)(y: Int): Int = {
        x + y
    }
    
    // Substitute the required arguments at once
    val plus = curriedSum(1)(2)
    println(plus) // 3

    // Substitute the second argument with (_)
    val onePlus = curriedSum(1)(_)
    val plus2 = onePlus(2)
    println(plus2) // 3
```

## GitHub
https://github.com/GL-Kageyama/Scala_Currying
Azure az login が最近になって失敗する話。

## 背景

az login が、なぜか突然、全然できなくなった。azure-cli を再インストールしても状況変わらず。困った。。

```
The command failed with an unexpected error. Here is the traceback:
Extra data: line 14 column 2 (char 2297)
Traceback (most recent call last):
  File "/usr/local/Cellar/azure-cli/2.30.0_1/libexec/lib/python3.10/site-packages/knack/cli.py", line 231, in invoke
    cmd_result = self.invocation.execute(args)
...
  File "/usr/local/Cellar/python@3.10/3.10.0_2/Frameworks/Python.framework/Versions/3.10/lib/python3.10/json/decoder.py", line 340, in decode
    raise JSONDecodeError("Extra data", s, end)
json.decoder.JSONDecodeError: Extra data: line 14 column 2 (char 2297)
```

## 環境
 - Mac 11.6 Big Sur
 - brew でインストールした azure-cli　2.30
 - python3.10 (これは azure-cli が依存モジュールとして勝手にインストール)


## 調査

 - サービスプリンシパルを使って　az　login しても同じ状況なので、アカウントに依らない。
 - brew　で azure-cli を アンインストール/インストールしても直らず
 - 数日前まで動いていた

## 対応
仕方ないので、azure-cli を過去バージョンに戻す。

## brew でインストールするモジュールの、過去バージョンのインストール

 - brew の Formula は git で管理されてるので、checkout すれば任意のバージョンが使える
 - azure-cli の　Formula は azure-cli.rb

 
手順

```
cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula

git log azure-cli.rb
 ここで、過去に動作していたと思われる適当なハッシュを見つける

brew uninstall azure-cli

git checkout <ハッシュ> azure-cli.rb

brew install azure-cli
```


## 結果
 - brew の Formula を昔のバージョン 2.28.1 (10/10版) に戻して再インストールしたところ、無事、ログインできるようになった。
 - python 3.10 を使うように変わってから、おかしくなってる？
 - 今回、正しく動作したハッシュは

```
45e942de0c390ccc05cca62755590a992eb5e419
```
PhpStorm で名前空間が変に認識されているときの修正方法

# 発生した現象

`composer.json` でマッピングした名前空間を、 PhpStorm が誤って認識している。

`composer.json` を変更したり、 `composer install|update|dump-autoload` を実行しても名前空間が更新されない。

# 解決方法

以下の方法で、手動で名前空間を変更できる。

[Configure PHP namespaces in a project | PhpStorm](https://www.jetbrains.com/help/phpstorm/keeping-namespaces-in-compliance-with-psr0-and-psr4.html#configuring-namespace-roots-manually)

# 環境

* PhpStorm 2021.1.4
ODROID GO ADVANCEのカーネルをビルドする

基本的なやり方は公式の通り。

https://wiki.odroid.com/odroid_go_advance/build_kernel

上記を参考に、というかそのまんまをMac上のParallelsにインストールしたUbuntu20.04.2にて下記を行う。

### 必要なパッケージをインストール ###

```
$ sudo apt-get update
$ sudo apt-get install -y git lzop build-essential gcc bc libncurses5-dev libc6-i386 lib32stdc++6 zlib1g:i386
```
公式にはないが、openssl-devが無かったので下記でインストール。

```
$ sudo apt-get install -y libssl-dev
```

### Toolchainのインストール ###

```
$ cd ~
$ sudo mkdir -p /opt/toolchains
$ wget https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/aarch64-linux-gnu/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar.xz
$ sudo tar Jxvf gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu.tar.xz -C /opt/toolchains
```

ホームディレクトリの`.bashrc`に下記を追記。

```~/.bashrc
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
export PATH=/opt/toolchains/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/:$PATH
```
反映させる。

```
$ source ~/.bashrc
```
バージョンを確認。

```
$ aarch64-linux-gnu-gcc -v
...
COLLECT_LTO_WRAPPER=/opt/toolchains/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/../libexec/gcc/aarch64-linux-gnu/6.3.1/lto-wrapper
...
gcc version 6.3.1 20170109 (Linaro GCC 6.3-2017.02)
```

### カーネルのソースを入手 ###
```
$ git clone https://github.com/hardkernel/linux.git -b odroidgoA-4.4.y
```
結構時間かかる。

### カーネルをビルド ###

```
$ cd linux
$ make odroidgoa_defconfig
$ make -j2
```
-j2の部分はUbuntuが走ってる仮想マシンのCPUコア数（とメモリのサイズ）による。ビルドできたら下記の様に確認。

pythonが見つからない、というエラーが出た場合。

```

```


```
$ ls arch/arm64/boot/Image
 
arch/arm64/boot/Image

$ ls arch/arm64/boot/dts/rockchip/rk3326-odroidgo*.dtb 

arch/arm64/boot/dts/rockchip/rk3326-odroidgo2-linux.dtb
arch/arm64/boot/dts/rockchip/rk3326-odroidgo2-linux-v11.dtb
arch/arm64/boot/dts/rockchip/rk3326-odroidgo3-linux.dtb
```

### インストール ###
ODROID GO ADVANCEで使っているmicro SDカードをMacに挿して、Ubuntuに接続。自動で２つのパーティションがマウントされているはず。bootパーティションはおそらく/media/parallels/BOOT。

```
$ sudo cp arch/arm64/boot/Image /media/parallels/BOOT/
$ sudo cp arch/arm64/boot/dts/rockchip/rk3326-odroidgo2-linux*.dtb /media/parallels/BOOT/
$ sudo make modules_install ARCH=arm64 INSTALL_MOD_PATH=/media/parallels/root
```
micro SDカードをイジェクトしてMacから抜き、ODROID GO ADVANCEに挿して起動したらOK。


### リアルタイムカーネルの導入 ###
まだ途中。。。

Linux公式。

https://wiki.linuxfoundation.org/realtime/documentation/howto/applications/preemptrt_setup



ODROID C2用の公式の説明。

https://wiki.odroid.com/odroid-c2/software/building_rt_kernel

アールテクニカ小出さんのraspberry pi用のブログ記事。

https://artteknika.hatenablog.com/entry/2016/08/23/142820

その他こちらのブログ記事。

https://asukiaaa.blogspot.com/2019/11/52realtime-kernel.html

https://szmlb.hatenablog.com/entry/2016/11/24/132322






```
$ cd ~/linux
$ wget https://www.kernel.org/pub/linux/kernel/projects/rt/4.4/patch-4.4.277-rt224.patch.gz
```

リアルタイムカーネルのためのアプリケーション側の設定。

https://wiki.linuxfoundation.org/realtime/documentation/howto/applications/application_base

### Ubuntu-esでEmulationStationを無効にする、削除する ###

https://forum.odroid.com/viewtopic.php?t=40157

無効

```
$ sudo systemctl disable emulationstation
$ sudo systemctl enable getty@tty1
```

削除

```
$ sudo apt remove emulationstation-go2 emulators-64bit-go2 emulators-32bit-go2
```
Delphi: ファイルに保存

ごく簡単な説明目的で記載しています。

## ファイルに保存

```sample.pas
procedure TForm1.Button1Click(Sender: TObject);
var
  MyText: TStringlist;
begin

  MyText:= TStringlist.create;
  try
    MyText.Add('line 1');
    MyText.Add('line 2');
    MyText.SaveToFile('E:\filename.txt');
  finally
    MyText.Free
  end; {try}
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  MyText: TStringlist;
  dt:TDateTime;
begin
  dt:=Now;
  MyText:= TStringlist.create;

  try
    MyText.Add(DateTimeToStr(dt));
    MyText.SaveToFile('E:\filename.txt');
  finally
    MyText.Free
  end; {try}
end;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/41db2c0d-a6aa-e0a4-f6d5-1a7900cf3eea.png)


## 参考

https://www.ipentec.com/document/delphi-get-now-datetime


以上です。
STM32G031でLチカ(VSCのCubeIDE)(Lチカはじめました。(冷やし中華ではない?))



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b0c79f31-3169-daa6-8132-499f18c755ef.png)



x cubemxではstm32g0316-discoを選択
x VSCでnecleo-g031を選択(visual studio code)
x 動けば正義、細かい事を気にするな
x STM32G031J6M6との違い、ピン数
x PlatformIOと言うらしいが超ムズ(以下省略)(誰かに手伝ってもらいましょう?)
x なぜかnecleo-g031だとupdateとdebugが動く

目的
GPIOのテスト
PA12のLEDを光らす
下記をインサートした(whileの部分)




```c++

    
    HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
    HAL_Delay(500);
    
    HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
    HAL_Delay(500);
    



```



g0316_disco_pa12_1内をいろいろ適当にコピー


https://os.mbed.com/users/caa45040/code/f303_h_p1/


ハード

https://akizukidenshi.com/catalog/g/gI-15688/


書き込み器


https://www.aitendo.com/product/16082



![o_con108.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a87d385c-8a8a-7ee7-a2ea-93613015465e.jpeg)



![o_con109.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/df08ebb2-7140-2bde-2369-2c2286d0755b.jpeg)


![o_con110.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ae2d9fad-3dcf-8140-ca79-9b587645bfea.jpeg)


![o_con111.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6621a9f4-cc14-7f13-0b19-922820cf1d70.jpeg)


![o_con112.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4016b376-2931-239d-236b-00471dea9a8d.jpeg)


![F66E7E2C-8462-4999-8987-8DACF0A23F8F.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6326b1d8-796f-b0d8-6845-01c4425b85eb.jpeg)



いろいろ

だいだい、この駄文を読んでいる読者は、約100人から約200人ぐらいいる
たぶん、いろいろな話は、通じると思うが
日々の一般生活では、「いみふ」な事を言っている「頭がおかしい人」と
思われている。
あだ名は、「プロフェッサー」(教授)と呼ばれている。
今日も、器用なのか不器用なのかわからないと言われた。
どうも、こうゆう、ブログみたいな物を読んでいるのは、caa45040調べでは、
英語圏の人が半分以上だ。
国内だとこうゆう事をする人が絶滅してしまつて、寂しいかぎりです。
たぶん、STM32G031がいい評価されないのは、「ちょムず」だと推論される。
Arduino+ST-Linkで計3ピンでLEDを光らす程度なら簡単に出来ると思うが
それ以上だと「ちょムず」に突入する。
と言う事なので「軽い気持ち」で読んでね!!
Pythonでnumpyを使わずにargsortとかargmax

[Equivalent of Numpy\.argsort\(\) in basic python? \- Stack Overflow](https://stackoverflow.com/questions/3382352/equivalent-of-numpy-argsort-in-basic-python)
range()をソートするkeyで対象のリストをインデクシングするとできます。

### argsort
```python
x_list = [4, 1999, 2]
i_list = sorted(range(len(x_list)), key=x_list.__getitem__)
print(i_list) # [2, 0, 1]
```

### argmax

```python
x_list = [4, 1999, 2]
i_max = max(range(len(x_list)), key=x_list.__getitem__)
print(i_max ) # 1
```
備忘録　spreadsheet をPythonで操作する（gspread）

初心者が何とか使ってみるために色々やって
なんかよくわからんけど唯一動いた()のがこの方法だったので自分用に保管しておく。

**1.Google側でAPIを使う設定を済ませる**
いきなりPython側で操作せず、まずはGoogle側で設定する。
以下のサイトを参考にした。
https://hituji-ws.com/code/python/python-spreadsheet/　
(2021.11.25閲覧)
　GoogleCloudPlatformにアクセスしてAPIを有効化、その後スプレッドシート側に移動して共有の設定をする。

:::note warn
注意
ここでDLする.jsonファイルは後々プログラムを書くファイル(.py)と同じフォルダに保管する
:::

**2.pythonのターミナルでライブラリをインストールする**
今回使いたいgspreadとoauth2clientはインストールする必要がある為、pipコマンドを用いてPythonにインストールする。
(ターミナルから)

```py:install.py
pip install gspread
pip install oauth2client
```
これで下処理は完了。

**3.Python側で記述する**
ここは勉強不足なのでよくわからないままであるがとりあえずAPIを使うために決まり文句的に書かないといけないっぽい？
[このサイト](https://tanuhack.com/library-gspread/)が死ぬほどわかりやすく説明してくれているのでこれに従って書けばおｋ

この段階で作る.pyファイルと同じフォルダに先述の.jsonファイルがないとエラー吐いて動かない。

以下引用(自分用にコメントアウトを一部改変しています。)

```py:
import gspread
import json
#ServiceAccountCredentials：Googleの各サービスへアクセスできるservice変数を生成します。
from oauth2client.service_account import ServiceAccountCredentials

#2つのAPIを記述しないとリフレッシュトークンを3600秒毎に発行し続けなければならない(固定URL)
scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']

#認証情報設定
#ダウンロードしたjsonファイル名をクレデンシャル変数に設定（秘密鍵、Pythonファイルから読み込みしやすい位置に置く）
credentials = ServiceAccountCredentials.from_json_keyfile_name('.json', scope)#jsonファイルは同じフォルダ内に入れておく

#OAuth2の資格情報を使用してGoogle APIにログイン
gc = gspread.authorize(credentials)

#スプレッドシートキーを指定してワークブックを選択(スプレッドシートURLより)
workbook = gc.open_by_key('~~d/ｺｺ/edit~~')#ここまで前提操作

#ここから自由
# シートの一覧を一次元配列に格納する
worksheet_list = workbook.worksheets()
#ワークシート指定
worksheet = workbook.sheet1

#読み込みはこれ(セルをダイレクトに指定)
cell_value = worksheet.acell('B1').value
print(cell_value) #print忘れずに
```
他に4つくらいのサイトの方法を試したが、どれもエラー吐いてしまった。
うまくファイルを拾えないようだったがエラーの原因もわからず。
それを解決する力などまだないので今後の課題ですね。

参考：https://tanuhack.com/library-gspread/
　　　https://hituji-ws.com/code/python/python-spreadsheet/
【PowerQuery】形がバラバラのDBを１つのテーブルにまとめる2


https://qiita.com/taleau/items/38caebd8edf5d040132d

先日の続き

### 前回の最終形
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281933/3cefd687-fbd4-d801-f9e7-575006a1606c.png)

### 今回の最終形
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281933/ef20f93b-fe1a-5287-b883-837beb174629.png)
`出力比`というキー１つに対して出力が2つあるのでキー目線にまとめ直した。

また、キーを数値にすると呼び出す側で`FORECAST.LINEAR`(線形補間)がかけられるようにもなる。


### 呼び出す側の関数がこんなにスッキリ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281933/99bacf22-da03-85cf-3753-d3698e2338be.png)


``` c:検索列
=[@機種名]&"_"&
[@検索列1]&"_"&
[@検索列2]&"_"&
TEXT(VALUE([@出力比]),"0.00")
```

``` c:A,W列
=IFERROR(
  ROUND(
    FORECAST.LINEAR(

      TEXT(VALUE([@出力比]),"#.##"),

      OFFSET(テーブル名,
        MATCH([@検索列],テーブル名検索列,-1)-1,
        6,
        2,
        1),

       OFFSET(テーブル名,
        MATCH([@検索列],テーブル名検索列,-1)-1,
        4,
        2,
        1)
      ),
  1),
"")
```

`出力比`を1行にまとめて検索列で一意に決まるようにクエリ側を整形してあげることで呼び出す側の関数の負荷がめちゃくちゃ楽になる。だからデータベースファーストなのだ。

あとは適宜クエリの列数に合わせて`OFFSET`内の`列数`のところを調整するだけでいい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281933/8534805b-a502-58cc-b880-6b230e8c64f6.png)

1つ目の`OFFSET`は`A`,`W`列
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281933/5da01062-1a26-c4ee-3287-bc56a31472d2.png)

2つ目の`OFFSET`は`出力比`列
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/281933/4d44d8e4-a6da-6c00-f4ac-a1ef83201dac.png)

### 比較用：クエリで整形する前のクロス表を参照する関数

https://qiita.com/taleau/items/4ba11074427af163e09e

``` c
=LET(Val_v_検索値_,[@v],
     Val_x検索値_,[@x],

     Area_x転置_,SORT(TRANSPOSE(Area_x)),
     Area_y,INDIRECT($C$1 & "_" & $D$1),

     Count_x_,COUNT(Area_x),
     Pos_xMatch_,MATCH(Val_x検索値_,Area_x転置_,1),
     Pos_vMatch_,MATCH(Val_v_検索値_,Area_v,0)-1,

     Area_x_既知,OFFSET(Area_x,0,Count_x_-Pos_xMatch_,1,2),
     Area_y_既知,OFFSET(Area_y,Pos_vMatch_,Count_x_-Pos_xMatch_,1,2),

     Ans_y_,FORECAST.LINEAR(Val_x検索値_,Area_y_既知,Area_x_既知),
Ans_y_)
```

大量の名前付き範囲と`INDIRECT、``LET`関数を使っててこの複雑さ...
いかにデータベース側を正規化しておくかが大事だと知れた好事例。


### 注意点
この例の`FORECAST.LINEAR`(線形補間)部分は参照先のテーブル降順である必要があるためマクロで常に降順にしておくサポートが必要。

### おわりに

少しずつパワークエリがわかってきた気がする。
そろそろクエリのユーザー定義関数化とか使い回しの術を身に着けたい。
学会原稿/論文誌の査読対応時に便利な著者名・色分けの表示切り替え

# 学会原稿/論文誌の査読対応時に便利な著者名・色分けの表示切り替え

Overleafを想定．

## ブラインドレビューのための著者名の表示/非表示切り替え

ブラインドレビューでは著者名を隠す必要がある．  
レビュー時に規定分量内に収まっていたのに，採択後に著者名を入れてみたら分量オーバーで悲しくなったりする．

if文を用いて著者表示を切り替える

```Tex
\newif\ifBRIND
%\BRINDtrue  % レビュー提出用
\BRINDfalse  % 最終提出/スペースチェック用

%%%%%%%%%%
\ifBRIND %
%%%%%%%%%%

\author{**** ****}
\email{****@****.**}
\affiliation{%
  \institution{******}
  \state{******}
  \country{******}
}

%%%%%%%
\else %
%%%%%%%

\author{Taro Yamada}
\email{T.Yamada@email.com}
\affiliation{%
  \institution{Yamada University}
  \state{Tokyo}
  \country{Japan}
}

\fi
```


## 条件付き採択のための修正箇所の表示

論文誌等では採択時に修正箇所と査読者へのレターを提出する．  
修正箇所をわかりやすく強調表示したいが，ミスで掲載用の方に赤が残ると死にたくなる．

if文を用いて独自コマンドの動作を切り替える．

```Tex
\usepackage{color}

\newif\ifMARKED
% どちらかをコメントアウトして選択
%\MARKEDtrue  % 修正を赤で表示
\MARKEDfalse  % 出版用

\ifMARKED
    \newcommand{\ch}[1]{\textcolor{red}{#1}}
\else
    \newcommand{\ch}[1]{#1}
\fi

% 使い方
\ch{修正版では赤く，出版用では標準の色になる}
```

## レターに振った参照番号と本文に取り込む

査読コメントに合わせて修正をいろいろ加えた後，修正箇所とレターの間に相互参照の番号を振りたい．  
修正箇所が多いとめんどくさいし，参照番号を間違えるとえらいことになる．

本文と同じ階層にletter.texが置かれているものとする．

```Tex
% 参考
% https://ja.overleaf.com/learn/how-to/Cross_referencing_with_the_xr_package_in_Overleaf
\usepackage{xr}

\makeatletter
\newcommand*{\addFileDependency}[1]{% argument=file name and extension
  \typeout{(#1)}
  \@addtofilelist{#1}
  \IfFileExists{#1}{}{\typeout{No file #1.}}
}
\makeatother

\newcommand*{\myexternaldocument}[1]{%
    \externaldocument{#1}%
    \addFileDependency{#1.tex}%
    \addFileDependency{#1.aux}%
}
\myexternaldocument{letter}

% 使用例
レター側のラベルも参照できるようになる．\ref{letter:comment1}
```

上の修正表示の切り替えと合わせて使用するならこう．

```Tex
\usepackage{color}

\newif\ifMARKED
% どちらかをコメントアウトして選択
%\MARKEDtrue  % 修正を赤で表示
\MARKEDfalse  % 出版用

\ifMARKED
	% 引数を2つ取るようにして，1つ目にレターとの対応，2つ目に修正した文章を入れるようにする，
    \newcommand{\ch}[2]{\textcolor{red}{(#1)} \textcolor{red}{#2}}
\else
    \newcommand{\ch}[2]{#2}
\fi

% 使い方
\ch{\ref{letter:comment1}}{修正版では頭に参照番号がつき，出版用では消える．文章は修正版では赤く，出版用では標準の色になる}
```
paiza練習問題（文字列の表示）


# 目次
- 解いた問題
- 参考にしたサイト
- 振返り
- 参考コード


### 本文
- 解いた問題

https://paiza.jp/works/mondai/prob60/substring_9

- 参考にしたサイト

なし

- 振返り
文字列の○番目から○番目を表示する問題。
1文字目を0番目と数えることに注意。

- 参考コード(文字列の3番目から6番目を表示)

```python
a = "tokugawa ieyasu"
print(a[2:6])
# kuga
#print(a[3:6])ではないことに注意
#t o k u g a w a _ i e  y  a  s  u
#0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
```
TryHackMeを始めてみた【SSH接続失敗した人へ】

# はじめに
TryHackMeって何ですか？という人は`のみぞう`さんの記事が大変わかりやすかったので参考にしてください。
参考：
TryHackMeを30日間続けたので記念に記事を書く -のみゾーン

https://nomizooon.hateblo.jp/entry/20201222/1608637350


# SSH接続で躓いた。。
openVPNの設定も完了していざ、ルームに接続しようと`SSH`コマンドを叩いたが失敗。


色々調査していると、MTUの値によってSSH接続に失敗する場合があるそうです。
参考：
ssh できなかったので MTU を調整

http://fishrimper.blogspot.com/2014/06/ssh-mtu.html

OpenVPNでつながっているインターフェイスのMTUを`ifconfig`コマンドを使ってさっそく確認。

MTU＝1500になってました。

これを、MTU=500にまで下げてみます。コマンドは次のとおりです。
`ifconfig <インターフェイス名> mtu <MTU値>`


### 無事にSSH接続でルームにログインできました。




*Good luck*
paiza練習問題（ランクC：リスト内の値の比較）


# 目次
- 解いた問題
- 参考にしたサイト
- 振返り
- 参考コード


### 本文
- 解いた問題


https://paiza.jp/works/mondai/prob60/total_value_9

- 参考にしたサイト

https://note.nkmk.me/python-list-str-num-conversion/

- 振返り
リスト内の要素が数字の場合すぐにint型に変えたくなるが解説を見ると必要なときに都度int型に変更するのでもいいのかも。上記参考サイトはリスト内のstr型をint型に変更する単に参照しました。

- 参考コード(文字列リストを数値型に変換)

```python
a = ["1", "2", "3"]
int_a = [int(i) for i in a]
print(int_a)
#[1, 2, 3]
```
Wordpress5.8導入後のセキュリティ設定まとめ

## はじめに
Wordpress導入後にセキュリティを担保しなければ！
ということで実施内容まとめ
[CentOS7.4 にWordpress5.8を導入する](https://qiita.com/ymachida/items/062b8ab41adcfb7413c6)実施後の処理

## Wordpress管理画面へのアクセス制御
会社でのHPであれば外部からのアクセスはさせたくない等あるかと思います。
グローバルIPを固定で持っていれば、IPで制限をし社内からしかアクセスできないようにします

```
# vi /etc/httpd/conf/httpd.conf

# 追加
<files wp-login.php>
  <RequireAny>
    Require ip xxx.xxx.xxx.xxx
    Require ip xxx.xxx.xxx.xxx
　　　　・・・
  </RequireAny>
</files>

<Directory /var/www/wordpress/wp-admin>
  <RequireAny>
    Require ip xxx.xxx.xxx.xxx
    Require ip xxx.xxx.xxx.xxx
　　　　・・・
  </RequireAny>
</Directory>
```

## Firewall設定
Wordpress関係ないけど、そもそもsshなんて社外からは接続させたくない
不要なポートにはアクセスさせないということで

Firewallサービス起動

```
# systemctl start firewalld
```

確認

```
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: dhcpv6-client ssh
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```
サーバ起動時に自動開始するように設定

```
# systemctl enable firewalld
```

httpd(80/443)サービスを許可

```
# firewall-cmd --add-service=http --zone=public --permanent
# firewall-cmd --add-service=https --zone=public --permanent
```

ssh許可を削除
```
# firewall-cmd --remove-service=ssh --zone=public --permanent
```

sshを特定アドレスからのみ許可

```
# firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address="xxx.xxx.xxx.xxx/32" port port="22" protocol="tcp" accept' --permanent
```
設定リロード

```
# firewall-cmd --reload
```
CentOS7.9 にWordpress5.8を導入する

## はじめに
Wordpress環境を作成しなければならない機会がありましたので、手順メモ！

## 環境
* CentOS 7.9
* Apache 2.4
* PHP 7.4
* MariaDb 10.6
* Wordpress 5.8

## 前提（以下が実施されていること）
* [CentOS7.4 にMariaDB10を導入する](https://qiita.com/ymachida/private/01c04ffdad14d788413c)
* [CentOS7.4 にPHP7.4を導入する](https://qiita.com/ymachida/private/d73dc3f630e9421021ad)

## Wordpress導入
Wordpressダウンロード、解凍

```
# cd /var/www
# wget https://ja.wordpress.org/latest-ja.tar.gz
# tar -zxvf latest-ja.tar.gz -C /var/www/
```

権限の変更
※ここあたりをやっておかないと、プラグインの導入時にFTPホスト等を聞いてくる

```
# cd /var/www/
# chown -R apache:apache wordpress
```
ドキュメントルート変更

```
# vi /etc/httpd/conf/httpd.conf

DocumentRoot "/var/www/wordpress"
<Directory "/var/www/wordpress">
    AllowOverride All
    # Allow open access:
    Require all granted
</Directory>
```
設定変更を反映する為にサービス再起動

```
# systemctl restart httpd
```

Wordpress設定
※リモートからであればIP又はドメインに置き換え
https://localhost/

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2091355/c3115391-4bfa-db94-9950-58cc9c381ea9.png)
![2021-11-23-16-02-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2091355/1d94c7a8-aa2c-39c7-7a8f-d6723bf37bb3.png)
パラメータはDb作成時のものに揃えます
![2021-11-23-16-02-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2091355/2e8d3990-4eb1-1c25-1d90-7a25b8d299c0.png)

上記が出た場合は、画面の指示に沿って設定
wordpressフォルダの所有者の変更を実施していれば出ないはず！

```
# cd /var/www/wordpress/
# vi wp-config.php
```
![2021-11-23-16-14-17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2091355/803ae307-26de-10f6-a905-25adad423c1e.png)
ユーザ名等は任意に決めます


管理ページへログイン
※リモートからであればIP又はドメインに置き換え
http://localhost/wp-admin/
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2091355/21a35472-75c6-61a3-e7db-b140dba075fe.png)

これで完了です！！
CentOS7.9 にPHP7.4を導入する

## はじめに
Wordpress導入にあたっての前提の環境作成の一部です
[CentOS7.4 にWordpress5.8を導入する](https://qiita.com/ymachida/private/062b8ab41adcfb7413c6)

## 環境
* CentOS 7.9
* Apache 2.4
* PHP 7.4

## Apache導入

apacheをインストール

```
# yum -y install httpd httpd-tools httpd-devel mod_ssl
```

apache起動

```
# systemctl start httpd
```
サーバ起動時に自動開始するように設定

```
# systemctl enable httpd
```
## PHP導入

リポジトリ追加
※CentOS7標準のPHPは古いのでリポジトリを追加

```
# yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm
```

PHP導入
とりあえず必要なものを追加(うちの環境ではこれくらいあればOK)

```
# yum install -y --enablerepo=remi-php74 php php-common php-opcache php-mcrypt php-cli php-gd php-curl php-mysqlnd php-pecl-imagick php-pecl-imagick-devel php-pecl-zip php-mbstring php-xml php-pear
```

Apacheを再起動して適用

```
# systemctl restart httpd
```

これで完了です！！

追記：
PHPの情報を確認したい場合は、以下内容のphpファイル配置し確認可能

```
<?php
phpinfo();
?>
```
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2091355/16c3962d-e16c-fc0f-9967-df968d77777a.png)
Freezedの使い方

#はじめにFreezedとは
簡単に言えばコピーメソッド等を含む**Immutable(不変)**なクラスを生成することができるパッケージのこと
Freezedでコードを生成することで便利なメソッドがいくつか使用できるようになる。

:::note info
・copyWith
  nullを割り当てることが可能な複製メソッド

・==
  同値であることの確認

・toString
  文字列化した時の結果

・fromJson
  Map<String, dynamic>からの変換

・toJson
  Map<String, dynamic>への変換
  
:::
上記のメソッドを使用して開発を楽にしましょう！

#Freezedの使用方法
## インストール

```pubspec.yaml
dependencies:
  //　@freezed などを使うために必須
  freezed_annotation:

dev_dependencies:
  //コード生成するために必要
  build_runner:
  freezed:
  //　fromJson/toJson　を生成させたい場合に必要になる
  json_serializable:
```

##Freezedクラスの書き方
例として、友人の情報をまとめたFriendクラスをfriend.dartファイルを作成して、
そこに定義していく。

```friend.dart
import 'package:freezed_annotation/freezed_annotation.dart';
// {ファイル名}.freezed.dart　と書く
part 'friend.freezed.dart';

//Freezed特有の書き方なので、スニペットを用意するのが良い
@freezed
class Friend with _$Friend { 
  const factory Friend({ 
    /// 友人の名前
    required String name, //requiredで必須項目にする
  }) = _Friend; 
}
```
上記のコードのようにプロパティを必須項目にするには定義するプロパティの前にrequiredを記述する。
他にもnull許容にする場合、デフォルト値を設定する場合には下記のようにする。

```dart:null許容
  String? name
```

```dart:デフォルト値
  @Default('qiita君') String name
```
Freezedなクラスの定義が完了したら次にターミナルで下記のコマンドを入力し
Build Runnerの機能を使用し、コードを生成する。

```dart:ターミナル
  flutter pub run build_runner build 
```

Freezedクラスの修正や変更があった時などに、変更ごとに上記のコードを入力するのが面倒だと思います、そのためにファイルの更新を検知して自動で再生成してくれるコマンドも用意されています。
簡単です。上記のコードの最後のbuildをwatchに変えるだけ！

```dart:ターミナル
  flutter pub run build_runner watch
```
コードを生成してからそれだけで終了せず、**監視**を行ってくれます。

Freezedクラスを編集してコード生成をすると、古い生成済みファイルと競合しエラーが発生することがあります。
delete-conflicting-outputs オプションを付けることで、競合ファイルを削除して再生成してくれます。

```dart:ターミナル
  flutter pub run build_runner watch --delete-conflicting-outputs
```

##Jsonから変換 または Jsonへの変換 をするために(fromJson/toJson)
Jsonから変換 Jsonへ変換するためのメソッドを生成するためには
Freezedだけではできないので 最初にpubspec.yamlに記入した **json_serializable** を使用し生成する。

JSON相互変換メソッドを生成させるには以下の２行を追加します。

1. part 'friend.g.dart' を追加
2. fromJson用のfactoryコンストラクタを追加

```dart:friend.dart
import 'package:freezed_annotation/freezed_annotation.dart';

part 'friend.freezed.dart';
part 'friend.g.dart'; // 追加

@freezed
class Friend with _$Friend {
  const factory Friend({
    required String name,
  }) = _Friend;

  // {} ではなく =>（アロー）を使ってください
  factory Friend.fromJson(Map<String, dynamic> json) => _$FriendFromJson(json);
}
```

これで、 fromJson, toJson 両方のメソッドが生成されるようになりました!

##リントツールでのエラーが出る場合の対処方法
使用しているリントツールによっては、「コードがおかしいですよ」と怒られることもあるので、その場合は下記のように、 analysis_options.yaml で生成ファイルを対象外にしましょう。

```analysis_options.yaml
analyzer:
  exclude:
    - "**/*.freezed.dart"
    - "**/*.g.dart"
```



##今回参考にさせて頂いた記事
主にRiverpodの使い方など本当にわかりやすく書かれています、
今回の記事は以下の記事のほんの一部に過ぎないので、
ぜひ参考にしてみて下さい！

https://zenn.dev/riscait/books/flutter-riverpod-practical-introduction/viewer/freezed
SSL Certificateのエラーでgraphvisのインストールが失敗する

brewでgraphvisをインストールしようとすると、netpbmのインストールで失敗する

```
svn: E170013: Unable to connect to a repository at URL 'https://svn.code.sf.net/p/netpbm/code/stable'
svn: E230001: Server SSL certificate verification failed: certificate has expired
```

システムsvnが悪さをしているらしく

```
svn install svn
```
をした後に、`svn install graphvis`をすると解決する

### Reference
https://github.com/octave-app/octave-app/issues/121
最強になるための最強の質問方法

## はじめに

こんにちは。<font color="red">DMM WEBCAMP Advent Calendar 2021</font>　<b>2日目</b>を担当する@nabekikikiです！:slight_smile:
もうすっかり外は寒くなり、家の中で何か新しいことを始めたくなる季節になりましたね。
例えば、プログラミングとか…
さて、この記事ではそんなプログラミングを始めたばかりのあなたに、
最強の質問方法を伝授します！！:fire:

#### この記事の対象者
　・プログラミング初学者
　・プログラミングスクールに登録したばかりの方

#### この記事でわかること
　・最強の質問のしかた

#### ゴール
質問の三原則+αをマスターする。
１．何をしようとしたのか？
２．そのためになにをしたのか？
３．２によってどのような結果になったのか
EX.　何か参考にしたか？

### 三原則がなぜよいのか
まず、質問された回答者が状況を把握しやすく、回答時間を短縮できることが挙げられます。
→質問者はすぐに教えてもらえてうれしい。
　回答者はすぐに答えて自分の業務に戻れてうれしい。

みんな嬉しいです。

ほかにも、質問時だけでなく未来にも活きます。
自分の中でゴールと問題がセットで整理できるため、
今後同様のエラーが出たときに思い出しやすくなることでしょう。


### ちゃんと質問できてますか？
いきなりですが、例えばそこら辺のおばあちゃんから急に
:older_woman_tone1:「携帯の使い方を教えてくれんかのぉ～？」
と聞かれたらどうしますか？おそらく、
:smiley:「何をしようとしましたか？」
と問い返すはずです。それから
:smiley: 「じゃあ今どんな画面になってるか見せてください」
というように少しずつ掘り下げていくことでしょう。
それからあなたはようやく解決方法を探り始めることができます。

<b>…無駄じゃないですか？</b>
このノーマルおばあちゃんがスーパーおばあちゃんだったら、こうなります。
:older_woman_tone1::sparkles:「携帯でおじいにメールをしようとしたら、なぜか電話の画面になってもうて、ようわからんのじゃあ…この説明書を読んでこうしてみたんじゃが、何が悪かったんじゃろか？」

:smile:「じゃあここをタッチして、こうして…」→解決

素晴らしい。美しすぎる…
非常にスムーズですよね。

では何が違うのか詳しく見ていきましょう。

## 何が違うの？？
まずすぐみてわかるのは、『文章が一つか複数か』だと思います。
質問者、回答者ともに時間があるならば、後者でも問題ないでしょう。
ただ実際の業務となると、話は別。先輩エンジニアはあなたの質問に答える仕事だけでなく、先輩自身の業務もあります。そんな中で上記のノーマルおばあちゃんみたいな質問をされたら、答えられる質問も時間がなくて答えられなくなります。
さらに、最初に抽象的に聞かれると、質問された側は丸投げされた気持ちになります。それではたとえ時間があっても、気持ちよく答える気にはなりませんよね。そうなると、今後は質問に答えてもらえなくなるかもしれません。

## エンジニアに置き換える
上記の悪い例、良い例をそれぞれエンジニアに置き換えてみると、
(OK)　○○をしたくてｘｘをしたら△△になった。□□のサイトを参考にした。
(NG) エラーがでた。○○できない。など

## まとめ
質問するときに、その質問あるいは先輩などから受ける回答をより良く濃いものにするためには、以下の３つ +αに注意して質問するとよいです。
１．何をしようとしたのか？
２．そのためになにをしたのか？
３．２によってどのような結果になったのか
EX.　何か参考にしたか？

上記の例で、良い例と悪い例の違いは一目瞭然でしたね。もちろん回答者のスキルや教え方によって回答の質は変わるものですが、あなたの質問の仕方によっても、回答の質は良くも悪くもなるのです。さらに、成長のスピードにも差が生まれることでしょう。特にあなたがまだ学習を始めたばかりであるならば、より良い質問を心がけ、ほかの初学者と大きく差をつけましょう！:runner_tone1:

## おわりに
最後までご覧いただきまして、ありがとうございます。
ほかにも少しですが記事を出しておりまして、今後も更新していく所存でありますので、
ぜひプロフィールから確認してみてください！！:upside_down:

### おまけ
#### 画面の多さ、それすなわち机の広さである！
最後に私が初学者だったころにあってよかったモニタについてお話します。
ただ画面が一枚増えるだけでしょ、はあーほかのキータ見に行こって思ったそこのあなた。
その通りです！でも考えてみてください。学生の時どのように学習していましたか？
恐らく左（あるいは右）に教科書、反対側にノートを置いていた方が多いのでは？
これが仮に教科書かノートどちらかしか一度に見れないとなると、とても不便ですよね。

これはプログラミングにもいえます。
サイトを見ながら学習する際、いちいち画面を切り替えていては効率がいいとは言えません。
要はモニタの数は、これまでの学習で言うと机の広さのようなものです。
机が広ければ広いほど教科書を置いたり広々使えたりします！
ただモニタが多すぎても（机が広すぎても）無駄なので、数は最初は＋１枚でいいと思います。

いかがでしょうか。モニタをもつメリットをご理解いただけたでしょうか？
もしよければ買ってみてください！

ちなみに私はモニタを持ってないのでテレビにさしてHDMIで表示してます。
テレビでもモニタでも似たようなものなので、テレビしかない方はテレビにつないてみてください！

あとは、iPadでもアプリ（有料）を使えば出力できる（やや遅延あり）ので、そちらもご検討ください！

ちなみに気づきましたか！？「テレビでもモニタで"も似た"ようなもの」
以上です。明日は@ayumu-1212さんです！明日以降の記事もお楽しみください。:point_right:
DockerfileにおけるCMDとRUNの挙動

# はじめに
Dockerfileを書く際に、CMDとRUNの挙動について調べたので、そのことについてまとめていく。

# CMD
- `CMD の主な目的は、コンテナ実行時のデフォルト（初期設定）を指定するためです `と公式ドキュメントにあるように、CMDはコンテナが作成されるときに実行される。
- ということは、イメージを作成するビルド時に実行されないと思われるので試してみた。


https://docs.docker.jp/engine/reference/builder.html#cmd

## 試してみた

- Dockerfileの最後にCMDでWebサーバーを起動するコマンドを書いた際の挙動をみてみる。 
- 以下、Dockerfileのみ抜粋。
- 他の構成ファイルは[Github](https://github.com/subretu/docker-express-vuejs)を参照。

```dockerfile
FROM node:12.22.1-alpine

WORKDIR /app

COPY ./src/package.json ./src/yarn.lock ./src/server.js ./

RUN yarn install

# コンテナ作成後にコマンド実行
CMD [ "node", "server.js" ]
```
#### １．Dockerfileをビルド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264860/96266d01-71ea-7063-49da-085b8be3c667.png)

- ビルドしただけなので、CMDのコマンドは実行されず、何も表示されない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264860/55459c31-a78e-3146-7582-2541d76f86c2.png)


####  ２．コンテナを起動

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264860/356228d2-e410-d262-c011-e952c0226165.png)

- 画面が表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264860/fb9c0f26-e208-9747-6b52-83e8c0249750.png)

## 結果

**Webサーバーが起動していることから、コンテナ作成時にCMDで書いたコマンド`[ "node", "server.js" ]`が実行されたことが分かる。**

# RUN
- `RUN 命令は、現在のイメージよりも上にある新しいレイヤでコマンドを実行し、その結果を コミット（確定）commit します `と公式ドキュメントにあるように、RUNはビルド時に実行される。
- ということは、ビルド時に実行されると思われるので試してみた。


https://docs.docker.jp/engine/reference/builder.html#run

## 試してみた

- Dockerfileの最後にRUNでWebサーバーを起動するコマンドを書いた際の挙動をみてみる。 
- 以下、Dockerfileのみ抜粋。
- 他の構成ファイルは[Github](https://github.com/subretu/docker-express-vuejs)を参照。  
※Dockerfileの最後は以下のように変更すること。

```dockerfile
FROM node:12.22.1-alpine

WORKDIR /app

COPY ./src/package.json ./src/yarn.lock ./src/server.js ./

RUN yarn install

# ビルド後にコマンド実行
RUN node server.js
```
#### １．Dockerfileをビルド
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264860/850cb078-fcd3-e9be-fdd0-cee13085688f.png)

- `node server.js`が実行されているのがみえる。

## 結果

**イメージのビルド時にRUNで書いたコマンド`node server.js`が実行されていることが分かった。**
Parallelsを使用してM1(apple Silicon)MacでWindows11環境を構築する方法

# はじめに
M1 MacでWindows11環境を構築する際の手順・注意点をまとめました。
Microsoft自体がArmの正式対応をしていないこともあり、公式のドキュメントでは分かりづらい部分があったりデフォルトではWindowsStoreが使えなかったりといった制限が出ているので各種の回避方法も合わせてまとめておきます。


### 前提条件

(2021/11/24現在)AppleSilicon用のWindowsは提供されていないため、Windows11 Insider Program版を使用します。
また、BootCampも非対応のためParallelsを使用してParallels上にWindows環境を構築します。

### 導入までの手順概要

導入までのステップは大きく分けて以下の3点です。事前にparallelsは購入しMacにインストールしておいてください。

1. Insider Program版Windows11ファイルの入手
1. Parallelsへのインストール
1. Insider Programの活性化
1. WindowsStoreの復旧


# 導入手順
## Insider Program版Windows11ファイルの入手

### Insider Programへの登録
[こちらのURL](https://insider.windows.com/en-us/register)よりWindowsのInsider Programへ加入します。
Registerタブ内でライセンスに同意すればかんたんに登録完了します。

登録にあたり事前にMicrosoftアカウントが必要のため、右上のアイコンからアカウント作成(もしくはログイン)を行ってください。

### Insider Programのボリュームファイルのダウンロード
[こちらのURL](https://www.microsoft.com/en-us/software-download/windowsinsiderpreviewARM64)からInsider ProgramのVHDXファイルをダウンロードしてください。

Microsoftアカウントでログインしていない状態だとダウンロードメニューに移行しないため、ダウンロードボタンが出ない場合は右上のアイコンからログイン後ページを再読み込みしてください。

## Parallesへのインストール
ダウンロードしたVHDXファイルを指定し、Windowsをインストールしてください。
何度か選択肢が出てきますが、基本はOKを押せばそのままインストールが進みます。

## Insider Programの活性化
分かりづらいですが、インストール直後の状態ではInsider Programの登録がWindowsに適用されておらず、Windowsのアップデートファイルが適用できないなどの障害が発生します。

Insider ProgramのメニューからInsider Programへの登録を行ってください。
登録作業は以下のメニューから行います(登録時にMicrosoftアカウントでのログインが求められます)
`setting -> WindowsUpdate -> Windows Insider Program -> Insider Program`

## WindowsStoreの復旧

私はここでハマりました。
デフォルトの状態ではWindowsStoreが正しくインストールされておらずリセットの必要があります。Parallelsが対応版のレジストリファイルを提供しているのでレジストリ適用後、WindowsStoreを初期化してください。

Parallels公式の案内は[こちら](https://kb.parallels.com/en/128520)


# おわりに
Parallelsは有料ですがMac内でWindowsを使うにはかなり良い環境だと思います。
現状はWindows自体がArmに公式対応してくれておらずInsiderProgram版を使わざるを得ないのが残念なところです。
BigQuery Hive Partitioning のフィルタリングについて

## やりたいこと
`gs://my-bucket/my_logs/year=2021/month=05/day=08/hour=10/minute=35/hogehoge.parquet`
のような BigQuery HivePartitioning を使った external table を作ってクエリをかけるときに、

```sql
SELECT 
    * 
FROM 
    `my-project.my_dataset.my_table`
WHERE 
    TIMESTAMP(FORMAT("%04d-%02d-%02dT%02d:%02d:00`, year, month, day, hour, minute)) BETWEEN
        TIMESTAMP(_from) AND TIMESTAMP(_to)
LIMIT 1000
```

みたいな絞り込みをかけたい

## 結論
```sql
SELECT 
    * 
FROM 
    `my-project.my_dataset.my_table`
WHERE 
    year = 2021
    AND month = 10
    AND day = 3
　　　　　　　　-- AND TIMESTAMP(FORMAT("%04d-%02d-%02dT%02d:%02d:00`, year, month, day, hour, minute)) BETWEEN
    --    TIMESTAMP(_from) AND TIMESTAMP(_to)
LIMIT 1000
```
だと読み込みファイルに制限がかかるけど、コメントアウトの行を外すだけで全走査になって、クエリ読み込みサイズがキーーってなる

## 解決方法
`EXTRACT()` を使って、 `_from` と `_to` の年・月・日の大小で場合分けをして、やろうとしたけど、クエリの量が爆発したので無理でした
Azure Container Apps のサンプルから見る Dapr

Azure Container Apps。チュートリアルでサクッと試すことができます。面白いです。

https://docs.microsoft.com/ja-jp/azure/container-apps/microservices-dapr?tabs=bash

なのですが、正直この通りに実行するだけだと、クライアントからの呼び出し方が疑問だったので調べてみました。

# 使われているサンプルの詳細

ここで利用されているサンプルは、下記の Dapr の QuickStart が題材になっています。

https://github.com/dapr/quickstarts/tree/v1.4.0/hello-world

# クライアントからの呼び出し方

上記の QuickStart 的には、下記のようなコードが使われています。

```python
dapr_port = os.getenv("DAPR_HTTP_PORT", 3500)
dapr_url = "http://localhost:{}/v1.0/invoke/nodeapp/method/neworder".format(dapr_port)

n = 0
while True:
    n += 1
    message = {"data": {"orderId": n}}

    try:
        response = requests.post(dapr_url, json=message)
    except Exception as e:
        print(e)

    time.sleep(1)
```

WebAPI 的なサーバアプリに対して、定期的に HTTP リクエストを投げて値を更新しています。

Container Apps のチュートリアルで使われているコンテナイメージ `dapriosamples/hello-k8s-python:latest` も、別途起動して確かめてみたところ上記のコードがそのまま使われていました。

# localhost で良いの？

と、ここで「宛先が localhost で良いの？」というところが気になります。「サーバアプリは別の Pod で起動しているから localhost じゃ通信できないんじゃないの？」と。

結論から言うと、ここで Dapr の機能が使われており「これで OK」ということになります。

呼び出しの仕組みについては、下記のドキュメントの図がイメージつきやすいと思います。

https://docs.microsoft.com/ja-jp/dotnet/architecture/dapr-for-net-developers/service-invocation

![](https://docs.microsoft.com/ja-jp/dotnet/architecture/dapr-for-net-developers/media/service-invocation/service-invocation-flow.png)

このように、`DAPR_HTTP_PORT` である tcp:3500 へリクエストを投げると、サイドカーとしてデプロイされた Dapr コンテナに対してリクエストが転送され、そこから目的のサービスに対してリクエストが転送されていく、というアーキテクチャになっているわけですね。

より詳しい Dapr の公式ドキュメントとしては、下記のページが参考になると思います。

https://docs.dapr.io/developing-applications/building-blocks/service-invocation/service-invocation-overview/

https://docs.dapr.io/developing-applications/building-blocks/service-invocation/howto-invoke-discover-services/

# おわりに

で、この Dapr なインフラを簡単に実装してくれる Container Apps はすごいなと改めて思いました。

まだまだプロダクション環境向けには足りない機能もありますが、ぜひ進化し続けてほしいサービスだなぁと思います。
3G、4G とは？

## 勉強前イメージ

携帯の通信規格だと思うけど
何が違うとかはわからない

## 調査

### 3G とは

携帯電話における通信規格を表し、第三世代の3rd Generationから3Gと使われていて第3世代移動通信システムの通称になります。
2001年ごろに登場し、メールやインターネットの高速化を可能にしました。
サービスとしては以下があります。

- docomo : FOMA
- au : CDMA 1X
- vodafone : Vodafone Global Standard

### 4G とは

上記同様4th Generationから4Gとつけられました。
2015年ごろ登場し、より高速・大容量の通信が可能となりました。
音声通話よりデータ通信に特化しており、高速化や応答速度向上が重視されていました。
サービスとしては以下になります。

- docomo : Xi
- au : au 4G LTE
- softbank : softbank 4G LTE


### LTEと4Gは一緒のもの？

実はLTEと4Gは別のもので、 `3G → LTE → 4G` の順になります。
LTEはLong Term Evolutionの略で長期的な成長を意味し、3.9Gとも呼ばれ3Gと4Gの中間になるものです。
4Gの移行準備として登場し4Gを円滑にスタートさせるためにLTEが導入されました。
今ではLTEと4Gを同様のものとして書かれているところも多いです。

### 3Gと4Gがあるなら1Gもあった？

もちろん1G、2Gありました。

- 1G

上記同様に第一世代の携帯電話の方式で、1985年に登場しました。
音声をデジタル変換せずにアナログのまま送信する電話で、登場当時は自動車電話で使われていました。
後にショルダーバッグのようなポータブル機ができました。
2Gに移行後、2000年に廃止になりました。

- 2G

上記同様第二世代で、1993年に登場したデジタル変換して送る方式になります。
デジタル化することでメールやインターネットも可能になりました。
docomoではiモードのサービスも開始されました。
3Gに移行すると2012年に終了しています。

### movaは何世代？

docomoではよく、FOMAとmovaでー みたいな話は昔した気がしますが、
movaは第二世代、FOMAは第三世代になります。

## 勉強後イメージ

FOMAとmovaでmovaの方が老舗感あったけど
FOMAの方が先を行ってたのねー
結構対応してる携帯ばっかり気にしてたけど、後々になってみると懐かしくなる

## 参考

- [3Gや4G/LTE、5Gの違いとは？](https://jp.skyberry.me/column/1808/)
- [3G、4G/LTE、5Gの違いとは？](https://linksmate.jp/article/mvno_3g/)
- [移動体通信の今・昔　1Gから5Gへ（1）](https://www.hummingheads.co.jp/reports/closeup/1409/140901_01.html)
- [「1G」や「2G」はないの？携帯電話の「3G」って、一体ナニ？](https://enjoy.sso.biglobe.ne.jp/archives/3g/)
- [【今日は何の日？】ドコモの「Xi」が始まった日](https://k-tai.watch.impress.co.jp/docs/special/20th/1297288.html)
【TailwindCSS】VScodeでセットアップ時にエラーが出る時の対処法

#はじめに
こんにちは。
こちらの記事では、TailwindCSSでセットアップのエラーの対処法を記しています。

##問題・原因・対処法

###起きていること

![VScodeError](https://i.gyazo.com/ec9659d0b7b7d1d5a0de9a001d257608.png)
VScodeで、TailwindCSSをセットアップする工程の中に、CSSに上記のように追記する必要があるが、波線でエラーが発生してしまう。
（今回、Nuxt.jsにTailwindCSSを採用しているため、assetsディレクトリにCSSを配置していますが、任意の場所で大丈夫です）

###なぜこの問題が発生したのか

>TailwindCSS公式：https://tailwindcss.com/docs/installation

公式によると、Webpackがなんらかの影響を及ぼしているようですが、詳しいところは私も理解できておりません、、、
よければコメントでご指摘やご意見いただけると非常に助かります！

###解決方法

![VScode](https://i.gyazo.com/642c66b380ba23959a62e7d63fe58701.png)
VScodeで、拡張機能の`PostCSS Language Support`をインストールして有効化すると、先ほどのエラーが解消されます。


<br>


#おわりに
ここまでTailwindCSSでセットアップのエラーの対処法についてまとめました！
サポーターズ エンジニア1on1面談イベントに参加してきた

# はじめに
B3 iOSインターン生の[にいまる](https://twitter.com/niimaru09)です。
逆求人イベントに参加してきたので、参考になるようにレポートを書いてみます。

# サポーターズとは？
僕がいつも使ってる、学生エンジニア就活のサポートをしてくれるサービスです。（回し者じゃありません）

https://talent.supporterz.jp

# どんなイベントなの？
一日に最大８社と面談できる逆求人イベントです。雰囲気はめちゃめちゃカジュアルでした！
参加するにはサポーターズ側で選考がありますが、選考を通り抜けると早期選考、自己紹介へのフィードバック、長期インターンのオファーなどがあり、非常に魅力的です。

参加確定後は企業さんにする自己紹介の準備をするのですが、任意でサポーターズ側で自己紹介準備のための面談みたいなものに参加することができます。

僕は自己紹介に命かけてたので、自己紹介資料は３日くらいかけてみっちり作りました！

# 参加までの流れ
選考
↓
参加確定
↓
サポーターズ側でのサポート面談
↓
自己紹介の準備
↓
1on1面談イベント当日
↓
後日、オファーが届くかも？

みたいな感じでした。普通のESみたいな感じで、そこまで選考の負担はないです！

# 当日
午前に企業プレゼンがあり、お昼休み中に面談希望アンケートを書き、午後は面談が組まれた企業さんと実際に面談をするという形式です。自分は８社（最大）と面談を組まれたため、後半は声がカスカスになってました。。もちろん人気な企業さんは面談希望が通らないこともありますが、それでもおおよそ通ったので、それほど心配する必要はないと思います！

↓ちなみに、自分の面談資料の表紙はインパクト重視でこんな感じにしました（笑）。ウケもめっちゃ良かったです！
![スクリーンショット 2021-11-24 23.03.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/861241/7821b5f2-224d-a243-4ae1-4da13d7ed5ea.png)


面談の内容としては

- 開発物
- 現在参加しているインターンの話
- 将来どうなりたいか
- 企業選びの軸
- 企業さんへの質問タイム

などでした。上の項目は重点的に聞かれるので準備していて損はないと思います。自分は現在参加している長期インターンの話が一番盛り上がった気がします。

さいごに、イベント終了後は企業さんから丁寧にフィードバックの文章が送られてきます。

# 参加してよかったこと

### 自己分析につながった
**自分にとって間違いなく一番の収穫でした。**自己紹介スライドをみっちり洗練させて作るので、改めて振り返る機会になります。また自分が作った資料が残るので、このイベントが終わった後でも見返したりできて便利です。

### フィードバックがもらえた
**選考過程で自己紹介をする機会はたくさんありますが、フィードバックをもらうことは殆どないため、このイベントに参加する最大のメリットだと思います。**人間面、そして技術面でも非常に参考になりました。ちゃんとフィードバック聞いて改善すれば、本選考でも相当な武器になるはずです。
また「ここの話はウケたな」、「ここの話は盛り上がらなかったな」みたいなことも分かるので、今後の選考などで話すべき内容などもわかってきました。

### 自身がついた
企業さんの反応を見て、自分の今までの経験が無駄じゃなかったんだなと、大きな自信に繋がりました。

### ネクストアクションがわかった
下記のようなフィードバックを丁寧に頂きました。

- 「今のインターン先で本当に良い経験を積んでいるみたいなので、これからもぜひ力を入れてやってほしい。」
- 「長期インターンで獲得したノウハウを個人開発に応用すると、さらにレベルアップに繋がる。」
- 「開発物をただ作っているだけでなく、課題感をここまで持っている学生はほとんどいない。」
- 「直面した課題をどう乗り越えたかについて話せるとより良い。」

イベント開催から１ヶ月ほど経ちましたが、今でもかなりの頻度で読み返しています。

### 技術力の高い企業から、長期インターンのオファーが来た
「自分がこんなすごい企業さんのところで働いていいんか！？！？！？」って思うくらい驚きました。自分がオファーを貰った企業は１回目に面談をしたところで、初めてということもあり非常にテンパった自己紹介を見せつけてしまったのですが、その後の話が盛り上がったのが良かったかも知れません。

### 早期選考、選考免除につながった
行きたい企業さんからオファーが来ると超ラッキー！！！忙しい就活生のミカタですね


### アマギフを大量にもらった（笑）
あまり大きい声では言えませんが、中古のiPhoneが購入できるくらいには溜まりました。僕はガジェット大量に買いました。

# 感想
正直参加できると思ってなかったので、参加が確定した時点で就活の大きなターニングポイントになったと思います。渋谷の道玄坂で合格の連絡が来たのは今でも覚えています（笑）

なので、出来なさそうでもとりあえず挑戦してみることが大事だと思いました。

その反面まだまだ頑張れる余地はあるなと、実感する機会になりました！


# おまけ

### 逆に悪かったことは？
非常に疲れます。マジで。後半になると自分も企業さんもかなりぐったりしています。
あとエンジニア仲間はオンラインだと殆どできない気がします。

### 学生エンジニア仲間はできた？
オンライン開催ということもあり、全然できませんでした、、、slackで一言挨拶しただけです。

### サポーターズの1on1面談イベントいくつかあるけど、何回でも参加できる？
僕は１回目(10/23)で味をしめたので、追加で２回( 10/24, 12/5 )参加予定です（笑）
ただしサポーターズでの面談で聞いたのですが、同イベントで既に接触したことがある企業さんが多い場合、その1on1イベントには通りづらいそうです。
Django 初期設定2

#はじめに
ここではstartapp時に作成されたmodels.pyとview.pyを使用するのではなく、<br>個別にフォルダを分けて開発を行っていく際の設定方法を手順化していきます。
個別フォルダに分けるメリットとしては、管理が楽になりメンテナンスがしやすくなるからです。
ついでにtemplateフォルダも作成していきます。

#目次
1. Templateフォルダの作成
1. Modelsフォルダの作成
1. Viewsフォルダの作成
1. 既存のファイルの削除

##Templateフォルダの作成
BASE_DIR(manage.pyがあるファイル)に移動します。
templatesフォルダを作成します。
名前は「templates」にします。
作成したフォルダの内にhtmlファイルを作成します。
ここでは、index.htmlを作成しておく。

##Modelsフォルダの作成
startappで作成したアプリのディレクトリに移動します。

modelsフォルダを作成します。
名前は「models」にします。
作成したフォルダの内に\_\_init__.pyを作成します

次にmodelsを定義していくファイルを作成していきます。
ここでは、sample_models.pyとします。

先程作成した\_\_init__.pyを開き下記の内容を記載していきます。
sample_models.pyの箇所は各自が作成したmodelsを定義するファイル名に書き換えてください。

```python:models/__init__.py
from .sample_models.py import *
```

##Viewsフォルダの作成
startappで作成したアプリのディレクトリに移動する。

modelsと同様の作業を行っていく。
viewsフォルダを作成します。
名前は「models」にします。
フォルダ内に\_\_init__.pyを作成します。

次にviewsを定義していくファイルを作成していきます。
ここでは、sample_views.pyとします。

先程作成した\_\_init__.pyを開き下記の内容を記載していきます。
sample_views.pyの箇所は各自が作成したviewsを定義するファイル名に書き換えてください。

```python:views/__init__.py
from .sample_views.py import *
```

##既存のファイルの削除
startapp時に作成されたmodels.pyとviews.pyを削除して完了
以上