OmniAICreator/Qiita-1.07M huggingface dataset:
JSに列挙体を実装

# 概要

先日自作したsr-enumというnpmパッケージの紹介になります。sr-enumはJavaScriptで列挙体を扱うためのパッケージで、2019年7月からnpmに公開しています。

# 何が便利なのか

状態の管理が楽になると思います。

## 例

### トークンの有効性を検証する

未検証`Unverified`・検証中`Verifying`・有効`Valid`・無効`Invalid`の3状態をとるTokenクラスを作成して、トークンの状態に応じて処理を分ける場合を考えます。

```js
const Token = new Enum("Unverified", "Verifying", "Valid", "Invalid");
```

変数`token`に未検証`Unverified`なトークンを代入します。

```js
let token = new Token.Unverified("トークン");
```

`token`に未検証`Unverified`なトークンが代入されている場合、トークンの有効性を検証します。

```js

// トークンが未検証な場合、onTokenIsUnverifiedを呼び出す
token = match(token) ({
    Unverified: onTokenIsUnverified,
    default: token
});

function onTokenIsUnverified( unverifiedToken ) {
    // トークンが未検証な場合の処理

    // 何らかの非同期な検証処理
    verifyToken( unverifiedToken  )
        .then( validToken => { token = new Token.Valid( validToken ) } )
        .catch( invalidToken => { token = new Token.Invalid ( invalidToken  ) };

    // 検証中トークンを返す
    return new Token.Verifying( unverifiedToken );
}
```

### コンテンツを非同期で読み込む

あるコンテンツを非同期で読み込むときに、読み込みが完了しているのかどうかを判定するために、読み込み中`Loading`・読み込み済み`Loaded`の2状態を取る列挙体を考えます。

```js
const Content = new Enum( "Loading", "Loaded")
```

コンテンツの状態に応じて内容を変更するような、ReactComponentを作ります。

```js
const Content = props =>
    match(props.content)({
        Loading: _ => /*ロード中の表示内容*/,
        Loaded: content => /*ロード後の表示内容*/
    });
```

# インストール

```bash
npm install sr-enum
```

# 機能

- 列挙体（タグ付きバリアント）の作成
- パターンマッチ

## require / import

必要に応じて、いらないものは消して下さい。

```js
const {Enum, match, maybe, option, result, Maybe, Option, Result} = require("sr-enum");
```

```js
import {Enum, match, maybe, option, result, Maybe, Option, Result} from "sr-enum";
```

## 列挙体の作成

```js
const 列挙体名 = new Enum( 列挙子名, 列挙子名, ...);
```

例

```js
const Request = new Enum( "Get", "Post", "Delete" );
```

## 列挙子の作成

```js
new 列挙体名.列挙子名( 任意の値 );
```

例

```js
const request = new Request.get( "/api/hoge" );
```

## パターンマッチ

### 単純な分岐

```js
match(列挙子が代入された変数)({
    列挙子名: 値を受け取る変数 => 処理,
    列挙子名: 値を受け取る変数 => 処理,
    default: デフォルト値
)};
```

例

```js
match( request )({
    Get: url => /*処理*/,
    Post: url => /*処理*/,
    default: /*その他の場合*/
});
```

### 複雑な分岐

```js
match(列挙子が代入された変数)(
    [パターン, 値を受け取る変数 => 処理],
    [パターン, 値を受け取る変数 => 処理],
    [match.default, デフォルト値]
);
```

例

```js
match( request )(
    [Request.Get(Url.Valid()), validUrl => /*処理*/],
    [Request.Get(Url.Invalid()), _ => /*エラー処理*/],
    [Request.post(), url => /*処理*/],
    [match.default, デフォルト値]
);
```

### `if let`ライクな使用

```js
const 変数 = パターン(列挙子が代入された変数);
if(変数 !== unMatched) {
    パターンに合致したときの処理
}
```

例

```js
const url = Request.Get(Url.Valid())(request);
if( url !== unMatched ) {
    /*処理*/
}
```

# 詳細

