OmniAICreator/Qiita-1.07M huggingface dataset:
GoogleAppsScriptでSQLライクにスプレッドシートを扱えるライブラリを作りました。

# SpreadSheetSQL

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
現在既にこのライブラリはメンテナンスしていません。
Apache License 2.0で公開しているため、そのライセンスの範囲内で利用してください。
＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

**GoogleAppsScript** で **GoogleSpreadSheets** をDBとして扱う際に
取得、変更、削除に手間がかかっていたので、SQLっぽく記述できるライブラリを作りました。

Github: https://github.com/roana0229/spreadsheets-sql
Document: https://script.google.com/macros/library/d/17p1ghyOkbWOhdE4bdBFhOXL079I-yt5xd0LAi00Zs5N-bUzpQtN7iT1a/6

## インストール方法

ProjectID: `MAoZrMsylZMiNUMljU4QtRHEMpGMKinCk`
ScriptID: `17p1ghyOkbWOhdE4bdBFhOXL079I-yt5xd0LAi00Zs5N-bUzpQtN7iT1a`

旧エディタ: GoogleAppsScript上でリソース > ライブラリ > ProjectIDを入力 > 選択 > 最新バージョンを選択
新エディタ: ライブラリ > ScriptIDを入力 > 選択 > 最新バージョンを選択

## できること

普段見るDBのViewのように1行目にカラム名を記述し、そのカラム名に対応する形でSQLを叩くことができます。

