OmniAICreator/Qiita-1.07M huggingface dataset:
centOS7にナレッジ共有OSS「Knowledge」をインストールする

#はじめに
自社でナレッジ共有するのに良いのが無いか探して「Knowledge」に辿り着きました。

要件は以下の通りで、Knowledgeはこれらを満たしていました。

- 無料であること
- 記事の投稿範囲を指定できること
- 簡単に投稿できること
- 文字やURL、画像を簡単に入れ込むことができること
- 今風であること（大事）
- 携帯やタブレットで操作がし易いこと

https://information-knowledge.support-project.org/ja/

#インストール環境

- centOS7
- java 1.8
- tomcat 8.5.14
- Knowledge 1.8.1
※SELinux、iptables共にOFFの漢仕様でいきます


# インストール
## Javaのインストール
Javaがインストールされているか確認します。
Java1.8以降が入っていれば、Javaのインストールは不要です。
`rpm -qa | grep java`

Java1.8を探します
`yum search java | grep 1.8`

Java1.8のインストール
`yum install -y java-1.8.0-openjdk-devel.x86_64`

Javaのインストール結果確認

```
# rpm -qa | grep java-1.8
java-1.8.0-openjdk-devel-1.8.0.131-0.b11.el6_9.x86_64
java-1.8.0-openjdk-1.8.0.131-0.b11.el6_9.x86_64
java-1.8.0-openjdk-headless-1.8.0.131-0.b11.el6_9.x86_64
```
Javaのバージョン確認

```
 java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b11)
OpenJDK 64-Bit Server VM (build 25.131-b11, mixed mode)
```

メモ：上記で1.8以外はバージョンの切り替えが必要です。
`alternatives --config java`

##Tomcatのインストール
参考にさせていただきました！
http://qiita.com/nyao/items/8ad51a56638e646b2ec1

ユーザを作成します
`useradd -s /sbin/nologin tomcat`

Tomcat8以上が必要なので、確認をします。
`yum search tomcat8`

yumに居ないので、直接落とします。
`wget http://ftp.kddilabs.jp/infosystems/apache/tomcat/tomcat-8/v8.5.14/bin/apache-tomcat-8.5.14.tar.gz`

解凍します。
`tar -xzvf apache-tomcat-8.5.14.tar.gz`

フォルダを移動します
`mv apache-tomcat-8.5.14 /usr/local/tomcat`

フォルダの権限変更
`chown -R tomcat:tomcat /usr/local/tomcat`

`vi /etc/systemd/system/tomcat.service`

```tomcat.service
[Unit]
Description=Apache Tomcat 8
After=syslog.target network.target

[Service]
User=tomcat
Group=tomcat
Type=oneshot
PIDFile=/usr/local/tomcat/tomcat.pid
RemainAfterExit=yes

ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
ExecReStart=/usr/local/tomcat/bin/shutdown.sh;/usr/local/tomcat/bin/startup.sh

[Install]
WantedBy=multi-user.target
```

権限変更
`chmod 755 /etc/systemd/system/tomcat.service`

サービスに登録
`systemctl enable tomcat`

開始テスト
`systemctl stop tomcat`
`systemctl start tomcat`
`systemctl status tomcat`

ポートを許可
`firewall-cmd --add-port=8080/tcp`

アクセスしてみましょう
`http://tomcat入れたサーバのアドレス:8080`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/47012/1b4299d8-d23b-1607-2a9e-b19e58840eaa.png)

## Knowledgeのインストール

Webページを配置するフォルダに移動
`cd /usr/local/tomcat/webapps`

warファイルをゲットします
`wget https://github.com/support-project/knowledge/releases/download/v1.8.1/knowledge.war`

サービスを再起動します
`systemctl restart tomcat`

さっそくアクセスしてみましょう。初回は表示されるまで結構時間がかかります。
`http://tomcat入れたサーバのアドレス/knowledge`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/47012/3706ae55-3b93-1351-9806-c08627ee3bf6.png)

あとは公式URLに従って設定を行います。
https://information-knowledge.support-project.org/initial-setup-ja
PhoenixでPlugを使用しアクションの前にフィルターを実装する

# Plugを使用してアクションの前にフィルターを実装する

##Plugとは

Railsでの `before_action` のようなフィルター処理をPhoenixでどう実装するものかと調べた結果
Plugで実装できそうでした。

> Plug lives at the heart of Phoenix's HTTP layer, and Phoenix puts Plug front and center. We interact with plugs at every step of the connection lifecycle, and the core Phoenix components like Endpoints, Routers, and Controllers are all just Plugs internally. Let's jump in and find out just what makes Plug so special.

http://www.phoenixframework.org/docs/understanding-plug

**We interact with plugs at every step of the connection lifecycle**

簡単にPlugを説明すると コネクションの　各ステップで処理を挟める という認識です。

例として, ユーザがログインしてるか(cookieに:idがsetされているか)どうかの判断をPlugで実装していきます。

##Plugでのフィルター実装

今回はControllerのアクションの前にフィルターとなる処理を挟みます。

+ フィルターとなるPlugを作成する。
+ web.ex でcontrollerに フィルターとなるPlugのメソッドをimportする
+ Controller でPlugを呼び出す

**フィルターとなるPlugを作成する**

```Elixir
#web/controllers/authenticator.ex
defmodule Example.Authenticator do
  import Plug.Conn
  import Phoenix.Controller

  def logged_in?(conn, _opts) do
    case get_session(conn, :id) do
      nil -> 
        conn
        |> redirect(to: "/signin")
        |> halt
      _ -> conn
    end
  end
end
```

コードから推測できると思いますが, cookieに `id`がなければ, `/signin`にリダイレクトするというシンプルな処理です。

**web.ex でcontrollerに フィルターとなるPlugのメソッドをimportする**

```Elixir
    def controller do
      quote do
        use Phoenix.Controller

        alias Example.Repo
        import Ecto
        import Ecto.Query

        import Example.Router.Helpers
        import Example.Gettext
        import Example.Authenticator, only: [logged_in?: 2]
      end
    end
```
`import Example.Authenticator, only: [logged_in?: 2]`

上で定義したPlugをimportする。
今回は特にonlyの記述は必要ないが, 特定のmethodをimportしたい場合は onlyでメソッド名, paramの数を指定する。

これで定義されているController全てでAuhenticatorの`logged_in?`が呼べるようになりました。

**Controller でPlugを呼び出す**


```Elixir
  defmodule Example.xxxxxxController do
    use Example.Web, :controller
    alias Example.UserProfile

    plug :logged_in?
```

`plug :logged_in?` を アクションの前に呼び出したいControllerに追加します。

****

以上で `before_action` のような処理を追加できました。
Vue + vue-router で動的にページタイトルを変更する方法

## 環境

- Vue 2.3.x
- vue-router 2.5.x

## ディレクトリ構成

```
├── app.js
├── components
│   ├── App.vue
│   └── Navbar.vue
├── router
│   └── index.js
├── util
│   └── title.js
└── views
    └── About.vue
```

## 設定

ページタイトルを生成するファイルを作成:

```js:util/title.js
export default {
  mounted() {
    let { title } = this.$options
    if (title) {
      title = typeof title === 'function' ? title.call(this) : title
      document.title = `App Name - ${title}`
    }
  }
}
```

util/title.js をグローバルにミックスイン:

```js:app.js
// ...
import titleMixin from './util/title'
import router from './router/index'

Vue.mixin(titleMixin)

new Vue({
  el: '#app',
  router,
  render: h => h(App)
})
```

これで OK :)

例えば /about ページだと以下のように設定:

```html:views/About.vue
<template v-once>
  <div>
    <h1>About</h1>
    <p>About page.</p>
  </div>
</template>

<script>
  export default {
    title: 'About'
  }
</script>
```

これで /about のページタイトルが About - App Name になる。


動的にデータを引っ張ってきて、一緒に貼り付けたい場合などは以下のようにやる:

```html
<script>
  export default {
    title() {
      return this.item.title
    }
  }
</script>
```

## まとめ

