OmniAICreator/Qiita-1.07M huggingface dataset:
PHPでexcel出力メモ　PhpSpreadsheetが使えない場合……

何かPhpSpreadsheetがおすすめらしいが
https://qiita.com/suin/items/7a8d0979b7675d6fd05b
composerが現在インストール出来ていないので
他の方法としてやってみた事をメモらせて頂きます。


https://qiita.com/ao_love/items/33f4509654d3a19fe53e
記載の
ここからダウンロード
(2015.6.10時点での最新は1.8.0です)

処理に必要なのはClassesフォルダだけなので、解凍した後にClassesだけ処理を行うPHP付近に置けばOK
との事なのでやってみたのですが
```php
//ディレクトリ設定
$dir = './';//ここ

//ライブラリ読み込み
require_once $dir . '/Classes/PHPExcel.php';
require_once $dir . '/Classes/PHPExcel/IOFactory.php';

//テンプレート読み込み
//$file =$dir.'temp.xls';//テンプレート名
$file =$dir.'temp.xlsx';//テンプレート名
$reader = PHPExcel_IOFactory::createReader('Excel5');
```

```
Fatal error: Uncaught exception 'Exception' with message 'The filename ./temp.xlsx is not recognised as an OLE file' in /data/web/www/contents/Classes/PHPExcel/Shared/OLERead.php:87 Stack trace: #0 /data/web/www/contents/ma2/Classes/PHPExcel/Reader/Excel5.php(1183): PHPExcel_Shared_OLERead->read('./temp.xlsx') #1 /data/web/www/contents/ma2/Classes/PHPExcel/Reader/Excel5.php(689): PHPExcel_Reader_Excel5->_loadOLE('./temp.xlsx') #2 /data/web/www/contents/ma2/exportExcel.php(20): PHPExcel_Reader_Excel5->load('./temp.xlsx') #3 {main} thrown in /data/web/www/contents/ma2/Classes/PHPExcel/Shared/OLERead.php on line 87
```
だった……なぜーーーー
Linux の mail をファイルに書き出す

通常は標準出力に出るので、閲覧はできる。
しかし、長いメールなどファイルに書き出してから処理したいときがある。

## 方法
標準出力をファイルに書き出す `tee` コマンドを使う。

`tee` コマンド： 標準出力に出力するとともにファイルにも書き出すことができる

```bash
mail | tee ./my-mail.txt
```

----

mailコマンドに標準でファイル出力するコマンドもあるのではないかと思われるが、見つけられなかったので `tee` で対応。
素人がRailsで作ったアプリをAWSでデプロイするまでに出会ったエラーとその対処法

**はじめに**
---
素人の僕が初めてデプロイした時に出会ったエラー集とその対応例です。
かなり小さなエラーまで書いたので読むべき対象者は限られてくると思います。

**対象者**
---
- railsでアプリを作ったが、AWSでデプロイしてみたい。
- だけど、プログラミング初心者でコマンドやインターネットの通信に関する知識のインプットまで手が回っていない。
- 上記をみたすプログラミング初学者。

**開発までにたどっていた道**
---
progateでRails→Railsのtutorialの１章を読みながらherokuへデプロイ→herokuのリージョンが海外らしく、アクセスに時間がかかって嫌だったのでAWSのEC2東京リージョンにサーバーを立てようと思いたつ
そして…
[世界一丁寧なAWS解説シリーズ](https://qiita.com/naoki_mochizuki/items/f795fe3e661a3349a7ce)
ここを見ながら進めて行った。
以下エラー集。

**1-1.EC2へログインできない！**
---
上記の解説シリーズのデプロイ編①をやっていた時でした。
これまでは家でやっていたんですが、続きを大学の図書館でやっていました。
すると、今まで

```
[~]$ ssh (アプリの秘密鍵)
```

でログインできていたのに一向にログインできなくなりました。

**1-2.原因と解決策**
---
IPアドレスって繋げるWiFiによって変わるんですね…。
本物の初心者だったのでこれだけで数日悩んでしまった。
以下のサイトで自分のIPアドレスがわかります。今までのIPアドレスと比べてみてください。
https://www.myip.com/

もし違っていたら、EC2のセキュリティグループの設定をいじります。
「ルールの追加」を押し、
タイプ：SSH
ソース：マイIP  →これを選択すれば自動で自分のIPアドレスを設定してくれます。
そして保存。これでログインできるようになったはず（たぶん）。

**2-1.unicornの起動ができない！**
---
これの解決には結構時間かかりました。
複数の原因が関係していたからです。なかなか解決できず心が折れて１ヶ月放置してました。

**2-2.原因と解決策**
---
**⒈unicornの設定ファイルを確認**
参考する記事によってはunicornの設定ファイルがunicorn.conf.rbだったりunicorn.rbだったりするので、起動コマンドを打ち込む際に自分の設定ファイル名を確認してみてください。

**⒉ログを確認してみよう**
当時の僕はログを確認できることすら知りませんでした…
アプリのlogフォルダにあるunicorn.logを確認してみてください。catコマンドで確認できます。
僕の場合は2つのエラーがあるみたいでした。

**⑴データベースがない**
そのまんまです。作成してマイグレートしましょう。

```
rake db:create RAILS_ENV=production
rake db:migrate RAILS_ENV=production
```

上記コマンドですが、たまに先頭にbundle execをつけないと効かない時がありました。

**⑵secret_key_base**

```
bundler: failed to load command: unicorn_rails (/var/www/rails/(アプリの名前)/vendor/bundle/ruby/2.4.0/bin/unicorn_rails)
ArgumentError: Missing `secret_key_base` for 'production' environment, set this string with `rails credentials:edit`
```

上記のエラーもありました。
調べてみると、configフォルダにあるmaster.keyはGitのクローンの際についてこないらしい。
なのでローカルのmaster.keyの中身をEC2のmaster.keyへコピペしてみるとこの問題は解決した。
参考にした記事：https://qiita.com/scivola/items/cc06ddbfd94d3118f693
(そもそも世界一丁寧なAWS解説シリーズの[デプロイ編①](https://qiita.com/naoki_mochizuki/items/814e0979217b1a25aa3e#git%E3%81%A8%E3%81%AE%E9%80%A3%E6%90%BA%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%B3)の「アプリのsecret_key_baseの設定」でその辺ちゃんと書かれてた…)

**3-1.mySQLに入れない！**
---
これは2つ目のアプリをデプロイした時に出会ったエラー。
相変わらずunicorn起動の時にうまくいっていないようだったのでログを確認するとこんなエラーがあった。

```
Access denied for user 'root'@'localhost' (using password: NO) (Mysql2::Error::ConnectionError)
Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) (Mysql2::Error::ConnectionError)
```
mySQL関連でのエラーらしい。

**3-2.原因と解決策**
---
このエラーをコピペして検索してみると多くの記事があった。どうやら権限がないらしい。
多くの記事で、

```
mysql_safe --skip-grant-tables &
```
このコマンドを使ってオプション付きで起動しなさいとあったが、この起動すらできなかったのでかなり困った。
有効な解決策に出会うまでは結構骨が折れた。
以下の記事が僕にとっては有効だったので同じ境遇の方はぜひ試してみてほしい
https://qiita.com/RyochanUedasan/items/9a49309019475536d22a

**おわりに**
---
僕もまだまだ素人なので手に負えないエラーにぶつかるたびにやる気が落ち込んでしまう。
でもやっぱり自分で何かを作るのは楽しい。
このエラー集が僕と同じ初学者の役に立てれば幸いだ。
エラーに負けず一緒に頑張って行きましょう。
メモ：「３０日でできる！OS自作入門 」25日目

## コンソールを増やそう

1) BEEP サウンド
- OUT 0x43, AL (0xb6)
- 昔の qemu は BEEP 対応していなかったようですが、今のは -soundhw pcspk で普通に聞こえますね。凄い

2) 色を増やそう
- 216 を足して 231 色に

![スクリーンショット 2018-12-28 12.25.16.png](https://qiita-image-store.s3.amazonaws.com/0/109145/3783fabc-da61-9ccc-3089-88bf8640ce99.png)

3) 色を増やそう２
- アプリケーション側のコードを修正
- いい感じに見えてきた

![スクリーンショット 2018-12-28 12.28.05.png](https://qiita-image-store.s3.amazonaws.com/0/109145/97e94988-412a-1a7f-91b7-d446c619c6bf.png)

4) ウィンドウの初期位置
- 真ん中に表示するように

![スクリーンショット 2018-12-28 12.33.20.png](https://qiita-image-store.s3.amazonaws.com/0/109145/eb11e1ab-b593-34ab-8807-430dbbce720d.png)

5) コンソールを増やそう１
- 同時にアプリ２つ表示したいため
- コンソールは２つでたがアプリ側の文字出力などを受け取る側がまだ共通な状態なため叩いたコマンド結果が別のウィンドウで表示される

6) コンソールを増やそう２
- 出力先問題を解決、TASKの構造体にCONSOLEとDSのベースを追加 🤔
- INT27のハンドラを削除（要らなくなった？）
- コンソール２つは固定ですが、いい感じになった

![スクリーンショット 2018-12-28 12.44.04.png](https://qiita-image-store.s3.amazonaws.com/0/109145/ec47196a-4e1c-616d-3493-7472a988c08d.png)

7) コンソールを増やそう３
- セグメント番号は同じだったため、別々に修正

8) コンソールを増やそう４
- Shift+F1 と X ボタンでクローズ出来るように修正

