OmniAICreator/Qiita-1.07M huggingface dataset:
[Spring MVC] Callable vs DeferredResult

from [Understanding Callable and Spring DeferredResult](http://xpadro.blogspot.tw/2015/07/understanding-callable-and-spring.html)

##Callable
Callable: `java.util.concurrent.Callable`

```java
@RestController
public class AsyncCallableController {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    private final TaskService taskService;
    
    @Autowired
    public AsyncCallableController(TaskService taskService) {
        this.taskService = taskService;
    }
    
    @RequestMapping(value = "/callable", method = RequestMethod.GET, produces = "text/html")
    public Callable<String> executeSlowTask() {
        logger.info("Request received");
        Callable<String> callable = taskService::execute;
        logger.info("Servlet thread released");
        
        return callable;
    }
}
```

```text
2015-07-12 13:07:07.012  [nio-8080-exec-5] x.s.w.c.AsyncCallableController          : Request received
2015-07-12 13:07:07.013  [nio-8080-exec-5] x.s.w.c.AsyncCallableController          : Servlet thread released
2015-07-12 13:07:12.014  [      MvcAsync2] x.spring.web.service.TaskServiceImpl     : Slow task executed
```

controller可以return Callable物件達到非同步的效果
Spring MVC之後會管理TaskExecutor使用不同的thread來執行這個Callable物件的task

##DeferredResult
DeferredResult: `org.springframework.web.context.request.async.DeferredResult<T>`

```java
@RestController
public class AsyncDeferredController {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    private final TaskService taskService;
    
    @Autowired
    public AsyncDeferredController(TaskService taskService) {
        this.taskService = taskService;
    }
    
    @RequestMapping(value = "/deferred", method = RequestMethod.GET, produces = "text/html")
    public DeferredResult<String> executeSlowTask() {
        logger.info("Request received");
        DeferredResult<String> deferredResult = new DeferredResult<>();
        CompletableFuture.supplyAsync(taskService::execute)
            .whenCompleteAsync((result, throwable) -> deferredResult.setResult(result));
        logger.info("Servlet thread released");
        
        return deferredResult;
    }
}
```

```text
2015-07-12 13:28:08.433  [io-8080-exec-10] x.s.w.c.AsyncDeferredController          : Request received
2015-07-12 13:28:08.475  [io-8080-exec-10] x.s.w.c.AsyncDeferredController          : Servlet thread released
2015-07-12 13:28:13.469  [onPool-worker-1] x.spring.web.service.TaskServiceImpl     : Slow task executed 
```

controller也可以return DeferredResult物件達到非同步的效果
但跟Callable不同的是並非由Spring MVC管理
由上例是由CompletableFuture管理使用supplyAsync方法
在ForkJoinPool.commonPool()取得thread執行task後再給DeferredResult物件setResult

其他也可以由JMS或AMQP的message來管理[^1]

[^1]: [Spring MVC 3.2 Preview: Introducing Servlet 3, Async Support](https://spring.io/blog/2012/05/07/spring-mvc-3-2-preview-introducing-servlet-3-async-support)
GitBucketの導入まとめ(Jenkins導入済み環境

## はじめに
### 社内の環境等など
- 開発環境
 - Unity5.0.3
- コード管理
 - 社内で建てているGitサーバ

## 導入目的（現状の問題点）
1. ブランチ切り替えの容易化
 - 過去の同じコードと現状を比較したい場合に方法は簡単なところだと２つあると思う
 - １つめが過去のハッシュを用いたGitコマンドによる表示
 - ２つめは実際に過去のファイルを手元に用意する
2. 不具合報告の一元化
 - 現状はGoogle Spread Sheetに書いているが、チームメンバーが把握出来ていない
 - どのように対策をしたか、いつ対策をして、いつのリリースに含まれるかが把握出来ていない

## 導入まで壁に感じたところ
1. 社内のGitサーバとどのように同期を取るか
2. 社内ネットワークで他のPCから閲覧出来るようにするには

## 社内のGitサーバとどのように同期を取るか
- 以下の手段により社内のGitと同期を取れることが判明
 - http://qiita.com/takeoverjp/items/a97da80acf8349f08166
- 但し、更新を引っ張るという一方通行である為注意

## 社内ネットワークで他のPCから閲覧出来るようにするには
 - port 8080は既にJenkinsで使用している為にport 8888に変更
 - Tomcatを導入
    - Tomcatのインストール　(記事は多いので割愛
    - Tomcatの/webappsにgitbucket.warを配置
    - Tomcatの管理者アカウントを追加しておく　(記事は多いので
    - Tomcatの起動　(記事は多
    - ブラウザのTomcat画面からManage Appを開く
    - gitbucketの項目が増えているので起動

## その他
1. 本来はPull Requestを行いたいが、それはまた後に
Mac環境でのFinderについて操作、設定について



## 表示

| キー | 操作 |
|:------------:|:------------:|
| 整理整頓（名前順） | option + command + 1 |



## 移動 ショートカット

| キー | 操作 |
|:------------:|:------------:|
| フォルダーへ移動 | shift + command + g |


## スクリーンショット

| キー | 操作 |
|:------------:|:------------:|
| スクリーンショット | command + shift + 4 |
新しいCircleCIの機能で、iOSアプリをTestFlightに上げる


基本的には、 https://circleci.com/docs/ios-code-signing/ の通りです。

設定が完了したものは https://github.com/noboru-i/kyouen-ios にあります。
（ほとんどは https://github.com/noboru-i/kyouen-ios/pull/29 のPRで行いました）

## 事前準備

CircleCiでiOSのビルドをするためには、[Pricing and Plan Information - CircleCI](https://circleci.com/pricing/#build-os-x)にあるように、最低でも$39/月の課金が必要です。
また、GitHubとの連携設定や、fastlaneの利用のためのGemfileなどが必要です。

## `.p12`ファイルをアップロード

今回はTestFlightで配信するため、"iOS Distribution"の証明書を発行しておき、CircleCIにアップロードします。
一度アップロードすると、ダウンロードすることは出来ないっぽいので、パスワード無しでも良いかと。

ここに登録しておくだけで、MACHINEセクションの"Install Code Signing Credentials"のタイミングで読み込まれます。

## provisioning profileをリポジトリに格納

`.mobileprovision`を"Certificates, Identifiers & Profiles"からダウンロードし、リポジトリに格納しておきます。
おそらく、どこに置いておいても良さそうですが、今回は`fastlane/cert/*.mobileprovision`に置きました。
これも、置いておくだけで自動的に読み込まれるようになっています。

## `GYM_CODE_SIGNING_IDENTITY`の設定

環境変数として、証明書の名前（？）が必要なようです。
circle.ymlに下記のように追加します。

```yaml:circle.yml
machine:
  environment:
    GYM_CODE_SIGNING_IDENTITY: "iPhone Distribution: NOBORU ISHIKURA (56W5SXE4HE)"
```

## CircleCIに環境変数を設定

FASTLANE_USER / FASTLANE_PASSWORD という変数で、TestFlightにアップロードするためのApple IDを設定します。

## fastlaneの設定

以前までは、Fastfileの中でkeychainの作成や、そこへの証明書の登録などを行っていました。
ただ、CircleCIのアップデートにより、そのへんは不要になったようです。

全体は[こちらのFastfile](https://github.com/noboru-i/kyouen-ios/blob/8525bacc305c2578a750fcaa5b597ec3a509450f/fastlane/Fastfile)にあります。

- plistのbuild numberを、CircleCIのビルド番号に置き換えています。  
これは、TestFlightにアップロードする際、前回よりも増えていないといけないためです。
- ipaファイルの生成を行います。
- TestFlightにアップロードします。

といった内容を下記のlaneでやっています。

```ruby:Fastfile
  desc 'Submit a new Release Build to TestFlight'
  lane :release do
    set_info_plist_value(
      path: plist_file_path,
      key: 'CFBundleVersion',
      value: ENV['CIRCLE_BUILD_NUM']
    )

    gym(
      scheme: scheme_name_store,
      configuration: "Release",
      use_legacy_build_api: true
    )

    pilot(skip_submission: true)
  end
```

## circle.ymlの設定

上記のrelease laneを、deploymentセクションで実行します。

```yaml:circle.yml
deployment:
  release:
    branch: release
    commands:
      - bundle exec fastlane release
```

この状態で、releaseブランチに変更が行われると、CircleCIが動き、TestFlightにipaをアップロードしてくれます。

## iTunes Connectの設定

上記までで、TestFlightにipaは存在するので、それとテスターを紐付けます。

対象のアプリページにある、"TestFlight"から、"内部テスト"を選択し、"テストするバージョンを選択"からアップロードしたバージョンを選択します。
ただ、ipaをアップロードしてからTestFlight側の処理に時間がかかるようで、10分〜多い時では30分程度かかって、選択可能になることがありました。

次に、テスターを追加します。
ここで選択できるのは、iTunesConnect上で設定されているロールを持つアカウントのみのようです。
選択できない場合は、"ユーザと役割"から、"iTunes Connect ユーザ"を追加しておく必要があります。

## まとめ

ここまで1度設定しておけば、releaseブランチを変更すると、iOS端末にPUSH通知が届き、インストールが出来るようになります。
便利ですね。

## 詰まったことメモ

### アプリは配信されるが、インストール時に "Could not install App"みたいな表示が出て、インストール出来ない

たしか、`GYM_CODE_SIGNING_IDENTITY`を設定することで直りました。
いろいろ調べてみると、おそらく違う証明書とかで何故かipaが作れちゃって、それが飛んでたのではないかと。
証明書・Provisioning Profile（内部のUDID登録など）を見直すと、うまくいくかも？
また、問題の切り分けのために、手元でXcodeからアップロードしてみる、ってのも良いかもしれません。
expressにてCORSを許可する

### コード

```js:app.js
const express = require('express');
const app = express();
const port = 4000;

// CORSを許可する
app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});

app.get('/', (req, res) => {
  res.send('hello');
});

app.listen(port);
```

###　何をしているか

ご存知の通り、セキュリティの観点から、オリジン(htmlが置かれたサーバー)以外のサーバーからデータを取得すること(Cross-Origin-Resource-Sharing, CORS)を、現在のブラウザでは許可しておりません。
こちらを回避するためには、サーバーサイドにて、CORSを許可する必要があります。
そのため、app.use()内でレスポンスヘッダを書き換えた上で、クライアントにデータを送信しています。

なお、その名も[cors](https://github.com/expressjs/cors)というnpm moduleを利用してCORSを許可する手もあるようです。
今更ですが、iOS Slack API を叩いてみた。

iOSアプリから Slack にアクセスしてメッセージを読み書きしたくて、いろいろと調べみたのでまとめてみます。

##注意
ネットで調べると、その多くが https://api.slack.com/web の中ごろにある [Generate test tokens](https://api.slack.com/docs/oauth-test-tokens) で作られた token を用いて実装してる感じでした。
Slack の API は使い方が簡単で、 https://slack.com/api/METHOD に取得した token とかを GET でパラメーター渡しするだけですので、ちょっと試したりする分には テスト用でもいいのですが、今回はテスト用ではなくちゃんとした token を取得します。

\#Never share test tokens with other users or applications. って書いてあるしね。


##Slackにアプリを登録
まずはSlackにログインして、App作成を行います。
　→ https://api.slack.com/apps
作成できたら左メニューバーの App Credentials をクリックして OAuth Information を確認しておきます。
ClientID, ClientSecret, RedirectURL は後で使います。

あと、ついでに Bot Users で Botユーザーを作っておきましょう。

##OAuth2
 → https://api.slack.com/docs/oauth
流れを簡単に。
　1) https://slack.com/oauth/authorize にパラメータを付けてアクセス
　2) 承認を聞いてくるので、承認する
　3) 承認すると指定した RedirectURL にリダイレクトされる
　4) リダイレクト時に返ってくる code を記憶しておいて
　5) https://slack.com/api/oauth.access にパラメータを付けてアクセス
　6) access_token が返ってくるので、以後それを使用する。
取得した access_toke は意図的に revoke しない限りは有効ということなので、取り扱いには注意しましょう。

##注意はしたけれど、、、
えーと、冒頭でテスト用のトークンは application に使ったりしちゃだめ、とかって書きました。本来なら前項の OAuth2 のやり取りをプログラムして access_token を取得したほうがいいのですが、OAuth(OAuth2) でやっかいなのが、Redirect処理です。これの実装が結構面倒。

Twitter API ではこの面倒なのを回避するために AccessToken というものが発行できるようになっていて、これと ConsumetKey を使って OAuth のやり取りなしに読み書きができるようになっています。

Slack には Twitter みたいな発行ページがないため、実装するしかないのかと、、、
思いましたが、 **発行された access_token は意図的に revoke しない限り有効**、という点を使って、手動で発行して、それを使うことにします。

##手動OAuth2
　1) 承認ページへアクセス
　　パラメータは client_id, scope, state です
　　client_id は アプリ作成したときの ClientID です。
　　scope はちょっと難しくて、今回は bot,channels:history にしました。
　　state はリダイレクトされた時に返ってきた値と比較して同じなら成功という感じです。
　　例） https://slack.com/oauth/authorize?client_id=xxx&scope=bot,channels:history&state=01234567
　　
　2) 承認ページが表示されます。
　　普通の OAuth ならここでユーザーIDとか聞いてきますが、聞いてきません。
　　承認するかしないかのボタンだけなので、迷わず承認ボタンを押します。
　　
　　すると、本来ならここで RedirectURL へリダイレクトされるのですが、今回 redirect_uri は指定していないので、エラー画面になります。
　　しかしこれはわざとですので安心しましょう。ブラウザのアドレスバーに注目です。
　　後ろの方に ?code=xxx&state=01234567 というパラメーターが引っ付いています。
　　この code が大切なので記憶しておきます。state の値はアクセスした時に引っ付けたstateの値と同じであることを確認しておきます。
　　
　3) アクセストークンの取得
　　先ほどの code を使います。
　　https://slack.com/api/oauth.access にパラメータを付けてアクセスします。
　　パラメータは client_id, client_secret, code, redirect_url
　　client_id, client_secret はアプリ作成したときのやつ。
　　code は先ほど記憶しておいたもの。
　　redirect_uri は、まあ適当に http://www.example.com/OAuthCallBack とでもしておきます。
　　例） https://slack.com/api/oauth.access?client_id=xxx&client_secret=xxx&code=xxx&redirect_uri=hhh
　　redirect_url は urlencode しましょうね。
　　
　4) 結果はJSON形式で返ってくる
　　→ https://api.slack.com/methods/oauth.access
　　
以上の結果から、access_token, user_id などを保存しておいて、次回以降はこれを使います。

