OmniAICreator/Qiita-1.07M huggingface dataset:
ng-animate-swap - AngularJS v1.5

[AngularJS Advent Calendar 2015](http://qiita.com/advent-calendar/2015/angularjs) 7日目の投稿です。
v1.5 で追加された ng-animate-swap についてです。

## ng-animate-swap
ng-animate-swap は v1.5 で新たに追加された `directive` で、特定のブロックの内容を、アニメーションで切り替えるための `directive` です。紹介されていたサンプルでもそうですが、要はローテーションバナーのような動きを実現するためのものです。
アニメーションというだけあって、`ngAnimate` の読み込みが必要になります。

## サンプルを見てみる
[Plunker](http://plnkr.co/edit/xAuvOc7lkNvs0TsUiysj?p=preview) にあるよとのことなので、見てみます。[API Doc](https://docs.angularjs.org/api/ngAnimate/directive/ngAnimateSwap)にもあったので残しておきます。

使用方法は以下の通りです。

```html
<div class="banner-container">
  <img ng-src="{{ currentBannerImage }}"
       class=”animate-banner”
       ng-animate-swap="currentBannerImage" />
</div>
```

`ng-animate-swap="currentBannerImage"` と追加するとその要素が対象になります。
このサンプルだと `currentBannerImage` の値を監視し続けて、値(画像パスが)が変わった場合のみ `ng-animate-swap` によるコンテンツ（画像）の差し替え処理がおこなわれます。特に画像に限るわけではないので、特定のコンテンツにアニメーションをつけて切り替えたい場合などで利用できます。

```html
<div class="container">
  <div class="xxx" ng-animate-swap="myModel">
    コンテンツ
  </div>
</div>
```

とかでもOK。

通常この手のものを作る時は先に全ての `DOM` をレンダリングさせてから表示切り替えをやったりしますが、上記をみるとタグ1つで簡潔に記述できるのが良いところ。実際は、アニメーションの開始時に `DOM` の挿入、アニメーション終了時に `DOM` の削除をおこなっています。この辺は `ngAnimate` の機能がやってくれています。


## ソースを見てみる

[ngAnimateSwap.js](https://github.com/angular/angular.js/blob/master/src/ngAnimate/ngAnimateSwap.js#L84-L110) にありました。

```js
var ngAnimateSwapDirective = ['$animate', '$rootScope', function($animate, $rootScope) {
  return {
    restrict: 'A',
    transclude: 'element',
    terminal: true,
    priority: 600, // we use 600 here to ensure that the directive is caught before others
    link: function(scope, $element, attrs, ctrl, $transclude) {
      var previousElement, previousScope;
      scope.$watchCollection(attrs.ngAnimateSwap || attrs['for'], function(value) {
        if (previousElement) {
          $animate.leave(previousElement);
        }
        if (previousScope) {
          previousScope.$destroy();
          previousScope = null;
        }
        if (value || value === 0) {
          previousScope = scope.$new();
          $transclude(previousScope, function(element) {
            previousElement = element;
            $animate.enter(element, null, $element);
          });
        }
      });
    }
  };
}];
```

`$transclude` で新しい `template` として扱われて `DOM` に追加するようになってますね。

あと、しれっと `for` が `$watchCollection` で監視対象になってます。
なので、以下のように  `for="xxx"` と指定しても動きます。

```html
<div class="banner-container">
  <img ng-src="{{ currentBannerImage }}"
       class=”animate-banner”
       ng-animate-swap for="currentBannerImage" />
</div>
```


## まとめ
限定的な用途になりそうではあるけれども、知らずに自作するよりははるかに簡単です。
見た目も見やすいですしね（若干の黒魔法感は否めません）


## 参考
[http://angularjs.blogspot.jp/2015/11/angularjs-15-beta2-and-14-releases.html](http://angularjs.blogspot.jp/2015/11/angularjs-15-beta2-and-14-releases.html)
[http://plnkr.co/edit/xAuvOc7lkNvs0TsUiysj?p=preview](http://plnkr.co/edit/xAuvOc7lkNvs0TsUiysj?p=preview)
[https://docs.angularjs.org/api/ngAnimate/directive/ngAnimateSwap](https://docs.angularjs.org/api/ngAnimate/directive/ngAnimateSwap)
メモ：SDカードイメージをマウントするならkpartxが楽

参考： [Ubuntu Manpage: kpartx(8)](http://manpages.ubuntu.com/manpages/wily/man8/kpartx.8.html)

たまにSDカードのディスクイメージをマウントしたいときに、使い方を忘れるのでメモ。
kpartxはディスクイメージのパーティションテーブルを読み取って、パーティションごとにデバイスマップを作成してくれる。

マップを作成するにはaオプション。(vオプションは単なる動作確認用)

```
$ sudo kpartx -av sdcard_raspi.img
[sudo] password for user:
add map loop0p1 (252:0): 0 114688 linear /dev/loop0 8192
add map loop0p2 (252:1): 0 7917568 linear /dev/loop0 122880

$ ll /dev/mapper
合計 0
drwxr-xr-x  2 root root     100 11月 17 00:18 ./
drwxr-xr-x 18 root root    4380 11月 17 00:18 ../
crw-------  1 root root 10, 236 11月 16 23:57 control
lrwxrwxrwx  1 root root       7 11月 17 00:18 loop0p1 -> ../dm-0
lrwxrwxrwx  1 root root       7 11月 17 00:18 loop0p2 -> ../dm-1

$ sudo dmsetup info
Name:              loop0p2
State:             ACTIVE
Read Ahead:        256
Tables present:    LIVE
Open count:        0
Event number:      0
Major, minor:      252, 1
Number of targets: 1
UUID: part2-loop0

Name:              loop0p1
State:             ACTIVE
Read Ahead:        256
Tables present:    LIVE
Open count:        0
Event number:      0
Major, minor:      252, 0
Number of targets: 1
UUID: part1-loop0
```

マップされた/dev/mapper/loop0p1などをマウントするとアクセスできる。

マップを削除するにはunmountしてからdオプション。

```
$ sudo kpartx -dv sdcard_raspi.img
del devmap : loop0p2
del devmap : loop0p1
loop deleted : /dev/loop0
```
BitVisor のIOフック処理の概要

# はじめに
この記事では，BitVisor でのI/O のフックの方法をざっくりと解説します．
I/O のフックはBitVisor をはじめ，VMMやハイパバイザの肝になる処理なので，なんとなくでも知ってると良いかなと思います．

コードと対応付けた解説などは特にないので，悪しからず．



# I/O って何?
I/O とはCPU とデバイスの間でデータをやり取りすることです．
I/O はデバイス内にあるレジスタからデータを読んだり，レジスタにデータを書いたりする操作になります．

# I/O のフックって何?
ここでいうI/O のフックとは，OS がI/O をしようとしたときに，一度VMMやハイパバイザに処理が遷移させることです．

例えば，BitVisor では，ディスクへのI/Oをフックし，読み書きしているデータを暗号化，複合化することで，OSから透過的にディスクを暗号化する機能を実現しています．

# I/O の種類
I/O にはPIO とMMIO があります．
それぞれについて，説明とフックの方法を説明します．


# PIO って何?
PIO はPort mapped I/O の略(だったと思う，うろ覚え)です．
PIO では，I/O のために特殊なアセンブラ命令を使います．
x86ではin 命令とout 命令です．

in命令やout命令でポートと呼ばれる番号を引数に渡してやると，そのポートに対応するレジスタへの読み書きができます．

Linux では，どのポートのどのデバイスのレジスタがマップされているかは以下のコマンドで簡単に確認できます(Windows やMac でもできるでしょうが，僕はやり方を知りません).

```
$ cat /proc/ioports
```

より詳細なレジスタの配置が知りたい場合は，デバイスの仕様書やデバイスドライバのコードを読みましょう．


#PIO のフック
PIO のフックは，VT-x で提供されている機能を使えば簡単にできます．
VT-x で指定されている方法で，ポートを指定すれば，そのポートをフックすることができます．


# MMIO って何?
MMIO とはMemory Mapped I/O の略
メモリアクセスと同じ命令でI/O を行える機能．
x86 のアセンブラで言えば，mov 命令でI/Oが行える．

デバイスのレジスタがメモリ空間上にマップされている．
このメモリアドレスにmov 命令で読み書きすることで，デバイスのレジスタから読み書きすることができます．

Linux では，どのアドレスにどのデバイスのレジスタがマップされているかは以下のコマンドで簡単に確認できます(Windows やMac でもできるでしょうが，僕はやり方を知りません).

```
$ cat /proc/iomems
```

こちらも，より詳細なレジスタの配置が知りたい場合は，デバイスの仕様書やデバイスドライバのコードを読みましょう．


# MMIO のフック
MMIO のフックはVT-x で機能が提供されているわけではありません．
MMIO のフックは，意図的にEPT Violation を起こしてやることで実現しています．

EPT Violation とは，ページングのPage Fault に似たようなものです．
EPT やページングについては，ここでは解説しません(これやると疲れるので...)

どうやって意図的にEPT Violation を起こすかというと，フックしたいレジスタがマップされているメモリページをEPT にマップしないことで，実現しています．

# おわりに
ざっくりとI/Oのフック処理についての解説っぽいものを書いてみました．
トリプルスリーでどれだけすごいの? ~ヒストグラム入門~

# はじめに
@dr_paradiと申します。最近はデータ分析などをしつつ、E2D3のエバンジェリストとしてデータ可視化のためのOSSのグラフを作成しています。
勢い余って今年のAdvent Calendarを作成しました。
[前回](http://qiita.com/dr_paradi/items/1763ab707ddffb7c6eb8)はデータ可視化長入門ということでデータに応じた可視化のさわりを紹介しました。

今回も派手な可視化というよりは基礎的なものでヒストグラムについて簡単にお話しします。

## ヒストグラム
[以前紹介したサイト](http://extremepresentation.typepad.com/blog/2006/09/choosing_a_good.html)にもあるようにヒストグラムは分布を見るときに使います。

### 分布ってなんぞ
「超」入門ということで簡単に分布について説明します。
よく[年収の例](http://www.stat.go.jp/dss/course/201.htm)が挙げられます。
平均年収を参考にしようとすると、多くの場合「私の年収低すぎ」や「私の年収高すぎ」が起こります。理由として母集団にビル・ゲイツやリオネル・メッシなどお金持ちが入ると数人の影響で数値が跳ね上がってしまうためです。

近年の統計学ブームもあり、平均だけでなく中央値も見ることが増えてきたようには感じますが、分布をヒストグラムにして見ることで全体の傾向を掴むことができます。

## 今回の例: 2015年プロ野球 (セ・リーグ)
今回は、流行語にもなった「トリプルスリー」を例にして分布を見ていきましょう。(ヒストグラムは[D3.js](http://d3js.org/)で書きました。コードはそのうちGithubにあげるので少々お待ちください..)
セ・リーグでトリプルスリーを達成することがどれだけ凄いかわかっていただければ幸いです。
※データは[プロ野球Freak](http://baseball-freak.com/)さんを参考にさせていただきました。

### 打率
まず打率です。3割以上を赤くしています。(※本来は規定打率以上にするべきですが、データのクリーニングが足りず、0割と5割以上のみを切り取ったデータになります)
やはり3割はすごいといった感じですね。
ただ、私も小学生のころは「プロ野球選手は打者は3割打って、投手は140km/h越えるのが当たり前」と思っていた時期があるのでインパクトは薄いかもしれません。
![スクリーンショット 2015-12-07 00.38.43.png](https://qiita-image-store.s3.amazonaws.com/0/17505/7390cb83-bd5a-e01f-d2eb-f9f39734e8d4.png)


### 本塁打
次に本塁打です。こちらも0本塁打の選手は抜いています。30本塁打以上を赤くしていますが、よく見ると一人しかいません。図を見ていただけばお分かりいただけると思いますが、打率と異なり極端に左に分布が偏っています。多くの選手は二桁(10本以上)の本塁打も打つことができない中での記録は驚異的です (ホームが神宮球場であることも大きいかもしれませんが)。
![スクリーンショット 2015-12-07 00.42.31.png](https://qiita-image-store.s3.amazonaws.com/0/17505/0512a83a-5d19-9672-7b5b-6af6adc0fce7.png)


### 盗塁
最後に盗塁です。こちらも0盗塁の選手は抜いています。30盗塁以上を赤くしていますが、よく見ると一人しかいません。こちらも本塁打と同じく左側によった分布になっています。グラフを見た限りではそもそも10盗塁以上すること選手自体が稀なことがわかると思います(私は阪神ファンですが上本選手は今季はよく走りました)。
![スクリーンショット 2015-12-07 00.43.43.png](https://qiita-image-store.s3.amazonaws.com/0/17505/3e06b2cc-a603-2957-ab4b-d4b380377485.png)

# まとめ
以上の可視化を通して、トリプルスリーがいかに達成困難かわかっていただければ幸いです。打率とことなり、盗塁や本塁打は分布が左によっており、大きな数字を達成することがどれだけ困難かわかっていただけたかと思います。その3つを同時に達成した山田選手の今後の活躍に期待です。

## 申し訳程度のソースコード
d3.jsはChartライブラリというよりは、データでドキュメントを操作する(Data Driven Document)側面が強く、数値や配列操作のライブラリが豊富です。もちろん、ヒストグラム用の関数も用意してあります。以下がサンプルです。
```
var data = d3.layout.histogram()
    .bins(x.ticks(40))
    (list);
```
`x.ticks`の部分で、x軸の最小最大を引数で分割して`list`の出現頻度をカウントしてくれます。今回はこちらの引数はヒューリスティックに決めてしまったのですが、いくつか決め方があるので今後機会があれば解説します。
未経験で業界に入ってわかった未経験歓迎の意味


スマートデバイス・テクノロジーの Advent Calendar 2015
Day 7 の記事です。

今年 5 月にアプリ開発を手がける現在の会社に入社しました。
前職という言葉に慣れてないのも無理もない学生だった立場から
未経験で業界に入ってわかった未経験歓迎の意味について書きます。

だいたい書くことは皆さんの考えている通りだとは思います。
これから業界入る方などには参考になる？かもしれません。

**<u>（注）あくまでも個人的所感です。</u>**

## こんな人

* 実務 7 か月目のiOSアプリエンジニア
* Apple 好き
* LuckyBag(Apple Store福岡天神, 2013,14,15)
* メイン：rMBP15 Mid 2012
* Milanista(2002~)
* 東京メトロ，水樹奈々好き
* 楽観主義

## 経歴
| 年月 | 経歴 |
|:--|:--|
|2015年4月末日|肥後国の大学院中退
|2015年5月|（株）スマートデバイス・テクノロジー入社
|2015年8月|初現場
|2015年11月~|2番目の現場
　　　
入社前は学生でした。新卒でもないので未経験は結構重荷・・・
実際複数のアプリ作ってる企業落ちた。
それ以降，アプリの勉強本格的に始めて，
去年11月に App Store にアプリ出した。DL数は・・・


## 多くが思ってる未経験と企業が思ってる未経験

* 求職者(学生，転職者etc)
  - 何も触ったことない
  - または授業や業務で少し
  - 興味があるからやってみたい

　文字どおり辞書的な未経験って感じ。


* 企業
  - あくまでも __<u>実務未経験</u>__
  - 今までやってきたこと教えて
  - 他のプログラム言語は扱ってきているよね？
  - 知識全くなくても今までの知識の応用で何とかなる

　やる気はもちろんだけど今までどんなことをやってきたのかや
　業務実績とか普遍的な知識とかを求めてる気がする。

業界研究の精度にもよるのだろうが，これだとマッチングしない。
企業も場合によっては会ってさえくれないかもしれない(書類選考落)。


## 企業の求める人材に少しでも近づくために

入社時の研修で代表に言われてあー確かにと心に残ってる話がある。


> **本当に興味がある人間は自然と時間をとって取り組んでいる。**



何も触ったことがない，これはみんな最初はそうである。
興味があるからやってみたい，という気持ちが本当にあるのなら
空き時間などに情報収集したり，それをもとに実装しているなど
実際に行動に移しているはずだということだ。
要はこの **<u>興味がある</u>** 次のステップに進めるかどうかなのだ。

私を入れてくれたのはその次のステップに少し入れていたからかもしれない。
2014年の夏くらいだったか，C社の採用試験受けたときに色々アドバイスを
もらった。代表的なものがこれら。

> もう少し勉強して縁があったらもう一度受けてください。

> 情報発信してる学生はなかなか少ない，これは続けてください。

これを踏まえて意識改革した。C社の人事の方には感謝している。


## これから本気でアプリ開発したい方へ

```
IT 業界は新卒とかは緩まるのだろうが，できれば実績のある，
即戦力を求めがちで未経験はかなり厳しいのが現実。
それでいてエンジニアの数は不足している矛盾のある世界。
```

これはおかしいと感じるアプリ開発未経験の方へ。
株式会社スマートデバイス・テクノロジーではアプリ開発者を募集中です。
未経験の方はもちろん，スマホアプリ開発に転身したい方も歓迎です。
**興味がある** ステップから次のステップに移っていると自負している方，
下記の募集リンクから応募お願いします！！

「え！？未経験でもいいの！？」はい、ベンチャーエンジニアになりましょう！
https://www.wantedly.com/projects/13720

「スマートフォンエンジニアに転身したい」そんなITエンジニア集合！
https://www.wantedly.com/projects/15882


以上です。ご覧いただきましてありがとうございます。
ここは違うと思うとか，言葉足らずな部分がありましたら，
コメント欄にお書きいただければと思います。
よろしくお願いいたします。
Kritaの初期化

# Kritaとは
高機能なグラフィックソフトです。Calligraというオフィススイートの一部として開発されました。
現在は独立して開発しているそうです。
巷だとGnome系のGIMPが有名ですが、それのKDE版だとおもってください。
昔からですが、Gnome系に比べてKDE系はおしゃれなデザインなソフトが多いですが、
例にもれず、KritaもGIMPとくらべておしゃれなデザインです。

# 本題
さて、タイトルどおりKritaの初期化についてメモしておきます。
一応準備としてKritaが起動していないことを確認してください。

* KDEに保存されているアプリ情報を削除する 

```bash
$ rm -rf ~/.kde/share/apps/krita/*
```

* 次に、起動直後に読み込まれる初期化ファイルを削除する

```bash
$ rm -rf ~/.kde/config/kritarc
```

これで初期化は終わりです。Kritaを起動してみてください。
インストールしたてのときと同じ状態になっているはずです。
ステルスデバッガ


[マルウェアの耐解析機能](http://qiita.com/urakarin/items/6480a8e79681a8552b7f)の続き。

「マルウェアの耐解析機能」に対してどう対応するか。

ググってみたらこんなのが出てきた。
この手法が主流なのか、他があるのかわからない。

2008年 [ステルスデバッガを利用したマルウェア解析手法の提案](http://www.iwsec.org/mws/2008/presentation/1007.pdf)

ステルスデバッガが何かと言うと、仮想マシン上でマルウェアを実行させ、デバッガはゲストOSの外からデバッグ機能を提供するというもの。CPUやOSのデバッグ支援機構に頼らないことで、マルウェアに検知されないとのこと。マルウェアが仮想環境で実行されていることさえ気づかなければ、よい方法に思える。

BlackHat USA 2010で、まさにステルスデバッガが発表されたらしい。

### blackhat usa+2010での発表
+ Virt-ICE: next generation debugger for malware analysis
 + [BLACK HAT USA 2010](https://www.blackhat.com/html/bh-us-10/bh-us-10-briefings.html)
 + [論文 (pdf)](https://media.blackhat.com/bh-us-10/whitepapers/Anh/BlackHat-USA-2010-Anh-Virt-ICE-wp.pdf)
 + [YouTube](https://www.youtube.com/watch?v=qgvxNk5yagM) .. 6本に分かれているが、これをみるとおおよそ内容が把握できる。
最後にVirt-ICE Clientからの操作デモをやっているが、普通にデバッガとして便利そうと思った。
Windowsドライバの開発の時とか、WinDbg代わりによいんじゃないかしら？と思ったり。

その他、関連しそうなもの。

+ [2012 仮想化技術によるマルウェア対策とその問題点 (SlideShare)](http://www.slideshare.net/suzaki/ss-13589611)
+ [情報セキュリティ研究の方向性と研究開発上の課題 (pdf)](http://www.meti.go.jp/committee/kenkyukai/shoujo/cyber_security/006_s01_00.pdf)
+ [第26回仮想化実装技術勉強会 での産総研のNguyen Anh Quynhさんの話](http://d.hatena.ne.jp/compound/20100909/1284053378)



おわり。
初めて若者に教える立場になって思ったことなど

[コミュニケーションアドベントカレンダー](http://qiita.com/advent-calendar/2015/communication)6日目の記事です。

僕は30歳ぐらいまでぶらぶらしておりまして、その後就職したり転職したりした職場の同僚エンジニアが同世代か年上の、しかもできる人たちばかりだったため、これまであまり人に教えるということをせずにやってきました。ところが[フンザがミクシィに買収され](http://mixi.co.jp/press/2015/0319/16118/)、ミクシィからやってきた若者の面倒を見ることになりまして、齢35にして初めて指導する立場となりました。この半年間で感じたことなどをつらつらと。

ちなみに二人でやっているのは[Androidアプリ](https://play.google.com/store/apps/details?id=jp.hunza.ticketcamp)です。僕自身Android開発を始めて日が浅いため精進の日々です。そんなこともあり、Androidに限定すれば彼から気づかされることも多々あって面白いなあ、と思ってます。

## 経緯とか

本人も僕がこのことを書くのを知っている（というか[コミュニケーションアドベントカレンダー](http://qiita.com/advent-calendar/2015/communication)7日目が彼の当番）なのでぶっちゃけて書くと当初はもう大変でした。彼はちゃんとしたAndroid開発に初挑戦、しかも教える側も不慣れとあってどこから手をつけたらいいかよくわからない。

中でも僕の頭を悩ませたのがそのスキル。3年目でAndroid/Java経験はほぼなし。でも3年やってるんだからJavaの文法って難しくないし（他に難しいところがあるのはスルー）まあイケるっしょー。と楽観していたらそんなことはなかった。Javaの文法から教えたり参考書選びに付き合ったりしてました。

issueの粒度設定も良くなくて、自分だったら1日で終わる、もしくは数日にわたっても進捗を管理できるサイズにしたのを任せると数日かかって結局解決しないといったことがよくありました。これは完全に僕のミス。確実に数時間で終わるようなタスクをこなして進捗が目に見える、達成感を感じられるように修正が必要でした。

そんなこんなで数ヶ月経った頃、[うちのCTO](http://qiita.com/csakatoku)に「伸びてはいるんだけど、期待してたよりは伸びてなくて、どうしたらいいんだろう？」みたいな相談をしたら「**世の中、俺やお前みたいに寝る間を惜しんで好きなコードを書くような人種ばっかじゃない**」と諭されまして。

自分ぐらいできることを期待していたつもりはなかったんだけど（かといって期待しないのもそれはそれで失礼で、さじ加減が難しいところではあります）、問題は自分が勝手に期待していたレベルに達しなかったことに対して一方的に失望感を覚えてしまったことなのかなと。少なくとも成長が感じられる以上、彼なりに努力はしている、そう考えるべきでした。

それからも時間が経つにつれて軌道修正したり、お互い勝手が分かってきて、当初よりだいぶ良好なコミュニケーションが取れるようになってきたと思っています。僕が面倒だと思うことは丸投げできるようになり、そういう意味でも頼りにしています。

## 教えるにあたっての心構えとか

現在は大雑把にいうと以下のような心構えで臨んでいます。

* **相手を尊重する**
    * 自分だったらというのを前提にしない
* **何がプロダクト/チームのためになるか**
    * 俺がやったほうが早いでは問題の本質は解決しない
* **現在のスキルを把握した上で、うまくステップアップできるように課題の難度・量をコントロールする**
    * 進捗やスキルアップに応じて随時調整する

あとこれだけは意識してやってほしいことを一つだけ挙げると、

* **もっと抽象化した思考ができるように訓練しろ**

ということですかね。開発にも慣れてそこそこできるようになったかと思いきや、予想外のところで詰まる時がある。その根底にあるのは抽象化ができてないんじゃないかと見ています。プログラムを抽象化して捉えるというのは、漫然とコードを書いているだけではいつまでたっても身につかないものです。目の前の問題の本質はどこにあるのか、常にそれを意識してほしい。

## 最後に

教えるということを通じて相手のシコウ（思考、志向、嗜好、etc.）に気づいたり、教えようとする過程で、またそのフィードバックにより自分の考えが明確になったり、これも一つのコミュニケーションだなあと思った次第であります。

> 鳥は卵の中からぬけ出ようと戦う。卵は世界だ。生まれようと欲するものは、一つの世界を破壊しなければならない。鳥は神に向かって飛ぶ。神の名は、アブラクサスという。
>
> ヘルマン・ヘッセ『デミアン』

彼がAndroidプログラマとして独り立ちする日が楽しみでなりません。（In other words, まだ一人前とは思ってないからねー☆）
古い拡張機能をFlash PRO CC 2015にインストールする

こんにちはharayokiです。今回は地味な内容です。

# Flash PRO CC 2015には、zxp形式の拡張機能がはいらない？

最新のFlash Pro CC(やその他 Adobeのツール群)では、拡張機能の管理の仕方が変更されたため、Extension Managerを使った古い拡張機能のインストールに失敗する事があります。ネットで検索すると、いくつかの回避方法がHITしますが、自分はそれらの方法ではうまく回避できなかったので、このように対応しました、という具体例をお伝えしようと思います。

※失敗せずにインストールできた場合、下記の方法を行う必要はありません。

# 手動でファイルを配置すればOK
Extension Managerがやっている事というのは、zxpファイル内に記述してある指示に従って、拡張機能構成ファイルをしかるべき位置に配置しているだけのようです。
その作業を手動でやってやればちゃんと拡張機能が動くようになります。肝心のファイルの配置場所ですが、拡張機能ファイルの拡張子をzxpからzipにリネームしてやると、普通に解凍できるようになるので、解凍して出てくるmxiファイル(中身はXML形式)の中身を覗いてやればわかります。

DragonBonesという拡張機能の場合は下記のような記述が見つかります。
```
<files>
	<file source="DragonBonesDesignPanel/utils.jsfl" destination="$flash/WindowSWF/DragonBonesDesignPanel"/>
	<file source="DragonBonesDesignPanel/events.jsfl" destination="$flash/WindowSWF/DragonBonesDesignPanel"/>
	<file source="DragonBonesDesignPanel/dragonBones.jsfl" destination="$flash/WindowSWF/DragonBonesDesignPanel"/>
	<file source="DragonBonesDesignPanel/createAnimation.jsfl" destination="$flash/WindowSWF/DragonBonesDesignPanel"/>
	<file source="DragonBonesDesignPanel/import3DTextures.jsfl" destination="$flash/WindowSWF/DragonBonesDesignPanel"/>
	<file source="DragonBonesDesignPanel.swf" destination="$flash/WindowSWF"/>
</files>
```

ここで、$flashというのはFlashのユーザ別のシステムフォルダを示していて、Macの場合 `~/Library/Application Support/Adobe/Flash CC 2015/ja_JP/Configuration`あたりになるはずです。Windowsの場合(手元にないので確認取れてませんが) `C:\Users\＜ユーザー名＞\AppData\Local\Adobe\Flash CC 2015\ja_JP\Configuration\`あたりかと思います。

これらの場所に、zxpファイルを解凍して出てきた対応する各拡張機能構成ファイルをコピーしたのちに（上記のDragonBonesの場合はDragonBonesDesignPanelというサブフォルダをさらに切っています）、Flashを再起動すれば、拡張機能がインストールされた状態になっています。

※ 手動でファイルを配置してインストールした場合、アンインストールも手動で行いましょう。

# さらに古いmxp形式の拡張機能はどうする？
Extension Managerの機能を使ってmxpファイルをzxp形式に変換する事で利用する事ができるようになります。詳しくは、`zxp mxp 変換`などのキーワードで検索してみてください。さすがに古すぎてうまく動かない物もあるようですが。

# おわりに
今回の投稿内容はFlash PRO CCがAnimte CCとなった後でも有効な内容かと予想しています。名前が変わっても中身はFlashPROのままですし、アーキテクチャはそうすぐに変わらないので。。なお（情報ソースは失念してしまったのですが）、今後の拡張機能のインストールは、Extension Manager経由ではなく、webページからの直接インストールが主流になっていくようです。Adobe製品の怒涛のcloud化は（たまに空回りしてる事もあるような気もしますが)、自分は大好きです。

今回は以上です。That's it for now!
Meta class hooking.


この記事は [iOS Jailbreaking Advent Calendar 2015](http://qiita.com/advent-calendar/2015/ios-jailbreaking) の7日目の記事です。

メタプログラミング的なのかはよくわかってない。

### シチュエーション
iOS x用にこんなコードのtweakがあったとする。

````objectivec:Tweak.xm
%hook AClass
- (void)sampleMethod
{
    // some code...
}
%end
````

そしてiOS yがリリースされ、`AClass`がリネームされ`BClass`になっていた場合、というシチュエーションにとる手法の話。

### 愚直方式

処理を関数に外出しして`%hook`は愚直に記載していく方法。
`%orig`を使う場合はout of %hook blockエラーになるので`#define`のCマクロにしてpreprocessをlogo preprocessより先に実行する方法もあるけど、結構使いにくいのでオススメ出来ません。

方法としてこれはこれでアリです。function内のコードは複数iOSで利用される事を想定しないとアップデートしたら前のiOSで動かなくなるのでそこには注意。

````objectivec:Tweak.xm
static void function()
{
    // some code...
}

%hook AClass
- (void)sampleMethod
{
    function();
}
%end

%hook BClass
- (void)sampleMethod
{
    function();
}
%end
````

### meta hook

hookするクラスを動的にすりゃあいいんだろう！のための記法がtheosにはあります。
こんなコードになります、ジャーン！

````objectivec:Tweak.xm
%group MetaHookGroup
%hook MetaClass
- (void)sampleMethod
{
    // some code...
}
%end
%end // End of metaHookGroup

%ctor
{
    Class $hookClass = %c(AClass) ?: %c(BClass);
    %init(MetaHookGroup, MetaClass = $hookClass);
}
````

これでAClassが存在する場合は`-[AClass sampleMethod]`がhookされ、BClassが存在する場合は`-[BClass sampleMethod]`hookされます。
この場合も`some code...`の部分は前バージョンに対してリグレッションをおこさないよう留意する必要はあります。

この手法は複数バージョンにわたって1バイナリでサポートする時にそこそこ利用します。5プロジェクトに1つぐらいで。
Emacsに mrubyを組み込んでみた

Emacsに mrubyを組み込んでみました. 以下のようなことができるようになります.

```lisp
(let ((mrb (mruby-init)))
  (mruby-eval mrb
              "
def fizzbuzz(num)
  (1..num).map do |n|
    case
    when n % 15 == 0 then \"fizzbuzz\"
    when n % 5  == 0 then \"buzz\"
    when n % 3  == 0 then \"fizz\"
    else n
    end
  end
end

fizzbuzz(ARGV[0].to_i)
" 20))
```

このS式の結果は以下のようになります.

```lisp
[1 2 "fizz" 4 "buzz" "fizz" 7 8 "fizz" "buzz" 11 "fizz" 13 14 "fizzbuzz" 16 17 "fizz" 19 "buzz"]
```

Emacs Lispのオブジェクトに対して mrubyのメソッドを呼ぶこともできます(注: mrubyの Arrayの機能を使う場合はリストでなくベクタを使用する必要があります)

```lisp
(let ((mrb (mruby-init)))
  (mruby-send mrb -10 'abs)) ;; => 10

(let ((mrb (mruby-init)))
  (mruby-send mrb "hello WORLD" 'swapcase)) ;; => "HELLO world"

(let ((mrb (mruby-init)))
  (mruby-send mrb [1 [2 3] [4 [5 6]]] 'flatten)) ;; => [1 2 3 4 5 6]
```

## 仕組み

Emacs 25で実装予定の Dynamic module機能を使って実現しています(なので実際のところ, 組み込んだというほどではないです). 要は dlopen的なもので, 共有ライブラリを実行時に読み込んでその機能を使うというものです. これにより Cライブラリの機能を再ビルドすることなく使えることになります. 高速化や機能の拡張が期待されます. 他のエディタの人からするとまだ実装していなかったのかというような機能かもしれないですが, それが Emacsでもついに使えるときが来たわけですね.


## リポジトリ

https://github.com/syohex/emacs-mruby-test

## セットアップ

### Emacsの構築

現状 Dynamic module機能は emacs-25ブランチにしか実装されていないので, emacs-25ブランチのソースコードからビルドする必要があります.

```
% git clone git://git.savannah.gnu.org/emacs.git
% cd emacs
% git checkout -b emacs-25 origin/emacs-25
% ./configure --with-modules --prefix=installed_path # --with-modulesが必須
% make
% make install
```

### mruby.elのインストール

現状規約も何もない感じですが, とりあえず Dynamic moduleのテストと同様に `modules/`以下に置いておきます. 現状 Linux環境(Ubuntu 15.10 x86_64)でしかテストしていませんが, Dynamic module機能は Windowsでも MacOSXでも使えるように開発が行われています.

```
% cd modules
% git clone https://github.com/syohex/emacs-mruby-test.git
% make
```

## mruby.elのロード

makeしたディレクトリで下記のように起動してください(同ディレクトリに load-pathを通して, `(require 'mruby)`だけでもよいです). emacsは上記で構築した emacsを使ってください.

```
% emacs -Q -L . -l mruby.el
```


## API

実装は @mattn さんの [go-mruby](https://github.com/mattn/go-mruby)を参考にしました.

### `(mruby-init)`

mrb_stateオブジェクトを作成. GCされるとき, `mrb_close`関数が呼ばれるので明示的に終了関数を呼ぶ必要がありません.

### `(mruby-eval mrb code &rest args)`

第一引数は `mruby-init`の戻り値です. 第二引数が mrubyのコード, 第三引数以降は `ARGV`に設定されます.

#### コード例

```lisp
(let ((mrb (mruby-init)))
  (mruby-eval mrb "ARGV.map{|x| x + 1}" 1 2 3)) ;; => [2 3 4]
```

### `(mruby-send mrb code method &rest args)`

第一引数は `mruby-init`の戻り値です. 第二引数が mrubyのコード, 第三引数がメソッド名(シンボル), 第四引数以降は `ARGV`に設定されます.

#### コード例

```lisp
(let ((mrb (mruby-init)))
  (mruby-send mrb ["vim" "emacs" "atom"] 'join "+")) ;; => "vim+emacs+atom"
```


## おわりに

Emacs 25で導入予定の Dynamic module機能を使って mrubyを使えるようにしてみたことを示しました. 現状はお遊びというレベルですが, lambda式の扱いとか mruby側から Emacs側を操作する方法等について検討していきたいと思います. また mruby力が超絶に低いのでそこを鍛えて面白い発想ができるようにもなっていければと思います. アイデア, 問題点等ありましたら, [github issues](https://github.com/syohex/emacs-mruby-test/issues)か [twitter](https://twitter.com/syohex)までお知らせいただければと思います.
ListBoxItemでGridレイアウトを使いたい

ListBoxItemでGridレイアウトを使用したときに、思い通りの挙動にならなかった。
まだ解決してないのだけれど、とりあえず確認したところまでメモ。
検証用のソースはここです（検証に関係ないものも含まれてます。。。）
https://github.com/ambleside138/ControlsShowcase

まず、ListBoxItem用にこんなDataTemplateを用意します。

```xml:MainWindow.xaml
        <DataTemplate x:Key="ListBoxItemTemplateKey">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="0.4*" />
                    <ColumnDefinition Width="0.2*" />
                    <ColumnDefinition Width="0.6*" />
                </Grid.ColumnDefinitions>

                <TextBlock Text="{Binding Id}" />

                <TextBox Grid.Column="1" Text="{Binding Name}"/>

                <TextBox Grid.Column="2" Text="{Binding Memo}" />
            </Grid>
        </DataTemplate>
```

で、ここにこんなデータを表示したい。

```csharp:MainViewModel.cs
 _Staffs = new ObservableCollection<Staff>(Enumerable.Range(0, 3).Select(i => new Staff { Id = i, Name = "TEST" + i, Memo = "" }));
 _Staffs.Add(new Staff { Id = 6, Name = "長い名前のサンプル", Memo = "" });
```

ItemsControlだと意図したとおりに表示されるのだが、

```xml:MainWindow.xaml
<ItemsControl ItemsSource="{Binding Staffs}"
              ItemTemplate="{StaticResource ListBoxItemTemplateKey}" />
```

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/77732/525903e9-4fd3-ac9e-85c7-00213d757570.png)


ListBoxだと、長い文字列を表示したときに列幅が揃わなくなりレイアウトが崩れてしまう。

```xml:MainWindow.xaml
<ListBox ItemsSource="{Binding Staffs}"
         ItemTemplate="{StaticResource ListBoxItemTemplateKey}">

    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>
```

![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/77732/c93cb30f-90e3-e962-095e-1d72e1799dee.png)


 Grid.IsSharedSizeScope="True"　でColumnにSharedSizeGroupを設定すれば列幅自体はそろうが、強制的にWidth="Auto"の動きになってしまう。やりたいのはこれじゃない。

![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/77732/50fd98b3-226f-c82d-3512-9d1b38fe515a.png)


というわけで、結局やりたい動きは実現できないまま。ItemsControlではデフォルトのスタイルで希望通りの動きをしているので、その派生クラスであるListBoxでも同じことができるはずなのだが、どこの仕様が影響してこんなことになっちゃってるのか検討もついてない。。。

解決できたら追記します。


## 2016/07/31 追記
綺麗なやり方ではないけれど、ListBoxItemのWidthをListBoxにバインドして強制的に幅指定してやることで解決

```xml:MainWindow.xaml
<ListBox ItemTemplate="{StaticResource ListBoxItemTemplateKey}" 
         ItemsSource="{Binding Staffs}">
    <ListBox.ItemContainerStyle>
        <Style TargetType="ListBoxItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            <Setter Property="Width" Value="{Binding ActualWidth, RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}" />
        </Style>
    </ListBox.ItemContainerStyle>
</ListBox>
```
Let's Encryptを使ってWebSocket通信を暗号化する

この記事は [慶應義塾大学SFC村井&徳田研 Advent Calendar 2015](http://www.adventar.org/calendars/1053) の6日目の記事です。

---
2日前に無料TLS証明書プロジェクトの [Let's Encrypt](https://letsencrypt.org/) がパブリックベータに移行し、独自ドメイン所有者であれば自由に利用できるようになりました。
個人WEBサイトのhttps化に励んでおられる方も多いと思いますが、同時にWebSocketのwss化も行っちゃいましょう。

## Let's Encryptの導入
[Let's Encrypt の使い方（日本語）](https://letsencrypt.jp/usage/) に従って作業すれば、簡単に導入できます。

なお、私のさくらVPS環境ではletsencryptクライアントの初回実行時に証明書サーバーにアクセスできない旨のエラーが出ましたが、再度実行すると特に問題なく証明書が作成されました。

今回の記事では触れませんが、Apache環境のhttps化は、以下の記事が参考になります。
[無料SSL証明書の Let's Encrypt が公開されたので実際に試してみた](http://www.websec-room.com/2015/12/04/2380)

![スクリーンショット 2015-12-06 20.56.11.png](https://qiita-image-store.s3.amazonaws.com/0/60718/45f81b36-fb42-f13b-a014-b0350fcd0ed7.png)

これで、念願のTLS証明書を個人サーバーに導入し、https通信を実現することが出来ました :smile: :tada:
しかし、https環境下では暗号化されていないWebSocketが使えなくなります。こちらも暗号化しましょう。

## Wss通信 (Node.js Ws)
wssとは、暗号化されたWebSocket通信のためのURIスキームです。
今回は websocket.io ではなく [ws](https://github.com/websockets/ws) （以下、node-ws）を用いてwss通信をしてみます。

通常のnode-wsでは、`var wss = new ws.Server({ port: 8080 });` 等でWebSocketサーバーを立てられますが、WSSサーバーの場合は一旦httpsサーバーを作成してから立ち上げます。

```ts
import https = require("https");
import fs = require("fs");
import ws = require("ws");

// 中略

let app = https.createServer({
	key: fs.readFileSync("/etc/letsencrypt/live/example.com/privkey.pem"),
	cert: fs.readFileSync("/etc/letsencrypt/live/example.com/cert.pem")
}, (req, res) => {
	// ダミーリクエスト処理
	res.writeHead(200);
	res.end("All glory to WebSockets!\n");
}).listen(8080);
		
let wss = new ws.Server({ server: <any>app });
```

クライアント側は、今までの`ws://`を`wss://`に書き換えるだけです。

```js
var ws = new WebSocket("wss://example.com:8080");
ws.open = function() {
	console.log("open");
	ws.send("hello wss!");
	ws.close();
}
```

サンプルコードの全文は github に掲載しています。
[seibe/typescript-wss-sample](https://github.com/seibe/typescript-wss-sample)


## 終わりに

Let's Encryptは単なるドメイン認証であり、実在証明ではないため、なりすましや通信傍受・改竄に対して絶対に安全というわけではありません。
あくまで「通信が暗号化されている」だけという認識であるべきだと思います。

とはいえ、[ChromeがgetUserMediaをhttp環境で無効化する](http://www.tokbox.com/blog/the-impact-of-googles-new-chrome-security-policy-on-webrtc/)等、徐々に増えている暗号化が必須の流れに対しては非常に有効です。
ぜひとも積極的に使っていきましょー。
Excel で Kintone アプリ情報取得

# Kintone レポートツール (KReport)でアプリ情報取得

項目設定を一個づつ開いてフィールドコードを調べるのは、面倒ですよね。
こんな人にお勧めです。
・Kintone アプリの一覧がほしい人
・Kintoneアプリのフィールドコードをよく調べる人
・アプリ開発時のエビデンスのため、よくデータ取得をする人

# 日報アプリのフォーム設計情報
Kintone REST API フォーム設計情報から、こんなシートを作成できます。
![kreport03.png](https://qiita-image-store.s3.amazonaws.com/0/100572/0e23f23f-b5f2-7e0e-8fda-a23f83b39396.png)

Excel VBA のツールですが、Kintone アプリ開発時に便利な機能を持っています。
シェアウェアで 1ケ月間の試用期間があるのでとりあえずお試し出来ます。
動作環境は、Windows Excel2013、Excel2016 です。
[Vector Kintone レポートツール](http://www.vector.co.jp/soft/winnt/business/se511092.html)

# KReport ログイン
対象のKintone サイトを指定してログインします。
過去に指定したサイトはリストから選択出来ます。

![kreport02a.png](https://qiita-image-store.s3.amazonaws.com/0/100572/a9bde3b7-c96a-63fa-6a2d-0293fb40aa56.png)

# アプリの一覧を取得。
アプリ名の一部を指定して、検索できます。
![kreport03a.png](https://qiita-image-store.s3.amazonaws.com/0/100572/606c3a60-b9b6-9ea5-3722-d227541b821f.png)


**※アプリ一覧は、「_APP_List」シートに設定されます。**
**既定で「_APP_List」シートは、非表示になっていますが、シートの再表示で表示出来ます。**

![KReport40.png](https://qiita-image-store.s3.amazonaws.com/0/100572/0ec893c5-ee9e-ea3f-8a43-45fa84416e28.png)


# フォーム設計情報の取得
APP情報取得ボタンクリックで、フォーム設計情報を取得。

![kreport06.png](https://qiita-image-store.s3.amazonaws.com/0/100572/c7cc648e-0bbf-136a-7d2b-2ad80b7effc1.png)

作成先のシートは、「"F_" + アプリ名」になります。
「シート上書」の指定を外すとシートが追加され、「"F_" + アプリ名+(n)」になります。
フィールドコードの変更チェックや初期値設定チェックに有効です。

![kreport03.png](https://qiita-image-store.s3.amazonaws.com/0/100572/0e23f23f-b5f2-7e0e-8fda-a23f83b39396.png)

# アプリのデータ検索
アプリを選択して、検索実行。　検索条件にAPIの query 条件を指定することも出来ます。
作成先のシートは、「アプリ名」になります。
「シート上書」の指定を外すと検索毎にシートが追加され、シート名は「アプリ名+(n)」になります。

![kreport04.png](https://qiita-image-store.s3.amazonaws.com/0/100572/7bb29e49-eb4e-bc42-66e9-63f85ebe70b3.png)

**検索結果の表示**
対象サイトと出力時刻が表示されるのがテスト結果取得時に便利です。
テーブル項目は、全行分json文字列のまま１セルにセットしています。
テーブル行の表示方法にいいアイデアが思い浮かばなくて、そのままにしています。

![kreport05.png](https://qiita-image-store.s3.amazonaws.com/0/100572/aa0166a3-b4cb-d436-db6d-507abb7c1080.png)

#最後に
Kintoneでは、アプリ情報を取得することが以外と面倒ですので、お役に立てれば幸いです。
mac ファイルのタイムスタンプを揃える

大量のファイルのタイムスタンプを無理やり揃える。

まずは対象のファイルの一覧を取得する。
```
$ find  . -type f  > files.dat
```

*awk*でスクリプトを書く（このスクリプトはchmod a+xしておく）。要はtouch, SetFileコマンドを実行しているだけ。

```
#!/usr/bin/awk -f
BEGIN {
	FS = "\n";
}
{
	printf("ファイル%sを処理中\n", $1);
	command = sprintf("touch -c -t 1601010000 '%s'", $1);
	buf = system(command);
	command = sprintf("SetFile -d '01/01/2016 00:00:00' '%s'", $1);
	buf = system(command);
	close(command);
}
```

実行する。

```
cat files.dat | ./Change.awk 
```

時間はかかりますが、そのうちに終わります。
バックエンドを持つブックマークレットを作った #mlkcca

# 作ったもの
今見ているページを、ページのタイトル、URL、メモとともにバックエンド(Milkcocoa)へ送信するブックマークレットを作りました。
なにが面白いかというと、バックエンドを持つブックマークレットが**簡単に作れる**ということなんです。

# 動機
会社と家で別のGoogleアカウントを使っていて、会社で見てるページを家のほうでブックマークに入れたいということがよくありました。しかし共有する手段がなく困った。
そのときブックマークレットの作り方を見かけて、**これとMilkcocoa組み合わられるかな？**と思い作りました。
「でもそういうサービスとかEvernoteとかTwitterに残しておけばよくね？？」とか言われそうですが、そんなの関係ないんです。Milkcocoaで作りたかったんです。

# Milkcocoaの面白さ
ブックマークレットでなにか永続的に記録する仕組みをつくるには、これまではJSでXMLHttpRequestを使ってバックエンドと通信してDBに書き込むという流れでした。
しかしMilkcocoaを使うと、バックエンドと通信する部分だけ書けばよく、あとはやらなくて済みます。
つまりこういう小さいツールを作るのに非常に向いているんです。

# 作り方
ブックマークのURL欄に`javascript:`ってつけてJSを書きます。なんですが、JSから外部のライブラリを読み込むにはそのままでは無理です。なのでJSでscriptタグを生成して、そのsrc属性にmilkcocoaのCDNを指定、onLoadで処理を書くという作りになります。

# コード
```js
javascript: (function () {
    'use strict';

    var scriptTag;
    scriptTag = document.createElement('script');
    scriptTag.src = "https://cdn.mlkcca.com/v2.0.0/milkcocoa.js";
    scriptTag.onload = function () {
        var mk = new window.MilkCocoa('{YourAppId}.mlkcca.com'),
            ds = mk.dataStore('website'),
            memo = window.prompt("メモ", "");
        ds.push({
            "title": document.title,
            "url": location.href,
            "memo": memo
        }, function (err, pushed) {
            window.console.log(pushed);
        });
    };
    document.body.appendChild(scriptTag);
}());
```

# 解説
1. scriptタグを生成します
2. scriptタグのsrcにmilkcocoaのCDNを指定します
3. onLoadの中に処理を書きます
4. Milkcocoaインスタンスをnewします(YourAppIdにはあなたのMilkccoaのを使ってください)
5. メモはプロンプト出して記入してもらいます
6. ds.pushでページタイトル、URL、メモをwebsiteという名前のデータストアに送ります
7. 完了したら確認のためコンソールにpushしたデータを表示します

以上。これでMilkcocoaに今見ているページのタイトル・URL・メモを送ることができます。

# 使い方
ブックマークのURLにコードを貼り付けて保存します。
![image](https://qiita-image-store.s3.amazonaws.com/0/30304/c9cbcea9-b416-d34e-439c-d13580f65091.png)

ブックマークレットを押してみます。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/30304/ac5cff21-4c88-b2b2-8e23-a8c3acad9a8b.png)

Milkcocoaを確認してみます。
![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/30304/5c95fdd1-a510-5dc9-5d4b-c4dbc776881a.png)

ページのタイトル、URL、メモを送れました！

あとはMilkcocoaの管理画面から直接データを見るなり、自分で専用のページをつくってds.stream()で一覧表示するなりしてご利用ください。

# 注意
ブックマークレットのコードの中で`//`でコメントしちゃうと、ブックマークレットにしたとき1行になってそれ以降のコードが読めなくなります。コメントするときは`/**/`でしましょう。

あとtwitterとかgoogleとかみたいにContent-Security-Policyをちゃんと設定してあるところだと使えないようです。回避策あるのかわかりませんが、まぁそういうところでは使わないものを作ろう、作るならブラウザ拡張でやろうってことでお願いします。

# 雑感等
Milkcocoa(ないしBaaS)を基点にWeb技術を眺めていると、**お？こんなことできるんじゃない？**と思うことがけっこうあります。しかも手軽に作れてしまいます。今回のも骨格は15分かからずで作りました。覚えることも少なく、非常に親しみやすい技術だと思います。オススメです。

以上、アドベントカレンダー7日目でした。
各種環境におけるJavaCCのダウンロードや環境設定の方法

# はじめに
JavaCCを下記3つの環境から実行できるようにするための方法を書きます。

- Windowsのコマンドプロンプト
- Macのターミナルなど
- Eclipse

Eclipseであればシンタックスハイライトや自動補完が効き保存時には自動コンパイルをしてくれるのでオススメです。

## 実行環境

この記事に書いた方法は下記環境で行っています。

|ツール|OS|
|:--:|:--:|
|コマンドプロンプト|Windows7 HomePremium SP1 32bit|
|ターミナル|Mac OS X EI Captain 10.11.1|
|Eclipse Mars.1 Release (4.5.1)|Mac OS X EI Captain 10.11.1|

# コマンドプロンプトやターミナルで使えるようにする

コマンドからJavaCCのコンパイルをできるようにします。

## JavaCCをダウンロードする
[JavaCC Home](https://javacc.java.net/)からjavacc-6.0.zipをダウンロードしてください。
展開すると以下のようなフォルダ構成になっているかと思います。

```text:フォルダ構成
javacc-6.0
├── LICENSE
├── bin
│   └── lib
│       └── javacc.jar
├── doc
│   └── 省略
└── examples
    └── 省略
```

この`bin/lib/javacc.jar`がJavaCC本体です。
その他`doc`にはドキュメント(なぜか5.0のもの)が入っており、`examples`には各種サンプルが入っています。

## javaccコマンドを使えるようにする

これからそのjavacc.jarをjavaccというコマンドで実行できるようにします。
この記事ではそれぞれ以下のパスに展開した設定で話を進めていきますので、そこは各自の環境に合わせて適宜読み替えてください。

|OS|パス|
|:--:|:--:|
|Windows|D:\javacc-6.0|
|Mac|~/javacc-6.0|



### バッチファイルやシェルファイルの作成

javaccコマンドを使えるようにするためにはまずバッチファイルや実行可能なシェルファイルを作成しておく必要があります。
(ここで使っている書き方は確かどこかに載っていた(どこかは忘れてしまいました)Windows用ものを参考にしたものです。)

#### コマンドプロンプト用バッチファイルの作成 － Windows

ファイル名：javacc.bat
書き込む内容：

```bat:javacc.bat
@echo off
java -classpath D:\javacc-6.0\bin\lib\javacc.jar javacc %1 %2 %3 %4 %5 %6 %7 %8 %9
```

#### ターミナル用シェルファイルの作成 － Mac

ファイル名：javacc (拡張子なし)
書き込む内容：

```bash:javacc
java -classpath ~/javacc-6.0/bin/lib/javacc.jar javacc "$@"
```
作成したらchmodで実行権限を付加してください。

```bash
chmod u+x ~/javacc-6.0/bin/javacc
```

### binへのパスを通す

#### 環境変数を追加する － Windows

環境変数のパスの設定をします。
スタートメニューを開き、コンピュータ右クリックからプロパティーを押してください。
システムの左側にあるシステムの詳細設定を押し、詳細設定タブの下の方にある環境設定を押してください。
システム環境変数から”Path”というのを探し出し、変数値のところにjavacc-6.0\binのパスを追加してください。

#### 環境変数を追加する － Mac

~/.bash_profileの最後に以下を追加してください。
ファイルがなければ作成してください。

```bash:.bash_profile
export PATH=$PATH:~/javacc-6.0/bin
```

ターミナルを起動している場合は再起動するか下記のコマンドで~/.bash_profileを読み込んでください。

```bash
source ~/.bash_profile
```

## javaccコマンドが使えるか確認する

`javacc`コマンドを実行して以下のように出れば完了です。

```bash
sakaguchikana-no-MacBook-Air:~ sakaguchikana$
Java Compiler Compiler Version 6.0_1 (Parser Generator)

Usage:
    javacc option-settings inputfile

"option-settings" is a sequence of settings separated by spaces.
Each option setting must be of one of the following forms:

以下略
```
もし以下のように出ていたらファイル名やパスを確認してください。

```bash
sakaguchikana-no-MacBook-Air:~ kanatan$ javacc
-bash: javacc: command not found
```

# Eclipseで使えるようにする

プラグインをインストールすることによってEclipseでJavaCCのコンパイルから作成したプログラムの実行まで行えるようになります。
また冒頭にも書いた通り、Eclipseであればシンタックスハイライトや保存時の自動コンパイルもしてくれるのでオススメです。

## プラグインをインストールする

`Help > Install new Software ...`からプラグインをインストールします。
`[Add...]`を押して次のように入力してください。

|項目|内容|
|:--:|:--:|
|Name|JavaCC|
|Location|http://eclipse-javacc.sourceforge.net/|

`Name`は好きなもので構いません。
また、`Location`のURLを直接`Work widh`のところに書いても構いません。

すると一覧に`JavaCC Eclipse Plug-in`が出てくるので、それにチェックをつけて次へ進みます。
ライセンスに同意して次へ進むとインストールが始まります。
インストールが終わるとEclipseの再起動を求められるのでそのまま再起動してください。

そのあとEclipseの環境設定を開き、JavaCC Preferenceの項目を見つけられればインストールは完了です。
git-lfsは大容量のファイルを扱うもので多量のファイルを扱うものではない

git-lfsの説明については参考URLをどうぞ

####　参考
* https://git-lfs.github.com/
* http://qiita.com/kiida/items/0d51c43ac73f14f09f5a

さてgit-lfsがver1.0になってgithub.comでもサイズ上限を気にしないでもいい最高の未来が訪れたぞやったー！とか思ったのですがぬか喜びでした。

結論から言うと、画像が沢山あって1GB以上あるリポジトリをgithub.comに置こうと思ったのにgit-lfsで扱ったら１ファイルあたりのオーバーヘッドがでかすぎて死んだ。

## cloneがとにかく遅い

https://github.com/hoshina85/lfstest2

試しにリポジトリをひとつcloneしてみる。上のリポジトリは100KB程度の異なる画像を100枚コミットしてある。

git-lfsがインストール済みの状態でcloneすると自分の環境では9分ほどかかった。
というのも通常のgitリポジトリクローンの後にlfsとして登録されたファイルのfetchが始まる。直列なうえにどうやら北米のサーバーに取りに行ってるらしい。

## 回避策・git-lfsの処理タイミングを遅らせる

一応この遅いcloneを回避する事はできて、clone時のgit-lfsの処理を飛ばして後からfetchすると非常に高速に出来る

```
$ GIT_LFS_SKIP_SMUDGE=1 git clone https://github.com/hoshina85/lfstest2.git
```

```
$ cd lfstest2
$ git lfs fetch
Fetching master
Git LFS: (100 of 100 files) 9.69 MB / 10.47 MB
real	0m6.230s
user	0m0.714s
sys 	0m0.425s
```

lfs fetchはバッチで処理してくれるらしい。それでも100ファイルで6秒かかってるので千や万のオーダーになったらお察しである。

## 回避策・github enterpriseを使う

GHEで国内にサーバーをおくとなんぼか速いという話を聞いた。使ってないので試してはいない。ただしGHEはリポジトリサイズ上限がないのでlfs使わずとも普通にコミットすればいい。100MB以上のファイルをコミットできるという利点はある。

## つまり

git-lfsはPSDとかmpegとか単体でめっちゃでかいファイルを扱うためのもので多量の小さなリソースが詰まったリポジトリで使うようなものではない。今のところ。
PHP Laravelメモ



完全に自分用作業メモ

* 2015年11月29日位の情報
* Laravel 5.1


## インストール

```
composer global require "laravel/installer"
```


## PATHの設定

```
~/.composer/vendor/bin
```


```zsh:.zshrc
## laravel homestead
export PATH=$HOME/.composer/vendor/bin:$PATH
```


## laravel コマンド

```
laravel new [ディレクトリ名]
```


## プロジェクトの作成

```
composer create-project laravel/laravel your-project-name --prefer-dist
```


## 基本設定

config/の下に設定ファイルがある。

### パーミッションの設定

Laravel4 の場合以下。

* /app/storage 

Laravel5の場合、以下。

* /storage
* bootstrap/cache


### アプリケーション・キー

* ComposerかLaravelインストーラーでインストールした場合は、既に設定されているはず。key:generateコマンドで。
* .env　環境ファイルに入っている
* 設定されていなかったら、 .env.example ファイルを .envに名前変更して、設定する


### 追加の設定

これで基本的な設定は終わり

* config/app.php ファイルをみてもいいかも
 * timezone や locale など。


### Pretty URL

* ApacheとNginxの設定をする
* Homesteadの場合は、既にしてある


### DotEnv

環境設定切り替えツールとして、以下を使っている様子

* [vlucas/phpdotenv](https://github.com/vlucas/phpdotenv)


### 設定値にアクセスする

```
$value = config('app.timezone');
```

```
config(['app.timezone' => 'America/Chicago']);
```

### アプリ名をつける

```
php artisan app:name Horsefly
```


## Laravel の artisanコマンド

* [PHP - Larevelでartisanコマンドを自作してみる - Qiita](http://qiita.com/massa142/items/41a4f2c39b21df0c2f05)


## その他


* laravel new datatables




## トラブルシューティング

### composerを使うと以下が出る場合

```
[Symfony\Component\Debug\Exception\FatalErrorException]
  Class 'yajra\Datatables\DatatablesServiceProvider' not found
```

```
  [Symfony\Component\Debug\Exception\FatalErrorException]
  Class 'Barryvdh\Debugbar\ServiceProvider' not found
```


config/app.php

以下でなおったっぽい。

```
composer update --no-scripts
```

こんなやり方もあるかも

```
composer self-update
composer update
```


### DBが使えない

Homesteadを使っているのに、homestead上でなくて、ローカルからDBコマンドを叩こうとして、エラーになる

以下のようなコマンドは、homestead sshした先で実行する

```
php artisan migrate
php artisan db:seed

```
【-rwxr-xr-x】ファイルのアクセス権限を読めるようになる

#背景
NeoBundleでプラグインをインストールしようとしまして...
![install.png](https://qiita-image-store.s3.amazonaws.com/0/38580/06bf9c1c-92e9-6383-048c-4c0e86dbc2d4.png)

インストールしますか？
yes !

![スクリーンショット 2015-12-05 20.11.23.png](https://qiita-image-store.s3.amazonaws.com/0/38580/cb0bf4f6-54f2-e8bf-65e4-3c306ac629c4.png)

...!?
~/.vim以下か.vimrcのアクセス権限が狂っているのかな？
半年に1度ほど、このようなエラーからアクセス権限を変更することがあります。
毎回調べ直すのが大変なため、まとめました。


#対象読者
・よくターミナルを開く方
・アクセス権限について、1回以上調べ直している方
案外簡単なので、この際覚えてしまいましょう。

#ゴール
題名カッコ内の意味が分かる
意図的に変更できるようになる

#アクセス権限とは
ファイルやディレクトリを利用する権利のことです。
デフォルトでは書き込みができないけどそれを可能にできます。
また、自分は自由に使えるけど、親や妹にはいじらせないようにできます。
## 確認方法

ご存知の通り、ファイル一覧は`ls`コマンドで確認できます。
アクセス権限の確認は`ls`に加え、そのオプションである`-all`を付けて、`ls -all`と打ちます。
よく目にする`ls -l`との違いは、普段隠れているファイル(.vimなどの.から始まるファイル)を表示させるか否かです。
今回は対象が`.vim`のため、`ls -all`を使います。

![スクリーンショット 2015-12-06 22.55.17.png](https://qiita-image-store.s3.amazonaws.com/0/38580/8ccae325-3d5a-22e7-9375-c36c17f062f9.png)

このような結果がずらっとでてきたら成功です！
ちなみに`ls -al`でも`ls -all`と同じ結果が出るのでオススメです(?)

## 読み方
さっそく読み解いていきましょう。
アクセス権限を変更する場合、以下の6つとファイル名が読み取れれば十分です。

![スクリーンショット 2015-12-06 0.48.12.png](https://qiita-image-store.s3.amazonaws.com/0/38580/d29f21bd-3eb5-30f4-150f-c96caeaafbbd.png)

1における`d`はディレクトリ、`-`はファイルを表しています。
これら以外にもいくつか見かけることがあります。コメント欄にて確認してください。
この2つは特によく見かけるので覚えましょう。

2、3、4はそれぞれ3つで1グループになっています。
左から、オーナー(自分)、グループ、その他のアクセス権限を表しています。

|コマンド|意味|
|---|---|
|r|読む|
|w| 書き込み|
|x|検索|

そして、その中に上記のコマンドがある場合、その人にはその権限があるという意味になります。
それに伴って私の`.vim`を見てみると
`dr-xr-xr-x 9 gitan ... .vim`
これはディレクトリで、(私は)読めて、書込みはでき**なく**て、検索できるんだなと読み取れます。
また、グループ権限では書き込みができず、その他権限も同様だなと分かります。

ちなみに5はディレクトリの中身のファイル or ディレクトリの数を表しています。
つまり、1が`-`の場合、必然的に5の数字は`1`になります。
6はオーナー名です。もし、これが母親のハンドルネームだったら何かが狂っています。

では、これらを変更したい場合はどうすればよいのでしょうか？

## 変更

権限の変更をするコマンドは**chmod**(change mode)です。
`chmod (ユーザー) + (アクセス権限) ファイル名`と使います。

|コマンド|意味|
|---|---|
|u|ユーザー(自分)|
|g|グループ|
|o|その他|
|a|全て|

書き込み不可な`.vim`に
![スクリーンショット 2015-12-06 22.55.54.png](https://qiita-image-store.s3.amazonaws.com/0/38580/2218b731-6c07-ae83-a3fb-deae0b57e8f3.png)

こうすると
![スクリーンショット 2015-12-06 22.56.16.png](https://qiita-image-store.s3.amazonaws.com/0/38580/ce34a238-96b4-9ded-1bba-57f86d3918a4.png)

ユーザー権限の欄にwが追加され、書き込みができるようになりました！
![スクリーンショット 2015-12-06 23.09.19.png](https://qiita-image-store.s3.amazonaws.com/0/38580/af9c70a1-0dad-c0eb-538c-2ab9ca381876.png)

ちなみに、逆に消したい場合は`chmod (ユーザー) - (アクセス権限) ファイル名`を使うとできます。


#最後に
これでしっかり管理できる！とか右側の数字はなんだろう？と思ったら素質ありです。
Unix/Linuxの勉強を始めると良いと思います。
随時、追記していきます！

#参考
[アプリケーションの追加や、ファイルの削除ができない](http://www.mac-rescue.net/osx/tips/permission.html)  参考日: 2015/12/6
Androidiアプリ開発をIconFontで幸せに

チャオ！

Android開発でアイコンフォントを使うと色々ハッピーになれるよ！
単色しか使えないんだけど、むしろマテリアルデザインとは相性いいよね！

##何がうれしいの？

####iOS・ウェブと共通で使える
このメリットのために、ワザワザフォント化している説

#### 容量が軽い
- そもそもpngなどで書きだしたものよりベクター画像の方軽い
- ldpi,mdpi,hdpi,xhdpi,xxhdpiとかそれぞれのサイズに合った画像を用意するとかもう地獄。
- サイズ、色違いも1つで済む

#### 大きくしてもガタガタにならない
ベタクーなのでなめから、普通に文字なのでアニメーションとかさせてもいい感じに
![sample.png](https://qiita-image-store.s3.amazonaws.com/0/5176/40f30edc-bc87-64e4-3712-a043168b9292.png "sample.png")

#### テキストなので使いやすい

```xml:click_color.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false" android:color="@color/colorDisabled"/>
    <item android:state_selected="true" android:color="@color/colorSelected"/>
    <item android:state_pressed="true" android:color="@color/colorPressed"/>
    <item android:color="@color/colorNormal"/>
</selector>
```

みたいにクッリクしたら何色になるかを設定していたら

```
android:textColor="@drawable/click_color"
```

とするだけで、色数分画像を作らなくてもOK！


##デメリットは？
- 単色オンリー（文字扱いなのでカラフルものは出来ないですー
- サイズ合わせにコツがいる。文字サイズ指定でサイズをセットするので、慣れるまで大変

##実装方法

####1.アイコンフォントを用意
アイコンはicomoonから取るのがオススメ。
ロゴとかもアイコンフォントにしたければ、svgで書きだした画像を食べさせるとフォント化してくれます。
icomoonの使い方とかは　このサイトが詳しいかも
[icomoonの使い方](http://shufulife.com/icomoon/)

####2.カスタムフォントの使い方
カスタムフォントのセットのしかたと使い方は下記サイドがいい感じに解説してくれています。
私もTextViewを継承したクラスを作って使うのが正義かなと・・・
[[Android]xmlで独自フォントを指定できるTextViewを作る](http://seesaakyoto.seesaa.net/article/389759682.html)

ただ、こんな便利ライブラリの誘惑も・・
[Androidでカスタムフォントを簡単に導入(Caligaphy)](http://qiita.com/unosk/items/f75457199d0ae49f58f9)

####3.こういうのがアレば便利に使えるかも

テキストをセットするときは"\ue900"とか"p"とか何がどのアイコンだったか分からなくなりがちなので、
下記のようにxmlにまとめてres/valuesに置いておくと便利です。

```xml:string_icon.xml
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">

    <string name="icon_home" tools:ignore="MissingTranslation">\ue900</string>
    <string name="icon_back" tools:ignore="MissingTranslation">\ue901</string>

</resources>
```

こんなふうにどのアイコンをセットしているのかわかりやすくなります。

```
android:text="@string/icon_home"
```


それではアイコンフォントでハッピーになってもらえればと！
爆速！さくらVPSでEC-CUBE3を最速立ち上げ


初めてAdvent Calendarに投稿させていただきます。
名古屋在住のフリーランスエンジニア @hiroyasu55 こと山田浩靖です。

# EC-CUBE名古屋ユーザーグループ

[EC-CUBE名古屋ユーザーグループ](https://www.facebook.com/groups/eccube.nagoya.user/)では、EC-CUBEエバンジェリストの @nanasess 氏をお招きし、月1回の頻度で勉強会（と称する実態は井戸端会議と酒盛り）を行っております。

# さくらインターネットxEC-CUBE

2015年12月5日には、さくらインターネット様「[さくらクラブ](https://saku-love.doorkeeper.jp/)」とEC-CUBE名古屋ユーザーグループの合同企画として、[「EC-CUBE名古屋ユーザーグループ×さくらクラブ」コラボ勉強会](https://saku-love.doorkeeper.jp/events/31946)が実施されました。珍しく？本格的な勉強会ということで、これまでEC-CUBEをご利用されていない方も含め多くの方が参加されました。

## EC-CUBE3をさくらVPS上で動かしてみよう！

上記勉強会にて私もセッションの時間を頂き、さくらVPS上でEC-CUBE3を起動してみるという企画を行いました。サーバサイドに詳しくない方も多かろうと考え、chef等を活用してほぼ自動的に構築するというプロダクト一式をもって臨んだのですが。

本当は参加した方々にハンズオン的に試していただきたかったのですが、試用版さくらVPSサーバの起動に思いの外時間がかかったりで、ほぼ説明だけで終わってしまいました・・・

と消化不良をボヤいていたところ、@nanasess 氏より「12/7のAdvent Calendarに登録してください！」と謎の司令が下り、よく分からないまま登録し、今もよくプロセスがわからないままこの記事を書いているところですwww
まあ普段から ~~無茶ぶりの過ぎる~~ 手厚くお世話になっている @nanasess さんや、EC-CUBEの中の人・外の人に何らかの寄与になればと思う次第です。

## EC-CUBE3 on さくらVPS 自動環境構築プロダクト

その名の通り、さくらVPS上にLAMP+EC-CUBE3環境を自動構築するものです。
リソースはGitHub([https://github.com/logicheart/eccube3_sakuravps](https://github.com/logicheart/eccube3_sakuravps))にあります。

具体的な手順は[GitHubのWiKi](https://github.com/logicheart/eccube3_sakuravps/wiki)に記載していますので、そちらを参照ください。
ここには概要だけ記載します。

* シェルスクリプトの起動により、さくらVPS上で下記を実行
  * CentOS6の最小限の環境設定（ファイアーウォール、管理用ユーザーの作成、SSH公開鍵認証の設定等）
  * Apache、PHP、MySQLのインストール
  * EC-CUBE 3.0.6のインストール
* 内部ではchef-zeroを実行。

knife zeroのコマンドだけで済めば楽なのですが、SSH公開鍵の作成等でシェルコマンドを叩かなければならなかったりで、“黒い画面”に慣れていない方にはハードルが高そうなので、まとめて1本のスクリプトにまとめました。

さくらVPSは、初期状態でrootユーザーでのパスワード認証によるSSHログインが有効になっており、ファイアーウォールも未設定の状態なので、たとえ試用目的といえど最低限のセキュリティ構成が必要だったりします。で、今回さくらVPS初期設定レシピとLAMP環境構成レシピを作成したのですが、WordPress等他のPHP系アプリケーションの基盤にも流用できると思います。

ただし動作検証が充分でないため（特にWindows環境）、ツッコミどころがあれば忌憚なく指摘していただけると幸いです。

# コミュニティ活動（特にWeb界隈）について思うこと

私はフリーランスになって1年ちょっと経ちますが、その前は地場のSIerで業務システムの受託開発やらサーバインフラ設計やらやってました。ご多分に漏れず、社畜でした(ToT)。なので業務外でコミュニティに参加するなどつゆ思わず。
色々あって独立して、時間ができたのでコミュニティに参加してみて、ひとくちにIT業界と言っても様々なクラスタがあるということを認識しました。Webフロント系、エンタープライズSI系、自社サービス系、インフラ系、組み込み系、ゲーム系・・・

EC-CUBEや、WordPress等のCMSのコミュニティは、デザイナーさんや自前でサイトを運用されている方が比較的多いので、私のスキルセットに無いSEO対策だったりショップ運営のノウハウだったりの話をお聞きできて刺激になります。そのお返しではないですが、私の持つサーバサイドの知見をシェアできればと思い積極的にコミットするようになっています。ですがサーバインフラはコーディングと異なりクリティカルな部分を多分に含んでいるのと、コードを書けば即時に動くものを見られるという類ではないので、とっつきにくさがあるのは否めません。

で、初心者でもサーバが立ち上がった！サイトができた！っていう成功体験を体得してほしいという思いから、ほぼ全自動構築ツールなど作ってみました。

EC-CUBEの稼働だけなら、LAMP環境の整っているレンサバでEC-CUBEをワンクリックインストールで、やりたいことは実現できてしまうのですが、スケールアップとかセキュリティ脅威とかのサーバサイドで考慮すべき事柄についても関心をもってもらえるとコラボレーションの甲斐があるのでは、と思うわけです。

ことWeb界隈については、フロントエンドとサーバエンド、デザイナーとデベロッパーとの垣根が低くなってきていると感じます。そういうことはコミュニティ等に参加してみないと分からないものですね。なので、現在“社畜”のごとく会社の業務で日々を消耗している未来あるエンジニアの方々、

**残業や休日出勤などしている暇はありません！**

積極的に外に出て、様々な知見に触れることで成長につながります。もし業務外活動に上司が理解を示さないならば、そのような会社は見限ることも視野に入れるべきかと思います（キッパリ）。

異論・反論・ツッコミ（愛のあるやつ）お待ちしております。

# リンク

* [EC-CUBE名古屋ユーザーグループ（Doorkeeper）]
(https://ec-cube-nagoya.doorkeeper.jp/)

* [EC-CUBE名古屋ユーザーグループFaceBookページ]
(https://www.facebook.com/groups/eccube.nagoya.user/)

* [「EC-CUBE名古屋ユーザーグループ×さくらクラブ」コラボ勉強会告知サイト](https://saku-love.doorkeeper.jp/events/31946)及び[FaceBookページ](https://www.facebook.com/events/1150141265000579/)
Unity Shaderことはじめ４ NavMeshを描画

# はじめに

今回はシェーダーではなく、シェーダーに渡す頂点情報を用意してみるサンプル。

NavMeshはよく使うけど実行中に描画するオプションがなかったので、
何かに使えないかなと思ってNavMeshを参照してみた。

# 手順

- NavMeshを生成
- 頂点情報準備/描画用にEmpty GameObjectを配置
- GameObjectにMeshFilter, MeshRendererを追加
- GameObjectにNavMeshのMeshを用意するスクリプト追加

# NavMeshからMeshを用意するスクリプト

結構シンプル

```
using UnityEngine;
using System.Collections;

public class NavMeshDrawer : MonoBehaviour {

	void Awake () {
		//NavMeshの三角形集合取得
		NavMeshTriangulation triangles = NavMesh.CalculateTriangulation();
		
		//三角形集合からMeshを生成
		Mesh mesh = new Mesh();
		mesh.vertices = triangles.vertices;
		mesh.triangles = triangles.indices;
		
		//MeshFilterに生成したMeshを渡す
		MeshFilter filter = GetComponent<MeshFilter>();
		filter.mesh = mesh;
	}	
}
```
SSH ローカルで鍵を作って、リモートサーバに設定する方法



* サーバに公開鍵認証でログインできるようにする方法


ググってもいい記事がないから自分用にメモ
 

## 事前準備

* 先に .ssh/config にコマンド一発でログインできる設定を書いておくと楽

```txt:~/.ssh/config
Host remote_host
     Hostname 192.168.0.2
     Port 22
     User remote_user
```


## ローカルで鍵を作る


`ssh-keygen -t rsa -f ~/.ssh/id_rsa.remote_host`



## リモートに鍵をセットする

以下のコマンドなら一発で終わり

```
ssh-copy-id -i .ssh/id_rsa.remote_host.pub remote_user@remote_host
```

よくある面倒な手順だと以下をリモートホストでやる

```
mkdir ~/.ssh
chmod 700 ~/.ssh
cd ~/.ssh
cat ~/id_rsa.remote_host.pub >> authorized_keys
chmod 600 authorized_keys
```



## 鍵がセットされたか確認

```~/.ssh/config
Host remote_host
     Hostname 192.168.0.2
     Port 22
     User remote_user
     IdentityFile ~/.ssh/id_rsa.remote_host.pub
```

上記保存して、

```
ssh remote_host
```


## sshdの設定の変更

以下などを変える

* ポート変更
* rootログイン禁止
* パスワードログイン禁止
* X11Forwardingをオフ

```
Port 22222
PermitRootLogin no
ChallengeResponseAuthentication no
PasswordAuthentication no
UsePAM no
#X11Forwarding yes
#X11DisplayOffset 10
X11Forwarding no
```

変更したポートの削除、登録


```/etc/services
# ssh 22/tcp
# ssh 22/udp
ssh xxxxx/tcp
ssh xxxxx/udp
```


## ログインできない場合のデバッグ方法

```sshd_config
LogLevel DEBUG
```

以下を設定できる
QUIET, FATAL, ERROR, INFO, VERBOSE, DEBUG, DEBUG2, DEBUG3


tail -f するファイル

/var/log/messages
/var/log/auth.log


## トラブル・シューティング

Ubuntuでは、/etc/init.d/ssh restartでは、反映されないようで、
service ssh restartで反映されたように見えた。