OmniAICreator/Qiita-1.07M huggingface dataset:
やっぱり、わけわからない。Xcode、実機でプレビューしたいのになぜか「iPhone has denied the launch request」


すげーよくわからない。実機とMacをつないで、Xcodeから実機でプレビューさせようと思ったら、最後の最後で「iPhone has denied the launch request」と表示される。

##Provision（プロビジョン）ファイルの設定。
色々と調べると、Provision（プロビジョン）ファイルの設定がおかしいという。なので、[Apple Developer](https://developer.apple.com/)で再度プロビジョンを確認。
しかし、DeveloperのDeviceではすでに設定されている。
つないでいるiphoneとこのDeveloperのプロビジョンファイルで設定している端末が違うのかと思い、UIUDを調べる。

[iPhoneなどのUDIDを調べる方法](https://mushikago.com/i/?p=1833)

ituneでiphoneのシリアル番号のところをクリックすると、UIUDが表示される。
それと登録されている番号を見ても同じものが表示されていた。

##問題は別になる。
色々と調べると、こちらのサイトにたどり着いた。
https://www.jianshu.com/p/5a14906452ed

中国サイトで何書いてあるかわからないけど、キャプチャを見ると同じ内容ぽい。

解決方法として、「Product -> Edit Scheme -> Executable > Ask On Launch」と書いてある、でもこれは少しわかりづらい。
メニューのProductに「Edit Scheme」がないから。実はXcodeの左上にある、ディバイスなどを選択する所にある。
![Kobito.r2hQOh.png](https://qiita-image-store.s3.amazonaws.com/0/23659/c1d6f871-ccae-17e0-9995-1a7ee91bb7b6.png "Kobito.r2hQOh.png")

ここで、先ほどの手順通り行う。
設定が完了

##すでに公開されているアプリだから？！
これで、実機とMacをつないで、シミュレーションに実機を選択し、実行すると小窓が開いてiPhone内のアプリのリストが表示される。そして、該当のアプリを選択したら、実機で起動することができた。

今、思うとすでに公開されているアプリの改修で、そのアプリの実機テストになる。つないだiphone内にすでにアプリが存在することになるからエラーが出ていたのかもしれない。

##キャッシュが残りやすい。
色々と試して、なんとなくわかった。
この方法を普通に行うとキャッシュが残りやすくなっている。なので、都度既存アプリをiphoneからアンインストールした方が良い。
そして、解決方法として挙げた、「Product -> Edit Scheme -> Executable > Ask On Launch」をつど行う方が良いかもしれない。
![Kobito.KRsR8M.png](https://qiita-image-store.s3.amazonaws.com/0/23659/e13d5608-7c91-c8cb-797a-a2ba4d7833e6.png "Kobito.KRsR8M.png")
さらにこの画面で、Build Configurationを「Debug」にしておいた方が良いかも。
【PHP】print_rやvar_dumpした値を代入すると、その時点で出力も行われる

タイトルの通りです。

そもそも代入する人はいないと思いますが・・・

# print_r
通常の``print_r``の出力が行われます。加えて、boolean型の``1``が代入されます。

```php
<?php
$test01 = 'test01';
$test02 = print_r($test01); // 出力結果：test01
print_r($test02);           // 出力結果：1
var_dump($test02);          // 出力結果：bool(true)
```

# var_dump
通常の``var_dump``の出力が行われます。こちらは何も代入されません。

```php
$test03 = 'test03';
$test04 = var_dump($test03); // 出力結果：string(6) "test03"
print_r($test04);            // 出力結果：なし
var_dump($test04);           // 出力結果：NULL
```
ブロッホ球をくるくるしながら学べるおもちゃができました

## [●ここからとべます](https://qease.herokuapp.com/bloch/try/)
↑ゼミで使用したかったので，急ぎ足で作ってみました．これからいろいろ機能をつけたしていこうかなと思っていますが，デプロイ記念＆尻叩き用にのせておきます．
みなさんどうぞくるくるして遊んでみてください．

## 遊び方
- 量子ゲートを模したボタンを押すと，ブロッホ球の中でベクトルがくるくる回転します
- マウスでぐりぐりすると，ブロッホ球をいろんな角度から見ることができます
- 代表的な単一量子ゲート($X,Z,S^{\dagger},S,T,T^{\dagger}$)を用意しました
    - 2019/02/17追記：$Y$ゲートを追加しました
- 各ゲートの回転角につきましては，[こちら](https://qiita.com/nisuikiba/items/5026c5fba30c247d5f45#single-qubit-gates--%E5%8D%98%E4%B8%80%E9%87%8F%E5%AD%90%E3%82%B2%E3%83%BC%E3%83%88-)に譲ります
    - IBM Qの[コンポーザー](https://quantumexperience.ng.bluemix.net/qx/editor)とあわせて遊ぶと楽しさ倍増かもしれません
- 量子ゲートの入り口を直感にやさしく，ということで，Q ease: と名付けました
       - コロンは，えっと，Python感です

#### こんなかんじです
<img src = https://qiita-image-store.s3.amazonaws.com/0/252893/7fe8cba2-8a19-264d-97f9-3348e33f7a8d.png>

- **ソースコードは[こちら](https://github.com/nisuikiba/Q-ease)**
- **動画は[こちら](https://drive.google.com/file/d/12rZYthJRvGT4BhC7RkKk9RTA2eaSvyDP/view?usp=sharing)**
- ブロッホ球自体が常にくるくるしていますが，これに特に意味はありません(Three.jsをいじるのが楽しくて回してしまいました)．見にくいようであれば，球自体の回転や，光源等，変更が可能ですので，コメントをお寄せください．
- PC,フルスクリーン表示推奨です

## アップデートの記録

- ~~OrbitControls.jsが原因で，スクロールができません．ウィンドウのサイズの関係で，下部が見えづらい場合は，お手数ですが，スクロールバーをご使用ください~~
       - 2019/02/18追記：修正しました．キャンバス外であればスクロールできます！
- ~~再読み込みがたまに非常に遅いです(~30秒ほど)．たぶん，無料のherokuなので，dynoが30分おきにsleepしてしまうのが原因かと(近々対応します…)．根気よく待ってあげてください🙏~~
   - 2019/02/17追記：対応しました．[Uptime Robot](https://uptimerobot.com/)というサービスを利用しました．便利！
- 2019/02/20追記：urlを若干変更(この記事内のリンクは修正済み)
- 2019/02/20追記：[Challenge Bloch!](https://qease.herokuapp.com/bloch/challenge/)と[トップページ](https://qease.herokuapp.com/bloch/index/)ができました．
    - [Challenge Bloch!](https://qease.herokuapp.com/bloch/challenge/)については，別記事にまとめようと思います．
     
## これから足したい機能
- ゲート適用するたびに，ブロッホ球の状態を数式で表したい
- 「ひとつもどるボタン」あってもいいかもしれない
- 適用したゲートを線の上に並べて，ゲート回路もお絵かきできるとか(ログも兼ねて)
- 自分でゲートを作成できてもいいかもしれない(色，回転角，回転軸，文字…)
- ~~キャンバス外はスクロールできるようにしたい…~~
    - ↑できるようになりました

こんなん足したら面白そうじゃない？とかありましたら，是非是非コメントに！
まだfind & mapで消耗してるの？

※基本的にmongooseユーザー向け記事です

データベースからユーザーのメールアドレスの配列を取り出したい・・・なんてことありますよね？
そういう時次のように書いていませんでしょうか。

```javascript
const users = await User.find().select('email')
const emails = users.map(u => u.email)
```

ユーザーの件数が多かったり持っている項目が多かったりすると結構時間かかるんですよねこれ。
そこで**`distinct`**がおすすめです。

# Model.find([condition]).distinct(name)
`distinct`を使うとダブりのない配列が返ってきます。

```javascript
const userEmails = await User.find({city: 'tokyo'}).distinct('email')
// > ['aaa@example.com', 'bbb@example.com',...]
```
```javascript
const userEmails = await User.distinct('email', {city: 'tokyo'}) // こうも書けます
// 条件が第二引数に来るのが find や update などと異なるので私はあまり好きではありません。
```
これが**めちゃくちゃ早いです**。数秒〜数十秒vs一瞬〜数秒といったレベルで違います。

`mongo shell`で直接クエリを投げるとどちらも一瞬なのでデータベース自体の処理が早くなるわけではないようです。
JSに返ってくるオブジェクトサイズが大きく異なるために速度が違うと考えられます。
（`select`をしないと`find`は速度がさらに大幅に落ちるので多分合ってると思います。）

`mongodb`で書くと多分こんな感じです。

```javascript
const userEmails = await db.collection('users').distinct('email')
```
こちらも早いのかは確かめていませんが、上記の理由が合っていれば同様に高速だと考えられます。
MySQLの文字コードを変更する方法

ProgateでRuby on Railsレッスンで、tweetappというものを作成したので、そのコピーをDockerとGithubを使いながら、開発をしています。

ちなみにRails環境は以下のページを参考に構築しました。
https://qiita.com/reflet/items/f73cac406760ee4ecc13
感謝です(^^)

しかし、新規投稿機能のところで、日本語の文字列をDBに保存できない問題に直面。

エラー文は全文は控えてなかったのですが以下のような感じで、文字コードが原因っぽい。

```
Mysql2::Error: Incorrect string value ,,,,,,
```
いろいろネットで調べて以下の方法で解決したので、メモです。


#MySQLのクライアントサーバーとMySQLサーバーの文字コードの確認・変更

```
#確認したいテーブルを選択
mysql> use DB名

#文字コードを確認
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | latin1                     |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

#以下のコマンドでUTF-8に変更
mysql> set character_set_client = utf8
mysql> set character_set_connection = utf8
mysql> set character_set_database = utf8
mysql> set character_set_results = utf8

```

「character_set_server」「character_set_system」は「docker-compose.yml」のMySQLにcommandを以下のように追加したらUTF-8に変更できました。

```
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
```

#既に作成したDBの文字コードの確認・変更

```
#確認
mysql> show create database DB名;
+----------+--------------------------------------------------------------------+
| Database | Create Database                                                    |
+----------+--------------------------------------------------------------------+
| example  | CREATE DATABASE `example` /*!40100 DEFAULT CHARACTER SET latin1 */ |
+----------+--------------------------------------------------------------------+

#変更
mysql> alter database DB名 character set utf8;
```

#既に作成したMySQLのテーブルカラムの確認・変更

```
#確認
mysql> show create table テーブル名 \G;
*************************** 1. row ***************************
       Table: posts
Create Table: CREATE TABLE `posts` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `content` text CHARACTER SET latin1,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

#変更
mysql> alter table テーブル名 modify カラム名 varchar(255) character set utf8;
```

この時点で日本語に保存できました。

いやーハマっちゃいましたw
これから、カラムを追加したり、新しいテーブルを作成するので、どうなるのでしょうか。

とりあえず進めていきます。
HTML headタグ内の基本設定

# title, discription 他
とりあえずページTOP固定で入れておきたいのが以下。 （レスポンシブ前提）

```html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1">
```

更に個々のページで個別に設定したいのが以下。 

```html:head
<title></title>
<meta name="description" content="">
```

他にも検索避けのrobotや、OGPタグ、Twitterカードなど必要に応じて。

参考にしたサイト：[サルワカ](https://saruwakakun.com/html-css/basic/meta-tag)

# favicon関連
260x260以上のpngを用意して下記サイトでGenerateするとファイル群とコードをアウトプットしてくれる。
[Favicon Generator](https://realfavicongenerator.net) の[Select your Favicon picture]から。
出力結果は例えば下記。（local確認用にファイルパスだけ相対パスに変更している）

```html:head
<link rel="apple-touch-icon" sizes="180x180" href="./apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="./favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="./favicon-16x16.png">
<link rel="manifest" href="./site.webmanifest">
<link rel="mask-icon" href="./safari-pinned-tab.svg" color="#222222">
<meta name="msapplication-TileColor" content="#222222">
<meta name="theme-color" content="#ffffff">
```

[Favicon Generator](https://realfavicongenerator.net) の[Check Favicon]で設定が足りているかチェック
それぞれの設定値など→ [参考にしたサイト](https://homepagenopro.com/html/favicon.html)
エラー1　git ssh接続　ssh-agent

・エラー文
ssh: Could not resolve hostname git: Name or service not known

・翻訳
ssh：ホスト名を解決できませんでした
git：名前またはサービスが不明

・原因
shh-agentを実行していないこと？
ssh-agentに鍵の登録をしていない？

・解決策
ssh-agentの実行
$ eval $（ssh-agent -s)

鍵の登録
ssh-add 秘密鍵の名前
Juniper vLabsチュートリアル


# 概要
Juniper vLabsというものによって手軽にJuniperデモ環境を
体験できたので軽くまとめてみる。

# 使い方
1. アカウント作成・ログイン(1営業日ほど?)
2. トポロジ選択・予約(約30分)
3. 機器にログイン(約10分)

この3ステップだけで無料かつ自由に一つのトポロジを3時間弄れます！！

# 参考
https://tekunabe.hatenablog.jp/entry/2019/01/01/juniper_vlabs
【Python】mac で matplotlib 使用時に ImportError: Python is not installed as a framework. が出る場合の対処法

## 事象

macOS で `matplotlib` を使用したプログラムを実行したところ次のようなエラーが発生しました。

```bash
$ python main.py
Traceback (most recent call last):
  File "main.py", line 3, in <module>
    import matplotlib.pyplot as plt
  File "/Users/RM/Documents/deep-learning-practice/.venv/lib/python3.7/site-packages/matplotlib/pyplot.py", line 2374, in <module>
    switch_backend(rcParams["backend"])
  File "/Users/RM/Documents/deep-learning-practice/.venv/lib/python3.7/site-packages/matplotlib/pyplot.py", line 207, in switch_backend
    backend_mod = importlib.import_module(backend_name)
  File "/Users/RM/Documents/deep-learning-practice/.venv/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "/Users/RM/Documents/deep-learning-practice/.venv/lib/python3.7/site-packages/matplotlib/backends/backend_macosx.py", line 14, in <module>
    from matplotlib.backends import _macosx
ImportError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are using (Ana)Conda please install python.app and replace the use of 'python' with 'pythonw'. See 'Working with Matplotlib on OSX' in the Matplotlib FAQ for more information.
```

## 対処法

ターミナルで次のコマンドを実行します。

```bash
sed -i -e 's/backend: TkAgg/backend: Agg/' $(python -c "import matplotlib;print(matplotlib.matplotlib_fname())")
```

## 参照

こちらの記事で解決しました。
[Pythonでmatplotlibをimportするとエラーが出る場合の対処策（Mac）](https://qiita.com/Gen6/items/78d83d117ef67e0d53c2)

## 補足

`python -c <<コマンド>>` はコマンドラインで Python を実行します。

`$()` はコマンド内でコマンドを実行します。

`sed -e "s/置換前/置換後/" 対象ファイル` は対象ファイルの対象文字列を置換して文字列を返却します。

`sed -i` で破壊的にコマンドを実行します。要するに対象を直接編集します。
Webpack4でFont-awesomeを利用する

#Webpack4を使ってFont-awesomeを利用する

通常であればCDNを使って済みますが、Webサーバーにホスティングして公開したい人も多いはずです。

ダウンロードしたFontsディレクトリやCSSなどを手動でコピーすれば使えますが、Webpackを使っていると、自動でnode_modulesディレクトリから取得してうまい具合に配置してほしいと願うものです。

以下、Font-awesome用のプラグイン等は使わずに、シンプルにFont-awesomeを利用する方法です。

---

###0.前提
NPMを利用して次のパッケージをインストール済みとします。
また、今回はFont-awesome系のファイルをJSにはバンドルせず、FontディレクトリやCSSを別ファイルにする分ける方法をとっています。

    "webpack": "^4.29.0",
    "webpack-cli": "^3.2.1",
    "@fortawesome/fontawesome-free": "^5.6.3",
    "node-sass": "^4.11.0",
    "file-loader": "^3.0.1",
    "css-loader": "^2.1.0",
    "mini-css-extract-plugin": "^0.5.0",

###1.webpack.config.jsの設定
次のように記述します。

	module: {
	    rules: [
	        {
	            // Sassファイルの読み込みとコンパイル 
	            test: /\.(sc|c|sa)ss$/, // 対象となるファイルの拡張子 
	            exclude: /node_modules/,
	            use: [
	
	                {
	                    loader: MiniCssExtractPlugin.loader
	                },
	                {
	                    loader: 'css-loader'
	                },
	                {
	                    loader: 'sass-loader',
	                    options: {
	                        outputStyle: SassOutputStyle,
	                    }
	                },
	            ],
	        },
	        {
	            test: /\.(ttf|eot|woff|woff2|svg)$/,
	            use: [{
	                loader: 'file-loader',
	                options: {
	                    name: "[name].[ext]",
	                    outputPath: './webfonts',
	                    publicPath: '../webfonts',
	                }
	            }]
	        },

	
	    ]
	},
	plugins: [
	    new MiniCssExtractPlugin({
	        // ここで設定するfilenameは出力するファイル名
	        filename: 'CSSの出力先ファイル名',
	    }),
	]

###2.WebpackのエントリーポイントにFont-awesomeのSCSSを指定
流れとしては、エントリーポイント（JSファイル）から自前のSCSSファイルを呼び出し、そこからnode_modules内のFont-awesomeを呼び出します。

自前のSCSSファイルには、次のように記載します。

	// font-awesome で使うディレクトリの場所を指定
	// 最初の~は、Node_modulesのディレクトリを指定するの同じ意味。
	$fa-font-path: '~@fortawesome/fontawesome-free/webfonts';
	
	// font-awesome
	@import "~@fortawesome/fontawesome-free/scss/brands.scss";
	@import "~@fortawesome/fontawesome-free/scss/fontawesome.scss";

最初の変数$fa-font-pathは、Font-awesome内にて利用されている変数で、フォントファイルの格納場所を指定するものです。
これを、Node_modules内のフォントを参照するように設定しています。

###3.npx webpackを実行
これで、Font-awesomeのCSSファイルがWebpack内で指定したCSS出力ディレクトリに出力されるはずです。
また、Fontファイルは、Webfontsディレクトリに出力されています。

---

##注意点
CSS-loaderのオプションで、URLをFalseにしていると、SCSS内でフォントファイル等を参照していても、フォントファイルのヒモ付が無視され、そのままURL出力されるようになります。
私は上記のオプションを設定していたため、しばらくFontファイルが出力されずにハマりました。

以上
VirtualBox の VMI の不使用部分を一括で圧縮する

VirtualBox の Guest OS 上で不使用部分を 0 で埋めてから、Host OS 上で VBoxManage.exe を使って不使用部分を圧縮することにより、Host OS 上の VMI のファイルサイズを縮小する事ができます。
ただ、UUID を調べたりなんやりで結構面倒です。そこで、私の環境では Bash on Git for Windows があったので、ここで動作する Shell Script を作成してみました。
存在する VMI をすべて一括で圧縮します。

```bash:vmi-compact.sh
#!/bin/bash
#
# Vurtula Box のドライブの 空白部分を圧縮する。
#
# Guest OS (Linux) で以下のコマンドを実行し、未使用領域を 0 で埋めてから実行
# もしも、細かくパーティションを分けていたら、それぞれのパーティション上で
# 実行が必要になる
#
# dd if=/dev/zero of=/tmp/zero bs=4k; rm /tmp/zero
#
#   bs の値はファイルシステムに依る

# 環境に合わせて実行ファイルへのパスを調整
VMAN='/c/Program Files/Oracle/VirtualBox/VBoxManage.exe'

uuids=`"${VMAN}" list hdds | sed -n 's/^UUID:[ ]*//p' | xargs`

for id in ${uuids[@]}; do
    "${VMAN}" showmediuminfo $id
    "${VMAN}" modifymedium $id --compact
    "${VMAN}" showmediuminfo $id
done

```

要は `VBoxManage list hdds` で取得した UUID で `modifymedium` を回しているだけですが。
私は、Windows PowerShell は思想が違いすぎてついて行けないので、自動化についてはやっぱり MS-Windows よりも Unixen の方が便利ですね。
デバッグするとパソコンがフリーズする

#はじめに

CTFをやっているとexeファイルをデバッグする必要が出てきます。

ソフトはいろいろありますが、以下がメジャーなところです。

- OllyDbg
- Immunity Debugger
- WinDbg
- x64dbg

基本的にOllyDbgを使ってるんですが、32bitしか対応してないので64bitのときはx64dbgを使ったり。
Immunity DebuggerとWinDbgはあんまり使ったことないです。

#何が起きてますか

今回全部に当てはまったんですが、ウィンドウが出てくるタイプのexeファイルを実行するとウィンドウが出る前くらいでパソコンがフリーズしてしまうという事件が起きました。（ウィンドウが出てこないタイプのexeは試してないのでどうなるか不明）
exeが重い処理をしているのかもしれないので、notepad.exeとかでもやってみたんですが、ウィンドウが出てこなくてフリーズする。
普通にダブルクリックで実行すれば問題なく実行できます。
しかもフリーズするとマウスポインタは動くもののクリックは効かないし、Ctrl+Alt+Deleteも効かない。つまり電源長押しするしかないという恐怖に陥ります。
パソコンのスペックが問題でしょうか？

#スペックは大丈夫ですか

ちなみにスペックは以下です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/0563f71a-6e4d-d818-72d1-d18d05d6b541.png)

デバッグするには十分でしょう。と勝手に思ってます。。。

#調べましたか

ということで調べてみましたが、なかなか見つからず。

友人に聞いてみたところたどり着きました。
[OpenFileDialogを表示するときにフリーズする不具合の解決](http://jihi4541.blog.fc2.com/blog-entry-3.html)

#何をすれば良いですか

C:\Windows\System32\drivers\cymon.sysが悪さをしているので削除する。
電子ブックリーダー等のソフトをインストールしたときに一緒にインストールされるsysファイルらしく、ブックリーダーをアンインストールすれば完了。

私は電子ブックリーダーを使用したことは1回もないんですが、一応ファイルを見てみます。
存在しています。

#何で存在していますか

プログラムの中で電子ブックリーダー的なソフトを探すと「ブックプレイスリーダー」というソフトが入ってました。
入れた覚えはありません。

検索してみるとdynabookにデフォルトで入っているそうです。。。

ちなみにサービス終了したそうな。。。
[「ブックプレイスリーダー」サービス終了のお知らせ（PDF：133KB）](https://dynabook.com/info/201812_bookplace.pdf)

#どうなりましたか

このプログラムをアンインストールしてnotepad.exeをOllyDbgで実行してみたところ、スムーズに動きました！
これでデバッグ問題も挑戦できるー。
Let'sEncryptでワイルドカード証明書の取得方法

# 概要
Certbot Version 0.22.0よりワイルドカード証明書が取得可能になりました。
それに際し、ワイルドカード証明書の所得方法を書き残すことにしました。

# 検証環境
- CentOS Linux release 7.6.1810 (Core)
- Apache/2.4.6 (CentOS)

# 取得方法
最初に`yum`で必要なパッケージをインストールします。

```
yum install -y --enablerepo=epel certbot
```

もしCertbotが入っていてバージョンが0.22.0以前の場合はアップデートしてください。

```
yum update -y certbot
```

次にワイルドカード証明書を取得していきます。
ドメイン、メールアドレスは自分の環境に合わせて変更し、実行してください。
いろいろ聞かれると思いますがすべて了承して進めてください。

```
 certbot certonly --manual --server https://acme-v02.api.letsencrypt.org/directory --preferred-challenges dns-01 -d '*.example.com' -m yourmailaddress@example.com --agree-tos --manual-public-ip-logging-ok
```

実行すると以下のような文字列が表示されると思います。
表示された後に`Press Enter to Continue`と表示されますが***まだ押さないでください。***
以下の処理が終わってから押してください。（押してしまっても、もう1度実行すれば大丈夫です）


```
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name
_acme-challenge.example.com with the following value:

[英数字の文字列]

Before continuing, verify the record is deployed.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
```

上に書いてある英数字の文字列をコピーし、DNS TXTレコードに記述します
筆者はお名前ドットコムを使用していますので[お名前ドットコム](https://www.onamae.com/domain/navi/dns_controll/input)のサイトに行き、ホスト名の部分を`_acme-challenge`、VALUEの部分を先ほどの`[英数字の文字列]`にしてください
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/339993/eedcf3b8-d9ea-7e33-cada-a058ec8c70f4.png)

入力し終わったら追加し、設定してください。
設定が終わったらお名前ドットコムから変更完了のメールが届くはずです。（5分から15分ほど待ちましょう長いときは20分くらいは待つと思います）

変更完了の通知が来たらEnterキーを押しましょう。

```
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.com-0001/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.com-0001/privkey.pem
   Your cert will expire on 2019-04-26. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
```

このような文字列が出たら成功です。

~~このあと設定していくのですがそれは後日別の記事で書くと思います。（たぶん）~~
書きました => [CentOS7でVirtualHostをSSL化する(Apache2.4)](https://qiita.com/NaaO/items/d5bc8e9ec2384a0a89b8)

設定した後にWEBブラウザで確認してみると
![キャプチerwャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/339993/523a7b06-ed29-ef9a-6ae5-8728fa12db81.png)
このように適応されています。
今回はここまでとします。
お疲れさまでした。

# 参考文献
[Let's Encrypt総合ポータル](https://free-ssl.jp/docs/acme-v2-wildcards.html)

# 最後に
初めてQiitaを投稿してみました。なにか指摘等あればコメントくださいませ
railsのキャッシュの速度を計測してみた

#初めに
cacheについて調べて実際に計測してみた

参考記事
Railsのフラグメントキャッシュについて調べてみた
https://qiita.com/suketa/items/eeae7e2196520323f694

#環境

userが1000件あってそれを読み込む

```
rails dev:cache
```

でcacheを有効にする。

users_controllerに

```ruby
def index
  @users = User.all
end 
```



viewを




```erb:index.html.erb
    <h1>Users#index</h1>
    <p>Find me in app/views/users/index.html.erb</p>
    <% @users.each do |user| %>
            <%= user.first_name %>
            <%= user.last_name %>
            <%= user.phone %>
            <%= user.address %>
    <% end %>
```


これがキャッシュを使っていない普通の状態

実行してみると

```ruby 

Completed 200 OK in 198ms (Views: 173.6ms | ActiveRecord: 11.2ms)
Completed 200 OK in 48ms (Views: 41.7ms | ActiveRecord: 2.4ms)
Completed 200 OK in 51ms (Views: 45.0ms | ActiveRecord: 2.6ms)
```

最初は200ms位でそのあとは50ms位です

次にcacheを使ってみる

まずこんな感じのコードを書いてみた


```erb:index.html.erb

    <h1>Users#index</h1>
    <p>Find me in app/views/users/index.html.erb</p>
    <% @users.each do |user| %>
        <% cache user do %>
            <%= user.first_name %>
            <%= user.last_name %>
            <%= user.phone %>
            <%= user.address %>
        <% end %>
    <% end %>
```


結果はこんな感じ

```ruby 
Completed 200 OK in 993ms (Views: 976.4ms | ActiveRecord: 4.3ms)
Completed 200 OK in 364ms (Views: 343.8ms | ActiveRecord: 15.7ms)
Completed 200 OK in 393ms (Views: 386.7ms | ActiveRecord: 2.7ms)
```

時間はめっちゃ長くなった....

このキャッシュのやり方は調べたら結構出てきたやり方だけど使いどころは考えないといけないのかも…

とくに内容が特に無く数が多くなるものに関してはあんま良くないのかな？わかんないけど…


次にこのコード

users_controllerに

```ruby
def index 
   @user_cache = User.last

   @users = User.all
end 
```


viewは



```erb:index.html.erb
<% cache(@user_cache) do  %>

    <h1>Users#index</h1>
    <p>Find me in app/views/users/index.html.erb</p>
    <% @users.each do |user| %>
            <%= user.first_name %>
            <%= user.last_name %>
            <%= user.phone %>
            <%= user.address %>
    <% end %>

<% end %>
```



これで結果は


```ruby 

Completed 200 OK in 214ms (Views: 197.8ms | ActiveRecord: 3.5ms)
Completed 200 OK in 32ms (Views: 28.2ms | ActiveRecord: 0.2ms)
Completed 200 OK in 34ms (Views: 29.5ms | ActiveRecord: 0.3ms)
```

初回は197msと遅いがそのあとは30ms以下と早くなった。


確かに二回目からの読み込みが少し早くなるけど正直cache使わないのとたいして変わらなかったのでまだあんまりcacheの良さがわからない…


多分使い方なんだろうけどとりあえずcache使えば良いってわけではなさそう

おわり:sunny:
PHP+LaravelでGoogle しごと検索の Indexing APIを呼び出す

## はじめに

Google しごと検索が[日本でもリリースされました](https://japan.googleblog.com/2019/01/shigoto-search.html)。求人情報をGoogleの検索結果に表示することができるようになります。

検索結果例
![capture1.PNG](https://qiita-image-store.s3.amazonaws.com/0/14769/3cf1db68-5ebe-4570-bcf6-866c567c2f08.png)

Googleによると、必要な手順は大まかに以下の３つになります

1. 求人情報を構造化データ(JobPosting)でマークアップ
2. Indexing APIを利用して更新／削除情報をGoogleに通知

1はGoogleの資料、[構造化データタイプの定義](https://developers.google.com/search/docs/data-types/job-posting#definitions)を参照

2のIndexing APIをPHP+Laravelから利用してみます。なお、今日時点でIndexing APIの利用は無料です。

## LaravelでGoogle しごと検索の Indexing APIを呼び出す

Google提供のクライアントライブラリをcomposerでプロジェクトに追加します。
https://github.com/googleapis/google-api-php-client

お約束。composer require

```
composer require google/apiclient:"^2.0"
```

composer.jsonにgoogle/apiclientが追加されました。

```
// （略）
  "require": {
    "php": "^7.1.3",
    "chillerlan/php-qrcode": "^2.0",
    "davejamesmiller/laravel-breadcrumbs": "5.x",
    "doctrine/dbal": "^2.5",
    "encore/laravel-admin": "1.6.*",
    "fideloper/proxy": "^4.0",
    "google/apiclient": "2.0",
// （略）
```

ライブラリインストールします

```
composer install
```

ライブラリが利用できるか確認するために、適当に呼び出してみました

```
use Google_Client;

// 略

$client = new Google_Client();
$client->setApplicationName("Client_Library_Examples");
$client->setDeveloperKey("YOUR_APP_KEY");
dd($client->getAccessToken());

=> null
```

よさそう。

続いて、
https://developers.google.com/search/apis/indexing-api/v3/prereqs?hl=ja
にあるPHPサンプルコードを貼り付けてみます
（jsonファイルはGoogle APIs コンソールから入手してconfigフォルダに置いた）

```
$client = new Google_Client();

$client->setAuthConfig('./config/ivory-totem-999999-1234567890.json');
$client->addScope('https://www.googleapis.com/auth/indexing');

$httpClient = $client->authorize();
$endpoint = 'https://indexing.googleapis.com/v3/urlNotifications:publish';

$content = '{
    "url": "https://job.e2info.co.jp/job/4611",
    "type": "URL_UPDATED"
}';

$response = $httpClient->post($endpoint, ['body' => $content]);

dd($response);

=> GuzzleHttp\Message\Response {#1000
  -reasonPhrase: "OK"
  -statusCode: 200
  -effectiveUrl: "https://indexing.googleapis.com/v3/urlNotifications:publish"
  -headers: array:11 [
    "content-type" => array:1 [
      0 => "application/json; charset=UTF-8"
    ]
    "vary" => array:3 [

```

なんと、Index送信成功しました:yum:

### 注意事項

* Google曰く、サイトマップよりIndexing APIの使用をおすすめするが、サイトマップ送信もしましょうとのこと。つまり両方やったほうがいいです（[文献](https://developers.google.com/search/docs/data-types/job-posting?hl=ja)）

### まとめ

ということで、あっという間に完成してしまいました。

* 実際に使う場合、例外処理とログ出力はちゃんとやりましょう。
* 一括送信する場合、マルチパートリクエスト（バッチ処理）を使いましょう。
    * [インデックス登録の一括リクエストを送信する](https://developers.google.com/search/apis/indexing-api/v3/using-api?hl=ja#batching)
* 割り当て制限に注意。[割り当て](https://developers.google.com/search/apis/indexing-api/v3/quota?hl=ja)

終わり
python3で再帰関数

# はじめに
私が再帰関数についてわかったことを共有します。
#　Code
``` python3:python3.6
i = 0

def sum(n):
    global i
    i = i + 1
    print(i)

    if n <= 0:
        return n
    
    result = n + sum(n - 1)
    
    # print
    print("n         : {}".format(n))
    print("n-1       : {}".format(n-1))
    print("n + (n-1) : {}".format(result))
    print("--------------")
    return result

sum(3)

```

#　解説
を実行すると

```
sum(3)の場合

couunt    : 1回
couunt    : 2回
couunt    : 3回
couunt    : 4回
n         : 1
n-1       : 0
n + (n-1) : 1
--------------
n         : 2
n-1       : 1
n + (n-1) : 3
--------------
n         : 3
n-1       : 2
n + (n-1) : 6
--------------
```
では10回なら

```
couunt    : 1回
couunt    : 2回
couunt    : 3回
couunt    : 4回
couunt    : 5回
couunt    : 6回
couunt    : 7回
couunt    : 8回
couunt    : 9回
couunt    : 10回
couunt    : 11回
n         : 1
n-1       : 0
n + (n-1) : 1
--------------
n         : 2
n-1       : 1
n + (n-1) : 3
--------------
n         : 3
n-1       : 2
n + (n-1) : 6
--------------
n         : 4
n-1       : 3
n + (n-1) : 10
--------------
n         : 5
n-1       : 4
n + (n-1) : 15
--------------
n         : 6
n-1       : 5
n + (n-1) : 21
--------------
n         : 7
n-1       : 6
n + (n-1) : 28
--------------
n         : 8
n-1       : 7
n + (n-1) : 36
--------------
n         : 9
n-1       : 8
n + (n-1) : 45
--------------
n         : 10
n-1       : 9
n + (n-1) : 55
--------------
```
になります。


3　+　<font color=red>sum(3 - 1)</font>
　　　　　|　2
　　　　<font color=red>sum(2 - 1)</font>　+　<font color=green>sum(1 - 1)</font>
　　　　　　　　　　　　　　|　１
　　　　　　　　　　　　<font color=green>sum(1-1)</font>　+　<font color=blue>sum(0-1)</font>
　　　　　　　　　　　　　　　　　　　　|　０
　　　　　　　　　　　　　　　　　　　<font color=blue>sum(0-1)</font>
　　　　　　　　　　　　　　　　　　　ifの判定がTrueになるのでnがreturnされて
　　　　　　　　　　　　　　　　　　　下のreturn resultまでは行かずに終了する。

```py3
3 + 
    (3-1 + 
          (2-1 + 
                (1-1 + 
                      (0-1))))
```
このようなイメージ

#　参考
多大に参考にさせて頂きました。

[再帰関数を理解するための最もシンプルな例](https://qiita.com/jumpyoshim/items/20e6b5e70efa466699b4)
# 終わりに
自分のイメージなので他の人が分かりやすいかは分かりませんが参考になれば幸いです。
[PHP] try-catch-finally句内のreturnについて

# 概要

[try-catch-finally句内のreturnについて - @eijenson さん](https://qiita.com/eijenson/items/7e9e112e69b37f72353c) の記事を読んで、PHPではどうなってんだろ？という素朴な疑問が湧いたので、試して見た。


# 前提環境

macOS High Sierra 10.13.6

```
PHP 7.3.0 (cli) (built: Dec  7 2018 11:06:29) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.0-dev, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.3.0, Copyright (c) 1999-2018, by Zend Technologies
```

# 結果

```php:ソースコード
<?php
class Sample {
    public function returnsample()
    {
        try {
            echo 'try!';
            throw new Exception('sample!');
            return 'try!!!';
        } catch (Exception $e) {
            echo 'catch!';
            echo $e;
            return 'catch';
        } finally {
            echo 'finally statement is executed!';
            return 'Crush the exeception';
        }

    }
}

$a = new Sample();

$sample = $a->returnsample();

// ちゃんと例外 catch してるので、これ以下の箇所について実行されるのが自然
// @sj-i さんのコメントでの指摘より
echo "\n\nsample output!\n";
echo $sample;
```


```shell:出力結果
$ php try-catch-return.php                                                                         

try!catch!Exception: sample! in /Users/oki.suguru/workspace/php/try-catch-return.php:17
Stack trace:
#0 /Users/oki.suguru/workspace/php/try-catch-return.php(33): Sample->returnsample()
#1 {main}finally statement is executed!

sample output!
Crush the exeception%
```

見事に $e の中身である $eが 握りつぶされることがわかった。
Javaと同様,PHPでもfinally句のなかで、returnすると、例外の内容が握りつぶされるようだ。

バージョンごとに何か違いがあるかどうかは未検証。
気が向いたらやることにする。 

# 以下 @sj-i さんのコメントでの指摘より追記

> 例外を catch して返り値に直して呼び出し元からエラー検知するような場合、catch からの返り値が潰され、例外発生しなくても実行される finally からの返り値が反映される。

> catch からの return がデッドコードになる (コメントより)

# じゃあ、さらにcatchを無くしたらどうなっちゃうのか @crhg さんのコメントより

```php:catchがないときの返り値
<?php
class Sample {
    public function returnsample()
    {
        try {
            echo 'try!';
            throw new Exception('sample!');
            return 'try!!!';
        } finally {
            echo 'finally statement is executed!';
            return 'Crush the exeception';
        }

    }
}

$a      = new Sample();
$sample = $a->returnsample();

echo "\n\nsample output!\n";
echo $sample;
```

```shell:出力結果
try!finally statement is executed!

sample output!
Crush the exeception
```

> 例外よりfinallyの中のreturnが勝つ。まさに例外の握りつぶし。(コメントより)
TensorFlowを使ってBitcoinの価格を予想してみた

詳細ディープラーニングの本を読んだので、勉強の題材としてBitcoinの予測を行ってみました。
https://www.amazon.co.jp/dp/B072JC21DH/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1

# 利用した技術や手法
* TensorFlow
* リカレントニューラルネットワーク
* LSTM
* Adam

# TensorFlowとは
Googleが作成した機械学習用ライブラリ 
機械学習の様々なアルゴリズムをライブラリ化してくれているので、アルゴリズムを理解していなくても機械学習のモデルを作成できる。 

# リカレントニューラルネットワークとは
時系列のデータの扱う時に利用する手法
今回の場合だと、過去のビットコインの価格から、未来の価格を予測するので、この手法が当てはまってそう

# LSTMとは
長期の過去時間から学習を進めていくと、勾配が消失してしまい学習が進まなくなるから、その対処法となる手法

# Adamとは
学習率の調整の手法
最初は大きく学習率をとって、学習が進めるにつれて学習率を小さくしてくれる


これらを使って作成したソースコードはこちら
https://github.com/unamu1229/deep_larning_bitcoin/blob/master/bitcoin.py

学習データは
https://www.blockchain.com/ja/charts/market-price
からダウンロードした、2009-01-03から2019-01-01までのビットコインの市場価格

予想結果のグラフこのような具合、y軸はドルになり、x軸は日付。
点線は学習のデータになり、実線は学習したモデルが予測したビットコインの市場価格になります。
ビットコインの価格が高騰した時の予測の市場価格と実際の市場価格に大きくズレがあります。
もっと学習の回数(epochs)を増やすことで、この辺りのズレも少なくなりそうです。

![2019-01-26 13.03.57.png](https://qiita-image-store.s3.amazonaws.com/0/72832/c8fe031f-1850-fd47-4281-0d2896528a2d.png)
初学者が独習C#をざっくり読んでみる 第6回 -制御構文-

## ぜんかいまでの記録
大体わかってきたから標準ライブラリに早くいきたい.
breakやcontinueとかいろいろのこってるらしいけれど飛ばして読みかけてしまった

## §4 制御構文(続
### 4.3 ループの制御
修了条件にかかわらずループを抜け出したい, 特定の周回だけをパスしたいときに使う構文

#### 4.3.1 break命令
ループを強制的に中断させる.　`break;`

#### 4.3.2 continue命令
現在の周回だけスキップして次のループに行く　`continue:`

どちらもifと一緒に使うのが一般的

```c#:break&continue
int i;
int sum = 0;

for(i=1; i<=100; i++)
{
    sum += i;
    if(sum > 1000)
    {
        break;
    }
}

Console.WriteLine(i);


int sum2 = 0;
for(int i=0; i<=100; i++)
{
    if(i%2 != 0)
    {
        continue;
    }
    sum2+=i;
}

Console.WriteLine(i);
```
#### 4.3.3 ループのネストとbreak/continue
ネストした構文でbreakを使った場合内側のloopのみを抜けるよ.

```c#:40までの九九
for (var i=1; i<10; i++)
{
  for(var j=1; j<10; j++)
  {
    var result = i * j;
    if(result>40)
    {
      break;
    }
  Console.Write($"{result, 2}"); // resultを最低二桁で表示
  }
}
```

### 4.4 制御命令のその他の話題
gotoとプリプロセッサ

#### 4.4.1 goto
あぁ...スパゲティのおとぉ...

ラベルとgotoを使うことで強制的にコードのhそりを他の場所に移動ができます

```c#:goto
//template

labelName:
goto labelName:

//ex.
goto THERE;
Console.WriteLine("Skipped Line");
THERE:
Console.WriteLine("DONE");
```

以下注意点

- どこへでも移動できるわけではない. 他メソッドとかループ外から内部へ移動は不可
- 可読性低い. 使うか使わないかは宗教論争

使うときは

- ネストされた中のループから一気に外のループ含めて脱出するとき
- switchで他ラベルに飛ぶとき

等が一応は考えられる.
要するに一つの構文の中で完結しようなってことだと思う

#### 4.4.2 プリプロセッサ
コンパイラーに対する命令, ディレクティブを表すもの
ファイルの文頭に宣言をする
シンボルのスコープ(?)はファイル単位

例を以下に

| ディレクティブ | 概要 |
| --- | --- |
| #define A | シンボルAを定義 |
| #undef A | シンボルAを未定義に |
| #if A...#else...#endif | シンボルAがある時, ifのコード, ない場合はelseのコードをコンパイル |
| #if A...#elif B...#elif C...#endif | ifのelse ifバージョン. コンパイラするコードのより複雑な制御 |
| #region...#endregion | コードブロックを指定 |
| #warning [message] | 警告メッセージを表示|
| #error [message] | エラーメッセージを表示|
| #line n "file" | エラー/ 警告時の行番号(n)/ファイル名(file)を固定|
| #pragma warning [disable/restore] list | listで示された警告を有効(restore)か無効(disbale)にする|


##### 条件コンパイル
\#defineと#ifを利用することでデバッグ時だけ有効なコードを定義できる

```C#:define&if
#define DEBUG

#if DEBUG
  Console.WriteLine("asdf");
#endif
```

シンボルは特定の値を持つことはできない.

##### ifディレクティブの条件式
ifのなかでは, 論理演算子が利用可能

`#if (DEBGUG && TESTED)`といった記述が可能

##### 折り畳み可能なブロック
`#region [hogehoge`]を使うことでhogehogeというメモを残したままVS上でコードを折りたためる(メソッドができるように)

---

ようやく標準ライブラリだ...Chapterもついに5まで来た. 頑張ろう
AWS活用に向けて

#どのようにAWSを使用すればいいのか
［最初にやること］(https://qiita.com/chroju/items/c7ad918d79b0288bc490)
今まではサービスの内容について学習してきましたが、今後システムを運用していくための留意点を頭に入れておこうと思い上記のブログを参考にさせて頂こうと思います。

#IAMユーザーを作成する
とりあえず一つ新しいアカウントを一つ作成してみた

#Trusted Adviserを設定する
*赤い！が出ていたので何かと調べてみるとルートアカウントのMFAが設定されていなかった

(Google Authenticator)[https://itunes.apple.com/us/app/google-authenticator/id388497605?mt=8]
をiphoneにインストールした
(2 段階認証プロセスでは、ログイン時に 2 段階の確認を求めること
スマートフォンの Google 認証システム アプリ)
IMAのセキュリティステータスのルートアカウントのMFAを有効化した

*セキュリティグループが黄色になっていた
EC2のSSHを無制限アクセスになっているためだ。

今後ベストプラクティスを身に着けるためにも、すべてのチェックへのアクセスを有効化したいため、ビジネス($100USD/月)を検討したい

#CloudTrailを設定する
CloudTrailはAWS APIへのアクセスをロギングしてくれるサービス
東京リージョンのログをとってみることにする
15万件もイベントが発生することもないだろう(無料)

#CloudWatchで利用料金を監視する

CloudWatchを使って、利用料金の監視が可能
SDLアプリコンテスト 応募してみた。

#概要

SDLアプリコンテスト、見つけたので挑戦してみる。
応募してみた。

#提出書類

提出資料は、pdf。
jsdoで、pdfを作ってみた。

http://jsdo.it/ohisama1/C6O1

#応募画像

![](http://jsrun.it/assets/A/c/X/R/AcXRY.png)

#応募動画

https://www.youtube.com/watch?v=Nrg4kg2Qw6A&t=5s

#リンク

SDLアプリコンテスト
http://sdl-contest.com/

以上。
CentOS6.10 + php7 + Composer +laravel5.7を導入

# はじめに
centos6.10にphp7とcomposerを導入したのでそのメモになります。

# php
composerを導入するにはまずphpを導入しなければいけません。まずphpをインストールします。

## remiリポジトリの導入
何もせずにyumでインストールしようとするとphp5がインストールされてしまうので、remiリポジトリを導入してphp7をインストールする準備をします

remiリポジトリの導入
[公式](http://rpms.remirepo.net/)

## remiインストール

```bash

yum install http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```

## php7.3インストール
yum list php で確認するとバージョンはphp7.3が一番新しいようだったのでphp7.3をインストール

```
yum install php --enablerepo=remi-php73
```



```
# php -v
PHP 7.3.1 (cli) (built: Jan  8 2019 19:26:20) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.1, Copyright (c) 1998-2018 Zend Technologies

```


# compoesr
## composerインストール
確か公式ページのインストール方法を簡単にした方法↓

```
# curl -sS https://getcomposer.org/installer | php
All settings correct for using Composer
Downloading...

Composer (version 1.8.0) successfully installed to: インストールパス
Use it: php composer.phar

```

## 場所を移動
```
mv composer.phar /usr/local/bin/composer
```
あとはパスを通す

# composer コマンド
## ファイル
### composer.json
* プロジェクトに必要なライブラリをここに記入していく

### composer.lock
* composerコマンドでcomposer.jsonに記載されたライブラリと、依存関係でインストールしたライブラリも記載される
* 後述するcomposer install すれば開発環境をメンバーで同じにできる
 
## composer コマンド
### comoser init
* composer.jsonが生成。laravelなどプロジェクト作成時に実行される

### composer require
* インストールしたい対象だけをインストール。
* composer.jsonを直接編集すると、インストールするためにcomposer updateを実行しなくてはいけず、インストールしたい対象だけでなくその他も一緒にアップデートされてしまう。
* よって、直接編集してインストールするということはなさそう。
 
### composer update
* composer.jsonにかかれているライブラリを全てアップデート。

### composer install
* composer.lockにかかれているライブラリをインストール。

# laraver5.7導入
## インストール
[公式](https://laravel.com/docs/5.7)

composerを使ってlaravelインストール

```
composer global require laravel/installer
```

必要なもの

```
  Problem 1
    - laravel/installer v3.0.1 requires ext-zip * -> the requested PHP extension zip is missing from your system.
    - laravel/installer v3.0.0 requires ext-zip * -> the requested PHP extension zip is missing from your system.
    - Installation request for laravel/installer ^3.0 -> satisfiable by laravel/installer[v3.0.0, v3.0.1].

```


laravelコマンドを使えるようにするために下記、グローバルのcomposerへパスを通しましょう

```
$HOME/.config/composer/vendor/bin/
```

```
# ll .config/composer/vendor/
autoload.php  composer/     laravel/      ralouphie/
bin/          guzzlehttp/   psr/          symfony/
```

## プロジェクト作成

必要なもの

```
yum install php-dom php-mbstring --enablerepo=remi-php73
```

```
laravel new プロジェクト名
```

バージョン確認。laravelではartisanを使用してマイグレーションだったりその他諸々のlaravelの機能を使用するみたい。

```
# php artisan -V
Laravel Framework 5.7.22
```

apacheを用いた場合のドキュメントルート
プロジェクト/public


# laravel
プロジェクト直下でpackage.jsonをもとにインストール

```
npm install
```

https://qiita.com/hot_study_man/items/17b4ccff931f5fc6ce50#npm-install-%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8

vuejsインストール

```
npm install vuejs -D
```

# 既存のlaravelプロジェクトのインストール
* システムにphp,composerインストール
* git clone
* プロジェクト直下でcomposer install
Atomのvim-mode-plusでインサートモード中にカーソルを移動したい

# やりたいこと
vim-mode-plus使用中にインサートモードでもカーソルを動かしたい
動かしたいとは言ったがノーマルモードに戻って、カーソル移動して再度インサートモードにはしたくない
さらにMacの十字キーは右下で遠いから手を動かしたくない
かといってctrl-f,b,u,dで移動は頭が混乱するから使いたくない

# やったこと
vim-mode-plusのkeymap.csonファイルに以下を追加する


````
'atom-text-editor.vim-mode-plus.insert-mode':
  'ctrl-h': 'vim-mode-plus:move-left'
  'ctrl-l': 'vim-mode-plus:move-right'
  'ctrl-j': 'vim-mode-plus:move-down'
  'ctrl-k': 'vim-mode-plus:move-up' 
````

### 参考にした記事
[[Atom]vim-mode-plusでESCにキーマップを割り当てる](https://qiita.com/k-kurikuri/items/e3a3e1ff6228c2650c94)
ファイルの新規作成と拡張子の変更

 - 目次:https://qiita.com/New_enpitsu_15/private/479c69897780cabd01f4

プログラムを始めるにあたってどの言語でも覚えなければならない基本操作です。

#ファイルを作ってみよう

わかる人は読み飛ばしても構いません。

###デスクトップから操作する

では、まずデスクトップ(ログインした最初の画面)上、もしくはエクスプローラー(フォルダ)上の適当なところで右クリックしてみましょう。

![2019-01-26.png](https://qiita-image-store.s3.amazonaws.com/0/283963/7930f71e-b30b-356c-db1a-bba07f4214f4.png)

私と同じような画面ではないでしょうが、
`新規作成(X) > `という文字を見つけられれば問題ありません。
”新規作成”をクリック(ホバー)し、出てきた`テキスト ドキュメント`をクリックしてみましょう。

すると、`新しいテキストドキュメント`というファイルが作成されるはずです。

![2019-01-26 (3).png](https://qiita-image-store.s3.amazonaws.com/0/283963/21209860-bb04-c447-0cef-5d8ea954ee77.png)

###コマンドプロンプトを使う

コマンドプロンプトを使う方法もありますが、ほぼ使わないので親切に解説はしません。

`echo > ファイル名`

で作成できます。が、デスクトップで作った時と同じようにダブルクリックしたらメモ帳が開く…なんてことはありません。
メモ帳を開きたいなら

`echo > ファイル名.txt`

としてやる必要があります。

#拡張子の表示と変更

プログラムを勉強しようとすると序盤に必ず出てくるのが__拡張子__です。
では、さっそく表示してみましょう。

まず、適当なフォルダをダブルクリックするか、エクスプローラーを起動しましょう。

![2019-01-26 (5).png](https://qiita-image-store.s3.amazonaws.com/0/283963/a6bfff02-51e8-4081-7c4b-0933da85eab4.png)

上のほうに、ホーム 共有 表示 と書かれたタブがあるはずなので、"表示"をクリックしましょう。
そうしたら、右上のほうに"ファイル名拡張子"という項目があると思うので、チェックボックスをクリックしてチェックを入れましょう。

![2019-01-26 (6).png](https://qiita-image-store.s3.amazonaws.com/0/283963/44ff74f1-4735-0b1a-238e-1fc2fb304e5e.png)

すると、先ほどの　`新しいテキストドキュメント` が `新しいテキストドキュメント.txt` に変わっているはずです。

![2019-01-26 (7).png](https://qiita-image-store.s3.amazonaws.com/0/283963/44143269-9040-f463-9698-5a6308a27079.png)

この、新しく出てきた`.txt`が拡張子です。

__ファイルを右クリックして、 "名前を変更" し、`.txt`の部分を`.拡張子`と書き換えることで、拡張子を変えることができます。__

試しに `.bat`もしくは`.cmd`に書き換えてみましょう。
アイコンが変わったはずです。

拡張子とは、ファイルの種類を指定するものなんですね。
Gulp関連のファイルを全てフォルダにまとめる方法

# 課題

Gulpのタスクを別ファイルに分割して、フォルダにまとめる際、gulpfile.js もフォルダに入れてしまうと `No gulpfile found` というエラーが出てしまうので、 gulpfile.js だけフォルダの外に出していました。
できれば、Gulp 関連のファイルを一つのフォルダにまるっと納めたいと思っていました。

# 解決方法

gulpfile.js という**「フォルダ」**を作り、その中に index.js ファイルを置いてあげると良い事が分かりました。
index.js がいつもの gulpfile.js として機能します。

TypeScript で書きたい場合は、拡張子を .ts にして、typescript、ts-node、@types/gulp をインストールするだけです。

```
npm i -D typescript ts-node @types/gulp
```

タスクの実行方法は通常と同様です。また、JavaScript でも TypeScript でも同じです。

```
# default タスクの実行例
npx gulp

# build タスクの実行例
npx gulp build
```

# フォルダ構成例

以下は sample プロジェクトで Gulp 関連のファイルを gulpfile.js（.ts）フォルダにまとめた例です。

```:JavaScript版
sample
└── gulpfile.js  <-- フォルダ名
　   　├── index.js  <-- 必須。gulpfile.js として機能
　   　├── tasks
　   　│   ├── clean.js
　   　│   ├── build.js
　   　│   └──　　watch.js
　   　└── constants
　    　   └── paths.js
```

```:TypeScript版
sample
└── gulpfile.ts  <-- フォルダ名
　   　├── index.ts  <-- 必須。gulpfile.ts として機能
　   　├── tasks
　   　│   ├── clean.ts
　   　│   ├── build.ts
　   　│   └──　　watch.ts
　   　└── constants
　    　   └── paths.ts
```

# 使用例

gulpfile.ts フォルダの中は、上記の構成例と少し違いますが、npm に公開したプロジェクトのリンクを載せておきます。
> [tatsuteb/StepBarStyle](https://github.com/tatsuteb/StepBarStyle)

# 参考URL

公式ドキュメントの該当箇所
> [JavaScript and Gulpfiles - Splitting a gulpfile](https://gulpjs.com/docs/en/getting-started/javascript-and-gulpfiles#transpilation)
Macのログイン画面や再起動のメッセージが英語になった場合の対処法

Macを使っていると、ある時から突然ログイン画面や再起動のメッセージやボタンが英語になってしまった。特に困っていないのでしばらく放置していたけど、気になったので対処した時のメモ。
<img width="420" alt="スクリーンショット 2019-01-26 12.14.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/317297/da301bda-d8e4-c232-c49f-c154dde4edad.png">
いろいろ調べてみたところ、この現象は私だけではなく、ちょくちょく発生しているようです。

# 対処法

1.「F4（Launchpad）」キー ＞「その他」＞「ターミナル」を起動。
<img width="114" alt="スクリーンショット 2019-01-26 12.16.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/317297/510465cc-52f1-fc87-d95b-40fd8b052963.png">

2.開いたターミナルにコマンド「sudo languagesetup」入力し実行（「return」キーを押す）。パスワード:key:を聞かれるのでMacログイン時のパスワードを入力して再度「return」キーを押す。（入力したパスワードは表示されない）
<img width="734" alt="スクリーンショット 2019-01-26 12.18.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/317297/ee8820ad-e493-1898-db3f-e501be71d905.png">

3.言語の一覧が表示されるので「6)主に日本語を使用する」を選択するため数字の「6」を入力して「return」キーを押す。
<img width="735" alt="スクリーンショット 2019-01-26 12.19.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/317297/f0f601da-0b6e-ef32-a724-51d38ca01d23.png">

4.コマンド「exit」でターミナルを終了してMacを再起動。
<img width="733" alt="スクリーンショット 2019-01-26 12.23.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/317297/6adcbdd6-d09f-10fb-83e9-cb662d415406.png">

5.もとの日本語:flag_jp:に戻った。
<img width="419" alt="スクリーンショット 2019-01-26 12.25.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/317297/54d7a0f2-ffce-1931-1edf-44abd1e11bc7.png">

おしまい。
Pythonで何ができる?

 - 前回:
 - 次回:https://qiita.com/New_enpitsu_15/items/ee95bde0858e9f77acf0
 - 目次:https://qiita.com/New_enpitsu_15/private/479c69897780cabd01f4


#Python?
Pythonとはインプリンタ型のプログラム言語…
すなわち、__さっと書いてさっと動かせる__初心者には持って来いの言語です。
言語仕様も綺麗で、
プログラムなんてしたことない！って人から
本職プログラマまで。__万人にお勧め__できる素敵な言語です。

#Pythonに向いていること

Pythonはよく"__機械学習__"の分野での活躍が取り上げられます。

が、Pythonで出来ることは機械学習だけではありません。
かの有名な"Minecraft"のModだって作ろうと思えば作れますし、
まさかの展開で有名になった"ドキドキ文芸部"だってPythonで書かれています。
__DropboxなんかもPythonなんですって！__

Pythonは"C"などと比べると実行速度は遅い(速くする方法もなくはない)
のですが、その分文法がシンプルで簡単な処理をさっと書くこともできます。なによりわかりやすい！

__拡張機能__も豊富にあるので、できないことはほぼないでしょうが、向いていることといえば

 - 機械学習
 - Webアプリケーション
 - 中小規模の開発

だと思っています。

私的に初心者にはPythonがおすすめですが、ほかにも素敵な言語がたくさんあるので
「プログラム言語」とでも調べてみてください。
どの言語を学ぶべきかなど、いろいろ参考になると思いますよ。

#参考

https://www.sejuku.net/blog/9017
https://dividable.net/python/how-python-is-useful/
Gradleで初心者が気付いて気持ちよかったことを列挙する #morning_kotlin

[もくもく朝活Kotlin](https://twitter.com/search?f=tweets&vertical=default&q=%23morning_kotlin&src=tyah) でKtorのアプリをHerokuにデプロイするにあたり、初心者なりにGradleを学んだ結果をメモしていきます。

# 全般
## ./gradlew および ./gradlew.bat は、gradleを自動的にダウンロードするスクリプトに過ぎない
当初私は、 `./gradlew` は `build.gradle` をシェルで解釈して実行するのか！すごい！と思っていました。
もちろんそんなわけはなく、内部で`./gradle/wrapper/gradle-wrapper.jar`を呼んでいます。

## タスクの実行は gradle より ./gradlew コマンドが推奨されているが普通に打つのが面倒臭い

[第62章 Gradleラッパー](http://gradle.monochromeroad.com/docs/userguide/gradle_wrapper.html)より、
`これらのファイルがプロジェクトに追加されたら、以後のビルドはこのgradlewコマンドで行ってください。 `  とあります。しかし、単にタイプ数が増えるし`gradle`ディレクトリと名前が競合してtab補完が効かないしめんどくさい...

なんかいい方法ないですか？エイリアス?

# タスク
## ユーザー定義タスクの実行時、npm run *** とは異なり run が不要
gradleコマンドのサブコマンドに直接ユーザー定義コマンド指定できます。

```
npm run hello
pipenv run hello

gradle hello # シンプル！
```

## gradleはタスクを複数引数に取れる
```
gradle hi hello

> Task :hi
Hi, world!

> Task :hello
Hello, world!

BUILD SUCCESSFUL in 1s
2 actionable tasks: 2 executed
```


## タスクはプラグインで足す。buildでさえ例外ではない
例えば、プラグインなしのgradle.buildがルート直下にある場合の`gradle tasks` は以下のようになっています。
そもそも `Build tasks` がありません。

```
------------------------------------------------------------
Tasks runnable from root project
------------------------------------------------------------

Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.
...
```

一方、Kotlinプラグイン & Applicationプラグインがある場合は以下の通り。
※他にもプラグイン入ってます。

```
------------------------------------------------------------
Tasks runnable from root project
------------------------------------------------------------

Application tasks
-----------------
run - Runs this project as a JVM application
runShadow - Runs this project as a JVM application using the shadow jar
startShadowScripts - Creates OS specific scripts to run the project as a JVM application using the shadow jar

Build tasks
-----------
assemble - Assembles the outputs of this project.
build - Assembles and tests this project.
buildDependents - Assembles and tests this project and all projects that depend on it.
buildNeeded - Assembles and tests this project and all projects it depends on.
classes - Assembles main classes.
clean - Deletes the build directory.
jar - Assembles a jar archive containing the main classes.
testClasses - Assembles test classes.

Build Setup tasks
-----------------
init - Initializes a new Gradle build.
wrapper - Generates Gradle wrapper files.
...
```

# その他
## herokuはpush時デフォルトで ./gradlew build を実行する
ちなみに、`stage` というタスクがある場合はそっちが優先みたいです。
[Deploying Gradle Apps on Heroku](https://devcenter.heroku.com/articles/deploying-gradle-apps-on-heroku)

```
remote: -----> Gradle app detected
remote: -----> Installing JDK 1.8... done
remote: -----> Building Gradle app...
remote: -----> executing ./gradlew build
remote:        > Task :discoverMainScriptsExtensions
...
```

## herokuはpush時にbuildするのであって、Procfile内でbuildを指示するとメモリ不足でタスクが失敗する。

```
# Procfile
# 間違い
web: ./gradlew build && java -server -jar ./build/libs/app-0.0.1-all.jar
# これが正しい
web: java -server -jar ./build/libs/app-0.0.1-all.jar
```

# まとめ
Gradle、全体的にとても親切ですね。勉強することも多いですけど、慣れると手放せなくなりそうな気がします。
Dependency Injection(DI)について

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257568/d125f0f0-36cd-991f-8168-815496268871.png)

こちらを読んで個人的に少し整理がつかなかった部分のまとめ

## Dependency Injection(DI)とは
直訳は依存性の注入
抽象化されたオブジェクトに、外部からオブジェクトを入れて振る舞えること。
ここでいう振る舞いとはインスタンス化できること。ともいえる。

この本では**テストデータをテスト対象のオブジェクトに入れること。**と説明している

ユニットテストにおける仕組みを理解をする上でこの本では説明されているが、DI自体は思想であり設計技法なので、デザインパターンといえる
なのでシステムのコードにDIを適用するともいえる

DI化されているとは、**ユニットテストができるようなソースの状態**といえる
DI化したとは、**具象としてだけ存在していたクラスを抽象クラス化して外部から固有情報を渡せるようにした。**といえる

## ユニットテストにおけるDIとは
**「監視、操作したいオブジェクトをモック化し、テスト対象のオブジェクトのコンストラクタを通じて送り込むこと」**

このテストオブジェクトの方を**モック**と呼ぶ

監視・操作とは、テスト対象のシステムに応じたテストデータを作成するためにテストオブジェクトを生成するので、開発を進めていく上で操作しつつ、あるべき姿のテストオブジェクトかを監視し続ける必要がある。ということ

### DIによって可能になる、テストにおいて重要なこと
1. モックをテスト対象のオブジェクトの外からから操作できる。 (つまりユニットテストができる)
2. ユニットテストの実行時に、モックに対して行われた操作をトラッキングし検証できる。(つまりデバッグできる)

テストデータ(オブジェクト)もシステムの1つと考えること

例えば、ある特定の地域をシュミレートするシステムがあったとして、その設定値として「ハワイ」、「晴れ」、「-10℃」などとすることができる
これらの地名、天気、温度などは組み合わせを変えることによってシステムの様々な仕様を検証できるので**テストオブジェクトもシステムと一体のものと考えられる重要なもの。**ということ

## エクスペクテショーンの設定とは
ユニットテストの実装において、モックオブジェクトを生成し、テスト対象オブジェクトにモックオブジェクトを渡してコンストラクタすることを**エクスペクテショーンの設定**という

難しく聞こえたが、実行結果が得られるメソッドを叩くのに必要な事前処理

つまりDI化によってユニットテストできる状態になり、ユニットテストはエクスペクテーションの設定によって最後実行結果と期待する値を比較し、テストを成立させることができる

## 書籍情報
Jonathan Rasmusson, 玉川 紘子 初めての自動テスト
https://amzn.to/2S7dbCj

## 雑感
この本を読んでいた矢先、DDDアーキテクチャを用いた現場にてDIを使ったことがあるかと問われ、「ユニットテストのこと? (なんでそんな抽象的なものに対して使うという表現するんだろう)」と思ったがある程度整理ついた気がした。フレームワークを使ってない事とも結びつき、デザインパターンを適用した事あるという意味だったと理解した。

フレームワークを使っているとあらかじめほぼ担保されている部分で、実装者の責務が比較的小さい部分をDDDの場合はある程度ベースから考えて行く必要があるという性質も感じた。

技術者の知的好奇心を刺激するという意味においてDDDは良いと思った。
プロダクトのグロース、開発効率、ビジネス的な観点からどうかというのはまた気になる。
パスの説明とcdコマンドについて

#はじめに
エンジニア1年生です。
日々の学びのメモとしてコツコツと記事を書こうと思っています。
今回はパスの説明とcdコマンドについて書いていきます。

##ルートディレクトリとは？？
ディレクトリは階層構造になっています。
その一番上に位置するディレクトリが`ルートディレクトリ`です。
ルートディレクトリは`「　/　」`で表します。

![FireShot Capture 12 - 無題のプレゼンテーション - Google スライド_ - https___docs.google.com_presentati.png](https://qiita-image-store.s3.amazonaws.com/0/272935/becbe324-d362-8ff4-76c3-25503882c0df.png)


###ホームディレクトリ
ユーザーがログインした際にいるディレクトリ

###パスとは
目的のディレクトリへの経路を示したもの

###絶対パスと相対パス

`絶対パス：ルートディレクトリから目的のディレクトリまでの経路を表します。`
【例：カレントディレクトリ（現在地）がeeeでkkkまで絶対パス】

```command
 /bbb/eee/ggg/kkk
```
このように絶対パスはカレントディレクトリに関係なくルートディレクトリからの経路を示します。

`相対パス：カレントディレクトリから目的のディレクトリまでの経路を表します。`
【例：カレントディレクトリ（現在地）がeeeでkkkまで相対パス】

```command
 ggg/kkk
```
このように相対パスはカレントディレクトリからスタートした際のパスを示します。

##ｃｄコマンドとは？？
ディレクトリを移動するためのコマンド
カレントディレクトリを移動する際に使用します。

##文法
【指定したディレクトリに移動したい】

```
ｃｄ　移動先ディレクトリへのパス
```

【カレントディレクトリの１つ上の階層に行きたい】

```
cd ..
```
`..`が一つ上の階層を示します。

【カレントディレクトリの２つ上の階層に行きたい】

```
cd ../..
```

【ホームディレクトリに移動したい】

```
cd ~
もしくは
cd
```

【ルートディレクトリに移動したい】

```
cd /
```

###上記画像のディレクトリ構造を例にcdコマンド例
【例：カレントディレクトリ（現在地）がeeeでkkkまで移動したい】

絶対パスで書くと

```
 cd　/bbb/eee/ggg/kkk
```

相対パスで書くと

```
 cd　ggg/kkk
```

以上です！
Nodejsでメモリ使用量を監視する

```memory_monitoring.js
while(1){
    /*
    ~~~~~~~処理~~~~~~~~~
    */

    let used = process.memoryUsage();
    let messages = [];
    for (let key in used) {
        messages.push(`${key}: ${Math.round(used[key] / 1024 / 1024 * 100) / 100} MB`);
    }

    //rss: プロセス全体が使っているメモリ使用量。topコマンドなどで出力させる値
    //heapTotal: プログラム中で作成したオブジェクトが使用しているメモリの総量

    console.log(new Date(), messages.join(','));
}
```