OmniAICreator/Qiita-1.07M huggingface dataset:
VBScriptベースHTA：チェックボックスに合わせて要素を表示↔非表示

前回の続きです。
[VBScriptベースのHTAで入力フォームを増やしたり減らしたりする](https://qiita.com/harryyuni/items/1bede8590cf04f1be338)

#概要
　チェックを入れると項目を表示して，チェックを外すと項目を非表示にする簡単な実装です。次の項目も表示非表示に合わせて上下します。
![2021-02-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622636/59dd0724-71f3-3731-4dee-88e64502c844.png)
![2021-02-12 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622636/f44731df-05b3-fe62-92d4-c92ab64a2fed.png)

#スクリプト
以下の内容でメモ帳の拡張子を.htaにして保存すればすぐに使用できます。
　保存時の「文字コード」は「ANSI」にしないと文字化けします。

```html:hta
<html><head>
<title>表示非表示</title></head>
<style type="text/css">
#product{display:none;}
</style>
<body>
<h2>
<input type="checkbox" name="checkboxproduct" 
onClick=display(this.checked,"product") />物品あり
</h2>

<p id="product">品名<br>
<input type="checkbox" name="product"/>ノート
<input type="checkbox" name="product"/>ファイル
<input type="checkbox" name="product"/>えんぴつ その他（入力）
<input type="text" name="product"/>
</p>
<h2>次の項目</h2>

<script language="VBScript">
Sub display(checked,displayTagId)
	If checked=True Then
		document.getElementById(displayTagId).style.display="block"
	Else
		document.getElementById(displayTagId).style.display="none"
			Dim tag
			For Each tag In document.getElementsByName(displayTagId)
				If tag.Id <> displayTagId Then
					Select Case tag.type
					Case"radio","checkbox"
						tag.checked=False
					Case"text"
						tag.Value=""
					End Select
				End If
			Next
	End If
End Sub
</script>
</body>
</html>
```
#説明
　styleタグで初期設定を非表示にしています。

```html:hta
<style type="text/css">
#product{display:none;}
</style>
```
　表示非表示を変更するチェックボックスのonClickの第一引数でチェックの有無を渡し，表示非表示を切り替えます。

```html:hta
<input type="checkbox" name="checkboxproduct" 
onClick=display(this.checked,"product") />
```
```vb:hta
Sub display(checked,displayTagId)
	If checked=True Then
		document.getElementById(displayTagId).style.display="block"
	Else
		document.getElementById(displayTagId).style.display="none"
	End If
End Sub
```
　しかし，これだけだと非表示にした要素のチェック内容やテキストが残ってしまい，場合によっては後続の処理に影響してしまいます。
　非表示にしたら，非表示にした要素のチェックやテキストも消す方がユーザーの感覚からも自然でしょう。

　そこで，子要素のnameを同じにすることでgetElementsByNameで全子要素を取得し，タグのTypeに合わせて入力をリセットしています。
　また，親要素のpタグのIDと子要素のinputタグのnameを同名にすることで引数を減らしています。

```vb:hta
Else
	document.getElementById(displayTagId).style.display="none"
		Dim tag
		For Each tag In document.getElementsByName(displayTagId)
			If tag.Id <> displayTagId Then
				Select Case tag.type
				Case"radio","checkbox"
					tag.checked=False
				Case"text"
					tag.Value=""
				End Select
			End If
		Next
End If
```

```html:hta
<p id="product">品名<br>
<input type="checkbox" name="product"/>ノート
<input type="checkbox" name="product"/>ファイル
<input type="checkbox" name="product"/>えんぴつ その他（入力）
<input type="text" name="product"/>
</p>
```

　ただ，IEにはNameと同一のIdタグはgetElementsByNameで拾われてしまうというバグがあり，親要素のpタグまで取得してしまうので，tag.Id <> displayTagIdでこれを避けています。
　もちろん，子要素のNameを親タグのIdと別にして，onClickの引数を１つ増やすのもいいと思います。
AWS Batch FargateとStepFunctionsのメモ

メモ

![](https://i.imgur.com/mhxmSd6.jpg)

test

[AWS Protonのメモ](https://qiita.com/sunakan/items/b1c1dadf7a86b12a2ad9)

[特定のS3の特定のディレクトリ以下だけ読み書き可能なIAMポリシー](https://qiita.com/sunakan/items/1f9d437e1e2c74c0b91f)
Raspberry pi pico x ubuntu18.04 C環境構築

#Raspberry pi pico ubuntu18.04 C環境構築
![Et_XazeU0AAdZ2K.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253609/11cfa30c-6b81-53f6-4a54-588568f96d4d.jpeg)

* Ubuntuで完結
 * WindowsやWSLは使わない
　
<br>
  
* C言語用環境
 * MicroPythonは使わない

* 範囲
    * Lチカとその改変プログラムまで


## 参考文献
基本的にこの内容に沿って行っていく
https://datasheets.raspberrypi.org/pico/getting-started-with-pico.pdf
（2.1章からはじめるよ！）

## 環境つくる
### 1. 適当なワークスペースにて作業ディレクトリを作る
（本家はホームディレクトリに作るようになってるけど無視する（無視しても良い））

```
$ mkdir pico
$ cd pico
```

### 2. 開発環境とサンプルを取ってくる 
```
$ git clone -b master https://github.com/raspberrypi/pico-sdk.git
$ cd pico-sdk
$ git submodule update --init
$ cd ..
$ git clone -b master https://github.com/raspberrypi/pico-examples.git
```

### 3. Toolチェインを揃える
下記に記す本家では cmake のバージョンでエラーが発生するので別途 cmake をインストールする必要がある
（下記コマンドも実行しておく）

```
$ sudo apt update
$ sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi build-essential
```

#### 3.1 OpenSSL ライブラリのインストール
pico で使用する cmake 3.12 以降のメイクインストールに必要となるためインストールする

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

#### 3.2 cmake をインストールする
古い cmake をアンインストールしておく
（3.12以降なら良いっぽい）

version 確認方法

```
$ cmake --version
```

アンインストール

```
$ sudo apt remove cmake
``` 

git から cmake 持ってくる

```
$ git clone https://github.com/Kitware/CMake
```

インストール（時間かかる）

```
$ cd CMake
$ ./configure
$ sudo ./bootstrap && make && sudo make install
```

version 確認

```
$ cmake --version
 cmake version 3.20.20(ry
```

### 4. 開発環境の構築
ドットを忘れるな（メモ書き）

```
$ cd pico-examples
$ mkdir build
$ cd build
$ export PICO_SDK_PATH=../../pico-sdk
$ cmake ..
```

### 5. 既存Lチカのビルド
```
$ cd blink
$ make -j4
```
ディレクトリ構成がややこしいがこの blink は
> pico/pico-examples/build/blink 

であるが、コンパイルされるファイルは
> pico/pico-examples/blink/blink.c

である

### 6. pico にファイルを送る（そのまま実行される）
BOOTSEL ボタンを押したまま USB を接続することでメモリとして認識される
>/media/(user name)/RPI-RP2

としてマウントされるのでファイルをここに投げる

```
$ pwd 
 /home/(user name)/works/pico/pico-examples/build/blink
$ cp blink.uf2 /media/(user name)/RPI-RP2/
```
Lチカを確認する

### 7. 既存のLチカを改変する
バックアップ

```
$ pwd
 /home/(user name)/works/pico/pico-examples/blink
$ cp blink.c blink.c_old
```

ファイル内容を以下に変更くコ:彡

``` blink.c
#include "pico/stdlib.h"
 
int main() {
  const uint LED_PIN = 25;
  gpio_init(LED_PIN);
  gpio_set_dir(LED_PIN, GPIO_OUT);
  int i1, i2, i3;

  while (true) {
    for (i1 = 0; i1 < 10; i1++) {
      for (i2 = 0; i2 < 10; i2++) {
        for (i3 = 0; i3 < 10; i3++) {
          if (i1 < i3)
            gpio_put(LED_PIN, 1);
          else
            gpio_put(LED_PIN, 0);
          sleep_ms(1);
        }
      }
    }
  }
}
```

5.既存Lチカのビルド
6.pico にファイルを送る（そのまま実行される）
を実行するとLチカの光り方が変わるよ

####謝辞
cmake 助けてくれてありがとう
[Rubocop] Railsコードチェック　修正のやり方

Rubocopが準備されていることを前提とします。

#1 自動で修正できるものはしてもらう

```
$ rubocop --auto-correct
```

上記を実行して警告がたくさんある場合（２０〜30個以上を目安）は `rubocop --auto-gen-config` を実行して `.rubocop_todo.yml` を作成し、そこに全ての警告を移します。移すことでいったん警告は無視されます。
警告がそんなに多くない場合は `3 の警告を修正する` を繰り返していきます。

```
$ rubocop --auto-gen-config
```

#2 `.rubocop_todo.yml` 内の警告を順番に修正する
`.rubocop_todo.yml` の一番上の警告をコメントアウトします。

#3 警告を修正する。
以下を実行して警告を読み、修正します。
わからない場合は、警告をコピペしてググるといいです。

```
$ bundle exec rubocop
```
特定のファイルを今後警告されたくない場合は, `.rubocop.yml` に設定を追加していきます。

#4 コメントアウトした警告を削除する
修正して警告が出なくなったらコメントアウトした箇所を削除します。

#5 警告がなくなるまで修正する
2 ~ 4 を繰り返して警告がなくなるまで修正します。

#6 テストがある場合はテストを走らせる
そうだ、SQLを勉強しよう⑧

#はじめに
関数、たくさんあるけど、表計算みたいでいい感じ！でも、引数は正しく覚えないといけないことを実感しました。

##関数

###四捨五入したい

```sql
ROUND(数値を表す列, 有効とする桁数)
```
####ポイント
第2引数の値が、どの桁を指しているかを理解すること。

例えば、
「1192.638」という数字があったとして、

```sql
ROUND(1192.638, ここに入る数値)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/741816/7d67d788-1169-e749-f5fd-8ca4f801e961.png)
`ここに入る数値`は上の画像のように対応しています。
0が入れば、小数第一位を四捨五入して、1193になり、
1が入れば、小数第二位を四捨五入して、1192.6になり、
2が入れば、小数第三位を四捨五入して、1192.64になり、
-1が入れば、一の位を四捨五入して、1190になり、
-2が入れば、十の位を四捨五入して、1200になり、
-3が入れば、百の位を四捨五入して、1000になります。

※ちなみに、0(小数第一位を四捨五入したい)のときは、省略することも可能です。

```sql

ROUND(1192.638)
-- =>1193
```
---
###四捨五入せず、切り捨てたい

```sql

TRUNC(数値を表す列, 有効とする桁数)
```

例)

```sql

TRUNC(1192.638, 2)
-- =>1192.63
-- 小数第三位以下を切り捨て
```

桁の考え方はROUNDと同じです。
四捨五入のときは、第2引数に入っている桁を四捨五入しましたが、
TRUNCでは、その桁を含めて、以下切り捨てといった感じです。

##最後に
今回は、第2引数の値が、何を指しているのかが、ポイントでした。意識しないと、少しややこしい感じがしました。
Swiftで「プレゼント・デイ、プレゼント・タイム」をやる

# なにそれ

**Rain**のオープニング
<https://www.youtube.com/watch?v=Hp5kUmni5Dk&t=2s>

これをやってみたかった。

## 問題

「1文字ずつ出力する」という実装を検索してみたが、思ってたような結果が出てこなかったり、「これか？？」というものも単純で簡単な実装では済まなさそうだった。うーん。。

## ライブラリを使う

**[iOS]お手軽にノベルゲーム風UIを作成できるライブラリSRGNovelGameTextsの紹介**
<https://qiita.com/kazu0620/items/33e7459388ed6c9f8de7>

書かれた（作られた？）時期が古いせいか、記事の通り書いてもうまくいかないことがいくつかある（バージョン指定した`pod install`とかオプションの引数とか）が、こちらの記事を参考にするとうまくいく。

**【Swift】ノベルゲームっぽく文字を表示するライブラリ**
<https://qiita.com/HarukaNishiyama/items/8e957ffb2baaaacbede4>

あとは……ない。
その他のオプションを使った実装をいくつか検索してみたが見つからなかった。

## 実装してみる

とりあえずこうなった。

```swift:ViewController.swift
import UIKit
import SRGNovelGameTexts

class ViewController: UIViewController {
    
    let PresentDay = SRGNovelGameTexts()
    let PresentTime = SRGNovelGameTexts()

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // プレゼント・デイ
        PresentDay.frame = CGRect(x: 40, y: 300, width: 200, height: 100)
        PresentDay.textColor = UIColor {_ in return #colorLiteral(red: 0.9372549057, green: 0.3490196168, blue: 0.1921568662, alpha: 1)}
        PresentDay.stringDisplaySpeed = 0.2
        PresentDay.font = UIFont(name: "HiraginoSans-W7", size: 20)
        
        self.view.addSubview(PresentDay)
        PresentDay.setText("プレゼント・デイ")
        
        // プレゼント・タイム
        PresentTime.frame = CGRect(x: 170, y: 360, width: 200, height: 100)
        PresentTime.textColor = UIColor {_ in return #colorLiteral(red: 0.9372549057, green: 0.3490196168, blue: 0.1921568662, alpha: 1)}
        PresentTime.stringDisplaySpeed = 0.2
        PresentTime.font = UIFont(name: "HiraginoSans-W7", size: 20)
        
        self.view.addSubview(PresentTime)
        PresentTime.setText("プレゼント・タイム")
    }

    @IBAction func startButton(_ sender: Any) {
        
        PresentDay.startDisplayingText()
        PresentDay.onAllTextDisplayed = PresentTime.startDisplayingText
    }
}
```

ボタンを押したら発動する。
表示する場所などは適当。[#colorLiteral ではオレンジ色っぽいのを指定している](https://qiita.com/antk/items/a7700e3d956a7a6f0ba4)。

――で、こうなる。

![4286218f30b96decf91d759eb221b0bf.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413699/d5b6b847-939a-6a26-0088-ff9d23ca0a92.gif)

遅延処理とかフォントとか "■" とか至らない点がめちゃくちゃある。
あまり自由度はないかもしれないので、こういうことがやりたければもっときちんとした実装をしたほうが良さそうですね。
Ubuntu for Japanese Users #2

# Ubuntu for Japanese Users #2
at 2021-02-12

# ブラウザとメーラー
[Mozilla](https://www.mozilla.org/ja/)のFirefoxとThunderbirdが標準で入っています。

ブラウザは、[Google Chrome](https://www.google.com/intl/ja_jp/chrome/)、[Microsoft Edge](https://news.mynavi.jp/article/20201124-1512076/)、[Brave Browser](https://brave.com/ja/)、[Vivaldi](https://vivaldi.com/ja/download/)など、問題なく動作します。お好みのものを入れましょう。
今は、ブラウザにブックマークやパスワードの同期機能がついているものが増えています。またアドオンなどでもそういった機能が揃いますね。
アカウントに紐つけておいて、同じ環境をPCやスマホで同期できるのは、大変便利です。

---
# クリップボード

いつもお世話になってるxclipをインストール

```
sudo apt install xclip
```

読み込み先を明示的に指定するalias

```
alias myclip='xclip -selection clipboard'
```

端末で、

```
myclip file
```

などとして、クリップボードに読み込めます。

---
# カーネルを新しいものにしたい場合
Ubuntu 20.10では5.8系がインストールされていますが、もし、より新しいカーネルを試したい場合、5.10系までなら、mainlineというGUIのあるアプリもあります。
ただ、めったに使うことはありませんので、手動でも良いかと思います。

また正式リリース前の5.11系を試したい場合には、手動でパッケージをダウンロードするか、時間はかかりますが、自分でビルドすることになるかと思います。

---
[カーネル更新用スクリプト](https://github.com/pimlie/ubuntu-mainline-kernel.sh)

[mainline(GUI)](https://ubuntuhandbook.org/index.php/2020/08/mainline-install-latest-kernel-ubuntu-linux-mint/)

[カーネル更新、コマンドライン](https://sypalo.com/how-to-upgrade-ubuntu)

[カーネルの更新の概略](https://itsfoss.com/upgrade-linux-kernel-ubuntu/)

[カーネル更新ツールの紹介](https://www.linuxuprising.com/2018/10/2-utilities-to-install-latest-kernel-in.html)

mainlineアプリはGUIがありますが、古いバージョンも含めて、カーネルの一覧を取得するので、そこに時間がかかります。
Ubuntu for Japanese Users


# Ubuntu for Japanese Users #1

at 2021-02-12

# はじめの第一歩

[Ubuntu 20.10](https://jp.ubuntu.com/)をインストールしました。
インストーラーは日本語対応しています。[kernel](https://kernel.org)は5.8系。
オフィスアプリは、libreOfficeが最初からインストールされています。

Ubuntuのインストーラーのできは、素晴らしいと思います。

---
# パッケージの更新
インストール直後に一回、更新しておきます。

```
sudo apt update
sudo apt upgrade
```

# 日本語入力の設定

fcitxのインストール
```
sudo apt install fcitx-mozc --install-recommends fcitx-tools fcitx-m17n
```

設定画面で、地域と言語を選び＋ボタンを押して、日本語(mozc)を追加します。
その次に、インストールされている言語の管理を押して、キーボード入力に使うIMシステムをfcitxにします。

fcitxの起動
```
fcitx -r
```
fcitxが起動されたら、設定の入力ソースの確認を行います。
mozcが加わっていることを確認できたら、
入力ソースの設定を行います。

```
im-config
```
で、はいを選びながら、選択画面が出てきます。
fcitxを選んで、はい、で終了させます。

最後に、fcitxの自動起動を設定します。
自動起動するアプリケーションが、アクティビティのすべてのアプリの中にあるので、立ち上げます。その中に、im-launchという項目があるので、編集します。
im-launch trueとなっている部分をim-launch fcitxと書き換えましょう。

最後に、いろいろなアプリケーションで日本語入力ができるように、dot file２つも編集しておきます。

.xprofile
```.xprofile
export LANG="ja_JP.UTF-8"
export XMODIFIERS="@im=fcitx"
export XMODIFIER="@im=fcitx"
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export DefaultIMModule=fcitx
```

.pam_environment
```.pam_environment
GTK_IM_MODULE DEFAULT=fcitx
QT_IM_MODULE  DEFAULT=fcitx
XMODIFIERS    DEFAULT=\@im=fcitx
```

---
# swapfileの修正
起動時にswapfileが読み込めずエラーとなっていました。
swapfileを作り直しましょう。以下の例はサイズを8Gで設定しています。 

```sh
sudo swapoff /swapfile
sudo truncate -s 0 /swapfile
sudo chattr +C /swapfile
sudo btrfs property set /swapfile compression none
sudo fallocate -l 8G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
```
または
```sh
sudo swapoff /swapfile
sudo rm /swapfile
sudo btrfs filesystem mkswapfile --size 8G /swapfile
sudo swapon /swapfile
```

---
# 起動時のエラー修正
initramfs unpacking failed: Decoding failed というエラーが出ていました。
起動時間短縮のため、カーネルは圧縮されているのですが、形式がlz4だとバグで起動時にエラーが出るようです。起動自体はするので、問題ないのかもしれません。
念の為、昔ながらのgzipまたはlzopに変更しておきます。

次のファイルのCOMPRESS行を変更します。
/etc/initramfs-tools/initramfs.conf 
```
COMPRESS=lzop
    または
COMPRESS=gzip
```

忘れないうちに、カーネルのローダーを再生成します。
```
sudo update-initramfs -u
```
jupyter notebook

# ショートカット一覧
## コマンドモード
### よく使うショートカットキー


|キー|説明|
|---|---|
|a|上にセルを追加|
|b|下にセルを追加|
|m|markdown入力|
|y|code入力|
|dd|セル削除|
|00|Kernelリスタート|



## ヘルプ画面のショートカット全一覧

Command Mode (press Esc to enable)
F
: find and replace
Ctrl-Shift-F
: open the command palette
Ctrl-Shift-P
: open the command palette
Enter
: enter edit mode
P
: open the command palette
Shift-Enter
: run cell, select below
Ctrl-Enter
: run selected cells
Alt-Enter
: run cell and insert below
Y
: change cell to code
M
: change cell to markdown
R
: change cell to raw
1
: change cell to heading 1
2
: change cell to heading 2
3
: change cell to heading 3
4
: change cell to heading 4
5
: change cell to heading 5
6
: change cell to heading 6
K
: select cell above
Up
: select cell above
Down
: select cell below
J
: select cell below
Shift-K
: extend selected cells above
Shift-Up
: extend selected cells above
Shift-Down
: extend selected cells below
Shift-J
: extend selected cells below
Ctrl-A
: select all cells
A
: insert cell above
B
: insert cell below
X
: cut selected cells
C
: copy selected cells
Shift-V
: paste cells above
V
: paste cells below
Z
: undo cell deletion
D,D
: delete selected cells
Shift-M
: merge selected cells, or current cell with cell below if only one cell is selected
Ctrl-S
: Save and Checkpoint
S
: Save and Checkpoint
L
: toggle line numbers
O
: toggle output of selected cells
Shift-O
: toggle output scrolling of selected cells
H
: show keyboard shortcuts
I,I
: interrupt the kernel
0,0
: restart the kernel (with dialog)
Esc
: close the pager
Q
: close the pager
Shift-L
: toggles line numbers in all cells, and persist the setting
Shift-Space
: scroll notebook up
Space
: scroll notebook down
Edit Mode (press Enter to enable)
Tab
: code completion or indent
Shift-Tab
: tooltip
Ctrl-]
: indent
Ctrl-[
: dedent
Ctrl-A
: select all
Ctrl-Z
: undo
Ctrl-/
: comment
Ctrl-D
: delete whole line
Ctrl-U
: undo selection
Insert
: toggle overwrite flag
Ctrl-Home
: go to cell start
Ctrl-Up
: go to cell start
Ctrl-End
: go to cell end
Ctrl-Down
: go to cell end
Ctrl-Left
: go one word left
Ctrl-Right
: go one word right
Ctrl-Backspace
: delete word before
Ctrl-Delete
: delete word after
Ctrl-Y
: redo
Alt-U
: redo selection
Ctrl-M
: enter command mode
Ctrl-Shift-F
: open the command palette
Ctrl-Shift-P
: open the command palette
Esc
: enter command mode
Shift-Enter
: run cell, select below
Ctrl-Enter
: run selected cells
Alt-Enter
: run cell and insert below
Ctrl-Shift-Minus
: split cell at cursor(s)
Ctrl-S
: Save and Checkpoint
Down
: move cursor down
Up
: move cursor up
Code Formula 2014 本選 D - 映画の連続視聴　の解説！

DP苦手な水コーダーがはまったので、ざっと解説を書いておきます。
問題のリンクは[こちら](https://atcoder.jp/contests/code-formula-2014-final/tasks/code_formula_2014_final_d)です
# 解説
AC解法に辿り着くまでにいろんな誤解法を思いついたのですが、長くなりそうなのでAC解法のみ記します。

まず、次のようなDPテーブルを考えます。
$DP[i]:=時間E_i$ までの幸福度の最大値

時間$E_i$までの幸福度としているのは、
> $0 \le S_i \lt E_i \le 100000$

より、「時間$i$までの幸福度の最大値」としてしまうと状態数が多くなるからです。

(ここでは状態数を$(N=)3000$に抑えようとしています(後述))

次に、遷移の仕方について考えます。

ここでは配るDPを行うのですが、$dp[i]$から、視聴可能な映画を種類別に、同種類の映画を何個連続で見るか場合分けします。わかりにくいので入力例1で考えてみます。

```text

4
100 200 300 400
1 0 120
1 15 135
2 10 40
1 240 330
```

まず、初期状態として、時間$0$の時の幸福度の最大値は0です。
ここから配るDPをします。
この場合、映画の種類は2種類存在しています。

**type1**　　　　　　　　　　**type2**

| 開始時間 | 終了時間 |  | 開始時間 | 終了時間 |
| ----- | ------- | --- | ----- | ------- |
| 0        | 120      | |10|40|
| 15       | 135      | |
| 240      | 330      | |

ここで時間$0$直後から、**type1**または**type2**の映画を1回以上連続して視聴することを考えます。

例えば、**type2**を1回視聴すると幸福度は$(H[0]=)100$となります。

よって、$DP[0]\(\because E_0=40)$に幸福度100を配ります。

**type1**の連続視聴の回数は$0〜3$が可能性としてありますが、最適な視聴映画の選び方として貧欲法を使います。

具体的には、あらかじめ映画を終了時間で昇順にソートしておいた時に、終了時間の早い映画から順に、視聴できるならする、ということを繰り返します。これは、終了時間が早い映画を選んだ方が後に選択肢が残りやすい、と考えるとわかります。

この場合、
$0〜120$の映画を視聴する　**」**ここまでで1つ視聴済み
$↓$
$15〜135$の映画は視聴できない
$↓$
$240〜330$の映画を視聴する　**」**ここまでで2つ視聴済み
となります。
(これを全ての種類の映画について同様に行います)

よって、$dp[1]\(\because E_1=120)$に幸福度100を配り、
$dp[3]\(\because E_3=330)$に幸福度100+200を配る
と言うことを行えば良いです。

各$dp[i]$では最大値を取るようにします。

ここで、時間$E_i$から配る時に、「違う種類の映画を、混ぜて視聴する場合を考慮していない」と思うかもしれませんが、とりあえず連続して同種類の映画を視聴する場合のみに配れば、その配った先で、また別の種類の映画を視聴する場合に配ることになります。

こうすることで、連続して同種類の映画を視聴した時に生じる、幸福度の変化を一気に処理することができ(正確には累積和などを用いることで)、

DPの状態数$N$それぞれについて、

遷移に$O(N)$かかり、

合計で$O(N^2)$で解くことができます。

#感想
青diffだったので、自力で解けてもよかったが、$O(N^3)$のDP解法しか思いつかなかった。
実装では、std::mapを用いることで少し簡略化できたが、無駄な部分も多いように感じた。
[提出コード](https://atcoder.jp/contests/code-formula-2014-final/submissions/20122385)

参考になったら幸いです。
無線ネットワーク通信の規格

通信規格はそれぞれ以下。

GPS：
L1 (1575.42MHz）
L2 (1227.60MHz)
L3 (1381.05MHz)
L4 (1379.913MHz)
L5 (1176.45MHz)

Wifi（無線LAN）：
2.4GHz
5GHz

ワンセグ：
500〜700MHz



【参考情報】

GPS 一般財団法人情報通信振興会
https://www.dsk.or.jp/dskwiki/index.php?GPS

GPS FIRINO
https://www.furuno.com/jp/gnss/technical/tec_what_gps

Wifi（無線LAN） ELECOM
https://www2.elecom.co.jp/network/wireless-lan/column/wifi_column/00062/

ワンセグ time&space by kddi
https://time-space.kddi.com/ict-keywords/kaisetsu/20161121/

ワンセグ bokunimo.net
https://bokunimo.net/bokunimowakaru/std-1seg.html
指定した要素を固定する[position: sticky;]

#概要
ヘッダーを固定したい場合、`position:fixed;`を使うとすぐ実装できますが、画面途中にある要素を固定したい場合は`position:sticky;`が使うことで実装することができます。

こういうの↓
![ダウンロード (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643906/4c10ffa3-7bf8-843c-2510-46981c75fc9e.gif)

#実装
```.vue
<div class="wrapper">
    <div class="tab">
    <!--固定したい要素-->
    </div>
    <div class="pages">
    </div>   
</div>
<style>
    .tab{
        position: sticky; 
        top:0;  /*固定したい場所を指定*/
        z-index: 100; /*一番上に持ってくる*/
    }
</style>
```
親要素が自動的にコンテナとして定義される。
親要素内(今回だったらwrapper)でしかうまく作動しないので注意が必要。

#まとめ
めんどくさそうだと思ったら簡単に実装ができました。

#参考文献
[position: sticky;の仕組みや実際の使い方をやさしく解説](https://coliss.com/articles/build-websites/operation/css/css-position-sticky-how-it-really-works.html)
要素サイズの設定

#box-sizingプロパティ

paddingやborderなどで、要素が崩れることがあります。それを防ぐためには、box-sizingプロパティが有効です。

```css
* {
  box-sizing: border-box;
}
```

ちなみに「*」というセレクターは、すべての要素に適用させるという意味があります。
railsの場合application.cssに記述すると良いです。

ほとんどのビューを作るときに必要となるものだと思います。
【初学者】伝え方　〜結論から話す〜

##はじめに

現在、スクールを卒業して転職活動中です。
面接では、しっかり自分のことを伝える必要があります。
簡潔明瞭にポイントを絞って伝えることは、相手への配慮であることから、伝え方について学んだことをまとめてみました。
これは面接対策に限らず、日常の会話でも活用できることと思います。

##１、伝え方が下手とは

```
「話しているうちに、つい話が長くなってしまう」
「なんの話かわからない」
「で？」
```
「つい話が長くなる」人の話し方をもっと具体的に分析すると

```
「話している途中で、話す内容を忘れてしまう」
「脱線して、本題に戻ってこられない」
「一番重要なメッセージが何なのかポイントが絞りきれない」
```
などがある。結果として、

```
　・他者・・・伝わらない。飽きてしまう。
　・自身・・・聞き手の無関心な態度を感じ、「やっぱり自分は話し下手だ……」とますます人前で話すことが苦手になってしまう悪循環
```

これら全てを解決するコツがある。


##２、伝え下手を解消する方法

```
　　 「てっぺんのある話し方」で癖をつける
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/780845/e25eee9b-9731-26c0-9f8f-5d6dc7efe036.png" width="700px" >

```
　　＜ ピラミッドストラクチャー ＞
　　　話には結論と根拠があり、その結論を一番上に、根拠その下に並べたもの。
　　　根拠は複数あることが多いので、三角形、 つまり、ピラミッドのような形をしている.
```
このピラミッドがしっかり組めれば、話が長くなったり、伝わらなかったりすることはなくなる。

```
「これが結論です」

「理由はAでBでCだからです」

「わかった、了解」　　　
```
となる。

__①「結論」を冒頭で言うことで、最重要メッセージが伝わる。__

__【これによって生まれる効果】__
聞き手が「自ら」、話し手の話を整理しながら聞いてくれる。
__【注意点】__
理由は3つまで。
３つ以上となると、聞き手は覚えられない。加えて、最初から嫌気がさし、話を理解しようという意欲を失う。

##3、まとめ
相手に伝えるには、結論から話し、根拠を伝える。
その方法をとることで、相手が聞きやすい。
結果、印象に残りやすい話となる、
条件に合うデータの数を数えたい

この記事では条件に合うデータの数を数える方法を紹介します。

例: とあるIT企業の従業員の名前(name)とその従業員が所属している部署(department)を格納しているemployeeテーブルがあります。

|name     |department|
|---------|----------|
|佐藤 一郎|営業部    |
|鈴木 二郎|法務部    |
|高橋 三郎|開発部    |
|田中 四郎|人事部    |
|伊藤 五郎|開発部    |
|渡辺 六郎|開発部    |
|山本 七郎|総務部    |
|中村 八郎|監査部    |
|小林 九郎|営業部    |

ここで、開発部に所属している人数、営業部に所属している人数、それ以外に所属している人数を以下のような形式で求めるにはどうすればよいでしょうか?

|開発部|営業部|その他|
|------|------|------|
|3     |2     |4     |

まず第1にCOUNTを利用する方法があります。

```sql
SELECT
  COUNT(department='開発部' OR NULL) AS "開発部",
  COUNT(department='営業部' OR NULL) AS "営業部",
  COUNT(NOT department IN ('開発部', '営業部') OR NULL) AS "その他"
FROM employee;
```

COUNTはNULL以外のデータの数を数える関数です。<左辺> OR NULLは、<左辺>がTRUEの場合、評価値がTRUEになるので、COUNTの対象となります。一方、<左辺>がFALSEの場合、評価値はNULLになり、COUNTの対象にはなりません。つまりCOUNT(<左辺> OR NULL)というのは、<左辺>がTRUEの数を数えるイディオムになります。

次にSUMを使う方法も紹介します。

```sql
SELECT
  SUM(CASE WHEN department='開発部' THEN 1 ELSE 0 END) AS "開発部",
  SUM(CASE WHEN department='営業部' THEN 1 ELSE 0 END) AS "開発部",
  SUM(CASE WHEN department IN ('開発部', '営業部') THEN 0 ELSE 1 END) AS "その他"
FROM employee;
```

条件にマッチするものを1、マッチしないものを0と評価して、その合計値を求めると、条件にマッチするものが数えられるという仕組みです。

__環境情報__

この記事は以下の環境で動作確認を行いましたが、多くのRDBMSでも応用しやすい内容だと思います。

```
PostgreSQL 12.5 on x86_64-pc-linux-musl, compiled by gcc (Alpine 9.3.0) 9.3.0, 64-bit
```

なお動作確認を行うために作成したDDLは次の通りです。

```sql
CREATE TABLE employee (
  name TEXT,
  department TEXT,
  PRIMARY KEY(name)
);
INSERT INTO employee values('佐藤 一郎', '営業部');
INSERT INTO employee values('鈴木 二郎', '法務部');
INSERT INTO employee values('高橋 三郎', '開発部');
INSERT INTO employee values('田中 四郎', '人事部');
INSERT INTO employee values('伊藤 五郎', '開発部');
INSERT INTO employee values('渡辺 六郎', '開発部');
INSERT INTO employee values('山本 七郎', '総務部');
INSERT INTO employee values('中村 八郎', '監査部');
INSERT INTO employee values('小林 九郎', '営業部');
```
【初心者でもわかる】コピペで使えるアコーディオンの実装とボタンデザインパターン3選

# どうも7noteです。CSSでアコーディオンを実装するときのボタンデザイン3選

アコーディオンメニューの実装方法と、ボタンデザイン例を3つ紹介します。
それぞれ特徴の違う**基本的な方法を３つ紹介**しますので、組み合わせたりボタンの種類を変更するなどでオリジナルのデザインを作る参考になればと思います。

もちろん**コピペでそのまま使っても問題ないレベル**のものなので、用途にあわせてお使いください。

## アコーディオンの初期ソースの書き方例

###基本設定

```index.html
<dl class="acdn">
  <dt>質問１</dt>
  <dd>回答１回答１回答１回答１回答１回答１回答１回答１<br>
  回答１回答１回答１回答１回答１回答１。</dd>
  <dt>質問２</dt>
  <dd>回答２回答２回答２回答２回答２回答２。</dd>
</dl>
```

```style.css
.acdn dt {
  background: #eee;
  position: relative;
}
.acdn dt:not(:first-of-type){
  margin-top: 5px;
}
.acdn dd {
  padding-left: 10px;
  display: none;
}
```

```script.js
$(function(){
  $(".acdn dt").on("click", function(){
    $(this).next("dd").slideToggle();
    $(this).toggleClass("open");
  });
});
```

### ボタンデザイン別CSS

#### その①：プラスとマイナスで作る

```style.css
/* 「＋」と「－」で作る方法*/

.acdn dt::after {
  content: '＋';      /* 全角のプラス */
  position: absolute; /* 相対位置とする */
  top: 50%;           /* 上から50%の位置に指定 */
  right: 10px;        /* 右から10pxの位置に指定 */
  transform: translateY(-50%); /* 要素の半分だけ高さを上にずらす */
}
.acdn dt.open::after {
  content: '－';      /* 全角のマイナス */
}
```

**結果**
![sample01.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/87b687c4-e4f7-91c5-f060-c7587dc66a05.gif)



#### その②：三角を回転させる方法
```style.css
/* 「▼」で作る方法*/

.acdn dt::after {
  content: '▼';      /* 下向きの三角 */
  position: absolute; /* 相対位置とする */
  top: 50%;           /* 上から50%の位置に指定 */
  right: 10px;        /* 右から10pxの位置に指定*/
  transition: .3s;    /* アニメーション時間を0.3秒に指定 */
  transform: translateY(-50%); /* 要素の半分だけ高さを上にずらす */
}
.acdn dt.open::after {
  transform: translateY(-50%) rotate(60deg); /* ずらしたのはキープしたまま回転させる */
}
```

**結果**
![sample02.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/ccd4debb-6ff8-0129-25a9-b103047386a7.gif)



#### その③：スラッシュ２つを組み合わせた矢印で作る方法
```style.css
/* 「／」と「＼」で作る方法*/


.acdn dt::before,
.acdn dt::after {
  position: absolute; /* 相対位置とする */
  font-size: 10px;    /* 適度な大きさにする */
  top: 50%;           /* 上から50%の位置に指定 */
  transform: translateY(-50%); /* 要素の半分だけ高さを上にずらす */
  transition: .3s;    /* アニメーション時間を0.3秒に指定 */
}

.acdn dt::before {
  content: '＼';      /* 全角の逆スラッシュ */
  right: 18px;        /* 右から18pxの位置に指定*/
}
.acdn dt::after {
  content: '／';      /* 全角のスラッシュ */
  right: 10px;        /* 右から10pxの位置に指定*/
}

.acdn dt.open::before {
  right: 10px;        /* 右からの位置をafterと入れ替える */
}
.acdn dt.open::after {
  right: 18px;        /* 右からの位置をbeforeと入れ替える */
}
```

**結果**
![sample03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/8f0a5c8c-11ff-89db-1ae1-35e49f3c6ce9.gif)


## まとめ

どの方法でも大体のアコーディオンメニューで使えるような設計にしております。
表示位置などは微調整してお使いください。

小さなところですが、小さなところまでこだわって作っているサイトってかっこいいですよね！あこがれますし、そういうサイトを作りたいなって思います。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
Javaでビンゴマシーン作ってみた

<h1>目的</h1>
　本記事の目的はビンゴマシーンの作成です。
数の出る規則性はJava.util.Randomをそのまま使います。
しかし、これだけでは同じ数が数回表示されてしまうのでそういった点を工夫しました。

下記にソースコードがあります。
https://github.com/T1210Taichi/BingoMachine.git
Pythonでローカルファイルを扱うときはpathlibを使うとイイ

Pythonでローカルのテキストや画像を開く方法の備忘録です。

### 環境
* Mac Catalina
* Anaconda
* Jupyter Note

### pathlibのPathを使う
<b>/</b>や<b>¥</b>の違いを吸収してパスを生成してくれるようです。

### ローカルのテキストを開く
```python
from pathlib import Path
file = Path('/Users/ユーザ名/Documents/dev/python-benkyo/txt')
file = file / 'test.txt'        #「パス / ファイル名」でパスにファイル名を追加できる
with open(file) as f:
    print(f.readline())
```
ディレクトリパスにファイル名を追加するときも、パス「/」ファイル名で追加できるので便利そうです。

### 結果
```
テストファイルの中身
```
UFT-8の文字コードなら日本語も問題なさそうです。

### ローカルのJPG画像を開く
画像はPILのImageを使用します。

```python
from pathlib import Path
from PIL import Image
file = Path('/Users/ユーザ名/Documents/dev/python-benkyo/img')
file = file / '001.jpg'
im = Image.open(file)
im.show()
```
im.show()でMacのプレビューが立ち上がり、画像が表示されます。

以上です。
MacにJupyter Notebookをインストールする

Jupyter Notebookインストールしたときの備忘録です。

インストールにAnacondaを使います。選んだ理由は下記の通りです。
* インストールが楽で早い
* 必要なライブラリ一式もインストールされる
* Condaで仮想環境が作られる
上記の点が良いと思いました。

## ダウンロードとインストール
[Anacondaダウンロードページ](https://www.anaconda.com/products/individual#macos)
上記の Download-> OSとインストーラを選ぶ。

ぼくはGraphical Installerを選んだので「Anaconda3-2020.11-MacOSX-x86_64.pkg」というPKGファイルからインストールしました。
インストールが完了したら「Anaconda Navigator」からAnacondaを起動します。

Jupyter NotebookをLunchすると起動します。
（ローカルサーバが建てられ、ブラウザ上で動きます。）

右上の新規->Python3から新しいノートブックを作成できます。

## 

セルにコードを書いて、`command+Enter`で実行できます。
JDK 1.0 (Java 1.0.2) を入手したので、GitHub に置いておきました。

（この記事は [地平線に行く](https://yujisoftware.hatenablog.com/entry/2021/02/12/225501) とのマルチポストです）

JDK 1.0 (Java 1.0.2) を入手したので、GitHub に置いておきました。
https://github.com/YujiSoftware/JDK1.0

なんと、Windows 10 上でも動きます。
あと、[src.zip も展開して置いた](https://github.com/YujiSoftware/JDK1.0/tree/master/src) ので、GitHub 上で読めます。

Java 考古学者のみなさま、ぜひご活用ください！

# 入手の経緯

前々から Java 1.0 を触ってみたいなーと思っていたのですが、Oracle の [Java Archive](https://www.oracle.com/jp/java/technologies/oracle-java-archive-downloads.html) にはなぜか Java 1.1 以降しか置いてありませんでした。
 
ところが、最近になってぐぐってみたら Reddit にこんな書き込みがあるのを発見しました。

> On archive.org, I found [Java Starter Kit 1.1 + JDK 1.0](https://archive.org/details/javastarterkitjdk1.0), which is a disc image of a CD that accompanied a book, and apparently includes JDK 1.0. I haven't check it myself though. It looks like you'll need something that can read an MDF file to view the disc image.
> [Download of Java 1.0.2 : java](https://www.reddit.com/r/java/comments/eqm3sh/download_of_java_102/)

この書き込みに沿って、Internet Archive からイメージファイルをダウンロードし、展開したところ無事に Java 1.0 を入手できました。

# 再配布していいの？

展開したファイルの COPYRIGHT を読むとこんな記載がありました。

>  Sun grants to you ("Licensee") a non-exclusive, non-transferable license to use the HotJava and Java binary code versions (hereafter, "Binary Software") without fee.  **Licensee may distribute the Binary Software to third parties provided that the copyright notice and this statement appear on all copies.**
> 
> Sun は、Hot Java および Java のバイナリコードバージョン（以下、「バイナリソフトウェア」）を無料で使用するための非独占的で譲渡不可能なライセンスをお客様（「ライセンシー」）に付与します。**ライセンシーは、著作権表示とこの声明がすべてのコピーに記載されている場合に限り、バイナリソフトウェアを第三者に配布することができます。**
> 
> [JDK1.0/COPYRIGHTon GitHub](https://github.com/YujiSoftware/JDK1.0/blob/master/COPYRIGHT)


ということで、COPYRIGHT を含めれば[^copyright]再配布しても問題ないようです。

[^copyright]: 著作権表示は COPYRIGHT の冒頭に記載されています。
Qiskit.aquaでQAE3分間クッキング

# Qiskit.aquaでQAE3分間クッキング

過去記事　[Qiskit.aquaでお手軽に増幅演算子Qを作る](https://qiita.com/notori48/items/51ba10ac1374b095e7af)
を更にライブラリ活用で簡単にしました。
**たぶんこれが一番早いと思います。**


# 回路作る
```python
from qiskit import QuantumCircuit
from qiskit.aqua.algorithms import Grover, QPE
from qiskit.circuit.library import ZGate, RYGate, CZGate
from qiskit.extensions import UnitaryGate
from qiskit.circuit.add_control import add_control
from qiskit.tools.visualization import plot_histogram
from qiskit import Aer, execute
from qiskit.aqua import QuantumInstance
import numpy as np
```

増幅演算子はGroverアルゴリズムのライブラリに作らせます。

```python
nqubit = 3
# the state we desire to find is '011'
good_state = ['011']

# specify the oracle that marks the state '011' as a good solution
oracle = QuantumCircuit(nqubit)
oracle.z(0)

state_preparation = QuantumCircuit(nqubit, name='State preparation')
state_preparation.h([1,2])
state_preparation.x(2)
state_preparation.ccx(2,1,0)
state_preparation.x(2)

# define Grover's algorithm
grover = Grover(oracle=oracle, good_state=good_state, state_preparation=state_preparation)

```

QAE回路です。

```python
from qiskit.aqua.algorithms import AmplitudeEstimation
num_eval_qubits = 3
QAE = AmplitudeEstimation(num_eval_qubits, state_preparation=state_preparation, grover_operator=grover.grover_operator, quantum_instance=Aer.get_backend('qasm_simulator'))
```

終わりました。

#実行

`QAE.construct_circuit().draw('mpl')`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878664/1c9a1ac7-e1e2-09df-7499-f95194f85022.png)


```python
result = QAE.run()
result.a_estimation
```

`0.1464466`

過去記事([Qiskit.aquaでお手軽に増幅演算子Qを作る](https://qiita.com/notori48/items/51ba10ac1374b095e7af))と一致してます。


# 結論

- aquaのライブラリでQAEが使える。日本語の解説記事はたぶんこれが始めてだと思います。
- どう考えても原理分かってないと使えない。(state preparationって？Grover演算子って？)
warning ../../package.json: No license field

#はじめに
rails s を実行するといつからかずっと出ているな・・・
ほっといても問題ないし、いいのかな・・・
ちょっと待ってください！!

warning ../package.json: No license fieldが
起こる理由にもよりますが、herokuへのデプロイができない可能性もあるので
表示が出たのであれば、すぐに対応した方がいいみたいです！！
（この場合でもlocalのrails s 実行でのサーバーは起動する。）

#前提
warning ../package.json: No license fieldに対して
以下の対応のいずれかを行っているが、エラー表示が消えない場合
についての対処方法を本記事では述べています。

①package.jsonに適切なlicenseをセットしている。
②package.jsonに"license": "UNLICENSED"をセットしている。

```package.json

{
  "name": "praise",
  "license": "UNLICENSED",
  "private": true,
  "dependencies": {
    "@rails/actioncable": "^6.0.0-alpha",
    "@rails/activestorage": "^6.0.0-alpha",
    "@rails/ujs": "^6.0.0-alpha",
    "@rails/webpacker": "4.3.0",
    "bootstrap": "^4.6.0",
    "chart.js": "^2.9.4",
    "chartkick": "^3.2.1",
    "jquery": "^3.5.1",
    "popper.js": "^1.16.1",
    "turbolinks": "^5.2.0"
  },
  "version": "0.1.0",
  "devDependencies": {
    "webpack-dev-server": "^3.11.2"
  }
}

```

#バージョン
rubyのバージョン　ruby-2.6.5
Railsのバージョン Rails:6.0.0

#結論
rm -rf yarn.lockを実行し、yarn.lockのコンフリクトを解消することでエラーが解消されました。

```
$ rm -rf yarn.lock
```

#具体的に言うと
yarnインストールを複数回行い、依存関係にあるyarnインストールした内容をrm -rf yarn.lockで
削除しています。
（一度リセットしているイメージ）

#補足

warning ../package.json: No license fieldでは
ライセンスが設定されていないということなので、デバック方法として、以下の
対処方法が他記事では多く記載されています。

①package.jsonに適切なlicenseをセットしている。
②package.jsonに"license": "UNLICENSED"をセットしている。

実行してもデバックできない！なんで！？と思いました！！

適切な内容がyarn installされていない場合でも表れるエラーです。

今回はyarn installが適切に行われていないために表れたエラーの
解決方法でした。

#学び
違和感に感じたり、疑問に思ったら都度確認することが、品質を担保する上で
大切になることを学びました。

Herokuもしかりですが、都度問題をないかを確認することは重要であることを
改めて思いました。

以上です。
Google認証で取得したTokenでGoogl Photos APIを呼び出す

#はじめに
[FlutterアプリにGoogle認証を組み込む](https://qiita.com/makotomi/items/078c23a11fc0e3fe0cf3)で、FlutterアプリでGoogle認証してOpenID Tokenを取得するところまで作りました。Googleからトークンを取得しているので、Google Photos APIを呼び出してみたいと思います。

#Google Photos APIの有効化
[GCPのAPIダッシュボード](https://console.cloud.google.com/apis/dashboard)を開き、__APIとサービスの有効化__を押下します。
![API01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273926/08e906ab-a707-706a-76e6-733207ef0537.jpeg)

検索窓に__photos__と入力します。
![API02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273926/fcc72cae-f5f9-ca17-4111-fef3ed69d1f4.jpeg)

＿Photos Library API__を選択します。
![API03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273926/919d294a-2da9-7902-7531-7b32e6732e91.jpeg)

__有効にする__ボタンを押下します。
![API04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273926/9801743d-5ce2-56ec-a8bd-2a73fc5d6f27.jpeg)

以上でAPIの有効化が終了です。

#FlutterアプリからAPIを呼び出す
Google認証した結果の__GoogleSignInAccount__インスタンスを[前回の記事](https://qiita.com/makotomi/items/078c23a11fc0e3fe0cf3#flutter%E3%82%A2%E3%83%97%E3%83%AA%E3%81%B8%E3%81%AE%E8%AA%8D%E8%A8%BC%E3%81%AE%E5%AE%9F%E8%A3%85)で取得しています。__GoogleSignIn__の生成時に__Scopes__にGooglePhotosのAPI呼び出し用設定(``https://www.googleapis.com/auth/photoslibrary``)を入れているところがポイントです。__GoogleSignInAccount__インスタンスの__authHeaders__メソッドを呼び出すとGoogle APIを呼び出すための``Authorization Header``がそのまま取得できます。

以下は、Google Photosでアルバムを新規作成するコードです。__account__が__GoogleSignInAccount__のインスタンスです。__account.authHeaders__をそのまま指定するだけでAPIが呼び出せます。

``` dart
  var response =
      await http.post('https://photoslibrary.googleapis.com/v1/albums',
          headers: {
            ...await account.authHeaders,
            ...{"Content-Type": "application/json"}
          },
          body: json.encode({
            'album': {'title': 'アルバムタイトル')}
          }));
```

#まとめ
今回は非常にシンプルな記事になりました。Googleで認証さえしてしまえば、Googleの各種サービスのAPIを利用するのは非常に簡単です。

最後に、本記事も含めて連載的に記事を書いています。目次は[こちら](https://www.makotomi.com/flutter-google-firebase-aws/)です。
【Godot】UVスクロールをスクリプトだけで実装する方法

# 概要
このページでは以下のようなUVスクロールをスクリプトだけで実装する方法について書きます。
![shot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/7df2a92f-0569-5236-0f30-373274f6da2a.gif)

# UVスクロールをするスクリプト
プロジェクトを新規作成し、2Dノードを作成、名前を「Main」に変更して以下のスクリプトをアタッチします。

```gd:Main.gd
extends Node2D

# テクスチャを読み込んでおく
var tex = preload("res://icon.png")
# 時間経過で変化するUVのUの値
var time_u = 0

func _ready():
	# テクスチャリピートを有効にする
	tex.flags |= Texture.FLAG_REPEAT

func _process(delta):
	# 経過時間でUVスクロールする
	time_u += delta
	if time_u > 1:
		# 0.0〜1.0となるようにする
		time_u -= 1
	
	# _draw() を呼び出す
	update()

func _draw():
	# 左上座標
	var x = 30
	var y = 50
	
	# 画像の幅と高さ
	var width = tex.get_width()
	var height = tex.get_height()
	
	# 頂点リストを作成
	var points = PoolVector2Array()
	points.append(Vector2(x, y))
	points.append(Vector2(x+width, y))
	points.append(Vector2(x+width, y+height))
	points.append(Vector2(x, y+height))
	
	# 色を設定
	var colors = PoolColorArray([Color.white])
	
	# UVリストを作成.
	var uvs = PoolVector2Array()
	var u = time_u
	uvs.append(Vector2(u, 0))
	uvs.append(Vector2(1+u, 0))
	uvs.append(Vector2(1+u, 1))
	uvs.append(Vector2(u, 1))
	
	# ポリゴンを描画.
	draw_polygon(points, colors, uvs, tex)
```

簡単に説明すると　`_ready()` の部分で、`tex.flags |= Texture.FLAG_REPEAT` とすることでUV値を変化してはみ出した場合 (0.0〜1.0を超える値を指定した場合)に、テクスチャを繰り返して描画する設定にしています。

あとは、`_draw()` で、`draw_polygon()` を使用して、UV値をずらして描画することで、UVスクロールが実装できます。

# UVとは
UVとはテクスチャの左上を(0, 0)、右下を(1, 1)とした座標系のことです。
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/e3f7495c-5f90-0c85-1abd-a53166af6d5f.png)

左上の座標を (0, 0) 〜 (1, 0)、右下の座標系を (1, 0) 〜 (2, 0) に変化させることで、スクロール処理を実装していることとなります。

たとえば、テクスチャリピートを有効にした状態で、0.5 ずらすと以下のような状態となります。
![名称未設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/e590a1de-44df-5051-fe0c-4166aebee59d.png)
Matplotlibのスタイルシートにおけるtext.latex.preambleの書き方

# 目的
Matplotlibでは、図の体裁を制御するための様々なパラメータがありますが、それらは設定ファイルの形で一括で指定することができます。（スタイルファイルのサンプルは[公式サイト](https://matplotlib.org/stable/tutorials/introductory/customizing.html)で公開されています。）その設定項目のひとつに、`text.latex.preamble` というものがあります。ここにLaTeXパッケージ名をしかるべき書式で記述すると、それらが読み込まれた上でレンダリングが行われます。しかしながら、この項目はUNSUPPORTED扱いであり、詳しい書き方は説明されていません。（「一行で書け」とだけ注意されています。）この記事ではその書き方の例を示します。

# 環境
```
>>> conda info
          conda version : 4.5.11
    conda-build version : 3.0.9
         python version : 3.5.6.final.0
               platform : win-64
             user-agent : conda/4.5.11 requests/2.18.4 CPython/3.5.6 Windows/10 Windows/10.0.18362

>>> conda list
# Name                    Version                   Build  Channel
matplotlib                2.0.2               np112py35_0
numpy                     1.12.1                   py35_0

>>> latex --version
pdfTeX 3.14159265-2.6-1.40.16 (TeX Live 2015/W32TeX)
kpathsea version 6.2.1
```

# サンプル
matplotlibrc file (パラメータを設定するファイル)の例です。`text.latex.preamble`には、読み込みたいパッケージや自作コマンドの定義を一行で書きます。区切りは空白でもコンマでもOK。`\`のエスケープは不要です。

```sample.mplstyle
text.usetex         : True
text.latex.preamble : \usepackage{amsmath}, \usepackage{amssymb} \usepackage{physics} \newcommand{\hH}{\hat{H}} \newcommand{\hc}{\hat{c}}
```

これを用いた描画スクリプトの例です。ラベルには特に意味はありません。

```python
# -*- coding: utf-8 -*-

import matplotlib.pyplot as plt
import numpy as np

def main():
    X = np.arange(0, np.pi, 0.01)
    Y = [np.sin(x) for x in X]

    with plt.style.context('sample.mplstyle'):
        plt.figure()
        plt.plot(X, Y, label=r'$\int \dd{x} \sin x$')
        plt.xlabel(r'$\mathbb{R}, \ (x+y)^n = \sum_{i=0}^n \binom{n}{k} x^i y^{n-i}$')
        plt.ylabel(r'$\Im\ev{A}{\Psi}$')
        plt.tick_params()
        plt.title(r'$A = \begin{pmatrix} a_{11} & a_{1n} \\ a_{m1} & a_{mn} \end{pmatrix}$')
        plt.text(1.0, 0.4, r'$\hat{H} =  \sum_{p,\sigma} \qty(\frac{p^2}{2m} - \mu_\sigma)  \hc_{p,\sigma}^\dag \hc_{p,\sigma}$')
        plt.legend()
        plt.tight_layout()
        plt.savefig('demo.png')


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

実行結果です。
![demo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688573/1c536420-2245-c0a7-627f-f67e1127b6b6.png)
tail -fをログ出力プロセスの終了と同時に終了

# やりたいこと
次のシェルスクリプトにおいて、 `longjob` の終了と同時に `tail -f` を終了させたい。

```
#!/bin/bash

longjob &>log & disown
tail -f log
```

条件:

- 1つのシェルスクリプト内で行いたい。
- 端末が終了しても `longjob` は継続させたい (つまり、`& disown` は譲れない)。
- `Ctrl-c` の押下時に `tail` は終了させたいが `longjob` は終了させたくない。

# 解決策1
`tail -f` の開始前に、以下を行うバックグラウンドプロセスをあらかじめ起動しておく。

1. `longjob` が終了するまで待機。
- `tail` のプロセスを kill。

```
#!/bin/bash

longjob &>log & disown

(
    # set PID_JOB
    PID_JOB=$!

    # set PID_TAIL
    while test -z $PID_TAIL; do PID_TAIL=$(ps --ppid=$$ | grep tail | awk '$0=$1'); done

    # wait PID_JOB
    while ps -p $PID_JOB >/dev/null; do sleep 0.5; done

    # kill PID_TAIL
    kill -INT $PID_TAIL
) &

tail -f log
```

- `tail` の開始前に `PID_TAIL=$(...)` の部分が実行された場合、 `$PID_TAIL` は空文字になる。`PID_TAIL` を確実に設定するために、 `# set PID_TAIL` の部分は `while` で回している。
- 問題点: `longjob` が終了すると `kill -INT` が発砲され、`tail` が異常終了する。

# 解決策2

`tail` をバックグラウンドで一旦起動しおいて `fg` で処理を戻す。

```
#!/bin/bash -i

longjob &>log & disown
PID_JOB=$!

tail -f log &
PID_TAIL=$!

(
    # wait PID_JOB
    while ps -p $PID_JOB >/dev/null; do sleep 0.5; done

    # kill PID_TAIL
    kill -INT $PID_TAIL 2>/dev/null
) &

fg 1 >/dev/null

```

- 注意: シェバングが `#!/bin/bash -i`。
    - fg はインタラクティブシェルにおいて利用可。
    - インタラクティブシェルとしてシェルスクリプトを起動するため。
- `longjob` 終了前に `Ctrl-c` した場合に `kill` が失敗するため、エラーを捨てる。
- `fg` したときに `tail -f log` と表示されるのを防ぐため、標準出力を捨てる。

# うまく行かない方法

# tee & trap
```
# Ctrl-c で longjob が終了してしまう
longjob 2>&1 | tee log
```

```
# Ctrl-c で終了できない
trap '' 1 2 15
nohup longjob 2>&1 </dev/null | tee log
```

```
# longjob は最後まで実行されるが、Ctrl-c で teeが終了し、それ以降のログが記録されない
# longjob に "trap '' 1 2 15" を記述した上で
nohup longjob 2>&1 </dev/null | tee log
```

longjob に `trap '' 1 2 15` と `tee log` を記述した上で解決策2のようなコードを書けばできるが美しくはない。

## wait

`# wait PID_JOB` の部分を `wait $PID_JOB` とするとこうなる。

```
wait: pid 5734 is not a child of this shell
```
Python3エンジニア認定資格｜学習法

Python3エンジニア認定基礎試験に合格したので、自分なりの学習法を記録します

# 学習全体の流れ

- 色々な方の「合格体験記」に目を通す
- 公式テキスト｜Pythonチュートリアル 第3版に目を通す
- 模擬試験｜Dive into Examを解く
- 模擬試験｜Prime Studyを解く
- Google Colaboratoryに写経しまくる
- 暗記カードサービスの活用｜Quizlet

## 色々な方の「合格体験記」に目を通す

Qiitaにも勿論たくさんの記事が上がっていますが、文章だけでなく、
動画を見るという手もあります

オススメは以下の動画リストです
https://www.youtube.com/playlist?list=PLO-KH_xqEh8FHpIUXWHVJnJLXi6XO7BFE

## 公式テキスト｜Pythonチュートリアル 第3版

https://docs.python.org/ja/3/tutorial/

ザっと目を通しただけで、読み込んだりはしませんでした
個人的には、かなり内容が頭に入りづらいテキストなのではと感じていて、
初学者の方などは「さぁ、勉強頑張るぞ」と、初めの一歩にこのテキストを見ると、
いきなりモチベーションを削られてしまうのではないか、という懸念があります

## 模擬試験｜Dive into Exam

https://diver.diveintocode.jp/

本番よりも難易度が低いです
この模擬試験で たとえ満点をとっても、全く油断できる段階ではないと思うので、他の教材も進めていくことをオススメします

## 模擬試験｜Prime Study

https://study.prime-strategy.co.jp/#exam-list

「模擬試験｜Dive into Exam」より難しく、本番の難易度に近いです
3回分用意されていますが、同じような問題が少しずつ内容変更されながら、毎回出題されているので、それらを見比べて差分に注目すると、問題の要点が掴みやすいのではないかと思います

## 写経｜Google Colaboratory

上記の模擬試験に出てきたコードを、Colaboratoryにボンボンつっこんで、
自分なりに編集してみるのをオススメします

個人的には、プログラミングのコードを「眺めて」いても、身につけるのは困難で、
「手に覚えさせる」のが一番効果的なのではないかと考えています

## 暗記カードサービスの活用｜Quizlet

https://quizlet.com

「〇〇するためのモジュールは何か」的な問いは、「手で覚える」ものではないと思うので、
Web上で暗記カードが作成できる「Quizlet」を活用して、暗記しました
PCでもスマホでも使えるので、オススメです

# まとめ

上記をまとめると、合格体験記事と、模擬試験２つから例題をかき集めて、
Colaboratoryにつっこんで、自分なりにいじりまくり、
暗記カードで暗記していけば多分 受かる、ということになります

少しでも参考になれば幸いです
Classic ASPでファイルアップローダーを作る

## やりたいこと
Classic ASPでファイルアップローダーを作る。

## BASP21ライブラリなしでできないか？
[こちらのサイト](http://uyan39.hatenablog.com/entry/20120905/1346866787)に解説がありました。
送信されたバイナリの改行コードからフォーム情報を特定する方法でした。

フォーム項目が多いほど、改行位置からの特定が難しくなるのでBASP21を使った方が適切だと思います。

## 環境・ツール
* Windows Server 2016
* IIS
* VBScript
* [BASP21](http://www.hi-ho.ne.jp/babaq/basp21.html)

## BASPのダウンロード・インストール
[BASP21](http://www.hi-ho.ne.jp/babaq/basp21.html)の`Down Load! Bsmtp20070629-587.lzh(119KB)`からダウンロード

## 実装

```html:送信フォーム
<%@ Language=VBScript %>
<%

%>
<html>
<body>
    <form method="POST" ENCTYPE="multipart/form-data" >
        <input type=file  name=img accept="image/*" >
        <br>
        <input type=submit formaction=test_basp.asp>
    </form>
</body>
</html>

```

```vb:受け取りサーバ
<%@ Language=VBScript %>
<%
dim total_bytes

' 1.総バイト数を読み込み
total_bytes = Request.TotalBytes
response.write("totalbytes:" & total_bytes & "<br>")

' 2.basp objを宣言
Set bobj = Server.CreateObject("basp21")

' 3.バイナリ読込
barray = Request.BinaryRead(total_bytes)

uploadDir = "D:\~~\dir\" ' サーバの保存先パスを指定する
filename = bobj.FormFileName(barray,"img")

' 4.サーバに保存
wblen = bobj.FormSaveAs(barray,"img",uploadDir & filename)
response.write("wblen:" & wblen & "<br>")

%>
```

### 解説

#### 1.総バイト数を読み込み
`Request.TotalBytes`でフォームから送信された**総バイト数を取得**します。
その下の`Response.Write(...`は取得した総バイト数を表示しているだけです。

#### 2.basp objを宣言

BASP21オブジェクトを作ってます。

#### 3.バイナリ読込
`barray = Request.BinaryRead(total_bytes)`で総バイト数を引数にして全バイナリを`barray`に読み込みます。
`bobj.FormFileName(barray,"img")`で`img`というnameのフォームのバイナリを取得します。

#### 4.サーバに保存
`bobj.FormSaveAs(barray,"img",uploadDir & filename)`でサーバにバイナリデータをファイルとして保存します。
1つ目の引数`barray`・・・全バイナリデータ（barray）から探す。
2つ目の引数`img`・・・name=imgのフォームのバイナリデータを取得。
3つ目の引数`uploadDir & filename`・・・uploadDirのディレクトリに、filenameの名前で保存する。

`wblen`は成功時は正の数字で書き込んだバイト数が表示されます。
マイナスの時はエラーメッセージです。[BASP21 proのメッセージリファレンス](http://www.b21soft.co.jp/basp21/basp21pref.html#msglist)から内容確認できます。


### 備考
`ENCTYPE="multipart/form-data" `を指定するとRequest.Fromで値を取得できなくなるので、`bobj.FormBinary`を使うことになります。


### よもやま話
BASP21って何だろうと思ってたんですが、babaqさんの開発されたASPコンポーネントだからBASP、21は最初はバージョン番号だったらしいですが、babaqさんが気に入ってそのままコンポーネント名になったそうです。
読み方は「ビーエーエスピー にじゅういち」が本来の呼び方らしいですが、「ばすぷにーいち」と呼ばれているそう。

出典：[Baba Centerfolds FAQ](http://www.hi-ho.ne.jp/babaq/faq.html#0007)
JAVAの条件分岐についてまとめてみた

#JAVAの条件分岐についてまとめてみた
今回はJAVAの条件分岐についてまとめてみました。
##１．IF文
```if..文
if(条件式){
　実行処理
}
```
一番シンプルなやつです！
条件式に「num > 1」みたいな式を書いて、「true」だったら処理を実行します。

```if..else文
if(条件式){
　実行処理1
}else{
  実行処理2
}
```
elseが増えましたね。
条件式が「false」だった場合は、実行処理２の方が実行されます。

```if..else.if文
if(条件式){
　実行処理1
}else if(条件式2) { 
  実行処理2
}else{
  実行処理3
}
```
また、一つ増えました。
一つ目の条件式が「false」だったら、二つ目の条件式で判定し「true」だった場合に実行処理2が実行されます。
全部「false」だった場合に、else内の実行処理3が実行されます。
elseはあってもなくてもいいです。

```:三項式
(条件式)?trueの場合の処理:falseの場合の処理;
例：
　num = (num == 2)? num + 1 : num - 1;
```
今度は短くなりました。
これは例を見たほうが早いのですが、numが2だった場合は「num + 1」が実行され、2でなければ「num - 1」が実行されます。
正直、ぱっと見で分かりずらいコードになってしまうのであまり使うのはお勧めしません。
コードを短く書かないと命に関わる場合は使った方がいいですが、他の人が見た時に直観的に分かるようにif..else文で書く方が良いかと思います。

##2.SWITCH文
```:switch文
switch (式){
  case 定数1:
    実行する文1;
    ...
    break;
  case 定数2:
    実行する文2;
    ...
    break;
}
```
switch文は渡された値や式の結果に応じ、一致するcase 定数の値の位置へ移動して処理が実行されます。

```:switch文　例
num = 2
switch (num){
  case 1:
    num++;
    break;
  case 2:
    num--;
    break;
}
```
この場合はnumが2なので、case 2の処理「num--」が実行されます。
ちなみになぜbreakが書かれているかというと、仮にnumが1だった場合に「num++」が実行されるのですが、
breakがない場合は「num--」もそのまま実行されてしまいます。
連続して動作してよい処理ならいいのですが、個別に処理を分けたい場合はbreakが必要になってきます。

```:default
switch (式){
  case 定数1:
    実行する文1;
    ...
    break;
  case 定数2:
    実行する文2;
    ...
    break;
  default:
     実行する文3；
}
```
defaultは、caseのどれにも当てはまらなかった場合に実行されます。
if文で言うとこのelseです。
どれかcaseに当てはまった場合は実行されないっす。

```:複数case
switch (式){
  case 定数1:
  case 定数2:
    実行する文1;
    ...
    break;
  default:
     実行する文2；
}
```

ちなみにこんな感じでcaseを連続させることができます。
この場合は定数１か定数２の場合に実行する文1が実行されます。

##まとめ
いかがだったでしょうか！
今回はJAVAの条件分岐についてまとめてみました。
if文はよく使うし、簡単なので覚えていきましょう。

ご覧いただきありがとうございました。
「php artisan serve」無しでLaravelを起動する※xampp

Laravelを起動する際、毎回コマンドで
`php artisan serve`
を実行していたのですが、O型の自分からすると「毎回めんどうくさいな～」
と思っていたので、少し調べてみました。

結論、httpd.confのドキュメントルート変更すればOK
`DocumentRoot "/xampp/htdocs"` ⇒ `DocumentRoot "/xampp/htdocs/プロジェクト名/public"`
`<Directory "/xampp/htdocs">` ⇒ `<Directory "/xampp/htdocs/プロジェクト名/public">`

apache再起動し[Admin]を押すと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569318/1af083a8-c4c7-f64f-e757-f766149252d4.png)
正しく表示されました、挙動も問題なし。
ラズパイ Picoを動かしてみる

#目的
2021年1月21日に、Raspberry Pi Picoが発表され話題になっていたので、早速、購入したので、触ってみます。
今までのラズパイとは違って、Linux(Raspberry Pi OSなど）は動かないそうなので、C/C++か、MicroPythonが動くそうなので、勉強中のPythonでセットアップして、触ってみる。


#環境
・ラズパイ Pico （まだ、ピンヘッダはつけてません。）
・PC Windows10



##セットアップ

見た目はこんな感じです。ラズパイ4と並べて見ました。

![pico1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689639/12e1925d-8fee-9009-93e3-3fe573f59fa8.jpeg)


まずは、MicroPythonのファームをダウンロードしておきます。
https://www.raspberrypi.org/documentation/pico/getting-started/

「MciroPython」のタブを選択して、「Download UF2 file」をクリックして、ファームウェアをPCに保存します。
![pico-python-download.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689639/a998b510-3747-db4a-dda4-7c944c4159e0.jpeg)

2月12日の時点では、こんなファイル名で、サイズは486kBです。
rp2-pico-20210205-unstable-v1.14-8-g1f800cac3.uf2


## PicoへMicroPythonを入れます
PCとPicoをUSBケーブルで接続するときは、「BOOTSEL」という白いボタンを押しながら接続します。
![pico-zoom2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689639/32783d1b-6985-2c4f-598c-da345a323534.jpeg)


そうすると、PC上にPicoが「RPI-RP2」という名前のUSBメモリとして見えます。
![USB-pico.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689639/0ea14a9d-6c58-a321-2ee2-3ad0871db53c.jpeg)

先ほど、ダウンロードしたuf2ファイルを、RPI-RP2へドラックアンドドロップで、コピーします。コピーがおわると、勝手にマウントが外れ、下記の様のメッセージがポップアップされます。

![micropython-copydone.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689639/051452eb-d338-c4fa-4a84-bbea1e8fd5c7.jpeg)


## 開発環境のThonnyをPCにセットアップ
MicroPythonの開発環境として、ThonnyをPCにセットアップします。

ここからダウンロードします。2021年2月12日時点では、v3.3.3です。
私はWindows10なので、Windowsをクリック
https://thonny.org/


インストールは言われるがままに、Nextを何回か押すと簡単にできます。
起動して、
PicoのPythonを動作させるための設定をします。「実行」- 「Select interpreter... 」を選択
![Thonny-setup1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689639/ea232aa1-e247-710c-8503-6cf7d2abe864.jpeg)


そして、下記を選択。
MicroPython (Rasberry Pi Pico)
USBシリアルデバイス (COM*)
![Thonny-setup2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689639/3be542c0-e7bd-eea8-576a-d0fbe22b02b7.jpeg)


すると、下のShellにMicroPython/Picoと表示されればOKです。
![Thonny-shell.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689639/d08faef0-dafa-173d-c446-bc3266dfc634.jpeg)

## PythonでPico上のLEDチカして見ましょう
Thonnyに、下記のコードを入力して、実行ボタンをクリックすると、LEDが点灯し、再度、実行すると、消灯します。

```python
from machine import Pin

led = Pin(25, Pin.OUT)

led.toggle()
```

![jikkou.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689639/9e3dbce2-f4df-6417-0e7a-6308f9ea921e.jpeg)


こんな感じで点灯です。

![pico-l-chika2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689639/18e10466-0ded-e87b-da09-3c36700785cb.jpeg)

#終わりに
Picoには温度センサーがついているそうです。
温度を小さいOLEDとかに表示ができると楽しいですね。