OmniAICreator/Qiita-1.07M huggingface dataset:
DBaaSサービス「Compose」、DBのログはどう見る？ PostgreSQL編

DBがインストールされている環境のOSには直接ログインできないDBaaSサービスですが、でもログは見たいですよね・・。
・パフォーマンスが落ちているのはいつか
・原因は何か
・DBに何か懸念がないか
などなどを調べるためには、やはりログは不可欠です。

composeではwebブラウザのGUIから、指定した日付のDBログをダウンロードすることができます。

![logcap.png](https://qiita-image-store.s3.amazonaws.com/0/119378/b22ec5ef-bf45-54ef-db24-8a69e09c4241.png)

ブラウザ画面、左側にある「Logfiles」をクリックすると、ダウンロード可能なログファイルの一覧が表示されます。
Compose上のPostgreSQLはHA構成を組んでいるので、postgresqlのノード2つ分、日次でログファイルダウンロード可能です。
（HA構成の話はこちらをご参照！↓）
http://qiita.com/azzeten/items/a7a786701cf25ef1a087

![loglog.png](https://qiita-image-store.s3.amazonaws.com/0/119378/3227c2ec-1920-7210-68cb-caa9178d27b8.png)


テキストのログファイルをがんばって読んでも良いですが、難しすぎるのでOSSのツールで見るのが便利です。
composeのサイトで紹介されているのは、pgbadger、pgFouine、pgsiなどなど。
パフォーマンス劣化に関する内容が確認できるツールのようです。
（ただしComposeのサービスではないので、Composeのサポート対象外）

詳細の参考URLはこちら→https://help.compose.io/v2.0/docs/postgresql-logfiles
RStudio でスライドを作る（書きかけ）

#options

参考：http://cse.naro.affrc.go.jp/takezawa/r-tips/r/11.html

```r
# 指数表記回避＆小数点１まで
options(scipen=1,digits=3)
```

#スニペット
```r
{r,echo=FALSE,fig.width=12, fig.height=12, fig.show='hold', fig.align='center}'
```

#サンプルソース

```r
タイトル
========================================================
author: hogemaru
date: 20XX年X月XX日 / Update 0401
transition: rotate
transition-speed: slow
width: 1200
height: 830
autosize: true


アンケート集計項目
========================================================
id:menu


* [**現在のクラウド利用状況についてお聞かせください**](#/s1)
* [**導入予定時期についてお聞かせください**](#/s2)
* [**今回のセミナーを５段階で評価ください**](#/s3)

East |Mfg | Fin | NB | etc | アンケート総数
---  |--- | --- | ---| --- | ---
9    |13  | 1   | 1  | 2   | 26

******

* [**製造業**](#/mfg0)
* クラウド利用状況
* 導入予定時期


```{r echo=FALSE}
setwd("C:/Users/hoge/Desktop/R/data/")
an<-read.csv("an.csv")

「現在のクラウド利用状況についてお聞かせください」
========================================================
id:s1

```{r,fig.width=30,fig.height=20,echo=FALSE}
par(oma = c(0, 0, 0, 0),cex=4)
#barplot(prop.table(table(an$Q1)),ylim=c(0,1.0),cex.main=3,cex.names=2.2,cex.axis=2.5,ylab="Ratio",cex.lab=1.5)
pie(prop.table(table(an$Q1)),col=gray(seq(0.4,1.0,length=6)),radius=1)

[Go to Menu](#/menu)

「導入予定時期についてお聞かせください」
========================================================
id:s2

```{r,fig.width=30,fig.height=20,echo=FALSE}
par(oma = c(0, 0, 0, 0),cex=4)
lbls<-paste(names(table(an$Q2)))
#barplot(prop.table(table(an$Q2)),ylim=c(0,1.0),cex.main=3,cex.names=2.2,cex.axis=2.5,ylab="Ratio",cex.lab=1.5)
#pie(prop.table(table(an$Q2)),labels=lbls,col=gray(seq(0.4,1.0,length=6)),radius=1)
pie(prop.table(table(an$Q2)),col=gray(seq(0.4,1.0,length=6)),radius=1)

製造業のお客様
========================================================
type:section
id:mfg0

製造業（クラウド利用状況）
========================================================
```{r,fig.width=20,fig.height=10,echo=FALSE}
par(oma = c(2, 3, 0, 2))
par(mfrow=c(2,1))
barplot(table(an$Q1[an$District == "Mfg"]),main="Mfg",ylim=c(0,10),cex.main=3,cex.names=2.2,cex.axis=2.5,ylab="Votes",cex.lab=1.5)
barplot(table(an$Q1[an$District != "Mfg"]),main="Non Mfg",ylim=c(0,10),cex.main=2,cex.names=2.2,cex.axis=2.5,ylab="Votes",cex.lab=1.5)

[Go to Menu](#/menu)

```
zabbix ubuntu-agentインストール

検証記録

すっげーはまったんだ。だからメモ程度の内容かいときます。CentOSと同じじゃないdebian系OSは権限とかほんと違うね。Linuxもヨチヨチ歩きな私には敷居が高かったですし、CentOSのそれとは多少ちがうので余裕のある方はご参考にしてくださいｗ

わたくしという青二才が行った検証や手記が、皆様の環境にオキマシテモ期待ドオリニナリマスコト、（因果交流電燈のひとつの青い照明）の下で、わたくしと皆様の心象スケッチが描けますことネガッテオリマス。

➡️引っ越しました。お手数ですが以下URLを参照してください。
http://amachan007.techblog.jp/archives/8170161.html

以上
Facebook シェア(Feed Dialogで投稿)時にコールバック


この画面でFacebookに投稿した時に、コールバックで何か処理する方法メモです。

![hoge.png](https://qiita-image-store.s3.amazonaws.com/0/76843/655eeb1d-cbd6-87d3-b42a-a47f93ffe974.png)

サンプル
http://killertunes.lolipop.jp/fb.html

#1.開発者登録をしてApp IDを取得する

まずはhttps://developers.facebook.com/
より開発者登録して、App IDを取得します。

![スクリーンショット 2016-04-15 11.11.59.png](https://qiita-image-store.s3.amazonaws.com/0/76843/ae103360-5829-078e-aa80-fa4d189d6e32.png)


>参考:Facebook : 開発者登録をしてApp IDを取得するまで
http://mushikago.com/i/?p=3176


#2 実装


```html:sample
    <div id='fb-root'></div>
    <script src='http://connect.facebook.net/ja_JP/all.js'></script>

    <button id="btn">シェアボタン</button>

    <script> 
      FB.init({appId: 666809556680582, status: true, cookie: true});  // 取得したappIdをセットする

      function postToFeed() {
        
        // apiをコール
        var obj = {
          method: 'feed',
          link: 'http://killertunes.lolipop.jp/fb.html', //ここにシェアするページのアドレス
          picture: '',
          name: '',
          caption: '',
          description: ''
        };

        // コールバック
        function callback(response) {
          console.log(response['post_id']);
          alert("投稿されました！");
        }

        FB.ui(obj, callback);
      } 


      // ボタンクリック時
      document.getElementById("btn").addEventListener('click', function(){
        postToFeed();
      });
            
    </script>
```


>参考:廃止されたシェアボタンのたぶん正しい代替手段
http://facebook-docs.oklahome.net/archives/52070227.html

>参考:facebookのいいねボタンでコールバックを得る方法+おまけ
http://liginc.co.jp/web/service/facebook/35972
railsアプリにパンくずリストを実装するGem ~breadcrumbs_on_rails~

## 最終目標
- railsアプリにカスタム構造のパンくずリストの設置
- viewはslimで実装

SEOにいいパンくずのタグ構造は「いろんなキュレーションサイトのパンくずリスト比較」(http://chmod.tech/?p=867) を参考にする.

すでにbreadcrumbs_on_railsでパンくずリストが実装できている前提で進める(controllerのadd_breadcrumbとかを省略してる)

## lib/custom_breadcrumbs_builder.rb

```rb:lib/custom_breadcrumbs_builder.rb
class CustomBreadcrumbsBuilder < BreadcrumbsOnRails::Breadcrumbs::Builder
  def render
    @context.render "/article/breadcrumbs", elements: @elements
  end
end
```
pathは次に追加するカスタムしたパンくずのviewがを指定(今回ならapp/views/article/_breadcrumbs.html.slim)


## view(カスタムしたパンくずのタグ構造)
```slim:app/views/article/_breadcrumbs.html.slim
- if elements.present? and elements.length > 1
  ul
    - elements[0..-2].each do |element|
      li [itemscope itemtype="http://data-vocabulary.org/Breadcrumb"]
        - if element.path.present?
          a href="#{element.path}" itemprop="url"
            span itemprop="title"
              = element.name
        - else
          span itemprop="title"
            = element.name
  li [itemscope itemtype="http://data-vocabulary.org/Breadcrumb"]
    span itemprop="title"
        = elements.last.name
```


erbなら下のようになる(動作未確認)

```erb
<% if elements.present? and elements.length > 1 %>
    <ul itemscope itemtype="http://data-vocabulary.org/Breadcrumb">
    <% elements[0..-2].each do |element| %>
        <li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">
        <% if element.path.present? %>
            <a itemprop="url" href="<%= element.path %>"><span itemprop="title"><%= element.name %></span></a>
        <% else %>
            <span itemprop="title"><%= element.name %></span>
        <% end %>
        </li>
    <% end %>
 
        <li itemscope itemtype="http://data-vocabulary.org/Breadcrumb">
          <span itemprop="title"><%= elements.last.name %></span>
        </li>
    </ul>
<% end %>
```

を追加

## view(パンくず表示箇所)
表示する場所の呼び出しを変える

```
= render_breadcrumbs builder: ::CustomBreadcrumbsBuilder
```

erbなら

```
<%= render_breadcrumbs builder: ::CustomBreadcrumbsBuilder %>
```



## libの読み込み（超重要！！！！！）
```rb:config/applecation.rb
config.autoload_paths += Dir[Rails.root.join('lib')]
```
を追加
これをしないとlibに追加したcustom_breadcrumbs_builder.rbを読み込んでくれなくてNO NAME ERRORになる.

## まとめ
- libの読み込みを書かないといけないところでつまずいた.
- 表示できてる前提からのカスタムの仕方しか書かなかったので、時間があったらgemの追加から書きたい.

## 参考サイト
http://loumo.jp/wp/archive/20150711000024/
http://chmod.tech/?p=867
http://chmod.tech/?p=896
SpringWebの@RequestMappingのマッピング優先順位

曖昧度の低い順番に優先される

1. /hotels/new
2. /hotels/{hotel}
3. /hotels/*

変数の少ない順に並び、ワイルドカードを含む場合は一番優先度が低くなる

``/users/1/news``というURLにアクセスするとき

```java
@Controller
@RequestMapping(value = "/users")
public class UserController {
    // 一番優先される
    @RequestMapping(value = "/1/news", method = {RequestMethod.GET, RequestMethod.HEAD})
    public String aaa() {
        return "user/news";
    }

    // ２番目
    @RequestMapping(value = "/{id}/news", method = {RequestMethod.GET, RequestMethod.HEAD})
    public String bbb(@PathVariable String id) {
        return "user/news";
    }

    // ３番目
    @RequestMapping(value = "/{id}/{type}", method = {RequestMethod.GET, RequestMethod.HEAD})
    public String ccc(@PathVariable String id) {
        return "user/news";
    }

    // 一番優先されない
    @RequestMapping(value = "/**", method = {RequestMethod.GET, RequestMethod.HEAD})
    public String ddd(@PathVariable String id) {
        return "user/news";
    }
}
```


ドキュメント
http://docs.spring.io/spring/docs/4.2.x/javadoc-api/org/springframework/util/AntPathMatcher.html
Arduino IDEで数値をグラフ表示する「シリアルプロッター」

# シリアルプロッターとは
Arduino IDEでスケッチを作成中に`Serial.print()`または`Serial.println()`でデバッグすることがあると思います。とくにセンサーの値など。通常は「シリアルモニター」で文字列として表示するのですが、数値をグラフ表示してくれる「シリアルプロッター」なる機能があります。

![シリアルプロッター](https://qiita-image-store.s3.amazonaws.com/0/55103/402df11f-d23e-845b-4dac-a6179e4070c5.png)

# シリアルプロッターの表示方法
Arduino IDEのメニューから[ツール]→[Serial Plotter]をクリックします。シリアルモニターのように表示方法はいたって簡単です。

# シリアルプロッターへグラフを描画する方法
以下のソースコードで、ランダム値を上図のようにグラフ表示します。

```cpp
void setup() {
  Serial.begin(9600);
  Serial.println("start");
}

void loop() {
  Serial.println(random(0, 1023));
  delay(500);
}
```

ご覧のとおり、シリアルモニターに文字列を表示させる時と同じく`Serial.println()`を使っています。`Serial.println("start");`で文字列を表示しているのですが、**シリアルプロッター側で文字列を良しなに省いてくれます。**

# 使用上の注意
実際に触っていていくつかハマりどころがありました。

- **`Serial.print()`では描画されない**  
改行が入る`Serial.println()`でないと描画されません。
- **ウィンドウサイズが縦長過ぎると値の変化がわからない**  
ウィンドウの高さと値の表示範囲が比例するようで、値によってはただの1本線に見えることがあります。
- **シリアルプロッターとシリアルモニターは同時表示できない**  
グラフで値の変化をなんとなく眺めつつ、実際の値を確認したかったのですが、残念ながらシリアルプロッターとシリアルモニターは同時表示できません。

# 感動したけど...
存在を知った瞬間は「うおー！すげぇー！」となりましたが、実際に使うかは... :sweat_smile: 
きっと出番がやってくるはず！
日付をまたぐ場合も考慮した時間内判定

# 問題
現在時刻 $Now$ が 開始時刻 $Start$ と 終了時刻 $End$ の範囲内かを判定したい。
ただし、開始時刻と終了時刻が夜中の0時をまたぐ場合があり、この場合は $End < Start$ ということがあり得る。
どのように判定すればよいか？

ただし、等号については、

- $Start = Now$ つまり開始時刻ピッタシは $\textrm{true}$
- $Now = End$ つまり終了時刻ピッタシは $\textrm{false}$
- $Start = End$ つまり開始時刻と終了時刻が一致している場合は 24 時間 OK

としたい。

# if 文を使った答え

素朴にはまず $Start <= End$ か $End < Start$ かで場合分けをし、

- $Start \le End$ だった場合 → $Start \le Now$ **かつ** $Now < End$ だったら $\textrm{true}$
- $End < Start$ だった場合 → $Now < End$ **または** $Start \le Now$ だったら $\textrm{true}$

とすれば良い。

```rb:Ruby
def time_between? s, n, e
  if s <= e
    s <= n && n < e
  else
    n < e || s <= n
  end
end
```

```js:JavaScript
function timeBetween(s, n, e) {
  if (s <= e)
    return s <= n && n < e;
  else
    return n < e || s <= n;
}
```

```scala:Scala
import org.joda.time.LocalTime

object Time {
  def timeBetween(s: LocalTime, n: LocalTime, e: LocalTime): Boolean = {
    if (s.compareTo(e) <= 0) // s <= e i.e. s - e <= 0
      s.compareTo(n) <= 0 && n.compareTo(e) < 0
    else
      n.compareTo(e) < 0 || s.compateTo(n) <= 0
  }
}
```

# xor を使った答え
$\textrm{xor}$（排他的論理和）を使うともう少しスマートに書くことができる。
$\textrm{xor}$ は、$A \, \textrm{xor} \, B \, \textrm{xor} \, C$ という式において、どこかの符号が反転したら結果の符号も反転する、という性質を持つ。

| # | $A: s \le n$     | $B: n < e$       | $ C: s < e$      | $A \oplus B \oplus C$ | 備考 |
|:--|:----------------:|:----------------:|:----------------:|:---------------------:|:----|
| 1 | $\textrm{true}$  | $\textrm{true}$  | $\textrm{true}$  | $\textrm{true}$       | 開催中 |
| 2 | $\textrm{false}$ | $\textrm{true}$  | $\textrm{true}$  | $\textrm{false}$      | 開始前 |
| 3 | $\textrm{true}$  | $\textrm{false}$ | $\textrm{true}$  | $\textrm{false}$      | 終了後 |
| 4 | $\textrm{true}$  | $\textrm{false}$ | $\textrm{false}$ | $\textrm{true}$       | 日をまたぐ場合で、現在まだ日をまたいでいない |
| 5 | $\textrm{false}$ | $\textrm{true}$  | $\textrm{false}$ | $\textrm{true}$       | 日をまたぐ場合で、既に日をまたいでいる |
| 6 | $\textrm{false}$ | $\textrm{false}$ | $\textrm{false}$ | $\textrm{false}$      | 日をまたぐ場合で、終了後、開始前 |

```rb:Ruby
def time_between? s, n, e
  (s <= n) ^ (n < e) ^ (s < e)
end
```

```js:JavaScript
function timeBetween(s, n, e) {
  return !!(s <= n ^ n < e ^ s < e);
}
```

```scala:Scala
import org.joda.time.LocalTime

object Time {
  def timeBetween(s: LocalTime, n: LocalTime, e: LocalTime): Boolean = {
    s.compareTo(n) <= 0 ^ n.compareTo(e) < 0 ^ s.compareTo(e) < 0
  }
}
```

開始時刻 0 〜 23時、終了時刻 1 〜 24 時 とかいう制限をかけておいて DB 上では time 型で endTime = 0:00:00 になっちゃうようなクソシステムに是非。
SQLメモ

使いそうなSQLを順次メモ。
一応使ってるのはMySQLです。
これから増やす予定。

# DBにあるテーブル一覧
```
SHOW TABLES from [table name]
```

##memo
* railsの場合はdatabase.ymlにある「database」の項目

# テーブルにあるカラム一覧
```
SHOW FULL COLUMNS from [table name]
```
hubotについて挑戦したときめも

やってみたことメモ。
やりっぱなし放置中…。


# やりたいこと
* Hubotと会話
* Hubotにタスク管理(重要)
* slackで私だけに反応して！

# できたこと
## ①Hubotのインストール
Cloud9で作ります。
今回は**secretary_bot**という名前でNode.jsプロジェクトを立ち上げました。
読めませんが秘書という意味。
可愛く管理してくれる秘書が欲しい。

参考：http://qiita.com/bouzuya/items/3f1eff41c361a880505f

##　
#### 注意点
公式通りにやるとできないかも**(重要)**
colud9のNode.jsは**バージョン古いです(それなりに重要)**

できない場合は下記コマンドで対応。
hubotを作成したディレクトリで実施する。
```
 npm install generator-hubot
```
##　
#### できない場合は...
同じ場所で、↓のコマンドを打つ。
```
npm install https://github.com/github/generator-hubot/archive/master.tar.gz
```

## ②Hubotと挨拶を交わす
Web上でスクリプトが転がっているのでまず試す。

```
# scripts/slack-hello.coffee
module.exports = (robot) ->
  robot.hear /@secretary Hello/i, (msg) ->
    username = msg.message.user.name
    msg.send "Hello, " + username
```


##  　
このままだと「@secretary」って直打ちしないといけない…。
hello！だけで挨拶してほしい…。
あと萌え化したい…。

```
# scripts/slack-hello.coffee
module.exports = (robot) ->
  robot.respond /HELLO$/i, (msg) ->
    msg.send "おかえりなさいませ！"
```

# 今後
* もう少し受け答え増やしたい
* 日本語に反応させたい
* 可愛くしたい
* とりあえずslackで動かせるようにしよう
* Hubotとやりとりできるスケジュールサービス探そう


node.jsのアップグレード
nvm install stable

npm⇒node.jsで作ったパッケージ管理的なもの？
nvm⇒node.js自体を管理するもの？
みたいな
S3のbucket名に.が入っていたらfogに注意されました。

S3のbucket名に`.`を入れていたらWARNINGがでました。

```
[fog][WARNING] fog: the specified s3 bucket name(test.pugiemonn.com) contains a '.' so is not accessible over https as a virtual hosted bucket, which will negatively impact performance.  For details see: http://docs.amazonwebservices.com/AmazonS3/latest/dev/BucketRestrictions.html
```

`test.pugiemonn.com` を `test-pugiemonn-com` のように変更したら警告がでなくなりました。
Sublime Text 3をPHPStormライクなKeybindingにする


```json
{ "keys": ["ctrl+b"], "command": "goto_definition" },
{ "keys": ["ctrl+alt+right"], "command": "jump_forward" },
{ "keys": ["ctrl+alt+left"], "command": "jump_back" },
{ "keys": ["ctrl+d"], "command": "duplicate_line" },
{ "keys": ["ctrl+y"], "command": "run_macro_file", "args": {"file": "Packages/Default/Delete Line.sublime-macro"}},
{ "keys": ["ctrl+w"], "command": "expand_selection", "args": {"to": "scope"} },
{ "keys": ["ctrl+shift+w"], "command": "close" },
{ "keys": ["alt+j"], "command": "find_under_expand" },
{ "keys": ["ctrl+shift+a"], "command": "show_overlay", "args": {"overlay": "command_palette"} },
{ "keys": ["ctrl+shift+n"], "command": "show_overlay", "args": {"overlay": "goto", "show_files": true} },
{ "keys": ["ctrl+shift+alt+n"], "command": "goto_symbol_in_project" },
{ "keys": ["ctrl+f3"], "command": "show_panel", "args": {"panel": "find", "reverse": false} },
{ "keys": ["ctrl+shift+f3"], "command": "show_panel", "args": {"panel": "find", "reverse": true} },
{ "keys": ["shift+enter"], "command": "run_macro_file", "args": {"file": "res://Packages/Default/Add Line.sublime-macro"} },
{ "keys": ["alt+shift+up"], "command": "swap_line_up"},
{ "keys": ["alt+shift+down"], "command": "swap_line_down"}
```

`ctrl+w`がデフォルトの`close`(タブを閉じる)コマンドと被ったため`ctrl+shift+w`でタブを閉じるようにしています
Python覚書：テキスト参照して、対象ファイルをコピーしつつファイル名を編集する


## ファイル名を取得
対象ファイルがパス情報であったため、あらかじめファイル名のみを取得。

```py:os.path.basename
file_name = os.path.basename(txt_fle_line)[:-1]
```

## XCOPY
一時的に「subprocess.call」でXCOPYを利用もしてみたけど、
moveもする必要がでてきたので、汎用性を考えてshutilを使うことに。

```py:subprocess.call
import subprocess
subprocess.call("xcopy %s %s /D /K /R /Y /C /V /E"%(file_path, send))
```


## 更新時間
更新時の新しいものを採用ということで、時間を取得して比較した。

```py:shutil.py
        if os.path.exists(rename_file) :

            copy_date = os.stat(rename_file).st_mtime
            org_date = os.stat(file_path).st_mtime

            if copy_date < org_date:
                print "%s copy... %s" %(send, grid_name)
                shutil.copy2(file_path, rename_file)

        else:
```

テキスト参照して、対象ファイルをコピーしつつファイル名を編集するスクリプト。

```py:copy_target.py
import os
import shutil
from datetime import datetime as dt

txt_file = open(r"copy_target.txt","r")

for target_line in txt_file:

    if target_line == '\n':
        break

    target_cl = target_line[:-1].split(',')

    file_path = target_cl[0].strip('"')
    file_name = target_cl[1].strip('"')

    grid_cl = file_name.split('_')

    if len(grid_cl) == 6:

        photo = grid_cl[0]
        area = grid_cl[1]
        b_cl = grid_cl[2]
        b_rw = grid_cl[3]
        b_no = grid_cl[4]
        flg = grid_cl[5]

    grid_name = area + b_cl + b_rw
    send = r'G:\grid\\' + area + '\\' + grid_name

    if os.path.isdir(send) :

        rename_file = send +'\\'+ file_name

        if os.path.exists(rename_file) :

            copy_date = os.stat(rename_file).st_mtime
            org_date = os.stat(file_path).st_mtime

            if copy_date < org_date:
                print "%s copy... %s" %(send, grid_name)
                shutil.copy2(file_path, rename_file)

        else:
            print "%s copy new... %s" %(send, grid_name)
            shutil.copy2(file_path, rename_file)

    else:
        is_not_file = open(r"D:\python\file_serch\target_work\is_not_GRID.txt", "a+")
        is_not_file.write(file_path + "," + file_name + "," + "no path" + "\n")

        is_not_file.close()
```
AtomでPythonのスタイルガイドを守る(flake8)

大体以下のREADMEに書いてあるとおり。
[linter-flake8](https://github.com/AtomLinter/linter-flake8)

#flake8
pep8&pyflakes

```
$ pip install flake8
$ pip install flake8-docstrings
```

#Linter for Atom
Atomでflake8チェック

```
$ apm install linter
$ apm install linter-flake8
```

以上です。簡単ですね。
あとはAtomを再起動するだけ。
みんなでPE8守りましょうね。
0〜n-1の整数をシャッフルする（STLバージョン）


学生時代に書いた（2004年ごろと思われる）コードが発掘されたのでさらしてみる。
とりあえず引数を与えず実行しちゃあかんです。

```c++
#include <iostream>
#include <ctime>
#include <vector>
#include <algorithm>
#include <iterator>

class Random
{
public:
    Random(int seed = std::time(NULL)) {
        std::srand(static_cast<unsigned>(seed));
    };  
    virtual ~Random() {}; 

    std::ptrdiff_t operator()(std::ptrdiff_t arg) const {
        return static_cast<std::ptrdiff_t>(arg * static_cast<double>(std::rand()) / RAND_MAX);
    };  
};

template <typename T> class Generator_base
{
public:
    Generator_base(const T init = T(0)) : val(init) {}; 
    virtual ~Generator_base() {}; 
    virtual T operator()() = 0;

protected:
    T val;
};

template <typename T> class IncrementGenerator : public Generator_base<T>
{
public:
    IncrementGenerator(const T init = T(0)) : Generator_base<T>(init) {}; 
    virtual ~IncrementGenerator() {}; 
    virtual T operator()() {
        return Generator_base<T>::val++;
    }   
};

int main(int argc, char * argv[])
{
    std::vector<int> data(atoi(argv[1]));
    IncrementGenerator<int> gen(0);
    Random r;
    std::ostream_iterator<int> os_itrt(std::cout, " ");

    std::generate(data.begin(), data.end(), gen);
    std::random_shuffle(data.begin(), data.end(), r); 
    std::copy(data.begin(), data.end(), os_itrt);

    return 0;
}
/* Local Variables: */
/* compile-command: "g++ -O2 -Wall random.cc" */
/* End: */
```

[追記1 2015.04.15]
C++14で```std::rand()```と```std::random_shuffle()```は非推奨になってます。
代わりに乱数ライブラリ```<random>```と```std::shuffle()```を使いましょう。
arduinoでsprintf

#概要
arduinoでフォーマット付きのserial出力が無いので、sprintfを試してみた。
#環境
arduino ide ver 1.6.3
arduino uno
#写真
![sprintf.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/4019afd4-b711-bc73-213b-8a9181311d2f.jpeg)

#サンプルコード
```
#include <stdio.h>

void setup()
{
	Serial.begin(115200);
	Serial.println("start");
	char buf[44];
	int i = 5;
	float f = 3.0;
	char c = 'a';
	sprintf(buf, "String %s", "Ok");
	Serial.println(buf);
	f = i;
	sprintf(buf, "Float %4.1f", f);
	Serial.println(buf);
	i = f;
	sprintf(buf, "Integer %d", i);
	Serial.println(buf);
	i = f / 2;
	sprintf(buf, "Integer %d",i);
	Serial.println(buf);
	i = (int) f / 2;
	sprintf(buf, "Integer after cast %d", i);
	Serial.println(buf);
	i = 5;
	f = i / 2;
	sprintf(buf, "Float f after divide %4.1f", f);
	Serial.println(buf);
	f = (float) i / 2;
	sprintf(buf, "Float after cast and divide %4.1f", f);
	Serial.println(buf);
	i = c;
	sprintf(buf, "Integer corresponding to a is %d", i);
	Serial.println(buf);
	c = i;
	sprintf(buf, "Char %c", c);
	Serial.println(buf);
	c = (char) i;
	sprintf(buf, "Char after cast %c", c);
	Serial.println(buf);
	f = 98.0;
	c = f;
	sprintf(buf, "Char %c", c);
	Serial.println(buf);
	c = (int) f;
	sprintf(buf, "Char after weird cast %c", c);
	Serial.println(buf);
	c = (char) f;
	sprintf(buf, "Char after cast %c", c);
	Serial.println(buf);
	sprintf(buf, "Integer %d", f / 2 + f);
	Serial.println(buf);
	sprintf(buf, "Integer %d", (int) (f / 2 + f));
	Serial.println(buf);
	i = 255;
	sprintf(buf, "Integer to HEX %X", i);
	Serial.println(buf);
	//sprintf(buf, "Weird Float %5.2f", i / 10);
	//Serial.println(buf);
	//sprintf(buf, "Float %5.2f", (float) (i / 10));
	//Serial.println(buf);
	//sprintf(buf, "Float %5.2f", (float) i / 10);
	//Serial.println(buf);
	//f = 2.5;
	//sprintf(buf, "Float %5.0f", f);
	//Serial.println(buf);
	//i = 2.5;
	//f = i;
	//sprintf(buf, "Float %5.2f", f);
	//Serial.println(buf);
	//f = (float) i;
	//sprintf(buf, "Float %5.2f", f);
	//Serial.println(buf);
	Serial.println("end");
}
void loop()
{
}


```
ストアのレビューをSlackに流せるサードパーティ製アプリまとめ


# はじめに
Slackでほげほげしたいよねという要件が最近本当におおいなーと感じます。すごいですねSlack。

Android・iOSのストアレビューの監視もSlackに流れてきたら便利だよね、キーワードでアラートとかできたら便利だよね、という話も出てきて、調査してみたらいくつか良さそうなものがあったのでまとめました。
https://slack.com/apps にリンクがあるものだけなので、もっとあるかもしれません。
（まだ一個も使ったことはありません！！！使ったことある方のコメントなどお待ちしております！！！）

## AppFollow(http://appfollow.io/)
[App Annie](https://www.appannie.com/jp/)に近い感じです。

https://slack.com/apps/A0MEQBTD3-appfollow
>Track app activities in App Store, Google Play and Windows Phone Store: 
• Reviews
• Ranks
• Keywords (search results positions)
• Updates    
You can track any app in the appstores, compare and learn your customers needs & wishes. Review monitor, reply to Google Play reviews, get translations, keywords tracker, monitor marketing and ASO results.

>Our bot @appfollowbot can help you stay updated on what is trending, top-charts & keywords suggestions for App Store and Google Play.

>AppFollow helps iOS, Android and Windows developers stay updated. All important information for each team member in one place.



## LaunchKit(https://launchkit.io/)
BadReviewはアラートが飛ばせるみたい
https://launchkit.io/reviews/

レビューについて以外も機能がいくつかあるみたいです。

https://slack.com/apps/A03HT715T-launchkit
>Automatically finds and posts reviews from the App Store for your app for the entire team to see. Automatically imports and beautifully formats App Store sales reports so you know how many downloads you get every day.



## Appbot(https://appbot.co/) 
レビューの中で使われてる単語の頻度がみれるみたい。
https://support.appbot.co/help-docs/how-to-use-words/
レビュー監視という点ではこれが一番良さそう。


https://slack.com/apps/A03HHTUN5-appbot
>Get app reviews for iOS, Mac, Google Play, Windows Phone and Amazon for all countries straight to your Slack channel!

>You can even reply directly to Google Play reviews with a quick link to Google Play console.

>We make sense of review data from the major mobile app stores by aggregating and analysing customer sentiment about your apps, and those of your competitors.

>Developers and Product Managers use Appbot to cut through the noise and surface the reviews that are really important to their downloads and revenue by: 
• easily identifying feature requests, 
• quickly surfacing bugs, and 
• tracking how users are feeling about their apps over time.


## Bell Apps App Review Notification(https://bell-apps.appspot.com/)
シンプルにSlackにレビューが流れる

https://slack.com/apps/A0HCC2Z0F-bell-apps-app-review-notification
>Send App Store reviews to a specified channel of your Slack team.
When reviews are posted to App Store page, send notification to Slack automatically.
You can receive reviews of any AppStore App. So, for example, you can check reviews of your competitors.

# おわりに
トライアルできるものや無料のものもあるのでこれから試してみます。
Unity C# エラーはまりポイント


Unityでゲームの実装をしていて、何度も同じエラーに苦しめられたので、メモ書き程度にまとめていきます（随時更新）

## Vector3ではまる

```
Cannot modify a value type return value of `UnityEngine.Transform.position'. Consider storing the value in a temporary variable
```
このエラーに非常に苦しめられました。

これは、

```
GameObject.transform.position.x = pos.x;
```

と直接position.xに数値を入れようとするとエラーになるらしく、

```
Vector3 tempSpear = GameObject.transform.position;
temp.x = pos.x;
spearObj.transform.position = temp;
```

と一度Vector3に入れて、再度positionを当てなおしてやるとエラーが解消されました。これはハマった。。。

## GetComponentではまる
```
Cannot convert method group `GetComponent' to non-delegate type `Robot'. Consider using parentheses to invoke the method
```
GetComponentが怪しいなーと思いつつ、これは

```
GameObject.GetComponent<Robot>;
```

こう書いていたのが、

```
GameObject.GetComponent<Robot>();
```

こうでした。()か。。。

※随時更新
[AndroidN] Multi-Window で対応しなければいけないところ

## 1. 対応していないアプリはAndroidNでどう動きますか？
"このアプリは画面分割に対応していません"というtoastが表示されて、これまで通りシングルウィンドウで動きます。
マルチウィンドウの対応を示すのはAndroidManifestに指定する、android:resizeableActivityで、これはapplication/activityどちらにも指定可能です。
また、resizeableActivityを指定すると、何らかの実装が足りていない場合に、"この画面はマルチウィンドウで動作しないことがあります"という表示が出ることがあるようです。(助かりますが、駆逐したいので、どういうロジックで判定しているのか調査中)

## 2. FooActivityとBarActivityをマルチウィンドウで見れますか？
> Android N adds support for displaying more than one app at the same time. 

ドキュメントにもこのようにあるように、アプリごとのマルチウィンドウが主な機能であり、開発している側が意図しない状態で、ユーザの操作によりFooActivityとBarActivityが同時に表示されてしまうようになってしまう、ということはありません。
しかし、新しいtaskで起動ささせると、もちろんマルチウィンドウで両方を表示することが出来ますし、Intent.LAG_ACTIVITY_LAUNCH_ADJACENTというflagを追加することで、隣のウィンドウで新しいActivityを立ち上げることが出来ます。multi-windowではないときの動作にこのflagは影響しないとのことです。
参考: http://developer.android.com/intl/ja/preview/features/multi-window.html#running

また、自分のアプリとブラウザをマルチウィンドウで開いているときに、自分のアプリからブラウザを開く箇所があれば、きちんとfinish()を呼ぶなり画面を綺麗にしておかないと、中途半端な状態の画面が残り続けることになってしまいます。

## 3. 非アクティブになった時に、どんなライフサイクルが呼ばれますか？
アクティブになったときにonResume、非アクティブになったときにonPauseが呼ばれます。
そのため、onPauseでEventBusをsubscribeしている箇所や、isResumeの時だけ非同期処理の結果に応じてローディングのくるくるを非表示にする、なんていう処理を書いているところは修正が必要そうです。


## 4. キーボードを開いたときにどうなりますか？
### 縦向きの時
<img width="291" alt="スクリーンショット 2016-04-08 21.37.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/20459/38903004-a187-507d-1c28-ab3b9017e0cc.png">

### 横向きの時
<img width="665" alt="スクリーンショット 2016-04-08 21.53.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/20459/d4817885-2465-ee46-2a8c-041f2cf4c63a.png">

縦向きの場合は、わかりにくいですが、上のViewにfocusした状態でキーボードを開くと、下のViewの上にキーボードが開きます。
下のViewにfocusした状態でキーボードを開くと、一時的にViewが伸びてシングルウィンドウのようになり、キーボードを片付けるとまたマルチウィンドウになります。

## 5. 画面回転したときに何が起きますか
manifestでscreenOrientationをportraitで固定していたとしても、↑で貼った画像のように画面回転した時にウィンドウが縦並びから横並びに回転してしまいます。
そのため、画面回転を考慮していない画面は対応が必要です。

## 6. 一度マルチウィンドウになったら回転以外で、画面サイズは変わりませんか？
いいえ。マルチウィンドウを分割している境界線を移動させて、画面サイズを変更することができます。
また画面サイズを変更すると、Activityが破棄されてonCreateからの再描画が走るようです。
AndroidManifestのconfigChangesにorientationをつけることで破棄をActivityでハンドリングできるようになるのと同様に、screenSizeでハンドリングできるのかと思いきや、破棄されてしまっています。
configChangesにorientation, screenSizeをつけて、画面回転時の再描画をスキップしている画面はこちらの動作も確認したほうが良さそうです。

## 7. 画面サイズの取得はどうなりますか
DisplayMetricsを利用している箇所があると、画面分割によってDisplayのサイズとViewのサイズが異なってしまうため、壊れてしまいそうです。(getResources().getDisplayMetrics().widthPixelsなど)
また、横向きにすると単純にwidthがheight / 2になるわけではなく、navigationBarが移動するので再取得しないといけません。
WindowManager.getDefaultDisplay() はアクティブなwindowの画面サイズを取ってきてくれるので問題なさそうです。

## 8. scrollできない画面
画面中央に画像を表示し、その50dp下にボタンを配置するようなレイアウトなどを、scrollViewを利用せずに作って閉まっていると、デザインによってはマルチウィンドウにしたときに、ボタンが見きれてしまうことがあるかもしれません。
<img alt="スクリーンショット 2016-04-15 14.11.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/20459/2ce4928f-1bc5-fca9-1436-bea4773837d8.png" height="250px"> → <img width="340" alt="スクリーンショット 2016-04-15 14.13.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/20459/33e5fcb0-40cc-9bd4-dbdf-9e97f7a152ef.png">

## 9. ホームはどのように見えますか？
端末ホームはシングルウィンドウで表示されるようなので、ウィジェット系は影響なさそうに見えます。

# その他
基本的にはGoogleさんのドキュメント通り進めることができました。
http://developer.android.com/intl/ja/preview/setup-sdk.html

buildToolsVersionだけ、'24.0.0-rc1'と指定されていますが、既に'24.0.0-rc2'だったので、そちらを利用しました。
細すぎるWeb Fontの可読性を上げてみる

## 概要
[Google Fonts] (https://www.google.com/fonts "Google Fonts") などのWebフォントは `font-weight: 100;` という細いウェイトに対応しているものがあります。これらの極細フォントを使用する際、WindowsのWebブラウザでは表示が細すぎるフォントがあるため、僅かでも可読性を上げるためにCSSでの調整を図ります。（他のブラウザに比べて Chrome が特に細い印象）

## 対象のフォント
* [Lato (Google Fonts)](https://www.google.com/fonts/specimen/Lato "Lato (Google Fonts)")
* [Josefin Sans (Google Fonts)](https://www.google.com/fonts/specimen/Josefin+Sans "Josefin Sans (Google Fonts)")

などなど。

## やってみたこと
文字色と同色で**オフセット値・ぼかし半径 "0"**の `text-shadow` を指定する。

```css:CSS
.heading {
    font-family: 'Lato', sans-serif;
    font-weight: 100;
    font-size: 48px;
    color: black;
    text-shadow: 0 0 0 black;
}
```

この指定で文字色が濃すぎる場合は影色の不透明度を変更したり、逆にまだ薄い場合は `text-shadow` を二重・三重に指定することで微調整します。

## 結果
![css_thin_text_shadow.png](https://qiita-image-store.s3.amazonaws.com/0/105684/f0885e04-e333-64f7-e260-805fbd2994dd.png)

文字色が濃くなった分、少しだけ可読性が上がった気がします。よかったですね。

## 補足
* Windows環境以外では意図しない濃さになっている場合があるので要注意。
* 文字サイズや文字と背景色との組み合わせなどで可読性は大きく変わるため、細いウェイトに対して一律で指定するのではなく、必要に応じて個別に調整した方が良さそう。
技術英語 > to recognize [the scarcity] and the value of water. > scarcity / shortage > @ economics > scarcity is a naturally occurring limitation on the resource that cannot be replenished

@ LOE > March 21, 2003
http://loe.org/shows/shows.html?programID=03-P13-00012
>  to recognize the scarcity and the value of water.

http://eow.alc.co.jp/search?q=scarcity&ref=sa

<hr>
shortageとの違いは何なのか

http://www.differencebtw.com/difference-between-scarcity-and-shortage/

> In layman’s terms, they may be used interchangeably, but in the field of economics, they are completely different terminologies. 

economicsにおいては違いがあるとのこと。

> <font color=red>scarcity</font> is a naturally occurring limitation on the resource that cannot be replenished. A <font color=red>shortage</font> is a market condition of a particular good at a particular price.
自分がストックした投稿の全体数を把握する

ストック件数が見れない…だと！？

![スクリーンショット 2016-04-15 6.33.07.png](https://qiita-image-store.s3.amazonaws.com/0/25060/caf62b13-c806-65af-6ffc-af3fbd34f1e2.png)

かといって何も検索欄に入力しないと0件になる．

![スクリーンショット 2016-04-15 6.34.43.png](https://qiita-image-store.s3.amazonaws.com/0/25060/67c3faea-333f-2645-d69e-173883c0fa6f.png)

試しに `-tag:` という無意味なクエリを設定してみたら…

![スクリーンショット 2016-04-15 6.36.28.png](https://qiita-image-store.s3.amazonaws.com/0/25060/8ff09127-8215-3557-2fb4-aaf208bef9dd.png)

見れた！というか記事の全体数すごいですねえ…
1.0になったVisualStudioCodeの強みと弱点

ついにVisualStudioCode(以下、VSCode)の1.0がリリースされました。ずっとVim以外の、人に勧められるエディタを探していた私にとって、VSCodeはまさにちょうど良いエディタでした。
このVSCodeで、エッジの振られている強みと、弱点を紹介します。

## 強み1 入力補完機能が優れている

VisualStudioの名を冠するだけあって、入力候補機能が標準で付いています。
C#やJSは文脈を読んで補完してくれます。文脈を読めない形式でも、同じファイル中に出てきた単語を補完候補として利用できます。
スニペットや言語対応の拡張フレームワークが用意されており、拡張機能をインストールすることで多くの形式に対応できるようになります。

* [languageの拡張機能一覧](https://marketplace.visualstudio.com/vscode/Languages)
* [snippetsの拡張機能一覧](https://marketplace.visualstudio.com/vscode/Snippets)

## 強み2 デバッグ機能が整備されている

ブレイクポイントをつけたり、変数を見たりするデバッグ機能が、当然のように標準で付いています。4つの機能タブのうち、1つがデバッグになっています。
デバッグ機能の拡張フレームワークが提供されており、今後も拡張機能により様々な言語がサポートされていくと思われます。

* [debbugerの拡張機能一覧](https://marketplace.visualstudio.com/vscode/Debuggers)

## 強み3 カスタマイズしなくても使える

様々な言語が標準でシンタックスハイライト、入力補完が使えるようになっています。ShellScriptや、Dockerfileといった今までエディタがあるようでなかったものまで、標準で対応しています。
インストールして、作業ディレクトリさえ指定すれば、そこそこ良い感じの作業環境が手に入ります。

## 強み4 gitフレンドリーである

4つの機能タブのうち、1つがgitのためのタブになっています。初めてgitを使う人でも使えるように、マウス操作で、diffの確認、commit、push、pullができるようになっています。

## 強み5 Syntaxエラー、Lintエラーが表示できる

IDEでよくお世話になる、Syntaxエラーの表示、またLintエラーの表示ができるフレームワークが乗っています。Lint用の拡張フレームワークが提供されており、今後も拡張機能で様々な言語が対応していくと考えられます。

* [linterの拡張機能一覧](https://marketplace.visualstudio.com/vscode/Linters?sortBy=Downloads)

## ほかの特徴

* F1キーで呼び出す、全ての機能の起点となるコマンドパレットがあります。またコマンドは正確に覚えていなくても使えるように、候補の絞り込みがよく効くようになっています。
    * ただし、日本語設定では、検索する文字も日本語になってしまうため、言語設定を英語にするのがおすすめです。
* Windows、Mac、Linuxのマルチプラットフォーム対応。
* 複数ファイルを同時に開いて、並べて表示できます。
* jsonの設定ファイルにより、キーバインドや各種設定を行うことができる。
* メソッド名の一括変換など、今までIDEでしか得られなかったリファクタリングの機能が利用できます。

## 弱点1 拡張機能で拡張できる範囲が限定的

Atomのようになんでも拡張できることはなく、拡張可能な部分は、デバッガーや、Linter、文章編集など限られた範囲でしか行うことができないようになっています。
例えば、拡張機能によって新たな画面や、ボタンを追加することはできません(DOMの操作はできない)。

* [Our Approach to Extensibility](https://code.visualstudio.com/docs/extensions/our-approach)

## 弱点2 設定、デザインツールは含まれない

.NETのプロジェクトファイルを、mavenの設定を編集するためのGUI画面や、ASP.NET等の画面デザインツールは、今の拡張機能では作ることはできません。
それらはテキストベースで入力し、拡張機能によってあくまでテキストベースの入力支援や、Linterによって入力ミスを指摘する機能しかありません。

## 弱点3 デバッグやタスクの実行には専用の設定ファイルを用意する必要がある

.NETやJavaのIDEのように、プロジェクトの作成と同時にデバッグを開始はできず、専用のjson形式の設定ファイルを記述する必要があります。

## 弱点4 ディレクトリの文脈を読まない

VSCodeを起動後、作業ディレクトリを指定すると、ディレクトリ下のファイルを全てをディレクトリツリーで表示します。例えば、ソースコードに関連する設定ファイルや生成ファイルがあったとしても、全てのファイルをそのまま表示を行います。VisualStudioやEclipseのJavaのようにディレクトリの文脈に応じた表示はできません。

## 弱点5 起動に多少の時間がかかる

VSCodeは起動や、プロジェクトファイルディレクトリの変更には、早くとも2、3秒はかかります。よって、ちょっとした設定ファイルの編集には不向きと思っています。

## 以上

入力補完、Git、デバッグにエッジを向けた、テキストエディタ以上、IDE未満のエディタと言えます。私はSIerでアーキテクトとして開発技術の選定を仕事にしており、IDEにさほど期待できないプラットフォームの場合に、多くの開発者に勧められる良いエディタを探していました。私一人であればVimを拡張すれば済みますが、多くの開発者にVimを強要するわけにはいきません。そんな位置付けにちょうど良いエディタ出してきたのは、さすがMicrosoftだと思います。私自身、VisualStudioCodeをgolangの開発に日々利用しています。

あと、私はVisualStudioCode上でVimの入力をエミュレートする拡張機能を作成しています。最近、他のVim系拡張機能にダウンロード数を抜かれましたが、私のプラグインが一番イケてると思っているので、Vimerの皆さん良ければ使ってやってください。

* `ext install vimStyle`
* [vimStyle | Visual Studio Marketplace](https://marketplace.visualstudio.com/items?itemName=74th.vimStyle)
プログラマの考えが・・身につく本より：数字を表す文字を整数型に変換する

[前回](http://qiita.com/teratera/items/6dfa72d6b5d1e987c2df)の続きから

<h1>問題:数値を最後まで読み終えたことを知る</h1>
これを解決するためにもっと小さな問題にしてみるとのこと
書籍はこちら[『プログラマの考え方がおもしろいほど身につく本　問題解決能力を鍛えよう！』](http://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%81%AE%E8%80%83%E3%81%88%E6%96%B9%E3%81%8C%E3%81%8A%E3%82%82%E3%81%97%E3%82%8D%E3%81%84%E3%81%BB%E3%81%A9%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8F%E6%9C%AC-%E5%95%8F%E9%A1%8C%E8%A7%A3%E6%B1%BA%E8%83%BD%E5%8A%9B%E3%82%92%E9%8D%9B%E3%81%88%E3%82%88%E3%81%86%EF%BC%81-%E3%82%A2%E3%82%B9%E3%82%AD%E3%83%BC%E6%9B%B8%E7%B1%8D-%EF%BC%B6%EF%BC%8E%EF%BC%A1%EF%BD%8E%EF%BD%94%EF%BD%8F%EF%BD%8E-%EF%BC%B3%EF%BD%90%EF%BD%92%EF%BD%81%EF%BD%95%EF%BD%8C-ebook/dp/B00MB2STXK?ie=UTF8&keywords=%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E&qid=1460663927&ref_=sr_1_5&sr=8-5)
<h1>問題：数字を表す文字を整数型に変換する</h1>
>ユーザーが入力する0から9までの数字を表す文字を受け取るプログラムを書こう。受け取った文字をそれと同じ数字（０から９までの範囲）に変換し、変換後の数字を結果として表示する。

このような内容になっており解答例ではASCII文字コードの文字列数値と整数値の差が常に48あることを利用して引き算をしていました。
(文字列0の場合、"7"は文字コード55で求めたい整数値7なのでその差48とのこと)

この解答として描かれているC++

```c++
char digit;
cout << "Enter a one-digit number: ";
cin >> digit;
int sum = digit - '0';
cout << "Is the sum of digits " << sum << "? \n";
```

<h2>自分の解答</h2>

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

###def number(x):
###    print("Enter a one-digit number:",x)
###    digit = ord(x) 
###    sum = digit - ord('0')
###    print("Is the sum of digits:",sum)

###・・・・(ターミナル上での実行結果)
###>>> from ascii import number
###>>> number(str(7))
###Enter a one-digit number: 7
###Is the sum of digits: 7

（以下修正コード記載）//編集コードありがとうございます
from ConsoleOut import cout

def number():
    cout << "Enter a one-digit number: "
    digit = input()
    value = int(digit)
    cout << "The numerical value of the digit is:"+str(valule)+"\n"

・・・・（ターミナル上）
>>> number()
Enter a one-digit number: 7
The numerical value of the digit is:7


```

ASCII文字コードなるものをこの問題で少し勉強した気がします。
でもこのASCII文字コードってほかにどんなシーンで使いどころってあるんでしょうか？
UnicodeとASCIIコードあまり考えずにコピペしてたので考える機会になりました。
【narou4j】なろうAPIのJavaラッパーライブラリをつくった

最近、小説家になろうが流行ってますね（自分だけかも）  

通勤時間になろう、休憩時間になろう、カップラーメンつくっている間になろう、と、もうなろうは人生の一部と言っても過言ではない人がたくさんいるのではないでしょうか？  

しかし、なろうしている時こんなこと思ったことありませんか？
* ランキングが少し物足りない
* もっと簡単に検索したい
* 縦書きで読みたい
* ローカルに保存し管理したい

そんなあなた、自分だけのクライアントを作りたいですよね？
え？APIってなんだか難しそう？
そんなひと、大丈夫です。今回JavaでAPIのラッパーライブラリを作りました。

ライブラリのJavaのバージョンは`jdk1.7.0_79`です。
もちろんAndroidで使えますよ。

# ライブラリダウンロード方法
[ここ](http://search.maven.org/remotecontent?filepath=net/nashihara/narou4j/1.0/narou4j-1.0.jar)からJarファイルをダウンロードできます。
また、Gradleは

```gradle
compile 'net.nashihara:narou4j:1.0'
```

Mavenは

```xml
<dependency>
    <groupId>net.nashihara</groupId>
    <artifactId>narou4j</artifactId>
    <version>1.0</version>
</dependency>
```

で利用できます。

# 使い方
```java
Narou narou = new Narou();
List<Novel> novels = narou.getNovels();
```
デフォルトだと小説20件を新着順で取得します。
Narouオブジェクトにsetほにゃららメソッドでパラメータを与えてからgetNovels()することにより指定したパラメータで小説を取得できます。

```java
例:
Narou narou = new Narou();
narou.setOrder(OutputOrder.TOTAL_POINT);
narou.setLim(300);
List<Novel> novels = narou.getNovels();
```
これだと総合評価の高い順で小説を300件取得できます。

その他によく使いそうなメソッドだけご紹介。
## Nコードを指定して小説を取得
```java
Novel novel = narou.getNovel("ncode");
```

## 取得小説数を指定
```java
narou.setLim(300);
```
小説を300件取得。

## 出力項目を指定
全出力項目[ここ](https://github.com/Nshiba/narou4j/blob/master/src/main/java/narou4j/enums/OfParam.java)に書いてあるとおり。これを取得したい項目のみ指定できる。複数指定することによって複数取得もできる。
デフォルトは全て。

```java
// 小説名、作者名、あらすじのみ取得する場合。
narou.set(new OfParam[]{OfParam.TITLE, OfParam.WRITE, OfParam.STORY});
```
で取得できます。

## 単語検索
指定した単語で検索ができます。

```java
// 「なろう」という単語で検索
narou.setSearchWord("なろう");

// 「なろう」という単語が含まれていないものを検索
narou.setNotWord("なろう");
```
また、検索対象をタイトル、あらすじ、タグ、作者名の4つの中から選択が可能です。
なにも指定しない場合は全てから検索します。
例えば、作者名を指定して検索したい場合は以下のような感じになります。

```java
narou.setSearchWord("なろう");
narou.setSearchTarget(SearchWordTarget.WRITER);
```

## ジャンル指定
取得する小説のジャンルを指定できます。

```java
// ファンタジーを取得
narou.setGenre(NovelGenre.FANTASY);

// ファンタジーとSFを取得
narou.setGenre(new NovelGenre[]{NovelGenre.FANTASY, NovelGenre.SF});
```

## その他
その他にもなろうAPI側で用意されているものはほとんど使えます。
そのうち全ての説明をGithubに書く予定です。
またJavadocもGithubに上がっているのでそれを見ながら実装してもらえるといいかも。

なにかバグや追加機能ありましたらissueやpull requestお待ちしてます！！
[Githubはここ](https://github.com/Nshiba/narou4j)です！

それではみなさん、よきなろうライフを。
メモ：Googleシート、方眼紙化

備忘録用

* GoogleSpreadSheetを方眼紙っぽく(縦横の長さを同じに)するだけのスクリプト  
* 使い回しがよくわからないので備忘録として…。

```javascript:hougan.gs
function onOpen(){
  var ui = SpreadsheetApp.getUi();
  
  ui.createMenu("方眼紙")
  .addItem("クイック方眼", "quickHougan")
  .addItem("数値入れて方眼", "Hougan")
  .addToUi();
}

// クイック方眼
function quickHougan(){  
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getActiveSheet();

  // 基準として一番上Rowの高さを取得…。
  var size = sheet.getRowHeight(1);
  
  doHougan(size,sheet);
}

// 方眼化実行
function doHougan(size){
  
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  // Rows
  for(var i=1; i<=sheet.getMaxRows(); i++){
    sheet.setRowHeight(i, size);
  }
  
  // Columns
  for(var i=1; i<=sheet.getMaxColumns(); i++){
    sheet.setColumnWidth(i, size);
  }
}

// 数値を入力して方眼
function Hougan(){
  var ui = SpreadsheetApp.getUi();

  var result = ui.prompt(
    "数値を入力して方眼化",
    "1以上の数字を入力してください(デフォルトは21):",
    ui.ButtonSet.OK_CANCEL);
  
  var button = result.getSelectedButton();
  var text = result.getResponseText();
  
  if(button == ui.Button.OK){
    var size = parseInt(text);
    if(size >= 1) {
      doHougan(size);  
    }else{  
      ui.alert("1以上の数字を入力してください。");
    }
  }  
}
```
新人教材用にテストのない FizzBuzz を書いた

引き続き、新人教育を行なっています。
今回はテストについてです。

とはいっても、TDD とか、テストの書き方を教えるわけではありません。
テストがなんの役に立つのか、テストがあるとどんなことが嬉しいのか。
テストを書く上で、まず気をつけなければならないことはなんなのか。

そんなことを学んでもらおうと思いました。
https://github.com/yo1000/notest-fizz-buzz.git

課題では、FizzBuzz を拡張して、Fizz、Buzz の他に、
Dizz、Bizz、Fuzz、Duzz を追加して、確認しなければならないパターンを増やしています。

# 環境
* ORACLE Java 1.8.0_45

```
$ java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
```

# テストの実行

今回は、テストを書いた後に、Maven などを使用して、テストを実行するだけなので、さして工夫はありません。

```
$ git clone https://github.com/yo1000/notest-fizz-buzz.git
$ cd notest-fizz-buzz
$ ./mvnw test
```

これだけです。
ただし、チェックアウトしてきた直後は、テストがないので、
`./mvnw test` で、テストが実行されることはありません。  
課題を進めるうえで、考えながら書いてもらえればと思います。

# 研修課題

チェックアウトが完了したら、README.md に記載のある通り、エクササイズに取り組んでもらいます。
エクササイズの内容は以下のとおり。

1. `com.yo1000.notest.FizzBuzz` に対して、テストを書きたいです。 
カバレッジは、C1 (分岐網羅) を満たしたいと思います。 
テストを書きはじめる前に、必要なテストパターンの数を算出してみましょう。

2. 膨大なテストパターンを生み出してしまっている原因はなんでしょうか。 
どうしたら、より効率的に C1 を担保できるでしょうか。 
考えて、実践してみてください。

なお、簡単な答案については、`refactor` ブランチ、`refactor-and-testing` ブランチに
それぞれ用意しておいたので、ご参考まで。
`master` のエクササイズに取り組み、`refactor` で答え合わせ＆新たなエクササイズ、
そして `refactor-and-testing` で最終的な答え合わせという形で進めるものです。

ブランチ名からも分かる通り、ただテストに取り組んでもらうというよりは、
リファクタを前提としており、責務との関連性が話のメインになっています。

あくまで効用のひとつにすぎないけど、これでテストがどう役立つのか、 
すこしでも実感持ってもらえるといいなー。
ChatWorkのChrome拡張機能を作ってみた

最近知ったのですが、ChatWorkを使ってる方って意外と多いんですね。
失礼ですが、すごくマイナーなツールだと思ってました本当にごめんなさい。

---

僕は数年前からとある流れで使い始めて、APIの公開や独自のタグなどが公開されるたびに「もっと便利に使えるようにできないかなぁ」と思いながらChatWorkに関する何かを作ったりしてました。

その流れで、（作ってみたとか言いながら）2014年ですが[ChatWork Quick Info Input](https://chrome.google.com/webstore/detail/chatwork-quick-info-input/glmhnchbmjhmjcopmmfamopongifahan)というChrome拡張機能を作って、関係者限定で配布してました。

[coach4pmの中の人](http://media.coach4pm.com/)さんの記事「[ナニコレ便利！チャットワーク記法を1クリックで挿入するChrome 拡張機能](http://media.coach4pm.com/entry/chatwork)」を読んでいただくとわかるのですが、ChatWorkには[メッセージ記法](http://developer.chatwork.com/ja/messagenotation.html)というものがあり、

```
[info][/info]
```
や

```
[code][/code]
```

などで括ると見た目が変わり、情報が見やすくなるんですね。

ただ、これをいちいち入力するのはとても面倒だったので、配布の簡単なChrome拡張として作って配布したところ「Chrome拡張機能で作ったんだから公開してみれば？」というお言葉をいただいたので思い切って公開してみました（2014年ですが）。

ストアのページを見ていただくとわかるのですが、拡張機能をインストールすると入力欄の上にアイコンが追加され、アイコンクリックで各タグが入力欄に自動で入る、というものです。

一応ショートカットも対応していて、ドカドカ入力したい方はショートカット使うことでマウス操作なしでタグを入れて送信！までできてしまいます。

```
■ ショートカットキー一覧
Ctrl+i (Mac,Win)
→ [info][/info]
Ctrl+t (Mac)、Ctrl+Alt+t (Win)
→ [info][title][/title][/info]
Ctrl+w (Mac)、Ctrl+Alt+w (Win)
→ [code][/code]
Ctrl+Alt+l (Mac, Win)
→ [hr]
```

このAltキーを使うのは苦肉の策で、どうしても他のショートカットキーとぶつかってしまうんですね。。
打ちにくいとの声もいただいているので、ちょっと考えなきゃならないポイントだと思ってます。

中身はGitHubに上がっているものそのもの（Closure Compilerで圧縮はしてますが）なので、もしよろしければ使ってみてください！

---

僕もそうなんですが、Macで[Fluid](http://fluidapp.com/)を使っている方はChrome拡張機能を入れることができません。
ので、同じことを実現するにはUserscriptsを手動で追加する必要があります。
ソースは[GitHub](https://github.com/YukiAsano/CW_QuickInfoInput)で公開してますので、[ここ](https://github.com/YukiAsano/CW_QuickInfoInput/blob/master/ChatWorkQuickInfoInput/scripts/core.js)からJavaScriptのコードをコピーして、URLを適切に設定すれば、Chrome拡張と同じ動作が実現できます。

---

別件ですが、PHPからAPIでごにょるライブラリも~~[作ってたりしてます](https://github.com/flame1980/PhatWork)~~。
→どうやら消されてしまったようなので、[そのまま移植しました](https://github.com/YukiAsano/PhatWork)。


```php
// phatwork.phpを読み込んでおく
$pw = PW::getInstance(【APIキー】);
$pw->Rooms->getRoom(【room id】)->setMessages('処理完了！');
```
みたいな使い方ができるので、バッチ処理後の通知とかで使ってみると便利かもしれません。

---

なぜこのタイミングでこのようなことを書いたかは「[ナニコレ便利！チャットワーク記法を1クリックで挿入するChrome 拡張機能](http://media.coach4pm.com/entry/chatwork)」で拙作「[ChatWork Quick Info Input](https://chrome.google.com/webstore/detail/chatwork-quick-info-input/glmhnchbmjhmjcopmmfamopongifahan)」を取り上げていただいたからです。
本当にありがとうございます！
SQL | 分かりにくい JOIN / INNER JOIN / OUTER JOIN / LEFT JOIN / RIGHT JOIN の違い

SQLの JOIN って。
用語がたくさんあって分かりにくいですね。

しかし覚えれば良いのは、**実は次の三つだけ** です。（本当です）

- JOIN 
- RIGHT JOIN
- LEFT JOIN

これ以外のことは **考えなくて大丈夫** です。
なぜなら、あとはすべて **この三つの別名** に過ぎないからです。 

# 分類

- INNER JOIN はなんと、1種類だけです。 (驚きましたか？)
- OUTER JOIN は2種類あります。
  - そして LEFT と RIGHT に分かれます。

![image](https://qiita-image-store.s3.amazonaws.com/0/90607/843b5fd0-3932-ffc9-cfef-8884dca71f28.png)


# JOIN とは

「内部結合」です。
「結合できなかった行」は返しません。

本当の名前は INNER JOIN といいます。
でもそのことは、今は話さなくても良いでしょう。

JOIN はシャイで、優しすぎる。そして世間知らずです。
JOIN には、外の世界のことが分からないのです。

しかしこの世界にひとつしか存在しない、かけがえのないものが JOIN です。

# LEFT JOIN / RIGHT JOIN とは

彼らはどちらも「外部結合」です。
LEFT とか RIGHT とか。大人しいフリしていますが、実は OUTER JOIN の一族です。

本当の名前を LEFT OUTER JOIN / RIGHT OUTER JOIN といいます。
でもそのことは、今は忘れてください。

「結合できなかった行」がある場合も、でもそんなの関係ねえ。
無理やり表示させるので、一部のレコードは NULL になってしまったりします。

LEFT JOIN / RIGHT JOIN には優しさがありません。強引なやつです。
LEFT JOIN / RIGHT JOIN は小さなことなんか気にしないのです。

しかし二人の中でも LEFT JOIN はまだ優しく。「主」のテーブルに従います。
RIGHT JOIN は本当に横暴で。「従」のテーブルを全て返すのです。

# 補足

- 滅多に使わない FULL OUTER JOIN / CROSS JOIN のことは忘れてください。今日は世界から消しました。
- JOIN 関係が覚えにくいのは。根本的に SQL の命名が悪い気がします。
- 正確には短い名前の方が「別名」ですが、でもそんなの関係ねえ。


# 参考

- [SQL の基礎 – JOIN (表結合)の意味の違い](http://www.ecoop.net/memo/archives/2007-11-14-1.html)

# 備考

- [古いアカウントの記事](https://qiita.com/Yinaura/items/3ab6fc49ae55f52e2d55)より移動



<!-- Update From Qiita API -->

# チャットメンバー募集


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

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


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
OnsenUI 2 Beta.10（開発版）を触ってみた

masterブランチのソースを自分でビルドしてアプリに組み込んだらエラーが大量に出た。
また仕様変更か...

# pushPageの仕様変更
Beta.10ではnavigator.pushPageに渡すユーザオプションの呼び方が変わるようだ。
とりあえずの対処としてはこんな感じに書き換える。


```js
// Beta.9まで
//var page = nav.getCurrentPage();
//var options = page.options;

// Beta.10以降
var page = nav.pages[nav.pages.length - 1];
var options = page.pushedOptions;

// おまけ：RC版
// pushedOptionsについては当然リファレンスには載ってない
//var page = nav.topPage;
//var options = page.pushedOptions;


```

あと
`options.onTransitionEnd`
は
`options.callback`
にリネームされている。

これ変更する必要があったのか？

# popPageのバグ修正
pushPageで設定したアニメーションがpopPageにも反映されるようになった。
この他、Android端末で`animation='lift'`を設定した時のバグが解消された。

# ~~ons.notification系全滅~~ （Beta.12で解決済）
~~iPhoneで動かした場合、~~

- ~~ons.notification.alert~~
- ~~ons.notification.confirm~~
- ~~ons.notification.prompt~~

~~を呼んでもダイアログが表示されなくなった（Androidでは動く）。~~

# 結局どうなの？
コアな部分に手が加えられているためか、現状は不安定。
ヘタするとBeta.9より悪化しているかもしれないのでリリース版を待つのが正解。
自作のハイブリッドアプリの起動速度が遅いです


SenchaTouch+Cordovaで作成したアプリの起動速度を調整してみました。
iOSアプリの場合はまだいい感じではありますが、Androidアプリの場合は結構時間がかかります。


## 対応前後の起動時間
対応前 : 14秒
対応後 : 3.6秒


## 対応内容

### 1.グラフライブラリの読み込みを後回し

最初にロードしなくてもいい内容のため、2秒後にロードする。

####変更前

```javascript
google.load("visualization", "1", {packages:["corechart"]});
```

####変更後

```javascript
setTimeout(function(){
    google.load("visualization", "1", {packages:["corechart"], callback: function(){}});
}, 2000);

```
※ callbackを追加しないと、画面が真っ白になりました。

### 2.ビューの追加を後回し

最初にロードしなくてもいい内容のため、表示する直前にロードする。

####変更前

```javascript:app/view/Main.js
// 画面表示の際に読み込む
items: [{
    xtype: 'view-common-titlebar',
    title: tl('rate.title', 'レート'),
    items: [{
        align: 'right',
        iconCls: 'refresh',
        action: 'view-rate-btn-reload'
    }]
},{
    xtype: 'view-rate'
}]
```

####変更後

```javascript:app/view/Main.js
// タイトルだけ表示する
items: [{
    xtype: 'view-common-titlebar',
    title: tl('rate.title', 'レート'),
    items: [{
        align: 'right',
        iconCls: 'refresh',
        action: 'view-rate-btn-reload'
    }]
}]
```

```javascript
// メニューを選択するタイミングでアイテムを追加する
panel.add(Ext.create('FXAlert.view.Rate'));
```

## まとめ
細かいことを真剣に調整することで成果を出ていると思います。
結構ご迷惑をおかけいたしました。


## 実装済みアプリ
* [FXAlert - 外為のアラート通知アプリ](http://www.itmarlin.com/page-fx-alert.html) ver.3.3.0
UnityのEditorをRiderにしてみたら快適だった

# 前置き

Unityで開発するときに、Editorは何をつかってますか？
Mono? Visual Studio Code? Xamarin Studio? Sublime? Vim? Emacs?

どれも細かい使い勝手がどうもあわず、
Unityでコードを書くときにはなんか書きにくいんだよなーと感じてました。 
(UIのレスポンスとか、補完とか、検索とか、起動とか、キーバインディングとか、Formatterかけた時の変な改行とか)

そんなときにRiderを試してみて快適だったのでメモ。

# Riderとは？

Jetbrainsが開発している [C#のIDE](http://blog.jetbrains.com/jp/2016/01/13/569) です。

現在はリリース前のpreview段階で、[本家サイト](https://www.jetbrains.com/rider/)で情報登録するとメールが送られてくるので、そこからEAP版がDLできます。

Jetbrainsといえば各言語のIDEで高い評価を得てますよね。
普段Android Studioを触ることが多いのですが、EclipseからAndroidStudioに乗り換えた時と同じような感動を覚えました。
まだEAPですが、触った感じ大抵の作業はバグなく使えているように感じます。

![rider.png](https://qiita-image-store.s3.amazonaws.com/0/15000/d867dbf9-e39d-1057-c1a2-224cc87e8a3d.png)

# 使い方

ProjectRiderを起動して、Openするファイルの対象として、 `.sln` ファイルを選ぶだけでプロジェクトを開けました。

![todo.png](https://qiita-image-store.s3.amazonaws.com/0/15000/c4760214-eb2e-bf81-22e4-b69d48257f87.png)

あとは他のJetbrains系のEditorとおなじ感覚のInterfaceで操作できます。

# まとめ

Riderよいです。
UnityでEditorが気に食わない人はぜひお試しあれ。

[2016/08をリリース目標にしている](http://blog.jetbrains.com/jp/2016/01/13/569)とのことで、正式リリースが楽しみですね。:smile: