OmniAICreator/Qiita-1.07M huggingface dataset:
VSCodeでPHP実行

# はじめに

短期の仕事でPHPで開発をすることに。VSCodeでPHPが使えることなので挑戦しました。
職場で借りている端末で、Windowsの環境変数を自由に設定できないという、とんでもない制約があります。

# PHPのインストール

ローカル端末で環境構築が難しいらしく、サーバーで開発するという状況。
しかも、PHP5で作られたシステムで、現役バリバリというのにも驚き。
すみません。ボヤキはこのくらいで・・・。

VSCodeでは、PHP7系しかつかえないようです。（警告ポップアップが出ました）
簡単なサンプルを作って動作確認をしたいだけなので、現時点で最新のPHP7.3.9のzip版をダウンロード。

https://windows.php.net/download/

* 「php.ini-development」をコピーして「php.ini」を作成

```php
extension_dir = "ext"
extension=mbstring
```

* PHPコマンドが実行できることを確認

```php
> php -r phpinfo();
```

# XDebugの設定

* XDebugをダウンロードしてPHPの extension_dirに配置。
[https://xdebug.org/download.php](https://xdebug.org/download.php)

* php.ini に設定を追記

```php
zend_extension="xdebug"
[XDebug]
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
```

# VSCodeの設定

* PHP Extensionパックをインストール

![php extension pack.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158071/e847e462-ddd8-0fcc-f23b-67a17b94522e.png)


* XDebugのコンフィグを追加


![Add Configuration.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/158071/51bcbf5c-8f03-a220-2c32-12761bf975d8.png)

* runtimeExecutableを追記

```json
{
    "version": "0.2.0",
    "configurations": [                
        {
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9000
        },
        {
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "${file}",
            "cwd": "${fileDirname}",
            "runtimeExecutable": "C:\\php\\php.exe",
            "port": 9000
        }
    ]
}
```



# 参考サイト
* [VSCode でローカルで CLI の PHP をデバッグ実行する](var.blog.jp/archives/74885536.html)
* [PHP in Visual Studio Code](https://code.visualstudio.com/docs/languages/php)
* [PHP Debug Adapter for Visual Studio Code](https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-debug)
* [https://windows.php.net/download/](https://windows.php.net/download/)
AWS 認定デベロッパー アソシエイト 合格記

先日、AWS認定デベロッパー アソシエイト(DVA)を受験し合格しました！
本記事では、試験の概要と合格までの受験勉強法を記しております。

![developer-associate-tag_360x32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203706/8c33a02d-8c6d-8245-8c43-efd964a37cf0.png)

# 前置き

## 私の経験
AWSの経験は3年ほどになります。最初はAWS上で動作する業務アプリケーションの開発、運用を行うチームにアサインされ、先輩たちにAWSのいろはを叩き込んでもらいました。現在はコンテンツサイトの開発と、オンプレで動作するアプリケーションのAWS移行設計を業務として担当中です。2019年3月にはAWS認定ソリューションアーキテクト アソシエイト(SAA)を受験し合格しております。EC2,RDSといった基本的なサービスの利用や、SDK(JavaScript)でリソースを管理するスクリプトを作成したり、サーバレスアプリケーションを趣味で作ったりと手を動かすこともしてきましたが、利用経験のないサービスもたくさんあります。

## 動機
AWSを利用する業務が続いているのと、単純に知識を増やしたいというのが大きな動機です。とくに上述のように利用経験のないサービスに関する知識を取得し、自分で使いこなせるようになりたいなと思っていました。またSAAでは設計概念や基礎を学べましたが、DVAはCLIやSDK、サービスの細かい設定などデベロッパーとしての知識が問われるため、デベロッパーとして取得しない理由はないと思い、学習に入りました。

# 試験の概要
公式：https://aws.amazon.com/jp/certification/certified-developer-associate/

以下、上記リンクより抜粋

認定によって検証される能力

- AWSの主要なサービス、使用方法、AWS の基本アーキテクチャのベストプラクティスについて理解していること
- AWSを使用するクラウドベースのアプリケーションの開発、デプロイ、デバッグについて習熟していること


形式：複数の選択肢と複数の答えがある問題
実施方式：テストセンター
時間：130分間
受験料金：￥15,000 （税別）

SAAはアーキテクト担当者を対象とする試験で、こちらの試験はAWSベースのアプリケーション開発や保守経験のある開発担当者を対象とする試験となっております。


# 私の勉強法
## Developing on AWS
公式：https://aws.amazon.com/jp/training/course-descriptions/developing/

AWSが提供する3日間のトレーニングです。DVAの推奨トレーニングとしての位置付けで、主にSDKを用いた開発を学習できます。試験対策を行ってくれるトレーニングではないですが、試験の出題範囲と大きくかぶるため大変おすすめです。CLI,SDK,IAM,S3,DynamoDB,lambda,APIGateway,SQS,SNS,ElastiCache,ECS,Beanstalkなどを中心に、座学ベースで知識を教えてもらえました。ハンズオンも多くあり、SDKを用いて各サービスを利用するような内容で、学習した内容をすぐに実践できるようなものでした。講義中はトレーナーの方が重要な観点に絞って教えてくれることもあって、効率的に知識を吸収できます。ただし料金が210,000円と高い...


## Black Belt Online Seminar
AWS サービス別資料：https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/

AWSが提供するサービスごとの資料になります。こちらはすべて無料で参照できるものになっております。無料とは思えないほどのボリュームと、スライドベースで構成されているため資料としてかなりわかりやすいです。またすべてではないですが、一部講義形式(Youtube)のコンテンツもあります。理解したいサービスや苦手なサービスを重点的に学習することができます。

## WHIZLABS
AWS Certified Developer Associateコース:https://www.whizlabs.com/aws-developer-associate/

DVA対策用のWeb問題集です。ただし有料（US$19.95）で、英語のみの提供です。しかし700問以上もの問題があるのと、何回も繰り返し解くことができるので、試験前は多くの時間を割いてこちらの問題集に取り組んでいました。すべて英語ですが、Google翻訳に頼りながら実施すれば特に困るようなことはありませんでした。また問題の解説部分にソースとなるAWS公式ページへのリンクがあり、あわせて確認することができました。
こちらもコスパ的にはかなりおすすめです。

## 手を動かす
試験対策としてではないですが、興味本位で様々なサービスを触ってきました。SAMを使ってサーバレスアプリケーションを構築したり、APIGateway+lambdaを使ったSlackbotを作ったり、SDKを使って構築用スクリプトを作成したり...。とくにDVAはオプション,パラメーター,CLI,SDKに関する問いが多いため、知識だけで理解しようとするのはある程度の限界があると感じました。結局自分で調べて手を動かすのが、一番記憶の定着率が高いと思います。

# 本番
純粋な知識を問う問題が少なく、パッと問題を見たときには「うわ、結構難しい...」と感じました。場面に応じて適切な選択は何か？こういうときにはどうすればよいか？など、実際のシーンにあった正しい知識をひねり出さないといけないといった印象でした。試験時間には余裕があって、何回か見直すことができました。
試験が終わるとすぐに合否が...
無事合格！

# 感想
計画を立てて行った勉強法がハマったなあといった印象です。Developing on AWSで全体的な知識の底上げ、あまり触ったことのないサービスをBlack Beltの資料を見て確認し、WHIZLABの問題をひたすら問いて正しい知識をつけていくことができたのではないでしょうか。またSAA受験時の知識もあり（結構忘れてしまっていたが...）多少上澄みがあったのもよかったのかもしれません。
反省点を挙げるとすれば、Developing on AWSのトレーニングを受けた後に、あまり時間を開けずに受験できればよかったなと感じています。私は2ヶ月ほど間を開けてしまったので、時間が経って忘れてしまったことも多々あり、もったいなかったなと感じました。
SAA,DVAと資格を取ることができたので、次は認定SysOpsアドミニストレーターアソシエイトにチャレンジしたいと思います！
Ruby Association Certified Ruby Programmer Silver / Goldを取得するまで

# Ruby Association Certified Ruby Programmer Silver / Gold
持っているだけで凄い！というような資格ではありませんが、最近周囲の人に取得した人が増えてきたので、自分だけ持っていないのも肩身が狭いなと思い、取得することとしました。

# 準備期間
Silver..２週間
Gold..1ヶ月半
試験予約の都合上、Goldが準備期間長めになりました。

# 試験対策

SilverではRuby技術者認定試験合格教本と[REx](https://rex.libertyfish.co.jp/)
Goldではそれに加えてメタプログラミングRubyで勉強しました。
業務であまり使わない知識も出題されるので、試験対策せずに望んだら絶対落ちていました。

## Silverは覚えゲー
Silverは知識を広く浅く問われる感じの試験でした。
平日は通勤時間はずっとスマホで[REx](https://rex.libertyfish.co.jp/)の問題を解いて、安定的に９割取れるまで繰り返しました。
週末はRuby技術者認定試験合格教本を読んだり、RExで間違えた問題を実際にコード動かしてみたりしました。
RExとRuby技術者認定試験合格教本の知識を身に着けておけば合格点にたどりつけると感じました。

## Goldはパズル感覚
GoldはSilverよりも馴染みのないライブラリ（Thread/Fiber/Socket/RDocなど）や大域脱出（throw/catch）などを覚えておく必要があるほかは、クラス継承、定数/メソッドの探索順、Refinementsを問われる問題が多かった印象です。
こちらも同じく平日は通勤時間を使ってずっとスマホで[REx](https://rex.libertyfish.co.jp/)の問題を解いていました。
週末はメタプログラミングRubyを読んで、Ruby技術者認定試験合格教本を一通り読んで問題を解いたほか、
試験前日はずっとRExで出題されたコードを少しづつ変えてみて、出力がどう変化するかを考え、実行して答え合わせ、というのを繰り返していました。
Goldは、Silverのように「覚えておけば解ける」というよりは、こういう仕組みでRubyが動いているから、こういう出力になる、というのをしっかり考えられるようにしておく必要があると感じました。
ただ、考えられるようになっていてもなかなか自信が持てないので、いろんなパターンのコードを作って、実際に動かす、ということを行っておくと自信をもって回答できてよいかなと思います。
【salesforce】DateTimeの書き方に注意！

#いつも調べてしまうDateTime

Apexとかでコードを書いてると普通にDatetime.newInstance（）を使って日付の宣言とかするんで
特に気にしないんですが、業務の都合上DataLoaderとか使ってSOQLで大量のデータを引っ張る時なんかに
毎度毎度リファレンスやら他の方のブログやら読んで

**何回目やこれ見るの。。。**

と自己嫌悪に陥るのは僕だけじゃないはず
(。。。と信じてる)

てことでおさらい。

日付を指定するのは下記の3つの方法がある。

YYYY-MM-DDThh：mm：ss + hh：mm
YYYY-MM-DDThh：mm：ss-hh：mm
YYYY-MM-DDThh：mm：ssZ

これをCreatedDate >= YYYY-MM-DDThh：mm：ssZ

みたいな感じでやっていく。

ただどれを使うのが正解なのか。

>dateTimeの値は協定世界時（UTC）で保存されます。dateTimeの値がSalesforceで返されるときに、組織の設定で指定したタイムゾーンに調整されます。ただし、SOQLクエリはdateTime項目の値をUTC値で返します。これらの値をさまざまなタイムゾーンで処理するには、アプリケーションによる変換処理が必要になる場合があります。

僕の理解では追いつかなかった。。。

誰か助けて偉い人。。

#profile

生まれも育ちも大阪の浪速中の浪速っ子が30才未経験からITエンジニアとして生きるブログもやってます。
よかったらみてください:muscle_tone2:

<a href="https://blogmura.com/profiles/11016817?p_cid=11016817"><img src="https://blogparts.blogmura.com/parts_image/user/pv11016817.gif" alt="PVアクセスランキング にほんブログ村" /></a>
C#からWindows API(Win32API)を使いたいときに参考になるサイト集

自分はあまり深くは理解できていないが、良さそうなとこを挙げてみる。

# APIを探す

+ [Windows API リスト(公式)](https://msdn.microsoft.com/ja-jp/windows/hh240557#MainContent)
カテゴリー別になっており使いやすそう。※<b>日本語のほうはリンクが切れている模様。</b>

+ [API別 Win32 サンプル集](http://nienie.com/~masapico/api_index.html)


（やりたいことからAPI名を調べる場合は、ググったほうがはやい。）


## APIを探す - SendMessageまわり

+ [List Of Windows Messages - WineHQ](https://wiki.winehq.org/List_Of_Windows_Messages)
Windows Messageの定義名と値の表がある。

+ [ウィンドウメッセージリスト - ちょくと](http://chokuto.ifdef.jp/urawaza/message/)

+ [Build desktop Windows apps using the Win32 API - Win32 apps | Microsoft Docs](https://docs.microsoft.com/en-us/windows/win32/)
検索窓にWM_xxxxとかを入力すれば検索できる・・はず。
 +  [Edit Control Messages - Win32 apps | Microsoft Docs](https://docs.microsoft.com/en-us/windows/win32/controls/bumper-edit-control-reference-messages)

# API定義のC#での書き方
API名が判明している前提。

+ [PInvoke](https://www.pinvoke.net/)
[公式](https://docs.microsoft.com/en-us/dotnet/standard/native-interop/pinvoke)からも参照されている。Dll名やAPI名が分かっていればここから探せる。

+ 
[NativeMethods.cs - Microsoft](https://referencesource.microsoft.com/#System/compmod/microsoft/win32/NativeMethods.cs)
internal classなので直接呼び出しはできないが、定義コードは参考になる。
.Netの基本機能のなかで使われているものだけが定義されているようで、網羅はされていないので注意（例えば`SendMessage`がない）。

ちゃんと理解できていない(`HandleRef`のあたりとかがよくわからない)ので一旦削除します。
・・・`HandleRef`は
[この辺](https://stackoverflow.com/questions/526661/intptr-safehandle-and-handleref-explained)
 [公式](https://docs.microsoft.com/ja-jp/dotnet/api/system.runtime.interopservices.handleref?view=netframework-4.8) によるとGC対策っぽいけど型のサイズが合ってないような。。。
⇒型の扱いについては[特殊なルールが適用されているよう](https://docs.microsoft.com/en-us/dotnet/standard/native-interop/type-marshaling)

なお、`SendMessage`の`IntPtr`型のパラメータを`int`で書いているようなサイトのコードは64bit環境を考慮していないので、そのままでは使わないほうがよい。(`msg`パラメータは`uint`(もしくは`int`)だが)


# 属性の指定
属性(`[return: MarshalAs(UnmanagedType.Bool)]`みたいなの)のつけかた。

+ [【Windows/C#】なるべく丁寧にDllImportを使う - Qiita](https://qiita.com/mitsu_at3/items/94807ee0b3bf34ffb6b2)

+ [公式](https://docs.microsoft.com/en-us/dotnet/standard/native-interop/best-practices)

# 型の読み替え

.Net(C#)とWin32API(C言語)の型の対応関係

+ [公式](https://docs.microsoft.com/en-us/dotnet/standard/native-interop/best-practices#common-windows-data-types)

+ [公式 その2](https://docs.microsoft.com/en-us/dotnet/standard/native-interop/type-marshaling)

+ [変数の型 - Cactus Software](http://www.cactussoft.co.jp/Sarbo/divManageMarsh1.html)

# 値の読み替え
C言語の`NULL`は、C#の`IntPtr.Zero`

# 構造体の扱い

よく使う属性指定：`[StructLayout(LayoutKind.Sequential)]`

+ [【保存版】構造体のマーシャリングのまとめ](https://tech.blog.aerie.jp/entry/2015/08/13/155225)

## 構造体内の固定長配列の扱い

よく使う属性指定：
`[MarshalAs(UnmanagedType.ByValTStr,SizeConst=要素数)]`
`[MarshalAs(UnmanagedType.ByValArray,SizeConst=要素数)]`

+ [メンバに配列を持つ構造体のマーシャリング - schima.hatenablog.com](http://schima.hatenablog.com/entry/20090620/1245425357)

+ [C#のためのC++の配列、構造体、ポインタの変換処理 - TomoSoft](https://tomosoft.jp/design/?p=4647)

## 共用体の扱い
Cの`union`, C#の`[FieldOffset()]`には気を付けよう。

+ [C# SendInputによるマウス操作の落とし穴 - 64bitの罠](https://qiita.com/kob58im/items/5a9d909377272d74eefd)
SQL DDL,DMLでできること[備忘録]

SQL

SQL（Structured Query Language）はリレーショナルデータベース（RDB）の操作を行うための言語
・リレーショナルデータベースとは
データをテーブルという表形式の構造で管理するデータベースのこと

SQLはデータベースやテーブルに対して様々な命令を行いますが、
その命令は大きく2つ、
・データを定義するDDL（Data Definition Language）
・データを操作するDML（Data Manipulation Language)

・DDLの出来ること

・create　 データベースやテーブルの作成
・ALTER　　データベースやテーブルの更新
・DROP     データベースやテーブルの削除

・DMLの出来ること

・INSERT　　データの登録
・UPDATE　　データの更新
・DELETE　　データの削除
・SELECT　　データの検索
ABC137 C - Green Binをハッシュ法で解いてみた(備忘録)

# [C-Green Bin](https://atcoder.jp/contests/abc137/tasks/abc137_c)

自分用備忘録として置いておきます。

c++の代表的なハッシュ法関連のSTLコンテナにunordered_mapというものがあります。ABC137のC問題ではこのハッシュコンテナを利用するのですが、unordered_mapの存在は知っていても使えないと意味がないということで実際にソースを書いてみました。

>**C-Green Bin**
>実行時間制限: 2 sec / メモリ制限: 1024 MB、配点:300点

>**問題文**
>文字列aに含まれる文字を何らかの順序で並べることで得られる文字列をaのアナグラムと呼びます。
>例えば、"greenbin" は "beginner" のアナグラムです。このように、同じ文字が複数回現れるときはその文字をちょうどその回数だけ使わなければなりません。

　beginnerという文字列内の文字を何度か交換するとgreenbinというアナグラムを作ることが出来る。今回の問題は、いくつかの文字列が与えられた時に、同じアナグラムになる組み合わせは何個作れるかということを求めています。

**入力例１**
　N=3 (文字列が3つ)
　acornistnt
　peanutbomb
　constraint

　1つ目の文字列において、acornistntの文字を入れ替えるとconstraintを作ることができ、これは3つ目の文字列constraintに一致します。アナグラムが同じになるかどうかはc++のsort関数を使ってアルファベットの昇順に並べ替えれば良いでしょう。もちろん例えば、appleという単語はソートするとaelppなどのような意味不明なアナグラムに変換されますが、意味のある単語にするのが目的なのではなく、同じアナグラムでさえあれば同じ組としてカウントするというのが重要です。上記の例では1番目と3番目の文字列が同じアナグラムを作ることが出来るので回答としては1が正解になります。

　しかし制約条件の都合上、単純にすべての文字列をソートしてアナグラムを全探索で比較、カウントしている制限時間を超過してしまうので、同じアナグラムが出現したら、その出現回数を記録しておくことで計算時間を飛躍的に向上させることが出来ます。これにはunordered_mapというハッシュコンテナを利用して解くことが出来ます。unordered_mapではキー値としては文字列をソートした後のアナグラムを指定し、その値として出現回数をペアで保存しておけばよいでしょう。

aab, baa, abaという文字列があった場合
ソートするとすべてaabとなる為、aabをキー値としておけば、その出現回数は3回になります。
入力1回目：aab　→　["キー値" : 値] = ["aab" : 1]
入力2回目：baa　→　["キー値" : 値] = ["aab" : 2]
入力3回目：aba　→　["キー値" : 値] = ["aab" : 3]
というふうになります。

これをunordered_mapを利用して実装してみた結果が以下のようになります。

```c++:sample.cpp
#include <bits/stdc++.h>
#define rep(i, n) for(int i=0; i<n; i++)

using namespace std;

void solve() {
	int n; cin >> n; // 文字列の個数を入力
	vector<string> s(n); // 文字列の配列
	unordered_map<string, long long> um(n); // 既に出現した文字列を格納するハッシュコンテナ
	rep(i, n) cin >> s[i]; // 文字列入力

	long long res = 0; // 同じアナグラムの出現回数
	for (int i = 0; i < n; i++) {
		// 文字列をソートしてアナグラムを得る(cdbaとかならabcdと昇順(もしくは降順でも可)に並べ替える)
		sort(s[i].begin(), s[i].end());

		// 同じアナグラムの出現回数を記録、更新しておく
		um[s[i]] += 1;

		// 同じアナグラムが2回以上出た時に組数-1を足す
		res += um[s[i]] - 1;
	}
	cout << res << endl;
}

int main(void) {
	solve();
	return 0;
}
```

以上です。誤りや質問などございましたらコメント欄から知らせてください。
[AWS] JAWS DAYS 2019 で登壇しました

# JAWS DAYS 2019 で登壇してきました

ずっと公開するの忘れてましたが、JAWS DAYS 2019 で登壇してきましたので、その時の記事になります・・・
あれから時間も立っているので、発表した内容にちょっとした補足もつけたいと思います。

## 登壇内容

- [Security] 1日でSSHをやめることができた話 ~AWS Systems Manager Session Manager 導入と運用Tips~
    - https://jawsdays2019.jaws-ug.jp/session/1311/
- [BigData] 数十億レコードのRDS MySQL5.6を1週間程でAurora MySQL5.7へ移行した時の話
    - https://jawsdays2019.jaws-ug.jp/session/1650/

## 背景
今までこういったコミュニテイーでの登壇経験はなかったのですが、AWS に触れてきて現状の自分の伝えたいことを伝えることはできるのかなー？と思い、本当になんとなく応募してみたら採用されました。

## 登壇に向けて
そもそも自分の性格として、人前で話すこと自体があまり得意ではありません。なので結構準備は入念に行いました。

- 発表資料
    - 初めは自分の思うままに作成しました
    - 会社の人たちを捕まえてレビューをしてもらいました
    - できる限りシンプルになるように心がけました
- 発表
    - とにかく時間をはかりまくりました
    - 早口にならないように気をつけました
    - 間をめちゃくちゃ考えました
    - 恥ずかしがらないような態度を心がけました

今まで経験したことがないことなので、資料作成や練習もはじめは照れながらやってしまっていたのですが、とてもみっともないことだと自覚して、ダメでもともとだと思いながら思い切って練習をしました。(この時の思い切りが自分にとってはとてもよかったです)

あと、ドキュメントの書き方やパブリックスピーキングの書籍なども何冊か読みましたが、要点だけは参考になりました。
例えば、

- ドキュメント
    - 伝えたい内容により構成を変える
    - 技術的なものは時系列が合うことが多い
- パブリックスピーキング
    - 緊張はするものなので、緊張している状況をそのようにコントロールすることが重要

など、極々当たり前のような事柄ですが、改めて言葉として理解することである程度の支えになったと思います。

## 登壇

登壇自体はあまり緊張もせず、それとなくできたのかな？と思っています。登壇ステージと参加者の方々の座る場所に段差があり、目線が同じではなかったり、ある程度最前列と距離があったりしたからかもしれません。

自分としてはそれよりも登壇前の方が緊張しました。知り合いが一人もいなかったり、自分以外の人は結構仲良く見えたり、精神的にちょっとビビってたのもあってきつかったですw

イベント全体としてはとても賑やかで、お祭りみたいな感じでした。長時間滞在する場合は知り合いがいた方がより楽しめると思いました。

あとお昼ご飯もらうの人数多すぎてめっちゃ大変。

## 登壇してみて

登壇してよかったと心から思えます。色々自身に繋がる部分もありますし、色々な方々と出会えることが何より素晴らしいと思います。
ただ、コストはかかると思うので絶対に登壇した方がいいとかではなく、自身の状況と相談しながらベターな状態で参加できるのが一番いいのかなと思います。（自分は人前でのアウトプットがかなり苦手なのでそれなりのコストがかかりました）

自信がないから応募もしないとかは非常に勿体無いので、何か伝えたいことがある場合応募してみるのもいいと思います。


## 発表内容への補足

https://jawsdays2019.jaws-ug.jp/session/1311/ についてちょっと補足です。

### KMS を利用した暗号化ができるようになりました

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-preferences-enable-encryption.html

暗号化万歳！

### セッションマネージャーが SSH と SCP のトンネリングサポートを開始

https://aws.amazon.com/jp/about-aws/whats-new/2019/07/session-manager-launches-tunneling-support-for-ssh-and-scp/

なんとこちらを利用すれば、パブリックなインスタンスがなくても RDS にアクセスできるようになります！

```
host i-*
      ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
```

こんな感じで SSH するときに ProxyCommand で SessionManager を利用することにより、プライベートなインスタンスでトンネリングして RDS に接続できます。これでパブリックなインスタンスは世の中から無くなりますね！（極論）

## 最後に

今更な記事になってしまいましたが、とてもいい思い出と経験なので記事としてあげさせていただきました。
本当に登壇してよかった。
SwiftUIで背景いっぱいにグラデーションで描画してみた

# 環境
* Xcode(11.0 Beta)
* macOSCatalina(10.15 Beta)

# 背景を設定する
⌘+クリックからのインスペクターから、backGround設定できるやん。
と気づいて生成された結果がこちら

``` swift
struct ContentView: View {
    var body: some View {
        VStack {
            Text("Hello World")
        }
        .background(Color.blue)
    }
}
```
思ってたのとぜんぜん違うじゃん！どうなってんの！
<img width="1024" alt="shot1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418332/a05667e8-b160-c10b-b229-a0b1af40177b.png">

## ちょっと調べてみた
+ボタンからパーツを選択するときにZStackとか言うものがあるみたい
(チュートリアルはまだ途中までしかやってないので知らず...)
公式にこんな事が書いてました。
「ZStack A view that overlays its children, aligning them in both axes.」
ようは重ねる事ができるってことですね。
画像の上にテキスト表示するときとかで使えそうですね。

Zstackでやってみた結果がこちら

``` swift
struct ContentView: View {
    var body: some View {
        ZStack {
            Color.red
            Text("Hello World")
        }
    }
}
```
おっいい感じ
<img width="1020" alt="スクリーンショット 2019-09-18 21.52.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418332/555df1e8-42e3-845d-dccd-cfd8996f21d2.png">


## 外枠の部分も表示しよう
``` swift
struct ContentView: View {
    var body: some View {
        ZStack {
            Color.red.edgesIgnoringSafeArea(.all)
            Text("Hello World")
        }
    }
}
```
<img width="1028" alt="スクリーンショット 2019-09-18 21.57.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418332/05e14c37-0dd7-b6d7-ff2d-931e0aa6c528.png">


# グラデーションの設定
LinerGradientってそれっぽい名前のものがあったから、言われるがままに引数を埋めてみた。

``` swift
struct ContentView: View {
    
    let backGroundColor = LinearGradient(gradient: Gradient(colors: [Color.blue, Color.green]), startPoint: .top, endPoint: .bottom)
    
    var body: some View {
        ZStack {
            backGroundColor.edgesIgnoringSafeArea(.all)
            Text("Hello World")
        }
    }
}
```
<img width="1083" alt="スクリーンショット 2019-09-18 22.12.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418332/1c000c47-db0b-b48f-c9a7-c39c8717ef8a.png">


# 完成形(斜めのグラデーション)
``` swift
import SwiftUI

struct ContentView: View {
    
    var body: some View {
        ZStack {
            self.backGroundColor().edgesIgnoringSafeArea(.all)
            Text("Hello World")
        }
    }
    
    /// 背景グラデーションを作成する
    private func backGroundColor() -> LinearGradient {
        // 左上から右下にポイントを設定する。
        let start = UnitPoint.init(x: 0, y: 0) // 左上(始点)
        let end = UnitPoint.init(x: 1, y: 1) // 右下(終点)
        
        // 「Color」は以前の「UIColor」からの変換もできるぞ！ 助かる。
        let colors = Gradient(colors: [Color(UIColor.blue), Color(UIColor.green)])
        
        let gradientColor = LinearGradient(gradient: colors, startPoint: start, endPoint: end)
        
        return gradientColor
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
```
<img width="1090" alt="スクリーンショット 2019-09-18 22.23.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418332/1d278082-7f97-4643-db94-8c430968b025.png">


# あとがき
まだSwiftUIチュートリアル2章までしか終わってないけど、やってみたかったので作りました。
まだまだ勉強中ですが使いこなせれば、今までのStoryBoardよりもメンテしやすい設計にできると思います。
MassiveViewControllerからは卒業しよう！
MATLAB 学習済みDNNモデル16本ノック

# はじめに
MATLABのツールボックスの１つに、Deep Learning Toolboxがあります。これの秀逸な機能として、学習済みDNNのモデルを簡単に利用できます。

利用できるモデルは、2019bにて<b>16個</b>とかなり多いです。
https://jp.mathworks.com/solutions/deep-learning/models.html
そんなわけで、同じ画像を一挙に16個のモデルに投げて遊びます。

# ところで

今回役立つのが、MATLAB Onlineです。
[MATLAB Onlineについてはこちら](https://qiita.com/motorcontrolman/items/a4866009422cee9f9619)
学習済みモデルの利用は、インストール版でももちろん可能ですがモデル毎にアドオンのインストールが必要で、だいたい１つ当たり5~10分程度かかります。（[例：GoogLeNetのアドオン](https://jp.mathworks.com/matlabcentral/fileexchange/64456-deep-learning-toolbox-model-for-googlenet-network)）
MATLAB Onlineはこのアドオン適用済みの状態なので、この手間すら省けます。今回紹介するサンプルであれば、アドオンを２つほどインストールしている間に実行が可能です。

実際にかかった時間はコード書くのに5分、結果出るまで10分というところです。
クラウドベースである都合上、結果出るのは少し遅いです。

# コードと実行結果

```matlab
clear all;
close all;

netname = {'alexnet','googlenet','vgg16','vgg19',
    'mobilenetv2','nasnetlarge','nasnetmobile','shufflenet',
    'xception','densenet201','squeezenet','resnet18',
    'resnet50','resnet101','inceptionresnetv2','inceptionv3'};

img = imread('edamame.JPG');


for i = 1:4
    for j = 1:4
        txt = ['net =' netname{i,j} ';' ];
        eval(txt);
        reimg = imresize(img,net.Layers(1).InputSize(1:2));
        result{i,j} = string(classify(net,reimg));
        
    end
end
```

画像はまたしても枝豆です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/630786f1-d4da-6f28-fb89-24962ce6b1e9.png" width=400>


試したモデル名
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/186a84a6-6b73-5816-ae25-9eb9cf90c0fc.png)

分類結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302506/e9c7a705-1a74-11f0-0bc9-0e6bcee585d1.png)

<b>もしかして私の知らないうちに、枝豆をカルボナーラと呼ぶ法律でも出来た？</b>

あとGranny Smithって誰だよと思いましたが[リンゴの一種](https://ja.wikipedia.org/wiki/%E3%82%B0%E3%83%A9%E3%83%8B%E3%83%BC%E3%82%B9%E3%83%9F%E3%82%B9)だそうです。

# まとめ
・どうやら枝豆が存在しない世界線に飛ばされたらしい。
・DNN研究者の皆様、どうか枝豆を識別できようにして下さい。
JavaScriptで電車賃計算

電車賃計算をJavaScriptを使って答えを出したいのですが（else if）がうまくいかず難航してます。
[ HTML ]
![carbon (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469676/45c76309-1003-8ac7-7366-dddc5c616da7.png)
[ JavaScript ]
![carbon (3).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469676/9ae3435e-59eb-67cb-24fd-14226e4a93d7.png)

・ifでselectから取得した値が同じならばMapから電車賃を取得してresultへ出力
・値が違っていれば（else if）で、Mapから別の値を取得

という動きをさせたいのですが毎回一番最後に書いた（else if）が反映されます。

どこのコードが間違っているのかわからず悩んでおります。
ご助言いただけたらと思います。
よろしくお願いします。
Pythonでargparseをファイル間共有する

# Usecase
複数のプログラムファイルに渡ってコマンドライン引数を共有したい

# Method
ArgmentParserで作ったNamespaceオブジェクトをpickleでdump/loadする

# Example
`writer.py`でコマンドライン引数を受け取ってdump / `reader.py`でload

``` shell
$ python writer.py -i hope -p args.pkl 
Namespace(input='hoge', path='args.pkl') # print(args)
$ python reader.py 
hoge # print(args.input)
```

``` writer.py
import argparse
import pickle
from pathlib import Path

def get_args():
    parser = argparse.ArgumentParser(description='receive arguments')
    parser.add_argument('-i', '--input', required='True', help='input')
    parser.add_argument('-p', '--path', required='True', help='output path')

    return parser.parse_args()

def main():
    print(args)
    with open(args.path, mode='wb') as f:
        pickle.dump(args, f)

if __name__=='__main__':
    args = get_args()
    main()
```

```reader.py
import pickle

def main():
    with open('args.pkl', mode='rb') as f:
        args = pickle.load(f)
    print(args.input)

if __name__=='__main__':
    args = get_args()
    main()
```

readerでもargparseを使う場合混同してしまいそうなのでよくないかも。
[VS Code] Javascriptのチェックツール「ESLint」を設定してみた

#ESLint設定理由
業務で書いたソース内に以下のように読みにくい部分が多くなっていた。

　・ 「""」 と 「''」 が混在している
　・ 文末の「；」の有無が統一されていない
　・ インデントのスペースが統一されていない

そして、ESLintで簡単に修正できることを知り設定。

#ESLintの設定
VS CodeにESLintを設定する
https://qiita.com/Mount/items/5f8196b891444575b7db

#ESLintのいろんな設定
ESLintのルールを全部手動で設定するのは大変だからやめておけ
https://qiita.com/khsk/items/0f200fc3a4a3542efa90
ARKitのAR文字をキレイにした話

## はじめに

ARKitを使ったSNSアプリ[ARIZAR](https://www.arizar.com/jp/)を開発しています。
開発している時にわかったTIPS的なネタを記事にします。

ぜひ[ARIZAR](https://www.arizar.com/jp/)をダウンロードして使ってみてください。
よろしくお願いします。

## 今回の課題

初期のAR文字をみると、すごく文字がカクカクしています。
最近のバージョンはかなり文字がスムーズになっていることがわかるかなっと思います。
その改善点について書きます。

| 改善前 | 改善後 |
|:-:|:-:|
|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/8f912738-f0da-83c3-9c14-62673f2cfdec.jpeg" width = 400>|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42735/a99090fd-a572-f4d9-592e-d9f619d039c0.jpeg" width = 400>   |

## なぜカクカクしているの？

`SCNText`を使って文字を空間に置いているのですが、色々検索していたらヒントとなるサイトを発見しました。

> SCNTextは、Core Graphicsが描画した場合と同じように、テキストの2Dベジェパスを細分化します。スムーズにするためにflatnessプロパティをいつでも使用できますが、「サブピクセルの滑らかさ」は得られません。
この問題を解決するには、より大きなフォントサイズを使用して、基になるベジエパスをより大きくし、離散化が発生したときにより多くの頂点を生成するようにします。
[ios – 曲線のないSCNTextレンダリング、フォントのようではない](https://codeday.me/jp/qa/20190705/1174228.html)より

要するに、大きな文字を描画して小さく縮小すれば良いのではないかということがわかりました。

## 実際に試してみる

元々はこのようなコードになっていました。

```swift:改善前
        //カメラの現在位置を取得する
        guard let camera = sceneView.pointOfView else { return }

        let textGeometry = SCNText(string: message, extrusionDepth: 0)
        textGeometry.firstMaterial?.diffuse.contents = UIColor(named: "ArizarARFontColor")
        textGeometry.font = UIFont(name: "HiraginoSans-W6", size: 1)
        let textNode = SCNNode(geometry: textGeometry)
        let position = SCNVector3(0,0.1,-0.1)
        textNode.position = camera.convertPosition(position, to: nil)
        //カメラの向きに合わせる
        textNode.eulerAngles = camera.eulerAngles
        //大きさ設定
        textNode.scale = SCNVector3(0.01,0.01,0.01)

        sceneView.scene.rootNode.addChildNode(textNode)
```

`UIFont`のサイズを1→100に、scaleを0.01→0.0001に修正してみました。

```swift:改善後
        //カメラの現在位置を取得する
        guard let camera = sceneView.pointOfView else { return }

        let textGeometry = SCNText(string: message, extrusionDepth: 0.8)
        textGeometry.firstMaterial?.diffuse.contents = UIColor(named: "ArizarARFontColor")
        textGeometry.font = UIFont(name: "HiraginoSans-W6", size: 100)
        let textNode = SCNNode(geometry: textGeometry)
        let position = SCNVector3(0,0.1,-0.1)
        textNode.position = camera.convertPosition(position, to: nil)
        //カメラの向きに合わせる
        textNode.eulerAngles = camera.eulerAngles
        //大きさ設定
        textNode.scale = SCNVector3(0.0001,0.0001,0.001)

        sceneView.scene.rootNode.addChildNode(textNode)
```

そうすると、改善されてキレイな文字が描画されました。

## 最後に

簡単でありますが、文字がスムーズではなく不満がある方の参考になったらうれしいです。
【Rails】google mapを表示させよう

#概要
今回はGoogleMapを任意のビューに表示させる方法について解説します
#準備
ビューファイルとgoogle mapのAPIキーを準備しましょう
##APIキー
公式サイト（https://console.developers.google.com/?hl=ja ）から手順に沿ってAPIキーを取得しましょう
今回は省略します
#ビュー

```html:
<div id="map" style="width: 500px;height: 350px;"></div>

<script>
      var map;
      function initMap() {
        map = new google.maps.Map(document.getElementById('map'), {
          center: {lat: -34.397, lng: 150.644},
          zoom: 8
        });
      }
</script>

<script src="https://maps.googleapis.com/maps/api/js?key=APIキー&callback=initMap"
    async defer></script>
```

解説、始めます！！！

`var map;`
まず、マップの変数を定義します
`new google.maps.Map(document.getElementById('map')`
そしてマップをビューのidがmapの要素に生成します
`center: {lat: -34.397, lng: 150.644},`表示させるマップの中心を設定します
`zoom: 8`マップの倍率を設定します
公式ドキュメントによると
1: World
5: Landmass/continent
10: City
15: Streets
20: Buildings
が基準のようです
参考に設定してみてください

最後に
`APIキー`の部分に個人で取得したAPIキーを代入してください！！

これで表示が完璧です！！

他にもピン留め、ピンからウィンドウを表示させたり、地名や建物名から検索もできます！！
色々やってみましょう！！
###質問、気になるところなどございましたらコメントよろしくお願いします
Vueで<select>タグを使う時に、選択されているvalue属性をスクリプトで決定する方法について。

Vue
`v-model`を使います。

概要：
`select 要素`の`v-model`にした変数に対して、`option 要素`に設定されたvalueと同じ値を代入すれば良い。

```vuejs:html
<select v-model="selectNumber" v-on:change="selectIndex">
    <option v-for="item in valueList" v-bind:value="item.number">{{item.title}}</option>
</select>
```

```js:vue_component
var vueComponent = {
  data: {
    //
    // @note: v-modelに束縛、ここで選択状態の初期化も行う。
    //
    selectNumber: 1,

    //
    // @note: 選択項目にするデータ
    //
    valueList: [{title:"one", number:1},{title:"two", number:2}],
  },

  method: {
    //
    // @note: ここでスクリプト側から select 要素の選択状態を設定する。
    //
    setSelectNumber: function(idx){
      // selectのv-modelで束縛した変数に value属性の値を代入すれば実際に変更される。
      this.selectNumber = valueList[idx].number;
    }
  }
}
```
F# Pipeline Operatorで末尾再帰最適化が効かない？

AtCoderの過去問をF#で解いていてTLEに長時間悩まされたのでメモ。

int32では合算値が桁あふれしてしまう場合の対策として次のような自作関数を定義して使っていた。

```fsharp
let bigSum (arr : int []) =
    let rec loop (i : int) (sum : int64) =
        if i < 0 then sum
        else (sum + int64 arr.[i]) |> loop (i - 1)
    loop (arr.Length - 1) (int64 0)
```

しかし `(sum + int64 arr.[i]) |> loop (i - 1)` の書き方では10の5乗の要素があるような配列を与えた際に極端に速度が遅くなりTLEしてしまう。

```diff
let bigSum (arr : int []) =
    let rec loop (i : int) (sum : int64) =
        if i < 0 then sum
-       else (sum + int64 arr.[i]) |> loop (i - 1)
+       else loop (i - 1) (sum + int64 arr.[i])
    loop (arr.Length - 1) (int64 0)
```

このように書き直すと改善された。
それ以上の検証はしていないが、おそらくパイプライン演算子を用いた前者の書き方では末尾再帰最適化か効かないということだと推測している。

原因の突き止めには[コードテスト](https://atcoder.jp/contests/abc141/custom_test)が非常に役立った。

こちらに下のコードを貼って実行すると、

```fsharp
open System

let bigSum (arr : int []) =
    let rec loop (i : int) (sum : int64) =
        if i < 0 then sum
        else loop (i - 1) (sum + int64 arr.[i]) // 末尾再帰
    loop (arr.Length - 1) (int64 0)

[<EntryPoint>]
let main _argv =
    let n = 10.0 ** 5.0 |> int
    let aList =
        [ for _ in 0..n - 1 -> 10.0 ** 9.0 |> int ]
        |> List.toArray
    bigSum aList |> printfn "%d"
    0 // return an int exit code

```

終了コード 0
実行時間 60 ms

という結果になる。

一方、問題の書き方をすると、

```fsharp
open System

let bigSum (arr : int []) =
    let rec loop (i : int) (sum : int64) =
        if i < 0 then sum
        else sum + int64 arr.[i] |> loop (i - 1) // 末尾再帰最適化が効かない？
    loop (arr.Length - 1) (int64 0)

[<EntryPoint>]
let main _argv =
    let n = 10.0 ** 5.0 |> int
    let aList =
        [ for _ in 0..n - 1 -> 10.0 ** 9.0 |> int ]
        |> List.toArray
    bigSum aList |> printfn "%d"
    0 // return an int exit code

```

終了コード 9
実行時間 10508 ms

となる。

手元の端末だと後者のコードでも一瞬で処理が終わったのですぐ原因がわからなかった。
動作環境のスペックの違いによるものだと思うが、手元環境では `.NetCore SDK 2.2.401` AtCoderでは `Mono4.0` というランタイムの違いもあり、ひょっとしたらこちらということもあるかもしれない。
ファイル読み込み色々【R言語・小技】


base関数のファイル読み込みについて

#職人の朝はデータの読み込みから始まる....

・ファイルを選択して読み込む

日常的によく使うのはchoose.files()を使ってfileのpathを取得して、
read csvなりtxtなりで読み取る方法。

ファイルの検索画面(エクスプローラー)が出るので便利。

```R
file_path <- choose.files()
csv_data <- read.csv(file_path
```

ただこの方法だと分析途中で何を元ファイルとして指定したのか分からなくなったりする。
さらに、スクリプト全体を選択して実行すると毎回ファイル選択を聞かれるのでうるさく感じる。

使った後は素早くchoose.files()をコメントアウトしておくのがいいかと思います。


・場所を指定しておく

choose.files関数はファイルをエクスプローラーから検索してくれるので、探しながら、選びながら、が可能だった。
ファイル置き場やアウトプット用のフォルダが決まっているならばワーキングディレクトリを指定する。

```r
setwd("C:\\users\\desktop\\csv_folder")
csv_data<-read.csv("data.csv")
```

ワーキングディレクトリを指定しておけばcsvファイルの名前だけを指定して読み込むことが出来る。

後から見返した時にどのcsvをどこで使用したのかわかるので便利。

・複数ファイルがあるとき

複数のcsvファイルがあり、プログマチックに読み込ませたい。

たとえばフォルダ内に01.csv,02.csv,03.csv・・・・・100.csvのように100個csvがある。

名前に規則性があるなら変数に名前をいれておいて、for文で実行するのもいいと思う。

01,01,03・・・というデータを使って図を描きたいとするなら以下のようになる。

```R
for (i in 1:100){
  csv_name<-paste0("0",i,".csv")
  csv_data<-read.csv(csv_name)

  png(paste0("0",i,".png"))
  plot(csv_data)
  dev.off()
}
```

これで01から100までのデータを読み込み、01.png, 02.png・・・　という名前で保存してくれる。

・ファイル名に規則性が無いとき

20150101.csv, 20170516.csv, 20180831.csv ・・・
などファイル名に規則性が無いときには、ファイルの置いてあるフォルダに入っている".csv"と名前につくものをリスト化してしまう。

```R
file_list <- list.files()
```

これでファイル名すべてを取得できる。
csvしか入っていないフォルダなら、これですべて取ることができるが、
ワーキングディレクトリとして使用していて、他にもファイルがある場合、パターン指定を行う。
もちろんpath指定もできる。

file_listの一番目から順番にfor文で実行していけば上記のように自動的な読み込みができる。

```R
file_list <- list.files("C:\\Users\\Desktop\\", pattern = ".csv")

for (i in 1:length(file_list)){
  csv_data<-read.csv(file_list[i])

  png(paste0(i,".png"))
  plot(csv_data)
  dev.off()
}
```

・ファイルを結合したい

上記のようにcsvファイルを読み込めたとしても、複数のcsvファイルを結合して一つのcsvにしたい時がある。

例えば、一行目と二行目にヘッダ情報があるが、ヘッダ情報は不要でまとめたい時。
二行目まで読み込まず、縦方向へ結合させていく。
ただそrbindは、列数が一致していなければならない。
また、事前に結合した結果を収納する箱を用意しておくこと。

```R
file_list <- list.files("C:\\Users\\Desktop\\", pattern = ".csv")

bind_data <- NULL

for (i in 1:length(file_list)){
  csv_data<-read.csv(file_list[i], skip=2)
  
  bind_data<-rbind(bind_data, csv_data)
}
```

ヘッダーも欲しいときはskipでなくhedderを指定しよう。
ただし一行目だけが不要なときもある。
一行目だけスキップしてヘッダーを指定してもいい。
またまたrbindには制限があり、列名が異なっていると結合できない。

```R
file_list <- list.files("C:\\Users\\Desktop\\", pattern = ".csv")

bind_data <- NULL

for (i in 1:length(file_list)){
  csv_data<-read.csv(file_list[i], skip=1, header=T)
  
  bind_data<-rbind(bind_data, csv_data)
}
```

これでヘッダー付きの結合ができるはず。


#以上

これからちょこちょこ小技を記入していこうとおもう。
VSCodeでcommand+/でコメントアウトしようとすると{% comment %}{% endcomment %}になるとき

JavaScriptを編集していて`command+/`でコメントアウトしようとするとなぜか`//`ではなく`{% comment %}{% endcomment %}`で囲われた。
なんだこりゃと思っていたら言語モード(エディタ右下)がDjango HTMLになっていた。
つまりこれはDjangoのコメントアウト記法だった模様。
おそらく拡張入れたせい？で言語モードが変わったと思われる。
レアケースだと思うが知らないと結構驚くので残しておく。
Bashが予期しない理由で終了しました

# 問題
terminalを開くと"Bashが予期しない理由で終了しました．"と言われ，プロセスが終了した．
環境はMac OS X 10.14.6

# 解決
`.bash_profile`と`.bashrc`にて設定がそれぞれ

```
if [ -f ~/.bashrc ] ; then
. ~/.bashrc
fi
```

```
if [ -f ~/.bash_profile ] ; then
. ~/.bash_profile
fi
```
となっていて無限ループに陥っていたっぽい．
Finderとデフォルトのテキストエディタを使って編集したら使えるようになった．

なんでこんな記述が追加されていたのかは謎．
Ubuntu 18.04 LTS 時間の経過とともに画像が変化する自分用の壁紙を作る

#１．画像を用意する
壁紙にしたい複数の画像ファイルを用意してください。

#２．所定のフォルダに移す
壁紙用のフォルダにコピーします。
ドラッグ・アンド・ドロップではうまくコピーできないのでコマンドで実行します。
*ダウンロードフォルダにあるP01.jpg、P02.jpgを移動する場合以下のようになります。*

```bsh
sudo cp /home/iritani/ダウンロード/P0*.jpg /usr/share/backgrounds/.
```

#３．xmlを作る
表示する画像と表示時間、画像を切り替えるときに出す画像と切り替え時間を定義するxmlを作ります。
以下の形式でファイルを作成し、以下フォルダに*任意の名前*.xmlで保存します(ここでは仮にiritani.xmlとします)。
/usr/share/backgrounds/contest
一から作るんじゃなくて、もともとあるbionic.xmlをコピーして編集すると楽ですね。

```bash
cd /usr/share/background/contest
sudo cp ./bionic.xml ./iritani.xml
sudo gedit ./iritani.xml
```
今回はgedit使いましたが、もちろんviでもかまいませんよ。
そして以下のように編集します。

```xml
<background>　　　　　　　　　 ←　全体をこれで囲む
  <starttime> 　　　　　　　　 ←　開始時間を定義
    <year>2009</year>
    <month>08</month>
    <day>04</day>
    <hour>00</hour>
    <minute>00</minute>
    <second>00</second>
  </starttime>
  <static>　　　　　　　　　　　←　表示する時間と画像を定義
    <duration>1795.0</duration>
    <file>/usr/share/backgrounds/P01.jpg</file>
  </static>
  <transition>　　　　　　　　 ←　画像を切り替える時、前後に出す画像と、切り替え時間を定義
    <duration>5.0</duration>
    <from>/usr/share/backgrounds/P01.jpg</from>
    <to>/usr/share/backgrounds/P02.jpg</to>
  </transition>
  <static>　　　　　　　　　　　←　表示する時間と画像を定義
    <duration>1795.0</duration>
    <file>/usr/share/backgrounds/P02.jpg</file>
  </static>
  <transition>　　　　　　　　 ←　画像を切り替える時、前後に出す画像と、切り替え時間を定義
    <duration>5.0</duration>
    <from>/usr/share/backgrounds/P02.jpg</from>
    <to>/usr/share/backgrounds/P01.jpg</to>
  </transition>
```
この場合P01.jpgとP02.jpgが交互に表示されることになります。


#４．背景として設定する
設定画面から[背景]を選び、さらに[背景(B)]をクリックします。
すると以下のような背景の選択画面が出ます。
![Screenshot from 2019-09-18 20-35-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418454/b0b0dce1-ea0f-b64e-3dc0-4ef1be41891f.png)
自分で追加した画像で、かつ右下に時計のマークがついているものを選びます。
これで設定完了です。
基礎的な用語まとめ

**背景**
学習にあたり基礎となる用語をまとめていきます。
頭の中で理解はしていてもとっさに出てこないことがまだまだあるため、備忘録として書いていきます。



##ネットワークについて
- インターネットとは
    - 世界規模に張り巡らされたWANの事
- WAN(wide area network)とは
    - LANとLANをつないだ広い範囲のネットワーク
- LAN（local area network）とは
    - 限定された狭い範囲のネットワーク（家庭内とか）
- WEBとは
    - インターネット（世界規模のWAN）を利用して様々なデータを共有(閲覧配信)できるサービスのこと

##webについて
- HTTPメソッドとは
    - リクエストやレスポンスの際に使用される規格。つまりホームページを閲覧するときにwebブラウザからホームページのファイルがあるwebサーバに対し出されるリクエストのこと。様々な種類があるが主要なものを挙げていく
- HTTPメソッドの種類(主要なもの)
    - GET：リソースを取得する（webを閲覧するとき）
    - POST：リソースを作成する。入力フォーム等で記入・送信されたデータを基に新たなリソースを作成する(ユーザー新規登録とか)
    - PUT:リソースの作成または置換。ファイルのアップロード等に使う
    - DELETE:リソースの削除
    - HEAD：ヘッダ部分のリソースの取得。GETと違いボディ部分の取得はなし

## RubyおよびRuby on railsを学ぶ際に使用した用語たち
##### オブジェクト指向とは
プログラムの組み立てを現実世界のモノ（オブジェクト）と例え、それを中心にコードを書いていくこと。オブジェクトとは、ざっくり簡単にまとめると関連する変数（値）とメソッド（動作）をまとめて、そのまとまりに名前を付けたものです。データを全てモノ(オブジェクト)と捉えます。
- オブジェクト指向のメリット
    - コードが独立して依存性が減り、コードの変更が容易になる
    - そのため大人数での開発に向いている
    - 継承することができ処理の再利用や追加が容易
**分かりにくいので例を挙げて理解を深める**
車に例えると、車という設計図内（クラス）に「色、排気、メーカー」という情報（インスタンス変数）と「走る、曲がる、止まる」という機能（メソッド）を持たせる。
設計図に沿って「赤、2000ＣＣ、日産」という実際のオブジェクト（インスタンス）を作成していく。

プログラミングに戻すとUserという設計図内（クラス）に「name: age: sex:」という情報（インスタンス変数）と「登録、変更、消去」という機能（メソッド）を持たせる。
その設計図に沿って「佐藤、24歳、女」という実際のオブジェクト（インスタンス）を作成していく。

また、設計図（クラス）から実体を作成したオブジェクトを**インスタンス**と呼び、その工程をインスタンス化という。

~~個人的にオブジェクトとインスタンスが曖昧であるが、~~クラスもメソッドも全て丸ごと抽象化したものをオブジェクトと言い、クラスを基に作成されたオブジェクトをインスタンスと呼ぶといった理解にしている。
**追記(2019/09/19)**
scivola様よりいただきましたコメントより追記いたします。
ありがとうございます！
> インスタンスとはクラスを念頭におき、それに対する「実物」の事。クラスとの関係性を表す言葉。
オブジェクトとはクラス等を想定しておらず、Rubyにおいて全てのデータはオブジェクトであり、すべてのオブジェクトは何らかのクラスのインスタンスである。


##### CRUDについて
Create Read Update Delete4つの頭文字をとったもので、システム設計の基本。データベースの処理を表し、これにより自由にデータを操作管理できるようになる。
**名称：名称の説明(Controller内でのメソッド)**
Create:新規作成。データを新しく作る（create）
Read：データを読み込む。個別表示とか(index, show, edit)
Update：データの更新する(update)
Delete：データを削除する(destroy)

##### MVCについて
M(model)、V（view）、C(controller)の3つの頭文字を切り抜いたもので、Webアプリの共通パターンを抜き出した設計の概念。ユーザーからリクエストが来たとき応答を返すまでの流れ。
1. ブラウザからのリクエストをroutesが受け取り、URLとHTTPメソッドにマッチするコントローラーを捜す。
2. そのコントローラーにモデルに関する内容があればモデルに命令し、モデルはDBに処理を命令する。
3. DBから受け取ったデータをモデル→コントローラーに返し、コントローラーは結果をviewに渡す。
4. ViewはHTMLを作成しブラウザに反映する

##### モデルについて
DB内を操作する特殊なクラス

## 最後に
パッと浮かびついたものや重要だなと思うものをまとめました。
他にもあったら随時更新していく予定
Sakurai-Sugiura法をMATLABで実装してみた

# Sakurai-Sugiura法
指定した領域内の固有値を求める解法であるSakurai-Sugiura法を実装してみました．
ムダな部分もあるかと思いますが，とりあえず動きます．
固有値の求解まではコーディングしてますが，固有ベクトルは求めていませんので注意してください．

# 引用文献
詳細なアルゴリズムや，原理は以下の原著論文をご参考ください．
1. Tetsuya Sakurai, Hiroshi Sugiura, A projection method for generalized eigenvalue problems using numerical integration, Journal of Computational and Applied Mathematics, Volume 159, Issue 1, 2003, Pages 119-128,
2. 日本語 -> https://repository.kulib.kyoto-u.ac.jp/dspace/bitstream/2433/43096/1/1320_24.pdf

# MATLABサンプルコード

```matlab:ss.m

% テスト行列の準備
A = (diag(99:-1:0) + circshift(eye(100),1,2))./100;
B = [zeros(80,80) zeros(80,20);zeros(20,80) eye(20)];
[mA nA] = size(A);

% 適当な値
N = 64;
j = 0:N-1;

% ジョルダン閉曲線の中心
r = 0.015;
% ジョルダン閉曲線の半径
p  = 0.02;

% 上記の領域内の固有値数
m = 4;

% ランダムベクトル
u = rand(mA,1);
v = rand(mA,1);

% (1) ジョルダン閉曲線（今回は円）
w = r + p .* exp(2 * pi * 1i * j ./ N);
plot(real(w),imag(w));
grid on;

% (2) 
for lp = 1:N
    y(:,lp) = v' / (w(lp) * B - A);
end

% (3)
f = u' * y;

% (4)
for lp2 = 1:2 * m
    mu(lp2) = 0;
    for lp = 1:N
        mu(lp2) = mu(lp2) + ( w(lp)-r ).^lp2 * f(lp);
    end
    mu(lp2) = mu(lp2) / N;
end

% (5) Hankel行列の計算と固有値の求解
H1 = hankel(mu(1:m),mu(m:end-1));
H2 = hankel(mu(2:m+1),mu(m+1:end));

t = eig(H2,H1);
lambda = r + t
figure;
scatter(real(lambda),imag(lambda));
hold on;
scatter(real(w),imag(w));
grid on;
```
VSCodeのおすすめ拡張機能？とりあえずSetting Syncだけはまず入れておけ。話はそれからだ。

# VSCodeのおすすめ拡張機能？とりあえずSetting Syncだけはまず入れておけ。話はそれからだ。

## TL;DR
- SettingSyncを入れておけば、gistにVSCodeの設定のバックアップがとれるよ
- バックアップのみならず、別端末のVSCodeにも設定を同期することができるよ
- しかも自動同期にもできるよ
- 複数端末でVSCodeを使う人におすすめ！


## Setting Syncとは

[Setting Sync](https://marketplace.visualstudio.com/items?itemName=Shan.code-settings-sync)

VScodeの拡張機能で、gistにVScodeの設定をバックアップすることができる。  
保存できる設定は下記の通り  

- extensions.json
    - 拡張機能
- keybindings.json
- keybindingsMac.json
    - キーバインドの設定（ショートカットキーの設定）
    - 無印とMac.jsonがあるけど、WinOrMacで分けてるのかな？Linux版使ったらLinux.jsonができるのかな？
- locale.json
    - 言語設定
- settings.json
    - 環境設定
- snippets|markdown.json
    - スニペットの設定markdown以外も作ればできると思う

## 設定に必要なもの
- githubのアクセストークン
- gistのID  
（両方ともgithubのアカウントがあれば大丈夫）

## 設定方法
すでに丁寧にまとめられている記事があるので
この辺ご覧いただければ大丈夫かと

[VScodeの設定共有（SettingSync）](https://qiita.com/torun225/items/e6823fc22e5ae79247fe)

**Generate tokenで作成したgithubのアクセストークンは、再度確認することができないので、必ずどこかにメモしておきましょう。
２台目の端末にセッティングするときに、tokenを再作成することになります。**

privateなgistに保存されるので、
他人に設定を見られたくない場合でも安心できるかと。

## 操作方法
cmd + shift + pでコマンドパレットを開き、syncと入力すると、使用できるコマンドの候補がでます。
そこからダウンロードでもアップロードでもすると良いかと（もちろんショートカットキーもあるので）

ただ、一々アップロードをするのがめんどくさい人は、`Sync:高度なオプション` から
自動設定アップロードや自動設定ダウンロードを変更すると良いでしょう。

設定ファイル（setting.json）で

```json
    "sync.autoUpload": true,
    "sync.autoDownload": true,
```

としても同じです。

上記を行うと、設定変更時に自動でgistに設定がアップロードされ、
別端末でVSCodeを開いたときに自動で設定がダウンロードされます。
快適です。
Java Servletはマルチスレッド環境を意識すること

まず下のSpring MVCのコントローラを読む

```java
@Controller
@RequestMapping("/count")
public class CountController {

	private long count = 0;

	@GetMapping(value = "/increment", produces = "text/plain")
	@ResponseBody
	public String increment() {
		count++;
		return Long.toString(count);
	}

}
```

このコントローラは、アクセスされる回数を覚え、アクセスされる回数を出力すること。もしコントローラを100,000回、**1回つづ**アクセスすると、100,000が正しく出力することができる。

でもコントローラはひどく問題がある。もし**1回100ユーザーが同時にアクセスする**、1,000回した、最後の出力のは100,000ではない。

Java Servletはマルチスレッド環境、言い換えるのは同じ時に多量のリクエストが処理できる環境。Spring MVCはJava Servletの上に建てられたものだ。Java Servletのクラス設計は、マルチスレッドを意識しなければならない。

簡単に言えば、問題はクラス変数*count*は、スレッドセーフではないことだ。コントローラは下のように書き換えば、問題は解決できる。

```java
@Controller
@RequestMapping("/count")
public class CountController {

	private AtomicLong count = new AtomicLong(0l);

	@GetMapping(value = "/increment", produces = "text/plain")
	@ResponseBody
	public String increment() {
		return Long.toString(count.addAndGet(1l));
	}

}
```
HalideからGPUを利用する

HalideはCPU上の並列化だけでなく、CUDA/OpenCL/MetalなどのGPUバックエンドにも対応しています。

Halide上で必要なことは、

+ GPUスケジューリングの使用 
+ GPUターゲットを含んだJIT/AOTコンパイル 
+ HostPC/GPU間のデータ転送

の3点です。
OpenCVとも連携してみましょう。
[前回の投稿](https://qiita.com/xy1ophone/items/44e32b6a6e14b34061c9)と同様に、グレイスケール化をGPUで行います。

なお、筆者の手持ちのGPUがRadeonである都合上、OpenCLを使用します。
CUDAの場合もほぼ一緒です。

```.cpp
#include <Halide.h>
#include <opencv2/opencv.hpp>

int main()
{
	// GPU環境の取得
	Halide::Target env = Halide::get_jit_target_from_environment().with_feature(Halide::Target::OpenCL);

	// 入力・出力先のMat
	cv::Mat cv_src = cv::imread("rgb.png");
	cv::Mat cv_dst(cv_src.size(), CV_8UC1);

	// データポインタを利用してのBufferの初期化
	Halide::Buffer<uint8_t> hal_src = Halide::Buffer<uint8_t>::make_interleaved(cv_src.data, cv_src.cols, cv_src.rows, 3);	
	Halide::Buffer<uint8_t> hal_dst(cv_dst.data, cv_dst.cols, cv_dst.rows);
	
	hal_src.set_host_dirty();		// ポインタ初期化した場合、dirtyflagが立っていないので立てる
	hal_src.copy_to_device(env);	// HostPC -> GPUの転送

	// GrayScale化のアルゴリズム
	Halide::Func GrayScale;
	Halide::Var x, y, xo, yo, xi, yi;

	Halide::Expr gray =
		0.114f * hal_src(x, y, 0) +		//B
		0.587f * hal_src(x, y, 1) +		//G
		0.299f * hal_src(x, y, 2);		//R
	GrayScale(x, y) = Halide::cast<uint8_t>(Halide::min(gray, 255));

	// GPUスケジューリングの指定
	GrayScale.gpu_tile(x, y, xo, yo, xi, yi, 64, 2);

	// GPU環境でのJITコンパイル
	GrayScale.compile_jit(env);

	GrayScale.realize(hal_dst);		// グレイスケール化の実行
	hal_dst.copy_to_host();			// GPU -> HostPCの転送

	cv::imwrite("gray.png", cv_dst);
}
```
多少長くなりましたが、アルゴリズム部は変化はしていないことがわかると思います。
生CUDA/OpenCLを書くよりはずっと楽です。

#### GPUスケジューリングの使用

```
GrayScale.gpu_tile(x, y, xo, yo, xi, yi, 64, 2);
```
ここで、GPUによるタイリングを行うことを明示する必要があります。
CUDAでいうところのxo,yoがブロック、xi,yiがスレッドに相当し、64,2がスレッド数になります。
(OpenCLの用語がわからない・・・)
`gpu_`プレフィックスのない`tile`もありますが、こちらはCPU用で、使い分ける必要があります。

#### GPUターゲットを含んだJITコンパイル

```
Halide::Target env = Halide::get_jit_target_from_environment().with_feature(Halide::Target::OpenCL);
~
GrayScale.compile_jit(env);
```
ここでは、プログラム動作時点での実行環境+OpenCLを用意し、それにむけてグレイスケール処理をJITコンパイルさせています。
CUDAで動作させたい方はここを`Target::CUDA`にすればOK。

#### HostPC/GPU間のデータ転送

```
hal_src.set_host_dirty();		// ポインタ初期化した場合、dirtyflagが立っていないので立てる
hal_src.copy_to_device(env);	// HostPC -> GPUの転送
~
hal_dst.copy_to_host();			// GPU -> HostPCの転送
```

一般に、HostPCとGPUはメモリ空間が切り離されているので、GPUで計算させたいならGPU側に画像データを転送する必要があります。(iGPUやJetsonなんかはあてはまりませんが)

`copy_to_〇〇`は読んで字の通りです。
`set_host_dirty`は「HostPC上のメモリをGPUと同期させる必要がある」フラグになります。
Bufferをポインタ初期化した場合、このフラグが立たないので、手動で操作する必要があります。
`set_device_dirty`は必要ないのか？というと、今回は必要ありません。
HalideがBufferを操作する場合、自動的にフラグが設定されているようです。

### OpenCLバックエンドの罠
実はOpenCLのJIT/AOTコンパイルは「OpenCLランタイムでGPUカーネルをコンパイルするプログラム」を生成します。
`Func.realize()`の時点で初めて実行するカーネルを作るので、初回呼び出しには大きなオーバーヘッドがあります。(筆者の環境では初回呼び出しは50msくらい追加でかかります)
大量の画像に対して同じ処理をする用途にはあまり支障はありませんが、残念な仕様です。
その点、CUDAの場合は直接GPUカーネルまで作るので、速度的にはCUDAが優勢です。

### 速度
Radeon RX580を使用、画像サイズは1920x1080 8bit
CodeXLを使ってGPUカーネルだけの時間を調べたところ0.0776msでした。
おおよそ100GB/sくらいでしょうか。もうちょっと出る気もしますが。
gradleでMavenリポジトリからバージョンの違うtomcatのzipファイルを複数ダウンロードして展開する方法



Mavenリポジトリから同じgroup, artifactのバージョン違いを複数ダウンロードして展開する


# 難しいところ

例えば、configurationの依存関係から、一つのjarだけ取り出すのはdependenciesブロックのDependencyを保存しておいて、configurationからfileCollectionで取り出すことで対象のjarファイル(正確にはprimary artifact)を取得できる。

```gradle
configurations {
    CLI
}

dependencies {
    project.ext.swagger2 = CLI 'io.swagger:swagger-codegen-cli:2.4.2'
    project.ext.swagger3 = CLI 'io.swagger.codegen.v3:swagger-codegen-cli:3.0.5'
    project.ext.openApi = CLI 'org.openapitools:openapi-generator-cli:3.3.4'
}

task showCliJar {
    doFirst {
        println(project.configurations.CLI.fileCollection(project.ext.swagger2).singleFile)
        println(project.configurations.CLI.fileCollection(project.ext.swagger3).singleFile)
        println(project.configurations.CLI.fileCollection(project.ext.openApi).singleFile)
    }
}
```

しかし、同じConfigurationにバージョンの違う、同じartifactの依存関係を設定すると、バージョンの解決のために一つのartifactしか取得できない。
そのため、ほしい数だけのconfigurationを作成することもできるのだけど、configurations.detachedConfigurationで無名のconfigurationを作成できるので、それを使い捨てる感じでつかうと無用なconfigurationを宣言せずに行うことができる。


```gradle
task downloadTomcatZip {
    doFirst {
        ["8.0.43","8.0.53","9.0.2"]
            .collect{ project.dependencies.create("org.apache.tomcat:tomcat:${it}@zip") }
            .collect{ project.configurations.detachedConfiguration(it) }
            .each { config ->
                project.copy {
                    from(project.zipTree(config.singleFile))
                    into("$buildDir/tomcat")
                }
            }
    }
}
```
Onboardingについて考えたら要はバランスおじさんになった話

## 自己紹介
渋谷　充宏 `@m4buya`

* 株式会社メルカリ SRE Engineering Manager
* Ruby / Scala / インフラ
* https://github.com/mshibuya
* RailsAdmin/CarrierWave committer
* ISUCON9予選敗退

---
# 「要はバランスおじさん」　とは

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">何かにつけてトレードオフ構造を見出して「要はバランス」という結論で満足してしまう人を揶揄して「要はバランスおじさん」と呼ぶことがあります。</p>&mdash; チーフ (@katzchang) <a href="https://twitter.com/katzchang/status/1171080561948942336?ref_src=twsrc%5Etfw">September 9, 2019</a></blockquote>

---
# メルカリに7月に入社しました

---
# 入社前

Onboarding力入れてるって聞くし、さぞかし色々整ってるんだろうなー
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27474/c405c360-f38a-885b-3e49-f2c6b85df8c8.png)

---
# 全社Onboarding

- New Hire Orientation(1.5日)

入社1・2日目。PCや各種アカウントの設定から労務・カルチャー・カスタマーサービスなど広い分野の知識をインプットしてもらえる！

---
# エンジニアとしてのOnboarding

- Engineering Orientation(半日)

入社3日目に各チームから全てのエンジニアが知っておくべき内容をインプットしてくれる。システムやエンジニア組織の見取り図が頭の中で作れてよかった

---

# マネージャーとしてのOnboarding
- New Manager Orientation(1.5h)
- 1on1や面接のトレーニング(1.5-2h)

内部からマネージャーになる想定寄りのプログラムではあったかもですが、欲しいポイントを押さえていて助かりました

---
# SREチームとしてのOnboarding
- チームのonboarding資料
- リンク集＋アカウント作成など必要なやるべきこと、という感じの構成

そんなにキュレーションされてなくて、リンクをたどっていくと情報の沼に沈む…
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27474/3b23efe4-0769-20af-9217-205ea7ac8134.png)

---
# SREチームのマネージャーとしてのOnboarding
- そのためのプログラムとかドキュメントとか特に無いぞ…？

---
# 結果
全体としての体験はよかったんですが、細かい単位になるにつれ途方に暮れてしまった
![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27474/d7165c72-7ec1-9e7f-8637-975bfacc0701.png)

---
# じゃあどうしたらいいのか考えた

---
# 気づき
- 頻度が高い(=大きな組織単位での)Onboardingには労力をかけても見合うだけの見返りがある
- 逆に、めったに発生しないポジションのOnboardingには労力をかけようという動きが生まれない
- そしてそこに力を注いでもたぶん報われない
- じゃあそういう個別性の高いポジションに来る人に対し何ができるのかというと…

---
# OJTやメンタリングなのでは？
- がっつりとしたプログラムに比べ必要なリソースが少ない
- 状況や個別事情に合わせカスタマイズしやすい

---
# こういう関係になるのでは…

↓頻度大、かけるリソース大、カスタマイズ小

- 全社
- 大きな組織単位
- 大きなロール
- 個別チーム
- 個々のポジション

↑頻度小・かけるリソース小・カスタマイズ大

---
# 要はバランスじゃん！

---
# ということで
- OnboardingとOJT等のトレーニングを合わせたアプローチについて、全体の設計やバランスについての知見をお持ちの方々のお話を伺いたいです！
- (SREチームとしてのOnboardingは粛々と改善を進めているので、来ていただいてもよいのですよ…！)
Scratch bufferを付箋として使う


Emacsのscratchバッファーを簡易メモとして使うという目的で作られたパッケージはいくつかありますが、設定だけで実現できる簡単なものを紹介します。設定に必要な手順は以下の通りです。

1. Scratch buffer を kill させない。
2. Scratch buffer の内容を記憶させる。
3. Scratch buffer をPopupさせる。

![Alt Text](https://live.staticflickr.com/65535/48753577921_70897ea372_b.jpg) 

## Scratch buffer を kill させない ##
特にpackageを導入せずともemacsの標準機能で実現できます。

``` emacs-lisp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Set buffer that can not be killed.

(with-current-buffer "*scratch*"
  (emacs-lock-mode 'kill))
```
設定反映後、scratch bufferを `kill-buffer` すると 

`Buffer "*scratch*" is locked and cannot be killed` 

とmessageがでます。

## Scratch buffer の内容を記憶させる ##
大方のemacserは `auto-save-buffers-enhanced` を導入していると思います。

以下の設定をすることで scratch buffer の内容を記憶させることが可能です。

``` emacs-lisp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; auto-save-buffers-enhanced

(setq auto-save-buffers-enhanced-quiet-save-p t)
;; scratch bufferの内容を `~/.emacs.d/scratch` に保存
(setq auto-save-buffers-enhanced-save-scratch-buffer-to-file-p t)
(setq auto-save-buffers-enhanced-file-related-with-scratch-buffer
      (locate-user-emacs-file "scratch"))
(auto-save-buffers-enhanced t)
```

## Scratch bufferをPopupさせる ##
popwinの機能を使います。

`my:pop-scratch` を起動するとscratch bufferがpopupします。メモしたあと `C-g` で隠せるので便利です。

``` emacs-lisp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Popup the scratch buffer

(bind-key
 "s-x"
 (defun my:pop-scratch ()
   "Popup the scratch buffer."
   (interactive)
   (setq popwin:special-display-config '("*scratch*"))
   (display-buffer "*scratch*")))
```