OmniAICreator/Qiita-1.07M huggingface dataset:
PyCharmでteminalを(venv)pwshにする

## TL;DR

PyCharmのteminalでterminalをpwshにしたら、venvが適用されなかったのでPowerShellのProfileを弄って解決したよ。

## アプローチ

PyCharmのterminal設定はsettingsからpwshにできるんだけど、`Activate virtualenv`にチェック入れててもvenvがアクティベートできない。
以下のコマンドを打つと`VIRTUAL_ENV`環境変数は来てるようなので、これを活用する設定をPowerShellのプロファイルに施してみる。

```shell
PS> Write-Host $env:VIRTUAL_ENV
# U:\path\to\some_venv
```

## 作業

### profileの設定

まず、`$profile`を参照して `Microsoft.PowerShell_profile.ps1` があるパスを見つける[^1]。

```shell
PS> Write-Host $profile
# U:\path\to\Microsoft.PowerShell_profile.ps1
```

そしたら適当なエディタで開いて、中身を編集する。

```shell
PS> code $profile   # VSCodeで開く
```

なかみはこんなかんじ。

```powershell
$tmp_venv = $null
if ($null -ne $env:VIRTUAL_ENV) {
    $tmp_venv = $env:VIRTUAL_ENV
    try {
        deactivate | Out-Null
    }
    catch {}
}

if ( -not ([string]::IsNullOrEmpty($tmp_venv)) -and (Test-Path -Path $tmp_venv)) {

    . (Join-Path $tmp_venv "\Scripts\Activate.ps1" )
}
```

### PyCharmの設定

- File > Settings メニュー
    - Tools > Terminal タブ
        - Application setting パネル
            - Shell pathにpwshの場所を入力（`C:\Program Files\PowerShell\7\pwsh.exe`など）
            - Activate virtualenvにはチェックをつけておく（いるかわからんけど）

### ためす

PyCharmのterminalを開いてみるとちゃんと適用できてるのがわかる。

```shell
PowerShell 7.1.0
Copyright (c) Microsoft Corporation.

https://aka.ms/powershell
Type 'help' to get help.

(some_venv) PS> 
```

[^1]: `$profile`はVSCodeで実行すると`Microsoft.VSCode_profile.ps1` (VSCodeのprofile)を返すようなので、VSCodeのPowerShell Extentionでプロファイルを探す場合には一回`powershell`(またはps coreを使ってるなら`pwsh`)を叩いてから`Write-Host $profile`叩くとよい。
【簡単】railsでbootstrapを用いたエラーメッセージを表示する

#記事投稿の背景
オリジナルサービスの投稿フォームを作成していたところ、投稿内容が空白だった場合にエラー表示をさせる方法が分からなかったが、調べてみると簡単に実装できたので共有させていただきます。

#環境
ruby 2.7.2
rails 6.1.2
bootstrap導入済み



#実装

```　ruby:views/posts/new.html.erb
<%= form_for @post do |f| %>
  <div class="field">
    <h3>新規投稿</h3>    
     <p>投稿内容：</p>
     <%= f.text_area :body %>
  </div>
  <%= f.submit "投稿する" %>
<% end %>
```

上のような投稿フォーム上で、投稿内容が空だった場合エラーメッセージを表示させます。

```　ruby:models/post.rb
belongs_to :user
#ここに追記
validates :body, presence: true

```
```validates :body, presence: true```とすることにより、空の投稿内容が認められないように設定します。


```　ruby:controllers/posts_controllers.rb
def create
    @post = Post.new(post_params)
    @post.user_id = current_user.id
    if @post.save
      redirect_to :action => "index"
    #ここに追記。エラー時に行われる処理
    else
      render action: :new
    end
　　#終了
  end
```
投稿内容が保存されなかった場合（投稿内容が空だった場合）、postsのnewでアクションが行われるように設定します。


```　ruby:views/posts/new.html.erb
<%= form_for @post do |f| %>
  # ここに追記
  <% if @post.errors.any? %>
    <div class="alert alert-danger" role="alert">投稿内容を入力してください</div>
  <% end %>
  # 終了
  <div class="field">
    <h3>新規投稿</h3>    
     <p>投稿内容：</p>
     <%= f.text_area :body %>
  </div>
  <%= f.submit "投稿する" %>
<% end %>
```
フォーム内に、```@post.errors.any?```設置することにより、エラーの時のみ中身が発火するようにします。

```<div class="alert alert-danger" role="alert">```はbootstrapで用意されたアラートのデザインです。他の色もあるので、何か処理が成功したときのアラート等にも使えます。

以上で、エラー表示を簡単に実装することが出来ました！！！

#参考記事
https://blog.yuhiisk.com/archive/2018/05/22/rails-display-error-message.html
[Swift] TableViewを下スワイプして画面を更新する（UIRefreshControl）


現在開発中のアプリでTwitterのタイムラインのような、Viewを下スワイプして中身を更新する処理を追加したいと思い調査して実装。
ヒットした記事でなかなか実装出来ず多少詰まったため、記事を書くことにしました。
この記事は筆者の半ば備忘録的な記事です。

## UIRefreshControlとは
画面を下に引っ張ってデータを更新するUI部品。
TwitterやYouTubeなどで皆さんが一度は見たことがある、あのクルクルです。
以下、Appleが提供するドキュメントから一部抜粋。

>UIRefreshControlはUITableViewやCollectionViewを含むUIScrollViewに接続できる標準的なコントロールです。

英語でじっくり読みたいって方は一番下のリンクから飛んでみてください。
要は、スクロールビューならどれでも使えるよというやつです。

## 実行環境
Xcode 12.4
Swift 5.3.2
## 実装方法
そんな難しくはなく、すぐ実装出来ます。

```swift

   @IBOutlet weak var tableView: UITableView!  //storyboardのTableViewをアウトレット接続

   override func viewDidLoad() {
        super.viewDidLoad()
        tableView.dataSource = self  //TableViewを使うなら必須の処理
        tableView.delegate = self  //TableViewを使うなら必須の処理
        configureRefreshControl()  //この関数を実行することで更新処理がスタート
    }

    //〜中略〜

    func configureRefreshControl () {  
       //RefreshControlを追加する処理
       tableView.refreshControl = UIRefreshControl()
       tableView.refreshControl?.addTarget(self, action: #selector(handleRefreshControl), for: .valueChanged)
    }
        
    @objc func handleRefreshControl() {
       /*
        更新したい処理をここに記入（データの受け取りなど）
      */

       //上記の処理が終了したら下記が実行されます。
       DispatchQueue.main.async {
          self.tableView.reloadData()  //TableViewの中身を更新する場合はここでリロード処理
          self.tableView.refreshControl?.endRefreshing()  //これを必ず記載すること
       }
    }
```

以上です。
コメントアウトで解説は書いているのでそちらを参考にしていただけたらと思います。

注意点としては.endRefreshing()を必ず書いてくださいということくらいです。

## 最後に
比較的簡単に実装出来る機能ですが、汎用性の高いUIなのかなと思います。
ぜひ、実装してみてより良いアプリ開発ライフを送っていきましょう。

ではまた。

## 参考
https://developer.apple.com/documentation/uikit/uirefreshcontrol
ffmpegで動画から静止画を書き出すバッチ

撮影した動画から連続して静止画を作る作業が出たのでバッチを作成してみた
バッチ自体は2年に1度くらいしか作らなくて書き方覚えていないので自分用メモ

```batch:mov2jpg.bat
rem 動画の場所にフォルダ作成
md %~dp1img
rem 秒間2枚画像を書き出し
%~dp0ffmpeg-N-101352\bin\ffmpeg.exe -i %1 -r 2 -f image2 %~dp1img\img%%06d.jpg
pause
```
バッチと同じフォルダ下のffmpeg-N-101352\bin\ffmpeg.exe　ffmpegを置いて
ドロップしたファイルと同じ場所にimgフォルダを作成して書き出し動作をする仕様

%~dp0：バッチのあるディレクトリ
%~dp1：ドロップしたファイルのあるディレクトリ
ffmpegの -r　オプションで秒間に書き出すレートを指定
JavaScript

# スキャナと同じ操作をjavascriptで行う方法

KeyboardEvent
キーボード入力と同じイベント発行できるメソッド

dispathEvent
あたかもイベント発行したかのように振る舞うメソッド



refs
https://ameblo.jp/personwritep/entry-12456996738.html
https://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-EventTarget-dispatchEvent


## Keydown

https://developer.mozilla.org/ja/docs/Web/API/Document/keydown_event

## createEvent

https://developer.mozilla.org/ja/docs/Web/API/Document/createEvent

## Event object

https://developer.mozilla.org/ja/docs/Web/API/Event

### KeyCode

https://keycode.info/

##refs: WebAPI

https://developer.mozilla.org/ja/docs/Web/API
Webサービスの全体像

#Webサービスとは

Webサービスとは、インターネットを利用したサービス。

・画面に情報が表示されている
・情報は最新の状態が更新されている
・全世界中の人と同じ情報を共有できている

ex) Youtube, Twitterなど

では、なぜこのようなことが可能なのか？



#Webサービスの仕組み

Webシステムとは、

・あなたのPC、スマホ　：クライアント側
・サーバ（業務用コンピュータ）：サーバ側

