OmniAICreator/Qiita-1.07M huggingface dataset:
AWS-CLI構築メモ for.CentOS7

#はじめに
本記事は、AWSのCLI環境を構築する際の自分用のメモである。
手順としては、
(1)Linuxbrewインストール
(2)Python3 インストール
(3)aws-cli　インストール
(4)aws-cli　セットアップ
こんな感じでやっていきます。

#前提条件
・OSの初期設定が完了していること
・実行ユーザは、「rootユーザ」ではなく、「一般ユーザ」で実施
・一般ユーザ用のsudo設定が完了していること
・IAMユーザは、S3へのアクセス権限があること


#実行環境
・本記事の実行環境は、Vitualboxで稼働中のCentOS7で実施
・以下、OS情報。

```
# cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)
```


#(1)Linuxbrewインストール
##(1.1)Linuxbrewの必須パッケージインストール
```
$ sudo yum groupinstall 'Development Tools' && sudo yum install curl file git
```

##(1.2)Linuxbrewのインストール
```
$ sh -c "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install.sh)"
```
※「Warning:/home/linuxbrew/.linuxbrew/bin is not in your PATH」が表示されるが無視してよい。

##(1.3)ユーザの環境設定
ユーザのログイン時の読み込みファイルにLinuxbrew関連の設定を追記

```
$ sudo vi $HOME/.bash_profile
以下、3行を末尾に追記
export PATH=/home/linuxbrew/.linuxbrew/bin:/home/linuxbrew/.linuxbrew/sbin:$PATH
export MANPATH=/home/linuxbrew/.linuxbrew/share/man:$MANPATH
export INFOPATH=/home/linuxbrew/.linuxbrew/share/info:$INFOPATH
```

設定反映を実施

```
$ source $HOME/.bash_profile
```

##(1.4)Linuxbrewバージョン確認
```
$ brew -v
```
※ここでバージョンが表示されればOK


#(2)Python3 インストール
##(2.1)Python3　インストール
```
$ brew install python3
```

##(2.2)Python3　バージョン確認
```
$ python3 -V
```
※ここでバージョンが表示されればOK

##(2.3)Python3のパスを確認
```
$ which python3
```
※パスが表示されればOK


#(3)aws-cli　インストール
##(3.1)aws-cli　インストール
```
$ pip3 install awscli --upgrade --user
```


##(3.2)aws-cli　バージョン確認
```
$ aws --version
```
※ここでバージョンが表示されればOK

##(3.3)aws-cliのパスを確認
```
$ which aws
```

※パスが表示されればOK


#(4)aws-cliセットアップ

##(4.1)AWSアクセス設定
```
$ aws configure
↓以下、入力項目で設定を実施する
AWS Access Key ID [None]: 
AWS Secret Access Key [None]: 
Default region name [None]: 
Default output format [None]: 
```

以下、項目説明


| 入力項目    | 概要            | 
|:-----------|:----------------|
| AWS Access Key ID [None]     | アクセスキー |
| AWS Secret Access Key [None] |  シークレットアクセスキー |
| Default region name [None]:  |    デフォルトのリージョン(例： ap-northeast-1) |
| Default output format [None]:|結果の形式を指定(例：json) |


##(4.2)AWSへのアクセス確認
```
$ aws s3 ls s3://バケット名
```
※エラーが出なければOK


#最後に
自分用のメモなので、けっこうざっくりした感じで書きました。
情報が不足している点があるかと思いますが、その際は他サイトをご参照ください。
※認識違いなどあれば、御指摘いただければ幸いです。

#参考URL
https://fukatsu.tech/linuxbrew
https://note.mu/coeeff/n/neab8acfde97e
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html
(多分)いちばんシンプルなUIScrollViewの実装

# UIScrollView入門
UIScrollViewの一番シンプルな実装方法を書きます。
※Swift5, Xcode11.0で説明いたします。

## UIScrollViewを配置し、制約をつける
![Q1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208118/1da5041d-64eb-ebde-c611-b979da0a2103.gif)

- UIScrollViewを配置
- UIScrollViewに対して、サイズと配置を決める制約を設定<br/>(サンプルでは画面いっぱいに表示されるようにしてます)

画面の一部をスクロールビューにしたい場合は、この段階で制約をつけておきます。

## スクロールさせるViewを配置し、制約をつける
![Q2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/208118/f2044c88-a6f4-87b7-88f7-0e38138c734c.gif)

- UIViewを配置
- 親View(UIScrollView)からのマージンが0になるように制約を設定
- **配置したViewの横幅[^1]が親Viewと同じになるように制約を設定(UIScrollView)**

あとはスクロールさせたいViewの高さを決めてあげればスクロールできるようになります。


少しでも参考になれば幸いです。
ありがとうございました。

[^1]: 横にスクロールさせたい場合は高さを合わせるようにしてください。
AWS CloudFormation テンプレート文法に関するメモ

# 何
- CloudFormationテンプレートについて、文法を勉強したので小さな構成でメモする。
- EC2インスタンスをひとつ立てて、各文法でOutputsすることで動作を確認している。
- 全体的に、思い出し用のとっかかり程度の内容です。

## テンプレート
- リージョンは「バージニア北部」で実施する想定で書いている。


```template.yaml
---
# 任意の Mappings セクションでは、キーと名前付きの一連の値とが対応付けられます。
Mappings: 
  RegionMap: 
    us-east-1: 
      Name1: Value01
      Name2: Value02
    other: 
      Name1: Value03
      Name2: Value04

# オプションの Parameters セクションを使用して、テンプレートをカスタマイズします。
# パラメーターを使用すると、スタックを作成または更新するたびにテンプレートにカスタム値を入力できます。
Parameters:
  EnvType: 
    Description: Environment type.
    Default: test
    Type: String
    AllowedValues: 
      - prod
      - test
    ConstraintDescription: must specify prod or test.      

# オプションの Conditions セクションには、エンティティが作成または設定される状況を定義する文が含まれています。
Conditions: 
  CreateProdResources: !Equals [ !Ref EnvType, prod ]      

# 必須の Resources セクションでは、スタックに含める AWS リソース (Amazon EC2 インスタンスや Amazon S3 バケットなど) を宣言します。
Resources:
  MyInstance:
    Type: AWS::EC2::Instance
    Properties:
      AvailabilityZone: us-east-1a
      ImageId: ami-a4c7edb2
      InstanceType: t2.micro

# オプションの Outputs セクションは、他のスタックにインポートする (クロススタック参照を作成)、応答として返す (スタック呼び出しについて記述)、
# または、AWS CloudFormation コンソールで表示する出力値を宣言します。
Outputs:

  # 組み込み関数 Ref は、指定したパラメータまたはリソースの値を返します。
  ByRef:
    Description: Ref
    Value: !Ref MyInstance
    # Export: クロススタック参照にエクスポートされるリソース出力の名前。
    Export:
      Name: MyInstanceId

  # Fn::GetAtt 組み込み関数は、テンプレートのリソースから属性の値を返します
  ByGetAtt: 
    Description: GetAtt
    Value: !GetAtt MyInstance.AvailabilityZone

  # 組み込み関数 Fn::Sub は特定した値の入力文字列にある変数の代わりになります。
  BySub: 
    Description: Sub
    Condition: CreateProdResources
    Value: !Sub
      - ${A}-${B}
      - { A: !FindInMap [RegionMap, !Ref "AWS::Region", Name1], B: !Ref MyInstance }

  # 組み込み関数 Fn::Join は、一連の値を特定の区切り文字で区切って 1 つの値に追加します。
  ByJoin:
    Description: Join
    Value: !Join [ ":", [ a, b, z ] ]

```

## 出力
- Outputsを出力タブで確認する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151200/43ffae87-65a8-0e40-cc8c-2e5cc26303ae.png)


