OmniAICreator/Qiita-1.07M huggingface dataset:
Xamarin FormsとOxyplotでPCLなグラフをタダで描く


Xamarin Formsでアプリ開発する中で
グラフ描画にOxyplotを使用する機会があったので、メモしておきます。

最初、調査した時は
```
欲しいグラフに対応してない（棒グラフしか描けない）、有償、PCL対応ではない...
```
など壁にぶつかる中

Oxyplotは、無償で、PCL対応,多くのグラフ描画に対応しています。
棒/積み上げ棒グラフ、円グラフ、折れ線グラフ、散布図、etc
複合グラフも描画できます.

<img width="668" alt="スクリーンショット 2016-03-12 12.51.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/79576/1c626195-8fed-36cc-58f7-212f0393cfba.png">

使用したライブラリとソースの例を紹介します

## 使用したライブラリ(Nugetから取得)
* Oxyplot 1.0.0-1968
* Oxyplot.Xamarin.Forms 1.0.0-1968
* Oxyplot.Xamarin.iOS (iOSでのみ使用)
* Oxyplot.Xamarin.Android(Androidでのみ使用)

## ソース(円グラフの例)

```csharp

using System;
using OxyPlot.Series;
using OxyPlot;
using OxyPlot.Xamarin.Forms;
using Xamarin.Forms;
using System.Collections.Generic;

namespace Sample
{
	public class GraphTest : ContentPage
	{
		public GraphTest ()
		{
			
			var plotModel = new PlotModel { 
				Title = "一番好きなグラフは？",
				LegendTitle = "凡例",
				LegendPlacement = LegendPlacement.Outside,
				LegendBackground = OxyColors.White,
				LegendBorder = OxyColors.Red,
				LegendTextColor = OxyColors.Black,
				LegendSymbolPlacement = LegendSymbolPlacement.Left,
				LegendTitleColor = OxyColors.Black,
				PlotAreaBorderColor = OxyColors.Transparent,

				Series = {
					new BarSeries (){ Title = "棒グラフ", FillColor = OxyColors.DarkViolet },
					new BarSeries (){ Title = "折れ線グラフ", FillColor = OxyColor.FromRgb (0, 158, 115) },
					new BarSeries (){ Title = "円グラフ", FillColor = OxyColor.FromRgb (86, 180, 233) },
					new BarSeries (){ Title = "帯グラフ", FillColor = OxyColor.FromRgb (230, 159, 0) },
					new BarSeries (){ Title = "散布図", FillColor = OxyColor.FromRgb (0, 114, 178) },
					new BarSeries (){ Title = "ウィーグラフ", FillColor = OxyColor.FromRgb (240, 228, 66) },
					new PieSeries { 
						StrokeThickness = 2.0, 
						InsideLabelPosition = 0.8, 
						AngleSpan = 360, 
						StartAngle = 0,

						Slices = new List<PieSlice> {

							new PieSlice ("棒グラフ", 20) { Fill = OxyColors.DarkViolet, IsExploded = true },
							new PieSlice ("折れ線グラフ", 20){ Fill = OxyColor.FromRgb (0, 158, 115), IsExploded = true },
							new PieSlice ("円グラフ", 20) { Fill = OxyColor.FromRgb (86, 180, 233), IsExploded = true },
							new PieSlice ("帯グラフ", 20) { Fill = OxyColor.FromRgb (230, 159, 0), IsExploded = true },
							new PieSlice ("散布図", 20) { Fill = OxyColor.FromRgb (0, 114, 178), IsExploded = true },
							new PieSlice ("ウィーグラフ", 3) { Fill = OxyColor.FromRgb (240, 228, 66), IsExploded = true },
						}
					}
				}
			};

			var plotView = new PlotView { 
				VerticalOptions = LayoutOptions.FillAndExpand,
				HorizontalOptions = LayoutOptions.FillAndExpand,

				Model = plotModel
			};

			Content = new StackLayout { 
				VerticalOptions = LayoutOptions.FillAndExpand,
				HorizontalOptions = LayoutOptions.FillAndExpand,
				WidthRequest = 350,
				HeightRequest = 350,
				Children = {
					
					plotView
				}
			};
		}
	}
}
```

## 参考
  * BarChart
    - https://components.xamarin.com/view/barchart
  * Oxyplot x Xamarin.Forms
    - https://www.nuget.org/packages/OxyPlot.Xamarin.Forms

ホントはXamarin.FormsにAPIがあると嬉しいです！
案 > slack > PCの生存確認

長期動作しているPCなどで停止したときにすぐにその情報を得たいとする。

slackを使う場合は以下のような処理になるだろうか。

1 対象PCから定期的にslackへ通知
2 通知がこなくなった時をトリガーとする
3 トリガー発生時に指定のメールに連絡する

2の処理をどうするかは未確認

slackでなくRaspberry Pi2などでWiFi通信しておいてUDP通信を受け続けるのは実装できそうだが、Pi2を動かし続けることになる。

あるいは Pi2を動かし続けるなら Ping をし続けて、Pingの応答がない時だけSlackに通知、でもいいかも。

Pi2が先に落ちた場合をどうするか。対象PCのうちの一台からPi2へPingをかけて、Pingの応答がなくなった時にslackへ通知する、など。
[Monaca] イベントの発生順序について

Monacaでアプリ開発をするときに気をつけなければいけない点として、使いたい機能が使える状態になっているかが挙げられます。

Cordovaプラグインを組み込んだ場合は、JavaScriptからネイティブ機能へアクセスが可能になっていないとCordovaプラグインの機能を利用することはできません。また、Onsen UIを利用する場合も、Onsen UIのコンポーネントの読み込みが完了していないと利用することができません。

そこで今回は、Monacaで開発したアプリが起動した時のJavaScriptのイベント発生順序を見ていきたいと思います。

イベント発生順序は、以下になります。

| 順番 | イベント名 | 発生のタイミング |
|:---:|:------------|:------------|
| 1   | DOMContentLoaded | HTMLのすべてのDOM要素が読み込まれた時に発生します。 |
| 2   | load | HTMLのレンダリングに必要なリソースがすべて読み込まれた時に発生します。 |
| 3   | deviceready | JavaScriptからネイティブ機能へアクセスが可能になった時に発生します。 |
| 4   | ons.ready | Onsen UIコンポーネントの読み込みが完了し、devicereadyイベントの後に発生します。 |

Monacaで開発するアプリでCordivaプラグインやOnsen UIを使用する場合は、このように発生するイベントの順番を意識する必要があります。

イベントの発生順序は、次のHTML内の\<script\>タグで確認できます。
注意点として、MonacaクラウドIDEのプレビューでは、実機での発生順序とは異なった動きになります。
テストをする場合は、実機をお使いください。

```
<script src="components/loader.js"></script>
<script>

    document.addEventListener('DOMContentLoaded', function() {
        alert('DOMContentLoaded');
    }, false);
    
    window.addEventListener('load', function() {
        alert('load');
    }, false);
    
    document.addEventListener('deviceready', function() {
        alert('deviceready');
    }, false);
    
    // Onsen UIを使用している場合
    ons.bootstrap();
    ons.ready(function() {
        alert(‘Onsen UI ready’);
    });
    
</script>
```

Android端末で検証してみました。
このJavaScriptが実行されると、

| 順番 | メッセージ |
|:---:|:------------|
| 1   | DOMContentLoaded |
| 2   | load |
| 3   | deviceready |
| 4   | Onsen UI ready |

の順番で実行されることを確認することができます。

devicereadyイベントは、loadイベントの後に発生します。
HTMLのレンダリングに必要なリソースが多い場合は、その分devicereadyイベントの発生が遅れることになります。CordovaプラグインやOnsen UIを利用する際は、この点も注意する必要があります。

Monacaでのアプリ開発で、

「Cordovaプラグインが動作していないのでは？」
「Onsen UIが動作していないのでは？」

と感じた時は、一度CordovaプラグインやOnsen UIが利用可能な状態になっているかどうか確認してみてください。
仕事術 | 会議では非言語コミュニケーションを意識する [入社1年目のエンジニアが気付いた 会議/ミーティング出席のコツ]


# はじめに

自分は入社1年目のエンジニアです。
それ以前は「会議に出席する」という経験自体がありませんでした。

そのせいだけとは思えませんが。最初のうちは会議では話の本流を邪魔してコストをかけたり、メンバーの不興を買ってしまうということが何回もありました。
そして、自分が「コストをかけている」ということ自体に気付いていませんでした。

つまり「会議に出席する」という僕のプログラムにはバグが含まれていたのです。
実装のまずさもありました。テストさえ存在しなかったのです。

ですので、この修正について共有させていただきます。

# 非言語をキャッチする

```rb
begin
 Information.find_by(word: nil)
rescue => e
  p e.message
end
```

自分が一番誤解していたのは。
会議では**「言語でのみ、コミュニケーションがおこなわれるという思い込み」**でした。
ですが、これが違うのです。

会議自体の性質にもよりますが。
**「非言語のコミュニケーション」**もおこなわれています。
特に少人数でのミーティング。仲間内でのミーティングでは顕著です。

言葉でのコミュニケーションよりも、こちらの方がずっと重要な場合があります。

## 例

これはどういうことかというと。

