OmniAICreator/Qiita-1.07M huggingface dataset:
JIRA SoftwareでStory Pointsを表示させる方法

# この記事について
[レクミーキャリア](https://recme-career.jp)を運営しているLeadingMarkでは、最近JIRA Softwareの導入にトライしております。
元々GitHub+ZenHub構成で頑張っていたのですが、今後のエンジニアチームの拡大や管理工数を考えると、JIRAに早めのタイミングで移行して、どういったタスクに時間を投下したのかの予実管理やレポートなどの機能からJIRAを使っていった方がいいかと考え、二週間ほど試験運用をしております。

本記事では、Story Pointsをつけたかったのにデフォルトでは表示されず数時間はまってしまっていたので、どうすれば管理できるようになるかをまとまたものです。
※開発チームでは１週間単位のイテレーションで回しており、見積もりとしてStory Pointsを利用したかったのです

以下画面キャプチャを掲載しておりますが、結論としては**「カスタムフィールド」のStory Pointsを対象の画面に設定して、構成より「新しいコンテキストの追加」で任意の課題タイプに追加**すればOKだったんですが、JIRAってどうもドキュメントがわかりづらく情報も少なかったため同じくはまった方が増えないようまとめてみました。

# どうやったか
<img width="1062" alt="storypoint6.png" src="https://qiita-image-store.s3.amazonaws.com/0/45068/55684eb7-fbd3-0f1e-f19b-68abe4db6f6f.png">
ストーリーポイント関連の記事を見ると、どうやらこのヶ所に表示されるようです。
が、弊社のプロジェクトでは表示されておらず、カスタムフィールドのStory Pointsの項目にて対象の画面を設定してみても表示されなかったです。

最終的にたまたま発見してStory Pointsを表示できるようになった手順はいかです。
<img width="878" alt="storypoint1.png" src="https://qiita-image-store.s3.amazonaws.com/0/45068/722d5712-55de-3525-c90e-59374e042ac7.png">
設定画面より**カスタムフィールド**を選択します。

<img width="1286" alt="storypoint2.png" src="https://qiita-image-store.s3.amazonaws.com/0/45068/24d84c06-f836-28a3-d1ba-ef24e259b9fa.png">
**構成**を選択します。

<img width="1051" alt="storypoint3.png" src="https://qiita-image-store.s3.amazonaws.com/0/45068/89fb2a2a-97ea-3185-e2f0-b4c5f270a5f2.png">
**新しいコンテキストの追加**を選択します。

<img width="795" alt="storypoint7.png" src="https://qiita-image-store.s3.amazonaws.com/0/45068/1f1dc5c3-2892-299f-25ef-01cf185a9e81.png">
設定スキームラベルは必須だったのでなんらか追加し、課題タイプはデフォルトのままで**任意の課題タイプ**を選択。
（ラベルにはそれっぽいものを記述した方がいいかもです）

<img width="1062" alt="storypoint5.png" src="https://qiita-image-store.s3.amazonaws.com/0/45068/216b8385-4842-69dd-a517-002aa5c8f68d.png">
対象の画面にStory Pointsを表示する設定ができれば、このようにバックログや各種画面でStory Pointsが表示されます。
MQTTfxとAWSIoTを連携させる

ゆくゆくNefryBTを使い、閾値を超えた⇒MQTTでメッセージを送信⇒AWSIoTにログを残す、というプロセスを作りたくて、その準備をします。

まず、 MQTTfxとAWSIoTを連動させるところから、、、、下記サイトを参考にさせて貰いました。

AWSIoTに登録するシーン。
[AWS IoTを始めよう -MQTTの設定(AWS IoT編)-](https://recipe.kc-cloud.jp/archives/9629)


スムーズに進められましたが、ド初心者な私は少し詰まったところがあったので、そこをまとめます。あくまで補足として読んで下さい。

###〇ルートCAの取得###

AWS IoTの「証明書」からルートCAをダウンロードすると、ルートCAが記述された新しいページが表示されるのみ、、、。`pem`形式でダウンロードされると理想的、、、、探してみたらみつかりました。

下記URLの`Licensing...`を選択します

<img width="963" alt="1.ルートCA.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/19825996-87dd-8d8f-d627-a032541692d5.png">

下記URLに遷移します。MQTTfxの登録に必要なのは`VeriSign Class 3 Public Primary Certification Authority - G5.pem`だけです。下にスクロールすれば該当バージョンのダウンロードが出来ます。私は念のため`Download a root package`で他のバージョンも一緒にダウンロードしました。

<img width="682" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/73502469-810f-381b-adec-c40092751fdd.png">

ダウンロードできました。下の階層へと進めばお目当ての`VeriSign Class 3 Public Primary Certification Authority - G5.pem`が見つかります。

<img width="760" alt="4.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/da73d2ac-a3c0-9488-efda-2bd763009324.png">

あとはこれらをMQTTfxに登録させるだけ！

MQTT.fxと連動させるシーン。
[AWS IoTを始めよう -MQTTの設定(MQTT.fx編)-](https://recipe.kc-cloud.jp/archives/9629)

###〇MQTTfxの登録方法###

`Client Certificate File`の`crt`を忘れないようにしましょう。また私の場合、格納場所が原因なのか何度かエラーを出しました(階層を変えたらうまく行きました、、、なぜでしょう、、、、)。

<img width="1680" alt="2.MQTTfxからpublish.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/2223bba0-e26c-fa66-3169-2ed745f840b1.png">

緑のランプがつけば接続OK、`Log`を押せば成功したかどうか確認もできます。

試しにMQTTfxからAWSIoTへPublishします。

<img width="1680" alt="2.MQTTfxからpublish.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/8cc09c09-9943-a863-6bf1-8c18a6ea4640.png">

任意のメッセージを設定して、Publish！

<img width="1680" alt="2.MQTTfxからpublish01.png" src="https://qiita-image-store.s3.amazonaws.com/0/201155/ef7dfc12-6658-bdca-5540-9378b96b762d.png">

無事成功しました。あとはこのMQTTをマイコンでセンサー感知した結果としてキックできればいいのですが、、、、そこが難しい、、、、、一歩ずつですね。
EncryptedSecretsがdevelopment環境で使えない時

config/secrets.yml.encを更新してもAPIキーがnilのまま

```text:console
$ rails c

Loading development environment(Rails 5.1.ホニャララ)
>> Rails.application.secrets
=>{:secret_key_base=>nil :secret_token=>nil}
```

実はconfig/environments/development.rbで「encrypted secretsを使うよ」って設定してやる必要があったらしい

```rb:config/environments/development.rb
Rails.application.configure do
  (いろいろな設定)
  ...
  config.read_encrypted_secrets = true ←これ
end
```

##参考にさせて頂いた記事
[rails 5.1のEncrypted secretsを試す -Qiita](https://qiita.com/yoan/items/1a98371fe7ac524379e9)
RailsでGoogle botからのアクセスを特定する方法

ごくまれですが、Railsで作ったサイトでSEOをする時にgoogle botからアクセスを出来る限り早く検出したい場合があります。

新しく公開したページがいち早くGoogleにクロールされて検索結果に表示されるようにしたいからです。

この記事ではrailsでbotからのアクセスを特定する方法を紹介します。

## アクセスログを利用する

最も分かり易い方法はアクセスログのユーザーエージェントを見る事です。ユーザーエージェントが[Google クローラ](https://support.google.com/webmasters/answer/1061943)に列挙されているものであればGoogle botからのアクセスです。

ニュース用、PC用、スマホ用、広告確認用、など結構多くのクローラーが動いています。

ただしユーザーエージェントは偽装できます。そのためアクセスログ上のユーザーエージェントでは本当にGoogle botが来たのかを特定できません。

正確に特定するにはアクセスログのIPアドレスからDNSリバースルックアップで googlebot.com または google.com である事を確認します。

詳細はSearch Console ヘルプにある[Googlebot かどうかの確認](https://support.google.com/webmasters/answer/80553?hl=ja)をご確認下さい。

アクセスログの設定でDNSリバースルックアップをする方法もありますが、外部との通信が発生するためロギングがとても遅くなります。

そのため出来る限り速く検出する方法としては不向きです。

## リクエスト時のユーザーエージェントで判定する

おそらくRailsでユーザーエージェントを判定するのに最も利用されているのが[browser](https://github.com/fnando/browser)です。

以下のコードのようにbotであればnameを調べるとGoogleからのアクセスであるか判定できます。

```rb
if browser.bot?
  if browser.name.include?("googlebot")
    ## ...
  end
end
```

これであればリクエスト時でgooglebotと判定できるのでアクセスログよりも速くGoogleにページがクロールされた事を特定できます。

ですが偽装されたアクセスである可能性は解決していません。

## IPも調べる

以下はRailsでリモートIPからDNSリバースルックアップするサンプルコードです。
ここで取得したドメインが googlebot.com または google.com であればgoogleのクローラーである事が担保されます。

```rb
@ip = request.remote_ip
@domain = Resolv::DNS.new.getname(@ip).to_s
```

DNSリバースルックアップは外部との通信が発生するため、リクエストがある毎に実行するととても遅くなります。逆引き結果をキャッシュし非同期処理にするなどの工夫が必要です。

## 便利なgemのlegitbotを利用する

ここで書かれている事を一通り行ってくれるgemの[legitbot](https://github.com/alaz/legitbot)がありました。Googlebotを装ったアタックをブロックする目的でも利用できるようです。

以下はGoogleを装ったアクセスであるかを確認するコードです。

```rb
@ip = request.remote_ip
Legitbot::Google.fake?(@ip)
```

## まとめ

便利なgemが揃っているrailsは何をするにしても便利ですね。
音楽プレーヤーなどで文字がはみ出た時にスライドさせたい

[この動作](https://axtuki1.github.io/qiita/player-scroll/)をCSSだけで実現できます。
ただ必要ない幅の時に動かさないというのはJavaScriptが必要です。

```html:html
<div class="title-wrapper">
  <div class="title scroll">
    タイトル
  </div>
</div>
```

```css:CSS
.title-wrapper {
  overflow: hidden;
}

.title {
    display: inline-block;
    transform: translate3d(0,0,0);
    -webkit-animation: scroll 15s linear 2s infinite;
       -moz-animation: scroll 15s linear 2s infinite;
            animation: scroll 15s linear 2s infinite;
}

@keyframes scroll {
    0% {
        transform: translateX(0%);
    }
    81% {
        transform: translateX(-100%);
        opacity: 1;
    }
    82% {
        transform: translateX(-100%);
        opacity: 0;
    }
    89% {
        transform: translate3d(0,0,0);
        opacity: 0;
    }
    90% {
        transform: translate3d(0,0,0);
        opacity: 1;
    }
}
```
この状態では常にアニメーションするようになっています。
titleクラスの`display: inline-block;`はinlineでは動作しません。
JavaScriptと合わせて使う場合はinline-blockが無難かも(要検証)
title-wrapperクラスでは`overflow: hidden;`を入れておかないと左にスライドした文字が見えてしまいます。

JavaScriptを使用する場合はCSSを

```css:CSS
.title {
    display: inline-block;
}

.title.scroll {
    transform: translate3d(0,0,0);
    -webkit-animation: scroll 15s linear 2s infinite;
       -moz-animation: scroll 15s linear 2s infinite;
            animation: scroll 15s linear 2s infinite;
}
```
のようにしておき、titleクラスのついた要素にscrollクラスを足す処理を書いてみてはいかがでしょう。
WBSの勘所（５選）

![photo.jpg](https://qiita-image-store.s3.amazonaws.com/0/215919/29aa4810-e4f8-da78-edd3-7915001563c2.jpeg)

WBSの勘所として、私がWBSを作る際に意識している点をまとめてみました。

## WBSの勘所
1. プロジェクトのゴールを定義する
2. ゴールまでの作業を洗い出す
3. 作業を単位当たり１人日程度にバラす
4. 作業の依存関係を設定する
5. WBSを随時更新する

## WBSとは

まずはWBSの定義から。

> WBSとは、プロジェクトマネジメントで計画を立てる際に用いられる手法の一つで、プロジェクト全体を細かい作業に分割した構成図。
> 
> WBSでは、まずプロジェクトの成果物をできるだけ細かい単位に分解していく。その際、全体を大きな単位に分割してから、それぞれの部分についてより細かい単位に分割していき、階層的に構造化していく。成果物の細分化が終わったら、それぞれの部分を構成するのに必要な作業（一つとは限らない）を考え、最下層に配置していく。個々の部分を構成する一連の作業のかたまりのことを「ワークパッケージ」と呼ぶ。WBSのそれぞれのワークパッケージに担当する人員を配置していけば、プロジェクトを遂行する組織図ができる。これをOBS（Organization Breakdown Structure）と呼ぶ。([IT用語辞典 e-Words](http://e-words.jp/w/WBS.html)より)

## 1. プロジェクトのゴールを定義する

　「プロジェクト全体を細かい作業に分割したものをWBSと呼ぶ」と定義されている通り、WBSはプロジェクトがあってこその構成図です。そのため、まずはプロジェクトのゴールを設定するところから始めます。

　と言っても難しいことはせず、ただ単純に関係者に対してプロジェクトの目的やゴールをどう考えているかを聞き、理想的なゴールを定義するイメージです。

　例えば「カレーライスを作る」と言うプロジェクトがあった場合、そのゴールは「カレーライスを作る」までなのか、「カレーライスをテーブルに並べる」までなのか、「後片付けをする」までなのかを決めると言った感じです。カレーの辛さを決めることも大事ですね。

## 2. ゴールまでの作業を洗い出す

　プロジェクトのゴールが決まれば、ゴールまでに必要な作業を洗い出します。ここでは作業の大小や前後関係を考えず、ブレーンストーミングさながら思いつくままにリストアップします。どんなに大雑把でも、無理難題な作業でもいいので、完了までの道を書きます。詳細が不明確な作業も現時点で要否を判断せず、リストに含めます。

　大事なことは **「ゴールまでの道を想像しながら作業を書き出す」**ことです。当たり前ですが、ゴールまでの道が書けなければプロジェクトがゴールすることはありません。粒度は荒くてもいいので、このタイミングで必ずシミュレーションを行い、ゴールまでの道を書くようにします。

　もし「カレーライスを作る」プロジェクトで「ご飯を作る」作業が抜けてしまった場合、「カレーは飲み物か」問題が発生して大変ですね。

<img width="300" alt="「カレーライスを作る」プロジェクトのWBS" src="https://qiita-image-store.s3.amazonaws.com/0/215919/eb513f29-4fc7-24e6-9f87-1f85ba5d6fe5.jpeg">

## 3. 作業を単位当たり１人日程度にバラす

　ゴールまでの作業を洗い出した後はこれらリストを細かく分解します。目標は１作業当たり１人日程度の作業ボリュームです。１人日程度のボリュームであれば、その作業が妥当かどうかを判断しやすいからです。作業工数が大きければ大きくなるほど、その数字が妥当なのかどうか判断が難しくなります。

　もちろん「そうは言っても…」という作業は往往にしてあります。その場合は潔く諦め、無理せずそにのままにしておきます。１人日はあくまでも目標値です。

　「カレーライスを作る」プロジェクトは恐らく１人日以下のプロジェクトでしょう。このような場合は作業の単位を「日」から「時間」に変更します。

## 4. 作業の依存関係を設定する

　作業が出揃った後は、各作業の依存関係を設定します。作業によっては他の作業が完了しないと着手できない場合もありますし、他の作業と同時に着手できる作業もあります。これら依存関係はプロジェクトの作業期間に影響するため、可能な限り洗い出すようにします。

　「カレーライスを作る」プロジェクトの「ご飯を作る」と「カレールーを作る」は同時に開始することができますが、「お皿に入れる」作業はこれら２つの作業が完了していないと着手できません。

<img width="400" alt="「カレーライスを作る」プロジェクトのWBS" src="https://qiita-image-store.s3.amazonaws.com/0/215919/9ff7059d-9fc1-4a0a-e145-529d73d34945.jpeg">

## 5. WBSを随時更新する

　WBSは**「生き物」**です。日々刻々と変化する状況の中、時間の経過とともに作業が変わるのは世の常です。今まであやふやだった作業も着手前になれば明確になります。私の場合、作業に変化が生じると即座にWBSへ反映させるようにしています。そのため、私が作成するWBSはプロジェクト開始前に作ったものは作業の粒度が荒く、時間の経過と共に粒度が細かくなり、プロジェクトが完了する頃には全てが実際に行った作業に置き変わる感じです。

　ただし、人月ベースの作業見積もりを行う場合は、プロジェクト開始前に作ったWBSが使われることが一般的です。それが原因で、プロジェクト開始前のWBSは往々にして一人歩きします。更にはWBSの変更が簡単に受け入れられないケースもありますので注意が必要です。WBSを随時変更すると「計画的に実行できていない」と見られるんですね。私には「プロジェクトが柔軟に対応できて健康的」と見えるのですが。

　とは言え、「カレーライスを作る」プロジェクトでWBSが頻繁に更新される場合、開発期間が数時間ですので流石に「計画的に実行できていない」と言われても仕方がありませんね…。

## 終わりに

いかがでしたか。以上に挙げた勘所が皆さんの参考になれば幸いです。

ではまた▷L◁
Error: Command '['/home/*/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.

# 問題

python3でvenvができない。

```py3:実行コマンド
python3 -m venv py3-flask
```

```shell-session:実行結果
Error: Command '['/home/*/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.
```

# 解決

```py3:実行コマンド
python3 -m venv --without-pip py3-flask
```

# 出典

 * (https://qiita.com/Inninnkozou/items/b6903d08dc24a0755748)[Pythonでvenvするときにエラーが出た]
(Twitterとかに)zipファイルを(画像ファイルに変換して)アップロードできるツールをつくりました🍞

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/91558/79025a7c-f4b7-99bf-a99e-1b0ab3d1d60b.png)

# 概要
**ファイルを直接アップロードするわけじゃありません。ファイルを画像に変換して共有するという話です。**

共有したい圧縮ファイル(.zip)を画像に変換して、TwitterとかのSNSにアップロードする。
そのファイルをほしい人が、その画像をダウンロードして再びファイルに変換する。
つまり、**SNSなどの画像アップロード機能を使うことによってファイル共有ができる。**
(ファイル共有サービスを使った方が早い話はここでは禁句です:frowning2:)

Twitterはある程度の容量以下(3MB以下?)の透過png画像はアップロードしても圧縮処理されません。
参考: [2016年版　Twitterに高画質な画像をアップする方法【透過PNG】:どMなキョンのブロマガ - ブロマガ](http://ch.nicovideo.jp/dom_kyon/blomaga/ar1031125)

よって、3MB以下ぐらいの圧縮ファイルなら画像にして共有することが可能です。

# 作ったもの:baby:
GitHubページを作りました。↓
**[ZIP⇔画像変換器](https://redshoga.github.io/zipimage/)**

現時点でzipとpng変換のみ対応しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/91558/23e01dbe-2dbd-42d0-1ac4-6b5be0171513.png)


[猫の画像をzipにして、変換した画像](https://raw.githubusercontent.com/redshoga/zipimage/master/samples/neko.png)
この画像をファイルに変換すると、3枚の猫の画像が見れるはずです。


# やっていること
ユーザから指定ファイルをバイナリとして読み込み、画像の画素値に変換しています。
画像の1画素はRGB値(加えて透過値を持つ場合も)を持ち、それぞれ8bitで保存されています。
つまり**1画素は24bit(32bit)の情報を持たせることができます**。
ファイルの情報をそこに置き換えてあげようという話。

データを画素値に変えてるところです↓詳しくは[サイトのソース](https://github.com/redshoga/zipimage)をみてください。

```js:
var data = new Uint8ClampedArray(file_reader.result);
var data = concatTypedArrays(data, magicnumber);

// canvasの大きさ(正方形)
var img_size = Math.ceil(Math.sqrt((data.length/3.0) + 1));

// canvasのcontextの取得
var canvas = document.getElementById("canvas");
canvas.width = img_size;
canvas.height = img_size;
var ctx = canvas.getContext("2d");
var imgData = ctx.createImageData(img_size, img_size);

// データを画素に変更
var tmp_idx = 0;
for (var i=0;i < data.length; i+=3) {
  imgData.data[tmp_idx++] = data[i];   //red
  imgData.data[tmp_idx++] = data[i+1]; //green
  imgData.data[tmp_idx++] = data[i+2]; //blue
  // imgData.data[i+3] = data[i+3]; //alpha // 透過を指定するとputImageDataで画素値が変わる現象がある
  imgData.data[tmp_idx++] = 255;
}
```

ちなみに上のソースにも書いてありますが、**画像の透明度まで使うと画像の画素値が微妙に変わります**。ChromeやIEでも確認しました。バグが分からないのですが、わかる人教えてください。

# その他
Androidの公式Twitterクライアントで画像をDLしたらjpgになっていました。画像はWebクライアントからDLしてください。

# あとがき
正確には覚えていないのですが、**昔の仕様のGoogleフォトだと4000x4000pxぐらい以下の画像が無劣化でほぼ無限に保存できました**。これを利用して、バックアップデータを全部画像にして保存しておこう！と考えたのがこのネタの元ネタです。(最終的に利便性が悪すぎるため辞めました。またその当時の利用規約には違反していないと思います。)

今ではおそらくどんなサイズの画像も容量無制限の枠だと圧縮されます。そのためもちろん今回の方法でファイルを画像に変換してGoogleフォトにアップロードしたら、データが壊れます。圧縮されても大丈夫なような変換でやったらできると思います。(画像電子透かしみたいな)

またこの応用でファイルデータを動画に相互変換できたら、もっと容量が上げられるはずです。**(誰か作ってください)**

# 宣伝
良かったらフォローお願いします:bow_tone1: [@redshoga](https://twitter.com/redshoga)
SlimファイルをSublimeTextで視認性良くするためにシンタックスハイライトを設定

会社でSlimファイルを使ってまして
SublimeTextで幸せになるようにシンタックスハイライトを設定しました:relaxed:

#ハイライトされてない状態
<img width="731" alt="スクリーンショット 2017-11-15 10.06.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/205486/51005dee-5a9c-d40c-17cc-342b18c2e399.png">
真っ白ですね〜。でもSlimの性質上（性質？）インデントは美しいです:relaxed:
Slimはインデントを使用した簡略構文となってまして
`<``>``/>`といったタグは書きません。インデントを入れ子にすることで閉じタグを表現します。
なので強制的に美しいインデントが出来上がるのですが、`<``>``/>`がないのでテキストの可読性が悪くなります

そこでシンタックスハイライトの登場です！
SublimeTextにインストールしましょう〜:clap:

#SublimeTextを開く
![Sublime_Text_3_logo.png](https://qiita-image-store.s3.amazonaws.com/0/205486/5258f103-9882-c461-71c5-75564d11de7a.png)
いつの間にかSublimeTextのアイコンが変わってました:wink:

コマンドパレットから`Package Control: Install Package`を選択します。

#`Ruby Slim`を検索して選択
<img width="499" alt="スクリーンショット 2017-11-15 10.08.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/205486/28fb379b-02c8-4b4e-c3d4-e0815ba71444.png">

#インストールされたらSublimeTextを再起動
<img width="701" alt="スクリーンショット 2017-11-15 10.04.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/205486/a6a18660-4dc4-9dac-7e50-60258321b2c2.png">

これでシンタックスハイライトされました:art:やった〜:v:
調査：仮想化技術について

　お疲れ様です、Fortranです。
　最近、寒くなってきましたね…皆様はいかがお過ごしでしょうか。こんな時はおでんが欲しくなってくる、今日この頃です。

　今回は、仮想化技術について自身の経験と勉強を踏まえて、記載していきたいと思います。インフラの構築をする際、「結局仮想化するソフトや機能はいっぱいあるけど、どんなものがあるんだっけ？」というのを一旦整理したいなぁというのが目的です。

# VMwareの仮想化技術
## VMware ESXiとは
　個人的には最初に触った仮想化ソフトウェアですね。自宅PC上でも仮想化環境を作り出すホスト型のVMware Playerもありますが、今回はハイパーバイザー型のVMware ESXiをご紹介したいと思います。
　よく知られているとは思いますが、ハイパーバイザー型は仮想化のためのOSのようなものをサーバにインストールして、その上に仮想化マシンを構築・稼働させる技術ですね。
　http://www.pcserver1.jp/special/vmware_license

##メリットと注意点
　VMware ESXiの機能としては、vMotionとよばれる機能が有名でしょうか。共有ストレージを用意する必要がありますが、そこに置かれている仮想化サーバを物理サーバ間で移動することができます。イメージは、RAIDコントローラが故障したりマザーボード不良によって物理サーバが完全にお亡くなりになったときに、予め用意した物理サーバの上に移る感じです。
　ただし、vMotionを利用するにはvMware ESXi Standard以上のソフトウェアを購入する必要があります。するとやっぱり気になるのはお金。1CPUあたりにライセンス利用料金が掛かってきます。さらに4台以上を1台の物理サーバに乗せたい、となるにも、VMware ESXi Standard以上の有償ライセンスを購入する必要が出ます。高可用性は魅力的な機能ですが、予算と相談するとこなんですねぇ、いつも。。
　![VMware-Basics_ENG_b6fedc27ff.jpg](https://qiita-image-store.s3.amazonaws.com/0/213134/a379d036-089e-c124-0965-b3c57d5c177e.jpeg)
（引用：https://www.starline.de/en/products/software/server-software/vmware/vmware-esxi-basics/）

# Oracle Solarisの仮想化技術
## Solaris Zoneとは
　システム上、Solarisサーバで構築しないといけないとき、私はよく触っているのが、このSolaris Zoneですね。
　Oracle Solarisは、"Solaris Zone"とよばれるサーバ仮想化機能を標準で備えています。この機能は、zoneと呼ばれる仮想Solaris環境を、１つの物理サーバ上に最大8191個を構築することができます。

## メリットと注意点
　これまで、Solarisサーバを個別に運用してきた環境から、1つの物理サーバに集約を掛けることによって、使用するサーバラックの台数を削減するなど、インフラ周りの費用を抑えることができます。
　特徴としては、VMwareやHyper-V等の仮想化ソフトウェアを必要としないということでしょうか。仮想化ソフトウェアは1CPUあたりのライセンス代がいくら掛かる、構築できるサーバ上限はいくらか、などの費用・制約が課せられることがないというメリットがあります。一方で、VMwareのVMotionのような機能はありません。サービス継続性の観点で、そのサーバの停止時間が決まっているのであればおススメできないかも…。
　![f2-2008577.gif](https://qiita-image-store.s3.amazonaws.com/0/213134/1d2c7b17-5c7f-f538-d8f7-63ead62553f1.gif)
(引用：http://www.oracle.com/technetwork/articles/servers-storage-admin/sol-adv-network-monitoring-2008573.html)

## コマンド
下記のページが参考になりますので、興味ある方は参考にされるといいかも。
http://www.fujitsu.com/jp/documents/products/computing/servers/unix/sparc/technical/document/00_solaris11_zone_operation.pdf

- グローバルゾーンサーバ上でzonesパッケージをインストールされているか確認する。

```
 global# pkg info system/zones
```

- ゾーンの状態確認

```
 global# zoneadm list -cv
```

- マウントポイントの確認

```
 global# zfs list
```

- ゾーンの構築と設定

```
 global# zonecfg -z zone01
 zonecfg:zone01> create
 zonecfg:zone01> set zonepath=/zones/zone01　#ゾーンパスの設定
 zonecfg:zone01> set pool=pool_1 #リソースプールの関連付け
 zonecfg:zone01> set ip-type=exclusive #IPタイプの設定
 zonecfg:zone01> info #設定内容の確認
 zonecfg:zone01> verify #ゾーンの設定の検証
 zonecfg:zone01> commit　#ゾーンの設定の確定
 zonecfg:zone01> exit
 global#
```

- ゾーンのインストールと起動

```
 global# zoneadm -z zone01 install
 global# zoneadm -z zone01 boot
```
form_with で utf8=✓ を消す書き方は skip_enforcing_utf8: true のみ

| 書き方 | 動作 |
|:--|:-:|
| form_with(enforcing_utf8: false)              | × |
| form_with(html: {enforcing_utf8: false})      | × |
| form_with(html: {skip_enforcing_utf8: true})  | × |
| form_with(skip_enforcing_utf8: true)          | ◎ |

いったいどれが正解なのかと考えられるパターンをすべて試して最後にたどりつけました。

## 参照

rails/form_helper.rb at master · rails/rails
https://github.com/rails/rails/blob/master/actionview/lib/action_view/helpers/form_helper.rb#L1541

form_withでutf8=✓を消す方法
https://qiita.com/sukechansan/items/546f5f60f3fae95af87a
”iphoneを探す”ボタンを作った

![スクリーンショット 2017-11-23 19.44.22.png](https://qiita-image-store.s3.amazonaws.com/0/148503/56c7f0fc-8042-c299-873b-0d433551436a.png)

### 作ったもの：
自分のiphoneに電話をかけられるボタン

### 動機：
iPhoneを家の中で無くしすぎる
ラズパイに触りたい
Amazon Dash Buttonをポチポチしたい

### 実際の挙動：
[![your browser is unsupported to show video](http://img.youtube.com/vi/EBqbtogMm3c/0.jpg)](http://www.youtube.com/watch?v=EBqbtogMm3c)

### 費やしたリソース
・twillio課金***2000円*** （20ヶ月電話サービスを使える）
・dash button本体 ***500円***
・休日の ***7時間*** （バカ）

### この記事のポジション：
似たような記事がいくつかありますが、ITリテラシーの低い自分としては、複数の記事を調べることになったので、各工程に対して最も参考になる記事を紹介できればと思います。

### 作業手順

①Amazon Dash ButtonをハックしてARPリクエストからMACアドレスを特定する
https://qiita.com/tokio-takeda/items/02bae474f8f20f35a02c
- 細かい説明は飛ばして、セットアップ用のコマンドが羅列されているので、コレに従っておけばいいです。

②ARPリクエストをラズパイで受け取ってPOSTする
https://qiita.com/yosi-q/items/d84f422b3be1dfb198aa
- この記事が一番詳しいです。dasherの設定ファイル（config.json)の各要素について説明があるのがナイス。

③twilioで電話をかける
http://tech.sanwasystem.com/entry/2016/01/28/211457
- この記事を参考にすればなんとかなります。逆にわからなかったらコメントください。

--- 

### 個人的に詰まったところ

config.json
```
{"buttons":[
  {
    "name": "callIFTTT",
    "address": "xxxxxxx",
    "protocol":"udp",
    "url": "https://maker.ifttt.com/trigger/testButton/with/key/-xxxxxxxxxxxx",
    "method": "GET"
  },
  {
    "name": "Command Exec Button",
    "address": "68:54:fd:6e:f6:x3",
    "cmd": "/home/pi/dasher/dash_button.sh",
    "protocol":"udp"
  }
]}
```
上記で
・`/home/pi/dasher/dash_button.sh` を相対pathにしてたら動かなかった
・`"protocol":"udp"` を省略している記事もあるが、省略すると動かなかった
・`cmd` で実行される対象を.pyにしたら動かなかった（.shの中で.pyを読んでます）

基本的にコード書くのはconfig.jsonだけなのに、これだけミスっててすごい。

--- 
### 最後に予告
今度Amazon Echo DotとRM MINI3が家に届くので、それについても何か書くと思います。
AWKで素数列挙(エラトステネスのふるい・疑似素数による試し割り)


需要あるのかしら(´・ω・｀) まずはエラトステネスのふるい。

```awk
BEGIN {
  upper_bound = 100

  for (i = 2; i <= upper_bound; i++) is_prime[i] = 1;

  for (i = 2; i <= sqrt(upper_bound); i++) {
    if (!is_prime[i]) continue;
    for (j = i * 2; j <= upper_bound; j += i) is_prime[j] = 0;
  }

  for (i = 2; i <= upper_bound; i++) {
    if (is_prime[i]) print(i);
  }
}
```

実装は以上。実行結果は以下の通りになります。

```bash
$ awk -f eratosthenes.AWK
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
```

次に試し割りですが、ここでは疑似素数、つまり__「2と3と、3 より大きくて 2 でも 3 でも割り切れない全ての整数」__により次々割っていく方法を採用しています。

```awk
BEGIN {
  upper_bound = 100

  for (i = 0; i <= upper_bound; i++) {
    if (is_prime(i)) print(i);
  }
}

function is_prime(x,     prime, step) {
  if (x < 2) return 0;
  if (x == 2 || x == 3 || x == 5) return 1;
  if (x % 2 == 0 || x % 3 == 0 || x % 5 == 0) return 0;

  prime = 7
  step = 4
  while (prime <= sqrt(x)) {
    if (x % prime == 0) return 0;
    prime += step
    step = 6 - step
  }

  return 1
}
```

これも実行結果は以下の通りになります。

```bash
$ awk -f prime.AWK
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
```

***

確認用のRubyコードをここに張り付けておきますね(´・ω・｀)

```bash
$ ruby -e 'require "prime"; Prime.each(100){|x| puts x}'
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
```

ちなみに次のようにしても素数列挙は可能です(´・ω・｀)

```bash
$ seq 1 100 | xargs factor | awk 'NF==2{print $2}'
2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
```
Static Routing - route addコマンドについて- 

業務でインフラエンジニアの方のお手伝いをする必要があったので、
関わりそうなことをあらかじめ調べてみた。
DBサーバにroute addして通信許可を行うため、route addについてのみ調べた。

## route addコマンドとは？

- クライアントPCやサーバなどに設定することができるコマンド
- 特定の宛先ネットワークに対して、デフォルトとは異なるゲートウェイのIPアドレスを指定する

## どんな時に利用する?

- デフォルトゲートウェイを設定しているだけでは通信要件が満たせない場合
- ゲートウェイのルータが制御できない場合
- あくまでもルータ側でルーティングの制御ができるなら、`route add`による設定は不要

## コマンドオプション

- `p`:OSの再起動後にもroute addのルートが保持される（検証時以外は必須）
- `f`:`route add`によるルート追加前に現在の経路情報を全て削除してしまう（基本使わない）

## 正しく設定するために確認するには

- route printコマンドで確認
  - Persistent Routesの項目に入っていると、再起動後も削除されない

## 逆に削除するときは、、、？

- `route delete`コマンドを使って削除

## キーワード

- スタティックルーティング
  - 宛先ネットワークへの最適なルートを手動で設定したルート
  - ネットワークの状態に変化があった場合でも、自動的に変わることはない
  - 対義語→**ダイナミックルーティング**
- ルーティングテーブル
  - ネットワーク上の道案内をする時に使う地図
- ゲートウェイ
  - 規格の違うネットワークを中継する機械 
- デフォルトゲートウェイ
  - ネットワークの出入り口
  - どこにデータを届ければ良いか分からない時のとりあえずの送り先
Spring AOP Annotationのbindingについて

# 概要
クラスやメソッドに自作annotationをつけ、annotationにて指定した文字を使用する。

- 環境
    - Spring AOP 4.3.5
    - cglib 2.1_3

クラスにつけたannotationと、メソッドにつけたannotationでは取得方法が異なっており、そこで躓きました。。


###Class版
```java:クラスにつけるannotation
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface ClassAnnotation{
    String value() default "defalut";
```
```java:Aspect対象のクラス
@ClassAnnotation("Class_01")
public class SampleController {
```
```java:Aspectの実現部（PointCatはAroundで実施）
@Around("@within(ann)")
public void classIntercepter(ProceedingJoinPoint pjp, ClassAnnotation ann) throws Throwable{
    System.out.println(ann.value());
    pjp.proceed();
```


###Method版
```java:メソッドにつけるannotation
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodAnnotation {
    String value() default "defalut";
```

```java:Aspect対象のメソッド
@MethodAnnotation("Method_01")
public void sampleMethod(
```

```java:Aspectの実現部（
@Around("@annotation(ann)")
public void MethodIntercepter(ProceedingJoinPoint pjp, MethodAnnotation ann) throws Throwable{
    System.out.println(ann.value());
    pjp.proceed();
```

###値を使用しない場合はannotationクラスのフルパス設定をする
```java:Aspectの実現部(クラス)
@Around("@within(com.example.annotation.ClassAnnotation)")
public void classIntercepter(ProceedingJoinPoint pjp) throws Throwable{
    pjp.proceed();
```
```java:Aspectの実現部(メソッド)
@Around("@annotation(com.example.annotation.MethodAnnotation)")
public void classIntercepter(ProceedingJoinPoint pjp) throws Throwable{
    pjp.proceed();
```
# 参照：
[ちょっと特殊なJavaのアノテーション](https://qiita.com/kashira2339/items/6450714e42c37b441514)
[Spring AOP ポイントカット指定子の書き方について](https://qiita.com/rubytomato@github/items/de1019aeaaab51c8784d)
[AspectJを使ってAnnotationを活用しよう 前編](http://jupitrisonlabs.hatenadiary.jp/entry/20120126/1327582321)
IBM i のデフォルトnode.jsバージョンを変更する


IBM i 上では複数のnode.jsバージョンをインストールできますが、
そのデフォルトバージョンを切り替える方法を書き留めておきます。

node.jsのインストールディレクトリにnodever.shというシェルスクリプトが用意されています。

`CALL QP2TERM`でPASEターミナルを開始し、node.jsのインストール・ディレクトリに移動します。
binディレクトリにはnodeやnpmの他にnodever.shが置かれています。

listパラメータを付けて実行すると、対話型でバージョンを変更できます。
表示された一覧の*(アスタリスク)がついているバージョンが現行のnodeバージョンです。

以下はバージョン4からバージョン6へ変更する場合の例です。

```shell-session
$                                                            
cd /QOpenSys/QIBM/ProdData/OPS/Node6/bin                     
$                                                            
ls                                                           
node         node-red     node-red-pi  nodever.sh   npm      
$                                                            
./nodever.sh list                                            
You have the following versions of Node.js installed.        
 [0]  Node.js v0.12.17  with npm v2.15.1        is installed.
*[1]  Node.js v4.6.1    with npm v2.15.9        is installed.
 [2]  Node.js v6.9.1    with npm v3.10.8        is installed.
                                                             
                                                             
                                                             
Select the version of Node.js you want to use: (0~2)         
2                                                            
Node.js v6.9.1  with npm v3.10.8 will now be used. 


```
portainerを使ってローカル環境でDockerコンテナの管理

# 新しくMacBookを買いました。

ローカル環境状のライブラリやアプリケーションの実行環境などをDocker使ってサクッと用意しちゃおうというのと。
GUIでリソースの使用状況の確認やコンテナの起動停止など最低限のことができると便利だなと思い。
一番準備が簡単そうな「portainer」を使ってみました。
https://portainer.io/

# 準備

Docker For Macのインストール
https://www.docker.com/docker-mac

```
 brew cask install docker
```

# portainerのコンテナ起動

```
docker volume create portainer_data
docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer
```

これで準備完了。確かに簡単だ

http://localhost:9000 へ、remoteのホストも管理することができるようですが、今回はlocalを選択。
こんな感じでいい感じにできましたっと。

<img width="1263" alt="スクリーンショット 2017-11-23 19.15.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/19855/77a58d18-00e5-4919-2aed-d80e90e5235e.png">

<img width="1009" alt="スクリーンショット 2017-11-23 19.15.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/19855/602fa4e7-a761-3096-1318-e78c5b448d39.png">

# App Templates

<img width="977" alt="スクリーンショット 2017-11-23 19.15.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/19855/f1387783-8612-6287-f199-80e345d7c996.png">

「App Templates」という幾つかのアプリケーションの雛形が用意されており、Apacheやら、Jenkins, Redmineなどのアプリケーションをボタン一つで構築することができる。
ポートフォワードの設定なども自動(カスタム化)でやってくれるので、とりあえず欲しいってときにすぐに準備ができるので良さげでした。
予め設定されているテンプレートの設定ファイルはこんな感じ。
https://raw.githubusercontent.com/portainer/templates/master/templates.json
テンプレートを自分で作成して登録することもできる模様。
IntelliJ IDEAでWebRTC APIのコード補完をする

現在(IntelliJ IDEA 2017.2.6 Build #IU-172.4574.11)、 JetbrainsのIDEは WebRTC API のサポートしていないが、IntelliJ IDEA上でDefinitelyTyped(型定義ファイルを集積しているサイト)のライブラリを設定をするとある程度の補完が可能。
※ より適切な方法がみつかれば追記します。

# 以下の様に補完されるようになります。
![IntelliJIdaa.gif](https://qiita-image-store.s3.amazonaws.com/0/26393/1500b545-4d2d-f168-daf8-07588b8dec8d.gif)

# 手順
### 1. Preferences | Languages & Frameworks | JavaScript | Libraries の順に選択

 Preferences | Languages & Frameworks | JavaScript | Libraries を選択し Download をクリック

![Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/26393/9e47b171-6d0b-2afd-2759-26e570c4bb75.png)

### 2. Name が "webrtc"のアイテムを選択後、Download and Install をクリック

![Download_Library.png](https://qiita-image-store.s3.amazonaws.com/0/26393/bc8500fb-3b4b-9784-805c-f3526fec8a1a.png)

### 3. 追加されたwebrtc-DefinitelyTypedのEnabledにチェックが入っていることを確認し、Apply か OKをクリック
![Preferences.png](https://qiita-image-store.s3.amazonaws.com/0/26393/626add00-46ac-9834-9766-c4cc20790e60.png)

# 参考
- Missing javascript code completion for WebRTC and others
https://intellij-support.jetbrains.com/hc/en-us/community/posts/207082215-Missing-javascript-code-completion-for-WebRTC-and-others

- How WebStorm Works: Completion for JavaScript Libraries
https://blog.jetbrains.com/webstorm/2014/07/how-webstorm-works-completion-for-javascript-libraries/
PlantUMLを使ってみる(MacOS) ~Visual Studio Codeでもっと使いやすく~

##PlantUMLのjarファイルを入手
http://plantuml.com/download

##Graphviz(dot)をインストール

###シーケンス図以外を書く場合に必要
※xcodeコマンドラインツールがインストールされていない場合はインストール

```
$ xcode-select --install
```

```
$ brew install graphviz
```

###graphvizが使えるようになっているか確認

```
$ java -jar plantuml.1.2017.19.jar -testdot
```

##試しに使ってみる

```text:testUML.txt
@startuml plantuml_simple.png

Foo -> Bar : コメント
Foo <-- Bar

@enduml
```

###画像ファイル生成

```
$ java -jar plantuml.1.2017.19.jar testUML.txt
```
確認すると
![plantuml_simple.png](https://qiita-image-store.s3.amazonaws.com/0/200306/9cad5433-fcc8-f06f-9ffd-f243a40123f2.png)

###クラス図も描いてみる

公式サンプルから
http://plantuml.com/class-diagram

```text:testUML_class.txt
@startuml
Class01 <|-- Class02
Class03 *-- Class04
Class05 o-- Class06
Class07 .. Class08
Class09 -- Class10
@enduml
```

同様に画像生成

```
java -jar plantuml.1.2017.19.jar testUML_class.txt
```
![testUML_class.png](https://qiita-image-store.s3.amazonaws.com/0/200306/9b063937-d777-a79b-0e8c-cc034640da1d.png)

生成できた!

## Visual Studio Codeでプレビューしながら使う

### インストール

「拡張機能」から、検索バーに「PlantUML」と入力
「PlantUML(jebbs.plantuml)」をインストールしてVisual Studio Code再起動

### 確認

Visual Studio Codeでは、
拡張子を「.pu」とすると、PlantUMLファイルとして認識してくれる
先ほどのクラス図を元に、「testUML_class.pu」を作成し、Visual Studio Codeで開く

```text:testUML_class.pu
@startuml
Class01 <|-- Class02
Class03 *-- Class04
Class05 o-- Class06
Class07 .. Class08
Class09 -- Class10
@enduml
```

そして、「option + D」
で、PlantUMLプレビュー表示（こんな感じです）
<img width="1023" alt="スクリーンショット 2017-11-28 0.55.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/200306/edd99e71-26fe-ad90-5983-b2ed781cfc57.png">

テキスト編集すると、自動で図も入れ替わる（ちょっとラグはある）

## 出力
「Command + Shift + P」でコマンドパレットを開き、
「PlantUML: ファイル内のダイアグラムをエクスポート(Export Current File Diagrams)」を入力
好みの出力形式を入力して完了！
パフォーマンス プロファイラーを使ってみる

[Niigata.NET 3.0に参加してきました](https://qiita.com/y_ohr/items/e7ef2c22c5da5a675f3f)のフォローアップです。

# 概要

Niigata.NET 3.0に参加して、Visual Studioにパフォーマンス プロファイラーたる機能があると教えてもらいました。
早速使ってみます。

# 分析コード

```antlr-csharp:PerformanceProfiler
/// <summary>
/// ref https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/inside-a-program/coding-conventions
/// </summary>
class Program
{
    static void Main()
    {
        ConcatbyString();
        ConcatbyStringBuilder();
    }

    private static void ConcatbyString()
    {
        var phrase = "lalalalalalalalalalalalalalalalalalalalalalalalalalalalalala";
        var stringPhrases = "";
        for (var i = 0; i < 10000; i++)
        {
            stringPhrases += phrase;
        }
        Console.WriteLine("tra" + stringPhrases);
    }

    private static void ConcatbyStringBuilder()
    {
        var phrase = "lalalalalalalalalalalalalalalalalalalalalalalalalalalalalala";
        var stringBuilderPhrases = new StringBuilder();
        for (var i = 0; i < 100000; i++)    // 早すぎると測定できないようなのでstringの10倍ループ
        {
            stringBuilderPhrases.Append(phrase);
        }
        Console.WriteLine("tra" + stringBuilderPhrases);
    }
}
```

# 分析結果
![PerformanceProfiler.PNG](https://qiita-image-store.s3.amazonaws.com/0/215001/54bfef3a-a295-d7ba-49f7-375671a8e3fe.png)

- +演算子による結合=1,780秒
- StringBuilderによる結合=68秒※試行回数は+演算子の10倍
- 約262倍ですね。

# まとめ
Stopwatchは卒業でしょうか。
Bokehを用いた回転行列演算可視化（手動でスライダー）

# 本日は

先日の記事


- [Bokeh をつかって行列演算を可視化する](https://qiita.com/SatoshiTerasaki/items/96f1d53475cfa3912a50)
- [（続き）Bokeh をつかって行列演算を可視化する(with animation)](https://qiita.com/SatoshiTerasaki/items/b7a5bf61f572aac1e358#_reference-d4cc9136c8cec0a05e1b)


の応用という事で， 回転行列の角度をスライダーで変更させるコードを書いてみましょう．

#　実装例

```py3:rotmatslider.py
import numpy as np
from bokeh.plotting import figure
from bokeh.models import ColumnDataSource
from bokeh.models.widgets import Slider
from bokeh.layouts import column, widgetbox, gridplot
from bokeh.io import curdoc


def rot_mat(degree):
    theta = np.deg2rad(degree)
    mat = np.array([[np.cos(theta), -np.sin(theta)],
                    [np.sin(theta), np.cos(theta)]])
    return mat


class RotationViewer(object):

    def __init__(self):
        xs = np.linspace(-np.pi, np.pi, 11)
        ys = xs
        Xs, Ys = np.meshgrid(xs, ys)
        self.Xs, self.Ys = Xs.flatten(), Ys.flatten()
        initdegree = 0
        mat = rot_mat(initdegree)
        transXs, transYs = mat @ np.array([self.Xs, self.Ys])

        TOOLS = "pan,lasso_select,save,reset"

        self.source = ColumnDataSource(data=dict(Xs=self.Xs, Ys=self.Ys,
                                                 transXs=transXs,
                                                 transYs=transYs))

        self.fig = figure(tools=TOOLS, title="target",
                          x_range=(-np.pi*np.sqrt(2)-1, np.pi*np.sqrt(2)+1),
                          y_range=(-np.pi*np.sqrt(2)-1, np.pi*np.sqrt(2)+1))
        self.fig.circle('Xs', 'Ys', source=self.source)

        self.transfig = figure(tools=TOOLS, title="transformed",
                               x_range=self.fig.x_range, y_range=self.fig.y_range)
        self.transfig.circle('transXs', 'transYs', source=self.source, size=6)

        self.rot_param = Slider(title="degree", value=0,
                                start=0, end=360, step=1)
        self.rot_param.on_change('value', self.update_data)

        self.plot = column(self.rot_param, gridplot([[self.fig, self.transfig]]))

    def update_data(self, attr, old, new):
        mat = rot_mat(self.rot_param.value)
        transXs, transYs = mat @ np.array([self.Xs, self.Ys])
        self.source.data = dict(Xs=self.Xs, Ys=self.Ys,
                                transXs=transXs, transYs=transYs)
        self.transfig.title.text = "degree {}".format(self.rot_param.value)


def main():
    viewer = RotationViewer()
    document = curdoc()
    document.add_root(viewer.plot)

main()
```

# 実行例

```shell-session
$ bokeh serve --show rotmatslider.py
```

こんな感じです．

![rotation_param.gif](https://qiita-image-store.s3.amazonaws.com/0/135978/ffe2fafa-642d-1677-a30b-3b2691c9b860.gif)

気持ち悪いぐらいヌルヌル動きます．
お試しあれ．

# 追加

2x2 行列のパラメータ版も作ってみました．

![2by2matanim.gif](https://qiita-image-store.s3.amazonaws.com/0/135978/df5670b9-a166-eb5c-0fab-74c1791be14e.gif)

こんな風に動いてたんですね．
pandasで行同士の計算

題名の通り

普段各列での平均や合計を求めることはあったが、２つの行の平均、合計を求める時どうするのか迷ってしまった。

答えはすごく簡単。
まずデータフレームを用意する
<img width="482" alt="スクリーンショット 2017-11-23 18.35.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/203812/d4fcff73-aa6d-4e51-275f-b52a9d1ed112.png">

こうするだけ

<img width="456" alt="スクリーンショット 2017-11-23 18.35.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/203812/2ab9d0f5-8cec-b655-999f-e025c7810fe7.png">

axis=1とすれば行同士の平均を出せる。
列名を指定すれば同じ行同士で演算してくれる。
合計も中央値も同様に
<img width="336" alt="スクリーンショット 2017-11-23 18.45.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/203812/cb076020-fcb0-4c63-3c3a-9a9f4ebd8df3.png">

普段やらない処理をすると「どうやればいいんだ？」って考えてしまうけど意外と今まで通りの関数でできちゃう例でした。
ミルエネのUSBドングルUDG-1-WSNEの動作確認

Wi-SUN対応USBドングル[UDG-1-WSNE](http://web116.jp/shop/netki/miruene_usb/miruene_usb_00.html)を入手したので、まずは動作確認をしてみました。MacBookに接続するとシリアルデバイスが1個増えているので、screenで接続。

```
$ screen /dev/tty.usbmodem14111 115200
```

まず`SKVER`と打ち込むと次のように結果が返ってきます。打ち込んだコマンドはエコーバックされないので、別途エディタなどで編集してコピペするのが良いと思います。

```
EVER 1.0
OK
```

上のように、ファームウェアバージョンが返ってきます。


次に`SKINFO`コマンドを試してみます。

```
EINFO FE80:0000:0000:0000:A612:42FF:FE**:**** A41242FFFE****** 21 FFFF 0
OK
```

IPv6アドレス、MACアドレス（EUI-64）、チャンネル、が返ってくるようです。最後の2つは何でしょうね…？

MACアドレスの先頭24bitから通信モジュールがNEC製であることがわかります。

# 参考資料

- [スマートメーターから瞬時電力を取得する　その3 – Blue-black.ink](http://blue-black.ink/?p=2827)
CSSとAndroidではmarginやpaddingの余白一括指定の順番が違う！あとSwiftも

デザインの設定をするときにmarginプロパティやpaddingプロパティをよく使うのですが、余白の指定を上下左右一括で指定するときには注意が必要であることに気がつきました。

## CSS
margin-topなど個別に指定せずまとめて指定する場合、このように書くと思います。

```css:style.css
div {
  margin: 5px 10px 15px 20px;
}
```

margin-topとして5px、
margin-rightとして10px、
margin-bottomとして15px、
margin-leftとして20pxを指定したことになります。
上下左右の指定する順番は「上」「右」「下」「左」になります。

## Android

```java:MainActivity.java
textview.setMargins(20, 5, 10, 15);
```

レイアウトのxmlに
android:layout_marginLeftとして20px、
android:layout_marginTopとして5px、
android:layout_marginRightとして10px、
android:layout_marginBottomとして15pxを指定したことになります。
上下左右の指定する順番は「左」「上」「右」「下」になります。

## Swift
CSSとAndroidで設定の順番が違ったのでSwiftではどうなんだろうと思い、調べてみました。

```swift
layout.sectionInset = UIEdgeInsetsMake(5, 20, 15, 10)
```

上下左右の指定する順番は「上」「左」「下」「右」だそうです。

# まとめ
CSSは「上」「右」「下」「左」の順番。
Androidは「左」「上」「右」「下」の順番。
Swiftは「上」「左」「下」「右」の順番。

できれば統一してほしかった。
ModuleNotFoundError: No module named 'pkg_resources'

# 不具合

python3仮想環境を構築しようとしたら、pipで不具合。

```py3:実行コマンド
pip3 install virtualenv
```

```shell-session:実行結果
Traceback (most recent call last):
  File "/usr/bin/pip3", line 6, in <module>
    from pkg_resources import load_entry_point
ModuleNotFoundError: No module named 'pkg_resources'
```
# 解決策

```py3:実行コマンド
pacman -R python3-pip
wget https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py
pacman -S python3-pip
```

# 動作確認

```py3:実行コマンド
pip3 --version
```

```shell-session:実行結果
pip 9.0.1 from /usr/lib/python3.6/site-packages (python 3.6)
```


# 環境

* Windows 10
* MSYS2

# 出典

* [Debian8 に python3-pip をインストールしたら pip3 が "ImportError: No module named 'packaging' で動かなかった時の防備録(解決)](https://qiita.com/ikwzm/items/0a7d1e2bdf2b5e2b7fb3)
wheneverを使ってcrontabにrakeタスクを設定する時に--silentオプションを外す方法

wheneverとはcrontabを管理するためのgemです。
インストール方法については[whenever](https://github.com/javan/whenever)のリポジトリを参照ください。

## silentオプションを外すと何がうれしいの？
cronの実行ログを書き込みたい場合に捗ります。
rakeの`--silent`オプションが設定されていると標準出力にログメッセージ及びディレクトリが表示されなくなるため、ログに書き込まれない(未検証だが標準出力エラーは書き込まれるかも)

## 本題
rake用のjob_typeから`--silent`オプションを省いて再定義することによって解決しました。
実はこちらも[whenever](https://github.com/javan/whenever)リポジトリのREADMEにjob_typeのデフォルト定義と変更方法が書いてありました。

``` rake用job_typeのデフォルト定義
job_type :rake, "cd :path && :environment_variable=:environment bundle exec rake :task --silent :output"
```

## 設定
schedule.rbへrake用job_typeを`--silent`オプションを外して再定義すれば完了です。

```schedule.rb
set :output, '/var/log/cron.log'

# rake用job_typeの再定義
job_type :rake, 'cd :path && :environment_variable=:environment bundle exec rake :task :output'

every '0 7 * * *', roles: [:batch] do
   rake 'item:update'
end
```

## 設定内容の確認
``` crontab
0 7 * * * /bin/bash -l -c 'cd /hoge/fuga && RAILS_ENV=development bundle exec rake item:update >> /var/log/cron.log 2>&1'
```

## まとめ
job_typeの定義を変更することで`--silent`オプションの解除に限らず色々工夫が出来そうです。
Go言語で文字列がASCIIコード内であるか判定したい

ASCIIコード内であることを保証したいとします。大体の場合は正規表現で `[0-9a-zA-Z]+` みたいな感じにすればASCIIコード内の普通の文字っぽいな、みたいなのが保証できるのでそうやるのがよいと思います。

しかしGo言語の正規表現は非常に遅いことで知られています。特にユーザーのリクエストで叩かれるロジックならば使うべきではないでしょう。

真面目にやるならfor文で1バイトずつ見ていけば、ASCIIコード内であることが分かります。ただ実は標準パッケージでそれとほぼ同様のことをやっているパッケージがあります。

[utf8としてvalidなバイト列を判定する方法をGoから見る - Qiita](https://qiita.com/catatsuy/items/bccc2c76be501e98382a)

このことが分かっていれば、以下のようにできることが分かります。

``` go
str := "あいうえお"
utf8.ValidString(str) && utf8.RuneCountInString(str) == len(str) // false
```

最初に`utf8.ValidString`を呼んでいるのは、`utf8.RuneCountInString`がutf8として不正なバイト列を渡した場合、不正なバイト列に出会ったタイミングで処理を打ち切り、そこまでの文字数を返すような実装になっているからです。事前に確認する方が安全です。

utf8の特徴として『utf8としてValidであり、utf8としての文字数とバイト数が同じならばASCIIコードである』と言えるので、これでASCIIコード内であることが保証できます。
ASP.NETのModalPopupコントロール(ModalPopupExtender)は、日本語名を使うとpopupしない

ASP.NET AJAX Control Toolkit の ModalPopupExtenderで、ページ上からポップアップ可能なモーダル・ウィンドウを生成しようとしていました。
しかし、一向にポップアップ対象として作成したpanelが、ポップアップしませんでした。
結論としては、panelのコントロール名に日本語を用いてはなりません。
そのような命名をすること自体がなさそうですが。
Windows 10 で言語切り替えショートカットを無効にする方法【Windows 10 1803版】(1810版は別記事にしました)

いつも、検索するのに迷うのでメモ
言語切り替えショートカットとは、「ctrl+shift」でIMEが切り替わるショートカットのことです。

1810になって設定場所がちょっと変わったみたいなので別記事にしました。
Windows 10 で言語切り替えショートカットを無効にする方法【Windows 10 1810版】 - Qiita
https://qiita.com/ynott/items/5c97453fcc9bdf845636

## 0. Windowsのバージョンは以下
エディション：Windows 10 Pro
バージョン：1803
![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/e8f1b6bf-f95b-29de-3a0b-15b2360344f3.png)

## 1. コントロールパネルから、「地域と言語」を選択
「時刻と言語」から「地域と言語」に行く

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/5b43f42e-e1a0-513a-e580-472d566d29d6.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/ee604f2e-0558-cbcf-815f-6a0979e45151.png)

関連設定を選択する

キーボード詳細設定をクリックします。

## 2. 「関連設定」を選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/06ce21c7-2289-1b01-1dc7-4d84df7a8006.png)



## 3. 「入力方法の変更」を選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/51527fb6-d40e-f6b5-2e05-f569b06afd83.png)

## 4. 「詳細設定」を選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/729d3ffc-5516-5cbc-2305-4dc48e56eab7.png)

## 5. 「言語バーのホットキーの変更」を選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/62a31015-2059-459d-29d7-3e5a4146589a.png)

## 6. 「キー シーケンスの変更」を選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/ddaa287d-f5cc-b68a-3513-0c15c8fbe87c.png)

## 7. 入力言語とキーボードレイアウトで「割り当てなし」を選択

![image.png](https://qiita-image-store.s3.amazonaws.com/0/15176/98d8630a-dee6-23e9-66ec-a62e724d4b99.png)

## 8. OKを押して終了
15分で社内向けAdvent Calendar環境をつくる

# はじめに
身につけたスキルや勉強法、便利なツールなどを会社のみんなで共有する場が欲しくてAdvent Calendarをやろうと思ったのですが、外部に公開するのも気が引けるので社内だけでワイワイやれるクローズドな環境を作りました。

Githubで公開されている[radvent](https://github.com/nanonanomachine/radvent)を使わせてもらって作成したDockerイメージからコンテナを作成するだけです。
12月まであとわずかですが、15分で環境ができるならまだ間に合いますよ！

# 必要なもの
- Docker環境（今回はEC2にインストール）
- アクセスコントロール（今回はAWSのセキュリティグループを使用して会社のグローバルIPアドレスからのみEC2へのアクセスを許可）

# 所要時間
1. インスタンス作成(5分）
2. Dockerインストール(5分)
3. コンテナ作成/radvent起動(5分)

# 手順
## インスタンス作成
今回はUbuntu16.04を使いました。手順は省略します。

## Dockerインストール
[公式サイト](https://docs.docker.com/engine/installation/)参照

## コンテナ作成
インスタンスへSSHアクセスして以下のコマンドを実行

```
sudo docker run -it --name <containername> -p <port>:3000 mongamaenioh/radvent:latest /bin/bash
```

**containername** = 任意のコンテナ名
**port** = リッスンするポート番号(もちろん任意で指定できますがnetstatなどでListenしていないか前もって確認しましょう)
3000はコンテナ側のポート(Railsなので)

これでコンテナが作成されて中に入ります。

## radvent起動

```
cd /home/radvent
export SECRET_KEY_BASE=`bundle exec rake secret`
bundle exec rails server -e production
```

以下のようにListeningになれば成功です。

```
=> Booting Thin
=> Rails 4.1.7 application starting in production on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Notice: server is listening on all interfaces (0.0.0.0). Consider using 127.0.0.1 (--binding option)
=> Ctrl-C to shutdown server
Thin web server (v1.7.0 codename Dunder Mifflin)
Maximum connections set to 1024
Listening on 0.0.0.0:3000, CTRL+C to stop
```

## アクセスコントロール

セキュリティグループのインバウンドルール設定で**ポート範囲**に*port*で指定したポート番号、**ソース**に会社のグローバルIPアドレスを入力して保存(このキャプチャだとソースで全許可してしまってますが適宜変更してください。ポート番号は2017年なので2017としました。)

![1.png](https://qiita-image-store.s3.amazonaws.com/0/172195/e5fb02bb-720f-a1fc-2cc2-eab18e8bbfa5.png)


## 記事作成
ブラウザから**http://EC2のパブリック側アドレス:指定したポート番号**へアクセスすると以下のような画面が表示されます。

![2.png](https://qiita-image-store.s3.amazonaws.com/0/172195/3df72902-3dbf-ad64-4097-5732bd00269a.png)

**参加登録**から記事を作成しましょう。
登録した日になれば記事が公開されます。


# おまけ

## 開始終了日の設定(来年以降は別のコンテナ作って設定変更すればOK)
```/home/radvent/config/initializers/constants.rb
module Constants
  #Set advent calendar date
  YEAR = 2018
  MONTH = 12
  START_DAY = 1
  END_DAY = 25
end
```

## タイトルの変更(会社名などを入れてそれらしく)
```/home/radvent/app/views/welcome/index.html.haml
%h1 <ここに会社名とか> Advent Calendar #{Constants::YEAR}
```
BigQueryでカラムを追加したい

BigQueryにtsvのログファイルを送っているけど、そのカラムを突如として増やしたくなったとします。そういうことは割とあります。

その場合は以下の手順で行えばよいです。

  * BigQueryの管理画面でnullableなカラムを増やす
  * `bq load` のオプションに `--allow_jagged_rows` をつけて、カラムも増やす
  * 保存するログファイルの形式を変更する

こうすることでカラムが存在したり、しなかったりするログファイルでも問題無く処理できます。カラムが存在しなければnullになるだけなので問題ありません。

意外と簡単にできるのでカジュアルにやっていきましょう。
親レイヤーから子レイヤーへのコールバック渡し[Cocos2d-x]

#内容
親レイヤーの上に子レイヤーをのせて子レイヤーから親レイヤーの処理をさせたい場合
親レイヤーで渡したい処理を書いて子レイヤーに渡す
前回の[Sceneへの変数渡し](https://qiita.com/708QBT/items/1841ab6b005eaa7c2ec2)の応用

#親レイヤーから子レイヤー作成

```cpp:ParentSample.cpp
void ParentSample::sampleCreate(){
    Sample* sample = Sample::create(CC_CALLBACK_0(ParentSample::test, this));
    this->addChild(sample);
}

void ParentSample::test(){
    //処理したいプログラム
}

```

#子レイヤー作成

```cpp:Sample.h
#ifndef __Sample__
#define __Sample__

#include "cocos2d.h"
#include "XTLayer.h"

typedef std::function<void(cocos2d::Ref*)> DataCallback;

class Sample : public XTLayer
{
private:
    //上部typedefで格納部を定義
    DataCallback callData;

public:
    //いろいろ省略
    virtual bool init(const DataCallback& call);
    static cocos2d::Scene* scene(const DataCallback& call);
    static Sample* create(const DataCallback& call);

    //いろいろ省略
};

#endif /* defined(__Sample__) */
```

```cpp:Sample.cpp
#include "Sample.h"

//いろいろ省略

Scene* Sample::scene(const DataCallback& call){

    Scene *scene = Scene::create();
    Information *layer = Sample::create(call);
    scene->addChild(layer);

    return scene;
}

Sample* Sample::create(const DataCallback& call){
    Information* ret = new Sample();
    
    if (ret && ret->init(call)){
        ret->autorelease();
        return ret;
    }else{
        CC_SAFE_DELETE(ret);
        return NULL;
    }
}

bool Sample::init(const DataCallback& call){
    
    if (!Layer::init()) return false;
    
    auto listener = EventListenerTouchOneByOne::create();
    listener->onTouchBegan = CC_CALLBACK_2(Sample::onTouchBegan, this);
    listener->onTouchMoved = CC_CALLBACK_2(Sample::onTouchMoved, this);
    listener->onTouchEnded = CC_CALLBACK_2(Sample::onTouchEnded, this);
    listener->setSwallowTouches(true);
    this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);
    
    //コールバックのデータを格納
    callData = call;
    
    //このプログラムで親から渡したプログラムが動く
    if(callData) callData(this);

    return true;
}
//いろいろ省略
```

#応用例
モーダルレイヤー
その他にもいろいろ使い道がある

#次回
何か考える
WordPress カスタム投稿に役立つターム出力方法　いろいろ

## 現在表示しているページのカスタム投稿名を表示

```ruby:php
$gpt=get_post_type();
echo $gpt;
```

## タクソノミーで条件分岐（アーカイブページの時）

```ruby:php
<?php if(is_tax('タクソノミー名', array('ターム名1','ターム名2'))): ?>
//trueの挙動を書く
<?php endif; ?> 
```
## カスタムタクソノミーの情報を色々取得する

```ruby:php
  // ↓ タームの情報を取得する
    $tarms =  get_the_terms( $post ->ID, 'gallery_area_cat' );
    // ↓取得したデータが配列かの判定
    if (! is_array($tarms)) {
    // ↓$tarms に配列データが入ってない場合の処理
    $tarms = array(array('title'=>'該当するデータはありません'));
    } else {
    // ↓$tarms に配列データが入っていた場合は foreach へ
    foreach ( $tarms as $tarm ) {
        $sidemenu_active01 = $tarm -> term_id;
    } 
}

term_id　　　　　 　 //ID
name　 　　　　　　　//名前
slug 　　　　　　　　//スラッグ
term_group　　 　　 //グループID
term_taxonomy_id　 //タクソノミーID
taxonomy　 　　　　　//タクソノミー名（カテゴリーの場合はcategory、タグの場合はpost_tag）
description　 　　　//説明
parent 　　　　　　　//親カテゴリーID（親カテゴリーがない場合は0）
count 　　　　　　　 //投稿数
```

#single.php

## ターム名だけをリンク付きで表示 ※$post->IDで現在のページのID番号を所得する 

```ruby:php
echo get_the_term_list($post->ID, 'タクソノミー名');
```

## ターム名だけをリンク無しで表示 

```ruby:php
if ($terms = get_the_terms($post->ID, 'タクソノミー名')) {
    foreach ( $terms as $term ) {
        echo '<li>' . esc_html($term->name) . '</li>';
    }
```
## 目的とするtermを持っているか判断

```ruby:php
if (has_term( $term,$taxonomy )) {
  echo "カテゴリーがあります！";
}else{
  echo "ありません！";
}
```
#taxonomy.php

## ターム名だけをリンク無しで表示

```ruby:php
single_tag_title();
```

#archive.php
## ターム名のみリンク付きで表示 

```ruby:php
echo get_the_term_list($post->ID,'タクソノミー名');
```
趣味で稼げる「ブルーオーシャンスキル」をPythonでデータマイニングして特定してみた

# やってみたこと

- スキル売買サービス「ココナラ」のデータをマイニングして、「ブルーオーシャンスキル」を分析したよん
- ココナラは、自分のスキルを売ることができるサイトだよん！

![kokonara.gif](https://qiita-image-store.s3.amazonaws.com/0/134704/a9849c47-01fe-257d-8891-80ddf730b649.gif)

# 本研究の目的：ブルーオーシャンスキルは何か特定する

- このサイトの「趣味・娯楽」カテゴリの中から、
    - (1)需要も高く、(2)単価の高いスキル = ブルーオーシャンスキルをデータマイニングしたよん
- 趣味でできて、単価も需要も高いブルーオーシャンスキルがあれば、遊んで暮らせるよん
- 今回はそんなブルーオーシャンスキルを穴掘れワンワン

![ocean.png](https://qiita-image-store.s3.amazonaws.com/0/134704/6d2adbde-ee23-1be5-767b-11faf7f22461.png)



# 手順　
- 具体的なやり方は、ブログを見てねん（最後の参考に貼っておくよん）

- ココナラのサイトをPythonでスクレイピング（詳細はブログみてね）
- CSVにまとめる
- Pandasとmatplotlibで分析


![coconala.gif](https://qiita-image-store.s3.amazonaws.com/0/134704/d53478b1-caee-ce4f-2941-c5212875fb62.gif)


![data (2).jpg](https://qiita-image-store.s3.amazonaws.com/0/134704/95d73b6b-0a05-9f35-df3a-087bc9a9fcdf.jpeg)



# データ分析結果

- サンプルが3000くらいとれたよ
- 単価10000円以上、かついいね数が20以上のものを抽出した結果

| タイトル       |       いいね数 |    価格    |
|:-----------------|------------------:|:------------------:|
|奇跡！現役ギタリストがあなたをギターの天才にします： |24いいね |10000円|
|楽曲制作☆オリジナル楽曲制作致します：|37いいね |20000円|
|確率と統計を用いた競艇技術を御案内しています:| 42いいね| 10000円|
|電子書籍　出版　プロデュースをします： |54いいね |10000円|
|ジャグラー1k以内に光る台教えます： |24いいね |10000円|

- 単価が5000円以上、かついいね数が20以上のものを抽出し、散布図に落とし込んだ結果がこちら（1万円以上と書いてあるけど、本当は）

![scatterplot.png](https://qiita-image-store.s3.amazonaws.com/0/134704/ebddfcaa-93aa-7b0f-c94a-ff85cd49f977.png)

- で、そのリストがこちら

| タイトル       |       いいね数 |    価格    |
|:-----------------|------------------:|:------------------:|
|毎月千円で宝くじ当選確率をあげる購入方法を教えます　|93いいね |5000円 |
|ランキング1位現役スロプロが貴方に合わせて教えます |　87いいね |5000円 |
|リアルなドラム打ち込みサービス制作します | 21いいね |5000円 | 
|あなたの原稿を電子書籍にします | 20いいね |5000円 |
|パチンコホールの大当たりの仕組み教えます|23いいね|5000円| 
|簡単な8ビートから丁寧に教えます| 21いいね |5000円|
|作曲を音楽理論から解りやすく丁寧にお教えします |23いいね |5000円|
|♪歌が確実に上手くなるノウハウお裾分け、|24いいね |5000円 |
|『もうダメだ』と思ったあなた、救いが本にありますよ♪ |21いいね |5000円 |
|あなたを”本”で救います！  |25いいね |5000円 |
|原稿はあるけどやり方が・・。電子書籍出版をお手伝い|　39いいね|5000円| 
|オンラインカジノで勝てるロジックを提供します| 28いいね|5000円|

# 結論

- 楽曲提供、音楽の個人指導はブルーオーシャンスキル
- パチスロ強者がパチスロ弱者から金を巻き上げていた

# 参考

- ということで、具体的な手法はこちらを見てね！

需要が高く単価の高い「趣味で稼げるスキル」とは何か？　ココナラをデータマイニングして、「売れるスキル」を見つけてみた|Review of My Life 

https://review-of-my-life.blogspot.jp/2017/11/coconala-data-mining.html