## メモ
- パラメータはRefで参照する。
- exportはこの例では必要なかったが、文法の確認用に行った(※Nameはリージョン内で一意である必要がある)
- RefとGetAttの違いが分かりにくかったが、[リソースリファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/AWS_EC2.html)で該当する項目の[戻り値](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html#aws-properties-ec2-instance-return-values)をみると違いや属性の種類がわかった。
- 完全名関数と短縮形では、文法が結構違う。
``` 例
Fn::GetAtt: [ logicalNameOfResource, attributeName ]
!GetAtt logicalNameOfResource.attributeName
```

- [組み込み関数リファレンス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html)

- [疑似パラメータ](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/pseudo-parameter-reference.html)
Pythonで上位ディレクトリをimportする

# 概要
python3で上位ディレクトリのファイルをimportできるようにする

# 方法
```python
import sys
import os
sys.path.append(os.path.dirname(sys.path[0]))
import top
```
`sys.path.append()`で追加。
`sys.path[0]`で現在のパスを取得。
`os.path.dirname()`で一つ上のディレクトリのパスを取得

# ディレクトリ構成
```
dir/
　├ tmp/
　│　└ main.py
　└ top.py
```

# 終わりに
知ってれば簡単。
~~from-..-import-top~~でできるって記事があるけど、できない。
PostgreSQLのバルクインサートをRubyからPrepared Statementで実行

タイトルの通りですが、PostgreSQLのバルクインサートをRubyからPrepared Statementで実装しました。

もっとスマートな方法があるんじゃないかと思いつつも、これ以上わからなかったので、きょうやった方法を記録しておきます。

# 概要

以下のような文字列をRuby側で組み立ててPrepared Statementとして実行します。

```
INSERT INTO sample1 (id, value) VALUES ($1, $2), ($3, $4), ($5, $6)
```

# 準備

PostgreSQL, Rubyのインストールは済ませているものとします。

PostgreSQLの中にサンプルのデータベースを作成します。次にサンプルのテーブルを今回は以下のようなカラム構成で作成します。

```
CREATE TABLE sample1 (id int, value text);
```

Rubyは`pg`というgemが必要です。今回はGemfileに

```
gem 'pg'
```

と記述し、

```
$ bundle install
```

を実行しました。bundleを使ったので以下でRubyを実行するには

```
$ bundle exec ruby test.rb
```

とします。

# Rubyのソース

Rubyのソースコードは以下のように書きました。上のほうで定義しているパラメータは適切な値に設定します。

```test.rb
require 'pg'

host = "localhost"
port = 5432
user = USERNAME
password = PASSWORD
dbname = "sample"

conn = PG::Connection.new({:host => host,
                           :port => port,
                           :user => user,
                           :password => password,
                           :dbname => dbname,
                          })

# サンプルデータ
inserting_data = [
  [10, "あいうえお"],
  [11, "かきくけこ"],
  [12, "さしすせそ"],
]

column_count = 2

# Prepared Statementの文字列組み立て
prefix_insert_sql = "INSERT INTO sample1 (id, value) VALUES "
prepared_stmt = prefix_insert_sql + ((0 ... inserting_data.size).map do |i|
  "(" +
  ((0 ... column_count).map do |j|
    "$%d" % [column_count * i + j + 1]
  end).join(", ") +
  ")"
end).join(", ")

# Prepared Statementに渡すデータの作成
prepared_stmt_data = inserting_data.flatten(1)

# デバッグ目的の出力
p prepared_stmt
p prepared_stmt_data

# Prepared Statementの準備
conn.prepare("insert", prepared_stmt)

# SQL実行
conn.exec_prepared("insert", prepared_stmt_data)
```

このこのRubyを実行すると、

```
$ bundle exec ruby test.rb
"INSERT INTO sample1 (id, value) VALUES ($1, $2), ($3, $4), ($5, $6)"
[10, "あいうえお", 11, "かきくけこ", 12, "さしすせそ"]
```

ただしくINSERTされているかは以下のSQLで確認できます。

```
sample=# SELECT COUNT(*) FROM sample1;
 count
-------
     3
(1 row)
```

Prepared StatementのSQLがデータ量に比例して長くなってしまうので、どれぐらいの大きさまで大丈夫なのか心配です。

サンプルデータを以下のように10万件にしてみたところ、

```
inserting_data = []
(0 ... 100000).each do |i|
  inserting_data += [[i + 20, "さ"]]
end
```

以下のようなエラーになりました。

```
test.rb:55:in `async_exec_prepared': number of parameters must be between 0 and 65535 (PG::UnableToSend)
```

Prepared Statementに埋め込むパラメータは65535個までという制限のようです。

# 問題点

データ量に応じて都度Prepared Statementを作らないといけないのが、ダサいと思います。もっといい方法はないのだろうか。
Gnome 3.30 の IBus で Dvorak 配列で日本語変換を利用する

## 動機
Debian10になってUIMでの日本語入力がうまくいかなかったのでIBusに移行したけど、日本語入力の配列がqwertyになっていて設定方法が分からない。
## やること
IBusの設定画面でSystem keyboard layout を使用するにチェックをつける。
![Screenshot from 2019-10-25 17-40-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220328/be93f2e0-4ea9-b8e5-808c-f4467341ef74.png)
好きな日本語入力方法を選択する
![Screenshot from 2019-10-25 17-40-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220328/49cad2a4-8d8e-20a0-3bcd-3a7e3d84160d.png)
システムキーボード設定をセットする
```setxkbmap us dvorak```
SASSの導入に今一つ積極的になれない方へ

#なぜSASSの導入を勧めたいか

*まだやったこともない、調べたこともない人向けです。*

なぜSASSの導入を勧めたいか…
それはひとえに楽だから！
それ以外に理由はないのです。
どのように楽かと言うと…

##入れ子

```ruby:css
.moge {
    margin: 0 0 10px;
}
.moge a {
    font-size: 10px;
}
.moge a:hover {
    text-decoration: none;
}
```
いつもならこう書くと思います。
がしかし、SCSSで書くと、

```ruby:css

.moge {
    margin: 0 0 10px;
    a {
        font-size: 10px;
        &:hover {
           text-decoration: none;
        }
    }
}

```
簡単！
入れ子最高。
わかると思いますが、いちいち親要素のclassをコピーしなくていいんですね。
.mogeならともかく、長い名前だったりするとコピーします。
このひと手間がないだけでだいぶ楽になります。
でも入れ子のやりすぎはダメだぞ。

この入れ子だけでもやる価値は十分にあると思うのですが、こんなもんじゃない。

##変数

```ruby:css
$mainColor: #333;
.moge {
  color: $mainColor;
}
```

これがコンパイルされると…

```ruby:css
.moge {
  color: #333;
}
```

こうなるわけです。
変数に格納して召喚できてしまうのです。ｶﾞｵｰ
色などいちいちフォトショップ見てからコード取ってきてとかやってたでしょう？
めんどくさいでしょう？
あれがなくなります。

[SassMeister](https://www.sassmeister.com/)
こちらのサイトでSASSが試せます。
SASSを書いたらどうコンパイルされるか色々試してみましょう＾＾
コンパイルって何？とかは今置いておきましょう。

変数はカスタムプロパティが使えれば何にも問題はないんですけどね。

##mixin

いつものお決まりのCSSの書き方があると思います。

```ruby:css
/* 1 */
@mixin ellipsis(){
    text-overflow: ellipsis;
    overflow: hidden;
    white-space: nowrap;
}
/* 2 */
.hoge {
  @include ellipsis;
}

/* 1 */
@mixin fontset($size,$color){
  font-size: $size + px;
  color: $color;
}
/* 2 */
.moge {
  @include fontset(19,#fff);
}
```

1を用意しておけば、この記述が必要な時に
2を書くだけ。

なんて簡単！
ほんのほんの少しだけ機能の紹介をしました。
もっとあるんですよ。
if文の使ったのものやらなにやら。

ひとまず導入してすぐに使えそうなものを紹介してみました。
これだけで時短になると思います。
これらを駆使して爆速コーディングめざしましょう。！(‘・ω・́)ゝﾋﾞｼ
iOS13でFOMAsimとesimでデュアルsim稼働させる方法

この前急にiPhoneがfomaの電波を拾わなくなって通話ができなくなり困りました。
いろいろと試したところその解決方法らしきものを見つけたので記事として紹介していきます。

# 私の使用環境

私のiPhone使用環境は次の通りで、通話のみfoma回線を使用しており、データ通信はIIjmioのdocomo回線を使用しています。
fomeメールの契約は生きていますが、セッティングと迷惑メールが面倒なので使用していません。

| 端末 | iPhone11|
|:-:|:-:|
| OS | iOS13.1.3 |
| 物理sim | foma sim |
| esim | IIjmio |

# 起こった問題

ある日急にfoma回線のみ圏外になりました。
再起動しても、機内モードのOFF→ONをすると1分ほどつながりますが、最終的に圏外になりまともに使える状況ではなかったです。
この時点でIIjmioのdocomo回線は問題なく繋がっていました。

ちなみに、docomoさんのオンラインサポートへ問い合わせたらsimフリーのiPhone使っているならappleに問い合わせるかXi契約に変えろと言われ、appleさんのオンラインサポートからはいくつかの解決策を試すように言われ、解決しないようであれば最終的にお店に持ってくるように言われました。

結局appleさんに言われた通りに解決策を試すが直らず、お店に持っていくことを視野に入れて自分でもう一度、試行錯誤することにしました。

# 試行錯誤

モバイル通信の設定がおかしくなったと思い、チェック。
するとネットワーク選択が以前は `NTT DOCOMO` と出ていたのに、空白になっていました。
そのため、ネットワーク選択に `NTT DOCOMO` が継続的に表示されるようになれば繋がったままになると推測。

また、以前からiMessageとFaceTimeの意味不明なポップアップが出てきていたことを思い出し、両設定をチェック。
するとアクティベーションのところで処理が続いていることが判明。
OS側のバグで処理がうまく行われなく圏外になっていると推測。
iMessageとFaceTime両方とも使用していないため設定をOFFに変更するが圏外のままつながらない。
foma回線の設定をリセットすることにする。→これがうまくいった

# 手順

1. iMessageとFaceTimeをOFFにする
2. fomaのsimを抜きsimトレーを一度しまう。連絡先をesimに変更するポップアップが出てきたら承認する
3. foma simを入れる
4. sim設定を聞かれるのですべてesimにする
5. 設定で電話回線のみfomaにする

# さいごに

これで問題は起こらなくなりました。
問題解決から3週間ほどたっていますが今のところ再発していないので大丈夫だと思います。
PostmanでAPI

なにやらPostmanが超絶便利そうなので使ってみる。

ネイティブアプリ版（？）を使っている。


## モックサーバーを使う
Postmanにはモックサーバーがある。

APIキーが必要
Headersにx-api-keyを設定する必要がある。


APIキーの場所は「Account Settings > Postman API Keys」で発行する。
https://xxxxxx.postman.co/settings/me/api-keys

<img width="1032" alt="PostmanのAPIキー" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29634/c0519b6e-fcb2-bf39-5c82-ae880dfd6d35.png">


## リクエストURLで変数を使う
<img width="868" alt="スクリーンショット 2019-10-25 16.11.45.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29634/1903b5e2-3981-8e30-3b08-d27cd6db673d.png">
{{url}}のようなマスタッシュ構文で変数が使える。

NewからEnvironmentを選択するとモーダルで下記ウィンドウが出る。

<img width="717" alt="スクリーンショット 2019-10-25 16.14.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29634/edd94c9d-af05-cba9-614e-3c25d6ceaec2.png">

VARIABLEが変数名なので{{url}}という変数を作りたい場合は「url」と書く。

INITIAL VALUEに置き換えたいURLを書く。
例えば「 https://api.test.com 」など。

CURRENT VALUEはいまいちよくわからないのでINITIAL VALUEと同じものを入れておく。APIのパラメーターとして使うときに活きてくるものだと思われる。

<img width="339" alt="スクリーンショット 2019-10-25 16.16.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29634/beb6876d-62c8-a8e4-c269-7a71fbc06f28.png">

設定しただけでは適用されないので、
ウィンドウ右上にあるプルダウンで、作成したEnvironmentを選択する。


## APIキーも変数として扱う
<img width="1072" alt="スクリーンショット 2019-10-25 16.26.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29634/8aeaccf4-de95-63a5-740b-8ec133b1896c.png">
Environmentでx-api-keyという変数を作って格納しておけば、
上記のようにVALUEに{{x-api-key}}と記述するだけでよくなる。
基本選択法によるソートプログラム（C言語）

C言語を用いた基本選択法によるソートプログラムです。


```
#include <stdio.h>

	
	int main(void) {

		int i;			//最小値判定ループ用
		int j;			//仮の最小値設定ループに使うカウント用変数
		int min;		//最小値の添え字用
		int k = 5;		//配列の要素数
		int temp;		//最小値の一時保管用


		int x[] = {2,5,3,4,1};
		printf("並び替え前\n");
		
		for(i = 0; i < 5; i++) {
			printf("x[%d] = %d\n",i, x[i]);
		}
		
		//ここまではソート前の出力処理

		for(i = 0; i < k-1; i++) {
			min = i;
			for(j= i+1 ; j < k; j++) {
				if(x[min] > x[j]) {
					min = j;
				}
			}
			temp = x[min];
			x[min] = x[i];
			x[i] = temp;			
	 	}

		//ソート処理はここで終わり

		printf("並び替え後\n");

			for(i = 0; i < 5; i++) {				

			          printf("x[%d] = %d\n",i, x[i]);
		    }

		return 0;

}

```

イメージとしては、
最小値を探すソートに入った時、
最初に設定した最小値より小さい値がきたら、
minさんにその最小値が何番目にあったか覚えておいてよ、
って感じです。
そんで、ソートが終わったら、
「minさん、最小値より小さい数値は何番目だっけ？」
と聞いて、
「へい、〇番目でっせ。」
となって、
「じゃあ、最小値と〇番目の数値をチェーンジ！」
という動作イメージです。
【Xamarin.Forms】ListViewのセルの縦幅を可変にする

# 初めに
https://qiita.com/sun_bacon/items/6f74ef44c35c508791d1
こちらの記事に大変助けられました、圧倒的感謝。
こちらを参考に、実装していく中で実際にBindingしている値が変わった時を
検知するのをメモ代わりに記事にします。

# 検知するとこ
```CustomViewCell.cs
public class CustomViewCell: ViewCell
    {
        protected override void OnBindingContextChanged()
        {
            base.OnBindingContextChanged();
            if(this.BindingContext != null && this.BindingContext is INotifyPropertyChanged)
            {
                (this.BindingContext as INotifyPropertyChanged).PropertyChanged += CustomPropertyChanged;
            }
        }

        protected override void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            base.OnPropertyChanged(propertyName);
            if(propertyName == "RealCell")
            {
                ((DynamicListView)this.Parent).OnDataChanged(false);
            }
        }

        private void CustomPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            ((DynamicListView)this.Parent).OnDataChanged(true);
        }
    }