![スクリーンショット 2016-03-25 00.05.15.png](https://qiita-image-store.s3.amazonaws.com/0/42327/f5ac305d-1e35-d45d-de58-8c0f4622b9ea.png "スクリーンショット 2016-03-25 00.05.15.png")

## コード例

### インスタンスの生成

```js
var id = 'SpreadSheets ID';
var name = 'SpreadSheets SheetName';

SpreadSheetsSQL.open(id, name)
```

### 行の取得

```js
SpreadSheetsSQL.open(id, name).select(['name', 'age', 'married', 'company']).result();
```

#### クエリ結果 (json array)

```js
[{
  name: 'Gail',
  age: 20,
  married: true,
  company: 'Google'
},{
  name: 'Plato',
  age: 18,
  married: false,
  company: 'Yahoo'
}]
```

### オプション(filter,orderBy)

```js
SpreadSheetsSQL.open(id, name).select(xxx).filter('age < 20').result();
SpreadSheetsSQL.open(id, name).select(xxx).orderBy(['name', 'age']).result();
SpreadSheetsSQL.open(id, name).select(xxx).filter(xxx).orderBy(xxx).result();
```

### 行の追加

```js
SpreadSheetsSQL.open(id, name).insertRows([
  {name: 'Colt', age: 30, married: false, company: 'Microsoft'},
  {name: 'Smith', age: 24, married: true, company: 'Adobe'}
]);
```

### 行の更新

```js
SpreadSheetsSQL.open(id, name).updateRows({
  company: 'Adobe'
}, 'name = Colt');
```

### 行の削除

```js
SpreadSheetsSQL.open(id, name).deleteRows('name = Colt AND company = Adobe');
```


## 主なメソッド 

* open(): シートの取得
* select(): 取得するカラム名の選択
* filter(): 取得するデータのフィルタリング
* orderBy(): 取得するデータのソート
* result(): クエリ結果の取得
* insertRows(): データの追加
* updateRows(): データの変更
* deleteRows(): データの削除

## フィルタリングに利用可能な記号

| Symbol | Example                             |
|:------:|-------------------------------------|
|    =   | age = 20                            |
|    <   | age < 20                            |
|   <=   | age <= 20                           |
|    >   | age > 20                            |
|   >=   | age >= 20                           |
|   IN   | company IN Apple,Google             |
|   OR   | company = Apple OR company = Google |
|   AND  | company = Apple AND age > 20        |


# 備考

SlackのBotを作成する際にGoogleAppsScriptを利用して、GoogleSpreadSheetsをDBとして扱っています。
Qiitaのfeedの同じ投稿の被りや記事更新による連続投稿を対処するために
SpreadSheetsに溜め込み一定時間毎に投稿させるようにしています。

ただ、生のSpreadSheetsをDBとして扱うのはコードが分かり辛くなるため
一度、FusionTablesを利用してみたのですが制限が厳しすぎて
**じゃあ、SpreadSheetでSQLを叩ける用にしたらいいじゃないか**と思い作成しました。


このライブラリを使えば、SpreadSheetsをDBとして扱う際の手間がかなり楽になると思います！
機能追加、バグのissueやプルリクはいつでも歓迎しています。
良いGoogleAppsScriptライフを！
Excelって、すごいプログラマーらしいよ


[リンク]https://youtu.be/0WwFJ0Zg3d8?t=6m29s
まぁ、、、ね。
面白いから、このビデオ、頑張ってみるといいかも。
たしかに、、、ワークシート関数を使うのもある意味プログラミング。
というか、行っちゃいけない世界（笑
VBAのほうがよっぽど簡単。そんな話は端々にビデオにも出てきてますｗ
Excel、2次元配列をベースとしたプログラミング環境と思うと面白いと思いますよ。
UnityのDestroyは即時反映されないので、DestroyImmediateを使う


GameObject を Destroy() して、ヒエラルキー上からは消えても、実はしっかり存在している。
GetComponents で要素検索するとふつうにカウントされて返ってくるので、知らないとはまる（はまった）。

ちなみに、対象に null を入れても、GetComponents で取得できてしまう。

```C#
Debug.Log (GetComponents<Transform>().Length); // 1
Destroy (targetObject);
targetObject = null;
Debug.Log (GetComponents<Transform>().Length); // 1
```
_（GCに時間かかってる・・？）_

で、そういうときは、 DestroyImmediate を使うと即時破棄される。
めでたしめでたしかと思ったが、DestroyImmediate は推奨されてないっぽい。

http://docs.unity3d.com/ja/current/ScriptReference/Object.DestroyImmediate.html

> 直ちにオブジェクトを破壊する。ですが、Destroy 関数の方を使うことを推奨します

うーん、 コルーチンで非同期処理にすればよい・・のか？
子要素の全削除なら、Detach してやるって方法もある。

```C#
foreach (Transform n in transform)
{
	Destroy(n.gameObject);
}
transform.DetachChildren ();
```
Jupyterでnimを使おう

# <i class='fa fa-circle'> nimを使おう

[nim速いみたい](http://h-miyako.hatenablog.com/entry/2015/01/23/060000)だし、Pythonに似ているらしいので、試してみましょう。
[Jupyterのカーネル](https://github.com/ipython/ipython/wiki/IPython-kernels-for-other-languages)は、、、ない。
[dockerで作りました](https://hub.docker.com/r/tsutomu7/nim/)。

# <i class='fa fa-circle'> 実行方法

dockerのインストールは、[Install Docker Engine](https://docs.docker.com/engine/installation/)を見てください。

下記を実行すると、Jupyterが起動します。

```bash:bash
docker run -it --rm -p 8888:8888 tsutomu7/nim
```

ブラウザで「dockerホストのIPアドレス:8888」を開いてください。
右上の”New"から"nim"を選んでください。

# <i class='fa fa-circle'> 説明
セルにnimのプログラムを書いて、Shift+Enterで実行できます。

```nim:nim
echo "Hello world!"
>>>
Hello world!
```

「?」でコマンド一覧が出ます。

```nim:nim
?
>>>
?
!command
%run file
%time ...
%def ...
%inc ...
%web
```

「!」で始めるとシェルのコマンドを実行できます。

```nim:nim
!echo 'echo "OK"' >> test.nim
```

「%run [オプション] ファイル名」でファイルを実行できます。

```nim:nim
%run test
>>>
OK
```

```nim:nim
%run --opt:size test
>>>
OK
```

「%time [オプション]」で実行時間を計測できます。

```nim:nim
%time
echo "OK?"
>>>
OK?
real	0m 0.00s
user	0m 0.00s
sys 	0m 0.00s
```

「%def 名称」でプログラムファイルを作成できます。

```nim:nim
%def hello
proc Hello(): string = "Hello!"
>>>
Created hello.nim
```

```nim:nim
%def world
proc World(): string = "World!"
>>>
Created world.nim
```

「%inc 名称1 名称2 …」でファイルを取り込んで実行できます。

```nim:nim
%inc hello world
echo Hello() & World()
>>>
Hello!World!
```

「%web」でドキュメントのURLを表示します。

```nim:nim
%web
>>>
http://nim-lang.org/documentation.html
```

参考

- ドキュメント http://nim-lang.org/documentation.html
- チュートリアル等 http://nim-lang.org/learn.html
- gistサンプル https://gist.github.com/miyakogi/b1df00c8bc99927d9d0d

以上
pryで特定の入力やコマンドを履歴に追加しない方法 (histignoreオプション)

pryにもbashやzshのように行頭スペースで書いたコマンドやコードを無視してくれる設定がないものかと思い調べてみました。

#histignoreオプション
[`Pry.config.history.histignore`](https://github.com/pry/pry/pull/1484)というオプションを`.pryrc`に設定することで、入力内容を`pry_history`に記録しないようにすることができるそうです。

```rb:.pryrc
Pry.config.history.histignore = [
   /hist*/,
   "ls",
   "exit"
]
```

文字列や正規表現をArrayとして指定して、それらのどれか一つに入力行が合致すれば履歴への記録が行われません。下記のコードはpryが入力行を無視するかどうかを判定している部分のコードです。

```rb:lib/pry/history.rb
def should_ignore?(line)
    hist_ignore = Pry.config.history.histignore
    return false if hist_ignore.nil? || hist_ignore.empty?

    hist_ignore.any? { |p| line.to_s.match(p) }
end
```

#インストール
2016/02/12にpryのmasterブランチにマージされた機能なので、rubygemsからインストールできる現時点の最新版(0.10.3)にはまだ含まれていません。そのためgithubからインストールする必要があります。

自分でcloneしてビルドしてインストールしてもいいのですが、1コマンドで全部やってくれる[`specific_install`](https://github.com/rdp/specific_install)というgemを使いました。(gitプロトコルには対応してないのでhttpsを指定して下さい)

```bash
gem install specific_install
gem specific_install 'https://github.com/pry/pry'
```

Bundlerの環境だけにインストールしたい場合は、Gemfileにgithubのリポジトリを指定して`bundle install`もしくは`bundle update`して下さい。

```rb:Gemfile
gem 'pry', :git => 'git://github.com/pry/pry'
```


#設定
行頭にスペースを入力した行は、履歴に記録されないようにしたいと考え、下記のような設定を試してみました。

```rb:.pryrc
Pry.config.history.histignore = [
   /^\s.*$/
]
```

しかし、これだけでは行頭にスペースを入力しても履歴にしっかり記録されます。pryが自動インデントのために行頭スペースを削除した後、`histignore`オプションの判定が行われているからのようです。

`auto_indent`をオフにすることで上記問題は回避可能だったのですが、私の場合は自動インデントを捨ててまで、行頭スペースにこだわりがあるわけじゃなかったので、行頭にセミコロンを入力した時に履歴を記録しないように設定しました。その他にhistoryコマンドやlsコマンドも無視するようにしています。

```rb:.pryrc
Pry.config.history.histignore = [
   /^\s*;.*$/,
   /^(hist|history)(\s|$)/,
   /^ls(\s|$)/,
   "exit"
]
```

一つ注意点としては、行頭にセミコロンを入力した場合、その行はRubyのコードとして認識されるため、セミコロンに続いてpryコマンドを入力しても`Syntax Error`になります。(詳しくは[こちら](https://github.com/pry/pry/wiki/Command-system#invoking-commands)) 　そのため上記設定では、特定行のpryコマンドだけ履歴に保存しないということは残念ながら出来ません。

#参考資料
[Feature/add histignore by bronzdoc · Pull Request #1484 · pry/pry](https://github.com/pry/pry/pull/1484)
[Command system (pry/pry Wiki)](https://github.com/pry/pry/wiki/Command-system#invoking-commands)
[rdp/specific_install](https://github.com/rdp/specific_install)
JUnitをmacのEclipseで使う方法

#JUnitをインストール
以下からダウンロード
[JUnit](https://github.com/junit-team/junit/wiki/Download-and-Install)

* junit.jar

* hamcrest-core.jar

が必要。
適当なフォルダに保存。

#Eclipseでビルドパス設定
対象のプロジェクトを選択して
ビルドパス > ビルド・パス > ビルド・パスの構成 > ライブラリー > 外部Jar追加
でダウンロードした２つのjarファイルを追加

#テストコードを作成
とりあえず以下をテストする。

```java:Sample.java
public class Sample {
	public static int getNumber(){
		return 100;
	}
}
```

テストするクラスを右クリックして
新規 > JUnitテスト・ケース > 完了
するとテストケースが自動生成される。

```java:Sampletest.java
public class SampleTest {

	@Test
	public void test() {
		fail("まだ実装されていません");
	}

}

```
このまま実行するとテストは失敗するので、

```java:SampleTest.java
public class SampleTest {

	@Test
	public void test() {
		assertEquals(100,Sample.getNumber());
	}

}

```

これでテストが成功する。
Google App EngineでRailsを動かしてみる

[Google App EngineでRubyが使えるようになったと聞いた](http://www.publickey1.jp/blog/16/google_app_enginerubynodejsgcp_next_2016.html)ので、HelloWorldしてみます。

基本的には[こちら](https://cloud.google.com/docs/)のRuby Starterにそって進めます。

### 1. ウェブコンソールからプロジェクトを作る

https://console.cloud.google.com/

「プロジェクトを作成」からプロジェクトを作ります。
あと、以下からプロジェクトの課金を有効にしないと最後deployのところでエラーが出たので有効にしました。

https://console.cloud.google.com/project/_/settings

<img width="638" alt="プロジェクト.png" src="https://qiita-image-store.s3.amazonaws.com/0/29793/dbca6d63-0851-1d62-fa8f-396a64459107.png">

### 2. Google Cloud SDKを入れる
https://cloud.google.com/sdk/

以下で簡単に入ります。

```
curl https://sdk.cloud.google.com | bash
```

### 3. Railsのプロジェクトを作る

普通にRailsプロジェクトを作って、

```
mkdir app-engine-hello-world
cd app-engine-hello-world
rails new .
```

律儀に`HelloWorld`という文字が表示されるようにします。

```
# /app/controllers/hello_world_controller.rb

class HelloWorldController < ApplicationController
  def index
    # Say hello!
    render text: "Hello, world!"
  end
end

# /config/routes.rb

root 'hello_world#index'

```

### 4. Google Cloud SDKで初期化する

Railsのプロジェクトディレクトリでコマンドを叩きます。

```
gcloud init
```

Googleアカウントの認証とか、プロジェクト名など選びます。

### 5. Deploy

おもむろにそのまま勢いでdeployしようとしてみます。

```
gcloud preview app deploy
```

`app.yaml`がないから作るとか言われるので、作ってもらいます。
そしてそのままdeployが進もうとするのですが、app.yamlの中身が微妙だったので、最後だけcontinueせずに`app.yaml`を修正します。

- entrypointの環境を`production`にします
- env_variablesというキーで環境変数を渡せるようなので`SECRET_KEY_BASE`を書きます。

```app.yaml
runtime: ruby
vm: true
entrypoint: bundle exec rackup -p 8080 -E production config.ru
env_variables:
  SECRET_KEY_BASE: 'hogehoge'
```

`SECRET_KEY_BASE`はここに書くなら`secrets.yml`に書いてもいいんじゃないの？という気になります。

再度、deployします。deployはちょっと待ちます。


```
gcloud preview app deploy
```

### 6. 完成！

deploy完了時にurlが表示されるので、開いてみましょう。
`Hello World`と表示されることでしょう。

### 7. おまけ

公式にもうすこし色々やるチュートリアルが用意されています。

https://cloud.google.com/ruby/getting-started/tutorial-app

datastoreやcloud_storage、workerまでサンプルがあります。
コード自体は以下にあるようです。

https://github.com/GoogleCloudPlatform/getting-started-ruby

あと、これがdeploy後のconsoleなのですが、App EngineではなくCompute Engineのインスタンスが立ち上がっています。

<img width="506" alt="ホーム_-_ruby-hello-world.png" src="https://qiita-image-store.s3.amazonaws.com/0/29793/4fa8685d-b23c-c04d-6d67-b7c30322d127.png">

Managed VMだからだと思うんですが、料金はどうなるんでしょうね？無料期間が３ヶ月あるようなので様子をみてみます。

以上です。
windowsでファイルやディレクトリを日毎にバックアップするバッチ

#windowsでファイルやディレクトリを日毎にバックアップするバッチ
自宅のファイルを日ごとに圧縮してバックアップしたくなったので作成してみました。windowsに同封されているzipをコマンドプロンプトから使うためには「PowerShell v5」からでないと使えないらしい。WSHを使うとできるみたいだが、調べてみるとものすごく回りくどいことをしないといけない。なので圧縮には7zipというコマンドプロンプト用のexeをダウンロードして使ってます。インストールはしなくてexeを置いておくだけで使えるのでまぁ入れやすいかな。。と。

※次項からのソースを使用されて、何かあった場合は責任もてませんので自己責任でお願いします。

##7zip
batchファイルと同じフォルダに「7z1514-extra」というフォルダを作り中身を入れてください。
下記からダウンロードできます。
7-Zip Extraをダウンロードしてください。
https://sevenzip.osdn.jp/download.html

説明：
https://sevenzip.osdn.jp/howto/non-install-compress.html

##バックアップ実行シェル
今回は複数のバックアップを取りたかったので呼び出す側のシェルを作ってます。
hogehogeBackup.batをタスクスケジューラに登録します。

```lang:hogehogeBackup.bat
@ECHO OFF

set ERROR_LEVEL=0
cd /d %~dp0

call backupByZip バックアップ対象 バックアップ先ディレクトリ 40
if ERRORLEVEL 1 (set ERROR_LEVEL=1)
call backupByZip バックアップ対象２ バックアップ先ディレクトリ２ 40
if ERRORLEVEL 1 (set ERROR_LEVEL=1)

if "%ERROR_LEVEL%" EQU "0" (
    exit /b 0
) else (
    exit /b 1
)
```

backupByZip.batです。コメントに使用方法を書きました。

```lang:backupByZip.bat
@ECHO OFF

rem 毎日バックアップを取る処理です。結果はイベントビュアーにID101で吐かれます。
rem 第一引数：バックアップ対象ファイル、またはディレクトリ
rem 第二引数：バックアップ後のZIPファイル設置ディレクトリ（最後の\は不要）
rem 第三引数：何日前のバックアップを削除するか（削除しない場合は省略可）
rem 例）backupByZip c:\tmp\target.txt c:\backup 10

rem ERROR_MSGをechoしたい場合は「1」にしてください
set DEBUG_MODE=0

set BATCH_DIR=%~dp0
set ZIP_EXE=%BATCH_DIR%\7z1514-extra\7za.exe a -tzip
set TODAY=%date:~0,4%%date:~5,2%%date:~8,2%
set ERROR_MSG=access_backup.batエラー：

set BACKUP_TARGET=%1
set BACKUP_DIR=%2
set NUMBER_OF_BK=%3

if "%BACKUP_TARGET%" EQU "" (
    set ERROR_MSG=%ERROR_MSG%引数が足りません。
    goto :ERROR
)
if "%BACKUP_DIR%" EQU "" (
    set ERROR_MSG=%ERROR_MSG%引数が足りません。
    goto :ERROR
)

if not exist %BACKUP_TARGET% (
    set ERROR_MSG=%ERROR_MSG%%BACKUP_TARGET%が存在しません。
    goto :ERROR
)

if not exist %BACKUP_DIR%\ (
    set ERROR_MSG=%ERROR_MSG%%BACKUP_DIR%が存在しないかディレクトリではありません。
    goto :ERROR
)

rem 圧縮処理
%ZIP_EXE% %BACKUP_DIR%\%TODAY%.zip %BACKUP_TARGET%

if ERRORLEVEL 1 (
    set ERROR_MSG=%ERROR_MSG%%BACKUP_TARGET%の圧縮処理でエラーが発生しました。
    goto :ERROR
)
if not exist %BACKUP_DIR%\%TODAY%.zip (
    set ERROR_MSG=%ERROR_MSG%%BACKUP_DIR%\%TODAY%.zipが作成できませんでした。
    goto :ERROR
)

if "%NUMBER_OF_BK%" EQU "" (
    goto :SUCCESS
)

rem 削除処理の為に日付取得
echo WScript.Echo DateAdd("d",-%NUMBER_OF_BK%,Date()) > tmp_date.vbs
for /f "tokens=1-3 delims=/-" %%A in ('cscript //nologo tmp_date.vbs') do set DELETE_DAY=%%A%%B%%C
del tmp_date.vbs

rem 削除処理
if exist %BACKUP_DIR%\%DELETE_DAY%.zip (
    del /q %BACKUP_DIR%\%DELETE_DAY%.zip
    
    if ERRORLEVEL 1 (
        set ERROR_MSG=%ERROR_MSG%%BACKUP_DIR%\%DELETE_DAY%.zipの削除処理でエラーが発生しました。
        goto :ERROR
    ) else if exist %BACKUP_DIR%\%DELETE_DAY%.zip (
        set ERROR_MSG=%ERROR_MSG%%BACKUP_DIR%\%DELETE_DAY%.zipの削除処理でエラーが発生しました。
        goto :ERROR
    )
)

:SUCCESS
if "%DEBUG_MODE%" NEQ "0" (
    echo 成功！！
)

eventcreate /T INFORMATION /ID 101 /D %BACKUP_TARGET%のバックアップ処理が終了しました。
exit /b 0

:ERROR
    if "%DEBUG_MODE%" NEQ "0" (
        echo %ERROR_MSG%
    )
    eventcreate /T ERROR /ID 101 /D %ERROR_MSG%
    exit /b 1
```

以上
RedmineでExcel差分表示・調査メモ

RedmineでPJ管理しており
仕様書はだいたいExcelでかかれているという開発環境はよくあると思います。

Redmineは以前のリビジョンとの差分をWeb上に表示する機能がありますが、
デフォルトだとExcelなどバイナリファイルだとうまく表示することができません。

というわけでExcelの差分をRedmine上で表示する方法について調査しています。

今、第一候補に挙がっているのがxdoc2txtというコマンドを使う方法。

>xdoc2txtはPDF,WORD,EXCEL,一太郎などの各種バイナリ文書から、テキスト要素を抽出 する汎用テキストコンバータであり、Windowsのコマンドラインで動作します。

引用元：[xdoc2txt](http://ebstudio.info/home/xdoc2txt.html)

Redmineの差分を表示する処理の個所で、差分表示するターゲットのファイルの拡張子を判定して、Excelだったらxdoc2txtに渡して出力結果を差分取るようにすれば表示できるはず。

そのうち検証してみます。
Ramdaで関数型チックにFizz Buzz

# はじめに
関数型ちっくにFizz Buzzをやるのってどうすればいいんだろう？と考えて作ってみました。ちなみに関数型ちっくのルールとして考えているのは、以下の2つです。

1. 変数に2度代入をしてはいけない
2. なるべくmapとかfilterを使ってロジックを組んでみる
3. ラムダ式はできるだけ1〜2行ですませる

# コード

### ループ処理にmapを使っただけ

```js
let array = R.times((i)=>i+1, 100);
let fizzBuzz = (num) =>{
  if(num%3===0 && num%5===0) {
    return 'Fizz Buzz';
  } else if (num%3===0) {
    return 'Fizz';
  } else if (num%5===0) {
    return 'Buzz'
  } else {
    return '' + num;
  }
}
let result = R.map(fizzBuzz, array);
result.forEach((item)=>console.log(item));
```

一番最初に書いたもの。これだけでも変数に2度代入しない、という原則は守れてる。forループで無駄に変数を使うよりはマシ程度。

### ifの代わりにcondを使った(2015/03/30追記)

```js
let array = R.times((i)=>i+1, 100);
let fizz = num => num % 2 === 0;
let buzz = num => num%5 === 0;
let fizzBuzz = num => fizz(num) && buzz(num);
let func = R.cond([
  [fizzBuzz, R.always('fizzBuzz')],
  [fizz, R.always('fizz')],
  [buzz, R.always('buzz')],
  [R.T, num=> ''+num]
]);
let result = R.map(func, array);
result.forEach((item)=>console.log(item));
```

Ramdaのドキュメントを読んでいたら、R.condというのを見つけて脊椎反射で使ってみたくなりました。

http://ramdajs.com/docs/#cond

書いた時は結構いけると思ったんですが、後から見返すと単純にmapを使ったパターンより複雑になってて全然行けてないじゃんと思いました。そして色々考えて、下のやつを思いつきました。

### ↑のを少しだけかっこ良くしてみた(2015/03/30追記)

```js
let array = R.times((i)=>i+1, 100);
let divasable = div => num => num % div === 0;
let func = R.cond([
  [divasable(15), R.always('fizzBuzz')],
  [divasable(3), R.always('fizz')],
  [divasable(5), R.always('buzz')],
  [R.T, num=> ''+num]
]);
let result = R.map(func, array);
result.forEach((item)=>console.log(item));
```

↑のはさすがに無いわと思い、追記しました。ここまで書いたらやっとcondを使う意義が見出せた気がします。すごく自己満足ですが、divasableのところがちょっとかっこ良く書けたような気がします。でもあとから見ると、Ramda覚えたての猿みたいなコードなんだろうなあ、と思う。

# 最後に
fizzBuzz関数がいけてないっす。これをもう少しスマートに書く方法はないものか。見つけ次第、追記します。

## 2015/03/30
R.condを使った2パターンを追加しました。
SumoLogicをLinuxにインストールして設定する

# SumoLogicとは
ログ収集、解析のサービス。
https://www.sumologic.com/

# インストール
## 説明動画
https://support.sumologic.com/hc/en-us/articles/205564888-Installing-a-Linux-Collector

## サイトからインストールシェルをダウンロードする
<img width="1124" alt="Screenshot_3_24_16__21_00.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/109450/bd2eb231-16f9-d4a1-5d66-f4cea9e03a1d.jpeg">

## SCPでサーバにアップロードする
```shell-session
$ scp -P 22 SumoCollector_linux_amd64_19_144-6.sh  username@xx.xx.xx.xx:/tmp/
```

## サーバでシェルを実行する
```shell-session
$ chmod 744 /tmp/SumoCollector_linux_amd64_19_144-6.sh
$ /tmp/SumoCollector_linux_amd64_19_144-6.sh
```

# 設定
## sumo.confを編集する
```shell-session:/etc/sumo.conf
name=xxx
accessid=xxx
accesskey=xxx
```

## 自動起動の設定
```shell-session
$ /opt/SumoCollector/collector install
```

# 管理画面
## Source名とLocalのパスを設定
<img width="1127" alt="Screenshot_3_24_16__22_49.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/109450/977f8692-7628-3902-1412-374025bc24f4.jpeg">

## 条件を指定してログを検索
![無題クリップ_032317_085340_AM.jpg](https://qiita-image-store.s3.amazonaws.com/0/109450/eb2d1556-acde-c481-a167-50bce47ec0ef.jpeg)
Ramdaを使ってjavascriptで1〜100までの配列を作る

# はじめに
javascriptで関数型ちっくにFizzBuzzをやりたいなあと思い、まずは1〜Nまでの配列を作ってみるかと思いました。こう言う場合haskellなら

```hs
[1...100]
```

みたいにスマートに書けるのですが、javascriptでも似たようなことができないのか？と思います。少し考えてみて、[Ramda.times](http://ramdajs.com/docs/#times)を使えば上手くいきそうだなと思いました。

# コード

```js
R.times((i)=>i+1, 100);
```

例のごとくRamdaを使っています。これで1〜100までの配列が作れます。もう少し抽象的に書くと、

```js
R.times((i)=>1+初期値, 最大値)
```

となります。

# 解説
R.timesはある関数をn回呼び出して、その結果群を配列として返すというものです。

```js
R.times(
  (i)=>{}  /* 呼び出される関数、iには0から始まる呼び出し回数が入る */, 
  n/* 繰り返しの回数*/)
```

上で書いた式は(i)=>i+1となっていましたが、これはループ回数に+1を足したものを返すという意味になります。ループは0からはじまるので、+1をしている訳です。

# 最後に
調べたらもっとスマートに書けそうな方法はありそうです。見つけ次第、追記していこうと思います。
[Linux] ディスクイメージに複数のパーティションがある時のマウント方法

ハードディスクなどのすべての領域をddでファイルに落とした場合、作成されたディスクイメージに複数のパーティションが存在する。

これをloopデバイスでマウントするにはoffsetオプションを指定すれば良い

# マウント方法

## コマンド書式

<pre>
# mount -o loop,offset=${offset} ${image_file} ${mount_point}
</pre>

offsetに指定する値は、パーティションの開始位置に512を掛けた値です

例えば、以下の場合で、パーティション2をマウントしたいとします

<pre>
# fdisk -l pidora-sdcard_20160322.img 
ディスク pidora-sdcard_20160322.img: 7.5 GiB, 8043626496 バイト, 15710208 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0x0009c1ec

デバイス                    起動 開始位置 最後から セクタ サイズ Id タイプ
pidora-sdcard_20160322.img1 *        2048   104447   102400    50M  c W95 FAT32 (LBA)
pidora-sdcard_20160322.img2        104448 15523839 15419392   7.4G 83 Linux
</pre>

開始位置が 104448 なので、これに 512 を掛けた 53477376 を指定します

電卓を使って計算するのは面倒なので、exprコマンドを使っても良いです

<pre>
$ expr 104448 '*' 512
53477376
</pre>

この結果をコマンドに渡せば更に楽です

<pre>
# mount -o loop,offset=`expr ${partition_start} '*' 512` ${image_file} ${mount_point}
</pre>

## 実行例

<pre>
# mount -o loop,offset=`expr 104448 '*' 512` pidora-sdcard_20160322.img /mnt/hd
</pre>

dfコマンドでマウント出来ていることを確認します

<pre>
# df /mnt/hd
ファイルシス   1K-ブロック    使用  使用可 使用% マウント位置
/dev/loop0         7525616 4099892 3081608   58% /mnt/hd
</pre>
CakePhp3でGmailからメールを送る

CakePhp3では、メールサーバがあれば割と簡単にメールを送ることができる。
手軽に利用できるメールサービスといえば、Gmail。
今回はGmailのSMTPサーバを使って、CakePhp3からメールを送るための設定について。

#アカウントを取得する
まずはGmailのメールアドレス(アカウント)を取得する。
普通にアカウントを作ればいい。
既にアカウントを持っている場合でも、セキュリティの設定などを行っていると、
上手く認証できない可能性が高いのでできるだけ新しいアカウントを作ったほうがいいと思う。

#メール送信設定
CakePhp3の`config/app.php`にメールの送信に関する設定を書いておく。
EmailTransportという部分があるので、そこを設定する。

```php:config.php
    'EmailTransport' => [
        'default' => [
            'className' => 'Smtp',
            // The following keys are used in SMTP transports
            'host' => 'ssl://smtp.gmail.com',
            'port' => 465,
            'timeout' => 30,
            'username' => 'gmailのメールアドレス',
            'password' => 'gmailのパスワード',
            'transport' => 'Smtp',
            'client' => null,
            'tls' => null,
            'url' => env('EMAIL_TRANSPORT_DEFAULT_URL', null),
        ],
    ],
```

#メールを送信する
メールを送信するときは、Emailクラスを使う。
とりあえず、一番上でuse宣言をして、処理の中でEmaliクラスを使って、メールの処理を書く。

```php
use Cake\Mailer\Email;
…

    public function send(){
		$email = new Email('default');
		$email->from(['送り元アドレス' => '名前'])
			  ->to('送り先アドレス')
			  ->subject('タイトル')
			  ->send('本文');
	}
```

この処理を実行すると、'送り元アドレス'から'送り先アドレス'へメールが送信される。
`to`のほかにも`cc`や`bcc`といったメソッドも存在する。
複数のアドレスに送るときは配列で指定するか、`addTo`(`addCc`、`addBcc`)メソッドで追加していけばいい。
(`to`、`cc`、`bcc`を何度も書くと上書きされる)
JavaScriptの疑問点


## 構文

### return文とは

>『return文』を使用すると関数(メソッド)が実行されたときにどの値を返すか指定することができます。そしてそれと同時にその関数の処理も終了させることができますので非常によく使われる構文になります。

<a href="http://wp-p.info/tpl_rep.php?cat=js-intermediate&fl=r7" target="_blank">return文の使い方 | JavaScript中級編</a>

例

```js
 function hoge(){
  return 0; //『0』を返すように定義します。
 }
 var x = hoge(); //変数『x』に関数『hoge』から帰ってきた『0』が代入されます。
 
 console.log(x); //0が出力
```




## 用語

### スーパークラス
クラスを継承する場合、その元になるクラスを「スーパークラス」とか「ベースクラス」と呼びます。

引用：<a href="http://www.geocities.jp/m_hiroi/light/js05.html" target="_blank">お気楽 JavaScript プログラミング超入門</a>

### コンストラクタ
コンストラクタは、オブジェクトを作成し、初期化する関数オブジェクト

引用：<a href="http://javascript.keicode.com/lang/constructors.php" target="_blank">コンストラクタ - JavaScript 入門</a>
Travis CI に CVXOPT, NumPy, SciPy をインストールする

# 概要
[Travis CI](https://travis-ci.org/) で [CVXOPT](http://cvxopt.org/), [NumPy](http://www.numpy.org/), [SciPy](http://www.scipy.org/) を使った Python プログラムをテストしたい．
これらのライブラリは pip だけではインストールできなかったので，他に必要なパッケージをまとめる．

**CVXOPTがSuiteSparseの同梱を辞めたことによる修正（2017年2月5日）**

# 前提
テストの実行に必要なライブラリは `requirements.txt` に書かれているものとする．
この時，Travisは自動で `pip install -r requirements.txt` してくれるので， install ステップは不要．

# .travis.yml
まとめると，CVXOPT のインストールに `libblas-dev` と `liblapack-dev` が，
SciPy のインストールに `gfortran` が必要なので，`.travis.yml` の `addons.apt.packages` を使って用意しておく．

また，CVXOPTがSuiteSparseの同梱を辞めたため，自前で用意しておく必要がある．
この手続きは before_install に記述する．

```yaml:.travis.yml
language: python
python:
  - 2.7
addons:
  apt:
    packages:
      - libblas-dev
      - liblapack-dev
      - gfortran
before_install:
  - wget http://faculty.cse.tamu.edu/davis/SuiteSparse/SuiteSparse-4.5.3.tar.gz
  - tar -xf SuiteSparse-4.5.3.tar.gz
  - export CVXOPT_SUITESPARSE_SRC_DIR=$(pwd)/SuiteSparse
script:
  - ./unittest_script.py
```

古いバージョンだと `before_install` に `sudo apt-get install` を使って用意していたようだが，コンテナベースの場合 `sudo` は使えず， `addons.apt` を使うようだ．

ちなみに，今回の `requirements.txt` は

```requirements.txt
cvxcanon>=0.1.1           # via cvxpy
cvxopt>=1.1.9
cvxpy>=0.4.8
cycler>=0.10.0            # via matplotlib
ecos>=2.0.4               # via cvxpy
fastcache>=1.0.2          # via cvxpy
functools32>=3.2.3.post2  # via matplotlib
matplotlib>=2.0.0
multiprocess>=0.70.4      # via cvxpy
numpy>=1.12.0
pyparsing>=2.1.10         # via matplotlib
python-dateutil>=2.6.0    # via matplotlib
pytz>=2016.10             # via matplotlib
scipy>=0.18.1
scs>=1.2.6                # via cvxpy
six>=1.10.0               # via cvxpy, cycler, matplotlib, python-dateutil
subprocess32>=3.2.7       # via matplotlib
toolz>=0.8.2              # via cvxpy
```

である．
Docker toolbox installing on Win7 でハマった箇所

# 環境
- Windows 7 sp1
- Docker toolbox 1.10.3
- proxyとVPNが必要な環境

# proxyの設定
- 現象: インストーラーの挙動が重い/遅い。boot2dockerのisoイメージの取得に失敗する　など
- 対策:

1. http_proxyとhttps_proxyをPCの環境変数に設定した後インストーラーを実行

2. "Docker Quickstart Terminal"を実行する前に、git bash側にも同様に環境変数http_proxyとhttps_proxyを設定する

_参考_
- http://qiita.com/mpppk/items/5b4544236c4f6c0ace9c
- http://qiita.com/seri/items/270367654999d3ac0465

#McAfee Host Instruction Prevention
- 現象: McAfee HIPに阻まれて以下のエラーになる
```Failed to open/create the internal network 'HostInterfaceNetworking xx (VERR_INTNET_FLT_IF_NOT_FOUND)```

- 対策:

1. McAfee Host IPS, Network IPS, Firewallを一時的に無効にする
2. ホストオンリーネットワークを削除（[参考](http://blogs.yahoo.co.jp/beachinside/9298238.html)）
3. C:\Users\xxx\.docker\machine\certsの中身とmachines/defaultフォルダを削除
4. "Docker Quickstart Terminal"を再実行

- 参考

https://github.com/docker/machine/issues/2047
(chadswen commented on 13 Nov 2015)


# TLS証明書関連エラー
http://qiita.com/kooohei/items/d370701d6c39727334f3
結局VPN経由はあきらめて、上記1~4までの手順を再実行...
数値を有効桁数で丸めて出力（ワンライナー）

こんにちは。
「[数値を(基準値の倍数で|有効桁数で)丸めるgem](http://qiita.com/diaphragm/items/0a3f9a70ec9c905ff01e)」の中身をワンライナー化してみました。

```console
$ echo "[0.12345678901234567890, -123.45678901234567890]" | ruby -pe '$_.gsub!(/(-?\d*\.\d*)/) {"#{(x=$1.to_f;n=10**(Math.log10(x.abs).floor-15);(x.div(n)*n).to_f)}"}' | pee 'cat' 'jsonlint'
[0.1234567890123456, -123.4567890123457]
<stdin>: ok
$
$ echo "[0.12345678901234567890, -123.45678901234567890]" | jsonlint
<stdin>:1:1: Warning: Floats larger or more precise than an IEEE "double" may not be portable
   |  At line 1, column 1, offset 1
<stdin>: ok, with warnings
```
jsonlint は、demjson に付属のものを使いました。

```console
$ pip search demjson
demjson (2.2.4)  - encoder, decoder, and lint/validator for JSON (JavaScript
                   Object Notation) compliant with RFC 7159
```
【VBS】ArrayListの使い方を教えて下さい。

ArrayListを繰り返していますが、関数にする方法を教えて下さい。
よろしくお願いします。
```vbs:filename.vbs
&#39;文字,X座標,Y座標
&#39;「入力」
&#39;文字A,3.0,0.0
&#39;文字B,3.0,-15.0
&#39;文字C,12.0,0.0
&#39;  ↓↓↓
&#39;「出力」
&#39;文字A,文字C
&#39;文字B
&#39;------------------------------------------------------------------
const MyFS=","
const MyOFS=","
dim gyoin(50)
ngyo=3
gyoin(0)="文字A" & MyFS &  "3.0" & myFs &   "0.0"
gyoin(1)="文字B" & MyFS &  "3.0" & myFs & "-15.0"
gyoin(2)="文字C" & MyFS & "12.0" & myFs &   "0.0"
&#39;------------------------------------------------------------------
const MojiTakasa=1.0
dim gyoc(50)
dim gyox(50)
dim gyoy(50)
dim gyocyx(50,50)
Dim myArrayListX
Set myArrayListX = CreateObject("System.Collections.ArrayList")
Dim myArrayListY
Set myArrayListY = CreateObject("System.Collections.ArrayList")
&#39;------------------------------------------------------------------
for i=0 to ngyo-1
    cxy=split(gyoin(i),",")
    gyoc(i)=cxy(0)
    gyox(i)=int(cxy(1)/MojiTakasa)
    gyoy(i)=int(cxy(2)/MojiTakasa)
    myArrayListX.add gyox(i)
    myArrayListY.add gyoy(i)
next
&#39;-------------------------------------------------------------------
myArrayListX.Sort
For i = myArrayListX.Count - 1 To 1 Step -1
  If myArrayListX(i-1) = myArrayListX(i) Then
      myArrayListX.RemoveAt(i)
  End
 If
Next
&#39;
myArrayListY.Sort
myArrayListY.Reverse
For i = myArrayListY.Count - 1 To 1 Step -1
  If myArrayListY(i-1) = myArrayListY(i) Then
     
 myArrayListY.RemoveAt(i)
  End If
Next
&#39;-------------------------------------------------------------------
For i = 0 To ngyo-1
For j = 0 To myArrayListY.Count-1
For k = 0 To myArrayListX.Count-1
    if gyoy(i)=myArrayListY(j) and _
       gyox(i)=myArrayListX(k) then
       if gyocyx(j,k) = "" then
          gyocyx(j,k) = gyoc(i)
       else
          gyocyx(j,k) = gyocyx(j,k) & "と" & gyoc(i)
       end if
    end
 if
Next
Next
Next
&#39;-------------------------------------------------------------------
otMoji=""
For j = 0 To myArrayListY.Count-1
For k = 0 To myArrayListX.Count-1
if  k = 0 then
    otMoji=otMoji & gyocyx(j,k)
else
    otMoji=otMoji & MyOFS & gyocyx(j,k)
end if
Next
    otMoji=otMoji & vbCrLf
Next
&#39;-------------------------------------------------------------------
   msgbox otMoji
```
[Laravel5] タスクスケジューラーで年を指定する

あまり使用する機会もなさそうですが、LaravelのArtisanコマンドのスケジューラーは、通常crontabでは指定の出来ない年指定ができます。

通常はこのようにcrontabの指定と同じように設定します。

```php
$schedule->command('foo')->cron('* * * * *');
```

年指定を行いたい場合は6番目に年を指定します。

```php
$schedule->command('foo')->cron('* * * * * 2016');
```

使いドコロは、、、12月末で手放すシステムだけど年明け元旦に1度だけ回さなきゃいけないバッチがある時などでしょうか。
メニューバーやサイドバーをモバイル版に対応させる

<h2>
Railsのviewでメニューバーやサイドバーをスマホ対応にさせる
</h2>
bootstrapをつかうのでもし使えない場合は

```ruby:Gemfile.rb
gem 'twitter-bootstrap-rails'
```
して`bundle install`します.
レイアウトとしてつかうので
`_menubar.html.haml`という命名にしておきます.bootstrapでは、グリッドシステムもそうですが、
`hidden-xs`=>モバイルの画面の大きさだと見えなくなるクラス
`visible-xs`=>モバイルの画面の大きさでのみ見えるクラス
を提供しているのでこれを利用します

```haml:layouts/_menubar.html.haml
.slidebar-nav
  .navbar.visible-xs{role:"navigation"}
    .navabr-header
      %button.navbar-toggle.bg-dark{type:"button","data-toggle"=>"collapse", "data-target"=>"#custom-collapse"}
        %span.sr-only Toggle navigation
        %span.icon-bar.bg-white
        %span.icon-bar.bg-white
        %span.icon-bar.bg-white
      %span.visible-xs.navbar-brand.menubar-title=link_to "",root_path
.collapse.navbar-collapse#custom-collapse{style:"padding: 0px;"}
  .hidden-xs
    %h2= link_to "ここにnavbar-brandと同じタイトルを入れます",root_path
    .p-h-xs
  %ul.menubar-list-module
    /-#ここにmenubarのコンテンツを書きます
    %li=link_to "","".....
     ....
    %li =link_to "",""
```
こんな風にすればウインドウを小さくした時
タイトルとボタンが横並びになってくれるヘッダーが生成されます(^ ^)
.aファイルなどのライブラリの中身を確認する

iOSアプリを開発していて、duplicate symbolが発生してどこがduplicateしているか確認したかったので。

まずバイナリファイルのアーキテクチャを確認

```
$ lipo -info hoge.a
Architectures in the fat file: hoge.a are: armv7 armv7s i386 x86_64 arm64
```

armv7、armv7s、i386、x86_64、arm64でビルドされていることがわかったので、このアーキテクチャを元に分解する。

```
$ lipo -thin x86_64 hoge.a -output hoge_x86_64
```

.oファイルを検索

```
$ ar -t hoge_x86_64 | grep Huga.o
Huga.o
```

.oファイルを取り出す

```
$ ar -x hoge_x86_64 Huga.o
```

.oファイルの中身を確認（ディスアセンブル）

```
$ gobjdump -d Huga.o
```

gobjdumpが入ってない場合はインストールしてください。
macの場合はbrewでいけます。

```
$ brew install gobjdump
```



参考ページ
arコマンド:http://kazmax.zpp.jp/cmd/a/ar.1.html



確認すると言っても結局バイナリファイルなのでメソッド名程度しか確認できませんが( ´ー｀)
redisメモ


# Pub/Subチャネルをワイルドカード指定する

`PSUBSCRIBE`コマンドを使うと購読できる。

```
PSUBSCRIBE groups.ABC.*
```

購読をやめるときは `PUNSUBSCRIBE`を使う。

```
PUNSUBSCRIBE groups.ABC.*
```

送信側は変わらず。

```
PUBLISH groups.ABC.message "Hello! This is clientB"
```
docker hub で特定のgithubタグのビルドを行いたい時

# 概要

masterでのビルドは成功するのに、それにタグをつけたものがうまくビルドできず error になったときに、そのタグだけビルドしたい。


# 結論

webhook 経由でビルドを開始することができる。

# やったこと

Build Triggers をアクティベートしてShow exampleにある例にならって実行すれば良い。

githubの特定のrelease(tag)の場合は、source_type Tag のところを参考にすうる

```
curl -H "Content-Type: application/json" --data '{"source_type": "Tag", "source_name": "ビルドしたいタグ"}' -X POST TriggerURLにあるアドレス
```

## そもそも、なぜ同じと思われるものが失敗するのか？？

ビルドが失敗するのは時間が長いから？？？
こっちの原因は調査していない
vimのコマンドライン補完を自作する。

vimのコマンドライン補完関数の基本的な作り方まとめ。


#書式

コマンドに独自の補完関数を指定するときは、コマンド定義時に引数に`-complete=customlist,{func}`を指定する。

```vim
command! -nargs=1 -complete=customlist,{func} {cmd} {rep}
```


補完関数は補完候補のリストを返せばいい。

```vim
function {func}(lead, line, pos)
  return ['abc', 'efg']
endfunction
```

###引数の意味

|仮引数名|説明|
|:----|:-----------------|
|lead |カーソル下の引数文字列|
|line |コマンド名を含めたコマンドライン全体の文字列|
|pos  |lineの先頭文字を0とした時のカーソル位置|



#サンプル
`:edit`をラップしただけの`:Edit`コマンドと補完候補を3つ返すだけの補完関数。

```vim
" コマンドを定義
command! -nargs=1 -complete=customlist,CompSamp Edit :edit <args>

" 補完関数を定義
function! CompSamp(lead, line, pos)
  return ['~/.bashrc', '~/.zshrc', '~/vimrc']
endfunction
```

#デバッグ
補完関数中では出力ができないようなので、`:echomsg {str}`でメッセージ領域に出力して、`:message`コマンドで確認する。

#デバッグ (vimconsole)
毎回`:message`を呼ぶのが面倒なら[rbtnn/vimconsole](https://github.com/rbtnn/vimconsole.vim/)を使う手もある。
プラグインを導入したら以下の設定をするといい。

```vim
let g:vimconsole#auto_redraw = 1
```

最低限の使い方説明(詳細は[doc](https://github.com/rbtnn/vimconsole.vim/blob/master/doc/vimconsole.txt)を参照)。

```vim
:VimConsoleOpen              # 出力用ウィンドを開く。
:VimConsoleLog 'message'     # メッセージを出力する。
```


#参考資料

`:h :command-completion-customlist`

複雑な補完を書きやすくするためのプラグインもあるらしい(使ったこと無い)。
[LeafCage/lim.vim](https://github.com/LeafCage/lim.vim/blob/master/doc/lim-cmddef.jax)
.NETでExcelファイルに接続する

ExcelファイルにSQL投げられるよ！よ！

対象のファイルをExcelで開いていると、お互いにリアルタイムで反映されて楽しいかもしれない。

## ランタイム

今回は[Accessデータベースエンジン（ACEエンジン）](https://msdn.microsoft.com/ja-jp/library/office/ff965871(v=office.14).aspx)を使います。Accessのコンポーネントなので、インストールされていない環境であれば「Microsoft Access データベース エンジン 再頒布可能コンポーネント」を入れるとよいです。Access全体のランタイムもありますが、でかいです。

* [Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント](https://www.microsoft.com/ja-jp/download/details.aspx?id=13255)
* [Microsoft Access データベース エンジン 2016 再頒布可能コンポーネント](https://www.microsoft.com/ja-jp/download/details.aspx?id=54920)

あと[最近のOfficeを「クイック実行形式」でインストールするとOLEDBプロバイダも登録されないようなので](http://morimorigameblogg.blogspot.com/2019/01/64bit-ms-access-2019sql.html)、やはり別途インストールするのがよさそうです。

インストールされていれば [`new OleDbEnumerator().GetElements()`](https://msdn.microsoft.com/ja-jp/library/system.data.oledb.oledbenumerator.getelements(v=vs.110).aspx) でそれらしいのが見れるはず。あと、例によってx86とx64別です。

なおExcel2003以前の形式(.xls)かつ32bit版でよければ、Windows付属の `Microsoft.Jet.OLEDB.4.0` というプロバイダでも基本的に同じように使えます。

参考: [Microsoft Access（.mdb、.accdb）のODBC、OLEDBドライバーに関するまとめ | アシスト](https://www.ashisuto.co.jp/qlik-training_blog/article/microsoft-access-odbc-oledb-driver.html)

## 接続する

接続文字列に必要なパラメータは以下の通り。

- Provider: `Microsoft.ACE.OLEDB.12.0`
    - 2013では15.0（12.0は存在しても使えなかった記憶）
    - 2016では16.0（12.0も付属しているし使える）
- Data Source: ファイル名
- Extended Properties: `{ISAM形式}; {オプション}`

ISAM形式は `Excel 12.0` `Excel 12.0 Xml` `Excel 12.0 Macro` `Excel 8.0` など。 `HKLM\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Access\Access Connectivity Engine\ISAM Formats` （もしくはそれに準ずる場所）で一覧が見れます。

オプションは例えばこんなのがあります。

- `HDR=NO`：ヘッダ行なし（F1, F2, ...といった列名になる）
- `MAXSCANROWS=[1..16]`：データ型の自動判定に使われる行数

```csharp
var constr = new OleDbConnectionStringBuilder
	{
		["Provider"] = "Microsoft.ACE.OLEDB.12.0",
		["Data Source"] = @"r:\hoge.xls",
		["Extended Properties"] = "Excel 12.0 Xml"
	}.ToString();
var con = new OleDbConnection(constr);
```

## 何ができるか

- `[名前]`（Excelで定義した領域名）
- `[シート名$]`（データが入力されている左上から右下までの範囲）
- `[シート名$名前]`
- `[シート名$セル範囲]`（`[シート名$]` の範囲内のみ）

をテーブル名として、SELECT/INSERT/UPDATEが普通に使えます。ただしDELETEはできない。

- CREATE TABLE  
  既存の領域を指定すると見出しを変更できます。  
  $を含まない文字列を指定するとシート名として扱われ、新しいシートが作成されます。
- DELETE TABLE  
  列見出しも含めて消去します。定義済みの名前で指定すると、その名前も削除されるようです。

## 参考

- ~~[KB316934 Visual Basic .NET と ADO.NET を使用して Excel ブックのレコードの取得と変更を行う方法](https://support.microsoft.com/ja-jp/kb/316934)~~
- ~~[ADO を使用して Excel ブックのデータの読み取りおよび書き込みを行う方法 (ExcelADO)](https://support.microsoft.com/ja-jp/help/278973/excelado-demonstrates-how-to-use-ado-to-read-and-write-data-in-excel-w)~~
- [Microsoft Access 2010 を使用したデータ プログラミング](https://msdn.microsoft.com/ja-jp/library/office/ff965871(v=office.14).aspx) （ACEエンジンの話とか）
kintone で SpreadJS のフォーマット設定

#スプレッドシートのフォーマットを作成

[kintone で SpreadJS を使ってみた](http://qiita.com/rex0220/items/f75883efff08c74cc65d) で、作ったアプリに、もう少し使えそうなフォーマットを用意します。
こんな感じで、Excel の表示固定でスクロールしてもヘッダが表示されるようにします。

![image](https://qiita-image-store.s3.amazonaws.com/0/100572/ed11c76a-15a9-9744-751a-3c8f1f160c0b.png)

#SpreadJS デザイナ
見た目は、Excel のように、リボンメニューでいろいろ設定できるツールが SpreadJS に付属しています。
これを使って、フォーマットを設定し、Json 形式に変換できます。

![image](https://qiita-image-store.s3.amazonaws.com/0/100572/762225e6-4c33-4646-6c15-b26278f585ed.png)


こんな Json データです。
![image](https://qiita-image-store.s3.amazonaws.com/0/100572/3b5a01a7-21b0-05b6-3df5-63bbcfe59a02.png)

#kintone アプリの「データ」初期値にJson データを設定

データ項目に、フォーマット用の Json データを設定します。

![image](https://qiita-image-store.s3.amazonaws.com/0/100572/b54c0455-08f2-05ac-3914-e3058e252bdd.png)

#kintone アプリのレコード新規登録

レコード新規登録を行うと、データ項目に初期値として、フォーマットされた Json が設定されます。
その結果、スプレッドシートにフォーマットが表示されます。

扱える行数ですが、このフォーマットでは 200件くらいならストレスなしで使えそうです。
1,000件になると、かなり読込み・書込みで待たされます。
単純にデータ量に比例していますので、使用する列数・行数が多いと遅くなります。

![image](https://qiita-image-store.s3.amazonaws.com/0/100572/ed11c76a-15a9-9744-751a-3c8f1f160c0b.png)

いろいろフォーマットが作成できますので、応用範囲が広がると思います。
JavaScript で、あれこれ設定するよりも簡単です。
Excel からもう少し簡単にできればいいのですが。

#ルックアップによるフォーマット指定
応用編として、下記のしくみが出来そうです。

- フォーマットアプリを作成して、いろいろなフォーマットを設定
- ルックアップで、フォーマットを指定すると、データ項目に　Json をコピーするように設定
- データ項目値変更イベントで、スプレッドシートに反映

テキスト形式なので、kintone 標準機能で扱いが簡単にできます。
さくさくっとElasticsearchをcentos6.xに入れるメモ

# Elasticsearch INSTALL
以下の内容を自分用にメモ
https://www.elastic.co/guide/en/elasticsearch/reference/current/setup-repositories.html

## JAVA入れる 
```bash

# パッケージ検索
yum search openjdk
# install
yum install -y java-1.X.X-openjdk.x86_64
# 確認
java -version
```

## Elasticsearch 入れる
```bash

rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch

cat  << EOS > /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=https://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
EOS

yum install -y elasticsearch

/etc/init.d/elasticsearch start

chkconfig --add elasticsearch
```

# Elasticsearch 設定
```bash

vim /etc/elasticsearch/elasticsearch.yml
++ network.host: 192.168.0.XXX
```

http://192.168.5.191:9200/
にアクセスして
<pre>
{
  "name" : "Hussar",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "2.2.1",
    "build_hash" : "d045fc29d1932bce18b2e65ab8b297fbf6cd41a1",
    "build_timestamp" : "2016-03-09T09:38:54Z",
    "build_snapshot" : false,
    "lucene_version" : "5.4.1"
  },
  "tagline" : "You Know, for Search"
}
</pre>
と出ることを確認

# その他
データとかログは、デフォでは下記にある模様

- /usr/share/elasticsearch
- logs   /var/log/elasticsearch
- data   /var/lib/elasticsearch
- conf   /etc/elasticsearch
aws EC2 上に yum でインストールした phpMyAdmin を配置して RDS に接続する方法

AWS EC2 上に yum でインストールした phpMyAdmin から RDS に接続する方法。

`config.inc.php` がどこにあるのかわからずにハマったのでメモ。

同じ問題に出くわしたら `/etc/phpMyAdmin/config.inc.php` を使えば OK。

以下、メモ。

## インストール

```
$ sudo yum install -y --enablerepo=remi install phpmyadmin
```


## phpMyAdmin.conf の設定

```
$ sudo cp /etc/httpd/conf.d/phpMyAdmin.conf /etc/httpd/conf.d/phpMyAdmin.conf.org
$ sudo vim /etc/httpd/conf.d/phpMyAdmin.conf
## (略)
   <IfModule mod_authz_core.c>
     # Apache 2.4
     # Require local       # これをコメントアウト
     Require all granted   # これを追加、 必要に応じて IP 制限とかするほうが良い。
   </IfModule>
$ sudo service httpd restart
```

## Basic 認証を行う場合

```
$ sudo vim /etc/httpd/conf.d/phpMyAdmin.conf 
(略) // <Directory /usr/share/phpMyAdmin/> の「AddDefaultCharset UTF-8」の次に以下を追記
AllowOverride All
$ sudo service httpd restart
$ sudo htpasswd -c -b /usr/share/phpMyAdmin/.htpasswd BASIC認証のユーザー名 BASIC認証のパスワード
$ sudo vim /usr/share/phpMyAdmin/.htaccess
AuthUserFile /usr/share/phpMyAdmin/.htpasswd
AuthGroupFile /dev/null
AuthName "Developer Mode"
AuthType Basic
require valid-user
<Files ~ "^.(htpasswd|htaccess)$">
deny from all
</Files>
```

## SSL アクセスのみ許可する場合

※証明書準備とか導入は事前に行っているものとする。

```
$ sudo vim /usr/share/phpMyAdmin/.htaccess
SSLRequireSSL # 先頭に追加
$ sudo service httpd restart
```

## phpmyadmin から RDS へ接続できるように設定する。

`config.inc.php` は `/etc/phpMyAdmin/config.inc.php` を使う。(`/usr/share/phpMyAdmin/` 配下に何かをコピーして設定するのは間違い。)

```
$ sudo cp /etc/phpMyAdmin/config.inc.php /etc/phpMyAdmin/config.inc.php.org
$ sudo vim /etc/phpMyAdmin/config.inc.php
- $cfg['Servers'][$i]['host'] = 'localhost';
+ $cfg['Servers'][$i]['host'] = 'ここにRDSのエンドポイント';
```
CKFinderで参照するフォルダを動的にしたりする（CKEditorとの組み合わせでも同じこと）

CKFinderで参照するフォルダを、ユーザーの権限ごとに切り替えたかったので調べた。

公式
http://docs.cksource.com/ckfinder3-php/configuration.html#configuration_options_resourceTypes

config.phpに関数書ける。

ちょっとハマったのはbaseUrlが/で始まったり始まらなかったり、/で終わったり終わらなかったりすると、getUrl()で取れてくるパスの最初に/がついたりつかなかったりすること。
GlassFishの文字コード指定


自分用備忘録

GlassFishの管理画面で[Configurations]＞[server-config]＞[JVM Settings]を開く
JVM Optionsタブにリストが表示されるため、必要な項目の追加や値の変更を行う。


##### 文字コード指定
```
-Dfile.encoding=UTF-8
```


設定ファイルは以下の場所に格納されているため、ファイルを直接編集してもよい。
[インストールディレクトリ]\glassfish-4.1\glassfish\domains\domain1\config\domain.xml

<java-config>ディレクティブに
```xml:domain.xml
<jvm-options>-Dfile.encoding=UTF-8</jvm-options>
```
を追加
[GitHub]プルリのテンプレート設定方法

トップに `.github` というディレクトリを作ってその下に設置するのがキレイかもしれない

```
.github/PULL_REQUEST_TEMPLATE.md
```

![github_pr_template.png](https://qiita-image-store.s3.amazonaws.com/0/22567/767caa3b-f382-9101-2571-40aebf294a6e.png)

するとこんな感じで自動で上記ファイルで記載された内容がデフォルトセットされる
とても良いと思います！
プルリのタイトルをタイポしてるけど、気にしません！
[Linux] ある一定期間のtopコマンドの結果をファイルに出力する（備忘録）

ある一定期間のtopコマンドの結果をファイル出力する場合、コンソールで以下のコマンドを実行する

```
例）60秒間隔で30回topコマンドを実行した結果をファイルに出力する
top -b -d 60 -n 30 > top_result.txt

「-b」オプションで、バッチモードを指定
「-d」オプションで、更新間隔を指定（単位：秒）
「-n」オプションで、回数を指定
```
Gitで不要なremote/originを整理する

WIPとかで開発をすると、ローカルのブランチがたいへんなことになる
特に`remotes/origin/`

## そしたらときどき、以下の呪文を唱えるといい  
```
git fetch --prune
```
枝（branch）が多くなったのなら、苅りとれ！！
CentOS6+mod-wsgi+pyenv+python2.7.11+apache


# 設定
## pyenvの導入
[公式サイト](https://github.com/yyuu/pyenv)を参照。


## pyenvを用いてpython2.7.11をインストールする。
オプション`CFLAGS=-fPIC`は必須。
Python2.7.11はデフォルトでは内部文字コードはUCS4でインストールされる。

```sh
$ CFLAGS="-fPIC" pyenv install 2.7.11
$ pyenv global 2.7.11
```

## apacheのインストール
他を参照。

## mod_wsgiのインストール
mod_wsgi.tar.gzを[公式サイト](https://modwsgi.readthedocs.org/en/develop/)よりダウンロードする。
一つのPythonしか指定できないようである。

```sh
# ダウンロードして展開する。
$ cd ~/download
$ wget https://pypi.python.org/packages/source/m/mod_wsgi/mod_wsgi-4.4.22.tar.gz
$ tar zxvf mod_wsgi-4.4.22.tar.gz
$ cd mod_wsgi-4.4.22

# pyenvでのPython環境のインストール先を指定する。
$ ./configure --with-python=/home/vagrant/.pyenv/versions/2.7.11/bin/python
$ make
$ sudo make install
```

## ディレクトリ権限の設定
以下のようなメッセージが出る場合

```sh
(13)Permission denied: mod_wsgi (pid=23797): Unable to connect to WSGI daemon process '***' on '/etc/httpd/logs/wsgi.12880.0.1.sock' after multiple attempts., referer: http://dummy.test
```

pyenvのディレクトリを変更するか、パーミッションの変更を行う。

```sh
$ chmod 755 /home/vagrant
```

## virtualenvは使えない
pyenv+virtualenvで利用している事例を確認できなかった。
PythonPathなどを無理矢理通すと動作するかもしれない。

# 参考ページ
[mod-wsgi を python3.5.0 + pyenv + Apache2 で、AmazonLinux 上に構築](http://unching-star.hatenablog.jp/entry/2015/12/02/113459)
PowerShell ISEでスクリプトを旧バージョン互換実行する

例えば開発機のPowerShellのバージョンが 4とか５とかで、本番機が大人の事情でバージョン2とか3だった場合用のTips。

まずはただ実行するだけの場合、以下のようにSide by sideで実行出来る。

```ps1
>$PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.0.10586.12
PSCompatibleVersions           {1.0, 2.0, 3
BuildVersion                   10.0.10586.1
CLRVersion                     4.0.30319.42
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

>powershell -v 2
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

>$PSVersionTable

Name                           Value
----                           -----
CLRVersion                     2.0.50727.8670
BuildVersion                   6.1.7600.16385
PSVersion                      2.0
WSManStackVersion              2.0
PSCompatibleVersions           {1.0, 2.0}
SerializationVersion           1.1.0.1
PSRemotingProtocolVersion      2.1

```
PSVersionの値が5.0.10586.12から2.0になっているのがわかる。
-vオプションの後は任意の値を指定することで異なるバージョンでの起動が可能だ。


ところが、これをこのままPowerShell ISEのコンソール上で実行しても期待通りの動きにはならなかった。

```ps1
>powershell -v 2
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

```
この状態でPowerShell ISE側はスクリプトを実行した状態で応答を待っている状態に移行してしまう。
これ以降は何も応答が無い。

実行さえできればいいのだが、デバッグなどを行いたい場合はそうもいかない。
上手いこと無いかと考えたら、シンプルに以下の方法で実行が出来た。


```ps1
>powershell.exe -v 2 -c .¥script.ps1
```
-cオプションを使用し、実行したいスクリプトファイルを指定する。
そうする事でPowerShel ISEのコンソール上でスクリプトの実行結果が返ってくる。
もちろん、ステップ実行や変数の参照なども可能だった。

以上
Android: ボタンに押された感を出してみる


- 条件によってボタンの色が変わるユースケース
- 今回は色ですがイメージとかも可能

## 色をDrawable化

~~~csharp
public static Android.Graphics.Drawables.ColorDrawable ToDrawable(
  this Android.Graphics.Color color){

  return  new Android.Graphics.Drawables.ColorDrawable (color);
}
~~~

## アルファ値を変えた色を背景色として押された効果を作る

~~~csharp

using System.Linq;
...

public static Android.Graphics.Drawables.StateListDrawable ToButtonPressEffect(
  this Android.Graphics.Color color, byte alpha=200
){

  var pressed = new Android.Graphics.Color (
    color.R, color.G, color.B, alpha);

  var effect = new  Android.Graphics.Drawables.StateListDrawable ();
  effect.AddState (
    new int[]{ Android.Resource.Attribute.StatePressed }, pressed.ToDrawable ());

  effect.AddState (
    Android.Util.StateSet.WildCard.ToArray (), color.ToDrawable ());
  return effect;
}

~~~

## Buttonの背景にエフェクトを設定する

~~~csharp
...
var ok_button = new Button (this) {   // this = Activity
  Background=ok_button_color.ToButtonPressEffect()
};
~~~
Elasticsearch の Sense を使った自前チュートリアル


## Sense を使ったチュートリアル

公式の [Getting Started](https://www.elastic.co/guide/en/elasticsearch/guide/current/getting-started.html) では[このページ](https://www.elastic.co/guide/en/elasticsearch/guide/current/_indexing_employee_documents.html)のように <img height="16" src="https://i.gyazo.com/0ec7629dfb35ac7277dd858bdd8afedc.png"> というボタンが置かれています。

`Kibana` を起動した状態で <img height="16" src="https://i.gyazo.com/0ec7629dfb35ac7277dd858bdd8afedc.png"> を押すと、下図のように `Elasticsearch` へのリクエストする内容がすでに書かれた状態で `Sense` が立ち上がります。

（`Kibana` のプラグインとして `Sense` をインストールしておく必要はあります）

<img width="480" src="https://i.gyazo.com/ad7ce6469b8c798a2743ce35bb40bb56.gif">


## チュートリアルボタンのリンク

リンクを見てみると
`http://localhost:5601/app/sense/?load_from=https://www.elastic.co/guide/en/elasticsearch/guide/current/snippets/010_Intro/25_Index.json`
のように `load_from` パラメーターに読み込みたいファイルのURLを指定しているだけです。

なので以下のようなファイルをパブリックリポジトリに用意しました。

```https://github.com/sosuke-k/custom_elasticsearch_ranking/blob/master/00_Check.json
# List all indecies
GET _aliases
```

`raw` ファイルを読み込むリンクを `load_from` に指定したのものが以下です。

http://localhost:5601/app/sense?load_from=https://raw.githubusercontent.com/sosuke-k/custom_elasticsearch_ranking/master/00_Check.json

下図のようになるはずです。


<img width="480" src="https://i.gyazo.com/8d0549aab5bee993cd03f4af173f2a17.gif">

## 利用ケースは？

* 初学者用のチュートリアル
* 公開してもいいクエリ

`Elasticsearch` のちょっとした機能や仕様を理解するためだけのチュートリアルにしか向いていませんが、 `Elasticsearch` を触り始めた自分にとっては後で振り返るのに非常にいいので、残していきたいと思います。


## 余談

### Sense の仕様

https://github.com/elastic/sense/blob/master/public/src/app.js#L41-L52

以下のようなコードになっていて 

`api.github.com` もサポートしているようです。

```
else if (/^https?:\/\//.test(sourceLocation)) {
  var loadFrom = {url: sourceLocation, dataType: "text", kbnXsrfToken: false};
  if (/https?:\/\/api.github.com/.test(sourceLocation)) {
    loadFrom.headers = {Accept: "application/vnd.github.v3.raw"};
  }
  $.ajax(loadFrom).done(function (data) {
    resetToValues(defaultServerUrl, data);
    input.moveToNextRequestEdge(true);
    input.highlightCurrentRequestsAndUpdateActionBar();
    input.updateActionsBar();
  });
}
```

### GitHub API とは

https://developer.github.com/v3/

[GitHub Content API](https://developer.github.com/v3/repos/contents/) を 使ってみます。

```bash
$ curl "https://api.github.com/repos/sosuke-k/custom_elasticsearch_ranking/contents/00_Check.json" | jq '.content' -r | base64 -d
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1054  100  1054    0     0    884      0  0:00:01  0:00:01 --:--:--   884
# List all indecies
GET _aliases
```

[GitHub Content API](https://developer.github.com/v3/repos/contents/) ではいろんなファイルの情報が `json` で返ってきて、 `content` キーに `base64` でエンコードされたファイルの中身が入っています。

### Sense + GitHub API

http://localhost:5601/app/sense?load_from=https://api.github.com/repos/sosuke-k/custom_elasticsearch_ranking/contents/00_Check.json


こちらもちゃんとロードしてくれました。
mail > pop before smtp > 受信を行ってから送信する? > 30分間の送信許可

関連 [c++ builder > POP before SMTP を使ってからメール送信](http://qiita.com/7of9/items/5d0117a0802cca97f5f9)

http://support.fsv.jp/trouble/mail/smtp/error1.html
> 「POP before SMTP」は、メール受信時の「アカウント」「パスワード」による認証に成功した通信元のIPアドレスからのみ、その後30分間メール送信を許可する認証方法です。

この30分というのはプロバイダ固有の設定なのだろうか?

ソフトから自動送信するときにPOP before SMTPが一度失敗したら、リトライでも失敗し続ける症状の調査中。

<hr>
http://popbsmtp.sourceforge.net/manpage.shtml

> It then expires these entries when 30 minutes have elapsed after the last POP/IMAP access from that IP.

<hr>

処理としては以下の手順を踏んでいるので、上記の30分のしばりにひっかからないような気もする。

- POP接続を実行
- メール送信を実行

実際に送信成功と送信失敗が数分のスパン内でランダムに起こっている。