OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon RDSのインスタンスタイプの変更などをダウンタイムなしで行う方法

Amazon RDSのインスタンスタイプの変更やストレージ変更などをダウンタイムなしで行うための備忘録です。
通常の**DBインスタンスの変更**の設定変更でも、ダウンタイムは数分程度なのでそれが許容範囲の場合は通常の変更方法でいいと思いますが、ダウンタイムなしで変更をしたいということがあったのでその方法を書いていきます。

## 作業手順

1. 変更対象のインスタンスからスナップショット作成
2. 作成したスナップショットから復元する（新規インスタンスを作成）
3. 新規インスタンスのセキュリティグループとパラメータグループを元のインスタンスと同じにする
4. 3を反映させるためにインスタンスの再起動
5. DB接続先のホストを新規インスタンスのエンドポイントに変更

## スナップショットを作成

RDS &rarr; インスタンス &rarr; 対象インスタンスの選択 &rarr; インスタンスの操作 &rarr; スナップショットの取得

<img width="1246" alt="sc1.png" src="https://qiita-image-store.s3.amazonaws.com/0/205865/1f8d27a5-d555-369d-7583-3bf7860427b3.png">

上記手順で、まずは変更対象DBのスナップショットを作成します。
**このスナップショットを使用するので、それ以降は変更対象DBの更新はしないようにしましょう。**

## 作成したスナップショットから復元する

RDS &rarr; スナップショット &rarr; 対象スナップショットの選択 &rarr; スナップショットのアクション &rarr; スナップショットの復元

<img width="1251" alt="sc2.png" src="https://qiita-image-store.s3.amazonaws.com/0/205865/d8105472-8b89-bd89-d397-65a8420c6be0.png">

上記手順で、作成したスナップショットから新規インスタンスを作成します。
**この際、復元の元となるインスタンスのDBインスタンス識別子を変更して、元々使用していた識別子を新規インスタンスに設定する方法もありますが、この場合ダウンタイムが発生してしまうのでDBインスタンス識別子は新たなものを設定し、DB接続の際のホストを変更する形をとります。**

## 新規インスタンスのセキュリティグループとパラメータグループを元のインスタンスと同じにする

新規で作成したインスタンスのセキュリティグループなどは、デフォルトのグループになっているので元のインスタンスと異なる場合は、同じグループを設定するようにしてください。

## インスタンスの再起動

インスタンスの操作 &rarr; 再起動
セキュリティグループなどの変更を反映させるために、インスタンスを再起動させます。

## DB接続先のホストを新規インスタンスのエンドポイントに変更

あとは、DB接続プログラムのホストを設定している箇所を新しいエンドポイントに変更すれば完了です。

## 最後に

上記の流れで、ダウンタイムなしでインスタンスタイプの変更などができるようになるかと思います。
ちなみに、新規インスタンスを作成するので古いインスタンスは通常必要無くなりますが、完全に復元できていない場合も考えられますので、しばらくは削除せずに残しておいた方が無難だと思います。
KotlinのAndroidアプリのAPIドキュメントを自動生成する

