OmniAICreator/Qiita-1.07M huggingface dataset:
Unreal Engine 4メモ：デリゲートをprivateで書く

デリゲートはコールバックの登録にとても便利なフィーチャで簡単に処理のフックを作れます。UIで使用することが多いです。

#なぜ非公開にするのか？
デリゲートを公開にしているクラスはUE4エンジン内にもありますが、これはマネしてはいけません。
なぜなら下記のとおりです。

```c++:BadSample.cpp
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FWindowDelegate);

UCLASS(Blueprintable)
class AT_API WindowClass : public UObject
{
	GENERATED_BODY()

public:
	FWindowDelegate OpenDelegate;
}
```
```c++:BadUseSample.cpp
WindowClass->OpenDelegate.AddDynamic(this, &UserClass::OnOpenWindow);
WindowClass->OpenDelegate.Broadcast(); // ???
```
外側からブロードキャストされると**とんでもない結果**になるのは目に見えています。

#ダイナミックマルチキャストデリゲート
ダイナミックマルチキャストデリゲートをprivateにしたいと思ったときにちょっと悩んだのでメモしました。

最初は間違えて下記のような使う側が面倒なもの書いてしまいました・・・。

```c++:NotGoodSample.cpp
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FWindowDelegate);

UCLASS(Blueprintable)
class AT_API WindowClass : public UObject
{
	GENERATED_BODY()

private:
	FWindowDelegate OpenDelegate;

public:
	template< class UserClass >
	void SetOnOpenDelegate(UserClass* InUserObject, typename FUserClassDelegate::FDelegate::template TMethodPtrResolver< UserClass >::FMethodPtr InMethodPtr, FName InFunctionName)
	{
		OpenDelegate.__Internal_AddDynamic(InUserObject, InMethodPtr, InFunctionName);
	}
}
```
```c++:NotGoodUseSample.cpp
WindowClass->SetOnWindowOpenDelegate(this, &UserClass::Function, STATIC_FUNCTION_FNAME(TEXT("&UserClass::Function")));
```

AddDynamicマクロを使えない悲しみ・・・。

---

本来は下記のような感じですね。

```c++:Sample.cpp
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FWindowDelegate);

UCLASS(Blueprintable)
class AT_API WindowClass : public UObject
{
	GENERATED_BODY()

private:
	FWindowDelegate OpenDelegate;

public:
	void SetOnOpenWindowDelegate(FWindowDelegate::FDelegate& openDelegate)
	{
		OpenDelegate.Add(openDelegate);
	}
}
```
```c++:UseSample.cpp
FWindowDelegate::FDelegate windowDelegate;
windowDelegate.BindDynamic(this, &UserClass::OnOpenWindow);
WindowClass->SetOnGameWindowCloseDelegate(windowDelegate);
```

##何？ラムダを使いたい？
それは下記のように書けます。

```c++:UseSample.cpp
FWindowDelegate::FDelegate windowDelegate;
windowDelegate= FWindowDelegate::FDelegate::CreateLambda([]() {
	// 処理
});
WindowClass->SetOnGameWindowCloseDelegate(windowDelegate);
```


#各種使用するクラスでは非公開にしたい。でも！BPにはデリゲートを公開にしたい！
こちらは、「ダイナミックマルチキャストデリゲート」しかBPに公開できません。

コードは下記のような感じです。

```c++:Sample.cpp
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FWindowDelegate);
UCLASS(Blueprintable)
class AT_API WindowClass : public UObject
{
	GENERATED_BODY()
private:
	UPROPERTY(BlueprintAssignable, Category = "UI")
	FWindowDelegate OpenDelegate;
public:
	void SetOnOpenWindowDelegate(FWindowDelegate::FDelegate& openDelegate)
	{
		OpenDelegate.Add(openDelegate);
	}
}
```

#その他
デリゲートに空関数を入れると最適化されて何も入っていない状態になる

```c++:empty_function_test.cpp
DECLARE_DELEGATE(FTestDelegate);

void test()
{
	FTestDelegate TestDelegate;
	TestDelegate = FTestDelegate::CreateLambda([this]() {
		// 空にした場合
	});

	if (TestDelegate.IsBound())
	{
		// ここには来ない
	}
	else
	{
		// ここに来てしまう
	}
}
```
Service AccountでGoogle Play Developer APIを使えるようにする


Google Play Storeのコンソールから`Settings->API Access`を開き、`CREATE NEW PROJECT`をクリックする。

<img width="290" alt="Screenshot_2018-04-19_19_51_34.png" src="https://qiita-image-store.s3.amazonaws.com/0/469/87a4d250-be0a-fcaa-131e-e9a8db941361.png">
<img width="1079" alt="Screenshot_2018-04-19_19_52_16.png" src="https://qiita-image-store.s3.amazonaws.com/0/469/6377534c-52c4-20a2-6cdc-4ffc4f10960d.png">

少し待つと以下のような画面が表示されるので、Service Accountのセクションにある`CREATE SERVICE ACCOUNT`ボタンをクリック。Create Service Accountダイアログが開く。
<img width="785" alt="Screenshot_2018-04-19_19_53_33-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/469/94941d66-9ca2-c629-ebe1-d5f015052b57.png">

ダイアログ内の`Google API Console`へのリンクをクリックする。

<img width="603" alt="Screenshot_2018-04-19_19_53_55.png" src="https://qiita-image-store.s3.amazonaws.com/0/469/64015203-08fb-f6b9-30f3-b340846ecde6.png">

Google API Consoleが別画面で開く。画面内の`Create service account`ボタンをクリックする。

<img width="912" alt="Screenshot_2018-04-19_19_56_16.png" src="https://qiita-image-store.s3.amazonaws.com/0/469/e1272bc9-79a8-9559-b8c2-6e038de47258.png">

Service account作成ダイアログが表示される。
<img width="510" alt="Screenshot_2018-04-19_19_58_36.png" src="https://qiita-image-store.s3.amazonaws.com/0/469/9b44363f-f597-f68a-6b80-94c5066d2639.png">

任意のアカウント名を入力し、Roleで`Service Accounts->Service Account User`を選択する。

<img width="552" alt="Screenshot_2018-04-19_19_59_58.png" src="https://qiita-image-store.s3.amazonaws.com/0/469/21de4c1e-19ef-5365-5fbb-40783d86aa3d.png">

`Furnish a new private key`にチェックを入れ、Key typeは`p12`をチェック。
<img width="506" alt="Screenshot_2018-04-19_19_59_30.png" src="https://qiita-image-store.s3.amazonaws.com/0/469/64977668-f983-f181-3705-0f827cb413f8.png">

これでService accountが作成された。
<img width="505" alt="Screenshot_2018-04-19_20_00_37.png" src="https://qiita-image-store.s3.amazonaws.com/0/469/32a600dd-31d7-d1ca-d977-d4003c96b118.png">

Google Play Consoleに戻るとService Accountのところに今作ったService Accountが表示されているので、このService AccountにPermissionを付加する。

`Grant Access`ボタンをクリック。
<img width="774" alt="Screenshot_2018-04-19_20_01_04.png" src="https://qiita-image-store.s3.amazonaws.com/0/469/a79ac26d-21df-7ca9-4096-4fb4f4e12142.png">

Roleはデフォルトで`Release manager`になっていて、その他のpermissionもデフォルトでOK.`Manage alpha & beta releases`などにチェックが入っていることを確認し、`ADD USER`をクリック。

<img width="786" alt="Screenshot_2018-04-19_20_02_33.png" src="https://qiita-image-store.s3.amazonaws.com/0/469/1a6c05ec-fb49-adb5-ae72-bfef067d9eda.png">
<img width="785" alt="Screenshot_2018-04-19_20_46_14.png" src="https://qiita-image-store.s3.amazonaws.com/0/469/81b290d2-fb2e-659f-239c-a594b9c4b78e.png">

以下のように、Service AccountがDeveloper accountに追加される。

<img width="1060" alt="Screenshot_2018-04-19_20_04_19.png" src="https://qiita-image-store.s3.amazonaws.com/0/469/a517ea3f-6f33-097c-55fa-5fb91b9d95ad.png">

これでService AccountでGoogle Play Developer APIを使う準備は完了。
Save と Done の違い


SaveはSaveを押さなかったら何も保存されない。

Doneはスクリーン上の設定を変更すると即座に設定値が保存されるようなスクリーンで、スクリーンを明示的に閉じる為に使われる。
Doneをタップしたから保存されるわけではない。

https://www.quora.com/What-is-the-difference-if-any-between-Save-and-Done-for-UX-button-labeling
Dartでenumの列挙子名をStringで取得する方法


列挙子名を取得する関数などは見つかりませんでした。

`toString`を使うと `<型名>.<列挙子名>` が取得できるので、`<型名>.`を置換して空文字にすることで列挙子名を得ることができます。

