OmniAICreator/Qiita-1.07M huggingface dataset:
備忘録 12cのpdbをデータポンプでexport

デモ作成などでスキーマとか環境をいろいろ作り直したりするので、その時によく使うコマンドの備忘録を貯めていきます。

```lang:Oracle12cR1
expdp directory=TEST_DIR dumpfile=pdb1_mluser.dmp schemas=mluser
Export: Release 12.1.0.2.0 - Production on Wed May 11 12:29:35 2016

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

Username: sys@pdb1 as sysdba
Password:

Connected to: Oracle Database 12c EE High Perf Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Oracle Label Security, OLAP, Advanced Analytics
and Real Application Testing options
Starting "SYS"."SYS_EXPORT_SCHEMA_01":  sys/********@pdb1 AS SYSDBA directory=TEST_DIR dumpfile=pdb1_mluser.dmp schemas=mluser
Estimate in progress using BLOCKS method...
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Total estimation using BLOCKS method: 65 MB
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～
～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～
～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～
. . exported "MLUSER"."DM$PIASSOC_AP_1_2"                    0 KB       0 rows
Master table "SYS"."SYS_EXPORT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for SYS.SYS_EXPORT_SCHEMA_01 is:
  /home/oracle/work/pdb1_mluser.dmp
Job "SYS"."SYS_EXPORT_SCHEMA_01" successfully completed at Wed May 11 12:33:05 2016 elapsed 0 00:03:07
```

Usernameのところで、接続情報を入力する以外はすべて同じ。
旧来と同じだけどダンプファイルを吐き出すdirectory objectは事前に作成する必要あり。

```lang:Oracle12cR1
create directory TEST_DIR as '/home/oracle/work';
select * from dba_directories;
```

importする場合には、directory objectをpdb内に作る必要あり。
最低限覚えておくと便利なlsコマンドのオプションたち

これだけ覚えておけばなんとかなるだろう、と勝手に思っているlsコマンドのオプションを挙げていきます。

`ls -a`

隠しファイルを表示します。

`ls -l`

ファイルの詳細を表示します。　

`ls -la`

おそらく、皆さんこれをお使いなんじゃないでしょうか。
隠しファイルとファイルの詳細を同時に表示します。
上記コマンド二つをあわせたものです。

`ls -lat`

`-t`は更新日時順に並び替えます。
更新日時が新しい順に並びます。

`ls -latr`

`-r`は並び替えを逆転します。
この場合だと、更新日時が古い順に上から並びます。

 `ls -laS`

`-S`はファイルサイズが大きい順に並びます。
もちろん`r`をつけて、逆順に並び替えることもできます。

`ls -laSh`

`-h`オプションをつけると、ファイルサイズにKやMをつけてくれて、
自動的に見やすく変換してくれます。


これだけあればとりあえずは生活できるなーと、私は勝手に思っている所存でございます。
$_FILESのtmp_nameが空白？

#nameの方ははいっているのに…
失敗している雰囲気でもなく、エラーログが出るでもない

#ファイルサイズが原因だった
php.iniの設定でアップロード可能なサイズを引き上げたら
正しく値が設定されるようになった。
dynamic 経由の値型の取り回し

#どーいうことだってばよ？

例えば、以下のような構造体（値型）をこさえたとして、

```csharp

struct SomeStruct
{
	public int Value { get; set; }
	public override string ToString() => $"Value is {Value}";
}

```

コレを、`dynamic`経由で取り回したときどうなるかというのが今回のお題。
最後までおつきあい頂ければこれ幸いナリ。

#複数の`dynamic`に値型経由で代入する場合

コレは割と直感的な結果になると思う。
以下のようなコードを書いたとする。

```csharp


internal static void Main()
{
	var val = new SomeStruct {Value = 42};
	dynamic dynamA = val;
	dynamic dynamB = val;


	//Value is 42
	Console.WriteLine(dynamA.ToString());

	//Value is 42
	Console.WriteLine(dynamB.ToString());


	dynamA.Value = 114514;

	Console.WriteLine();
	//Value is 114514
	Console.WriteLine(dynamA.ToString());

	//Value is 42
	Console.WriteLine(dynamB.ToString());
}

```

この場合、コメントに記載したとおりの出力となる。
このようになる理由は、`dynamic DynamA=val;`及び`dynamic DynamB=val;`は、共々Valのコピーをボクシングしているので、片方のValueを動かしてももう片方が影響を受けることは無い。

#複数のdynamicにobject経由で代入する場合

こちらは若干直感的ではないかも知れない。

同様にコードを書いていこう

```csharp

internal static void Main()
{
	object obj = new SomeStruct {Value = 42};
	dynamic dynamA = obj;
	dynamic dynamB = obj;


	//Value is 42
	Console.WriteLine(dynamA.ToString());

	//Value is 42
	Console.WriteLine(dynamB.ToString());


	dynamA.Value = 114514;

	Console.WriteLine();
	//Value is 114514
	Console.WriteLine(dynamA.ToString());

	//Value is 114514
	Console.WriteLine(dynamB.ToString());
}

```

この場合、`dynamA`のValueに新たな値を代入した場合、`dynamB`も同様に値が変更されている。
これは、元がobject型なので、ボクシングが最初から行われており、そのボクシングされた結果の参照先を`dynamA`と`dynamB`が参照することになるので、参照型のような振る舞いをすることになる。
また、このことからdynamic型の動的呼び出しは外から観測する限り、ボクシングしたまま値型の内部状態を変更可能であると言うことになると思う。

参考まで、下記のようなコードも`object`経由の代入と同じ挙動をとる。

```csharp

internal static void Main()
{
	dynamic dynamA = new SomeStruct {Value = 42};
	dynamic dynamB = dynamA;


	//Value is 42
	Console.WriteLine(dynamA.ToString());

	//Value is 42
	Console.WriteLine(dynamB.ToString());


	dynamA.Value = 114514;

	Console.WriteLine();
	//Value is 114514
	Console.WriteLine(dynamA.ToString());

	//Value is 114514
	Console.WriteLine(dynamB.ToString());
}

```

#まとめ
代入の差異が挙動に直結するので、このようなことをする際は若干注意が必要かと思いまとめてみました。
特に、`object`経由の場合は、一般的な値型の振る舞いと異なり、参照型のそれに近い形になるので、意図的に使う場合は別として、注意をしなければならないと考えます。
EspressoでNestedScrollViewにscrollToが効かない件

## 問題
EspressoでNestedScrollViewにscrollTo()が効かないことに気づいた。
scrollTo()の実体であるScrollToActionの実装を見たら原因がわかった。