たとえば次の場合。

1. Alice が発言した。
2. Bob が Alice に質問した。
3. Alice は5秒考えて答えた。
4. Calol は笑って見ていた。

「Bob が質問した」「Alice が5秒考えた」「Calolが笑っていた」ということの全てに。
**非言語化の情報** が詰まっているのです。

たとえば、次のように。

1. Alice は新しいストーリーを始めるようだ。
2. そういえばBob は今、独自に調査をしており。Alice のストーリーにもアドバイスが出来る状態にあるはずだ。だから質問の形をとって、Alice にアドバイスをしたのだろう。
3. Alice は質問をされてはじめて、Bob が言った問題を認識した。なのでしばらく考えて、回答するのに5秒かかったのだろう。
4. Calol は恐らく。これを良いメンバー環境だと思って眺めている。Calol は熟練のプレイヤーだ。そうか、Calol から見て、このチームは良い環境にあるのだな。

# クラス化する

「非言語コミュニケーションをキャッチする」というメソッドは。
クラス化して、いつでも使えるようにしておきましょう。

```rb
class You
  def hear
     Information.find_by(word: nil)
  rescue => e
     p e.message
  end
end
```
一般論として。
「人間同士のコミュニケーションでも。言語よりも非言語情報の方が、はるかに多い」という説があります。

[メラビアンの法則](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%A9%E3%83%93%E3%82%A2%E3%83%B3%E3%81%AE%E6%B3%95%E5%89%87) は俗説が広まったようですが。
「非言語のほうが情報量が多い」ということは、世の中を見渡せば、事実であることが分かるでしょう。

たとえば。ゲームキャラが何かセリフを言う時。
たとえば「笑った顔」「泣いた顔」「仏頂面」のどの画像を使うかによって、ユーザーに伝わるニュアンスは全く違ってきます。

キャラクターボイスでも、声優さんは復数のニュアンスを使い分けることが出来ます。

人間は非言語での情報で、多く受け取るようにできているのです。

ですから会議やミーティングに出席するときは、非言語での情報のやり取りに注目するのが良いでしょう。

# クラスを継承する

```rb
class Question < You
  def ask
    Human.understand(hear)
  end
end
```
この「非言語コミュニケーションに意識を向ける」と術は、会議以外でも使うことが出来ます。
たとえばチームメンバーに実装の質問をするときも。

考えこんでから答えが出てくるのと。
軽く出てくるのでは、違います。

もし答えに時間がかかった場合は。
「そのメンバーが考えたであろうこと」を推測して。
「なにか罠があるのかもしれない」と注意することが出来ます。

そして「はまりそうだ」と思ったら、自分から質問を投げることも出来ます。
もしその人が、くわしく教えてくれるタイプのメンバーではなくても。
他のメンバーにも質問を投げたり。

少なくとも「何か罠があるかもしれない」ということが分かっただけでも価値があります。

このようにひとりのメンバーの性質がつかめると。
逆に同じ人が「考えこまずに答えてくれた時」は「罠がなさそう」と考えることも出来。
逆の位置からそれを指標にすることも出来ます。

こういう意味で「非言語コミュニケーション」は仕事に大いに役立ちます。

あくまでもこれは一例です。
このメソッドは応用が聞くので、ぜひ会議以外のクラスでも継承したり、オーバーライドして使ってやってください。


# 環境

- This world since - ver 2.0.16
- Ruby on Rails programer ( how old are you ) - ver 3.2



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
AWS 認定 DevOps エンジニア – プロフェッショナル 合格

