OmniAICreator/Qiita-1.07M huggingface dataset:
8946 Take#46

#問題

http://www.hackerschool.jp/hack/take46.php

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/2272e05f-786f-21a7-2094-09c8e26233e0.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/4fd3b416-7280-0a0e-ab5b-267103d8d120.png)

#解いてみた

- 問題文の下のソースコードがOKになるようにIdを入力しましょうということですね。
- ソースを読むと「MD5の先頭10文字が0になる文字列を入力せよ」ということでしょうか。
- かなりの奇跡感ありますね。
- 「md5 10桁0」でgoogle検索するとブログがたくさん出てきたので、その中から適当に一つ選んで入力。
    - ここでは「1718335477476」を入力しました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/b8fd3715-9be6-6826-3244-63685af7d4f9.png)
要素の検証はもういらない！？elm-uiで簡単UIデバッグ！

[elm-ui](https://package.elm-lang.org/packages/mdgriffith/elm-ui/latest/)

- [CSSができなくても安心！elm-uiで簡単レイアウト！](https://qiita.com/miyamo_madoka/items/e29a97102df8770a6375)
- [もう上下左右中央揃えでググらない！elm-uiで簡単レイアウト！](https://qiita.com/miyamo_madoka/items/c423af7b8c4b0f9dc200)
- [要素の検証はもういらない！？elm-uiで簡単UIデバッグ！](https://qiita.com/miyamo_madoka/items/9700a4994daa95934d39)


タイトルは煽りです申し訳ありません

# 要約

[explainのdocument](https://package.elm-lang.org/packages/mdgriffith/elm-ui/latest/Element#explain)

再掲

[Ellie](https://ellie-app.com/44qrx33SK4Za1)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/74093/47e5a379-6ce7-1905-e551-918eae6c76ef.png)

```elm
view : Element msg
view =
    row [ width fill, height fill, spacing 16, explain Debug.todo ]
        [ el [ centerX ] <| text "hello"
        , el [ centerX ] <|text "world"
        , el [ centerX ] <|text "🐐🐐🐐🐐🐐"
        ]

```

`explain Debug.todo`をattributeに追加するとその要素と子要素にボーダーがついてUIデバッグするのに便利だよ

内容は以上です。以下あまり情報はないので気を付けてください


# 「elm-ui使ってdom見てみたらいっぱいdivがいるんですけど！」

elm-uiはHTMLとCSSの歴史を隠蔽し、平和と秩序をもたらしたUIフレームワークです。
といってもHTMLとCSSで構成されていることに変わりはないしelm-uiの気持ちを全て察することなどできません

そのうちなんかうまくいかなくてdevtool開いてdomの構造みることになります。しょうがない
elm-uiは書いてる`Element`と実際のdomに差が出るので慣れないとどれが自分で書いた`el`か、それとも暗黙的に生成されたものかわかりません。

ということで最初は`explain Debug.todo`しましょう！

# 使い方

```elm
    row [ width fill, height fill, spacing 16, explain Debug.todo ]
        [ text "hello"
        , text "world"
        ]
```

`explain Debug.todo`を見たい要素のattributesに追加するだけ。


# 「Debug.todoってどういうこと？どういう仕組み？」

枠線だすだけでなんで`Debug.todo`なんて出てくるかというと、Debugモジュールを使っていると`--optimize`つけてcompileできなくなるからなんです

つまりpublishやリリースビルド時に`explain`が混ざらないことが保証されています

## 仕組み

[explain](https://package.elm-lang.org/packages/mdgriffith/elm-ui/latest/Element#explain)の型には`Todo -> Attribute msg`とあります

[Element.elm](https://github.com/mdgriffith/elm-ui/blob/ffb1257aabd6bf844e9f73a217ab99379a3155a8/src/Element.elm#L741)

```Element.elm
type alias Todo =
    String -> Never
```
この型は`Debug.todo`のaliasと書いてあります

[Debug.elm](https://github.com/elm/core/blob/22b2d7a235003a88af4e4af58c3d0edf43684bc9/src/Debug.elm#L94)

```Debug.elm
todo : String -> a
todo =
  Elm.Kernel.Debug.todo
```

この型変数`a`はどの型にもなれます。だから`todo`は任意の位置に書けるわけですね

さて型`Todo`ですが`String -> Never`なので`String -> a`の`todo`で満たせますね。
この`Never`ですが要するに値を生成できない型です。つまり`String -> Never`という関数の実装は絶対に書けないわけですね。なので`explain`の引数には`Debug.todo`しか置けないということになります

# まとめ

`explain Debug.todo`の説明をしましたが`Never`の使い方すごくないですか。そう使うんだーって感じです

次は多分padding, spacingについて適当に書く気がします

- [CSSができなくても安心！elm-uiで簡単レイアウト！](https://qiita.com/miyamo_madoka/items/e29a97102df8770a6375)
- [もう上下左右中央揃えでググらない！elm-uiで簡単レイアウト！](https://qiita.com/miyamo_madoka/items/c423af7b8c4b0f9dc200)
- [要素の検証はもういらない！？elm-uiで簡単UIデバッグ！](https://qiita.com/miyamo_madoka/items/9700a4994daa95934d39)
【備忘録】Anaconda を VS Codeを始める

#Motivation
windows環境で機械学習を勉強するために環境を構築した流れをメモします
(I construct environment for learning machine learning on windonws)

#References
1.
   https://beachside.hatenablog.com/entry/2017/12/25/000000
1. インストールするだけでVSCodeをカッコよくする拡張4つ
   https://qiita.com/ksakiyama134/items/8ca98295897dc1280644
1.ニューラルネット！
   https://qiita.com/ta-ka/items/bcdfd2d9903146c51dcb
letをconstにできるケース（とlet使用禁止というルールについて）

JavaScript（ES6〜）には、値を再代入できる変数宣言「let」とできない「const」があります。

この記事では、letをconstにできるケース（再代入を行う実装を、再代入なしで実現できるケース）をいくつかまとめてみたいと思います。

※「書き換え後のように実装しましょう！」という記事ではありません

（let使用禁止についての記述は一番下です）

# letをconstにできるケース

## 三項演算子にする

条件分岐によって代入内容を変えたいです。

```javascript
let result = 'foo'
if (isBar) {
  result = 'bar'
}
```

三項演算子にできます。

```javascript

const result = isBar ? 'bar' : 'foo'
```

## 関数化する

さっきよりもたくさんの条件分岐によって、値を変えたいです。


```javascript
let result = 'default'
if (key === 'F') {
  result = 'foo'
} else if (key === 'B') {
  result = 'bar'
} else if (key === 'Z') {
  result = 'baz'
}
```

処理を分割する目的も含めて関数化で解決できそうです。

```javascript
const getNameByKey = key => {
  switch (key) {
    case 'F': return 'foo'
    case 'B': return 'bar'
    case 'Z': return 'baz'
    default: return 'default'
  }
}
const result = getNameByKey(key)
```

即時関数でもよいと思います。

※もしまんま例の様な変換するだけの分岐であればObjectや配列などで対応表が作れそうです。

```javascript
const FBZ_DATA = { F: 'foo', B: 'bar', Z: 'baz' }
const result = (key in FBZ_DATA) ? FBZ_DATA[key] : 'default'
```

```javascript
const arr = [{ key: 'F', name: 'foo' }, { key: 'B', name: 'bar' }, ...]
const data = arr.find(v => v.key === key)
const result = data ? data.name : 'default'
```

## 再帰処理にする

1から10までループしながら何かしたいです。

```javascript
for (let i = 1; i <= 10; i++) {
  console.log(i)
}
```

再帰処理でもできそうです。

```javascript
const echoNum = (current, max) => {
  console.log(current)
  if (current < max) echoNum(current + 1, max)
}
echoNum(1, 10)
```

## Arrayの関数を使う

Web開発だと可変長のデータを回すことは頻繁にあっても、さっきのようなn回ループって滅多にないですね。

というわけでデータを回したいとき。

```javascript
const users = [
  { id: 1, gender: 'male', money: 100 },
  { id: 2, gender: 'female', money: 200 },
  { id: 3, gender: 'male', money: 300 },
  { id: 4, gender: 'female', money: 400 },
  { id: 5, gender: 'male', money: 500 }
]
```

上記のデータからgenderがmaleである行のmoneyの合計を出したいです。

```javascript
let money = 0
for (const user of users) {
  if (user.gender === 'male') money += user.money
}
```

僕はArrayの高階関数が好きです。[filter](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)と[reduce](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)の2つを使ってみます。

```javascript
const money = users.filter(u => u.gender === 'male').reduce((acc, u) => acc + u.money, 0)
```

# 余談：let使用禁止というルール

letを一切使わずに実装することは可能で、実際に僕の書いているプロジェクトではconstしか使っていません。
元々そういうルールがあったわけではなく、コードレビューを重ねていくなかで自然とそうなりました。

しかし、冒頭で書いたように、そうすべきだと主張したいわけではありません。

最後の例のgender=maleのmoneyを合計する処理なんかは、慣れていない人にとってはletを使ったパターンのほうが何をやっているか分かりやすいと思います。

以前、実装メンバーのレベルにばらつきがあるチームで書いていたとき、「var、let禁止」というルールがありました。
ですが、あるメンバーが、実現したいことをconstを使って書くことができず、下記のようなコードが生まれてしまったことがありました。

```javascript
const result = { flag: false }
if (isHoge) result.flag = true
```

（result自体には再代入できないけれど、resultが参照するオブジェクトの値なら変更できる、という性質を利用してletのような使い方をしている）

もともとは安全なコードを書くために設けられたルールであったと思うのですが、上記の例ではそれを実現できていません。

ルールを設けただけではメンバーのレベル（あるいは思想や好み）の差を埋めることは難しいです。
もし「let禁止」のようなルールを作るのであれば、なぜそうすると安全であるか、どう書けばそれが実現できるのか、まで理解・納得してもらってからがよいと思います。
heroku: command not foundを解決する方法

###環境
Cloud9

##herokuコマンドを打つとheroku: command not foundに

ターミナルで

```
$ heroku -v
```

を実行したところ、

```
heroku: command not found
```

が発生したので解決した方法を記載。

##実際に実行したコマンド

```
$ wget https://cli-assets.heroku.com/heroku-cli/channels/stable/heroku-cli-linux-x64.tar.gz -O heroku.tar.gz
$ sudo mkdir -p /usr/local/lib/heroku
$ sudo tar --strip-components 1 -zxvf heroku.tar.gz -C /usr/local/lib/heroku
$ sudo ln -s /usr/local/lib/heroku/bin/heroku /usr/local/bin/heroku
```

上記のコマンドを一通り打った後

```
$ heroku -v
```

で上手くバージョンが確認できた！
RubyとserverlessでSlackへ定期投稿するLambda関数を書く

`serverless framework`を使って、1日1回実行するSlackへの投稿を**Lambda**の上に[最近公式サポートされたRuby](https://aws.amazon.com/blogs/compute/announcing-ruby-support-for-aws-lambda/)で書きます。

## 下準備
Slack appを作って適当なチャンネルにintegrateしてwebhook urlを取得しておいてください。あとserverlessとrubyのインストールもお忘れなく。

## 作る
`serverless create --template aws-ruby --path lottery` とすると以下のような構造のディレクトリができます。

```sh
lottery > tree
.
├── handler.rb
└── serverless.yml

0 directories, 2 files
```

作成された`handler.rb`の`hello`メソッドを変更します。

```rb
require 'json'
require 'slack-notifier'

def hello(event:, context:)
  notifier = Slack::Notifier.new 'https://hooks.slack.com/services/xxxxxxxxxxxx' do
    defaults channel: '#general',
             link_names: 1
  end
  notifier.post text: '一日一善'
end
```

次にserverless.yamlに定期実行させる処理を追加します。

```yaml
functions:
  hello:
    handler: handler.hello
    events:
      - schedule: cron(00 00 * * *)
```

上の設定では毎日0時0分に定期実行されるようになっています。時刻の設定はcrontabと同じ記法が使えます。(参考: [tutorial-scheduled-events-schedule-expressions](https://docs.aws.amazon.com/lambda/latest/dg/tutorial-scheduled-events-schedule-expressions.html))

これが終わったら`serverless deploy`するだけであとは毎日Slackに投稿されるようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/131581/d3c65d82-bc72-6b36-f14d-6f2e56ed162f.png)


## 注意事項
### serverlessの管理下にgemをインストールする
`bundle install --path vendor/bundle` でserverlessの管理下にgemをインストールするか、**Lambda Layer**を使いましょう。

```
Init error when loading handler handler.lottery
{
"errorMessage": "cannot load such file -- slack/post",
"errorType": "Init<LoadError>",
"stackTrace": [
"/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'",
"/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'",
"/var/task/handler.rb:2:in `<top (required)>'",
"/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'",
"/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'"
]
}
```

### Rubyのバージョンを合わせる
LambdaでサポートするRubyのランタイムはバージョン2.5.0なので、ローカルでも2.5系を入れましょう。

```
// 上と同じエラーです
Init error when loading handler handler.lottery
{
"errorMessage": "cannot load such file -- slack/post",
"errorType": "Init<LoadError>",
"stackTrace": [
"/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'",
"/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'",
"/var/task/handler.rb:2:in `<top (required)>'",
"/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'",
"/var/lang/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'"
]
}
```

### scheduleのrateは時間の単数/複数に注意
serverless.yml中のscheduleには`rate`を使うこともできます。

```yaml
    events:
      - schedule: rate(1 minute)
```

ここで気をつけるべきなのは時間が単数か複数かどうかというところで、例えば　`1 minutes` とするとエラーが出ます。同じように `10 minute` でもエラーが出ます。1 minutesはちょっと許してほしい気持ちがありますけど。

```sh
  Serverless Error ---------------------------------------

  An error occurred: HelloEventsRuleSchedule1 - Parameter ScheduleExpression is not valid. (Service: AmazonCloudWatchEvents; Status Code: 400; Error Code: ValidationException; Request ID: 329bfa3f-f7c9-11e8-9332-xxxxxxxx).
```
CryptZombiesレッスン3(チャプター1~5)の自分なりのまとめ

# はじめに
この記事は私がCryptZombiesを進めていく上で自分なりにまとめたものです。
書いてあることが１００％あってる保証はないです。
**前回の記事**
https://qiita.com/daichi77/items/a3d758853da726f25874
**参考にしたサイト**
サイト名: イーサリアム上のDApp開発をゲームを作って学びましょう
URL: 　https://cryptozombies.io/jp/　
**この記事の問題文と答えについては上の参考にしたサイトから引用しています。**
# チャプター１ Immutability of Contracts
## 要点
イーサリアム上にデプロイすると編集も更新もできなくなる。欠陥があった時修正することができない。変更したい場合は新しいcontractを作るしかない。
## 今回したこと(テスト)
いつでもaddressを変更できるようにするためにaddressを変更するための関数の作成。

# チャプター２　Ownable コントラクト
## 要点
OpenZeppelin というOwnableコントラクトを継承することでコントラクトにオーナー権限を持ったユーザーを登録できる。
 Ownableメソッドはコンストラクタでオーナーをセットするためのメソッド。
onlyOwner
## 今回したこと(テスト)
1. ownable.solをimport
2. ZombieFactoryにOwnableを継承

#チャプター３ onlyOwner 関数の修飾子
## 要点
**関数修飾子**

```text:関数修飾子定義
modifier onlyOwner() {
  require(msg.sender == owner);
  _;
}
```

```text:関数修飾子を使用
function 関数名() external 関数修飾子 {
```
このように関数に関数修飾子をつけると関数が実行される前に関数修飾子が実行される。
railsのbefore_actionとかと似てる。

## 今回したこと(テスト)
setKittyContractAddressにonlyOwnerをつけた。
これで特定のユーザーしかアドレスを変えれなくなった。

# チャプター４ ガス(燃料)
## 要点
ユーザーが関数を呼び出したりするときにはgas(ethreum)が必要。
コードがクソだとユーザーが余計にgasを払うことになるのでコードは綺麗に書こう！
uintをuint8に変えたところでgasの節約にはならない。
しかしstructの中は別。
structの中ではできるだけ小さい単位のuintを使うことでgasを節約することが可能。
さらにstructの中で同じ型をまとめることでもgasの節約になる。
## 今回したこと(テスト)
ゾンビstructに

```
uint32 level;
uint32 readyTime;
```
のデータを追加した。

# チャプター５ Time Units
## 要点
Solidityには seconds、 minutes、 hours、 days、weeks 、yearsという単位も用意されている。
これを使用するとuintの秒が帰ってくる。
**(例)**
2 minutes == 2 * 60
となる。
## 今回やったこと(テスト)
zombieの初期levelを１に設定。
zombieのreadyTimeを今の時間+一日に設定(つまり明日)

# 次の記事
https://qiita.com/daichi77/items/2648a7c278eb548016db
はてなブログを読み上げるフラッシュブリーフィングスキルを作る

ごきげんよう

この記事は
**「するめごはんのVUI・スマートスピーカー Advent Calendar 2018」**
の5日目の記事です。

今回は少し指向を変えて、カスタムスキルではなく、フラッシュブリーフィングスキルを作成した話です。

僕のはてなブログを読み上げるという、なかなか香ばしいスキルです。

~~はてなブログを読み上げるスキルの記事をQiitaに載せるというプレイ~~


![51pEOvX-rHL._AC_US218_.png](https://qiita-image-store.s3.amazonaws.com/0/67398/0f244c5f-10ee-1487-be84-2c2834fc89c5.png)




#フラッシュブリーフィングスキルとは

要するに、
**「アレクサ、今日のニュースは？」**
と話しかけると流れるニュースのスキルです。

カスタムスキルは
「アレクサ、〇〇を開いて」
などで起動しますが、フラッシュブリーフィングスキルは、一連のニュースとして読み上げるスキルのうちの1つを作成することになります。

#フラッシュブリーフィングスキルの作り方

さすがの @zono_0 さんが非常にわかりやすい資料を既に公開していらっしゃるので、これを閲覧すればAPI GateWayで呼び出させるLambdaで作成することができます。

https://qiita.com/zono_0/items/10719a9df59d3af3edd2

とはいえ、毎日流れるニュースがLambdaで決め打ちのコードというのもなかなかしんどいので、今回は僕自身のはてなブログを流すスキルを創った話です。

#はてなブログを読み上げるフラッシュブリーフィングスキルの作り方

基本的には、上記の @zono_0 さんの記事の通りです。

違うところを記載していきます。

##1.まずはAlexa developer console
まずは、みんな大好きAlexa developer consoleにて「フラッシュブリーフィングスキル」を選択して「スキルを作成」です。

最新のUIに対応するため、適当なスキル名でとりあえず進めます。

![console1.png](https://qiita-image-store.s3.amazonaws.com/0/67398/b21347dc-9cf9-69b7-f445-3ea6c4969a5f.png)

##2.カスタムエラーメッセージ

エラーメッセージをいれます。
「ほげほげ」の箇所に「現在、このニュースは利用できません」等を書いておけば良いかと思われます。


![2.png](https://qiita-image-store.s3.amazonaws.com/0/67398/db41fe64-a6da-9bd6-e2d5-a73eb0657999.png)

そして「新しいフィードを追加」をポチります。

##3.新しいフィードを追加を押したら各種情報を入力

以下のような画面になるので、必要事項を入れていきます。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/67398/4ede5ef3-2657-740e-8324-8de430d35261.png)


**するめごはんはてなブログ** では、以下のように作成しています。

![4_surumeblog.png](https://qiita-image-store.s3.amazonaws.com/0/67398/1c798881-096f-312d-38ef-5ba9f328bdc1.png)

**<font color="Red">フィードの箇所に、はてなブログのRSSのURLを記入すれば解決です。</font>**

事実上、今回のスキル作成は。ほぼこれだけです。

##4.警告がでまくる

警告がものすごくでてきます。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/67398/d5fb9a4b-6885-2c72-ec0e-8cd95f0aae01.png)

実は読み上げられる文字数の最大値は決められており、4500文字までとなっています。

この文字数に半角英数字なり、記号なり、改行コードなり、等がどのように計算されているのかは僕は確かめてないです。

が、**気にせずに「保存」してしまいます。**


ちなみに、スキルの説明は最低限だけ記載すればOKです。
何を読み上げる（流す）のかと、ストップで止めることができる旨を書いておけば良いみたいです。


##5.Amazon.co.jp alexaにサインイン

ここからは　@zono_0 さんの
https://qiita.com/zono_0/items/10719a9df59d3af3edd2
とほぼ同じです。


https://alexa.amazon.co.jp/spa/index.html

を開いて、作成したフラッシュブリーフィングスキルの「設定」を押します。

![6.png](https://qiita-image-store.s3.amazonaws.com/0/67398/f9660ef0-cb93-b019-8a5f-add6a5a156e9.png)

画面が遷移したら「フラッシュニースの管理」を押します。

![7.png](https://qiita-image-store.s3.amazonaws.com/0/67398/bdff13b3-1c6c-72e6-58e9-6b77bdd5cd40.png)

後は、自分のスキルを「オン」にするようにトグルを押します。

![8.png](https://qiita-image-store.s3.amazonaws.com/0/67398/77ff07a0-3fd0-a5c7-bda8-b91cc44c4fa8.png)


ニュースを流す順番は個々人で好きに調整できます。


#公開されると

審査が通過すると、自分のはてなブログを読み上げるスキルが少なくとも日本国内にお届けできます。

実際に自分で試してみると、RSSを取得して読み上げているだけなので、**URLなどの記号を丁寧に読み上げてくれる素敵なスキルが公開されます。**


はい、5日目の記事は以上です。
PowerAppsでUserAgentに応じた処理を行う

#やりたいこと
よくWebアプリでは利用しているデバイスがモバイルなのか、PCなのかで処理を分けることがあります。
例えば、ファイルダウンロードボタンを実装する際、iOSでは非表示にして、それ以外のファイルダウンロードができるブラウザからのアクセスでは表示というような実装です。
これを実現するためには一般に、利用しているブラウザのuser agentを利用して、その中に特定文字列がはいっているか(例えばiPhone とか mobileとか)で処理をわけます。

PowerAppsも、通常のWebアプリと同様に、iOSアプリやAndroidアプリ、またはPCのブラウザからの利用がありますので、「どこから利用しているか」によった処理を実装を求められることが考えられます。
※この記事はMinaさんのTweetをきっかけとしています。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">おや、<a href="https://twitter.com/hashtag/PowerApps?src=hash&amp;ref_src=twsrc%5Etfw">#PowerApps</a> ちゃんはUserAgent(あるいはデバイス)を取れない…？</p>&mdash; Mina (@ma_00336) <a href="https://twitter.com/ma_00336/status/1069857091957846016?ref_src=twsrc%5Etfw">December 4, 2018</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

#実装
PowerAppsでは直接user agent stringを取得することはできません。この処理の実現には非常に単純なFlowを用います。
ポイントは、PowerAppsからFlowを呼び出した際の出力(triggerOutputs)のヘッダーにUser-Agentが含まれているということです。これが利用者のアプリ/ブラウザの別を判定するのに使えます。
PCのブラウザからアクセスした場合には、アクセス元のブラウザのuser agentが表示されます。一方でモバイルアプリからアクセスした場合には下図のような文字列が出力されていました。
なおこの際ヘッダーからのuser agent取得には
```triggerOutputs()['headers']['User-Agent']```
<img width="791" alt="useragent.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/202779/d2c1bd66-e0af-aa09-7a20-81b3bc4d87b3.png">


を利用しました。
<img width="987" alt="UA.png" src="https://qiita-image-store.s3.amazonaws.com/0/202779/92f67a14-a780-b576-0142-b233fbdbf270.png">

これらの文字列が含まれる場合には、PowerAppsに"Mobile"という文字列を返すことにします。
```@or(contains(variables('UA'), 'PowerApps'),contains(variables('UA'), 'okhttp'))```
Flowの全体は以下の通りです。
<img width="1057" alt="FlowALL.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/202779/ae931ef7-c10c-d32a-8475-c584b0893fdf.png">

あとはこのFlowを画面のOnVisibleで呼ぶなどして、ボタンの表示/非表示等の処理に利用してください。

#おまけ
サンプルで試してみました。
PCの場合↓
<img width="674" alt="PC__UA.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/202779/1dc1c903-95a8-0f09-751b-5a689a96e13b.png">

アプリからの場合↓
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/202779/2866e11c-b747-273c-cea8-4ae9375ebd60.png)
Sublime Mergeの紹介

![image.png](https://qiita-image-store.s3.amazonaws.com/0/213719/2f077afb-3ab4-e326-4c5c-c67030413d1a.png)


最近、Sublime Text環境を作っていたら[Sublime Merge](https://www.sublimemerge.com/)というソフトウェアが新しくリリースされていたことに気づきました。軽く試用していたのですが、個人的にいつも使っていたSourcetreeよりも好みだったので紹介します。

# どういうソフトか？

いわゆるGitのGUIフロントエンドソフトです。[Sourcetree](https://www.sourcetreeapp.com/)が一番有名だと思いますが、だいたい使い方は似ています。Sublime Textと同じように、Mac/Linux/Windowsのマルチプラットフォームで動作するソフトです。

## 基本的な画面

左側にヒストリー、右側に編集中ファイルの一覧が表示されます。ヒストリーは、ブランチが複数あればちゃんとツリー状に表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/213719/8715caa6-9288-d092-175a-f0ddf98524f1.png)

Diffもキレイに表示してくれますし、Hunk単位（さらにLine単位）でのコミットも可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/213719/0b2245f3-c5ba-f925-8e27-a65a72b000cb.png)


## サイドバーを出した画面

ツールバーの一番左端にあるボタンを押すと、左側からサイドバーがニョッキっと表示されます。そこで色々右側の表示・非表示を切り替えることができます。結構細かく設定できます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/213719/1f6cc4b2-dca4-f562-086e-d4905a32c2d1.png)

現在のローカルブランチだけ表示させた図。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/213719/f4983e5d-6589-84eb-8ce5-1e978e7eda75.png)

## 料金

Sublime Textより少し高い99ドルです。買い切りです。試用期間無制限で利用できるので、評価してみて肌にあったら購入すれば良いと思います（自分も、もう少し触って常用できそうだったら購入します）。

また、Sublime Text 3だとDev Build（実験的に機能が色々入ってくるビルド）はライセンス購入者しか利用できないですが、こちらは（今のところ）誰でもDev Buildが利用できます。

※ちなみにSublime MergeのDev Buildは https://www.sublimemerge.com/dev からダウンロードできます。

# 個人的に良いと思った点

- 軽い
    - Sourcetreeよりだいぶ軽いです
- リベースが（比較的）わかりやすい
    - Sourcetreeのrebaseは分かりづらいと個人的に思っていますが、Sublime Mergeはそこそこ直感的にできるような気がしました
    - 例えば、rebase対象にしたいコミットをヒストリーから直接選べたりとか
- 操作性がSublime Textと似ている
    - `Ctrl(Command) + Shift + P`でコマンドパレットが開いたりとか

# 微妙だと思った点

- 少し高い
    - 99ドルは、少し躊躇しますね。Sublime Textが80ドルなだけに、Gitできるだけで99ドルか～と思ってしまいます
- 2回クリックで確定のユーザーインターフェース
    - コミットを確定する操作など、もとに戻すのが面倒な操作については2回ボタンをクリックして確定するユーザーインターフェースになっています
    - 個人的に嫌いではないですが、やや面倒な気はします
    - でもダイアログが出てくるとかよりは何倍も好きです
- カスタマイズができない
    - メニューに`Browse Packages...`という項目があったので、PackageControl的な機能が…？と期待していたのですが、特に無いようです
- ググラビティが（まだ）良くない
    - Sublime Textのプラグインで、Sublimergeというのがあるっぽく、Sublime Mergeでググるとそちらの情報がよく引っかかります
Firebaseのデータベースで複数のデータを読まないように制限をかけたい

* 下記の例は `trees`配下の`apple`を複数同時に読むことを禁止し、IDを指定すると個別に読むことを許可している。

```javascript
{
  "rules": {
    ".read": false,
    ".write": false, 
    "ｔrees": {
        ".read": false,
        ".write": false,
        "$tree_id" : {
            ".read": true, 
            "apples" : {
                ".read": false,  // 複数を同時読み込みを禁止
                "$apple_id": {
                  ".read": true  // appleのIDを指定すると1件ずつ読込できる。
                }
             }
        }
    }
}
```
MARISA Trie でコーパスの語彙サイズや未知語率を調べる

通常の大きさのコーパスであれば、sort コマンドや uniq コマンドを使って、語彙サイズなどを調査することが可能です。例えば、1行1文形式で格納されているコーパスの語彙サイズを調査する方法は以下の通りです。

最初に、1行1単語形式のファイルを作ります。

```shell-session
$ mecab < train_corpus.txt > train_corpus.mecab
$ grep -v EOS train_corpus.mecab | cut -f1 > train_corpus.tokens
```

1行1単語形式のファイルが作成できれば、後は簡単です。各単語の出現頻度を調べるには、以下のようにします。

```shell-session
$ sort train_corpus.tokens | uniq -c
```

語彙サイズを調べるには、以下のようにします。

```shell-session
$ sort train_corpus.tokens | uniq | wc -l
```

ただ、コーパスが大きくなると、sort コマンドの実行時間が無視できなくなってきます。そのような場合は、[MARISA Trie](http://www.s-yata.jp/marisa-trie/docs/readme.ja.html) のツールを使うと高速に調査することが可能です。なお、Debian GNU/Linux 環境では MARISA Trie のツールは、以下のコマンドで容易にインストールできます。

```shell-session
$ sudo apt install marisa
```

最初に、trie を作成します。

```shell-session
$ marisa-build < train_corpus.tokens > train_corpus.trie
```

語彙サイズを調べるには、以下のように trie に登録されている語彙を全て出力します。

```shell-session
$ marisa-dump train_corpus.trie > train_corpus.vocab
input: train_corpus.trie
#keys: 625
$ wc -l train_corpus.vocab
625
```

実のところ、marisa-dump コマンドは、標準エラー出力に trie に登録されている語彙サイズを出力してくれるので、wc コマンドは不要ですが。

次に、学習コーパス `train_corpus.txt` の語彙を既知語として、テストコーパス `test_corpus.txt` の未知語頻度などを調べてみます。この時は、marisa-lookup コマンドを使います。marisa-lookup コマンドは、標準入力から1行1単語形式で検索対象トークンを受け取り、標準出力に検索結果を出力します。特に、trie に登録されていない未知語に対しては「-1」を出力します。したがって、未知語頻度を調べるには、「-1」の行数を調べれば良いわけです。

```shell-session
$ marisa-lookup train_corpus.trie < test_corpus.tokens | grep -- -1 | wc -l
554
```

異なりの未知語率を調べる場合は、`test_corpus.tokens` ではなく、語彙に含まれる各単語が1回だけ出現する `test_corpus.vocab` を使えば良いことになります。

```shell-session
$ marisa-build < test_corpus.tokens > test_corpus.trie
#keys: 633
#nodes: 847
size: 7112
$ marisa-dump test_corpus.trie > test_corpus.vocab
input: test_corpus.trie
#keys: 633
$ marisa-lookup train_corpus.trie < test_corpus.vocab | grep -- -1 | wc -l
381
```
【SAPUI5】コントロールとコントローラは何が違うのか？

##はじめに
[前回](https://qiita.com/tami/items/d49862415b8e41717d35)の記事で、Shellcontrolについてご紹介しましたが、ふと「そもそもコントロールって何？ コントローラとどう違うの？」という疑問がわいたので、コントロールについて調べてみました。

##コントロールとは
[公式ドキュメント](https://sapui5.hana.ondemand.com/#/topic/ddbceecd7d3d42eea9cf78a820a238fb)によれば、**画面のパーツの見た目や動作を定義するために使われるもの**だそうです。
たとえば、画面にボタンを表示するために以下のようなソースを書きました。ここで使われているButtonはControlの一種です。一方コントローラはビューを操作するためのロジックのことでしたね。

```xml
<mvc:View
   controllerName="test.helloworld.controller.App"
   xmlns="sap.m"
   xmlns:mvc="sap.ui.core.mvc">
   <Button
      text="Say Hello"
      press="onShowHello"/>
</mvc:View>
```

##APIリファレンスを見てみると
[sap.m.Button](https://sapui5.hana.ondemand.com/#/api/sap.m.Button)のAPIリファレンスを見てみます。
Extends:のところに"sap.ui.core.Control"とあり、"sap.ui.core.Control"という抽象クラスを継承したものであることがわかります。このように、すべてのコントロールはsap.ui.core.Controlクラスを継承して作られています。
![WS000027.JPG](https://qiita-image-store.s3.amazonaws.com/0/276021/14e6e29d-2bc2-eb45-0f2b-c6538fbe6eb7.jpeg)

また、その下にはProperties, Associations, Events, Methodsとあります。これらはコントローラのメタデータと呼ばれます。Buttonにはありませんが、Aggregationを定義しているコントロールもあります。

|メタデータの属性  |意味  |例  |
|---|---|---|
|Properties  |外部からアクセス可能なプロパティ |text, type |
|Associations |コントロールと他の要素とカーディナリティ |Buttonに対して0～nのラベルを定義できる |
|Aggregation |コントロールとその子要素のカーディナリティ |Toolbarの中に0～nの子要素を配置できる |
|Events |コントロールに対して定義されたイベント |press：ボタンが押されたときのイベント|
|Methods |コントロールに対して定義された外部からアクセス可能なメソッド |getText：textの値を取得|

##まとめ

- コントローラは画面のパーツの見た目や動作を定義するために使われるもの
- "sap.ui.core.Control"クラスを継承して作られている
- プロパティを設定することで見た目を変えたり、イベントやメソッドを利用して動作を定義することができる


##参考にしたページ
[[SAPUI5/OpenUI5]カスタムUIコントロールを作成する方法(前編)](https://blog.mitsuruog.info/2014/09/sapui5openui5ui)
IoTLT会場運営についてアレコレ

はじめまして、[IoTLT Advent Calendar 2018 Mitzめ！](https://qiita.com/advent-calendar/2018/iotlt_mitz) 12/4 を担当しました、
[野良ハック](https://qiita.com/yskmjp/items/cedbfd3f3980c42a8771)メンバーのむらまさです。
ちなみに今日が誕生日です。
Advent Calendar、Qiitaはおろかこういった類の長文ブログをPCで書くこと自体mixiぶりなので緊張しています。

~~締め切りまで時間がないので~~ IoTLT の Advent Calendarは3つもあり、技術的な面白い記事はあとに控えるたくさんの方々が書かれると思いますので
趣向を変えて会場運営についてのアレコレを書いてみたいと思います。
※実質は会場提供ですが長いので便宜上「開催」と表記してます。

きっかけ
---
ご存じのとおりIoTLTは毎回各社が会議室やセミナールームのような場所を無償で貸出し運営されています。
主催の のびすけさん から弊社で開催出来ないかと相談を受け、軽い気持ちで引き受けたのが弊社開催のきっかけでした。
ほんとにすっごい軽い気持ちで引き受けました。
![adb001.png](https://qiita-image-store.s3.amazonaws.com/0/115904/af36dec9-c1e2-b0ad-d986-3f9993d9d334.png)

ところが
---
予想以上にやることいっぱい！
![Advent02.png](https://qiita-image-store.s3.amazonaws.com/0/115904/31358ff2-1c5e-fcef-563f-696cac9169a9.png)
ナメてました、基本オープンなイベントやらない企業なのでセキュリティルールが厳しく、
これまでそういったイベントを開催した前例がなかったためマニュアルもありませんでした。
これらを一つずつ整理し、マニュアル化して協力してくれる同志を集め、なんとか開催にこじつけました。
弊社だけでなく、自社に大きな会議室はあるけど社外イベントに利用できるかわからないという方のために汎用的に使えそうな、開催前に確認したおくべきことをまとめました。
ここら辺がクリアできれば引き受けちゃっても大丈夫ではないでしょうか。

 **1. イベントスペース(大会議室)の利用規約の確認
 2. イベントスペース(大会議室)の予約状況と予約のルール
 3. 社外の方の入館ルール(少人数/大人数)
 4. 玄関ホールに専用受付を設置する許可の有無
 5. エレベータの直通運用可否
 6. 懇親会費予算の稟議ルール(接待にならないか)
 7. 機材の使い方**
こんなところでしょうか。

connpassの活用
----
会社のセキュリティルールによっては入館者の氏名、勤め先情報などを頂戴するシステムの会社もあると思います。
第一回目の開催では受付時に署名いただく手続きをとったため、結構長蛇の入場待ちが発生してしまいました。
そんな時にconnpassの**アンケート機能**が便利です。
入館者リスト等、イベント後に会社に提出する必要のある情報があるならば、あらかじめ入力してもらいましょう。
受付では印刷したリストにチェックを入れてもらうだけで入れるようにすればスムーズです。

![adb003.png](https://qiita-image-store.s3.amazonaws.com/0/115904/33350d0d-af40-b680-c84a-cef9749b8784.png)

とはいえ、入力不備やドタ参はある前提で臨みましょう。

また、会場となる自社の入っているビルと同じような名前のビルがないか要確認です。
今は100人前後までのキャパであれば隣のビルでイベント開催しているため、よりカオスになってます。
会場説明は明確に！
![Advent08.png](https://qiita-image-store.s3.amazonaws.com/0/115904/0c19ae8e-0a8c-2251-f76d-e108f5dbec6b.png)


会場レイアウト
---
よく見る光景、アリーナ後方状態。
特に弊社のイベントスペースはスクリーンが低い位置にあるため、後方は見づらくて仕方ありません。
まあ食堂ですしね笑
![Advent04.png](https://qiita-image-store.s3.amazonaws.com/0/115904/ff248a80-1011-7680-be49-5ecf45b47f20.png)

後方にモニタを設置し、どの席にいてもスライドが見えるようにしました。
![Advent06.png](https://qiita-image-store.s3.amazonaws.com/0/115904/f1d763eb-baa2-89b7-724b-356275d5a871.png)

当日のアレコレ
---
某日のイベント中タイムラインが**マイク**で埋まる。
![Advent07.png](https://qiita-image-store.s3.amazonaws.com/0/115904/a4d63d85-9d9b-88cf-b8ef-14e918d76ecc.png)
**マイクの充電と予備の準備は入念に！**

イベントを開催するたびに溜まっていく余ったお酒。
次回に使い回すにもこの量冷やすのはなかなか大変なので結果的にこんな感じに。
![IMG_6709.jpg](https://qiita-image-store.s3.amazonaws.com/0/115904/366cccc1-31d3-c89f-47b5-12b6d651e834.jpeg)
懇親会はイベント参加者の7～8割x2ぐらいで計算していますが、なかなかむずかしい。。。
とりあえず箱ごと冷やせる大きな冷蔵庫が欲しいです。

まとめ
---
初回はいろいろ大変でしたが、回を重ねるごとに運営ノウハウの共有とマニュアル化が進み、最近はかなり楽にイベントが開催できるようになりました。
IoTLT以外でも弊社を会場にイベントが行われることが増えています。
最近ではスピンオフ系の中規模イベントであれば、独立したフロアのため細かいセキュリティチェックなしで入れる隣のビル(新館)も使用しています。
我々も楽しんで運営していますので、なにかあればご相談ください(できれば2か月くらい前に)。
![Advent09.png](https://qiita-image-store.s3.amazonaws.com/0/115904/45ef5946-7a0b-7ded-f33f-ec111e07a4b6.png)

また、このイベントをきっかけに社外だけでなく、[野良ハック](https://qiita.com/yskmjp/items/cedbfd3f3980c42a8771)をはじめとする社内のこれまで関係のなかった部署の面白い人たちと交流を深めることができました。
~~おかしい~~面白い人たちって案外近くにいるものだったりします。
社内に潜む同志を見つけるきっかけにもなりますので、もし引き受けるか悩んでいる方がいましたら、自分の会社で会場スポンサー、一度はやってみてはいかがでしょうか！
夫婦生活にも使えるマネジメント術

## まえがき
この記事は、[Engineering Manager vol.2 Advent Calendar 2018](https://qiita.com/advent-calendar/2018/em2) 7日目向けに書きました。

@fukuo33 です。[株式会社サイバーエージェント](https://www.cyberagent.co.jp)でエンジニアリングマネージャーを3年ほどやっています。
突然ですが、今年めでたく結婚いたしました。お相手は社内のエンジニアです。
今年一年はより円満な夫婦生活を送るために、業務で培ったピープルマネジメントを活用しようといろいろ試してきました。
今回は、我が家の夫婦生活において、業務でのマネジメントと同様な手法が使えたところ、使えるが気をつけたほうが良かったところ、を公開しようと思います。

## 前提
今回のお話は、僕と妻との関係が `同一会社、同一職種` であり、コンテキストが近い関係であることに注意してご覧ください。
また、基本的にこちら2冊の本から考えを拝借しています。
[エンジニアリング組織論への招待　～不確実性に向き合う思考と組織のリファクタリング | 広木 大地 ](https://www.amazon.co.jp/dp/B079TLW41L)
[パフォーマンス・マネジメント―問題解決のための行動分析学 | 島宗 理 ](https://www.amazon.co.jp/%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%83%BB%E3%83%9E%E3%83%8D%E3%82%B8%E3%83%A1%E3%83%B3%E3%83%88%E2%80%95%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E8%A1%8C%E5%8B%95%E5%88%86%E6%9E%90%E5%AD%A6-%E5%B3%B6%E5%AE%97-%E7%90%86/dp/494655307X)


## テクニック その1: 傾聴(1on1)
傾聴は、夫婦生活において「ねぇ、今日さ、こんなことがあったの」のような妻の何気ない一言から始まります。まず気をつけることは、`始めから自分の意見(アドバイス)は言わない` ようにしています。これは通常の傾聴と同じで、まずは吐き出すことで妻の気持ちが整理されることを期待します。

通常の傾聴と変えてるところは、`①問題整理に入る前に、より長く話を聞く` ことと、 `②共感をより多めに使う` ことです。

①に関しては、業務での1on1は限られた時間の中で実施するので質問を使い相手の思考整理をサポートしますが、妻とは長い時間を共にすることもありまずは吐き出すことによる妻の自己整理を優先させています。本音を言うと、僕自身も業務での1on1並に頭を使い質問をすると、疲れてしまうというのもあります。
②に関しては、適度なあいづちとともに共通の課題に向かってる姿勢を示し、①同様妻の自己整理を期待します。気をつけてることとしては「スマホやテレビばっかり見ない」。問題の深刻度に応じて、スマホを置く、テレビを消す、ようにしています。家でのリラックスタイムとはいえ、気は抜きすぎるのも禁物ですね。

## テクニック その2: 二人で決めた状態にする
[「夕飯何食べたい？」が持つ理不尽さと、ベストな返答の考察 | 自分の心を殺してはいけない](https://koto1.com/archives/5501)
上記のブログにもあるとおり、夫婦生活を送っていると、妻の「夕飯何食べたい？」という質問は度々発生します。このブログ内でもベストな返答は提示されていますが、マネージャー兼夫としても深掘って考えたいと思います。

まず、考え方の核となるのは `「他者説得を自己説得に」` です。

業務でのマネジメントでは、トップダウンな意見にしないために `相手に決定の裁量を与える=選択肢を提示する` ことをします。
夫婦生活では、僕(夫)が決めた/妻が決めたではなく `二人で決めた` 状態を目指します。

僕(夫)が独断で決めてしまうと妻はトップダウンのように感じますし、それに対して意見を言われることは僕自身のアイデンティティを侵されたように感じてしまいます。逆も然りです。
二人で決めた状態にすれば、問題があっても二人で反省できるし、良かったことは二人の共通認識になります。具体的には
妻「夕飯何食べたい？」僕「僕はxx食べたいけど、何が作れるんだっけ？{妻}は何食べたいの？」妻「xxx」僕「xxx」
のような感じで要は対話ですね。

## テクニック その3: 「(僕は)悲しい気持ちになった」
これは妻がナチュラルに使っているので、僕も真似して使うようにしているテクニックです。

何か相手の行動を直して欲しいときに、相手の行動を直接注意するのではなく、「(僕は)あの行動、気になったかも」のようなメッセージにしています。
直接的な注意に対しては、反発の原理が働くことがあり素直に意見を聞けなくなることがあります。ここで主語を自分にすることで、妻への攻撃ではないという態度を示し、妻が考えるきっかけ作りになるようにしています。

これは逆に業務でのマネジメントにも応用するようにしています。

## テクニック その4: 夫婦喧嘩
僕自身はあまりアイデンティティの範囲が広くないので感情的になることは少ないのですが、それでも何度か夫婦喧嘩がありました。

この反省を踏まえて気をつけていることは、`アイデンティティの範囲` と `反発の原理` です。

夫婦生活の中では、僕の何気ない行動が妻を怒らせたり、何気ない指摘で怒らせたり、してしまうことがあります。'地雷' や '空気を読む' のようにも形容されますが、アイデンティティの範囲は目に見えません。故に `相手が何を大事にしてるのか`、何をアイデンティティとしているのかを学ぶようにしています。
また その2 と同様に問題に対しては `二人で解決する` ことを意識します。幸い我が家はふたりともエンジニアなので、機械の力を活用することが多いですね。
妻「いつも電気つけっぱなしじゃん！」僕「ごめんね」 -> 二人で考えて「Nature Remoで管理するようにしよう」

また、何気ない指摘で相手を怒らせてしまったときはさらに慎重に対処するようにしています。なぜなら反発の原理として妻の意見が僕への反論にすり替わってしまうことがあるからです。この反論に対して僕が腹を立ててしまうと喧嘩に発展していってしまいます。
対処としては、この `反発の原理があるということを理解する` こと。
これが理解できていれば、相手の反論に過剰に反応せず、相手を怒らせてしまった=アイデンティティを侵してしまったという `自己反省に切り替える` ことができます。

## まとめ
とりとめのない感じになってしまいました。
実際のところは、僕だけでなくむしろ妻のたくさんの努力があって、今の所我が家は家庭円満です。この場を借りて、妻に感謝したいと思います。
「いつもたくさんのサポートありがとう。そのおかげで僕はがんばれます」

※ 率直な感謝も大事ですね^^;
Windows 上の香り屋 Vim にて Python3 (3.6) を利用できるようにする

この記事は [BrainPad Advent Calendar 2018](https://qiita.com/advent-calendar/2018/brainpad) 9日目の記事です。

この記事の内容は [クマーなひとときv2 組込版pythonを使ってvim8のif_pythonを有効化させる](http://tonkuma.hatenablog.com/entry/2016/12/24/060000) の内容を8割自分向けにまとめたものとなります。ありがとうございます。

# 設定手順

## Python の設定

1. Python 3.6 組み込み版 (Windows x86-64 embeddable zip file) をダウンロードする。 [^1] [^2]
2. ストレージの適当なパスに展開する。
3. 展開したディレクトリ内の `python36.zip` を解凍し、ディレクトリ名を python3 に変え、適当なパスに退避しておく。

[^1]: https://www.python.org/downloads/
[^2]: Python 3.7 を利用する場合は、先に [Visual Studio 2015 の Visual C++ 再頒布可能パッケージ](https://www.microsoft.com/ja-jp/download/details.aspx?id=48145) をインストールしておく。これは [方針として Python 3.7 から組み込み版に再頒布パッケージを同梱しないようになったため](https://bugs.python.org/issue34072) らしい。ただし、 Python 3.7 を利用すると、 [Vim のバージョンによっては起動時に警告が表示されます。](https://github.com/vim/vim/issues/3117)


## Vim の設定

1. 香り屋 Vim を取得し手元環境に展開する。 [^3]
2. 上記で展開したディレクトリ内に vimfile ディレクトリを作成する。
3. 上記で作成した vimfile ディレクトリ内に、 Python の設定で退避した python3 ディレクトリをこの vimfile 内に移動する。
4. `~/.vimrc` などの Vim の設定ファイルに `set pythonthreedll=path\to\python36.dll` を記載する。記載するパスは Python の設定で展開したファイル内の `python36.dll` を参照するようにする。

[^3]: [香り屋管理者様の netupvim](https://github.com/koron/netupvim/releases/tag/v1.4.1) が便利です。

# まとめ

上記手順に従えば Vim 上で `echo has('python3')` の結果が `1` になるのではないでしょうか。

# 宣伝

なお、 [弊社](https://www.brainpad.co.jp/) 実はデータ分析のみならず [Rtoaster という Private DMP](https://www.rtoaster.com/) も開発しており、 [各種ご利用者様にご好評いただいております。](https://www.rtoaster.com/cases/)

採用に関し、ポジションとしては [Python3 を用いてデータ分析機能を構築するもの](https://jobs.forkwell.com/BrainPad/jobs/3865) や [GCP の GKE を用いて広告分野に関してごりごりに開発しているもの](https://jobs.forkwell.com/BrainPad/jobs/3740) もあります。もちろん Vim でも開発できますし、 IDE (Intellij IDEA/PyCharm など) の購入補助もあります。

各ページ、または [リクルートサイト](https://www.brainpad.co.jp/recruit/) もありますので、ご興味あればご連絡ください。
手作業で画像を配置したくないんです

100枚くらいある顕微鏡画像をイラレでトレースして pngで書き出して面積を出すという苦行をやっています。
イラレじゃなくていいという意見もありますが、やっぱりイラレが使いやすいんだ・・・。いちいち画像を自分で配置するのがかったるいので配置スクリプトを書いてみました。

```
dir = Folder.selectDialog("画像フォルダを選択して下さい")
if (dir != null){
    plist = dir.getFiles("*.jpg"); // list of jpg files
    n = plist.length; // number of picture
    for(i=0; i<n; i++){
        
        pfile = new File(plist[i]);
        pname = pfile.name;         
        alert(pname);
        
        docObj = documents.add(DocumentColorSpace.CMYK, 2400, 2400)

        layerObj = app.activeDocument.layers;

        pictLayer = layerObj.add();
        pictLayer.name = "pict"
        
        pplacement = docObj.placedItems.add();
        pplacement.file = pfile;

        plaqueLayer = layerObj.add();
        plaqueLayer.name = "layer1"
        
        stainLayer = layerObj.add();
        stainLayer.name = "layer2"
        
        var outname=new File (pfile.path + "/" + pname + ".ai")
        alert(outname)
        docObj.saveAs(outname)
    }
}
```

これをCS5のイラレから呼び出すと、画像ディレクトリを要求されて、これを指定するとそこにおいてあるjpgファイルが中心に配置されてかつトレース用のレイヤーが2つ用意された.```name_of_gazo.ai```ファイルが出来上がります。これをちまちま測定するんだ。
テキストの感情分析をするためのクラウドサービス比較（2018年版）

**この投稿は2018年12月時点の情報です。**
2019年版はこちらにあります。
[テキストの感情分析をするためのクラウドサービス比較（2019年版)](https://qiita.com/kazu20/items/b3e01e281fb668317084)
# 概要
テキストの感情分析するのにいろいろなクラウドサービスがあるが、何を選んでいいのかがよくわからない。
基本的にできることは同じようなことだと思うが、無料でどこまでできるか、日本語に対応しているかなど、以下の項目で各サービスの比較を行った

## 比較項目

1. 日本語対応の有無
- 無料で使える範囲
- クレジットカード登録の有無
- 料金
- 呼び出し方


# Google Cloud natural Language
|比較項目|調査内容|
|---------------|-------------|
|日本語対応の有無|APIは日本語に対応している。チュートリアルも日本語対応している。|
|無料で使える範囲|月５０００リクエストまでは、無料。登録すると、１２ヶ月利用できる３００ドル分のクレジットが付与される。|
|クレジットカード登録の有無|無料トライアルをするには、クレジットカードの登録が必要だが、有料アカウントに手動でアップグレードしない限り、課金されることはない。|
|料金|月５０００リクエストまでは、無料。ただし、１リクエストのMAXは１０００文字なので、１３００文字のリクエストを投げると、２リクエストとなる。月５０００リクエストを超えると、１０００リクエスト単位で課金される。料金表は以下のURLを参照のこと。高くても１０００リクエストあたり２ドル。https://cloud.google.com/natural-language/pricing?hl=ja|
|呼び出し方|RESTで投げるとJSONで帰ってくる。入門ガイドに言語ごとに参考プログラムがある。https://cloud.google.com/natural-language/docs/analyzing-sentiment?hl=ja#language-sentiment-string-go|



# Amazon Comprehend

|比較項目|調査内容|
|---------------|-------------|
|日本語対応の有無|2019年11月に日本語対応。ただし、東京リージョンでは対応していないので、リージョン選択に注意。https://aws.amazon.com/jp/blogs/news/amazon-comprehend-japanese/|
|無料で使える範囲|12ヶ月間で５M文字まで無料。月ごとの無料枠があるわけではなく、アカウント作成から１２ヶ月間の期限つきの無料枠。|
|クレジットカード登録の有無|必要。無料枠を使い切ると自動的に課金されるが、上限に近づいたらメールで通知する機能がある。|
|料金|リクエストは１００文字を１ユニットとして計算されて、各リクエストに月３ユニットが最低料金となる。料金は１０Mユニットまでは、ユニットあたり0.0001$なので、最小のリクエストを１０００リクエスト投げても、3$。|
|呼び出し方|言語ごとにAPIが準備されていて、それを叩く。戻りはJSON。|

# Azure Cognitive Services
|比較項目|調査内容|
|---------------|-------------|
|日本語対応の有無|日本語に対応した。ドキュメントは日本語対応している。|
|無料で使える範囲|Azureは無料枠が２つある。ゲスト・・・７日間の試用期間が与えられる。クレジットカードの登録は不要だが、試用期間終了後にデータが削除される。無料のAzureアカウント・・・有効期限のない無料プラン。１ヶ月５０００トランザクションまで無料。そのほかに22,500円のクレジットが付与される。コンテナ作成時にFreeレベルで作成しておけば、5000トランザックションを超えると制限がかかるため、自動的に課金されることはない。|
|クレジットカード登録の有無|ゲストは不要、無料のAzureアカウントは必要|
|料金|500,000テキストレコードで224円。１テキストレコードは1000文字。1300文字は２テキストレコードとなる。|
|呼び出し方|RESTで投げるとJSONで帰ってくる。.NETはAPIが準備されている。|


# IBM Watson Tone Analyzer
|比較項目|調査内容|
|---------------|-------------|
|日本語対応の有無|APIは日本語未対応。ドキュメントは日本語もあるが、詳細なドキュメントは英語。|
|無料で使える範囲|ライトアカウントであれば、１ヶ月あたり2,500件のAPI呼び出しが無料。標準アカウントの場合は、1,000回のAPI呼び出しまで無料。|
|クレジットカード登録の有無|ライトアカウントであればクレジットカードの登録は不要。|
|料金|250,000呼び出しまでは、１呼び出しあたり0.0088$。|
|呼び出し方|RESTで投げるとJSONで帰ってくる。SDKもある。|



# まとめ
有名どころの４サービスについて調査をしたが、日本語の感情分析に対応しているのはGoogleだけだった。
他のサービスもドキュメントは日本語対応していても、APIが日本語対応していないのでは使えない。
Amazon以外は勝手に課金されることはないので、「無料枠で使うつもりが、いつの間にか課金されてた！」がないのが良いなと思った。
使い勝手はまだ使っていないのでわからないが、どれもよくあるWebAPIな感じ。

というわけで、日本語の感情分析をしたい場合は、Google Cloud natural Language一択!
（2018年12月4日現在）
TeratermでWHILL Model CRとの通信をサクッと確認する方法

この記事は[WHILL Advent Calendar](https://adventar.org/calendars/3238)の4日目の記事です.
4日目は中の人でソフトウェアエンジニアの白井がお送りします。

# この記事の目的
この記事では、WHILL model CRとPCの接続に問題がないかをTera Termを使って簡単に確認する方法を書きます。
例えば、自作接続ケーブルでマイコンとWHILL model CRの通信がうまくいかないときに、自作接続ケーブルとマイコンのどちらに問題があるのか確認するときに使えると思います。
接続ケーブルの作り方は12/14に書かれるであろう[Mio](https://adventar.org/users/22462)の記事を参考にしてください。

# 用意するもの
- Windows PC
- 接続ケーブル
- USB - RC232Cケーブル
    - 今回はiBUFFALO USBシリアルケーブル BSUSRC0610BS を使いました。
- [whill_tertarm](https://github.com/WHILL/whill_teraterm)から`whill_control_system2.ini`と`get_data_1.ttl`をダウンロード

# 事前準備
PC -- (USB-RS232Cケーブル) -- (接続ケーブル) -- WHILL model CR のように接続する。

# Tera Termの設定
Tera Termを管理者権限で起動して、USB-RS232Cケーブルのシリアルポートを選択してください。今回の例だと、COM6になります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23947/c7c1952c-5e4c-21a1-765c-a03a54fdee42.png)

`設定(s)` --> `設定の読み込み(R)`からwhill_control_system2.iniを開きます。

これで設定は完了です。

# 通信確認
## WHILL model CRにデータを送ってみる
WHILL model CRにStartSendingDataコマンドを送ってみます。
まずWHILL model CR本体の電源をONします。
Tera Termの`コントロール(O)` --> `マクロ(M)`からget_data_1.ttlを開きます。
これでPCからWHILL model CRに"Data set 1のデータを1秒間でWHILL model CRから送る"コマンドが発行されました。
ただし、このままだとTera Termの表示は文字化けして表示されてしまいます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23947/1ac7b42a-6a9f-2f92-603c-007f764a5b0f.png)

## 受信したバイナリデータの表示方法(文字化け対策)
表示はSHIFT + ESCで切り替えできます。
WHILL model CRからデータを受信してながら、SHIFT + ESCを2回押すと、バイナリデータが正しく表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/23947/05e5bca0-1191-53a9-0f34-3b30391b0089.png)

#まとめ
これでPCとWHILL model CRが送受信できているか最低限の確認はできました。
接続ケーブルを自作したときなどに、動作確認の役に立てば嬉しいです。
実際にWHILL model CRを制御したい場合は、PCやマイコンでプログラムしたほうがいいです。
参考に[ArduinoからWHILL Model CRを動かす](https://qiita.com/aquahika/items/14a129db401926485bda)を御覧ください。

# 参考
[Tera Termでバイナリ通信](https://eng-memo.info/blog/teraterm/)
GPUSound入門

ご無沙汰しております、Machiaです。

１年半以上シンセサイザー入門書いてませんが、その間何してたかというと仕事が忙しくなったりその状態で趣味のゲーム開発したり作曲したりTDF合わせでついうっかり4kb introを作り始めたりしてそんな余裕ねえじゃねえかアハハという状況です。

今回はGPU Soundについて記載残しときます。
自分はGLSLで書いてるんですが、別にGLSLに限ったことでもないのでこの名前にしとこうかと。

# GPUSoundとは

GPUSoundとは、とりあえず「GPUで音関連の処理を計算すること」にしときます。
一般用語でもないし、こういうのってGPGPUで括られると思うし。
あとShadertoyの記述に倣ったところがあります。

自分のヤツで恐縮ですが、先日開催されたTokyoDemoFestで提出した4k introをShadertoyに移植したページについてリンク張っておきます。

a Stranger - imported
https://www.shadertoy.com/view/XtVfWy

鳴らしているメソッドは少し違ったりしますが、ソースコード書いて曲が思いっきり鳴ってるかと思います。

## 使用する言語等

(2018/12/10 5:09追記)

使用する言語・ライブラリ等は以下の通りです。

* OpenGL/GLSL
* Win32API(他にもオーディオ再生用のAPIがあれば移植は難しくないはず)
* Shadertoy(WebAudioAPI?)

CUDAとかOpenCL等GPGPU用のライブラリは利用してません。
これは、自分が並列計算のプログラムほぼ書いたことないのと、単純に4kb introに詰め込みたくて利用するライブラリを最小限にしたから、です。

あと上記の副次的効果として、コンパイルの時間をそれほど待つことなく計算をゴリゴリ書いて進められる、計算が間違ってたら即座に直す力技OKな環境になっております。

## 使用する技術の特徴

GPUの特徴として、以下が挙げられます。

・計算が並列で実行される
・CPU-GPU間の協調は取れないケースがある（ここらへん別のライブラリ使うと大丈夫になってくるかもしれない）
・リアルタイム用途だと計算結果を保証しない

３番目は、GLSLで負荷の高い描画をしていると実感できる部分ですが、データが不完全になることでティアリングや描画が間に合わないケースがあります。

（勿論現在の描画はバッファリング形式なので描画が完成するまで待つ手もありますが、そうするとなかなか絵がでてこないことに・・・）

今回のシンセは、単純に「曲のレンダリングを行うのにGPUを利用する」だけなので、構成は結構シンプルで、計算順序をそれほど考えなくていいです。
（とは言っても理解に時間を要した・・・結局3日くらいかかった）

問題なければプロジェクトファイルも一式置く考えです。
せっかくなので、GPUで曲書く人増えろ！と。

## 他で使われてる事例

Shadertoy

デモシーナーとかすごい人の総本山感あるところ。
うちの環境だとシェーダ負荷がすごすぎてブラウザが落ちることもあるので閲覧注意。
記述はここで書ける文法を参考にしてますが、一部オリジナルです。
（オリジナルでも最終的に辻褄が合えばOKの考え）

Fragment

どうも加算合成の他色々できるシンセで、サーバクライアント型で制御してるみたい。

## GPUでシンセ作る処理の手順

以下の手順を実施。

1. OpenGL上でデータ格納用バッファを確保
2. シェーダ命令を1回だけ投げる
3. TransformFeedbackでデータをVBOに書き込む
4. 書き込んだデータをWAV再生用APIで読み込む


### 手順

#### 1. OpenGL上でWAVデータ格納用バッファを確保

これはOpenGL上でVBOを確保します。
つまりVBO=WAVデータにするわけです。

VBOとは、頂点バッファオブジェクトの事です。
本来「どの点を結んで図形をつくる」というのはCPU側で行うわけですが、
CPU→GPUの転送コストを考えると、大量の点があったときに処理落ちが起こります。
そういうのを回避するために、「頂点をGPU側で持っておけばいいんじゃね？」という考えからかVBOやFBO（フレームバッファオブジェクト）等、GPU側でリソースを持つ機能が実装されています。
CPU-GPU間の転送コストによるオーバーヘッドを防ぐ、という使い方で利用されるみたいです。
ただ、その分CPUでの制御ができない形になるので、コントロールをどう行うかがキモかと。
自分はあまり詳しくないのでここらへん識者に伺いたいところですが。

#### 2. シェーダ命令を１回だけ実行する

これは、描画に反映するためではないため、一度だけ実行する形にします。
あくまでデータ書き込みのためのシェーダ、という位置づけですね。

主にこの部分でソースコードの解釈が行われます。

注意なのが、データ側は「BPM等の速さ情報を持っていない」事です。
すなわち、データ書き込みのときに、このくらいのBPMだからこの音、というのをシェーダ側で指定する形になります。

計算式は、１秒あたりのデータが44100byteとして、「小節数+データの割合 = gl_VertexID / 44100.0」時点でのデータを書き込むことになります。

例：gl_VertexID = 22050の場合、22050/44100=0.5
つまり0.5秒ということになる。
ここ時点で120BPMではどのくらいの拍子か、どんなティックで分けて再生する/しない等を書き込んでいく形になる。

この部分はGLSLの書き方に関連する部分で、内容が膨れそうなので別記事にする予定。

#### 3. TransformFeedbackでデータをVBOに書き込む

２．で実行したシェーダ内では、Out変数としてTransformFeedbackで指定した変数（構造体）を定義できるので、ここにデータを書き込むことになります。

#### 4. 書き込んだデータをWAV再生用APIで読み込む

３．で出力されるデータは簡単に言ってしまうとWAV形式なので、メモリからWAVを読み込む形で再生することが可能。

## ざっくりとした説明おわり

ざっくりとこんな感じになります。
正直OpenGLの知識が必要になるので、拡張機能の取扱と相まってとっつきづらい分野ではありますが、一度書いてしまうと後は使い回すことが容易な上に、拡張機能はライブラリ全部読み込む形式ではないため、必要なものだけつまみ食いする形で実装可能です。

余裕があれば続きかこうかと思います。
（これから冬コミの準備・・・orz）


## 参考資料

GLSL作曲入門
https://qiita.com/notargs/items/be2fa153e62e3554a773

GLSL作曲講座
https://qiita.com/notargs/items/2ffe487cc6cb3844fc21

GLSLで音楽（はじめに）
https://qiita.com/gaziya5/items/e5d058c20bc75c72b5a2

その他Shadertoyの音楽投稿とか。
vimでサクッとアプリランチャーTips

こんにちわ

アドベントカレンダー空いてたので、ちょっとしたTipsを書きます。
以前作った[アプリランチャー](https://qiita.com/gorilla0513/items/9f3b20d259c563f680ca)をvimから起動する話です。

# vimアプリケーションを起動
こんな感じです。
![vim-app.gif](https://qiita-image-store.s3.amazonaws.com/0/66178/bc8b7b28-10c9-cb0a-c439-a5afcb8cfa77.gif)

# 設定
`~/.vimrc`に以下を書き込むだけです。
`<leader>`はスペースキーを割り当ててあります。

```
nnoremap <silent> <leader>l :belowright term ++close gol -f<cr>
```

# 解説
- `belowright`
termで新規ウィンドウを開く時、下に開くようする。
- `term ++close`
termでコマンドの実行が終了したらウィンドウを閉じる。
- `gol -f`
アプリランチャーのコマンドを実行。

# 注意
golはMacしか対応していません。
WindowsやLinuxで同様なことをしたい方はmattnさんの[gof](https://github.com/mattn/gof)のランチャーモードをぜひ使ってください。

# なぜこのやり方なのか
コマンドを実行するだけなら`!gof -f`でも良いのですが、
編集画面に戻らないのが嫌だったので、termで新規ウィンドウで実行するようにしています。

# 最後に
[アドベントカレンダーvim2](https://qiita.com/advent-calendar/2018/vim2)まだ空いているので、
書きたい方はぜひー
録音を途中から始めたり中止できる Call Recording Controls の紹介

Twilio は 2018/10/11 に通話途中からの録音開始や一時中止、再開、終了を可能にする [Call Recording Controls](https://www.twilio.com/docs/voice/api/recording) を正式リリースしました。

録音は従来も発信時の [&lt;Dial record="record-from-answer-dual"&gt;](https://jp.twilio.com/docs/voice/twiml/dial#record) や受信時の [&lt;Record&gt;](https://jp.twilio.com/docs/voice/twiml/record) で可能でしたが、通話中の録音の制御によりコールセンターでお客様から住所といった機微情報を聞くときだけ録音を中止するといった運用が可能になります。

## 通話の途中から録音開始

通話の途中から録音開始するにはCall SIDを指定するだけです。これで録音開始されます。

```
$ export CALL_SID=CAxxxxxxx
$ curl -XPOST https://api.twilio.com/2010-04-01/Accounts/$TWILIO_ACCOUNT_SID/Calls/$CALL_SID/Recordings.json \
    -u $TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN | jq .
```

## 録音の一時中止と再開

一時中止は paused、再開は in-progress を渡すことで制御可能です。

### 一時中止 - paused

```
$ curl -XPOST https://api.twilio.com/2010-04-01/Accounts/$TWILIO_ACCOUNT_SID/Calls/$CALL_SID/Recordings/Twilio.CURRENT.json \
    -d "Status=stopped" \
    -u $TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN | jq .
```

### 再開 - in-progress

```
$ curl -XPOST https://api.twilio.com/2010-04-01/Accounts/$TWILIO_ACCOUNT_SID/Calls/$CALL_SID/Recordings/Twilio.CURRENT.json \
    -d "Status=in-progress" \
    -u $TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN | jq .
```

本来なら RE からはじまる Recording SID の部分を Twilio.CURRENT も使用できます。Twilio.CURRENT は現在有効な Recording SID になります。ただし、これは開発中などで Recording SID が一つだけの場合に使える文字列です。複数の録音が存在する本番環境では Twilio.CURRENT ではなく Recording SID を使いましょう。

録音中に一時中止と再開をしたため、録音ファイルに無音の部分が発生しています。

<img width="1172" alt="wave.png" src="https://qiita-image-store.s3.amazonaws.com/0/268190/67aff3a6-4e6d-4b45-e7e3-20f7b1e84bf6.png">

## 録音の終了と開始

### stopped

録音の終了は stopped です。これで一つの録音ファイルが作成されます。

```
$ curl -XPOST https://api.twilio.com/2010-04-01/Accounts/$TWILIO_ACCOUNT_SID/Calls/$CALL_SID/Recordings/Twilio.CURRENT.json \
    -d "Status=stopped" \
    -u $TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN | jq .
```

### 通話の途中から録音開始

stopped したものは in-progress で再開できません。前述の通話の途中から録音開始を使用します。

```
$ export CALL_SID=CAxxxxxxx
$ curl -XPOST https://api.twilio.com/2010-04-01/Accounts/$TWILIO_ACCOUNT_SID/Calls/$CALL_SID/Recordings.json \
    -u $TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN | jq .
```

これにより一つの Call SID で複数の録音ファイルが生成されます。

![media.png](https://qiita-image-store.s3.amazonaws.com/0/268190/3c3a34a0-afc8-0803-4d0e-0c4d6932868c.png)

皆さまが録音開始ボタンや一時中止ボタンを開発するのを、目にするのが待ちきれません！

## 参考資料

- [Recording](https://www.twilio.com/docs/voice/api/recording)
- [Getting Started with Call Recording Controls](https://support.twilio.com/hc/en-us/articles/360010199074-Getting-Started-with-Call-Recording-Controls)
- [Twilio Call Recording Controls is Now Generally Available](https://www.twilio.com/blog/twilio-call-recording-controls-is-now-generally-available)
TPI-NEXTをやってみよう

テストプロセス改善手法のTPI-NEXTって皆さんご存知でしょうか？

テストプロセス改善？TPI-NEXT？と言う方がいたら、この機会に是非学んで見て欲しいです！
あ、自分達ってテストする時にこの辺りが弱いのかー。この辺考慮不足や対応が疎かだな。と言うことが分かるきっかけになるかと思います。

#テストプロセス改善？
テストプロセス改善について分からない方は、
JSTQBテストマネージャのシラバス(※1) 1章テストプロセスを読んでみるといいと思います。

※1:JSTQBテストマネージャのシラバス
http://www.jstqb.jp/dl/JSTQB-Syllabus.Advanced_TM_Version2012.J03.pdf

以下の7項目について記載されています。

- 計画、モニタリング、およびコントロール 
- 分析 
- 設計 
- 実装 
- 実行 
- 終了基準の評価とレポート 
- 終了作業

また、同じくJSTQBテストマネージャのシラバス(※1) 5章テストプロセスの改善にテストプロセス改善手法の紹介が記載されています。

- 5.4 TMMi によるテストプロセスの改善
- 5.5 TPI Next によるテストプロセスの改善
- 5.6 CTP によるテストプロセスの改善
- 5.7 STEP によるテストプロセスの改善

#TPI-NEXT？
TPI-NEXTについて分からない方は、
下記リンクで紹介されているスライド(※2)を見ると概要が分かるかと思います。

※2:TP-NEXTざっくり概要
https://www.slideshare.net/Ikedon/tpi-next-53348757?ref=http://swquality.jp/?p=907

以下の16のキーエリアについて、4段階で結果を判定出来ます。
**■キーエリア**

- 利害関係者のコミットメント
- 関与の度合い
- テスト戦略
- テスト組織
- コミュニケーション
- 報告
- テストプロセス管理
- 見積もりと計画
- メトリクス
- 欠陥管理
- テストウェア管理
- 手法の実践
- テスト担当者のプロ意識
- テストケース設計
- テストツール
- テスト環境

**■キーエリア**

- 初期レベル
- コントロールレベル
- 効率化レベル
- 最適化レベル

#TPI-NEXTをやってみよう！
TPI-NEXTの各説明をじっくり読んでからでもいいですが、
まずはエイ！っとチェックを付けてみませんか？

以下に、チェックフォーマットとマニュアルがあります。
■sogeti社のサイト
http://www.tmap.net/tpi-downloads

**「Download the Japanese TPI tool」**をクリックして、フォーマットをダウンロード
**「Download the manual in Japanese」**をクリックして、マニュアルをダウンロード

フォーマットを入手したら、「All Checkpoints」シートのC列にY又はNを入力していき、チェックを付けます。
チェックを付けると、「Test maturity matrix」シートや、「Spider graph」シートに結果が反映されて、自分達のレベルが視覚的に分かります。
Yと付ければいいのか？Nと付ければいいのか？で迷うことは大いにあると思いますが、まずはエイ！っと付けてみることをお勧めします。
この結果を元に自分達のテストでどこを変えた方がいいのか？を考えるきっかけにもなるのでは？と思いますので是非試してみて下さい。
コードを書けない行政マンだけどIntuneでクライアント管理しちゃうよ

##Microsoft Intuneって知ってるかい?
ただいまモバイルデバイス管理(MDM)を利用してWindows10の展開をしています。
既にいろいろ大ハマりしているので、備忘録として書き進めていきたいと思います。
すぐ忘れちゃうからね僕。
環境としてはAzureAD P2とIntuneにO365を利用してます。
なんと無く、はまったりしたらココに追記していくつもりです。
ちなみにIntuneについては、[Microsoft Intuneの概要](https://www.microsoft.com/ja-jp/cloud-platform/microsoft-intune)とかをみると良いと思います。

##まずAzureADでグループ作ったりユーザ登録しとこうぜ
O365ベースでいろいろやる場合も、AzureADでやる場合もAzureADで管理した方が多分楽です。
一応僕はO365でユーザを作って、ライセンスを付与してとかやりましたが、後からAzureADを見るとグループ作ってそこにライセンス付与することができるので二度手間になります。(まあ好みだとは思います。)
今の所グループはセキュリティグループを利用しており、O365グループは使ってません。
また、今回はサーバレス・オールクラウドを目標としているのでオンプレミスのADと連携とかはせず、純粋にクラウドのみの環境です。
AzureADとADは全くの別物ですが、そこまで規模の大きくない組織であればAzureADである程度の管理はできるのではないかと感じています。

##Intuneでどんなことできんのさ
Intuneでは

- [デバイスの構成]いわゆるグループポリシーっぽいことの制御
- [クライアントアプリ]なんかアプリケーションインストールできるっぽい(まだできてない)
- [ソフトウェア更新プログラム]更新プログラムの制御

ができる模様。
こんなことができるのがわかれば、こんな思惑を持つのは世の中の情報担当のSAGA。

- 箱からマシンを出す
- インターネットに接続する
- AzureADに参加させる
- MDMでいろいろ流して気がついたらセッティング完了
- マシンの配布

初期設定なまら楽だし、なにより障害があった時に、代替え機を簡単に構築し修理に出せるじゃない。こんなの鼻歌まじりで簡単にできちゃうんでしょ？
そうならないのがMSサンの商品ですよね()

##さっそくはまったこと(デバイス構成でプロファイルが流れない)
とりあえずデバイスに基本的な設定を流し込みたいのに、いくら設定をしてもできない。

- [x] 箱からマシンを出す
- [x] インターネットに接続する
- [x] AzureADに参加させる

ここまではOK

- [x] セキュリティグループに登録したマシンを入れる
- [x] デバイス構成でプロファイル（グループポリシーみたいなもの）作って登録する
- [x] プロファイルに先ほどのセキュリティグループを適用させる

ここまでくればOKに思えるじゃないですか。でもダメなんですよ。
いろいろあるけど、簡単に答えはこう。

<img width="1040" alt="スクリーンショット 2018-12-04 20.51.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/104684/3889c624-af87-9f72-1e55-eb58d748caa3.png">

- [x] 「デバイスの登録」の「デバイス登録マネージャー」に「管理者アカウント」を登録する。

で、たぶんここからまったりすれば良いのでしょうが、僕は面倒だったので、一度管理したい端末をAzureADから削除。再登録。そうすると

<img width="1044" alt="スクリーンショット 2018-12-04 20.59.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/104684/bd2e94ca-5429-6092-4e5c-089bfa22b26e.png">

「デバイス」の「管理」の「すべてのデバイス」にMDM配下に入ったマシンが出てきます。
デバイス登録マネージャーに管理者アカウントを登録する前まではこんな表示出ないんですが、登録すると、こちらにバッチリ表示されます。で、強制読み込みとかちょっと待つとかしていると・・・

<img width="1044" alt="スクリーンショット 2018-12-04 21.04.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/104684/5428b1c3-b258-38ec-f2a4-077bfd349999.png">

無事設定が流れました。
これはテストで組織で管理する際にちょっと使いづらくなる~~おせっかいな~~Windows HelloのPINを止めたところですが、無事適用されている模様です。
現在はテスト中ですが、本運用の時には生き返らせてうまく使いこなしたい一つの機能ですね。
次はクライアントアプリの制御にチャレンジします。

※追記
2020/7月現在だと、教育向けIntuneでは特別なUIが準備されていて、そちらの方が利用しやすくなっています。
こちらを利用した方がMDMは楽かもしれません。

![スライド1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104684/e954e227-b01a-3a95-edbe-019b3f6dd841.jpeg)
Julia  2✖︎2配列でappend!できない場合  MethodError

`ver.1.0.2`を使用．
参考: https://docs.julialang.org/en/v1/manual/arrays/

# `Array{Float64,1}`の場合
すんなり`append!`できる．

```
julia> hoge = zeros(2);foo = ones(2)
2-element Array{Float64,1}:
 1.0
 1.0

julia> append!(hoge,foo)
4-element Array{Float64,1}:
 0.0
 0.0
 1.0
 1.0

```
`append!`は破壊的演算なので，`hoge`が変わっている．

```
julia> hoge
4-element Array{Float64,1}:
 0.0
 0.0
 1.0
 1.0
```

# `Array{Float64,2}`の場合
`append!`ではできません．

```
julia> hoge = zeros(2,2);foo = ones(2,2)
2×2 Array{Float64,2}:
 1.0  1.0
 1.0  1.0

julia> append!(hoge,foo)
ERROR: MethodError: no method matching append!(::Array{Float64,2}, ::Array{Float64,2})
Closest candidates are:
  append!(::Array{T,1} where T, ::Any) at array.jl:902
Stacktrace:
 [1] top-level scope at none:0
```
##解決策

```
julia> vcat(hoge,foo)
4×2 Array{Float64,2}:
 0.0  0.0
 0.0  0.0
 1.0  1.0
 1.0  1.0
```

`vcat`は非破壊的

```
julia> hoge
2×2 Array{Float64,2}:
 0.0  0.0
 0.0  0.0
```