```

ListViewは「初めに」に記載している記事をご覧ください。
trueとfalseについては、表示後に子ViewをViewCell内に表示する際
どうしてもDelayを数ミリ秒設定しないとうまく反映されないので
表示後にProperty変わった時、DelayかけるためにFLGをつけてます。

# 最後に
なんで、Bindingしたら可変にならなくなるのか・・・。
Javaはword文書の透かしを追加して削除します

Wordの透かしはテキストウォータマークとピクチャーウォータマークの2種類に分けられます。テキストウォーターマークは現在のドキュメントの状態を表します，下書き、秘密保持、認証済み等。写真の透かしは一つの会社のロゴを指定するのに使えます。この文章はどう使うかを紹介しますJavaとFree Spire.Doc for Java Word文書に文書の透かしと写真の透かしを追加し、Word文書からどうやってウォーターマークを削除しますか。

テキストウォーターマークを追加：TextWatermark classテキストウォーターマークの操作。テキストウォーターマークを作成する時、フォント、サイズ、フォントの色、ウォーターマークのレイアウトスタイルなどのテキストウォーターマークの属性をカスタマイズできます。

```java

import com.spire.doc.*;
import com.spire.doc.documents.WatermarkLayout;
import java.awt.*;

public class WordTextWatermark {
    public static void main(String[] args) {

        Document document = new Document();
        document.loadFromFile("Sample.docx");

        insertTextWatermark(document.getSections().get(0));

        document.saveToFile("out/result.docx",FileFormat.Docx );
    }
    private static void insertTextWatermark(Section section) {
        TextWatermark txtWatermark = new TextWatermark();
        txtWatermark.setText("内部使用");
        txtWatermark.setFontSize(40);
        txtWatermark.setColor(Color.red);
        txtWatermark.setLayout(WatermarkLayout.Diagonal);
        section.getDocument().setWatermark(txtWatermark);
    }

}
```

Output:

![Text watermark.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/2044ce5b-e6d4-0cfd-98b9-96410a18a5ba.png)

画像のウォーターマークを追加：PictureWatermark class画像のウォーターマークを操作するためのものです。ウォーターマークの写真は地元からの写真でもいいです。他のプロジェクトで作成したstreamからも来ます。
```java

import com.spire.doc.*;


public class WordImageWatermark {
    public static void main(String[] args)  throws Exception{

        Document document = new Document();
        document.loadFromFile("Sample.docx");

         PictureWatermark picture = new PictureWatermark();
         picture.setPicture("logo.png");
         picture.setScaling(5);
         picture.isWashout(false);
         document.setWatermark(picture);

         document.saveToFile("out/result2.docx",FileFormat.Docx );
    }
}
```

Output:
![Image watermark.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/bb81619d-d987-cd5d-a162-7a9bb508350c.png)


ウォーターマークを削除,doc.setWatermark(null) の方法を使って、Word文書の透かしを簡単に削除できます。

```java
import com.spire.doc.*;
 
public class RemoveWatermark {
 
