OmniAICreator/Qiita-1.07M huggingface dataset:
AndroidからMilkcocoaを使って見るメモ #mlkcca


最近Androidアプリを書いてみたりしてます。
とはいえかなり初心者です。

Javaわかってないけどとりあえずつなげられました。
ほんとはXamarinでやってみたかったけどNuGetでMilkcocoaインストールができなかったので[テラテイルで質問なげてみました](https://t.co/zHFwR2R5hu)。

> Android Studio 2.3.1

## Milkcocoa

https://mlkcca.com/ 複数プラットフォームをつなげてくれるバックエンドサービス。IoT領域でよく使われてきてるイメージ。

![](https://mlkcca.com/img/toppage-feature2.gif)

## MilkcocoaのJava SDK

[Milkcocoa Android SDKのαバージョンを公開しました。](http://qiita.com/technicalrockstarsinc/items/deaf227b4c5568b08b05)

をもとにMilkcocoaとAndroidをつなげてみます。

[サンプルのソースコード](https://github.com/milk-cocoa/android-examples/blob/master/MilkChat2/app/src/main/java/com/mlkcca/android/sample/milkchat/MainActivity.java)をまねしてます。

## MIlkcocoaのAndroid SDKの読み込み

* 参考:[Android Studioで外部モジュールの読み込み](http://storyboard.jp/blog/android-studio_import_module/)

こちらの記事が参考になりました。

## 送る側 (Java)

```MainActivity.java
package com.example.n0bisuke.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import java.util.Date;

import com.mlkcca.client.MilkCocoa;
import com.mlkcca.client.DataElementValue;
import com.mlkcca.client.DataStore;

public class MainActivity extends AppCompatActivity {
    private MilkCocoa milkcocoa;
    private DataStore messagesDataStore;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onStart() {
        super.onStart();

        this.milkcocoa = new MilkCocoa("your-app-id.mlkcca.com");
        this.messagesDataStore = this.milkcocoa.dataStore("message");

        DataElementValue params = new DataElementValue();
        params.put("content", "こんにちはMilkcocoa");
        Date date = new Date();
        params.put("date", date.getTime());
        this.messagesDataStore.push(params);

        Toast.makeText(this, "Milkcocoa!", Toast.LENGTH_SHORT).show();
    }
}

```


## 受け取り側 (Node.js)

確認のため受け取り側をNode.jsで書いてみます。

```app.js
const MilkCocoa = require('milkcocoa');
const milkcocoa = new MilkCocoa('your-app-id.mlkcca.com');
const ds = milkcocoa.dataStore('messages');

ds.on('push',(err, pushed) => {
    console.log(err,pushed);
})
```

```
$ node app.js

{ id: 'it6wrey9LWKPXcF',
  path: 'messages',
  value: { content: 'こんにちはMilkcocoa', date: 1474099299032 },
  timestamp: 1474099300477 } undefined
```

無事につながりましたね。
Mac版Vagrant 1.8.5起動時のエラー回避

# Mac版Vagrant 1.8.5起動時のエラー回避
なにやら自宅のMacで久々にVagrantを新規で立ち上げた所
`Warning: Authentication failure. Retrying...`
と永遠と出力され続けるエラーにでくわしてしまった。。

メンドクセー気持ちを抑えつつググる。
[Vagrant 1.8.5でLinux boxをvagrant upするとエラーが出る件について](http://stknohg.hatenablog.jp/entry/2016/07/26/190330)
まとめられてる記事を発見！
1.8.5のバグなのね。。。

なにやら`public_key.rb`に追記してあげないといけないそうで。探すのも面倒なので下記コマンドで検索。
`sudo find / -name public_key.rb`
なんか2つでてきたけど正解は
`gems/gems/vagrant-1.8.5/plugins/guests/linux/cap/public_key.rb`
こっち。
っで下記の行を探して
56行目`mv ~/.ssh/authorized_keys.tmp ~/.ssh/authorized_keys`
下記を追記
+ `chmod 0600 ~/.ssh/authorized_keys`

おわり。
デリゲートを受け取る引数を省略可能にする

# デリゲートは省略できない？
デリゲートを引数にする場合、本来であれば省略することは出来ません。

例えば、以下の様な関数を作ったとします。

```cpp
DECLARE_DYNAMIC_DELEGATE(FMyDelegate);

UCLASS()
class MYPROJECT_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
    GENERATED_BODY()
 
    UFUNCTION(BlueprintCallable, Category = "MyProject")
    static void MyFunc(FMyDelegate Event) {}

};
```

この時、引数 **Event** にはデリゲートを指定しないとブループリントのコンパイルでエラーが発生します。
![OptionDelegate.png](https://qiita-image-store.s3.amazonaws.com/0/43814/095e17f9-10d6-72d6-0fdb-3178282e15bf.png)


これを回避するためにデフォルト引数を指定すれば出来るのでは？とも思いましたが、C++ でコンパイルエラーが発生して、デリゲートにデフォルト引数を指定することは出来ませんでした。

```cpp
    // Missing ')' in Function declaration specifier でダメ
    UFUNCTION(BlueprintCallable, Category = "MyProject", meta=(Event= FMyDelegate()))
    static void MyFunc(FMyDelegate Event) {}

    // C++ Default parameter not parsed: Event "FMyDelegate()" でダメ
    UFUNCTION(BlueprintCallable, Category = "MyProject")
    static void MyFunc(FMyDelegate Event = FMyDelegate()) {}

```

# デリゲートを省略するためには？
では、どうすればデリゲートを省略できるのか？
それは、

**「引数を構造体化すること」**

です。
先ほどの関数の定義を以下のように修正します。

```cpp

// デリゲート
DECLARE_DYNAMIC_DELEGATE(FMyDelegate);

// 引数構造体
USTRUCT(BlueprintType)
struct FMyEvent
{
    GENERATED_BODY()
    
    // 省略したいデリゲート
    UPROPERTY(BlueprintReadWrite)
    FMyDelegate Delegate;

    FMyEvent()
        : Delegate()
    {
    }

};

UCLASS()
class MYPROJECT_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
    GENERATED_BODY()
 
    // 引数構造体を引数とする。
    UFUNCTION(BlueprintCallable, Category = "MyProject")
    static void MyFunc(FMyEvent Event) {}

};
```

こうすることで、引数 **Event** に何も指定しなくても、コンパイルエラーが出ることはなくなります。
（指定しない場合は、構造体のコンストラクタで初期化された値が使われます。）
![OptionDelegate2.png](https://qiita-image-store.s3.amazonaws.com/0/43814/9a246154-ce4b-92cd-55dc-b9084a887a35.png)

引数を指定したい場合は、ピンアクションの**「Split Struct Pin」**で引数 **Event** のピンを展開すれば……
![OptionDelegate4.png](https://qiita-image-store.s3.amazonaws.com/0/43814/55ab9fa9-e1b6-b39b-ba53-1fc50d5fc820.png)

この通り、デリゲートを指定することが出来るようになります。
（この状態で引数を指定しなかった場合は、ブループリントでコンパイルエラーが発生します。）
![OptionDelegate3.png](https://qiita-image-store.s3.amazonaws.com/0/43814/4f309ca4-cfc5-62b3-f48d-5efd091ae3a5.png)

この方法は、デリゲート以外にも「デフォルト引数で初期化出来ないものすべて」に対して使うことが出来ます。
UnityのSpring Jointをマウスなどで操作する場合

# はじめに

[Spring Jointを使う](http://qiita.com/yanosen_jp/items/1642fb928a140146cf1b)の記事の補足です。Jointが繋がっているオブジェクトをマウスなどで動かす場合に使えるスクリプトを紹介します。

# 例：ピンボールの発射部分

要するに、ばねの上に玉をのせて、ばねを引いて弾く、というやつです。ばねを引くのに、マウスなどでドラッグする仕組みを考えます。

![](http://sun-malt.com/wp-content/uploads/2016/02/Image311.jpg)

http://sun-malt.com/wp-content/uploads/2016/02/Image311.jpg より転載

Cubeを二つ上下に配置して、下は固定、上はY方向のみ動くようにして二つをSpring Jointでつなぎます。そのさらに上に玉を。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/58503/7377075e-beb8-1a5c-42e0-c8c122347e77.png)

上のCubeはマウスでドラッグできるようにします。[こちらの記事](http://neareal.com/1230/)のMouseDragスクリプトをベースにしますが、マウスで動かすのはY方向だけにしたいので、元は

```csharp
        Vector3 mousePointInScreen
            = new Vector3(Input.mousePosition.x,
                          Input.mousePosition.y,
                          objectPointInScreen.z);
```

となっているのを

```csharp
        Vector3 mousePointInScreen
            = new Vector3(objectPointInScreen.x,
                          Input.mousePosition.y,
                          objectPointInScreen.z);
```
として、Yのみマウスの位置に依存するようにします。

変更したら、MouseDragスクリプトを上のキューブにアタッチしてください。

これで実行すると、下の動画のように、マウスで上のキューブを下に下げると、なぜか勝手に玉が上に飛んでいきます。

![Animation.gif](https://qiita-image-store.s3.amazonaws.com/0/58503/c4d3d98b-d1e7-1341-cb55-5c31149ca35d.gif)

理由はよくわかりませんが、解決策としては、**マウスでドラッグしている最中**は、上のcubeのRigidbodyのisKinematicがオンになるようにすると、うまくいきます。

```csharp:MouseDrag.cs
using UnityEngine;

public class MouseDrag : MonoBehaviour
{

    public Rigidbody _rigidbody;

    void Start()
    {
        _rigidbody = GetComponent<Rigidbody>();
    }

    void OnMouseDrag()
    {
        Vector3 objectPointInScreen
            = Camera.main.WorldToScreenPoint(this.transform.position);

        Vector3 mousePointInScreen
            = new Vector3(objectPointInScreen.x,
                          Input.mousePosition.y,
                          objectPointInScreen.z);

        Vector3 mousePointInWorld = Camera.main.ScreenToWorldPoint(mousePointInScreen);
        mousePointInWorld.z = this.transform.position.z;
        this.transform.position = mousePointInWorld;

        _rigidbody.isKinematic = true;

    }

    void OnMouseUp()
    {
        _rigidbody.isKinematic = false;
    }

}
```

ドラッグ中はisKinematicがtrueで、ドラッグを止める(OnMouseUp)とfalseに戻します。結果は以下の通りです。

![Animation2.gif](https://qiita-image-store.s3.amazonaws.com/0/58503/6aa40763-3c19-6021-3787-53cd9a798828.gif)
初めてkaggleをやってみる（タイタニック号のデータで）


kaggleを

#目標
- データ分析プラットフォームであるkaggleでの利用イメージをつかむ

#今回やること
- タイタニック号のデータを分析したふりをして、submitする

#タイタニックデータを見てみる
kaggleのtopページを下へスクロールすると

<Font Color="red">Titanic: Machine Learning from Disaster</Font>

と言うリンクがあるのでクリックすると競技の詳細が書かれたとページに飛ぶ
そのページの中央上段のあたりに

<font color="red">Competition Details » Get the Data » Make a submission</font>

と書かれているところがあるので Get the Data  をクリックすると
タイタニック号に関するデータセットファイル一覧が現れる

<font color='red'>trainとtestの二つのcsvデータをダウンロード</font>

なお、
trainはモデルを作るために使用するデータ
testは作ったモデルがどれくらい未知データにfitするかを見るために使用するデータ
その他のデータはおそらくチュートリアル用のモデリング例プログラムのデータだと思われる

##trainについて
- 891レコード
- PassengerId、Survived、Pclass、Name、Sex、Age、SibSp、Parch、Ticket、Fare、Cabin、Embarkedという１２の属性を持つ

※各属性の意味は下に記載

##testについて
- 418レコード
- 上記のtestからsurvived（生存）属性が抜かれたもの

###各属性の意味
| 属性 | 意味 |
|:-:|:-:|
| PassengerId  | 乗客、乗組員のID  |
| Survived  | 生存したかしてないか  |
| Pclass  | 乗客の階級  |
| Name  | 名前  |
| Sex  | 性別  |
| Age  | 年齢  |
| SibSp  | タイタニック号に乗っていた兄弟、姉妹、義兄弟、義姉妹、夫、妻の数  |
| Parch  | タイタニック号に乗っていた母親、父親、息子、娘、継息子、継娘の数  |
| Ticket  | チケットナンバー  |
| Fare  | 乗車料金  |
| Cabin  | 部屋番号  |
|Embarked | 乗船場(Cherbourg、Queenstown、Southampton)|

なるほど、testのデータの方々の生存をtrainを使って予測すればいいのか

#分析したふりをする
今回はとりあえずsubmitしたいだけなので適当なデータを作ろうと思うが
どんなフォーマット・・・？

さっき、train,testをダウンロードしたところにある

`train	.csv (59.76 kb )`
`gendermodel	.csv (3.18 kb)`

の二つをダウンロードして覗いてみたらそれっぽい感じだったので
それを参考にsubmitしてみるデータを作ってみることにした
<img width="160" alt="Screen Shot 2016-09-18 at 5.49.44 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/141196/eeec44bf-add3-8ecd-31e3-9354779ec8c3.png">

#提出

先ほども出てきた
<font color="red">Competition Details » Get the Data » Make a submission</font>
というところのMake a submissionをクリックすると

明らかに提出するっぽいフォームが現れた

面倒だけど周辺にある文章を読んでみると

`You have 10 entries today. This resets 15 hours from now (00:00 UTC).`

1日１０エントリーまで
とか

`File Format
Your submission should be in CSV format. You can upload this in a zip/gz/rar/7z archive if you prefer.`

CSVで出せばいいよ
とか

`of Predictions
We expect the solution file to have 418 predictions. The file should have a header row. Please see the sample submission file on the data page for an example of a valid submission.`

４１８データの予測して、データにはヘッダつけてね
データページにあるサンプルファイルを見てね

といったようなことがご丁寧に書いてあった

さっき作ったcsvファイルを

`Click or drop your submission here`

と書いてあるところに突っ込んで提出してみた

#結果
しばらく待っているとランキングのようなものが現れた
正解率が0.62679で
4965人中4800番くらいとなった
ちなみに上位を覗いてみると８０％くらいの正解率だった
#最後にひとこと
結構やり方覚えるの辛いかなぁと思っていたけど（英語だし）いざやってみたら流れは簡単だった
その他の機能も少しずつ覗いていこうと思う
texshop, tex on max osxでpng画像をtex fileに挿入するには


- texで画像を挿入できるのは基本eps file
- epsを挿入できるようにする設定もあるができたり，できなかったり
- png->epsに変換するのが確実，かんたん
- macで png->epsに変換するには

```
convert [png file] [output eps file]
```

- macでconvert tool使うには ImageMagikをインストールすれば良い

```
brew install imagemagick
```

- epsに変換したら，通常のやり方で， texに入れられる．
AWSのCodeDeployでエラーになったらAgentを試そう！

AWSのCodeDeploy使っている人ってどのくらいいるんでしょう？
先日こんなのも書きましたが
http://qiita.com/hardreggaecafe/items/7ff3ada575a1100fa4a2
あまりドキュメントがなくて正直苦労しております。
ここに書いたこともAmazonのサポートに聞いたことも一部書いてます。

自分の場合はCircleCIからS3まではコンテンツ持ってこれて、その後CodeDeployが
EC2にデプロイしようとしてエラーになるというのを何回か経験しています。
その時のエラーはこちら。

```
"The overall deployment failed because too many individual instances failed deployment, too few healthy instances are available for deployment, or some instances in your deployment group are experiencing problems. (Error code: HEALTH_CONSTRAINTS) "
Deployment: d-XXXXXXX
Instance ID: i-XXXXXX
```
『全体のデプロイは個別のインスタンスのデプロイ失敗が多すぎるか、もしくはデプロイが出来る健全なインスタンスが少なすぎる、あるいはいくつかのデプロイグループのインスタンスが問題を抱えていることが原因で失敗しました。』とエラーの原因がよくわからない内容・・・。

サポートに問い合わせてわかったことはデプロイするEC2インスタンスにCodeDeployAgentが無いと詳細原因を特定できないということでした。それをいれることでデプロイを再実行してエラー原因を吐き出させればそれを検索すればわかりそう。

ということで早速当該インスタンスの中にSSHでログイン後、CodeDeployAgentが入っているかを確認。
`rpm -qa |grep -i codedeploy-agent`
CodeDeployAgentが入っていないとエラーになります。

Agentが入っていなければこちらを打ち込んでインストール。

```
yum -y install ruby; yum -y install wget; cd /home/ec2-user; wget https://aws-codedeploy-ap-northeast-1.s3.amazonaws.com/latest/install; chmod +x ./install; sudo ./install auto
```

以下のログを確認

```
/var/log/aws/codedeploy-agent/* 
/opt/codedeploy-agent/deployment-root/deployment-logs/* 
```
こちらのコマンドも有効
`find /opt/codedeploy-agent/deployment-root/ -type d -iname "d-XXXXX" `
d-XXXXはCodeDeployのデプロイ番号。

で早速ログを見ると

```
2016-09-13 17:20:44 ERROR [codedeploy-agent(20914)]: InstanceAgent::Plugins::CodeDeployPlugin::CommandPoller: Error during perform: RuntimeError - File already exists at location /home/adbase/analytics/public/site_edit.html - /opt/codedeploy-agent/lib/instance_agent/plugins/codedeploy/installer.rb:115:in `generate_normal_copy'
```

とファイルがすでにあると怒られている。まあ、たしかにデプロイ前にソースをコピーしているからこれが何かやっているのか？と思い調べたら
https://forums.aws.amazon.com/thread.jspa?threadID=212987
にこんなことが書いていました。

```
AWS CodeDeploy keeps track of files in an application revision that are deployed for a deployment group. It does not overwrite any existing files that were not deployed as part of a deployment group's application revision. This is done so that your deployment does not interfere with anything outside of its revision.

If you want to overwrite an existing file, you can do the clean up in 'BeforeInstall' lifecycle event.
```

『AWSのCodeDeployはデプロイグループのアプリケーションのリビジョンを追跡して記録しています。これは既に存在しているファイルが有ればそれがアプリケーションのリビジョンの一部でないことを検知して上書きしないようにしています。リビジョン外のものを妨げないようにそうしています。

もし上書きしたければ消去するようにBeforeInstall（CodeDeployのライフサイクル）に記述してください。』

ということでした。気がきいてるんでしょうか？？ということでファイル消したらデプロイ出来るようになりました。

ってこのへんまで書いて昔おんなじような記事を書いたことに気づいた罠。
http://qiita.com/hardreggaecafe/items/6abf9d4c6a82fcf61589
よろしければご参照ください。
OrbitControlsでinputが使えないバグ


デモ：http://codepen.io/mo4_9/pen/ORXpXQ
（inputが使えなかったケース）

OrbitControlsはデフォルトでdocumentにイベントを貼るので、第二引数にdomElementを指定してあげないと、同じページでinputが使えなかったりする。

また、同じページに複数のシーンが存在すると、一つのカメラを動かしているつもりが全シーンのカメラを動かしてしまっているなんてことも。

```
this.controls = new THREE.OrbitControls(this.camera, this.renderer.domElement);
```

> 参考
http://stackoverflow.com/questions/21718015/cannot-select-text-with-orbitcontrols
https://yoheikoga.github.io/2017/07/26/threejs-datgui-and-orbitcontrols/
[Rails] validationをDBスキーマから自動生成してDRYにする

DBスキーマで`NOT NULL`、`unique`、最大長を定義してあるのにModelの方にも

```
validates :email, presence: true, uniqueness: true
validates :blah, length: { maximum: 255 }
```

を書くのは面倒だ。DRYじゃない。
…と考える人のためのgemがある。

[schema_validations](https://github.com/SchemaPlus/schema_validations)
[pretty_validation](http://sinsoku.hatenablog.com/entry/2015/11/15/103924)

pretty_validationは`rake db:migrate`の後にvalidationのソースファイルが自動生成されるのに対し、schema_validationsはファイルは生成しないがvalidationのコードがauto-magicallyに定義される。
導入はどちらも`gem "schema_validations"`、`gem 'pretty_validation'`を書くだけだ。

schema_validationは2011年からあり今もちゃんとメンテナンスされているが、githubのスター数が88とあまりメジャーでないようだ。
とても便利そうなのになぜだろう？
使っている人いたら感想を聞かせて下さい。
プログラマの考え方がおもしろいほど身につく本　第１章読書分からないまとめ

# プログラマの考え方がおもしろいほど身につく本

わかりづらいので随時ここに書く。

## 第１章

### 1.1.1

OK

### 1.1.2

未読

### 1.4.4

### 各覚えにくい名前（読み方と由来が不明）

読みにくい単語だしどれがどれか覚えづらい。

レセプター・・・（receptor）
Kratzz・・・棒状の横たわっているもの、棒状と書かれているが、これが混乱の元だった。箱状と書いてほしかった。最初縦に伸びている↓のことと思った。
この☆が格納されているもの。
[☆　☆☆]
[☆☆　　]
[☆☆　　]

Quinicrys・・・☆マークのパワージェム
Qurrasi・・・エイリアン名

### アラーム

偶数に☆が縦に並ぶとアラームが鳴る

☆
☆

### 疑問

抑制機でアラームを止められる。
「同じ方向にあるレセプターのみ有効である。」らしいが、「同じ方向」とは？
EmEditorでPowerShellコマンドを実行し、入力補助機能として使用するためのマクロ

[サクラエディタでPowerShellコマンドを実行し、入力補助機能として使用するための3行マクロ](http://qiita.com/minr/items/a5cc58da46a0bf29918d)
に感銘を受けたので、[EmEditor](https://jp.emeditor.com/)版を作りました。

```JavaScript
var Result = "<Error>\n";
var CommandText = document.selection.Text;
CommandText = CommandText.replace(/"/g,'\\"');
var WshShell = new ActiveXObject("WScript.Shell");
var ExecCmd = WshShell.Exec('powershell -command "' + CommandText + '"');
while (ExecCmd.Status == 0) {
	Sleep(10);
}
if (ExecCmd.ExitCode == 0) {
	Result = ExecCmd.StdOut.ReadAll();
}
document.selection.Text = Result;
document.selection.CharLeft(1);
document.selection.Delete(1);
```

JScriptでマクロが動くエディタであれば、EmEditorでなくても動くかもしれません。
brew tapでgithubのusernameを求められたらスペルミスだった

### タイトルのまま
```bash:
$brew tap hoge/hogehoge
Username for 'https://github.com':　
---
remote: Repository not found.
```
突然Usernameやpasswordを求められたら、homebrewさんがリポジトリを見つけられなくて困ってるみたい
UbuntuServer にAMP環境+phpMyAdminをDockerで構築した

# 0.環境

|項目      | バージョン |
|:----------|:----------|
| OS        | UbuntuServer 16.04 LTS |
| Docker    | 1.12.1, build 23cf638 |
| Apache    | 2.4 （Dockerイメージ） |
| MySQL     | 5.7 （Dockerイメージ） |
| PHP       | 7.0 （Dockerイメージ） |
| phpMyAdmin| 4.6.4 （Dockerイメージ） |


# 1.Dockerをインストール

    sudo wget -qO- https://get.docker.com/
もしくは

    sudo curl -fsSL https://get.docker.com/ | sh


インストールが完了したら、ユーザを「docker」グループに所属させます。

    gpasswd -a [ユーザ名] docker


# 2.MySQL設定ファイル作成

どこでもいいけどとりあえず　「~/dockerfile/mysql_custom.conf」　で作成します。

    [mysqld]
    character-set-server=utf8

# 3.MySQLのDockerコンテナ起動

作成したMySQL設定ファイルを反映させるため、「~/dockerfile」にバインドします。

    docker run --name mysql -v ~/dockerfile:/etc/mysql/conf.d /etc/localtime:/etc/localtime:ro -e MYSQL_ROOT_PASSWORD=[mysqlログインパスワード] -d mysql:5.7


# 4.PHP-apacheとMySQLをリンクさせたコンテナを起動する

　※apacheで公開するWebアプリのモジュールをホストの「~/work」に置いているため、「~/work」にバインドしています。
　※MySQLと連携できるようカスタムしたPHP-apacheのDockerイメージを公開リポジトリに置いてあるので、それを使用しています。

    docker run -p 80:80 -v ~/work:/var/www/html --link mysql:mysql --name php -d saka24/php7-apache

# 5.PHPでMySQLに接続する

以下のように接続ホスト名を「mysql」に指定すれば接続できます。

```PHP:PHP
$link = mysqli_connect("mysql", "root", "[mysqlログインパスワード]", "[DB名]");
```


# 6.phpMyAdminコンテナを起動

    docker run --name myadmin -d --link mysql:db -p 8080:80 phpmyadmin/phpmyadmin

8080ポートにアクセスし、

    ユーザ名：root
    パスワード：項番３で設定したパスワード
でログインできればＯＫ！
JavaScriptから :visited 用のCSSルールを追加する

訪問済みリンクを見やすくするためにGreasemonkeyスクリプトを書いていて嵌ったのでメモ。

#通常のCSSの場合
通常のCSSルールを追加する場合は以下のように書ける。

```js
var sheet = document.styleSheets[0];
sheet.insertRule('span {color: #FFF;}', 0);
```

#:visitedを対象としたCSSの場合
一方 :visited 特有の性質として、通常のリンク（疑似クラス指定無し or :link）に
同じプロパティーが設定されていないと有効にならない、というものがある。
したがって:visitedの表示を変える場合は、以下のように通常リンク用の指定とセットで書く必要がある。

```js
var sheet = document.styleSheets[0];
sheet.insertRule('a:visited {background-color: #DDD;}', 0);
sheet.insertRule('a {background-color: #FFF;}', 0);
```

#参考
How do you add CSS with Javascript? - Stack Overflow
http://stackoverflow.com/questions/707565/how-do-you-add-css-with-javascript

:visited | CSS-Tricks
https://css-tricks.com/almanac/selectors/v/visited/
Rubyで国立国会図書館APIに問い合わせ

# Rubyで国立国会図書館APIに問い合わせ
* 国会図書館API(OpenSearch)にRuby問い合わせる。  
http://iss.ndl.go.jp/information/api/
* ISBNに紐づく書籍情報を取得する。  
GET http://iss.ndl.go.jp/api/opensearch?isbn=9784774163666
* REXML::Documentで返却されます。（普通はどうやって返すんだろ？）
* 今回はISBNのみですが、getのパラメータを変えればいろいろな情報で問い合わせできます。

```open_search_client.rb
require "faraday"
require 'rexml/document'

# open_search_client.rb
class OpenSearchClient

  URL_HEAD = 'http://iss.ndl.go.jp'

  def get_book_info_by_isbn(isbn)
      response = get('/api/opensearch', {:isbn => isbn})
      REXML::Document.new(response.body)
  end

  private

  def get(path, pram)
    con = Faraday.new(:url => URL_HEAD) do |f|
      f.request  :url_encoded
      f.response :logger
      f.adapter  Faraday.default_adapter
    end
    con.get path, pram # GET http://iss.ndl.go.jp/api/opensearch?isbn=9784774163666
  end
end
```

```main.rb
o = OpenSearchClient.new
res =  o.get_book_info_by_isbn('978-4774163666')
puts res.elements['//rss/channel/item/title'].text #=> GitHub実践入門 : Pull Requestによる開発の変革
```
Phalcon DB usage without the Transaction.

標準的な使い方

Select

```php
use Phalcon\Db\Adapter\Pdo\Mysql as DB;

$config = [
  "host"     => "localhost",
  "username" => "user",
  "password" => "pass",
  "dbname"   => "service"];

$db = new DB($config);

$sql = "select * from `user`";

$rows = $db->fetchAll($sql);
foreach($rows as $row) {

  echo $row["fullname"] . "\t" . $row["mail"] . "\n";
} 
```


Fetch Object

```php
use Phalcon\Db\Adapter\Pdo\Mysql as DB;

$config = [
  "host"     => "localhost",
  "username" => "user",
  "password" => "pass",
  "dbname"   => "service"];

$db = new DB($config);
$result = $db->query("select * from `user`");
$result->setFetchMode(Phalcon\Db::FETCH_OBJ);
$rows = $result->fetchAll();

foreach($rows as $row) {

  echo $row->fullname . "\t" . $row->mail . "\n";
}
```


Other Query

```php

$config = [
  "host"     => "localhost",
  "username" => "user",
  "password" => "pass",
  "dbname"   => "service"];

$db = new DB($config);

/**
 * INSERT
 */
// Commmon.
$sql = "insert into `user` values(null, 'taro yamada', 'yamada@xx.co.jp', 'some password')";
$success = $db->execute($sql);

// using placeholder
$sql = "insert into `user` values(null, ?, ?, ?)";
$success = $db->execute($sql, ['taro yamada', 'yamada@xx.co.jp', 'some password']);

// 1 liner using the Array Format
$success = $db->insert("user", ['taro yamada', 'yamada@xx.co.jp', 'some password'], ['fullname', 'mail', 'password']);


// 1 liner using the Hash(dictionary) Format
$success = $db->insertAsDict("user", 
  [
    "fullname" => "taro yamada",
    "mail"     => "yamda@xx.co.jp",
    "password" => "some password"
  ]);


/**
 * UPDATE
 */
// Common
$sql = "update `user` set `fullname`='hanako yamada' where `id`=1";
$success = $db->execute($sql);

// using placeholder
$sql = "update `user` set `fullname`=? where `id`=?";
$success = $db->execute($sql, ["hanako yamada", 1]);

// 1 liner using Array Format
$sucess = $db->update(
  "user",
  ["fullname"],
  ["hanako yamada"]
  "id=1"
);

// 1 liner using the Hash Format
$success = $db->updateAsDict(
  "user",
  ["fullname"=>"hanako yamada"],
  "id = 1"
);

// With specified option for the Escape
$success = $db->update(
  "user",
  ["fullname"]
  ["hanako yamada"]
  [
    "condition" => "id =?",
    "bind" => [1],
    "bindTypes" => [PDO::PARAM_INT]
  ]
);
// this case, that specified the Type of valiable to integer by "bindTypes" option. however maybe never use..

/**
 * DELETE
 */
// Common
$sql = $delete `user` where `id`=1";
$success = $db->execute($sql);

// using placeholder
$sql = $delete `user` where `id`=?";
$success = $db->execute($sql, [1]);

// 1 liner
$success = $db->delete("user", "id=?", [1]);

```

基本的なDBの利用、コンソールでちょこっと使いたいときは上記のどれかになると思います。
Controllerなどを利用するときはDIに登録して、Modelを操作することになりそうですけど、上記が分かってれば逆にModelの縛りはなくてもいいし、フレームワーク依存怖い。でも次の次あたりに書きます。
次は、トランザクションありき。
css を scss に変換する


## 拡張子を.cssから.scssに一括変換

```
$ find app/assets -name *.css | while read file; do mv "$file" "${file%%.css}.scss"; done
```

参考: [find／xargsを使ったファイル・ディレクトリ名の一括置換／一括作成コマンド一覧](http://uguisu.skr.jp/Windows/find_xargs2.html)


## url() を image-url() に一括置換

```
$ find app/assets -name *.scss | xargs sed -i 's/ url(/ image-url(/g'
```

## と思ったら、urlは"で括る必要があった

sed で一気に変換するが、その前に確認

```
$ find app/assets -name *.scss | xargs sed -n 's/image-url(\([^"]\+\))/image-url("\1")/p'
```

問題なさそうなので置換

```
find app/assets -name *.scss | xargs sed -i 's/image-url(\([^"]\+\))/image-url("\1")/g'
```
参考: [sed | テキストの置換,正規表現のメタ文字や後方参照の方法など](http://bi.biopapyrus.net/linux/sed.html)
.cssファイルの拡張子を一気に.scss ににネームするワンライナー



```
$ find app/assets -name *.css | while read file; do mv "$file" "${file%%.css}.scss"; done
```


参考: [find／xargsを使ったファイル・ディレクトリ名の一括置換／一括作成コマンド一覧](http://uguisu.skr.jp/Windows/find_xargs2.html)
mysqlが起動できない

#事象
mysqlを起動しようと思って以下のコマンドを打つと。
`$ mysql -u root`

以下のエラーが出力されます。
`ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)`

#参考
参考にしたのは以下のリンク
[mysqlが起動できな...ket '/tmp/mysql.sock' (2)）](http://qiita.com/carotene512/items/e00076fe3990b9178cc0)
[mysqlのsocketエラーでrailsアプリが起動できない](http://qiita.com/fujitora/items/d341c52706d1954cae28)
[mysqlが突然起動しなくなる　第二幕]
(http://hidamariman.hatenadiary.jp/entry/2016/02/01/133205)

#実施したこと
とりあえず、ターミナルでこれを打ち込んでみます。
`$ sudo touch /tmp/mysql.sock`

そして、もう一度冒頭のこれ。
`$ mysql -u root`
結果、
`ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock'(38)`
(2)が(38)に変わりました。
ここまでは参考リンクに載っている通り。（１個目）
これはなんか権限の問題でエラーになっているそうです。（知らんけど）
どなたか原因知ってたら教えてください。

当然、こんなことをしてみます。
`sudo chown mysql:mysql /tmp`
だったり
`sudo chmod 777 /tmp/mysql.sock`

`$ mysql -u root`
`ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock'(38)`

**変わらない**

#解決
この問題については僕がmysqlを触るのが
久しぶりすぎてちょっとおかしなことをやっていました。
###サーバーを起動していないのに動くわけがない
という結論に。

3つ目のリンクで、きちんと
`$ mysql.server restart`
の後に
`$ mysql -u root -p`
ってやってるのを見て、あっ‼︎ってなりました。

僕の場合は、サーバーの起動をしてないので
`$ sudo mysql.server start`
をしてから冒頭の
`$ mysql -u root`
で成功しました。

# ちなみに

`$ sudo mysql.server start`
でも引っかかったのですが、
`$ brew uninstall mysql`
`$ brew install mysql`
でインストールし直しで行けました。
アップデートでもよかったかもしれない、、、

まだphpからmysql操作ができるかやってみてないので不安ですが、とりあえず今回はこれで。
Xcode8でコメントアウトのショートカットを有効にする

Xcode8からSource Editor Extension機能が加わりましたが、コメントアウトの機能がそちらに移行したらしく、デフォルトではコメントアウトのショートカット（`Cmd + /`）が効かない状況でした。（他のプラグインも同様な対応）

### 解決策
`sudo /usr/libexec/xpccachectl`
`sudo reboot`

の2つを実行。

これで今までと同じくコメントアウトのショートカットができるようになりました。
友達におすすめのJSある？って聞かれた２

一人の友達に向けて書いた[友達におすすめのJSある？って聞かれた](http://qiita.com/super2baba/items/029234406c9cb6169318)が、想像以上に多くの人に見て頂いたことを友達に報告をしたところ、ずっと第二弾を早く書いてくれと友達に急かされていました。

書くぞ。見てるか友達。


おすすめというよりは、日々使えるものからたまに使いたいもの、何かあったときに使えるようなものを紹介したいと思う。



1、[シンプルなHTMLとCSSコピペで実装できるタイトル（見出し）のデザインサンプル 50](http://www.nxworld.net/tips/50-css-heading-styling.html)

>これは最初見たときはほんとに震えた。あ、これもCSSで出来ちゃうんだって。
>これ全部自分のものにしたら俺成長しちゃうなって、これのびしろやなって、思ったんです。
>一年前から何も成長していない自分が言うてます。

2、[あまり知られていないBootstrapスタイルテクニック、小技16個まとめ](http://photoshopvip.net/69687)

>皆さん大好きなBootstrapのテクニック。記事自体は2014年10月と少し古いが、案外Bootstrapって簡単に使える反面しっかりドキュメント読み込んだりしなかったりする。これってこんな簡単に出来たのか…みたいなことにならないように願いを込めて。

3、[jQuery＆CSS3で超簡単！スクロールするとかっこ良く要素を表示する方法7つ](http://www.north-geek.com/entry/js-scroll#移動フェードイン表示)

>正直かなり基礎的なことだが、全部覚えているかと言われると覚えてないし、かと言って覚えないといけないのかと言えばそうでもないし、そもそも覚える気がないが、非常に必要な知識。

4、[jQueryを使ってキーボードからの操作でイベントを実行させる方法](http://black-flag.net/jquery/20110629-3269.html)
5、[jQueryでキーボードのキーコードを調べる方法](http://black-flag.net/jquery/20110630-3283.html)
この二つはWEBシステムとか開発してる人はめっちゃ使えると思います。これ実装した時の喜びはすごい。


6、[BASIC TABLE](http://www.jerrylow.com/basictable/)

7、[CSSだけでレスポンシブなテーブルデザイン3種](http://yuruwarp.com/coding/responsive-table-css)
レスポンシブなテーブル。ただそれだけ。自分で実装しても良いと思う。
個人的にはSample2：項目を分離させるってのが好きです。






こういうものを紹介しておきながらこんなことを言うのもおかしな話なんですが、
できるだけプラグインには頼らず生きていきたい。
サプリに頼らず健康でいたいし、薬を飲まずに病気も治したい。
裏技なんか使わなくても俺は出来るんだって胸を張りたい。
Cocoapods の pod install で色々はまった時の解消法メモ

Cocoapodsを使って依存ライブラリをインストールした時に色々ハマったので解消方法をメモ。

# 環境

+ Cocoapods version 1.0.1

# The dependency `xxxx` is not used in any concrete target.

以下のようなPodfileを作成し、`pod install`コマンドを実行したらエラーが。

```Podfile
pod 'AWSAPIGateway', '~> 2.2.1'
```

```bash
$pod install
[!] The dependency `AWSAPIGateway (~> 2.2.1)` is not used in any concrete target.
```

メッセージを読むと targetが指定されていないと書いているようにみえるが。。

調べてみると以下の記事が。

[Cocoapods 1.0.0で注意すること](http://qiita.com/ShinokiRyosei/items/7187ffb71862aba7e240)

Cocoapods 1.0.0から podfile　でターゲットを指定しないといけないようです。
`pod init`コマンドで対象のプロジェクトのPodfileのテンプレを作成し、それに追記するのが良さそう。

```bash
$pod init
$cat Podfile
# Uncomment this line to define a global platform for your project
# platform :ios, '9.0'

target 'HelloWorld' do
  # Uncomment this line if you're using Swift or would like to use dynamic frameworks
  # use_frameworks!

  # Pods for HelloWorld

  target 'HelloWorldTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'HelloWorldUITests' do
    inherit! :search_paths
    # Pods for testing
  end

end
```

あとは上記を変更すればOKです。

# pod repo updateが失敗する

解消したと思ったら次のようなエラーが。

```bash
$pod install
Analyzing dependencies
[!] Unable to satisfy the following requirements:

- `AWSAPIGateway (~> 2.4.7)` required by `Podfile`

None of your spec sources contain a spec satisfying the dependency: `AWSAPIGateway (~> 2.4.7)`.

You have either:
 * out-of-date source repos which you can update with `pod repo update`.
 * mistyped the name or version.
 * not added the source repo that hosts the Podspec to your Podfile.

Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by default.
```
pod install した時に `pod repo update`コマンドを実行しないよというメッセージが。
じゃあと実行してみました。

```bash
$pod repo update

Please commit your changes or stash them before you can merge.
error: The following untracked working tree files would be removed by merge:
      Specs/ALSPopView/1.0.1/ALSPopView.podspec.json
      Specs/ALSPopView/1.0.2/ALSPopView.podspec.json
      Specs/ALSPopView/1.0/ALSPopView.podspec.json
      Specs/AdMobMediationAdapterFB/1.2.1.1/AdMobMediationAdapterFB.podspec.js
```

--versbose オプションを付けて実行する分かるのですが、内部的には`git pull`を実行しているようで恐らくgit pull しているレポジトリの所でcommitされていないファイルなどがあるようでエラーになっているような。

調べてみると以下のGithub の issueが。

[pod install git conflict](https://github.com/CocoaPods/CocoaPods/issues/776)

`git reset HEAD --hard`で一旦HEADに戻せば大丈夫とのことでやってみます。

```bash
$cd ~/.cocoapods/repos/master/
$git reset HEAD --hard
```


再度実行してみます。

```bash
$pod repo update

・・・

CocoaPods 1.1.0.rc.2 is available.
To update use: `sudo gem install cocoapods --pre`
[!] This is a test version we'd love you to try.

For more information, see https://blog.cocoapods.org and the CHANGELOG for this version at https://github.com/CocoaPods/CocoaPods/releases/tag/1.1.0.rc.2
```
成功。
CococPodsの1.1.0rc2があるよと言われるがtest versionらしいのでやめときます。。。

問題解消後、`pod install`で依存ライブラリがインストールできました。
良かったー。
Vagrantを扱うときにハマりがちポイントをまとめてみた

こんにちは。最近はお絵描きに夢中なすろっくさんです。
環境を共有できるVagrantをとても好きです。

一方でVagrantを使ってて結構ハマりポイント多いなあ、と感じたので僕が調べたハマりポイントを書いておきます。
多分大体のVagrantの問題はこれで解決できそうな気がします。

## ネットワークが繋がらない

Vagrantは最初にこんなコマンドを打つと思います。

```bash
$ vagrant init
```

このコマンドはVagratfileという設定ファイルを作成するコマンドです。この設定ファイルに書いた通りにVagrantは動作します。
このコマンドはフレームワークやアプリケーションフォルダの中で行います。Railsだと
```
$ rails new [アプリ名]
```
とかで作成されたアプリのフォルダのしたですね。そこでvagrant initとか打つんですが、たまにネットワークにどうすりゃええねんみたいなのがあります。

通常ならvagrant sshとかでSSHログインできるんですが、複数のvagrant立ち上げてHTTP通信とかさせるときはIPとか使いたいじゃないですか。もっというとホストマシン側からブラウザで確認したいじゃないですか。

そんなときはVagrantfileのここにこう書きます。
```
config.vm.network "private_network", ip: "192.168.33.10"
```
config.vm.networkという設定項目はデフォルトで存在しているので探してみてください。コメントアウトを外して、HTTP通信の時に使いたいIPを設定します。

sshしたい時はアプリのフォルダに入ってvagrant ssh、MySQLやHTTPで確認したいときはこのIPでみたいな使い分けができると思います。

あ、複数たちあげるときは末尾を11,12みたいにVagratfileに記述かえていくといいです。IPかぶったら起動してくれないので。

## IPで接続できない

vagrant sshでSSHログインはできてApacheとかnginxとかたてたけどサイトがみれないとかはあるはずです。

そんなときはiptablesとselinuxをオフにしましょう。

```
# iptables
chkconfig iptables off
/etc/init.d/iptables stop

# selinux
vi /etc/selinux/config
++++
SELINUX=disabled
++++
```
これで再起動してください。
デフォルトだとこいつらが動いて全部弾いている場合があるので、やっとくといいです。開発のときは邪魔者以外のなんでもありません。

ただし本番でiptablesをオフにするのは絶対やらないでくださいね！適切なファイアーウォール設定をしましょうね！

## boxを再利用しようとしたらネットワークエラーがでる

box再利用しようとしてvagrant upしたらこんなエラーがでてIPが降られず、/vagrantがマウントされなかった覚えはありませんか？

```
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

ARPCHECK=no /sbin/ifup eth1 2> /dev/null

Stdout from the command:

Device eth1 does not seem to be present, delaying initialization.


Stderr from the command:
```

HWADDR欄の文字列がコピー元と同じものになっているとこういうエラーがでるようです。

そんなときは以下の手順でファイルを消しましょう。

```
rm -rf /etc/udev/rules.d/70-persistent-net.rules
rm -rf /etc/udev/rules.d/70-persistent-cd.rules
```

その後仮想マシンから一旦ログアウトし、以下のコマンドを打ちます。

```
$ vagrant reload
```

今度はちゃんとIPとMACアドレスが新規のものになることが確認出来るはずです。

## VagrantでLinux系統をvagrant upするとエラーが出続けてログインできなくなる

最新版のvagrantで起こるエラーなんですがLinux系を入れようとした時vagrant upしたらこんな感じになったことありませんか？

```
default: Inserting generated public key within guest...
default: Removing insecure key from the guest if it's present...
default: Key inserted! Disconnecting and reconnecting using new SSH key...
default: Warning: Authentication failure. Retrying...
default: Warning: Authentication failure. Retrying...
```

実はこれvagrant側のバグでして、1.8.6以降で解決予定の模様です。

Macだとインストール先は以下になります。

```
/opt/vagrant/embedded/gems/bin/vagrant/vagrant-1.8.5
```

plugins/guests/linux/cap/public_key.rbっていうファイルがあるんで、その56行目に以下を追加してください。

```
chmod 0600 ~/.ssh/authorized_keys
```

一応1.8.6がリリースされたら直るみたいなので、お悩みの方はぜひ。

## まとめ

使ってみて思ったんですが、vagrantを使ってLinuxを扱うときは「vagrantの設定」「Linuxの設定」、今自分が悩んでいることはどちらに起因するものなのか、きちんと押さえてから使うのがいいかなと思います。

個人的にLinuxに明るくない開発者にそういったことを強制するようじゃ、まだ開発ツールの一環としてはちょっとつらいかなあ、オススメできないかなあ、という気もするんですけども。使えれば本当に楽なんですけどね。

「なんかわからないけど繋がらなくなった」という結論を出す前にどうかおためしいただけるとvagrabtの名誉のためによろしくおねがいいたします！
Mac(El Captain)にDocker for Macインストール

# 環境

OS X El Capitan(10.11.5)

# Dockerインストール

[公式サイト](https://docs.docker.com/docker-for-mac/)からインストール

# バージョンをチェック

```
$ docker --version
Docker version 1.12.1, build 6f9534c

$ docker-compose --version
docker-compose version 1.8.0, build f3628c7

$ docker-machine --version
docker-machine version 0.8.1, build 41b3b25
```

# Webサーバーを立ててみる

```
$ docker run -d -p 80:80 --name webserver nginx
```

http://localhost にアクセス

![スクリーンショット 2016-09-17 11.22.57.png](https://qiita-image-store.s3.amazonaws.com/0/126002/88d7d8a2-05b3-1af3-8536-ecdc627f1079.png)

動いてる( ´ ▽ ` )ﾉ


```
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
04a23079b96d        nginx               "nginx -g 'daemon off"   13 minutes ago      Up 3 seconds        0.0.0.0:80->80/tcp, 443/tcp   webserver
```

止めたい時は

```
$ docker stop webserver
```

動かしたい時は

```
$ docker start webserver
```

消したい時は

```
$ docker rm -f webserver
```

コンテナが消えるだけで、イメージは消えない

```
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              4a88d06e26f4        31 hours ago        183.5 MB

```
Python2でiOSアプリにプッシュ通知を送る(サンプルコードあり)


## はじめに

前回も似たような記事を書いたのですが、
実験せずに書いて、実際に自分がやってみて動かなかったので修正等含めて改めて記事を書きます！

[PythonでiOSアプリにプッシュ通知を送ろう](http://qiita.com/nnsnodnb/items/ba415c2a56a037cce526)

## 環境

- Python 2.7.11
- pip 8.1.2
- apns==2.0.1

## 環境構成

Virtualenvで仮想環境を構築後にpipにてapnsをインストール

```bash
$ pip install apns
```

## 準備

キーチェーンからプッシュ通知をするpemファイルを書き出す。

![スクリーンショット_2016-09-17_午前11_04_45.png](https://qiita-image-store.s3.amazonaws.com/0/97280/6651accb-2648-dace-c57d-6ed544882735.png "スクリーンショット_2016-09-17_午前11_04_45.png")

1. Develop用とDistribution用のp12ファイルを公開鍵と秘密鍵を含めた形で書き出す。
 
   秘密鍵に関しては同名のものを使うと使いまわせるので同名にしておく。
2. 秘密鍵も同様にして **秘密鍵** のみをp12形式で書き出す
3. それぞれ3つあるpemファイルを以下コマンドでpemファイルに変換する

```bash
$ openssl pkcs12 -in secret.p12 -out secret.pem -nodes -clcerts
```

名前はわかるように変更してください。
書き出すときにパスワードなしで設定してください。

## ソースコード

### 1つの端末に送る

Developer用のpemファイルを設定しています。

```python:single.py
# coding: utf-8

import time
from apns import APNs, Payload

apns = APNs(use_sandbox=True, cert_file='develop.pem', key_file='secret.pem')

token_hex = '45f9f318ac6506742a54a3b8bb6493c72cdad9afe2c154d5295e9db15cdf83a7'

content = "テスト!!"
content = content.decode('utf-8')

payload = Payload(alert=content, sound="default", badge=1)
apns.gateway_server.send_notification(token_hex, payload)
```

`cert_file` は公開鍵。 `key_file` は秘密鍵です。

### 複数端末に送る

今回はDeployGateにあげたものをテストしたのでDistribution用のpemファイルを設定しています。

```python:multi.py
# coding: utf-8

import time
from apns import APNs, Frame, Payload

apns = APNs(use_sandbox=False, cert_file='distribution.pem', key_file='secret.pem', enhanced=True)

token_hex = ['417a7b3329c86240b159b816313a3ae51ff9059b98ac29bc7cbcbd36dd41e2a9',
             '446d18e7a621d371a8683d0d33bf9080091efbf693f5b591f9ec307a1e627d46']

message = "メッセージ！！"
message = message.decode('utf-8')

payload = Payload(alert=message, sound="default", badge=1, custom={'uri': 'https://nnsnodnb.moe'})

frame = Frame()
identifier = 1
expiry = time.time() + 3600
priority = 10

for token in token_hex:
    frame.add_item(token, payload, identifier, expiry, priority)

apns.gateway_server.send_notification_multiple(frame)
```

複数端末に送るときは、 `APNs` の要素に `enhanced` を設定するのが肝になっているようです。
リンクは取り忘れたのですが、PyAPNsパッケージのGitHubのIssueに上がっていました。

また、同じように `Payload` に `mutable_content=True` を設定することでiOS10からの画像つきプッシュに対応することができるのかな？

## 結果

![IMG_0136.png](https://qiita-image-store.s3.amazonaws.com/0/97280/1178c1f4-71b4-bcde-d771-1872047d7353.png "IMG_0136.png")

現在、私用で開発中のものなのでアイコン等は見せられませんが、こんな感じに通知が届きました！
`custom` のところにJSONを埋め込むことができるので結構簡単にそれっぽいことができそうですね！

## その他

GitHubのリポジトリです。

[nnsnodnb/APNs-Push-Notification](https://bitbucket.org/nnsnodnb/apns-push-notification)


今回使用したパッケージ

[djacobs/PyAPNs](https://github.com/djacobs/PyAPNs)


どうやらPython3には対応していないので自分でどうにかするしかなさそうですね。
2to3しても何故か変わらない！？
[iOS10][Xcode8] あらたにinfo.plistに追記が必要になった項目まとめ

iOS10からiPhone/iPadの各種機能を使う際に、何の目的でその機能を使用するかをinfo.plistに設定しなければならないことになりました。設定しないで実行するとその機能を使用する操作をした時にデバッグモードであれば「何々をinfo.plistに設定してください」とのエラーを吐いてクラッシュします。

実際ユーザーが使う際はそこに設定した説明文とともにアラートがでてその機能の使用をアプリに許可するかどうか選択することになります。


プライバシー面の強化ということなのでしょうが、ちょっとしたことでも設定が必要になってしまったので一覧としてまとめておきます。

## 一覧
- Bluetooth Periferal ... Bluetooth機能（AirDropだけでも認定されるようです）
- Calendars ... カレンダー情報を取得する際（日付を操作するだけで認定されるようです）
- Camera ... カメラを使用する際
- Contacts ... 連絡先情報を使用する際
- Health Share ... （おそらく）アプリで取った運動情報をHealthCareに共有する際
- Health ... HealthCareから情報を取得する際
- HomeKit ... HomeKitを使用する際
- Location Always ... バックグラウンドでも位置情報を取り続ける際
- Location ... 位置情報を使う際
- Location When in ... (おそらく)その場所に来た時刻情報などを取得する際
- Media Library ... (おそらく)音楽ライブラリにアクセスする際
- Microphone ... マイクを使う際
- Motion ... 加速度センサーを使う際
- Music ... (おそらく)音楽をアプリ内で流す際
- Photo Library ... フォトライブラリにアクセスする際
- Reminders ... リマインダーの情報にアクセスする際
- Siri ... Siriを使う際
- Speech Recognition ... 音声認識を使う際
- TV Provider ... AppleTV関連？
- Video Subscriber Account ... この前の発表にあった購入したビデオをAppleTVやAppleTVアプリ間で共有できるというアカウントのことを指しているのかも

## 使い方
info.plistでPrivacyと検索するとこの項目の一覧が出てくるのでアプリで使用しているものを選択し、Valueに説明を追記する。

## 最後に
こちらで名前からの推測が難しく、また確認出来ていないものに関してはおそらくというふうに付けさせていただきました。該当する機能を使っているアプリ開発者の方は注意してください。
virtualenvで作った仮想環境上でpyplotをmacosxのbackendsを使った時にruntime error => venvで環境作成すると良い

## はじめに

仮想環境の作成の際にvirtualenvで作る場合がある。例えば以下の様な感じ。
しかしこのようにして作った仮想環境では `matplotlib.pyplot` 等のmoduleをimportしたときにエラーが出てしまう場合がある。macosxのbackendを使おうとするとエラーになる。

```bash
$ virtualenv --python=`which python3.5` --system-site-packages viz
$ . ./viz/bin/activate
(viz)$ python -c 'import matplotlib.pyplot'
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/matplotlib/pyplot.py", line 114, in <module>
    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/matplotlib/backends/__init__.py", line 32, in pylab_setup
    globals(),locals(),[backend_name],0)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/matplotlib/backends/backend_macosx.py", line 24, in <module>
    from matplotlib.backends import _macosx
RuntimeError: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends. If you are Working with Matplotlib in a virtual enviroment see 'Working with Matplotlib in Virtual environments' in the Matplotlib FAQ
```

## virtualenvではなく`-m venv` を使う

python3.3あたりからpythonの標準ライブラリ自体が仮想環境を実行するための機能を持つようになった。こちらを使って仮想環境を作ると良い。

```bash
$ python -m venv --system-site-packages viz2
$ . ./viz2/bin/activate
(viz2)$ python -c 'import matplotlib.pyplot'
```

## 他のworkaround

PYTHONHOMEを弄る。

```bash
(viz)$ deactivate
$ which python
/opt/local/bin/python
$ . viz/bin/activate
(viz)$ PYTHONHOME=$VIRTUAL_ENV /opt/local/bin/python -c 'import matplotlib.pyplot'
```

## 参考

- [Working with Matplotlib in Virtual environments — Matplotlib 1.5.3 documentation](http://matplotlib.org/faq/virtualenv_faq.html#osx)

## この辺の人の参考になれば

linkを貼れば。link先の記事を見た人にもこの情報が伝わるはず。

- [pyenvとvirtualenvで環境構築した時にmatplotlib.pyplotが使えなかった時の対処法 - Qiita](http://qiita.com/Kodaira_/items/1a3b801c7a5a41c9ce49)
- [Python 3.3でmatplitlibとpylabを使おうとしたら RuntimeError: Python is not installed as a frameworkというエラーが発生したときの解決方法 - Qiita](http://qiita.com/katryo/items/918667f28301fdec89ba)
- [matplotlibのRuntimeError解決 - Qiita](http://qiita.com/mas9612/items/0b482b768e4b5a79ffb2)
- [matplotlibをインストールして実行するまで - Qiita](http://qiita.com/como1559/items/feac9bacbbf362817c66)
- [VirtualEnv環境でmatplotlibなどがimportできない - Qiita](http://qiita.com/nnsnodnb/items/e8fc72ebe851b8c55a90)
- [matplotlibを入れるときにハマったメモ - Qiita](http://qiita.com/ThePekinensis/items/bf61418aca0ec3b94372)
Twitter4Jの140文字制限拡張対応について

# 概要

Twitterの140文字制限拡張について、Twitter4J の修正内容をメモしておく。

参考：
- [Upcoming changes to Tweets | Twitter Developers](https://dev.twitter.com/overview/api/upcoming-changes-to-tweets) 
- [Twitter / Upcoming changes to Tweets の日本語訳 - Qiita](http://qiita.com/takke/items/89704183adcab037bed7)


# Twitter4Jの変更点

ざっと下記の修正をすれば良さそう。

## 閲覧系

- REST Request 拡張モード対応
    - ```tweet_mode=extended``` を指定できるようにする
- ストリーミング・Gnip用パーサ変更
    - 下記パラメータをパースできること。
        - ```extended_tweet```
            - ```full_text```
            - ```display_text_range```
            - ```entities```
            - ```extended_entities```
- 拡張モード用パーサ変更
    - 下記パラメータをパースできること。
        - ```full_text```
        - ```display_text_range```

<!-- 
- ~~```Status.getText()``` を 140 文字制限拡張対応に。~~
    - ```full_text``` があればそれを優先して取得できるように。
    - ```text``` (140文字制限されたもの)が欲しければ新設する ```Status.getTruncatedText()``` を使うように。
    - …と思ったけど、```extended_tweet.entities``` も ```entities``` から取れるようにしないとおかしいからやめておいたほうがいいかな。```ExtendedTweetWrapper.getFullText(status)``` みたいなので透過的に取れるようにする程度が関の山か。
-->

- 実装した⇒ https://github.com/takke/twitter4j/commits/support_extended_tweets
    - 色々迷ったけど ```ExtendedTweet``` のようなオブジェクトや```full_text``` を作らず、```Status.text``` 等にマージする方式で実装した。
    - 一度 ```ExtendedTweet``` オブジェクトや ```full_text``` を作る方式で実装したが、アプリ側の修正が100カ所以上を超えてしまったのでアプリ側のインパクトがほとんどない上記の方式に変更した。
    - 140文字オーバーのtextを与えられたら壊れるアプリはTwitter4Jをアップデートしないでね、という方針で。
    - (2016/12/26追記) Twitter4J 4.0.6 でマージされました。

## 投稿系

- statuses/update 修正
    - 下記パラメータを指定できること。
        - ```auto_populate_reply_metadata```
        - ```exclude_reply_user_ids```
        - ```attachment_url```
- ```attachment_url``` だけ先行実装されたので対応した -> https://github.com/yusuke/twitter4j/pull/248



# 使用例

```java
ConfigurationBuilder builder = new ConfigurationBuilder();

builder.setOAuthConsumerKey(...);
builder.setOAuthConsumerSecret(...);
builder.setOAuthAccessToken(...);
builder.setOAuthAccessTokenSecret(...);

// ここで tweet_mode=extended を指定する
builder.setTweetModeExtended(true);

TwitterFactory factory = new TwitterFactory(builder.build());
Twitter twitter = factory.getInstance();

result = twitter.getHomeTimeline();

// これで full_text も getText() で取得できる
// 表示領域は getDisplayTextRangeStart(), getDisplayTextRangeEnd() で。

```
初めてのiOSアプリ(Objective-C) で HelloWorld!

理由があって、iOSアプリで試したいことがあり、やってみたときのメモ。
なお、言語は Objective-C になります。
ログ及び画面へHelloWorld表示を確認しました。

# 環境

+ XCode 8.0(インストール済み)

# プロジェクトを作成する

とりあえずアプリ用のプロジェクトを作成します。

+ XCodeを開く
+ Create a new XCode project を選択
+ テンプレートではiOS、SingleViewApplicationを選択
+ LanguageでObjective-Cを選択。また適当にProjectNameやOrganization Identifierなどを入力
+ プロジェクトを配置する任意のフォルダを選択

# 動かしてみる

とりあえず動かしてみます。
画面上部の再生ボタンを押すとビルド及びシュミレーターでのアプリの実行が確認できます。

![スクリーンショット 2016-09-17 9.02.11.png](https://qiita-image-store.s3.amazonaws.com/0/20193/9c369fa2-4e3b-09d9-503a-f4557913e0cb.png "スクリーンショット 2016-09-17 9.02.11.png")

真っ白い画面が表示され、無事アプリが起動しました。

# ログを追加してみる

ログを追加してみます。
具体的にはViewController.mファイルのviewDidLoadメソッドにログを追加してみます。（最初から挿入されたコメントを見るとviewがロードされたあとここの処理時が実行されるようです)


```ViewController.m
//
//  ViewController.m
//  SingleViewApp
//


#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSLog(@"Hello World!");
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end

```

これで先ほどと同様に再生ボタンを押してビルド、実行をしてみます。
すると画面下部に以下のようなログが表示され、ログの追加表示が確認できました。

```
2016-09-17 09:08:00.521 SingleViewApp[91870:12108293] Hello World!
```

# 画面に文字を表示する

[iOSアプリ開発初心者に捧ぐ開発環境Xcodeの概要とインストール (4/4)](http://www.atmarkit.co.jp/ait/articles/1211/07/news017_4.html)

上記を参考に以下のコードをviewDidLoadメソッドに追加してみます。


```ViewController.m

    UILabel *label = [[UILabel alloc] init];
    label.text = @"Hello World!";
    [label sizeToFit];
    label.center = self.view.center;
    [self.view addSubview:label];
```

やっていることはだいたいこんな感じかと思われます。
違ってたらすいません。

+ UILabelを宣言
+ lablelのtextプロパティに文字列を指定
+ 挿入した文字列に対して適切なサイズのラベルにする
+ ViewController(self)に設定

無事画面に HelloWorldが表示されました。

![スクリーンショット 2016-09-17 9.28.28.png](https://qiita-image-store.s3.amazonaws.com/0/20193/7db95f8c-50fa-34ec-b38d-1dc18124dedf.png "スクリーンショット 2016-09-17 9.28.28.png")

お疲れ様でした!
デブサミ関西2016


* 2016/09/16(金) ＠神戸国際会議場
* http://event.shoeisha.jp/devsumi/20160916/
* [\#devsumi](https://twitter.com/search?q=%23devsumi)
* [資料まとめ1](http://codezine.jp/article/detail/9675),[資料まとめ2](https://84zume.wordpress.com/2016/09/16/devsumi-kansai-2016-slides/)

## [基調講演] クラウドの発展とデベロッパーの役割について

* クラウドの発展
	* **非機能要件がコーディングできる**
		* 今までは機能要件しかデーでィングできなかった
	* **ITサービスの運営（企画→開発→運用という営み）がスピードアップ**
		* アプリを書くことだけが早くなるのではない

----

* 「仕事の仕方」の違い
	* WF
		* やるべきことを終わるまでやる
	* アジャイル
		* 期限までに今やるべきことをやる

----

* モノリシックシステムの課題
	* 全体のリグレッションテスト
		* **開発スピードが遅くなる**
* MSAの注意点
	* アプリ管理ではなくシステム管理
	* 設計指針ではなく結果論
	* 「MSAで再構築」は「愚」
		* MSAもDevOpsも今すぐに取り掛かれる。すこしずつ取り組んですこしずつ改善していく

----

* クラウド時代のデベロッパー
	* 機能要件だけでなく非機能要件もコーディング可能に
		* アプリとインフラは不可分に
	* システム開発からサービス運営に
		* 企画→開発→運用のあらゆるところでエンジニア能力が求められる
	* 技術そのものだけではなく「技術の使い方」のトレンドを意識する
	* 「何に最適な技術か」を理解する
	* **「ITがビジネスの最重要課題」なら「デベロッパーがビジネス活動の中心」にいるべき**
		* デベロッパーにもビジネススキルが必須
			* コミュ力、プレゼン力、チームビルディング

## 一万人のエンジニアが集うオープンコミュニティから脳のような知能の創造を目指す

全脳アーキテクチャ・イニシアティブ
http://wba-initiative.org/

* 大人のAI
	* 理解できるので設計可能
		* 演繹推論
* 子供のAI
	* 理解できないので学習が必要
		* 帰納推論（機械学習）
		* 一定以上のリソースが必要
* 十分にデータを得られるタスクの範囲内であれば応用価値のある人間並みの性能をもつ帰納推論が可能に
* 特化型AI → 汎用人工知能（AGI: Artificial General Intelligence）
	* 転移学習
		* あるタスクから学んだ知識を他の他のタスクに転用、流用する


## 尼崎から世界へ！モノタロウの海外展開を支えるDevOps基盤

* ベンダー → 内製
	* 時代の変化に素早く対応
	* スピード感
	* 競争優位
* インフラはほぼすべてAWSに置き換えている
	* 海外ECサイトは全部AWS
* 国内ECサイトは週１リリース
	* 定例リリースのデメリット
		* リリース日がくるまでリリースできない → **その機能が生み出す利益の機会損失**

----

* 海外展開
	* 韓国に現地子会社
	* シンガポール、マレーシア、＋５カ国にECサイトを展開
* 目標を達成するための全体最適化
	* そのためのDevOps
* 保守・運用にかける時間を減らす
	* GoogleのBotのアクセス（280万ページ）によりサイトが瞬殺(ﾟдﾟ)!
		* 対策：Auto Scale
* 開発スピードを上げる
	* 「○○さんに聞けば分かる」→ ボトルネック、長老のような人（バッドノウハウに詳しい人）
		* 対策：Docker導入
			* MW、アプリのセットアッププロセスをDockerの中に閉じ込める
			* Docker Machine
			* Amazon ECS、ECR

## ビジネスにおける機械学習の現場

* [CRISP-DM](http://www.itmedia.co.jp/im/articles/0111/20/news001.html)プロセス
* 主題は時間不足で詳しく触れられず

## 生涯エンジニアというマインドを活かしてYahoo!天気アプリを成長させたPM手法

* 第１次 Yahoo! 時代
	* 「内のリソース」の利用が魅力的なサービスづくりの近道
	* 「外の変化」に危機感を感じ始めた

----

* 任天堂 時代
	* 新人として、新たな技術要素の経験
	* Yahoo!時代の経験は大いに活かせた
	* 自信（＝生涯エンジニアとして生きたい自分への）がついた

----

* 第２次 Yahoo! 時代
	* 天気アプリのPM
	* 動機づけ
		* 天気には興味がなかったが...
		* ユーザに役立つ「道具（ツール）」をつくる
	* 作品作りの軸を決める
		* 目標（将来悩んだときに立ち戻れるポイント）が定まる
	* 「作品」という表現へのこだわり
		* エンジニア＝職人であれ
	* あくまで提供者が自信を持って作品をつくるべき
		* 自信と責任
	* プロジェクトチーム
		* 面で捉える
			* メンバのスキルに応じて担当領域
			* PM → スキマの領域を見つけフォローする

## SIerの中で技術を大切にする生き方とその舞台裏

* マネージャーか技術者か
	* 指示する人ではなく、（作業して）「何とかする人」でありたかった
	* 「指示されて作る」から脱却しないといけない
	* 自分の存在が必要不可欠（キーマン）であると認識させる
	* 管理するよりもコードを書いて欲しいと思われる存在にならなければならない
	* 「みんなが書けるPGを自分も書ける」では勝負にならない
	* 技術者は説明責任を果たさなければいけない局面がかならずある
		* コミュ力、プレゼン力、リーダーシップ
* アプリケーションか？基盤か？
	* エンタープライズのPJでは業務を知っている人のほうが評価が高い
		* プログラムから業務を知る
		* データモデルから業務を知る
* 自分の影響力が最大限になるような仕事のほうが楽しいし、やりがいがある
* 成功に対して、自分の技術を最大限に貢献できる方法は？
* 報酬と責任はセットである
* どうありたいか？を明確にする
* 居場所を作る
	* 課題×得意な技術（＝ニーズ×やりたいこと）
* 仕事が難しくないと
	* 成果に差がつかない
	* 達成感が得られない
* やりたいことができるように
	* できる場所に行く
	* できるように今いる場所を変える
* 仕事で失敗すると自分が許せない
	* これでいいやと思うようになったら、終わり
matplotlibのbackendの設定を環境変数で渡す方法

通常matplotlibのbackendの設定は `~/.matplotlib/matplitlibrc` に書く。例えば以下の様に。

```
backend: MacOSX
# backend: WebAgg
```

これを実行時に変えたい場合には `MPLBACKEND` という環境変数に値を入れてあげれば良い。

```
MPLBACKEND=WebAgg python <script>
```

## 参考

- [Environment Variables — Matplotlib 1.5.3 documentation](http://matplotlib.org/faq/environment_variables_faq.html#envvar-MPLBACKEND)
- [Usage — Matplotlib 1.5.3 documentation](http://matplotlib.org/faq/usage_faq.html#what-is-a-backend)
SSLを理解したい


参考）https://jp.globalsign.com/knowledge/ca.html

以下まとめです。

#○認証局CA(Certification Authority)の仕事

###・電子証明書を発行する(クライアント証明書など)
###・登記事項証明書や印鑑登録証明書を用いて申請元の企業が実在しているかを確認
###・失効依頼による証明書失効
　秘密鍵が失われた場合、電子証明書の記載事項が変更された場合に失効になる
　CRL(Certificate Revocation List)の配布
　　→認証局が失効させた電子証明書のリスト Revocationは取り消しの意

　OCSP(Online Certificate Status Protocol)による問い合わせへ応答
　　→電子証明書の失効問い合わせのためのプロトコル

##認証局の構成
　→ 登録局(Registration Authority) 所有者情報を審査する機関
　→ 発行局（Issuing Authority）電子証明書の発行や失効を行う機関
　→ リポジトリ（Repository）認証局に関する情報や電子証明書の有効性に関する情報を提供
 リポジトリからルート証明書や中間CA証明書、CRLをダウンロードする。

	1. 電子証明書の発行を依頼
	2. 本人確認
	3. リポジトリ登録
	4. 電子証明書を発行

##認証局の種類
###・パブリック認証局（グローバルサイン）
　　ルート証明書(電子証明書)は、一般的なウェブブラウザやメールソフトにあらかじめ組み込まれており、ルート証明書の配布やインストールが不要なため、取引先など外部とのやり取りに電子証明書を利用する場合に煩雑な設定が必要なく便利です。

###・プライベート認証局
　　独自の運用基準を設けたもの。ルート証明書の配布や設定などに手間が掛かりますが、運用規程を自由に設定できるため、社内だけなど、限られたネットワークで電子証明書を利用する場合は、プライベート認証局を設立し電子証明書を発行する方が便利です。