が通信することで情報を取得し、成り立っています。


具体的には、

・リクエスト：あなたのPC、スマホ→サーバ　に情報を送ってほしいと依頼すること
・レスポンス：サーバ→あなたのPC、スマホ　に情報を送り返して応答すること

この２つの作業を行うことで、情報の通信を可能にしています。

あなたのPC、スマホ画面にサイトの情報が映るのは、サーバが応答してくれた情報のレスポンスが表示されているからとなります。どんなWebサービスでも、このリクエストとレスポンスの連続で成り立っています。

※AWSでは、EC2というサーバを借りて、あなたの自由に操作できます。

しかし、リクエストはどこに送られているのでしょうか？
おそらくそれぞれのWebサービスのサーバを表す住所のようなものがあるはずです。


#IPアドレス

インターネットの世界にもコンピュータがここにありますよという
住所のようなものが存在します。

それが、IPアドレスです。

IPアドレスは、

・インターネット上の住所を表したもの
・数字を４つのブロックに分けた形式

IPアドレスがあるおかげで、
リクエストに対してレスポンスができるWebサービスが成り立っています。

サーバには、それぞれ個別のIPアドレスが割り当てられています。
よって、クライアントは目的のサーバにリクエストを送ることができます。

しかし、IPアドレスは数字なので、それを見ただけでは一目で何のWebサービスのサーバなのかも分からないし、覚えたり管理するのが大変です。


#ドメイン

そこで私たちは、「youtube.com」「twitter.com 」などの英数字のURLを
使用してサイトにアクセスしています。

この英数字のURLを、ドメインと言います。

しかし、ドメイン名だけではアクセスはできません。
必ずIPアドレスが必要になります。
ではドメイン名にアクセスしているのに、なぜサーバのIPアドレスを
取得できているのでしょうか？


#DNS

それはドメインとIPアドレスを対応付けさせることで、
世界中のPCからサイトにアクセスすることを可能にしたからです。

それが、DNSとなります。

DNSは、電話帳のようなもので
「このドメインは、このIPアドレスだよっ」という対応表が載っています。

このドメインからIPアドレスを導き出すことを、名前解決と言います。
この名前解決を行うサーバのことを、DNSサーバーと言います。

よってサイトにアクセスするときは、

⓵DNSサーバーで、ドメイン名→IPアドレス　に変換する
⓶DNSからWebシステムのサーバーに通信する

この２段階処理を行っています。

つまり、
あなたのPC、スマホ　→　DNS（サーバー）→　Webシステムのサーバー
というような流れで情報通信が行われていることになります。

※AWSでEC2を立ち上げると、自動的にドメインとIPアドレスが割り振られます。
　このドメインとIPアドレスが、自動的にAWSのRoute53(DNSサーバー)に登録されるため、
　EC2にアクセスするためには、IPアドレスとドメインどちらでも可能になります。
ijenims record 2021.03.02

# Topics

> 前回以降、あまり学習ができていなかったが、数少ない学習記録を残しておく。

# 学習記録

- PythonエンジニアによるPython3学習サイト：「pandas入門」のさわりを演習
- freeCodeCamp：HTML+CSS Applied Visual Design ～9/52
- freeCodeCamp：Scientific Computing with Python 動画1本程度
- SIGNATE：pandas道場（初出、3/31まで無料公開中）約55%修了。一番集中したかも
- paizaラーニング：レベルアップ問題集 Python「配列メニュー」数題
- 最短距離でゼロからしっかり学ぶPython入門 実践編：Alien Invasion 第2章まで
- 基本情報技術者試験(FE)：「過去問道場」を集中して実施
- 統計WEB「統計学の時間」：箱ひげ図
- Git：「最短距離でゼロからしっかり学ぶPython入門 実践編」付録による

# その他

- 「その数学が戦略を決める」：もうすぐ読了
- 「統計学が最強の学問である データ社会を生き抜くための武器と教養」：読書開始
HTML & CSS 

前回の続きから始めます。
前回なにやってるんだよって方はこちらからどうぞ！
▶<<https://qiita.com/akari_0618/items/3526fd7b751d9387667d>>

#装飾
まずHTMLの確認をします。

```index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="css/style.css">
  <title>プロフィール</title>
</head>
<body>
<div class="container">
  <h1 class="title">自己紹介</h1>
  <ul class="pro">
    <li>名前:</li>
    <li>趣味:</li>
  </ul>
</div>
</body>
</html>
```
閉じタグがあるか確認をしてから、CSSに入りましょう。(たった一つのタグがないことで６時間程度時間を溶かしたことがあります笑)
確認が終わったところでコーディングに入ります。

```style.css
.container {
  background-color: hotpink;
  padding: 10px;
  margin: 20px ;
  width: 50%;
  border: 10px double black;
} 

.title {
  border: 5px solid black;
  width: 30%;
  padding: 2px 0px 2px 20px ;
  background-color: white;
}

.pro {
  list-style: none;
}

li {
  border: 2px solid black;
  width: 30%;
  background-color: red;
  margin-bottom: 10px;
}
```
鋭い人は『ん？』って思いますよね👍
クラス名の前にあるこれ▶.（ピリオド）
これはCSSで『これからクラスの装飾始めますよ〜』
というものなのHTMLでクラスを宣言した場合は必ず忘れないようにしましょう👍　当たり前に忘れると反映されませんｗ

ulブロックの中にあるli要素に『点』を消す方法は　list-style: none;
とします！！
全部完了するとこうなります☺️
　
![スクリーンショット 2021-03-02 17.46.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033397/31f9ec54-09e7-3fe2-f6b1-52239d2949c5.png)

今まで紹介した方法ですべてやりました！
もしわからなかった場合などは記事に戻って振り返ってみてください😊
[CentOS]sudoにユーザを追加

## visudoでデフォルトグループ(wheel)が許可されていることを確認

```
# visudo
%wheel    ALL=(ALL)   ALL
```
## ユーザをwheelグループに追加

```
# usermod -G wheel ＜追加したいユーザ＞
```


## ログインし直すことでsudoが利用できる

```
# su -  ＜追加したいユーザ＞
$ sudo ls
```
【WidgetKit】WidgetKitのSwiftUIでURLから画像を表示する方法

WidgetKitでは独特なライフサイクルから描写のタイミングに制限があり、
従来の方法である非同期では画像を表示することができません。

###解決方法
`Data(ContentsOf: url)`を使って予め画像データを読み込んでから描画することでこれを解決することができます。

###サンプル実装
```swift
struct SimpleEntry: TimelineEntry {
    
    let date: Date
    let configuration: ConfigurationIntent
    let url: String
    
    func getImageData() -> UIImage {
        if let imageUrl = URL(string: self.url),
           let imageData = try? Data(contentsOf: imageUrl),
           let image = UIImage(data: imageData) {
            return image
        }
        // 読み込めない時の画像とか
        return .init()
    }
}

struct widgetEntryView : View {
    var entry: Provider.Entry

    var body: some View {
        Image(uiImage: entry.getImageData())
            .resizable()
            .aspectRatio(contentMode: .fill)
    }
}
```

#####この実装でこのように表示することができました。
![Simulator Screen Shot - iPhone 12 Pro - 2021-03-02 at 17.23.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/678728/77367c62-4daf-68c3-4325-fa58e5944a4a.png)

###最後に
非同期が使えないのは結構な罠だと思うので気をつけてくださいねー👋
【初心者向け】GASでチェックボックスをリセット

スプレットシートを使用している際にチェックボックスのリセットボタンを作りたいと思い
自分用のメモとして。

##GAS(Google Apps Script)とは
メールの自動送信・返信やスプレッドシートでオリジナルの関数を作成したりと作業を楽にできるもの。
GASは、Googleが提供するサービス全般で利用できるスクリプトで、JavaScriptの文法に準じます。


##チェックボックスのリセットボタンを作ろう
今回はチェックボックスを作る機会があったので、リセットボタンを作ろと思います。

まず軽めに項目を用意しチェックボックスを作成します。
チェックボックスは挿入→チェックボックスでつけることができます。

![b4fa089cf3dac440dbf009291c93748a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652441/67d72f4f-ef4d-d802-5618-dec38c83008d.png)

###リセットボタン
挿入→図形描画→好きな図形を選択します。その後完成しましたら保存して終了ボタンを押し、自分の好きなところに移動させてください。

![e1ad740521297523260a200a906bc048.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652441/772c1ed4-6aa7-5674-78d4-875059f95dbc.png)

##GASを使って自動化させよう
次にツール→スクリプトエディターを押してもらうと別画面にて開かれると思います。
![08e0a271fd825d57953ddcfcddfd7c06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652441/ca734ae8-1754-8727-f1d8-4ddc865f681a.png)

たまにアドレスが違うといったエラーが出ますのでその場合はいったんアカウントをログアウトして
入りなおしてみてください。私の場合はそれで開くことができました。

ここにコードを書いていきます

```javascript

function check(sheet, cell, value) {
// 指定するセルの範囲を取得
sheet.getRange(cell).setValue(value);

}

function myFunction() {
var sheet = SpreadsheetApp.getActiveSpreadsheet();
// 現在のシートを取得
var sh = sheet.getSheetByName("シートの名前");
sh.getRange(3,2,4,6).setValue("");
// 指定された範囲の値を配列で取得
}

```
(3,2,4,6)の部分はセル座標を示しています。
※自動保存ではないため必ず保存を忘れないようにしましょう。