![スクリーンショット 2018-12-28 12.49.36.png](https://qiita-image-store.s3.amazonaws.com/0/109145/20837f12-bd59-f31f-53b2-fb1829f47374.png)

9) もっとOSらしく1
- task_a のウィンドウはもういらなくなった
    - sht_win 使っているところのコードの削除
- カーソル出てこない問題

![スクリーンショット 2018-12-28 12.52.40.png](https://qiita-image-store.s3.amazonaws.com/0/109145/17c39071-afe6-020b-c6a7-af4dff635503.png)

10) もっとOSらしく２
- カーソルもちゃんと表示された
-
Sparkでファイルの読み込み数をへらす

# 参考文献

https://jp.hortonworks.com/blog/bringing-orc-support-into-apache-spark/

# 動機

例えば、保存するときORCファイルを日付別ディレクトリに分けて、読み込むときは特定の日付のディレクトリだけ読み込むといったことができる。

# 前準備

ファイルを保存するとき、`PartitionBy`をつける.
DataFrameにはDateというカラムがあるものとする。


```python

DataFrame.write.partitionBy("Date").orc("path/to/dir")
```

こうすることで、`path/to/dir/Date=yyyy-mm-dd`の形に勝手に日付別にディレクトリに分けてくれる。

# 特定のディレクトリだけ読み込み

```python

DataFrame = spark.read.orc("path/to/dir").where("Date='2018-12-28'").explain(True)
```

このログを見ると、ごちゃごちゃと実行プランが表示され、特定のディレクトリだけ読まれていることがわかる

```
FileScan orc [,... 85 more fields] Batched: false, Format: ORC, Location: InMemoryFileIndex[path/to/dir], PartitionCount: 1, PartitionFilters: [isnotnull(Date#107), (cast(Date#107 as string) = 2018-12-28)], PushedFilters: [], ReadSchema: struct<...
```

ここで、`PartitionCount: 1`と表示され、1つのディレクトリだけ読み込まれていることがわかる。　`where("Date<='2018-12-28' and Date >= '2018-12-26'")`みたいな感じで指定すれば`PartitionCount: 3`と表示される。

`DataFrame.write.partitionBy(col1, col2).orc("path/to/dir")`のように複数のカラムを指定してディレクトリを複数階層作成することもできる。
MySQL Workbench のResult Gridで見やすいフォントを探す

# Result Gridの文字がきれいに表示されない件
こんな感じ。
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/260487/1efa92bf-b4c0-0bd4-e4d9-46bd238690ec.png)


- 全角半角ともにstring の`g`の下部分が見えない。また、末尾にアンダースコアもついているが全く見えない。
- 日本語もすべて下部が見切れる。
- 数字は全角でも半角でも無事。

というわけで、見やすい設定を探します。

# 環境
- Windows10
- MySQL Workbench Community (GPL) for Windows version 6.3.10 CE build 12092614 (64 bit)

# 設定方法
Edit → Preferences… → Fonts & Colors → Result Grid の項目で設定できます。
デフォルトは `Tahoma 8` 。


# 先に結論
私は **`Meiryo 8`**にしました。
サイズ8以上なら見切れの心配はなさそうです。

プログラミング的な見やすさを求めるなら、**`Ricty Diminished 9`**もいけます。
ＭＳ ゴシックと余白多めが好きなら設定欄を空欄にしてみてください。（需要ある？）

以下、辿り着くまでの蛇足です。

# 1. 設定を空にしてみる
デフォルトになるのかな？と思ってやってみて、偶然見つけた。
![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/260487/5e7aaac7-f1a0-9066-3bb1-0ef911913297.png)
日本語はおなじみＭＳ ゴシックっぽい？
これだと全部表示される。が、全体的に余白が大きくなる。
あとなぜか結果を表示するときに最低１つのセルが選択された状態になる。

## 1-2. 数字だけ入れてみる
設定に `8` とだけ入れてみた。
文字サイズは先程と同じだが、余白がなくなって見切れるようになった。
![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/260487/7e4f2e55-9cc1-2697-fafd-f1d9e3160be0.png)

大きくしたら数字も見切れる。
![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/260487/baa088fe-7781-f5c6-3193-56d93ff8479f.png)

小さくすると見切れるというよりも「ちょっとだけ見える」。
![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/260487/65f4fa23-f326-60d5-e1e6-ca8b5efc0d46.png)
ヘッダ行はきれいに縮んでいるのに…。

以降は、色々なフォントで良さげだと思ったサイズのみ紹介します。

# 2. Consolas 9
`g` は見切れているものの、下半分もちょっとだけ見える！
全角はＭＳ ゴシックだけど、さっきは見切れていた日本語が見切れない！
![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/260487/e53766f5-34e3-1bd8-cc39-f9e94150a485.png)
というわけで、ちょっとだけおっ！！となりました。
でもアンダースコア見えないし、何より日本語がＭＳ ゴシックなのが気に入らないのでまだ試します。[^1]
[^1]: ＭＳ ゴシックによる設定も試しましたが、各サイズ見切れるので省略