##読み書き
利用可能な API は [ここ](https://api.slack.com/methods) にあるのでこれを見て実装しましょう。

ちなみに書き込みは chat.postMessage、 読み込みは channels.history です。
しかしそれぞれに要求される scope が違うみたいで、これがちょっとよく分からないところです。

最初の承認ページへのアクセス時に scope で指定するっぽいですが、よくわかりません。
scope=bot では書き込み可能でしたが、読み込めませんでした。。。謎です。。

というわけで、とりあえず書き込みは bot で、読み込みは ユーザー（管理者？）でやっていみます。。。

以上ですかね。
Cinder-Runtimeのビルドでlibxml/parser.hが無いって怒られたら

https://github.com/simongeilfus/Cinder-Runtime

素敵！抱いて！と言いたくなるような素敵block, Cinder-Runtime.

でも何故か

```
/path/to/cinder/blocks/Cinder-Runtime/src/tools/clang/tools/c-index-test/c-index-test.c:15:10: fatal error:
      'libxml/parser.h' file not found
#include <libxml/parser.h>
```

悲しい. そんなときは取り敢えず

clang/tools/CMakeLists.txtを

```
add_subdirectory(diagtool)
add_subdirectory(driver)
add_subdirectory(clang-format)
add_subdirectory(clang-format-vs)

# add_subdirectory(c-index-test) # ここをコメントアウトした
add_subdirectory(libclang)

if(CLANG_ENABLE_ARCMT)
  add_subdirectory(arcmt-test)
  add_subdirectory(c-arcmt-test)
endif()

if(CLANG_ENABLE_STATIC_ANALYZER)
  add_subdirectory(clang-check)
endif()

# We support checking out the clang-tools-extra repository into the 'extra'
# subdirectory. It contains tools developed as part of the Clang/LLVM project
# on top of the Clang tooling platform. We keep them in a separate repository
# to keep the primary Clang repository small and focused.
# It also may be included by LLVM_EXTERNAL_CLANG_TOOLS_EXTRA_SOURCE_DIR.
add_llvm_external_project(clang-tools-extra extra)
```

もう少し真面目に調べて何か分かったら追記します.
IBM Bluemix/Watson Speech To Text/Node.jsでApplication開発(5)

[前回](http://qiita.com/yoshiono/items/61518b82be69abde3c15)からの続きで、留意事項について説明します。

**5. おわりに**
1. コントロールパネル-サウンド-録音で、マイクを選択し、そのプロパティのレベルで、マイクを80、マイクブーストを+20.0dbに設定して録音すると、適切に音声認識されます。私のWindows7環境/Thinkpad x230では、録音作業を実施するとマイクの設定が変更されるようなので、その都度確認が必要です。
![micsetting.png](https://qiita-image-store.s3.amazonaws.com/0/104507/e63f14c0-bcbb-c41a-50f8-a96fc72f8839.png)
もし、このソースで録音したデータで下記の画面({"results": [],"result_index": 0}})が出力され、かつ、STTのサンプルアプリケーションとしてGithubで公開されている[speech-to-text-nodejs](https://github.com/watson-developer-cloud/speech-to-text-nodejs)のspeech-to-text-nodejs/public/audio/に含まれる音声データ(例  sample-Ja_JP-wide1.wav)の場合は正常動作する場合、マイクの設定を確認してください。なお、Sound engine freeなどでビットレートを変更することで認識するようになることがありますが、本質的には、マイクの設定です。
![watson.png](https://qiita-image-store.s3.amazonaws.com/0/104507/721fd2c1-6e58-cc9a-8996-4676f3967f7b.png)
2. 元々は、Localのhtml/javascript(と、curlによるSTTへのpostをajaxで代替)で録音、音声認識を実現する予定でした。しかし、CORSの制限をうまく回避するアイデアがなかったので、今回のようなnode.jsによる実装になりました。また、node.jsにおいても、response headerを記述することで回避できるといった趣旨の[情報](https://developer.ibm.com/bluemix/2014/07/17/cross-origin-resource-sharing-bluemix-apis/)があり、Expressのapp.jsに記述してみたのですが、効果なし。結局、2つのnode.jsサーバーで分担処理する実装になりました。STTをBluemix上のnode.jsにバインドすることで回避できるのでは？、とか、node.jsをひとつに統合できるのでは？、とか思いますが、時間切れです。
![CORS.png](https://qiita-image-store.s3.amazonaws.com/0/104507/21a925be-cfd5-401d-b7c6-8a7e1781825f.png)
3. 作業中にFirefoxがバージョンアップされまして、いくつかの関数について、F12キーのコンソールでは警告がでます。これまた、時間切れです。
4. Windows環境では、[最初](http://qiita.com/yoshiono/items/32538099e0ccf86d9cf6)に述べたことに加えて、npmでwatson-developer-cloudをインストールすると、VCBuild.exeがないのでBuildできない[とか](http://blue-goheimochi.hatenablog.com/entry/2015/02/27/%E3%80%90%E8%A7%A3%E6%B1%BA%E6%B8%88%E3%80%91Windows7%E3%81%A7npm_install%E5%AE%9F%E8%A1%8C%E6%99%82%E3%81%AB%E3%82%A8%E3%83%A9%E3%83%BC)、cf pushであったほうが便利な.cfignoreファイルが作成できない(DOS窓でRENAMEすれば作成できるけど、動作しない)とか、いろいろありました。VCBuild.exeを解決するには各バージョンのVisual studio(2010～、導入イメージは6GBくらい？)を解決するまで順番に導入だし、.cfignoreが動作しない状況でnode_modulesにwatson-developer-cloudが含まれているとcf pushで毎回、数分要してしまったり、ですので、非Windows環境がよろしいと思います。ちなみに、watson-developer-cloudの導入はエラー終了状態で、VCBuild.exe問題は放置しましたが、STTについてはlocalのnode.jsで適切に動作しています。

最後に、偉大な先達の皆様に、感謝します。また、javascriptやSTTのアプリに興味のある方々に役立ちましたら幸いです。
IBM Bluemix/Watson Speech To Text/Node.jsでApplication開発(1)

[前回](http://qiita.com/yoshiono/items/32538099e0ccf86d9cf6)で説明したアプリは以下の作業で実現します。作業毎に解説します。

1. Node.js関連の準備(Node.js導入、動作確認)
2. [wavファイル生成Javascripソースの記述](http://qiita.com/yoshiono/items/b7352e9d1dfe7a7f9fd1)
3. [STTで音声認識Javascriptソースの記述](http://qiita.com/yoshiono/items/536332abd60ba3bde3f9)
4. [Bluemixにデプロイ](http://qiita.com/yoshiono/items/61518b82be69abde3c15)
5. [おわりに](http://qiita.com/yoshiono/items/1106406863fa94865d29)

**1. Node.js関連の準備(Node.js導入、動作確認)**
偉大な先達の方々の[手順1](http://qiita.com/kouh/items/30e7cbb673472c43b66f)、[手順2](http://ngw.jp/~tato/wp/?p=262)を参考に、nvmw(とnode.jsや関連モジュール)をインストールし、動作確認を実施します。ちなみに、私の環境では、2016年5月時点で公開されている[nvmw](https://github.com/hakobera/nvmw)について、下記のように最新版のnode.jsは順調に導入されます。
```C:\Users\hoge\nvmw>nvmw install iojs```

しかし、node.jsの[公式サイト](https://nodejs.org/en/)で推奨されているv4.4.4は、失敗します。
```C:\Users\hoge\.nvmw>nvmw.bat install v4.4.4
Start installing node/v4.4.4 (x64) to C:\Users\AA503763\.nvmw\v4.4.4
Download from https://nodejs.org/dist/v4.4.4/x64/node.exe, and save it as C:\Users\hoge\.nvmw\v4.4.4\node.exe
404 Not Found
Download C:\Users\hoge\.nvmw\v4.4.4\node.exe from https://nodejs.org/dist/v4
.4.4/x64/node.exe failed
```
x64環境のv4.4.4のURLが、
https://nodejs.org/dist/v4.4.4/x64/node.exe
から
https://nodejs.org/dist/v4.4.4/win-x64/node.exe
に変更されていることが原因と考えられますので、nvmw.batの137行目を以下の様に修正することで動作すると思います(試してません、Downloadで数分かかって待てません)。
```set NODE_EXE_URL=%NVMW_NODEJS_ORG_MIRROR%/%NODE_VERSION%/win-x64/node.exe```

[2. wavファイル生成Javascripソースの記述](http://qiita.com/yoshiono/items/b7352e9d1dfe7a7f9fd1)に続きます。
CsvHelper覚え書き

C#でcsvファイルを扱うモジュールであるCsvHelperを使って読み込んでみた。

このような形のcsvファイルを読み込んで、表示とListにする処理。

```csv
リュウ,1964-07-21,Male
ケン,1965-02-14,Male
ガイル,1960-12-23,Male
春麗,1968-03-01,Female
サガット,1955-07-02,Male
ダルシム,1952-11-22,Male
ザンギエフ,1956-06-01,Male
豪鬼,,Male
```

まず、カラムの定義。

```csharp
public enum Gender{Male,Female,Unknown}
public class Columns
{
	public string Name{ get; set;}
	public Nullable<DateTime> Date{ get; set;}
	public Gender gender{ get; set;}
}
```

このcsvは名前と日付と性別なので、以下のクラスを定義する。

次にマッピング

```csharp
public sealed class AccountMap : CsvHelper.Configuration.CsvClassMap<Columns>
{
	public AccountMap()
	{
		Map (x => x.Name).Index (0);
		Map (x => x.Date).Index (1);
		Map (x => x.gender).Index (2);
	}
}
```

これで、csvをインデックスごとに分割できる

実際の処理はこんな感じ

```csharp
using (var csv = new CsvHelper.CsvReader(new StreamReader (filename)))
{
	csv.Configuration.HasHeaderRecord = false; // Headerはなし
	csv.Configuration.RegisterClassMap<AccountMap> ();
	var records = csv.GetRecords<Columns> ();
	foreach (var item in records)
	{
		Console.WriteLine ("{0},{1},{2}",item.Name,item.Date,item.gender);
	}
}
```

これで、行ごとの要素を出力できる。

Listに持たせる場合はこんな感じ

```csharp
using (var parse = new CsvHelper.CsvParser (new StreamReader (filename))) 
{
	parse.Configuration.HasHeaderRecord = false;
	parse.Configuration.RegisterClassMap<AccountMap> ();
	var reader = new CsvHelper.CsvReader (parse);
	List<Columns> data = reader.GetRecords<Columns>().ToList ();
}
```

これで``data``はリストが生成されているはず
[Meteor] Meteorの開発に役立つAtomパッケージ


いいものが見つかったら随時更新


## Meteor API

https://atom.io/packages/meteor-api

Meteor APIのコード補完をしてくれる。
**標準のJavascriptのコード補完は無効になる。**



## Meteor Helper

https://atom.io/packages/meteor-helper


Atomの画面からMeteorのプログラムを起動できる。
いちいちコンソールから ```$ meteor``` 打たなくて良いのですごい楽。

使い方も簡単。

MeteorのプロジェクトのフォルダをAtomで開いて、
.Meteor のアイコンで右クリック -> Launch Meteor をクリック。

![スクリーンショット 2016-05-11 18.05.51.png](https://qiita-image-store.s3.amazonaws.com/0/58251/466c63ea-8cde-598d-3383-2c99e7f2f981.png "スクリーンショット 2016-05-11 18.05.51.png")
![スクリーンショット 2016-05-11 18.12.49.png](https://qiita-image-store.s3.amazonaws.com/0/58251/dd437fce-912f-1f54-045d-18894d0abd5f.png "スクリーンショット 2016-05-11 18.12.49.png")


コンソールペインのようなものが表示されて、起動完了。

![スクリーンショット 2016-05-11 18.03.01.png](https://qiita-image-store.s3.amazonaws.com/0/58251/f7421b28-c687-27d8-3278-2cc5ffed4fa6.png "スクリーンショット 2016-05-11 18.03.01.png")


## Meteor Snippets

https://atom.io/packages/meteor-snippets

コード補完をさらに拡張したようなもので、Meteorでよく使いそうなコードスニペットを、アルファベット3文字+[tab]と打つだけでズバッと出してくれる。

例えば、
```mtp[TAB]```
と打つと

```html
<template name="name">
  ...
</template>
```

に展開される。これ超好き。
Custom sort in Python3



In Python2, sort has input `cmp` to define custom comparizon. However, python3 removed it. 


In Pyhton2

```python
>>> def compare(a, b):
...     """Comparison that ignores the first letter"""
...     return cmp(a[1:], b[1:])
>>> names = ['Adam', 'Donald', 'John']
>>> names.sort(cmp=compare)
>>> names
['Adam', 'John', 'Donald']

```

In Python3, we can just use `key`.

```python
>>> names = ['Adam', 'Donald', 'John']
>>> names.sort(key=lambda x: x[1:])
>>> names
['Adam', 'John', 'Donald']

```


complex sort:
Sort word count. Data is represented by tuple: (word, count). 
1. sort by count in descending order
2. if count is same, sort them with alphebet order of word

```python
>>> l = [('betty', 1), ('a', 1), ('butter', 2)]
>>> def custom_key(x):
...     return -x[1], x[0]
...
>>> l.sort(key=custom_key)
>>> l
[('butter', 2), ('a', 1), ('betty', 1)]

```

How this works?
In comparison, python check first element of tuple. If they are same, compare the next element in tuple. Therefore, sort by count in descending order means first tuple and if count is same means second tuple of element.






ref:
http://python3porting.com/preparing.html
PHPで簡単なLINE BOTを動かす

> [目的]
LINE BOT API Trial Accountを利用してLINEボットを作る。

事前準備として、[LINE BOT API Trial Account](https://business.line.me/ja/products/4/introduction) からアカウントを取得する。そして、コールバック通信にはSSL通信が必須なため、Webサーバをhttps化しておく必要がある。Webサーバのhttps化は [Let's EncryptでSSL通信をしてhttps化](http://qiita.com/ikenyal/items/c2d9af510805dafdf2dd) を行っておく。

# Basic Informationの設定
[LINEビジネスアカウント](https://business.line.me/ja/) にログインしボットのアカウントの設定をする。

## Callback URLの設定
Callback URLはポート名も含め、「https://サーバー:443/ほげほげ」の形式で入力する。

## Server IP Whitelistの設定
コールバック先のサーバのIPを指定する。

# 実装

[BOT APIのドキュメント](https://developers.line.me/bot-api/overview) を参考に実装する。

```php
<?php
$request = file_get_contents("php://input");
$json = json_decode($request);
$content = $json->result[0]->content;

$header = array(
    'Content-Type: application/json; charser=UTF-8',
    'X-Line-ChannelID: 【Channel　IDを指定】',  // Channel ID
    'X-Line-ChannelSecret: 【ChannelID　Secretを指定】',  // ChannelID Secret
    'X-Line-Trusted-User-With-ACL: 【MIDを指定】',  // MID
);
$post = array(
    'to' => array($content->from),
    'toChannel' => 1383378250,  // Fixed value.
    'eventType' => '138311608800106203',  // Fixed value.
    'content' => array(
        'contentType' => 1,
        'toType' => 1,
    ),
);

// ボットが返答する内容。ここでは送られた内容を復唱するだけ
$post['content']['text'] = $content->text.' ですね';

$post = json_encode($post);

$ch = curl_init("https://trialbot-api.line.me/v1/events");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
```
メモ：可視光通信システム "Picalico" 評価用プログラムで遊ぶ

- [可視光通信システムPicalico（ピカリコ）｜カシオ計算機株式会社](http://picalico.casio.com/ja/)
- [GR-COTTON Special| がじぇっとるねさす | ルネサス エレクトロニクス](http://gadget.renesas.com/ja/product/cotton_sp11.html)

GR-COTTONおよびArduinoでのサンプルコードを含む評価用プログラムが公開されているので、ちょこっと改造して遊ぶ。
ボードにはESP-WROOM-02を、フルカラーLEDには[Adafruit NeoPixel](https://www.adafruit.com/product/1938)を使い、BME280の温度を出力させる。

![Screenshot_2016-05-13-23-46-18.png](https://qiita-image-store.s3.amazonaws.com/0/82738/d01f386b-5d35-2345-2148-d0f234686c1a.png)

ほほう。

LED光による可視光通信については、「電波を発射しない」という利点があるので、[イベント会場でのマルチコプター(ドローン)の識別](http://www.rbbtoday.com/article/2016/04/28/141754.html)とか、いろいろ考えられているっぽい。
Rustでhyper使ってHTMLを扱ってみた

# RustでWebアプリケーション？

[Go言語によるWebアプリケーション開発](https://www.oreilly.co.jp/books/9784873117522/)を読んでいて、これはRustで書くとどうなるんだろうかと思って、「1.1 シンプルなWebサーバー」のみ書いてみました。ほんとシンプルなやつです。

私は完全にRust初心者なのでたぶんあまり正しくなかったり非効率だったりしている気がします。

```rust
extern crate hyper;

use std::io::Write;
use hyper::Server;
use hyper::server::Request;
use hyper::server::Response;
use hyper::header::ContentType;
use hyper::mime::{Mime, TopLevel, SubLevel};
use hyper::header::ContentLength;



fn hello(_: Request, mut res: Response) {
    let body = b"
        <html>
            <head><title>chat</title></head>
            <body>
                chat!
            </body>
        </html>
    ";
    res.headers_mut().set(ContentLength(body.len() as u64));
    res.headers_mut().set(ContentType(Mime(TopLevel::Text, SubLevel::Html, vec![])));

    let mut res = res.start().unwrap();
    res.write_all(body).unwrap();
}

fn main() {
    Server::http("127.0.0.1:3000")
        .unwrap()
        .handle(hello)
        .unwrap();
}
```
Webサーバはhyperを使いました。
ironとか使おうと思ったんですが、本と同じ感じでやりたかったんでまずはこれでやってみました。

# 困ったこと
## ContentTypeの指定
ContentTypeを指定する必要があったんだけど、ちょっと指定の仕方が(自分としては)複雑で、`ContentType(Mime(TopLevel::Text, SubLevel::Html, vec![]))`という記法にたどり着くのに少し時間がかかった。

## 日本語表示
日本語の表示はまだうまくできてないです。どうやったらいいんだろう。

## HTMLを取り扱うサンプルを見つけられなかった
RustのWebアプリケーションのサンプルはほとんどWebAPIで、HTMLを表示するようなサンプルが全然見つからなくて、やり方に苦労しました。
最近の流れとしてフロントとサーバサイドの役割は分かれてるし、JSONとか扱えれば充分とは思いつつも、全く見つからないとは思ってなかった。うまく探したらあるんだろうけど。。
いけてる（今どうかは知らないが）ハニーポットDionaeaを構築するときにつまづいたこと

表題の通り、つまづいた部分しか投稿しません
大体はググれば出てくる記事を見れば問題ありません
#公開されているサーバが必要
初めてDionaeaを起動してもどうも様子がおかしい
それもそのはず、ローカルのノートパソコンに入れましたからね
外からアクセスできるわけがなかったんですね
こんなこともわからないのかこの馬鹿はという感じです
ええ、分からなかったんです
悲しいですね
そんなこんなでサクラのVPSを借りました
#公式サイト死んでるじゃん
どうやら開発の終了に伴い公式サイトが閉鎖されてしまった模様
しかしよくよく探してみるとgithubに公式サイトと同程度の情報(多分)が載っているではありませんか
うんうん悩んでいたのがバカみたいですね
https://github.com/rep/dionaea
#インストールしたはずのものが認識されない
人様のブログに書いてある内容をそのまま使ったらエラーが出ました
実はこれも当然の結果で、ディレクトリの構成が違っていたんですね
バカですね
もしこれからDionaeaを導入するという人はディレクトリっぽい文字が現れたら自分の構成と同じかよく確認しましょう
#起動しているはずなのに外から確認できない
これはよくわかりません
待ち受けるIPアドレスをmanualで設定したらうまくいきました
SQL Server Management Studio (SSMS)の使い方：エラー対策

#変更の保存が許可されていません。エラー
テーブルの再作成を必要とする変更を保存できるようにする。

>変更の保存が許可されていません。行った変更には、次のテーブルを削除して再作成することが必要になります。再作成できないテーブルに変更を行ったか、テーブルの再作成を必要とする変更を保存できないようにするオプションが有効になっています。

1. メニューから「ツール」を選ぶ
1. 「オプション」を選ぶ
1. 左側のツリーから「デザイナ」を選ぶ
1. 右側の「テーブル オプション」から「テーブルの再作成を必要とする変更を保存できないようにする」のチェックを外す

![image](https://qiita-image-store.s3.amazonaws.com/0/93227/1c60bde2-952b-e7d0-54b2-0365c9f9419c.png)


##クエリーでテーブルを表示する。
SQL をスクリプト化する
![image](https://qiita-image-store.s3.amazonaws.com/0/93227/64796888-205c-ce69-745b-b434a63eb469.png)

---
#AccessとExcelを連携してクラウドシステムを作成する
データベースをAzure SQL にセットして、AccessやExcelのプログラムから データベースを遠隔地間で共有するシステムを公開しています。

[<img src="https://qiita-image-store.s3.amazonaws.com/0/93227/1e640f8b-edfd-2b4e-aafe-ce96a835dd7b.png" width=70%>](http://access-cloud.hatenablog.com/entry/database)
http://access-cloud.hatenablog.com/entry/database
多分これが一番簡単なStateMachineだと思います．

状態によってキャラクターの挙動を変えるサンプル．



# 1. 状態の定義
ここでは，例としてAngry状態とSmile状態があるとします．
<img width="581" alt="スクリーンショット 2016-05-15 15.21.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/b3bc37ae-f4bd-5fc4-b83b-b30aa5683bbc.png">


## 状態をスクリプトで列挙する．

Angryを0, Smileを1と数字で置きます．

また，現在の状態をint型の整数```currentState```として，最初の状態をAngryとすると，以下のように表すことができます．

### 現在の状態を設定するスクリプト

```csharp
int currentState = 0;     //Angry:0 ,   Smile:1
```


<img width="813" alt="スクリーンショット 2016-05-15 15.30.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/9a2bee74-9cfd-ab56-1a19-7c4fdc8d0eb6.png">

これで，現在何の状態なのかを設定することができました．

# 2. 状態を変える条件の追加


AngryからSmileに変わる条件を「**Sキーを押した時**」にします．

### Sキーを押したらSmile状態に変えるスクリプト

```csharp
// state : Angry
		if (currentState == 0) {
			Debug.Log ("Angry!");

			//Smileになる条件
			if (Input.GetKeyDown (KeyCode.S)) {
				currentState = 1;
			}
		}
```

図で表すと以下のようになります．
<img width="787" alt="スクリーンショット 2016-05-15 15.36.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/113504/54a397d9-02b8-26ff-35dc-a37ff654aaa0.png">

現在の状態がAngry状態からSmile状態に変わりましたね．

この条件の矢印をSmileからAngryの方にも作ることで完成です．

### 完成スクリプト

```csharp
int currentState = 0;  // 0:Angry   1:Smile

	void Update () {
		
		// state : Angry
		if (currentState == 0) {
			Debug.Log ("Angry!");

			//Smileになる条件
			if (Input.GetKeyDown (KeyCode.S)) {
				currentState = 1;
			}
		}


		// state : Smile
		if (currentState == 1) {
			Debug.Log ("Smile!");

			//Angryになる条件
			if (Input.GetKeyDown (KeyCode.A)) {
				currentState = 0;
			}
		}
	}
```

### StateMachine完成図
![image](https://qiita-image-store.s3.amazonaws.com/0/113504/9e3ac620-5a0f-6401-8af7-171ae2570ef2.png)

これで実装完了です．

StateMachineに慣れてくると，AIを記述したり，ごちゃごちゃしたプログラムを考える時に整理するといったことが可能になります．

# 練習問題
以下の図のようにSad状態を追加せよ．
![image](https://qiita-image-store.s3.amazonaws.com/0/113504/da35b297-0814-e12e-21a0-ca1bc173af2b.png)
NCMBとMONACAを使ってアプリ開発（roleにフィールド追加）

#roleに新しいフィールド追加

roleって他のCLASSと同じ操作でいいっていうことがちょっと不安だったしよくわからなかったんだけど、普通のCLASSと同じように操作したらいいってことがわかった。

```
//roleの作成（作成者が同時にroleに所属される。かつ、新しいカラムをsetする）
function makeNewRole(){
    var roleName = $('#input_role_name').val();
    var roleDisp = $('#input_role_disp').val();
    var currentUser = ncmb.User.getCurrentUser();
    var DS = new ncmb.Role(roleName);
    
    DS.addUser(currentUser)
      .set("roleDisp",roleDisp) //こんな感じでロールの説明が入るようにしてみた。
      .save()
      .then(function(){
            makeNewroleMsg(roleName);
            hogehogeNavi.popPage();
      })
      .catch(function(err){
           alert(err);
      })
}
```
こうすると、[roleDisp]って登録される。


#NCMBってkey/valueだよねっていう、きっと当たり前の話
というかあんまりわかってなかったんだけど、結局、ncmbのデータベースって、[key:value]型のオブジェクトを操作しているだけなんですよね。noSQLっていうのかな。それって[key:value]データを取得して、JSで定義したオブジェクトにいれて、加工して、戻すってだけ。
こういう操作的なことは[key:value]の書き方がわかればいいってことなんですね、きっと。

key=カラム名
value=値
固定されてないから、リレーショナルじゃないデータベースなのです。


メモっとこう。
（きっとすごい当たり前。プログラムができない自分くらいしかわかってない人いないだろう笑）
Controller名と異なる他Modelのメソッドを使う方法


今まで、Model名と同名のControllerでないとメソッドが使えないと思い込んでいた。

要するに、`item.rb`というModelがあって、`item.rb`で設定されたメソッドを使えるのは
`items_controller.rb`のみだと勘違いしていた。

でも、そんな事はないという事が分かったので、理解出来ている範囲でまとめてみる。

`index_controller.rb`というControllerがあったとする。

```ruby
class IndexController < ApplicationController
  def index
    @items = Item.all.order("updated_at DESC").limit(30)
  end
end
```

このように`Item`というモデル名を記述してあげれば、`item.rb`に設定されたメソッドや`foreign_key`のIDなども
アクセスする事が出来る。
簡単にDraft.jsについて

Draft.jsはFacebookのReact製リッチテキストフォームを作れるコンポーネント。

公式
https://facebook.github.io/draft-js/

具体的にどんなことができるかというと、
2月の「React.js Conf 2016」の動画がyoutuubeにあります。
デモは21:00あたりから。
https://youtu.be/feUYwoLhE_4

とりあえずexamplesを触ってみたい場合、公式の用意しているものがシンプルで判りやすい。
```
git clone https://github.com/facebook/draft-js.git
cd draft-js
npm install
npm run build
```

FacebookではNotesとmessengerで使われており、実際のプロダクトで使われているところが安心感がある。

サポートや議論はslack teamでをしている。
https://draftjs.herokuapp.com
Texの数式を画像として取得できるWebサービス

##Texの数式をパワポなどで使いたいときに便利

このサービスは，

- 研究発表の資料でスライドを作る機会が多いが，デフォルトの数式のフォントがあまり好きじゃない...
- パワポで数式整列ってどうやるんだ？？

なんて思っている方にオススメです．

「できることなら論文で書かれているのと同じ体裁で数式もスライドに載せたい」との思いから，
Texの数式を画像で出力してくれる良さげなWebサービスないかな〜と探して見つけたので紹介させていただきます．

##TeXclipの使い方

そのサービスがこちらの[TeXclip](http://texclip.marutank.net/)です．
使い方はとても簡単！

![スクリーンショット 2016-05-15 14.29.37.png](https://qiita-image-store.s3.amazonaws.com/0/37946/1433aac6-f037-b80d-5eb8-b3d95b997d4c.png)

1. Texコマンドを入力します．
2. 左のGenerateボタンをクリック．
3. 所望の形式で画像をダウンロード．

たったこれだけの操作で，いつも見慣れた数式を使うことができます．

使い慣れたTexコマンドで数式の整列など体裁も整え，必要に応じて文字の色やフォントを変えることが可能です！
Raspberry Pi 2: Lubuntu-desktop 16.04(スクショ)


[Raspberry Pi 2で、Ubuntu 16.04 LTS (Official image)](http://qiita.com/mt08/items/de669f26cf407935dc25) から、lubuntu-desktopインストール後、lubuntuのデスクトップで起動しました。

```
ubuntu@ubuntu:~$ time sudo apt-get install lubuntu-desktop -y
...
...

aspell-autobuildhash: processing: en [en_GB-variant_1].
aspell-autobuildhash: processing: en [en_US-w_accents-only].
aspell-autobuildhash: processing: en [en_US-wo_accents-only].

real    120m1.866s
user    16m47.840s
sys     6m42.012s
ubuntu@ubuntu:~$ sudo reboot
```

## スクショ
SSHで別の端末からログイン、裏でfbgrabを使用(sudo apt-get install fbcat)して、スクショ。 (`% fbgrab filename.png`)


- ログイン画面
![01.png](https://qiita-image-store.s3.amazonaws.com/0/75594/c3040acf-b5d9-51bf-c4db-6859984c5934.png)

- ログイン直後
![02.png](https://qiita-image-store.s3.amazonaws.com/0/75594/26e0b5b5-603d-d76c-5430-ff74ed487d99.png)

- メニューから、Firefox選択
![03.png](https://qiita-image-store.s3.amazonaws.com/0/75594/a92b732a-70ae-1e6c-c7e4-2f75b2364405.png)
<a ![04.png](https://qiita-image-store.s3.amazonaws.com/0/75594/a70286dd-bf83-72c9-3618-839b318ecc3b.png) >

- Firefox起動
![05.png](https://qiita-image-store.s3.amazonaws.com/0/75594/d4c4d21e-0a5e-0ee1-9b44-634541eccc1f.png)

- ターミナル (byobuで画面分割, htop, iotop, bwm-ng)
![06.png](https://qiita-image-store.s3.amazonaws.com/0/75594/606d7665-0f80-8731-3c48-fa2308929dcd.png)
MarkLogicのJavaのサンプルを手っ取り早く動かす方法 (コマンドライン編)

[MarkLogic](http://jp.marklogic.com)というNoSQL製品では、JavaのAPIが提供されています。[Java Application Developer's Guide](http://docs.marklogic.com/guide/java/intro)を読みながら使い方を理解すると良い感じです。

今回は、APIパッケージをMarkLogicのサイトからダウンロードし、その中のサンプルをコマンドラインで動かす方法です。[Eclipse編](http://qiita.com/makopo/items/c38a43ce41a8ff57ff6b)と似たような手順ですが、Mavenは不要です。ソースはサンプルのみとなっています。

参考:
https://github.com/marklogic/java-client-api/wiki/Running-the-Examples

## 事前にインストールが必要なもの

 - JDK 1.7以降

## MarkLogicサーバーの設定

1. MarkLogicサーバーの管理コンソール( http://localhost:8001/ )に行き、右側のツリーからConfigure -> Security -> Users を選択
![userpane.png](https://qiita-image-store.s3.amazonaws.com/0/10290/75139eb0-d526-7c61-2328-2a72d8f75afa.png)

2. 左側でCreateタブを選択し、順に以下の3つのユーザーを作成

| ユーザー名     | パスワード  | 必要なRole     |
|:-------------|:-----------|:-------------|
| rest-reader  | x          | rest-reader  |
| rest-writer  | x          | rest-writer  |
| rest-admin   | x          | rest-admin   |

この表と違う内容でユーザーを作成しても良いです。その場合、 APIパッケージの中にある```example/Example.properties```の編集が必要となります。

## Java APIとサンプルプロジェクトのダウンロード

1. APIパッケージ http://developer.marklogic.com/products/java
2. ZIPを適当なところに展開

## 実行

```shell-session
$ cd <展開したディレクトリ>/example
$ javac -cp "../lib/*" com/marklogic/client/example/cookbook/*.java
$ java -cp ".:../lib/*" com.marklogic.client.example.cookbook.AllCookbookExamples
```

部分的に動かしたい場合は、```ClientCreator```等、個別の起動クラスを実行することもできます。ただし、```AllCookbookExamples.java```の```main()```に書いてある順序通りに動かす必要があります。

## コンソールの表示を確認

うまくいけば、コンソールにこのような表示が出るはずです。
https://gist.github.com/Makopo/6754f41b60a7260618441ea9fe3281dd
Qiitaの記事とJupyter notebokとの相互変換

# はじめに
Qiitaの記事をJupyterで見たいとき、コピペでもいいですが、一括して変換できるようにプログラムを作ってみました。

## Jupyter notebookからMarkdownへ
- まずは、Jupyter notebookからMarkdownへ変換してみましょう。
- Jupyterの"File"メニューの"Download as"からもできますが、Pythonでやってみます。
- 以下のコードを"make_md.py"とし、下記のようにすると、結果を画面に表示します。
    - python make_md.py "ファイル名"
- "raw"の場合、preタグで囲んでいます。
- "code"の場合、"py3"にしています。

```py3:make_md.py
import sys, yaml
if len(sys.argv) < 2:
    exit()

try:
    with open(sys.argv[1], encoding='utf-8') as f:
        ls = yaml.load(f)['cells']
except:
    exit()

for dc in ls:
    typ = dc['cell_type']
    src = ''.join(dc['source'])
    if not src: continue
    if typ == 'markdown':
        print('%s'%src)
    elif typ == 'raw':
        print('<pre>\n%s\n</pre>'%src)
    elif typ == 'code':
        print('\n```py3:python3\n%s\n```'%src)
```
## MarkdownからJupyterへ
- 以下のコードを"make_ipynb.py"とし、下記のようにすると、Jupyterのファイルを作成します。
    - python make_ipynb.py "URL"

```py3:make_ipynb.py
import sys, urllib.request
from itertools import takewhile
if len(sys.argv) < 2:
    exit()
try:
    s = urllib.request.urlopen(sys.argv[1]+'.md').read().decode().rstrip()
    ss = s.replace('\\', '\\\\').replace('\t', '\\t').replace('"', '\\"').split('\n')
except:
    exit()
fn = ss[0]
ss[0] = '# ' + ss[0]

def parse_str(ss):
    tt = list(takewhile(lambda s: not s.startswith('```'), ss))
    ss = ss[len(tt):]
    cell_type = 'raw' if len(tt) == 0 else 'markdown'
    if cell_type == 'raw':
        nm = ss[0][(ss[0]+':').index(':')+1:]
        tg = ss[0][3:len(ss[0])-len(nm)].rstrip(':')
        ss = ss[1:]
        if tg.startswith('py') or tg == 'bash':
            cell_type = 'code'
        tt = list(takewhile(lambda s: not s.startswith('```'), ss))
        ss = ss[len(tt):]
        if cell_type == 'code':
            tt = list(takewhile(lambda s: not s.startswith('>>>'), tt))
        if ss:
            ss = ss[1:]
        tt = ([('%%' if tg == 'bash' else '# ') + tg] if tg else []) + tt
    return cell_type, tt, ss
cdin = '   "execution_count": null,\n   "outputs": [],\n   '

rr = []
while ss:
    cell_type, tt, ss = parse_str(ss)
    s = '\\n",\n    "'.join(tt)
    if s:
        rr.append("""\
   "cell_type": "%s",
   "metadata": {},
%s   "source": [
    "%s"
   ]
"""%(cell_type, '' if cell_type != 'code' else cdin, '\\n",\n    "'.join(tt)))

with open(fn+'.ipynb', 'w') as fp:
    fp.write("""\
{
 "cells": [
  {
""")
    fp.write('  },\n  {\n'.join(rr))
    fp.write("""\
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}\n""")
```

# 追記
- SaitoTsutimuのPythonの記事直近20を自動で表示するようにしました。
    - https://hub.docker.com/r/tsutomu7/qiita-jupyter/
        - ポータルのflaskのポートを5000にしています。
        - サブのJupyterのポートは8888にしています。
            - Kitematicのときは、8888に戻してください。
- 一時的にArukasで公開しました。
    - https://qiita-jupyter.arukascloud.io/

以上
ラズパイでJava8を使う

自分のRaspberry Piに、Java8をインストールしたので、メモを残しておきます。特に、難しいことはありませんでした。



# 事前確認

現在のJavaインストール状態を確認します。Java7がインストールされていました。

```
$ java -version
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) Client VM (build 24.0-b56, mixed mode)
$
$ which java
/usr/bin/java
$ ls -l /usr/bin/java
lrwxrwxrwx 1 root root 22 Jan  8  2014 /usr/bin/java -> /etc/alternatives/java
$ ls -l /etc/alternatives/java
lrwxrwxrwx 1 root root 44 Jan  8  2014 /etc/alternatives/java -> /usr/lib/jvm/jdk-7-oracle-armhf/jre/bin/java
$ ls -l /usr/lib/jvm/jdk-7-oracle-armhf/jre/bin/java
-rwxr-xr-x 1 root root 5924 Aug 27  2013 /usr/lib/jvm/jdk-7-oracle-armhf/jre/bin/java
$
$ dpkg -l | grep jdk
ii  oracle-java7-jdk                      1.7.0+update40                          armhf        Java? Platform, Standard Edition 7 Development Kit
```

aptでインストール可能なJavaを確認します。Java8がインストールできることを確認できました。

```
$ apt-cache search oracle jdk
oracle-java7-jdk - Java? Platform, Standard Edition 7 Development Kit
oracle-java8-jdk - Java? Platform, Standard Edition 8 Development Kit
```



# OSアップデート

以降の作業を安定して進めるため、次のコマンドでOSをアップデートしました。

```
$ sudo apt-get update
```



# Java8インストール

次のコマンドでインストールしました。

```
$ sudo apt-get install oracle-java8-jdk
$ dpkg -l | grep oracle
ii  oracle-java7-jdk                      1.7.0+update40                          armhf        Java? Platform, Standard Edition 7 Development Kit
ii  oracle-java8-jdk                      8                                       armhf        Java? Platform, Standard Edition 8 Development Kit
$ java -version
java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) Client VM (build 25.0-b70, mixed mode)
$ which java
/usr/bin/java
$ ls -l /usr/bin/java
lrwxrwxrwx 1 root root 22  1月  8  2014 /usr/bin/java -> /etc/alternatives/java
$ ls -l /etc/alternatives/java
lrwxrwxrwx 1 root root 51  5月 14 21:47 /etc/alternatives/java -> /usr/lib/jvm/jdk-8-oracle-arm-vfp-hflt/jre/bin/java
$ ls -l /usr/lib/jvm/jdk-8-oracle-arm-vfp-hflt/jre/bin/java
-rwxr-xr-x 1 root root 5912  3月  5  2014 /usr/lib/jvm/jdk-8-oracle-arm-vfp-hflt/jre/bin/java
```



# 設定

環境変数JAVA_HOMEを使用するアプリケーションのため、次の設定をしておきます。

```
$ JAVA_HOME=/usr/lib/jvm/jdk-8-oracle-arm-vfp-hflt
```

もし、今回インストールする前のJava7を使いたい場合は、次の設定で使えるようになります。

```
$ JAVA_HOME=/usr/lib/jvm/jdk-7-oracle-armhf
$ PATH=${JAVA_HOME}/bin:${PATH}
$ java -version
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) Client VM (build 24.0-b56, mixed mode)
```
rails in_groups_of vs ruby each_slice

http://apidock.com/rails/Array/in_groups_of


```rb
require 'enumerator'

[1,2,3,4,5,6,7,8].each_slice {|a,b,c| puts a,b,c}
  1,2,3
  4,5,6
  7,8,nil
```

Rails already has this actually:

```rb
[1,2,3,4,5,6,7,8].in_groups_of(3) => [[1, 2, 3], [4, 5, 6], [7, 8, nil]]
```
【R】統計Rの使い方 #1

とりあえず30分書きました。

#Rとは
>R言語（あーるげんご）はオープンソース・フリーソフトウェアの統計解析向けのプログラミング言語及びその開発実行環境である。
[Wikipedia - R言語](https://ja.wikipedia.org/wiki/R%E8%A8%80%E8%AA%9E)

SPSS：IBM社による有償ソフト。20万円くらい。GUI(Graphical User Interface:クリックでの操作)に対応。
R：オープンソースのフリーソフト（オープンソース：インターネット上のいろんな人が開発している。フリーソフト：無料で使える）。基本的にCLI(Command Line Interface：コマンド=キーボードで指示を入力して操作）。
このページなど読んでみてください→[Rとは](http://www.obihiro.ac.jp/~masuday/resources/stat/r_introduction.html)

##Rを使う意味

- 無料ソフトなので、個人的に統計を勉強したい人などが利用できる。
- 追加機能を取り入れるときに、SPSSではパッケージを購入などで追加費用がかかる。気軽に試しづらい。
- オープンソースなので、新しい統計手法を取り入れやすい。
- マニュアルが存在しないので、インターネットや参考書籍を頑張って読みましょう。
- もちろんオープンソースの世界は英語優勢なので英語でググれる方が強いです。
- プログラミングをちょっとでもかじっている方が使いやすいかも…


#はじめの一歩
- Rをインストールする。詳細は[こちら](http://www.okadajp.org/RWiki/?R%20%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)からどうぞ。
- GUIが良ければ[R Commander](http://mjin.doshisha.ac.jp/R/38/38.html)もインストール。ただし使える機能はある程度限られる。
- CLIが良いなら[RStudio](http://memorandum2015.sakura.ne.jp/index_rstudio.html)を使用すると使いやすい。
- Macの場合はXcodeをインストールしないと使えない。Windowsは特にそういった制約はない（はず）。

#参考になるページ
[統計科学研究所](http://www.statistics.co.jp/reference/software_R/free_software-R.htm)：Rに関する説明、主要な使い方など
[RjpWiki](http://www.okadajp.org/RWiki/)：RにまつわるWikipedia
[ドットインストール-R入門](http://dotinstall.com/lessons/basic_r)：使い方のイメージには役立ちそう
MarkLogicのJavaのサンプルを手っ取り早く動かす方法 (Eclipse編)

[MarkLogic](http://jp.marklogic.com)というNoSQL製品では、製品のJavaインターフェースを呼び出すサンプル実装が公式から提供されています。ソースは、[Java Client APIプロジェクト](https://github.com/marklogic/java-client-api)の```com.marklogic.client.example```パッケージ内にあります。利用手順は、[GitHubのWiki](https://github.com/marklogic/java-client-api/wiki/Running-the-Examples)にあります。[Java Application Developer's Guide](http://docs.marklogic.com/guide/java/intro)を読みながら理解すると良い感じです。

[MarkLogicのサンプルスタック](http://qiita.com/makopo/items/d8619bed1235d45d81c1)が大きすぎて、何やっているかわからない感がある方は、こちらの方がとっつきやすいかもしれません。

手順が色々なところに分散して書かれていたため、こちらにまとめてメモしておきます。

## 事前にインストールが必要なもの

 - [Maven](https://maven.apache.org)
 - JDK 1.7以降

## MarkLogicサーバーの設定

1. MarkLogicサーバーの管理コンソール( http://localhost:8001/ )に行き、右側のツリーからConfigure -> Security -> Users を選択
![userpane.png](https://qiita-image-store.s3.amazonaws.com/0/10290/75139eb0-d526-7c61-2328-2a72d8f75afa.png)

2. 左側でCreateタブを選択し、順に以下の3つのユーザーを作成

| ユーザー名     | パスワード  | 必要なRole     |
|:-------------|:-----------|:-------------|
| rest-reader  | x          | rest-reader  |
| rest-writer  | x          | rest-writer  |
| rest-admin   | x          | rest-admin   |

この表と違う内容でユーザーを作成しても良いです。その場合、```src/main/resources/Example.properties```の編集が必要となります。

## サンプルプロジェクトのダウンロード

```shell-session
$ git clone --depth 1 https://github.com/marklogic/java-client-api
```

## Eclipse上での実行

1. Eclipseに```java-client-api```プロジェクトをインポート
2. Package Explorerで```java-client-api-develop```を右クリック
-> ```Run As``` -> ```Java Application``` (または```実行```-> ```Java アプリケーション```)
3. ```AllCookbookExamples```を選択
![sentaku.png](https://qiita-image-store.s3.amazonaws.com/0/10290/741c0d8c-72ba-5ca3-18e4-779afb00686b.png)

部分的に動かしたい場合は、```ClientCreator```等、個別の起動クラスを選択して実行することもできます。ただし、```AllCookbookExamples.java```の```main()```に書いてある順序通りに動かす必要があります。

## コンソールの表示を確認

うまくいけば、Eclipseのコンソールにこのような表示が出るはずです。
https://gist.github.com/Makopo/6754f41b60a7260618441ea9fe3281dd
ActionScriptを書く時に気を付けていること

Flashのエディタ上のタイムラインに記述する場合に、
・[どこに][どんな]スクリプトを書いているのか
分かりやすくするために..

廃れているかもしれませんが、
使用しているのでメモ。
<br>

#ムービークリップ内に複雑なスクリプトは記述しない
複雑な構造になればなるほど分かりにくくなります。
チームで運用している場合、「自分だけが分かる」というのは非常にまずいので避けるべきでしょう。
メンテナンスしにくくなります。
このために、Flashの文字検索機能を使用して検索する時間ももったいない。
<br>

#ラベルを有効活用する
具体的には、「currentLabelが～ならこの処理をする」
ということを一か所にまとめて書いています。
ムービークリップ内に設定しているラベルは、 mc.currentLabel で取得できます。
<br>

<br>


これだけで格段に見やすくなるのではないでしょうか。

行数が増えすぎた場合は用途に合わせて別フレームに書くなど、
したほうが良いとは思います；

個人的に、色々と試しているところなので、
良さそうな書き方を発見次第追記していこうと思います。
ディレクトリ以下のファイル1つずつに対して1行でコマンドを実行する

# そんなときはxargs

いつも xargs というコマンド名を忘れてしまう自分のためにメモ。

ディレクトリ以下特定の拡張子を持つファイルに対して特定のコマンドを実行したいんだけど、コマンドがファイル1つしか受け付けないか、ファイルがかなり多くて面倒、という場合に使えます。
たまにスクリプトで書けば良いじゃん、と思うけど、ワンライナーでないと使う気がしないし;;

# 使い方(末尾に追加するだけでいい場合)

```bash
ls *.txt | xargs -l echo abcdef

# 結果は・・・(ディレクトリにfile1.txtとsample.txtが存在)
# abcdef file1.txt
# abcdef sample.txt
```

中身はというと・・・

1. ls *.txt でファイルとかのリストアップ(findとか別のコマンドでもOK)
2. xargs -l で後ろに記載されているコマンドに引数を追加
3. echo abcdef [+ 2で追加されたファイル名] でコマンドを実行(ここは使いたいコマンドを。)

という感じです。

ちなみに、2の -l スイッチは -n 1 と同じで複数のリストがある場合に1個ずつパラメータにセットして実行してくれるみたいです。
つけない場合は echo file1.txt sample.txt という感じになります。

# 使い方(コマンドの真ん中に追加したい)

最後じゃなくてコマンドの真ん中に足したいんだけど・・・というときは

```bash
ls *.txt | xargs -l -iREPLACE echo abc REPLACE def
# または
ls *.txt | xargs -l --replace=REPLACE echo abc REPLACE def

# 結果は・・・
# abc file1.txt def
# abc sample.txt def
```

REPLACEが置き換える文字列で、自由に指定できます。
-i または --replace スイッチで文字列を指定して、後ろのコマンドにその文字列を入れると入れ換えて実行してくれることがわかります。

# まとめ
xargsを使うとシェルスクリプトを作らなくても**ワンライナーで**ファイルとかを一括処理できる。

こういうコマンドを見てると本当にシェルってかゆいところに手が届くなぁ、とつくづく感じます。

# 参考
今回は以下を参考にさせていただきました。
>[xargs コマンド - hydroculのメモ](https://hydrocul.github.io/wiki/commands/xargs.html)
>[Linuxコマンド集 - 【xargs】標準入力から生成したコマンドラインを実行する：ITpro](http://itpro.nikkeibp.co.jp/article/COLUMN/20140331/547143/)
openFrameworks + xcodeでハマる洗礼的エラーあるある言いたい

#Xcode+oFの洗礼的エラー
当方Xcode3くらいの時に使い始めましたが、今バージョン7になって大分使いやすくなってきました。
ですが触り始め誰もがハマるみたいなエラーがまだあるので、ここに書き留めておきます。oFの授業でTAやってると「あーこれあったね…」みたいな感じになるので、気づいたら書き足していこう。
キャプチャ等はXcode7を使用。

##includeのリンカエラーでハマる
補完に頼ってると、たまに#include"hoge.cpp"みたいに実装ファイルをインクルードしてしまう時があります。
自動生成されるヘッダがhoge.hppという拡張子になってしまったので余計に気づきづらい…
<img width="761" alt="スクリーンショット 2016-05-10 15.28.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/11590/e4bf299d-92f0-310d-5675-36c0393f2d63.png">
duplicate symbols for architecture XXXというエラーが出るので、これが出るとcppインクルードしてるパターンが多い。

##文字エンコーディングでハマる
<img width="398" alt="スクリーンショット 2016-05-10 15.32.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/11590/6602255f-9581-217a-d8e2-0c079cc8fa92.png">
”UTF-16 (LE) byte order mark detected in XXX”というエラーでハマる。
日本語入力オンのまま入力しようとして、下のようなダイアログが出た時にConvert to Unicodeを押してしまった時に出てきがちです。
<img width="565" alt="スクリーンショット 2016-05-10 15.31.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/11590/1f1cd44e-84fc-b81f-0b61-e03f2e629a45.png">
エラーが出てるファイルを選択後、Utilityを出して(⌥⌘0)Text EncodingをUTF-8にConvertします。
<img width="246" alt="スクリーンショット 2016-05-10 15.36.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/11590/e2bcd364-6bbf-4d50-e927-dd3c852b80d5.png">
リストから変えます。
<img width="275" alt="スクリーンショット 2016-05-10 15.37.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/11590/a282fcde-6166-f271-07e1-a3adecf061c8.png">
これでコンパイルも通るし、デフォルトではWesternだったのですが日本語でコメント等も入れられるようになります。

##ターゲットでハマる
再生ボタン押してるのにoFが実行されない！という時は、ターゲットがopenFrameworksのプロジェクトになってる。
再生ボタン横のスキーム選択プルダウンで、開発中のプロジェクトを選択する。
（of0.9.0~0.9.3を使っている人は64bitでビルドするようにしましょう。どうしても32ビットでビルドしなきゃいけないという理由がある方は[こちら](http://qiita.com/loveandsheep/items/76cf82cd96e904ff93d1) ）
ちなみにDebugビルドはエラー箇所が分かりやすく、Releaseビルドはエラーの詳細がでなくなるけど、少し処理速度が上がる。場合によってはすげー上がる。
<img width="629" alt="スクリーンショット 2016-05-15 15.04.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/11590/e0d6aab3-c7a7-b229-e4c3-326d53998a86.png">

##Base SDKが無くてハマる
<img width="1283" alt="スクリーンショット 2016-05-15 15.55.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/11590/f222feb6-17e9-0a5b-c297-08319536ed4b.png">
ワークショップでサンプルをプロジェクトごとダウンロードしたりした時にありがちなエラー。
oFプロジェクトと、自前プロジェクト両方でBuild SettingsのBase SDKをチェックしましょう。
Deployment Targetも１０．６になってたりすると通らない場合があります。

##「'ofMain.h' file not found」　でハマる
自分で作業してる時にはあまりハマらないかもしれないけど、サンプルをダウンロードしてきたり、別のコンピュータ或いは違うバージョンのoF等に移し替える時にやりがち。

ofApp.hやmain.cppで__'ofMain.h' file not found__とエラーが出てる時はxcodeprojファイルの場所を確認しましょう。
通常はapps/myApps/emptyExample/emptyExample.xcodeprojのようにappsを含めて3つのフォルダ分下がっています。※

![スクリーンショット 2016-05-17 23.31.11.png](https://qiita-image-store.s3.amazonaws.com/0/11590/988a51f2-e222-3493-10e5-a9c415ed89b0.png)


こうしないと、oF周りのライブラリを参照している相対パスが合致しないので、ofMain.hが呼べないというようなエラーが発生します。

※注：プロジェクトジェネレータで違う場所に書きだしていたり、OF_ROOTの情報がデフォルトと違う場合はこの限りではないです。
Xcode7.3で古いSDKを使おうとしても出てこない問題

oFじゃないよなと思いつつ、古いSDK使うのってoFくらいなのかも…と思ったので一応タグをつけつつ。

##7.3以前の対処法
Xcodeがアップデートされる度に、古いSDKが一掃されるという悲しい仕様の話です。
http://qiita.com/yasnis/items/11e14d9f168e88460c78
この辺のエントリにあるように、/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKsの中に、以前のXcodeから持ってきたSDKを入れれば解決します。これが７．３以前の解決法。

##7.3になってからの対処法
７．３以降、同じ所にSDKを入れてもBuild settingsの項目に選択肢として出てこなくなりました。
http://blog.felix-schwarz.org/post/141482111524/how-to-use-the-os-x-109-sdk-with-xcode-73

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Info.plistというファイルにMinimumSDKVersionというキーが入っており、これより低いバージョンのSDKが表示されないみたいです。
なので、従来の手順に加えてこのバージョンを使いたい最低のバージョンまで下げるか、そもそもこのキーを消してしまうことで、XcodeにSDKが認識されるようになります。

このキーは一体何のために存在するんでしょうか…謎です。
oF0.9.0-oF0.9.3 + OS Xで32bitコンパイルができない件

##３２bitコンパイルできない

0.9.0以降で64bitコンパイルに対応した一方で、32bitコンパイルが通らなくなってしまいました。

通常は問題無いんだけど、32bitライブラリが同梱されてるアドオンとか使いたい時に困る…自分でライブラリコンパイルし直すのもつらい…

##oFのリポジトリから取り込む
https://github.com/openframeworks/openFrameworks/commit/7a7d52279df77bc0a63021b3a1dff9ea14821007
FreeImageのリンクエラーらしく、ここの変更を適用することで解決しました。Zipで落として、チクチク該当するファイルを上書きすればいけます。
特定コミットのdiffをZipでダウンロードできないものなのかしら・・・？ヴラウザ上でできたら素敵なのに。


修正済みなので、当然0.9.4では改善される模様。