OmniAICreator/Qiita-1.07M huggingface dataset:
PythonでFizz Buzz書いてみた

# PythonでFizz Buzz書いてみた
静的言語ばかりやってきたが、機械学習とかやりたいので、Pythonの勉強を始めることにした。
これまでやってきたGo、Java、TypeScriptとはなかなか違うところが多くてカルチャーショックを受けている...
とは言え、新しい言語を学ぶのは心が躍るものだ。
とりあえず、基礎の基礎ということで、Fizz Buzzを書いてみた。

## ルール
1~100までの数字で、
3で割り切れれば、「Fizz!」を表示する
5で割り切れれば、「Buzz!」を表示する
3と5で割り切れれば、「Fizz Buzz!」を表示する
上記以外の場合は、そのままの数字を表示する

## いざコード

### Whileバージョン

```py3
i = 1
while i < 101:
    if i % 15 == 0:
        print("Fizz Buzz!")
    elif i % 3 == 0:
        print("Fizz!")
    elif i % 5 == 0:
        print("Buzz!")
    else:
        print(i)

    i += 1
```

### forバージョン

```py3
for i in range(1, 101):
    if i % 15 == 0:
        print("Fizz Buzz!")
    elif i % 3 == 0:
        print("Fizz!")
    elif i % 5 == 0:
        print("Buzz!")
    else:
        print(i)
```

## 実行結果

```
1
2
Fizz!
4
Buzz!
Fizz!
7
8
Fizz!
Buzz!
11
Fizz!
13
14
Fizz Buzz!
16
17
Fizz!
19
Buzz!
Fizz!
22
23
Fizz!
Buzz!
26
Fizz!
28
29
Fizz Buzz!
31
32
Fizz!
34
Buzz!
Fizz!
37
38
Fizz!
Buzz!
41
Fizz!
43
44
Fizz Buzz!
46
47
Fizz!
49
Buzz!
Fizz!
52
53
Fizz!
Buzz!
56
Fizz!
58
59
Fizz Buzz!
61
62
Fizz!
64
Buzz!
Fizz!
67
68
Fizz!
Buzz!
71
Fizz!
73
74
Fizz Buzz!
76
77
Fizz!
79
Buzz!
Fizz!
82
83
Fizz!
Buzz!
86
Fizz!
88
89
Fizz Buzz!
91
92
Fizz!
94
Buzz!
Fizz!
97
98
Fizz!
Buzz!
```