保存したあと元のスプレットシートの画面に戻りリセットボタンを右クリックすると
「スクリプトを割り当て」という項目がでてくるため今回作成したmyFunctionを登録します。

これで完成になります。

初回実行時に「承認が必要です」というダイアログが出てくるので驚かずに、
左下の小さい文字で書いてある「詳細」をクリックした後「安全ではないページに移動する」を
押していただけると無事実行することができるかと思います。



![ダウンロード.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/652441/a4cc1156-9086-4117-aa00-a599fba0b6ba.gif)
一度に複数のタイプに対して、isinstanceを調べる(Python)

#概要
複数のタイプについて、isinstanceは一度に調べることができる。
#内容
##環境
macOS Catalina
Python 3.7.0
##実行
`isinstance`の第二引数をtupleにすることで、可能となる。

```Python
>>> a = 8
>>> isinstance(a, str) or isinstance(a, int)
True
>>> isinstance(a, (str, int))
True
```
#参考にさせていただいた頁・本
- https://www.lifewithpython.com/2014/06/python-check-object-instance-class-relationship-by-type-isinstance.html

#感想
便利。
#今後
機会があれば使っていきたい。
単純な並列処理④処理の結果を得る (Python; multiprocessing.Queue)

#概要
生産も消費も重い処理を並列するための簡素な実装をし、最終的な処理結果を得る。

