OmniAICreator/Qiita-1.07M huggingface dataset:
Amazon LinuxにServerless Frameworkをインストールする

# Node.jsのインストール

```shell-session
[ec2-user@ip-10-0-0-143 ~]$ sudo yum groupinstall 'Development tools' -y
[ec2-user@ip-10-0-0-143 ~]$ curl -O https://nodejs.org/dist/v6.9.1/node-v6.9.1.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 25.2M  100 25.2M    0     0  34.5M      0 --:--:-- --:--:-- --:--:-- 34.5M
[ec2-user@ip-10-0-0-143 ~]$ tar xvf node-v6.9.1.tar.gz
[ec2-user@ip-10-0-0-143 ~]$ cd node-v6.9.1
[ec2-user@ip-10-0-0-143 node-v6.9.1]$ ./configure --prefix=/usr/local
[ec2-user@ip-10-0-0-143 node-v6.9.1]$ make
[ec2-user@ip-10-0-0-143 node-v6.9.1]$ sudo make install
[ec2-user@ip-10-0-0-143 node-v6.9.1]$ node -v
v6.9.1
[ec2-user@ip-10-0-0-143 node-v6.9.1]$ npm -v
3.10.8
[ec2-user@ip-10-0-0-143 node-v6.9.1]$ cd ..
[ec2-user@ip-10-0-0-143 ~]$ rm node-v6.9.1.tar.gz
```

# Serverless Frameworkのインストール

```shell-session
[ec2-user@ip-10-0-0-143 ~]$ sudo su -
[root@ip-10-0-0-143 ~]# npm install -g serverless
[root@ip-10-0-0-143 ~]# serverless

Commands
* Serverless documentation: http://docs.serverless.com
* You can run commands with "serverless" or the shortcut "sls"
* Pass "--help" after any <command> for contextual help

create ........................ Create new Serverless service
install ....................... Install a Serverless service from GitHub
deploy ........................ Deploy a Serverless service
deploy function ............... Deploy a single function from the service
deploy list ................... List deployed version of your Serverless Service
invoke ........................ Invoke a deployed function
invoke local .................. Invoke function locally
info .......................... Display information about the service
logs .......................... Output the logs of a deployed function
remove ........................ Remove Serverless service and all resources
rollback ...................... Rollback the Serverless service to a specific deployment
slstats ....................... Enable or disable stats

Plugins
Create, Deploy, Info, Install, Invoke, Logs, Package, Remove, Rollback, SlStats
[root@ip-10-0-0-143 ~]# serverless -v
1.2.1
```
swiftでc++の資産を使おう

あまりないかもしれませんが、
SwiftからC++のライブラリを呼び出す参考になればと、
C++を呼び出す方法について書いています。
cocos2d-xの資産なんかを転用したいときに使えるかも。

#SwiftからC++を呼び出す方法

実はSwiftから直接C++を呼び出すことはできません。
そこで、objective-Cのラッパー関数を用いてそこからC++を呼び出すことになります。

C++のCppClassのラッパーがobjective-CのObjcClassであったとすると、

```swift:test.swift
import UIKit

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // ブリッジングヘッダでimportすれば、自動的にimportされてるみたい
        let obj = ObjcClass()
        obj.add(10)
        obj.add(20)
        obj.add(30)      
        let arr = obj.getList() 
        print(arr)
    }
}

```
といった記述で、CppClassのSTLのvector<int>に保存するadd関数を呼び出すことにします。
getListは確認用にラッパー関数上で実装されたvector内部をNSArray化する関数です。

ターゲットになるCppClassはこんな感じです。あんまり意味のない内容ですが。。。

```CppClass.h
#include <vector>

class CppClass {
  public:
  std::vector vct;
  void add(int data) { vct.push_back(data); };
}
```

まず、swiftのプロジェクト上でラッパー関数になるObjective-cのファイルを作ります。
IDE上で.mmファイルを生成すると、\<ProjectName\>-Bridinging-Header.hを作るかどうかダイアログが開くので「はい」を選択します。
この中身は空なので、これから作る.mmファイルのヘッダーファイルをimportするように記述します。

```ProjectName-Bridging-Header.h
//
//  Use this file to import your target's public headers that you would like to expose to Swift.
//

#import "ObjcClass.h"
```
ヘッダはこんな感じで。

```ObjcClass.h
#import <Foundation/Foundation.h>

@interface ObjcClass : NSObject
{
    void* _cppObj;    // C++クラスのインスタンスを参照するポインタ
}

-(void)add:(int)data;
-(NSArray*)getList;

@end
```

次にラッパー関数.mmファイルを作ります。

```cpp:ObjcClass.mm
#import "ObjcClass.h"
#include "CppClass.h"

@implementation ObjcClass

-(id)init {
    self = [super init];
    
    if (self) {
        _cppObj = new CppClass();
    }
    
    return self;
}

-(int)add:(int)data {
    CppClass& obj = *static_cast<CppClass*>(_cppObj);
    obj.add(data);
}

-(NSArray*)getList {
   CppClass& obj = *static_cast<CppClass*>(_cppObj);
   NSMutableArray *tmpArray = [NSMutableArray arrayWithCapacity:(obj.vct).size()];
   for (int i=0;i<(obj.vct).size();i++) {
       [tmpArray addObject:[NSNumber numberSithInt:obj.vct[i]]];
   }
   return [NSArray arrayWithArray:tmpArray];
}

@end
```

getListは動作確認のために作った関数なので、add関数だけに注目すればそれほど難しいものではないことは判るかと。また、C++からの戻り値を変換して渡す必要がある場合は参考になるかと思われるので、わざわざ書いてみました。

これで、C++の資産をswiftからも利用できるようになります。
ちょっとラッパー関数を作るのが面倒ですが、まぁ良しとしましょう。
explicit_defaults_for_timestampの設定でデフォルトでONにする

MySQLのログを確認したら、ちらほらこんなワーニングが吐き出されていることがわかった
いずれ、この設定が消えるのかもしれませんが、それにしたって、このワーニングが鬱陶しいので、
使えなくなるまでの間でも、ONにして置きたいと思います。（なんの解決にもなってませんが）

```
2016-11-29T03:31:11.258385Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
```
どーも、timestampのdefault値を設定するのは非推奨ってことなんですかね？


## MySQLのコンソールから、設定をONにする

```
mysql> show global variables like 'explicit_defaults_for_timestamp' ;     
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| explicit_defaults_for_timestamp | OFF   |
+---------------------------------+-------+
1 row in set (0.00 sec)

mysql> SET GLOBAL explicit_defaults_for_timestamp = 1 ;                    
Query OK, 0 rows affected (0.00 sec)

mysql> show global variables like 'explicit_defaults_for_timestamp' ;
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| explicit_defaults_for_timestamp | ON    |
+---------------------------------+-------+
1 row in set (0.00 sec)
```

## my.cnfの設定で起動時にONになるようにする

```
[mysqld]
explicit_defaults_for_timestamp = true
```

いかがでしょうか？
Maximaの使用例：$sqrt(1+x^2)$の積分

以下のセッションは Maxima 5.36.1 で確認した。

#Maximaは逆双曲線関数で答える？

Maxima で $\displaystyle\int_0^1 \sqrt{1+x^2} \, \mathrm{d}x$ を計算すると，

```maximasession
(%i1) integrate(sqrt(1+x^2),x,0,1);
                              asinh(1) + sqrt(2)
(%o1)                         ------------------
                                      2
```

default では $\dfrac{\mathrm{asinh}(1) + \sqrt{2}}2$ を返す。$\dfrac{\log(\sqrt2+1)+\sqrt2}2$ を返してはくれない。

#Option variable `logarc`

これは，global variable の logarc の default value が false であるため。

逆双曲線関数ではなく対数関数で答えてもらうには，logarc を true にすればよい。

```maximasession
(%i2) logarc;
(%o2)                                false
(%i3) logarc:true;
(%o3)                                true
(%i4) integrate(sqrt(1+x^2),x,0,1);
                          log(sqrt(2) + 1) + sqrt(2)
(%o4)                     --------------------------
                                      2
```

#Function `logarc`

関数 logarc の利用も可。

```maximasession
(%i5) logarc:false;
(%o5)                                false
(%i6) integrate(sqrt(1+x^2),x,0,1);
                              asinh(1) + sqrt(2)
(%o6)                         ------------------
                                      2
(%i7) logarc(integrate(sqrt(1+x^2),x,0,1));
                          log(sqrt(2) + 1) + sqrt(2)
(%o7)                     --------------------------
                                      2
```

