OmniAICreator/Qiita-1.07M huggingface dataset:
R の attach 関数について

# はじめに
R の`attach`関数の操作方法についてまとめた。使うデータについては[こちらの記事](https://qiita.com/ryamamoto0406/items/489e00fe693b688a4a5e)を参考に。df というdata.frame型の変数に1000人分の性別、身長、体重、血液型のデータがある状況で`attach` 関数の挙動を見ていく。

# `attach`関数
`attach`関数でデータフレームを展開する前は、名前を$で項目名を指定しなければ値にアクセスできない。

```R:
> str(df)
'data.frame':	1000 obs. of  4 variables:
 $ SEX   : chr  "male" "male" "female" "male" ...
 $ HEIGHT: num  179 165 170 163 176 ...
 $ WEIGHT: num  94.2 82.5 63 64.8 93.2 ...
 $ BLOOD : chr  "A" "A" "A" "A" ...
> head(HEIGHT)
 head(HEIGHT) でエラー:  オブジェクト 'HEIGHT' がありません 
> head(df$HEIGHT)
[1] 179.0543 164.8774 170.4041 163.3607 176.0256 181.1941
```

これを`attach`関数で展開すると…、

```R:
> attach(df)
> head(HEIGHT)
[1] 179.0543 164.8774 170.4041 163.3607 176.0256 181.1941
```

項目名だけで値にアクセスできるようになる。

# `detach`関数

上記の様に df を`attach`関数で展開済みの状態で同じ項目名を持つ df2 というdata.frame を定義する。それを再度`attach`で展開しようとすると以下のようなエラーが出る。

```R:
> df2 <- data.frame(SEX="male", HEIGHT=171.5068, WEIGHT=74.5213, BLOOD="B")
> df2
   SEX   HEIGHT  WEIGHT BLOOD
1 male 171.5068 74.5213     B
> attach(df2)
 以下のオブジェクトは df (pos = 3) からマスクされています: 

     BLOOD, HEIGHT, SEX, WEIGHT 

```

変数名が被ってしまっているので、当然エラーとなる。一度展開した df を解除し、 df2 の項目名を展開したい場合は以下の様にする。

```R:
> detach(df)
> HEIGHT
 エラー:  オブジェクト 'HEIGHT' がありません 
> attach(df2)
> HEIGHT
[1] 171.5068
```

# おわりに
`attach, detach`関数の使い方をまとめた。全部をリセットしたければ`detach`関数を使うより、R 自体を再起動してしまう方が手っ取り早そうではある。
Qiita Daily Survey memo 2021.02.22

# Qiita Daily Survey memo 2021.02.22
Qiita の記事を可能な限り毎日読むために、読んだmemoを公開することでモチベーションを維持しようという試み。

## [マクドナルドで一日分の栄養を取れる組み合わせを計算したら衝撃の結果に](https://qiita.com/takobaya391076/items/49b15c1fa36734b3fa53)
takobaya391076 さんの記事。
インパクトのあるタイトル通り、面白い内容で楽しく読ませていただきました。
マクドナルドの商品の栄養素は公開されているため、それと線形計画法という手法で分析をかけているそうです。
商品がマクドナルドのため、本記事のような結果となりましたが、コンビニや他のご飯屋さんでレコメンドの形であれば、非常に有効な手法なのでは…？と思いました。
例えば私はセブンイレブンのホッケが大好きなのですが、それに加えてご飯、コールスローを食べるとすると…あと〇〇を追加するといい感じですよ、とレコメンドがあったら買っちゃうと思いました。


## [Raspberry Pi Picoのリセットからmain()までを追う](https://qiita.com/yunkya2/items/5f0f5ebb0f26a52805d9)
yunkya2 さんの記事。
Raspberry Pi Pico のソースコードがGitHubに上がっているそうで、そこからユーザが作成したmain()関数が呼ばれるまでを追いかけてくださっている記事です。
ソースまでは読んでいませんが、書かれている内容を見ると納得感のある処理が書かれています。
あまり内部の処理を追いかけたりすることがないので、興味深い記事でした。

余談ですが、業務用PCのOSが立ち上がらなくなった時に、たぶんこういう順番で起動するはずなのにそうなっていない…と、障害調査したことを思い出しました…。


## [5歳娘「パパ、レンタルサーバを契約しないで？」](https://qiita.com/Yametaro/items/a186525e7c2960e2ae99)
無職 やめ太郎（本名）(Yametaro) さんの記事。
書き出しのところを Twitter で拝見していたので、楽しみにしていた記事でした。
内容もとても面白く、レンタルサーバとクラウドのメリット/デメリットをシナリオベースで説明してくださっており、分かりやすかったです。
特にクラウドに対するレンタルサーバのメリットを詳しく知らなかったため、記事を読んでなるほどなーと思いました。
Yametaroさんの記事は他の記事も面白く、とても分かりやすいので、おすすめです！


## [【Rails】業務未経験者がRailsを使用して情報資産共有アプリを開発したので共有します](https://qiita.com/yutaro48/items/673789a91557735e1be5)
雄太郎(yutaro48) さんの記事。
資産共有アプリを開発された…という記事になります。
毎日書いている気がしますが、何か作って公開までたどり着ける方々は本当にSUGOI...。

どの企業も抱えている課題だと思っていますし、私の勤めている会社もナレッジ・ノウハウの共有は毎回課題になっています。
しかし「成功してます！」というのを見たことがありませんし、「なるほど確かにこの方法なら…」というのも見たことがありません。
そういう観点で Qiita とかは大成功しているように見えています。
閉じたコミュニティで情報を共有するためには、どういう手法が良いのでしょうね…？
关于如何在apex中抽取添付文件

 1.第一步，根据该obj找到该对象底下所有的文件，保存到list当中。
  List<ContentDocumentLink> cdList = [
            SELECT
                id,
                ContentDocumentId,
                ContentDocument.Owner.Profile.Name,
                LinkedEntityId
            FROM
                ContentDocumentLink
            WHERE
                LinkedEntityId = :linkId
        ];

        return cdList;
2.根据第一步的ContentDocumentLink的id，我们可以取到contentversion。
而这里我们需要注意的就是
VersionData就是添付文件的内容
但是它在soql里面检索出来的是path
在apex当中就是blob格式的字节了



public static ContentVersion getConVerById(String ConDocId) {

        ContentVersion cv = [
            SELECT
                Title,
                FileType,
                VersionData
            FROM
                ContentVersion
            WHERE
                ContentDocumentId = :ConDocId
                And IsLatest = true
        ];

        return cv;
    }
railsでdeviceを入れて、ログアウトしようとしたらrouting errorになった話

今回device というgemを使ってログイン/ログアウト機能を実装しようとしたらなんかrouting errorになりました

今回のそレを解決する方法をわすれないために共有します

#結論
これが誤っているコードですね。

```
 <%= link_to 'ログアウト', destroy_user_session_path %>
```

これの後ろに、

```
<%= link_to 'ログアウト', destroy_user_session_path, method: :delete %>
```
をつけるっていうのがこんかいのかいけつさくですね。

#どうしてこうなるのか

調べた限り、今回のログアウト機能に関しては、getメソッドではなくて、deleteメソッドを呼び出すみたいですね。

上の間違ったコードを書いていたから、getメソッドが呼び出されてしまっていたのでrouting errorになったみたいですね

二十分くらいかかった解決策ってこんなに短いのかよ

初心者あるある

#参考記事
https://teratail.com/questions/258599
gitを用いた変更の確認と変更を戻す方法

## 0. はじめに - 自己紹介

Qiita初投稿です。初学者エンジニアのあいくと申します。よろしくお願いします

2020年の10月からプログラミングの学習を開始し、その過程で得た知見をQiitaに少しずつアップしていこうと思います。自分にとっては備忘録ですが、どなたかの役に立てれば幸いだと思っています。
至らぬところ多く、何か間違いなどございましたらご教授頂きたく思います。

## 1. 本記事の目的

gitを用いたバージョン管理における、変更を戻す方法と変更を確認する方法を記します。
gitを味方につけると、失敗した際に回復できるようになります。これは、開発中の心理的不安を大きく取り除いてくれ、結果的な効率化に繋がると思います。


## 2. 変更を確認する

### 「現在の変更状況」を確認する

```ruby

# 現状の編集状況を確認するコマンド
git status
```

### 「何を変更したか」を確認する

```ruby

# 現状と最新のcommitとの編集内容の差分を表示
git diff
# 過去のcommit間における編集内容の差分を表示
git diff [変更前のコミットID] [変更後のコミットID]
```

### 「変更履歴」を確認する

```ruby

# コミットした詳細履歴を表示(コミットメッセージ、コミット日時など)
git log
# 各コミット履歴を1文で表示(オススメ)
git log --oneline
```
<br/>
## 3. 変更を取り消す
<font color="gray">＊ gitの場合、「変更を戻す」よりも「変更を取り消す」の方がしっくりきました</font>
### **編集内容を取り消したい(addする前)**

```ruby

# 全ての変更を取り消す
git checkout .
# index.htmlの変更を取り消す
git checkout [ファイル名]
```

### **ステージングを取り消す(addした後)**

+ __編集内容を残したい場合__

```ruby

# 全てのステージングを取り消す
git reset
# 特定のファイルのステージングを取り消す
git reset -- [ファイル名]
```

+ __編集内容は残さない場合__

```ruby

# ステージしたファイルを最後にコミットした状態に戻す
git checkout HEAD -- [ファイル名]
# 全てのファイルを最後にコミットした状態に戻す
git reset --hard HEAD
```

### **コミットのバージョンを戻す(commitした後)**

```
git reset --hard [コミットid]
```
<br/>
## 4. リソース

Git： もう怖くないGit！チーム開発で必要なGitを完全マスター
[https://www.udemy.com/course/unscared_git/](https://www.udemy.com/course/unscared_git/)

[git] 戻したい時よく使っているコマンドまとめ
[https://qiita.com/rch1223/items/9377446c3d010d91399b](https://qiita.com/rch1223/items/9377446c3d010d91399b)
<br/>
## 5. 余談

自分の考えた文章を発信するのは、これが初めてでした。今後も定期的に発信していこうと思います。これまで、文章を考える時にはなるべく「手垢のついた表現」を避け、自分なりの言葉で表現していきたいと考えています。
ただ、「手垢のついた表現」という表現に手垢めっちゃついてるじゃん、、という矛盾がいつも頭をよぎります。
余談です。これからも頑張っていきたいと思います。
[まとめ]新卒エンジニアが生産性を向上させるために必要な手段


新卒で１年ほどエンジニアをやって来ましたが、「プログラミングができる」ことよりも、「より早く（生産性高く）」「問題解決するための方法」を身につける方が圧倒的に大切だと感じています。
実際、コードを書く時間よりも調べ物をする時間の方が長いですし、コードを書き終わった後のデバッグ作業に時間を取られたりもします。
今回は自身が「**生産性を高めるため**」「**問題解決するため**」に役立った考え方・知識・スキルをまとめました。

#マインド#
なるべく手作業を減らす。
作業実施前に、楽に実施できる方法がないか考える。

#google検索#
知りたい情報に早く辿り着くことができます。
[[生産性向上]google検索のテクニック](https://qiita.com/keita_ide78/items/c69d187404bed80a8caf)

#Chrome拡張ツール#
Chrome拡張ツールについてこちらにまとめました。拡張ツールにマルウェアが組み込まれることも指摘されているため、あくまで自己責任でお願いします。
[[生産性向上]おすすめのChromeの拡張ツール](https://qiita.com/keita_ide78/items/f702c8ed374243450e2b)

#ショートカットキー#
Windowsのショートカットキーについてこちらにまとめました。
[[生産性向上]Windowsのショートカットキーまとめ](https://qiita.com/keita_ide78/items/f7644e4020e8672c09fc)

#Eclipse#
こちらにまとめました。
[[生産性向上]Eclipseの便利機能まとめ](https://qiita.com/keita_ide78/items/30815e5cbef459692d0f)

#テキストエディタ#
こちらにまとめました。
[[生産性向上]サクラエディタの使い方](https://qiita.com/keita_ide78/items/fa74837f0081fc077240)

#エクセル#
こちらにまとめました。
[[生産性向上]エクセルの便利機能まとめ](https://qiita.com/keita_ide78/items/3610f6a862dd1e958cd0)

#クリップボード#
[誰もやらなかったWindowsクリップボード徹底解説](https://forest.watch.impress.co.jp/docs/serial/nyanwin/1237729.html)
↑この記事に詳しく書いてあるのでこちらをみてください。

まとめると
Ctr + V 最後にコピーしたものを貼り付け
Windows + V コピー履歴の中から選択して貼り付け
できるということです。

#ブラインドタッチ#
**本当はこれを一番上に書きたいくらい重要だと思っています。**
タイピングのスピードは生産性に直結する部分ですので、まずはこれを極めるのが良いと思います。さらに、ブラインドタッチができれば、打ち込んだ文字をリアルタイムで確認することができますよね。
そのおかげでタイプミスした際に見逃すことがかなり減ります。

おすすめサイト
[寿司打](http://typingx0.net/sushida/)

#最後に#
ここまで読んでいただきありがとうございます。
まだまだ自身も生産性向上・問題解決方法の習得の途中ですので、アドバイス等があれば是非コメントして頂きたいです。
Redmine DMSFプラグイン1.5.2〜2.4.4で発生する不具合を修正しました

# 概要

* Redmine DMSFプラグインの特定のバージョンで発生していた不具合を修正しました
* Redmine バージョン 3.4.0以上を使用していて Remine DMSFプラグイン バージョン 1.5.2〜2.4.4を使用している場合に発生します
* 私の方で [当該の不具合を修正するPull Request](https://github.com/danmunn/redmine_dmsf/issues/1185) を作成し受理されましたので、Redmine DMSF バージョン 2.4.5 以上では事象が発生しないようになっています
* 本記事は [不具合報告したissue](https://github.com/danmunn/redmine_dmsf/issues/1184) の内容に記載している情報とほぼ同様のものとなりますが、改めて不具合の内容について周知させていただきます

# Redmine DMSFプラグインについて

[Redmine DMSFプラグイン](https://github.com/danmunn/redmine_dmsf) は [Redmine](https://www.redmine.org/) で高機能な文書管理を行うプラグインです。
プロジェクト内でファイルをアップロードしてメンバーと共有する用途に向いています。
ファイル内容検索やバージョン管理、ファイル変更メール通知やWebDAV対応といった機能があります。

# 不具合の内容

Redmineのチケットへの添付を行っていたファイルと同じファイルをDMSFプラグイン（文書管理）からアップロードすると、チケット側で添付していたファイルが閲覧できなくなってしまう。

# 不具合の原因についての解説

※ここから先はRedmineの内部構造に踏み込む結構難解な解説となってしまうことをご容赦ください・・・。

## 1. そもそもRedmine DMSFプラグインがどのようにファイルアップロードを実装しているのか

Redmine DMSFプラグインは Redmineの添付ファイル( `Attachement` モデル)の機能をそのまま呼び出してファイルアップロードを実装しています。
以下の箇所ではファイルアップロード時にRedmineの `Attachement#save` を呼び出して実装していることが確認できます。

https://github.com/danmunn/redmine_dmsf/blob/v2.4.4/app/controllers/dmsf_upload_controller.rb#L95

Redmine標準の添付ファイル機能を利用して保存しているので、いったんRedmineの標準的なアップロード先のディレクトリ（例: `"#{RAILS_ROOT}/files/〜"`)に一時保存されます。
そして、DMSFプラグインではその一時保存されたファイルをDMSFプラグイン専用の保存先ディレクトリにファイル移動しています。

https://github.com/danmunn/redmine_dmsf/blob/v2.4.4/app/helpers/dmsf_upload_helper.rb#L106

## 2. Redmine 3.4.0からの新機能「ファイルアップロード時のファイルの再利用」

Redmine 3.4.0から、ファイルアップロード時にファイルを再利用してディスク領域を節約する機能が追加されました。[^1]
[^1]: [Redmine 3.4 新機能紹介](http://blog.redmine.jp/articles/3_4/new-features-p1/#25215) が参考になります。

この新機能により、同一ファイルをRedmineに複数回アップロードしても、Redmineを稼働しているサーバのディスクにはファイルが1つしか保存されないようになりました。

この新機能は Redmineの `Attachment` モデルを改修することで実装されています。
https://github.com/redmine/redmine/blob/4.1.1/app/models/attachment.rb#L438

`Attachment#reuse_existing_file_if_possible` というファイルを再利用する処理が ` after_commit` コールバックごとに呼び出されるようになりました。
この処理は古い同じファイル内容の添付ファイルを削除して、古い添付ファイル情報のファイルパスをすべて新しいものに書き換えるという実装になっています。

## 3. 不具合発生の流れ

Redmine DMSFが以前よりRedmineの `Attachement` モデルを利用してファイルアップロードを実装していましたが、Redmine 3.4.0で実装された新機能により、ファイルの再利用が自動で行われるようになってしまっていました。

上記をふまえて改めて不具合発生の流れを記載します。

* Redmine DMSFプラグインが Redmine の `Attachment#save` によるアップロードされたファイルの保存を実施
* Redmine側で「ファイルアップロード時のファイルの再利用」処理が実施され、アップロードされたファイルと同じファイルがRedmine内の添付ファイルに存在する場合、古い添付ファイルの実体が削除されて、新しいファイル（Redmine DMSFの一時保存ファイル）への参照に置換される
* Redmine DMSFプラグイン側の処理でアップロードされた一時保存ファイルが、所定のディレクトリにファイル移動される
* Redmineのチケットに添付していたファイル（の参照先のパス）が既に移動が行われたファイルのものとなっているため、Redmineのチケットのファイルを表示することができなくなってしまう

# 解決方法

Redmine DMSFプラグインがRemine 3.4.0からのファイル再利用の新機能に対する対応ができていなかったため、Redmine DMSFプラグインのファイルアップロードではこの新機能を利用しないようにする [Pull Request](https://github.com/danmunn/redmine_dmsf/pull/1185) を作成しました。
先日リリースされた [バージョン2.4.5](https://github.com/danmunn/redmine_dmsf/releases/tag/v2.4.5) ではPull Requestが取り込まれているため改修されています。

# まとめ

* Redmine DMSFプラグインの特定バージョンで発生する不具合について周知・説明しました
* 本不具合について原因究明およびPull Request作成を実施しました
AWSのSQSとSNSの違い

前にまとめたんですけど、やっぱややこしかったのでもうちょっとまとめます

## 勉強前イメージ

- SQS ... バッチのキューとか処理で後続の処理を実施できるイメージ
- SNS ... notificationだから通知が主なイメージ

## 調査

### SQSとは

詳細は [こちら](https://qiita.com/miyuki_samitani/items/e46ef9452fcd73f9d240)

- SQSは Simple Queue Service の略
- `キューイングサービス`
- キューは ソフトウェア間を直接データを渡すのではなく、第三者経由でデータを渡すことで、送信側と受信側が好きなときに処理を行う
- データの取得方法は、 `他のサービスがSQSをポーリングして、キューがあれば取得` します

![1Amazon SQSとは - Qiita - Google Chrome 2021-02-20 10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/bf1d319c-fc7e-4fb8-8900-744f795dbde1.png)


### SNSとは

詳細は [こちら](https://qiita.com/miyuki_samitani/items/e44bc7e92a47531fd536)

- SNSは Simple Notification Service
- `メッセージングサービス`
- プッシュしたメッセージをHTTP,HTTPS,メール,SQS,モバイルプッシュなどに通知出来る
- データの取得方法は、 `SNSがメッセージを送るプッシュ式` です。

![2Amazon SQSとは - Qiita - Google Chrome 2021-02-20 10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/5c0c8223-cc02-16a6-ec0c-20c60d83bde6.png)

### まとめ

- SQS ... キューを `ポーリング` して取得する キューイングサービス
- SNS ... メッセージを `プッシュ式` で送る メッセージングサービス

## 勉強後イメージ

勉強するごとにごちゃごちゃになったり、忘れちゃったりするけど
イメージなんとなく思い出したし、まとめると忘れづらい

## 参考

- [【AWS】違いが良くわからないサービス（メッセージ・構成管理）](https://juso.site/it-skill/aws/aws_difference)
vue.js上でauthorizationを実行する話　2021/2/19

今日やるべきこと

vue.jsのFBButtonをクリックするとcodeからトークンの情報を取得し、プライベート情報を取得すること

前回はpostman上でAuthorizationの情報を設定したが今回はhttpheader上にAuthorizationの情報を入力して情報取得の権限を得たい。

このためにはGoogleChromeのプラグインが必要である。
（Chrome extensionを検索→chromeウェブストアからmod headerを検索してクロムに追加する）

----------------------------
#ブラウザのHTTPヘッダーに外部から認証情報を設定する

ここでは先程追加したmodheaderを使ってブラウザ上で外部から認証情報を設定する

key: Authetoken/ value: アクセストークンを設定する

---------
#Vue.js上でhttp headersのAuth＿TOKENをデフォルト設定をする

詳しいやり方はドキュメントを参照↓↓
https://github.com/axios/axios

####まずbaseURLを設定する

```js:main.js
axios.defaults.baseURL = 'http://localhost:8000'
```
この一行を追加するだけで`'http://localhost:8000'`する必要がなくなり楽になる。
`main.js`はグローバルファイルなのでbaseURLはここに入れるのが正しい。

###http headersにトークンを設定する

```js:FBButton.vue

 mounted (){
    let code = this.$route.query.code
    if(code){
        let data = {fb_code: code}
        axios
    // baseURLにより`/accounts/`が簡易化している
        .post('/accounts/', data)
        .then(resp => {
            this.info = resp.data
            console.log(resp.data)
            axios.defaults.headers.common['Authorization'] = resp.data.token
　　　　　// localStorageについて
            localStorage.setItem("account", JSON.stringify(resp.data))
            this.$router.push('/profile/')
        })
        }
    }
```

ここでJSのアロー関数について学習しよう。
>アロー関数とは？

```js
let normalFunc = function(x){
    console.log(x);
}
　//処理が一つの場合
let arrowFunc = (y) => (console.log(y));

 //処理が複数の場合
let arrowFunc = (y) => {
    console.log('これは')
    console.log(y)
}

normalFunc('今までの関数');
arrowFunc('アロー関数式');

 //関数の中身が1文のみ（例：return文だけ）といった場合は中括弧を省略できる
let arrowFunc = (y) => console.log(y);
```
-----------------

#localStorage
>localStorageとは？
>>ブラウザ上に情報を保有する機能


localStorageへのデータ保存はたったこれだけ。`localStorage.setItem()`を使います。

```js
localStorage.setItem('キー', '値');
```

#####配列を取り扱う場合

ひとつのキーに対して複数の値を保存したい場合に使うのがおなじみの「配列」。
ただしlocalStorageは文字列形式で値が格納されるので、保存前にJSON形式に変換する必要がある。

```js
var array = [];
var obj = {
  'キー1': '値1',
  'キー2': '値2'
};
array.push(obj);
 //JSON形式に変換
var setjson = JSON.stringify(obj);
localStorage.setItem('キー', setjson);
```

データの取得
データの取得は`localStorage.getItem()`を使います。

```js
localStorage.getItem('キー');
```

配列を取り扱う場合
JSON形式で取得した値はJSON.parse()してJaveScriptで使えるオブジェクトに戻す

```js
var getjson = localStorage.getItem('キー');
var obj = JSON.parse(getjson);

// obj['キー1']などで取り出し可能に
```
【Godot】コリジョンレイヤーとマスクについて

# 概要
この記事では、Godot Engineでの コリジョンレイヤーとマスクについて説明します。

# プロジェクト作成時の挙動
プロジェクト作成時、`KinematicBody2D` などのコリジョンは、すべてのオブジェクトに対して衝突を行います。
これは物理挙動としては正しいのですが、ゲームとしての衝突、特定のオブジェクトに対して衝突を除外するようなときに不便です。
例えば以下のような2Dシューティングの衝突ルールの場合……

* Playerは、Enemy(敵)とBullet(敵弾)のみ衝突を行いたい
* Shot(自機から発射される弾)は、Enemyのみ衝突を行いたい
* Enemyは、PlayerとShotのみ衝突を行いたい
* Bulletは、Playerとのみ衝突を行いたい

|        |Player|Shot|Enemy|Bullet|
|---     |---|---|---|---|
|Player  |---|  |○  |○  |
|Shot    |  |---|○  |  |
|Enemy   |○  |○  |---|  |
|Bullet  |○  |  |  |---|

Godotでは、このように特定のオブジェクトとのみ衝突を行う仕組みとして、「コリジョンレイヤーとマスク」が用意されています。

# コリジョンレイヤーの名前を設定
`プロジェクト > プロジェクト設定` からプロジェクト設定を開くと、`一般 > Layer Names > 2d/3d Physics` からレイヤー名を設定できます。(`2d/3d Render`は描画用のレイヤーでコリジョンとは別ものとなることに注意！）
今回は2Dで判定を行いたいので、以下のように設定しました。
![Godot_Engine_-_TestCollision_-_Player_tscn____.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/cc6bf757-dbaf-12af-3111-f33bcbf4647b.png)

この設定をすることで、各オブジェクトの `PhysicsBody2D > Collision` から「コリジョンレイヤーとマスク」をわかりやすく名前で管理することができます。
![Godot_Engine_-_TestCollision_-_Player_tscn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/3dfe8ec6-99e9-e2dd-b000-08a026d2361e.png)

## レイヤーとマスクの関係
レイヤーとマスクの関係は以下のとおりです。

* **レイヤー**：自分が所属しているコリジョン
* **マスク**：自分が当たり判定を行うコリジョン

例えば Player は Playerレイヤーに所属し、マスク(衝突対象)は Enemy/Bullet となります
![Godot_Engine_-_TestCollision_-_Player_tscn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/6d7cfe9f-f219-b6c7-68ec-520ef5f22a88.png)

Shotは、Shotレイヤーに所属し、マスクはEnemyです
![Godot_Engine_-_TestCollision_-_Shot_tscn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/d9e2dd0c-fc45-ba34-d1cd-773d78c87293.png)

Enemyは、Enemyレイヤーに所属し、マスクはPlayerです
![Godot_Engine_-_TestCollision_-_Enemy_tscn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/0e3a06a4-afde-a6db-99b8-69c6582b7825.png)

Bulletは、Bulletレイヤーに所属し、マスクはPlayerです
![Godot_Engine_-_TestCollision_-_Bullet_tscn.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/002193d0-3ff6-cda8-7891-80f548d2064e.png)

実行して動作を確認してみます。
まずは Player です。
Playerは、EnemyとBulletとのみ当たり判定を行います。
![shot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/77637810-69e4-e58e-b81e-15cec256a5eb.gif)
"Shot" とは当たり判定を行わないようになっています。

Shotの当たり判定を見てみます。
![shot.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43772/20646ab8-a50d-9789-df27-8bb477f5ed03.gif)
Shotは Enemyとのみ当たり判定を行うので、それ以外とは衝突しなくなっています。同じレイヤーである `Shot` とも衝突しなくなっています。


# 参考

* [Godot Docs » 物理 » 物理の紹介](https://docs.godotengine.org/ja/stable/tutorials/physics/physics_introduction.html)
【Java】メソッド参照とコンストラクタ参照

# メソッド参照とは

すでに定義済みのメソッドを、引数なしで呼び出せるのがメソッド参照です。
これを使うと、ラムダ式を書かずに直接メソッドを実行できる、などのメリットがあります。

```java
class Person {
    private final String firstName;
    private final String lastName;

    public Person(String firstName, String lastName){
        this.name = firstName;
        this.surname = lastName;
    }

    public String getName(){ return firstName; }
    public String getSurname(){ return lastName; }
}

List<Person> people = getSomePeople();
```

# メソッド参照

```java
people.stream().map(Person::getFirstName)
```

ラムダ式で書いた場合

```java
people.stream().map(person -> person.getFirstName())
```

# 静的メソッド

以下は Integer を String に変換しています

```java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
numbers.stream().map(String::valueOf)
```

ラムダ式で書いた場合

```java
numbers.stream().map(num -> String.valueOf(num))
```

# コンストラクタ参照

以下は String を Integer に変換しています

```java
List<String> strings = Arrays.asList("1", "2", "3");
strings.stream().map(Integer::new)
```

ラムダ式で書いた場合

```java
strings.stream().map(s -> new Integer(s));
```

#参照
[Javaメソッド参照・コンストラクター参照
](http://www.ne.jp/asahi/hishidama/home/tech/java/methodreference.html)
重複ファイルを探す そして 消す

# 無駄な重複ファイル、消したいですよね。

学生時代大学とかで使っていた発表資料で同じものがいくつも出て来て困った…ので
重複ファイルを消す方法を考えてみました。
最善の方法ではないかもしれませんが、私はこの方法でやってみました。

アルゴリズムとしては
ファイルのCRCチェックサムを使って配列を作り、そのチェックサムと同じものがあったら削除対象にしましょう
というもの。
##スクリプト例

```{bash:duplicatesearch.sh}
#!/bin/bash

IFS=$'\n' #区切り文字を改行だけにした。

list1=($(find $1 -type f -print0 | xargs -0 cksum)) # -print0 と -0 は日本語とかが入っているファイル名に有効。
list2=($(find $2 -type f -print0 | xargs -0 cksum)) #  md5sum なども考えられたが、難しいのでcksumにした。

for i in ${list1[@]}
do
        I1=$(echo ${i}|cut -d" " -f1)
        I2=$(echo ${i}|cut -d" " -f3-)
        array[${I1}]=${I2}#連想配列にしたかったが、うまくいかなかった。とりあえずこれで動く。
done

for j in ${list2[@]}
do
        J1=$(echo ${j}|cut -d" " -f1)
        if [ -f ${array[${J1}]} ] && [ x != x${array[${J1}]} ]
        then
                echo rm \"${array[${J1}]}\" #スペースが入っていたりすると上手くコマンドが機能しないので、\"で対処。
        fi
done
```

ミソは特にないです。出力先を変えていろいろ試してみてください。
すごく時間がかかりますそれは並列化されていないから。それが悩みの種。
あと、いきなり削除とかはやめて一度出力したリストを眺めて本当に消してもいいのか確認した方が良いでしょう。

## 使い方

```{sh}
chmod 755 ./duplicatesearch.sh
./duplicatesearch.sh フォルダ(削除したいほうのフォルダ) フォルダ(マッチさせたいフォルダ)
```

てなかんじ。
以上。
定期購読かそれとも書店で都度買うか

年末年始にお金の使い方を振り返って、新年のお金の使い方を検討したときに週刊誌などの買い方をどうするか考えた時のメモです。

週刊、月刊のように定期的に刊行される書籍の場合、定期購読を申し込むと割引が受けられる場合があります。
見直した定期刊行誌と一年間定期購読した場合の割引率は以下の通りです。
- 東洋経済は、確か1月末までの申し込み限定でしたが、割引率の高い定期購読申込みキャンペーン（お年玉キャンペーン）をしていたので通常の申し込みの場合と並べて記載しています。
- 日経コンピューターは、郵便振替用紙を使用して振り込む場合の金額です。クレジットカード払いだとさらに割引率が上がります。

（名称のあいうえお順）

|誌名|頻度|定価|年間冊数|1年定期購読|割引率|
|:--|:--|--:|--:|--:|--:|
|エコノミスト|週刊|700円|49冊|28900円|17％|
|ダイヤモンド|週刊|730円|50冊|26200円|28％|
|東洋経済|週刊|730円|50冊|通常28000円|23％|
|(同上)|週刊|730円|50冊|お年玉19800円|46％|
|日経コンピューター|月2回|1240円|26冊|24900円|23％|
|プレジデント|月2回|780円|24冊|12000円|36％|

ちなみに割引率＝ (1-1年定期購読/(定価×年間冊数))×100

定期購読を申し込む目安として、下記の割引率を判断基準としました。
- 書店で3冊のうち2冊以上購入しているものは割引率33％以上あること
- 4冊のうち3冊以上の場合は割引率25％以上あること
- 5冊のうち4冊以上の場合は割引率20％以上あること

|誌名|割引率(再掲)|判断|理由|
|:--|:--|:--|:--|
|エコノミスト|17％|No|3冊のうち2冊以上購入しているが、割引率の判断基準を満たさず|
|ダイヤモンド|28％|No|3冊のうち2冊以上購入しているが、4冊のうち3冊以上購入しているかは怪しい|
|東洋経済|お年玉46％|Yes|3冊のうち2冊以上購入している|
|日経コンピューター|23％|Yes|5冊のうち4冊以上購入している|
|プレジデント|36％|No|2020年は3連続で買わないこともあった。2冊のうち1冊くらいの購入頻度かもしれない|

上記の結果から、東洋経済と日経コンピューターは定期購読を申し込むことにしました。

次に3年間の定期購読の場合の割引率も計算してみました。日経コンピューターは、郵便振替用紙を使用して振り込む場合の金額です。

|誌名|頻度|定価|3年間冊数|3年定期購読|割引率|
|:--|:--|--:|--:|--:|--:|
|エコノミスト|週刊|700円|147冊|68000円|34％|
|ダイヤモンド|週刊|730円|150冊|59700円|45％|
|東洋経済|週刊|730円|150冊|63000円|42％|
|日経コンピューター|月2回|1240円|78冊|52300円|46％|
|プレジデント|月2回|780円|72冊|28500円|49％|

この先3年間の間、3冊のうち2冊くらいは必ず買うだろう、そして定価も同額のままだろう、と仮定した場合、
- エコノミストの場合は都度購入する場合と3年定期購読がとんとんくらい
- エコノミスト以外の場合は3年定期購読のほうが有利
ということがわかります。

今後1年間だけではなく、3年後も購入する可能性が高いだろうか？日経コンピューターについては自信をもってYes だったので、1年間ではなく3年間の定期購読を申し込みました。

東洋経済については3年間(42％)よりもお年玉キャンペーンによる1年間の定期購読の割引率(46％)が高いので1年間の定期購読申込みとし、また次の年末年始に見直しをしようと思います。

その他については3年後も比較的高頻度で購入しているのかどうか自信が持てませんでした。そのため定期購読自体をNoとし、都度購入としてまた次の年末年始に見直しをしようと思います。

(20220404追記)ちなみに今頃気づいたんですが、勤め先では Benefit Station というものに加入していて、週刊誌や月刊誌の種類によっては定期購読が通常よりもお得な場合があるので今後使用を検討しようと思います
【TypeScript】0からTypeScriptを始める方法【Hello World】

0からTypeScriptのプロジェクトを作成し、コンパイルして動かしてみます！

* 手動でコンパイルする方法
* lite-server を使って、変更を自動検知してコンパイルする方法
* watchモードで、変更を自動検知してコンパイルする方法
* tsconfig.jsonを作成し、プロジェクト全体の変更を自動検知してコンパイルする方法

#🌟手動でコンパイルする方法

* node と npm は事前にインストールが必要です(^o^)
* 以下の環境で行っております

```bash
$ node -v
v12.18.3
$ npm -v
6.14.6
```

###① TypeScriptを動かすプロジェクトを新規作成

```bash

$ mkdir hello-typescript
$ cd hello-typescript

// デフォルトのpackage.json を生成
$ npm init -y 
```

```json:package.json
{
  "name": "hello-typescript",
  "version": "1.0.0",
  "description": "",
  "main": “app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}
```

###② npmを使ってTypeScriptコンパイラをインストール

```bash

$ npm install -g typescript
$ tsc -v 
//Version 4.1.5
```

###③ TypeScriptファイルを作成して、コンパイル実行

```app.ts
console.log('TSを読み込んでいるよ！');
```

```bash

$ tsc app.ts  
// tscコマンドで、app.jsが作成されます
$ node app.js  
//TSを読み込んでいるよ！
```

###④ TypeScriptファイルを変更して、再度コンパイルしたら、変更が反映されます

```ts:app.ts
console.log('TSを読み込んでい〜る〜よ〜！');
```

```bash
$ tsc app.ts  
// app.jsを再度作成します
$ node app.js 
//TSを読み込んでい〜る〜よ〜！
```

* 毎回コンパイルするのは、面倒です。。
* そこで、変更を自動で検知できる方法を使います！

#🌟lite-server を使って、変更を自動検知してコンパイルする方法


###① プロジェクトを作成

```bash

$ mkdir hello-typescript
$ cd hello-typescript
$ npm init -y 
```

###② package.jsonを変更し、依存関係をインストールします
* npm start で呼ばれるlite-serverとは、node.js上で動作する開発用のhttpサーバです


```package.json
{
  "name": "hello-typescript",
  "version": "1.0.0",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "lite-server"
  },
  "dependencies": {
    "lite-server": "^2.6.1"
  }
}
```

```bash
$ npm install  
//package.jsonに記載されたパッケージをインストール
```


###③ npmを使ってTypeScriptコンパイラをインストール

```bash
$ npm install -g typescript
$ tsc -v 
//Version 4.1.5
```


###③ TypeScriptファイルを作成

```ts:app.ts
console.log('TSを読み込んでいるよ！');
```

```html:index.html

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>TypeScript</title>
  <script src="app.js" defer></script>
</head>
<body>
<h1>Hello TypeScript</h1>
</body>
</html>

```

###④ lite-server を起動してコンパイル

```
$ npm start   //サーバを立てておく
$ tsc app.ts  // app.jsが作成されます
```


* http://localhost:3000
* lite-server を立てておくことで、app.ts ファイルの変更を検知してブラウザで表示中のページを自動でリロードしてくれます✨



#🌟watchモードで、変更を自動検知してコンパイルする方法

* watchモードでも、指定のTypeScriptファイルに変更があった際に、自動でコンパイルできます

```bash
$ tsc app.ts —watch
$ tsc app.ts -w
```

#🌟tsconfig.jsonを作成し、プロジェクト全体の変更を自動検知してコンパイルする方法

* tsconfig.jsonを作成することで、TypeScriptに管理してほしいプロジェクトの場所を教えます

```bash
$tsc —init
//tsconfig.jsonが作成される。この配下はTSによって管理される
```

* これで、自動で配下の.tsを探して全部コンパイルできます

```bash
$tsc 
$tsc —watch 
$tsk -w
```
expoでbuildしたiOSアプリ、ITMS-90163エラーでTransporterからアップロードできない

Expoで作っていたiOSアプリのちょい直しをして、Transporterアプリでアップロードしようしとしたら、下のITMS-90163エラーが出てアップロードできなくなりました。

> ERROR ITMS-90163: "Invalid Code Signing Entitlements. The entitlements in your app bundle signature do not match the ones that are contained in the provisioning profile. The bundle contains a key that is not included in the provisioning profile: 'com.apple.developer.associated-domains' in 'Payload/ExpoKitApp.app/YourAppDomain'."


developer.apple.comでCertificateを見てみると、Associated Domainsのチェックが外れている（下の画像はつけ直したあとのもの）。

![Notification_Center.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45686/97608a88-4d80-7740-24ef-c0cb07617e54.png)


app.jsonで以下のようにAssociated Domainの指定があるのにも関わらず、このチェックが外れているせいでエラーになっているようでした。

```
"associatedDomains": [
                "applinks:xxxx.com"
]
```

ということで、ここのチェックを付けて、その上で `expo build:ios --clear-provisioning-profile` を実行する(Capabilityの設定を変えるとprovisioning profileが無効になる)とようやくTransporterアプリでアップロードできました。

しかし、このチェックを外した気が全くしないんですけど、なぜ外れたかは不明なまま。もしくは、このチェックはずっと外れていて、app.jsonでのAssociated Domainsの指定は意味がなかったのに急に有効になったのかも。解決するのに2日間ぐらい溶かしました。エラーメッセージちゃんと読めという話ですが、ズバッと解決する方法がぐぐってもすぐに出てこなかったので、メモとして残しておきます。
Power Appsのレスポンシブレイアウトをやってみた　～ヘッダー解説編～

#今回はヘッダーを作成していきます。
前回までの内容で１．設定、２．コンテナ作成とおこなってきました。
今回は、ヘッダー部分の実装を解説していきます。

今回から読み始めていただいた方は、下記ブログをまずは内容確認してください。
・[Power Appsのレスポンシブレイアウトをやってみた　～準備編～](https://qiita.com/rockfun/items/12615a5f1bdbfdfe7c57)
・[Power Appsのレスポンシブレイアウトをやってみた　～コンテナ解説編～](https://qiita.com/rockfun/items/e258e06b52c3126b0fc0)

##完成形はこの様な形になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/cbb948b9-d9f0-af91-e4d5-7e7363d241cd.png)

##HeaderContainerを設定する
HeaderContainerを選択して、下記プロパティを以下に設定します。
・LayoutJustifyContent：LayoutJustifyContent.SpaceBetween
・LayoutAlignItems：LayoutAlignItems.Center
下記写真の
両端揃え（水平方向）を「間のスペース」
配置（垂直方向）を「中央揃え」と選ぶのと同じ意味です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/e1a8f025-1a22-01cb-c016-eda91bf3a699.png)


##ヘッダーコンテナー内にテキストラベルと画像を配置する
まず、HeaderContainerを選び、内部に以下のテキストラベルと画像を配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/719df2c9-2f39-1ab8-053f-d4eb9dabc093.png)

・テキストラベル名：DateLabel
・テキストラベル名：AppNameLabel
・テキストラベル名：StaffNameLabel
・画像：StaffPicture

##各アイテムごとの設定
###テキストラベル名：DateLabel
本日の日付を表示します。
Text：Today()
Size（※１）：Switch(BrakePointText.Text,"Small",10,"Medium",12,14)
FillPortions（※２）：1
LayoutMinWidth（※３）：100

（※1）Switch文を使って、前回作成したBrakePointTextがSmall（スマホ）なら文字サイズ10ポイント、Medium(タブレット）なら12ポイント、それ以外は14ポイントに指定して、サイズごとに文字サイズを変更しています。
（※2）FillPoerionsは幅を自動伸縮させます。0は固定幅（Width指定値）他の値は横に並ぶラベル同士の比率になります。この値が大きいほど、他のラベルよりも表示幅を取ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/140547/80b3de69-8a8f-e217-df5f-a5ab7f2d1622.png)
（※3）LayoutMinWidthは最小幅です。

###テキストラベル名：AppNameLabel
アプリ名を表示します。
Text：サンプルアプリ（お好きな名前でどうぞ）
Size：Switch(BrakePointText.Text,"Small",12,"Medium",18,24)
FillPortions（※1）：3
LayoutMinWidth：100

（※1）AppNameLabelは、縮小したときも幅を他よりも大きく表示させたいので、FillPortionsは3を指定しています。


###テキストラベル名：StaffNameLabel
ユーザー名を表示します。
Text（※1）：
Concatenate(Last(Split(User().FullName," ").Result).Result," ",First(Split(User().FullName," ").Result).Result)
Size：Switch(BrakePointText.Text,"Small",10,"Medium",12,14)
FillPortions：1
LayoutMinWidth：100
Visible（※2）：Switch(BrakePointText.Text,"Small", false ,"Medium", true , true )

（※1）名前は、User().FullNameだと氏名を逆に表示してしまうので、日本名に合わせるように変更しています。
<font color=red>(※2）重要：スマートフォンのサイズの時に、名前は非表示にして表示幅を確保しています。</font>

###画像：StaffPicture
ユーザーの画像を表示します。
Image：User().Image
Height：80
Width：80
RadiusTopLeft(※1）：45

（※1）写真を角を取って丸く表示するのに45度を指定しています。

-----

以上で、レスポンシブなヘッダーを作成することが出来ました。

今回１番重要なのは、表示幅に応じてStaffNameLabelを表示・非表示を切り替えているところです。
幅のあるPCの時には**表示**、幅の無いスマートフォンの縦表示の時には**非表示**にすることで、最適なレイアウトを構築できますので、ぜひ他のシーンでも活用していただきたいです。

次回は、BodyContainerを解説していきます。
今回も、読んでいただいて、ありがとうございました。
QiitaのMarkdown、ご存じないかもな 1制約☺＿。

#制約一覧

1. 画像を何枚か並べると、どうしても、表示されない場合あり。:no_good::no_good:

#[1]画像を何枚か並べると、どうしても、表示されない場合あり。

メモリ量の制約かとも思いますが、

* 下書きのときには、セーフです。
* 下書き後、「更新」した直後もセーフですが、改めて、閲覧すると表示されない。

⇒　バグの部類？？ 

|制約の回避方法|
|:---:|
|いまのところ、知りません。|

##実際の例。例1
この例では、最後(8個目）の画像（火山の溶岩が流れている画像）が表示されていないと思う。

以下の記事で発見。

[(深層学習の画像認識。)実装まちがい検証方法。[学習済みモデル編]](https://qiita.com/enoughspacefor/items/6b0a1371db5f11575981)

|↓↓ここから、例1 です。|
|:---:|


###imagenetの画像のURL
（このページの画像は、あえて、直接リンクしていますので、
画像が表示されていなかった場合には、その画像は、imagenetの元画像のリンク先の消滅を意味します。その場合は、気づいたら見直します。）

■Indian elephant, Elephas maximus
画像EL01:
http://farm3.static.flickr.com/2154/1880985183_37d1b66617.jpg
<img src="http://farm3.static.flickr.com/2154/1880985183_37d1b66617.jpg" width=150>
画像EL02:
http://static.flickr.com/49/117174803_7f3ac571fb.jpg
<img src="http://static.flickr.com/49/117174803_7f3ac571fb.jpg" width=150>

■Pineapple, ananas
画像PI01:
http://farm1.static.flickr.com/144/387502364_5063d4b0f7.jpg
<img src="http://farm1.static.flickr.com/144/387502364_5063d4b0f7.jpg" width=150>

画像PI02:
http://static.flickr.com/109/256830232_c8cfe8ea58.jpg
<img src="http://static.flickr.com/109/256830232_c8cfe8ea58.jpg
" width=150>

■Harp
画像HA01:
http://www.museweb.com/harp/harp2.jpg
<img src="http://www.museweb.com/harp/harp2.jpg" width=150>
画像HA02:
http://cimg2.163.com/catchimg/20080328/4242764_3.jpg
<img src="http://cimg2.163.com/catchimg/20080328/4242764_3.jpg" width=150>

■Volcano
画像VO01:
http://static.flickr.com/1240/1475476681_78b02ab5ff.jpg
<img src="http://static.flickr.com/1240/1475476681_78b02ab5ff.jpg" width=150>

画像VO02:
http://ccn1.net/POTD7/mount-merapi-indonesia-lava-flow.jpg
↑↓（何かのマジックで、Qiita記事で画像が表示されないことがあるかも。ただ、リンクは正常なので、無視して下さい。htmlタグでの画像表示のメモリ制限？）
<img src="http://ccn1.net/POTD7/mount-merapi-indonesia-lava-flow.jpg" width=150>


|↑↑ここまで、例1 です。|
|:---:|
IPアドレス　サブネットについて

グローバルIPアドレスは、
クラスA　 0.0.0.0 ~ 127.255.255.255 
クラスB  128.0.0.0 ~ 191.255.255.255	
クラスC  192.0.0.0 ~ 223.255.255.255
が存在する。


クラスAは、ネットワークアドレスが8ビット(先頭0)
クラスBは、ネットワークアドレスが16ビット(先頭10)
クラスCは、ネットワークアドレスが24ビット(先頭110)

しかし、クラスAの先頭1ビットは0で決まっているので、2の7乗の128個の団体(ネットワーク)が残りのホスト部24ビット(16777216個)に対してIPアドレスを割り振っている。
クラスAに属するIPアドレスの数は、128(ネットワークス数)*16777216(それぞれのネットワークに存在するホスト数)=2147483648

同様に、クラスBの先頭2ビットは10で決まっているので、2の14乗の16384個の団体(ネットワーク)が残りのホスト部16ビット(65536個)に対してIPアドレスを割り振っている。
クラスBに属するIPアドレスの数は、16384*65536=1073741824

同様に、クラスCの先頭3ビットは110で決まっているので、2の21乗の2097152個の団体(ネットワーク)が残りのホスト部8ビット(256個)に対してIPアドレスを割り振っている。
クラスCに属するIPアドレスの数は、2097152*256=536870912

A+B+Cの合計は3758096384。
約37億個。
32ビットだから、2の32乗で43億個あるはずだが、ここではクラスDとクラスEがないため。



#サブネット
ある一つのネットワークに属するものを、さらに細かく分けるからサブネットという
例えば、2097152個のネットワーク取れるクラスCのうち、192.64.1.0という1つのネットワークがあったとする。
![スクリーンショット 2021-05-25 6.14.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546786/cb10df71-e418-42ac-ff50-aa9ca814008f.png)
このネットワークのうちホストが取れる範囲は、0〜255通り。
![スクリーンショット 2021-05-25 6.17.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546786/c94a4406-9af1-31f7-492f-b14783a2fe36.png)


このネットワークをさらにもう一つ細かく下の階層に作れる。
これがサブネットマスク。通常クラスCだと、192.64.1.0/24であるが、192.64.1.0/26にする。
すると、
最後の4オクテッドの最初の2ビットに注目すると、
00000000
01000000
10000000
11000000
という4つのネットワークに分けれる。
この2進数を10進数に変換すると、
0(0〜63)
64(63〜127)
128(128~191)
192(192~255)
になる。

![スクリーンショット 2021-05-25 6.28.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546786/a723d605-0c16-3eff-3ae6-9b6de4178abe.png)




#プライベートIP
グローバルIPがクラスAに属しているから、プライベートIPがクラスAしか属さないということはない。
グローバルIPのクラスとプライベートIPのクラスは、関係ない。
大体の人のlanは、勝手にDHCPサーバによってクラスCの/24のサブネットが構成されているが、
10.0.0.0 ～10.255.255.255（10.0.0.0/8）
172.16.0.0 ～172.31.255.255 （172.16.0.0/12）
192.168.0.0 ～192.168.255.255 （192.168.0.0/16）
この範囲なら、自分で自由に設定可能。
![スクリーンショット 2021-02-22 4.09.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546786/6964a055-a5fc-09c4-3694-fae1374f6a49.png)

グローバルIPがクラスCに属していても、プライベートIPの範囲をクラスAにして、lanのホストは最大2の24乗個接続可能。

その際、24ビットのホスト部を任意に切ってネットワークにプレゼントすることができる。
これがサブネット。ネットワーク部ではなく、ホスト部をネットワーク部にしか渡すことが出来ないので注意。
例えば、クラスAの（10.0.0.0/8）①をサブネット化して（10.0.0.0/９）②にするとネットワークは以下。

![スクリーンショット 2021-02-22 4.30.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546786/1d5284ef-8c37-bbd7-c4c3-a1c1a71c5f0e.png)

プライベートIPは
クラス	範囲	　　　　　　　　　　　　　　　　　　　　　　　　ネットワーク数
クラスA	10.0.0.0 ~ 10.255.255.255 (10.0.0.0/8)	　　　　　1(先頭8ビット区切って終わり)
クラスB	172.16.0.0 ~ 172.31.255.255 (172.16.0.0/12)	16(先頭12ビットのうち、第二オクテッドは、4ビットなので、2^4で16通り)
クラスC	192.168.0.0 ~ 192.168.255.255 (192.168.0.0/16)	256(第３オクテッドを丸々使えるので256)

#自宅のNasの設定が狂った。
原因：NasのプライベートIPが、192.168.1.5だった。
家のLanのネットワークを確認してみると、192.168.3.1(ゲートウェイ)だった。

#####解決：NasのIPに対してDHCP設定して、結果192.168.3.5を自動割り当てしてもらって、同じネットワークにして解決！！


間違えてるところありましたら、コメントお願い致します。
https://teratail.com/questions/323934
https://teratail.com/questions/323936#reply-449240
http://www.runsurunet.com/2017/01/20/%e3%82%b5%e3%83%96%e3%83%8d%e3%83%83%e3%83%88%e3%83%9e%e3%82%b9%e3%82%af%e3%81%ae%e6%a6%82%e5%bf%b5/
Node.js でローカルファイルに書き込む

「いまさらこんな記事かよ」と思われるかもしれませんが意外と落とし穴にハマる事が多いのでケース毎にまとめておきます。

https://nodejs.org/api/fs.html


## 一気に書き込む場合

### エラーチェックの必要がなくて、データが書き込まれる間ユーザーを待たせることができる場合。

**writeFileSync** を使います。

```
const fs = require( 'fs' )
fs.writeFileSync( 'some.file', 'abc' )
```

### エラーチェックが必要であるか、データが書き込まれる間ユーザーを待たせることができない場合。

**writeFile** を使います。

```
const fs = require( 'fs' )
fs.writeFile( 'some.file', 'very long string', er => { if ( er ) throw er } )
```

3番目の引数にはエラーが渡ってきます。例えばファイルを`/some.file`のようにしてルートディレクトリに作ろうとすると以下のようなものが渡ってきます。

```
[Error: EROFS: read-only file system, open '/some.file'] {
  errno: -30,
  code: 'EROFS',
  syscall: 'open',
  path: '/some.file'
}
```

fs.writeFile の呼び出しが終了した時点ではファイルの書き込みは終了していませんが、3番目の引数に渡したコールバックが呼ばれた時点では、ファイルの書き込みが終了しています。

```
const fs = require( 'fs' )
const PATH = 'some.file'
fs.writeFile( PATH, 'very long string', () => console.log( 'コールバックの中', fs.statSync( PATH ).size ) )
console.log( 'writeFileの直後', fs.statSync( PATH ).size )
```

上のようにfs.statSyncを使ってファイルのサイズを取得してると結果は以下のようになります。

```
writeFileの直後 0
コールバックの中 16
```

## 逐次に書き込む場合

### エラーチェックの必要がなくて、データが書き込まれる間ユーザーを待たせることができる場合。

**appendFileSync** を使います。

```
const fs = require( 'fs' )
const PATH = 'some.file'
fs.writeFileSync( PATH, '' )
fs.appendFileSync( PATH, 'abc' )
fs.appendFileSync( PATH, 'abc' )
```

### エラーチェックが必要であるか、データが書き込まれる間ユーザーを待たせることができない場合。

**appendFile** を使います。

```
const fs = require( 'fs' )
const PATH = 'some.file'
fs.writeFile( PATH, '', er => { if ( er ) throw er } )
fs.appendFile( PATH, 'very long string', er => { if ( er ) throw er } )
fs.appendFile( PATH, 'very long string', er => { if ( er ) throw er } )
```

**WriteableStream.write** を使うこともできます。

経験的には appendFile を使う場合より少し高速です。

```
const fs = require( 'fs' )
const PATH = 'some.file'
const writer = fs.createWriteStream( PATH )
writer.on( 'close', er => { if ( er ) throw er } )
writer.write( 'very long string', er => { if ( er ) throw er } )
writer.write( 'very long string', er => { if ( er ) throw er } )
writer.end()
```
NuxtとGraphQLとAWS(Amplify, appsync, dynamodb, cognito, s3....)を用いてWebアプリチュートリアルPart4

## 概要
- [NuxtとGraphQLとAWS(Amplify, appsync, dynamodb, cognito, s3....)を用いてWebアプリチュートリアルPart1](https://qiita.com/kaito_111/items/8633fd0088e07a1c8247)
- [NuxtとGraphQLとAWS(Amplify, appsync, dynamodb, cognito, s3....)用いてWebアプリを作ってみたPart2](https://qiita.com/kaito_111/items/1e6d5f01bb64578dfc12)
- [NuxtとGraphQLとAWS(Amplify, appsync, dynamodb, cognito, s3....)を用いてWebアプリチュートリアルPart3](https://qiita.com/kaito_111/items/1526174a206d91beee97)
- NuxtとGraphQLとAWS(Amplify, appsync, dynamodb, cognito, s3....)を用いてWebアプリチュートリアルPart4


## やること
1. 作成したブログをネットに公開する。

###作成したブログをネットに公開する。
ターミナルで以下のコマンドを実行しましょう
>####target: server（デフォルト値）
>nuxt build - 本番用の webpack を使用してアプリケーションをビルドおよび最適化します。
>####target: static
>nuxt generate -（必要に応じて）アプリケーションをビルドし、すべてのルートを HTML ファイルとして生成し、dist/ ディレクトリに静的にエクスポートします（静的ホスティングに使用されます）。

[公式抜粋](https://ja.nuxtjs.org/docs/2.x/get-started/commands/)
staticとserverで違うようです。

```
% npm run generate
```

```
% amplify hosting add
? Select the plugin module to execute Hosting with Amplify Console (Managed hosting with custom domai
ns, Continuous deployment)
? Choose a type Manual deployment

You can now publish your app using the following command:

Command: amplify publish
```
``amplify publish``コマンドを実行しろというメッセージがあるので実行します

```
% amplify publish
? Are you sure you want to continue? Yes
```

しばらくすると、ホスティング完了です。

```
https://***************.amplify.com
```
urlが表示されるはずです。✌️

参考サイト
- [nuxt公式サイト](https://ja.nuxtjs.org/docs/2.x/get-started/commands/)
アロー関数についてまとめてみた

アロー関数とは名前の通り => を用いて関数を示す記述方法

メリットとしては
・コードの短縮化
・可読性の向上

ではアロー関数について書く前に関数についておさらいしていきましょう。
関数の定義方法には主に2種類あります。
まずは関数宣言(function文)

```main.js
function sample(n) {
  return n*3
}

console.log(sample(2)); // 6
```

次に関数式(無名関数)

```main.js
let sample = function(n) {
  return n*3;
}

console.log(sample(2)); // 6
```

アロー関数はこの関数式を簡略化したものです。
先程の関数式をアロー関数を用いて記述するとこうなります。

```main.js
let sample = n => n*3;

console.log(sample(2)); // 6
```

少ない文で書くことができます。
これはどうなっているかと言うと、まずアロー関数を記述する際にfunctionの記述をなくすことができます。
そして引数(今回はn)が一つだけの場合は引数を囲んでいた()も外すことができます。
さらに実行文が一つだけの場合(今回はreturn文だけ)はそれを囲っていた{}も外すことができます。

アロー関数の記述に関して注意点ですが引数が2つ以上または0個の場合は()は外せません。
その場合の記述はこちら

```main.js
//引数が複数の場合
let sample = (a,b) => a+b;
console.log(sample(2,3)); // 5

//引数が0個の場合
let sample = () => console.log("Hello!");
sample(); // Hello!
```

少し応用

```main.js
let sample = (str) => {
  var ans = str + "こんにちは";
  return ans;
}

console.log(sample("田中さん")); //田中さんこんにちは
```

このように記述することもできます。

アロー関数は最初は見慣れないかもしれませんが慣れてくると読みやすいコードを書くことが可能なのでこの機会にマスターしていきましょう！
Javaと比較したC#の予約語

#はじめに
Javaプログラマーでしたが、仕事でC#を使うようになったので今回の記事を作成するに至りました。

#予約語
|Java  |C#  |説明  |
|---|---|---|
|abstract  |abstract |抽象クラスの宣言で使用 |
|assert|なし|プログラムの動作検証に使用|
|break  |break  |処理を中断させる命令|
|case  |case  |switch文の条件ラベルで使用|
|catch  |catch  |例外処理で使用(try-catch-finally)|
|class  |class  |クラス宣言で使用|
|continue  |continue  |以降の処理をスキップして処理を継続させる命令|
|default  |default  |switch文で使用|
|do  |do  |繰り返し処理で使用(do-while)|
|else  |else  |条件式で使用（if-else）|
|enum  |enum |複数の定数を列挙型で保持する|
|extends  |:  |継承するクラスを指定する|
|false  |false  |論理値型|
|final  |sealed  |クラス、メソッド、変数宣言に使用する修飾子|
|finally  |finally  |例外処理で使用(try-catch-finally)|
|for  |for  / foreach  |繰り返し処理で使用|
|if  |if  |条件式で使用（if-else）|
|implements  |:  |クラスのインターフェース実装で使用|
|imort  |using  |クラスのインポートで使用|
|instanceof  |is  |オブジェクトのクラス判定を行う演算子|
|interface  |interface  |インターフェースの宣言で使用|
|native  |extern  |異なる言語で記述されたメソッドを示す修飾子|
|new  |new  |インスタンスの生成に使用する演算子|
|null  |null  |ナル（ヌル）|
|package  |namsespace  |クラスの集まりをまとめたもの|
|private  |private  |アクセス修飾子のひとつ|
|protected  |protected  |アクセス修飾子のひとつ|
|public  |public  |アクセス修飾子のひとつ|
|return  |reurn  |メソッドの戻り値を返す文|
|static  |static  |静的なメソッドや変数を指定する修飾子|
|strictfp  |なし  |浮動小数点をIEEE754規格で処理するための修飾子|
|super  |base  |サブクラスからスーパークラスを参照する際に使用|
|switch  |switch  |条件分岐処理で使用|
|synchronized  |lock  |スレッドの排他制御を行う場合に使用|
|this  |this  |同じクラスのメソッドや変数を参照する場合に使用|
|throw  |throw  |例外を発生させる場合に使用|
|throws  |なし  |呼び出し元のメソッドに例外処理を委任する際に使用|
|transient  |なし  |オブジェクトをシリアライズ対象外とする修飾子|
|true  |true  |論理型値|
|try  |try  |例外処理で使用(try-catch-finally)|
|void  |void  |値を返さない型|
|volatile  |volatile  |共有メモリと各スレッドの変数の値を一致させる修飾子|
|while  |while  |繰り返し処理で使用(do-while) |

#参考文献
https://ufcpp.net/study/csharp/java_cheatsheet.html
https://eng-entrance.com/java-reserved-word
Excelのセル範囲に記録された内容をxml形式で出力する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/4f6014eb-d237-03c0-e507-2adbfef1f4ec.png)

上記のテーブルをxmlファイルに変換して出力するサンプルコードを記載する。


```CellRange_to_XMLFile.bas
Option Explicit

Sub CellRangeToXMLFile()
    Dim myXMLDoc As Object, myNode As Object
    Dim ConstList As Object
    Dim myRootNode As Object, tmpNode As Object
    Dim myRange As Range, i As Long, j As Long
    
    Set ConstList = New ConstClass
    Set myXMLDoc = CreateObject(ConstList.XMLCONFIG.Item("cntLIBRARY"))
    With myXMLDoc
        Set myNode = _
            .CreateProcessingInstruction(ConstList.XMLCONFIG.Item("cntXMLPREFIX"), _
                                         ConstList.XMLCONFIG.Item("cntXMLFORMAT"))
        .AppendChild myNode
    
        Set myRootNode = .CreateElement(ConstList.XMLCONFIG.Item("cntDATANAME"))
        Set myRange = Range(ConstList.XMLCONFIG.Item("cntSTARTDATA")).CurrentRegion
        For i = 2 To myRange.Rows.Count
            Set myNode = .CreateElement(ConstList.XMLCONFIG.Item("cntTABLENAME"))
            myNode.SetAttribute ConstList.XMLCONFIG.Item("cntKeyName"), _
            myRange.Cells(i, 1).Value
            For j = 2 To myRange.Columns.Count
                Set tmpNode = .CreateElement(myRange.Cells(1, j).Value)
                tmpNode.AppendChild .CreateTextNode(myRange.Cells(i, j).Value)
                myNode.AppendChild tmpNode
            Next
            myRootNode.AppendChild myNode
        Next
        .AppendChild myRootNode
        .Save ThisWorkbook.Path & ConstList.XMLCONFIG.Item("cntOUTPUTXML")
    End With
End Sub
```

```ConstClass.cls
Option Explicit

Private xmlFile As Object

Private Sub Class_Initialize()
  Call xml_config
End Sub

Public Property Get XMLCONFIG() As Object
  Set XMLCONFIG = xmlFile
End Property


Private Sub xml_config()
  Set xmlFile = CreateObject("Scripting.Dictionary")
  xmlFile.Add Key:="cntLIBRARY", Item:="MSXML2.DOMDocument"
  xmlFile.Add Key:="cntXMLPREFIX", Item:="xml"
  xmlFile.Add Key:="cntXMLFORMAT", Item:="version=""1.0"" encoding=""UTF-8"""
  xmlFile.Add Key:="cntDATANAME", Item:="FishMarketData"
  xmlFile.Add Key:="cntSTARTDATA", Item:="A1"
  xmlFile.Add Key:="cntTABLENAME", Item:="Sales"
  xmlFile.Add Key:="cntKeyName", Item:="No"
  xmlFile.Add Key:="cntOUTPUTXML", Item:="\XMLデータ.xml"
End Sub
```

以下のようなxmlファイルが出力される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274248/35e15534-ac38-07c4-5e5f-17e25ab2caac.png)
Macの設定ことはじめ

# 新しくMacを設定する

開発関係に致命的な問題がなさそうなので、M1チップが乗ったMacBookAirを買いました。
Mac触るの初めてな方へ、まずはここら辺の設定を変えれば良いと思うよと伝えるための記事を書くチャンスかなと思ったのでこれを書いております。
「プログラミング」かと言われたらそうではないのですが、環境の整備もその一環であると思うので公開していおります。

## 解像度変更とTrue Toneを無効

![スクリーンショット 2021-02-22 1.32.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526492/cc9fa122-37ec-d830-488a-be0f7b75cace.png)

初期状態のMacは解像度が「デフォルト」(1440*900)に設定されているため、より上の解像度である「スペースを拡大」(1680*1050)に変更しました。
(これより広い解像度が欲しい場合はアプリで変更可能です)

また、いつでも同じ色で表示して欲しいので、TrueToneのチェックを外し、無効にしました。

## スクロール方向を無効

![スクリーンショット 2021-02-22 1.33.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526492/e11fe9e3-f56b-1835-747a-d3d9fd9ac86a.png)

スマートフォンと同じような操作感を実現する「スクロールの方向：ナチュラル」ですが、Macを使っている上ではどうにも気持ち悪いので向こうにしました。

## ライブ変換を止める

![スクリーンショット 2021-02-22 1.33.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526492/58952b59-b029-801c-e129-ca9e0ac99f14.png)

日本語入力している最中に変換が行われるライブ変換は慣れれば良いものだと聞くのですが、複数のOSを日常的に使っているとどうにも馴染めないので無効にしました。
ライブ変換のチェックを外せば無効になります。

# 設定は個人の好みを反映

以上、まず行う設定を記載しました。
Windows等の他OSから来た方はこちらを変更すると使いやすくなるかと思います。
いずれにしろ、設定.appから変えられるくらいのものであれば自分の好みに合わせた方が使いやすいと思うので、いじり倒すと良いと思います。
xをn乗した数をmで割った余りを求める

## 使いどころ
* b進数で表したときの下n桁を求める

## 単純版 O(n)

```c++
int mod_pow(int x, int n, int m){
    int r = 1;
    while(n--){
        r *= x;
        r %= m;
    }
    return r;
}
```
## 高速版 O(logn)

```c++
#include <bitset>

int mod_pow(int x, int n, int m){
    int r = 1;
    bitset<64> bs(n);
    for(int i = 0; i < 64; i++){
        x %= m;
        if(bs[i]) r = (r * x)%m; 
        x *= x;
    }
    return r;
}
```
[React Bootstrap] Modal モーダル

**参考URL**
https://www.pluralsight.com/guides/how-to-hide-%22react-bootstrap-modal%22-form-that-has-preventdefault()-inside-its-onsubmit

```modal.js
import React, { useState } from "react";
import { Modal, Button, Form } from "react-bootstrap";

const LoginForm = ({ onSubmit }) => {
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");
  return (
    <Form onSubmit={onSubmit}>
      <Form.Group controlId="formBasicEmail">
        <Form.Label>Email address</Form.Label>
        <Form.Control
          type="email"
          placeholder="Enter email"
          value={email}
          onChange={(e) => setEmail(e.target.value)}
        />
      </Form.Group>

      <Form.Group controlId="formBasicPassword">
        <Form.Label>Password</Form.Label>
        <Form.Control
          type="password"
          placeholder="Password"
          value={password}
          onChange={(e) => setPassword(e.target.value)}
        />
      </Form.Group>
      <Form.Group controlId="formBasicCheckbox">
        <Form.Check type="checkbox" label="Remember Me!" />
      </Form.Group>
      <Button variant="primary" type="submit" block>
        Login
      </Button>
    </Form>
  );
};

export default function App() {
  const [show, setShow] = useState(false);

  const handleClose = () => setShow(false);
  const handleShow = () => setShow(true);

  const onLoginFormSubmit = (e) => {
    e.preventDefault();
    handleClose();
  };

  return (
    <>
      <div
        className="d-flex align-items-center justify-content-center"
        style={{ height: "50vh" }}
      >
        <Button variant="primary" onClick={handleShow}>
          Launch Form modal
        </Button>
      </div>
      <Modal show={show} onHide={handleClose}>
        <Modal.Header closeButton>
          <Modal.Title>Login Form</Modal.Title>
        </Modal.Header>
        <Modal.Body>
          <LoginForm onSubmit={onLoginFormSubmit} />
        </Modal.Body>
        <Modal.Footer>
          <Button variant="secondary" onClick={handleClose}>
            Close Modal
          </Button>
        </Modal.Footer>
      </Modal>
    </>
  );
}
```
webサイトの概要理解

webサイトの概要を理解する、その中でも基礎中の基礎になります。
###どなた向けの記事か
→これから勉強をスタートしようと考えている方!!
それでは早速内容へ↓

Webサイトは大きく分けて「構成」、「見た目」、「動き」の3つの要素からできております。


###1.　構成：HTML
HTMLとCSSはマークアップ言語と呼ばれています。

HTMLは、Webサイト上に表示される文章や、見出し、表などの「構成」部分を担当。
Webサイトの骨組みを作る言語だと認識しています。
HTMLを学習する事で、Webサイトの基本的な構成を作ることができる。
![スクリーンショット 2021-02-21 17.56.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1134498/8304cfad-a9aa-d15e-20d7-55556576121f.png)



###2.　見た目：CSS
CSSは、HTMLで作った骨組みを装飾するためのマークアップ言語です。
HTMLで作った骨組みの高さや横幅を変えたり、文字に色や大きさなどの「見た目」を担当。

他にも横並びに表示したりするなど、Webサイトのレイアウト（配置、配列）を変更することもできる。

###3.　動き：JavaScript
JavaScriptはWebサイトでの「動き」の部分を担当。

Webサイトを見ていて、ボタンが動いたり、スクロールすると画面が切り替わったりする
動きはJavaScriptによって作られています。


HTMLとCSSはWebサイトの作成にしか使えませんが、
JavaScriptはゲームを作ったりサーバーと通信を行ったりできる汎用的なプログラミング言語になっています。


Webサイトにおいては、
JavaScriptは主にユーザーがWebサイトを使いやすくするという目的で使用されると考えているのでJavaScriptを使わないとWebサイトが作れないかというとそうではありません。

ですが、まずはしっかりHTMLとCSSの理解を深めてWebサイトを作れるようになってから学習に取り組むと
理解度が深まると思います。
###最後に
内容が薄い記事だとは自負しております。
これからステップアップし、少しでも有益な情報を発信できるよう頑張ります。
最後までありがとうございました。
macのpyenvからpypyをインストールしたかった話

[結論はこちら](#結論)

# 環境
|項目|詳細|
|:-:|:--|
|マシン|MacBook Pro (13-inch, 2017)|
|OS|macOS Big Sur 11.2.1|
|pyenv|pyenv 1.2.23 (from Home Brew)|

# 経緯
Atcoderのテスト環境をローカルに作ろうと思い、公式と同じバージョンのpypyをインストールしようとした。

```
pyenv install pypy3.6-7.3.0
```

怒られた。

```
Downloading pypy3.6-v7.3.0-osx64.tar.bz2...
-> https://downloads.python.org/pypy/pypy3.6-v7.3.0-osx64.tar.bz2
Installing pypy3.6-v7.3.0-osx64...
Installing pip from https://bootstrap.pypa.io/get-pip.py...
error: failed to install pip via get-pip.py

BUILD FAILED (OS X 11.2.1 using 0000000000)

Inspect or clean up the working tree at (ログのパス)

Last 10 log lines:
    func = getattr(mod, fname)
  File "/Users/hoge/.pyenv/versions/pypy3.6-7.3.0/lib-python/3/ctypes/__init__.py", line 366, in __getattr__
    func = self.__getitem__(name)
  File "/Users/hoge/.pyenv/versions/pypy3.6-7.3.0/lib-python/3/ctypes/__init__.py", line 371, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
  File "/Users/hoge/.pyenv/versions/pypy3.6-7.3.0/lib_pypy/_ctypes/function.py", line 251, in __init__
    ptr = self._getfuncptr([], ctypes.c_int)
  File "/Users/hoge/.pyenv/versions/pypy3.6-7.3.0/lib_pypy/_ctypes/function.py", line 438, in _getfuncptr
    self._ptr = cdll.getfunc(self.name, ffi_argtypes, ffi_restype)
AttributeError: No symbol SCDynamicStoreCopyProxies found in library <None>
```

pyenvでpython3.8系とか3.6系とかがインストールできない問題にも以前ぶち当たっていたのだけど、どうやら違うところでひっかかっている模様。

# 原因

`SCDynamicStoreCopyProxies`とかいうのがなかなか検索に引っかからず、ネットの海を漂っていたところこんなページを見つけた。

- https://foss.heptapod.net/pypy/pypy/-/issues/3314

どうやらBig Surになってからの不具合らしく、ナイトリービルドでは修正されているとのこと。
が、まだ正式版には未反映。Oh...

pyenvを確認してみる。

```
pyenv install --list | grep pypy3
(中略)
  pypy3.6-7.3.3
  pypy3.7-c-jit-latest
  pypy3.7-7.3.2-src
  pypy3.7-7.3.2
  pypy3.7-7.3.3-src
  pypy3.7-7.3.3
```

よくみたら3.7がリリースされている。
latestは怖いので、`pypy3.7-7.3.3`をインストールするも、結果はさっきと同じ。仕方ない。

```
pyenv install pypy3.7-c-jit-latest

WARNING: This may eat your kittens/ affect timespace in alternate dimensions/
cause you to complain more. Nightly builds are meant for testing only.
```

脅されるけど気にせずインストール。

```
Installed pypy-c-jit-latest-osx64 to /Users/hoge/.pyenv/versions/pypy3.7-c-jit-latest
```

成功！

# 結論

macOS Big Sur+pyenvでpypyをインストールしたいときは最新版をインストールしましょう。
なお、pyenv自体を更新していないと最新版(20/02/21時点では`pypy3.7-c-jit-latest`)が出てこない可能性があるので要注意。

きっと数ヶ月後には正式版として反映されている、はず。