OmniAICreator/Qiita-1.07M huggingface dataset:
ListObjectsV2Request(AWS SDK for Java)でS3のファイル一覧を取得する

# 概要
- ファイルの一覧を取得するには`ListObjectsV2Request`を利用する
    - `ListObjectsV2Request`は一回のリクエストですべての一覧を返さない場合がある
        - `ListObjectsV2Result#isTruncated`が`true`の場合はすべてのファイル一覧を取得できていない
            - `ListObjectsV2Request#setContinuationToken`に`ListObjectsV2Result#getNextContinuationToken`を渡して、再度取得する必要がある。

## すべてのファイル一覧を取得する`Iterator`

```java
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.ListObjectsV2Request;
import com.amazonaws.services.s3.model.S3ObjectSummary;
import lombok.val;

import java.util.*;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

class S3ObjectSummaryIterator implements Iterator<S3ObjectSummary> {

    private final AmazonS3 client;
    private final ListObjectsV2Request request;
    private final Queue<S3ObjectSummary> summaries = new LinkedList<>();
    private boolean isTruncated = false;

    S3ObjectSummaryIterator(AmazonS3 client, ListObjectsV2Request request) {
        this.client = client;
        this.request = request;
        fetch();
    }

    private void fetch() {
        val result = this.client.listObjectsV2(this.request);
        summaries.addAll(result.getObjectSummaries());
        this.isTruncated = result.isTruncated();
        if (result.isTruncated()) {
            request.setContinuationToken(result.getNextContinuationToken());
        }
    }

    @Override
    public boolean hasNext() {
        if (summaries.isEmpty() && isTruncated) {
            fetch();
        }
        return !summaries.isEmpty();
    }

    @Override
    public S3ObjectSummary next() {
        return summaries.poll();
    }

    public static Stream<S3ObjectSummary> stream(AmazonS3 client, ListObjectsV2Request request) {
        val iterator = new S3ObjectSummaryIterator(client, request);
        return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false);
    }

}
```

# 参考