    public static void main(String[] args){
 
        Document doc = new Document();
        doc.loadFromFile("ImageWatermark.docx");
 
        doc.setWatermark(null);
 
        doc.saveToFile("RemoveWatermark.docx", FileFormat.Docx);
    }
}
```
ResNetはなぜ良い性能を示すのか

画像の認識タスクでResNet[^1]をベースにした手法が高い性能を示しています。
Deep Learningといっても、それまで十何層というネットワークだったものが、ResNetの登場により100層を超えたネットワークを作っても学習できるようになり、性能が上がったとされています。なぜResNetが高い性能を示すのかということを研究した論文を読んだので、概要を紹介します。

まずおさらいとして、ResNetは下図のようなResidual netモジュールを繰り返して構成されます。
<img width="300" alt="ResNet_Explain1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178888/960d4857-4a96-b5f9-2b73-6536da116162.png">      <img width="200" alt="ResNet_Explain3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178888/61d11a14-fdbc-36ed-c273-d884d1d88bd2.png">


従来のDeep Learningのネットワーク(VGGなど)は下図のようなモジュールを繰り返して構成されます。
<img width="300" alt="ResNet_Explain2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178888/aa031254-d7d9-9cbd-6d49-8ecc445f84f0.png">    <img width="200" alt="ResNet_Explain4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178888/5daf5fbc-4c7b-c495-86a0-b96c6790bdc6.png">

各図の右側の説明のように、weight layer(Convolution層)を通った後の出力の期待を、従来のネットワークでは望ましい値をダイレクトに求めるのに対して、ResNetでは入力値であるxとの差分として求めると設定して、ショートカットコネクションをつけています。

ResNetがどのように精度向上を果たしているかについて、紹介する論文"Residual Networks Behave Like Ensembles of Relatively Shallow Networks"[^2]では、ResNetでも多くの層を通るとbackpropagationにおけるgradient powerが減衰して伝わらなくなることはあるが、下図の左に示すResidual netモジュールは下図の右に示すように複数の経路をとりうるネットワークと等価として描き直せるとしています。
<img width="600" alt="ResNet_Explain5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178888/28b2c51a-9c4e-d7e6-4b4f-7555def4a935.png">

f1->f2->f3からその上にあるそれぞれのresidual分岐をすべて通るパターンもあれば、一番上のルートのみ通るような入力がそのまま出力するパターンまで取りえます。
このように層数も異なる多くのネットワークパターンでの学習になることでアンサンブル学習の効果が得られているということです。
このことは下図に示すように推論時に層を削除したときのエラーレートの上昇が滑らかになることからも主張しています。
<img width="600" alt="ResNet_Explain6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178888/d5631d1c-d7e8-fe9c-2d9d-29861999bdc9.png">

また下図では推論時に層を削除したときのエラー率についてVGGと比較しています。VGGではネットワークが一本の構造なので当然崩壊してしまいエラー率が90%を超えてくるが、ResNetではどの層を除去してもエラー率の上昇が非常に小さいことは驚きだと述べています。
(downsamplingする層を除去すると他の層よりも多少エラーが上がることが小さなピークとして示されています)
<img width="600" alt="ResNet_Explain7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178888/37c6d21d-a2fe-8607-874a-dcaff47b805c.png">


Attention Branch Networkについては、[こちらのページ](https://qiita.com/koharite/items/a0439c8c97780523ebb2)に記事を書きました。

[^1]: [ResNet](https://www.cv-foundation.org/openaccess/content_cvpr_2016/papers/He_Deep_Residual_Learning_CVPR_2016_paper.pdf)
[^2]: [Residual Networks Behave Like Ensembles of Relatively Shallow Networks](https://arxiv.org/abs/1605.06431)
Domingo-ferrer暗号入門（１）

#Domingo-ferrer暗号とは
**Domingo-ferrer暗号**は、ドミンゴ先生が1996年と2002年に提案した暗号方式です。
今回説明するのは2002年に提案された方です。
なにをやっているか簡単に説明すると、平文の数値をごちゃごちゃして多項式の係数の形で暗号化しています。
特徴は以下の通り。

- 足し算、掛け算が出来る完全準同型暗号
- ノイズが無い
- Known-plaintext Attackに対して、**弱い**（2006年に解読の論文が出ている[参考3]）

#アルゴリズム
##鍵について
鍵は以下の通り。

|鍵|説明|
|:--:|:---:|
|_d_|２より大きな整数|
|_m_|$10^{200}$以上で約数を多く持つ整数|
|_m'_|ランダムなmの約数|
|_r_|mと互いに素の整数|

##暗号化(Encryption)

暗号化の手順は以下の通り。

> _⑴_ 　mod m'をとる
_⑵_ 　⑴の結果をd個に分ける
_⑶_ 　分けた数それぞれmod mをとる
_⑷_ 　⑶の結果に$r^n$をかける　(n:暗号文リストのindex)
_⑸_ 　それぞれmod mをとる



例として２を暗号化してみます。
鍵は
`m = 28 `
`m' = 7`
`r = 3`
`d = 2`
とします。

__⑴__
>  $16 ≡ 2 mod  7$

__⑵__
> $16 = 3 + 13$

__⑶__
> $3≡3 mod28$ 
> $13≡13 mod28$

__⑷__
> $[3*3, 13*3^2]$

__⑸__
> $9 ≡ 9mod28$
> $117≡5 mod28$

なので$２$の暗号文は$[9,5]$です。

正確には$5x^2+9x$です
 
##復号化(Decryption)

復号化は手順以下の通り。

> _⑴_ 　それぞれに$r^{−n}$をかける (n:暗号文(リスト)のindex)
_⑵_ 　それぞれmod mをとる
_⑶_ 　要素全部足し合わせる
_⑷_ 　mod m’をとる

例としてさっきの２の暗号である$[9,5]$を復号化してみます。

まずrのモジュラ逆数（mod mでの、rのインバース）をとっておきます。
> $3*r^{-n}≡1mod28$
> $r^{-r}=19$

__⑴__
> $[9*r^{-1}, 5*(r^{-1})^2]$
> $=[9*19, 5*19^2]$
> $= [171, 1805]$

__⑵__
> $171≡3 mod28$
> $1805≡13 mod28$ 
> $[3,13]$

__⑶__
> $3 + 13 = 16$ 


__⑷__
> $16≡2mod7$

ということで、めでたく２に復号化できました。

##足し算

足し算は暗号文の同じインデックス同士を足し合わせるだけ。
上記の鍵で３も暗号化すると[18,15]になる。
そこで、２と３の足し算をしようとすると、

> $2+3 = [9+18, 5+15] =[27,20]$

となる
##掛け算

２と３の掛け算をしようとすると、
> $2*3 = [9,5]*[18,15]$
> $=[0, 9 * 18, 9 * 15 + 5 * 18, 5 * 15]$
> $= [0, 162, 225, 75]$