[AWS 認定ソリューションアーキテクト – プロフェッショナル](https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/)に続き、[DevOpsエンジニア – プロフェッショナル](https://aws.amazon.com/jp/certification/certified-devops-engineer-professional/)に合格しました。
総合スコアは70%でギリギリでした。

所感
----
難しかったです。

試験ガイドの通り、大半は"継続的配信とプロセス自動化"についてです。
Beanstalk、Opsworks、Croudformationのサービスに加え、Docker、Chefの知識とそれぞれのできること、できないこと、使いどころの理解がポイントかと思います。
特にAWS3サービスは深い理解が必要で、かなり落としてしまいましたが、他のモニタリング/セキュリティ/可用性・拡張性の分野で得点を稼いでなんとかなりました。


学習ポイント
----

ソリューションアーキテクトのときと同じで、以下を活用しました。

・サンプル問題
・模擬試験
・ユーザガイド

特にBeanstalk、Opsworks、Croudformationの3つのユーザガイドがオススメです。
私は上記3つの運用経験がそれほどあるわけではないのですが、この3サービスの公式ユーザガイドにはユースケースやベストプラクティスが記載されており、試験対策に限らず大変参考になります。
特にCloudformationでできる範囲の広さは衝撃でした。

また、ソリューションアーキテクト プロフェッショナルの時もそうでしたが、[クラウドサービス活用資料集](https://aws.amazon.com/jp/aws-jp-introduction/)やユーザガイドを読み込んでいるうちに、AWSの思想がわかってきます。そうすると問題の選択肢を見たときに、"AWSならこの手法は推奨してこないだろう"とか感覚的にわかってきました。
サービス仕様はユーザガイド、AWSの考え方は[Webinarのトレーニング資料](https://aws.amazon.com/jp/aws-jp-introduction/#training)を読み込むのがいいかと思います。

今後
----
これでAWS認定5つを制覇することができました。
DevOpsの実践についてはまだまだこれからなので、認定取得をスタートラインと考え、"Be Agile"を目指していきます。
親ViewにAuto Layoutで上下左右くっつけるProtocol Extension

#　概要
+ [addSubviewした時に親Viewに対して上下左右くっつけたい](http://qiita.com/AOO_A_ZERO/items/604fa1ec4bead7ef10cd)

こちらの記事を読んで、自分が普段やっている方法を晒してみようと思いました。結果自体は同じです。
親ビュー全体に重なる形でViewを乗っける制約を手軽に設定できるようにします。
例えば通信を伴う画面で、初回の通信中や通信失敗で画面を切り替えたいなどに使っています。

# 実装

例で上げたViewは、あるタイミングでは画面全体を覆いかぶさる形で表示されているという挙動が共通しています。なので、Protocol Extensionに適しているかと思います。

また、先の記事ではVisual Formatを使うと簡単に書けるとコメントがされていましたが、文字列で書くところがあまり好きではないため自分は使っていません。(短くかけるところはすごく魅力的なのですが...)

```swift
protocol ViewConstrainable {
    // auto layoutを張る・表示非表示を指定する用のメソッド
    func overlay(on view: UIView, hidden: Bool)
}

// プロトコルで定義したメソッドをextensionで実装する。
// 型制約でUIViewを継承しているものだけに使えるようにして、
// これに従うクラスへAutolayoutを張れるようにする
extension ViewContrainable where Self: UIView {
    func overlay(on view: UIView, hidden: Bool = true) {
        translatesAutoresizingMaskIntoConstraints = false
        self.hidden = hidden
        view.addSubview(self)
        let constraints = [.Top, .Bottom, .Leading, .Trailing].map { (attr: NSLayoutAttribute) in
            return NSLayoutConstraint(
                item: self,
                attribute: attr,
                relatedBy: .Equal,
                toItem: view,
                attribute: attr,
                multiplier: 1,
                constant: 0
            )
        }
        view.addConstraints(constraints)
    }
}

// Protocol extensionを持たせる
class LoadingView: UIView, ViewContrainable {
}

// こんな感じで使います。ここでは直接初期化していますが、通常はxibを使っています。
let loadingView = LoadingView()
// 大元のviewcontrollerのviewに対して画面を覆うように貼り付ける
loadingView.overlay(on: self.view)
// 表示非表示はhiddenでコントロールしたほうが安全な気がするのでこうしています
loadingView.hidden = false
```

以上です。Protocol Extension化することで必要なViewでだけ扱えるようにしたのと、mapでautolayoutのコードを短くしてみました。
Xcode Server設定で"Xcodeの使用許諾契約の条件に同意する必要があります。"と出た場合の対処法

# 問題
OSX ServerでXcode serverの設定をする際、"はじめにXcodeを選択してください"と書いてあるのでインストール済のXcodeを選択をするのですが、"Xcodeの使用許諾契約の条件に同意する必要があります。"と言われ、先に進めなくなる場合があります。
（ダイアログに書かれているような許諾契約の同意画面は表示されず、念のためXcodeを再インストールしてみましたがこのダイアログは消えませんでした）
<img width="780" alt="server.png" src="https://qiita-image-store.s3.amazonaws.com/0/5699/51699de9-2174-831e-3b57-d9a6dd1eb63b.png">


# 対応方法
下記のコマンドを実行します。
```sudo /Applications/Xcode.app/Contents/Developer/usr/bin/xcscontrol --initialize
```

`xcscontrol`はXcode Serverの管理用コマンドです。その他のオプションについては`man xcscontrol`で確認できます。

```
XCSCONTROL(1)                                                                                 XCSCONTROL(1)

NAME
       xcscontrol - utility for managing Xcode Server

SYNOPSIS
       xcscontrol [options...]

DESCRIPTION
       xcscontrol  is  a  command-line  utility  used  for managing Xcode Server instances. It lives inside
       Xcode, and can usually be found at /Contents/Developer/usr/bin/xcscontrol.

OPTIONS
       -h, --help, --usage
              Prints basic usage information.

       --version
              Displays version information.

       --preflight
              Preflights the Xcode Server service.

       --initialize
              Initializes Xcode Server, must be called before the service is usable.

       --reset
              Resets Xcode Server, removing all service data and stopping all services.

       --restart
              Restart Xcode Server without removing any service data.

       --shutdown
              Stops Xcode Server.

       --health
              Fetches and displays server status and statistics.
```
pip vs conda

#概要
　今までwindows7でpipでパッケージをインストールしていたんだが、GDALがらみでどうしてもfionaが動かなかった。っでうまくいった方法をメモ

#condaとは
  condaはanacondaというパッケージインストーラのインストーラ用のコマンド名である。pythonは一般的には[c:\python27]とかいう配下に[\lib\site-packages]にパッケージをインストールするんだが、anacondaをインストールすると、[c:\anaconda2]の配下に[\packages]にインストールする。ここにはpythonのみならずqtとかGDALとかのpython外パッケージもはいる。つまり、pipというよりはyumやapt-getに近いともいえる。
　また最初pipだけで運用していた人は、２重にインストールすることになる。

　しかし、pipはコンパイルしてインストールするパッケージの場合は,windows7 64環境にはまだまだ実績が少ない感じがする。つまり今回のfionaの場合はこのケースにあたるということである。

　こういう、コンパイルがうまくいかない場合はunofficialサイトにいってwhlでインストールするのが常なのだが、これでもうまくいかないので今回anacondaに移行してうまくいったということである。

#ノウハウ
　あたりまえなんだが、pathの設定をc:\python27;c:\python27\scripts;c:\anaconda2;c:\anaconda2\scriptsとなっているところを削除するc:\anaconda2;c:\anaconda2\scripts;というこである。よくみてみると、anacondaはpipもはいっているので、この設定でpipをすると、anaconda側にインストールされる。
　最初はc:\python27\scriptsを削除していなかったのでipythonのpython2が起動されないで困っていたりした。この設定で元のpipを削除するにはc:\python27\script\pip uninstall [package]とすればいい

#今後
 どうもpython2とpython3の環境の切り替え用設定もあるようなので、そろそろpython3に切り替えようと思っていたので、なかなかお勧めである。
ズンドコキヨシ with PHP

# 空前のズンドコキヨシブーム

[ズンドコキヨシまとめ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)


# n番煎じっぽいけど、PHPでも書いてみた

```php
<?php
mb_language('Japanese');
mb_internal_encoding('UTF-8');

class Zundoko {
    
    const ZUNDOCO_PHRASE = 'ズンズンズンズンドコ';

    public function kiyoshi(){
        $zundokoList = ["ズン", "ドコ"];
        $cache = "";
        do {
            $choice = $zundokoList[mt_rand(0, 1)];
            echo $choice;

            $cache .= $choice;
            $generated = mb_substr($cache, mb_strlen(self::ZUNDOCO_PHRASE) * -1);
        } while (strcmp(self::ZUNDOCO_PHRASE,$generated));
        echo "キ・ヨ・シ！";
    }

}

$zun = new Zundoko();
$zun->kiyoshi();
```

# 実行結果

![f6b706e432b6c6342c4cc6b690128aa3.png](https://qiita-image-store.s3.amazonaws.com/0/109466/89569f9d-d2a0-e782-74a6-0f847d579e10.png)


# 余談

2016/03/18
[ラブ注入した](http://qiita.com/mitsugogo/items/969671e53365f6d12198)
mrubyでSMTP

IoTなネットワークメソッドはHTTP,HTTPS,MQTTなどが一般に使われていますが、なにか忘れていませんか？そうHTTPなんかよりも古くからあるSMTPです。

ということで、mrubyでメールを送ってみました。

![IoTMAIL.png](https://qiita-image-store.s3.amazonaws.com/0/104066/797c9c5c-25e6-dda8-5b3b-12db82e0387b.png)


SMTPサーバはヤフーのアカウントでヤフーメールを使いました。最近のSMTPはSSLだったりするので[mruby-polarssl](https://github.com/luisbebop/mruby-polarssl)を使います。認証はSMTP_AUTHなので[mruby-base64](https://github.com/mattn/mruby-base64)も使いました。

余談ですが[polarssl](https://tls.mbed.org/)は去年ARMに買収されてmbedドメインになっていますね。

[ZRouterでクロス](http://qiita.com/yamori813/items/038027275d21e87388cd)のmruby-polarssl/polarsslのビルドはひっかかるかなとおもったんですが、すんなりビルドできました。

```
def oneline(s)
  line = ""
  while ch = s.read(1)
    line << ch
    if ch == "\n"
      break
    end
  end
  puts line
  line
end

myaddr = "foo@yahoo.co.jp"
toaddr = "bar@yahoo.co.jp"
pw = "himitu"
header = "From: " << myaddr << "\r\nSubject: test\r\n"
body = "MORI MORI Test"

socket = TCPSocket.new('smtp.mail.yahoo.co.jp', 465)

entropy = PolarSSL::Entropy.new
ctr_drbg = PolarSSL::CtrDrbg.new(entropy)

ssl = PolarSSL::SSL.new
ssl.set_endpoint(PolarSSL::SSL::SSL_IS_CLIENT)
ssl.set_authmode(PolarSSL::SSL::SSL_VERIFY_NONE)
ssl.set_rng(ctr_drbg)
ssl.set_socket(socket)

ssl.handshake

oneline(ssl)

ssl.write("EHLO smtp.mail.yahoo.co.jp\r\n")

while true
  res = oneline(ssl)
  if res[0,4] == "250 "
    break
  end
end

plain = Base64::encode(sprintf("%s¥0%s¥0%s", myaddr, myaddr, pw))
auth = "AUTH PLAIN " << plain << "\r\n"

ssl.write(auth)

oneline(ssl)

ssl.write("MAIL FROM:" << myaddr << "\r\n")

oneline(ssl)

ssl.write("RCPT TO:" << toaddr << "\r\n")

oneline(ssl)

ssl.write("DATA\r\n")

oneline(ssl)

mail = ""
mail << header << "\r\n" << body << "\r\n.\r\n"
ssl.write(mail)

oneline(ssl)

ssl.write("QUIT\r\n")

oneline(ssl)

ssl.close_notify

socket.close

ssl.close
```

plainを作っているところは最初<<で連結したら不思議な動作になってしまったのでsprintfにしました。¥0が含まれる文字列ってサポートされてるのかな。。。

FreeBSD/mipsなmrubyで実行するとこんな感じです。

```
# mruby smtp.rb
220 smtp531.mail.kks.yahoo.co.jp ESMTP
250-smtp531.mail.kks.yahoo.co.jp
250-AUTH LOGIN PLAIN XYMCOOKIE
250-PIPELINING
250 8BITMIME
235 ok, go ahead (#2.0.0)
250 ok
250 ok
354 go ahead
250 ok 1457748965 qp 87684
221 smtp531.mail.kks.yahoo.co.jp
```

この仕組みは何かの通知に使えると思いますが、パスワードの管理の問題があります。何にも使ってないアカウントであってもパスワードが漏洩すると偽装の可能性があります。
CoreOSをインストールする

＜準備＞
CoreOS ISO File
ダウンロード先：　https://coreos.com/os/docs/latest/booting-with-iso.html

＜ISOから起動＞
VirtualBoxで仮想マシンを作成しダウンロードしたISOでスタートする
（LiveCDでスタートした状態になる）
メモリは、２GB指定するとHDDは、８GBで作成できるみたい。
（１GBにすると、HDD１２GBになる・・・）

インストール(LiveCDで起動したプロンプトで）
１．cloud_config.ymlを作成
<pre>
\#cloud-config
users:
- name: ① <------------------------
  passwd: ② <----------------------
  groups:
  - sudo
  - docker
</pre>

①任意のユーザ名を指定する

②パスワードのハッシュ値
作り方（LiveCDで起動したプロンプトで）
sudo openssl passwd -1

２．CoreOSのインストール
sudo coreos-install -d /dev/sda -C stable -c cloud_config.yml

３．再起動　（ISOをアンマウントして）
cloud_config.ymlで指定したユーザ名とパスワードでログインできる。

４．dockerでhello-worldを実行してみる
docker hello-world
箇条書きの英語のメッセージが出れば成功！
VisualStudioCodeでフォントのウェイトを指定する

以下の記事はすでに古い情報です。
現在(2019/02/17)は、`editor.fontWeight`という設定が追加されています。

settings.jsonに以下のように記述する。

* Mac:フォント名はスペースを除き、ウェイトはハイフンでつなげて記述する。
* Windows:フォント名はスペースを入れ、ウェイトは半角スペースでつなげて指定する。

源ノ角ゴシック（Source Han Code JP）の指定例

```json
{
    "editor.fontFamily": "SourceHanCodeJP-Light, Source Han Code JP Light",
    "editor.fontSize": 11
}
```
devstackでSwiftだけを立てる

devstackで、1台構成のSwiftを手っ取り早く構築する。
disable_all_servicesで全てのサービスを一度無効にして、
KeystoneとSwiftのみをenableする。

```local.conf
[[local|localrc]]
HOST_IP=${IP Address}
GIT_BASE="http://github.com"

# password
SERVICE_PASSWORD=changeme
SERVICE_TOKEN=$SERVICE_PASSWORD
ADMIN_PASSWORD=$SERVICE_PASSWORD
MYSQL_PASSWORD=$SERVICE_PASSWORD

disable_all_services
enable_service key mysql s-proxy s-object s-container s-account

SWIFT_HASH=changeme
SWIFT_REPLICAS=1
```
Android Bazaar Conference 2016 Spring 基調講演 まとめ (その1)


# Android Bazaar Conference 2016 Spring 基調講演で使われた技術へのリンク

## 基調講演 「Google TensorFlowとAndroidが繋がる未来」

### Part 1 "TensorFlow" by 有山 圭二 有限会社シーリス 代表

* [C-LIS 有山氏の資料](https://speakerdeck.com/keiji/google-tensorflowtoandroidkaxi-karuwei-lai)

* [Tensorflow本家](https://www.tensorflow.org/) [githubでのtensorflow](https://github.com/tensorflow/tensorflow)
* [TensorFlow を使った機械学習ことはじめ](http://www.slideshare.net/ToruUenoyama/tensorflow-gdg)
* [[Python]CIFAR-10, CIFAR-100のデータを読み込む方法](http://qiita.com/supersaiakujin/items/5e9d2b2850e256f99982)


### Part 2 "Vision API" by 佐藤 一憲 Google Cloud Platform Developer Advocate

* 資料。これから。

* 本日の資料as-isではないと思いますが、ほぼおなじものは、同佐藤氏の [Cloud Vision API and TensorFlow](https://speakerdeck.com/kazunori279/cloud-vision-api-and-tensorflow) となります。

#### Borg (佐藤氏が公演中に紹介したGoogleのコンテナ技術)

* 本家 paper: http://static.googleusercontent.com/media/research.google.com/ja//pubs/archive/43438.pdf
* 本家サイト記事 : http://research.google.com/pubs/pub43438.html

* 解説記事
** http://www.infoq.com/jp/news/2015/04/google-borg

#### Vision API

https://www.youtube.com/watch?v=eve8DkkVdhI

#### Cloud Speech API

https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=Google+Cloud+Platform+What+is+Cloud+Speech+API+youtube

とかで、最終的には見えるようになるかも。（まだ公開していない)

httpを２本使って、１つは常に音声を流しっぱなしにして、もう一本で回答を得る形だそうです。
「回れ右」とかそういうのに応じて、回答をもらえる。（言語セレクト不要。リアルタイムに多言語に対応）。

#### Tensorflow

* 学習と、その学習結果を使うの２つのパートに分けれ、それらは別々に利用でき、Androidとかでも学習結果を利用することができる。
* TensorFlowは、分散学習に対応しているので、複数のマシンを利用できたりする。
* 分散処理
** Infinibandなどでinstance間の通信を行う。usのorderで通信させるようにしないと、大量の行列演算が高速化されない。普通のTCPとかだと遅延が大きすぎるため。GoogleではJupiter networkを使って、高速な通信を実現しており、これが、強みになっている。
ズンドコキヨシ with JavaScript (Node.js)

ズンドコキヨシを、見かけたので、JavaScriptでやってみた。

```js:zundo-kiyoshi.js
// ズンズンズンズンドコキ・ヨ・シ!

void function () {
	'use strict';

	var phrase = 'ズンズンズンズンドコ';

	var puts = typeof process === 'object' && process &&
			typeof process.stdout === 'object' && process.stdout &&
			typeof process.stdout.write === 'function' ?
		process.stdout.write.bind(process.stdout) :
		console.log.bind(console);

	var generated = '';
	do {
		var choise = ['ズン', 'ドコ'][Math.random() * 2 | 0];
		puts(choise);
		generated = (generated + choise).substr(- phrase.length);
	} while (generated !== phrase);
	puts('キ・ヨ・シ！');
}();
```

久しぶりに `do {} while ();` とか使ってみた。使う事はほとんど無い。笑

```bat:実行例
$ node zundoko-kiyoshi.js
ドコズンズンドコズンズンズンズンズンズンズンズンズンドコキ・ヨ・シ！
$
```

# 参考

[ズンドコキヨシ with Perl6 - Qiita]
(http://qiita.com/B73W56H84/items/519e27a1aed5e6d5304f)

[ズンドコキヨシまとめ - Qiita]
(http://qiita.com/shunsugai@github/items/971a15461de29563bf90)
upload_max_filesizeを変更するときに合わせて変更する設定


以前[PHPでファイルアップロードの上限サイズを引き上げるときに同時に変更する設定項目](http://xoops.ryus.co.jp/modules/d3blog/details.php?bid=384)に書いたんですが、ちょいちょい参照するので Kobitoでも探せるようにこちらにも(^^;

```upload_max_filesize``` を変更するときは下記関係になるように他2つの設定値も変更必要です。

```memory_limit``` > ```post_max_size``` > ```upload_max_filesize```


# 設定例.htaccess
```
<IfModule mod_php5.c>
    php_value memory_limit = 350M
    php_value post_max_size = 320M
    php_value upload_max_filesize = 300M
</IfModule>
```
AppleTV2でPlex Media Serverにアクセスする

AppleTV4ではPlexMediaServer(PMS)の正式なclientが発表されているようだが、
ATV2,3では使えないようだ（多分）。
jailbreakしたATV2ではPMS clientが動いていたこともあるようだが、現在はだめみたい。

そこで考え出されたのが PlexConnect。
Appleが提供しているTrailersを自前のPMSに置き換えようという仕組みだ。（よく考えるよ、こんなこと）

OSX 10.10の192.168.1.9でPMSが稼働している状態。PMSと同時にPlexConnectを動かす。固定IPが必要。
ATV2は192.168.1.112。jailbreakしてあるがしてなくてもPlexConnectは使える。

https://langui.sh/2013/08/27/appletv-ssl-plexconnect/
の手順に従う。

DownloadできるApple ConfiguratorはOSX 10.11でないと使用できないので
どこからか iPhone Configuration Utility をgetした。

microUSBケーブルで充電専用は使えない（当たり前だが、、、）

最新のPlexConnectは
https://github.com/iBaa/PlexConnect
から入手する。

OSXへのinstallは
https://github.com/iBaa/PlexConnect/wiki/Install-Guide-Mac
適当なところに PlexConnect-master フォルダを置く。


Certificateの手続きが面倒
https://github.com/iBaa/PlexConnect/wiki/Install-Guide-Mac-Certificates
に従い、Terminalで

```
openssl req -new -nodes -newkey rsa:2048 -out ~/Desktop/trailers.pem -keyout ~/Desktop/trailers.key -x509 -days 7300 -subj "/C=US/CN=trailers.apple.com"

openssl x509 -in ~/Desktop/trailers.pem -outform der -out ~/Desktop/trailers.cer && cat ~/Desktop/trailers.key >> ~/Desktop/trailers.pem
```

を実行。
Desktopにできた trailers.cerとtrailers.pemを
PlexConnect-master フォルダの asset/certificates にコピー。

iPhone Configuration Utility  を立ち上げる。
Configuration Profilesをクリック。
CredentialsをクリックしDesktopのtrailers.cerを読み込む。
適当にNameを atv-plex、Identifierを com.atv.plexとか付ける。

ATV2に電源ケーブルを付けた状態でmicroUSBで接続。（電源ないとだめ）
iPhone Configuration Utilitの左側にATV2が表示されるので、
クリックしてConfiguration Profilesをクリック
atv-plexをInstallする。

ATV2ではNetworkの設定でDNSをPMSとPlexConnectを動かす192.168.1.9に設定。
これにより、Trailers・予告編を開こうとすると192.168.1.9のPMSへアクセスするように
偽装できるわけだ。

192.168.1.9のTerminalでPlexConnect-master フォルダに移動し

```
sudo ./PlexConnect.py
```

を一度実行しCTRL-Cで抜ける。

```
cat Setting.cfg
```
で

```
[PlexConnect]
enable_plexgdm = True
ip_pms = 192.168.178.10
port_pms = 32400
enable_dnsserver = True
port_dnsserver = 53
ip_dnsmaster = 192.168.1.1
prevent_atv_update = True
enable_plexconnect_autodetect = True
ip_plexconnect = 0.0.0.0
hosttointercept = trailers.apple.com
port_webserver = 80
enable_webserver_ssl = True
port_ssl = 443
certfile = ./assets/certificates/trailers.pem
allow_gzip_atv = False
allow_gzip_pmslocal = False
allow_gzip_pmsremote = True
loglevel = Normal
logpath = .
```
となっていればＯＫ。

Daemon化したいときは
PlexConnectのフォルダの support/OSXへ移動し

```
sudo ./install.bash
```
を実行する。

```
sudo launchctl unload /Library/LaunchDaemons/com.plex.plexconnect.bash.plist
```
で起動しなくなる。

```
sudo launchctl load /Library/LaunchDaemons/com.plex.plexconnect.bash.plist 
```
で再起動。
BYOP > Application > Message to your friends / family v0.1

This article is for my hackaday.io project (BYOP).
https://hackaday.io/project/9526-bring-your-own-pizero-byop

By way of the message station, you can communicate with your friends or your family.

## Store the message to send

Following is the steps to message communication

1. Prepare `name.txt` and `send.txt` on USB flash having the volume name `BYOP`
2. Boot the PiZero having `FileMessenger` auto run
3. Insert the USB flash to the PiZero
  - `name.txt` and `send.txt` will be overwritten on `/home/pi/BYOP`
  - `rcvd.txt` on `/home/pi/BYOP` will be overwritten on USB flash 
  - for detail see http://qiita.com/7of9/items/947112a811d55a8457f1

Then, your PiZero is ready for BYOP.

## Message exchange using the message station

At the place where you can find the message station, you can get/post the message from/to your friends and family.

1. Connect the GPIO (UART TX/RX/GND) between the message station and PiZero
2. Power on the PiZero
  - PiZero will automatically get/post message using `BYOP-main.py` script
  - If the message station has the 8x2 LCD, you can see the progress of the get/post messages.
3. Shutdown the PiZero
  - TODO: need some shutdown feature (GPIO?)

Then, your PiZero might have messages from your friends or family.  

With the same procedure on `Store the message to send`, you can obtain `rcvd.txt` from PiZero to USB flash. Then you can see the received message on PC/Mac/Linux.
ListView内のwidgetを全て消す方法

ListView内のwidgetを一つづつ消す方法ばかりで
全て消す方法があまりなかったのでメモしておきます。

```
ListView listView = (ListView) findViewById(R.id.hogehoge);
listView.setAdapter(null);
```

もっとスマートな実装方法を知っている方がおりましたら教えて下さい。

参考記事
http://stackoverflow.com/questions/7400475/how-to-remove-listview-all-items
sshの踏み台にするがログインやscpされたくない場合

`git push`を深い箇所にいる端末からしたい。
端末 -> srv1 -> gitサーバ

## 前提

* 踏み台の`.ssh/authorized_keys`には`no-port-forwarding`を設定しないように。
* sshの踏み台にするがログインさせたくないサーバを`srv1`とする。
* 接続元の端末のIPを`192.168.1.40`とする。

## .ssh/authorized_keys

```bash:.ssh/authorized_keys
from="192.168.1.40",command="/sbin/nologin",no-pty,no-X11-forwarding,no-agent-forwarding ssh-rsa AAAAB....
```

> from="192.168.1.40"

* 192.168.1.40からの接続のみ許可

> command="/sbin/nologin"

```bash:以下が使用不可
scp srv1:file.txt .
ssh srv1 bash
```

> no-pty

* command="" 指定を忘れた場合に`ssh srv1 bash`とした時、ログインプロンプトの利用を拒否する。

> no-X11-forwarding

* X転送の拒否

> no-agent-forwarding

* ssh認証エージェントの転送を拒否する(ちょっと理解してない)
mongoDBにコネクトできないときの対処法

チャットアプリを作る上でnode.jsでmondoDBを使うことにしました。ですが使い方がわからなくエラーも出て1時間くらい躓いてしまってググったのですが日本語で書いてある対処法しても解決しなかったです。
アンインストールして再インストールしてっていうの何回かしたんですけど全然だめでした。英語で書いてあるやつを試したらあっさりできたので備忘録ついでに日本語で書いておきたいと思います。


```
warning: Failed to connect to 127.0.0.1:27017, reason: errno:61 Connection refused

Error: couldn't connect to server 127.0.0.1:27017 (127.0.0.1), connection attempt failed 
at src/mongo/shell/mongo.js:146
```

のようなエラーが出たときの対処法


#手順



##/data/dbを作成する

```
$ mkdir -p /data/db
```

上記のコマンドを実行して/data/dbを作成します。




##mongoDBを起動する



```
$ sudo mongod
```


管理者としてmongodコマンドを使います。
そうするとmongoDBが起動します。
ここで初期設定で、ローカルなら http://127.0.0.1:27017 にアクセスします。

It looks like you are trying to access MongoDB over HTTP on the native driver port.

と表示されると思います。



##monge shellを起動する

```
$ mongo
```

上記のコマンドでmongo shellを起動します。




##参考にしたサイト
http://stackoverflow.com/questions/23439343/cannot-connect-to-mongodb-errno61




これで解決できなかったらすみません。
僕はこの手順でエラーを回避することができました。
Rivalry of Two Families of Algorithms for Memory-Restricted Streaming PCA

[Rivalry of Two Families of Algorithms for Memory-Restricted Streaming PCA](http://arxiv.org/abs/1506.01490)を読む


#概要

通常のデータに対するバッチ処理をベースとしたPCAと違い、
ストリームデータに対するPCAは、その問題設定から制約があり、従来手法の通りではうまくいかない。

その制約として挙げられるのは主にデータが逐次的に与えられるため、モデルを更新する必要がある事と、
リソースの問題でメモリ制約が存在する事、がある。
またPCAそのものを評価する場合においても、一般的に再構成誤差のみに注目した評価が行われるが、
実際は各主成分がどのように学習されたかについても評価する必要がある。
これをスペクトル誤差と呼ぶ。

この問題に対しては２種類のアプローチが存在する。
１つ目は確率勾配法に基づいて逐次的に最適化する手法（SPCA）だが、これは主成分が１つの場合のみ収束性が保証されている。
２つ目はデータブロック毎に[べき乗法](https://ja.wikipedia.org/wiki/%E3%81%B9%E3%81%8D%E4%B9%97%E6%B3%95)に基づき共分散行列のべき乗を求め、それを用いて主成分（固有値）を求める手法である（BPCA）。
この時各ブロック毎の経験共分散行列の積により共分散行列のべき乗を近似するのが鍵である。
しかしデータブロックサイズを決定する必要があり、それは簡単ではない。

結局のところ、SGDのPCAは一般的な次元における収束の証明がなされておらず、BPCAはブロックサイズが決定できず、実際問題どちらを採用するのが良いのかもわからない。
本論では、これら問題に対する対処を提案する。

本論では、１つ目の確率勾配法に基づく手法において、主成分数が１つより多い一般的な場合においても収束性を示す。
また２つ目のデータブロックに対するべき乗法においては、ブロックサイズを自動で決定する手法を提案し、
その利用によりより良い収束性が得られる事を示す。

どちらの提案手法も基本的なアプローチとして、対象とする共分散行列の固有ベクトル（固有値）をどれだけ効率よく計算できるかを考えている。
最適化時における各更新ステップでは、SPCAでは１サンプル毎にSGDの要領に沿って固有ベクトルの推測値を更新し、BPCAでは各ブロックに対して、一度に上記SGDと似た要領で固有ベクトルの推測値を更新する。
BYOP > clone programs / add execute mode > v0.1

This article is for my hackaday.io project (BYOP).
https://hackaday.io/project/9526-bring-your-own-pizero-byop

# Setup

Here's how to prepare the programs (FileMessenger and BYOP)

## FileMessenger

### Clone

You can clone from the git repository.

```
$ cd
$ pwd
/home/pi
$ git clone https://github.com/yasokada/python-160227-FileMessenger.git
Cloning into 'python-160227-FileMessenger'...
remote: Counting objects: 14, done.
remote: Total 14 (delta 0), reused 0 (delta 0), pack-reused 14
Unpacking objects: 100% (14/14), done.
Checking connectivity... done.
```

### Change mode 

It is advised to add "execute" mode to the main script.

```
$ cd python-160227-FileMessenger
$ ls
FileMessenger.py  LICENSE
$ chmod +x FileMessenger.py
$ ls -lrt
total 8
-rw-r--r-- 1 pi pi 1067 Mar 12 08:22 LICENSE
-rwxr-xr-x 1 pi pi 1096 Mar 12 08:22 FileMessenger.py
```

## BYOP

### Clone

You can clone from the git repository.

```
$ cd
$ pwd
/home/pi
$ git clone https://github.com/yasokada/python-160224-BYOP-main.git
Cloning into 'python-160224-BYOP-main'...
remote: Counting objects: 112, done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 112 (delta 14), reused 0 (delta 0), pack-reused 85
Receiving objects: 100% (112/112), 17.24 KiB | 0 bytes/s, done.
Resolving deltas: 100% (38/38), done.
Checking connectivity... done.
```

### Change mode

It is advised to add "execute" mode to the main script.

```
$ cd python-160224-BYOP-main/
$ ls
BYOP-main.py  dummySerial.py  LICENSE  toLearn
$ chmod +x BYOP-main.py 
$ ls -lrt
total 20
drwxr-xr-x 2 pi pi 4096 Mar 12 08:26 toLearn
-rw-r--r-- 1 pi pi 1067 Mar 12 08:26 LICENSE
-rw-r--r-- 1 pi pi  625 Mar 12 08:26 dummySerial.py
-rwxr-xr-x 1 pi pi 7965 Mar 12 08:26 BYOP-main.py
```
golangでlogを標準出力とテキストファイルの2箇所の出力する

2箇所に出力したい場合、io.MultiWriterが便利。

```go
logfile, err := os.OpenFile("./test.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
if err != nil {
	panic("cannnot open test.log:" + err.Error())
}
defer logfile.Close()

// io.MultiWriteで、
// 標準出力とファイルの両方を束ねて、
// logの出力先に設定する
log.SetOutput(io.MultiWriter(logfile, os.Stdout))

log.SetFlags(log.Ldate | log.Ltime)
log.Println("Log!!")
```
ESP8266 > Link > FTDI Auto Program

http://qiita.com/7of9/items/984efd637a8266e304bc
を準備していくなかで macsbug さんのページに関連記事があったように思い出した。

以下であった。
https://macsbug.wordpress.com/2016/02/12/esp8266-ftdi-auto-reset/

たくさんの情報がまとめられている。
ESP8266 > RTS / DTR > 無安定マルチバイブレータ？ > IO0 / RESET の変化の考察

http://qiita.com/hotchpotch/items/8a6fe6b8b0026ac6218e
が気になった。

回路的には「無安定マルチバイブレータ」「非安定マルチバイブレータ」に似ている。トランジスタのベースにコンデンサがないのはいいのだろうか。(コンデンサの役割は未学習. 時定数RCと関係していただろうか)。

H/Lの変化を考えてみた。

[IOの変化 @ mindmup](https://atlas.mindmup.com/2016/03/af2d3f90ca07013323bb2710a126fb53/esp8266_rts_dtr/index.html)

結果として IO0, RESET は以下の変化になるように思う。

| Time | IO0 | RESET |
|:-:|:-:|:-:|
| 1.0A | Lになる | Hのまま |
| 1.0B | Lのまま | Lになる |
| 1.0M | Hになる | Lのまま |
| 1.1X | Hのまま | Hになる |

これで良かったのだろうか？

<hr>
無安定マルチバイブレータによるH/Lの変化の時系列変化を３ヶ月前に本で見た気がするが、どの本だったか思い出せない。
PureScriptの型クラス階層

![hierarchy.png](https://qiita-image-store.s3.amazonaws.com/0/64695/cdd5cb4b-61a5-804a-f763-fd537e502337.png)


```dot
digraph G {
    rankdir="BT";
    aize ="4,4";

    Apply -> Functor;
    Applicative -> Apply;
    Bind -> Apply;
    Monad -> Applicative;
    Monad -> Bind;
    Traversable -> Functor;
    Traversable -> Foldable;
    MonadPlus -> Monad;
    MonadPlus -> Alternative;
    Alternative -> Plus;
    Alternative -> Applicative;
    Plus -> Alt;
    Alt -> Functor;
    Extend -> Functor;
    Comonad -> Extend;
    MonadEff -> Monad;


    Monoid -> Semigroup;


    Ord -> Eq;
    Enum -> Bounded;
    BoundedOrd -> Ord;
    BoundedOrd -> Bounded;
    BooleanAlgebra -> Bounded;


    Category -> Semigroupoid;
    Costrong -> Profunctor;
    Choice -> Profunctor;
    Strong -> Profunctor;
    Wander -> Strong;
    Wander -> Choice;
    Arrow -> Category;
    Arrow -> Strong;
    ArrowZero -> Arrow;

    ModuloSemiring -> Semiring;
    Ring -> Semiring;
    DivisionRing -> Ring;
    DivisionRing -> ModuloSemiring;
    Num -> DivisionRing;

    Bitraversable -> Bifunctor;
    Bitraversable -> Bifoldable;
}

```

* http://www.webgraphviz.com/
技術英語 > code of conduct / dress code / terms of use

> code

LOEで聞いたかと思ったが気のせいだった。最近聞いているLOEでは検索にひっかからなかった。

<hr>

> code of conduct
http://eow.alc.co.jp/search?q=code+of+conduct&ref=sa
> 行動準則［規範］、行為規範

Voyagerで出てきたようにも思う。prime directiveの方だったかもしれない。

<hr>

> dress code
http://eow.alc.co.jp/search?q=dress+code
> ドレスコード、服装規制［規定］

ビバリーヒルズ青春白書でブレンダがドレスコードのあるレストランに入れるのを止められるエピソードがあった。

<hr>
関連して思い出したのは

> terms of use
http://eow.alc.co.jp/search?q=terms+of+use
> 利用規約

時々見かける気がするが、具体的に最近どこで見たかは忘れた。
bootstrapのdropdownメニューを作るときに注意したいjquery読み込みのルール

#背景

web開発をしていて、トグルメニュー作ろうとしてた。やり方としてはjquery.min.jsをダウンロードしてローカルから読み込む。

デベロッパーツール使ってファイルが読み込めていることは確認できているが、ドロップダウンのボタンを押しても、中身のリストが表示されない。


#コードの訂正前

何が間違っているのか、クイズです、笑
ここに大きな間違いが一個あります。。。 たぶんbootstrapのdocumentとか見れば書いてあるのかもだけど見なかった（）


```dropdown.html

<!DOCTYPE html>

<html>
	<head>
		<meta charset="utf-8">
		<title>practice of bootstrap</title>
		<link rel="stylesheet" type="text/css" href="css/bootstrap-theme.min.css">
		<link rel="stylesheet" type="text/css" href="css/bootstrap.min.css">

	</head>
	<body>


	<div class='container'>		
		<div class='row'>
			<div class='col-xs-12'>

				<div class='dropdown'>
					<button class='btn btn-default dropdown-toggle' type='button' id='dropdownmenu' data-toggle='dropdown'>
						Dropdown
						<span class='caret'></span>
					</button>
					<ul class='dropdown-menu' aria-labelled-by ='dropdownmenu'>
						<li><a href="#">1 Some text</a></li>
						<li><a href="#">2 Some text</a></li>
						<li><a href="#">3 Some text</a></li>
					</ul>

				</div>
			</div>
		</div>
	</div>
	<script src = 'js/bootstrap.min.js'></script>
	<script src = 'js/jquery.min.js'></script>

	</body>
</html>

```


#正解は。。

javascriptを読み込んでいるところの順番がいけなかったみたい。

```
jquery.jsがbootstrap.jsよりも後にあると、
諸々正常に動作しないことがある。
```

っていう現状らしい。こんなささいなことに一時間費やしたんだから、もう絶対覚えて２度とこんなしょうもない間違いはしない。。

次から順番入れ替えも試してみることにしょう。
MAMP(localhost)を使った際に、「.html」ファイル内に書かれたphpが動かなかった時の対処 

/Applications/MAMP/htdocs/
に .htaccessファイルを追加。

AddType application/x-httpd-php .php .html

をファイル内に書けばOK！！

これにより、
macで、mampを使い、ブラウザで、localhostを叩いたときに、
.htmlのファイル内に書かれたphpが動いてくれる。

今回は、
<?php include("header.html"); ?>
という処理を行っていた。

《関連》
また今回は行っていないが、htaccessを有効にする方法がこちら。
/Applications/MAMP/conf/apache/httpd.confの中を修正
<Directory>
  Options Indexes FollowSymLinks
  AllowOverride All
</Directory>

ALL / None で
有効 / 無効　を切り替えるみたい。

確認したところ、Noneだったが、なぜか問題はなかった。 


《余談》
seo的に、.htmlか.phpかという選択については、
現在のところ、どっちも変わらないとのこと。
しかし、htmlファイルを、途中で、phpファイルに変更してしまうと、
urlが変わるのと一緒なのでこれまでの評価がなくなるとのこと。
もし変えるなら、リダイレクト処理をしっかり設定する必要があるが、
一番は変えずに、.htmlで、phpを動かせるようにした方がよいらしい。

一方、
今回は、すべてのファイルで、．ｈｔｍｌで、phpを使えるように設定したが、
特定のファイルだけを指定する.htaccess設定方法もあるみたい。
そっちの方がサーバーの負担を減らせるとのこと



《参考url》
http://whitebear-seo.com/htmlfile-extension-php/
http://marycore.jp/prog/mamp/configuration-for-mamp/
http://qiita.com/konweb/items/13fcc1417588e7692ad9
JavaScriptの配列の生成方法の違い 〜リテラル `[]` とコンストラクタ `new Array()` 〜

# 先に結論

2要素以上の空配列を生成したい場合以外では、リテラルのほうが良さそう

# サンプル

## コンストラクタ

```js:
var a = new Array();                 //要素数0の空配列 []
var b = new Array(2);                //要素数2の空配列 [ , ]
var c = new Array(3.14);             //runtime error
var d = new Array(1, 'constructor'); //[1,'constructor']
```

## リテラル

```js
var a = [];             //要素数0の空配列 []
var b = [2];            //[2]
var c = [3.14];         //[3.14]
var d = [2, 'literal']; //[2, 'literal']
```

# 比較

* コンストラクタでは要素数を指定した空配列の生成が可能
* コンストラクタでは数値データ1つのみの配列の生成は出来ない
* 使用するエンジンや実行環境によるものの、**リテラルのほうが早い**[^1]

[^1]: [リテラル, コンストラクタ, それぞれのオブジェクト生成方法のプロファイリングをやってみた - きたけーのアウトプット](http://d.hatena.ne.jp/kitak/20120508/1336477865)  

* `Array`をユーザが再定義している場合コンストラクタは使えなくなる[^2]

[^2]: Arrayは予約語ではないので再定義できてしまう [予約語 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Reserved_Words)

* [MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array)でリテラルのほうを積極的に使用している
* **[JavaScript: The Good Parts](http://www.amazon.co.jp/gp/product/4873113911/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873113911&linkCode=as2&tag=macoril-22)でリテラルの使用が勧められている**ようだ[^3]

[^3]: 「new Objectとnew Arrayの利用も避けるべきである。代わりに {} と [] を使えばよい」 via [[JavaScript][読書] 『JavaScript:The Good Parts ―「良いパーツ」 - itouhiroメモ](http://d.hatena.ne.jp/itouhiro/20091206)

# 余談 〜オブジェクトの場合〜

オブジェクトのリテラル `[]` とコンストラクタ `new Object()` についても同様に、

* **リテラルのほうが早い**[^1]
* コンストラクタが再定義されてしまう懸念がある
* **[JavaScript: The Good Parts](http://www.amazon.co.jp/gp/product/4873113911/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&camp=247&creative=1211&creativeASIN=4873113911&linkCode=as2&tag=macoril-22)でリテラルの使用が勧められている**よう[^3]

なので、リテラルで良さそう。

[Object - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object)
[javascript - What is the difference between `new Object()` and object literal notation? - Stack Overflow](http://stackoverflow.com/questions/4597926/what-is-the-difference-between-new-object-and-object-literal-notation)

<iframe src="http://rcm-fe.amazon-adsystem.com/e/cm?lt1=_blank&bc1=000000&IS2=1&bg1=FFFFFF&fc1=000000&lc1=0000FF&t=macoril-22&o=9&p=8&l=as1&m=amazon&f=ifr&ref=qf_sp_asin_til&asins=4873113911" style="width:120px;height:240px;" scrolling="no" marginwidth="0" marginheight="0" frameborder="0"></iframe>
ズンドコキヨシ with Go (n番煎じ)

- 元ネタ: http://qiita.com/y__sama/items/7c451dfd706f9b36729d
- 拙作PHP: http://qiita.com/shinderuman@github/items/7c432e8cb7719d35342a
- PHPが楽しかったので勉強がてらgoでも書いてみた

### 5個ずつキヨシる

```go
package main

import (
        "fmt"
        "math/rand"
        "time"
)

func main() {
        z := "ズン"
        d := "ドコ"
        zd := [5]string{z, z, z, z, d}
        ch := make(chan bool)

        go func() {
                for {
                        rand.Seed(time.Now().UnixNano())
                        var zundoko [5]string
                        j := 0
                        for _, i := range rand.Perm(len(zd)) {
                                zundoko[j] = zd[i]
                                j = j + 1
                        }
                        if zd == zundoko {
                                ch <- true
                                break
                        }
                }
        }()
        <-ch
        fmt.Println("キ・ヨ・シ！")
}
```

### 1個ずつキヨシる

```go
package main

import (
        "fmt"
        "math/rand"
        "reflect"
        "time"
)

func main() {
        z := "ズン"
        d := "ドコ"
        zd := []string{z, d}
        zundoko := []string{z, z, z, z, d}
        var zzdoko []string

        rand.Seed(time.Now().UnixNano())
        for {
                zzdoko = append(zzdoko, zd[rand.Intn(2)])
                if len(zzdoko) < 5 {
                        continue
                }
                if reflect.DeepEqual(zundoko, zzdoko[len(zzdoko)-5:]) {
                        fmt.Println(zzdoko)
                        break
                }
        }
        fmt.Println("キ・ヨ・シ！")
}
```
GitHubへのアクセスでPermission denied (publickey).のエラーが表示される時の対応


[GitHub Help](https://help.github.com/articles/set-up-git/)



## チェックポイント
 1. 秘密鍵（id_rsaファイル）の確認
 2. SSH設定（.ssh/config）の確認
 3. 公開鍵の追加先（.ssh/known_hosts）の確認

## 手順

### sshのデバッグモード、仮想端末の割り当てなしで、ログインできるか確認する
単純な、『ssh git@github.com』コマンドだと必要な情報が得られないので、デバッグモードを有効にする

```
$ ssh -vT git@github.com

// どこのSSH設定ファイルを読み込んでいるか？
debug1: Reading configuration data /home/hoge/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
〜〜〜
// 公開鍵の追加先はどこか？
debug1: Host 'github.com' is known and matches the RSA host key.
debug1: Found key in /home/hoge/.ssh/known_hosts:1
〜〜〜
// どの秘密鍵を利用しようとしているか？
debug1: Trying private key: /home/hoge/.ssh/id_dsa
debug1: Trying private key: /home/hoge/.ssh/id_ecdsa
```


### SSH設定（.ssh/config）の確認
『Host github.com』部分が、『Host github』になっていると動きません。正しくは、『Host github.com』か、『Host github*』
 
```.ssh/config
$ cat .ssh/config

Host github.com
  IdentityFile ~/.ssh/github_rsa
```

### 秘密鍵の確認
 * ドキュメントを見る限り秘密鍵のファイル名に指定はないようだけど、海外のサイトではわりと『.ssh/github_rsa』と記載されている
 * 試してみるとこちらのファイルを利用するよう
 * ファイル名の違いのみなので、『id_rsa』->『github_rsa』に変更


### 確認後、再度接続してみると、正常にログインできる、ハズ……

```
$ ssh -vT git@github.com

debug1: Reading configuration data /home/hoge/.ssh/config
debug1: /home/hoge/.ssh/config line 1: Applying options for github.com
debug1: identity file /home/hoge/.ssh/github_rsa type -1
debug1: Trying private key: /home/hoge/.ssh/github_rsa
〜〜〜
Enter passphrase for key '/home/hoge/.ssh/github_rsa': {パスワード入力}
〜〜〜
Hi hoge! You've successfully authenticated, but GitHub does not provide shell access.
```
TypeScriptでのイベント名を管理・指定するもう一つの方法(＋ストリングリテラル型にも対応)

[TypeScriptでのイベント名をclickで指定するのはもう辞めよう](http://qiita.com/tonkotsuboy_com/items/b32801246ec14f444514)という記事を読んで。[ActionScriptでも同様な管理](http://help.adobe.com/ja_JP/FlashPlatform/reference/actionscript/3/flash/events/Event.html#constantSummary)を公式が用意してくれていたのでとても便利だったのを思い出しました。ところがTypeScriptはあんまり公式でこういったものを用意してくれません。こういったコードの安全性やメンテナンス製に関わる箇所は公式が運用を広めるべきなんですが…。

## namespace + const

さて、TypeScriptでは上記の方法以外にもいい方法があります。それは`namespace`と`const`を使う方法です。

```ts

/**
 * イベント名を列挙したネームスペース
 */
export namespace EventName{
	export const LOAD = "load";
	export const CLICK = "click";
	export const MOUSE_MOVE = "mousemove";
}

window.addEventListener(EventName.LOAD, ()=>{alert("ウィンドウのロードが完了しました。")});

```

EnumClass[^1]をつかった方法に比べると以下の利点があります。

 1. `const`で宣言できるので再代入がコンパイルエラーになる
  * EnumClassでスタティックプロパティとして定義した場合、再代入してもTypeScriptのチェックをすり抜けます
  * ActionScriptとは異なり[TypeScriptはクラス内で`const`を定義できません](http://qiita.com/ConquestArrow/items/494d798a4e0788c41a7c#-class) [^2]
 2. 無駄にクラスを作らず無駄が無い
  * クラスとして作ると、使いたい定数以外にコンストラクタや`prototype`プロパティなど不要なフロパティも生成され、無駄が多いです
  * TypeScriptの`namespace`は只の`Object`なのでシンプルです


## ストリングリテラル型 + namespace + const

TypeScript1.8から **ストリングリテラル型** が入りました。イベント名のような文字列で指定するものを型チェックできるもので、より厳密なチェックができます。


```ts

type SomeEvent = "click" | "load" | "mousemove";
function doSomething(ev: SomeEvent){}

doSomething("click");	//compile ok
doSomething("klik");	//compile error
```

ただし、この厳密さは上記のものにも適応され、そのままではコンパイルエラーになります。

```ts:文字列型はストリングリテラル型と合わないので中身が同じでもエラーになる
doSomething(EventName.CLICK); //compile error
```

ストリングリテラル型にも対応したイベント名の管理方法は以下になります。

```ts:ストリングリテラル型として定義

/**
 * イベント名を列挙したネームスペース(ストリングリテラル型ver.)
 */
export namespace EventName{
	export const LOAD:"load" = "load";
	export const CLICK:"click" = "click";
	export const MOUSE_MOVE:"mousemove" = "mousemove";
}

doSomething(EventName.CLICK);	//ok
```

文字列のEnumがないTypeScriptで、文字列Enumっぽいことをするには現状これが一番近いと思います。

## まとめ

 * TypeScriptのイベント名は`namespace`+`const`の管理方法もある
 * 無駄が少なく、再代入防止というメリットがある
 * ストリングリテラル型+`namespace`+`const`で文字列のEnumっぽくチェックと管理ができる

[^1]: 特にTSで名前はついてないと思いますが、ASではそう呼ばれていたと記憶しています
[^2]: ただし、近い将来[`readonly`がプロパティに対して付けられるようになる](https://github.com/Microsoft/TypeScript/pull/6532)ので、メソッド等と一緒に管理するならその方法もありだと思います
ズンドコキヨシ with Elixir

よくわからないけど、[「ズンドコキヨシ」を書けばいいらしい](http://qiita.com/B73W56H84/items/519e27a1aed5e6d5304f#%E3%81%82%E3%82%8F%E3%81%9B%E3%81%A6%E8%AA%AD%E3%81%BF%E3%81%9F%E3%81%84)

```ex:zudokiyon.exs
defmodule Zudokiyon do
  def zudo!, do: zudo([])

  defp zudo([:do, :zu, :zu, :zu, :zu]), do: format(:ki) |> IO.puts
  defp zudo(list), do: [tap(generate_zudo, &write/1) | list] |> Enum.take(5) |> zudo

  defp generate_zudo, do: Enum.random([:zu, :do])

  defp tap(v, f), do: (f.(v); v)

  defp write(zudo), do: zudo |> format |> IO.write
  defp format(:ki), do: "キ・ヨ・シ！"
  defp format(:zu), do: "ズン"
  defp format(:do), do: "ドコ"
end

Zudokiyon.zudo!
```
Raspberry Piで、起動後にUSBモデムを自動認識する

# 背景
既に消えかかっている、世のUSBモデムは、遠隔制御のような用途を考えると、Raspberry Piと相性が良い。
ところが、世のUSBモデムは、ゼロインストールのために、最初はCD-ROMに見える仕掛けが入っており、Linuxと相性が悪い。
LinuxでUSBモデムを使うには…。

# 今回のUSBモデム
たまたま中古品を3980円で手に入れることができた、L-03D。
VID=0x1004, PID=0x6327(CD-ROM時), PID=0x6326(モデム時)。

# CD-ROMからモデムへ
## usb_modeswitch
ググると、まずこれが出てくる。文字通り、USBのモードを変えてくれる。
今現在、既にデフォルトで、`/lib/udev/rules.d/40-usb_modeswitch.rules`に、L-03DのVID/PIDの記載がある。
さらに、`/etc/usb_modeswitch.d/1004:6327`に内容を記載する必要がありそうだが、検索で出てくる内容を適当にコピペしただけでは、何故か動かない。
usb_modeswitchのバージョンが違うのか、L-03Dのファームウェアのバージョンが違うのか、はたまたググって見つけた情報が古いのか。きっと自分のググり力の問題。

## eject
さらにググると、`eject /dev/sr0`とすれば、CD-ROMからモデムに変化するとある。簡単そうじゃん。
`lsusb`で確認すると、`eject`前後で、確かにPIDが0x6327から0x6326に変わる。

# モデムからttyへ
ただ、PIDが0x6326に変わっても、`/dev/ttyUSB?`は現れない。
PIDが変わった後に、`modprobe usbserial vendor=0x1004 product=0x6326` と打つと、確かにttyが現れる。

# 起動時の自動化
でもこれ、手で打っていたら、遠隔制御できない。起動後に自動的にやって欲しい。
usb_modeswitchなら自動的にやってくれそうだけど、なんか動かないし、どうしよう。
そこで、udev。usb_modeswitchの設定を真似しながら…

```:/etc/udev/rules.d/50-l03d.rules
ATTRS{idVendor}=="1004", ATTRS{idProduct}=="6327", RUN+="/usr/bin/eject /dev/sr0"
ATTRS{idVendor}=="1004", ATTRS{idProduct}=="6326", RUN+="/sbin/modprobe usbserial vendor=0x1004 product=0x6326"
```

とかしたらうまく行くんじゃ? 再起動して…

```shell-session
$ ls /dev/ttyUSB*
/dev/ttyUSB0  /dev/ttyUSB1  /dev/ttyUSB2  /dev/ttyUSB3
```

うまく行った。

# 蛇足
- PPPで自動的にAPNにつながらないと遠隔操作的には意味がない。RUNでやらせてしまう手もあるが、udevの役割ではない気もする。`/etc/rc.local`で`pon`したら、つながった。
- udevでRUNされる時は、`/usr/bin`にはパスが通っているが、`/sbin`にはパスが通っていなかった気がする。とりあえずudevのrulesにフルパスで記載。
- OSXやWindowsの専用ドライバでは、Ethernetに見えて、IPv6も使える。Linuxでttyに見せると、pppdの設定に`+ipv6`を追加しても、リンクローカルが設定されない?(詳細未確認) Ethernetに見えればIPv6が使える気がするので、NDIS化試行中。
- L-03Dは、USB上は500mAとなっているが、取説的にはmaxで680mA。2AなどのACアダプタと、`/boot/config.txt`の`max_usb_current=1`設定による電流リミット解除が必要か。消費電力は、電波状態によると思うが、typicalには300mAくらいか。

# ダメ出し
`/dev/sr1`とかだったら、ダメじゃん。
Rails4, bootstrap3, modalが表示されない

#問題
『[パーフェクトRuby on Rails](http://gihyo.jp/book/2014/978-4-7741-6516-5)』第６章
modalを表示するはずのボタンを押しても何も起きない。
ブラウザをchromeからSafariに変えても、[サポートページ](http://gihyo.jp/book/2014/978-4-7741-6516-5/support)のviewファイルを使っても解決しない。

#解決
BootstrapのJavascriptがrequireされていなかった（すごく恥ずかしい）。


```lang:/app/assets/javascript/application.js
//省略

//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require bootstrap   // 追加
//= require_tree .
```

#なぜこの問題が起きたか
あとでわかったことだがこの問題は普通は起きない。なぜ起きたか。

##[Rails tutorial](http://railstutorial.jp/)でbootstrapの使い方を学んだため。
[Rails tutorial第５章でbootstrapの使い方を学ぶ](http://railstutorial.jp/chapters/filling_in_the_layout?version=4.2#sec-custom_css)と、bootstrapのjavascript側の設定をしない。
これで設定完了と思い込んでしまった。

##本書６章序盤のbootstrap3の設定を読み飛ばしたため。
bootstrapのcss機能は使えるようになっていたため、bootstrapは設定ができており不要と判断してしまった。

##modal機能が何に依存しているかすら知らなかったため。
完全写経状態で内容理解が追いついておらず、modal機能がどこから来るのか知らなかった。

#感想
『[練習は嘘をつかないって言葉があるけど、頭を使って練習しないと普通に嘘つくよ。](https://twitter.com/faridyu/status/15897716977)』（ダルビッシュ有）
わからないところを完全にすっ飛ばしてやる写経は害ですらあるのかもしれない。
PC上の全てのユーザー名を取得するプログラム(拡張版)

以前書いた[PC上の全てのユーザー名を取得するプログラム](http://qiita.com/AinoMegumi/items/f46dc3f6da4bb62e622e)を拡張し、net user (ユーザー名)で出てくる、２行目のフル ネームも取得できるようにしてみました。ちなみにフル ネームがない場合はユーザー名が出てくるようにしてあります。

これは私のPCで「net user AinoMegumi」というコマンドを実行した時の出力結果の上２行です。
![get_user.png](https://qiita-image-store.s3.amazonaws.com/0/94629/6acea43d-1749-18ec-fd2f-756ce950f25d.png)


```cpp:get_all_user_info.cpp
#ifndef UNICODE
#define UNICODE
#endif
#include <Windows.h>
#include <string>
#include <vector>
#include <LM.h>

std::vector<std::pair<std::wstring, std::wstring>> get_all_user() {
	std::vector<std::pair<std::wstring, std::wstring>> re;
	PVOID pv;
	DWORD n, i = 0, err;
	do {
		switch (err = NetQueryDisplayInformation(0, 1, i, MAXDWORD, MAX_PREFERRED_LENGTH, &n, &pv))	{
		case 0:
		case ERROR_MORE_DATA:
			if (n) {
				PNET_DISPLAY_USER p = (PNET_DISPLAY_USER)pv;
				do {
					i = p->usri1_next_index;
					if (std::wcslen(p->usri1_full_name) == 0) re.emplace_back(std::make_pair(p->usri1_name, p->usri1_name));
					else re.emplace_back(std::make_pair(p->usri1_name, p->usri1_full_name));
					//                  DbgPrint("<%S> <%S>\n", p->usri1_name, p->usri1_comment);
					
#if 0   // for C++ Builder XE4
					OutputDebugString(p->usri1_name);
#endif

				} while (p++, --n);
			}
			NetApiBufferFree(pv);
			break;
		}
	} while (err == ERROR_MORE_DATA);
	return re;
}
```
使い方例(この関数をget_all_user_info.hに書いたと仮定)

```cpp:main.cpp
#include <iostream>
#include "get_all_user_info.h"
int main() {
	std::wcout.imbue(std::locale(""));
	for (auto& i : get_all_user()) {
		std::wcout << i.first << ", " << i.second << std::endl;
	}
	std::getchar();
	return 0;
}
```
実行結果
![get_user_result.png](https://qiita-image-store.s3.amazonaws.com/0/94629/26a4212a-64c0-760e-5bae-68a7aac216b1.png)

HomeGroupUser$出ないようにしようかなとも考えたんですが、まあいいやってことでその処理してません。
ちなみに、当然これもnetapi32.libのリンカー指定が必要です。