# 3. Ricty Diminished 9
アンダースコア見える！
日本語もちゃんと見える！
![7.PNG](https://qiita-image-store.s3.amazonaws.com/0/260487/8191234e-9929-ab14-4ae9-9d42b12e9549.png)
9以外のサイズは厳しそうですが、今のところ最有力です。
アンチエイリアスが強くて（？）ちょっとぼやぼやする。

# 4. Meiryo 8/9
えっ…8でも9でもきれいに見える…
![9.PNG](https://qiita-image-store.s3.amazonaws.com/0/260487/04275cf1-a820-4440-5536-29a6c60e5150.png)
![8.PNG](https://qiita-image-store.s3.amazonaws.com/0/260487/5e8c9ef6-8d01-306b-5251-149889ead275.png)
MeiryoKe_Console のほうを先に試してだめだったのですが、エディタでもないので0とOを気にすることも少ないし、これが一番見やすいのでは。
サイズ7だと一部見切れました。10や11も問題なかったけど十分でかいのでそれ以上は試してません。

# まとめ
結論は先に述べたとおりです。
数字だけ入れてみるとか、Consolasのキャプチャとか、いらなかったね。
書籍「プロダクションレディサービス」まとめ

プロダクションレディマイクロサービス 
――運用に強い本番対応システムの実装と標準化 
https://www.oreilly.co.jp/books/9784873118154/

UberのSREが可用性の高いマイクロサービスに必要な標準について解説した書籍です。説明されている標準の中から対応できていないサービスが多いと感じたものをまとめました。

#### 安定性と信頼性

- 開発時のテスト、パッケージング、ビルド、リリース作業を自動化すること。
- ステージング → カナリア → 本番の順で構成されるデプロイパイプラインを用意すること。
- 依存するマイクロサービスの障害時の緩和策（バックアップ、代替サービス、フォールバック、防御的キャッシュ）を講じること。

#### スケーラビリティとパフォーマンス

* 質的な成長の判断基準（ビジネスメトリクス）を決めて、そこから量的な成長の判断基準（リクエスト数など）を決めること。

#### 耐障害性と大惨事対応

* 本番環境に対しても定期的にロードテストやカオステスト（ランダムに障害を発生させるテスト）を行うこと。

#### 監視

- ホスト単体とホスト全体の両方で主要メトリックがわかるようにすること。
- スタック全体を通じて各リクエストをトレーシングできるログを取ること。
- 全てのアラートはアクション可能であること。


#### ドキュメントと組織的な理解

- アーキテクチャレビューを定期的に実施し、チームの理解を深めて、問題点を明らかにすること。
Railsアンチパターン：IDを引数にする

Railsアプリを扱っていると、↓のような「オブジェクト[^1]のIDを引数にするメソッド」をたまに見かけます。

[^1]: この記事では 「ActiveRecord::Base のサブクラスのインスタンス」を「オブジェクト」と呼んでいます。

```ruby
class BlogEntry < ApplicationRecord
  belongs_to :user

  # ブログ記事を作成する。user_id は User の　iｄ
  def self.create_entry(title:, body:, user_id:)
    h = { title: title, body: body, user_id: user_id }

    # 内容をチェックしたり、値を追加したりするなどの、前処理をする

    self.create!(h) # エントリ作成
  end 
end
```

しかし、私はこれはアンチパターンであり、**idではなくオブジェクトそのものを渡す方が良い**と思います。

```ruby
  def self.create_entry(title, body, user_id)
    ↓
  def self.create_entry(title, body, user)
```

# IDを引数にすることの問題点

オブジェクトではなくidを渡しているのは、

- オブジェクトを引数にすると、メソッド呼び出しが遅くなる
- オブジェクトを引数にすると、呼び出し元でオブジェクトを取得する処理（`User.find(params[:user_id])`とか）をしなければならなくなり、SQLを実行する回数が1回増えてしまう

といった考えからだと思いますが、どれも誤りです。

**オブジェクトを引数にしてもメソッド呼び出しは遅くなりません。**C++やGoでは、構造体を引数にすると値のコピーが発生して速度が落ちることがあります。しかし、Rubyでは引数は参照渡しされるので、オブジェクトを引数にしても、整数（id）を引数にしたときと速度は変わりません[^2]。

[^2]: 実際には整数型の方が、内部表現が異なるとか、JITで最適化される余地があるとかで、速くなるかもしれません。ただ、大抵のRailsアプリでは、整数型にすることによる高速化より、オブジェクト型にするメリットの方が大きいはずです。

**idを引数にしても、SQL呼び出し回数は減りません**。idを引数に取ようなメソッドでは、

- id に対応するオブジェクトが存在するかのチェック
- オブジェクトが、前提条件を満たしているかのチェック

などもしなければならないはずです（たとえ今は不要でも後から必要になることは少なくありません）。すると、結局 `User.find` などを呼び出すことになります。

現実には、後付けで機能追加していった結果、**コントローラーとモデルの両方で、オブジェクトの存在確認をしているので、むしろ呼び出し回数が増えている**ケースすら見たことがあります。

```ruby
# 後付けで修正した結果、無駄なSQL呼び出しをしているケース

# Controller側のコード
unless User.exists?(id: params[:user_id])
  render :error, alert: "ユーザーが見つかりません"
  return
end
BlogEntry.create_entry(title: title, body: body, user_id: params[:user_id])

# BlogEntry
def self.create_entry(title:, body:, user_id:)
  user = User.find_by(id: user_id)
  raise "ユーザーが見つかりません" if user.nil?
  raise "ユーザーが凍結中です" if user.frozen?

  # 実際の処理
end
```

# IDではなくオブジェクトを引数にするべき

こういうわけで、Railsでメソッドを設けるときは、`user_id` とか `entry_id` みたいなIDではなく、
`user`, `entry`のようなオブジェクトを引数にするようにしてください。

上述のように、オブジェクトを引数にしてもC++やGoのように遅くなることはありませんし、`.find` を二重に呼び出す必要もなくなるのでかえって速くなるはずです。
pandas(DataFrame,Series)のbool値をint型(0,1)に一瞬で変換する方法

1をかけるだけでOKです

```python:sample.py
import pandas as pd
#DataFrame
df = pd.DataFrame({'A': (True, False, True),})
df * 1

#Series
sr = pd.Series([True, False, True],index=[0,1,2])
sr * 1
```

![20181228-121452.jpg](https://qiita-image-store.s3.amazonaws.com/0/205221/6da9c9fe-c363-cd6a-bc33-3b8ad490f427.jpeg)
アウトプット学習は結局なんのためにあるのか @yumainaura

一。
発散。
ストレス解消。
自己満足のため。
自分の世界平和を救うため。
決して人のためならず。
自分が良ければそれで良い。
迷惑かけたら全裸で謝罪。
そんなに嫌なヤツではないと思ってる。
アウトプットは心理療法。
無料の心理セラピーでおかねいらず。
自己承認欲求が走り出す前に。
もう既にMacBookでoutしてる。
そんな人生でありたい。
ちなみに2018のAir。
届くの楽しみ。
関係ない？
ごめん。
了。








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Qiitaの文章構成がうまく出来てるかどうかは、見出しのサイドバーだけを見れば良いかも @yumainaura

国語の教科書

「わけわからない！」「自分でも！」と思ったら再考の余地あり。next try

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/fb64203e-0abb-318d-20c3-3fa6f2b89d11.png)

[国語yumainaura - Google Search](https://www.google.com/search?ei=Y5ElXKDDN4q08QWv5Y6oDg&q=%E5%9B%BD%E8%AA%9Eyumainaura&oq=%E5%9B%BD%E8%AA%9Eyumainaura&gs_l=psy-ab.3...1839.3670..3758...5.0..2.270.1967.0j3j6......0....1..gws-wiz.......0i131j0i4i37j0i4i30.6BHpZRiX2W0)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【rails5】find,find_by_whereメソッドについてのメモ

##find,find_by,whereメソッドについてのメモ

**・findとfind_byとwhereはレコードのインスタンスを取得出来るメソッド。**

newとcreateはインスタンスを作る。

createはDBに保存まで行う。

**・findは指定したidに合致した全てのレコードを取得する。**

**・find_byは、指定した条件に合致した一番初めのレコードを取得する。**

例えば、出発時間を取得したいケースがあるとする。

もし今月の初日と月末の両方の出発時刻を取得したい場合は、find_byを使ってもどちらかしか検索出来ないので取得出来ない。

**・whereは、指定した条件に合致した全てのレコードを配列で取得する。**

nameカラムやemailカラム等の指定に加え、.firstや.last等、どの範囲を取得するのかを指定する記述が必要。

テーブルに複数の値がある状態で、範囲指定の記述がないままビューでwhereメソッドを用いたインスタンス変数を使っても、どの値を出力すればよいのかがわからなくなるためエラーになる。

そのためカラム等の条件指定の後には、範囲指定の記述を忘れないこと。
force cli : コンポーネントを取る

#初めに
前回はグローバルセットを取得したので、今回はコンポーネントを取得してみます。

#方法
```
$force fetch -t Aura -n mycmp -d /home/admin/meta/test
$Exported to /home/admin/meta/test
```

一見取れたような感じです。

しかし、/home/admin/meta/testの中は空っぽ？

うまく機能してないようです。
残念。
【シェルスクリプト】ssh 接続先サーバーで mysqldump した結果を gzip で圧縮し、標準出力して保存する

#やりたいこと

サーバー A で `mysqldump` した結果をサーバー B に保存したい。

このとき、サーバー A で直接実行するのではなく、サーバー B からサーバー A へ SSH して `mysqldump` を実行し、その結果を gzip で圧縮のうえ標準出力してサーバー B に保存します。

```
┏━━━━━━━━━━━━━━━━━┓                   ┏━━━━━━━━━━━━━━━━━┓
┃    サーバー B    ┃ ━━━━━ SSH ━━━━━▶  ┃    サーバー A    ┃
┃ （バックアップ用）┃ ◀━━━ 標準出力 ━━━  ┃ mysqldump（圧縮）┃
┗━━━━━━━━━━━━━━━━━┛                   ┗━━━━━━━━━━━━━━━━━┛
```

#やり方

今回は **backup.sh** というファイル名で下記のシェルファイルを作成しました。

```~/backup.sh
#!/bin/bash

date=$(date "+%Y%m%d")

ssh server_a "mysqldump -u root -ppassword DBname | gzip -c" > ~/backup/${date}.sql.gz
```

これを `sh ~/backup.sh` で実行すれば、サーバー B の **~/backup** ディレクトリ内にバックアップファイルが作成されます。

各コマンドを簡単に解説していきます。

##`ssh host_name`

**~/.ssh/config** 内に設定を書いて `ssh server_a` で ssh できるようにしています。
設定の書き方は[こちら][link_1]の記事とかを参考にしてみてください。

[link_1]:https://qiita.com/passol78/items/2ad123e39efeb1a5286b

##`ssh host_name "hogehoge"`

`ssh` コマンドに続けて `"hogehoge"` と書くと、ssh 接続先で `"hogehoge"` コマンドが実行できます。

##`mysqldump -u root -ppassword DBname`

MySQL のデータベースを dump するコマンドです。
オプションがいろいろありますので、[こちら][link_2]の記事を参考にしてみてください。

[link_2]:https://qiita.com/PlanetMeron/items/3a41e14607a65bc9b60c

##`mysqldump | gzip`

`mysqldump` の出力結果を渡して `gzip` を実行します。
パイプとかの説明については[こちら][link_3]にまとめられています。

[link_3]:https://qiita.com/egawa_kun/items/714394609eef6be8e0bf

##`gzip -c`

`gzip` コマンドに `-c` オプションをつけることで圧縮結果を標準出力してくれます。

##`> ~/backup/${date}.sql.gz`

`gzip` で圧縮した結果を標準出力してサーバー B に保存します。
なお、ここのコマンドはサーバー A 側で実行されます。

`${date}` には日付が入りますので、**20181228.sql.gz** という感じのファイル名になります。
今回はデータベースのバックアップファイルなので、わかりやすいようにファイル名の最後を **.sql.gz** としました。
スマホ実機でtd{ display:block; }が効かない時

レスポンシブサイトでtableでth, tdを縦並びにしたい時、

```css
@media only screen and (max-width: 768px) {
   table th, table td {
      display: block;
      width: 100%;
   }
}
```
というのを使うのですが、chromeの開発ツールでは思った通りに表示されるのですが、
実機で確認すると横並びのまま、、、

「なんでかな？」と思ってソースをよく見ると

```html
<!DOCTYPE html>
```
最初のこれが抜けていた。。。
お粗末なオチ。
Unity Facebook SDK をWindows環境でセットアップする方法

# Windows にFacebookSDKインストールしてAndroid Buildする手順がとくになかったのでまとめます。

macはすでにいろいろそろってるので特に問題ない。macでAndroid Buildすればいいって話でもあるが。。。

以下２つが必要
- Java SE Development Kit(JDK)が必要。このなかのkeytoolというのが主に使いたい
- OpenSSL

##jdk8のインストール
Java SE Development Kit 8u191
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
たぶん、最近のWindowsだと64bitなので
windows-x64
(x86は、32bitです。CPUが32bitの8086系っていう意味）

##OpenSSLのインストール

https://slproweb.com/products/Win32OpenSSL.html
Win64 OpenSSL v1.1.1a Light
これでよさそう。
MSI(Microsoft Installer)を選ぶ。そうじゃなければ自分でインストール作業しなきゃいけない。

インストールが終わったら、以下の設定が必要。そこまではインストールでしてくれないらしい。

1. デスクトップから、コンピュータアイコンを右クリックしてください。
2. コンテキストメニューから[プロパティ]を選択します。
3. システムの詳細設定リンクをクリックします。
4. [詳細設定]タブから[環境変数]をクリックします。「ユーザー変数」セクションで、CLASSPATH環境変数を見つけて選択します。編集をクリックします。CLASSPATH環境変数が存在しない場合は、[新規]をクリックします。
5. 「ユーザー変数の編集」（または「新しいユーザー変数」）ウィンドウで、CLASSPATH環境変数の値を指定します。
6. 変数名に "CLASSPATH"を入力し、変数値に次のパスをコピーします。
7. 
```code
変数名 = CLASSPATH
```

8. 変数値 = "C：¥Program Files¥Java¥jdk1.8.0_45¥lib"
9. 新しい環境変数を再度追加し、名前をPATHに設定し、次のパスを変数値としてコピーします。

```code
変数名 = PATH
```
```code
例）
変数値 = "C：¥Program Files¥Java¥jdk1.8.0_45¥bin"
```

10.  ここで、OpenSSLのPATHも設定します。
インストール時に指定したところのbinというフォルダまでのパスを登録します。

```code
C:\Program Files\OpenSSL-Win64\bin
```
8. 次に[OK]をクリックします。[OK]をクリックして残りのウィンドウをすべて閉じます。

9. それからUnityを再起動してください。keytoolが手に入ります。
基礎からのVMware Cloud on AWSーその２

ここのブログでは、VMware Cloud on AWSについての
基本について触れている第２回目です。

次回は管理インターフェースと基本的な構成の方法について触れます。


# １．管理インターフェースについて

VMware Cloud on AWSの管理には次の４つの
インターフェースが関与してきます。

## １）My VMware
VMwareのライセンスを購入している方ならおなじみのあれです。
通常はライセンス管理に利用しますが、
VMware Cloud on AWSでは事前に利用料のクレジットを
購入しておいて利用する場合があります。
クレジット利用の際にはこちらでクレジット残額を管理することになります。
当然、インターネット経由でのアクセスです。

なお、購入方法はまだ現時点でふれていませんので、
後日の記事にて触れていきます。


## ２）VMware Cloud コンソール
VMware Cloud 全般の管理を行うコンソールです。
on AWSのみならず、他のサービスもここで
デプロイすることが可能です。

SDDCもデプロイから、NSX周りの設定まで、
大枠の操作はここで操作することになりますので、
かなり重要な管理業務をここで行うことになります。

インターネット経由でのアクセスです。

## ３）vSphere Web Client
VMware環境の管理におなじみのアレです。
仮想マシンの管理はすべてここで行います。
従来のNSX（NSX-V）はここの画面からの管理になっていますが、
今後VMware Cloud on AWSで利用するNSXは
すべてNSX-Tになっていくこともあり、
NSX周りの管理はVMware Cloud コンソールの方で行います。

なお、リソースプール配下の管理のみが解放されており、
全ての操作権限があるわけではないので注意が必要です。

当初はインターネット経由でのアクセスができるよう、
グローバルIPが払い出しされているので注意です。

## ４）AWS マネジメントコンソール
AWSご利用の皆様なら必ず使うやつです。
特に特別なことはありません。
AWSネイティブな機能をVMware Cloud on AWSと
連携させて使う場合は、こちらから操作が必要です。
勿論、インターネット経由でのアクセスです。

## このセクションのまとめ
各種コンソールについてここまででご紹介しました、
正直AWSのコンソールも避けては通れないので、
AWS知りませんでは利用できないことに注意が必要です。
特になんとなく知っているではなく、
ネットワーク周りはAWSの仕様を正しく理解し、
活用できることが求められるので、
VMwareは得意でもAWSの実務経験がないとここでハマります。
ユーザ企業の方は、提案してきた企業のAWS経験を正しく見極めて、
委託しないと失敗します。
指標となるのは、AWSのパートナー認定を取得しているかと、
実績をどの程度積み上げているか。
VMwareとAWSの双方が絡み合っているので、
トラブルシューティングの際など、
両社のパスを正しく使える必要がありますので、
その辺りを加味して委託先を選定するとよいでしょう。


# ２．構成方法の基本
調達方法は今後の記事で触れる為ここでは割愛しますが、
まずはVMware Cloud on AWSの利用ができるよう、
調達できたとして話を進めます。
今回はクレジットを事前に購入したと想定し、
おおまかな流れをご紹介します。

クレジットを購入して細々アクティベーションを
実施すれば、前項でご紹介した、
VMware Cloud コンソールが利用可能となります。
実際にログインすると、複数のVMware Cloudのサービスが
選択できるようになっていますが、
VMware Cloud on AWSを選択して利用を開始してください。

VMware Cloud on AWSの画面に移ると、
Create SDDCからの操作となります。
つまり、この画面でSDDCの作成をもう始められるということになります。
必要事項をウィザードに沿って入力すれば、
２～３時間もあれば、最小構成の環境が
自動的に作成されてくる、という手はずです。

実際、内部的にはCloud Foundationが動作し、
ウィザードで入力した引数を元に
環境構築が自動で構成されているようです。
vCenterやNSXなどは自動で構築され、
使える状態になって引き渡されてきます。
NSX周りは色々と構築に手間取るので、ありがたい話です。

利用可能な状態になって以降は、
ネットワーク周りの設定をVMware Cloud コンソールで行い、
その後vSphere Web Clientにアクセスして、
通常のVM環境と同じように仮想マシンを作成していく、
ということになります。

今回は以上です。
次回は、ユースケースについて触れたいと思います。
ここが結構重要な回です。
プログラミング書籍を購入しても、しなくても #Github コードから学べる時代 @yumainaura 🔖 #Qiita #フロー #ストック #学習

# Ruby プロ チェリー本に学びたい。

Googleはいつも、始まりでしょ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/912fc8c0-b7a0-efaf-4967-facb4c3fcef0.png)

https://github.com/JunichiIto/ruby-book-codes

#書籍購入しなくても閲覧可能

>書籍「プロを目指す人のためのRuby入門」のサンプルコードです。

あの「本を買ったらダウンロードコードがついてきて」「Zipで解答して」とかいう旧世代とは違う。

Github！

#Githubで学んで、最後に記念として本を買う時代でさえあるのでは

Web投げ銭的な。僕は事前に買いました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/cb162f84-28ec-5dd4-1306-c2c80354cc0b.png)

#構成

分かれているらしい。

>ruby-book : 例題の解答コード（各解答における最終形）を格納しています。
>sample-codes : 本文中のサンプルコードを格納しています。


#つづく。









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
アプリケーション全体で同じリソースを参照する

#やり方
App.xamlで`Application.Resources`に定義したリソースはアプリケーション全体で参照できる。

```xml:App.xaml
<Application x:Class="Sample.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Application.Resources>
        <SolidColorBrush x:Key="XXX" Color="Red" />
    </Application.Resources>
</Application>
```
Docker Toolbox利用時においてホストのディレクトリをマウントできない

#概要
Docker Toolbox利用時において、ホストのディレクトリをマウントできなかった。
Toolboxでは、デフォルトでマウントできるのはC:\Users 配下のみ。
-vオプションを利用して、マウントを指定をし、マウントできなくとも、エラーにはならないため、間違いに気づくのが難しい。
対応としては、C:\Users配下をマウントするか、VMに対して別途設定が必要。


#発生エラー
Dドライブ配下のディレクトリをマウント指定してnginxのイメージを起動させた。
コマンド上はエラーが出ずに完了したが、マウントしたフォルダに配置したファイルは見えていなく、正常にマウントされていなかった。

```
$ docker run --name test-nginx -v /d/dockerTest:/usr/share/nginx/html:ro -p 8080:80 nginx
2018/12/28 01:37:03 [error] 6#6: *1 open() "/usr/share/nginx/html/index.html" failed (2: No such file or directory), client: 192.168.99.1, server: localhost, request: "GET /index.html HTTP/1.1", host: "192.168.99.100:8080"

$ docker stop test-nginx; docker rm test-nginx
test-nginx
test-nginx

$ docker run --name test-nginx -v /d/dockerTest:/usr/share/nginx/html:ro -p 8080:80 nginx ls -l /usr/share/nginx/html
total 0
```


#エラー原因
VMの設定上、C:\Users 配下しか共有設定がされていないから。


#対応策
Toolboxで構築されたVM配下の通り、VirtualBoxから見ると共有されているディレクトリは

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222043/f50c64e4-bf1e-c938-d566-e421055b332f.png)

よって、対応としては、C:\Users配下をマウントするか、VMに対して別途設定が必要。
今回は以下のように、C:\Users配下をマウントするように設定した。

```
$ docker run --name test-nginx -v /c/Users/dockerTest:/usr/share/nginx/html:ro -p 8080:80 nginx
192.168.99.1 - - [28/Dec/2018:02:05:23 +0000] "GET /index.html HTTP/1.1" 200 531 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36" "-"
```


#参考
[Dockerにホストのフォルダをマウントしたい！](https://qiita.com/dojineko/items/f623894ef2436bef890e)
フロントエンドの2018年とこれからについて

CodeGrid「[行く2018年、来る2019年](https://app.codegrid.net/series/2018-round-up)」のまとめになります。


## ライブラリ/フレームワークの動向

- Vue.jsかReactか
- 何を使うではなく、何をつくるにフォーカスしてる
- 好きなアーキテクチャを選んで使い続ける
- 会社ごとに使うフレームワークを決めている
- 現状のものから移るほどのフレームワークは出てきてない
- Pythonぽい構文でCoffeeScript+JSXでコーディングすることがあるかも

## Web Components

- 再利用可能でカプセル化された独自のHTMLタグを作成するためのWebプラットフォームのAPI
- HTMLと連動して動作するどんなJavascriptライブラリやフレームワークと併用できる
- Web Components関連のヘルパーっぽいものの総称を「[Polymer](https://www.polymer-project.org/)」とするプロジェクトあり
- アプリをWeb Componentsで作るのではなく、あくまで小さなコンポーネントを作るもの
- React、Vue.jsで作ったコンポーネントをWeb Componentsにコンパイルできるようになるかも

## フレームワークの流行り廃り

- jQueryを使わなくても素のJSで書けるようになった
- Vue.js、Reactを使わずにWeb ComponentsのAPIで作るようになるとは思えない。フレームワークの恩恵は受けるべき。

## IEのサポートと対応

- IE（Windows 10のIE11）のサポートは2025年
- EdgeのレンダリングエンジンがChromium
- Windows7は2020年1月までサポート
- Windows10に移行するとEdgeを使うユーザーが増える
- IEは最新のWebの機能を使えない、パフォーマンスからしても足を引っ張る存在
- ES modulesのブラウザの対応も、IEを除いて対応

## 参考サイト

- [前編 薄いWeb Componentsと厚いライブラリ](https://app.codegrid.net/entry/2018-round-up-1)
- [Web Componentsとは何か？](https://qiita.com/jtakiguchi/items/b1315f53b3726ff11b61)
- [ブラウザで覚えるES Modules入門 – JavaScriptでモジュールを使う時代](https://ics.media/entry/16511)
my.cnfを探せなかったのでググった結果のメモ

## 概要 my.cnfを変更したかったがハマった
### 環境構築でmy.cnfを変更するときにハマった（注意メモ書き）
あるrails案件で`mysqlをutfmb4に対応させる`必要があった
これはバージョンが古めのmysqlだとsqlをインストールする際にエラーでmigrateができなかった
rails、mysql関連はそもそもそこまで知見がない

よって色々とググった結果ここにたどり着いた

## 結論
`mysql --help | grep my.cnf`

これをターミナルで叩くと
```
 order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
```
こんな形で表示される

## 補足vscodeだと
`/usr/local/etc/my.cnf`この部分が`altを押しながらクリック`とか表示されるのでそのままファインダーで開いてみれる
超便利！
📷 Macで爆速でLGTMしたい！ 😁  @yumainaura 🔖 #役立つ #Slack #チャンネル #紹介 もあるよ


# Google画像検索から適当にスクショ撮って超雑LGTM

検索フィールドに「LGTM」も入っていいかんじ(本当に？


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/8b10bdec-000b-59e5-6f11-d364c232bd22.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/d17fd64a-edb4-9e32-26d8-a4b8cffcd5ba.png)


超雑いけど爆速ではあるが、相手の趣味やシチューエーションにあわせて10秒ぐらいで貼れる



# Slackにチャンネル共有

会社で存在する1000のチャンネルの
Slackの爆速UIにより、ここにたくさんLGTMをストックしておけば、一瞬で使える


# もちろんMac環境なら

画像をコピペしてGithubに貼るだけ

Mac最高

(最近のWindowsってどうなんだろう


[lgtm yumainaura - Google Search](https://www.google.com/search?q=lgtm+yumainaura&oq=lgtm+yumainaura&aqs=chrome..69i57j69i61j69i60.4806j0j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
pushd / popd に気をつけろ！

みんな大好き pushd と popd は、ターミナルで作業するときは大変便利です。

しかし、スクリプトの中では pushd / popd よりも、サブシェル実行 `( ... )` を使った方が良いかもしれません。

# pushd / popd の問題点

最大の問題は**`sudo -u` で他のユーザーとして実行しようとした時に失敗する**ことです。

シェルスクリプトは、アプリのデプロイとか、ログの整理とかに使うことが多いと思います。そんな用途では "ディレクトリに移動 → 作業 → 次のディレクトリに移動" という流れになることが多いでしょう。

```bash
# update-apps.sh
:　全体の事前準備

for d in /path/to/apps/*; do
  pushd "$d"

    : ファイルをダウンロードしたり
    : 展開したり、削除したり

  popd # ←ここでエラーになる（後述）
done

: 全体の事後処理（完了をメールやチャットに通知するとか）
```

ところで、デプロイ作業は rootやアプリ専用のユーザーで行いたいはずです。ユーザーを変更するには `sudo` を使います。

```shell
# ssh と sudo を使えば、1コマンドでデプロイを実行できるぞ！
$ ssh myuser@server sudo -u appuser /path/to/update-apps.sh
```

しかし、`ssh myuser@server` を実行するとカレントディレクトリは myuser のホーム（`/home/myuser`）になりますが`appuser`はそこにアクセスできません。すると、`pushd` した後、`popd`で`/home/myuser`に戻ろうとした時、移動先にアクセス権が無いためエラーになるのです。

# 代替案： `( ... )`でサブシェルで実行する

`popd` に失敗する問題は、`sudo`に`-i`オプションを付けたり、スクリプトの始めで`cd`したりしても回避できます。

しかし、オススメの解決策は`( ... )` を使うことです。

```bash
# update-apps.sh
# サブシェルを使ったバージョン
: 全体の事前処理

for d in /path/to/apps/*; do
  (
    cd "$d"
    : ファイルをダウンロードしたり
    : 展開したり、削除したり
  )
  # エラーにならない
done

: 全体の事後処理（完了をメールやチャットに通知するとか
```

`( ... )` の中はサブシェルで実行されるので`cd` しても外側のカレントディレクトリは変更されません。つまり「元のディレクトリに戻る」操作自体が発生しないので、アクセス権の問題も起きないのです。

また、`( ... )`で囲むと**一塊りの処理であることが見た目にも分かりやすくなります**。また、実際に独立したサブシェルで実行されているので、処理の影響範囲を見分けやすくなります。

# pushd / popd を使わなくてはならないケース

`( ... )` の中身はサブシェルで実行されます。これはメリットでもあるのですが、逆に言えば**変数を更新しても外側には反映されません**。

```bash
# Documents/ にあるgitプロジェクトのファイル数を数える（動作しない）

count=0
for d in ~/Documents/*/; do
  (
    cd "$d"
    n="$(git ls-files | wc -l)" # ファイル数を数える
    count="$(( $count + $n ))" # 外側には反映されない代入
  )
done
echo $count # => 0
```

この場合こそ pushd / popd を使います。

```bash
# Documents/ にあるgitプロジェクトのファイル数を数える（動作する）

count=0
for d in ~/Documents/*/; do
  pushd "$d" > /dev/null
    n="$(git ls-files | wc -l)" # ファイル数を数える
    count="$(( $count + $n ))" # 外側には反映されない代入
  popd > /dev/null
done
echo $count # => 正しい合計値
```

なお、`pushd` と `popd` の間はインデントしておくとディレクトリが切り替わっているのが分かりやすくてよいと思います。

また、pushd / popd は **現在スタックに積まれているディレクトリを標準出力に出力する**ので `> /dev/null` をつけます。
Laravelのviewファイルを置くだけでブラウザからアクセスできるようにRouteをゴニョゴニョする

# viewを置くだけで見たいときもある
通常、Laravelで構築されたサイト上にコンテンツを追加してブラウザからアクセス可能にするには、
・controller を追加&編集
・view を作成&編集
・routes/web.php に追記
といった作業が必要になるわけだが、
ある特定のケースではそれが面倒というか実質難しい場合もあったりする。

というのは、現在やってる案件で、
「サイト構成やデザインはモックを見ながら相談しましょう」ということになったので、
まぁ最近の主流であれば gulp みたいの使ってゴリっと〜みたいなケースが多いとは思いつつ、
顧客にいつでも見てもらうようにするにはサーバ上に置く必要があるし、
そのために別の vhost 用意すんのも気分的にダルいし、
どうせなら最初から blade でモック作って、
OK出たらそのまま流用して編集できたら楽だよな、と思いついた次第。

# routes/web.php にモック用のモノグサ関数を仕込む

```routes/web.php
// ---------------------------------------------------------------------
// モック用に view → route の動的処理
// ---------------------------------------------------------------------
addRouteWithMockView( resource_path() . "/views/mock", "mock" );

function addRouteWithMockView( $path, $url ) {
	// 設定済みのルートを取得
	$exists_routes	= Route::getRoutes()->get("GET");

	// 一応存在&読み取りチェック
	if ( file_exists( $path ) && is_dir( $path ) && is_readable( $path ) ) {

		// ディレクトリ取得
		$dir = opendir( $path );

		// ディレクトリ内の要素ごとにループ処理
		while ( $elm = readdir( $dir ) ) {

			// 自ディレクトリ or 親ディレクトリは無視
			if ( $elm == "." || $elm == ".." ) {
				continue;
	
			// 要素がディレクトリだったら関数を再帰実行
			} elseif ( is_dir( "{$path}/{$elm}" ) ) {
				addRouteWithMockView( "{$path}/{$elm}", "{$url}/{$elm}" );
	
			// 要素が ****.blade.php だったら
			} elseif ( preg_match( "/^(.+)\.blade\.php$/", $elm, $match ) ) {
				// あたまにつくスラッシュを抜いとく
				$view_url	= ltrim( "{$url}/{$match[1]}", "/" );
				// view指定形式に変換しとく
				$view_path	= preg_replace( "/\//", ".", $view_url );

				// すでに同じURLのルートが設定済みだったら無視
				if ( isset( $exists_routes[ $view_url ] ) ) {
					continue;

				// モック用HTMLを期待のURLで見れるようにルート追加
				} else {
					Route::view( $view_url, $view_path );
				}
			}
		}
	}
}
```
コメントに書いてしまったので特に説明も不要とは思いつつ、
処理としては
・resources/views にある任意のディレクトリ(この場合は mock )内を走査
・****.blade.php があったら、その名前でアクセスできるよう route を動的に追加
というだけ。

当然、ファイルが増えればどんどん重い処理になっていくし、
このやり方だとパーツ類もURL発行しちゃうから微妙だし、
本番環境で使うには向かないので、開発段階のみ利用するか、
全体を開発環境のみな条件分岐で囲ってあげたほうがいいけど、
そのあたりは改造すれば本番でも活躍できるかもしれない。
Nextcloud の共有フォルダのダイレクトリンクコピー

#はじめに
社内でファイル共有をしていると、利用者同士で、
「xxxのファイルを更新しました。」
とか、
「xxxのフォルダにファイルをアップしたので確認ください。」
など、日常のやりとりで、このような会話が発生します。

ファイルサーバですと、ネットワークドライブに割り当てたフォルダになるかと思いますが、Nextcloudの場合は、Web画面内にダイレクトリンクをコピーするボタンがありますので、今回は、こちらを紹介したいと思います。

#使い方
まず、共有されているフォルダの共有アイコンをクリックします。
![画像153.png](https://qiita-image-store.s3.amazonaws.com/0/308127/dd5a7800-ca76-11e7-ce44-5ffcddfffac7.png)

画面右側に詳細画面が表示されます。右上にダイレクトリンクのコピーボタンがありますので、こちらをクリックすると、クリップボードに保存されます。
![画像154.png](https://qiita-image-store.s3.amazonaws.com/0/308127/26c4ebd6-ccbc-8e94-7901-bc4d98f60ba7.png)

あとは、チャットやメールなどで、共有相手に伝えればOKです。
![画像155.png](https://qiita-image-store.s3.amazonaws.com/0/308127/c21a585b-18a6-4199-c67e-c78424a74248.png)

最近は、社内でSlackなどのチャットツールを利用するケースも多くなってきていると思いますので、スムーズに相手に伝える事ができますね。

この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております。
さくらのレンタルサーバでPHPモジュールモードとCGIモードを併用する

# 動機

さくらのレンタルサーバでは、スタンダードプランでも2018年4月18日以降に新たに契約したサーバでモジュールモードのPHPが使えるようになりました。
[さくらのレンタルサーバ スタンダード・プレミアムにて「PHPモジュールモード」提供開始のお知らせ | さくらインターネット](https://www.sakura.ad.jp/information/announcements/2018/04/18/1929/)

基本的にはモジュールモードのほうがパフォーマンスは良いと言われますが、そうはいってもCGIモードを完全には捨てられないときがあります。

例えば、PHPの拡張モジュールを使いたい場合。
CGIモードなら、さくらのレンタルサーバであれば ``php.ini`` に ``extension=imagick.so`` と1行書いておけば、それで次のリクエストから拡張モジュールが有効になりました。
しかし、モジュールモードの場合はリクエストごとにプロセスが起動するわけではありませんので、サーバを再起動しないと設定が反映されません。そして、レンタルサーバではユーザの裁量でサーバを再起動することができません。
このような場合、**その機能が必要なPHPスクリプトだけをCGIモードで実行する**という手が考えられます。

# 方法

以下のやり方の応用です。
[さくらインターネットで、異なるバージョンのPHPを使う - Qiita](https://qiita.com/akspect/items/3231a957f7af8471efb7)

```.htaccess:.htaccess
Action myphp-script /php72.cgi
AddHandler myphp-script .php
```

```bash:php72.cgi
#!/bin/sh
exec /usr/local/php/7.2/bin/php-cgi -d extension=imagick.so
```

php.iniに書ける設定を -d オプションで直接与えることができます。
これによって、.htaccess を設置したフォルダ以下にある .php のファイルはCGIモードで実行されます。

サブフォルダの中だけに適用させる場合、サブフォルダの中に .htaccess を作成します。
.htaccess の Action に指定するパスなどは適宜調整してください。

# 結果

以下のファイルを設置（確認が終わったら削除してください）

```bash:phpinfo.php
<?php
phpinfo();
```

ブラウザから ``https://example.com/phpinfo.php`` にアクセスすると、

- Server APIが「CGI/FastCGI」になる
- Imagickが有効になる（Imagickの設定項目が表示される）

ことが確認できます。
Vagrant + Ubuntu + Docker

####きっかけ
既存のRailsシステムをLinux上で動作確認する必要があったため。

# Vagrant の設定
※MacにVagrant、VirtualBoxが既に入っている前提

ローカルの作業フォルダを作成して

```
$ mkdir dotinstall-docker-lesson
$ cd dotinstall-docker-lesson
```
Vagrant を初期化する。
boxはVagrant Cloudの [ubuntu/xenial64](https://app.vagrantup.com/ubuntu/boxes/xenial64) を使用する。

```
$ vagrant init ubuntu/xenial64
```
Vagrant ファイルが作成されるので開いて、

```
$ vim Vagrantfile
```

プライベートネットワークのIPアドレスを `~55.44` あたりに変えてあげる
これで、ホストOSからゲストOSへ`192.168.55.44`で接続できるようになる

``` 

  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  # config.vm.network "private_network", ip: "192.168.33.10"
   config.vm.network "private_network", ip: "192.168.55.44"
```

保存したらVagrantを起動

```
$ vagrant up
```
起動したらSSHで接続してUbuntuの仮想環境（ゲストOS）の中に入っていく

```
$ vagrant ssh
```


# Docker インストール
[Docker公　> Get Docker > Docker CE > Linux > Ubuntu](https://docs.docker.com/install/linux/docker-ce/ubuntu/)
公式サイト↑に従って、
Vagrantで作ったUbuntuの仮想環境にDockderをインストールする

### Docker リポジトリを設定

```.sh
# aptパッケージインデックスを更新
$ sudo apt-get update

# aptがHTTPS経由でリポジトリを使用できるようにパッケージをインストールする

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

# Dockerの公式GPGキーを追加する
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# 下８桁でキーの存在を確認
$ sudo apt-key fingerprint 0EBFCD88

# 安定したリポジトリの設定
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

```

### Dockerをインストール

```.sh
# aptパッケージインデックスを更新
$ sudo apt-get update

# 最新バージョンのDockerCEをインストール
$ sudo apt-get install docker-ce

```
### Dockerインストール後の処理（Linux用）
[Post-installation steps for Linux](https://docs.docker.com/install/linux/linux-postinstall/) へ進む

```.sh
# docker グループを作成する
$ sudo groupadd docker

# ユーザを docker グループに追加する
$ sudo usermod -aG docker $USER

# 再起動してグループメンバーシップを認識させる
$ sudo reboot
$ vagrant up
$ vagrant ssh

# sudo コマンドなしで docker 動かせることを確認
$ docker run hello-world
```

# Docker Compose のインストール
```.sh
# Docker Compose の最新版をダウンロード
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.23.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 実行権限をバイナリに付与
$ sudo chmod +x /usr/local/bin/docker-compose

# インストールを確認
$ docker-compose --version
```

以上
複数のGitリポジトリを一つにまとめる

また例によって他の方の例の通りにやっても自分の希望通りにはできなかったので、自分なりの試行錯誤も込めて。

# 目的

- 複数のGitリポジトリを一つにまとめたい。
- まとめた後、元のリポジトリは削除し統合したリポジトリで運用したい。
- ローカルリポジトリ間で統合させたい（いろいろ試行錯誤したかったため）
- ディレクトリ構成も綺麗にしておきたい。

参考の方法ではディレクトリ構成が希望通りに行かなかったり、
ディレクトリ構成は上手くいってもリポジトリが希望通りにマージされなかったりしたので
その辺りを対処した手法になります。

# 構成

parent_repo（親リポジトリ、新規に作成）
├child_repo1
├child_repo2
└child_repo3

Finder上で見るとまとめた後は以下のような構成になります。

<img width="401" alt="スクリーンショット 2018-12-28 10.10.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/214400/8c97d6a9-1abf-6a6d-5e32-68b4827ecafa.png">

# 作業の前に
元のリポジトリにあるブランチはmasterにマージしておくなど、綺麗な状態にしておくと後々混乱しなくて良いかもです。

# 手順

## 親となるリポジトリ作成

```console:console
$ git init
$ git add .
$ git commit -m "first commit"
[master (root-commit) cad08ec] first commit
 2 files changed, 3 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 README.md
```

## 子のリポジトリを統合

git checkoutした後で一度commitしないとマージできないので注意。

```console:console
$ git remote add child_repo1 /Users/miutex/Desktop/child_repo1
$ git fetch child_repo1
warning: no common commits
remote: Counting objects: 16, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 16 (delta 4), reused 0 (delta 0)
Unpacking objects: 100% (16/16), done.
From /Users/miutex/Desktop/child_repo1
 * [new branch]      develop        -> child_repo1/develop
 * [new branch]      feat/func1 -> child_repo1/feat/func1
 * [new branch]      master         -> child_repo1/master
 * [new tag]         1.1.0 -> 1.1.0
$ git read-tree --prefix=child_repo1/ child_repo1/master
$ git checkout -- .
$ git add .
$ git commit -m "add child_repo1"
[master 2ef305c] add child_repo1
 1 file changed, 330 insertions(+)
 create mode 100644 child_repo1/index.js
$ git merge -s subtree child_repo1/master --allow-unrelated-histories
Merge made by the 'subtree' strategy.
```

## リモートリポジトリを削除
上記「子のリポジトリを統合」の1行目で行ったローカルパスをリモートリポジトリとして登録したものを削除します。
ターミナルでやるでも、SourceTree等のツールでやるでも可。私はSourceTree上で削除しました。
（重要）リモートリポジトリを削除すると**コミットメッセージ、タグは残りますがブランチ名は消えます。**

# 結果
SourceTreeで見ると以下のような形に統合されます。

<img width="513" alt="スクリーンショット 2018-12-28 10.20.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/214400/e6ea2a7c-be16-dd82-858e-4940dc9ebf19.png">



# 参考
https://qiita.com/uasi/items/77d41698630fef012f82
ネットワークプロトコルとは？

プロトコルとは
----
プロトコルとは、コンピュータ間で通信を行うために取り決められた規約を定めたものです。
コンピュータ間をただLANケーブルなどで物理的に接続しただけでは、相互間で通信することができません。
プロトコル（TCP/IP等）を使用することで、コンピュータ間通信できます。

プロトコルスタック(protocol stack)
----
プロトコルスタックとは、コンピュータ上で、通信を実現するための一連のプロトコルの階層です。
通信プロトコルには様々な役割があり、それらの各プロトコルが連携して通信が実現されていて、それらのプロトコルは階層的な構造になっています。

例えばインターネットで用いられているTCP/IPの場合、一番下の物理層にネットワークカードを制御するデバイスドライバがあり、その上のデータリンク層にLAN を制御するEthernet(IEEE 802.3)などの通信プロトコルが機能しています。

その上のネットワーク層にはコンピュータ同士で通信を制御するIPがあり、その上のトランスポート層に2つの端末間で信頼性のある通信を提供するTCPやUDPがあり、。
一番上のアプリケーション層には、インターネットでハイパーテキストを転送するHTTPがあり、それらが連携して通信を実現しています。
プロトコルスタックは、一揃い(suite)という意味で、プロトコルスイートと呼ばれることがあり、特にTCP/IPの場合は、「インターネットプロトコルスイート」といわれることもあります。
![トランスポートネットワーク.png](https://qiita-image-store.s3.amazonaws.com/0/315849/0f82a4da-45c8-e92a-9798-04caecc80b7e.png)

プロトコルの種類
----
数多くのプロトコルの体系があるなかで、現在最も主流な通信プロトコルといえばTCP/IPです。
TCP/IPはLAN、WAN、インターネットなどで最も使用されているプロトコルです。
TCP/IPといっても、通信する際にTCPとIPだけを使用する訳ではなく、その他にUDP、FTP、Telnetなどの数多くのプロトコルを使用しています。
それらを総称してTCP/IPと呼んでいます。

|通信プロトコルの体系|使用されるプロトコルの例|主な用途|
|------|-------|------|
|TCP/IP|IP, ICMP, TCP, UDP, SMTP, HTTP....|全てのネットワーク　|
|IPX/SPX|IPX, SPX, NCP....|Netware OS環境のLAN|
|AppleTalk|AARP, DDP, RTMP, AEP.....|Mac OS環境のLAN|


コンピュータ間で通信
----
コンピュータ間通信を行うためには、同じ体系の通信プロトコルを使用する必要があります。
下図を例にコンピュータAがTCP/IP対応の通信プロトコルを使用しているならコンピュータBもTCP/IPプロトコルを使用していないとプロトコルが異なるので相互通信を行うことができません。
![コンピュータ通信（プロトコル）.png](https://qiita-image-store.s3.amazonaws.com/0/315849/f5dbd523-3479-2e5d-2d45-2f1c67df2d1d.png)


現在では、TCP/IP以外は、ほぼ使用されていませんのでネットワークの仕事をする上でTCP/IPをマスターしていれば大丈夫でしょう。
TCP/IPはそれくらい主流なプロトコルとなります。
Node.jsでsetTimeoutしたら戻り値がtimerIdじゃなかった件

Node.jsの熟練者の人は常識かもしれませんが。。。。
# きっかけはJSON.stringify()
Node.jsでJSON.stringify()を使うことがあったんですよ。
そしたらJSON.stringify()からエラーが発生するんです。

```
(node:9372) UnhandledPromiseRejectionWarning: TypeError: Converting circular structure to JSON
```

なんだこれって思ってググっても、循環させるなって書いてあるんです。
別に循環させてるところなんてないし、なんでだろう、なんでだろうって思ってログ出してみたんです。
そしたら、ある一つの要素にsetTimeoutの戻り値いれてたところがあったんですが、数値じゃなくて**オブジェクト**だったんです！！！
# Node.jsでsetTimeoutしたら戻り値がTimeoutクラスだった
フロント周りやっているとsetTimeoutの戻り値ってtimerIdだって思っているじゃないですか。
clearTimeoutで使用するために戻り値保持してたんです。
よくよく調べるとTimeoutクラスっていうのが返ってきてるらしいです。

https://nodejs.org/api/timers.html#timers_settimeout_callback_delay_args

普通に使ってれば、意識することないかもしれないですが、JSON.stringify()時はエラーがでるので気をつけて！
Rails で flash メッセージを JavaScript で表示する [notify]

## 問題

Rails だと、

```rb
redirect_to root_path, notice: 'なんやて？'
```

みたいな感じでページ上部に`なんやて？`を表示するのが標準（多分）のやり方だが、そうじゃなくて JS で [notify](https://github.com/jpillora/notifyjs) とか [pnotify](https://github.com/sciactive/pnotify) で表示したいよーって時に困った。

ググってみるとヘッダーから取り出す記事があったりしたが、よく考えたらめちゃくちゃ簡単に解決できた。

## 解決法

こっそり画面上部にメッセージを隠す。

```erb
<body>
  <div id="flash-notice" hidden>
    <%= flash[:notice] %>
  </div>
　　　　etc...
</body>
```

そして JS から使う。

```js
$.notify($('#flash-notice').text().trim());
```

## 結論

幸せになった。
プログラム内で Mac のホスト名を取得

# はじめに
- プログラム上で Mac 自身のホスト名を取得する必要があったので、ちょっと調べてみました
    - 同一のローカルネットワーク上からアクセスするための名前を取得したかったため
    - 実行する Mac が変わる可能性があるので、ホスト名を直書きしたくない

# 使うもの
- Foundation フレームワークにHost クラスがあるので、これが使えそうです
    - [Host - Foundation | Apple Developer Documentation](https://developer.apple.com/documentation/foundation/host)

# 試した環境
- macOS Mojave 10.14.2
- Xcode 10.1
- Swift 4.2

# ホスト名の取得方法
- 以下のようなコードで取得できます

```swift
if let hostName = Host.current().name {
    print(hostName)
}
```
- 実行結果例（システム環境設定の共有から設定したコンピュータ名によって、結果は異なります）

```bash
my-business-mac.local
```

# 課題
- 上記のコードで、一見問題ないように見えます
- が、 Apple のドキュメント上ではこう書かれています

> One of the hostnames of the receiver. Can be either a simple hostname, such as "sales", or a fully qualified domain name, such as "sales.anycorp.com".

- つまり、複数あるうちのどの形式で返されるかわからないということです
- 試しに、こんなコードを書いてみました

```swift
for hostName in Host.current().names {
    print(hostName)
}
```

- 実行結果例

```bash
my-business-mac.local
MY-BUSINESS-MAC.local
localhost
```

-  場合によっては localhost が返されてしまう可能性があるということかもしれません
    -  私の用途としては、ネットワーク上からアクセスできる名前が欲しかったので localhost が返されると厳しいです
-  常に一番上の形式を返してくれればいいのですが、確実な保証はなさそうです

# 最後に
- ホスト名を取得したい場面はいろいろありそうですが、少なくとも Host クラスでは指定した取得はできなさそうです
- 他の API で上手く取得できる、などがあれば情報を頂けるとうれしいです
Windows10のタスクマネージャにプロセスが表示されない

##現象
SMBCのカードリーダをインストールしてから、Windows10のタスクマネージャの「プロセス」タブと「ユーザ」タブの内容が空っぽになってしまった。

##解決
1.タスクマネージャの「スタートアップ」タブでForcePINを探して、状態を「無効化」に変更する。
2.タスクマネージャの「詳細」タブで「ForcePIN.exe」を探して、「タスクの終了」を実行する。

上記操作で復活した。
2018年11月統計検定2級の問題の解説（その２）

- 問７：ベイズの定理に関する問題
- 問８：正規分布に関する問題
- 問９：二項分布に関する問題
- 問１０：標本平均の期待値・分散に関する問題
- 問１１：歪度と尖度に関する問題 
- 問１２：信頼区間に関する問題
ターゲット追跡スケーリングポリシーで定義済メトリクス以外を追加

※事前に必要な操作権限を与えておく。試すだけならadministratorのIAMポリシーでOK
※今回はDiskWriteOps(インスタンスストアのwrite iops)をスケーリングポリシーにしている


既存のスケーリングポリシーがあれば消しておく

```bash:
$ aws autoscaling delete-policy --policy-name handson-as-policy --auto-scaling-group-name handson-as-grp 
```

config.jsonでスケーリングポリシーの定義を作っておく

```json:
$ cat config.json 
{
  "CustomizedMetricSpecification": {
    "MetricName": "DiskWriteOps",
    "Dimensions": [
      {
        "Name": "AutoScalingGroupName",
        "Value": "handson-as-grp"
      }
    ],
    "Namespace": "EC2",
    "Statistic": "Average",
    "Unit": "None"
  },
  "TargetValue": 200,
  "DisableScaleIn": false
}
```

tmp-diskという名前でスケーリングポリシーを追加
追加先はターゲット追跡スケーリングポリシーで作成されたAutoScalingGroupのhandson-as-grp

以下のようにターゲット追跡スケーリングポリシーなのでスケールアウト/スケールインのアラームも2つ作成されています。ターゲット追跡スケーリングポリシーを消すとアラームも消えます

```json:
$ aws autoscaling put-scaling-policy --policy-name tmp-disk --auto-scaling-group-name handson-as-grp --policy-type TargetTrackingScaling --target-tracking-configuration file://config.json
{
    "Alarms": [
        {
            "AlarmName": "TargetTracking-handson-as-grp-AlarmHigh-9b96e6c4-f5e4-4b3a-870d-9f17b2d68d14", 
            "AlarmARN": "arn:aws:cloudwatch:ap-northeast-1:xxxxxxxxxxxx:alarm:TargetTracking-handson-as-grp-AlarmHigh-9b96e6c4-f5e4-4b3a-870d-9f17b2d68d14"
        }, 
        {
            "AlarmName": "TargetTracking-handson-as-grp-AlarmLow-de827d81-bce3-4d46-86ec-03396c639745", 
            "AlarmARN": "arn:aws:cloudwatch:ap-northeast-1:xxxxxxxxxxxx:alarm:TargetTracking-handson-as-grp-AlarmLow-de827d81-bce3-4d46-86ec-03396c639745"
        }
    ], 
    "PolicyARN": "arn:aws:autoscaling:ap-northeast-1:xxxxxxxxxxxx:scalingPolicy:cbfffc44-3c0e-459f-a976-42de82284d87:autoScalingGroupName/handson-as-grp:policyName/tmp-disk"
}
```

<img width="1052" alt="スクリーンショット 0030-12-28 9.57.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/23c7fff1-1f91-f135-1a10-8632b79efa6d.png">


<img width="1064" alt="スクリーンショット 0030-12-28 9.56.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/27932/495fc1ba-8279-84f4-0858-52d515105440.png">
【2018年年末まとめ】2018/12/25 Linux 初心者向け勉強会メモ

#はじめに
タイトルのとおりです。勉強会に参加した際のメモを少し整理したものです。

#勉強したこと
* Linuxの概念(アーキテクチャ)について
* そもそもOSとは？
    * ハードとソフトの間に入ってお互いの差異を調整するもの
* Linuxとは？
    * Linuxカーネル単体では何も動かない
    * Linuxカーネルが動く状態にしたものをLinuxディストリビューション(Redhat/DEBIAN)という
    * たとえばAndroidにもカーネルは入っている
    * Windowsとの違い：例：Linuxは複数人で使用する
* Linuxコマンド
    * 位置確認(pwd)
    * ディレクトリ作成(mkdir)
    * 直下にファイル・ディレクトリが存在確認(ls)
    * 階層を飛ばしてファイル作成(touch)
    * ★★★ファイル編集 (vi)
        * insertモード(「a」「i」)
        * コマンドモード(「escキー」)
    * ★★★パーミッション(guest$ ls -l)
* CUIとは？
    * たとえば、これらはCUIの一種
        * black-google
        * google gravity
* 絶対パス⇔相対パス
    * 自分の今いるディレクトリの直下ファイルを操作（絶対パス）
    * 直下以外のファイルやディレクトリを指定して操作（相対パス）
* シェルとは？
    * たとえばbash(MAC)、コマンドプロンプト(Windows)
* リダイレクトとは？
    * （追記（>>） | 上書き(>)
* エイリアスとは？
    * あだ名、ｼｮｰﾄｶｯﾄｷｰみたいなもの
* ファイルを探索（find～）

# おわり

#参考URL
「[秋葉原] ゼロから始めるエンジニアリング入門 後半 Linux入門 (初心者大歓迎！)」
https://paper.dropbox.com/doc/Linux---AUVis9D5065dcCs3xg36Y3ZXAg-DaBmyh9PTldA0C2qE2Cf7#:h2=[%E7%A7%8B%E8%91%89%E5%8E%9F]-%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E5%A7%8B%E3%82%81%E3%82%8B%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%AA%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80-%E5%BE%8C%E5%8D%8A-Lin
2018年11月統計検定2級の問題の解説（その１）

- 問１：相対度数、箱ひげ図に関する問題
- 問２：相関係数に関する問題
- 問３：変化率に関する問題
- 問４：価格指数に関する問題
- 問５：標本抽出に関する問題 
- 問６：標本調査に関する問題
「2019年2月」MySQLコマンドまとめ

#はじめに
WordPressサイトを移管するとき、実際に使ったMySQLのコマンドをまとめました。ほとんど自分用のメモです。

#SQLコマンド
***ログイン***

```sql


$ mysql -u [ユーザ名] -p
```

***ユーザの追加***

```sql


$ mysql > create user `wpuser`@`localhost` IDENTIFIED BY `wpuser`;

//
   ユーザ名：wpusr
パスワード：wpusr
   ホスト名：locathost
文字セット：utf8mb4
```

***ユーザにDB操作権限を付与***

```sql


$ mysql >  grant all privileges on wp.* to wpusr@localhost IDENTIFIED BY 'wpusr';

//
対象：wpusr@localhost
対象のパスワード：wpusr
操作できるDB名：wpdb_test
```

##ユーザーにパスワードをセットする

***ログイン中のユーザーのパスワードを設定する場合***

```sql


$mysql > set password = password('')
```

***特定のユーザーのパスワードを設定する場合***

```sql


$ mysql > set password for `wpusr`@`localhost` = password('wpusr1234');
//
ユーザー名：wpusr
新パスワード：wpusr1234
ホスト名：localhost
```

#データベース関連
***データベース一覧の表示***

```sql


$ mysql > show databases;
```

***データベースの追加(データベース名：wpdb_test)***

```sql

$ mysql > create database wpdb_test;
```

***データベースの選択（wpdb_testを選択する場合）***

```sql


$ mysql > use wpdb_test;
```

#テーブル関連

***テーブル一覧の表示***

```sql

$ mysql > show tables;
```

***テーブル一覧の詳細表示***

```sql

$ mysql > show table status;
```

***テーブルの作成***

```sql

$ mysql > CREATE TABLE [テーブル名] (
   [フィールド名][データ型][オプション]
) ENGINE=[InnoDB/MyISAM] DEFAULT CHARSET=[文字コード];

// 例
$ mysql > CREATE TABLE `m_users`(
			`id`
			`nama`
)
```

***データベースの確認(データベース名：wpdb)***

```sql

$ mysql > use wpdb;
$ mysql > show tables;
```

***詳細を知りたい***

```sql

$ mysql > show table status;
```

***テーブル設計の確認***

```sql

$ mysql > desc wp_users
```

###データベースの内容を検証する
***①データベースの選択***

```sql


$mysql > use wpdb2;
```

***②テーブル一覧の表示***

```sql


$mysql > show tables;
```

***③データベースの削除(wpdb_test)***

```sql

$ mysql > drop database wpdb_test;
```

###データディレクトリの場所を確認

```sql

$mysql > select @@datadir
```
Docker Toolbox利用時においてポートフォワーディングができない

#概要
Docker Toolbox利用時においてポートフォワーディングができなかった。
原因は２つ。
Toolbox利用時にはDocker for Macと異なり、VMに対してアクセスする必要がある。
**ブラウザにMicrosoft Edgeを利用している場合、Edgeはデフォルトではローカルホスト接続ができない。
よって、別のブラウザを利用するか、設定を変更する必要がある。**


#発生エラー
以下のように、nginxのイメージについてポートフォワーディングを指定の上、ブラウザからlocalhost:8080にアクセスしたがnginxの画面は表示されず、ブラウザからページが見つかりませんのエラーになった。

```
$ docker run -p 8080:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
a5a6f2f73cd8: Pull complete
9ab922c47467: Pull complete
6c77b7c267b0: Pull complete
Digest: sha256:333a036f4f8cd2314bdf339a5c72440e011071831699abefe03b73442d9b0045
Status: Downloaded newer image for nginx:latest
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222043/6ada223d-3e9d-c9a0-858f-5cb13feef135.png)


#エラー原因

- Toolbox利用時にはDocker for Macと異なり、VMに対してアクセスする必要がある。
- ブラウザにMicrosoft Edgeを利用している場合、Edgeはデフォルトではローカルホスト接続ができない。


#対応策
VMへアクセスするためのIPは以下のコマンドで確認できる。

```
$ docker-machine ip default
192.168.99.100
```

また、ブラウザについてはChromeやIEを利用すればよい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222043/cdea635d-d80f-bc0e-78ac-91a018344c1d.png)
HULFTをsystemdのサービスとして動かすユニットファイルを作った

ネットでいろいろ調べたけど、なかなか有益な情報がなかったので自分で作成してみた。
最近のLinuxはsystemdを使っているケースが多いが、HULFTにはユニットファイルは付属しておらず、initの起動・停止スクリプトすら付いていない。
採用している皆さんはそれぞれ独自で作成している様だが、systemdのユニットファイルの情報は殆どなく、今後作成する必要が出てくる人もいるだろうと思い、掲載する。

Type=は、simpleでも良いがRestart=alwaysが効かないので、forkingにしてある。systemdに監視・再起動させないのであればsimpleでも問題ない。

後は環境に合わせて調整して下さい。

送信デーモン用

```/usr/lib/systemd/system/hulsndd.service
[Unit]
Description=HULFT send daemon(hulsndd)
After=syslog.target network.target

[Service]
Type=forking
Environment=PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/opt/HULFT/bin
Environment=HULEXEP=/opt/HULFT/bin
Environment=HULPATH=/opt/HULFT/etc
ExecStart=/opt/HULFT/bin/hulsndd
ExecStop=/opt/HULFT/bin/utlkillsnd
Restart=always

[Install]
WantedBy=multi-user.target
```

受信デーモン用

```/usr/lib/systemd/system/hulrcvd.service
[Unit]
Description=HULFT receive daemon(hulrcvd)
After=syslog.target network.target

[Service]
Type=forking
Environment=PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/opt/HULFT/bin
Environment=HULEXEP=/opt/HULFT/bin
Environment=HULPATH=/opt/HULFT/etc
ExecStart=/opt/HULFT/bin/hulrcvd
ExecStop=/opt/HULFT/bin/utlkillrcv
Restart=always

[Install]
WantedBy=multi-user.target
```