OmniAICreator/Qiita-1.07M huggingface dataset:
Play Framework勉強めも　複数Modelの連携／ModelをOne To Many・Many To Oneで連携する

#Memberクラスの変更
・messageのList型のフィールドを追加＆初期化
・toStringにList内に保管されている、Messageのidをまとめて表示する機能を追加
（参考Listと配列の違い）https://eng-entrance.com/java-array-list

```java
	@OneToMany//①
	public List<Message> message = new ArrayList<Message>();

	@Override
	public String toString() {
		String ids = "{id:";//②
		for(Message m : messages){//③
			ids + = " " + m.id;//④
		}
		ids + = "}";//④
		return ("[id:" + id + ",message"+ids+",name:" + name + ",mail:" + mail + ",tel:" + tel + "]");
	}

```
①：このアノテーションにより、そのフィールドが１対多対応のModelである事を示す。
②：変数idsに`{id:`を代入
③：拡張for文で、配列変数messagesをmへ代入
④：変数idsにm(message)のidを追加
⑤：最後に `}`を追加

#Messageクラスの変更

```
	@ManyToOne(cascade = CascadeType.ALL)//①
	public Member member;
```

①：このアノテーションにより、そのフォールドが多対１対応の関連付けのModelである事を示す。
多対１である事は、多数のエンティティに対応しなければならないため、ListやCollectionクラスを用意する。

#動作内容
##初期画面
何も入力されてない状態
<img width="345" alt="スクリーンショット 2018-05-04 17.16.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/229025/e15fce85-7b6f-efee-4b27-a3be3dec35ea.png">

##メンバー情報を入力する
メンバー情報を登録する。
<img width="840" alt="スクリーンショット 2018-05-04 17.17.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/229025/7326f8b6-496c-81be-34f5-4336b3636ded.png">

##登録したメンバー名でメッセージを入力する
cascadeの設定により、MemberテーブルにもMessageのIDが表示される。
<img width="1017" alt="スクリーンショット 2018-05-04 17.17.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/229025/428afab9-00a0-e352-e7c9-f6f464162514.png">

##さらに登録したメンバー名でメッセージを入力する
MemberテーブルのID情報が増えている。
<img width="1119" alt="スクリーンショット 2018-05-04 17.18.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/229025/92fdb8db-9d69-1ba7-91d1-052181be4b14.png">
【Xcode】iOS開発におけるビルド実行にて「App Transport Security has blocked a cleartext HTTP・・・」というエラーが発生した場合の対処方法

# 環境
- macOS HighSierra 10.13.4 
- Xcode 9.3
- Swift 4.1

# 事象
ビルド実行 > シュミレータ立ち上げ 後に、
コンソールにて「HTTPがどうだ」とか言われた以下内容のエラーが発生し、正常な画面表示がされない。

```console:エラー内容
App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
```

# 原因
## App Transport Security
iOS9から導入されたAppTransportSecurityによるもので、初期設定ではHTTPS通信しか行えないように設定されている。

そのため、この設定環境下でHTTP通信を行うと同事象が発生する。