[npm](https://www.npmjs.com/package/sr-enum)

[github](https://github.com/SoundRabbit/SR_Enum_JS)
PWAで丸いアイコンを利用する方法

## 1. 最近のアプリアイコン

最近のアプリは以下の画像のようにアプリのアイコンが丸くなっている。
![アプリアイコン](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177027/a1bb5e70-5738-f1a5-a91d-8e6fdac201e4.png)

## 2. しかしPWAの情報には載ってない……？
しかし、PWAのアイコンの登録方法には特に方法が書いていない。
https://developers.google.com/web/fundamentals/web-app-manifest/#icons
![googleのmanifest](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177027/bf88e83f-a20b-02b6-e091-72c4e36d4f5c.png)
その為、このようなアイコンになってしまう。
![pwa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177027/f4ae7e4c-7d1a-3484-eb67-9403a69f073e.png)

ググっても特に情報がなく、PWAでは出来ないと考えていた。

## 3. W3Cを見るとあった。
~~が、W3Cを見るとにそれらしいのが載っていた。
https://www.w3.org/TR/appmanifest/#icons-member
https://www.w3.org/TR/appmanifest/#dom-imageresource~~
![icons2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177027/57df3e79-7663-ea0a-d0be-4d781c5c9148.png)

### 4. PWAで丸いアイコンを利用する方法

2019/09/03、調査の結果以下は不要。
~~3のURLを参照し、以下のようにmanifest.jsonのicons内にあるpurposeメンバーにmaskableを設定すれば丸くなる。~~
192x192と512x512の丸いアイコン(不要部分は透過処理)をmanifest.jsonに記載するのみで問題なし。

```manifest.json(iconsの部分のみ)
"icons": [
      {
        "src": "ico/ico-192.png",
        "sizes": "192x192",
        "type": "image/png"
      },
      {
        "src": "ico/ico-512.png",
        "sizes": "512x512",
        "type": "image/png"
      }]
```

192x192と512x512の丸アイコンのみ追加した結果、このようになった。
![chanmo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177027/5036097c-c875-9db9-956a-b786bcb2eecd.png)


## 制限事項
2019/09/03 調査結果より削除。
~~この方法を行うと、「ホーム画面に追加」というポップアップがでなくなり、上のChromeのアイコンも消えない。(挙動としてはスプラッシュ画面が出たり、アドレスバーが出なくなるのでPWAっぽい見た目にはなる。)~~

~~理由としては、PWAのiconは
「少なくとも144x144の四角いアイコンが必要※purposeを指定していればanyにする事」
というルールがある為。
しかしルールに則り、144x144の四角(anyか無指定)でアイコンを追加してしまうと、その設定が勝ってしまい丸アイコンとならない。~~

~~9/1：追記
ちなみにpurposeは「unordered set of unique space-separated tokens」なので、"purpose":"maskable any"と指定すれば行けるかと思ったがダメだった。
pwaで「インストールを促すポップアップが出る」かつ「アイコンを丸くする」方法を知っていたら誰かコメント下さい。~~
VSCodeでRESTクライアントを使って効率的にAPIを呼び出す。


#VSCodeでRESTクライアントを使って効率的にAPIを呼び出す
今まではPostman（https://www.getpostman.com/） を使ってAPIとの通信を確認していたがVSCodeのほうが超簡単で便利だった。
簡単に説明すると「エディタからcURLコマンドを簡単に送信できるよ。」ってこと。

##拡張機能(RESTクライアント)をインストールする
サイドバーのEXTENSIONS(Ctrl+Shift+X)を選択し、「Rest  Client」を検索する。

インストールしたらこんな感じ
<img width="960" alt="001.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31363/ae3a48c7-3aa5-1ee0-f03b-54bf87557d49.png">


##拡張機能RESTクライアントの使い方
OverViewにて確認してください。
https://marketplace.visualstudio.com/items?itemName=humao.rest-client

※ここで確認できる内容以上のことは記載していないです。



##GETしてみる
.httpか.restファイルに「https://www.yahoo.co.jp/」 を書く。
入力すると**Send Request**って行が勝手に出てくる。

<img width="960" alt="002.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31363/cd34b6b6-4756-f8b5-82d8-34b983220483.png">

**Send Request**を押すとリクエストが送信され、右側にレスポンスが表示される。
レスポンスの時間も表示されて便利。

<img width="960" alt="003.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31363/cf0acbbb-19c4-02be-706d-5e0f8f92b12e.png">

##POSTしてみる

Getと同じようにリクエストを書くと**Send Request**が表示される。

<img width="960" alt="005.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31363/30f676f5-51a1-b8a3-b3cc-999c108ec71c.png">

##複数のリクエストを書く場合
**###**で区切ることで複数リクエストを書いておくことができる。

<img width="960" alt="004.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31363/5e5c31d3-2196-1cf3-2785-b3a04ff85aef.png">

##まとめ
これで効率的にAPI開発ができるはず。
Leetcode #636: Exclusive Time of Functions

```swift
func exclusiveTime(_ n: Int, _ logs: [String]) -> [Int] {
    var answer = Array(repeating: 0, count: n)
    var stack = [Int]()
    var pretime = 0
    for i in stride(from: 0, to: logs.count, by: 1) {
        let components = logs[i].components(separatedBy: ":")
        let function = Int(components[0])!
        let timestamp = Int(components[2])!
        if stack.isEmpty {
            stack.append(function)
            pretime = timestamp
        } else {
            if components[1] == "start" {
                let top = stack.last!
                answer[top] += (timestamp - pretime)
                pretime = timestamp
                stack.append(function)
            } else {
                let top = stack.removeLast()
                answer[top] += (timestamp - pretime + 1)
                pretime = timestamp + 1
            }
        }
    }
    return answer
}
```
『RubyOnRails』enumの使い方

#初めに
プログラミングを始めて4ヶ月の初学者です。
今回enumを使う機会があったのでメモを残します。

#環境
・Ruby '2.3.8'
・Rails '5.2.3'

#emunとは
enum（イーナム）はRails4.1から導入された機能です。

enumを使用すると以下の様な事が出来ます。
DBの中では数字を保存させる。
Viewでは文字を表示させる。

例：日本というテーブルに地方というカラムがあったとします。
enumを使用しない場合は、地方カラムに関東、関東、九州、四国の様に文字が登録されます。
しかし、enumを使用した場合は関東は１、関西は２、四国は３、九州は４と定義する事で、DBの中は１、１、４、３の様に保存され、Viewでは対象の文字を表示させる。

#emunの利点
・データ型をintegerにするとDBに数字で登録されるが、数字だけだと数字が持つ意味が共有出来ない。
一人で開発する時は自分だけが意味を理解していればいいが、チーム開発だとチーム内で意味が理解できていないといけない。
そこで、enumを使用する事で数字が何を表しているかがチーム内で共有出来る。

#emunの使用方法（モデル編）
対象にモデルに記述します。
今回はroomというテーブルのcategoryカラムにenumを使用したいと思います。

```ruby:room.rb
enum category: { 喜び: 0, 悲しみ: 1, 不思議: 2, 憧れ: 3, 恐怖: 4, 後悔: 5, 期待: 6, 怒り: 7 }
```

これで、数字と文字を関係付ける事ができました。

#emunの使用方法（view編）
今回はプルダウン形式で表示させたいと思います。

```ruby:room.rb
<%= form_for(@room) do |f| %>
　　<%= f.select :category, Room.categories.keys.to_a, {} %>
<% end %>
```

これでview側で表示させる事が出来ます。
<img width="730" alt="スクリーンショット 2019-08-23 0.00.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/453605/e792c60a-d4c2-5486-b1de-e73f6d9aa49d.png">



#最後に
分かりにくい記事かもしれませんが、初学者の助けになれば幸いです。
Rails6 で action_text の画像が表示されない?!の対処した方法

Rails6 がリリースされましたので、早速、action_text を触ってみました。
そうしたところ、アップロードした画像がview/〇〇〇/showで表示されない?!という現象が起きましたので、その際に表示させる為におこなったことを記します。
※ちなみに開発環境(ローカル)で起こったことなのでWebサーバー上では問題ないのかもしれません。

## 開発環境
- Window10
- WSL(Windows Subsystem for Linux)
- Ruby2.6.3
- Rails 6.0.0  


## 結果　WSLでimagemagickをする
おそらく、action_textをview/〇〇〇showで表示する際に画像データにリサイズがかかっているのですが、環境にimage_magikがインストールされていないとmini_magickがちゃんと働かず表示されなくなるようです。
※active_storageで普通には画像が表示されるのに、.variantを使用したら画像が表示されなくなったので、そこから当たりをつけました。

参照: [Railsのactive_storageとmini_magick使ってみる](https://qiita.com/sibakenY/items/e550166970e84d96e16e)

```
sudo apt-get install imagemagik
```
で環境にインストール。
その後、無事に表示されました。

合せてactive_storageの.variantも使えるようになります。

```
# Use Active Storage variant
gem 'image_processing', '~> 1.2'
```
Gemfileでコメントを外します。そして、

```
bundle install
```
※下記のmodelは、利用しているモデル名、columnは、モデルで、has_one_attached, やhas_many_attachedをしているカラム名に置き換えてください。

```
<%= image_tag model.column.variant(resize: '100x100') %>
```
そうすると、resize: で指定したサイズに画像が変換されるかと思います。

---

画像が表示されなくて、ちょっとビックリしましたので、もし同じような状況になった方は試してみてください。

action_text や active_storeage の使い方は下記などご参照いただければ良いかと思います。

- [Active Storage の概要](https://railsguides.jp/active_storage_overview.html)
- [Action Text の概要](https://railsguides.jp/action_text_overview.html)
- [ゼロから10分でブログが作れる！Rails 6の新機能「Action Text」を試してみた](https://tech.libinc.co.jp/entry/rails6_action_text)
- [【Rails 5.2】 Active Storageの使い方](https://qiita.com/hmmrjn/items/7cc5e5348755c517458a)
[Swift 5]CodableでJSON内の日付データをDate型に変換するときの拡張。ミリ秒付きISO8601など


Codable(Decodable)とJSONDecoderを使ってJSONファイルを構造体（Struct)に変換するとき、

```json
{
  "updatedAt":"2019-08-14T04:04:30+09:00",
}
```

といった文字列がJSONに含まれているとします。

```ResponseStructure.swift
struct ResponseStructure: Decodable {
  let updatedAt: Date
}
```

というstructを用意して、

JSONDecoderでデコードすれば…

```SampleReposotory.swift
let decoder = JSONDecoder()
do {
    let response = try decoder.decode(ResponseStructure.self, from: data)
    print(response)
    
} catch let error {
    print(error)
}
```

きちんと自動でDate型に変換してくれます。

しかし、

```json
{
  "updatedAt":"2019-08-14T04:04:30.000+09:00",
}
```

といった例えばミリ秒付きの日付には対応していないので、拡張して対応する必要があります。

## DateFormatterを拡張する

```DateFormatter+.swift
extension DateFormatter {
    /// ミリ秒付きのiso8601フォーマット e.g. 2019-08-22T09:30:15.000+0900
    static let iso8601Full: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ"
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.timeZone = TimeZone(secondsFromGMT: 0)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        return formatter
    }()
}
```

extensionでDateFormatterを拡張して、

```SampleReposotory.swift
let decoder = JSONDecoder()
do {
    let response = try decoder.decode(ResponseStructure.self, from: data)
    decoder.dateDecodingStrategy = .formatted(.iso8601Full)  // 追加
    print(response)
    
} catch let error {
    print(error)
}
```

JSONDecoderの`dateDecodingStrategy`プロパティで`.formatted(.iso8601Full)`と指定すればOKです。

## 拡張のもう一例（"20190822093015"みたいな形式）

`20190822093015`のような日付8桁、時間6桁の場合のフォーマット例です。

```DateFormatter+.swift
extension DateFormatter {
  /// 日付8桁・時間6桁のフォーマット e.g. 20190822093015
    static let yyyyMMddHHmmss: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyyMMddHHmmss"
        formatter.calendar = Calendar(identifier: .iso8601)
        formatter.timeZone = TimeZone(secondsFromGMT: 0)
        formatter.locale = Locale(identifier: "en_US_POSIX")
        return formatter
    }()
}
```

ここでいう`yyyyMMddHHmmss`の意味は、
yyyy = 年
MM = 月
dd = 日
HH = 時
mm = 分
ss = 秒
になります。

## ソースコード

コード全文はGitHubに置いてあります。

[Riscait/Extensions | GitHub](https://github.com/Riscait/Extensions)

## 参考

https://useyourloaf.com/blog/swift-codable-with-custom-dates/
[Swift 5]画面を縦スクロールした時にNavigationBarを隠したり出したり（UIScrollViewDelegate）

縦スクロールされたとき、NavigationBarをスッと隠すアニメーション、かっこいいですよね。
コンテンツ表示を広くとれるのでユーザーにとっても嬉しい挙動だと思います。

UITableView等のUIScrollViewを親に持っているViewを使っている場合は以下のように書くだけで簡単に作用します。

`delegate`は設定してあると思いますが、確認しておきましょう。※詳しくは後述

```ViewController.swift
final class ViewController: UIViewController {

    // スクロールでNavigationBarを隠す
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let isBarHidden = scrollView.panGestureRecognizer.translation(in: scrollView).y < 0
        navigationController?.setNavigationBarHidden(isBarHidden, animated: true)
    }
}
```

ただし、ScrollViewを使用していない、UIStackViewやUILabel、UIButtonなどだけで構成された画面の場合はもう一手間必要です。

`UIScrollViewDelegate`に適合する必要がありますので、以下のように書きましょう。

```ViewController.swift
final class ViewController: UIViewController {
    // 省略
}

extension ViewController: UIScrollViewDelegate {
    // スクロールでNavigationBarを隠す
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let isBarHidden = scrollView.panGestureRecognizer.translation(in: scrollView).y < 0
        navigationController?.setNavigationBarHidden(isBarHidden, animated: true)
    }
}
```

##追記：delegateの追加の必要な場合もある
例えば、単一のUITextViewで構成されたViewControllerの場合は、delegateを繋いでおく必要がありますのでご注意を。
StoryboardでUITextViewからViewControllerへcontrolボタンを押しながらドラッグし、`Outlets`の`delegate`を選べばOKです。
![スクリーンショット 2019-08-23 14.12.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54170/cdcb10fe-3287-47a1-b4f9-b212028d714c.png)

以上です。

##参考
https://qiita.com/naoyawatanabe/items/8270e8ec08f46d4d28aa
【金沢工大】 LinuxからVPNを使う方法　bashでコマンド一発でログイン

# 金沢工業大学のVPNにLinuxから繋ぐ方法 bashでコマンド一発でログイン

GitHubにこんなソースコードが有ります。openfortivpnというらしいです。
https://github.com/adrienverge/openfortivpn

openfortivpnリポジトリは、ホームディレクトリ（つまり /home/username/）に配置してください。配置した後のパスは、/home/username/openfortivpn/のようになります。

次に、expectというパッケージをapt-getでインストールします。

```bash
sudo apt-get install expect
```

openfortivpnはconfigファイルを書くことでも設定できるそうですが、私は面倒なのでbashのスクリプト書きました。（苦笑

```bash

#!/bin/sh

PW="my_linux_sudo_password"
VPN_PW="my_vpn_password"
expect -c "
spawn sudo /home/username/openfortivpn/openfortivpn ras2.kanazawa-it.ac.jp:10443 -u a1234567
expect \"username:\"
send \"${PW}\n\"
expect \"password:\"
send \"${VPN_PW}\n\"
set timeout 10
"
```
my_linux_sudo_passwordに、linuxのsudoパスワードを、
VPN_PWにvpnの申請時に登録した自分のパスワードを入力します。

a1234567となっている部分は、自分の学籍番号に置き換えてください。

設定が終わったら、このスクリプトをVPNforticlient.shなど適当な名前で保存して、ホームディレクトリにでも配置します。

最後に、接続をテストします。

```bash
bash VPNforticlient.py
```

終わり。
WordPressを(レンタルサーバーで)実運用する際の注意点

# 背景

悲しいながらWordPressをレンタルサーバーで運用する案件が出てきました。

## まとめ

- 使えるならFTPよりもSFTP
- バックアップファイルはすぐに削除する
- 可能なら2段階認証をかける
- 管理ログイン画面(wp-login.php)、設定ファイル（wp-cofig.php）、管理ディレクトリ配下(/wp-admin)はBasic認証とIP制限をかける
- WordPressは常に最新版に更新する
- プラグインも常に最新版に更新する
- 管理者ID・投稿者IDを非表示にする
- RestAPIをOFFにする

## 使えるならFTPよりもSFTP

FTPだとUserとPasswordがバレたら簡単に乗っ取られてしまいます。
可能であればと言うか可能な限りSFTPを推奨します。

## バックアップファイルはすぐに削除する

FTPやSFTPだとバックアップファイルに `Hoge.php--` みたいなのを一時的に置く場合が多々あると思います。
しかしながらWordPressは全てのファイルが基本ドキュメントルート配下です。拡張子が `.php`じゃない場合は、閲覧可能です。バックアップファイルはすぐに削除しましょう。~~拡張子が.php--とかそもそも~~

## 可能なら2段階認証をかける

万が一管理者IDとパスワードが漏れても、2段階認証を実施していれば、基本的に乗っ取りはされません。~~多分~~

## 管理ログイン画面(wp-login.php)、設定ファイル（wp-cofig.php）、管理ディレクトリ配下(/wp-admin)はBasic認証とIP制限をかける

管理会社・運営会社・開発会社が分れていて、2段階認証ができない場合もあります。
その場合は管理ログイン画面(wp-login.php)、設定ファイル（wp-cofig.php）、管理ディレクトリ配下(/wp-admin)はBasic認証とIP制限をかけるようにしましょう。

## WordPressは常に最新版に更新する
## プラグインも常に最新版に更新する

言わずもがな。常に脆弱性が発見されているので、更新しましょう。

## 管理者ID・投稿者IDを非表示にする

`${domain}/?author=${id}`をつけると、デフォルトで構築されているサイトの管理者ID見えます。またPostにも投稿者IDが表示されます。
[こう言うの](https://www.wpbeginner.com/wp-themes/how-to-remove-author-name-from-wordpress-posts/)や[こんなサイト](https://blog.saboh.net/authorpagenone/)を参考に、管理者ID・投稿者IDを非表示にしましょう。

## RestAPIをOFFにする

余計なものが全部丸見えになるので、OFFにしましょう。

## そもそも

~~その案件WordPress必要ですか？~~

## 参考

https://www.wpbeginner.com/wp-themes/how-to-remove-author-name-from-wordpress-posts

https://blog.saboh.net/authorpagenone

良い情報があれば教えてください。

## 追加

良参考記事
[Wordpressがいかに脆いツールかKali Linuxを使い説明 - 脆弱性診断](https://qiita.com/y-araki-qiita/items/4b9b367ec4853a6dcdf8)
WordPress5.2.2+CentOS7+PHP7.4+Apache2.4+mariadb10

# はじめに
WordPressに関わる機会があったので立ててみたら思ってたよりハマった。
ちなみに初めて立てた。
情報は多いが、古い情報も多かったので作業ログを残す。

# 作業ログ
今回はGCEインスタンスに立てたけど、どこで立てても一緒だと思う。

## apacheとphp7.4のインストール
```
$ sudo su -
# yum -y install epel-release
# yum -y install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
# yum -y install httpd php74 php74-php php74-php-mysqlnd
```

## mariadbのインストール
```
# curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | sudo bash
# yum install MariaDB-server MariaDB-client
# systemctl start mariadb
```
ひきつづき設定

```
# mysql -u root
> CREATE DATABASE wordpress;
> CREATE USER wp_user IDENTIFIED BY 'password';
> GRANT ALL ON *.* TO 'wp_user'@'localhost' IDENTIFIED BY 'password';
> FLUSH PRIVILEGES;
> exit
```

## wordpressインストール

```
# yum install wget unzip
# wget https://ja.wordpress.org/latest-ja.zip
# unzip latest-ja.zip
# mv wordpress/* /var/www/html/
# cd /var/www/html/
# chown -R apache: *
# cp wp-config-sample.php wp-config.php
# vi wp-config.php ←ファイル内の説明に従い修正する。
```
ここが便利
https://api.wordpress.org/secret-key/1.1/salt/

## サービスを起動設定
```
# systemctl start mariadb
# systemctl enable mariadb
# systemctl start httpd
# systemctl enable httpd
```

## その他設定
firewalldとselinux無効にしちゃう。

```
# systemctl stop firewalld
# systemctl disable firewalld
# vi /etc/selinux/config　←SELINUX=disabled に変更
# reboot
```

## アクセス
GIPにアクセスすると初回設定画面が開く！！
mapメソッドとは？

##mapメソッドとは?

mapメソッドは`配列の要素数だけ繰り返し処理を行うメソッド`です。

##mapメソッドの書き方は?

mapメソッドは

`配列が入った変数.map{|変数名|処理名}`と記述します。

処理後は戻り値で配列を生成します。

例を出して説明すると

```ruby
@brand = Brand.all ##{グッチ、シャネル、サンローラン}

@brand.map{|t| [t.name, t.id]} ##[[グッチ、１],[シャネル,2],[サンローラン,3]]
```

といった配列が生成されます。

##eachとの違いは?

eachメソッドを使用した場合、返り値は**レシーバ自体**になります。

一方、**mapメソッドで生成された配列はそのまま保持されます。**
Leetcode #846: Hand of Straights

```swift
func isNStraightHand(_ hand: [Int], _ W: Int) -> Bool {
    if hand.count % W != 0 {
        return false
    }
    var dict = [Int: Int]()
    for num in hand {
        dict[num, default: 0] += 1
    }
    
    var sortedKey = dict.keys.sorted()
    while !sortedKey.isEmpty {
        let first = sortedKey[0]
        for i in stride(from: 0, to: W, by: 1) {
            if let value = dict[first+i] {
                dict[first+i] = value - 1
                if value == 1 {
                    if let index = sortedKey.firstIndex(of: first+i) {
                        sortedKey.remove(at: index)
                    }
                }
            } else {
                return false
            }
        }
    }
    return true
}
```
Leetcode #328: Odd Even Linked List

```swift
func oddEvenList(_ head: ListNode?) -> ListNode? {
    let dummyNode = ListNode(0)
    dummyNode.next = head
    var odd = head
    var even = head?.next
    var evenHead = even
    while even != nil && even?.next != nil {
        odd?.next = even?.next
        even?.next = even?.next?.next
        odd = odd?.next
        even = even?.next
    }
    odd?.next = evenHead
    return dummyNode.next
}
```
asp.net coreで書く細かいjavascript module の記法

asp.net coreと言えど javascript コードを書くのに1個のファイルにごちゃごちゃと色んなものを混ぜたくはないので、適当なモジュールに分割したい。

## モジュールの記述

モジュール "Mod" を_mod.js に書く。

```javascript
/**
* 何か機能を提供するモジュール
*/
var Mod = Mod || (function(){
   var privateVariable = 1;

    var o = {
        /**
        * 何かを実行する関数
        */
        method: function(){
            return privateVariable;
        }
    }
    return o;
})();
```

## bundle

拡張機能 Bundler & Minifier をインストールしておき、 bundleconfig.jsonを書く

```json
[
  {
    "outputFileName": "wwwroot/js/global.js",
    "inputFiles": [
      "wwwroot/js/src/_mod.js",
    ],
    "minify": {
      "enabled": true,
      "renameLocals": true
    },
    "sourceMap": false
  }
]
```
これで bundle を実行すると wwwroot/js/global.js が生成されるので、 _Layoutあたりで参照しておけば良い

## jsdoc

匿名関数に必要なものを入れつつ jsdocが有効になるやり方を探っていたけど、モジュールの記述で書いたような `var Foo = Foo || (function(){})();` みたいな書き方に落ち着きつつある。
Tesseractを使って日本語OCRのメモ

####ダウンロード
https://github.com/UB-Mannheim/tesseract/wiki
　⇒tesseract-ocr-w64-setup-v5.0.0-alpha.20190708.exe

####インストール
Additional LanguageでJapanese関連をチェックし、次へ次へで完了

####環境変数の追加
PATHに以下を追加
C:\Program Files\Tesseract-OCR

####確認
tesseract -v
>tesseract v5.0.0-alpha.20190708
 leptonica-1.78.0
  libgif 5.1.4 : libjpeg 8d (libjpeg-turbo 1.5.3) : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.11 : libwebp 0.6.1 : libopenjp2 2.3.0
 Found AVX2
 Found AVX
 Found SSE
 Found libarchive 3.3.2 zlib/1.2.11 liblzma/5.2.3 bz2lib/1.0.6 liblz4/1.7.5

####対応言語の確認
tesseract --list-langs
>List of available languages (7):
eng
jav
jpn
jpn_vert
osd
script/Japanese
script/Japanese_vert

####PyOcr
pip install pyocr

####実行してみる

```
from PIL import Image
import sys
import pyocr
import pyocr.builders

tools = pyocr.get_available_tools()
if len(tools) == 0:
    print("No OCR tool found")
    sys.exit(1)

tool = tools[0]

#言語、オプションの指定をする
txt = tool.image_to_string( 
    Image.open('test.jpg'),
    lang='jpn',
    builder=pyocr.builders.TextBuilder()
)
print(txt)
```
Apple Developer Programのメンバーシップが切れてしまったら

#はじめに
毎年、夏の季節にApple Developer Programの支払いをしてメンバーシップを更新していました。
今年もメールで「Your Apple Developer Program membership expires in 5 days.」とタイトルと書かれたメールが来たのでそろそろ支払いしないといけないなと思っていました。
が、忘れてしました。忘れていたことも忘れて数日間放置していまっていました。

**「AppleStoreで検索してもアプリが出てこないんだけど？」**

と友人に言われて焦りに焦りました。

その日に急いで支払いしてメンバーシップを更新しました。
結論としては、メンバーシップを更新するだけで、次の日にはAppStoreで検索できる状態に戻っていました。

来年も焦らないように記録しておきます。


#更新手順
App Store Connectにログインすると上部にこのような表示がありました。
![スクリーンショット 2019-08-21 21.00.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439918/d74b6619-75fd-23e5-b048-8b03dcc9bbdc.png)


ちなみにMy Appのページは見慣れない「契約保留中」の表示になっていました。
![スクリーンショット 2019-08-21 21.01.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439918/92ea2872-da8d-898f-eee4-a4168ddaae26.png)


「サインイン」をクリックしてDeveloperのページに飛びました。
![スクリーンショット 2019-08-21 21.00.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439918/f4ba6ec9-b5d9-95a7-9436-301eaa98558a.png)

さらに「Renew Membership」をクリックしてクレジットカード情報を入力して支払いを完了させました。
![スクリーンショット 2019-08-21 21.04.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439918/744f3c44-2446-0bd6-4c37-c8761b7766ad.png)

![スクリーンショット 2019-08-21 21.05.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439918/f4a840ee-88e0-3e9b-728c-b6e22a627904.png)

このすぐあとにまたMy Appsのページを見ると「配信準備完了」の表示に戻っていました。
![スクリーンショット 2019-08-21 21.06.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/439918/415480e8-4f7e-669b-c99d-e7372ee60c1a.png)

しかし、AppStoreの検索にはでてきませんでした。
AppStoreの検索結果に表示されるようになるには少し時間がかかるようです。

#さいごに
数年間はきちんとメンバーシップが切れる前に更新していましたが、今回はつい忘れてしまいました。
忘れないのが一番良いですが、もし忘れてしまっても落ちついてすぐにメンバーシップをリニューするだけで元通りになるようです。全部のアプリを再申請しないといけないんじゃないかとか色々心配しましたがそんなことはなくてよかったです。
Swift で NSCache を ジェネリクスに（Swift5.0.1版）

[Swift で NSCache を Generics にして便利に](https://qiita.com/codelynx/items/044e1f4e9aaf82fd5e94)

上記の記事を参考にキャッシュのジェネリクスを書いたところ、
Swift5.0.1だと動かなかったのと、
NSCacheとインターフェイスが違うのが個人的には好きじゃなかったので、下記のように書き換えてみました。

```swift:GenericCache
//KeyTypeがT, ObjectTypeがU
class GenericCache<T, U> {
    
    private var cache = NSCache<AnyObject, AnyObject>()
    
    var delegate: NSCacheDelegate? {
        get { return self.cache.delegate }
        set { self.cache.delegate = newValue }
    }
    
    var name: String {
        get { return self.cache.name }
        set { self.cache.name =  newValue }
    }
    
    func object(forKey: T) -> U? {
        let forKey = forKey as AnyObject
        return self.cache.object(forKey: forKey) as? U
    }
    
    func setObject(_ obj: U, forKey key: T) {
        let obj = obj as AnyObject
        let key = key as AnyObject
        self.cache.setObject(obj, forKey: key)
    }
    
    func setObject(_ obj: U, forKey key: T, cost g: Int) {
        let obj = obj as AnyObject
        let key = key as AnyObject
        self.cache.setObject(obj, forKey: key, cost: g)
    }
    
    func removeObject(forKey: AnyObject) {
        self.cache.removeObject(forKey: forKey)
    }
    
    func removeAllObjects() {
        self.cache.removeAllObjects()
    }
    
    var totalCostLimit: Int {
        get { return self.cache.totalCostLimit }
        set { self.cache.totalCostLimit = newValue }
    }
    
    var countLimit: Int {
        get { return self.cache.countLimit }
        set { self.cache.countLimit = newValue }
    }
    
    var evictsObjectsWithDiscardedContent: Bool {
        get { return self.cache.evictsObjectsWithDiscardedContent }
        set { self.cache.evictsObjectsWithDiscardedContent = newValue }
    }
}
```

```swift:呼び出し例
//インスタンス化
let cache = GenericCache<String, UIImage>()
cache.countLimit = 1000

//キャッシュする処理
let key = "cat"
let image = UIImage(url: url) //そういうurlがあるとして
cache.setObject(image, forKey: key)

//取り出し
let catImage = cache.object(forKey: key) //UIImage?が返る
```
本で読んで知識としては知っていたもののなかなか実装に使えなかった、
ジェネリクスをはじめて使えたので嬉しかったです。

あと
「All paths through this function will call itself」というワーニングが、
delegateのGetterとevictsObjectsWithDiscardedContentのSetterで出ます。
かといってGetterとSetterを定義しないと怒られるので、仕方ないですね。
⇒2019/08/23追記
　人から指摘されて気づきましたが、self「.cache」が抜けていました。。。
　今は修正しています
pandas0.25.0で新しくなったaggメソッド!

# 概要
簡単に言うと`マルチカラムをそもそもつくらないaggメソッド`です!
7月の頭にpandasのaggメソッドによって生じるマルチカラムをいい感じに処理する方法について[紹介しました](https://qiita.com/tenajima/items/55bb8b5843690d464225)が, pandasの0.25.0でそこに近い機能があったので紹介します!


# 使用するDataFrame
[公式サイト](https://pandas.pydata.org/pandas-docs/version/0.25/whatsnew/v0.25.0.html)と同じものを使います

```python
import pandas as pd


animals = pd.DataFrame(
    {
        "kind": ["cat", "dog", "cat", "dog"],
        "height": [9.1, 6.0, 9.5, 34.0],
        "weight": [7.9, 7.5, 9.9, 198.0],
    }
)

#   kind  height  weight
# 0  cat     9.1     7.9
# 1  dog     6.0     7.5
# 2  cat     9.5     9.9
# 3  dog    34.0   198.0
```

# 今まで通りやってみる
今まで通りaggにキーに統計の対象となるカラム名, 値に統計の種類のリストを指定した辞書を渡します.

```python
df_old = animals.groupby('kind').agg({"height": ['min', 'max'], 'weight': ['mean']})


#      height        weight
#         min   max    mean
# kind                     
# cat     9.1   9.5    8.90
# dog     6.0  34.0  102.75
```

カラムがマルチカラムになっていますね.

# 新しくなったaggメソッド

新しくなったaggメソッドでは引数名に統計特徴量を計算した後につけたいカラム名, 引数に第1要素が統計の対象となるカラム名, 第2要素に統計の種類を指定したタプルを指定します.(言葉で見ると難しいから下のコードを見たほうがわかりやすいかも...)


```python
df_new = animals.groupby("kind").agg(
    min_height=("height", "min"),
    height_max=("height", "max"),
    hogehoge=("weight", "mean"),
)


#       min_height  height_max  hogehoge
# kind                                  
# cat          9.1         9.5      8.90
# dog          6.0        34.0    102.75
```

マルチカラムになっていないですね!
いいかんじ!

# 感じたこと

「新しくなったaggメソッドを使うようにすれば超ハッピー!」ということではないなぁと感じました.
kaggleとかで`min`も`max`も`mean`も`median`も`var`も`skew`も, とにかくたくさん統計特徴量を作るんだ!という場合には[今まで通り](https://qiita.com/tenajima/items/55bb8b5843690d464225)のやり方がやりやすいのかなと思いました.
ただ, 2, 3個の統計特徴量をつくるぜってときは新しいaggメソッドのやり方がお手軽にできていいなと感じました.
状況に応じて臨機応変に使っていきましょう!
pythonで考えるメタクラスとは？

# pythonで考えるメタクラスとは

メタクラスについて、pythonで初めて学んでみました。自分の備忘録も兼ねて、まとめてみたいと思います。

## そもそもメタクラスって？

メタクラスって何でしょう、Wikipediaで調べてみると下記のように説明されています。

> オブジェクト指向プログラミングにおいてメタクラスとは、インスタンスがクラスとなるクラスのことである。通常のクラスがそのインスタンスの振る舞いを定義するように、メタクラスはそのインスタンスであるクラスを、そして更にそのクラスのインスタンスの振る舞いを定義する。

(引用：https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%BF%E3%82%AF%E3%83%A9%E3%82%B9)

つまり、__クラスの振る舞いを定義するためのクラス__がメタクラスだと、なんとなくイメージできます。

ここでクラスの「振る舞い」を制御したいのなら、そのクラスの親クラスを作って、継承させるのと何が違うのでしょうか。それは制御したい「振る舞い」に違いがあると思っています。


## 親クラス（継承）とメタクラスの違い

親クラスの継承とメタクラスの役割について、私なりにざっくり整理すると以下のようになると思っています。

||制御したい「振る舞い」|具体例|
|---|---|---|
|親クラス|インスタンス__生成後__の挙動（どのように動くか）|複数の子クラスで同じ名前のメソッドを使いたい（ポリモーフィズムの実現）|
|メタクラス|インスタンス__生成前（生成時）__の挙動（どのように定義されているか）|クラス変数がすべて適切に定義されているかチェックしたい/直接関係しないクラス同士の中身も制御したい。|


## コード例

実際にコード例を見てみましょう。政令指定都市を定義するためのメタクラスを書いてみました。政令指定都市は人口が500万人以上の都市ですので、政令指定都市クラス定義時に人口が500万人以上かをチェックするようにします。

```python:meta_sample.py

# 政令指定都市メタクラス
# メタクラスはtypeを継承する
class GovermentDesignatedMetaClass(type):
  def __new__(meta,name,bases,attributes):
    # __new__関数はクラス生成時に実行される関数
    # クラスの情報を受け取ることができる
    # name:クラス名, bases:親クラス, attributes:クラス属性
    if bases != (object,): #抽象クラスは検証しない
      if attributes["population"] < 5000000: # 500万人未満なら例外
        raise ValueError("This is not Goverment designated city")
    return type.__new__(meta,name,bases,attributes)


# 政令指定都市親クラス
# メタクラスの指定は「metaclass=...」で行う(Python3)
class GovermentDesignatedCity(object, metaclass=GovermentDesignatedMetaClass):
  population=None #子クラスで定義する

# 東京都 (政令指定都市)
class Tokyo(GovermentDesignatedCity):
  population = 10000000 #1千万人

# 松山市 (政令指定都市ではない)
class Matsuyama(GovermentDesignatedCity):
  population = 500000 #50万人

```

以上のようにメタクラスを定義し実行すると、Matsuyamaは人口が約50万人なので政令指定都市ではないため、下記のようにエラーメッセージが出力されます。

```plaintext:実行結果
Traceback (most recent call last):
  File "sample.py", line 15, in <module>
    class Matsuyama(GovermentDesignatedCity):
  File "sample.py", line 5, in __new__
    raise ValueError("This is not Goverment designated city")
ValueError: This is not Goverment designated city
```

### メタクラスのメリット

お気づきかと思いますが、[上記コード](#コード例)はMatsuyamaクラスを定義しただけで、どこにもインスタンスを生成していませんし、静的クラスとしても利用していません。これこそがメタクラスのメリットの一つになります。すなわち、

__メタクラスを利用することで、クラスを実装した時点でそのクラスの定義チェックを行えます__


## メタクラスの使いどころ

最後にメタクラスの使いどころになると考えられているシチュエーションを挙げます。
（他にも積極的に使える場面があれば、ぜひご教示ください。）

- クラス変数のチェックをしたい（今回のコード例）
- インスタンス生成時に必ず特定の関数を実行したい。（デシリアライズ時にジェネリックに行えるよう、シリアライズ時にクラスの存在を登録したいときなど）

## まとめ

メタクラスはクラスがどのように定義されるかを制御でき、クラス定義時のクラス変数チェックなどに有効。


## 参考記事

[Pythonのクラスアトリビュートとメタクラスの話](https://qiita.com/pashango2/items/fadc77c8db21c8fd9367)

[Python の メタプログラミング (\_\_metaclass__, メタクラス) を理解する](https://www.yunabe.jp/docs/python_metaclass.html#type-%E3%81%A8%E3%82%AF%E3%83%A9%E3%82%B9%E5%AE%9A%E7%BE%A9%E3%81%AE%E3%81%82%E3%81%BE%E3%82%8A%E7%9F%A5%E3%82%89%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E9%96%A2%E4%BF%82)

[Python超入門その２４〜メタクラスでクラスの動作をカスタマイズしてみよう〜](https://programming-study.com/technology/python-metal-class/)

Brett Slatkin, "Effective Python", 2016, O'REILLY
Symbolic link を貼る

## Symbolic link

Linux の Symbolic link File (シンボリックリンクファイル) とは、Windows でいうショートカットのようなもので、ディレクトリやファイルを参照するファイル。対象までのパスを含んだ小さなファイル。

## Hard link との違い

- Hard link は、Hard link を削除することで参照先ファイル・ディレクトリが削除される。

- Symbolic link は、Symbolic link を通じての参照先ファイル・ディレクトリの削除はできない。

Symbolic link File 自体を削除しても参照先のファイル・ディレクトリへの影響はない。また、参照先のファイル・ディレクトリが削除されても Symbolic link File は残る。

## Symbolic link を作成する

```
ln -s 参照先ディレクトリ（ファイル）のパス [シンボリックリンクのファイル名]
```

`ln コマンド` ... ディレクトリやファイルへのリンクを登録する。-s を付けると Symbolic link、つけないと Hard link となる。

※ 参照先ファイル、シンボリックリンクのファイル名部分は、フルパスでも相対パスでも指定可能。
シンボリックリンクのファイル名は省略可能で、省略した場合、参照先に指定した同じファイル名／ディレクトリ名でカレントディレクトリに Symbolic link が作成される。

### 活用例

- ファイル

ファイルにリンクを貼ってみます。

```bash
$ pwd
> /usr/local/bin
$ ln -s /opt/other/module/bin/ruby ruby
```

`/usr/local/bin/ruby` を使おうとすると `/opt/other/module/bin/ruby` を使うようになります。

- ディレクトリ

ディレクトリにリンク貼った時はこんな感じです。

```bash
$ touch work/target/test.txt # test.txt を作っておく
$ ln -s work/target target # ディレクトリに symlink をはる

$ echo abc > target/test.txt # symlink を使ってみる
$ cat work/target/test.txt # 参照元のディレクトリ配下に反映されている 
> abc
```

### Symbolic link File の消し方

`unlink` と `rm` どちらでも消せますが、`rm` はディレクトリも消せてしまうため、unlink を使う方が安全らしいです。(coreutils ではソースが違うが、FreeBSD だと unlink は rm のハードリンクなので、ディレクトリ削除ができない rm と考えて良さそう。)

```bash
$ unlink symlink 
```

### Symbolic link を経由せずにカレントディレクトリを表示する

`pwd -P` で Symbolic link を経由せずにカレントディレクトリを表示することができる。

```bash
$ ln -s /User/qiita/here /here
$ cd /here
$ pwd    # リンクを辿らずにリンク元のカレントディレクトリを表示
> /here
$ pwd -L # こちらもリンクを辿らずにリンク元のカレントディレクトリを表示
> /here
$ pwd -P # リンクを辿ってリンク先のカレントディレクトリを表示
> /User/qiita/here
```
コミットメッセージにチケット番号+[半スペ]が無い場合エラーを返すスクリプト

業務ルールでRedmineとコミット内容を紐ずけるため、`#00000 コミットメッセージ`でコミットをするという内部ルールがあります。
ただうっかり入力し忘れたり、半角スペースが全角スペースになってRedmineと紐図かなかったりというまれにあったので、Gitフックを使用して対策をしてみたいと思います。

## Gitフックとは
Gitフックは、Gitでコマンドを実行する直前もしくは実行後に特定のスクリプトを実行するための仕組み。

## commit-msg フック
コミットメッセージを入力後、処理を走らせることができる。
以下格納先。

```
.git/hooks/commit-msg
```
`.sample`を外し、フックスクリプトとして使用する。
他にも、
コミット直前に実行：`pre-commit`
プッシュ直前に実行：`pre-push`
など色々とある。

## Rubyで書く
個人的にRubyを学習中だったのでRubyでスクリプトを記述しました。
１行目に以下を記述。

```
#!/usr/bin/env ruby
```
`#!`はシェバングと言い、これ以下に書いてあるコマンドで実行し直してくれる。
`/usr/bin/env` を使う事で`which ruby`で出てくる環境依存のPATHを記述しなくてもよくなる。
※`/usr/bin/env`も実は環境依存だがほぼ共通で入っている。。。はず。

## 内容
```ruby
#!/usr/bin/env ruby

# #00000+[半スペ] 、Mergeコミット以外エラー
message = File.read(ARGV[0])
$regex = /#\d+\s|^Merge branch/

if !$regex.match(message)
  puts "\e[31mチケット番号入力してください\e[0m"
  exit(1)
end
```
### ARGV(ｱｰｸﾞｳﾞｲ)
コマンドラインからスクリプトの引数として与えられた文字列を要素として持つ。

```ruby
 # ファイルを読み込んだ際コマンドラインの第一引数を実行する
File.read(ARGV[0]) 
```

### matchメソッド
正規表現とmatchメソッドを使用し、定義した正義表現に当てはまらない場合はエラーメッセージを実行し処理を中断させる。

### exitコマンド
エラーの文字列を表示した後、exitコマンドで処理を終了させる。
`exit(0)`：正常終了
`exit(1)`：以上終了

## 色を変更する
エラーメッセージの色を変えた方が視覚的にわかりやすいのでメッセージの色を変更する為、エスケープシーケンスを使用。
>エスケープシーケンスとは
>ターミナル上で色を含む特定の制御を実現するための特殊な文字列

```ruby
print "\e[31mhello\e[0m" # 赤色
```

## 感想

Gitフックをもっと活用すれば、コミット前orプッシュ前にエラーを検知したり色々なことができそう！
一番手こずったのは**シェバング**でした！！
(最初書き方がわからず全然Rubyを認識しませんでした。。。)
Windows に WSL を 有効せずに 入れた とき に 出た エラー の 解決法

# 目的

- うっかりしてWSLを有効にせずにUbuntu18.04を入れたときに出たエラーの解決法を知る。

# 症状と解決法

下記画像のようなエラーが出た

  ～エラー文～

    ```
    Installing, this may take a few minutes...
    WslRegisterDistribution failed with error: 0x8007019e
    The Windows Subsystem for Linux optional component is not enabled. Please enable it and try again.
    See https://aka.ms/wslinstall for details.
    Press any key to continue...
    ```

  ![WSL_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/db991e76-ee3f-afe6-4209-bbcb606610a4.png)

1. Windowsのスタートボタンを右クリック→アプリと機能をクリックすると下記画面が開く
  ![WSL_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/75f52768-40de-95d7-2c43-8261abce6c1a.png)

1. プログラムと機能をクリック
  ![WSL_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/33c51654-8898-1608-3387-1dd338666362.png)

1. Windowsの機能の有効化または無効化をクリック
  ![WSL_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/6b19fb32-585d-2757-a03b-bc6eb66152dc.png)


1. windows Subsystem for LinuxにチェックをいれてOK
  ![WSL_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/8f9d8300-da93-23a9-61eb-5a101ef12b44.png)

1. PCを再起動する
  ![WSL_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/71665e99-67d4-2ab2-254f-b4ac31b4f0e6.png)

1. もう一度Ubuntuを立ち上げる
  
1. 画像のようなメッセージが出るので待つ
  ![WSL_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/aeaa18f6-04e4-7371-44c9-e86b9d973e2d.png)

1. Ubuntuでのユーザ名を入力
  ![WSL_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/9249cfc7-a43d-7ebe-a6aa-be4e60d91de7.png)

1. PWを入力エンター

1. PWを入力エンター

1. 画像みたいになればOK
  ![WSL_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/d437fc08-b260-f6c3-4f3d-243f9453e706.png)

# 原因

- 目的にもすでに書いてあるが今回のエラーの原因は、WSLを有効にせずにMicrosoft storeでUbuntuをインストールしてしまったことだった。
1日のまとめ　8/22(木)

今日は突発な用事ができたので途中までしか学習時間が作れなかった。
データベースの作成が何と無く感触が掴めたかな。

因みにshow databases;で確認したところ、以前に作った無駄なデータベースが多く整理がされてなかったから今回は記述しない。

余りにも中途半端過ぎるので一応メモに残し、翌日はプラスアルファ新たに学んだ内容を記録に残す。

①MySQL

操作対象のデータベースを調べる記述

````
mysql> select database(); 
```

結果

```
+------------+
| database() |
+------------+
| NULL       |
+------------+
1 row in set (0.00 sec)

```

NULLと表示されたので操作対象のデータベースは無い。databaseの下枠に操作対象のデータベースが表示される。

mysql> use データベース名; //データベースを操作対象にする記述

```
mysql> use testdb01;
```


結果

```
Database changed
```

この表示でtestdb01が操作対象になった。予め作っておいたデータベースをこの記述で操作できるようになる。

明日の課題
①MySQLで外部ファイルの記述を学ぶこと。その内容をQiitaに投稿する。
②HTMLのnavタグの処理の流れを実際にコードを書いて掴む
スクリプトでCIの自動化をやろうとした時、dindコンテナ内のDockerデーモンが起動するまで待つ

CIに関連する作業の中でコンテナ上でコンテナ動かしたかったのでDinDを触っていた時の知見
DinDコンテナと、その上で動くコンテナはそれぞれ`DinDコンテナ`と`コンテナ`で単語を使い分けてます。

# 結論
DinDコンテナ内で`/var/run/docker.pid`を見ていれば良いらしい。
デーモンが起動した後に生成される、dockerのpidが書かれたファイル

# ハマった事
スクリプト1つ実行させるだけでDinDコンテナ起動、DinDコンテナ内でコンテナ起動、色んな作業/テスト実行とかやりたかったのですがDinDコンテナ起動直後はDockerデーモンが立ち上がりきっておらず、デーモン動いてる?とエラーを吐かれます。
最初は無理やり`sleep 10`とかつけていたのですがこれはもちろんアンチパターンです。
時間で待機するのはよろしくないので、何かデーモンが起動したと確実に分かる方法が欲しかったので調べていた所、[ここ](http://docs.docker.jp/engine/reference/commandline/daemon.html)にpidファイルを吐き出すパスを指定するオプションがあることを見つけました。**pid吐き出されるならデーモンも起動しているだろって事で上記を解決出来ました。**

# 例
例えばこんなスクリプト書いて

```sh:wait.sh
#!/bin/bash

while :
do
    if [ -e /var/run/docker.pid ]; then
        break
    fi
done

exit 0
```

こんなのも書き

```sh:start.sh
#!/bin/bash

docker run --privileged --name test -v `pwd`/wait.sh:/wait.sh -d docker:dind

docker exec test sh /wait.sh

docker exec test docker run hello-world
```
あとは
`$ sh start.sh`
を実行してみます。
start.shの`docker exec test sh /wait.sh`をコメントアウトしてみると分かりますが、wait.shがDinDコンテナ内で実行されたおかげでhello-worldもといHello Dockerが実行されます。
VSCODEの初歩-HTML編

#VSCODE豆知識
___
##小さな悩み
HTMLを日々勉強していて、前使ったていたcodeからコピペをすることが多々あるんですが・・・。

超効率が悪いので、よく使うショートカットを紹介していきたいと思います。（内容が間違っていたらすいません）
___
###使い易いショートカット
- htmlファイル内に"!"と"tabキー"を押すことでhtmlの雛形を入れることができる。（言語は使いたいものに設定してください）
- "a:link"と"tabキー"
- "hr"と"tabキー"
- "br"と"tabキー"
- "link"と"tabキー"
- "link:css"と"tabキー"

などです。他にも存在するのですが今回はここまで。
[rails] 孫要素のカウント数（条件）で子要素の値を返す方法

#孫要素の条件で子要素の値を返す
##はじめに
###孫要素をincludes

```ruby

Prefecture.includes(localities: :sub_locality)
```

###子モデルをキャッシュ＆絞込

```ruby

Prefecture.includes(:localities).references(:localities).where("localities.name = ?", '東京都')
```

###子モデル・孫モデルが存在するレコード抽出

```ruby

Prefecture.joins(:localities).where("localities.name = ?", '新宿区')
Prefecture.joins(localities: :sub_localities).where("sub_localities.name = ?", '西新宿')
```

ここまでは、いろいろな記事でもっとわかりやすく書いてるものを参考にしてください。


#本題
ここからが本題です！
今回ワタシが苦戦した内容が、「孫要素が必要な条件揃っていたら、子要素の値を返す」というものでした。

上記の例をつくるとすると、
１つの `prefecture` の 紐づく `locality` に、さらに紐づく `sub_locality` が100以上ある場合のみ値を返すコードを作りたい

####試行段階

```ruby

Prefecture.first.localities.joins(:sub_localities).group(:id).having('count_id >= 100').count(:id)
=> {2=>131, 3=>116, 11=>167, 13=>334, 15=>172, 16=>144, 17=>164, 19=>180, 24=>113, 38=>109, 186=>143}
```

こんな感じの結果が返ってくる。
`locality.id` をとれたので、成功！？

しかし、これで `locality` を絞るには、

```ruby

locality_ids = Prefecture.first.localities.joins(:sub_localities).group(:id).having('count_id >= 100').count(:id).keys
```

のようにして、`locality.id` をとってきてから、

```ruby

Locality.where(id: locality_ids)
```

と書かないといけない！めんどくさい


##結果

一回で絞り込めないかな〜〜と検索してたらドンピシャのサイトがありました。
http://akinov.hatenablog.com/entry/2017/05/13/163911

```ruby

Prefecture.first.localities.joins(:sub_localities).group(:id).having("count('*') >= ?", 100)
=> #<ActiveRecord::AssociationRelation [#<Locality id: 11, prefecture_id: 1, name: "~~~" ]>
```

としっかり `locality` のデータが返ってきました。

`having("count('*') >= ?", 100)`

こんな書き方でいけちゃうみたいです！
'*' ここは名前？みたいな感じなのでなんでも良き。（なはず）

```ruby

Prefecture.first.localities.joins(:sub_localities).group(:id).having("count('*') >= ?", 100).count
=> {2=>131, 3=>116, 11=>167, 13=>334, 15=>172, 16=>144, 17=>164, 19=>180, 24=>113, 38=>109, 186=>143}
```

ちなみに、count つけるとこんな感じでデータが帰ってきます。

##まとめ
- google様での検索ワードってホント大事。
- これが完全正解とは、限らないのでもっといい方法をご存じの方はご教授願います。
一歩進んだ Docker との付き合い方

最近，改めて Docker 周辺のことを勉強していて，その中で学んだ「今まで困っていたことを解決する方法」や新しく知った「便利なツール」「今後使っていきたいツール」を備忘録がてらまとめました！


## 管理関連
* [lazydocker - A simple terminal UI for both docker and docker-compose](https://github.com/jesseduffield/lazydocker)
* [docui - TUI Client for Docker Written in Go](https://github.com/skanehira/docui)

lazydocker は既存のコンテナやサービスの管理に関するツールで，docui はコンテナやサービスの作成と構成に関するツールです。
どちらもターミナル上で使うツールです。

* [Portainer](https://github.com/portainer/portainer)

一方，Portainer はブラウザからアクセスするコンテナやサービス， Swarm クラスターの管理ツールです。

ターミナルかブラウザか，適材適所で使い分けると良さそうです。


## セキュリティ関連
* [Dockle - Container Image Linter for Security, Helping build the Best-Practice Docker Image, Easy to start](https://github.com/goodwithtech/dockle)
* [trivy - A Simple and Comprehensive Vulnerability Scanner for Containers, Suitable for CI](https://github.com/aquasecurity/trivy)

Dockle はイメージに含まれるセキュリティホールをチェックするもので，Dockerfile などではなく，イメージを直接解析するため，元イメージに含まれている脆弱性も検知します。
また，ベストプラクティスなイメージの作成を助けてくれるツールです。

trivy は脆弱性を検知するもので，アプリケーションの依存ライブラリもチェックしてくれます。
ちなみにこの trivy は [趣味で作ったソフトウェアが海外企業に買われるまでの話 - knqyf263's blog](http://knqyf263.hatenablog.com/entry/2019/08/20/120713) ということでまた話題になっていますね。

どちらかやればいいものではなく，どちらもやるのが良さそうです。
CI などと組み合わせても利用しやすい形になっているので，積極的に使っていきたいですね。

なお，docker hub で公開されているイメージの一部は dockle と Trivy の実行結果が [Security Issues in Popular Containers](https://containers.goodwith.tech/) に掲載されていますので，手っ取り早くどんな感じなのか確認したい方はチェックしていただくと良いと思います。
個人的には

> 今後も https://containers.goodwith.tech/ に、ユーザーの入力したイメージ名からスキャンをするなど、機能追加していく予定です。

が実装されるのを心待ちにしています（開発者さんに届け…

**参考**

* [人を震えさせるツール｢Dockle｣の仕組みを解説〜Dockerセキュリティの基礎知識も一緒に - Qiita](https://qiita.com/tomoyamachi/items/8e042e4269427bb3b326)
* [DockerHubで公開されているコンテナが安全か確かめてみた結果【人気のコンテナ上位800個】 - Qiita](https://qiita.com/tomoyamachi/items/e0e69da521505e73237b)

**読むべき**

* [CIで使えるコンテナの脆弱性スキャナ - Qiita](https://qiita.com/knqyf263/items/dc179f9223fc31b5a51c)
* [フロントエンドでもTrivyを使って脆弱性対策したい！ - Qiita](https://qiita.com/tomoyamachi/items/e0394e9bcfeb90543e97)


## Docker 公式関連
### ログ関連
今まで開発やデバッグ中に大量のログにより restart 後，ログの表示に時間が取られたりしていましたが，docker run のオプションや docker-compose ファイルで rotate などの指定ができます。

[Dockerコンテナのログは標準オプションでローテートできる - Qiita](https://qiita.com/hidekuro/items/b1c7ce58c9d9fe342907)

もっと早くに知っていれば…

なお，すでに肥大化したログの一時的な削除は次の記事が参考になります。

[肥大化してしまったdockerコンテナのログを消し去る方法 - Qiita](https://qiita.com/Hi-king/items/fe5ac34170c7cdf12cc0)


### multi-stage build
Vue.js とかをやるようになって知りました。
大変便利。
フロントエンド周りでも大活躍ですが，スクリプトのドキュメント生成と公開なんかでも大活躍です。


## 最後に
以上，2019年上半期ちょっとで個人的に熱い docker 関連のプロダクト，機能のまとめでした！
少しでも皆さんのお役に立ってたなら幸いです。
小売物価統計を Zoho Sheet のカスタム関数 (Deluge) で取得する

(初出: 2019-08-21 を一部改訂)

Zoho Sheet は以前は MS Office にそっくりなウェブスプレッドシートだった。今ではだいぶ見た目が変わったが、依然として VBA が使える稀なサービスである。ただ VBA はマクロとしてしか呼べないようで、FUNCTION は定義できるのにそれをセル中の式で使うことはできない。自作の関数は Deluge で書く必要がある。なぜ。

さて、Deluge はドキュメントがはなはだ未整備で困るのだが、Zoho Creator 用の説明を読んでエスパーすると、松本市のガソリン価格を取得する次のような関数を作ることができる。

```c
int GETGASPRICE(int year, int month)
{
  appId = <e-Stat AppID>;
  url = "https://api.e-stat.go.jp/rest/2.1/app/getStatsData?appId=" + appId + "&statsDataId=0003105586&cdArea=20202&cdCat01=07301";
  xmlresult = getUrl(url,false).get("responseText");
  mm = leftpad(month.toString(), 2).replaceAll(" ", "0");
  yyyy = leftpad(year.toString(), 4).replaceAll(" ", "0");
  timeid = yyyy + "00" + mm + mm;
  xpath = "/GET_STATS_DATA/STATISTICAL_DATA/DATA_INF/VALUE";
  if (year == 0 && month == 0) {
    xpath = xpath + "[1]";
  } else {
    xpath = xpath + "[@time='" + timeid + "']";
  }
  xpath = xpath + "/text()";
  result = xmlresult.executeXPath(xpath);
  return result.toLong();
}
```

エラー処理をしていないのでこの小売物価統計データに含まれていない2014年12月以前を指定すると `#VALUE!` となる。最新の価格は `GETGASPRICE(0, 0)` で取得できるが、e-Stat が日付の新しいデータほど先に配置している現状を前提にしている。
初めてkotlinを触る - まとめ

# 概要
* [初めてkotlinを触る - クラス基礎(1)](https://qiita.com/alingogo/items/0b2201f80103f0eb9cbe)
* [初めてkotlinを触る - クラス基礎(2)](https://qiita.com/alingogo/items/a9e42b0db2012d5e8aa0)
* [初めてkotlinを触る - Enum Classes](https://qiita.com/alingogo/items/5200b0862e8a1edfcce9)
* [初めてのkotlinを触る - Sealed Classes(1)](https://qiita.com/alingogo/items/cd5ee4bc917c9064bf8a)
* [初めてのkotlinを触る - Sealed Classes(2)](https://qiita.com/alingogo/items/ded3b5614587642cb660)
Emacsのコマンド"comment-region"で独自にコメントの書式を設定する

# 概要
Emacsに便利なコマンドとして、選択したRegionを一括でコメントアウト出来る`comment-region`があります。
コードを書く時に多様するのですが、このコメントアウトに用いる書式を変更したいなと思って調べたら、案外サクッと出てこなかったので、備忘録として書いておきます。

# 背景
現在、私は[Hugo](https://gohugo.io/)という静的サイトジェネレーターを用いたTheme開発をしています。
ThemeはHTMLで記述するのですが、HTML中でHugo独自の関数をコメントアウトする際、

```
{{ /* コメント */ }}
```
と記述しなければなりません。そこで、いちいち手で打っていたのですがめんどくさくなり、Emacsでコメントアウトの書式を設定出来ればと思い立って調べました。

# 実装
[こちらのサイト](http://q.hatena.ne.jp/1187347078)を参考に、`~.emacs`に以下を記述。

```~.emacs
(add-hook 'html-mode-hook
          ( function (lambda ()
                       (setq comment-start "<!-- {{/* ")
                       (setq comment-continue "")
                       (setq comment-end " */}} -->"))))

```
Emacsを再起動し


```html
{{ range .Site.Pages }}
```
をコメントアウトしてみると

```html
<!-- {{/* range .Site.Pages }} */}} -->
```

となり、狙った挙動になりました!
Unity+VSCodeで「The reference assemblies for framework ".NETFramework,Version=*" were not found.」を解決する

## 経緯

UnityのスクリプトエディタにVisual StudioでなくVSCodeを使う環境を構築していたところ、「.NET Framework 4.7.1のアセンブリ参照が見つからない」という旨のエラーが出てデバッグ実行できない状況になりました。解決したので、備忘録として残します。

※ [Visual Studioがあれば解決できる](https://qiita.com/riekure/items/c45868f37a187f8e1d69#netframeworkversionv45%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)ようなのですが、私はVSCode環境を構築するのにVisual Studioを入れるのは嫌だったのでやってません。

## エラーについて
下記のようなエラーです。本当はもっと長い。

```
The reference assemblies for framework ".NETFramework,Version=v4.7.1" were not found.
```

## 解決策 (2019/08/22)

1. VSCodeが認識できてない.NET Frameworkのバージョンをメモ
2. [.NET Frameworkのダウンロードページ](https://dotnet.microsoft.com/download/dotnet-framework)から、メモしたバージョンのDeveloper Packをインストールする（私の場合は4.7.1）
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232140/e3f05380-449d-1911-a467-ca859f10c62d.png)


3. UnityエディタとVSCodeを再起動

これで直りました。

## 参考
- [Download .NET Framework](https://dotnet.microsoft.com/download/dotnet-framework)
- [UnityでVisual Studio Codeを使用できるようにするまでの手順](https://qiita.com/riekure/items/c45868f37a187f8e1d69)
- [New Unity 2018.3 and OmniSharp in VS Code error. #115](https://github.com/Unity-Technologies/vscode-unity-debug/issues/115)
WinMergeの使いかたメモ-mrrclb48z用

他に技があれば、教えて下さい。
オリジナル

https://qiita.com/ryuuuuuuuuuu/items/929fcf5548ace690be6c

# 備忘録です
## 「1行スクロール」したい。
目的:1行ずつ比較したい。着目する1行を、画面一番上に表示したい。

### 矢印キーを使う方法:
①カーソルを画面の最下行に移動して、↓を１回押す。
(画面右端のスクロールバー使用でも可。)
②最終行を画面の一番上に表示するため、最終行に空行を画面行数分、追加する。
### マウスを使う方法:
①最下行をマウスでクリックすると、1行スクロールする。

－－－－－－－－－－－－－－
 【補足】(2019/09/10)
## バックアップファイルを作らない:
(参考)Winmerge - バックアップファイルを作らない

https://freebsd.sing.ne.jp/tool/03/08/05.html 

「
WinMerge
元ファイル
C:\Users\xxx\Desktop\yyy.zzz
をバックアップできません。
無視して続けますか?
再びこの質問をしない(Q)
はい(Y)　いいえ(N)
」
－－－－－－－－－－－－－－
 【補足】(2020/07/22)
## 3ペインのプロジェクト保存は、ありませんでした。
（参考）

http://biglibox.hatenablog.jp/entry/2016/11/08/111130

－－－－－－－－－－－－－－
 【補足】(2020/12/09)

# 行末に比較しない部分を追加したい。コメント部分の差異を無視したい。
以下設定手順（意味はわかりませんでした。他にありそうですね。教えて下さい。)

Ⅰ.編集(E)＞設定(O)＞オプション(色>差異)
赤枠は、無視してください。

https://d2l930y2yx77uc.cloudfront.net/production/uploads/images/15146002/picture_pc_f374304cb2f2b26c96266612c8026858.png

①差異あり&背景を「白」にした。
②単語の差異&削除を「白」にした。

Ⅱ.編集(E)＞設定(O)＞オプション(比較>一般)>空白(C)

https://pasomaki.com/wp-content/uploads/2019/08/winmerge-empty-row-ignore-02.png

③無視する(G)

Ⅲ.本文行末に　「//あいうえお」追加した。

# 参考

https://atmarkit.itmedia.co.jp/ait/articles/2105/28/news032.html

https://pa-tu.work/blog/vscode-clipboard-diff

https://forest.watch.impress.co.jp/docs/news/1445493.html


「File Differ」は「GitHub」でホストされているオープンソースプロジェクトで、ライセンスは「Apache 2.0」。現在、「Visual Studio Marketplace」から無償でダウンロードできる。執筆時のバージョンはv3.0.43で、「Visual Studio 2022」でのみ利用できる。