OmniAICreator/Qiita-1.07M huggingface dataset:
iPhoneでmaterial-selectを実装した時のパカパカを消す

iPhoneで[ここ（公式）](http://materializecss.com/forms.html#select)みればわかるけどパカパカがダサい。
[こちら](http://blog.shimabox.net/2015/03/09/ios8-safari-materialize-material_select-caret/)によると、裏のinputに反応しているらしい。
ソースをいじるのが面倒くさいということで、javascriptで対応しました。

#裏のinputにblurを適用させる

```js
$(document).on({
    focus: function(){
        $(this).blur();
    }
}, 'input.select-dropdown');
```

これだけだとパカパカは消えるけど、閉じることができないっぽい。

#selectのchangeイベントでcloseをtrigger
```js
$(document).on({
    'change': function(){
        $('.select-dropdown').trigger('close');
    }
}, 'select.material-select');
```
無事パカパカがでないし、閉じるようになりました。


ただとってつけたような対応だから本来ならソースをいじるべきなんだろうか・・・。

なにか他に対応あれば教えてください。
NSURLComponentsのエンコードが期待していたものと違っていた

## 環境

Xcode 7.2
OS X 10.11.1

## URLのパーセントエンコード

[URL Session Programming Guide：Encoding URL Data](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/URLLoadingSystem/WorkingwithURLEncoding/WorkingwithURLEncoding.html#//apple_ref/doc/uid/10000165i-CH12-SW1)
の中で、URLのエンコードはこう実装するといいよ、と書いてあった

```
CFStringRef originalString = ...
 
CFStringRef encodedString = CFURLCreateStringByAddingPercentEscapes(
    kCFAllocatorDefault,
    originalString,
    NULL,
    CFSTR(":/?#[]@!$&'()*+,;="),
    kCFStringEncodingUTF8);
```

iOS8以降は、NSURLComponentsのqueryItemsを設定すると、
パーセントエンコードされた状態でクエリストリングが取得できると知った。

しかし、上記のドキュメントと同じようにエンコードされるわけではないらしく、ちょっとハマってました。。。

以下、expectaを使ったテストとその結果です。

- テストコード

```
    it(@"should encode URL data", ^{
        NSString *str = @":/?#[]@!$&'()*+,;=";
        NSURLComponents *components = [NSURLComponents componentsWithString:@"http://localhost"];
        components.queryItems = @[[NSURLQueryItem queryItemWithName:@"where" value:str]];
        expect([components URL]).to.equal(@"http://localhost?%3a%2f%3f%23%5b%5d%40%21%24%26%27%28%29%2a%2b%2c%3b%3d");
    });
```

- 結果

```
failed: 
expected: http://localhost?where=%3a%2f%3f%23%5b%5d%40%21%24%26%27%28%29%2a%2b%2c%3b%3d, 
got: http://localhost?where=:/?%23%5B%5D@!$%26'()*+,;%3D
```

ドキュメントにあったすべての文字がエンコードされていないようでした。
Rails | resque-scheduler を動かす最小手順

## 1. ジェムを追加する

お馴染みの Gemfile で。
resque 本体と resque-scheduler をインストールする。

```rb:rails_project/Gemfile
gem 'resque'
gem 'resque-scheduler'
```

```
$ bundle install
```


## 2. 処理内容をモデルに書く

**最終的にワーカーに実行させたい処理**を、モデルの perform メソッドの中に書く。
ここではテストとして、標準出力だけをする処理を作る。

```rb:rails_project/app/models/example.rb
class Example
  @queue = :default

  def self.perform
    p 'Hello Sword!'
  end
end
```

## 3. ワーカー用の設定を追加する

Rakefile に2行足すだけで良い。

```rb:rails_project/Rakefile
require 'resque/tasks'
require 'resque/scheduler/tasks'
```


## 4. resque 本体のワーカーを立ち上げる

まずは resque 本体のワーカーを起動する。
( resque-scheduler のものではない )

`$ TERM_CHILD=1 QUEUES=* bundle exec rake environment resque:work`

次のような状態になる。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/49a5866e-f661-1c41-37ce-714939fb233a.png)

これはいったん放っておいて次に進む。

## 5. resque-scheduler のワーカーを立ち上げる

**resque 本体のワーカーとは別に立ち上げる**必要がある。なので別ウィンドウで実行すること

`$ bundle exec rake resque:scheduler`

次のような状態になる。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/1976649b-186d-be69-35cd-a10d87dcae6b.png)

## 6. ジョブを登録する

さらに、**二つのワーカーとは別ウィンドウ**でジョブを追加してみよう。
つまり、ウィンドウを3つ使うことになる。

Rails のコンソールを使うのが手軽だ。

`$ bundle exec rails console`

```rb
irb(main)> Resque.enqueue_in(5.second, Example)

=> true
```

ちなみに、これは「今から5秒後にジョブを登録する」という意味だ。

## 6. ジョブが実行される

しばらく経ってから、**手順1**で立ち上げた、 resque 本体のワーカーを見てみよう。
**「文字列を標準出力する」**というジョブが実行されているのが分かるだろう。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/42e9db73-d77a-0fd8-a762-093e77a17cb5.png)

おめでとう！

# 環境

- resque-scheduler (4.0.0)
- resque (1.25.2)
- Rails 4.2.4



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
DeployGateへアップロードする際のAndroid versionCode

メモ書き程度に。

GradleでAPKファイルを作成し、アプリのアップロードテストをするためAndroidManifestのversionCodeを下記のようにして管理していた。
```lang:AndroidManifest.xml
android:versionCode="@integer/app_version_code"
```
この状態でDeployGateへアップロードしようとした場合、バイナリファイルとみなされずアップロードできなかった。
ちなみにadb installではインストールできた。

元々やりかたが間違っていたんだろうけど、別の管理方法考えないといけない。
Facebookで新たにスポットを追加する際に気をつけるべきこと

その日行ったスポットへのチェックインを自宅に帰ってから行う、ということがあるかと思いますが、操作を誤ると自宅の位置が流出してしまうということになりかねません。
そこで、そういった場合でも大丈夫なチェックインの方法をまとめたいと思います。

#前提
* チェックインしたいスポットがFacebookに登録されていない。
* 自宅等の位置情報が流出してはまずい場所からチェックインを行う。
* スマートフォンやタブレットのFacebook公式アプリからチェックインを行う。

