OmniAICreator/Qiita-1.07M huggingface dataset:
TOEICの世界の住人

#はじめに
エンジニアとして英語の知識も必要ですよね。
その一環としてTOEICの[出る単特急 金のフレーズ](https://amzn.to/356but4)で英単語の勉強をしていて
解説欄に記載されている**TOEICの世界**の説明が秀逸すぎたので一部紹介させてください。

やばい世界が広がっています。

#生活編
### ・ 配送の際、商品の破損や、色・サイズ違い、誤配、配送漏れ、配送遅れなど、ありとあらゆるトラブルが発生する
### ・ 病院の受付からの電話の多くはアポの変更依頼である。「先生が学会に参加するので都合が悪くなった」と言った身勝手な理由に対しても、患者が激怒することは決してない
### ・ しばしばイベントが人気で定員オーバーになり会場が変更されるが、人気がなくてキャンセルになったり、会場が小さくなることはない
### ・ 博物館や美術館のガイド付きツアーが頻繁に行われ、歩合給制なのか、ガイドはギフトショップでお土産を買うようツアー客に必ず促す
### ・ 奨学金の返済で苦しむ人は存在しない
### ・ 整備不良または天候不良が原因でフライトが遅れるのは当たり前で、むしろ予定通りに飛ぶ方が珍しい
### ・ ワインやビールと言ったアルコール飲料は存在せず、住人はソフトドリンクしか飲まない
### ・ しばしば駐車違反をしないよう呼びかけが行われるが、実際に反則切符を切られた人は存在しない
### ・ 公共料金や家賃を滞納する賃借人はいない
### ・ 登場人物のスケジュール管理がかなり適当なため、妹の結婚式の日にバスケットの試合のチケットを取るといったありえないダブルブッキングがしばしば発生する
### ・ 台所の水漏れや、車や工場のオイル漏れ、といった事故は多発するが、情報を漏らす人はいない
### ・ ゴーストタウンのように朽ち果てた街は存在せず、どの町も栄えている
### ・ 複雑な病名や、生死にかかわる病気は存在しない。あるのは「風邪」「発熱」「運動不足」程度である
### ・ 喫煙者は存在しないので、禁煙席か喫煙席かを尋ねられることはない
#ビジネス編
### ・ 事務アシスタントの求人でも、「大卒、高いPCスキル、最低3年の実務経験、優れたコミュニケーション能力」といった厳しい条件が求められる
### ・ ブラック企業は存在せず、福利厚生がしっかりした会社ばかり
### ・ 著者全員が成功を収め、作品を酷評するレビューは絶対に掲載されない
### ・ 商品に不備があった場合、泣き寝入りする顧客はいない
### ・ 顧客に無断で割高の速達でバンバン商品を送り、クレームが多発した通販会社が存在する
### ・ 「医師」が登場すると、アポや講演スケジュールの「予定変更」を伴うケースが多い
### ・ 法律に違反する人は存在しないが、法律事務所は存在する
### ・ 航空会社は、フライトの遅れやキャンセルに対して、クーポンの大盤振る舞いという、ありえない対応をしばしば取る
### ・ 店は世界不況でも常に商売繁盛。売上不振に苦悩する店主は登場しない
### ・ 会議室に来るまで、会議スケジュールや場所の変更に気づかないのんきな社員がしばしば登場する
### ・ 昇進はあっても降格はない
### ・ 時折、信じられない部品の発注ミスが起きるが、担当者は悪びれた様子もなく明るく対応する
### ・ TOEICの世界には、複雑な計算が存在しない
### ・ 社員はたいてい会社や上司の期待を超える成果を出す
### ・ 職場の人間関係で悩む人はいない
### ・ サービス残業はなく、ちゃんと働いた分の残業代が出たり有給休暇が増えたりする
### ・ 困難に直面するとすぐに投げ出したりあきらめたりする会社や個人は存在しない
### ・ 平日に社内ピクニックを開催し、顧客からの電話に留守電対応する会社が存在する
### ・ 特許や著作権をめぐる裁判沙汰は決して起きない
### ・ チャレンジングな仕事に挑む意欲ある社員しか存在しない
### ・ 部下の欠点を責めたてる上司は存在しない
### ・ 国際基準を満たすため、不正を行う会社は存在しない
### ・ 製品は極限状況でも耐えらえる品質でなくてはならない
### ・ フライトやイベントの予約を間際になって変更するケースが多発するが、それに文句を言う旅行代理店の担当者やアシスタントはいない
### ・ 職歴や学歴の必要条件は厳しいが、TOEICのスコアが求められることはない
### ・ 些細な問題に対してもすぐに委員会が結成される

# 終わりに
いかがでしたでしょうか。ユーモアな説明があるとかなり覚えやすいです。
記載していないTOEICの世界あるあるは他にもたくさんあるのでぜひ読んでみてください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/239829/8a73ebd0-dcfb-1dd3-a411-5b6febf219ba.jpeg" width=30%>
[TOEIC L & R TEST 出る単特急 金のフレーズ (TOEIC TEST 特急シリーズ)](https://amzn.to/356but4)
【AtCoder】プログラミング初心者の文系大学(院)生が茶色になるまでにしたこと

#はじめに
文系大学(院)生が茶色になるまでの約半年間したことの備忘録のようなものです。

技術関連の話というより、ただやったことや考えたことを好きなように語っています。
プログラミング初心者でAtCoderを始めたいという方はもしかしたら役に立つかもしれないです。

#目次
#####・筆者のステータス
　・AtCoderを始めた時点でのステータス
　・競プロを始めた経緯

#####・茶色になるまでの過程で重要だったと思うこと３点
　・たくさんコンテストに出る(問題を解く)
　・分からなければ一旦諦める
　・情報収集

#####・茶色になって思うこと

#筆者のステータス
####▼AtCoderを始めた時点(2019年10月)でのステータス
#####・心理学部の大学生(B4)
現在は文系の院生(M1)です。
もちろん数Ⅲはやってませんし、高校数学は大学生活の中で忘却しました。

#####・プログラミング経験ほぼなし
AtCoderを始めるまでプログラミングの経験はほぼありませんでした。
(大学でプログラミングの授業もありましたが、ギリギリ単位を取れた記憶しかない)

#####・趣味の謎解き
謎解きはAtCoderの問題を解く感覚と似ており、問題を解くことが楽しく感じられたと思います。

####▼競プロを始めた経緯
pythonでのデータ分析に興味を持つ
↓
前段階としてpythonでコードを書く練習がしたい
↓
練習になるものとして競プロ(AtCoder)を勧められて始める

#茶色になるまでの過程で重要だったと思うこと３点

###1. たくさんコンテストに出る(問題を解く)

当たり前ですが、レーティングを上げるにはコンテストに出る必要があります。
はじめのうち(10回参加するまで？)は本来の実力より低いレーティングが出る可能性が高いです。
つまり、より多くのコンテストに出ることがレーティングを上げる近道になります。

とはいっても、学校のテストと同じで問題の傾向や解き方が分からなければコンテストで問題を解けません。
私の場合は、A問とB問を全部解いたり、[AtCoder Problems](https://kenkoooo.com/atcoder/)のバチャコン(あさかつとよるかつ)に毎日参加したりして傾向と解き方を学びました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627622/d693b65d-051c-8192-80ff-ff6a73521e9a.png)
[AtCoder Scores -精進グラフ](https://atcoder-scores.herokuapp.com/graph)
コンテストでのレーティングが太い線、精進が細い線で示されています。
精進した(問題を解いた)分だけ、レーティングも上がっている気がします。


###2. 分からなければ一旦諦める
コンテスト以外で分からない問題にぶつかった場合、30分かけてもACできないなら諦めることも重要だと思います。

私自身負けず嫌いなので、始めはひたすら考えて頑なに解説も他の人のコードも見ませんでした。
しかし、これではものすごく時間がかかってしまいます。

始めのうちは解説や他の人のコードを見て解き方を学び、類題や同じ問題と遭遇したときにACできれば良いと思います。

(たまに「なんでこんな簡単なことに時間をかけて考えていたのか」とダメージを受ける問題もあるので、しばらく考えて分からないときは潔く解説等を確認していました)

###3. 情報収集

twitterで競プロが強い方々をフォローしておくと、プログラミングの知識を得られたり、コンテストに関する情報を早く知れたりします。
(あと、同じくらいのレーティングの人をフォローしておくとモチベーションが上がります)

また、○色になるためにどのようなことをすれば良いか書いている記事やアルゴリズムに関する記事には大変お世話になりました。

>[レッドコーダーが教える、競プロ・AtCoder上達のガイドライン](https://qiita.com/e869120/items/f1c6f98364d1443148b3)

→着色するために何をすれば良いのか明確になりました。

>[けんちょんさん -Qiita](https://qiita.com/drken)

→とてもわかりやすいアルゴリズムの記事を書かれている方。いつもお世話になっています。

#茶色になって思うこと
本当にこの半年間長かったです。
私より後に始めた人が先に着色したり、コンテストの参加人数が増えて順位が下がったりしてショックを受けることもありました。

でも、茶色になれて嬉しいし、競プロ楽しい。
競プロで今まで関わることのなかったすごい人達と戦えて、世界が広がった気がします。

とりあえず、次は緑色になれるように頑張ります……。
iPadでもField Testを開ける

「ショートカット」アプリからFTMInternal-4を指定するとiPadでもField Testが開ける

# 背景・課題

楽天モバイル(MNO)は、**自社(楽天)回線であれば**、データ使用量が**無制限(10GB/day)**であるRakuten UN-LIMITプランを提供しています。

**iPhoneであれば**、`*3001#12345#*`ダイアルして**Field Testを開けば**、パートナー(au)回線であるか自社回線であるかを**判別できる**ことが知られています。一方、**iPadは**、データ通信専用であるため、そもそも**ダイアルが不可能**です。

そのため、回線を判別するには、ダイアルを迂回してField Testを開く必要があります。

# 手法
**脱獄不要**。iOS標準で同梱される**「ショートカット」アプリのみ**を使います。

▼次のショートカットを使用します。
https://www.icloud.com/shortcuts/dbf53f0c94f44ec09d5f0ab150f6e9e3

単に、アプリは存在するので直に指定すれば開けるということっぽいです。

※もしリンク切れ等あったら、「FTMInternal-4 shortcut」と検索して探せば出てくると思います。

# 結論

iOSに搭載されているアプリ「ショートカット」から、直接FTMInternal-4を指定することで、iPadでもField Testを開くことができます。なお、筆者はband 18のau回線で無制限対象外でした。

![2E697936-13DD-4A2A-9FA3-5E2EEF113DB3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627793/cae18774-1009-86c3-2d42-3a9e8b7fbfec.png)
PHP 値のハッシュ化を行う

# 目的

- PHPにて任意の値のハッシュ化を行う方法をまとめる

# 実施環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.3) |
| ハードウェア | MacBook Pro (16-inch ,2019) |
| プロセッサ | 2.6 GHz 6コアIntel Core i7 |
| メモリ | 16 GB 2667 MHz DDR4 |
| グラフィックス | AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.3 | Homwbrewを用いて導入 |
| Laravel バージョン | 7.0.8 | commposerを用いて導入 |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いて導入 |

- 上記環境にてLaravelアプリを作成し、そのアプリ名ディレクトリでコマンド`$ php artisan tinker`を実行し動作を確認した。
    - Laravelの環境構築を行いたい方はこちら→[Mac Laravelの環境構築を行う](https://qiita.com/miriwo/items/adaaaeecae69d6392e08)

# ハッシュ化のアルゴリズム

- 下記を参考に簡単に表にまとめる。
    - [password_hash](https://www.php.net/manual/ja/function.password-hash.php)
    - [定義済み定数](https://www.php.net/manual/ja/password.constants.php)

| アルゴリズム名 | 情報 | オプション(※の後は備考) |
| --- | --- | --- | --- |
| PASSWORD_BCRYPT | CRYPT_BLOWFISH アルゴリズムでパスワードハッシュを作成 | salt (文字列) パスワードのハッシュに使うソルトを手動で設定する。<br>cost (コスト数) 利用するアルゴリズムのコストを表す。コスト数は数値で指定する。 |
| PASSWORD_ARGON2I | Argon2i アルゴリズムでパスワードハッシュを作成 | memory_cost (メモリバイト数) ハッシュ計算に用いるメモリ最大値 (バイト数)を指定する<br>time_cost (数値) ハッシュ計算にかける時間の最大値を設定する。<br>threads (数値) ハッシュ計算に用いるスレッド数を設定する。<br>※PHP 7.2.0以降で使用可能 |
| PASSWORD_ARGON2ID | Argon2id アルゴリズムでパスワードハッシュを作成 |PASSWORD_ARGON2_DEFAULT_MEMORY_COST (数値) ハッシュ計算に用いるメモリのデフォルト値を設定する。<br>PASSWORD_ARGON2_DEFAULT_TIME_COST (数値) ハッシュ計算にかける時間のデフォルト値を設定する。<br>PASSWORD_ARGON2_DEFAULT_THREADS (数値) ハッシュ計算にかけるスレットのデフォルト値を設定する。<br>※PHP 7.2.0以降で使用可能 |
| PASSWORD_DEFAULT | 当該PHPのバージョンにて最も強力なハッシュアルゴリズムを使用してパスワードハッシュを作成する | ※PHPのバージョンアップにてハッシュアルゴリズムが変更になる可能性がある。<br>ハッシュの長さが変わる可能性がある為、ハッシュの格納先は２５５文字程度まで格納可能に設定しておくと良い |

# 記載例

- 下記にハッシュ化を行う際の記載例を書く。

    ```php
    password_hash(ハッシュ化したい文字列, ハッシュ化する再に用いるアルゴリズム, アルゴリズムのオプション);
    ```
- 文字列「test」という文字列をハッシュ化したい時は下記のように記載する。

    ```php 
    password_hash('test', ハッシュ化する再に用いるアルゴリズム);
    ```
- 変数「$str」に格納されている値をハッシュ化したい時は下記のように記載する。

    ```php
    password_hash($str, ハッシュ化する再に用いるアルゴリズム);
    ```

# 具体例

- 下記のブラウザサービスで具体例のコードをお試し実行することができる。
    - [https://paiza.io/ja/projects/new](https://paiza.io/ja/projects/new)

1. 文字列「test」をアルゴリズム「PASSWORD_BCRYPT」でハッシュ化するときは下記のように記載する。

    ```php
    password_hash('test', PASSWORD_BCRYPT);
    ```
1. 変数「$str」に格納された文字列をアルゴリズム「PASSWORD_ARGON2I」でハッシュ化するときは下記のように記載する。

    ```php 
    password_hash($str, PASSWORD_ARGON2I);
    ```
1. 変数「$str」に格納された文字列をアルゴリズム「PASSWORD_DEFAULT」でハッシュ化するときは下記のように記載する。

    ```php
    password_hash($str, PASSWORD_DEFAULT);
    ```
Symfonyの構造　Profiler: Your Debugging Best Friend

デバッグのためのツールをインストールします。

##profilerのインストール
```terminal
composer require profiler --dev
```
devコマンドは本番環境に必要ない場合につけます。

これで、フッダーの部分に、デバックバーが表示されるようになります。

##dump()を使ってみる
ページ上部にデバッグ情報の表示がされるようになります。

```src/Controller/QuestionController.php
<?php

namespace App\Controller;

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class QuestionController extends AbstractController
{

    /**
     * @Route("/")
     */
    public function homepage()
    {
        return new Response('Hello World');
    }

    /**
     * @Route("/question/{slug}")
     */
    public function show($slug)
    {

        // デバッグのための関数
        dump($slug, $this);

        $answers = [
            'Make sure your cat is sitting purrrfectly still 🤣',
            'Honestly, I like furry shoes better than MY cat',
            'Maybe... try saying the spell backwards?',
        ];

        return $this->render('question/show.html.twig', [
            'question' => ucwords(str_replace('-', ' ', $slug)),
            'answers' => $answers,
        ]);
    }
}
```





##参考
[Profiler: Your Debugging Best Friend > Charming Development in Symfony 5 | SymfonyCasts](https://symfonycasts.com/screencast/symfony/profiler#play)
[systemd] suspendするとfancontrolが働かなくなる問題の対処法

# 環境
Linux Ubuntu bionic xfce


# はじめに
ファンを制御してくれるfancontrolですがsuspendするとなぜだか設定がリセットされてしまう症状が起こりました。解決策を次に示します。

# 解決法

## その①　復帰後に実行するシェルを作成
`systemd`の`system-sleep`配下にsuspendから復帰したときの動作を指定するシェルを作成します。(名前は何でも良いです。)

```sh:/lib/systemd/system-sleep/fancontrol-restart
#!/bin/bash
case "$1" in
post)
  exec service fancontrol restart;;
esac
```

# その② リスタート用のサービスを作成
suspend.targetが起動した後に`systemctl`を実行するサービスを作成する

```:/lib/systemd/system/restart-systemd
[Unit]
Description=restart systemctl
After=suspend.target
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl restart fancontrol
[Install]
WantedBy=suspend.target
```
Rails 基礎　まとめ

# はじめに
railsの基礎中の基礎を簡単にまとめました。
どんどん、追記していきます。

# 基本コマンド
**Railsアプリの作成**

```ruby
rails new [application name] 
```

**サーバーの立ち上げ**

```ruby
 rails server
```

**トップページの生成**

```ruby
 rails generate controller home top
```

**マイグレーションファイル（データベースに変更を指示するファイル）の生成**

```
 rails generate model [テーブル名（単数形）] [カラム名]:[データ型]
```


### ページ作成に必要な要素
## view
ページの見た目部分を作るためのhtmlファイル。ページを表示するために、ブラウザとrails間で、railsはviewを返している。

## controller
ページ表示の際、controllerは
ブラウザに返すビューをviewsフォルダから探して、viewをブラウザに返している。

して、ブラウザに返す。

**流れ**
1. ブラウザのurlからhtmlファイルをコントローラに要求
2. controllerと同名のviewsフォルダから、アクションと同名のhtmlファイルを探す
3. htmlファイルをブラウザに返して、ページを表示


* アクション：controller内のメソッド

**コントローラの生成**

```
 rails generate controller [コントローラ名] [アクション名]
```

# router
ページの表示は、router → controller → view の流れ。

ルーティングがurlを見て、コントローラのアクションを呼び出す。

* ルーティング：urlに対して、どのコントローラのどのアクションで処理するかを決める対応表。

config/routes.rbファイルに、

```
get "[URL]" => "コントローラ名"#"アクション名"
```
[AWS] 一括請求を使用している場合のリザーブドインスタンス共有事例

前回は [一括請求の場合には無料枠がアカウント単位に設定されていない](https://qiita.com/VA_nakatsu/items/35c71a5a40aad2e135be) という記事を書いたので、今回は一括請求本来のメリットについて一件投稿します。

[ドキュメント](https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/consolidated-billing.html) より
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/0ccbc566-954a-e918-1a51-793febf2d35e.png)

要はボリュームディスカウントのメリットが得られる、リザーブドインスタンスが共有されるのでメリットの方が多いですよという話です。以降はリザーブドインスタンスの共有事例です。

# DynamoDBの利用料が値引きされていたのに、値上げと勘違いした話

一括請求でAWSアカウントを利用する場合、多くは請求担当部署とはやりとりがあるが、その他のアカウントの情報は知り得ないことが多いと思います。

その場合、以下のように2つの部署の利用状況によって、勘違いする事例がありました。

- 自分の部署(部署A)でDynamoDBを使い始め、毎月一定量を使っていた。
- 他の部署(部署B)で、DynamoDBのリザーブドインスタンスを買ったのだが、最初は使用しなかった。
- 自分の部署(部署A)にそれが知らない間に適用されて、初月がリザーブドインスタンス価格になっていた。
- 他の部署(部署B)が利用を開始すると、リザーブドインスタンスが適用されなくなり、値上げと勘違いした。

テキストでは分かりづらいと思うので図にするとこのような状況です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172826/013b1d8b-7bef-a819-1b6c-1245ec54064d.png)

図では金額を分かりやすくしていますが、実際は [ブレンドレート](http://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/con-bill-blended-rates.html#Blended_CB) によって決まるので、自分の消費キャパシティーユニット(CU)が同じでも、全体の消費CUによって価格が増減することもありました。

全体を見ると、1アカウントで契約する場合よりは値引になっているわけですが、最初は少し心配になりますね。一括請求担当の方やAWSサポートに問い合わせしつつ、状況を理解する必要があります。

# 参考資料
- [一括請求のドキュメント](https://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/consolidated-billing.html)
- [ブレンドレート](http://docs.aws.amazon.com/ja_jp/awsaccountbilling/latest/aboutv2/con-bill-blended-rates.html#Blended_CB)
s3fsでS3をファイルサーバとして利用する

S3をWindows Serverでストレージ（共有フォルダ）として利用してみる。

今だと、要件にもよるがWindows Serverならば
「Amazon FSx for Windows File Server」がありますし、
Linuxならば「Amazon EFS」があるので利用機会は少ないのかなと思っています。
※AWS利用の場合です。
以前使う機会があったので備忘のため残しておく。

・s3fs
https://github.com/s3fs-fuse/s3fs-fuse

・Amazon FSx
https://aws.amazon.com/jp/fsx/

## 前提
Amazon Linux2
Windows Server2019

利用するソフトウェア
- s3fs
- samba

## 手順

### 1. S3バケットを作成する
s3バケットを作成します。すでに作成済であればそちらを利用でも構いません。
![aws-s3-bucket-create.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482423/71105c07-af5e-0700-00a0-0a7227aa8011.png)


バケット作成後、予め動作確認用のファイルをアップしておきます。
今回は、sample.txtをアップしておきました。


### 2. IAM Roleを作成する
「AmazonS3FullAccess」,「AmazonEC2RoleforSSM」
をアタッチしたRoleを作成します。

※
AmazonEC2RoleforSSMは、SSHではなくセッションマネージャーでサーバにログインするため。
SSHを利用する場合は不要。

### 3. Amazon Linux2をデプロイする
最新のAMIからインスタンスを作成する。

※
7で作成するインスタンスからの通信を許可する必要がある。
セキュリティグループ（インバウンド）で下記のように設定する。
port:137, 138 UDP
port:139, 445 TCP
Windows ServerのプライベートIPを指定する。

### 4. s3fsをインストールする
```
sudo yum update
sudo amazon-linux-extras install epel
sudo yum install s3fs-fuse
```

```
sudo s3fs --version

sh-4.2$ s3fs --version
Amazon Simple Storage Service File System V1.86 (commit:unknown) with OpenSSL
Copyright (C) 2010 Randy Rizun <rrizun@gmail.com>
License GPL2: GNU GPL version 2 <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.`
```

### 5. s3fsでS3をマウント
```
sudo mkdir /mnt/s3fs-bucket
```

## 自動マウント設定
```
# fstabに登録
echo "s3fsbucket-tri /mnt/s3fs-bucket fuse.s3fs _netdev,iam_role=auto,allow_other 0 0" | sudo tee -a /etc/fstab

# 追記できていることを確認
cat /etc/fstab

# mountを実行
sudo mount -a

# mountを確認
df -h
```

![mounts3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482423/9ea71022-5368-d301-c86e-4a4b1055d62e.png)

```
ls -la /mnt/s3fs-bucket

# ファイルが作成できるか試す。
sudo touch sample2.txt
```
![sample2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482423/802412ec-f40a-6360-d455-7706ef7d9f88.png)


### 6. sambaインストール&設定
```
sudo yum install samba

sambaユーザを作成する
sudo smbpasswd -a root

下記を追加する
sudo vi /etc/samba/smb.conf

[s3files]
       path = /mnt/s3fs-bucket
        public = yes
        writable = yes
        printable = no
        sudo systemctl start smb
```

### 7. Windows Server2019をデプロイする
最新のAMIからインスタンスを起動する。
※IAM Roleは不要。

### 8. Windows Serverで共有フォルダをアタッチする。
エクスプローラーで　¥¥LinuxのプライペートIPを入力

![share-folder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482423/f82f3a4e-8bcc-0bdd-9d73-5eb307872248.png)
びっくり。PHPでの文字列の連結でダブルクオーテーションを使うと...

##この記事を書いた理由
現在、PHP教材を執筆していて初めて知ったことがあったので残しておこうと思います。

##PHPでの文字列＋変数の出力について
例えば、変数`$name`に`"yamada"`という文字列を代入して`Hello!yamada`という文字列を出力するケースを試します。

```php:sample.php
<?php

$name = "yamada";

echo $name;

//実行結果：yamada


echo "Hello!".$name;

//実行結果：Hello!yamada


echo 'Hello!$name';

//実行結果：Hello$name


echo "Hello!$name";

//実行結果：Hello!yamada


echo "Hello"$name;

//実行結果：エラー

?>
```

上記の`実行結果`を見ていただければわかると思いますが、
文字列＋変数の出力の方法で一般的に知られているのは２つ目の

```php
<?php

$name = "yamada";

echo "Hello".$name;

?>
```

だと思います。

```php
echo "文字列".(変数);
```
の形ですね。

ですが、もう一つ、４番目の方法でも出力可能ということを初めて知りました。

```php
<?php

$name = "yamada";

echo "Hello$name";

?>
```

下記のように`ダブルクオーテーション`で囲むと連結するために必要な`.`がなくても出力されるんですね。
びっくり。

```php
echo "文字列(変数)";
```

ちなみに`シングルクオーテーション`の場合は上手く出力できません。

調べてみると、シングルクオーテーションとダブルクオーテーションには実が違いがあリました。

`シングルクオーテーション(' ')：完全にそのまま利用する`
`ダブルクオーテーション(" ")：評価できるものは評価する`

上記の通り、`ダブルクオーテーション`の場合は`$name`が`変数である`と評価されて変数の値が適用されたと言えます。

いやー、びっくりしました。

##まとめ

PHPで文字列を出力するには２つの方法がありました。

ただ、一般的に多く使われているのは

```php
echo "文字列".(変数);
```

こちらですので、こちらを使うのが良いかなと思います。
僕もこちらを普段から使っています。

とまあ、こんな感じで記事は以上です。

最後まで読んでいただきありがとうございました！！
Dr.Capital風背景メーカーの裏側 SVG編

J-POPの味わいに隠された音楽理論を解き明かすDr.CapitalのYouTubeチャンネルが好きで、

https://www.youtube.com/watch?v=fxjiqY1sJ1Y

あのド派手な背景をZOOMで真似したくなり、動画メーカーを制作してみました(個人的なファンアートでご本人はまったく関係ありません)。

https://www.ideamans.com/dr.capital/

<img width="700" alt="Dr_Capital風背景メーカー.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/8f0dc4df-fbf5-6ac6-cd58-beacc7b97c96.png">

このページ制作でいくつか新しい技術に挑戦したので、何回かに分けて紹介したいと思います。

# ド派手な背景をSVGで表現するには

あの背景では、放射状のストライプがグルグル回っています。これを正多角形を分解した三角形の集合で表現します。

![radial-stripe1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/f2726e37-8bd6-8d82-da1d-95300c93a73c.jpeg)


放射の中心は、ビューポート矩形の中心のやや下です。

せっかくなので放射(多角形)の中心点Oは任意の座標にできるようにします。

多角形の大きさ(外接円の半径)は、中心点Oから最も遠いビューポートの頂点との距離にすると、どの角度でも最低限の大きさで多角形がビューポートをすっぽり覆うことができます。

![radial-stripe.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35178/0340531f-9556-4d01-f29a-9944a432c78a.jpeg)


多角形の頂点は三角関数で簡単に求められます。うろ覚えだけどやっててよかった三角関数！

## SVG

三角形は`polygon`要素で簡単に記述できます。ストライプになるように、`style`属性の`fill`プロパティを交互に指定します。

```html
<svg width="1280" height="720">
  <polygon class="piece-of-cake" points="x0,y0 x1,y1 x2,y2" style="fill: color1" />
  <polygon class="piece-of-cake" points="x0,y0 x1',y1' x2',y2'" style="fill: color2" />
  ...
</svg>
```

実際はSVGが数値計算の反映、カラーの選択や各種設定に応じて模様がリアクティブに変わるよう、Vue.jsを用いています。

## CSS

これにCSSで定速で回転するアニメーションを付与します。

`transform-origin`で、回転の中心を指定することに注意が必要です。


```css
.piece-of-cake {
  animation: clockwise 180s linear infinite;
  transform-origin: 50% 80%;
}
@keyframes clockwise {
  0% {
    transform: rotate(0deg);
  }
  100% {
    transform: rotate(360deg);
  }
}
```

以上、SVGであのグルグル背景を表現する方法でした。
職務経歴書をGitLab Pages を使って公開してみた

# 始めに

長期の休みとなり、まとまった時間が取れたので自分の２年間の振り返り、いざという時のために職務経歴書なるものを書いてみようと思った。フォーマットを調べてみると、PDF や Word といった形式が主流らしい。最初は、Wordで書いてPDFに変換しようと考えていたが、まがいなりにも私はエンジニアなので、~~Wordのレイアウトと格闘するなどの~~余計なコストは使わずに、Markdownでさくっと書いて構成管理をしたいと思った。そこで個人的に使用している GitLab で構成管理、特に隠す理由もないので GitLab Pages で公開することにした。



# 作業内容

実現したいことは以下の通り。

- 職務経歴書（Markdown）を構成管理したい。
- MasterにマージしたタイミングでPDFに変換しダウンロードできるようにしたい。
- 別に隠す必要もないので GitLab Pages として公開する。



## リポジトリ作成

特に名前に決まりはないが、英約にすると **Curriculum Vitae** ということだったので、`curriculum-vitae`という名前にした。
以下、リポジトリのディレクトリ構成です。（GitBookのディレクトリ構成に倣っています）

```
curriculum-vitae
|- styles
|   |- pdf.css
|   |- website.css
|- gitlab-ci.yml
|- book.json
|- README.md
|- SUMMARY.md
```

- styles: 公開サイトやPDFに適用するスタイルシート
- .gitlab-ci.yml: GitLab CI/CD で実行されるスクリプトを定義
- book.json: GitBookの設定ファイル

  以下、設定例です。

  ```book.json
  {
    "langeage": "ja",
    "title": "Curriculum Vitae",
    "styles": {
      "website": "styles/website.css",
      "pdf": "styles/pdf.css"
    },
    "plugins": ["theme-api", "-sharing"]
  }
  ```

- README.md: 職務経歴書の本体
- SUMMARY.md: 文章の構成



## 職務経歴書を書く

各々の経歴をご自由に記載してください。何を書くとかは決まってないですが、私はこの辺りを参考に書きました。

- [エンジニアが読みたくなる職務経歴書](https://dwango.github.io/articles/engineers-resume/)


## GitLab Pagesで公開する準備

### .gitlab-ci.ymlを書く

GitLab CI/CD を使って、静的サイトのビルド -> 公開、MarkdownからPDFへの変換を行います。
以下のファイルをリポジトリのルートに配置する。

```gitlab-ci.yml
image: node:10

cache:
  paths:
    - node_modules/

before_script:
  - apt-get update
  - apt-get install -y calibre xvfb fonts-ipafont-gothic fonts-ipafont-mincho
  - npm install -g gitbook-cli
  - gitbook fetch 3.2.3
  - gitbook install

test:
  stage: test
  script:
    - gitbook build . public
    - xvfb-run gitbook pdf
  only:
    - branches
  except:
    - master

pages:
  stage: deploy
  script:
    - gitbook build . public
    - xvfb-run gitbook pdf . curriculum-vitae.pdf
  artifacts:
    paths:
      - public
      - curriculum-vitae.pdf
    expire_in: 1 week
  only:
    - master
```



### `git push`する

無事成功すると、GitLab Pages として先ほど記載した職務経歴書が公開され、提出用の PDF が artifacts として出力されます。

![image-20200427152223532.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560068/6ee6a0da-c426-ef70-6ca7-551c84c1160d.png)


試しに、ダウンロードしてみる。

![image001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560068/fe6bcea6-33eb-d26e-7510-7062174098fb.png)


zipで圧縮されているので、適当に解凍します。

![image-20200427153753045.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/560068/a887040a-32e9-c3eb-9b4c-6ec3df5865a5.png)


- public；GitLab Pagesとして公開されている資産一式。
- curriculum-vitae.pdf；Markdownで記述した職務経歴書をPDFに変換したもの。


GitLab Pagesは、特に設定を加えなければ、**https://<ユーザ名>.gitlab.io/curriculum-vitae**で公開されます。
※ユーザー名に`.`が含まれていると証明書関係のエラーになりますがコンテンツ的には問題ないので大丈夫です。

# 終わりに

思い付きでやってみましたが、自分の経験・スキルを振り返るのはいい取り組みだなと思いました。半年に一回くらいの頻度でアップデートしたい。また、今回の仕組みに関してもまだまだ改善ポイントがありそうです。（特にGitBookの設定周り）



# 参考

- [職務経歴書をGitHubで管理しよう](https://qiita.com/okohs/items/abcad0b4aefa585bc50b)

- [GitBookによるドキュメント作成](https://qiita.com/mebiusbox2/items/938af4b0d0bf7a4d3e33)

- [gitbookで楽々ドキュメント作成](https://www.cresco.co.jp/blog/entry/2509/)
JavaScriptにおいてオブジェクトの取扱説明書

# オブジェクトって…？
Rubyを学んだ方はわかると思いますが
**オブジェクトはデータのまとまりのこと**です。
{}で囲みます。これ以上知りたい方は以下（▶︎）をクリック！
<details><summary>オブジェクトとは</summary>クラスとインスタンスのことです。以下に定義を示します。
**・クラス＝設計図
・インスタンス＝実際のもの
・オブジェクト＝クラスとインスタンス両方のこと**
これが分かれば問題ないです。</details>

# 実際にオブジェクトを扱ってみる
以下のファイルを用意しましょう。
:page_facing_up:index.html
:page_facing_up:script.js
では以下のように記述していきましょう。
`script.js`

```javascript
let obj = {name: "Taro"};
console.log(obj)
```
変数objはnameというプロパティを持っています。
nameというプロパティはTaroという値を持っています。
<details><summary>プロパティとは</summary>**詳細書みたいなもの**です。ファイルのプロパティをみると更新日時や諸々書いてありますよね。なので今回はnameというプロパティはTaroという値を持っているわけです。</details>
<img width="1404" alt="A805CC5B-4BCC-4D92-A23E-8B4A5E5FC432.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625088/7fc58a18-918b-57ec-4a3a-e30e667f3099.png">
上記のような結果になっているはずです。確認してください。

## オブジェクトを修正する
以下のように記述します
`script.js`

```javascript
let obj = {name: "Taro", age: 25, addres: "Tokyo"};
obj.name = "Hanako"
console.log(obj)
```
<img width="1395" alt="9B9A203E-CBA2-44F9-90DB-B5D4D2006B3D_1_105_c.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625088/88b7eb56-884b-c144-0365-c55d8e6dc9c3.jpeg">
名前がHanakoに変わりましたね。

## オブジェクトの中身を取り出す
以下のように記述します。
`script.js`

```javascript
let obj = {name: "Taro", age: 25, addres: "Tokyo"};
obj.name = "Hanako"
console.log(obj.name)
```
<img width="1412" alt="JavaScriptPractice.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/625088/073c7979-45bb-9507-a96c-d3c67116df35.png">
名前だけ取り出せましたね。

次回は繰り返し文を執筆していきます！
Slack風のUIをvue,node,npmを使って作る

## 学習タイトル
１．Slack風UIを作ろう

## 開発環境
使ったツール、コマンド、言語等の情報を記述。
言語：vue.js

## 学んだこと
・node
javascriptの開発環境を作るにはnodeが必要。nodeというのは、javascriptでサーバサイド側を扱える言語。

・npm
nodeのパッケージを管理するツールと言われているnpmが使える。
ターミナル上で**npm run dev**と打つと環境を立ち上げることができる。
(package.jsonというファイルのscriptにdevというコマンドが必要)

・vue
vueはコンポーネントを組み合わせて作成していく。
コンポーネントとは、html,css,javascriptなどの言語を一つのファイルにまとめたものをいう。
vueファイルを読み込ませたい場合は、importとexportを使うことで、読み込ませたいファイルと出力させたい値を記載する。

```vuejs:index.vue
<template>
   <div id="container">
      <定数名 />  <!--この部分で出力される-->
   </div>
</template>

import 定数名 from '~/フォルダ名/ファイル名'

export default {
   フォルダ名： {
      定数名
   }
}
```
vueには以下フォルダがあるが、それぞれ意味がある。
・pages
→ルーティングのようなもの。例えば、pagesフォルダ内にtest.vueファイルがある場合、
ローカルの開発環境、http://localhost:3000/test
でtest.vueファイルが確認できる

・components
→コンポーネントファイルを入れておくフォルダ。

・layouts
→共通のレイアウトファイルを入れておくフォルダ。

・scoped
styleタグにscopedが書かれたcssはその他のファイルには適応されず、scopedと書かれたファイルのみ適応される。
Redisサーバの動作が重いとき（クラッキングされているかも知れません）

# 事象
さっきまで大丈夫だったredis-cliの応答がなくなった

# 原因
たぶんハッキングされた
ps -ef | grep redisしたところ、
> redis2 --donate-level 1 -o ve01.ki...
のような文字列が表示された

# 対応
VMごと破棄

# 再発防止策
ファイアウォールを適切に設定する（EC2ならセキュリティグループを適切に設定する）
パスワードをかける（デフォルトではパスワードなしなので）

# 参考
[redis] redis 운영시 주의사항 : 네이버 블로그
https://blog.naver.com/PostView.nhn?blogId=pjt3591oo&logNo=221810858821&parentCategoryNo=&categoryNo=92&viewDate=&isShowPopularPosts=true&from=search
plunkerでcalcium

#概要

plunkerでcalciumやってみた。
fizzbuzzやってみた。

#参考にしたページ

https://qiita.com/0xCAF2/items/8ab951a37ba61607f12c

#サンプルコード


```
[
  [1, [], "=", ["var", "res"], [[]]],
  [1, [], "for range", "i", [1, 101]],
  [2, [], "ifs"],
  [3, [], "if", ["==", ["%", ["var", "i"], 15], 0]],
  [4, [], "call", null, ["attr", "res", "append"], ["Fizz Buzz "]],
  [3, [], "else"],
  [4, [], "ifs"],
  [5, [], "if", ["==", ["%", ["var", "i"], 3], 0]],
  [6, [], "call", null, ["attr", "res", "append"], ["Fizz "]],
  [5, [], "else"],
  [6, [], "ifs"],
  [7, [], "if", ["==", ["%", ["var", "i"], 5], 0]],
  [8, [], "call", null, ["attr", "res", "append"], ["Buzz "]],
  [7, [], "else"],
  [8, [], "call", null, ["attr", "res", "append"], [["var", "i"]]],
  [1, [], "call", null, ["var", "print"], [["var", "res"]]],
  [1, [], "end"]
]
```

#成果物

https://embed.plnkr.co/plunk/8ICHKVK05ByciDsA

以上。
Compassがよかった話

受託Webサイト制作で2ページ分のLPを制作するにあたり、Compassを使いました。
静的サイトの制作ならCompassで十分だと思い、記事に残しておきます。

# 前提

## 案件
 - 成果物：LP2ページ（PC版1ページ、SP版1ページ）
 - 対応ブラウザ：最新ブラウザとIE11
 - 納期：4営業日
 - 備考
   - SPのデザインは最初ない状態
   - 動きはほぼない
     - jsはほぼ書かない
   - レスポンシブでない
   - 後々運用していくにあたり修正しやすい様にしておく

## 業務フロー
デザイン受取 → コーディング → ローカル確認 → zipなどで納品 → テストアップ

## 開発環境
 - MacOS mojave
 - MAMP

## 開発リソース
 - template（php）
 - css
 - assets（font, image）

## ビルド
cssのみsassでビルドしました。途中からCompassを導入。
phpは生で編集し、assetsは最適化したものを保存。

## ディレクトリ構成（最終形）

```
 LP/
 - dist/
   - index.php
   - style.css
   - template/
     - common/
       - _btn.php ...etc
     - _mv.php ... etc
   - assets/
     - img/
     - font/
 - src/
   - scss/
     - common/
       - _base.scss ...etc
     - _mv.scss ...etc
 - dev.sh
 - prod.sh
 - config.rb
 - README.md

```

# 考察
[前回の記事](https://qiita.com/st-0403-jp/items/a99ffb372c9a6b1e3569)などから、受託サイト制作、特に静的サイト制作では、スピードかつ運用しやすい実装（壊しやすい実装）が求められると思っているので、なるべく生の状態で編集していく形を取っています。
つまり今回の構成としては、サーバにあげるファイルは、dist配下のファイルたちで、cssのみビルドしてdistに吐き出す形にしています。phpを直接編集するのでMAMPのhtdocsにシンボリックリンクを作り、distと同期してローカル確認を効率化しています。
最近のWeb制作からすると原始的なやり方ですが、静的サイトならこれで十分な環境で、誰でも編集でき、環境もすぐ作れるので、良きと思っています。

PC, SPはテンプレートをユーザーエージェントで出し分けを考えていたのですが、成果物のボリュームと多少のSEO効果を考えて、画面の横幅でスタイルを変更する（メディアクエリ）でいいかなと思いました。ここで、Sassにしておいてよかったなと思いました。
ただ、クラス命名がクソになってしまいましたが。。。

cssのビルドは、最初Sassで大丈夫と思っていたのですが、
最新ブラウザのみとはいえ、モバイルもあるし、ベンダープレフィックス必要やなと思いました。
そこでAutoprefixer。
ただ今までNode.jsでのビルドでしか使ったことなかったので、Sassであんのかなーと調べていたら、Compassが浮上し、今回の形になりました。
今までは、シェルスクリプトでSassを打ちまくっていたのですが、Compassならそこをやってくれるので楽でした。確かにそういうもんだったと感じながら、今まで置き去りにしてきたので、改めて良きと思いました。
しかも別モジュールですが、ちょちょっとインストールすれば、Autoprefixerも簡単に使えたので、これからはこれで行こうと思わせる環境でした。
モダン開発に慣れてくる、もしくはモダン開発からフロントエンドに入ってきた方からすると逆にこういう原始的なところは新鮮に感じられると思います。
デザイナー+コーダーの様な会社（Webサイト制作会社、デザイン会社、など）ですとまだまだNode.jsがハードルある様なので、Compassの様なところから入るとビルドが理解できていいのかなーと思っています。

正直、リンターやユニットテストもあるといいと思うのですが、納期を考えるとかなりむずいです。
それは必要性が浸透していないところがあるので、今後すぐ入れられるような状態にして浸透していってほしいなと思う今日この頃です。
あと、将来的なお話ですが、前やった案件で、storybookというのを使っていて、storybookはコンポーネントの状態を可視化できかつ共有もできるツール・プラグインなのですが、React用のツールに見えたので、それに近いものを作れればいいと思っています。
まーこれも必要性が浸透しないとですが。。

Webサイト制作は、確かに制作自体は簡単にできてしまうのですが、それだけにそれぞれの職能がうまく機能しないと意外にめんどくさい仕事になって案件自体が悪者扱いされてしまうので、Weサイト制作自体のフレームワークを作っていければと思います。

# 次点
これからはCompass使っていく。ただ、Node.jsを入れればnpm scriptsで簡単にビルドできる環境を作れるので、どっちがいいかその都度判断したいと思っている。
Compass環境が簡単に作れるシェルスクリプト入れるのがいいかも。
シェルスクリプトを簡潔にしていく。GitLabCIなどに組み込みたい。（zip渡しなどやめたい）

# まとめ
 - Compass環境は良き（特にMacOSなら）
 - Compass環境すぐできる様にする
 - 納品物をCIで
 - Webサイト制作自体をもっと効率的に

また、こんな大して参考にならん記事を残していきますが、それでも誰かの参考やこんな考え方もあるといったご意見いただければと思います。

# 関連記事
 - [受託Webサイト制作の時の開発環境](https://qiita.com/st-0403-jp/items/a99ffb372c9a6b1e3569)
【機械学習初心者向け】サクっと機械学習を体験してみる

# 始めに
機械学習の初学者が機械学習に対して興味を持ちそうな教材を発見したので備忘で記載。

とりあえず手を動かして`機械学習を体験してみたい人向け`です。

# どんな内容？
中学校で習う関数（ y = 2x - 1 ）を題材にします。
機械学習モデルにx,yの値だけを入力します。（式は入力しません）
機械学習モデルにxとyの関係について学習させます。（式を考えさせます）
そして「x=10のときにyの値は？」と機械学習モデルに質問（入力）し、回答（出力）を得るところまでやります。

# 良かった所

- **所要時間15分！**　（動画観て、colaboratory開いて資料のスライドからソースコードをコピペして実行するまで）
- 動画を観るだけで機械学習が何かなんとなく分かるようになる。
- googleアカウントを持っていれば実際にコードを書いて、モデルに学習させ、動かして、成果が見られる。

# 教材
Google社が提供しているOSS（オープンソフトウェアライブラリ）のTensorFlowを紹介する動画とそのスライドです。
実施する内容は「Learn TensorFlow 1」です。

・動画
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/KNAWp2S3w94/0.jpg)](http://www.youtube.com/watch?v=KNAWp2S3w94)

・動画と同内容のスライド（ソースコード付き）
[Learn TensorFlow 1: The "Hello World" of machine learning](https://codelabs.developers.google.com/codelabs/tensorflow-lab1-helloworld/index.html?index=..%2F..index#0)


# リンク
- colaboratory　　　https://colab.research.google.com/
- 筆者がcolaboratoryにコピペしてみた結果　　　https://colab.research.google.com/drive/1Unc4kryY1oRvHs-NwcwvMhwjTcafIgvd
ALAE : Adversarial Latent Autoencoders で顔画像生成（Windows10、Python3.7）

# はじめに
一枚の自撮り画像を用いて、性別や年齢、笑顔、髪の毛、口や鼻、メガネなどのパラメータを変化させて、顔画像を生成するALAEをやってみました。

# システム環境
- Windows10（RTX2080 Max-Q、i7-8750H、RAM16GB）
- Anaconda 2020.02
- Python 3.7

# 導入
[ALAE](https://github.com/podgorskiy/ALAE)をクローンします。

ALAE用の環境を作成します。

~~~
$ cd ALAE-master
$ conda create -n ALAE python=3.7
$ conda activate ALAE
~~~

ライブラリをインストールします。

~~~
$ pip install torch==1.5.0 torchvision==0.6.0 -f https://download.pytorch.org/whl/torch_stable.html
$ pip install -r requirements.txt
~~~

下記を実行し、学習済みモデルをダウンロードします。

~~~
$ python training_artifacts/download_all.py
~~~

デモを実行します。

~~~
$ python interactive_demo.py
~~~

ALAE-master\dataset_samples\faces\realign1024x1024に自撮り画像を置いて実行してみました。

|入力|出力|
|:--|:--|
|![00148.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/9cd0cd6d-ab13-0865-737f-400f21156cb1.png)|![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/21c4b129-ae71-576c-6ca8-562081950fea.png)|

かわいいｗ

<blockquote class="twitter-tweet"><p lang="ca" dir="ltr">ALAE : Adversarial Latent Autoencoders Demo <a href="https://twitter.com/hashtag/CVPR2020?src=hash&amp;ref_src=twsrc%5Etfw">#CVPR2020</a> <a href="https://twitter.com/hashtag/AI?src=hash&amp;ref_src=twsrc%5Etfw">#AI</a> <a href="https://twitter.com/hashtag/%E7%94%BB%E5%83%8F%E5%87%A6%E7%90%86?src=hash&amp;ref_src=twsrc%5Etfw">#画像処理</a> <a href="https://twitter.com/hashtag/DeepLearning?src=hash&amp;ref_src=twsrc%5Etfw">#DeepLearning</a> <a href="https://twitter.com/hashtag/%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92?src=hash&amp;ref_src=twsrc%5Etfw">#機械学習</a> <a href="https://twitter.com/hashtag/CV?src=hash&amp;ref_src=twsrc%5Etfw">#CV</a> <a href="https://t.co/aUf4pWV5KZ">pic.twitter.com/aUf4pWV5KZ</a></p>&mdash; 藤本賢志(ガチ本)@pixivFANBOXはじめました (@sotongshi) <a href="https://twitter.com/sotongshi/status/1254662681073610753?ref_src=twsrc%5Etfw">April 27, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

お疲れ様でした。
CakePHPブログチュートリアル 共通部分のComponent化

#本章の目的

CakePHP(2系)のブログチュートリアルにおいて、PostのaddやeditのViewやControllerの処理が、共通する部分が多いので部品化を行う。


#Viewの部品化


- app/View/Elements/Posts/ に(エレメント名).ctpファイルを作成

- app/View/Posts/ の.ctpファイルで下記のように呼び出す

```php
echo $this->element('エレメント名');
```

-　変数を設定したいときは、第２引数に配列を渡す

```php
echo $this->element('エレメント名', array('変数名' => '変数');
```

#Controllerの部品化

- 共通部分を部品化するとき、1つのController内で完結するものはその中、もしくはモデルで関数化して部品化する
- 複数のControllerで使用する関数などは、app/Controller/Component に書く

今回は、1つのController内で完結するものであった。
お手軽に電子会議! Zoom利用ガイド (ゲスト編)

# はじめに
これからZoomのホストをやることが多くなりそうなのですが、例によってあまりいいガイドがない。。。
仕方がないので、自分で作りました。
汎用的なツールなので、皆様もそのまま活用できると思います。

[2020-04-29] [お手軽に電子会議! Zoom利用ガイド　ホスト編](https://qiita.com/makaishi2/items/1706a6dc8c5670ae0431)を追加しました。

# 前提
* 以下の記載は招待される先のクライアントの手順のみです。招待する側の手順はまったくありません。
* クライアントPCは、Windowsを想定しています。

# 事前準備
以下のURLをブラウザで開いて、クライアントソフトの導入をします。
これは必ずしも必要な手順ではないのですが、一斉授業などの場合はこうしておいた方が時間の節約になると思います。

Zoom導入用URL: https://zoom.us/support/download

導入が終わると、下のような画面が出てきますが、ここでは何もせず、一端「Ｘ」アイコンで、画面を閉じます。

![step1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/d0cfd4fb-39ba-5451-f21e-f84fe5d05b7e.png)

# 招待URLをオープン
利用者は事前にミーティング用のURLをメールなどでもらっているはずです。上の準備が終わったら、そのメールのリンクをクリックして、URLを開いて下さい。ブラウザから、先ほど導入したZoomのアプリが起動されるはずです。
下の画面のように名前を聞かれたら、名前を入力します。
(一斉授業の場合「学籍番号-氏名」のようなルールかもしれません)

![step2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/561e43b7-a735-398c-e820-73461d3b834c.png)

# オーディオ設定
最後に下のような画面が出てくるので、「コンピュータオーディオで参加」をクリックします。

![step3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/5caa8a0b-bef0-b208-c1a0-dba49709e024.png)

# Zoomメイン画面
下のような人のパソコンの画面が出てきたら、接続に成功しています。
この画面での主な操作は以下のとおりです。

**Escキー**: 全画面モードが終わり、Zoomが他のアプリ同様Window表示されます。
**① ミュートアイコン**: 自分のマイクのOn/Offをコントロールします。
**② ビデオアイコン**: 自分のパソコンのカメラOn/Offをコントロールします。
**③ 参加者アイコン**: 参加者の一覧表示をします。Zoom上で「挙手」をしたい場合に利用します。
**④ チャットアイコン**: チャット用のパネルを開きます。チャットメッセージを送りたいときに利用します。
**⑤ 画面を共有アイコン**: 自分の画面を共有したいときに利用します。
**⑥　ミーティングを退出**: わかりにくいのですが、画面右下に退出アイコンがあります。ミーティングを退出するときに利用します。

<img width="960" alt="pic4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/0b9636d5-94a4-0309-c2e9-8119943d1c92.png">

# 参加者パネル
**③参加者アイコン**をクリックすると。下のようなパネルが出てきます。画面右下の「手を挙げる」をクリックすると、Zoomで「挙手」をしたことになります。

![step5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/cb092d3e-8ff2-5b7b-33d9-1aa79411dcd3.png)

# チャットパネル
**④チャットアイコン**をクリックすると、下のようなパネルが出てきます。
ここでメッセージをテキスト入力すると、チャットメッセージが送付されます。

![step6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206130/1078f191-3c47-d67f-6412-63226f9efb29.png)
[漏洞通告]jackson-2688/2698/jackson-databind JNDI注入导致远程代码执行

### 漏洞描述
近日,亚信安全网络攻防实验室跟踪到jackson-databind更新了6个jndi注入的黑名单类.如果在项目包中存在该类的jar包且JDK版本满足注入版本,则可以使用JNDI注入的方式导致远程代码执行.类名如下:

```
oadd.org.apache.xalan.lib.sql.JNDIConnectionPool
oracle.jms.AQjmsQueueConnectionFactory
oracle.jms.AQjmsXATopicConnectionFactory
oracle.jms.AQjmsXATopicConnectionFactory
oracle.jms.AQjmsXATopicConnectionFactory
oracle.jms.AQjmsXATopicConnectionFactory
```

### 漏洞编号
Jackson内部编号2688
Jackson内部编号2698

### 漏洞威胁等级
中危

### 不受影响范围
2.11.0

### 漏洞验证
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/d20d5d09-5be1-00d7-8e0c-d2fec45d7c10.png)






### 修复建议
参照官方更新至最新版

### 时间轴
[0] 2020/04/27 亚信安全网络攻防实验室分析&复现该漏洞并发布漏洞通告

### Reference
https://github.com/FasterXML/jackson-databind/issues/2688
https://github.com/FasterXML/jackson-databind/issues/2698
Idris: マッチする枝を不確定にしてはいけない

(※この記事では Idris2 ではなく無印のほうの 1.3.2 を使っています)

最近 Idris を触り始めて、依存型の力に魅せられてしまいました。依存型最強！

[FizzBuzz を依存型で定義してみた](https://gist.github.com/SekiT/c1f83bdc6e51c246407103702a983a25)のですが、その中でハマったことを紹介します(自分史上最も達成感のあるFizzBuzzだった…)。

## 問題のあるコード

```foo1.idr
total Foo : Nat -> Nat -> Type
Foo Z _ = String
Foo _ Z = String
Foo _ _ = Nat

f : (n : Nat) -> Foo 0 n
f n = "foo"

g : (n : Nat) -> Foo n 0
g n = "foo"

h : (n : Nat) -> Foo 1 1
h n = n
```

「"foo"って何だよ」とかは置いといて、一見何も問題なさそうに見えるこのコードですが、コンパイルエラーになってしまいます:

```
foo1.idr:10:7-11:
   |
10 | g n = "foo"
   |       ~~~~~
When checking right hand side of g with expected type
        Foo n 0

Type mismatch between
        String (Type of "foo")
and
        Foo n 0 (Expected type)
```

`Foo` は `total` (と宣言していてそこはコンパイルが通っている)なのでコンパイル時に評価してくれるはずですが、 `Foo n 0` の評価がその先に進んでくれていません。 `String` のはずなんだけど？！

一方で `f` と `h` はコンパイルが通っているので、 `Foo 0 n` と `Foo 1 1` はそれぞれ評価されて `String` と `Nat` になっていることがわかります。

何がいけないのでしょうか。プログラマとコンパイラが衝突するときというのは、大抵プログラマがコンパイラの気持ちを分かっていないときなので、コンパイラの気持ちになって考えてみましょう。

> コンパイラ「君の宣言した Foo n 0 と "foo" の型である String はマッチしないんだ」
プログラマ「Foo n 0 は String でしょ！どうして私の言うことが分からないの！」
コンパイラ「」

## コンパイラの気持ちになる

一旦冷静になって `Foo n 0` について考えてみましょう。これを評価するためにはまず `Foo` の定義を見ます:

```
total Foo : Nat -> Nat -> Type
Foo Z _ = String
Foo _ Z = String
Foo _ _ = Nat
```

一見2つめの枝にマッチしそうに見えますが、 `n` が `Z` だったときは1つめの枝にマッチしてしまいます。

つまり `n` の値に応じてどちらの枝にマッチするかが変わってしまうのです。コンパイラはどちらの枝に入るか決められないため、評価することをやめてしまったのです。

(今回はたまたまどちらの枝でも同じ `String` なのでコンパイラが頑張ればいけそうな気もするんですが、値の同値性のチェックという処理がおそらく total でないので無理そうです)

コンパイラの気持ちが分かったので、和解をしましょう。

## 和解

コンパイラは「`n` の値によってどの枝にマッチするかが変わってしまう」ことが嫌だったのです。これを避けてあげましょう:

```foo2.idr
total Foo : Nat -> Nat -> Type
Foo Z _ = String
Foo _ Z = String
Foo _ _ = Nat

-- (中略)

g : (n : Nat) -> Foo n 0
g Z     = "foo" -- ここの型は Foo Z 0 としてチェックされる
g (S _) = "foo" -- ここの型は Foo (S _) 0 としてチェックされる

-- (後略)
```

これでコンパイルが通りました。

冗長にはなってしまいましたが、`Foo Z 0` と `Foo (S _) 0` であれば確実にどの枝に入るかが確定するのでコンパイラは評価が出来ます。

ここで `(S _)` というパターンを使うことは重要です。うっかり

```
g : (n : Nat) -> Foo n 0
g Z = "foo"
g n = "foo"
```

としてしまうと、`g n = "foo"` の型が `Foo n 0` としてチェックされることになり、最初と同じ問題が発生してしまいます。

## まとめ

「変数の値によってマッチする枝が変わる」という状況を避けよう
非IT系営業がなぜプログラミングやITの勉強をするのか

#なぜ非IT営業がネットワークやプログラミングの勉強をするのか？
プロエンジニアの方からすると笑われるレベルだと思いますが、学生時代から社会人になってもITやプログラミング言語の勉強をしています。元々、理系なのでITや最新テクロノジーに対するアレルギーはありませんので、休日や仕事終わりに楽しみながらやっています。
自分でソフトウェアを作って販売したといったような仕事に直結してよかったことはありませんが、少しだけよかったことを挙げてみます。
ちなみに今まで2回転職しましたが、新卒での入社試験も含めて関連の知識や経験で採用されたことは一度もありません(最近某企業様からネットワークやAIソフトウェア営業のスカウト連絡をいただきました)。

###知的好奇心が満たされる
　自己満足っていうやつです。これが意外と一番続けることができる理由かもしれません。

###開発部署や理系の人ともある程度対等に会話ができる
　一般的にエンジニアの人は、視野が狭い場合が多いです。これは大きな会社では完全に分業制がとられておりメカ屋さんエレキ屋さんといったすみわけがかなり進んでいることも大きな原因です。そんな人たちも学生時代はプログラミングをやっていたり、ソフトをつくっていたりすることも多く、ネットワークやプログラミングなど知っている人だと分かれば対等に見てもらえることが結構あります。うちみたいなWindowsとC言語のレガシーな環境で開発していれば、PythonやLinuxなどやっていると言えばすぐに話題になります(しかもそれが営業の人)。

###ネットワークやITの製品提案ができる
　この分野は知らない人と知っている人で大きな差があります。そのため相談ごとに適切に回答すれば、社外の人から頼られたり一目置かれることがあります。一度でも「○○さんに相談しよう」ということになれば、いろいろな相談をしてもらえ、頑張れば自分達でも構築できるような比較的簡単なネットワーク構築をいただけることもあります。
　またこちらから教えてあげることで、信頼が増すこともあります。当然、大規模なものではないので売上は大きくありませんが、その信頼でお客様を紹介いただいたりすることもたまにあります。

###最新トレンドのキャッチアップが可能
　自社製品や業界内でもIoTやネットワーク、AIなどの新技術と自社製品を組み合わせて新しい製品やソリューションを考えている企業がほとんどだと思います。
　その場合でも背景知識などを知っているもしくは自分で勉強できる力があれば、他の営業や競合営業と比べてより速く成果を上げることができるようになります。年々市場の流れはとても速く、「昔取った杵柄」ではなかなか爆速で営業成果は上げられないでしょう。

###深いレベルで数字や技術で仕事を語ることができる
　今も昔も営業は勘・経験・根性の3Kが主流です。数字分析(ただし深いレベル)や最新技術などを使って分析することができれば社内では一目置かれることもあるかもしれません。ただし上司や同僚が話題についていけることが大前提になります。

###自分で作ったものを売る
　さすがにこれは今までありません(ネットワークの要件定義や設計は除く)。このレベルまで到達すれば完成形
Photoshop Scriptを使って調整レイヤーを追加する

趣味でフィルム写真を取っているのですが、編集の際はPhotoshopで調整レイヤーを使って色味の変更などをしています。
ただ毎回クリックをして複数の調整レイヤーを追加するのは面倒なので、勉強中のJSを使って自動でこれらの追加ができないか調べてみました！
ぜひ参考までにご覧ください。
##Scriptを使って調整レイヤーを追加することはできない
頭っからこの記事の目的を否定するような内容ですが、現状Scriptで調整レイヤーを追加することはできないようです。
調べ始めた当初以下のようなコードでレイヤーを作成し、レイヤーの種類を調整レイヤーへ変更するという処理を行えないかと考えました。

```javascript:colorNeg.js
var artLayerRef = app.activeDocument.artLayers.add();
artLayerRef.kind = LayerKind.CURVES;
```
ただ、上記コードを実行しても「レイヤーの種類はテキストにしか変更できない」という旨のエラーが出てしまうため調べてみると以下のような記事が。

<b>[中綴製作所](http://nakatoji.lolipop.jp/index.php/extendscript/photoshop/ps-layer/447-2015-05-15-19-07-66)</b>
>Photoshopのスクリプトでは通常のレイヤーしか追加できず、また新規に作成したレイヤーの種類はテキストレイヤーにしか変更できません。

##Actionで調整レイヤー追加の手順を記録し、それをScriptで呼び出すように方向転換
Scriptではどうしようもないということなので、Actionを使う方に方向転換しました。
もともとそこまで複雑な作業ではないので、アクションで記録してそれをScriptで呼び出せばいいんでは？と考え以下のコードを記述しました。

```javascript:colorNeg.js
/*
    <javascriptresource>
    <name>Negs</name>
    <about>Add adjustment layers for negaties</about>
    </javascriptresource>
*/
app.doAction("ColorNegative","Negs");
```

実際にアクションの呼び出しをしているのは最後の一行**app.doAction〜**の部分になります。以下のような形でアクションセット、アクションネームを指定し呼び出します。

```javascript:colorNeg.js
// app.doAction("your action name","your action set name");
app.doAction("ColorNegative","Negs");
```
下のコメントアウトで記載した部分はいちいち今回作成したスクリプトをメニューに追加しいちいちブラウズしなくても良いようにするためのものなので、おまけみたいな感じです。

```javascript:colorNeg.js
/*
    <javascriptresource>
    <name>Negs</name>
    <about>Add adjustment layers for negaties</about>
    </javascriptresource>
*/
```

あとはこのスクリプトにショートカットキーを割り当てて完成です。

##追記　アクションにショートカットキーを割り当てるだけでよかった、、
この記事を書き終える間際に気がついてしまいました、こんなめんどくさいことしないでもアクションにショートカットキー振ってあげれば済む話では、、と。
renderメソッドについて

# 背景
renderメソッドを普段使っているが、オプションが沢山あることを知りその使い方をほとんど知らず、あまり使いこなせていると感じたのでもう少し詳しく調べて色々な使い方を学びたかったため調べて解説した。

##renderメソッドとは
呼び出すテンプレート（ビュー）ファイルを指定するメソッドで、コントローラー・ビューどちらでも使うことができます。

##ビューファイルへの書き方

```ruby

<%= render 'ファイル名' %>   

<%= render partial: 'ファイル名' %>      # 部分テンプレート

```

##オプション一覧
####・actionオプション
指定したアクションの対応したビューが表示される

```ruby

# createアクション実行した後にshowアクションを表示させる
def create
  User.create(user_params)
  render action: :show
  # render :showと省略可
end
```

####・partialオプション
部分テンプレートを呼び出す際に使う

```ruby

<%= render partial: "_form.html.erb" %>
```

####・templateオプション
他のコントローラーのテンプレートを呼び出すときに使う

```ruby

# usersコントローラーのcreateアクションが動いた後にpostsコントローラーのshowアクションを表示させる
def create
  User.create(user_params)
  render template: "posts/show"
end

```

####・layoutオプション
layout(application.html.erbのような複数のビューで使われるレイアウト)を呼び出す。
layoutを指定しないと自動で「application.html.erb」を呼び出しますが指定することで自分の指定通りの処理になる。

```ruby

layout 'top'

def index
  render layout: "top"
end
```

####・fileオプション
アプリケーション外(別アプリ)のテンプレートを表示させるときに使う

```ruby

render file: "別のアプリの呼び出したいテンプレートファイルのパス"
```

####・plainオプション
直接文字列を表示させたい場合に使う

```ruby
def index
  render plain: "test"
end
```

####・jsonオプション
オブジェクトをjson形式に変更して表示させたい場合に使う

```ruby
def index
  text = { name: "sato", url: "sato" }
  render json: text
end

# => { name: "sato", url: "sato" }
```

####・inlineオプション
Rubyのコードを展開し、表示させたいときに使う

```ruby
def index
  @name = "sato"
  render inline: "<%= @name %>"
end

# => sato
```
スクロールバーのデザインを変更＆ hover時のみ表示


##やりたい事

スクロールバーのデザインを変更したい
hover時だけスクロールバーを出したい

##やってみる

.wrapが親要素
.boxが子要素

.wrapにpadding入れてるので、
.boxからはみ出してる部分をoverflow: hidden;で隠して
.boxにhoverしてる時だけ、スクロールバーを表示。

このページ本体のスクロールバーは通常通り。


```index.html
<div class="wrap">
  <div class="box">
    <p>テキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
    <p>テキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
  </div>
</div>

```


```style.scss

.wrap {
   height: 500px;
   padding: 60px 40px;
   .box {
    overflow: hidden;
    &:hover {
      overflow: scroll;
      &::-webkit-scrollbar {
       width: 6px;
       height: 0;
      }
      &::-webkit-scrollbar-track {
        border-radius: 3px;
        height: 100%;
        background-color: #eeeeee;
      }
      &::-webkit-scrollbar-thumb {
       border-radius: 3px;
       background-color: #867670;
     }
  }
}
```

このやり方でスクロールバーの変更しても、
IEやfirefoxで対応してないので意味がない事を知る。悲しい。

次に試した事
##perfect-scrollbar.js

perfect-scrollbar.jsを使えばできるらしい。

参考↓

http://cly7796.net/wp/javascript/plugin-perfect-scrollbar/
https://webkcampus.com/201903/1578/

だいたいこんな感じ。

```index.html
<div class="wrap">
  <div class="scrollbar">
    <p>テキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
    <p>テキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
  </div>
  <div class="scrollbar2">
    <p>テキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
    <p>テキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
  </div>
  <div class="scrollbar3">
    <p>テキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
    <p>テキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
  </div>
</div>
...
...
...
<script src="https://cdn.jsdelivr.net/npm/simplebar@latest/dist/simplebar.min.js"></script>
<script>
  var matches = document.querySelectorAll(".scrollbar");
  var ps = new PerfectScrollbar('.scrollbar');
  var ps = new PerfectScrollbar('.scrollbar2');
  var ps = new PerfectScrollbar('.scrollbar3');
  var ps = new PerfectScrollbar('.scrollbar'){
    suppressScrollX: true
  };
</script>
```


```style.css
.scrollbar {
    position: relative;
    width: 400px;
    height: 400px;
}
.scrollbar2 {
    position: relative;
    width: 400px;
    height: 400px;
}
.scrollbar3 {
    position: relative;
    width: 400px;
    height: 400px;
}
.ps__thumb-y {
    background-color: #fd284c!important;
}
.ps--active-x > .ps__rail-x,
.ps--active-y > .ps__rail-y {
    background-color: red;
}

```

(色々変更したのでちょっと違うかも)

これだど、.scrollbar1つ1つに違う名前のclass名つけて、cssやjsの指定をしなきゃいけない。
今回の場合はwordpressで.scrollbarの要素を追加・更新する予定なので、違うclass名をつけて、、、、以降ができないため、やめました。

他の方法

↓
simplebar.js : https://arakaze.ready.jp/archives/5196
nanoScroller.js : http://jamesflorentino.github.io/nanoScrollerJS/
CustomScrollbar.js : http://eturlt.net/blog/20130612/customscrollbar/

この3つ。
・simplebar.jsはそもそもスクロールバーが表示されない問題。
・nanoScroller.jsはちょっと古い。
・CustomScrollbar.jsでできました。
デモもあるし、カスタマイズしやすいので使用しやすかった
↓
https://www.otwo.jp/blog/custom-scroller/


##まとめ
スクロールバーでも色々あるんだなぁと思いました。
【R】海面水温データOSTIAをダウンロードする

# はじめに

本記事では，Rを使って海面水温データOSTIAをダウンロードする方法を解説します．

**ご注意**：データをダウンロードする際は，対象サイトの規約等をご確認の上，サーバーに過剰な負荷をかけないように心がけましょう．

# OSTIA

[OSITA](https://podaac.jpl.nasa.gov/dataset/UKMO-L4HRfnd-GLOB-OSTIA)（the Operational Sea Surface Temperature and Sea Ice Analysis）は，英国気象庁が開発している全球規模の海面水温データです．同データは国内外の研究開発に利用されており，最近では風況マップ作成時における気象モデルの入力値としても採用されています．

- [NeoWins（洋上風況マップ）](http://app10.infoc.nedo.go.jp/Nedo_Webgis/top.html)
- [New European Wind Atlas] (https://map.neweuropeanwindatlas.eu/about)

OSTIAの概要を下表に示します．OSTIAの水平解像度は約5km（0.054°×0.054°），時間解像度は1日です．

| データ|範囲 |配信期間 |解像度              |データソース                                |ファイル形式|
|:-----|:---|:-------|:------------------|:-----------------------------------------|:---------|
|OSTIA |全球 |2006年〜|0.054°×0.054°，1日毎|人工衛星(AVH PF, AVH, AATSR, TMI) 及び現場水温|NetCDF    |

# 手順

## ユーザ登録

OSTIAはNASAのPO.DAACでNetCDF形式のファイルで配信されています．まずは[Earthdata Login](https://urs.earthdata.nasa.gov/users/new?client_id=lRY01RPdFZ2BKR77Mv9ivQ&redirect_uri=https%3A%2F%2Fpodaac-tools.jpl.nasa.gov%2Fdrive%2Fauthenticated&required_scope=country+study_area&response_type=code&state=aHR0cHM6Ly9wb2RhYWMtdG9vbHMuanBsLm5hc2EuZ292L2RyaXZl)でユーザー登録をした後，[PO.DAAC Drive](https://podaac-tools.jpl.nasa.gov/drive/files)で`Drive API Password`を入手します．

![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237116/3eb1abe1-9f6f-107d-808b-c87bc2da9802.png)

## ダウンロード

Rの`curl`パッケージを利用して，1日毎に収録されているファイル`YYYYMMDD-UKMO-L4HRfnd-GLOB-v01-fv02-OSTIA.nc.bz2`をダウンロードします．ダウンロードする際には，上記で登録した`Username`と`Drive API Password`が必要となります．

```R:download_ostia.R
# setting -------------------------------------------------------------------------------------

library(tidyverse)
library(lubridate)
library(curl)

odir     <- "." # output directory
sdate    <- "2019-01-01" # start date
edate    <- "2019-01-01" # end date

Username <- "XXXXXXX" # Username
Password <- "YYYYYYY" # Drive API Password

# function ----------------------------------------------------------------

curl_ostia <- function(url, destfile, h){
  message(str_c(" downloading: ", basename(destfile)))
  curl_download(url = url, destfile = destfile, handle = h)
}

# main --------------------------------------------------------------------

ostia_url <- "https://podaac-tools.jpl.nasa.gov/drive/files/allData/ghrsst/noaa/L4/GLOB/UKMO/OSTIA"
ostia_handle <- new_handle()

handle_setopt(handle = ostia_handle, httpauth = 1, userpwd = str_c(Username, Password, sep = ":"))

ostia_tbl <-
  tibble(cdate = seq(from = as_date(sdate), to = as_date(edate), by = "1 day")) %>% 
  mutate(
    n     = yday(x = cdate) %>% formatC(x = ., width = 3, flag = "0"),
    year  = year(x = cdate),
    file  = format(x = cdate, "%Y%m%d-UKMO-L4HRfnd-GLOB-v01-fv02-OSTIA.nc.bz2"),
    ifile = str_c(ostia_url, year, n, file, sep = "/"),
    ofile = str_c(odir, "/", basename(path = ifile))
  )

pwalk(
  .l = list(url = ostia_tbl$ifile, destfile = ostia_tbl$ofile, h = list(ostia_handle)), 
  .f = curl_ostia
  )
```

```
> source('download_ostia.R')
 downloading: 20190101-UKMO-L4HRfnd-GLOB-v01-fv02-OSTIA.nc.bz2
```
連想配列同士でfilterし新しく連想配列を作る

# コード

```javascript:sample
   let fruits = [
                { id: 1, name: 'apple' },
                { id: 2, name: 'banana' },
                { id: 3, name: 'orange' },
                { id: 4, name: 'berry' }
            ]

   let target = [
                { fruits_id: 1, name: 'apple' },
                { fruits_id: 4, name: 'berry' }
            ]

   console.log(fruits.filter(x => !target.map(t => t.fruits_id).includes(x.id)))

```

# 参考
[【JavaScript】filterとincludesで配列のデータを抽出](https://qiita.com/hirakuma/items/fd7b6492939951190496)
Basic 1. Spring Tools Suite インストール

https://spring.io/tools

1. こちらからEclipseをinstall

2. 動作確認
2.1. プロジェクトを作成する
New -> Projectの「Spring Boot」を開き、「Spring Starter Project」を選択する

NameはHello
Gradle 3.X
Java 11


Spring Webを検索
Spring Webを選択


Finish

2.2. hello worldのファイルに追記
src/main/java/com/example/hello/HelloApplication.java

```
@SpringBootApplication
の下に
@RestController
```

と

```
public static void main(String[] args) {
	SpringApplication.run(Hello2Application.class, args);	
}
の下に

@GetMapping("/hello")
public String hello(@RequestParam(value = "name", defaultValue = "World") String name) {
return String.format("Hello %s!", name);
}
```

を追加する。

Command + Shift+ O import文の補完
Command + Shift + F コードの整形


2.3. 右クリックしてRun As -> Spring Boot Appとして起動し、
URLにブラウザでアクセス
http://localhost:8080/hello

hello world!と表示されればインストールは終了。
b3スナッパーリング作成シミュレーター

# b3スナッパーリング作成シミュレーター
## シミュレーターv1
https://paiza.io/projects/e/1LyfQXK8vmvzoK6sjIKcvw

v2
https://paiza.io/projects/xJjcVFkDvCMSdJhrHGQoUw

v3
https://paiza.io/projects/t366x9oat2n1-Ttrot38jg

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617364/48d96b95-5cbc-6bcc-7f6c-7233f64f91a3.png)


## b3を何個つくるかは88行目で設定
```
var b3num = 2; // 作成するb3の数
```

## 実行を押す
```
作成したb3の合計数=2個
購入したn0の合計数=15個 1800ダイヤ 5400円
b3成功までに必要だったn0の平均=7.5個
n0が10個以内でb3成功=2回 100%
n0が11〜20個でb3成功=0回 0%
n0が21〜30個でb3成功=0回 0%
n0が31個以上でb3成功=0回 0%
n0が2個でb3成功=0回 0%
最悪の沼で必要だったn0の数=8個
```

## 大量に作ってみる
```
作成したb3の合計数=444万4444個
購入したn0の合計数=3707万65個 44億4840万7800ダイヤ 133億4522万3400円
b3成功までに必要だったn0の平均=8.34個
n0が10個以内でb3成功=329万7085回 74.18442%
n0が11〜20個でb3成功=96万1703回 21.63832%
n0が21〜30個でb3成功=15万5512回 3.49902%
n0が31個以上でb3成功=3万144回 0.67824%
n0が2個でb3成功=26万6370回 5.99333%
最悪の沼で必要だったn0の数=88個
```