#参考
[1] [J. Domingo-Ferrer, “A New Privacy Homomorphism and Applications,” in
Information Processing Letters, Vol. 60, no. 5, pp. 277–282, 1996.](http://citeseerx.ist.psu.edu/viewdoc/download;jsessionid=15AC7A60E3D70B550EACE03A25B2FE22?doi=10.1.1.42.7771&rep=rep1&type=pdf)

[2] [J. Domingo-Ferrer, “A Provably Secure Additive and Multiplicative Privacy
Homomorphism,” in ISC2002, LNCS. Vol. 2443, pp.471–483, 2002.](https://www.researchgate.net/publication/220905396_A_Provably_Secure_Additive_and_Multiplicative_Privacy_Homomorphism)

[3] [Jung Hee Cheon, Woo-Hwan Kim, Hyun Soo Nam, “Known-Plaintext Cryptanalysis of the DomingoFerrer Algebraic Privacy Homomorphism Scheme,”, 2006](https://pdfs.semanticscholar.org/0db5/bdea5319da73239072f0332f0c86ee402014.pdf)
[C#]ExcelCreatorでExcelファイルのセル読取/書込

ExcelCreator で Excel ファイルのセル読取/書込の方法の忘備録なります。

#1. 環境
試用した環境は下記のとおりです。

* Microsoft&reg; Visual Studio&reg; Community 2019 の Visual C#&reg; 
* ExcelCreator 2016 体験版　(ExcelCreator Ver3.6 (ActiveX版) )

###体験版の制限事項
"A1" セルに、体験版を知らせる固定のメッセージ文字列が出力されます。

#2. 準備

##インストール
ExcelCreator 2016 体験版を、下記の Adovance Softwea のページからダウンロードして、インストールします。

* [ExcelCreator Ver3.6 (ActiveX版) 体験版](http://www.adv.co.jp/download/download-confrm.php?skey=39A&ftype=D)

##参照の追加
Visual Studioのソリューション エクスプローラーから、参照の追加で COM から「ExcelCreator」を検索して追加します。

#3. サンプルコード

```C#:ExcelManagerEC.cs
using XlsxCrt;

    class ExcelManagerEC
    {
        // ExcelCreatorコントロール
        public IExcelCrtOcx Xlsx { get; set; }

        // テンプレートの情報
        private string _templateFile = string.Empty;
        private string _templateSheet = string.Empty;

        /// <summary>
        /// コンストラクタ
        /// </summary>
        public ExcelManagerEC(string filename)
        {
            // Xlsxインスタンス生成
            Xlsx = new Xlsx();

            // テンプレートの情報取得
            GetTemplateConfig();

            // ワークブックオープン(オープンするファイル名, オーバーレイ元ファイル名)
            Xlsx.OpenBook(filename, @"e:\book1.xlsx");

            // ワークシート設定
            Xlsx.SheetNo = Xlsx.SheetNo2["Sheet1"];
        }

        /// <summary>
        /// ワークブックをクローズする
        /// </summary>
        /// <param name="filename">ファイル名</param>
        /// <returns>true:正常終了、false:保存失敗</returns>
        public bool Close()
        {
            try
            {
                Xlsx.CloseBook(true);
            }
            catch
            {
                return false;
            }

            return true;
        }
    }
```

```C#:test.cs
using System;
using System.Windows.Forms;

    public partial class test: Form
    {
        public test()
        {
            InitializeComponent();
        }

        private void Btn1_Click(object sender, EventArgs e)
        {
            var excelEC = new ExcelManagerEC(@"e:\book3.xlsx");

            // セル書込
            excelEC.Xlsx.Pos[sx:0, sy:1].Value = "test";
            // セル読取(R1C1形式)
            var cellValue1 = excelEC.Xlsx.Pos[sx: 0, sy: 1].Value;
            // セル読取("A1"形式)
            var cellValue2 = excelEC.Xlsx.Cell["A2"];
            // 罫線を引く("A1:C3"に、実線、箱型、赤色で)
            excelEC.Xlsx.Cell["A1:C3"].Attr.Box(XlsxCrt.XLSX_BORDERSTYLE.xbsThin, XlsxCrt.XLSX_BOXTYPE.xbtBox, XlsxCrt.XLSX_COLOR.xclRed);

            // クローズする
            if (excelEC.Close() == false)
            {
                MessageBox.Show("ファイルが既に開かれています。\n閉じてから、再試行してください。",
                    "エラー",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
            }
        }
    }
```

class にインターフェースが実装されているので汎用性があるかもしれませんが、**Range が使えない**ので、エクセラーの人は EPPlus より使いづらいかもしれません。(背景色や罫線などのセル書式は、セル範囲を使用できる)

##PDF ファイル出力
ExcelCreator 2016 の目玉の一つに、PDF ファイル出力があります。
しかしながら、.NET 版 (ExcelCreator 10.0 for .NET) オンリーのようで、残念ながら体験版の ExcelCreator Ver3.6 (ActiveX版) では使えませんでした。。。
Ant DesignでReactを楽におしゃれにする ~セットアップ編~


#はじめに

Reactで何か作ろうと思ったけどデザインを一から考えるのはめんどくさいと思ったのでReactコンポーネントセットを探してみたところ気にいったのが「[Ant Design](https://ant.design)」。
アリババが開発したもので、コンポーネントの種類はかなり豊富。
[サンプル](https://antd-admin.zuiidea.com/en/dashboard)を見てみてもなかなか、悪くない感じのデザインでカスタマイズできる。
グリッドシステムもBootstrapと同じなのでお手軽。


今回はセットアップ方法の説明。

# セットアップ

```
npm install antd
```

プロジェクト配下の`/src`の中の`index.js`に

```javascript 
import 'antd/dist/antd.css';
```
を加えるだけ。


# 試してみる

たとえばコンポーネントの`Layout`, `Content`, `Row`, `Col`, `Title`を使いたいときはこんな感じで書く。

```jsx:/src/App.js

import React from 'react';
// 使うコンポーネントをインポート
import { Layout, Button, Typography, Row, Col } from 'antd'; 
import './App.css';

// 一部の要素は各コンポーネントを元に定義する必要がある
// 詳しくはドキュメントのソースコードを見ればわかる
const { Content } = Layout;
const { Title } = Typography;

function App() {
  return (
    <div className="App">
      <Layout style={{textAlign: "center" }}>
        <Content style={{ margin: "60px 16px" }}>
          <Title>Ant DesignでReactを楽におしゃれにする ~セットアップ編~</Title>
          <Row style={{ margin: "60px 16px" }}>
            <Col xs={24} sm={24} md={12} lg={12} xl={12} xxl={12}>
              <Title level={3}>セットアップ</Title>
              <Button type="primary">Link</Button>
            </Col>
            <Col xs={24} sm={24} md={12} lg={12} xl={12} xxl={12}>
              <Title level={3}>試してみる</Title>
              <Button type="danger">Link</Button>
            </Col>
          </Row>
        </Content>
      </Layout>
    </div>
  );
}

export default App;

```

するとこんな感じ。
<img width="1440" alt="antd.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/481488/bfac27d1-c6de-c664-aa0d-2a8922d36c76.png">

簡単にデザインが加えられる。

これからちょくちょく各コンポーネントを紹介する記事を書いて行きます。
脱jQueryを目指してajaxメソッドをaxiosに置き換えてみる

脱jQueryを目指してajaxメソッドをaxiosに置き換えます。

## 準備

axiosを使うために以下のサイトからjsファイルをダウンロードして読み込んでおきます。

https://github.com/axios/axios

```html
<script src="axios.min.js"></script>
```

## GET通信

```javascript
// jQuery
$.ajax({
  type: 'GET',
  url: 'http://localhost/test',
  params: { name: 'Taroimo' },
}).then(...);

// axios (1)
axios.get(
  'http://localhost/test',
  { name: 'Taroimo' }
).then(...);

// axios (2)
axios({
  method: 'GET',
  url: 'http://localhost/test',
  params: { name: 'Taroimo' }
}).then(...);
```

## POST通信

```javascript
// jQuery
$.ajax({
  type: 'POST',
  url: 'http://localhost/test',
  data: { name: 'Taroimo' },
}).then(...);
// axios (1)
axios.post(
  'http://localhost/test',
  { name: 'Taroimo' }
).then(...);
// axios (2)
axios({
  method: 'POST',
  url: 'http://localhost/test',
  data: { name: 'Taroimo' }
}).then(...);
```
SVNクライアントを複数使っているとSVNがロックされる

# SVNがロックされる
`sqlite[S5]: database is locked`
が発生してクリーンナップしても解決しないことありませんか。
サーバーサイドの問題だったりローカルの.svnが壊れていたり考えられる原因は複数あります。
でも、SVNクライアントを複数入れて平行で使っているなんてことはありませんか？
TortoiseSVNとEclipseのSVNツールで二重管理してしまっていたようで、どっちからもaddやcommitができなくなることがあるみたいです。
私はこれでした。
# 解決方法
方法は簡単で片方を終了させてしまうことです。
私の場合はEclipseを終了させればTortoiseSVNでaddしてcommitできました。
現場はEclipseに寄せてるのでこれに合わせた方がいいんだろうなと思いつつ使い慣れたTortoiseSVNを使うことが多い…。
でもこれを機にどっちかに統一しようかと思いました。
（ちなみにプロジェクトの構成の関係でGitに移行できないんですねえ。。）
firestore.rulesのテスト中にハマったこと

メモです。気が向いたときに追加していきます。

## セットアップ
  - https://github.com/firebase/quickstart-nodejs/tree/master/firestore-emulator/typescript-quickstart
  - この辺見て頑張る
  - mocha.optsの--requireは `--require ts-node/register test/**/*.ts` のほうが楽な気がする
    - scriptsのpretestは不要

## tokenの設定方法

たとえば こんなルールだったとして

```rules:firestore.rukes
match /users/{userID} {
  allow create: if request.auth.token.firebase.sign_in_provider != "anonymous";
}
```

これをテストするためにはquickstartの `authedApp` には下記ではだめで

```typescript:test.ts
// NG
authedApp({ uid: 1, token: { firebase: { sign_in_provider: "anonymous" }}})
```

こうかくらしい。

```typescript:test.ts
// GOOD
authedApp({ uid: 1, firebase: { sign_in_provider: "anonymous" }})
```

tokenに詰める必要はないらしい。どっかに書いてあったんか知らないけど、まあそうですかという感じ。
reat-nativeのandroidがwindowsだと動かないので、VMwareで動かした

reactnativeを利用したandroidアプリを利用するプロジェクトに参加。
環境構築にshellスクリプトやyarnを使用していて、windows + cygwin + virtualbox環境だと動かないこと多々で困った。。

# 結論から
- VMware Workstationでubuntu desktopインストールしてandroid studio動かせばええんじゃね？

# エラーたち一部抜粋(対応がわかったやつ)
### android stutioでshellが動かない
gitインストールしてgitのshell利用

```
"C:\Program Files\Git\bin\sh.exe" -login -i
```

### vagrantディレクトリでyarn installするとsymbolic errorが出る
```
yarn install --no-bin-links
```

### ライセンス認証したい
```
C:\Users\UserName\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --licenses
```

### virtualboxでubuntuインストール後android仮想端末でvt-xエラー
windows機側ではvt-x使用可だが、virtualbox仮想環境上では動かなかった...→VMwareなら動く!!

# 仮想環境上でデスクトップ環境使ったことなかったが、virtualboxと比べてVMwareって、軽すぎ...?
vagrantが好きなのでVMware回避してたが、なかなかに快適だった。デスクトップ環境使いたかったら是非!
デプロイで「ERROR -- : Unknown database 'データベース名' (ActiveRecord::NoDatabaseError)」と出て苦労した話

# 起こったこと
プログラミングスクールの最終課題で某フリマアプリのコピーサイトをチームで作っています。
チームメンバーがマージしたものをデプロイした際にこんなエラーが発生しました

```terminal:ターミナル
Mysql2::Error: Duplicate column name 'image_id': ALTER TABLE `items` ADD `image_id` int NOT NULL AFTER `category_id`
```

まず、このエラー文が何かを調べることにしました。
先ほどのエラー内容は
「カラムが重複してるから、そんなことできません！」って意味になります。
すでに出来上がっているカラムをさらに追加しようとしたことが原因みたいです。

ふーん原因はわかったぞ
でも念のために本番環境でもエラーを見ておこう

ここからが地獄の始まりでした。


# 地獄の始まり

本番環境でエラーを見るために
```Less log/unicorn.stderr.log```を実行するとこんな文章が

```terminal:本番環境
ERROR -- : Unknown database 'データベース名' (ActiveRecord::NoDatabaseError)
```

###・・・はぁ！？

そんなわけない、今までデプロイできてたじゃん！

焦って、mysqlのデータベースが存在しているか確認

```terminal:本番環境
mysql -u root -p #データベースの立ち上げ

# パスワード認証が出るので設定したパスワードを入力。入れたら以下を記述

show databases;

# 存在するデータベースが表示される
```
確認するとデータベースは存在している、しかしエラーがわからないな。
怖いから、サーバーを再起動して、データベースのリセットを試みました。

```terminal:本番環境
# リセットのためのコマンド
RAILS_ENV=production DISABLE_DATABASE_ENVIRONMENT_CHECK=1 bundle exec rake db:drop

# エラー文として表示されたもの
Access denied for user ''@'localhost' to database 'データベース名'
```

アクセスが拒否された・・・？
なんでだー！

ここで私はデータベースを削除する決心を固めました。

もう一度本番環境でmysqlにアクセスし
```drop database  データベース名;```を実行

マイグレーションファイルもできてるし、もう一度createしてからmigrateを実行すればどうにかなる！

# まだ続くよ！

```terminal:本番環境
# テーブルを作成するコマンド
rails db:create RAILS_ENV=production

# エラー文
Mysql2::Error::ConnectionError: Access denied for user ''@'localhost' to database 'テーブル名': CREATE DATABASE `テーブル名` DEFAULT CHARACTER SET `utf8`
Couldn't create database for {"adapter"=>"mysql2", "encoding"=>"utf8", "pool"=>5, "username"=>"テーブル名", "password"=>nil, "socket"=>"/var/lib/mysql/mysql.sock", "database"=>"テーブル名"}
```

###ならなかったよぉ！

パスワードは```nil```だし、```Access denied for user ''@'localhost'```ってrootが空白になってるし！

そうだ、```database.yml```を確認しよう、設定ミスかもしれない！

```ruby:database.yml
production:
  <<: *default
  database: データベース名
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock
```

記述はあっている。どこを間違えたのだろうか。。。

# 明かされる衝撃の事実！

色々と調べるうちになーんだ、そんなことかよ！って気づきました。
本番環境で作業するディレクトリを間違えていました。

### currentディレクトリで実行する

これがデータベースにアクセスできない、作成できないの原因でした。
``本番環境で初回デプロイ実行後、currentフォルダ内のデータが本番環境で動いているフォルダ群となるようです！```
私は、アプリ名のディレクトリで今までcreateを実行しようとしていたので、そんなもの見つからねぇよ！と弾かれていたのです。

なのでcurrentディレクトリに移動し
```rails db:create RAILS_ENV=production``` を実行！

###データベースができた！

```rails db:migrate RAILS_ENV=production``` を実行！

###テーブルが反映された！

ローカルで```bundle exec cap production deploy```を実行！

###デプロイできたよ！

これで一安心してはいけません。
seed.rbの反映するのを忘れるところでした。
本番環境で```rake db:seed RAILS_ENV=production```を実行、その後アクセス。
ちゃんとページが表示されました。

#結論

### ```bundle exec cap production deployを初回実行後は、currentディレクトリに本番環境のデータが入っている```
SwiftでUserDefaultsを雑に全消し/一部消しする

Swift5.0の話です。
（なんかUserDefaultsの記事多いですねわたくし）

テストコードでUserDefaultsをテスト前に全部消したかったときの話です。

```swift:全消し
let appDomain = Bundle.main.bundleIdentifier
UserDefaults.standard.removePersistentDomain(forName: appDomain!)
```

でも全部消すのは、テストコードとは言え乱暴かなあ〜という気もしたので、一部消しにしました。

```swift:一部消し
let key = "keyname"
UserDefaults.standard.removeObject(forKey: key)
```
Ruby 導入コマンド達

自分用に作成

brew、mysql、Bundlerが必要

ここでやるのは作業ディレクトリにRailsをインストールしてWebサーバーを立ち上げるところまで。

```ruby:ディレクトリの作成
$ mkdir sample
$ cd sample
$ bundle init
```
ディレクトリに入っているGemfileを編集

```ruby:Gemfile
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "rails" ここがコメントアウトされているので解除する

```

```ruby:Railsインストール
$ bundle install --path=vendor/bundle
$ bundle exec rails -v
　Rails 6.0.0
```

ちゃんと作成できているか確認するためにRailsのチュートリアルにつなげる


```ruby:Railsのアプリ作成
$ bundle exec rails new blog

```

```ruby:起動
$ cd blog
$ rails server
```
dockerでredashのnginxをssl化したら思いの外ハマった

#はじめに#
dockerでredashのnginxをssl化したら思いの外ハマった

社内でデータを統計表示するのにredashを使っており、
一応webアクセスできるため、ssl化しておこうとなった

さくっとググった限りでは、手順は簡単だと思っていたが(実際後から振り返ると簡単だった)、
しょうもないところでハマって時間がかかってしまったため、
記録だけ残しておこうと思う

#redash構築#
公式のdocker-composeを使用して構築する

詳細は割愛

#証明書を準備する#
今回はletsencryptなどを使わず、第三者の証明書発行を使用した。

用意したファイルは以下のもの
/root/ssl/とかに配置しておく

```
証明書         server.crt
中間証明書      server_bundle.crt
証明鍵         server.key
```

証明書と中間証明書を一緒にしておく

```
# cat server_bundle.crt >> server.crt
```


#nginxの設定ファイルを準備する
ホスト側のubuntuに、docker上で適用させるnginx設定ファイルを作成する

```
# vi /root/nginx/default.conf

upstream redash {
  server redash:5000;
}

server {
    listen 80 default;
    server_name example.com;

    return 301 https://$host$request_uri;
}

server {
    listen 443;
    ssl on;
    ssl_prefer_server_ciphers on;
    ssl_protocols TLSv1.2;
    ssl_ciphers "ECDHE+RSAGCM:ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:!EXPORT:!DES:!3DES:!MD5:!DSS";

    gzip on;
    gzip_types *;
    gzip_proxied any;

    server_name example.com;
    ssl_certificate /etc/nginx/ssl/server.crt; # サーバー証明書のパス
    ssl_certificate_key /etc/nginx/ssl/server.key; # 秘密鍵のパス

    error_log /var/log/nginx/nginx_error.log;
    access_log /var/log/nginx/nginx_access.log;

    location / {
      proxy_ssl_server_name on;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $http_x_forwarded_proto;
      proxy_pass       http://redash;
 }

}

```

#docker-composeファイルを編集する
docker-compose.ymlの中で、nginxの部分を以下のように編集する

443ポートを通信許可し、
上記で作ったファイルへパスを通す

```
vi docker-compose.yml

~略
  nginx:
    image: redash/nginx:latest
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /root/nginx/default.conf:/etc/nginx/conf.d/default.conf
      - /root/ssl:/etc/nginx/ssl
    depends_on:
      - server
    links:
      - server:redash
    restart: always
```

#dockerの再構築
準備ができたら一度既存のdocokerを壊し、再構築する

```
# docker-compose down

# docker-compose up -d
```

#アクセスする
以下のようなurlでブラウザからアクセスするとhttps化されてるはず
https://IPアドレス/dashboards



#はまったところ
##ファイアウォール
超初歩的なところだが、クラウド上のファイアウォールで443の通信を許可しておらず、
ブラウザでアクセスしようとするたびにタイムアウトになっていた

OS上ではufwをアクティブにしていなかったためしばらく混乱していたが、
クラウド側で通信許可をしたらすぐにつながった

##リダイレクト
nginxのdefault.confにおいて、
当初リダイレクトの部分を下記のようにしており、
ssl化した後も「Bad Gateway」の表示となっていた

```      
proxy_pass       https://redash;
```

上記のurlをhttpにすることで正常な画面を表示させることができた

どうもクライアントからwebアクセスするときは443ポートを使用し、
サーバー内のdockerネットワークにおいて通信するときは80ポートを使用している、
というような仕組みのようである

dockerについて一つ勉強になった。
【PDFminer 】LT〜でとれるテキスト情報メモ

#LTTextbox

座標のみ
複数の文の塊があるとLTTextBoxHorizontal(0)は読んだ順に1,2,3…と増える

```
<LTTextBoxHorizontal(0) 58.783,214.715,154.783,235.691 '山路を登りながら\n'>
                        
```

#LTTextLine

座標のみ

```
<LTTextLineHorizontal 58.783,214.715,154.783,235.691 '山路を登りながら\n'>

```

#LTChar

座標とフォントのサイズや名前

```
<LTChar 58.783,214.715,70.783,235.691 matrix=[12.00,0.00,0.00,12.00, (58.78,218.78)] font='EUBOKT+KozGoPr6N-Regular' adv=1.0 text='山'>
```
bashrcをOS等の環境ごとに異なる設定にする書き方

# bashrcを環境ごとに異なる設定にする書き方

OS、ディストリビューション、ホスト、ターミナルごとに異なる設定を行う場合の書き方まとめ
（それとbashrcが長くなりすぎる場合の他ファイルへの分割の仕方）

## OSごとに固有の設定

OSによる場合分けはunameで判定する

```bash
case `uname -a` in
  Darwin* )
    # Darwin(MacOS)に固有の設定はここに書く
    # 例）brew
    [ -f "/usr/local/bin/brew" ] && export HOMEBREW_CASK_OPTS="--appdir=/Applications"
    ;;
  Linux* )
    # Linuxに固有の設定はここに書く
    ;;
  MINGW* )
    # WindowsのMINGWに固有の設定はここに書く
    ;;
esac
```

## Linuxのディストリビューションごとに固有の設定

ディストリビューションは/etc/os-releaseのNAMEの値で判定する

```bash
if [ -f "/etc/os-release" ]; then
  read line < /etc/os-release && eval ${line}
  case ${NAME} in
    "CentOS Linux" )
      # CentOSに固有の設定はここに書く
      ;;
    "Ubuntu" )
      # Ubuntuに固有の設定はここに書く
      export LANG="en_US.utf8"
      export LC_ALL="en_US.utf8"
      ;;
    * )
      # その他の設定はここに書く
      ;;
  esac
fi
```

## ホスト（端末）ごとに固有の設定

ホストごとに固有の設定はHOSTNAMEで判定する

```bash
case ${HOSTNAME} in
  homePC )
    # 自宅PCに固有の設定はここに書く
    ;;
  officePC )
    # 会社PCに固有の設定はここに書く
    # 例）プロキシ設定
    export http_proxy="～～"
    export https_proxy="～～"
    export ftp_proxy="～～"
    ;;
  192-168* )
    # 例）192-168で始まるホスト名に固有の設定はここに書く
    ;;
