OmniAICreator/Qiita-1.07M huggingface dataset:
GraphQLについての解説動画についての解説

（＊）この記事では自分が理解した（できた）ことだけを書いて行きます。

今回見た動画は

######[When to use GraphQL over REST?]( https://www.youtube.com/watch?v=J5NkUQ7XRYA)

主にバックエンドについて情報発信しているバーレーン人Hussein Nasserという方の動画。

# 動画の構成
今回はRESTとの比較から、GraphQLの利点や使用例、逆にRESTの方が好ましい場合について解説しています。
各項目にそって比較や考察を行います。

# RESTとの比較
下の表は動画で紹介されている比較表を日本語訳したものです。
×マークは使用不可ではなく、好ましくないの意。

| 使用例            |        GraphQL    |    REST            |
|:-----------------|------------------:|:------------------:|
| 使用方法の予測できない公開API|              ○ |        ×        |
| 特定の使用目的のために作られたAPI|× |○       |
| 一つのクライアントに対応|              × |        ○        |
|企業API         |                ○ |         ×        |
| よく定義されたスキーマ      | ○ |      ×     |
上から順に進めます。

### 1.使用方法の不明な公開API
RESTは構築の際にクライアント側の要求を出来る限り満たさなければなりません。クライアント側では要件を満たすために複数回バックエンド側にアクセスする可能性があります。全ての要件を満たすRESTのスケーリングは複雑で困難です。

### 2.特定の使用目的のために作られたAPI
使用目的が限られていて、どのようなクエリが送られて来るのか知っているのであれば、RESTが好ましいです。キャッシングの恩恵が受けられ、RESTのシンプルさを活用できます。

### 3.一つのクライアントに対応
ウェブページやモバイルアプリなど、クライアントが一つに絞られるなら、RESTの方が時間の節約になります。

### 4.企業API 
GraphQLの良い使用例はニューヨークタイムズです。GraphQLなら一つのインターフェースで他の団体や他の分野での利用に対応できます。

### 5.よく定義されたスキーマ
GraphQLはよく定義されたスキーマとの相性がいいですが、データベースのスキーマをクライアント側に曝してしまうため、攻撃者が意図的に負荷をかけてサーバーをダウンさせる可能性があります。

#まとめ
用途やクライアントが限定されるならREST、クライアント側の多様な要件に応じて、無駄なく柔軟に対応したいのであればGraphQL。
今回が初投稿となります。ご助言いただければ幸いです。

### 補足(2020/4/23)
(よく定義されたスキーマ＝well defined schemaの意味が自分ではよく分からなかったのですが、wikipediaによれば、well-definedは，数学用語で 「定義によって一意の解釈又は値が割り当てられる」の意だそうです。well-defined functionと言う場合には引数に対してuniqueな値を返す関数のことを指すようです。)

参考
https://math.stackexchange.com/questions/606917/well-defined-function-what-does-it-mean
[CentOS 8] Transparent Huge Pagesの無効化

Transparent Huge Page (THP)の無効化についてのメモ
# 1. THPが有効か確認する
おそらくTHPはデフォルトで有効になっていると思うが、以下のコマンドで確認する。

```
cat /sys/kernel/mm/transparent_hugepage/enabled
>> [always] madvise never
```
**Always**に設定されている場合、有効となっている。

# 2. THPを無効化のためgrubを編集する
grub2を編集する必要があるので以下の操作を行う。
`transparent_hugepage=never`を追加する。

```
# vi /etc/default/grub

GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet transparent_hugepage=never"
```

編集を適用するために、`grub2-mkconfig`を行う。

**Bios-based machineの場合**

```
# grub2-mkconfig -o /boot/grub2/grub.cfg
```

**UEFI-based machinesの場合**

```
grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
```

最後に再起動を行う

```
shutdown -r now
```

# 3. 変更を確認する

```
# cat /sys/kernel/mm/transparent_hugepage/enabled

always madvise [never]
```

```
# cat /proc/cmdline

BOOT_IMAGE=(hd0,msdos1)/boot/vmlinuz-4.18.0-147.8.1.el8_1.x86_64 root=UUID=d3c7fd84-400c-4f55-9402-92ad8133d1ef ro crashkernel=auto rhgb quiet transparent_hugepage=never
```

以上です。

[参考] https://www.thegeekdiary.com/centos-rhel-7-how-to-disable-transparent-huge-pages-thp/
【Django ORM】values() と only() の違い

# Django ORMでの`values()`のエラーで嵌った話

Django ORMには`<Model>.objects.values()`と`<Model>.objects.only()`という`values()`と`only()`という似たようなメソッドがあるが、少しハマったので備忘録として。

ことの発端は↓のようなコードを書いたとき次のようなエラーが出たことから。

```python
president1 = Company.objects.values(*fields)[0].president
# => エラー: AttributeError: 'dict' object has no attribute 'president'
```

ここでは`Company`というモデルからDjango ORMの`values()`メソッドを使って、
特定のフィールドだけを抽出して生成されたクエリセット（複数のオブジェクトが入ったイテラブルなデータ型でPythonのリストのようなもの）の最初の要素の`president`フィールドの値を取得しようとしています。



しかし、実行時に`AttributeError: 'dict' object has no attribute 'president'`というエラーが発生してしまいました。

モデル定義を見直しても、確かに`president`というフィールドは存在しているのにこれはおかしいということで調べてみました。 [difference between values() and only()](https://stackoverflow.com/questions/11974691/difference-between-values-and-only) が参考になりました。


## バージョン
- Django==2.2.3


## `values()`が返すのは`QuerySet`ではなく`ValuesQuerySet`
参考記事によると`values()`メソッドが返すのは`ValuesQuerySet`というデータ型のオブジェクトだそう。
これは`QuerySet`に基づいて、**オブジェクトフィールドを辞書に変換した要素の配列のようなもの（＝ValuesQuerySet）**を返すそう。

つまり、先のコードでは`{'president': 'xxx', ...}`という辞書から`.president`を使ってフィールドデータを取り出そうとしていたので、エラーが出ていたということですね。

辞書なので`['president']`を使えばエラーは起きなかったということです。
エラーメッセージを読むと `'dict' object`と書いてありますね。。

## `only()`を使うと`QuerySet`が返ってくる
ということで今回のケースのように`QuerySet`が欲しい場合は`only()`[^1]を使えばいいということになります。今度は要素は辞書ではなくて、ちゃんとクラスのインスタンスが返ってくるのでエラーは起きないですね。

ちなみに`QuerySet`はイテラブルですが、データ型は`list`とは異なるので注意（似ているのでこれもたまにハマる）。

クエリセットをリストに変換するときは**`list(QuerySetオブジェクト)`**で変換可能。


[^1]:  指定したフィールドだけを対象に抽出できる。パフォーマンスチューニングのために使用する。反対に`defer()`を使うと指定したフィールドを除外することが可能。
【Excel】印刷前のイベントマクロ。印刷キャンセルとか。

# 印刷前に特定の列を非表示にする

下記の依頼を受けました。
>「印刷領域の中に、お客様には見せたくない列が含まれているため、お客様への提出用として印刷する際には自動でこの列を非表示にしたい。」

この記事はこの案件についてのメモです。


# やること

セルを非表示にするのは個人的に嫌いなので、セルの「表示・非表示」ではなく、アウトラインの機能を使用しました。印刷時にアウトラインを閉じるプログラムが起動するようにします。

１．非表示にする列にアウトラインを適用する
２．印刷時にアウトラインを折りたたむマクロを作成する


#1 アウトラインの適用

1. 表示・非表示を切り替えたい列を選択する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/f8806110-3a21-cff7-a296-5e788dae12d7.png)

2.”データ”タブ→”グループ化”をクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/e104a1e3-2639-56f3-65e2-f30bfe6ed351.png)

3.I列にアウトラインが適用される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/aa1ada04-d104-f983-ddf9-371480313457.png)


#2 印刷時にアウトラインを折りたたむマクロを作成する
印刷前に発動するトリガーとして、`Workbook`オブジェクトに`BeforePrint`というイベントトリガーがあったのでこれを使用します。

1.Alt+F11でVBEを開き、”thisWorkbook”オブジェクトをダブルクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/7a43f515-2110-07a0-0245-33940b61703f.png)

2.下図の部分を左を`Workbook`、右を`Beforeprint`を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/c0c53d65-b2a0-289a-a446-8ee7a0a5861a.png)

3.編集領域に印刷前に起動するプログラムを記述する

```VB:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
   'ここにプログラムを記述する。
End Sub
```


```VB:印刷前にアウトラインを閉じるプログラム
Private Sub Workbook_BeforePrint(Cancel As Boolean)       
    MsgBox ("印刷前にI列のアウトラインをすべて閉じます。")
    ActiveSheet.Outline.ShowLevels columnlevels:=1
End Sub

```
アウトラインの展開は`s.Outline.ShowLevels columnlevels:=1`の部分の数字で開閉を指示します。
すべて閉じる場合は1、すべて展開の場合は10です。
行のグループの場合は`rowlevels`を使用します。