```dart
enum Status {
  ok,ng
}

void main() {
  Status status = Status.ok;
  print(status.toString()); // Status.ok
  print(status.toString().replaceFirst(status.toString().split('.')[0] + "." , "" )); // ok
}
```
Qiita初回投稿

#注意事項
Qiitaに投稿（公開）を1件もしていないと、
画像アップロードの上限値が2MBまでです。

プレビュー時に画像をアップし、プレビュー後、
画像を削除してもカウントされているので注意です。
『送信』容量の上限値が2MBです。

#対策
1件でも投稿（公開）すると、上限値が100MBになります。
logbackのSMTPAppenderでERRORレベルのログ発生時にメール送信


# やること
## FakeSMTPのインストール

[FakeSMTP &#x2013; FakeSMTP - Dummy SMTP server for developers](http://nilhcem.com/FakeSMTP/)

開発用のダミーSMTPサーバをインストールして起動しておく。

## pom.xml
```xml:pom.xml
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.1.RELEASE</version>
	</parent>

	<dependencies>
		<dependency>
			<groupId>javax.mail</groupId>
			<artifactId>mail</artifactId>
			<version>1.4.7</version>
		</dependency>
	</dependencies>
```

## logback.xml

[logback ドキュメント 第4章 アペンダー#SMTPAppender](https://logback.qos.ch/manual/appenders_ja.html#SMTPAppender)を参考に```logback.xml```を編集する。

```xml:src\main\resources\logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
	<include resource="org/springframework/boot/logging/logback/base.xml" />

	<appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
		<filter class="ch.qos.logback.classic.filter.LevelFilter">
			<level>ERROR</level>
			<onMatch>ACCEPT</onMatch>
			<onMismatch>DENY</onMismatch>
		</filter>
		<smtpHost>localhost</smtpHost>
		<smtpPort>25</smtpPort>
		<to>hoge@hoge.com</to>
		<to>foo@foo.com</to>
		<from>sender@hoge.com</from>
		<subject>TESTING: %logger{20} - %m</subject>
		<layout class="ch.qos.logback.classic.PatternLayout">
			<pattern>%date %-5level %logger{35} - %message%n</pattern>
		</layout>
		<STARTTLS>true</STARTTLS>
		<asynchronousSending>false</asynchronousSending><!-- 後述 -->
	</appender>

	<root level="DEBUG">
		<appender-ref ref="EMAIL" />
	</root>
</configuration>
```

<code>asynchronousSending=false</code>については後述。

## 動作確認用のサンプルプコード
適当な<code>spring-boot</code>アプリケーションを作る。

```java:HogeApplication.java
package kagamihoge.logmailsend;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HogeApplication implements CommandLineRunner {
	public static void main(String[] args) {
		SpringApplication.run(HogeApplication.class, args).close();
	}

	Logger logger = LoggerFactory.getLogger(HogeApplication.class);

	@Override
	public void run(String... args) throws Exception {
		logger.info("debug");
		logger.info("info");
		logger.error("error");
		logger.error("error with exception", new NullPointerException());
	}
}
```

## 実行の様子
![logback-smtp.jpg](https://qiita-image-store.s3.amazonaws.com/0/31934/41493b10-413d-c530-70e8-9a6de456d04f.jpeg)

## asynchronousSending=falseについて
動作確認用のサンプルプコードはmainを起動してすぐ終了するので、logbackがメール送信するよりも先にmainが終了してしまう。そのため、非同期送信モードをfalseにしないとメール送信が行われない。
TypeScriptで引数がないメソッドをオーバーライドしてオーバーロードする方法

#やりたいこと
親クラスで定義した引数のないメソッドを引数を渡すことの出来るメソッドにオーバーライドしてオーバーロードしたい。
調べるのに結構時間がかかってしまったのでメモ。

#オーバーライド、オーバーロードとは?
+ オーバーライド  
親クラスで定義したメソッドを親クラスを継承した子クラスのメソッドで処理を変えて上書きできる。  

```override.ts
//親クラス
class Base {
    public method(): void {
       console.log("Hello World");
    }
}

//子クラス
class Child extends Base {
    public method(): void {
       //親クラスと同じ名前のメソッドの処理を上書きすることが出来る。
       console.log("GoodBye World");
    }
}
```
+ オーバーロード  
引数や返り値の違う同名のメソッドを定義できる

```overload.ts

class ClassA {
    //オーバーロードする関数を宣言する
    public method(args1: string): void;
    public method(args1: number): void;

    //オーバーロードした関数の実装を書く
    public method(args1: any): void {
       if(typeof args1 === "string") {
           //引数にstring型を渡したときの処理を書く
       } else if (typeof args1 === "number") {
           //引数にnumber型を渡したときの処理を書く
       } else {
           //args1がstring型でもnumber型でもないときの処理
       }
    }
}

```  
# 引数のないメソッドをオーバーライドしてオーバーロードする
引数の型が違うメソッドをオーバーライドしてオーバーロードする方法は[こちらのページ](https://qiita.com/ConquestArrow/items/960d0e3a25fca4897787)に書いてあったが、引数なしのメソッドをオーバーライドしてオーバーロードする方法がわからなかった。

最初はオーバーロード宣言をしてそのままオーバーライドして実装してみたがコンパイルエラーが出た。

```ts:そのままオーバーロード宣言をしてオーバーライドする
class Base {
	public method(): void{
		//処理
	}	
}

class Child extends Base{
	public method(args1: string, args2: number): void;
	public method(): void;//error: オーバーロドシグネチャは関数の実装に対応していません。
	
	public method(args1: string, args2: string): void{
		//処理
	}	
}
```

[このサイト](https://docs.solab.jp/typescript/function/overload/)によると引数の数を変えてオーバーロードするときは実装するメソッドの引数をオプション引数に指定してあげる必要があるらしい。

```ts:実装するメソッドの引数をオプション引数にする
class Base {
	public method(): void{
		//処理
	}	
}

class Child extends Base{
	public method(args1: string, args2: number): void;
	public method(): void;
	
	public method(args1?: string, args2?: string): void{//オプション引数を指定
		//処理
	}	
}

```

#参考サイト
+ [TypeScriptで型の異なるメソッドをオーバーライドする](https://qiita.com/ConquestArrow/items/960d0e3a25fca4897787)
+ [TypeScript プログラミング](https://docs.solab.jp/typescript/function/overload/)
Devise 4.1.0 から本人確認メールの送信タイミングが変わった

ユーザー登録して、本人確認メール（confirmation instructions e-mail）が送信されるテストを書いていて。

これまではたしかに `ActionMailer::Base.deliveries` にメールが入っていたんだけど、Devise のバージョンを上げてから、テストがこけるようになったので調べた。

## 原因

原因は下記の Devise の CHANGELOG に書いているとおり。

* https://github.com/plataformatec/devise/blob/master/CHANGELOG.md#410

要は、本人確認メールを送信するタイミングを変更したとのこと。

* 4.1.0 より前: `after_create` のコールバック
* 4.1.0 以降: `after_commit` のコールバック
  * https://github.com/plataformatec/devise/blob/v4.1.0/lib/devise/models/confirmable.rb#L48

これによって、テストの設定を `use_transactional_fixtures = true` にしていたりとか、`DatabaseCleaner` を transaction strategy で利用していたりすると影響が出る。

## 対応

* https://github.com/plataformatec/devise/blob/master/CHANGELOG.md#410 のとおり `test_after_commit` を使う、でよさそう。
LaravelでVue.jsでプラグインを使ったときのあれこれ

# Laravelは続くよどこまでも。
未だに要件追加とか改修とか、Laravelで頑張ってる人です。

## プラグイン入れたい
検索とか、コンボボックスでいいプラグインだった
[SELECT2](https://select2.org/)
使いたいんすってなってインストールした時のメモ。

## 環境
Mac
Laravel Framework 5.5.32
npm 5.8.0
Vue.js

### インストールしてみよう。
とりあえずプロジェクトのディレクトリで
`npm install select2`
って打ってみる。
すると、
package-lock.json
package.json
にSELECT2が追加されたのが確認できる。

``` package-lock.json
"select2": {
  "version": "4.0.6-rc.1",
  "resolved": "https://registry.npmjs.org/select2/-/select2-4.0.6-rc.1.tgz",
  "integrity": "sha1-qmwwOKfw8ukf+t448KIcFeGBMnY=",
  "requires": {
    "almond": "0.3.3",
    "jquery-mousewheel": "3.1.13"
  }
},
 ```

``` package.json
"select2": "^4.0.6-rc.1",
 ```
上みたいな感じ。
で、ここから**組み込んで**いくよ。

` resources/assets/js/ `
の中にある組み込みしたいところのファイルに

``` sample.js
require('select2');
```
上のようにSELECT2を使ってくださいと書いておきます。
それから
` resources/assets/sass/ `
の組み込みしたいところのファイルのSCSSにも

``` sample.scss
@import "node_modules/select2/src/scss/core";
```
とSELECT2の記述を追加します。

で、組み込みたいbladeに

``` sample.blade.php
<script>
    jQuery(function($){
        $("select").select2();
    });
</script>
```
スクリプトを書き足す。
で、完了。
だけど、jQueryのバージョンが他のプラグインと喧嘩したりするから私は困った。
読み込み順序って大切だと思い知らされた感。

### とりあえず仕組みを理解した
のでよしとする。

# ここ最近
好きなアマゾンプライムビデオは内村さまぁ〜ずです。
Redmine Rest API (Search API)の使い方

# Redmine Rest APIのsearch APIの使い方

公式Wikiがまだドキュメント化されていないので、まとめておくことにしました。
公式Wiki URL: http://www.redmine.org/projects/redmine/wiki/Rest_Search

## HTTPメソッド

```
GET /search
```

## 説明

RedmineのチケットやWiki、更新履歴などから検索語句を検索し、結果を取得する。

## パラメータ

| 名前 | 説明 | 指定値 | 省略（省略値） | 例 |
|:---:|:---:|:-----:|:-----:| :--: |
| q | 検索語句 | String | 可（''） | q=query_string |
| all_words | 検索対象：全ての単語かどうか（1:全ての単語） | 0 or 1| 可（0） | all_words=1|
| titles_only | 検索対象：タイトルのみかどうか（１：タイトルのみ）| 0 or 1| 可（0） | titles_only=1 |
|attachments| 検索対象：添付ファイルを含むかどうか（１：含む） | 0 or 1 | 可（0） | attachments=1 |
|options| 検索対象： | 0 or 1| 可（0） | options=1 |
|open_issues| 検索対象：未終了チケットのみか（1:未終了チケットのみ） | 0 or 1| 可(0) | open_issues=1 |
| scope | 検索対象の範囲 | 'all' or 'my_projects' or 'subprojects' or '' | 可（''） | scope= |

### パラメータ指定例

```
search?q=test&all_words=1&titles_only=1&attachments=1&options=1&open_issues=1&scope=
```

## レスポンス


### 200
```
{
  "results":
    "total_count": integer,
    "offset": integer,
    "limit": integer,
    "type" :,
    "result": 
      [
        {
          "id" : integer
          "title" : String
          "type" : String
          "url" : String
          "description" : String
          "datetime" : String
        },
      ]
}
```
|
Androidアプリのプロセスの状態(フォアグラウンド、バックグラウンド、未起動)を調べる方法

# 概要

Androidアプリのプロセスの状態(フォアグラウンド、バックグラウンド、未起動)を調べる方法が検索しても見つからなかったので、自分で実装してみました。

## 考えられる用途
- Push通知からアプリを起動する場合に、アプリが未起動の時とそうでない時で起動するアクティビティを変更する。

# ソースコード

```AppProcessStatus.kt
import android.app.ActivityManager
import android.content.Context
import android.os.Build

/**
 * アプリのプロセスの状態
 */
enum class AppProcessStatus {
    /** 最前面で起動中 */
    FOREGROUND,
    /** バックグラウンド状態 */
    BACKGROUND,
    /** プロセスが存在しない */
    GONE;

    companion object {
        /** 現在のアプリのプロセスの状態を取得する */
        fun current(context: Context): AppProcessStatus {
            if (!existsAppTask(context)) return GONE
            if (isForeground(context)) return FOREGROUND
            return BACKGROUND
        }

        private fun isForeground(context: Context): Boolean {
            val am = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
            val runningProcesses = am.runningAppProcesses
            for (processInfo in runningProcesses) {
                for (activeProcess in processInfo.pkgList) {
                    if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                        return true
                    }
                }
            }
            return false
        }

        private fun existsAppTask(context: Context): Boolean {
            val am = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                return am.appTasks.count() > 0
            }
            val recentTasks = am.getRunningTasks(Integer.MAX_VALUE)
            for (i in recentTasks.indices) {
                if (recentTasks[i].baseActivity.packageName == context.packageName) {
                    return true
                }
            }
            return false
        }
    }
}
```

注意: APIレベル21未満でも動作させるため、非推奨メソッドの`ActivityManager.getRunningTasks`を使用しています。このメソッドを使うには非推奨パーミッションの`GET_TASKS`をAndroidManifest.xmlに追加する必要があります。

```AndroidManifest.xml
<uses-permission android:name="android.permission.GET_TASKS" />
```

# 参考

- [[Android] 自分のアプリをフォアグラウンド(前面)に移動させる](http://stren-blog.seesaa.net/article/435048614.html)
- [ActivityManager.getRunningTasks is deprecated android
](https://stackoverflow.com/a/35423996/4791194)
[AWS] 特定日付以前に作成されたスナップショットの一覧を取得する

jq 使おう

```bash
REGION='ap-northeast-1'
OWNER_ID=$(aws sts get-caller-identity | jq -r '.Account')
TARGET_DATE=$(date -u -d '-2 day' +%s) # 2日前をターゲットに

SNAPSHOT_IDS=$(aws ec2 --region ${REGION} describe-snapshots --owner-ids ${OWNER_ID} \
 | sed 's/\.000Z/Z/' \
 | jq ".Snapshots | sort_by(.StartTime) | .[]" \
 | jq "select (.StartTime | .== null or fromdateiso8601 <= ${TARGET_DATE})" \
 | jq -r '.SnapshotId')
```

あとは、これを回して消したりなんだり

```bash
for SNAPSHOT_ID in ${SNAPSHOT_IDS}; do
    SNAPSHOT=$(aws --region ${REGION} ec2 describe-snapshots --snapshot-id ${SNAPSHOT_ID} | jq '.Snapshots[]')
    DESCRIPTION=$(echo ${SNAPSHOT} | jq -r '.Description' | head -n 1)
    # Description に hogefuga が含まれる場合だけ処理
    if [[ $DESCRIPTION =~ hogefuga ]]; then
        STARTTIME=$(echo ${SNAPSHOT} | jq -r '.StartTime' | head -n 1)
        echo "Start ec2-delete-snapshot : ${SNAPSHOT_ID}[${STARTTIME}]: ${DESCRIPTION}"
        aws --region ${REGION} ec2 delete-snapshot --snapshot-id ${SNAPSHOT_ID}
        if [ $? != 0 ] ; then
            echo "Error ec2-delete-snapshot: ${SNAPSHOT_ID}"
            exit 1
        else
            echo "Success ec2-delete-snapshot : ${SNAPSHOT_ID}"
        fi
    fi
done
```
lispでhtmlとかjavascriptを生成してみる 1回目

htmlファイル書き込みのcommon lispプログラム

環境
mac OS 10.12.6
SBCL 1.4.1

```common-lisp:hello.lisp
(let ((out (open "./hello.html" :direction :output :if-exists :supersede)))
  (write-string
"<!DOCTYPE html>
<html lang=\"ja\">
<head>
  <meta charset=\"utf-8\">
  <title>JavaScriptの練習</title>
</head>
<body>
</body>
</html>"
  out)
   (close out))
```

2回目があるか分からんけどとりあえず書いてみた

参考
http://d.hatena.ne.jp/patterson/20080902/1228660192
http://www.geocities.jp/m_hiroi/xyzzy_lisp/abclisp07.html
TypeScriptで匿名クラス・内部クラス

匿名クラス（Anonymous class）のオブジェクトは以下のように作成できる。

```anon.ts
class Base {
    public static create() {
        return new class extends Base {
            constructor() {
                super("XXX");
            }
        }();
    }

    constructor(private value: string) {
    }
    public methodA() {
        console.log("A" + this.value);
    }
}

const v = Base.create();
v.methodA();

```

内部クラス（Inner class）は以下のように

```inner.ts
class Base {
    public static Inner = class extends Base {
        public method() {
            return 1;
        }
    };
}
```
Pythonのリモートデバッグ (Visual Studio Code編)

VSCode使って、リモートサーバ上で動作するスクリプトに対してRemote Debugを実施する手順。
過去に `ptvsd` のバージョン依存などでハマったのでメモも兼ねて。

## 事前準備

### Pythonライブラリ

[ptvsd](https://pypi.python.org/pypi/ptvsd) をインストールすればよいが、バージョン `3.0.0` でないと、VSCode上でうまく動作しない様子。( [このissue](https://github.com/Microsoft/vscode-python/issues/133) を参照 )

`pip install ptvsd==3.0.0` のように、明示的にバージョンを指定してインストールしておく。

### VSCodeのTask設定

ワークスペースの `launch.json` に、以下のようなエントリを追加しておく。

```json
        {
            "name": "Python: Attach",
            "type": "python",
            "request": "attach",
            "localRoot": "${workspaceFolder}",
            "remoteRoot": "/path/to/remote/workspace",
            "port": 3000,
            "secret": "xxx",
            "host": "xxx.xxx.xxx"
        },
```

### 実行対象のスクリプト

スクリプトの先頭に以下の文を仕込む。
リモートサーバ上でスクリプトを実行すると、`ptvsd.wait_for_attach()` の行でデバッガの接続を待機するようになる。

```python
import ptvsd
ptvsd.enable_attach(secret='hoge', address=('0.0.0.0', 3000))
ptvsd.wait_for_attach()
```

## デバッグの実行

`Ctrl` + `Shift` + `D` 又はサイドバーからデバッグ画面を開き、プルダウンメニューから `launch.json` で設定した構成名を選択する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/58399/155be07c-3aa0-3e79-08d1-93ca97f92b38.png)

F5キーまたはデバッグ開始ボタンを押すと、`launch.json` で指定した接続先の待機中プロセスにattachされる。
あとは、ローカル実行時と同様に操作が可能。
【初心者】大量の日別syslogファイルを自動成型するシェルスクリプト

　
データ分析で利用するために、syslogのカラム配列を特定の形式に変換する場面があるかと思います。
大量のsyslogファイルを変換させる場合、いちいちコマンドを打って出力させるのは大変です。
シェルスクリプトを作成して自動処理させましょう。

#前提条件
syslogファイルは日毎で分かれており、
ファイル名には該当する日にちが記されているものとする。
`※ 2018年2月1日のものであれば→「syslog_180201.log」`

例えばsyslogファイルからawkを用いて、5カラム目が「*versions*」という文字列がある行、
1,2,3,8,9カラム目だけを抽出し、
`versions_xxxxxx.log`というファイル名でoutputする場合、


```
cat syslog_180201.log | awk '$5~/versions/{print $1,$2,$3,$8,$9}' > versions_180201.log
```

というコマンドを打つ必要がある。（上記コマンドで2月1日の分は完成!!）
　

しかし、今回は2018年2月1日〜2018年3月31日まで（59日なので59ファイル分）を上記のように処理したい。
いちいち手打ちで180202、180203…と入力していくのは面倒ですね。

#考え方
```
入力データ：syslog_xxxxxx.log
出力データ：versions_xxxxxx.log
```
の日にちを表す文字列"xxxxxx"は入力/出力ともに同じであるので変数（今回は`${DATE}`）にし、

```
cat syslog_${DATE}.log | awk '$5~/versions/{print $1,$2,$3,$8,$9}' > versions_${DATE}.log
```

この`${DATE}`を180201からカウントアップし、180331までうまくループさせればいい。
（複雑なのは、180228→180301への方法かと思います）

#シェルスクリプト作成
`test.sh`を作成します。

```
vi test.sh
```


```ruby:test.sh
#!/bin/sh

MONTH=2
DAY=1

until [ ${MONTH} -eq 4 ]
do
if [ ${MONTH} -eq 2 ]
then
	END=29
else
	END=32
fi

	until [ ${DAY} -eq ${END} ]
	do
	if [ ${DAY} -lt 10 ]
	then
		DATE=180${MONTH}0${DAY}
	else
		DATE=180${MONTH}${DAY}
	fi

	cat syslog_${DATE}.log | awk '$5~/versions/{print $1,$2,$3,$8,$9}' > versions_${DATE}.log

	DAY=`expr ${DAY} + 1`
	done
DAY=1
MONTH=`expr ${MONTH} + 1`
done
```
 
　

test.shを実行します。

```
sh test.sh
```

#解説

変数は４つ

```
MONTH
DAY
END
DATE
```
MONTH:月　DAY：日を表す変数で、
変数DATEに代入させます。
このときDAYが10以上であればDATEは`180${MONTH}${DAY}`ですが、
DAYが10未満の場合は`180${MONTH}0${DAY}`にする必要があります。
その分岐を果たしているのが以下となります。↓


```
	if [ ${DAY} -lt 10 ]
	then
		DATE=180${MONTH}0${DAY}
	else
		DATE=180${MONTH}${DAY}
	fi
```

1回の処理が終わる毎に、DAYは数値が1つずつ加算されます。↓

```
DAY=`expr ${DAY} + 1`
```

DAYの加算はどこかのタイミングで止めなければなりません
（そうでないと、2月が∞日続きます）。
2018年の2月は28日まで、3月は31日までしかないので、そのタイミングで止めます。
これを果たしているのがuntilとEND変数です。（-eq　はイコールという意味）↓

```
    until [ ${DAY} -eq ${END} ]
```

今回はループにuntil（[ ]の中の条件満たしたら、ループから抜ける）を使用しているので、
2月はDAY=29、3月はDAY=32になったらループ処理を止めます。
この分岐を果たしているのが以下となります。↓

```
if [ ${MONTH} -eq 2 ]
then
    END=29
else
    END=32
fi
```

DAYがENDまで達したらループから抜け、
DAY=1となり、MONTHの数値が1つ加算されます。↓

```
DAY=1
MONTH=`expr ${MONTH} + 1`
```

これによって、DATEが180228→180301へと変遷します。
180331の処理が終わると、DAY=32=ENDとなるので、
DAY=1となり、MONTHの数値が1つ加算され、MONTH=4となります。
今回は2月1日〜3月31日までの処理なので、ここでベースとなるuntilループから抜けます。↓

```
until [ ${MONTH} -eq 4 ]
```

#終わりに
初めての投稿なので、なかなか綺麗に説明できていない気がします。
いつかブラッシュアップできたらいいなと思います。
ポインタのメモ


ポインタ変数

- アドレスを記憶する変数
- 変数のショートカットとして使われる


## 変数宣言、アドレス代入

```c
#include <stdio.h>

int main(void){
    // ポインタ変数の宣言
    int *p;
    int i;

    // 変数iのアドレスを代入
    // &: アドレスを求める演算子
    p = &i;

    // %p: ポインタを文字列に変換する出力変換指定子
    printf("p = %p\n",p);
    printf("&i = %p\n",&i); // iじゃない、iは通常変数
    if(p == &i){
        printf("アドレスが一致\n");
    }

    return 0;
}
```


## ヌルポインタ

```c
#include <stdio.h>

int main(void){
    int *p = NULL;
    int i;

    if(p == NULL){
        printf("ぬるぽ\n"); // 出力される
    }

    p = &i;

    if(p == NULL){
        printf("ぬるぽ\n"); // 出力されない
    }

    return 0;
}
```


## 間接参照演算子

```c
#include <stdio.h>

int main(void){
    int *p;
    int i;
    p = &i;

    // 間接参照演算子（ポインタ変数を宣言するときの*とは別物）
    // 通常変数モードに切り替え、値を代入
    *p = 10;
    printf("*p = %d\n",*p);

    return 0;
}
```



## 配列

```c
#include <stdio.h>

int main(void){
    int *data;
    int ary[] = {1,2,3,4,5,6,7,8,9,10};
    // ポインタ変数に配列のアドレスを代入
    data = ary;

    for(int i = 0; i < sizeof(ary) / sizeof(ary[0]); i++){
        // ポインタ変数を配列のように使える
        printf("%d\n", data[i]);
        // ポインタ演算（わかりにくいから使わないほうがいい？)
        // ポインタ変数の中のアドレスを1つ増やしている
        printf("%d\n", *(data + i));
    }

    return 0;
}
```




> 参照
[ 苦しんで覚えるＣ言語 ポインタ変数の仕組み](https://9cguide.appspot.com/15-05.html)
GithubのPRにWerckerのBotが出なくなった件

## 始まり

<img width="718" alt="螢幕快照 2018-04-19 18.32.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/251920/2c98aa9d-3002-4e30-741b-1f81bbb29980.png">

昔からずっとあったBotが、ある日突然なくなりました。
Werckerを確認したら、Testはちゃんと動いてますけど、PRには反映されてません。


## 中盤

色々調べて見ましたら、原因はこちらです。

![螢幕快照 2018-04-19 17.16.09.png](https://qiita-image-store.s3.amazonaws.com/0/251920/b8fe6cda-2e65-3501-ac6a-1fcf669c1bff.png)

つまり、権限が足りないです。 щ(´□｀)щ ｵｰﾏｲｶﾞｰｯ!!


## 終わり

確認したら、GithubのRepositoryの中には `Teams` で入られてます。
`Collaborators` にも自分を入れましたら、うまく解決できました。

![螢幕快照 2018-04-19 17.15.27.png](https://qiita-image-store.s3.amazonaws.com/0/251920/4ce06d9e-1b6f-9057-d0d1-af839afe5cab.png)

ヾ(´ー｀)ﾉ｡
LaravelのDB作成〜テストデータ投入までのざっくりした流れ

個人用メモも兼ねた備忘録。
あとでもう少し説明足します。

## 概要
1. Migrationファイル作成
2. model作成
3. Factory作成
4. Seeder作成
5. Seeder実行

## 1.Migrationファイル作る
DBのテーブル定義を記述

```
# migrationファイルを作成
$ php artisan make:migration {table_name}

# migration実行
$ php artisan migrate

# ロールバックしたい時
$ php artisan migrate:rollback
```

## 2.モデルを作る
```
$ php artisan make:model {ModelName}
```

## 3.Factory作成
後々テストデータ投入をしやすくするために、Factoryを作っておく。

```
$ php artisan make:factory {FactoryName}
```

## 4.Seeder作成

```
$ php artisan make:seeder {SeederName}
```
上記コマンドを実行すると、`database/seeds/{SeederName}.php`が作成されるので処理を記述。


## 5. Seeder実行
`database/seeds/DatabaseSeeder.php`に処理を記述。

```
$ php artisan db:seed
```
Kubernetesで消えないPodを強制的に削除する

まれにPodが消えてくれないことがあります。その場合`--grace-period`と`--force`オプションを使い強制的に削除することができます。

```bash
kubectl delete pods {$pod_name} --grace-period=0 --force
```

`pods`は`pod`でも可。

## 参考

* [Force Delete StatefulSet Pods](https://kubernetes.io/docs/tasks/run-application/force-delete-stateful-set-pod/)
ONUとルータがくっついてるやつをどうにかする

# はじめに
先日引っ越した時にISPとしてnuro光を選んだところ、[HG8045Q](https://thesaibase.com/net/nuro-f660a-hg8045q)というONUを設置してもらいました。
設置直後からいきなり「こ、この辺WiFiが飛んでやがるっ」ってなって驚いて機器を調べたところONUとルータ（無線機能付き）がニコイチになった機器でした。
auひかりとかも同じような製品がくるっぽいです。

# 困ったこと
このニコイチ機器、困ったことにルータ機能をオフれません。
この世の大半の人であればルータを用意する手間が省けるのできっとうれしいんですけど、僕には余計なお世話でした。
~~RTX830買っちまった手前、お金が無駄になるから~~L2TP/IPsecでVPN接続できるルータじゃないと、OSXからVPN接続できないので、自前のルータでルーティングしたかったのです。
単純にルータをつなげてもあたりまえですが、2重ルータになってしまい、僕のRTX830のルータ機能は使えません。

# ひっぺがす
ひっぺがすというより横流しです。
「送受信のパケットを全てHG8045Q（以降ルータA）のDMZを介してRTX830（以降ルータB）へ転送する」を設定します。

# やりかた
必要な情報として、あらかじめ下記を確認しておく。
- ルータBのwan側MACアドレス


### ルータAの設定
1. DHCPで転送先のIPがルータBに固定されるようにDHCPの設定を行う。ルータBのMACアドレスを使ってIP割り当てを固定化。
2. 固定したIPでDMZ転送設定を行う。

### ルータBの設定
1. インターネット接続設定でIP自動取得にする
Mysql レプリケーション【マスタースレーブ設定】

# レプリケーションとは
- レプリケーションとはデータを複製(レプリカ)して別サーバで保持する機能。
- レプリケーションの方法としては、マスタースレーブ構成、双方向レプリケーションなどがある。

# マスタースレーブ構成とは
 マスター(単一)サーバーと、スレーブ(単一または複数)サーバーで構成されている
## マスター
- データを参照・更新できる
- 更新内容をスレーブに転送する
- マスターは複数のスレーブを持てる

## スレーブ
- データを参照できる(更新しない)
- スレーブは1つのマスターのみ持てる

# マスタースレーブ設定方法

## マスター側の設定

- my.cnfの編集 例： etc/my.cnf
 
```conf:my.cnf
# Replication設定
server-id     = 1
log-bin       = mysql-bin
```
- ファイル編集後にmysqlを再起動する

```
# service mysqld restart
```

- レプリケーション用ユーザ作成

```sql:
# mysql -u root -p
--ユーザ作成 ユーザ名: repl パスワード：repl
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'xxx.xxx.xxx.xxx' IDENTIFIED BY 'repl'

--ユーザ確認
mysql> SELECT user, host FROM mysql.user WHERE user = 'repl';

```

- マスターDBのダンプファイル作成

```
# mysql -u root -p

// マスター側のステータス確認(ログファイル名とポジション)
mysql> SHOW MASTER STATUS \G;
        File: mysql-bin.000030
    Position: 4421

// mysqlをexitしてmysqldumpコマンドを実行
# mysqldump -u root -p \
  --all-databases \
  --events \
  --single-transaction \
  --flush-logs \
  --master-data=2 \
  --hex-blob \
  --default-character-set=utf8 > master_db.sql

// ダンプファイルをスレーブサーバーにコピーする
# scp master_db.sql root@xxx.xxx.xxx.xxx;
   
```

## スレーブ側の設定
- my.cnfファイルの編集 例： etc/my.cnf

```conf:my.cnf
# Replication設定
server-id     = 2
log-bin       = mysql-bin
read_only

```
- ファイル編集後にmysqlを再起動する

```
# service mysqld restart
```

- マスターDBのダンプの読込み

```
# mysql -u root -p < master_db.sql
```
- レプリケーション設定

```sql:
# mysql -u root -p
mysql> CHANGE MASTER TO
         MASTER_HOST='XXX.XXX.XXX.XXX', --マスターのIPアドレス
         MASTER_PORT=3306,              --マスターのポート番号
         MASTER_USER='repl',            --マスター側で作成したレプリケーション用ユーザ名
         MASTER_PASSWORD='repl'         --レプリケーション用ユーザのパスワード
         MASTER_LOG_FILE='mysql-bin.000030'  --上記で調べたマスター側のバイナリログファイル名
         MASTER_LOG_POS=4421;                --上記で調べたマスター側のバイナリログの開始位置

```

## レプリケーションの開始
```sql:
--スレーブ側で以下を実行
mysql> START SLAVE;
```

## レプリケーションの確認
```sql:
--スレーブ側で以下を実行
mysql> SHOW SLAVE STATUS \G

-- 以下の項目が「Yes」ならスレーブ状態になっている
      Slave_IO_Running: Yes
     Slave_SQL_Running: Yes

```
Flutterを始める気持ちになったときに見始めるページ集

他にも見ておくと知っとくといいよってページがあれば教えてくださるとうれしいですmm

#公式
Flutterのドキュメントは豊富な印象があります。

[Flutter - Beautiful native apps in record time](https://flutter.io/)
導入からDevTool周りの説明、[Flutter for Android Developers](https://flutter.io/flutter-for-android/)とかエンジニア種別ごとでの解説もある。

[Flutter - Dart API docs](https://docs.flutter.io/index.html)
APIドキュメント

[Dart Packages](https://pub.dartlang.org/)
便利パッケージ、プラグインを探すときはこちら

[Flutter System Architecture - Google スライド](https://docs.google.com/presentation/d/1cw7A4HbvM_Abv320rVgPVGiUP2msVs7tfGbkgdrTy0I/edit#slide=id.g70d668005_2_22)
公式からのリンク

#Dart
[Dart SDK - Dart API docs](https://api.dartlang.org/stable/1.24.3/index.html)

[DartPad](https://dartpad.dartlang.org/) 
サクッとDartの試し書きができる

#コードリーディング

[Flutter Gallery - Google Play のアプリ](https://play.google.com/store/apps/details?id=io.flutter.demo.gallery)
[flutter/examples/flutter_gallery at master · flutter/flutter](https://github.com/flutter/flutter/tree/master/examples/flutter_gallery)
公式サンプルアプリ（iOS版は見当たらなかった）。widgetの紹介やアニメーションが実装されている。
どういうことができるか、どんなwidgetがあるかサクッと見てみるにはよい。
当然ながらオープンソース。


[iampawan/Flutter-UI-Kit: Flutter app for collection of UI in a UIKit](https://github.com/iampawan/Flutter-UI-Kit)
UIの作成例

#Tips
[Flutterでアプリの向きを固定する方法とFlutterでの実装をみてみる - Qiita](https://qiita.com/Tazake/items/a66c547bdeb37c6772fb)
画面の固定方法

[Flutter UI code tutorial: mastering Row and Column - Musings of an Android App Software Developer](http://cogitas.net/flutter-ui-code-tutorial-mastering-row-column/)
Widgetを縦横に並べるのに使用するRowとColumnの説明

[Flutter Layout Cheat Sheet – ProAndroidDev](https://proandroiddev.com/flutter-layout-cheat-sheet-5363348d037e)
RowとColumnから始まり様々なWidgetの使い方の解説がある

#設計
##色々
[filiph/state_experiments: Companion repository to the "Build reactive mobile apps in Flutter" talk](https://github.com/filiph/state_experiments)

##BLoC
[BLoC - Speaker Deck](https://speakerdeck.com/kgmyshin/bloc)
[Build reactive mobile apps in Flutter — companion article](https://medium.com/flutter-io/build-reactive-mobile-apps-in-flutter-companion-article-13950959e381)
[【Flutter/RxDart入門】 公式チュートリアルに機能を追加してみる - Qiita](https://qiita.com/sensuikan1973/items/64f1a6235bd8ecaf9067)
[FlutterをBLoCパターンで爆速開発するためのLive Templete - Qiita](https://qiita.com/farman0629/items/a90eb68a21aa6f0684f9)
[Flutter のリアクティブ戦略 set state 〜 redux まで](https://www.slideshare.net/cch-robo/flutter-set-state-redux)

#IDE
[Tips on using Android Studio to develop Flutter apps](https://medium.com/@liewjuntung/tips-on-using-android-studio-to-develop-flutter-apps-9e42c047b7f4)


#コミュニティ
[Flutter JP - Google+](https://plus.google.com/communities/101822628763858843669)
やっていきを感じる
PHP: TCPDF で太字を書く

TCPDF で太字を書く方法です。

![thick_apr1901.png](https://qiita-image-store.s3.amazonaws.com/0/179446/d1d657c8-05c0-e770-121e-747287e3b422.png)

```php:thick_letter.php
#! /usr/bin/php
<?php
// ------------------------------------------------------------------
//
//	thick_letter.php
//
//						Jun/11/2021
// ------------------------------------------------------------------

// require_once('/usr/share/php/tcpdf/tcpdf.php');
require_once('/opt/php-tcpdf/tcpdf.php');

$pdf = new TCPDF(PDF_PAGE_ORIENTATION,PDF_UNIT,"A4",true);
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->SetAutoPageBreak(false, 0);
$pdf->AddPage();

$pdf->SetFont('kozminproregular','', 30);

//
$pdf->Text(70, 10, "ブレーメンの音楽隊");
$pdf->Text(70, 30, "ブレーメンの音楽隊",0.1);
$pdf->Text(70, 50, "ブレーメンの音楽隊",0.3);

//

$pdf->Output();

// ------------------------------------------------------------------
?>
```

実行コマンド

```bash
./thick_letter.php > bremen.pdf
```

Arch Linux で TCPDF は次のようにインストールしました。

```bash
yay -S php-tcpdf
```

バージョンの確認

```text
$ yay -Q php-tcpdf
php-tcpdf 6.3.5-1
```

tcpdf.php のインストールされた場所を探すには

```text
$ yay -Ql php-tcpdf | grep tcpdf.php
php-tcpdf /opt/php-tcpdf/tcpdf.php
```
C++ Builder 10.2 Tokyo > TeeChart > 症状: 片方のChartのSeriesにプロットすると、もう片方のChartのSeriesにもプロットされる

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

### 症状

- 2つのTChartがある
- それぞれ１つのFastLineSeriesを定義
- 片方のChartのSeriesにプロットすると、もう片方のChartのSeriesにもプロットされる

何故こうなるか、さっぱり分からなかった。

### 原因

TChartのデザインをダブルクリックしシリーズの定義を見ると、「どちらもSeries1」となっていた。

通常、この部分は「Series1とSeries2」というように異なるシリーズのはず。

.hファイルにおいてはSeries1とSeries2が宣言されている。
Series2は宣言されているが、TChartで使われていない状態。

### 対処

片方のChartのSeires1に対して[Delete]をしてから[Add]した。Series2が追加された。

この状態で、それぞれ片方ずつのプロットになるようになった。
Subversionでのリポジトリ管理をgitに切り替えるための変換作業

# Subversionでのリポジトリ管理をgitに切り替えるための変換作業

## 事前準備

使うものとして
- SourceTree 2.4.7.0

これがインストール済みの環境であること

## Subversionのリポジトリから最新ソースを取得

### SourceTreeのターミナル機能を使って最新ソースを取得

#### SourceTreeのターミナルを起動

SourceTreeを起動し、画面右上にある`ターミナル`ボタンを押下してターミナルを起動します。

#### 作業ディレクトリを作成し移動

Subversionのソース一式を取得するルートディレクトリを用意し、ターミナルのカレントディレクトリをそこに移動します。  
この手順では`/c/projects/svn2git`をカレントディレクトリとして手順を進めます。

```shell
cd /c/projects/svn2git/
```

#### Subversionからソースを取得（と同時にgitへコンバート）

以下のコマンドを実行して、Subversionから最新ソースを取得します。

```shell
git svn clone --prefix svn/ -s https://SVNServer/svn/SVNProject/
```

このコマンドを実行したあと、`OpenSSH`というタイトルの画面が表示されることがある？
ここでは`p`と入力してOKボタンを押下しました。

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/246556/78b04d9a-a008-a84c-66ad-620866cf1ca5.png)


このあとなんかエラーが発生

```shell
$ git svn clone --prefix svn/ -s https://SVNServer/svn/SVNProject/
Initialized empty Git repository in C:/projects/svn2git/SVNProject/.git/
Error validating server certificate for 'https://SVNServer:443':
 - The certificate is not issued by a trusted authority. Use the
   fingerprint to validate the certificate manually!
Certificate information:
 - Hostname: SVNServer
 - Valid: from Jan 24 00:12:13 2018 GMT until Jan 22 00:12:13 2028 GMT
 - Issuer: SVNServer
 - Fingerprint: E9:50:C0:26:D3:E5:B5:07:AA:6F:32:3B:B0:09:89:90:4A:62:3B:55
Can't create session: Unable to connect to a repository at URL 'https://SVNServer/svn/SVNProject': Error running context: The server unexpectedly closed the connection. at /mingw32/share/perl5/site_perl/Git/SVN.pm line 310.
```

もう一度、以下のコマンドを実行する。

```shell
git svn clone --prefix svn/ -s https://SVNServer/svn/SVNProject/
```

すると、パスワードの入力を求められるので、対象ユーザのパスワードを入力してOKボタンを押下する。
※ここで表示されているユーザが、Subversionに存在しないといけないので注意。

ソースの最新取得が完了すると`C:\projects\svn2git\SVNProject`が生成され、その中に`.git`フォルダまで作成されて取得が完了した状態となる。

#### 取得したソースをSourceTreeにAddする

SourceTreeを起動し、`C:\projects\svn2git\SVNProject`フォルダを指定して、SourceTreeにAddする。

#### SourceTreeの設定からGitのリモートリポジトリを設定

SourceTreeの画面右上にある設定ボタンを押下し、デフォルトリモートにチェックを付けて、URLにGitリポジトリのURLを指定します。

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/246556/2921a8c1-25bb-673d-4004-c628a21b72da.png)


#### SourceTreeからoriginにプッシュ

SourceTreeからoriginにプッシュします。
プッシュ先として`Subversion`ではなく`origin`にすることに注意して下さい。

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/246556/2210ca4f-a51d-977b-5049-2bc8a384dbc3.png)


以上の手順でSubversion⇒Gitへのコンバートが完了です。
さくらVPSでCentOS7 １．申し込み

#はじめに
自由にテスト出来るLinuxのサーバーがほしくて、さくらVPSで構築してみました。
順次手順をアップしていく予定です。
#目次

1. 申し込み
2. [CentOS7インストール](https://qiita.com/Qsugi/items/4cc4ba9983191a306b19)
3. [SSH接続](https://qiita.com/Qsugi/items/45772c8a71a31bd0d3c8)
4. [Apache・PHPインストール](https://qiita.com/Qsugi/items/bf9740f31b4c42eaad91)
5. [MariaDBインストール](https://qiita.com/Qsugi/items/7798669338b555f4ea8d)
6. [FTP接続](https://qiita.com/Qsugi/items/6f383694f60913abb948)
7. [sftp接続](https://qiita.com/Qsugi/items/a8328a116218b058a8bf)
8. [phpMyAdminインストール](https://qiita.com/Qsugi/items/8b6f5b457285140b2ca2)
9. [環境のバックアップ](https://qiita.com/Qsugi/items/a83076eb657157f12f17)
10. [Ruby On Railsインストール](https://qiita.com/Qsugi/items/c7e69a6761f125846bff)
11. [RailsプロジェクトをGitで共同開発](https://qiita.com/Qsugi/items/3c31cfeffee288c05d5e)

#１．申し込み
##プラン選択
[さくらVPSのホームページ](https://vps.sakura.ad.jp/)より、プランを選択します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/222823/fa341a09-1443-87d6-9d9a-0eadb33b3f30.jpeg" width=600>

現在(H30.04)プランはメモリサイズで分かれていて、以下のようになっています。

|プラン|SSD|HDD|月額|初期費用|年一括|
|--:|--:|--:|--:|--:|--:|--:|
|512MB|20GB|--|685円|1,080円|7,543円|
|1G|30GB|100GB|972円|1,620円|10,692円|
|2G|50GB|200GB|1,706円|2,160円|18,770円|
|4G|100GB|400GB|3,888円|4,320円|42,768円|
|8G|200GB|800GB|7,776円|8,640円|85,536円|
|16G|400GB|1600GB|15,552円|17,280円|171,072円|
|32G|800GB|3200GB|30,240円|34,560円|332,640円|

費用の差額で[スケールアップ](https://vps.sakura.ad.jp/flow/#target_scaleup)可能ですので、必要最低限のサイズで初めても良いと思います。
ホームページでは２Gが「おすすめ」になっていますが、費用とメモリ・容量を考えて、１Gプランにしました。
##申し込み手続き

1. [2週間無料でお試し >]をクリック

    <br>
2. プラン、ゾーン、ストレージ、台数を選択し[カートに入れる]をクリック
    * プランを選択：１G
    * リージョン・ゾーン選択：石狩第1ゾーン
    * ストレージ選択：SDD 30GB
    * 台数：1台 

    <br>
3. カート内容・合計金額を確認し[お支払情報の入力]をクリック

    <br>
4. 会員登録又はログイン
    * さくら会員IDを持っていない：[新規会員登録]
    * さくら会員IDを持っている：[ログイン]

    <br>
5. 電話認証のダイアログが出たら
    * さくらVPSの申し込みには電話認証が必要になったようです
        + [電話認証ページへ]をクリック
        + SMS受信可能な番号を入力し[SMSで認証コードを受け取る]をクリック
        + SMSに認証コードが届くので、認証コード入力欄に入力し[認証]をクリック
        + [VPSお申込みページへ進む]をクリック

    <br>
6. 支払パターン、支払い方法を入力し、[お申込み内容の確認」をクリック
    * 「毎月払い」又は「年間一括払い」を選択
    * 「支払方法」を選択
    * カード情報等、支払い方法に応じた情報を入力

    <br>
7. 内容を確認
    * 内容・約款を確認し「約款のご確認」で「同意する」にチェック
    * [この内容で申し込む]をクリック

    <br>
8. 「さくらのVPSお申込み完了」が表示されると申し込み完了
    * 「お申込み受付完了のお知らせ」メールが届く

    <br>
9. 仮登録完了
    * しばらくすると（私の場合10分ほど）『「さくらのVPS」仮登録完了のお知らせ』メールが届く
    * このメールが届くと、サーバー利用可能

    <br>
10. VPSコントロールパネルログイン
    * 仮登録完了メールに掲載されている[VPSコントロールパネルログイン情報]のURLをクリック
    * ログイン画面が開くので、ユーザー登録ID又はメール掲載のIPアドレスでログイン
    * サーバー一覧画面が開く

#次回
ディフォルトでインストールされているOSを削除して、CentOS7をインストールします

次回： [CentOS7インストール](https://qiita.com/Qsugi/items/4cc4ba9983191a306b19)
グラフDB入門  

DB分野で、RDBやNoSQLに続くデータベースとして候補に上がるグラフDBを、Cassandra上で少し触ってみたので、まとめます。
  
   
**特徴・用途**

- オブジェクト間の関係の探索に特化しており、同じ事をやろうとした時のRDBのJOIN負荷を、大幅に下げてくれそうな印象
 
- 考えられる用途： レコメンデーションエンジン、運輸物流の最適経路探索など

**用語**  

- vertex (頂点)
グラフDBの「管理対象」で、名詞で表現される 
例）人物、場所、料理レシピ
  
- edge (エッジ)
頂点間の「関係」で、方向性を持つものもある。動詞で表現される
例）人がソフトウェアを開発する、著者が本を書く  
  
- property（プロパティ）
頂点やエッジの持つ「属性」
例）著者名、レビュー記入日時

**主要な製品**
Neo4j、Oracle Spatial and Graph、DataStax DSE Graph　等　　

**グラフDBのイメージ例 (料理レシピ本)**
![Graph.JPG](https://qiita-image-store.s3.amazonaws.com/0/251519/f7cf4378-9382-52c5-5c9a-b0008385633f.jpeg)  


**試した環境（DataStax DSE Graph）**
https://docs.datastax.com/ja/datastax_enterprise-jajp/5.0/datastax_enterprise/graph/QuickStartStudio.html


**大まかな流れ**

- 頂点（例：author、Book）及びエッジ（例：author-writes/authored-Book）の作成
- 各頂点と各エッジへのデータ挿入（エッジの例：特定Recipeは特定Bookに含まれる）

![Graph.png](https://qiita-image-store.s3.amazonaws.com/0/251519/d17b6a61-ee25-ac72-881d-47fb6d5e4a7b.png)


**感想**

各エッジ「関係」へのデータ挿入が行われている事で、後からエッジのキーを元にエンティティ同士の関係性を追いかけやすい、レコメンデーション向きなモデルである印象を受けました。
【BigQuery】各月の日数を作成・取得する方法

何言ってんだこいつって感じですが要は、

![スクリーンショット 2018-04-19 17.25.49.png](https://qiita-image-store.s3.amazonaws.com/0/186346/208c8ded-c3ba-0425-9adc-1bcce567520e.png)


こういうテーブルを一発で作成する方法です。

StandardSQL前提です。

```sql
SELECT
  FORMAT_DATE("%Y-%m-01", days) AS month,
  COUNT(days) AS days
FROM
  UNNEST(GENERATE_DATE_ARRAY('2016-03-01', '2018-03-31')) as days
GROUP BY
  month
```

UNNESTとGENERATE_DATE_ARRAYの組み合わせは覚えておくと今後も捗るかもしれません。
GENERATE_ARRAYってやつもあった気がする。
ポインタについて

#概要
ポインタはアドレスだといわれてもピンとこない人が多いみたいなんで書きました。かなりの人が難しく感じるようです。（ぼく自身もあんまり理解していないので鵜呑みにしないでくださいね。）

#ポインタを使う関数
実は、ポインタを使う関数はかなり身近なところにあります。scanfの二つ目以降の引数の前には&が付きますよね。(scanf("%d%d", &i, &j);のような感じで)。この変数の前の&は変数のポインタという意味です。ほかにも、&を変数の前につける関数をみつけてみてください。意外とあるものです。

#関数の値渡し
次の例を見てみましょう

```c
#include <stdio.h>
int incl(int x);

int main(){
   int i = 0;
   printf("%d\n", i); // 当然0
   printf("%d\n", incl(i)); // これも、当然１
   printf("%d\n", i);  // 実はこれは0
   return 0;
}

int incl(int x){
   x++;
   return x;
}
```

実は、関数を呼び出すときに変数iのコピーを作ってから関数内の処理を実行するので、main関数の中のiに影響を与えることはありません。では次の例を見てみましょう。

```c
#include <stdio.h>
int incl(int *x);

int main(){
   int i = 0;
   printf("%d\n", i); // 0
   printf("%d\n", incl(&i)); // １
   printf("%d\n", i);  // 今度はこれは1になる。
   return 0;
}

int incl(int *x){
   (*x)++;
   return *x;
}
```

コンピュータ上のどこかにiという変数を管理している場所があるはずですよね。この場所を示したものをiのポインタと呼んだりします。人によってはこれのことをiの住所なんて言う表現をしたりしますね。この変数iのアドレス（住所）をC++だと&iと書きます。関数の引数に*がついていますね。これは変数がポインタだということを示しています。
ところで、このプログラムの実行結果に注目してほしいのですが、３行目の出力が1になってますね。これは、main関数のiとincl関数のxのアドレスが一致しているからです。そのためincl関数の中で値を変更すればmain関数に影響を与えることはわかるでしょう。
VSCodeの統合ターミナルでWSLのzsh(など)をデフォルトで使う

WSL(Windows Subsystem for Linux)のログインシェルをzshにして使っています。

[VSCode + WSL](https://qiita.com/remin/items/b764036e95a13075ee98)のような最新情報を見ていれば問題ありませんが、参考にしたサイトによっては**VSCodeで起動するシェルがbashのまま**になってしまいます。

ちょっとした話ですが、日本語情報が検索にかからないのでメモ。

- 参考: [Set and use Zsh as default shell in WSL on Windows 10 the right way](https://medium.com/@uniqvinh/set-and-use-zsh-as-default-shell-in-wsl-on-windows-10-the-right-way-4f30ed9592dc)

## 環境
- Windows 10(WSLが有効になっていること)
- [Visual Studio Code](https://www.microsoft.com/ja-jp/dev/products/code-vs.aspx)

## 設定ファイルを編集する

ファイル→基本設定→設定で`settings.json`を開きます。
Bash on Ubuntu on Windows時代に書かれた情報だと、概ね次のように書かれているはずです。

```json
{
    "terminal.integrated.shell.windows": "C:\\WINDOWS\\System32\\bash.exe"
}
```

これでは`chsh`などでログインシェルを変更したとしても、bashが起動してしまいます。
`bash.exe`を`wsl.exe`に変更しましょう。

```diff
 {
-    "terminal.integrated.shell.windows": "C:\\WINDOWS\\System32\\bash.exe"
+    "terminal.integrated.shell.windows": "C:\\WINDOWS\\System32\\wsl.exe"
 }
```

統合ターミナルを開くと、無事自分のログインシェルが起動するはずです。
fishの$PATHにいらんのが付いてるのを消す

# 概要
osxにfish入れてたんですが，anacondaを新規にいれてpathを変えようと思ってツボにはまった．

# 結論
~/.config/fish/にあるfishd.****を消した．

# anaconda3の...
ちょっとずれるのですが，メモがわりに．
anaconda3のmac版を入れると，user環境にいれられない場合があります．(謎)
その場合は，'/'にuser権限で作ります．まあなんと強引な．．．これをfishのpathに通そうとしたのが，事の始まりでした．

# 症状
```
> head ~/.config/fish/config.fish
set PATH ~/.rbenv/versions/2.4.3/bin ~/anaconda3/bin ~/.rbenv/shims /usr/local/bin /usr/bin $PATH /sbin /usr/sbin . ~/bin
```
などとしているのですが，

```
> echo $PATH
/Users/bob/.rbenv/versions/2.4.3/lib/ruby/gems/2.4.0/bin 
/Users/bob/.rbenv/versions/2.4.3/bin /Users/bob/anaconda3/bin 
/Users/bob/.rbenv/shims /usr/local/bin /usr/bin . 
/Users/bob/.rbenv/shims /Users/bob/.rbenv/versions/2.4.3/bin 
/Users/bob/anaconda3/bin /Users/bob/bin /sbin /usr/bin /usr/local/bin 
/usr/local/opt/tcl-tk/bin /usr/sbin /bin /opt/X11/bin 
/Library/TeX/texbin /sbin /usr/sbin . /Users/bob/bin
```

するとここでせっていしているより前に余計な(昔設定していた)pathがたくさん出てきて，これがいくらやってもきえんかった．

# 最初の対応
$fish_user_pathsの中に入っていて，

```
> echo $fish_user_paths 
. /Users/bob/.rbenv/shims /Users/bob/.rbenv/versions/2.4.3/bin /Users/bob/anaconda3/bin /Users/bob/bin /sbin /usr/bin /usr/local/bin /usr/local/opt/tcl-tk/bin /usr/sbin
```

これは
> set -e fish_user_paths[0..-1]

で消えます．それでも残ってる場合は，fishdを消してください．
ないと自動的に生成するようですが，怖い場合は適当にcpとかね．

# osx固有の問題?
osxでは
> /etc/profile

が起動されるそうで， /usr/libexec/path_helperで，

```
> cat /etc/paths.d/*
/opt/X11/bin
/Library/TeX/texbin


/Applications/TeXLive/Library/texlive/2013/bin/universal-darwin
/Applications/TeXLive/Library/mactexaddons/bin

> cat /etc/paths
/usr/local/bin
/usr/bin
/bin
/usr/sbin
/sbin
```

なんかから基本となるのができるようです．

そこにfishが上書きしていくようですが，ちょっと不整合あり．

さらに，fishd.****で

```
SET GEMPATH:/Users/bob/\x2erbenv/versions/2\x2e4\x2e3/lib/ruby/ge\
ms/2\x2e4\x2e0/bin
```
が追加されています．うううん．これは？？

# ruby gemsの謎...
これも少しずれるのですが．．．
ruby gemsでinstall dirをどこにするかで
みなさん悩まれます．gem envするとかで解決しますが，
[gemのインストール先にrbenvが指すものとGem.user_dirがあることを知らなくてハマった話 at hatena blog](http://kimikimi714.hatenablog.com/entry/2015/08/08/210111)
がいい感じにまとめてくれてます．

でも，悩んだのは，
EXECUTABLE DIRECTORY
です．gem env ***で出てくるかと思ったのですが，
http://guides.rubygems.org/faqs/#user-install
あるいは
http://docs.seattlerb.org/rubygems/
ここにあるrdocから
http://docs.seattlerb.org/rubygems/Gem/Commands/EnvironmentCommand.html
へ行ってsourceを見ると選べるoptionsがわかるが，そこにもありません．どこやね．．．

で，ありました．
> class Gem::Commands::SetupCommand

のgenerate_default_dirs(install_destdir)の
中に．
> bin_dir = RbConfig::CONFIG['bindir']

そうだよね．gemsではなくてrubyのbinだものね．．．
> RbConfig.expand("$(bindir)") 

で出てくることが判明．なんやrubyの標準moduleやんか．
結局sourceを読めばわかるという，rubyでよくある話．

でも，fishはそれをどこでやってる？
[fish shellでrbenvを使う at Qiita](https://qiita.com/honeniq/items/6b1362dd32b458ef441e)
が良いようで．

> omf install rbenv

でなんか動くようになった．調べる必要あり．
iOS[Swift]でURL Schemeを使ってInstagramのStoriesへの投稿をする！

# やりたいこと

![stories-sample.gif](https://qiita-image-store.s3.amazonaws.com/0/167749/291f7b51-f066-00b2-e7af-290bc753221b.gif)


* アプリ内で画像を生成または撮影
* URL SchemeでInstagarmのアプリに飛ばして
* Storiesに投稿させる

これをやりたいです。

# どうやるのか

どうやってやるのかな。と思って、
Instagram developerのサイトなんかを見てみたのですが、いいかんじのものがみつからず...
https://www.instagram.com/developer/mobile-sharing/iphone-hooks/

ちょっと探していくうちにこんな記事を発見
http://www.anthrgrnwrld.net/entry/2016/10/07/230225

`instagram://library?LocalIdentifier=`

っていうSchemeでイケるのではないかということが判明😙


# 実装して見る

こういうシーンほとんどないと思うのですが、今回はさくっと実装したかったので、

* アプリ内で画像を選択
* その画像を持って
* Instagramの投稿画面に遷移

こんな感じで実装することに。

## やること

### 画像を選択させちゃう

`UINavigationControllerDelegate` と `UIImagePickerControllerDelegate` が必要。
※RxSwiftつかってるよう

```swift
let album = UIImagePickerController()

centerButton.rx.tap
        
            .asObservable()
        
            .subscribe { _ in
                
                self.album.delegate = self
                
                self.album.sourceType = .photoLibrary
                
                self.present(self.album, animated: true, completion: nil)
                
            }
        
            .disposed(by: disposeBag)
```

やっていることは鬼シンプル。これでまずカメラロールをさくっと開くよ。

### 選択が終わったらどうしようか

画像の選択が終わったらどうするかの処理をかくよ

```swift
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
        
        guard let linkURL = info[UIImagePickerControllerReferenceURL] as? URL else { return }
        
        guard let openURL = URL(string: "instagram://library?LocalIdentifier=\(linkURL.absoluteString)") else { return }
        
        picker.dismiss(animated: true, completion: {
        
            if UIApplication.shared.canOpenURL(openURL) {
                
                UIApplication.shared.open(openURL, options: [:], completionHandler: nil)
                
            } else {
                
                print("instagramいれなきゃだめだよそりゃ")
                
            }
            
        })
        
    }
```

これがなにをやってるかというと、

* 選択された画像に関するデータがはいっている `info` というDictionaryから、`UIImagePickerControllerReferenceURL` のvalueを取り出す
* URL Schemeを用意（パラメータに先程取得した `UIImagePickerControllerReferenceURL` をぶちこむ）
* `openURL` していよいよクライマックス！

という感じでい。

ちなみに、`CFBundleURLTypes` に `instagram` を追加しないと遷移できないよ！
あと、いまはめんどくさかったから、`UIImagePickerControllerReferenceURL` を取ってきちゃったけど、これがdeprecatedみたいだから、本当はPhotos.frameworkをごにょらないとだめ！
同一のDropboxのデータをWindowsとUbuntuのデュアルブート環境で使う方法

#背景・要約
ノートパソコンを新調して、Windows 10とUbuntu 16.04LTSのデュアルブート環境を構築した。その後同一のDropboxのデータをWindowsでもUbuntuでもアクセスできるように環境構築した手順をメモ書き。

#手順
1. Windowsでデータを保存するパーティションの用意。
2. そのパーティションでDropboxを利用開始。
3. Windowsの電源のオプションでファストスタートアップのチェックを外す。
4. Ubuntuを起動して、`gnome-disks`でDropboxのパーティションを起動時にマウントするよう設定する。
5. UbuntuでもDropboxをインストールして、起動する。
6. Dropboxを閉じて、homeディレクトリのDropboxフォルダを消して、DropboxのパーティションのDropboxフォルダにシンボリックリンクを作成する。
7. DropboxをUbuntuで起動する。

気が向いたら、もう少し詳しく書きます。

##参考
https://askubuntu.com/questions/843153/unable-to-mount-windows-10-partition-it-is-in-an-unsafe-state
https://askubuntu.com/questions/164926/how-to-make-partitions-mount-at-startup