OmniAICreator/Qiita-1.07M huggingface dataset:
php 配列 重複した要素の削除 array_unique() 

##配列の重複要素を削除

array_unique()

```php:qiita.php
$array = ["aaaa","wwww","eeee","aaaa","tttt","WWWW","eeee"];
$array = (array_unique($array));
//Array ( [0] => aaaa [1] => wwww [2] => eeee [4] => tttt [5] => WWWW )
```
#####連想配列の場合
```php:qiita.php
$array = array(
    array('takuya', 'jun', 'yoshiko', 'miki'),
    array('kazuki', 'aya', 'yoshiko', 'miki'),
    array('takuya', 'jun', 'yoshiko', 'miki'),
);
 
$array = array_unique($array, SORT_REGULAR);
//Array ( [0] => Array ( [0] => takuya [1] => jun [2] => yoshiko [3] => miki ) [1] => Array ( [0] => kazuki [1] => aya [2] => yoshiko [3] => miki ) )
```
第２引数にSORT_REGULARを指定しました。

####配列内に要素が何種類あるか調べる。
```php:qiita.php
$array = ["aaaa","wwww","eeee","aaaa","tttt","WWWW","eeee"];
$count = count(array_unique($array));
//5
```
```php:qiita.php
$array = array(
    array('takuya', 'jun', 'yoshiko', 'miki'),
    array('kazuki', 'aya', 'yoshiko', 'miki'),
    array('takuya', 'jun', 'yoshiko', 'miki'),
);
 
$count = count(array_unique($array, SORT_REGULAR));
//2

//要素が全て同じ
$array = array(
    array('takuya', 'jun', 'yoshiko', 'miki'),
    array('takuya', 'jun', 'yoshiko', 'miki'),
    array('takuya', 'jun', 'yoshiko', 'miki'),
);
 
$count = count(array_unique($array, SORT_REGULAR));
//1
```
Teamviewer for Linuxの導入手順（CentOS)

CentOS7へTeamViewerをいれたのでメモ

## X-Windowのインストール

```
# yum groupinstall -y "GNOME Desktop"
```

## TeamViewer インストール

```
# yum install -y epel-release
# yum install https://download.teamviewer.com/download/linux/teamviewer.x86_64.rpm
```

## TeamViewer セットアップ

```
# teamviewer setup
```
TeamViewerのアカウントを聞かれる。
アカウントでログインすると、CentOSのホストのログイン確認メールがアカウントのメールアドレスへ届く
承認して再度ログインする

## TeamViewer 自動起動設定

```
# teamviewer daemon enable
```

### メモ
- 有償版TeamViewerでしか試していないので無償版で使っているひとは確認必要
- Windows版TeamViewerからLinux版TeamViewerへの接続をしようとすると、謎アルゴリズムで個人利用じゃないだろと言われる。
- 年払いライセンスなのでいいお値段に見えるけど、買うと超便利
【HfP】プレイヤーに一度の攻撃で複数の効果をもたせるやり方(複合属性)

プレイヤーに、
『ざんげき』
『でんげき』を加えた攻撃の作り方

【下図】こんな範囲攻撃になる
<img width="292" alt="a01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/eefbd96e-1c85-5a5c-f06a-9a1a2d88bd17.png">
実践ステージはこちら
https://www.hackforplay.xyz/works/5mGBeDttZ2MaBeQrXOkS

---
作り方

プレイヤーに『ざんげき』スキルを追加する
<img width="512" alt="a02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/b721b32d-8a27-5bf9-2189-d2fa633e6f21.png">

『ざんげき』のスクリプトで、
『ざんげき』が「しょうかん」されているときに、「見た目」を『でんげき』に変える
<img width="594" alt="a03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/069477ac-bca6-2d96-2f71-99a19f326854.png">

もともとの『ざんげき』スクリプトでは、0.2秒後に『ざんげき』が消えるので、
『でんげき』も0.2秒後に消えるようにするとちょうどよくなる。
下図の赤枠のように、『でんげき』の時間を0.2よりめっちゃ大きくしたり、
そもそもthis.destroy()を削除すると、
画面端まで攻撃できるようになるので、その場合はゲームバランスが崩れることに注意する。
<img width="552" alt="a04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191635/97b56268-e8c4-0710-a3c2-12dd5f218422.png">
Elastic Stack 7.6.0リリース記念 KibanaでNested Fieldがサポートされた件

# KibanaでNested Fieldがサポートされた件

Elastic Stack 7.6.0がリリースされ、KibanaではNested Fieldがサポートされるという機能改良が入っていました。

https://www.elastic.co/blog/kibana-7-6-0-released


> The ability to use nested fields as part of an analysis inside of Kibana is one of the most commented on issues in the Kibana repo and today we are pleased to introduce our first steps towards helping you accomplish that goal by introducing nested field support in the search bar and filters. 

「まず最初のステップとして、サーチバー、フィルターでNested Fieldがサポートされる」と書かれていますね。

これがどういうことなの？　ということを確認して参りたい、と。そういう内容です。


## 事前準備

### Mapping定義

userというNestするフィールドを用意し、その下にlast, firstというテキスト型のフィールドを持つマッピングとします。

```
PUT v760
{
  "mappings": {
    "properties": {
      "user": {
        "type": "nested",
        "properties": {
          "last": {
            "type": "text"
          },
          "first": {
            "type": "text"
          }
        }
      }
    }
  }
}
```

### テストデータ

テストデータとして、以下のようなものを使用します。

```
POST v760/_doc/1
{
  "@timestamp": "2020-02-12T00:00:00.000Z",
  "user": [
    {
      "last": "トム",
      "first": "クルーズ"
    },
    {
      "last": "トム",
      "first": "ハンクス"
    },
    {
      "last": "ウィル",
      "first": "スミス"
    }
  ]
}
```

## Dashboardでの見え方

### Nested Fieldの表示

userフィールドにマウスカーソルを合わせると、Nested Fieldと表示され、アイコンとして[…]のようなものが表示されるようになっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111676/71d978b7-9e16-62cf-bd1a-f6d0a1ac042f.png)

画面全体としては、このように表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111676/57f6de87-c941-3010-8616-324ac1fe9cba.png)

7.5.2の場合は、以下のように表示されており、？というアイコンです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111676/00b81ba2-3b85-f434-3543-75142472b96e.png)


### Search Barでの検索

KQLというクエリをサーチバーで書くわけですが、lastがトムのものを検索したい場合は、このように書くことができます。

> user: {last: トム}

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111676/5c959da1-0d63-eb99-8047-dfe11634d6c6.png)

トム　クルーズを検索したいのであれば、このように書けます。

> user: {last: トム and first: クルーズ}


7.5.2の場合、userのあとにドットを打つと、lastやfirstが候補として表示されるので、`user.last: トム` とすると検索できるかも？
と思ってしまうところですが、実際はこれだと検索できません。

> user.last: トム

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111676/3e11087b-05db-b5a9-e7f7-e243dc440027.png)


### Filterでの指定

フィルターでの条件指定は、SearchBarと異なり、いつも通りにFieldを選び、Operatorを選択して値を入れるだけですので、
ここは以前のバージョンとUX上、変わりないと見ました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111676/d18277ce-c896-c31d-9dad-068794d00b51.png)


## 参考情報

Kibana Language Query(KQL)のドキュメントはこちら

- https://www.elastic.co/guide/en/kibana/7.6/kuery-query.html#_nested_field_support


では、みなさま良いElasticライフを。
弥生販売ネットワークをGCP上で動かしてみる

# 結論と注意点
弥生販売ネットワークをGCPのインスタンスへインストールしてみたところ問題なく動きました。イメージとしてはGCPに弥生販売用のSQLサーバ、VPNでローカルPCにクライアントソフトとなります。
忘備録として、気づいた点を残しておきます。
### 注意点
動作しますが弥生のネットワーク製品はローカルネットワーク上での使用が前提のようなので、クラウドなどのリモート環境でサーバを動作させることは想定していません。そのため保証対象外(サポート対象外？)となるような気もするのでご注意ください。

# 気づいた点
インストール自体はすんなりいきますが、少し躓いた点があるので。
## 使用したインスタンス
弥生販売は Windows server で動作、かつ選択したリージョンで選べる最低限の環境を準備してみました。ハードディスクは標準の50Gです。
　・n1-standard-1（vCPU x 1、メモリ 3.75 GB）
　・Windows Server 2019 Datacenter 
またインストールするときに外部からファイルをいろいろとダウンロードする必要があるため、外部アドレスが必要になります。

