OmniAICreator/Qiita-1.07M huggingface dataset:
OrientDB 2.2.x スタートアップ Mac 編

# インストール

```shell
$ brew install orientdb
==> /usr/local/Cellar/orientdb/2.2.29/bin/orientdb stop
==> /usr/local/Cellar/orientdb/2.2.29/bin/orientdb start
==> /usr/local/Cellar/orientdb/2.2.29/bin/orientdb stop
==> Caveats
The OrientDB root password was set to 'orientdb'. To reset it:
  https://orientdb.com/docs/2.2/Server-Security.html#restoring-the-servers-user-root

To have launchd start orientdb now and restart at login:
  brew services start orientdb
Or, if you don't want/need a background service you can just run:
  orientdb start
==> Summary
  /usr/local/Cellar/orientdb/2.2.29: 237 files, 72.6MB, built in 9 seconds
$ brew install java
```

# 構築
```shell
$ brew services start orientdb
$ orientdb start
Starting OrientDB server daemon...
```

以下のURLにアクセスできればインストール＆起動完了
http://localhost:2480/studio/index.html#/

# テーブル作成

画面から適当に！

# コンソールでの接続方法

## ローカルで接続する場合

+ restore がローカルでの接続しか対応していないため記載
+ server が立ち上がっていると接続出来ないのでserver は停止する必要がある

```shell
$ orientdb stop
$ orientdb-console
orientdb> connect plocal:/usr/local/var/db/orientdb/Master admin admin

Disconnecting from the database [null]...OK
Connecting to database [plocal:/usr/local/var/db/orientdb/Master] with user 'admin'...OK
```

## リモートでの接続

```shell
$ orientdb-console
orientdb> connect remote:localhost/Master admin admin

Connecting to database [remote:localhost/Master] with user 'admin'...OK
orientdb {db=Master}>
```

# ダンプデータの投入

```shell
$ orientdb-console
orientdb> connect plocal:/usr/local/var/db/orientdb/Master admin admin
orientdb {db=Master}> restore database ./MdmGraphDb_20180228_03.zip
```
CodeStar Railsテンプレート初期設定方法

テンプレートから立ち上げて、 Rails 5.1にアップデートするまで。
初期設定をして、 RubyMineで開発をします。

RubyMineでやります。

プロジェクト作成

code commitへのログイン情報を　IAM　ユーザー選択　