KotlinでAndroidアプリを作っていてAPIドキュメントをJavadocのように生成したかったのですが、KotlinだとJavadocは使えませんでした。
調べてみたらKotlinでは[Dokka](https://github.com/Kotlin/dokka)というのを使うらしいです。
導入方法は公式のREADMEにも書いてあるんですけど、個人的メモ用として記事にしました。

まずプロジェクトのルートの`build.gradle`に、以下の`classpath`指定を追加します。

```gradle:%ROOT%/build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'org.jetbrains.dokka:dokka-android-gradle-plugin:0.9.17' // これを追加
    }
}
```

次に、アプリケーションの`build.gradle`に`apply plugin`の記述を追加し、出力設定を行うための`dokka`ブロックを定義します。

```gradle:app/build.gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'org.jetbrains.dokka-android' // これを追加(kotlin-android よりも下に追加すること)

// このブロックを android ブロックの下あたりに追加
dokka {
    outputFormat = 'html'
    outputDirectory = "$rootDir/javadoc" // 出力先。好きな場所を指定。
}
```

あとは、プロジェクトのルートで`gradlew dokka`を実行するだけです。

もしくは、Android Studioの右の方にあるGradleタブから dokka というタスクを探してダブルクリックしても良いです。
![capture.png](https://qiita-image-store.s3.amazonaws.com/0/56668/d5aab5a4-aec5-867c-252e-153fe10faa76.png)

簡単な設定だけで本格的なAPIドキュメントが生成できますし、これを読むと「あ、このクラスのコメントもう少し詳しく書いたほうが良さそうだな」とかいうことに気付けてとても良いと思うので、ぜひ利用してみてください。

ちなみに、この方法でドキュメントを生成するためには[KDoc](https://kotlinlang.org/docs/reference/kotlin-doc.html)という形式でソースコード中にコメントを入れておく必要があります。Javadocと似てますが、Javadocよりもう少し簡素な書き方ができます。
日頃からKDocのコメントをたくさんつけるように習慣づけておきましょう。
SparkでJOINするときの注意点2

注意点1はこっち
https://qiita.com/neppysan/items/aa4be9b9a07c3c54f2fb

# SparkでJOINするときの注意点

## 大文字小文字の区別

Sparkでは`JOIN ... ON A.key=B.key`での結合条件で大文字小文字を**区別する**。

結合条件で大文字小文字を区別したくないときは、おそらく新しく小文字に揃えたカラムを作るしかない。

```sql
import pyspark.sql.functions as F
tableA = tableA.withColumn('newkeyA',F.expr('lower(key)')
tableB = tableB.withColumn('newkeyB',F.expr('lower(key)')
tableA.createOrReplaceTempView('tableA')
tableB.createOrReplaceTempView('tableB')
output = spark.sql("""
select 
a.valueA1,
b.valueB1
FROM
tableA as a
JOIN 
tableB as b
on a.newkeyA = b.newkeyB
""")
```

## broadcast するテーブルはできるだけ小さくする
例えば、tableAにはカラムkeyA,valueA1の2種類, tableBにはカラムkeyB, valueB1, valueB2 の3種類あるとする。このとき、以下のようなSQL文を書いたとしよう。

```sql
import pyspark.sql.functions as F
tableA.createOrReplaceTempView('tableA')
tableB_b = F.broadcast(tableB)
tableB_b.createOrReplaceTempView('tableB_b')
output = spark.sql("""
select 
a.valueA1,
b.valueB1,
from
tableA as a
JOIN
tableB_b as b
on a.key = b.key
""")
```

このとき、valueB2は全く使われないのにもかかわらずbroadcastされるときすべてのノードに配布されてしまう。これはメモリーの無駄遣いである。broadcastするテーブルはなるべく小さくする。

```sql
import pyspark.sql.functions as F
tableA.createOrReplaceTempView('tableA')
tableB_b = F.broadcast(tableB.select('keyB','valueB1'))
tableB_b.createOrReplaceTempView('tableB_b')
output = spark.sql("""
select 
a.valueA1,
b.valueB1,
from
tableA as a
JOIN
tableB_b as b
on a.key = b.key
""")
```

##結合条件で大文字小文字を区別しないで、なおかつbroadcastするテーブルを小さくするには
上の2つの注意点を同時に行うには以下のように書く。（もっといい方法あるかも？）

```sql
import pyspark.sql.functions as F
tableA = tableA.withColumn('newkeyA',F.expr('lower(key)')
tableA.createOrReplaceTempView('tableA')
tableB = tableB.withColumn('newkeyB',F.expr('lower(key)')
tableB_b = F.broadcast(tableB.select('newkeyB','valueB1'))
tableB_b.createOrReplaceTempView('tableB_b')
output = spark.sql("""
select 
a.valueA1,
b.valueB1,
from
tableA as a
JOIN
tableB_b as b
on a.newkeyA = b.newkeyB
""")
```
athrill2を使用してTOPPERS/ATK2-SC1を実行する

#概要
athrill2を使用してTOPPERS/ATK2-SC1のサンプルプログラム動作確認を行います．
動作確認内容は以下の通りです．

* atk2-sc1のカーネル起動
* 周期アラームコールバック起動確認(500ms周期)
* アラーム実行をキャンセル
* タスク起動確認(Task3)

#atk2-sc1のバイナリ配置場所
[athrill開発プロジェクト](https://github.com/tmori/athrill)の以下を参照ください．

athrill/sample/os/atk2-sc1_1.4.2/OBJ/

#動作確認

##atk2-sc1のカーネル起動
以下のコマンドを実行して，カーネル起動します．

```
$ athrill2 -i -c1 -m memory.txt -d device_config.txt atk2-sc1
```

athrill2 では，-c オプションでコア数を指定できます．今回の場合はシングルコアになりますので，「1」を指定します．本コマンドを実行すると，以下のathrill起動ログが出力され，デバッグコマンド入力待ちになります．

```
core id num=1
ROM : START=0x0 SIZE=512
RAM : START=0x3ff7000 SIZE=512
Elf loading was succeeded:0x0 - 0xffd2 : 63.978 KB
Elf loading was succeeded:0xffd4 - 0x12b30 : 0.220 KB
ELF SYMBOL SECTION LOADED:index=17
ELF SYMBOL SECTION LOADED:sym_num=499
ELF STRING TABLE SECTION LOADED:index=18
[DBG>
HIT break:0x0
[NEXT> pc=0x0 Os_Lcfg_asm.S 8
```

「c」コマンドを実行し，CPUの動作開始すると，以下のようにカーネル起動メッセージが出力され，シリアル入力待ちとなります．

```
c
[CPU>
TOPPERS/ATK2-SC1 Release 1.4.2 for V850ESFK3 (Aug 14 2018, 12:52:01)

Input Command:
```

##周期アラームコールバック起動確認(500ms周期)
シリアル入力できるように，まず，「q」コマンドでデバッグモードに遷移させます．

```
q
[NEXT> pc=0x55a6 prc_support.S 1129
```

次に，アラームコールバックの起動周期を確認できるように，アラームコールバック関数にブレーク設定します．

```
[DBG>b AlarmMainSysTimerAlmCb
break AlarmMainSysTimerAlmCb 0x3318
```

athrillのシリアル入力機能を使用して，「N」を入力し，処理継続させます．

```
[DBG>S 0 N
[DBG>c
[CPU>N
Call SetRelAlarm(CallBackArm, 9000, 5000)
Input Command:

HIT break:0x3318 AlarmMainSysTimerAlmCb(+0x0)
[NEXT> pc=0x3318 sample1.c 1551
e
clock = cpu 2886052322 intc 5638480 real_time  21.536603
[DBG>c
[CPU>CallBackArm Expire

HIT break:0x3318 AlarmMainSysTimerAlmCb(+0x0)
[NEXT> pc=0x3318 sample1.c 1551
e
clock = cpu 2936052322 intc 5723803 real_time  21.911723
[DBG>c
[CPU>CallBackArm Expire

HIT break:0x3318 AlarmMainSysTimerAlmCb(+0x0)
[NEXT> pc=0x3318 sample1.c 1551
e
clock = cpu 2986052322 intc 5809126 real_time  22.290978
```

上記は，アラームコールバック関数でブレーク発生したタイミングで，CPU消費クロックを表示した結果です．

|回数|clock|差分|
|---|---|---|
|1|2886052322|-|
|2|2936052322|50,000,000|
|3|2986052322|50,000,000|

消費クロックの差分を見ることで，アラームコールバック関数の起動間隔が「50,000,000クロック」であることがわかります．

今回の設定では，athrill2のCPU周波数は100MHzとし，OSハードウェアカウンタのクロックは10ms/clockとしたため，きっちり「500ms周期」で起動していることがわかります．


##アラーム実行をキャンセル
次に，周期起動しているアラームをキャンセルさせるために，シリアルで「h」コマンドを入力します．

```
[DBG>S 0 h
[DBG>c
[CPU>CallBackArm Expire
h
Call CancelAlarm(CallBackArm)
Input Command:
```

上記のとおり，「Call CancelAlarm(CallBackArm)」というメッセージ出力後，周期起動していたアラームコールバック関数は実行されなくなりました．

##タスク起動確認(Task3)
最後に，この状態から，シリアルで「3a」コマンドを入力し，Task3を起動してみましょう．

```
Input Command:
q
[NEXT> pc=0x55a6 prc_support.S 1129
[DBG>S 0 3a
[DBG>c
[CPU>3
Input Command:
a
Call ActivateTask(Task3)
Task3 ACTIVATE
```

上記の通り，「Task3 ACTIVATE」というメッセージが出力されていることから無事Task3が起動できたことを確認できました．
AWS S3 sample python project 

#**Sample adding image in AWS S3 with python**
we will use Boto3 which is the Amazon Web Services (AWS) SDK for Python which allows Python developers to write software that makes use of Amazon services like S3 and EC2. Boto provides an easy to use, object-oriented API as well as low-level direct service access.

*Installation*
**pip install boto3**

*SAMPLE CODE*

```python
import boto3
from botocore.client import Config

ACCESS_KEY_ID = 'your_key_id'
ACCESS_SECRET_KEY = 'your_secret_key'
BUCKET_NAME = 'your_bucket_name'

data = open('test.png', 'rb')

s3 = boto3.resource(
    's3',
    aws_access_key_id=ACCESS_KEY_ID,
    aws_secret_access_key=ACCESS_SECRET_KEY,
    config=Config(signature_version='s3v4')
)

s3.Bucket(BUCKET_NAME).put_object(Key='test.png', Body=data)

print ("Done")
```
ルートとサブディレクトリに別々のrouter付きReactアプリを展開するnginxの設定

Reactでアプリケーションを実装していて、 `hoge.com/*` にはユーザー向けReactアプリ、 `hoge.com/admin/*` には管理者向けのような構成にしたいと思ったことはないですか？僕はあります。

これらのアプリをnginxをbaseとしたDocker imageとしてデプロイしようとした時、nginxの設定にとても苦しんだのでここに書き記しておきます。

## nginx.conf
```nginx
server_tokens off;

server {
    listen 80 default_server;
    server_name localhost;

    location /admin {
        root /usr/share/nginx/html/admin;
        index index.html;
        try_files $uri $uri/ /index.html /usr/share/nginx/html/admin/index.html;

        location ~* \.(?:manifest|appcache|html?|xml|json)$ {
            expires -1;
        }

        location ~* \.(?:css|js)$ {
            try_files $uri =404;
            expires 1y;
            access_log off;
            add_header Cache-Control "public";
        }

        location ~ ^.+\..+$ {
            try_files $uri =404;
        }
    }

    location / {
        root /usr/share/nginx/html/frontend;
        index index.html;
        try_files $uri $uri/ /index.html;

        location ~* \.(?:manifest|appcache|html?|xml|json)$ {
            expires -1;
        }

        location ~* \.(?:css|js)$ {
            try_files $uri =404;
            expires 1y;
            access_log off;
            add_header Cache-Control "public";
        }

        location ~ ^.+\..+$ {
            try_files $uri =404;
        }
    }
}
```

こんな感じになりました。
adminの設定の箇所がキモです。 adminの設定は `location /` より上に書きましょう。

また、 `try_files` で、 `/index.html` を指定しつつ、絶対パスの `/usr/share/nginx/html/admin/index.html` も追加で指定する必要があります。

この指定がないと、 `/admin/下層ページ` にアクセスした際 `index.html` がないとみなされ、 `location /` の設定を見に行ってしまい、 `/` の `index.html` 、 `index.js` によってURLが解釈されてしまします。


## 〆
こんな感じでした。
特殊なことをやろうとするとWebに情報があまりなくて困りますね。

ので、特殊なことをやった際はどんどんWebに残していこうと思います。
RSpecのbe_falseyは、falsyでもよい

RSpecのbe_falsey、じつはeがなくてbe_falsyでも良いということを知った話。

# be_falseyが覚えづらい

RSpecのmatcherで、falseないしfalseとみなせる値(nilとか)の時OKになるbe_falseyというのがあります。
https://relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/be-matchers#be-falsey-matcher

このつづりがなんか覚えづらい。
JavaScriptでは、同様の概念が"Falsy"として出てきます。
https://developer.mozilla.org/ja/docs/Glossary/Falsy

> falsy は falsey と書かれることもありますが、通常、英語においては単語を～yの形で形容詞化する際、末尾の e を省きます(noise → noisy, ice → icy, shine → shiny)

だよね？ 普通e書かないよね？ だから覚えづらかったんだ！

プログラマに寛容なRuby界でこういう主張が放置されていることは少なくて、何らかの形でカバーされているはず...

```
#be_falsey ⇒ Object (also: #be_falsy, #a_falsey_value, #a_falsy_value)
```

ほらね! ( https://www.rubydoc.info/github/rspec/rspec-expectations/RSpec/Matchers )


ということで、RSpecでは、be_falsyと書くこともできます。とはいえ公式ドキュメントがbe_falseyだから、be_falsey推しぽい...

# 追加情報

RSpec入門のQiita記事などで高名な @jnchito さんから情報を頂きました。
https://twitter.com/jnchito/status/1029135299295686656


## もともと使えた

誰かが「be_falsyがいいよ」といったから使えるようになったわけではなく、be_falseyが使えるようになったときからすでにaliasが用意されていたみたいです。

> In RSpec 3, we've renamed these to be_truthy and be_falsey (or be_falsy, if you prefer that spelling) to make their semantics more explicit and to reduce confusion with be true/be false
( Notable Changes in RSpec 3 http://rspec.info/blog/2014/05/notable-changes-in-rspec-3/ )

## 公式はbe_falseyぽい

be_truthy/be_falseyが導入されたときのissueがこちら。

https://github.com/rspec/rspec-expectations/issues/283

RSpecメインメンテナのMyronさんの発言。

> I don't have a strong opinion on be_falsy vs be_falsey. falsey seems to be the more common term based on number of google results, though:
(私訳： be_falsyかbe_falseyについて強い意見はないよ。でもググった感じだとfalseyのほうが一般的な用語みたいだね )

![falsey](https://camo.githubusercontent.com/54268af4f49ddc60984e431b822b42946d212757/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f34393339312f3738343930342f63643634616633612d656136662d313165322d383233382d3130313135656333626261332e6a7067)

ということで、どっちでも良かったけど、当時はfalseyのほうが一般的だからfalseyにしようぜ、ということだったみたいです。

上がっているスクリーンショットを見ると、当時はまだJS界でもfalsey派とfalsy派がいたのがのちにfalsy派に統一されて現代の状況が生まれてしまったみたいですね。どこかで統一されてくれると嬉しいなあ。
Slackbotのアプリでファイル受け取りができなくなった時の対応　[botkit使用時]

# 内容

Slackでファイル受け取りのアプリケーションを動かしていたが、突然ファイル受け取りが使えなくなってしまった。
その時したこと。

## SlackAPIの「file_share」が使えなくなった
いままでNode.jsの[BotKit](https://github.com/howdyai/botkit)フレームワークを使ってSlackのBot開発をしていたが、
2018年7月23日より、ファイル取得のAPI（file_share）が廃止されてしまって、アプリが動かなくなる事象が発生してしまった。[Slack　Recent updates](https://api.slack.com/changelog/2018-05-file-threads-soon-tread)

>Events API changes
Some events in both the Events API and RTM APIs will be discontinued; they are going away because what they describe is going away.

>For best results, track our supported top-level events like file_shared and file_created instead of "message subtypes" like file_share.

>If you're used to file_share and use the Events API, you'll be happy to know we'll continue dispatching this message subtype until further notice. It will no longer be served over RTM.

>These retained events, however, are still different in a single way: instead of coming with a file attribute, you'll find a files array containing one or more leaner file objects inside.

※まじか。。。

*アプリの簡単な構成*

Slackからbotへ写真を送ると処理を行い、メッセージを返却してくれるアプリケーション


# 修正対応
## file_shareメソッドからfile_sharedメソッドへ
まずは、記述の通り、「file_share」→「file_shared」へ変更を試してみる。

```　js:イベント取得

// modules
var Botkit = require('botkit');
var controller = Botkit.slackbot();


//controller.on('file_share', function (bot, message) { ←廃止
controller.on('file_shared', function (bot, message) {
   // 処理
});
```

これでとりあえず、イベントは取得できるようになった。
   
   
## ファイルURLの取得
file_share時代は、そこからurlのリクエストを取得すればいいだけなのだが、file_sharedさんはそうさせてくれない。
そのかわり、ファイルID（file_id）を返してくれるので、ファイルIDから「files.info」APIを叩いて、urlをゲットする必要があるので、そのメソッドを作成した。


```js:file_share時代
// いままではレスポンスの「message」にファイルのurl情報もふくまれていたのだが
content = yield download(message.file.url_private_download);

```
```js:file_sharedから
// ファイルIDを引数にもう一度別の（files.info）APIを投げる必要がでてきた。
var url = yield getUrl(bot, message.file_id);
message.channel = channel
//リプライするチャンネル情報をmassageへ格納
content = yield download(url);

...

/**
 * Slackファイルアクション時、ファイルURLを取得し返却します。
 * ※このメソッドでチャンネルを識別してchannelへ値を格納している。
 * @param {object} bot 
 * @param {string} file_id 
 */
function getUrl(bot, file_id) {
	return new Promise(function (resolve, reject) {
		const messageObj = {
			token: FILE_ACCESS_TOKEN,
			file: file_id
		};
		bot.api.files.info(messageObj, function (err, res) {
			if (err) {
				console.log(err);
				reject(err);
			}
			var url = res.file.url_private_download
			res.file.ims.length >= 1 ? channel = res.file.ims[0] : channel = res.file.groups[0] //チャンネルをimsかgroupか判定
			resolve(url);
		});
	});
}


```
※チャンネルを変数に格納しているのは、file_sharedさんが、チャンネルを認識できない為、ここでどのチャンネルから来た写真なのかを判断する必要があるため。

ポイントは２点    
- file_sharedの場合、チャンネル情報が取得されないので、リプライする場合チャンネル情報を付与する必要がある   
- files.infoでファイルIDからファイルURLを取得する必要がある。
素早くブラウザのプロキシを変える(Windows)

コマンドラインを使って、ブラウザのプロキシ、接続先のLANを素早く変更する方法を紹介します。(Windows)

コマンド実行するには、**管理者権限**が必要です。

## 事前準備
* **Interface Name**の確認

```
$ netsh interface show interface
```

Admin State  |  State   |       Type  |           Interface Name
---|---|---|---
無効|切断|専用| **LanA ← 注目**
有効|接続|専用| **LanB ← 注目**

* Binaryデータの準備

## 仮想設定
* **LanA**
  * Proxy: 10.0.0.100:8800
  * Ip Address: 10.0.0.10
  * Mask: 255.255.0.0
  * Gateway: 10.0.0.1
  * DNS: 10.0.0.200
* **LanB**
  * Proxy: 172.0.0.100:9900
  * Ip Address: 172.0.0.10
  * Mask: 255.255.0.0
  * Gateway: 172.0.0.1
  * DNS: 172.0.0.200

## **LanA**に切替
```
reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyServer /t REG_SZ /d 10.0.0.100:8800

reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections" /f /v DefaultConnectionSettings /t REG_BINARY /d 4600000046000000030000001100000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000000000000

reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections" /f /v SavedLegacySettings /t REG_BINARY /d 4600000046000000030000001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

netsh interface ip set address "LanA" static 10.0.0.10 255.255.0.0 10.0.0.1 1

netsh interface ip set dns "LanA" static 10.0.0.200

netsh interface set interface name="LanB" admin=DISABLED

netsh interface set interface name="LanA" admin=ENABLED
```

## **LanB**に切替
```
reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings" /f /v ProxyServer /t REG_SZ /d 172.0.0.100:9900

reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections" /f /v DefaultConnectionSettings /t REG_BINARY /d 4600000046000000030000001100000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000000000000

reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections" /f /v SavedLegacySettings /t REG_BINARY /d 4600000046000000030000001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

netsh interface ip set address "LanB" static 172.0.0.10 255.255.0.0 172.0.0.1 1

netsh interface ip set dns "LanB" static 172.0.0.200

netsh interface set interface name="LanA" admin=DISABLED

netsh interface set interface name="LanB" admin=ENABLED
```
GUIなDockerを試す。Seleniumのコンテナを使った場合

GUIなDockerを試す。Selenium
=========================

以下の docker container を教えていただいたので、試してみた。

- [docker\-selenium/StandaloneChromeDebug at master · SeleniumHQ/docker\-selenium](https://github.com/SeleniumHQ/docker-selenium/tree/master/StandaloneChromeDebug)

# 結論

おもった以上によく動いた。
他のアプリいれたら、これはこれで便利そう。

# 作業

## コンテナをたちあげる。

といっても、たいしたことはしていなくて、

上のURLにある説明に同じように

```
docker run -d -p 4444:4444 -p 5900:5900 -v /dev/shm:/dev/shm selenium/standalone-chrome-debug
```

これだけ。

すでに、 `5900` がうまっていて、変更したい場合は、 `-p 5900:5900` を -p `12345:5900`のように変更すればよい。

## VNCでつなぐ

いかの場所につなぐ

```
起動したマシン:指定したポート
```

ローカルホストのport 12345 でたちあがえたとすると

```
vnc://localhost:12345
```

日本語もしっかりみえている。

# 今後

これをもとに、必要なGUIツールをいれたコンテナをつくってみる。
hamlにfontawesomeを入れ込む（擬似要素も）

hamlにfont awesomeをいれたいんです！
```.haml
  =fa_icon "edit"
```
indentはちゃんと取ってね♪

さて、今回は擬似要素を使う場合も調べました。。
以下はsassです。

```.haml
  &::after {
    font-family"FontAwesome";
    content:"";
    position: relative;
    bottom:1.1em;
```
font-familyで指定してやるんですね。。
contentの中身は、fontawesomeのUnicodeをいれます。
\f293　☜こんなやつ


hamlの記事があんまりなかったので、あんまり主流じゃないのかな？？
知らんけど。。
CSS3 Flexbox 回應式設計 RWD 排版教學 By 彭彭

08.htm

```ruby:qitta.rb
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"></meta>
	<!-- 手機的縮放設定 -->
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
	<title>britney spears</title>
	<link href="style08.css" rel="stylesheet" type="text/css" media="all">
</head>
<body>
	<nav>
		<div class="logo">thank you</div>
		<div class="menu">when i text you i miss you</div>
		<div class="user">thank you</div>
	</nav>
	<!-- RWD* 回應式（手機）設計的關鍵動作 欄位變化
				flex 如何控制欄位的變化？
				例如 4欄 > 2欄 > 1欄
		
		 規劃* 
				1200px 以上的規劃 4欄 固定尺寸
				500px ~ 1200px 之間的規劃 2欄 彈性尺寸
				500px 以下 1欄 彈性尺寸
	-->
	<main>
		<div class="item">love</div>
		<div class="item">when the power of love overcomes the love </div>
		<div class="item">the world will know peace</div>
		<div class="item">love</div>
	</main>
</body>
</html>
```

style.css

```ruby:qitta.rb
body{margin:0px;}
/* nav 仰視設定 */
nav{
	display:flex;
}
nav>.logo{
	/* 沒有彈性 固定尺寸 */
	flex:none;width:100px;
	background-color:#ffcccc;
}
nav>.menu{
	/* 無固定尺寸 自動張滿 flex: auto */
	flex: auto;
	background-color: #ccccff;
}
nav>.user{
	flex:none; width: 100px;
	background-color: #ccffcc;
}

/* main 樣式設定 */
/* 容器 顯示模式 flex */
/* 水平對齊 justify-content: flex-start */
/* justify-content: center */
/* justify-content: flex-end */
/* align-items 垂直對齊 */
/* flex-wrap:wrap 手機平板筆電對應不同的排版 */
main{
	display: flex;flex-wrap:wrap;
	justify-content:center;
	align-items: stretch;
	background-color: #cccccc;
}
/* 項目 flex 属性none 没有办法弹性自动缩放　解決并排切蘭問題 */
main>.item{
	flex:none;
	width:300px; margin:10px;
	background-color: #ffcccc;
}
/* 手機平板筆電對應不同的排版 */
@media (max-width:500px){
	main > .item{
		width:45%;
	}
}
@media (max-width:500px){
	main > .item{
		width:90%;
	}
}
```
Rubyのversionを2.4.1から2.5.1に変える方法


##はじめに
現在railsチュートリアルを進めながら学習しているプログラミング歴半年の者です。
ほかにも、チュートリアルを見ながらアプリを作っており、今回アプリ作成中herokuにデプロイしようとしたところエラーが出てしまい、もう一度チュートリアルを見てみるとまずはRubyのバージョンを2.5.1に合わせること、とあったため、バージョンを変更結果を下に書きます。今回以下参考にさせていただきました。

（参考）
①　[rbenvでrubyのバージョンを切り替える](https://qiita.com/_am_/items/c1dbeb11f40bbbac8fd9)

②　[rbenv を使って ruby をインストールする(CentOS編)](https://qiita.com/inouet/items/478f4228dbbcd442bfe8)


まず、Gemfileを見てみると、

```
・
・
ruby '2.4.1'
・
・
```
と書いてあったので、バージョンがあっていません。

下の（参考）①より、

```
$ rbenv versions
```

を実行すると command not foundが出てしまいました。以降いろいろ試してもずっとそれが出ます。
もしかして、そもそもrbenvを使ってRubyをインストールしていなかった！？それならどうやってRubyをインストールしていたのだろう・・・といろいろわからないのですが、とりあえず、

（参考）②より、

## １　Gitが入っていなかったらインストール
```
sudo yum -y install git
```
Gitは入っていると思うけどとりあえずやります。

##２　rbenvをインストール（clone）する

```
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

##３　環境設定

```
# PATH に追加
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile

# .bash_profile に追加
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

# 上記設定の再読み込み
$ exec $SHELL -l
```
とりあえず素直にやります。

##４　rbenvの確認
```
$ rbenv --version
```

##５　ruby-buildをインストール（clone）する

```
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

##６　Rubyの該当するバージョンを確認
以下、利用可能なバージョンがずららーっと出てきました。その中に2.5.1を見つけました。

```
$ rbenv install --list
```

##７　該当するバージョンをインストール

```
$ rbenv install -v 2.5.1
```

##８　環境確認
再読み込み

```
$ rbenv rehash
```

インストールされているRuby一覧を確認

```
$ rbenv versions
rbenv: version `2.4.1' is not installed (set by /home/ec2-user/environment/アプリ名/.ruby-version)
  system
  2.5.1
```

2.4.1がインストールされてないよって出た。
とりあえず、最新版に設定

```
$ rbenv global 2.5.1
```
バージョン確認。なんか変。。。

```
$ ruby -v
rbenv: version `2.4.1' is not installed (set by /home/ec2-user/environment/zorotenki/.ruby-version)
```

まだ2.4.1がインストールされてないよって出る。
[rbenv: version `2.0.0′ is not installed の対処法](http://programming.ironsand.net/2014/rbenv-version-2-0-0-is-not-installed/)
このサイトを参考に。

どうやらカレントディレクトリに以下のように書いてあったみたいなので

```vender/.ruby-version
2.4.1
```
これを2.5.1に修正し、以下を実行

```
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
```
できた！
最後にGemfileも　2.5.1と書き直しておきました。
Gemfileって手動で書き直しであってますよね・・・？


なにか間違っているところ、ご指摘があればコメントください。
Android 定数の定義

## 定数を定義しよう
と思ってConstantsクラスやらを作ってpublic static final...なんちゃらしようとしたところ
そういえば`strings.xml`はいつ使うんだ?と思ったので調査。

## Android公式サイト
公式サイトに何かの情報がないかと思ったが見つからなかった。。
さすがにそこまで親切に提案はしてくれないのかOTL

ちなみにStrings.xmlの使い方に関する説明があったので読んでみた。
今まで使いながら知らなかったことも新たに分かったので、やはり一度は目を通しておくべきかと。

[文字列リソース](https://developer.android.com/guide/topics/resources/string-resource?hl=ja)

## 使い分け
本論に戻って使い分けの調査。
英文ではあるが、Stack Overflowに以下のような質問がありました。

[android - strings.xml vs static constants](https://stackoverflow.com/questions/16160047/android-strings-xml-vs-static-constants)

回答を見ると、以下の四つの観点でまとめていました。

**ローカライゼーション**
Strings.xml（国際化対応）
**メモリ**
Constants（xmlファイルに定義するとオーバーヘッドが発生する）
**パフォーマンス**
Constants（ファイルから読み込むよりメモリから読み込む方が早い）
**メンテナンス**
人の好みによる

## 結論
大したことではないが、上のような差があるので、

**・ユーザに表示するような文字列はStrings.xmlに定義する。**
**・プログラム内部で使う文字列はConstantsに定義する。**

という意見だった。
確かに、考えてみたら当たり前のような気もしますね。
ちなみに、すでに同じことを日本語でまとめて下さった方がいました。

[Androidの定数はvaluesフォルダ内のリソース定義するべきか？コード内でfinal staticで定義するべきか？的なメモ](http://pooh3mobi.hatenablog.com/entry/20160314/1457930647)

こちらの方がもっと詳しく調べてくださっていました。
ありがとうございます。

## その他の方法
職場のAndroidのソースを読んだ時は内部パス的なものを使ってました。
パッケージ名みたいに`com.hoge.huga.hogehoge`とパスを定義してファイルから呼び出すようになってたと思います。
これはなんでだろう。。。？
ちょっと調べてみましたがこのようなやり方は見つかりませんでした。
夏季休暇終わったら聞いてみようかな。。。
もし知っている方いらっしゃったら教えてください！
Proxy環境下でVagrantを使用する場合のTips

プロキシ環境下でのvagrant使用時の注意点(windows)

# プロキシ情報を設定(cmd上で)
```console
set "http_proxy=http://<username>:<password>@<proxy>:<port>"
set "https_proxy=http://<username>:<password>@<proxy>:<port>"
vagrant plugin install vagrant-proxyconf
```
vagrant-proxyconfはVMのプロキシ設定に使用する。

 
上記を使用すると

```console
vagrant box add <box名> <url>
```
などを実行可能となる。

 
# 外部からの接続(ポートフォワーディング)
ポートフォワーディングを設定する。

```ruby:Vagrantfile
config.vm.box = "ubuntu14.04"  #box名
config.vm.network :forwarded_port, guest:22, host:2000, id:"ssh"
```

VMのプロキシ設定

```ruby:Vagrantfile
if Vagrant.has_plugin?("vagrant-proxyconf")
  config.proxy.http     = "http://<username>:<password>@<proxy>:<port>"
  config.proxy.https    = "http://<username>:<password>@<proxy>:<port>"
  config.proxy.no_proxy = "localhost,127.0.0.1"
end
```
 

上記を設定することで(この場合)

ホストOSのIP:2000

でゲストOSにssh接続することが可能となる。

```console
ssh 172.104.70.204:2000
```

 
# 外部からの接続(ブリッジ)
ブリッジ設定

```ruby:Vagrantfile
config.vm.box = "ubuntu14.04"  #box名
config.vm.network :public_network, :ip=>"xxx.xxx.xxx.xxx", :bridge=>"eth1" #設定したいIPを記載する.
```
 
VMのプロキシ設定

```ruby:Vagrantfile
if Vagrant.has_plugin?("vagrant-proxyconf")
  config.proxy.http     = "http://<username>:<password>@<proxy>:<port>"
  config.proxy.https    = "http://<username>:<password>@<proxy>:<port>"
  config.proxy.no_proxy = "localhost,127.0.0.1"
end
```

その後デフォルトルートを設定するため、OSの.bashrcファイルに以下を記入する

```bash:.bashrc 
sudo route del default gw x.x.x.x eth0
sudo route add default gw xxx.xxx.xxx.xxx eth1 #デフォルトゲートウェイを書く.
```
 
上記を設定することでIPを指定してアクセス可能となる

```console
ssh xxx.xxx.xxx.xxx:22
```
 
## その他
Vagrant自体の環境構築は以下が参考になります。
[Vagrant+VirtualBoxでUbuntu環境構築](https://qiita.com/w2-yamaguchi/items/191830191f8af05ac4dd)
CSS3 Flexbox 排版基礎教學 By 彭彭

CSS3 Flexbox
排版工具

```ruby:qiita.rb
<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8"></meta>
	<!-- 手機的縮放設定 -->
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
	<title>britney spears</title>
	<link href="style.css" rel="stylesheet" type="text/css" media="all">
</head>
<body>
	<nav>
		<div class="logo">text you or do not text you</div>
		<div class="menu">when i text you i miss you</div>
		<div class="user">when i do not text you i am waiting for you to miss me</div>
	</nav>
	<!-- flex 如何解決并排切欄，水平對齊，垂直對齊的問題 -->
	<main>
		<div class="item">love</div>
		<div class="item">when the power of love overcomes the love </div>
		<div class="item">the world will know peace</div>
	</main>
</body>
</html>
```
style.css

```ruby:qitta.rb
body{margin:0px;}
/* nav 仰視設定 */
nav{
	display:flex;
}
nav>.logo{
	/* 沒有彈性 固定尺寸 */
	flex:none;width:400px;
	background-color:#ffcccc;
}
nav>.menu{
	/* 無固定尺寸 自動張滿 flex: auto */
	flex: auto;
	background-color: #ccccff;
}
nav>.user{
	flex:none; width: 400px;
	background-color: #ccffcc;
}

/* main 樣式設定 */
/* 容器 顯示模式 flex */
/* 水平對齊 justify-content: flex-start */
/* justify-content: center */
/* justify-content: flex-end */
/* align-items 垂直對齊 */
main{
	display: flex;
	justify-content:center;
	align-items: stretch;
	background-color: #cccccc;
}
/* 項目 flex 属性none 没有办法弹性自动缩放　解決并排切蘭問題 */
main>.item{
	flex:none;
	width:300px; margin:10px;
	background-color: #ffcccc;
}
```
DDLのロギング機能を試す (Oracle Database 11g 以降)


Oracle Database 11g Release 2 から利用できる DDL のロギング機能について試してみました。

# DDL のロギング機能
データベースに対して発行されたオブジェクトの作成や変更等の SQL 文を DDL （マニュアル上は「データ定義言語」「Data Definition Language」）と呼びます。
Oracle Database には DDL が発行されると、実行された DDL をログに記録する機能があります。Oracle Database 11g まではアラート・ファイルに書き込まれましたが、Oracle Database 12c 以降は ADR 内の独立したファイルとして作成されます。

## 設定変更方法
初期化パラメーター enable_ddl_logging を TRUE に変更します（デフォルト値は FALSE）。

```
SQL> ALTER SYSTEM SET enable_ddl_logging = TRUE;

System altered.
```

## 出力されるログ
DDL はファイルに出力されます。ADR内の下記のファイルに出力されます。ファイルが存在しなければ ALTER SYSTEM 文を実行されると自動的に作成されます。

- ADR_HOME/log/ddl_{インスタンス名}.log ファイル

このファイルはテキストファイルです。実行された日時と DDL 文が２行に分かれて出力されます。

```
$ cd $ORACLE_BASE/diag/rdbms/o18a/O18A/log
$ cat ddl_O18A.log
2018-08-15T11:23:34.671263+09:00
diag_adl:CREATE TABLE ddltest1(c1 NUMBER, c2 VARCHAR2(10))
$
```

- ADR_HOME/log/ddl/log.xml ファイル

　このファイルは XML 形式で出力されます。

```
$ cd $ORACLE_BASE/diag/rdbms/o18a/O18A/log/ddl
$ cat log.xml
<msg time='2018-08-15T11:23:34.670+09:00' org_id='oracle' comp_id='rdbms'
 msg_id='opiexe:4792:2946163730' type='UNKNOWN' group='diag_adl'
 level='16' host_id='rel75-1' host_addr='fe80::1465:9426:ef2a:9304%ens33'
 pid='28637' version='1'>
 <txt>CREATE TABLE ddltest1(c1 NUMBER, c2 VARCHAR2(10))
 </txt>
</msg>

``` 

## 何に使うのか？
　この機能は一見便利ですが、下記のような仕様から何が目的で作られた機能なのかがはっきりせず、微妙な実装になっています。


- すべての DDL が出力されるわけではありません</dt>

CREATE USER文、CREATE PUBLIC SYNONYM 文、CREATE PUBLIC DATABASE LINK 文などは出力の対象外です。対象 DDL は [マニュアル](https://docs.oracle.com/cd/E96517_01/refrn/ENABLE_DDL_LOGGING.html) に記載されています。ただし 対象の DDL であれば SYS ユーザーが実行した場合でも出力されます。

-  誰が実行したかが出力されません 

　DDL を実行したユーザー名が出力されません。このため DDL からどのユーザーが作成したオブジェクトなのかを特定できません。

- スキーマ名が出力されません

　上記と同様にスキーマ名（ユーザー名）が出力されないため、CREATE TABLE 文が出力されてもどのユーザーが所有しているかわかりません。

- 完全な DDL が出力されるわけではありません。

　マニュアルにも明記されていますが、長すぎる DDL は途中でカットされます。DDL 全体を取得するためには DDL トリガーを使う必要があります。

- 監査に使えません

　初期化パラメーター enable_ddl_logging は、ALTER SESSION システム権限を持つ一般ユーザーも変更できます。このため監査データとして使うには無理があります。
rbenvを用いたRubyのバージョン管理

Ubuntu14.04にrbenvを導入しRubyのバージョン管理をできるようにする方法
 
# 1. rbenvとruby-buildをダウンロード

```console
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
apt-get install -y autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm3 libgdbm-dev
``` 

# 2. パスを通す
.bashrcに追記

```bash:.bashrc
[[ -d ~/.rbenv  ]] && \
  export PATH=${HOME}/.rbenv/bin:${PATH} && \
  eval "$(rbenv init -)"
```

# 3. rbenvを用いてRubyのインストール

```console
rbenv install -l
rbenv install 2.x.x 　#リストからインストールしたいものを選択
rbenv global 2.x.x　　#使いたいバージョンを指定
ruby -v
``` 

詳細は以下を参照

http://qiita.com/ringo/items/4351c6aee70ed6f346c8
[Swift] お気楽Substring


*以下で取得してるものはすべて`String`ではなく`Substring`です*

##部分文字列

部分文字列が欲しい！ググろう！

```swift
// 文字列 "Hoge" を取り出す
let string = "pre_Hoge_suf"
let substring = string[string.index(string.startIndex, offsetBy: 4)..<string.index(string.endIndex, offsetBy: -4)]
```

**なんだこれ？ ややこしすぎるやろ！！ 頭おかしい**

###これでいい

```swift
// 文字列 "Hoge" を取り出す
let string = "pre_Hoge_suf"
let substring = string.dropFirst(4).dropLast(4)
```

##いろいろな部分文字列

###先頭 n文字

```swift
let substring =  string.prefix(n)
```

###末尾 n文字

```swift
let substring = string.suffix(n)
```

###先頭n文字削除（n+1文字目から最後まで）

```swift
let substring = string.dropFirst(n)
```

###末尾n文字削除（先頭からn-1文字目まで）

```swift
let substring = string.dropLast(n)
```

###n文字目からm文字目まで (n < m)

```swift
let substring = string.prefix(m).dropFirst(n - 1)
```


##でも遅いんでしょ？

**遅くないです！**
HTML＆CSS 復習

HTMLは、ページの要素や構造を指定するための言語

HTMLの記法は、下のコードのように開きタグと閉じタグで囲むような形 

<タグ名>...</タグ名>
このように囲んだものが一つの要素　リンク：a <!a herf=“URL”>
画像：img src <!img src=“画像のURL”> 

リスト：li <!li>なんか項目になるもの<!/li>　
cf)<!ul>で囲むと黒点がつく
<!head>:ページに関する情報　（設定に関する情報であり、表示されない）
<!body>:実際に表示したい内容

<!DOCTYPE html> :HTMLのバージョンを宣言する（必ず記述する）

<!meta charset=“utf-8”> :文字化けを防げる

<!div>~~~<!/div> :レイアウトを決める。要素をグループ化する
CSSHTMLで作った要素を装飾するスタイルを指定する言語
ページのデザインは基本的にCSSで記述
要素名 {
  プロパティ名:値;
}
要素名はHTMLのタグ名やid、class名
プロパティ名というのは、何のデザインをいじるのか、という部分
色を赤くしたい時

div {
  background:red;
}
AWS CLI

#インストール
参考：[Microsoft Windows で AWS Command Line Interface をインストールする](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/awscli-install-windows.html#install-msi-on-windows)

#設定

参考：[AWS CLI の設定](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-getting-started.html)

１．IAMユーザでアクセスキーを発行

２．プロンプトに設定

```
$ aws configure
AWS Access Key ID [None]: abcdefg
AWS Secret Access Key [None]: abcdefg
Default region name [None]: us-west-2
Default output format [None]: json
```

もしくは環境変数に設定する。

#S3内を見る

```
aws s3 ls バケット/ディレクトリ
```
Windowsのコマンドプロンプト(cmd)を最強にする方法

# はじめに
「Windowsのコマンドプロンプト(cmd)を最強にしたいな(= bashコマンドが使いたい)」と思い、
可能な限りLinuxの操作感に近づけるためのTipsをまとめました。

* コンセプト：Windowsのcmdを強化する
* 動作確認済OS：Windows 7, Windows8.1, Windows10 1809

# 1.Gow(Gnu on Windows)のインストール

**Gow**
https://github.com/bmatzelle/gow

よりGowをダウンロード・インストールする。 ※2016/10/20時点 Gow-0.8.0.exeが最新

 
※参考
[Cygwinより手軽にUNIX風環境が手に入る「Gow」]
(http://news.mynavi.jp/articles/2011/12/12/gow/)

Gowをインストールすることにより、bashのコマンドが使用可能になる

# 2.clinkのインストール

**clink**
https://mridgers.github.io/clink/

よりclinkをダウンロード・インストールする。 ※2016/10/20時点 v0.4.8が最新

 

※参考 
[Windows OS上で超気軽にbash環境を楽しめる「clink」](http://news.mynavi.jp/articles/2013/07/29/clink/001.html)

clinkをインストールすることにより、tab補完、ctrl+vでのペーストなどが使えるようになる。

 

# 3.lsなどの不具合の解消
Gowデフォルトではlsを発行すると、日本語が文字化けする。

 http://www.steve.org.uk/Software/bash/bash-203.zip

より、bash-203.zipをダウンロードし解凍する。

 

ls.exeを、 C:\Program Files (x86)\Gow\binにコピーする。 ※Gowの元のls.exeを上書きする。

その際、less.exeなどもコピーすると使えるようになる。その他の使いたいコマンド(e.g. emacs.exeなど)も上記パス内に配置すると実行可能になる。

 

Windowsの環境変数で、gitのbashなどが先に通っている場合そちらが優先されてしまう。

なので、gow\binのパスを先に通すようにする。

# 上手く動かないコマンドの調査 

e.g. lsの場合

```bash
$ where ls
```

を発行すると、どこのパスのコマンドを実行しているのか分かるのでパスの設定でgow\binのコマンドが実行されるようにする

 
以上
【Windows】環境変数の設定・展開

##設定
```
set val=12345678
```

- 「=」の前後にスペースを入れると、そのスペースも環境変数名の一部、あるいは値の一部として扱われる

- setはコマンドプロンプトを開いている間のみ有効。永続化する場合は、setxを使用する。

##展開
```
echo %val%
```
iタウンページからメールアドレスを大量に取得する方法

[参考](https://off.tokyo/blog/i%e3%82%bf%e3%82%a6%e3%83%b3%e3%83%9a%e3%83%bc%e3%82%b8%e3%81%8b%e3%82%89%e3%83%a1%e3%82%a2%e3%83%89%e3%82%92%e3%82%b9%e3%82%af%e3%83%ac%e3%82%a4%e3%83%94%e3%83%b3%e3%82%b0%e3%81%99%e3%82%8b%e6%96%b9/)
メディアクエリとviewportの使い方について

# メディアクエリとviewportを正しく使おう。
この記事はメディアクエリ？、viewport？と思う方に向けて書きました。
最初に言っておくとメディアクエリとviewportは一緒に使おう！

## メディアクエリって何だろう？

メディアクエリは簡単に言えばレスポンシブwebデザインを構成する際に必要なものです。

- レスポンシブwebデザインとは？

レスポンシブwebデザインは、自分がみてるデバイス（スマホ、タブレット、PC）に関係なくwebサイトの画面を表示することができるようになるデザインのことです。

## viewportって何だろう？

viewportとはデバイス、ブラウザウインドウなどの表示領域こと。
表示領域とは自分が今見てるブラウザの画面幅そのものだと思っていただければいいです。

# メディアクエリの書き方は主に２種類ある！

- モバイルファースト
モバイルファーストとは、webサイトを作る際にスマートフォンサイトから作成するときに使われる手法です。

- デスクトップファースト
デスクトップファーストとは、webサイトを作る際にPC版から作成するときに使われる手法です。

モバイルファーストとデスクトップファーストの書き方を見ていこう！

```index.css

/*モバイルファースト*/
h1 {
　color:red;
　}
　@media screen and (min-width:480px) {
　/*　画面サイズが480pxからはここを読み込む　*/
　h1 { color:#ededed;}
　}
　@media screen and (min-width:768px) and ( max-width:1024px) {
　/*　画面サイズが768pxから1024pxまではここを読み込む　*/
　h1 {color:red;}
　}
　@media screen and (min-width:1024px) {
　/*　画面サイズが1024pxから*/
h1 {color:blue;}
}
```

```index.css

/*デスクトップファースト*/
.background {    background-color: #E4E3E4;} /* 1024px以上の幅の場合に適応される */
@media screen and (max-width: 1024px) {
　/* 1024pxまでの幅の場合に適応される */
　.background {
　background-color:#2262D1;
　}
　}
　@media screen and (max-width: 768px) {
　/* 768pxまでの幅の場合に適応される */
　.background {
　background-color:#f10010;
　}
　}
　@media screen and (max-width: 480px) {
　/* 480pxまでの幅の場合に適応される */
　.background {
　background-color:#F9DF2C;
　}
　}
　@media screen and (max-width: 350px) {
　/* 350pxまでの幅の場合に適応される */
　.background {
　background-color: #68B876;
　}
```
メディアクエリにおけるmin-width, max-widthとは？

- min-width
min-widthは最低でも○○pxからcssを適用させるというものです。

- max-width
max-widthは最高でも○○pxまでcssを適用させるというものです。

メディアクエリを書く際に注意しなければいけないのはcssの上書きです。
メディアクエリは便利な仕様ですが必ず順番に書かなくてはいけません。
モバイル向け、タブレット向け、PC向けの順番をめちゃくちゃに記述することはできません。めちゃくちゃに書いてしまうと一部のスタイルが適用されなくなるからです。

以下にメディアクエリの悪い例を示します。

```index.css
/*メディアクエリの悪い例*/
h1 {
　color:red;
　}
　@media screen and (min-width:480px) {
　h1 { color:#ededed;}
　}
　@media screen and (min-width:200px) and ( max-width:1024px) {
　h1 {color:red;}
　}
　@media screen and (min-width:1024px) {
h1 {color:blue;}
}
```
この書き方をしてしまうと、`@media screen and (min-width:480px)`は、`@media screen and (min-width:200px) and ( max-width:1024px)`に上書きされcssが適用されなくなるという現象が起こります。
なのでメディアクエリを書く際には、モバイルファースト（小さい→大きい）とデスクトップファースト（大きい⇨小さい）の順番にして書くようにしましょう。

## viewportの書き方を見ていこう

- viewportの基本的な書き方

```
<meta name="viewport" content="width=device-width, initial-scale=1.0">
```

viewportをhtmlファイルに指定する際は、基本的にこれでいいと思います。
device-widthは基本的に立ち上がっているブラウザ、デバイスのスクリーンの横の幅で指定される。
initial-scaleは初期表示時のスケールを指定します。

他にも色々書き方はありますがこの辺はググれば見つかるので省略しときます。

## メディアクエリとviewportを一緒に使ったほうがいい理由

- よりレスポンシブなwebデザインになる
- viewportだけを指定しただけだとサイトをスマホで見ると画面にサイトがぴったり収まって見えるだけになる

# 最後に

今回はメディアクエリとviewportについて簡単にまとめて見ました。
この二つをうまく使うことによって見やすく綺麗なwebデザインが作成できると思うのでぜひ試して見てください！
【PowerShell】他ユーザが復号できる形でパスワードを暗号化したい

PowerShellスクリプトで特権を使用したい。
だけどパスワードを埋め込みたくない…！！

よしんば自分の端末だけで利用するならともかく、
利用者の使用する端末で管理者権限実行したい！でもパスワードは秘密にしたい！

そういう状況があったので色々やってみました。
以下忘備録


【他ユーザが復号できる形でパスワードを暗号化】

```PowerShell:PowerShell

パスワード：p@ssw0rd


#  パスワードをSecure-Stringにして保存
$Secure = ConvertTo-SecureString -String "p@ssw0rd" -AsPlainText -Force

# 暗号化用のバイト配列を作成(192bit)
# 今回は8bit*24個で192bitを用意。復号にも利用するため保管しておく。
[byte[]] $EncryptedKey = (3,4,2,3,56,34,254,222,1,1,2,23,42,54,33,233,1,34,2,7,6,5,35,43)


#セキュアストリングを暗号化された標準文字列に変換
$encrypt = ConvertFrom-SecureString -SecureString $Secure -key $EncryptedKey

#暗号化された標準文字列をテキストに出力
$encrypt | Out-File c:\temp\encrypted.txt

# ちなみに、txtの中身はこんな感じ。
PS C:> $encrypt
76492d1116743f0423413b16050a5345MgB8AGEAQgBEAGcASQBBAGgAbABsAG0AagBqAEUAZwBhAGUARQA3AEgAYQBwAHcAPQA9AHwAOABmADYAYgAxAGM
AZQAxAGQAZgAxAGMAZgBmAGIAYQA1ADcAYwBkAGEAZgAxAGMAZABlAGMAYQAwAGYANQBhADYAOQAxADUAMwA2ADcAMwBlAGYANgBlADAAOQA4ADcAMgAxAG
MAMwA2ADUAZQBjADIAYwA4ADMAYgAwADUAMQA=

```

最初にSecure-Stringに変換したパスワードを

```PowerShell:PowerShell
$encrypt = ConvertFrom-SecureString -SecureString $secure
```

で標準文字列にするパターンもあるが、それだと他のユーザが複合した際にエラーが出る。


【復号する】

```powershell:PowerShell

暗号化パスワードファイルパス： C:\temp\encrypted.txt


#暗号化で使用したバイト配列を用意
[byte[]] $EncryptedKey = (3,4,2,3,56,34,254,222,1,1,2,23,42,54,33,233,1,34,2,7,6,5,35,43)

#暗号化された標準文字列を読み込んで、Secure-Stringに変換
$importSecureString = Get-Content C:\temp\encrypted.txt | ConvertTo-SecureString -key $EncryptedKey

#Secure-Stringから文字列を取り出す
$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($importSecureString)
$StringPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr)

#標準出力
write-host $StringPassword

p@ssw0rd

```

やったぜ。


そして平文にできた喜びから、平文にしたパスワード情報を使用してGet-Credentialで認証情報を作成しようとすると

```Powershell:PowerShell

$credential = New-Object System.Management.Automation.PsCredential "<MyDomain\User>", $StringPassword

New-Object : "PSCredential" のオーバーロードで、引数の数が "2" であるものが見つかりません。
発生場所 C:\Users\hogehoge\Runas.ps1:29 文字:9
+ $cred = New-Object System.Management.Automation.PsCredential $user,$S ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [New-Object]、MethodException
    + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand


```

と、上記のようにエラーを吐くため注意。
ちゃんとSecure-Stringを使ってあげればOK。




参考になったサイト：https://github.com/senkousya/usingEncryptedStandardStringOnPowershell
[Swift] Protocolがrequireしているかどうか、それが問題だ。

# 概略

Swiftにおいて、protocol extensionで関数を実装したとしても、そのprotocolがその関数を必要とすると**宣言しているか否か**で、結果が変わることがあるよ。
(あとから気付いたのですが、[別の方の記事](https://qiita.com/omochimetaru/items/17cdbb5a77972c82a781)の要約のようになってしまいました。詳しく知りたい方は当該記事をご覧ください。)

# 百聞は一見にしかず

この記事で言いたいことの全ては下記のコードが語ってくれます：

```Swift
protocol P {
  func f()
}

protocol Q {
  // こっちは、からっぽ。
}

extension P {
  func f() { print("P") }
}

extension Q {
  func f() { print("Q") }
}

struct SP: P {
  func f() { print("SP") }
}

struct SQ: Q {
  func f() { print("SQ") }
}

SP().f() // "SP"と表示
SQ().f() // "SQ"と表示

func g<T>(_ p:T) where T:P { p.f() }
func g<T>(_ q:T) where T:Q { q.f() }

g(SP()) // "SP"と表示
g(SQ()) // "Q"と表示！！
```

Swiftに精通している方にとっては常識なのかもしれませんし、よく考えると当然の動作とは言えます。

## 素人による解説

```Swift
SP().f() // "SP"と表示
SQ().f() // "SQ"と表示
```

これは期待を裏切らない動作ですね。`SP`も`SQ`も関数`f()`を実装していることは分かっているので、それぞれの構造体で実装されているメソッドが呼ばれます。
それでは次を見てみましょう。

```Swift
func g<T>(_ p:T) where T:P { p.f() }
func g<T>(_ q:T) where T:Q { q.f() }

g(SP()) // "SP"と表示
g(SQ()) // "Q"と表示！！
```

この動作の違いこそ、プロトコルが必要とする要件に`func f()`が宣言されているかどうかが生み出すものです。

プロトコル`P`には`func f()`が必要と宣言されています。即ち、本来であれば`P`に準拠する構造体(クラスや列挙型などもね)が実装の責任を負うことになります。ところで、関数`g`にとって引数`p`は`P`に準拠していることが判明しています。ということは、`p`はメソッド`func f()`を実装しているはずです。だからこそ、`p`そのものに実装されている`func f()`を安心して呼び出せます[^p-func_f]。

一方、プロトコル`Q`は`func f()`が必要とは宣言されていません。なので、関数`g`にとって、引数`q`が`func f()`を実装しているかどうかなんて分かりません。むしろ、実装していないと考えるのが自然(安全)でしょう。となると、`q`に対して`func f()`を呼び出そうとする危険な行為はせず、protocol extensionにある`func f()`を呼ぶことになるでしょう。

-----
[^p-func_f]: `SP`から`func f()`を消すと、`P`のprotocol extensionにある`func f()`が呼び出されます。ここでの疑問は、“`P`のprotocol extensionに`func f()`が実装されていたとしても、`SP`に`func f()`が実装されていなかったら、関数`g`で`p`に対して`func f()`を呼び出そうとした時に、なぜクラッシュしないのか？”ということです。これは予想ですが、コンパイラによって、`SP`に暗黙的に`func f()`を作るというようなこと(protocol extensionの`func f()`をコピーするまたはそれへ転送するような形)をしているのではないでしょうか。そうでなければ、`func f()`を動的に探索する際の選択肢にprotocol extensionの`func f()`を加えているということになりますが…。はたして？正解は[GitHub/apple/swift](https://github.com/apple/swift)で！(丸投げ)
AndroidStudioのフォントファイルの名前について（備忘録メモ）

AndroidStudioのフォントの種類を変更をしたいときに遭遇したエラーについてのメモ。

[公式のガイドライン](https://developer.android.com/guide/topics/ui/look-and-feel/fonts-in-xml)を参考にgoogleFontsからフォントをdownloadしてフォントの追加を進めていったら、
**/.../app/src/main/res/font/roboto-Black.ttf: Error: 'R' is not a valid file-based resource name character: File-based resource names must contain only lowercase a-z, 0-9, or underscore**
というエラーが😂

例えば、**Roboto-Medium.ttf**という名前の大文字と-記号を変更しないといけないです。
ということで下記画像のように名前を変更したら解決。
<img width="272" alt="Screen Shot 2018-08-14 at 11.06.59 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/121228/2eb7aff9-85fb-0210-f621-6a2632c1541e.png">
[Angular エラー対策] Expected validator to return Promise or Observable

# エラーメモ

```
ERROR Error: Uncaught (in promise): Error: Expected validator to return Promise or Observable.
Error: Expected validator to return Promise or Observable.
```

# 対策

おそらく、下記のようにバリデーションを複数つけようとしてミスしている。

```
  form = this.fb.group({
    id: [''],
    name: ['', Validators.min(100), Validators.required],
  });
```


`compose` を使って `Validator` をまとめましょう。

```
  form = this.fb.group({
    id: [''],
    name: ['', Validators.compose([Validators.min(100), Validators.required])],
  });
```
PHP オブジェクトのプロパティにエスケープが必要な文字が入っててハマった。

jsonをデコードしたオブジェクトのプロパティに
/やらが入っていて少しハマったので。。

相変わらずド初心者なので詳しいことは偉い人に聞いてください！

#今回要素を取得したいオブジェクト
twitterAPIのアクセス制限情報のjsonから抜粋。
プロパティにエスケープが必要な文字列が含まれてます。

```php:hoge.php

# $object の中身が…
object(stdClass)#4 (2) {
  ["/followers/ids"]=>
  object(stdClass)#5 (2) {
    ["limit"]=>
    int(15)
    ["remaining"]=>
    int(15)
  }
}
```
#解決策
当然そのまま

```php:hoge.php
$object->/followers/ids;
```
ってやると「突然"/"出てきたんだけど！？」って怒られます。
条件反射的にエスケープしても…

```php:hoge.php
$object->\/followers\/ids;
```
「突然"\"出てきたんだけど！？」って怒られます（残当）。

```php:hoge.php
$object->{"/followers/ids"};
```
で許してもらえます。
CakePHP3でcontainのテーブルに条件を指定する

## 環境
CakePHP 3.5

## 前提
posts hasMany commentsの関係とする

## やること
commentsのid=123のレコードを取得する

```PostsController.php
<?php
namespace App\Conttoller;

class PostsController extends AppController
{
    /*
     * index method
     */
    public function index()
    {
       $posts = $this->Posts->find()
           ->contain([
               'Comments'
           ])
            ->matching(
                'Comments', function($q) {
                    return $q->where([
                        'id' => 123
                    ]);
            });
           ->order([
               'id' => 'ASC'
           ]);
    }
}
```
WinSCPでS3にアップロードするための覚書

#はじめに

 WinSCPがAWS S3に対応したので、WinSCPをS3クライアントとした場合の設定について覚書を書いていく

# WinSCPのインストール

以下からパッケージをダウンロードする。
https://ja.osdn.net/projects/winscp/

大抵はWinSCP-5.x.x-Setup.exeでいいと思うが、RPAと連携したりする場合はWinSCP-5.x.x-Automation.zipをインストールすると、WinSCPをCOMオブジェクトとして動かせるようになる、補足として、COM登録は以下のコマンドでできる

```
%WINDIR%\Microsoft.NET\Framework\<version>\RegAsm.exe WinSCPnet.dll /codebase /tlb
``` 

# WinSCPのコマンドライン

このあたりは、ヘルプに載っている内容なのでさらっと転記しておきます

```
winscp.exe ＜保存したセッション名＞
winscp.exe [(sftp|ftp|scp)://][ユーザー名[:パスワード]@]ホスト名[:ポート][/開くパス/[ファイル名]]
winscp.exe [mysession] /synchronize [ローカルディレクトリ] [リモートディレクトリ「] [/defaults]
winscp.exe [mysession] /keepuptodate [ローカルディレクトリ] [リモートディレクトリ] [/defaults]
winscp.exe [mysession] /upload ファイル1 ファイル2 ファイル3 ... [/defaults]
winscp.exe [mysession] [/privatekey=<秘密鍵ファイル>] [/hostkey=<鍵の指紋>]
winscp.exe [mysession] [/passive] [/implicit|explicitssl|explicittls]
winscp.exe [mysession] [/timeout=<行>]
winscp.exe [/console] [/script=スクリプトファイル] [/command コマンド1 コマンド2 ...] [/parameter パラメータ1 ...]
winscp.exe /ini=<iniファイル> /log=<ログファイル>
winscp.exe /update
winscp.exe /help
また、WinSCPにはコンソール機能を呼び出す「winscp.com」という実行ファイルも付属しています。winscp.comの基本的なオプションは下記のとおりです。

winscp.com [/script=スクリプトファイル] [/command コマンド1 コマンド2 ...] [/parameter パラメータ1 ...]
winscp.com /ini=<iniファイル> /log=<ログファイル>
winscp.com /help
```

# WinSCPをS3クライアントとして使うための準備

接続先パケットを用意する、ここでは、説明のため以下の名称のバケットを作ったとする

```
s3://winscp-file-modify
```

AWS IAMにて、S3に対して必要な権限を付けた、credentialを発行する
※なおアクセス制限については、S3のポリシーで設定することになるので、留意する。

```
Access key ID     = AXXXXXXXXXXXXXXA
Secret access key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
```

# WinSCPに接続設定を登録する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114928/0208e2dc-d2f8-57ef-e482-8be5032b0794.png)

スクリーンショットのように
`転送プロトコル` を `Amazon S3` に指定
`アクセスキー`と`シークレットキー`には、IAMで生成したcredentialの内容を転記する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114928/4dfee4b5-5440-7696-7849-35ccc43270f8.png)

次に、`設定(D)...` ボタンから `高度なサイトの設定` を開き `リモートディレクトリ` に `/(s3バケット名)` を指定する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114928/c4a08763-23a4-d09a-e6ba-7e1feab0087f.png)

設定が終わったら、`保存`ボタンで保存する。セッション名は任意で構わないが、デフォルトは`アクセスキー@s3.amazonaws.com`になっている(ここでは次の説明でも使うのでデフォルト名で保存)

# 通常利用の場合

![image.png](https://qiita-image-store.s3.amazonaws.com/0/114928/9c4d83f8-11c4-d88d-5b09-f90f4a0700eb.png)

基本的に通常のWinSCPと同じように、左右のペインのファイル移動でアップロード/ダウンロードができる
<font color=red>※注意点として、`/<ルート>` でディレクトリを操作するとバケットが操作できるので注意が必要</font>
`/<ルート>` でディレクトリを作成すると、バケットが作成される
`/<ルート>` でディレクトリを削除すると、バケットが削除される
`/<ルート>` でディレクトリをリネームすると、バケットが別名で生成され、内容がコピーされ、元のパケットが削除される
<font color=red>そのため、バケットの操作はポリシーできちんと縛っておかないと事故のもとになるので注意が必要</font>

# WinSCPのコマンドラインからS3にファイルをアップロードする

コマンドラインからバケットにアップロードするには、以下のコマンド、
s3cmdやawscliでインタプリタを別途インストールしたりする必要がないので非常に楽です。
s3をftpみたいな感覚で扱える点が素晴らしい!!


以下のようにすると、セッションに登録されているバケットにアップロードされる

```
winscp.exe <アクセスキー>@s3.amazonaws.com /upload <ドライブ:\パス\ファイル名> /defaults
```

# さいごに

WindowsのS3のGUIクライアントは有料のものが多く、手軽に扱えるものが少なかったので、WinSCPがS3に対応したのは非常に良かったと思います。
PhpStorm で開いているファイルを VSCode サクッと開く


#前提条件

- PhpStorm, WebStorm, IntelliJ, などおそらく Jetbrains の IDE ならどれでも
- VSCode の GitLens が便利だけどエディタは PhpStorm を使いたい人向け

VSCode のプラグイン [GitLens](https://gitlens.amod.io/) がとても便利なのですが、VSCode にしか対応しておらず、PhpStorm や IntelliJ からも簡単に使用できるようにしたいと思ったことがキッカケです。

2020年6月8日 追記：

```
Jetbrains製IDEならGitLensの代わりにGitToolBoxでほぼ同じことができます👍
https://stackoverflow.com/questions/55473907/can-i-get-inline-blame-like-gitlens-on-webstorm
```
このようにコメントいただきました。GitLens の代用はこの GitToolBox というプラグインでできそうです。


#設定

設定は環境設定の `Extenal Tools` を使用します。
事前準備として VSCode の Cli Tool のインストールが必要です。
[ターミナルからVisual Studio Codeを起動する方法【公式の方法】](https://qiita.com/naru0504/items/c2ed8869ffbf7682cf5c) 

![スクリーンショット 2018-08-14 9.47.19.png](https://qiita-image-store.s3.amazonaws.com/0/208400/b39a1a8c-49f9-52d1-8320-3db951f4c67a.png)

`＋` アイコンをクリックして設定を追加します。

![スクリーンショット 2018-08-14 10.12.22.png](https://qiita-image-store.s3.amazonaws.com/0/208400/55a64edd-5f8b-c905-7b27-59573f679620.png)

|設定名|概要|
|:----|:----|
| Name| メニュー名|
| Group| メニューのグループ名|
| Description| コマンドの説明|
| Program| 実行するコマンド|
| Arguments| コマンドの引数|

`INSERT MACRO` をクリックすると環境変数が指定できます。

今回は VSCode を起動する以下のコマンドをこのダイアログで設定します。

```bash
code {filePath}
```

`Advanced Options` の `Open console for tool output` にチェックがあると、コマンド実行の標準出力をIDEのコンソールに流してくれますが、今回は不要なのでチェックを外しておきます。

![スクリーンショット 2018-08-14 9.48.42.png](https://qiita-image-store.s3.amazonaws.com/0/208400/67869af8-9914-bfc5-4729-24a8aaafce5b.png)

設定が追加されました。`OK`をクリックして設定をIDEに反映します。

![スクリーンショット 2018-08-14 9.49.02.png](https://qiita-image-store.s3.amazonaws.com/0/208400/9d738214-27f0-59e7-56e1-8e655f0a4a2d.png)

タブを右クリックしてメニューを表示すると追加したグループとコマンドメニューが追加されています。

タブ以外にも、ツリービューのファイルやディレクトリごと VSCode で開けるので便利です！