OmniAICreator/Qiita-1.07M huggingface dataset:
Spineランタイム：アニメーションの開始/終了イベントを受ける

こまめにまとめるシリーズで、今回はアニメーション開始・終了のイベントについてです。
以下、SpineランタイムはSpine-Starlingの4.3を使います。どの言語のランタイムでも大きさな差はないと思われます。

#AnimationStateのイベント
アニメーションの開始と終了イベントは、AnimationStateの各Listenersオブジェクト（後述）にコールバック登録する事で得る事ができます。コールバックに渡される引数はトラック番号および、onCompleteのみ第二引数にそのイベントの発行回数が渡されます。

```sample.as
var state:AnimationState = skeletonAnimation.state;
state.onStart.add(function(track:int):void{
    trace("track#" + track + "　のアニメが開始した");
});
state.onEnd.add(function(track:int):void{
    trace("track#" + track + "　のアニメが停止した");
});
state.onComplete.add(function(track:int, count:int):void{
    trace("track#" + track + "　のアニメが" + count + "回、完了した");
});

state.setAnimation...
```

`onEnd`と`onComplete`の差はなんでしょうか？

onCompleteは設定されたアニメーションが最後まで再生された時に発行されるイベントです。ループアニメの場合何度もonCompleteイベントが発行されるので、その回数として第二引数にカウンタ値も渡されます。非ループアニメの場合、一度だけこれが発行されます。

対して、onEndは再生中のアニメが止まった、または、止められた際に発行されます。`clearTrack`命令による強制アニメ停止、次のアニメの上書き設定による停止、今のアニメが最後まで再生されて(=onComplete)の停止、、など理由はなんであれ、Trackの再生状態が解除された際に発行されます。onCompleteのタイミングでonEndも発行されます。