4.印刷する
作業完了しましたので印刷してみたところ、下図のようにプログラムに仕込んでおいたメッセージボックスが表示されました。成功です。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342467/da815251-5809-c599-bd4e-201daddc069c.png)

#印刷前に特定のセルの値をチェックする
別件ですが下記のような依頼も受けました。特定のセルが空白だったら印刷をキャンセルするという要望です。

>「印刷前に特定の列に値の入力がされていなかったら（空白だったら）印刷前にアラートを出したい。」

```VB:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
    If sheets1.Range("A3") = "" Then
        If MsgBox("A3セルが空っぽです。印刷を続行してもよろしいですか？", vbYesNo) = vbNo Then
            '印刷続行中止が選択された場合に、印刷を中止する。
            MsgBox ("印刷を中止します。")
            Cancel = True
        End If
    End If
End Sub
```

#印刷をさせない
社外秘のファイルなどで印刷を禁止したいファイルもあるかと思います。下記のように強制的に印刷をキャンセルすれば印刷させないことが可能です。


```VB:
Private Sub Workbook_BeforePrint(Cancel As Boolean)
    MsgBox("このファイルは社外秘です。印刷はできません。")
    Cancel = True
End Sub
```
【Rails】マイグレーションファイルの生成、その内容

<h1>概要</h1>
Railsは高速でアプリケーションを作れるので、教材などのコードをコピペしとけば「なんかできちゃったお」ってなることが多い。
大学1年の頃はコレが原因で挫折したので、今回は簡単なアプリケーションを作りながら丁寧に理解していきたい。
幸い学生で、コロナの影響で時間もたっぷりあるので、今しかできないことをやる。
アプリケーションを作る上で必要なコマンドをまとめるというよりは、「このメソッドはなんのメソッドで、何をしているのか」という点に着目する。
とにかく自分の「なんか動いた。。」を徹底的に回避するための備忘録。

「お前、ちょっとやりすぎだぞ。初心者ならもっと効率上げろ。」
だったり、
「お前、ここの理解浅い。出直してこい。」
などあれば、コメントいただけると幸いです！！

https://diveintocode.jp/blogs/Technology/migration
この記事にとても助けられた。。。
<h1>scaffoldでcontrollerとmodelを生成。migration fileを覗く</h1>
アプリケーション、コントローラ、モデルの作成

```shell
$ rails new Myblog # DBやrailsのバージョンもここで指定可能
$ rails g scaffold Message title:string message:string 
```
一旦マイグレーションファイルを覗く

```Ruby:db/migrate/20200418172927_create_messages.rb
class CreateMessages < ActiveRecord::Migration[5.2]
  def change
    create_table :messages do |t| # ここテーブル名
      # こいつらカラム名↓
      t.string :title
      t.string :message

      t.timestamps
    end
  end
end
```
このブロック処理でデータベースのテーブルを作成するもの。
例えば、このマイグレーションファイルは以下のようなDBを作る。
SQL叩かなくてもRubyでこんなことできる。ActiveRecordはすごい。

<table>
<th>ID</th>
<th>title</th>
<th>message</th>
<th>created_at</th>
<th>updated_at</th>
<tr>
<td>0</td>
<td>あ、こんちは</td>
<td>サイゼのイタリアンプリン</td>
<td>生成日時</td>
<td>更新日時</td>
<tr>
<td>1</td>
<td>スマブラ</td>
<td>ウルフの空後は着地空きほぼ無いのでそのまま空N打てばごまかせる</td>
<td>生成日時</td>
<td>更新日時</td>
</table>
DBの変更を行うたびにマイグレーションファイルは蓄積していく。（おもしろ！！！！）
正直「ここでのカラム名がハッシュで定義されているのはなんで？」
「create_table :messagesのブロック処理がどんなロジックで行われている？？」
とはなっているが、マイグレーションファイルがなんのためにあるのか。
さらに、マイグレーションファイルは色んなモジュールを使用でき、例えばcrename_columnでDB周りの変更もできる。その場合、modelは必要ない。
など自分に現状必要なものは理解できた。
やりすぎと丁寧さは紙一重だな~。
<h1>DBの生成</h1>

とりあえずDB作成。
```shell
rails db:migrate
```
schema.rbを覗く。

```Ruby:db/scema.rb
ActiveRecord::Schema.define(version: 2020_04_18_172927) do

  create_table "messages", force: :cascade do |t|
    t.string "title"
    t.string "message"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

end
```
おー、できた。
ちなみにコレは見る専門で、マイグレーションファイルのどこまでが更新されたかを、上のversionで確認できる。
チーム開発の時に便利。
<h1>コンソールについて</h1>
コンソール見る時pryの方が便利らしいのでインストールしとく。

```Ruby:Gemfile
group :development, :test do
  #（中略）
  gem 'pry-rails'
  gem 'pry-doc'
  gem 'pry-stack_explorer'
  gem 'pry-byebug'
end
```
Beanstalkで使用されるEC2のSGの設定を変更するには？

## 背景
Beanstalk を使用してWindowsサーバーを構築し、 RDP 接続も行えるようにしたい。

RDP 接続を行うためには EC2 のキーペア(秘密鍵)がログインパスワードを取得するのに必要になる。

Beanstalk の設定画面で「 EC2 キーペア」を有効にすると、 Beanstalk (正確に言うと CloudFormation )によって自動生成されるセキュリティグループに２２番ポートが `0.0.0.0/0` で許可される。

## やりたかったこと
Beanstalk によって自動で作成されるセキュリティグループだと２２番ポートがフル解放されるため、これを使わずに予め自分で作成しておいたセキュリティグループのみ使って構築したい。

## 試したこと
Beanstalk の設定画面にある「インタンスの変更」の「インスタンスセキュリティグループ」で、既存のセキュリティグループを選択すれば自動でセキュリティグループは作成されないと考えていた。
<img width="724" alt="スクリーンショット 2020-04-19 2.36.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237468/98132fb6-e86a-6c45-9664-733bacd85430.png">

## 結果
「インタンスの変更」で選択した既存のセキュリティグループと、Beanstalk によって自動で作成されたセキュリティグループが使用された。

## 次に試したこと
Beanstalk はアプリケーションをデプロイする際に ebextensions を追加することで、Beanstalk のコンソール画面からでは設定できない項目もカスタマイズすることができる。

ebextensions に既存のセキュリティグループのみを使って構築するような設定を記載すれば、やりたいことが実現できると考えていたが、これはどうやらできないらしい。

## ２２番ポートをフル解放させないためには
Beanstalk の仕様上セキュリティグループが必ず作成されてしまい、キーペア使用すると２２番ポートがデフォルトではフル解放される。

作成されたセキュリティグループは必ず使用されてしまうので、 **２２番ポートが許可されたセキュリティグループを使わないという考えから、２２番ポートの許可設定を変更しセキュリティリスクを下げるという考えにシフトする必要がある** 。

下記 ebextensions を追加することで２２番ポートの許可設定を変更することができる。

```yaml
option_settings:
  - namespace:  aws:autoscaling:launchconfiguration
    option_name: SSHSourceRestriction
    value: tcp, 22, 22, 127.0.0.1/32
```

この ebextensions を追加してデプロイすると、 Beanstalk の設定画面で「 EC2 キーペア」を有効にしても２２番ポートが `127.0.0.1/32` の IP のみ、つまり自分自身の IP のみ通信を許可するような設定にすることができる。

これにより、不用意に２２番ポートをフル解放せずに構築を行うことができる。

## 結論
EC2 で使用されるセキュリティグループは Beanstalk によって自動で作成される、予め自分で用意したセキュリティグループのみ使って構築するということはできない。

自動で作成されるセキュリティグループの中身は Beanstalk の設定画面で「 EC2 キーペア」を選択すると２２番ポートが `0.0.0.0/0` で許可される。

作成されたセキュリティグループは必ず使用されてしまうので、２２番ポートの許可設定をオーバライドするような ebextensions を追加する必要がある。

そもそも、インスタンスにログインしないように構築することがベストではあるが、お客様の要件によっては必要になるケースも存在すると思い記事を投稿した。

因みに ELB であれば Beanstalk によって自動で作成されるセキュリティグループを使わずに、既存のセキュリティグループを使用するような設定を行うことができる。
参考：https://aws.amazon.com/jp/premiumsupport/knowledge-center/security-group-elastic-beanstalk/
【Java入門】変数の種類、ローカル変数・フィールド変数・グローバル変数

# 変数の種類⁉️

変数にもスコープ(※)によって呼び方と使い方を区別してます。😏

※スコープとは⁉️
コード内の「{」から「}」までの範囲。
スコープって慣れると気にしないが、初心者がよく間違ってハマってしまう部分です。
なので、慣れるまでは何回でもチェックしましょ〜💕

# ローカル変数

簡単に言うとメソッド内で使う変数です。

```
例）
public static void main(String[] args) {
    int a = 0;
}
```

# フィールド変数

簡単に言うとクラス内で使う変数です。

```
例）
public class Sample {
    int a = 0;
    public static void main(String[] args) {
    }
}
```

# グローバル変数