#方法
1. チェックインしたい施設を検索し、『新しいスポットを追加』をタップします。![Screenshot_2016-01-27-10-49-43.png](https://qiita-image-store.s3.amazonaws.com/0/52291/14b63891-5b03-6079-3122-649646d584f2.png)
2. 追加するスポットのカテゴリを選択します。![Screenshot_2016-01-27-10-50-25.png](https://qiita-image-store.s3.amazonaws.com/0/52291/030b6678-a2ac-6e38-9567-478a82640d78.png)
3. 市町村を検索するか、赤枠部をタップします<br>(__『今ここにいます』は絶対にタップしないでください__)。![Screenshot_2016-01-27-10-50-43.png](https://qiita-image-store.s3.amazonaws.com/0/52291/5a837f38-eed4-dda2-d3d8-b189989438f2.png)
4. 追加するスポットの情報を入力し、『作成』をタップします<br>(__『今ここにいます』は絶対に選択しないでください__)。![Screenshot_2016-01-27-10-50-53.png](https://qiita-image-store.s3.amazonaws.com/0/52291/2416e6f6-ecd3-b699-7717-6dc8c99c864b.png)
Oracle 領域見積りシート　動作まで

# 概要
Oracleの領域見積りシートを使って 大まかな領域サイズの指針をだしたい
エクセルを開くと VBAコンバーター・・・・エラーが発生

# 環境
Windows7 sp1 32bit
Microsoft office 2010

# 手順
1. [Oracle領域見積りシート](http://otndnld.oracle.co.jp/deploy/maintenance/zip/est_tool.zip)ダウンロード
2. 解凍後 excelを開く
3. VBAコンバーター・・・エラーが発生
4. [VBAConverter入手](https://support.microsoft.com/ja-jp/kb/926430)より、修正プログラムのダウンロード
5. 修正プログラムを選択する 
　 Microsoft Office Excel 2007 English x86 MicrosoftOfficeVBAConvertersSigned を選択
　 メールアドレス記入
　 リクエストを送信する押下
6. メールが届くので、一番下に　**_ZIP.exeのリンクからファイルを入手
7. 421567_ENU_i386_zip.exeをダブルクリック
8. Microsoft Office VBA Converters = Signed.EXEを 解凍
9. vbacv10.dll・vbacv10d.dllとその他ファイルが展開される 
8. C:\Program Files\Common Files\microsoft shared\VBA\VBA7\直下に上のdllをコピー
9. 再度2に戻って、excelを開くと エラーが解消される

64bit環境の場合は Program Files(x86)?
pacemakerでsystemdリソースを設定

pacemakerのリソースエージェントを設定する際、ApacheやMySQLなどメジャーなものであればOCFで用意されているのでそちらを使うことが多いかと思いますが、比較的マイナーなソフトウェアや独自のスクリプトを使う際はこれまでLSBを利用していました。

### LSBとは？

LSBはLinux標準のinitスクリプトで、通常は`/etc/init.d/`配下に置かれます。
例えばLSBスクリプト(例として`crond`)をpacemakerにリソース登録する際、以下の通りにしていました。

```bash
$ pcs resource create crond lsb:crond params op monitor interval="10s" timeout="20s"
```

### CentOS7では？

ご存知の通り、CentOS7ではLSBではなく`systemd`によるサービス管理が標準となっています。
これをどうやってpacemakerで管理するかの情報が少なかったのですが、どうやらpacemakerは標準で`systemd`サービスをそのままリソース管理できるようです。

```bash
$ pcs resource create crond systemd:crond params op monitor interval="10s" timeout="20s"
```

これでCentOS6以前に作られたHA構成も引き継ぎやすいですね！
AsyncTask非同期処理後のコールバック機能

AsyncTask非同期処理が終了した、終了した後の処理がしたいとき用にコールバック機能を製造します。
技術者さんが作成されたものの引用ですが、元ネタが見つからないため、備忘録として投稿します。

#プログラム

```java:AsyckTaskを継承したクラス
public class AsyncTaskClass extends AsyncTask<Void, Void, String> {

    private CallBackTask callbacktask;
	
	@Override
	protected void onPreExecute() {
		super.onPreExecute();
	}
	
	
	@Override
	protected String doInBackground(Void... params) {
		String result = null;		
		return result;
	}
	

	@Override
	protected void onPostExecute(String result) {
		super.onPostExecute(result);
		callbacktask.CallBack(result);
	}
	
	
	public void setOnCallBack(CallBackTask _cbj) {
        callbacktask = _cbj;
    }
	
	
	/**
	 * コールバック用のstaticなclass
	 */
	public static class CallBackTask {
        public void CallBack(String result) {
        }
    }

}
```

使用するActivityクラスでインスタンス化とsetOnCallBackメソッドを生成します。

```java:MainActivity.class
public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

        AsyncTaskClass atClass = new AsyncTaskClass();
        atClass.setOnCallBack(new CallBackTask(){

			@Override
			public void CallBack(String result) {
				super.CallBack(result);
                // ※１
                // resultにはdoInBackgroundの返り値が入ります。
                // ここからAsyncTask処理後の処理を記述します。
                Log.i("AsyncTaskCallback", "非同期処理が終了しました。");
			}
			
		});

        // AsyncTaskの実行
        atClass.execute();
	}
}
```

非同期処理が終了したら※１にある処理が作動します。
フリックイベント機能

Androidで使用できるフリック機能の汎用プログラムです。

#フリック機能クラスのコード

```java:FlickChack.class
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public abstract class FlickCheck {
	
	public static final int LEFT_FLICK= 0;
	public static final int RIGHT_FLICK = 1;
	public static final int UP_FLICK = 2;
	public static final int DOWN_FLICK = 3;
	
	private float adjustX = 150.0f;
	private float adjustY = 150.0f;
	private float touchX;
	private float touchY;
	private float nowTouchX;
	private float nowTouchY;
	
	/**
	 * frickViewにはフリックを検知させるViewをセット<br/>
	 * adjustXには左右のフリック距離目安、adjustYには上下のフリック距離目安をセット
	 * @param frickView
	 * @param adjustX
	 * @param adjustY
	 */
	public FlickCheck(View frickView, float adjustX, float adjustY){
		
		this.adjustX = adjustX;
		this.adjustY = adjustY;
		
		frickView.setOnTouchListener(new OnTouchListener() {
			
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				switch (event.getAction()) {
			    case MotionEvent.ACTION_DOWN:
			    	touchX = event.getX();
			    	touchY = event.getY();
			        break;
			    case MotionEvent.ACTION_UP:
			    	nowTouchX = event.getX();
			    	nowTouchY = event.getY();
			    	check();
			    	v.performClick();
			        break;
			    case MotionEvent.ACTION_MOVE:
			        break;
			    case MotionEvent.ACTION_CANCEL:
			        break;
			    }
			    return true;
			}

		});
	}
	
	/**
	 * どの方向にフリックしたかチェック
	 */
	private void check(){
		Log.d("FlickPoint", "startX:" + touchX + " endX:" + nowTouchX
				+ " startY:" + touchY + " endY:" + nowTouchY);
		// 左フリック
    	if(touchX > nowTouchX)
    	{
    		if(touchX - nowTouchX > adjustX)
    		{
    			getFlick(LEFT_FLICK);
    			return;
    		}
    	}
    	// 右フリック
    	if(nowTouchX > touchX)
    	{
    		if(nowTouchX - touchX > adjustX)
    		{
    			getFlick(RIGHT_FLICK);
    			return;
    		}
    	}
    	// 上フリック
    	if(touchY > nowTouchY)
    	{
    		if(touchY - nowTouchY > adjustY)
    		{
    			getFlick(UP_FLICK);
    			return;
    		}
    	}
    	// 下フリック
    	if(nowTouchY > touchY)
    	{
    		if(nowTouchY - touchY > adjustY)
    		{
    			getFlick(DOWN_FLICK);
    			return;
    		}
    	}
	}
	
	/**
	 * 抽象メソッド：フリックを感知した際、方向を表す値をセットする
	 * @param swipe
	 */
	public abstract void getFlick(int swipe);

}
```

#使い方
上記クラスを作成したら、使用したいActivityでインスタンス化します。
・第一引数にはフリックイベントを実装するView（例はページ全体を設定）
・第二引数には横フリックを検知する距離（左右のフリック）
・第三引数には縦フリックを検知する距離（上下のフリック）


```java:MainActivity
View flickView = getWindow().getDecorView(); // Activity画面
float adjustX = 150.0f;
float adjustY = 150.0f;

new FlickCheck(flickView, adjustX, adjustY) {
			
			@Override
			public void getFlick(int flickData) {
				switch (flickData) {
				case FlickCheck.LEFT_FLICK:
					// 左フリック
					break;
					
				case FlickCheck.RIGHT_FLICK:
					// 右フリック
					break;
									
				case FlickCheck.UP_FLICK:
					// 上フリック
					break;
					
				case FlickCheck.DOWN_FLICK:
					// 下フリック
					break;
				}
			}
		};
```

インスタンス化後、例のように抽出メソッドのgetFlick(int flickData)で分岐処理を行ってください。

#注意点
処理は左右のフリックが優先されます。
インスタンス化する際、引数に設定する「adjustX」の距離が短いと、「adjustY」の検知がされない場合があるので適度な距離を設定してください。
Nodejsよく使うライブラリーまとめ（メモ）

```js
var expressValidator = require('express-validator');
var session = require('express-session');
var messages = require('express-messages');
var flash = require('connect-flash');
var passport = require('passport');
var localStrategy = require('passport-local').Strategy;
var async = require('async');
var mongo = require('mongodb');
var mongoose = require('mongoose');

mongoose.connect('mongodb://localhost/elearn');
var db = mongoose.connection;


***// Express Session***
app.use(session({
    secret: 'secret',
    saveUninitialized: true,
    resave: true
}));


***// Express Validator***
app.use(expressValidator({
  errorFormatter: function(param, msg, value) {
      var namespace = param.split('.')
      , root    = namespace.shift()
      , formParam = root;

    while(namespace.length) {
      formParam += '[' + namespace.shift() + ']';
    }
    return {
      param : formParam,
      msg   : msg,
      value : value
    };
  }
}));


***// Connect-Flash***
app.use(flash());
app.use(function (req, res, next) {
  res.locals.messages = require('express-messages')(req, res);
  next();
});
```
Slim で動的に HTML の class を変えたいとき


たとえば、こんなことをやりたいとき


```rb
table
  thead
    tr
      th name
      th age
  tbody
    - @users.each do |u|
      - if u.age >= 20
        tr.info
          td = u.name
          td = u.age
      - else
        tr.danger
          td = u.name
          td = u.age
```

これは、ダサいですね。

こう書くと、ちょっとクールですね。

```rb
table
  thead
    tr
      th name
      th age
  tbody    
    - @users.each do |u|
      - klass = (u.age) >= 20) ? 'info' : 'danger'
      tr class="#{klass}"
        td = u.name
        td = u.age
```

もっとよい書き方ありそう。
class の条件が増えていったら大変そうだ。
ansible でファイルがある場合のみ実行したい場合のベストプラクティス

ファイルが存在する場合にのみ実行する方法はいくつかあるかと思いますが、
個人的にベストと思える方法を紹介します。

### ◆ファイルがローカルにある場合

ローカルにある設定ファイル等で動作を変えたい場合や、ローカルに対してプロビジョニングしたい場合の方法です:

```yaml:tasks
- debug: msg="{{item}}"  # 実行したいコマンド
  with_first_found:
    - files: これがあれば実行したいというパス
      skip: true
```

これで、ファイルがあれば実行され、無ければスキップされます。

なお、次のようにすると、優先順位順にファイルを探すこともできます:

```yaml:tasks
- debug: msg="{{item}}"  # 実行したいコマンド
  with_first_found:
    - files:
        - これがあれば実行したいというパス1
        - これがあれば実行したいというパス2
        - これがあれば実行したいというパス3
      skip: true
```

また、`skip: true` を取り除けば、いずれのファイルもない場合にエラーにできます。

（[namutaka](http://qiita.com/namutaka) さんから2.x以降の仕様変更についてご指摘があり、反映させていただきました。ありがとうございました。）

### ◆ファイルがリモートにある場合

プロビジョニング先のサーバにあるファイルの有無で動作を変えたい場合の方法です:

```yaml:tasks
- stat: path=これがあれば実行したいというパス
  register: stat
- debug: msg="file is found"  # 実行したいコマンド
  when: stat.stat.exists
```

なお、次のようにすると、優先順位順にファイルを探すこともできます:

```yaml:tasks
- shell: |
         ls これがあれば実行したいというパス1 || \
         ls これがあれば実行したいというパス2 || \
         ls これがあれば実行したいというパス3
  register: register
  changed_when: false
  failed_when: false
- debug: msg="{{register.stdout}}"  # 実行したいコマンド
  when: register.stdout  # ファイルが無かったらスキップ
```

また、`failed_when: false` と `when: register.stdout` を取り除けば、いずれのファイルもない場合にエラーにできます。


### ◆

なお、 [ngyuki](http://qiita.com/ngyuki) さんのコメントを受けて、修正させて頂きました。

どなたか、さらに良い方法をご存知でしたら、ぜひコメント下さい！
c++ builder XE4, 10.2 Tokyo > Form > 最小化はしたい / 最大化は使用不能に > BordersIcons > biMaximize = false

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

フォームの最小化を利用したいが、最大化はしたくない。

http://homepage1.nifty.com/MADIA/delphi/delphi_bbs/200110/200110_01100012.html

> form のプロパティの　BorderIcons の　biMaxmize をfalseにしてみては

biMaximizeをfalseにすることで、最大化を使用不能にできた。
javaFxでリクエストをサーバーに送信する方法

JavaFxからサーバーにリクエストを送信する方法です。
csvをサーバーにアップロードするサンプルコードを作成しました。

## 基礎知識/javaFx - Swingとの違い(fxmlを使わない場合)
・画面作成する分には基本的には似たような実装ができます。
・SwingではアクションIDを設定しアクションリスナでIDごとの振り分けを行う必要
がありますが、
　javaFxならsetOnActionメソッドで処理を記述できます。
・Swingにはダイアログを表示するUtilがあるがjavaFxにはなかったのですが、
javaFX 8u40から追加されました。
なのでSwingのアクション周りが書きやすくなったという感じでしょうか。

## 基礎知識/javaFx - fxmlとは
・xmlのタグ形式でGUIを作成することができます。
・javaでいちいちボタンなどの部品を作っていくより個人的には楽です。
・fxmlがViewになりXXXControlerがControlerになるのでうごきがわかりやすい。
fxmlを使うことで格段にGUIが書きやすくなります。

## 処理の流れ
window上に"csv選択"と表記されるボタンを設置しています。
onAction="#csvChoose"と定義しているのでこのボタンが押下されるとコントローラ
(FxmlWindowControl.java)のcsvChooseメソッドが呼ばれます。

```MainWindow.fxml
<Button onAction="#csvChoose"
                  text="csv選択" prefWidth="45.0"
                  AnchorPane.topAnchor="85.0"
                  AnchorPane.leftAnchor="10.0" />
```

csvChooseメソッド内ではまずwindow上にファイルチューザを表示します。

```FxmlWindowControl.java
       Button button = (Button) event.getTarget();
       Window window = button.getScene().getWindow();
       FileChooser fileChooser = new FileChooser();
       fileChooser.setTitle("Open Resource File");
       fileChooser.getExtensionFilters().addAll(
               new ExtensionFilter("Comma-Separated Values Files",
"*.csv"));
```

ユーザがファイルを選択するとファイルデータをFormDataMultiPartに格納します。

```FxmlWindowControl.java
       File selectedFile;
       selectedFile = fileChooser.showOpenDialog(window);
       MultiPart multipart = new FormDataMultiPart();
       multipart.bodyPart(new FileDataBodyPart("file", selectedFile,
MediaType.APPLICATION_OCTET_STREAM_TYPE));
```

そしてサーバーに送信！

```FxmlWindowControl.java
       Client client = ClientBuilder.newClient();
       client.register(MultiPartFeature.class);

client.target("http://localhost:8080/api/csv/upload").request().post(Entity.
entity(multipart, MediaType.MULTIPART_FORM_DATA_TYPE));
```
##まとめ
ソースは<a href = "https://github.com/seki-seki/sample-javaFx"
https://github.com/seki-seki/sample-javaFx</a>にあります。
サーバー編は次回記述します。
コマンドラインから「パスワードは、複雑さの要件を満たす必要がある(Password must meet complexity requirements)」ポリシーを無効にする

# 背景

近頃のWindows Serverは、既定で「パスワードは、複雑さの要件を満たす必要がある」ポリシーが有効になっていて、単純な英字だけのパスワードなどを設定できません。Hyper-Vも同様です。

GUIがあればgpedit.mscから変更できますが、Hyper-VはGUIがないのでコマンドラインから作業する必要があります。

# 作業手順

seceditというコマンドを使います。ポリシー全体をファイルから読み込んであげるという使い方しかできないそうです。 :frowning: 

## 1. 現在の設定をエクスポートする

```cl:
secedit /export /areas SECURITYPOLICY /cfg export.inf
```

export.infというファイルに現在の設定をエクスポートします。

## 2. ファイルを変更する

System AccessというセクションにPasswordComplexityという行があるので、値を1から0に変更します。

変更前：

```ini:
[System Access]
PasswordComplexity = 1
```

変更後：

```ini:
[System Access]
PasswordComplexity = 0
```

## 3. 変更したファイルを読み込む

```cl:
secedit /configure /db tmp.sdb /areas SECURITYPOLICY /cfg export.inf
```

以上です。 :smile: 

# 参考

- [secedit コマンドによるローカルセキュリティポリシーの操作](http://orebibou.com/2013/09/secedit-%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AB%E3%82%88%E3%82%8B%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC/)
- [Windowsコマンド集](http://itpro.nikkeibp.co.jp/article/Windows/20051013/222731/)
Wordpressの一般ユーザーは管理者ページをアクセス禁止に

```php
/*-----------------------------------------------------------------------------------*/
/*	管理者ページをアクセス禁止に
/*-----------------------------------------------------------------------------------*/
function subscriber_go_to_home( $user_id ) {
	$user = get_userdata( $user_id );
	if ( !$user->has_cap( 'edit_posts' ) ) {
		wp_redirect( get_home_url() );
		exit();
	}
}
add_action( 'auth_redirect', 'subscriber_go_to_home' );
```
Wordpressで予約投稿設定した記事の404エラー

/*---------------------------------------------------*/
/* Problem with Facebook cache: Page not Found on future posts in Wordpress
/*---------------------------------------------------*/

// Register action for post status transitions
```
add_action( 'transition_post_status' , 'purge_future_post', 10, 3);
```
// Check if the new transition is publish, for correctness you could check if $old_status == 'pending', but I want that every post (which is published) is cached again (just to be sure). 
```
function purge_future_post( $new_status, $old_status, $post ) {
    if($new_status == 'publish') {
        purge_facebook_cache($post);
    }
}
```
// Ping Facebook to recache the URL.
```
function purge_facebook_cache($post_id) {
    $url = get_permalink($post_id);
    $fb_graph_url = "https://graph.facebook.com/?id=". urlencode($url) ."&scrape=true";
    $result = wp_remote_post($fb_graph_url);
}
```
時刻計算

```php
/*-----------------------------------------------------------*/
/*	時刻計算
/*-----------------------------------------------------------*/
function day_diff($date1, $date2) {
 
    // 日付をUNIXタイムスタンプに変換
    $timestamp1 = strtotime($date1);
    $timestamp2 = strtotime($date2);
 
    // 何秒離れているかを計算
    $seconddiff = abs($timestamp2 - $timestamp1);
 
    // 日数に変換
    $daydiff = $seconddiff / (60 * 60 *24);
 
    // 戻り値
    return $daydiff;
 
}
```
Win10へのアップデート出ないようにする

タスクマネージャでGWX.exeのプロセス終了
KB3035583
KB2952664
KB2990214
![2016-01-27 10.51.48.jpg](https://qiita-image-store.s3.amazonaws.com/0/82956/a932e589-1171-5e43-fe68-5cc9609391a7.jpeg)

![2016-01-27 10.51.53.jpg](https://qiita-image-store.s3.amazonaws.com/0/82956/d04bdf32-98a1-885a-6e6f-39284a285d58.jpeg)

※おせっかいファイルが４つも増えた！
オープンソースのデータ可視化ツールのre:dashでらくらく分析共有 その２ 〜 グラフ編

* [オープンソースのデータ可視化ツールのre:dashでらくらく分析共有 その１ 〜 インストール編](http://qiita.com/wapa5pow/items/9e3feb19c0e7c80476d0#_reference-a6d2407ea33d8742da0d)
* [オープンソースのデータ可視化ツールのre:dashでらくらく分析共有 その２ 〜 グラフ編](http://qiita.com/wapa5pow/items/1455222b519946dc16db)
* [オープンソースのデータ可視化ツールのre:dashでらくらく分析共有 その３ 〜 Google Spreadsheets編](http://qiita.com/wapa5pow/items/312686403700a8e454df)
* [オープンソースのデータ可視化ツールのre:dashでらくらく分析共有 その４ 〜 pivot table編](http://qiita.com/wapa5pow/items/0d7ab1735ba4137f141c)

前回はre:dashのインストール方法を紹介したので次はビジュアライゼーションの種類を紹介します
前回でインストールしたデータセットを使います。

# 線グラフ

SQLクエリ

    select date(payment_date), sum(amount) from sakila.payment group by date(payment_date)
    
グラフ

![re_dash___New_Query.png](https://qiita-image-store.s3.amazonaws.com/0/30079/a27b8772-7407-b261-b1fd-3c75161b640c.png "re_dash___New_Query.png")

# 棒グラフ

SQLクエリ

    select * from Country

![re_dash___New_Query.png](https://qiita-image-store.s3.amazonaws.com/0/30079/97413838-4a75-cf3f-5c23-2dca946a59fe.png "re_dash___New_Query.png")

![re_dash___New_Query.png](https://qiita-image-store.s3.amazonaws.com/0/30079/aa9a1957-d78a-de5f-1a0f-ace026810bd4.png "re_dash___New_Query.png")

stackにしないとおかしな値になる

* re:dashの改善点
    * 人口が多いところから左に並べたい

# エリアグラフ

skip

# パイチャート

SQLクエリ

    select * from Country

グラフ

![re_dash___New_Query.png](https://qiita-image-store.s3.amazonaws.com/0/30079/aa8537d8-f348-7dd3-3a7b-eceff39d530c.png "re_dash___New_Query.png")

# 散布図

SQLクエリ

    select * from Country

グラフ
![re_dash___New_Query.png](https://qiita-image-store.s3.amazonaws.com/0/30079/661d81ef-91a6-0ca7-b513-14eaac8fb0e7.png "re_dash___New_Query.png")


# コホート

リテンションなどを見れます

スクショは[デモ](https://demo.redash.io/queries/67#84)ページからです

![re_dash___Cohort_Example.png](https://qiita-image-store.s3.amazonaws.com/0/30079/c2cf3d77-52ae-6f04-46e3-d8f084a088db.png "re_dash___Cohort_Example.png")

# カウンター

目標と実績を比較するのに使えそうです

SQLクエリ

    select * from Country

グラフ

![re_dash___New_Query.png](https://qiita-image-store.s3.amazonaws.com/0/30079/f5ed6c78-3b29-f447-33ee-8230d0372423.png "re_dash___New_Query.png")

# まとめ

いろいろなグラフを出してみました。
正直、Tableauと比べるといろいろ足りていないところはあるのですが、無料でブラウザを使ってチームと共有できるのは価値があるなと思います。

自分だったら初動の分析は、Tableauで行い、チームに共有したいものができたらre:dashにのっけるというのがよさそうです。

または、チームの目標値などをつねにここで管理して、MTGでみるというのもいい使い方かなと思います。
RabbitMQで、AWSとかでIPアドレスを変更されるとユーザ・vhostが消える対応

## AWSとかでIPアドレスを変更されるとユーザ・vhostが消える対応

### 現象
* AWSとかでRabbitMQをインストールしたインスタンスをAMI化、そのAMIを元にインスタンスを作るとあったはずのユーザやvhostが消えている

```shell-session:作成時点はvhost(/production)が存在
$ sudo /usr/sbin/rabbitmqctl list_vhosts
 Listing vhosts ...
 /
 /production
 ...done.
```
```shell-session:AMIからインスタンスを作るとvhostが消滅
$ sudo /usr/sbin/rabbitmqctl list_vhosts
 Listing vhosts ...
 /
 ...done.
```

### 原因

* RabbitMQサーバーのIPアドレスが変わったため
 * RabbitMQのユーザやvhostはRabbitMQのNODENAMEに依存している
 * デフォルト値のNODENAMEは```rabbit@<hostname>```となる
 * AWSの場合、ホスト名はIPアドレスから作成される（例：IPアドレス = 10.1.0.20の場合、ホスト名 = ip-10-1-0-20）
 * その為、IPアドレス = 10.1.0.20の場合、NODENAMEは```rabbit@ip-10-1-0-20```となる
 * ホスト名が途中で変わるとホスト名を元にしていたNODENAMEと不整合が発生し、ユーザ・vhostが消失する


### 対策

* RabbitMQの設定ファイルでNODENAMEをホスト名(=IPアドレス)に依存しない名前に明示的に指定する

``` /etc/rabbitmq/rabbitmq-env.conf
NODENAME=rabbit@localhost
```
* 設定したら再起動。このとき、当然ユーザ・vhostは消えるので注意すること。なのでインストール時に設定したほうがよい。
【連載01】205.SELinuxを無効化する【Ansible SELinuxモジュール】

<b><font color="#ff6633">当記事はケーススタディの連載となっています。目次は[【こちら】](http://qiita.com/CsFactoryitter/items/6b8308b96afafd61ce5f
)です。</font></b>
<b><font color="#ff6633">最新のソースコードは[【GitHub】](https://github.com/csfactorygihubblog001/blogansible)で公開中です。</font></b>
サーバの責務は<b>[こちら](http://qiita.com/CsFactoryitter/items/032cc339048e52ee3586)</b>で確認ください。

##1.SELinux無効化概要
SELinuxを無効化する。

![image](https://qiita-image-store.s3.amazonaws.com/0/98085/3b1332f2-a8c0-53ba-7268-53df719167c3.png)

##2.playbookファイルの相関

![image](https://qiita-image-store.s3.amazonaws.com/0/98085/6a69696b-0765-f1dd-6b48-cda30a0fdbb3.png)

##3.playbook(site.yml)
${ANSIBLE_HOME}/site.yml
[メインとなるplaybook(site.yml)](http://qiita.com/CsFactoryitter/items/3112c6d504d3b5a58011#3%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%A8%E3%81%AA%E3%82%8Bplaybooksiteyml)参照

##4.SELinux無効化用のplaybook(/operations/0021_selinux.yml)
${ANSIBLE_HOME}/operations/0021_selinux.yml

```yaml:
# ===================
# SELinuxを無効化する(selinux.yml)
# ===================
# ===================
# すべてのサーバのSELinuxを無効化する
# ===================
- hosts: all
  sudo: no
  remote_user: root
  tasks:
 
    - name: SELinuxのDisable設定
      selinux: state=disabled
```

<dl>
<dt><font color="#0066ff">【SELinuxモジュール】SELinuxの無効化設定</font></dt>
<br>
<dd>selinuxモジュールを使用する。</dd>
</dl>

書式:
>selinux: state=${enforcing または permissive またはdisabled}

|state|状態|
|:------|:------|
|enforcing|アクセス制限有効|
|permissive|警告はするがアクセス制限はしない|
|disabled|無効化する|

例：
SELinuxを無効化する。

```yaml:
selinux: state=disabled
```

disable設定はLinux上でsetenforceコマンドでラベル付けはできない。
Ansibleも同様に起動時に無効化設定されるため、次の章ではAnsibleにて再起動する。

※Ansible（Python）でSELinuxの操作をするにはlibselinux-pythonパッケージが必要。
今回は「[yumにて必要なライブラリ／ミドル／ソフトウェアをインストールする](http://qiita.com/CsFactoryitter/items/1b7e6138197e2c58b719)」にて先にインストールしているが、本来であればincludeしたファイル単位で冪等性を維持しつつ、凝縮度の高いplaybookを作った方が独立性が高くなる。
その場合先にyumモジュールを使用してlibselinux-pythonをインストールしておくとよい。

```yaml:
  tasks:
#▼ここに追加
    - name: Install libselinux-python
      yum: name=libselinux-python state=present
#▲
 
    - name: SELinuxのDisable設定
      selinux: state=disabled
```

次回は「[SELinux設定Diabledを適用する為サーバを再起動する【Ansible 非同期処理】](http://qiita.com/CsFactoryitter/items/411f9a2da528b0c9dd7f)」について。

<b><font color="#ff6633">連載の目次は[【こちら】](http://qiita.com/CsFactoryitter/items/6b8308b96afafd61ce5f
)です。</font></b>
Sidekiq で queue に入った job を手動で削除する

通常必要になることは無いと思いますが、イレギュラーの運用において実行するハメになることがあります :cry: 

公式でも https://github.com/mperham/sidekiq/wiki/API#queue ここにしっかり書いてあります。

## 前提

説明をしやすくするために、今回は以下のように Sidekiq の Worker を呼び出すときに、１つの ID のみを渡していることを想定します。

```rb
SampleWorker.perform_async(123456789)
```

また、queue はデフォルトを利用するという前提です。

```rb
class SampleWorker
  include Sidekiq::Worker

  # 以下のように queue を default 以外を利用する場合は以下の説明もそれに読み替えてください。
  # sidekiq_options queue: :sample_worker

  def perform(id)
    # id 使って DB からデータ読み出したりして処理する想定
  end
end
```

## 削除方法

```rb
# 削除したい id を Worker
deletion_target_id = '12345678'
worker = 'SampleWorker'

queue = Sidekiq::Queue.new('default') # default 以外なら queue 名を指定

queue.each do |job|
  next unless job.klass == worker # job['class'] でも同じ
  next unless job.args.first == deletion_target_id # args は peform_async に引数が配列で入っている

  job.delete
end
```

`Sidekiq::Queue` は `Enumerable` を実装しているので、

```rb
queue.find {|job| ... }.delete
```

でも十分です。

### もしも jid を保持しているなら

Sidekiq は全ての job に `jid` という id をふっています。

```rb
> SampleWorker.perform_async(1)
=> "66ede9dfdd7a2d668ccd501e"
```

現在は `item['jid'.freeze] ||= SecureRandom.hex(12)` のような実装なので、特に引数には依存せず生成されます。
https://github.com/mperham/sidekiq/blob/master/lib/sidekiq/client.rb#L214

もしこれを保持しているならば、以下で済ませられます。

```rb
Sidekiq::Queue.new('default').find_job(jid)
```

ただ、内部的には `Enumerable#detect` を利用しているだけなので速度としては変わりません。

これは、`Sidekiq` の `Queue` は Redis の Lists が使われているのですが (`perform_in` の場合は Sorted Sets) 、引数も jid もまとめて Lists の値として入っているので、`jid` で取り出すからといって有利になる訳ではないからです。

Redis を monitor していると以下のようなコマンドが流れるのが観測できます。

```
"lpush" "queue:default" "{\"class\":\"SampleWorker\",\"args\":[2],\"retry\":5,\"queue\":\"default\",\"jid\":\"66ede9dfdd7a2d668ccd501e\",\"created_at\":1453850411.437477,\"enqueued_at\":1453850411.437571}"
```

#### 注意点

ドキュメントにも書かれていますが

```
Find a job by JID (WARNING: this is very inefficient if your queue is big!)
```

queue のサイズが大きくなると jid での検索であろうがなかろうがとても遅いです。each のたびに Redis に問い合わせ、`Sidekiq::Job` オブジェクトに変換して返しているためだと思います。

each の実装はこの辺です。
https://github.com/mperham/sidekiq/blob/master/lib/sidekiq/api.rb#L230-L249

### (Sidekiq 自体) / (Sidekiq への登録処理)を停止して削除を行うべきか？

`perform_async` の場合は Redis の Lists を利用し、Sidekiq が fetch する際もブロッキング pop (brpop) を利用するため、仮に Sidekiq が動作していたとしても削除自体は安全に行われることになると思いますが、`each` の実装を見てもらってわかる通りで、ページングしつつ range で取得しているだけなので、Lists のサイズがどんどん変わっていくと、期待通りのチェックができなさそうです。

「数件削除するだけ」程度なら再実行も楽なのでいいですが、大量に削除するような場合には、Sidekiq 関連の処理は停止してから行う方が望ましいように感じます。

## Pro API を使う

Pro をお使いの場合は以下の API が Lua ベースで提供されており、高速なようですね。

https://github.com/mperham/sidekiq/wiki/Pro-API

- `Sidekiq::Queue#delete_job`
- `Sidekiq::Queue#delete_by_class`
- `Sidekiq::JobSet#find_job(jid)`

> ということは、Pro 版は Lists を使っていないか、他の型と組み合わせているのかな。
MongoDBコマンド集

下記のサイトを参考にした。
http://qiita.com/yuiseki/items/1c656d6bab0307e1510c
http://qiita.com/svjunic/items/285e9cf20169d70aa1fa
http://salvador.hatenablog.jp/entry/2013/09/29/145920

使えるコマンド群
mongo
mongo IPアドレス
show dbs
use dbName
db.createCollection('members');
db.members.drop();
db.members.count()
db.members.find({}, {"_id":false, "title":true}).limit(10)
技術英語 > the markets are very good at delivering a specific commodity [at the lowest possible cost]. / I will put my best foot forward.

@ LOE > October 12, 2012

http://loe.org/shows/shows.html?programID=12-P13-00041
>  the markets are very good at delivering a specific commodity <font color=red>at the lowest possible cost</font>. 

possibleがつくことで強調されている感じがする。

<hr>
関連して思い出したのは

> I will put my best foot forward. 

「がんばります」という意味で I will do my best. と同義だったと思う。

http://ejje.weblio.jp/content/best+foot+forward

良い足を前に出す、という言い方が印象的で覚えた。
UIButtonなどの角を丸くする方法


デフォルトではボタンの角が四角なため、丸くします。

```ViewController.swift
class ViewController: UIViewController {

	var tapButton: UIButton = UIButton()//角を丸くするボタン
	
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let height = self.view.frame.height
        let width = self.view.frame.width
	
		tapButton.frame = CGRect(x: 0, y: CGRectGetMinY(myLabel.frame), width: width / 4, height: height / 6 - 10)
        tapButton.backgroundColor = UIColor.grayColor()
        tapButton.layer.position.x = (width / 4) * 3
 
        // 以下2行が丸くする処理       
        tapButton.layer.cornerRadius = 20.0 //どれくらい丸くするのか
        tapButton.layer.masksToBounds = true //viewに丸くする許可を出す
        
        //tapButtonの表示
        self.view.addSubview(tapButton)
    }
firewalld初心者のメモ


これはfirewalld初心者の学習メモです．

* firewalldではNIC単位で火壁を設定する．
* デフォルト値から変更した設定は/etc/firewalld内のxmlファイルに書かれる．
* ユーザー設定のxmlに異常があるとき/usr/lib/firewalld内のデフォルト設定が使用される．
* デフォルトでeth0はpublicゾーンが設定されている．

![Kobito.LhFicm.png](https://qiita-image-store.s3.amazonaws.com/0/65106/05ccedb1-f829-00e8-7127-eff5a1be5585.png "Kobito.LhFicm.png")
フィルタリングイメージ図

Commands
---------
現在の設定をみる
`firewall-cmd --zone=public --list-all`

service sshをpublicから外す
`firewall-cmd --zone=public --remove-service=ssh --permanent`

ping応答しない
`firewall-cmd --zone=public --add-icmp-block={echo-request,echo-reply,timestamp-reply,timestamp-request} --permanent`

複数の条件でフィルタリング
`firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" service name="ssh" accept' --permanent` 

`firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" service name="samba" accept' --permanent`

`firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" port port="22" protocol="tcp" accept'`

設定を反映する
`firewall-cmd --reload`

NICのゾーン変更
`firewall-cmd --zone=work --change-interface=eth0 --permanent`


* デフォルトゾーン(public)設定を操作するするときは"--zone=public"は省略可能
* "--permanent"を付けなければ即時に設定が反映されるが再起動もしくは"--reload"した時には設定から外れる




IPマスカレード
------------
`firewall-cmd --zone=public --add-masquerade --permanent`
`firewall-cmd --zone=trusted --add-masquerade --permanent`
`firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE`
`firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i tun0 -o eth0 -j ACCEPT`
`firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i eth0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT`


NFQUEUE
------------
`firewall-cmd --zone=public --permanent --direct --add-rule ipv4 filter OUTPUT 0 -d 8.8.8.8 -j NFQUEUE --queue-num 1`

`firewall-cmd --zone=public --permanent --direct --add-rule ipv4 filter FORWARD 0 -i enp5s0 -j NFQUEUE --queue-num 1`


ダイレクトルールの一覧表示
-----------------------
`firewall-cmd --direct --get-all-rules`

ssh ポート番号変更
-------------
`cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh.xml`
`vi /etc/firewalld/services/ssh.xml`



参考文献
--------
* [CentOS7 firewalldの設定] (http://www.unix-power.net/centos7/firewalld.html)
* [CentOS7.1 64bit firewalldによるアクセス制御] (http://www.kakiro-web.com/linux/firewalld.html)
* [firewalldでの複数の条件を組み合せたルールの作成] (http://dan-project.blog.so-net.ne.jp/2015-09-13-1)
*  [Firewalld : IPマスカレードの設定] (https://www.server-world.info/query?os=CentOS_7&p=firewalld&f=2)
* [ダイレクトルールを使ったFirewallの強化] (http://www.yam-web.net/centos7/direct-rule/index.html)
* [Firewalld Rich and Direct Rules: Setting up RHEL 7 Server as a Router](https://www.lisenet.com/2016/firewalld-rich-and-direct-rules-setup-rhel-7-server-as-a-router/)
バッククォートの出し方 Mac 日本語キーボード

qiitaでのコードハイライトでも使うバッククォートの出し方がわからなかったので調べた．
#Mac日本語キーボードを使ってバッククォートの出し方
SHIFT + @で出る
#参考
http://www.luck2.co.jp/2691.html
CakePHP: formのinput要素にautofocusさせる

#やりたいこと
CakePHP2.7を使うときに，
フォームのinput要素に対して画面遷移されたあとから，選択された状態にしたい（autofocus）．
＊マウスクリックしてアクティブにするのがめんどくさい．
##コードと解説
```php
<?php
    echo $this->Form->create('Staff', array('action' => 'login'));
    echo $this->Form->inputs(array(
        'legend' => __(''),
        'username' => array('autofocus'=>'autofocus'),
        'password'
    ));
    echo $this->Form->end('Login');
?>
```
この例だと，usernameという名前の要素に対して，autofocusされる．
#参考
http://stackoverflow.com/questions/23986645/cakephp-form-input-autofocus
Rubyでインスタンスメソッドとクラスメソッドを同時にモジュール化する方法

多分1.9以前の古いRubyでは動かないんじゃないかなあ　と思います。
実行環境はRuby2.2.2

# 書き方
```ruby
# 今回使い回したいモジュール
module HogeModule
  # includeと書いた時点で呼び出される便利メソッド
  def self.included klass
    klass.include ::HogeModule::SpecificInclusion
    klass.extend  ::HogeModule::SpecificExtension
  end

  # インスタンスメソッドとして追加したいものを書く
  module SpecificInclusion
    def instance_method
      puts 'インスタンスメソッドだよ'
    end
  end

  # クラスメソッドとして追加したいものを書く
  module SpecificExtension
    def class_method
      puts 'クラスメソッドだよ'
    end
  end
end

# 上のモジュールを取り込みたいクラス
class MyAwesomeClass
  include HogeModule
end
```

# なんで必要になったか
Rubyは多重継承を認めない実装系なので、
**mix-inな書き方をしつつ同時にクラスメソッドとインスタンスメソッドを定義したいときに便利です。**
（例えば、カプセル化した機能がクラスメソッドとインスタンスメソッドの両方から成り立つものだったりとか。）

こうすることで別々にinclude, extendしないといけない書き方を回避でき、
片方の呼び出し忘れによる事故を未然に防ぐことができます。

**実際にコードを使うタイミングだと、考えるべきことって少ないほうが幸せじゃん？**

## Before
```ruby 
class MyLameClass
  include HogeModule::SpecificInclusion
  extend  HogeModule::SpecificExtension
end
```

### イケてない点
* なんか長い
* せっかくカプセル化するためにモジュールにまとめたのに、ここだけ別れる
* 片方だけ書き忘れたりしそう

## After
```ruby 
class MyAwesomeClass
  include HogeModule
end
```

### 注意点
* インスタンスメソッドとクラスメソッドが提供されたことがわからない


# 使い方
```ruby 
# クラスメソッドの呼び出し
MyAwesomeClass.instance_method

# インスタンスメソッドの呼び出し
MyAwesomeClass.new.class_method
```

# 注意点
この実装に限った話ではないですが、
Rubyのincludeとかextendってmix-inなので、基本的に上書き（オーバーライド）されてしまいます。

Railsとか使っていて、安易にidとかtypeってモジュールのメソッド名に使っていると、何気ないincludeが命取りになったりします。


# 思ったこと
Rubyの継承とかinclude, extend周り、よくできているなあとは思いつつ、
Rubyの他の部分と比べて、なんか覚えること多くねーか　ってのが率直な感想です。
やりたいことはシンプルなのにね。

特異◯◯　というのがそもそもなんとなく既に古くなりつつあって、情報がまとまっていない気がしているも、
それをうまく説明してくれるサイトというのもあんま無い気がします。
（C++とかJavaのstaticとかが分かっていれば話は早いんですが。）

Railsに合わせつつうまく拡張する方法とか、暇があれば紹介しようかな　と。

他にいい表現とか、リスクとか見つけた人はコメント貰えると喜びます。
[編集中] Unbound の実装

※ まだ調査・検証・編集途中の内容です。誤りが含まれている可能性が高いためご注意ください。

# 要約
- socket周り(accept, listen)の実装を知りたいとき
    - "struct comm_point" (util/netevent.h) を見る
    - comm_point_create_[udp|tcp|udp_ancil|raw] で comm_point を作成
- 外部DNSサーバへの問い合わせの通信制御の実装を知りたいとき
    - "struct outside_network" (services/outside_network.h) を見る
- クライアントからのDNS問い合わせをどう扱うか知りたいとき
    - "worker_handle_request" (daemon/worker.c) を見る
    - DNS問い合わせが来た時に呼ばれるハンドラ
    - mesh_new_client でモジュールが実行され各プロトコルの処理が行われる
- 外部DNSサーバへの再帰問い合わせの実装を知りたいとき
    - "iter_handle" (iterator/iterator.c) を見る
    - DNS の再帰問い合わせをしながら状態遷移している
- 一連の処理の流れを"モジュール (struct module_func_block) "でまとめている
    - iterator, dns64, validator, pythonmod
    - 各モージュールはファクトリーメソッドパターンで利用する (module_factory)

# Unbound の主要な動作
- main
- ...
- run_daemon
- daemon_fork
    - メインスレッドはシグナルハンドリングとリモート・コントロールの制御
    - fork と言っているがプロセスは増えない(スレッドが生成されるだけ)
- daemon_setup_modules
    - modstack_setup
    - モジュール(再帰問い合わせはDNS64など一連のプロトコル群)の設定
    - 例：iterator (再帰問い合わせ) モジュールを使って名前解決する
- daemon_start_others
- ub_thread_create(thread_start)
- thread_start
- worker_init
    - listen する socket を作成 (listen_create)
    - 外部DNSへ通信する socket を作成 (outside_network_create)
    - worker->env.send_query = worker_send_query
- worker_handle_request
    - mesh_new_client でプロトコルの処理が走る

# 各ライブラリの実装

## services/
- daemon/* で #include <services/*> して使っている

### listen_dnsport.c
- listen_create
    - DNS query を listen する comm_point を作成する
    - UDP/TCP/SSL/UDPANCIL

### outside_network.c
- outside_network_create
    - 引数が大変にあれ

## util/
### netevent.c
- accept_open
    - open accept commpoint
    - comm_point_create_raw() 経由で comm_point_perform_accept() を呼んでいる
- comm_point_perform_accept
    - accept() して、file descriptor を return

### netevent.h
- struct comm_point
    - Communication point to the network

## daemon/
### remote.c
- remote_accept_callback
    - accept 相当(comm_point_perform_accept)

### unbound.c
- run_daemon
    - daemon_open_shared_ports

### daemon.c
- daemon_open_shared_ports
    - DNSサーバへの問い合わせ通信に利用するポートをopenする

# Memo
- mesh_run で module の operate を実行している

## モジュールの設定
- modstack_init
- modstack_setup
- modstack_desetup

# Todo
- 図を書く
WebGLのフラグメントシェーダを使ったミラーボール投影

#はじめに
冬休みにThetaの360°画像にぼかしを入れるWebアプリ[SphereBlur.com](https://sphereblur.com)を[作った](http://qiita.com/horo/items/abb8bf40c23b21ce6e5b)際に、どのように360°写真を表示するのか悩んだ。編集ツールなので、引いた画面ではできるだけ広い範囲を表示したいが、単純に球体にテクスチャを貼り付けて、透視投影や平行投影をしても半球までしか表示できない。いろいろ悩んでいたら、どこかで見たこの絵
[![Hand with Reflecting Sphere](https://upload.wikimedia.org/wikipedia/en/6/66/Hand_with_Reflecting_Sphere.jpg)](https://en.wikipedia.org/wiki/Hand_with_Reflecting_Sphere)
を思い出して、おおっ！これだっ！って思ったけど、後で調べたらTHETAのAndroid/iOSアプリの表示はミラーボール投影というものらしい・・・VR業界では常識なのかな？

#テクスチャを使ったミラーボール投影
というわけで、[three.js](http://threejs.org/)の[このサンプル](http://threejs.org/examples/webgl_materials_cubemap_balls_reflection.html)を参考にしてミラーボールの環境マッピングを試してみた。しかしこの場合、ポリゴンで構成された球、つまり多面体で反射した景色なので、ズームして回転した際にどうしても歪みが気になってしまう。そこで、自前でWebGLのフラグメントシェーダを書いてみることにした。

#デモ
https://horo-t.github.io/tmp/20151225/mirror_ball_view.html

#計算
ミラーボール反射はどうやって計算するのか考えてみる。
![m1.png](https://qiita-image-store.s3.amazonaws.com/0/110601/a6fcefb9-6f14-0875-fc4d-807b49c38c31.png)

図のように原点Oと視点Aの距離を$OA=1$と固定し、ミラーボールの半径をrとした場合を考え、原点Oからdの距離にある点Dとし、$\overrightarrow{AD}$方向の視線にどの方向からの光が反射するか($\overrightarrow{BR}$)を求めるために、まず$\alpha$を求める。

```math
CB:OD=CA:OA
```

なので、

```math
\begin{align}
\frac{CB}{OD}&=\frac{CA}{OA}\\
\frac{r \sin{\alpha}}{d}&=\frac{1-r\cos{\alpha}}{1}\\
r\sin{\alpha} + rd\cos{\alpha}&=d\\
\frac{1}{\sqrt{1+d^2}}\sin{\alpha}+\frac{d}{\sqrt{1+d^2}}\cos{\alpha}&=\frac{d}{r\sqrt{1+d^2}}\\
\cos{\beta}\sin{\alpha}+\sin{\beta}\cos{\alpha}&=\frac{d}{r\sqrt{1+d^2}}\\
\sin{(\alpha+\beta)}&=\frac{d}{r\sqrt{1+d^2}}\\
\cos{(\alpha+\beta)}&=\frac{\sqrt{r^2+r^2d^2-d^2}}{r\sqrt{1+d^2}}
\end{align}
```
ここから$\sin{\alpha}$、$\cos{\alpha}$を求めると、

```math
\begin{align}
\sin{\alpha}&=\sin{(\alpha+\beta-\beta)}\\
&=\sin{(\alpha+\beta)}\cos{\beta}-\cos{(\alpha+\beta)}\sin{\beta}\\
&=\frac{d}{r\sqrt{1+d^2}}\frac{1}{\sqrt{1+d^2}}-\frac{\sqrt{r^2+r^2d^2-d^2}}{r\sqrt{1+d^2}}\frac{d}{\sqrt{1+d^2}}\\
&=\frac{d(1-\sqrt{r^2+r^2d^2-d^2})}{r(1+d^2)}\\
\cos{\alpha}&=\cos{(\alpha+\beta-\beta)}\\
&=\cos{(\alpha+\beta)}\cos{\beta}+\sin{(\alpha+\beta)}\sin{\beta}\\
&=\frac{\sqrt{r^2+r^2d^2-d^2}}{r\sqrt{1+d^2}}\frac{1}{\sqrt{1+d^2}}+\frac{d}{r\sqrt{1+d^2}}\frac{d}{\sqrt{1+d^2}}\\
&=\frac{\sqrt{r^2+r^2d^2-d^2}+d^2}{r(1+d^2)}
\end{align}
```
$\alpha$の値が求まると、後は簡単で、求めたい方向$\frac{\overrightarrow{BR}}{|BR|}$は、法線ベクトル$\frac{\overrightarrow{OB}}{|OB|}$に対する$\frac{\overrightarrow{AB}}{|AB|}$の反射なので、

```math
\frac{\overrightarrow{BR}}{|BR|}=\frac{\overrightarrow{AB}}{|AB|}-2(\frac{\overrightarrow{AB}}{|AB|}\cdot\frac{\overrightarrow{OB}}{|OB|})\frac{\overrightarrow{OB}}{|OB|}
```
で求めることができる。
AWS Elastic Beanstalk のeb create コマンドでうまいことAWSアカウントを指定してくれるコマンド作った。


以下。
https://gist.github.com/YU81/371ee999e48d830de057
引数指定で ${HOME}/.aws/credentials (ini形式) を読んで、
アクセスキーとシークレットキーを読んでBeanstalkの環境変数にセットしたり、
デプロイ先のAWSアカウントを変えたりできる。
単純なeb create のラッパー。
ebコマンドについては以下。
http://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3.html
ダミーでSecurity GroupとかVPCとか指定しているので、よしなに変更されたし。

AWS使ってると、アカウントを開発と本番で分けたり、客先で分けたりみたいなのがあるので、
ローカルPCから操作するときめんどくさかったりする。
GUIでやってもいいけど、できるだけコード化した方が色々とうれしい。

あと、アプリケーションコードのリポジトリにアクセスキーやシークレットキーを埋め込んでいると、
大量のインスタンスを買われたりして大事故のもとなので、
こんな感じでローカルPCの環境変数経由で渡すのもひとつ。
埋め込みはプライペートリポジトリでもできれば避けたいし。
GUIでやっても（ｒｙ

ここまで書いて、eb コマンドは全て--profile オプションを受け付けるので、
デプロイ先のAWSアカウント指定についてはaliasで解決できるのではー、と気がついたりした……

```ShellScript
alias eb-account1=eb --profile account1
```

とかで。
Sketch3.5 で Content generator sketch plugin が動かない問題

Content-generator-sketch-pluginプラグインフォルダの `js/loadImage.js` を開き

```
[fill setPatternImage:image collection:coll]
````

の行を

```
//[fill setPatternImage:image collection:coll]
layer.style().fills().firstObject().setPatternImage( image );
layer.style().fills().firstObject().setPatternFillType(1);
```

に置き換えます。
続きまして ```Flickr Keywords.sketchplugin``` を開き

```
//replace: [fill setPatternImage: newImage collection:coll];
//with:
layer.style().fills().firstObject().setPatternImage( newImage );
layer.style().fills().firstObject().setPatternFillType(1);
```

と置き換えます。


[Images won't work on 3.5 (25229) #94](https://github.com/timuric/Content-generator-sketch-plugin/issues/94)
文字列リスト（TStringList）で、二分探索（Binary Search）する

## 文字列リスト（TStringList）の二分探索
文字列リスト（TStringList）には、二分探索でリスト内を検索する関数があるので、試してみる。
文字列リストには、カナ名をテストデータとしてセット。
TStringList.Sorted プロパティを使用すると TStringList.IndexOf も内部で二分探索を使用するようになるが、記載例としては、TStringList.Find を使用する。

#### 記載例
```Pascal
var
  slist: TStringList;
  idx: Integer;
begin
  slist := nil;
  try
    // テスト用にカナ名を文字列リストに追加する
    slist := TStringList.Create;
    slist.Add('イムラリュウゾウ');
    slist.Add('フクヤマチエコ');
    slist.Add('デクチカオリ');
    slist.Add('ツチヤメイ');
    slist.Add('ウメヅナホミ');
    slist.Add('ワタナベイワオ');
    slist.Add('アライウララ');
    slist.Add('サワダマヨ');
    slist.Add('オヤマハルカ');
    slist.Add('コクボカズオ');
    slist.Add('ヨシムラアキオ');
    slist.Add('オグラオサム');
    slist.Add('マチダハルカ');
    slist.Add('フナコシユウト');
    slist.Add('コウヤトシヒコ');
    slist.Add('イシガキユウナ');
    slist.Add('エナリワカナ');
    slist.Add('ウスイナホ');
    slist.Add('タマキヤスコ');
    slist.Add('ノムラトモミ');
    // ソートする
    slist.Sort;

    // 確認用にメモコントロールに文字列リストをセット
    Memo1.Lines.Assign(slist);
    // 二分探索（Binary Search）を行う
    // 見つからなかった場合には、False が返る
    if slist.Find('オヤマハルカ', idx) then
    begin
      // 検索結果を表示
      ShowMessage(IntToStr(idx));
    end;
  finally
    FreeAndNil(slist);
  end;
end;
```
Cxx.jl: インスタンスにconstが付く時とつかない時

以下の様に書くと`const`がつく：

```jlcon
julia> icxx"Eigen::Affine3f::Identity();"
(const class Eigen::Transform<float, 3, 2, 0>) {
}
```

`const`が付かない：

```jlcon
julia> icxx"Eigen::Affine3f trans = Eigen::Affine3f::Identity(); return trans;"
(class Eigen::Transform<float, 3, 2, 0>) {
}
```

はまった・・・
jquery.tile.jsをRails + CoffeeScriptで使用する方法

![image](https://qiita-image-store.s3.amazonaws.com/0/83412/46fc042f-7329-4ca7-e20d-21147a50462d.png)
※公式サイトより拝借
http://urin.github.io/jquery.tile.js/

こんな感じで、やっべえー要素がズレこんじゃったよーって言う時、ありませんか？

そんな時に、jquery.tile.jsを使用すると、楽に要素の高さを揃えることができます。

![image](https://qiita-image-store.s3.amazonaws.com/0/83412/b3326cd8-4d6d-4418-6046-5f14237aa319.png)

こんな感じに :smile: 

## jquery.tile.jsとは

jquery.tile.jsは、要素の高さをあわせるjqueryプラグインの中でも最軽量のものです。（jquery.tile.js開発者調べ）

![image](https://qiita-image-store.s3.amazonaws.com/0/83412/53d056a5-2861-ceed-da20-cd99e8363564.png)
https://github.com/urin/jquery.tile.js

## それでは、railsの中で実装してみましょう

lib/assets/javascriptにjquery.tile.jsを作成します。

```js
(function($) {
  $.fn.tile = function(columns) {
    var tiles, $tile, max, c, h, remove, s = document.body.style, a = ["height"],
      last = this.length - 1;
    if(!columns) columns = this.length;
    remove = s.removeProperty ? s.removeProperty : s.removeAttribute;
    return this.each(function() {
      remove.apply(this.style, a);
    }).each(function(i) {
      c = i % columns;
      if(c == 0) tiles = [];
      $tile = tiles[c] = $(this);
      h = ($tile.css("box-sizing") == "border-box") ? $tile.outerHeight() : $tile.innerHeight();
      if(c == 0 || h > max) max = h;
      if(i == last || c == columns - 1) {
        $.each(tiles, function() { this.css("height", max); });
      }
    });
  };
})(jQuery);
```

次に、app/assets/javascript/任意.coffeeを作成します

```coffeescript
$ ->
  $('任意のクラス名').tile()
```

これで終わりです。ただ、これだとすべての要素の高さが揃ってしまうので、列ごとに高さを分けたい場合は....

例えば、列が３列の場合

```coffeescript
$ ->
  $('任意のクラス名').tile(3)
```

というふうにしてみてください。

## SpecialThanks

http://urin.github.io/jquery.tile.js/
pythonでround(2.675,2)の戻り値が2.67になる簡単な理由（本当は2.68のはず。。）

#2.675を、小数点３桁で四捨五入しなさい

python3に言わせると,この答えは**2.67**らしいです。んな、アホな。。

と思ったら他にもこんな例はたくさんあった。

```lang:test.py

2.2 + 2.1 #4.300000000000001

7.6 + 8.7 #16.299999999999997

```

#理由はpythonのベースにC言語があるから

pythonはC言語によって書かれてるらしく、その結果こんな感じのよくわからない計算結果が返ってくるらしい。

floatの計算をする時の裏側の手順はこんな感じ。

1. pythonのFloatを、C言語では分数(Fraction)に変換
2. 計算
3. 分数の値をFloatに直す
4. pythonで結果表示

で、分数から少数への変換のタイミングでちょっとした誤差が生じるらしい。

何か数字周りでおかしなことが起きてたらこれを疑ってみよう、、という選択肢ができた。

これ知らないで作ったシステムでバグでたらすんごいハマるんだろうなぁ笑
Xcode ライセンスに同意をコマンドラインで実行する方法

忘れがちなのでメモ

なんかのツール使ってて

> Agreeing to the Xcode/iOS license requires admin privileges, please re-run as root via sudo.

って言われたら

```bash
$ sudo xcodebuild -license
```

あとは適当に `Enter` 押して `q` 押して `agree` って入力
"brew install"で最新バージョンがインストールできなかった時にやったこと

# 問題

SwiftLintを最新版(0.7.0)にしようと思って
`$ brew install swiftlint`
したら最新のではないものがインストールできてしまいました。
→`/usr/local/Cellar/swiftlint/0.6.0: 43 files, 15.2M`

`$ brew uninstall swxftlint`
を一度実行してからやってみても、
`$ brew update`
を実行してみても同様でした。

# 解決策

調べてみるとこんな記事が見つかりました。
http://stackoverflow.com/questions/5056115/how-to-install-latest-version-of-node-using-brew

この記事に書かれていることを参考に、

```
$ brew update
$ brew doctor
$ brew upgrade swiftlint
```

という手順を踏んだら無事最新版のSwiftLintをインストールすることができました。
→`/usr/local/Cellar/swiftlint/0.7.0: 35 files, 15.0M`
Oracle Cloud (DBaaS) を EM の リポジトリDB には使えません

#DBaaS を Enterprise Manager (以下、EM）の リポジトリDB としては使えません
`Oracle Database Public Cloud Service(DBaaS)バージョン　14.1.0.0.0`
[「Oracle Cloud (DBaaS) で用意されるデータベース」](http://qiita.com/arihisa/items/62d793e4f4441dcd2089)の記事でも記載したとおり、Oracle Cloud (DBaaS)の**エディションは DBaaS 専用**のもので、EMのリポジトリDBとして Oracle Cloud (DBaaS) を使って構築するときに**エラーが発生**します。
これにより、Oracle Cloud (DBaaS) で用意されているデータベースをEMのリポジトリDBとして利用することはできません。

下記からは Oracle Cloud (DBaaS) を EM のリポジトリDB としたとき、EM のインストールがどんな感じで失敗するか、ご紹介します。

##【失敗１】EMで要求されているDBオプションが用意されているエディションで構築してみる
こちらは Oracle Cloud 上であれば、EMで要求されている利用オプションを考慮すると「Enterprise Edition - High Performance（以下、HP）」が要件を満たしているので、HPで構築したものをEMのリポジトリDBに指定し、EMのインストーラーを進めたときのエラーです。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/108642/ce52ff6e-1cef-33ce-7fe3-b30d9e53cc96.png)

EMのインストーラからは「Enterprise Editionじゃないとインストールできないよ！」と、怒られました。

このエラーはインストール時にOracleのエディションを確認しているためで、インストール要件のエディションが一致しないためエラーが発生しています。EM構築時に必要なエディションは、**Enterprise Edition** です。

##【失敗２】エディションを合わせてみる
これを試すのは興味だけです。Oracle Cloud (DBaaS) の Enterprise Edition では、EMで利用するオプションが含まれていないので構築ができないと思いますが、念のため、エディションのチェックだけを回避するなら「Enterprise Edition」を選択すればできそうではあります。この時に、どのような怒られ方をするのか試してみました。結果は、もちろん想定通りのエラーが発生しました。

![002.png](https://qiita-image-store.s3.amazonaws.com/0/108642/ed03d419-4639-6dc2-9592-104cb96ca9b4.png)

EMのインストーラからは「パーティションをインストールしないとダメよ！」と、怒られました。

EM のリポジトリ DB は、パーティションオプションを利用します。Oracle Cloud (DBaaS) の Enterprise Edition は、パーティションオプションはありませんので、必要なオプション要件が満たせません。

こんな感じで、Oracle Cloud (DBaaS) を EM のリポジトリDB にすることはできなそうです。

##Oracle Cloud を使って EM を利用するためには・・・
製品サポートやライセンスの確認が必要にはなりますが、Oracle Cloud の IaaS で構築するのが正しそうです。