OmniAICreator/Qiita-1.07M huggingface dataset:
Zybo > Chronicles blog 49 > AMPの使用 > 7. OCMによるCore同士の通信 > 4つのOCM領域の配置

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Adam-Taylor-s-MicroZed-Chronicles-Part-49-Using-the-Zynq-SoC-s/ba-p/518579

OCMは4つの64Kbyte領域がある。その４つがどのように配置されているか。

> The OCM itself is organized into 128-bit words, split into four 64Kbyte regions placed at different locations within the PS address space. The initial configuration has the first three 64Kbyte blocks arranged at the start of the address space and the last 64Kbyte block located towards the end of the address space. You can see this in the linker files below for both applications (Core 0 top, Core 1 bottom):

3つが先頭にあり、1つが後尾にあるとのこと。何故そのような配置なのかは未消化。

| Name | Base Address | Size |
|:-:|:-:|:-:|
| ps7_ddr_0_S_AXI_BASEADDR  | 0x00100000  | 0x00100000  |
| ps7_ram_0_S_AXI_BASEADDR  | 0x00000000  | 0x00030000  |
| ps7_ram_1_S_AXI_BASEADDR  | 0xFFFF0000  | 0x0000FE00  |

| Name | Base Address | Size |
|:-:|:-:|:-:|
| ps7_ddr_0_S_AXI_BASEADDR  | 0x00200000  | 0x00100000  |
| ps7_ram_0_S_AXI_BASEADDR  | 0x00000000  | 0x00030000  |
| ps7_ram_1_S_AXI_BASEADDR  | 0xFFFF0000  | 0x0000FE00  |

> Note the ps7_ram__XXX and ps7_ram_1 relate to memory regions 0 and 1 and not Core 0 and Core 1.

上記のアドレスマップは説明がないが、上の表がCore0のもの、下の表がCore1のものなのだろう。それぞれの中でps7_ram_0がOCMのregion0, ps7_ram_1がOCMのregion1のようだ。region1が後ろにあるが、前述の４つ目の領域との関係は未消化。
Zybo > Chronicles blog 49 > AMPの使用 > 7. OCMによるCore同士の通信 > OCMアクセスの優先度 > 1. SCU reads and writes / 2. Reads and writes initiated by OCM interconnect

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Adam-Taylor-s-MicroZed-Chronicles-Part-49-Using-the-Zynq-SoC-s/ba-p/518579

OCMへのアクセスは４つの方法がある
http://qiita.com/7of9/items/468ffbbef13a3f97c5b8

そのアクセスに関して優先度が決まっている

> With multiple sources accessing the OCM, it is only sensible that a form of arbitration and priority is defined for the access protocols. SCU reads and writes have the highest priority. (Reads have higher priority than writes.) Reads and writes initiated by the OCM interconnect have the next highest priority. Note: You can invert the priority between the SCU write and the OCM interconnect access by setting the SCU Write Priority Low in the OCM Control Register.

1. SCU reads and writes
2. Reads and writes initiated by OCM interconnect

設定で優先度を逆転することもできる
Zybo > Chronicles blog 49 > AMPの使用 > 7. OCMによるCore同士の通信 > OCMへの4つのアクセス方法 > SCU / AXI ACP / AXI High Performance ports / Central Interconnect

MicroZed Chronicles リスト http://adiuvoengineering.com/?page_id=285
@ Adam Taylor blog
https://forums.xilinx.com/t5/Xcell-Daily-Blog/Adam-Taylor-s-MicroZed-Chronicles-Part-49-Using-the-Zynq-SoC-s/ba-p/518579

> The OCM can be accessed:
1. From either of the on-chip ARM Cortex-A9 MPcore processors via the <font color=red>SCU (Snoop Control Unit)</font>
1. From the PL (Programmable Logic) using the <font color=red>AXI ACP (Accelerator Coherency Port)</font> via the Snoop Control Unit
1. From the PL using one of the four <font color=red>AXI High Performance ports</font> via the OCM Interconnect
1. From the <font color=red>Central Interconnect</font> again via the OCM Interconnect
sensor > Link > BNO055 > ESP8266とは相性が悪い > clock stretching

AdafruitのBNO055
https://learn.adafruit.com/adafruit-bno055-absolute-orientation-sensor/overview

ArduinoとUnityでの使用例
http://cubic9.com/Devel/%C5%C5%BB%D2%B9%A9%BA%EE/Arduino/%A5%E2%A1%BC%A5%B7%A5%E7%A5%F3%A5%BB%A5%F3%A5%B5/BNO055/


ESP8266で使用しようとして失敗している例がいくつかある
http://www.esp8266.com/viewtopic.php?p=41401
> I'm told this is because BNO055 uses "clock stretching" and the ESP8266 doesn't support it. 

MPU-9250かMPU-9150を使うほうがよいだろうか。
sensor > Link > 動画: Sensor Fusion on Android Devices: A Revolution in Motion Processing

MPU-9250などを開発しているInvenSenseの人によるSensor Fusionの紹介動画
https://www.youtube.com/watch?v=C7JQ7Rpwn2k&index=53&list=WL
9軸センサーで行われるセンサーフージョンの実例について詳しい

加速度計、ジャイロスコープ、コンパスのデータを使って補正するというのは分かったが、実際の計算については紹介されていない。Sensor Fusionの結果を使うというのが一般的な使い方になるようだ。
技術英語 > Researchers measured drivers’ brain activity as they engaged in common tasks [while behind the wheel] / behind the closed door


http://www.scientificamerican.com/podcast/episode/hands-free-interactive-electronics-13-06-20/
> Researchers measured drivers’ brain activity as they engaged in common tasks <font color=red>while behind the wheel</font>,

http://eow.alc.co.jp/search?q=behind+the+wheel

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

> behind the closed door

http://eow.alc.co.jp/search?q=behind+the+closed+door

公にできない事項を決める時などに使われているというのをビジネス英語の資料で見た。
とりあえず最短でvue2.0のServer Side Renderingを試すまでのメモ


vue2.0でSSR(Server Side Rendering)ができるようになったので試してみました。
最短でSSRを実行する環境を整えて、最小のコードでSSRを実行するところまでの手順とコードです。

#必要環境

- nodejs 4.x 以降
- git

# 手順

## vue-cliでプロジェクトの作成

vue-cliというテンプレートからプロジェクトを作ってくれる便利な公式ツールが存在します。
既にvue2.0に対応しているので、vue2.0+webpackのテンプレートからプロジェクトを作ります。

```bash
npm install -g vue-cli
vue init webpack-simple-2.0 my-project
cd my-project
```

## dependenciesを編集してパッケージをインストール
vue2.0は現在alphaで頻繁にalphaのバージョンが上がっています。
最新のvueのバージョンに変更しておきます。

```json
"dependencies": {
  "vue": "^2.0.0-alpha.5"  // ここのバージョンを最新に変更(執筆時点でalpha.5)
},
```

パッケージをインストールします。

```bash
npm i
```

## 追加のパッケージをインストール

SSRに必要なパッケージを追加でインストールします。

```bash
npm install --save json-loader vue-server-renderer vue-template-compiler 
```

## webpack.config.js を編集

1. json-loaderを追加(loadersのところに追加します)
    
    ```
    {
      test: /\.json$/,
      loader: 'json'
    },
    ```
  
2. process.envにVUE_ENV="server"を追加
  
    ```
    module.exports.plugins = (module.exports.plugins || []).concat([
      new webpack.DefinePlugin({
        'process.env': {
          NODE_ENV: '"production"',
          VUE_ENV: '"server"'   // この行を追加
        }
    }),
    ```
    
## ソースコードを修正

SSRするコードに修正します。

```javascript:src/main.js
import Vue from 'vue'
import { createRenderer } from 'vue-server-renderer'
import compiler from 'vue-template-compiler'
const renderToString = createRenderer().renderToString

// レンダリングするテンプレートの作成
var App = {
  template: '<div>hoge</div>'
}

// ここでテンプレートがコンパイルされてrenderToString()でレンダリングできるようになる(仮想DOMにコンパイルされる)
const res = compiler.compileToFunctions(App.template, {})
Object.assign(App, res)

// レンダリング
var vue = new Vue(App)
renderToString(vue, (err,str) => {
  console.log(str)
})
```

## ビルドして実行

```bash
npm run build
node dist/bundle.js
```

#vue-loaderも一応使えた

