OmniAICreator/Qiita-1.07M huggingface dataset:
switch文撲滅委員会はこの度match式推奨委員会になりました

## はじめに

昔こんな記事を書いたことがあります。
[switch文撲滅委員会](https://qiita.com/yamamoto_hiroya/items/44a826501c71dc261766)
switch文には罠が多く極力使わない方が良い、ということを言いたくて書いたものです。
この度PHP8から`match式`が使えるようになりました。
switch文を撲滅してmatch式を推奨していきたいのでこの記事を書きました。

## match式とは

[公式ドキュメント](https://www.php.net/manual/ja/control-structures.match.php)
switch文と比較すると以下の違い（利点）があります。

||switch|match|
|:-:|:-:|:-:|
|比較|曖昧|厳密|
|break|必要|不要|
|例外値|スルー|例外|

## サンプルコード

### 比較

前回の記事で出したサンプルコード

```php:sample1_switch.php
<?php
$sample = 1;
switch($sample){
case true:
    echo 'これはtrueです'."\n";
    break;
case 1:
    echo 'これは数値の1です'."\n";
    break;
default:
    echo 'これは1ではありません'."\n";
    break;
}

// 結果
// これはtrueです
```

このコードでは曖昧比較であるためcase trueの部分に入ってしまうのが課題でした。
ではmatch式で書くとどうなるでしょうか？

```php:sample1_match.php
<?php
$sample = 1;
$return_value = match ($sample) {
    true    => 'これはtrueです',
    1       => 'これは数値の1です',
    default => 'これは1ではありません',
};
var_dump($return_value);

// 結果
// string(25) "これは数値の1です"
```

自動で厳密比較をしてくれました。

### フォールスルー

```php:sample2_switch.php
<?php
$sample = 'a';
switch($sample){
case 'a':
    echo 'これはaです'."\n";
case 'b':
    echo 'これはbです'."\n";
case 'c':
    echo 'これはcです'."\n";
default:
    echo 'これはa,b,cではありません'."\n";
}

// 結果
// これはaです
// これはbです
// これはcです
// これはa,b,cではありません
```

このコードではbreakを書いていないため全ての分岐が評価されるのが課題でした。
ではmatch式で書くとどうなるでしょうか？

```php:sample2_match.php
<?php
$sample = 'a';
$return_value = match ($sample) {
    'a'     => 'これはaです',
    'b'     => 'これはbです',
    'c'     => 'これはcです',
    default => 'これはa,b,cではありません',
};
var_dump($return_value);


// 結果
// string(16) "これはaです"
```

breakなしでもフォールスルーされませんでした。

### 例外値

```php:sample3_switch.php
<?php
$sample = 'd';
switch($sample){
case 'a':
    echo 'これはaです'."\n";
case 'b':
    echo 'これはbです'."\n";
case 'c':
    echo 'これはcです'."\n";
}

// 結果なし
```

defaultが未定義でどのケースにも合致しない場合、switch文ではスルーされていました（何も起きない）
ではmatch式で書くとどうなるでしょうか？

```php:sample3_match.php
<?php
$sample = 'd';
$return_value = match ($sample) {
    'a'     => 'これはaです',
    'b'     => 'これはbです',
    'c'     => 'これはcです',
};
var_dump($return_value);

// 結果
// PHP Fatal error:  Uncaught UnhandledMatchError: Unhandled match value of type string in sample3_match.php:3
// Stack trace:
// #0 {main}
//   thrown in sample3_match.php on line 3
```

どのケースにも合致しないとUnhandledMatchErrorの例外が投げられます。
これで意図しないケースにすぐに気付くことができ、より堅牢にコードを作成することが可能となりました。

## まとめ

match式は今までのswitch文の罠だった部分をキレイに回避できるため、大変おすすめです。
PHP8を使っている方は是非match式で書いていきましょう！

## 付録

ローカルの環境をphp8にしたくなかったので挙動を試せるdocker環境を用意しました。
ご自由にお使いください。
https://github.com/yamamoto-hiroya/php8_practice
サーバーとデプロイの知識

#本記事について
プログラミング初心者がサーバーとデプロイに関する知識を学んだので、その備忘録として載せております。

どうかお手柔らかにお願いいたしますm (- -)(_ _)ペコリ

##サーバー
・サービスや機能を提供する側のコンピュータのこと

・クライアントの要望に応じたデータを送るプログラム・ソフトウェア
（Ruby on Railsの開発、サーバーサイド開発）

・Webサービスなどを提供するパソコン本体
（Herokuではレンタルして、作成したアプリを展開するパソコン本体）

・例）レンタルサーバー、VPS、オンプレミス、クラウド

##クラウド
・「クラウドコンピューティング」の省略表現

・外部にデータを置いて、ネットワークを介して利用する形態になっているシステム

・インターネットなどのネットワーク経由で接続できる様々なサービス

・コンピュータ資源の利用形態

・クラウドもどこかにハードで自社製のサーバーをおいて管理しており、ソフトウェアを運用している。ソフトとハードはセット。

・例）SaaS、PaaS、IssS

##デプロイ
・使用できる状態にすること

・ネットワークを通じて、アプリケーションのシステムを公開し、利用可能な状態にすること作ったプログラムをしかるべき場所に置いたり、設定して、使える状態にすること


例）カナリアリリース、ブルーグリーンデプロイメント、イミュータタブルデプロイメント

##レンタルサーバー
・インターネット上に情報を公開するためのサーバーを、業者からレンタルして利用するサービス。

・業者からサーバーをレンタルして使う。低コスト。

・１台のパソコンを複数のユーザーでわけて使うような仕組み

##VPS（Virtual Private Server）
仮想的なパソコン環境を１人１台用意し提供する。
レンタルサーバーに比べ使用方法の自由度は高い。

##オンプレミス
サーバーなどの情報システムを使用者が管理する設備内に物理的に設置して運用すること
自社の中で情報システムを保有し、自社内の設備によって運用すること（自社で完結。メンテナンス等は省く）

##SaaS(Software as a Service)
・インターネット経由で提供されるソフトウェアパッケージ（既存品のソフトウェア、既にあるソフトウェア）

・クライアント側に導入せずにサービスを提供しているサーバーに直接アクセスをしてサービスを利用する状況を指す

##PaaS(Platform as a Service)
作成したアプリケーションなどをネットワーク上に公開するためのプラットフォーム（動かすために必要な土台となる環境、土台）を提供するサービス

##IaaS(Infrastructure as a Service)
ユーザーに仮想化したCPUやメモリ、ストレージなどをインターネット経由で提供するサービス

##仮想サーバー
・１台のサーバーで仮想的に複数のサーバーを稼働させる仕組み

・処理速度の向上やコストの低減などの利点

・一般的なサーバーは１つのサーバーに１つのOSが稼働する

##コンテナ
・他のユーザーから隔離された実行環境

・コンテナはホストOS上に作成されるもの
→コンテナは１つのOSで稼働するためメモリの消費は少なく、ストレージの使用もわずかで済む。

したがって、仮想サーバーのデメリットを解決する。仮想サーバーに比べ起動時間が短く、同じ性能のハードウェアであればより多くのコンテナを同時に動かす。

##Docker（コンテナの１種）
コンテナ化を用いてアプリケーションを開発、配置、実行するためのオープンソフトウェア

##カナリアリリース
・一部のユーザーにのみ新機能を公開でき、新しいバージョンにバグがないかを検証する手法

・新しい機能にバグがあったとしても、サービス全体には影響を及ぼさずに済む。

##ブルーグリーンデプロイメント
・仮想サーバーを用いて２つの本番環境を用意する。

・それぞれのバージョンを設定することができるデプロイの運用方法。

・ブルーとグリーンのサバーがあったとして、どちらかに問題があればどちらかにロールバックできる。同じ工程を行うことで継続的なデプロイができる。

・最新でリリースしていない他方の運用コストがかかってしまうこと。

##イミュータブルデプロイメント
・常に変更を行わない環境構築、古い環境を削除し、デプロイ時に新しい環境に切り替える手法

・コンテナの技術を用いることで環境自体を新しく構築する作業が容易

・古い環境は削除するのでコストも低減

以上です
【Vue.js + TypeScript】autonakaでフリガナを自動的に別フィールドに入力させる

### はじめに
- Vue.js + TypeScriptを使い、ユーザー名入力フォームなどで日本語入力をした際に、自動で別フィールドにふりがなorフリガナを入力できるようにしました。

### 実装コード
```vue
<template lang="pug">
label 氏名
input#last_name(name='last_name' type="text" placeholder="山田" @input="handleLastNameInput")
input#first_name(name='first_name' type="text" placeholder="一郎" @input="handleFirstNameInput")

label フリガナ
input#last_name_furigana(name='last_name_furigana' type="text" placeholder="ヤマダ")
input#first_name_furigana(name='first_name_furigana' type="text" placeholder="イチロウ")
</template>

<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import * as AutoKana from 'vanilla-autokana';

let autokanaLastName: any;
let autokanaFirstName: any;

@Component
export default class Hoge extends Vue {
  @Prop() userInfo!: {
    first_name: string,
    last_name: string,
    first_name_furigana: string,
    last_name_furigana: string
  };

  mounted() {
    autokanaLastName = AutoKana.bind('#last_name', '#last_name_furigana', { katakana: true });
    autokanaFirstName = AutoKana.bind('#first_name', '#first_name_furigana', { katakana: true });
  }

  handleFirstNameInput() {
    this.userInfo.first_name_furigana = autokanaFirstName.getFurigana();
  };
  handleLastNameInput() {
    this.userInfo.last_name_furigana = autokanaLastName.getFurigana();
  };
}
</script>

<style lang="scss">
</style>

```
if → unlessへの書き換え

## 初めに
rubyの問題を私なりの解説で解いていこうと思います。
###問題
次のif文をunlessというメソッドを用いて書き換えてください。

```
if a + b > 0
  puts "計算結果は0より大きいです"
end
```
ではまず用語について説明していきたいと思います。
###unlessとは
unlessとはif文とは逆でfalseの場合に処理が実行されます。公式リファレンスもあるのでそちらもご覧ください。
[公式リファレンス](https://docs.ruby-lang.org/ja/latest/doc/spec=2fcontrol.html#unless)
### 解答
解答は簡単です。if文と逆となので計算式を逆にしifをunlessにすればいいのです。

```
unless a + b < 0
  puts "計算結果は0より大きいです"
end
```
上記の文で正解っぽく見えますが実はこれは不正解になります。
この場合だと０の際に条件式がfalseとなり文字列が表示されてしまいます。<を<=にして０以上とすれば０が含まれなくなります。よって以下のコードが正解になります。

```
unless a + b <= 0
  puts "計算結果は0より大きいです"
end
```
Kubernetes の環境を作りたい [Raspberry Pi 編 3]

[2021/3/31 追記]
32 bit のイメージで作業を進めてしまったところ Docker のインストールでどんづまったので 64 bit でやり直すことにしました。

(64 bit: aarch64)
http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos-altarch/7.9.2009/isos/aarch64/images/

(32 bit: armhfp(armv7l))
http://ftp.yz.yamagata-u.ac.jp/pub/linux/centos-altarch/7.9.2009/isos/armhfp/
※ 以下の記事で利用したもの。

前回

https://qiita.com/yosukei3108/items/eb5815bf90110625ce0a


今回はマスター ノードの設定です。
このノードのみ Pi 4 B ですが、幸いワーカー ノードの Pi 3 B+ に使ったのと同じイメージで普通に立ち上がってくれました。

<h1> NW 設定 </h1>
まずは Wi-Fi を使えるようにします。ここでも Hypriot では yaml ファイルを編集するところ、CentOS 7 では nmcli を利用して設定を進めていきます。

利用可能な Wi-Fi をリストアップするのは以下のコマンドが使えました。

```console
# nmcli dev wifi list
```

接続するにはこんな感じで。

```console
# nmcli --ask dev wifi connect <SSID>
```


ワーカー ノードで行った設定に加えて、マスター ノードでは NAT の設定も行います。
コメントのみ記述されている /etc/sysctl.conf ファイルに

```console
net.ipv4.ip_forward=1
```


と追記して、sysctl -p 等で設定を反映、cat /proc/sys/net/ipv4/ip_forward などで正しく設定が反映されたか確認します。
なお、普段日本語配列のキーボードしか使わないので、記号の入力にてこずってしまいました。。。

あとは iptables の設定ですが、本に記載された内容以外に以下等の記述を参考に、rp_filter の設定も編集しました。
最小限の許可になっているかちょっとわからないので、ここは追ってよく確かめたいです。。
(セキュアでない設定を広めてしまうといけないので、具体的に投入した設定値等は一旦記述しないでおきます)

https://qiita.com/kanejun/items/4f7a5fe7c811a77c0b7b

https://mano.xyz/2008/


ともあれ、何とか所望の構成が出来上がってきました。ここまで Kubernetes 登場せず。

続く

https://qiita.com/yosukei3108/items/356fa799cab4ec0d0268
ユーザーの利用しているバージョンを保持するパッケージ管理APIの案

クライアント側のアップデート確認や利用規約・プライバシーポリシーなどの規約類の管理に使うAPIの案。

## 最新のバージョンを取得する

```
GET /packages/{package:name}/releases/latest?current_version={version}
```

200 { version, notes, publish_date }

`current_version` を渡したらそれより上のバージョンで絞り込むイメージ。バージョンで並べると面倒なので publish_date (公開日) で並べるのがいいと思う。
内部的には期限がきたら廃止するexpire_dateとかあってもいい。

## 特定のバージョンを取得する

```
GET /packages/{package:name}/releases/{release:version}
```

200 { version, notes, publish_date } (有効なバージョン)
204 (無効なバージョン)

有効性の確認に使う。自分の使っているバージョンが無効なバージョンなら強制アップデートや警告とか。無効な場合の処理はクライアントに任せる。

## ユーザーの利用しているバージョンを取得する

```
GET /packages/{package:name}/current
```

200 { version }
204 (現在のバージョンを登録していない)

規約類とか同意したり、クライアントの使用バージョンを登録したりするときにuser:package間で紐付ける。
対応するversionがない場合はバリデーションエラーにするのがいいか。

## ユーザーの利用しているバージョンを登録する

```
POST /packages/{package:name}/current
(version: {version})
```

200

version渡さずに、latestにアップデートするだけでもいいかも。

## ユーザーの利用しているバージョン情報を破棄する

```
DELETE /packages/{package:name}/current
```

204

使わなかったらなくてもいいと思う。
SQL テーブルの結合

こちらの記事では、私が学んだSQLについて記載しております。
自身の忘れないためのメモとしております。
間違っている部分もあるかもしれませんので、ご了承ください。

#テーブルの結合とは
#####テーブル同心をある条件で結合することにより、[正規化なし]の状態を作り出すこと。

####テーブルの[正規化]は重要！！
・データ管理が容易になる　
・データ容量の削減
→特別な意図がなければ、データは正規化する。

```
例
ユーザー情報の中で都道府県のデータを取得する際に
”文字列”でデータを保存してしまうと、データに負荷がかかる。
テーブルは別にして、都道府県のみのデータにすることで、”文字列”をまとめられる。

[正規化なし]
テーブルusers　
id  name  都道府県
１　　田中　　大阪
２　　鈴木　　大阪
３　　佐藤　　大阪

[正規化あり]
テーブルusers　　　　　　　　テーブル都道府県
id  name  都道府県　　　　id   都道府県
１　　田中　　　２　　　　　　１　　東京
２　　鈴木　　　２　　　　　　２　　大阪
３　　佐藤　　　２　　　　　　３　　京都

テーブルを分け正規化することで、データ管理がしやすくなり、容量を削減可能。
もし今後、都道府県の「大阪」が「太田」と変更された場合でも、テーブル都道府県の変更を行えばすぐに対応可能になる。
```

#内部結合　inner joinで結合可能

```
＊＊＊記述方法＊＊＊
select
     テーブル名a.id,
     テーブル名b.表記したいカラム名　　　←テーブル名b.nameなど
from
     テーブル名a
inner join
     テーブル名b
on テーブル名a.id = テーブル名b.a_id;　←２つのテーブルのidを結合する

＊＊＊テーブル名は省略も可能＊＊＊
テーブル　users, orders

select
    u.id,
    u.name,
    o.name
from 
    users u   ←users as uとして変更可能。asは省略も可能なので左のような記載になる。
inner join
    orders o
on u.order_id = o.id;
```

#外部結合　left outer join/right outer join
#####inner joinではnullは表記せず、left outer joinではnullも表記する

```
select
	u.last_name,
    u.id,
    o.user_id,
    o.id
from
	users u
-- inner join
left outer join
	orders o
on u.id = o.user_id
order by u.id;
```

#３つ以上のテーブルの結合　inner join連続で記述

 ```
テーブル　users, orders, orders_details
select	
      u.id,
      u.name,
      o.name,
      od.price
from
	users u
inner join
	orders o
on u.order_id = o.id
inner join
	orders_details od
on od.order_id = o.id;

一対多もしくは多対多の関係は、確認して行うこと！！！
```

#テーブルの足し算　union/union all
```
テーブル１とテーブル２で列数（カラム名）を合わせる必要があります！！
テーブル　users ,adomin
select
    email,
    name,
    gender
from
    users
union      　←unionのみだと重複は省略。union allだと重複も表記される。
select
    email,
    name,
    gender
from
	admin
;


***条件分岐*** order byのみ全体の１つしか記述できない！！！！！！！
select
	email,
    last_name,
    first_name,
    gender
from
	users
where
	gender = 1
union
select
	email,
    last_name,
    first_name,
    gender
from
	admin_users
where
	gender = 2
order by gender　　　　←order byは全体記述の最後！
;
```




#補足
###主キー/外部キー
・主キー・・１つの行を特定できる列（カラム）のこと
・外部キー・・・他のテーブルの関連付けに使う列（カラム）のこと

記述順序

```
記述順序　　　　　　　　　　　　　　　　　　　実行順序
select・・・・・取得カラムの指定　　　　　　　　　　from・・・・・・・対象テーブルの指定
from・・・・・・・対象テーブルの指定　　　　　　　　　結合処理
結合処理　　　　　　　　　　　　　　　　　　　 where・・・・・・絞り込み条件式の指定
where・・・・・・絞り込み条件の指定　　　　　　　　　group by・・グループ化の条件を指定
group by・・グループ化の条件指定　　　　　　　　having・・・・・グループ化した後の絞り込み条件を指定
having・・・・・グループ化した後の絞り込み条件指定  select・・・・・取得カラムの指定
order by・・・並び替え条件指定　　　　　　　　　 order by・・並び替え条件を指定
limt・・・・・・・・取得する行数の制限　　　　　　　　 limit・・・・・・取得する行数の制限

```
【Ruby】先頭と末尾の空白文字を指定して取り除く方法

#プログラミング勉強日記
2021年3月29日
[昨日の記事](https://qiita.com/mzmz__02/items/68640929a8263f17043b)ではstripメソッドの使い方について扱った。Stripメソッドは先頭と末尾の空白文字を取り除くメソッドである。今日は取り除く空白文字の位置を指定して削除する方法を簡単にまとめる。

#先頭の空白文字を取り除く方法
　listripメソッド(listrip!メソッド)を使うと、先頭の空白文字を取り除く。listripメソッドは、取り除いた結果として新しい文字列を作成する。lstrip!メソッドは元の文字列に上書きする形で書きかえる。

```ruby:使い方
str = " Hello World "
listripStr = str.lstrip
#=> "Hello World "

str = " Hello World "
str.lstrip!
#=> "Hello World "
``` 

#末尾の空白文字を取り除く方法
　rstripメソッド(rstrip!メソッド)を使うと、末尾の空白文字を取り除く。rstripメソッドは、取り除いた結果として新しい文字列を作成する。rstrip!メソッドは元の文字列に上書きする形で書きかえる。

```ruby:使い方
str = " Hello World "
listripStr = str.rstrip
#=> "  Hello World"

str = " Hello World "
str.rstrip!
#=> " Hello World"
``` 

#参考文献
[空白文字を取り除く](https://www.javadrive.jp/ruby/string_class/index11.html)
bs4Dashチュートリアル①

# はじめに

bs4Dash なるライブラリを知ったので、使ってみる。ADdminLTE3 という Bootstrap ベースで作られた CSS フレームワークを用いて[ここ](https://dgranjon.shinyapps.io/bs4DashDemo/)にあるようなきれいな可視化ダッシュボードが作成できるらしい。 Bootstrap 4 [bs4Dash](https://rinterface.github.io/bs4Dash/) と [GitHub RinteRface/bs4Dash](https://github.com/RinteRface/bs4Dash) を参考にした。

# bs4Dash 2.0.0 のインストール

バージョンは 0.5.0 と 2.0.0 があったので、最新の 2.0.0 をインストールする。両バージョンの間に互換性はないようなので、バージョンを意識しておく。[GitHub RinteRface/bs4Dash](https://github.com/RinteRface/bs4Dash) にしたがって、以下コマンドにてインストールする。devtools は参考記事には書いていないが、低いバージョンのままインストールを進めた際にエラー（どんなものかは忘れた）が起きたので、再度インストールしておく。

```
install.packages("devtools")
remotes::install_github("rstudio/htmltools")
remotes::install_github("rstudio/shiny")
remotes::install_github("rstudio/thematic") # optional for plot autocolor
devtools::install_github("RinteRface/bs4Dash")
```

# bs4DashGallery

以下コマンドで例を見ることができる。

```
library(bs4Dash)
bs4DashGallery()
```

とのことだったが、以下エラーが出て開けず。

```
Error in buildTabset(..., ulClass = paste0("nav nav-", type), id = id,  : 
  Tabs should all be unnamed arguments, but some are named: .list
```

'~/R/x86_64-pc-linux-gnu-library/4.0/bs4Dash/examples/showcase/app.R' 
 にソースコードが置いてあったので、[ここ](https://dgranjon.shinyapps.io/bs4DashDemo/)と照らし合わせながらそのコードを真似していく。関数がどのようなものかわからない場合は `?bs4DashPage` のようにヘルプを多様していくとよい。
IAM Access Analyzer とは

## 勉強前イメージ

IAMのアクセスした分析見れる的な？

## 調査

### IAM Access Analyzer とは

リソースのポリシーを確認して、意図せぬ公開設定などがされていないか
検出し、可視化する機能になります。

### 対応しているリソース

- s3
- IAMロール
- KMSキー
- lambda関数・レイヤー
- SQSキュー
- Secrets Managerシークレット

※2021/03/29時点
詳細は [AWS Identity and Access Management のユーザガイド](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/what-is-access-analyzer.html) をご確認ください

### 設定方法

- マネジメントコンソールから確認

IAM > アクセスレポート > Access Analyzer から設定することが出来ます

![2021-03-29 IAM Management Console - Google Chrome 2021-03-29 15.44.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/153f5c2e-05f9-e05f-9521-0c981929efb6.png)

- 設定内容

以下が設定内容になります。
名前だけ指定するだけでアナライザーを作成できます。

![2021-03-29 IAM Management Console - Google Chrome 2021-03-29 15.57.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/f4c648c3-7b0e-e136-8bd1-6ded4e6684cb.png)


### 費用

IAM Access Analyzer の利用費用は、追加料金無しに使用できるので
設定し、確認するのが良いかと思います。

### 注意点

- サポートされているリソースが限定される

すべてのリソースがサポートされているわけではないので、
これを有効にするだけで大丈夫、とはならないです

- リージョン単位の設定

複数リージョン利用する際は、リージョンごとに設定を有効にする必要があります。

## 勉強後イメージ

なんかAWS config とか似たようなことしてなかったっけ・・？
また今度気が向いたら勉強します。
とりあえずそんな機能があるってことを知った。

## 参考

- [IAM Access Analyzerと既存の機能を比較してどう使っていくか考察してみた #reinvent](https://dev.classmethod.jp/articles/iam-access-analyzer-vs-config-rules/)
- [【はじめてのAWS】AWS IAM Access Analyzer を設定しよう](https://blog.serverworks.co.jp/tech/2020/07/01/iam_access_analyzer-2/)
- [AWS IAM Access Analyzer を使用する](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/what-is-access-analyzer.html)
QR コード サンプル集

# QR コードのサンプルです

zbarimg の動作確認目的で作りました。

半角英数字

![han.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/195a6764-1752-4efd-a05c-b9d670dbbe0f.png)

`"%01%02%03"` のような特殊コードを含む

![010203.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/4cfea95c-909e-6e75-1397-a41daa8c5bde.png)

XML の CDATA セクションで使用できない文言 `]]>` を含む

![nocdata.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/364126/9071dafe-090e-994b-8bce-26e40241ca87.png)

※ [libqrencode](https://github.com/fukuchi/libqrencode/) ([QRCodeActiveXControl](https://github.com/HiraokaHyperTools/QRCodeActiveXControl) と Microsoft Excel) を使用して生成
オブジェクト指向が分からない…乃木坂・櫻坂・日向坂に頼ってみた

#オブジェクト指向の定義に入る前に…

**明確な定義はない!**
ということを頭の隅に入れておいてください。

例えば、愛とは？恋とは？乃木坂の良さとは？
って言われてもその答えは人それぞれで、一つに定まらないのと同じです。

なので、**ざっくり雰囲気を理解すること**が大事だということを覚えてください!


#オブジェクト指向とは？
**概念・考え方の一つです!**
(目に見えない・触れない。つまり無体物なのです！)

## どんな概念・考え方？
いかに**効率よく**開発を行うかを突き詰めた考え方!

例えば、エンジニアチームがプロジェクトを行うときは、**"オブジェクト指向に基づいてプログラムを作成しましょう!"**と言って作業に取り掛かります。

## 効率の良い考え方とは？
### ①カプセル化

**他のプログラムから干渉されないようにする考え方!**

乃木坂・櫻坂・日向坂のOFFICIAL WEB SITEを作る際に、
乃木坂のサイトのプログラムと櫻坂のサイトのプログラムと日向坂のサイトのプログラムがそれぞれ独立した環境にすること!
(**互いに"干渉"を受けない**ようにすること!)




### ②継承

同じようなプログラムは**"共通化"**して使う考え方！

乃木坂・櫻坂・日向坂のOFFICIAL WEB SITEのベースとして
個人の**名前・生年月日・身長など**の情報が共通して存在しています。

であれば、
**初めに乃木坂のOFFICIAL WEB SITEを作った際**に、櫻坂・日向坂でも共通化できる部分は同じコードを書かないで、継承しようという考え方です。



<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/f0c782b4-8bde-a3bd-1466-7615a09b739b.png" class="img" alt="自然言語処理の流れ"><img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/bcdfe94f-2dc8-f645-3898-958baa2f8722.png" class="img" alt="自然言語処理の流れ"><img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/daad79e4-2a0d-aa63-bb7b-b4367227eccb.png" class="img" alt="自然言語処理の流れ">








### ③ポリモーフィズム

汎用的な形に出来るようにしましょうという考え方！
**"②継承"**によってベースを作成した後に、
独自に派生したプログラムを追加・修正出来るようにする考え方!

例えば、
**【変更前】**   >>>>>>>>>>>>>>>>>>>>>**【変更後】**
<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/230d4d9d-4b54-9661-8cda-744d6ed3db53.png" class="img" alt="自然言語処理の流れ"><img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449715/02cfc6cd-7b92-699d-73d2-2312dcb971c5.png" class="img" alt="自然言語処理の流れ">
[iOS14]UITableViewCellに置いたボタンが押せなくなった

かなり昔に書かれたObjective-Cソースコードで、iOS14になってから発生したバグについてです。

## 何が起きたか

UITableViewCellサブクラスの実装で、コードでレイアウトしていたソースがありました。
こんな感じです。

```objc
- (void)awakeFromNib {    
    [super awakeFromNib];

    UIButton *button = [[UIButton alloc] init];
    [button addTarget:self action:@selector(doSomething:) forControlEvents:UIControlEventTouchUpInside];
    [self addSubView: button];

}

```

このボタンが、iOS14ではなぜか押せなくなりました。

## 原因

iOS14からは、UITableViewCell.contentView(UITableViewCellContentView)がUITableViewCellの大きさになっており、かつ一番手前に来るようになりました。
なので、上記のソースでは`UITableViewCell`自体に`addSubView`していたため、UIButtonよりも前面に`UITableViewCellContentView`が来てしまい、UIButtonが押せなくなりました。

## 解決方法

```objc
    //[self addSubView: button];
    [self.contentView addSubView: button];
```

これで押せるようになります。

## 参考資料

https://stackoverflow.com/questions/63932279/an-extra-uitableviewcellcontentview-overlay-appears-in-a-tableview-on-ios-14-pre
SUBSTRING関数で右端の文字から何文字か抽出したい時

SUBSTRING関数で右端の文字から何文字か抽出したい時
→LENGTH関数を利用

例えば、
$hoge=hogehoge@yahoo.co.jpのjpを抽出したい場合は
SUBSTRING($hoge, LENGTH($hoge)-1, 2)とでとれる
備忘録 - Withステートメント 【VBA】

##目的
繰り返し記述するオブジェクトをまとめることで、コードの簡素化・高速化を図る

##文法
全体をWith - End Withで挟み、各処理はドットから文を始める

```vb
With オブジェクト
.プロパティ = 値　（又は .メソッド）
.プロパティ = 値　（又は .メソッド）
.プロパティ = 値　（又は .メソッド）
End With
```
#実例
A10セルからA15セルまでの文字のフォントをYu Gothic、文字サイズ15に、太文字に変える処理

```vb
    Dim TestRange As Range
    Set TestRange = Range("A10:A15")
    With MyRange.Font
        .Name = "Yu Gothic"
        .Size = 15
        .Bold = True
    End With
```
DX とは

テクノロジーの発展現代では、確か「デジタルトランスフォーメーション（DX：Digital transformation）」という言葉をよく聞かれているでしょう。ITの進化にともなって、新たなサービスやビジネスモデルを展開することでコストを削減し、働き方改革や社会そのものの変革につなげる施策を総称したものです。
しかし、DX以外では、「デジタル化（Digitization）」という定義もよく語られています。デジタルトランスフォーメーションの内容や、日本で定められている定義を見ると、デジタル化とそう変わらないように見えるかもしれません。多くの方がこれらの定義を迷っているでしょう。
ただし、デジタル化とデジタルトランスフォーメーションは、デジタルで行う範囲や考え方が違います。それらの関係を時系列で並べると、デジタル化からデジタルトランスフォーメーションまでの順序です。「デジタル化」は「[デジタルトランスフォーメーション](https://kaopiz.com/ja-news-about-digital-transformation/)」を目標としたときの手段といった関係性です。
簡単にまとめると、デジタル化は作業や過程であり、デジタルトランスフォーメーションは、社会全体を変えようとする概念です。デジタル化は、デジタルトランスフォーメーションを進める過程の一部であるともいえます。
このように、デジタルトランスフォーメーションは、ただデジタル化を進めるだけではありません。 企業や社会全体の考え方を変えるような、大きな変革です。
コンピュータのメモリについて

コンピュータの成り立ちとか、基礎とか理解できればこれから先どんなことをやるにしても理解が早いのではないかと思い勉強を始めました。
[キタミ式イラストIT塾 基本情報技術者](https://www.amazon.co.jp/%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88IT%E5%A1%BE-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E4%BB%A4%E5%92%8C03%E5%B9%B4-%E3%81%8D%E3%81%9F%E3%81%BF%E3%82%8A%E3%82%85%E3%81%86%E3%81%98/dp/4297117819)で勉強させていただいております。

まとめます！


## メモリの分類

メモリには大きく分けてRAMとROMが存在します。
CPUが命令を実行するためにデータを読み出す際に利用します。

#### RAM

RAMはRamdom Access Memoryの略で、`ランダムに読み書きできるメモリ`のことを言います。
電源を切ると中身が消える揮発性の性質を持ちます。

以下の2種類があります。

| 名前               | 概要                                                                       |
|:-----------------:|:---------------------------------------------------------------------------|
| DRAM(Dynamin RAM) | 主記憶装置に用いられるメモリ。CPUが命令を取り出して記憶しておく装置。定期的なリフレッシュが必要。  |
| SRAM(Static RAM)  | 小容量のキャッシュメモリとして用いられるメモリ。リフレッシュの必要なし。                        |


#### ROM

ROMはRead Only Memoryの略で`読み出しだけのメモリ`のことを言います。
電源を切っても中身が消えない不揮発性の性質を持ちます。

ここで私は「読み出しだけということは書き込みできないの？」と疑問に思いました。
何故ならSDカードなどのメモリはROMという認識で、書き込みできるメモリだから。

本の解説では以下の2種類があるとのことでした。

| 名前                    | 概要                                                                 |
|:----------------------:|:---------------------------------------------------------------------|
| マスクROM                | 読み出し専用のメモリ。製造時にデータを書き込み以降は読み出しのみの利用。書き換えは不可。 |
| PROM(Programmable ROM) | ユーザーの手で書き換えることができるROMでさらに以下の3種類がある。                  |

なるほど。
私がROMと理解していたのはPROMの方で、元々ROMと言えばマスクROMを指していたということですね。
マスクROMで分かりやすい例としては家電製品など。
あらかじめ決まった内容をROMに書き込んでおき、それを読み出してCPUが処理をすると考えれば分かりやすかったです。

さらにPROMは下記のような種類があります。

| 名前                        | 概要                                                          |
|:--------------------------:|:--------------------------------------------------------------|
| EPROM(Erasable PROM)       | 紫外線でデータを消去して書き換えることができる。                          |
| EEPROM(Electrically EPROM) | 電気的にデータを消去して書き換えることができる。                          |
| フラッシュメモリ(SDカード等)       | EEPROMの一種。全消去ではなくブロック毎にデータを消去して書き換えることができる。 |


## キャッシュメモリ

よく聞く`キャッシュ`について。
私の認識では`一度アクセスした機能はキャッシュとして残しておくことでその機能へのアクセス時に時間や通信量を節約できる`という感じでした。

内容は大体合っているのですが、何故それが必要かというと

`CPUは動作に必要なデータやプログラムをメモリから取り出しているけど、メモリはCPUと比べて処理が遅いのでそれを補うためにキャッシュメモリを配置している`

とのことです。
CPUがメモリからデータを読み込む際にキャッシュメモリにも同じようにデータを読み込ませておき、
また同じデータが必要になったらメモリから読み出しするのではなくキャッシュメモリから読み出すことで動作を早くしているという動きになるということですね。

で、そのキャッシュメモリは1つではなく外部にもキャッシュを置いておくことで容量を大きくできます。その役割をしているのがSRAMです。

以上です。
Ubuntu上でC言語やC#を各種エディタで書いてみる

Linuxは、狭義にはLinuxカーネル、広義にはそれをカーネルとして用いたオペレーティングシステムを指します。LinuxはUnix系オペレーティングシステム (OS) の1つと言えます。
UbuntuはLinuxディストリビューションの1つです。初心者からベテランまで、幅広く利用されています。

本稿では、C言語やC#のプログラムを各種エディタを用いて作成します。

### 参考URL
VirtualBox上にUbuntu 20.04をインストールする方法は、以下のリンクが参考になると思います。
[プログラマーのためのUbuntu](https://daimaohsx.dip.jp/wordpress/2020/04/23/ubuntu4programmer/)

## C言語のコンパイル環境を構築しよう

端末を起動し、以下を実行します。

```bash
sudo apt update
sudo apt install build-essential
```

## geditでC言語を編集してみる

geditはUbuntu標準のエディタで、初心者向けと言えます。ディスクトップ最上段の「アクティビティ」をクリックし、「ged」と入力してgeditを起動します。

![無題のドキュメント-1-gedit_004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185720/c8196414-6603-2ef2-af39-06123bfe6a99.png)


まず、geditの下の「なし」をクリックし、メニューから「C」を選択します。そして次のコードを入力します。

```c:sample01.c
#include <stdlib.h>
int main()
{
  system("/bin/cat /etc/lsb-release");
}
```

すると、エディタ上のコードはシンタックスハイライトされて表示されます。
次に、gedit上部の保存ボタンをクリックし、「sample01.c」として保存します。そして次のコマンドでコンパイルし、実行してみます。

```bash
gcc -o sample01 sample01.c
./sample01
```

下記のように、Ubuntuのバージョン情報が表示されれば成功です。

```bash:実行結果
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION=”Ubuntu 20.04 LTS”
```

## C#の編集と実行に挑戦してみる

まず、C#をインストールします。

```bash:C#のインストール
sudo apt install mono-devel
```

今度はnanoというエディタを使ってみます。nanoはGUIを持たない、CUIベースのエディタです。リモートログインして作業するなど、GUIが使用できない環境でも使用できる利点があります。

```bash:nanoの起動
nano sample02.cs
```

以下のコードを入力します。

```c#:sample02.cs
using System;
using System.IO;
using System.Text;
class FileRead1 {
  static void Main() {
    StreamReader sr = new StreamReader(
                      　　　　　　"/etc/lsb-release");
    string text = sr.ReadToEnd();
    sr.Close();
    Console.Write(text);
  }
}
```

Ctrl+Oで”sample02.cs”という名称でファイルに書き込みます。次にCtrl+Xで終了します。nanoを終了したら、コンパイルします。

```bash:C＃のコンパイル
mcs sample02.cs
```

コンパイルが完了すると、”sample02.exe”というファイルが生成されています。”sample02.exe”を実行してみてください。

```bash:sample02の実行
./sample02.exe
```

先ほどのC言語のプログラムと同じ、Ubuntuのバージョン情報が出力されます。

## Visual Studio Codeのインストール

最後に、人気のVisual Studio Codeのインストール方法を紹介します。Ubuntu20.04ではsnapを用いてインストールできます。

```bash:VScodeのインストール
sudo snap install --classic code
code
```

![Welcome-Visual-Studio-Code_005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185720/a2563a0f-3762-9747-35ab-a70a0b903fc9.png)

## さいごに
Windows10の環境であれば、WSL（Windows Subusystem for Linux）のUbuntuから実行するのが手っ取り早いでしょう。
WSLのUbuntuを構築する方法は、よければ以下のリンクを参考にしてみてください。

[LinuxとWindowsの欲張りな環境を手にする](https://daimaohsx.dip.jp/wordpress/2020/05/10/linux-windows-wsl2-ubuntu2004/)
PHP fopenでファイルを開いて使用する

#fopenの例

##読み込み・追加の処理
####txt.txt

```
abcdefg
one,two,three
12345
アイウエオ
```

####fopen.php

```php
<?php 
//$変数名(ファイルポインタ) = fopen (“開きたいファイル名”, “オープンモード”);

// 読み込みモードでファイルを開く
$fp = fopen("txt.txt", "r");

// ファイルを1行ずつ取得する
while ($line = fgets($fp)) {
  echo "$line";
}

// ファイルを閉じる
fclose($fp);

//結果
/*
abcdefg
one,two,three
12345
アイウエオ
*/

//追加の記述（末尾に追加される）
$fa = fopen('txt.txt','a');
fwrite($fa,"\n".'5行目に追加');
fclose($fa);

$fr = fopen('txt.txt','r');
while($line = fgets($fr)){
    echo $line;
}
/*
//結果
/*
abcdefg
one,two,three
12345
アイウエオ
5行目に追加
*/
```

##上書きの処理
さらにこの記述の後に以下のコードを実行すると上書きされる。

```php
$fw = fopen('txt.txt','w');
fwrite($fw,'上書きして1行になります');
fclose($fw);

$fr = fopen('txt.txt','r');
while($line = fgets($fr)){
    echo $line;
}
fclose($fr);
//結果
//上書きして1行になります
```



###fopen()の第二引数について
以下の用途で指定する
[参考：phpドキュメント](https://www.php.net/manual/ja/function.fopen.php)
![スクリーンショット 2021-03-29 15.33.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/670884/731d5161-afe2-685a-d976-8ab127667938.png)
【kintone】kintone UI Component v1で連携するドロップダウンを作る

kintoneのドロップダウン、連携したいですよね？

というわけで今回は、`kintone UI Component v1` で2つのドロップダウンを作成して連携させるカスタマイズです。1つ目のドロップダウン選択によって、2つ目のドロップダウンの選択肢を入れ替えます。

# アプリの準備
スペースフィールドと文字列(1行)フィールドをフォームに配置します。

| フィールド種類 | フィールド名 | フィールドコード |
|:-:|:-:|:-:|
| スペース  |  -- | spDropdown  |
| 文字列(1行)  | 兄弟ドロップダウンの選択  | drText  |

![2021-03-29_14h21_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/f6a2a2f7-9c39-11c7-d85d-f0c10afee63e.png)

# JavaScript
前回同様、
新規追加＆編集画面表示のイベントでドロップダウンが動くようにします。

```js
kintone.events.on(
  ["app.record.create.show", "app.record.edit.show"],
  (event) => {
    // コードを書くところ
  }
);
```

## ドロップダウンを設置する

スペースフィールドの要素を取得し、
2つのドロップダウン兄弟を設置します。

```js
// ドロップダウンを設置するスペースフィールドの要素を取得
const spDropdown = kintone.app.record.getSpaceElement("spDropdown");


// ドロップダウン兄をつくる
const drAni = new Kuc.Dropdown({
  label: "ドロップダウン兄",
  requiredIcon: true,
  // items にはドロップダウンの中身を書く
  items: [
    { value: "メイン" },
    { value: "サイドメニュー" },
    { value: "ドリンク" },
  ],
  visible: true,
  disabled: false,
});

// スペースフィールドにドロップダウン兄を置く
spDropdown.appendChild(drAni);

// ドロップダウン弟をつくる（選択肢はからっぽ）
const drOtoto = new Kuc.Dropdown({
  label: "ドロップダウン弟",
  requiredIcon: true,
  // items は、からっぽにしておく
  items: [],
  visible: true,
  disabled: false,
});

// スペースフィールドにドロップダウン弟を置く
spDropdown.appendChild(drOtoto);
```

## ドロップダウン兄の選択で弟に選択肢を与える

ドロップダウン兄で選択した結果によって
ドロップダウン弟に選択肢を与えるようにしてみましょう。

ドロップダウン兄で**メイン**を選択したら、
ドロップダウン弟の選択肢は**てりやきバーガー、チーズバーガー、BLT**となります。
**サイドメニュー**を選んだ場合はドロップダウン弟の選択肢は**ポテト、ナゲット、サラダ**となります。

ドロップダウン兄で選択した内容でswitch文を作り、
選択肢は、drOtoto（ドロップダウン弟）のプロパティに直接設定してみました。

```js
// ドロップダウン兄を選択したときのイベント
drAni.addEventListener("change", () => {
  switch (drAni.value) {
    case "メイン":
      drOtoto.items = [
        { value: "てりやきバーガー" },
        { value: "チーズバーガー" },
        { value: "BLT" },
      ];
      break;
    case "サイドメニュー":
      drOtoto.items = [
        { value: "ポテト" },
        { value: "ナゲット" },
        { value: "サラダ" },
      ];
      break;
    default:
      drOtoto.items = [
        { value: "オレンジジュース" },
        { value: "コーヒー" },
        { value: "水" },
      ];
  }
});
```

## ドロップダウン弟を選択したら文字列(1行)フィールドに選択内容を表示する
ドロップダウン弟を選択した時のイベントも作成してみます。

文字列(1行)フィールドに選択したドロップダウンの値を表示します。
getとsetを使うのがポイントです。

```js
// ドロップダウン弟を選択したときのイベント
drOtoto.addEventListener("change", () => {
  const r = kintone.app.record.get();
  // ドロップダウンで選択した値を文字列(1行)フィールド（フィールドコード：drText）にコピー
  r.record.drText.value = drAni.value + "：" + drOtoto.value;
  kintone.app.record.set(r);
});
```

全体的なコードは以下です。

https://gist.github.com/juridon/283dd0656ef33a82bd3b1caf0c23a4ae

# 動作確認＆まとめ

このように2つのドロップダウンが連携したでしょうか？

![ab.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536148/2bf6517e-4bba-eddf-cae1-3325a76f0317.gif)

`kintone UI Component v1` はkintoneぽいデザインで色々なコントロールを作成することができ、
コーディングも簡単になるのでぜひ挑戦してみてくださいね＾＾
更新ファイルのリスト取得

基本的なことだと思いますが、苦労したので、備忘録として書きます。
間違っているものなどありましたらご指摘いただけますと幸いです。


ディレクトリ配下の全ファイルの中から、今日更新されたもの、もしくは、今さっき更新されたものの一覧を取得します。

##今日の更新ファイル一覧


```

find ディレクトリ名 -type f -mtime 0 -ls
ls -lrt ディレクトリ名 `find -type f -mtime 0` 
```

##10分以内の更新ファイル一覧

```

find ディレクトリ名 -type f -mmin -10 -ls
find ディレクトリ名 -type f -mmin -10 | xargs -r ls -lrt 
```

時間を変更するときは、-10のところをいじってください。

|-mminの引数|意味|
|:------:|:------:|
|-100|　現在から100分以内|
|+10|　10分より前（10分以内の逆）|


##注意点
ディレクトリ名を省略した場合、カレントディレクトリ以下の検索になります。
一番上の階層でこのコマンドを入力すると、このサーバ、PCで更新されたすべてのファイルリストを取得できます。

-lrtや、-lsは個人的に見やすくするために使用しているだけなので、適宜変更できます。
JavaScript が ECMAScript なわけ

JavaScript は元々 Netscape Communications のブラウザ Netscape Navigator 2.0 でのみ動作する独自スクリプト言語でした。翌年である 1996 年に Microsoft の Internet Explorer 3.0 でも動作互換のある JScript が実装され、JavaScript（および JScript）は急速に広まりました。翌年の 1997 年に Ecma International により、中核的な仕様が ECMA-262 として規格化され ECMAScript という名前が付けられました。

ではなぜ JavaScript は Ecma International で規格化されることになったのでしょうか。そしてなぜ ECMAScript とかいうダサい（失礼！）名前になったのでしょうか。

### 登場人物

MS: Microsoft
NC: Netscape Communications
W3C: World Wide Web Consortium
ISO: International Organization for Standardization
ECMA: European Computer Manufacturers Association

### 規格化に至った経緯

MS:「うちの IE に搭載したいから JavaScript ライセンスしてや」
NC:「無理っすｗｗｗ」
MS:「ほなええわ（真似して作ったろ）」
W3C:「JavaScript は Web の技術やから、うちらで標準化したるで」
NC:「お断りっすｗｗｗ」
W3C:「・・・（こいつ覚えとれよ）」
MS:「できたで、JScript や」
NC:「ヤバ、このままやと J++ みたいに取り込まれるで」
MS:「JScript に新機能付けたったでｗ」
NC:「ヤバヤバ、急いで標準化せんと」
NC:「W3C さん、うちらの JavaScript 標準化してください」
W3C:「どの口が言うとんねん、地獄に落ちろ（あー、スッキリしたでｗ）」
NC:「ISO さん、うちらの JavaScript 標準化してください」
ISO:「知らんがなｗ」
NC:「困ったで、どうしよ」
NC:「あっ、欧州に ECMA っちゅう団体があるで」
NC:「ちょっと遠いけど行ってお願いしてみよ」
NC:「ECMA さん、うちらの JavaScript 標準化してください」
ECMA:「ええで、ただし名前は ECMAScript な、これは決定事項や」
NC:「（ダサっ）・・・けど・・・しゃあないな・・・」

### 参考文献

2011 年に IBM の DeveloperWorks の記事をベースにしています。今はもう無いので（もったいない）、Web Archive へのリンクです。

- [ECMA-262 第 5 版](https://web.archive.org/web/20171127130418/https://www.ibm.com/developerworks/jp/web/library/wa-ecma262/)

規格化に至った経緯は不正確かつ脚色部分が多々あるため、詳しい方は是非コメント下さい。
javacコマンドでコンパイルするソースファイルを指定する方法（※ソースファイル内に、パッケージ宣言のクラスが参照されている場合）

#概要
パッケージ宣言のクラスが参照されているソースファイルを
コンパイルする際にエラーが起き、
コンパイルが出来なかったので、その時の健忘録である。

```terminal:フォルダ階層
. #①
├── logics #②
│   └── CalcLogic.java #③
└── main #④
    └── Calc.java #⑤

```

```java:Calc.java
package calcapp.main;

public class Calc{
  public static void main(String[] args){
    int a = 10;
    int b = 2;
    int total = calcapp.logics.CalcLogic.tasu(a, b);
    int delta = calcapp.logics.CalcLogic.hiku(a, b);
    System.out.println("足すと" + total + "、引くと" + delta);
  }
}
```

```java:CalcLogic.java
package calcapp.logics; // ⑥

public class CalcLogic{
  
  public static int tasu(int a, int b){
    return (a + b);
  }
  
  public static int hiku(int a, int b){
    return (a - b);
  }

}
```

④の階層で下記のコマンドを実行。「NG①」

```terminal
javac Calc.java 
```

しかし、以下のエラーメッセージが表示され、コンパイルできなかった。

```terminal
Calc.java:7: エラー: パッケージcalcapp.logicsは存在しません
    int total = calcapp.logics.CalcLogic.tasu(a, b);
                              ^
Calc.java:8: エラー: パッケージcalcapp.logicsは存在しません
    int delta = calcapp.logics.CalcLogic.hiku(a, b);
                              ^
エラー2個
```


#解決策

javacコマンドを正しいディレクトリの中で実行する。（階層①で実行する）

```terminal
# ①のディレクトリで実行
javac calcapp/main/Calc.java
```

javacコマンドは、実行したディレクトリ「直下」にあるパスを検索して、
パッケージ名と同じディレクトリがあれば、それを辿って目的のファイルを見つけるようだ。
もし、なければ、javacコマンドはコンパイルすべきファイルを見つけることができない。

「NG①」で、パッケージを見つけることができなかった理由としては、
階層④でjavacコマンドを実行しても、
javacコマンドは、階層④「直下」にあるパスから、
「./calcapp/logics」探そうとしていたからである。


#備考
ちなみに、今、問題となっているのは、
**Calc.javaをコンパイルする際に、パッケージが記載されたクラスが使われていた（パッケージが記載されたクラスの記載があった）場合である。**
（Calc.javaのソースファイルに記載されているパッケージ宣言（※⑥の表記）の事ではない。）

つまり、パッケージとjavaファイルを探す際に、Javacコマンドを実行するディレクトリとパッケージに対応するディレクトリを正常に配置していないと、Javacコマンドが該当ファイルを見つけることができないのである。）

実際、Calc.javaがたとえ、calcapp.mainパッケージに属していたとしても、そのパッケージ内で、パッケージが参照されていなければ、階層④でjavacコマンドを実施しても、正常にクラスファイルが作成される。
ただし、その場合も、javaコマンドを実行する際には、
同じように、実行ディレクトリ（※Javaコマンドをどのディレクトリで実行するか）と
パッケージに対応するディレクトリから該当classファイルを見つけていくので、
javaコマンドを実行するディレクトリと、パッケージに対応するディレクトリの構成を
正しくしておかなければ、クラスファイルを見つけることができない。（プログラムが起動しない。）



#参考文献
『スッキリわかるJava入門 第2版 スッキリわかるシリーズ』-第6章
ユーザーに管理者アカウントの新規登録をさせない方法


#adminの新規登録を防ぐ

単純にadminの設定をしたままだと、
routesを見てもわかる通り、adminの新規会員登録ができてしまいます。

つまり、**管理権限を持たない一般ユーザーでも管理者アカウントを作成できてしまいます。**
セキュリティーとして問題大です。


解決方法としては、下記を実施。

#解決方法

方法は、至って簡単です。
**adminモデルファイルから:resisterableを削除**

```rb:models/admin
:registerable, =>  #削除しましょう。
```

下記が、削除後の記述になります。

```rb:models/admin
class Admin < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable,:recoverable, :rememberable, :validatable
end
```



#結果

ルーティングからregitrationが消えたと思います。

```rb:terminal
             Prefix Verb   URI        Pattern                    Controller#Action
        new_admin_session GET    /admin/sign_in(.:format)        admin/sessions#new
            admin_session POST   /admin/sign_in(.:format)        admin/sessions#create 
    destroy_admin_session DELETE /admin/sign_out(.:format)       admin/sessions#destroy
       new_admin_password GET    /admin/password/new(.:format)   admin/passwords#new
      edit_admin_password GET    /admin/password/edit(.:format)  admin/passwords#edit
           admin_password PATCH  /admin/password(.:format)       admin/passwords#update
                          PUT    /admin/password(.:format)       admin/passwords#update
                          POST   /admin/password(.:format)       admin/passwords#create
```

あとは、routesからもregitrationsを消しておきましょう。
特に影響はないと思いますが、不要な記述は削除しておくべきかと思います。

```rb:routes
  registrations: 'admin/registrations' => #削除しましょう。
```

下記が、削除後のルーティングになります。

```rb:routes
Rails.application.routes.draw do
  devise_for :admin, controllers: {
  sessions:      'admin/sessions',
  passwords:     'admin/passwords',
  }
```



以上、たにーでした。

#参考文献

https://qiita.com/WallyNegima/items/8e7021fa949805de112e

https://qiita.com/iguchi1124/items/bb25cf650348f31ea37e
自分用メモ Lambdaやクロージャの実態

lambdaやクロージャは静的型付け言語では基本糖衣構文的な実装になっていて(コンパイラの実装次第)、インタプリタ言語では関数オブジェクトがプリミティブで用意されている場合だと都度生成になっている感じぽい

参考文献
https://t.co/ttU8TxuFCs?amp=1
https://koturn.hatenablog.com/entry/2013/08/06/223805
https://gist.github.com/koturn/5013105
railsのfile_fieldにおける画像アップロードボタンのデザインの変更方法

#環境
ruby 2.6.5
rails 6.0.0

#やりたいこと
画像をアップロードする際に，アイコンをクリックするとファイル選択に移るようにしたい

#実装
```ruby
<%= f.label :image, class: "far fa-image" do %>
  <%= f.file_field :image, style:"display:none;" %>
<% end %>
```

上記のコードを任意のforループの中に挿入する．このときid値は同様のものにしておく必要がある．

#あとがき
labelについての理解が浅いことがわかって良かったです．

#参考文献
[railsのfile_fieldで画像クリックによりアップロード]("https://qiita.com/zukakosan/items/41ed95fea2323cf458a9")
[Railsのfile_fieldで画像クリックでアップロードしてプレビューを差し替える]("https://qiita.com/hirogw/items/b4937dbb0ea5f0b60085")
Jupyter notebook でtqdmが使えない場合の対処法


## 使い方
Jupyter notebook または　Jupyter lab では次のようにしてtqdmを用います。

```python

from tqdm.notebook import tqdm

total = 0
for i in tqdm(range(1,11)):
    total += i
```

## エラーと対処法

次のようなエラーが出た場合、

```shell
HBox(children=(IntProgress(value=0, max=5), HTML(value='')))
```

Jupyter notebook の拡張機能がインストールされていないことが原因のため、次の２つをshellで実行してインストールします。インストールするためには`Node.js`と`npm`がインストール済でなければなりません。

```shell
jupyter nbextension enable --py widgetsnbextension
```

```shell
jupyter labextension install @jupyter-widgets/jupyterlab-manager
```

インストール後にnotebookを再起動すれば、 下の図のようなプログレスバーを表示させることができます。

![スクリーンショット 2021-03-29 14.46.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328421/db4f04e9-a90a-1e97-214d-67ec1b736196.png)


## 参考
- https://stackoverflow.com/questions/57343134/jupyter-notebooks-not-displaying-progress-bars
備忘録 - セル・範囲の指定【VBA】

##セルを指定

```vb
ActiveRange '現在アクティブのセルを指定
Range("セル名") ' A1やB5など通常のエクセルのセル名で指定
Cells(行番号、列番号）

'セルのアドレスを表示
Cells(行番号、列番号).Address
```
##範囲の指定

```vb
Range("セル名:セル名")

'空白のセルで囲まれた範囲を取得(表を取得したりするのに便利）
Range("セル名").CurrentRegion 'セルは範囲内のどこでも可
```

##シートにある行の数を計算

```vb
Rows.Count
```

##シートにある列の数を計算
```vb
Columns.Count
```
##表の最終行を取得

```vb
'表の中から下に向かって指定する場合
Range("セル名").End(xlDown).Row

'ワークシートの一番下から上へ範囲を特定する場合
Range("列名"&Rows.Count).End(xlUp).Row '列名は、表の中のどの列でも可

'Cellsを使ってワークシートの一番下から上へ範囲を特定する場合
Cells(Rows.Count,行番号).End(xlUp).Row
```

##表の最終列を取得

```vb
'表の中から右に向かって指定する場合
Range("セル名").End(xlToRight).Column

'ワークシートの一番右から左へ範囲を特定する場合
Cells(行番号,Columns.Count).End(xlToLeft).Column '行番号は、表の中のどの行でも可
```

##ワークシートの中で値が入っている最後の行を取得する
```vb
'セルの種類から特定する方法
Cells.SpecialCells(xlCellTypeLastCell).Row

'ワークシートから特定する方法
ワークシート.UsedRange.Rows.Count
```
pandas で文字コードがShift-JISであるcsvファイルを読み込む方法

## 方法

`codecs`というライブラリを用いることで、文字コードがShift-JISであるcsvファイルを読み込むことができます。

```python
import pandas as pd
import codecs

with codecs.open('path_to_file', 'r', 'Shift-JIS', 'ignore') as file:
        temp = pd.read_table(file, delimiter=",")
```

## 参考
- https://qiita.com/niwaringo/items/d2a30e04e08da8eaa643
Laravel PDF日本語化で一部文字化けが起きる時の対処

# 環境

* PHP 7.2
* Laravel 6.x
* Composer library
    * `barryvdh/laravel-dompdf`

# 事象
前提の日本語対応済み。
請求書のPDFで`ご請求金額`と表示されるはずが、`ご☒☒☒☒`といった感じで一部の日本語が文字化けを起こす。

# 前提
日本語対応

1. `barryvdh/laravel-dompdf`ライブラリをインストール
1. IPAからフォントダウンロード
1. `storage/fonts/`配下に配置
1. inline cssで`@font-face` `font-family`定義

# 対処

1. `storage/fonts`配下に自動生成されるファイル削除。
    * dompdf_font_family_cache.php
    * ipag-bold_*.ttf
    * ipag-bold_*.ufm
    * ipag-bold_*.ufm.php
    * ipag-normal_*.ttf
    * ipag-normal_*.ufm
    * ipag-normal_*.ufm.php
    * Times-Bold.afm.php
    * Times-Roman.afm.php
2. 念の為、キャッシュ一式クリアする
    * `php artisan optimize:clear`
PHP 関数は同一ファイル内であれば宣言より前に記述しても呼び出し可能。呼び出しは大文字と小文字を区別しない。

#関数の呼び出しについてのメモ

例）

```php
<?php 
<?php 
echo "上です\n";
hoge();

function hoge(){
    echo "hogeですファイル内から呼べます\n";
    echo "関数は同一ファイルであれば宣言より前に記述しても呼べます\n";
}

echo "下です\n";
hoge();

echo "関数は大文字と小文字を区別しない\n";
HOGE();

echo "小文字と大文字を混ぜても平気\n";
hoGe();

/*
上です
hogeですファイル内から呼べます
関数は同一ファイルであれば宣言より前に記述しても呼べます
下です
hogeですファイル内から呼べます
関数は同一ファイルであれば宣言より前に記述しても呼べます
関数は大文字と小文字を区別しない
hogeですファイル内から呼べます
関数は同一ファイルであれば宣言より前に記述しても呼べます
小文字と大文字を混ぜても平気
hogeですファイル内から呼べます
関数は同一ファイルであれば宣言より前に記述しても呼べます
*/

```

宣言の前後で関数が呼び出せていることを確認できる。
スマホでも100vhを安定させる方法

#はじめに
コンテンツの高さを100vhで指定した時に、pcだと問題なくても、スマホだとレイアウトが崩れることがある。
原因は、アドレスバーやキーボードなどがviewportの高さを圧迫してしまうから。
この記事では、スマホでも100vhを維持してレイアウトを崩さない方法をjsを使ってご紹介したいと思います。

##ウィンドウの高さを取得して、min-heightで指定する
`height:100vh;`では、高さが可変してしまいますが、**min-height**で指定してあげれば、それ以下のサイズになることはありません。

```javascript:index.js
let sp_height = window.outerHeight;
document.documentElement.style.setProperty("--sp_height", `${sp_height}px`);
```
まず、１行目の記述でスマホのwindowの高さを`window.outerHeight`[^1]で取得して、変数`sp_height`に代入します。取得した高さ`sp_height`は、２行目の記述で、cssのカスタムプロパティ`--sp_height`に代入します。

[^1]: `window.innerHeight`と違い、アドレスバーも含めたwindow全体の高さを取得できる。

```css:index.css
.sp_height{
  height: 100vh;
  min-height: var(--sp_height);
}
```
cssで、`var(--sp_height)`とカスタムプロパティを記述することで、値を動的に扱うことができます。
これにより、jsで取得した高さをcssに反映することができました！
#まとめ
今回のやり方で**min-height**を指定することで、アドレスバーやキーボードによってviewportが圧迫されたとしても、ウィンドウの高さ分はコンテンツの最低高として確保されるのでレイアウトが崩れる心配がありません。100vh指定は、スマホだと表示崩れなどが懸念されますが、回避策はいくつかあると思いますので今回記事で紹介した内容も一つの対策として、皆様の参考になれば幸いです。
PHP unset(), implode(), explode(), in_arrayの使い方

#各関数の意味
###unset
変数の割り当てを解除する
###implode
配列を引数に指定した文字で区切り文字列として結合する
###explode
文字列を指定した値を区切りにして配列に分割する
###in_array
配列の中から指定した値があるか確認する

例）

```php
<?php 


//unset
$foo = 'test';
echo $foo."\n";
unset($foo);// 変数を削除する
echo 'hoge'."\n";
echo $foo."unset\n";
echo 'hoge2'."\n";

/*
test
hoge
unset　//unset()によってtestunsetとならず「unset」のみがechoされている
hoge2
*/


//implode
$arr = ["one","two","three"];
echo implode($arr)."\n";// onetwothre ←第一引数に分割する値を入れないと配列を単純に結合する。
echo implode(",", $arr)."\n";// one,two,three ←引数を指定した事で第一引数の「,」を配列のインデックスごとに挿入して結合している


//explode
$str = "one,two,three"; // one,two,three
var_dump(explode(",", $str));
/*
array(3) {
  [0]=>
  string(3) "one"
  [1]=>
  string(3) "two"
  [2]=>
  string(5) 
  */
//↑第一引数で指定した「,」で文字列を分割し配列を作っている


$search_arr = ['remon','stroberry','apple'];

if(in_array('apple',$search_arr)){
    echo 'リンゴがあります';
}else{
    echo 'リンゴはありません';
}
//リンゴがあります
//第一引数で指定した値が配列内にあればtrueを返す（なければfalseを返す）。
```
Pandas 構文メモ

## 目的

たまに使う構文をさっと使えるようにメモ

## 

### 特定の文字列を含む

```
df['xxx'].str.contains('yyy')
```

strがないとエラーになる

### 行を繋げる

```
pd.concat(['xxx', 'yyy'])
```

[ ]がないとエラーになる

> first argument must be an iterable of pandas objects, you passed an object of type "DataFrame"
リーダブルコードの読み方 ほぼ個人メモ

# 目的

- リーダブルコードという技術書を読んでみて自分に合った読み方を見つけたのでまとめておく

# 詳細

- 読んだ本
    - リーダブルコード: [https://www.amazon.co.jp/dp/4873115655/ref=cm_sw_em_r_mt_dp_97MYJ3X5JEN95S49YD0P](https://www.amazon.co.jp/dp/4873115655/ref=cm_sw_em_r_mt_dp_97MYJ3X5JEN95S49YD0P)（アマゾンのリンクですがアフィリンクではないので安心してクリックしていただいて大丈夫です。）

# この本の概要（ネタバレにならない程度の内容のまとめ記事を別途記載予定）

1. 読みやすいソースコードの書き方が書いてある。
1. 「初心者エンジニアはとりあえず読んだほうが良い技術書」として取り上げられる事が多い。
1. 初心者エンジニアだけではなくベテランエンジニアさんも読んでいらっしゃる。
1. もともと著者は海外の方で日本語訳されたものが多く出回っている。

# 個人的におすすめの読み方（完全自分向け）

- 章の題名を読む→章末に箇条書きにされているまとめを読む→内容を読む
    - 必ず章末に箇条書きでその章のまとめが記載されている。先にそっちを呼んだほうが内容が入ってきやすかった。
    - 内容がわかりにくいということではなく、単純に結論ファーストのほうが自分は理解しやすかった。
    - 日本語訳されていると入っても元は海外の方が書いた本なので若干理解しにくい部分も合った。（主に言い回し的な意味）
    - 自分の文章読解力が低い可能性も大いにあるので皆さんに合った読み取り方法を見つけてみてください。
- 例文として記載されているソースはあんまり気にしなくていいかも
    - 自分はPHPしかほぼ読めない。ただの本には例文としてJava、Python、Ruby、JavaScript、などなど様々なソースが乗っている。
    - もちろんソースにからめて解説や実例が記載されているので重要ではあるが、自分も含めて初心者エンジニアの方はせいぜい1~2個くらいしかなれている言語はない。
    - 真面目にあまり知らない言語の例文を読む必要はないと思う。
    - 「あ、多分この辺こんな処理してそう」「その処理はたしかに一緒に書かないほうがいいかもね〜」くらいの軽い気持ちでスルーすれば良いかもしれない。
    - こちらも自分の読解力と技術力が低い可能性は大いにある。
- ちょっと苦手な部分はさっと読み飛ばして2週目を読む、今の自分に必要そうな部分だけ読むのもありかも
    - 実際に実装してみないとイメージが沸かないことが結構あった。
    - 少なからずソースを書いた経験がなくてこれから言語について学ぶ方は実感が沸かないかもしれない。
    - 業務や自分の勉強と平行して一周目はさっと読み、実務で必要になったら必要そうな部分（変数の命名方とか、ネストの深さとか、ソースのコメントとか）をピンポイントで読み直すのもありかもしれない。
    - 大切なのは自分が必要としている知識がリーダブルコードに記載されていることを知っていることなのかも。
    - 一周目は「今時分が抱えている課題はリーダブルコードのこの辺に書いてあったかも」を知るためにざっと読むことが大切っぽい。
vimで連続した文字の周りを装飾する

#概要
`aiueoWWWpiyo`という文字列は`:%s/\v((.)\2+)/!\1!`を実行すると`aiueo!WWW!piyo`になる。
#詳細
|文字|意味|
|:-:|:-:|
|\v|very magicを利用|
|()|グループ化|
|\1|1個目のグループを参照|
|+|1回以上の繰り返し|

`\v`はvimのvery magicという機能を使うという意味。メタ文字の入力がしやすくなる。

`()`はグループ化で、マッチしたものを`\1`のように参照できる。この番号は何個目の括弧であるかを記述する。

```:vim
aiiiueo

:%s/\v(a)(iii)(ue)/\1\3\2

aueiiio
```

`()`は`()`の中に入れられる。外側が1でそこから数える。

```:vim
hogepiyo

:%s/\v(ho(ge)(pi(yo)))/\4\3\2\1

yopiyogehogepiyo
```

`\1`は検索の段階で使用できる。

```:vim
thatthatthat

:%s/\v(that)\1/this

thisthat
```

連続した文字は`(.)\1+`でマッチする。

```:vim
apple book ddddc

:%s/\v(.)\1+/m/g

amle bmk mc
```
【Swift】TargetedExtensionとは

#はじめに
僕のSwiftで最も好きな文法はExtensionです笑
基礎的なExtensionの使い方は[こちら](https://qiita.com/REON/items/3ec2c1e73843b9b0aa1e)をみてみてください。
TargetedExtensionというものがあるらしいので、みていきましょう。

#Extensionとは？
詳細なエクステンションの説明は省きますが、エクステンションは以下のように構造体やクラス、プロトコルを拡張してメソッドなどを追加できます。
例を見てみましょう。

```swift
extension Int {
    var minus10: Self {
        return self - 10
    }
    func plus100() -> Self {
        return self + 100
    }
}
print(200.minus10) //190
print(200.plus100().plus100().minus10) //390
```
こちらも合わせてご覧ください([メソッドチェーン](https://qiita.com/REON/items/780f341b5b80ae4c9e6b))

#TargetedExtensionとは?
前項の例だといいのですが、命名によってはこのメソッドは既にあるものなのか、自分で作ったものなのかわからない場合がありますし、Xcodeの予測変換でメソッドやプロパティが自分で作った数だけ多くなるので、見辛くなってしまうかもしれません。できればXcodeの補完を汚さずに、自作のメソッドなどにアクセスしたいです。
このような時に役に立つのがTargetedExtensionです。
前項のプログラムを修正していきましょう。

```swift 
protocol SomeComapatible {
    associatedtype ComapatibleType
    var own: ComapatibleType { get }
}

class Some<T> {
    private let base: T
    init(_ base: T) {
        self.base = base
    }
}

extension SomeComapatible {
    var own: Some<Self> {
        return Some(self)
    }
}

extension Int: SomeComapatible { }

extension Some where T == Int {
    var minus10: Int {
        return base - 10
    }
    func plus100() -> Int {
        return base + 100
    }
}
```

こうすることで、以下のように`own`を間に挟まないと`minus10`プロパティや`plus100`メソッドにアクセスできないようにできました。

```swift 
print(1000.minus10) //エラー
print(1000.own.plus100()) //1100
```

#解説
###ステップ1
このプロトコルを採用したものは`own`プロパティを持つようにする。

```swift
protocol SomeComapatible {
    associatedtype ComapatibleType
    var own: ComapatibleType { get }
}
```
###ステップ2
`Int`に先ほどのプロパティを準拠させます。しかし、`own`プロパティの実装がありませんので、次で実装しましょう。

```swift 
extension Int: SomeComapatible { }
```
###ステップ3
以下のように実装します。`Some<Self>`の`Self`はプロトコル`SomeComapatible`を準拠させた具体的な型なので、今回は`Int`ですね。
そして、`return Some(self)`の`self`は`print(1000.own.plus100())`このように書いた時の`1000`のことです。
このように、ジェネリクスも用いてあげることで、`Int`だけでなく`String`などでも同じ`own`を利用する事ができます。

```swift 
class Some<T> {
    private let base: T
    init(_ base: T) {
        self.base = base
    }
}

extension SomeComapatible {
    var own: Some<Self> {
        return Some(self)
    }
}
```
###ステップ4
では、具体的にメソッドなどを定義していきます。

```swift
extension Some where T == Int {
    var minus10: Int {
        return base - 10
    }
    func plus100() -> Int {
        return base + 100
    }
}
```
この`minus10`と`plus100`は`T`が`Int`の時のみ使えると言う条件を付け足しました。
`base`は`Int`なので、実際は`1000`などが入ってきます。

#おわりに
[メソッドチェーン](https://qiita.com/REON/items/780f341b5b80ae4c9e6b)はこのような考慮がかけています。ぜひ、この記事を参考に書き換えてみてください。
Flutter で pod install が失敗する [!] The 'Pods-Runner' target has transitive dependencies that include statically linked binaries


## 出力されているエラー

```sh
$ pod install
Analyzing dependencies
cloud_firestore: Using Firebase SDK version '6.33.0' defined in 'firebase_core'
firebase_analytics: Using Firebase SDK version '6.33.0' defined in 'firebase_core'
firebase_core: Using Firebase SDK version '6.33.0' defined in 'firebase_core'
firebase_messaging: Using Firebase SDK version '6.33.0' defined in 'firebase_core'
firebase_remote_config: Using Firebase SDK version '6.33.0' defined in 'firebase_core'
Downloading dependencies
[!] The 'Pods-Runner' target has transitive dependencies that include statically linked binaries: (/path-to/ios/Flutter/Flutter.framework)
```

## 解決方法
今後実行するスクリプトは全てiosディレクトリ内で実行してください

```sh
$ cd ios
```
まずは更地に戻します

```sh
$ flutter clean
$ rm -rf Flutter/Flutter.framework Pods Podfile.lock
```

Podfileに追記します

```sh
# NOTE: For detail 👉 https://github.com/CocoaPods/CocoaPods/issues/3289
pre_install do |installer|
  Pod::Installer::Xcode::TargetValidator.send(:define_method, :verify_no_static_framework_transitive_dependencies) {}
end
```


![スクリーンショット 2021-03-29 18.29.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209400/08bcd56a-8484-1eeb-bb4f-2ac8c952c4fe.png)

パッケージを入れ直してビルドします

```sh
$ flutter pub get
$ flutter build ios
$ pod install
```

次のようなログが出ると成功です

```sh
$ pod install
Analyzing dependencies
cloud_firestore: Using Firebase SDK version '6.33.0' defined in 'firebase_core'
firebase_analytics: Using Firebase SDK version '6.33.0' defined in 'firebase_core'
firebase_core: Using Firebase SDK version '6.33.0' defined in 'firebase_core'
firebase_messaging: Using Firebase SDK version '6.33.0' defined in 'firebase_core'
firebase_remote_config: Using Firebase SDK version '6.33.0' defined in 'firebase_core'
Downloading dependencies
Generating Pods project
Integrating client project
Pod installation complete! There are 17 dependencies from the Podfile and 39 total pods installed.
```

## 間違った解決方法
### use_frameworks! をコメントアウトする
![スクリーンショット 2021-03-29 18.32.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/209400/e4a4de20-c6e9-b029-020a-31b26edfec9d.png)
普通にエラーになります

```sh
[!] The 'Pods-Runner' target has transitive dependencies that include static frameworks: (FirebaseCore, FirebaseDatabase, FirebaseMessaging, FirebaseDatabase, FirebaseCore, FirebaseMessaging, FirebaseMessaging, FirebaseCore, and FirebaseDatabase)
```

cf. https://github.com/flutter/flutter/issues/20045#issuecomment-409492211