esac
```

## ターミナルの種類ごとに固有の設定

ターミナルに固有の設定はTERMで判定する
下記は$TERMがxterm-colorか-256colorを含む場合に色をつける設定の例

```bash
case "$TERM" in
  # カラー対応の端末ならフラグを立てる
  xterm-color|*-256color) color_prompt=yes;;
esac
if [ "$color_prompt" = yes ]; then
  # カラー端末用のプロンプト（レポジトリ名も表示する）
  PS1='\[\e[1;36m\]$(__git_ps1 "(%s)")\[\e[1;32m\]\u\[\e[0;32m\]@\h:\[\e[1;33m\]\W \[\e[00m\]\$ '
else
  # モノクロ端末用のプロンプト
  PS1='\u@\h:\W \$ '
fi
unset color_prompt force_color_prompt
```

# bashrcが長くなる場合は他ファイルに分割する

例としてホストごとに固有の設定を他のファイルに書く場合、
bashrc内で自動的にファイル名を特定できるよう、ファイル名を「.bash_ホスト名」としておく。
実際に読み込む部分は下記の通り。
同様にOSごとやディストリビューションごとの設定も他ファイルに分割できる。

```bash
# .bash_${HOSTNAME}のファイルが存在すればそれを読み込む
[[ -f "${HOME}/.bash_${HOSTNAME}" ]] && source "${HOME}/.bash_${HOSTNAME}"
```
GOLANGでメキシコのCURP

皆さん、お元気ですか



先週でGOLANG　勉強をつつけました

れんしゅプロジェクトは　メキシコのCURPをせいせいするアルゴリズムです

CURPが何？

メキシコの皆さんがユニク　コドを　持っています。

このコドが かく人をしきべつするために。

政府はアルゴリズムをこうかい　しました。

GOLANGでじっそ　することをすすめします。

ここで、和のしんこくをかくにんできます：

https://github.com/dabiddo/curp

や、皆　また来週
QuickTime Playerのアイコンダサくない？！

突然ですが、`QuickTime Player` のアイコンってダサくありません？

<img src="https://tva1.sinaimg.cn/large/006y8mN6gy1g8acpwh8gcj30k60k67c1.jpg" alt="quicktime player" style="width: 100px !important;" />

Yosemiteになってからのアイコンは金属感を生かしつつ、フラットデザインとうまく共存していてかなり好きなのですが、QuickTime Playerのみは許せません。

このアイコンにはフラットデザインを行うときの、よくない多くの点が詰まっているので、これを修正していくことでデザインを行う時の参考にしていければなと思います。



## 何がダメ？



#### 1. 影が濃すぎる

まずは簡単なところから

このアイコンは影が強すぎます。全体的にフラットにまとめようと思うならもうしこしぼかしを弱くするべきですし、浮いている感じを出すにしては影が濃すぎます。

今回はくっきりめでぼかしを薄くします。

<img src="https://tva1.sinaimg.cn/large/006y8mN6gy1g8acpdj7lmj30ic0icdoi.jpg" alt="quicktime player copy" style="zoom:50%;" />



#### 2. 素材がない　 

Yosemiteの他のアイコンには素材がわかるような厚みがあります。

![Artboard](https://tva1.sinaimg.cn/large/006y8mN6gy1g8acht0p2gj319d0ezgu1.jpg)

私がYosemiteで最も好きなアイコンの１つである設定のアイコンはぱっと見で金属だとわかるデザインですし

地図やターミナルにもはっきりとした素材が見て取れます。しかし、`QickTime Player` の素材はなんでしょう？

ただ上から下にグラデーションしているだけで特に素材が見えません。

今回は影や枠を使って金属らしさを出してみましょう。

<img src="https://tva1.sinaimg.cn/large/006y8mN6gy1g8acswfavxj30io0iojzt.jpg" alt="quicktime player copy 2" style="zoom:50%;" />



オススメの金属感の出し方は

1. y : -1 でinner shadowをかけて立体感を出す。
2. y :  1 で明るい色でinner shadowを出す。
3. y : 1, blur : 1 でshadowをかける。
4. Borderをこんな感じのグラデーションでかける
 <img src="https://tva1.sinaimg.cn/large/006y8mN6gy1g8ad7wlrzhj30eu0iwjs4.jpg" alt="スクリーンショット 2019-10-25 14.08.10" style="zoom:25%;" />

#### 3. 色がダサい


Yosemiteのアイコンは寒色系→暖色系のグラデーションを使って、フラットののっぺり感を消しています。

<img src="https://tva1.sinaimg.cn/large/006y8mN6gy1g8ad01aci9j30sg0sg1kx.jpg" alt="PrefApp-1（ドラッグされました）" style="zoom:50%;" />

なので今回も少し暖色系の色を混ぜてみます。

また、内側のグラデーションにも紫を混ぜて色に厚みを持たせます。



<img src="https://tva1.sinaimg.cn/large/006y8mN6gy1g8ad9lz9zaj30ii0ii44p.jpg" alt="Group" style="zoom:50%;" />



どうでしょう？最初よりかなり良い感じになったのでしょうか？







![Artboard](https://tva1.sinaimg.cn/large/006y8mN6gy1g8adcyvt3zj31e60u07wh.jpg)

フラットデザインは最近の流行りですか間違えるとノッペリ感・ダサさが前面に出てしまいやすいデザインでもあります。

こういうところで遊んでみるとそういう意味で楽しく学べるのでオススメです。

今回作ったもの
[GitHub](https://github.com/ObuchiYuki/replacement-icons/blob/master/icns/QuickTime%20Player.icns)
gcloudでprojectを簡単にswitchする方法

需要があるならちゃんとしてGolangで作ります

### 1.追加したいプロジェクトの箱を作成する

```
$ gcloud config configurations create oreno-project-dev
Created [oreno-project-dev].
Activated [oreno-project-dev].
```

### 2.プロジェクトの設定を行う

```
$ gcloud config set compute/region us-central1
$ gcloud config set compute/zone us-central1-a
$ gcloud config set core/account oredesu@ore.com
$ gcloud config set core/project oreno-project-dev