クラスを自由にアクセスができる変数です。
Javaはクローバル変数が別に存在しません。
なぜ⁉️
フィールド変数に修飾子を「Public Static」で設定するとそれがグローバル変数になるからです‼️

```
例）
public class Sample {
    public static int a = 0;
    public static void main(String[] args) {
    }
}
```

# 実際にコードを書いてみましょ❣️

今まで勉強して来た「クラス(Class)」・「メソッド(Method)」
そして、変数を実際に手を動かしながら身につけましょ〜

👇をご覧ください〜

[変数編](https://youtu.be/EHjspBlVCbk)
Ubuntu18.04 LTSでgitの最新版をインストールしたい場合

# 環境
Ubuntu18.04 LTS

# 参照する手順
デフォルトで入っているレポジトリでは、古いバージョンが提供されていることが多い。
`sudo apt-cache madison git`を発行することで、利用可能なバージョンが確認できる

```
$ sudo apt-cache madison git
       git | 1:2.17.1-1ubuntu0.6 | http://jp.archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages
       git | 1:2.17.1-1ubuntu0.6 | http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages
       git | 1:2.17.0-1ubuntu1 | http://jp.archive.ubuntu.com/ubuntu bionic/main amd64 Packages
```

"git install documentation" とかで検索すると以下のページが引っかかるが、
https://git-scm.com/book/ja/v2/使い始める-Gitのインストール

package managerで管理したいときは、以下の手順を参照してレポジトリを追加する
https://git-scm.com/download/linux

# 確認

```
$ apt-cache madison git
       git | 1:2.26.1-0ppa1~ubuntu18.04.1 | http://ppa.launchpad.net/git-core/ppa/ubuntu bionic/main amd64 Packages
       git | 1:2.17.1-1ubuntu0.6 | http://jp.archive.ubuntu.com/ubuntu bionic-updates/main amd64 Packages
       ...
```

利用可能なバージョンが増えたことが確認できた。
【OpenFOAM】Windows10でOpenFOAMをインストールする方法

#はじめに
この記事ではWindows10でのOpenFOAM実行環境の構築を解説します．
Win7や8ではできませんのでご注意願います．

youtubeにて動画でも解説しています．
https://www.youtube.com/watch?v=eIvZXKefu88

OpenFOAMはLinux対応のCFDツールですが，Win10ならWSL機能を使えばOpenFOAMを動かせます．
今はファイル操作もシームレスにできるようになっていて，快適にプリポスト処理が行えるようになります．

**手順**

1. Linuxをインストールする
2. OpenFOAMをインストールする
3. Xmingをインストールする

**環境**

Windows 10 バージョン 1903

**参考**

- https://www.atmarkit.co.jp/ait/articles/1903/18/news031.html
- https://openfoam.org/download/7-ubuntu/

#1. Linuxをインストールする
Windows10からはWSLが導入されており，これを使うことでLinuxを使うことができます．デフォルトではWSLは無効になってるので，次の手順で有効化にします．

スタートアイコンを右クリック→アプリと機能→関連設定のプログラムと機能→Windowsの機能の有効化または無効化→Windows Subsystem for LinuxのチェックボックスをON→OK→再起動

これで有効化されます．

続いて，Microsoft StoreからLinuxディストリビューションを導入します．今回はUbuntuにします．検索窓に「Ubuntu」と入力して検索をかけると導入可能なアプリが表示されるので，Ubuntuを選択．入手ボタンを押してダウンロードします．完了後，起動ボタンを押すとウィンドウが立ち上がってUbuntuのインストールが始まります．その後ユーザーネームとパスワードを設定して終わりです．



#2. OpenFOAMをインストールする
今インストールしたUbuntu上でOpenFOAMのインストールを行います．Ubuntuを起動して，まずはaptパッケージ管理システムでインストールできるようにしたいので，コマンドプロンプトで次のようにコマンドを入力します．

```
$ sudo sh -c "wget -O - https://dl.openfoam.org/gpg.key | apt-key add -"
$ sudo add-apt-repository http://dl.openfoam.org/ubuntu
```

続いてパッケージリストを更新するため下記のようにコマンド実行します．

```
$ sudo apt-get update
```

終わったら，openfoamをインストールします．v7をインストールする場合は

```
$ sudo apt-get -y install openfoam7
```

30~40分かかります．

#3. Xmingをインストールする
Xmingは下記サイトからインストールしました．
https://ja.osdn.net/projects/sfnet_xming/
ページ中上部にあるダウンロードファイルリストから，

- Xming-fonts-7-7-0-10-setup.exe
- Xming-6-9-0-31-setup.exe

の2つをダウンロードします．
その後，Xming→Xming-fontsの順にインストールしてください．インストール時にいろいろ設定を聞かれますが，変更不要です．

これでOpenFOAMを使う環境が整いました．
コミットIDからGithubのプルリクを探す

何でこんなコードになってるんだろうと言う時、コミットメッセージを見てもよくわからなくてプルリクを見たい時よくあります。
そこでコミットIDからgithubのプルリクを開く方法を探しました。(対象はmacです)

1. 以下のを~/.gitconfigに追加

```
[alias]
    find-merge = "!sh -c 'commit=$0 && branch=${1:-HEAD} && (git rev-list $commit..$branch --ancestry-path | cat -n; git rev-list $commit..$branch --first-parent | cat -n) | sort -k2 -s | uniq -f1 -d | sort -n | tail -1 | cut -f2'"
    show-merge = "!sh -c 'merge=$(git find-merge $0 $1) && [ -n \"$merge\" ] && git show $merge --oneline|xargs'"
```
上記により ```git show-merge [コミットID]``` で対象のコミットを含むマージコミットIDが出力されるようになります。　　　　
2. [hub](https://github.com/github/hub)をインストール(macはbrewでインストールできます)
```$ brew install hub ```
3. ~/.bash_aliasに以下を追加   
    
```
function open_github_pr(){
    git show-merge $1 | perl -nE 'system("hub browse -- pull/".$1) if/#(.*?)\sfrom/'
}
alias openpr=open_github_pr
```     
a
4. aliasの反映    
``` source ~/.bash_alias ```
5. 完了。以下を試してみてください。

```
openpr [任意のcommit id]
```
Xcode11.4.1：Cocoapodsで「dyld: Library not loaded: @rpath/」と出る

現在Apple Developer Programに課金していない場合タイトルの通りのエラーで実機だとクラッシュするようですが，自分は課金勢なのにクラッシュしました．とりあえず自分の場合，クラッシュ回避できた方法は以下のとおりです．

# 解決法

Signing -> Signing Certificate を`Sign to Run Locally`から`Development`にする
![スクリーンショット 2020-04-19 2.47.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/67153/b9a62bf6-0e1b-daf3-b048-09428fe5fbc2.png)
なぜうまくいくのかはよくわからない．
Singularityのインストール (Ubuntu 18.04 LTS)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/8790d0a6-1d55-2fb3-6563-426d5bb50d7e.png)
# 目的
SingularityをUbuntu 18.04 LTSにインストールする。

詳しい解説とコードは[Singularityのインストール (Ubuntu 18.04 LTS)](https://www.aiprogrammers.net/entry/2020/04/18/170556)をご覧ください。
Dockerのインストール (Ubuntu 18.04 LTS)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/a8364b84-b2e3-484d-c7e6-19dadb346929.png)
# 目的
Ubuntu 18.04 LTSにDockerをインストールする。

詳しい解説とコードは[Dockerのインストール (Ubuntu 18.04 LTS)](https://www.aiprogrammers.net/entry/2020/04/18/164548)をご覧ください。
RectTransform.SetsizeWithCurrentAnchorについて

#RectTransform.SetsizeWithCurrentAnchorについて

SetSizeWithCurrentAnchors(Axis axis, float size)
二つの引数**Axis**,**size**について。

##Axisについて
Recttransform.Axisである。
Horizontal(水平),Vertical(垂直)
の縦横二つがある。

##sizeについて
Recttransform大きさのマックスを指定

#つまり
uGuiの大きさを変える。


**参考文献**
公式ドキュメント[https://docs.unity3d.com/jp/460/ScriptReference/RectTransform.SetSizeWithCurrentAnchors.html]

【Unity uGUI】RectTransformの基本的な使い方を理解する
[https://docs.unity3d.com/jp/460/ScriptReference/RectTransform.SetSizeWithCurrentAnchors.html]
【Excel】書式のみのコピー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/baca7293-3311-469b-a2f4-13fa395f384f.png)
# 目的
セルの書式のみをコピーする。

詳しい解説とコードは[【Excel】書式のみのコピー](https://www.aiprogrammers.net/entry/2020/04/18/023556)をご覧ください。
【Excel】文字列の足し算 (結合)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/c5eafb82-ba8b-74e1-d59c-b8ff55d77777.png)
# 目的
エクセル上で文字列の足し算 (結合)

詳しい解説とコードは[【Excel】文字列の足し算 (結合)](https://www.aiprogrammers.net/entry/2020/04/18/020657)をご覧ください。
【Excel】重複する値(文字)の検索

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/b7a8ff10-0b17-d940-31c3-b09ab5c6feaf.png)
# 目的
- エクセルにまとめてあるデータから一部のデータを取り出す。
- 目的のIDの人の情報を取り出す。

詳しい解説とコードは[【Excel】重複する値(文字)の検索](https://www.aiprogrammers.net/entry/2020/04/17/164807)をご覧ください。
【Flask & Bootstrap】じゃらんレビューを解析 〜じゃらん Analyzer〜

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/0f8cbc7f-08ba-53a4-ff71-12672d4c7e80.png)
# 目的
じゃらんレビューを解析するWebアプリ。
Webアプリの実装は、FlaskとBootstrapを使用。
[じゃらん Analyzer](https://jarananalyzer.herokuapp.com/)のWebページは[こちら](https://jarananalyzer.herokuapp.com/)。

詳しい解説とコードは[【Flask & Bootstrap】じゃらんレビューを解析 〜じゃらん Analyzer〜](https://www.aiprogrammers.net/entry/2020/04/12/031510)をご覧ください。
【Flask & Bootstrap】歌詞の内容をWord Cloudで可視化 〜Lyrics Word Cloud〜

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/95c1ba8d-2298-ea6d-0f3f-b9894f4ac226.png)
# 目的
歌詞の内容を、Word Cloudで可視化するWebアプリ。
Webアプリの実装は、FlaskとBootstrapを使用
[Lyrics Word Cloud](https://lyricswordcloud.herokuapp.com/)のWebページは[こちら](https://lyricswordcloud.herokuapp.com/)。

詳しい解説とコードは[【Flask & Bootstrap】歌詞の内容をWord Cloudで可視化 〜Lyrics Word Cloud〜](https://www.aiprogrammers.net/entry/2020/04/12/025810)をご覧ください。
【PyTorch】チュートリアル(日本語版 )④ 〜TRAINING A CLASSIFIER（画像分類）〜

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/9a7b365d-b844-9f98-664a-e698778d4746.png)
# 目的
PyTorchのチュートリアル[「What is PyTorch?」](https://pytorch.org/tutorials/beginner/blitz/tensor_tutorial.html#sphx-glr-beginner-blitz-tensor-tutorial-py)を参考にPyTorchで<b>画像分類</b>について学ぶ。

具体的には、

- ニューラルネットワークの構築
- lossの計算
- ネットワークの重みの更新
について学習する。

詳しい解説とコードは[【PyTorch】チュートリアル(日本語版 )④ 〜TRAINING A CLASSIFIER（画像分類）〜](https://www.aiprogrammers.net/entry/2020/04/18/152115)をご覧ください。


# チュートリアル

- [【PyTorch】チュートリアル(日本語版 )① 〜テンソル〜](https://www.aiprogrammers.net/entry/2020/04/13/014852)
- [【PyTorch】チュートリアル(日本語版 )② 〜AUTOGRAD〜](https://www.aiprogrammers.net/entry/2020/04/13/232357)
- [【PyTorch】チュートリアル(日本語版 )③ 〜NEURAL NETWORKS（ニューラルネットワーク）〜 ](https://www.aiprogrammers.net/entry/2020/04/18/035524)
- [【PyTorch】チュートリアル(日本語版 )④ 〜TRAINING A CLASSIFIER（画像分類）〜](https://www.aiprogrammers.net/entry/2020/04/18/152115)

# サンプル

- [【PyTorch】サンプル① 〜NUMPY〜](https://www.aiprogrammers.net/entry/2020/04/24/092500)
- [【PyTorch】サンプル② 〜TENSOR (テンソル) 〜](https://www.aiprogrammers.net/entry/2020/04/25/190705)
- [【PyTorch】サンプル③ 〜TENSORS AND AUTOGRAD（テンソルと自動微分）〜](https://www.aiprogrammers.net/entry/2020/04/25/194823)
- [【PyTorch】サンプル④ 〜Defining New autograd Functions（自動微分関数の定義）〜](https://www.aiprogrammers.net/entry/2020/04/26/194122)
- [【PyTorch】サンプル⑤ 〜Static Graphs（静的グラフ）〜](https://www.aiprogrammers.net/entry/2020/04/27/191856)
- [【PyTorch】サンプル⑥ 〜 nn パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/02/190000)
- [【PyTorch】サンプル⑦ 〜 optim パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/03/190000)
- [【PyTorch】サンプル⑧ 〜 複雑なモデルの構築方法 〜](https://www.aiprogrammers.net/entry/2020/05/04/183000)
- [【PyTorch】サンプル⑨ 〜 動的グラフ 〜](https://www.aiprogrammers.net/entry/2020/05/05/190000)
【PyTorch】チュートリアル(日本語版 )③ 〜NEURAL NETWORKS（ニューラルネットワーク）〜

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/b7b6b786-359a-0427-e572-a3a95df8e77b.png)
# 目的
PyTorchのチュートリアル[「What is PyTorch?」](https://pytorch.org/tutorials/beginner/blitz/tensor_tutorial.html#sphx-glr-beginner-blitz-tensor-tutorial-py)を参考にPyTorchで<b>ニューラルネットワークの構築と学習</b>について学ぶ。

詳しい解説とコードは[【PyTorch】チュートリアル(日本語版 )③ 〜NEURAL NETWORKS（ニューラルネットワーク）〜](https://www.aiprogrammers.net/entry/2020/04/18/035524)をご覧ください。

# チュートリアル

- [【PyTorch】チュートリアル(日本語版 )① 〜テンソル〜](https://www.aiprogrammers.net/entry/2020/04/13/014852)
- [【PyTorch】チュートリアル(日本語版 )② 〜AUTOGRAD〜](https://www.aiprogrammers.net/entry/2020/04/13/232357)
- [【PyTorch】チュートリアル(日本語版 )③ 〜NEURAL NETWORKS（ニューラルネットワーク）〜 ](https://www.aiprogrammers.net/entry/2020/04/18/035524)
- [【PyTorch】チュートリアル(日本語版 )④ 〜TRAINING A CLASSIFIER（画像分類）〜](https://www.aiprogrammers.net/entry/2020/04/18/152115)

# サンプル

- [【PyTorch】サンプル① 〜NUMPY〜](https://www.aiprogrammers.net/entry/2020/04/24/092500)
- [【PyTorch】サンプル② 〜TENSOR (テンソル) 〜](https://www.aiprogrammers.net/entry/2020/04/25/190705)
- [【PyTorch】サンプル③ 〜TENSORS AND AUTOGRAD（テンソルと自動微分）〜](https://www.aiprogrammers.net/entry/2020/04/25/194823)
- [【PyTorch】サンプル④ 〜Defining New autograd Functions（自動微分関数の定義）〜](https://www.aiprogrammers.net/entry/2020/04/26/194122)
- [【PyTorch】サンプル⑤ 〜Static Graphs（静的グラフ）〜](https://www.aiprogrammers.net/entry/2020/04/27/191856)
- [【PyTorch】サンプル⑥ 〜 nn パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/02/190000)
- [【PyTorch】サンプル⑦ 〜 optim パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/03/190000)
- [【PyTorch】サンプル⑧ 〜 複雑なモデルの構築方法 〜](https://www.aiprogrammers.net/entry/2020/05/04/183000)
- [【PyTorch】サンプル⑨ 〜 動的グラフ 〜](https://www.aiprogrammers.net/entry/2020/05/05/190000)
【PyTorch】チュートリアル(日本語版 )② 〜AUTOGRAD〜

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/1fe538f0-5de4-3fff-18ed-418a164d178b.png)
# 目的
PyTorchのチュートリアル[「What is PyTorch?」](https://pytorch.org/tutorials/beginner/blitz/tensor_tutorial.html#sphx-glr-beginner-blitz-tensor-tutorial-py)を参考にPyTorchで<b>AUTOGRAD</b>の扱いになれること。

詳しい解説とコードは[【PyTorch】チュートリアル(日本語版 )② 〜AUTOGRAD〜](https://www.aiprogrammers.net/entry/2020/04/13/232357)をご覧ください。


# チュートリアル

- [【PyTorch】チュートリアル(日本語版 )① 〜テンソル〜](https://www.aiprogrammers.net/entry/2020/04/13/014852)
- [【PyTorch】チュートリアル(日本語版 )② 〜AUTOGRAD〜](https://www.aiprogrammers.net/entry/2020/04/13/232357)
- [【PyTorch】チュートリアル(日本語版 )③ 〜NEURAL NETWORKS（ニューラルネットワーク）〜 ](https://www.aiprogrammers.net/entry/2020/04/18/035524)
- [【PyTorch】チュートリアル(日本語版 )④ 〜TRAINING A CLASSIFIER（画像分類）〜](https://www.aiprogrammers.net/entry/2020/04/18/152115)

# サンプル

- [【PyTorch】サンプル① 〜NUMPY〜](https://www.aiprogrammers.net/entry/2020/04/24/092500)
- [【PyTorch】サンプル② 〜TENSOR (テンソル) 〜](https://www.aiprogrammers.net/entry/2020/04/25/190705)
- [【PyTorch】サンプル③ 〜TENSORS AND AUTOGRAD（テンソルと自動微分）〜](https://www.aiprogrammers.net/entry/2020/04/25/194823)
- [【PyTorch】サンプル④ 〜Defining New autograd Functions（自動微分関数の定義）〜](https://www.aiprogrammers.net/entry/2020/04/26/194122)
- [【PyTorch】サンプル⑤ 〜Static Graphs（静的グラフ）〜](https://www.aiprogrammers.net/entry/2020/04/27/191856)
- [【PyTorch】サンプル⑥ 〜 nn パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/02/190000)
- [【PyTorch】サンプル⑦ 〜 optim パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/03/190000)
- [【PyTorch】サンプル⑧ 〜 複雑なモデルの構築方法 〜](https://www.aiprogrammers.net/entry/2020/05/04/183000)
- [【PyTorch】サンプル⑨ 〜 動的グラフ 〜](https://www.aiprogrammers.net/entry/2020/05/05/190000)
【PyTorch】チュートリアル(日本語版 )① 〜テンソル〜

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/07c31cbf-40ba-d7cd-03da-483afa4bcf87.png)
# 目的
PyTorchのチュートリアル[「What is PyTorch?」](https://pytorch.org/tutorials/beginner/blitz/tensor_tutorial.html#sphx-glr-beginner-blitz-tensor-tutorial-py)を参考にPyTorchで特有のテンソルの扱いになれること。

詳しい解説とコードは[【PyTorch】チュートリアル(日本語版 )① 〜テンソル〜](https://www.aiprogrammers.net/entry/2020/04/13/014852)をご覧ください。

# チュートリアル

- [【PyTorch】チュートリアル(日本語版 )① 〜テンソル〜](https://www.aiprogrammers.net/entry/2020/04/13/014852)
- [【PyTorch】チュートリアル(日本語版 )② 〜AUTOGRAD〜](https://www.aiprogrammers.net/entry/2020/04/13/232357)
- [【PyTorch】チュートリアル(日本語版 )③ 〜NEURAL NETWORKS（ニューラルネットワーク）〜 ](https://www.aiprogrammers.net/entry/2020/04/18/035524)
- [【PyTorch】チュートリアル(日本語版 )④ 〜TRAINING A CLASSIFIER（画像分類）〜](https://www.aiprogrammers.net/entry/2020/04/18/152115)

# サンプル

- [【PyTorch】サンプル① 〜NUMPY〜](https://www.aiprogrammers.net/entry/2020/04/24/092500)
- [【PyTorch】サンプル② 〜TENSOR (テンソル) 〜](https://www.aiprogrammers.net/entry/2020/04/25/190705)
- [【PyTorch】サンプル③ 〜TENSORS AND AUTOGRAD（テンソルと自動微分）〜](https://www.aiprogrammers.net/entry/2020/04/25/194823)
- [【PyTorch】サンプル④ 〜Defining New autograd Functions（自動微分関数の定義）〜](https://www.aiprogrammers.net/entry/2020/04/26/194122)
- [【PyTorch】サンプル⑤ 〜Static Graphs（静的グラフ）〜](https://www.aiprogrammers.net/entry/2020/04/27/191856)
- [【PyTorch】サンプル⑥ 〜 nn パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/02/190000)
- [【PyTorch】サンプル⑦ 〜 optim パッケージ 〜](https://www.aiprogrammers.net/entry/2020/05/03/190000)
- [【PyTorch】サンプル⑧ 〜 複雑なモデルの構築方法 〜](https://www.aiprogrammers.net/entry/2020/05/04/183000)
- [【PyTorch】サンプル⑨ 〜 動的グラフ 〜](https://www.aiprogrammers.net/entry/2020/05/05/190000)
【PyTorch】インストール方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/0313f6ca-8f42-a050-d56b-a99d52d6ee6b.png)
# 目的
PyTorchをインストールする。

詳しい解説とコードは[【PyTorch】インストール方法](https://www.aiprogrammers.net/entry/2020/04/11/024856)をご覧ください。
.mgzから.nii.gzに変換する方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/01ec3e80-29a9-8012-a40d-c0cee36e5f26.png)
# 目的
[FreeSurfer](https://surfer.nmr.mgh.harvard.edu/)で出力されるファイルには、分画された皮質、白質の画像(VOI)がある。

しかしながら、それらのファイルの拡張子mgzはFreeSurfer特有の拡張子であり、他のソフトウェアとの整合性がない。

そこで、FreeSurferの出力ファイルであるaparc+aseg.mgzの拡張子を.nii.gzに変換する。

# 詳細
詳しい解説とコードは[.mgzから.nii.gzに変換する方法](https://www.aiprogrammers.net/entry/2020/04/09/040150)をご覧ください。
Google Colaboratoryの使い方

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/ed416201-d330-975f-0707-cea8dd90ab29.png)

# 目的
Google Colaboratoryが使えるようになる。

詳しい解説とコードは[Google Colaboratoryの使い方](https://www.aiprogrammers.net/entry/2020/04/09/014904)をご覧ください。
Flaskで作ったWebアプリをHerokuへデプロイする方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/214d22e8-9e7c-f621-9663-7154abf4a95a.png)

# 目的
Flaskで作ったWebアプリをHerokuへデプロイする

詳しい解説とコードは[Flaskで作ったWebアプリをHerokuへデプロイする方法](https://www.aiprogrammers.net/entry/2020/04/08/202916)をご覧ください。
はじめてのPython 1日目

## Pythonを初めて使ってみる
[このサイト](https://python.ms/class/)を参考に文法などについて学んだ．
猫を例に書かれていてプログラミング苦手な私にもわかりやすい◎．
これからもちょくちょく見直したい．

## メモ①
[ここ](https://python.ms/class/#%E8%A3%9C%E8%B6%B3)まで読んで特に覚えておいた方が良さそうなポイント．

```python:Cat.py
class Cat:
    type = '猫科' # クラス変数

    def __init__(self, name, gender, age):
        self.name = name
        self.gender = gender
        self.age = age

    def say(self):
        print('にゃー')

    def grawl(self):
        print('ウー')

tame = Cat('たま', 'メス', 3) 
tora = Cat('とら', 'オス', 3)

tame.type
tame.name
tame.say()
tame.grawl()

tora.type
tora.name
tora.say()
tora.grawl()
```

実行結果

```
にゃー
ウー
にゃー
ウー
```

__init__ が名前の通り初期化．
引数にすることでいろいろな値を一括で設定できる．

### selfについて
最初見たときにselfがよくわからなかったけど，生まれたての猫が入っているらしい，なるほど．
ちな，クラス変数にはselfが不要，インスタンス変数にはselfが必要．
で，クラス変数とは上のプログラムのtypeのことで，インスタンス変数とはnameとかのことっぽい（合ってるかな…）．
なんかこのあたりつまずきそう，自分:confounded:．

## メモ②
[ここ](https://python.ms/class/#%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E3%81%84%E3%81%A4%E4%BD%BF%E3%81%88%E3%81%B0%E3%81%84%E3%81%84%E3%81%AE%EF%BC%9F)から[ここ](https://python.ms/class/#%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E3%81%84%E3%81%A4%E4%BD%BF%E3%81%88%E3%81%B0%E3%81%84%E3%81%84%E3%81%AE%EF%BC%9F)（Step3. クラス classは次）まで読んで印象に残ったポイント．

```python:Cat2.py
tama = ('猫科', 'たま', 'メス', 5)
tora = ('猫科', 'とら', 'オス', 3)

dora = { # 辞書を作る
    'type': '猫科',
    'name': 'どら',
    'gender': 'オス',
    'age': 5
}
kora = dict( # 2回目以降はこれ
    type = '猫科',
    name = 'こら',
    gender = 'オス',
    age = 3
)

def say(cat):
    _, name, _, _ = cat
    print(name, 'にゃー')

say(tama)
print(tama[0])
print(tora[3])

# 使わない変数は _
for _ in range(3):
    print('Hello World!')
```

実行結果

```
たま にゃー
猫科
3
Hello World!
Hello World!
Hello World!
```
今更気づいたけどpythonは型がない！超今更笑．
めちゃめちゃ便利だけどいつか何かややこしくなるんだろうな，知らんけど．
今でてきた範囲では，文字列は　'' で囲って，数値はそのまま．

### 配列的な
こうやって↓書くことで，Javaの配列みたいなことができるらしい．
タプルっていうのかな？

```
tama = ('猫科', 'たま', 'メス', 5)
print(tama[0])
```

### 辞書機能 dict

辞書を作るときはdoraみたいな書き方をして，2回目以降はkoraみたいな書き方をするらしい．
なるほどぉ．

```
dora = { # 辞書を作る
    'type': '猫科',
    'name': 'どら',
    'gender': 'オス',
    'age': 5
}
kora = dict( # 2回目以降はこれ
    type = '猫科',
    name = 'こら',
    gender = 'オス',
    age = 3
)
```

### for文
使わない変数は _ にするらしい．
いつもJavaとかではiとかjとかkとか無駄において訳わからなくなっていたから少し感動．
上手く使いこなせますように．

```
for _ in range(3):
    print('Hello World!')
```

## メモ③
[ここ](https://python.ms/class/#%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%A8%E8%BE%9E%E6%9B%B8%E3%81%AE%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91)（Step3. クラス class含む）から最後まで読んで覚えておきたいポイント．

```python:Cat3.py
class Cat:
    type = '猫科'

    def __init__(selfself, name, gender, age):
        self.name = name
        self.gender = gender
        self.age = age

    def say(self):
        print(self.name, 'にゃー')
        
    def grawl(self):
        print(self.name, 'ウー')
　　
　　　　　　　....略...
```

クラス名はファイル名（Cat3）と一緒にしないといけないと思ってたけど，なんでもいいらしい…知らなかった笑
クラスはあんまり使わないらしい，からまた必要になったら勉強します:stuck_out_tongue_closed_eyes:．

本日は以上！明日もちゃんと勉強のやる気がでますように笑．

## Qiita Tips
0日目の記事を投稿後すぐに1日目の記事を投稿しようと思ったら「記事の投稿数上限に達しました」といわれて投稿できない:fearful:．
[この記事](https://qiita.com/kamata1729/items/d631bb29bd4c5bfb404d)を確認したところ，投稿してから30分くらいは次の投稿ができないらしい，よかったぁ．
FSLを使ったVolumeの一括計測

# 目的
[FSL](https://www.fmrib.ox.ac.uk/fsl)を使ったVOI (ROI) Volumeの計測。

詳しい解説とコードは[FSLを使ったVolumeの一括計測](https://www.aiprogrammers.net/entry/2020/04/07/045236)をご覧ください。
FreeSurferの結果のまとめ方 ～aparc, aseg, wmparc～

# 目的
被験者ごとのFreeSurferの結果を、一つのエクセルファイルにまとめる。

詳しい解説とコードは[FreeSurferの結果のまとめ方 ～aparc, aseg, wmparc～](https://www.aiprogrammers.net/entry/2020/04/07/032432)をご覧ください。
【Python】フォルダのみの一覧リストを取得

### 目的
ファイルやフォルダが混在しているときに、<b>フォルダだけ</b>の一覧をリストにする。

詳しい解説とコードは[【Python】フォルダのみの一覧リストを取得](https://www.aiprogrammers.net/entry/2020/04/06/162145)をご覧ください。
Ubuntu(18.04.3)  SSH編　鍵認証

<h1>1.アップデート</h1>
```
$ ssh -p ポート番号  アカウント名@IPアドレス
```

前回の記事で既にMacのターミナルから入れるようになっています。

```
$ sudo apt update
```
毎度のこと。
これは絶対忘れない。

<h1>2.鍵の作成(サーバー側)</h1>
鍵の保存先として、
/home/ユーザー名/.sshで鍵を作成。

```
$ ssh-keygen -t rsa -f 任意の名前
```

パスワード指定。

```
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
```

下記で確認

```
$ ls
```
任意の名前：秘密鍵
任意の名前.pub：公開鍵

<h1>3.いろいろ設定(雑)</h1>
```
vi 任意の名前
```
これで中身をコピーします。

あとはMacの
/Users/ユーザー名/.ssh/秘密鍵
に中身をコピーして保存。

次に下記を実行。

```
$ cat  任意の名前.pub >> authorized_keys
```
パーミッション変更。

```
$ chmod 600 authorized_keys
$ chmod 700 /home/アカウント名/.ssh
```

元の公開鍵削除

```
rm -f 任意の名前.pub 
```

秘密鍵削除

```
$ rm 任意の名前
```

/etc/ssh/sshd_config
に下記を追記(またはコメントを外す)。

```
+ChallengeResponseAuthentication no
+PubkeyAuthentication yes
```

sshd再起動

```
$ sudo /etc/init.d/ssh restart
```


Macの/Users/アカウント名/.ssh/config作成

```
Host アカウント名
        HostName IPアドレス
        User アカウント名
        IdentityFile /Users/アカウント名/.ssh/アカウント名
        Port ポート番号
```
これで、

```
$ ssh アカウント名
```

で入れます 

このままだとまだパスワード認証が可能なため、以下を追記(またはコメントを外す)

```
+PasswordAuthentication no
```

では、いざ

```
$ssh アカウント名
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
・・・・・・・・・
```

おっと・・・・・
Macのパーミッションを変えなければいけないみたいです。

```
$ chmod 0600 ~/.ssh/
```

では、もう一回。

```
Enter passphrase for key ‘・・・・・・
```
これで　鍵作成時に入力したパスワードで入れます。


ちな、sshキーのパスワードはconfigで保存できないみたいですね。
QSM解析 ～MEDIの使い方～

#目的

Cornell大学が開発したQSM software (MEDI)を使って解析

詳しい解説とコードは[QSM解析 ～MEDIの使い方～](https://www.aiprogrammers.net/entry/2020/03/30/184229)をご覧ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587891/f2a56009-bbd3-8dfd-dd83-3c2a4cb3d9e1.png)
(Cornell MRI Research Lab. QSMより、URL: http://pre.weill.cornell.edu/mri/pages/qsm.html)
BracketsをSublimeTextみたいに設定したい！


プログラミングの世界に足を踏み入れた時、
最初に触ったのは「Progate」でした。

その後、プログラミングを本格的に始めた時も、
会社に入ってコードを書く時も、
ずっと「SublimeText」を使ってきました。


しかし、エディターの横ですぐに変更箇所が反映されていくあの画面！


**ライブプレビューが忘れられない！！**


そして色々テキストエディターを探し回った結果、
ライブプレビュー機能が標準搭載されている
「[Brackets](http://brackets.io/)」というエディターに出会いました。

使い方は簡単で、矢印の先の「稲妻」みたいなアイコンをクリックするだけ！
勝手にブラウザ(Chrome)が開きます！終わり！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492541/ef0725bf-882e-2990-77cf-b91f588d820d.png)



で、その他の詳しい使い方は別の方に譲るとして、
見た目について、私はSublimeTextに慣れすぎているので、
出来るだけ近しい設定にするべく試行錯誤したので、
それの覚え書きをしていこうと思います。

#拡張機能をインストールする手順
レゴブロックみたいなのをクリックすると拡張機能のインストーラーが開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492541/f493c682-8752-331a-eb68-61682095f23b.png)

**入手可能**タブで拡張機能のダウンロード
**テーマ**タブでテーマ(見た目)のダウンロード
**インストール済み**タブで詳細を弄れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492541/973dca51-a728-2ab8-0b72-ddc2518aba7d.png)




#テーマの選択

SublimeText風テーマがいくつかあるのですが、
個人的には「Monokai Dark Soda」が一番近いかなと思いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492541/83fc3a0b-8ccc-1958-b258-fe6808bfb679.png)

インストールしたら、[表示 > テーマ] と進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492541/9e45bdee-30d2-af03-e970-1541b800b20b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492541/97988fa5-8ede-809c-b57e-cb81ba30ed2f.png)

「現在のテーマ」というところで、ダウンロードしたテーマを選択できるので、
色々ダウンロードして全部試して確認して見るのもいいかもしれません。

ちなみにフォントもここで変更できます。
SublimeTextでは「Ricty Diminished」を使っていたようなので、
ここでも「Ricty Diminished」にします。

[フォントのインストール方法](https://creating-homepage.com/archives/2115)


##行間の変更

[ヘルプ > 拡張機能のフォルダーを開く] と進むと、フォルダーが開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492541/e4cb1cd2-290c-d1c9-8f17-117b3daffdb0.png)

[user]の中に、ダウンロードした拡張機能が入っているので、
現在設定しているテーマのものを開き、
中にあるcssファイルの末尾に、以下の文言を付け足します。

```
.CodeMirror {
    line-height: 1.0;
}
```
数字を変更すれば好みの行間に変わってくれます。
##お好み設定
ここまでやればだいぶSublimeTextに近くなったと思います。
あとは各人の好みでさらに拡張機能を追加してみて下さい。

**Overscroll**
　コードの最下段よりさらに下までスクロールできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492541/bd1e5183-3b01-9835-e901-2139eb26ba0c.png)

**Custom Work**
　タブ機能とファイルアイコンの追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492541/12e84ba3-9b74-57d4-5484-2ddb5f5a4738.png)

**Minimap**
 ミニマップを追加します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492541/d4c9470b-b0fb-c2f1-0ab2-5b064a611d9d.png)



##おわり
すごく大雑把な説明でしたが、それとなくSublimeTextみたいな感じになったかと思います。
ライブプレビュー機能は本当にありがたいのでこれから使い倒していきます。
はじめてのPython 0日目

## はじめに
おうち時間，ついにすることがなくなったので（しないといけないことはあるけど）Pythonの勉強をします．
プログラミングはあまり得意ではないのと，しっかり理解しないとすぐわからなくなって諦めてしまうので，少し時間はかかると思うけど丁寧に勉強していこうと思います．

とりあえず，1週間後までにファイルの入出力とデータの抽出をしなければならないので短い目標はそれ．
Javaならさすがの私でもできるので，Pythonでもそんなに時間をかけずにできるはず…？:thinking:

その次の目標はなんだろう，考えていきたいです．
今のところ1番得意な言語は（強いていうなら）Java，好きな言語はSwiftですが，これを更新できるように頑張ります．

勉強をする中で重要そうだなと思ったポイントを今後メモとして投稿していきます．

## 開発環境
Pythonを勉強するにあたっての開発環境の準備（この日本語合ってるのかな笑）．
ちな，Mac．
いろいろ見てたら，PyCharmがおすすめとのことだったので[ここ](https://www.jetbrains.com/ja-jp/pycharm/download/#section=mac)からインストール．
10分かからないくらい:grin:．

日本語化したくて[ここ](https://mergedoc.osdn.jp/)からプラグインをインストールしたけどなぜかできない:worried:．
再起動繰り返したけどできない，諦め．

pyCharmが準備できたら[このサイト](https://pleiades.io/help/pycharm/creating-and-running-your-first-python-project.html)を参考にプロジェクトの作成．
他のサイトみてたらNew Projectの画面でinterpreterの選択でいろいろややこしかったけど，何かやる必要あるのでしょうか…．
今のところ，デフォルトのままCreateしても問題なさそうなので，また壁にぶち当たったら調べたいと思います（後回し），

次から実際にプログラムを書いていくぅ（超基本）！！
Django templateとvueを一緒に使う場合の注意


Django templateのデリミタは {{}} で
VUe.jsのデリミタも同様に {{}}となっていて

一緒の箇所で使用するとDjangotemplateが優先的使用されてしまうようです。

なのでVueでは別のデリミタの設定をしてあげる必要があるようです


```.js
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>


<div id="app">
    <span v-if="seen">Now you see me</span>
</div>
    
<script>
var app = new Vue({
  el: '#app',
  delimiters: ['[[', ']]'], // Django templateとは別のデリミタにする
  data: {
    seen: true,
    message: 'test'
  },
  mounted: function () {
    console.log('mounted', this);
  }  
})
</script>
```


---

参考にした記事
https://medium.com/@oikawa/solved-binding-django-and-vuejs-9e3e00f8ddb4
Azure Pipelines から Azure REST API を叩く

どうも、よこけんです。
最近 Azure Pipelines で遊んでいるのですが、Azure REST API を叩く方法がわかりづらかったので簡単にまとめてみました。

# Azure Pipelines から REST API を叩く方法あれこれ

Azure Pipelines から REST API を叩く方法は色々あります。
主な方法は下記の４種類です。

* InvokeRESTAPI タスクを使う
* AzureCLI タスクで az rest コマンドを叩く
* PowerShell タスクで Invoke-RestMethod コマンドを叩く
* bash タスクで curl コマンドを叩く

InvokeRESTAPI タスクと AzureCLI タスクはお勧めしません。これらは機能的にバイナリファイルの POST ができません[^1]ので不完全です。また、InvokeRESTAPI はエージェントレスジョブでしか使えないなど制限が非常に厳しいですし、AzureCLI タスクはサービス接続を別途 (無駄に) 用意する必要があり煩雑です。

[^1]: AzureCLI はファイルを読み取って POST する機能を持ってはいるのですが、バイナリファイルを POST しようとすると Base64 Binary でエンコードされてしまうようです。

実用レベルなのは PowerShell タスクと bash タスクになりますが、本記事では PowerShell タスクについて紹介しようと思います。

# Azure Pipelines から Azure REST API を叩く
例として、Pull Request の一覧を取得する Azure REST API を叩いてみます。

```yaml
jobs:
- job: temp
  pool:
    vmImage: ubuntu-latest
  # variables:
  #   System.Debug: true
  steps:
  - powershell: |
      Invoke-RestMethod `
        -Method get `
        -Uri $(System.CollectionUri)_apis/git/repositories/$(Build.Repository.ID)/pullrequests?api-version=5.1-preview.1 `
        -Headers @{
          "Authorization" = "Bearer $(System.AccessToken)";
        } `
        -TimeoutSec 60

```

定義済み変数が色々用意されていますので活用しましょう。
私の環境では、Uri は `https://dev.azure.com/moromoro-sample/_apis/git/repositories/8bf6fb38-5007-4819-a26b-7f73dacb5295/pullrequests?api-version=5.1-preview.1` として展開されます。
ちなみに５行目と６行目のコメントを外すことで、展開された Uri がパイプラインのログに出力されるようになります。

`Authorization` ヘッダーにで使用している `System.AccessToken` 変数には、パイプライン実行用ユーザーのアクセストークンが格納されています。
パイプライン実行ユーザーの権限は若干制限されており、例えば Pull Request にファイルを添付するなどの Azure REST API を叩くと権限エラーになります。
パイプライン実行ユーザーの権限はプロジェクト設定にて行えます。例えば Pull Request への書き込み権限は下記の手順で付加できます。

1. [Project settings] - [Repos] - [Repositories] を開く。
1. [Git Repositories] を選択し、[Azure DevOps Groups] の下の [Users] に含まれている [{プロジェクト名} Build Service ({組織名})] ユーザーを選択する。
1. [Contribute to pull requests] を "Allow" に設定する。

`TimeoutSec` は、既定では15秒に設定されていますが、時々タイムアウトになることがあるので60秒に増やしてあります。

この例では使用しませんでしたが、Invoke-RestApi コマンドでは `InFile` パラメータで POST するファイルを指定したり、`OutFile` パラメータでレスポンスを書き込むファイルを指定することもできます。


# 終わりに
私は色々と回り道 (特にアクセストークン周りと冒頭のバイナリファイルの POST の件で) したので中々苦労しましたが、やり方さえわかってしまえば Azure Pipelines から Azure REST API を叩くのはとても簡単です。

Azure REST API を使うことで Pull Request や Work Item の操作など色々なことができますので、CI/CD の可能性が広がると思います。
ちなみに私の場合、Pull Request をトリガーとするパイプラインでマージ前後のスナップショット画像の Diff を取っていたので、それを Pull Request に添付し更に Pull Request 内にそのリンクを張り付けたコメントスレッドを作成する、という処理を Azure REST API を利用して仕込みました。これに加え、コメントスレッドのステータスが Resolved にならないと Pull Request を完了できないようにリポジトリを設定しておくことで、Diff を見逃すことなくしっかりレビューできるようになります。

本記事が皆様の CI/CD の可能性を広げることに少しでも貢献できればなと思います。


# 参考
* [Get started with the REST APIs for Azure DevOps Services and Team Foundation Server - Azure DevOps Services REST API | Microsoft Docs](https://docs.microsoft.com/en-us/rest/api/azure/devops/?view=azure-devops-rest-5.1)
* [Invoke-RestMethod](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/invoke-restmethod?view=powershell-7)
* [Predefined variables - Azure Pipelines | Microsoft Docs](https://docs.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml)
Fatal Error "opcache.preload_user" has not been defined

## 問題

opcache を有効にしてアクセスすると次のエラーが発生しました。

```
Fatal Error "opcache.preload_user" has not been defined
```

## 原因

root ユーザーでプリロードするのは、セキュリティ上の理由から禁止されているそうです。

## 対策

`php.ini` に下記の設定を追記

```ini:php.ini
opcache.preload_user = www-data
```

`opcache.preload_user` はPHP7.4から追加されたそうです。

## 参考

- https://www.php.net/manual/ja/opcache.configuration.php#ini.opcache.preload-user
ポータルサイト創作記：４日目

前回は、`$ rails new`コマンドでファイル群を作成したことをGitHubにプッシュし、変更をマージ。
つくったブランチを削除するところまで行った。

今日は、Gemをインストールし、Railsアプリを立ち上げるところまで行う。

まずはGemのインストール。
「Gem」。直訳だと「宝石」。「Ruby」という名に世界観が統一されていて美しい。

ではGemとはどんな宝石なのかというと、Railsに機能を付け加えてくれるのである。比喩的な表現で恐縮だが、Railsでつくったアプリケーションがキラキラと飾り付けられるイメージだろうか。
このGemによる飾り付けで、Railsアプリケーションにはどんどん機能が増えていく。
`$ rails new`を実行したら、Gemのセットを入荷＝インストールするのが通例になっている。コマンドはこうだ。

```$ bundle install --path vendor/bundle```

すると、以下のように大量のGemがインストール（宝石が入荷）されてくる…！
<img width="512" alt="スクリーンショット 2020-04-17 18.56.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576912/fa3ac42e-8338-9363-2128-94d6a4b8a54d.png">
黄緑色の文字の一つ一つがGemであり、機能が付与されている。
<img width="510" alt="スクリーンショット 2020-04-17 19.03.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576912/35ed7b1a-3a7c-42d3-a193-1b97c301a533.png">
たらふくGemをインストールするから、結構、時間がかかる。
以上のような表示になったらインストール終了。

さぁ、Railsアプリを立ち上げよう。コマンドはこうだ。
`$ bundle exec rails s`
ちなみに、最後の`s`は`server`の省略形だ。つまり、このコマンドでサーバーにアクセスしている。
<img width="505" alt="スクリーンショット 2020-04-17 19.04.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576912/520518aa-45ad-38db-d400-4397563034c1.png">
こんな表示になったら、ブラウザを立ち上げて`localhost:3000`にアクセス！
<img width="713" alt="スクリーンショット 2020-04-17 19.04.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576912/8b482e25-07a5-ffb1-bdf3-b88669a492e3.png">
Railsのデフォルトのページが立ち上がり、歓迎してくれる。

今日はここまで！
GitHubの大まかな全体的な操作方法

# リポジトリの作成からプルリクエストまでの大まかな操作方法
ざっくりとなりますが個人的に「こんなシンプルな流れがわかればいいなぁ」という思いからこちらの記事を書こうと思いましたので良かったらご覧ください^_^

### 新規プロジェクトを作成してからGitHubをつなぎ合わせるまで
- GitHubでリポジトリを作成する
- プロジェクトを作成する
- 以下の手順でGitHubとつなぎ合わせる

```
$ git init #プロジェクト内のディレクトリで

$ git add .
$ git commit -m "Initial Commit" # コミットします。「" "」の中は記述の内容に決まりはありません

$ git remote add origin (リポジトリのURL) #リモートします

$ git push -u origin master #pushします
```
※もしpushがうまくいかないときは強制的にpushする方法も試してみて下さい！

```
$ git push -f origin master
```
こちらの操作でGitHubと連動し、以後さまざまな操作を行えます！

### ブランチの作成

```
$ git branch (ブランチ名) #ブランチを作成します
$ git checkout (ブランチ名) #ブランチに移動します
```

```
$ git branch #こちらを打つことでどのブランチにいるか確認することができます
```


### コミットからマージまで
```
$ git add . #変更したブランチで
$ git commit -m “変更の内容を記述”

$ git push -u origin (ブランチ名) #ブランチをpushします

$ git checkout master #masterブランチに移動します
$ git merge “ブランチ名”
```
動作にエラー出るときに一時的に退避することも有効な方法ですので試してみて下さい！

```
$ git stash
```

## プルリクエストのわかりやすい書き方
ターミナル上での操作は以上になりますがGitHubでのプルリクエストのわかりやすい書き方もぜひ書いてみましたのでぜひこちらもご覧ください^_^

- [GitHubのわかりやすいプルリクエストの書き方](https://qiita.com/chisaki0606/items/13a1c6e1a432e1dd1786)

<img width="500" alt="EJE8L6Rj2Lt2yW61587223152_1587223599.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587506/ed475163-9d5c-8c78-f142-f21d372bb110.png">
PCとEV3DEVの接続方法 Bluetooth方式

# はじめに
## 本記事について
PCとev3devをBluetoothでつなぐ方法を説明します

## 1.ev3とPCをネットワークをつなぐ
### (1.)ev3devの画面で「Wireless and Networks」を選択
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134712/dfcafe85-9a93-77df-b812-ddd3ecc52510.png)


### (2.)「Bluetooth」を選択
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134712/4ee00ad4-c750-f51b-b723-d60a773a21c9.png)


### (3.)「Powered」にチェックされていなければ選択でチェックする
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134712/f4e436ad-c085-34d3-2e55-789595897b0a.png)
  画像の場合は選択がされている状態

### (4.)「Start Scan」を選択

### (5.)「Devices」から接続するPCを選択
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134712/e08188d9-6c9b-e3a7-1aab-23c2ef57ca30.png)


### (6.)「Pair」を選択
うまくいくと「Network Connection」ボタンが現れます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134712/690aff2f-d719-1484-c896-bec4adac2580.png)

### (7.)「Network Connection」を選択
>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134712/839711d7-1309-d1df-1b5e-adf67bbda0f4.png)


### (8.)「Connect」を押す
もし接続を許可するか聞かれたら，「Accept」を押す.(PCも同じ)
 > ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134712/ea62a3c5-5f57-6fcb-1f42-504e2fd5230d.png)

### (9.)うまくいくと画面の左上にipアドレスが表示されます．
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134712/c4da398c-c384-e267-7e4a-7a440b3ca29a.png)
GitHubのわかりやすいプルリクエストの書き方

# GitHubのわかりやすいプルリクエストの書き方
GitHubをレビューをしてもらうときにやはり他の方が確認をするため、見やすくする必要がありますよね。なので今回はそのGitHubのわかりやすいプルリクエストの書き方をご紹介します^_^

### 記述の仕方を工夫する
わたしが着目したのは以下の項目になります。


- タイトルを見やすくする
- Issueの番号を記載する
- 変更内容をタスクリストでわかりやすく記述する
- 期待できる結果を記述する

<img width="500" alt="EJE8L6Rj2Lt2yW61587223152_1587223599.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587506/bca039b6-bdc7-5874-983c-1371ca3b5186.png">

このように見やすくすることで一見してコードレビューしてもらいやすくするための工夫を行いました。ちなみにこちらは全て手書きでプレビューした見た目になります。書いた内容はこちらになります！

<img width="1080" alt="スクリーンショット 2020-04-18 23.57.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587506/ee1f072c-b8d4-6e5b-cbd5-8994af6707ea.png">


そして編集終了後の画面がこちらになります！

<img width="1080" alt="スクリーンショット 2020-04-18 23.58.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587506/b4ee9bc3-4230-8540-dc23-72574a2f7248.png">

今回はGitHubのわかりやすいプルリクエストの内容でしたがぜひご参考になれましたら幸いです^_^
scopelintはもうだめだ

## 結論

scopelintを廃止しました。

代わりにポリシーの違う2つのlintに分けました。

今後は

- とにかくループ変数に対するすべてのポインター参照を抹殺したいなら [looppointer](https://github.com/kyoh86/looppointer)
- 多少見つけそこなっても良いからfalse-positiveはクソだ、と思うなら [exportloopref](https://github.com/kyoh86/exportloopref)

をご利用ください。

## 背景

### scopelintについて
[golangのループ変数の使い方をチェックするlinter作ってみた](https://qiita.com/kyoh86/items/97911180d6254d5fc90c) という記事にも書きましたが、
Goのループ変数にまつわる厄介なバグを検出する [scopelint](https://github.com/kyoh86/scopelint) というlinterを作ってメンテしてきました。
が、どうしてもfalse-positivesがうまいこと取り除けず、検出ポリシーを定めて何らかを犠牲にする必要が生じました。

### ループ変数にまつわる厄介なバグについて

こちらとても厄介で、（scopelintの記事にも書きましたが）、Let's Encryptが証明書発行周りでこのバグを踏んで、
世の中の証明書が大量に無効化され、新しく作り直す手間にかられるという騒動になったりしています。

golangでforループを回すと、中でうっかりループ変数に対するポインタを取ることで、スコープ外で参照したときに意図しない結果を得たりすることになります。

```simple/simple.go
package main

func main() {
	var intSlice []*int

	println("loop expecting 10, 11, 12, 13")
	for _, p := range []int{10, 11, 12, 13} {
		intSlice = append(intSlice, &p) // want "taking a pointer for the loop variable p"
	}

	println(`slice expecting "10, 11, 12, 13" but "13, 13, 13, 13"`)
	for _, p := range intSlice {
		printp(p)
	}
}

func printp(p *int) {
	println(*p)
}
```

意外と気づきにくいバグの元になってプログラマは容易に死にます。

### linterの作り方について

scopelintはかれこれ3年前に作ったlinterです。
当時はgoのlinter界隈はみんなで頑張ってASTを解析し、それぞれ自分なりの方法でdiagnosticsをレポートしていました。
scopelintも同様です。
結果メンテナンスコストがとにかく高く、腰の重い作業になっていました。

ですが、最近は golang.org/x/tools/go/analysis や golang.org/x/tools/go/ast/inspector が用意されています。
基本的なAST解析は彼らに任せることができるようになってきました。
また、linterの基本構造が統一されることで、linterづくりはとても平易になっています。

`go vet` に同梱されたlinterを眺めて見るだけでも、自分で作りたいlinterのヒントをえることが可能です。
今回はlooppointer, exportlooprefともにこれらを参照して作りましたが、とにかく簡単にできるようになっています。

gophersはぜひ、自作のlinterづくりに勤しんでみてはいかがでしょう。
gitlabからsshでcloneできなかった話　(Mac OS Catalinaのバグ)

# 前提条件と解決策


### 前提条件
* Mac OS Catalina 10.15.4 から**lan外**へ
* 8192より大きいポートで
* Domain nameを用いて

**ssh接続**しようとした時

### 解決策
* Domain nameをnslookup等を使いipアドレスに書き換え


または

```
ssh -p <port>　-oConnectTimeout=5 <user>@<servername>
```

参考
> https://mjtsai.com/blog/2020/03/31/macos-10-15-4-broke-ssh/
https://discussions.apple.com/thread/251226509


## 発見経緯

gitlabからのsshを用いたcloneができなくてこの問題の発見に至りました。

ちなみに私の問題の場合は毎回git でcloneする場合に面倒だったのでgitの設定を

```
git config --local remote.origin.url "ssh://git@xxx.xxx.xxx.xxx:12345/<リポジトリpath>"
```
のような感じでipアドレスでの接続に変えることで解決しました。
（うっかり最初--globalでやってしまって大変な目に合ったのは内緒