- [AWS SDK for Javaを使ってオブジェクト一覧、フォルダ一覧を習得](https://qiita.com/tq_jappy/items/361e3201a370c5e49f3c)
回線変わってVagrantの接続不良になったときの対処

あくまでも自己責任で。

PCの回線が変わったとき、Vagrant up時、以下のエラーが発生したときに
私が行ったことです。
`Command: ["startvm", "***", "--type", "headless"]`

OS：Windows10

<h1>手順</h1>
①コントロール パネル＞ネットワークとインターネット＞ネットワーク接続に進む。

②VirtualBox Host-Only Ethernet Adapterを無効化する(対象を右クリック→無効化)
~~~
※削除する場合は物理ネットワークを外す。
インターネットの有線ケーブルを外す。または無線に接続しない
私は有線だったので、無線の場合は定かではないです。
削除する場合は、左上の整理から「削除」で行けます。
~~~

再度`Vagrant up` で接続できました。

たぶん最初から再設定してくれたのだと思う。
もしダメだったらVagrantfileの設定がそもそもおかしいかもです。

編集リクエストいただけるとありがたいです。
Redmineの運用で使っているView customizes Plugin色々

メモのついでにRedmineの運用で使っているView customizes Pluginで実現させている機能を記載
参考にさせていただいたサイトの皆様には大変感謝しております。

# 特定のトラッカー選択時にプライベートチケットにする 

[Redmineの新規チケット起票時に選択したトラッカーによってプライベートチケットON/OFFする方法【View customizes Plugin】](https://qiita.com/tamaryoo/items/a9dd18fa42a5452bb186)

# 説明欄の拡大
下記を参考
[ある工場のRedmine画面カスタム【View customize plugin 活用例】](https://www.slideshare.net/netazone/redmineview-customize-plugin)

- Path pattern

```
/issues/new
```

- Type

```
StyleSheet
```
- Code

```
#issue_description {
height: 26em;
}
```

# チケット編集時のエンターキー誤送信防止
下記を参考
[@wfigo7様](https://qiita.com/wfigo7/items/f13a89e1d3522f4a73b6)

- Path pattern

```
/issues
```

- Type

```
JavaScript
```
- Code

```
// チケット編集時のエンターキー誤送信防止
$(function(){

    // form内のエンターキー入力を無視
    // トラッカー・ステータス操作時のDOM操作で破棄されないようdocumentにイベントを設定
    $(document).on('keypress', '#issue-form input[type="text"]', function(event) {
        if(event.keyCode == 13) {
            return false;
        }
    });
    $(document).on('keypress', '#issue-form input[type="date"]', function(event) {
        if(event.keyCode == 13) {
            return false;
        }
    });
});
```

# 個人設定の氏名欄を読み取り専用にする
[Redmineで個人設定から姓名/メールアドレスを変更できなくする方法【View customizes Plugin】](https://qiita.com/tamaryoo/items/0957fc7fe1c377adba04)

# 送信ボタンを押したときに入力された半角英数字を全角英数字に自動変換する
[送信ボタンを押したときにカスタムフィールドに入力された半角英数字を全角英数字に自動変換する【View customizes Plugin】](https://qiita.com/tamaryoo/items/a1de3c23b46d9b1e1036)

# チケット起票、更新時にカスタムフィールドのカタカナの「ニ」を漢数字の「二」に自動変換する
[送信ボタンを押したときにカスタムフィールドに入力されている特定の文字を別の特定の文字に変換する方法【View customizes Plugin】](https://qiita.com/tamaryoo/items/372e36c7a68035978c2f)
Terraform インストール


備忘録というか、毎度毎度調べるのが面倒なので・・・

## ソースファイルのダウンロード
[Terraform公式](https://www.terraform.io/downloads.html)から使用するOSバージョンに合わせてダウンロードする。
今回はCentOSにDLするので[Linux 64bit]からダウンロード

```
# wget https://releases.hashicorp.com/terraform/0.11.8/terraform_0.11.8_linux_amd64.zip
```

## ソース展開
何処に展開してもいいですが、コマンドを打つにはPATHを通さなければならないので・・・

```
# unzip terraform_0.11.8_linux_amd64.zip -d /usr/bin/
```

## インストール確認

```
# terraform --version
Terraform v0.11.8
```

おしまい！！
既存のVisual Studio 2017 Community環境に.NETモバイル開発で「配置エラー」でハマった場合の対応

#前提
この記事は既にVisual Studio 2017 Community環境をインストールしていて、Visual Studio Installerの変更で「.NETモバイル開発」を追加した後に「配置エラー」が発生した人向けの情報になります。

新規でインストールした場合は問題ないと思います。

仕事などで既にC++、C#、VB.NET、PythonでVisual Studio環境を構築しているPCに、いきなりXamarin環境を追加するってパターンは意外とあるのではないでしょうか？


##Xamarin開発環境の追加
Xamarin環境のインストールは、以下を参考にインストールしました。
丁寧にまとまっていてわかりやすかったです。

[Xamarin やりたい人向け Visual Studio 2017 インストール手引書](https://ytabuchi.hatenablog.com/entry/visualstudio2017)

##インストール時のトラブル
インストール時のトラブル周りはここを参考にさせて頂きました。
今回はインストール時のトラブルなどはあまりありませんでしたが、プロジェクト作成後のトラブル解決にも参考になりました。

[Xamarin for Visual Studio スタートアップ トラブルQA集](http://www.nuits.jp/entry/2016/04/07/215641)

##Hyper-V Administratorsにアカウントを追加
Hyper-V Administratorsに、アカウントが登録されていなかった。

会社の共用PCだったので、自分も含め全員に一般ユーザ権限を与えていた。
管理者でログインして、「コンピューターの管理」->「ローカル ユーザーとグループ」->「グループ」のHyper-V Administratorsグループに自身のアカウントを追加。

ついでに色々とUACに色々と言われるので、自分のアカウントを管理者に変更。



##配置エラーが出る
プロジェクトを作成すると実行ボタンが「開始」としか表示されず、実行しても「配置エラーが発生しました」と表示される。配置エラーについてはここの記事を参考にさせて頂きました。

[Xamarin for Visual Studioインストール後、Androidプロジェクトをデバックしようとしたら配置エラーが発生した場合の対処法](https://qiita.com/Nuits/items/b816e4df77305b34dc1e)

実際には、ここだけでは解決しなかったのですが状況を切り分けするのに役に立ちました。


##開発者モードに変更
Visual Studioでプロジェクト作成時に「設定」画面が表示された場合は「開発者モード」にしておく(開発者モードのパッケージがインストールされる)

※追加後に再起動が必要(サインアウトではだめ)


##Androidデバイスマネージャーの確認
再起動しても配置エラーが出たので「ツール」「Android」「Androidデバイスマネージャー」を開いてみる（UACでデバイスへのアクセスを求められたらOK）

ここでデバイスマネージャーが起動しない。

以前、EclipseでAndroidアプリの開発をした時もAVDマネージャーとIDEの連携でハマったことがあったので、1つずつ確認していく。

##Android SDK Managerの確認
それでもAndroidデバイスマネージャーが開かない場合はAndroid SDK Managerを開く。
SDKマネージャーは開くので、各項目を確認。「ツール」に有効な更新パッケージがあったのでインストール。

##そのあと試したこと
それでもAndroidデバイスマネージャーが起動しないので、色々と確認

1. アカウント名が日本語だとダメ？
2. プロジェクトの作成場所を日本語の含まないパスに変更
3. Program FilesのAndroid SDK ManagerやAVD関連のパスに含まれるファイルを確認
4. BIOS設定のIntel Virtualization Technologyの確認
5. Android SDK ToolsのAVD Managerでエミュレータ起動確認


1～4は問題が見つからず、5のSDK ToolsからのAVD Managerからは起動できたので、問題はVisual StudioからのAVD Managerの認識ができていないと判断。


#Visual Studioのアンインストールか修復か？
こういうパターンは過去の経験からインストールの順番などが関係していて、Visual Studioの再インストールをすれば解決する場合が多い。だが、今回は無償のCommunityを使用していてアンインストール周りの情報を調べると、色々と問題がありそうだったので、修復を試してみることに。

「設定」「アプリと機能」から「Visual Studio Installer」を選択し「修復」

修復後、Visual Studioを起動するとAndroidデバイスマネージャーが起動した。

#まとめ
Visual Studio Installerの変更で.NETモバイル開発を追加して配置エラーが出る場合は、手順を追って確認。問題が切り分けできてIDE側の問題の場合は修復も有効。


最近は仕事でMFCと.NETばかり触っていたのでXamarinは初めての初心者に近い状態です。誤記、指摘があればお願いします。
OpenStructでJSONをオブジェクトっぽく扱う

APIのレスポンスがオブジェクトで返ってくるようなものがあって、Rspecでうまくモックしたかったので。

```rb

json = { foo: "bar", hoge: { fuga: "fugafuga" } }.to_json
# => "{\"foo\":\"bar\",\"hoge\":{\"fuga\":\"fugafuga\"}}"

obj = JSON.parse(json, object_class: OpenStruct)
# => #<OpenStruct foo="bar", hoge=#<OpenStruct fuga="fugafuga">>

obj.foo
# => "bar"
obj.hoge
# =>  #<OpenStruct fuga="fugafuga">
obj.hoge.fuga
# => "fugafuga"
obj.hoge.hoge
# => nil
```
送信ボタンを押したときにカスタムフィールドに入力されている特定の文字を別の特定の文字に変換する方法【View customizes Plugin】

# やりたいこと
チケット起票または更新時に特定のカスタムフィールドに入力されている
カタカナの「ニ」を漢数字の「二」に変換したい。
(なんてニッチな要望なんだ！)

# 参考
[ある工場のRedmine画面カスタム【View customize plugin 活用例】](https://www.slideshare.net/netazone/redmineview-customize-plugin)

# 使用するプラグイン
View Customize plugin
https://github.com/onozaty/redmine-view-customize



# やり方
- Path pattern

```
/issues
```

- Type

```
JavaScript
```
- Code

```
//submmit時、所属に入力されたカタカナの「ニ」を漢数字の「二」に自動変換する
$(function() {
  $('#issue-form').submit(function() {
    var txt = $('#issue_custom_field_values_1').val();
    var kan = txt.replace('ニ', '二');
    $('#issue_custom_field_values_1').val(kan);
  });
});
```

【#issue_custom_field_values_1】がカスタムフィールドのidを指定しているので、
ここを変えれば別のカスタムフィールドに適用可能。
【txt.replace】の()内を変えてあげれば他の文字にも対応。
ワードプレスのカスタムフィールドで文末の改行を削除する正規表現

#課題
WordPressサイトの運用では、カスタムフィールドを使ってコーディング知識のない方に入力をしてもらうことがある。

使用しているプラグインは**「Advanced custom field」**。
※参考 [WordPressプラグイン「Advanced custom field」の基本的な使い方と用例](https://www.tam-tam.co.jp/tipsnote/cms/post2000.html)

テキストタイプのカスタムフィールドでは、改行の反映方法を「フォーマット」から選ぶことができる。

<img width="940" alt=" 2018-10-19 13.30.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/63942/010cc7fb-0458-d488-c92e-9911f4abacfc.png">

通常　"Convert new lines into \<br /> tags"を選ぶのだが、問題点が一つ。


入力者が文の最後に改行を付け加えてしまうことがあるのだ。Enterキーを余分に押してしまうようだ。

すると、勝手に改行タグが付け加えられるため下部の余白が大きく見えてしまいレイアウトが崩れることになる。

改行が１回ならまだしも、複数回改行が挿入されてしまうと空白が大きくなり見栄えが悪い。

文中の改行タグはそのままに、文末の改行のみ消すコードを考えた。


```php
preg_replace('/(<br \/>\r\n)+$/', '', get_field('xxx', x));
```

実際はこんな感じで書く。

```php
<p class="hoge"><?php echo preg_replace('/(<br \/>\r\n)+$/', 'a', get_field('xxx', x)); ?></p>
```

#正規表現の解説
phpの関数　**preg_replace** を使っている。

第一引数　→　正規表現で置換したい文字列を特定
第二引数　→　置換後の文字列（今回は削除したいので空白）
第三引数　→　置換したい文字列（get_fieldで取得）

第一引数の正規表現の詳細を。

テキストフィールドで挿入される改行は`<br />\r\n`
単純にbrタグが出力されているのではなく、改行コードもくっついてた。

バックスラッシュが入るとわかりにくいが、本来は`<br />`と`改行コード`が出力。
`<br />`の中の`/`(スラッシュ）が正規表現ではそのまま使えないのでエスケープのために`\`(バックスラッシュ)を付けて`<br \/>`。

改行コードが`\r\n`。

つまり`<br \/>\r\n`。

これが１回以上繰り返されるので`+`をつけて`(<br \/>\r\n)+`。

これを文末のみに適用したいので`$`をつけて`(<br \/>\r\n)+$`。

最後に、正規表現の書き方のということで`/`で囲う。結果、`/(<br \/>\r\n)+$/`。

##感想
正規表現を使うのが久しぶりだったので、良い勉強になりました。
C++ Builder 10.2 Tokyo > TStackPanel > Bug > TStackPanel上にTStackPanelを置けない > 下のTStackPanelの大きさが勝手に変更される

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3
```

2x2の配置となるようなパネルを二層のTStackPanelで作ろうとした。

1. フォーム上にTStackPanelを横方向に２つ配置
2. １のTStackPanel上にTStackPanelを配置

手順2の時に下層のTStackPanelの大きさが勝手に変わり、意図通りにフォームデザインできない。

![2018-10-19_14h04_18.png](https://qiita-image-store.s3.amazonaws.com/0/32870/566d0c3e-137e-e16c-20d1-c62f29648830.png)

バグなのだろうか。

サイズが勝手に変更されないときもある。
プロパティの設定により起きるのかもしれない。
ウォッチャーに追加時グループで検索したい(redmine watcher filterの利用)

# やりたいこと
ウォッチャー追加時に複数人を追加する際にグループでまとめて追加・検索できるようにしたい！

# 使用するプラグイン
redmine watcher filter
https://github.com/ayweak/redmine_watcher_filter

# ちょっとカスタマイズ
https://redmine.tokyo/issues/290
で記載した内容と同じです。

・デフォルト表示
カスタムフィールドの値とロールは私の運用環境下では必要ないためこれをなくしたい。
![ウォッチャー追加画面1.PNG](https://qiita-image-store.s3.amazonaws.com/0/207850/205a042f-d554-0c61-cf30-4d507387924c.png)

・こんな感じ
![ウォッチャー追加画面2.PNG](https://qiita-image-store.s3.amazonaws.com/0/207850/09aa45e2-ffdc-93bb-3070-88ffaec5dbd0.png)

#やり方
{redmineインストールフォルダ}/plugins/redmine_watcher_filter/app/views/watchers/_new.html.erb
を編集し、下記の部分を削除

```
<p><%= text_field_tag 'user_search_by_cfv', nil, :placeholder => l(:watcher_filter_custom_field_value) %></p>　←カスタムフィールドの検索部分を削除
<p><%= render_role_select @project %></p>　←ロールのフィルター部分を削除
```

以上
C++ Builder > geometry > TColorBox > ScaleBy()の拡大結果 > 10.2 Tokyo: きちんと拡大される | XE4: 縦方向の拡大がされない

```txt:動作環境
C++ Builder XE4
Windows 7 Pro (32bit)
```

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3
Windows 10 Pro (64bit) バージョン 1803 (April 2018 Update)
```

IDEのバージョン違いによる挙動の違い。

### 再現手順

1. TColorBoxを配置する
2. ScaleBy()でフォームそのものを拡大する

### 結果

10.2 Tokyoでビルド, Windows 10上実行。
(XE4で用意したプロジェクトファイル)

![2018-10-19_13h40_51.png](https://qiita-image-store.s3.amazonaws.com/0/32870/cba1cfb8-b009-286d-a2c4-c2ac8888841e.png)

XE4でビルド, Windows 7上実行。
![2018-10-19_13h40_05.png](https://qiita-image-store.s3.amazonaws.com/0/32870/10d88873-f029-30b2-d787-f52d0822aae9.png)

特にTColorBoxの縦方向の拡大が弱く、要素選択時も縦に詰まった印象を受ける。

OSの違いか？
と思い、XE4でビルドした実行ファイルをWindows 10で実行してもXE4(on Windows 7)と同じようになった。
GolangでFirebase Service Account Keyを環境変数から読み込む

Golang(v1.11)+HerokuのサーバーサイドでFirebase Authenticationのトークン検証を行った際のTips。

# サービスアカウントキーをファイルから読みたくない

Firebase Adimin SDKの初期化で詰まった。
公式ドキュメントのサンプルコードは以下。

https://firebase.google.com/docs/admin/setup?hl=ja

```go
import (
        "log"

        "golang.org/x/net/context"

        firebase "firebase.google.com/go"
        "firebase.google.com/go/auth"

        "google.golang.org/api/option"
)

opt := option.WithCredentialsFile("path/to/serviceAccountKey.json")
app, err := firebase.NewApp(context.Background(), nil, opt)
if err != nil {
        log.Fatalf("error initializing app: %v\n", err)
}
```

`serviceAccountKey.json` ファイルを読み込んで初期化を行っているが、このファイルをgit管理することは避けたい。
一方、Herokuではgit管理していないファイルは置けない。

そこで、keyを環境変数にセットしてそこから読ませたい。

# 環境変数に設定

https://qiita.com/saicologic/items/3a7596b2558713a7e8fc

こちらの記事を参考に、jsonファイルの中身を環境変数にセットする。
環境変数名は任意。

```
export $FIREBASE_KEYFILE_JSON="$(< ./serviceAccountKey.json)"
```

heroku環境に設定するには下のコマンドを実行する。

```
heroku config:set FIREBASE_KEYFILE_JSON="$(< ./keyfile.json)"
```

# 環境変数を読みSDK初期化

ドキュメントから使えそうな関数を探す。

https://godoc.org/golang.org/x/oauth2/google#example-CredentialsFromJSON

`CredentialsFromJSON` を使えば良いっぽい。

```go

credentials, err := google.CredentialsFromJSON(ctx, []byte(os.Getenv("FIREBASE_KEYFILE_JSON")))
```

初期化コード全体としては以下。

```go
credentials, err := google.CredentialsFromJSON(ctx, []byte(os.Getenv("FIREBASE_KEYFILE_JSON")))
if err != nil {
	log.Printf("error credentials from json: %v\n", err)
}
opt := option.WithCredentials(credentials)
app, err := firebase.NewApp(ctx, nil, opt)
if err != nil {
	log.Printf("error initializing app: %v\n", err)
}
```

# トークン検証

初期化さえ済んでしまえば後はドキュメント通りにコードを書けば良い。

https://firebase.google.com/docs/auth/admin/verify-id-tokens?hl=ja

```go
client, err := app.Auth(ctx)
if err != nil {
	log.Printf("error getting Auth client: %v\n", err)
}
token, err := client.VerifyIDToken(ctx, idToken)
if err != nil {
	log.Printf("error verifying ID token: %v\n", err)
}
log.Printf("Verified ID token: %v\n", token)
```
C++ Builder > geometry > TStackPanel (WPF/XAMLでのStackPanel) > 10.2 Tokyo: 用意されている | XE4: 用意されていない 

### StackPanel

WPFの開発環境ではStackPanelという自動整列機能付きパネルがあることを思い出した。

- [Visual Studio / WPF > 11 StackPanel布局 > Button内にImageとTextBlockを配置するためにStackPanelを使用](https://qiita.com/7of9/items/532651ce96a92b7aca5b)
- [Visual Studio / WPF > コントロール > StackPanel > コントロールの整列に使う](https://qiita.com/7of9/items/23da914d93d99d0ec0b0)

C++ Builderにもないものか。

### 10.2 Tokyo

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3
```

10.2 TokyoにはTStackPanelが用意されている。

- [スタック パネル コンポーネントの利用](http://docwiki.embarcadero.com/RADStudio/Tokyo/ja/%E3%82%B9%E3%82%BF%E3%83%83%E3%82%AF_%E3%83%91%E3%83%8D%E3%83%AB_%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%AE%E5%88%A9%E7%94%A8)

![2018-10-19_13h14_42.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c3bd7a80-873e-a29d-0f45-3b6a652f6de6.png)

追加したコンポーネントは（設定にもよるが）下方向に配置されていく。

Button1をScaleBy()で拡大した時、下の３つのコンポーネントの位置が自動的に変更されることを確認した。


### XE4

```txt:動作環境
C++ Builder XE4
```

XE4ではTStackPanelコンポーネントは見当たらない。

### RadStudioのバージョン 10.2.2以降にて対応

TStackPanelが追加されたのは10.2.2のようだ。
https://community.embarcadero.com/blogs/entry/new-vcl-panels-in-delphi-10-2-2
laravel で デバッグを極めようぜ

デバッグバーを追加

```

composer require barryvdh/laravel-debugbar

php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider"

```

何でもいいからとにかく表示せよ

vim .env

```

APP_DEBUG=true
DEBUGBAR_ENABLED=true

```

んでからの

```

php artisan config:cache

```

大元のコントローラー

自分のIPならデバッグバーを表示。
それ以外ならデバッグバーは表示させぬ。

```Controller.php

<?php

namespace App\Http\Controllers;

use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;

class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;

    public function __construct()
    {

//        キャッシュが残るので 毎回 view ファイルを削除する
        $success = \File::cleanDirectory(storage_path()."/framework/views/");

        if(\Request::ip() == "124.222.4224.121"){

            //デバッグモード

        } else {
            \Debugbar::disable();
        }


    }


}



```


ログを取る

```hogecontroller.php
use Log;//一番上でね

Log::debug($data);

```

/storage/logs/laravel.log
にファイルが出来上がります。
LAPACK/BLAS の設定メモ （Ubuntu）

# 動作環境

Ubuntu 18.04.1
LAPACK 3.8.0
gcc 7.3.0
gfortran 7.3.0
make 4.1
cmake 3.10.2

# ダウンロード

以下のアドレスからダウンロードできる．
http://www.netlib.org/lapack/lapack-3.8.0.tar.gz

# ビルド

- 任意の場所に lapack-3.8.0 を解凍し，そのディレクトリへ移動する．

- make.inc.example の内容を make.inc へコピーする．

```
$ cp make.inc.example make.inc
```

- 以下のように make する．

```
$ make blaslib
$ make lapacklib
$ make cblaslib
$ make lapackelib
```

上記の操作で， librefblas.a， liblapack.a， libcblas.a， liblapacke.a の4つのファイルが得られる．

- 4つの静的ライブラリファイルを /usr/local/lib へコピーする．

```
$ sudo cp ./librefblas.a /usr/lib/libblas.a
$ sudo cp ./liblapack.a /usr/lib/liblapack.a
$ sudo cp ./libcblas.a /usr/lib/libcblas.a
$ sudo cp ./liblapacke.a /usr/lib/liblapacke.a
```

- include ファイルを /usr/local/include へコピーする．

```
$ sudo cp ./CBLAS/include/cblas*.h /usr/include/
$ sudo cp ./LAPACKE/include/lapacke*.h /usr/include/
```

# 動作確認

以下のサイトを参考にしたプログラムで動作確認した．

http://www.netlib.org/lapack/lapacke.html

```C:hoge.c
/* Calling CGEQRF and CUNGQR to compute Q without workspace querying */

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <lapacke.h>
#include <cblas.h>

int main (int argc, const char * argv[])
{
   lapack_complex_float *a,*tau,*r,one,zero;
   lapack_int info,m,n,lda;
   int i,j;
   float err=0.0;
   m = 10;   n = 5;   lda = m;
   one = lapack_make_complex_float(1.0,0.0);
   zero= lapack_make_complex_float(0.0,0.0);
   a = calloc(m*n,sizeof(lapack_complex_float));
   r = calloc(n*n,sizeof(lapack_complex_float));
   tau = calloc(m,sizeof(lapack_complex_float));
   for(j=0;j<n;j++)
      for(i=0;i<m;i++)
         a[i+j*m] = lapack_make_complex_float(i+1,j+1);
   info = LAPACKE_cgeqrf(LAPACK_COL_MAJOR,m,n,a,lda,tau);
   info = LAPACKE_cungqr(LAPACK_COL_MAJOR,m,n,n,a,lda,tau);
   for(j=0;j<n;j++)
      for(i=0;i<n;i++)
         r[i+j*n]=(i==j)?-one:zero;
   cblas_cgemm(CblasColMajor,CblasConjTrans,CblasNoTrans,
               n,n,m,&one,a,lda,a,lda,&one,r,n );
   for(i=0;i<n;i++)
      for(j=0;j<n;j++)
         err=fmax(err,cabs(r[i+j*n]));
   printf("error=%e\n",err);
   free(tau);
   free(r);
   free(a);
   return(info);
}
```

結果は以下のようになった．

```
$ gcc -o hoge hoge.c -llapacke -lcblas -llapack -lblas -lm -lgfortran
$ ./hoge
error=2.384186e-07
```
［vim］read only のファイルをsudoで強制的に保存する

### サーバを触ってて良く出てくるくせに毎回忘れるのでメモ

## E45 readonly option is set(add ! to override)が出たら

入力モードをescで抜ける
コマンドモードで下記を実行
###`:w !sudo tee %`
その後に、強制脱出装置
###`:q!`

上書きできてる！


#URL
[runlevel 5 に入るところでCentOSがこける](http://qwik.jp/takotlog/FailedAtRunLevel5.html)

[vim :: readonly のファイルを sudo で強制的に保存する [Tipsというかメモ] ](http://tm.root-n.com/unix:command:vim:readlonly_write)
Fragmentの切り替え

FragmentとBottomNavigationViewを利用した切り替えアプリを作ろうとして、Fragmentの仕様に左右されているので、気づいたこと確認したことがあれば適宜まとめていく。Qiitaの書き方の練習も兼ねている。

# Fragmentを追加するにあたって
## 問題:切り替え時にViewが重なる
Fragment継承のクラスをいくつか作って、`FragmentTransaction#replace`メソッドを利用して切り替えようとした時起きた問題。replaceでfragmentを入れ替えた時、既存のfragmentと新規のfragmentのviewが重なってしまった。
### 原因
XMLで記述したfragment(view)にreplaceしていた。どうやら、`FragmentTransaction#replace`メソッドはfragmentビューのクラス切り替えをするようなメソッドでは無いらしい。今回は、元々ビューで設定していたfragmentとreplaceした新たなfragmentが重なって見えていたということ。

参考: [Fragmentをreplaceしても一つ前のFragmentが残る](https://ja.stackoverflow.com/questions/6342/fragmentをreplaceしても一つ前のfragmentが残る)

### 解決案
XMLではcontainerとして別のビューを使用。(今回はConstraintLayout)そこにreplaceなどして解決。

# Fragment切り替え時
## メモ:`FragmentTransaction#replace`メソッドで指定したFragmentクラスについて
用意した複数のFragmentクラスに対してそれぞれオブジェクトをひとつずつ生成して使い回していこうと思っていたが、上記のメソッドでオブジェクトを指定した際、毎回`Fragment#onCreateView` `Fragment#ononViewCreated`メソッドなどが呼び出されるようだ。値の初期化に対して気をつけていきたい。

尚、バックボタンで前のFragmentに戻ったりということは想定していないので、`addToBackStack`メソッドは利用していない。もしかしたら、これにより動作が変化するかもしれない。
.NET Coreで定義ファイルを読む

VSCode上で開発してます。

[.NET と.NET Coreで定義ファイルを読む](https://takachan.hatenablog.com/entry/2017/10/15/160431)

上記記事だと一部不足していたので補足。
追加で以下パッケージをインストール。

```terminal
PS> dotnet add package Microsoft.Extensions.Configuration.FileExtensions
```

`AddJsonFile`の前に`SetBasePath`が必要。

```c#:Program.cs
IConfigurationRoot conf = new ConfigurationBuilder()
  .SetBasePath(Directory.GetCurrentDirectory())
  .AddJsonFile("App.Config.json", optional: true)
  .Build();

Console.WriteLine("conf: " + conf["hoge"]);
```

サンプルなどでは、`BasePath`にセットするのは上記のようになってますが、これだとexeを実行する位置によっては対象ファイルが見えなくなってしまうので`System.AppDomain.CurrentDomain.BaseDirectory`を指定すると良いです。

参考：[c# - How to SetBasePath in ConfigurationBuilder in Core 2.0 - Stack Overflow](https://stackoverflow.com/questions/46843367/how-to-setbasepath-in-configurationbuilder-in-core-2-0)

# 配列を扱う

JSONの中に下記のような配列が含まれる場合、上記だけでは不足で

```json
{
    "ID": "406110182",
    "INPUT": "INPUT",
    "OUTPUT": "OUTPUT",
    "DIR_LIST": [
        "hoge",
        "fuga",
        "abc",
        "yahoo"
    ]
}
```

```c#
conf["DIR_LIST"]
```

などとやっても取得できない:worried:



下記パッケージを追加でインストール

```terminal
PS> dotnet add package Microsoft.Extensions.Configuration.Binder
```

下記のように取得

```c#
var myArray = conf.GetSection("DIR_LIST").Get<string[]>();
```

すっごく気持ち悪い:frowning2:

参考：[ASP.NET Core Get Json Array using IConfiguration - Stack Overflow](https://stackoverflow.com/questions/41329108/asp-net-core-get-json-array-using-iconfiguration)


# コンソールアプリを配置時に上記ファイルを含める

これだけだと、publish時にこのファイルが含まれないので、.csprojに以下設定を追加

```c#:xxx.csproj
  <ItemGroup>
    <Content Include="App.Config.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

```

参考：[[VisualStudio]ビルド時のファイルコピー先をプロジェクト階層と違う場所にする](http://oita.oika.me/2015/01/28/copy-to-another-output-directory/)
AWSのざっくりインフラ見積もり手順について


この記事では個人利用で
**スーパーざっくり** AWSのインフラ費用を見積もりたいときの
**スーパー簡単な手順** について書いていきます

さて、 **スーパー簡単な手順** に落とすと以下の2つで見積もれます。

1. Cloudcraftを使用して構成管理を図に落とす
2. AWS見積もりサービスで図から必要なインフラをぽちぽち追加する

たったこれだけですw


## 1. Cloudcraftを使用して構成管理を図に落とす

構成管理を図に落とす際はこちらのサービスが便利です

=> [Cloudcraft](https://cloudcraft.co/)

このサービスを駆使していけば↓のような
AWSインフラの構成を図に落とすことができます。

![cloudcraft.png](https://qiita-image-store.s3.amazonaws.com/0/45536/92a3b84d-c45c-9df1-3f84-7762f337e231.png "cloudcraft.png")

詳しくはこちらの記事が参考になりそうです。

=> [AWSの構成図をいい感じに出力してくる「Cloudcraft」を使ってみた](https://made.livesense.co.jp/entry/2017/06/05/090000)

## 2. AWS見積もりサービスで図から必要なインフラをぽちぽち追加する

あとはこの見積もりサービスで月間費用を算出しましょう
構成に必要なものをぽちぽち追加していくだけです。

=> [SIMPLE MONTHLY CALCULATOR](http://calculator.s3.amazonaws.com/index.html?lng=ja_JP)


この記事が参考になりそうです

=> [AWS初心者がサービス内容と料金を調べて見積もりしてみた](https://qiita.com/toshi586014/items/0dfb4e46ca065b810286)

ざっくり計算するためのサイトを作ってる人もいるようですw

=> [AWSの料金を「ざっくり」計算できるサイトを作る](https://qiita.com/noplan1989/items/64491dab247d92e10d41)

## 補足

図に落とせないようなものは別で計算して把握しておくとよいです。

EIP数とかドメインとか、転送量などなど
以上、 **スーパーざっくり** かつ **スーパー簡単な手順** についてでした。
ActiveRecordからHashに変換するときにKeyをSymbolにしたい

## TL;DR

とある設定値(Hash)をDBから取得した値に更新したかった。
ところが `hash.merge(Model.attributes)` すると String型とSymbol型のキーで重複した値ができてしまった。
これをなんとかしたくていろいろググってしまったが非常にシンプルな解決策があったのだけどそこにたどり着くまでにそこそこ時間がかかってしまったという訓戒。

## 結論:

attributesで取得したHashに対してsymbolize_keysすればよい。

```ruby
pry(main)> {"name" => 'hoge fuga', "age" => 17}.symbolize_keys
=> {:name=>"hoge fuga", :age=>17}
```

ActiveRecordからHashにする方法はいくつか出てきたのだけどそのHashがString型で少し困る事態が発生してしまった。
可能ならキーはSymbol型が嬉しいのだけど`attributes`が返すHashはString型だったのでうまく意図したデータになってくれなかった。

`with_indifferent_access`でキーがString型でもSymbol型でもどっちでもOKになるのだけど出来れば厳密にしたかったためSymbol型に変換した状態でマージをするためにはどうすればいいのだろうか？と考えていた。

当初はHashの中身をループさせて変換されたものを再代入すればいいかと思っていたのだがそんな泥臭い方法しないといけないのだろうか？と気になって調べ直したところ、↓のエントリにたどり着き自分がやりたかったことがシュッと実現できる運びになってHappy!という感じです。

[Railsでハッシュのキーをシンボルに変換](https://qiita.com/torshinor/items/09a5887e5519efe1f29a)

ちなみに泥臭い感じのコードは↓と全く同じでした。
[Hashのキーを文字列からシンボルに変換する](https://qiita.com/zakuroishikuro/items/5b08d65d4fef79982f19)

HashのキーがString型もSymbol型も許容するのはいいのだけど内部的にはSymbol型で統一してほしいという気持ちがある。
とはいえそれをしてしまうとString型とSymbol型で異なるキーだと判断しているいまのHashの振る舞いが変わってしまうので難しいんだろうなーと思うとなかなかつらみ。
AtomにBlackをインストールするんだよ!!

## はじめに
Blackって知ってる?
[Github](https://github.com/ambv/black)
簡単に言えば、Pythonのコードエディター。
コード上の改行や空白を統一してくれたり、見やすいようにしてくれたるする。

まぁ、入れといて損はないでしょ。
さてさて私もインストールしましょうかね。

## インストール
Blackの[Github](https://github.com/ambv/black)を見ると、

```
 $ pip install black
```

で行けるらしい。

やってみます。
![Screenshot from 2018-10-19 12-26-29.png](https://qiita-image-store.s3.amazonaws.com/0/218398/de94b3bc-4f6a-2fb8-bf2e-3c24a6862fb2.png)
はい、できませんでした。

[issue](https://github.com/ambv/black/issues/439)を見てみると、同じような問題が起きた人がいるみたい。

簡単な訳をしてみると、
「BlackはPython3が必要だから、python3に対応しているpipを使ってね」
とのこと。

じゃあ、`pip`じゃなくて、`pip3`を使ってみるか。

```
 $ pip3 install black
```

できたできた

## Atomでblackを使う
PCに入れられればあとは簡単よ。
Atomのパッケージから`python-black`をインストールすれば完了。
ほとんどの人はデフォルトで良いんじゃないかな?

## おわりに
やっぱコードを自動でチェックしてくれるのは便利だよねぇ。
他の言語でも探してみますか。
TensorFlowを使って猫の種類の判別機を作る

#TensorFlowを使って猫の種類の判別機を作る
TensorFlowを使って猫の種類の判別機を作ります。TensorFlowをインストールしている前提で話します。
pythonのバージョンはpython3です。
まずは、TensorFlowのフォルダをGithubから落としてきてください

#画像を集める
google_images_downloadをインストール 
```pip install google_images_download```

画像をダウンロードする
```googleimagesdownload -k 猫の種類```で画像を集めに行きます。

![11.PNG](https://qiita-image-store.s3.amazonaws.com/0/304161/0097249b-033c-79ba-0903-6e7180ff4f29.png)

アメショーかわいいですね。
#学習
集めた猫の画像を学習させます。
その際、学習データのフォルダを英語に変更しておいてください。
そして、そのフォルダをgakusyu_data（作ってください）という名前のフォルダに入れて、落としたTensorFlowのフォルダのtensorflow/tensorflow/examples/image_retrainingに入れておきます。
![チャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/304161/99ba874c-4423-b540-5dce-c6fd65fc8acd.png)
中味はこんな感じです
retrain.pyなんてないよって方は調べれば出てくるので、ソースコードをコピーして作ってください。
![キャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/304161/7c759e01-b688-2669-f79e-ab7c79e2d19b.png)
コマンドプロンプトを開き
tensorflow/tensorflow/examples/image_retrainingに移動します。
そこで
```python retrain.py --bottleneck_dir=bottlenecks --how_many_training_steps=学習データ数 --model_dir=inception --summaries_dir=training_summaries/basic --output_graph=retrained_graph.pb --output_labels=retrained_labels.txt --image_dir=gakusyu_data
```
を実行します。ファイル名でエラーが出る場合があるので、その場合はファイル名を変えてください
完了すればOKです。
#画像判別
次に判別させます。
tensorflow/tensorflow/examples/image_retrainingに判別させたい画像ファイルを入れておいてください。
まず、tensorflow/tensorflow/examples/label_imageにあるlabel_image.pyをtensorflow/tensorflow/examples/image_retrainingに移動しておきます。
そして
```python label_image.py --image 画像ファイル名 --graph retrained_graph.pb --labels retrained_labels.txt```
を実行すると
![キ.PNG](https://qiita-image-store.s3.amazonaws.com/0/304161/4966603d-81f0-4e7d-b7d5-438fb476f352.png)
このような結果がでます。
KeyCodeErrorが出る場合はlabel_image.pyの84,85行目を
```input_layer = "Mul"
output_layer = "final_result"```
に変更すると治るらしいです。自分は治らなかったので調べてみると判別させるコマンドの最後に```--input_layer=Placeholder```を入れると動きました。
ではまた。
Jupyter notebookをディレクトリを指定して起動する

**Mac環境を前提として書いていますが，Win環境でも同様に実行できます．**
Jupyter-notebookを起動すると、設定ファイル`/Users/ユーザー名/.jupyter/jupyter_notebook_config.py`中の変数`c.NotebookApp.notebook_dir`で指定されたディレクトリで開始されます．
設定ファイルが存在しない場合は以下のコマンドにより生成することができます（参考: [Jupyter Notebookをインストール・設定して勉強ノート作成環境をつくる [Mac]] (https://qiita.com/sasaki77/items/bfa53828c973ba46e34d)）．

```bash

$ jupyter notebook --generate-config
```

Jupyter notebook上で作業フォルダの移動は可能なのですが、初期ディレクトリより上の階層には移動できないはずです．（この移動方法をご存知の方がいらっしゃったらお教えいただきたいです．使います．）

そこで起動時にディレクトリを指定する次のコマンドが便利です．パスは絶対・相対いずれでも指定可能です．

```bash

$ jupyter notebook 起動したいディレクトリのパス
```
例えばターミナルの現在のディレクトリで起動したい場合は以下を実行します．

```bash

$ jupyter notebook ./
```
NuxtJSでnuxt-childを利用してヘッダーなどを共通化する方法

Nuxtではnuxt-childというタグを利用でき、これを利用することでヘッダーの共通化などが実現できます。
公式ではnuxt-childに付いての説明こそありますが、実用的な使い方に付いては説明がなかったため今回説明していきたいと思います。

## Nuxtの自動ルーティング機能について
Nuxtでは作成したpagesの構成によって自動的にルーティングの設定が行われます。

例えば`pages/hoge.vue`というpageを作れば、`/hoge`というページにアクセスできるようになります。

また`pages/hoge/`というディレクトリを作成し、その中で`pages/hoge/foo.vue`や`pages/hoge/bar.vue`ファイルを作成すれば、`/hoge/foo`ページ、`/hoge/bar`ページへのルーティングが行われます。

ここでfooページとbarページに、hogeディレクトリ以下の共通ヘッダーを表示したい場合、nuxt-childを利用することで個々のvueファイルに同じhtmlを記述することなく共通化を行うことができます。

## ヘッダーの共通化を行う

まず共通ヘッダーを設置する親pageを作成します。

```vue:pages/hoge.vue
// pages/hoge.vue
<template>
  <div>
    <h1>This is a Hoge Header.</h1>
    <nuxt-child/>
  </div>
</template>
```

次に子pageを作成します。

```vue:pages/hoge/foo.vue
<template>
  <div>
    <h2>I am the foo page.</h2>
  </div>
</template>
```

```vue:pages/hoge/bar.vue
<template>
  <div>
    <h2>I am the bar page.</h2>
  </div>
</template>
```

作成したpageは自動ルーティングで作成されたパスにアクセスした際に、親pageに記述した`<nuxt-child/>`タグ部分に表示されます。

この仕組みを使って、親pageに共通化したい要素を記述することで共通化が実現できます。
僕が考えた最強の技術書の選び方

# はじめに
巷には数えきれない程の技術書があります。
中級者以上ならともかく、プログラムの勉強を始めたばかりの初心者・初級者には、何が良い技術書なのか、どう選べば良いか分からないと思います。

# そもそも「良い技術書」とは？
**ここで定義するのは、あくまで私が考えている「良い技術書」です。**
**良い本は人によって定義が違うと思われるので、悪しからず。**

## 良い技術書とは自分のレベルに合った本である
一口に技術書と言っても中身は初心者～上級者向けまで様々です。
自分に合っている技術書とは、**自分が学びたいことに関して、自分の実力で理解できる難易度**の技術書です。
まずは自分のレベルに合っている技術書を探しましょう。

# 良い技術書を探す方法
それではここから良い技術書を探す方法を紹介します。
「これより良い探し方知ってるぜ！」という人はぜひコメントで教えてください。

## 技術書の紹介記事や書評をググる
**※面倒な方はAmazonで調べる手順から始めても大丈夫です**
まずはどんな技術書があるのか探してみましょう。
例えばRubyを覚えたいなら「Ruby 本 おすすめ」という語句でググってみましょう。
そして複数の記事で取り上げられてる技術書は期待大です。

## Amazonでレビュー3.5以上の技術書を調べる
Amazonのレビュー機能を参考に探しましょう。
最初にググって調べた方は、おすすめされている本がどのくらいの評価なのか確認してみましょう。
ちなみにレビュー3.5以上なのは平均以上だからです。
もっと広い範囲で探したい方はレビュー抜きで調べてみてください。

## 技術書を探すにあたって注意点
### 発行年月を確認する
これは絶対確認してください。
技術書によっては、発行年数が古いと、現行のバージョン違いによって本の通りに動かないということがあります。（私も経験があります）
どれくらい古いとだめなのか、というのは技術によってバラバラなのでここでは割愛します。

### 技術書の対象者を確認する
技術書の前書き（本の冒頭）には大抵どの層に向けて書かれたのか、ということが書いてあります。
そこを確認して、自分は読者層なのかどうかを確認しましょう。
ここを確認していないと、後述の事が起こります。

### Amazonのレビューには罠がある
これは技術書以外にも言えますが、Amazonのレビューの数字だけを見てはいけません。
ちゃんと内容も確認した方が良いです。

例えばレビュー3.5くらいの技術書があったとします。
評価が低い人のレビューを見てみると、以下のようなことが書いてありました。
「入門とかかれてはいるが、内容は全然入門者向けではない」
そう、タイトルに「入門」の文字が付いていながら、入門者向けではない本があるのです。
つまり自分が初心者だとしたら、この本は自分のレベルに合わない可能性があるのです。

逆に同じレビュー3.5の技術書でも以下の低い評価があったとします。
「読んでみたが、基礎的・簡単なことばかりで役に立たなかった」
みたいなことを書いてたりもします。
つまりこの本は中級者以上にっとては役に立たないものでも、初心者にとっては有益な本かもしれません。

このような低い評価をつけている人たちのレビュー内容は、中身を確認することで回避することができます。
詳しくは後述します。

## 本屋に行って実物を見る
欲しい技術書が決まったら、実際に本屋に行って中身を確認しましょう。
これをしないと、上記のAmazonレビューのようなことが起きてしまいます。
ではどこを読めば良いのか。

### 目次を読む
目次を読むことで、自分が知りたい内容が記載されているのか確認することができます。

### 数ページ程しっかりと読む
目次がOKなら、今度は内容を読みます。
できれば目次の1項目分を読みましょう。
目的は著者の文章が分かりやすいか、理解できる文章なのか確認するためです。

# さいごに
ここまでの手順を経て、自分に合っていると感じたら買っても大丈夫かと思います。
ただ買う方法にも良し悪しがあります。

## 紙の本にこだわりがないなら電子書籍の方が良い
基本的に技術書を読んで勉強する時は、手を動かしながらでないと頭に入りません。（サンプルコードを写経するとか）
しかし技術書は分厚いものが多いため、手を動かしている時に開きっぱなしにし辛いのです。
これはブックスタンドで解消できますが、やっぱりページをめくる時にストッパーを外さなければならないため、ストレスはあります。
正直勉強やめたくなるくらいのストレスです。

タブレットを持っている人は電子書籍の方がストレスフリーで良いかと思います。

私は紙の本の方が好きなのでブックスタンド使っていますが、ストレス半端ないです。

  
  
  
  
  
  
嘘ですタブレット持ってないだけです。

iPadほちぃ。
Kubernetesで同一Pod内で通信するときのアドレス指定

>And that makes sense, because in many respects, a Pod aces like a single server. For example, each container can access the other containers in the pod as different ports on localhost.

https://www.mirantis.com/blog/multi-container-pods-and-container-communication-in-kubernetes/

単純に同一Pod内であれば、localhostを指定すれば通信できる。

PodA内コンテナα => PodA内β(port:8080)通信の場合、
PodA内コンテナαから`http://localhost:8080`指定でβに通信できる。
SpreadSheetのショートカットメモ（Windows）

#SpreadSheetのショートカットメモ(Windows)
Excelより使いやすい！なんて言われていますが、ショートカットの勝手が
大分違ったので、メモメモ

##シート移動（左）
Ctrl + Shift + PageUp

##シート移動（右）
Ctrl + Shift + PageDown

##シート一覧の表示
Shift + Alt + K

##特殊貼り付け（書式のみ）
Ctrl + Alt + V
**※片手で入力すると手つります。**
C++ Builder XE4 > TComponent > コントロールの拡大の検討 (Fontサイズ, ScaleBy)

```txt:動作環境
C++ Builder XE4
```

## 参考

- [フォームとコントロールを動的にサイズ変更するときの考慮事項](http://docwiki.embarcadero.com/RADStudio/XE4/ja/%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%A8%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%AB%E3%82%92%E5%8B%95%E7%9A%84%E3%81%AB%E3%82%B5%E3%82%A4%E3%82%BA%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE%E8%80%83%E6%85%AE%E4%BA%8B%E9%A0%85)

> TLabel や TEdit などの一部のビジュアルコントロールは，コントロールのフォントサイズが変わると，自分自身のサイズを変更します。

## 確認 > v0.1

- Fontサイズ変更でのTComponentのサイズ変更
- ScaleBy()によるTCompoenntのサイズ変更

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	Edit1->Font->Size = 24;
	Edit2->ScaleBy(150, 100);

	Button3->Font->Size = 24;
	Button2->ScaleBy(150, 100);
}
//---------------------------------------------------------------------------
```

## 結果

### Button1押下前

![2018-10-19_11h40_22.png](https://qiita-image-store.s3.amazonaws.com/0/32870/da8ec302-94aa-fbdc-e3c3-30def37f295d.png)

### Button1押下後

![2018-10-19_11h41_17.png](https://qiita-image-store.s3.amazonaws.com/0/32870/c3e4a1ca-cf98-0059-6a4d-f87e9b3d1ff9.png)

拡大のされ方に一貫性がない。

## 確認 > v0.2 : TPanel配置物の拡大

TPanel上の拡大について確認した。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	Edit1->Font->Size = 24;
	Edit2->ScaleBy(150, 100);

	Button3->Font->Size = 24;

	Button2->ScaleBy(150, 100);

	// パネルサイズ変更
	PNL_sample->ScaleBy(150, 100);
	Edit4->Font->Size = 15;
	Edit3->Font->Size = 15;
	Button5->Font->Size = 15;
	Button4->Font->Size = 15;

}
//---------------------------------------------------------------------------
```

Button1押下前

![2018-10-19_12h05_51.png](https://qiita-image-store.s3.amazonaws.com/0/32870/684271d9-eaab-f7e1-c96f-8addbebf0539.png)

Button1押下後

![2018-10-19_12h05_58.png](https://qiita-image-store.s3.amazonaws.com/0/32870/8a53abaa-00a1-9845-9961-71c83f1e9c0d.png)
MySQL で特定の IP アドレスからのアクセスを許可する

# はじめに

web サーバーから DB サーバーにアクセスを許可するときなど、MySQL で外部からのアクセスを許可したいときの設定あれこれを自分用にメモ。

# おしながき

DB サーバーにログインして以下の作業を行っていきます。

- MySQL の設定
- MySQL で外部からのアクセス権を持ったユーザーの作成
- firewall の設定

# 環境

OS： CentOS 7
MySQL： 5.7

# MySQL の設定

必要に応じて my.conf を書き換えます。
なお、環境によって my.conf が保存されている場所が違うようです。
自分は `/etc/my.cnf` にありました。

【参考】[my.cnfの場所を調べる](https://qiita.com/is0me/items/12629e3602ebb27c26a4)

`bind-address` に接続したい IP アドレスを追加。

```
bind-address = 127.0.0.1
bind-address = 192.168.128.1（この行を追加）
```

もしくは `bind-address` をコメントアウトしてすべての IP アドレスを許可する。

```
# bind-address = 127.0.0.1
```

# MySQL で外部からアクセスできるユーザーを作成

まずは root でログインします。

新しくユーザーを作成しますが、そのときにアクセスを許可する IP アドレスを指定します。

```
mysql> CREATE USER "sample"@"192.168.128.1" IDENTIFIED BY [password];
```

きちんと設定できているか確認してみます。

```
mysql> SELECT user, host FROM mysql.user

+---------------+-----------------+
| user          | host            |
+---------------+-----------------+
| sample        | 192.168.128.1   |
| mysql.session | localhost       |
| mysql.sys     | localhost       |
| root          | localhost       |
+---------------+-----------------+
```

sample ユーザーの host に `192.168.128.1` が設定されています。

次に、作成した sample ユーザーに `192.168.128.1` からアクセスできるよう権限を与えます。

```
mysql> GRANT ALL PRIVILEGES ON *.* TO "sample"@"192.168.128.1";
```

上記の例では、すべての権限をすべての DB に対して与えています。

# firewall の設定

最後に、firewall で IP アドレスと MySQL を許可します。
なお、設定には sudo 権限が必要です。

まずは新しいゾーンを作成します。

```.sh
$ firewall-cmd --new-zone=sampleZone --permanent
$ firewall-cmd --reload
```

次に、許可する IP アドレス（`192.168.128.1/32`）とサービス（MySQL）を指定します。

```.sh
$ firewall-cmd --add-source=192.168.128.1 --zone=sampleZone --permanent
$ firewall-cmd --add-service=mysql --zone=sampleZone --permanent
$ firewall-cmd --reload
```

設定ができたら確認してみましょう。

```.sh
$ firewall-cmd --list-all --zone=sampleZone

sampleZone (active)  # active であることを確認
  target: ACCEPT
  icmp-block-inversion: no
  interfaces: 
  sources: 192.168.128.1  # IP アドレスが追加されています
  services: mysql  # MySQLmysql
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
```

# アクセスしてみる

web サーバーから IP アドレスを指定して DB サーバーの MySQL にアクセスしてみます。

```
$ mysql -h 192.168.128.1 -u sample -p
```

これでログインできれば成功です。
【css】Material Iconにバツ印を重ねて表示する

メール送信エラーのアイコンを作成したときのものを記載します！

> [material-design-icons](https://google.github.io/material-design-icons/)および[Materialize](https://materializecss.com/)を使用しています。

<p data-height="265" data-theme-id="0" data-slug-hash="KGRNyx" data-default-tab="css,result" data-user="sjnya" data-pen-title="Overlap Material Icon" class="codepen">See the Pen <a href="https://codepen.io/sjnya/pen/KGRNyx/">Overlap Material Icon</a> by sjnya (<a href="https://codepen.io/sjnya">@sjnya</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


```scss
div.failed_icon {
  display: inline-block;
  position: relative;

  span::before, span::after {
    display: block;
    content: "";
    position: absolute;
    top: 70%;
    left: 90%;
    width: 50%;
    height: 10%;
    margin: -8% 0 0 -42%;
    background: #f50057;
    border-radius: 1px;
  }

  span::before {
    transform: rotate(-45deg);
  }

  span::after {
    transform: rotate(45deg);
  }
}
```
MKMapViewにルートを簡単に描画する方法


Mapを使ってると、ルート描きたいなーって思うことありますよね？


今回はこの記事のほぼ丸パクリです...
https://www.iostutorialjunction.com/2018/03/draw-route-on-apple-map-or-mapkit-tutorial-in-swift4.html

記事ではアメリカなので、対抗して東京駅-大阪駅間でルート書いてみました。
あとは私なりにですが少しコードの解説してみます。ちなみにswift4.2です。

1.ロケーションの設定
これはわかりやすいですね。東京駅と大阪駅の緯度経度をCoordinateに与えています。

```swift
        let sourceLocation = CLLocationCoordinate2D(latitude:35.681464, longitude: 139.767052)
        let destinationLocation = CLLocationCoordinate2D(latitude:34.702741, longitude: 135.495929)
```

2.出発地/到着地にPinを置く
annotationの設定です。いわゆるマップ上のPINの設定です。
今回はカスタムクラスにタイトルとlocationの情報を与えてを追加しています

```swift
        // add annotation
        let sourcePin = customPin(pinTitle: "Tokyo Station", pinSubTitle: "", location: sourceLocation)
        let destinationPin = customPin(pinTitle: "Osaka Station", pinSubTitle: "", location: destinationLocation)
        self.mapView.addAnnotation(sourcePin)
        self.mapView.addAnnotation(destinationPin)
```

3.MKPlacemarkの設定
ここは僕も詳しくわかっていないのですが、公式を見るとspecified coordinateって書いてあるので、
経路探索するための情報なのかと思います。
https://developer.apple.com/documentation/mapkit/mkplacemark

```swift
        let sourcePlaceMark = MKPlacemark(coordinate: sourceLocation)
        let destinationPlaceMark = MKPlacemark(coordinate: destinationLocation)
```


4.経路探索→経路を設定。そして縮尺を設定
ここでメインのMKDirectionsが出てきます。
先ほど設定したMKPlacemarkを与えて経路探索のリクエストを投げます。
経路が帰ってきたら、addOverlayで経路情報をMapに追加します。
その後ルートが入る範囲で縮尺を設定します
最後にdelegateをお忘れなく..

```swift
        let directionRequest = MKDirections.Request()
        directionRequest.source = MKMapItem(placemark: sourcePlaceMark)
        directionRequest.destination = MKMapItem(placemark: destinationPlaceMark)
        directionRequest.transportType = .automobile

        let directions = MKDirections(request: directionRequest)
        directions.calculate { (response, error) in
            guard let directionResonse = response else {
                if let error = error {
                    print("we have error getting directions==\(error.localizedDescription)")
                }
                return
            }
           　//　ルートを追加
            let route = directionResonse.routes[0]
            self.mapView.addOverlay(route.polyline, level: .aboveRoads)
            //　縮尺を設定
            let rect = route.polyline.boundingMapRect
            self.mapView.setRegion(MKCoordinateRegion(rect), animated: true)
        }

        //set delegate for mapview
        self.mapView.delegate = self
```

ちなみに帰ってくるルートは複数あるようで、全て表示したい場合はroutesをaddすれば表示できそうです。
（routesがどんな順番で帰ってくるのかイマイチわかりませんが...）


5.ルートの描画
最後に描画の処理をdelegateメソッド内に描きます
これはなんとなくでも読めるかもしれませんが線の太さと色を指定しています。

```swift
    //MARK:- MapKit delegates
    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        let renderer = MKPolylineRenderer(overlay: overlay)
        renderer.strokeColor = UIColor.blue
        renderer.lineWidth = 4.0
        return renderer
    }
```

とここまで書いたものをgithubに公開したのでよかったら参考してください。
https://github.com/entaku19890818/map

これで大阪駅まで迷わずいけますね。
え、新幹線使えよって？
そのCSS、もっと簡潔に書けるかも

こんにちは。今回は省略してより簡潔に書けるかもしれないCSS記法4例とおまけ1つを紹介します。
サンプルコードでは冗長な記法のクラスを`.verbose　{...}`、簡潔な記法のクラスを`.concise{...}`として書いていきます。

## 省略できる初期値
### transition: all;
時間遷移効果を与える`transition-property`プロパティの初期値は`all`なので、`transition: all`と記述する必要はありません[^1]。
さらに遷移変化の進行割合を表す`transition-timing-function`プロパティは初期値が`ease`なので[^2]、もし`ease`に設定する場合はこれも不要になります。

```css:css
.verbose{
  transition: all .3s ease;
}
.concise{
  transition: .3s;
}
```
### margin: 0 auto;
左右中央寄せ目的で書かれることが多い`margin: 0 auto;`ですが、そもそも`margin: auto`の初期値は0です[^3] [^4]。そのため以下のように省略可能なことが多い。

```css:css
.verbose{
  margin: 0 auto;
}
.concise{
  margin: auto;
}
```
`position:absolute;`を使った上下左右中央寄せなどのケースでは`margin: 0 auto;`と`margin: auto;`は振る舞いが変わるので注意です。

```css:css
/*このようなケースでは位置が変わることがあります*/
/*上下左右中央寄せ*/
.some-box{
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: auto;
}
.other-box{
/*左右は中央寄せのまま親相対要素の上にくっつく*/
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  margin: 0 auto;
}
```

## 省略できる単位と`0`
### 0に単位は不要
0という数値にpxやremなどの単位は不要です。sassのmixin機能を使って単位suffixの自動付与をしているきなど意外と見落としてしまうことも。

```css:css
.verbose{
  font-size: 0px;
  width: 0%;
  height: 0rem;
}
.concise{
  font-size: 0;
  width: 0;
  height: 0;
}
```

### 小数点前の0は不要
`0.5`などの小数は`.5`のように0を省略できます。
ただし`0.5`と0を付ける記法には可読性が向上するというメリットもあります。とくに複数でコーディングするときには`0.5`記法を許容しつつbuild時にはminifyして取り除く…など運用の取り決めを作っておくと良い。

```css:css
.verbose{
  box-shadow: 2px 2px 0px rgba(0,0,0,0.5);

}
.concise{
  box-shadow: 2px 2px 0 rgba(0,0,0,.5);
}
```

## おまけ: その他のハック
### border: none;
線を消すとき、ショートハンド記法で `border: none;`（`border-style: none;`)とするより`border: 0;`（`border-width: 0;`)とする方が簡潔です。これは`outline`プロパティでも同じです。Airbnbスタイルガイドではこの書き方が推奨されています[^5] [^6]。

```css:css
.verbose{
  border: none;
  outline: none;
}
.concise{
  border: 0;
  outline: 0;
}
```

#所感
省略できるところは省略して、簡潔で理解しやすいCSSを書いていきたいですね。精進。

[^1]: [Don’t Forget About “transition: all”](https://www.impressivewebs.com/css3-transition-all/)
[^2]: [CSSプロパティ初期値まとめ](https://qiita.com/Shinji-m/items/4233d7f15eac426ddfa2)
[^3]: [10.6.2 Inline replaced elements, block-level replaced elements in normal flow, 'inline-block' replaced elements in normal flow and floating replaced elements](https://www.w3.org/TR/CSS2/visudet.html#inline-replaced-height)
[^4]: [10.6.2 置換インライン要素、通常フローにおいて置換ブロックレベルおよび置換インラインブロック要素、置換浮動要素の場合](https://momdo.github.io/css2/visudet.html#inline-replaced-height)
[^5]: [Airbnb CSS / Sass Styleguide](https://github.com/airbnb/css#border)
[^6]: [Airbnb CSS / Sass スタイルガイド(日本語訳)](https://github.com/nao215/css-style-guide#%E3%83%9C%E3%83%BC%E3%83%80%E3%83%BCborder)
C#による辞書(Dictionary)型とその値のソート

#C#で辞書(Dictionary)型における値のソートを書いてみる

C#では辞書型とは言わないみたいですね、まぁいっか。
まず,どういう時に使うのか？
例えば,keyがstring型,valueがint型であるとする
これは、何かのランキングを作る際などに使えるのではないだろうか.
月刊読書数ランキングを作成してみると,この手法でのソートは重宝する.
では、実際のコード.

```C#
// Linqを使うから忘れないように.
using System.Linq;
using System;

class sa
{
 public static void Main()
{
 // 個人名とその人の読書数の辞書があったとする.reading_booksとしておく.
 // これで値の小さい順のソートができる.xはラムダ式で,適当な変数である.
    var hoge = reading_books.OrderBy((x) => x.Value);

 // 同様に,大きい順でのソート.
    var hogehoge = reading_books.OrderByDescending((x) => x.Value);

// 実際の列挙(小さい順)

foreach(var tekito in hoge)
        {
            Console.WriteLine("key{0},value{1}",tekito.Key,tekito.Value);
        }

// 実際の列挙(大きい順)
foreach(var tekito in hogehoge)
        {
            Console.WriteLine("key{0},value{1}",tekito.Key,tekito.Value);
        }

}
}

```

はい,こんな感じで出来ます！
まぁ,割と簡単ですね♩
GooglePlayStoreの「地域」判定について

## GooglePlayStoreにおける「地域」とは
![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/210/aaf746b0-eb0d-90a1-07d5-e708e05d7d6c.png)
PlayStoreの下の方にある↑コレ
「地域」はアプリの価格通貨の判定に使われているみたい。

普通にブラウザからアクセスする場合は問題ないが、
プログラムからデータを取得したい時に「地域」がアメリカになってしまったので解決策を調べた。

## 「地域」を日本にするには
ヘッダーにUserAgentをつける。

```python
import requests

url = "hoge"
headers = {'User-Agent': 'fugahoge'} # UAはなんでもよい
page = requests.get(url, headers=headers)
```

正直どういう原理で「地域」を判定しているかははっきり分からないが、
UAがないとアメリカになることはわかったので解決。
この仕様がいつまで通用するか保証はないです。

### ちなみに「言語」は
クエリーパラメータに `hl=ja` をつけることで明確に「日本語」に設定することができる。
RでexportされていないS3メソッドの中身の確認方法

Rのパッケージの多くは、データを入力として受け取って、色々な処理をした結果を返してくれます。さらに、その結果をいい感じにプロットしてくれることが多いです。プロットがどう実装されているのか確認するには、exportされていないS3メソッドの中身を見る必要があります。

具体例として、機械学習関連のパッケージ`e1071`でのSVMのプロットをやってみます。

```
library(e1071)

# irisデータセットから、2ラベル、2特徴量を選ぶ
iris.part = subset(iris, Species != 'setosa')
iris.part$Species = factor(iris.part$Species)
iris.part = iris.part[, c(1,2,5)]

# SVMモデルをフィットさせる
fit = svm(Species ~ ., data=iris.part, type='C-classification', kernel='linear')

# 可視化
plot(fit, iris.part)
```
![svm.jpg](https://qiita-image-store.s3.amazonaws.com/0/35175/7832984f-5385-dd77-5c4b-1e32d2cd5f2a.jpeg)

このとき`plot`は中でどういう処理をしているのかを知るにはどうしたらいいでしょうか？知っておくべきことは、`plot`はジェネリック関数と呼ばれていて、引数として受け取った変数のクラスに対応するメソッドを実行しているということです。そこで変数`fit`のクラスをまず調べます:

```
> class(fit)
[1] "svm.formula" "svm"        
```

`fit`は`svm.formula`と`svm`のふたつのクラスに属していることが分かりました。次に、`plot`に含まれているメソッドの一覧を確認して、どちらのクラスに対応するメソッドが呼ばれているかを調べます:

```
>  methods("plot")
[1] plot.acf*           plot.bclust*        plot.data.frame*   
 [4] plot.decomposed.ts* plot.default        plot.dendrogram*   
 [7] plot.density*       plot.ecdf           plot.factor*       
[10] plot.formula*       plot.function       plot.hclust*       
[13] plot.histogram*     plot.HoltWinters*   plot.ica*          
[16] plot.isoreg*        plot.lm*            plot.medpolish*    
[19] plot.mlm*           plot.ppr*           plot.prcomp*       
[22] plot.princomp*      plot.profile.nls*   plot.raster*       
[25] plot.SOM*           plot.somgrid*       plot.spec*         
[28] plot.stepfun        plot.stft*          plot.stl*          
[31] plot.svm*           plot.table*         plot.ts            
[34] plot.tskernel*      plot.TukeyHSD*      plot.tune*         
see '?methods' for accessing help and source code
```

`plot.svm`だけ見つかったので、このメソッドが呼ばれていることが分かります。ここで`*`は、exportされていないことを示しています。そのため、次のように直接アクセスすることはできません:

```
> plot.svm
Error: object 'plot.svm' not found
```
このようなメソッドの中身を見るためには、`getAnywhere`関数を使います:

```
> getAnywhere("plot.svm")
A single object matching ‘plot.svm’ was found
It was found in the following places
  registered S3 method for plot from namespace e1071
  namespace:e1071
with value
# ...以下省略
```
あるいは`svm`クラスに対応した`plot`メソッドを見るというやりかたで`getS3method("plot","svm")`としても同様の結果が得られます。

追記:コメントで教えていただきました。
> e1071:::plot.svm といった具合にパッケージ名と関数名を ::: で区切るとその関数がエクスポートされているかどうかによらず、参照でき

ました！