OmniAICreator/Qiita-1.07M huggingface dataset:
【Julia】Plots.jl+バックエンドPyPlotで描くグラフに日本語を表示させる方法【25.02.05更新】

**【25.02.05更新】Julia v1.11.3で動作する内容に改めました（対処のための特別なコードが廃止されており、対処はより単純になっていました）。デッドリンクを修正しました。**
**【注意】Windows環境を前提とした説明です。**

# Plots.jl+バックエンドPyPlotで描くグラフに日本語を表示させる方法

## はじめに

以下の参考1の解説に従ってfontを指定すれば、難なく日本語を表示できる場合もありますが、上手くいかない場合に遭遇することもあるかと思います。ここに上手くいかない場合の対処法をメモとして残しておきます。
【参考1】[Plotsの公式解説](http://docs.juliaplots.org/latest/attributes/)

## 上手くいかない場合の対処法

①使用したいフォントファイル（**おそらくTTFでないと動作しない**）を用意する。
※ここでは[IPAexフォント](https://moji.or.jp/ipafont/)をダウンロードしてOSに追加したとして話を進めます。

②matlibplotのfontlistを更新する。
ディレクトリ`C:\Users\某文字列\.matplotlib`に行き、`fontlist-v某数字.json`を消します。
※消すことで、次回のmatlibplot動作時、OSに追加されている最新のフォントが認識され、matlibplotが使用できるフォントの情報である`fontlist-v某数字.json`が書き改められます。

## 動作テスト
[前記事](http://qiita.com/nyoi/items/63679a883d9c7f91c13a)の【例1】と【例2】に日本語を付けて表示させた場合を以下に示します。

【例1日本語付】1つのグラフエリアに曲線を2つ描画

```Julia:Julia
using Plots
import Plots.PlotMeasures.px  #pxを単位のように使用するための準備（Plotsのバージョンアップに伴ってpxはimportやusingしておく必要が出た）
pyplot()
x=collect(0:0.01:2*pi)
y1=sin.(x)
y2=cos.(x)

plot(x, y1, xlab="横軸 x [mm]",
            ylab="縦軸 y [mm]",
            lab="正弦",
            leg=:bottomleft,
            margin=15px,
            guidefont=font("IPAexGothic",11),  #軸名のフォントとサイズの指定（サイズ指定もしないとサイズ14に固定されてしまう）
            legendfont=font("IPAexGothic",8),  #凡例のフォントとサイズの指定
            tickfont=font("IPAexGothic",8))    #目盛のフォントとサイズの指定（他とフォント揃えるためにだけ指定）
plot!(x, y2, lab="余弦")
```

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167369/d0f17020-78e3-0559-bda6-8d383b15194d.png)


【例2日本語付】上下2段組のグラフエリアを作成し、それぞれに曲線を1つ描画

```Julia:Julia
using Plots
import Plots.PlotMeasures.px
pyplot()
x=collect(0:0.01:2*pi)
y1=sin.(x)
y2=cos.(x)
p1=plot(x, y1, lab="正弦");
p2=plot(x, y2, lab="余弦");
plot(p1, p2, xlab="横軸 x [mm]",
            ylab="縦軸 y [mm]",
            leg=:bottomleft,
            margin=15px,
            layout=grid(2,1),
            guidefont=font("IPAexGothic",11),  #軸名のフォントとサイズの指定（サイズ指定もしないとサイズ14に固定されてしまう）
            legendfont=font("IPAexGothic",8),  #凡例のフォントとサイズの指定
            tickfont=font("IPAexGothic",8))    #目盛のフォントとサイズの指定（他とフォント揃えるためにだけ指定）)
```

![Figure_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167369/ffe0002e-b715-a039-c304-584305153f4a.png)
findした結果をまとめてjqコマンドで処理する

カレントディレクトリ以下のJSONファイルに対して、まとめて `jq` コマンドを適用するには次のようにします。 

```bash
find . -name "*.json" -exec sh -c "jq < {}" \;
```

例えばこんなフォーマットのJSONファイルからstringだけを抜き出したいときは、

```json
[{"string": "abc", "number": 123}, {"string": "def", "number": 456}]
```

次のようにしてフィルタを適用します。

```bash
find . -name "*.json" -exec sh -c "jq '.[].string' < {}" \;
```

このように、 `find` コマンドの `-exec` と `sh -c` との組み合わせは、 `find` の結果を別なコマンドの標準入力にリダイレクトしたいときに使えます。
AWS S3で指定prefixのファイルをすべて削除するコード(Java)

業務でそんな感じの要件が出たので実装してみました。

1,2行で書けると思ったら案外面倒だった・・・
ライブラリはGuavaとlombokを使ってます。(残念ながら職場はJava7なのです）
もっといい方法がありそうな気がするけどとりあえず動いたのでメモ
# コード
```java:S3ObjectDelete.java
@RequiredArgsConstructor
public class S3ObjectDelete {
    private AmazonS3Client client = new AmazonS3Client();

    private final String bucket;

    public static void main(String[] args) {
        val hoge = new S3ObjectDelete("バケット名");
        hoge.delete("プレフィックス");
    }

    public void delete(String prefix) {
        // 同時に削除できる件数の上限が1000らしいので分割して処理
        for (val keys : Lists.partition(keys(prefix), 1000)) {
            String[] array = keys.toArray(new String[keys.size()]);
            client.deleteObjects(new DeleteObjectsRequest(bucket).withKeys(array));
        }
    }

    List<String> keys(String prefix) {
        ObjectListing objects = client.listObjects(bucket, prefix);
        val f = new S3Object2StringKey();
        List<String> keys = new ArrayList<>(Lists.transform(objects.getObjectSummaries(), f));

        // 一度に取得できる件数のデフォルトが1000件らしいのでループしてすべて取得
        while (objects.isTruncated()) {
            objects = client.listNextBatchOfObjects(objects);
            keys.addAll(Lists.transform(objects.getObjectSummaries(), f));
        }
        return keys;
    }
}

public static class S3Object2StringKey implements Function<S3ObjectSummary, String> {
    @Override
    public String apply(S3ObjectSummary input) {
        return input.getKey();
    }
}
```


# 追記
**AmazonS3Client**は非推奨となり
AmazonS3ClientBuilderを使うことを推奨しているようです
[この記事](http://qiita.com/hmatsu47/items/496a8a49c4bb089f3749)などが参考になりました
REST: ログアウトAPIのメソッドはPOST？

REST APIの設計について、ログアウトAPIのHTTPメソッドについて社内で議論があったので、メモしておきます。

ログアウトといっても連携サービス(OpenID Connectなど)からのログアウトなど、サーバサイドでのユーザ属性の変化など、データ変更を伴うものではなく、単なるセッション切り替えの話です。

# 結論: 方針

方針としては以下のように決めていくのがいいかと思います。

- APIが存在しないべき:
  - RESTfulならそもそもセッションのステートはサーバが持っていないはずなので、ログアウトAPI自体が存在しないべき.  
  - サーバサイドでDB変更などの処理を行っていないため、クライアントでtoken/sessionの破棄を行えば事足りるはず。
- DELETE:
  - TokenのrevokeならDELETEだろう.
  - 名前やエンドポイントがlogoutとかでも意味的にはtoken revokeならDELETEがRESTfulか.
- POST:
  - RESTにこだわらず、ブラウザのprefetch等で勝手にログアウトされることを恐れるならPOSTにすべき.
  - RESTfulではなくなるし、場合によってはAPI一貫性は捨てることになるかもしれない.
  - サーバ側の設計思想というよりもクライアントの仕様を吸収するためのワークアラウンドとしての対応になる.
- GET:
  - クライアントサイドからクッキー削除するだけなら、サーバサイドの変更がないクライアントのログアウト状態取得APIと割り切ってGETにするのも良い.
  - REST APIと言えなくもなさそう.
  - linkタグに埋め込むケースなど、frameworkによってはブラウザのpre-fetchを誘発してしまう可能性がある.  
  - （コメントより）CSRF攻撃を受ける可能性がある。
     - 今回の例のようにサーバ側にロジックがなく、レスポンスもブラウザが受け取れなければ特に副作用がない。
     - サーバ側にロジックがある場合は問題。

## 現状
POSTを採用する、という意見が有力です。

ツールAPIと割り切ってRESTっぽさを残してGET APIにするのも割と好きですが、社内では反論があり、pre-fetchの実害も可能性としてあるため、POSTにしよう、という話になっています。

そもそもそれほどRESTfulにAPIを設計できていないので、RESTらしさを求めるよりも実用性やわかりやすさを重視する方がいいですね。
この辺の妥協というか折衷は重要になるでしょう。

## 感想
もうぐちゃぐちゃですが、RESTfulの正解、って本当はあまりないのかもしれませんね。
tokenでの認証をベースにしていればDELETEを採用するのが僕は好きです。
(これをきっかけにtokenベースの認証に切り替えたくもあります)

こういう議論は正解がない(or正解では実現が難しい,冗長になりすぎる,わかりづらい,支持を得ない)ことで好き嫌いの問題や実環境の都合になりがちですが、API設計のコンセンサスをとって、選択していけるといいですね。

# 参考
stackoverflowの議論を中心に。

- DELETE派  
sessionidやtokenを削除する、という意味でDELETEがRESTfulとされています
  - [HTTP RESTful Webservice Logout: Which is correct or better practice - POST or DELETE?](http://stackoverflow.com/questions/40245154/http-restful-webservice-logout-which-is-correct-or-better-practice-post-or-de)  
  2016/10/25の回答
- POST派  
pre-fetchの弊害を避けるという理由だけでもPOSTを支持するには十分そうです.
  - [Logout: GET or POST?](http://stackoverflow.com/questions/3521290/logout-get-or-post/14587231#14587231)  
  2013/1/29の回答
  - [HTTP Verbs](https://blog.lunchbunch.me/http-verbs)  
  2016/2/25の記事
- GET派  
メソッドの副作用や冪等性からGETが支持されています.
  - [RESTfully design /login or /register resources?](http://stackoverflow.com/questions/7140074/restfully-design-login-or-register-resources)  
  2011/8/30の回答
- その他参考
  - [ログアウトはGETではなくPOSTで処理するべきか。](http://qiita.com/fatrow/items/13945eb56d73f4bafe80)  
  2012/3/16更新の記事  
  コメント欄でユーザが手軽にリクエストできる、という意味でGETが支持されたりもしてますね。
Atom Nuclide で Flow 型チェックが動作しないときのチェック項目

# この記事は以下の症状に効能があります

* "flow waiting for Diagnostics" が終わらない
* Diagnostics になにも表示されない
* flow のエラーがでない

# チェック項目
* そのファイルは flow が有効になっているか？
    * `// @flow` 書いている OR 全体に有効にしている
* 各 flow のバージョン設定は統一されているか？
    * .flowconfig package.json

```:.flowconfig
[version]
^0.41.0
```

```package.json
{
  ...
  "devDependencies": {
    ...
    "flow-bin": "^0.41.0"
  }
}
```

# その他試すべきこと

* **flow に関する設定の後、Atom エディタの再起動や、ファイルを開きなおす(重要)**
* flow プロセスを kill 再起動
* Atom menu > Nuclide > Flow > Restart Flow Server

![Fullscreen_2017_03_09_12_43.png](https://qiita-image-store.s3.amazonaws.com/0/40717/4726d4a8-97e5-9aa5-7db8-70b1ee7dcdb8.png)
Firebase 入門 - リアルタイムデータベースを使ってみる

Firebaseのリアルタイムデータベースを使う手順をまとめてみました。

#Realtime Database
Firebase Realtime Database はクラウドでホスティングされるデータベースです。
今回は簡単なメッセージアプリを作ってみることにします。

1. ブラウザで firebase console を開く<br> https://console.firebase.google.com/?hl=ja
1. "ウェブアプリに Firebase を追加"を選択して表示される jaavascript を index.htmlに追加する<br> ![スクリーンショット 2017-03-02 13.58.25.png](https://qiita-image-store.s3.amazonaws.com/0/100147/c89505a3-f062-a1d7-1d76-b24b59cba435.png)

    ```
<script src="https://www.gstatic.com/firebasejs/live/3.0/firebase.js"></script>
<script>
  // Initialize Firebase
  var config = {
    apiKey: "あなたのAPIキー",
    authDomain: "myfirstfirebase(的な名前).firebaseapp.com",
    databaseURL: "https://myfirstfirebase-(的な名前).firebaseio.com",
    storageBucket: "myfirstfirebase-(的な名前).appspot.com",
  };
  firebase.initializeApp(config);
</script>
    ```
1. リアルタイムデータベースを使うスクリプトを index.html に組み込む

    ```
    <script>
      var db = firebase.database();
      var chatAll = db.ref("/chat/all");
      //DB内容が変更されたとき実行される
      chatAll.on("value", function(snapshot) {
        document.getElementById("textMessage").innerText = snapshot.val().message;
      });
      //入力内容を更新した時
      var changeData = function(){
        var message = document.getElementById("message").value;
        chatAll.set({message:message});
      }
      //htmlロードが完了したらボタンにイベントを設定
      window.onload = function() {
       document.getElementById("btnChangeData").onclick = changeData;
      };
</script>
<body>
  <p>リアルタイムデータベース</p>
  <ul>
    <li id="textMessage"></li>
    <li><input type="text" name="" id="message"></li>
    <li><input type="button" value="更新" id="btnChangeData"></li>
  </ul>
</body>
    ```
1. コンソールで リアルタイムデータベース セキュリティ ルールを変更する<br>
![スクリーンショット 2017-03-02 14.26.33.png](https://qiita-image-store.s3.amazonaws.com/0/100147/5b276730-0e18-ca78-7b2c-ba6d557aaae6.png)
認証不要に書き換えてみる。
`{"rules":{".read":"true",".write":"true"}}`

1. ローカル環境で実行して内容を確認してみる <br> `firebase serve` <br> 表示される URLをブラウザで開く<br> http://localhost:5000

1. 上手く動いたらURLを別ブラウザなどで2画面開いて<br>更新が同期されるか確認してみる。<br>
![スクリーンショット 2017-03-02 14.33.25.png](https://qiita-image-store.s3.amazonaws.com/0/100147/26643059-38b5-676f-5142-50da814f4616.png)

1. デプロイを実行する <br>`firebase deploy --only hosting`<br>`--only hosting`で一部デプロイ。--only パラメータで指定出来るのは `hosting`、`database`、`storage` この3種類。
1. デプロイ成功したら ブラウザで開いてみる. <br>`firebase open hosting:site` 

非常に簡単に リアルタイム同期の処理を書くことができました。
iOSやAndroidでも簡単に利用できるようなので、後日ためしてみたいと思っています。

# 参考
[Firebase Realtime Database](https://firebase.google.com/docs/database/)
[Firebase の Realtime Database を使ってみる。Swift版](http://qiita.com/tfutada/items/12ec90ef8fa1b9f871ec)
オンプレからDirectConnectを経由してAWSの名前解決をする方法

# 目次
- 実現したいこと
- 問題
- 解決策
- 構築手順

# 実現したいこと
- オンプレ環境からDirectConnect経由でELBにアクセスしたい

# 問題点
- ELBのIPアドレスは動的に変わるため、ドメインでアクセスしなければいけない
- しかし、DirectConnect先の環境からはAWS内のPrivate DNSを参照することはできない

# 解決策
- Directory ServiceでDNSフォワーダーを構築する
![スクリーンショット 2017-03-09 12.45.03.png](https://qiita-image-store.s3.amazonaws.com/0/140253/526da53b-2115-badc-8913-d4a1f03d4362.png)


# 構築手順

### Directory Service 設定
1. "Directory Service" を選択
2. "Directory Type" から "Simple AD" を選択
3. Directory と VPC の設定情報を入力し、Simple AD を作成

### セキュリティグループの設定
1. Simpel AD を作成すると、セキュリティグループが自動生成される
2. DirectConnect 先から Simple AD へのルールを追加する

### Route53の設定
1. "Private Hosted Zone for Amazon VPC" を選択し、Hosted Zone を作成
2. "Name" に実際に利用したいドメイン、"Value" にDirectConnect経由でアクセスさせたいELBのドメインを設定し、レコード作成

### オンプレ側の設定
1. オンプレサーバに Simple AD のアドレスをDNSとして設定
Windowsでもシンボリックリンク扱えるようにようする



# ダウンロード
http://schinagl.priv.at/nt/hardlinkshellext/linkshellextension.html#contact
![2017-03-09_103327.png](https://qiita-image-store.s3.amazonaws.com/0/47172/5acaa82c-ca79-cbf7-30fa-60cf17fd518d.png)

# インストール

![2017-03-09_103426.png](https://qiita-image-store.s3.amazonaws.com/0/47172/dab841bc-e5bf-d0e6-9443-4450906f323e.png)

![2017-03-09_103443.png](https://qiita-image-store.s3.amazonaws.com/0/47172/d29be829-4e93-c83a-d6d4-838879b795a1.png)


# 使い方

![2017-03-09_103652.png](https://qiita-image-store.s3.amazonaws.com/0/47172/b732296f-73ce-4e50-3a6a-4413bff8bcf1.png)

![2017-03-09_103808.png](https://qiita-image-store.s3.amazonaws.com/0/47172/ca37efdc-28a6-3039-7cff-debc62820cb0.png)
NLogからFluentdのノードへログを送る方法

Windowsのログの集約で困っておりまして、NLogを用いてFluentdのノードへ送ることが出来たので
そのメモ書きです

NuGetで下記の2つをインストールします

NLog: https://www.nuget.org/packages/NLog
NLog.Targets.Fluentd: https://www.nuget.org/packages/NLog.Targets.Fluentd/

Fluentdのノードへログを送るための設定は、 NLog.configからは指定できないっぽいので、
プログラマブルに指定する必要があります

```
public class Configurator
{
    // Fluentdの設定を返します
    static NLog.Targets.Target GetFluentdTarget()
    {
        var target = new NLog.Targets.Fluentd();
        target.Layout = new NLog.Layouts.SimpleLayout("${message}");
        target.Host = "１２７．０．０．１"; // TODO:環境に合わせる必要あり
        target.Port = 24224; // TODO:環境に合わせる必要あり
        target.Tag = "tag.tag"; // TODO:環境に合わせる必要あり
        target.NoDelay = true;
        target.LingerEnabled = false;
        target.LingerTime = 2;
        target.EmitStackTraceWhenAvailable = false;
        return WrapTarget(target);
    }

    // Fluentdの設定だけだと同期的にログを送信してしまうので非同期＆リトライの設定を行います
    static NLog.Targets.Target WrapTarget(NLog.Targets.Target target)
    {
        var retryWrapper = new NLog.Targets.Wrappers.RetryingTargetWrapper("RetryingWrapper", target, 3, 1000);
        var asyncWrapper = new NLog.Targets.Wrappers.AsyncTargetWrapper("AsyncWrapper", retryWrapper);
        return asyncWrapper;
    }

    public static NLog.Config.LoggingConfiguration GetConfig()
    {
        var config = new NLog.Config.LoggingConfiguration();
        var target = GetFluentdTarget();
        config.AddTarget("fluentd", target);
        config.LoggingRules.Add(new NLog.Config.LoggingRule("*", LogLevel.Debug, target));
        return config;
    }
}

// Global.asax.cs(アプリケーションの初期化時に設定します)
public class Global : HttpApplication
{
	protected void Application_Start()
	{
		// Fluentdの設定を行ったConfigを設定する
		LogManager.Configuration = LogConfigurator.GetConfig();
	}
}

```

今回はこの方法で設定しましたが、ロガーをWrapしたりする方法も良さそうな気がします
Unity C#で暗号化・復号化　メモ

良く忘れるのでメモ

```
using System;
using System.Text;
using System.Security.Cryptography;

namespace Musashi.WebApi_v1.Utility
{
    /// <summary>
    /// 暗号化・複合化を行う
    /// </summary>
    public static class Crypt
    {
        private static AesCryptoServiceProvider GetCryptInstance()
        {
            // AES暗号化サービスプロバイダ
            AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
            aes.BlockSize = 128;
            aes.KeySize = 256;
            aes.IV = Encoding.UTF8.GetBytes(任意の文字列);
            aes.Key = Encoding.UTF8.GetBytes(任意の文字列);
            aes.Mode = CipherMode.CBC;
            aes.Padding = PaddingMode.PKCS7;

            return aes;
        }

        // ラムダ式にしてみる
        public static byte[] CryptProcess(byte[] src, bool isEncrypt)
        {
            // AES暗号化サービスプロバイダ
            AesCryptoServiceProvider aes = GetCryptInstance();

            byte[] isOK = ((Func<byte[]>)(() => {using (ICryptoTransform encrypt = aes.CreateEncryptor()){return encrypt.TransformFinalBlock(src, 0, src.Length);}}))();

            // フラグによって暗号、復号の処理を分ける。
            return isEncrypt == true ?
                ((Func<byte[]>)(() => { using (ICryptoTransform encrypt = aes.CreateEncryptor()) { return encrypt.TransformFinalBlock(src, 0, src.Length); } }))() 
                :
                ((Func<byte[]>)(() => { using (ICryptoTransform decrypt = aes.CreateDecryptor()) { return decrypt.TransformFinalBlock(src, 0, src.Length); } }))();
        }


        /// <summary>
        /// AESで暗号化
        /// </summary>
        public static byte[] Encrypt(byte[] src)
        {
            // AES暗号化サービスプロバイダ
            AesCryptoServiceProvider aes = GetCryptInstance();

            // 暗号化する
            using (ICryptoTransform encrypt = aes.CreateEncryptor())
            {
                return encrypt.TransformFinalBlock(src, 0, src.Length);
            }
        }

        /// <summary>
        /// 文字列をAESで復号化
        /// </summary>
        public static byte[] Decrypt(byte[] src)
        {
            // AES暗号化サービスプロバイダ
            AesCryptoServiceProvider aes = GetCryptInstance();

            // 複号化する
            using (ICryptoTransform decrypt = aes.CreateDecryptor())
            {
                return decrypt.TransformFinalBlock(src, 0, src.Length);
            }
        }
    }
}
```

参考URL
https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.aescryptoserviceprovider(v=vs.110).aspx
http://dalmore.blog7.fc2.com/blog-entry-37.html
http://programmers.high-way.info/cs/aes.html
http://qiita.com/hibara/items/c9096376b1d7b5c8e2ae


テスト
http://csrc.nist.gov/groups/STM/cavp/index.html

規格
https://www.ipa.go.jp/security/rfc/RFC3602JA.html
git push できない

#The requested URL returned error: 403
git pushをしたら次のようなエラーでえらく困ったのでメモ書き

<code>
fatal: unable to access 'リポジトリURL': The requested URL returned error: 403

どうやら
別のgithubアカウントのログイン情報（キーチェーンアクセス）が残っているための模様。

<code>git credential fill</code>
で確認するとキャッシュされているIDとPWが表示される。

<code>git credential reject</code>
で綺麗にすると解決しました。

複数アカウントを使うときは注意したい。

参考にさせてもらいました。ありがたやありがたや
http://qiita.com/0koara0/items/f41a3d5b58ff9038229c
http://ja.stackoverflow.com/questions/23475/githubへgit-pushしようとすると403エラーとなる
Cisco IOS EEMを使ったTclスクリプトの実行

##EEM（Embedded Event Manager）
シスコルータやスイッチで動作するIOSでは、事前定義した任意のイベント検出に基いてコマンド実行やSyslog送信といったアクションを実行する機能があります。イベントは、タイマーや装置内部でのSNMPポーリングといった周期的なものや、起動後に一回だけ、Syslogの正規表現によるマッチ、フローのカウンタの閾値やデルタ、任意のIPアドレスへのリンクダウン検出、など様々な定義が可能です。

アクションまで含めてIOS CLIで設定可能ですが、EEMロジックの定義として、Tcl（Tool Command Language）が古くからサポートされており、今後は全面的にPythonもサポートされてきます。Tclは、良くも悪くも「枯れきって」いるため、「困ったときのEEM/Tcl頼み」といった感じで、裏方では日本国内でも利用実績が豊富にあります。

##やってみる
もっとも簡単なスクリプトを作成し、IOS上で動作させてみます。

Tclスクリプトを作成します。エディターは（もちろん）何でも結構です。

```tcl:test.tcl
::cisco::eem::event_register_none

namespace import ::cisco::eem::*
namespace import ::cisco::lib::*

action_syslog msg "Hello Tcl from Syslog!"
puts "Hello Tcl!"
```

一行名はイベントの定義、ここではNONE（イベントなし）とし、テスト用に手動で実行とします。Tcl標準コマンドに加えて、シスコIOSがサポートするコマンド（syslog、CLI、ルータからメール送信、SNMPポーリングなどなど）を使えるようにnamespaceをimportしておきます。ほぼ、決め打ちだと思います。

作成後、ルータやスイッチに転送します。（copyコマンドや、USBフラッシュで物理的に..など。）

ルータ上でTclファイルが確認できます。

```cisco:IOS
C4331-02#sh bootflash: | i .tcl
 30        168 Mar 09 2017 01:44:45 +00:00 /bootflash/test.tcl
```

EEM用のTclスクリプトのPathを設定し、先ほど転送したtest.tclを登録します。以上で終了です。

```cisco:IOS
C4331-02#conf t
C4331-02(config)#event manager directory user policy "bootflash:/"
C4331-02(config)#event manager policy test.tcl type user
C4331-02(config)#end
C4331-02#
```

さて、イベントを発行（NONEイベントを手動で実行）してみましょう！

```cisco:IOS
C4331-02#event manager run test.tcl
Hello Tcl!

C4331-02#
Mar  9 02:02:18.369: %HA_EM-6-LOG: test.tcl: Hello Tcl from Syslog!
C4331-02#
```

putsと、syslogによるコンソール出力の二つが確認できました。実行させるだけなら、とても簡単ですが、スクリプトを工夫すれば（メーカーが機能として提供していないものも含めて）ものすごく高度なロジックが実装できます。

※アクセススイッチからコアルータまで、サポート範囲も広く、ライセンス料もかかりません。
jquery で textarea リサイズ

自動でテキストエリアリサイズしたい。

以下を jquery.autogrow.min.js で保存


```


"use strict";!function(a){function b(b,f){if("TEXTAREA"===b.tagName){var g=a(b),h=a("<div></div>");h.addClass(e),void 0!==f.id&&h.attr("id",0==index?f.id:f.id+"-"+index),void 0!==f.classes&&h.addClass(f.classes),g.addClass(d).on("input keyup",function(a){var b=g.val();b&&"\n"!=b.charAt(b.length-1)||(b+=" "),b=b.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/'/g,"&#39;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/ /g,"&nbsp;").replace(/\n/g,"<br/>"),h.html(b),g.height(h.height())}).off(c+".resize").on(c+".resize",function(){h.css({border:g.css("border"),"font-family":g.css("font-family"),"font-size":g.css("font-size"),"font-weight":g.css("font-weight"),"letter-spacing":g.css("letter-spacing"),"line-height":g.css("line-height"),padding:g.css("padding"),position:"absolute",visibility:"hidden","white-space":"normal",width:g.css("width"),"word-break":"break-word","z-index":-1,zoom:g.css("zoom")})}).trigger(c+".resize").after(h)}}var c="autogrow",d=c+"-field",e=c+"-mirror";a.fn[c]=function(c,d){var e=this,f=this.context;return void 0===d&&(d=c instanceof Object?c:{}),"string"!=typeof c&&(c=null),c&&(e=a(c,f),a(document).on("DOMNodeInserted",function(e){var g=e.target;a(g,f).is(c)&&b(g,d)})),e.each(function(a,c){b(c,d)}),this}}(jQuery);


```

で適当に読み出す。

```
$(textarea).autogrow();
```

で自動的にテキストエリアが伸びる。

最初からテキストを入れてある場合は、

```
$(textarea).trigger('keyup');
```

とすれば最初に入っているテキストエリアの高さに自動調整される。
.htaccessのいろいろ

前提条件:
サイトrootに .htaccessファイルを作成　**＊権限注意**
まだ、
.httpdにて編集したいDirectoryにて
AllowOverrideをAllにする　**＊必要に応じてAllは他のもっと細かい設定にできる**

## HTTPをHTTPSにリダイレクトする
```apacheconf
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
```

## URLの後ろにindex.*を消す

```apacheconf
RewriteCond %{THE_REQUEST} ^.*/index.html
RewriteRule ^(.*)index.html$ https://<domain>.com/$1 [R=301,L]
```
Windows Subsystem for Linux(WSL bash) をまだ使わない方がいい３つの理由(+1)

# Windows 版 node / nodist
フロントエンドの開発を行う際に、最早必須とも言える node ですが Windows 環境にインストールすると微妙に動かなかったりするものが混じっていますが、mac の人に質問しても「知らない」とスルーされて辛かったりします。

Windows 上のエディタで開発してブラウザで確認、bash 側で node環境（ビルド、開発用サーバ起動）という環境にすれば、Windows のまま快適な開発ライフを送れると思ったのですが、2017/03/09 時点で壊滅的に日常使い出来ない点と、フロントエンド開発に使えない点がありましたので、お伝えしたいと思います。

# (理由その1) mv コマンドでフリーズする！
Windows 上のファイルは、bash では、/mnt/c/ 以下にマウントされます。
大変分かりやすく見やすいのですが、/mnt/c/Users/ 以下のフォルダで、mv コマンドを使用するとフリーズします。

フリーズするサンプル

```
$cd /mnt/c/Users/<ユーザ名>/
$mkdir test1
$mkdir test2
$mv test1 test2
```

mvコマンドでフリーズすると、Windows を再起動するまで bash は使用できなくなります。
※ c:\ 直下にファイルを置けば回避できるようではあります。

参考：
[Bash.exe hangs and the bash is unusable](https://github.com/Microsoft/BashOnWindows/issues/703)

# (理由その2) fs.watch が動かない
Windows 側で保存したファイルを、bash 側が変更を監視してビルド…が、できません。

参考：
[fs.watch not work in win10 Bash.](https://github.com/nodejs/node/issues/7496)

# (理由その3) Windows 側から bash 側のネットワークが見えない
bash 側で開発サーバを立ててライブリロード…が、できません。一応ワークアラウンドはあるようですが…WSL対応のために何かするのも少し悩ましいところです。

参考：
[Node http-server not working on Windows 10 Ubuntu Bash](http://stackoverflow.com/questions/37497914/node-http-server-not-working-on-windows-10-ubuntu-bash)

# (おまけ) 日本語が文字化けする
MS-DOSプロンプトがUnicodeに対応していません。コードページ切り替えでなんとなく表示されるようになりますが、それでも表示が崩れたりと実用レベルにはなっていないという印象です。PowerShellから起動しても、細かくうまく動かない感じでした。（あまり試してませんが）

ただ、こちらについては、Visual Studio Code のターミナルを利用すれば、今のところ不具合なく使えてますので、理由からは除外したいと思います。むしろ Visual Studio Code は軽くて快適なので積極的に使いたい感じです。

VSCode のterminal を ファイル→基本設定→設定で、settings.json を開いて、PowerShell から bash に変更。

```
settings.json

"terminal.integrated.shell.windows": "C:\\WINDOWS\\Sysnative\\bash.exe",
```


とは言え、ちょっとした用途には便利に使ってたりしますので、上記についても、いや、実はできるよ！最近のリリースで対応されたよ！というのがありましたらコメント頂けると助かります。
has_manyで関連づけられたクラスでメソッドを使う

基本的なことかもしれないけど、知らなかったのでメモ

# 環境

```
ruby 2.3.0
rails 4.2.6
```

# やり方

例として下記のようなModelがあり
Projectに所属するMemberの名前が配列で欲しいとする場合

```ruby
class Project < ActiveRecord::Base
  has_many :members
end

class Member < ActiveRecord::Base
  def self.names
    # relationを使うとhas_manyで関連づけられたデータが取れる
    relation.map(&:name)
  end
end
```

すると下記のように取れる

```ruby
@project.members.names
```

ただ、下記のようにするとrelationが無いのでエラーが発生する。

```ruby
Member.names
```
Android 4.4より前のバージョン メモ

#■グラデーション
古いAndroidで背景の指定はベンダープレフィックスが必要4.4〜からは要らない（-webkit-）

```
a {
    &.cartBtn {
        background: -webkit-linear-gradient(#fdb80d, #f87101);
        background: linear-gradient(#fdb80d, #f87101);
　　　　 border: 1px solid #feae10;
    }
    &.teikiBtn {
        background: -webkit-linear-gradient(#0faf04, #0c7f03);
        background: linear-gradient(#0faf04, #0c7f03);
        border: 1px solid #0fa403;
    }
    &.active {
        background: -webkit-linear-gradient(#0dc0e3,#04a7e4);
        background: linear-gradient(#0dc0e3,#04a7e4);
        border: 1px solid #04a7e4;
    }
}

```
[Ubuntu 14.04][Unity] ワークスペースの縦/横の個数の変更

デフォルトのワークスペースの数(2x2)から変更したい場合の方法メモ

# CompizConfig設定マネージャのインストール

```bash:ccsmのインストール
$ sudo apt-get install compizconfig-settings-manager
```

# (方法1) gsettingsで変更

縦横3x1に変更

```
$ gsettings set org.compiz.core:/org/compiz/profiles/unity/plugins/core/ hsize 1
$ gsettings set org.compiz.core:/org/compiz/profiles/unity/plugins/core/ vsize 3
```

# (方法2) CompizConfig設定マネージャで変更

```bash:ccsmの起動
$ ccsm
```

`General Options` を選択

![1.png](https://qiita-image-store.s3.amazonaws.com/0/37721/6a0c09b1-9106-fa25-5183-5ebc8d94b4d4.png)

ワークスペースのサイズを変更

![2.png](https://qiita-image-store.s3.amazonaws.com/0/37721/95eccf85-fa3a-5264-a7d7-9c0e4a4b77fb.png)
(VIMから)OutlookにPythonでTask登録 or Notification

# 社内プロキシきつくて、Outlookしか使えない人のために

## Outlookのタスク機能は、めちゃくちゃ凄い
- Todoixxだー、Wundexxxだー言うまえに、Outlookつかいこなせてる？
- どうせ会社は、Outlook強制だろ？！
- Outlookのタスク登録って、めっちゃ高機能！
- めっちゃ凄いけど、登録が面倒くさくて誰も使ってない

## Pythonの身軽さを利用
- Pythonでソース作れば、色々連携できるしアイデア次第で自由
- Notificationみたいにも使える
- 期限つきもPostも設定可能(期限は、手動で設定すればいいけど)

## Vimmer？
- VimからPython呼びだして、OutlookにTask登録できるよ
- Vimじゃなくても、Python実行すればできる

### 今回の例はVimをインターフェースにタスクを流し込む
- Vimで何かを書く
- [:PostOutlookTask]すると、書いてる文章をOutlookのTaskに登録する
- filenameにPathつっこめば、Pythonだけでも実行できる

### win32com.client
- Outlook操作するwin32com.client準備してください
- Anaconda環境ならデフォルトで入っているから大丈夫death


ソース

```python:Outlook_alert_vim.py
# coding: utf-8
import pytz
import sys
from datetime import datetime, timedelta
import win32com.client as wcl


def win_time_norm(d):
    '''
    OutlookのTimeFormatに変換
    :param d: Datetime
    :return: Type pytx Datetime
    '''
    date = pytz.utc.localize(d)
    return date


def post_outlook_task(task_list):
    '''
    Outlookにタスク登録をする
    ・win32com.clientを準備すること
    ・Anacondaならデフォルトで入っている
    out_task.DueDate = s_win_day
    ・日付を今日にすればNotificationがわりにも使える
    ・期限をしていする場合は、e_win_dayを登録
      ・edday(5日)で5日後アラートにしてる
    :param task_list: VIMのText 1行目をSubject
    '''
    stday = datetime.today()
    edday = datetime.today() + timedelta(days=5)
    s_win_day = win_time_norm(stday)
    e_win_day = win_time_norm(edday)

    outlook = wcl.Dispatch("Outlook.Application")
    for task in task_list:
        out_task = outlook.CreateItem(3)
        out_task.Subject = task[0]
        out_task.Body = task[1]
        out_task.StartDate = s_win_day
        out_task.DueDate = s_win_day
        # out_task.DueDate = e_win_day
        out_task.ReminderSet = True
        out_task.Save()


def main(args):
    filename = str(args[0])
    with open(filename, mode="r", encoding='utf-8') as fh:
        data = fh.readlines()

    data = [t.strip().strip('\n') for t in data if t]
    # 連続登録できるようにしてる(今回の例ではいらないけど)
    task_list = []
    task_list.append((data[0], "\n".join(data)))
    # task_list.append(("test subject","body row1 \n body row2"))

    post_outlook_task(task_list)


if __name__ == "__main__":
    main(sys.argv[1:])
```

s:python_fileの場所は、自分で指定してね。

```vim:_vimrc
"outlook_task_vim"{{{
function! s:outlook_posttask_vim()"
    let s:python_file = "D:/Outlook_alert_vim.py"
    let s:file = tempname()
    silent execute ":write " . s:file
    silent execute "!python " . s:python_file . ' ' . s:file
    call delete(s:file)
    unlet! s:file
    unlet! s:py_script
endfunction augroup END"
command! -nargs=0 PostOutlookTask call s:outlook_posttask_vim()
"}}}

```
【メモ】RGB、HSV、YUV

![hsv_cone.png](https://qiita-image-store.s3.amazonaws.com/0/134166/5d1ad9a2-bbad-c02b-066d-a71b79f5c92e.png)

![hsv_detail.jpg](https://qiita-image-store.s3.amazonaws.com/0/134166/c840a5ba-4eb9-bec9-452e-211f9dcee1e3.jpeg)

![rgb to yuv.png](https://qiita-image-store.s3.amazonaws.com/0/134166/4627a136-1fc8-081d-067a-51f99f864809.png)

![yuv_uv_plane.png](https://qiita-image-store.s3.amazonaws.com/0/134166/9b875594-0947-7ccf-44c7-c0acd451b023.png)
centos

##centos7
###初期設定手順メモ

前提：VMwareなどでCentos7をISOイメージファイルなどからインストールしている。

####１. centos7のGUIによる設定
・KeyboardはUSを選択
・rootのpassを作っとくと良い
####２. centos7立ち上げ後の設定
$ useradd [username]
$ passwd [username]
$ visudo
$ vigr
####３.NETWORKの設定
前提：$ ip a か何かで自分のネットワークインターフェースを確認していること。
1. $ nmtuiで設定 または、 vi /etc/sysconfig/network-scripts/ifcfg-~
2. nmtuiでipを設定したら、/etc/sysconfig/network-scripts/ifcfg-~を編集。
3. ONBOOT=no -> ONBOOT = yes

ref:ネットワークの設定
http://qiita.com/tukiyo3/items/67182edee4f937e7f707
####4.Firewallの設定
####5.SELinuxの無効化
centosでのGUI導入手順


## 実施OS
Cent0S 6.7

## 手順
デスクトップのインストール

```
yum groupinstall "Desktop"
```

日本語フォントのインストール

```
yum install vlgothic-fonts
```

VNCサーバ

```
yum install tigervnc-server 
```

ユーザ変更

````
su - hogehoge
````

vncサーバ起動

```
vncserver :1
```

停止

```
vncserver -kill :1
```
リストアイテムの高さが固定されていない場合のVirtual Scroll(Virtual Rendering)の代替手段

## 前提
ウェブフロントエンドにおけるリストのレンダリング高速化についてのTipsです。
vue.jsなどのバインディング機構をもったフレームワークを使っていることを想定していますが、アイディア自体は汎用的なものです。

## Virtual Scroll/Virtual Rendering
大量のアイテムをリスト表示する場合などに、実際のレンダリング対象を絞ることでレンダリングを高速化するというテクニックがあります。このテクニックはVirtual ScrollやVirtual Renderingと呼ばれることが多いです。

Virtual Scrollを実現するライブラリのほとんどはレンダリング前に各アイテムの高さが分かっている必要があります。
高さが分からなければ、現在のスクロール位置において、どのアイテムをレンダリングすべきなのかを判断できないからです。

しかし、アイテムの高さを事前に決めるのが難しい場合があります。HTMLにおいては、表示内容によってアイテムの高さが変わることがあるからです。
アイテムの高さが事前に判断できない場合であっても、Virtual Scrollのようなレンダリングの高速化を実現するテクニックを思いついたので共有します。

## 代替手段のアイディア

アイディアは単純で、ビューポートの外にある要素はサイズを固定して内容を空にするというものです。
内容を空にすることでレンダリング対象のDOMノードを削減して高速化を図ります。
カード形式のコンポーネントなど複雑な要素を数百程度表示する場合などに効果を発揮します。
ただし、一般的なVirtual Scrollと比較して、項目ごとの表示要素が残るため、表示要素がシンプルで大量の要素を表示するようなケースでは逆効果となってしまいます。

## 実装例

下記にVue.jsによるサンプルを示します。保存してブラウザで表示すれば動作します。

```html
<body>
<div id="app">
  <ul style="display:block; width: 320px; height:480px; overflow-y:scroll;" @scroll="onScroll">
    <li v-for="item in items" :key="item.id" :data-item-id="item.id">
      <div v-if="!item.virtual">
        <strong>{{ item.title }}</strong><br/>
        {{ item.description }}
      </div>
    </li>
  </ul>
</div>

<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script>

function isOutOfViewport (ulRect, el) {
  let rect = el.getBoundingClientRect()
  return (
    rect.top + rect.height < ulRect.top ||
    rect.top > ulRect.bottom
  )
}

new Vue({
  el: '#app',
  data: function () {
    let items = {}
    let texts = [
      'あのイーハトーヴォ',
      'あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら',
      'あのイーハトーヴォのすきとおった風、夏でも底に冷たさをもつ青いそら、うつくしい森で飾られたモリーオ市、郊外のぎらぎらひかる草の波。'
    ]
    for ( let i = 0; i < 300; i++ ) {
      items[i] = {
        id: i,
        title: 'Title ' + i,
        description: texts[Math.floor((Math.random() * 10) % 3)],
        virtual: false
      }
    }
    return {
      items: items
    }
  },
  methods: {
    onScroll (event) {
      let ulRect = document.querySelector('ul').getBoundingClientRect()
      document.querySelectorAll('li').forEach(el => {
        let id = el.getAttribute('data-item-id')
        if (isOutOfViewport(ulRect, el)) {
          this.items[id].virtual = true
          let r = el.getBoundingClientRect()
          el.style.width = r.width + 'px'
          el.style.height = r.height + 'px'
        } else {
          this.items[id].virtual = false
        }
      })
    }
  }
})

</script>
</body>
```

前述した、「ビューポートの外にある要素はサイズを固定して内容を空にする」 をしているだけです。
スクロールイベントの度に行う計算が多いのでやや不安になりますが、要素が数百程度であれば問題にはならないでしょう。

私の環境でこの仕組みが必要となったのはモバイルでカードコンポーネントを大量に表示するケースでした。この仕組みを導入するまえはスクロールがガクガクだったのですが、導入後はスムーズになりました。

見えない位置の表示要素をひとつのブロックにまとめられると更に高速化できると思うのですが、それをうまく実装するのが難しく断念しました。
Python > dictionary > get() > optional value

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 1642 / 12833)

PythonのDictionaryの要素を取り出す関数get()について。

> If not, you get the optional value, if you specified one:

```
>>> pythons.get('Mark', 'Not a Pythong')
'Not a Python'
```

dictionary "pythons"に含まれていない場合の例。

試してみた。

http://ideone.com/zUP5Pu

```py
mydic = {'7of9' : 'borg', 'Chakotay' : 'human', 'Janeway' : 'human'}
print(mydic.get('7of9', 'unknown'))
print(mydic.get('Chakotay', 'unknown'))
print(mydic.get('Tuvok', 'unknown'))
```

```txt:結果
Success	time: 0 memory: 23352 signal:0
borg
human
unknown
```
連想配列の中の連想配列でkeyとvalueを取り出す方法

連想配列の中に連想配列があるときの、key、valueの取り出し方で悩んだ。

例えば、以下のような連想配列があるときに、

```
var persons = {
  Taro: {height: 1.8, weight: 75},
  Jiro: {height: 1.7, weight: 60},
};
``` 

以下のように中身の連想配列を取得できる。
`persons.Taro;`
=> {height: 1.8, weight: 75}

そして以下のようにheightを取得できる。
`console.log(persons.Taro.height);`
=> 1.8


悩んだのが、入れ子の中の連想配列の値を取得する方法。
最初はこう書いてしまった。
`persons.key.height`
これでは取得できない。

正しくは、
`persons[key].height`

`persons[key]`で、値（＝外の連想配列の値）が取れる。
{height: 1.7, weight: 70}

その上で中の連想配列の値を取りたいので、
`persons[key].height`
となる。

```
var persons = {
  Taro: {height: 1.8, weight: 75},
  Jiro: {height: 1.7, weight: 60},
};

for (var key in persons) {
  console.log(key + "さん");
  console.log("身長は" + persons[key].height +"mです");
  console.log("体重は" + persons[key].weight +"kgです");
}
```

コンソール

```
Taroさん
身長は1.8mです
体重は75kgです
Jiroさん
身長は1.7mです
体重は60kgです
```
link > Bagging, boosting and stacking in machine learning

StackExchange内のサイトにおいてCross Validatedというmachine learning関連のやりとりをしているページがある。

その中で気になった以下のQA。
[Bagging, boosting and stacking in machine learning](http://stats.stackexchange.com/questions/18891/bagging-boosting-and-stacking-in-machine-learning)

> answered Nov 28 '11 at 12:32
Alexander Galkin

の`Goal to achieve`から抜粋。

- Bagging: Minimize variance
- Boosting: Increase predictive force
- Stacking: Both


> answered Dec 16 '15 at 3:23
yuqian

の回答では

- Bagging: aim to decrease variance, not bias
- Boosting: aim to decrease bias, not variance

モデルの違い(high variance low bias models / low variance high bias models)で使い分けるという記載もある。
Rubyの配列がソート済みかどうかを調べる

配列がソート済みかどうかを調べるコードです。（昇順）

```rb
module Enumerable
  def sorted?
    each_cons(2).all? {|a, b| a <= b }
  end

  def sorted_by?
    each_cons(2).all? {|a, b| yield(a) <= yield(b) }
  end
end

p [3,2,1].sorted? #=> false
p [1,2,3].sorted? #=> true

p ['1','2','13'].sorted?            #=> false
p ['1','2','13'].sorted_by?(&:to_i) #=> true
```

`each_cons` で要素を2つずつ取り出し `<=` を使って値の比較を行っています。比較を行った結果が全て true なら昇順で並んでいます。降順で並んでいるかどうかを確かめるときには `>=` を使用します。


### 追記

@scivola さんのコメントを元に修正を行いました。ありがとうございます :pray:

## 使い道

[ボゴソート](https://ja.wikipedia.org/wiki/%E3%83%9C%E3%82%B4%E3%82%BD%E3%83%BC%E3%83%88)

```rb
class Array
  def bogosort!
    shuffle! until sorted?
    self
  end
end

p [*1..5].shuffle.bogosort! #=> [1, 2, 3, 4, 5]
```

`bsearch` 前のチェック

```rb
ary = [0, 4, 7, 10, 12].shuffle
ary.sort! unless ary.sorted?
p ary.bsearch {|x| x >= 4 } # => 4
```

etc...

## 参考サイト

https://docs.ruby-lang.org/ja/latest/class/Array.html
https://docs.ruby-lang.org/ja/latest/class/Enumerator.html
技術英語 > every single instance of this kind of problem [could be traced back to] a weirdly wired model,

@ https://github.com/tensorflow/tensorflow/issues/323

> vincentvanhoucke commented on 25 Nov 2015
> but in my experience, every single instance of this kind of problem **could be traced back to** a weirdly wired model, ...

意訳「しかしながら私の経験によると、この種の問題のあらゆる事例は異様におかしなモデルや...などに起因すると見ることができるだろう」

上記の...は以下。

> **could be traced back to** a weirdly wired model, learning rate issues, bad randomization of the input examples, or - in the case of Adam or RMSProp - issues with the epsilon value.
メモ: ssh接続出来ない時の対処方

Ansibleの導入に3日もかかってしまった癖に、理由がしょっぱかったので自戒を込めてメモを書きます

何故かAnsibleでSSH接続が出来なかったので、ansible使う際に-vvv叩いたら原因が判明、
単純にSSHの設定がおかしいだけだった

http://masahir0y.blogspot.jp/2012/10/ssh.html
試試 Carthage 

## 安裝

透過 homebrew 安裝即可

```
$ brew update
$ brew install carthage
```

## 基本指令

可以直接輸入 `carthage` 執行，看基本的指令集

```bash
$ carthage
```

就會印出這樣的資訊

```shell-session
Available commands:

   archive           Archives built frameworks into a zip that Carthage can use
   bootstrap         Check out and build the project's dependencies
   build             Build the project's dependencies
   checkout          Check out the project's dependencies
   copy-frameworks   In a Run Script build phase, copies each framework specified by a SCRIPT_INPUT_FILE environment variable into the built app bundle
   fetch             Clones or fetches a Git repository ahead of time
   help              Display general or command-specific help
   outdated          Check for compatible updates to the project's dependencies
   update            Update and rebuild the project's dependencies
   version           Display the current version of Carthage
```

## Cartfile

就像 Podfile 一樣，這個工具的設定檔就是 Cartfile

先在終端機裡面進到 Xcode 專案的目錄之後，

```
vim Cartfile
```

來透過 vim 開始編輯 Cartfile

內容就相對簡單多了，先試試看加入 Alamofire

```text:Cartfile
github "Alamofire/Alamofire" ~> 4.4
```

接著儲存退出 - `:wq`

並在 command line 執行

```bash
$ carthage update
```

就可以生成可以拖曳進 Xcode 的 framework 檔。

如果只要 build for iOS ，可以加上 flag 加上限制

```bash
$ carthage update --platform iOS
```

接著就會陸續印出以下的資訊：

```shell-session
*** Fetching Alamofire
*** Checking out Alamofire at "4.4.0"
*** xcodebuild output can be found in /var/folders/xr/_qcc9bwd2016f0ygl69qrvp80000gn/T/carthage-xcodebuild.7tbiKU.log
*** Building scheme "Alamofire iOS" in Alamofire.xcworkspace
```

### 拉入專案

這時候在專案的這個路徑

```
Carthage/Build/iOS/
```

下，就可以看到一個叫做 `Alamofire.framework` 的檔案，接著就可以把這個 framework 檔案拖曳進 Xcode 裡面的這個地方：

```
Target (pick one) > General > Linked Frameworks and Binaries
```

接著在隨意的 Swift 檔案裡面，試試看能不能透過自動完成 `Alamofire` 的方式載入

```
import Alamofire
```

就算大功告成了。
python2での整数判定

python2には整数を表す型にint(整数)とlong（長整数）の２つが存在しています。
このlongはintと共通のサブクラスを持たないので注意が必要です。
例えば変数が整数値であるか判定するのに以下のようにする必要があります。

```python
if isinstance(value, (int, long)): # isinstance(value, int) ではダメ
    print('OK')
```

また、bool型はintをサブクラスに持つので、boolを取り除くのに以下のようにしてはじきます。

```python
if isinstance(value, (int, long)) and not (isinstance(value, bool)):
    print('OK')
```

通常pythonを使う上でlongはあまり使われないのであまり問題ないのですが、dbから値を取ってくるときにormがdbの型に合わせてlongを使うことがあります。
python3系だとlongは廃止されintに集約されています。
boolはpython3でもintのサブクラスのままです。
疑似要素にクラスをつける・JavaScriptで制御する

# 疑似要素の仕様

疑似要素にクラスやIDがつけられません。
したがって、transitionや他CSSのクラスアニメーションなどで制御するのは困難です。
**が**、今回はこの仕様をゴリ押しでカバーしていきたいと思います。

# 2つの疑似要素を疑似的に1つとして扱う

## CSSのみでの解決方法

疑似要素にクラスやIDはつけられませんが、疑似要素の親要素のクラスを読み取って制御することができます。
そこで、親となる要素に二つのクラスをつけ、それぞれに対応する同じ疑似要素をつくってあげます。

```html:index.html
<div class="hoge fuga"></div>
```

```css:index.css
.hoge:before{
  content: "I'm hoge!";
}

.hoge.fuga:before{
  content: "I'm fuga!";
}
```

この場合、より詳細に記述されたCSSの.hoge.fuga:beforeが優先されるため、疑似要素の中身は"I'm fuga!"となります。

これを利用してjQueryなどでfugaのクラスを消すとhogeのクラスが適応され、疑似要素の中身をまさに**疑似的に**変えることができます。

疑似要素は存在し続ける判定になるので、hogeとfugaにtransitionなどをつけるとCSSのクラスアニメーションをしたことと同じ動作をします。


## JSでの解決方法


これはコメントでご指摘頂いた方法ですが、js側でシングルclassを約束するコードで運用することで、CSSをより(わずかに)簡単に記述することができますが、個人的にはCSSで制御したほうが実装上は楽そうです。

JSでの実装は下のようになります。

```html:index.html
<div id="box" class="hoge fuga"></div>
```


```css:index.css
.hoge:before{
  content: "I'm hoge!";
}

.fuga:before{
  content: "I'm fuga!";
}
```

```js:index.js
$("#box").click(function() {
  if($(this).hasClass("fuga")){
    $(this).attr("class","hoge");
  }else{
    $(this).attr("class","fuga");
  }
})
```

# まとめ

疑似要素にクラスを付けたいと思うことは少ないかと思いますが、疑似的に動かすことはできるということで一応書き残させていただきました。

記事を読んでもあまりわからない方は


```html:index.html
<head>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js" />
  <link rel="stylesheet" type="text/css" href="./index.css" />
  <script src="./index.js" />
</head>
<body>
  <div id="box" class="hoge fuga"></div>
</body>
```

```css:index.css
.hoge::before {
  content: "click me!";
  position: absolute;
  background-color: blue;
  transition: 0.2s;
  height: 100px;
  width: 100px;
}

.hoge.fuga::before {
  content: "click me!";
  background-color: red;
  /*  後はhogeから継承  */
}

```

```js:index.js
$(function(){
  $("#box").click(function(){
    $("#box").toggleClass("fuga");
  })
})
```
[Codepen](http://codepen.io/hxdegawa/pen/PpWNJy)

このコードを試していろいろいじると分かるかもしれません。

初投稿なので、いろいろ助言を下されば幸いです。


**コメントでのご指摘に基づいて編集しました**
MacでGitでのGitHubアカウント移行で失敗したこと

#環境

* MacBook Pro Late2016(macOS Sierra v10.12.3)
* Git (v2.10.1)
* GitHubアカウントA(hoge)
* GitHubアカウントB(fuga)

#状況

Gitにはメインでhogeを使っていた。とある理由で新しいアカウントfugaに移行しようとした。  
SSH Keyをhogeから削除し、fugaに登録し、Gitでのアカウント名やメールアドレスも新しくし、これで行けるだろうと新規リモートリポジトリ(test)を作成。ローカルリポジトリに操作を行おうとした。

```
$ git init
~ ファイル作成 ~
$ git add .
$ git commit
$ git push https://github.com/fuga/test master
remote: Permission to fuga/test.git denied to hoge.
fatal: unable to access 'https://github.com/fuga/test/': The requested URL returned error: 403
```

んん？どこかにhogeの情報が残っているのか？

#検証

1. リポジトリ再作成
　とりあえずローカル・リモート共にリポジトリを再作成。
　当然のようにダメ。

1. SSH keyの再登録
　SSH keyを新しく作成し、fugaに登録。
　ダメ・・・。

1. 認証情報のキャッシュ
　gitの認証情報をキャッシュできるらしいので無効にしてみる。

 ```
 $ git config --global --unset credential.helper
 ```

　　ダメ。
　　認証情報の裏側を見るコマンドがあるらしいので試した。
　　コマンドを入力すると対話モードになり、空行を入れると標準出力で返してくれるらしい。
 
```
$ git credential fill
protocol=https

protocol=https
username=hoge
password=password
```

　　なんかでてきた。これを消すにはどうしたら・・・？
　　git credential reject等試すがダメ。

#結論
MacOSだとアカウント情報はキーチェインに保存されていくようで、そこに保存されているログイン情報を削除すればよかった。
つまり、アプリケーション->ユーティリティ->キーチェインアクセスを開き、名前がgithub.comとなっているものを削除することでhogeのログイン情報が削除された。再度pushするとログイン要求が出て正常にpushできた。
<img width="154" alt="スクリーンショット 2017-03-09 2.03.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/127939/68b389be-b399-7435-d977-b08073ca77cf.png">←コレ

ほんとに下らないことに時間を使ったような気がする。悲しい。

#参考

* https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-%E8%AA%8D%E8%A8%BC%E6%83%85%E5%A0%B1%E3%81%AE%E4%BF%9D%E5%AD%98
* http://stackoverflow.com/questions/11067818/how-do-you-reset-the-stored-credentials-in-git-credential-osxkeychain
初めてのPHPのマイクロフレームワーク「Slim」

## 概要
PHPでAPIを作成するならどのモジュールが良いかを検討する過程で、
PHPのマイクロフレームワーク「Slim」の存在を知りました。
そこで、使用感の確認がてらSlimを触っていきます。

## インストール
composerでインストール可能です。
インストールは公式サイトのチュートリアルを参考に下記で行います。

```
php composer.phar create-project slim/slim-skeleton アプリケーション名
```
アプリケーション名のディレクトリが作成されましたら、
アプリケーション名/publicをドキュメントルートに設定してブラウザよりアクセスします。

すると下記の画面が表示されるかと思います。

<img width="1057" alt="スクリーンショット 2017-03-09 1.09.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/39671/2cb695f4-7963-45c8-5ebd-cc7973b02049.png">

これで一先は開発準備完了です。

## ルーティングの確認
Slimeではルーティング情報はroutes.phpに記載されています。
インストール時点では、getでルート/文字と入力すると「Hellow 文字」と出力する設定が記載されています。

```src/routes.php
$app->get('/[{name}]', function ($request, $response, $args) {
    // Sample log message
    $this->logger->info("Slim-Skeleton '/' route");

    // Render index view
    return $this->renderer->render($response, 'index.phtml', $args);
});
```

実際にブラウザで「ルート/world」でアクセスしてみると下記のページが表示されます。
<img width="986" alt="スクリーンショット 2017-03-09 2.23.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/39671/6ba4e8c8-3429-4927-a8bf-611e06d13b01.png">

これでざっくり動作は確認できたので、引き続いて触っていきます。
NetCommons3の開発に使ってるVagrantが遅いので共有フォルダ設定をnfsにする。


Mac環境での話です。
以前も一度設定してたんですが、Mac本体のディスクフルに伴ってVagrantの設定ファイル壊れたりとか色々あって、再度設定しました。

設定時にちとハマったのでメモがてら^^;


```
    node.vm.synced_folder '.', '/var/www/app',
    :create => true, :owner=> 'www-data', :group => 'www-data'
```

となってたのを

```
    node.vm.synced_folder '.', '/var/www/app',
    :create => true, :owner=> 'www-data', :group => 'www-data', type:"nfs"

```

としてnfsへ
そしたら　vagrant up時にエラー

```
There are errors in the configuration of this machine. Please fix
the following errors and try again:

vm:
* Shared folders that have NFS enabled do not support owner/group
attributes. Host path: .
```

ownerとgroupはnfsにしたときは使えないってことのようだ。ってことでその指定を除外してみる。

```
    node.vm.synced_folder '.', '/var/www/app',
    :create => true, type:"nfs"

```

再び vagrant upするが今度は違うエラー

```
NFS is reporting that your urus file is invalid. Vagrant does
this check before making any changes to the file. Please correct
the issues below and execute "vagrant reload":

exports:2: path contains non-directory or non-existent components: /Users/ryuji/htdocs/NetCommons3
exports:2: no usable directories in export entry and no fallback
```

ぐぐってみると/etc/exportsを削除しろってことらしいので

```
$ sudo rm -rf /etc/exports
```

これで無事起動できるようになりました


## 参考
- [Vagrantのshare folderが遅い時はNFSを使うといいです - Qiita](http://qiita.com/itopan88/items/06d7c7a08f2d681b042a)
- [Vagrantの動作が遅かったので共有フォルダ設定とVirtualBox環境のメモリ設定を見直してみました。](http://hamatte-wataru.com/vagrant_nfs/)
-
JavaScript の Dateオブジェクトを Rails-like に使いたい

## はじめに

JavaScript の Dateオブジェクトは色々と悪名高く、その代替ライブラリは片手で数え切れないほど存在する。有名どころで言えば、[moment](https://github.com/moment/moment)、[Datejs](https://github.com/datejs/Datejs) などがある。しかし私は Rails の Timeオブジェクトに魅せられてからというもの、その使用感が忘れられなくなってしまい、どうにかして js や ts でも使えないものかと苛立ちと悲しみの間で煩悶していた最中、ついにその感情が溢れ出てしまい、自分で実装してしまった次第である。

## インストール

百聞は一見にしかず、まずは是非使ってもらいたい。
https://github.com/chase0213/extdate

インストールは例にもれず、`npm install --save extdate` とするだけである。

動作しない場合は気軽に issue や PR などであげていただければと思う。
もし仮に何かの間違いで広く使われるようになってしまった場合に日本語で埋め尽くされていると、非日本語圏の方が萎縮してしまうかもしれないので、できれば英語で書いてほしい。

## 使い方

Rails の Timeオブジェクトの操作感を目指した。
使用できるメソッドは README に書いてあり、そちらが最新なので追ってほしい。

試しに、昨年度のクリスマスから30日後が何曜日なのかを日本語で得たい場合の例文を書いてみる。

```typescript
let lastChristmas = new ExtDate(2016, 12, 25);
let dayOfWeek = lastChristmas.nextDay(30).dayOfWeek('ja');
console.info(dayOfWeek);
=> 火曜日
```

なるほど、火曜日らしい。特にこの日に思い入れがあるわけではないが、Rails のようにメソッドチェーンができることを示すためにわざわざこの偏屈な例を選択した。

## 所感

typescript で npmパッケージを作ったのは初めてだったのだが、型があるというのは素晴らしい。自動生成された型定義ファイルを貼っておくだけでとりあえずドキュメントの代わりになるし、テストでわざわざ型チェックを書く必要も（`any` や `a|b` としていない限り）あまりない。

## おわりに


We
 I need help to develop `extdate` together!
SOAP通信で411 Error: Length Requiredが発生した件

#はじめに
SOAP通信で、クライアントを作成し疎通を行なったところ、
掲題のエラーが発生致しました。

調査中に出てきた資料が古いものがほとんどだったことや、
再度発生した場合の備忘録として記載しておきます。

#環境
バージョン：Java8
アプリケーションサーバー:Tomcat8.5
ライブラリ：axis2

#発生までの流れ
Axis2のライブラリを使用し、下記コマンドからクライアント側stubを生成致しました。

```
wsdl2java.bat -uri [wsdlのアドレス] -s -o [出力先]
```

その後、生成されたクライアントを、プロジェクトに追加し、
疎通を行いました。

そして、掲題のエラーが発生致しました。

411 Error: Length Required

#原因
Transfer-Encoding: chunked が設定されていたことが原因でした。

stubを作成した時点で、Transfer-Encodingの設定がデフォルトでchunkedになっておりました。

#対処方法
以下のソースコードを追加し、Transfer-Encoding: chunked の設定を無効にしました。

```
options.setProperty(MessageContextConstants.CHUNKED, Constants.VALUE_FALSE);
```

#参考資料
http://blogs.yahoo.co.jp/dk521123/32003685.html
http://b.hatena.ne.jp/entry/akitosblog.seesaa.net/article/168401299.html
http://axis2.exblog.jp/2966162/
Endless Runner 7 - Wrap Up

# Endless Runner
## 7 - Wrap Up

[![7 - Wrap Up](http://img.youtube.com/vi/VJOMdHzp3b8/0.jpg)](https://www.youtube.com/watch?v=VJOMdHzp3b8)

### BP_FloorTileのWall1,Wall2に衝突したら死ぬように修正する

#### BP_FloorTileのWall1にOn Component Hitを追加する

BP_FloorTileを開き
Wall1にOnComponentHitを追加する

![image](https://qiita-image-store.s3.amazonaws.com/0/111261/6da33001-d52f-32ba-3bcb-e5debe3a13d9.png)

処理を実装する
動画ではNearlEqualのBの値が-1になっているが、1を設定する
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/a1e5ab39-3396-0665-ae8d-750bc715167e.png)


#### BP_FloorTileのWall2にOn Component Hitを追加する

Wall2にOnComponentHitを追加する
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/541c2f4c-f8b9-53bc-c808-bc5f4fe9b096.png)

処理を実装する
Wall1の処理と同じなので、Wall1の処理をコピーしてWall2の処理を実装する
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/22c15805-3fb4-ab2f-7e55-5b81032d201a.png)

プレイして確認する
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/7c2f7243-3d73-e997-314c-8f72557237f0.png)

コーナーの壁にぶつかった時だけ爆発する
![image](https://qiita-image-store.s3.amazonaws.com/0/111261/296ebb18-c50a-f51a-1ccf-bfc13c7f99cf.png)
dateオブジェクトでのいろんな日(時間)の求め方

JavaSCriptでのいろんな日付、時間の求め方のまとめ。

## 目次
- [共通ソース](#共通ソース)
- [今日の終わり](#今日の終わり)
- [x日前_x日後](#x日前_x日後)
- [x時間前_x時間後](#x時間前_x時間後)
- [月初_月末](#月初_月末)
- [年始_年末](#年始_年末)

## ソース

### 共通ソース

```javascript
let now = new Date();
let nowYear = now.getFullYear();
let nowMonth = now.getMonth();
let nowDate = now.getDate();
let nowhour = now.getHours();

```

#### 今日の終わり
```javascript
let date = new Date(nowYear, nowMonth, nowDate, 23, 59, 59);
```

#### x日前_x日後
```javascript
// 例）5日前
let x = -5;
let date = new Date(nowYear, nowMonth, nowDate + x);

// 例）2日後
let x = 2;
let date = new Date(nowYear, nowMonth, nowDate + x);
```

#### x時間前_x時間後
```javascript
// 例）3時間前
let x = -3;
let date = new Date(nowYear, nowMonth, nowDate, nowhour + x);

// 例）1時間後
let x = 1;
let date = new Date(nowYear, nowMonth, nowDate, nowhour + x);
```

#### 月初_月末
※dateに`0`を指定すると、前月の最終日に設定されるため、monthに`1`を加算

```javascript
// 月初
let date = new Date(nowYear, nowMonth, 1);

// 月末
let date = new Date(nowYear, nowMonth + 1, 0);
```

#### 年始_年末
```javascript
// 年始
let date = new Date(nowYear, 0, 1);

// 年末
let date = new Date(nowYear, 11, 31);
```