$ gcloud config list
[compute]
region = us-central1
zone = us-central1-a
[core]
account = oredesu@ore.com
disable_usage_reporting = False
project = oreno-project-dev

Your active configuration is: [oreno-project-dev]
```

### 3. 切り替え用スクリプトを .bashrc or .zshrc に登録する

```
cat <<'EOF' >> ~/.bashrc

# gcloud profile switcher
function gx () {
  if test $# -eq 0; then
    gcloud config configurations list
  else
    gcloud config configurations activate $1
  fi
}
EOF

source ~/.bashrc
```

### 4.切り替えてみる

```
$ gx list
NAME                IS_ACTIVE  ACCOUNT                     PROJECT             DEFAULT_ZONE       DEFAULT_REGION
oreno-project-dev  True       oredesu@ore.com  oreno-project-dev  us-central1-a      us-central1
default             False      oredesu@ore.com  oreno-project      asia-northeast1-a  asia-northeast1

$ gx default
Activated [default].

$ gx list
NAME                IS_ACTIVE  ACCOUNT                     PROJECT             DEFAULT_ZONE       DEFAULT_REGION
oreno-project-dev  False      oredesu@ore.com  oreno-project-dev  us-central1-a      us-central1
default             True       oredesu@ore.com  oreno-project      asia-northeast1-a  asia-northeast1
```
Azure BlobStorage Java SDK でタイムスタンプを取得する


Azure Blob Storage のオブジェクトについてタイムスタンプを取得するという単純なものですが意外に面倒でしたのでメモしておきます。
BlobItemのオブジェクトにタイムスタンプを持たせるのが自然だと思いますが設計思想が異なるようです。

##Maven POM

```xml
<!-- https://mvnrepository.com/artifact/com.microsoft.azure/azure-storage -->
<dependency>
	<groupId>com.microsoft.azure</groupId>
	<artifactId>azure-storage</artifactId>
	<version>8.4.0</version>