[ScrollToAction.java](https://android.googlesource.com/platform/frameworks/testing/+/android-support-test/espresso/core/src/main/java/android/support/test/espresso/action/ScrollToAction.java)より抜粋

```java
  @SuppressWarnings("unchecked")
  @Override
  public Matcher<View> getConstraints() {
    return allOf(withEffectiveVisibility(Visibility.VISIBLE), isDescendantOfA(anyOf(
        isAssignableFrom(ScrollView.class), isAssignableFrom(HorizontalScrollView.class))));
  }
```

NestedScrollViewはDesign Support Libraryに入っている都合からか入っていない(当然っちゃ当然)。
ScrollToActionクラスをextendsしてgetConstraints()メソッドをオーバーライドして
isAssignableFrom(NestedScrollView.class) を追加したら良いかと考えたけど、
ScrollToActionクラスにfinalがついてるのでそれもできない。
仕方がないので ScrollToActionクラスを丸コピーして対応した。
Redux Persistのススメ

# Redux Persistとは

https://github.com/rt2zz/redux-persist

storeを永続化してくれるライブラリです。

メリットは、

- 簡単な設定でstoreの永続化ができる
- autoRehydrateという機能があり、localStorage/localForageなどのローカルDBに自動で永続化し、それをアプリ起動時に読み込んでくれる

という感じで、storeの永続化をどうしようかと悩んでいる人にとって最高のライブラリだと思います！

# 使い方
ざっくり下のようにstore作成部分を書くと、

- 全てのreducerのstateが永続化される
- 自動でautoRehydrateアクションが実行される
    - reducerが実行されるたび永続化され、アプリ起動時に永続化されたデータを読み込む

ようになります。

```js
import { createStore, combineReducers, applyMiddleware, compose } from 'redux';
import thunkMiddleware from 'redux-thunk';
import { persistStore, autoRehydrate } from 'redux-persist';
import localforage from 'localforage';
import * as reducers from '../reducers/index';

const loggerMiddleware = createLogger();

export default function configureStore(initialState) {
  const store = createStore(
    combineReducers({
      ...reducers,
    }),
    initialState,
    compose(
      applyMiddleware(
        thunkMiddleware
      ),
      autoRehydrate()
    )
  );
  persistStore(store, {storage: localforage}, () => {
    console.log('autoRehydrate completed');
  });

  return store;
}
```

# さっくりとした各要素の説明

## `autoRehydrate`関数
store用のエンハンサーです。これ単体を`createStore`の第三引数に渡しても動作しますが、他にもエンハンサーがある場合は`compose`関数で合成してください。

## `persistStore`関数
こいつにstoreを渡して永続化を走らせるようにします。2つ目の引数は色々とオプションを渡すことができて、{storage: localforage}のようにストレージを指定することが出来ます。（何も指定しないとlocalStorageになるっぽい）
3つめの引数は、autoRehydrateが完了した時に呼び出されるコールバックで、適当なログ出力等させてください。

# まとめ
こういうの欲しかった！感がすごいです。reducerごとに永続化させる・させない等のオプションも指定できたりと機能も豊富なので、もう少し使い込んだらまた記事アップデートします。
gpgの挙動

#gpgで暗号化しようと思ったけどうまくいかない？
以前やったときはこんな感じでうまくいったんだけど…

```bash
echo PaSsPhRaSe | gpg -c --passphrase-fd 0 data.gpg
```
どうもエラーが出る

```bash
gpg: エージェントに問題: タイムアウト
gpg: パスフレーズの作成エラー: 操作がキャンセルされました
gpg: 「data.gpg」の共通鍵暗号に失敗しました: 操作がキャンセルされました
```

#manを読んでこうなった
--batchオプションが必要だったらしい
以前やったときはFedora、今回はCentOSだった。
時期も随分違うので仕様が変わったのかもしれない…

```bash
echo PaSsPhRaSe | gpg -c --batch --passphrase-fd 0 data.gpg
```
VBA による IE の操作自動化

# ライブラリ参照設定

ツール > 参照設定 > Microsoft Internet Controls > OK
ツール > 参照設定 > Microsoft HTML Object Library > OK

# IE オブジェクトの取得

```
Dim objIE As InternetExplorer
Set objIE = CreateObject("InternetExplorer.Application")
```

# 指定した Web ページを開く

```
objIE.Visible = True
objIE.Navigate 開きたいページの URL
```

# Web ページ読込み完了まで待機する

```
Do While objIE.Busy Or objIE.ReadyState < READYSTATE_COMPLETE
   DoEvents
Loop
```

# DOM の取得

```
Dim objDocument as HTMLDocument
set objDocument = objIE.Document
objDocument.getElementsByTagName(タグ名)(インデックス).innerText
```

# 起動中の IE ウィンドウを判別する

```
Dim objShell as Object, objWindow As Object
Set objShell = CreateObject("Shell.Application")

For Each objWindow In objShell.Windows
   If TypeName(objWindow.document) = "HTMLDocument" Then
      Set objIE = objWindow
      Exit For
   End if
Next
```
VBA 覚書

# 配列

```
Dim 変数名(インデックス最大値) As データ型
' 値の代入
変数名(0) = 値1
変数名(1) = 値2
変数名(2) = 値3
.
.
.
.
.
.

' 値の取得
変数名(インデックス)
```

# コレクション

```
Dim 変数名 As New Collection
' 値の代入
変数名.Add 値1, キー1
変数名.Add 値2, キー2
変数名.Add 値3, キー3
.
.
.
.
.
.

' 値の取得
変数名(キー)
```

# Win32API

```
' 指定したミリ秒間、処理を停止する。
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sleep ミリ秒

' 指定したミリ秒後に処理を実行する。
Declare Function GetTickCount Lib "kernel32" () As Long
Dim StartTime As Long

StartTime = GetTickCount

Do While GetTickCount - StartTime < ミリ秒
   DoEvents
Loop
```

# Win32API を使用しないで処理を待機する

```
Application.Wait Now + TimeValue("00:00:01")
```

# キーストロークの自動化

```
SendKeys キー文字列, True
```
EXCEL > Link > 名前の並び替え

```txt:動作環境
Excel 2013
```

名前リストを並び替えるマクロを下記を参考に作った。
http://xxxx7.com/2014/02/10/090513

リンク元のままではうまく動かなく(D列が`#NUM!`になる)、

```
=large($B$1:$B$10,C1)
```

を以下のようにしたら動いた(A列には乱数値が入っている)。

```
=large($A$1:$A$10,C1)
```

<hr>
(追記 2016/07/10)
上記の元記事が修正されたようです。
HTML,CSS勉強メモ#24 〜相変わらずpopover〜

帰ってきましたが、相変わらず'popover'でハマってます。
更に、いじっていたら出なくなってたUncaught〜のエラーもまた出てくる様になってしまって…どっぷりハマってしまいました。

Chromeの開発者ツールで調べているのですが、どうもjQueryあたりが怪しい気がするのですが…
兎にも角にもまずこのエラーを解読しない事にはさっぱりです⤵︎
ひとまず整理のために出てるエラーを書き出しておきます。


##**Atomに出てくるエラー**##
`Uncaught TypeError: Failed to execute 'item' on 'HTMLCollection': 1 argument required, but only 0 present.`

実行に失敗しました:１つの引数が必要ですが、現在０です？


##**デベロッパーツールに出てくるエラー**##

1.`bootstrap.min.js:6 Uncaught Error: Bootstrap's JavaScript requires jQuery

・`jQuery.min.js`のStatusには304のエラーも出てます。
・new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3

2.index.html:116 Uncaught TypeError: $(...).tooltip is not a function

jQueryのバージョンが古いとか、`tooltip`は関数じゃないとか？
いまいちよくわからないです・・・
一つ一つ読み解いていくしかないですね。
まだしばらく時間がかかりそうです。
Linux | grep って何の略?

- Global Regular Expression Print
- `g/RE/p`

の略らしい。


# 参考

- https://sites.google.com/site/ubuntu05070/grep
- https://en.wikipedia.org/wiki/Grep
- http://www.wdic.org/w/TECH/grep



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Domain=WCErrorDomain Code=7006

iPhoneのAppleWatchアプリで該当するWatchアプリのインストールSwitchをOffにした状態でXcodeからアプリをインストールするとWatchアプリもSwitchに関係なくインストールされるが本体アプリ内でupdateApplicationContextを実行するとこのエラーが発生する。Watchアプリはインストールされているけど本体側ではインストールされていないと見なされているような挙動。


SwitchをOnにすると解決。

AdHoc版をインストールした状態に上書きでXcodeからインストールするとSwitchがOffの状態になるようです。
その場合はSwitchをOnにしてもインストール失敗してOnに出来ないようなので一旦アプリを削除して入れ直すと解決する。
AWS S3 へアップロードした画像とAlamofireImage の相性問題

### 現象

Image の読み込みが必ず失敗する

### 原因

1. AWS S3 へ画像をアップロードする際に ContentType を何も設定しないと、S3 はそれを「binary/octet-stream」と認識する。(自動で判別してくれたりはしない)
2. AlamofireImage (というか Alamofire) には ContentType の Validation があり、許可リストの中に binary/octet-stream は含まれない。

### 対処法

プログラムのどこかで
```
Alamofire.Request.addAcceptableImageContentTypes(["binary/octet-stream"])
```
と記述する。以上。
Elasticsearchのインデックス再構築

Elasticsearchのインデックスを再構築（再作成）する手順
マッピングの定義を変更するにあたってインデックスの再構築が必要。

elasticsearch バージョン1.5.1で動作確認

## 1. マッピング定義用のjsonファイルをつくる

mapping.json

```
{
  "mappings" : {
    "test" : {
      "properties" : {
        "title" : {
          "type" : "string",
          "index" : "not_analyzed"
        }
      }
    }
  }
}
```

## 2. マッピング定義用のファイルを元に新しいインデックスつくる
```
$ curl -XPOST localhost:9200/new_index -d @./mapping.json
```

## 3. 新しいインデックスに既存データを移行する

これを使う
https://github.com/geronime/es-reindex

```
$ ./es-reindex.rb http://localhost:9200/old_index http://localhost:9200/new_index
```

## 4. エイリアスを旧→新に切り替える

古いインデックス（old_index）のエイリアスを削除し、新しいインデックス（new_index）にエイリアスをつける

```
$ curl -XPOST localhost:9200/_aliases -d '
{
  "actions": [
    { "remove": { "index": "old_index", "alias": "index_alias" } }, 
    { "add" : { "index": "new_index", "alias": "index_alias" } }
  ]
}
'
```
[Unity][C#]DictionaryをInspectorに表示する

なんのことはない。

UnityのInspectorにList以外のGeneric型を表示できないけど、Dictionaryを表示したい。
そんな時はListとKeyValuePairを利用する。

```
public class Hoge : MonoBehaviour
{
#if DEBUG
    // Inspectorに表示するためのListを用意する
    public List<string> infos;
#endif

    private void Awake()
    {
#if DEBUG
        infos = new List<string>();
#endif
    }

    private void Start()
    {
#if DEBUG
        // KeyValuePairの値をstring変換してAddするだけ
        KeyValuePair<string, string> pair = new KeyValuePair<string, string>("foo", "bar");
        infos.Add(pair.ToString());
#endif
    }
}
```
README.mdがGithub上でどう見えるのかをコミット前に確認する---Gripの紹介

Markdownファイルがウェブブラウザ上でどう見えるかを確認する方法はいろいろありますが、**Github上という限定された条件**であれば[Grip](https://github.com/joeyespo/grip)が一番です。

> Sometimes you just want to see the exact readme result before committing and pushing to GitHub. 
> -- joeyespo/gripより

## インストール

[pip](https://pip.pypa.io/en/stable/)でインストールできます:

```
pip install grip
```

## 基本的な使い方

ファイルを指定せずに起動すると、今いるディレクトリにある`README.md`を`http://localhost:6419`で表示してくれます。また、`-b`オプションをつければ起動と同時にウェブブラウザを立ち上げてくれます:

```
grip -b
```

Gripを立ち上げた後は、ファイルを更新・保存するとそれを検知してブラウザに反映してくれます。

## その他のオプション

```
# ファイルを指定して起動する
grip AUTHORS.md

# ポートを指定して起動する
grip 80

# ファイルとポートを指定する
grip AUTHORS.md 80

# HTMLファイルにエクスポートする
grip --export

# Githubのcommentやissueのフォーマットで起動する
grip --user-content
```

さらに詳しい情報は[Grip](https://github.com/joeyespo/grip)か`grip -h`でご確認下さい。
FS01BU を USB シリアルに切り替える

#FS01BU は初期状態では Mass Storage (USB メモリ) である
FS01BU を単純に USB ポートに差し込むと Mass Storage であると**だけ**しか認識されない。モデムになってほしい。どうやら Linux では usb-modeswitch なるものをインストールするとベンダー特有のコマンドを発行してモードを切り替えることが出来るらしい。

https://iotnews.jp/archives/7080

usb-modeswitch は使ったことがないので上のリンク先を見てもらうことにして、ここでは Zynq で直に USB しりあるに切り替えてみたい。

# USB-modeswitch から情報得る
[USB-modeswitch](http://www.draisberghof.de/usb_modeswitch/) のサイトから [usb-modeswitch-data](http://www.draisberghof.de/usb_modeswitch/usb-modeswitch-data-20160112.tar.bz2) をとってくる。このファイルを展開すると、usb_modeswitch.d というディレクトリになにやら ID をそのまま名前にしたファイルがある。FS01BU は 1c9e:98ff 。

```text:1c9e|98ff
# Telewell TW-3G HSPA+, FS01BU 3G, SmartBro WM66E
TargetVendor=0x1c9e
TargetProductList="6801,9801,9803"
MessageContent="55534243123456780000000080000606f50402527000000000000000000000"
```

55 53 42 43 は CBW のパケットだ。この Mass Storage 用のパケットを送ってやればシリアルに切り替わるに違いない。

# まずは普通に GET DESCRIPTOR (DEVICE)

```text:device.txt
12
01
00 02
00
00
00
40
9e 1c (Vendor ID = 0x1c9e)
ff 98 (Product ID = 0x98ff)
00 00
03
02
04
01
```

作業は Zynq で行った。過去の記録が参考になる。([FS01BU (Mass Storage)を解析してみた] (http://qiita.com/ryos36/items/f0daa0c61b68f03602f4) )

# Bulk 転送でデータを投げてみる。
Bluk 転送で上のデータを endpoint 1 になげてみる(OUTトランザクション)。

```c:bulk.c
    dbp[0] = 0x55;
    dbp[1] = 0x53;
    dbp[2] = 0x42;
    dbp[3] = 0x43;

    dbp[4] = 0x12;
    dbp[5] = 0x34;
    dbp[6] = 0x56;
    dbp[7] = 0x78;

    dbp[8] = 0x0;
    dbp[9] = 0x0;
    dbp[10] = 0x0;
    dbp[11] = 0x0;

    dbp[12] = 0x80;
    dbp[13] = 0x00;
    dbp[14] = 0x06;

    dbp[15] = 0x06;
    dbp[16] = 0xf5;
    dbp[17] = 0x04;
    dbp[18] = 0x02;
    dbp[19] = 0x52;
    dbp[20] = 0x70;
    for( i = 21 ; i < 32; ++i ) {
        dbp[i] = 0;
    }
```

転送するバイト数は 31 バイト。（上では 32 バイト目まで初期化しているが）00 も必要なので注意(21 バイトだと完了しない）。

通常は CBW を送るとその後データのやり取りやら、CSW の受信などをするのだが、このケースでは FS01BU は突然状態を変える（みたい）。具体的には USBSTS(0x144) の PCD ビット(2ビット目) を 1 にする。PCD = Port Change Detect。(Zynq の仕様書では PCI になっている気が、、、ついでに書くと OUT が DUT になってたりもする）。

# ポートの活性化
更に、PORTSC1 の状態を xmd 見ると次のようになっている。

```text:xmd
XMD% mrd 0xe0002184
E0002184:   8000180B
```

これをざっくり読むと Full Speed で Port Enabled Change が 1 になっている。Port Enable は 0 でまだ初期化されていない。そこで、0x100 を書き込んでポートを使えるようにする。その結果、PORTSC1 は次のようになる。

```text:xmd
XMD% mrd 0xe0002184
E0002184:   80001805
```

# あらためて GET DESCRIPTOR してみる
GET DESCRIPTOR のコントロール転送をして FS01BU からの返事をもらおう。それが次の結果。

```text:gdb.txt
(gdb) next
1160        iQH[0] = (uint32_t)iQH | 0x2 ;
(gdb)
1162        vid = dbp[4096 + 8];
(gdb)
1163        vid += dbp[4096 + 9] << 8;
(gdb)
1164        printf("Vendor ID 0x%04x\n", vid);
(gdb) p /x vid
$22 = 0x1c9e
(gdb) next
1165        if ( vid != 0x1c9e ) {
(gdb)
1169        pid = dbp[4096 + 10];
(gdb)
1170        pid += dbp[4096 + 11] << 8;
(gdb)
1171        printf("Product ID 0x%04x\n", pid);
(gdb) p /x pid
$23 = 0x6801
```

見事に pid は 0x6801 になってくれた。（え？プログラムがダサい？そのうち改良されるでしょう、、、、）

# 結論:FS01BU は特別な処理をすることでモデムになる

Linux で使うなら、こんなことしなくても usb-modeswitch でかんたんにできる（はず）。
lazyに画像のロードをする

# lazyに画像のロードをする

## lazyに画像のロードをする際のTips
基本的にこれを利用するということはIE8の呪縛に絡まれている場合だと思います。
transformの使えない次元に存在している人向けです。

## SampleCode

```javascript:sample.js
// 画像の先行読み込み
var $img = $('img');

var allImgCount = $img.length;
var imgCount = 0;

for (var i = 0; i < allImgCount; i++) {
	$($img[i]).bind('load', function(){

		// 画像がロードされたらカウント
		imgCount++;

		// 全ての画像がロードされたら
		if(allImgCount === imgCount){

			//処理〜！

		}
	});

	// 各画像にロードイベントをバインドした後にデータ属性をSRC属性へ入れる。
	// ※IE8のキャッシュ対策です。
	$(options.$modalImgItem[i]).attr('src', $img.attr('data-src'));
}
```
[Android] gradleビルド時に java.util.zip.ZipException: duplicate entry エラーが出た時に試すこと

# この記事について
Androidアプリをgradleプロジェクトとして開発している場合に、

```
java.util.zip.ZipException: duplicate entry: android/support/multidex/MultiDex$V14.class
```

のような、ビルドエラーが出た時に解決に繋がったことを紹介します。

# 結論
この記事の結論は、以下の２点です。

- **`Cmd + O` で、duplicateとされているクラスを検索する。**
- **ローカルに置いているjarライブラリと外部リポジトリから取得したライブラリの重複を疑う。**

# 説明
## エラーの意味
「duplicate」は「重複」と訳すことができます。つまり、

```
java.util.zip.ZipException: duplicate entry: android/support/multidex/MultiDex$V14.class
```

とは、「`MultiDex`クラスが重複している」というビルドエラーです。

## `Cmd + O` で、duplicateとされているクラスを検索
Android Studio でのクラス検索コマンド（Macの場合は`Cmd + O`、Windowsはわかりません）を利用して、重複しているクラスを検索します。今回の場合は、`MultiDex`で検索をしました。すると、私の場合は以下のような選択肢が出ました。

![MultiDexでクラス検索.png](https://qiita-image-store.s3.amazonaws.com/0/98669/d7648b8d-5e3f-70f6-a9fb-29deedba7d27.png)

クラス検索をかけたことで、実際に重複しているクラスを特定することができました。

## ローカルのライブラリと外部取得したライブラリの重複を疑う
私の場合、クラスの重複が起きた理由は、

``` build.gradle
compile fileTree(dir: 'libs', include: ['*.jar'])
```

によって、ライブラリとして認識されていた`app/lib`ディレクトリ内の`android-support-multidex.jar`が、build tool version のアップグレードでデフォルトで入るようになったmultidexのサポートライブラリと重複していたことが原因でした。

私の場合はbuild tool がデフォルトでいれたライブラリと重複しているという意味で、少し特殊な状況でしたが、ローカルに置いているjarライブラリと`build.gradle`で外部リポジトリからの取得を設定しているライブラリでクラスが重複していることを疑うのは一般的に通用する方法だと考えています。

# おわりに
EclipseからAndroid Studioに移行したプロジェクトやAndroid Studio黎明期に始まったプロジェクトなどでは、ローカルにjarを置いている場合があるかと思います。duplicate entry エラーがでたら、何が重複しているかの特定を試みたり、jarとの重複を疑ったりしてみてください。
レシピから同cookbook内の別レシピの呼ぶ

レシピから別のレシピを呼ぶ場合はinclude_recipeを使う

```ruby:recipe/my_recipe.rb
include_recipe "other_cookbook::other_recipe"
````

同cookbook内の別レシピを呼ぶ場合も使えるが、foodcriticに引っかかる
`FC007: Ensure recipe dependencies are reflected in cookbook metadata`
http://www.foodcritic.io/#FC007
つまりinclude_recipeするcookbookはmetadataに依存性を書いとかなきゃいけない


ただmetadataに自身のcookbookをdependsするのもダメ
`FC063: Cookbook incorrectly depends on itself`
http://www.foodcritic.io/#FC063

これらのwarning回避するには、自身のcookbook名をハードコードするのではなく、変数を使う

```ruby:recipe/my_recipe.rb
include_recipe "#{cookbook_name}::my_recipe"
```

###参照
https://tickets.opscode.com/browse/CHEF-5105
Reactで画像プレビューを作る

【2016/12/17 追記】
React（flux）を使ったブログエンジンを開発しました！
何か参考になれば嬉しいです！

Notee
https://github.com/funaota/notee

__________________________

Reactで画像プレビューを作る時の方法です！

## 作りたいもの

こんなやつ
<img width="609" alt="スクリーンショット 2016-05-11 17.07.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/23873/7f9dcac3-3d84-5511-1e52-e0390f66a8ee.png">


## 作り方

今回のはめっちゃ簡単です。

###手順
 - ①Viewを作る
 - ②handleChangeFileを作る

上記の②手順で簡単に作れます

## ①Viewを作る

```js
var Post = React.createClass({

    getInitialState(){
        return {
            image_src: ""
        };
    },

    handleChangeFile: function(e) {

    },

    render(){
        return(
            <div>
                <input type="file" ref="file" onChange={this.handleChangeFile} />
                <img src={this.state.image_src} />
                <button onClick={this.clickPostBtn} type="button">投稿する</button>
            </div>
        );
    }
});

```
このように、Viewには、
fileのinputとimageを表示させるためのものを持っておきます。

また、stateには
image_srcを持っておく事にします。


## ②handleChangeFileを作る

```js
var createObjectURL = (window.URL || window.webkitURL).createObjectURL || window.createObjectURL;

var Post = React.createClass({

    getInitialState(){
        return {
            image_src: ""
        };
    },

    handleChangeFile: function(e) {
        // ①イベントからfileの配列を受け取る
        var files = e.target.files;

        // ②createObjectURLで、files[0]を読み込む
        var image_url = createObjectURL(files[0]);

        // ③setStateする！
        this.setState({image_src: image_url});

    },

    render(){
        return(
            <div>
                <input type="file" ref="file" onChange={this.handleChangeFile} />
                <img src={this.state.image_src} />
                <button onClick={this.clickPostBtn} type="button">投稿する</button>
            </div>
        );
    }
});

```

ローカルのファイルを扱うには、URL.createObjectURLを使います。
URL.createObjectURLはこんな奴です！

https://developer.mozilla.org/ja/docs/Web/API/URL/createObjectURL


# 完成版のコードはこちら

```js
var createObjectURL = (window.URL || window.webkitURL).createObjectURL || window.createObjectURL;

var Post = React.createClass({

    getInitialState(){
        return {
            image_src: ""
        };
    },

    handleChangeFile: function(e) {
        var files = e.target.files;
        var image_url = files.length===0 ? "" : createObjectURL(files[0]);
        this.setState({image_src: image_url});

    },

    render(){
        return(
            <div>
                <input type="file" ref="file" onChange={this.handleChangeFile} />
                <img src={this.state.image_src} />
                <button onClick={this.clickPostBtn} type="button">投稿する</button>
            </div>
        );
    }
});

```
BeautifulSoupでHTMLからForm,Link情報を取得

```
from urllib.request import urlopen
from bs4 import BeautifulSoup

html = urlopen("http://xxxxx.co.jp")
bsObj = BeautifulSoup(html.read())

# Fromの情報を取得
for form_tag in bsObj.body.findAll("form"):

    print("SEND URL : {action}".format(action = form_tag.attrs.get("action",None)))
    print("METHOD   : {method}".format(method = form_tag.attrs.get("method",None)))
    print("ENCTYPE  : {enctype}".format(enctype = form_tag.attrs.get("enctype",None)))

    for input_tag in form_tag.findAll("input"):

        print("INPUT NAME : {name}".format(name = input_tag.attrs.get("name",None)))
        print("INPUT VALUE : {value}".format(value = input_tag.attrs.get("value",None)))
        print("INPUT TYPE : {type}".format(type = input_tag.attrs.get("type",None)))

    for text_tag in form_tag.findAll("text"):

        print("TEXT NAME : {name}".format(name = text_tag.attrs.get("name",None)))
        print("TEXT VALUE : {value}".format(value = text_tag.get_text()))


# Aタグの情報を取得
for a_tag in bsObj.body.findAll("a"):

    print("SEND URL : {url}".format(url = a_tag.attrs.get("href",None)))
    
```
mysqldumpでwhereにjoinを使う

環境：MySQL5.6, InnoDB

mysqldumpは、--whereオプションを指定して条件に当てはまるデータのみ取得することができる。
[4.5.4 mysqldump — データベースバックアッププログラム](https://dev.mysql.com/doc/refman/5.6/ja/mysqldump.html#option_mysqldump_where)

このwhereオプション内でjoinを使いたい。

例：
books(id, title, author_id)
authors(id, name, age)
の２つのテーブルがあって、mysqldumpを使ってbooksのデータを取得したい。
ただし、その対象はauthorsのageが40以上のもののみ。

```mysql
mysqldump -u user_name -p -h host_name --single-transaction --where "id in (select books.id from books inner join authors on books.author_id = authors.id where authors.age >= 40)"
```

このように指定することで、joinを使った条件を指定できた。
Railsでスペース区切りで複数キーワードにヒットする検索フォームを実装する方法

Ransackで検索機能を実装しようと思ったのですが、スペース区切りでヒットする検索が実装できませんでした。

> 例
・検索する文
「Railsでスペース区切りで複数キーワードにヒットする検索フォームを実装する方法」
・検索キーワード
[Rails]→ヒット　[Rails スペース]→ヒットしない

空白区切りでもヒットする検索を実装してみました。
該当する文があれば、キーワードはいくつでも対応しています。
全角スペース、半角スペースどちらでも対応しています。
> 例
・検索する文
「Railsでスペース区切りで複数キーワードにヒットする検索フォームを実装する方法」
・検索キーワード
[Rails]→ヒット　[Rails スペース]→ヒット [Rails スペース ヒット]

# view
form_tagでindexのパスを指定しています。methodは検索なのでgetで指定。
searchアクションに飛ぶように指定します。
prams[:search]でフォームに「検索キーワード」と入力すると`:3000/memos?utf8=✓&search=検索キーワード&commit=検索`のようなURLが生成されます。

```rb:views/index.html.erb

<%= form_tag memos_path,:method => 'get' do %>
<%= text_field_tag :search, params[:search] %>
<%= submit_tag "検索" %>
<% end %>

```

# controller

params[:search]が存在した場合と、しない場合でif文で表示の条件分岐をします。
今回はdeviseでログイン機能を実装していて、ログインしているユーザーのみの検索をしたいので、`where(user_id: current_user.id)`でログインしているユーザーのメモのみ表示します。

```rb:memos_controller.tb

def index
  @memos = Memo.where(user_id: current_user.id)

  if params[:search].present?
    @memos = @memos.search(params[:search]).where(user_id: current_user.id)
  else
    @memos = Memo.where(user_id: current_user.id)
  end
end

```


# model



```models/memos.rb

def self.search(search)
  if search
    patterns = search.split(/[ ,　]/)
    sql_body = ''
    patterns.each do | pattern |
      sql_body += ' and ' unless sql_body.blank?
      sql_body += " body like '%#{pattern}%' "
    end
    sql = "select * from memos where #{sql_body} order by id desc"
    memo_ids = Memo.find_by_sql(sql)
    ids = []
    memo_ids.each do |qi|
      ids.push(qi.id)
    end
    where(:id => ids)
  else
    Memo.all
  end
end

```
Githubが料金プランを大きく変更、プライベートリポジトリ作成が無制限に

#Githubが大きく変わった
<img width="835" alt="GITHUB.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/62429/3cd63176-3c3e-861c-ac3d-de0ba99a8c3a.png">

5月10日(現地時間)の夜に、Githubにアクセスしたらトップページにでかでかと上記の画像のような表示が。

どうやら、 **Githubが価格体系を2つに変更** したようです。

#変更点
今までは、いくつプライベートリポジトリが欲しいかによって課金をしていましたが今回の変更によって大分変わりました。

##無制限のプライベートリポジトリ
ここが一番大きな変更になるかと思います。今回の変更によって一定の料金を毎月払うことで**無制限にプライベートリポジトリが作れるようになりました**

##個人(Personal)
料金：**7ドル/月**
今まではマイクロプラン(5個のプライベートリポジトリ)が5ドル/月だったので若干の値上がりを感じるかもしれないですが、ラージプラン(50個のプライベートリポジトリ)を使っていたユーザには大きな節約になりますね。
数日かけて自動的に移行されていくようです。
大きなプランを払っていた人はお金が戻ってくる模様?(英語がよくわからなかった 原文: If you’re currently paying for one of those larger plans, look out for a prorated credit on your account.)

**学生で無料でマイクロプランを使っていたユーザは無料で個人アカウントになるようです。**
<img width="252" alt="学生は無料で使える" src="https://qiita-image-store.s3.amazonaws.com/0/62429/28cd2a53-838a-23c6-a15c-44507d511cd8.png">


##チーム(Organization)

チームは**1ユーザに対して9ドル/月**(最初の5ユーザまでは25ドル/月で使えるようです)
大きなチームは大きく値上がりしてしまう可能性がありますね。
ただ、これは今すぐ変更しなくてはいけないということではなく**選択できて自動的にプランが変更されることはなく手動での変更**になります

教育機関としてチームを作るとプライベートリポジトリが無料で使える制度で作られている方々は**25ドルの割引**を得られるようで**無料で使えるわけではないようです。**<img width="651" alt="bb.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/62429/1399d781-ed4b-e317-245c-a865cd18c2df.png">
(画像は大学でやっているサークルのIT系サークルのチーム）

#まとめ
 * 無制限にプライベートリポジトリが作れるようになった
 * 個人は7ドル/月(学生の人はこれになる）
 * 個人は自動的にプランが変更される
 * チームはは9ドル/月 ×チームの人数(最初の5人までは25ドル)
 * チームは今すぐプランを変更する必要はない
コンテンツの転送速度をアップする（レスポンス圧縮化）

#WEBサーバでコンテンツの転送速度をアップする方法
WEBサーバにおいて、ドキュメントを返すとき、圧縮して返してあげると回線の負荷軽減やスピードアップにつながる。今回はapacheで実現する。

##httpd.conf
「mod_deflate」を使用して実現する。

画像など既に圧縮されているものに関しては圧縮しないように制限をかける。
今回は画像拡張子以外は全て圧縮とした。

もし、特定のMIMEタイプのみ圧縮したい場合は
`SetOutputFilter DEFLATE`
を外し
`AddOutputFilterByType DEFLATE text/plain`
上記のようにタイプを指定すること。
複数指定したい場合は半角　区切りで。
`AddOutputFilterByType DEFLATE text/html text/plain`

圧縮レベルは
Level 9にしてもそこまでサイズが小さくなるわけではないので
CPUへの負担が少ないLevel 1 とした。
`DeflateCompressionLevel 1`


## 画像以外の例

```lang:httpd.conf
<IfModule deflate_module>
SetOutputFilter DEFLATE

DeflateCompressionLevel 1

BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE\s(7|8) !no-gzip !gzip-only-text/html

SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico)$ no-gzip dont-vary

Header append Vary Accept-Encoding env=!dont-vary
</IfModule>
```

## type指定&画像以外
```lang:httpd.conf
<IfModule deflate_module>
    DeflateCompressionLevel 1

    BrowserMatch ^Mozilla/4 gzip-only-text/html
    BrowserMatch ^Mozilla/4\.0[678] no-gzip
    BrowserMatch \bMSIE\s(7|8) !no-gzip !gzip-only-text/html

    AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript application/x-javascript
    SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico)$ no-gzip dont-vary

    Header append Vary Accept-Encoding env=!dont-vary
</IfModule>
```
RailsでElasticSearchとRansack＋CircleCIでの設定でちょっとハマったのでメモ

今後似たようなことをまたやるかもしれないので、自分用のメモとしてまとめておきます。

## 環境

ElasticSearchはバージョンによって変更点が色々ありそうなので関連しそうな情報を以下記載しておきます

- Mac OS X El Capitan（10.11.4）
- Ruby 2.2.2
  - rbenvを利用してインストールしてます
  - ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-darwin15]
- Java 1.8.0_74
- ElasticSearch 2.3

## 何にハマったのか症状と回避方法を先にまとめる

Gemfileに

```ruby
gem 'elasticsearch-model'
gem 'elasticsearch-rails'
```

を追加した上で、任意のModelからElasticSearchの機能を利用できる機能を実装してました

### トラブルの内容

開発環境では意図した動作が出来ていたので、そのコードをGitHubにpushしてCircleCIでテストが実行された時に

```sh
     Faraday::ConnectionFailed:
       Connection refused - connect(2) for "localhost" port 9200
```

というエラーが出るようになった

### 回避方法

以下順番で解決を試み解決しました！

- RansackのsearchとElasticSearchのsearchがコンフリクトするのが要因かと思い対応をする
  - 解決せず
- 開発環境で問題ない。CircleCIの環境だけテストに失敗していたので**circle.ymlにElasticSearchを利用する設定を追加**して解決しました！
  - ちなみにローカルの環境でも**ElasticSearchが起動してない状態**だと実はテストに失敗することをその後に知った
  


## 試みた解決策について補足

以下は自分の作業記録的なものですが一応まとめておきます。

### RansackのsearchとElasticSearchのsearchがコンフリクトするのでその対応


これは[RansackのGitHubのRansack #search method](https://github.com/activerecord-hackery/ransack#ransack-search-method)に記載あるのですがRansackのsearchメソッドが他のgemなどとバッティングするようだったら

- by patching the extended class_method in Ransack::Adapters::ActiveRecord::Base to remove the line alias :search :ransack unless base.respond_to? :search
- by placing the following line in your Ransack initializer file at config/initializers/ransack.rb

という記述があり、ひとまず自分は後者のやり方を選択しました。

### 補足

ちなみに元々のコードは、config/initializers/ransack.rbを作成する前から、

```ruby
Article.ransack(params[:q])
```

としていたので、そもそも違う要因だったはずなんだけど、その事にきづけなかった・・・


### ローカルの環境でもElasticSearchが起動してない状態でうまく動作しない

それまで開発をしていた環境とは別のマシンで同様の環境を作ろうと思って

```sh
./bin/rake db:migrate
```

した時に何故かエラーになった。

メッセージ見たら**Connection refused - connect(2) for "localhost" port 9200**という表示があり、9200番ポートってElasticSearchなんで、

- ElasticSearchのインストール＆起動
- 再度db:migrate

で、無事にmigationが出来ました。


この時にローカルの環境でもElasticSearchが起動してない状態で実はテストに失敗するんじゃないのかと思って、

- 一度ElasticSearchを終了させる
- RSpecを実行

という作業をしたら、
  
```sh
# Errno::ECONNREFUSED:
#   Connection refused - connect(2) for "localhost" port 9200
```

という表示があり自分の予想通りの結果が生じ、ElasticSearchを起動した上でRSpecを実行したら、無事にテストはパスしました！

## 余談

別のマシンで同様の環境を作ろうと思ったのは、仕事の打ち合わせでデモをするためだったのですが、その環境構築を出かける前にとりかかった時に発覚し、そもそもローカルの環境自体が起動しないという最悪の状況だったのでだいぶ焦った^^;
二重根号の外し方について考えてみた

[高校数学の美しい物語](http://mathtrain.jp/sqrtsqrt)より二重根号を外す公式は

```math
\sqrt{a+b+2\sqrt{ab}} = \sqrt{a} + \sqrt{b}
```

また、二重根号を外すうえで必要な条件は

```math
\sqrt{A \pm 2\sqrt{B}} \: において A^2 - 4Bが平方数

```

であることです。

これをちょっと遊んでみました.

#最初から考えてみる
公式を覚えるのがなんか嫌だ...

なのでここでは

```math
\sqrt{C+\sqrt{D}} \;\; [1.1]
```

から二重根号の外し方、または外せるかの判断をしたいと思います。

##計算
式(1.1)の二重根号が外れるということは

```math
\begin{align}
\sqrt{C+\sqrt{D}} &= \sqrt{(a + b)^2} \;\; [1.2] \\
 &= \sqrt{a^2 + 2\sqrt{ab} + b^2} \;\; [1.3]
\end{align}
```

となるa,bが存在するということになります.

```math
a^2, \: b^2
```
が自然数でないとき二重根号が外れないことは式(1.2)より明らかです(判断条件).

よって

```math
C = a^2 + b^2 \; [1.4] \\
\sqrt{D} = 2\sqrt{ab} \\
\Rightarrow D = 4(ab)^2 [1.5] \\　

\\

式(1.4),(1.5)を連立: \\
4a^2(C-a^2) = D \\
\Rightarrow 4a^4-4a^2C + D = 0 \; [1.6] \\　

\\

x = 2a^2とおくと式(1.6)は \\
x^2 -2Cx + D = 0 \; [1.7]

```

というよく見る2次方程式が出来上がります.
このxの解を求めることで最初の式(1.2)のa, bが求まるようになります(このa,bが答え!!).

#判別式を考えてみる
式(1.7)を解の方程式に当てはめてみると, ルートの中身は

```math
\sqrt{4C^2 - 4D} \Rightarrow 2\sqrt{C^2 - D} \\
```

この右式のルートが外れないとxの解が根号をもってしまいa(またはb)の値が二重根号を持ってしまいます.

そのため、C^2-Dが平方数でなければならず判別式が出来上がるのです(D = 4B).

#参考
[KIT数学ナビゲーション](http://w3e.kanazawa-it.ac.jp/math/category/suu-to-siki/seisiki/henkan-tex.cgi?target=/math/category/suu-to-siki/seisiki/nijyuu-kongou-no-hajusikata.html)
Windows版bitnamiのredmine3.2.1にbacklogsを入れました

## ・bitnamiをインストールする
#### bitnamiのダウンロード
Redmine 3.2.1-2 (64-bit)をダウンロードします。
https://bitnami.com/stack/redmine/installer

#### bitnamiのインストール
インストール時に入力した内容は忘れないようにどこかにメモしておきます

	表示用氏名：adminuser
	Emailアドレス：XXXXXXXXXX@gmail.com
	ログイン名：admin
	パスワード：adminpass

ApacheWebサーバのポート番号：3000

## ・準備
#### パスを通す
システム ＞　詳細設定 ＞ 環境変数

	[Path]
	C:\Bitnami\redmine-3.2.1-2\ruby\bin;
	C:\Bitnami\redmine-3.2.1-2\imagemagick;

	[RAILS_ENV]を追加し、下記の値を設定
	production

#### bundlerのインストール
コマンドプロンプトを開いて、bitnamiのインストールしたフォルダの
C:\Bitnami\redmine-3.2.1-2\apps\redmine\htdocs に移動。

	gem install bundler
## ・backlogsのインストール
#### backlogsの取得
下記URLからbacklogsの取得。
メインのリポジトリではなく、feature/redmine3から取得すること。
Ruby3系でbacklogsを扱うにはこれが必要になる。
https://github.com/backlogs/redmine_backlogs/tree/feature/redmine3

今回はZipで取得。
解凍したファイルの中身を下記に保存する
C:\Bitnami\redmine-3.2.1-2\apps\redmine\htdocs\plugins\redmine_backlogs

#### Gemfileの調整
そのままではredmineのGemfileとBacklogsのGemfileの間で競合を起こすので調整を行う。
C:\Bitnami\redmine-3.2.1-2\apps\redmine\htdocs
C:\Bitnami\redmine-3.2.1-2\apps\redmine\htdocs\plugins\redmine_backlogs\Gemfile

	nokogiri	redmine_backlogsの方から消す
	thin		redmine_backlogsの方から消す
	capybara	redmine_backlogsの方から消す
	
#### bundle install
	bundle install --without development test --path vendor/bundle	
	bundle install --no-deployment

## redmineにトラッカーを追加
	Task

#### backlogsのインストール
rakeコマンドの実行

	bundle exec rake db:migrate
	bundle exec rake tmp:cache:clear
	bundle exec rake tmp:sessions:clear
	
backlogsのインストール
	
	bundle exec rake redmine:backlogs:install
	
backlogsインストール時に聞かれる内容に対する入力

	Which trackers do you want to use for your stories?
	  1. バグ
	  2. 機能
	  3. サポート
	  4. task
	Separate values with a space (e.g. 1 3): 2
	You selected the following trackers: 機能. Is this correct? (y/n) y
	-----------------------------------------------------
	Which tracker do you want to use for your tasks?
	  1. バグ
	  2. サポート
	  3. task
	Choose one from above (or choose none to create a new tracker): 3
	You selected task. Is this correct? (y/n) y


以上です。
この後、redmineを再起動すればbacklogsが使えるようになっています。


公式では、holidaysのインストール手順などありましたが、今回特に指定すること無くインストールできました。
基本的なところが動くところまでは確認出来ています。
……もしかしたら必要かもしれません。

うまくいかないところなどあればコメントいただければ幸いです。


##エラーが起こる場合

[RAILS_ENV] production を追加していなかった場合

	rake aborted!
	Mysql2::Error: Access denied for user 'root'@'localhost' (using password: NO)

と出ました……。
環境変数を確認してみてください。
[VisualStudio2015]VC++ のユニットテストの結果が文字化けする原因

このテストは失敗する。

```cpp
TEST_METHOD(BuggyAssertion)
{
    Assert::AreEqual("あいうえお", "かきくけこ");
}
```

問題なのは、実行結果。こうなる。

![assertion.png](https://qiita-image-store.s3.amazonaws.com/0/2883/efd19f37-e895-7c13-734d-52d1f5ba9853.png)

## 原因

以下にインストールされているヘッダー内に、expectとactualを`std::wstring`型にコンバートするtemplateが実装されている。

- `C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\UnitTest\include`

```cpp:CppUnitTestAssert.h
// std::string → std::wstring 版
template<> inline std::wstring ToString<std::string>           (const std::string& t)           { RETURN_WIDE_STRING(t.c_str()) ; }

// char* → std::wstring 版
template<> inline std::wstring ToString<char>(char* t) { if (NULL == t) return std::wstring(L"(NULL)"); RETURN_WIDE_STRING(t); }
```

共通で使用される`RETURN_WIDE_STRING`マクロはこうなっている。

```cpp
#define RETURN_WIDE_STRING(inputValue)      std::wstringstream _s;_s << inputValue; return _s.str()
```

見やすくしてみる。

```cpp:
std::wstring RETURN_WIDE_STRING(/* std::string or char* */ inputValue)
{
    std::wstringstream _s;
    _s << inputValue;
    return _s.str();
}
```

`std::wstringstream`ストリームにただ流し込んでいるだけだった。
スマートに解決する方法が思いつかない。
メールサーバのIMAPの接続不安定の対処法（コネクション上限関連）

・経緯
Thunderbirdでサーバとの接続が切断されました。サーバがダウンしたか、ネットワークに問題があるかもしれません。とのメッセージが頻出するようになった。

メールサーバの/var/log/mailogを確認したところ以下のメッセージを発見

>dovecot: imap-login: Maximum number of connections from user+IP exceeded (mail_max_userip_connections=10): user=<xxxxx>, method=PLAIN, rip=xx.xx.xx.xx, lip=yy.yy.yy.yy, TLS

・原因：同一IPアドレスからの、1ユーザのIMAP接続が規定の数を超えていた。

・対処
コネクションの上限数を増やした
設定を編集
>vim /etc/dovecot/conf.d/20-imap.conf

下記を追記
>mail_max_userip_connections = [上限数]
     
dovecotをリロード(CentOS7)
>systemctl reload dovecot.service


サーバ側の設定について
参考：http://bisland.xyz/imap-login-maximum-number-of-connections-from-userip-exceeded/
参考：http://vogel.at.webry.info/201406/article_17.html


（Thunderbird側でコネクションの上限を制御することもできる。）
thunderbird側の設定について
参考：http://kyotopcocchan.seesaa.net/article/368685297.html
w32time note


# No triggerd start!
http://sx1752.hateblo.jp/entry/2015/07/12/081149

via cmd
`sc triggerinfo w32time delete `

via powershell
Edit registry...
http://mikefrobbins.com/2015/12/24/use-powershell-to-determine-services-with-a-starttype-of-automatic-or-manual-with-trigger-start/

## delete scheduled-jobs
`Unregister-ScheduledTask -TaskName SynchronizeTime`
This command erase scheduled-task simply.
`Disable-ScheduledTask` is better ?

# query (other ntp server)
```cmd:
w32tm /stripchart /computer:pool.ntp.org /period:1 /dataonly /samples:3  

Tracking ntp.nict.jp [133.243.238.244:123].
The current time is 1/27/2016 10:15:19 PM.
22:15:19, -70.5490635s
22:15:20, -70.5530585s
22:15:21, -70.6554563s
22:15:23, -70.5545221s
```
# ntp setop

```
w32tm /config /manualpeerlist:"0.amazon.pool.ntp.org,0x9 1.amazon.pool.ntp.org,0x9 2.amazon.pool.ntp.org,0x9 3.amazon.pool.ntp.org,0x9" /syncfromflags:manual /update

```

# regedit
```

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient


$item = Get-ItemProperty "HKLM:\System\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient"

C:\Users\cloudpack$item = Get-ItemProperty "HKLM:＼System＼CurrentControlSet＼Services＼W32Time＼TimeProviders＼NtpClient"

$item = gp "HKLM:\System\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient"

Set-ItemProperty "HKLM:\System\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient" -name "SpecialPollInterval" -value "3600" 
```

# script
```powershell:
w32tm /config /manualpeerlist:"0.amazon.pool.ntp.org,0x9 1.amazon.pool.ntp.org,0x9 2.amazon.pool.ntp.org,0x9 3.amazon.pool.ntp.org,0x9" /syncfromflags:manual /update

w32tm /resync
w32tm /resync

Set-ItemProperty "HKLM:\System\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient" -name "SpecialPollInterval" -value "3600" 

$tm = Get-Service -Name W32Time
$tm.Stop()
$tm.Start()
```
fuse note


# Why I cannot mount except root user.
`/bin/fusermount` parmittion or add `fuse` group

```
chmod o+rx /bin/fusermount
```

# The bucket mounted by root, but other users use it.
`s3fs` and `goofys` use `-o allow_other`
`gcsfuse` unspported ???

# allow_other via fstab

```bash:
goofys#bucket /mnt/goofys fuse _netdev,allow_other 0 0
s3fs#bucket /mnt/s3fs fuse _netdev,allow_other,iam_role=EC2Role 0 0
```
Raspberry Piで音声付き動画を撮影する



# 背景
* いまだにスプラトゥーンにはまっていて、今更だがプレイを振り返りたくなった。
* HDMIキャプチャは持ってないけどRaspberry Piは持ってる。
* 単純にプレイ動画として見たいので音声も欲しい。
* ラズパイで映像を撮ることについて書かれた記事は多いけど音声付きはそれほど見ない気がする。


# 準備

![20160511022151.jpg](https://qiita-image-store.s3.amazonaws.com/0/100903/eaa74a24-d042-eed0-9203-3502b353989b.jpeg)

必要な物はこちら

* Raspberry Pi2 Model B (OSはRaspbian)
* Raspberry Piカメラモジュール
* USBマイク
* USBハブ(セルフパワーのもの)
* [カメラ固定できる何か](http://www.amazon.co.jp/ESCO-%E3%82%A8%E3%82%B9%E3%82%B3-320mm-%E3%82%A2%E3%83%BC%E3%83%A0%E4%BB%98%E4%B8%A1%E7%AB%AF%E3%82%AF%E3%83%AA%E3%83%83%E3%83%97%E3%82%A2%E3%83%BC%E3%83%A0-EA526A-1%EF%BC%88%E3%81%A9%E3%81%A3%E3%81%A1%E3%82%82%E3%82%AF%E3%83%AA%E3%83%83%E3%83%97%E5%A4%A7%E5%B0%8F-CLW8%EF%BC%89/dp/B004ORI7H8)

必須ではないが使ったもの

* HDMIケーブルとディスプレイ(映像確認用)
* LANケーブル(SSHでログインして作業する場合)

ケーブルが多いのとカメラを丁度いい位置に固定するのが面倒...

# マイクの接続を確認
録音にはarecordコマンドを使用します。
-lオプションでサウンドカード一覧を表示してUSB接続しているマイクが認識できていればOKです。

```
pi@raspberrypi ~ $ arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: Device [USB PnP Audio Device], device 0: USB Audio [USB Audio]
  Subdevices: 1/1
  Subdevice #0: subdevice #0
```


# カメラモジュールの接続確認
映像にはraspividコマンドを使用します。
ディスプレイに繋がっていればraspividを実行するとプレビューが表示されるので、とりあえずデモ実行して使えることを確認します。

```
pi@raspberrypi ~ $ raspivid -t 10000 -d
```

# 動画を撮影する
2通りの方法を試してみました。
動画のエンコーディングにはffmpegを使用します。
室内なのでraspividのawbオプションで光源の設定をしてますが必須設定ではありません。

* 映像、音声を取得しながらエンコードする

```
raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -o - | \
   ffmpeg -y -ac 2 -f alsa -ar 16000 -i plughw:1 -r 30 -i pipe:0 -vcodec copy test.mkv
```

* 撮影と録音を同時に行いそれぞれをファイルに保存して、後から結合する

```
raspivid -t 0 -w 640 -h 480 -b 10000000 -fps 30 -awb fluorescent -n -o test.h264 | \
   arecord -D hw:1,0 -f S16_LE -r 16000 -d 0 test.wav;
ffmpeg -y -i test.wav  -r 30 -i test.h264  -vcodec copy test.mkv
```

前者の方法だとALSA buffer runとメッセージが出てそのタイミングで動画がわずかに飛びますが対応はこちらの記事で紹介されています。
http://technologicaladvance.blog.fc2.com/blog-entry-99.html

またどちらの方法も共通で、**raspividで指定するfpsとffmpegの映像データに指定するfpsを同じ値にする**必要があります。
ここが違う値になっていると音ズレが起こります。

### raspividに-nを付けると画面全体が黄色くなった
-nはプレビューを非表示にするオプションなのですが、上記2つの実行コマンドで-nをつけると白い壁が黄色になる現象が起きました。
原因が全くわかっていないので分かる方教えていただけると幸いです。

# 動画を再生する
omxplayerコマンドでコマンドラインから動画再生することができます。
音声と映像はそこそこの質でしたが、raspividでの撮影時のオプションによって画質や色合いが変わるので調整が必要そうです。

```
pi@raspberrypi ~ $ omxplayer test.mkv
```

# まとめ
* Rasberry PiのカメラモジュールとUSBマイクの組み合わせで音声つき動画が撮れる。
* この後はIkaLogを通じて映像解析してみたい。
* マイクを介するのでゲームの音以外が入る。音質も良くしたい。デジタル入力とかできるんだろうか？
mysqlのパラメータグループ内の任意のパラメータから設定を削除する

# 概要

- パラメータグループのいくつかの設定はWEBのコンソールからでは設定を削除(i.e. 空文字にできない)できない

- デフォルトで値が設定されていないものはcliから `reset-db-paramter-group` を使用する

## 例

```
aws rds reset-db-parameter-group --db-parameter-group-name <name> --parameters ParameterName=init_connect,ApplyMethod=immediate
```

## tl;dr

上記の仕様は `init_connect` の設定を削除しようとして気付いた。

これまでRDS上のMySQLでは`init_connect`でタイムゾーンをセットするストアドプロシジャを実行する設定にしていた。
しかし、2015年末のアップデートでタイムゾーンの変更が可能になったので、この設定が不要になった。

- [RDS(MySQL)でJSTを使う たった１つの冴えたやり方](http://qiita.com/j3tm0t0/items/089ef96ba131df079ca4)
- [新機能 Amazon RDSで日本時間が使用可能になりました！](http://dev.classmethod.jp/cloud/aws/rds-local-time-zone/)
JavaScript初心者が学びながらまとめる超基礎JavaScript Part1

#はじめに
if, whileなど他の言語でも使われるような文法は省略してあります。

##デバッグで使えそうなconsoleオブジェクトの持つメソッド
思い通りの処理が行われなかった時にはconsole.logなどでコンソールに出力して確認すると、エラーの原因の特定が早まるのではないかと思ったので、はじめにデバッグに役立ちそうなconsoleのメソッドを紹介します。

###log
引数で渡したものを出力してくれる。

###dir
引数で渡したobjectのプロパティを全て出力してくれる。

###dirxml
引数で渡したDOMオブジェクトの内容をツリー形式で出力してくれる。

####dirとdirxmlの使い分けですが、DOMのプロパティを出力したいときはdir、ツリーで表示したいときはdirxmlを使うと良さそうです。

##DOM
HTMLの要素にアクセスする仕組みのこと。
このDOMを操作することによって、要素の値を操作できる。

###DOMツリー
HTMLドキュメントをツリー構造で表現したもの。
DOMを操作する上でとても重要

###ノード
DOMツリー内の各要素。

##DOMを操作する
HTMLの要素やclass, idを指定して操作する。
DOMを操作することでHTMLやCSSを変更できる。

```js
//タグを指定する
document.getElementsByTagName('p');

//class指定
document.getElementsByClassName('class');

//idを指定する
document.getElementById('id');

//cssセレクタで指定
document.querySelector('#main .posts h1'); //最初の一つを取得
document.querySelectorAll('a'); //すべて取得
```

##イベントを設定する
イベントとは、クリックした、ページが読み込まれたなどの動作が起きた時に発生する。
イベントハンドラは、イベントを検出し、イベントに処理を与えるのに使用する。

###addEventListner
DOMオブジェクトにイベントを紐付ける。
第一引数にイベントを指定し、第二引数でイベントハンドラを指定する。

```js
document.getElementId('hoge').addEventListner('click', function() {
	id名hogeがクリックされた時に行いたい処理
});
```

###参考
[【Javascript】consoleオブジェクトが持つlog以外の便利メソッド18（前編） : アシアルブログ](http://blog.asial.co.jp/1036)
[JavaScript入門 (全24回) - プログラミングならドットインストール](https://dotinstall.com/lessons/basic_javascript_v2)
【FileMaker】日付をファイル名に入れたい、そしてゼロ詰め

よくあるお題です。
今回のこのやり方が効率いいのかよくわかりませんが、人に聞かれたら、以下を紹介しています。

（例）年下2桁で日付をテキストでもちたい。ゼロ詰め、よろしく。
「2016年5月11日」→「160511」

# 方法１

```
Let ( [
$sampledate = Get(日付)
] ; 
Right(Year($sampledate);2) & 
If ( Length(Month($sampledate))>1 ; Month($sampledate) ; "0" & Month($sampledate) ) & 
If(Length(Day($sampledate))>1;Day($sampledate);"0" & Day($sampledate) )
)
```

# 方法２

```
Let ( [
$sampledate = Get(日付)
] ; 
Right(Year($sampledate);2) & 
Right("0" & Month($sampledate);2) & 
Right("0" & Day($sampledate);2) 
)
```

これ↑を変数なり計算フィールドなりに指定すればOKです。

どっちかっていうと、方法２の方がすっきりしていますよね。
方法１は、すっきり感がないということに付け加えて、同じ関数を複数回使ってます。（Month,Day関数）
同じ関数を使うよりも、処理速度のことも考えてなるべく少なく実装できると「おれって深いい」と自負できます。（ほんとか？）
今回の例みたいのは処理速度なんて気にしなくて全然OKですが、何かしら頭の中で分岐がでてきたら、分岐しなくても実装できる方法を考えてみてもいいですね。
對 Optional 和 Optional Chaining 的感想


目前工作上已經穩定的在用 Swift 開發了，對於 Optional 變數也越用越熟悉了。前陣子在台北的一個 iOS 相關的聚會上知道有 Optional Chaining 這個東西之後，就開始在實務專案中大量的使用。

（這篇不會詳細講 optional 和 optional chaining 是什麼東西）

## 來點前言

### 源自對 if-let 和 guard-let-else 的繁雜感

這兩個東西在撰寫的時候，一定要製造出三行以上的空間給他，內心深處的某處是覺得這樣不是那麼漂亮；其中的 statement 可能又只有一行 `return` 。 

使用 optional chaining 對我來說可能就是比較好的解法吧！我想撰寫上也會比較漂亮吧。

### 源自驚嘆號的危險性

把一個變數用驚嘆號 unwrap 的危險就是，當裡面的值是 nil 的話，就一定會 crash 。如果是透過 `?` 使用的話，就會比較安全。

給個例子好了，這樣子在 runtime 就會出事：

``` swift
let property: AnyObject? = nil
print(property!) // 這樣就會 crash
```


這樣子寫則是會天下太平般的度過：

``` swift
let property: AnyObject? = nil
print(property?) // 這樣就不會 crash 了
```

來個串成 optional chaining 的例子：

``` swift
let status = self.selectedViewController?.currentStatus ?? .Default
```

如果要寫成 guard-let-else 的樣子的話，就要
1. 先判斷 `self.selectedViewController` 是不是空值
2. 接著再去判斷 currentStatus （這裡先假設這是個 enum）是不是 nil
3. 如果是 nil 的話，再手動給一個 .Normal 的狀態給他

這個例子使用了 optional chaning ，再透過 `??` 給它預設值，雖然有多了一些 `?` 在程式碼裡面，但是我覺得這樣寫在一些情境下會比使用 guard-let-else 這類的方式還要好維護。

## 使用的心得

用了一陣子 optional 和 optional chaining 之後，發現有些優缺點，想要分享一下。

### 優點

- 可以避免不經意的 crash ，當變數是 nil 時，也可以安全地渡過
- 不會有要判斷是否有值而必須寫大括弧 `{}` 的區塊
- 比較易讀 *（個人感想）*

（可能還有一些優點還沒想到或感受到）

### 缺點

- 當一個變數的值是 nil 的時候不會出事，但是只要沒有檢查、就不太容易察覺有問題
- 問號遍佈 *（這個的接受度好像就因人而異了）*
- optional chaining 在某些情形會有需要給預設值，在某些情境下給預設值會覺得不對勁，甚至會想到會不會對於記憶體用量會有什麼影響。

其中一個缺點有點像是 Objective-C 裡面處理 `nil` 的感覺：當 optional chaining 遇到第一個 nil 之後，該行接續下來的指令就都不會執行了，在 runtime 也不會報錯；若在撰寫的時候沒有注意到這個部分的話，也是可能會造成邏輯錯誤。換句話說就是使用的時候需要知道自己在做什麼事。

（以上可能還有一些缺點還沒想到或感受到）

## 結語和我自己的想法

### 宣告

當在 class 裡面宣告 property 的型別的時候，我認為沒有宣告成 optional type 的話，在大部分的情形下是很危險的。

因此我基本上都會這樣宣告：

``` swift
var name: String?
var viewContainer: UIView?
```

在取用的時候一致加上 `?` 或是用 `??` 給予預設值；當不想要給預設值的情境下，可能就會需要先用 guard-let-else 過濾掉。

### 盡可能地避免使用 `!`

在呼叫的時候盡可能地避免使用 `!` ，要是在 runtime 的時候發生未預期會有空值的情形之下，基本上是無法挽回；所以除非必要，不要用驚嘆號。

### 再之後

寫這篇文章是在 Swift 2.2 版本，之後 Swift 會怎麼變化、 coding style 會怎麼樣適應變化還是未知數。

現在則是有點對 Swift 3.0 （就是現在外面風聲鶴唳的說要大改的那個版本）有點期待，不過目前看 Swift 官方目前對於 3.0 的規劃，看起來衝擊好像也不會太大（我是這麼覺得啦）。等到時候再來寫心得吧！
pugで書いたhtml中の空要素が" />"で閉じられてしまっていた原因

doctype宣言の記述に誤りがあり、
空要素が**" />"**で閉じられて出力されていた。
html5だし、レギュレーション的にもこれだと困る。

```html5:html
<meta />
<img />
```

そもそも、古いリファレンスに倣っていたせいで、
警告：「unexpected text "!!!5"」と言われてしまい、

```jade:index.pug
!!!5
html(lang="ja")
head
  meta(charset="UTF-8")
  title Document
body
```

下記のようにdoctype宣言をして、
js-beautify整形後に無理やりgulp-replaceで書き換えていた。

```jade:index.pug
<!DOCTYPE html>
html(lang="ja")
head
  meta(charset="UTF-8")
  title Document
body
```

```js:gulpfile.js
.pipe(replace(/ \/\>/g, '>'))
```

pug（最近のjade記法）では下記のように「doctype html」と記述するようだ。
これだと空要素に"/"が付かない。

```jade:index.pug
doctype html
html(lang="ja")
head
  meta(charset="UTF-8")
  title Document
body
```

逆にもしも、html5で空要素を" />"で出力させたい場合は
**<!DOCTYPE html>**と記述すればOKですね!!
Git | ブランチルートから変更のあった全ファイルを一覧する

# コマンド

コミットをまたいで、変更のあったファイルを全てを表示する。

```bash
$ git diff --name-status $(git merge-base master HEAD)
```

# エイリアス

エイリアスを登録しておけば1コマンドで叩ける。

```bash:~/.gitconfig
[alias]
  changes = !git diff --name-status $(git merge-base master HEAD)
```

```bash
$ git changes
```

# 環境

- git version 2.3.8 (Apple Git-58)



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Laravelで動的に作成したファイルをダウンロードさせる


一時ファイルに一旦生成した後で、ダウンロードさせる為の一時ファイルを消すようにする。
その一時ファイルが、ダウンロード回数に比例して貯まり続けてディスク容量を食いつぶすことが起きてしまうので、ダウンロード完了と同時に一時ファイルは消す。

Laravel 5.2 にはあったので、Laravel5系にあるっぽい。


```php
<?php
class HogeController extends Controller {
	public function download (HogeService $service, $request) {
		$tmp_file = $service->generate_file( $request )->toCSV();
		
		// deleteFileAfterSend( true ) とすることでファイルをダウンロードしたと同時に削除をする
		return \Response::download($tmp_file, 'hoge-' . date('Ymd') . '.csv')
			->deleteFileAfterSend( true );
	}
}
```