## ネットワーク
今回はVPN経由で試してみました。
### ファイアウォール
インスタンス側Windows serverのファイアウォールを設定変更する必要があります。詳細は[サーバーの通信設定の確認](https://support.yayoi-kk.co.jp/faq_Subcontents.html?page_id=20500)で確認できます。

## インストール
インストールですが付属のディスクの中身をコピーして試しました。その場合下記のエラーが出ます。
> SQL Server のセットアップで次のエラーが発生しました:
> 引数 ‘/V/QB’ の形式が正しくありません。区切り記号 ‘=’ がありません。

この問題については[弥生販売、弥生会計に添付しているMicrosoft SQL Serverのインストールについて](http://www.mighty-soft.com/2017/09/07/20170907/)に解決方法が記載されていたので参考にして、コマンドプロンプトから直接実行(E:\BatchInstaller.exe /sql)で解決しました。

初期設定では英語になっているので、日本語に直します。同時に「コントロールパネル＞時計と地域＞地域＞管理＞システムロケール」を日本にしないとインストーラーなどが文字化けします。

## クライアント側
クライアント側の設定は「事業所を選択」から行います。ローカルにサーバがないため自動では探してきてはくれません。サーバ名の部分にIPアドレスを直接指定します。

## 使用感
クラウド環境なので反応は遅くなります。国内リージョンを選んでもローカル環境よりはワンテンポ遅い感じになります。ただまったく使えない、と言うほどではないです。
サーバの構成的は 3.75GB のメモリでは警告がでます。メモリは 4.75GB 推奨のようです。不要なサービスを落としていけば警告は出なくなりそうですが、そこまで試していません。
【Rails+MySQL】MySQLのIDを１から振り直す

MySQLを使用してアプリ作成していると、テストデータを追加したり消したりしてIDがぽこぽこ抜けちゃうことが多いと思います。

IDをもう一度１から振り直してデータを綺麗に整えたい時に以下の方法を使うと楽だったので共有できたらと思います。

#アプリのデータベースの確認
MySQLに入って以下のコマンドを打ちます。

```
> use app_name_development;
```
Railsで作ったテーブルが保存されてるデータベースです。

#Idを１から振り直す
「delete from テーブル名」でテーブルのデータを消してから以下を実行

```
ALTER TABLE `テーブル名` auto_increment = 1;
```

これで中身が綺麗に振り直されてるのではないでしょうか？

#まとめ
テストデータ管理はなんだかんだ大変なので参考になれば幸いです。
データベース設計　基礎用語　1

#はじめに
データベース設計を学んでいく上で、用語等を中心に整理していきます。
もうすでにご存知の方、省略の仕方等ご存知でしたら、ご教授願います。

#データベース設計とは

- 扱うデータをどのように管理するか決める
- サービスやシステムの開発の初期段階でおこなう
- 現実世界の要素をデータに落とし込む作業

#データベースを構成する要素
####エンティティ
- サービスで扱うデータ


例）SNSでは、ユーザーや投稿内容、コメント内容などがあたる。

####エンティティの属性
- エンティティが実際に持つ情報

例）ユーザーというエンティティに名前、アドレス、パスワードが属性にあたる。
　　投稿内容のエンティティでは、本文やいいね数、シェア数、投稿時間が属性にあたる。


####リレーション
- エンティティとエンティティの間に関係性がある場合のこと

例）SNSでは、投稿内容と投稿内容を投稿したユーザーの間にリレーションがある。


#データベース設計の手順
①データベースで管理するデータ（エンティティ）を決める
②それぞれのデータの持つ属性を決める。
③エンティティ同士の関係性（リレーション）を決める。
④データを実際にデータベースのテーブルとして定義する。
　→エンティティはテーブルに相当し、属性はテーブルが持つカラムとなる。

#テーブルの構成要素
- テーブルとエンティティ
 - エンティティをデータベースのオブジェクトに変換すると、テーブルとなる。 
 - テーブル　＝　エンティティ　の考え

- テーブルの行と列
 - テーブルの行　=　レコード
      - エンティティの具体的なデータを表す。
 - テーブルの列　=　カラム
      - エンティティの属性を表す。
   
#データを識別するための特殊な属性値
*エンティティの属性であるカラムに関する知識となります。*

- カラムにはキーという特殊なデータが存在する。

####キーとは

- 同じテーブルのレコード同士を識別するためのデータ 
- 識別子であるので、同じテーブルないの他のレコードとは絶対に被らないように設定する。
       - 多くの場合、idという名前のつく属性がキーとなる。

####キーの種類

① 主キー 

② 外部キー

######①主キーとは

- テーブルの中で他のレコードと区別をつける識別子
- そのため、同じ主キーの値を持つレコードがテーブル内に存在してはダメ。
- 多くの場合、idカラムが主キーとなる。

######②外部キーとは

- 異なるテーブルのレコードと関係性（リレーション）を持つ場合に必要なカラム
- 識別子の役割だが、他のテーブルのレコードを識別するため用いる。
- 関係する他のテーブルのレコードの主キーを値としてもつカラム
- 他のテーブルのレコードとの関係性を表す。



#さいごに
日々勉強中ですので、随時更新します。
皆様の復習にご活用頂けますと幸いです。
Java　基礎知識　1

#はじめに
現在、私はRubyを中心に学んでおります。
学習を進める中、他言語にも興味が沸いた為、Javaに関して用語等を整理していたいと思いました。
もうすでにご存知の方、省略の仕方等ご存知でしたら、ご教授願います。

#Javaとは

- プログラミング言語の1つであり、世界的に人気の高い言語であること

###人気の理由は？


- 多くの現場で使われていること
- 汎用的でOSに依存しないこと（超重要）

 
#Javaで何ができるのか？
- 上述の通り、OSに依存をしないことからどんな環境でもソフトを動かすことができる。
- [こんなものが作れるようです。すごい！有名なのが多いです！](https://eng-entrance.com/java_product_summary)
 - それだけ信頼されているのかと思いました。

#Javaのメリットは？

- 処理速度が速いこと
 - 起動にコンパイルを必要とするコンパイラ言語であること
 - Ruby等のスクリプト言語よりも処理速度が速いのが特徴のようです。


- プラットフォームに依存しないこと
 - 上述の通り、OSに関係なく、Windows, iOS, Linuxで動作させることができる言語

 

- オブジェクト指向であること
 - Rubyと同じですね！


#Javaのデメリットは？

- プログラミング以外の作業が面倒なこと
 - Javaはプログラムを実行するためにコンパイルという作業をする必要があるようです。
 - コンパイラ言語の特徴かと勝手に思ってます。
 - 事前準備や開発環境を整える作業が多くなる。

- 学習環境が少ないこと
 - 私はこれで苦労しそうです。なんとか触りだけでも頑張りたいなと思ってます。

以上、私の感想を交えつつ、整理してみました。

#さいごに
日々勉強中ですので、随時更新します。
皆様の復習にご活用頂けますと幸いです。
[Ubuntu18.04LTS] hostnamectl でホスト名を設定しようとすると 「Connection timed out」で設定できないとき

調べても日本語の解決策が見つからなかったので共有させて頂きます。

# 問題
`hostnamectl` でサーバのホスト名を設定しようとしたところ、謎の `Connection timed out` が発生して設定が通りません。

```
hostnamectl set-hostname myhost
Could not set property: Connection timed out
```

# 解決方法
`systemd-hostnamed` の再起動で解決しました。

```
systemctl restart systemd-hostnamed
hostnamectl set-hostname myhost   # 成功！
```

再起動はすべての迷える子エンジニアを救う・・・。
VSCodeのデバッグ中にDeepExitExceptionが発生したら

VSCodeでphp開発始めたところ、デバッグ中にDeepExitExceptionが乱発する自体に遭遇したので、原因と対策。

## 結論
### 原因
デバッグ中にコード修正すると、phpcsが実行され、その中でDeepExitExceptionを発生させています。仕様に近い。何か問題が起きている訳ではないです。
具体的には、内部的に実行されているphpcsのコマンド引数をパースするところ（Config.php内）で、例外スローされています。（この例外スローが適切なのかは疑問）

### 対策
VSCodeのブレークポイントで、Everythingのチェックを外すだけです。標準でEverythingチェック入っています。


## 開発環境
VSCode
phpcs & phpcbf
xDebug
Excel VBA はセルへのアクセスがとても遅い

#概要
Excel VBAでセルに値をゲット、セットするのに時間がかかるのでその検証。
自分は使いやすいのでtest3の方法をよく使う。

#結論
| 種類 | 方法 |
|:-:|:--|
| test1 | 100万個のセルに1個ずつ値をセット  |
| test2 | 100万個のセルにまとめて値をセット  |
| test3 | variant型の配列を用意してまとめて値をセット  |

| 方法 | 実行時間 |
|:--|--:|
| test1  | 17.44sec |
| test2  | 0.56sec  |
| test3  | 2.61sec  |

#コード

##test1

```vb:test1
Sub test1()
    Dim t As Single
    t = Timer
    
    With Sheet1
        Dim i As Long
        Dim j As Long
        
        'セル1個ずつに値をセット
        For i = 1 To 1000
            For j = 1 To 1000
                .Cells(i, j) = "a"
            Next
        Next
    End With
    
    Debug.Print "test1:" & Timer - t & "sec"
End Sub
```



##test2

```vb:test2
Sub test2()
    Dim t As Single
    t = Timer
    
    With Sheet1
        'まとめてセルに値をセットする
        .Range(.Cells(1, 1), .Cells(1000, 1000)) = "a"
    End With
    
    Debug.Print "test2:" & Round(Timer - t, 2) & "sec"
End Sub
```

##test3

```vb:test3
Sub test3()
    Dim t As Single
    t = Timer
    
    With Sheet1
        Dim i As Long
        Dim j As Long
        
        '2次元配列が確保される。添え字は1～
        Dim var As Variant
        var = .Range(.Cells(1, 1), .Cells(1000, 1000))
        
        '変数へのアクセスなので1個ずつでも遅くない
        For i = LBound(var, 1) To UBound(var, 1)  '1 To 1000
            For j = LBound(var, 2) To UBound(var, 2)  '1 To 1000
                var(i, j) = "a"
            Next
        Next
        
        'セルに値をセットする
        .Range(.Cells(1, 1), .Cells(1000, 1000)) = var
        
    End With
    
    Debug.Print "test3:" & Round(Timer - t, 2) & "sec"
End Sub
```

#まとめ
大したことしてないはずなのに、えらく重たい時は見直してみるといいかもしれない。
ChromeのみBad Requestで特定ページが開けない問題

初めて投稿します。
至らぬところがあればご指摘いただけると幸いです。

先日タイトルの通り、ChromeのみBad Requestが表示される問題に直面しました。
その際、クリティカルに解決する記事等がなかったので、同様の悩みを抱える同志がいたら救いになればと思い書きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285286/061a16b2-48b7-ac17-d0a4-c54ece322d71.png)

# 結論
Apacheの設定に問題がありました。

```conf:httpd.conf
LimitRequestFields 20 #これを削除
```
[こちら](https://qiita.com/bezeklik/items/1c4145652661cf5b2271)の記事を参考にインスタンスのセキュリティ対策をしていたのですが、私の関わるWebアプリでは、特定のページのみ、この`LimitRequestFields 20`をChromeだとぎりぎり超えてしまうらしく、Chromeのみ表示できない状況となっていました。。
2018年頃にインスタンスを立てたときは、全く問題がなかったのですが、どうやら2年の内にRequest Header Fieldが増えてきたようです。
私は同じ原因でまたBad Requestが表示された際、クライアントへの説明に困るので設定を削除しました。デフォルトでは`LimitRequestFields 100`が適用されます。

## 最後に
ブラウザ毎にRequest Header Fieldの数が異なるのは、全く知見になかったので、良い学びになりました。

以上です。
SES営業が、一人で自社アプリを開発しようと思うので備忘録

いつも、先人たちの記事を眺める・ストックの繰り返しで
Qiitaのサービスの数パーセントしか使っていないので、備忘録的に
開発記録のような物を残すことにしました。
#なにするのか、なぜこうなったのか
###・作るもの
会社で発生する報告書・勤怠・その他申請業務を一括管理できるアプリ
（スマホ・PCから操作できるもの）

###・作る理由
世の中にこの程度のサービスはあふれんばかりにリリースされていますが、
痒いところに手が届かない。ベンチャーあるあるの、
「掌返し」が多発する弊社では、リリースされた既製品では小回りが効かない
ため「じゃあ作っちゃおう」という次第。

###・なんで営業の私が一人で作るのか
営業をやめてエンジニア転向を考えている旨を社長に相談したところ、
このプロジェクトがふわーっと浮かび上がったため。
でも、なあなあで期間だけが進んでしまうと最悪この話がなかったことになって
半年無駄にしかねないので、どんどん結構なとこまで進めちゃうことで、
「忘れたとは言わせまい」とするため、夏までの約半年は、一人で作ることになっています。

###・どこまで作るのか
勤怠報告機能完成を最低ゴールとします。
ここでいう完成は、もうUIまで一応作り上げて、社内実装できるレベル。
一機能だけ完成させて「忘れたとは言わせまい」と言うのが目標です。
 
###・これを一人でやることで得たいもの
開発ノウハウ。チームワークは一人なので今回は諦め。
仕様書の作り方やテストの進め方みたいな、コードを書く以外の実務的なところを
おろそかにせず全部やります。
自分の勉強もあるけど、今後の運用保守につながると思うので一石二鳥かな？？

###・手を動かす以外にやること
実際、自社にはIT未経験の人しかいないため、
現状開発のかの字すらわからない状況。
なので、社外の有識者から、色々とヒアリングさせてもらい、
自分がこの半年、ひいては脱営業で開発メインとなったときに
どう立ち振る舞うのかを**具体的にイメージ**する必要がありそうです。

#笑って許して
もうやるしかないわけです。(ツ)_/¯
会社だけでなく、自分も後に引けない状況になるのは確かなので、
会社のためにというワードを隠れ蓑にし、自分のスキルに繋げるわけです。
Raspberry Piに構築したOpenCVのエラー解消法

# 初めに
<a href="https://qiita.com/morichu78/items/38de237af83dd6c5568a"> こちら</a>を参考にRaspberry PiにOpenCVをインストールしたところ、Python3でエラーが出てOpenCVがインポートできませんでした。いろいろ調べて解決したので、その方法を記載します。

### 環境
Raspberry Pi 3 B+
Python 3
OpenCV 4.1.1

# エラー内容と解決法　
### その１
最初に出たエラーメッセージはこちらです。

```
>>import cv2
ImportError: libhdf5_serial.so.103: cannot open shared object file: No such file or directory
```
libhdf5_serial.soがないみたいなので、必要なパッケージをインストールします。

```
$ sudo apt-get install libhdf5-dev libhdf5-serial-dev libhdf5-100
```

### その２
次に出たエラーメッセージがこちらです。

```
>>import cv2
ImportError: /usr/lib/arm-linux-gnueabihf/neon/vfp/libavcodec.so.58: undefined symbol: bcm_host_is_fkms_active
```

```bcm_host_is_fkms_active``` がfirmwareに追加されったっぽいので、kernelとfirmwareを最新にします。

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

### その３
最後に出たエラーがこちらです。

```
>>> import cv2
ImportError: /home/pi/cv2/cv2.cpython-37m-arm-linux-gnueabihf.so: undefined symbol: __atomic_
```
<a href="https://qiita.com/XM03/items/48463fd910470b226f22">こちら</a>のサイトを参考に次のコマンドを実行しました。

```
$ LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libatomic.so.1
```
vimで.bashrcファイルを編集します。

```
$ vim.tiny .bashrc

export LD_PRELOAD=/usr/lib/arm-linux-gnueabihf/libatomic.so.1 #文末にこの一文を追加
```

### 動作確認

```
$ python3
>>> import cv2
>>> 
>>> cv2.__version__
>>> '4.1.1'
```

何も表示されなくなったので無事OpenCVが読み込まれました＼＾＾／
念のためバージョンを確認しています。
これでRaspberry piでPythonとOpenCVを使えるようになれたら嬉しいです。


## 参考サイト
https://github.com/raspberrypi/firmware/issues/1319
https://qiita.com/XM03/items/48463fd910470b226f22
Rails6 each を使った時にDBのレコードの内容が全て出力されてしまう

# 目的

- eachを用いた時に意図しない出力になってしまったので解決方法を記載する。

# 症状

- 下記のコードを用いてDBのとあるテーブルのレコードの内容を出力したところレコードの全ての内容が最後に出力されてしまう。

    ```html
    <%= @posts.each do |post| %>
      <%= post.content %><br>
      <%= post.link %><br>
    <% end %>
    ```
    ↓出力
    
    ```
    testでーす
    https://qiita.com/miriwo
    [#<Post id: 1, content: "testでーす", created_at: "2020-02-08 00:54:38", updated_at: "2020-02-08 00:54:38", link: "https://qiita.com/miriwo">]
    ```

# 原因

- 単純なミス
- `@posts.each do |post|`の部分を<%= %>で囲んでしまっていたため、処理部分が出力されてしまった。

# 正しいコード

- 下記に正しいコードを記載する。

    ```html
    <% @posts.each do |post| %>
      <%= post.content %><br>
      <%= post.link %><br>
    <% end %>
    ```
    ↓出力
    
    ```
    testでーす
    https://qiita.com/miriwo
    ```

# 教訓

- `<%= %>`は結果を出力したい時のみ使用する。
- `<% %>`は結果を出力したくない時に使用する。
DirectXで画面分割

![bunkatsu2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368850/ad7bc936-1228-1079-6fd7-fe3fef9ed5e5.png)
このようにDirectXで画面分割する方法を紹介します。

# 概要
DirectXは描画する際に様々な行列を使用するのですが、その１つに**ビューポート行列**というものがあります。このビューポート行列を描画前に設定することにより、画面分割を行うことが出来ます。


# コード
```C++
const float FRAME_BUFFER_W = 1280.0f;   //フレームバッファの幅。
const float FRAME_BUFFER_H = 720.0f;   //フレームバッファの高さ。
Model* modelList;   //3Dモデルのリスト
ID3D11DeviceContext* d3dDeviceContext;   //D3D11デバイスコンテキスト、初期化済みとする
D3D11_VIEWPORT viewPorts[2];   //分割ビューポート、これをモデルの描画前に設定する

//ビューポート初期化
{
    //これが上画面
    viewPorts[0].Width = FRAME_BUFFER_W;   //画面の横サイズ
    viewPorts[0].Height = FRAME_BUFFER_H / 2;   //画面の縦サイズ
    viewPorts[0].TopLeftX = 0;   //画面左上のx座標
    viewPorts[0].TopLeftY = 0;   //画面左上のy座標
    viewPorts[0].MinDepth = 0.0f;   //深度値の最小値
    viewPorts[0].MaxDepth = 1.0f;   //深度値の最大値

    //これが下画面
    viewPorts[1].Width = FRAME_BUFFER_W;   //画面の横サイズ
    viewPorts[1].Height = FRAME_BUFFER_H / 2;   //画面の縦サイズ
    viewPorts[1].TopLeftX = 0;   //画面左上のx座標
    viewPorts[1].TopLeftY = FRAME_BUFFER_H / 2;   //画面左上のy座標
    viewPorts[1].MinDepth = 0.0f;   //深度値の最小値
    viewPorts[1].MaxDepth = 1.0f;   //深度値の最大値
}

//描画するぜ
{
    //ビューポートの数だけfor文を回す
    for(int i = 0; i < sizeof(viewPorts) / sizeof(viewPorts[0]); i++) {
        //ビューポートを設定
        d3dDeviceContext->RSSetViewports(1, viewPorts[i]);
        //モデルを描画
        for(Model* model : modelList) {
            //描画
            model->Draw();
        }
    }
}
```
バッチファイルの備忘録

# 概要
bat作るときに忘れてしまうのでメモ

## スクリプトを表示させない
```bat
@echo off
```

##IF文
```bat:構文
if 条件 ( 処理 )
```

```bat:複数分岐するとき
if 条件 (
    処理1
    処理2
    処理3
) else (
    処理1
    処理2
    処理3
```

##ファイルの存在を確認する
if の後ろにexistをつける

```bat:ファイルがあるか確認
@echo off
if exist test.bat (
    echo test.batがディレクトリに存在する
) else (
    echo test.batがディレクトリに存在しない
)
```
>［ 実行結果 ］
>test.batがカレントディレクトリに存在する


##否定
if の後ろにnotをつける

```bat
@echo off
set config=true
if not %config%==true (
    echo configはfalseだ
) else (
    echo configはtrueだ
)
```
>［ 実行結果 ］
> configはtrueだ


## 別のバッチファイルを呼び出す
callを使う。これ以外の方法だと非同期呼び出しになってしまい大変なことが起きる

```bat
call 呼び出したいバッチ.bat 引数1 引数2 引数3 ...
```

##バッチを終了させる
exitを使う。
尚、callはGOTOみたいなもので特定のラベルに飛ぶ場合にも利用する。
そのラベルから戻る際にもexitを使う。

##戻り値を返す
exitを使う。

```bat
exit 0
```

これでゼロを返せる。

尚文字列は返せない。文字列を返したい場合は別途変数を定義する。

```bat:test.bat
@echo off
rem 戻り値を定義する
RETURN_VALUE=バッチ作るの意外と難くね？
exit /b 0
```

##バッチファイルだけ終了させる
exitはcmd.exeそのものを終了するコマンドなので、基本的にそのままは使えない。
呼び出し元のバッチファイルまで終了させるわけには行かないので、自分自身だけ終了させる必要がある。

この場合は「/b」のオプションを指定する。

```bat
exit /b 0
```
【ふくだ学習録】アプリ制作part4【31日目】

# ふくだ学習録とは？
ふくだが学習したことの備忘録。
目に見える形で残すことによってやる気を出す個人的な作戦です。
他人に見せるように書いているわけではないので、すごく読みにくいです。

### 読了した本
[データベースエンジニア養成読本 [DBを自由自在に活用するための知識とノウハウ満載!]](https://www.amazon.co.jp/dp/4774158062/ref=cm_sw_r_tw_dp_U_x_FPphEbQFPPQRM )
[ゼロから作るDeepLearning](https://www.amazon.co.jp/dp/4873117585/ref=cm_sw_r_tw_dp_U_x_y3UiEbF3P6EG7)
[PHPフレームワーク CakePHP 3入門](https://www.amazon.co.jp/dp/4798048577/ref=cm_sw_r_tw_dp_U_x_.YIjEbS1K4JY2)
[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/ref=cm_sw_r_tw_dp_U_x_XlokEbJQK2N7P )
[Docker入門](https://www.amazon.co.jp/dp/480071091X/ref=cm_sw_r_tw_dp_U_x_xVlmEbN8ZTHZK)


### 今読んでいる本

なし

# アプリ制作

### Genericsとは？
TypeScriptの機能の一つ。
まずジェネリックとは、型引数を使用して、実際に利用されるまで型が確定しないクラスや関数を実現するためのもの。
TypeScriptでは下記の記載方法で使用できる。

```ts
function a<T>(x: T) {
  alert(x);
}

//関数実行時にstring型をであることを明示していること。
a<string>("BELTLOGGER");

//数値型でも実行できる。
a<number>(9);
```


[TypeScriptの目玉機能「ジェネリック（Generics）」はこうなっている](https://www.buildinsider.net/language/tsgeneric/01)


### NextPage型について
getInitialPropsに対して型情報を提供するもの。
下記のような風に使用する。

```tsx
import { NextPage } from 'next'

interface Props {
  userAgent?: string
}

const Page: NextPage<Props> = ({ userAgent }) => (
  <main>Your user agent: {userAgent}</main>
)

Page.getInitialProps = async ({ req }) => {
  const userAgent = req ?req.headers['user-agent'] : navigator.userAgent
  return { userAgent }
}

export default Page
```

[型のエクスポート](https://nextjs-docs-ja.netlify.com/docs#%E5%9E%8B%E3%81%AE%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%9D%E3%83%BC%E3%83%88)

# 今日の一言
いったんstore情報を取得できるようにできたー
ようやくアプリ実装部分に集中できる気がするー
超簡易的な側だけ作ったら、LaravelでAPI作っていこっと。
【JavaScript】querySelectorなどでCSSセレクターを使うときに](ブラケット)を閉じないとSafariで動いてくれない

次のように、`querySelector`で要素を取得する際にうっかり`]`を書き忘れた場合でも、Chromeでは普通に動いてくれます。

```foo.html
<input type="text" value="hogehoge" />

<script>
	const element = document.querySelector("input[type='text'")
	console.log(element.value)
</script>
```

Chromeの場合

<img width="498" alt="スクリーンショット 2020-02-12 9.27.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496565/9c42dfd6-e181-2c13-82f9-b1fcc3d59005.png">

しかし、Safariで同じことをやろうとすると、次のようなエラーを吐いてしまいます。
`The string did not match the expected pattern.`

<img width="853" alt="スクリーンショット 2020-02-12 9.25.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496565/f14f86f1-b5b2-5a9d-d21c-73379c406b23.png">

<img width="857" alt="スクリーンショット 2020-02-12 9.26.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496565/b8b9edd3-dd53-44c3-c1d8-1a7ac61f0bc4.png">


これはブラケットをしっかり閉じてあげるだけで解決します。

```foo.html
<input type="text" value="hogehoge" />

<script>
	const element = document.querySelector("input[type='text']")
	console.log(element.value)
</script>
```

<img width="857" alt="スクリーンショット 2020-02-12 9.29.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496565/47ba7c09-e1e8-f92d-30a0-cb09814e78f4.png">

どうやらSafari限定でエラーを吐くようです。

>Consider this markup:

><select name="language"></select>
And this is where the browser responses to different incomplete selector patterns differ:

> document.querySelector('select[name');
Chromium: found 1
Edge: found 1
Firefox: found 1
Internet Explorer: found 1
Safari: DOM Exception 12

引用元　[On handling invalid selector strings]
(https://www.reddit.com/r/firefox/comments/5nbmqi/on_handling_invalid_selector_strings/)

普通のブラウザだと正常に動作するのも相まって気が付きにくですね
dockerコマンドのメモ

## DockerHubからimageの取得する
```bash
docker pull ubuntu
```

## Imageを起動する
```bash
docker run ubuntu
```

### bashを使用する
```bash
docker run -i -t ubuntu bash
```
`-i` はコンテナの標準入力を有効化、 `-t` はttyを有効化するためのオプション

## DockerHubでimageを検索する
```bash
docker search <IMAGE NAME>
```

## tagを使用する
```bash
docker run python:2.7 python --version
```

## DockerfileからDockerImageを作成する
```bash
docker build -t hello .
```
`-t` は名前をつける
`.` はdocker build 実行時のコンテキストの指定

## ローカルに存在するDocker Image の一覧を確認する
```bash
docker images
```

## Docker Hubへログインする
```bash
docker login
```

## Docker Image を命名する
```bash
docker tag <IMAGE NAME> <USER NAME>/<IMAGE NAME>:<TAG>
```

## Docker Hub へ Docker Image をアップロードする
```bash
docker push <USER NAME>/<IMAGE NAME>:<TAG>
```

## 実行中のコンテナを確認する
```bash
docker container ls -a
```
`-a` 全てのコンテナを表示

## 停止したコンテナをすべて削除する
```bash
docker container prune
```

## 1つ以上のコンテナーを削除する
```bash
docker container rm <CONTAINER> [CONTAINER...]
```

## Dockerネットワークを一覧で表示する
```bash
docker network ls
```

## 新しいBridgeネットワークを作成する
```bash
docker network create <NAME>
```

## 停止したコンテナを実行する
```bash
docker start -a <CONTAINER>
```
`-a` アタッチする

## 実行中コンテナを停止する
```bash
docker stop <CONTAINER>
```

## コンテナの中にbashで入る 
```bash
docker exec -it <CONTAINER> bash
```

## イメージのビルド履歴を表示する
```bash
docker history <IMAGE NAME>
```
遅延評価lateinit・lazyの違い

#はじめに
遅延評価とは、必要な時まで値を代入したり計算したりを無視することをさします。
そのため、使用しない場合は計算を無視することで、処理コストを減らすことができます。
今回は、遅延評価として使用されるlateinitとlazyの違い等の紹介したいと思います。

##lateinitとlazyの違い
まず、それぞれの宣言はこちらになります。

```kotlin

//lateinit
private lateinit var testButton: Button
private lateinit var   変数名   :  型

//lazy
private val testNumber by lazy { intent.getIntExtra("Int", 0) }
private val   変数名    by lazy { 代入したいもの }
```

lateinitの特徴として、
・プリミティブ型は宣言できない。
・varで宣言。
・値の変更可能。
・初期値を与えず変数を使用すると、エラーが発生します。
・nullableは使用できない。

lazyの特徴として、
・どんな型も宣言可能。
・valで宣言。
・値の変更不可能。
・初めて使用する際に初期化するため、エラーが発生しない。
以上がそれぞれの特徴と違いです！

#さいごに
変数等の宣言にはいろんな方法があるので、
それぞれの特徴を活かしたコードが書けるようになりたいですね！
競プロ精進日誌 #01 Equal Weight | JSC2019FinalA

JSC(Japanese Student Championship)2019Final参加して，2完69位でした．
上位陣が化け物すぎました！
#第一回日本最強プログラマー学生選手権 A問題
JSC2019FinalはA問題がdifficulty2000越えだったらしく, ひらめきが必要な問題でした．
解法も鳩ノ巣原理を使ったものとFFTを使ったものの2パターンがあったので，記録に残しておきます．  

- [問題](https://atcoder.jp/contests/jsc2019-final-open/tasks/jsc2019_final_a)

問題概要：
N個のしゃりとM個のネタがある.
それぞれ重さは$A_i$,$B_j$で，ネタとしゃりを組み合わせて握りを作る．
同じ重さの握りを作りなさい．
同じネタやしゃりを使ってはいけない．ネタ同士，しゃり同士は互いに異なる重さ．二つ以上は握りを作ることが可能
制約：
$N,M\le2×10^5$
$A_i,B_j\le10^6$

コンテスト中は$N,M$の制約から愚直に探索した$O(NM)$は厳しいと判断した方が多かったみたいです．

## 解法１:鳩ノ巣原理  
鳩ノ巣原理とは
> n,mを自然数，n＞mとする．n個のものをm組にわけるとき，少なくともひとつの組は2個以上のものを含む．

はい．これ自体は当たり前のことですね．367人の人がいれば誕生日が同じ人は必ず1組は存在します．
ではこれを問題に当てはめます．

まずネタの重さの最大値を考えます．制約から$A_i+B_j\le2×10^6$.

つまり，$2×10^6+1$個の握りを作ったら，必ず同じものができるので,同じものができた時点で打ち切れば最大でも$2×10^6+1$回しかループが回ることはないです．

ということで計算量はO(min(NM,max($A_i+B_j$)))でした.

[筆者の回答(C++,AC)](https://atcoder.jp/contests/jsc2019-final/submissions/7814175)

## 解法2:FFT(NTT)
著者FFTを競プロに応用することへの理解が浅いので，勉強して追記します．
とりあえず，ここまで．
KubernetesでどのPodがどのNodeで起動しているかを確認するコマンド


```bash
kubectl get pods -o wide
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/70d08630-f24b-42d5-2d19-2d61610e49f6.png)
php繰り返し文



##はじめに
私は今までRuby,railsを勉強していましたが、転職活動の末phpを使用する企業へ入社しそうなので、新しくphpを勉強する事とした。

初歩的な事から勉強しているので、公開して人の役に立つというより自分の理解度を確認するための記事（自己満）となりますので、間違っている可能性が十分あるので気になった方はご教示いただけたら幸いです。

------------------------------------------------------------

早速本題に入ります。
phpの繰り返し文について、やり方は2種類ある。
1つはwhile文。もう1つはfor文。順にコードを書いていきます。


#####やりたい事：1〜365の数字を繰り返し表示させる

##while文

　

```
<?php
  初期化処理
  while(繰り返す条件){
    繰り返したい処理
    更新処理
}
?>
```

これが基本の考え方で、実際コードを書くと、、、

```
<?php
$i = 1
while( $i <= 365) {
  print($i. "\n");
  $i++;
}
?>
```

となる。

補足として

```
\n = 改行

$i++
　↓
$i += 1
と同じ意味
```

##for文

```
<?php
for (初期化処理; 繰り返す条件; 更新処理 ) {
  繰り返したい処理
}
?>
```

これが基本の考え方で、実際コードを書くと、、、

```
<?php
for ($i=1; $i <= 365; $i++){
  print($i. "\n");
}
?>
```

となる。

簡単な処理の場合for文の方が少ない記述ですむ。
Parcel は dotenv をサポートしています

[Parcel: Environment Variables](https://parceljs.org/env.html) にあるように、Parcel は dotenv をサポートしています。

```.env.development
API_URL=http://localhost:3000
```

```.env.production
API_URL=http://example.com/
```

```index.js
console.log(process.env.API_URL)
```

`parcel index.html` のように development モードで起動すると、`.env.development` で指定した値がコンソールに表示されます。
`parcel build index.html` のように production モードでビルドすると、`.env.production` で指定した値がコンソールに表示されます。

production ビルドで出力された JS ファイルでは、以下のように `process.env.API_URL` が値に置換されています。

```index.js
parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcelRequire,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.exports,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r){r.exports=t},{}]};for(var c=0;c<t.length;c++)try{f(t[c])}catch(e){i||(i=e)}if(t.length){var l=f(t[t.length-1]);"object"==typeof exports&&"undefined"!=typeof module?module.exports=l:"function"==typeof define&&define.amd?define(function(){return l}):n&&(this[n]=l)}if(parcelRequire=f,i)throw i;return f}({"Focm":[function(require,module,exports) {
console.log("http://example.com/");
},{}]},{},["Focm"], null)
//# sourceMappingURL=/fuga.59ec2613.js.map
```

webpack の [EnvironmentPlugin](https://webpack.js.org/plugins/environment-plugin/) みたいなものですね。最初 dotenv だからブラウザでは使えないと勝手に思い込んでいましたが、そんなことはなかった。
Javascript入門書のソースコードを写経する際に工夫した方がいい３つのこと

未経験のプログラミング言語を学ぶ際は、大抵の人が

・入門書を手に入れる
・環境を整えてみる
・実際に入門書に書いてあることを打ち込んでみてその通り動くか確認する

という手順で学習を開始します。完全に初学者ならばそれでもいいと思いますが、もし過去に少しだけプログラミングを触ったことある人や、別言語経験者、言語は経験があるけど新しいフレームワークを学び始めた（たとえばJavascriptは経験していて、これからReactを学ぶなど）際は、それだけだと物足りない…というか大して学びは得られません。

実際progateでも、特に動的型付け言語間ならばある程度一つの言語で業務経験あるならば未経験の言語とはいえカリキュラムをこなすだけなら退屈です。


また、入門書の後半には多少実用的なソースコード（「TODOリスト作ってみました」等）があるケースが多いですが、そのままですと「関数化されていない」「変数がリークしてしまう」など、実務上ではレビューを通すのは難しいものが殆どです。

そこで、主にウェブ系のプログラムが対象ですが、もし入門書の写経が終わった人や、他言語・他フレームワークの経験がある方は、以下のことに工夫してみることをお勧めします。


#ソースを関数化する
入門書のソースコードは、初学者が見やすいようにあまり関数化されていないことも多いですが、関数の書き方自体はほぼ必ず載っています。
そこで、写経したコードを可能な限り関数化してみましょう。
その際には、機能ごとに関数で束ねてみることを工夫します。多少細かくなりすぎるくらいでも大丈夫です。平文でべったりと同じ動作が3回以上行われるところは特に「関数化できないか」工夫してみてください。

その際、関数名などは横着せずに真面目に考えて下さい。早く「動くプログラム」を作ってみたいという気持ちになるのは凄く分かりますが、関数やコメントで横着をしたソースはそれだけで可読性を大きく下げ、レビューの遅延を招きます。どういう名前のつけ方がいいのかは、ぐぐってみてください。


#Javascriptの場合、即時関数化して変数が漏れ出さないようにする
ほとんどの書籍ではjsファイルのソースコードを、チーム開発を想定して作っていません。
HTMLファイルにベタ書きか、jsファイル内でいきなりvarやletで変数を定義してコードを書いています。
そのままですと、他のjsファイルに対して変数が汚染されてしまいますので、チームで開発する際もさることながら自分で開発する際も、混乱を招くことがあります。

即時関数化するなどして変数が漏れないようにしましょう。そのやり方に関しては以前こちらに投稿しております。

https://qiita.com/Yuna0610/items/5886401d3b91cde8a8f5


#機能ごとにファイルを分割する
実際の開発環境では、機能ごとにJsファイルを分割することも多々あります。
・初期化関数
・定数群
・テーブル描画
・グラフ描画
など、機能に分けてjsファイルを作成してみましょう。上記の項目に沿って即時関数化していたら、初学者にとっては変数を他のjsファイルに渡すところで何をやっているのか分からないかもしれませんが、最初はそれでも大丈夫です。


#（可能ならば）要素はHTMLに書き込むのではなく、JavascriptやJQueryを利用してDOM挿入で書かせる

これは、初学者や未経験者にとっては難しいかもしれないので余力があればで大丈夫です。プルダウンリストやテーブル、ラジオボタンなどの要素はHTML上でidやclassを指定してベタ書きするのではなく、JavascriptやJQueryを用いてDOM挿入で書いてみましょう。
Javascriptを学んでいる段階ではJQueryを並行してマスターするのは大変でしょうが、こちらは必要な要素だけ拾い食いして必要なものだけピックアップしても使うことが出来ます。

ここまでやるのは確かにハードルが高いかもしれませんが、無理してやった分コーディングへの理解は確実に深まります。




以上、初学者がソースコードを写経する際に工夫した方がいいことをまとめました。
説明がJavascript寄りになってしまっていますが、少なくとも関数化に関しては他言語でもあてはまるかなと思っています。

また、すべての現場で上記のようなことがルールとなっているとは限りませんが、これらを自然に心がけることが出来るのでしたら、どんなルールにもすぐ適用できるようになるのかなと思います。
KubernetesでNginxを複数起動するPodを起動してホスト名が書かれたインデックスファイルを作る

# Deployment起動
```
kubectl run aks-nginx-deployment --image=nginx --labels="app=nginx" --replicas=3
```

# ホスト名をこぴる
```
for PODNAME in `kubectl get pods -l app=nginx \
-o jsonpath='{.items[*].metadata.name}'` ; \
do kubectl exec -it ${PODNAME} -- \
cp /etc/hostname /usr/share/nginx/html/index.html; \
done
```
Rの基本（：, seq(), c(), rep() ）--- 初心者向け---

###### tags: `rBasicLearning`
# Rの基本
Rでよく使われるものについてまとめましたので, 宜しければ, ご覧ください！
### データの代入（<-）
ほとんどの言語では, データの代入は "=" で表されるが, 
R言語の場合は "<-" で表される.
ショートカットとしては, "option" + "-"
### ：(COLON OPERATOR)
左の番号を最小値として取り, 右の番号を最大値として取る.
そして, 左の番号以上・右の番号以下で数字を連続的に取る.

```r
# COLON OPERATOR ###########################################
# Assigns number 0 through 10 to x1
x1 <- 0:10
x1

# Descending order
x2 <- 10:0
x2
```
```r
> # Assigns number 0 through 10 to x1
> x1 <- 0:10
> x1
 [1]  0  1  2  3  4  5  6  7  8  9 10
> # Descending order
> x2 <- 10:0
> x2
 [1] 10  9  8  7  6  5  4  3  2  1  0

```
### seq()
seq(x)に入力された値を最大値とし, 1からその値まで, 連続した値を取る.
seq(x, y, by = z)で, x から y までを z の値ごとに取っていくというようにする.

```r
# SEQ ######################################################
# Ascending values (duplicates 1:10)
(x3 <- seq(10))

# Specify change in values
(x4 <- seq(30, 0, by = -3))
```
```r
> # SEQ ######################################################
> # Ascending values (duplicates 1:10)
> (x3 <- seq(10))
 [1]  1  2  3  4  5  6  7  8  9 10
> 
> # Specify change in values
> (x4 <- seq(30, 0, by = -3))
 [1] 30 27 24 21 18 15 12  9  6  3  0
```
### c()
数字の行を鎖状に繋げ, 行ベクトルにする.
"Concatenate" は, 鎖状に繋げるという意味.
c(a, b, …)

```r
# ENTER MULTIPLE VALUES WITH C #############################

# c = concatenate (or combine or collect)

x5 <- c(5, 4, 1, 6, 7, 2, 2, 3, 2, 8)
x5
```
```r
> x5 <- c(5, 4, 1, 6, 7, 2, 2, 3, 2, 8)
> x5
 [1] 5 4 1 6 7 2 2 3 2 8
```
### rep()
繰り返し, その値を出すことができる.
rep(繰り返したいデータ, 繰り返す回数)
行ベクトルの時は, 一セットごと繰り返す.
各要素ごとに繰り返したいときは, eachで指定する.
rep(繰り返したいデータ, each = x)

```r
# REP ######################################################

x7 <- rep(TRUE, 5)
x7

# Repeats set
x8 <- rep(c(TRUE, FALSE), 5)
x8

# Repeats items in set
x9 <- rep(c(TRUE, FALSE), each = 5)
x9
```
```r
> # REP ######################################################
> 
> x7 <- rep(TRUE, 5)
> x7
[1] TRUE TRUE TRUE TRUE TRUE
> 
> # Repeats set
> x8 <- rep(c(TRUE, FALSE), 5)
> x8
 [1]  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE  TRUE FALSE
> 
> # Repeats items in set
> x9 <- rep(c(TRUE, FALSE), each = 5)
> x9
 [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE

```
ReactでTypeScriptを使い始めたときに知りたかった@types/reactの用途別使い方

## はじめに

reactの[型定義ファイル](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/react/index.d.ts)には普段の開発では見かけることの少ない型が多く定義されています。
これらを使いこなすことで`any`を使わずにきれいにコンポーネントを定義できるケースがあります。

今回は3つシチュエーションとそのときに使うと便利な型をサンプルコードと合わせて紹介します。

## propsで要素を受け取って表示したいとき

- propsの型に`React.ReactNode`を使う

```tsx:Example1
interface Props1 {
  leftElement: React.ReactNode;
  rightElement: React.ReactNode;
}

const Example1:React.FC<Props1> = ({leftElement, rightElement}) => (
  <div>
    <div>{leftElement}</div>
    <div>{rightElement}</div>
  </div>
)

const Main:React.FC = () => (
  <Example1 leftElement={<p>left</p>} rightElement={'right'} />
)
```

`React.ReactNode`は`ReactElement | number | string | boolean | undefined | null`と定義されています。[^1]

`React.ReactElement`はタグで囲んだ要素（例：\<p\>要素\</p\>)を示します。

Example1のコードでは`leftElement`や`rightElement`の型に`React.ReactNode`を指定することで、文字列や数値,`<p>left</p>`のようなReactElementを受け取ることができます。

[^1]: 説明しやすくするために型定義ファイルの定義とは違う型で説明しています

## タグ名をpropsで受け取って動的に変更したいとき

- propsの型に`React.ElementType`を使う

```tsx:Example2
interface Props2 {
  tag?: React.ElementType;
}

const Example2: React.FC<Props2> = ({tag: Tag = 'div', children}) => (
  <Tag>{children}</Tag>
)

const Dummy: React.FC = () => (
  <p>dummy</p>
)

const Main2: React.FC = () => (
  <>
    <Example2>div</Example2> {/* <div>div</div> */}
    <Example2 tag={'p'}>p</Example2> {/* <p>p</p> */}
    <Example2 tag={Dummy}></Example2> {/* <Dummy></Dummy> => <p>dummy</p> */}
  </>
)
```

`React.ElementType`は`'span'や'div'などHTMLタグの文字列 | React.ComponentClass | React.FC`と定義されています。[^1]

`React.ComponentClass`は`React.Component`を継承したクラスのことで、クラスコンポーネント形式で書かれたコンポーネントの型は`React.ComponentClass`になります。

Example2のコードではpropsのtagに`React.ElementType`を指定していおり、tagは'p'などのHTMLタグだけでなく独自に定義したコンポーネントを受け取ることもできます。

## HTML属性と同じpropsを持ったコンポーネントを作りたいとき

- `React.DetailedHTMLProps<React.HogeHTMLAttributes<HTMLHogeElement>,HTMLHogeElement>`でHTML属性の型を取得して、propsを定義する

```tsx:Example3
type Props3 = { 
  name: string
} & React.DetailedHTMLProps<React.AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>

const Example3: React.FC<Props3> = ({name, href, ...props}) => {
  return <a href={href} {...props}>{name}</a>
}

const Main3: React.FC = () => (
  <Example3 name={'main3'} href={'google.com'} />
)
```

`React.DetailedHTMLProps`はジェネリックスに応じてHTML属性のそれぞれの型を示します。
見出し下に示した文の`Hoge`を[型定義ファイル](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/react/index.d.ts#L2571)で定義された、それぞれのHTMLタグに応じた名前にすれば取得できます。
例えば、aタグであれば`Anchor`、formタグであれば`Form`になります。
Gitの内部の動きを知ろう　～目次～

# Gitの内部の動きを知ろう
[その１](https://qiita.com/as-chapa/items/58eadd4f56ad3a17a8c8)
　- ローカルリポジトリ作成～最初のコミットへ（git init、git add、git commit）
[その２](https://qiita.com/as-chapa/items/c414493a3fcecc9b88e2)
　- ファイルの変更を実施して、次のコミットへ（git add、git commit）
[その３](https://qiita.com/as-chapa/items/5818d8a6fb4326ff722e)
　- タグを付ける（git tag）
[その４](https://qiita.com/as-chapa/items/bedbe0ade7a72cfa98dc)
　- ブランチを作ってチェックアウトする（git branch、git checkout）
GCSに新しいストレージクラス「Archive Storage」が登場！

GCSのライフサイクルを設定していたとき、見慣れないものが。

![スクリーンショット_2020-02-11_8_09_48_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88176/dba176af-a835-90c1-9383-ecd5a51000f7.png)

Archiveなんてストレージクラスあったかなあ。。
公式ドキュメントにも載ってないし。。
英語ドキュメントも見てみるか

あった。

[公式ドキュメント](https://cloud.google.com/storage/docs/storage-classes?hl=en#archive)

これによると、

- 年に1回未満アクセスするようなデータに向いている。
- 注意しないといけないのは可用性SLAがないこと。

みたいです。

以下、他のストレージクラスとの違いをまとめておきます。

# 料金
料金は以下の要素によって決まります。

1. データ ストレージ
1. ネットワーク使用量
1. オペレーション使用量
1. データ取得料金
2. 早期削除料金

## データストレージ
USマルチリージョンだと\$0.004とColelineから比べて6割ぐらいになってますね。
これは有効活用できるプロジェクトは安く済みそうです。

|location| Standard | Nearline |    Coldline    | Archive|
|:-----------------|:-----------------|:-----------------|:-----------------|:-----------------|
|US(multi-region)| $0.026 | $0.010 | $0.007 | $0.004 |
|Asia(multi-region)| $0.026 | $0.010 | $0.007 | $0.004 |
|Tokyo (asia-northeast1)|$0.023|$0.016|$0.006|$0.0025|
（GB単位/月）
※2020/02/12現在

## ネットワーク使用量
他ストレージクラスと同じ。
https://cloud.google.com/storage/pricing?hl=ja#network-pricing

## オペレーション使用量
Coldlineと比べて、オペレーション時の料金が10倍になってます。

| Storage Class | Class A operations | Class B operations |Free operations |
|:--|:--|:--|:--| 
| Standard Storage | $0.05 | $0.004 | Free |
| Nearline Storage and Durable Reduced Availability (DRA) Storage | $0.10 | $0.01 | Free |
| Coldline Storage | $0.10 | $0.05 | Free |
| Archive Storage | $0.50 | $0.50 | Free |

## データ取得料金
Coldlineと比べると倍以上かかります。

| Nearline | Coldline |Archive|
|:--|:--|:--|
| $0.01/GB | $0.02/GB |$0.05/GB|

## 早期削除料金
最小期間保存前に削除された場合でも、最小保存期間時と同じ料金が削除時に請求されます。

| Nearline | Coldline |Archive|
|:--|:--|:--|
| 30 days | 90 days | 365 days |

### Q. Archiveクラスのデータを30日間で削除するとColdlineより割高なのか？
仮に1,000GB
割高になるので、この場合はColdlineを使うほうが良さそうです。

|ケース|結果|式|
|:-----------|:-----------|:-----------|
|Coldlineで30日間使うケース|$7|$0.007/GB/月 * 1,000 GB * 1ヶ月|
|Archiveで30日間使うケース|$48|$0.004/GB/月 * 1,000 GB * 最小保存期間(12ヶ月)|

# 注意点：可用性SLAが存在しない

可用性SLAとは、設定された月間稼働率を下回るとGoodleからクレジットを受けられるというもの。
Archive Storageにはこれが存在しないため注意です。

# まとめ
これだけ長期保存向けのクラスができたってことは、そういった需要が多く存在していたんですね。
ほとんど触らないようなデータをこれまではColelineに保管していたところは検討の余地ありかもです。

# 参考
[ストレージクラス概要](https://cloud.google.com/storage/docs/storage-classes?hl=en)
[料金表](https://cloud.google.com/storage/pricing?hl=en)
【環境構築】Rails6 + Vue.jsで hello_vue.jsの名前をmain.jsに変更したいときの手順

## はじめに
先日、こちらの記事を書きました。
[【環境構築】Docker + Rails6 + Vue.js + Vuetifyの環境構築手順 - Qiita](https://qiita.com/terufumi1122/items/237b5465e11b26297bde)

そこで自動生成される、`app/javascript/hello_vue.js`の名前を`main.js`に**変更したい方**のために手順を記載しておきます。（対象が狭い！笑）

## 環境
```yaml
OS: macOS Catalina 10.15.3
Ruby: 2.6.5
Rails: 6.0.2.1
Docker: 19.03.5
docker-compose: 1.24.1
Vue: 2.6.10
vuetify: 2.1.0
```
## 前提
[こちらの記事](https://qiita.com/terufumi1122/items/237b5465e11b26297bde)に沿って環境構築が完了したとします。

## 1.ファイル名を変更

`app/javascript/packs/hello_vue.js`の名前を変更します。

`hello_vue.js`
↓
`main.js`

## 2.home/index.html/erbを変更

```erb:app/views/home/index.html.erb:変更前
<%= javascript_pack_tag 'hello_vue' %>
<%= stylesheet_pack_tag 'hello_vue' %>
```

```erb:app/views/home/index.html.erb:変更後
<%= javascript_pack_tag 'main' %>
<%= stylesheet_pack_tag 'main' %>
```

## 3.`manifest.json`内を変更

最後に、**Webpack**が出力した`manifest.json`をいじる必要があります。

```json:public/packs/manifest.json:変更前
{
// 略
  "entrypoints": {
// 略
    "hello_vue": {
      "js": [
        "/packs/js/hello_vue-343ebbfc5aed29c10bf6.js"
      ],
      "js.map": [
        "/packs/js/hello_vue-343ebbfc5aed29c10bf6.js.map"
      ]
    },
// 略
  },
  "hello_vue.js": "/packs/js/hello_vue-343ebbfc5aed29c10bf6.js",
  "hello_vue.js.map": "/packs/js/hello_vue-343ebbfc5aed29c10bf6.js.map",
// 略
}
```

↓

```json:public/packs/manifest.json:変更後
{
// 略
  "entrypoints": {
// 略
    "main": {
      "js": [
        "/packs/js/main-343ebbfc5aed29c10bf6.js"
      ],
      "js.map": [
        "/packs/js/main-343ebbfc5aed29c10bf6.js.map"
      ]
    },
// 略
  },
  "main.js": "/packs/js/main-343ebbfc5aed29c10bf6.js",
  "main.js.map": "/packs/js/main-343ebbfc5aed29c10bf6.js.map",
// 略
}
```

**以上です！**

## おわりに
最後まで読んで頂きありがとうございました:bow_tone1:

どなたかの参考になれば幸いです:relaxed:

## 前回の記事

[【環境構築】Docker + Rails6 + Vue.js + Vuetifyの環境構築手順 - Qiita](https://qiita.com/terufumi1122/items/237b5465e11b26297bde)
apt --fix-brokenが発生した！！

久しぶりにVirtualboxでkali linuxをいじくり回してたらハマったので備忘録として記す。


## 発生原因
`apt update`
`apt upgrade`
`apt dist-upgrade`
彼奴らを実行後、ディスク不足で失敗
後からわかったが、不要パッケージが悪さを働き、その後の全てのaptの失敗してたっぽい

### エラーメッセージ内容から抜粋
`apt --fix-broken install`  
これを実行してくれとのメッセージが出力される

### 倣って実行するもまたエラー
`/var/cache/apt/archives/*`内でエラーが発生とのこと



### 訳がわからなくなったので、aptについて学習
aptは/var/cache/apt/archives/配下にパッケージを保存していくとのこと
なので、一斉に削除することを覚悟

不要パッケージは以下のコマンドで削除可能

| command | description |
|:-----|:-----|
| sudo apt clean | APTキャッシュの削除 |
| sudo apt autoclean | APTキャッシュから使っていないファイルを削除 |


## 結果
##### その後、アーカイブ配下は空になり、無事apt実行できるようになりました！



## 備考（リポジトリ確認手順）
リポジトリ参照先の編集  
`vim /etc/apt/sources.list`

貼り付け  
`deb http://http.kali.org/kali kali-rolling main contrib non-free`



### 参考サイト
https://blog.treedown.net/entry/2019/05/15/010000
https://news.mynavi.jp/article/20190724-864746/
EPSON Endeavor TY5000S1のBIOSをラズパイ4とflashromで吸い出してみる

# 環境
 - 吸い出し元のPC: EPSON Endeavor TY5000S1
 - BIOSチップ: MX25L3206E
 - Raspberry Pi 4B
 - Raspbian GNU/Linux 10 (buster) arm7l

 BIOSチップはマザボから簡単には取り外せないタイプだったけれどそれのすぐ近くに`ROM_RECOVERY`というのがあったのでそれをラズパイと繋げSPI経由で吸い出してみた。
 間違えていたらごめんなさい

# ピンアサイン
 ピンアサインは`ROM_RECOVERY`でググるとHPのマザボ情報がヒットしたのでそれを流用しちゃった

 ピンアサイン表(`[]`の部分はジャンパーピン付き)
 **ROM_RECOVERY**

|左ピン名|||右ピン名|
|--:|--:|:--|:--|
|GND|■|■|SPI_CLK|
|3VSB|■|■|SPI_MISO|
|||■|SPI_MOSI|
|SPI_CS#|[■|■]|SPI_CS#|

# マザボとラズパイを接続
 EPSONのマザボをシャットダウンしてかつ電源コードを抜き、ボタン電池を取り外したうえで
 ジャンパーピンを取り外してから次のように繋ぐ:

|マザボのピン|ラズパイのGPIOヘッダー|
|--:|:--|
|GND|20, Ground|
|3VSB|17, 3V3 Power|
|SPI_CS#(左)|24, GPIO 8 (CE0)|
|SPI_CLK|23, GPIO 11 (SCLK)|
|SPI_MISO|21, GPIO 9 (MISO)|
|SPI_MOSI|19, GPIO 10 (MOSI)|
|SPI_CS#(右)|繋がない|

 ![配線図。内容は上の表と同じ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/218991/9ec6212d-6a03-454e-c1e8-2c1bfcebf1fe.png)
※色についての情報は特に見つからなかったから適当

# flashromで吸い出す
 ```bash
sudo flashrom -p linux_spi:dev=/dev/spidev0.0,spispeed=30000 -r ty5000s1-bios.rom -c 'MX25L3206E/MX25L3208E'
 ```
 `spispeed=30000`しないと`No EEPROM/flash device found.`になってしまう

# 参考
 - ラズパイ4のGPIOヘッダー情報、画像: https://web.archive.org/web/20200426173228/https://www.raspberrypi.org/documentation/usage/gpio/ (CC BY-SA 4.0)
 - マザボの`ROM_RECOVERY`のピンアサイン: https://support.hp.com/ie-en/document/c01925562#AbT19
 - flashromでのspispeed: https://origanummajorana.blogspot.com/2018/12/p8h67-v-bios-rom-raspberry-pi-zero-wh.html

# ライセンス
<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="クリエイティブ・コモンズ・ライセンス" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a><br />この 作品 は <a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/">クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンス</a>の下に提供されています。
データベース論理設計

## 3層スキーマ

- 外部スキーマ
    - ユーザーから見たデータ、view
- 概念スキーマ
    - テーブル定義
- 内部スキーマ
    - DBMS内部でのデータの保持の仕方、ハードウェア

概念スキーマ設計 = 論理設計

---

# 論理設計のステップ

1. エンティティの抽出
2. エンティティの定義
3. 正規化
4. ER図の作成

つまり

1. ドメインのデータをテーブル単位に落とし込む
2. テーブルのカラムを決める
3. データの冗長性の排除
4. 関連性を図に起こす

---

# キー

あるレコードを特定するための列の組み合わせ

- 主キー
    - テーブルに必ず一つ存在しなければならない
    - 一行のレコードを特定できるようなユニークな値でなければならない
- 外部キー
    - 二つのテーブルの列間で設定する
    - 参照生合成制約を課す

employeesテーブルに存在しないdepartment_idやcompany_idを指定したレコードは作成できない
![ER_diagram_example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419792/7a5632f9-9728-8b1d-88e2-23277b93ec62.png)


---

# 制約

- 参照生合成制約(外部キー制約)
- NOT NULL制約
- 一意性制約(unique)
- CHECK制約
    - 値の取りうる範囲を制限する
- 主キー制約
    - NOT NULL制約
    - 一意性制約
    - 一つのテーブルに一つ

---

## 正規形

- データの冗長性を排除し、一貫性と効率性を保持するためのデータ形式
- 一般的には第1〜第5正規系まである
- とりあえず第3正規形までやればほぼ十分

---

# 関数従属性

ある入力に対して一つの値を返す

```
YはXに従属する
{X} -> {Y}
```

---

- 第1正規形
    - テーブルはスカラ値のみからなる
    - フィールドに入れる値は一つまで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419792/82397aec-22e8-26d2-fc9a-42d2c0d0642c.png)

- 第2正規形
    - 完全関数従属にする
    - 部分関数従属を解消する
- 商品テーブル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419792/524ccec4-6e7a-c091-37ee-3bec926ac4ec.png)
- 入荷テーブル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419792/95bec9a6-060e-5df6-a8a7-c96cf3bcdfed.png)
- 第3正規形
    - 推移的関数従属を解消する
- 商品テーブル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419792/045b37d7-3141-1032-ee7b-a146ddc9e259.png)
- 仕入れ先テーブル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419792/803cd7ec-5051-1637-9e5d-30e4e2fffefd.png)
- 電話帳
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419792/27f54b07-2404-7cda-b724-1706d4f9fa10.png)
- 入荷テーブル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419792/fe488648-b29f-872c-06a3-8c8fd738ff7a.png)


画像
https://oss-db.jp/dojo/dojo_info_04
---
range

```python:for-range.py
"""
これでも0から9をす出力できるが、面倒
list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
for i in list:
    print(i)
"""

#0 1 2 3 4 5 6 7 8 9が表示される
for i in range(10):
    print(i)

#2 3 4 5 6 7 8 9が表示される（インデックスが2から始まる）
for i in range(2,10):
    print(i)

#2 5 8が表示される（インデックスが2から始まり3個飛ばしで9まで表示）
for i in range(2,10,3):
    print(i)

#インデックスの番号を使わないことを明示する場合は_が使われる
for _ in range(10):
    print('hello')
```
Yahoo天気をスクレイピングしてみた(Python編)

<h1>はじめに</h1>

自分用のメモに近いですがせっかくやってみたので記事にしてみました。
元々ラズパイサイネージをやるために色々調べたのですが、
なかなかピンポイントで欲しい情報がなく結局スクレイピングやり方だけ調べて自力でなんとかしました。
(Python使いでもweb界隈の人でもないので一瞬苦戦しました...)
yahooだと天気のapiがありますが使わなかったのは降水量しかわからないためです。

C#編は
https://qiita.com/MonoShobel/items/3ae0c051d2aadba698a4
あります。

<h2>参考にしたもの</h2>
Pythonでのスクレイピングに当たり下記の記事を参考にしました。
[pythonでスクレイピングして天気予報をGoogleHomeにしゃべらせる](https://xn--u9jwc776tibf.net/?p=1494)
[Python Webスクレイピング 実践入門](https://qiita.com/Azunyan1111/items/9b3d16428d2bcc7c9406)

スクレイピング自体に関する良い悪い説明もあるので読んでおいたほうがいいと思います。

ちなみにYahoo天気ですが、たぶんスクレイピングは禁止されていません。
Yahooファイナンスは明確に禁止されていましたが、天気に関しては禁止しているような記述は見つかりませんでした。
ただ節度は守りましょう。定期的にスクレイピングするとしても天気は1時間または30分ごとくらいのアクセスで十分だと思います。

<h2>やること</h2>
色々取りたい情報はありますがとりあえず東京の今日の天気を取得しました。
下記の画像の今日と明日の天気を取得します。
<img width="484" alt="天気.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309045/eefd10f5-e8b9-bdb1-d4ac-574510337214.png">



<h2>コード</h2>
実際にコードを実行すれば今日と明日の東京の天気を取得できます。(Visual Codeで色々書いたりデバックしました。)
だいたいコメントに何をやっているか書いてあります。
ほぼコピペのソースですが注目ポイントはselect_oneでtextの部分を取得しているところです。
Google Chromeで自動で取得しようとしたのですがうまくいかなかったので手打ちで探っていったところうまくいきました。

```python:tenki.py
import urllib3
from bs4 import BeautifulSoup

#アクセスするURL
url = 'https://weather.yahoo.co.jp/weather/jp/13/4410.html'

#URLにアクセスする 戻り値にはアクセスした結果やHTMLなどが入ったinstanceが帰ってきます
http = urllib3.PoolManager()
instance = http.request('GET', url)
#instanceからHTMLを取り出して、BeautifulSoupで扱えるようにパースします
soup = BeautifulSoup(instance.data, 'html.parser')

#CSSセレクターで天気のテキストを取得します。
#今日の天気
tenki_today = soup.select_one('#main > div.forecastCity > table > tr > td > div > p.pict')
print ("今日の天気は"+tenki_today.text)

#明日の天気
tenki_tomorrow = soup.select_one('#main > div.forecastCity > table > tr > td + td > div > p.pict')
print ("明日の天気は"+tenki_tomorrow.text)

#一瞬で画面が消えないよう入力されるまで待機
input()
```

以下、実行結果
<img width="734" alt="実行画面.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/309045/64dd86f6-728c-f2db-9fa4-9fe6fb7e57b0.png">



<h2>終わりに</h2>
このコードを元に色々できると思います。
定期的に取得するなどはこの記事に加筆するかラズパイサイネージの記事に書くと思います。
あと環境の問題で実行できなかった等あると思うのでそのあたりは後々加筆します。