vue-loaderを使うこともできました。

気をつけなければならないのが、vueファイルからstyleを消す必要があるということです。
styleが存在すると実行時にwindowオブジェクトを参照しようとしてエラーになります。
scriptはあっても動作しますが、SSRの時に何か意味を持たせることができるのか不明です。

```html:App.vue
<template>
  <div id="app">
    <h1>Hoge</h1>
  </div>
</template>
```

```javasciprt:src/main.js
import Vue from 'vue'
import App from './App.vue'
import createRenderer from 'vue-server-renderer'
const renderToString = createRenderer().renderToString

var vue = new Vue(App)
renderToString(vue, (err,str) => {
  console.log(str)
})
```

# 参考
 - https://github.com/vuejs/vue/tree/next/benchmarks/ssr
 - https://github.com/vuejs/vue/tree/next/src/server
 - https://github.com/vuejs/babel-plugin-transform-vue-jsx
swift:Arrayを使ってみた

Arrayを使ってみました。

```
let yasai: [String] = ["人参", "玉ねぎ", "きゅうり"]
print(yasai[1]) 

---結果
玉ねぎ
```
決まった値をいれるなら上記のような書き方になります(例として文字列型Arrayを宣言してます)。

宣言だけして追加していきたい場合。

```
var hogeArray: [Int] = []
```
これはInt型の数値をいれる宣言となります。
空かどうか調べるには

```
if hogeArray.isEmpty {
    //空だった場合の処理
}
```
追加したいときは下記のような方法で追加することが可能です。

```
hogeArray.append(100) 
hogeArray.append(200) 

//+=で追加もできます
hogeArray += [300, 400]
var addHoge:Int = 500
hogeArray += [addHoge]


print("0 \(hogeArray[0])")
print("4 \(hogeArray[4])")


---結果
0 100
4 500
```

要素を指定位置に挿入します。

```
print("1 \(hogeArray[1])")
hogeArray.insert(150, atIndex:1)
print("1 \(hogeArray[1])")
print("2 \(hogeArray[2])")

---結果
1 200  <-挿入前
1 150  <-挿入後
2 200  <-追加されてずれる

```

　
最大個数、初期値を設定します。

```
var hoge = Array(count: 3, repeatedValue: 100)
```
中身を変更したい場合、指定した範囲外だとエラーになりますが範囲内なら

```
hoge[1] = 150
```
と簡単に変更ができます。



例として

```
var hogeArray: [Int] = []
```
Intを指定してますが

```
var hogeArray: [Any] = []
```
とAnyにすると型が自由になり何でも入れることが可能となりますので、使用の際は扱いに注意が必要です。
長い文字列を省略するrailsのメソッド

truncateメソッドを使えば、

```show.html.erb
<%= user.profile.truncate(10) %>　　　#（）の中で表示したい数の上限を設定　これは１０文字制限
```

「こんにちは私はアメリカに住んでいます。」　　　19文字
　　　　　　　　　↑この表示が


「こんにちは私はアメリ...」　　　10文字
　　　　　　　　　　↑
この表示になります。
【Sublime Text3】Preferencesが選択できない時の解決法（Mac版）

#はじめに
以下の内容は特例で頻繁に発生する問題ではないかもしれませんが、議事録程度に投稿しました。


#起きた問題
Mac版のSublimeText3でショートカットキーの設定等を行う際にまずPreferencesを開くと思います。
このPreferencesがグレーになり選択できないという問題です。

#解決方法
##①　Finderを開き、移動を選択する。