この方法は [vuejs/vue-hackernews-2.0](https://github.com/vuejs/vue-hackernews-2.0) で実装されている方法です (シンプルに見せるためにサーバーサイドレンダリングの考慮はしていません) 。

あと、グローバルなミックスインは上記のようなカスタムオプションを処理するようなもののみに使用するのが良さそうです。詳しくは [ミックスイン - Vue.js] (https://jp.vuejs.org/v2/guide/mixins.html) 。

こういうものってけっこう需要があると思うので、そのうち何らかの形でコアに実装されそうですけど、どうなんでしょう？サーバサイドレンダリングを考慮すると難しいのかなぁ。

## 参考リンク
[ヘッドの管理](https://ssr.vuejs.org/ja/guide/head.html)
[vuejs/vue-hackernews-2.0](https://github.com/vuejs/vue-hackernews-2.0)
Alexa で日付を拾おうとしたらbuilt-in slot のAMAZON.DATEが全然ISO-8601フォーマットじゃなかった件


Amazon公式のリファレンス
https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/built-in-intent-ref/slot-type-reference

こちらには、かなり堂々と、`AMAZON.DATE`について
「Converts words that indicate dates (“today”, “tomorrow”, or “july”) 
into a date format (such as “2015-07-00T9”).」と書いてあるのですが。。

これはつまり、AlexaでCustum skillを作り、Intentをこさえて、
Slot TypeにAMAZON.DATE型を指定したら、Slot.valueから拾い上げたパラメタは、
「August eighteenth」と言ったら「2017-08-18T9」のように変換されているはずだし、
「Tomorrow」と言ったら「2017-04-29T9」のようになってるはず。

とゆーことを説明してるにもかかわらず、
Lambdaのテストイベントでリクエストすると、
以下のように「tomorrow」がそのまま帰ってきてしまうのです。

・入力

```JSON:AlexaIntent-recipeを改変
  "version": "1.0",
  "request": {
    "locale": "en-US",
    "timestamp": "2016-10-27T21:06:28Z",
    "type": "IntentRequest",
    "requestId": "amzn1.echo-api.request.[unique-value-here]",
    "intent": {
      "slots": {
        "birthday": {
          "name": "birthday",
          "value": "tomorrow"
        }
      },
      "name": "BirthdayToSign"
    }
  },
```

・出力

```log:
2017-04-29T10:58:23.294Z	c3791e0d-2cca-11e7-9d33-23aa71b078c7	L.103 myBirthday=tomorrow
```

なんなんだー(^^;)
困ったなぁ。。。

あっ、Lambda上のテストだからかな？

Qiitaに書いたら一瞬で自己解決する効果を狙ってエントリを書きました。
Stack over flowで解決策を探そうと思います。。


---

# Alexaを通したら解決！

（3分後）


echoにしゃべりかけて、Alexaシステムを経由したらちゃんと
「Tomorrow」＝「April thirtieth 2017」と変換してくれました。

lambda上のテストはこの変換がなされないということで、覚えておこうと思います。
Rails5でRSSに対応させてfeedlyのボタンを設置してみる（作業時間:10分）

勉強がてら自分のブログをrailsで運用しています。
RSSくらい対応したいなと思いRSS対応をしました。

http://tackeyy.com/

railsはRSSフォーマットに対応しているので、gemなどを使わずにrailsのデフォルトの機能で実装していきます。
実装の流れはCRUDを作成するのようなイメージで、ルーティング、コントローラー、ビューを追加していきます。

以下のコミットでRSS対応をしているので、コミットを見ながらやりたい方は参考にしてください。
リポジトリにスターもつけていただけると狂喜乱舞します。
https://github.com/tackeyy/blog/commit/079ceca788130d238fd59d95b6e71583d715da5b

## ルーティングを設定

config/routes.rb
```
  resources 'feed', only: %i(index)
```

## コントローラーを作成してRSSフォーマットを返す

app/controllers/feed_controller.rb

```
class FeedController < ApplicationController
  def index
    @posts = Post.shipped.order(created_at: :desc).page(params[:page]).decorate
    respond_to do |format|
      format.rss { render layout: false }
    end
  end
end
```

## index.rss.builderを作成してXMLを記載する

app/views/feed/index.rss.builder

```
#encoding: UTF-8

xml.instruct! :xml, :version => "1.0"
xml.rss("version" => "2.0", "xmlns:dc" => "http://purl.org/dc/elements/1.1/") do
  xml.channel do
    xml.title Settings.title
    xml.description Settings.description
    xml.link Settings.url
    @posts.each do |post|
      xml.item do
        xml.title post.title
        xml.description do
          xml.cdata! HTML_Truncator.truncate(post.to_html, 1).html_safe
        end
        xml.pubDate post.created_at
        xml.guid blog_path(post.friendly_id || post.id)
        xml.link blog_path(post.friendly_id || post.id)
      end
    end
  end
end
```

- slug を簡単に付けれる ` friendly_id ` を使っているので ` *_path(post.friendly_id 〜 ` となっています
https://github.com/norman/friendly_id

- title, descriptionは ` config ` というGemを使っています
https://github.com/railsconfig/config

以下にアクセスしてXMLが表示されればOKです。

http://localhost:3000/feed?format=rss

## feedlyのボタンを設置する

[ここ](https://feedly.com/factory.html)からfeedlyのボタンをhtmlを生成します。
あとは任意の場所にリンクを貼るだけです。
私の場合はフッターを以下のようにしました。

app/views/layouts/_footer.html.haml

```
%footer
  .container
    .row
      .col-lg-8.col-lg-offset-2.col-md-10.col-md-offset-1
        %ul.list-inline.text-center
          %li
            %a{href: "https://github.com/tackeyy", target: "blank"}
              %span.fa-stack.fa-lg
                %i.fa.fa-circle.fa-stack-2x
                %i.fa.fa-github.fa-stack-1x.fa-inverse
          %li
            %a{:href => 'https://twitter.com/3chhe', :target => '_blank'}
              %span.fa-stack.fa-lg
                %i.fa.fa-circle.fa-stack-2x
                %i.fa.fa-twitter.fa-stack-1x.fa-inverse
          %li
            %a{href: "http://cloud.feedly.com/#subscription%2Ffeed%2Fhttp%3A%2F%2Ftackeyy.com%2Ffeed", target: "blank"}
              %span.fa-stack.fa-lg
                %i.fa.fa-circle.fa-stack-2x
                %i.fa.fa-rss.fa-stack-1x.fa-inverse
          %p.copyright.text-muted Copyright © #{Settings.title} 2017
```

こんな感じで簡単にRSS対応できました。

## 参考

https://www.codingfish.com/blog/129-how-to-create-rss-feed-rails-4-3-steps
Debian(jessie)にredmineを入れる

# はじめに

個人のタスク管理用にDebian(jessie)にredmineを導入したので、その時のメモ。
公式のWikiは情報が足りていない気がする。
かなり彷徨って、設定を追加したので忘れないように書いておこうかと。

導入環境は、Debian(jessie)にapache2、mysqlは導入済み。
URLは`http://hoge/redmine`のようにする。

## 導入

[公式Wiki](https://wiki.debian.org/redmine)通りに導入はapt-get installでいける。
ただし、バージョンは2017/4末現在で2.5.2が入る。
最新バージョンを入れたい人は違う方法を採用する方がいいと思う。
私はタスク管理できればよかったので気にしないことにした。
プラグインも今のところ入れる気なし。

## passenger設定

全般的にpassengerに対する設定情報がザルすぎて、結構困った。
`/etc/apache2/mods-available/passenger.conf`の設定が全然足りていない気がするので、以下のように修正。

```passenger.conf
<IfModule mod_passenger.c>
  PassengerRoot /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini
  PassengerDefaultRuby /usr/bin/ruby
  PassengerDefaultUser www-data
  RailsBaseURI /redmine
</IfModule>
```

元々のpassenger.confでは、`PassengerDefaultUser`と`RailsBaseURI`の記述がなく、rootで導入されるredmineのディレクトリ`/usr/share/redmine`にアクセスできない。
また`/redmine`でアクセスすると404になってしまい動かない。
っていうことで、上記を追加。

## configration.ymlの設定

こちらも公式では説明不足。
`/etc/redmine/default`の下に、`/usr/share/redmine/config/configuration.yml.example`というサンプルファイルを`configuration.yml`にリネームしてコピーする。
設定は`/etc/redmine/default/configuration.yml`を編集することで行うことができる。

![設定テスト.png](https://qiita-image-store.s3.amazonaws.com/0/95484/6a2ac5b6-f328-604c-67ae-be1c4b2b9dbf.png)

メール送信周りの設定を修正して、テストメールを送信してみれば、設定ファイルが有効かどうか判断できる。

# さいごに

[公式Wiki](https://wiki.debian.org/redmine)さん、入り口まで案内してくれるけど、中に入ったらあとは自分で頑張ってねのスタンス。嫌いじゃないっすよ。
レイヤーマーカーのタイミングでテキストを単語毎に表示させる

#Extendscriptを触り始めて約１か月
ある程度プログラムと言うものがつかめてきた気がします。
今月の目標だったプログラムは何となく完成したので、そのお披露目です。

※ネット上の先輩方のプログラムは未だサッパリのレベルです。
素人が作ってるぜーぐらいの感覚で見て頂ければと思います。
また何かアドバイスや、ココはこうした方がいいよ的な物があればコメント頂ければと思います。（理解出来るかわからないですが（泣））
宜しくお願いします。


#やりたかった事
レイヤーマーカーの移動で単語毎の表示タイミングを変更したいよー！

#プログラムの内容
①レイヤーマーカーの間隔の設定
②レイヤーのインポイントを現在の時間に設定
③レイヤーのアウトポイントをレイヤーのインポイントから始まり「単語の数」X「マーカーの間隔」の長さで設定
④アニメーターを追加
・セレクターの開始にエクスプレッションを追加　（レイヤーマーカーインデックスと単語のインデックスで表示させる）
・セレクターの終了を単語の数（text_array_length）に設定
・不透明度を追加し、数値を0に設定
　・高度プロパティ
　・単位をインデックスに変更
　・基準を単語に変更
⑤マーカーの設定
・単語の数だけマーカーを作成
・マーカー名に分割した単語を設定

とまあこんな感じです。

#それではコードです。

```js
#target aftereffects

var myComp = app.project.activeItem;
var myLayer = myComp.selectedLayers[0];
var myText = myLayer.property("ADBE Text Properties").property("ADBE Text Document").value;
var text  =　myText.toString (myText);
var text_array = text.split(' ');
var interval=0.5 ;　//レイヤーマーカー間隔
var layIn=myLayer.inPoint=myLayer.time; //レイヤーのインポイント
var layOut=myLayer.outPoint = layIn+text_array.length*interval;　//レイヤーのアウトポイント


function anipro(){
//アニメーターのプロパティー設定
    var text_ani=myLayer.property("ADBE Text Properties").property("ADBE Text Animators").addProperty("ADBE Text Animator");
    text_ani.property("ADBE Text Animator Properties").addProperty("ADBE Text Opacity").setValue(0);
    var sel=text_ani.property("ADBE Text Selectors").addProperty("ADBE Text Selector");
    sel.property("ADBE Text Range Advanced").property("ADBE Text Range Units").setValue(2); //１パーセント　2インデックス
    sel.property("ADBE Text Range Advanced").property("ADBE Text Range Type2").setValue(3); //1 文字　2スペースを除いた文字　3単語　4行
    sel.property("ADBE Text Index Start").expression='nKey=marker.nearestKey(time);'+String.fromCharCode(13)+
                                                                            '(time >= nKey.time ) ? P1 = nKey.index : P1=nKey.index-1;'
    sel.property("ADBE Text Index End").setValue(text_array.length);
//アニメーターのプロパティー設定ここまで
}

function layMar(){
//レイヤーマーカー設定
            for (var i=0; i<text_array.length; i++){
            var myMarker = new MarkerValue(text_array[i])
            myLayer.property("Marker").setValueAtTime(layIn+interval*i, myMarker);
        }
 }
//レイヤーマーカー設定ここまで

app.beginUndoGroup("自動マーカー");//アンドゥグループ開始
    anipro();
    layMar();
app.endUndoGroup();
```

#これを実行するとこんな感じです。

![bandicam 2017-04-29 20-07-35-975.jpg](https://qiita-image-store.s3.amazonaws.com/0/178061/50dc6155-4198-54c4-2ee7-e98588ab3952.jpeg)

テキストレイヤーに「I just want to take you higher」の文字が入力されていて、プログラムを実行すると
テキストレイヤーにマーカーが追加され、マーカーのタイミングでその文字が表示されるというものです。
もちろんマーカーを移動させれば、表示のタイミングも変わります。
ただマーカーの名前はガイド的なもので、実際にはAE内のマーカーのインデックス番号を参照しているので、マーカーの順番を変えても
表示文字は入れ替わりません。
頭から単語順に表示されます。

あと初めてファンクションを使ってみましたが、使い方は当たっていますか(笑)？？
とりあえずまとめといて、使いたい時に呼び出す的な事でいいのでしょうか・・・

プログラム的には丁寧ではないですが、私自信で使う分には内容も把握しているしいいかなと(笑)
ただまだまだ改良はしていくので、またこのプログラムも更新しますね！
windows10でTensorFlowの環境を構築した

TensorFlowをwindows10で使おうとしたらいくつか詰まったのでメモ

1. Pythonのバージョンが違った
2017/04/29では、windows版TensorFlowはPython3.5しか対応していません。
私の場合は3.6が入っていたのでアンインストールしました。<br>追記<br>Anacondaの仮想環境を利用するのもよさそうですね<br>https://conda.io/docs/user-guide/tasks/manage-environments.html

1. エラーが出てインストールが止まる
以下のインストールコマンドを実行したところ
pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.0.0-cp35-cp35m-win_amd64.whl 
Cannot remove entries from nonexistent file...
などと表示されて失敗してしまった。
http://yaju3d.hatenablog.jp/entry/2016/12/06/023820
によると依存パッケージの問題のようなので、
pip install --upgrade -I setuptools
を実行しました。

1. 無事インストール完了
import tensorflow
でインポートできることを確認しました。

参考サイト
　公式　https://www.tensorflow.org/install/install_windows
Unity5.6でVRコンテンツを作ってみる（Asset Import編）

#VRコンテンツを作ろう！！
##なぜVR？？
学校のプロジェクトでVRコンテンツを作ろうということになり、まずは自力をつけなきゃいけなくなり、まずは自主的に簡単なVRコンテンツを作ることにしました。
##環境
Unity5.6
Mac
##早速取り掛かる
一応今回作ろうとしているのは、「家の中のグッズが緊急時にどのように生きるのかというインフォーメーションが出る」というものです。（何言ってるの？という方も最後までお付き合いいただけたら幸いです・・・）
##アセットのインポート
家のassetはいろいろとあったんですけど、なんとなく今回はこれにしました。![スクリーンショット 0029-04-29 19.58.37.png](https://qiita-image-store.s3.amazonaws.com/0/83409/c78f4898-24da-c3cd-952b-1f7a16b2885f.png)
[リンク](https://www.assetstore.unity3d.com/jp/#!/content/16674)
これをインポートして、実際にMedieval Toon House/Scene/Sample_Scenをダブルクリックで開き再生してみます。![スクリーンショット 0029-04-29 20.01.38.png](https://qiita-image-store.s3.amazonaws.com/0/83409/26735f2e-cc9b-8867-5248-ae514b9af69a.png)

問題なく動きそうです。

次回はこのカメラを家の中に移動させ、とりあえずVR出力するところまでやろうと思います。
ConoHaでUbuntu16.04を建てた

[ConoHa](https://www.conoha.jp/)
月額がさくらよりも低かったのでつい。クーポンが配布されていたのでつい。

## 概要
- OSインストール
- ssh設定変更
- 一般ユーザ(sudo可)追加
- iptables設定

## 契約する
### OSを選択
今回はUbuntu16.04(64bit)を選択
### rootパスワードを設定
さくらの標準インストールと違い、rootにパスワードを設定する

## ログインする
ステータスが起動中になってからもOSインストール中だったのでしばらく待つ。
コントロールパネルからrootでログインする。

## sshの設定をする
`/etc/ssh/sshd_config`を以下のように編集。`xxxxx`はssh用ポート。

```diff
-PermitRootLogin yes
+PermitRootLogin no
-Port 22
+Port xxxxx
-PasswordAuthentication yes
+PasswordAuthentication no
```

## 一般ユーザを作る
```
$ adduser user_name
$ gpasswd -a user_name sudo
```
参考: [ubuntu ユーザを追加して sudo 権限をつける](http://qiita.com/white_aspara25/items/c1b9d02310b4731bfbaa)

### ついでにsshでログインしてみる
```
$ ssh user_name@hostname -p xxxxx
```
### ついでにsudoしてみる
```
$ sudo su -
```
#### ここでなぜか`sudo: unable to resolve host`がでたので解決
原因は分かってない...

```
# echo "127.0.1.1 $(hostname)" > /etc/hosts
```

## iptablesの設定をする
ufwを使って設定
ufwは `/etc/ufw/application.d` 内のファイルを読んでサービスとして扱ってくれるので、sshサーバのポート番号を変更したものを置いておく。

```
# ufw enable
# cd /etc/ufw/application.d/
# cp openssh-server my-openssh-server
# vim my-openssh-server
# ufw limit MyOpenSSH
```
5行目のvimでの変更内容は以下。
xxxxxはsshの設定で決めたポート番号。

```diff
-[OpenSSH]
+[MyOpenSSH]
-ports=22/tcp
+ports=xxxxx/tcp
```
`iptables-persistent` でiptablesの設定を永久化。
インストール時の質問をyesにすれば現在の情報を保存してくれる(`netfilter-persistent save`をやってくれるっぽい)。

```
# apt install iptables-persistent
# netfilter-persistent start
```

### ちなみに
iptablesの設定を更新した場合の手順。

```
# netfilter-persistent save
# netfilter-persistent start
```

## sshで接続
```
$ ssh user_name@hostname -p xxxxx
```
接続できれば完了！
Python3.6環境構築(Win環境Anaconda利用)

## 今回の目標
* Anaconda インストール
* PythonでHelloWorld!
* condaで仮想環境構築

## Anacondaインストール
[Anacondaダウンロードページ](https://www.continuum.io/downloads#_windows )

![anaconda01.PNG](https://qiita-image-store.s3.amazonaws.com/0/177957/c933222c-5f10-0e8b-da3f-ed73888d0bc0.png)


赤で囲った部分をクリック
ヴァージョン選択ページに移るので
**Anaconda 4.3.1 Python3.6 64bit** インストーラを選択
(個人的には2.Xのほうが慣れているんだけどもPythonコミュニティでのサポートが2020年までらしいので3.Xを選択)
**Python2.Xと3.Xは互換性がないので注意!!**
![anaconda02.PNG](https://qiita-image-store.s3.amazonaws.com/0/177957/0d3576ca-e994-cfe8-a092-86194d25ffcb.png)

400Mb程度なので多人数でやるときはファイルサーバにぶち込んでおいたほうがよさげ

とりあえずインストーラ(Anaconda 3-4.1-Windows-x86_64.exe)起動してCドライブ直下にインストール
※デフォルトはC:\User直下。どこでもいい


### Pythonコマンド確認
コマンドプロンプト起動->「python」コマンド実行

```py
C:\>python
Python 3.6.0 |Anaconda 4.3.1 (64-bit)| (default, Dec 23 2016, 11:57:41) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> exit()

```

exit() でインタプリタ終了

この時Pythonインタプリタが起動しない場合、環境変数を確認
![path.PNG](https://qiita-image-store.s3.amazonaws.com/0/177957/9cf9dc09-48d3-5c29-ab1b-5c870f18ff5c.png)


なかったら追加

## PythonでHelloWorld!
とりあえず対話モードでHelloWorld

```py
C:\>python
Python 3.6.0 |Anaconda 4.3.1 (64-bit)| (default, Dec 23 2016, 11:57:41) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> word = 'Hello Python World!'
>>> print(word)
Hello Python World!
>>> exit()
```

次にスクリプトファイルから起動

```py
#coding:UTF-8
#日本語使うときはエンコード宣言

word = 'こんちは世界'
print word
```

コマンドプロンプトでworkディレクトリに移動してpythonコマンドで起動

```
C:\>cd work

C:\work>python hello.py
こんちは世界
```

## Condaで仮想環境構築
Tensorflow用に仮想環境を用意する。
Condaはパッケージ管理アプリケーション(pipとかといっしょ)


```bat 
C:\work>conda info -e
# conda environments:
#
root                  *  C:\Anaconda

```

createコマンドでTensorflow用の環境を作る
※Tensorflowの対応var要確認。今回は仮想環境用にPython2.Xを入れてみる。


```
conda create -n py27 python=2.7 anaconda
# conda create -n 仮想環境の名前 python=pythonのVer anaconda
.
.
.
Proceed ([y]|n)?y
```

途中でProceedって聞かれるのでy入力してEnter
しばらくパッケージインストールされるので待つ

終わったらまた確認

```
C:\>conda info -e
# conda environments:
#
py27                     C:\Anaconda\envs\py27
root                  *  C:\Anaconda
```

*ついてるのがアクティブな環境

py27をアクティブにする

```
C:\>activate py27

(py27) C:\>conda info -e
# conda environments:
#
py27                  *  C:\Anaconda\envs\py27
root                     C:\Anaconda
```

非アクティブは「deactivate」

とりあえずここまで
次回までに

* Tensorflowの必要環境
* Tensorflowの構築方法
* チュートリアル

を調べておく
ムービングモチベーターズによるモチベーションの可視化

# はじめに

[ムービングモチベーターズ](https://management30.com/practice/moving-motivators/) をチームで試してみました。実施した手順とその感想をまとめておきます。

## ムービングモチベーターズとは

ムービングモチベーターズは [Management 3.0](https://management30.com/) のプラクティスの1つで、モチベーションを可視化するための簡単なワークショップです。[１０種類のカード](https://1qjpt15fhlq3xjfpm2utibj1-wpengine.netdna-ssl.com/wp-content/uploads/2017/03/Management30-MovingMotivatorCards-2015-self-print-A4-Japan.pdf) に以下のようなモチベーションの源泉となるキーワードが書いてあります。この10種類を1セットとして1人ずつに配り、自分がモチベーションを動かされると感じるキーワードから順番に並び替えます。順番が決まったらなぜその順番に並べたのかの理由とともにチームに共有します。それぞれのメンバーが何にモチベーションを動かされるかを知ることで互いの価値観を理解し、チームのコミュニケーションを円滑にする事にもつながります。

![movingmotivators.png](https://qiita-image-store.s3.amazonaws.com/0/3324/62b384da-2a12-b445-03e3-04ad482e1f29.png)


## モチベーションの源泉

| キーワード  | 説明 |
|:----------:|:------------------|
| 受容   | 私の周りの人が、私がやっていることや私らしさを認めてくれる |
| 好奇心 | 調査したり、考えたりしたいことがたくさんある |
| 自由   | 私は自分自身の仕事と責任で他人から独立している |
| 地位   | 私の職位は、優れていて、いっしょに働いている人たちから認められている |
| ゴール  | 私の人生の目的が、私がしている仕事に反映されている |
| 名誉   | 私個人の価値が私の働き方に反映されていることを誇りに思う |
| 秩序   | 安定した環境のための十分な規則と方針がある |
| 熟達   | 私の仕事は難しいが、まだ能力の範囲内にある |
| 権力   | 私の周りに起きることを自分で左右できる裁量がある |
| 関係性 | 私は仕事でかかわる人々と良好な社会的つながりを持っている |


# 実施手順

## 事前準備

Management3.0のサイトから [１０種類のカード](https://1qjpt15fhlq3xjfpm2utibj1-wpengine.netdna-ssl.com/wp-content/uploads/2017/03/Management30-MovingMotivatorCards-2015-self-print-A4-Japan.pdf) をダウンロードし人数分プリントアウトしてカットし10枚1セットを作っておきます。

プリントアウトできる環境によるかもしれませんが可能ならカラーのほうが10種類が色分けされているので見やすいです。さらに可能ならカードになるような硬めの紙にプリントアウトしたほうが繰り返し使いやすいと思います。

## 場の設定

進め方にもよりますが十数分から数十分かかりますので会議室などに集まり1人ずつ席について行うのが良いでしょう。

## テーマの確認

会社に対するモチベーションなのか、プロジェクトに対するモチベーションなのかなど、テーマによってモチベーションは変わるのでまずはテーマを共有しメンバー全員で認識を合わせます。

## カードの並び替え

全員にカードを配り、10種類のカードの並び替えを行います。モチベーションが上がるキーワードを上に、上がらないキーワードは下にずらすなど、モチベーションを動かされるキーワードの順番を決めます。

## 共有

並び替えたキーワードの順番を一人ずつ発表します。また、なぜその順番に並べたのかの理由も説明します。ここでコミュニケーションをとることで、人によってキーワードの捉え方の違いなどがあっても補うことができます。

# おわりに

## 所感

今回はチームで毎月行っている振り返りの冒頭で実施してみました。メンバーが何にモチベーションを感じているのかを改めて知れたり、自分との価値観の違いを感じたりなど色々気づきがあります。また、チーム全体でどのカードが一番多く選ばれたかを集計するとチームのモチベーションとしての向き先も分かります。ちなみに我がチームは「受容」が最も多く選ばれました。周囲に受け入れられたいという思いが強いんでしょうかね…

チームの振り返りはプロジェクトとは違ってメンバーが共通のゴールや成果物を意識できている場合ばかりでもないのでアジャイルレトロスペクティブズにある「場を設定する」ための手法としても使えるのではないかと感じました。ただ振り返りの中で実施する場合、振り返り本編の時間を削ることになるので時間のかけかたは注意が必要かもしれません。

## まとめ

簡単に実行できて、ゲーム感覚でモチベーションを可視化する手法として有用です。
定期的に実施すればチームのモチベーションがどのように変化していくかをモニタリングすることもできそうです。
チーム全体で実施する場合それなりに時間がかかるため、はじめに目安の時間（カードを選ぶ時間や選んだ結果を１人が共有する時間など）を決めて実施するほうが良いかもしれません。

カードの選び方、共有のしかたは、以下のように場や目的に応じてアレンジしてみるのも良さそうです。

- TOP3を共有
- 上位と下位を共有
- 前回からの変化を共有（定期的に実施する場合）

もちろんムービングモチベーターズ自体が答えを示してくれるわけではないので、使い方はアジャイルコーチやチーム次第です。

# 参考

[Management 3.0 Practice: Moving Motivators](https://management30.com/practice/moving-motivators/)
[ムービングモチベーターズ、モチベーションポーカー](http://nuworks.jp/ja/2016/10/26/moving-motivators/)
Visual Studio 2015 Express | C++でWindowsフォームアプリが作成できない

Visual Studio 2015 ExpressでC++/CLIのWindowsフォームアプリを作ろうとしたところ、Windowsフォームが無く、追加できずに途方に暮れてしまいました。

# 手順

1. メニューの[ファイル]-[新しいプロジェクト]から、テンプレートの[Visual C++]-[CLR]-[空のCLRプロジェクト]を選択しOKボタンを押し、プロジェクトを作成する。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/52118/53e80de5-bd04-74c5-c7e0-0eeab50f0fc3.png)

2. ソリューションエクスプローラーのプロジェクト名の上で右クリックし、[追加]-[新しい項目]を選択する。
![3-1.png](https://qiita-image-store.s3.amazonaws.com/0/52118/263f082b-f9bc-3adb-22b3-19feaafe8c09.png)

3. しかし「項目が見つかりませんでした。」
これでは何もできません。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/52118/c81ea4a9-b7c0-80b1-fb81-ba7eb8fd22a0.png)


# 解決方法

1. 「C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\VCProjectItems_WDExpress」を
「C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\VCProjectItems」にリネームする。
![4-1.png](https://qiita-image-store.s3.amazonaws.com/0/52118/838fc205-f662-9bb2-679d-4b18670e19fb.png)

2. Visual Studioを再起動すると「新しい項目の追加」にWindowsフォームが出現しました。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/52118/5b3b36ea-a850-71d7-9a6f-cbf027f24e00.png)


# 別解

レジストリの変更でもOKです。
![6.png](https://qiita-image-store.s3.amazonaws.com/0/52118/760db659-9e17-2605-e24b-c8724f9fb540.png)

HKEY_CURRENT_USER\Software\Microsoft\WDExpress\14.0_Config\Projects\{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC943}\AddItemTemplates\TemplateDirs\{F1C25864-3097-11D2-A5C5-00C04F7968B4}\/1
の「TemplatesDir」を、
「C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\VCProjectItems」から
「C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\VCProjectItems_WDExpress」に変更する。
GitHubのマージ可否を制御するChrome拡張機能を作った

# Merge controller for GitHub
https://chrome.google.com/webstore/detail/merge-controller-for-gith/dpabcemleonipmahlbcapbdoijdpimni

<img width="640" alt="screenshot2.png" src="https://qiita-image-store.s3.amazonaws.com/0/51916/acd19159-5a57-53d3-5cb5-649df088449f.png">

## 何ができるの？

Pull Requestのタイトルに含まれる文字や、リポジトリ・ブランチ名でマージボタンを非活性にできます
`タイトルにWIPを含む場合はマージさせない`
`タイトルにReleaseを含む場合にのみマージさせる`
`masterブランチのマージはstagingブランチからしか許可しない`
のようなルールを自由に設定可能です。

<img width="640" alt="スクリーンショット 2017-04-29 16.30.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/51916/97a6e7f0-1d34-c3af-c593-491066c3e5a2.png">

## 作った経緯

開発用ブランチへPull Request作成後にすぐマージしているクセで、WIP Pull Requestも作成後に誤ってマージすることがあったので、これを防ぎたかった。
同様の機能を持つChrome拡張機能は既にあったが、現場がGitHub Enterpriseを使っておりGitHubドメインと違うのでそもそも対応してない。
公開ソースをゴニョゴニョして使うという手もあったけど、Chromeウェブストアに公開せずにデベロッパーモードとして使うことになり、Chrome起動時に毎回警告が出るので嫌
Chrome拡張機能がJavaScriptで作れるとのことで、ならば自分でも作れるのではと思って作ってみました。

## ソース

こちらへ公開してます。
https://github.com/casmb200/merge-controller-for-github
（英語はGoogle翻訳頼りなんで、かなり怪しめ）

## どうやって開発するの？

Content Scriptで最低限の構成ならば、 `manifest.json` と ページ表示時に実行されるJavaScriptファイル1つだけでOKです。
`manifest.json` へはアプリ情報・権限設定・実行するスクリプトなどを定義します。JavaScriptファイルは普段ウェブページを作成する時に用意するものと同じように作るだけです。
今回作ったプログラムでは、オプション画面用のHTML/JS/CSS、アイコン画像、多言語対応用のlocaleファイルを加えてます。

## 監視方法

マージ可否判定について、画面ロード時の判定のみだと、 `タイトル修正時` や `Pull RequestのReOpen時` に判定できないので、 `MutationObserver` を使ったDOM監視をしています。

MutationObserver
https://developer.mozilla.org/ja/docs/Web/API/MutationObserver

```
var observer = new MutationObserver(function(mutations) {
               　　　　mutations.forEach(function(mutation) {
              　　 　　　　　　// マージ可否判定
              　　　　　　　　 control_merge();
              　　　　　　});
               })；

// 対象の子ノードを監視する設定
var config = { childList: true };

// 対象のDOM監視開始
observer.observe($('.js-discussion')[0], config);
```

configの部分を `attributes: true` にすると対象の属性を監視、 `childList: true,  subtree: true` にすると対象の子ノード及び孫ノードを監視することができます。

今回作ったプログラムでは、タイムラインの箇所とマージボタンの箇所を監視・変更があればマージ可否判定するようにしています。

## アプリの公開

[デベロッパーダッシュボード](https://chrome.google.com/webstore/developer/dashboard?hl=ja)より$5でデベロッパー登録、圧縮したファイルをアップロードすれば公開できます。
海外で使ってもらう為、説明文やスクリーンショットを言語ごとに設定することも可能です。
限定公開にしておけば、URLを教えた人にのみ公開することも可能です。

## Chrome拡張機能開発のすすめ

前述の通り、Chrome拡張機能はJavaScriptで作ることができ、デベロッパーモードで使うだけならばかなり敷居は低いかと思います。
DOM操作もできますし、テスト用に使うツールなどのオレオレツールを作るには最適なんじゃないかと思いました。
iptablesによる帯域制限の上限に関して


---
##### 
iptableでパケットの帯域制限を行う場合、
下記のようにhashlimitで指定しますが
ここに10,000/sec以上の値を設定しても効きない理由を調べてみました。

```text
iptables -A INPUT -j ACCEPT -m hashlimit --hashlimit 1000/sec --hashlimit-burst 1000 --hashlimit-name limit-in
iptables -A INPUT -j REJECT
```

#####
下記のようにlibxt_hashlimit.cでXT_HASHLIMIT_SCALEを超えるとエラーするようになっていて
XT_HASHLIMIT_SCALEが10,000で設定されておりました。

```text:libxt_hashlimit.c
static
int parse_rate(const char *rate, u_int32_t *val)
{
　　　　　**略**　　　
	/* This would get mapped to infinite (1/day is minimum they
           can specify, so we're ok at that end). */
	if (r / mult > XT_HASHLIMIT_SCALE)
		exit_error(PARAMETER_PROBLEM, "Rate too fast `%s'\n", rate);

	*val = XT_HASHLIMIT_SCALE * mult / r;
	return 1;
}
```
```text:xt_hashlimit.h
/* timings are in milliseconds. */
#define XT_HASHLIMIT_SCALE 10000
/* 1/10,000 sec period => max of 10,000/sec.  Min rate is then 429490
seconds, or one every 59 hours. */
```
#####
ですので、iptableによる帯域制限は114Mbpsが上限となってしまうようです。
```
10,000pps * MTU(1500) * 8(bit) ≒ 114Mbps
```
concourse用のbash completionを作成してflyコマンドを楽に使う


# concourse用のbash completionを作成してflyコマンドを楽に使う

## 背景

Cloud Foundryでも使われている、CI/CDツールのconcourse用の`fly`コマンドのサブコマンドを覚えるのが面倒で、日常的に色々なコマンドを使い分ける必要があったので、なんとか解決できないかと調べてみました。

## 参考にした流れ

1. flyコマンドのcompletion的なキーワードで検索
    flyコマンドbash completion的なキーワードで検索してみると、公式のissueを発見
    それによると、既にflyコマンドはgo言語で書かれているが、使用しているライブラリで対応出来てるはずとのこと。
     https://github.com/concourse/fly/issues/111  

2. cfコマンドのbash completionの情報
    flyコマンドと同様にgo言語で書かれている、Cloud FoundryのCLIのcfコマンドも比較的最近bash completionに対応というのがReleaseノートにあった。
    https://github.com/cloudfoundry/cli/releases/tag/v6.25.0



## 作成

1. completionのファイル格納場所を確認

    まずは今回はMacにbash completionを入れた環境だったので
     どのディレクトリにcompletion用ファイルをセットするのか確認した。

    ```
    morika-t@Takeshi-no-MacBook-Pro:~$ cat ~/.bash_profile

    [ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion

    ```

1. cfのcompletionファイルの確認
    https://github.com/cloudfoundry/cli/blob/master/ci/installers/completion/cf
    cfコマンド用のcompletion

    ```
    # bash completion for Cloud Foundry CLI

    _cf-cli() {
        # All arguments except the first one
        args=("${COMP_WORDS[@]:1:$COMP_CWORD}")
        # Only split on newlines
        local IFS=$'\n'
        # Call completion (note that the first element of COMP_WORDS is
        # the executable itself)
        COMPREPLY=($(GO_FLAGS_COMPLETION=1 ${COMP_WORDS[0]} "${args[@]}"))
        return 0
    }
    complete -F _cf-cli cf
    ```

1. flyコマンド用に作成

    ```
    $ vi /usr/local/etc/bash_completion.d/fly
    # bash completion for Concourse CLI

    _fly-cli() {
        # All arguments except the first one
        args=("${COMP_WORDS[@]:1:$COMP_CWORD}")
        # Only split on newlines
        local IFS=$'\n'
        # Call completion (note that the first element of COMP_WORDS is
        # the executable itself)
        COMPREPLY=($(GO_FLAGS_COMPLETION=1 ${COMP_WORDS[0]} "${args[@]}"))
        return 0
    }
    complete -F _fly-cli fly
    ```

## 動作確認

ファイルを格納後ターミナルを開き直すなどでcompletionファイルを再読込すると`fly`コマンドのあとTABキーを押すとこのように動作

```
$ fly
abort-build        checklist          destroy-team       get-pipeline       hijack             pause-job          pipelines          set-pipeline       targets            unpause-job        validate-pipeline  workers
builds             containers         execute            help               login              pause-pipeline     prune-worker       set-team           teams              unpause-pipeline   volumes
check-resource     destroy-pipeline   expose-pipeline    hide-pipeline      logout             pause-resource     rename-pipeline    sync               trigger-job        unpause-resource   watch
```

これでflyコマンドをコンソール画面で使い倒せるようになります。
英語環境でセットアップしてしまったUbuntuで日本語を使えるようにする

その昔、インストーラーが日本語に対応していなかった頃のクセと余計なパッケージをインストールしたくないという気持ちがあって、今でもセットアップ言語は英語（en_US.UTF-8）で行なってしまう事が多々あります。

そんな英語環境でセットアップしてしまった環境で日本語が使えるまでのメモです。今回実際に作業を行ったのはLubuntu16.04です。

## パッケージのインストール
まずは必要なパッケージをインストールします。Ubuntuの場合は`check-language-support`コマンドを使えば必要なパッケージを取得できますので一気にインストールが可能です。※Ubuntu12の時でもこのコマンドは使えたように記憶しています。

`check-language-support`コマンドのヘルプには以下のように書かれています。

> returns the list of missing packages in order to provide a complete language environment

これをgoogleで翻訳してみると「完全な言語環境を提供するために、欠落しているパッケージのリストを返します」とのことです。

### check-language-supportを試してみる
`check-language-support`コマンドを実行するとどのような結果が得られるのか見てみたいと思います。

以下が実行した時の結果です。必要であろうパッケージが表示されているのが分かります。よく見ると英語のスペルチェックぽいものも含まれています。他の言語も含めて大量に表示されると思ったのですが日本語以外のものは含まれていないようです。

```console:check-language-supportを実行
$ check-language-support
fcitx-frontend-gtk3 fcitx-frontend-qt4 fcitx-frontend-qt5
 fcitx-mozc firefox-locale-ja fonts-takao-gothic
 fonts-takao-mincho hunspell-en-au hunspell-en-ca
 hunspell-en-gb hunspell-en-za language-pack-gnome-ja
 language-pack-ja
```

オプションなしでも日本語以外の言語は含まれていないようですが`-l`オプションを指定する事でより確実に日本語に限定することができます。`-l`オプションを指定した結果は以下のようになります。

```console:-lでja(日本語)を指定して実行
$ check-language-support -l ja
fcitx-frontend-gtk3 fcitx-frontend-qt4 fcitx-frontend-qt5
 fcitx-mozc firefox-locale-ja fonts-takao-gothic
 fonts-takao-mincho language-pack-gnome-ja
 language-pack-ja
```

### インストール
`check-language-support`コマンドの結果を利用してパッケージをインストールします。

```console:
$ sudo apt-get update #念のため
$ sudo apt-get install $(check-language-support -l ja)
```

これで日本語に必要なパッケージはインストールされました。

## IMEの変更
IMEを変更します。`check-language-support`コマンドを実行した際にfcitx-mozcが含まれていた事を確認していますのでfcitx-mozcを有効にしたいと思います。

まず`im-config`コマンドを使ってセットアップされているIMEを表示します。※GUIから行う場合は Preferences → Language Supportを開きKeyboard input method systemからfcitxを選びます。

```console:IMEの一覧
$ im-config -l
 fcitx xim
```

fcitxに変更します。

```console:fcitxに変更
$ im-config -n fcitx
```

`sudo reboot`でリブートするか`sudo pkill X`でウィンドウシステムを再起動します。

これで完了！…と思ったらそうにはならないようです。mozcを有効にして変換キーに「半角/全角」キーを割り当てる必要があるようです。

どこかの画面で設定をするんだと思うんですが設定ファイルを強引に変更して対応したいと思います。※ちなみにどこかの画面はPreferences → Fcitx Configurationにあります。設定ファイルを強引に変更するよりもこちらから行う事をオススメいたします。

以下のコマンドはfcitxを終了させて設定ファイルを変更するものです。リスクも高いので本当にオススメしません。それでも書いているのは私がコピー＆ペーストで設定を完了させたいのと、設定ファイルどこだっけなーと探すときの手がかりのためです。

```console:設定ファイルを強引に変更（オススメしません）
$ pkill fcitx
$ sed -i "s/mozc:False/mozc:True/" .config/fcitx/profile #mozcを追加にする。
$ sed -i "s/^#TriggerKey=.*/TriggerKey=ZENKAKUHANKAKU/" .config/fcitx/config #変換キーを半角/全角キーに変更
$ sudo pkill X
```

これで半角/全角キーでmozcが起動し日本語が入力できるようになった事を確認します。
Mac (10.9〜10.12) で QGIS 2.18 (GRASS 7.2 と SAGA 4も) をインストール (Fink)

#1. XCode のインストール

`$ xcode-select --install`

XCode ライセンスを承諾する必要があります。これは、

`$ sudo xcodebuild -license`

と入力し、

`agree`

と入力します。

#2. Fink のインストール

[Install Fink](https://raw.githubusercontent.com/fink/scripts/master/srcinstaller/Install%20Fink.tool)

を開き、テキストとしてデスクトップに保存します。

その後、ターミナルを開き、以下のコマンドを入力します。

`$ cd Desktop` 書類フォルダに保存した場合は、 `$ cd Documents`

`$ chmod +x Install\ Fink.tool.txt`

`$ ./Install\ Fink.tool.txt`

いくつか質問されますが、だたいリターンキーを押すだけでも大丈夫です。

JDK と X11 のインストール方法が途中で示されます。「詳しい情報...」をクリックしてインストールしてください。その後、ターミナルに戻って、再び


`$ ./Install\ Fink.tool.txt`

とします。
	
#3. QGIS のインストール

ターミナルで、

`$ fink install qgis218-py27`

と入力します。

なお、将来的に Python 3 系に対応するため、 Python のバージョンを明示する仕様としています。

GDAL2 や GEOS、PROJなど必要なライブラリも全てインストールします。このため、時間がかなりかかります。

GRASS 7.2 もインストールされます。

SAGA は、qgis218-py27からは自動的にはインストールされません。Processing からSAGAを使いたい場合は、

`$ fink install saga`

とします。

#4. QGIS の起動

QGIS は、アプリケーションフォルダ内の Fink というフォルダにインストールされています。

<img width="1440" alt="qgis-1.png" src="https://qiita-image-store.s3.amazonaws.com/0/118479/a5ebcd35-43e6-9204-e349-e361db43f787.png">

<img width="1440" alt="qgis-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/118479/bc2d425a-4fa4-21cf-6db6-3a1b2b3b6ff1.png">


#5. バッファの作成 3種類

QGIS の Vector > Geoprocessing Tools > Fixed distance buffer

<img width="1440" alt="qgis-2-1.png" src="https://qiita-image-store.s3.amazonaws.com/0/118479/28ca5762-a4c0-5cdc-0a77-ac0d5aae5214.png">


GRASS GIS 7 commands から v.buffer.distance

<img width="1440" alt="qgis-2-2.png" src="https://qiita-image-store.s3.amazonaws.com/0/118479/56642d40-bed8-d2af-621f-9d8207840a90.png">


SAGA から Fixed distance buffer 

<img width="1440" alt="qgis-2-4.png" src="https://qiita-image-store.s3.amazonaws.com/0/118479/ecbf61ed-f766-c2a8-e2c2-05e19bc44206.png">

バッファ一つとっても３つの方法があるんですね（もっと？）。
catalina.outをcronologでローテートするときに正しくプロセスが停止できない場合の対処


---
###### 
catalina.outを下記のようにcronologでローテートするように設定し起動した後
shutdown.shを実行しても、tomcatが正しく停止しません。

```test:catalina.sh
org.apache.catalina.startup.Bootstrap “$@” start 2>&1 \
| /usr/local/sbin/cronolog “$CATALINA_BASE”/logs/catalina.out.%Y-%m-%d >> /dev/null &
```

###### 

どうも、Bootstrapの後にpipeでcronologに渡してしまった為、
cronologのプロセスIDがCATALINA_PIDファイルに入っているようです。

そこで、下記のようにBootstrapのプロセスIDをCATALINA_PIDファイルに入るように
編集したところ、正しく停止できるようになりました。

```test:catalina.sh
  if [ ! -z "$CATALINA_PID" ]; then
     $JAVA_HOME/bin/jps | grep "Bootstrap" | cut -d " " -f 1 > $CATALINA_PID
  fi
```
[コード不要] Unityで画面をぼかす方法

#Unityで画面をぼかす方法

Unityの_ImageEffect_という機能を使ってコード不要で画面をぼかす方法。
## Effectsのパッケージをインストール

Assets→Import Package→Effectsを選択します。

<img width="755" alt="スクリーンショット 2017-04-29 16.32.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/178874/190d418e-e9f7-052b-e1d6-912ef7374d54.png">

画像のような感じになるので、importをクリックします。

<img width="529" alt="スクリーンショット 2017-04-29 16.35.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/178874/398da147-fb46-afc0-8c8a-6308edde8eed.png">

ProjectにStandard Assetsが追加されるので、
Standard Assets→Effects→ImageEffects→Scripts内の*Blur*を、Main Cameraにドラッグ＆ドロップすれば完了です！


<img width="471" alt="スクリーンショット 2017-04-29 16.41.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/178874/776bd771-6572-0d8b-4ccc-84c6eab2a104.png">

これが
<img width="532" alt="スクリーンショット 2017-04-29 16.53.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/178874/5ec83a03-77a4-20cb-11fc-e1da5fee2efa.png">

こんな感じになるはずです！
<img width="531" alt="スクリーンショット 2017-04-29 16.53.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/178874/79576ce0-f022-4ae7-522e-104960581248.png">




以上、Unityにぼかしを入れる方法でした。
AWS Lambdaからマストドンに投稿する

# 準備
アクセストークンは[こちら](https://takahashim.github.io/mastodon-access-token/)から発行しました。

# コード

```
var request = require('request');

exports.handler = (event, context, callback) => {
    var headers = {
        "Authorization": "Bearer " + process.env.MASTODON_ACCESS
    }

    var url = "http://pawoo.net/api/v1/statuses";
    var body = 'テスト';
    var options = {
        url: url,
        method: 'POST',
        headers: headers,
        body: body
    }
    console.log('options:' + JSON.stringify(options));
    //リクエスト送信
    request(options, function (error, response, body) {
        console.log('res:' + body);
    });
    callback(null);
};
```
エラーハンドリングはちゃんとやりましょう。
環境変数にアクセストークンを入れてくださいね。
インスタンスのドメインも適宜変えてくださいね。
ubuntu入りのXiaomi Mi Notebook Air 13でbumblebeeを動かす

# 既存のドライバがあるなら削除
`sudo apt-get --purge remove nvidia-*`
`sudo apt-get --purge remove cuda-*`
#secure boot無効化<br>(Without this step we will not be able install efficient NVIDIA driver blob.)
UEFI設定（ロゴでF2押下）
supervisor passwordを設定
secure boot -> disable
(passwordを空に戻してもsecure bootの設定は継続されるっぽいけどその後の正確な挙動はわからない)
F10 -> YES
#add repository, install NVIDIA driver
`sudo add-apt-repository ppa:graphics-drivers/ppa`
`sudo apt-get update`
`sudo apt dist-upgrade`
`sudo apt install  nvidia-370` (or 367)
#不足のintel video firmwareをinstall
`cd /tmp/`
`wget http://git.kernel.org/cgit/linux/kernel/git/firmware/linux-firmware.git/tree/i915/skl_guc_ver6_1.bin`
`wget http://git.kernel.org/cgit/linux/kernel/git/firmware/linux-firmware.git/tree/i915/kbl_dmc_ver1_01.bin`

`sudo cp /tmp/kbl_dmc_ver1_01.bin /lib/firmware/i915/kbl_dmc_ver1.bin`
`sudo cp /tmp/skl_guc_ver6_1.bin /lib/firmware/i915/skl_guc_ver6.bin`
`sudo  update-initramfs -k $(uname -r) -u`
#install bumblebee
`sudo apt install bumblebee`
`sudo apt update`
/etc/bumblebee/bumblebee.conf を編集
`KernelDriver=nvidia`になっていることを確認
`nvidia-current`をすべて`nvidia-370`(インストールしたversion)に置き換え
#install mesa-util
`sudo apt install mesa-util`

#reboot
エラってもエラってなくてもとりあえず`reboot`
#TEST by glxgears
<b>OnBoard Rendering</b>
`glxgears -info`
<b>Check</b> `GL_RENDERER = Mesa DRI Intel(R) HD Graphics 520`
<b>Geforce940MX Rendering</b>
`primusrun glxgears -info`
<b>Check</b> `GL_RENDERER = Geforce 940MX...`

上記通り、`primusrun <app>`、或は`optirun <app>`を使うことでGeforce利用でアプリを起動します。
どうもprimusrunの方が消費電力やframe rate固定等色々優れているというか、optirunがlegacyなのかも。
たしかにprimusrunがFPSを59~60に貼り付けていたのに対して、optirunはFPSがコンスタントに300以上出していた。
Vuexの構造を超簡単にnamespace(名前空間)分割する

@nekobato さんの[構造の複雑さとVuex書き分け](http://qiita.com/nekobato/items/44a7027504a2c65ce664)という記事の中で複雑化したVuex構造を名前空間によって分割する手法が紹介されていましたが、名前空間分割にVuex公式が[神対応](https://github.com/vuejs/vuex/releases/tag/v2.1.0)してたため記事に起こしました。

# TL;DR
Vuex 2.1より、Storeをモジュール分割する際に`namespaced: true`というオプションを追加することで、自動的に名前空間を付与することが出来るようになりました。
これによりtype.jsファイル等の名前空間手動管理地獄から開放されます！

[※公式リファレンス](https://vuex.vuejs.org/en/modules.html#namespacing)

# 名前空間の分割 (Vuex 2.1以前) 

<details><summary>(もう使わないと思うので折りたたみました)</summary><div>

([構造の複雑さとVuex書き分け](http://qiita.com/nekobato/items/44a7027504a2c65ce664)より抜粋)
モジュールごとにnamespaceプレフィックスを作成し、type.jsファイルで管理する手法です。

```js:modules/hello/type.js
const namespace = 'hello/'
export const HELLO  = namespace + 'HELLO'
export const SAY_HELLO   = namespace + 'SAY_HELLO'
export const TOGGLE_DONE = namespace + 'TOGGLE_DONE'
```

```js:modules/hello/index.js
import * as types from './types'

export default helloModule = {
  state: {
    hello: false,
  },
  getters: {
    [types.HELLO] (state) {
      return state.hello
    }
  },
  actions: {
    [types.SAY_HELLO] (context, payload) {
      api.sayHello()
        .then((data) => {})
        .catch((err) => {})
    }
  },
  mutations: {
    [types.HELLO] (state, payload) {
      state.hello = true
    }
  }
}
```
名前空間を分割することでより安全にアプリを成長させていけるようになりますが、typeの管理が辛いです…
react+reduxの(おお神よ…我らをビジネスロジックに集中させ給え…)感が再来していますね。
加えて、人によってはメソッド名がなんかキモいと感じるかもしれません。
</div></details>


# 名前空間の分割 (Vuex 2.1以降)

`namespaced`というオプションを追加するだけでよくなりました！！！
このオプションを付けることで、`state`, `getters`, `actions`, `mutations`には自動的に自分が属しているmodule名(この場合`helloModule`)と同名のnamespaceが付与されます。

```js:modules/hello/index.js
// import * as types from './types' // 消滅

export default helloModule = {
  namespaced: true, // 追加
  state: {
    hello: false,
  },
  getters: {
    // 素直なメソッド名
    hello(state) {
      return state.hello
    }
  },
  actions: {
    // 素直なメソッド名
    sayHello(context, payload) {
      api.sayHello()
        .then((data) => {})
        .catch((err) => {})
    }
  },
  mutations: {
    // 素直なメソッド名
    hello(state, payload) {
      state.hello = true
    }
  }
}
```

呼び出すときは「mapState/mapActionsに引数で名前空間を渡す」「名前空間を明示的に指定する」のどちらのパターンでもOKです。
追記: mapStateの書き方は[Vuex：mapStateの書き方8パターン+11サンプルコード](https://qiita.com/suin/items/7331905a45a8ff80d4dd)で詳しく扱われていたので、そちらも参考にしてみて下さい。Stateに限らずmapXxx系全般で使用できる知識です。


### 呼び出し側: 引数で名前空間を渡すパターン

```js
computed: {
  ...mapState('helloModule', // ←名前空間を引数に渡す
    // ここのstateはルートのstateではなく、自動的に名前空間が認識されてhelloModule/stateになっている
    {  
      hello: state => state.hello
    }
  }
},
methods: {
  ...mapActions('helloModule', // ←名前空間を引数に渡す
    // this.sayHello() を this.$store.dispatch('helloModule/sayHello')にマッピング
    ['sayHello']
  )
}
```

### 呼び出し側: 名前空間を明示的に指定するパターン

```js
computed: {
  ...mapState({
    hello: state => state.helloModule.hello // このstateはグローバル。名前空間を掘る。
  }
},
methods: {
  ...mapActions([
    // this.sayHello() を this.$store.dispatch('helloModule/sayHello')にマッピング
    'helloModule/sayHello'
  ])
}
```
Electron + React + Flow を1から試してみる

## やること

boilerplate等を使えば、簡単に使いやすくなっていますが、
結構色々なものが入っていて一つ一つの動きが理解しづらかったので、
一旦1から試してみる。

## 環境

MacOS 10.12
Node.js v7.4
npm 4.0.5
yarn 0.23.2

## Electron

まずはElectronのインストール。
グローバルインストールしたくない場合はプロジェクト内にインストールでもOKです。

```
npm install -g electron
```

```
mkdir project
cd project
npm init
```

```json:package.json
"main": "app.js",
"scripts": {
    "start": "electron ."
},
```

一部抜粋。mainスクリプトがapp.js(好きな名前でOK)、scripts.start を ```electron .``` に設定する。
これで ``` npm start ``` で ```electron .``` が走るようになります。

```
$ npm install --save electron
```

electronモジュールを入れます。saveオプションでpackage.jsonに記録します。

mainスクリプトであるapp.jsを作ります。

```js:app.js
const electron = require('electron')
const app = electron.app
const BrowserWindow = electron.BrowserWindow

let mainWindow

function createWindow() {
  mainWindow = new BrowserWindow({width: 800, height: 1000})

  mainWindow.on('closed', () => {
    mainWindow = null
  })
}

app.on('ready', createWindow)

app.on('activate', () => {
  if (mainWindow == null) {
    createWindow()
  }
})
```

```
$ npm start
```

これで空ページが出ればElectronの起動はOKです。

## React


React導入に必要なモジュールを入れます。
React本体とコンパイルに必要なWebpackとbabelです。

```
$ yarn add react react-dom babel-core
$ yarn add babel-loader babel-preset-react webpack -D
```

ビルド用のwebpackの設定ファイルを作ります。

```js:webpack.config.js
module.exports = {
  entry: './app/src/index.js',
  output: {
    filename: 'renderer.js',
    path: __dirname + '/app/dist'
  },
  devtool: 'source-map',
  resolve: {
    extensions: ['.jsx', '.js']
  },
  module: {
    rules: [
      {
        test: /\.jsx?$/,
        exclude: /node_modules/,
        loader: 'babel-loader'
      }
    ]
  }
}

```

output.pathは相対パスが使えないので注意が必要です。
__dirnameでルートディレクトリが取れます。


```js:package.json
"scripts": {
  "build": "./node_modules/webpack/bin/webpack.js --config ./webpack.config.js",
 }
```

buildコマンドを作ります。yarnで入れたwebpackを設定ファイル指定で叩きます。 ```npm run build``` でビルドできます。

シンプルなReactを使ったファイルを作ってビルドします。

```js:index.js
import React from 'react'
import { render } from 'react-dom'

const Test = () => <div>test</div>


render(
  <Test />,
  document.getElementById('root')
)
```

```
$ npm run build
```

これでdist/renderer.jsにビルド結果が出力されます。
Reactの導入はこれで完了です。

## flow

次にflowを入れます。

flowコマンドを使えるようにします

```
$ brew install flow
$ npm -g install flow-typed
$ yarn add flow-bin flow-typed -D
```

flowコマンドと型定義を取得するflow-typedコマンドを入れ、
devDependenciesにflow-bin, flow-typedを入れます。


```
$ flow init
```

.flowconfigファイルができます。

```:.flowconfig
[ignore]
.*/node_modules/.*
[include]

[libs]

[options]
```

node_modules以下はチェックする必要ないのでignoreに入れます。
処理時間が変わってきます。

```
$ flow-typed install
```

導入しているモジュールの型定義が取得できます。

```js
// @flow
```

jsファイルの先頭に```@flow```のコメントがあることがflowの検査対象設定となります。

```js
let num: number;
num = "a"
```

例えばこう書いて ```flow``` コマンドを実行すると

```
app/src/index.js:8
  8: num = "a"
           ^^^ string. This type is incompatible with
  7: let num: number;
              ^^^^^^ number
```

こうやって指摘してくれるようになります。

## まとめ

とりあえず何が必要なのかは理解できたのかなと思います。
環境構築で困るケースもあるかと思うので、どなたかの理解の手助けになればと思います。
proftpdのログをローテートする



#### 名前付きパイプを作成
---
```text
mknod  /var/log/xferlog.fifo p
chmod 666 /var/log/xferlog.fifo
```

#### proftpの設定
---
```text:名前付きパイプを指定
#TransferLog                     /var/log/xferlog
TransferLog                     /var/log/xferlog.fifo
```

#### fifo-cronologのコンパイル
---
```text:コンパイルしてできた実行ファイルを適当なディレクトリにコピー
tar jxvf fifo-cronolog-1.1.1.tar.bz2
cd fifo-cronolog-1.1.1
make
cp fifo-cronolog /usr/local/sbin/
```
#### fifo-cronologの起動
---
###### proftpdにより書かれた/var/log/xferlog.fifoが/var/log/xferlog.%Y%m%dにローテールされるようになります。
---
```text:
fifo-cronolog /var/run/fifo-cronolog.pid /var/log/xferlog.fifo /var/log/xferlog.%Y%m%d
```
WebPackのLoaderがよくわからんので一部分調べてみた


[WebPack](https://webpack.js.org/)といえばウェブのフロントエンド開発で活用する変換ツールのことです。知っている人はもちろん知っていると思います。[Loader](https://webpack.js.org/loaders/)というのがたくさんあって複数のLoaderを組み合わせて利用できるので、WebPackはフロントエンド開発ではほぼ必須となります。

urlとstyleとcssとfileとそれぞれのLoaderの役割をざっくりと知りたい。ということでいくつか気になったものを調べて見ました。

| Loader | 説明 |
|--------|--------|
| raw-loader | テキストファイルをそのままプログラム内で利用できるようにする |
| file-loader | ファイルにハッシュ値を付与する |
| url-loader | 画像ファイルをデータURLスキームに変換する |
| css-loader | @importとurl()を解決してCSSをプログラム内で利用できるようにする |
| style-loader | \<style\>タグをCSSに付与しDOMに追加 |

詳しくは説明しませんので、あとはご自身でお調べください。

## 参考

[https://webpack.js.org/loaders/](https://webpack.js.org/loaders/)
HLS で、playlist から削除したセグメントをどれくらいの期間残すべきかを公式から和訳した

### Apple のドキュメント
https://tools.ietf.org/html/draft-pantos-http-live-streaming-22#section-6.2.2

```
   When the server removes a Media Segment URI from the Playlist, the
   corresponding Media Segment MUST remain available to clients for a
   period of time equal to the duration of the segment plus the duration
   of the longest Playlist file distributed by the server containing
   that segment.  Removing a Media Segment earlier than that can
   interrupt in-progress playback.
```

↓↓↓和訳↓↓↓

```
セグメントの URI を playlist から削除した場合、該当するセグメントは、そのセグメントの duration + 
そのセグメントを含んでいた playlist のうち最長の duration 分は、クライアントが利用できるように残しておく必要がある。
それより早く削除してしまうと、視聴するセグメントの順番が割り込んでしまうかもしれない。
```
Bluemix へ war を push して cdi での注入ができなかった時のメモ


---
## 事象

war ファイルを作成して Bluemix へ push してアプリケーションを起動させると、@Inject しているオブジェクトがことごとく注入されず、 NullPoineterException によって全く動かない状況。

## 特記事項

CDI 1.2 を利用し、注入するオブジェクトには注釈でスコープ指定をしていた。
実行環境ごとに応じた実装を注入する必要があったので、beans.xml を用意し alternatives を記述し、war のパッケージングで差し替えていた。
beans.xml の bean-discovery-mode は推奨値の "annotated" を指定。

      
## 原因

war のパッケージングで beans.xml の配置場所が間違っていた。

誤: war ルート/META-INF/beans.xml 
正; war ルート/WEB-INF/classes/META-INF/beans.xml

これですんなり稼働した。

## 反省

以後気をつけます！