注意として、一つのトラックに連続アニメーションがキューに入って設定されている場合([こちら](http://qiita.com/harayoki/items/41865353c38b0c885080)の記事参照)で、キュー全体で`setAnimation`や`clearTrack`命令で破棄された場合は、再生中TrackEntry以外はonEndイベントが発行されないという点があります。


#TrackEntryのイベント
AnimationStateでまとめてではなく、アニメーション再生指示毎にイベントを受けることもできます。具体的にはTrackEntryにコールバック関数を設定します。

```sample.as
var trackEntry:TrackEntry = animationState.setAnimationByName(0, "hoge");
trackEntry.onStart = function(track:int):void {
   trace("track#" + track + "　のアニメが開始した");
}
trackEntry.onEnd = function(track:int):void {
    trace("track#" + track + "　のアニメが停止した");
};
trackEntry.onComplete = function(track:int):void {
    trace("track#" + track + "　のアニメが" + count + "回、完了した");
};
```

イベントの種類と挙動はAnimationStateと同じですが、提供されるのがListenersではなく、素のFunctionである事に注意です。上記のソースでは、onStartにaddせずonStartを関数でそのまま上書きしています。コールバック関数設定を解除するには、それぞれにnullを代入します。

```sample.as
trackEntry.onStart = null;
trackEntry.onEnd = null;
trackEntry.onComplete = null;
```

#Listenersとは？
FlashやStarlingのイベントモデルはEventListenerを継承・実装するクラス構成をとっていますが、そのEventListener機能をプロパティ側に抜き出してもたせような形式であるのが`spine.animation.Listeners`です。addしてリスナ登録、removeでリスナ登録解除となります。

```sample.as
function onStart(track:int):void {
    trace("start!");
    animState.onStart.remove(onStart); // 解除
};
animState.onStart.add(onStart); // 追加
```

C＃のイベントモデルとか、[ActionScript3 Signals](https://github.com/robertpenner/as3-signals) みたいなやつですね。EventListenerよりもスマートな実装で自分はこちらの形式の方が好きです。(Signalsについてはこちらのサイトが詳しいです。 http://www.inazumatv.com/contents/archives/5729 ) SpineのListenersはSignalsほど高機能ではないですが、Spineのランタイムライブラリ内部だけでなく、ユーザ側でも利用できるので、簡単なコードを書くときなどは利用できそうです。

#連続再生用途にonEndを使わない
onEndイベントのハンドラ内(ListenersでもFunctionでも)にて次のアニメーション再生を行おうとすると、アニメーション制御がおかしくなる現象を手元で確認しました。アニメーションの連続再生用途には`addAnimation`/`addAnimationByName`を使うか、onCompleteハンドラを使うかしましょう。もしonEnd内部でなんとか次アニメーションを再生しなくてはいけないシチュエーションがあるなら、1フーム待ってから次のアニメーション指示をを出すようにしましょう。

#おわりに
AnimationStateとTrackEntryでイベントの仕組みが異なっているのは、無数に作られていくTrackEntryにListenersは大げさすぎるという判断でしょうか。直接関数指定の方がパフォーマンス的にも良さそうなのでそこは良いのですが、どちらにしろコールバックへの引数にはランタイムがTrackEntry自体も追加で渡してくれるともっと便利な気はしますね。


以上です。では。
UnityのApplication.systemLanguageがiOS9上で誤まった中国語を返す件について

## Application.systemLanguageが返す中国語について

iOS8まではiOS端末の言語設定が簡体字もしくは繁体字の場合、Unity API の Application.systemLanguageはそれぞれSystemLanguage.ChineseSimplified, SystemLanguage.ChineseTraditionalを返してくれていました。
しかし、iOS9からは一律にSystemLanguage.Chineseを返すようになってしまいました。(Unity 5.4.0f3で確認)

これでは簡体字か繁体字の判定ができず、それぞれの中国語文字にローカライズ対応しているアプリではまずいことになります。

## 原因

詳しくは分かりませんがきっと [iOS9でNSLocale preferredLanguagesの戻り値が変わった](http://qiita.com/m1takahashi/items/e28858198ed8848a2738) が関連していると思います。
Unityも内部的にこの値を用いていてひきづられてしまったのかなと。

## 対策

Twitter で教えてもらった [このバグ報告?](http://blog.csdn.net/teng_ontheway/article/details/50277169) のソースを使わせてもらいます。
CurIOSLang.mmはリンク先のものが動作しなかったので少し変更しています。
(XCodeでビルド時にcStringCopy なんて知らねーって文句言われたので cStringCopy は自分で実装しています。何かのヘッダーをimportしないとダメ？)

```csharp:ComManager.cs
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
  
public class ComManager  
{
#if UNITY_IOS
  [DllImport("__Internal")]  
  private static extern string CurIOSLang();
#endif

  public static SystemLanguage GetSystemLanguage()
  {  
    SystemLanguage lang = Application.systemLanguage;
#if UNITY_IOS
    if (Application.platform == RuntimePlatform.IPhonePlayer) {
      if (lang == SystemLanguage.Chinese) {
        string name = CurIOSLang();
        if (name.StartsWith("zh-Hans")) {
          return SystemLanguage.ChineseSimplified;
        }  
        return SystemLanguage.ChineseTraditional;
      }
    }
#endif
    return lang;
  }  
}
```

```objc++:CurIOSLang.mm
char* cStringCopy(const char* string)
{
  if(string == NULL){
    return NULL;
  }
  char* newString = (char*)malloc(strlen(string) + 1);
  strcpy(newString, string);
  return newString;
}

extern "C"
{
  const char* CurIOSLang ()
  {
    NSArray *languages = [NSLocale preferredLanguages];
    NSString *CurrentLanguage = [languages objectAtIndex:0];
    return cStringCopy([CurrentLanguage UTF8String]);
  }
}
```

ComManager.csはご自身のUnityプロジェクトの適当な場所に、CurIOSLang.mmは ご自身のUnityプロジェクト内の./Assets/Plugins/iOS に保存します。
(Unity5.3.?からObjective-Cなどネイティブコードを ./Assets/Plugins/iOS に保存する必要はないはずですが、とりあえずここではそのディレクトリに保存しています。)

## 結果

```csharp
ComManager.GetSystemLanguage();
```
が適切な中国語文字を返してくれるようになりました。(iOS8, iOS9で動作確認済み)
めでたしめでたし。
Raspberry piを買って初めにしたこと

# Raspbianのインストール
## OSのダウンロード
https://www.raspberrypi.org/downloads/raspbian/
ダウンロードしたら展開して`raspbian.img`など簡単に名前をつける
## 書き込むSDカードの場所を調べる
```bash

$ diskutil list
...省略
/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.5 GB    disk2
   1:                 DOS_FAT_32                         15.5 GB    disk2s1
```
## SDカードをアンマウントする
```bash

$ sudo diskutil unmountDisk /dev/disk2
```
## SDカードに.imgを書き込む
```bash

$ sudo dd bs=1m if=raspbian.img of=/dev/disk2
Password:
3125+0 records in
3125+0 records out
3276800000 bytes transferred in 2784.822319 secs (1176664 bytes/sec)
```
# Raspbianのセットアップ
## Raspberry pi を探す
raspiにLANケーブル刺す前後に`arp -a`とかやって増えたIPが多分raspi

## ログインする
```bash
$ ssh pi@[Raspberry Piのアドレス]
pi@[Raspberry Piのアドレス]'s password: 
Linux raspberrypi 3.12.35+ #730 PREEMPT Fri Dec 19 18:31:24 GMT 2014 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.

NOTICE: the software on this Raspberry Pi has not been fully configured. Please run 'sudo raspi-config'

pi@raspberrypi ~ $
```
## ソフトウェアの更新
```bash
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade
$ sudo rpi-update
$ sudo reboot
```
気長に待つ

## Avahiをインストール
```bash
$ sudo apt-get install avahi-daemon avahi-autoipd
```
固定IP振りたくないし覚えたくないのでホストネームでSSHできるようAvahiを入れる
最初から入ってるらしい

# 参照
Raspberry PiにRaspbianをインストールする for Mac OSX
http://qiita.com/ttyokoyama/items/7afe6404fd8d3e910d09

Raspberry Pi 2 に Raspbian Jessie (2015-09-24) をセットアップした。
http://qiita.com/tchisaka/items/e8a2b09c808715dc8515#samba-%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB
ReactNativeで何が出来るのかさっと知れるサイト、その他リンクまとめ

「React Nativeって時々聞くけど、どれくらいのものが作れるの？」とか「どこで調べればいいの？」とかそういった時に役立つリンクをまとめてみました。

#### 公式ドキュメント

まずはお約束として、ドキュメントです。
https://facebook.github.io/react-native/

#### 公式Showcase

ReactNativeで作られたアプリが載っています。
日本のアプリだとCoinyさんのアプリが載っています。
最近、いい感じのニュースソースがないアプリは載らないようになりました。なので厳選されています。以前は自分の個人で作ったやつも載せてもらってたのでちょっと切ないです(´・ω・｀)

https://facebook.github.io/react-native/showcase.html

#### React Native Playground

React NativeのコードがWeb上で実行出来るサービスです。ユーザーがちょっとしたボタンアクションなど登録しています。アプリもあったはずです。

https://rnplay.org/

#### Use React Native

React Nativeのニュースサイトです。メルマガもあります。

http://www.reactnative.com/

#### js.coach

ReactとReact Nativeのライブラリ検索サイトです。
ライブラリの説明をみればなんとなく可能性をつかめるでしょう。

https://js.coach/react-native

#### awesome react native

各種ライブラリで見受けれる、まとめリポジトリです。
ざっと見るとReact Nativeがわかってくると思います。

https://github.com/jondot/awesome-react-native

#### JAVASCRIPT WITHOUT GRAMMAR

かなり積極的にReactを扱ってる印象のあるブログです。
たぶんあまり普通じゃないことやって困ったときに、よくたどり着いたので好きになってしまいました。

http://browniefed.com/

#### Firebase

FirebaseのブログでもたまにReact Nativeについて言及されます。新Firebaseになった直後は対応してなかったライブラリの最新版も3.1.0でReact Nativeをサポートしたようです。ただ、まだauthenticateは自分である程度頑張りが必要のよう。

https://firebase.googleblog.com/2016/01/the-beginners-guide-to-react-native-and_84.html

#### Nuclide IDE

Facebookが出してるIDE。実は使ってないのですが、いつのまにかDebugに役立つ機能とかが載っていたようです。

https://nuclide.io/

#### Deco IDE

GUIでUIの微調整とかできてしまうIDE。これも実は使ってないですが、ワクワクはしています。

https://www.decosoftware.com/

#### Realm React Native

有名なRealmもReact Nativeから公式に扱えるので、特筆しときます。

https://realm.io/docs/react-native/latest/

以上です。
他にも発見したら追記します。是非教えて下さい(/･ω･)/
Unreal Engine tutorial notes

#### [2 - Viewpoint Navigator](https://www.youtube.com/watch?v=knI-XUbv2Wg)
+ カメラのFPS風移動
  - 右クリック状態からのWASD, QE
+ ズームイン／アウト
  - 右クリック状態からのCZ
+ Mayaスタイル？カメラ操作
  - F : 選択中のアクタを中心に据える
  - Alt + 左クリック : サテライト
  - Alt + 中クリック : 平行
  - Alt + 右クリック : 直進／後退

#### [3 - Orthographic Views](https://www.youtube.com/watch?v=7bIXDVEAhI0)
+ Viewport右上のMaxmizes or Restores this viewportボタンを押すことで三投影＋Perspective画面に切り替わる。

#### [4 - View Modes and Show Flags](https://www.youtube.com/watch?v=kFibDtlOXgQ)
+ Lit, Show

#### [5 - Placing Objects in Your Level](https://www.youtube.com/watch?v=yCiaulXn3KE)
+ New map
  - File->New Level(Ctrl+N)
+ アクタの設置
  - Modes/Content Browserからアクタを引っ張ることでScene内にオブジェクトを設置。
  - 設置後、Scene内で右クリック。Place Actorで最近設置したオブジェクトを再度配置。Replace Selected Actor withで選択中のオブジェクトを最近のオブジェクトに置換。
  - Class ViewerはDepelover Toolsの下に。

#### [6 - Moving Objects](https://www.youtube.com/watch?v=TfxeC_UX_Ko)
+ オブジェクトの操作
  - WER:位置操作／角度操作／サイズ操作
  - W:World/Local World:絶対的に位置を操作する Local:オブジェクトの角度に基づき相対的に位置を操作する
  - End:直下のオブジェクト上に置く。
  - Snap:位置／角度／サイズを操作する際の変更単位。

#### [7 - Rotating Objects](https://www.youtube.com/watch?v=KQ1zuL2PWtk)
#### [8 - Scaling Objects](https://www.youtube.com/watch?v=NBqR6vNrESM)

#### [9 - Moving with the Camera](https://www.youtube.com/watch?v=yNsKAntWiB0)
+ SpotlightとView中のカメラ視線を一致させたいような場合
  - 対象オブジェクトを選択・右クリック→Pilot 'SpotLight'
  - 矢印ギズモがうざい場合はViewport Options->Game

#### [10 - Introduction to the Content Browser](https://www.youtube.com/watch?v=kTyOLkCOcZY)
+ オブジェクト選択した際、Detailsパネル内の虫眼鏡マークからContent Browser内の対応するマテリアルにジャンプできる。
+ *マークのConentは未セーブ。
+ Collectionsタブを開く場合、View Optionsから表示させる。
+ Filetersで下フォルダ内の特定の属性のもののみ表示させることができる。フィルタ結果の文字列を右クリックすることで各種操作が可能。Filter+文字も可能
+ Contentsリスト内、ホイールだけでなく右クリックからハンドツールのように表示範囲を操作することが可能。
+ Real-Time Thumbnails+Thumbnail Edit modeでサムネイルを直接操作できる。左上のアイコンをクリックすることで形状を変更可能。

#### [11 - Customizing the Unreal Editor UI](https://www.youtube.com/watch?v=O_UK6UHCNLw)
+ Details, Model, Content Browserといった各ウィンドウは自由に配置できる。
+ タブを右クリックしてHideすることもできる。復活させる場合はウィンドウ左上の三角形をクリック。
+ 四角タブは台形タブ下に所属している。他の所属へは移動できない。並ぶことができるのは同型のタブ同士のみ。
+ Window -> Save Layoutで現在のウィンドウ配置を保存できる。
Raspberry Pi 環境構築手順

RaspberryPiを買ってみたのでとりあえずMacからSSHで繋げるようにするとこまでのメモ書き

#買ったもの
[kksmart Raspberry Pi 3 Model B ラズベリーパイ 3 モデル B コンプリートスターターキット 16GB (class 10)](https://www.amazon.co.jp/kksmart-Raspberry-Model-%E3%83%A9%E3%82%BA%E3%83%99%E3%83%AA%E3%83%BC%E3%83%91%E3%82%A4-%E3%82%B3%E3%83%B3%E3%83%97%E3%83%AA%E3%83%BC%E3%83%88%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%AD%E3%83%83%E3%83%88/dp/B01G8EZSCQ?ie=UTF8&ref_=pe_1807052_198774502_tnp_email_dp_1)
内容物は以下
- Raspberry Pi 3 Model B 本体
- Raspberry Pi2B/3B専用のABSケース（クリア）
- モニター用HDMIカーブル（1M）
- 16GB microSDカード(class 10)
- ヒートシンク
- USBカードリーダー
- 5V 2.5A RPI3専用電源アダプタ1.15M（PSE対応）

#構築時に必要なもの
- ディスプレイ(HDMIで繋ぐか変換アダプタを使ってVGIとかに変換する)
- USBキーボード
- USBマウス

#インストール
1. microSDを初期化
[SDカードフォーマッター](https://www.sdcard.org/jp/downloads/formatter_4/)とやらを使うのが定番らしい
Mac版もあったのでそれで

2. NOOBSをダウンロード
  https://downloads.raspberrypi.org/NOOBS_latest から
  1.07GBあるので気長に待つよ
>NOOBSとは
>ラズパイ用のOSインストーラー
>Raspbianの他にも色々なOSが入ってる

3. NOOBSを解凍
ダウンロードしたNOOBS_vx_x_x.zip(この記事を書いた時点ではNOOBS_v1_9_2.zip)を解凍する
解凍ソフトによってはサイズの関係で解凍できないらしいけどMacの標準解凍ツールは優秀だった( 'ω')

4. NOOBSをSDカードにコピー
解凍したNOOBSを初期化したSDカードのルートにコピーする
※ コピーする際は解凍してできたフォルダじゃなくてファイル群をルートに入れること

5. 起動
キーボードとかマウスとかディスプレイとか繋いだらmicroUSB端子にACアダプタを繋ぐ
余談だけどラズパイの面白いとこって電源繋いだら勝手に起動してくれるところよね( 'ω')
つまりシャットダウンしたらmicroUSBを抜き差ししなきゃいけないわけだけど(

6. インストールするOSを選択
NOOBSがちゃんとコピーされてれば画面にOS選択画面が表示されるはず
※ 間違えてフォルダごとコピーしたらモニターに信号が送られず一旦切る羽目になったよ(
マウスでRaspbianを選択してウィンドウ左上のインストールボタンをクリック
この時に下部で言語も選択できるみたいなので好みで日本語にしておく

7. のんびり待つ(
意外に時間がかかる
暇つぶしにポケモンGoでもどうぞ(
インジケーターが100%になったら「インストールが完了しました」とダイアログが出て、
OKをクリックすると再起動して自動ログインまでしてくれる

#起動オプションを設定
GUIを使う予定が無いのでコンソール起動にする
1. コンソールを起動
上のツールバーにそれっぽいアイコンがあるのでそれをクリックすればコンソールが開く
2. Raspberry Pi Software Configuration Toolを起動
`sudo raspi-config`と打ち込むと画面が切り替わる
3. Boot Optionsを選択
4. B1 Consoleを選択
※ B4 Desktop Autologinが現在の設定なので、GUIで起動したい場合はそのまま
5. Finishを選択
再起動を促されるので再起動する

#SSHログインできるようにする
SSH自体は標準で入ってるっぽいので固定IPさえ設定してしまえば良さそう

1. dhcpcpファイルを開く
~~vimが入っていないため、~~ラズパイ標準(?)のnanoというエディタを使う
***
**2016/8/1追記**
viは入ってたけどmacからsshで繋いで動かしてると矢印キーで変な挙動起こされたので使わない方が良い
nanoも悪くは無いけどこだわるならvim落としてきた方が良いかも
***
`sudo nano /etc/dhcpcd.conf`

2. eth0設定を末尾に追記する

```bash:dhcpcd.conf
interface eth0
static ip_address=192.168.0.250/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
```
`Ctrl+O`で上書き保存
`Ctrl+X`で終了
3. ネットワーク設定を読み込む
`sudo /etc/init.d/dhcpcd reload`
4. 確認
Macから
`ping 192.168.0.250`
を打ってパケットが返ってくれば成功
5. ログインしてみる
Macから
`ssh pi@192.168.0.250`
パスワードは`raspberry`
ログインできれば成功
IBM Watson ハッカソンに参加して

# はじめに

はじめまして、[ValueCreation](http://qiita.com/ValueCreation) と申します。

先週の金曜日に IBM Watson ハッカソン「[SoftBank World Challenge 2016](https://softbankworld.com/sess/)」に参加してきましたので簡単に報告したいと思います。
これまで、IBM Watson ハッカソンは、第1回から第3回まで行われており、それぞれの決勝に残った計13チームで、[SoftBank World Challenge 2016](https://softbankworld.com/sess/) にて、ハッカソンが行われました。
まず、13チームで予選が行われ、予選を勝ち残った3チームで、決勝戦が行われました。自分は、昨年の12月に開催された第1回に参加しました。

自分達のチームは、見事に決勝進出3チームに選ばれ、決勝戦を戦いましたが、結果は残念ながら3位でしたが、普段の仕事では得られない、色々な学びや貴重な経験がありました。
この経験や得られた学びなどを言語化する意味で、ここで紹介していきたいと思った次第です。

[「SoftBank World Challenge 2016」決勝戦](https://www.change-makers.jp/news/11220)
![image](https://qiita-image-store.s3.amazonaws.com/0/102251/ee1b9541-ea79-b40f-02ff-269330cc7292.png)

記事が紹介されていますので、こちらもご覧ください。
[【SoftBank World 2016 徹底レポート(13)】IBM Watsonハッカソン「SoftBank World Challenge」決勝進出3チーム決定](http://robotstart.info/2016/07/22/sbw2016-13.html)
[【SoftBank World 2016 徹底レポート(25)】 IBM Watsonハッカソン グランド優勝に輝いたのは](http://robotstart.info/2016/07/26/sbw2016-25.html)

# IBM watson ハッカソンについて
詳細は割愛しますが、Watson が提供する API を使用して、アプリを作ります。
![image](https://qiita-image-store.s3.amazonaws.com/0/102251/e6dd42ea-db5b-4afc-64f1-2679cd321711.png)

Natural Language Classifier (NLC)
自然言語を理解し、学習に基づき適切な「意図」を返答（自然言語分類）

Retrieve & Rank (R&R)
機械学習アルゴリズムを利用した検索エンジン（検索＆ランクつけ）

Document Conversion (DoC)
テキスト文書へのフォーマット変換（文書変換）

Dialog (DLG)
アプリケーションとエンドユーザーが対話する会話応答システム（対話）

Text To Speech (TTS)
テキストの音声変換（音声合成）

Speech To Text (STT)
音声のテキスト変換（音声認識）

作成したアプリの審査基準は以下の割合トータル100%となります。それぞれの項目が配分されていて、総合力が問われます。この総合力の結果で勝敗決定します。

30%　アイデア
30%　ビジネスモデル
20%　アプリプロトタイプ　
10%　コンテンツ有効性
10%　プレゼン能力

![image](https://qiita-image-store.s3.amazonaws.com/0/102251/03d2eb1d-8f79-be15-295a-20eb270fc1b8.png)

概要については、[第3回 IBM Watson日本語版ハッカソン](http://event.samurai-incubate.asia/watson-hack3/)をご覧ください。

# IBM watson ハッカソンに参加しての学び

以下のような枠組みで整理したいと思います。

1. 最大の学びは何だったか？(What?)
①経験
ハッカソンと言う舞台を経験がすることができたのは良かったです。また、エンジニアとして、普段の開発では、使用しないスキル含め、技術的なノウハウを得ることができるのも大きいと思います。他社のアプリの紹介や他社の人達とも仲良くなれたりと良かったです。
②ビジネスモデル　
ハッカソンをする上で、何か面白そうと思って、アイデアだけが先行してもダメで、そのアイデアが本当に市場ニーズがあるのか、ビジネスの視点もかなり重要であることは押さえておくべきである。
③プレゼンテーション
ハッカソンで作成したアプリを紹介するときのプレゼンで、5分間という短いプレゼンでポイントを押さえてのプレゼンも重要である。とくに投資家にプレゼンするように、モノ、人、カネの視点や、市場の魅力度、競合の観点などをそれぞれを踏まえて、プレゼンを行う必要がある。

2. それは自分にとってどのような意味があるのか?(So what?)
ここで得られた経験を他の機会でも活用していきたいと思いました。ハッカソンに参加することで、自社の製品の宣伝などのアピールにもなり、なにより個人としての価値も高めることができると思いました。

3. それを踏まえて自分はどのように具体的に行動するのか？(Now what?)
次回は、自身が所属する会社でもチームを組んで参加したいと思います。

4. 最後に
実は予選がはじまるぎりぎりまで、アプリの開発をしていました。最後のギリギリまであきらめず、アプリのクオリティを上げるというあきらめないことがすごく重要だと痛感しました。
RxAndroidのObservableを使った非同期処理を簡略にするメモ(Kotlin)

# 概要
　非同期処理を読みやすくしたい自分メモです。

# 定義側
```kotlin
class Thread<Type_> {
  fun run(Background_: ((Type_?) -> Any) -> Any, Main_: (Type_?, Throwable?) -> Unit) {
    var result: Type_? = null
    var err: Throwable? = null
    Observable
        .create<Type_> { subscriber_ ->
          Background_ { value_ ->
            subscriber_.onNext(value_)
            subscriber_.onCompleted()
          }
        }
        .subscribeOn(Schedulers.newThread())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe({ result_ ->
          result = result_
        }, { err_: Throwable ->
          err = err_
        }, {
          Main_(result, err)
        })
  }
}
```

# 呼び出し側
```kotlin
Thread<String>().run(
    Background_ = { Callback_ ->
      val result = "" // 重い処理
      Callback_(result)
    },
    Main_ = { result_, error_ ->
      when (error_) {
        null -> {
          hoge(result_) // 結果受け取り
        }
        else -> {
          // エラー処理
        }
      }
    }
)
```
誤って大量のpackageを削除してしまった時の復旧方法

packageを誤って削除してしまい、Window Managerがほとんど動かない状態になって焦ったのでrollback方法をメモ。(autoremoveで確認せずに実行してしまったことを後悔)

まず、apt-getのログを確認する。

```bash
>cat /var/log/apt/history.log

Start-Date: 2016-07-05  22:03:54
Commandline: aptdaemon role='role-commit-packages' sender=':1.105'
<snip>
Start-Date: 2016-07-25  22:06:36
Commandline: aptdaemon role='role-commit-packages' sender=':1.101'
Upgrade: jenkins:i386 (2.14, 2.15)
End-Date: 2016-07-25  22:06:54
```

上記は正常なubuntu環境なので、ログの場所だけが重要です。

実施することとしては、上記のログから削除してしまったpackageを抽出して、installするだけです。
ここでは、ログの日付と時間から、削除されたpackageのリストを作成してintallします。

```bash
> grep -A 2 'Start-Date: XXXX-XX-XX  XX:XX:XX' /var/log/apt/history.log | tail -1 >/tmp/packages.txt
> tr ',' '\n' < /tmp/packages.txt | sed '/automatic)/d' | awk '{ print $1}' > /tmp/final.packages.txt
> p="$(</tmp/final.packages.txt)"
> apt-get --purge install $p
```

上記コマンドでinstall対象packageのリスト作成して、apt-get installしている。

少なくとも自分の環境は、上の手順で復旧出来ました。
Tagを自動で定義してTagManagerを吐き出す、エディタ拡張のスクリプトを作ってみた


今回は、前回のSceneManagerスクリプト出力と同じような感じでTagManagerを作ってみました

UnityのTagの取得方法はこちらです

```cshape
using UnityEditorInternal;

var tagNames = InternalEditorUtility.tags;
```

これでtagのstringの配列が取得できます
前回の記事[Scene遷移の引数を文字列ではなくenum型にしてタイプセーフにしてみた](http://qiita.com/AiginaCoder/items/08e1cf833d6429a8ce1d "Scene遷移の引数を文字列ではなくenum型にしてタイプセーフにしてみた")
を少し変更すればTagManagerが作成できるエディタ拡張スクリプトができます

前の記事のように今回も
Unityの拡張エディタで作成した独自メニューを選んだら、ラッパークラスを出力するようにしました

ソースコードをgithubにあげておきました
https://github.com/AiginaCoder/UnityTools/blob/master/SampleProject/Assets/Editor/CreateTagManagerScriptEditor.cs
良ければお使いください、ちょいちょい改良していきます

使い方は簡単です
使い方はCreateTagManagerScriptEditor.csをAssets/Editorに入れてメニューに追加されたAiginaCoder/Create/MakeTagManagerScriptを選択してOKを選ぶとTagManagerクラスがScriptsフォルダに出力されます
tagを追加するたびにこの操作が必要です

あとはtag文字列を取得したいところで以下を呼び出せばstring型のtag名が取得できます

```cshape
var tag = AC.TagManager.Instance.GetTagString (AC.TagManager.TagID."タグ名");
```

# TagManagerのメリット
- tagを削除したときにエディタ拡張で出力しなおせば、使用していた箇所をエディタがエラーで教えてくれる
- TagIDのenumを定義しているので、tagを引数にもちいる関数を作るとき明確になる（通常はstring型になると思います）


なにか不具合などあればコメントによろしくお願いします
Seleniumでドヤりながらターミナル叩いてツイートしよう！！


## サンプルコード

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

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import settings
import time

# Launch browser
driver = webdriver.Chrome()

# Maximize browser
#driver.maximize_window()

# Access site
url = "https://twitter.com/login"
driver.get(url)

# Get title
print(driver.title)

# Input email and password
screen_name = driver.find_element_by_class_name("js-username-field")
password = driver.find_element_by_class_name("js-password-field")
screen_name.send_keys(settings.my_name)
password.send_keys(settings.passwd)

# Submit
password.submit()

time.sleep(1)

# Tweet
tweet = driver.find_element_by_id("tweet-box-home-timeline")
tweet.send_keys("進捗ダメです！")
post = driver.find_element_by_css_selector("button.tweet-action")
post.click()

time.sleep(1)

driver.refresh()
```

```python:settings.py
my_name = "username"
passwd = "password"
```

## Chrome Web Driver

SeleniumのChromeドライバーは[こちら](https://sites.google.com/a/chromium.org/chromedriver/downloads)からダウンロードしてインストール！！

## まとめ

本来の使い方とは違いますが適当に遊んで本来の使い方(テスト)などに使いこなせるように慣れればいいなぁって思いますね！！
Ruby で FizzBuzz （オープンクラスを使ってみる）

基本 Java 使いでしたが最近 Ruby を勉強中。
Ruby ならではの書き方で FizzBuzz を書いてみました。

## FizzBuzz のルール
ここでは以下のルールに従います

- 整数を 1 から 100 まで順に出力する
- 3 で割り切れる場合は "Fizz" と出力
- 5 で割り切れる場合は "Buzz" と出力
- 3 でも 5 でも割り切れる場合は "FizzBuzz" と出力

## 方針
ギークな方々は「如何に短く美しいコードにするか？」を追求されると思いますが、
ここでは

- パッと見での理解のしやすさ
- Ruby ならではの面白さ

に主眼をおいています。

## コード
```rb
class Integer
  def multiple_of?(n)
    self % n == 0
  end

  def to_s_with_fizzbuzz_filter
    return "FizzBuzz" if multiple_of? 15
    return "Fizz"     if multiple_of? 3
    return "Buzz"     if multiple_of? 5

    to_s
  end
end

puts (1..100).map(&:to_s_with_fizzbuzz_filter)
```

## こだわり

このメソッドはできるだけ FizzBuzz のルールをそのまま文章で書き下したような形にしてパッと見で理解しやすいように。
こういう「英文っぽいコード」が書きやすいのも Ruby の面白さだと思いますね。

```rb
  def to_s_with_fizzbuzz_filter
    return "FizzBuzz" if multiple_of? 15
    return "Fizz"     if multiple_of? 3
    return "Buzz"     if multiple_of? 5

    to_s
  end
```

また、仮に Integer クラスの拡張部分を読まなくても以下の行だけで「何をしたいのか？」は理解してもらえるのではないかと。

```rb
puts (1..100).map(&:to_s_with_fizzbuzz_filter)
```



## ちなみに

```rb
puts [1, 2, 3]
```

というように puts に配列を渡すと

```
1
2
3
```

のように出力され、ループを使わずに書けるということを初めて知りました。
これならループ不要なのでシンプルに書けますね。
iTermをインストールしてからsshキーが自動的に読み込まれないからブチ切れた


## あらすじ

Mac純正のターミナルさん。あいつは以下画像のようにターミナルを1画面で複数作って変態仕様にすることができない！！

![スクリーンショット_2016-07-28_午後11_32_53.png](https://qiita-image-store.s3.amazonaws.com/0/97280/f085b92b-8dbb-ef8a-b176-22a6c4816b52.png "スクリーンショット_2016-07-28_午後11_32_53.png")

iTermを見つけた私は、さっそく導入を決めた！！
そしてSSHキーが山のようにある私の `~/.ssh` フォルダさん。。。

シェルを作っていざSSH接続行っくぞ！！

```bash
$ ssh hoge@examle.com
```

ちなみに私は `hoge@example.com` で鍵とかをエイリアス作ってます。
そんでエラー吐かれるから毎回

```bash
$ ssh-add ~/.ssh/id_rsa
```

は？ダルすぎ(´・ω・｀)

ということでなんとなく `~/.sshrc` とかいう謎のファイルの製造をした

```~/.sshrc
ssh-add ~/.ssh/id_rsa > /dev/null 2>&1;
```

ざっとこんな感じでどんどん増やしていくわけだ！
ちなみに `> /dev/null 2>&1` は出力結果を全部破棄するみたいな感じ

毎回以下のようにでるのはっきり言って見苦しいゾイ

```
Identity added: /Users/user/.ssh/id_rsa (/Users/user/.ssh/id_rsa)
```

あとは `~/.bash_profile` にシェル起動のたびに読み込ませるために記述をする

```~/.bash_profile
if [ -f ~/.sshrc ]; then
    . ~/.sshrc
fi
```
データクレンジングとしての名寄せ

データクレンジング作業の一つに名寄せというものがあります。ウェブやアプリを問わず、会員IDを導入しているサービスであればほぼ必須のプロセスになります。

# 名寄せとは？
一言で説明すると、データをユーザ単位にまとめ上げる作業のことです。例えば、Aさんが朝にスマートフォンのブラウザからアクセスし、昼にパソコンのブラウザからアクセスし、夜はスマートフォンのアプリからアクセスしたとします。これらはAさんのログとして一つにまとめられるはずですが、ログをデバイス単位（例：PC、SPウェブ、SPアプリ）で分けている場合は別々のユーザのログと見なされる可能性があります。unique_idはCookieやデバイス情報から作成されるID、member_idは会員IDを想定しています。

- pc

|unique_id|pagename|member_id|timestamp|
|---|---|---|---|
|123|top|100001|2016-07-25 08:00:00|
|123|list|100001|2016-07-25 08:01:00|
|123|item|100001|2016-07-25 08:02:00|

- spweb

|unique_id|pagename|member_id|timestamp|
|---|---|---|---|
|456|top|100001|2016-07-25 12:00:00|
|456|list|100001|2016-07-25 12:01:00|
|456|item|100001|2016-07-25 12:02:00|

- spapp

|unique_id|pagename|member_id|timestamp|
|---|---|---|---|
|789|top|100001|2016-07-25 20:00:00|
|789|list|100001|2016-07-25 20:01:00|
|789|item|100001|2016-07-25 20:02:00|

また、ブラウザやデバイス間のデータの名寄せだけでなく、同じブラウザやデバイス内のデータの名寄せもあります。ログイン状態と非ログイン状態のデータをまとめる場合がそれに当たります。

- table1

|unique_id|pagename|member_id|timestamp|
|---|---|---|---|
|321|top||2016-07-25 15:00:00|
|321|login||2016-07-25 15:01:00|
|321|top|100001|2016-07-25 15:02:00|

# 名寄せをすると何が嬉しいのか？
例えば、記事の閲覧時間が○○秒以上になったユーザにレコメンドメールを送るなどの、ユーザのログに基づいた施策を実施している場合は精度が上がることが考えられます。また、ユーザのログ分析もより精緻な情報を得ることが可能になります。

# 名寄せの手順
上記のtable1の場合、まずはunique_idとmember_idの組み合わせ表を作成しておきます。そして、その組み合わせ表に基いてmember_idを補完するという手順になります。SQLで書くと下記のようなSQLになります。

```sql:sample.sql
SELECT
   a.unique_id
   , a.pagename
   , b.member_id
   , a.timestamp
FROM table1 a
JOIN
(
   SELECT DISTINCT
      unique_id
      , member_id
   FROM
      table1
) b
ON a.unique_id = b.unique_id
```

上記のSQLを実行すると、見事member_idが補完されたテーブルが出来上がります。

- table2

|unique_id|pagename|member_id|timestamp|
|---|---|---|---|
|321|top|**100001**|2016-07-25 15:00:00|
|321|login|**100001**|2016-07-25 15:01:00|
|321|top|100001|2016-07-25 15:02:00|

# 名寄せで注意する事
一点だけ名寄せで注意しなければならない事があります。unique_idとmember_idは常に1対1になるとは限らないという事です。N対1の場合もあれば１対N、さらにはN対Nの場合もあります。N対1の場合はあまり問題にならないのですが、1対NやN対Nの場合は問題になる可能性が高いです。家族でPCを共有している場合などに起こり、そのまま名寄せすると違う人のログが混じってしまいます。そのような場合、対象のunique_idは名寄せ対象から外すなどの措置が必要です。
if~let { if{ } } には where を使うといいらしい


`Optional binding` をしているとどうしてもif文のネストが深くなって
気持ち悪いコードが錬成されてしまいますよね？

そういう時に `where` を使うことでちょっときれいめになります！！

## 例えばソースコード

```swift
if let scheme = request.URL?.scheme {
    if scheme.hasPrefix("http") {
        return true
    }
}
```

これが下のようになる

```swift
if let scheme = request.URL?.scheme where scheme.hasPrefix("http") {
    return true
}
```

上記例のようにWebViewの `shouldStartLoadWithRequest` でJSブリッジをしてネイティブに遷移するようなときに使う

他にも...

```swift
var isBook = false

if let book = models.contents?.book {
    if isBook {
        // 処理
    }
}
```

みたいなものがあるとしよう。これはこれでまだ見やすい方だとは思うけど

```swift
var isBook = false

if let book = models.contents?.book where isBook {
    // 処理
}
```

こんな感じに簡単にすることができる！
spark 2.0.0をzepellin 0.7.0で使うには


- 更新して、buildしなおせばいけるっぽい。

https://github.com/apache/zeppelin/pull/1195

```
git stash
git pull origin master
```

```
mvn clean package -Dscala-2.11 -Pspark-2.0 -Dspark.version=2.0.0 -Ppyspark -Psparkr -Pyarn -Phadoop-2.6 -DskipTests
```

↓のエラーがでてるっぽいが、

- spark sql以外sparkの動作には問題がない
- spark 1.6.2で動いてた独自 module jarはそのままでは動かないかも
 - scala 2.11でbuildしないといけない？
 - でも、sbtでdefaultでbuildしてtarget/scala-2.11以下に吐いているのでうまくいくはずだが。。。
- 独自module jarの問題を解決して、そのあと、spark sql経由でhiveが動くかどうかを確認 


```
ERROR [2016-07-28 23:47:31,743] ({pool-2-thread-2} Utils.java[invokeMethod]:40) - org.apache.spark.sql.SparkSession.wrapped()
java.lang.NoSuchMethodException: org.apache.spark.sql.SparkSession.wrapped()
        at java.lang.Class.getMethod(Class.java:1670)
        at org.apache.zeppelin.spark.Utils.invokeMethod(Utils.java:38)
        at org.apache.zeppelin.spark.Utils.invokeMethod(Utils.java:33)
        at org.apache.zeppelin.spark.SparkInterpreter.getSQLContext_2(SparkInterpreter.java:239)
        at org.apache.zeppelin.spark.SparkInterpreter.getSQLContext(SparkInterpreter.java:227)
        at org.apache.zeppelin.spark.SparkInterpreter.open(SparkInterpreter.java:727)
        at org.apache.zeppelin.interpreter.LazyOpenInterpreter.open(LazyOpenInterpreter.java:69)
        at org.apache.zeppelin.interpreter.LazyOpenInterpreter.interpret(LazyOpenInterpreter.java:93)
        at org.apache.zeppelin.interpreter.remote.RemoteInterpreterServer$InterpretJob.jobRun(RemoteInterpreterServer.java:383)
        at org.apache.zeppelin.scheduler.Job.run(Job.java:176)
        at org.apache.zeppelin.scheduler.FIFOScheduler$1.run(FIFOScheduler.java:139)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:178)
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:292)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)

```

1.6.2では動いたのに、2.0.0では独自jarが読めない
かつ、#executorsの設定が反映されない。

zeppelinではなくて sparkのspark-submitのoptionが効いてない？
mac買ってきてから作業入れるようにするまでの設定(メモ)

次セットアップするとき何も考えずにやりたいのでメモ

##MacBook Pro
Retina, 15-inch, Mid 2015
core i7
メモリ16GB
ストレージ 256GB

##初期設定
・F系のキーを標準の動作にしたい
システム環境設定→キーボード→F1,F2などのすべてのキーを標準の〜
にチェックを入れる。

・macの起動音を消したい
ターミナルで、
sudo nvram SystemAudioVolume=%80

・macの不可視ファイルを表示させる。
ターミナルで、
defaults write com.apple.finder AppleShowAllFiles -boolean true
killall Finder

・トラックパッドとマウスでスクロールの方向を逆に設定する。
[Karabiner]を使用
https://pqrs.org/osx/karabiner/index.html.ja
こちらに詳しく載っている。
http://easyramble.com/reverse-scroll-with-mac-mouse.html


##ウイルスソフト入れる
私はesetです。軽い気がする。
http://thehikaku.net/security/hikaku.html

##office系を入れる
2011 office for macを使っているのですが、retinaだとぼけるのでこちらを実行。
ピンボケが解消されました。
http://uva.jp/dh/mt/archives/005505.html

##adobeを入れる
ccが主流。

##ブラウザをインストール
chrome,firefox,safari

##sourceTreeを入れる
差分抽出のバッチファイルの作成方法
https://ics.media/entry/4475

##dropboxを入れる
https://www.dropbox.com/

##nodebrewを入れる
こちらの記事を参考に
http://qiita.com/saekis/items/d580d1c2ae4f32a6ae99

##Xcodeを入れる
他のツールとの兼ね合いに必要だった気がする。

##XAMPPを入れる。
もともとwindows使いなので、一応入れておく
http://qiita.com/leveloper8/items/c4f6a5d4897301e832a7
バーチャルホストの設定で403ではまったのでこちらを参照。
http://qiita.com/resistance_gowy/items/99afca4e29facd1ff41c

##sublimeTextを入れる
入れるパッケージ
・AutoFileName
・ConvertToUTF8
・Codecs33(Sublime Text 3ではConvertToUTF8がこれ無いと動かない)
・EditorConfig
・EditorConfigSnippets
・Emmet
・Hayaku
・Handlebers
・jade
・HTML5
・Sass
・Tag
・PyV8

##Charlesを入れる
正直よくわかってないのだが便利そうなので入れる
https://www.charlesproxy.com/
http://qiita.com/dayoshix/items/d02e46b033b8f7d9f471

##virtualbox & vagrant を入れる
http://pc-karuma.net/mac-virtualbox-install/
https://www.vagrantup.com/
[Mac+VirtualBox+仮想マシン（旧modern.IE）でIEとEdgeの確認を行う方法]
http://webmem.hatenablog.com/entry/how-to-check-Microsoft-Edge-and-versions-of-IE6-throuth-IE11-using-VirtualBox-and-Windows-Virtual-Machines-on-Mac
[MacでVirtualBoxと無料のWindows Virtual MachinesでIEのテスト環境を構築する]
http://kudakurage.hatenadiary.com/entry/2015/12/24/183744
[Mac OSXとWindows8 on VirtualBoxで同じショートカットキーを使う方法]
http://pc-karuma.net/mac-osx-windows8-on-virtualbox-keyboard-shortcut/
[VirtualBoxでOS間のクリップボードを共有する方法]
http://pc-karuma.net/virtualbox-clipboard-share/

##ブックマーク
はてぶ
http://b.hatena.ne.jp/
qiita
http://qiita.com/
WPJ(有料)
https://www.webprofessional.jp/
codegrid(有料)
http://www.codegrid.net/
dotinstall
http://dotinstall.com/
html5 experts
https://html5experts.jp/

##chrome extension
The QR Code Extension
password manager
Wappalyzer

##アプリ
slack
skype
[baserCMS]CPIサーバでWAFに引っ掛かって記事更新できないとき


WAFの影響で記事更新できないときには以下で対策取ることができる。


## 管理側だけWAF無効化する

- 管理側URLと同じ配置でディレクトリ作る
    - http://example.com/admin の場合 /admin/ でディレクトリ作る
- 中に index.php と .htaccess 置く

■ /admin/index.php

```php
<?php
header('Location: /admin/dashboard/index');
exit;
```

■ /admin/.htaccess

```
<IfModule siteguard_module>
    SiteGuard_User_ExcludeSig all
</IfModule>
```


## 参考情報

- [レンタルサーバー毎の設定 - baserCMS公式ガイド](http://wiki.basercms.net/%E3%83%AC%E3%83%B3%E3%82%BF%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%AF%8E%E3%81%AE%E8%A8%AD%E5%AE%9A)


### 情報提供元

- [株式会社ディーゼロ](http://www.d-zero.co.jp/)
ポケモンの名前を英語から日本語に翻訳するスクリプト

ポケモンGOの海外APIを利用する際、モンスター名が英語の為日本語に翻訳するスクリプトを作ってみました。

## `pokemon.json`

[ポケモンの外国語名一覧 - ポケモンWiki](http://wiki.xn--rckteqa2e.com/wiki/%E3%83%9D%E3%82%B1%E3%83%A2%E3%83%B3%E3%81%AE%E5%A4%96%E5%9B%BD%E8%AA%9E%E5%90%8D%E4%B8%80%E8%A6%A7)よりモンスター名を調べました。（エクセルでCSVファイルにしました）

これを　[csv-2-json](https://www.npmjs.com/package/csv-2-json) を利用してjsonファイルに置き換えます。

```json:pokemon.json
[
    {
        "ja": "フシギダネ",
        "en": "Bulbasaur"
    },
    {
        "ja": "フシギソウ",
        "en": "Ivysaur"
    },
    {
        "ja": "フシギバナ",
        "en": "Venusaur"
    },
    {
        "ja": "ヒトカゲ",
        "en": "Charmander"
    },
    {
        "ja": "リザード",
        "en": "Charmeleon"
    },
    {
        "ja": "リザードン",
        "en": "Charizard"
    },
    {
        "ja": "ゼニガメ",
        "en": "Squirtle"
    },
    （略）
    {
        "ja": "ディアンシー",
        "en": "Diancie"
    },
    {
        "ja": "フーパ",
        "en": "Hoopa"
    },
    {
        "ja": "ボルケニオン",
        "en": "Volcanion"
    }
]
```
映画の最新作のモンスターも含まれますが、そのうちゲームにも登場するやもしれないのでそのままjson化しました。

[PonDad/pokemon.json](https://gist.github.com/PonDad/93922f63c3143489e30c3716d3d176d2)

## 名前を翻訳するスクリプト

こんな風に書いてみました。

```javascript:app.js
var fs = require("fs");
var json = JSON.parse(fs.readFileSync('./pokemon.json', 'utf8'));

for(var i = 0 ; i<json.length ; i++ ){
  if(json[i].en === process.argv[2]){
    console.log(json[i].ja);
  }
};

```

コマンドラインで以下の様に実行します。

```bash:terminal
$ node app.js Squirtle
ゼニガメ

```

jsonファイルはご自由にお使い下さいませ。では。
swift document読んでみた1:循環参照（備忘録的に書く）

# 循環参照
“Strong Reference Cycles Between Class Instances”

きっと循環参照のことを書いてるのだと思います。（間違ってたら教えてください。）

swiftの循環参照ってどんな感じっていう説明がまずありました。

以下のようにPerson, Apartmentクラスがあります。

```swift:
class Person {
    let name: String
    init(name: String) { self.name = name }
　　　　　　　　// Apartmentクラスをpropertyとして
    var apartment: Apartment?
    deinit { println("\(name) is being deinitialized") }
}
 
class Apartment {
    let number: Int
    init(number: Int) { self.number = number }
　　　　　　　　// Personクラスをpropertyとして
    var tenant: Person?
    deinit { println("Apartment #\(number) is being deinitialized") }
}
```


上記のようにPersonクラスの中でApartmentオブジェクトを参照、Apartmentクラスの中でPersonオブジェクトを参照しようとしているとします。
それを以下のように使った場合、、、

```swift
var john: Person?
var number73: Apartment?

john = Person(name: "john bonbon")
number73 = Apartment(number: 73)

//ここでお互いのオブジェクトを参照させる
john!.apartment = number73
number73!.tenant = john
```

こうなってしまうと循環参照が発生してしまうのである。
”johnオブジェクト"の中のapartmentが"Apartmentオブジェクト"を参照。
"Apartmentオブジェクト"の中のtenantが"Personオブジェクト"を参照。
お互いに参照しちゃってる。

こうなると何がダメなのか。

```swift
john = nil
number73 = nil
```

上記のようにそれぞれにnilをいれてもdeinitが呼ばれない。
つまりメモリの中に残り続けてしまう。

こんなコード書いてたら**メモリリーク起きちゃうよー！**

ということで次は循環参照をさせないようにするため方法を書いていきます。
Cocos2d-JS + CocosStudio アニメをスムーズにする

# 一カ所直すだけ
　最初に断っておきますが、CocosStudio で編集したアニメに対してだけの効果があります。普通の Action 等には影響ありません。CocosStudio 自体、もう開発停止になっているらしいので需要があるかどうかわかりませんが…。
　Cocos2d-JS の ActionTimeline クラスの step() 関数内にある、

```js:ActionTimeline.js
    this._currentFrame = Math.floor(this._time / this._frameInternal);
```
または、古いバージョンだと

```js:ActionTimeline.js
    this._currentFrame = (this._time / this._frameInternal) | 0;
```

のようになっている行があると思います。
　これは、小数点以下を切り捨てているわけですが、これを

```js:ActionTimeline.js
    this._currentFrame = this._time / this._frameInternal;
```

として、小数点以下を捨てないようにしてみてください。世界が変わると思います。

# スムーズになる理由
　そもそも、なぜ小数点以下を切り捨てているのかといいますと、単に元ソースである C++ ソースで _currentFrame が int 型だからです。それをベタ移植した結果かと思われます。
　それで、_currentFrame はフレーム番号ですから、本来は
    0, 1, 2, 3, 4, 5, ...
と順番に増えていって欲しい訳ですが、JavaScript は小数計算の精度が低いため、この Cocos2d-JS で行っているような計算方法だと
    0, 1, 1.9999, 3, 4, 4.9999, ....
のような値になってしまいます。それで、小数以下を切り捨ててしまうと
    0, 1, 1, 3, 4, 4, ....
になってしまい、飛び飛びのフレームが表示されていたことになるわけです。
　だから、もし整数にしたいなら

```js:ActionTimeline.js
    this._currentFrame = Math.round(this._time / this._frameInternal);
```

とすべきなのです。
　ただ、この _currentFrame を引数として渡している関数を調べたところ特に _currentFrame が整数である必要はなく、1.5 を指定すればフレーム#1と#2の間をちゃんと補間するようになっていたので、わざわざ丸める必要もなかったわけです。
　なので、先に示したように

```js:ActionTimeline.js
    this._currentFrame = this._time / this._frameInternal;
```

にするだけで、スムーズに再生されるようになるというものでした。

以上。
jsdoでAM変調、復調

#概要
jsdoでAM変調、復調やってみた。
復調は、IQ復調。
#写真
![dd.jpg](https://qiita-image-store.s3.amazonaws.com/0/18104/770f2e8e-448a-4ae7-0b5e-1418678738fd.jpeg)
#実際
http://jsdo.it/ohisama1/sKXO
#サンプルコード
```
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
function lpf(input, samplerate, freq) {
    var q = 1.0;
    var omega = 2.0 * 3.14159265 * freq / samplerate;
    var alpha = Math.sin(omega) / (2.0 * q);
    var a0 = 1.0 + alpha;
    var a1 = -2.0 * Math.cos(omega);
    var a2 = 1.0 - alpha;
    var b0 = (1.0 - Math.cos(omega)) / 2.0;
    var b1 = 1.0 - Math.cos(omega);
    var b2 = (1.0 - Math.cos(omega)) / 2.0;
    var output = new Float32Array(1000);
    var size = 1000;
    var in1 = 0;
    var in2 = 0;
    var out1 = 0;
    var out2 = 0;
    for (var i = 0; i < size; i++)
    {
    	output[i] = b0 / a0 * input[i] + b1 / a0 * in1 + b2 / a0 * in2 - a1 / a0 * out1 - a2 / a0 * out2;
     	in2 = in1;
     	in1 = input[i];
    	out2 = out1;
    	out1 = output[i];
    }
    return output;
}
function draw(data, n) {
	var hcenter = n * 150 + 100;
    ctx.strokeStyle = "#0f0";
    ctx.lineWidth = 2;
	ctx.moveTo(0, hcenter);
    for (var i = 1; i < canvas.width; i++) 
    {
        ctx.lineTo(i, data[i] * 15 + hcenter);
    }
	ctx.stroke();
}
function make() {
    var t;
    var src = new Float32Array(1000);
    var am = new Float32Array(1000);
    var I = new Float32Array(1000);
    var Q = new Float32Array(1000);
    var I2;
    var Q2;
    var o = new Float32Array(1000);
    for (t = 0; t < 1000; t++)
    {
        src[t] = Math.sin(t / 8000 * 2 * Math.PI * 220) * 2 - 1;
    }
    draw(src, 0);
    for (t = 0; t < 1000; t++)
    {
        am[t] = (0.6 * Math.sin(t / 8000 * 2 * Math.PI * 220) + 1.0) * Math.sin(t / 8000 * 2 * Math.PI * 3000) * 2 - 1;
    }
    draw(am, 1);
    for (t = 0; t < 1000; t++)
    {
        I[t] = am[t] * Math.cos(t / 8000 * 2 * Math.PI * 2800);
        Q[t] = am[t] * Math.sin(t / 8000 * 2 * Math.PI * 2800);
    }
    I2 = lpf(I, 8000, 300);
    Q2 = lpf(Q, 8000, 300);
    for (t = 0; t < 1000; t++)
    {
        o[t] = Math.sqrt(I2[t] * I2[t] + Q2[t] * Q2[t]) * 4 - 6;
    }
    draw(o, 2);
} 
make();


```
Githubにpush出来ない時に見るポイント

何回かハマったのでメモ

状況としては下記のような状態

 - Githubのリポジトリにpushしようとしたが、ID/PASSを求められる。
 - Githubに登録してある鍵は正しい。


上記のような状況に出くわした場合、pushしようとしているリポジトリの設定が原因である可能性が高い。

下記コマンドでリポジトリのリモート設定を書き換えてやる必要がある。
```
git remote set-url origin git@github.com:username/repo.git
```



参考
http://stackoverflow.com/questions/6565357/git-push-requires-username-and-password
ActiveSupport::TimeWithZone を型変換せずにイテレートする

```rb
from = Time.zone.parse('2016/07/25 12:30:00')
to   = Time.zone.parse('2016/07/31 12:30:00')
```

# そのまま

```rb
(from..to).each.with_index(1) { |t, i| puts("#{i} 日目: #{t}") }
```
```
TypeError: can't iterate from ActiveSupport::TimeWithZone
```

悲しい :sob:

# DateTime に変換する

```rb
(from.to_datetime..to.to_datetime).each.with_index(1) { |t, i| puts("#{i} 日目: #{t}") }
```
```
1 日目: 2016-07-25T12:30:00+09:00
2 日目: 2016-07-26T12:30:00+09:00
3 日目: 2016-07-27T12:30:00+09:00
4 日目: 2016-07-28T12:30:00+09:00
5 日目: 2016-07-29T12:30:00+09:00
6 日目: 2016-07-30T12:30:00+09:00
7 日目: 2016-07-31T12:30:00+09:00
```

動く :neutral_face: 

# ActiveSupport::TimeWithZone のまま頑張るぞい！

```rb
class TimeWithZoneRange
  include Enumerable
  
  def initialize(range, interval=1.day)
    @range = range
    @interval = interval
    @from = range.first
    @to = range.last
  end

  def each
    return enum_for(:each) unless block_given?

    time_with_zone = @from

    loop do
      yield(time_with_zone)
      time_with_zone = time_with_zone.since(@interval)

      next if cover_last? && time_with_zone == @to
      break unless time_with_zone < @to
    end
    
    self
  end

  private

  def cover_last?
    @range.cover?(@to)
  end
end
```
```rb
TimeWithZoneRange.new(from..to).each.with_index(1) { |t, i| puts("#{i} 日目: #{t}") }
```
```
1 日目: 2016-07-25 12:30:00 +0900
2 日目: 2016-07-26 12:30:00 +0900
3 日目: 2016-07-27 12:30:00 +0900
4 日目: 2016-07-28 12:30:00 +0900
5 日目: 2016-07-29 12:30:00 +0900
6 日目: 2016-07-30 12:30:00 +0900
7 日目: 2016-07-31 12:30:00 +0900
```
```rb
TimeWithZoneRange.new(from...to).each.with_index(1) { |t, i| puts("#{i} 日目: #{t}") }
```
```
1 日目: 2016-07-25 12:30:00 +0900
2 日目: 2016-07-26 12:30:00 +0900
3 日目: 2016-07-27 12:30:00 +0900
4 日目: 2016-07-28 12:30:00 +0900
5 日目: 2016-07-29 12:30:00 +0900
6 日目: 2016-07-30 12:30:00 +0900
```

いい  :blush: 
けれど、TimeWithZoneRange って名前が微妙 :weary:
ruby linux process

```rb
vagrant@precise64:~/data/daemons$ pry
[1] pry(main)> ObjectSpace.each_object(File).select {|a| a.closed? == false }.each do |a|
[1] pry(main)*   puts a.fileno
[1] pry(main)* end  
5
=> [#<File:/home/vagrant/.pry_history>]
```

```rb
ObjectSpace.each_object.select {|a| a.is_a? File}.each do |a|
	puts a.path
end
```

```bash
vagrant@precise64:~/data/daemons$ ruby 2.rb 
/home/vagrant/.rvm/rubies/ruby-1.9.3-p551/lib/ruby/site_ruby/1.9.1/rubygems/exceptions.rb
/home/vagrant/.rvm/rubies/ruby-1.9.3-p551/lib/ruby/site_ruby/1.9.1/rubygems/requirement.rb
/home/vagrant/.rvm/rubies/ruby-1.9.3-p551/lib/ruby/site_ruby/1.9.1/rubygems/specification.rb
/home/vagrant/.rvm/rubies/ruby-1.9.3-p551/lib/ruby/site_ruby/1.9.1/rubygems/version.rb
/home/vagrant/.rvm/rubies/ruby-1.9.3-p551/lib/ruby/site_ruby/1.9.1/rubygems/platform.rb
/home/vagrant/.rvm/rubies/ruby-1.9.3-p551/lib/ruby/site_ruby/1.9.1/rubygems/basic_specification.rb
/home/vagrant/.rvm/rubies/ruby-1.9.3-p551/lib/ruby/site_ruby/1.9.1/rubygems/stub_specification.rb
/home/vagrant/.rvm/rubies/ruby-1.9.3-p551/lib/ruby/site_ruby/1.9.1/rubygems/util/stringio.rb
/home/vagrant/.rvm/rubies/ruby-1.9.3-p551/lib/ruby/site_ruby/1.9.1/rubygems/core_ext/kernel_gem.rb
/home/vagrant/.rvm/rubies/ruby-1.9.3-p551/lib/ruby/site_ruby/1.9.1/rubygems/core_ext/kernel_require.rb
/home/vagrant/.rvm/rubies/ruby-1.9.3-p551/lib/ruby/1.9.1/monitor.rb
2.rb
```
d3jsのactiveを使って「Uncaught Error: too late」が出たときの対処法

#activeを使う
```js
d3.selectAll("svg")
.transition()
.on("end", function repeat() {
    d3.active(this)
    .style("fill", "red");
});
```

##エラー
```
Uncaught Error: too late
```

##原因
transitionがendしていて、activeなものがないからエラー。

#selectに変える
```js
d3.selectAll("svg")
.transition()
.on("end", function repeat() {
    d3.select(this)
    .style("fill", "red");
});
```

エラー消えた :innocent:
格安SSL証明書の価格一覧

# 海外格安SSL証明書
| サービス名| 販売企業          | 商品名       | 認証局  | 1年   | 2年    | 3年    |
|:---------|-------------------|:------------|:-------|:------|:-------|:-------|
| GoGetSSL | EnVers Group Ltd. | PositiveSSL | Comodo | $7.85 | $12.75 | $13.85 |
| SSLs.com | SSLs, Inc.        | PositiveSSL | Comodo | $8.95 | $13.98 | $14.97 |

# 国内格安SSL証明書
| サービス名|販売企業   | 商品名    | 認証局 | 1年     | 2年     | 3年     |
|:--------|------------|:---------|:------|:--------|:--------|:--------|
| SSLボックス|ネットオウル | [CoreSSL](http://www.sslbox.jp/service/service_core_lineup.php) | Comodo | 1,069円 | 1,922円 | 2,559円 |
| FujiSSL | ニジモ | [FujiSSL](https://www.fujissl.jp/certificate/price/) | SECOM | 1,080円 | 1,944円 | 2,592円 |
| SSLOFF    | エピス     | [PositiveSSL](https://www.ssloff.com/comodo-positivessl/#price) | Comodo | 1,188円 | 2,160円 | 2,970円 |
| SSLストア  |ニジモ     | [PositiveSSL](https://www.ssl-store.jp/comodo-positivessl/) | Comodo | 1,200円 | 2,200円 | 3,200円 |
| SSLストア  | ニジモ    | [RapidSSL](https://www.ssl-store.jp/rapidssl/)  | GeoTrust | 1,620円 | 2,916円 | 3,456円 |
| さくらのSSL | さくらインターネット | [RapidSSL](https://ssl.sakura.ad.jp/rapid_ssl.html)  | GeoTrust | 1,620円 | 2,916円 | 3,456円 |

# 格安ワイルドカードSSL証明書
| サービス名 | 販売企業   | 商品名    | 認証局 | 1年      | 2年      | 3年      |
|:----------|-----------|:---------|:------|:---------|:---------|:---------|
| SSLストア   | ニジモ | PositiveSSL | Comodo | 11,000円 | 21,000円 | 30,000円 |
| SSLOFF    | エピス  | PositiveSSL | Comodo | 13,392円 | 25,177円 | 35,355円 |
| SSLOFF    | エピス  | EssentialSSL | Comodo | 13,824円 | 25,989円 | 37,740円 |
| SSLボックス | ネットオウル | CoreSSL | Comodo | 17,280円 | 32,400円 | 45,360円 |
| SSLストア   | ニジモ | RapidSSL  | GeoTrust | 20,000円 | 35,300円 | 50,000円 |
| SSLOFF    | エピス  | RapidSSL  | GeoTrust | 23,652円 | 45,792円 | 67,392円 |

# ジオトラスト クイックSSL プレミアム
| サービス名 | 販売企業                | 1年       | 2年      | 3年      |
|:---------|--------------------------|:--------:|:--------:|:--------:|
| GoGetSSL | EnVers Group Ltd.        | $46.85   | $80.65   | $115.25  |
| SSLs.com | SSLs, Inc.               | $49.99   | $95.98   | $137.97  |
| SSLストア | ディファイン             | 7,560円   | 14,040円 | 19,440円 |
| OnLineSSL | ケープコッド             | 9,000円  | 15,700円 | 22,700円 |
| SSL MART | インフォジャムネットワーク | 10,400円 | 19,640円  | 27,200円 |
App Engine Flexible Environment

![sinmetal.png](https://qiita-image-store.s3.amazonaws.com/0/15640/1f9d09e5-9ad5-f91e-0b49-570bbe8f36b6.png)

---

## What is App Engine FE?

* App Engineのコンテナを、Dockerベースのものに差し替え、Compute Engineの上で動かす機能
* 旧 Managed VMs ([Managed VMs誕生までの歴史を振り返る](http://qiita.com/sinmetal/items/68f0e21e1f33e3a553a1))

---

## App Engine Architecture

<img width="879" alt="appengine.png" src="https://qiita-image-store.s3.amazonaws.com/0/15640/5c198501-6fc4-9e29-4f0b-175098ff3049.png">

---

## App Engine Standard Environment

* 限定されたコンテナ
* runtime 縛り (Java, Python, Go, PHP)
* CPUはシングルコアのみ
* メモリの最大は1GB

---

## App Engine Standard Environment

* ミドルウェア利用不可
* local file systemに書き込み不可
* 好きなportをlistenできない

--- 

## App Engine Flexible Environment

* Compute Engine上にコンテナを立てる
* Dockerコンテナ
* 自由な世界
* App EngineのAPIをそのまま使える
* ミドルウェアインストール可能

---

## App Engine FE Architecture

<img width="917" alt="appengine_fe.png" src="https://qiita-image-store.s3.amazonaws.com/0/15640/b737a3c3-c82f-b515-3b7d-82d20f32b904.png">

---

## FEで用意済みのRuntime

* Go
* Java 8 / Servlet 3.1 / Jetty 9
* Python 2.7 and Python 3.4
* Node.js
* Ruby

---

## Demo

---

## Custom Runtime

* 好きなDockerfileを書いて動かす

---

## App Engine FEの使いどころ

* WebSocket (ただし、めんどう。。。)
* マルチコアCPU, 豊富なメモリ
* ImageMagickなどミドルウェアが必要な時
* standard runtime以外が使いたい時

---

# FEでClientからのリクエストを受け取る

---

## WebSocketはなぜめんどうか？

* App Engine FrontendはWetSocketが使えない
* FEが動いているGCEのグローバルIPAddrに接続する必要がある

<img width="913" alt="client_gce.png" src="https://qiita-image-store.s3.amazonaws.com/0/15640/39f205e5-5acf-80a0-5da1-939f01967db3.png">

---

## FEは好きなportをlistenできる？

* Yes
* しかし、やっぱり、App Engine Frontendは通れない

<img width="913" alt="client_gce.png" src="https://qiita-image-store.s3.amazonaws.com/0/15640/39f205e5-5acf-80a0-5da1-939f01967db3.png">

---

# SEでできないことをFEに頼る

---

## SEでできないことをFEに頼る

* ユーザからのリクエストはSEで受け、後ろのバッチはFEで回す
* Example : サムネイル作成 ...

<img width="658" alt="Screen Shot 2016-07-28 at 21.44.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/15640/445eb4ae-1db2-16af-8e16-d3dcb1c892e9.png">

---

## FEで失われた物

* spinup speed - SE:10ms ~ 7000ms, FE:1min
* price - SE:豊富な無料枠, FE:Compute Engineの料金に準拠

---

## FEの不便なところ

* [Preemptible VM](https://cloud.google.com/compute/docs/instances/preemptible)が使えない
* 1VM 1コンテナ
* 最低インスタンス台数 = 1

---

## Preemptible VMを使ったバッチ処理

* TaskはQueueで管理し、Preemptible Instanceがshutdonwされても、別のWokerでTaskをリトライする
* Taskの数に応じてWorkerの数を調整

<img width="562" alt="Screen Shot 2016-08-25 at 00.27.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/15640/9675994c-562d-6c65-ba16-cb2295912d68.png">

---

## Preemptible VMを使う利点

安い

---

## 僕が欲しかったFE

* 1 VM マルチコンテナ
* 負荷に応じて、コンテナをスケールさせる

<img width="681" alt="Screen Shot 2016-07-28 at 21.48.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/15640/d5c21d85-b46c-e5b3-e61a-9b0460df752c.png">

---

## Resources

* [App Engine Flexible Environment](https://cloud.google.com/appengine/docs/flexible/)
* [Managed VMs誕生までの歴史を振り返る](http://qiita.com/sinmetal/items/68f0e21e1f33e3a553a1)
The URI you submitted has disallowed characters.


Codeigniter を利用している人なら一度はぶつかった壁があるかもしれないこのエラー。

```php:config/config.php
$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
```
を

```php:config/config.php
$config['permitted_uri_chars'] = '一-龠ぁ-んァ-ヴーａ-ｚＡ-Ｚ０-９a-z 0-9~%.:_-';
```
に変えるんだそうですが、未だにこれの意義がわからない…。
別に設定変えなくても日本語URL通るんだけど、これはもしかして Chrome がご丁寧にURLエンコードかけているのかしらん？


そんな釈然としないところもあるけど、本題。（っていうか本題すぐ終わっちゃう）

問題は間隔スペースなんだよね。フォームで入力された文字をURLに渡すんだけど、どうも半角スペースが入ると、掲題のエラーが発生。そして、ネットにもコレって言う回避方法が見つからない。

```php:config/config.php
//$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-';
```
こんな荒業もあったけど、こんなことしてセキュアなのか、そもそもこの制限がセキュリティ的に何を寄与しているかもさっぱりわからない。

と、いろいろ調べていくうちにエンコードの歴史的経緯なんて調べてたわけ。
[技術/HTTP/URLエンコードで 0x20(スペース) を "+" にすべきか "%20" にすべきか](http://www.glamenv-septzen.net/view/1170)
…なんてゆとり入り口世代には苦痛で読めんわ。これだけ調べあげるってどんだけ暇人だよ。
ホント人類へ貢献ありがとうございました。m(_ _)mｶﾝｼｬ

そしたら神仕様のスライドショーを発見
[お前は PHP の歴史的な理由の数を覚えているのか](http://www.slideshare.net/ebihara/php-32340906)

最初から笑わせてもらったけど、結論から言うと<del>５つ</del>、
PHPの 
`urlencode()` →　RFC1738に準じておらず、半角スペースを + に変換
`rawurlencode()` →　RFC1738に準ずるかたちで、半角スペースを %20 に変換

え…？？　そうなの？

つーこので、URLに送る前のキーワードをエンコードしてる `urlencode()` を `rawurlencode()` に変更してみましたところ…。

ああ、通った。

な〜んだ、Codeigniterの解釈は正しかったのね。慣例となっている + は許さず、正しい %20 を通してたという落ちでした。

さらなるオチは、正規表現を理解しようとしない私の問題でし。
CS-CART ローディングスピナーが表示されない時


## CS-CARTのローディングスピナーが表示されない

レンタルサーバーを借りてCS-CARTをインストールした場合、
ローディング時のスピナー（くるくる）が表示されない時があります。

これは、借りているサーバーのApatchが
svgを扱う設定になっていない為です。

こんな時はsvgを扱いたいフォルダーの.htaccess ファイルの最下部に
以下を追記します。

```
AddType image/svg+xml .svg .svgz
```


今回の場合はcs-cartをインストールしたルートフォルダー（最上位フォルダー）の
 .htaccess ファイルで問題ないでしょう。

.htaccessファイルを設置すると、
ファイルを設置したフォルダー以下の全サブフォルダーにも設定が適用されます。

ちなみに、サブフォルダーに別の .htaccessファイルが存在する場合は、
ルートフォルダーの.htaccessファイルの内容とマージされます。
同じ項目の設定が重複している場合は、サブフォルダーの設定が優先されます。

## 注意点

「.htaccess」ファイル内の最後には、必ず改行を入れて下さい。
改行がないと動かない場合があります。

編集時のミスを防ぐ目的で、
適当に2～3行の空行を末尾に入れておくのがおすすめです。

## Apatchを再起動する
.htaccessをルートフォルダーにアップロードしたら、
Apatchを再起動して設定を有効にする必要がありますが、
通常、レンタルサーバー等ではApatchの再起動等の操作は認められていません。

代替策として、サーバー管理画面からベーシック認証の設定をします。

ベーシック認証を設定するとサーバーは.htaccessファイルを書き換えてから
Apatchを再起動します。

ベーシック認証が不要の場合は、設定完了後に設定を削除します。