OmniAICreator/Qiita-1.07M huggingface dataset:
git で日記を管理したい

# 要約
git で日記をいい感じに管理したいという思いを込めて日記管理用の cli ツールを作成いたしました。
https://github.com/komem3/go-diary

# 背景
バージョン管理やリモートリポジトリを使って日記・日報を管理したいという思いが有りましたが、いかんせんディレクトリが汚くなってしまうのが問題でした。定期的にディレクトリを綺麗に整理する根気があれば良いのですが、三日坊主になりやすい私なんかはそれだけで日記を書くのが嫌になってしまいます。
そこで、日記のファイルをいい感じのディレクトリ構造で管理するツールを作成しました。

# インストール
go で作成したツールのため、以下のようにダウンロードします。

```sh
go get github.com/komem3/go-diary/cmd/diary
```

# 使い方
```sh
$ diary -h
Diary is a CLI libray for managing your diary.
This application can format your diary directory, and make index file.

Usage:
  diary [command]

Available Commands:
  format      Format directory
  help        Help about any command
  init        Initialize directory
  new         Generate new diary

Flags:
  -h, --help      help for diary
  -v, --version   version for diary

  Use "diary [command] --help" for more information about a command.
```

今回の作成したツールには以下の３つのコマンドがあるため、それぞれ解説していきます。