</dependency>

```

#Code

```java
import com.microsoft.azure.storage.*;
import com.microsoft.azure.storage.blob.*;

public class AzureHello {
	public static final String storageConnectionString = "{your_connection_string}";

	public static void main(String[] args) {
		CloudStorageAccount storageAccount;
		CloudBlobClient blobClient = null;
		CloudBlobContainer container = null;

		try {
			storageAccount = CloudStorageAccount.parse(storageConnectionString);
			blobClient = storageAccount.createCloudBlobClient();
			container = blobClient.getContainerReference("{your_container_name}");
			CloudBlob cb = container.getBlobReferenceFromServer("test.txt");
			System.err.println(cb.getProperties().getLastModified());
		...
		}
	}
}
```
Rails 新しいアプリケーションを立ち上げるセット（ターミナル）

ryoです。昨日はHello Qiitaしました。
１日１記事目指して頑張ります。三日坊主になる可能性大。

今日はrailsのアプリ新規立ち上げに必要な最低限のセットを記入していこうと思います。

## この記事で出来るようになること
railsのアプリ基本的な状態を作れるターミナルのコマンドの存在を知る。
＊環境設定は済んでる前提で進めます。


## 目次
1.　今回使うコマンド一覧
2.　各コマンドの解説
3.　ルートパスの設定


##今回使うコマンド一覧

最初に使うコマンドを置いておいて、その後に各行の解説をします。

```ruby:ターミナル
cd ~/projects/

rails new test-app -d mysql
cd test-app/

rails g scaffold test

bundle exec rake db:create
bundle exec rake db:migrate
```


今回解説するの、これだけです。
上から順にコマンドをコピペしたら
projectsフォルダに
test-appというrailsのアプリが立ち上げられて
scaffoldというもので７つのアクションのコントローラ、モデル、ビュー、マイグレーションファイルが作られて
データベースが作成されます。





## 各コマンドの解説

cd ~~~で作業行うディレクトリ（フォルダ）の移動です。Change Directoryの略のcdです。
アプリを作りたいフォルダに移動しましょう。

```ruby:ターミナル
cd ~/projects/
```


rails new ~~(ファイル名) -d mysqlでアプリの一式を作って
そのディレクトリ（フォルダ）に移動しましょう

```ruby:ターミナル
rails new test-app -d mysql
cd test-app/
```

エディタで開けば、たくさんファイルができてますね。
[![Image from Gyazo](https://i.gyazo.com/7a944ee0740c346987346ff9baa098cc.png)](https://gyazo.com/7a944ee0740c346987346ff9baa098cc)




scaffoldのでマイグレーションファイル、モデル、ルーティングの設定、コントローラ、ビュー諸々を作ってもらいましょう。

```ruby:ターミナル
rails g scaffold test　　（ここでカラムを指定すればカラムも作成できます）
例　rails g scaffold test name:string price:integer
```



出力結果は下記

```ruby:出力結果
hogehogenoMacBook-Air:test_app hogehoge$ rails g scaffold test
Running via Spring preloader in process 5748
      invoke  active_record
      create    db/migrate/20191025054108_create_tests.rb
      create    app/models/test.rb
      invoke    test_unit
      create      test/models/test_test.rb
      create      test/fixtures/tests.yml
      invoke  resource_route
       route    resources :tests
      invoke  scaffold_controller
      create    app/controllers/tests_controller.rb
      invoke    erb
      create      app/views/tests
      create      app/views/tests/index.html.erb
      create      app/views/tests/edit.html.erb
      create      app/views/tests/show.html.erb
      create      app/views/tests/new.html.erb
      create      app/views/tests/_form.html.erb
      invoke    test_unit
      create      test/controllers/tests_controller_test.rb
      create      test/system/tests_test.rb
      invoke    helper
      create      app/helpers/tests_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/tests/index.json.jbuilder
      create      app/views/tests/show.json.jbuilder
      create      app/views/tests/_test.json.jbuilder
      invoke  assets
      invoke    scss
      create      app/assets/stylesheets/tests.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.scss
hogehogenoMacBook-Air:test_app hogehoge$ 
```


データベースを作成し、マイグレートしましょう。

```ruby:ターミナル
bundle exec rake db:create
bundle exec rake db:migrate
```

これで基本的なファイルは一通りできました。

最後にroutes.rbにルートパスを設定する記述をして終わりましょう。

```ruby:routes.rb
Rails.application.routes.draw do
  resources :tests
  #下記を追記
  root to: "tests#index" 
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
```

これで、rails s　でlocalhostに接続したらtestsのインデックスのビューが表示されます。お疲れ様でした。
CloudFront 

CloudFrontとは　高速・高パフォーマンスなコンテンツ配信サービス(CDN)のこと。


**・CDNについて**
iphoneなどのOSアップデートなどに利用されていて、特定の時間のリリースに応じて大容量のファイルを複数の端末に届ける場合にサーバー負荷が非常に高くなる。その負荷分散を行ってくれるのがCDNのことである。

**CDNの成り立ち**
DNS、キャッシュサーバ、オリジンサーバで成り立っている。

・オリジンサーバ...CDNで言う元のデータが入っているサーバのこと。
・キャッシュサーバ...データを代わりに配信してくれるサーバのこと。

クライアント→→DNS→→CDNキャッシュサーバ→→オリジンサーバ
の順にアクセス

**・キャッシュサーバがオリジンサーバの代わりにデータを配信するまで**
キャッシュサーバの中身は何も入っていないため、オリジンサーバまで取りに行く必要がある。初回にオリジンサーバから取得した後、2回目以降のアクセスはキャッシュサーバから直接配信されるため、負荷分散と高速化が行われる。
コピーペースト禁止のサイトでコピーペーストを行う方法

# はじめに

Webサービスの会員登録フォームでメールアドレスやパスワードの入力時にコピーペーストが禁止され手入力のみ受け付けるようなサイトがたまにある。

しかし私はWebサービスごとに異なるメールアドレス(約30文字)とパスワード(約20文字)を発行し使いまわしもしておらず、これらのコピーペーストを禁止されてしまうと会員登録が実質できなくなってしまう。（手入力が面倒くさい）

そこでこのような登録フォームでの「コピーペースト禁止」を「無効化」する方法をいくつか試してみた。

# 方法

## その1: JavaScriptコードを利用する

コピーペースト禁止を無効化したいページでブラウザのディベロッパーツールを開き、
以下のJavaScriptコードをコンソール欄で実行する。

```js
document.addEventListener('paste', event => event.stopImmediatePropagation(), true);
```

参考画像：Chromeの場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258416/06f8ae5a-845c-5889-0718-d22fec6245d0.png)


本コードが紹介されていたサイト：https://oflow.me/archives/1723

## その2: ブラウザ設定でJavaScriptをオフにする

ブラウザのJavaScript実行機能を一時的(コピーペーストしたい時)にオフにする。

以上