OmniAICreator/Qiita-1.07M huggingface dataset:
ゼロから始めるPython


![image.png](https://qiita-image-store.s3.amazonaws.com/0/174260/4ce2d1d0-64ba-04d5-b448-1adc1e7d88ed.png)
#はじめに
私自身、Pythonに関する事前知識がほぼない状態からスタートしています。
読者の方、またはコメントを下さる方々と一緒に使えるようになっていきたいと思いますので、宜しくお願いします。

#対象者
・Pythonを使ってみたい！
・でも何から手を付けてよいかわからない！
・トレンドだから気になる！
など、私と同じようにPythonを使ってみたい方々を対象にしています。
勿論バリバリPythonを使っている方々もご指摘や感想などコメントくださるとうれしいです。

#到達目標

何事も目標を立てて、目標に向かって進むべきです。
まず、直近の目標を掲げてみました。

・[言語処理100本ノック](http://www.cl.ecei.tohoku.ac.jp/nlp100/#ch1)をクリアする

ネットサーフィンをしていて、自然言語処理とPythonの勉強になると言われていましたので、こちらのクリアを目標としました。

#環境構築(準備)
実行するために必要なもの
・**Python**
・**コマンド画面**
（IDEは必要な方は別途用意してみてください）
を用意します。

まず、実行に必要な「**Python**」そのものですね。
Pythonはスクリプト言語で、インタプリタが必要になります。
よほどのことがない限り、**Ver.3.7**で良いと思います。

>IDE(統合開発環境)は「**PyCharm**」というものが便利だそうです。
(他、AtomやVSCodeなどもありますので好みで選んでください）

では実際に用意します。

#環境構築(導入)
初学者の私が説明しても話が二転三転してしまいそうで、きっと混乱させてしまいます・・・。
ということで、先人たちの知恵を拝借して構築しましょう。

私が参考にさせていただいたサイトは
・**Python**
　[python環境構築まとめ](https://hayataka2049.hatenablog.jp/entry/2018/06/05/034639)
　[環境構築ガイド](https://www.python.jp/install/install.html)

になります。

私自身、Linux(Ubuntu)で環境構築していますので、そっちよりの記述になってしまうかもしれません。

>(2018/09/06 更新)
Python3.7インストール参考サイトはこちら
 [UbuntuでPythonをソースからインストール](https://qiita.com/yniji/items/8e392103a6f2a4152606)
 [pyenvで3.7入れて試す](https://blog.sky-net.pw/article/115)

>※
今回、環境構築するにあたって「Anaconda」というディストリビューションでは構築しません。
理由としましては、[Pythonの環境管理ツールの良し悪し]
(http://www.zopfco.de/entry/2017/04/03/233811)の記事を拝見した際、「初学者には使わないでほしい」とありました。
勿論、Anacondaを使用するメリットもありますし、このディストリビューションが悪いものであるということではありません。
あくまで使い方を理解した上で使用するべきと考えた結果です。

#はじめましてPython！
ここまでで、Pythonを実行するまでの環境ができたかと思います。
実際にPythonを起動してみましょう。
シェル上で次のコマンドを入力してください。

```
python3.7
```

入力すると、このような文字列が表示されますね。

```
Python 3.7.0 (default, Sep  6 2018, 12:57:47)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

これでPythonが起動できました！
では、あいさつしてみましょう。

```python:入力
print('はじめまして!!!')
```


```python:出力
はじめまして!!!
```


おお！！
Pythonによって実行できましたね！
これでPythonista(@drumvicfirth様ありがとうございます）の仲間入りです。

#まとめ
ゼロから始める、と謳っていますがまだスタートになったところで本稿は終了になります。（笑）
これからPython構文だったり、特徴だったりを投稿していければと思っています。

#リンク
・[ゼロから始めるPython(2)](https://qiita.com/wind0411/items/ded09538e5adff56e454)
vue-typesでpropsの型を定義する

# 現状
vueにはpropsで型の定義はできますが、細かく設定しようとすると一々オブジェクト形式で書かないといけなくなるし、ObjectやArrayだとvalidatorを自分で定義しないと全然チェックしてくれないので結構辛くなります。
仮に書けてもオブジェクトの中身がどんなものが入っているか分かりにくく、非常に使いづらいです。

```js
export default {
  props: {
    data: {
      type: Number,
      required: true
    },
    arr: {
      type: Array,
      // 全て文字列か調べる
      validator(arr) {
        return arr.every((item) => typeof item === 'string'));
      }
    },
    obj: {
      type: Object,
      validator(obj) {
        return typeof obj.num === 'number' && typeof obj.text === 'string';
      }
    }
  }
};
```

# 解決方法
今回はvue-typesというライブラリを使って型を定義したいと思います。これはReactのprop-typesを参考にして作られたものなので、Reactをやっていた方は馴染みやすいと思います。
https://www.npmjs.com/package/vue-types

サンプルコードも作ったのでこちらも参考にしてみてください。
警告が出るとうるさかったので正しいデータを入れて最初は何も出ないようにしています。
validationチェックを確認したい場合はApp.vueでComponentに渡している値を変えてみてください。
https://codesandbox.io/s/6zj47wkmpw

## 使い方
ざっと書くとこんな感じになります。後は親から渡されるプロパティがあっていなければ警告が出されます。

```js
import VueTypes from 'vue-types';

export default {
  props: {
    // number型と定義
    data: VueTypes.number,
    // bool型で定義。必須にしたい場合は.isRequiredをつける
    flag: VueTypes.bool.isRequired,
    // arrayOfで配列の中身の型を定義できる
    arr: VueTypes.arrayOf(VueTypes.string).isRequired,
    // オブジェクトのkeyに指定はないが、valueの方はstring型にする
    obj: VueTypes.objectOf(VueTypes.string).isRequired,
    // オブジェクト型で、numとtextにそれぞれnumber型、string型と定義する
    obj2: VueTypes.shape({
      num: VueTypes.number.isRequired,
      text: VueTypes.string.isRequired
    }).isRequired,
    // 配列の中身にオブジェクトの型を設定することもできる
    arrObj: VueType.arrayOf(VueType.shape({
      num: VueType.number.isRequired,
      text: VueType.string.isRequired
    })).isRequired
  }
};
```

個人的には`.isRequired`はデフォルトでついて欲しいですが、Reactのprop-typesもこの仕様なので仕方ないですね。

## default値の設定
default値を指定した場合は`.def(~)`を実行すればいいようです。

```js
VueTypes.number.def(10);
VueTypes.object.def(() => ({ num: 10, text: 'text' }));
```

何も指定しなかった時はグローバルで定義した値をセットするようで、それが嫌な場合は上書きして使うようになります。僕はboolがtrueになっているのが嫌だったのでfalseに書き換えています。
デフォルトが何になるのかはドキュメントのほうを参照してください。

```js
import VueTypes from 'vue-types';

// default値の設定を上書きする
VueTypes.sensibleDefaults.bool = false;
```

# まとめ
vue-typesはまだそんなに人気がない感じですが、ドキュメントもしっかりしていますし、結構いいものだと思っています。少なくとも現状のVueの設定はかなりやりづらいものがあるので、型の設定をちゃんとするなら今回のようなライブラリを使うか、TypeScriptを使うかの検討をしたほうがいいと思いました。
Amazon Simple Workflow Service

Amazon Simple Workflow Service(SWF)について纏めます。

#1. SWFとは
 
- ワークフローを構築・実行するためのサービス。  
ある処理を実行し、その結果から次に実行する処理を選択する。  
この繰り返しで主にバックグラウンド系のタスクを実行する。

#2. SWFの特徴
- 特定のサーバ・クラウド・オンプレに縛られることなく構成できる。
処理を複数のサーバに分散させたり重要なデータを扱う部分のみオンプレで構成することが可能。

- 途中でユーザによる入力が可能。
例えば、次に実行する処理を自動的に選択することが難しかったり、次の処理に進むには上長の承認が必要な場合、処理を停止して入力を待つことが可能。

#3. SWFを構成する要素

![image.png](https://qiita-image-store.s3.amazonaws.com/0/162114/2616063d-e4a0-cd03-4a1d-9f43036343b5.png)
###①ワークフロースターター  
SWFを起動し、ワークフロー開始の起点となるアプリケーション。
例えば、顧客の注文を起点に動作するワークフローだと注文を受けるアプリケーションがワークフロースターターになる。
###②SWF  
ワークフロースターター、もしくはワーカー・Lambdaタスクから受け取った情報を元に決定タスクを作成し、ディサイダーへ渡す。  
ディサイダーから受け取った次に実行するタスクの情報からタスクの実行命令を出す。

* 決定タスク
ワークフローの実行状態を伝えるもの。
ワークフロー履歴等を保持する。
    * ワークフロー履歴  
    ワークフローが実行されてから発生したイベントの実行記録。  
各タスクが実行状態を持たずに決定タスクに持たせることでワークフロースターターやタスクなどのアプリケーションをステートレスに保つことが可能。

###③ディサイダー  
SWFから受け取った決定タスクを元に次に実行するタスクを決定する。
SWFを使用するユーザ自信がプログラミングして作成する必要があります。

###④タスク  
SWFから呼び出されて実行される処理。
アクティビティタスクとLambdaタスクに分類される  

* アクティビティタスク  
ユーザが作成した任意のプログラム・処理を実行するタスク。
SWFから直接実行されるのではなく、ワーカーと呼ばれるプロセス・スレッドから実行される。
ワーカーは SWFを使用するユーザ自信がプログラミングして作成する必要があります。
* Lambdaタスク
アクティビティタスクと似ているが、AWS Lambdaで作成された処理。
ワーカーは不要。

#4. 使用例
処理の流れを例を用いて整理します
今回はアクティビティタスクA、B、Cが存在し、AとBは同時に実行してAB両方の処理が終了すればCを動かす
と仮定します。

1. ワークフロースターターからSWFが呼び出される。
2. SWFは決定タスクを作成し、ディザスターに渡す。  
この時点で決定タスクが持つワークフロー履歴はABCすべて未実施。
3. ディザスターは処理ABCが未実施であることからワークフローが開始したところだと判断し、AとBを実行するようにSWFに返答します。
4. SWFはその返答を受けてAとBを実行するワーカーに命令を出します。
5. 各ワーカーそれぞれA、Bの処理を実行し始めます。
6. [Aの処理が完了]AのワーカーはSWFにその結果を返します。
7. SWFは決定タスクを作成してディザスターに渡します。
この時点でワークフロー履歴は
A：完了
B：実行中
C；未実施
となっているはずです。
8. ディザスターはBがまだ完了していないことからしばらく待機するようにSWFに返します。
9. [Bの処理が完了]Bのワーカーはその結果をSWFに返します。
10. SWFは決定タスクを作成してディザスターに渡します。
この時点でのワークフロー履歴は
A：完了
B：完了
C：未実施
となっているはずです。
11. ディザスターはABが完了していることからCの処理を実行すべきと判断し、SWFに返答します。
12. SWFはCのワーカーに処理実行の命令を出します。
13. [Cの処理が完了]CのワーカーはSWFにその結果を渡します。
14. SWFは決定タスクを作成してディザスターに渡します。
この時点でのワークフロー履歴は
A：完了
B：完了
C：完了
となっているはずです。
15. ディザスターは全ての処理が完了していることからワークフローのすべての処理が完了したことをSWFに連携します。
16. SWFが終了し、処理完了です。
「自分選び」gitでよく使うコマンド集

# よく使う(役立つ？)コマンド集を自分なりにまとめました
git便利でよく使いますが、頻繁に「あれ、これどうやるんだっけ」ってなりがちな自分がいるので、簡単にまとめてみました。
理解が間違っていたり、ミスなどありましたらご指摘の方お願いします。

|コマンド|内容|
|:-----|:---|
|git reset --hard <ハッシュ値>|ハッシュ値のcommit履歴まで戻す|
|git branch -d <ブランチ名>|ブランチ削除|
|git checkout -b <ブランチ名>|ブランチ作成してそこに移動|
|git push --delete origin <ブランチ名>|リモートのブランチを削除|
|git remote add origin <URL>|リモートリポジトリのURLをoriginとして登録する|
|git rm origin|リモートリポジトリ削除|
|git remote prune origin|リモートで削除されてるはずだけど残ってるみたいなブランチを取り払う|
|git clone -b <ブランチ名> <URL>|特定のブランチをクローン|
|git fetch origin|ローカルリポジトリをリモートリポジトリに同期|
|git checkout -b <ブランチ名> <リモートのブランチ名>|リモートのブランチをローカルに持ってくる|
fish で venv を activate する

おそらく当たり前過ぎてどこにも乗っていなかっただけだと思うけれど、自分が詰まったのでメモ

# 経緯
pycharm のプロジェクトの中にある venv をアクティベートしたかったのでググって出てきた以下のコマンド使ったらエラー出た(脳死)

```
$ source venv/bin/activate
venv/bin/activate (line 23): Unsupported use of '||'. In fish, please use 'COMMAND; or COMMAND'.
    if [ -n "${BASH-}" ] || [ -n "${ZSH_VERSION-}" ] ; then
                          ^
from sourcing file venv/bin/activate
	called on standard input

source: Error while reading file 'venv/bin/activate'
```


# そもそも fish 使ってるじゃん

fish用の activate が用意されてました。 ([ここに書いてあった](https://github.com/pypa/pipenv/issues/2340))

```
$ source venv/bin/activate.fish
```

自分から fish 使ってるんだからもう少し知識を深めなければいけないなと思いました。

完
テキストエディタの大ファイル事情【2018年Windows編】

# はじめに
昨年の今頃、[テキストエディタの大ファイル事情](https://qiita.com/asny/items/58708e063fc3bf19e3a8)というのを書きまして、それなりに反響とコメントを頂いたので1年ぶりにまた同じようなことをやってみました。
えっ今日は9月1日だって？


# 環境もろもろ
## マシン
以前と同じですヽ(´ー｀)ノ

## エディタ
昨年の時点で充分に優秀だったものと更新がなさそうなものは除いています。

- Atom 1.29.0
- Brackets 1.13
- Visual Studio Code 1.25.1
- EmEditor 18.0 (おまけ)

## 実験素材
以前と同じですヽ(´ー｀)ノ


# 結果
## Atom 1.29.0
1024MBでも苦しく、ファイルは開けるものの検索すると反応がなくなって落ちてしまいました。(･´ω`･)

## Brackets 1.13
「16MBを超えるサイズのファイルはBracketsで開くことはできません」
であっさり敗退。うーむ(・ω・)

## Visual Studio Code 1.25.1

昨年は100MBでリタイヤだったCode君ですが大幅に進歩しました。
1024MBまではそのまま開くことができ、カーソル移動や検索もストレスなくOK。
2048MB以上では

![code-largefile.PNG](https://qiita-image-store.s3.amazonaws.com/0/118352/f41e26a4-f2ed-644f-69b1-01fb011681cd.png)

という警告が出ますが、
`files.maxMemoryForLargeFilesMB` という設定項目があるんですね。
これを開きたいファイルサイズより大きくすれば開けました。

ただ16GBではファイルを開くのに10分ほど待たされてしまい、だいぶ操作ももたつくという具合に。物理メモリ以上のファイルは難しいという感じでしょうか。
8GBまではファイルを開くのにかかる時間が1GBあたり10秒くらいのオーダーで、まあ使えるなと思いました。

ちょっと気になったのが、Codeのウィンドウを閉じてまた開くだけでは設定が反映されなかったことですが、そういう仕様なんでしょうか。

## EmEditor 18.0
前回優秀だったので今回は調べていないのですが、動作がより速くなったようです。
https://jp.emeditor.com/text-editor-features/history/new-in-version-18-0/
> 一般の新機能
> - 巨大ファイルを開いている時の様々な動作を大幅に高速化しました。


# まとめ
夏バテのため小規模な調査になってしまいましたが、Codeが進歩していますね。
コーディングの現場でも~~Microsoft製とは思えない~~人気を獲得している印象ですが、大ファイル扱いの面でもかなり使えるようになりました。
[メモ] カラムの平均値を求める　avarageメソッド

##　使い方

```
モデル.average(カラム名 [, オプション])
```

### 少数第一位までの値で平均を求める

```ruby

Book.reviews.average(:content_rating).round(1)
```

他にもオプションを指定することでグルーピングや、条件に一致する行のみを対象にすることなどができるようです。
以下を参考↓↓

### 参考記事
http://railsdoc.com/references/average
Flutter for Androidでdebugとreleaseのパッケージ名を変える

アプリの開発が一通り終わるとリリースビルドで動作を確認したくなるでしょう。
そのときにデバイスに開発に使ったデバッグビルドがあると、Androidではパッケージ名でアプリを認識しているので重複することになり、インストールできません。
デバッグとリリースでパッケージ名を変えればいいのですが、毎回手書きで書き換えるのは面倒くさいのです。
しかし、build.gradleに書けば自動化することができます。

`android/app/src/build.gradle`の`buildTypes`に`debug`プロパティを追加します。
パッケージ名の最後に`.debug`、バージョン名に`d`を付けるように設定。

```gradle
buildTypes {
    debug {
        applicationIdSuffix ".debug"
        versionNameSuffix "d"
    }
}
```
IBM Cloud Object StorageにNode.jsから画像を保存するメモ

#はじめに
IBM Cloud Object Storage、略してICOS。使ってますか？
調べてもNode.jsから画像を保存するコードがなかったのでメモ。

#前提条件
ICOSのサービスをIBM Cloud上に作成いていること
ICOSのUIで「バケット」を作成していること

#ソースコード
`$ npm i ibm-cos-sdk --save`
`$ node app.js`

```js:app.js
	var AWS = require('ibm-cos-sdk');
	
	var config = {
	  endpoint: //endpoint,
	  apiKeyId: //apiKeyId,
	  ibmAuthEndpoint: //ibmAuthEndpoint,
	  serviceInstanceId: //serviceInstanceId,
	};
	var cos = new AWS.S3(config);
	
	
	var params = {
	  Bucket: //バケット名,
	  Key: //ファイル名,
	  ContentEncoding: 'base64',
	  ContentType: 'image/png',
	  ACL: 'public-read',
	  Body: //画像のbase64文字列
	};
	
	cos.putObject(params, function(err, data) {
		//Object Storageに格納したあとの処理	
		//エラーハンドリングとか。
	});
```

#備考
- configの中身はIBM Cloudで作成したICOSのサービス資格情報から取得してください。
- 保存したファイルのURLは以下です
    - http://{エンドポイント}/{バケット名}/{オブジェクト名}
    - ↑のエンドポイントはバケットを作成したときの「ロケーション」で変わります。(サービス資格情報のエンドポイントではありません)
![スクリーンショット 2018-09-01 14.35.04.png](https://qiita-image-store.s3.amazonaws.com/0/143517/d3f66d80-964e-df40-976d-9cb5c834c996.png)

    - 例えばap-geoで作成したバケットに保存した場合のエンドポイントは
    `s3.ap-geo.objectstorage.softlayer.net`です
![スクリーンショット 2018-09-01 14.36.54.png](https://qiita-image-store.s3.amazonaws.com/0/143517/b4952104-a372-6778-aef4-cbb104b24d2b.png)


- paramsのACLの値を変えるとアクセス制御できます。
    - 上記コードでは誰でも見られる状態で保存されます。ACLの値は以下です(AWSドキュメントから引用)
    - https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/acl-overview.html

| 既定 ACL  | Applies to  | ACL に追加されるアクセス許可 |
|:--|:--|:--|
| private  | バケットとオブジェクト  | 所有者は FULL_CONTROL を取得します。他のユーザーにはアクセス許可は付与されません (デフォルト)。 |
| public-read  | バケットとオブジェクト  | 所有者は FULL_CONTROL を取得します。AllUsers グループ (被付与者とは を参照) は READ アクセス許可を取得します。 |
| public-read-write  | バケットとオブジェクト  | 所有者は FULL_CONTROL を取得します。AllUsers グループは READ および WRITE アクセス許可を取得します。通常、これをバケットで付与することはお勧めしません。 |
| aws-exec-read  | バケットとオブジェクト  | 所有者は FULL_CONTROL を取得します。Amazon EC2 は、Amazon S3 から Amazon Machine Image (AMI) バンドルを GET するための READ アクセスを取得します。 |
| authenticated-read  | バケットとオブジェクト  | 所有者は FULL_CONTROL を取得します。AuthenticatedUsers グループは READ アクセス許可を取得します。 |
| bucket-owner-read  | オブジェクト  | オブジェクト所有者は FULL_CONTROL を取得します。バケット所有者は READ を取得します。バケットの作成時にこの既定 ACL を指定しても、Amazon S3 には無視されます。 |
| bucket-owner-full-control  | オブジェクト  | オブジェクト所有者とバケット所有者はオブジェクトに対する FULL_CONTROL を取得します。バケットの作成時にこの既定 ACL を指定しても、Amazon S3 には無視されます。 |
| log-delivery-write  | バケット  | LogDelivery グループはバケットに対する WRITE および READ_ACP アクセス許可を取得します。ログの詳細については、「Amazon S3 サーバーアクセスのログ記録」を参照してください。  |


#最後に
ICOSはAWS S3のドキュメントも参考になります。
ICOSでいろいろと便利なアプリが作れそうなのでこれからも使ってみようかと思います。
VMwareを使ってyumリポジトリサーバの動作検証をしてみた

自社勉強会で、RPMパッケージの管理方法について学習したので、ここに活用方法をアウトプットしておく。

まず、アプリケーションの動作環境としてユーザに向いているWebサーバ以外はセキュリティ的に外部に触れることのないローカル環境になっている場合が多い。(図1参照)
[図1]
[![Image from Gyazo](https://i.gyazo.com/de625da2e66981a912a962623d3c44ec.png)](https://gyazo.com/de625da2e66981a912a962623d3c44ec)

上記のような環境で、ローカル環境のサーバにパッチをかけたい場合、パッケージをダウンロードしたDVDやUSBをマウントして、インストールする方法やyumリポジトリサーバを作り、そこから最新のパッケージを常に取ってくる方法がある。
ここでは、yumリポジトリサーバの設定を簡易的に行い、疑似的な環境でRPMパッケージをyumでインストールする方法を載せる。(図2参照)

[図2]
[![Image from Gyazo](https://i.gyazo.com/53ee261be5b6cae749b8939f3fc5a22d.png)](https://gyazo.com/53ee261be5b6cae749b8939f3fc5a22d)


##検証環境
VMwareでCentOSを2台立ち上げて、疑似yumリポジトリサーバとDBサーバとして検証する

VMware Workstation 14 Player
　・CentOS Linux release 7.5.1804 (yumリポジトリサーバ)
　・CentOS Linux release 7.5.1804 (DBサーバ)

##１．yumリポジトリサーバの設定
###■リポジトリディレクトリの作成とrpmパッケージの格納
ApacheのHTTP通信を使い、RPMパッケージの取得を行う。以下のパッケージのインストール。

```
# yum install httpd
# yum install createrepo
```

次に検証用にRPMパッケージをダウンロードしておく。

```
# cd /var/www/html
# mkdir repo
# yum --downloadonly --downloaddir=/var/www/html/repo update
```

上記のyumオプション```--downloadonly```を使うとrpmパッケージをインストールせず、ダウンロードのみ行える。
また、```--downloaddir=```は、ディレクトリ指定を行う。指定しなかった場合は、私の環境では以下のディレクトリにダウンロードされていた。

デフォルトディレクトリ：```/var/cache/yum/x86_64/7/updates/packages```


サイトから直接ダウンロードしたい場合は、以下の「RPM Search」より、パッケージの検索をしてダウンロードすることもできる。
[RPM Search](http://rpm.pbone.net/)

###■リポジトリの作成
先ほどインストールしたcreaterepoコマンドを使用し、yumリポジトリの作成

```
# createrepo /var/www/html/repo
```

これにより、リポジトリ用に作成したrepoディレクトリに```repodata```ディレクトリが作成される。

次にリポジトリ情報の追加を行い、yumリポジトリの動作確認を行う。```/etc/yum.repos.d```に以下を追加

```YumRepo.repo
[YumRepo]
name=YumRepo
baseurl=file:///var/www/html/repo
gpgcheck=0
```

リポジトリをリフレッシュする

```
# yum clean all
```

```yum list```コマンドでYumRepoリポジトリが追加されたことを確認


##２．クライアントサーバ(DBサーバ)設定＆インストール
次にインストールするサーバの```/etc/yum.repos.d```にリポジトリの情報を追加する。以下のように新規ファイルで作成。ファイル名・タイトルは好みで設定。
※httpdはあらかじめインストールされているものとする。

```YumRepo.repo
[YumRepo]
name=YumRepo
baseurl=http://IPアドレス/repo
gpgcheck=0
```

リポジトリをリフレッシュする

```
# yum clean all
```

yumリポジトリサーバに確認用のindex.htmlを```/var/www/html/```に作成しておき、```curl```コマンドでyumリポジトリサーバとhttp通信ができることを確認する

```
# curl http://IPアドレス/index.html
```

```yum list```コマンドでYumRepoリポジトリが追加されたことを確認

実際にRPMパッケージを取得してみる

```
# yum --enablerepo=YumRepo install パッケージ名
```

リポジトリ名に```YumRepo```が表示され、インストールされたことが確認できた。

現場で構築する際は、yumリポジトリサーバが絶対に外の環境と接続された状態にならないように注意が必要。
悪意のあるユーザから変なソースの入ったrpmパッケージを配置される恐れなどがある。

##ハマったポイント
・yumリポジトリサーバのSElinuxが有効になっていた為、apacheが使えず、403エラーになっていた
・http.confのDocumentRootがyumリポジトリの取得先に指定したパスと違っていた


##参考資料
[yum を使用して、パッケージをインストールせずにダウンロードだけ行う](https://access.redhat.com/ja/solutions/395763)

[yumリポジトリサーバの構築方法](https://qiita.com/hana_shin/items/f714376d041941320290)
IntelliJ IDEA, PyCharmのCommunity版はビジネス/商用利用できる


## 結論

タイトルの通り、JetBranins社のIDEであるIntelliJ IDEAとPyCharmのCommunity版はビジネス/商用利用できます。**JetBrains自身が「IntelliJ IDEAとPyCharmのCommunity版は商用利用できる」と述べています**。

既製の商用IDEのライセンスの住み分け事例から「Community版は商用利用できない」という先入観を持つ方がいますが、IntelliJ IDEAとPyCharmのCommunity版については問題なく商用利用可能です。

> NOTE: なおAppCode, CLion, GoLand, PhpStorm, ReSharper, RubyMine, WebStorm等のJetBrains製品についてはCommunity版がありません。このため本記事の対象外となります。


## 背景

本記事は[「モダンなJava開発ガイド」](https://qiita.com/yoichiwo7/items/17190cb440ab7d253cea)の一部をベースにしたものです。「IntelliJ IDEAのCommunity版は商用利用できない」と誤解している人が意外に多いことが分かったため、別記事にすることでより多くの方々の目に留まるようにして、この誤解をできるだけ多く解くことを目的としています。

本記事にはCommunity版が商用利用可能である根拠となる情報(JetBrains自身が発信している情報)を掲載しています。会社でCommunity版を使用する場合、商用利用可否の観点で難色を示す上司もいるため、そのような場面に遭遇した時の説得材料として利用していただければと思います。

> NOTE: 「商用開発を考えるなら機能が豊富な有償版じゃないと話にならない」という観点の話ではないので注意してください。各種フレームワーク/Web/DB開発周りの豊富なIDE機能を理由に有償版を使いたい、使う必要がある人はぜひ有償版のライセンスを購入してください。
> 大学やOSS開発等の場合は無料になったり、スタートアップ企業等の場合は割引が適用されたりするため、そちらも上手に活用しましょう(詳細は[こちらのURL](https://www.jetbrains.com/idea/buy/#edition=discounts))。

## 根拠となる情報

### [IntelliJ IDEA] Ultimate/Community版の比較表にある記載 (ポップアップ表示)

https://www.jetbrains.com/idea/

IntelliJ IDEAのページ下部にはUltimate/Community版の機能比較表があり、その表の中にライセンスという項目があります。Community版には`Open-source, Apache 2.0`と記載されており、その右にある「？」マークにカーソルを合わせると以下のように`It can also used for commercial development. (商用開発にも使用できる)`という記載があります。ちなみに下図の赤線は強調するためにこちらで入れたものです。

なお、この記載は前述した「？」マークにカーソルを合わせた時にのみ表示される記載です。ブラウザでページ内検索をしてもヒットしませんし、JetBrainsのページ検索機能でもヒットしないので注意しましょう。

![idea-for-commercial.png](https://qiita-image-store.s3.amazonaws.com/0/174502/92abde02-647d-17aa-6838-30cb730e3502.png)|
|:-:|

> NOTE: ちなみに2018年9月時点では、PyCharmの機能比較表には何故かライセンス項目がないため同様のポップアップ表示はありません。ただし後述する通り、PyCharmのCommunity版も商用利用可能であるとJetBrainsが述べています。

### [IntelliJ IDEA] 公式FAQの回答

[IntelliJ IDEA Community版の公式FAQ](https://www.jetbrains.org/display/IJOS/FAQ)には下記のように「誰でもOSSまたは商用のプロダクトを作ることが可能」である旨が記載されています。

> We chose the Apache 2.0 license because it is a very open license which **lets anyone create both open source and commercial products** on top of our platform.

### [IntelliJ IDEA] コミュニティフォーラム上でのJetBraninsエンジニアの回答

また同様の疑問を持つ人に対してJetBrainsのリードテクニカルサポートエンジニアであるSerge Baranov氏が「どの規模の企業でもCommunity版を商用利用可能」である旨を[こちらで回答](https://intellij-support.jetbrains.com/hc/en-us/community/posts/115000698770-Commercial-use-IntelliJ-IDEA-Community-Edition)しています。(2017年と2018年に同様の回答をしているため、遠い過去の話ではありません)

> [Question] I can use IntelliJ community edition to develop commercial applications with in a company of any size?
> 
> [Answer] **Yes.**

### [PyCharm] 公式ブログFAQの回答

PyCharmのCommunity版については、[JetBrainsのPyCharm公式ブログ FAQ記事](https://blog.jetbrains.com/pycharm/2017/09/pycharm-community-edition-and-professional-edition-explained-licenses-and-more/)で下記のように商用可能である旨が記載されています。

> Yes, you can. **You are allowed to use PyCharm Community Edition for commercial use.**

またPyCharmのCommunity版は、IntelliJ IDEAのCommunity版と同様にApache 2.0ライセンスとなっているため、基本的にライセンスの位置づけはIntelliJ IDEAのCommunity版と同じです。
git コマンドの @ (アットマーク) って何？ > HEAD と同じ意味

## コマンド例


- `git show @`
- `git show @^^`
- `git show @~3`

上は以下と同じ。

- `git show HEAD`
- `git show HEAD^^`
- `git show HEAD~3`

## HEAD ってタイプするのが面倒じゃない？

### HEAD

- Shiftキーをあわせて5キー
- 両手を使う

### @

- 1キー
- 片手でOK

## Link

- [Qiitaに記事を書く動機は「ググりにくい記事を、ググりやすく」するためでOK - Qiita](https://qiita.com/YumaInaura/items/e83df9a45836f7b2929b)

## versions

- git version 2.8.1








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
PythonのWebアプリケーションDjango　[インストール]

# 仮想環境の構築
macにDjangoをインストールする手順を書いていきます。
まず、ディレクトリを作成し、作成したディレクトリに移動します。

```
$ mkdir sample
$ cd sample
```

そしてこの中に仮想環境を構築します。

```
$ python3 -m venv myvenv
```

上記のコードを実行したらこのようなディレクトリが作成されていると思います。
lsで確認してみましょう。

```
$ ls
myvenv
```
次にこのディレクトリに移動してDjangoをインストールします。

```
$ cd myvenv
```

Djangoをインストールする前に最新のpipをインストールする必要があります。
環境によってpipとpip3を使い分けてください。

```
$ pip3 install --upgrade pip
```

最新のpipがインストールできたら、

```
$ pip3 install django
```

で、インストール完了です！！！
UnityでgRPCアプリ(iOS, Android)をビルドできるようになった

# はじめに

2018年8月からUnity用のExperimentalパッケージが出て
Unityを介してスマフォのgRPCのアプリがビルドできるようになりました。

https://github.com/grpc/grpc/tree/master/src/csharp/experimental#unity

[MagicOnion](https://github.com/neuecc/MagicOnion)ではビルドの実績があったようですが、
素のgRPC C#パッケージはUnityに入れても
Editor上では動作しますが、iOS/Androidにビルドができませんでした。
(ビルドできても正しく動作しませんでした)

# 導入

- [こちら](https://packages.grpc.io/)のデイリービルドより、最新のBuid IDリンクを押下
![DailyBuilds.png](https://qiita-image-store.s3.amazonaws.com/0/76076/80f66199-67bd-561f-dbde-d79038d41dc8.png)

- grpc_unity_package.x.xx.x-dev.zip を押下
![grpc_unity_package_link.png](https://qiita-image-store.s3.amazonaws.com/0/76076/6c43cea1-5db5-0302-474c-c9b9a83374fc.png)

- zipファイルを解答して、Unityプロジェクトへ入れる

- Unityプロジェクトを.NET4.5対応にする
  - Edit > ProjectSettings > Player > Other Settings
  - Scripting Runtime Version を ".NET 4.x Equevalent"に設定

# ビルド

### Android

そのままでビルド可能です

### iOS

エクスポートしたXcodeプロジェクトで下記の設定が必要です。

- Enable BitcodeをNOに設定
  - Build Settings > Enable Bitcode

- zlibライブラリを追加する
  - Build Phases > Link Binary With Libraries > "+"を押下
  - "libz"で検索
  - 最新のlibz.1.2.xx.tbdを追加
  
![add_libz.png](https://qiita-image-store.s3.amazonaws.com/0/76076/57b1b7bb-fbee-e585-9840-845f99873068.png)


これでビルドがされます。
[こちら](https://github.com/muroon/GrpcTestSample/tree/master/unity-environment)でビルドしたところ、問題なくスマフォでgRPC通信を行っておりました。

まだ、Experimentalステータスですが、早く正式版になることを期待します。
【Raspberry Pi 3B/3B+】ラズパイをネットワーク接続ストレージ（NAS)として使う

#Overview
ラズパイをNASにします。

#Sambaをインストール
$ sudo apt-get install samba
$ sudo apt-get install samba-common-bin

#Sambaユーザを追加
$ sudo smbpasswd -a pi

#smb.conf編集
$ sudo nano /etc/samba/smb.conf

・末尾に追記
[Pi]
  comment = Raspberry Pi
  path = /home/pi
  guest ok = yes
  read only = no
  public = yes
  browsable = yes
  force user = pi

・Windowsからも接続する場合下記の通り書き換え
 　workgroup = WORKGROUP　→　workgroup = HOME

#Sambaを再起動
$ sudo /etc/init.d/samba restart

#Macから接続してみる
サーバへ接続　→　smb://raspberrypi
git rebaseの話

同期とrebaseの話をして書きたくなったので書きます。

# rebaseの使い所

## 開発中のcommitを良い感じにする

よくある開発フローとして

1. masterブランチからissueブランチ切る
2. issueブランチで最高の実装をする
3. プルリク送ってissueをmasterにマージしてもらう

というのがありますが、当然issueで開発してる間にmasterは同じチームの人によって更新されていきます。
なんでリモート上でマージしてもらおうとするとコンフリクトが起きる可能性があります。
コンフリクトが起きないようにローカル上でやっとく方法としては
`git merge master`
というのもあるけれど、これだとissueブランチにmerge commitを作って、プルリクしてmasterでまたmerge commitを作る、という形になってしまう。
なので
`git rebase master`
の利用が推奨される。（チームの開発方針にもよるけど）
これだと最新のmaster commitからissueブランチを切ってる形にするので、
機能追加してるという本来の意図に沿っている。
というのとcommitログを後で確認したとき見やすくなるというのもある。

### （補足） rebaseでコンフリクト起こったらどうすんのか

これ聞かれたとき知らなくてどうすんだろうな、と思ってたら普通にこのパターンに遭遇したけど、ちゃんと解決方法について英語でメッセージ出るのでそのままやれば良かったということが分かりました。

とりあえずrebase前に戻すときは
`git rebase --abort`

修正してissueブランチ内のcommitに組み込むときは
1. コンフリクトしたファイルを良い感じに修正する。
2. `git add <修正したファイル名>`
3. `git rebase --continue`
4. コンフリクト無くなるまで1-3を繰り返す。

## 昔のcommitを改変する

`git rebase -i HEAD~<改変したい直近のcommit数>`

これはかなり自由度が高く、便利なコマンドです。
（危険性もあるけれど）

例えば直前の２つのcommitをまとめて、メッセージ修正したいとき
`git rebase -i HEAD~2`
と叩いたときテキストエディタで以下のような表示が出ます。

```
pick 0000001 first commit # 2つ前のcommit
pick 0000002 last commit # 1つ前のcommit
<中略>
```

これをこう修正。
`squash`（もしくは`s`）で直前のcommitとまとめるという意味

```
pick 0000001 first commit
squash 0000002 last commit
<中略>
```

保存するとまた別のテキストをエディタで開きます。

```
# This is a combination of 2 commits.
# The first commit's message is:

first commit

# This is the 2nd commit message:

last commit
<中略>
```

これをこう修正

```
new commit
```

で保存する。このときのcommitメッセージも自由に書けるので修正可能。
ここで`git log`してみるとcommitが修正されていることが確認できるはず。

ただあんまり過去のcommitを変えてリモートにpushしたりするとやばいことなる可能性があるので、くれぐれも気をつけましょう。
VIVEコントローラを強制再起動する方法

# 導入
ある日突然VIVEコントローラが以下のような症状に陥った。
そこで以下の方法を試したところ起動に成功した。
あまり知られていない(?)方法かと思うのでここで共有する。

# 症状
- VIVEコントローラが起動しない
- システムボタンを押しても反応しない
- SteamVR側から認識されない

# 方法
VIVEコントローラとPCをケーブルで接続した状態で以下のボタンを同時に5秒間押し続ける
1. トリガー
2. メニュー(トラックパッドの上のボタン)
3. トラックパッド
4. グリップ

VIVEコントローラが起動すれば成功。

# 引用元
https://twentynext.com/how-to-fix-htc-vive-controller-not-connected-error-controller-issues/
（自分が）やりたい（だけの）ハンズオン一覧

## 自分のスキルを増やしたい
自分がやりたいハンズオン資料がとっ散らかってきたのでオンライン上にまとめることにしました

自分が終了したハンズオンを公開したらまたいいのかな？
やってみた感想とか。
別途ページ作るといいのかもしれないと思いました。

自分のやる気も上がるし('ω')ノ
実績にもなるし（？）

##google extension

## heroku　twitterbot

https://jp.heroku.com/ruby

https://qiita.com/motoso/items/da93faeea8dba9260e2b


## IOT 
・[Wio LTEとAWSを連携させ、IoTサービスを開発する](https://iot.kyoto/integration_case/2018/07/13/3739/)

・[LoRaWANハンズオン](https://github.com/soracom/handson/wiki/LoRaWAN%E3%83%8F%E3%83%B3%E3%82%BA%E3%82%AA%E3%83%B3)

・[nefry](https://nefry.studio/)

## xamarin
・[PrismAndMoqHansOn/01.HandsOn-Overview.md at master · jxug/PrismAndMoqHansOn · GitHub](https://github.com/jxug/PrismAndMoqHansOn/blob/master/docs/01.HandsOn-Overview.md)

・[ブログや連載記事など、Xamarin の情報を掲載しているサイトを纏めました。](http://jxug.org/links.html)

・[xamarin-dev-doc/hands-on at master · chomado/xamarin-dev-doc · GitHub](https://github.com/chomado/xamarin-dev-doc/tree/master/hands-on)

・[GitHub - ytabuchi/XamarinHOL: Xamarin ハンズオン用のレポジトリ＆ドキュメントです。](https://github.com/ytabuchi/XamarinHOL)

・[GitHub - TomohiroSuzuki128/XamiOSHandsOn01](https://github.com/TomohiroSuzuki128/XamiOSHandsOn01)

## rails
・[Rails Girls - Japanese](http://railsgirls.jp/)

## golang
・[「Vue.js + Go言語 + PAY.JP 」でクレジットカード決済できるWEBアプリケーション実装ハンズオン](https://qiita.com/po3rin/items/9638eab0a6a70faca86e)

## firebase
[Firebaseの始め方](https://qiita.com/kohashi/items/43ea22f61ade45972881)

## cordova
・[Cordova をインストールして Android で動作する apk をビルドするまで | Lonely Mobiler](https://loumo.jp/wp/archive/20151221120056/)(http://www.atmarkit.co.jp/ait/articles/1603/15/news042.html)

## react
・未定

## lambda  azure function   Google Cloud Function
・未定　（IOTがらみであり）
pythonでepochにタイムゾーン情報をつける


epoch->UTC->JSTの順で変換します。

# 手順

```timezoneconvert.py
import pytz
from datetime import datetime
# 定数を定義(1535763600 = September 1, 2018 1:00:00 AM UTC)
EPOCH = 1535763600
# timezoneを定義
UTC = pytz.timezone('UTC')
JST = pytz.timezone('Asia/Tokyo')
# epoch timeの読み込み
utc_time_naive = datetime.utcfromtimestamp(EPOCH)
# epoch timeにUTCのタイムゾーン情報を付与
utc_time_aware = UTC.localize(utc_time_naive)
# JSTのタイムゾーンへ変換
jst_time_aware = utc_time_aware.astimezone(JST)
```



# Note
- 利用する環境がJSTであれば
`jst_time_naive = datetime.fromtimestamp(EPOCH)`
とすればJSTのnaive timeが取得できます。


- timezoneを'Asia/Tokyo'にしても、下記のように時間が19分ずれる場合があるので注意してください

```
>>> jp_old=datetime(1887, 9, 1, 1, 0)
>>> JP.localize(jp_old)
datetime.datetime(1887, 9, 1, 1, 0, tzinfo=<DstTzInfo 'Asia/Tokyo' LMT+9:19:00 STD>)
```

- 他地域のtimezone名称に関しては[こちら](https://www.iana.org/time-zones)を参考にしてください。
【iOS Carthage】Carthage Buildしたら怒られた話し。

# はじめに

Cartfileに従ってライブラリをインストールしようと`carthage update`を実行したところ、
プロジェクトフォルダの`Carthage/Checkouts`にはgithubからクローンしてきたプロジェクトが入ったが、`Carthage/Build`にバイナリが入らなかったため、`carthage build`を実行して`Checkouts`からバイナリを生成しようとしたら怒られた。

```
$ carthage build
*** xcodebuild output can be found in /var/folders/1p/j83p750s5vg4h2h1f6j_l8yc0000gn/T/carthage-xcodebuild.dVzwMj.log
A shell task (/usr/bin/xcrun xcodebuild -project /Users/rin/Documents/Dev/Swift/PRX/prx-ios-beta/Carthage/Checkouts/Result/Result.xcodeproj CODE_SIGNING_REQUIRED=NO CODE_SIGN_IDENTITY= CARTHAGE=YES -list) failed with exit code 72:
xcrun: error: unable to find utility "xcodebuild", not a developer tool or in PATH
```

# 解決までの道のり

エラー内容でググると見つかった[こちらの記事](https://qiita.com/Atsushi_/items/40b204d6ff576eef86b9)の「手順②」に従いXcodeの環境設定上からCommand Line Toolsのバージョンを選択してもなぜか反映されなかった。
<img width="801" alt="スクリーンショット 2018-09-01 12.42.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/151720/84a39c2e-acfd-65af-e67e-3df89343bbe5.png">

困っていると、選択欄のすぐ下に2行くらいで「`xcode-select`コマンドを使ってコマンドラインからでも変更できるぜ」的なことが書かれているのに気づき、早々に`code-select`でググる。そして下記の記事を参考に

- [xcode-selectによるデベロッパディレクトリ管理](https://qiita.com/gooichi/items/017cf84ec52726ccd785)
- [Command Line Toolsを切り替える方法](https://sutepulu.com/how-to-switch-command-line-tools/)

パスを確認してみると、`/Library/Developer/CommandLineTools/`にインストールされているCommand Line Toolsに向いていたので、

```
$ xcode-select --print-path
/Library/Developer/CommandLineTools
```

これをXcodeと一緒にインストールされているCommand Line Toolsに向けると、

```
$ sudo xcode-select --switch /Applications/Xcode.app
$ xcode-select --print-path
/Applications/Xcode.app/Contents/Developer
```

下記の画像のように、Xcodeの環境設定上から選択したCommand Line Toolsのバージョンが反映されるようになりました。
<img width="798" alt="スクリーンショット 2018-09-01 13.01.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/151720/4ecd9b20-7933-58e7-2701-50471e913df7.png">

再度`carthage build`を実行すると無事に通った！よかった。

```
$ carthage build
*** xcodebuild output can be found in /var/folders/1p/j83p750s5vg4h2h1f6j_l8yc0000gn/T/carthage-xcodebuild.qlR0Em.log
*** Building scheme "Result-tvOS" in Result.xcodeproj
*** Building scheme "Result-iOS" in Result.xcodeproj
*** Building scheme "Result-Mac" in Result.xcodeproj
*** Building scheme "Result-watchOS" in Result.xcodeproj
*** Building scheme "APIKit" in APIKit.xcworkspace
```
Chef WrokStationからssh踏み台経由でのChef Serverへの接続

#問題

Chef の Server/WorkStation/Node 構成では、WrokStation や Node から Server に https 接続が必要。
この https 接続を ssh ポートフォワーディングにより対応する設定例。


#前提

ローカルのrootユーザーから踏み台サーバにssh接続可能
ローカルの127.0.0.1:443が使用されていない

#環境

ローカル(Chef WorkStation)
vagrant  bento/centos-7  201807.12.0  CentOS Linux release 7.5.1804 (Core) 
Chef Development Kit Version: 3.1.0

ssh踏台サーバの先にChefサーバ


#対応

##sshポートフォワーディング(ローカルフォワード)

sshポートフォワーディング(ローカルフォワード)により、ローカルのhttps(127.0.0.1:443)への接続を、ssh踏台経由で、Chef Serverの443(https)に接続する。

```bash

$ sudo ssh -f -N -L 443:<踏台サーバからアクセス可能なChefServerアドレス>:443 <踏台サーバーのユーザ>@<踏台サーバのアドレス>
```

1023番以下の特権ポートに対するフォワーディングの為、root権限が必要。
必要に応じて-o StrictHostKeyChecking=no、もしくは多段sshの場合、~/.ssh/configなどで各段に StrictHostKeyChecking noを付与。

##Chefサーバのホスト名をローカルアドレスに対応させる
```bash
$ sudo 'echo 127.0.0.1 <Chef Serverのhost名> >> /etc/hosts'
```

##knife.rb
```ruby:chef-repo/.chef/knife.rb
node_name       '<Chef User>'
client_key      '<Chef User>.pem'
chef_server_url 'https://<Chef Serverのhost名>/organizations/<Chef Organization>'
cookbook_path   ["cookbooks"]
...
```
\<Chef Serverのhost名>箇所に、127.0.0.1や127.0.0.1に対応させた他の値を指定した場合、動作が確認できていない。
最後に:nnnnといった様にポートを指定した場合、動作が確認できていない。




#注意
若干無理な設定を行なっているので、使用環境で実現可能かは十分に考慮/検証が必要。

- ローカルの特権ポートからのフォワーディング
- 127.0.0.1にChefサーバーのhost名を割り振る
三角形の座標を求めてみた

中学生の数学です。三角形は以下の３つの条件で一意に決まります。

    1. 三辺の長さ
    2. 二辺の長さとその間の角度
    3. 一辺の長さとその両端の角度
 
それぞれの場合の三角形の座標出してプログラムで描画します。ついでに面積を出してみます。但し、余弦定理は使わないことにします。（何となく頭の体操です。）

## 三辺の長さが同じ
三角形、ABC において、以図のようにそれぞれの辺の長さをa, b, c と定義します。点Ａを原点（0,0) に置きます。点Ｂの座標は (c,0)です。

![三角形.jpg](https://qiita-image-store.s3.amazonaws.com/0/58417/d8a44f8c-ed63-f6ce-c652-8ee8a77201ba.jpeg)

点Ｃの座標を(x,y) とすると、a, b の長さがわかっていますので、点Ｃは点Ａから距離bの円の上に、点Ｃは点Ｃから距離aの円の上にあります。よって、以下の式が成り立ちます。

$$x^2 + y^2 = b^2 \tag{1}$$$$(x-c)^2 + y^2 = a^2 \tag{2}$$

(1)から

$$y^2 = b^2 - x^2\tag{3}$$

(2)式に代入して、

$$(x-c)^2 + b^2 - x^2 = a^2$$

よって、

$$x = \frac{c^2+b^2-a^2}{2c}\tag{4}$$

(3)式に代入して

$$y^2 = b^2-(\frac{c^2+b^2-a^2}{2c})^2$$$$
y^2 =  \[b-(\frac{c^2+b^2-a^2}{2c})\] \;\; \[b+(\frac{c^2+b^2-a^2}{2c})\]$$$$
y^2 =  - \frac{((b-c)^2-a^2)\;((b+c)^2-a^2)}{4c^2}$$

$$\therefore
y = \pm \frac{\sqrt{-((b-c)^2-a^2)\;((b+c)^2-a^2)}}{2c}\tag{5}$$

面積Sは、(5)式のうち正の値に底辺の長さ c を乗じて 1/2 にすればよいので

$$ S=\frac{\sqrt{-((b-c)^2-a^2)\;((b+c)^2-a^2)}}{4} \tag{6}$$

となります。（もっときれいになるのかなー）

## 二辺の長さとその間の角度
三角形、ABC において、以図のようにそれぞれの辺の長さをb, c、その間の角度をθと定義します。点Ａを原点（0,0) に置きます。点Ｂの座標は (c,0)です。

![三角形2.jpg](https://qiita-image-store.s3.amazonaws.com/0/58417/ca1c977a-2050-deb0-2a99-1751622775f7.jpeg)

点Ｃの座標を(x,y) とすると、点Ｃの座標(x, y)は

$$ (x, y) = (b\;cos(\theta), b\;sin(\theta)) \tag{7}$$

面積 S は

$$ S = \frac{c\;b\;sin(\theta)}{2} \tag{8}$$

## 一辺の長さとその両端の角度

三角形、ABC において、以図のように底辺の長さをc、その間の両端の角度をθ、φと定義します。点Ａを原点（0,0) に置きます。点Ｂの座標は (c,0)です。

![三角形3.jpg](https://qiita-image-store.s3.amazonaws.com/0/58417/efd58dc4-e7b8-4940-b7fe-6bbfbccba6bb.jpeg)


点Ｃの座標を(x,y) とすると、点Ｃの座標(x, y)は以下の２式の交点となります。

$$ y = tan(\theta)\;x \tag{8}$$$$
y = - tan(\phi)\;(x-c) \tag{9}$$

(8)式、(9)式より

$$
tan(\theta)\;x = - tan(\phi)\;(x-c)
$$$$\therefore
x= \frac{c\;tan(\phi)}{tan(\theta)+tan(\phi)} \tag{10}
$$

(10)式を(8)式に代入
$$y = \frac{c\;tan(\theta)tan(\phi)}{tan(\theta)+tan(\phi)} \tag{11} $$

面積 Sは

$$ S = \frac{c^2\;tan(\theta)tan(\phi)}{2(tan(\theta)+tan(\phi))}  \tag{12}$$

となります。
Unity 2018で標準アセットを使用する

最近、Unityを勉強し始めました。超初心者的内容ですが、少しだけハマったので、ご参考までに書きます。

#開発環境
- Windows 10
- Unity Ver 2018.2.6f1 Personal

#今回の問題
参考にしている書籍「UnityによるARゲーム開発」（オライリー・ジャパン）で、標準アセットの「Cameras」、「Characters」、「CrossPlatformInput」をインポートしろと書いてあるんですが、「Assets」→「Import Package」をクリックしても、「Custom Package」しか表示されません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222292/273f7f9d-c345-2e2b-b70f-fddb27603b6f.png)

「ImportPackage（StandardAssets）が無い時の対処」
http://tsubakit1.hateblo.jp/entry/2015/06/26/232958
ということで、再度Unityのインストーラーを立ち上げますが、StandardAssetsの項目自体ありません。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222292/daa6e903-03b7-56ba-461c-b9e8a914ac4e.png)

#解決策
調べてみるとAssets Storeからも標準アセットはインポートできるようなので、Assets Storeを利用することにしました。
「Window」→「General」→「Asset Store」で「Standard Assets」で検索すると一番上に出てくるのでそれを「download」してから「import」します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/222292/fbff2b39-9edf-8c0a-241f-53d87e2090c6.png)

こうすると、「必要ないアセットまでプロジェクトにインポートしてしまうんだけど、いいんだろうか？」と思ったんですが、手元にあった「Unity 2018入門」（SB Creative）を開くと、p21のインストーラーの画面に「Standard Assets」の項目はなく、p221ではAssets Storeからインポートするように書いてあるので、そのように仕様が変わったんでしょうね。
（ググらず最初からこれを見ればよかった…）

なお、この本には、「Standard Assetsは新しいバージョンのリリースが予定されています（2018年8月現在）」とありました。
Android で Firebase が自動収集する Analytics イベントにユーザー ID を含めてみた件

# 方法

[`FirebaseAnalytics`](https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics) の [`setUserId`](https://firebase.google.com/docs/reference/android/com/google/firebase/analytics/FirebaseAnalytics.html#setUserId(java.lang.String)) でユーザー ID を付加します。

## サンプル

``` Kotlin
FirebaseAnalytics.getInstance(context).setUserId("1234567890")
```

または

```kotlin
import com.google.firebase.analytics.ktx.analytics
import com.google.firebase.ktx.Firebase
```

```kotlin
Firebase.analytics.setUserId("1234567890")
```

### 結果

[Firebase コンソール](https://console.firebase.google.com/)の StreamView や [DebugView](https://firebase.google.com/docs/analytics/debugview) で user_id が追加されていることを確認できました。

<img width="556" alt="スクリーンショット 2018-09-01 11.36.49 2.png" src="https://qiita-image-store.s3.amazonaws.com/0/6881/59ab150c-2ff0-6af3-2643-4953e98df6d6.png">
CocoaPodsでインストールしたがエラーがでまくる

こんにちは。あさってから新学期が始まるhokuseiです。
現実逃避のためにswiftでiOS アプリを作り始めました。
作ろうと思っているのはchromeでオフラインの時に遊べる恐竜のアレです。
知らない人は無限に時間を溶かせるので今すぐやりましょう。

Ease inのアニメーションを使いたかったので[SpriteKitEasingSwift](https://github.com/craiggrummitt/SpriteKitEasingSwift SpriteKitEasingSwift)というモジュールをCocoaPodsを使ってインストールしました。
今まで使ったことなかったので[本家のサイト](http://cocoapods.org cocoa pods)に従ってライブラリをインストールしましたが...

>Cannot load underlying module for SpriteKitEasingSwift

のエラーが！

調べると[このブログ](http://programming-practice.hateblo.jp/entry/2017/08/30/082348)に解法が載っていました。クリーンして（⌘+⇧+K）、
>No Such Module SpriteKitEasingSwift

にめげずそのまま一度ビルド（⌘+B）すると、無事！エラーが消えて補完が効くようになります。

CocoaPodの導入記事はたくさんあったのにこのエラーについての記事は少なかったので書きました。世に平穏のあらん事を。
scala 2.13で追加された最高にイケてるpipeメソッドの紹介

## 問題

```scala
def superCalculate(): Int = 42
def hyperCalculate(i: Int): Int = i * i
def formatCutely(i: Int): String = "♡♡♡♡♡ " + i + " ♡♡♡♡♡"

Some(formatCutely(hyperCalculate(superCalculate())))
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
```

ここが非常にわかりづらい。どういう意味でわかりづらいかというと処理順番と表記順番が逆である点だ。

処理順番は

1. superCalculate
2. hyperCalculate
3. formatCutely
4. Some

であるにも関わらず、コードを読むときは

1. Some
2. formatCutely
3. hyperCalculate
4. superCalculate

の順番で読むことになる。これはコーダーの思考に余計な負荷を掛け、設計や名前などのより重要な要素へ割く注意力を削る。またコードを読む方にとっても非常に理解しづらくなる。

この読みづらさを緩和するため、以下のように中間変数への割り当てを行うこともよくある。

```scala
val superResult = superCalculate()
val hyperResult = hyperCalculate(superResult)
val formattedString = formatCutely(hyperResult)
Some(formattedString)
```

しかしこのテクニックも問題が多い。

1. 無駄に変数が増えることでスコープ内からアクセスできる変数が増えてコードの複雑性が増す
2. ごく短期間しか使わない変数のために適切な名前をつける必要がある
3. 行数が増えて見かけの複雑性が増加する

## 解決方法

scala 2.13で追加される(予定の)pipeメソッド[^1]を使う。
これを使えば先程のコードがこう書ける。

```scala
import scala.util.chaining._

superCalculate().pipe(hyperCalculate).pipe(formatCutely).pipe(Some.apply)
```

これにより処理順番と表記順番を一致させることができた。

※ scala 2.12なら拙作ながら2.13のpipe実装をバックポートしたライブラリがあるのでこちらを使う([bigwheel/util\-backports](https://github.com/bigwheel/util-backports))。

[^1]: [Adds tap and pipe methods \(available via \`import scala\.util\.chaining\.\_\`\) by eed3si9n · Pull Request \#7007 · scala/scala](https://github.com/scala/scala/pull/7007)

## 蛇足

他の言語ではこのpipeの役割を果たす関数に`|>`のシンボル演算子を割り当てることが多いが、scalaではシンボル演算子を公式に割り当てることはしないと判断されている。詳細は[^1]のPR参照。
jQueryのhtml()とtext()の処理速度の速さについて

自分の勉強用のメモ。

業務でjQueryを使用しているのですが、html()とtext()の処理速度が１秒ぐらい違います。

実際に計測してみました。

```index.html
<!DOCTYPE html>
<html>

<head>
  <meta charset="UTF-8">
  <script src="https://code.jquery.com/jquery-1.12.4.js" integrity="sha256-Qw82+bXyGq6MydymqBxNPYTaUXXq7c8v3CwiYwLLNXU=" crossorigin="anonymous"></script>
</head>

<body>
  <script>
    // はてなブログの記事をJSONで取得
    $.ajax({
      type: 'GET',
      url: 'http://hatenablog.com/oembed?url="http://blog.hatenablog.com/entry/2018/07/17/130000"&format=json',
      dataType: 'json',
    }).done(function (data) {
      var timer1 = $('.timer1'); // 要素を取得
      console.time('timer1'); // 計測開始
      timer1.text(data.author_name); // ブラウザに書き込み
      console.timeEnd('timer1'); // 計測終了
      var timer2 = $('.timer2'); // 要素を取得
      console.time('timer2'); // 計測開始
      timer2.html(data.author_name); //ブラウザに書き込み
      console.timeEnd('timer2'); //計測終了 
    });
  </script>
  <div class="timer1"></div>
  <div class="timer2"></div>
</body>
</html>
```

結果以下の通りになりました。
![スクリーンショット 2018-09-01 11.33.24.png](https://qiita-image-store.s3.amazonaws.com/0/127391/ea54663c-ec3b-2540-9d3a-a8572d3dc825.png)

理由は以下の通り.

- text()の場合

>指定した要素が持つテキストノードを結合したものを返す。返される文字列は、条件に一致する全ての要素が子孫にいたるまで持っているテキストを結合したものになる。
この関数は、HTMLでもXMLでも動作する。
出典：[jQuery日本語リファレンス](http://semooh.jp/jquery/api/attributes/text/_/)

- html()の場合

>指定した要素のHTMLに指定値をセットする。
この関数はXMLでは動作しないが、XHTMLでは有効。
出典：[jQuery日本語リファレンス](http://semooh.jp/jquery/api/attributes/html/val/)

処理する要素が多ければ、処理速度も違うってことですね。
gitでリモートのブランチをローカルへ持ってくる

他の人が作成したブランチを自分のローカルへ落としたいことがあると思います。

そのような時は以下のコマンドで実現できるという記事がたくさん見られます。

```
git checkout -b new-branch origin/new-branch
```

ただ、これはローカルリポジトリのリモート追跡ブランチにリモートリポジトリにあるものがあるということが前提です。

上記コマンドが失敗する場合はまず、リモートリポジトリにあるものをローカルリポジトリに持ってきてください。

```
git fetch
```
してください。

リモートのブランチをローカルへ持ってくるスムーズな手順としては、

```
git fetch
git checkout -b new-branch origin/new-branch
```
となります。
久しぶりに大量のCSSを書いたら楽勝だった話

すごく久しぶりに大量のCSSを書きましたので、思ったところまとめてみました。

## 今回しない話

- `CSS in JS`
- `Scoped CSS`

今回するのは、全部がグローバルに突っ込まれる、オールドファッションなCSSの話です。

## 再利用性の高いコンポーネントとは何か？

せっかく久しぶりに書いたので、再利用性を __極限まで__ 高くするための方法を真剣に考えてみました。

## 結論

子要素をほとんど持たないコンポーネントほど、再利用性が __異常に__ 高い。

たとえば、一般的な事例としてですが、ボタン用のクラスは __100%__ 再利用できます。

```sass
// button.sass
.button

    &--action
        color: white
        background-color: $green

    &--caution
        color: white
        background-color: $red
```

利用シーンとしては、 

```html
<a class="button button--action">OK</a>
```

 みたいに、再利用性は __100%__ です。

### 逆も同様にする

だとしたら、同様にリンク用のクラスも作れば、 __最高の__ の再利用性になるのでは？

こんな感じで。

```sass
// link.sass
.link

    &--facebook-icon,
    &--twitter-icon
        display: block
        box-sizing: border-box
        padding-top: 100%
        height: 100%
        overflow: hidden
        background-repeat: no-repeat
        background-position: center
        background-size: contain

    &--facebook-icon
        background-image: url('icon-facebook.png')

    &--twitter-icon
        background-image: url('icon-twitter.png')
```

利用シーンとしては、

```html
<li class="...">
    <a class="link link--facebook-icon" href="#">Share</a>
</li>
<li class="...">
    <a class="link link--twitter-icon" href="#">Tweet</a>
</li>
```

みたいにして、実際の幅と高さは親要素側で定義して使います。

こちらも、再利用性 __100%__ になりました。

### さらに発展させる

`a` や `button` 要素で上手くいったのなら、同様に、 `figure` や `dl` や `ul` でも上手く行くのでは？

こんな感じ。


```sass
// figure.sass
.figure

    &--widescreen
        position: relative
        padding-top: 56.25%
        height: 0

    &--widescreen &__image
        position: absolute
        top: 0
        left: 0
        width: 100%
```

利用シーンはこんな感じ。

```html
<figure class="figure figure--widescreen">
    <img class="figure__image" src="" alt="">
</figure>
```

下は `ul` の場合。

``` sass
// list.sass
.list

    &--some-list > &__item
        ...
```

利用シーンはこんな感じ。

```html
<ul class="list list--some-list">
    <li class="list__item">
    <li>
</ul>
```

## やってみて分かったこと

- コンポーネントの中身が小さければ小さいほど、 __非常に__ 再利用性が高い
- コンポーネントの総数が今までよりも __圧倒的に__ 減った
- デザイン変更が続いても、モデファイアの修正（またはコンポーネントの取り換え）だけで済むので、 __全然__ 疲れない
- 各コンポーネントのマークアップ構造を考える必要が __全く__ ない（HTMLの仕様通りにすればいいだけ）
- マジで __楽__ だった

### 課題に思ったところ

- 子セレクタ `>` を利用禁止にしようと思ったけど、入れ子になり得るコンポーネントだと、

```sass
.B

    &--M > &__E
        ...
```

を

```sass
.B

    &--M__E
        ...
```

みたいにする必要があって、今回は見送った。

## その他の期待値はクリアしたか？

一般的に言われているCSS設計の期待値として、以下の項目がありますが、

- 予測しやすい
- 再利用しやすい
- 保守しやすい
- 拡張しやすい

今回、コンポーネントの大きさを極限まで（要素のレベルまで）下げることで、「再利用性」と「拡張性」については __完全に__ クリアしました。

「予測可能性」と「保守性」についても同様だと思われますが、これらは第三者による評価が必要なので、興味のある方にお譲りしたいと思います。

## まとめ

> コンポーネントの粒度は、HTMLのセマンティクスと同じレベルまで下げると、再利用性が極限まで高まる

### おしまい

最後まで読んでいただき、ありがとうございました。
Julia1.0で学ぶ数理統計学（②正規分布と、描画...）

#Juliaで標準正規分布
今回は、統計学の基本のキの正規分布関係。先人のエントリーに学んで淡々とやっていく。なるべく、juliaらしさを活かした書き方を追求したい。
- 参考 mWsoftさんの[標準正規分布](http://www.mwsoft.jp/programming/equation/standard_normal_dist.html)など　#３年半くらい前のjuliaエントリー

標準正規分布は、教科書的には

```math
①　f(x) = \frac {1} { \sqrt {2 \pi} } \exp(- \frac {x^2} {2})
```
なのだろう。

今回は、juliaで書きやすいように

```math
②　f(x) = \frac {exp(- \frac {x^2} {2})} { \sqrt {2 \pi} } 
```
と変形して、
さらに、

```math
③　\left\{
\begin{array}{ll}
fo(x) = - \frac   {x^2} {2} \\
f(x) = \frac {exp(fo(x))} { \sqrt {2 \pi} }
\end{array}
\right.
```


と分離して、途中の数値を確認できるようにしておく。

juliaで③を書くと



```.py
#標準正規分布
fo(x) = -x^2 / 2
f(x) = exp(fo(x)) / √(2π)
```
と書ける。

juliaの演算順位から

```.py
julia> √(2π) < √2π
true
```
であることに注意しておこう。演算順位が自明でない時には、かっこをつけておくことにする。

さて、fo,fのそれぞれの値を、確認しておこう。

```std1.jl
#標準正規分布の函数fを定義
fo(x) = -x^2 / 2
f(x) = exp(fo(x)) / √(2π)

#プリント関数（副作用あり)
P(g,n) = let 
    println("函数名:" , g)
    result = [g(x) for x in -n:n] # 内包表記
    println(result)
end

P(fo, 4)
P(f, 4)
```

...オレオレjulia用語で恐縮だが、副作用がない数学的なfunctionを函数、副作用あるFUNCTIONを関数と呼ぶことにする。また、pythonと概ね同じリスト内包表記を用いている。

実行結果:

> julia.exe std.jl
函数名:fo
[-8.0, -4.5, -2.0, -0.5, 0.0, -0.5, -2.0, -4.5, -8.0]
函数名:f
[0.00013383, 0.00443185, 0.053991, 0.241971, 0.398942, 0.241971, 0.053991, 0.00443185, 0.00013383]

0のときが最大値を取り、y軸に線対称な標準正規分布が表現されているようだ。
函数名をそのままprintできるのはいいね。




# グラフを描く

なぜかREPLでしか動かなかった。
導入したバッケージへのパスを切ることができていないのかな。
描画関係は環境依存だろうし、気が向いたら調査することとしたい。

Pkg.add("Plots")
としてインストール． その後、
Pkg.add("GR")
とする。

```.jl
julia> using Plots

julia> gr()
Plots.GRBackend()

julia> plot(f)
```
描画結果:

![std.PNG](https://qiita-image-store.s3.amazonaws.com/0/16455/95931df8-67cf-9bb7-03f8-f250acc9d2a5.png)

windows環境にQt周りの環境が構築されるらしい。

# 『現代数理統計学の基礎』の世界へ

この調子で、いろいろな確率分布をjuliaで書いていきたい。
羅針盤とするのは、新し目な教科書である『現代数理統計学の基礎』（共立出版，2017）。

書籍中の演習問題と回答を以下に公開してくれいるらしいので、演習問題周りを重視で。
https://sites.google.com/site/ktatsuya77/xian-dai
Elixir入門やってみた

CSGAdventCalendarの21日目です.今回はElixirという言語について書いてみようと思います.

#Elixir(エリクサー)とは?

最近,自分のTwitterのTLにElixirという言語の情報がよく流れるようになりまして,曰くwhile文がないとか使いやすいだとか流れてくるので,まあ興味を惹かれましてやってみようかなあと思ってやって見ました.

そんで,ElixirというのはWiki曰く,

>Elixir (エリクサー) は並行処理の機能や関数型といった特徴を持つ、Erlangの仮想マシン (BEAM) 上で動作するコンピュータプログラミング言語である。

とのことである.

ほう…Erlangですか…聞いたことないですねえ()
ということでまたまたWikiから引用しますと

>Erlang（アーラン）は、コンピュータにおいて汎用的な用途に使うことができる並行処理指向のプログラミング言語および実行環境。

並行処理指向プログラミングですか…Pythonでいうasyncioみたいなもんなのかな？ (詳しくはわからないけど)

まあ並行処理が必要なものには重宝されるんだろうなあとは思います.WhatsAppっていうのに使われてるってのが有名らしいです.

#Elixir入門やってみた

さて,じゃあ早速Elixirやろっかーと思って[Elixir School](https://elixirschool.com/ja/)ってところで勉強し始めたんですけど…

**難　し　く　な　い　…　？**

一つ一つの文法はさして難しいわけではないと思うんですが,それらを組み合わせて何かするっていうビジョンがあまり思いつかないんですよね.PythonとかJavaやり始めたときはわりかしパット思い付きでも動くものは書けたんですが,Elixirに関してはあまりかける気がしないんですよね…

まあそんな事はさておき,本当に最初らへんの導入になりますが入門をやっていきましょう.

基本的に先ほど紹介したElixir Schoolに沿ってやって行きます.

では早速導入の仕方からですが,筆者の環境はMacなので,Macの導入の仕方で行きます.

巷ではDockerなどを使ってインストールするらしいですが,自分はDockerが良くわからず結局,Homebrewの方でインストールしました.

`$ berw update`
`$ brew install elixir`

これでErlang環境と一緒にElixirがインストールされます.

では早速Elixirには対話型シェルが存在するのでそれを呼び出しましょう.

`$ iex`

これだけで,対話型シェルが起動します.

```
Erlang/OTP 21 [erts-10.0.5] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe] [dtrace]

Interactive Elixir (1.7.3) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
```

こんな感じで起動するかと思います.
起動したらElixir Schoolに書いてあることを実際に入力して行って動くかどうか確認しましょう.

iex自体を終了したい場合は,Ctrl+cを二回実行しましょう.そうすればiexは終了します.
また,何かの入力ミスをしてしまった場合は`#iex:break`と入力すれば,入力内容がキャンセルされます.

では,簡単にですが基本的に使うことになるだろうものを紹介していきます.

##表示系

まずは,Hello World実行したいですよね,新しい言語やり始めるときには.
で,ElixirでのHello Worldするためにはiexでは
`IO.puts "Hello World"`
と実行してやればHello Worldが出力されると思います.

もう一つはファイルを作ってやってみましょう.

まず,注意があってElixrはPythonのようにコンパイルしなくても実行できるんですが,コンパイルをして実行することもできるんです.その際にはそれぞれのファイルの拡張子が若干異なっており、コンパイルをせずに実行する場合の拡張子は
`hoge.exs`
コンパイルをする場合の拡張子は
`hoge.ex`
となるようです.

今回は`.exs`のファイルを作ろうと思います.

では早速ファイルはこんな感じです.

```Test.exs

defmodule HelloWorld do   
    def hello do
        IO.puts "Hello World"
    end   
end
HelloWorld.hello
```

実行するときは`$ elixir Test.exs`で実行します.

ちょっとした解説を入れると

```hoge.exs
defmodule Hoge do 
#javaでいうpublic class Hogeみたいなもの.
#Hogeの部分の最初の頭文字は大文字でないとErrorでます.
    def foo do #ここは頭文字が小文字でもいい.
        #何らかの処理.
    end
end   
Hoge.foo #クラス名.関数名で関数を実行させる.
```

という感じです.

また省略法もあり,関数に関して内部処理が１行ですむ場合などでは

```huga.exs
defmodule Fuga do
    def hoge, do: IO.puts "Hi"
end
Fuga.hoge
```

とこのような感じで,1行で示すことも可能です.

##制御系
とりあえずif文と,ループについて.

ifはどの言語でも同じような感じで,Elixirもほぼ変わらないです.

```if.exs
#(省略)
if a == 1 do
    #何かしらの処理
else
    #...
end
```
という感じです.

さて問題はループでループに関してElixirにはwhile文が用意されてないので,再帰的に呼び出すこととなります.

```loop.exs

defmodule Loop do
    def loop(0), do: IO.puts "終わり"

    def loop(times) do
        IO.puts "残り#{times}回"
        loop(times - 1)
    end
end
Loop.loop(3)
#出力結果
# 残り3回
# 残り2回
# 残り1回
# 終わり
```

このような感じですね.なんでwhile文ないのかは分かんないです()

#最後に
というわけで,入門のさらっとした部分に触れましたがいかがだったでしょうか?
自分もよくわかっていない部分もあるので,正確に伝えれているかわかりませんが参考になったらありがたいです.
この後自分は,Elixir使ってWebスクレイピングやってみようと思います.それではまたﾊﾞｲﾊﾞｲ

#参考資料
[Elixir School](https://elixirschool.com/ja/)
[Elixir 基礎文法最速マスター](https://qiita.com/niku/items/729ece76d78057b58271)
dracut-initqueue timeout って？

#はじめに
OSが起動しなかった場合のトラブルシューティング
今回は起動時にinitramfsからエラーが出力された場合の対処方法です。
実施環境はESXi6.5のネステッド環境に、ゲストOSとしてCentOS7.5をインストールしています。ファームウェアはEFIで実施していますので、BIOSを使用している環境で試す場合はご注意ください。

#現象
以下のメッセージが出力し、OSが起動しない。

```
dracut-initqueue[xxx]: Warning: dracut-initqueue timeout 
Warning: /dev/xxxxx/xxxx does not exist
```

/(ルート)をマウントする前にメモリ上に展開するinitramfsで問題が発生した場合に出力するメッセージです。

実際の出力例
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/612b1820-37b6-f58d-66a6-58e3cc05091b.png)

#エラー出力原因
原因としては以下が考えられます。

１．マウントするファイルシステムのパス指定が誤っている
２．マウントするために必要なドライバが不足、または誤っている
３．ファイルシステムに接続するための物理的な経路に問題がある



#対応方法
エラー時にDracut Emergency Shellで表示可能な`/run/initramfs/rdsosreport.txt`を確認して原因を特定するのが正道と思いますが、特定方法が整理できていません。。。
そこでいくつかの原因パターンと対応方法を紹介します。

##１．GRUBのファイルシステム指定に誤り
GRUBのlinuxefi[^1]でrootのファイルシステムを指定する箇所に誤りがある。
以下のように誤ったパスを探しに行き、エラーとなります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/acfa875a-62bc-0482-7d53-f6a900f4c9ef.png)


この場合、レスキューモードで起動後、/boot配下のgrub.confを調査し、記載されたファイルシステムの指定に誤りが無いかを確認します。

誤った例
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269326/a1fbb82e-fdde-5aed-cfd7-51dfe76cddf4.png)

誤りがあった場合は正しく修正を行ってください。[^2]

[^1]: BIOSだと項目名が`linux`となります。
[^2]: `/etc/default/grub`を修正後、`grub2-mkconfig`コマンドでgrub.confファイルを再生成します。

##２．initramfsイメージ生成時の問題
例えば以下のようにinitramfsイメージ生成時にカーネルの指定を誤ってしまった場合です。
`dracut -f initramfs-[カーネルのバージョン].img [誤ったカーネル名]`

誤った例

```
[root@localhost]# dracut -f initramfs-3.10.0-862.el7.x86_64.img 3.141592
Kernel version 3.141592 has no module directory /lib/modules/3.141592
[root@localhost]#
```

この場合、initramfsからモジュールが呼び出せず、エラーとなってしまいます。
対応方法としては、レスキューモードで起動後、`dracut`で正しいカーネルのバージョンを指定しなおす必要があります。

`dracut -f initramfs-[カーネルのバージョン].img [カーネルのバージョン]`

正しい例

```
[root@localhost]# dracut -f initramfs-3.10.0-862.el7.x86_64.img 3.10.0-862.el7.x86_64
```

##３．ドライバの問題
発生原因として一番多く、問題の切り分けに苦慮するパターンです。
インストールしたドライバに問題があったり、異なる機器用のドライバを誤って適用してしまった場合などに発生します。

対応方法としては問題となっているドライバを特定し、正しいドライバをインストールすることになりますが、その切り分けが難しいのですよね。。。
このあたりは調査不足なので整理できたら記事にしたいと思います。


#あとがき
今回は、私の把握している範囲での対処方法を紹介しました。
他にも切り分け方法や対応方法がありましたらご意見頂けますと嬉しいです。


以上