* [init](#init)
* [new](#new)
* [format](#format)


##init
ツールをインストールした後、日記を管理したいディレクトリで最初に実行するコマンドです。
このコマンドを実行することで、他コマンドで使われるテンプレートファイルが生成されます。

```sh
$ ls
$ diary init
$ tree
tree
.
└── template
    ├── diary.template.md
    └── top.template.md
```

このコマンドで生成したテンプレートファイルを編集することで後程紹介するコマンドの出力を変更することができます。

## new
本日の日記を生成するコマンドです。デフォルトでは本日の日付が先頭に書かれたファイルが生成されます。この時生成されるファイル名の日付情報を元に[format](#format)コマンドはフォーマットしていきます。
（記事作成日2020年5月31日）

```sh
$ diary new
$ cat 20200531.md
2020/05/31 (Sunday)
```

また、先程の[init](#init)コマンドで生成したテンプレートファイルを編集することで、生成されるファイルの出力内容を変更出来ます。

```sh
echo "今日やること" >> template/diary.template.md
$ diary new
$ cat 20200531.md
2020/05/31 (Sunday)
今日やること
```


##format
日記ファイルをそのファイル名に基づいてフォルダに格納します。格納後、それぞれのファイルがどこにあるか分かりやすいように`README.md`ファイルにリンクを書き込みます。

```sh
$ ls
20021201.md  20200101.md  20200102.txt template
$ diary format
.
├── 2002
│   └── 12
│       └── 20021201.md
├── 2020
│   ├── 01
│   │   ├── 20200101.md
│   │   └── 20200102.txt
│   └── 02
│       └── 20200202.org
├── README.md
└── template
    ├── diary.template.md
    └── top.template.md
```

![github.com_komem3_go-diary_tree_master_sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488897/49716c00-833e-615d-34f7-ec0120c70c94.png)

出力状態としては、実際のリポジトリを見てみるのが分かりやすいと思います。
https://github.com/komem3/go-diary/tree/master/sample

こちらも先程同様、テンプレートのファイルを変更することで好きな主力内容に変更することができます。

# まとめ
git を使った日記管理を行うために、「日記の作成」「日記の整理」「日記の索引」の３つを行えるコマンドを作成いたしました。
go言語はcliツールを作り易かったのですが、日付のフォーマット指定が特殊なのがいまいちでした。そこら辺の go 特有のものや、設定の変更しやすくすることが今後の課題に思っています。
RDSプロキシの作成方法が少し変わってるので書く GAされました

~~RDSプロキシはまだプレビュー版ということもあり、コンソール画面の変化も多く、開発進んでるんだなぁと見ていて面白いです。(CDK対応早く来て欲しい)~~

GA来ました！
https://aws.amazon.com/jp/blogs/aws/amazon-rds-proxy-now-generally-available/

CDKもいつのまにか追加されているようです
https://docs.aws.amazon.com/cdk/api/latest/docs/@aws-cdk_aws-rds.CfnDBProxy.html



今回書くのは、あまり公式から作成方法が出ておらず、苦しんだ部分があったので補足する内容を載せます。
ですので、ざっくりとした切り抜きになります。

以下は、公式から出ている作成手順のブログです。

英語
https://aws.amazon.com/jp/blogs/compute/using-amazon-rds-proxy-with-aws-lambda/

日本語
https://aws.amazon.com/jp/blogs/news/using-amazon-rds-proxy-with-aws-lambda/

日本語ページはIAMのJSONが途中で見切れてるので、ご注意ください。
英語版は問題ありません。


## 補足事項

**変更点1**
RDSプロキシに設定する、シークレットにアクセスするIAMロールを自動で作ってくれるようになりました

公式のブログではこのJSONでIAMロール作れやと、手順に載っていますが、不要になりました。
コンソールをぽちぽちしていくと自動で作られるようになりました。
もちろん選択することも可能です

<img width="806" alt="スクリーンショット 2020-05-31 14.16.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356664/30d2da37-79de-212b-d30e-858922edb672.png">



**注意点1**

選べないセキュリティグループがある

<img width="807" alt="スクリーンショット 2020-05-31 14.54.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356664/34f7f63a-410d-8e62-ced7-ffac055e5d2f.png">

これはよくわかりません。
CDKで作成したセキュリティグループが表示されませんでした。バグかな？

**注意点2**

ブログの手順やっただけじゃ、lambdaからアクセスできない

以下の設定が必要です。

- セキュリティグループのインバウンド設定

インバウンドの設定に、lambdaからの通信を許可する必要があります。
lambdaに設定されているセキュリティグループからのアクセスを許可するのがよいかと思います。

## 最後に
lambdaからRDSへ接続するのは、アンチパターンとされてきて、RDSプロキシがでたときには、ようやく来たかという気持ちになりました。
無い時に試したことがありますが、もうやりたくないです

DynamoDBのみでは辛い部分もあるので、これから開発が進んで、うまく両方を利用できたらよりよいアーキテクチャができるのではと楽しみです。
application.html.erb

<html>
  <head>
    <title>TweetApp</title>
    <%= csrf_meta_tags %>

    <%= stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload' %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
  </head>

  <body>
    <header>
      <div class="header-logo">
        <!-- 以下のリンクをlink_toメソッドを用いて変更してください -->
        <%= link_to("TweetApp","/") %>
      </div>
      <ul class="header-menus">
        <li>
          <!-- 以下のリンクをlink_toメソッドを用いて変更してください -->
          <%= link_to("TweetAppとは","/about")%>
        </li>
        <li>
          <!-- ここにlink_toメソッドを用いて投稿一覧ページへのリンクを作成してください -->
          <%= link_to("投稿一覧","/posts/index")%>
        </li>
      </ul>
    </header>
    <%= yield %>
  </body>
</html>
phpのcURL、SplFileObjectでsslエラーが出たときに試したいこと

あぁ、休日の一覧データが欲しい。
欲しい、
欲しい、


別のサーバ（内閣府）からcsvで取得してみる。
せっかくなのでcurlとSplFileObjectの２方法で試す。

```php
$url = 'https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv';

# curl
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
curl_close($ch);

# SplFileObject
$file = new NoRewindIterator(new SplFileObject($url));
```

curlは$dataに設定されない。（errnoは35）
SplFileObjectはエラーが発生。

```log
PHP Fatal error:  Uncaught RuntimeException: SplFileObject::__construct(): SSL operation failed with code 1. OpenSSL Error messages:
error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small
```

[curl_errno](https://www.php.net/manual/en/function.curl-errno.php)（[35] => 'CURLE_SSL_CONNECT_ERROR'）
[調べて見つけたページ](https://dream-yt.github.io/post/ssl-error-handling/)
ふーん。。。

接続先の鍵が短いのか？（たぶんopensslのバージョンが古いかなにか。）
なら短い鍵でも大丈夫なようにすれば良さそう。
オプションを調べる。

[curl_setopt](https://www.php.net/manual/ja/function.curl-setopt.php)にCURLOPT_SSL_CIPHER_LISTを発見。
[stream_context_create](https://www.php.net/manual/ja/function.stream-context-create.php)の[sslオプション](https://www.php.net/manual/ja/context.ssl.php)にciphersを発見。

sslオプションを設定してみる。

```php
$url = 'https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv';

# curl
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'TLSv1');
$data = curl_exec($ch);
curl_close($ch);

#SplFileObject
$ctx = stream_context_create([
  'ssl' => array(
    'ciphers' => 'TLSv1'
  )
]);
$file = new NoRewindIterator(new SplFileObject($url, 'r', false, $ctx));
```

できた！

内閣府のsslキーって短いんだ。。。大丈夫なのか？
終わり:v:
[Rails]都道府県プルダウンリスト

# 前置き 
検索フォームの都道府県プルダウンリスト実装を備忘録として残します。

# 前提条件
ransack導入済


# １.導入
```Gemfile
gem 'active_hash'
```
まずGemfileに上記のように記述し、bundle install。
再起動も忘れずに。


#２.prefectureモデルを作成
こちら手動です。

```ruby:models/prefecture.rb
class Prefecture < ActiveHash::Base
  self.data = [
      {id: 1, name: '北海道'}, {id: 2, name: '青森県'}, {id: 3, name: '岩手県'},
      {id: 4, name: '宮城県'}, {id: 5, name: '秋田県'}, {id: 6, name: '山形県'},
      {id: 7, name: '福島県'}, {id: 8, name: '茨城県'}, {id: 9, name: '栃木県'},
      {id: 10, name: '群馬県'}, {id: 11, name: '埼玉県'}, {id: 12, name: '千葉県'},
      {id: 13, name: '東京都'}, {id: 14, name: '神奈川県'}, {id: 15, name: '新潟県'},
      {id: 16, name: '富山県'}, {id: 17, name: '石川県'}, {id: 18, name: '福井県'},
      {id: 19, name: '山梨県'}, {id: 20, name: '長野県'}, {id: 21, name: '岐阜県'},
      {id: 22, name: '静岡県'}, {id: 23, name: '愛知県'}, {id: 24, name: '三重県'},
      {id: 25, name: '滋賀県'}, {id: 26, name: '京都府'}, {id: 27, name: '大阪府'},
      {id: 28, name: '兵庫県'}, {id: 29, name: '奈良県'}, {id: 30, name: '和歌山県'},
      {id: 31, name: '鳥取県'}, {id: 32, name: '島根県'}, {id: 33, name: '岡山県'},
      {id: 34, name: '広島県'}, {id: 35, name: '山口県'}, {id: 36, name: '徳島県'},
      {id: 37, name: '香川県'}, {id: 38, name: '愛媛県'}, {id: 39, name: '高知県'},
      {id: 40, name: '福岡県'}, {id: 41, name: '佐賀県'}, {id: 42, name: '長崎県'},
      {id: 43, name: '熊本県'}, {id: 44, name: '大分県'}, {id: 45, name: '宮崎県'},
      {id: 46, name: '鹿児島県'}, {id: 47, name: '沖縄県'}
  ]
end
```
app/models配下にprefecture.rbを作成し上記のように編集。
Prefecture < ActiveHash::BaseでActiveHash::BaseをPrefectureに継承。


# ３.検索フォーム作成(ransack導入済)

```haml:_search_form.html.haml
.search_form
  = search_form_for @q do |f|
    = f.collection_select :place_cont, Prefecture.all, :name, :name
    = f.submit "検索", class: "search_submit"
```

完了。
以下解説。

:place_contについて、placeはカラム名です。_contは〜を含むというransackのマッチャーというものです。
※詳しくはこちら[ransack](https://github.com/activerecord-hackery/ransack)

Prefecture.allは、上記のPrefectureモデル全て持ってきてってことですね〜。
Prefecture < ActiveHash::BaseでActiveHash::BaseをPrefectureに継承したからActive Recordメソッドが使えるってことです。
Active Recordメソッドとは、
・all：テーブルの全てのデータを取得する
・find：テーブルレコードの一つのデータを取得する
・new：クラスのインスタンスの生成
・save：クラスのインスタンスの保存
などのことです。

普段rails g modelで作成しているモデルもActiveHash::Baseを継承していますね。

```ruby:application_record.rb
class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true
end
```

```ruby:post.rb
class Post < ApplicationRecord
end
```



最後の方は「:name, :name」にしています。
他の記事では「:id, :name」でしたが、これだと検索出来なかったので変えました。

htmlを確認してみると下記のようになっていました。

```ruby
# 「:id, :name」の場合
<option value="1">北海道</option>

# 「:name, :name」の場合
<option value="北海道">北海道</option>
```

ありがとうございました！
十数年前のJava使いが、今更ながらJava8 の機能を勉強してみた( ラムダ式編 )

# はじめに
最近お仕事の都合で、Java を使う機会に恵まれたので
太古のJava( 1.3 )知識をアップデートしてみました。



## ラムダ式 とは
関数的インターフェイスを簡単に実装するための機能です。

これだけでは何のことかさっぱりなので、例を出しつつ説明したいと思います。

## ラムダ式の違いをコードで比較
### ラムダ式を使わないコード
```java
public static void main(String[] args) {

  class Sample implements Runnable {
    public void run() {
      System.out.println("I Love Pengin!");
    }
  }

  Runnable runner = new Sample();
  times( 10, runner );
}

public static void times( int count, Runnable runner ) {
  for( int i = 0; i < count; i++ ) {
    runner.run();
  }
}
```

### ラムダ式を使ったコード
```java
public static void main(String[] args) {

  funcCall( 10, () -> System.out.println("I Love Pengin!") );
}
public static void times( int count, Runnable runner ) {
  for( int i = 0; i < count; i++ ) {
    runner.run();
  }
}
```

## 使うと何が良いの？

指定の処理を複数回繰り返す `times` 関数への処理を例にしました。
見比べてみると、ラムダ式を使うと随分と完結に処理がかけていることが見比べていただけると思います。

処理の一部を他のオブジェクトに代替させる手法を委譲と呼ぶのですが、
ラムダ式を使うことで、この委譲が随分と書きやすくなることがメリットに上がると思います。


## ラムダ式の書き方
### 書式
ラムダ式を使う場合の書式を見ていきましょう

```java
() -> System.out.println("I Love Pengin!")
```

1. 最初の `()` はメソッドの引数を表します。今回は引数を使用してませんが引数を使用することも可能です。
2. `->` が実際の処理内容を記載しています。 処理内容が複数にまたがる場合は、`-> { ここに処理 }` と記載します。

※引数や、戻り値を利用する場合、呼び出される側( 今回ならtimes関数 )の実装が少し異なります。

### 引数を使用したラムダ式
#### 使うとき
ラムダ式の引数を指定することで、処理中に引数が利用できます。
```java
(i) -> System.out.println("I Love Pengin!" + i)
```

#### 作るとき
利用する引数、戻り値の種類に応じて、関数インターフェイスを使い分ける必要があります。
引数１つ、戻り値なしの場合は、以下のようになります。

```java
public static void times( int count, Consumer<Integer> runner ) {
  for( int i = 0; i < count; i++ ) {
    runner.accept(new Integer(i));
  }
}
```
使い分けるインターフェイスは以下の様になります。

| 種類       |       関数インターフェイス | メソッド    |
|-----------------|------------------|------------------|
| 値を返さない 引数０個　| Runnable | run |
| 値を返さない 引数1個　| Consumer | accept |
| 値を返さない 引数2個　| BiConsumer | accept |
| 値を返す 引数０個　| Supplier | get |
| 値を返す 引数1個　| Function | apply |
| 値を返す 引数2個　| BiFunction | apply |
| 真偽値を返す 引数1個　| Predicate | test |
| 真偽値を返す 引数2個　| BiPredicate | test |
| 演算結果を返す 引数1個　| UnaryOperator | test |
| 演算結果を返す 引数2個　| BinaryOperator | test |
十数年前のJava使いが、今更ながらJava8 の機能を勉強してみた( Generics編 )

# はじめに
最近お仕事の都合で、Java を使う機会に恵まれたので
太古のJava( 1.3 )知識をアップデートしてみました。

## Generics とは
利用する型の処理を実装時に確定する機能です。

これだけでは何のことかさっぱりなので、例を出しつつ説明したいと思います。

## Generics 有無をコードで比較
### Java1.3の頃のコード
```java
List list = new ArrayList();

// list に値を格納
// String -> Object への変換なので暗黙的に格納出来る
list.add("1");
list.add("2");
list.add("3");

for (Iterator it = list.iterator(); it.hasNext(); ) {
	// list の値を取得して表示
	// 取得時は Object -> String は明示的なキャストが必要
	String str = (String) it.next();
	System.out.println(str);
}
```

### Java8のコード
```java
// String 型を利用するArrayList を準備
List<String> list = new ArrayList<String>();
// List<String> list = new ArrayList<>(); // 変数宣言時に型が確定しているので、インスタンス作成時は <> と省略可能


// list に値を格納
// String をそのまま格納出来る
list.add("1");
list.add("2");
list.add("3");

for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
	// list の値を取得して表示
	// String で取得できるのでキャスト不要
	String str = it.next();
	System.out.println(str);
}
```


## 使うと何が良いの？
Java1.3 では、コレクションを使う場合
Object 型で格納する必要がありました。
当然、取り出すときもObject 型なので、使う型に合わせてキャストする必要がありました。

この取り出し時にキャストするというのが曲者で
格納する型を間違えると、ClassCastException が発生してしまいます。
当然ながらException なので実行してみないと間違いに気が付かないのです。

一方で Generics を使うと、実装時に型の確定が出来るので
格納する型を間違える＝`コンパイルエラーが発生`
と、イージーミスの削減にも役立つ機能です。
【Rails】Font Awesomeの導入方法

# 開発環境
・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・OS: macOS Catalina

# アカウント作成

1.下記リンクにアクセスする。
[Font Awesome Start画面](https://fontawesome.com/start)

2.メールアドレスを入力し、「Send Kit Code」をクリックする。
<img width="1431" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579893/a81d7b14-bb3e-4c1b-0080-ffe6a121d811.png">

3.確認メールが届くので「Click to Confirm Your Email Address + Set Things Up」というリンクにアクセスする。

4.下記画面に遷移するので、パスワードを入力して「Set Password & Continue」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579893/ee39d590-674a-0785-9fdb-53e8e3cf2053.png)

5.プロフィール情報入力画面に遷移するが、今は特に設定する必要も無いので、
何も入力せずに「All set.Let's Go!」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579893/3a25d964-7b0b-d6aa-9446-8c57966fd081.png)

6.下記画面に遷移するので、「Copy Kit Code」をクリックして、コードをコピーする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579893/d278244a-8214-81f0-dc75-2a23154ce1d9.png)

# Rails側の操作

### 1. 「application.html.slim」を編集

先ほどコピーしたコードを貼り付けて、Slim形式に変換する。

```slim:application.html.slim
doctype html
html
  head
    title
      | Font Awesomeテスト
    = csrf_meta_tags
    = csp_meta_tag
    = stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload'
    = javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
    / 追記
    script src='https://kit.fontawesome.com/c51513dd6c.js' crossorigin='anonymous'
```

### 2. アイコンを表示

①下記サイトにアクセスし、使用したいアイコンをクリックする。
[Font Awesome Icon一覧](https://fontawesome.com/icons)

②下記の様な画面に遷移するので、クラス名をコピーする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/579893/b728d003-f8ea-a0af-0266-bc04575c88e0.png)

③下記の様にHTMLに記述するとアイコンが表示されます。

```slim:~html.slim
i.far.fa-heart
```
Pythonista3でYouTube動画の歌詞表示アプリ作ってみた！

## 1.はじめに
私は音楽を聞く際にYouTube Musicを使っているのですが、このアプリを使う上で非常に不満に思っていることが一つありました。

今回はその不満点を解消した話をまとめたいと思います。

何が不満だったかというと主要の音楽再生アプリには今や当たり前のように実装されている歌詞表示がYouTube Musicではまともに機能しないのです。（機能の実装は2020年2月にされた模様）

[参考：YouTube Musicアプリが歌詞表示に対応](https://japanese.engadget.com/jp-2020-03-04-youtube-music.html)

2月に実装された機能ということなので３ヶ月たった今はどうなのかという感じですが、私がよく聞く曲に関して一向に歌詞が追加される気配はなく歌詞表示ができた試しが一度もありません・・・orz

待っていても改善される気配がないということもあり、歌詞表示アプリくらいなら自分でも作れるかも？と思いチャレンジしてみました！！

## 2.環境
- 使用した端末：iPad mini 5、iPhone 11
- アプリ：Pythonista3 (v3.3)
- アプリ：ショートカット
- 対応しているサイト：YouTube

ios端末上手軽にアプリを作成できるpythonista3を使用して作成しました。またYoutubeアプリとPythonista3の連携にショートカットアプリを使用しています。
冒頭ではYouTube Musicを主に使っていると書きましたが歌詞表示ができないとわかってからはめっきり使わなくなり普通のYoutubeのみ使っているため対応させたサイトはYouTubeのみです。

## 3.制作物
https://twitter.com/tkfm1991/status/1266961924182294528

動画のタイトルから検索できなかったときの処理
https://twitter.com/tkfm1991/status/1266963028748070913

## 4.プログラム

### プログラムの流れ
①YouTubeアプリの共有機能を使ってショートカットアプリに動画URLを渡す

【ショートカットアプリ】
②URLをPythonistaに渡せるように加工(注１)
③PythonistaにURLを渡して起動

【Pythonista】
④②で加工した動画URLを元の形に整形
⑤動画URLのWebページをスクレイピングして動画タイトルを取得
⑥動画タイトル + '歌詞' のキーワードでGoogle検索して歌詞サイトを抽出
⑦UIに描画
⑧歌詞サイトを選択、表示

[再検索処理]　
- 動画タイトルが長すぎて歌詞サイトがヒットしない場合は再検索処理を実施

動画タイトルが長い場合は" "（半角スペース）で分割してユーザに候補のキーワードを提示して検索

### 4-1.Pythonista編
コードはすべてGitHubに公開してますので以下を参照下さい。
[https://github.com/tkfm1991/Lyrics_Search](https://github.com/tkfm1991/Lyrics_Search)

本来ならクラス分け等をしてコードを整理すべきなのでしょうが、技術が伴わずそこまでできていません・・・

### 4-2.ショートカット編
![IMG_0239.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187797/fcf09122-9cdf-aa3a-9e17-65f57cb0149e.png)
![IMG_0240.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187797/61ba8ad4-992e-0bb3-02b0-f48703116933.png)
![IMG_0241.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187797/7cee9cfa-89b2-e021-9bc2-ed765cbcd318.png)

Pythonistaを引数付きで実行する際には以下の形式にする必要があるためその変換処理を行っています

```
pythonista3://MyScript?action=run&args=foo%20bar
```
→ 引数を２つ設定したい場合(foo と bar)は "%20"で挟む

[公式Document: The Pythonista URL Scheme] (http://omz-software.com/pythonista/docs/ios/urlscheme.html#pythonista-urlscheme)

[注１]
躓いたポイントとしてはYouTubeの動画形式は以下のようになっていますがショートカットアプリからPythonistaを起動しようとしてもうまく行かないということがありました。

```
https://www.youtube.com/watch?v=TanZP7g13sk
```
→原因を調べてみたところ引数に"="が入っているとうまく行かないようです。

そこでショートカットアプリ内で"="を"%20"に変換して２つの引数としてPythonistaに渡してPythonファイル内で２つの引数を"="で連結するという面倒な処理を挟んでいます。


## 6.おわりに
Pythonista3を使うことで初学者の私でもアイディアを手軽にアプリ化することができたのでPythonを初めたてで何かしらのアプリを作ってみたいとう人にはおすすめのアプリケーションだと思いました。

ただ、文中にも残したようにクラス分けができておらず第３者から見たらぐちゃぐちゃなコードになってしまっているので今後は作成するだけでなく、綺麗なコードをかけるように心がけたいところです！
PythonCGIの基本

## 想定環境
- Ubuntu Server 18.04LTS
- Python3

## cgi-binディレクトリの作成
ホームディレクトリ直下に`cgi-bin`ディレクトリを作成する。

```bash
user@hostname:~$ mkdir cgi-bin
user@hostname:~$ cd cgi-bin
```

## CGIスクリプトの作成
```bash
user@hostname:~/cgi-bin$ which python3
/usr/bin/python3

user@hostname:~/cgi-bin$ vi hello.py
```
`which`コマンドでPython3のパスを確認しておく。

```hello.py
#!/usr/bin/python3

print('Content-Type: text/html; charset=utf-8')
print()

print('<h1>Hello, World!</h1>')
```

### コードの解説
1. 1行目にShebang(シバン)と呼ばれるコメントを書く必要がある。<br>Shebangはコンパイラの場所を示すもので、これがないとPythonのコードをPythonとして認識することができず予期せぬ挙動を招くことになる。
2. 3行目の`print('Content-Type: text/html; charset=utf-8')`がHTTPヘッダーとして機能し、コード内で出力した文字列をHTMLの`BODY`タグ内に埋め込むことができる。<br>`charset`の指定はファイルの文字コードを明示的に宣言したものである。
3. 4行目のprintの空文は3行目のHTTPヘッダーを正常に機能させるために2つ分の改行が必要なため使用している。<br>空文を使用したくない場合はHTTPヘッダーの記述を`print('Content-Type: text/html; charset=utf-8\n\n')`とすることでも同様の挙動をする。

## CGIの実行
CGIを実行するための手順を説明する。
1. cgi-binディレクトリと実行ファイルに実行権限を付与する。
2. pythonのテストサーバを起動する
3. ブラウザでアクセスして確認する

上記の3つの手順でローカル開発が可能となる。<br>
公開したい場合はApache2を使用すれば公開することができる。(詳細は[こちらの記事](https://qiita.com/Disk_MJM/items/7e334169180d24a330a3)へ)

### コマンド
```bash
user@hostname:~$ ls
cgi-bin

user@hostname:~$ sudo chmod -R +x cgi-bin

python3 -m http.server 8080 --cgi
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
```

注意点として***cgi-binディレクトリの直上でサーバを立ち上げる必要がある。***
これでlocalhost上に公開された状態になったので[http://localhost:8080/cgi-bin/hello.py](http://localhost:8080/cgi-bin/hello.py)にアクセスして表示されれば成功。

### エラー
#### 404 Not Found
- ファイルが見つからないと言われているのでパスが間違っている可能性がある。
- サーバを立ち上げ忘れていないか確認する。
- URLやファイル名に間違いがないか確認する。

#### 403 Forbidden
- アクセス権限がないため弾かれている。
- ターミナルに戻って`ls -l`コマンドで権限を確認して`x`がついているか確認する。
- `http://localhost:8080/cgi-bin`にアクセスしている場合はファイルまでの直リンクでアクセスする。

#### 500 Internal Server Error
- サーバ系のエラーで幅広いエラーで表示されるため原因の特定が難しい。
- サーバを立ち上げたターミナルを表示すると`Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...`の下にアクセスログが表示されているのでエラー内容を確認して対処する。
  - エラーログを確認するときは下から上に向かって読んでいくと理解しやすく、効率的に解消できる。


#### 画面が真っ白になる・ソースコードがそのまま表示される
- 共通
  - HTTPヘッダーの記述を間違えている可能性が高い。
  - 改行の数は適正か、セミコロンを忘れたり打ち間違えたりしていないかなどを確認する。
  - もしくはShebangのパスや文法を間違えていないか確認する。
- ソースコードがそのまま表示される
  - サーバの立ち上げで`--cgi`を忘れていないか確認する。
質問です

大学の課題で、円筒座標系の熱伝導方程式における、陽解法のプログラムを作成し、実際に解くという物があるのですが、プログラムを組んでいる際に、どのように処理をすれば良いか判らないエラーが出てきてしまい、手詰まりになっています。
どのような対処を試みれば良いのか、また、前提に間違いが有りましたらどう直せば良いのかを、ご教示していただけますでしょうか。

前提 T:温度　r:円筒の半径　t:時間

```math
\left(\partial T/\partial t\right) =
\left(\alpha \partial^2 T/\partial r^2\right) + 
\left(\alpha/r \times \partial T/\partial r\right)
```
を陽解法で解く


```python:anaconda3.7

import numpy as np
import matplotlib.pyplot as plt
import time

# area
r0 = 1.0
# time
Lt = 1.0E4
# number of discrete point
Nr = 32
Nt = 1000

# make no dimentional
r = np.zeros(Nr)
def dimless_r(r):
    return r / r0
dimless_dr = dimless_r(1) - dimless_r(0)

# convert alpha
def thermal_diffusivity(rho, Cp, k):
     return k / Cp / rho
alpha = thermal_diffusivity(7870, 461, 67)

t = np.zeros(Nt)
Ft = alpha * t / r0**2
dimless_dt = Ft[1] - Ft[0]

T0 = 300
Th = 400
NT = 1000
T = np.zeros(NT)
def dimless_T(T, T0, Th):
                return (T - T0) / (Th - T0)
                  
# discretization
def discretization(L, N):
     return np.linspace(0, L, N)
r = discretization(r0, Nr)
t = discretization(Lt, Nt)

start_s = time.perf_counter()

for n in range(Nt - 1):
    for i in range(1, Nr - 1):
        # B.C.
        T[:, 0] = dimless_T(400, 300, 400)
        r[r0] = 1
        # I.C.
        T[0, 1:] = dimless_T(300, 300, 400)
        r[0] = 0
        
        T[n+1, i] = (1 - (2*dimless_dt/dimless_dr**2) + (dimless_dt/r[i]*dimless_dr)) * T[n, i] + (dimless_dt/dimless_dr**2) * T[n, i+1] +(dimless_dt/dimless_dr) * ((1/dimless_dr) - (1/r[i])) * T[n, i-1]

        zeta = dimless_dt/dimless_dr**2
        eta = dimless_dt/dimless_dr
        
        T[n+1, i] = (1 - 2*zeta + eta/r[i]) * T[n, i] + zeta * T[n, i+1] +(zeta - eta /r[i] ) * T[n, i-1]

end_s = time.perf_counter()

print(T[n+1, i])
```

出てきたエラーが以下の通りです。

```
IndexError                                Traceback (most recent call last)
<ipython-input-2-370665aa4ef2> in <module>
     44     for i in range(1, Nr - 1):
     45         # B.C.
---> 46         T[:, 0] = dimless_T(400, 300, 400)
     47         r[r0] = 1
     48         # I.C.

IndexError: too many indices for array
```
​



​
InfluxDB内の温度と湿度からGrafanaで不快指数を表示してみました。

## はじめに
InfluxDBのQuery言語は、InfluxQLで表記します。言語仕様は[こちら](https://docs.influxdata.com/influxdb/v1.8/query_language/)。
SQLと似ている面がありますが、ちょっとしたフィールド間の計算の仕方で戸惑ってしまいました。分かってしまえば、全然普通の記法で良いのですが、迷った点をアップしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266665/43f6d0dc-3d65-8ef8-b47c-fb6ed352a191.png)

## InfluxDBに保存してある気温と湿度
センサーから得た気温と湿度は、InfluxDBに以下の形で格納されています。コマンドプロンプトから influxコマンドで接続して確認しました。

```
$ influx
Connected to http://localhost:8086 version 1.8.0
InfluxDB shell version: 1.8.0
> use influx_iot01
Using database influx_iot01
> show measurements
name: measurements
name
----
bme280_101
pir_bed
table1
tof
> select * from table1 limit 5
name: table1
time                hum   temp
----                ---   ----
1590678854985666143 70.22 17.7
1590679151614186158 70.42 17.58
1590679448330920972 72.27 17.41
1590679745266150226 72.48 17.4
1590680042062531150 72.58 17.43
>
```

## 不快指数の計算式
不快指数の計算式は、[Wikipedia](https://ja.wikipedia.org/wiki/%E4%B8%8D%E5%BF%AB%E6%8C%87%E6%95%B0)によると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266665/08bb8e79-2fa8-8655-39f1-27dc3170a27c.png)

## GrafanaのQueryで入力
可視化したいパネルを選択した後、通常のQuery選択画面から、要素を選択していく方法では、今回のような計算式を含むQueryを入力できませんでしたが、「鉛筆マーク」をクリックした後で、直接 InfluxQL文法でQueryを書いてしまえば問題なくできました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266665/703f5fa4-1ad3-0ed2-e9df-6f49bc3e364f.png)

ただ、入力した後、鉛筆マークを再度クリックすると、元に戻ってしまいますので、この状態で保存する必要があります。使ったQueryは以下。

```
SELECT mean("temp") *0.81+ mean("hum") * 0.01 * (mean("temp") * 0.99 - 14.3) + 46.3 
FROM "table1" WHERE $timeFilter GROUP BY time(5m) fill(null)
```

## しきい値で表示色を変える設定
Fieldのタブから、Thresholdを選択し、しきい値と色を選択すればOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266665/cad089dc-5ca9-d749-62bb-a722891c2c8b.png)

## アラートを出す
アラートをメールに送る方法は、別途試してみます。
CentOS7 OpenJDK Maven Install

# はじめに

CentOS 7 に OpenJDK と Maven を Install する手順を備忘録としてメモります



# CentOS 7

適当に作成



# OpenJDK 8

Install

```
sudo yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel java-1.8.0-openjdk-src
```

# OpenJDK 11

Open JDK 11 の場合はこちら

```
sudo yum install -y java-11-openjdk java-11-openjdk-devel java-11-openjdk-src
```

# Maven 3.6.3 Install

依存関係を管理するために、Maven を Install します。

以下のURLでダウンロードURLを確認します。
https://maven.apache.org/download.cgi

[![1587385604751.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F104247%2F0ffd981e-7793-0ef6-1c75-cbaf7aeeab18.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=bdbacdbc3edb2c1c26eecf0c8aa26cb3)](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.ap-northeast-1.amazonaws.com%2F0%2F104247%2F0ffd981e-7793-0ef6-1c75-cbaf7aeeab18.png?ixlib=rb-1.2.2&auto=format&gif-q=60&q=75&s=bdbacdbc3edb2c1c26eecf0c8aa26cb3)

ダウンロードページでコピーしたURLを使って、CentOS 上に tar.gz ファイルをダウンロードします



```
mkdir ~/maven
cd ~/maven
wget https://ftp.jaist.ac.jp/pub/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
```

次の手順に従ってインストールしていきます。
https://maven.apache.org/install.html

tar.gz ファイルを解凍



```
tar xfvz apache-maven-3.6.3-bin.tar.gz
```

環境変数設定
bashrc に追記



```
echo 'export PATH=$PATH:$HOME/maven/apache-maven-3.6.3/bin' >> ~/.bashrc
```

bashrc 再読み込み



```
source ~/.bashrc
```

mvn コマンドが実行可能確認します



```
[opc@maven maven]$ mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /home/opc/maven/apache-maven-3.6.3
Java version: 1.8.0_252, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.el7_8.x86_64/jre
Default locale: en_US, platform encoding: ANSI_X3.4-1968
OS name: "linux", version: "3.10.0-1127.8.2.el7.x86_64", arch: "amd64", family: "unix"
[opc@maven maven]$
```
Jekyllでmermaidを使ってダイアグラムを描く

[GitHub Pages](https://pages.github.com/)は、静的なウェブサイトのホスティングサービスです。
GitHub Pagesのデフォルトの静的サイトジェネレータはJekyllで、JekyllのソースリポジトリをGitHubにあげておけば、リポジトリが更新されるたびに、自動的にそのソースリポジトリからウェブサイトを再生成してくれます。JekyllではMarkdownでコンテンツを書くことができます。

[mermaid](https://mermaid-js.github.io/mermaid/#/)を用いると、フローチャートやUMLなどのダイアグラムなどの図の構成や属性をプレーンテキストでMarkdownのコンテンツ内に書き、生成されたHTMLに図を描画することができます。[mermaidのサイト](https://mermaid-js.github.io/mermaid/#/)にmermaidの記述と生成された図のサンプルがあります。

Jekyllでmermaidを有効にする簡単な方法を調べたところ、[参考になるリポジトリ]がありました。このリポジトリの[mermaid.html](
https://github.com/yk-liu/yk-liu.github.io/blob/dbc7eb924ba4d2e2f4da6ffee94b97b347379083/_includes/markdown-enhancements/mermaid.html)を、`_include`内に置きます。そして、mermaidを使用したいページのレイアウトで、`</body>`の後で、`mermaid.html`をインクルードします。。

```
{% include mermaid.html %}
```

[参考リポジトリ](https://github.com/yk-liu/yk-liu.github.io)では、`mermaid.html`のパスが異なりますが、`post.html`の[この部分](https://github.com/yk-liu/yk-liu.github.io/blob/dbc7eb924ba4d2e2f4da6ffee94b97b347379083/_layouts/post.html#L54-L56)です。また、Front matterで、`mermaid: true`と指定されたページのみmermaidが有効になるようにされています。

[GitHub Pages]: https://pages.github.com/


[参考になるリポジトリ]: https://github.com/yk-liu/yk-liu.github.io
[Python]04章-05 いろいろなデータ構造（タプルの作成と特徴）

#[Python]04章-05 タプルの作成
ここでは、リストではなく、**タプル**というデータ構造について触れていきたいと思います。
リストと似ていますが、タプルとリストを比較してみていきたいと思います。

##タプルの作成
早速、タプルを作成していきたいと思います。今回もPython Consoleから操作していきます。
**Python Console**に以下のコードを入力してください。今回の要素は文字列で説明していきたいと思います。

```.py
>>> T= ('茨城県', '栃木県', '群馬県', '埼玉県', '東京都', '千葉県', '神奈川県') 
>>> T
('茨城県', '栃木県', '群馬県', '埼玉県', '東京都', '千葉県', '神奈川県')
```

上記のコードを入力してわかる通り、タプルは**[  ]**ではなく、**(  )**を使って作成します。

以下のように、タプル内の各要素を取り出したり、**len関数**で要素の長さを求めることは可能です。ここまではリストと同じであることは確認できます。

```.py
>>> T[2]
'群馬県'
>>> T[1:3]
('栃木県', '群馬県')
>>> len(T)
7
```

なお、タプルを囲むための**( )**は省略もできます。

```.py
>>> tp = 10, 20, 30
>>> tp
(10, 20, 30)
```

1つの要素から成り立つタプルを作成したいときには、最後に,（カンマ）を入力するようにしてください。そうしないと、単一の値を入力していることになるためです。

```.py
>>> tp=10,
>>> tp
(10,)
```

また、タプルでは、複数の変数に値を同時に代入ができます。

```.py
>>> x, y, z = (100, 200, 300)
>>> x,y,z
(100, 200, 300)
>>> x
100
```
複数の変数に値を代入する際には、要素の数をそろえないとエラーとなります。

##タプルの特徴
では、リストとタプル何が違うのでしょうか？
**Python Console**に以下のコードを入力してください。一度変数**T**の内容を表示してから実行します。

```.py
>>> T
('茨城県', '栃木県', '群馬県', '埼玉県', '東京都', '千葉県', '神奈川県')
>>> T[1]='AAA'
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
```

上記コードを見るとわかるように、**タプルでは要素の変更ができません。**
また、メソッドで値の操作もできないことを確認できます。

```.py
>>> T.clear()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'clear'
```


少し専門的な言い方をしますと、リストは要素を変えることができるので、**ミュータブル**なデータ構造と言い、タプルは要素の値を変えられないので、**イミュータブル**なデータ構造ということがあります。

では、タプルは要素の値を変えられないので、使用することはないのではないかと思われるかもしれません。
しかし、この値が変えられないということも実務上では使用することはよくあるのです。

例えば、先ほどの例では都道府県の関東地方の都県名をタプル**T**に代入しましたが、こういった都道府県名はまず基本的には不変となります。
（都道府県の地名が変わるという可能性は十分低い。）

これがもしリストで保管されていると、誤って都道府県名を変えてしまうことがあり得ます。そういったミスを防ぐという意味でもタプルは使われることは多いです。

##最後に
今回はタプルというデータ構造を扱いましたが、リストとの違いを把握できましたでしょうか？
タプルは学んでいると使用用途が見えずらいと思いますが、要素の値を変えたくないときに利用するものだということが把握できればよいでしょう。


###[【目次リンク】へ戻る](https://qiita.com/ko0821/items/379e8bd9e6ea01089419)
自分のツイート全部消す

## はじめに
たまに、無性に坊主にしたくなる。そんな気持ちで自分のツイートを全部消したくなりました。

ツイート削除ツールは色々あります。しかし、APIの都合で一定件数以上消せなかったり、有料会員になる必要があったり、自分の環境で上手く動かなかったりして、自分で用意することにしました。

なお、Twitter APIもPythonも初めて触ったため、定石から外れた使い方があるかもしれません。参考にする場合は自己責任ということでひとつ、お願いします。

## やること
自分のTwitterアカウントのツイートを全部消す。

## 環境
OS:Windows 10
言語:Python3.8.3

## 手順
### 1. Twitter APIの利用申請
こちらのサイトを参考に、利用申請を行いました。
https://www.itti.jp/web-direction/how-to-apply-for-twitter-api/
https://qiita.com/kngsym2018/items/2524d21455aac111cdee

ツイートを削除したいアカウントで申請します。申請を行うと、すぐメールが届きました。メール内のアドレス確認をクリックするとダッシュボードを使えるようになり、アプリ情報を作成できます。参照した記事では、使用内容確認のやりとりをされたみたいですが、僕はそういったものはなかったです。アプリの使用意図が「学習と自分のツイート消す」というだけだったからかもしれません。拙い英語でも問題なく申請が通りました。

### 2. Pythonのインストール
自分の環境に合うものをDLしてインストールしました。
https://www.python.org/downloads/windows/

### 3. ライブラリのインストール
コマンドプロンプトを開き、ライブラリをインストールします。

```
py -m pip install python-twitter
```

環境変数Pathに以下の2つを追加しました。順序が逆ですね。

```
[インストール先]\Python38
[インストール先]\Python38\Scripts
```

### 4. ツイートデータの取得
Twitterのアカウントから、ツイートデータのアーカイブを取得します。
手順はこちらのサイトにわかりやすく書いてありました。
https://passion-blue.com/twitter-account-backup

取得したアーカイブを解凍すると、dataディレクトリの中にtweet.jsがあります。json形式とするため、開いて、1行目「window.YTD.tweet.part0 = 」を削除して、tweet.jsonとして別名保存しました。（単なる個人ツールですし、滅多に使う機会もないでしょうし、このへんは人力でサクッとやっちゃいます。）

### 5. スクリプトの作成

```python
# -*- coding: utf-8 -*-

import twitter
import json
import signal

# 途中でCtrl + Cで止められるようにするための記述
signal.signal(signal.SIGINT, signal.SIG_DFL)

# Twitter APIを利用するための情報
api = twitter.Api(
    consumer_key='YOUR_CONSUMER_KEY',
    consumer_secret='YOUR_CONSUMER_SECRET',
    access_token_key='YOUR_ACCESS_TOKEN_KEY',
    access_token_secret='YOUR_ACCESS_TOKEN_SECRET'
)
screen_name = 'YOUR_TWITTER_ID'

# jsonファイル読み込み
json_open = open('tweet.json', 'r', encoding="utf-8_sig")
json_load = json.load(json_open)

for v in json_load:
    try:
        # IDを指定して削除する
        api.DestroyStatus(v['tweet']['id'])
        print("delete:" + v['tweet']['id'])
    except:
        # すでに削除済みであるなどして削除に失敗した場合
        print("error :" + v['tweet']['id'])
```

こちらの記事を参考にさせていただきました。
https://qiita.com/aeas44/items/a5b82da69b64b32aada4
https://qiita.com/junkoda/items/50ca8604ecbb04e9f772

トークン類は、Twitter Developersのアプリ -> Details -> Keys and tokens で参照できます。

### 6. スクリプトの実行
4.で作成したtweet.jsonを、スクリプト（app.py）と同じディレクトリに配置して実行します。

```
python app.py
```

削除したIDと失敗したIDが順々にコンソールに吐き出されます。ちゃんと時間を計測していなかったので感覚値ですが、秒間数ツイートペースで、約1万ツイート削除に1時間前後かかったと思います。

### 余談
最初、消したいTwitterアカウントとは別のアカウントでトークンを取得したため、実行時に"You may not delete another user's status."となってしまいました。なので、ツイートを削除したいアカウントで再取得しました。そりゃそうか…という感じですが、有料の削除ツールなどはどうやって申込者のツイート削除を実現しているんだろう…？ Twitter認証行えばうまいことできるのかもしれないですね。ともかく目的は達成されました。
Surface Pro Tips

Surface Proを使っていて、知っているとちょっと便利かな、と思ったことの個人的なメモ。

## Surface Proのバージョン確認方法
### システム情報から確認
自分が使っているSurface Proが6なのか7なのか、わからなくなった時に。

1. [スタート]ボタンをクリックし、「システム情報」と入力
1. 検索結果の一覧から [システム情報] を選択
1. 画面右側の[項目] 列で [システム モデル] を確認<br>
   以下は、Surface Pro 7の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253975/e9677005-7551-1ee9-8aea-bbc7fe557fab.png)

### Surfaceアプリから確認
Microsoft Storeから、`Surface`というアプリをインストールする。おそらくSurfaceにはプレインストールされているのではないかと思うが。（私のSurface Pro 7には入っていた）
このソフトでモデル名やシリアル番号を確認できる。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253975/91d11481-7c4d-d817-bcae-bbdffe3711ee.png" width=50% />


## データ消去方法
Surface Proを処分する際には、忘れずにデータ消去をしましょう。
[Microsoft Surface Data Eraser
](https://docs.microsoft.com/ja-jp/surface/microsoft-surface-data-eraser)

## UEFI Menu表示方法
1. Surfaceの電源を切る
2. `ボリュームを上げる`ボタンを押したまま、電源ボタンを押す<br>
   UEFI Menuが表示されるまで、`ボリュームを上げる`ボタンを押しっぱなしにする。
3. UEFI Menuが表示されたら`ボリュームを上げるボタン`を放す

参考：
下記リンクのUEFI Menuの表示方法がちょっとわかりにくい（機械翻訳のせいかな）ので、一応書いてみた。
[Surface UEFI の設定を管理する](https://docs.microsoft.com/ja-jp/surface/manage-surface-uefi-settings)

## USBドライブをboot可能状態にする

https://support.microsoft.com/ja-jp/help/4023511/surface-boot-surface-from-a-usb-device
AWS DataSync とは

#AWS DataSync とは
> AWS DataSync は、AWS ストレージサービスとの間で大量のデータのコピーを簡素化、自動化、高速化するために設計されたオンラインデータ転送サービスです。DataSync は、インターネット経由や AWS Direct Connect を介してデータをコピーします。フルマネージド型サービスの DataSync は、アプリケーションの変更、スクリプトの開発やインフラストラクチャの管理の必要性を排除します。

> DataSync では、ネットワークファイルシステム (NFS) と Amazon Elastic File System (Amazon EFS) または Amazon Simple Storage Service (Amazon S3) 間のデータ転送をサポートしています。また、サーバーメッセージブロック (SMB) と Amazon EFS、Amazon S3、または Amazon FSx for Windows ファイルサーバー の間のデータ転送もサポートしています。

##ユースケース
> データの移行 – ネットワークを介して Amazon S3 や Amazon EFS、または Amazon FSx for Windows ファイルサーバー にアクティブデータセットを素早く移動します。DataSync には自動暗号化やデータの整合性検証が含まれ、データは安全で無変更の使用可能な状態で到着します。

> データのアーカイブ – コールドデータを、高価なオンプレミスストレージシステムから、堅牢で安全な長期ストレージ Amazon S3 Glacier や S3 Glacier Deep Archive などのストレージに直接移動します。これにより、オンプレミスのストレージ容量を解放し、レガシーストレージシステムをシャットダウンできます。

##利点
> ネットワーク経由でデータを AWS に高速 (最大 10 Gbps) で転送します。このアプローチにより、移行、分析や機械学習のためのハイブリッドワークフローやデータ保護プロセスが高速化されます。

> データ転送コストを削減し、DataSync の一定したギガバイトあたりの料金でコスト効率よくデータを移動します。また、スクリプトの開発と管理のコストを節約でき、費用がかかる商用の転送ツールが不要です。

##AWS DataSync アーキテクチャ
* オンプレミスから AWS へのデータ転送

<img width="802" alt="スクリーンショット 2020-05-31 13.54.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/42b51156-85a6-9228-6e90-b51ea656c6de.png">

* クラウド内 NFS からクラウド内 NFS または S3 にデータを転送する

<img width="599" alt="スクリーンショット 2020-05-31 13.55.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/bd718be3-0551-bcf3-a0ed-4176bb1d2239.png">

* S3 からクラウド内 NFS に送信する

<img width="564" alt="スクリーンショット 2020-05-31 13.56.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/b9fb3230-8243-088f-6696-b69407a6b408.png">
Python例外処理


## 代表的な例外
####TypeError
例：TypeError: unsupported operand type(s) for /: 'str' and 'int'
String型を計算しようとしたときなどに起きるエラー

####ZeroDivisionError
例：ZeroDivisionError: division by zero
1/0のようにゼロで割ってしまったときに起きるエラー

####NameError
例：NameError: name 'hoge' is not defined
定義していない変数を使ったときに起きるエラー

####AttributeError
例：AttributeError: type object ‘list’ has no attribute 'fuga'
存在しない属性にアクセスしようとしたときに起きるエラー


## Pythonの例外処理ルール
- `try`: 括ったコードを例外処理する
- `except <error-case>`: error-caseの例外発生時に実行するブロック
- `except`: どんな例外発生時にも実行するブロック
- `else`: 例外が発生しなかった場合のみ実行するブロック
- `finally`: 例外が発生してもしなくても実行するブロック

## try-except
実行した処理でエラーが派生した場合でも処理を継続させたい場合に使用する

```python

Num = [1,2,3]
n = 4

#処理を継続させつつ、エラーを抽出
try:
    print(Num[n])  
except:
    print('エラー')  #データがない場合、エラー

print('処理継続')

#出力結果
エラー
処理継続
```

## その他の例外処理
例外が複数ある場合は、例外の種類に応じて処理を分ける

```python
Num = [1,2,3,4]
n = 5
n = '文字列'   

try:
    print(Num[n])
except IndexError as ie:
    print('エラー内容: {}'.format(ie))
except NameError as ne:
    print(ne)
except Exception as ex:　#IndexError、NameError以外のエラーが発生した場合
    print('エラー内容: {}'.format(ex))

print('例外発生')

#出力結果
エラー内容: list indices must be integers or slices, not str
例外発生
```

## finaly
エラーが発生しても必ずfinaly以下の処理を実行する

```python
Num = [1,2,3,4]
n = 5
n = '文字列'   

try:
    print(Num[n])
except IndexError as ie:
    print('エラー内容: {}'.format(ie))
except NameError as ne:
    print(ne)
except Exception as ex:　#IndexError、NameError以外のエラーが発生した場合
    print('エラー内容: {}'.format(ex))
finally:    #←必ず実行したい処理
    print('必ず実行される')

print('例外発生')

#出力結果
エラー内容: list indices must be integers or slices, not str
必ず実行される
例外発生
```

## raiseとpass
故意にエラーを発生させたい場合はraiseを使う

```python
try:
    raise TypeError
except:
    print('故意にエラーを発生')
```
AWS Server Migration Service

#SMS
> AWS Server Migration Service は、オンプレミスの VMware vSphere、Microsoft Hyper-V/SCVMM、または Azure 仮想マシンの AWS クラウドへの移行を自動化します。AWS SMS は、サーバー仮想マシンをクラウドホストの Amazon マシンイメージ (AMI) として段階的にレプリケートし、Amazon EC2 にデプロイします。AMI を使用すると、クラウドベースのイメージを簡単にテストして更新した上で、本番稼働環境にデプロイできます。

##Server Migration Connector をインストールする
> コネクタを VMware にインストールする
コネクタを Hyper-V にインストールする
コネクタを Azure にインストールする

##AWS SMS を使用したアプリケーションの移行
> AWS Server Migration Service ではマルチサーバーアプリケーションスタックのオンプレミスのデータセンターから Amazon EC2 への自動移行をサポートしています。サーバーの移行は 1 台のサーバーを Amazon マシンイメージ (AMI) としてレプリケートすることにより実現されます。一方、アプリケーションの移行は、アプリケーション内のすべてのサーバーを AMI としてレプリケートし、適切に起動するように調整した AWS CloudFormation テンプレートを生成します。
AWS Database Migration Service

#AWS Database Migration Service とは
> AWS Database Migration Service (AWS DMS) は、リレーショナルデータベース、データウェアハウス、NoSQL データベース、他の種類のデータストアを移行しやすくするクラウドサービスです。AWS DMS を使用して、オンプレミスのインスタンス間 (AWS クラウドセットアップを使用)、またはクラウドセットアップとオンプレミスセットアップの組み合わせの間で、AWS クラウドにデータを移行できます。

AWS DMS を使用すると、1 回限りの移行を実行でき、継続的な変更をレプリケートしてソースとターゲットの同期を維持することができます。データベースエンジンを変更する場合、AWS Schema Conversion Tool (AWS SCT) を使用してデータベーススキーマを新しいプラットフォームに変換できます。次に、AWS DMS を使用してデータを移行します。AWS DMS は AWS クラウドの一部であるため、AWS のサービスが提供するコスト効率性、市場投入の迅速化、セキュリティ、柔軟性を手に入れることができます。

##基本レベルでの AWS DMS の仕組み
> AWS DMS はレプリケーションソフトウェアを実行する AWS クラウド内のサーバーです。お客様は、ソースとターゲットの接続を作成し、抽出元とロード先を AWS DMS に指示します。その後、このサーバーで実行するタスクをスケジュールし、データを移動します。AWS DMS は、テーブルと関連付けられたプライマリキーがターゲットに存在しない場合はそれらを作成します。必要に応じて、ターゲットテーブルを手動で事前に作成することができます。または、AWS SCT を使用して、ターゲットテーブル、インデックス、ビュー、トリガーなどの一部またはすべてを作成できます。

<img width="645" alt="スクリーンショット 2020-05-31 13.43.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/128fae26-bc90-639f-70fe-c0e9e37de235.png">

##DMS と Snowball Edge を使用した大規模データ移行の概要
<img width="982" alt="スクリーンショット 2020-05-31 13.46.00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/e96c8dfa-10b5-3da9-9ae5-9e84dab515b6.png">

> Edge デバイスを使用する際、データ移行プロセスには以下のステージが含まれます。

AWS Schema Conversion Tool (AWS SCT) を使用して、データをローカルに摘出して Edge デバイスに移動します。

Edge デバイスは送付するか、または AWS にデバイスを返送します。

AWS が送付物を受け取ると、Edge デバイスは自動的にデータを Amazon S3 バケットにロードします。

AWS DMS はファイルを受け取り、データをターゲットデータストアに移行します。変更データキャプチャ (CDC) を使用している場合、これらの更新は Amazon S3 バケットに書き込まれてからターゲットデータストアに適用されます。
【Mac】自分の画面を収録して gif 化する 方法

はじめに
-

Qiitaに画像は取り入れられるのに動画を取り入れられないと言った問題に遭遇したことはありませんか？
今回はそのような問題を解決した私の事例を紹介します。
※Macユーザー限定です

gifを導入する
-
GitHubやQiita等で自分の画面の挙動を誰かに伝えたい場合に、動画で表現できると伝わりやすいですよね。そんなとき、サクサクとGif動画が作れるととても便利です。
gif化していない動画を取り込むと以下のような表示されて動画が取り入れられない事態に陥ることがあります。

```!
![undefined]()
```
1.Giftedをダウンロード
-
AppleStoreより「Gifted」を検索して下さい。
以下のものになります。
![スクリーンショット 2020-05-31 13.31.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576859/38d4bc57-0659-9e12-3b40-a195806e28c0.png)

2.command+shift+5を押す
-
そうすると以下のような画面が出てきます。
このコマンドは従来のスクリーンショットに加え、画面収録機能も付いています。
![スクリーンショット 2020-05-31 13.37.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576859/268bec4c-b35e-638c-b22e-d77b4dc2a94f.png)
3.収録したい選択範囲を指定して収録ボタンを押します
-
収録ボタンを押すことで動画の収録が開始します。
4.動画の収録が終わったら
-
command+shift+5を押します。
そうすることで再び以下のような画面が表示されます
![スクリーンショット 2020-05-31 13.41.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576859/fd267fed-143f-754a-beae-e9e6c78f8a50.png)
5.取り組むボタンを押す
-
取り組むボタンを押すことで動画の収録完了です。
6.gif化する
-
1でダウンロードしたGiftedを開きます。
開くと以下のような画面が出てきます。
![スクリーンショット 2020-05-31 13.43.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576859/557fcd95-ff7c-3676-9ba6-7ad26f650f8e.png)

この画面に先ほど撮影した動画をドロップしてStartを押すだけで変換されます。
変換された動画はピクチャ>Gifted内に保存されるようになっています。
Rails で HTML と JSON フォーマットを両方返す方法

# はじめに

タイトルの通りですが、久しぶりに Rails アプリケーションを実装したので備忘録です。

あと、こうやって共有すると、記憶にグッと入りますよね。笑

ちょっと最近の雑感ですが、動くコードをそのまま貼りたいというのがあって、Qiita で投稿されている記事なんかも頻繁に参考にさせて頂いていますが、**動作しない**という事態によく遭遇します。

ですので、動作環境と実装に必要なコードをファイルパス付で（ここ結構大事だと思っている）書いていく習慣を付けていこうと思っています。

# 動作確認環境

- OS
    - Ubuntu 18.04 LTS
- 仮想環境
    - Docker 19.03.8
- Rails
    - Rails 6.0.3.1

# やりたかったこと

- Rails で一通りの CRUD アプリケーションを実装後に、フロントエンドの JavaScript SDK を作成し、連携させたい
- そのために、エンドポイントによって、レスポンスボディを HTML と JSON で分けたかった

# コード

```ruby:app/controllers/articles_controller.rb
class ArticlesController < ApplicationController

  def index
    @articles = Article.all
    respond_to do |format|
      format.html 
      format.json { render json: @articles }
    end
  end
end
```

# 実行結果

- HTML
![2020-05-31_13h40_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191117/4ed3c1b3-788e-b960-6762-c21d20062877.png)

- JSON
![2020-05-31_13h40_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191117/31b3150a-4da9-c2de-3266-99bf1cc458bc.png)

# 終わりに

今回は、非常に簡単な事例ですが、なんらかお役に立てれたら幸いです。

さて、いよいよフロントアプリケーション（ember.js とか ActiveResource.js）とインテグレーションをしてみようかと思います。

# 参考（感謝）
- [JSON形式のデータを返却する方法とは？](https://pikawaka.com/rails/json)
- [Rails: respond_to JSON and HTML](https://stackoverflow.com/questions/20188047/rails-respond-to-json-and-html)
Julia言語で楕円曲線を描いて、画像出力してみる

#Juliaで楕円曲線を描いて画像出力

##JuliaのパーケージPlotsを紹介
Atomを起動して次のように書く。

```Julia
using Plots
gr()
using ImplicitEquations
a = -1
b = 1
f(x,y) = y^2 - x^3 - a * x - b
plot(f ⩵ 0, aspect_ratio=:equal)

savefig("Elliptic curve.png")
```
Atomで実行してみる。

<img width="1032" alt="スクリーンショット 2020-05-31 13.40.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443312/3bdf4a4a-d67d-bce8-6081-bee762a1883a.png">

出来上がり！
コメントを外すとsavefigで画像ファイルとして保存されます。
【自動化】Pythonでクリップボードを操作してExcelに表を貼り付ける

## クリップボードを操作したい

>クリップボード（英: clipboard）は、コンピュータ上で、一時的にデータを保存できる共有のメモリ領域のことである。
(Wikipediaより)

Pythonでクリップボードを操作したいときなんてあるの？と思われるかもしれません。

例えばこんな状況を考えてみてください。

Pythonで処理したdataframe(表テーブル)をExcelに貼り付けたい。  
このExcelファイルが自分のパソコンの中にあるのなら、Pythonでそのファイルに直接書き込めばいいわけですが、そのファイルは社内のサーバー上にあって**Pythonから直接アクセスすることが難しい…。**  

こんな状況ならば、dataframeを**一旦、クリップボードにコピーしておいて、手動で該当のExcelファイルを開いて貼り付ければ便利**ですよね。


## pyperclipでクリップボードを操作

クリップボードにコピーしたり、クリップボードから貼り付けるには**pyperclip**というモジュールを使います。

このpyperclipはとてもシンプルで、`pyperclip.copy()`と`pyperclip.paste()`がほぼすべてです。  

![pyperclip.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/6889ea80-94fb-77eb-a387-2e74371c1be7.png)

|  操作  |  関数  |
| ---- | ---- |
|  クリップボードへコピー  |  pyperclip.copy()  |
|  クリップボードから貼り付け  |  pyperclip.paste()  |

## Excelに表形式で貼り付けるためのクリップボードの作り方

例えばExcelの中の表をコピーして、Excelの中の別の場所に貼り付けるとちゃんと表になっています。

当たり前かもしれませんが、少し不思議な気がしませんか？  
クリップボードではこの「表形式」をどのように保持しているのでしょうか？

確認してみましょう。
下のようなExcelの表があります。

![pyperclip_excel_before.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/2a304dcb-0dde-ce72-a93e-088bcb760a2e.png)

この表のA1～E6までをCrtl+Cでクリップボードにコピーします。
そして、次はPythonで次のように実行してクリップボードの中身を確認してみます。

```python
import pyperclip

pyperclip.paste()
```

```:実行結果

'大井竹雄\tオオイタケオ\t男\t1960/8/30\t千葉県\r\n長井恵子\tナガイケイコ\t女\t1999/5/21\t高知県\r\n茂木美香\tモギミカ\t女\t1989/3/27\t埼玉県\r\n那須貴子\tナスタカコ\t女\t1981/9/29\t広島県\r\n杉浦昭一\tスギウラショウイチ\t男\t1991/10/31\t兵庫県\r\n'
```

隣の列とは**タブ(\t)**で、隣の行とは**改行コード(\r\n)**で区切られているのがわかりますね。

![clipboard2excel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/5cc37be6-caa2-3ae9-674c-3220520ef75d.png)


つまり、このようにタブ(\t)と改行コード(\r\n)で区切った文字列を作って`pyperclip.copy()`でクリップボードにコピーしてあげれば、あとはCtrl+VでExcelに表形式で貼り付けることができるというわけです。

やってみましょう。

下のように実行して貼り付けたい文字列をクリップボードにコピーしておきます。

```python
pyperclip.copy("佐々木茂\tササキシゲル\t男\t1964/2/13\t和歌山県\r\n三田かなえ\tミタカナエ\t女\t1979/10/1\t秋田県\r\n")
```

そしてExcelを開き、貼り付けてみると…
![pyperclip_excel_after.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634673/60803ff4-a540-6d70-966f-9c649312afda.png)

ちゃんと表として貼り付けることができましたね！
Pythonの引数についてまとめ

# はじめに
pythonの引数ですが、位置引数とキーワード引数、キーワードオンリー引数
\*, **を使った複数引数の取得など混乱してきたので整理しました。

# 位置引数
関数名()の中にカンマ区切りで入れます。呼び出し側で渡された順に引数に渡されます。

```
def f(a, b):
  return a, b
f(1, 2)
=======================
(1, 2)
```
# 引数を指定して代入する(キーワード引数)
a=1のように渡す引数をキーワード引数と呼びます。渡す順序が関係なくなります。

```
def f(a, b):
  return a, b
f(b=2, a=1)
=======================
(1, 2)
```
キーワード引数の後に位置引数を渡すことは出来ません。

```
def f(a, b):
  return a, b
f(b=2, 1)
=======================
SyntaxError: positional argument follows keyword argument
```

# \*, **を使って可変長の引数をtupleやdictとして受け取る
*を使うと可変長の引数がtupleとして渡せます。

```
def f(a, b, *c):
  return a, b, c
f(1, 2, 3, 4)
=======================
(1, 2, (3, 4))
```
**を使うと可変長のキーワード引数がdictとして渡せます。

```
def f(a, b, **c):
  return a, b, c
f(1, 2, x=3, y=4)
=======================
(1, 2, {'x': 3, 'y': 4})
```
\*を使った引数の後に位置引数は代入できません。

```
def f(a, *b, c):
  return a, b, c
f(1, 2, 3, 4)
=======================
TypeError: f() missing 1 required keyword-only argument: 'c'
```
**の後は位置引数もキーワード引数も代入出来ないようです。

```
def f(a, **b, c):
  return a, b, c
f(1, x=2, y=3, c=4)
=======================
SyntaxError: invalid syntax
```
# キーワードオンリー引数
Python3からキーワードオンリー引数が指定できるようになりました。
先頭に*つきの引数の後に来る引数は、キーワード引数としてのみ代入できます。
下記ですと、cは位置引数ではなくキーワード引数として代入する必要があります。

```
def f(a, *b, c):
  return a, b, c
f(1, 2, 3, c=4)
=======================
(1, (2, 3), 4)
```
可変長の位置引数を使用しない場合は*単体で指定すると、それ以降の引数がキーワードオンリー引数になります。

```
def f(a, *, b):
  return a, b
f(1, 2)
=======================
TypeError: f() takes 1 positional argument but 2 were given
```
```
def f(a, *, b):
  return a, b
f(1, b=2)
=======================
(1, 2)
```
# 位置専用引数
コメントにて教えていただきましたが、位置専用引数もあるようです。
https://docs.python.org/ja/3/tutorial/controlflow.html#positional-only-parameters

```
def f(x, y):
  print(x, y)
f(y=456, x=123)
============================
123 456

def f(x, y, /):
  print(x, y)
f(y=456, x=123)
============================
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() got some positional-only arguments passed as keyword arguments: 'x, y'

f(x=123, y=456)
============================
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: f() got some positional-only arguments passed as keyword arguments: 'x, y'

f(123, 456)
============================
123 456
```
他の方から指摘を受けると、恥ずかしいのもあっていい勉強になるかもしれないと思った今日この頃。
【Mac容量拡張カード】Transcendレビュー：あまり意味なかった。

#こんな人に読んで欲しい
・Macを買ったんだけどストレージが足りなくなってきた人
#著者のPC環境 & PC使用用途
###PC使用用途
UintyというエンジンでゲームやXRの開発をしています。
写真や動画はUSBに移動している（基本写真を取り込まない）ので、実際に使用しているストレージのほとんどはゲーム開発に付随する資料です。
###PC環境
約4年前に購入したMacBookAirです。
結構長持ちしています。
![スクリーンショット 2020-05-31 12.38.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/4f927683-c6cc-6afc-2906-11229a5fbaf7.png)
#容量が足りなくて困っていた
下の画像のように残りストレージがほとんどない状態でした。
※下の画像は拡張ツールを購入したあとにとったので、昔の写真を思い出して加工しています。
![パワポ 容量残り.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/d191bdd3-f27b-cbe0-fe8d-9f67a1a8a0fe.png)
#今回購入したもの
Transcend Macbook Air 専用SDスロット対応拡張メモリーカード256GB
www.amazon.co.jp/dp/B00WGARJIS
価格は6000円ほどだったと思います。アマゾンで購入しました。
![S__38600706.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/16d43c99-d602-13fa-02cf-1130ce30c68c.jpeg)
#使用した感想
ぶっちゃけあんまりつかえない、、、、。
自身のPCにアタッチするとこんな感じになります。
え！ストレージ減ってるじゃん！と思われるかもしれませんが。
別の方法で容量を減らしました。笑
![スクリーンショット 2020-05-31 12.54.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/70e364a0-315b-6812-707d-f48c5d3a0d07.png)
###イメージ的にはUSBのずっとつけれるバージョン
良かったところ
USBより使い勝手がいい！
USBは16GBとかでPCにつけるとでっぱってしまうので使用するときだけつけるイメージ。
なにより、どのUSBになにをいれていたのかを忘れてしまう、、。
でも、このカードならでっぱらなくてずっとPCに入れてられるので便利です！
下の画像のMacOS...が拡張メモリです。
Finderにはずっとこうやって表示されていて、好きな時にファイルを閲覧可能です。
ワードの文書とかならいいかも！
![スクリーンショット 2020-05-31 13.04.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/c7bf4089-8802-72d1-8d65-fc6520e3df5b.png)

#よくなかったところ（Unityを使用している人はあまりつかえない！？)
下の画像はUnityHubの写真です。
Unityのプロジェクトを開くためにはここにプロジェクトを表示させないといけません。
でも、拡張メモリ上にあるUnityファイルはここに表示されません。
一度、自身のPCに落とさないといけないのです。
確かに一時的に容量を削減できるのですがこれでは、根本的な解決にはなりません！
![スクリーンショット 2020-05-31 13.06.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/0b51fa20-a99f-78fd-9989-3b0ef248b356.png)

#結論なにがいいか（私は解決策２を実行しました）
（１）ストレージが多いPCの再購入を検討する
いわずもがな、新しいPCを購入すれば問題はないのです。
でも、高い！いまのPCも全然使える！これは10年後に、、、。

（２）不要なファイルを削減するソフトを購入する
私の場合はCleanMyMacを購入しました。
https://macpaw.com/ja
月額課金と一括購入プランがあり、私は6000円で一括購入をしました。

正直これは便利すぎました！！
これ使った瞬間に30GBくらい削減できました。
気づかないうちに不要なファイルとかがたまっていたらしいです。

もちろんこれを購入する前に、セーフブートを5回はしましたし、googleに出回っている情報の全てを実践しました。

それでもまだそんなに削減できるとは、優秀すぎる。

![スクリーンショット 2020-05-31 13.12.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/ffaed9af-2433-b32b-ff46-15fd4d735d5a.png)

#まとめ
上記の削減ソフトを使用することをおすすめします。
参考までに私が使用しているPCの内部を公開します！
![スクリーンショット 2020-05-31 13.20.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/1406812b-7480-d466-c32e-e3a7e1491aa5.png)
みての通り、xcode、unityなどのゲーム開発（プログラミング）に必要なアプリが容量をいっぱいくってます、、、。
![スクリーンショット 2020-05-31 13.20.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631096/c9aabe93-1f2a-b5e5-65b6-4ce418410a1b.png)

私の場合、同時進行で開発するファイルは4-5個ほどなのでいまのところはなんとかなっています！
もっと本格的に開発をしなければならなくなった時はあたらしいPCの購入を検討します！

当時Macを購入した時の私は大学生でまさかこんなにもPCを酷使するとは思っていなかったので、RAM：8GB、ストレージ128GBを購入しました。

今考えると8GBにしておいて本当によかった、、、。
欲を言うなら256GBにしておいて欲しかった、、、。

大学生として使用するには十分すぎるスペックだと思うので
この記事は動画編集やエンジニアの方オンリーで参考にしていただければと思います！

不要なファイル削除と言う観点からするとどんな人でも当てはまると思いますが！

以上！！