OmniAICreator/Qiita-1.07M huggingface dataset:
React NativeでiOS実行時に"CFBundleIdentifier Does Not Exist"となってしまう場合の対処

# 環境

- Xcode 8.0 beta4
- React Native 0.31.0

# 参考

[Issue 8584](https://github.com/facebook/react-native/issues/8584#issuecomment-236366222)

# 現象

上記環境で新規プロジェクトを作成した後、iOSで実行しようとすると以下のようなエラーが出てくる

```
** BUILD FAILED **


The following build commands failed:
	CompileC ${PROJECT_HOME}/ios/build/Build/Intermediates/RCTWebSocket.build/Debug-iphonesimulator/RCTWebSocket.build/Objects-normal/x86_64/RCTSRWebSocket.o RCTSRWebSocket.m normal x86_64 objective-c com.apple.compilers.llvm.clang.1_0.compiler
(1 failure)
Installing build/Build/Products/Debug-iphonesimulator/${PROJECT_NAME}.app
An error was encountered processing the command (domain=NSPOSIXErrorDomain, code=2):
Failed to install the requested application
An application bundle was not found at the provided path.
Provide a valid path to the desired application bundle.
Print: Entry, ":CFBundleIdentifier", Does Not Exist

Command failed: /usr/libexec/PlistBuddy -c Print:CFBundleIdentifier build/Build/Products/Debug-iphonesimulator/ptimer.app/Info.plist
Print: Entry, ":CFBundleIdentifier", Does Not Exist
```

RCTSRWebSocketのコンパイルが失敗しているとの事

# 対処

## XcodeでiOSプロジェクトを開く

プロジェクト直下に"ios"ディレクトリが作られているので、その中の"プロジェクト名.xcodeproj"を開く

## RCTSRWebSocketのプロジェクト設定を開く

ファイル一覧の"Libraries"から"RCTSRWebSocket.xcodeproj"を選択

<img width="246" alt="スクリーンショット 2016-08-14 22.08.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/16913/90589447-c62b-2337-3a02-cb5becb7227e.png">

## コンパイル設定を変更する

フィルターをAllに変更し、"custom compiler flags"と検索する

<img width="872" alt="スクリーンショット 2016-08-14 22.13.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/16913/b6a417cf-530f-f962-c012-701985933b62.png">

"Other Warning Flags"が"-Werror -Wall"となっているがこれを削除する
WCF の IIS ホスティング

#はじめに
いまさらながら、WCFを使えないかと[10 行でズバリ!! サービスの起動の自動化 (WCF の IIS ホスティング) (C#)](https://code.msdn.microsoft.com/10-WCF-IIS-C-d21eddb5/)を試していたがうまく動作しない。
Viausl Studio 2015を使い構築したが、どうにか動作できるようになったので記載する。
簡単にWCFを使えるようになっていた。
#Visual Studio 2010との違い
##Web.config
10行でズバリでは、WCF サービス構成エディタを使って設定をおこなった。
Visual Studio 2015では、Wcf Service アプリケーションを作成すると、下記のようようになっており、サービスの指定がない。

```xml
<?xml version="1.0" encoding="utf-8"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true"/>
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.6"/>
    <httpRuntime targetFramework="4.6"/>
    <httpModules>
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web"/>
    </httpModules>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- メタデータ情報の開示を避けるには、展開する前に下の値を false に設定します -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <!-- デバッグ目的で障害発生時の例外の詳細を受け取るには、下の値を true に設定します。例外情報の開示を避けるには、展開する前に false に設定します -->
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https"/>
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true">
      <remove name="ApplicationInsightsWebTracking"/>
      <add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web"
        preCondition="managedHandler"/>
    </modules>
    <!--
        デバッグ中に Web アプリケーションのルートを直接参照するには、下の値を true に設定します。
        Web アプリケーション フォルダーの情報開示を避けるには、展開する前に false に設定します。
      -->
    <directoryBrowse enabled="true"/>
    <validation validateIntegratedModeConfiguration="false"/>
  </system.webServer>

</configuration>

```
Visual Studio 2015では、個々のサービスの指定は不要で、サービスを追加しても、web.configの修正は必要がないようだ。


##Service の追加
Service1を指定通り変更してもService1がそのまま有効になっていた。
WCF サービスを追加でService2.svcを登録して、関係のないファイルがいくつかできるが、下記のファイルを削除した。

0. Service2.svc.cs
0. IService2.cs

Service2.svcには、下記のように指定した。

```aspx-cs
<%@ ServiceHost Language="C#" Debug="true" Service="WcfServiceLibrary1.OrderService" %>

```
material-uiでDialog内に配置したTextFieldにフォーカスするとガタガタする問題

iOS　Safariでmaterial-uiのDialog内に配置したTextFieldにフォーカスが移ると、ダイアログがガタガタ震える。尋常じゃなく震える。

スクロールがトップにあると震えないみたい。

原因は掴めてないけど、暫定対処として、ダイアログを開く時に `document.body.scrollTop = 0;` とかでスクロールを戻す。

> material-ui 0.15.2 で事象発生。最新は治ってると期待してる。
django-debug-toolbarをVirtualBox/Vagrant環境で利用

#背景
- Djangoの開発におけるデバッグにdjango-debug-toolbarの利用を検討
- VirtualBox環境で作成中のアプリで利用するのに詰まったので実施した設定を記録

#環境
- OS : CentOS 6.4
- Python : 2.6.6
- Django : 1.6
- django-debug-toolbar : 1.3.0
- sqlparse : 0.1.19

#インストール
- インストールの実施
    - djangoのインストールも自動で実行された
    - django 1.6で動くアプリケーションだったため、後にdjango1.6を再インストール

``` 
 # pip install django-debug-toolbar==1.3.0 
```

- インストールの確認
    - 下記記の通り表示されることを確認

```
 # pip freeze
 Django-debug-toolbar==1.3.0
```

#初期設定
- "$PROJECT_DIR/setting.py"の下記項目を編集
    - DEBUG = Trueに変更
    - INSTALLED_APPに'debug_toolbar'を追加
    - INTERNAL_IPSにアクセス元IP(REMOTE_ADDR)を追加

```vim:$PROJECT_DIR/setting.py
...
DEBUG = True

INSTALLED_APPS = (
...
'django.contrib.staticfiles',
'debug_toolbar',  　←　django.contrib.staticfilesより後の行に記述
...
)
...
INTERNAL_IPS = ('192.168.56.1')   ←　サーバへのアクセス元IPを定義。Virtual Boxの場合、GWを経由するので、localからアクセスした場合、GWのアドレスがアクセス元となる。
```

## 参考 : REMOTE_ADDRの確認方法
- 作成済みのhtmlファイルに、request.META.get('REMOTE_ADDR')の値を変数として渡して表示させる。

```py:example_view.py
from django.shortcuts import render,render_to_response
from django.template import RequestContext

def get_client_ip(request):
    return render_to_response('test.html', {
        ip_addr = request.META.get('REMOTE_ADDR'),
    }, Context_instance=RequestContext(request))
```

``` test.html
{{ ip_addr }}
```

#サーバの起動
```
python manage.py runserver 0.0.0.0:8000
```

#ページの確認
- 各アプリケーションのトップページの右側にDebug用のツールバーが表示される。

#インストールで詰まった所
- REMOTE_ADDRをINTERNAL_IPSに追加しないと表示されないこと
- REMOTE_ADDRが127.0.0.1ではなく、VirtualBoxのGWアドレスであること
- sqlparseのVersion（別Versionだと、"Exception Value: process() takes exactly 3 arguments (2 given)"と言ったエラーメッセージが表示される）
【JSP】セッションを使う

###【目的】
JSPにてセッションを使用してデータのやりとりを行う

###【環境】
eclipse 4.4.2 / Java 1.8
JSP / Servlet

###【構成】
 -

###【ポイント】
・JSPの<Font color="red">暗黙オブジェクト</Font>sessionを使う
・セッションでやりとりを行うデータはsetAttribute/getAttributeで設定/取得する

セッションを用いるとサーバー(アプリケーション)内で情報を受け渡しできるようになる。

public void setAttribute(String key, Object value); // キー値に値をセットする
public Object getAttribute(String key); // キーに対応する値を取得する

###【例】
・A.jsp →B.jsp に”e-mail"の値を渡して表示する

\- web-application
   | ・・・
   |- A.jsp
   |- B.jsp

```A.jsp
...
<%
    session.setAttribute("e-mail", "hoge@hoge.jp");
    application.getRequestDispatcher("/B.jsp").forward(request, response);
%>
```

```B.jsp
...
<%
    String eMail = (String) session.getAttribute("e-mail");
    out.println("e-mailアドレス : " + eMail);
%>
```
###【参考】
・[クッキーとセッション](http://www.geocities.jp/sugachan1973/doc/funto62.html)
PHPのスクリプト終了後のデストラクタ実行時のカレントディレクトリは / になる

明示的にオブジェクトを削除していない場合、スクリプトの実行終了後にオブジェクトのデストラクタが呼ばれますが、その際のカレントディレクトリについて調査しました。

```php:working-directory.php
<?php
class Foo {
  function __destruct() {
    echo 'Foo::__destruct : working directory : ' . getcwd() . '<br>';
  }
}

$foo = new Foo();
//$foo = null;
?>done<br>
```

実行結果は下記となり、カレントディレクトリは**ルートディレクトリ**が設定されるようです。

>done
>Foo::__destruct : working directory : /

上記のコメントアウト部分を活かして、$fooを明示的に削除すると、カレントディレクトリはスクリプトの保存されている場所となり、実行結果は下記となります(Ubuntu 14.04にて確認)。

>Foo::__destruct : working directory : /var/www/html
>done
Go言語のgormでORMしてみた（単純検索編）

# 前提
- Go言語そのものに慣れていない
- MySQLはVagrantで適当にCentOS6.6に構築
- MacでGolangの実行環境を整えてトライアンドエラー
- 利用したのは gorm

# いざ実践！
1. サンプルを写経して、実行。
2. 検索結果が取得できない。
3. 他のテーブルを検索するようにしたらWarningが表示された。

```sh:実行結果
$ go run db_connect.go
該当レコードなし

(Error 1054: Unknown column 'sample.deleted_at' in 'where clause')
[2016-08-14 19:47:53]
該当レコードなし
```

## なぜ検索結果が存在しないのか？
- Rubyとかのアクティブレコードベースの概念だけあって、構造体名とテーブル名の関係は単数 <> 複数の形でないといけなかった
- 単数形のテーブル名を利用したい場合は、単数形のオプションを付けないといけなかった
	- db.SingularTable(true)
	- ※テーブル名を別途指定する方法もあるが省略

```sql:誤り箇所1
CREATE TABLE `sample` (
-- 以降省略
```

```go:誤り箇所2
type Sample struct {
// 以降省略
```

## なぜ警告が表示されるのか？
- オブジェクト定義の際に、`gorm.Model`としていた箇所のせいで gorm の推奨カラムが追加されていた

```go:誤り箇所
type Sample struct {
    gorm.Model
    ID   uint
    Name string `gorm:"type:varchar(45);"`
}
```

## 最終的な実行ソース
```go:db_sample.go
// DBアクセスsample.go
package main

import (
	"fmt"

	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql"
)

type Sample struct {
	// メモ：gorm.Modelは構造体で、IDとか勝手に足してくれる存在、CreatedAtとかDeletedAtとか
	// テーブル構造が異なる場合は、自分で専用の構造体を用意しないといけない
	// ただし、SoftDeleteは上手く動かない？（※要調査）
	//	gorm.Model
	ID   uint64 `gorm:"primary_key"`
	Name string `gorm:"type:varchar(45);"`
}

type User struct {
	ID    uint64 `gorm:"primary_key"`
	Email string `gorm:"type:varchar(255);"`
	Name  string `gorm:"type:varchar(45);"`
}

func main() {
	db, err := gorm.Open("mysql", "testuser:testuser@/go_sample?charset=utf8&parseTime=True&loc=Local")
	if err != nil {
		panic("failed to connect database")
	}
	// テーブル名が複数系でない場合、これを指定すること
	db.SingularTable(true)

	// 実行ログ出力
	db.LogMode(true)

	var sample Sample
	var count = 0
	db.First(&sample, 2).Count(&count)

	if count == 0 {
		fmt.Println("該当レコードなし")
	} else {
		fmt.Println("id:" + fmt.Sprint(sample.ID))
		fmt.Println("name:" + sample.Name)
	}

	var user User
	db.First(&user).Count(&count)
	if count == 0 {
		fmt.Println("該当レコードなし")
	} else {
		fmt.Println("id:" + fmt.Sprint(user.ID))
	}
}
```

```sql:ddl_sample.sql
CREATE TABLE `sample` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
```

```sql:ddl_user.sql
CREATE TABLE `user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `email` varchar(255) DEFAULT NULL,
  `name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```

## 残課題
- 件数をわざわざ取得しないで存在しないチェックを行いたい
	- ID == 0 でも良いけれど、美しくない

### TODOリスト
- 複雑な検索結果の取得
- 登録・更新・削除
- トランザクション制御
- リレーションの貼り方、概念的な整理
- デフォルトのカラム構造以外で SoftDelete する方法
- ソースの自動生成

# 参考
[GORM Guides](http://jinzhu.me/gorm/)
[Golangのgormで、カスタマイズしたtime.Timeに差し変える](http://qiita.com/roothybrid7/items/52623bedb45ff0c26a8a)
database.yml の socket は指定しなくてもよい件

## socket 指定を省略できる場合

Rails 4.2 での話（たぶん mysql2 gem を使う他のバージョンの Rails でも同じ）。

```file:config/database.yml
development:
  adapter: mysq2
  encoding: utf8
  username: root
  database: myapp_development
  socket: '/tmp/mysql.sock'
```

実は、この `socket` の行を削除しても動く。

その条件は、`my.cnf` の `client` セクションで、きちんと、

```file:my.cnf
[client]
socket		= /tmp/mysql.sock
```

とソケットへのパスが定義されていて、実際に MySQL サーバに接続できること。

普通、この条件は成立しているだろう。よって `database.yml` にわざわざ socket の指定をする必要はない。

## TCP/IP or Unix ドメインソケット？
`socket` 行を省略すると、TCP/IP でつながるのかな、とも思ったが、実際には、`host` 行を省略しているかぎり、自動的に Unix ドメインソケットが選択されるようだ。

ソースコードをみると、

```
ActiveRecord -> 
mysql2 gem -> 
MySQL ライブラリの mysql_real_connect()
```
と呼び出しが連鎖している。

最終的に呼び出される [mysql_real_connect()](https://dev.mysql.com/doc/refman/5.6/ja/mysql-real-connect.html) は、`host` が `NULL` または `"localhost"` の場合には、Unix ドメインソケットを使用する。

したがって、`database.yml`で `host` の指定を省略すれば、自動的に Unix ドメインソケットが使われることになる。
material-uiでDialog内にTextFieldを置くとフォーカスがおかしくなる問題

material-uiでDialog内に配置したTextFieldに日本語とかを入力しようとすると、変換候補表示前にフォーカスが外れてしまう。
「あした」って入力しようとしても「あ」の時点で入力が確定してしまうので「明日」と変換できない問題。

> 恐らくDialog内に配置した場合のみ発生。普通にTextFieldを使った場合は問題ない。

## 環境

- material-ui 0.15.2

## 問題のある実装

```js
import React, {Component} from 'react';
import RaisedButton from 'material-ui/RaisedButton';
import TextField from 'material-ui/TextField';
import Dialog from 'material-ui/Dialog';
import FlatButton from 'material-ui/FlatButton';

export default class Component extends Component {
  constructor(props, context) {
    super(props, context);

    this.state = {
      open: false,
      title: '',
    };
  }

  handleOpen() {
    this.setState({open: true});
  }

  handleClose() {
    this.setState({open: false});
  }

  handleChange(e) {
    this.setState({
      title: e.target.value,
    });
  }

  render() {
    return (
      <div>
        <RaisedButton label="Show Dialog" onTouchTap={this.handleOpen.bind(this)}
        <Dialog
          title="ダイアログ"
          actions={[
            <FlatButton
              label="キャンセル"
              primary={true}
              onTouchTap={this.handleClose.bind(this)}
            />,
            <FlatButton
              label="OK"
              primary={true}
              keyboardFocused={true}
              onTouchTap={this.handleClose.bind(this)}
              disabled={!this.state.title || this.state.title.length < 1}
            />,
          ]}
          modal={false}
          open={this.state.open}
          onRequestClose={this.handleClose.bind(this)}
        >
          <TextField
            value={this.state.title}
            floatingLabelText="タイトル"
            onChange={this.handleChange.bind(this)}
            style={{width: '100%'}}
          />
        </Dialog>
      </div>
    );
  }
}
```

## 対処方法

TextFieldの`defaultValue`プロパティを使う。

NG)

```js
value={this.state.title}
```

↓

OK)

```js
defaultValue={this.state.title || null}
```

> `defaultValue`に空文字を渡すと`hintText`とか使ってる場合にヒント（placeholder）が表示されないので空文字なら`null`を設定する必要があるので注意。

たぶん Githubのissueは[これ](https://github.com/callemall/material-ui/issues/783)。
Closeされてるから最新（現時点では0.15.4）では治ってるかも？？
Brother Printerの無線LAN設定をしたときのメモ


[DCP-J952N](http://support.brother.co.jp/j/b/downloadtop.aspx?c=jp&lang=ja&prod=dcpj952n
) を使っている。
その時の無線LANの設定に大いに手こずったのでメモ。

## 症状

これまで、MACとDCP-J952Nで、自宅の無線LANを共有して使用していた（インフラストラクチャーモード）。が、ある日ネットワークプリント出来なくなっていることに気づいた。

## やったこと

おかしくなった時の設定が残っているとまずいかと思い、プリンターを初期化した。

1. 設定
2. すべての設定
3. 初期化
4. すべての設定

と進んで、本当に初期化してしまうのか聞かれるので、
”はい”を2秒押し続けて、初期化する。

次に、

1. 設定
2. wifi
3. セットアップウィザード
4. プリンターを接続したい wifiを選択
5. WPS を使うかどうか聞かれるが、”いいえ”と答えて、wifi接続のパスワードを入力する。

以上でプリンターがwifiに接続された。

次に、MAC側の設定。

1. システム環境設定から、プリンター＆スキャナーへと進む
2. もし前の設定が残っていたら、すべてマイナスボタン”ー”を押して削除する
3. プラスボタン”＋”を押して新たにBrother DCP-J952N を追加する
4. 確認のために、なにか印刷してみると良い 


## 感想

以下のマニュアルを大いに参考にしつつ、複数の方法で無線LAN設定を試みた。
- http://download.brother.com/welcome/doc012411/cv_dcp552n_jpn_qsg_lel860047.pdf
- http://download.brother.com/welcome/doc012406/cv_2013_jpn_net_c.pdf


しかし、無線LANはできているっぽいが印刷できない。というような症状が解決できずに、悩んだ。

あとは付属CDでなんとかしてね。的な説明がマニュアル中に散見されたが、それを捨ててしまったことが、今回の設定をめんどくさくした最大の原因のように思う。

プリンタードライバーやスキャナドライバーは配布されているのに、CDの内容まるごと配布されていないというのは、いかがなものかと思った。
CentOS7にChromeをインストール

CentOS7には、Firefoxがインストールされていますが、Chromeを利用したい場合の方法をメモしておきます。RHEL7.xでも同様の方法で対応可能です。

検証環境：RockyLinxu 8.x/9.x , CentOS7.2 x64


## 事前準備
リポジトリファイルを設定

```bash:
vi /etc/yum.repos.d/google.chrome.repo
```

以下の内容を記入して保存

```text:google.chrome.repo
[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
```

情報を反映

```bash:
yum update
```

## インストール方法

```bash:
yum install google-chrome-stable
```

これで、インストール完了
![image](https://qiita-image-store.s3.amazonaws.com/0/85495/ae123035-b730-70e5-e196-7c9e3c8fe383.png)

## root権限で利用するためには

```bash:
vi /opt/google/chrome/google-chrome
```

一番下の行を変更

```bash:google-chrome
else
    exec -a "$0" "$HERE/chrime" "$@" --user-data-dir=~
fi
```



## エラーが出る場合

「ERROR:nacl_fork_delegate_linux.cc(315)」というエラーが出る場合

```bash:
vi /opt/google/chrome/google-chrome
```

一番下の行を変更

```bash:google-chrome
else
    exec -a "$0" "$HERE/chrime" "$@" --no-sandbox --user-data-dir=~
fi
```

※サンドボックスを無効にするとセキュリティの警告が表示されます


（参考）
http://zero-config.com/centos/chrome-001.html
Angular2 Dart - ngFor

# Angular2 Dartにおけるfor文

今回はfor文です。リスト表示などの時に必須になる機能ですね。
`*ngFor`を使って実現します。

今回のソースは[こちら](https://github.com/takayuki-hayashi/angular2-dart-examples/tree/master/angular-example03)です。

## 単純なリスト表示

```dart:app.dart
@Component(selector: 'app', templateUrl: 'app.html')
class App {
  final List<Language> languages = [new Language(1,"Dart"),
                                    new Language(2,"Java"),
                                    new Language(3,"Ruby"),
                                    new Language(4,"Scala"),
                                    new Language(5,"Groovy")];
}

class Language {
  num id;
  String name;
  Language(this.id,this.name);
}
```
上記のようなlanguagesというListを表示させるためのHTML部分は下記になります。

```html:app.html
<div *ngFor="let lang of languages">
    {{lang.id}}:<span style="font-weight: bold;">{{lang.name}}</span>
</div>
```
`let`という変数宣言が必要になります。これはTypeScriptベースで書かれていた影響でしょうね。今後のDart版ではこのあたりの記述が変わる可能性が高そうです。そして
`let [各要素の変数名] of [リスト]`という書き方になります。ちなみに`ngFor`でループ可能な条件はIterable<E>インターフェースを実装しているかどうかになります。

## メソッドを呼び出してリストを取得
フィールド指定だけでなくメソッドを呼び出してリストを取得してループさせることも可能です。

```dart:app.dart
@Component(selector: 'app', templateUrl: 'app.html')
class App {
  final List<Language> languages = [new Language(1,"Dart"),
  new Language(2,"Java"),
  new Language(3,"Ruby"),
  new Language(4,"Scala"),
  new Language(5,"Groovy")];

  List<Language> simpleMethodCall() => languages;

  List<Language> filter(String str) => languages.where((e)=> e.name.contains(str)).toList();
}
```

```html:app.html
<h3>Angular2 Dart *ngFor メソッド呼び出し</h3>
<div *ngFor="let lang of simpleMethodCall()">
    {{lang.id}}:<span style="font-weight: bold;">{{lang.name}}</span>
</div>
<h3>Angular2 Dart *ngFor メソッド呼び出し（引数）</h3>
<div *ngFor="let lang of filter('a')">
    {{lang.id}}:<span style="font-weight: bold;">{{lang.name}}</span>
</div>
```

## ngForにて用意されている便利な変数

画面の繰り返し表示にてよく必要になる変数がngForには用意されています。

| 変数名 | 型 | 内容 |
|:-:|:-:|:-:|
| index | num | 要素の順番（0始まり） |
| first | bool | 最初の要素かどうか |
| last | bool | 最後の要素かどうか |
| even | bool | 要素の順番が偶数かどうか|
| odd | bool | 要素の順番が奇数かどうか |

```html:app.html
<h3>Angular2 Dart *ngFor いろんな変数</h3>
<div *ngFor="let lang of languages; let i=index; let f=first; let l=last; let e=even; let o=odd">
    {{lang.id}}:<span style="font-weight: bold;">{{lang.name}};index={{i}};first={{f}};last={{l}};even={{e}};odd={{o}}</span>
</div>
```
ngForの後に変数宣言が必要になります。この宣言をしない状態で`{{index}}`とかいきなり記述してもエラーになります。
あと、`even`と`odd`は`index`の値を基準にしているので要素の最初では`even`はtrueになります（indexが0なので）

とりあえず今回はこの辺で。
DataMaps - 装飾をstylesheetで実現

# DataMapsの装飾をstylesheetで実現する

SVGでいい感じの地図を実現してくれる、d3.jsを使ったjavascriptのライブラリ
[DataMaps](http://datamaps.github.io/)
![DataMapsの見本画像](https://camo.githubusercontent.com/616985aec757ef7e4592108aa6ad917c7d956524/687474703a2f2f646174616d6170732e6769746875622e696f2f696d616765732f627562626c65732e706e67)

すごくいいライブラリなのだけど、国や半円や円の領域を、javascriptで直接エレメントのstyleを指定しているので、stylesheetで装飾できなかった。

（一部の要素の装飾はjavascriptでstyleタグを出力している様子）

そこで、javascript内のstyleを直接指定している箇所を置換して、stylesheetで装飾できるようにしてみた。

対象のプロパティ

1. fill
1. fill-opacity
1. stroke
1. stroke-width
1. stroke-opacity
1. stroke-linecap
1. opacity
1. font-size
1. font-family

こいつらを

```
.style("fill"
```

から

```
.style("fill_"
```

に置換してやればOK

ちなみにstylesheetで指定する際のSVG内の各要素のセレクタはこんな感じ

|要素|セレクタ|
|---|---|
|国の領域|path.datamaps-subunit|
|半円|path.datamaps-arc|
|円|circle.datamaps-bubble|
|{fillKey}|[data-info*={fillKey}]|

{fillKey}:fillKeyで指定した文字列
UnrealC++ 小道具集

#UE4 UnrealC++小道具集
ここに載っている定型文は全てUnrealC++における重要な機能になります。
UnrealC++を使う上で最低限理解しなければならない一覧で
プログラムを打ってると１時間に何回も頻出することになります。

これを毎回インターネットから検索していると時間的なコストが非常に高くなりますので
Cliborに登録して素早く呼び出せるようにすると非常に便利です。
clibor(http://forest.watch.impress.co.jp/library/software/clibor/)
に登録しておくとCtrl２回でいつでもどこでも呼び出せるようになります。



![Clipboard01.jpg](https://qiita-image-store.s3.amazonaws.com/0/32364/3277771d-9ae1-29fb-b067-21cee69b0a16.jpeg)


## UPROPERTY標準
これを付けておくと変数がBPからアクセスできるようになります。
``` 
UPROPERTY(BlueprintReadWrite, EditAnywhere )
```
##UFUNCTION標準
これを付けておくと関数がBPからアクセスできるようになります。
```
UFUNCTION(BlueprintCallable, Category = "MyHoming")
```

##TArrayイテレータ使用例
TArrayのイテレータの呼び出し方になります。

```
for (auto Iter(TArray.CreateIterator()); Iter; Iter++)
{
}

```

##両対応インタフェース
C++ , BP のどっちからでも実装し、呼び出せるインタフェースの書き方です。
半分はヘッダ、半分はCppファイルにコピペして使います。
ちなみにインタフェースには多数の書き方が有りますが
どれか一つに絞って使用することをお勧めします。

```
#include "EnemyInter.generated.h"

/**
 * 
 */

UINTERFACE(MinimalAPI ,  Blueprintable)
class UEnemyInter : public UInterface
{
	GENERATED_UINTERFACE_BODY()
};

class IEnemyInter
{
public:
	GENERATED_IINTERFACE_BODY()

	UFUNCTION(BlueprintCallable, BlueprintNativeEvent, Category = "MyHoming")
		int Damage();
};

UEnemyInter::UEnemyInter(const class FObjectInitializer& ObjectInitializer)
	: Super(ObjectInitializer)
{

}

int IEnemyInter::Damage_Implementation()
{
	return 0;
}

```
##両対応インタフェースの実行方法
上記インタフェースの使用方法です。
インタフェースは宣言方法同様に様々な使用方法が有ります。
自分のスタイルに合った使用方法で統一する事をお勧めします。

```
AActor *tempActor = Iter->GetActor();
	if (tempActor->GetClass()->ImplementsInterface(UEnemyInter::StaticClass()))
		if(!IEnemyInter::Execute_IsDead(tempActor))
```

##USTRUCT例 
構造体の定義例です。
BPで宣言できる構造体とは別物ですので注意が必要です。

```
USTRUCT(BlueprintType)
struct FFlowerStruct
{
	GENERATED_BODY()
 
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Flower Struct")
	int32 NumPetals;
 
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Flower Struct")
	FLinearColor Color;
 
	UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Flower Struct")
	FVector Scale3D;
};
```

##デリゲート定義例
AComponentでは非常に重要な機能になるデリゲートになります。
AComponent内でイベントを発生させ、Actorで定義するBPを実行するための書き方になります。
これを知ってないとAComponentの良さを半分も使えません。


```
DECLARE_DYNAMIC_MULTICAST_DELEGATE(FMyEventTimer);

	UPROPERTY(BlueprintAssignable )
		FMyEventTimer m_TimerTick;
```

##通常のnativeEvent
Actorを継承したクラス内でこれを定義しておくと
BP側からコードを入れられるようになります。
上のデリゲートはAComponent用
こちらはActor用の定義方法と考えればOKです。

```
UFUNCTION(BlueprintNativeEvent, Category = "ShotLib")
	void Charge(int32 Damage);

void Charge_Implementation(int32 Damage)
{
	// your code here
}
```
##ENUM例
ENUMの例です。
この方法で書いておくとCPPで使うにもBPで使うにも問題なく使用でき
非常に便利です。

```
UENUM(BlueprintType)		//"BlueprintType" is essential to include
enum class EVictoryEnum : uint8
{
	VE_Dance 	UMETA(DisplayName="Dance"),
	VE_Rain 	UMETA(DisplayName="Rain"),
	VE_Song	UMETA(DisplayName="Song")
};
```
##ログ書き込み
デバッグの際にスクリーン上に文字を出すために使用します。
ただし、見た目のわりに非常に重い処理なので本番には残さないよう注意が必要です。

```
if (GEngine)
{
	GEngine->AddOnScreenDebugMessage(-1, TimeToDisplay, Color, Text);
}
 
if (PrintToLog)
{
	UE_LOG(LogTemp, Warning, TEXT("%s"), *Text);
}
```
Bash on Ubuntu on Windows で Emacs をビルドする

### 2016/12/28 追記

[こちらの方法](http://qiita.com/kuro_23/items/d4e84f332dbb57ae9fed#emacsのビルド) なら、ウィンドウサイズまわりの挙動も問題無いようです.

```bash
echo 0 > /proc/sys/kernel/randomize_va_space
sudo apt-get install libperl-dev
sudo apt-get install libgtk2.0-dev
curl -Ss -L https://gist.githubusercontent.com/nanasess/f04cb2a8926c5423e47efec4327b340a/raw/05b8ae147a6a3425f516c574c8d89471f1849bc6/xselect.c.patch | patch -p1
./configure x86_64-pc-linux-gnu --with-x-toolkit=gtk2 --with-libotf --with-m17n-flt --prefix=/usr/local/emacs
make
sudo make install
## Fix dbus session.conf
sudo sed -i 's$<listen>.*</listen>$<listen>tcp:host=localhost,port=0</listen>$' /etc/dbus-1/session.conf

echo 2 > /proc/sys/kernel/randomize_va_space
```

### 2016/11/8 追記

最近の emacs-snapshot なら X 経由で起動できるようです。

```zsh
sudo add-apt-repository ppa:ubuntu-elisp/ppa
sudo apt-get update
sudo apt-get install emacs-snapshot
sudo update-alternatives --config emacs ## and select emacs-snapshot
```

#### See Also

- http://stackoverflow.com/a/39188790/4956633

---



Bash on Ubuntu on Windows で `apt-get install emacs` とすれば、 Emacs をインストールできます。ただし、 [GUI の環境](http://qiita.com/nanasess/items/d944383788c95e075865) で Emacs を起動しようとすると、以下のような Warning で起動できません。

```
(emacs:305): GConf-WARNING **: Client failed to connect to the D-BUS daemon:
Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.
```

どうも、 D-BUS と会話がうまくできないようなので、 `--without-dbus` でビルドすることにします。

### 必要なパッケージのインストール

```
sudo apt-get install libXpm-dev libjpeg-dev libgif-dev libtiff4-dev libncurses5-dev libgtk-3-dev libgnutls-dev libmagick++-dev
```

libgtk-3-dev 以外はお好みで。

### exec-shield の問題の対応

そのまま make すると、 [途中で core dump してしまう](http://eshamster.hatenablog.com/entry/2016/07/03/125925) ので `randomize_va_space` を無効化しておきます。

```
sudo -s
echo 0 > /proc/sys/kernel/randomize_va_space
```

### ビルド

```
curl -LO http://ftpmirror.gnu.org/emacs/emacs-24.5.tar.gz
tar xvzf emacs-24.5.tar.gz
cd emacs-24.5
./configure --with-x-toolkit=gtk3 --without-dbus --prefix=/usr/local/emacs
make
sudo make install
```

指定した `--prefix` にインストールされます。
上記の例の場合、 `/usr/local/emacs/bin/emacs` で起動します。

### 最後に

`randomize_va_space` を元に戻しておきましょう

```
echo 2 > /proc/sys/kernel/randomize_va_space
```

## その他

- Mac の XQuartz から [X11 Forwarding する場合](https://github.com/Microsoft/BashOnWindows/issues/889#issuecomment-244060849) は、 `/etc/ssh/sshd_config` に以下のパラメータを追加します。

```
AddressFamily inet 
ListenAddress 0.0.0.0 
X11UseLocalhost yes
```

`AddressFamily` は `ListenAddress` よりも先に書く必要があります。


## 参考

- https://github.com/Microsoft/BashOnWindows
- http://emacs.tsutomuonoda.com/emacs24-1-compile/
- http://eshamster.hatenablog.com/entry/2016/07/03/125925
- https://lists.gnu.org/archive/html/bug-gnu-emacs/2013-08/msg00853.html
エディタの設定をWin/Mac間でGit管理する(VSCode、Brackets)

SublimeText、Atomなど、クロスプラットフォームで使えるモダンなエディタが増えてきました。
これらはエディタ設定が軽量なテキストファイルになっており、Git管理することでプラットフォーム間で同期や差分管理することができます。

SublimeTextやAtomのお話はよく出てくるので割愛し、BracketsとVSCodeの方法をまとめます。

- SublimeTextの方法
  - [Syncing - Package Control](https://packagecontrol.io/docs/syncing)
- Atomの方法
  - [Atomの設定をGitで管理する| Atom講座 | [Smart]](http://rfs.jp/sb/atom-github/atom10_github.html)

## 条件

- MacOS X El Capitan
- Windows 10 Pro 1709 (Fall Creators Update Insider Preview)
- VisualStudioCode 1.17
- Brackets 1.5

### 準備

Gitをインストールしておきます。Windowsならば[GitHub Desktop](https://desktop.github.com/)と一緒にインストールするのが楽だと思います。Macならば標準で入っています。

WindowsならばPowerShellを管理者権限で起動しておきます。
Macならばターミナルを起動しておきます。

## 基本的な手順

1. 設定ファイルをGit管理し、GitHub等にpushする
1. 特定ディレクトリにcloneする
1. アプリケーションの設定ファイル用ディレクトリからシンボリックリンクを貼る

設定ファイルを配置する場所はどこでも構いません。
ここでは、ホームディレクトリ配下にgitというディレクトリを作り、そこに各エディタの設定をcloneして置いておきます。

### Macの例

```
$ cd /Users/ユーザ名/git/
$ git clone git@github.com:s2terminal/visualstudiocode-usersetting.git
```

例で使っているのは、私が公開している下記の設定ファイルです。適当なリポジトリに変更して下さい。

- [s2terminal/visualstudiocode-usersetting: VisualStudioCodeの設定](https://github.com/s2terminal/visualstudiocode-usersetting)
- [s2terminal/brackets-usersetting: Bracketsの設定](https://github.com/s2terminal/brackets-usersetting)

## Visual Studio Code

### Windows

```ps1
PS > cd "C:\Users\$(Get-Content env:username)\AppData\Roaming\Code"
PS > cmd /c mklink /D User "C:\Users\$(Get-Content env:username)\Documents\git\visualstudiocode-usersetting\User" 
```

必要に応じて `PS > rm .\User\` 等でインストール済みの設定を消しておきます。

### Mac

```
$ cd /Users/ユーザ名/Library/Application\ Support/Code/
$ ln -s /Users/ユーザ名/git/visualstudiocode-usersetting/User ./User
```

## Brackets

### Windows

```ps1
PS > cd "C:\Users\$(Get-Content env:username)\AppData\Roaming\Brackets"
PS > cmd /c mklink brackets.json  "C:\Users\$(Get-Content env:username)\Documents\git\brackets-usersetting\brackets.json" 
PS > cmd /c mklink keymap.json    "C:\Users\$(Get-Content env:username)\Documents\git\brackets-usersetting\keymap.json" 
PS > cmd /c mklink /D extensions  "C:\Users\$(Get-Content env:username)\Documents\git\brackets-usersetting\extensions" 
```

### Mac

```
$ cd /Users/ユーザ名/Library/Application\ Support/Brackets/
$ ln -s /Users/ユーザ名/git/brackets-usersetting/brackets.json ./brackets.json
$ ln -s /Users/ユーザ名/git/brackets-usersetting/keymap.json   ./keymap.json
$ ln -s /Users/ユーザ名/git/brackets-usersetting/extensions    ./extensions
```

## 参考

- [Sublime Text2,3のDropbox, Gitを使った同期の方法 - Qiita](http://qiita.com/matsu_chara/items/b58564bba37e81637057)
- [Bracketsエディタの設定を複数PC環境で同期させる方法](http://nelog.jp/sync-brackets-settings)
Androidの配列化

Cとかと同じようにしようとしたら出来なかったのでメモ程度に

配列であることを示してから内容量を指定するみたいです。

```java
int  test[3];
➝int test[]=new int[3];
```

```java
Button test[3];
➝Button test[]=new Button[3];
```

@solar-arrowさん御指摘ありがとうございます。
json-server に、express ミドルウェアを指定するオプションが追加された

# json-server の紹介

## json-server とは

[json-server](https://github.com/typicode/json-server) とは、コーディング不要で簡単に、REST API の mock サーバーを作成できるツールです。

また、json-server はそれ自体が express application であり、他のスクリプトから module として使用することで、json-server を自由に拡張することが可能です。

## json-server の使い方

まず、`db.json` を作成します。 json-server はこれを元に API を作成します。

```db.json
{
  "posts": [
    { "id": 1, "title": "json-server", "author": "typicode" }
  ],
  "comments": [
    { "id": 1, "body": "some comment", "postId": 1 }
  ],
  "profile": { "name": "typicode" }
}
```

そして、以下のコマンドを実行します。

```sh
$ json-server --watch db.json
```

これでサーバーは完成です。http://localhost:3000 からアクセスできます。

```sh
$ curl -H "Accept: application/json" localhost:3000/posts/1
{ "id": 1, "title": "json-server", "author": "typicode" }
$ curl -H "Accept: application/json" localhost:3000/posts -H 'Content-Type: application/json" -d '{ "title": "new data", "author": "zakuro" }'
{ "id": 2, "title": "new data", "author": "zakuro" }
$ curl -H "Accept: application/json" localhost:3000/posts/2
{ "id": 2, "title": "new data", "author": "zakuro" }
```

# これまでの json-server

## cli ツールと module の乖離

前述したように、json-server は module として実装されており、その振る舞いを自由にカスタマイズできるという特徴があります。

しかし、現状では `--watch` などの多くの機能は cli ツール部分に実装されており、json-server を module として使用する場合、それらの機能は利用できません。

また、cli ツールのカスタマイズ性はあまり高くないため、認証等の独自機能を利用したい場合は、cli ツールは利用できませんでした。

# これからの json-server
## -m オプションの追加

[#343](https://github.com/typicode/json-server/pull/343) で、-m オプションが追加されました。これによって、cli ツールから任意の express ミドルウェアが使用できるようになりました。

2016-08-14 現在リリースされていないため、この機能を使用するためには `npm install git://github.com/typicode/json-server.git#e9d1da2ab78acfc7c5a7cbcc21edc54d242c3dad` のように直接コミットIDを指定する必要があります。

-m オプションは、ミドルウェアのパスを引数に取ります。内部的には `path.resolve` したものを require してから `express.use` に渡しているので、それが動作するような値であれば指定可能です。

また、-m オプションを複数回指定することで、複数のミドルウェアを指定できます。設定ファイルを使用する場合は、配列を指定することもできます。

```sh
$ cat hello.js
module.exports = function (req, res, next) {
  res.header("X-Hello", "World")
  next() }
$ cat helloJa.js
module.exports = function (req, res, next) {
  res.header("X-Konnichiwa", "Sekai")
  next() }
$ cat config.json
{
  "middlewares": ["hello.js", "helloJa.js"]
}
$ json-server -m hello.js -m helloJa.js db.json
# or
$ json-server -c config.json db.json
```

このオプションの追加によって、cli ツールのカスタマイズ性が非常に高くなります。多くのケースで、json-server を module として使用する必要はなくなるでしょう。cli ツール独自の機能を利用しつつ、認証などの独自機能を実装することが可能です。

# まとめ

- json-server を使えば簡単に REST API の mock が作れる。
- -m オプションの追加で、cli ツールから任意の express ミドルウェアが使用可能になった。
Vimで改行コードを変更する

# 開いたファイルの改行コードを確認する
```vim
:set fileformat?
```
```vim
:se ff?
```

# 改行コードの可視化
## 改行コードを表示する
```vim
:se list
```
## 改行コードを非表示にする
```vim
:se nolist
```

# 改行コードを指定して開く
## LF
```vim
:edit ++fileformat=unix
```
## CRLF
```vim
:e ++ff=dos
```
## CR
```vim
:e ++ff=mac
```

# 改行コードを指定する
## 
```vim
:se ff=dos
```

```vim
:se ff=mac
```

```vim
:se ff=unix
```

# 改行コードを削除する
```vim
:%s/\r//g
```

# シリーズ Vim
* [Vimで文字コードを指定する](http://qiita.com/bezeklik/items/2c9925f9c07762559471)
* [Vimで改行コードを変更する](http://qiita.com/bezeklik/items/aca37ffb127821311d6b)
* [Vimで検索した時のハイライトがウザい](http://qiita.com/bezeklik/items/33ba5b4ef9bd356cbec5)
Dockerコンテナで1ホストからスケールアップできる構成を作る

Dockerを使って1ホストでスモールスタートできる構成を作る。
作りたい構成は普通のWebアプリがホストできるような、DBとWebサーバーが分離していて、ロードバランサがある構成だ。

# 全体の構成

1ホストだけubuntuで適当なクラウドサービスにセットアップする。
Dockerのマルチホストネットワークを利用する構成にする。docker-machineはややこしいので使わない。

参考：
[Get started with multi-host networking](https://docs.docker.com/engine/userguide/networking/get-started-overlay/)
[Build a Swarm cluster for production](https://docs.docker.com/swarm/install-manual/#/prerequisites)

コマンドはdocker-composeを利用してコマンド一発で構築できるようにしたい。
ちなみに、docker-xxが多くて混乱するが、[このスライド](http://www.slideshare.net/zembutsu/introduction-to-docker-swarm)がとても参考になった。

# セットアップ手順

## 事前準備

ホストとなるマシンはでSSHと必要なポート443,80以外は閉じておく。クラスタを構築するホストはローカルで接続されている方がセキュリティ的に無難だし、セットアップが楽だ。
また、ユーザはdockerグループに属してないと、dockerコマンドが打てない。

~~~
usermod -a -G docker ubuntu
~~~

## クラスタ構築

と言いつつ全部1ホストで実施している。

## マネージャの構築

まず、docker-swarmでクラスタを構成する。swarmは複数あるdockerのホストをまとめて管理するためのツールであり、docker-composeをクラスタ構成で使うには必要そうだ。

設定同期のためのconsulコンテナを立ち上げる。

~~~
docker run -d --name consul -p "8500:8500" -h "consul" progrium/consul -server -bootstrap
~~~

swarmのmanagerを立ち上げる。これがdockerのクライアント（dockerコマンド）からの命令を受け付けて、consulに格納された情報を元にクラスタのメンバに命令を転送する。

~~~
docker run -d --name swarm-manager -p 4000:4000 swarm manage -H :4000 --advertise 192.168.1.10:4000 consul://192.168.1.10:8500
~~~

## エージェントの設定

エージェント上で起動するdockerがswarmからコントロール可能なようにTCPでも待ち受けるようにする。エージェントとはmanagerによって操られる側のノードのことだ。
`/etc/default/docker`に1行追加してデーモンを再起動する。ここで`--cluster-advertise` と `--cluster-store`をつけておかないと、ネットワーク作成時に["address space GlobalDefault not found"でエラーになる。](https://github.com/docker/docker/issues/17647)

~~~
DOCKER_OPTS="-H tcp://0.0.0.0:2375 --cluster-store=consul://192.168.1.10:8500 --cluster-advertise=192.168.1.10:2375"
~~~

~~~
sudo systemctl restart docker.service
~~~

エージェントを起動する。

~~~
docker run --name swarm-agent -d swarm join --addr=192.168.1.10:2375 consul://192.168.1.10:8500/
~~~

## ネットワークの作成

overlayドライバでネットワークを作成する。これは特にクラスタなど関係なくやっても良いみたい。

~~~
docker network create --driver overlay --subnet=10.0.9.0/24 my-net
~~~

## おためし起動

コンテナをクラスタで起動できる。

~~~
docker -H :4000 run --net=my-net -it busybox /bin/sh
docker -H :4000 ps
~~~
go 勉強中メモ

## `%` 後の `[i]` でオペランドを指定して print できる

``` go
foo := "aaa"
bar := "bbb"
fmt.Printf("%s %[2]s %[1]s", foo, bar)  // aaa bbb aaa
```


## 配列でインデックスの指定ができる

``` go
foo := [...]string{0: "aaa", 1: "bbb", 2: "ccc"}
fmt.Println(foo)  // [aaa bbb ccc]


const (
        sun = iota
        mon
        tue
)

bar := [...]string{sun: "xxx", mon: "yyy", tue: "zzz"}
fmt.Println(bar)  // [xxx yyy zzz]

baz := [...]int{9: 3}
fmt.Println(baz)  // [0 0 0 0 0 0 0 0 0 3]
```

## ポインタを渡して呼び出し元を変更

``` go
// 関数は元の値のコピーを受け取るため、元の値は変更されない
func nonzero(x [5]int) {
        for i := range x {
                x[i] = 0
        }
}

// ポインタ渡しで元の値を変更
func zero(x *[5]int) {
        for i := range x {
                x[i] = 0
        }
}

func zero2(x *[5]int) {
        *x = [5]int{}
}

func main() {
        foo := [5]int{1, 2, 3, 4, 5}
        fmt.Println(foo) // [1 2 3 4 5]

        nonzero(foo)
        fmt.Println(foo) // [1 2 3 4 5]

        zero(&foo)
        fmt.Println(foo) // [0 0 0 0 0]

        bar := [5]int{1, 2, 3, 4, 5}
        fmt.Println(bar) // [1 2 3 4 5]

        zero2(&bar)
        fmt.Println(bar) // [0 0 0 0 0]
}
```

## スライスの拡張
``` go
number := [...]int{1: 1, 2: 2, 3: 3, 4: 4, 5: 5}
fmt.Println(number) // [0 1 2 3 4 5]

s := number[2:4]
fmt.Println(s)      // [2 3]
fmt.Println(len(s)) // 2
// cap は、スライスの開始位置から基底配列の終わりまでの要素数
fmt.Println(cap(s)) // 4

// スライスの拡張. cap 範囲内であれば、len を超えてスライス作成可能（参照型なので）
fmt.Println(s[:4]) // [2 3 4 5]
```

## スライスが空であるかを検査する場合
``` go
// OK
len(s) == 0

// NG
s == nil
```

## スライスのコピー
``` go
x := []int{0, 1}
y := []int{5, 6, 7, 8, 9}
z := []int{2, 3}

copy(x, y)
fmt.Println(x)  // [5 6]
fmt.Println(y)  // [5 6 7 8 9]
copy(y, z)
fmt.Println(y)  // [2 3 7 8 9]
fmt.Println(z)  // [2 3]


a := []int{5, 6, 7, 8, 9}

copy(a[2:], a[3:])
fmt.Println(a)  // [5 6 8 9 9]
```

## マップの存在確認
``` go
m := map[string]int{"a": 1, "b": 2, "c": 3}

xv, xok := m["xxx"]
fmt.Println(xv)  // 0
fmt.Println(xok) // false

av, aok := m["a"]
fmt.Println(av)  // 1
fmt.Println(aok) // true
```
HTML5 における HTML4 からの変更点

1. はじめに

HTML は 1990 年代はじめに誕生してから今日まで発展を続けています。HTML の機能は仕様書を定義し拡張されることもあれば、ソフトウェアの独自実装により拡張されることもありました。この歴史のなか、実装と製作者の慣習は近づき、仕様書やその他の標準とも合致しました。しかし一方で相違も生まれ続けています。

HTML4 は 1997 年に W3C 勧告となりました。そしてその仕様書は今日も、HTML の機能を大まかに説明する説明書として利用されています。しかしながら、この仕様書は実装同士、また Web 上に存在する莫大な数の HTML 文書に対し、どのように相互運用性を確保するのかという、重要な情報を提供していません。

そして残念ながら、情報の欠如は HTML4 を XML でシリアライズした XHTML1 や、HTML と XHTML に JavaScript API を提供する DOM Level 2 HTML に対しても起こってしまいました。HTML5 はこれらの仕様を置き換える目的で策定されています。[DOM2HTML] [HTML4] [XHTML1]

HTML5 仕様の草案は、2004 年に始められた HTML 実装と Web 上の HTML 文書に対し行った調査結果を反映し、次の要件を掲げています。

HTML5 と呼ばれ、HTML または XML で記述するひとつの言語仕様を定義する。
詳細な処理モデルを定義し、相互運用可能な仕様の実装を手助けする。
文書のマークアップを改善する。
Web アプリケーションのような新しい表現に対しマークアップと API を提供する。
1.1. 未解決の問題

HTML5 は草稿段階の仕様です。HTML5 仕様および、この文書中の HTML5 に関する項目は、現在も HTML ワーキンググループや WHATWG メーリングリストで検討中です。未解決の問題は HTML5 仕様からリンクされています。

1.2. 後方互換性

HTML5 は、現在 Web 上に公開されている HTML 文書について、ユーザーエージェントが後方互換を取るようにと定義しています。HTML5 では、製作者のためオーサリング言語をシンプルにした結果、表象的な要素をはじめとするいくつかの要素や属性が含まれていません。CSS の使用が推奨されるこれらの要素や属性に関しては、後のセクションに詳しい説明があります。

一方で、ユーザーエージェントは古い要素や属性をサポートし続けなければなりません。このため、HTML5 仕様は製作者に対する要件と、ユーザーエージェントに対する要件を明確に分けています。たとえば、製作者は isindex や plaintext 要素を使用することはできませんが、ユーザーエージェントはこれらの要素を Web 上のコンテンツと互換性をとるかたちでサポートする必要があります。

「製作者の要件」「ユーザーエージェントの要件」という2つの適合性要件を定義したことで、要素や属性に「非推奨 (deprecated)」という扱いを行う必要はなくなりました。

1.3. 開発モデル

HTML5 仕様は、少なくとも2つの完全な実装が登場するまでは完成したとみなされません。実装が完全であるかを検証するときにはテストスイートが使われます。このアプローチは、実装される前に最終仕様が承認されていた過去の HTML とは異なります。この変更の目的は、仕様が実装可能であり、また仕様が完成した際にすでに作成者が利用できることを保証することにあります。

2. 構文

HTML5 では、広く使われている HTML4 や XHTML 1 と互換性のある HTML 構文を採用しています。しかしこの構文は HTML4 における、処理命令 や 短縮マークアップ などの難解な SGML の機能とは互換性がありません。ほとんどのユーザーエージェントでサポートされていないからです。HTML 構文を使用する文書のほとんどは text/html メディア型で提供されています。

HTML5 はまた、エラー処理を含む詳細な構文解析規則を定義しています。これらの規則は、既にある実装と多くの部分で互換性を持つように設計されています。ユーザーエージェントは text/html メディア型を持つリソースに対し、これらの規則に従い構文解析を行う必要があります。HTML 構文に適合する文書の例は、次のようなものになります。

<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Example document</title>
  </head>
  <body>
    <p>Example paragraph</p>
  </body>
</html>
HTML5 はまた text/html-sandboxed というメディア型を HTML 構文に対して提供しています。このメディア型は、信頼できないコンテンツをホストする際に利用されます。

HTML5 で使用できるもうひとつの構文は XML です。この構文は XHTML 1 文書および、その実装と互換性をもちます。XML 構文を使用する文書は、XML のメディア型を利用する必要があります。また、XML 仕様にて述べられた規則に基づき、要素は http://www.w3.org/1999/xhtml 名前空間に属する必要があります。 [XML]

次の例は、HTML5 文書の XML 構文に適合する文書の例です。この XML 文書は XML のメディア型、すなわち application/xhtml+xml, または application/xml で提供される必要があることに注意してください。

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Example document</title>
  </head>
  <body>
    <p>Example paragraph</p>
  </body>
</html>
source:http://tweetdig.net/hashtag/html5
golang パッケージについてざっくり理解する。

# Goにおいてのパッケージとは
モジュール性、カプセル化、分離されたコンパイル、再利用をサポートするものです。
それぞれの言葉の意味を掘り下げるとすごい長くなるので、ざっくり言うと、
機能を分離して、ごちゃごちゃな状態にするのをやめよう。そして、必要最低限の公開範囲にしよう。という感じです。


## それぞれのパッケージ同士の公開範囲の設定（export）
個々のパッケージはその宣言に対して名前空間としての機能を果たします。
例として以下のようなものを考えてみました。
足し算パッケージ「add」と引き算パッケージ「sub」があるとします。それぞれに識別子の答えを出す「Ans」があるとします。もし、パッケージ外から識別子が参照するこの関数を指定する時には、明示的に以下のように修飾しなければいけません。

```go:package
add.Ans
sub.Ans
```
	
また、パッケージでは、どの名前がパッケージの外から見えるを制御することができます。
これはとても簡単で、上記に例として書いたAnsは識別次の最初の文字が大文字なので、外部から参照が可能ということになります。

```go:package
Ans		// 外部から参照できる
ans		// 隠蔽されているので、見えない
```

## インポート(import)

次に実際にインポートする例を書いてみると、先程はバラバラになっていた。「Add」と「Sub」パッケージをもし統合したとして、大きな枠の「calc」という計算パッケージがあり、その中に識別子として「Add」と「Sub」に紐づく計算関数があるとします。ディレクトリ構成は以下のような想定とします。

test
|----calc/calc.go
|
|----main.go
　

```go:calc/calc.go
package calc

func Add(atai1 int, atai2 int) int {
	return atai1 + atai2
}

func sub(atai1 int, atai2 int) int {
	return atai1 - atai2
}

```


```go:main.go
package main

import (
	"./calc"	// calcパッケージ
	"fmt"
)

func main() {
	fmt.Println(calc.Add(1, 2))	// 成功
	fmt.Println(calc.sub(1, 2))	// 失敗
}
```

上記のように、別パッケージであってもimportをした上でアクセスが許容されたものは、外部からでも参照することができます。逆に「sub」のように、大文字始まりでないものはアクセスが許容されません。
ここでいくつかポイントがあるので、箇条書きします。

- calcパッケージ内では、Addからsubの参照は可能です。
- calcパッケージではimportされていないfmtという出力系をまとめたパッケージはimportされていないが、import先でfmtを使うことが出来る。

注意点としては、importしたのにそのpackageが使用されていない場合はエラーとなります。
手作業でimportするのが面倒なあなた！goimportsを調べれば幸せになれます。
ちなみに、importするパッケージ名が長かったり、競合が発生する場合は別名していもできます。
【JSP】フォワードする

###【目的】
JSPにて別ページへフォワードする
###【コード】
```
application.getRequestDispatcher("path").forward(request, response) // pathへフォワードする
````
###【環境】
eclipse 4.4.2 / Java 1.8
JSP / Servlet
###【構成】
 -

###【ポイント】
・JSPの<Font color="red">暗黙オブジェクト</Font>applicationを使う
・application.getRequestDispatcher("path").forward(request, response)
→pathへフォワードする、 pathは/からはじまるものを指定する

※フォワードは原理的にサーバ内部のページへ転送するときに用いる。

requestを指定先に送るためrequestDispatcherのオブジェクトを使う。
サーブレットのコードならば以下のようになる。

```example.java
...
public void doGet(HttpServletRequest req, HttpServletResponse resp){
  throws IOException, ServletException{
　　...
    String path = "/hoge.jsp"; // フォワード先
    RequestDispatcher dispatcher = request.getRequestDispatcher(path);
    dispatcher.forward(req, resp);
    ...
}
```


###【例】
・A.jspからB.jspへフォワードする
- web-application
   | ・・・
   |- A.jsp
   |- B.jsp

```A.jsp
...
<%
    application.getRequestDispatcher("/B.jsp").forward(request, response); // B.jspへフォワード
%>
```
###【参考】
・[リダイレクトとフォワードの違い](http://www.atmarkit.co.jp/ait/articles/0407/06/news077.html)
RSS2.0のpubDateをJava8のDateTimeでparseする

RSS2.0のpubDateの日付の形式はRFC822らしい。（[仕様](http://cyber.law.harvard.edu/rss/rss.html#optionalChannelElements)）

時刻にはオフセットが付いてたりするので、java8のOffsetDateTimeを使うとして、RFC822の改訂版のRFC1123のDateTimeFormatterを使えば良い。

コードはこんな感じ。

```java
String pubDate = "Sun, 14 Aug 2016 16:23:05 +0900"; // RFC822
OffsetDateTime dt = OffsetDateTime.parse(pubDate, DateTimeFormatter.RFC_1123_DATE_TIME);

System.out.println(dt.format(DateTimeFormatter.RFC_1123_DATE_TIME)); // Sun, 14 Aug 2016 16:23:05 +0900
```
モーダル作成に便利な jQueryプラグイン Remodal


http://vodkabears.github.io/remodal/

簡単にモーダルが設置できる。

## 手順

1 ソースコードをダウンロード

https://github.com/VodkaBears/Remodal/releases

2 CSS とSCRIPTを読み込む

````
<link rel="stylesheet" href="../dist/remodal.css">
<link rel="stylesheet" href="../dist/remodal-default-theme.css">

<script src="../dist/remodal.min.js"></script>
````

こちら、テーマも必ず読み込むこと

3 モーダルとボタンを記述

モーダル

````
<div class="remodal" data-remodal-id="modal">
  <button data-remodal-action="close" class="remodal-close"></button>
  <h1>Remodal</h1>
  <p>
    Responsive, lightweight, fast, synchronized with CSS animations, 
    fully customizable modal window plugin with declarative configuration and hash tracking.
  </p>
  <br>
  <button data-remodal-action="cancel" class="remodal-cancel">Cancel</button>
  <button data-remodal-action="confirm" class="remodal-confirm">OK</button>
</div>
````

ボタン

````
<a data-remodal-target="modal">Call the modal with data-remodal-id="modal"</a>
````

## モーダルの開き方

単純に`href`で呼び出したり、

````
<a href="#modal">Call the modal with data-remodal-id="modal"</a>
````

若しくは`data-remodal-target`属性で呼び出したり出来る。
 
````
<a data-remodal-target="modal">Call the modal with data-remodal-id="modal"</a>
````

後述するハッシュとのひも付けが有効なときのみ前者が利用可能。

ハッシュとのひも付けを無効にする際には、後者の呼び出し方法を利用しなければならない。


## オプション

オプションを変更する事で挙動のカスタマイズも簡単に行える。

https://github.com/VodkaBears/Remodal#options


- `hashTracking`:デフォルト(true)ではモーダルのActive化はハッシュと紐づく形で実装されている。
- `closeOnConfirm`: デフォルト(true)ではconfirmボタンを押したタイミングでモーダルが閉じられる。
- `closeOnCancel `: デフォルト(true)ではcancelボタンを押したタイミングでモーダルが閉じられる。
- `closeOnEscape `: デフォルト(true)ではESCキーを押したタイミングでモーダルが閉じられる。
- `closeOnOutsideClick `: デフォルト(true)では背景を押したタイミングでモーダルが閉じられる。

オプションは属性で設定できるほか、スクリプトでグローバルに登録することも可能。

属性での設定

````
<div class="remodal" data-remodal-id="modal"
  data-remodal-options="hashTracking: false, closeOnOutsideClick: false">
  ...
</div>
````

スクリプトでの設定

````
<script>
window.REMODAL_GLOBALS = {
  NAMESPACE: 'modal',
  DEFAULTS: {
    hashTracking: false
  }
};
</script>
<script src="../dist/remodal.js"></script>
````
Cloud9 のエディタで git のコミットメッセージを書く

Cloud9 のターミナルから git commit するとコミットメッセージを入力するために nano が立ち上がります。nano は使いづらいのでそれ以外のエディタを使いたいけど、vim にするのも何か違うような気がします。

せっかく IDE なのでコミットメッセージも Cloud9 のエディタで入力するようにします。

```shell-session
git config --global core.editor 'c9 open --wait'
```

## c9 コマンドでファイルを開く

ターミナルから Cloud9 のエディタ (ACE) でファイルを開くには c9 コマンドを使います。

```shell-session
c9 open path
``` 

ただし、ファイルを開いてすぐにプロンプトが戻るので、このままでは git のコミットメッセージ入力には使えません。

```--wait``` オプションを付けるとエディタが終了するまでプロンプトに戻りませんので、git のエディタとして使えるようになります。
RubyでHjsonパーサを書いた

最近触っているソフトウェアは立て続けに設定をjsonを書かせるものばかりで辟易としていたところに、何かまともなものはないかと調べていたら[hjson](https://hjson.org/)というものがあった。

better JSON的なノリで作られたもののようだが、考案者自身が[RFC](https://hjson.org/rfc.html)も書いているなど、なかなかやる気に満ち溢れているように見える。

ところが残念なことに、自分が発見した時点ではruby製のhjsonパーサがまだ存在していなかったため、サクッと書いてみたので記事も書く。

[namusyaka/hjson](https://github.com/namusyaka/hjson)

# 使い方

基本的に`Hjson.parse`しか使わない前提。

```ruby
require 'hjson'

hjson = <<HJSON
// for your config
// use #, // or /**/ comments,
// omit quotes for keys
key: 1
// omit quotes for strings
string: contains everything until LF
// omit commas at the end of a line
cool: {
  foo: 1
  bar: 2
}
// allow trailing commas
list: [
  1,
  2,
]
// and use multiline strings
realist:
  '''
  My half empty glass,
  I will fill your empty half.
  Now you are half full.
  '''
HJSON

Hjson.parse(hjson)
```

# Hjsonの文法いろいろ

せっかくなので、Hjsonの文法について実際のコード例を挙げながら説明したい。

## Comments

一番魅力的なのはやはりJSON中にコメントが書ける、というところだろうか。

```ruby
require 'hjson'

hjson =<<HJSON
{
  # specify rate in requests/second
  "rate": 1000

  // prefer c-style comments?
  /* feeling old fashioned? */
}
HJSON

Hjson.parse(hjson) #=> {"rate"=>1000}
```

## Quotes

キー名はquoteで囲まなくて良い。

```ruby
require 'hjson'

hjson =<<HJSON
{
  key: "value"
}
HJSON

Hjson.parse(hjson) #=> {"key"=>"value"}
```

## Commas

末尾の`,`は省略可能。


```ruby
require 'hjson'

hjson =<<HJSON
{
  one: 1
  two: 2
  three: 4 # oops
}
HJSON

Hjson.parse(hjson) #=> {"one"=>1, "two"=>2, "three"=>4}
```

## Quoteless

valueに値する部分もquoteを省略でき、その場合は文字列としてパースする。

```ruby
require 'hjson'

hjson =<<HJSON
{
  text: look ma, no quotes!

  # To make your life easy, put the next
  # value or comment on a new line.
  # It's also easier to read!
}
HJSON

Hjson.parse(hjson) #=> {"text"=>"look ma, no quotes!"}
```

## Escapes

エスケープ不要。

```ruby
require 'hjson'

hjson = <<HJSON
{
  # write a regex without escaping the escape
  regex: ^\d*\.{0,1}\d+$

  # quotes in the content need no escapes
  inject: <div class="important"></div>

  # inside quotes, escapes work
  # just like in JSON
  escape: "\\\\ \n \t\\""
}
HJSON

Hjson.parse(hjson)
#=> {"regex"=>"^d*.{0,1}d+$",
 "inject"=>"<div class=\"important\"></div>",
 "escape"=>"\\ \n \t\""}
```

## Multiline

`'''`を用いることで複数行の文字列をわかりやすく書ける。

```ruby
require 'hjson'

hjson =<<HJSON
{
  haiku:
    '''
    JSON I love you.
    But strangled is my data.
    This, so much better.
    '''
}
HJSON

Hjson.parse(hjson) #=> {"haiku"=>"JSON I love you.\nBut strangled is my data.\nThis, so much better."}
```

## Braces

rootオブジェクトについては`{}`を省略できる。

```ruby
require 'hjson'

hjson =<<HJSON
// this is a valid config file
joke: My backslash escaped!
HJSON

Hjson.parse(hjson) #=> {"joke"=>"My backslash escaped!"}
```

# おわりに

JSONと完全に互換性があり、validなJSONはHjsonとしてもvalidである。
したがって、導入する分にはハードルも高くないので、試してみるのも面白いかもしれない。
【JSP】リダイレクトする

###【目的】
JSPにて別ページへリダイレクトする

###【コード】
```
response.redirect("path")  // pathへリダイレクトする
````

###【環境】
eclipse 4.4.2 / Java 1.8
JSP / Servlet

###【構成】
 -
###【ポイント】
　・JSPの<Font color="red">暗黙オブジェクト</Font>responseを使う
　・response.redirect("path") 
　　→pathへリダイレクトする、 pathはサーバー内ページであれば/からはじまるものを指定し、外部ページであればフルパスで指定
###【例】
 ・A.jspからB.jspへリダイレクトする
 - web-application
    | ・・・
    |- A.jsp
    |- B.jsp

```A.jsp
...
<%
    responce.redirect("/B.jsp"); // B.jspへリダイレクト
%>
```

###【参考】
・[リダイレクトとフォワードの違い](http://www.atmarkit.co.jp/ait/articles/0407/06/news077.html)