multicoreを活用したいので、multiprocessingを用いる。
#内容
##注意点
以前定義したクラス定義を流用する。([前回記事](https://qiita.com/yo314159265/items/00ac562a5ae777364e6b))
##環境
macOS Catalina
Python 3.7.0
##変更
readersの出力を保持する`self.outputs`を追加する。

```Python:queue.py
class SingleQueueManager:
    ...
    def __init__(self, verbose=False):
        self.verbose = verbose
        self.queue = Queue()
        self.system_queue = Queue()
        self.outputs = Queue()  # ←ここを追加した。
        self.readers = []
        self.writers = []
        self.add_finisher()
    ...
    def _wrap_reader_proc(self, reader_function, queue):
        def tmp(queue):
            return reader_function(queue)  # ←ここを変更した。
        return tmp
    ...
    def add_element_reader(self, element_reader):
        def reader_proc(queue, outputs=self.outputs):
            while True:
                msg = queue.get()
                if (msg is self.__class__.DoneSignal):
                    break
                outputs.put(element_reader(msg))  # ←ここを変更した。
        self.add_reader(reader_proc)
    ...
    def get_all_outputs(self):  # ←この関数を追加した。
        while not self.outputs.empty():
            yield self.outputs.get()
```
##実行
```Python:queue.py
def my_element_reader(msg):
    return '*'*msg

def my_writer_proc(queue):
    import time
    import random
    for i in range(3):
        queue.put(i)
        time.sleep(random.randint(0, 5))


def main():
    m = SingleQueueManager()
    m.add_element_reader(my_element_reader)
    m.add_element_reader(my_element_reader)
    m.add_element_reader(my_element_reader)
    m.add_writer(my_writer_proc)
    m.add_writer(my_writer_proc)

    m.start()
    m.join()
    print(list(m.get_all_outputs()))

if __name__=='__main__':
    main()
```
```:output
['', '', '*', '*', '**', '**']
```
#参考にした頁・本
- [前回記事](https://qiita.com/yo314159265/items/00ac562a5ae777364e6b)

#感想
- とりあえず動くものが作れて良かった。
- 車輪の再生産をしている気がする。
- 部分的に`multiprocessing`ではなく、`threading`を使っても良いかもしれない。

#今後
今後積み重ねる機会があれば、この先も実装したいと思う。
Typoraでtextile変換に失敗した原因

## 投稿理由
会社で議事録をRedmineに書き込む必要があり、Typoraで書いたものをtextileに変換する必要があるがその際にたまに変換に失敗するので再発防止のための備忘録です。変換に失敗したときに事例と原因、対策を追記していきます。

## 失敗事例
- 箇条書きがtextileではなくHTMLに変換されてしまう
    - 原因：箇条書きの途中に改行が入っている
    - 対策：改行をすべて"\<br>"に変換する→"\<br>"は"\&lt;br\&gt;"に変換されてしまうので他のエディターで置換する
ディレクトリ配下全ファイルからファイル末尾が改行でないファイルを一覧表示するShell Script

## 作成経緯
GitHubにファイル末尾が改行になっていないファイルをアップすると怒られます。
[なぜファイル末尾に改行を入れるのか](https://qiita.com/Aseiide/items/e66be44c4b7972902063)
入っていないと、エラーになる可能性もあるらしい。

今やっているスクールでは必須要件なので、プロジェクト内のファイルが全て末尾改行になっていることを確かめるツールがあれば、後々楽になるだろうと思い、シェルスクリプトを書いてみることに。bashは一度も書いたことがなかったので練習も兼ねて書いてみます。

動作確認は、今扱っているRailsのビューだけなので、さまざまな条件で期待通り動かすには、それなりの改良が必要と思います。

## コード
```bash
#!/bin/bash

subject=""
find ./ -type f -print | xargs tail -c 1 | while read line; do 
  if [ "${line:0:3}"  = "==>" ]; then 
    subject=${line} 
  else 
    str=$(echo ${line} | xxd -p)
    if [ ! "${str}" = "0a" ]; then
      echo "${subject}"
    fi
  fi
done
```

https://github.com/kasai441/fnwline


## 説明

```bash
find ./ -type f -print | xargs tail -c 1 | while read line; do 
```
- ``find ./ -type f -print``で実行ディレクトリ以下のファイルを再帰的に検索
- ``xargs tail -c 1 ``で検索結果のファイルの最後の文字を取得
- ``while``でファイルごとにループ処理

```bash
  if [ "${line:0:3}"  = "==>" ]; then 
    subject=${line} 
```

- ``"${line:0:3}"  = "==>”``で行頭が”==>”に合致する行を変数に格納する。”==>”は``tail``コマンドから出力されたファイル名のある行の行頭。

```bash
    str=$(echo ${line} | xxd -p)
    if [ ! "${str}" = "0a" ]; then
      echo "${subject}"
```

- ``echo ${line} | xxd -p``でファイル末尾文字を16進数の文字コードに変換。``xxd``は16進数に変換するコマンド。
- ``! "${str}" = "0a" ``でファイル末尾が”0a”（LF改行）になっていない条件で、ファイル名を``echo``で標準出力。

## 参考サイト
- findの使い方
[【find・grep】特定の文字列を含むファイルのリストを取得する方法。
](https://qiita.com/pokari_dz/items/0f14a21e3ca3df025d21#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%81%AB%E3%81%A8%E3%81%84%E3%81%86%E6%96%87%E5%AD%97%E5%88%97%E3%81%8C%E5%90%AB%E3%81%BE%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E3%83%AA%E3%82%B9%E3%83%88%E3%82%92%E5%8F%96%E5%BE%97)

- xxdの使い方
[最後の文字が改行かどうか調べる](https://teratail.com/questions/5315)
[逆引きUNIXコマンド/16進数文字列をバイナリ化・16進数を文字列化する・xxd](https://linux.just4fun.biz/?%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/16%E9%80%B2%E6%95%B0%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E5%8C%96%E3%83%BB16%E9%80%B2%E6%95%B0%E3%82%92%E6%96%87%E5%AD%97%E5%88%97%E5%8C%96%E3%81%99%E3%82%8B%E3%83%BBxxd)

- while文の書き方
[ShellScript【 while read 】ファイルを１行ずつ読み込む](https://qiita.com/r18j21/items/70018b98509309a0d2c5)

- if文の書き方
[シェルスクリプト(bash)のif文とtestコマンド([])自分メモ](https://qiita.com/toshihirock/items/461da0f60f975f6acb10)

- 文字列の切り抜き
[bashで変数から部分文字列を取得する](https://qiita.com/koara-local/items/04d3efd1031ea62d8db5)
単純な並列処理②生産に時間がかかる時 (Python; multiprocessing.Queue)

#概要
多くの重い処理から分担して生産するための簡潔な実装をする。

multicoreを活用したいので、`multiprocessing`を用いる。
#内容
##環境
macOS Catalina
Python 3.7.0
##準備
```Python
from multiprocessing import Process, Queue
import time
import sys
import random

def reader_proc(queue):
    done = 0
    while True:
        msg = queue.get()
        if (msg == 'DONE'):
            done += 1
        if done == 2:
            break

def writer_proc(name, queue):
    for i in range(3):
        queue.put(i)
        print(name, i)
        time.sleep(random.randint(0, 5))
    queue.put('DONE')
    print(name, 'DONE')

queue = Queue()
reader = Process(target=reader_proc, args=(queue,))
writer1 = Process(target=writer_proc, args=('write1', queue))
writer2 = Process(target=writer_proc, args=('write2', queue))
```
`reader_proc`：queueに溜まったものを迅速に消費してくれる。
`writer_proc`：queueに追加してくれるが、生産するのに少し時間がかかる。

##実行
```Python
reader.start()
writer1.start()
writer2.start()

reader.join()
writer1.join()
writer2.join()
```
```:output
write1 0
write2 0
write2 1
write2 2
write1 1
write2 DONE
write1 2
write1 DONE
```
##蛇足
各所の説明では、いつ終わるか分からないQueueに未対応のものが多かった。
こうすれば、好きなタイミングで綺麗に終わらせられる。

'DONE'が重要なデータでないか不安な場合は、[以前の記事](https://qiita.com/yo314159265/items/0215bb1f9128800fc7f0)を参照すればすぐに解決する。
#参考にさせていただいた本・頁
* https://stackoverflow.com/questions/11515944/how-to-use-multiprocessing-queue-in-python
* https://qiita.com/yo314159265/items/0215bb1f9128800fc7f0 (iteratorシグナル記事)
* https://qiita.com/yo314159265/items/dbedf0bb27589af6a33d (前回記事)

#感想
たまに使うので、整理できて良かった。
reader_procに処理の個数を入れているのはあまり美しくはないが、行数優先。
#今後
このシリーズはもう少し続けます。

*追記：続き書きました。(https://qiita.com/yo314159265/items/00ac562a5ae777364e6b)*
単純な並列処理①消費に時間がかかる時 (Python; multiprocessing.Queue)

#概要
多くの重い処理を分担して消費するための簡潔な実装をする。

multicoreを活用したいので、`multiprocessing`を用いる。
#内容
##環境
macOS Catalina
Python 3.7.0
##準備
```Python
from multiprocessing import Process, Queue
import sys
import time
import random

def reader_proc(name, queue):
    while True:
        msg = queue.get()
        print(name, msg)
        if (msg == 'DONE'):
            break
        time.sleep(random.randint(1, 4))

def writer(queue):
    for i in range(3):
        queue.put(i)
        time.sleep(random.randint(1, 4))
    queue.put('DONE')
    queue.put('DONE')


queue = Queue()
reader1 = Process(target=reader_proc, args=('reader1', queue))
reader2 = Process(target=reader_proc, args=('reader2', queue))
```
`reader_proc`：queueから読み取るが、消費に少し時間がかかる。
`writer`：queueに追加してくれる。

##実行
```Python
reader1.start()
reader2.start()
writer(queue)

reader1.join()
reader2.join()
```
```:output
reader1 0
reader2 1
reader1 2
reader2 DONE
reader1 DONE
```
##蛇足
各所の説明では、いつ終わるか分からないQueueに未対応のものが多かった。
こうすれば、好きなタイミングで綺麗に終わらせられる。

`'DONE'`が重要なデータでないか不安な場合は、[以前書いた記事](https://qiita.com/yo314159265/items/0215bb1f9128800fc7f0)を参照すればすぐに解決する。
#参考にさせていただいた本・頁
* https://stackoverflow.com/questions/11515944/how-to-use-multiprocessing-queue-in-python
* https://qiita.com/yo314159265/items/0215bb1f9128800fc7f0

#感想
整理できて良かった。
#今後
このシリーズはもう少し続けます。

*追記： 続き記載しました。(https://qiita.com/yo314159265/items/aefd794a12c30f086413)*
【Python】threadingによる並列処理

使い方は簡単

```python
import threading

def thread1():
    '''
    別のスレッドとして実行させたい内容
    '''

if __name__ == '__main__':

    # スレッドthの作成．targetで行いたいメソッド,nameでスレッドの名前,argsで引数を指定する
    th = threading.Thread(target=thread1,name="th",args=())

    # thをデーモンに設定する．メインスレッドが終了するとデーモンスレッドも一緒に終了する
    th.setDaemon(True)
    th.start()

    '''
    実行させたい内容
    '''

```

（例）１から１００までカウント．qが入力されたら強制終了．


```python
#coding:utf-8

import threading
import sys
from time import sleep

class Config:
    fg = False

def thread1():
    while True:    
        c = sys.stdin.read(1)
        if c == 'q':
            Config.fg = True

if __name__ == '__main__':
    th = threading.Thread(target=thread1,name="th",args=())
    th.setDaemon(True)
    th.start()

    for i in range(1,101):
        if Config.fg:
            sys.exit()
        print(i)
        sleep(1)
```

実行結果
(a->b->c->qの順に入力)

```
python3 thread.py 
1
2
3
4
5
6
a
7
8
b
9
c
10
11
q
```
iteratorにシグナルを紛れ込ませること(Python)

#概要
iteratorにシグナルを紛れ込ませて、適切なタイミングでアクションをしたい。

カスタムクラスを使って実装する。
#内容
##環境
macOS Catalina
Python 3.7.0
##実演
勝手な`class`を自分で定義して用いる。`is`で判定。

```Python
class OreShikaTsukawan:
    pass


def myiterator():
    for i in range(1000):
        yield i
        if i % 10 == 5:
            yield OreShikaTsukawan


for value in myiterator():
    if value is OreShikaTsukawan:
        print('finish signal!')
        break
    print(value)
```
```:output
0
1
2
3
4
5
finish signal!
```
こうすれば、本来のiteratorの中身とかぶる心配はない。
変な演算をしてしまう心配も少ない。
##蛇足
可能ならば`class` in `class`とかすれば、global変数を汚さずに済む。

追記：
自分以外そんなに使っていないだろうと思っていたら、[似たような他の例](https://github.com/python/cpython/blob/ff5f05934db241dfafc604989b2de3487b09ca82/Lib/functools.py#L527)を見つけた。

```Python:Lib/functools.py
    sentinel = object()          # unique object used to signal cache misses
```
`iterator`ではなく、辞書のKeyが存在するかどうかに用いられている。
#参考にさせていただいた本・頁
特になし
#感想
たまに便利。
#今後
同僚に驚かれなければ使っていく。
【Node.js】Expressでセッション機能を使う方法

#プログラミング勉強日記
2021年3月2日

#セッション機能とは
　Webサーバーとブラウザの間で続けて通信を行うために必要な機能で、サーバー側でクライアントの状態を管理する方法である。セッションを利用することで、同じクライアントからサーバーに何回アクセスされたかなどを管理することができる。

#Express sessionの使い方
　express-sessionモジュールをインストールして、`--save`オプションを使用することでインストールの情報を保存できる。

```
$ npm install --save express-session
```
　そうすると、package.jsonにexpress-sessionが追加される。

```json:package.jsoon
"dependencies": {
    "ejs": "^2.6.1",
    "express": "^4.16.4",
    "express-session": "^1.15.6"
}
```

#sessionの基本構文
　まず、インスタンス名で指定したオブジェクトに対して`use`でセッションを使用すると宣言する。`session`でセッション処理を行うことを指定して、値のところで具体的にどのような処理を行うか指定する。

```
インスタンス名.use(session({
  設定項目: '値',
}))
```


#参考文献
[セッション機能について](https://itinao.hatenadiary.org/entry/20090120/1232477501)
[セッションを扱う！express-sessionを利用する方法【初心者向け】](https://techacademy.jp/magazine/16411)
[express-sessionでセッションを利用する[Express][node.js]](https://noumenon-th.net/programming/2018/12/23/express-session/)
azure front doorでSSLオフロード


#フロントドアでSSLオフロード認証をする
AWSでACMとロードバランサでやってやるやつをazure front doorでやるだけの内容
centos8.2, PHP7.3, laravel5.7, nginxで構築してたときの備忘録

##フロントドア転送プロトコル
とりあえずフロントドアデザイナーでフロントエンドまたはドメイン、バックエンドプール等は普通に作成する
カスタムドメインを使いたいなら証明書の認証しておきましょう、今回はazurefd.netドメインでやったので証明書の購入や認証はしていません
ルーティング規則の受け入れ済みのプロトコルをHTTPSのみに
![frontdoorデザイナー1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1127714/b201b689-e5af-aee1-b6c1-ac75528690bd.png)

ルーティング規則で転送プロトコルをHTTPのみにする
![frontdoorデザイナー.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1127714/5cc53701-3cdf-76cc-3c9f-b65a75b1480d.png)

##ロードバランサ
正常性プローブと負荷分散規則も忘れずに設定
![tcpprobe.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1127714/81291107-51c6-24a7-9b73-926db39680f4.png)
![負荷分散規則.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1127714/9080149b-ab62-df35-c8af-0185cfbbb8bd.png)


##VMまたはVMSSのnsgを調整
ソースを「Service Tag」、ソースサービスタグを「AzureFrontDoor.Backend」、サービスを「HTTP」にしてアクションで許可を
![nsg.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1127714/c353abe9-81a1-a186-bc14-275faef1ee46.png)

あとはVMもしくはVMSSでnginxで443をはじいて80だけ受け付けるようにする


これと合わせてフロントドアでのIP制限とかを今度書こうと思います
【Docker】「If you encounter this issue regularly because of slow network conditions」というエラー

dockerを使用していてよく遭遇するエラー。
原因はわからない。

## 解決方法
docker for Macを再起動することで解決しました。

```
$docker-compose down
```
もとは上のコマンドを何度か実行していたのですが、コンテナをダウンすることができずにいたのでとりあえずdockerをrestartしてみたら解決しました。
[Rails]slickを用いて投稿された画像をランダムに取得してスライドショーを実装する

# スライドショーの実装

題名通りjQueryのslickを用いて投稿された画像をランダムにスライドショーで実装する方法の紹介です。
初投稿なので誤字や脱字など至らない点はあると思いますが、よろしくお願いいたします。

##  完成形
[![Image from Gyazo](https://i.gyazo.com/57869466ca90e195f6f26f0b54c3ce4f.gif)](https://gyazo.com/57869466ca90e195f6f26f0b54c3ce4f)


##前提
Rails 6.0.3.5
slickはjQueryのプラグインなのでjQueryの導入をお願いいたします。

## slickの導入
[slick公式サイト](http://kenwheeler.github.io/slick/)
CDNを利用して導入します。
application.html.erb内の`<head>`に

```ruby:apprication.erb
<link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.css"/>
<link rel="stylesheet" type="text/css" href="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick-theme.css"/>
<script type="text/javascript" src="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"></script>
```
を付け加えましょう。
導入に関してはこれだけです。

## slick.jsの作成
javascript下にslick.jsファイルを作りましょう。
コードの記載は下の通りです。

```js:slick.js
$(function() {
  $('.slider').slick();
});
```

## slickの読み込み
slickを読み込むためにapplication.jsに

```js:application.js
require('slick')
```
の記載を追加しましょう。

## 投稿を取得してスライドショーにしよう
スライドショーを実地するための記載をしましょう。
今回の場合は`@posts`に画像つきの投稿の全てを取得させています。

```ruby:html.erb
<div class="slider">
  <% @posts.each do |post| %>
     <%= link_to image_tag(post.image), post_path(post.id), method: :get, class: :slick_image %>
   <% end %>
</div>
```

これで投稿を取得して画像をスライドショーで表示できるようになったと思います。

## 取得する投稿をランダムにしよう
↑の場合だと投稿全てを取得して表示してしまうので、
コントローラー内で新たに`@randams`を定義してランダムな投稿を取得しましょう。

```ruby:controller.rb
＠randams = Post.order("RAND()").limit(5)  //limit(5)で５件を取得させている。
```
`@randams`にランダムな投稿５件を取得させています。

ビューファイルも書き換えましょう。

```ruby:.html.erb
<div class="slider">
  <% @randams.each do |randam| %>
    <%= link_to image_tag(randam.image), post_path(randam.id), method: :get %>
  <% end %>
</div>
```

`@randams`にランダムな投稿５件を取得させてeachで表示させています。

## スライドを自動にしてみよう
現状のスライドだと寂しいので色々オプションを付け加えてみましょう。

```js:slick.js
$(function() {
  $('.slider').slick({
      centerMode: true, //スライド画面に次のスライドが表示される
      centerPadding: '10%', //次のスライドの幅
      dots: true, //スライドの下にドットのナビゲーションを表示
      autoplay: true, //自動再生オン
      autoplaySpeed: 2000, //再生スピード
      infinite: true //スライドが終了したら最初に戻る
  });
});
```

他にもさまざまなオプションがあるので気になった方は公式リファレンスをチェック！
## 最後に

初投稿と言うこともあり、色々不十分な点もあると思いますが、拙い文章にお付き合いいただきありがとうございました。
【JDLA E資格】確率分布

#はじめに
JDLA E資格試験で出題される確率分布について解説した記事です。
E資格試験の応用数学パートでは、__確率分布の定義式が問われることに加えて、最尤法などに発展させて出題されます__。
また、確率分布は機械学習・深層学習全般において使用されるため、本稿の内容を理解しておくのは必須です。


なお、他パートの具体的な解説については、下記をご覧ください。

[E資格試験に関する私の投稿記事リスト][link-1]
[link-1]:https://qiita.com/fridericusgauss/items/5a97f2645cdcefe15ce0

###目次
1. [確率分布](#確率分布)
2. [連続型確率分布](#連続型確率分布)
3. [離散型確率分布](#離散型確率分布)
4. [おわりに](#おわりに)

###数学表記
$\mathbb{R}$は実数集合です。
確率の諸定義については、下記をご覧ください。
[期待値・分散][link-2]
[link-2]:https://qiita.com/fridericusgauss/items/ab36d7cf91093d284ba0

#確率分布
確率分布とは、ある標本空間$\Omega$をとる確率変数$X$に対して、それぞれの値をとる確率$P(X)$を対応させた関数のことです。
連続型確率変数の場合、その確率分布を__確率密度関数__、離散型確率変数の場合、その確率分布を__確率質量関数__と呼びます。


#連続型確率分布
###確率密度関数の定義
連続型確率変数$X$は標本空間$\Omega \subseteq \mathbb{R}$をとることとします。
その確率密度関数は式(1)を満たす$f_{X}(x)$です。
また、$f_{X}(x)$は式(2)を満たします。

```math
\begin{align}
&\int_{A}f_{X}(x)\,dx=P(X\in A), A \subseteq \Omega
\tag{1}\\
&\int_{\Omega}f_{X}(x)\,dx=1
\tag{2}
\end{align}
```

ただし、$A$は$\Omega$に含まれるある区間を指します。


###連続型確率分布の例
E資格で出題される連続型確率分布は、__正規分布__（ガウス分布）です。
正規分布の確率密度関数$f_{X}(x)$は式(3)で表されます。

```math
f_{X}(x; \mu ,\sigma^2)=\frac{1}{\sqrt {2\pi \sigma^2}}\exp{\biggl (}-{\frac {(x-\mu)^2}{2\sigma^{2} }}{\biggr )}
\tag{3}
```

ただし、$\mu$は平均パラメータで、$\sigma^2$は分散パラメータです。

正規分布に従う$X$の期待値は$\mathbb{E}[X]=\mu$、分散は$\mathbb{V}[X]=\sigma^2$です。


#離散型確率分布
###確率質量関数の定義
離散型確率変数$X$は標本空間$\Omega=\\{x_1,x_2,\cdots,x_k\\}$（$x_i\in \mathbb{R}$）をとることとします。
その確率質量関数$f_{X}(x)$は式(4)を表され、式(5)を満たします。

```math
\begin{align}
&f_{X}(x_i)=P(X=x_i), x_i \in \Omega
\tag{4}\\
&\sum_{i=1}^{k}f_{X}(x_i)=1
\tag{5}
\end{align}
```

###離散型確率分布の例
E資格で出題される離散型確率分布は、__ベルヌーイ分布__と__マルチヌーイ分布__（__カテゴリカル分布__）です。


####ベルヌーイ分布
標本空間$\Omega=\\{x_1,x_2\\}$のように、事象が2種類である試行（2値の結果が得られる試行）を__ベルヌーイ試行__と呼びます。
__ベルヌーイ分布__は確率変数$X$がベルヌーイ試行に従うときの確率分布です。
ベルヌーイ分布の確率質量関数$f_{X}(x)$は式(6)で表されます。

```math
f_{X}(x; p)=p^{x}(1-p)^{1-x}
\tag{6}
```

ただし、標本空間$\Omega=\\{0,1\\}$、$p$は確率パラメータであり、式(7)の関係で与えられます。

```math
\left\{
\begin{array}{ll}
f_{X}(0)=1-p \\
f_{X}(1)=p
\end{array}
\right.
\tag{7}
```

ベルヌーイ分布に従う$X$の期待値は$\mathbb{E}[X]=p$、分散は$\mathbb{V}[X]=p(1-p)$です。
なお、この導出は割愛しますが、下記の期待値と分散の定義に当てはめると導出できます。
[期待値・分散][link-2]

####マルチヌーイ分布
標本空間$\Omega=\\{x_1,x_2,\cdots,x_k\\}$のように、事象が$k$種類である試行（多値の結果が得られる試行）を__マルチヌーイ試行__と、便宜上呼ぶことにします。
__マルチヌーイ分布__（__カテゴリカル分布__）は確率変数$X$がマルチヌーイ試行に従うときの確率分布です。
マルチヌーイ分布の確率質量関数$f_{X}(\boldsymbol{x})$は式(8)で表されます。

```math
f_{X}(\boldsymbol{x}; \boldsymbol{p})=\prod_{j
=1}^{k} p_{j}^{x_j}
\tag{8}
```

ただし、$\boldsymbol{x}=(x_1,x_2,\cdots,x_k)^{\mathrm{T}}$はone-hotベクトルです。
one-hotベクトルとは、一つだけの要素が$1$、それ以外の要素は$0$であるベクトルなので、式(9)を満たします。

```math
\sum_{j=1}^{k}x_j=1, x_j\in \left\{0,1 \right\}
\tag{9}
```

また、$\boldsymbol{p}=(p_1,p_2,\cdots,p_k)^{\mathrm{T}}$は確率パラメータであり、式(10)の関係で与えられます。

```math
\left\{
\begin{array}{ll}
f_{X}(x_j)=p_j \\
\sum_{j=1}^{k}p_j=1, p_j\in [0,1]
\end{array}
\right.
\tag{10}
```

マルチヌーイ分布において、$k=2$とすると、ベルヌーイ分布に一致します。

マルチヌーイ分布に従う$X$の期待値は$\mathbb{E}[X=x_j]=p_j$、分散は$\mathbb{V}[X=x_j]=p_j(1-p_j)$です。
なお、この導出は割愛しますが、下記の期待値と分散の定義に当てはめると導出できます。
[期待値・分散][link-2]


#おわりに
E資格向けの確率分布について解説しました。
なお、上記は、2021年2月時点における内容であることにご注意ください。

[E資格試験に関する私の投稿記事リスト][link-1]
Raspberry Pi 4でIPアドレス固定したら外部ネットワークにつながらなかった　解決策　備忘録

#１．固定時の状況
先日、WebAPIを用いてアプリケーションや簡易サーバー的な事を行っていました、その際Raspberry Pi4のIPアドレスを固定化しなければならなかったので[Raspberry Pi 3 でIPアドレスを固定して、外部からSSH接続できるようにする](https://qiita.com/hujuu/items/f3799946d761006c9852 "Raspberry Pi IP固定化")を参考にIPアドレス固定化を行いました。
以下はIP固定時のソフトウェアのバージョンとハードウェアの詳細です。

```
pi@raspberrypi:~ $ cat /etc/debian_version
10.7
pi@raspberrypi:~ $ cat /proc/device-tree/model
Raspberry Pi 4 Model B Rev 1.2
```

Raspberry Pi 4 4GB
USB boot SSD 120GB
SD搭載なし

私はIPアドレス固定化に伴いdhcpcd.confを以下の様に変更しました。
個人情報とセキュリティに関して全文はお見せできませんが、重要な一部を下に記します。＊コピペする場合には#とXに注意してください。

```dhcpcd.conf
#追記部分のみ、前文は変更なし
interface eth0
static ip_address=192.168.X.XX/XX #固定したいIPアドレス
static routers=XXX.XXX.X.X #ルーターのIPです、詳しくはルーターの設定で確認してください
static domain_name_servers=XXX.XXX.X.X #大体routersと同じで動くはずです、これもルーターの設定で確認してください
static domain_search= #この状態でも動きましたので入力要らないとおもいます
```

#２．問題発生
上記のようにdhcpcdを設定し直した後に再起動しました。
私はVNCを用いてRaspberry Pi上で作業を行っていますが<strong>繋がりませんでした</strong>。
また起動時にWebAPIのアプリも同時に起動するように設定していましたがそちらも反応なし。しかし、SSHやローカル接続のVNCは繋がりました。つまり、
Raspberry Pi ---> ローカルネットワーク ---////問題発生？　グローバルネットワーク
だと考えたわけです。

またその時にローカル上でもIPアドレスを確認できるのですが<strong>dhcpcdで指定したIPアドレスで取得はできていました</strong>。
それもできないという人は下の補足を確認してください。

#３．解決策
結果的に下記のコマンドで直すことができました。

```
sudo dhclient eth0
```
WiFiでIPを固定して同じように問題が発生した場合は<code>sudo dhclient wlan0</code>を実行してみてください。
実行すると下記のようになりました

```
pi@raspberrypi:~ $ sudo dhclient eth0
RTNETLINK answers: File exists
Too few arguments.
Too few arguments.
```

<code>RTNETLINK answers: File exists</code>は出ない場合もあります。
私以外にもこのような問題が発生している人が少しいましたがその解決策を明示しているサイトなどがあまりなかったです。この問題自体は前からLinux系のOSに見られるらしくLinux系を扱っているサイトなどで解決策を発見しました。

#４．補足
IPアドレス固定化に関して少し補足があります。Linux系のOSを使っている人はIPアドレス固定などアプリケーションを操作する際によくターミナルを使用します。しかし普段Windows OSを使用する人はGUIに慣れていて、どうしてもGUIで操作したい場合があると思います。
またdebianにはGUIで操作できるアプリケーションも多く存在しています。そしてIPアドレス固定化も下記のGUIで操作できます。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1100334/e73eda36-2418-2366-a05f-0f5b55feee22.png)
このGUIで操作して固定できますが問題が発生する場合があります。
このアプリケーションでIPアドレス固定をした後ターミナルでdhcpcd.confを確認すると

```dhcpcd.conf
#追記部分のみ、前文は変更なし
interface eth0
inform 192.168.X.XX/XX
static routers=XXX.XXX.X.X 
static domain_name_servers=XXX.XXX.X.X
static domain_search=
```
このように<code>static ip_address=</code>が<code>inform</code>に代わっていました。私の環境下ではこのinformがあるとうまくIPを取得できませんでした。なのでそもそもローカル上でも繋がらない場合はこのように確認してみてはどうでしょう。（他のサイトではこのinformでも大丈夫というのもありました）

#５．まとめ
結果的に問題は解決できましたが明確な原因はわかりません。なので今後もDHCP系は勉強しないとですね。こういうあまり大きな問題でもないが面倒くさい問題はOSのバージョンアップでよくおきますのでできれば原理を理解しておきたいものです。
ではたのしいRaspberry Pi工作ライフを！！
また何かあれば記事にするかこの記事に追記しますね！！！

#参考資料
[Raspberry Pi 3 でIPアドレスを固定して、外部からSSH接続できるようにする](https://qiita.com/hujuu/items/f3799946d761006c9852 "Raspberry Pi IP固定化")
Couchbase Server アーキテクチャ解説: Indexサービス


# はじめに

本記事では、Couchbase Serverの各種サービスの中から、Indexサービス（Index Service）について解説します。

以下は、Indexサービスを構成するプロセスと他のサービスとの関連を図示しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176567/ec5c73a5-b494-e5b7-96c5-147313e42269.png)

# Indexサービスの構成要素
## プロセス

Indexサービスは、以下の３つのプロセスからなります。

- スーパーバイザー
- プロジェクター
- ルーター


### スーパーバイザー
スーパーバイザーはIndexサービスのメインプログラムです。Indexサービスノードで稼働し、以下の役割を持ちます。

- インデックス定義の管理
- インデックス作成・保存
- インデックス更新
- Queryサービスからのリクエストへの対応

### プロジェクターとルーター
プロジェクターとルーターはDataサービス・ノード上で実行されるプロセスです。
スーパーバイザーによって提供されるインデックス定義に従って、Indexサービスにデータを提供します。
インデックスが作成されていない場合、プロジェクターとルーターは何もしません。

## プロセス間および他サービスとの連携

### インデックス作成時
Queryサービスから、スーパーバイザーに対して、インデックス作成リクエストが送られます。
インデックスの初回作成時、スーパーバイザーがインデックス定義をプロジェクターとルーターに渡します。

### データ更新時
プロジェクターとルーターは、Dataサービスによって提供されるDCPストリームを継続的に監視します。DCPストリーム上のデータミューテーション（更新）情報が、インデックスフィールドへのミューテーションを含む場合には、プロジェクターとルーターは、そのデータをスーパーバイザーに送信して、スーパーバイザーがインデックスを更新します。

### インデックス利用時
Queryサービスから、スーパーバイザーに対して、リクエストが送られ、スーパーバイザーがQueryサービスへインデックス情報を返します。

## ストレージ

Indexサービスは、標準ストレージまたはメモリ最適化ストレージのいずれかを使用するように構成できます。

### 標準ストレージ
個々のインデックスに加えられたすべての変更をディスクに保持します。各インデックスは専用のファイルからなります。

- Community Editionでは、インデックス作成時に、追加書き込み専用(append-only)モード、あるいは循環再利用(circular-reuse)モードの何かを選択できます。
- Enterprise Editionでは、自動的に圧縮処理されます。


### メモリ最適化ストレージ
EnterpriseEditionでのみ使用できます。インデックスはメモリに保存されます。これにより、メンテナンス、スキャン、および変更の効率が向上します。インデックスのスナップショットはディスク上に保持され、ノード障害が発生した場合に迅速に回復できるようにします。メモリ最適化ストレージには、メモリ消費の最適化のため、skiplist（Bツリー）構造が使用されています。


# 最後に
本記事の内容が、Couchbase Server管理者の方だけでなく、JSONデータベースを検討されている方にも、活用いただけるようであれば幸いです。

一つの記事で、全体を敷衍することは不可能ですが、適宜、下記の関連情報を参考としていただきますよう、お願いします。

# 関連情報

[NoSQL/JSONデータベースCouchbase理解・活用へのロードマップ](https://qiita.com/yoshiyuki_kono/items/4c9cd1115efc5807b49f)

https://docs.couchbase.com/server/current/learn/services-and-indexes/services/query-service.html
awsのassumeroleの簡易設定集 zsh使用

①以下コマンドなどを用いてawsのprofileを追加
open ~/.aws/credentials 
open ~/.aws/config 

export AWS_PROFILE=<hogehoge1>

②以下コマンドなどを用いてzshにfunctionを追加
open ~/.zshrc
source ~/.zshrc

function <hogehogename> {
  SWITCH_SESSION_NAME=<hogehoge2>
  ROLE_ARN=<hogehoge3>
  DATE=`date +%s`

  OUTPUT=`aws sts assume-role \
    --role-arn          ${ROLE_ARN} \
    --role-session-name ${DATE}-${SWITCH_SESSION_NAME}
  `

  AWS_ACCESS_KEY_ID=`echo $OUTPUT | jq .Credentials.AccessKeyId`
  AWS_SECRET_ACCESS_KEY=`echo $OUTPUT | jq .Credentials.SecretAccessKey`
  AWS_SESSION_TOKEN=`echo $OUTPUT | jq .Credentials.SessionToken`
  echo ""
  echo "export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID"
  echo "export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY"
  echo "export AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN"
  echo "export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID && export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY && export AWS_SESSION_TOKEN=$AWS_SESSION_TOKEN" | pbcopy
}



③321_get_assumeコマンドを叩いて環境変数を取得する。
conflict gem versions

## 結論

```
$ bundle update
```

で解決しました。


## 原因

`faraday` という依存 gem のバージョンのコンフリクトです。
`fog` の方が古いようでしたので `bundle update fog` で解決しました


```
Bundler could not find compatible versions for gem "faraday":
  In snapshot (Gemfile.lock):
    faraday (= 0.17.0)

  In Gemfile:
    fog was resolved to 2.2.0, which depends on
      fog-google (~> 1.0) was resolved to 1.9.1, which depends on
        google-api-client (~> 0.23.0) was resolved to 0.23.9, which depends on
          googleauth (< 0.7.0, >= 0.5) was resolved to 0.6.7, which depends on
            faraday (~> 0.12)

    sentry-ruby was resolved to 4.2.2, which depends on
      faraday (>= 1.0)

Running `bundle update` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.
```
HTML~classと親子要素~

ここではclassの使い方を学んで行きます。
#classとは
個人的なイメージとしてクラスはCSSのためにつけているのかな。と解釈しています。
というのも、h1タグでHTMLがマークアップしても、CSSで装飾しようとしたときに全部装飾されてしまうんですね。
![スクリーンショット 2021-03-02 14.44.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033397/c053bd4d-b7a6-e07b-4c92-bc64e84f19d9.png)
こんな感じになってしまうんですよ🥲

ではclassを付けていきましょう！！

```index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="css/style.css">
  <title>プロフィール</title>
</head>
<body>
<h1 class="title">あいうえお</h1>
<h1>かきくけこ</h1>
</body>
</html>
```



```style.css
.title {
  font-size: 45px;
  background-color: aqua;
}
```
以下のようになりましたね！！
↓
![スクリーンショット 2021-03-02 14.47.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033397/8f125f34-ab40-2fd2-0dbb-f32b5c496b2b.png)

ちなみにですが、class付けに決まりがあるのかな。と気になったので調べてみました！
結論的に特に決まりはありませんでした😊
ただ自分だけではなく、誰が見てもわかるように命名するのが原則みたいです👍
"なんのためなのか""それによって"何を表現するのか"を軸に考えて付けるのが基本のようです！


#id属性
要素に固有の名前を付ける場合に使用します！
id属性に指定できる値は先頭がアルファベットで始まり、2文字目以降にはアルファベット、数字、ハイフン(-)、アンダースコア(_)、ピリオン(.)、コロン(:)が使用可能です。大文字と小文字は区別されます。
HTML内で重複して要素に記述することはできません！

#for属性
for属性は、ラベルをコントロールと明示的に関連付けるための属性です。

属性値にコントロールのid属性の値を指定することで、そのコントロールに対してラベルを明示的に関連付けます！
for属性を用いて関連付けを行なうと、ラベルをクリックした際にもラベルに対応するコントロールにフォーカスが移動します。


#親要素と子要素
HTMLには親要素と子要素があります！
言葉で並べてもわかりにくいと思うので、実践形式でやっていきましょう😊

```index.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="css/style.css">
  <title>プロフィール</title>
</head>
<body>
<div class="container">
  <h1 class="title">自己紹介</h1>
  <ul class="pro">
    <li>名前:</li>
    <li>趣味:</li>
  </ul>
</div>
</body>
</html>
```
HTMLから説明していきますね。
不要な人は飛ばしてください。
divってなんやねんって思った方。
この子は何でも屋さんです！便利屋！難しく言うと汎用性ですかね(^_^;)ブロックレベル要素です👍(https://qiita.com/akari_0618/items/f3b6892932cb6080c905)
そしてdivさんの隣りにいる先程説明した"class"！！　今回は"container"（コンテナ）と命名しました。ブロック要素で表示エリアを表します。
これが"親要素"です。
そしてその下がh1タグの隣にまたクラス付けがされていますね。今回はこの表示エリアのタイトルに相当するので"タイトル"と名付けました。（まんまやんw）
この子が"子要素"です！
そんでもって、またはじめましてのタグがありますね！
"ul"と"li"タグ！！
"ul"は順序なしlist要素と言います！(リストのブロックだよ〜でも特に順番はないよ〜)
"li"はリストの項目と言います！（いやいや、順番あるから。）
って感じですかね😂
そして、忘れてはいけないのは、閉じタグですね。
これはちゃんと付けてくださいね👍

ブラウザ表示するとこうなる予定です！

![スクリーンショット 2021-03-02 15.55.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033397/8f8523c0-b547-ff77-a64b-45e6488385e9.png)
Dockerでphpmyadmin+Wordpress+MySQLの環境構築[Windows 10 home]

※自分も初心者なので責任は一切負いません。参考程度にしてください。
#使用するもの
* Docker
* Docker-compose
* Ubuntu
* WSL2
<br>
※各自インストールするなりしてください

#手順

##1:任意の場所にディレクトリ（フォルダ）を作成

どこに作ってもいいですがCドライブから遠すぎるとめんどくなりがちです。
名前も自由です。
今回は例として「Test」という名前にします。
更に「Test」フォルダに入って「wp-content」フォルダを作り、更にその中に入って「wp-themes」フォルダと「wp-plugins」フォルダを作りましょう。

##2：docker-compose.ymlを作成
先程作成した「Test」フォルダの中に作ってください。開いたら中身を編集します。
中身はこう書いてください↓

```yml

version: '3.1'

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80 #ポート番号は自由に設定していいがこだわりがないならこの番号でいい
    environment:
      WORDPRESS_DB_HOST: db 
      WORDPRESS_DB_USER:hogehoge # (任意) mysqlへログインする際のユーザー名と合わせる
      WORDPRESS_DB_PASSWORD:hogehoge # (任意) mysqlへログインする際のパスワード と合わせる
      WORDPRESS_DB_NAME: wordpress_db  
    volumes:
      - wordpress:/var/www/html
      - ./wp-content/themes:/var/www/html/wp-content/themes
      - ./wp-content/plugins:/var/www/html/wp-content/plugins

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: wordpress_db 
      MYSQL_USER:hogehoge # (任意) mysqlへログインする際のユーザー名
      MYSQL_PASSWORD:hogehoge # (任意) mysqlへログインする際のパスワード
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - db:/var/lib/mysql

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest 
    restart: always 
    depends_on: 
      - db 
    ports: 
      - "8888:80" #ポート番号は自由に設定していいがこだわりがないならこの番号でいい
volumes:
  wordpress:
  db:

```
※最後の

```yml
volumes:
  wordpress:
  db:
```
を書き忘れたがためにデータの永続化ができず５時間ほど無駄にしました！気をつけてください。

##3:docker-compose up -d　を実行
Ubuntuで「docker-compose up -d」を実行しましょう。
（失敗したらちゃんと～/Test$という表示になってるか確認！）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631703/b3227688-32ce-5dae-adb2-d3db18abdbfa.png)
こうなったら成功です。

##4:成功したか確認
http://localhost:8080/
と
http://localhost:8888/
にアクセス。
Wordpressの画面とphpmyadminの画面が出るはず。
「docker-compose.yml」に書いたユーザー名とパスワードでログイン。

ここで、Volume一覧を表示して見ましょう。

```
docker volume ls
```
とコマンド実行。
おそらく
Test_db
Test_wordpress
が入っているはずです。

データの永続化ができてるかを確認するため、適当に新規投稿をしてみてから一回dockerのコンテナを削除します（docker-compose down）。永続化できていない場合はこの時点でデータがリセットされるので新規投稿データも消えます。
逆に永続化に成功していた場合はデータがまだ残っているはずです。

コンテナ削除後もう一度「docker volume ls」を実行。まだTest_dbとTest_wordpressが残っていたら多分問題ありません。
再度「docker-compose up -d」を実行し、phpmyadminやWordpress編集画面でコンテナ削除前の新規投稿が残っているか確認しましょう。
3桁の整数の百、十、一の位の和を出す

# 課題　３桁の整数がある時、百の位、十の位、一の位の和を求める

## 回答

```ruby:doriru.rb
def total_num(num)
  total = (num/100 %10) + (num/10 %10) + (num %10)
   puts total
end

total_num(123) 
```

## 解説
ここから私なりの理解した内容を記述していきたいと思います。
まず百の位、十の位、一の位を取り出すやり方で共通しているのは`%10`する時は取り出したい位で割っていることだと思いました。
どういうことかと言いますと、例えば百の位のとき分母を100にして割ると

```
123/100 = 1.23
1.23 %10 = 1
```
となり、小数点以下は切り捨てられるので残った数字に`%10`すると百の位である１が取り出せました。
次に十の位のとき分母を10にして割ると

```
123/10 = 12.3
12.3 %10 = 2
```
となり、小数点以下は切り捨てられて残った数字で`%10`すると十の位である２が取り出せました。
最後に一の位ですが、分母は１になるのでそのまま`%10`します。

```
123 %10 = 3
```
最終的な余りが3なのでこちらが出力されます。
あとは出力した値を足していけば3桁の整数の百の位、十の位、一の位を足した結果が出力されます。
【Shopify】LiquidのSection Rendering APIについて

#はじめに
今回は、以下の記事の翻訳です。

[Section Rendering API](https://shopify.dev/docs/themes/sections/section-rendering-api)

それでは、頑張っていきましょう。

##Section Rendering API

>セクションレンダリングAPIを使用して、AJAXリクエストを通して単一のテーマセクションのHTMLマークアップを要求することができます。これにより、ページ全体をリロードするのではなく、ページの部分的な要素だけをフェッチすることでページの内容を更新することができます。例えば、ページ間でフルページのリロードを行わずに検索結果をページ分割するために Section Rendering API を使用することができます。

Section Rendering APIは、非同期通信を行うことで、ページの部分的なフェッチを行う際に利用するAPIです。

###Requesting sections
section_idパラメータを使用して、任意のページのコンテキストでセクションをリクエストすることができます。

ストアフロントの任意のページに`section_id`を追加すると、そのページのコンテキストでレンダリングされます。

ページ全体をレンダリングする際に重要視されるクエリパラメータ(p= や page=)は、セクションがレンダリングされる際にも重要視されます。

###Query parameters
セクションをレンダリングする際、section_idは必須です。

###Example request
それではリクエストの具体例を見ていきましょう。

```.liquid
request = new XMLHttpRequest()
request.open('GET', ‘/?section_id=social’, true)
request.send()
request.responseText
```

レスポンス:

```.html
<div id="shopify-section-social" class="shopify-section social-1">
  [content of the section]
</div>
```

###Error response
リクエストされたセクションIDがテーマに存在しない場合、サーバーは404ステータスで応答します。

##Finding specific section IDs
特定のセクションIDを見つける方法は、静的セクションを探しているのか、動的セクションを探しているのかによって異なります。

###Static sections
静的セクションのIDはセクションファイルの名前です。`sections/social.liquid`をレンダリングする必要がある場合は、`/?section_id=social`とします。

###Dynamic sections
動的セクションのIDは、Liquidではsection.idとして利用可能です。また、ホームページでレンダリングされたときにセクションをラップするdivタグのid属性からセクションIDを抽出することもできます。

例えば、`<div id="shopify-section-[id]">`とすることで、動的セクションのIDを抽出できます。

# Shopify アプリのご紹介

Shopify アプリである、「商品ページ発売予告アプリ | リテリア Coming Soon」は、商品ページを買えない状態のまま、発売日時の予告をすることができるアプリです。Shopify で Coming Soon 機能を実現することができます。

https://coming-soon.reterior.jp/

https://apps.shopify.com/shopify-application-314?locale=ja&surface_detail=%E3%83%AA%E3%83%86%E3%83%AA%E3%82%A2&surface_inter_position=1&surface_intra_position=1&surface_type=search
proxyを介している場合のCCSでGitに接続する準備（code composer studio）

## プロキシ設定
### PC上の話
大学とかでプロキシを介して，インターネット接続している場合は，
1. Windowsの設定へ
2. ネットワークとインターネットへ
3. プロキシへ
4. 手動プロキシ セットアップへ（注意! 自動プロキシセットアップだと接続できませんでした。）
5. アドレスからプロキシを確認

### CCS上の話
CCSでプロキシ設定を行います。
1. Windowタブ（上にあるよ）を開く
2. Preferencesを開く
3. Generalタブを開く
4. Network Connectionsを開く
5. Active ProviderをNativeにする。
6. PC上の話で確認したプロキシがチェック入っていたらOK
docker npmインストールメモ

忘れないようにメモです。

laravel用に作成したdockerのコンテナ内で `npm: command not found` をいただいたので、
インストールするための手順をまとめる。

## 環境
使ったimage: [php:7.4-fpm-buster](https://github.com/docker-library/php/blob/1ad18817e5de82df1a8855fe711de0b3c0c320b9/7.4/buster/fpm/Dockerfile)
もともとを探ると**debian:buster-slim**が使われており、

```
$ uname -a
```
を走らせると、 `Linux ae39fa4a710d 4.19.121-linuxkit #1 SMP Tue Dec 1 17:50:32 UTC 2020 x86_64 GNU/Linux`
と表示される。


## コマンド

```
$ apt update
```

```
$ apt install nodejs npm
```

これだけ!

## インストールされたか確認

```
$ node -v
v10.24.0
$ npm -v
5.8.0
```
バッチリです!

## インストールコマンド
`yum`だの`apt`だの色々あって混乱するので一度整理する。

### yum
ディストリビューションが`Red Hat Enterprise Linux, CentOs`であればyum系を使う。
Red Hat形式(.rpm)である。

### apt
ディストリビューションが`Debian GNU, Ubuntu`であればapt系を使う。
Debian形式(.deb)である。

### おまけ:homebrew
Macだと [homebrew](https://brew.sh/index_ja)を介して色々インストールすることが多いかも。

## 参考
・https://qiita.com/hal-bo/items/1e0568120c545bf723c6
・https://qiita.com/nanbuwks/items/ed8adb2d4324c939a349
divをクリックしてタイムピッカーを起動させたい

#type="time"
```html
<input type="time">
```
input要素のtype属性にtimeを指定することで、入力される値は時間の形式になる。
このインプットをクリックするとタイムピッカーが起動する。
<img width="450" alt="step01_pc.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/828745/51545137-50a5-b143-3142-c4d0b0b3c87d.jpeg" style="float: right;">


Androidだとこんな感じ。
<img width="200" alt="step01_mobile_1.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/828745/007f3452-b4a9-0153-0661-042239be08be.jpeg">

#いろんなとこでタイムピッカーを使いたい
Windowsはさておき、Androidの方は直感的に操作できてけっこう便利。
という訳で```<div>```とか、なにかしら要素をクリックしたときにタイムピッカーが起動して時刻が入力できるようにしたい。
もちろんJavaScriptで値も取得したい。

#作りたいもの
今回は```<div>```で作ったボタンをクリックするとタイムピッカーが起動して、入力した時刻がボタンに表示される。っていうのをつくる。
機能としては```<input>```と変わらないけどデザインの自由度は```<input>```よりも大きいはず。

#作成方法
jQueryとかは別として、どうやらタイムピッカーを```<input type="time">```以外で起動させる方法はなさそう。
最初は、何か要素をクリックしたらJavaScriptで強制的に```<input>```をクリックさせてタイムピッカーを起動させようとしたもののWindowsの方で失敗。Androidの場合は```<input>```をタップするとタイムピッカーが起動するけど、Windowsだと時計のアイコンをクリックしないといけないので、そこで躓いた。
いろいろ調べてみると、```<input>```の中のアイコンは操作できるらしいので、```<input>```をボタン内部いっぱいにして透明にして隠しておく方針に変更。
アイコンの操作は以下二つのサイトを参考にした。

>[https://blog.tmyt.jp/entry/2020/06/24/012442](https://blog.tmyt.jp/entry/2020/06/24/012442)
>[https://itokoba.com/archives/301](https://itokoba.com/archives/301)

#ボタンを作成

ボタンとして```<div>```を設置。```<input>```は中に入れて見えないように透明に。CSSはボタンぽくサクッと整える。

```html:html
<div id="button">
 <input type="time">
</div>
```

```css:css
#button {
 width: 400px;
 height: 100px;
 border-radius: 20px;
 background-color: #2dbed5;
 box-shadow: 0 5px 10px #09262a;
}

/*クリック時の動き*/
#button:active {
 box-shadow: none;
 background-color: #2397aa;
 top: 5px;
}

input {
 height: 100%;
 width: 100%;
 border: none;
 opacity: 0;
}

/*どこをクリックしてもタイムピッカーが起動するようにする*/
input[type="time"]::-webkit-calendar-picker-indicator {
 margin: 0;
 padding: 0;
 height: 100%;
 width: 100%;
}
```
#時刻を表示する
ボタンに時刻を表示するために```<span>```を追加。
JavaScriptで値を受け取って表示させれば完成。
このとき、ボタンや```<input>```にもCSSを加えて、要素の重なりを指定しておかないと```<input>```より```<span>```が上になってしまい、```<input>```がクリックできなくなるので注意。
以下のサイトを参考にした。
>[https://www.codegrid.net/articles/z-index-1](https://www.codegrid.net/articles/z-index-1)


```html:html
<div id="button">
 <input type="time">
 <span>00:00</span> <!-- 追加 -->
</div>
```

```css:css
/*cssに追加*/

#button {
 position: relative;
 z-index: 1;
}

input {
 position: absolute;
 z-index: 2;
}

span {
 font-size: 80px;
 user-select: none;
 position: absolute;
 z-index: 1;
 top: 50%;
 left: 50%;
 transform: translateY(-50%) translateX(-50%);
 -webkit-transform: translateY(-50%) translateX(-50%);
}
```
```javascript:js
let input = document.querySelector('input');
let time = document.querySelector('span');
input.addEventListener("input",  () => time.innerHTML = input.value, false);
```