認証情報タブ　[![Screenshot from Gyazo](https://gyazo.com/800182b512b075e60db16c40d05b24f9/raw)](https://gyazo.com/800182b512b075e60db16c40d05b24f9)

[![Screenshot from Gyazo](https://gyazo.com/9e95da0e2e5b8fe7d2c9d89243959a1f/raw)](https://gyazo.com/9e95da0e2e5b8fe7d2c9d89243959a1f)

AWS CodeCommit の HTTPS Git 認証情報を落としてきて設定

複数のAWSアカウントを作っている人は、　ローカルマシンの　~/.ssh　でホストごとにアクセスキーを切り替える設定を行う。

git clone

自分は Source tree　でやってるので、 ID PASS を聞かれたら、AWS CodeCommit の HTTPS Git 認証情報を入力。

gem install bundle

gemfileを
gem 'rails', '5.1'
gem 'jbuilder'
gem 'listen'

bundle update

bundle exec rake secret

作った文字列をここの

[![環境変数に追加1](https://www.evernote.com/shard/s169/sh/a587c6d2-772b-461b-8b6e-9083f2e2afa0/f1690c874053a855/res/e842fa60-741e-423c-b52e-36b1e2edfe6b/skitch.png?resizeSmall&width=832)](https://www.evernote.com/l/AKmlh8bSdytGG4tukIPy4q-g8WkMh0BTqFU)

[![環境変数に追加](https://gyazo.com/478be1a5bfc5a589f4f4f442bc0ce87e/raw)](https://gyazo.com/478be1a5bfc5a589f4f4f442bc0ce87e)

https://www.evernote.com/l/AKnlXbOxRXFMjYBHez8_fyWJtZy1k5wiSL8
プロジェクトのSDKは標準でついていないのでプロジェクトに含まれていないRubyMineのSDKを選択

.gitignore　を適当に作る

rubymineのでブレイクポイントを止めながらデバッグできる。

https://qiita.com/kikunantoka/items/dd22cf51071b93ba5b62
あとはこれでパスワードを管理しておけば問題なしかな。
position: absoluteで浮かせた要素を背面に表示する方法

`position: absolute;`で浮かせた要素は、通常は前面に表示されます。

`static`には`z-inde`の指定はできないので、この重なりを背面に移動したい場合は、`absolute`にした要素に対して、`z-index: -1;`を指定することで可能となります。
また、`-1`でなければならない理由はなく、指定可能な負の値であればよいです。

追記）
全面に表示したいものに`relative`を指定できる場合は指定して、`z-index`で調整した方が簡単です。
ただ、`relative`を指定することで基準が変更されてしまう場合は、こちらの方法を試していただければと思います。
Callback型のライブラリを使いつつPromiseをreturnしたい

タイトルのまんまの話。非同期処理には、コールバック型とPromise型がある。Promise型の方は関数呼び出し側にPromiseを返すので制御がしやすい一方、コールバック側は、関数呼び出し側に返すものがないので制御が難しい（コトが多い）。最近の潮流は Promise/async-await な感じなので、自作する関数はPromise型にするのがよいのだが、使うライブラリにはコールバックのものが多い。つまり、コールバック型のライブラリを自作の関数内で利用し、Promiseを返すという実装パターンは非常に多いのでここで一旦整理しようと思う。

# 選択肢#01: promisify

Nodeのutilライブラリに、promisifyというユーティリティ関数がある。これは、コールバック型のAPIをPromise型のAPIに変更してくれるという優れものである。ただし、promisifyを使うためには、コールバックの第一引数がerrであるようなものである必要がある。多くのライブラリではこのような実装になっているので使える場面は多いが、使えるかどうかの注意は常にしておくべきだ。

```js
async function myFunction(){
  const pFunc = promisify(callbackTypedFunc)
  const data = await pFunc()
  ... do something ...
  return someValue
}
```


# 選択肢#02: 自作

自分でPromiseをnewしてコールバックの中でPromiseをresolve/rejectするようにコールバック関数を作成しよう。

```js
async function myFunction() {
  ... do something ...
  const callOne = await new Promise((res,rej)=>{
    callbackTypedFunc(arg, (err,data)=> {
      ... do something ....
      res(someValue) // or rej(someValue)
    })
  })
  const callTwo = await new Promise((res,rej)=>{
    callbackTypedFunc(arg, (err,data)=> {
      ... do something ....
      res(someValue) // or rej(someValue)
    })
  })
  ... do something ...
  return someValue
}
```

## まとめ
コールバックの方が役立つケースもあるけどやっぱりPromiseだよね。
CloudWatch EventsのみでEC2を計画停止する

# 概要
開発用のEC2インスタンスを、夜間や週末は停止させ平日の朝に起動したい場合、lambdaとCloudWatch Eventsを使って、自動停止/起動させるという方法がありますよね。

※「EC2 lambda 停止」でQiitaを検索すると色々でてきます。
https://qiita.com/search?utf8=%E2%9C%93&sort=rel&q=EC2+lambda+%E5%81%9C%E6%AD%A2

私もこの方法でインスタンスを自動停止/起動させてましたが、自動停止については、AWSマネジメントコンソール画面でポチポチと設定するだけで実現出来るようになってたので、備忘録として設定方法を残しておきます。(ついでに自動起動もCloudWatch Eventsのみで出来るようになれば楽チンですが…！)

# 設定手順

今回は、日本時間の毎晩22時に対象のEC2インスタンスを停止したい場合を想定して設定します。
AWSマネジメントコンソールの CloudWatch＞イベント＞ルール の画面を開き「ルールの作成」をクリックします。

|![スクリーンショット 2018-03-14 11.50.46.png](https://qiita-image-store.s3.amazonaws.com/0/128331/396c7265-4f63-a5fd-99cb-de9656f7e143.png)|
|:-:|


## イベントソース設定
イベントソースについて、以下のように設定していきます。

|![スクリーンショット 2018-03-14 12.08.55.png](https://qiita-image-store.s3.amazonaws.com/0/128331/73a59479-7a87-584c-805c-c7a8cf366ceb.png)|
|:-:|


イベントパターンorスケジュール：スケジュールを選択
一定の速度orCron式：Cron式を選択し、 `0 13 * * ? *` とCron式を入力。

ここで1点注意ですが、Cron式のタイムゾーンはグリニッジ標準時(GMT)で解釈されます。
日本時間(JST)の設定をGMTに変換して入力する必要があります。(日本時間の22時は、GMTだと13時ですね)

## ターゲット設定
ターゲットを設定していきます。

|![スクリーンショット 2018-03-14 11.55.46.png](https://qiita-image-store.s3.amazonaws.com/0/128331/f6ed2aab-61e1-59d9-ae94-ada212359452.png)|
|:-:|


プルダウンで「EC2 StopInscances API 呼び出し」を選択し、インスタンスIDを設定します。
「この特定のリソースに対して新しいロールを作成する」を選択すると、対象インスタンスに対して、"ec2:RebootInstances", "ec2:StopInstances", "ec2:TerminateInstances"の3つのポリシーが紐付けられたロールが、CloudWatch Eventsのルール作成時に同時作成されます。

また「ターゲットの追加」で複数のアクションが設定可能です。
例えば、他のインスタンスIDの「EC2 StopInscances API 呼び出し」アクション追加で、複数インスタンスの自動停止が可能です。

## ルールの定義
「設定の詳細」ボタンクリックで、ルールの定義画面に進み、ルールの名前・説明・状態を設定します。
最後に「ルールの作成」ボタンクリックで設定完了です。

|![スクリーンショット 2018-03-14 12.10.20.png](https://qiita-image-store.s3.amazonaws.com/0/128331/34a0c480-0978-4349-2041-7f4d158108d0.png)|
|:-:|

## 補足
設定したルールが正しく動作しているかについて、対象のインスタンスの状態を確認する方法もありますが、
CloudWatchメトリクスでも動作状況を確認できます。(ルール名で検索するとでてきます)

# おわりに

AWSは、今までできなかったこと・実現するにはちょっと工夫が必要だったことが、気付けばマネジメントコンソールからサクッとできる様になってたりするので、こまめにチェックしていこうと思います！
Pythonでベイズ線形回帰を実装してみた

#ベイズ線形回帰の目的
前回の記事（[ベイズ線形回帰](https://qiita.com/majo/items/9b84a1d7b16dc66a036a)）でベイズ線形回帰の概略をざっくりまとめたのだが、今回は実際にその過程をPythonで実装してみたのでこれまたざっくりまとめてみようと思う。
線形回帰の目的というのが、入力**x**に対して出力**y**が
$$y=x^Tw+\epsilon$$
という形でモデリングされるという仮定に基づき、新たな入力に対応する尤もらしい出力を返せるようなwを推定したいというものだ。
ここで自分が一つ勘違いしてたことがあった。
線形回帰というものは今まで入力**x**に対して線形だと思っていたのだが正しくはパラメータ**w**に対して線形だということを最近知った。
つまり入力**x**に基底関数を噛ませて非線形にしても、**w**の一次線形和（この言い方で合ってる？）であれば線形回帰と呼ぶのだろう。
この**w**の値を直接求めるのが普通の線形回帰、一方のベイズ線形回帰は**w**が従う確率分布を推定する。そのために訓練データが得られる前の**w**の事前分布を$N(0,\Sigma_p)$定め、そこから訓練データが得られた後の事後確率を求める。
その結果
$$w|y,X \ \\~ N\left(\frac{1}{\sigma_n^2}\left(\frac{1}{\sigma_n^2}XX^T+\Sigma_p^{-1} \right)Xy,\frac{1}{\sigma_n^2}XX^T+\Sigma_p^{-1} \right)$$
$\sigma_n^2$はノイズの分散である。
また今回は基底関数としてガウス関数を用いた。ガウス関数の式は以下の通りである。
$$\Phi(x) = exp\left(-\frac{(x - s)^2}{2s^2} \right)$$

#コード
```python
import numpy as np
import matplotlib.pyplot as plt

X = np.array([0.02, 0.12, 0.19, 0.27, 0.42, 0.51, 0.64, 0.84, 0.88, 0.99])
y = np.array([0.05, 0.87, 0.94, 0.92, 0.54, -0.11, -0.78, -0.79, -0.89, -0.04])

#基底関数 ガウス関数
def phi(x):
    #ガウス関数のバンド幅
    s = 0.1
    return np.append(1,np.exp(-(x - np.arange(0,1+s,s))**2/(2 * s * s)))

PhiX = np.array([phi(x) for x in X])

#1/sigma_n^2 = alpha
alpha = 9.0
#Sigma_p^-1 = beta * I
beta = 0.1

#p
A = alpha * np.dot(PhiX.T,PhiX) + beta * np.identity(PhiX.shape[1])
w_bar = alpha * np.dot(np.dot(np.linalg.inv(A),PhiX.T),y)

xlist = np.arange(0,1,0.01)
ylist = [np.dot(w_bar,phi(x)) for x in xlist]
#予測分布の分散
s_2 = [1.0/alpha + np.dot(np.dot(phi(x),np.linalg.inv(A)),phi(x).T) for x in xlist]

s = np.sqrt(s_2)
predict_upper = ylist + s
predict_lower = ylist - s
plt.plot(xlist,ylist)
plt.plot(X,y,'o')
plt.fill_between(xlist,predict_upper,predict_lower,facecolor='r',alpha=0.2)
plt.show()
```
#実行結果
![BLR-Gaussian.png](https://qiita-image-store.s3.amazonaws.com/0/242603/3684b1d3-1379-8e29-0ff9-335727d9a15e.png)
Athena の Query で正規表現とかサブクエリとかやる方法

```
SELECT count(*)
FROM 
    (SELECT regexp_extract_all(request_uri, '(.*hoge_id=.*?)(.*?)&', 2)
        FROM "DATABASE_NAME"."TABLE_NAME"
        WHERE year=2018
            AND month=3
            AND day=13
        GROUP BY  regexp_extract_all(request_uri, '(.*hoge_id=.*?)(.*?)&', 2)
    )
```
rails-ujs + jquery での 罠

rails-ujs を使い、jquery の onメソッドで form の ajax イベントをつかむときにはまったので備忘録


フォームやリンクで `data-remote="true"` したときなど、`ajax:success`のイベントを拾うとき以前の追加パラメータ(xhr, status, errなど)は、`event.detail`の配列として入るようにかわった。


```ruby
$("form").on "ajax:success", (event) ->
  console.log(event.detail[0])
```

こんな感じでとるとエラー

![e.png](https://qiita-image-store.s3.amazonaws.com/0/33695/a2b0111f-5c45-2cd3-ec80-f156943aeb54.png)

jQuery のリファレンス読むと

>Other Properties
> To access event properties not listed above, use the event.originalEvent object:

（和訳）

> APIリストにないイベントプロパティは event.originalEvent 使えや

というわけで、

```ruby
$("form").on "ajax:success", (event) ->
  console.log(event.originalEvent.detail[0])
```

で、無事とれました。

jQuery 1.11.2
Azure 徹底入門

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「
こわくない！Azure 徹底入門 」で使われた資料のご案内です。</p>

- <strong>Azure 徹底入門</strong><br />
https://www.slideshare.net/mihochannel1/azure-89438469

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
AzureのIaaSで構築する、シンプルなWebサーバ環境 

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「AzureのIaaSで構築する、シンプルなWebサーバ環境」で使われた資料のご案内です。</p>

- <strong>AzureのIaaSで構築する、シンプルなWebサーバ環境 </strong><br />
https://www.slideshare.net/akiodoi/antenna-20180306-azureiaasweb

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
CircleCI+AWS-CodedeployでStaging環境などに自動デプロイさせる

# やりたいこと
CircleCI+AWS-CodedeployでStaging環境などに自動デプロイさせたい。

## AWS-Codedeploy
AWS-Codedeployは現在、以下の２つの方法でデプロイができます。

- S3に上げたソースコードを展開
- Github上のソースのcommitハッシュを指定して展開

CircleCIでAWS-Codedeployというと大抵の場合はS3方式を利用しています。
ちなみに本家のdocもそうなってます。他のqiita記事もたいていは。
https://circleci.com/docs/1.0/continuous-deployment-with-aws-codedeploy/

ここではS3に固めて上げる冗長な作業は抜きで**Github+コミット番号から直接デプロイする方法**で行います。
## AWS-Codedeployにて(ConsoleUIとか)
0. デプロイ対象のサーバにcodedeploy-agentをインストールしておく。
1. アプリケーションを作成する(割愛)。  
2. appspec.ymlでデプロイコマンドなどを用意する(割愛)。
3. 一度、デプロイメントを作成して、Github経由で更新が出来ることを確認しておく。  
※説明の便宜上、アプリケーションネームを`appA-name`、デプロイグループを`appA-deploy-group`とします。

```shell:e.g.
aws deploy create-deployment --application-name appA-name --deployment-group-name appA-deploy-group --github-location repository="your/repository",commitId="0a684afc0c38e97f35023e404cff543d825f43b4"
```
CLIがだめだったらWebUI上でデプロイメントを作成して試す。

## CircleCIにて
1. AWS IAMロールを作成する。(Codedeployのポリシーつける)
2. デプロイするユーザに紐付ける。
3. `aws_access_key_id`と`aws_secret_access_key`を発行する。
4. CircleCIのWebUIで設定する。画像参照。
![Project settingsCircleCI.png](https://qiita-image-store.s3.amazonaws.com/0/87900/77656fb9-59ad-cd19-219b-d8f274c2b5a7.png)

FYI: https://circleci.com/docs/1.0/continuous-deployment-with-aws-codedeploy/

## config.yml の作成

あとは `.circleci/config.yml` から`aws-cli`コマンド叩けばOK。

```yml
version: 2
jobs:
  build:
      〜省略〜
  deploy:
    docker:
      - image: cdssnc/aws-cli
    steps:
      - run:
          name: "Set AWS region"
          command: aws configure set region ap-northeast-1
      - run:
          name: "Deploy Staging"
          command: aws deploy create-deployment --application-name appA-name --deployment-group-name appA-deploy-group --github-location repository="your/repository",commitId="$CIRCLE_SHA1"
workflows:
  version: 2
  build_deploy:
    jobs:
      - build
      - deploy:
          requires:
            - build
          filters:
            branches:
              only: master
```
※ regionはセットしないとエラーになるので、必須です。


これでmasterブランチに何かがマージされた場合、
circleCIからAWS-Codedeployが実行されてStagingなどが自動で更新されます。
AWS-Codedeployだけあれば、踏み台サーバも要らないのでセキュリティ的にも安全なのでオススメです。

おしまい。
JenkinsとCloudFoundry(Pivotal Cloud Foundry)を連携する方法

JenkinsとCloudFoundry(Pivotal Cloud Foundry)のCDの連携設定を備忘録としてまとめました。

以下のシリーズのCF/PCF版です。

- [JenkinsとGitLabを連携する方法](https://qiita.com/takamii228/items/3598f403518c296f93f3)
- [JenkinsとGitLabとMattermostを連携する方法](https://qiita.com/takamii228/items/a0f4b2ef8107d6d3cd34)

# 1. CloudFoundry Pluginをインストールする

Jenkinsに[Jenkins CloudFoundry Plugin](https://github.com/jenkinsci/cloudfoundry-plugin)をインストールします。
インストールは管理者権限のあるユーザでJenkinsにログインし、`Jenkinsの管理`→`プラグインの管理`→`利用可能`なタブを選択、CloudFoundryにチェックをいれてインストールを実行します。

# 2. CloudFoundry / Pivotal Cloud Foundryの認証設定

JenkinsにCF/PCFの認証情報を設定します。Jenkinsの左のメニューの`認証情報`→`System`→`グローバルドメイン`を選択、左にある`認証情報の追加`を選択し、以下の内容で追加します。

- 種類 : ユーザ名とパスワード
- ユーザ名 : CF/PCFのユーザ名
- パスワード : CF/PCFのパスワード 
- ID : 空欄(あとで自動発行される)
- 説明欄 : CF/PCF認証用のユーザである説明を記載

# 3. Jenkinsfileの設定と動作確認

`Jenkinsfile`のPipline Scriptには`pushToCloudFoundry`を使って以下の内容を設定します。

- `target` : CloudFoundry APIのドメイン
- `organization` : 対象のorganization
- `cloudSpace` : 対象のスペース
- `credentialsId` : 2で設定した認証情報のID(英数字文字列)
- `manifestChoice`(optional) : manifestの情報
	- たくさんあるので省略、`manifest.yml`に内容を記載して、インポートする形がよいと思います。
- `pluginTimeout`(optional) : timeout設定、デフォルトは`120`
- `selfSigned`(optional) : 自己証明書の設定、デフォルトは`false`
- `serviceToCreate`(optional) : コマンド実行時に作成するサービス

以下にサンプルを記載しました。

```groovy
pipeline {
    agent any

    stages {
        stage('deploy'){
            steps {
            	pushToCloudFoundry(
            		target: 'xxxxxxxxx',
                    organization: 'yyyyyyy',
                    cloudSpace: 'zzzzz',
                    credentialsId: 'wwwwwwwwwwwwwwwwwww',
                    manifestChoice: [manifestFile: 'manifest.yml']
                )

            }
        }
    }
}
```

# IP制限のある環境で実行する場合

Jenkins Pluginの中で`cf push`および`cf logs`相当のコマンドが実行されるため、CF/PCFに対してJenkinsからの80ポート/443ポートおよび4443ポートの穴が空いている必要があるので注意してください。

# 参考情報

- https://github.com/jenkinsci/cloudfoundry-plugin
- https://jenkins.io/doc/pipeline/steps/cloudfoundry/
- https://jenkins.io/doc/book/pipeline/syntax/
- https://docs.cloudfoundry.org/adminguide/supporting-websockets.html
WSLをコマンドラインから起動する方法

## WSLをコマンドラインから起動する方法

ストアの実行ファイルがよくわからないことになってるけど、インストールさえしてしまえば実際は以下のコマンドだけで起動する。
コマンドプロンプトでもPowerShellでも起動する。

```powershell
# 以下のパス内のexeが起動してる。
# C:\Users\ユーザー名\AppData\Local\Microsoft\WindowsApps

# Ubuntuが起動する。
$ ubuntu

# Debianが起動する。
$ debian

# openSUSE LEAP 42が起動する。
$ openSUSE-42

# SUSE Linux Enterprise Server12が起動する。
$ SLES-12
```

## 補足
今[Hyper](https://hyper.is/)でdebianを起動して使ってるけど、設定は以下の通り。
Windows向けのターミナルエミュレータはいろいろあるけど、こんな感じで起動するはず。
オプションは渡せないっぽい？？？

```javascript
module.exports = {
  config: {
    ...
    shell: 'debian.exe',
    shellArgs: []
  }
}
```
swagger specどうやって管理する問題

# まえがき

社内向けのメモとして書いたら、「これQiitaに上げたらいいんちゃう？」って言われたので上げます。
ほんとにOpenAPIとかSwagger始めて触るチームで共有する用に書いたので、おかしなところがあったら教えてください。
これ書いてる自分もSwagger始めて触ります。

これ書いたときの状況はこんな感じ。

* Webアプリ開発中で、チーム全員がVSCodeを使っている。
* チームで使えるSwagger Editorの環境を作った直後。
* タスク管理はJIRA
* 内部ドキュメント系はConfluenceで管理

----


# はじめに

Swagger Editorが動くサーバも立てて、「さて、swagger使うか！」とは言うものの、書いたspecはどうやって管理する？
ってことを考えていろいろやったことメモ。


# TL;DR

specはソースと一緒にgit管理するのがいいんじゃない？
ついでにvscodeのsettings.jsonにswaggerのjson schema読み込ませる設定書いて、jsonでIntellisence使って書くのがストレスフリー。
Extensions探せばSwagger Previewとかもあるし。


# まずSwaggerってどう使うの？

最初にぶち当たった疑問がコレ。何にも知らない脳内イメージだと

* サーバでswaggerのソースが管理されてて
* 編集したいソースを選んで編集できて
* API仕様書として使えるようなページも勝手にできてる

とかいう妄想してた。
でも現実はそんなに甘くはなかった。

* Swagger Editorはその名の通りエディタを提供するだけ
* Swaggerのspecは別に管理する必要がある
* 仕様書のような見た目で表示しようと思ったら、Swagger Editorのプレビューを使うか、Swagger UIを使うしかない
* API仕様を公開しようと思ったら、自分で別途サーバを立てなければいけない（Swagger Editorが仕様書用サーバのコードを吐いてくれるけど）

けっこうめんどくさい。


# Swaggerのspecどこで管理する？

というわけでタイトルの問題が出てきました。
適当に考えた候補は次の通り。

* Confluence
* API仕様のためのリポジトリでGit管理
* Productionコードと一緒にGit管理

まずひとつめ。これって今までと変わらなくない？というかSwagger Editorに食わせるぶんめんどうになっただけでは…。
つぎ、ふたつめ。管理するリポジトリが増えてくのつらいことないかな…。
みっつめ。これが一番無難なのでは。

良い意見あったらください。


# Swagger Editorに毎回spec食わせるのめんどくさい問題

サーバ立てといて何言うとんねん、というやつですが気にしない。めんどくさいものはめんどくさい。
せっかくvscodeでソース見るついでにSwagger spec開けるんだからそこで編集もできないかなーとか思うわけです。

で、見つけました。Swagger Viewer。
Extensionsから探せばすぐ見つかります。これでvscode上でSwagger specのプレビューができる！
Swagger Editor開かなくてもAPI仕様が見れる！

…なんだけど。これだけじゃさすがにIntellisenseは効かない。
Swagger EditorだとIntellisenseっぽい機能がちゃんと用意されてるので、今のように初心者なうちはSwagger Editorの方が格段に書きやすいのです。


# vscodeにIntellisenseを！

swagger specのIntellisenseを効かせてくれるExtensionsなんて誰かが作っててくれそうなもん…と思って探したものの、なかった。
用意されてないなんてことがあるのか…としょぼくれていると。

https://github.com/Microsoft/vscode/issues/5334

見つけました。Issueの中に、それっぽいことをしてる人が！
っちゅーことで、vscodeの設定にこれ書きましょう。

```json:settings.json
"json.schemas": [
    {
        "fileMatch": [
            "*swagger.json"
        ],
        "url": "http://json.schemastore.org/swagger-2.0"
    }
],
```

fileMatchの中身は好きに設定してください。この設定だと、"swagger.json"で終わる名前のファイルはSwagger specだと思ってIntellisenseを効かせてくれるようになります。

これでSwagger Editorと同等のエディタに！Swagger Editorで使う機能はコード吐いてくれるところだけになったよ！


# …あれ、specってyamlじゃないの？

気づいた人もいるかもしれませんが、Swagger Editorでは基本的にyamlでしか書けません。
Swagger Editorにコード吐かせようと思ったらyamlでペーストしないといけないし、Import from fileしたときにエクスプローラからフォルダ構成潜ってspecファイル探すのめんどくさい…。

と思ったのですが。

jsonで書いたspecをコピーしてSwagger Editorにペーストしようとすると、「yamlに変換しますか？」的なメッセージが出て勝手に変換してくれます！すばらしい！
これでもうvscodeで書かない選択肢がなくなりました。


# まとめ
vscodeはすばらしい。
link > ls > LS_COLORS, Qiita記事, LS_COLORSで使える色

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

GNOME Terminalでのファイル閲覧に関して、色について検討しているなか、以下を見つけた。
https://unix.stackexchange.com/questions/322029/how-to-change-the-color-of-different-files-in-ls

`LS_COLORS`という環境変数があるようだ。変更方法も上記リンク先に記載されている。

Qiita記事としては以下を見つけた。
[LS_COLORSを設定しよう](https://qiita.com/yuyuchu3333/items/84fa4e051c3325098be3) by @yuyuchu3333 さん

どのような色があるのかは以下に紹介されている。
[lsコマンドで表示されるファイルの色を変更するには](http://www.atmarkit.co.jp/flinux/rensai/linuxtips/358dircolors.html) by 北浦訓行さん

実際に自分の環境での使用を検討したが、使用ソフトにて出力されるファイルが拡張子なしなので、拡張子による色分けは有効ではない。
vagrantで新しいボックスに新しいipを割り当てる

開発環境もう一つOSから作りたいなという場面で
virtual box とvagrantの設定ができている状況が前提です。

vagrantfileの以下の部分を編集します。

```vagrantfile
config.vm.network "private_network", ip: "192.168.33.13"
```

上記のようにIPを設定していただければ
設定されたものに割り当てることができ
仮想サーバを複数台同時に立ち上げたりできます。

自分のwindows10の環境では
centosの新規環境を作って(ソフトなんかも入れていくと)大体10GBくらいの容量が必要でしたが
この辺りはそれぞれ違うと思うので概算参考値ということで。
機械学習概要

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「初めての機械学習」で使われた資料のご案内です。</p>

- <strong>機械学習概要</strong><br />
https://app.box.com/s/utp39jnhsapflr7k5f5zkt9gqxxyp92j
<br><br>
- <strong>AzureMachineLearningHands-onTraining_クラス分類</strong><br />
https://app.box.com/s/e4632nvdke3410qzq31cgukmf1oezz3m/file/278981207844

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
bash > 作業しているディレクトリの情報を探す > [事前準備]pwdと# | [事前準備]dateとpwd | [事後実行]locate | [事前準備]pushd

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

作業をしている中で「あれっ？さっきまでどのディレクトリにいたっけ？」ということがある。

### 方法1(事前準備) > pwdと`#`

こうしておく。

```bash
$ pwd
/home/wrf/LS_COLORS_180314
$ #at /home/wrf/LS_COLORS_180314
```

`#`で始まるコマンドは実行されない。historyに残すため実行する。

「あれっ？さっきまでどのディレクトリにいたっけ？」になった時に以下を実行する。

```
$ history | grep "#"
...
1064  #at /home/wrf/LS_COLORS_180314
...
```

`at`という記載は別のキーワードでもいい。grep結果の中で見やすいキーワードにしておく(なくてもいい)。

色々なゲストOSで作業するとき、設定を用意しなくてもいい方法として上記を考えてみた。
(セットアップ x [ゲストOS数]をする作業を省略）。

- [bashのコマンドラインでコメント(#)の使いみち](https://qiita.com/masami256/items/a56f7e1e693a80ecb7fe)
- [bash > コメント(#)の使いみち > 手順テキストからのペースト、変更、実行](https://qiita.com/7of9/items/4a4517c884a8f6e2ead9)

(追記 2018/03/14)
historyでgrep検索すると、その実行自体がhistoryに残り、検索に表示されるようになる。


### 方法2(事前準備) > dateとpwd

```bash
$ date >> ~/history.txt
$ pwd >> ~/history.txt
```

```bash
$ tail ~/history.txt 
...
Wed Mar 14 11:06:02 JST 2018
/home/wrf/LS_COLORS_180314
```

**注意点としては,date,pwdコマンドのリダイレクションを`>`に間違うとhistory.txtファイルが飛ぶ、という点**。
そういう観点から下記の記事を書いた。

- [bash > リダイレクション > ファイル上書きを禁止、追記だけにする > set -o noclobber](https://qiita.com/7of9/items/96a6873c3e87c7b71c6e)

**ただし、こういう設定になれると、設定していない環境でファイルを飛ばす失敗をする**。


### 方法3(事後実行) > locate

historyにてファイル名を取得できる場合はlocateコマンドを使うことができる。

データベースの更新がまだかもしれないので`sudo updatedb`をしてからlocateを実行するといいかもしれない。

- [@tukiyo3 さんのコメント](https://qiita.com/7of9/items/9ab581c15fe89127f429#comment-4c0af51a3b161de40ef6)
- [linux command > test_readCombで始まるファイルを探す > locate -b test_readComb | sudo updatedbでDBを更新](https://qiita.com/7of9/items/56d909f29e15647d4687)


### その他 > 直前のディレクトリ

直前のディレクトリに戻る場合は下記でもいい。

```
$ cd -
```

### どれがいいか?

環境を汚さないという観点では方法1。
履歴を残すという観点では方法2。
方法3も使えるか検討する。

記事が長く(複雑に)なってしまった。

@ 社員をサーフィンへ行かせよう by Yvon Chouinard (シュイナード)
> 複雑さは、機能面の必要性が整理されていないことの表れであることが多い。

### 方法4 (事前実行) > pushd

```bash
$ pushd .
~/WORK/C_INCLUDE_180302 ~/WORK/C_INCLUDE_180302
```

確認は以下。

```bash
$ dirs 
~/WORK/C_INCLUDE_180302 ~/WORK/C_INCLUDE_180302
```

popdで取出すと消えてしまうという点はある。
jquery.cookie.jsで手軽に文字サイズ切り替え


jquery.cookie.jsを使えばすごい簡単にjavascriptでcookieが扱えます。

``` $.cookie('保存名', 値) ``` だけで保持できるし、``` $.cookie('保存名')``` だけで取得できる。うーん便利すぎる。

この記事ではRailsプロジェクトでjquery.cookie.jsを使って、文字サイズの切り替えを自由に行える方法をメモとして残します。やりたいことは自由に文字のサイズを切り替えられて、ページ遷移やリロード時も選択中の文字サイズの設定を引き継げるようにしたい。

![スクリーンショット 2018-03-14 10.56.46.png](https://qiita-image-store.s3.amazonaws.com/0/239829/de388cc4-9a87-9ecb-4f31-ca924f8b3f74.png)

- [jquery-cookie.js](http://github.com/carhartl/jquery-cookie)のソースをクローン

```
# Rails.rootで
git clone https://github.com/carhartl/jquery-cookie
```

- jquery.cookie.jsを/vendor配下に設置

```
cp jquery-cookie/src/jquery.cookie.js vendor/assets/javascripts/
# コピーしたら他は必要ないので消しちゃってOK
rm -rf jquery-cookie
```

- application.jsに定義

```app/assets/javascripts/application.js
//= require jquery.cookie
//= require_tree .
//= require font_change
```

- 処理

```ruby:app/views/layouts/_header.html.slim
.navbar-text
  | 文字サイズ &nbsp;
  = link_to '小', '#', class: 'btn btn-default font-change', id: 'fontS'
  | &nbsp;
  = link_to '中', '#', class: 'btn btn-default font-change', id: 'fontM'
  | &nbsp;
  = link_to '大', '#', class: 'btn btn-default font-change', id: 'fontL'
```

```ruby:app/assets/javascripts/font_change.js.coffee
 $ ->
  # フォントサイズ適用
  history = $.cookie('fontSize')
  elm_body = $('.wrapper') # bodyタグの上にwrapperクラスを追加しておく
  if history
    elm_body.addClass(history)
    $("##{history}").addClass('active') # bootstrapのactiveクラスを追加

  # フォントサイズ変更
  $('.font-change').click ->
    history = $.cookie('fontSize')
    set_font_size = $(this).attr('id')
    $("##{history}").removeClass('active')
    $(this).addClass('active')
    if history
      elm_body.removeClass(history).addClass(set_font_size)
    else
      elm_body.addClass(set_font_size)
    $.cookie('fontSize', set_font_size)
```

```ruby:app/assets/stylesheets/hoge.css.scss
.fontS {
  font-size: 14px !important;
}

.fontM {
  font-size: 16px !important;
}

.fontL {
  font-size: 18px !important;
}
```
【Python3】AtCoder Beginner Contest 090 問題A

# 概要
3/11(日)のABC90の問題Aについてのメモ

# 問題
[AtCoder Beginner Contest 090 A：Diagonal String](https://abc090.contest.atcoder.jp/tasks/abc090_a)

ざっくり言うと
* 3行3列の文字列を入力するよ
* 1行1列、2行2列、3行3列の文字を抜き出して出力してね

# 考えた手順
1. 入力
2. 指定された部分をピックアップ
3. 出力

# 考えたコード
```python:ABC90_A.py
#1. input
a = input()
b = input()
c = input()

#2. take out designated characters
a1 = a[0]
b2 = b[1]
c3 = c[2]

#3. output
print(a1+b2+c3)
```

## 思ったこと
* 例えば3行目の3文字目がなかったらどうなる？
→
`IndexError: string index out of range`

上記のコードでACだったものの、不完全な文字列が入力されることもありうるはず。

ちなみにスペースならエラーは出ない。

**例)2行2列の文字が存在しない時**
入力
123
4
789

出力
`IndexError: string index out of range`

**例)2行2列の文字がスペースの時**
入力
123
4 6
789

出力
1 9

文字が存在しないことと空白文字は全く違うものだと実感できたのが良かった。

# スマートな方々
**1. ひとまとめ**

```smart1.py
print(input()[0]+input()[1]+input()[2])
```

1行でシンプルな上に分かりやすい。



**2. モジュール化**
 
```smart2.py
def main():
    a = input()
    b = input()
    c = input()
    print(a[0],end='')
    print(b[1],end='')
    print(c[2])
 
if __name__ == '__main__':
    main()
```

こういうふうに関数を作って直接実行された時だけ動く構造にしている方もちらほらといらっしゃる。
モジュールとして再利用できる可能性があるから日頃からこう書く癖をつけるといいのかもしれないと思った。
Azure Functions & Logic Appsではじめるサーバーレスアプリケーション開発入門

<p>この投稿は東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「Azureでサーバレスコンピューティング入門 」で使われた資料のご案内です。</p>

- <strong>Azure Functions & Logic Appsではじめるサーバーレスアプリケーション開発入門</strong><br />
https://azureantenna20180424.blob.core.windows.net/public/AzureAntenna20180424.pdf

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
Ubuntuのカーネルパニックの修正

Ubuntuのサーバーを使っていて更新したらカーネルパニックで起動しなくなって、復旧したときのメモ。

## カーネルパニックからの復旧方法
やったことは、不具合の原因になっているカーネルを削除すること。
まずはカーネルバージョンを調べる。以下のコマンドで今のバージョンを見る。
`uname -r`
次にインストールされているカーネル一覧を出す。
`dpkg -l | grep linux-image`
問題のカーネルを削除する。
`sudo apt-get autoremove --purge linux-image-4.4.0-81-generic`
上記は基本的にこのページを参考にしました。
http://www.stockdog.work/entry/2017/07/09/023637

## はまったところ
上のコマンドを実行したところ、以下のようなエラーになってカーネルを削除できなかった。

> パッケージリストを読み込んでいます... 完了
> 依存関係ツリーを作成しています                
> 状態情報を読み取っています... 完了
> パッケージ 'linux-image-extra-4.4.0-97-generic' はインストールされていないため削除もされません
> 以下の追加パッケージがインストールされます:
>   apport
> 以下のパッケージはアップグレードされます:
>   apport
> アップグレード: 1 個、新規インストール: 0 個、削除: 0 個、保留: 154 個。
（中略）
> Traceback (most recent call last):
>   File "/usr/bin/pycompile", line 35, in <module>
>     from debpython.version import SUPPORTED, debsorted, vrepr, \
>   File "/usr/share/python/debpython/version.py", line 24, in > <module>
>     from ConfigParser import SafeConfigParser
> ImportError: No module named 'ConfigParser'
> dpkg: クリーンアップ中にエラーが発生しました:
>  サブプロセス インストール済みの post-installation スクリプト はエラー終了ステータス 1 を返しました
> 処理中にエラーが発生しました:
>  /var/cache/apt/archives/apport_2.20.1-0ubuntu2.10_all.deb
> E: Sub-process /usr/bin/dpkg returned an error code (1)

エラーをよくよく見るとPythonのエラー（ImportError: No module named 'ConfigParser'）になってるので、これを調べていくと、どうやらPython2系と3系の違いらしい。2系ではConfigParserだが3系ではconfigparser。

`/usr/bin/python`で使っているPythonバージョンを調べると3.5.2だったので、2系で動くようにシンボリックリンクを一時的に変えてみた。
`ln -s Python2系のpath /usr/bin/python`

で、再度カーネルを削除するコマンドを実行したら、無事に動作
`sudo apt-get autoremove --purge linux-image-4.4.0-81-generic`

これで復旧完了
音声付き動画自動再生まとめ


Chromeの自動再生ポリシーが2018年4月に変更されるらしいので、
現状と対応、他ブラウザもろもろざっくりまとめ
https://developers.google.com/web/updates/2017/09/autoplay-policy-changes

*無音の場合は常に許可される
*Safariは無音の場合でも、ユーザーが自動再生の許可を出した場合のみ


##2018年3月まで
■自動再生OK
・Chrome *2018年3月まで
・Firefox
・IE
・Edge

■自動再生NG
・スマホ
・Safari *ユーザーが自動再生の許可を出した場合のみ自動再生が可能

###Safari

ユーザーが自動再生の許可を出した場合のみ自動再生が可能

環境設定
↓
Webサイト
↓
自動再生
↓
全てのメディアを自動再生

##2018年4月から（予定）

Chromeは2018年4月以降条件に達した場合のみ自動再生が可能

https://developers.google.com/web/updates/2017/09/autoplay-policy-changes

###自動再生許可の条件
Media Engagement Index (MEI)のスコアに基づいて可否が決まる
chrome://media-engagement/

MEIスコアが0.7を超えると自動再生が許可され、
0.5を下回ると、拒否される

####■MEIスコアを計算する
chrome://media-engagement/

#####スコア計算対象メディアの条件
・メディアの長さは7秒以上
・オーディオが存在し、ミュートされていない
・動画のタブが有効
・動画のサイズは200x140px以上

#####visitsが5以下の場合
Score

#####visitsが5以上の場合
significant_playback / visits


##対応
自動許可がされていない場合はボタンを表示してユーザーにアクションを促す
https://developers.google.com/web/updates/2017/09/autoplay-policy-changes


自動再生許可の可否は、play()関数で返されたPromiseの値で判断出来る

>```
>var promise = document.querySelector('video').play();
>
>if (promise !== undefined) {
>  promise.then(_ => {
>    // Autoplay started!
>  }).catch(error => {
>    // Autoplay was prevented.
>    // Show a "Play" button so that user can start playback.
>  });
>}
>```

*iframeも同様、ユーザーのアクションなしでは自動再生を許可しない。autoplay属性も無視される


##参考
https://developers.google.com/web/updates/2017/09/autoplay-policy-changes
https://docs.google.com/document/d/1_278v_plodvgtXSgnEJ0yjZJLg14Ogf-ekAFNymAJoU/edit
https://qiita.com/ktknest/items/e81b3a4caac540098fc8
Laravelのhelper関数を自作する

# Laravelのhelper関数
Laravelにはグローバルで使えるヘルパー関数が幾つかあります。
asset、old、url、view辺りはよく使ってます。
特にview回りはコンテナからクラスを取ってくるのが非常に面倒なので、グローバルのヘルパー関数を使うと楽だと思います。
これらの関数は`laravel/framework/src/Illuminate/Foundation/helpers.php`のファイルにあり、`laravel/framework/composer.json`の設定によって読み込まれています。

# helper関数の自作
## helpersファイルを作る
自作のhelpersファイルを作っていきます。

```php:helpers.php
<?php

if (!function_exists('custom_function')) {
    /**
     * 自作関数
     */
    function custom_function($hoge)
    {
        //
    }
}
```

## helper関数を読み込む
composer.jsonのautoloadにfilesというkeyの配列を追加し、ファイル名を入れます。
filesの説明はこちら https://getcomposer.org/doc/04-schema.md#files

```json:composer.json
--- 略 ---
    "autoload": {
        "classmap": [
            "database/seeds",
            "database/factories"
        ],
        "psr-4": {
            "App\\": "app/",
            "Domain\\": "domain/",
            "Infra\\": "infra/",
            "Model\\": "model/"
        },
        "files": [
            "helpers.php"
        ]
    },
--- 略 ---
```
16 進数表記を 2 進数表記に変換する

毎回毎回 Google 先生に頼るわけにはいかんでしょう。

![0xDEA0を2進数に.png](https://qiita-image-store.s3.amazonaws.com/0/6697/b59ef03c-83b1-d0fc-4b60-b3c0f9c5e0eb.png)


16 進数文字列を整数に変換して、それから 2 進数文字列に変換する。

```py
>>> bin(int.from_bytes(bytes.fromhex('0xDEA0'[2::]), 'big'))  # ビッグエンディアン
'0b1101111010100000'
>>> bin(int('0xDEA0', 16))  # ビッグエンディアン (simpler)
'0b1101111010100000'
>>> bin(int.from_bytes(bytes.fromhex('0xDEA0'[2::]), 'little'))  # リトルエンディアン
'0b1010000011011110'
```
CSVを読み込んでなにかやるときのテンプレ

1,2ヶ月に1回くらいの頻度で書いている気がするのでメモ。
※下のコメントにあるライブラリ利用がオススメ↓

```ruby
file_name = './hogehoge.csv'
file = File.open(file_name, 'r').read
rows = file.split("\n")

# ヘッダーを削除
rows.shift

rows.each do |row|
  ary = row.split(',')
  # do something
end
```
そっか、joinを使えばOKだった

探索対象ファイルに対してnkfで文字コード、改行コード情報を取得。
この結果に「拡張子だけ」の列を付け加えたいという事案。

もちろんPythonを使っても良いのですが
ワンライナーでできないかなと探索したら、、、joinコマンドを発見しました。

で、一時ファイルに出力せず標準出力結果を直接joinします。
（一時ファイルに書くとなにかと後処理がめんどいし事故になったりもする。。。）

これぐらいの処理ならDBやPythonまで
ご参加いただく必要はないですね。

~~~bash
join -t, <(find ./popko/ -type f | \
           awk -F"." '{print $0","$NF}' | \
           sort) \
         <(find ./popko/ -type f | \
           xargs nkf --guess | \
           awk -F"[:()]" '{print $1","$2","$3}' | \
           sed -e 's/ //g' | \
           sort)  
~~~

~~~
結果
./popko/Def.txt,txt,ASCII,LF
./popko/aaa.bbb.ccc,ccc,ASCII,LF
./popko/data.txt,txt,ASCII,LF

~~~
AOJをC言語で解く。　[ITP1_2_C]

簡単なプログラムでも改行がないだけだったり、小さなミスで怒られるので難しいです。

少しずつ進めていくと
<img width="908" alt="スクリーンショット 2018-03-14 10.04.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/197731/4f2056d8-bc22-8598-6325-58e04fa3b290.png">

クリアした問題にチェックがついていき嬉しい。

が、いきなり止まってしまった
<img width="1262" alt="スクリーンショット 2018-03-14 10.07.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/197731/3e0a5882-6a01-0fa8-85b0-5528014a2b1e.png">

数字を小さい順に並び替えるだけのはず
<img width="901" alt="スクリーンショット 2018-03-14 10.09.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/197731/8e3f626c-f5f5-7178-e618-894bb976f460.png">


10000 1000 100
と
2 5 8
の並び替えはうまいこといくが、

3つ目の
5 2 2
の並び替えのところでエラーが出る。

xcodeでいったんこれを試してみる。
<img width="378" alt="スクリーンショット 2018-03-14 10.12.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/197731/ea8bc606-c4fb-bf95-c83c-862786da2d8a.png">

並び替えた
2 2 5が２回でてきてしまっている。

コードの

    if (b<=c && c<=a) printf("%d %d %d\n",b,c,a);

    if (c<=b && b<=a) printf("%d %d %d\n",c,b,a);

この２つのパターンで出てしまっている？
本当にそうか試してみる。
<img width="438" alt="スクリーンショット 2018-03-14 10.16.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/197731/fc5426f6-0dae-aae4-f390-b044b1f7a874.png">
これに変えて実行してみた

<img width="388" alt="スクリーンショット 2018-03-14 10.17.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/197731/0cee99bf-c121-865e-3ec3-dd5ac8820ccb.png">

考えていた予想と一致した。

改良してみた

<img width="429" alt="スクリーンショット 2018-03-14 10.23.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/197731/fd1869a1-b215-b344-5a82-55604ecff75c.png">

これで見事クリア！
<img width="614" alt="スクリーンショット 2018-03-14 10.24.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/197731/d94bbfda-6c42-2e1d-11d3-77e259a555c6.png">
Let's Encryptでワイルドカード証明書を取得する方法

数時間前にアナウンスされた[コミュニティの投稿](https://community.letsencrypt.org/t/acme-v2-and-wildcard-certificate-support-is-live/55579)で、ワイルドカードが緑色で有効になったとのニュースが！やったね

下の環境でできました

- CentOS 7.4(新規で入れる方法は[ここ](https://letsencrypt.jp/usage/install-certbot.html#CentOS7))
- certbot 0.22.0(yum updateで降ってきた)



上記環境でなくてもpipとかgit cloneすればいけそう

```
sudo certbot certonly --manual -d *.example.com \
--preferred-challenges dns-01 \
--server https://acme-v02.api.letsencrypt.org/directory \
-m yourname@example.com
```

## Ubuntuについて

~~PPA入れた状態でaptを更新しても0.21系なので調べたら以下の記事を見つけた~~

~~[この投稿](https://community.letsencrypt.org/t/ubuntu-16-04-ppa-how-long-until-certbot-0-22-0-available/55613/3)によると、しばらく(数週間)かかりそうやわすまんやでって書いてある。~~
できた
AOJ(競技プログラミング)をC言語で解く。　[xcodeでscanfを使うとき

C言語を勉強し始めて、AOJで問題を解いている。

コードはxcodeで書いているのだけれど、scanfが入っているときにどのようにキーボードから入力したらいいのかわからなかったので調べた。


<img width="600" alt="スクリーンショット 2018-03-14 9.47.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/197731/475cd43c-a350-a918-0360-17b9303ac03c.png">


コードをとにかく書いて、左上の三角を押して実行
<img width="300" alt="スクリーンショット 2018-03-14 9.52.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/197731/1e6d56c1-d903-04b3-a46d-c4425dff9b8f.png">

この警告が出てくるのでパスワード入れて「許可」


成功すれば

<img width="1263" alt="スクリーンショット 2018-03-14 9.54.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/197731/23a28ce8-4bdf-d1a5-6768-70ac19944900.png">

右下に
<img width="794" alt="スクリーンショット 2018-03-14 9.55.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/197731/53d17e14-d9a5-1101-57f6-a2316c2fcdbc.png">
左にある上三角を押して


ここを開くと
<img width="755" alt="スクリーンショット 2018-03-14 9.56.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/197731/8ce9ded2-b562-c9f4-36ca-69ed2b0368ec.png">

この右側のAll Outputの所にscanfで入力したいものを打ち込んでenterキーを押すと
<img width="387" alt="スクリーンショット 2018-03-14 10.00.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/197731/82503125-2f53-8238-44fd-b52bc1f64fd6.png">

結果が出力された。
Linux ノウハウ

# Ubuntsu
https://qiita.com/white_aspara25/items/723ae4ebf0bfefe2115c
https://qiita.com/EGO/items/36e9baccc80097950195


# コマンド
■ dstat
https://oxynotes.com/?p=7566
https://qiita.com/harukasan/items/b18e484662943d834901

例：
$ dstat --output dstat.csv  (CSV出力する場合)
$ dstat -cmd

■　ファイルの場所を検索（hoge.htmlがファイル名）
find / -name hoge.html

■　プロセスの表示
$ ps -auxf
細かいのはあるが、基本一律上記で良い。
参考：https://eng-entrance.com/linux-command-ps#aux

■　scpのコマンドの使い方
共にMacのターミナルからコマンドを入力すること
１：macのデスクトップからサーバにコピる場合
$ scp ファイル名 アカウント名@IPアドレス:/home/アカウント名

２：サーバからmacにコピる場合
$ scp アカウント名@IPアドレス:/home/アカウント名/ファイル名 ~/Desktop/

ファイルの更新時間やアクセス時間、権限を保持したまま転送する場合は、「-p」オプションを付与する。
$ scp -p コピー元ファイル ユーザ名@ホスト名:/コピー先ファイル

mac側のディレクトリをsudoで作ると、権限がrootになるので、そのrootをmacのアカウントに合わせた所有者にしないとダメ。(chownする)

イメージはこんな感じ
scp -r -i 公開鍵 アカウント名@IPアドレス:/home/アカウント名/fabric-performance-verification.git/docs /Users/XXXXXX/Desktop/01_HL/data4HL/fabric-performance-verification.git
curlコマンドにてproxy設定

#やりたいこと
curlにproxy設定をしたい。

#方法

proxy書式:  http://ユーザ名:パスワード@サーバ名:ポート


### (その１) コマンドに直接指定
```shell-session
$ curl www.yahoo.co.jp -x http://taro:password@192.168.1.1:8080　
```

### (その２) ~/.bashrcに設定
```shell-session
$ cat .bashrc
export http_proxy=http://taro:password@192.168.1.1:8080
export https_proxy=http://taro:password@192.168.1.1:8080
```

### (その３) ~/.curlrcに設定
```shell-session
$ cat .curlrc
proxy=http://taro:password@192.168.1.1:8080
```
ELBが使用するIP数について

# ELB1台建てるのに、IPアドレス8つが必要
建てられたELBが実際に使用するIPは1~8でスケーリングすると思われる。
※ELBを 1台建てる処理の際に IPアドレス8つが必要(残IP数が7つだと、ELB1台も建てられないが、残IP数9つだと2台のELBが建てられる。)
https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/elb-backend-instances.html

## 注意事項
subnetの残IP数だけをみると、ELB1台につき、1IPしか使用していないように見えるのでELBを次々に建ててしまう事がある。しかし、利用可能な IP アドレスが 128個のsubnetに安全に建てられるのは

128 / 8 = 16台 までとなる。

16台以上のELBを建てることができるからといって建ててしまうと、
ELBがスケーリングして、1台あたり8IPを使用するようになった際、IPアドレスの枯渇が発生してしまう。
[Brief Notes] Knowledge Graph

![image.png](https://qiita-image-store.s3.amazonaws.com/0/240801/8c61ef70-247e-55ff-ed09-ff402e99fe88.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/240801/a48fd00a-6e78-a074-cccc-833e531ffaf1.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/240801/e9c58b8c-f831-aeea-1de7-0a320ba300be.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/240801/cb4b2c4d-9b2b-5ad7-9c61-f80e0f2666ab.png)
Bluetooth スペック (v4.2対応版)

# アーキテクチャ (Vol 1, Part A)
## 無線方式
Bluetoothには2つの無線方式が存在します。

| | 説明 |
|---|---|
| Basic Rate (BR)| v4.0より前から存在する無線方式。データレートは721.2kb/s。オプションとしてデータレートが2.1 Mb/sに高速化されたEnchanced Data Rate (EDR)が存在する。一般的にはBluetooth Classicと呼ばれているが、スペック上はBR/EDRと記述される。 |
| Low Energy (LE) | v4.0で追加された無線方式。|
| Alternate MAC/PHY (AMP) | とりあえず忘れてあげて |

## HostとController
Bluetoothは大きく2つの構成要素から成り立ちます。

||説明|
|---|---|
| Host | ControllerとHost Controller Interface (HCI)で接続する上位レイヤー。L2CAPなどのプロトコルが存在する。|
| Controller | 物理的な無線管理する下位レイヤー。市販されているBluetoothアダプタがこの部分に該当する。 |

* Controller
    * BR/EDRのControllerは、Radio、Baseband、Link Managerの3つから成り立ちます。
    * LEのControllerは、LE PHYとLink Layerの2つから成り立ちます。
    * BR/EDRのみ、LEのみのシングルController、BR/EDRとLEが両方入るControllerが存在します。
uwsgiデプロイ時に "no python application found"と出る場合

# 解決策
**アプリケーションのルートに移動し、pythonインタラクティブシェルから直接wsgi.pyをインポートし詳細なエラー情報を得る。**

# 問題
今回、新たなdjangoアプリケーションのiniファイルを設定・起動した所、ログに以下のエラーが表示されました。

``` uwsg-my_app.log
no python application found, check your startup logs for errors

```

このエラー、詳細が表示されないので、[原因がわからず困惑する人が多いようです](https://www.google.co.jp/search?q=no+python+application+found&oq=no+python+application+found&aqs=chrome..69i57j69i61j69i59j69i61j69i60.1999088j0j7&client=ubuntu&sourceid=chrome&ie=UTF-8)。私も上記エラーが出て小一時間悩みました。上記エラーが出る原因は様々ですが、詳細が分からない事には対処しようがないので、詳細なエラーを出すことを主眼にします。

# 障害切り分け

以下のような設定ファイルでdjangoアプリケーションをuwsgiで運用していると仮定します。
必要なところだけかいつまんで記載します。

``` uwsgi-my_app.ini
[uwsgi]
chdir = /home/www/my_app
wsgi-file = /home/www/my-app/config/wsgi.py
module = config.wsgi:application
socket = /tmp/uwsgi-my_app.sock
logto = /var/log/uwsgi-my_app.log
```
大雑把に言うと、

* アプリケーションルート/home/www/my_appに移動する
* wsgi.pyからmy_appのアプリケーションをロードする
* UNIXドメインソケット/tmp/uwsgi-my_app.sockをWebサーバとの通信に用いる
* /var/log/uwsgi-my_app.logにエラーを出力する

と言った感じです。


ログの表示、及び出力ファイルを見たところ、

* chdirは正常に行われている
* ソケットは正常に作られている
* ログも出力されている

ことを確認しました。

エラーがあるとすればwsgi.pyによるアプリケーションのロードに問題があると思われます。

# 解析
乱暴に言ってしまえば、uwsgiがやっていることは、アプリケーションルートに移動し指定のwsgi.pyをロードし、その出力をソケットに流すだけです。
それで、手動（pythonのインタラクティブシェル）でwsgi.pyをロードしてみます。

```
$ cd /home/www/my-app
$ python

>>> import config.wsgi

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "config/wsgi.py", line 16, in <module>
    application = get_wsgi_application()
  File "/usr/local/lib/python2.7/site-packages/django/core/wsgi.py", line 13, in get_wsgi_application
    django.setup(set_prefix=False)
  File "/usr/local/lib/python2.7/site-packages/django/__init__.py", line 27, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/usr/local/lib/python2.7/site-packages/django/apps/registry.py", line 85, in populate
    app_config = AppConfig.create(entry)
  File "/usr/local/lib/python2.7/site-packages/django/apps/config.py", line 90, in create
    module = import_module(entry)
  File "/usr/local/lib/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
ImportError: No module named master
```
* 上記を見ると、my_app/masterというモジュールのロードに失敗しているようです。
* 確認した所、master/以下に\_\_init\_\_.pyがありませんでした。それでpythonモジュールとしてロードすることができず、処理がコケていたようです。
* master/\_\_init\_\_.pyを作成し、正常にデプロイされました。

# 結論
上記の例は単なる凡ミスによるエラーでしたが、uwsgiのログで「No python application found」とだけ出る場合、pythonアプリケーションのロード処理が失敗している可能性が高いので、**pythonインタラクティブシェルから詳細なエラー情報**を取得し、対処するのが良さそうです。
Tensorflow for windowsをインストール

Tensorflow 
https://www.tensorflow.org/install/install_windows

CUDA 9.0 for windows 10 x86_64 をインストール(今のところCUDA 9.1には対応していない。)
https://developer.nvidia.com/cuda-90-download-archive

cuDNN v7.1.1 (Feb 28, 2018), for CUDA 9.0
https://developer.nvidia.com/rdp/cudnn-download

cudnn-9.0-windows10-x64-v7.1.zipにある以下のファイルをそれぞれコピーする。
**cuda\bin\cudnn64_7.dll**
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin.

**cuda\ include\cudnn.h**
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\include.

**cuda\lib\x64\cudnn.lib**
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\lib\x64.

conda promptにて以下のコマンドをtype。認証付きプロキシは適当に。condaにもパッケージはあるが、バージョンが古いので推奨されていない。

```
conda create -n tensorflow pip python=3.6
conda activate tensorflow
pip install --proxy=http://USER:PASS@PROXYSERVER:PORT --ignore-installed --upgrade tensorflow
pip install --proxy=http://USER:PASS@PROXYSERVER:PORT --ignore-installed --upgrade tensorflow-gpu
pip install --proxy=http://USER:PASS@PROXYSERVER:PORT --ignore-installed --upgrade keras
```
hyperledger fabricの参考サイト

# 公式

- [Getting Started](https://hyperledger-fabric.readthedocs.io/en/release-1.0/prereqs.html)

# ブログ等

# スライド

- [ブロックチェーン実証実験から得られた知見](https://www.slideshare.net/Hyperledger_Tokyo/ss-74043006)
CosmosDB利用時に参考にした情報まとめ


# はじめに

業務でCosmosDBを用いることになったのですが、
その際に参考にさせていただいたCosmosDBに関する記事などのまとめです。

[公式ドキュメント](https://docs.microsoft.com/ja-jp/azure/cosmos-db/)も結構実例を踏まえて丁寧に説明してくれているのですが、
他の方の記事は、公式ドキュメントの言葉をかいつまんで説明してくださっているので、
腹落ちしやすい方も多いと思っています。（自分もその一人です。。。）

参考になれば幸いです。

# CosmosDB全体
- [ryuichi111stdの技術日記 - 「Azure Cosmos DB入門」目次](http://ryuichi111std.hatenablog.com/entry/2017/05/21/012928)

CosmosDBに携わった方は、お世話になった方も多いと思います。
ryuichi111stdさんの上記記事は、CosmosDBの概要から始まり、
SDKを用いたサンプル、サーバサイド側（ストアドなど）についての説明も記載して説明してくださっています。

公式ドキュメントの説明が難しく感じたり、とりあえず概要〜始めて見たいという方におすすめかなと思います。

# Azure Cosmos DB Emulator
- [(公式ドキュメント)ローカルの開発とテストでの Azure Cosmos DB Emulator の使用](https://docs.microsoft.com/ja-jp/azure/cosmos-db/local-emulator)
- [ryuichi111stdの技術日記 - Azure DocumentDB Emulatorを使ってみた。で、.NET Coreから操作した話。](http://ryuichi111std.hatenablog.com/entry/2016/12/08/035645)

Windows上で動作するCosmosDBのエミュレータです。
msi＋Docker版も用意されていますが、あくまでDocker For Windows上でのみ動作します。

会社用のAzureのアカウントや[Azureの1ヶ月無料アカウント(¥22500まで)](https://azure.microsoft.com/ja-jp/free/)があれば、
実際にAzure上でCosmosDBを使えば良いのですが、
そうでない方はエミュレータを用いると開発のスタートが切りやすいです。

んで、そのために参考した記事が上記2記事になります。

公式ドキュメントでは要件の確認とmsi等のダウンロード、
ryuichi111stdの記事を元に実際にエミュレータを動かしてみるてな感じで進めると躓くことがないかと思います。

# サーバサイド(ストアド・UDF・トリガー)の構文
- [ryuichi111stdの技術日記 - Azure Cosmos DB入門（4）](http://ryuichi111std.hatenablog.com/entry/2017/06/03/225500)
- [(公式ドキュメント)サーバー側プログラミング](https://docs.microsoft.com/ja-jp/azure/cosmos-db/programming)
- [(公式ドキュメント)SQLクエリ](https://docs.microsoft.com/ja-jp/azure/cosmos-db/sql-api-sql-query)
- [(公式ドキュメント)サーバSDKのドキュメント](http://azure.github.io/azure-documentdb-js-server/)

CosmosDBにもストアドやUDF(ファンクション)の定義ができ、JavaScriptで記述します。
その際、サーバサイドのSDKを利用してCosmosDBに対してのクエリ発行が行えます。

ryuichi111stdさんの記事で実例を踏まえて概要を理解し、
公式ドキュメントを読んで腹落ちさせるながらがベターかなと思います。

あと、サーバーサイド側を実装する際、
[(公式ドキュメント)サーバSDKのドキュメント](http://azure.github.io/azure-documentdb-js-server/)は必ず読んでおくことをオススメします。
。
（関数の仕様や意味、デフォルト値などが記載されているため）

# クライアント側(.net)のパフォーマンス改善
- [(公式ドキュメント)Azure Cosmos DB と .NET のパフォーマンスに関するヒント](https://docs.microsoft.com/ja-jp/azure/cosmos-db/performance-tips)
- [しばやん雑記 - Cosmos DB を利用する上で最初にはまった部分のメモ](http://blog.shibayan.jp/entry/20171011/1507653736)

CosmosDBをクライアント側(.net)で操作する際のパフォーマンスをあげるための方法が記述されています。
手早く改善させるなら、しばやんさんの記事の方法（DocumentClient辺りの扱い修正)、
本格的に改善するなら公式ドキュメントを参照することをおすすめします。

# おわり

本記事投稿時はまだCosmosDB使用中であるため、
他にも参考させていただいた記事があれば紹介したいと思っています。

他にも参考になる記事等ありましたら、コメントいただけると助かります！
WallPaperEngineもどきをサクッと作る

[GeekToolとYoutube-IFramePlayerAPIを使って、MacでWallpaper Engineを再現する](https://qiita.com/natmark/items/43f151ae663057a1883e)

という記事を拝見してLinuxでもできないかと思ってやってみた。

しかしながらgeek toolのようにウェブをディスプレイするのはLinuxにはないので、JavaFXのウィンドウで代用することにした。今回のリポジトリはこちら

https://github.com/ItinoseSan/geek-movie-window

# 準備
上に貼ったリンクのリポジトリをクローンする。リポジトリの場所は何でもいい

```
git clone git@github.com:natmark/wp_engine4geektool.git
```

JavaFXで壁紙と同じサイズのフルスクリーンウィンドウを作る

```java:Window.java
import javafx.application.Application;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Screen;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage){
        primaryStage.setTitle("DesktopMovie");

        StackPane root = new StackPane();

        // スクリーンの大きさのインスタンス
        // getWidth, getHeightで壁紙部分の大きさを取得する
        Rectangle2D screenBounds = Screen.getPrimary().getVisualBounds();
        Scene scene = new Scene(root, screenBounds.getWidth(), screenBounds.getHeight());
        // WebViewとEngineを使ってhtmlをレンダリングする
        WebView view = new WebView();
        WebEngine engine = view.getEngine();
        engine.load("cloneしたリポジトリのindex.htmlのファイルパス");
        // ex file:///home/user/wp_engine4geektool/index.html

        root.getChildren().add(view);
        primaryStage.setScene(scene);
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}
```
# 完成
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Wallpaperエンジンもどき <a href="https://t.co/7emewsaxjQ">pic.twitter.com/7emewsaxjQ</a></p>&mdash; Itinose (@ItinoseVM) <a href="https://twitter.com/ItinoseVM/status/973502926239838208?ref_src=twsrc%5Etfw">2018年3月13日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

こんな感じに動きます。
# 再生する動画を変えたい場合
元のものと同様、```wp_engine4geektool/video.js```のvidのところを変えてください。

```javascript
// 再生したいyoutubeの動画id
var vid = '2Vn5ca585kQ';
```
[Git] Git でチェックアウトしたファイル群から最も最近に更新されたファイルパスを取得する

CircleCI の checkout などで Git からチェックアウトしたファイルのタイムスタンプは元のファイルのタイムスタンプが維持されずチェックアウトした日時になってしまいます。

そのため、最も最近に更新されたファイルパスを得ることが次のコマンドで出来ません。

```bash
# カレントディレクトリの *.txt ファイルの内最も新しいタイムスタンプを持つファイルパスを得る
ls -1t *.txt | head -1
```

そこで、このコマンドを実行する前に次のスクリプトで Git に記録されているタイムスタンプを各ファイルにセットしてあげます。

```git-timestamp.sh
for FILE in $(git ls-files)
do
    TIME=$(git log --pretty=format:%cd -n 1 --date=iso -- "$FILE")
    TIME=$(date -d "$TIME" +%Y%m%d%H%M.%S)
    touch -m -t "$TIME" "$FILE"
done
```

このスクリプトを用意したら、次のようにすれば最も最近に更新されたファイルパスを得ることが出来ます。

```bash
$ bash ./git-timestamp.sh;
$ LAST_MODIFIED_FILEPATH="`ls -1t *.txt | head -1`";
```
Tinkercad > オブジェクトの回転軸の位置を変更する

ブラウザ動作するAutoDeskのTinkercad。

オブジェクトの回転はオブジェクトの中心に軸を置いて実施される。

オブジェクトの下端に回転軸を設定するにはどうするか?

### 例

- オブジェクトの高さが30mmとする
- 下から10mmを回転軸としたい

下記とする

1. オブジェクトの下に高さ10mmのオブジェクトを配置する
    - (30 - 10) - 10
        - (30 - 10): 回転物の高さの1/2
        - -10: 既存の下端物の高さ
2. 元のオブジェクトと手順1のオブジェクトをグループ化する
3. 回転する

 ![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/cc35b544-1c7a-2437-3a5b-2756addc0579.png)

手順1のオブジェクトはHoleにしておくと、将来の回転作業時にも軸設定を容易にする。

Holeとグループ化した場合は、回転軸はSolidの中心に来る。