OmniAICreator/Qiita-1.07M huggingface dataset:
RailsでFont Awesomeをダウンロードして使う方法

今回はRails5でFontAwesomeをダウンロードして使う方法を紹介します。

# バージョン
ruby 2.5.3
rails 5.2.3
Font Awesome 5.10.1 


# その前に
RailsではgemでFont Awesomeをインストールして使える方法があるのでお試しください。

- [gem 'font-awesome-rails'は最新版に対応してない... 代わりにfont-awesome-sassを使おう!](https://qiita.com/paudorino/items/d54348f6d48eefcee6c7)
- [RailsでFont Awesomeを導入する際の注意点](https://qiita.com/Uuya/items/dbdd40ba1e753f4a72ec#_reference-c6178aa7d0a429a6b048)

ちなみに私は上記の方法を試してもエラーになってしまい諦めました。。。
Webフォントとして使うのも読み込みに時間がかかるため、今回ダウンロードして使うことにしました。


# 導入方法
まず、下記からHPからデータをダウンロードしてください。
https://fontawesome.com/how-to-use/on-the-web/setup/hosting-font-awesome-yourself

![スクリーンショット 2019-08-07 14.19.15（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360790/785a2547-5495-f9c2-b289-6c814721a138.png)


ZIPファイルがDLされるので、解凍します。

この中の、`CSS`と`webfonts`フォルダをRailsプロダクトのapp/assets/stylesheets/にコピーします。
<img width="540" alt="スクリーンショット 2019-08-07 14.21.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/360790/c41a5962-6dd9-cdae-39cc-4a4c8681f0a8.png">

最後に、application.html.erbの<head>内に下記の記述をすれば完了

```application.html.erb
<%= stylesheet_link_tag　'css/all', media: 'all'%>
```

あとは使いたい所に`<i class="fas fa-home fa-2x"></i>`のように使えばOK！

# 参考
>[Font Awesome 5 の基本的な使い方](https://qiita.com/Uuya/items/dbdd40ba1e753f4a72ec#_reference-c6178aa7d0a429a6b048)
【Java】文字列が空白のみで構成されていないか（= Blankでないか）を確認する

`javax.validation.constraints.NotBlank`のバリデータの中身が気になったので調べました。

# やり方
`blank`であればtrueを返すコードです。

```java
public boolean isBlank(CharSequence charSequence) {
    if ( charSequence == null ) {
        return true;
    }

    return charSequence.toString().trim().length() == 0;
}
```

## 参照元
このコードは`org.hibernate.validator.internal.constraintvalidators.bv.NotBlankValidator`の実装から拝借しました。

```java
/*
 * Hibernate Validator, declare and validate application constraints
 *
 * License: Apache License, Version 2.0
 * See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
 */
package org.hibernate.validator.internal.constraintvalidators.bv;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.constraints.NotBlank;

/**
 * Check that a character sequence is not {@code null} nor empty after removing any leading or trailing whitespace.
 *
 * @author Guillaume Smet
 */
public class NotBlankValidator implements ConstraintValidator<NotBlank, CharSequence> {

	/**
	 * Checks that the character sequence is not {@code null} nor empty after removing any leading or trailing
	 * whitespace.
	 *
	 * @param charSequence the character sequence to validate
	 * @param constraintValidatorContext context in which the constraint is evaluated
	 * @return returns {@code true} if the string is not {@code null} and the length of the trimmed
	 * {@code charSequence} is strictly superior to 0, {@code false} otherwise
	 */
	@Override
	public boolean isValid(CharSequence charSequence, ConstraintValidatorContext constraintValidatorContext) {
		if ( charSequence == null ) {
			return false;
		}

		return charSequence.toString().trim().length() > 0;
	}
}
```
お気に入りライブラリーまとめ

画像のローディングイベント（必須!!）
https://imagesloaded.desandro.com/

カーソルによるパララックス
https://gijsroge.github.io/tilt.js/

アニメーションライブラリー（タイムライン形式）
https://animejs.com/
https://greensock.com/tweenmax

2Dアニメーション
https://two.js.org/

Drag：
https://draggabilly.desandro.com/

letter split❤️
http://letteringjs.com/

responsive text：
http://fittextjs.com/

Vector scripting framework：
http://paperjs.org/

3D
https://threejs.org/

pictureタグIE対応（レスポンシブ画像）
http://scottjehl.github.io/picturefill/
SFSymbolsAppを使ってsystemNameに設定できる名前を知る

# この記事について

```swift

Image(systemName: "photo")
```

Appleが提供するimageはphoto以外には何があるか知りたいという欲に答え
あわよくばデザインを確認しながら設定したいための環境を整える記事になります。

![iOS の画像 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/be07dd90-b318-4656-fb74-db10a678d3ce.png)
(WWDCの動画のスクショ

# SF Symbols Appをダウンロード

[sf-symbols](https://developer.apple.com/design/human-interface-guidelines/sf-symbols/overview/)
こちらのサイトよりSF Symbolsをダウンロードしてください

無事インストールがすめば以下のアイコンのアプリケーションが入ってます。<img width="140" alt="スクリーンショット 2019-08-07 14.14.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/6fe63068-ed2b-c576-6c9c-092eacee96c7.png">




# 確認しながらImageを設定してみる

インストールしたSF Symbolsアプリを開くとたくさんのアイコンが表示されてます！

*SF Symbols provides a set of over 1,500 consistent*
たくさん用意されてますね！
モックとかSF Symbolsに含まれるデザインで要件満たせたりするとコスパ良さそう

![スクリーンショット 2019-08-07 14.20.35（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/0314c73a-2199-e627-21fc-38d662b2545c.png)

```swift
struct CollectionView: View {
    var body: some View {
        VStack (alignment: .center){
            HStack {
                Image(systemName: "gamecontroller")
                Image(systemName: "gamecontroller.fill")
            }
            HStack {
                Image(systemName: "gift")
                Image(systemName: "gift.fill")
            }
            HStack {
                Image(systemName: "app")
                Image(systemName: "app.fill")
            }
        }
    }
}
```

<img width="721" alt="スクリーンショット 2019-08-07 14.23.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75593/d57d071e-5c91-fbac-5ebb-76acc398c069.png">

# さいごに
Custom Symbolについては今回触れませんでしたが、独自にデザインを用意できるみたいです。
こちらについては対応が必要になった際に対応してみて感じたことがあれば追加記載使用と思います！
プロになるためのweb技術入門　3章　キーワード

## HTTPとは
HTTP（hyper text transfer protocol)は通信プロトコルの一種。HTMLの通信のために考案され、現在もっとも幅広く使用されている通信プロトコル。webが考案された時、ファイル転送用のプロトコルとしてFTPが存在しており、そちらを利用しても良かったのだが、FTPは通信手順が多いためオーバヘッドになることに加えアクセスのためには認証を必要とするため、アクセス先のサーバ管理者に以来をしてアカウントを発行する必要があった。そのため、認証が不要でオーバヘッドが少なく実装も簡単なHTTPが普及した。

## インターネットの情報が届く仕組み
- IPアドレス
IPアドレスとはクライアントやサーバを識別するための番号。住所のようなもの。ただし、クローバルIPとプライベートIPに別れており、グローバルIPは重複がない固定電話で、プライベートIPは重複があっても大丈夫な内線番号のようなもの。会社や学校などの組織内で利用する場合はプライベートIPという認識.

- DNSサーバ
DNSサーバとはクライアントから受け取ったURLをIPアドレスに変換してクライアントに返すサーバ。トップレベルドメイン（.comや.jpなど)を管理するサーバの上に存在する。世界中に13台存在する。

- ポート
クライアントがDNSサーバから受け取ったIPアドレスを元に、webサーバへアクセスする際のwebサーバの入り口。そのメインの入り口は通信プロトコルによって決まっている（wellknownport)

## クライアントからサーバへの要求の伝え方
- get 
URLに入力された情報やサーバから帰ってきた情報がそのまま入っている渡し方
- post
入力された情報がURLではなくメッセージボディに入る渡し方。第三者に情報が漏れる恐れが少なくなる。
PHP 初心者メモ③

staticメソッド...インスタンスを使わずにメソッドやプロパディを定義できる

public static function メソッド名(){
 echo 処理;
 }

//アクセス方法
クラス名::メソッド名()
//上記のメソッド定義が呼ばれる。

//staticプロパディ...インスタンス化された数を数える。クラスに対して設定

public static $count =0;
//数を増やしていきたい場合の定義
self::$count ++; //インスタンスの数が増えて行く
テーブル定義書


# mdファイルで作成するときのテーブル定義書例

## テーブル名
```
テーブル情報
何のためのテーブルか、注意点は何かなどを記載する。

```

### columns
| 論理名 | 物理名 | 型 | NULL | DEFAULT | KEY | COMMENT|
| -- | -- | -- | -- | -- | -- | -- |
| カラムID | column_id | INT |  | AUTO_INCREMENT | PRI |  |
| カラム名 | column_name | VACHAR(40) |  |  |  |  |
| パスワード | user_password | VACHAR(40) |  |  |  |  |
| 権限 | role_id | TINYINT |  |  |  |  |
| 作成日時 | created_at | DATETIME |  | CURRENT_TIMESTAMP |  | 対象レコードを登録した日時を設定する |
| 更新日時 | updated_at | DATETIME |  | CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP |  | 対象レコードを更新した日時を設定する |

### PrimaryKeys
|columns|
| --- |
| column_id |

### Indexes
|columns| unique |
| --- | --- |
|  |  |

### ForeignKeys
|columns| preference_tbl | index_names | constraint_update | constraint_delete |
| --- | --- | --- | --- | --- |
|  |  |  |  |  |

---

## テーブル定義書注意点

- 真偽値の型
真偽値に設定したい時は、型を TINYINT(1) とする

- PrimaryKey
PRIを1つのテーブルで2カラム設定しておくと、カラム1-カラム2 としたとき、1-1, 1-2, 1-3 のように一意の値を当てれる。
これにより1を指定すると1-1, 1-2, 1-3 をセットで取得できるようになる。

- 数値型
数字が大きくならなくても、基本的にINTで設定しておいていい。

- UNSIGNED
SMALLINT UNSIGNED のように数値型の後にUNSIGNED をつけると、マイナスは含めない設定になる。

- NULL
デフォルトが Not Null なので、基本的に空白でいい。

- ForeginKeys
設定しておくと、設定した同士のどちらか片方を削除したら、もう片方も削除するなどの設定ができるが、設定しすぎるとガチガチになり、後々修正が大変になる。
基本的に設定しなくて良く、設定しなくてもコードで対応できる。

Indexes
ひとまとまりを設定

role (ロール)
権限を組み合わせて役割を示す名前をつけたもの。
ユーザーとは独立して定義して、ロールをユーザに割り当てる使い方をする。
ロールを使用しない場合、管理者が複数いる場合に、どの担当者か後で追跡できなくなったり、管理者パスワードを複数の担当者が知っている状態になる、事故が起こりやすくなる。
このため、IDは担当者毎に1つ作成(1人1IDの原則)し、その個人IDに対して、業務に必要なロールを割り当てる方が良い。
LaravelでControllerに生やしたDB依存のprivateメソッドをUnitテストしたい

# 背景

Laravelのシステムの改修を請け負って、ControllerにDB依存のprivateメソッド盛り盛り。
テストしづらいけど、テストしないときついと思ったので備忘録として。

## 環境

Laravel5.5(もうLaravel6.0が出るのに...)

## 対応

DB依存がどうにもならない場合、一旦`DatabaseTransactions`を使ってごまかします。
`ReflectionMethod`を使って、privateメソッドをこじ開けます。
`Eloquent Model Factory`を使って、ダミーデータ作ってデータの確認します。
あとはこじ開けたprivateメソッドの返り値をassertします。

具体例
HogeModelのfugaの値の合計値を取得するprivateなMethodがコントローラーにあってそれをテストしたい。

TestClass

```php
class dataBaseDependControllerTest extends TestCase
{

    use DatabaseTransactions;

    /**
     * 
     *
     * @return void
     */
    public function test_データベース依存のprivateメソッドのテスト()
    {
        $controllerClass = new dataBaseDependController();

        $reflectionMethod = new ReflectionMethod($controllerClass, 'getHogeModelValue');
        $reflectionMethod->setAccessible(true);

        $fugaNum = 5;
        $fugaPoint = 100;
        factory(\App\HogeModel::class, $fugaNum)->create('fuga' => $fugaPoint]);
        $this->assertEquals($fugaNum * $fugaPoint, $reflectionMethod->invokeArgs($controllerClass, [new FugaModel()]));
    }
}
```

Eloquent Model Factory

```php

$factory->define(\App\HogeModel::class, function (Faker $faker) {
    return [
        'fuga' => 0, //引数で値をセットするなら何でも良い
    ];
});
```

Controllerのprivateメソッド

```php
    private function getHogeModelValue(HogeModel $hogeModel) : ?int
    {
        return $hogeModel->sum('fuga');
    }
```

## 参考

[【Laravel】Repository パターンを使った際に DB アクセスを発生させないテストを書く](https://blog.okashoi.net/entry/2018/12/19/222734)
[Eloquent Model Factory を使ってテストデータを整備する](https://qiita.com/nunulk/items/06370af1594a10faa749)
ドキュメントをテキストファイルで記述する方針メモ

# 概要

## 目的

「構造化された見やすいドキュメント」と
「表現が一定水準に統一された図（UML）」を
テキストファイルだけで記述したい！

## 理由

・テキストファイルは（色んな意味で）軽い
・修正の履歴が管理しやすい

## 手段

構造化された見やすいドキュメントは「markdown」
表現が一定水準に統一された図（UML）は「PlantUML」で記述する。

## 動作環境

Visual Studio Code上に、MarkdownとPlantUMLが書ける環境を準備する。

### 参考Webサイト

[PlantUML公式](http://plantuml.com/ja/)

#### インストールはこの辺
[VS Code で UML を描こう！](https://qiita.com/couzie/items/9dedb834c5aff09ea7b2)
[VS Code + MarkDown + PlantUML で開発ドキュメントをわかりやすくする](https://qiita.com/asuzuki2008/items/87c09a91cc53b15a7555)

#### さらに細かく
[PlantUML Cheat Sheet](https://qiita.com/ogomr/items/0b5c4de7f38fd1482a48)
[VSCode拡張のPlantUMLプレビューが表示されない場合の対応](https://qiita.com/zonbitamago/items/7946acfb4cbaa139f0)
[VSCodeにPlantUMLを導入する手順](https://www.suzu6.net/posts/134-install-plantuml/)
[VS CodeにPlantUMLを導入して業務効率化を図る](https://k99-tech.com/blog/archives/1098)
[Visual Studio Codeで自由自在にUMLを描こう](https://blog.okazuki.jp/entry/2016/09/01/215508)
[Visual Studio CodeでPlantUMLを使うメモ (Windows編).md](https://gist.github.com/yoggy/bd68b3f1f55dbd742bea71424ca66564)
[PlantUMLの環境を設定する](https://qiita.com/koara-local/items/e7a7a7d68a4f99a91ab1)
[VSCodeのMarkdown Preview EnhancedでPlantUMLが描画されない](https://qiita.com/kira4845/items/5405d5b6127e7c892dce)

---

以下、Markdown + PlantUMLによるドキュメントの凡例

# ドキュメント概要

# Readme

# 外部仕様

外部仕様を記述します。

## プロトコル

# 内部仕様

# 設計

## 状態遷移図

- - -

```plantuml
@startuml
skinparam backgroundColor LightYellow
skinparam state {
  StartColor MediumBlue
  EndColor Red
  BackgroundColor Peru
  BackgroundColor<<Warning>> Olive
  BorderColor Black
  'FontName Impact
}

title 【状態遷移図】〇〇機能

note "【 memo 】" as N1

state "イニシャル"   as 0
state "アイドル"     as 1
state "送信待ち"     as 2
state "受信待ち"     as 3
state "受信処理待ち" as 4

1 : [enter]
1 : [do]
1 : [leave]

[*] -d-> 0 : オブジェクト実体化
0   -d-> 1 : 初期化
1   -r-> 2 : 送信要求受付
2   -d-> 3 : 送信要求成功
3   -l-> 4 : 受信受付
4   -u-> 1 : 受信処理完了

@enduml
```

状態遷移図は、実際に、Visual Studio Code上にて、
PlantUMLに対応したプレビュー画面にて以下のように描画されます。
<img width="246" alt="キャプチャ.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133593/c4e2f801-2341-2fe3-b6b2-290ea52a6ccb.jpeg">

- - -

# シナリオ

* ターゲットは？
* どのような状況で使うのか？
* どのように使うのか？
* 制約事項は何か？

# 対象外

* 明らかにオーバースペックなこと
* 今のバージョンでやらないこと
* 対象外のプラットフォーム

# 用語解説

* 一般的な用語でもドキュメント中での意味を書く

# 未解決の問題

* 何が未解決か残す
* これが残っているうちはプログラマーにコードを書かせない（気持ちを持つ）

# UMLの指針
以下を駆使する。

* 状態遷移図
* シーケンス図
* ユースケース図
* クラス（ブロック）図
* 配置図
* タイミング図

# 全体的な書き方に関する指針
* 一覧性が重要（カラフルな表だと割と見やすい）
* 全体像を把握させる（図表でシンプルに表現できる仕様／設計であるべき）
* フローチャート(PlantUMLのアクティビティ図)も駆使する
* 他の仕様や設計との関係性を意識する
* 想定される状況をすべて書く
* 何がエラーになるかすべて書く
* 全てのエラーに対してどう処理するか書く
* 何故、そのような振る舞いに至ったかの経緯や思考実験の経過を書く
* シンプルなプログラムにする事が可能な仕様／設計であるのが望ましい
* テストケースが容易に洗い出せるのが望ましい
* テスト可能な仕様／設計でないといけない
* テスト再現性が高い（テストし易い）仕様／設計であることが望ましい
* ソースコード読めば一目瞭然の事は書くべきではない
* ソースコードがさくさく読めるためのガイドとなる事を目指すべき
Flutterのupgradeに失敗する

# 事象

flutter upgradeを実行すると以下のようなエラーが出力されてupgradeできない

```terminal
$ flutter upgrade
Unable to upgrade Flutter: no origin repository configured. Run 'git remote add origin https://github.com/flutter/flutter' in (flutterのpath)
```

# 原因

flutterの環境がstable/beta/devなどのchannelに所属しない、特定のバージョンになっていたためでした。
例えば、私の場合はv1.2.1に固定していたため、`flutter doctor`をすると`Channel unknown`となっています。

```terminal
$ flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel unknown, v1.2.1, on (略))
...(途中略)...

• No issues found!
```

# 対応方法

`flutter channel stable`など、任意のchannelへと移動すればupgradeもできるようになります。
確かに、よく考えればupgradeはchannelにいないとできなくて当然ですよね…

# なぜ起こったのか？

私の場合、CIでPRトリガーでビルドを実行しているのですが、プロジェクトはflutterのバージョンを以下の様に固定しています。

```yaml:pubspec.yaml
environment:
  flutter: 1.2.1
```

そのため、CIでもコマンドで`flutter version v1.2.1`としてバージョンを固定した上でビルドを実行していました。
しかし、先日flutter 1.7.8+hotfix.4がリリースされたため、こちらにバージョンアップしようとしたところ、`flutter version v1.7.8+hotfix.4`が「そんなバージョンありません」とエラーで失敗してしまいました。

ならupgradeしてあげれば大丈夫だろう、と思ったところ、冒頭のエラーに遭遇したわけです。
一旦、今回は手動でCIサーバーのflutterをstable channelにした上でupgradeを実行して、エラーは回避しました。

stableを使う前提にはなりますが、以下の様な一連のコマンドにしておけば、flutterのバージョンアップ時もカバーできるかもしれないです。

```terminal
flutter channel stable
flutter upgrade
flutter version v1.7.8+hotfix.4
```
MySQLの全テーブルにprefixを追加する方法

某案件で開発環境のDBテーブルはprefixなしだけど、テスト環境ではprefixありという案件があり、prefix無し環境だと問題ないけど、prefix有り環境だとエラーが発生するというのが度々あったので、開発環境もprefix有りにするために、一括でprefixを追加する方法を調べたのでメモしておきます。

まず全テーブルのALTER TABLE文を生成するクエリの実行。（"prefix_"を追加したprefixに変更し、データベース名を対象とするDB名に変更して実行する）

```sql
SELECT Concat('ALTER TABLE `', TABLE_NAME, '` RENAME TO `prefix_', TABLE_NAME, '`;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'データベース名';
```

これでALTER TABLE文が全テーブル分出力されるので、出力された各ALTER文を実行すればprefix追加完了です。

ALTER TABLE生成のSQLは下記で見つけました。
 [rename - How to add prefix of all tables in mysql - Stack Overflow](https://stackoverflow.com/questions/7970798/how-to-add-prefix-of-all-tables-in-mysql)
mysqlのtext型に格納されたjson形式の値を取得する方法

mysqlのtext型にjson形式で格納された値をSQLで取り出す方法を調べたのでメモ。

MySQL5.7からJSON型が使えるようになったようです。
https://dev.mysql.com/doc/refman/8.0/en/json.html

#取得元のテーブル

```
CREATE TABLE `order` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `option_number` varchar(255) DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL,
  PRIMARY KEY (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```

#格納されている値
orderテーブルのoption_numberカラムにはこんな値が入っています。

```
{"adult": 2, "child": 1}
```

#まずはJSON型にキャストしてみる

```
mysql> select CAST(option_number AS JSON) from tickets as ticket;
+---------------------------------------------------------------------+
| CAST(option_number AS JSON)                                                    |
+---------------------------------------------------------------------+
| {"adult": 1, "child": 0} |
| {"adult": 1, "child": 0} |
| {"adult": 0, "child": 1} |
| {"adult": 0, "child": 1} |
```

#JSON型にした項目のキーを指定して値を取得
```
mysql> select CAST(option_number AS JSON)->"$.adult" from tickets as ticket;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '->"$.age-category-adult" from tickets as ticket' at line 1
mysql>
```
なぜかうまくいかない・・・
ネストしてみる。。。

```
mysql> select tickets.option_number->"$.adult"
    -> from(select CAST(option_number as JSON) as option_number from tickets) as tickets;
ERROR 3143 (42000): Invalid JSON path expression. The error is around character position 20.
mysql> 
```
こちらもだめ。日本語を含む場合キー値をダブルコーテーションで囲うと解決するという記事を発見。試してみる。

```
mysql> select tickets.option_number->'$."adult"'
    -> from(select CAST(option_number as JSON) as option_number from tickets) as tickets limit 1;
+-------------------------------------------------+
| tickets.option_number->'$."adult"'              |
+-------------------------------------------------+
| 1                                               |
| 1                                               |
| 0                                               |
| 0                                               |
+-------------------------------------------------+
1 row in set (0.01 sec)

mysql> 
```

取得できました！
ハイフンなの!?アンダースコアなの!?

# なんの記事なのか

プルリクでよく「そこはハイフンでしょ」ってツッコみを受けるんですが、プログラミングしてるとアンダースコアがメインなのでついつい流れでアンダースコアにしちゃいます。

そこそこ理由があり、私がハイフンにしようと心に誓ったものだけまとめてみました。
記憶力ゼロなので、忘れないように...

とりあえず思いつきで書きなぐった記事なので、他にもあったら随時更新していきます。

（プログラミング言語系はマイナス表記の関係でそもそもハイフンを使わないことが多いので除外してます）

# ハイフンとアンダースコアの意味合い

そういえば、それぞれの区分けってなんだろうと思って調べました。

ちょっと古い記事ですが、Google によると...

> 2つの単語がハイフンで結ばれている場合は両者を区別して認識するが、アンダースコアの場合は両者を結合して判断する。

参考：『[SEO:「ハイフンとアンダースコアは異なる扱い」 Google Matt Cuttsがコメント ::SEM R (#SEMR)](http://www.sem-r.com/seo/20110818061702.html)』

つまり、

* 『sub-unit』（ハイフン）の場合、『**sub**』 と 『**unit**』 という2ワードだと判断されている
* 『sub_unit』（アンダースコア）の場合、『**subunit**』 という1ワードだと判断されている

これを聞いて、（Google 関係ないですが）パソコン上で文字列をダブルクリックした時に、アンダースコアは『**全部が選択される**』のに、ハイフンだと『**単語単位で選択される**』のも納得しました。

# ハイフンにするもの

## 1. サブドメイン
[RFC](https://ja.wikipedia.org/wiki/Request_for_Comments)規格でハイフン限定なので絶対です。

## 2. URL
SEO的には完全にどちらでもいいんですが、以下2点の理由でハイフンにしようと思います。

* サブドメインに合わせる
* Googleがハイフンを推奨している（長いものにまかれる）   
  https://support.google.com/webmasters/answer/76329?hl=ja

## 3. gitリポジトリ名・ブランチ名
[Git スタイルガイド](https://github.com/objectx/git-style-guide#%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81)に従おうかと思います。

特にリポジトリ名。
例えば github などでは、イコール URL になるので...というのもあります。

例）https://github.com/west-hiroaki/python-django-sample-with-docker

# おまけ
## メールアドレス
[RFC](https://ja.wikipedia.org/wiki/Request_for_Comments)規格ではどっちでもいいとなってますが、以下の理由でドットにしようと思います。

* アンダースコアは下線と重なって見えない時がある
* 日本以外ではハイフンは使わないらしい

参考：[メールアドレスに使う記号はドット、アンダーバー、ハイフンのどれがよいか](https://stabucky.com/wp/archives/7867)
変数について覚えたこと★プログラミングをゼロから勉強

#変数を覚えるヒント
- 変数とは「データをしまっておく場所」
- 変数にはデータの種類・大きさに合わせた「型」がある
- 変数は「繰り返し」と「修正・変更」のためにある

##はじめに
プログラミング学習にあたり、「初心者向け」のサイトをいくつか読み漁っています！
ただ・・・
**プログラミングの共通ルールを知らないと絶対に心が折れる！**と思ったので、自分なりの解釈で覚えたことをまとめていきます。

今回は**「変数」**についてです。

##プログラミング界隈での変数とは？
数学で使った変数とは意味が違っていました。
((とはいえ「x=1」と書く、くらいしか覚えていません！))

プログラミングの世界で変数は『データをしまっておく場所』のことを言います。
身近にあるものだと「入れ物」や「付箋」に例えられます。
そしてコンピューターは、変数に入ったデータを出し入れしながら、物事を理解・処理をします。

また、**変数には様々な種類のデータをしまっておけます。**
具体的には「数」「文字列」「真偽」など。
((他にもあるんでしょうが、まずはこの３つだけ覚えておきます！))
身近な物で考えてみたんですが・・・スマホゲームの画面がしっくりきました。
ゲームシステムの中には、プレイヤー名（文字列）、いくつポイントが集まったか（数）、クリアしたか／していないか（真偽）をデータとしてしまわれていて、画面に表示してくれますね。

##変数の「型」について
変数には「型」があります。
型には、しまえるデータの形や容量に決まりがあり、例えば『整数だけしまえる変数』『文字列だけをしまえる変数』など様々です。

###型の必要性
そもそも、どうして変数には型が必要なのか。それは『効率化』のためです。

変数を「入れ物」で例えてみます。
入れ物には色々な種類があります！カゴ・ダンボール・紙袋・缶などなど。
そして種類によって得意なこと・苦手なことがあります。

カゴは持ち運びに便利ですが、隙間が大きいのでジュースなどの液体や空気をしまっておくことは苦手です。
缶は液体や空気をしまえますが…しまう容量が増えるほど缶自体が大きくなり、とても重くて移動するのが大変です。

プログラミングの世界でも一緒で、なんでもかんでも適当な変数にデータをしまうと、かえって処理が面倒なことになります。「適材適所」ってやつですね！


##変数にデータをしまう理由
そんな少しクセのある変数が使われる理由、それは「繰り返し」と「修正・変更」が得意だから。
といっても分かりづらかったので、「おつかい」で例えてみました！

###具体例：「リンゴを買ってきて」と頼まれた人の行動

1. リンゴが売っているスーパーに行く
2. カゴを持つ
3. リンゴをカゴに入れる
4. リンゴが入ったカゴを持ったままレジに行く
5. 代金を支払う
6. 家に帰って冷蔵庫にリンゴをしまう


・・・でも**「あら大変。ジャガイモも無かったわ。買ってきて？」**と言われたらどうしますか？
人間同士だったらケンカになりかねない瞬間です！！

一方、相手がパソコンだったとして考えましょう。
**パソコンは文句をいいませんが、言われた通り（プログラミング通り）の行動しかとれません。**
上の流れだと「リンゴ」の部分をすべて「ジャガイモ」に修正する必要があります。これ、とても面倒ですね。
こんな時に「変数」が活躍します！

では、どうやって使うのか！
先程の流れを踏まえつつ、変数を「付箋」に例えて考えてみます。

###具体例：付箋を使って「○○○を買ってきて」と頼まれた人の行動
1. ○○○と書かれた付箋をもらう
2. 付箋に書かれた品が売っているスーパーに行く
3. カゴを持つ
4. 付箋に書かれた品をカゴに入れる
5. 付箋に書かれた品が入ったカゴを持ったままレジに行く
6. 代金を支払う
7. 家に帰って冷蔵庫に付箋に書かれた品をしまう


・・・なんだか手順が増えたし、言い回しが回りくどい感じになってしまいましたね。
でも、付箋に品名を書いて渡せば**繰り返し何度でも、どんな買い物でもお願いすることができるようになりました！**

###変数の宣言と代入
先程出た「付箋に品名を書く」行動は、プログラミング的にいうと**『変数を宣言・代入する』**ということになります。
**「△△△型の変数に★★をしまって（代入して）使うよ！」**とパソコンに教えて（宣言して）あげるんですね。

ちなみに付箋を変数っぽく例えるなら、『「文字列」をしまえるが「数」はしまえない型』といったところでしょうか。
いやいや、単純に「リンゴ２個」と書けばいいじゃん？と思うかもしれませんが、それは「文字」と「数」の区別がついている人間だから理解できるのです。
残念ながらパソコンは、そこまで都合よく察してくれません!!

##まとめ
ざっくりですが、変数についてまとめました。

まず変数はデータを入れる物だということ。そして型があるということ。
型によって入れられるデータの種類や大きさが違うということもわかりました。
そして、**「変数を使うことで汎用性の高いプログラミングが効率よく書ける」**
これが一番重要だったのかなと思います！
コンテナとは

# はじめに
コンテナ使ってるけどいまいち有効活用出来てないなぁと日々感じる中、
「世の中的にはどんどんコンテナ化が進んでます」なんて聴講すると
時代に乗り遅れている感がありちょっと勉強

kubernetisとかマイクロサービスとか勉強してるけど、根っこの技術知識を定着させる目的もあり

# コンテナについて
一般論ではサービスを一つのコマンドとして管理する為の仕組み。


# コンテナに対する誤った理解
コンテナ内にOSが入りその上にサービスを乗せるもんだと思ってました。
コンテナ内のshにアクセス出来るし、チュートリアルでCentインストールしてたりするし、
ほとんどdockerHubのコンテナしか使ったことがないことも原因の一つだと考えます。
また、dockerしか無いとも考えてました。



# コンテナの個人的な理解
1. OS上にコンテナフレームワークを配置してその上で動作する
1. アプリケーションの入ったコンテナを作成する
1. コンテナ内はライブラリで動作しておりOSは不用
1. コンテナには基本一つのサービスのみ導入する  
※複数のイメージを入れると柔軟性が損なわれるからだと考える

## 再現性
メリットに再現性を言われることがある
コンテナフレームワーク上だったらどんなOS上でも動作することがある
本番環境やステージング環境をコンテナ化して開発環境にデプロイすることで
各環境の差異を減らすことが出来ることも再現性のメリットだと考える。
再現性とは別の文言で表現されてるのかな？

## 歴史と市場
思ってたよりも歴史は古く2000年代前半からソフトウェアはあった様です。
現在の主流がdockerであるだけ。

dockerが主流になった理由は使いやすいから？
他のソフトウェアはそれ以外の知識も若干必要になるが、
dockerはdockerコマンドさえ覚えれば使える
機能が豊富

# 誤解してた所
コンテナ内はOSがいると思ってたところが最大の間違い

# 結論
まだまだ、モヤッとしてます。
PHP初心者メモ②

クラスとインスタンス

クラスが持つ変数のことを”プロパディ”
クラスが持つ関数のことを”メソッド”

インスタンス...クラスを元に実際にデータを持たせたものをインスタンス
定義＄インスタンス名＝new クラス名（）;


クラスの作り方

Class クラス名　{
 
//プロパディ
public $プロパディ;

 //コンスタラクタ
public function __construct($プロパディ）{
   $this->プロパディ
}

//メソッド
public function メソッド（）{
 echo 処理
}

//インスタンス生成
$インスタンス名 = new クラス名()
Illustratorの差し込み印刷　個人的備忘録

## 要するに
Illustratorの差し込み印刷ではCSVを使うより、[Mr. Data Converter](https://shancarter.github.io/mr-data-converter/)等でXMLに変換したほうが吉
## Illustratorの差し込み印刷がCSVインポートに対応
今までは、Illustratorで差し込み印刷をするには、Excel等でどうにかこうにかしてXMLを作るという工程が必要でした。
参考
https://medium.com/studist-dev/design-illustrator-xml-4bcaeb004d3a
https://dearps.lovwar.com/2015/01/07/illustrator/

その後、Illustrator2018 3月アップデートからCSVによる差し込み印刷に対応しました。
https://blogs.adobe.com/japan/dtp-illustrator-kihon-tips-10/

これには多少くせがあり、
オフィシャルの記事[(変数パネルを使用したデータ結合)](https://helpx.adobe.com/jp/illustrator/using/data-driven-graphics-templates-variables.html)を参考に進めてもCSVの読み込みができなかったり、思ったように動かなかったりします。

どんなことに気をつければよいのでしょう?

## 差し込み印刷のCSVインポートの制限
下のサイトが最も詳しいです。
[CSV ファイルの読み込み中に問題が発生した場合](https://helpx.adobe.com/jp/illustrator/using/data-driven-graphics-templates-variables.html#CSV%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E4%B8%AD%E3%81%AB%E5%95%8F%E9%A1%8C%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88)

> - CSV ファイルが空でないこと。
- 最新バージョンの Microsoft Excel を使用して作成したスプレッドシートが CSV（コンマ区切り）（*.csv）または CSV（MS-DOS）（*.csv）形式で保存され、Apple Numbers を使用して作成されたスプレッドシートは Unicode（UTF-8）エンコーディングで CSV 形式として保存されている。 Macintosh コンマ区切り（*.csv）など、その他のファイル形式で保存されたデータソースファイルは、データ結合に対応していません。
- すべての列にデータフィールド名がある。例えば、データソースファイルの列にデータは含まれているが、データフィールド名がない場合、エラーメッセージが表示されます。
- データソースファイルの値が設定された列の間に空白の列がない。例えば、データソースファイルの列 B と D にデータは含まれているが、列 C はからの場合、エラーメッセージが表示されます。

csvの文字コード及び改行コード(上の2番目の制約)については下のサイトが詳しいです。
[各アプリから書き出すCSVの文字コードとBOM](https://dtptransit.design/illustrator/illustrator-variable.html#各アプリから書き出すCSVの文字コードとBOM)

また、以下のようなこともあります。
[変数csvデータ読み込み時の空白データが正確に表示されない](https://forums.adobe.com/thread/2560753)

つまり、空白のセルを含むデータを流し込むためには、空白を全角スペース等に変換するようにExcelでシートを作り、それをCSVにエクスポートしなければいけません。これでは手作業でXMLを作っている時代と変わりません。

また、これはXML・CSV共通かもしれませんが(未検証)、以下のような事象も確認されています。
[Illustrator CCにおける「変数」でつまらないところでハマった話](https://youichirou.hatenablog.com/entry/2019/03/19/093059)
> - 1行目の列名の先頭が数字で始まっていないか

も確認する必要があるようです。
Gitによるバージョン管理（完全初心者向け）

はじめまして。プログラミング学習歴半年のさかたです。

作業メモがてらに、記事を投稿させていただきます。おかしな点や誤りがあれば、コメントでご指摘頂けると幸いです。また、僕の記事が少しでも初学者の参考になればと思います。

#初心者向けGitバージョン管理の手順
まず初めにGitとは何かと説明すると、ゲームのセーブデータと思っていただければいいかと思います。セーブしなくてもゲームはプレイ出来ますが、セーブ出来ないと安心して遊べませんよね。これはプログラミングでも同じことが言えます。

Gitによるバージョン管理をしておくこと、コードの変更履歴を追ったり、手違いで削除してしまったファイルを復元するするといった事が可能なので、安心して開発を行うことができるようになるのですね。
特にチーム開発を行う場合であれば、Gitを使いこなすのは必須中の必須スキルですので、是非とも押えておいて下さい。
##ソースコードをGitで管理するための一連の流れ

```terminal:ターミナル
$ git init
```
アプリケーションを作成してから、Gitでソースコードを管理するために最初に呼び出すコマンド。こちらのコマンドは初回だけで大丈夫です。

```terminal:ターミナル
$ git add -A
```
このコマンドを実行することにより、ファイルがすべて追加されます。-A のところをファイル名に変えると、そのファイルのみが共有されます。

```terminal:ターミナル
$ git status
```
こちらのコマンドでどのファイルが変更されたか確認します。add前のファイルはRed、add後のファイルはGreenで表示されるようになってます。
　
この動作はなくても問題ないですが、チームで開発する場合であれば、共有したくないファイルをコミットしてしまい思わぬトラブルを招く恐れもあります。確認も兼ねてこちらのコマンドを呼び出す癖をつけておきましょう。

```terminal:ターミナル
$ git commit -m "コミットメッセージ"
```
*git init, git add -A* だけで終わらないように。ここまでコマンドを呼び出してようやく一安心です。コミットメッセージ内に自分が作成、変更した箇所がわかるようなコメントを残しましょう。
　
ソースコードを管理するだけであれば、ここまでやっとけばとりあえずはOKですね。


##覚えておきたいGitコマンド
ここからは覚えておきたいGitコマンドをいくつか紹介します。

```terminal:ターミナル
$ git log
```
コミットメッセージのログを確認するコマンド。

```terminal:ターミナル
$ git log -p
```
-p を付け足すことによりコミットメッセージだけでなく、変更内容も確認することができます。

```terminal:ターミナル
$ git remote add origin リモートのurl
```
originのところには好きなリモート名を入れても大丈夫ですが、一般的にはoriginとされているので、特にこだわりがなければ変更する必要はないでしょう。

```terminal:ターミナル
$ git push origin master
```
リモート後にこちらのコマンドを呼び出すことで、登録したリモートにファイルをアップロードすることができます。

##まとめ
個人開発のみであれば、上4つのコマンドさえ覚えておけば問題ないでしょう。Gitが使えなくても開発できないということはないですが、使いこなせるに越したことはので習得しておきましょう。
VPS+CentOSに簡易的にPHP+Laravelの環境を作る


# 概要

今回たまたま客先がcentosだったので、少ないcentos力を駆使して瞬間風速的に構築。
ci環境とか皆無なので、後々やっていこう。

# 環境設定

ログイン

```
ssh root@[任意のIPアドレス]
```

少しずつやりたいことによって出る問題違うと思う。


```
//centos用
yum update
yum install --enablerepo=remi,remi-php70 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt
yum install --enablerepo=remi-php73 php-mbstring php-openssl php-xml unzip
yum install -y bash gcc make libpng-devel emacs tmux node npm libpng-devel php70-php-mbstring php-zip
yum update
//npm用
sudo npm install quasar-cli -g
```

php.ini書き換え

```
sudo emacs /etc/php.ini
```

```:php.ini
date.timezone = "Asia/Tokyo"

mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = UTF-8
mbstring.http_output = pass
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_charset = none
```

composerが無い場合


```
curl -sS https://getcomposer.org/installer | php
```

laravelのプロジェクト配下に移動してcomposerのライブラリを入れる。


```
composer install
or
composer update
```

vuejs側の対応。

```
npm install
npm run dev
```

例えば8080ポートを開ける。ポート空いてるか確認するには

```
nmap [ipアドレス]
```
で調べれる。いわゆるポートスキャン。

```
sudo firewall-cmd  --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
```

ポート空いてることを確認。


```
sudo firewall-cmd --list-all
```

ララベル起動。


```
php artisan serve --host=[ipアドレス] --port=8080
```

アクセスしてなんか動いてるはず。

http://[ipアドレス]:8080


以上　本当簡易的な環境作成。
docker使いたいー　とか　aws使いたいーとか
あると思う。
後々やっていこう。
覚えておくと良いカタカナ語

# 会社で役に立ちそうなカタカナ語
なにかと使いたがるよね...

## コンセンサス(consensus)・・・全会一致
意見の総意
webilo:一致，総意
例：
`「次の会議でコンセンサスを得てこい。」`

## アジェンダ(agenda)・・・声明？
実行するための予定表・行動計画
実施すべき重要な政治課題・政策
weblio:協議事項、議事日程、予定表
例：
`「みんなの党のアジェンダです。」`
(この場合の”アジェンダ”は”マニュフェスト”とほぼ同義)

## デフォルト（default）・・・
借金の返済が不能になったこと（債務不履行　｢さいむふりこう｣）
weblio:(義務などの)不履行、怠慢、債務不履行、(法廷への)欠席、不出場、欠場、棄権
例：
`｢返済は期待できない。デフォルトか…｣`

## マイルストーン（milestone）
各作業工程の節目（目標完了の計画日時など）
weblio:(石の)マイル標、里程標、(歴史・人生の)画期的な事件
例：
`｢プロジェクトはマイルストーンを設定すること｣`

## インセンティブ(incentive)
人のやる気を起こさせる刺激
weblio:刺激、動機、誘因、奨励金、報奨物
例：
`｢今後はインセンティブを与えることが重要だ｣`

## アテンド(attend)
介添え（かいぞえ）→側に付き添って世話をする
weblio:出席する、参列する、通う、世話をする、随行する、付き添う、看護をする、(結果として)(…に)伴う
例：
`｢アテンドを担当する田中です。よろしくお願いいたします。｣`

## パラダイム（paradigm）
現在の時代・分野において絶対的な規範とされている考え方
weblio:例、模範、典型、パラダイム、(品詞の)語形変化表
例：
`｢パラダイムは変化するものだ｣`

## オルタナティブ（alternative）
代案・二者択一
weblio:(二つのうち)どちらかを選ぶべき、二者択一の、代わりとなる、代わりの、慣習的方法をとらない、新しい
例：
`｢オルタナティブテクノロジーに関心が集まっている｣`

# 終わりに
他にもいろいろ使えそうなカタカナ語があったら随時更新していきます．

>引用
http://whatimi.blog135.fc2.com/blog-entry-17.html
https://ejje.weblio.jp/
Summernoteでaタグのリンク先を変更した時にクラス名が消える問題を解決する(暫定版)

### 解決策

修正前
https://codepen.io/qwe001/pen/LwQQzb

修正後
https://codepen.io/qwe001/pen/wVyyOR

※ 注意： 私が解決したのはあくまでクラス名の部分だけです。(私にとっては、それだけが必要な修正でしたので)
ID属性その他の値は相変わらず消えますので、それらの値が必要な人は頑張ってソース書き換えて何とかしてください。
あるいは、Summernoteの開発チームが公式に修正してくれるのを待ってください。

### 何が問題か

![62527751-b858f480-b876-11e9-9376-87cb68be046e.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130352/22dc4193-4eef-b3f2-9774-a80fcd13d855.gif)

リンク要素のURLかテキストを変更すると、
クラス名やIDその他あらゆる属性が消去される。

ソースコードを見ると、何の属性もついていないaタグを新規生成し、
そこにテキストとURLのみを代入するという記述になっているので、
変更前のタグにあったクラスだの、IDだのといった属性はすべてなかったことにされる。

これにより、デザイナーがCSSでコッテコテに作った
迫真のクソデカボタンリンクやアニメーションつきリンクも、
リンク先かタイトルを変更した瞬間にクッソしょぼい単なるテキストリンクに変身しちゃいます。

コードビューでHTMLを直接編集すれば、そんなことは起きませんが、
エンドユーザーにそんなことさせたくないですよね。

### どう解決するか

クラスの値も代入されるようにする

### その他

SummernoteにIssueをあげました。
そのうち公式がちゃんと修正してくれたらいいな～って。

https://github.com/summernote/summernote/issues/3336

私の修正した内容はこちらから見れます。

https://github.com/qwe0001/summernote/commit/aac74655a61663736f0b88933ab8cdceed76bf4d#diff-269e49da4fccd9cb44cc04fd3df3d410
51歳からのプログラミング　備忘　android Timer

簡単にタイマー。タイマーはワーカースレッド。
でもTimerTaskはいくつか信頼できない挙動があるので、Handler推奨のようです。handler.postDelayed(runnable,delayMillis)も検討ですね！

使うファイルは
・　MainActivity.java
　　Timerのインスタンスを生成
　　MyTimerのインスタンスを生成
　　TimerのscheduleAtFixedRateメソッドを作成

・　MyTimer.java
　　TimerTaskを継承
　　Handleのhandle.postメソッドを作成し、Runnable

```java:MainActivity.java
public class MainActivity extends AppCompatActivity{

       @Override 
       protected void  onCreate(Bundle savedInstanceState){
                 super.onCreate(savedInstanceState);
                 setContentView(R.layout.activity_main);
       
                 Timer   timer   = new Timer();
                 MyTimer myTimer = new MyTimer(this);
                 timer.scheduleAtFixedRate(myTimer,0,10000);
       }
}
```

プロジェクト -> app -> src -> main -> java ->

|         |              |
|---------|--------------|
|ファイル名|MyTimer       |
|superclass|TimerTask    |

```java:MyTimer.java
public class   MyTimer extends TimerTask{
       private Handler  handler;
       private Context context;
       private TIMER_STOP;

       public  MyTimer(Context context){
               handler       = new Handler();
               this.context  = context;
               TIMER_STOP    = false;
        }

       @Override 
       public void run(){
              handler.post(new Runnable(){
                   @Override 
                   public void run(){
                          Toast.makeText(context,"Toast",Toast.LENGTH_SHORT).show();
                   if(TIMER_STOP){
                      cancel();
                   }
                   }
              });
        }

        public void TimerStop(){
               TIMER_STOP = true;
        }
}
```
MyActivity.classとかから、myTimer.TimerStop()を呼び出すことで、<strong><font color="#05f">cancel()</font></strong>が実行されてタイマーが停止します。Thread停止処理で、@Override public void run() { <font color="#f55">while(KEY){ todo }</font> }でスレッドを停止する処理がありますが、<font color="#f55">Timerの実行部分でそれをすると、1タイマーごとにwhile文が無限実行されてしった</font>。なのでif(){ cancel() }を使ったのです！

cancel()はタイマーの次の実行時に処理されます。例えば、timer.scheduleAtFixedRate(my
Timer,0,1000*60*60)というタイマーセットだと、次のタイマータスクの実行時（最悪１時間後：1000*60*60）にcancel()発動とかいう感じ。

すぐさま処理を停止したくて、スレッドを破棄したくなるかもしれません。でもこれは危険です。Threadが正常に稼働してる時に、保護されているオブジェクトが、Thread破棄によって不安定な状態になってしまい、予期せぬ動作をしたりする可能性もあります。Threadから遊離してしまったオブジェクトなどを見出したり特定することは難しいので、Threadは破棄せずに、interrupt()でプログラムを設計できないか検討しましょう。
Place Holder 構文をJuliaのマクロで書く

## Scala のPlace Holder構文

[「Scalaでカリー化はあまり役に立たない」](https://qiita.com/kmizu/items/f26884c462be763d0cd3)
という水島さんの記事を読み、本題とはあまり関係なくScalaのプレースホルダー構文が便利そうだと思った。

```scala
List(1, 2, 3, 4).map(add(2, _))
```

要するに、アンダースコアで書かれた特殊な変数を引数とみなして、それを含む式をクロージャとしてくくりだす、ということなのだろう。どの範囲をくくりだすのかというのを考え出すと、実は相当セマンティクス的に微妙な気もしないでもないが、便利っぽい。

ちなみに同じような式をどこかで見たな、と思ったらC++の[BoostのLambda](https://www.boost.org/doc/libs/1_62_0/doc/html/lambda.html)だった。
後に正式に採用されたLambdaとは違って、BoostのLambdaはこんなふうに書く。

```c++
for_each(a.begin(), a.end(), std::cout << _1 << ' ');
```

`std::cout << _1 << ' '`の部分が匿名関数になっている。これもすごいよな。

## Juliaのマクロで実現


同じものは無理だけど、マクロを使えばそれっぽいものは作れそうなので書いてみた。要するに

```julia
@ph(2+_)
```
が

```julia
(sym) -> (2+sym)
```
に展開されればいいわけだ。`sym`は適当なシンボルを作る。

まずは構文木の中の`_`を、指定したシンボルに置き換える総称関数を書く。３つのメソッドで構成されていて、再帰的に構文木を下ってコピーしながらアンダースコアをシンボルに置き換える。

```julia
replaceUnderScore(a::Any, sym::Symbol) = a
    
function replaceUnderScore(a::Symbol, sym::Symbol)
    a == :_ ? sym : a
end
            
function replaceUnderScore(e::Expr, sym::Symbol) Expr
    e = copy(e)
    for i in 1:length(e.args)
        e.args[i] = replaceUnderScore(e.args[i], sym)
    end
    e
end
```

でこれを使うマクロを書けばいい

```julia
macro ph(expr::Expr)
    sym = gensym()
    replaced = replaceUnderScore(expr, sym)
    esc(:(($sym) -> $replaced))
end  
```

試してみよう。

```julia
julia> x = 10
julia> @ph(x+_)(1)
11
```
とりあえず動いたようだ。いろいろ抜けがある気がするけど。。



## まとめ

これを使うとScalaの

```scala
List(1, 2, 3, 4).map(add(2, _))
```

は次のように書ける。

```julia
[1, 2, 3, 4] .|> @ph(2 + _)
```

`.|>`というのは、パイプライン演算子`|>`を`.`でブロードキャストしたものだ。

この例の場合はブロードキャストできれいに左から右に書けるけど、フィルタリングとかはかけそうにないな。なにかうまい書き方がないだろうか。

### 追記
2019/9/5 エスケープが足りていなかったため、ローカルスコープの変数がキャプチャできないことが判明。`esc`を追加。やっぱりマクロは難しい。
AWS IAMロール, EBS, スナップショットとは イメージ [図的理解]

##用語
自分がAWSを勉強している時に理解しにくかった言葉などをイメージ(図)で理解するために作ったものです。

- IAMロール
- EBS
- スナップショット

###IAMロールとは？
AWSサービス間での<font color="orange">権限設定</font>のこと。

(例)今回はEC2[サーバ]からS3[ストレージ]に書き込む際について考えます。
IAMロールを所持して<u>いない</u>場合
![sample.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259737/11d8cfb8-cd86-8752-3c53-c27f6c8f66fa.jpeg)
もちろんですが、書き込む権限がないので書き込みに失敗します。

IAMロールを所持して<u>いる</u>場合
![sample (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259737/b9c06795-eb8f-a88e-1cce-68733980a30a.jpeg)
EC2は権限を所持しているので、S3に書き込むができます。
***

###EBSとは？
Amazon **E**lastic **B**lock **S**tore の略。
Amazon Elastic Compute Cloud(EC2) と一緒に利用することを想定されているブロックストレージ
EC2内にも記憶領域がありますが、EBSは**永続的**であるのに対しEC2内部の記憶領域はEC2本体の停止や再起動の際にデータが初期化されてしまいます。
なので、永続的に保存しておきたいデータなどはEBSに保存しましょう。
![EBS_introduction.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259737/9037c0f5-886e-b895-10f7-f0c5396c2afd.jpeg)

***
###スナップショットとは？
簡単に言うとEBSのバックアップ。
EBS内のデータをS3に保存したもの。
下の画像は[AWS マイスターシリーズの EBS の回](https://www.slideshare.net/AmazonWebServicesJapan/aws-16148274)さんから引用させていただいたものです。
![snapshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259737/d07f11ee-a2b6-9aa6-b602-35f1097df09e.png)


####参考文献
[AWS Solutions Architect ブログ](https://aws.typepad.com/sajp/2014/04/trainingfaqbest10.html)
[AWS 初心者入門 第4回](https://www.bit-drive.ne.jp/managed-cloud/column/column_04.html)
[AWS マイスターシリーズの EBS の回](https://www.slideshare.net/AmazonWebServicesJapan/aws-16148274)
EC2にGit, Python3系, Django2, PostgreSQL 自動環境構築

# 概要
AWS EC2 (Amazon Linux AMI) に、「Git, Python3系, Django2, PostgreSQL」の環境を自動構築するシェルスクリプトを作成

# 環境
 - AWS EC2 (Amazon Linux AMI)

# Github
https://github.com/kmasuda1986/scripts

# その他
 - 操作はREADME.mdを参照ください
メモ：メンテ拠点とかスマホアプリを考慮したSorry Pageの設定

この記事は
===

* AWSでいい感じにSorry Pageを表示するためのメモです

やりたかったこと
===

* AWS上のWebサービスのメンテ中にアクセスがあった時にSorry Pageを出したかったです
* ただし、下記の細かな要件を満たせるものとします

細かな要件
---
* メンテしている拠点からのアクセスの場合は通す
  * メンテ終わってサイトオープンする前に正常動作確認をしたいため
* ```/api/*```というパスにアクセスがあった場合はjson形式でメンテ中の通知をしたい
  * スマホアプリからアクセスするエンドポイントのため
* API以外へのパスにアクセスがあった場合はhtml形式でメンテ中の通知をしたい

|            | Web             | スマホアプリ          |
|------------|-----------------|-----------------------|
| その他拠点 | HTMLのSorryPage | JSONのSorryレスポンス |
| メンテ拠点 | 平常通り        | 平常通り              |

基本的な方法
===

* 基本的にはALBのルールを設定して制御します
* ```ロードバランサ＞（選択）＞リスナー＞ルールの表示/編集```から設定できます

詳細
===

* こんな感じで設定を実施します

平常時の設定
---

* 平常時は1番上に必ずマッチする条件でWebAPのターゲットグループに繋ぎます
* なので基本的には2番目以下のメンテ系の条件に行くことはありません

| 条件種別 | 条件値         | アクション     | アクション値                                                         | 備考                                   |
|----------|----------------|----------------|----------------------------------------------------------------------|----------------------------------------|
| パス     | *              | 転送           | WebApのターゲットグループ                                            | ・サイトオープン中に利用               |
| ソースIP | メンテ拠点のIP | 転送           | WebApのターゲットグループ                                            | ・サイトクローズ中にメンテ拠点から利用 |
| パス     | /api/*         | 固定レスポンス | コード: 503 <br>Content-Type: text/json <br>レスポンス本文: スマホ向けのJSON |  ・スマホ向けのSorryレスポンス         |
| パス     | *              | 固定レスポンス | コード: 503 <br>Content-Type: text/html <br>レスポンス本文: Web向けhtml      | ・Webブラウザ向けのSorryPage           |

メンテ時の設定
---

* メンテ時は平常時に1番上にあった平常運転の条件を1番下に移動しています
* 1番目でソースIPがメンテ拠点の場合の条件を定義して、平常運転と同じようにWebAPに繋いでいます
* 2番目でスマホからアクセスするパスの条件を定義し、JSONでSorryレスポンスを返却しています
* 3番目でそれ以外のアクセスの条件を定義し、WebでのSorryPageを返却しています

| 条件種別 | 条件値         | アクション     | アクション値                                                         | 備考                                   |
|----------|----------------|----------------|----------------------------------------------------------------------|----------------------------------------|
| ソースIP | メンテ拠点のIP | 転送           | WebApのターゲットグループ                                            | ・サイトクローズ中にメンテ拠点から利用 |
| パス     | /api/*         | 固定レスポンス | コード: 503<br>Content-Type: text/json<br>レスポンス本文: スマホ向けのJSON |  ・スマホ向けのSorryレスポンス         |
| パス     | *              | 固定レスポンス | コード: 503 <br>Content-Type: text/html <br>レスポンス本文: Web向けhtml      | ・Webブラウザ向けのSorryPage           |
| パス     | *              | 転送           | WebApのターゲットグループ                                            | ・サイトオープン中に利用               |

運用
===

* こう定義しておくことで、平常運転の条件を1番上に持ってくるか、1番下に持ってくるかでメンテ中に切り替えることができます

その他
===

* 条件の設定にはデフォルトの条件が入っていますが、この運用の場合その条件を使うことはありません

終わりに
===

* これで色々都合のいいメンテ状態に簡単に切り替えられますね
Rails6 のちょい足しな新機能を試す64（db:seed 編）

# はじめに

Rails 6 に追加されそうな新機能を試す第64段。 今回は、 `db:seed` 編です。
Rails 6 (と Rails 5.2.3以降)では、 `rails db:seed` 実行時は、inline ActiveJob job adapter が使われるようになりました。
デフォルトの `async` だと seed の中で、 ActiveStorage の画像ファイルを読み込んで attach しようとすると seed が終了しないためらしいです。
Rails 5.2.3 にも、今回の修正は反映されています。


Ruby 2.6.3, Rails 6.0.0.rc1, Rails 5.2.3 で確認しました。Rails 6.0.0.rc1 は `gem install rails --prerelease` でインストールできます。
手抜きになりますが、Rails 5.2.2.1 以前は確認しておりません。悪しからず :bow:

```shell
$ rails --version
Rails 6.0.0.rc1
```

# 準備

今回は、 [Rails6 のちょい足しな新機能を試す15（Active Storage編）](https://qiita.com/suketa/items/2daad87d8c22737f5582) をベースに作業します。

# seeds.rb を編集する

seeds.rb で avatar つきのUserを登録します。
`ActiveJob::Base.queue_adapter` も確認します。
あらかじめ、画像ファイルは用意しておきます。

```ruby:db/seeds.rb
p ActiveJob::Base.queue_adapter
user = User.create(name: 'Taro')
user.avatar.attach(io: File.open(Rails.root.join('db/seeds/fixtures/gang.png')), filename: 'gang.png')
```

# seed データを登録する

seed データを登録します。 `InlineAdapter` が使われていることがわかります。

```shell
$ bin/rails db:create db:migrate db:seed
...
#<ActiveJob::QueueAdapters::InlineAdapter:0x000055b36f552d00>
```

# その後の修正

こちらも試していないのですが、その後、 `db:seed` 実行時に無条件で、 `:inline` に変更してしまうのは、よろしくないということで、 `:async` のときだけ、 `:inline` に変更するようになる模様です。
なお、この修正は、 Rails 5.2.3 には含まれておらず、 5.2.4 以降に反映されるものと思われます。

# 試したソース

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try064_seed_inline_active_job


# 参考情報

* [What is new in Rails 6.0](https://bogdanvlviv.com/posts/ruby/rails/what-is-new-in-rails-6_0.html)
* [Seed database with inline ActiveJob job adapter](https://github.com/rails/rails/pull/34953)
* [Only override async adapter when seeding](https://github.com/rails/rails/pull/35905)
* [Allow loading seeds without ActiveJob (~> 5.2.3)](https://github.com/rails/rails/commit/b08daf48dac4e98076a6eaad5cddc8405ec91af9)
* [5.2 stable ChangeLog](https://github.com/rails/rails/blob/5-2-stable/railties/CHANGELOG.md)
【制御工学】制御工学シミュレーションのまとめ

#概要
MATLABやScilabなどのソフトウエアを使うと，制御シミュレーションを行うことができますが，
実はPythonでも「Python-control」というライブラリを使えば似たようなことができます．

今回はPython-controlの機能をまとめていこうと思います．

#動作環境
- Windows10(64bit)
- Python 3.7.2
- control 0.8.2

# 伝達関数の定義
まずは，(古典)制御で核となる伝達関数を定義します．
使う関数はtf()です．

伝達関数は以下のようにします．

```math
\frac{80}{s^3+8s^2+17s+10}
```

```tf.py
"""伝達関数モデルの作成を行うプログラム"""
from control.matlab import *

num = [80]              # 分子(numurator)の係数 80
den = [1, 8, 17, 10]    # 分母(denominator)の係数 s^3+8s^2+17s+10
sys = tf(num, den)      # 伝達関数(transfer function)モデルの作成
print(sys)
```

実行結果は以下のようになります．

```py
          80
-----------------------
s^3 + 8 s^2 + 17 s + 10
```

# ボード線図
続いて，制御に限らず何かと頻出のボード線図を描いてみましょう．
bode()を使います．

```py:bode.py
"""ボード線図を描画するプログラム"""
from control.matlab import *
from matplotlib import pyplot as plt

num = [80]              # 分子の係数
den = [1, 8, 17, 10]    # 分母の係数
sys = tf(num, den)      # 伝達関数モデルの作成
bode(sys)               # ボード線図のプロット
plt.show()
```

実行結果は以下のようになります．

![bode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433790/7f234eca-b697-1d9a-d3da-0b945bc58c0d.png)


# ナイキスト線図
続いて，ゲイン余裕や位相余裕を調べるときに使ったりするナイキスト線図を描いてみましょう．
nyquist()を使います．

```py:nyquist.py
"""ナイキスト線図を描画するプログラム"""
from control.matlab import *
from matplotlib import pyplot as plt
    
num = [80]              # 分子の係数
den = [1, 8, 17, 10]    # 分母の係数
sys = tf(num, den)      # 伝達関数モデルの作成
nyquist(sys)            # ナイキスト線図のプロット
plt.show()
```

実行結果は以下のようになります．

![nyquist.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433790/1080b819-3788-46aa-0e7c-38040b45fe4c.png)

# 根軌跡
続いて，根軌跡も描いてみましょう．根軌跡とは一巡伝達関数について，そのゲイン定数を$0$から$\infty$に変化したときに特性根が複素平面を描く軌跡です．

```py:rlocus.py
"""根軌跡を描画するプログラム"""
from control.matlab import *
from matplotlib import pyplot as plt
    
num = [80]            # 分子の係数
den = [1, 8, 17, 10]  # 分母の係数
sys = tf(num, den)    # 伝達関数モデルの作成
rlocus(sys)           # 根軌跡(root locus)のプロット
plt.show()
```

実行結果は以下のようになります．

![rlocus.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433790/e58ec9a5-ceb1-3e5a-e742-1d3cc4508444.png)


# ゲイン余裕・位相余裕
続いて、安定余裕を求めてみます．
margin()を使います．

```py:margin.py
"""ゲイン余裕・位相余裕を求めるプログラム"""
from control.matlab import *
from matplotlib import pyplot as plt
    
num = [80]                    # 分子の係数
den = [1, 8, 17, 10]          # 分母の係数
sys = tf(num, den)            # 伝達関数モデルの作成
gm, pm, wg, wp = margin(sys)  # ゲイン余裕・位相余裕の計算
print('gm = ' + str(gm))      # ゲイン余裕
print('pm = ' + str(pm))      # 位相余裕
print('wg = ' + str(wg))      # ゲイン交差周波数
print('wp = ' + str(wp))      # 位相交差周波数
```
実行結果は以下のようになります．

```py
gm = 1.5750000000000002
pm = 14.527122056875015
wg = 4.123105625617661
wp = 3.306098924309049
```

ゲイン余裕が3.95dB程度になるはずなので何かがおかしい気がします．
わかり次第追記します．

#まとめ
いかがだったでしょうか？Python-controlを使うだけでも制御シミュレーションの色々なことができました．
ナイキスト線図などは人間が描くのは難しいですが，Pythonを使えば，比較的簡単に系の挙動を把握することができますね．
コードに関してなにか建設的なフィードバックなどあればコメントいただけると助かります．
gensimのmodelファイルをloadするとNo module named 'numpy.random._pickle'が起こる件

バージョン`3.8.0`の`gensim`を使って作成された`model`ファイルを、バージョン`3.7.2`（おそらく`3.7`系？）の`gensim`で`load`するとエラーが起こります。

# gensimのバーションの確認
```python
import gensim
gensim.__version__
```

```
'3.7.2'
```

# loadでエラーが発生
```python
from gensim.models import word2vec
w2v_model = word2vec.Word2Vec.load('by_latest_ver.model')
```

```
ModuleNotFoundError: No module named 'numpy.random._pickle'
```

# 解決策

`gensim`のバージョンを`3.8.0`にあげるとエラーが発生しません。
要は同じバージョンの`gensim`で`model`の`save`や`load`をしろということですね。
「Symantec Endpoint Protection Manager が Symantec Endpoint Protection Manager コンテンツカタログ 14.2 を更新できませんでした。 」の対応方法

2019年8月1日ごろから以下のシステムイベント通知メールがSEPMから届くようになった。

<pre>
通知イベント
サーバーシステムイベント
時間 	サイト 	サーバー 	重大度 	イベントの種類 	説明 
2019/08/01 00:41:43 	[サイト名] 	[ホスト名] 	警告 	LiveUpdate コンテンツを更新できませんでした 	Symantec Endpoint Protection Manager が Symantec Endpoint Protection Manager コンテンツカタログ 14.2 を更新できませんでした。 
</pre>

改変対策機能の不具合っぽい？ので下記サイトに記載の回避策にてとりあえず対応できた。

・英語
Endpoint Protection Manager LiveUpdate cannot update Content Catalog
https://support.symantec.com/content/unifiedweb/us/en/article.TECH255732.html

・日本語
Endpoint Protection Manager の LiveUpdate がコンテンツカタログを更新できない
https://support.symantec.com/content/unifiedweb/jp/ja/article.TECH255732.html
strongswanでログを残す方法

参考資料
--------------------
[Logger Configuration (strongswan.org)](https://wiki.strongswan.org/projects/strongswan/wiki/LoggerConfiguration)

前提条件
--------------------
- Ubuntu 16.04 (多分18.04以降も可)
- strongswan 5.x.x

TL;DR
--------------------
`/etc/strongswan.d/charon-logging.conf`に以下の設定を書いて、
`sudo ipsec restart`または`sudo strongswan restart`でロギング開始されます。
(コマンド名が`ipsec`か`strongswan`かは環境やバージョンに依存します)
**複数人でVPN使用中の場合は、誰かがVPN接続してるかどうか`sudo ipsec status`で調べて使用中の人に「再起動していーい？」と聞いてからstrongswanを再起動しましょう**

```
charon {
    filelog {
        charon {
            path = /var/log/charon.log
            time_format = %b %e %T
            ike_name = yes
            append = no
            default = 1
            flush_line = yes
        }
        stderr {
            ike = 2
            knl = 3
        }
    }
    syslog {
        identifier = charon-custom
        daemon {
        }
        auth {
            default = -1
            ike = 0
        }
    }
}
```

strongswanのバージョンが違うとファイルログの書き方が変わっているのでご留意の事。

```
charon {
    filelog {
        /var/log/charon.log {
            time_format = %b %e %T
            ike_name = yes
            append = no
            default = 1
            flush_line = yes
        }
    }
}
```

保存できるログの種類
====================

ファイルログ
--------------------
- ファイルパスを指定して、ログを保存できます
- TODO: ローリングファイル名が使えるかどうか


syslog
--------------------
- ご存知`/var/log/syslog`に1行ずつログが書き込まれます
- `identifier = charon-custom`で指定した名前(この場合は`charon-custom`)がログに書き込まれます
- `less /var/log/syslog`でログを見ましょう


書き込み権限について
--------------------
ファイルログについては、`strongswan`(`ipsec`)を実行してるプロセスの権限が、
ファイル書き込み先ディレクトリに合わなければ、出力されないはずです。
権限に関わらず、一旦ファイルログの出力を見たいだけであれば、`/tmp/charon.log`のように`/tmp`ディレクトリ指定をお勧めします。
(**誰でも書き込めるディレクトリ＝ログの改竄が簡単**でもあるので、VPN接続ログの出力先は、権限を限定しておいた方が良いです)

syslogについては、権限設定せずとも書かれるはずです。

(はず→まだ検証してないので自信が無い表現)

`LogLevel`について
--------------------
普段使う`LogLevel`は`0`か`1`がお勧めです。数値が大きくなるほど、ログ出力量が増えます。
- `-1`: ログ出力しない
- `0`: 最低限のログ
- `1`: 少し詳しいログ
- `2`～`4`: デバッグ、調査用のログ

メモ
--------------------
- strongswan公式サイトの仕様記述は、バージョン毎の違いの細かさが分かりにくい事が多いので困る
(行間を読む必要がある場合も多め)
Date型の日付をjsp内でフォーマット指定して表示する



画面にデータを渡す時点ではDate型だが、jspを描画時にdate→String(しかもフォーマット指定)に変換して表示する方法。
> HTMLの`<input type="date">`のvalueは`yyyy-MM-dd`のフォーマットで値を渡してやらないといけないみたいです。


```html

<input type="date" class="w120" value="<fmt:formatDate value="${mealCancel.mealCancelDate}" pattern="yyyy-MM-dd" />">


```

単純でした。valueにjstlの`<fmt:formatDate>`を埋め込んで、フォーマットを指定すると上手くいきました:relaxed:
楽チン〜:point_up_tone1:
visualforce でdivタグに xmlns を定義すると、なぜか表示されなくなったので解決した

`visualforce` で `vue.js` を使う際に、id付きのdivと一緒に `xmlns:` を定義すると、これ以降のoutputPanelがレンダリングされなくなった。

```HTML
<apex:component >
  <apex:outputPanel rendered="false">
    <div id="xxx" xmlns:v-bind="http://vue.org" xmlns:v-on="http://vue.org">
      :
    </div>
  </apex:outputPanel>
  <apex:outputPanel rendered="true">
    <p>表示されない</p>
  </apex:outputPanel>
</apex:component>
```

原因は不明だけど、xmlns:の定義を別divで切り出すことで解決できました。

```HTML
<apex:component >
  <apex:outputPanel rendered="false">
    <div id="xxx">
      <div xmlns:v-bind="http://vue.org" xmlns:v-on="http://vue.org">
        :
      </div>
    </div>
  </apex:outputPanel>
  <apex:outputPanel rendered="true">
    <p>表示される</p>
  </apex:outputPanel>
</apex:component>
```

原因やもっとよい解決方法がある場合は、教えて下さい...