* * *
おしまい
Google Calendar APIでイベントのidを独自に生成して登録する

# Google Calendarでスケジュール登録するときの問題

GoogleCalendarAPIでは、イベントを登録すると各イベントごとにユニークなidが自動生成されます。(以下イベントidと呼びます)ただし、これだと登録したあとに一度取得しないと登録したイベントidがわからなかったり、複数人で同じイベントを共有する場合に、それぞれでイベントidが違うので、イベント情報が更新された場合など、一括で更新するのが非常にめんどうです。


これらの問題を解決するために、イベント登録時に独自に生成したidを使う手法を取りたいと思います。
rubyでのコードがほぼなかったので、以下に紹介しておきます。

# Google Calendarのイベントidのルール

[Google CalendarのAPIドキュメント](https://developers.google.com/google-apps/calendar/v3/reference/events/insert)によると、イベントidは以下のルールに従う必要があります。

```
Opaque identifier of the event. When creating new single or recurring events, you can specify their IDs. Provided IDs must follow these rules:
characters allowed in the ID are those used in base32hex encoding, i.e. lowercase letters a-v and digits 0-9, see section 3.1.2 in RFC2938
the length of the ID must be between 5 and 1024 characters
the ID must be unique per calendar
Due to the globally distributed nature of the system, we cannot guarantee that ID collisions will be detected at event creation time. To minimize the risk of collisions we recommend using an established UUID algorithm such as one described in RFC4122.
If you do not specify an ID, it will be automatically generated by the server.

Note that the icalUID and the id are not identical and only one of them should be supplied at event creation time. One difference in their semantics is that in recurring events, all occurrences of one event have different ids while they all share the same icalUIDs.
```

イベントidは[RFC2938](https://tools.ietf.org/html/rfc2938#section-3.1.2)で定義されているフォーマットに従う必要があります。
ここだと`Base32encodeで用いられるa-vおよび0-9で構成された5文字以上1024文字以下の文字列`です。


# Rubyでidを生成する
Rubyには`Base32encode`できる関数があるのでそちらを使いましょう。
生成するべき文字列は他のイベントidと衝突する可能性を避けるために出来る限りユニークにする必要があります。(自分たちがコントロールできるカレンダーなら問題ないかもしれませんが本人のprimaryのカレンダーなどだといろんなところからイベントが登録されるため）


ref: http://dnsruby.rubyforge.org/classes/Base32.html

```lib/base32.rb
module Base32
  module_function

  HEX = '[0-9a-v]'

  def encode32hex(str)
    str.gsub(/\G(.{5})|(.{1,4}\z)/mn) do
      full = $1; flag = $2
      n, c = (full || flag.ljust(5, "\0")).unpack("NC")
      full = ((n << 8) | c).to_s(32).rjust(8, "0")
      if flag
        full[0, (flag.length*8+4).div(5)].ljust(8, "=")
      else
        full
      end
    end
  end

  def decode32hex(str)
    str.gsub(/\G\s*(#{HEX}{8}|#{HEX}{7}=|#{HEX}{5}={3}|#{HEX}{4}={4}|#{HEX}{2}={6}|(\S))/imno) do
      raise "invalid base32" if $2
      s = $1
      s.tr("=", "0").to_i(32).divmod(256).pack("NC")[0,(s.count("^=")*5).div(8)]
    end
  end
end
```

```ruby
require 'google/apis/calendar_v3'
  # .....省略... 

  def get_event_uid(event_id)
    unique_id = "event#{event_id}" #seedになるべき文字列
    #末尾の=は不要なので取り除く
    Base32.encode32hex(unique_id).gsub("=","")
  end
  
  def add(event)
    value = {}
    
    #....カレンダーの情報などを設定...
    
    value[:id]        = get_event_uid(event["id"])
    value[:i_cal_uid] = "#{id}@google.com"
    Google::Apis::CalendarV3::Event.new(value)
  end
```


#まとめ
Googleカレンダーのイベントidを独自で生成することができると、わざわざイベントidを保持しておく必要がなく、イベント情報の更新等がある場合に一括で更新が出来るため非常に扱いが楽になります。
Laravel5.2サニタイズメモ

Laravel5.2のbladeでサニタイズメモ。

# 普通にサニタイズ出力

```blade
<?php $hoge = '<b>test</b>'; ?>
{{ $hoge }}
```

→
出力：`&lt;b&gt;test&lt;/b&gt;`
表示：&lt;b&gt;test&lt;/b&gt;
サニタイズされる

# サニタイズしない

```blade
<?php $hoge = '<b>test</b>'; ?>
{!! $hoge !!}
```

→
出力：`<b>test</b>`
表示：<b>test</b>
サニタイズされない（タグのまま）

# 改行しつつサニタイズ


```blade
<?php $hoge = "<b>test</b>\rNewline"; ?>
{!! nl2br(e($hoge)) !!}
```

→
出力：`&lt;b&gt;test&lt;/b&gt;<br>Newline`
表示：&lt;b&gt;test&lt;/b&gt;<br>Newline

改行だけタグで他はサニタイズされる。

# 余談：mail中

サニタイズなしで出力すること。
iPhoneのsafariでmin-heightが効いてない

#iPhoneのsafariでmin-heightが効いてない
端末によっては、min-heightが効かない時があるらしい。
自分のiPhoneでは効いているのが、確認できた。
原因は不明。

今回は、min-heightをメディアクエリーで上書きしようとしていた。
が携帯で見ると、上書きされていなかった。

##対策

```css
element{
min-height: auto;//要らないかも
min-height: inherit;
}
```

これでいけた。
oj 2.18.0 の API変更対応

# TL;DR
- oj 2.18.0 で ``` This changes the API slightly.``` な変更が入った

> Added a separate option for as_json instead of piggy backing on the use_to_json. This changes the API slightly. 

- ```to_json``` をcallするoptionがdefault ```false``` になった
- ```to_json``` のcallを期待する場合は、都度指定するか defualt optionを設定するとよい



# default option

```ruby
require 'oj'

::Oj.default_options = {:mode => :compat, use_to_json: true }

::Oj.dump(value)
```

# 都度

```ruby
require 'oj'

::Oj.dump(value, :mode => :compat, use_to_json: true)
```

# Ref
- https://github.com/ohler55/oj

- :compatモードについて

> :compat mode attempts to be compatible with other systems. It will serialize any Object, but will check to see if the Object implements an to_hash or to_json method. If either exists, that method is used for serializing the Object. Since as_json is more flexible and produces more consistent output, it is preferred over the to_json method. If neither the to_json or to_hash methods exists, then the Oj internal Object variable encoding is used.

- use_to_jsonについて

> :use_to_json [Boolean] call to_json() methods on dump, default is false
ExcelですべてのシートをNアップして印刷するにはPDFで保存してから印刷する

タイトルで終了してるけど（笑）

ファイル
↓
名前を付けて保存
↓
拡張子をPDFにして保存
↓
保存したPDFを開く
↓
印刷メニューから印刷設定して印刷
PowerShellで管理者モードのプロセス起動

通常のコマンドラインからサービスの起動停止ができなかったので調べてみました。
#PowerShellで管理者モードのコマンドプロンプトやPowerShellを起動する。
```PS1:
start-process "cmd.exe" -Verb runas
start-process "powershell.exe" -Verb runas
```
#例）コマンドプロンプトからサービスの起動停止
```PS1:
powershell.exe -command start-process 'cmd.exe' '/c sc start mpssvc' -Verb runas
powershell.exe -command start-process 'cmd.exe' '/c sc stop mpssvc' -Verb runas
```
scコマンドの代わりにnetコマンド、Start-Service、Stop-Serviceでも大丈夫です。

#管理者モードでないと実行できないコマンドレットの実行
ネットワーク関連の設定などで管理者モードでないと実行できない場合はPowerShellから管理者モードでPowerShellを起動してからコマンドレットを実行する。なんか、まわりくどいけどこうするしかないみたい。
例えば、ネットワークアダプタを無効にする時とか。
※"Ethernet"はアダプタ名

```PS1:
powershell.exe -command start-process 'powershell.exe' '-command Disable-NetAdapter -Name "Ethernet" -Confirm:$false' -Verb runas
```
CentOS6.3にPython2.7をyumでインストール

CentOS 6.3にPython2.7をyumでインストールしてみました。

ちょっとだけ躓いたので一応記録。

元ネタはこちら。

https://github.com/h2oai/h2o-2/wiki/installing-python-2.7-on-centos-6.3.-follow-this-sequence-exactly-for-centos-machine-only



# リポジトリ追加
まず、リポジトリの追加を行います。

`yum -y  install centos-release-scl`



# Python2.7のインストール
続いてPython2.7をインストールする。

`yum -y install python27`


# 環境の設定等
筆者の場合、インストール先が

`/opt/rh/python27/root`

以下に必要なものが全てインストールされたので、このままだと実行できません。

そこで、

`/opt/rh/python27/enable`

に環境設定が書かれているので、これをインポートします。

`. /opt/rh/pytho27/enable`

これで


```
$ python -V
Python 2.7.8
```

となります。


.bash_profileなど入れておくといつでも使えるようになります。
チューニング: ページャ付のWEBページを高速化する

ページャ付のWEBページで発行しているSQLは、書き換えるだけで劇的に高速化できる可能性があります。
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/148310/895adcd6-8022-33f4-4712-f73046388f4a.png)


# 大幅に高速化できる可能性があるケース
ページャ付のWEBページでは、「検索条件に当てはまるレコード全体のうち、表示するレコードは一部分だけ」という性質があります。

このとき、クエリが遅くなる典型的なパターンとして、「DB側でレコード全件取得→プログラム側で現在のページに対応するレコードだけを使用して結果表示」という作り方をしている場合があります。
この場合は無駄にレコードを大量取得してしまっているので、読み取り数も実行時間も大きくなりがちです。

クエリの書き換えだけで大幅に速度改善できる可能性があります。

# チューニング方法
■ 改善前
	「DB側でレコード全件取得→プログラム側で現在のページに対応するレコードだけを使用して結果表示」

```sql
	-- SQLイメージ
	SELECT *
	FROM SomeTable
	WHERE
		SomeCondition = 1
	And SomeFlag = 0
	And ....
	ORDER BY SomeDateTime DESC
```

■ 改善後
	「ROW_NUMBER()を使って最小限のデータをDB側で取得→プログラム側で取得レコードを使用して結果表示」
※検証環境はSQLServerです。ROW_NUMBER()が使えない製品もあるようですね。。

```sql
	-- SQLイメージ
	SELECT *
	FROM (
		SELECT ROW_NUMBER() OVER (ORDER BY SomeDateTime DESC) AS rownumber
		, *
		FROM SomeTable
		WHERE
			SomeCondition = 1
		And SomeFlag = 0
		And ...
	) AS A
	WHERE rownumber BETWEEN 1 AND 100 -- 2ページ目なら 101 AND 200 みたいな感じで、ページ番号ごとにここが変わる。この例だと、1ページあたりの表示件数は100件
	ORDER BY SomeDateTime DESC
```

以上、ページャ使用WEBページでのチューニング例でした。改善前の取得レコード数が多ければ多いほど効果も期待できます。（もちろんWEBページ以外でも適用できます）
DragEventのdataTransferはスクリプトからは設定できない

画像ファイルをドラッグアンドドロップすることで画像がアップロードされる機能のe2eテストを書こうとしたが、 `dataTransfer` プロパティをスクリプトから設定することができなかったため断念した。

ドキュメントにも書かれていた。

> Although, for consistency with other event interfaces, the [DragEvent](https://html.spec.whatwg.org/multipage/interaction.html#dragevent) interface has a constructor, it is not particularly useful. In particular, there's no way to create a useful [DataTransfer](https://html.spec.whatwg.org/multipage/interaction.html#datatransfer) object from script, as [DataTransfer](https://html.spec.whatwg.org/multipage/interaction.html#datatransfer) objects have a processing and security model that is coordinated by the browser during drag-and-drops.
>
> [HTML Standard - 6.7.4 The DragEvent interface](https://html.spec.whatwg.org/multipage/interaction.html#the-dragevent-interface)

また、こちらは明記されていないが、ブラウザのコンソールで試した結果 `ClipboardEvent` の `clipboardData` にも同様の制約がありそう。

## ダメだったテストコード

[Capybara](https://github.com/teamcapybara/capybara) と [Poltergeist](https://github.com/teampoltergeist/poltergeist) を使って、以下のようなテストコードを書いてみたが、 `fakeDropEvent.dataTransfer` が `null` になるためどうやってもダメだった。

```rb
describe 'Drop an image' do
  def drop_image(file_path, drop_area_id)
    id = 'fakeFileInput'
    page.execute_script <<-JS.strip_heredoc
      var fakeFileInput = document.createElement('input');
      fakeFileInput.id = '#{id}';
      fakeFileInput.type = 'file';
      document.body.appendChild(fakeFileInput);
    JS
    attach_file(id, file_path)
    page.execute_script <<-JS.strip_heredoc
      var fakeDropEvent = document.createEvent('DragEvent');
      fakeDropEvent.initEvent('drop', true, true);
      fakeDropEvent.dataTransfer = {
        files: document.getElemnetById('#{id}').files
      };
      document.getElemnetById('#{drop_area_id}').dispatchEvent(fakeDropEvent);
    JS
  end

  subject do
    drop_image(
      Rails.root.join('spec/fixtures/files/icon.png'),
      'dropzone'
    )
  end

  it 'creates an Image', js: true do
    visit new_article_path
    expect { subject }.to change(Image, :count).by(1)
  end
end
```

## 参考にしたサイト

- [testing - How do you test uploading a file with Capybara and Dropzone.js? - Stack Overflow](http://stackoverflow.com/questions/32880524/how-do-you-test-uploading-a-file-with-capybara-and-dropzone-js)
- [初心者大歓迎！RSpec 3でドラッグアンドドロップ機能をテストする方法(スクリーンキャスト付き) - Qiita](http://qiita.com/jnchito/items/bdd80c1085fa082e7d7a)
iffは何か？


# iffはtypoではない

次のようなツイートを見かけました。
https://twitter.com/hsbt/status/803029203968851969

> Ruby も iff という typo を直した、というのが半年に一回は来る http://bit.ly/2gN3TJz 


知ってて当然のように言われている`iff`とは一体なんでしょう？
私は知りません。知らないものは調べたくなります。

# iff means if and only if

リンク先を見ると

https://github.com/ruby/ruby/pull/1466
> iff is not a typo. iff means if and only if.

`if and only if`の意だそうです。

# if and only if とは？

知恵袋によると
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12127946207

> A if B で B ならば A
A only if B で AであるのはBであるときに限る（AならばB）
あわせて A if and only if B

英語では、必要十分条件のことを`if and only if`と言うようです。

# iffと略す風習
Wikipediaによると
https://ja.wikipedia.org/wiki/%E5%90%8C%E5%80%A4

> 「if and only if」を略して、iff ともいう

数学の世界では`iff`と略すそうです。

# 感想
半年に一回も、誤解して手を動かしちゃう人がいるなら`if and only if`に書き直した方が多くの人が幸せになれそうな気もします。一方、FORTRANみたいに特定の分野の人しか使わないプログラミング言語であれば、`iff`の方が通りが良さそうです。
WooCommerceのテーブル構成の確認 〜全体像〜 Ver 2.6

# WooCommerceのテーブル構成　〜全体像〜
みなさん、ご存知の通りWooCommerceはwordPressのプラグインです。
ですので、結構WordPressの基本的なテーブルデータを利用しています。

WordPressのテーブル構成の基本に関しては別に記事があると思うので、そちらに任せます。
もし無いようだったら、近いうちに作ろうかな。

取り急ぎ、WordPressの基本構成はご存知だということで話を進めます。

基本的には WooCommerce のテーブル構成を理解するには、「商品」「注文」「顧客情報」「決済」「設定」の大きく5つになると思います。

それぞれを各項目に分けて、ご説明するコンテンツをこちらで作ろうと思います。

1. 商品関連
2. 注文関連
3. 顧客情報関連
4. 決済関連
5. 設定関連

各ページを作成したら、それぞれリンクを増やしていきます。
Cognos Analytics 11.0.5 新機能一覧

**Cognos Analytics 11.0.5が2016年11月23日にリリースされました。**
以下の新機能の概要が、リンク先のサイトにまとまっています。

**Geospatial Analytics**
新しい地図連携の機能が追加されたようです。Mapboxと連携して、RAVE2ベースで実装されるとの事です。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/51b3ee74-3e93-c01e-164d-184f23bdb292.png)

**What’s new in dashboarding**
　ダッシュボードでFramework Managerのパッケージが直接使用可能になったようです。
　前述の地図連携機能がダッシュボードでも使えるようです。
　RAVE2エンジンベースのチャートで、拡大・縮小機能が使えるようです。
　ナビゲーションパスという機能で、ドリルダウンの機能に似ていますが、事前に階層構造をFMでセットしておく必要もなく、データモジュールでパス対象のグループを登録しておくと、自由なドリル動作ができるようです。
　
**Storytelling enhancements**
　ストーリーの機能でも、グラフの見せ方や、アニメーションの機能、全体のストーリーの概要を見せる機能が追加されているようです。

**Modeling enhancements**
　データモジュール同士をリンクさせる機能が付与されました。
![image](https://qiita-image-store.s3.amazonaws.com/0/147246/ef4192ce-644c-e29c-7993-bbfbf2ca3c34.png)
　ナビゲーションパス先のデータアイテムをグループ化して定義しておく機能が追加されたようです。
　Framework Managerのパッケージがデータモジュールのソースとして使用可能になりました。
　テーブル単位でのデータ取り込みができるようになりました。

**Reporting enhancements**
　RAVE2というRAVEが新しいエンジンに変わりました。
　~~これまでのチャートの機能は廃止され、RAVE2に一本化されたようです。~~
 **\<2016/12/28訂正>**
　これまでにチャートの機能の**アイコン**は廃止されました。詳細は下記を参照。
　　**Cognos Analytics 11.0.5 のチャート（グラフ）の機能**
　　http://qiita.com/shinyama/items/55d61471c6b1f8504f2e
　RAVE2のテンプレートは各リリース毎に新規に組み込まれているようですが、インポートも可能のようです。
　各レポートをURL呼び出しできるようになりました。外部からiFrameなどで呼び出しもこれで可能になりました。
　プロンプトの見た目が変わりました。元の見た目を使用したい場合は、プロパティから変更可能なようです。
　フィルター設定のウィンドウの見た目が変わりました。

**Sharing and embedding content**
　前述の各コンテンツをURL呼び出し可能になった話のようです。

**Role customization**
　11.0.4からリリースされていた、テーマのカスタマイズの機能が、役割の単位に設定できるようになりました。

**New data sources**
　データソースのサポートが拡張されました。
　　Snowflake
　　Pivotal HDB
　　Amazon Aurora

## Announcing the latest Release (11.0.5) of Cognos Analytics
https://www.ibm.com/communities/analytics/cognos-analytics-blog/announcing-the-latest-release-11-0-5-of-cognos-analytics/

11.0.4の新機能は、こちらからご参照下さい。
### Cognos Analytics 11.0.4 新機能一覧
http://qiita.com/shinyama/items/4279ac7d32f54362d2c8
How to fix ADMU3028I: Conflict detected on port 8880 on WebSphere server

****************************************************************************
ADMU3028I: Conflict detected on port 8880. Likely causes: a) An instance of
the server server1 is already running b) some other process is
using port 8880

ADMU3027E: An instance of the server may already be running

****************************************************************************


If you encounter messages above, following steps might help.

1. start cmd.exe

2. cd [WebSphere root directory]\bin

3. stopserver [servername]

4. startserver [servername]
SQLアンチパターン：ID リクワイアド(とりあえず ID)

[SQLアンチパターン](https://www.amazon.co.jp/dp/4873115892/)を読み始めたので、1つ１つ書いてのメモです

# 目的

- 主キーの規約を確立する
 - このパターンは経験がないかも
 - Articles ArticleTags Tags という関係のテーブルは作ったことがあるけれど、ArticleTags にユニーク制約いれたかな...

# アンチパターン

- 全てのテーブルにid列を用いる
- 重複行を許可してしまう
- USING を使用する
 - この関数知らなかった...
- 複合キーは使いにくい


## 用いてもいいパターン

- 一部のオブジェクトリレーショナルマッピング(ORM)フレームワークは、開発をシンプルにするため に、設定より規約(convention over configuration)の原則
 - Railsとか

# 解決策

- わかりやすい列名にしよう
 - 「SQL Programming Style」という本があるらしい
- 規約に縛られない

# まとめ

- 規約は、役立つと思える場合のみ従いましょう。

# 感想

- Rails を使って開発していると id カラムありきで考えてしまうけれど、役立っているのか？について考えておかないとダメ

[![](https://images-na.ssl-images-amazon.com/images/I/41qHKrFZi0L._SX389_BO1,204,203,200_.jpg)](https://www.amazon.co.jp/dp/4873115892/)
ADDA > runtime argument > -grid > Sets dimensions of the computation grid

```txt:My_Environment
Ubuntu 14.04 LTS Japanese Remix
on VMWare Fusion v8.5.2 (4635224)
on OS X El Captian v10.11.4

GNU bash, version 4.3.11(1)-release

gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 
(also for g++)
ADDA v.1.3b6
```

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

In order to increase the number of dipoles, we can use `grid` option.

```
$ ./adda -grid 25
```

```param.c
	{PAR(grid),"<nx> [<ny> <nz>]","Sets dimensions of the computation grid. Arguments should be even integers. In most "
		"cases <ny> and <nz> can be omitted (they are automatically determined by <nx> based on the proportions of the "
		"scatterer). This command line option is not relevant when particle geometry is read from a file ('-shape "
		"read'). If '-jagged' option is used the grid dimension is effectively multiplied by the specified number.\n"
		"Default: 16 (if neither '-size' nor '-eq_rad' are specified) or defined by\n"
		"         '-size' or '-eq_rad', '-lambda', and '-dpl'.",UNDEF,NULL},
```

### correction 

25 should be 26 (even number)
aws-sdkをインストールしようとしたらエラーが出た

gem install aws-sdk -v '~>1'でaws-sdkをインストールしようとしたら
以下のエラーが出た。

```
gem install aws-sdk -v '~>1'
Building native extensions.  This could take a while...
ERROR:  Error installing aws-sdk:
        ERROR: Failed to build gem native extension.

    /usr/bin/ruby2.0 extconf.rb

Gem files will remain installed in /usr/local/share/ruby/gems/2.0/gems/nokogiri-1.6.8.1 for inspection.
Results logged to /usr/local/share/ruby/gems/2.0/gems/nokogiri-1.6.8.1/ext/nokogiri/gem_make.out
```

ググってみたらAWSのec2インスタンス上にaws-sdk(ruby)をインストールしようとしたらnokogiriに阻まれた話などよくあることらしい。

なので以下のコマンドを実行

```
$ yum install libxml2 libxslt libxslt-devel
$ yum install gcc libxml2-devel libxslt-devel ruby-devel
$ gem install nokogiri -- --use-system-libraries
```

再度、gem install aws-sdk -v '~>1'を実行

```
#gem install aws-sdk -v '~>1'
Fetching: aws-sdk-v1-1.66.0.gem (100%)
Successfully installed aws-sdk-v1-1.66.0
Fetching: aws-sdk-1.66.0.gem (100%)
Successfully installed aws-sdk-1.66.0
Parsing documentation for aws-sdk-v1-1.66.0
Installing ri documentation for aws-sdk-v1-1.66.0
Parsing documentation for aws-sdk-1.66.0
Installing ri documentation for aws-sdk-1.66.0
Done installing documentation for aws-sdk-v1, aws-sdk after 27 seconds
2 gems installed
```

うまくいった模様
ODAC.netをxcopyで配布できるか？

調べ中。

主にOracleのHPを中心に調査。

Microsoft OracleClient開発者向けのODP.NET
http://www.oracle.com/technetwork/jp/topics/index-097258-ja.html
日本語ページ

Oracle Data Provider for .NET
http://www.oracle.com/technetwork/jp/topics/dotnet/index-086363-ja.html
日本語ページ。ページの下の技術記事に下記のリンクを発見

 	ODP.NET Xcopy Deployment with Instant Client 2008年11月
 	ODP.NET Xcopy Deployment with Instant Client 2008年9月
　　　　　9月の方は、リンクミスだと思う。

ODP.NET Xcopy Deployment with Instant Client 2008年11月
http://www.oracle.com/technetwork/issue-archive/2008/08-nov/o68odpnet-101744.html
これっぽい。後でじっくり読む。

プレゼン資料。P.28-31にDeploymentのコツがある。
http://www.oracle.com/technetwork/topics/dotnet/tech-info/oow2014-dotnet-best-practices-2331563.pdf

ODP.netのOnline Help。
http://docs.oracle.com/cd/E20434_01/doc/win.112/e23174/InstallODP.htm#i1006221
http://docs.oracle.com/cd/E20434_01/doc/win.112/e23174/InstallODP.htm
なぜか、XCOPYの場合は、README.txtを読めと。
技術英語 > Change the code [only for good reason]. / reason / reasoning

@ Code Complete (No. 17836 / 36077)

> **<font color=red>Change the code only for good reason.</font>**

「xxxしたら動きました」ではなく「xxxという理由で修正した結果、動きました」とするのが正しいかと思う。

<hr>
reasonとreasoningが気になった。

https://www.englishforums.com/English/ReasonVsReasoning/zdgdw/post.htm
> Reasoning is composed of items which are reasons. 
Reasoning is more general, reasons is more concrete/specific.
CakePHP2 をオシャンティに CakePHP3 っぽいデザインにする

## オシャンティな CakePHP3

無理して若い人の言葉を使ってみました。オシャンティとは何ぞや。

それはさておき、まだ懲りずに CakePHP2 を使っています。慣れの偉大さもあるかもしれませんが、開発効率は決して悪くない気がするんですよね。

とはいえ、 CakePHP2 もさすがにちょっと古めかしくなってきたかもしれません。
何が古めかしいって、もちろん CakePHP3 で刷新された ORM の話――ではなく、私がこの場で声を大にして言いたいのは既定のデザインついてなのです。

これですね。

![cake2.png](https://qiita-image-store.s3.amazonaws.com/0/107118/686cb2c3-8dda-0ca1-5e59-d43728413bd0.png)


どこかから「壁紙なんか濃いグリーンなのよ！ 私グリーンって大っ嫌い！」という悲鳴が聞こえてきそうです。

このデザインは CakePHP1 の頃からさして変わっていません。ちなみに CakePHP1 だとこんな感じでした。

![cake1.png](https://qiita-image-store.s3.amazonaws.com/0/107118/832b7323-0b91-d96c-442a-4acbef130414.png)

ひと昔も前にデザインされたわけですから、それは古めかしくもなるってものです。

もしもの話ですが、このデザインだけでもこんな風になってくれたら CakePHP2 の初期開発もぐっと楽しくなるのではないでしょうか？

![cake3.png](https://qiita-image-store.s3.amazonaws.com/0/107118/b2107332-2822-21f2-fb95-e8292ad38e01.png)


そんなもしもが――実はあるのですよ。それが今回ご紹介する Theme プラグインです。

[CakePHP Theme Plugin](https://github.com/chinpei215/cakephp-theme/blob/master/README.ja.md)

日本語の README を用意していますので、インストール方法や使用方法については上記のリンクを参照してください。

## オシャンティに生まれ変わる CakePHP2

実際に Theme プラグインをインストールした後のトップページはこちら。

![home.png](https://qiita-image-store.s3.amazonaws.com/0/107118/11d12fe0-8ae0-00fd-9535-c9f8f293c2d5.png)

ロゴは昔のままにしてみました。個人的にはデデーンという感じの昔のロゴの方が Cake っぽくて好きです。

エラー画面もこんなふうになります。

![error.png](https://qiita-image-store.s3.amazonaws.com/0/107118/4a2c91ca-48b9-c0c2-31b7-e84e2527dcd8.png)

現在は Cake3 テーマしか同梱していませんが、今後 CakePHP4 がリリースされたら Cake4 テーマも作成予定です。

オシャンティに生まれ変わった CakePHP2 で、皆様もぜひ開発を行ってみてください。
stylusのmixin

sassからstylusにmixinを移植する時に、記法が違って少々ハマったのでメモ。

##breakpointのmixin

変数格納用のファイルを用意しておく。

```stylus:_valiables.styl

/*---------------------------------------------
* breakpoints
*---------------------------------------------*/
screen-sm = 768px
screen-md = 992px
screen-lg = 1200px
```

次は汎用的なmixin用のファイルを用意

```stylus:_mixins.styl
breakpoint(bpName)
	for name in bpName
		if name == 'sm'
			@media only screen and (min-width: screen-sm)
				{block}
		if name == 'md'
			@media only screen and (min-width: screen-md)
				{block}
		if name == 'lg'
			@media only screen and (min-width: screen-lg)
				{block}
		if name == 'sm-up'
			@media only screen and (max-width: screen-sm)
				{block}
		if name == 'md-up'
			@media only screen and (max-width: screen-md)
				{block}
		if name == 'lg-up'
			@media only screen and (max-width: screen-lg)
				{block}
```

### 使ってみる
```style.styl
.box
	width: 100%;
	+breakpoint(sm)
		width 100px
	+breakpoint(md)
		width 200px
	+breakpoint(lg)
		width 300px
	+breakpoint(lg-up)
		width 250px
	+breakpoint(md-up)
		width 150px
	+breakpoint(sm-up)
		width 50px
```
コンパイル結果

```css:style.css
.box {
  width: 100%;
}
@media only screen and (min-width: 768px) {
  .box {
    width: 100px;
  }
}
@media only screen and (min-width: 992px) {
  .box {
    width: 200px;
  }
}
@media only screen and (min-width: 1200px) {
  .box {
    width: 300px;
  }
}
@media only screen and (max-width: 1200px) {
  .box {
    width: 250px;
  }
}
@media only screen and (max-width: 992px) {
  .box {
    width: 150px;
  }
}
@media only screen and (max-width: 768px) {
  .box {
    width: 50px;
  }
}
```

## font-sizeをremに変換するmixin
```stylus:style.styl
html
	font-size: 10px
	font-size 62.5%
```

```stylus:_mixins.styl
font-size-px(prop, font_size)
	{prop}: unit(font_size, 'px')
	{prop}: unit(font_size / 10, 'rem')
```
上記のファイルに記述しておく。

### 使ってみる
```stylus:style.styl
html
	font-size: 10px
	font-size 62.5%
// 追記
body
	font-size-px(font-size, 12)
```
コンパイル結果

```css:style.css
html {
  font-size: 10px;
  font-size: 62.5%;
}
body {
  font-size: 12px; // rem非対応のブラウザ用
  font-size: 1.2rem;
}
```
ido-git-grepを作った（仮）

helm-git-grep みたいなものをidoで作ろうと思った。

一応動くけど、インクリメンタルサーチできてないし、Lisp超初心者なので上手くできている自信が無い。

```lisp
(defun ido-git-grep()
  (interactive)
  (setq user-input-line
        (split-string
         (ido-completing-read
          "git-grep:"
          (split-string (shell-command-to-string
                         (format "git grep -n %s" (read-string "keyword:")))
                         "\n"))
         ":"))
  (find-file (nth 0 user-input-line))
  (goto-char (point-min))
  (forward-line (1- (string-to-number (nth 1 user-input-line)))))
```

完成したらMELPAに登録しよう、そこまでいきたい


※とりあえずGitHubにリポジトリ立てた。暇な時に書いていく予定。

https://github.com/acro5piano/ido-git-grep
JavaScriptの初心者へ送る　初心者からのプレゼント

最近**JavaScript**を書くことが多くなったのでこの記事を送ります

##JavaScriptって？

JavaScriptとは結局なんなのでしょうか？
WEB上でインタラクティブな表現する為に開発されたオブジェクト指向のスクリプト言語です。

そう...さっぱり意味が分かりませんね！！

おそらく簡単に言うとサイトの中で動きのある部分はほとんどがJavaScriptで書かれているっていうことですね。(..たぶん)

WEBサイトの外観をより良いものにしたいなと思った時にはぜひJavaScriptを使ってみて下さい。
僕は全然、使い慣れていません。

##functionってなんだ？
JavaScriptに限ったことではありませんが、よく見かけます。この<Font color="red">**function**</font>..

これは関数というものでJavaScriptを書く際は避けては通れないものです。

##関数を定義する3つの方法

・functionによる定義
・Functionコンストラクタによる定義
・関数リテラルによる定義

**functionによる定義**を忘れないように書いておきます。

##functionによる定義
```js
function 関数名(引数) {
  //ここに処理を記述
}
```

ここで言う関数名は**識別子(名前)**を使用してください！

具体的な関数を一つ作ってみます！！

```js
function square(number) {
  return number * number;
}
```

上のものを説明するとsquareはnumberという名前の引数を１つとります。

このsquare関数は、引数(ここで言うnumber)の2乗を返すように指示する一つの文になります。

上の<Font color="red">**return**</font>というものは、関数が返す値を指定している。

そして上の関数を定義した後、どうするのかというと...

そう！呼び出します！！

その呼び出し方がこちらです！！

```js
square(5);
```

上の式の結果は25ですね！！

さらに関数にはスコープやクロージャな知らなければいけない知識があるのでその都度、勉強していきたいと思います！！
macOSアプリをつくる前に知っておくと良い3つの方法論

macOSアプリまたはOS Xアプリを開発しようと思ったとき、どんな方法をとりますか？

今であればXcodeでswift3を使って・・・と考えるのが第一なんだろうと思います。でも、ボクは思いました。確かにプログラミングは楽しいし、新しいプログラミング言語を覚えるのもワクワクする、ただそれがベストな道か？と。

プログラミングの世界は本当に幅広くて、実際の世界とは別にもうひとつの世界が存在しているかのような広い空間の中に生きているような気分になります。次から次に出てくる新しいフレームワークを覚えて、アップデートされた言語仕様を追い続けて、それでいいのかと。

このmacOSアプリをつくる必要が出てきた以前には、Ruby on Railsを使うためにRubyを覚えたり、非同期通信アプリをつくりたくてNode.jsを勉強したり、クローラーをつくるためにPythonに触れてみたり・・・そう、キリがないし、ひとつひとつの深度が浅いまま過ごすことになると気づいたのです。それと同時に、使用する主要言語は2-3言語に絞るのが良いのではないかと考えたのです。

事前の考えとしてこのようなプロセスで、方法論をリサーチしたので、結果的にSwiftを直接書くということを回避することができ、開発効率が上がったように思います。

様々な場面でこのような考えは正しいのではないかと信じていますが、今回はmacOSアプリ制作の選択肢のリサーチ結果をシェアしたいと思います。他にもあるとおもいますが、おすすめの選択肢に絞らせていただきます。

# Xcode - Swift3
![スクリーンショット 2016-12-10 6.03.19.png](https://qiita-image-store.s3.amazonaws.com/0/144150/b8cdb9e0-bffb-1340-b16b-8393525da087.png)
https://developer.apple.com/xcode/
スタンダードな選択肢です。これからiOSアプリの開発やmacOSアプリの開発をメインに行っていく方は、こちらがおすすめです。迷わずSwiftを学習してください。これから紹介する他の選択肢はプラットフォームであるApple社がいつシャットアウトするかわからないという点で安定性に欠けると思いますので、iOS、macOSアプリ専門のエンジニアでいくならこれしかありません。

# Electron - Node.js,Chromium
![スクリーンショット 2016-12-10 6.03.58.png](https://qiita-image-store.s3.amazonaws.com/0/144150/f3263eb7-8922-8722-23ce-aaca47785011.png)
http://electron.atom.io/
JavascriptとHTMLとCSSでmacOSアプリがつくれます。Github社のオープンソースプロジェクトで、同じコードからWindowsアプリを書き出すこともできるクロスプラットフォームという概念のもと設計されています。Github製エディタAtomのアプリもこれでつくられています。残念ながらiOSアプリはつくれませんが、macOSアプリやWindowsアプリならいい感じです。デスクトップアプリを考えている方は有力な選択肢の一つです。ちなみにボクはこれを採用しました。SlackアプリなんかもElectronで作られているというので有名どこですね。

# RUBYMOTION
![スクリーンショット 2016-12-10 6.03.36.png](https://qiita-image-store.s3.amazonaws.com/0/144150/4a56b40a-ae56-126f-44e0-26da183b5388.png)
http://www.rubymotion.com/jp/
RubyでiOS、macOS、Androidアプリがつくれます。これもクロスプラットフォームです。流行に乗ってRuby on Railsをかじった人はそのままこの選択肢が早いと思います。公式サイトの顧客一覧にはSalesforceやBasecampなども紹介されていて、実績もあるようですね。サポートが充実しているみたいなので、企業ユースとかにいいかもしれません。

簡単にではありますが、macOSアプリをつくった際の選択肢をみなさんにご紹介ということで、まとめました。
クロスプラットフォームサービスを見つけたときは、本当に便利だなーと思いました。ご参考まで。
Pythonで和暦フォーマットで日付(datetime)を表示するerajpを公開しました

和暦表示をPythonでやろう！って思ったわけです。平成27年とか。特に誕生日を和暦で表示したく。

調べたら、標準でどうやら、`locale.ERA`ってのがあるんですが、`strfprint`で日本とかだったらH27とか表示するよ！とか書いてあるんですが、`strfprint`のフォーマット見てもそれにあたるものが見当たらず。

ということで、ほかの言語どうなってんのかなぁとおもって、Ruby調べてたら[era_ja](https://github.com/tomiacannondale/era_ja)が便利ぽっく。

ほうほう、それならPython版なさそうだし、作るかって思って作ったのが、[erajp](https://github.com/recruit-mtl/erajp)です。（日本語はjaで日本はjpな気がしたので、jpにした）


https://github.com/recruit-mtl/erajp

まぁ、やってることは大したことないし[era_ja](https://github.com/tomiacannondale/era_ja)を大いに参考させてもらったのですが、

TravisCIでnose使ってテスト書いた動かして、Coveralls使ってカバレッジ表示させて、PyPIに登録してpipでinstallできるようにしてとか一通りそれっぽいことやってみました。面白かった。

ちなみに、こんな感じで使えます。

```
>>> strjpftime()
 'H27.08.05' # now
>>> strjpftime(datetime.datetime(1989, 1, 8)) 
 'H1.01.08'
>>> strjpftime(datetime.datetime(1989, 1, 8), u"%O%E年")
 '平成元年'
```
VisualStudio コピペ JSONをClassとして貼り付けられるtips

# 概要

こんなTweetを見かけたので、さっそくやってみた。
VisualStudioにはJSONをクラスとして貼り付けるという機能があるよ、と。


<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="en" dir="ltr">Tip of the Day! A little reminder of the paste JSON as classes feature in Visual Studio :) There is also &#39;paste XML as classes&#39; <a href="https://t.co/O79D6ZEuwl">pic.twitter.com/O79D6ZEuwl</a></p>&mdash; Iris Classon (@IrisClasson) <a href="https://twitter.com/IrisClasson/status/802912392925642753">November 27, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

# 用意したJSON

```json
    {
        "title":"Harry Potter and the Philosopher's Stone",
        "author":"J.K. Rowling",
		"hoge": {
			"stringField": "piyo",
			"numField": 123,
			"floatField":  20.315,
			"boolField": false
		},
		"tags": ["novel", "story", "magic"],
		"valiableTags": [123, false, "str"],
        "intArray": [1, 2, 3, 4, 5],
        "floatArray": [1.2, 1.3, 1.4, 2.0],
		"date": "2016/11/29T12:34:56.000",
        "year":"1997"
    }
```
| 変数 | 意図 |
|:----|--------|
|hoge | ネストした場合はどうなるか |
|numField | 数値型がどうなるか |
|floatField | 小数点を含む数値の場合どうなるか |
|boolField | 真偽値の場合どうなるか |
|tags | stringの配列だとどうなるか　|
|valiableTags | stringだけでなく、いろんなオブジェクト型が混在する場合どうなるか|
|intArray | intの配列だとどうなるか |
|floatArray | floatの配列だとどうなるか |
|date | 日付を表す文字列だとどうなるか　**※日付の書式については、詳細は下の方に追記あり** |
|year | 数値だけども、文字列として書かれた場合どうなるか |


# いざ、実践

試した環境は、**VisualStudio2015 CommunityEdition**です。

[編集]-[形式を選択して貼り付け(s)]　から[Paste JSON As Classes]を選択します。

![vsc.png](https://qiita-image-store.s3.amazonaws.com/0/111676/34d6699d-6cb3-feb7-3b87-a53cbe635598.png)


貼り付けると、こんなコードが生成されました。

```csharp


public class Rootobject
{
	public string title { get; set; }
	public string author { get; set; }
	public Hoge hoge { get; set; }
	public string[] tags { get; set; }
	public object[] valiableTags { get; set; }
	public int[] intArray { get; set; }
	public float[] floatArray { get; set; }
	public string date { get; set; }
	public string year { get; set; }
}

public class Hoge
{
	public string stringField { get; set; }
	public int numField { get; set; }
	public float floatField { get; set; }
	public bool boolField { get; set; }
}


```
![vsc3.png](https://qiita-image-store.s3.amazonaws.com/0/111676/583866b4-9fcd-5cbe-f655-fddf1457c734.png)


# [追加] DateTimeの確認

コメントでDateTimeもいけました、と。こんなクソみたいな記事にコメントいただけてありがたい限りです。

WikipediaのISO_8601の項目を参考に、以下の文字列を試してみた。

```json
{"date": "2016-11-29T12:00:00.000",
 "date1": "2016-11-29T12:00:00.000Z",
 "date2": "2016-11-29T12:00:00.000+09:00",
 "date3": "2016-092",
 "date4": "2016-11",
 "date5": "20161129",
 "date6": "2016-11-29",
 "date7": "2016-W14-4"
}
```

結果はこちら。
![vsc4.png](https://qiita-image-store.s3.amazonaws.com/0/111676/74b98a1a-a973-136e-b2b8-4b7e13d44e5b.png)

おそらくISO8601に従っていて、日付、時間までそろっていればよさげ。

# まとめ

- ルートはRootobjectという名前になり、ネストされているオブジェクトもクラスになる
- string, int, float, boolといった基本的な型についてはOK
- 日付の文字列については、ISO8601の形式にあわせればDateTimeになる
- 複数要素がある場合、配列として宣言される
- 配列の中身が同じ型で、かつ基本的な型であれば、その型の配列になる
- 異なるオブジェクトが混在する配列だと、object型の配列になる


すでにあるJSONから、モデルの生成などに使えるかも。
たとえば、誰かが作ったelasticsearchのtypeの検索結果から、NESTで使用する際に使うオブジェクトの生成とか。
AjaxアプリケーションでもDjango Debug Toolbarを使いたい

### 最近のサービス構成

最近作ってるサービスでは

- APIサーバー[Django]
- Web, iOS, Android

のように構成することが多く、Djangoはjsonを返すAPIサーバーとして使うことが増えました。

### Django Debug Toolbarが不便である

すると、Djangoで便利だった、Django Debug Toolbarが、便利には動かないのですね。（Django Debug Toolbarは各APIでのパフォーマンスを知ることができる便利なデバッグツールです。SQLの履歴が出るので、主にこれを見ています）



https://github.com/django-debug-toolbar/django-debug-toolbar



もちろん、各APIのURL叩けば動いてくれますが、JSONが表示させるだけなので、

- 何のViewかわかりづらい
- POSTがめんどくさい
- ユーザー認証が面倒くさい

などという問題があります。



<!-- more -->



### REST FrameworkでAPIのフォーム画面を自動生成してもらう

REST Frameworkを使えば、ある程度の見た目やAPIを呼ぶための便利なフォームを提供してくているので見えなくはないのです。



http://www.django-rest-framework.org/



しかし、画面遷移がないため、APIのエンドポイントを覚えておかないといけず、めんどくさいです。

### APIの一覧＆ドキュメントのため、Swaggerを使う

そこで、django-rest-swaggerを使っています。APIが全部みれるので便利です。基本的にはSwaggerのUIで見ることが多いです。



https://github.com/marcgibbons/django-rest-swagger



コードの中にコメントを書いておけば、APIの説明を書けるので、ドキュメントの代わりとして使っています。モックとしても便利ですね。

また、フォームにはデフォルト値も設定しておけるので、REST Frameworkでフォームにいちいち値をいれる、めんどくささから開放されます。

しかしこの画面は、AjaxでAPIを呼んでるのでDjango Debug Toolbarは動きません。残念！

### Ajaxでも動いてくれるDjango Debug Toolbarを探す

また、最近のWebは、AjaxでAPIを複数回呼ぶので、1APIというより1画面で、Djangoのパフォーマンスを知りたいです。

そして、探していたら、見つけました！



https://github.com/recamshak/django-debug-panel



Chromeのエクステンションでツールが提供されており、Ajaxで呼んだAPIの履歴も各ページごとにキャッシュしてくれます。（使用イメージはChromeストア見てください）



https://chrome.google.com/webstore/detail/django-debug-panel/nbiajhhibgfgkjegbnflpdccejocmbbn



便利だ！これでAPIサーバーとWebが別れていても、Django Debug Toolbarの恩恵が受けられます！
最高！
Djangoのauto_nowなのにアップデートされないことがある

Djangoのモデルには、`DateTimeField`があり、その引数として、

- `auto_now_add` : create時に現在時刻を入れる
- `auto_add` : save時に現在時刻を入れて更新する

という便利な機能があります。よく

```python
class User(models.Model):
     name = models.CharField()
     created = models.DateTimeField(
        auto_now_add=True
     )
     updated = models.DateTimeField(
        auto_now=True
     )
```

のような形で定義して、使っています。

### auto_nowで更新される

このようなフィールドを持ったモデルで

```python
user = User.objects.create(name="kasajei")
print(user.created)
>>> 現在時刻
print(user.updated)
>>> 現在時刻
user.name = "kasajei2"
user.save()
print(user.updated)
>>> 保存した時刻
```

となり、updatedには現在の時刻を設定して、saveしなくてもDjangoが値を入れて更新してくれます。便利！

### auto_nowなのに、更新されない

しかし、たまーに、更新されないなぁと思っていたら、以下の用に、`update`で引数を指定するようなケースでは更新をしてくれないみたいです

```python
user.name="kasajei3"
user.save(update_fields="name")
print(user.updated)
>>> 更新されてない！！
```
他にも、

```python
User.objects.filter(name="kasajei").update(name="kasajei2")
user = User.objects.get(name="kasajei2")
print(user.updated)
>>> 更新されてない！！
```

なども更新されません！

ちゃんと発行されているSQL見ればわかるのですが、`auto_now`を信用しすぎていて、しばらく気づきませんでした。

`auto_now`なんだから、更新してくれてもいいのになぁなんて、思ったりしますが、どうなんでしょう。
シミュレーターでのiOSのプッシュの動作確認にSimulatorRemoteNotificationsが便利！

## iOSシミュレーターでのプッシュ開発

さて本題ですが、iOS開発において、プッシュの動作確認って面倒なんです。
証明書つくって、デバイストークンをログに出して、Pythonかなんかでスクリプト組んで、実機で確認！みたいな。

なので、適当にやってしまいがち（違）ですが、ちゃんとやろうと思って、いろいろ調べていたら、
いいものを見つけました。


https://github.com/acoomans/SimulatorRemoteNotifications


名前のまんまですね！使い方は簡単で、`AppDelegate.m`に

```objc
#import <SimulatorRemoteNotifications/UIApplication+SimulatorRemoteNotifications.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
#if DEBUG
    [application listenForRemoteNotifications];
#endif
    return YES;
}
```

として、あとはターミナルを開いて、

```
echo -n '{"aps":{"alert":"message", "badge":2, "content-available":1 }, "message":"message"}' | nc -4u -w1 localhost 9930
```

と打てばオッケー！

このOSSがアプリ内で、localhostの9930ポートにローカルサーバーを立ててくれて、プッシュのシミュレートをしてくれます。

これで、`- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler`が呼ばれるので、あとはよしなに。

アプリ起動中でも、バックグラウンドでも上記メソッドを呼んでくれるのですが、OSが管理しているところのNotification Centerにプッシュ通知を出してくれたり、アプリアイコンにバッジを付けてくれたりまではしないので、そのあたりのタストはどうしても実機になります。

ただ、これでだいぶと作業が捗ると思います。

## よくあるやつ
タブバーにバッジを付けたい！みたいなやつ。忘れがちなのは、アプリがバックグラウンドで、プッシュが来て、プッシュから起動せずに、アプリアイコンから起動してしまったケース。

バッジは本当は、起動時にサーバーからとるのが一番よい気がしますが、めんどくさいので、バックグラウンドでプッシュが受け取れた場合のみ表示することにしましょう。

```objc
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{ 
    // save userInfo in NSUserDefaults
    completionHandler( UIBackgroundFetchResultNoData );
}
```

みたいに、バックグランドで来た時も`NSUserDefaults`かなんかに保存してから`completionHandler`を呼んでおけば大丈夫ですね。


3年前のstack overflowにも似たような質問があったので、つたない英語で回答（初回答！）

http://stackoverflow.com/questions/12084015/ios-push-notification-how-to-get-the-notification-data-when-you-click-on-the-a/33298866#33298866


ってな感じで、シミュレーターでのプッシュ動作確認のお話でした！
pngquantで減色処理をして画像ファイルを一気に軽くする方法

## pngquantをインストール

```bash
brew install pngquant
```

## 使い方

```bash
pngquant --ext .png --force 256 hoge.png
```



## 一気にファイルを変更する

```bash
find . -type f -name "*.png" -exec pngquant --speed 1 --force --ext .png 256 {} \;
```

これで、大幅に画像ファイルの容量が軽くなります！！

iOSのダウンロード制限が50MBから100MBになったとはいえ、できる限り容量は抑えたいところです。

このpngquantでの減色処理は今までいろんなところで使ってきまいしたが、ほとんど劣化せず容量はとても軽くなるので、とてもお勧めです！！
複数人でcocos2d-xで開発するためにやっておきたい設定

**過去の記事の転載です。情報が古いかもしれません**

---

現在、cocos2d-x-2.0.4を使っていますが、ビルド時など各種ローカルパスがみんなで違っていて、いちいち設定し直す必要があります。。。

これは面倒くさい！

ということで、提案なんですが、統一しませんか？

これをやっておけば、cocos2d-2.0-x-2.0.4/ファイル以下にプロジェクトファイルをおかずに済む！など各種メリットがあります！

## cocos2dxのファイルの設定

cocos2dxのサイトからDLした、ファイルは以下のように起きましょう。

あと、AndroidのNDKも！

```
# cocos2dxのファイルパス
/Develop/cocos2dx/cocos2d-2.0-x-2.0.4
# AndroidのNDKのパス
/Develop/android/android-ndk-r8b
```

`/User/hogehoge/うんちゃらかんちゃら`ではなく、`/Develop/`以下に各種ファイルをおいておけば、みんなパスが一緒でハッピー！

## build_native.shの書き方
そうしておけば、buld_native.shが統一的に書けます。

以下のようなファイル構成にしましょう。iOSとAndroidを開発するときによくやるファイル構成のはず...

- アプリ名
	- Classes
		- cppのファイル達
	- proj.android
		- Androidのファイル
	- Resources
		- 画像ファイル達
- アプリ名.xcodeproj

そして、build_native.shの上のほうの一部は以下のようにしましょう

```
NDK_ROOT=/Develop/android/android-ndk-r8b
COCOS2DX_ROOT=/Develop/cocos2dx/cocos2d-2.0-x-2.0.4
GAME_ROOT="$(cd ../../ && pwd)"
GAME_ANDROID_ROOT=$GAME_ROOT/proj.android
RESOURCE_ROOT=$GAME_ROOT/Resources
```


これで、統一されるはず

## proj.android/jin/Android.mk
あとパスが関わってくるのはAndroid.mkですかね。

```

LOCAL_SRC_FILES := hellocpp/main.cpp \
                ../../Classes/AppDelegate.cpp \
                ../../Classes/HelloWorldScene.cpp

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \
				/Develop/cocos2dx/cocos2d-2.0-x-2.0.4/cocos2dx/platform \
				/Develop/cocos2dx/cocos2d-2.0-x-2.0.4/external \
				/Develop/cocos2dx/cocos2d-2.0-x-2.0.4/external/Box2D
```

こんな感じ。これで、ほとんど環境依存をなくせるのではないでしょうか？


## .gitignoreの設定

まだ、ちゃんとは理解してませんが、とりあえず、こんな感じ

```
# Mac
.DS_Store
# Xcode
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
*.xcworkspace
!default.xcworkspace
xcuserdata
profile
*.moved-aside
DerivedData
.idea/


# Cocos2dx Android
bin
*.so
*.o
*.o.d
```

## それでも、`./build_native.sh`が出来ないとき
上記の.gitignoreを設定していれば、大丈夫だと思いますが、たとえばgitを使わずにファイルを貰った時に、`./build_native.sh`が出来ない場合があります。

以下のようなエラーログが吐き出されます

```
make: No rule to make target `/cygdrive/c/cocos2d-x/AppTest/proj.android/../../cocos2dx/CCConfiguration.cpp', needed by `obj/local/armeabi/objs-debug/cocos2dx_static/CCConfiguration.o'. Stop
```

なんかファイルが残ってい未定なので、以下のファイルを消してやります。

- proj.android/libs/armeabi
- proj.android/obj

これで、もう一度、`./build_native.sh`すれば、できるはず！

参考：http://www.cocos2d-x.org/boards/6/topics/17716

## Eclipseの設定
- build_native.shを設定するやつ

は環境に合わせないといけないので、それだけは仕方ないですね！

## おわりに
このあたりの環境設定なんとか便利になってほしい。。
centosでrawデバイスを使用する

やりたいこと:rawデバイスを作成し、起動時にrawデバイスとlvolをマッピングさせたい
環境:centos 7

そもそも、cent7.2って、まだrawって使えるの？から入った。
そこで、インストール直後の環境で、
`# which raw`
-> /usr/bin/raw
と返ってきたので、一安心。

次に、新しいパーティションを作るべく、
`# fdisk -l`
-> /dev/sdaに、/dev/sda1(/boot)、/dev/sda2(ルートパーティション)があったので、
拡張パーティションを作った。
fdiskのコマンドは忘れていたので、備忘として残す。
`# fdisk /dev/sda`
n -> 新しいパーティション作成
e -> 拡張パーティション作成
このときはパーティション番号を3にした。これで、/dev/sda3が作成完了。
でも、拡張パーティションはそのままでは使えないので、

`# fdisk /dev/sda`
n -> 新しいパーティション作成
l -> 論理パーティション作成
パーティション番号は5にした。
w -> 情報の書き込み

一回リブートして、
`# fdisk -l`で、/dev/sda5がLinuxで見えていたので、成功。

あとは、
`# pvcreate /dev/sda5`
`# vgcreate -s32m vg01 /dev/sda5`
`# lvcreate -L 1G -n lvol01 vg01`
で、lvolを作って準備完了。

`# raw /dev/raw/raw1 /dev/vg01/lvol01`を実行すると、
/dev/raw/raw1:  bound to major 253, minor 4
と出力され、rawデバイスとのマッピング成功。

めでたしめでたし、と思ったのだが、
リブートすると、マッピングが外れてしまう。

どうも、centos6まで存在していたrawdevicesサービスが、
cento7でなくなった模様。

しょうがないので、
active_raw.shを作り、起動時にsystemd経由で呼び出すことにした。
`#!/bin/bash
raw /dev/raw/raw1 /dev/vg01/lvol01`

/etc/systemd/system/active_raw.service
[Unit]
Description = active_raw daemon

[Service]
Type = simple
RemainAfterExit = yes
ExecStart = /root/active_raw.sh

[Install]
WantedBy = multi-user.target

これでやりたいことができた。
本当にcentos7でrawdevicesがないかは、
これから調査かな。

-------追記-------
/usr/lib/udev/rules.d/60-raw.rulesに以下の内容を追記することで、
上のようなsystemctlに登録しなくても、できることを確認。
`ACTION=="add", KERNEL=="dm-4", RUN+="/usr/bin/raw /dev/raw/raw1 %N"`
よかった。
SQLでは「'」をエスケープする際に「''」を使う


SQLでは文字列リテラルとしてシングルクォート(「'」)を利用します。そのため文字列中に何も考えずシングルクォートを混ぜていると、RDBMSが文字としてのシングルクォートと文字列リテラルとしてのシングルクォートを区別できず、エラーになります。

```sql
- これはエラーになる
update tbl set msg = '彼女は'HELLO'といいました' where id = 100
```

__要するにSQLでは文字としてのシングルクォートをエスケープする必要があるということです。__特殊文字のエスケープというとバックスラッシュ(「\」)がよく利用されるイメージがありますが、__SQLにおいてはシングルクォートをエスケープする場合はシングルクォートを2回重ねます。__たとえば上述の例では次のように書くと正常に動作します。

```sql
- これは正常に動く。
update tbl set msg = '彼女は''HELLO''といいました' where id = 100
```

CSVではフィールド内のダブルクオート(「"」)をエスケープする際「""」に変換します。これにちょっと近いかしら(´・ω・`)
アプリの表示領域のサイズを取得する

##画面サイズを取得する
画面のサイズは以下のように取得する。

```swift
 let screenSize = UIScreen.main.bounds
```

##ウィンドウサイズを取得する
実際のアプリケーションの表示領域のサイズを取得したい場合は以下

```swift
let windowSize = UIApplication.shared.keyWindow?.bounds
```
windowのサイズはviewDidAppear以降でないと取得できなかった。

iPadに対応したアプリケーションを作る場合、マルチタスク機能が存在し、ScreenサイズとWindowサイズが等しくない場合があるため、アプリの表示領域のサイズを知りたい場合はWindowサイズを取得すると良い。