- [iOS 9 で追加された App Transport Security の概要](https://dev.classmethod.jp/smartphone/iphone/ios-9-intro-ats/)

## 原因のコード
1. 表示するWebページのURL文字列を定義する。
2. そのURL文字列をURLRequest型に変換する。
3. 変換したURLをもとに、Webページを表示する。

```swift:ViewController.swift

@IBOutlet weak var webView: UIWebView!

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    
    // URLをもとにサイトを表示する
    let strUrl = "http://google.com"
    let urlRequest = URLRequest(url: URL(string: strUrl)!)
    self.webView.loadRequest(urlRequest)
}

```
上記の`webView`にあたるUIWebViewクラスからのHTTP通信が許可されていないことによるもの。


# 対処方法
HTTP通信の設定を許可するよう変更する。
## info.plistに変更追加する
1. 左側に位置するNavigatorAreaで、対象のViewControllerと同階層に存在する **[info.plist]** を開く。
2. 最終行にカーソルを当て **[+]** をクリックする。
3. 項目の追加内容から **[App Transport Security Settings]** を選択する。
4. 選択後、追加した項目の左側にある三角印 **[▶]** をクリックする。
5. クリックすると三角印が下向 **[▼]** になり展開された状態となる
6. その状態で、新たに **[+]** をクリックし新たに項目を追加する。
7. 項目の追加内容から 2番目の設定項目 **[Allow Arbitrary Loads in Web Content]** を選択する。
8. 同項目の右側のValueを [NO] → **[YES]** へ変更する。

これにより、UIWebViewクラスからのHTTP通信が許可されるようになる。
Javadocに数式を埋め込んでみた

# はじめに
JavaのAPIドキュメントに数式を埋め込みたくてDoxygenを長年使ってきたが、JavadocでもMathJaxを使って数式を埋め込めるようなので試してみた。

# 環境
- Java 1.8
- Apache Maven 3.3.0
- Apache Maven Javadoc Plugin 3.0.0

# POMの設定
Apache Maven Javadoc Pluginで、ヘッダにMathJaxのCDNを追加すればJavadocのAPIドキュメントに数式を埋め込めるようになるはずだが、コメントにJavaScriptは埋め込んでは駄目とのエラーメッセージ。どうやらJava 8になってから厳しくなったらしい。そこで、```<additionalparam>```で```--allow-script-in-comments```をオプション指定するもうまくいかない。さらに調べてみると、Javadoc Plugin 3.0.0ではオプション指定が```<additionalparam>```から```<additionalOptions>```に変更されていた。ついでに、Markdownが使えるようにMarkdownが使えるDocletを追加した。最終的なPOMファイルの設定は以下の通り。（```<build><plugins>...</plugins></build>```）

```
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-javadoc-plugin</artifactId>
    <version>3.0.0</version>
    <configuration>
        <additionalOptions>
            <additionalOption>--allow-script-in-comments</additionalOption>
        </additionalOptions>
    <header>
        <![CDATA[
        <script type="text/javascript"
        src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
        </script>
        ]]>
    </header>
    <doclet>ch.raffael.mddoclet.MarkdownDoclet</doclet>
    <docletArtifact>
        <groupId>ch.raffael.markdown-doclet</groupId>
        <artifactId>markdown-doclet</artifactId>
        <version>1.4</version>
    </docletArtifact>
    <useStandardDocletOptions>true</useStandardDocletOptions>
```

# 数式のサンプル
試しに、以下の数式サンプルをjavadocに埋め込んでみた。

```
/**
 * 
 * @author hoge
 * 
 * MathJax Samples
 * ===
 * 
 * This javadoc API document is configured to use MathJax's CommonHTML mode with
 * web fonts to display the equations, which produces uniform layout and 
 * typesetting across browsers. But MathJax can also be configured to use 
 * HTML-CSS (for legacy browsers), SVG, and native MathML rendering when 
 * available in a browser. You can try the various output modes using the 
 * MathJax context Menu (which you access by ctrl+clicking / alt-clicking an 
 * equation) or the button below. 
 * 
 * - The Quadratic Formula
 * $$ x = {-b \pm \sqrt{b^2-4ac} \over 2a} $$
 * 
 * - Cauchy's Integral Formula
 * 
 * $$ f(a) = \frac{1}{2\pi i} \oint\frac{f(z)}{z-a}dz $$
 * 
 * - Double angle formula for Cosines
 * 
 * $$ \cos(\theta+\phi)=\cos(\theta)\cos(\phi)−\sin(\theta)\sin(\phi) $$
 * 
 * 
 */
public class Main {
    
}
```

下図は、上記のJavadocから自動生成したAPIドキュメント。綺麗に数式が表示されている。わざわざDoxygenを使わなくてもJavadocで数式を埋め込めることを確認できた。
<img src="https://qiita-image-store.s3.amazonaws.com/0/254918/ed1c5d0b-dc65-8d97-6317-e954c6a56877.png" width=480px>

# まとめ

APIドキュメントに数式を埋め込みたくてDoxygenを使ってきたが、Javadocでも綺麗な数式を扱えることを確認できた。Javadocは、JavaのソースコードからHTML形式のAPI仕様書を生成する標準ツールなので、DoxygenからJavadocへ移行できるのはメリットが大きい。Doxygenでは、Javadocスタイルを採用していたので、移行もそれほど難しくなさそうである。今回、新しく取り入れたMarkdownが使えるDocletはUMLの自動生成も可能なのでAPIドキュメントの表現が更に多彩になることが期待される。

# 参考資料

- https://github.com/Abnaxos/markdown-doclet
- http://docs.mathjax.org/en/latest/index.html#
- http://www.zverovich.net/2012/01/14/beautiful-math-in-javadoc.html
- https://maven.apache.org/plugins/maven-javadoc-plugin/javadoc-mojo.html
- https://stackoverflow.com/questions/2784183/what-does-cdata-in-xml-mean
表示の仕方

#Virtual Boxでメニューバーが表示できない....
virtual Boxを起動中に不意にメニューバーを消してしまった..消えてしまった時の対処法を書いてみました。
**解決方法①**
1. Oracle　VM Virtual Boxマネージャーを開いてら設定（s）を開きます。
2. ユーザーインターフェースがあるので選択
3. ミニツールバーの各に項目にチェックが入っていることを確認します。付いていなかったらチェックを入れておきます。
4.そして再起動をしたらでてきます。
 
**解決方法②**
もし上記のやり方で出なかった場合「Hostキー＋Home」キーで表示メニューと同じものがでてきます。Hostキーの設定はVirtual Boxから環境設定をクリックします。「入力」というところがあるのでそこから「Hostキー」を設定することができます。

ーーー最後に一言ーーー
授業中エラーが出たりした時いろいろ直し方を調べるのは、とても面白いと思いました。
PHP(monolog)でCloudWatchにログを貯める


いろいろなログをAWS CloudWatchで集中管理したいな・・・ということでPHPのログを流し込む例。
monologであればLaravelでもそのまま使えますので。

基本的には、[ここ](https://github.com/maxbanton/cwh)のBasic Usageの通りやればいいのですが、一部情報が不足しているので追加メモ。さらに詳しいログ設定は、AWS公式の[ここ](https://aws.amazon.com/jp/blogs/news/php-application-logging-with-amazon-cloudwatch-logs-and-monolog/)を見ればいいのですが、英語訳が変なのと、いきなり見るには少々複雑。

PHP書くのもめんどくさい場合は、コマンドでも書き込めます。[ここ](https://qiita.com/zaburo/items/c90645afc0862184c823)を参考にして下さい。

## 前提

### IAMユーザーの準備

とりあえずCloudWatchFullAccess権限を持つユーザーを準備し、KeyとSecretを取得しておきます。

### リージョン情報の準備

だいたい東京なので、ap-northeast-1でしょうか。必要に応じてメモします。


### ライブラリのインストール

composerで必要なライブラリをインストールしておきます。

```bash
cd
mkdir phplog
cd phplog
composer require aws/aws-sdk-php monolog/monolog maxbanton/cwh:^1.0
```

## 実装

実装は下記の通り。基本的にmaxbanton/cwhのページのものと同じですが、require "vender/autoload.php"など追加しています。

この通り動かすと[php-logtest]というグループと[ec2-instance-1]というストリームが自動生成され、ログが貯まります。

```php:index.php
<?php

    require "vendor/autoload.php";

    use Aws\CloudWatchLogs\CloudWatchLogsClient;
    use Maxbanton\Cwh\Handler\CloudWatch;
    use Monolog\Logger;

    $sdkParams = [
        'region' => 'ap-northeast-1',
        'version' => 'latest',
        'credentials' => [
            'key' => 'xxxxxxxxxxxxxxxx',
            'secret' => 'xxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxx',
        ]
    ];

    // Instantiate AWS SDK CloudWatch Logs Client
    $client = new CloudWatchLogsClient($sdkParams);

    // Log group name, will be created if none
    $groupName = 'php-logtest';

    // Log stream name, will be created if none
    $streamName = 'ec2-instance-1';

    // Days to keep logs, 14 by default. Set to `null` to allow indefinite retention.
    $retentionDays = 30;

    // Instantiate handler (tags are optional)
    $handler = new CloudWatch($client, $groupName, $streamName, $retentionDays, 10000, ['my-awesome-tag' => 'tag-value']);

    // Create a log channel
    $log = new Logger('name');

    // Set handler
    $log->pushHandler($handler);

    // Add records to the log
    $log->debug('Foo');
    $log->warning('Bar');
    $log->error('Baz');
```

## 備忘

* 当然ですが、AWS以外（オンプレなど）からでも貯められます。
* 上記で動作を確認した上で、[公式情報](https://aws.amazon.com/jp/blogs/news/php-application-logging-with-amazon-cloudwatch-logs-and-monolog/)を参考により詳細な設定をするといいでしょう。
stdClassについて(PHP)

#stdClassとは

・PHPデフォルトのクラス
・親クラスなどは無い
・プロパティが無い
・メソッドが無い
・マジックメソッドが無い
・インターフェイスが無い

#どうやって使うのか

```php
  $member = new stdClass();
  $member->name = 'Qii太';
  echo $member->name;
```
Firebase Cloud FirestoreをSwiftで使う時のデータ型一覧

#概要
Firebaseのデータベースの一つ、CloudFirestoreを利用した時に利用できるデータ型を一覧にしました。

#一覧

| Left align       |       Right align |
|-----------------:|------------------:|
| ブール型          |               Bool|
| 文字列            |             String|
| 整数             |                Int|
| 浮動小数点        |              Float|
| 日付             |             NSDate|
| 配列             |              Array|
| 辞書型           |         Dictionary|
| Null値           |                nil|

##データ例 in Swift

```swift
let docData: [String: Any] = [
    "stringExample": "Hello world!", //String
    "booleanExample": true, // Bool
    "numberExample": 3.14159265, // Float
    "dateExample": NSDate(), //日付
    "arrayExample": [5, true, "hello"], //Array
    "nullExample": NSNull(), // nil
    "objectExample": [ 
        "a": 5,
        "b": [
            "nested": "foo"
        ]
    ] //dictionary
]

db.collection("data").document("one").setData(docData) { err in
    if let err = err {
        print("Error writing document: \(err)")
    } else {
        print("Document successfully written!")
    }
}
```

##型が混同したフィールドがあるときの決定論的順序付け

1. Null値  -> nil
2. ブール型  -> bool
3. 数値順に並べられた整数値と浮動少数点値 -> Int, Float
4. 日付の値 -> NSDate
5. テキスト文字列の値 -> String
6. バイト値
7. Cloud Firestoreの参照 -> String
8. 地理的座標値
9. 配列値
10. マップ値

#参考文献
 - 公式のFirebase cloud Firestoreより
    - [データ型一覧](https://firebase.google.com/docs/firestore/manage-data/data-types?hl=ja)
    - [データを追加する](https://firebase.google.com/docs/firestore/manage-data/add-data?hl=ja)
Redmine3.4.5をCentOS7 MySQL Community Server8環境へインストール 



試しにMySQL Community Server 8をインストールした環境に
Redmineをインストールしてみましたが、
**躓いたのは凡ミスばかりで
MySQL8固有の問題は発生しませんでした。**


ほとんどRedmine.JPに記載のPostgreSQL用の手順通りやれば大丈夫そうでした。

> ##環境
VirtualBox5.2.8
>>OS
CentOS Linux release 7.4.1708 (Core)
3.10.0-693.el7.x86_64
>>WEB
httpd-2.4.6-67.el7.centos.6.x86_64
>>DB
mysql-community-server-8.0.11-1.el7.x86_64
>>Ruby
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]

## 参考URL
[Redmine 3.4をCentOS 7.3にインストールする手順](http://blog.redmine.jp/articles/3_4/install/centos/)

# Redmine インストールでつまづいた点メモ

## bundle installでmysql2をインストールしようとしてエラー

>$ bundle install
>>An error occurred while installing mysql2 (0.4.10), and Bundler cannot
continue.
Make sure that `gem install mysql2 -v '0.4.10'` succeeds before bundling.

>>★この後のエラーメッセージはメモ忘れ。。

エラーメッセージに従い、mkmf.logを確認すると以下の出力
>/usr/bin/ld: -lmysqlclient が見つかりません
collect2: エラー: ld はステータス 1 で終了しました

ldコマンド実行時、mysqlclientが見つからないというエラーだった。
しかし、mysql-community-clientはインストール済み

**mysql-community-develを追加でインストールすると正常にgem install できた。**

rpm -qlの結果から、以下のあたりが足りなかった？
>/usr/lib64/mysql/libmysqlclient.a
/usr/lib64/mysql/libmysqlclient.so
/usr/lib64/mysql/libmysqlservices.a

## redmineにアクセスすると Permission denied

Apache のエラーログには以下の出力
>Message: Cannot stat '/root/software/redmine-3.4.5/config.ru': Permission denied (errno=13)
Backtrace:
   in 'void Passenger::Apache2Module::DirectoryMapper::autoDetect()' (DirectoryMapper.h:148)
   in 'bool Passenger::Apache2Module::Hooks::prepareRequest(request_rec*, Passenger::Apache2Module::DirConfig*, const char*, bool)' (Hooks.cpp:444)

恥ずかしながら、Redmineを/root配下に配置しており
/var/www/html/redmineをシンボリックリンクとして設定していた。
Options FollowSymLinksは設定済みだった。
 /etc/httpd/conf.d/redmine.confの抜粋
>
\<Directory "/var/www/html/redmine">
  Require all granted
  Options FollowSymLinks
  AllowOverride All
  Order allow,deny
  Allow from all
\</Directory>

どうやらフルパス全てのディレクトリに対してapacheユーザのアクセス権がないと
このエラーが出力される様子。

/rootの所有者をいじるのは抵抗があったため
別なディレクトリにredmineディレクトリを丸ごとコピーして
apacheユーザのアクセス権を付与して解決した。
Ubuntu 18.04 で USB Wi-Fi アダプタを認識させる

今回私は開発環境として Ubuntu 18.04 を導入しましたが、
自前の USB Wi-Fi が network interface として認識されず非常に苦労しました。

USB Wi-Fi 自体どちらかといえば、あまり推奨されておらず(PCI推奨)、
本家サポートや、海外圏にも情報が少なかったため、簡単にまとめておこうと思います。

# 対象製品について

私は下記製品を利用しました。
Ubuntu 16.04 時代に、安定動作しているという報告が多かったのが理由です。

* ELECOM WDC-433DU2HBK  
  http://www2.elecom.co.jp/products/WDC-433DU2HBK.html

製品自体は、Linux サポートを謳ってはいませんが、
本製品が採用する Realtek のチップ(RTL8821A)は Linux 向けのドライバが公開されているため、
それを自前でビルドしてインストールすることで利用できます。

従って、WDC-433DU2HBK 以外にも RTL8821A を採用する製品であれば、
恐らく同様の手順で利用可能だと思われます。

下記テーブルの製品群をみるとそれなりにメジャーどころは動くんじゃないかな…

* rtl8812au/blob/master/os_dep/linux/usb_intf.c  
  https://github.com/msharov/rtl8812au/blob/master/os_dep/linux/usb_intf.c#L287

# リポジトリ

* ~~Realtek 802.11n WLAN Adapter Linux driver (msharov forked)~~  
  ~~https://github.com/msharov/rtl8812au.git~~

~~上記リポジトリのソースコードをビルドしてインストールしました。~~

~~フォーク元のリポジトリはメンテが止まっているようで、~~
~~__Ubuntu 18.04 が採用している Linux Kernel 4.15 系に対応していないため、ビルドエラーとなります。__~~

~~masharov さんが下記の通り本家に PR 出していますので、~~
~~それがマージされれば、本家を利用して問題ないと思います。~~

* ~~Update for kernel 4.15~~  
  ~~https://github.com/gnab/rtl8812au/pull/141~~

__追記(2018/09/12)__

既に上記の PR が本家リポジトリに取り込まれていますので、
本家のソースコードを利用して問題ないと思います。(動作未確認)
https://github.com/gnab/rtl8812au/

## ビルド

リポジトリの README.md を参照してください。

ただ補足するなら、x86(64)/PC で利用する分には単に clone して make するだけです。
Raspberry Pi など ARM 向けにビルドする場合は一部コンフィグの書き換えが必要なようです。

```shell:build
git clone https://github.com/msharov/rtl8812au.git
make -C ./rtl8812au
```

## 動作確認

```shell:load
sudo insmod 8812au.ko
```

insmod でカーネルモジュールの動的ロードが通れば、
Ubuntu 18.04 の GUI 上で Settings -> Wi-Fi が enable となり、
検知している SSID が表示されますので、あとはいつものように設定をすすめれば接続完了です。

…が、私の場合ここで下記エラーがでました。

```shell:error
insmod: ERROR: could not insert module 8812au.ko: Required key not available
```

どうもこれはセキュアブートによる影響のようです。
BIOS あるいは UEFI から、セキュアブートを disable (not windows OS) にする必要がありました。

M/B メーカーや時期によって項目は異なりますが、
Boot や Security 周辺の項目を探していれば見つかると思います。

## インストール

動作確認できたら、
次回起動時にもモジュールがロードされるようにインストールしておきます。

Makefile を見ると `install:` が実装されているので、`sudo make install` を叩けば良いように思いましたが、
うまく動作しなかったため、下記 README.md の手順でインストールしました。

```shell:install
sudo cp 8812au.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless
sudo depmod
```

## DKMS

まだ試せていませんが、こちらも README.md に記載があるので参照してください。

## 補足

USB Wi-Fi のドライバが ready になるまでは iPhone を USB で接続してテザリングで通信していました。
USB 接続のみで PnP でドライバがインストールされ、労せずネットワーク接続できたため、
一時的にネットワーク接続が必要な場合に便利でした。
Vue.js、クロージャの中からthisを参照出来ない

<追記>
出来ないとおもたら色々やり方あるようです。
コメント欄をご参照下さい。


以下のようにpropsで渡した値と、li要素のカスタムデータ属性に指定した値を比較したかった。

```html
<ul>
    <li v-for="(value, key) in lists" :data-order-id="value.id">
        {{ key }}：{{ value }}
    </li>
</ul>
```

```javascript
props: ['lists', 'orderId'],
mounted: function () {
    let li = $('ul > li');

    // 一つ一つのli要素に対して処理
    li.each(function () {
        // propsで渡した値とカスタムデータ属性から取得した値を比較
　　　　　　　　　　　　　　　　if ($(this).data('orderId') === this.orderId) {
            console.log($(this).data('orderId'))
        }
    });
}
```

この書き方だと、`this.orderId`が`undifine`となり`if`の中身が実行されません。
クロージャの中からはthisを参照出来ない？っぽい。

以下のように書きます。

```javascript
props: ['lists', 'orderId'],
mounted: function () {
    let li = $('ul > li');
    // クロージャの前にここで変数に格納して、比較にはこの変数を使う
　　　　　　　　let orderId = this.orderId;

    // 一つ一つのli要素に対して処理
    li.each(function () {
        // propsで渡した値とカスタムデータ属性から取得した値を比較
　　　　　　　　　　　　　　　　if ($(this).data('orderId') === orderId) {
            console.log($(this).data('orderId'))
        }
    });
}
```
これで成功しました。
スコープ大事。
Linuxのテキストフィルタコマンドであそんでみよう

# はじめに

## テキストフィルタコマンドとは
標準入力（キーボードとか）を入力として受け取り、標準出力（ディスプレイとか）に出力するコマンドを**テキストフィルタコマンド**というそうです。この記事では**「テキストフィルタコマンドでこんなことができちゃうんだぞ（どやー）」**的なことを紹介してみます。

## この記事であそぶテキストフィルタコマンド一覧
[まんがでわかるLinux シス管系女子](https://www.amazon.co.jp/%E3%81%BE%E3%82%93%E3%81%8C%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8BLinux-%E3%82%B7%E3%82%B9%E7%AE%A1%E7%B3%BB%E5%A5%B3%E5%AD%90-%E6%97%A5%E7%B5%8CBP-Next-ICT%E9%81%B8%E6%9B%B8-Piro-%E7%B5%90%E5%9F%8E%E6%B4%8B%E5%BF%97-ebook/dp/B00TQMFOCW/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=&sr=)を参考にグループ分けしてみました。

### ファイルの中身を表示するコマンド
| コマンド | なにこれ? | 使い方の例 | 
|:--|:--|:--|:--|
| cat | ファイルの中身を全部表示する | $ cat -n /etc/hosts |
| tail | ファイルの中身の末尾を表示する | $ tail -f -n 5 /etc/services |
| join | 共通フィールドのある2つのファイルを連結して表示する | $ join file1 file2 |
| paste | 2つのファイルを連結して表示する | $ paste file1 file2 |

### コマンドの結果を加工するコマンド
| コマンド | なにこれ? | 使い方の例 | 
|:--|:--|:--|:--|
| grep | 正規表現で文字列を検索して表示する | $ grep -E -n "#+" /etc/httpd/conf/httpd.conf |
| sort | 昇順/降順に表示する | $ sort -r file |
| cut | 指定したデリミタで分割して表示する | $ cut -d":" -f1 /etc/passwd |
| uniq | 重複する行を1行にして表示する | $ uniq -c uniq |
| sed |  |  |
| awk |  |  |
| nl | 行番号を表示する | $ nl -w4 -nrz -s": " /etc/hosts | 
| tr | 文字を変換して表示する | $ cat /etc/services パイプ tr [:lower:] [:upper:] |

### コマンドの結果を最終加工するコマンド
| コマンド | なにこれ? | 使い方の例 | 
|:--|:--|:--|:--|
| less | ファイルを1画面ずつ表示する | $ less -N -M file |
| tee | コマンドの結果の表示とファイル出力をする | $ grep -E -n "#+" /etc/httpd/conf/httpd.conf パイプ tee -a file |
| wc | ファイルの行数、単語数、文字数を表示する | $ wc -l /etc/services |
| head | ファイルの中身の先頭を表示する | $ head -n 5 /etc/services |
| xargs | コマンドの結果を制限つきの引数として使用し、コマンドを実行する | $ echo * パイプ xargs ls |

# 参考資料
- [Linux教科書 LPICレベル1 Version4.0対応](https://www.amazon.co.jp/Linux%E6%95%99%E7%A7%91%E6%9B%B8-LPIC%E3%83%AC%E3%83%99%E3%83%AB1-Version4-0%E5%AF%BE%E5%BF%9C-%E3%83%AA%E3%83%8A%E3%83%83%E3%82%AF%E3%82%B9%E3%82%A2%E3%82%AB%E3%83%87%E3%83%9F%E3%83%BC%E4%B8%AD%E5%B3%B6%E8%83%BD%E5%92%8C-ebook/dp/B01076Y8CC/ref=sr_1_1?s=digital-text&ie=UTF8&qid=1525416453&sr=1-1&keywords=Linux%E6%95%99%E7%A7%91%E6%9B%B8+LPIC%E3%83%AC%E3%83%99%E3%83%AB1+Version4.0%E5%AF%BE%E5%BF%9C)
- [新しいLinuxの教科書](https://www.amazon.co.jp/%E6%96%B0%E3%81%97%E3%81%84Linux%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8-%E4%B8%89%E5%AE%85-%E8%8B%B1%E6%98%8E-ebook/dp/B072K1NH76/ref=sr_1_1?s=digital-text&ie=UTF8&qid=1525416438&sr=1-1&keywords=%E6%96%B0%E3%81%97%E3%81%84Linux%E3%81%AE%E6%95%99%E7%A7%91%E6%9B%B8)
- [まんがでわかるLinux シス管系女子](https://www.amazon.co.jp/%E3%81%BE%E3%82%93%E3%81%8C%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8BLinux-%E3%82%B7%E3%82%B9%E7%AE%A1%E7%B3%BB%E5%A5%B3%E5%AD%90-%E6%97%A5%E7%B5%8CBP-Next-ICT%E9%81%B8%E6%9B%B8-Piro-%E7%B5%90%E5%9F%8E%E6%B4%8B%E5%BF%97-ebook/dp/B00TQMFOCW/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=&sr=)
Laravelでビルドインサーバーが起動しているのにつながらない時の対策

#はじめに

Laravelでプロジェクトを作成し、そのままの状態で「php artisan serve」としてビルドインサーバーを起動し、http://127.0.0.1:8000 にアクセスするとデフォルトの画面が表示されるはずです。しかし、この画面が表示されないという現象が起こっていました。

今回この問題が解決したので、同様の症状に苦しむ方が一人でも減るように記事にしました。結論から書くと、私の場合ウイルス対策ソフトの「Avast」が原因でした。

#http://127.0.0.1:8000 につながらない

###ブラウザが応答待ちや待機中になってつながらない

まず、http://127.0.0.1:8000 にアクセスしようとするとブラウザが応答待ちや待機中になってつながらないという症状がありました。これは「Avast」の機能をオフにする・停止することでつながるようになりました。

###server.phpが消えている

次に、つながったとしても"surver.php"がないと怒られました。Laravelのプロジェクトを作成した直後は存在していたはずなのに、これがいつの間にか消えていたのです。これも犯人はAvastでした。Avastの「ウイルスチェスト」を調べてみるとなんと「surver.php」が消されているではありませんか。

![fig1.png](https://qiita-image-store.s3.amazonaws.com/0/239294/1933c57b-db28-5cad-f1db-e633b8428374.png)

再度消されないように対策をしておきましょう。(Avastのバージョンによっては画像と場所が変わりうるのでご了承ください。)

「Avast」の設定を押します。
![fig2.png](https://qiita-image-store.s3.amazonaws.com/0/239294/47c963d7-1821-c6e0-5746-f359bdff0889.png)

そして「一般」の「スキャンからの除外」でスキャンされてほしくないファイルを指定します。今回は作業するプロジェクトを保存するフォルダと一応「Composer」関連のフォルダを指定しておきました。

![fig3.png](https://qiita-image-store.s3.amazonaws.com/0/239294/1fe91f6b-eeb7-73a6-52d7-48082cf959c9.png)


こうすることで、今後新たなプロジェクトを指定したフォルダ内で作成する分には「server.php」が消されることはないと思います。

#おわりに

なぜビルドインサーバーが起動しているのに上手くつながらないのかとだいぶ苦しみましたが、ようやく原因がわかりました。

今後インストールなどする際はウイルス対策ソフトはオフにする習慣をつけようと思います。

この記事で一人でも犠牲者が減れば幸いです。お読みいただきありがとうございました。

#参考文献

[avast!で特定のファイルを復元して除外リストに追加する方法](https://support.matsui.co.jp/faq/show/481?category_id=98&site_domain=faq)

[Laravel deletes server.php on first artisan serve](https://github.com/laravel/framework/issues/23809)
nginxでhttps通信をできるだけ高速化する

# 概要

[テニスプレイヤーがLaravelでWebサービス作ってみた](https://qiita.com/UNKCHAN/items/59c8be24321524b0dbf8)の個別記事です。

Let's Encryptでhttps通信を実現した後、httpsのオーバーヘッドをできるだけ少なくして、画面表示までの時間を短くしたときに使ったnginx.confの設定を記載します。個々がどんな技術かは詳しく記載しません。

Webサーバ上でphp(Laravel)が動作する、リバースプロキシやロードバランサを経由させない構成を想定しています。

nginx + Let's Encryptの設定については[さくらのナレッジ](https://knowledge.sakura.ad.jp/5573/)がとってもわかりやすいです。


- gzip圧縮
- http/2
- OCSP


## gzip圧縮

いきなりhttps関係ないですが、クライアントとサーバでファイルをやりとりする時に、対応するブラウザであればファイルをgzipで圧縮して転送する仕組みがnginxでは簡単に実装できます。

```lang:/etc/nginx/nginx.conf
http {
    ...
    gzip  on; #動的圧縮を有効化
}
server {
    ...
    location ~* \.php$ { #locationは適宜変更

        ...
        #圧縮する対象のファイルをmime typeで指定。text/htmlは常に圧縮される
        gzip_types text/css text/javascript
                   application/x-javascript application/javascript
                   application/json;
        gzip_min_length 1k; #圧縮対象ファイルの最小サイズ指定
        gzip_disable "msie6"; #IE6では圧縮されたファイルの展開に失敗することがあるので、その場合は圧縮しない

        ...
    }
}
```

## http/2

クライアントとのhttps通信を効率的に、より少ない通信量で行う手法です。http/2を使うためにはSSL対応が必須です。

```lang:/etc/nginx/nginx.conf
server {
    listen 443 ssl http2;
    ...

}
```

これだけです。

## OCSP

https通信を行う際、クライアントはWebサーバから送られてきた証明書の妥当性を毎回、認証局へ確認しに行きます。この動作はセキュリティ的には必要なのですがオーバーヘッドが非常に大きいです。妥当性が確認された証明書を渡していること(証明書が失効していないこと)をWebサーバにキャッシュしておき、まとめてクライアントへ渡すことでオーバーヘッドを最小限に抑える仕組みがOCSPです。

```lang:/etc/nginx/nginx.conf
server {
    ...
    resolver 8.8.8.8; #OCSPサーバへ通信するためネームサーバを指定する

    ssl_stapling on; #OCSPを有効化
    ssl_stapling_verify on; #OCSPの問い合わせ結果が正しいものであることを検証する

    #自身の証明書を指定する。CA証明書と中間CA証明書が1ファイルになったものを指定する必要がある。
    #Let's Encryptを利用している場合はchain.pemを指定すればOK
    ssl_trusted_certificate /etc/letsencrypt/live/[your.domain]/chain.pem; 

}
```
RailsでDBを共有する別アプリケーションを作る時のマイグレーション設定

## 背景
- Rails 4.2 で開発していたアプリケーションを 5.2 まで上げたい
- コードが滅茶苦茶だったのと、規模がそこまで大きくなかったので、DBだけ引き継いで新しいアプリケーションとして作りたい
- マイグレーションファイルの設定を誤るとDBの全レコードが消えるのでローカルで慎重に動作確認する

## 環境
- Ruby on Rails 4.2 -> 5.2
- Ruby 2.5.1

## 手順
1. `rails new xxx` コマンドでプロジェクトを作成する
2. 旧アプリの config/database.yml の内容を新アプリにコピペする
3. 旧アプリのモデルを全て `rails g model xxx` コマンドで生成する（カラム設定は不要）
4. 自動生成されたマイグレーションファイルを削除する
5. 旧アプリの `db/schema.rb` を新アプリの `db/migrations/` ディレクトリ配下にコピーする
6. DBの `schema_migrations` を見て、最新のタイムスタンプを上記のファイル名の先頭に付け、適当なファイル名に変更する（例: `20180401100000_create_initial_database.rb` など）
7. ファイル名に合わせてマイグレーションファイルのクラス名を編集し、 `ActiveRecord::Migration` の末尾に旧バージョン `[4.2]` を付ける。あと `def change ~ end` も追加する。
8. `rails db:migrate` を実行して `schema.rb` を生成する

## 解説
- Railsは `rails db:migrate` 実行時にマイグレーションファイルのタイムスタンプをDBのschema_migrations内レコードと照合し、ファイル名のタイムスタンプがまだDBに登録されていなければ、マイグレーションを実行する。
- そのため既にDBに登録済みのタイムスタンプをマイグレーションファイルのファイル名に付けておけば実行されない。
JSのPromiseが気持ちがいいのでC++でもやりたい

# はじめに
最近JSを書いているんですが、非同期処理をPromiseでメソッドチェーンをしていくのが気持ちがいいです。

参考：[Promiseと仲良くなって気持ち良く非同期処理を書こう](https://qiita.com/progre/items/03626b7f4655007d8cb2)

C++でもやってみたかったので簡単な実装だけしてみました

# 実装方針

operatorオーバーロードによる、なんちゃってメソッドチェーンで実装します。
~~C++にも統一関数呼び出し構文が欲しい~~

# 実装
```cpp:future_then.hpp

//std::future.then風　関数オブジェクト
constexpr struct FutureThen_OP
{
private:
	template<class Func>
	struct Param
	{
		Func func;
	};
public:
	//thenの引数うけとり
	template<class Func>
	Param<Func> operator ()(Func f)const
	{
		return { std::move(f) };
	}

	//thenの実装
	template<class T,class Func>
	friend auto operator | (std::future<T> fut, Param<Func> param)->std::future<decltype(param.func(fut.get()))>
	{
		return std::async([](std::future<T> fut, Func func)
		{
			return func(fut.get());
		}, std::move(fut), std::move(param.func));
	}

	//thenの実装　future<void>用
	template <class Func>
	friend auto operator | (std::future<void> fut, Param<Func> param)->std::future<decltype(param.func())>
	{
		return std::async([](std::future<void> fut, Func func)
		{
			fut.wait();
			return func(); 
		}, std::move(fut), std::move(param.func));
	}

}then;
```

# 使い方

operator | でチェーンして使います

```cpp:main.cpp
int main()
{
	auto f = std::async([]{
		return 10;
	})| then([](int i){
		std::cout << i;
		return 2 * i;
	})| then([](int i) {
		std::cout << i;
		return 3 * i;
	})| then([](int i) {
		std::cout << i;
		return 4 * i;
	});

	
	std::cout<< f.get();

	return 0;
}
```

# 参考
https://stackoverflow.com/questions/14489935/implementing-futurethen-equivalent-for-asynchronous-execution-in-c11
# おまけ
std::futureにthenを追加する提案はでてるようです
https://faithandbrave.hateblo.jp/entry/2014/01/22/170813
http://en.cppreference.com/w/cpp/experimental/future
Vue.jsでカスタムデータ属性を使う

リストの一つ一つの要素にカスタムデータ属性を指定する。
以下のように`v-bind:`を使う(以下は省略表記の`:`を使っている。)

```html
<ul>
    <li v-for="(value, key) in lists" :data-order-id="value.id">
        {{ key }}：{{ value }}
    </li>
</ul>
```

このデータをJavascript側で使う

```javascript
mounted: function () {
    let li = $('ul > li');

    // 一つ一つのli要素に対して処理
    li.each(function () {
        // 通常と同じように.dataでアクセス出来る
        console.log($(this).data('orderId')) // value.idの値が順番にconsoleに表示される
    });
}
```

`:data-order-id`ではなく`data-order-id`だとエラーになりました。
RailsでRSpecテストを実行するまで


これまで全くテストを書かずにアプリ制作を進めてしまっていたので，勉強も兼ねてRSpecを導入してみました．
細かい設定はさておき，とりあえず1つテストを動かしてみることを目標にします．

#### 環境
|OS|macOS 10.13.4|
|:---:|:---:|
|ruby|2.5.0|
|rails|5.1.5|

railsアプリはすでに作成済みとします．

#### gemのインストール

```ruby:Gemfile
group :development, :test do
  ~
  gem 'rspec-rails'
end
```
```Bash:command
bundle install
```

#### RSpecのインストール

```Bash:command
rails g rspec:install
```

#### specファイルの作成
今回はmodelのテストを書いてみます．

```Bash:command
rails g rspec:model [model_name]
```
`spec/models/[model_name]_spec.rb`というファイルが作成されます．

#### テストの作成
とりあえずテストで期待する振る舞いだけ記述してみます．
describeブロックの中でitに続けて振る舞いを書きます．
(競馬のアプリを作ってるのでサンプルはそれに依ってます)

```ruby:horse_spec.rb
require 'rails_helper'

RSpec.describe Horse, type: :model do
  it 'gets gate class depends on gate number'
end
```

試しにrspecを実行してみます．

```Bash:command
bundle exec rspec
```

すると

```
Pending: (Failures listed here are expected and do not affect your suite's status)

  1) Horse gets gate class depends on gate number
     # Not yet implemented
     # ./spec/models/horse_spec.rb:4


Finished in 0.00956 seconds (files took 4.74 seconds to load)
1 example, 0 failures, 1 pending
```
テスト内容を記載していないのでpendingとして扱われます．
ともかく，最初のテストを作成することが出来ました．

#### テストの実装
ではテストを実装していきます．
modelのインスタンスを生成して，メソッドの戻り値を検証するテストです．

```ruby:horse_spec.rb
require 'rails_helper'

RSpec.describe Horse, type: :model do
  it 'gets gate class depends on gate number' do
    horse = Horse.new(1, 2, 'キタサンブラック', '牡5 57 武豊', '1.9(1人気)')
    expect(horse.get_gate_class).to eq 'horse-table gate-number'
  end
end
```

再度テストを実行すると

```
Finished in 0.00344 seconds (files took 0.6508 seconds to load)
1 example, 0 failures
```
無事テストを成功させることが出来ました．

#### 最後に
今回はとりあえずテストを動かすことにピンを留めてやってみました．
ですので，RSpecの良さをほとんど活かせてないと思います．
いつかRSpecのメリットを伝えられる記事を書けるようになりたいなあ．おわり．
OpenJDK（Java）を最新のUbuntuにインストール

# Javaのインストール

Ubuntuであれば`apt`コマンドでインストールできます。
Javaを動かしたいだけであれば「**Javaの利用のみの方（JRE）**」、開発者は「**開発者の方（JDK）**」の章を読んでください。

## 環境

以下の環境で動作を確認しています。

- Ubuntu18.04

# Javaの利用のみの方（JRE）

OpenJDKのバージョンを検索

```sh:terminal
$ sudo apt search openjdk-\(\.\)\+-jre$
```

任意のバージョンをインストールします。ここではJava8を選択しています。

```sh:terminal
$ sudo apt-get install openjdk-8-jre
```

最後にJavaがインストールされているかを確認します。

```sh:terminal
# javaのバージョンチェック
$ java -version
openjdk version "1.8.0_162"
OpenJDK Runtime Environment (build 1.8.0_162-8u162-b12-1-b12)
OpenJDK 64-Bit Server VM (build 25.162-b12, mixed mode)
```

# 開発者の方（JDK）

OpenJDKの開発者向けバージョンを検索

```sh:terminal
$ sudo apt search openjdk-\(\.\)\+-jdk$
```

任意のバージョンをインストールします。ここではJava8を選択しています。

```sh:terminal
$ sudo apt install openjdk-8-jdk
```

最後にインストールされているかを確認します。JDKをインストールした場合は`javac`コマンドが使えるようになります。

```sh:terminal
# javaのバージョンチェック
$ java -version
openjdk version "1.8.0_162"
OpenJDK Runtime Environment (build 1.8.0_162-8u162-b12-1-b12)
OpenJDK 64-Bit Server VM (build 25.162-b12, mixed mode)

# JDKがインストールされているかチェック
$ javac -version
javac 1.8.0_162
```

# 最後に

`apt`にないバージョンをインストールしたい方は以下のOpenJDKの公式サイトの手順に従ってインストールしてください。

- [How to download and install prebuilt OpenJDK packages](http://openjdk.java.net/install/)
[Raspberry PI] sshを切った後も実行したままにする


# screen コマンド
## インストール方法
```
sudo apt-get install screen
```
## コマンド
```
// 新しいセッションを作成
screen 
// セッション一覧を表示
screen -ls
// セッションにアタッチ
screen -r <pid>
```

## ショートカット
```
// セッションからデタッチ
ctrl + a => d
```

# tmux コマンド
## インストール方法
```
sudo apt-get install tmux
```
## コマンド
```
// 起動
tmux
// アタッチ
tmux a
```
## ショートカット
```
// セッションからデタッチ
ctrl + b => d
// セッション内にウィンドウ作成
ctrl + b => c
// 数字のウィンドウ表示
ctrl + b => 数字
// ウィンドウを閉じる
ctrl + b => x
// ヘルプの表示
ctrl + b => ?
```

# 参考
* screenコマンドの要点
  https://qiita.com/ryounagaoka/items/8203e9c149b542986c92
Excel VBA (マクロ) 備忘録

# 記載目的
* Excelでの業務はどの案件でも必要となるため、VBA知識があると効率的
* 基本的なものから応用的な内容へ繋がる記載にしてゆきたい

# 補足
* 本当に必要そうなものに限定する
* 冗長な表現を極力避ける
* 随時更新する

# 記載の順番は以下
* 【基本的な書き方】
* 【VBAショートカット】 ※WindowsPC
* 【具体例】
* 【作成したVBA】

## 【基本的な書き方】
|説明 　　　|例　　　    　　　    |備考    |
|:-----------|:------------------|:------------|
|対象.命令|Range("A1").Select||
|対象.様子|Range("A1").Value = 123||
|使用する変数の型はこちらのみで良さそう|Long(長整数型)　／　String(文字列型)||

## 【VBAショートカット】 ※WindowsPC
|説明 　　　|例　　　    　　　    |備考    |
|:-----------|:------------------|:---------------|
|入力候補の表示|Ctrl + Space||
|行の削除|Ctrl + Y||
|インデントを付ける|2行以上選択して Tab||
|インデントを戻す|Shift + Tab||
|クイックヒントの表示|Ctrl + I||
|無限ループ時の強制中断|Ctrl + Pause　／　Ctrl + Break　／　Esc|左記いずれか|
|実行|F5||
|コード1行ずつ実行|F8||

## 【具体例】
|説明 　　　|例　　　    　　　    |備考    |
|:-----------|:------------------|:------------|
|セルコピー|Range("A1").Copy TARGET||
|セルA1から連続してデータが入った最下端セルを選択|Range("B2").End(xlDown).Select||
|アクティブのワークブックのフルパスを取得|ActiveWorkbook.FullName||
|他のプロシージャを呼べる|Call プロシージャ名||
|文字色　設定|Cell.Font.Color  = RGB(255, 255, 255)||
|背景色　設定|Cell.Interior.Color  = RGB(255, 255, 255)||
|セルが空欄かどうか調べたい|Cell.Value = ""||
|セルを検索|検索範囲.Find||
|相対的な位置のセルを操作|Cell.Offset(行数, 列数)||
|選択範囲の大きさを変更する|Cell.Resize(行数, 列数)||
|セルに数式を入力|Cell.Formula|Cell.Value|
|ワークシート関数を使うには|WorksheetFunction.関数名(引数)||

## 【作成したVBA】
### プロシージャの最初と最後に入れる処理が早くなるらしい ※コピペして使用する
```
With Application
  .ScreenUpdating = False
  .EnableEvents = False
  .DisplayAlerts = False
  .Calculation = xlCalculationManual
End With


''''''''''''''''''''''''''''''
'                            '
'   ~~ そのほかの処理内容 ~~　　　　　　　　　'
'                            '
''''''''''''''''''''''''''''''


With Application
  .ScreenUpdating = True
  .EnableEvents = True
  .CutCopyMode = False
  .Calculation = xlCalculationAutomatic
End With
```

### for文の基本的な使い方①
```
'指定セルから下方向へ1月から12月までを入力する
Dim i As Integer
　For i =1 to 12
  Cells(i, 1) = i & "月"
　Next i
```

### for文の基本的な使い方②
```
'上記for文 一個飛ばしバージョン
'一個飛ばし
Dim i As Integer
 For i =1 to 12 Step2
  Cells(i, 1) = i & "月"
 Next i
```

### ファイル開くダイアログ扱い方
```
Sub ファイル開くダイアログ扱い方()

'変数filenameを定義
  Dim filename As String

'Excelファイルに限定してファイルオープンダイアログを表示させる
  filename = Application.GetOpenFilename("Microsoft Excelブック,*.xls?")

'変数filenameに値がなければ、もしくは、それ以外の場合
  If filename  "False" Then
    Workbooks.Open filename
  Else
    MsgBox "キャンセルしました！"
    Exit Sub
  End If

End Sub
```

### PATHからファイルネーム抽出する
```
Dim filename As String
Dim filename_from_path As String
Dim targetname As String

'PATHからファイルネームのみ抽出
  filename_from_path = InStrRev(filename, "\")
  targetname = Mid(filename, filename_from_path + 1)
```

### 該当シートを、あるあるファイルの1番目のシート後ろへコピーする
```
Dim targetname As String

'ワークブック「targetname」の「コピーするシート」を、ワークブック「作業ファイル」の１つ目のシートの後ろへコピーする
  Workbooks(targetname).Worksheets("コピーするシート").Copy _
  After:=Workbooks("作業ファイル").Sheets(1)
```
Node.js の async/await のサンプル

Node.js の async/await のサンプルを書いてみました。
次のプログラムを書き換えました。
ライブラリーは、node-fetch を使いました。
[緯度経度から都市の名前を得る (Node.js)](https://qiita.com/ekzemplaro/items/f70b8385f4853ebeac97)

```js:reverse_geo.js
#! /usr/bin/node
//
//	reverse_geo.js
//
//					May/04/2018
//
// ------------------------------------------------------------------
function parser_results(dict_aa)
{
	var unit_out = {}
	unit_out['city'] = ""
	unit_out['pref'] = ""

	const components = dict_aa['results'][0]['address_components']
	for (var it in components)
		{
		const unit_aa = components[it]
		if (unit_aa['types'][0] == "locality")
			{
			unit_out.city = unit_aa['short_name']
			}
		else if (unit_aa['types'][0] == "administrative_area_level_1")
			{
			unit_out.pref = unit_aa['short_name']
			}
		}

	return unit_out
}

// ------------------------------------------------------------------
async function get_city_pref_proc(pos)
{
	const lat = pos[0]
	const lon = pos[1]

	api_key="***************************************"
	url_aa="https://maps.googleapis.com/maps/api/geocode/json?latlng="
	url=url_aa + lat + "," + lon + "&language=ja&key=" + api_key
//	console.error(url)


	const fetch = require("node-fetch")
	response = await fetch(url)
	const data = await response.json()

	var unit_aa = parser_results(data)

	unit_aa['lat'] = lat
	unit_aa['lon'] = lon

	return	unit_aa
}

// ------------------------------------------------------------------
async function main_proc()
{
	console.error("*** 開始 ***")

	const array_in = [[43.08,141.35],
			[36.56,139.88],
			[35.91,139.66],
			[35.68,139.76],
			[35.16,136.90],
			[34.70,135.50],
			[33.59,130.42],
			[31.56,130.56],
			[26.21,127.68]
			]
	array_aa = []

	for (var it in array_in)
		{
		const pos = array_in[it]
		array_aa.push(await get_city_pref_proc(pos))
		}

	console.error("array_aa.length = " + array_aa.length)

	array_aa.forEach(function(unit)
	{
	console.log(unit.lat,unit.lon,unit.city,unit.pref)
	})

console.error("*** 終了 ***")
}

// ------------------------------------------------------------------

main_proc()

// ------------------------------------------------------------------
```

実行結果

```text
$ ./reverse_geo.js 
*** 開始 ***
array_aa.length = 9
43.08 141.35 '札幌市' '北海道'
36.56 139.88 '宇都宮市' '栃木県'
35.91 139.66 'さいたま市' '埼玉県'
35.68 139.76 '千代田区' '東京都'
35.16 136.9 '名古屋市' '愛知県'
34.7 135.5 '大阪市' '大阪府'
33.59 130.42 '福岡市' '福岡県'
31.56 130.56 '鹿児島市' '鹿児島県'
26.21 127.68 '那覇市' '沖縄県'
*** 終了 ***
```
crowdworks から画像を一括ダウンロード

CrowdWorks は、画像アップロードのタスクを非常に簡単に作成できます。なので、機械学習で使うデータセットの収集などに便利です。

ただ、なぜかそれを簡単にダウンロードする方法が無く、一つずつ、ダウンロードする必要があります。
ので、wget で簡単にダウンロードする話しです。

1. Chrome の Cookie の情報をExportできるツールをインストール
    * https://chrome.google.com/webstore/detail/cookiestxt/njabckikapfpffapmjgojcnbfjonfjfg/related?hl=ja
2. Chrome で CrowdWorks の[ダッシュボード](https://crowdworks.jp/dashboard)ページにログイン
3. 承認済みのタスクを選択し、「形式を選んで内容を一括ダウンロード」をクリックし、SJIS形式を選択
4. ダウンロードしたCSVをExcelで開き、URL部分のみをコピーして、エディタなどに貼り付け
5. 1行に1つのURLになるように編集して保存。(urls.txtとする)
6. 先ほどのCrowdWorksを開いているChromeに戻り、"Export cookies.txt"のアイコンをクリック
7. Ctrl-a (Macの場合 Command-a) を押して、全選択してコピー
8. コピーした内容を適当なフォルダにcookies.txtとして保存
9. cat urls.txt | xargs wget -x --load-cookies cookies.txt

これで、1つずつ、ダウンロードします。（時間はかかりますが、crowdworksに余計な負荷を掛けないと思います）
フラグメントでExpandableListViewを使用する場合、継承をListFragmentにすると例外発生

##フラグメントでExpandableListViewを使用する


```xml:fragment1.xml
<RelativeLayout 
	xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:paddingBottom="0dp"
    android:paddingLeft="30dp"
    android:paddingRight="0dp"
    android:paddingTop="0dp" >
        
    <ExpandableListView
       	android:id="@+id/expListView"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:paddingLeft="5dp"
        android:paddingTop="5dp"
        android:background="#003060"
   		android:layout_width="match_parent"
   		android:layout_height="wrap_content"
   		android:clickable="true"
   		android:dividerHeight="3dp" />
</RelativeLayout>
```

ExpandableListViewを使用する場合、フラグメントを実装するクラスの継承を**ListFragment**にしてしまうと、

```Java:fragment1.java
public class Fragment1  extends ListFragment {
```


**onViewCreated**で**RuntimeException**が発生します。
（正確にはスーパークラス、つまりListFragmentのonViewCreatedで例外が投げられる）

```
 "Content has view with id attribute 'android.R.id.list' that is not a ListView class"
```

##例外の回避
これを回避するには、継承をListFragmentではなく**Fragment**にします。



```Java:fragment1.java
public class Fragment1  extends Fragment {
```
バージョン1803でWSLのUbuntuを再インストールするとエラーが発生する

WSLのUbuntuを再インストールしたところ以下のようなエラーが発生

```
Installing, this may take a few minutes...
Installation Failed!
Error: 0x800703fa
Press any key to continue...
```

PCを再起動すれば直るとのこと

* 参考

https://github.com/Microsoft/WSL/issues/2576
メモ

# メモ

syntax on
set ignorecase
set smartcase
set termencoding=utf-8
set fileencodings=utf-8,euc-jp,cp932
set autoindent
set smartindent
set cindent
set showmatch
set ruler
set fdm=marker
set shiftwidth=4
set tabstop=4
" カーソル行をハイライト
set cursorline
" カレントウィンドウにのみ罫線を引く
augroup cch
  autocmd! cch
  autocmd WinLeave * set nocursorline
  autocmd WinEnter,BufRead * set cursorline
  autocmd InsertChange * :echo "insert change"
  autocmd InsertLeave,CursorMoved * :echo "auto save exec event in leave"
  autocmd CmdwinEnter,CmdwinLeave * :echo "auto save exec event"
augroup END
"highlight CursorLine ctermbg=white guibg=white
"highlight CursorLine ctermbg=white guibg=white
highlight CursorLine ctermbg=black guibg=black
""
highlight ZenkakuSpace cterm=underline ctermfg=lightblue guibg=lightblue
match ZenkakuSpace /　/
"　
set laststatus=2 " 常にステータスラインを表示

set history=100

nnoremap ;b <C-B> 
nnoremap ;f <C-F> 
nnoremap ;o o<ESC>
nnoremap ;r <C-R> 
"nnoremap lp $
"nnoremap <TAB> i// {{{ dust <ESC>
"nnoremap ;<TAB> i// }}} <ESC>
nnoremap ;j /^[^0-9*\/]<Enter>
nnoremap ;h :s/,/---/g<Enter>
nnoremap ;k /^[^0-9*\/]<Enter>:s/,/---/g<Enter>

nnoremap pa yyp<C-a>l<C-a>
CakePHP3でSELECTするときに日付をフォーマットして出力する方法

## やりたいこと
DBから日付のデータをフォーマットを指定して出力する

## 方法
### 0.データの準備
```mysql
#テーブルの作成
create table samples (
id int,
username varchar(255),
created date
);

#データの挿入
inser into samples (id, username, created) 
values(1, user1, 2018-05-04);
```

### 1.日付のフォーマットを定義する
```php 
$newFormat = $this->Samples->find()
                  ->func()
                  ->date_format([
                    'created' => 'literal' //フォーマットするカラムの指定
                    "'%Y/%m'" => 'literal' //フォーマットを指定
                  ]);
```

まず指定したいフォーマットを格納する変数を用意します。
フォーマットの年月日部分は%Yのように%○で1セットです。
今回の例だと2018/5のような形で出力されます。

"と'の使用を間違えないようにしてください。
'literal'部分はどういう働きをしているのかよくわかりませんでしたが、必ず指定しなくてはいけないみたいです。

### 2.新しいフォーマットをselect中で指定して出力する

```php

$newFormat_dates = $this->Samples->find()
                  ->select(['newformat_created' => $newFormat])//任意のキーを設定（この例ではnewformat_createdとしています）し、$newFormatを指定します。
                  ->all();
```

あとは先程作成した$newFormatを使用してSELECTしてあげると指定したフォーマットでデータを抽出できます。

ポイントは`'newformat_created' => $newFormat`の部分で、必ず新しくキーを設定してあげなければなりません。指定しないとエラーになります。
新しいキーは任意の名前で大丈夫です。

```php

$foreach($newFormat_dates as $newFormat_date){
     echo $newFormat_date->newformat_created;//新しいフォーマットで日付を出力
}

```

これで指定したフォーマットで年月日を出力できます。
paramsとhtmlの理解(初心者の方向け)

#paramsとhtmlがわからないと、サービスが作れない（・・・気がする）
rails始めた頃、paramsとhtmlの理解がなかったのですが、最近ようやく理解したので備忘録として残します。
この部分の理解がないと、双方向型であるwebサービスが作れないので、かなり大事です。
webアプリケーションのサービス構造は基本的には、お客さんが投稿し、それをデータベースに保存し、さらにそれをどこかしらのページから見れるようにするというものです。それをrailsでコーディングした場合の中身の解説をしてみたいと思います。paramsとhtmlの書き方がわかればおおよそ把握できます。

#paramsとは？
初めてrailsを触って、paramsはパラメータを入れる箱だとか言われても、パラメータ？？？？ってなりますよね。実際自分がそうでしたが。。。
パラメータは「サービスの利用者がサーバに対して送ってきた値」と考えれば良いかと思います。そして、その値を格納するための箱がparamsになります。
例えば、このような感じです。

```
params[:title]

```
titleという名前のついたパラメータを利用者が飛ばし、それを格納しています。
要は、これはお客さんが送った値だよということをrails側に分からせてあげる訳です。

しかし、上の動作を行うためには、お客さんが送ったデータにtitleという名前をつけてあげなければいけません。
それをするのがhtmlの役割です。

#お客さんが送った値をどうとるのか
htmlのコードを見てみましょう。

```
<label>タイトル</label>
<input type="text" name="title">
```

これがお客さんが送る側のフォームのコーディングになります。
labelは入力フォームの名前。
inputはこれは入力フォームですよということを教えてくれています。
typeは、このフォームは文章を入れるためタイプのフォームですよと設定してくれています。
nameがここに入力された内容はtitleという名前がつけられますよとしてくれています。

もうお分かりだとは思いますが、このnameがパラメータの名前になります。
ここに書かれたデータ内容は問答無用でtitleという名前がつけられ、サーバに送られます。

#最後にサーバーに保存する
今までの流れを確認すると、

まず、htmlのフォーム画面からデータがサーバに送られ、そのデータには名前がついている。今回は"title"。
そして、それをparamsの箱に格納する。
そのデータをrails側で保存するという流れが先に続きます。

```
@book.title = params[:title]
@book.save

```

bookのタイトルというカラムに、送られてきたデータを格納し、そのままデータベースを保存するという形になります。

#専門用語はガンガン聞いた方が良い

自分もまだまだ初心者ですが、教えてくれる方は専門用語ガンガン使います。先ほどで言えば、パラメータとかカラムとか。。。。　ただ何も知らない人からすれば？？？？って感じなので、その都度聞いた方が学習速度が早まるかと思います。

##個人開発をされている方へ

Moverというプロダクトを開発しています。登録していただくと、開発したプロダクトのテスト利用を依頼し、フィードバックをもらうことができます。自分のプロダクトを公開して個人開発を加速させましょう！！　現在僕のアカウントも登録されているので、そちらにテスト利用依頼をいただければ実際に使ってみた感想などをお送りさせて頂きます。(アドバイスなどではなく、一人のユーザーとしての感想となります。)　もちろん無料です。
https://mover-web.herokuapp.com/



![Screen Shot 2020-05-19 at 4.36.42 PM.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147990/40822905-5a9d-6323-4318-bb475c68e887.gif)
RoomのTypeConverterを使う

こんな感じのEntityを作成したとする。

```kotlin
@Entity
class Post(@PrimaryKey var id: Long,
           var title: String,
           var content: String,
           var date: org.joda.time.DateTime)
```

このままだとJoda-Timeの`DateTime`クラスがRoomに対応していないのでエラーが発生します。
Roomが対応しているのは、StringやIntなどの型のみなので保存することができないのです。

```
Cannot figure out how to save this field into database. You can consider adding a type converter for it.
```

こういうときは、`TypeConverter`を使いましょう。

対応していない型をStringやIntなどの型に変換して保存し、読み出すときは逆にString、Intから元の型に変換することで、Roomで扱えるようにします。

以下のように変換用のメソッドを書いておいて、

```kotlin
class DateTimeConverter {
    @TypeConverter
    fun fromTimestamp(value: Long?): DateTime? {
        return if (value == null) null else DateTime(value)
    }

    @TypeConverter
    fun toTimestamp(date: DateTime?): Long? {
        return date?.toInstant()?.millis
    }
}
```

`Database`の宣言に`TypeConverter`を指定するアノテーションを追加する。

```kotlin
@Database(version = 1, entities = ...)
@TypeConverters(DateTimeConverter::class)
abstract class AppDatabase : RoomDatabase() {
	...
}
```

これで、自作クラスなどもRoomで扱えるようになる。
Oracle 12c (12.2.0.1) でORA-27103/ORA-27102が発生 その原因と対処方法

# Oracle 12c (12.2.0.1) でORA-27103/ORA-27102が発生 その原因と対処方法

Windows Server 2016＋Oracle12c環境で、ORA-27103/ORA-27102が発生しました。
Oracle12cは、2018年4月17日時点では最新の12.2.0.1の環境を利用しております。

**alertログの抜粋**

```
ORA-27103: 内部エラー
OSD-00033: 追加エラー情報
O/S-Error: (OS 9) 記憶域制御ブロックのアドレスが無効です。
ORA-27102: メモリー不足です
OSD-00043: 追加エラー情報
O/S-Error: (OS 1455) ページング ファイルが小さすぎるため、この操作を完了できません。
```

**Windowsイベントログの抜粋**

```
警告	*****	Microsoft-Windows-Resource-Exhaustion-Detector	2004
リソース消費診断イベント
Windows は仮想メモリの不足状態を診断しました。仮想メモリを多く消費したのは次のプログラムです:
 oravssw.exe (5028) は 102766358528 バイトを消費し、oracle.exe (17672) は 7020707840 バイトを消費し、
perfmon.exe (15624) は 1064710144 バイトを消費しました。
```

## このエラー原因に対する考察

素人が見ても、O/S-Errorという記述から、OS側でメモリ利用時によるページング処理でエラーが発生し、
そのエラーをOracleが検知してORA-27102が発生し、最終的にORA-27103（内部エラーのためOracleサポートへ問い合わせが必要）という状態になったことは明らかです。

## Oracleサポートとのやり取りで至った原因と対処方法

Oracleのサポートに問い合わせしたところ、いろいろとやり取りがあるものの、Oracleサポートから以下のような回答（結論）を頂いた。

### 原因

+ インシデントファイルからの調査結果として、SGA/PGAに対するメモリ不足や占用といった事象ではない。
+ OSのメモリが枯渇状態である。
 + Memory (Avail/Total): Ph:28535M/64956M, Ph+PgF:9M/128956M  ← この部分で、OSには9MBしかメモリ空き容量がなく、枯渇状態であると判断。
+ 本件は DBインスタンスが被害者の位置づけで、ORA-27102 メモリ不足を検知したことになり、DBインスタンス自体には特に異常な状況ではない。
+ イベントログから、大量にメモリを消費している`oravssw.exe`がメモリリークしている可能性が考えられる。（が、Oracleが原因とは考えていない。）

### 対処方法

+ 本事象は12.2.0.1で再現性が捉えず、新たにバグの特定ができていない。<br>事象再現の際に、DBインスタンス、または OS の再起動で回避できるとよく報告されており、回避策の１つと考えられる。
+ oravssw.exe のサービスを停止して再起動したら、メモリリークの解消が期待できる。<br>oravssw.exe サービスはデフォルトで起動するが、不要な場合はサービスを停止して問題ない。

## これらのことから

基本的にはOracleサポートの回答として、

+ Oracleは悪くない。被害者だ。
+ OSもろとも再起動すれば解決するからいいじゃん。
+ 気になるなら、影響なければ`oravssw.exe`のサービス停止して様子みよう。

・・・・・・・・え？

Oracleデータベースをセットアップする際、自動でインストールされ、サービスが自動起動する`OracleVSSライター`が、大量にメモリを消費し、メモリリークしている（可能性が考えられる）にも関わらず、Oracleの製品バグとして認識されるものではないのか？

メモリリークが発生する原因は、そのシステムのメモリ管理が不十分だからではないのか？
ガベージコレクションの対象にならないインスタンス化されたオブジェクトが無数にメモリ上に展開されるからいけないのでは？

### 補足

OracleVSSライターのサービスが原因でメモリリークが発生する事象については、
MyOracleSupportの以下ナレッジに障害として認識されている事象がある。

[VSS Writer によるバックアップ実行で oravssw.exe よりメモリ・リークが発生する(KROWN:139081) (ドキュメントID 1747904.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?parent=SrDetailText&sourceId=3-17267138321&id=1747904.1)

この記事では障害として認識されている。（記事にも、原因の欄に「製品の不具合です。」と記述されている。）
どうやら、VSS Writerのクリーンアップ処理で、メモリを不必要に割り当てる処理が存在し、それが原因でメモリリークするようです。
この事象はOracle 12.2のバージョンで修正したリリースとして提供されている。
今回の事象は、これと類似している事象のように見受けられるが、修正リリースとされている 12.2以降のバージョンを利用しているにも関わらず、この問題が発生しているので、実際にはこの問題が正しく解消されていない？などの可能性がないのか、疑問である。
緯度経度から都市の名前を得る (Node.js)

次のプログラムを、Node.js で記述してみました。
[緯度経度から都市の名前を得る](https://qiita.com/ekzemplaro/items/08a38109c9fe5deab09b)

```js:reverse_geo.js
#! /usr/bin/node
//
//	reverse_geo.js
//
//					May/04/2018
//
// ------------------------------------------------------------------
function parser_results(dict_aa)
{
	var unit_out = {}
	unit_out['city'] = ""
	unit_out['pref'] = ""

	const components = dict_aa['results'][0]['address_components']
	for (var it in components)
		{
		const unit_aa = components[it]
		if (unit_aa['types'][0] == "locality")
			{
			unit_out.city = unit_aa['short_name']
			}
		else if (unit_aa['types'][0] == "administrative_area_level_1")
			{
			unit_out.pref = unit_aa['short_name']
			}
		}

	return unit_out
}

// ------------------------------------------------------------------
function get_city_pref_proc(lat,lon)
{

	api_key="***************************************"
	url_aa="https://maps.googleapis.com/maps/api/geocode/json?latlng="
	url=url_aa + lat + "," + lon + "&language=ja&key=" + api_key
//	console.error(url)

	var Client = require('node-rest-client').Client
	var client = new Client()

	client.get(url, function (data,response)
		{
		const unit_aa = parser_results(data)
		console.log(lat,lon,unit_aa.city,unit_aa.pref)
		})
}

// ------------------------------------------------------------------
console.error("*** 開始 ***")
//
//
get_city_pref_proc(43.08,141.35)
get_city_pref_proc(36.56,139.88)
get_city_pref_proc(35.91,139.66)
get_city_pref_proc(35.68,139.76)
get_city_pref_proc(35.16,136.90)
get_city_pref_proc(34.70,135.50)
get_city_pref_proc(33.59,130.42)
get_city_pref_proc(31.56,130.56)
get_city_pref_proc(26.21,127.68)

//
console.error("*** 終了 ***")
// ------------------------------------------------------------------
```

実行結果

```text
$ ./reverse_geo.js 
*** 開始 ***
*** 終了 ***
33.59 130.42 '福岡市' '福岡県'
34.7 135.5 '大阪市' '大阪府'
35.16 136.9 '名古屋市' '愛知県'
35.91 139.66 'さいたま市' '埼玉県'
31.56 130.56 '鹿児島市' '鹿児島県'
36.56 139.88 '宇都宮市' '栃木県'
43.08 141.35 '札幌市' '北海道'
26.21 127.68 '那覇市' '沖縄県'
35.68 139.76 '千代田区' '東京都'
```
マインクラフトプラグインでホバーテキストや、クリックでコマンド実行できるテキストを表示する方法

    
    //  マインクラフトチャットに、ホバーテキストや、クリックコマンドを設定する関数
    // [例1] sendHoverText(player,"ここをクリック",null,"/say おはまん");
    // [例2] sendHoverText(player,"カーソルをあわせて","ヘルプメッセージとか",null);
    // [例3] sendHoverText(player,"カーソルをあわせてクリック","ヘルプメッセージとか","/say おはまん");
    public static void sendHoverText(Player p,String text,String hoverText,String command){
        //////////////////////////////////////////
        //      ホバーテキストとイベントを作成する
        HoverEvent hoverEvent = null;
        if(hoverText != null){
            BaseComponent[] hover = new ComponentBuilder(hoverText).create();
            hoverEvent = new HoverEvent(HoverEvent.Action.SHOW_TEXT, hover);
        }

        //////////////////////////////////////////
        //   クリックイベントを作成する
        ClickEvent clickEvent = null;
        if(command != null){
            clickEvent = new ClickEvent(ClickEvent.Action.RUN_COMMAND,command);
        }

        BaseComponent[] message = new ComponentBuilder(text).event(hoverEvent).event(clickEvent). create();
        p.spigot().sendMessage(message);
    }