OmniAICreator/Qiita-1.07M huggingface dataset:
API Connectと開発者ツールキットの連携に関する備忘録


##はじめに
API Connectが提供する開発者向けのツールである、ローカルPCなどでCLI/GUIでAPI開発したり、API Connect（オンプレ版・IBM Cloud版）に対してAPIをステージングしたりできるのが[開発者ツールキット](https://www.npmjs.com/package/apiconnect)です。
GUIが起動でき、API managerのドラフト製品・APIの画面に該当するところが使えるので、API managerを使う感覚と同様に、API定義、製品追加して、登録したターゲット（カタログ・スペース）にステージングすることができます。
要件によっては、ユーザーのロールや権限を厳しく管理したいことがあり、API開発者がAPI managerを直接使ってAPI定義や製品追加を許可したくないケースがあります。そう言った場合、開発者ツールキットを開発者ローカルPCに配布し、特定のターゲットにのみステージングを許可するといったことができそうです。

と自分の理解を整理しつつ、本記事での本題は、このGUIを起動しようとして、以下の問題に遭遇した時のメモです。

* IBM Cloudログイン画面が出てきて先に進めない時があった（オンプレ用に使いたいのに）
* ターゲットを追加しようとしてログインができない

## 手順
### IBM Cloudログイン画面が出てきて先に進めない時
１. 以下のコマンドでログイン

```
apic edit
```
![Kobito.WyJubt.png](https://qiita-image-store.s3.amazonaws.com/0/129662/f68d4b12-b41b-dda7-befd-4e665eac3e1d.png "Kobito.WyJubt.png")

２. Bluemixのログイン画面になる（IBM Cloudに更新されてない点はツッコマない）。すでにBluemixにログイン状態・ログイン前でもアカウントがあってログインしたら、「Bluemixでサインイン」をクリックして、デザイナーの画面に進めるが、そもそもIBM Cloudアカウント持ってないなどのケースではここから進めなくなる（はず）。
![Kobito.jrwjV7.png](https://qiita-image-store.s3.amazonaws.com/0/129662/cd753d66-33a8-c4d5-1a4c-7689c0cd061a.png "Kobito.jrwjV7.png")


３. 一旦Ctrl+Cで停止して画面を閉じる

４. 以下の環境変数を入れて再度コマンド実行

```
SKIP_LOGIN=true apic edit
```
![Kobito.9hzc4q.png](https://qiita-image-store.s3.amazonaws.com/0/129662/df7baa72-98ec-3b08-3b83-c913be578143.png "Kobito.9hzc4q.png")


５. Bluemixログイン画面を飛ばして無事に起動
![Kobito.brKONZ.png](https://qiita-image-store.s3.amazonaws.com/0/129662/06d9d4e6-e0f7-3ff8-cc14-8bea4ffadce3.png "Kobito.brKONZ.png")



### ターゲットを追加/削除しようとしてログインができない
１. デザイナー画面の「公開」ボタンから、APIをステージングしたいターゲットを追加しておく必要がある。ここで例えばオンプレにあるAPI Connectのホスト名・ユーザー名・パスワードを入れればターゲットとして追加できる。

![Kobito.o0WeJW.png](https://qiita-image-store.s3.amazonaws.com/0/129662/3dae278c-c524-ede8-a1ac-4575ee0dc834.png "Kobito.o0WeJW.png")


![Kobito.Ba6g60.png](https://qiita-image-store.s3.amazonaws.com/0/129662/54f64e9f-9613-0f58-e500-564ad473339d.png "Kobito.Ba6g60.png")

ただ正しい情報を入れてるのに何度やってもログインできない時がある。私のMacの問題だけかもしれませんが。。（会社配布Macでユーザー権限が制限されてるらしい。）

![Kobito.4Iqujv.png](https://qiita-image-store.s3.amazonaws.com/0/129662/75318513-d9ac-e3c7-ed49-06496b2ef404.png "Kobito.4Iqujv.png")


２. ターミナルを見るとターゲットに関する情報が入ったファイルへのパーミッション関連のエラーが出ている。
![Kobito.f0oYvA.png](https://qiita-image-store.s3.amazonaws.com/0/129662/c538f098-6ca1-781f-7088-133d332443be.png "Kobito.f0oYvA.png")

３. なので一旦停止して、sudoでログインしなおす

```
sudo SKIP_LOGIN=true apic edit
```

４. 再度起動してきてターゲット追加してみると今度は成功
![Kobito.Rv2cnd.png](https://qiita-image-store.s3.amazonaws.com/0/129662/850bf064-a6c7-2f01-a8fd-4af102c3984a.png "Kobito.Rv2cnd.png")

![Kobito.CIUnVJ.png](https://qiita-image-store.s3.amazonaws.com/0/129662/7049ec30-2993-a6b5-85b3-c3e0ada063d5.png "Kobito.CIUnVJ.png")


## まとめ
以上、開発者ツールキットを使う時に地味に詰まった時のメモでした。

## 参考
* https://github.com/ibm-apiconnect/apichol/issues/10
【Flutter】Android StudioでDart2を有効にする

Android StudioでDart2を有効にする方法メモです。

## 手順
1. Preferencesを開く
1. 左カラムの `Languages & Frameworks > Flutter` を選択
1. `Experiments` の `Run applications with --preview-dart-2` にチェックを入れる
1. Apply後にAndroid Studioを再起動する

## スクリーンショット
<img width="908" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/123122/f7ae7b15-23dd-da70-c04c-e91a14ec4001.png">

## 確認方法
`new` や `const` が省略してビルドできればOKです。

## 環境
- Android Studio 3.0
- Flutter 0.1.5
- Dart 2.0.0-dev.28.0

## 参考
Dart 2 Updates | Dart
https://www.dartlang.org/dart-2

Trying the preview of Dart 2 in Flutter · flutter/flutter Wiki
https://github.com/flutter/flutter/wiki/Trying-the-preview-of-Dart-2-in-Flutter
sidekiqのworker内でexec使うとsidekiqが終了しちゃうからsystemとかOpen3.capture3とかを使おうという話

# この記事について
sidekiqをrails無しの環境で使うための確認作業中の出来事をメモする程度の記事。今回はworker内でexecを使うとsidekiqが終了したのでその件をメモ :pencil: 

## 結論
Worker内で `exec` 使わずに `system`, `Open3.capture3` 等を使用する :smile: 

# 現象
## 前提
* MacOS
* sidekiq version = 5.1.1
* redis version = 4.0.8

スタンドアロンの動作試験のため全てターミナル上で動作検証している

## Worker のソースコードと起動用のスクリプト

```lib/worker/lookup_worker.rb
require 'sidekiq'

class LookupWorker
  include Sidekiq::Worker

  def perform(*args)
    puts "LookupWorker#perform fired with arguments #{args.map(&:inspect).join(', ')}"
    exec("ls -al")
  end
end
```

```sidekiq_script.rb
($LOAD_PATH << '.' << 'lib' << 'lib/workers').uniq!
require 'lookup_worker'
```

## 症状

```bash
$ bundle exec sidekiq -L log/sidekiq.log -r ./sidekiq_script.rb
```

で起動した後、irbからキューにメッセージを登録するとWorkerの処理をした後にsidekiqが勝手に終了する。別ターミナルから以下の操作

```irb
LookupWorker.perform_async("hoge")
```

sidekiqを起動したターミナルでは `ls -al` の結果を出力して sidekiq が終了。。。

```
LookupWorker#perform fired with arguments "hoge"
total 32
drwxr-xr-x  12 makito  staff  408  3 24 15:03 .
drwxr-xr-x  11 makito  staff  374  3 23 17:39 ..
drwxr-xr-x   3 makito  staff  102  3 23 17:37 .bundle
-rw-r--r--   1 makito  staff  155  3 24 15:03 Gemfile
-rw-r--r--   1 makito  staff  404  3 23 17:37 Gemfile.lock
drwxr-xr-x   3 makito  staff  102  3 24 07:29 bin
drwxr-xr-x   3 makito  staff  102  3 24 07:34 config
drwxr-xr-x   3 makito  staff  102  3 24 08:00 lib
drwxr-xr-x   3 makito  staff  102  3 24 07:13 log
-rw-r--r--   1 makito  staff  531  3 24 07:11 por.rb
-rw-r--r--   1 makito  staff   76  3 24 08:00 sidekiq_script.rb
drwxr-xr-x   3 makito  staff  102  3 23 17:37 vendor
$ 
```

## 解決方法
本家のissueに同じ問い合わせがあった https://github.com/mperham/sidekiq/issues/2946

`exec` 使わず `system` や `Open3.capture3` 等を使うと回避できる :smile: 

```lib/worker/lookup_worker.rb
require 'sidekiq'

class LookupWorker
  include Sidekiq::Worker

  def perform(*args)
    puts "LookupWorker#perform fired with arguments #{args.map(&:inspect).join(', ')}"
    o, e, s = Open3.capture3("ffmpeg -version")
    p o
  end
end
```
Prophetを動かす環境を作るためのDockerfile

タイトルの通り。
facebook社による機械学習ライブラリであるprophetを使う環境を構築するのに何故だか手こずってしまったので、Dockerfileを書いてみました。

```dockerfile
FROM ubuntu:16.04

RUN apt-get -y update
RUN apt-get -y install python3
RUN apt-get -y install python3-pip
RUN apt-get -y install python3-tk
RUN pip3 install --upgrade pip
RUN pip3 install pystan
RUN pip3 install fbprophet
```

それだけ。

なお、Prophetについてはこちらを参照してください。
https://facebook.github.io/prophet/

また、Dockerそのもののインストール手順については、たまに変わっていたりするのでQiitaの記事よりも公式サイトを見たほうがいいと思います。ちゃんとかいてあるし。
https://docs.docker.com/install/


起動後にコンテナ内に入りたい場合はこんな感じ(xxxxxxはIMAGE ID)

```bash
docker run -i -t xxxxxx /bin/bash
```
さらに、-vはホストマシンのディレクトリをコンテナ内にマウントするためのオプションなので、

```bash
docker run -v ${PWD}:/XXXXXXXX 云々
```

などとすると、カレントディレクトリをコンテナ内の/XXXXXXXXにマウントすることができる。
HTMLのID属性値が重複している場合の動き




# 背景
HTMLで、ID属性の値はページ内で一意である必要があります。重複してはいけません。
http://www.html5.jp/tag/attributes/id.html

しかし、JavaScriptライブラリを使うとIDが重複してしまう場合があります。
たとえば、[FixedMidashi](http://www.html5.jp/tag/attributes/id.html)というテーブルのヘッダを固定するライブラリでは、対象のテーブルをコピーして固定するヘッダ部分を作成します。対象テーブル内の要素にIDが指定されていると、IDが重複しまいます。

工夫すればIDがユニークになるように実現できますが、FixedMidashiを使った場合は「IDが重複している」ことを諦めた方がラクでした。


そこで、IDが重複している場合の動きをまとめます。
以下のようなHTMLで動作を確認します。

```html:sample.html
<div id="bar">
  #bar 1個目
  <p>Pタグ</p>
</div>

<div id="bar">
  #bar 2個目
  <p>Pタグ</p>
</div>
```

<p data-height="265" data-theme-id="0" data-slug-hash="jzLmpZ" data-default-tab="js,result" data-user="yuji38kwmt" data-embed-version="2" data-pen-title="IDが重複している場合の動き" class="codepen">See the Pen <a href="https://codepen.io/yuji38kwmt/pen/jzLmpZ/">IDが重複している場合の動き</a> by yuji38kwmt (<a href="https://codepen.io/yuji38kwmt">@yuji38kwmt</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# 環境
* Google Chrome 65.0.3325.181
* jQuery 3.3.1


# JavaScriptの動き

```javascript:console
document.querySelectorAll("#bar").length; //⇒ 2
$("#bar").length; //⇒ 1

$("#bar p").length; //⇒ 2
document.querySelectorAll("#bar p").length; //⇒2
```

* `document.querySelectorAll`とjQueryで取得できる件数に違いありました。
* jQueryは「IDはユニーク」という前提を考慮した結果を返すのに対して、`document.querySelectorAll`は考慮していませんでした。
* `#bar p`のようにIDが指定された要素の子孫を指定した場合、jQueryは「IDはユニーク」という前提を考慮していませんでした。**ハマったところです。**



# CSSの動き

```css:sample.css
#bar { /* 重複しているIDを指定 */
  color:red;
}
```

* CSSは「IDはユニーク」という前提を考慮していませんでした。





# 参考サイト

[jQueryセレクタ id重複時の挙動テスト](http://oredon.guitarkouza.net/blog/2015/11/jquery-id-select.php)
エイリアスでubuntuのファイル開くコマンドを省略可してみた

# ubuntu16.04のxdg-openコマンドをaliasで省略する

ubuntuでファイルを開くコマンドとして「xdg-open」が用意されていますが、ちょっと長いので、aliasを使って省略してみようって話です。

## 実装方法
vimやemacsなどで.bash_profileを編集
`vim ~/.bash_profile`

.bash_profileに以下を記述
`alias op="xdg-open"`

設定を以下のコマンドで反映させる
`source ~/.bash_profile`

## 結果
コマンド入力
![Screenshot from 2018-03-24 14-13-03.png](https://qiita-image-store.s3.amazonaws.com/0/245373/57b3e133-9340-bc2f-ac99-ad60f0049ca1.png)
出力結果
![Screenshot from 2018-03-24 14-21-25.png](https://qiita-image-store.s3.amazonaws.com/0/245373/34ef7318-3a98-acea-7382-76f280dc6884.png)

## 備考
### すでにあるコマンドをエイリアスとして設定した場合
元のコマンドが使えなくなってしまう。
例えば、.bash_profileにて
`alias=ls="touch"`

とすれば、
lsコマンドはtouchコマンドとして扱われ、元のlsコマンドの機能は使えなくなるので注意。
### 登録されているエイリアスの確認
ターミナルにて、「alias」コマンドで現在登録されているエイリアス一覧が確認できる。

##参考
各OSのファイル開くコマンド(https://sekika.github.io/2015/10/27/open-command)
alias初心者向け(https://qiita.com/yutat93/items/b5bb9c0366f21bcbea62)
Railsをバージョンアップしてwebpack-dev-serverが動かなくなったときにやったこと

あやふやな記憶を元に書き起こしているので間違ってる可能性はまーまーあります。

## やったこと

### Rails

5.1.4 -> 5.1.5

### webpacker

3.2.0 -> 3.4.0

## 起きたこと

bin/webpack-dev-server を起動しようとすると、

```
/Users/nomura/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/rubygems_integration.rb:458:in `block in replace_bin_path': can't find executable webpack-dev-server for gem webpacker (Gem::Exception)
 	from /Users/nomura/.rbenv/versions/2.4.2/lib/ruby/gems/2.4.0/gems/bundler-1.16.1/lib/bundler/rubygems_integration.rb:489:in `block in replace_bin_path'
 	from bin/webpack-dev-server:29:in `<main>'
```

古いwebpackerを削除。

```
yarn remove @rails/webpacker
```

webpackerを改めてインストール。

```
bundle exec rails webpacker:install:vue
```

※ なんかエラーがでるので、エラーメッセージに従って config/development.rb の config.webpacker.check_yarn_integrity を false に。

再び bin/webpack-dev-server すると、

```
/Users/nomura/repos/now-on-sale/vendor/bundle/ruby/2.4.0/bundler/gems/webpacker-d418bcff71a9/lib/webpacker/dev_server_runner.rb:47:in `exec': No such file or directory - /Users/nomura/repos/now-on-sale/node_modules/.bin/webpack-dev-server (Errno::ENOENT)
	from /Users/nomura/repos/now-on-sale/vendor/bundle/ruby/2.4.0/bundler/gems/webpacker-d418bcff71a9/lib/webpacker/dev_server_runner.rb:47:in `block in execute_cmd'
	from /Users/nomura/repos/now-on-sale/vendor/bundle/ruby/2.4.0/bundler/gems/webpacker-d418bcff71a9/lib/webpacker/dev_server_runner.rb:46:in `chdir'
	from /Users/nomura/repos/now-on-sale/vendor/bundle/ruby/2.4.0/bundler/gems/webpacker-d418bcff71a9/lib/webpacker/dev_server_runner.rb:46:in `execute_cmd'
	from /Users/nomura/repos/now-on-sale/vendor/bundle/ruby/2.4.0/bundler/gems/webpacker-d418bcff71a9/lib/webpacker/dev_server_runner.rb:11:in `run'
	from /Users/nomura/repos/now-on-sale/vendor/bundle/ruby/2.4.0/bundler/gems/webpacker-d418bcff71a9/lib/webpacker/runner.rb:6:in `run'
	from bin/webpack-dev-server:15:in `<main>'
```

node_modules/.bin/webpack-dev-server がないのが問題のようなので、

```
yarn add webpack-dev-server
```

三度、 bin/webpacker-dev-server すると、

```
The CLI moved into a separate package: webpack-cli.
Please install 'webpack-cli' in addition to webpack itself to use the CLI.
-> When using npm: npm install webpack-cli -D
-> When using yarn: yarn add webpack-cli -D
module.js:557
    throw err;
    ^

Error: Cannot find module 'webpack-cli/bin/config-yargs'
    at Function.Module._resolveFilename (module.js:555:15)
    at Function.Module._load (module.js:482:25)
    at Module.require (module.js:604:17)
    at require (internal/module.js:11:18)
    at Object.<anonymous> (/Users/nomura/repos/now-on-sale/node_modules/webpack-dev-server/bin/webpack-dev-server.js:65:1)
    at Module._compile (module.js:660:30)
    at Object.Module._extensions..js (module.js:671:10)
    at Module.load (module.js:573:32)
    at tryModuleLoad (module.js:513:12)
    at Function.Module._load (module.js:505:3)
```

webpack-cliがない？ので、インストール。

```
yarn install webpack-cli
```

ここまでやったら一応起動できた (｡◉ᆺ◉)
Unity2017.4でのSpriteEditor WindowのOutlineとPhysics Shapeの変更点

Unity2017.4で、SpriteEditor WindowのOutlineとPhysics Shapeの編集の方法が、微妙に変わりました。

リリースノートは[こちら](https://unity3d.com/jp/unity/whats-new/unity-2017.4.0)

該当するのは、

> 2D: Change Outline and Physics Shape module behaviour in Sprite Editor Window. The module will only show outlines only when user has customised it.
Unity、Sprite Editor Windowの

SpriteEditor Windowにおいて、

Unity 2017.3.1では、Edit OutlineとEdit Physics Shapeになっています。

![unity_2017.3_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/4125/91c97935-5c0c-f0c2-7ff7-24154bfdc2cd.png)

Unity 2017.4では、Custom OutlineとCustom Physics Shapeになっています。

![unity_2017.4_1.PNG](https://qiita-image-store.s3.amazonaws.com/0/4125/a6892b37-e2d3-6601-9025-5d0d8020bd1b.png)

名前だけでなく、微妙に編集の方法も変わています。

Outline もしくは Physics Shapeを編集する際、

Unity 2017.3.1までは、編集したいSpriteを選択(マウス/トラックパッドでクリック)すれば、編集モードになり、白い線と白い四角が現れました。

Unity 2017.4では、編集したいSpriteを選択(マウス/トラックパッドでクリック)したのち、`Update`タブを押す必要があるようです。

![update_tab.PNG](https://qiita-image-store.s3.amazonaws.com/0/4125/d529c950-f443-0148-dc01-3344f02d2829.png)

この点に注意してください。
React備忘録

いまどきのJSプログラマーのためのNode.jsとReactアプリケーションに取り組んでいます。

用語を忘れることや、新しく知ったことが多かったので備忘録としてメモを残したいと思いました。

## コンポーネント

### コンポーネントの生成

Reactのコンポーネントは、React.componentを継承して作成する。

例：コンポーネントの定義

```sample.html

...

<script type="text/babel">
  //状態を持ったコンポーネントの定義
  class testComponet extends React.Component

...
```

### コンストラクターに関して

上記のCBoxを作成した時に自動的に実行されるメソッドconstructor()を定義する。
super()メソッドを呼び、React.Componentのコンストラクタを実行する。
その後で、stateプロパティを初期化する。


```sample.html

...

<script type="text/babel">
  constructor (props) {
    super(props)
    //状態の初期化
    this.state = {checked: false}
  }
...
```

## 描画方法

### render()メソッド

例：チェックBOXをチェックした時に黒くする。通常は白で表示。



```render.html

render () {
  let mark = '□'
  let bstyle = { fontWeight: 'normal' }
  if (this.state.checked) {
    mark = '◾'
    bstyle = { fontWeight: 'bold' }
  }
  //クリックした時のイベントを指定
  const clickHandler = (e) => {
    const newValue = !this.state.checked
    this.setState({checked: newValue})
  }
　　　　//描画内容を返す
  return (
    <div onClick={clickHandler} style={bstyle}>
      {mark} {this.props.label}
    </div>
  )
}
```

### DOMの書き換え


```dom.html
...

const dom = <div>
  <CBox label="Apple" />
  <CBox label="Banana" />
  <CBox label="Orange" />
  <CBox label="Mango" />
  </div>
  ReactDOM.render(dom,
    document.getElementById('root')) 
```

### Reactでイベントの記述方法

render()メソッド内でイベントハンドラを定義する
※render()メソッド内で、アロー演算子を用いたイベントハンドラを書く方法が一番記述コストが少なくなる。

```
class コンポーネント名 extends React.Component {
  render () {
    const handler = (e) => alert('Hello')
    return <button onClick={handler}>Click</button>
  }
}
```

### 複数のイベントを記述する必要がある場合

render()メソッドの中でイベントを記述するとプログラムが見づらくなってしまう。
その場合は、イベントハンドラをクラスのメソッドとして定義する。
この時、thisが書き換わってしまい不便なため、メソッドとthisを結び付けるようbind()メソッドを使う。

```
class コンポーネント名 extends React.Component {
  constructor () {
    this.classHandler = this.classHandler.bind(this)
  }

  classhandler () {
    alert('hello')
  }

  render () {
    return <button onClick={this.classHandler}>
      Click</button>
  }
}
```

### 複数のイベントを記述する必要がある場合②

上記の方法ではbind()メソッドを使用するため冗長になる。
ここでは、アロー関数を用いるのがスマート。
thisが有効なスコープでクラス内のメソッドを呼び出す。

```
class コンポーネント名 extends React.Component {
  classhandler () {
    alert('hello')
  }

  render () {
    return <button onClick={(e) => this.classHandler(e)}>
      Click</button>
  }
}
```

### まとめると

Reactでイベントハンドラを定義する場合、コンポーネント自身を指すthisを解決することが必要。
ハンドラをbind()メソッドで結びつけるか、thisが有効な場所でアロー関数を定義する必要がある。
XcodeでWebKit Viewの自動リンクを無効化する方法

# 当記事について
## 経緯
iOSアプリにて、WebKit Viewを使用したところ、閲覧したURL内の「サンボマスター」という単語に勝手にリンクがついたので、自動リンクを無効化するための方法を調べた
## バージョン情報
- Xcode
    - Xcode 9.2

# 手順
1. Main.storyboardを開く
1. WebKit Viewの部品を選択する
1. inspectorペインの1番左にある、Show the Attribute inspectorを選択する
1. Data Detectorsにて、以下の中から無効化したい自動リンクの種類のチェックを外す

- [ ]  Phone Number
- [ ]  Link
- [ ]  Address
- [ ]  Calendar Event
- [ ]  Tracking Number
- [ ]  Flight Number
- [ ]  Lookup Suggestion

![image.png](https://qiita-image-store.s3.amazonaws.com/0/215954/a7a90767-3a11-27fe-84f2-7ee47f6c257c.png)
macでzcatコマンドが使えないとき→『gzcatコマンド』

## dumpファイルのインポートで問題が起きた

mysqlに圧縮ファイルをインポートするとき、

`$ zcat ~/dump-hogehoge.gz | mysql -u root db_development`

を使用したが、`can't stat:..`

と表示された。。

## 結論
　
`gzcat`コマンドを使用した。

`$ gzcat ~/dump-hogehoge.gz | mysql -u root db_development`

上記を実行するとうまくいった。
Office365の会議室・備品の権限設定

# PowerShellで権限変更

会議室のアクセス権限を変更します。
こちらのブログを参考にしました。こちらのサイトの方が詳しく解説されています。
[Exchange Online の予定表のアクセス権変更を Powershell を使用して設定を行う～個別編～](https://blog.situs.co.jp/tech/%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89/exchange-online-%E3%81%AE-%E4%BA%88%E5%AE%9A%E8%A1%A8-%E3%81%AE-%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E6%A8%A9%E5%A4%89%E6%9B%B4-%E3%82%92-powershell-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6/)

この記事では、自分で行ったことだけを書きます。

## PowerShellログイン
コマンドプロンプトを表示して、

```
powershell.exe
```

管理者権限で実行する

```
Start-Process powershell.exe -Verb runas
```

管理者権限で実行できたら、以下を入力する。

```powershell
$UserCredential = Get-Credential
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://outlook.office365.com/powershell-liveid/ -Credential $UserCredential -Authentication Basic -AllowRedirection
Import-PSSession $Session -AllowClobber
```
認証画面が表示されるので、Office365の自分の組織の管理者アカパスでログインする。

ログインができたら、権限を変更する。

```powershell
Set-MailboxFolderPermission 'room_hoge@***:\Calendar' -User '既定' -AccessRights 'LimitedDetails' -ErrorAction Stop
```
ここではroom_hogeの既定のユーザに対しての権限をLimitedDetailsに変更しています。
この権限設定であれば、予定のタイトルは表示されますが、詳細は表示されません。

# なんでもできる権限の設定
例えば一般社員は規定の権限だが、総務社員は会議室の予定を強制的に変更できるようにしたい場合があります。

```powershell
Set-MailboxFolderPermission -Identity 'room_hoge@***:\Calendar' -User paka@*** -AccessRights 'Author'
```

こんな感じにすれば出来ると思ったのですができませんでした。

とりあえず、管理者アカウントでOffice365にログインして、「Exchange管理センター」から「リソース」で会議室・備品を選択。
「メールボックスの委任」から「フルアクセス許可」にフルアクセスさせたい人を設定しました。
機能を切り替えるための #ifdef は最小限にしよう

# はじめに

C / C++ における `#ifdef` (および `#if`) による条件付きコンパイルは強力な道具ですが、使いすぎると非常にメンテナンス性の悪いコードになってしまいます。諸刃の件です。
ここでは主に継続的インテグレーションの観点から、 `#ifdef` で切り替えられるコードは最小限になるよう工夫しましょう、ということを整理してみます。

# 継続的インテグレーションと \#ifdef

現代のソフトウェア開発では CI 環境を整え、常にビルド・結合・自動テストや静的解析を実行し続けるのが普通です(よね ?)。`#ifdef`  によって無効になったコードはこのチェックから外れてしまい、その恩恵を受けられません。

もちろん、全てのコードを網羅するように複数の条件でコンパイルし、それぞれチェックを走らせることも可能ですが、条件が多くなってくるとそのコストは大きくなっていきます。少なくとも CI の観点からは、`#ifdef` による条件コンパイルは最小限に留め、できるだけたくさんのコードがコンパイル・テストされている状態にしたほうがよい、と考えられます。

少しでもコンパイル・テストされるコードを増やす例を書き出してみます。

## 動的な(実行時の)切り替えで代替できないか

まず単純に、 コンパイル時に切り替えるのではなく、実行時の切り替えでもよいかもしれません。

- 関数のパラメータやオブジェクト生成時のパラメータとして付与し、それによってふるまいを変える
- 複数のふるまいや複数の実現手段を、あるインターフェイスを実装する複数のクラスとして表現し、どのクラスを生成するかで切り替える (strategy pattern)

といった方法が取れるなら、すべてのコードがコンパイルされますし、テストコードでテストすることもできます。

条件コンパイルに比べコードサイズや実行時のオーバヘッドは生じるので、それを許容できるかの判断はもちろん必要です。


## 無理やり普通の `if` にする

例えば

```cpp
#ifdef FEATURE_FOOBAR
// FOOBAR 用のコード
#else
// それ以外用のコード
#endif
```

みたいなコードをばらまくのではなく、どこか一カ所で

```cpp
#ifdef FEATURE_FOOBAR
constexpr bool kFoobarSupported= true;
#else
constexpr bool kFoobarSupported= false;
#end
```

としておいて

```cpp
if (kFoobarSupported) {
  // FOOBAR 用のコード
} else {
  // それ以外用のコード
}
```

にする方法があります。
まず第一に読みやすいですし、「FOOBAR 用のコード」「それ以外用のコード」どちらの条件のコードもコンパイル対象になります。コードサイズや実行時コストについては、`if ()` の条件が静的に決まるのであれば、コンパイラの最適化で使わないコードが削られることは期待してよいと思います。
ただし、これだけだと無効になっているコードのテストはできません。


## テンプレートパラメータとして付与する

複数の条件のコードを両方ともテストしたい、しかし動的な切り替えのオーバーヘッドが許容できない場合、こういうのもあります。

```cpp
template <bool FoobarSupported>
void do_something_impl() {
  if (FoobarSupported) {
    // FOOBAR 用のコード
  } else {
    // それ以外用のコード
  }
}
#ifdef FEATURE_FOOBAR
void do_something() { do_something_impl<true>(); }
#else
void do_something() { do_something_impl<false>(); }
#endif
```

こんなふうにすることで、 `do_something_impl<true>()` / `do_something_impl<false>()` をテストすれば両方のコードをコンパイル・テストすることが可能になります。
実際に使われるのは片方だけ、しかもオーバーヘッドはゼロです。


## クラスの typedef で切り替え

クラス単位の簡単な切り替えです。
仮想関数を使った動的なディスパッチのコストが許容できない場合に、ふるまいの違うクラスを複数用意しておいて 

```cpp
#ifdef FEATURE_FOOBAR
using Widget = FoobarWidget;
#else
using Widget = BazWidget;
#endif
```

のようにすることで、 `FoobarWidget` と `BazWidget` の両方のコードをコンパイル・テストはしつつ、実際に使うのは片方だけ (利用者は `Widget` を使う)、ということができます。


## `#ifdef` が避けられないケース

- OS の違いやコンパイラの違いを吸収するため。
- いわゆるリリース/デバッグビルドの違い。デバッグビルドでログや assertion が有効になっているなど。
- 特定のライブラリの有無など、そもそもコンパイルできないケース。

これらは `#ifdef` で無効になるコードが出てくるのは避けられないですね。それでも、違いを吸収するためのレイヤを設ける(簡単にはマクロの定義内容を変えるなど)といったことで、`#ifdef` を意識しなければならない範囲を最小限に留めるべきです。あちこちに `#ifdef` がばらまかれてしまうの避けたほうがよいでしょう。

# 設計的な観点

`#ifdef` は飛び道具です。ときに強力な武器となりますが、基本的には飛び道具に頼るのではなく、ふるまいの違いは設計に反映するべきです。オブジェクト指向であればクラスの違いとして表現し、Strategy Pattern で使い分ける、といった方法が定番でしょう。

また、設計の高尚な話じゃなくても `#ifdef` だらけのコードは読みにくく、メンテナンスもしにくいです。`#ifdef` が必要になるにしても、切り替える場所はできるだけ最小限 (1,2 ヶ所にできることが多い) で済むように工夫したほうがよいでしょう。

# まとめ

- `#ifdef` (`#if`) は CI 環境によってビルド・テストされ続ける恩恵を受けにくくします。
    - できるだけたくさんのコードがビルド・テストされるように工夫しましょう
- `#ifdef` (`#if`) は飛び道具。基本的には頼らずにふつうの設計で表現しましょう。
【RPA】非エンジニアによるUiPathロボット開発 Episode03 - webアプリ操作①

[前回](https://qiita.com/uni0423/items/673665d29170e567ae52)も書きましたが、UiPathはアクティビティを繋げてワークフローを作成し、そのワークフローを実行することによってUI操作の自動化を実現します。
じゃあどんなアクティビティがあるの？というとコレがものすごい量があって、学習意欲をいきなり削ってくれますｗ（とはいえ頻繁に使うアクティビティは限られますが…）
今回はUiPathを楽しんで使う第一歩として、Recording機能を使って、Excelのマクロ録画みたいな感じで手軽にUI操作の自動化をしてみたいと思います。
#今回のゴール
UiPathのRecording機能を使ってGoogleマップのルート検索を自動化する
#自動化する処理の概要
ワークフローを作る前に、自動化したい処理内容を箇条書きでも良いので書き出しておくと良いでしょう。今回であれば下記のようになります。
1. Googleマップを開く
2. ルート検索モードにする
3. 出発地に東京駅と入力する
4. 目的地に新宿駅と入力する
5. 検索ボタンを押す
#Recording機能の使い方
1. まずは新規ワークフローを作成してください。わからない場合は[こちら](https://qiita.com/uni0423/items/673665d29170e567ae52)をご覧ください。
2. **IE(Internet Explorer)**でGoogleマップを開いてください。（この記事執筆時点では、Chromeでの動作が安定しないので、IEを使っています。）
3. DESIGNのRecordingをクリックして、Webを選択してください。![image.png](https://qiita-image-store.s3.amazonaws.com/0/243922/7022111d-bfab-2845-ef85-c70af2a44d5a.png)
4. Web Recordingというウィンドウが開いたら**Open Browser**をクリックしてください。![image.png](https://qiita-image-store.s3.amazonaws.com/0/243922/9e9a0201-d284-555e-e50f-b5176dd38580.png)
5. **Googleマップが表示されているIEにフォーカスを合わせて左クリック**します。そうすると下記のような表示になりますので、OKをクリックします。![image.png](https://qiita-image-store.s3.amazonaws.com/0/243922/40c80803-5611-b87c-732c-aad75cc401c5.png)
6. 次に、Web Recordingウィンドウの**Record**をクリックします。![image.png](https://qiita-image-store.s3.amazonaws.com/0/243922/8150dd89-f189-d2ee-0af6-b5b3ab74a3d1.png)
7. ルート検索ボタンにフォーカス（下図のオレンジ枠で囲われている部分）を合わせて左クリックします。![image.png](https://qiita-image-store.s3.amazonaws.com/0/243922/1e28e0e3-a962-2cfe-40b8-4dbf1907834c.png)
8. 出発地にフォーカスを合わせてクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/243922/dfc14dda-4e67-d15c-65e4-051daf558da4.png)
9. 東京駅 と入力してEnterキーを押す
![image.png](https://qiita-image-store.s3.amazonaws.com/0/243922/fedc782d-28c1-65be-b1c3-93fd196fbc30.png)
10. 目的地にフォーカスを合わせてクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/243922/553c03e6-adf4-0a74-f907-2e4e5169efb5.png)
11. 新宿駅 と入力してEnterキーを押す
![image.png](https://qiita-image-store.s3.amazonaws.com/0/243922/b007daf5-2b3e-c7fb-c9f3-245e37b3b1d6.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/243922/408a5e81-ea1f-4fea-d5e0-d3fa499c1583.png)
12. 検索ボタン（虫メガネ）をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/243922/3e110524-f132-5b97-1a5a-079fd3882c97.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/243922/4f0a592e-7081-f91f-4b3c-4d10b6e815db.png)
13. Escキーを押すと Web Recordingウィンドウが開くので、**Save & Exit** をクリックする
![image.png](https://qiita-image-store.s3.amazonaws.com/0/243922/03885878-8fe1-8691-c806-9c1e7bbdbbc2.png)
14. そうすると、開発パネルにワークフローができます。これで完成です。最後にIEを閉じましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/243922/d6f1e8f1-287f-9f58-fab5-6812f315e72c.png)

#ワークフローの実行
先ほどRecording機能で作成したワークフローを実行して、想定した動きをするか確認しましょう。
**ワークフロー**を実行するには、StudioのDESIGNにある**Runボタン**をクリック、もしくは**F5**キーを押すと、ワークフローが実行されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/243922/f1ad451a-b812-f54b-e53b-52ef90c8cd4d.png)

次回は、今回作成したワークフローに設置されているアクティビティの説明と、ユーザー入力を受け付けて出発地・目的地に好きな文字列を設定できるようにしてみましょう。
Python3での並行・並列処理の選択肢（2018/03）


# 概要
2018年3月現在において、Python 3系の標準ライブラリを使い、並列・並行処理を実装する際の選択肢についてまとめる。

それぞれのモジュールの使い方や実装例については、この記事では紹介しない。

# 並行処理
## threading
スレッドを使い、並行処理を実現する。threadingを使った実装は比較的容易だが（asyncioと比べると）、メモリ使用量などリソース面でのコストが大きい。

詳しくは『Effective Python』の「項目40；多くの関数を平行に実行するにはコルーチンを考える」を参照。

https://docs.python.jp/3/library/threading.html

## asyncio
Python3.4で追加されたモジュール。Python3での並行処理の標準と言っていいはず。

公式ドキュメントの見出しは、「非同期 I/O、イベントループ、コルーチンおよびタスク」となっている。

多機能で使いこなすのが難しい印象。

https://docs.python.jp/3/library/asyncio.html

## (参考)gevent
Python2環境では、イベント駆動の実装によく使われていた。Python3の対応に時間がかかっている印象だったが、今は対応済みのようだ。

http://www.gevent.org/index.html

今後はasyncioのほうが一般的になっていくと思われる。

# 並列処理
## multiprocessing
APIはthreadingモジュールとよく似ている。こちらはスレッドではなくサブプロセスを使うことで、並列処理を可能にする。

https://docs.python.jp/3/library/multiprocessing.html

## subprocess
Pythonから他のプログラムを実行することで、並列処理を可能にする。
並列処理のためよりも、シェルコマンドの実行などで使うケースのほうが一般的かもしれない。

```python
>>> import subprocess
>>> ret = subprocess.getoutput('date')
>>> ret
'2018年  3月 24日 土曜日 12:43:29 JST'
```

https://docs.python.jp/3/library/subprocess.html

# 参考文献
 * 『入門Python3』
    * https://www.oreilly.co.jp/books/9784873117386/
 * 『Effective Python』
    * https://www.oreilly.co.jp/books/9784873117560/
jsdoでADSR

#概要

jsdoで、ADSRやってみた。

#ADSR

エンベロープの構成要素を A、D、S、R　と言う。

エンベロープとは、一般的な語彙としては封筒などのことだが、信号処理などではなんらかの波形の山と山の頂点をつないだ「包絡線」やその形状のことを指す。
楽器としてのシンセサイザの場合、次のような、アコースティック楽器の音に見られる特徴的な形状をモデル化・パラメータ化し制御するものが多く、まとめて「ADSR」と呼ばれている。

Attack（立ち上がり）
演奏開始からその音声の最大音量に到達するまでの時間を設定するパラメータ。0秒に設定すればいきなり最大音量になり、ピアノやギター、或いは打楽器の音声と同じになる。
Decay（減衰）
Attackで到達した最大音量から、Sustainレベルに移行するまでの時間を設定するパラメータ。
Sustain（減衰後の保持）
Decayの後、演奏が続いている限り出る音量を設定するパラメータ（これだけは時間的変化ではなく量の設定パラメータとなっている）。
Release（余韻）
演奏を終了した（鍵盤の鍵を離した）時点から、音が鳴り終わるまでの時間を設定するパラメータ。ピアノなどの生楽器でのSustainに相当する。

#写真

![](http://jsdo-static-contents.s3.amazonaws.com/images/capture/2/k/2/2k2b.jpg?t=1521864559)

#成果物

http://jsdo.it/ohisama1/2k2b

以上。
ホスト側からDockerのPostgreSQLに接続する方法（Docker for Macの場合）

Docker for macの各コンテナへホスト側からアクセスする際のアドレスは、localhostです。
docker-machineの場合はdocker-machine envでIPアドレスを確認をする必要があるので、その点楽ですね。

しかしlocalhostゆえにホスト側のシステムとバッティングし、うまくコンテナにアクセスできない場合が出てきます。

それが今回はまったDockerのPostgreSQLへのホスト側からアクセスです。

通常ホスト側からコンテナのPostgreSQLにアクセスする場合はオプションで-h localhostを指定すれば可能です。

```bash
$  psql -U ユーザー名 -d DB名 -h localhost
```

しかし、もしホスト側のPostgreSQLが起動している場合、psqlで自動的にホスト側のサーバーにアクセスしてしまうためロール又は、DBが存在しません。というエラーが出てしまいます。

その解決方法としてはlocalのPostgreSQLのサーバーを停止することです。
brewでinstallしている場合は以下コマンドでホスト側のPostgreSQLの停止を行えます。


```bash
$ launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
```


再度

```bash
$  psql -U ユーザー名 -d DB名 -h localhost
```

でアクセスすればDockerのPostgreSQLにアクセスできるはずです。
"Nemloy or Die."  ~初めてのNEMアプリをデプロイしよう!~ 1.導入編

#作るもの
https://nem-mosaic.firebaseapp.com/

NEMのネームスペース名からモザイクを検索する簡単なアプリを作り、無料のホスティングサービスを使って、デプロイするまでの手順を示します。

- 言語：TypeScript (JavaScript)
- フレームワーク:Angluar 
- ライブラリー: [NEM Library](https://nemlibrary.com/)

## NEMとは
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191181/303a53d1-6ce7-999d-b309-130477979458.png)

NEMはブロックチェーンプラットフォームの一種です。オリジナルトークンを発行する機能があります。それがネームスペースとモザイクです。NEMの通貨はXEM(ゼム)として流通していますが、これもその関係にあってnemがネームスペース、そのモザイクがxemです。

##Angular & TypeScript
Angularは、JavaScriptで記述され、インターネットブラウザーで動作するアプリケーションフレームワークの1種です。なのでもちろんJavaScriptで開発できるのですが、
- AngularもNEM LibraryもTypeScriptによって作られていること。
- ほとんど全てのドキュメントがTypeScriptの使用を前提にしていること。
といった理由からTypeScriptというJavaScriptを拡張した言語を使用するのが一般的です。

##NEM Library
公式サイトによれば、
*"NEM Library is an abstraction for NEM Blockchain using a Reactive approach for creating Blockchain applications."*
とあり
Nem Libraryは、ブロックチェーンアプリケーション用の、Reactiveのアプローチを用いたNEMブロックチェーンを簡単に使えるようにしたものらしいです。
つい先日 [安定バージョンの1.0.0] (https://nemlibrary.com/#stable-version-100) が発表されました。

[NEM Library](https://nemlibrary.com/)のページ下に表示されるロゴマークのうち、まるで囲んだのものが登場します!!



![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3139313138312f31366539656239352d633166622d346334322d623732632d6235316333346632366562312e706e67.png](https://qiita-image-store.s3.amazonaws.com/0/191181/5a5e51e9-d444-3615-c37b-b3d2f23a6bc8.png)





#インストール
Angularでアプリを開発する際には、アプリの雛形を自動生成してくれる、Angular CLIというツールを利用すると便利です。早速、Angular CLIを導入して、NEMアプリ開発の準備を整えましょう!

##Node.jsをインストールする
Node.js(https://nodejs.org/ja/) はAngularアプリの開発に必要なJavaScript実行環境です。公式サイトの指示にしたがってインストールしてください。

##Angular CLI
次に、Angular CLIを導入します。ターミナルを開きnpmコマンドによって、グローバルにAngular CLIをインストールします。

```
npm install -g @angular/cli
```

アプリの雛形を作ります。名前はなんでもいいのですが、ここではnem-app
にします。

```
ng new nem-app
```

少し待つと、以下のようなフォルダが生成されているはずです。

<img width="183" alt="スクリーンショット 2018-03-20 8.15.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/191181/f1f8c15b-baee-084e-04d8-9afa1fdac27a.png">

##NEM Libarayの追加
node_modulesににNEM Libraryを追加します。先ほど生成したアプリルートの直下に移動し、Nem Libraryをインストールします。

```
cd nem-app
```


```
npm install nem-library rxjs --save
```

node_modules内に新しくnem-libraryが追加されているはずです。NEM LibraryはJavaScriptの拡張言語のTypeScriptで書かれており、TypeScriptの最新版がインストールされている必要があります。-g をつけてグローバルにTypeScriptをインストールしましょう。

```
npm install -g typescript
```
ここまでで、一旦実行してみましょう。

```
 ng serve --open
```
ブラウザーが自動的に開かれ、このような画面が表示されるはずです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/191181/769b7e81-71c0-7a82-0e9c-ed3b1406cec2.png)
これをスタート地点にして、どんどん開発を進めて行きましょう。

開発編へ続く~~~~~~~~~


#参考
山田 祥寛 著 「Angular アプリケーションプログラミング」 
https://dev.classmethod.jp/ria/angular-js/angular-cli-list/
Vue.jsのpropsでBooleanを渡そうとしたときの型エラー

Vue.jsのpropsでBooleanを渡そうとしたときに詰まったのでメモ。


```vue
<script>
export default {
  props: {
    isRequired: {
      type: Boolean,
      default: false,
    }
  },
};
</script>
```

このようなpropsを定義して以下のように値を渡しました。

```html
input is-required="true"
```

しかし、Vue.jsにはStringとして受け取られ、

> [Vue warn]: Invalid prop: type check failed for prop "isRequired". Expected Boolean, got String.

のようにエラーになってしまいます。

正しくは、

```html
input v-bind:is-required="true"
```

または、

```html
input :is-required="true"
```

のように `v-bind:` をつける必要がありました。
[RubyOnRails]リクエストとレスポンスの流れ　その１

#おおまかな流れ
Railsではクライアントサイド（PC、スマホ）から送られてきたリクエストに対して、ルーティング→コントローラ→ビューの順番で動いてレスポンスを返しています。

#ルーティングの働きと書き方
送られてきたリクエストに対してどのコントローラのどのアクションを動かすかを命令するところです。
configフォルダの rutes.rb に書きます。
rutes.rb に最初から書かれているのは rutes.rb の書き方です。上書きして書き換えて良いです。

rutes.rb のサンプル
クライアントから hoge のパスをリクエストされてindexアクションとしたい場合

```rutes.rb
Rails.application.routes.draw do
  get 'hoge' => 'hogehoge#index'
end
```

get 'hoge' がクライアントからリクエスト受けたところで、hogehoge#index は、hogehoge がコントローラ名でindexがアクション名です。

#コントローラの働きと書き方
コントローラはルーティングからの命令をビューに渡す役目です。コントローラのファイルはターミナルからrails gコマンドで作ります。

```
$ rails g controller hogehoge
```

rails gコマンドを実行したら app/controllers/hogehoge_controller.rb が出来ます。

もしコントローラ名を間違えてrails gした場合は、rails dコマンドで削除します。

```
$ rails d controller 間違えたコントローラ名
```

コントローラファイルの編集からはその２に書きます。
conda を利用した Numpy 付 Boost の導入 Visual Studio 2017 対応

# 本日は

Numpy付Boostの導入

[Numpy 付 Boost 1.66.0 の導入 Visual Studio 2017 対応版](https://qiita.com/SatoshiTerasaki/items/6ed55551bbdef79ce3fc)

の別解としてBoostを `conda install` で入れてみようという話を紹介します．

Reference としては次があります．

- [Anaconda 環境 で Boost.Python (Numpy)](http://wakame.hatenablog.jp/entry/2017/06/24/145122)
- https://anaconda.org/conda-forge/boost

# install 

https://anaconda.org/conda-forge/boost にしたがって次を実行します．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/135978/6147a060-6e93-9245-6212-877a0b054e4d.png)


```shell-session
conda install -c conda-forge boost
```

こうすると Boost 1.66.0 のBoostがはいるっぽいです．

# 問題はどこにインストールされたか

Pybind11の場合は C:\Miniconda3\include にヘッダーが入ってたのですがぱっと見どこにあるかわかりませんでした．

そこでMiniconda以下のディレクトリで検索をかけたところ

ヘッダーは

- C:\Miniconda3\Library\include

ライブラリは

- C:\Miniconda3\Library\lib 

に配置されることがわかりました．

早速試してみます．

# Visual Studio 2017 起動

Visual Studioを起動して

`condaboost` という名前でプロジェクトを作ります．

VC++ ディレクトリ においてインクルードディレクトリとライブラリディレクトリに上で見つけたBoost関連のパス と 各自のもっているPythonのヘッダーとライブラリのパスを追加します．例えば下の図のように追加します．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/135978/1266fc40-5911-bd4c-e2ea-37e11058eb62.png)

あとはコードを書きます．

```C++:sample.cpp
/*
Call C++ From Python
Reference:
http://tadaoyamaoka.hatenablog.com/entry/2017/05/25/234934
https://qiita.com/takuya-ki/items/3555ab17f9cea534e13b
https://qiita.com/termoshtt/items/81eeb0467d9087958f7f
*/

//#define BOOST_PYTHON_STATIC_LIB ＜－不要になりました
//#define BOOST_NUMPY_STATIC_LIB ＜－不要になりました
#include <boost/python/numpy.hpp>
#include <stdexcept>
#include <algorithm>

namespace p = boost::python;
namespace np = boost::python::numpy;

/* 2倍にする */
void mult_two(np::ndarray a) {
	int nd = a.get_nd();
	if (nd != 1)
		throw std::runtime_error("a must be 1-dimensional");
	size_t N = a.shape(0);
	if (a.get_dtype() != np::dtype::get_builtin<float>())
		throw std::runtime_error("a must be float32 array");
	float *p = reinterpret_cast<float *>(a.get_data());
	std::transform(p, p + N, p, [](float x) { return 2 * x; });
}

BOOST_PYTHON_MODULE(condaboost) {
	Py_Initialize();
	np::initialize();
	p::def("mult_two", mult_two);
}
```

[Numpy 付 Boost 1.66.0 の導入 Visual Studio 2017 対応版](https://qiita.com/SatoshiTerasaki/items/6ed55551bbdef79ce3fc)

のときは  

```C++
#define BOOST_PYTHON_STATIC_LIB
#define BOOST_NUMPY_STATIC_LIB
```

C/C++->コード生成 における ランタイムライブラリの設定 が必要でしたが

今回の場合は不要です．

ビルドすると `condaboost.pyd` というものが生成されるので 

```python
>>> import condaboost
```

という形式で呼び出せます．

導入はちょっと楽になりました．

# 欠点
conda パッケージの都合上

https://github.com/peterjc123/pytorch-scripts 
で導入した PyTorch パッケージが アンインストールされてしまう．

悲しい．
SDAPSで塗りつぶしたチェックも数えたい

# きっかけ

SDAPSで質問票を作成して、160人ぐらいから回収したところ、(おそらく)チェックのつもりで塗りつぶされたシートが1/3ぐらいありました。

そこで、この塗りつぶされたチェックも、修正ではなく、回答として扱って、レポートを出力させてみました。

# 対応策

## あらかじめ修正機能のない質問票を作成する

TeXで質問票を作成する時に、文書クラスのオプションで、*a4paper,*などの指定と同時に*checkmode=check,*などと指定することで、「塗りつぶすと訂正」という動きを「塗りつぶしもチェックとして扱う」、「塗りつぶしのみカウントする」などのように変更することができます。

## 質問票を回収した後に挙動を変更する。

残念ながら、回収後にこの挙動を変更する方法は想定されていないようだったので、プログラムに手を加えてみました。

```diff:.../sdaps/recognize/buddies.py
--- /usr/lib/python2.7/dist-packages/sdaps/recognize/buddies.py.20180320        2018-03-20 21:51:44.634608043 +0900
+++ /usr/lib/python2.7/dist-packages/sdaps/recognize/buddies.py 2018-03-20 21:51:34.702608231 +0900
@@ -687,6 +687,7 @@
         quality = -1
         # Iterate the ranges
         for metric, value in self.obj.data.metrics.iteritems():
+            self.obj.sheet.survey.defs.checkmode = 'check'
             metric = defs.checkbox_metrics[self.obj.sheet.survey.defs.checkmode][metric]
 
             for lower, upper in zip(metric[:-1], metric[1:]):

```

## 強引にオプションをcheckcorrectからcheckに変更する方法

ちなみに、checkmodeの指定は次のようなコードでsurveyファイルに保存されていますので、後から変更するプログラムを作成することは比較的容易と思われます。

```python:.../model/survey.py
def save(self):
    import ConfigParser
    file = bz2.BZ2File(os.path.join(self.survey_dir, '.survey.tmp'), 'w')
    cPickle.dump(self, file, 2)
    file.close()
    # ...
    os.rename(os.path.join(self.survey_dir, '.survey.tmp'), os.path.join(self.survey_dir, 'survey'))
```

# 修正機能のないシート生成時の考慮点

確認のため、シートの再生成も試してみましたが、単純にcheckmode=checkとするだけでは、コンパイルに失敗します。example.texから、checkmode=checkを指定してコンパイル可能にしたファイルは以下のようになりました。

```diff:.../example/example.tex
$ diff -u example.tex example_check_noinfo.tex
--- example.tex 2017-07-17 06:46:44.000000000 +0900
+++ example_check_noinfo.tex    2018-03-22 10:02:49.542978093 +0900
@@ -20,7 +20,7 @@
   % With SDAPS 1.1.6 and newer you can choose the mode used when recognizing
   % checkboxes. valid modes are "checkcorrect" (default), "check" and
   % "fill".
-  %checkmode=checkcorrect,
+  checkmode=check,
   %
   % The following options make sense so that we can get a better feel for the
   % final look.
@@ -30,6 +30,12 @@
 % For demonstration purposes
 \usepackage{multicol}

+\usepackage{xltxtra}
+\setmainfont{IPAPMincho}
+\setsansfont{IPAPGothic}
+\setmonofont{IPAGothic}
+\XeTeXlinebreaklocale "ja"
+
 \author{The Author}
 \title{The Title}

@@ -38,7 +44,7 @@

   % If you don't like the default text at the beginning of each questionnaire
   % you can remove it with the optional [noinfo] parameter for the environment
-  \begin{questionnaire}
+  \begin{questionnaire}[noinfo]
     % There is a predefined "info" style to hilight some text.
     \begin{info}
       Some information here. Nothing special, just adds a line above/below.
```

途中のsetfontなどはXeTeXを使用しているために必要な部分です。

これでシートを再生成した場合、survey-idなどを含めて体裁が変更されるため、改めて質問票を配布して回答を集める必要があると思われますが、テストしていません。

また2箇所にチェックをつけている場合には、レポートの平均、標準偏差などのデータには使用されませんが、CSVファイル上では"-2"が出力されます。無回答のデータは"-1"となります。データを母集団から除く場合の条件には、"-1"だけでなく、負数全体を含めないといけないのかなと思われます。
Rubyのシングルトンクラスについて

シングルトンクラスについて、すぐに忘れるので、メモしておく。

この内容はメタプログラミングRubyに書いている内容です。

ここでは、特異クラス＝シングルトンクラスのこと。
シングルトンパターンのシングルトンの意味合いではない。

## シングルトンメソッド
オブジェクト固有のメソッドを以下のように定義することができる。

```ruby
class C
end

 c = C.new
 #シングルトンメソッド定義
 def c.singleton_method_method_test
  p "singleton_method_test"
 end

 c.singleton_method_test
```

このメソッドは、シングルトンクラスに定義される。
シングルトンクラスは、オブジェクトとクラスの間に位置する存在である。

```ruby
  c.singleton_class.instance_methods(false)
  #ここにいる
  [:singleton_method_test]
```

## クラスメソッドへの応用
クラスメソッドも、これと同じ仕組みで定義されている。

```ruby
class C
  def self.class_method_test
    p "class_method_test"
  end
end

C.singleton_class.instance_methods(false)
=> [:class_method_test]
```


あるオブジェクトからメソッドを呼び出すときは、以下のようなメソッドのたどり方になる。

オブジェクトからシングルトンクラスを(一度)参照し、その後シングルトンクラスから継承チェーンをsuperclassによって辿ってメソッドを探していく。
Logstash + Elasticsearch + kibana で造るデータの可視化 

##■はじめに
最近、仕事場で見える化が話題になっているので、自宅で技術検証してみました。


###【参考】
・[http://acro-engineer.hatenablog.com/entry/2016/10/27/165342]

##■環境
・CentOS7.4
　→SELinuxとFirewalldは無効
・elasticsearch-5.6.8
・kibana-5.6.8
・logstash-5.6.8-1

##■インストール
###・リポジトリ登録
>~~~
># vi /etc/yum.repos.d/elastic.repo
>[elasticsearch-5.x]
>name=Elasticsearch repository for 5.x packages
>baseurl=https://artifacts.elastic.co/packages/5.x/yum
>gpgcheck=1
>gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
>enabled=1
>autorefresh=1
>type=rpm-md
>~~~

###・インストール
>~~~
># yum install java-1.8.0-openjdk-devel
># rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
># yum install elasticsearch
># yum install kibana
># yum install logstash
>~~~

##■初期設定
###・kibanaの外部接続を許可
>~~~
>vi /etc/kibana/kibana.yml
>server.host: "0.0.0.0"
>~~~

###・自動起動
>~~~
>systemctl start elasticsearch
>systemctl start kibana
>systemctl start logstash
>systemctl enable elasticsearch
>systemctl enable kibana
>systemctl enable logstash
>~~~

##■デモ(apacheのログ解析)
###・設定
>~~~
># vi /etc/logstash/conf.d/10_apache_access_log.conf
>input {
>  file {
>  path => "/var/log/httpd/access_log"
>  start_position => "beginning"
>  }
>}
>
>filter {
>  grok {
>  match => { "message" => "%{COMBINEDAPACHELOG}" }
>  }
>  date {
>  match => ["timestamp", "dd/MMM/YYYY:HH:mm:ss Z"]
>  }
>  geoip {
>  source => ["clientip"]
>  }
>}
>
>output {
>  elasticsearch {
>  hosts => ["localhost:9200"]
>  index => "access_log-%{+YYYYMMdd}"
>  }
>}
>~~~

###・取り込み
>~~~
># /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/10_apache_access_log.conf 
>~~~

###・インデックス登録
1.kibanaを開く
>　http://＜サーバーIP＞:5601

2.「management」「Index Patterns」「Create Index Pattern」と順に開く

3.次を入力して「create」をクリック

|項目|値 |
|-------------------------|--------------------------|
| Index pattern | access_log-* |
| Time Filter field name | @timestamp |

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245351/aa958876-d1c4-c124-fb0c-d37b6b33146d.png)

###・グラフ作成
1.「Visualize」「＋」「Vertical Bar」「access_log-* 」と順に開く
2.次を入力してすると・・・・グラフの完成

|大項目|中項目 |値 |
|-------------------------|--------------------------|--------------------------|
|Y-Axis|Aggregation|Count|
||Custom Label|アクセス数|
|X-Axis|Aggregation|Date Histogram|
||Field|@timestamp|
||Interval|Auto|
||Custom Label|時間|

![image.png](https://qiita-image-store.s3.amazonaws.com/0/245351/9a58438e-5eea-cf87-a4b8-f121883e8499.png)


以上です。
Dockerコンテナの標準エラー出力に任意のメッセージを送信

## 概要
Dockerの`logging driver`経由で出力されるログを監視している場合、監視設定を確認するために任意のメッセージを送りたいことがあります。
簡単にテストを実施するためにアプリケーション・ミドルウェアのコンテナに変わって任意のメッセージを送信する方法を紹介します。

Dockerのコンテナに限らず、Linuxのプロセスに関するTIPSです。

## ユースケース
- GGP: GKEからStackdriver Loggingへ送信されるログをフィルターテストしたい
- AWS: AWSからCloudWatch Logsへ送信されるログをフィルターテストしたい

## 環境
- OS: Alpine v3.7
- Docker: v17

## 方法

```
# containerへログインする

# 対象のPIDを検索
container$ pid=$(pgrep -o xxx)

# 任意のメッセージをstderrに出力
# OSにより適宜fdへのパスは`/dev`などに読み変えてください
container$ echo '[error] テストだよ' >> /proc/${pid}/fd/2

# 任意のメッセージをstdoutに出力
# fdの番号を変えれば対応する出力先を選択できます
container$ echo '[info] テストだよ' >> /proc/${pid}/fd/1
```

あとはフィルター内容があっているか確認！！


## 感謝
深尾さん教えてくれてありがとう！
Rails 5でTravis CIを利用する

[Travis CI](https://travis-ci.com/)を利用するには設定ファイルを書く必要がありますが、Rails 5のアプリケーション用にいい感じに書いている記事を見つけられなかったので備忘録として残しておきます。

## 各種バージョン

- Rails: `5.1.4`
- Ruby: `2.5.0`
- Bundler: `1.16.1`

## 設定ファイルを書く

こんな感じで書きました。

```yml:.travis.yml
language: ruby

services:
  - postgresql

bundler_args: "--without development --jobs=3"

cache: bundler

before_script:
  - psql -c 'create database travis_ci_test;' -U postgres
  - cp config/database.yml.travis config/database.yml

script:
  - bin/rails db:migrate RAILS_ENV=test
  - bin/rails test

notifications:
  email: false
```

### rvm

[Building a Ruby Project # Using-.ruby-version - Travis CI](https://docs.travis-ci.com/user/languages/ruby/#Using-.ruby-version)

省略すると`.ruby-version`に書いてあるバージョンが設定されます。

### services

[Setting up Databases - Travis CI](https://docs.travis-ci.com/user/database-setup/)

Travis CI内で利用するDBを指定します。
別途、DBユーザーの作成や`database.yml`の設定等が必要になります。
database.ymlの設定はドキュメントに倣って以下のような設定ファイルを用意し、ビルド時に置き換えるようにしました。

```yml:database.yml.travis
test:
  adapter: postgresql
  database: travis_ci_test
```

### bundler_args

[Building a Ruby Project # Speeding-up-your-build-by-excluding-non-essential-dependencies - Travis CI](https://docs.travis-ci.com/user/languages/ruby/#Speeding-up-your-build-by-excluding-non-essential-dependencies)

`bundle install`のオプションを指定できます。
developmentでのみ利用しているGemは不要だったのでwithoutオプションで除外しました。
jobsオプションで並列処理をさせて高速化させます。

### cache

[Caching Dependencies and Directories - Travis CI](https://docs.travis-ci.com/user/caching)

依存パッケージのキャッシュをするために、利用しているパッケージ管理ツールを指定します。

利用しているパッケージ管理ツールがBundlerで、インストール先のパスが`vendor/bundle`なら`bundler`と書くだけで大丈夫です。

### before_script

[Customizing the Build # The-Build-Lifecycle - Travis CI](https://docs.travis-ci.com/user/customizing-the-build/#The-Build-Lifecycle)

scriptの前に何か実行したいときに利用します。
ここにはPostgreSQLのセットアップを入れています。

### script

[Customizing the Build - Travis CI](https://docs.travis-ci.com/user/customizing-the-build)

ビルドスクリプトを実行するのに利用します。
本命であるrailsのコマンドの実行はここでやっています。

### notifications

[Configuring Build Notifications - Travis CI](https://docs.travis-ci.com/user/notifications)

Travis CIの結果を通知するのに利用します。
デフォルトの設定だと失敗したときや前回の失敗から成功した際に通知されてしまうので、通知が不要なら切ってしまうのがよいでしょう。

## 終わりに

今回は[Rails Tutorial](https://railstutorial.jp/)で作ったRails5のアプリケーション用に設定しました。この規模のアプリケーションなら上記のような設定で簡単にセットアップできるのでいいですね。

設定のためにPull Requestも作ったので参考までに置いておきます。

[Travis CIを導入する by ku00 · Pull Request #10 · ku00/sample_app_5](https://github.com/ku00/sample_app_5/pull/10)
gem install nokogiri がエラーの時

# gem install nokogiriがエラーになる時に参考にしたサイト

`gem install nokogiri -- --use-system-libraries`
を実行した時に以下のようなエラーがでた。

```
Building native extensions with: '--use-system-libraries'
This could take a while...
ERROR:  Error installing nokogiri:
	ERROR: Failed to build gem native extension.

    current directory: /Library/Ruby/Gems/2.3.0/gems/nokogiri-1.8.2/ext/nokogiri
/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby -r ./siteconf20180324-57544-de0r3o.rb extconf.rb --use-system-libraries
checking if the C compiler accepts ... yes
checking if the C compiler accepts -Wno-error=unused-command-line-argument-hard-error-in-future... no
Building nokogiri using system libraries.
Using pkg-config gem version 1.2.9
checking for libxml-2.0... yes
checking for libxslt... yes
checking for libexslt... yes
checking for xmlParseDoc() in libxml/parser.h... no
checking for xmlParseDoc() in -lxml2... no
checking for xmlParseDoc() in -llibxml2... no
-----
libxml2 is missing.  Please locate mkmf.log to investigate how it is failing.
-----
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/$(RUBY_BASE_NAME)
	--help
	--clean
	--use-system-libraries
	--with-zlib-dir
	--without-zlib-dir
	--with-zlib-include
	--without-zlib-include=${zlib-dir}/include
	--with-zlib-lib
	--without-zlib-lib=${zlib-dir}/lib
	--with-xml2-dir
	--without-xml2-dir
	--with-xml2-include
	--without-xml2-include=${xml2-dir}/include
	--with-xml2-lib
	--without-xml2-lib=${xml2-dir}/lib
	--with-libxml-2.0-config
	--without-libxml-2.0-config
	--with-pkg-config
	--without-pkg-config
	--with-pkg-config
	--without-pkg-config
	--with-override-variables
	--without-override-variables
	--with-xslt-dir
	--without-xslt-dir
	--with-xslt-include
	--without-xslt-include=${xslt-dir}/include
	--with-xslt-lib
	--without-xslt-lib=${xslt-dir}/lib
	--with-libxslt-config
	--without-libxslt-config
	--with-exslt-dir
	--without-exslt-dir
	--with-exslt-include
	--without-exslt-include=${exslt-dir}/include
	--with-exslt-lib
	--without-exslt-lib=${exslt-dir}/lib
	--with-libexslt-config
	--without-libexslt-config
	--with-xml2lib
	--without-xml2lib
	--with-libxml2lib
	--without-libxml2lib

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /Library/Ruby/Gems/2.3.0/extensions/universal-darwin-17/2.3.0/nokogiri-1.8.2/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /Library/Ruby/Gems/2.3.0/gems/nokogiri-1.8.2 for inspection.
Results logged to /Library/Ruby/Gems/2.3.0/extensions/universal-darwin-17/2.3.0/nokogiri-1.8.2/gem_make.out
```

githubのissueに登録されてた
https://github.com/sparklemotion/nokogiri/issues/1206
【Oracle】頭字語解凍語一覧

#1 はじめに
最近、Oracleのアーキテクチャについて勉強しています。

勉強しているとPGAやSGAなど[頭字語](https://ja.wikipedia.org/wiki/%E9%A0%AD%E5%AD%97%E8%AA%9E)で略されているワードにぶちあたります。
頭字語で提示されている時は、『さっぱり訳分からん』となることが多いワードも、PGA（Program Global Area）のように略さずに考えると、とたんに飲み込みやすくなったりします。

なんとなく私はそれを頭字語解凍と呼んでいるのですが、今後の勉強に活かすべくOracleで出てきそうな頭字語の解凍語一覧を作りたいと思います。

#2 頭字語解凍語一覧
| 頭字語 | 解凍語 |
|-----------:|:-----------|
|PGA|Program Global Area|
|SGA|System Global Area|
|SMON|システムモニタプロセス|
|PMON|プロセスモニタプロセス|
|MMON|マネージャモニタプロセス|
|DBWR|データベースライタプロセス|
|LGWR|ログライタプロセス|
|CKPT|チェックポイントプロセス|
|ARCH|アーカイバプロセス|
|FBDA|フラッシュバック・データ・アーカイバ・プロセス|
|SMCO|領域管理コーディネータ・プロセス|
|OLTP|オンライントランザクション処理|
|OLAP|オンライン分析処理|
|DWH|Data Ware House|
|LRU|Least Recently Used |

#3 気づいたこと
・実質、解凍語になっているのは最初の2行までで、他は解凍+和訳になってしまいました。(汗
・データベースライタプロセス、アーカイバプロセスは以下二通りの頭字パターンが確認できました。使い分けがあるのでしょうか？

| パターン１ | パターン２ |
|:----------:|:----------:|
|DBWR|DBWn|
|ARCH|ARCn|

・[三文字頭字語](https://ja.wikipedia.org/wiki/%E4%B8%89%E6%96%87%E5%AD%97%E9%A0%AD%E5%AD%97%E8%AA%9E)など頭字語にも色々な種類があり、起源とか調べると面白そうです。。。

#4 参考
https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%83%E3%82%AF%E3%82%B0%E3%83%A9%E3%82%A6%E3%83%B3%E3%83%89%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9_(Oracle_Database)

https://docs.oracle.com/cd/E60665_01/db112/CNCPT/process.htm

https://www.imkk.jp/blog/what-is-oltp.html

https://www.weblio.jp/content/LRU
[Ruby]lengthについて

lengthメッソドを勉強したのでメモっとく

###文字オブジェクトの文字数を知りたい場合

```
文字オブジェクト.length
=>文字数
```

###配列オブジェクトに格納された要素の数を知りたい場合

```
配列オブジェクト.length
=>格納された要素の数
```

以上
[Ruby]if文で条件式を書く

if文を勉強したのでメモっとく

###条件が１コなら

```
if 条件1 then
　　　メソッド(条件1がtrueでこのメソッドが走る)
end
```

###条件が２コなら

```
if 条件1 then
　　　メソッド(条件1がtrueでこのメソッドが走る)
else
　　　メソッド(条件1がfaluseでこのメソッドが走る)
end
```

###条件が３コ以上なら
```
if 条件1 then
　　　メソッド(条件1がtrueでこのメソッドが走る)
elsif 条件2 then
　　　メソッド(条件2がtrueでこのメソッドが走る)
elsif 条件3 then
　　　メソッド(条件3がtrueでこのメソッドが走る)
else
　　　メソッド(条件1、2、3に当てはまらないならこのメソッドが走る)
end
```
以上