OmniAICreator/Qiita-1.07M huggingface dataset:
Digdag + Dockerを使うときの環境変数に注意


# 概要
DigdagでDockerを利用するときには、Dockerホストの環境変数が引き継がれるようなので、注意が必要です。

# 再現方法
```YAML
+test:
  _export:
    docker:
      image: ubuntu:16.04
  sh>: printenv
```

実行結果

```
digdag run docker_test.dig --rerun
2017-07-26 12:48:14 +0900: Digdag v0.9.12
2017-07-26 12:48:15 +0900 [WARN] (main): Reusing the last session time 2017-07-26T00:00:00+00:00.
2017-07-26 12:48:15 +0900 [INFO] (main): Using session /Users/shiozaki/Documents/digdag_test/project/.digdag/status/20170726T000000+0000.
2017-07-26 12:48:15 +0900 [INFO] (main): Starting a new session project id=1 workflow name=docker_test session_time=2017-07-26T00:00:00+00:00
2017-07-26 12:48:16 +0900 [INFO] (0018@[0:default]+docker_test+test): sh>: printenv
TERM_SESSION_ID=w0t2p0:B7E8E7A6-A108-48DD-9BD8-0DB64CD9347E
session_date=2017-07-26
timezone=UTC
session_unixtime=1501027200
USER=shiozaki
project_id=1
<略>

Success. Task state is saved at /Users/shiozaki/Documents/digdag_test/project/.digdag/status/20170726T000000+0000 directory.
  * Use --session <daily | hourly | "yyyy-MM-dd[ HH:mm:ss]"> to not reuse the last session time.
  * Use --rerun, --start +NAME, or --goal +NAME argument to rerun skipped tasks.
```

# 問題のありそうな環境変数

今のところ、以下の環境変数が引き継がれることによる問題に出会いました。

## HOME
embulk gemがライブラリのインストール先ディレクトリを決めるときにはHOMEを参照するようです。
そのため、以下のような記述をしたら、gemが見つからずにembulkの実行に失敗しました。

```YAML
+run_embulk:
  _export:
    docker:
      image: java:7-jre
      build:
        - curl --create-dirs -o /bin/embulk -L "https://dl.bintray.com/embulk/maven/embulk-0.8.25.jar"
        - chmod +x /bin/embulk
        - embulk gem install embulk-input-mysql embulk-output-bigquery
  sh>: embulk run transfer_conf.yml
```

## TEMPDIR
embulk-output-bigqueryではGCPのJSON keyをYAMLに直に書くこともできます。
https://github.com/embulk/embulk-output-bigquery#json-key-of-gcps-service-account

その場合は、プラグイン内で一時ディレクトリを作り、その中にJSON keyファイルを書き出す挙動を行います。
この一時ディレクトリのパスを決めるためにTEMPDIRが参照されていました。

# 解決策
`_export`を使って、問題のある環境変数を上書きすることでこの問題を解決することができます。
例えば、上例のembulkの場合であれば、以下のように書けばOKです。

```YAML
+run_embulk:
  _export:
    HOME: /root
    docker:
      image: java:7-jre
      build:
        - curl --create-dirs -o /bin/embulk -L "https://dl.bintray.com/embulk/maven/embulk-0.8.25.jar"
        - chmod +x /bin/embulk
        - embulk gem install embulk-input-mysql embulk-output-bigquery
  sh>: embulk run transfer_conf.yml
```
KotlinでEnumを使う

## ● 概要
* AndroidJavaと同じようにEnumを使う方法を調査。
* Enumに複数個の引数を持った場合の動作確認を実施。