![スクリーンショット 2016-06-20 2.21.38.png](https://qiita-image-store.s3.amazonaws.com/0/114391/4d6f8958-d21a-35ff-d871-7ad8e303efc9.png)

##②　①の状態のままoptionキーを押すとホームの下にライブラリが表示されるので選択する。

##③　ライブラリの中のApplication Support>Sublime Text 3>User>に[Default (OSX).sublime-keymap](https://drive.google.com/file/d/0ByXkcPhN2xzgUG1lQXYtUFBja0U/view "Default (OSX).sublime-keymap")というファイルを追加する
<img width="916" alt="スクリーンショット 2016-06-20 2.29.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/114391/425f9a48-ae1a-65dd-60ad-dc8bfe265959.png">

##④　SublimeTextを再起動　
これだけです。
もう一度Preferencesを確認してみて下さい。
#おわりに
この問題は私も何故起きたのか謎なのでよくわかりませんが、参考になると幸いです。
Macで標準出力にタイムスタンプを割りこませたい

ナウ :sunglasses: でヤング :triumph: な現代人 :briefcase: は時間にうるさい。
標準出力にタイムスタンプを割り込ませて、いろんなコマンドをナウ:sunglasses:でヤング:triumph:にしよう

#環境
OS X 10.11
zsh 
Homebrew 0.9.9 

大丈夫だと思うけどHomebrewってナンヤネンって方はこちらを

[Homebrewの導入手順](http://qiita.com/dhun/items/74eb0cc2c496919ee76f)

#経緯 (興味ない方はパス :cyclone: )


linuxではstdbufコマンドで標準出力に割り込ませることが出来るらしい。
[stdbufコマンドを使用してコマンドの標準出力にタイムスタンプを追加](http://qiita.com/yyamamot/items/60a0a007b0016da61b32)

### Macでも出来るのか…？

```zsh:~/
ping 8.8.8.8 | stdbuf -oL gawk '{print strftime("[%a %b %e %H:%M:%S %Z %Y] "), $0; }'
-----
zsh: command not found: stdbuf
```

...
どうやら出来ない。stdbufが入ってないそうな。
brew install stdbufでは入らず。

どうやらMacではstdbufそのものは使えないらしい。代替品のgstdbufが使えるそうな。
[macで使いにくいコマンドをLinuxに合わせる]
(http://qiita.com/toyama0919/items/661437d86a95b02484a2)

### と、言うわけで
やってみよう。


# 方法
##　準備
```zsh:~/
brew install coreutils
brew install gnu-sed
brew install gawk
```
gstdbufが使えるようになった。

## サンプル

```zsh:~/
ping 8.8.8.8 | gstdbuf -oL gawk '{print strftime("[%a %b %e %H:%M:%S %Z %Y] "), $0; }'

月  6 20 02:18:16 JST 2016]  PING 8.8.8.8 (8.8.8.8): 56 data bytes
[月  6 20 02:18:16 JST 2016]  64 bytes from 8.8.8.8: icmp_seq=0 ttl=52 time=5.284 ms
[月  6 20 02:18:17 JST 2016]  64 bytes from 8.8.8.8: icmp_seq=1 ttl=52 time=4.061 ms
[月  6 20 02:18:18 JST 2016]  64 bytes from 8.8.8.8: icmp_seq=2 ttl=52 time=4.153 ms
```


strftimeはCのそれと大体一緒らしい。
[Man page of STRFTIME](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/strftime.3.html)を参考にして

```
[%a %b %e %H:%M:%S %Z %Y] 
```

の中を適当にいじれば表示させる項目を変える事ができる。
やったぜ

## 追記
gawk単体でも同じことが出来るそうです。（KazBondさんありがとうございます）

```zsh:~/
ping 8.8.8.8 | gawk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0 }{fflush()}'
```

gawkもデフォルトで入ってるかどうか失念してしまったので、出来なかったら

```zsh:~/
brew install gawk
```

しましょう。

#参考
[stdbufコマンドを使用してコマンドの標準出力にタイムスタンプを追加](http://qiita.com/yyamamot/items/60a0a007b0016da61b32)
[macで使いにくいコマンドをLinuxに合わせる]
(http://qiita.com/toyama0919/items/661437d86a95b02484a2)
[Man page of STRFTIME](https://linuxjm.osdn.jp/html/LDP_man-pages/man3/strftime.3.html)
EmbulkをJavaに組み込んで実行する

こちらのIssueで紹介されている通りです。
https://github.com/embulk/embulk/issues/421
（Issueだとあんまり気付かれないので、Issueと内容は同じですが、qiitaでのシェアを目的としてます。）

`EmbulkEmbed`というクラスを呼び出して、下記にようにすればJavaからEmbulkを実行できます。

EmbulkのJarは`https://dl.bintray.com/embulk/maven/`とかから最新版をダウンロードすると良いと思います。

```
import java.io.File;
import org.embulk.EmbulkEmbed;
import org.embulk.EmbulkEmbed.Bootstrap;
import org.embulk.config.ConfigLoader;
import org.embulk.config.ConfigSource;

public class EmbulkEmbedTest {
    public static void main(String[] args) throws Exception {
        Bootstrap bootstrap = new EmbulkEmbed.Bootstrap();
        EmbulkEmbed embulk = bootstrap.initializeCloseable();
        try {
            ConfigLoader loader = embulk.newConfigLoader();
            ConfigSource source = loader.fromYamlFile(new File(args[0]));
            embulk.run(source);
        } finally {
            embulk.destroy();
        }
    }
}
```

注意点としては、EmbulkのPluginがJRubyを使うため、それを参照させるように必要があります。すでに`embulk gem install ...`でPluginをインストールしている場合には、下記のようにライブラリがインストールされているので参照すると良いかと思います。

```name:Linux/OSX/*BSD
export GEM_HOME=/user/.embulk/jruby/2.2.0
```

ただ、Embulkはあんまり外部プログラムに組み込むことは想定していないので、Javaからシェルを呼び出して実行したほうが良いかもしれない、みたいです。
参考までに。
Reactでkeyframes propertyを使ったアニメーション

はじめに
---
最近いろいろなところでのReactの活用事例が増えてきています。Facebook、Instagramはもちろん、TwitterのモバイルviewもReactが使われています。
SPAを構築していくときに、必要になるのがアニメーションだと思っています。ユーザに対してしっかりとしたフィードバックがないと、何が起こったかがわかりづらいですよね。そこで、必要になるのがCSSのkeyframes propertyです。

そもそも、ReactでのCSSはいろいろ手法があると思います。世界中の素晴らしいエンジニアたちはいろいろなNPMモジュールを作成しています。[CSS Modules](https://github.com/gajus/react-css-modules)や[Radium](https://github.com/FormidableLabs/radium)、[keyframesのためのReact Component](https://github.com/zeit/react-keyframes)を作っていたりします。

しかし、僕自身あまりCSSをシュッと構築できないので、CSSのファイルを用意してなんとかするタイプのものはあまりうまく使えないのです。しかも、ReactにはもともとInline Styleが用意されているので、それを存分に使った方が、いいのではないかと考えました。(ただし、CSSを綺麗に書ける方はCSS使った方が良さそうです。)

方法
---
単純です。[CSSStyleSheet interface](https://developer.mozilla.org/ja/docs/Web/API/CSSStyleSheet)というWebAPIを利用します。
方針としては、`<style>`タグのDOMを作って、`<head>`要素の中に作ったDOMを追加します。そうすると追加した`<style>`タグの`sheet`というプロパティにCSSStyleSheetのインスタンスが入ります。そして`CSSStyleSheet#insertRule(rule, index)`というメソッドを使って、keyframes propertyを定義してあげるという方法です。

例えば下記のような関数を定義してあげます。

```js:injectStyle.js
const injectStyle = (style) => {
  const styleElement = document.createElement('style');
  let styleSheet = null;

  document.head.appendChild(styleElement);

  styleSheet = styleElement.sheet;

  styleSheet.insertRule(style, styleSheet.cssRules.length);
};

export default injectStyle;
```

そして、以下のようなComponentを作成します。

```js:SampleComponent.js
import React from 'react';
import injectStyle from './path/to/injectStyle';

export default class SampleComponent extends React.Component {
  constructor(props) {
    super(props);
    
    const keyframesStyle = `
      @-webkit-keyframes pulse {
        0%   { background-color: #fecd6d; }
        25%  { background-color: #ef7b88; }
        50%  { background-color: #acdacf; }
        75%  { background-color: #87c3db; }
        100% { background-color: #fecd6d; }
      }
    `;
    injectStyle(keyframesStyle);
    
    this.state.style = {
      container: {
        WebkitAnimation: 'pulse 10s linear infinite',
      },
      title: {
        fontSize: '2rem',
      },
    }
  }

  render() {
    const { style } = this.state;
    
    return (
      <div style={style.container}>
        <h3 style={style.title}>Hello world using React!</h3>
      </div>
    );
  }
}
```

上記のようにすることで、Inline Styleを利用しながら、あまり方法がなかったkeyframes propertyを定義してアニメーションすることができます。

![screencast 2016-06-20 01-22-04.gif](https://qiita-image-store.s3.amazonaws.com/0/55247/d83afe75-8d27-19a5-36a2-6ba35662c053.gif)

まとめ
---
試しに動かす分には十分な方法だと思いますが、おそらく大きなプロジェクトで使う場合には採用しない方がいいかもしれない方法です。そもそも[CSS in JS](https://speakerdeck.com/vjeux/react-css-in-js)という方法はあまり利用されていないのかもしれません。僕が知る限り、ほとんどのReactのプロジェクトではスタイルはCSSで定義して、CSS Modulesで適用することがほとんどだと思います。
僕が知っているCSS in JSを採用している大きなプロジェクトは、[Material-UI](https://github.com/callemall/material-ui)というGoogleのマテリアルデザインをReactで実装したプロジェクトくらいです。

ただ、自分の中では結構Inline Styleが気に入っているので、できる方法がないか探してみた次第です。

このエントリのサンプルコードのGist https://gist.github.com/yamadayuki/f1ea9ccacad7f1c140457b5877fb54cc
新しくなるAppleの定期購読 - Introducing Expanded Subscriptions in iTunes Connect


# 概要
WWDC 2016の [Introducing Expanded Subscriptions in iTunes Connect](https://developer.apple.com/videos/play/wwdc2016/301/) のまとめ。
新しくなる課金の仕組みについての話。技術的な実装の話ではなく、定期購読の仕様変更について。

※記事内の図は [Introducing Expanded Subscriptions in iTunes Connect](https://developer.apple.com/videos/play/wwdc2016/301/) から引用。

# 動画
[Introducing Expanded Subscriptions in iTunes Connect](https://developer.apple.com/videos/play/wwdc2016/301/)
動画ファイルをダウンロードしたり、プレゼンのPDFもダウンロードできる。

# セッションの内容
## In-App Purchaseとは何か

|タイプ|例|
|:--|:--|
|Consumable (消耗型)|LINEのコイン、　AngryBirdなどゲームの消耗型アイテム|
|Non-consumable (非消耗型)|クロッシーロードのアバター|
|Non-renewable subscriptions (非自動更新購読)|非ゲームアプリの機能解放などのプレミアムサービス<br />Quizletのプレミアムサービス1年14.99ドル|
|Auto-renewalbe subscriptions (自動更新購読)|雑誌やテレビ局アプリの定期購読。HBO Nowの動画サービス1月14.99ドル|
|Free subscriptions (無料定期購読)|Newsstand向け|

### Free subscriptions
**2016年秋から非推奨になる。**
すでに使っている人は継続して販売できるが、新しくFree subscriptionは使えない。

## Auto-renewable subscriptions
### 収益
開発者の収入が売上の70%→**85%に変更**。ただし、アプリリリース後1年以降。
すでに1年以上自動継続課金を続けているアプリであれば、**今週から**売上の85%受け取れる。

### カテゴリー
現在、Auto-renewable Subscriptionで提供できるの商品は、雑誌やビデオなど定期的にコンテンツが更新されるようなサービスに限定されている。
2016年秋から、このような**カテゴリー制限はなくなる**。

### 定期購読管理
AppStoreアプリの管理ページで表示されるいくつかの内容をiTunes Connectでカスタマイズできる。
- アプリアイコン (App Icon)
- アプリ名 (App Name)
- 定期購読グループ名 (Subscription Group Name)
- 商品名 (In-App Purchase Name)
- 購読期間 (Duration)
![スクリーンショット 2016-06-20 0.52.18.png](https://qiita-image-store.s3.amazonaws.com/0/11454/9c81ae73-65bc-70a1-edd9-cb4d6e4893c6.png "スクリーンショット 2016-06-20 0.52.18.png")


### 定期購読グループ
#### 現在 (例)
|レベル|期間|
|:--|:--|
|定期購読|1週間 / 1ヶ月 / 1年|

#### 2016年秋〜 (例)
|レベル|期間|
|:--|:--|
|プラチナ|1週間 / 1ヶ月|
|ゴールド|1週間 / 1ヶ月|
|シルバー|1週間 / 1ヶ月|

開発者は上記のように定期購読グループに複数の商品を内包することができる。
ユーザーは一度定期購読した商品について同じ定期購読グループ内であれば、自由に変更することができる。
![スクリーンショット 2016-06-20 0.56.24.png](https://qiita-image-store.s3.amazonaws.com/0/11454/593bfad3-9555-0c80-c692-904e1eca0dd0.png "スクリーンショット 2016-06-20 0.56.24.png")


### Territory Pricing

#### 現在
すべての国に対して、同じTierしか選択できない。

#### 2016年秋〜
国ごとに自由にTierを変更できる。
![スクリーンショット 2016-06-20 1.00.42.png](https://qiita-image-store.s3.amazonaws.com/0/11454/945828d5-c18c-e664-c3fc-c0392753ccdd.png "スクリーンショット 2016-06-20 1.00.42.png")


### カスタマーリテンション
#### 現在
Appleから値上げを通知するメールが送信される。
ユーザーはAppStoreに行き、自分で定期購読を続ける操作をしなくてはいけない。

#### 2016年秋〜
値上げの通知はメールだけでなく、AppStoreアプリへのPUSH通知で連絡することができる。
既に購入しているユーザーに対しても値上げするかどうかは選択できる。

240円に値上げするが、アーリーアダプターには120円のまま提供することができる。
(珍しくスライドに日本が取り上げられている)
![スクリーンショット 2016-06-20 1.05.49.png](https://qiita-image-store.s3.amazonaws.com/0/11454/c7fc3ca2-053d-214e-cd7b-7eaa1cc898f3.png "スクリーンショット 2016-06-20 1.05.49.png")

# まとめ
2016年秋から
- Free subscriptionsが非推奨になる。
- Auto-renewable subscriptionsの収益が、アプリリリース1年後から70→85%になる。
	- すでにリリース後1年の開発者には今週から。
- Auto-renewable subscription を販売できるカテゴリの制限がなくなる
- 国ごとに自由な価格設定ができる。
- 値上げの方法が柔軟になる。

より詳しい情報はセッションの動画を見てみてください。新しくなるiTunes Connectのデモも見れます。

# リンク
- [Introducing Expanded Subscriptions in iTunes Connect](https://developer.apple.com/videos/play/wwdc2016/301/)
SAS: Draw the lines for titles and header.

 The following program shows the options for the borderline around the header title and column header.

```odsrtf_sample

dm "clear log" ;
dm "clear output" ;

proc datasets lib = work kill nolist;
quit;

proc template;
    define style styles.custom;
	parent = styles.rtf;
	replace table from output /
	frame = below
	rules = rows
	cellpadding = 3pt
	cellspacing = 0pt
	borderwidth = 1pt;
    end;
run;

/*Output all setting for the style*/
proc template;
  source styles.custom;
run;

data work.class ;
   set sashelp.class ;
run;

ods _all_ close ;

ods results off ;

ods verify off ;

ods escapechar = "^" ;

title1 j = L "First Line of the Title" ;

title2 j = l "Page ^{thispage}  of ^{lastpage}" ;

ods noptitle ;

ods proclabel "test";

options orientation = portrait nodate nonumber ;

ods rtf file = ".\class.rtf" style = custom nocontents;

/*proc print data = work.class ;*/
/*run;*/

proc report data = work.class nowd;
    column ("title pre" ("title1 ^n title2" name sex age weight height)) ;
	define name/display ;
	define sex/display ;
    define age/display ;
	define weight/display ;
	define height/display ;
run;

ods rtf close ;

ods results on ;

ods listing ;

```
シンプルすぎるWebBrowserを作ってみる（ReactiveCocoaを使って）



![20160620.gif](https://qiita-image-store.s3.amazonaws.com/0/40693/1217d630-30f2-f926-bfa0-59e7080c72e6.gif "20160620.gif")


ReactiveCocoaを理解しようとすると、ジェネリクスやクロージャーといったSwift的には基本なところをしっかりと理解しておく必要があるみたいで、そこの知識があいまいだと正直どう動かせば良いのかさっぱりわかりません。

今回のも単に、テキストフィールドの文字列をエンターキーを押されたらViewModelに送り、ViewControllerはURLに変換されたそれをもってブラウザに表示する・・・というものです。
ただし、文字列は５文字以上ないとURLに変換しないという縛りを入れました。これは本当は文字数ではなくURLの体裁を整えているかを調べるべきなんですが、とりあえず制限をつけてみたかったので、簡単なものにしました。

```ViewController

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        self.urlField.delegate = self
        self.myWebView.delegate = self
        
        vm.action!.values.observeNext { value in
            print(value.absoluteString)
            self.myWebView.loadRequest(NSURLRequest(URL: value))
        }
        
        
        let a = self.urlField.rac_signalForControlEvents(.EditingDidEndOnExit)
            .toSignalProducer()
            .flatMapError{
                error in return SignalProducer<AnyObject?, NoError>.empty
            }
            .map { value -> String in
                 self.urlField.text!
        }
        vm.urlText <~ a
        
        cocoaAction = CocoaAction(vm.action, input: self.urlField.text!)
        urlField.addTarget(cocoaAction, action: CocoaAction.selector, forControlEvents: .EditingDidEndOnExit)
        
    }
```

```ViewModel

    var urlText : MutableProperty<String> = MutableProperty("")
    var action : Action<String, NSURL, NSError>!
    var validation: MutableProperty<Bool>!
    
    override init() {
        super.init()
        
        validation = MutableProperty(false)
        
        urlText.producer.startWithNext { value in
            if(value.characters.count > 5){
                print("true")
                self.validation <~ MutableProperty(true)
            }
        }
        
        action = Action(enabledIf: validation) { value in
            return SignalProducer { (observer, disposable) in
                print("action: " + self.urlText.value)
                observer.sendNext(NSURL(string: self.urlText.value)!)
                observer.sendCompleted()
            }
        }
        
    }

```

なんかもっとスマートな書き方があると思うのですが、分からなかったので、とりあえずここまでで一旦あげます。
ソースはまたgithubにあげてます。

[WebBrowserRCSample](https://github.com/rnsm504/WebBrowserRCSample)


##### 以下単なる蛇足
フィールドの文字列をNSURLに変換する程度ならViewController内でやった方が早いのですが、それってMVVMの考え方的にアウト？セーフ？
Swiftの構造体(struct)のメンバ変数を更新する際の挙動

お恥ずかしながら構造体(struct)の挙動を把握できていなかったので備忘録です

プロパティ監視(didSet)を使って、下記のようなコードを書いたりすることってないですか？

```swift
struct NameData {
    var firstName: String
    var lastName: String
    var nickName: String
}

class ViewController: UITableViewController {
    var nameData: NameData? {
        didSet {
            tableView.reloadData()
        }
    }

    func fetchData() {
        //通信処理でデータを取得してプロパティに代入
　　　　　　　　　　　　　　　　model.getNameData { [weak self] (data: NameData) in
            self?.nameData = data
        }
    }

}

```

これは、通信処理から取得したNameData型の値をnameDataプロパティに代入することで、プロパティ監視が走ります
（nameDataプロパティの書き換わりをトリガーとして、`tableView.reloadData()`を実行するようにしてます）

nameDataを書き換えた後に、わざわざ次の行で`tableView.reloadData()`を呼ばなくて済むというメリットがあります

先日、このコードに下記のような更新処理を追加しました

```swift
//更新処理
func updateNameData() {
    nameData.firstName = "first"
    nameData.lastName = "last"
    nameData.nickName = "nick"
}
```

その際に同僚に 「これ、`updateNameData()`メソッド呼んだだけで３回`tableView.reloadData()`走りません？」 という指摘をもらいました

そんな馬鹿なと思ったのですが、調査してみると構造体のメンバを書き換えただけでもプロパティ監視が走っていました

この挙動を把握しておらず、むやみに`tableView.reloadData()`を走らせていたということが発覚しました・・

プロパティ監視で`tableView.reloadData()`だけでなく、他の処理を書いていたら、その処理まで実行させてしまっていたのかと思うと怖くなりました


公式のドキュメントでも、[Modifying Value Types from Within Instance Methods](https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Methods.html)のところに、そのような挙動になるというような感じのこと？が書いてありました

The method can then mutate (that is, change) its properties from within the method, and any changes that it makes are written back to the original structure when the method ends. The method can also assign a completely new instance to its implicit self property, and this new instance will replace the existing one when the method ends.


struct内でmutatingキーワードを使ってメソッドで値を書き換えても同じ挙動になるようです

当然ですが、もちろんNameDataがクラスの場合は、このような挙動になりません
プロパティ？フィールド？メンバー？C#のクラス構造のおさらい

# 概要
C#のクラス構成要素。プロパティだったり、フィールドだったりどれがどれだかわからなくなってきたのでまとめます。
バージョン毎に使える書き方もあるようなので、それも補足情報としてのっけます。


# 本題
## サンプル

```csharp

public class Person {
    public string Name { get; set; }

    private double _weight; // 1. フィールド
    public double Weight{ // 3. プロパティ
        get { return _weight; }
        set {
            if (value > 0)
                _weight = value;
        }
    }
    
    private double _height;
    public double Height {
        get { return _height; }
        set {
            if (value > 50)
                _height = value;
    }

    public DateTime Birthday { get; set; }

    public Person(string name, DateTime birthday) { // 4. コンストラクタ
        Name = name;
        Birthday = birthday;
    }

    public double GetBmi() { // 2. メソッド
        double mh = Height / 100.0;
        return Weight / (mh * mh);
    }
}
    
```
## 1. フィールド
* オブジェクト指向について「クラスは、データと振る舞いをカプセル化したものである」と説明されるときの「データ」の部分です。
* オブジェクトが持つデータをフィールドとして定義します。
* フィールドはクラスの**メンバ**（クラスなど、型を構成する内部要素の総称）として宣言された変数で、インスタンスと直接結び付けられます。
* メンバ変数とも呼ばれます。
* フィールドはインスタンスからアクセスします。
* 非公開にし、プロパティで操作するのが原則です。
* フィールドと3.プロパティの混乱を避けるためにアンダースコア（_）をつけて定義することがあります。

## 2. メソッド
* オブジェクト指向について「クラスは、データと振る舞いをカプセル化したものである」と説明されるときの「振る舞い」の部分です。
* メソッドは、一連のステートメントが含まれているコードブロックです。 
* 必要なメソッド引数を指定してプログラムからメソッドを呼び出すと、メソッド内のステートメントが実行されます。
* **Mainメソッド**は、すべての C#アプリケーションのエントリ ポイントです。プログラムが開始されると、このメソッドが共通言語ランタイム (CLR) によって呼び出されます。

## 3. プロパティ
* オブジェクト内にあるフィールドの値を取得、または設定するための手段です。
* クラス外部から見るとメンバー変数のように振る舞い、 クラス内部から見るとメソッドのように振舞います。
* メンバー変数の値の取得・変更を行うためのメソッドのことを**アクセサー**(accessor)といいます。
* setterに渡す値にはsetter内からvalueという変数でアクセスできます。

### C#3.0
* プロパティのset/getの中身を省略できるようになりました。この機能を自動プロパティといいます。
サンプルの ```public string Name { get; set; }```は

```csharp
private string _name;
public string Name
{
  get { return _name; }
  set { _name = value; }
}
```
と同意です。

### C#6.0
* 自動プロパティ初期化子を与えて、初期値指定ができるようになりました。 

```public string Name { get; set; } = "Nyanchu"```

以下と同意です。

```csharp

private string _name = "Nyanchu";

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }
```

## 4. コンストラクタ
* クラスのインスタンスが生成されるときに自動的に呼び出され、初期化を実行します。
* 明示的に定義しない場合は引数を持たないコンストラクタ（デフォルト・コンストラクタ）が自動的に定義され、呼び出されます。
* サンプルのように引数付きのコンストラクタを定義する（コンストラクタのオーバーロード）と、デフォルト・コンストラクタを使ってインスタンスを生成することができなくなります。

# 参考
* [『C#プログラミング入門』](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80%E2%80%95%E3%80%8C%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%80%8D%E3%81%AE%E3%80%8C%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E6%89%8B%E6%B3%95%E3%80%8D%E3%82%92%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E8%A7%A3%E8%AA%AC-I%E3%83%BBO-BOOKS-%E5%87%BA%E4%BA%95-%E7%A7%80%E8%A1%8C/dp/4777515982/ref=sr_1_2?ie=UTF8&qid=1466349829&sr=8-2&keywords=C%23%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%85%A5%E9%96%80)
* [フィールド](http://www.wisdomsoft.jp/171.html)
* [メソッド (C# プログラミング ガイド)](https://msdn.microsoft.com/ja-jp/library/ms173114.aspx)
* [プロパティ](http://ufcpp.net/study/csharp/oo_property.html)
WindowsのDocker Quickstart Terminalで"vboxmanage.exe"が見つからないエラーになる

## 背景
Dockerに初めて手を出してみようと、[Docker for Windows のインストール](http://docs.docker.jp/windows/step_one.html) を参考にインストール。手順に従って Docker Quickstart Terminal を起動するも下記エラーに遭遇して先に進まなくなったので調べた。

```bash
Looks like something went wrong in step ´Looking for vboxmanage.exe´... Press any key to continue...
```

## VirtualBoxのパスが通っていない？
エラーメッセージからは、VBoxのコマンドが見つからない、と言われているように見える。なんか嘘くさいので、Docker Quickstart Terminal起動時に実行されている`start.sh`（`C:\Program Files\Docker Toolbox\start.sh`）をデバッグする。

```
+ trap '[ "$?" -eq 0 ] || read -p "Looks like something went wrong in step ´$STEP´... Press any key to continue..."' EXIT
+ VM=default
+ DOCKER_MACHINE=./docker-machine.exe
+ STEP='Looking for vboxmanage.exe'
+ '[' '!' -z 'C:\Program Files\Oracle\VirtualBox\' ']'
+ VBOXMANAGE='C:\Program Files\Oracle\VirtualBox\VBoxManage.exe'
+ BLUE='\033[1;34m'
+ GREEN='\033[0;32m'
+ NC='\033[0m'
+ '[' '!' -f ./docker-machine.exe ']'
+ echo 'Docker Machine is not installed. Please re-run the Toolbox Installer and try again.'
Docker Machine is not installed. Please re-run the Toolbox Installer and try again.
+ exit 1
++ '[' 1 = 1 ']'
++ '[' -x /usr/bin/clear ']'
++ /usr/bin/clear

+ '[' 1 -eq 0 ']'
+ read -p 'Looks like something went wrong in step ´Looking for vboxmanage.exe´... Press any key to continue...'
Looks like something went wrong in step ´Looking for vboxmanage.exe´... Press any key to continue...
```

`Docker Machine is not installed` というメッセージが出力されている。
原因はVBoxではなく、`docker-machine.exe`が見つからないこと。
途中でメッセージがclearされて見えなくなっていただけなので、わざわざデバッグしなくてもエラー画面で上にスクロールすればメッセージは見えたっぽい。

## 原因
`docker-machine.exe`のパスが`start.sh`最初の方で下記のように相対パスで指定されていることと、自分の環境（`.bashrc`）が原因。

```
DOCKER_MACHINE=./docker-machine.exe
```

これはDocker Quickstart Terminalを実行したときのカレントディレクトリが、`C:\Program Files\Docker Toolbox\`だという前提になっている。
自分の場合`.bashrc`でディレクトリを移動しているので、sh実行時に上記exeが見つからず問題が起きていた。

## 対応方法
下記いずれかで対応。

#### 1. `.bashrc`で`cd`しないようにする
#### 2. `start.sh`を書き換える [^1]
`start.sh`の中で、期待されるディレクトリに移動させる（shの最初の方に下記を追記する）

```
cd /c/Program\ Files/Docker\ Toolbox
```
#### 3. Docker Quickstart Terminalを使わない

[Docker for Windows のインストール](http://docs.docker.jp/windows/step_one.html) の手順を読んでいくとこのTerminalを利用する前提になっているが、似たような内容が書いてある[Windows](http://docs.docker.jp/engine/installation/windows.html) のページの手順だと、他のShellから利用する方法も記載されている。
なんだgit-bashでよかったじゃん、っていう。

## 補足
[^1]: 環境によっては、`start.sh`を編集する権限がないと言われる場合があるので、「ファイルを右クリック→プロパティ→セキュリティ→編集」で権限をつける
ufo -> python (2)

##名前空間

対象年月とエントリーを指定してデータは取れるようにしたけども、
各xbrlに含まれるデータの種類がわからない

そもそもどんだけデータの定義があってどうなってるのかさっぱりわからない
のでそこらへんを調べた。
※対象銘柄は証券コード：6866の日置電機株式会社（UfoCatcherのサンプルのデフォルト銘柄をそのまま）

EDINETのトップページや、金融庁の検索用ページからxbrlに関する資料がアップされている
が何が何やらさっぱりわからない。
http://disclosure.edinet-fsa.go.jp/
http://www.fsa.go.jp/search/


色々検索して、やっと報告書の項目がどのタクソノミで定義されているかわかる資料を見つけた
http://www.fsa.go.jp/search/20130118/03_b2.pdf

タクソノミで検索するとタクソノミの詳細が見つかる
http://www.fsa.go.jp/search/20120625/02_j2.csv

対象の報告書のタクソノミから欲しい項目を探す
例えば有価証券報告書の発行済み株式総数なら
→「TotalNumberOfIssuedSharesSummaryOfBusinessResults」

※2014年より前のxbrlデータの場合はIFRSタクソノミという業種別に定義されたタクソノミでxbrlが作られていたりするため、
テキストで書かれたデータから取り出す必要があったり無かったりで面倒臭い

各年度の有価証券報告書
2010年：http://resource.ufocatch.com/xbrl/edinet/ED2011022800218/S0007WF8/jpfr-asr-E01999-000-2010-12-31-01-2011-02-28.xbrl
2013年：http://resource.ufocatch.com/xbrl/edinet/ED2010030100130/S0005ASQ/jpfr-asr-E01999-000-2009-12-31-01-2010-03-01.xbrl
2014年：http://resource.ufocatch.com/xbrl/edinet/ED2015022700311/PublicDoc/jpcrp030000-asr-001_E01999-000_2014-12-31_01_2015-02-27.xbrl
2015年：http://resource.ufocatch.com/xbrl/edinet/ED2016022900227/PublicDoc/jpcrp030000-asr-001_E01999-000_2015-12-31_01_2016-02-29.xbrl

xbrlへのリンクを見ても2013年より前はIFRSタクソノミで作られてるように見え、2014年からは内閣府令タクソノミ
で作られているように見える。
IFRSタクソノミは抽出し辛いので大変有り難い。

##追記

さて参った、やっぱりIFRSタクソノミも抽出したい。
中々面倒なので別にメモすることに
leJOS EV3で光センサーの値によるイベント処理

光センサーの値が0～0.4の場合にイベントが発生する
lejos 0.9.1-beta の環境で開発

```LightDetectorSample.java
import lejos.hardware.Button;
import lejos.hardware.port.SensorPort;
import lejos.hardware.sensor.EV3ColorSensor;
import lejos.hardware.sensor.SensorMode;
import lejos.robotics.RangeFinder;
import lejos.robotics.RangeFinderAdapter;
import lejos.robotics.objectdetection.Feature;
import lejos.robotics.objectdetection.FeatureDetector;
import lejos.robotics.objectdetection.FeatureListener;
import lejos.robotics.objectdetection.RangeFeatureDetector;

public class LightDetectorSample {

	public static void main(String[] args) {
		EV3ColorSensor lightSensor = new EV3ColorSensor(SensorPort.S2);
		SensorMode light = lightSensor.getRedMode();  // 赤色LEDの反射光を読み取るセンサーモードを取得
		RangeFinder rangeFinder = new RangeFinderAdapter(light); // 光センサーの値を読み取りやすくする
		
		// 光センサーの値が0～0.4の時にイベントを発生させる、読み取り周期は20ms
		RangeFeatureDetector lowerDetector = new RangeFeatureDetector(rangeFinder, 0.4f, 20);
		lowerDetector.addListener(new LowerLightProcess());  // イベントが発生した時に呼び出されるインスタンスを設定
		
		Button.waitForAnyPress();  // 何かボタンが押されるまで待つ
	}

}

class LowerLightProcess implements FeatureListener {

	// イベントが発生した時に呼び出されるメソッド
	public void featureDetected(Feature feature, FeatureDetector detector) {
		System.out.println("DETECT " + feature.getRangeReading().getRange());
	}
	
}
```
RPGのバトル画面を作ろう（３）

更新が遅れましたが、キチンと生存しております。
キチンと生存しております（大事なことなので二回！）

---

# お詫び

さて、前回の設計で一つ謝らなければならないことがありました。
それは、Threadクラスの使用についてです。

前回作ったアレですが、ゲーム的にちょっと残念な仕様になっていた点がありました。
それは、プロセスが「**ゲーム的に**」宜しくなかったという点です。

# ゲーム的な仕様の大切さ

まずゲームをプレイする人の視点に立ってみましょう。

ゲームをプレイしていると、
現実世界の訪問者によるインターフォンや、急にお花を摘みたくなったりと
きっとVRになっても割と起こるあるあるな横槍が入ることあるかと思います。

このとき、前回の設計（Threaクラス）で作成していた場合、どのようになるのでしょうか？

## Threadの罠

端末をスマホにして動かしたと仮定しましょう。

あなたは心地よくゲームをしていました。
バトル中です。長いラストダンジョンのセーブ手前です。

しかしここで、友人の魔の手（？）により合コンの誘いの電話が来ます。
もちろん、電話にでますよね？デマスヨネ？

数分の会話の後、あなたは約束を取り付けて、意気揚々と電話を切ります。

そしてゲームのプロセスに戻してみたところ...

そこには、「**おぉ、死んでしまうとは情けない**」の文字が！？

そう、これこそがThreadクラスの罠なのです。

## プロセスが異なるということ

Threadクラスは、簡単に言うと「平行世界を作って、面倒な処理をそっちでやってもらう」という処理です。
そのため、「メインプロセスがポーズ状態にあっても、関係なく動き続ける」ということになります。
ということは「描画しなくても戦闘は進行している」ということと同義なのです。

ハードがある程度固定化されていればこの辺の制御は難しくないのですが、
近年のスマホなどに対応する場合は、描画とプロセスの関係性をキチンと意識してあげないと後で厳しいことになるかもしれません。

ということで、Threadクラスでタイムテーブルを監視するとメインプロセスに依存しなくなるので**却下します**

## 別記：Threadクラスの使い道

通常に作っている分にはそうそうないところですが、企業なのでしっかりとサーバーを用意してあるオンラインゲームの場合に限って、
外部アセットや特定のスクリプトをサーバーからDLさせるように仕向けることもできます。

ただし、前回述べた通り、ThreadクラスではUnityEngineを使用することができません。
そのため、デフォルトのC#でダウンロードを管理する必要があります。
時間があったら個人でも今度作ってみようかと...

## 設計ミスによる現在の被害状況

この段階で気づけたことが幸いです。（あとで気づいたらほぼ作り直しになっていました...＾＾；）
※厳密に言うと、Threadクラスをそのまま使用しても作ることは可能です。
　しかし、ちゃんとプロセス監視をしてゴニョゴニョするとできるのですが、Coroutineで管理したほうがUnity使ってる感じがしてわかりやすいのです。

# タイムテーブル作り直し

ということで、タイムテーブル管理システムをUnityEngineで作り直しました。
ついでにuGUIのSliderを使用してゲージも作ってみました。

![RPGのバトル画面を作ろう（３）_01.png](https://qiita-image-store.s3.amazonaws.com/0/80680/5f1e7b1d-0c3f-f89b-616b-be44328c2cc1.png)
※時間がなくて動画が取れてないのですが、後日編集します。

味方4人はシーンの初期化完了時からタイムテーブルに「入力前処理」として待機時間を指定。
指定した時間をTime.deltaTimeで監視しつつ、累積時間が待機時間（Sec）を上回ったらコマンドウィンドウを表示させるようにしました。
なお、コマンドを入力したらコマンドウィンドウは随時非表示にしていきます。
※Time.deltaTimeで管理している理由は、Unityウィンドウが非アクティブ状態になった時にフレーム描画が停止するので、その間の時間軸の差し引きを計算しなくて良くなるからです。
　Time.deltaTime：観測フレームからひとつ前のフレームを描画した経過時間。**Updateメソッド内で使用することで、メインスレッドでの監視**になる。
文字の連続する数を使って基本的な文字列圧縮を行うメソッドを実装してください


###Chapter1 1.5

計算量O(n)のつもり

```ruby:compress.rb
class String
  def compress
    temp_v = ""
    temp_arr = []
    count = 1
    for s in 0..self.length
      if s == 0
        temp_v = self[s]
        next
      else
        if temp_v == self[s]
          count += 1
        else
          temp_arr << temp_v + count.to_s
          temp_v = self[s]
          count = 1
        end
      end
    end

    if temp_arr.join.length == self.length
      self
    else
      temp_arr.join
    end
  end
end

str = "abbabcccccaaa"
puts str.compress
```
pythonでtwitterのつぶやき内に含まれるURLをクロールする

# 概要
- ある指定したtwitterアカウントのつぶやき内にあるURLを取得
- そのURLに特定の文字列を付与したページから、指定した情報をスクレイビングする
- スクレイビングした情報をpostgresに保存する
- すでに保存しているデータにぶつかったらクロールを止める
- BeautifulSoupを利用

# 詳細

``` crawl.py
# -*- coding: utf-8 -*-
try:
    # Python 3
    from urllib import request
except ImportError:
    # Python 2
    import urllib2 as request

from bs4 import BeautifulSoup

import twpy
import time

#postgresql接続
import psycopg2

def main():
    #ツイートデータを読み込む
    api = twpy.api
    tweets = api.user_timeline(screen_name = "あるtwitterアカウントのID")

    connector = psycopg2.connect(host="hoge",port=5432,dbname="hogehoge",user="hoge",password="hoge")
    max_hoge_id_fetcher = connector.cursor()
    cursor = connector.cursor()

    max_hoge_id_fetcher.execute('select MAX(hoge_id) from hoge')

    #DBに保存済みの最新のhoge_idを取得
    for row in max_hoge_id_fetcher:
        max_hoge_id = row[0]
        print("保存済みの最新IDは"+str(hoge_id))

    #ツイートを1件ずつ読み込み、URLをクロールしていく
    for tweet in tweets:
        text = tweet.text
        url = tweet.entities['urls']
        expanded_url = url[0]['expanded_url']
        
        #今回、crawl先は特定の文字列を付与したURL
        crawl_url = expanded_url + "hogehoge"
        response = request.urlopen(crawl_url)

        # responseを読み込んでbodyに保存
        body = response.read()

        # HTMLをパースし、soupに入れる
        soup = BeautifulSoup(body,'html.parser')

        hoge_id = soup.find('id').text

        print(str(hoge_id)+"を始めます")

        #最新のhogeidにたどり着いたら、その後のクロールは行わない。
        if int(hoge_id) <= max_hoge_id:
            print('すでにこのデータは入っています。')
            break

        description = soup.find('description').text

        #中略

        #データを挿入する
        cursor.execute('insert into hoge(hoge_id,description,hogehoge,,,) values(%s,%s,hogehoge)',(hoge_id,description,hoge,))
        print("inserted!")

        #スリープ時間は3秒に設定
        time.sleep(3)

    #変更を保存する
    connector.commit()

    cursor.close()
    connector.close()


if __name__ == '__main__':
    main()

```

```twpy.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-

# Tweepyライブラリをインポート
import tweepy

# 各種キーをセット
CONSUMER_KEY = 'hoge'
CONSUMER_SECRET = 'hoge'
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
ACCESS_TOKEN = 'hoge'
ACCESS_SECRET = 'hoge'
auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)

# APIインスタンスを作成
api = tweepy.API(auth)

# TwitterAPIをPythonから操作する準備完了。
print "Done!"
```

# 実行例
```
$ python crawl.py 
Done!
保存済みの最新IDは92
98を始めます
inserted!
97を始めます
inserted!
96を始めます
inserted!
95を始めます
inserted!
94を始めます
inserted!
93を始めます
inserted!
92を始めます
すでにこのデータは入っています。
```

#参考させていただいたサイト(の一部)
[Python: BeautifulSoup4 を使って Web サイトをスクレイピングする](http://momijiame.tumblr.com/post/114227737756/python-beautifulsoup4-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6-web-%E3%82%B5%E3%82%A4%E3%83%88%E3%82%92%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B)
[Tweepyを使って、PythonでTwitterのAPIを超簡単に操作する](http://statsbeginner.hatenablog.com/entry/2015/10/21/131717)

ありがとうございました。
Storyboard 上でUIBarButtonItemに UIButtonを追加する。

二度ほどやっているはずなんだが、やるたびに忘れてたので備忘録的にメモ。


#### 前提
最終的に下記のような形にしたい時に行う操作を記す。

![スクリーンショット 2016-06-19 12.20.19.png](https://qiita-image-store.s3.amazonaws.com/0/37053/97d71c7f-16ca-7782-4340-721bf32557de.png)

#### 問題

下記のように、UIButtonをView Hierarchie表示部分にドラッグしても、ドロップ操作が行えず、追加ができない。

![hieral.png](https://qiita-image-store.s3.amazonaws.com/0/37053/127d7c83-4cbd-59b2-c0d7-abd010e32c71.png)

#### 解決方法

答えは単純で、UIButtonをView Hierarchie 部分ではなく、UI要素に対して直接ドラッグアンドドロップしてやる。
そうすると下記状態となる。

![スクリーンショット 2016-06-19 12.20.19.png](https://qiita-image-store.s3.amazonaws.com/0/37053/97d71c7f-16ca-7782-4340-721bf32557de.png)
Gitコマンド備忘録

社内のバージョン管理をGitにして、約1年ほど。
導入以来、ずっと、SourceTree(GUI)を使っておりました。
iTerm(CUI)でgulpを実行しながらの業務なので実際、gitコマンド使ったほうが効率良くて早いんじゃね?ってことで、使ってるgitコマンドを個人の備忘録としてまとめてみました。(随時更新中。)
gitコマンドを使ったほうが、git本来の仕組みがわかるのでGUIから入るのではなくCUIのほうが理解しやすいかと思います。(入り方、完全に間違えてたな。。)

# gitコマンド

## helpを確認する
```
$ config --help
$ help config
```

## cloneする
```
$ git clone [リモートリポジトリ名]リモートリポジトリ名
```

## 現在の状態を見る
```
$ git status
```

## 編集にかかったファイル（差分データ）をaddする。
```
$ git add . // '.'をつけることでカレントディレクトリ配下すべてステージする
```

## commitする
```
$ git commit -m 'メッセージ' 
(例) git commit -m 'add:[結果にcommitする!]追加(PC,SP)'
```

## commit済みでまだpushしてないファイルを確認する
```
$ git log origin/[ブランチ名]..[ブランチ名]
(例) git log origin/master..master
```

## commitメッセージの修正
```
$ git commit --amend -m "fugafuga"
```

## branchの確認、作成
```
$ git branch // branchを確認
$ git branch [ブランチ名] // ローカルbranch作成
(例) git branch develop
```

## branchを切り替える
```
$ git checkout [ブランチ名]
(例) git checkout develop
```

## pushする
```
$ git push origin master
```

## fetchする(リモートリポジトリの内容を取り寄せる)

```
$ git fetch
```

## mergeする

```
$ git merge [ブランチ名] // 現在のブランチにマージする
$ git merge -m "hogehoge" [ブランチ名] // mergeにメッセージをつける
```

## pullする
```
$ git pull origin [ブランチ名]
(例)git pull origin master
```

## logを表示する
```
$ git log // コミットのログを確認する
$ git reflog origin/branch_name //pushのログを確認する
```

## リモートブランチの一覧を表示

```
$ git branch --remote

origin/HEAD -> origin/master
origin/html
origin/var
```

## ローカルブランチとリモートブランチの一覧を表示

```
$ git branch --all
master
html
var
origin/HEAD -> origin/master
origin/html
origin/var
```

## リモートブランチを削除

```
& git push --delete origin html
```


# 参考サイト
[Git](https://git-scm.com/book/ja/v1)
[Git チュートリアル](https://www.atlassian.com/ja/git/tutorial)
PTVSとAnacondaの連携

Visual Studio + PTVSでAnacondaを使用するにあたって少しハマったので覚書

## VisualStudio2015の設定
1. Proxy環境を乗り越える  

	* C:\Program Files\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe.config を編集
	* system.netの要素を追加する
	
		```xml
		<system.net>
		    <settings>
		        <ipv6 enabled="true"/>
		    </settings>
		    <defaultProxy enabled="true" useDefaultCredentials="true">
		        <proxy bypassonlocal="True" proxyaddress="http://[username]:[pw]@[ip]:[port]"/>
		    </defaultProxy>
		</system.net>
		```
2. PTVSの導入  

[PTVSのGitHub](https://github.com/Microsoft/PTVS)からダウンロード  

|Download|内容|  
|:--     |:--|  
|Python Tools for VS 201|PTVSの本体|  
|Sample Pack|プロジェクト作成時のテンプレートが追加される|  
|Machine Learning Pack|Azure Machine Learningの接続キット|  


## Anacondaの導入

1. [Anaconda](https://www.continuum.io/downloads)からダウンロードする  
	![Anaconda_download.PNG](https://qiita-image-store.s3.amazonaws.com/0/29168/14d32173-c0c2-7311-c5c0-195ee6cfe6fc.png "Anaconda_download.PNG")
	
	 
	AnacondaにはPython 3.5.1が含まれている為，Anacondaのみ使用するのであれば個別の導入は不要  
	[Anaconda Package List](https://docs.continuum.io/anaconda/pkg-docs)

2. インストール
環境変数の設定はどちらも行っておく
![インストール.PNG](https://qiita-image-store.s3.amazonaws.com/0/29168/b8f78787-6a8d-18ba-3552-8e31b1d7e791.png "インストール.PNG")


## Visual Studioとの連携
1. VisualStudioの"ツール -> オプション -> Python Tools"を開く
![ptvs連携.PNG](https://qiita-image-store.s3.amazonaws.com/0/29168/e3324cba-1ac1-c4ec-56a4-0dc90eb606e8.png "ptvs連携.PNG")


2. "Add Environment"から新しい環境を作成する
	![環境設定.PNG](https://qiita-image-store.s3.amazonaws.com/0/29168/ad5d7f5d-8db0-9d64-1d4f-2e718dd76f5e.png "環境設定.PNG")
	
	
	Path, Windows Path, Library PathにAnaconda内のものを指定する

3. "Python Environments"を右クリックし，"Add/Remove ~"をクリック  
先ほど作成した"Anaconda"を指定する
![環境設定.PNG](https://qiita-image-store.s3.amazonaws.com/0/29168/2563eb86-6d3e-9203-8107-0a1afbfa41b9.png "環境設定.PNG")


以上
Ubuntu 16.04 でタッチパッドを操作中にカーソルがゴミ箱にジャンプしてしまう問題を解消する(touchpad cursor trash jump)

Ubuntu 16.04 に限った話ではなく、15.10などでも起きるようなのですが、右手でタッチパッドを操作中に左手でクリック操作をするためにタッチパッドに触れると、カーソルの移動として認識されてしまい、ゴミ箱のあたりにカーソルが移動してしまうことがあります。
この現象が非常に鬱陶しいので、解消方法を調べてみました。

機種は HP Spectre 13 x360 Limited Edition ですが、他の機種でも同様の問題が起きる場合があるようです。

以下の通りの手順で一応解消できましたので、メモを残しておきます。

基本的には以下のパッチを適用する手順となります
https://lists.freedesktop.org/archives/xorg-devel/2014-June/042790.html


### ビルドに必要なコンパイラ等をインストール（もしまだなら）
`sudo apt-get install build-essential`


### 関連するソースをダウンロード
`sudo apt-get build-dep xserver-xorg-input-synaptics`

###ソースをダウンロード
`apt-get source xserver-xorg-input-synaptics`
 You must put some 'source' URIs in your sources.list
と表示されダウンロードできない場合は /etc/apt/sources.list の deb-src と書かれている行をアンコメント
または、software-properties-gtkを起動してsource codeにチェックを入れる

### ソースのディレクトリに移動
`cd xserver-xorg-input-synaptics`


### 以下の差分を適用する

``` /src/synaptics.c
$ diff -ru xserver-xorg-input-synaptics-1.8.2-orig/ xserver-xorg-input-synaptics-1.8.2
diff -ru xserver-xorg-input-synaptics-1.8.2-orig/src/synaptics.c xserver-xorg-input-synaptics-1.8.2/src/synaptics.c
--- xserver-xorg-input-synaptics-1.8.2-orig/src/synaptics.c	2016-06-19 21:54:23.015126297 +0900
+++ xserver-xorg-input-synaptics-1.8.2/src/synaptics.c	2016-06-19 22:20:38.626947361 +0900
@@ -3206,6 +3206,9 @@
     if (priv->tap_button > 0 && priv->tap_button_state == TBS_BUTTON_DOWN)
         buttons |= 1 << (priv->tap_button - 1);
 
+    if (para->clickpad && abs(dx) > priv->maxx/4 && abs(dy) > priv->maxy/4)
+        ignore_motion = TRUE;
+
     /* Post events */
     if (finger >= FS_TOUCHED && (dx || dy) && !ignore_motion)
         xf86PostMotionEvent(pInfo->dev, 0, 0, 2, dx, dy);
```


### ビルド・インストール(/usr/libへ)
`./configure --exec_prefix=/usr`
`make`
`sudo make install`

### リブート
`reboot`
GmailでHTMLメールのCSSが効かない問題の対処法

CSSでがっつりスタイルを指定したおしゃれなHTMLメールを作ったのに、Gmailで開いてみると・・・「アレ、**スタイルが効いてないよ？！**」といった時の対処法です。

# GmailでHTMLメールのCSSが効かない原因
Gmailを代表としたウェブメールクライアントはメールを表示する際に、セキュリティ上の脅威と思われる任意の要素を削除します。
一般的に取り除かれる要素は、

* JavaScript
* objectタグ：文書に外部リソースを埋め込む
* embedタグ：動画や音声などのプラグインが必要なデータをページに埋め込む
* Flash

があります。

これらに加え、Gmailでは、`<head>`と`<body>`の中に記述された`<style>`タグを削除します。

## CSSのスタイル指定の方法
### HTMLにスタイルシートファイルを読み込む

`<head>`タグ内に、読み込むスタイルシートを指定します。

```html
<link href="<CSSファイルのURL>" rel="stylesheet" type="text/css">
```

```html:hogehoge.cssファイルを読み込む場合
<html>
  <head>
　 　<link href="hogehoge.css" rel="stylesheet" type="text/css">
  </head>
</html>
```
### HTMLファイルに直接書く
`<head>`または`<body>`内に、スタイルシートの設定を記述します。

```html
<style type="text/css">
  スタイルの設定を記述!
</style>
```

```html:h1の文字色を赤にする場合
<html>
  <head>
    <style type="text/css">
      h1 {color:red;}
    </style>
   </head>

   <!-- または -->

  <body>
    <style type="text/css">
      h1 {color:red;}
    </style>
  </body>
</html>
```

### インライン形式
直接、タグに`style="属性:値;"`を記述します。

```html:h1の文字色を赤にする場合
<html>
  <body>
    <h1 style="color:red;">赤色で表示されます</h1>
  </body>
<html>
```
３つの指定方法からわかる通り、インライン形式以外の方法は、Gmailによって削除されてしまいます。

# 解決法：CSSの指定をインライン化する

各タグに`style="属性:値;"`を記述することで、Gmailで表示できるようになります。
けど、これって結構大変・・・。

## 自動でインライン化

* https://inlinestyler.torchbox.com/styler/convert/

変換サイトを使うと、自動で変換してくれます。
### 使い方
1. `Choose your source from a URL`にサイトのリンクを貼るか、`Enter your source HTML`にソースコードを書く
2. [Convert]をクリック
<img width="534" alt="スクリーンショット 2016-06-19 22.54.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/49238/ce1061c8-be1f-4493-6d9a-82bfd7e56e93.png">

実際に、変換したコードを貼ります。

```html:変換前
<html>
  <head>
    <style type="text/css">
      h1 {color:red;}
    </style>
   </head>
   <body>
     <h1>赤色で表示されます</h1>
   </body>
</html>
```

```html:変換後
<html>
  <head>
  </head>
   <body>
     <h1 style="color: red">赤色で表示されます</h1>
   </body>
</html>
```

# まとめ
一般的なウェブメールクライアントはメールを表示する際に、セキュリティ上の脅威と思われる任意の要素を削除してしまいます。
さらに、Gmailでは`<head>`と`<body>`の中に記述された`<style>`タグを削除します。

CSSを使ったHTMLメールを送信したい場合には、CSSをインライン形式で書く必要があります。
この作業は、とても地道なので、HTMLファイルに直接CSSを書いて、後で**自動で変換**するのがオススメです！