## 関連記事
[Go言語でFizzBuzz!を書いてみた - Qiita](http://qiita.com/Sekky0905/items/9a5a459e143303cd0a18)
[TypeScript(JavaScript)でアロー関数で即時関数でFizzBuzz! - Qiita](http://qiita.com/Sekky0905/items/e5523901205e7ccd20ef)

※ ブログでも同一の投稿を行っている
[PythonでFizz Buzz書いてみた - sekky0905’s blog](http://www.sekky0905.com/entry/2017/07/23/Python%E3%81%A7Fizz_Buzz%E6%9B%B8%E3%81%84%E3%81%A6%E3%81%BF%E3%81%9F)
webpackでbootstrapのcssやfontファイルを配置する

最近、「gulpとかのタスクランナーを使わなくてもwebpack単体でいろいろできるよ！」という声がよく聞こえてきます。
流行りに乗ってwebpackだけで環境構築しようとしたのですが、npmで落としてきたbootstrapのcssなどをプロジェクトに引っ張ってこようとしたら結構突っかかったのでまとめます。

# 今回やること
そもそもwebpackは複数のファイルをまとめて扱いやすくするものです。
そのため、cssやfontファイルなどもurl-loaderというモジュールを使うと、url化してjsファイルに組み込む、といったこともできます。
しかし、個人的にはbootstrapなどの外部モジュールは自作のjsファイルとは別にしておきたい。fontファイルなどもurl化せずに必要なものをプロジェクト内に配置するだけにしたい。

# 事前準備
まずは、必要なものをnpmを使ってインストールしていきます。

```
npm install webpack file-loader style-loader css-loader extract-text-webpack-plugin bootstrap
```

インストール後、webpack.config.jsを作成し、そこに設定情報を書き込んでいきます。

```js:webpack.config.js
const app = {
  entry:[
    __dirname + '/webroot/js/script.js'
  ],
  output: {
      path: __dirname + '/webroot/js/',
      filename: 'bundle.js'
  }
};

module.exports = app;
```

```js:script.js
import Bootstrap from 'bootstrap';
```

とりあえず、bootstrapのjsをimportするscript.jsを作ってwebpackを実行します。
npmの設定ファイル(package.json)のscriptにwebpack用のscriptを書いて実行します。

```json:package.json
{
…
  "scripts": {
    "build": "webpack"
  },
…
}
```
```
npm run build
```

これにより、bootstrapのjsファイルが取り込まれたbundle.jsが出力されます。
自前のscriptをscript.jsに書けば、それらと結合されて1つのjsファイルになるということです。

# cssと関連ファイルを出力する
```js:webpack.config.js
…
const ExtractTextPlugin = require('extract-text-webpack-plugin');
const bootstrap = {
  entry:[
    __dirname + '/node_modules/bootstrap/dist/css/bootstrap.css'
  ],
  output: {
      path: __dirname + '/webroot/css/',
      filename: 'bootstrap.css'
  },
  module: {
    loaders: [
      {
        test: /\.css$/,
        loader: ExtractTextPlugin.extract("css-loader")
      },
      {
        test: /\.(woff|woff2|eot|ttf|svg)$/,
        loader: 'file-loader?name=../font/[name].[ext]'
      }
    ]
  },
  plugins: [
    new ExtractTextPlugin( "../css/bootstrap.css" )
  ]
};

module.exports = [app, bootstrap];
```

webpack.config.jsは上述のようになります。
1つ1つ見ていくと、`entry`で対象のcssを指定して、ExtractTextPluginを使って指定した場所に出力します。最終的な出力場所は`output`で指定した場所ではなく、pluginsの`new ExtractTextPlugin`の引数として指定した場所になります(output自体はないとエラーになるので、書いておく必要があります)。
画像やfontの関連ファイルはfile-loaderを使用してそのままの形で出力します。このとき、fontフォルダ以下に出力したいのでname属性を使って出力場所を指定しています。
最後に、`module.exports`で対象をappとbootstrapの両方を実行するように配列で指定します。

# まとめ
これでcssとその関連ファイルをとってきて、プロジェクトの配下に移動してくることができました。この時、cssの内容を解釈して必要なファイルだけを対象にしたり、自動的にファイルの内容を出力場所に合わせて書き換えたりするので、自力で修正をしなくてもcssを使っていくことが可能です。
また、今回はcssをそのまま持ってきていますが、webpackにはlessやsassのloaderもあるのでそれらをコンパイルしてcssとして出力する、なんてことも可能です。

ただ、今のままだとwebpackを実行するたびにbootstrapの内容を毎回取得しに行くようになっています。外部モジュールだと頻繁に変更したりはないと思うので、普段はappだけを実行してbootstrapのほうは対象から除外したいということもあります。
そのあたりの設定は探したのですが、見つからず…。
整合性を合わせるために毎回bundle化したほうがいいということなのでしょうかね。
gulpだとそのあたりも結構自由度が効いたと思うので、そのあたりのカスタマイズが必要な時はgulpを使ったほうがいいかもしれません。
技術ブログを書きたかったらOSSのソースコードを読んだ方がいいのかなという話

###技術ブログを書きたかったらOSSのソースコードを読んだ方がいいのかなという話
表題の通りです。技術ブログを書きたかったら、オープンソースのソースコードを読んで、気がついたことをメモる感じで、記事にしていくと、いい記事書けるのかなと思い始めた。
もちろん、僕自身はいい記事が書けているとは思っていないし、（書きたいと思っているが）こういう方法もいいんじゃないかと思い始めた。
もしかしたら、Bog Bounty Programが実施されているオープンソースの方がいいかもしれない。脆弱性見つけたら、お金もらえて、名前乗っけてもらえる。
整理すると、オープンソースのソースコードを読んで記事を書くことによって

●ソースコードの読み方がわかってくる
●綺麗な設計を学ぶことができる
●技術ブログによって、ドヤ顔できる
●技術ブログによって、ジョブシグナリングになって、転職しやすくなる
●ソフトウェア設計の勉強になる
●脆弱性見つけたら、Bug Bounty Programによって、お金稼げて、技術ポートフォリオになる
●オープンソースに貢献できるかもしれない
●本買う必要がないので、お金がかからない
●githubに貢献ログが残る

もちろん、人によっていろんな方法があると思うし、人に自分のやり方を強制するつもりもない。
僕自身は脆弱性を見つけられていないが、こういう戦略で勉強するのも楽しいのかなと思う。
僕は、ソースコードを読むのは面白いと思い始めた。あんまり書いてあることがわからないけど、それでも面白いと思う。
眺めるところからかなと思う。
僕の場合、本読んでても技術ブログは書けない。それだけは言える。それは、勉強になってないということじゃないだろうか。ちょっと反感買うかもしれないけど。
Ansible で Oracle JDK8 をインストール


先日 (2017/05/22？) の [Oracle JDK8 ダウンロードサイト](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html) の変更で今までの自動化の方法でダウンロード出来なくなりました。

↓も **いつまで有効か分かりませんが**、5/22以降に動く版です。 (Amazon Linux, CentOS向け)


```yaml
---
- name: download JDK8
  get_url:
    url: http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm
    dest: /tmp/jdk-8u131-linux-x64.rpm
    mode: 0644
    validate_certs: no
    headers: "Cookie: oraclelicense=accept-securebackup-cookie"
- name: be sure JDK8 is installed
  yum:
    name: /tmp/jdk-8u131-linux-x64.rpm
    state: present
```

shellだとこう。

```shell-session
wget --no-cookies \
     --no-check-certificate \
     --header "Cookie: oraclelicense=accept-securebackup-cookie" \
     http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm
```

> jdk-8u131 以前のJDKは、上記の方法ではダウンロード出来ない様です。
GoogleAppScriptからFacebookに投稿

#環境
V2.10

#概要
GoogleAppScriptを使用して一定時間ごとにFacebookにメッセージを投稿します

#Facebookアプリの作成
https://developers.facebook.com/apps/

・「新しいアプリの追加」を押す
・「表示名」を入力する（例：TestGAS）
・「アプリIDを作成したください」を押す
・セキュリティチェックで文字を入力する

#アクセストークンの取得
https://developers.facebook.com/tools/explorer/

・「グラフAPIエクスプローラ」の右側の「アプリ」と表示されているドロップボックスを作成したアプリに変更する（例：TestGAS）
　最初は「GraphApiExplorer」と表示されているかもしれない
・「トークンを取得」を押す
・「ユーザーアクセストークンを取得」を押す
・「publish_actions」にチェックする
・「アクセストークンを取得」を押す
　「アクセストークン」に表示される　このアクセストークンは短期で１時間くらいしか有効じゃない

#長期アクセストークンの取得
https://developers.facebook.com/tools/explorer/

・「GET/V2.10/」の横に「oauth/access_token?grant_type=fb_exchange_token&client_id=AAA&client_secret=BBB&fb_exchange_token=XXX」と入力して、「送信」
　AAAはアプリID（ダッシュボードで確認）
　BBBはappsecret（ダッシュボードで確認）
　XXXは取得したアクセストークン
・返ってきた長期アクセストークンをメモる
　
#ユーザーIDの確認
https://developers.facebook.com/tools/explorer/

・「GET/V2.10/」の横に「me?fields=id,name」と入力して、「送信」

#投稿のテスト
https://developers.facebook.com/tools/explorer/

・「GET/V2.10/」の「GET」を「POST」に変更
・「me/feed?message=TestMessage」と入力して「送信」
　TestMessageが投稿される

#ブラウザからUrlで投稿
・ブラウザのURL入力欄で「https://graph.facebook.com/me/feed?method=POST&version=v2.10&message=TestMessage&access_token=XXX」と入力してリターン
　meの部分はユーザーIDでも可能
　XXXは取得した長期アクセストークン

#アクセストークンデバッガ
https://developers.facebook.com/tools/debug/accesstoken/

アクセストークンを入力すると有効期限等の情報が得られる

#GoogleAppScriptの作成
https://script.google.com/macros/d/

・下記のスクリプトをコピペして置き換える

#アクセストークン用スクリプトプロパティの作成
https://script.google.com/macros/d/

・「ファイル」>「プロジェクトのプロパティ」を押す
・「スプリプトのプロパティ」タブに変更する
・「行の追加」を押す
・「名前」にプロパティ名を入れる（例：accessToken）
・「名前」欄の右側を押すと「値」入力欄が出るので取得した長期アクセストークンを入力する
　PropertiesService.getScriptProperties().getProperty('accessToken')でアクセスできる

#一定時間毎に処理を行う
<a href=http://qiita.com/fukaken5050/items/bf5e2288d4485a179666>GoogleAppScriptを使用して一定時間毎にFirebaseにレコードを追加する</a>を参照する

#スクリプト

~~~c
function setTrigger()
{
  //十分毎に処理を実行
  var executeFuncName = "httpRequestFacebookPost";
  deleteTriggers( executeFuncName );
  ScriptApp.newTrigger( executeFuncName ).timeBased().everyMinutes( 10 ).create();
}

function deleteTriggers( executeFuncName )
{
  //登録されているトリガーを削除
  var triggers = ScriptApp.getProjectTriggers();
  for( var i = 0; i < triggers.length; i++ )
  {
    if ( triggers[ i ].getHandlerFunction() == executeFuncName )
      ScriptApp.deleteTrigger( triggers[ i ] );
  }
}

function httpRequestFacebookPost()
{
  var uri = "https://graph.facebook.com/me/feed?method=POST&version=v2.10";
  var message = "TestMessage4";
  var accessToken = PropertiesService.getScriptProperties().getProperty('accessToken');
  UrlFetchApp.fetch( uri + "&message=" + message + "&access_token=" + accessToken );
}
~~~
仕事で成功する人は○○する能力を必ず持っている

プログラミング学習サービスやら、ペットサロン予約サービス、風俗検索サービスなど色々とやっている「かずきち」です。
■運営サービス一部
http://crazy-wp.com/
http://webukatu.com/
新宿のホストから不動産・保険の営業を経て、HTMLって何？という状態から３ヶ月独学でプログラミングやデザインを学び、IT業界で１年間実務経験を積んで年収は１本超え。現在は起業家としてサービス運営やら不動産運営をしています。

##仕事で一番重要なもの、それは、、

みなさんは仕事で成功している人でしょうか？そうでない人でしょうか？

この記事を読んでいるということは、少なくとも成功していないと思っている人でしょう。

では、仕事で成功している人とはどんな人でしょうか？

何が違うのでしょうか？

 

フリーランスエンジニアとして仕事もしてきていて、自身で事業もやって稼いでいる私が成功する人と成功しない人の決定的な違いをご紹介したいと思います。

こういうとめちゃくちゃ怪しく聞こえますが、ものすごく当たり前でどの業界にも通じる真面目な話しなので、稼ぎたい！成功したい！と思っている人は、絶対にこのポイント、考え方は押さえてください。

 
##あなたが仕事で一番重要だと思うものは？

これを見ているあなたは、毎日仕事をしている社会人か、もしくは、学生の方がほとんどでしょう。

学生にはまだ分からない世界なので、仕事をしている方に問います。

 

あなたが思う、仕事で一番大事なもの。大事にしているもの。重要なもの。それはなんですか？
 

数分考えてみてください。

考えましたか？考えたら読み進めてくださいね。

 

では、答えを言います。

それは、  

 

`確認（カクニン）`  

   

です。

え？そんなこと？と思うでしょうか？

そう、そう思ってしまうほど単純なことですよね。普段考えもしないでしょう。

 

`そう、成功していない人にとってはね。`


##成功しない人はダイエットが出来ない人と同じ

成功している人、していない人は決定的に考え方が異なります。

 

```
考え方が異なれば、行動が異なり、

行動が異なれば、結果が異なります。
```

 

よく言われる話ですが、でもよく言われるということは、

 

`それしか、ない。`

 

ということです。

`成功しない人というのはダイエット出来ない人と同じ`です。

`通販で色々なダイエット器具買っては飽きる人と同じ`です。


`何かいい方法があるはず。もっと楽に痩せれる方法があるはず。`
 

と常に探しています。

そして、結局新たなものに飛びつき、またすぐ飽きて探すのです。

ダメな人の典型です。

ハッキリ言います。

 

`いい方法などありません。`

あるのは、シンプルなものだけです。

 

ダイエットであれば、ジムに行って毎日トレーニングすれば必ず痩せます。

ただそれだけ。それをやるかどうか。`「それだけしかない」`と思えるかどうかです。

##シンプルな仕事の流儀

仕事でも同じです。成功している人というのは、とてもシンプルに考えています。

`それしかない。`ということがわかっているのです。

そして、仕事で最も大事なことというのは、`「確認」`なのです。

 

ちなみに仕事というのはビジネスではなく、`「労働」`の方です。

仕事を作り出す側ではなく、作り出された仕事を請け負って実行する側の人たちに対しての話になります。

`ビジネスをする側、仕事を作り出す側で最も大事なものとは異なる`ので注意してください。

 
##なぜ確認は大事なのか？
では、なぜ確認が大事なのでしょうか？

 

それは、フリーランスなり仕事をする人というのは、常に`仕事を請け負う側`だからです。

仕事を請け負うということは、仕事を指示する側・発注する側、要は「お客さん」がいます。

フリーランスであれば、それは「客先」になり、会社員であれば、それは「上司」や「同僚」「部下」といった人になるでしょう。

会社員で上司なりに仕事を指示されるということは、`上司が客であり、その客から仕事を請け負っている`ということです。

 

お客さんから仕事を請け負うということは、

`客の意向に沿って仕事をしなければならない。`

ということですね？

それで金をもらうわけです。

もし、意向に沿わなければ普通は金なんてもらえません。

会社員は会社から金が出ますが、上司なり周りからの評価はどんどん落ちていくでしょう。

 

では、意向に沿うために何が重要なのか？

それが、

 

`確認`

 

なんです。

 
##１に確認、２に確認、３、４がなくて、５に確認
客は、どんな仕事をして欲しいのか？

分からなければ確認しなければいけませんね？

 

客が「こうして欲しい」と一回話しを聞いた後にどうしますか？

自分が考えている仕事内容と間違いがないか確認しますね？答え合わせをしますね？

（ダメな人は結構ここをやっていない）

 

仕事はいつまでに終わらせて欲しいのか？

確認しますね？

 

客も、途中で仕事内容を変更して欲しくなるかもしれません。

仕事を遂行していても、その途中、途中で確認しますね？

 

フリーランスエンジニアでいえば、まず「仕様」を確認しますね。

細かく言えば、エクセルで仕様が書かれていれば、そのエクセルが古いものでないかも確認しなければいけません。

もしかしたら、最新ではないかもしれません。

（実際にエクセル開きっぱなしで、古い最新ではない仕様を見て仕事をしているダメなエンジニアはいます）

 

仕様にちょっとでも疑問があれが確認しますね。

開発した後はバグがないかどうか、確認しますね。

細かく言えば、開発に入る前にも仕様書を確認し、開発している間も「思い込み」の間違いがあるかもしれないため、ちょこちょこ確認です。

（ダメなエンジニアは、一度仕様書を見て最後まで作ってしまいます。そして思い込みで間違えていることに気づかないままです）

テスト前にも確認します。テスト中も確認。テスト終わっても安心せずに「間違ってないよな？本当に大丈夫だよな？」と確認です。

（仕事の出来ないエンジニアほど、テスト終わって「あー終わった」とそのまま）

 

飲食店のアルバイトだとしてもそうです。

注文したものと違うものが出てきたことはありませんか？

それは「確認」が出来ていないからです。

 

一般大衆向けの飲食店やサービスでは間違いは多いですが、エグゼクティブ系のサービスは、驚くほど間違いがありません。

それは、「確認」がどれだけ重要か理解し、実践、徹底しているからです。

 

「確認」「確認」ってめんどくさ、

と思うかもしれませんが、めんどくさくて当たり前なんです。

成功する人は普通のダメな人たちがやらない、めんどくさいことを愚直にやっています。

それが、

 

`当たり前なこと`

 

だからです。

 

ちなみにアホな人は「間違ったっていいじゃん」と言います。

確認しないでの間違い。と確認している上での間違いは全く別物だということが分からないのです。
いらないnullチェックを防ごう!：double型の引数をもつメソッド

#概要

業務でJUnitを使ってテストをしながら、不要なソースを取り除くお仕事をしている時に
いらないnullチェックが結構あることに気づいたので、メモです。

#nullになりようがないのに、nullチェックをしている

例えばこんなメソッド。

```
private static double doubleMethod(double value){

		String stringValue = String.valueOf(value);

		if(stringValue == null){
			return 0;
		}
		return value;

	}
```
「String型だとnullがくるかもしれないからnullチェックしよう!」と思ったらしいソースです。
最初気づかなくて、メソッドの引数にnullを入れ、AssertEqualsでテストしようとする。。。コンパイルエラーに。

あっ、引数がdouble型だった…。

double型は「プリミティブ型」の変数なので「オブジェクトの参照を入れる代わりに何もない」ことを意味するnullは入れられません。
なので、double型で渡ってきたものには全て何らかの値が入っています。そのためそれをString型のような参照型に変換してもnullチェックは必要ありません。

ちなみにどうしても、double型で「値がない」ことを示したい場合にはjava.lang.Double.NaNを使います。
使う状況はあまりないと思いますが…。
Rails5のActionCableをNginxとPumaの環境にデプロイする

## はじめに
Rails5のActionCableを使ってリアルタイム通信を本番環境で動かしてみました。
Rails4時代のwebsocker-railsのgemを使ってた頃よりは大分楽にwebsocketを使えるようになってました。

[Ruby on Rails5.0.0.rc1のAction Cableを使ってチャットアプリを作ろう！](http://ticklecode.com/rails-5-0-0-rc1-chat-action-cable/)    
の記事を参考にさせて頂いて、簡単なチャットアプリを作り本番環境にあげてみました。
本番環境にあげる際に、結構つまずいたところがあったのでメモ。

## 前提
- Rails 5.1.2
- Ruby 2.4.0
- Puma
- Nginx
- Amazon Linux AMI 2017.03.0 (HVM)  
上記の環境がすでに整っており、websocket意外の箇所は正常に動いている。

## Nginxの設定で、/cableをwebsocketにあてる

confファイルに、以下を追加して`/cable`を`websocket`にあてます。

```:/etc/nginx/conf.d/example_cable.conf
location /cable {
        proxy_pass http://[test.com]/cable;
        proxy_http_version 1.1;
        proxy_set_header Upgrade websocket;
        proxy_set_header Connection Upgrade;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

```

## ドメインの許可

/config/environments/production.rbファイルを以下のように修正し、ActionCableが受け付けるドメインを指定する。

```ruby:/config/environments/production.rb
config.action_cable.allowed_request_origins = [ 'http://test.com/', /http:\/\/test.*/ ]
```

## cable.ymlの変更

最初の設定では、redisを使うようになっているのでproductionでasyncに変更します。
そうすると、本番環境でもradisをインストールすることなく動かすことができます。
これに気づかずに、最初はredis突っ込んで動かしてました・・・

```:/config/cable.yml
production:
  adapter: redis
  url: redis://localhost:6379/1
  channel_prefix: TestActionCable_production
```
↓

```:/config/cable.yml
production:
  adapter: async
```

## 終わりに
以上が、本番環境でActionCableを動かす方法のメモです。
Railsのバージョンによっても、変更しないといけない箇所変わってくるみたいなのでそこだけはご注意ください。
ASP.NET偽装のユーザ名/パスワードを暗号化

[先日](http://qiita.com/akimaru86/items/724caaf3bd5c686242f1)、web.configの暗号化の記事を載せましたが、ASP.NET偽装のユーザ名、パスワードを暗号化するには更にひと工夫必要でした。

検証機：windows server 2016

## ASP.NET偽装暗号化時の問題点
web.configをこんな感じで偽装するユーザ名、パスワードが設定されているとします

```xml:web.config
<system.web>
    <identity impersonate="true" userName="accountname" password="password" />
<system.web>
```

こいつを暗号化するには、下のコマンドで暗号化はできるのですが、

```bat
<.NETFrameworkフォルダ>\aspnet_regiis -pef "system.web/identity" "<web.configのあるフォルダパス>"
```

暗号化後にブラウザでアクセスしてみると、HTTP エラー 500.19「構成セクションの暗号化はサポートされていません」というエラーが発生してしまいます

## 解決方法
web.configに以下を追加すると解決します。

```xml:web.config
<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
</system.webServer>
```

### 注意点
この方法だと他の構成エラーが表示されなくなるので、事前に動作することを確認してから設定する必要がありそうです。
VCCWのmySQLにターミナルで接続して、テーブルの中身が見たいメモ

#いつものようにvccwを起動

```
$ vagrant up
```

#VagrantにSSH接続

```
$ vagrant ssh
```

こんなのがでてきた。

```
Last login: Thu Jan  7 01:56:47 2016 from 10.0.2.2
                   ___           ___           ___
      ___         /  /\         /  /\         /__/\
     /__/\       /  /:/        /  /:/        _\_ \:\
     \  \:\     /  /:/        /  /:/        /__/\ \:\
      \  \:\   /  /:/  ___   /  /:/  ___   _\_ \:\ \:\
  ___  \__\:\ /__/:/  /  /\ /__/:/  /  /\ /__/\ \:\ \:\
 /__/\ |  |:| \  \:\ /  /:/ \  \:\ /  /:/ \  \:\ \:\/:/
 \  \:\|  |:|  \  \:\  /:/   \  \:\  /:/   \  \:\ \::/
  \  \:\__|:|   \  \:\/:/     \  \:\/:/     \  \:\/:/
   \__\::::/     \  \::/       \  \::/       \  \::/
       ~~~~       \__\/         \__\/         \__\/

http://vccw.cc/

Initial code by Takayuki Miyauchi.
https://github.com/miya0001
```

#MySQLに接続

```
[vagrant@vccw ~]$ mysql -u root -p
Enter password: 
```

mysqlのパスワードを入力。
（[VCCWのページを参照](http://vccw.cc/#h2-3)）

※以下からはmySQLのコマンド

##データベース一覧を見る

```
mysql> SHOW DATABASES;
```

##テーブルの一覧を表示する

```
mysql> SHOW TABLES FROM wordpress;
```

（SHOW TABLES FROM データベース名）


##テーブルの列の情報を一覧表示する

```
mysql> SHOW COLUMNS FROM wp_add_banner_extension FROM wordpress;
```

（SHOW COLUMNS FROM テーブル名 FROM データベース名）

##テーブルの中身を見る

データベース名でしぼってから

```
mysql> USE wordpress
```

SELECT文

```
mysql> SELECT * FROM wp_options WHERE option_name = 'add-banner-extension';
```

（SELECT * FROM カラム名 WHERE ◯◯ = '◯◯'）

##書き換える

```
mysql> UPDATE wp_options SET option_name = 'a:1:{s:7:"version";s:5:"1.0.3";}' WHERE option_name = 'add-banner-extension';
```

##MYSQLをおわる

```
mysql> EXIT;
Bye
```

#SSHをおわる

```
[vagrant@vccw ~]$ logout
```
Bootstrapのdropdownを利用する(Rails 5.1.2)

# はじめに
Bootstrapを利用してるサイトのナビゲーションバーにdropdownを追加する際、設定の追加が必要だったのでメモしておきます。

**環境**
Rails 5.1.2
Bootstrap 3.3.6

# 設定前
自分の場合はナビーションバーにdropdownを追加したかったので`_header.html.erb`を下記のように修正しました。

```html+erb:app/views/layouts/_header.html.erb
<header class="navbar navbar-fixed-top navbar-inverse">
  <div class="container">
    <%= link_to "xxx", root_path, id: "logo" %>
    <nav>
      <ul class="nav navbar-nav navbar-right">
        <li><%= link_to "xxx", xxx_path %></li>
        <li><%= link_to "xxx", xxx_path %></li>
        <li><%= link_to "xxx", xxx_path %></li>

        <!- 追記箇所ここから -->

        <li class="dropdown">
          <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
          <ul class="dropdown-menu">
            <li><a href="#">Menu1</a></li>
            <li><a href="#">Menu2</a></li>
            <li role="separator" class="divider"></li>
            <li class="dropdown-header">header</li>
            <li><a href="#">Menu3</a></li>
            <li><a href="#">Menu4</a></li>
          </ul>
        </li>

        <!- 追記箇所ここまで -->

      </ul>
    </nav>
  </div>
</header>
```

ご参考までに、この時点の各ファイルの設定内容は下記の通りです。

```ruby:Gemfile
gem 'bootstrap-sass', '3.3.6'
```

```ruby:app/assets/stylesheets/custom.scss
@import "bootstrap-sprockets";
@import "bootstrap";
```

```ruby:app/assets/javascripts/application.js
//= require rails-ujs
//= require turbolinks
//= require_tree .
```

この時点でナビゲーションバーのdropdownをクリックしてもメニューが表示されませんでした。

![dropdown1.png](https://qiita-image-store.s3.amazonaws.com/0/141934/9f781ee5-1f4f-5288-7497-a42c042bac59.png)

# 設定後

`Gemfile`に`gem 'jquery-rails'`を追記しました。

```ruby:Gemfile
gem 'bootstrap-sass', '3.3.6'
gem 'jquery-rails'
```

`application.js`に`//= require jquery`と`//= require bootstrap`を追記しました。

```ruby:app/assets/javascripts/application.js
//= require rails-ujs
//= require turbolinks
//= require jquery
//= require bootstrap
//= require_tree .
```

dropdownをクリックした際にメニューが表示されるようになりました。

![dropdown2.png](https://qiita-image-store.s3.amazonaws.com/0/141934/5cc2847a-d0cc-35cb-b000-343a001a0cc7.png)
PHP、全てのctype関数で、0から255までのascii文字で、chrを通した文字と通さなかった文字を引数とした時の挙動が同じ

PHPのソースコードを読んでいたら、面白いテストコードが見つかりました。以下に示します。

```
--TEST--
Bug #25745 (ctype functions fail with non-ascii characters)
--SKIPIF--
<?php require_once('skipif.inc'); ?>
--FILE--
<?php
$funcs = array(
	"ctype_alnum", "ctype_alpha", "ctype_cntrl", "ctype_digit",
	"ctype_graph", "ctype_lower", "ctype_print", "ctype_punct",
	"ctype_space", "ctype_upper", "ctype_xdigit"
);

foreach ($funcs as $ctype_func) {
	for ($i = 0; $i < 256; $i++) {
		$a = $ctype_func($i);
		$b = $ctype_func(chr($i));
		if ($a != $b) {
			echo "broken... $ctype_func($i) = $a, $ctype_func(chr($i)) = $b\n";
			exit;
		}
	}
}
echo "ok\n";
?>
--EXPECT--
ok
```
このテストコードの概要は、
    "ctype_alnum", "ctype_alpha", "ctype_cntrl", "ctype_digit",
    "ctype_graph", "ctype_lower", "ctype_print", "ctype_punct",
    "ctype_space", "ctype_upper", "ctype_xdigit"
の関数群において、0から２５５の数字と、それに対応するchrを通したascii文字において、挙動が同じであることをテストしています。
\$funcsに、配列の形で、上に示したctype関数群を代入しています。

```
foreach ($funcs as $ctype_func) {
```
このコードにより、\$funcsから、配列の要素一つ一つを取り出し、$ctype_funcに代入しています。

```
for ($i = 0; $i < 256; $i++) {
```
この部分によって、0から255まで\$iをインクリメントさせてループさせています。

```
$ctype_func($i)
```
この部分により、例えば、\$ctype_funcに"ctype_alnum"が定義されていた場合は、以下のコードと等価になります。
```
ctype_alnum($i)
```
同じく、
```
$ctype_func(chr($i));
```
も、以下のコードと等価になります。
```
ctype_alnum($i)
```

```
if ($a != $b) {
```
この部分により、0から２５５までの数字と、それにchrを通して、ascii文字にしたものを、それぞれ\$ctype_func(\$i)と\$ctype_func(chr(\$i))に引数として導入した場合、それが同じ結果を返すかどうかを検査してます。
同じ結果が返ってこなかった場合は、これはバグなので、エラーを出力することになります。具体的には、以下のコードが実行されることになります。

```
echo "broken... $ctype_func($i) = $a, $ctype_func(chr($i)) = $b\n";
			exit;
```
で、もし、同じ結果が返ってこなかった場合、そこでプログラムは終了することになります。
なので、エラーの場合は、以下のコードは実行されません。

```
echo "ok\n";
```
もちろん、エラーがなかった場合は、このコードは実行されます。通常は、okが出力されるのが通常です。
VBoxLinuxAdditions.run を実行して This program must be run with administrator privileges. になった時の対応方法

[MacのVirtualBoxに作った仮想マシンへGuest Additionsをインストールする](http://ponsuke-tarou.hatenablog.com/entry/2017/07/23/175358) をしていた時のしくじりです。

**環境**

- ホストOS : macOS Sierra Virsion 10.12.5
- VirtualBox : Version 5.1.22 r115126 (Qt5.6.2)
    - ゲストOS : CentOS Linux 7.3.1611(Core)
    - 接続 : ブリッジ接続
    - Yum version : 3.4.3


### 事象 : VBoxLinuxAdditions.run を実行したら`This program must be run with administrator privileges.`と言われた

```shell-session
$ sh /mnt/cdrom/VBoxLinuxAdditions.run 
Verifying archive integrity... All good.
Uncompressing VirtualBox 5.1.22 Guest Additions for Linux...........
This program must be run with administrator privileges.  Aborting
```

### 原因 : sudo を使っていないから
### 対応 : sudo を使う:flushed::flushed::flushed:

```shell-session
$ sudo sh /mnt/cdrom/VBoxLinuxAdditions.run
```
VBoxLinuxAdditions.run を実行して ./install.sh: 行 365: bzip2: コマンドが見つかりません になった時の対応方法

[MacのVirtualBoxに作った仮想マシンへGuest Additionsをインストールする](http://ponsuke-tarou.hatenablog.com/entry/2017/07/23/175358) をしていた時のしくじりです。

### 事象 : VBoxLinuxAdditions.run を実行したら`./install.sh: 行 365: bzip2: コマンドが見つかりません`と言われた

```shell-session
$ sudo sh /mnt/cdrom/VBoxLinuxAdditions.run 
Verifying archive integrity... All good.
Uncompressing VirtualBox 5.1.22 Guest Additions for Linux...........
VirtualBox Guest Additions installer
Copying additional installer modules ...
./install.sh: 行 365: bzip2: コマンドが見つかりません
tar: これは tar アーカイブではないようです
tar: 前のエラーにより失敗ステータスで終了します
./install.sh: 行 378: bzip2: コマンドが見つかりません
tar: これは tar アーカイブではないようです
tar: 前のエラーにより失敗ステータスで終了します
```

### 原因 : bzip2コマンドがインストールされていないから
### 対応 : bzip2コマンドをインストールする

```shell-session
$ sudo yum install bzip2
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.nara.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> パッケージ bzip2.x86_64 0:1.0.6-13.el7 を インストール
--> 依存性解決を終了しました。

依存性を解決しました

==============================================================================================================================================================
 Package                             アーキテクチャー                     バージョン                                 リポジトリー                        容量
==============================================================================================================================================================
インストール中:
 bzip2                               x86_64                               1.0.6-13.el7                               base                                52 k

トランザクションの要約
==============================================================================================================================================================
インストール  1 パッケージ

総ダウンロード容量: 52 k
インストール容量: 82 k
Is this ok [y/d/N]: y
Downloading packages:
bzip2-1.0.6-13.el7.x86_64.rpm                                                                                                          |  52 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  インストール中          : bzip2-1.0.6-13.el7.x86_64                                                                                                     1/1 
  検証中                  : bzip2-1.0.6-13.el7.x86_64                                                                                                     1/1 

インストール:
  bzip2.x86_64 0:1.0.6-13.el7                                                                                                                                 

完了しました!

# やり直します。
$ sudo sh /mnt/cdrom/VBoxLinuxAdditions.run
```
BoUoWでWord2Vec


自然言語処理で、
言語のベクトル化とか、Cos類似度とか、分かち書きとか、機械学習とか・・・・・
いろいろ興味があって挑戦はするのですが、いつも途中で挫折してしまい。。。。

挫折しても、どうせまたすぐりやたくなって、その時のための備忘録的に書いていけたならと思って書いていこうとおもっています。


ではまず、なぜBUWを使う必要があるのかというところからいきます。
なぜならば、漠然としてしまいますが、Windows10とAnacondaでJupyter Notebookを使って、いろいろやっていたのですが、Mecabがうまく動かなかったから。。。。
どのように動かなかったのかは、今は忘れてしまいました。。
しかし、とにかく、よくわからなかったということだけは、よく覚えています。

たぶん、Mecab-Python for Windowsがうまく機能してないんじゃないかなって感じでした。

ネット上で、
Mecab-PythonのLinux用のソースコードを、Windows用に書き換えてコンパイルしなすとうまくいくかも！！
とい情報を取得しても、Windows用への書き換えなんてまったく知らないし。。。。

今回も挫折か。。。。。。

そんなことが頭をよぎりながら、パソコンの前に座るのがだんだん嫌になってきたとき、ある記事を目にしました。

「bash on ubuntu on Windows」

えーっ。しかも、Windows10の標準機能っぽい。
再びパソコンの前に座る気力がわいてきました。
これなら、Linux用のMecab-Pythonそのまま使えるでしょ！！

そんなこんなで、いろいろやった結果を張り付けていければと思います。

とりあえず、以下、成功したので忘れないうちに、コードを貼り付けておきます。
環境は、以下です。
・64bit Windows10 Creatve update
・Bash on ubuntu on Windows
・Jupyter Notevook(anaconda3-4.4.0)
・python3.6


なお、ほとんどは、「@enta0701」さんのページに貼り付けていただいたコードを利用参考にさせていただいております。
ありがとうございます_(._.)_
http://qiita.com/enta0701/items/87cbe783aeb44ddf41ce


Macではなく、BUWで動かそうとしているからなのか、それとも何か他に原因があるのか特定できませんでしたが、元のソースコードのままだと、「.txt」ファイルをうまく読み込めませでした。

（2017/11/16追記開始）
「```__file__```」のあたりがうまく動いてくれていないような感じでした。
（追記終了）

（2017/11/19追記開始）
「```__file__```」でエラーがでる問題、次のように対応しました。
https://qiita.com/Chizizii/items/42a78754aa2fe6b6a29f
（追記終了）


いろいろ試してみると、「.txt」ファイルの中身が日本語の場合うまくいかないのかなと。
その後、UTF-8等の関係かと思いしつこむ挑戦したのですが、うまくいかず。。。

Windowsの深い階層に「.txt」を置くことで、パスが長すぎるのかなとか考え、動的なパスを取得することはあきらめ、比較的階層が浅く、固定パスで指定した場所に「.txt」ファイルを置くことにしました。
それに合わせて、importするものも若干削ったりしました。

で、なんとか動くところまではこじつけました！！

そのほか、入力するテキストデータなども含めて、ほぼそのまま利用させていただいています。

忘れないうちに、ソースコードだけ、貼り付けさせていただきます。

おかしな点などありましたら、やさしくご指摘ください。あまり知識がないので。。

```py
# -*- coding: utf-8 -*-
# 言語指定 py3
# 参考元　http://qiita.com/enta0701/items/87cbe783aeb44ddf41ce

import os
import sys
import numpy as np
import MeCab
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

input_text = open('/mnt/c/BOW/documents.txt', 'r').read()
print(input_text)

documents = input_text.split("|")

def words(text):
    out_words = []
    tagger = MeCab.Tagger('-Ochasen')
    tagger.parse('')
    node = tagger.parseToNode(text)

    while node:
        word_type = node.feature.split(",")[0]
        if word_type in ["名詞"]:
            out_words.append(node.surface)
        node = node.next
    return out_words

def vecs_array(documents):
    docs = np.array(documents)
    vectorizer = TfidfVectorizer(
        analyzer=words,
        stop_words='|',
        min_df=1,
        token_pattern='(?u)\\b\\w+\\b'
    )
    vecs = vectorizer.fit_transform(docs)
    return vecs.toarray()

tag = ["記事A", "記事B", "記事C", "記事D", "記事E", "記事F"]
cs_array = cosine_similarity(vecs_array(documents), vecs_array(documents))

for i, cs_item in enumerate(cs_array):
    print("[" + tag[i] + "]")
    cs_dic = {}
    for j, cs in enumerate(cs_item):
        if round(cs - 1.0, 5) != 0:
            cs_dic[tag[j]] = cs
    for k, v in sorted(cs_dic.items(), key=lambda x:x[1], reverse=True):
        print("\t" + k + " : " + str(v))
```



（追記）ソースコードの部分に言語の指定として「py3」追加しました。
shiracamusさん、ありがとうございました。

以上。
PHPのソースコードを徘徊してたらctypeのテストコードにぶつかった

PHPの脆弱性探しで、PHPのソースコードを徘徊してたら、以下のようなテストコードにぶつかりました。

```
--TEST--
ctype on strings
--SKIPIF--
<?php require_once('skipif.inc'); ?>
--FILE--
<?php 

setlocale(LC_ALL,"C");
print "LOCALE is '" . setlocale(LC_ALL,0) . "'\n";

function ctype_test_002($function) {
	$n1 = $n2 = $n3 = 0;
	// test portable POSIX characters 0..127
	for ($a=0;$a<128;$a++) {
		$c = chr($a);
		if($function($a)) $n1++;
		if($function("$c$c$c")) $n2++;
		if($function("1-$c$c$c-x")) $n3++;
	}
	print "$function $n1 $n2 $n3\n";
}

ctype_test_002("ctype_lower");
ctype_test_002("ctype_upper");
ctype_test_002("ctype_alpha");	
ctype_test_002("ctype_digit");	
ctype_test_002("ctype_alnum");		
ctype_test_002("ctype_cntrl");	
ctype_test_002("ctype_graph");
ctype_test_002("ctype_print");
ctype_test_002("ctype_punct");
ctype_test_002("ctype_space");
ctype_test_002("ctype_xdigit");

?>
--EXPECTF--
LOCALE is '%s'
ctype_lower 26 26 0
ctype_upper 26 26 0
ctype_alpha 52 52 0
ctype_digit 10 10 0
ctype_alnum 62 62 0
ctype_cntrl 33 33 0
ctype_graph 94 94 94
ctype_print 95 95 95
ctype_punct 32 32 0
ctype_space 6 6 0
ctype_xdigit 22 22 0
```
ctypeとは、文字タイプを判別する関数群のようで、ここでは、
ctype_lower 
ctype_upper 
ctype_alpha
ctype_digit 
ctype_alnum 
ctype_cntrl 
ctype_graph 
ctype_print 
ctype_punct 
ctype_space 
ctype_xdigit 
などの関数が実行されています。

```
setlocale(LC_ALL,"C");
```
で、ロケールを"C"にする。"C"とは、アプリケーションのデフォルトのロケールのことで、例えば、ユーザーがロケールを変更していた場合でも、アプリケーションのデフォルトのロケールに戻す。

```
setlocale(LC_ALL,0)
```
この関数は、現在設定されているロケールを文字列で返す関数です。"C"が設定されていることを確認していますね。

```
function ctype_test_002($function)
```

この関数の、$functionに、関数名の文字列を渡すことで、関数を渡すことになる。

```
chr($a)
```
chr関数は、0から２５５までの値を引数として設定できます。以下のように、256以上の場合は、256で割った余りの数字のasciiコードを返します。0以下の場合は、０以上になるまで、256を足されます。

```
while ($ascii < 0) {
    $ascii += 256;
}
$ascii %= 256;
```

ここでは、0から127までしか使ってないですね。これには、空白、記号、数字、大文字のアルファベット、小文字のアルファベットが入ります。

```
$function($a)
```
この関数によって、\$aが、そのまま、\$functionに定義された関数に引数として入力されます。
\$functionが"ctype_lower"として定義されていると、$aが小文字に対応する数字の時だけ、trueを返します。
ここでは、chrでascii文字に変換する前の、ただの数字を入力しています。この時も、該当する文字が小文字の時は、trueを返します。具体的には、97から１２２です。

```
$function("$c$c$c")
```
この関数によって、ascii文字が、３つ連結された文字列が、\$functionに引数として導入されます。\$function(\$a)と同じく、\$functionが"ctype_lower"として定義されていると、$cが小文字の時だけ、trueを返します。

```
$function("1-$c$c$c-x")
```
この場合、例えば、\$functionが、"ctype_lower"に定義されていて、\$cが小文字だったとしても、trueは返されません。理由は、1と-が混じっていて、これらはアルファベットの小文字ではないからです。
しかし、\$functionが"ctype_print"に定義されていると、$cが印字可能な文字が入力されていた場合、trueが返されます。なぜかというと、1と-が共に印字可能だからです。

ところで、最近は、技術ブログを書きたいなら、OSSのソースコードを読んだ方がいいのではと考え始めました。ということで、これからもOSSのソースコードを読んでいこうかと思います。
これからもよろしくお願いします。
[Ruby] モジュールの include と クラス継承

モジュールの include とクラスの 継承 について.
モジュールの include とクラスの 継承 は, それを行うタイミングによって include と 継承 の挙動が変わるのでメモ.

## 確認環境
* Ruby v2.3.7p456

## パターン[1]: 下位クラスで include と 継承 を行った場合

まずはモジュールと親クラスで同名メソッドが定義されていて, それらを inlude, 継承 した場合の動きを確認する.

## モジュール定義とクラス定義
```ruby:define_module_define_class.rb
# まずはモジュール定義
module Mdl
  def hoge
    puts "hoge is defined by Mdl"
  end
end

# Mdl のメソッドと同名メソッドを定義したクラス
class Cls1
  def hoge
    puts "hoge is defined by Cls1"
  end
end

# Mdl を include し, かつ Cls1 を継承するクラス
class Cls2 < Cls1
  include Mdl
end
```

## 継承関係の確認
```ruby:verify_inheritance.rb
Cls2.ancestors # :=> [Cls2, Mdl, Cls1, Object, Kernel, BasicObject]
```

## 挙動の確認
```ruby:verify_behavior.rb
# hoge は Mdl, Cls1 どちらのメソッドが実行されるか
Cls2.new.hoge # :=> hoge is defined by Mdl
```

## パターン[2]: 上位クラスで include を行った場合
次にモジュールと親クラスで同名メソッドが定義されていて, 親クラスでモジュールを inlude した場合の動きを確認する.

## モジュール定義とクラス定義
```ruby:define_module_define_class2.rb
# まずはモジュール定義
module Mdl
  def hoge
    puts "hoge is defined by Mdl"
  end
end

# Mdl を include し, かつ Mdl のメソッドと同名メソッドを定義したクラス
class Cls1
  include Mdl
  def hoge
    puts "hoge is defined by Cls1"
  end
end

# Cls1 を継承するクラス
class Cls2 < Cls1
end
```

## 継承関係の確認
```ruby:verify_inheritance2.rb
Cls2.ancestors # :=> [Cls2, Cls1, Mdl, Object, Kernel, BasicObject]
```

## 挙動の確認
```ruby:verify_behavior2.rb
# hoge は Mdl, Cls1 どちらのメソッドが実行されるか
Cls2.new.hoge # :=> hoge is defined by Cls1
```

## 結論
Cls2.ancestors を行ったときの結果がすべて.
つまり

* パターン[1]
 * Cls2.ancestors # :⇒ [Cls2, Mdl, Cls1, Object, Kernel, BasicObject]
 * Mdl が継承チェーン上, Cls2 の直上に来ているので, Mdl.hoge が最初に見つかり実行される

* パターン[2]
 * Cls2.ancestors # :⇒ [Cls2, Cls1, Mdl, Object, Kernel, BasicObject]
 * Cls1 が継承チェーン上, Cls2 の直上に来ているので, Cls1.hoge が最初に見つかり実行される
"startx"で「xf86OpenConsole: Cannot open virtual console 1 (Permission denied）」とエラーになったときに


Arch LinuxでGUI環境を構築中に、"startx"を実行したところ下記のエラーが発生した。

```
xf86OpenConsole: Cannot open virtual console 1 (Permission denied)
```

原因は、rootでログインしたあと、"su - username"で一般ユーザに変更したうえで"startx"を実行したため。

"username"ユーザでログインし直して、"startx"を再度実行して解決。

## もう少し詳しく

下記コマンドで使用中の仮想コンソール（？）のパーミッションを確認すると、なぜ"Permission denied"となったかがわかる。

```
tty | xargs ls -l
```



## 参考
https://bbs.archlinux.org/viewtopic.php?id=192329
ExoPlayerにフィルターをかける

#ExoPlayerFilter
<img src="https://qiita-image-store.s3.amazonaws.com/0/69103/333a9835-6576-13d8-80bb-cfb1ed21e2e3.gif" width="40%">

<a href="https://github.com/MasayukiSuda/ExoPlayerFilter">ExoPlayerFilter</a>

ExoPlayerにフィルターをかける。それができるライブラリを作成しました。
動画編集系の案件に携わった方は一度作ろうか検討したことがあるかと思います。

自分はExoPlayerに倍速再生が入ったので作成しようと考えました。

mediaCodecで使用しているtextureにOpenGLでフィルターをかけています。

# Dependencies

```
dependencies {
    compile 'com.daasuu:ExoPlayerFilter:0.1.3'
}
```
※このライブラリはEXOPlayer core r2.4.3 を含んでいます。

# Sample Usage
### STEP 1
 [SimpleExoPlayer](https://google.github.io/ExoPlayer/guide.html#creating-the-player) のインスタンスを作成します。今回はmp4ファイルを再生します。
 HLS等の他のフォーマットを再生したい場合は[公式サイト](https://google.github.io/ExoPlayer/guide.html#add-exoplayer-as-a-dependency)を参照ください。<br>

```JAVA
    BandwidthMeter bandwidthMeter = new DefaultBandwidthMeter();
    TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(bandwidthMeter);
    TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);

    // Measures bandwidth during playback. Can be null if not required.
    DefaultBandwidthMeter defaultBandwidthMeter = new DefaultBandwidthMeter();
    // Produces DataSource instances through which media data is loaded.
    DataSource.Factory dataSourceFactory = new DefaultDataSourceFactory(context, Util.getUserAgent(context, "yourApplicationName"), defaultBandwidthMeter);
    // Produces Extractor instances for parsing the media data.
    ExtractorsFactory extractorsFactory = new DefaultExtractorsFactory();
    // This is the MediaSource representing the media to be played.
    MediaSource videoSource = new ExtractorMediaSource(Uri.parse(MP4_URL), dataSourceFactory, extractorsFactory, null, null);

    // SimpleExoPlayer
    player = ExoPlayerFactory.newSimpleInstance(context, trackSelector);
    // Prepare the player with the source.
    player.prepare(videoSource);
    player.setPlayWhenReady(true);

```

### STEP 2
 [EPlayerView](https://github.com/MasayukiSuda/ExpPlayerFilter/blob/master/epf/src/main/java/com/daasuu/epf/EPlayerView.java) を作成し、SimpleExoPlayerをセットします。

```JAVA
    ePlayerView = new EPlayerView(this);
    // set SimpleExoPlayer
    ePlayerView.setSimpleExoPlayer(player);
    ePlayerView.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    // add ePlayerView to WrapperView
    ((MovieWrapperView) findViewById(R.id.layout_movie_wrapper)).addView(ePlayerView);
    ePlayerView.onResume();
```

### STEP 3
フィルターをセットします。フィルター一覧は[こちら](https://github.com/MasayukiSuda/ExpPlayerFilter/tree/master/epf/src/main/java/com/daasuu/epf/filter)です。
フィルターをカスタムする場合は、[GlFilter](https://github.com/MasayukiSuda/ExpPlayerFilter/blob/master/epf/src/main/java/com/daasuu/epf/filter/GlFilter.java)を継承すれば作成可能です。


```JAVA
    ePlayerView.setGlFilter(new GlSepiaFilter());
```


<br>
是非、<a href="https://github.com/MasayukiSuda/ExoPlayerFilter">ExoPlayerFilter</a>をご覧になり、Starもつけていただけるととても嬉しく思います。
こんなフィルターも作れる等のpull reqestも大歓迎です！
■ルーティングに関する質問です。

■ルーティングに関する質問です。

とある事情があり、ネットワークに負荷のかかる動画閲覧のみ、
USBで外付けたLANアダプタ経由で行いたいです。

USBで外付けたLANアダプタの次(ネクストホップ)は自宅のルータです。
ルータ上でプロバイダ上にPPP接続しています。

ここで以下のようなルーティングが考えられます。
route -p add XXX.XXX.XXX.XXX mask 255.255.255.255 192.168.11.1 metric 1 if 37

しかしyoutubeなど大手動画サイトは負荷分散を行っておりIPが動画閲覧の都度(閲覧中にも)変更となるので、
全てのIPを指定するのは不可能です。

どのようにすれば固定の動画サイトのルーティングを行えるのでしょうか？

イメージとしては以下のようにしたいのです。
route -p add www.youtube.com mask 255.255.255.255 192.168.11.1 metric 1 if 37
Oracleでパスワードの有効期限が切れたユーザを、パスワードの変更をせずに復活させる方法

# 背景

最近のOracleではユーザのパスワードの有効期限がデフォルトで設定されるようになっているため、それに気づかず運用していると、突如ユーザがログインできなくなるとか、アプリケーションサーバの起動に失敗するなどの災難に見舞われることになります。

有効期限が切れたユーザを復活させるには、パスワードの再設定が必要なのですが、諸々の理由でパスワードは変更したくないのだけれど、前のパスワードがわからない場合の解決策です。

# パスワードハッシュでのパスワード変更

DBに格納されているパスワードハッシュの値を指定して、パスワードを変更すればOKです。

```sql:パスワードハッシュの取得
select spare4 from sys.user$ where name='<username>';
```

```sql:パスワードの変更
alter user <username> identified by values '<上記で取得したパスワードハッシュ値>';
```
JavaScriptで音声再生完了タイミングを取得したい。

音声を流し終えてから、指定時間後に別の音声を流したいと思ったので
WebAudioAPIで試してみる。

## HTML部分

とりあえず、ボタンを用意。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <script src="test.js"></script>
</head>
<body>
    <button id="btn" disabled>Start</button>
</body>
</html>
```

## JavaScript部分

```js
window.AudioContext = window.AudioContext || window.webkitAudioContext; 
context = new AudioContext();

var schedule = [
    {"time":0, "file":"1.wav"},
    {"time":5, "file":"2.wav"}
];
var plans = []
var getAudioBuffer = function(schedule, index){
    if(index >= schedule.length){
        document.getElementById('btn').disabled = false;
        return;
    }
    plans[index] = {
        "time":schedule[index]["time"],
        "buffer":null
    };
    var req = new XMLHttpRequest();
    req.open('GET', schedule[index]["file"], true);
    req.responseType = 'arraybuffer';        
    req.onreadystatechange = function(){
        if(req.readyState === 4){
            if(req.status === 0 || req.status === 200){
                context.decodeAudioData(req.response, function(buffer){
                    plans[index]["buffer"] = buffer;
                });
                getAudioBuffer(schedule, index+1);
            }
        }
    };
    req.send('')
};

var planid = 0;
var playSound = function(){
    var source = context.createBufferSource();
    source.buffer = plans[planid]["buffer"];
    source.onended = function(){
        planid++;
        if(planid < plans.length){
            setTimeout(playSound, plans[planid]["time"]*1000);
        }
    };
    source.connect(context.destination);
    source.start(0);
}

window.onload = function(){
    getAudioBuffer(schedule, 0);
    var btn = document.getElementById('btn');
    btn.onclick = function(){
        planid = 0;
        playSound();
    }
}
```

とりあえず動かしたかったので
変数がグローバル多い、これはちゃんと作る時は直そう。
エラー制御とか諸々の制御もてきとうになっている。

### getAudioBuffer

再生用の音声データをXMLHttpRequestで取ってきてバッファ持っておく。
最初、複数並列に投げようとして最後の1つしか受け取れなかったので
一つずつ、終わったら次の取得をする形にして対応。
全部の読み込みが終わったら再生ボタンを有効にする。

### playSound

再生の完了を取得して次の音声流したいので
`onended`イベントハンドラに終了を受け取って次の再生を行う処理を追加。
次に再生する音声が再生終了後に何秒後に流すのか持っておいて
setTimeoutで指定秒数後に再生。

参考
[Web Audio API で音を再生しよう | phiary](http://phiary.me/webaudio-api-getting-started/)
React NativeのAndroid実機ビルドと出たエラー対処メモ #rnjapan


[React & React Native入門者向けハンズオン#3](https://react-native-meetup.connpass.com/event/55247/)にてAndroidでの実機ビルドを試しています。

## 環境

* Node.js v8.2.0
* Android 6系 （Nexus 5）
* macOS Sierra

## 手順

**事前にAndroidで実機デバッグはできる環境になっています。**

```
$ adb devices

List of devices attached
077989c000d1fe86	device
```

```
$ npm install -g react-native-cli
```

これで`react nativeコマンドが`使えます。

```
$ react-native --help
```

```
$ react-native init HelloReactNative
$ cd HelloReactNative
$ react-native run-android
```

本来であれば、この手順でサンプルアプリが立ち上がります。

![](https://i.gyazo.com/88430b3cece2d6824df853f1e9d54e84.png)

## 出たエラー

最後の`react-native run-android`のコマンドで以下のエラーがでました。

```
Scanning 556 folders for symlinks in /Users/n0bisuke/dotstudio/2_events/20170723_react/HelloReactNative/node_modules (8ms)
JS server already running.
Building and installing the app on the device (cd android && ./gradlew installDebug)...

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':app'.
> SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 6.556 secs
Could not install the app on the device, read the error above for details.
Make sure you have an Android emulator running or a device connected and have
set up your Android development environment:
https://facebook.github.io/react-native/docs/android-setup.html
```

ここが問題でした

> SDK location not found. Define location with sdk.dir in the local.properties file or with an ANDROID_HOME environment variable.

[公式のAndroid Setupページ](https://facebook.github.io/react-native/releases/0.21/docs/android-setup.html#define-the-android-home-environment-variable)をみるとMacの場合は`export ANDROID_HOME=/usr/local/opt/android-sdk`をしろって書いてます。

普段からAndroid開発をしている訳では無いのでパスを忘れがちですが、Android Studioに設定してあるパスは[この方法](http://www.vuzix.jp/dev/general-settings.html)で確認できました

![](https://i.gyazo.com/9c3a1abe1c47e56f9d34967a311d25b2.png)

`/Users/n0bisuke/Library/Android/sdk`らしいので`export ANDROID_HOME=/Users/n0bisuke/Library/Android/sdk`を実行（& .zshrcに追記）して再実行することでビルドが成功しました。
#質問　VPS でのクラスタの組み方　拡張の仕方を教えて下さい。

下記の様な facebookクローンを運用が前提です

Dolphin-v.7.3.3.1
elgg-2.3.3
friendica-develop
IsVipi-OSSN-master
mastodon-master
matcha-sns-1.3.8
oxwall-1.8.4.1
social_stream-master

LINEクローン的なspika4も想定しています。
http://isana.net/spika4business

VPS契約して、今後の拡張想定し
最初から クラスター設定しておくとして
途中から ダウンタイム0で出来るならそちらも......
方法があると助かります。

クラスターが適切だと思ったのですが
クラスターでは無い 良い方法があるならば
教えて頂けると幸いです。

仮想環境として OpenVZは
開発が完了していることから、KVMを選択

サーバーの最初の1台は下記のどれかを使い
拡張していく予定である。
KVM Linux 2 or KVM Linux 1 x2
https://billing.time4vps.eu/cart/&step=0
2コア / 2GB 50GB
https://www.kagoya.jp/cloud/vps/kvm.html#vps_header

今後 ストレージの増設 VPSの
増設・分散処理を容易に管理行う事を前提に

nginx webサーバー
Passenger rubyAPPサーバー
Tomcat JavaAPPサーバー
webデータ用ストレージクラスターを組むとして

データベースは
mariadb galera cluster
Hadoop Apache Spark 
Cassandra
併用として

統計データ計算に Platform Lavas等を
将来的には導入したい。

OSは Redhat系linuxを使いたい（centos7）

その場合 どうすれば 管理ツール含めて楽に運用出来るのか

構成含めて、一番効率的だと思われる方法もあれば
教えて頂けると幸いです。

下記等が よく使われている様ですが

Heartbeat + pacemaker + LXD+LXC
CentOS Atomic Host
libvirt qemu-kvm bridge-utils
wafは
ModSecurity Naxsi

今 何が運用が楽で、効率的で多機能で安全で
処理に問題ないのか？

以上 大変恐縮ですが、お知恵をお貸し頂ける方いれば
よろしくお願いします。
A Tour of Go

先日、職場の上司と「サーバサイドの開発言語を変えるとしたら何を選ぶ？」という話題になり、その中でGo言語が候補の一つとして上がりました。

私自身、Go言語（以下Go）のことをあまり知らず、Goで開発すると何が嬉しいのだろう？と気になったため少し触ってみることにしました。

#gotour
Goを触ってみるのにA Tour of GoというGoのチュートリアルがあります。
https://go-tour-jp.appspot.com/welcome/1

これは[gotour](https://github.com/golang/tour/)というGoチュートリアルをgolang.org（日本のローカライズ版はgo-tour-jp.appspot.com）上で動かしているものです。

Goをブラウザ上で実行しながら各機能を学ぶことができます。

#インストール
A Tour of Go上で動かすのであれば必要ありませんが、自分のマシンにGoを入れたい場合は
[公式サイト](https://golang.org/dl/)からOSに合わせてインストーラをダウンロード。
または、MacであればHomebrewから入れられます。

#Packages, variables, and functions.
A Tour of GoのBasicsという章は

-Packages, variables, and functions.
-Flow control statements: for, if, else, switch and defer
-More types: structs, slices, and maps.
の3本立てとなっていて、
今回はPackages, variables, and functions.からみていきます。
Packages, variables, and functions.は

-package
-imports
-Exported names
-Functions
-Functions continued
-Multiple results
-Named return values
-Variables
-Variables with initializers
-Short variable declarations
-Basic types
-Zero values
-Type conversions
-Type inference
-Constants
-Numeric Constants

で成り立っており、この中で気になったものをピックアップします。

#Exported names

Goには大文字で始まる名前は他のパッケージから参照することのできる***exported name***という概念があります。他の言語で言うところのpublicと同じような感じでしょうか。
まだ深く調べていませんが、Goにはクラスがないようなのでクラス型のオブジェクト指向言語と比較できないのでなんとも言えませんが。

```
package main

import (
	"fmt"
	"math"
)

func main() {
	fmt.Println(math.Pi)
}

```
mathのPiは大文字始まりなため、main関数から呼び出すことができます。
仮に、Piではなく、piだったら呼び出し不可能です。

#Functions

関数は次のように定義します。

```
func add(x int, y int) int {
	return x + y
}
```

addが関数名、その後ろの括弧内が引数、その後ろが戻り値の型です。

#Multiple results
関数の戻り値を複数にすることができます。

```
func swap(x, y string) (string, string) {
	return y, x
}
```
その場合、戻り値の型は括弧で括ります。省略することはできません。

#Named return values
あらかじめ戻り値となる変数を宣言することで、return以下を省略することができます。

```
func split(sum int) (x, y int) {
	x = sum * 4 / 9
	y = sum - x
	return
}
```
この場合、x, yが返されます。Multiple resultsを使った場合と相性がいいのではないかと思います。

#Short variable declarations
Goは強い静的型付け言語なため、変数を宣言する際は型を明示する必要があります。

```
var i, j int = 1, 2
```
このように宣言すると、i, jにはintである1と2が代入されます。
ワンライナーでかけるのでスッキリした印象があります。

しかし、このvarを使わずに:= の代入文を使うことで、暗黙的な型変換を行うことができます。

```
i, j := 1, 2
```

これは先ほどの記述例と同義です。

#Zero values
変数に初期値を与えずに宣言をすると、ゼロ値（Zero values）というものが与えられます。
例えば、

```
数値型(int,floatなど): 0
bool型: false
string型: ""
```

といった具合です。
これを知らないと

```
var is_valid_code bool = false;
```
といったように冗長な宣言をしてしまいます。


#まとめ
スクリプト言語の手軽さを備えつつ、静的型付けをサポートしているいいとこ取りなところに興味をそそられます。
まだまだ調べ始めたばかりなので、またA Tour of Goを触った感想をまとめてみたいと思います。

#参考

公式
https://golang.org/

http://shoma2da.hatenablog.com/entry/2014/08/16/075050

https://liginc.co.jp/284306
ChromebookとGoogle Compute EngineでRustツール開発してみた（ただしHelloWorld）

## tl;dr

前回の記事の実践版。がばがばだけど、とりあえずまとめてみる。
http://qiita.com/migeru/items/4577d4b44ae9a4eef1b4

## コンセプト
* Google Compute Engine（以下GCE）を使ってRustツールを作成（ただしHelloWorld）
* インスタンスはプロダクト毎に一個とする。使わないときは落としておく。（１個のインスタンスでやると、複数のプロダクトの開発時に、言語のバージョン管理とか設定の整合性を取るのが面倒なので）
* インスタンスは安さ重視でプリエンプティブVMインスタンスを使用。

> プリエンプティブVMインスタンスは、通常インスタンスより価格が安い代わりに、２４時間しか起動しないのとたまに勝手にインスタンスが終了する。（体感で一ヶ月に３，４回くらい？）
詳しくは以下のURL
https://cloud.google.com/compute/docs/instances/preemptible?hl=ja

## 環境
* マシン - Chromebook
* ブラウザ - Google Chrome

## 基本手順
1. プロジェクト作成（１度作ればOK）
2. インスタンス作成・起動（プロダクト毎に作成する）
3. SSH接続
4. 開発用初期設定
5. RustをインストールしてHelloWorld

## プロジェクト作成
1. Google Compute Engineにアクセス
> https://console.cloud.google.com/compute/
2. プロジェクト作成、課金を有効にする旨のメッセージが表示されるので、指示に従ってプロジェクトを作成、クレジットカード情報を登録する。

## インスタンス作成
好きに設定する。
自分は、設定が楽なのでUbunu16.04を使っている。メモリは3.75GBを使っている。
ただし大事な点が2点

* ゾーンは`asia-northeastを使う`（東京リージョンなので回線的にレイテンシが良い）
* プリエンプティブVMインスタンスにする。（メモリ3.75GBだと$20くらい安くなる）
> `管理、ディスク、ネットワーク、SSH 認証鍵`をクリック。`プリエンプティブ`の項目をオンにする

作成した場合、自動でインスタンスが起動する。
停止状態だった場合は、接続の横のボタンのメニューから、「開始」をクリック

## SSH接続
Chrome拡張が入っていない場合、インストール。
入っている場合はそのまま使う。
拡張機能がないと、`Ctrl + w`でウィンドウを閉じてしまう。また、Chromeとは別のアイコンでウィンドウが開かれる。 

1. SSH接続を押す（ポップアップブロックされたら解除してもう一度トライ）
2. ウィンドウを開いたら、右上の左側のボタンをクリックして、`Chromeの拡張機能をインストール`をクリック
3. 開いたウィンドウから、拡張機能をインストール
4. VMインスタンスの画面をリロードする（先程インストールした拡張機能が読み込まれる。）
5. SSH接続を押して、再度開く
6. 右上の右のボタンからオプションを開いて、フォントサイズや、コピー動作を変更する。（デフォルトだと`Ctrl + v`でクリップボードの中身がペーストされるが、neoviのキーバインドとかぶってるので`Ctrl + Shift + v`に変更）

## 開発用初期設定
開発用の設定はdotfilesで管理している。
以下のURLにしたがってインストール
> https://github.com/migutw42/dotfiles

dotfilesの出来栄えは微妙。とりあえずで作ったので、これから改良する。
あと、gitが入っていないと動かないかも。（これを作ったときGCEにデフォルトでgitが入っていると思い込んでた）
Ubuntu16.04でしか動くことを想定していない。（ソフトインストールにapt使ってたり）

主なインストールソフトは以下の通り
* neovim（vim-bootstrapで設定。rustのプラグインもvim-bootstrapのものを使用）
* tmux
* fishシェル（設定するのが面倒なので。いろいろ最初からできるfish様素晴らしい）

> neovimはtmuxでない状態で一旦起動すること。Vim-Plugとプラグインをインストールするため。また、tmux内でneovimを起動すると、なぜかVim-Plugがインストールされない.


## RustでHelloWorld
1. 以下のサイトを参考にRustをインストール。（インストール後はシェルの再起動が必要）
> https://www.rust-lang.org/ja-JP/install.html

2. エディタでHelloWorldを書く（neovimで書いた。）
> ```rust:hello.rs
fn main() {
    println!("Hello World!");
}
```

3. コンパイルして実行

> ```fish
$ rustc ./hello.rs
$ ./hello
# Hello World!
```

## 所感
Google Compute Engineは親切なので、見れば大体の操作はわかるはず。UIに関しては、個人的にAWSよりは使いやすい。Chromebookでの開発に関しては、croutonで色々設定したりするよりは全然やりやすいかなと思う。