### ◆ Enumの利用方法
* 基本的なEnumの利用方法は以下参照。
 + [Kotlin公式 列挙型クラス (Enum Classes)](https://dogwood008.github.io/kotlin-web-site-ja/docs/reference/enum-classes.html)
 + [[kotlin] Realmでenum型を値としたモデルを作る方法 [Android]](http://blog.mogmet.com/how-to-support-enums-on-realm-by-kotlin/)

### ◆ 複数個の引数を持ったEnumの利用方法
* 記事が見つからなかったので、これで合ってるだろうという感じで以下の様に実装してみました。※動くことは確認してますｗ

```kotlin:TestEnum.kt
/**
 * numberとnameを持ったEnum
 */
enum class TestEnum(val number: Int,
                    val nameText: String) {
    AAA(2, "aaa"),
    BBB(5, "bbb")
}
```

```kotlin:MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        // 呼び出し
        println("getEnumNameText:" + getEnumNameText(5))
    }
}


/**
 * 引数numberに紐づくTestEnumのNameTextを取得する
 * @param number
 */
fun getEnumNameText(number: Int): String {
    return TestEnum.values().filter { number == it.number }.first().nameText
}
```
date コマンドで日時のミリ秒単位まで表示する

date コマンドの出力フォーマットに %N を指定するとナノ秒が表示できる。ミリ秒を表示するには上位3桁分だけ表示するように %3N を指定すればいい。

%N は GNU Coreutils の拡張なので GNU ではない date コマンドでは使えない。

[GNU Coreutils: Time conversion specifiers](https://www.gnu.org/software/coreutils/manual/html_node/Time-conversion-specifiers.html)

> ‘%N’
> nanoseconds (‘000000000’…‘999999999’). This is a GNU extension.

例えば以下のシェルスクリプトでは「年月日\_時分秒\_ミリ秒」のフォーマットで日時を表示することができる。

```sh
#!/bin/sh
DATETIME=`date +%Y%m%d_%H%M%S_%3N`
echo $DATETIME
```

シェルスクリプトを何度か実行した例。

```
$ ./foobar.sh
20170726_123413_433
$ ./foobar.sh
20170726_123413_664
$ ./foobar.sh
20170726_123413_888
$ ./foobar.sh
20170726_123414_129
$ ./foobar.sh
20170726_123414_361
$ ./foobar.sh
20170726_123414_576
```
SQLServerの移行作業

# SQLServerの移行手順
## メモ
たまに使うのでメモとして残しておく
RDS間の移行作業を実施する時に使用
詳細はこちらの[AWSドキュメント](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/SQLServer.Procedural.Importing.html)を参照  
Endpointに関してはR53を使用するとか何か対応を考えておくこと
※入替えorDNS

## 作業の流れ
1. 旧RDSからDBのExport
2. 新RDSの起動
3. 新RDSへDBのImport

## 作業詳細
- 1 旧RDSからDBのExport

```
## データのExport
exec msdb.dbo.rds_backup_database
        @source_db_name='DB名',
        @s3_arn_to_backup_to='arn:aws:s3:::バケット名/バックアップファイル名.bak',
        @overwrite_S3_backup_file=1;

## 進捗状況の確認
exec msdb.dbo.rds_task_status @db_name='DB名'
```

- 2 新RDSの起動
AWS Consoleから起動

- 3 新RDSへDBのImport

```
## データのImport
exec msdb.dbo.rds_restore_database
        @restore_db_name='DB名',
        @s3_arn_to_restore_from='arn:aws:s3:::バケット名/バックアップファイル名.bak',

## 進捗状況の確認
exec msdb.dbo.rds_task_status @db_name='DB名'
```
HTTPステータスコード


よく出くわすものだけ追加していく。

#400 Bad Request

クライアント（ブラウザ）=> ウェブサーバーに向けて送信したリクエストに問題あり

**∴ 大体ユーザー側に問題がある**

#500 Internal Server Error

サーバーの内部エラーに関するもの

**∴ サーバー側に問題がある**

#404 Not Found

画面が見つからないとき

**∴ URLが間違っている /閲覧権限がない /ページが削除された** など


#参考
http://www.bmoo.net/archives/2012/02/312554.html
Gem 作りました。文章のNGワードチェックが簡単に可能です。

##使い方

```irb:XXX.rb
require "message_judgment"
=> true
irb(main):002:0> message="Hello,I want your sex!"
=> "Hello,I want your sex!"
irb(main):003:0> targets=["sex","fuck"]
=> ["sex", "fuck"]
irb(main):004:0> MessageJudgment.message_judgment?(message,targets,false)
=> "Hello,I want your !"
```
```irb:XXX.rb
require "message_judgment"
=> true
irb(main):002:0> message="Hello,I want your sex!"
=> "Hello,I want your sex!"
irb(main):003:0> targets=["sex","fuck"]
=> ["sex", "fuck"]
irb(main):004:0> MessageJudgment.message_judgment?(message,targets,true)
=> "Hello,I want your ***!"
```


まず、チェックしたい文章を第一引数に、配列にNGワードを書き入れてそれを第二引数に渡してください第三引数は*に変換する場合は省略可能です。そうでなく空白にする場合は`false`を指定してください。
以上で、確認できます。

##追記
updateしました.
主な変更点として：NGワードを空白にするのではなく*にも変換できるようにしました。
#感想
誰でも作れます。現に高校生の僕でも出来ました。
##お願い
簡単に使えるのでよろしくお願いします。
[rubygemsorg](https://rubygems.org/gems/message_judgment/versions/1.0)
[リポジトリ](https://github.com/NishidaRyu416/message_judgment)
CakePHP3 Cookie名の変更

/config/app.php

下記ソース部分へ追加

➀
'Session' => [
　　'defaults' => 'php',
],

➀の場合はすべてデフォルト設定になっています。

➁
'Session' => [
　　'defaults' => 'php',
　　'cookie' => 'HOGEHOGE', //任意の名称に変更
],

➁のように「'cookie' => 'HOGEHOGE',」　を追加して'HOGEHOGE'の部分を任意の名称に変更すればOKです。
RxJSのTypeScriptで、演算子一括importする

## RxJS v6 以降の書き方

こういうふうにしかimportできなくなってます。
pipe重ねて、ofは直接importして。

```javascript:
import { of } from 'rxjs'; // of を import
import { map } from 'rxjs/operators'; // pipe で使う演算子 を import

of(1,2,3).pipe(map(x => x + '!!!')).subscribe(str => console.log(str));

// 1!!!
// 2!!!
// 3!!!
```


# <del>v5以前の記事

<del>
いままでTypeScriptでRxやるときは、都度、必要なオペレータ(演算子)を追記importしてたんですけど

```javascript:
import { Observable } from 'rxjs/Observable'; // // Observable を import
import 'rxjs/add/observable/of'; // Observable.of を import
import 'rxjs/add/operator/map'; // Observable.map を import


Observable.of(1,2,3).map(x => x + '!!!').subscribe(str => console.log(str));

// 1!!!
// 2!!!
// 3!!!
```

<del>これで一括importできた。

```javascript:
import { Observable } from 'rxjs/Rx'; // 中核演算子付与済みObservable

Observable.of(1,2,3).map(x => x + '!!!').subscribe(str => console.log(str));

// 1!!!
// 2!!!
// 3!!!
```


<del>てか、ちゃんと[Readme.md](https://github.com/ReactiveX/rxjs/blob/master/README.md)読んだら いの一番に Important って書いてあるんだけど。
Sketch便利プラグイン&カスタマイズ

#プラグイン
プラグインのダウンロードは[Sketchpacks](https://sketchpacks.com)を使用
検索窓からプラグイン名を入力してインストール
※GitHubからダウンロードしてこないとインストールできないプラグインもある

プラグインの管理がしやすく「Sketch Toolbox」より断然オススメ
 
###Craft
名前、住所、画像などのダミーデータの挿入ができる
[Craftの使い方はこちら](http://creative-tweet.net/blog/2016/02/invision-lab-craft-impression.html)
ダミーデータダウンロード
[Craftで使える日本人の男女氏名](https://www.dropbox.com/sh/xnhd7k75dpxzjx5/AAApw6J6qF4mYtN0MBFr7zjKa?dl=0)
InVisionベースのプロトタイプも作れる
※Atomic Designの設計には向いていないためブラウザで作った方がいい
###Rename Layers
レイヤー名の一括変更ができる
先頭に「atoms/」などの構造、末尾に「_dark」などのパターン分けが簡単
###Resize Artboard
『⌃+⇧+Z』でアートボード内の最下部レイヤーに合わせぴったりアートボードを合わせてくれる
※シンボルには効かない 
###Sketch Material
複雑なマテリアルデザインによるコンポーネントをSketch上に出力できる
###Sketch Measure
スペックをhtmlに書き出してくれる
###Swatches
iOS、Material Design、日本の伝統など様々なテーマのカラーパレットを取り揃えている
###Sketch Runer
http://sketchrunner.com
シンボルを呼び出してくれたり、プラグインの実行をしてくれるランチャー
###Symbol Instance Renamer
レイヤー名をシンボル名通りに一括変更してくれる
 
#カスタマイズ
###レイヤーを一括で閉じる
システム環境設定
↓
キーボード
↓
ショートカット
↓
アプリケーション
↓
「+」ボタン
↓
アプリケーション：「Sketch」選択
メニュータイトル：「Collapse All Group 」入力
キーボードショートカット：⌘⎋(esc)
CheckIO (Python) > Non-unique Elements > 実装してみた

https://py.checkio.org/mission/non-unique-elements/

リストの中からuniqueでない要素を取り除く処理。
例として、`[1, 2, 3, 1, 3]`に対して`[1, 3, 1, 3]`を返す。

## v0.1

以下で全assertionをパスしたが、記述が煩雑だ。

```py
from collections import Counter

def checkio(data):
    print(list(data))

    counter = Counter(data)
    pickups = []
    for num, cnt in counter.most_common():
        if cnt > 1:
    		pickups.append(num)
    
    reslist = []
    for elem in data:
    	for flt in pickups:
    		if elem is flt:
    			reslist.append(elem)
    			
    #print(list(reslist))
    return reslist

#Some hints
#You can use list.count(element) method for counting.
#Create new list with non-unique elements
#Loop over original list


if __name__ == "__main__":
    #These "asserts" using only for self-checking and not necessary for auto-testing
    assert list(checkio([1, 2, 3, 1, 3])) == [1, 3, 1, 3], "1st example"
    assert list(checkio([1, 2, 3, 4, 5])) == [], "2nd example"
    assert list(checkio([5, 5, 5, 5, 5])) == [5, 5, 5, 5, 5], "3rd example"
    assert list(checkio([10, 9, 10, 10, 9, 8])) == [10, 9, 10, 10, 9], "4th example"
    print("It is all good. Let's check it now")
```

suggestionを見てもlist.append()を使うようにとのことなので、あまり改善策は思いつかない。

## v0.2

足すのをやめて取り除くことにした。

```py
from collections import Counter

def checkio(data):
    print(list(data))

    counter = Counter(data)
    removes = []
    for num, cnt in counter.most_common():
        if cnt == 1:
            removes.append(num)
    
    for elem in removes:
        data.remove(elem)
        
    #print(list(reslist))
    return data

#Some hints
#You can use list.count(element) method for counting.
#Create new list with non-unique elements
#Loop over original list


if __name__ == "__main__":
    #These "asserts" using only for self-checking and not necessary for auto-testing
    assert list(checkio([1, 2, 3, 1, 3])) == [1, 3, 1, 3], "1st example"
    assert list(checkio([1, 2, 3, 4, 5])) == [], "2nd example"
    assert list(checkio([5, 5, 5, 5, 5])) == [5, 5, 5, 5, 5], "3rd example"
    assert list(checkio([10, 9, 10, 10, 9, 8])) == [10, 9, 10, 10, 9], "4th example"
    print("It is all good. Let's check it now")
    
```
2017年に学ぶべきプログラミング言語のベスト13ランキング（記事紹介）

面白い記事を見つけたので、あらすじを要約しました。

記事はここ：
http://hackingnewstutorials.com/13-best-programming-languages-that-you-need-to-learn-in-2017/

この記事には、前置きとして「なんの目的で学びたい」かを、しっかり考えて欲しいという一言があり、ここはかなり重要だと思います。
会社の新規事業に参加したいから、自分で単純に学ぶ楽しさを感じたいから、誰かに「かっこいい！」と言われたいから。
それによって、学ぶべき言語は大きく左右されるので、まずは、目的から考えて選ぶが大事です。

##　じゃ、人気者は誰？

さて、どの言語かな〜？という部分に進みます。
記事の著者は、様々なランキングや専門家の声を参考に作ったリストはこれです：

* JavaScript
* Java
* Python
* Elixir
* Rust
* Go
* TypeScript
* PHP
* Ruby on Rails
* C#
* Swift

（ショック〜 私の好きなphpが、結構後ろに＾＾；）

このリストの中で更に二つのグループに分けられていて、「2017年の人気言語」と「無視できない言語」にラベリングされています。
このラベリングを追加した状態のリストは、こうなります：

* JavaScript　「2017年の人気言語」
* Java　「2017年の人気言語」
* Python　「2017年の人気言語」
* Elixir　「2017年の人気言語」
* Rust　「2017年の人気言語」
* Go　「2017年の人気言語」
* TypeScript　「2017年の人気言語」
* PHP　「無視できない言語」
* Ruby on Rails　「無視できない言語」
* C#　「無視できない言語」
* Swift　「無視できない言語」

こうみると、人気の高い言語の下に、必須読書みたいに、人気はないけど勉強せずにはいられない言語が残っている印象があります。

## 目的が「開発者になりたい」なら！

このランキング以外に、「フロントエンド開発者になりたかったら」と「バックエンド開発者になりたかったら」という、シンプルな感じで学ぶべき言語が提案されています。2017年にプログラマーを目指すなら！的なざっくりなまとめですが、どこから始めればいいか、となった時、参考になりそうと思ったので、記載します。

### フロントエンド開発者になりたかったら

「無視できない言語」として：HTML, CSS
「2017年の人気言語」として：JavaScript, TypeScript

### バックエンド開発者になりたかったら

「無視できない言語」として：PHP, Ruby on Rails, C#, Swift
「2017年の人気言語」として：Java, Python, Rust, Elixir, Go

## まとめ

記事の最後に、特に若いエンジニアに読んで欲しい文章がありました。私もこれに強く同意です。

```
It’s NOT about how much you KNOW, but rather what you DO with what you know.
```

ちょっとかっこよく訳してみると：

```
_知識_が大事ではなく、その知識を使って_何ができる_かが大事だ。
```

多くの言語を知ってても、少ない言語を完全にマスターしても、足りないということです。
持っている言語のスキルを使って、何を作れるか、どのぐらい早く身軽に開発できるか、どれぐらい人が読めるコードを書けるか、どれぐらいテスタブルなコードを書けるか、が今の世の中ではかなり大事だと思います。
新しいものを学ぶのも素晴らしいけど、今持っている知識の「適用」の仕方を学ぶのも、大事だなと、最近つくづく思っています。
そのテーマについて、面白い記事や書籍を見つけたら、またここにも書いていきます。
SmartGit > 特定のTag情報を知る > タグ検索 | タグ情報のバルーン表記

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.4 #10132
```

Logウィンドウにおいて左側にTagsのリストがある。

このリストから特定のTagのコミットがいつのコミットか確認したいと思っていた。
しかしながら、特定のTagのコミットへのジャンプ方法などがSmartGitでは不明だった。

以下の二通りの方法で確認できそうだ。

### タグ検索

代わりの方法として、メニュー上部の検索ボックス（左側に:mag_right:表記あり)においてタグ名を入力して検索すればいいようだ。

### バルーン表記

左側のTagsリストの特定のタグにマウスカーソルを置いておくと、バルーン表記でそのタグの関連情報が表示される。

![2017-07-26_11h57_42.png](https://qiita-image-store.s3.amazonaws.com/0/32870/42f46b86-a98b-38f1-f9d9-1fcefab57e7e.png)
non-fast-forwad だからpushできない、といわれたとき


`dev3` ブランチにpushしようとしたらrejectされた。

![Screen Shot 2017-07-26 at 11.45.38.png](https://qiita-image-store.s3.amazonaws.com/0/109241/6dbe0316-a3c0-4324-2ff9-bb28bb79edb7.png "Screen Shot 2017-07-26 at 11.45.38.png")

![Screen Shot 2017-07-26 at 11.46.49.png](https://qiita-image-store.s3.amazonaws.com/0/109241/3a02d85f-4b4d-d412-5db2-191aa62a09bf.png "Screen Shot 2017-07-26 at 11.46.49.png")

「今いるブランチがリモートにある片割より後ろにあるからrejectされたよ。pushする前にpullとかしてリモートの変更を統合しちゃって」的なヒントが。

```
git fetch --all
```

でトラッキングブランチを更新して、

```
git show-branch */dev3
```

で差分をみてみる。

![Screen Shot 2017-07-26 at 11.52.37.png](https://qiita-image-store.s3.amazonaws.com/0/109241/05c0adb9-99ad-37c1-608d-4b0660f64a1d.png "Screen Shot 2017-07-26 at 11.52.37.png")

（左：ローカル、右：リモート）
↑下から二個目のところが足りてない。
つまり「ローカルブランチにリモートブランチの変更内容が一部取り込まれてない」のが原因。
というわけでpullする。

```
git pull shono dev3
```

これで

![Screen Shot 2017-07-26 at 11.55.03.png](https://qiita-image-store.s3.amazonaws.com/0/109241/12d8d845-178e-fa21-bc31-0fb433a36741.png "Screen Shot 2017-07-26 at 11.55.03.png")

こんな感じで揃うので、pushできるようになる。
ちなみに今回の足りてなかったところは `dev3` からPRなげたときに、 `compare` を `base` に合わせてupdateした分でした。
フォームにダミーデータをいっぺんに入れる（Vue.js）


Vue.jsでフォームがいっぱいある画面を作った時。
「ダミーデータをいちいち手入力するのめんどくさい」ので、いっぺんに入れれる `debug()` を作った。

# `debug()` をつくる

methodsに。

![Screen Shot 2017-07-26 at 11.27.12.png](https://qiita-image-store.s3.amazonaws.com/0/109241/20e4ca51-60bc-8155-61bf-26421afae7ab.png "Screen Shot 2017-07-26 at 11.27.12.png")

#実行

GoogleのVue.js拡張機能を使う。

まずは対象のカスタムタグを選択

![Screen Shot 2017-07-26 at 11.28.45.png](https://qiita-image-store.s3.amazonaws.com/0/109241/bae790cf-38f0-01c4-3e56-df4fa2ea8ad0.png "Screen Shot 2017-07-26 at 11.28.45.png")

consoleから `$vm0.debug()` で実行。
これでフォームにデータが入る。

![Screen Shot 2017-07-26 at 11.30.22.png](https://qiita-image-store.s3.amazonaws.com/0/109241/af0e940c-24e9-9441-f98a-34747e1817d1.png "Screen Shot 2017-07-26 at 11.30.22.png")

ちなみに `$vm0.data` とかとすればデータもアクセスできる。

![Screen Shot 2017-07-26 at 11.31.05.png](https://qiita-image-store.s3.amazonaws.com/0/109241/4ebb95d6-ac1a-2c6c-c881-9f22522fd609.png "Screen Shot 2017-07-26 at 11.31.05.png")
PicassoでリダイレクトされたURLの画像を表示する

Picassoを使っていて、リクエストしたURLがリダイレクトされた場合に画像が表示されなかったのでその対応について記載します。

## 修正前のコード

```
val picasso = Picasso.with(context)
picasso.load(url).into(imageView)
```

## 修正後のコード

```
val downloader = OkHttp3Downloader(context) 
val picasso = Picasso.Builder(context).downloader(downloader).build()
picasso.load(url).into(imageView)
```

## 解説

* `OkHttp3Downloader`を使って解決できました。
* `OkHttp3Downloader`のコンストラクタに`context`を渡すと内部で、`OkHttpClient`が作成されます。
* `OkHttpClient`には`followRedirects`プロパティと`followSslRedirects`プロパティがあり、両方共デフォルトで`true`が設定されていました。

## 参考にしたページ

* [https://github.com/square/picasso/issues/463](https://github.com/square/picasso/issues/463)
* [https://stackoverflow.com/questions/29952860/get-redirected-url-from-picasso](https://stackoverflow.com/questions/29952860/get-redirected-url-from-picasso)
さくらのVPS　サーバーネーム登録～静的サイト公開までのメモ

## さくらの会員メニューに行って、サーバーネーム新規登録

ドメインはすでにとってある前提。
さくらにサーバーOSインストールとか、してある前提。

1- さくらの会員メニューに行って、サーバーネーム新規登録する  
`[さくらの会員サイトトップディレクトリ]/menu/domain/`
でドメイン一覧ページにアクセスできるので、そのページのドメインメニューから「ネームサーバ新規登録」へ移動する。

で、ネームサーバ新規登録ページの下の方に、サーバーネーム新規登録のフォームがあるので、ここに先に取得したドメインをいれて送信する。

自分は今回サブドメインのページを作りたかったので、
aaa.hoge.com　のように入力した。

「ゾーン追加を行いました」とでたら、ドメインリストに追加完了。ゾーン編集のため、ドメインメニューへ移動する。

2- リストのaaa.hoge.com欄の「ゾーン編集」ボタンを押して編集する。


3- 「さくらインターネットのネームサーバに設定する (簡単設定)」に、サーバーのIPアドレスを入力して、送信する。
（自分は詳しくないので、一番簡単そうなものでやります。）

※サーバーのIPアドレスは、サーバーを管理している別の管理画面に載っているのでコピーしてくる。

4- 次はドメインを取得したところでDNSレコード設定
ドメイン取得したところ（お名前.comとか）で設定する。（サーバーのIPアドレスと紐づけ。）

これで、ドメイン登録終了。

---

ドメイン登録できたので、ここからはさくらサーバーでの設定に移る。
すでにngnixいれていて、sshログインできる前提。

## さくらのVPS　静的サイトのためのディレクトリ作る

下記ディレクトリを作る
/var/www/XXXX/
/var/www/XXXX/public

※権限ないって言われるので、rootユーザーで作るようにする。
`su root`コマンドで、さくらのサーバー管理画面で設定したパスワード入れてrootユーザーになる。

ディレクトリ作るコマンド
`mkdir /var/www/XXXX`

ディレクトリがrootに属しているので、いつも使うユーザー所有にする
（これやったほうがよいのかよくわかってないけれども。）
`chown user:group /var/www/XXXX/ -R`
※user と　group には自分のユーザー名とグループ名を入れる
-Rオプションでディレクトリ以下全部権限変える

あと、rootディレクトリ（/var/www/XXXX/）のパーミッションを755に変更（ファイルあげるときにエラーになったので）
コマンドメモとるの忘れたので参考ページのみメモ
http://qiita.com/takeshi81/items/48ea62eae2fc7f1cb2f0

変更できたか確認は`ls -la /var/www/`でする。

## ngnixのコンフファイルなど変更
※ドメインとファイルディレクトリを紐づけることをする。

ngnixのコンフファイル変更
`cd /etc/nginx/conf.d/`
既存のものがあればコピーしてからの編集が楽
`cp BBB.conf XXXX.conf`
`vim XXXX.conf`

最低限アクセスできるように下記を記述。

```
server {
    listen 80;
    server_name XXXX.com;

    access_log /var/log/nginx/XXXX_access.log;
    error_log /var/log/nginx/XXXX_error.log;

    index index.html index.htm;

    location / {
        root /var/www/XXXX/public;
    }
    location ~ /\. { deny all; }
}
```

nginx再起動
ストップ`sudo nginx -s stop`
起動`sudo nginx`

Nginx起動確認
`/etc/init.d/nginx status`


下記などを参考にシンプルにやりました。
http://blog.hotolab.net/entry/nginx_simple

---
## ファイルをアップする

### さくらのVPSにgit push でデプロイ 
参考：http://vdeep.net/git-push-deploy

ここからはたぶん通常ユーザーで作業したほうがいい（ファイル作成したらroot権限になるから・・）

さくらにsshログインして、
1. 上でつくったディレクトリ/var/www/XXXX/publicで`git init` する

2. /var/www/XXXX下にベアリポジトリを作成する。/var/www/XXXXでコマンド叩く。
`git clone --bare --shared /var/www/XXXX/public XXXX.git`

ここまででのディレクトリ構成は下記の通り

```
/var/www/XXXX
 - public/
 　-　.git 
 - XXXX.git

```

4. XXXX.git/hooks下にpost-receiveファイルを作成する  
`cd XXXX.git/hooks`
`vi post-receive`

下記を記述(パスは合わせる)

```
#!/bin/bash

cd /var/www/XXXX/public
git --git-dir=.git pull /var/www/XXXX/XXXX.git master
```

ファイルの権限を変えておく
`chmod +x post-receive`

--- 
ここからさくらでなく、ローカルで作業

5. ローカルのgitリポジトリにremote登録,push  
※xsrvは自分で決めた文字列。ssh接続の内容を簡略化して書けるように.ssh/configファイルにまとめている。（参考：http://vdeep.net/git-push-deploy）  
※sakuraserver　部分は好きな文字列にする  
`git remote add sakuraserver xsrv:/var/www/XXXX/XXXX.git`  
ファイルをadd、commitしてさくらにpushする。  
`git push sakuraserver master`

これでサーバーにファイルアップロードできた。
アップしたページを確認できた。
[Android] ImageView を継承して新しいクラスを作る

# あらまし

`ImageView` にアニメーションで点滅（blink）するメソッドをつけたくなった。
点滅するための実装はなるべく利用者に出さず、ただ`.blink()`だけ呼び出すだけで点滅させたい。

そこで、`ImageView`を継承した新しいクラスを実装して、新しいメソッドを追加する。

# 実装

```java:BlinkableImageView.java
package com.hoge_company.fooapp.widget;

import android.content.Context;
import android.support.v7.widget.AppCompatImageView;
import android.util.AttributeSet;


class BlinkableImageView extends AppCompatImageView {
    public BlinkableImageView(Context context) {
        super(context);
        initialize();
    }

    public BlinkableImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initialize();
    }

    public BlinkableImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initialize();
    }

    protected void initialize() {
      // なにか準備があるならここで
    }

    public void blink(int durationMillis) {
      // 点滅させるための実装
      // getContext() でContextを取得可能
    }
}
```

コンストラクタを3つ、`public`でオーバーライドする。
筆者は`public`を失念して結構な時間を消費してしまった。

点滅させるための実装は本題から外れるのでここには書かない。

こんな感じでxmlには書ける。属性は適当だ。

```xml:activity_main.xml
<com.hoge_company.fooapp.widget.BlinkableImageView
            android:id="@+id/foo_image"
            android:visibility="invisible"
            android:scaleType="fitCenter"
            android:adjustViewBounds="false"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true" />
```

# 参考

* http://qiita.com/muran001/items/047b0e5ba9e10f4846ae
* http://gamecat0.blog53.fc2.com/blog-entry-272.html
* http://y-anz-m.blogspot.jp/2014/03/androidimageview.html

コンストラクタをすべてオーバーライドしないケースも見受けられるが、
将来に渡って大丈夫かどうか不安なので、すべてオーバーライドすることにした。
[Swift] パーセントエンコードを自作関数でやる必要は無かった


ちょっとHTTP GET/POSTしたい時にパラメータ類をパーセントエンコードする必要があり、以下のようなコードでエンコードしていましたが

```swift:
/// パーセントエンコードを行う
func percentEncode(_ str: String) -> String {
    var characterSet = CharacterSet.alphanumerics
    characterSet.insert(charactersIn: "-._~")
    return str.addingPercentEncoding(withAllowedCharacters: characterSet)!
}

let url = "http://hoge.jp/test_api?en=\(percentEncode("english"))&jp=\(percentEncode("日本語"))&other=\(percentEncode("&=+"))"

print(url) // http://hoge.jp/test_api?en=english&jp=%E6%97%A5%E6%9C%AC%E8%AA%9E&other=%26%3D%2B
```
（せめてURL構築関数を作るべきというツッコミは横に置いておきます）

そもそもその手の機能がiOS8で用意されているようなので、今後はこちらを積極的に使っていこうと思います。
（`URLComponents`自体はiOS7から有りますが、`queryItems`プロパティなどはiOS8以上）

```swift:
var urlComponents = URLComponents(string: "http://hoge.jp/test_api")!
urlComponents.queryItems = [
    URLQueryItem(name: "en", value: "english"),
    URLQueryItem(name: "jp", value: "日本語"),
    URLQueryItem(name: "other", value: "&=+"),
]

print(urlComponents.url ?? "") // http://hoge.jp/test_api?en=english&jp=%E6%97%A5%E6%9C%AC%E8%AA%9E&other=%26%3D+
```

POSTのBODYにはこっちを使うと便利そうです。

```swift:
print(urlComponents.percentEncodedQuery ?? "") // en=english&jp=%E6%97%A5%E6%9C%AC%E8%AA%9E&other=%26%3D+
```

`URLComponents`自体は過去にqiitaでも何度か紹介されていましたが、すっかり見落としていました。

## おまけ

URLComponentsを使ったURL構築関数も作ってみました。

```swift:
func buildUrl(base: String, namedValues: [(name: String, value: String)]) -> URL? {
    guard var urlComponents = URLComponents(string: base) else { return nil }
    urlComponents.queryItems = namedValues.map { URLQueryItem(name: $0.name, value: $0.value) }
    return urlComponents.url
}

print(buildUrl(base: "http://hoge.jp/test_api", namedValues: [("en", "english"), ("jp", "日本語"), ("other", "&=+")]))
```
Nginx で ssl_protocols や ssl_ciphers を省略するとどうなるのか？

# はじめに

僕は Nginx を使用した Web アプリケーションで SSL/TLS を使用する場合は、設定ファイルで `ssl_protocols` を `ssl_ciphers` を明記しなくてはならないと思い込んでいました。そのため、いつも [Mozilla SSL Configuration Generator](https://mozilla.github.io/server-side-tls/ssl-config-generator/) からディレクティブをコピペしていました。しかし、これらのディレクティブを省略しても [Qualys SSL LABS SSL Server Test](https://www.ssllabs.com/ssltest/) で高スコアを出せることが分かりました。では省略した場合にはプロトコルや暗号スイートの指定はどうなるのか、調べてみました。

# 省略した場合の挙動

公式ドキュメント [Nginx » Configuring HTTPS servers](http://nginx.org/en/docs/http/configuring_https_servers.html) の冒頭に答えはありました。

> The directives ssl_protocols and ssl_ciphers can be used to limit connections to include only the strong versions and ciphers of SSL/TLS. By default nginx uses "ssl_protocols TLSv1 TLSv1.1 TLSv1.2" and "ssl_ciphers HIGH:!aNULL:!MD5", so configuring them explicitly is generally not needed. Note that default values of these directives were changed several times.

以下は拙訳です。

> ssl_protocols ディレクティブと ssl_ciphers ディレクティブの用途は、SSL/TLS のプロトコルと暗号スイートのうち強度の高いもののみを許可することで、接続を制限することです。デフォルト値はそれぞれ ssl_protocols TLSv1 TLSv1.1 TLSv1.2 と ssl_ciphers HIGH:!aNULL:!MD5 です。これらのディレクティブを明示的に指定する必要は基本的にありません。なお、これらのデフォルト値はこれまで何度か更新されています。

つまり `ssl_protocols` や `ssl_ciphers` を指定せずとも、十分に安全性の高い設定となるようです。

# ssl_ciphers ディレクティブのデフォルト値の意味

ちなみに `ssl_ciphers HIGH:!aNULL:!MD5` はどういう意味なのでしょうか。これは [OpenSSLWiki » Manual:Ciphers(1)](https://wiki.openssl.org/index.php/Manual%3aCiphers%281%29) に答えがありました。

| cipher string | 意味 |
| --- | --- | --- |
| HIGH | 強度の高い暗号スイートを使用する。具体的には鍵長が 128 bit 以上のもの。
| !aNULL | 認証のない暗号スイート (ADH や AECDH を用いるもの) を **使用しない**。中間者攻撃の脆弱性があるため。 |
| !MD5 | MD5 を用いる暗号スイートを **使用しない**。[SLOTH 攻撃](http://jvndb.jvn.jp/ja/contents/2015/JVNDB-2015-006780.html) の脆弱性が存在するため。 |

# 結論

* SSL Server Test のスコアや分析結果に問題なければ、`ssl_protocols` や `ssl_ciphers` を明示的に指定する必要は特にない。
  * ただし、これらのディレクティブのデフォルト値、あるいは実際にサーバ側で選択される暗号スイートは Nginx や OpenSSL のバージョンに依存するはずなので注意。
Ruby AWS SDK v2でendpoint指定の仕方

ローカルにプロキシを立ててAWS SDKの通信を見るとき、HTTPSで暗号化されていると見えないのでHTTPのエンドポイントを指定したい。

こんな感じ。

```rb
require "aws-sdk"

options = {region: "ap-northeast-1", endpoint: "http://s3-ap-northeast-1.amazonaws.com"}
bucket = Aws::S3::Resource.new(options).bucket("バケット名")

# アップロード
bucket.object("moge3/sample.txt").upload_file("sample.txt")
```

`Resource.new`は`Client.new`と同じオプションを受けつける。

http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Client.html
SmartGit > ファイル削除 > Move To Trash | Delete 

```txt:動作環境
Windows 7 Pro (32bit)
SmartGit Version 17.0.4 #10132
```

リポジトリに含めていないファイルを削除するとき、以下の選択肢がある。

- Move To Trash
- Delete

参考: http://www.syntevo.com/doc/display/SU/Delete+Physically

Move to Trashを選択するとゴミ箱に移動する (システムにゴミ箱がある場合)。
Deleteを選択するとゴミ箱を経由せずに削除される。WindowsにてShiftを押しながら削除するのと同等になる。
-Blenderで剛体シミュレーションをするときの手順と注意点-僕なりの解釈メモ

こちらの記事が剛体シミュレーションで秀逸でしたので、
最新バージョンのblender（2.78）で記したいと思います。

http://qcganime.web.fc2.com/BLENDER/RigidBody09.html

予めブラバラにしておいた剛体に剛体をぶつけてバラバラに分散させるよくある
シミュレーションです。
なれればとても簡単にできます。

成果物。
https://www.youtube.com/watch?v=UHaRBeRVYus

<b>難点</b>

・グープル化のものを非表示したり表示したりする点ですかね。
これをマスターしないとトゥーン絵（freestyle）にした際にバラバラにした部分まで描写されるので不自然です。

簡単な手順
１、ぶつける剛体を選択して、
物理演算で
剛体の設定
バッシブ
アニメをチェック。


![スクリーンショット-2017-07-26-08.35.jpg](https://qiita-image-store.s3.amazonaws.com/0/193429/d01e2330-9e8e-40ed-0b8c-22262c164c86.jpeg)

２、ぶつけられる剛体は
下記のとおり。
剛体力学を設定することによって、
ぶつけられるまで動かなくなります。
![名称未設定-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/193429/180b60bb-eafc-9b94-4f99-d9c90b83aa88.jpeg)

このままでアニメを再生すると勝手に演算をし始めますが、
それでは単純なので次にバラバラにしてみます。
![05.gif](https://qiita-image-store.s3.amazonaws.com/0/193429/2d0cd9a8-77cd-a7c4-e8f2-ad193730b21c.gif)

３、バラバラは、cell fractureをユーザー設定で有効にしてオブジェクトに適応してみます。
適応するとレイヤー２にバラバラになったものが複製されているかと思います。
バラバラぐあいですが、リアルな感じはノイズを弄ってやればより複雑な構造になるかと思います。
![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/193429/d19115a6-bf4f-bb03-adaa-7924389d735c.jpeg)

４、ここからややこしくなります。
ポイントですがまずバラバラになったオブジェクトのままだと面倒なので、ここで<b>グループ選択</b>をしてやります。
![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/193429/8535bc7c-e180-9182-5900-945e16b6aa6d.jpeg)
シフト+Ctrl+Gで予め既存に作っておいたグループに追加できます。
グールプ化されたオブジェクト等は緑色になっていますのでご確認を。
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/193429/1d4228b9-16a1-ada8-90e1-cf6e4ebc4493.jpeg)

５、先ほどの同様の物理演算を適応しますが、
このままだと一つしか適応されませんので、
アクティブをコピーというボタンを押しましょう。
そうしましたら選択した物理演算が同じ選択してる全部に適応されます。
![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/193429/20123fab-b4c2-825b-dc09-42230b8ce1d5.jpeg)

先ほどの適応しましたグループの選択はshift+Gで適応できます。
レイヤー１とレイヤー２を同時表示した結果がこれです。
![06.gif](https://qiita-image-store.s3.amazonaws.com/0/193429/88cbbb53-2f09-ed9e-a9d6-405d96885475.gif)

ここで思いつくことが、
球体がぶつかる寸前まではバラバラにした立体を隠して（非表示）しておいて、ぶつかった瞬間に既存の立体と入れ替えすれば、アニメ調の編集をしてもバラバラな部分がバレなく済む。という事が考えられるかと思います。
せれを順を追って説明致します。

６、
ここで「ミソ」なのが先ほど説明しましたグループ選択とエンプティオブジェクト（レイヤー１に設定）を利用した複製機能です。
非表示設定はグループには直接適応できないので、エンプティの複製機能の出現で非表示をやってしまおうという仕組みです。
下記の通りに設定すると、レイヤー２にあったバラバラのオブジェクトがレイヤー１に出現（複製）します。

複製位置はエンプティに依存しますので、エンプティ位置を調整しましょう。
![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/193429/0e8b8854-d339-9983-b212-ea1b131cb4b3.jpeg)
![07.gif](https://qiita-image-store.s3.amazonaws.com/0/193429/3cf650a0-b83f-f85d-6e77-1094ba204a02.gif)
今度はレイヤー１のみの表示ですがエンプティのおかげでレイヤー２にあったバラバラの立体が再現されています。

７、仕上げです。エンプティと既存にある立体の表示を切り替えてみましょう。バトンタッチみたいなんですね感じですかね。

このエリアのエディタタイプ画面で、
目玉マークとカメラマークがあるかと思います。
これを同時に非表示してやりたいと思います。
カメラマークの上で右クリックを押すとキーフレームが挿入できますので、
非表示にしたら上書きしてやりましょう。
このアニメの場合はフレーム４のタイミングでした。

![08.gif](https://qiita-image-store.s3.amazonaws.com/0/193429/c0e59d02-3318-9e80-e267-7df963986965.gif)


以上です。
最後まで読んでいただけた方はありがとうございます。お疲れ様でした。
RadioButtonの追加と初期チェックをコードで同時に行ったときに気付いた挙動

## RadioGroupとRadioButtonでハマった

初投稿です。  

Kotlinで仕事中に気づいたから適当にアウトプット。

### 前提
* RadioGroupはXMLで定義済み
* そこにコード側でRadioButtonをaddViewしていく
* けっこうよく使う形

### 欲しい挙動
「*追加されていくRadioButtonの初期値を付けたい*」  

ありがち。  

### コード
```Kotlin
list = listOf(1, 2, 3)// 意味のある情報
radioGroup = findById(R.id.radio_group) as RadioGroup
for (data in list){
    val radioButton = RadioButton(this)
    if (data == 1){
        // 初期値として使いたい！
        radioButton.isChecked = true
    }
    radioGroup.addView(radioButton)
}
```

### 見た目はいい
見た目的にはチェックがついててとても良い  

### checkedRadioButtonIdが正しく取れない  
* ここハマリポイント
* checkedRadioButtonIdが使いたいのにそれが上手く行かない
* もしかしてaddSubViewが後だとチェックされてるかどうかが見えない…？

### リファクト
```Kotlin
list = listOf(1, 2, 3)// 意味のある情報
radioGroup = findById(R.id.radio_group) as RadioGroup
for (data in list){
    val radioButton = RadioButton(this)
    // 宣言直後にRadioButtonをSubViewとして登録
    radioGroup.addView(radioButton)
    if (data == 1){
        // 初期値として使いたい！
        radioButton.isChecked = true
    }
}
```

### 動いた
やったぜ。  

### 所感
* 確定というわけではないが、addSubViewしたときには中のパラメータは見ていない？
* 複数追加された時全部にcheckを付けておけば、全部チェックされたものも作れるのかな？
    * 実用性は無い、どれもチェックされてないし
* addSubViewは単なるコピー配置ではなく、参照配置(？)なんだなぁと実感
* これならaddSubViewを先にしておいてViewをいじくり回したほうが安全っぽい…ぽくない？
* Kotlinで説明してるけど、多分Android Javaでも同じような挙動をしそう
備忘録：「オブジェクト指向でなぜつくるのか」 4章前半

おはようございます。
今回は４章をまとめます。
４章は内容がいっぱいありました…

#4章 OOPは無駄を省いて整理整頓するプログラミング技術

この章はオブジェクト指向プログラミング技術の諸々の仕組みを説明する章でした。
その仕組みを列挙すると、

- クラス
- ポリモーフィズム
- 継承

です。前半ではこれらをまとめます。
さらにjavaやC#などで登場した進んだ仕組みとして

- パッケージ
- 例外
- ガベージコレクション

の解説もなされていました。こちらは後半でまとめます。

##クラス
クラスの効能は３つで、

 1. サブルーチン、変数を「まとめる」
 2. クラスの内部だけで使うサブルーチン、変数を「隠す」
 3. １つのクラスからインスタンスを「たくさん作る」

とのことでした。
どれもオブジェクト指向を使ったことがある人にはおなじみの仕組みですね。

例えばゲームを作っている時に「一定のHPと攻撃力を持った敵」を作りたいとします。
そういうときはこのようにクラスを定義して

```cpp
public class enemy{
    public int hp;
    public int offence;
}
```
変数をまとめることができます（「まとめる」）
あとはコードの好きな部分で

```cpp
enemy1 = new enemy();
enemy2 = new enemy();
```
という風に書いてやれば何体でも敵を作れます。（「たくさん作る」）
また、攻撃を受けたときにHPを減らすときは

```cpp
enemy1.hp -= 10;
```
と言う風にかけばenemy1のHPだけ減らせますし、関係ないところで

```cpp
hp -= 10;
```

とやっちゃってまちがって敵の体力を減らしてしまうというバグも防げます。（「隠す」）
（ていうか２番目は`hp`というグローバル変数がない限りエラーになります。逆に言えば、`hp`をグローバル
変数にしていた場合はこのコードで減らせてしまうので、バグの原因になります。）
よって敵の体力がおかしいとなったときはenemyを作っているところだけ調べればいいわけです。
以上、クラスの効能です。

##ポリモーフィズム、継承
本書の言葉を借りればポリモーフィズムは
「サブルーチンを**呼び出す側**のロジックを一本化し、『共通メインルーチン』を作る仕組み」
で、継承は
「似たクラスの共通点と相違点を整理する仕組み」
です。
こちらもコードを使って説明します。
例えば、テキストファイルの中身を読むクラスがあるとします。
※メソッドの中身の処理は全て省略します。

```
public class TextFileReader{
    public void open(String filePath){}
    public void close(){}
    public void read(){}
}
```

これに加えてネットワーク経由で送信された文字列を読み込みたいとします。
仕組みはほとんど同じですがロジックは微妙に変わりますよね。

```
public class NetWorkReader{
    public void open(){}
    public void close(){}
    public void read(){}
}
```

ファイルを読むわけではないため、`open()`メソッドの引数がファイルパスでは不自然です。
ポリモーフィズムを使う時はこういった**呼び出される側のメソッド**の引数、戻り値を統一する必要があります。
そこで`open()`メソッドではなくコンストラクタにファイルパスを指定します。

```
public class TextFileReader{
　　　　　　　　public TextFileReader(String filePath){}
    public void open(){}
    public void close(){}
    public void read(){}
}
```

ついでにテキストとネットワークの違いを意識させないためにもう一つクラスを作り、先の二つのクラスに継承させます。

```
public class TextReader{
    public void open(){}
    public void close(){}
    public void read(){}
}
```

```
public class TextFileReader extends TextReader{
    //中身は上述のものと同じ
}
```

```
public class NetWorkReader extends TextReader{
    //中身は上述のものと同じ
}
```

これにより、一本化している`TextReader`クラスと他の二つのクラスの共通点と相違点をまとめ、また共通している操作においてはその違いを意識せずに使用できます。

以上が二つの要素のまとめです。

##まとめ
オブジェクト指向で登場した仕組みは全て「プログラマが楽をするための仕組み」です。
そのために制約を増やしているので覚えることは多くなりますが、覚えてしまえば楽できるようにできています。
デバッグのとき調べる場所が少なくなるのは非常に楽ですよね。

残りの

- パッケージ
- 例外
- ガベージコレクション

については後半で説明します。
Bluemix の Cloudant から、python3 で画像ファイルをダウンロード

Cloudant にアップロードしたファイルを、requests を使ってダウンロードする方法です。
データは、jpg というデータベース以下に保存されているとします。
url は、アカウントに合わせて変更して下さい。

```py3:from_cloudant.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	from_cloudant.py
#
#						Jul/26/2016
#
import sys
import json
import requests
# --------------------------------------------------------------------
# [6]:
def download_jpg_proc(url,key):
	file_jpg= key + ".jpg"
	url_jpg = url + "/jpg/" + key + "/" + file_jpg
	rr=requests.get(url_jpg)
#
	outfile = open(file_jpg,'wb')
	outfile.write(rr.content)
	outfile.close()
# --------------------------------------------------------------------
# [2]:
def list_keys_proc(url):
	url_all_docs = url + "/jpg/_all_docs"
	rr=requests.get(url_all_docs)
	print(rr.content)
	print()
	json_str=rr.content.decode('utf-8')
	print(json_str)
	dict_aa = json.loads(json_str)
	nnx = dict_aa['total_rows']
	print ("total_rows = %d" % nnx)
	keys = []
	for it in range(nnx):
		key = dict_aa['rows'][it]['key']
		keys.append(key)
#
	return keys
# --------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
url="https://44b508dd-f332-4f91-81f2-78369c7d29d9-bluemix:9dacdfdee666c2a5c16596fc371012e08a61e7132d3b21ecaaf1f63a835f3356@efc189dc-f332-4f91-81f2-78369c7d29d9-bluemix.cloudant.com"
#
keys = list_keys_proc(url)
#
for key in keys:
	print(key)
	download_jpg_proc(url,key)
#
sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------
```
ruby on rails のインストール

#Ruby On Rails 簡易インストールガイド
ruby, gitのインストールは完了していることを前提に進めます。
[CentOSへのrubyのインストール方法はこちら](http://qiita.com/inoue9951/items/a58b3fe8b123e4962fc6)

##Ruby On Railsのインストール
ruby on railsはrubyのgemとして提供されています。
gemとはrubyでライブラリを使用する際のパッケージシステムであるRubyGemsで扱われるライブラリのことです。
railsもgemパッケージとして提供されているので次のコマンドでインストール可能です。

```
gem install rails  #railsのインストール
rails -v           #railsのバージョンを確認
```

バージョンが正しく表示されればインストール完了です。
WordPressのソースコード読んでたら、SSLかどうかを判定する関数にぶつかった

WordPressのソースコードを読んでたら、SSLかどうかを判定する関数にぶつかりました
抜粋したソースコードは以下の通り

```
function is_ssl() {
	if ( isset( $_SERVER['HTTPS'] ) ) {
		if ( 'on' == strtolower( $_SERVER['HTTPS'] ) ) {
			return true;
		}

		if ( '1' == $_SERVER['HTTPS'] ) {
			return true;
		}
	} elseif ( isset($_SERVER['SERVER_PORT'] ) && ( '443' == $_SERVER['SERVER_PORT'] ) ) {
		return true;
	}
	return false;
}
```
\$\_SERVERは、サーバー情報を保存しています。　isset( \$\_SERVER['HTTPS'] )によって、サーバー情報の、HTTPSのインデックスの項目が保存されているかどうかを判定する。
設定されていたら、"on"かどうかを判定して、"on"であったならば、trueを返す。つまり、SSLであると返すわけですね。
"1"の場合もtrueを返すようです。
"on"か"1"の数値の可能性があって、それ以外の、例えば、"true"とか、"Yes"とかじゃないところが面白いですね。

```
elseif ( isset($_SERVER['SERVER_PORT'] ) && ( '443' == $_SERVER['SERVER_PORT'] ) ) 
```
この行では、サーバーのポートがセットされているかどうかをチェックして、サーバーのポートが"443"であった場合に、trueを返しています。
ここで注目するべきは、サーバのポートが443であるか、サーバの設定が"HTTPS"か、どちらかであればSSL通信が成り立つということです。
"HTTPS"ではなく、SSLであることが存在するのかなとか、ポートが、"443"でない場合に、SSLであることが存在するのかなとか考えたりしますが、おそらくですが、どちらかが明確に設定されていないことがあるんだと思います。
では、このis_ssl()が、どこで呼び出されているかを調査します。

```
if ( ! ( isset( $_REQUEST['action'] ) && 'upload-attachment' == $_REQUEST['action'] ) ) {
	// Flash often fails to send cookies with the POST or upload, so we need to pass it in GET or POST instead
	if ( is_ssl() && empty($_COOKIE[SECURE_AUTH_COOKIE]) && !empty($_REQUEST['auth_cookie']) )
		$_COOKIE[SECURE_AUTH_COOKIE] = $_REQUEST['auth_cookie'];
	elseif ( empty($_COOKIE[AUTH_COOKIE]) && !empty($_REQUEST['auth_cookie']) )
		$_COOKIE[AUTH_COOKIE] = $_REQUEST['auth_cookie'];
	if ( empty($_COOKIE[LOGGED_IN_COOKIE]) && !empty($_REQUEST['logged_in_cookie']) )
		$_COOKIE[LOGGED_IN_COOKIE] = $_REQUEST['logged_in_cookie'];
	unset($current_user);
}
````
これは、async_upload.phpの一部です。\$\_REQUESTは、HTTPリクエストの変数です。'action'インデックスにおいて、アップロードが付加されているかどうかを'upload-attachment' == \$\_REQUEST['action']を使って、判定しています。
このコードからわかるように、is_ssl()が有効であり、 empty(\$\_COOKIE[SECURE_AUTH_COOKIE])が、trueである、つまり、セキュアな認証クッキーが空であり、\$\_REQUEST['auth_cookie']が空であるならば、

```
$_COOKIE[SECURE_AUTH_COOKIE] = $_REQUEST['auth_cookie'];
```
この文によって、認証クッキーをCOOKIEに設定する。
そうでないなら、別のルーチンが走って、セキュアな認証クッキーには設定されません。

では、別の呼び出されているルーチンを調査してみましょう。次は、ajax_action.phpです。
一部抜粋

```
	if ( is_ssl() && 0 === strpos( $url, 'http://' ) ) {
		// Admin is ssl and the user pasted non-ssl URL.
		// Check if the provider supports ssl embeds and use that for the preview.
		$ssl_shortcode = preg_replace( '%^(\\[embed[^\\]]*\\])http://%i', '$1https://', $shortcode );
		$parsed = $wp_embed->run_shortcode( $ssl_shortcode );

		if ( ! $parsed ) {
			$no_ssl_support = true;
		}
	}
```
これは、SSLでありながら、https://ではない、つまり、http://であった場合、httpをhttpsに置き換えます。preg_replaceは、正規表現を引数に取って、正規表現と一致した場合、httpsに置換します。

```
$parsed = $wp_embed->run_shortcode( $ssl_shortcode );
```
ここって何やってるのかなと思っちゃったりしますが、これはトレースしてみてもよくわからないです。おそらく、リダイレクトかパースに近いことでもやるのかなと思います。
run_shortcode関数が失敗したら、$parseにfalseが設定されて、SSLがサポートされていないことを記録するようです。
いやー、ソースコード読みは面白いですね。
［メモ］Windows7にvagrant 1.9.7 を入れても反応しなかった

# はじめに
Windows 7にvagrantをインストールしたところ、エラーもでず一切反応しない。まったくの無反応。

![000.jpg](https://qiita-image-store.s3.amazonaws.com/0/193778/e7cf76f6-da9c-f3a2-d492-811126522fa8.jpeg)

ずーーーーーーーーーーとこの状態から変化しない。

インストール
VirtualBOX 5.1.24
vagrant 1.9.7

##症状
vagrant -v　⇒問題ない
vagrant plugin　⇒問題ない
vagrant init　⇒問題ない
vagrant up　⇒動かなくなる

##バージョン1.9.7の不具合らしい

ということで、vagrantの旧バージョン1.9.6を入れ直すと無事起動
Activityのスタックをすべて消すIntentを作成する

## 実行環境

* サポートライブラリ v25

## 解説

よく見つかるサンプルがこちらです。コードはKotlinです。

```kotlin
val intent = LauncherActivity.createIntent(this)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
```
 
正しいのはこちらです。

```kotlin
val intent = LauncherActivity.createIntent(this)
intent.addFlags(IntentCompat.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
```
 
`Intent.FLAG_ACTIVITY_CLEAR_TOP`の挙動が複雑なのですが、[こちら](http://blog.choilabo.com/20150216/505)に記載されている内容が正しそうです。

その後見つけたのが[こちら](https://stackoverflow.com/questions/18442328/how-to-finish-all-activities-except-the-first-activity/25159180#25159180)の回答。
 
回答では`IntentCompat.FLAG_ACTIVITY_CLEAR_TASK`と`Intent.FLAG_ACTIVITY_CLEAR_TOP`を設定していますが、
それぞれの仕様を読み`IntentCompat.FLAG_ACTIVITY_CLEAR_TASK`だけで十分だと判断しました。
また、呼び出し元の`finish()`も不要です。
 
`IntentCompat.FLAG_ACTIVITY_CLEAR_TASK`については解説記事が見つからなかったのでGoogle公式を貼っておきます。
https://developer.android.com/reference/android/support/v4/content/IntentCompat.html

## サポートライブラリv26以降について

サポートライブラリv26では`IntentCompat.FLAG_ACTIVITY_CLEAR_TASK`がDeprecatedになり、`Intent.FLAG_ACTIVITY_CLEAR_TASK`を使うようです。
HerokuでPhoenixアプリケーションを動かす

## buildpack

このbuildpackを追加することで、Herokuで動かせるようになります。

https://github.com/HashNuke/heroku-buildpack-elixir.git
https://github.com/gjaldon/heroku-buildpack-phoenix-static.git

## 設定を環境変数にする

config/prod.exs

```diff
diff --git a/config/prod.exs b/config/prod.exs
index e502547..2794277 100644
--- a/config/prod.exs
+++ b/config/prod.exs
@@ -12,9 +12,10 @@ use Mix.Config
 # manifest is generated by the mix phoenix.digest task
 # which you typically run after static files are built.
 config :app, App.Endpoint,
-  http: [port: {:system, "PORT"}],
-  url: [host: "example.com", port: 80],
-  cache_static_manifest: "priv/static/manifest.json"
+  http: [port: System.get_env("PORT")],
+  url: [host: System.get_env("HOST"), port: 80],
+  cache_static_manifest: "priv/static/manifest.json",
+  check_origin: [System.get_env("CHECK_ORIGIN")]

 # Do not print debug messages in production
 config :logger, level: :info
@@ -58,4 +59,7 @@ config :logger, level: :info

 # Finally import the config/prod.secret.exs
 # which should be versioned separately.
-import_config "prod.secret.exs"
+# import_config "prod.secret.exs"
+
+config :app, App.Endpoint,
+  secret_key_base: System.get_env("SECRET_KEY_BASE")
```

Herokuの場合、設定関係は環境変数で設定するので修正します。

## Procfile

PhoenixアプリケーションのルートにProcfileを設置します。

```
web: mix phoenix.server
```

## webpackを使う場合

フロントエンド周りのビルドがツールが標準だとbrunchになってるので、webpackを使う場合はbuildpackの設定を上書きする必要がありました。
brunchを使う場合はこの設定は必要ありません。

heroku-buildpack-phoenix-staticのphoenix_static_buildpack.configとcompileをPhoenixアプリケーションのルートに設置して

compileを修正します。

```diff
diff --git a/compile b/compile
index 61a99e5..2954c16 100644
--- a/compile
+++ b/compile
@@ -1,4 +1,4 @@
-brunch build --production
+webpack

 cd $phoenix_dir
```
GitHub > ページのタブサイズを変更する > 閲覧者:URLに?ts=4などをつける | 作成者:.editorconfigを作る

GitHubのコードに関して、関数の引数がずっと右側に表示される症状が見られた。

作者に連絡をしたところ、「コードを整形したがGitHubのタブが大きいために読みやすい整形にはまだなっていない」との連絡を受けた。

GitHubのタブについて以下を見つけた。
https://stackoverflow.com/questions/8833953/how-to-change-tab-size-on-github

## 閲覧者の対応

閲覧者としてはページのURLの最後に`?ts=4`などをつけるとタブのサイズを変更できるようだ。

### 設定なし
(**追記 2017/07/26
.editorconfigが追加されたことにより、`?ts=4`追加と同じになりました**）

https://github.com/disordered-photonics/celes/blob/status_monitor/sources/scattering/coupling_matrix_multiply_CUDA.cu

### タブサイズ4設定
https://github.com/disordered-photonics/celes/blob/status_monitor/sources/scattering/coupling_matrix_multiply_CUDA.cu?ts=4


## 作成者の対応

上記リンクにリポジトリのタブ設定ができる方法が記載されている。

実動作は未確認であるが、.editorconfigを作るのだろう。
railsにおいてのparamsとは

# paramsとは

railsでURLやリクエスト情報を受取るメソッド。params[パラメータ名:]で受け取れる。例えばURLのidを下記で受け取れる。

```ruby:test
get "post/:id" => "post#show"
def show
  @id = params[:id]
end
```
cakephp3でjson(p)出力


やっと重い腰をあげて2から3に移行する決意を固めました。そろそろ頃合いであろうと。
2を手足のように使って死ぬほど駄ウェブサービスを作っていた身としては、3でも変わらず駄ウェブサービスを世に送り続けたて煙たがられたいと思っておる次第であります（敬礼＆失神）。

## RequestHandlerComponentでリクエストを判別してデータビューを出力する方法

```
// src/WorksController.php

class WorksController extends AppController
{

    public function initialize()
    {
        parent::initialize();
        $this->loadComponent('RequestHandler');
    }


    public function o()
    {

    	$data = ['kikuko' => ['age' => 17]];
        $this->set([
            'data' => $data,
            '_serialize' => ['data'],
            '_jsonp' => TRUE // json出力の場合はいらないです
        ]);

    }

}
```

### jsonの場合
すいません、jQuery使わせてください。

```
$.ajax('/works/o',
      {
        type: 'get',
        dataType: 'json'
      }
    )
    .done(function(data) {
      console.log(data.data.kikuko);
    })
    .fail(function() {
      console.log('error');
    });
```

dataTypeに'json'を指定すると、リクエストヘッダのAcceptが

`Accept: application/json`

になり、こいつをRequestHandlerComponentが認識してjsonでビューを出力してくれます。
なので、ただ http://localhost/works/o をたたいても Missing Template と言われてしまいます。

### jsonpの場合
dataTypeに'jsonp'を指定すると、リクエストヘッダのAcceptが

`Accept: text/javascript`

になってしまい、RequestHandlerComponentがjsonでビューを出力してくれなくなってしまいます。
この場合は、拡張子 .json をルーティング時に渡すことで、jsonでビューを出力してもらいます。

```
// config/route.php

Router::extensions(['json', 'xml']);
```

特定のパスにだけ適用することもできるみたいです。
https://book.cakephp.org/3.0/ja/development/routing.html#file-extensions

これで、

```
$.ajax('/works/o.json',
      {
        type: 'get',
        dataType: 'jsonp'
      }
    )
    .done(function(data) {
      console.log(data.data.kikuko);
    })
    .fail(function() {
      console.log('error');
    });
```

とすることで、jsonpを受け取ることができます。違いは、

リクエスト先を

`/works/o.json`

にしたことと、dataTypeを'jsonp'にしたことですね。


## リクエストを判別しないでjsonデータビューを出力する方法

もっと簡単にリクエストはどうあれ、jsonを出力できないんかという諸兄に。

```
// src/WorksController.php

class WorksController extends AppController
{

    public function o()
    {

    	$data = ['kikuko' => ['age' => 17]];

    	$this->viewBuilder()->className('Json');
        $this->set([
            'data' => $data,
            '_serialize' => ['data'],
            '_jsonp' => TRUE // json出力の場合はいらないです
        ]);

    }

}
```

viewBuilder に className('Json') を渡すことによって出力をjsonに限定できます。
これでどんなリクエストでも常にjsonで出力してくれます。
railsで可変のURLを設定する際に気をつけること

# 全体の流れ

ルーティング→コントローラ（アクション）→ビューの順で処理が行なわれる。

# 記述

```ruby:routes.rb
get "posts/:id" => "posts#show"
```

上記でposts以下にidが来た際に全てshowアクションを実行します。

# 注意点

何が来てもshowを返してしまうためposts/の処理でshowを返したくない場合、上に記述しないといけない。上から順に処理されて当てはまるとその処理を行う。

```ruby:routes.rb
get "posts/index" => "posts#index"
get "posts/:id" => "posts#show"
```
App Store and Ad Hocの登録手順

#はじめに
App Store Ad Hoc登録手順のメモです。

#CertificateSigningRequest.certSigningRequestの作成
###キーチェーンアクセス > 証明アシスタント > 証明局に証明書を要求...
<img width="573" alt="スクリーンショット 2017-07-26 6.49.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/7c27bdd1-5e6c-d39c-0925-458efe7fe6c0.png">
###ディスクに保存を選択して「続ける」を押下
<img width="616" alt="スクリーンショット 2017-07-26 6.50.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/ece3bf4d-c269-b147-d90c-66ffcc08a4cf.png">
※指定フォルダにCertificateSigningRequest.certSigningRequestができていることを確認してください。
#ios_distribution.cerの作成
###右上の「+」を押下
<img width="985" alt="スクリーンショット 2017-07-26 6.45.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/172f39a7-d8d2-f748-4019-970a3dcf5d6d.png">
###App Store and Ad Hocを選択して「Continue」を押下
<img width="735" alt="スクリーンショット 2017-07-26 7.40.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/986f47a2-ee75-bd40-dfae-34c267586115.png">
###「Continue」を押下
<img width="736" alt="スクリーンショット 2017-07-26 6.51.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/c59a76d0-9121-809c-fa9a-b9c2fe4cb59c.png">
###「Choose File...」を押下して「CertificateSigningRequest.certSigningRequest」を選択し「Continue」を押下
<img width="737" alt="スクリーンショット 2017-07-26 6.52.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/10fd958a-4331-b462-4402-61a86235fb1c.png">
###「Download」を押下
<img width="735" alt="スクリーンショット 2017-07-26 7.41.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/e34149a8-c60d-37b3-655b-72bf2a547755.png">

#証明書の追加
###ダウンロードした「ios_distribution.cer」をダブルクリックして下記メッセージを出し、「追加」を押下
<img width="534" alt="スクリーンショット 2017-07-26 7.42.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/b12e9c7b-e130-b007-958f-01427c027da3.png">

###キーチェーンにiPhone Distribution:xxxxxが追加できたら、App Store and Ad Hocの登録完了
<img width="1413" alt="スクリーンショット 2017-07-26 7.42.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/a9ddfeb3-4d21-779c-4a47-8fbd300af835.png">
iOS App Developmentの登録手順

#はじめに
iOS App Development登録手順のメモです。

#CertificateSigningRequest.certSigningRequestの作成
###キーチェーンアクセス > 証明アシスタント > 証明局に証明書を要求...
<img width="573" alt="スクリーンショット 2017-07-26 6.49.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/7c27bdd1-5e6c-d39c-0925-458efe7fe6c0.png">
###ディスクに保存を選択して「続ける」を押下
<img width="616" alt="スクリーンショット 2017-07-26 6.50.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/ece3bf4d-c269-b147-d90c-66ffcc08a4cf.png">
※指定フォルダにCertificateSigningRequest.certSigningRequestができていることを確認してください。
#ios_development.cerの作成
###右上の「+」を押下
<img width="985" alt="スクリーンショット 2017-07-26 6.45.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/172f39a7-d8d2-f748-4019-970a3dcf5d6d.png">
###iOS App Developmentを選択して「Continue」を押下
<img width="738" alt="スクリーンショット 2017-07-26 6.46.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/55249577-454d-7440-b195-89788a279fc4.png">
###「Continue」を押下
<img width="736" alt="スクリーンショット 2017-07-26 6.51.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/c59a76d0-9121-809c-fa9a-b9c2fe4cb59c.png">
###「Choose File...」を押下して「CertificateSigningRequest.certSigningRequest」を選択し「Continue」を押下
<img width="737" alt="スクリーンショット 2017-07-26 6.52.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/10fd958a-4331-b462-4402-61a86235fb1c.png">
###「Download」を押下
<img width="742" alt="スクリーンショット 2017-07-26 6.52.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/abcbb647-5303-5f4d-3169-5465489329a5.png">

#証明書の追加
###ダウンロードした「ios_development.cer」をダブルクリックして下記メッセージを出し、「追加」を押下
<img width="535" alt="スクリーンショット 2017-07-26 6.53.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/d57e471a-2399-7957-cd1e-22991ccf752d.png">

###キーチェーンにiPhone Developer:xxxxxが追加できたら、iOS App Developmentの登録完了
<img width="1498" alt="スクリーンショット 2017-07-26 7.21.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/89206/7ea2a107-d997-ad17-e4d2-d9b6c6f7fe28.png">