OmniAICreator/Qiita-1.07M huggingface dataset:
MODのテクスチャを作ろう

####※本講座で扱われるテクスチャの著作権はWindows_TenおよびGaku_Minecraftに帰属する。無断転載および許可のない二次配布を固く禁じる。

Minecraftの重要な要素の1つとして、しばしば挙げられるのがMODである。
Life is Tech!ではMinecraftのMODを作るコースが設立されているが、テクスチャを描くことに特化していないという課題点も抱えている。
プログラムを作るという感性ではなく、テクスチャをデザインするという感性も求められるMinecraftのMOD。今回はそのテクスチャにフォーカスを当てていこう。

#用意するもの
・ドット絵を描くツール
・Minecraft
・開発環境

3つだけ。それでは始めよう。

#まずは描いてみる

![P90BIG.png](https://qiita-image-store.s3.amazonaws.com/0/151747/55e369cb-9cfe-4054-44a9-e9b94d082b70.png)

このテクスチャは、P90と呼ばれる銃火器のテクスチャである。

さて、よく観察してほしい。特にMinecraftの標準テクスチャのアイテム等と比較して。

共通点
・細かいディテールを色で細やかにデザインしている
・色調に合わせた輪郭線がある

これらの2点は、MinecraftのテクスチャおよびP90のテクスチャで重要視されている部分である。
細かく分析すると下記のとおりである

・細かいディテールを、濃淡の近い同じ系統の色合いで表現している。
・テクスチャの「テーマ」や色調に合わせた輪郭線がある。
・輪郭線の色は大抵、黒もしくは黒に近いもの。

細かく分けると上記の3点。これらはMinecraftバニラ風テクスチャを描く上での重要なポイントとなる。それをP90で反映させたのだ。

#MODに持ち込む際のコツ
標準状態で無駄に高い解像度にしなくても、リソースパックを使用すれば後付で高解像度なテクスチャを作ることが出来る。

例えば、WEAPONS:P90 と設定されたテクスチャがあったとしよう。その場合、/Resource Pack名/assets/minecraft/textures/itemsではなく、/Resource Pack名/assets/WEAPONS/textures/items/ といったようなディレクトリに配置することができる。itemsはblocks等、様々な条件に合わせて柔軟に対応させることが可能だ。

開発者は急がず、無駄に高解像度なテクスチャを同梱しないことが大切である。リソースパックにすれば開発者の公式という体に留まらず、有志が制作するという体でも対応できるからだ。標準で用意するテクスチャは16x16で十分である。

#総括

まとめると

・Minecraftの作法を守る。
・無駄に高解像度化しない。

この2つを重要視し、MODを制作するだけでクオリティが格段に向上する。もちろんプログラムも重要であるが、素晴らしいプログラムを引き立てるのはやはりテクスチャであろう。それでは、最高のModdingライフを楽しんでほしい。

次回は@E235-235 氏ことかっくん氏の、Keynoteの素晴らしさである。プレゼンテーションは作品をアピールする武器であり、才能を問われる重要な場でもある。Keynoteはプレゼンテーションを支える素晴らしいツールであることは有名であるが、その素晴らしさを確認できるであろう。彼の活躍に期待する。
【Python入門】Print文での文字列の出力の仕方

※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。
参考サイト：[【Python入門】Print文での文字列の出力の仕方](http://programming-study.com/technology/python-print/)

#【Python入門】Print文での文字列の出力の仕方

画面への文字列の出力はプログラムの基本中の基本です。Pythonにおける画面への出力には「print関数」を使います。Pythonを使う上で、print関数は欠かす事が出来ないものです。今回はprint関数の使い方について説明します。
目次 
1 [printとは](##printとは)
2 [printで変数を出力する](##printで変数を出力する)
　　　2.1 [printで変数だけを出力](###printで変数だけを出力)
　　　2.2 [format関数](###format関数)
　　　2.3 [%記法](###%記法)
　　　2.4 [文字列+変数](###文字列+変数)

##printとは

print関数は、文字列を画面に出力する関数です。print関数の基本的な構文は以下のようになります。

Python

```
print('出力したい文字列')
```
printで文字を出力するには、printの引数部分に出力したい文字列を置きます。printでは文字の末尾に改行が追加されるので、出力した文字列が自動的に改行されます。改行をしたくない場合はendオプションを用いて末尾に何も付加しないようにします。

```py3
print('Hello', end='')
print('World')
```

```text:実行結果
HelloWorld
```

また、Python2の場合は文字列のあとに「,」を付けることで改行をなしにできます。

```py3
print('Hello' ,)
print('World')
```

```text:実行結果
HelloWorld
```

##printで変数を出力する

###printで変数だけを出力

Pythonでは変数に文字列や数字を格納することができます。printを使えば変数に格納した文字列や数字を出力することもできます。

```py3
strings = 'Hello, World!'
number = 100

print(strings)
print(number)
```

```text:実行結果
Hello, World!
100
```

これで、printを用いて変数を出力できるようになりました。しかし、printで変数を出力する時に、任意の文字列と一緒に表記したい時があると思います。例えば、ある計算結果が100になった際に、ただ「100」と表示するよりも「答え：100」といったように出力したほうがわかりやすいですね。

Pythonのprintには、文字列と変数を一緒に出力する方法がいくつかあります。

###format関数

Python2.6以上から使うことができる新しい方式が、format関数を使って文字列と変数を出力する方法です。format関数の書式は以下の通りです。

print('任意の文字列{0}任意の文字列'.format(変数)

format関数を使う時は、任意の文字列を入力し、変数を代入したい場所に{0}を入力します。すると、{0}の位置にformatの引数になっている変数の値が表示されます。

```py3
number  = 100

print('答え：{0}'.format(number))
```

```text:実行結果
答え：100
```

表示したい変数が複数あるときは、{0}, {1}, {2}….と{}を増やしていき、format関数の中の引数にformat(変数1, 変数2, 変数3…..)というように追加していきます。

```py3
answer1 = 50
answer2 = 100
 
print('答え1:{0}, 答え2:{1}'.format(answer1, answer2))
```

```text:実行結果
答え1:50, 答え2:100
```

###%記法

%記法は%演算子を使って変数で置き換える方法です。 C言語などでおなじみの方法ですね。%dや%sなどの変換指定文字を利用して文字列と変数を出力します。%記法の書式は以下の通りです。

print('任意の文字列%s任意の文字列') % 変数 #変数の中身が文字列のとき
print('任意の文字列%d任意の文字列') % 変数 #変数の中身が整数のとき

変換指定文字はいくつか種類がありますが、変数の中身が文字列のときの「%s」、整数の数値のときの「%d」の2つがとくによく使われます

```py3
answer = 50
 
print('答え:%d' % answer)
```

```text:実行結果
答え:50
```

%記法で複数の変数を出力したい場合は、タプル型を利用します。

```py3
name = 'Tanaka'
point = 80

print('%sの得点:%d' % (name, point))
```

```text:実行結果
Tanakaの得点:80
```

###文字列+変数

3つ目の方法は、+演算子で文字列と変数を足し合わせて一つの文字列として出力することです。Pythonでは+演算子で文字列と文字列や文字列を格納した変数を足し合わせることができ、これを連結といいます。print関数の中で文字列を連結することで、一つの文字列にしてそのまま出力することができます。

```py3
a = 'hello'
b = 'world!'

print(a + ',' + b)
```

```text:実行結果
hello,world!
```

連結ができるのは文字列だけなので、数値などを出力するときは文字列に変換してから連結するようにしましょう。

```py3
name  = 'Tanaka'
point = 80

print(name + 'の得点:' + str(point))  #pointをstr関数で文字列に変換
```

```text:実行結果
Tanakaの得点:80
```

・日本語の扱いについて
ここまでのサンプルでもお分かりかもしれませんが、Pythonのprintでは、当然日本語を出力することができます。しかし、何も考えずに日本語を出力しようとするとエラーになることがあります。

参考サイト
[【Python入門】Print文での文字列の出力の仕方](http://programming-study.com/technology/python-print/)
recentfでらくちん高速ファイルオープン

みなさまはファイルを開きますか？ Emacsの履歴機能、使ってますか？

こんにちは、私のEmacsを起動する[.emacs Advent Calendar 2016](http://qiita.com/advent-calendar/2016/dot-emacs)のお時間です。

## recentfとは何か

テキストエディタの基本的な機能である「最近開いたファイル」を実現するEmacs標準の機能です。標準機能ですがデフォルト設定されてません。

基本的な概念の紹介は@tomoyaton[^1]の[Emacs で最近開いたファイルのリストを自動保存する。 - 日々、とんは語る。](http://d.hatena.ne.jp/tomoya/20110217/1297928222)が参考になります。

私の設定はtomoyaさんの設定を完全にぱくったので、以下のような感じです。

```el
(setq recentf-max-saved-items 2000) ;; 2000ファイルまで履歴保存する
(setq recentf-auto-cleanup 'never)  ;; 存在しないファイルは消さない
(setq recentf-exclude '("/recentf" "COMMIT_EDITMSG" "/.?TAGS" "^/sudo:" "/\\.emacs\\.d/games/*-scores" "/\\.emacs\\.d/\\.cask/"))
(setq recentf-auto-save-timer (run-with-idle-timer 30 t 'recentf-save-list))

(recentf-mode 1)
(bind-key "C-c っ" 'helm-recentf)
(bind-key "C-c t" 'helm-recentf)
```

`recentf-auto-cleanup`は存在しないファイルを消すための設定ですが`'never`(消さない)に指定します。オフライン時にうっかりリモートサーバのファイルを開こうとしたところ、recentfの履歴が全滅してしまったことがあるからです。

`recentf-exclude`のファイルは順に`recentf`(履歴ファイルそのもの)、Magitのコミット編集ファイル、タグファイル、TRAMPを使ってsudoを使ってほかのユーザの権限で開いたファイル、ゲームのスコアファイル、Caskでインストールされた依存ファイルです。

30秒に一度自動保存するのもtomoyaさんの受け売りです。この設定によってEmacs終了時以外にも履歴ファイルを保存してくれるようになるのでべんりです。

## いつでもrecentf

Emacsでファイルを簡単に開く機能はいくつもあります。Emacsの[ブックマーク](https://ayatakesi.github.io/emacs/24.5/Bookmarks.html)機能[^2]や[Projectile](https://github.com/bbatsov/projectile)なんかも有名です。

でも、いろいろ覚えなくても履歴から開く程度の雑さが気に入ってます。

私は<kbd><kbd>C</kbd>-<kbd>c</kbd> <kbd>t</kbd></kbd>のような押しやすいキーを`helm-recentf`に指定して、すぐに開けるようにしてます。

## 補完インターフェイスとrecentf

Emacsには入力を補完するためのフレームワーク的なライブラリがいくつかあります。詳細は[君は誰とEmacsる？ (補完インターフェイス紹介篇)](http://qiita.com/tadsan/items/33ebb8db2271897a462b)をお読みください。

さて、このようなライブラリを利用すればおてがるにファイル名を絞り込んで開くことができます。

ただし、IDOはデフォルトで`recentf`を候補にして開く機能はないので、以下のようなコマンドを`.emacs`ファイルで定義してやると良いです。

```~/.emacs.d/init.el
(defun my/ido-recentf ()
  (interactive)
  (find-file (ido-completing-read "Find recent file: " recentf-list)))
```

そんな怪しげな仕組み、よくわかんないよ… ってひとは`M-x recentf-open-files`でもふつうに開けます。ファイル数が多い場合は<kbd><kbd>C</kbd>-<kbd>s</kbd></kbd>で目当てなファイルを検索してやればいいです。

## 起動、そしてrecentf

Emacsの起動直後に何かやりたい、といふ私のために書いた記事が[起動直後になんかする。recentfとかね](http://qiita.com/tadsan/items/3d4c5d14850cff7fbcb5)です。そのときの私はEmacsの起動直後に履歴からファイルを絞り込んで開きたかったのです。

その成果物が[init-open-recentf](https://github.com/zonuexe/init-open-recentf.el)です[^3]。これはEmacs 24.4以上でないと動きませんが、補完インターフェイスと統合されてゐます。

るびきち師に紹介記事([init-open-recentf.el : Emacs起動時にrecentfを開く(ido/anything/helm対応)](http://emacs.rubikitch.com/init-open-recentf/))を書いていただきました。

<q>ido/anything/helm対応</q>って書いてあるのですが、さっき[Ivy/Counsel](https://github.com/abo-abo/swiper)に標準対応しました ヾ(〃＞＜)ﾉﾞ

## あとがき

Emacsでファイルを高速に開く方法はいくつかあるのですが、履歴を残しておくことで十分高速にファイルを開けるんじゃよ、って話でした。

## 脚注

[^1]: 「Emacs実践入門」と「Atom実践入門」を書いた大竹智也さんです
[^2]: 異常に雑な英語でドキュメントを書いたら、初めて英語のわかるひとからPRが届いてしまったやつ
[^3]: [Emacsのブックマーク機能 - tototoshi の日記](http://tototoshi.hatenablog.com/entry/20101226/1293334388)
情報処理技術者試験に合格する方法

# 前置き

学生といえば試験！？、ということでこのネタをチョイスしました。
私は高度を含めていくつか取得しているのですが、ぶっちゃけた話、資格手当欲しさでして、そういうインセンティブがなければ特に取る意味もないのかなと思います。少なくとも、**転職活動には全く役に立たないよ！！**
とはいえ、試験受ける受けないは別として、エンジニアとしてやっていきたいなら、基本情報技術者試験レベルのことがちょっと勉強してマスターできないようでは辛い思いますけどね。

# 午前

問題の数割は過去問と全く同じ問題が出ます。なので、ひたすら過去問を解くのが合格だけを考えれば一番早いです。
一昔前までなら、できるだけ問題がたくさん載っている問題集を一冊買って、というところだったのですが、今は [過去問題](https://www.jitec.ipa.go.jp/1_04hanni_sukiru/_index_mondai.html) が公開されていて結構な年数分たまっているので、問題集を買う必要すらありません。
過去問題を片っ端からひたすら解きましょう。わからない問題は調べて理解しましょう。
頑張っても理解できないー、という人は、そもそも多分向いていないので諦めましょう。そんな人が、例えば丸暗記して午前をくぐり抜けたとしても、午後は無理でしょうから・・・。

で、最終的には、ある程度の割合で「選択肢を見れば問題を見なくても答えがわかる」レベルになっていることが理想です。これは、丸暗記せよという意味ではなく、少しでも楽をして午後に余力を残しておきたいがためです。なお、試験のレベルが上に行くほど、これが地味に効いてきます。

# 午後

受けたことのあるやつだけ

## 基本情報技術者試験

午前の問題が理解して解けて、論理的思考ができるなら、いけるでしょ？
後半の言語は、特にこだわりがなければ **C 言語** を選ぶべき。少なくとも同種の Java とくらべても問題のレベルが低いです。というか、基本情報に限らず、情報処理技術者試験に登場する Java のソースはなかなかのアレっぷりなので見ること自体を避けるべきです。

## 応用情報技術者試験

昔は（といっても、私が受けた「ソフトウェア開発技術者試験」の頃の話）、時間の割に問題数が多くて、とにかく早く解くことが求められていたような気がしますが、今はそうでもないんですかね？
ともあれ、選択式なので、「自分の知識でわかる問題」「知識はなくても問題文ちゃんと読めば解ける問題」をちゃんと見つければ問題ないんじゃないですかね。特に後者。

## システムアーキテクト

まだ「アプリケーションエンジニア」だった頃に受けてますが、「ソフトウェア開発技術者試験」より楽だった、という印象しかないです。
まあ多分国語の試験です。（問題をちゃんと読めば知識不足でもある程度答えが導き出せるのでなんとかなる、の意）
用語とか、知らないとどうしようもないものはどうしようもないんですが。

## 情報セキュリティスペシャリスト

Web 系のお仕事に就いていて、ちゃんとセキュリティのことがわかって仕事できているレベルだったら楽勝で受かります。

## プロジェクトマネージャ

### 午後1

国語の試験。

### 午後2（小論文）

腕力の試験。（半分本当。やればわかります。）
真面目なアドバイスとしては、「プロジェクトマネージャとしての視点」を忘れないことが最重要みたいです。
そして、腕力を鍛える必要もあるので、実際に本番さながらに時間を区切って小論文を書く練習を何度もやっておくべきです。

なお、私は 4 回受けて 4 回落ちてます。（おい
繋げたがり屋のコミュ障が、イベントの人集めに奮闘した話

# はじめに

タイトルにはコミュ障と書きましたが、実際は人と話すのが大好きです。
でもけっこう頑張って人と話してます。
（自覚症状としては、軽い吃音症とかの傾向もあるような気がしてます。）

会社でも、同僚に話しかけるときに話す内容がまとまらないので、
必ずメモ帳を持参して話す内容をリストアップしてから話しに行きます。
メモ帳持参、「初心を忘れてない」と褒められたりもしましたし、話下手な人にはかなりオススメです。


# 概要

サイエンスアゴラ2016に出展した「４次元を見てみよう ～情報技術で描く数学の未来～」というプロジェクトに奔走した体験談をご紹介します。

![４次元を見てみよう ～情報技術で描く数学の未来～](http://www.jst.go.jp/csc/scienceagora/images/program/2016/aa_046_01.jpg)

エンジニアであるものの、開発にはほとんど携われなかったけど、人を集めたりするのに頑張った、というお話。


# @yuta_1nose さんを招くの巻

今年（2016年）の春に、[企画展CreativeAdventure](http://cr6ad7.net/)という展覧会に出展しました。
そもそも主催の じょいとも 氏が金沢つながりで、出展者の多くはその界隈の人々でした（大学は違ったので じょいとも 氏以外はほとんど初対面でしたが）。
そして展覧会本番、出展者でもなんでもないのですが、 @yuta_1nose さんという方が展示に来場していて、なぜか出展者と打ち上げするという仲です笑。
この方も金沢つながりの方です。

で、打ち上げの時に @yuta_1nose さんが「専門的な知識は少ないけどイベントのマネジメントとか裏方は得意だから何でも誘ってください！」とお声がけいただき、その数日後、今回のイベント人員募集のときに「適任な方！」と思いお誘いしました。

実際裏方としての仕事は素晴らしく、いろいろ段取りしていただいて当日もバリバリ働いてくださいました。

## <i class="fa fa-pencil"></i> 教訓

人の得意を察知せよ。


# スタンプラリーを受注させようとしたの巻

人集めというか仕事とつなげる、という話ですが、サイエンスアゴラの出展説明会というものがあり、
そこで「スタンプラリーを実施します」という説明がありました。

どんなことをしたかったか詳しくは伏せますが、ふと現職のプロダクトを横展開してお手伝いできるのではないか！と思い立ち、案件の担当社員に尋ねてみました。
一応慎重に案件として成立するか考えてくれたのですが、よくよく振り返れば予算、期間、技術面、人脈、どれをとっても相当無理がある話でした。
ということで、貴重な仕事時間を奪うだけの結果となってしまいました。
繋げたがり屋の宿命で、「こことここを繋げちゃうか！」という変化球もよくやってしまうのですが、その先には気まずさが待っているのが大抵の結末です。

## <i class="fa fa-pencil"></i> 教訓

つなげるにも限度がある。


# VR出資に奔走するの巻

今回の制作物がVRであるため、当然のことながらVR機材が必要となります。
リーダーの @miurror さんは自腹を切って高価なHMDを用意してくれましたが、それでも充分ではありません。開発には実機が多いに越したことはないし、HMDを動かすためのハイスペックPCも必要です。

うちの会社がVR開発に力を入れていることもあって、どうにか機材を貸してくれないか交渉することになりました。
まず、VR機材を貸してもらうにも、窓口が広報か人事か事業部か、というところもよくわかりませんでした。
とりあえず広報に聞いてみたら、あっさり借りられそうな口ぶりだったので、「よっしゃ！」と思いました。
で、「一応VRの管轄リーダーに聞いてみて」、ということだったのでリーダーに直談判に行ったら、
「案件と関係がないと一切貸し出しは不可能です。」ときっぱり断られてしまいました…。

別の線で、機材が無理なら資金援助を、と思い人事部に掛け合ってみたのですが、当然のごとく
「それって採用に繋げられるの？」と首を傾げられました。そりゃ当然。

そんなこんなで、開発メンバーには期待されていたのですが、出資周りに関しては全く貢献できませんでした…。

## <i class="fa fa-pencil"></i> 教訓

金の話になると難易度が一気に上がる


# @edo_m18 さんを巻き込むの巻

Qiitaコントリビューション数が僕の20倍以上のすごい人、 @edo_m18 （えど）さん。
実は元同僚で、お互い尊敬しあっている仲です。
えどさんはろくに数学を勉強できなかったにもかかわらず、3DCGの好きが高じて、独学で3DCGの原理に関連する数学を必死に勉強していました。
HTML5の分野ではCSSの鬼で、3DCGの勉強もしているのにモンハンとかもめちゃやってていつ寝てるのか本当に謎です。（脱線）
えどさんにはやはり数学の世界にどっぷり浸かってほしい、と兼ねてから思っていたので、 club-math というチャンネルにも招待してイベント情報とか頻繁に共有していたのですが、えどさんが会社を辞めるまで、僕が御用達の数学イベントには呼べずじまいでした。
今回のサイエンスアゴラ出展についても、一度はミーティングに来てもらったのですが、その後の都合が悪く、本開発には関わってもらえませんでした。
「あー、結局ダメだった…」と思ってイベントは終わったのですが、
内輪で打ち上げした後日、みらい研究所で再度打ち上げ 兼 新たにキックオフ、ということで、最スタートとして巻き込むことができました。
本当にえどさんは事ある毎に誘ってきたので、粘り勝ちといったところでしょうか。

## <i class="fa fa-pencil"></i> 教訓

どうしてもつなげたい人にはこまめにアタック。


# まとめ

「セレンディピティ」だとか「一期一会」だとかそんな言葉をよく口にしますが、
最後に大きなことを言わせてもらうと、「すべてのものはつながっている」ということが世界の真理だと思う次第です。

そしてもうひとつ大きなことを言わせてもらうと、「人間やっている以上、人間と関わることからは逃れられない」ということです。
僕はコミュ障ながら、「人間に見捨てられては終わりだ」と自分に言い聞かせて人間にへばりついてきました。

数学カフェ、サイエンスアゴラも、本当に素晴らしいメンバーと仲良くできて、幸せな環境でした。


# 最後に

本番間際にジョインしてくれた大学生の方と、打ち上げを機に仲良くなりました。
みらい研究所での打ち上げでは二人仲良く（僕のミスで）終電を逃し、朝方まで語り合うという素敵な体験をしました。
彼も半ば強引につなげようとしているところです。繋げたがり屋なので笑。
[Linux] メモリ不足の時に、インフラとして対応できる1つのこと

この記事は[フロムスクラッチ Advent Calendar 2016](http://qiita.com/advent-calendar/2016/fromscratch)の6日目の記事です。


# 想定読者
　1. サーバーとかを立てたことないアプリ開発者
　2. インフラとは何か？と悶々としている人
　3. インフラリソースを気にしない開発者に違和感を感じている人
　4. 業務でLinuxコマンド叩いているけど、必要最低限しか使っていない人

# 自己紹介
- ITベンチャー2年目。25歳。
- インフラエンジニア。
- 東工大大学院 化学専攻修了。
- 新薬合成研究から、プログラミングまで。
- NHK（日本放送協会）大好き♥
- 東京生まれ。東京育ち。
- 最近のマイブームは、ランニング。

# とある日・・・

A: 「なんか開発環境のバッチが落ちてるんだけど」
B: 「？？？なんで？」
A: 「とりま、ログみよ。」
A: 「ん・・・あー・・・」

>*"Cannot allocate memory"*
>or
>*"OutOfMemoryError"*

こいつのログを見るたびに
憤怒、悲嘆とも言い切れない気持ちになって
叫びたくなる。

![訴えてやる.png](https://qiita-image-store.s3.amazonaws.com/0/95804/6b50c48c-adc7-1241-6f87-2a5f09d58e12.png)


# メモリ不足の時に、インフラとして対応できる1つのこと

###1. お金を使う。

![豚の貯金箱のアイコン.png](https://qiita-image-store.s3.amazonaws.com/0/95804/1c3bab1b-14b0-1ae2-abca-98413d4d8dc1.png)

極論言うと、これしかない。
サーバーのスペックを上げるだとか、
まぁとはいえ、そんなことも言ってられないので
うーうー言いながら、考えていろいろ対策を考えました。

# メモリ不足の時に、インフラとして「それっぽく」対応できる3つのこと

### <font color="Red">1. メモリを使っているプロセスの特定</font>

```
# メモリの使用量の確認

free -m

# 実行プロセスのメモリ（RSS）の低い順番に並べる（一番下に一番メモリ使ってる奴が来る）

ps aux --sort rss

```

とりあえず、これ叩いておけば、だいたいわかる。
/proc/meminfo、とか、vmstatとか色々あるけど
そんなのはまぁドヤ顔するためのただの豆知識。

### <font color="Red">2. 開発側にpushする</font>

原因となるプロセス特定できた。
あとは、そのプロセスを管理・開発した（してる）人に
直してもらうようにpushするのみ。

### <font color="Red">3. 無駄なメモリを解放する</font>

```

# rootユーザーへ変更する
sudo su -

# ダーティー・キャッシュをディスクに落とし込む
sync

# ページキャッシュおよびディレクトリエントリー(dentry) とinode のクリア
echo 3 > /proc/sys/vm/drop_caches

```

（参照） http://www.shift-the-oracle.com/linux/utility/flush-buffer-cache.html

最終手段。
無駄なメモリがあれば、それを解放する。

最近流行りのRubyを始めとしたLL言語（lightweight language）は、
簡単に書ける一方でその分メモリ管理が非常に雑なところがある。
開発者がちゃんと意識して書かないと、すぐメモリリークetc...により
サーバーのメモリを解放しないで、気づいたら80 ~ 90%になっている。

cf.)
LL言語と言っても
「lightweight programming language」のC言語とかは
まぁある一定難しい分、メモリ管理を適切にできる。（はず）

ちなみに
実際に上記コマンドを実行すると、実行するとこんな感じ。

<img width="1270" alt="スクリーンショット 2016-12-06 23.23.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/95804/254f4a26-1464-84b6-b5e2-fda93dfe02cc.png">
（参照）http://grafana.org/


# まとめ
正直
「3. 無駄なメモリを解放する」みたいな
「子供（開発者）が出したおもちゃを親（インフラ）片付ける」
ような対応は、どうせすぐまたメモリが溢れてくるし、本質的ではない。

それを開発した（してる）人
もしくは
やったこと無い人、今後引き継ぐ人が対応してこそ初めて
プロダクト的にも、組織的にも価値があるのではないでしょうか。

まぁたぶん開発者も
このクラウドファーストの時代が進んでいくと
- ログのローテートや退避
- 監視
- セキュリティ
- インフラリソース
など、インフラを意識した開発をしないと
これからの開発者は淘汰されていくんじゃないかな。
「DevOps」「SRE」然り、「OpsDev」とかいう言葉も出てきたし。

>Site Reliability Engineering: How Google Runs Production Systems
>https://www.amazon.co.jp/Site-Reliability-Engineering-Production-Systems/dp/149192912X
>これ読も。

私も「インフラ」だけではなく、頑張らねば(｀・ω・´)ｷﾘｯ
OpenStackつらい話～或いはInfinibandつらい話～

本記事はOpenStackをInfiniband（eipoib）にて導入しようとして蹴躓いた（現在進行形で蹴躓いてる）話です

#OpenStackについて
OpenStackは（パブリック|プライベート）クラウドを構築するソフトウェアプラットフォームで、2010年にRackspaceとNASAが開発を開始しました。（意外と若いような、若くないような・・・。）
OpenStackを用いることで、あらゆるベンダー/あらゆるタイプのハードウェア資源を協調動作させ、ユーザーにダッシュボード、もしくはCLI、RESTful APIで提供することができるようになります。

ようは複数台の物理マシン上のKVMとかVMWareの利用状況をAMQPとかのメッセージプロトコルを使ってDBに貯めて
一元管理し、APIで注文受け付けたらリソースが余っているところから切りだせるようにしたのがOpenStack。

 
#何がつらいか


* **つらみポイント①コンポーネント多すぎ問題**

現在の最新バージョンMitakaにおけるコンポーネントは
Nova,Swift,Glance,Horizon,Keystone,Neutron,Cinder,Heat,Ceilometer,Trove,Sahara,Ironic,Zaqar,Manila,Designate,Barbican

**・・・・・・・・多いわ！**
んでもって名前が直感的じゃないのでパッとみよくわからない。
この中で一番重要かつOpenStackを運用する上で最低限必要なのはたった**4つ**
・Nova
・Glance
・Keystone
・Neutron
あとはWeb画面としてHorizonがあるといいかな、というぐらい。もちろん他のコンポーネントも使いこなせると便利なのだけど、
ひとまずはこの4つ+1つを扱えるようになれば構築はできると思います。
基本的な流れは以下の通り

1. まずKeystoneというユーザ認証をつかさどるコンポーネントにユーザを登録します

2. Glanceという仮想マシンのOSイメージを貯めておくところにKVMで作ったイメージ（にvirt-sysprepしたもの）とかOS配布サイトで拾えるクラウド用のイメージを登録

3. Neutronという仮想ネットワークを作成するコンポーネントでvlanを定義（flatという物理マシンと同じネットワークを使うこともできるし、スイッチを跨ぐvxlanとかもある）

4. NovaというKVMなどの仮想基盤上に展開されている仮想マシンを管理するコンポーネントを使い、1.で作ったユーザでログイン（CUIなら環境変数にユーザ・パスワード記載）して、2.で作ったイメージを指定し、3.で作ったネットワークを指定して仮想マシンをブートします。


運用する上ではその他にCeilometer（リソース監視のコンポーネント）もあるといいかな、と思いますが、これが結構曲者でVM立ち上げてるだけでガンガンDBに書き込みやがりますのでディスク容量の見積もりなどを行った上、定期的にDBから削除したりログを削除したりといった工夫が必要になります。
CinderやSwiftのような外部ストレージもあると便利ではありますが、プライベートクラウドのようなある程度自由にできる環境であれば（社員だけが使うことが分かっている状況）NFSとかの方が使い勝手よろしいんじゃないかという気がします。共有できないので。（Manilaという新たに追加されたコンポーネントで共有できるようになるみたいですが・・・）
ということで色々コンポーネント増えまくってはいますが結局やってることはリソースを一元化・抽象化してRestful API生やしてるだけじゃーんということがわかると理解が楽でよろしいかと思います。なんか怒られそうな気がしますが。

* **つらみポイント②ネットワーク複雑すぎる問題**

こっちが本題。
さて基本的には上記の通りなのですが、ここにOpenvswitchが絡むと話がややこしくなります。
（ていうかNeutronってだけでややこしい？）
Openvswitchは仮想ネットワークソフトウェア（仮想スイッチ）で、OpenFlowというSDNを実現するための標準に対応しており、このOpenvswitchによって仮想マシンのネットワークの管理を行うことが可能になります。
OpenvswitchはLinux bridgeと互換性があり、NeutronにおいてはLinux bridgeとの選択となりますが機能の豊富さからOpenvswitchが選択されることが多いようです。


**そしてそれが全ての苦難の始まりだった・・・**

というのもこのOpenvswitch、仮想マシンの管理において仮想ブリッジを複数作成して管理するので身に覚えのないブリッジデバイスがなんかたくさんできてるという状況になります。（例：br-int,qvo何某,tap何某,etc,etc,）
ついでに、作成したネットワークがflatかvlanかでブリッジデバイスの付け方が違う上、Infiniband上で利用しようとするとipoib（IP over Infiniband）ではダメで、eipoib（Ethernet IP over Infiniband）でなければいけないという困った仕様があります。（というか開発できていないだけ？）
eipoibはせっかくInfinibandで流れてるフレームにわざわざEthernetのヘッダを付け加え（もちろんパフォーマンスは劣化します）完全にEthernetと同じ状態にするプロトコルで、困ったことにあまりデバッグされていない機能のため、様々な問題が発生することがあります。
たとえばofed（Infinibandのドライバ）のバージョンによってはeipoibのパケットが正しく流れないというバグがあるせいかflatを指定しているのにvlanのような状態になったり、ofedのバージョン上げたらflatに戻ったり、ハードによってはflatに戻らなかったりというような地獄が現出します。
その他、SR-IOVというInfinibandのハードウェア仮想化機能においても、Firmwareのバージョンやofedのバージョン、Openvswitchのバージョン、OpenStackのバージョン次第でできたりできなかったりします。

**とてもつらい**

ということで結論として、OpenStack+Infinibandの組み合わせは結構Buggyであんまり知見がないのでよほどInfinibandに強いとか、どんな状況でもInfinibandのFirmwareやドライバを好きに上げられる、
Linuxのカーネルを好きに上げられる、OpenStackのバージョンを最新に上げられる状況の上、多少バグっててもすぐさま自作パッチ当てて二度とバグが表面化しないというような能力を持っていない人はたぶん普通にEthernetで組んだ方がいいんじゃないかなって思いました。はい。
もちろんInfiniband+SR-IOVが正しく構築できればそのコストパフォーマンスは多大なものがあるので挑戦できる環境であればぜひチャレンジしていただきたいです。そして知見を共有してください。**なんでもしますから！**

以上、2016年を締めくくるバッドエンド的なアドカレをお送りいたしました。ではまた来年。
Appcelerator Titaniumのドキュメントを印刷してみよう(≒Chrome上で内容を書き換えてから縮小印刷する方法(macOS))

#はじめに
[Titaniumのドキュメント](https://docs.appcelerator.com/platform/latest/#!/guide)は整備されていて、素敵なサンプルコードも随所にちりばめられていていいですよね。ブラウザで見たり、[AlfredとDashを用いて参照](http://blog.socketbase.co.jp/blog/2013/07/18/titanium-in-alfred-and-dash.html)すると便利ですが、印刷してじっくり見たい時もあります。右上にプリンターアイコンが有るので楽勝と思いきや押してみると、[一部のページ](https://docs.appcelerator.com/platform/latest/#!/guide/ListViews)で次のような[結果](https://docs.appcelerator.com/platform/latest/?print=/guide/ListViews)に。(2016年12月6日時点)

![AppceleratorDocPrint01.png](https://qiita-image-store.s3.amazonaws.com/0/63185/780c22a0-8613-7870-63fd-2cfec5645e3d.png)


コード中のインデントが詰まって表示されています。ソースを見るとインデントのスペースは入っているのですが、ブラウザで表示するとスペースが詰まっていました (´･ω･`)ゞ



#Webページ内の詰まったホワイトスペースを正常に表示する方法
こんな時はChromeブラウザのデベロッパー ツールを用いると便利です。HTML/CSSの内容を確認するのによく使われるツールですが、HTML/CSSの色などを手元内で書き換えて、試しに一時的に表示することもできます。Titaniumサンプルコードの部分にはprogramlistingというCSSのクラスが指定されているので、そのCSS styleに１行追加します。

以下はmacOS Chromeでの操作です。

1. Chromeで [表示] - [開発/管理] - [デベロッパー ツール] を選択します。（ショートカット：option + command + i）
2. Elementsタブを選択します。
3. headタグの中のstyleタグを開きます。
4. style内の記述をダブルクリックし、１行追加します（注意：空白部分をダブルクリックすると反応しません。コード部分をダブルクリックしてください）。下記の３行目が追加した行です。（HTMLのpreタグのように表示し、行間隔を調整したスタイルです）

```css
.description .short { display: none !important }
.description .long { display: block !important }
.programlisting {white-space: pre; line-height: 0.3em;}
```

<img width="967" alt="スクリーンショット03.png" src="https://qiita-image-store.s3.amazonaws.com/0/63185/98e58a89-01ba-e41e-1cec-ddfde2a90557.png">



#Macで縮小印刷する方法
そのまま印刷するとよく見れば長い行が途中で切れています。そこでページ数を抑えるためにも縮小印刷します。Macで縮小印刷するにはコツが要ります。試したページでは、縮小によって20ページが13ページに収まりました。

1. Chromeでcommand + pキーを押し、印刷ダイアログを表示します。
3. 左下の『システムダイアログを使用して印刷』を選択します。
4. 用紙サイズをA4、拡大縮小を70%とします。
5. 左下の選択肢から『プレビューでPDFを開く』を選択します。
6. プレビューで長い行が切れていたり問題ないか確認してください。
7. プリンターが手元に有る方はこのまま印刷してください。コンビニで印刷したい場合はUSBメモリかSDカードを用意し、[ファイル] - [PDFとして書き出す]を選択します。好みのファイル名で保存します。



#コンビニでPDFを印刷する方法
手元にプリンターが有ればそのまま印刷してOKですが、ここではコンビニに置いてあるマルチコピー機で印刷します。レーザープリンターできれいに印刷できます。
印刷システムは２つの系列に別れます。

- シャープ系
 - コンビニ：[ファミリーマート](http://www.family.co.jp/services/print/)、[ローソン](http://www.lawson.co.jp/service/others/multicopy/)、サークルＫ、サンクス
 - サービス名称：PDFプリント、写真プリント
- 富士ゼロックス系
 - コンビニ：[セブン-イレブン](http://www.sej.co.jp/services/print.html)
 - サービス名称：PDFプリント

注意：PDFファイルを予めネットで登録して印刷するネットプリント（またはネットワークプリント）というサービスもあるのですが、1ページあたり20円と割高なのでオススメしません。

PDFファイルをUSBやSDカードなどに入れ、マルチコピー機に挿入して印刷できます。どちらのシステムでもA4,A3共に1ページあたり10円で印刷できます。お好みに応じて両面印刷やA3で２ページ並べて印刷もできます（注意：どの印刷を選択しても１ページあたり10円です。１枚ではありません）。



#オススメのAppcelerator Titaniumドキュメント
TitaniumではTableViewの代わりにListViewを用いると、リスト表示が劇的に速くなります。印刷して書き込んだりしながら何度も見返すと、ViewとControllerの関係やTemplateの書き方の理解が進むのでオススメします。

- [ListView | Appcelerator Docs](https://docs.appcelerator.com/platform/latest/#!/guide/ListViews)
- [Alloy ListView Guide | Appcelerator Docs](https://docs.appcelerator.com/platform/latest/#!/guide/Alloy_ListView_Guide)
GLSL Sandboxで波動方程式を解いてみた

# きっかけ
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">先に言っておきますが、私は今日は間に合いませんので誰かお願いします</p>&mdash; h_doxas (@h_doxas) <a href="https://twitter.com/h_doxas/status/806056486984003584">2016年12月6日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">だれか！ お客様のなかに、シェーダ書きたくてしょうがないマンはいらっしゃいませんか！？！？！？！？</p>&mdash; h_doxas (@h_doxas) <a href="https://twitter.com/h_doxas/status/806063920335073280">2016年12月6日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

しゃあない雑に書くか :innocent: 

# 参考
http://qiita.com/edo_m18/items/e8efac43a93641c37ad2

# 動作
![無題.gif](https://qiita-image-store.s3.amazonaws.com/0/52576/73e19e35-f2b0-819a-9123-aa026330c8ec.gif)

# GLSL Sandbox
http://glslsandbox.com/e#37120.9

# コード

```glsl
#ifdef GL_ES
precision mediump float;
#endif

#extension GL_OES_standard_derivatives : enable

uniform float time;
uniform vec2 mouse;
uniform vec2 resolution;
uniform sampler2D backbuffer;

vec2 tex(vec2 uv)
{
	return texture2D(backbuffer, uv).xy - 0.5;
}

void main( void ) {

	vec2 pos = ( gl_FragCoord.xy - resolution.xy / 2.0) / resolution.y - mouse + 0.5;
	vec2 uv =  ( gl_FragCoord.xy / resolution.xy );
	vec2 prev = tex(uv);
	vec2 pixel = 1./resolution;

	// ラプラシアンフィルタで加速度を計算
	float accel =
		tex(uv + pixel * vec2(1, 0)).x +
		tex(uv - pixel * vec2(1, 0)).x +
		tex(uv + pixel * vec2(0, 1)).x +
		tex(uv - pixel * vec2(0, 1)).x -
		prev.x * 4.0;

	// 伝播速度を掛ける
	accel *= 0.2;

	// 現在の速度に加速度を足し、さらに減衰率を掛ける
	float velocity = (prev.y + accel) * 0.95;

	// 高さを更新
	float height = prev.x + velocity;

	// マウス位置に波紋を出す
	height += max(0.0, 1.0 - length(pos) * 30.0);
	
	gl_FragColor = vec4(height + 0.5, velocity + 0.5, 0, 1);

}
```
Azureのリソースイメージから立てたredmineのテーマを変更する

この記事は [Microsoft Azure2 Advent Calendar](http://qiita.com/advent-calendar/2016/microsoft-azure2) 7日目の記事です

2日めの記事で誰も書いてくれる人がいなかったら書こうと思っていたのですが、3~6日目は嬉しいことに書いてくださった方がいました。

今回はAzureでredmineを立てる→テーマの変更する部分を書いていきたいと思います。

## 1.Azureポータルでredmineを立てる

1. https://azure.microsoft.com/ja-jp/features/azure-portal/ からポータルにアクセスし、適当にリソースグループを作成(すでにリソースグループがあればそれを使用しても大丈夫です)

2. リソースグループを作成したら追加をクリックし、「redmine」と入力
![スクリーンショット 2016-12-06 15.34.23.png](https://qiita-image-store.s3.amazonaws.com/0/61480/406c3ad1-4dfb-9440-ef1b-089a303c6b94.png "スクリーンショット 2016-12-06 15.34.23.png")


3. 画像一番上に表示されている「Redmine」を選択し、作成をクリック
![スクリーンショット 2016-12-06 15.34.33.png](https://qiita-image-store.s3.amazonaws.com/0/61480/2f8a26b9-c2b1-eae5-2b4b-c2b0d44e6b87.png "スクリーンショット 2016-12-06 15.34.33.png")


4. 仮想マシンの作成ブレードが表示されたら各設定を入力していき購入をクリック
	* ※1. 基本構成の設定の認証の種類はパスワードにしておいた方が個人的には楽でした。
![スクリーンショット 2016-12-06 15.31.08.png](https://qiita-image-store.s3.amazonaws.com/0/61480/f9b66a10-c4be-a396-dae5-b2bf9f1be608.png "スクリーンショット 2016-12-06 15.31.08.png")

5. デプロイ完了→初回ログイン
	* デプロイが完了したらリソースグループに色んなリソースが作成されているので、その中にある「種類」欄のパブリックIPアドレスを選択し、構成を選択してDSN名ラベルを設定します。
	* 
	![スクリーンショット 2016-12-06 15.40.14.png](https://qiita-image-store.s3.amazonaws.com/0/61480/267c817c-853d-04af-1af4-30d37794d6d3.png "スクリーンショット 2016-12-06 15.40.14.png")
![スクリーンショット 2016-12-06 15.41.28.png](https://qiita-image-store.s3.amazonaws.com/0/61480/7e6548e7-6d91-226e-249b-19f20e4f8ad3.png "スクリーンショット 2016-12-06 15.41.28.png")
	* 上記手順が完了したら 入力したDNS名.選択したリージョン名.cloudapp.azure.comでredmineにアクセル出来るようになります。
	* 例) DNS名:redmin リージョン:東日本にした場合 redmine.japaneast.cloudapp.azure.com
	* アクセスできたらページ右下のアイコンをクリックするとログイン情報が表示されます
	![スクリーンショット 2016-12-06 15.49.12.png](https://qiita-image-store.s3.amazonaws.com/0/61480/cdfad25a-c74f-68ef-00c6-b6787b57ab70.png "スクリーンショット 2016-12-06 15.49.12.png")
	* パスワードは多分書いてなくてAzureの仮想マシンのブート診断を見てね的な事が書いてあるのでポータルに戻り確認します。
	* 確認できたら、Usernameとパスワードを入力してログインします。
	*以上で完了です。
	
## 2.redmineのテーマを変更する
テーマを変更したい場合は仮想マシンにsshでアクセスしてインストールを行います。
####1. 仮想マシンにログイン
アクセス方法はターミナル(windowsだとteraterm?)から

```bash:
ssh 仮想マシン作成時のユーザー名@redmine.japaneast.cloudapp.azure.com
```
と入力し、パスワードを求められるので仮想マシン作成時に入力したパスワードを入力します。

####2.テーマのダウンロード
まずはテーマをダウンロードするディレクトリに移動します。
ここのディレクトリがわからなくて詰まりました。

```bash:
cd /opt/bitnami/apps/redmine/htdocs/public/themes
```

移動できたら好きなテーマを選んでダウンロードしましょう
以下はテーマ一覧へのリンクです
http://www.redmine.org/projects/redmine/wiki/Theme_List

例として「farend basic」をダウンロードする場合は

```bash:
git clone https://github.com/farend/redmine_theme_farend_basic.git
```
でダウンロードできます。

#### 3. テーマの適用
ダウンロードが完了したらredmineに戻り、ページ上部の「管理」→設定→表示を選択します。
![スクリーンショット 2016-12-06 16.15.49.png](https://qiita-image-store.s3.amazonaws.com/0/61480/ebe48e6e-659e-01a5-7e28-ce1f671be763.png "スクリーンショット 2016-12-06 16.15.49.png")
テーマを選択すると一覧が表示されますので先程ダウンロードしたテーマを選択して完了です。

## おわり！
以上です、記事にしてみると簡単そうに見えますが以外とハマりました...
ただ、1から全部やることに比べると大分簡単じゃないかと思います。
また、プラグインを入れるときも結構時間がかかったのでそのことについても書く予定(あくまで予定)です！
htaccessとPHPで日本語のURLに対応する方法

URLを日本語に対応させる方法を記述しました。
5分で理解できるように意識して書きました。
処理も簡潔に書いてあります。

このようなURLを作ることがこの記事の目的です。
<pre><code>https://qiita.com/きーたの記事</code></pre>

# 仕組み
1, URLの文字と同じファイルやディレクトリが無かったら全てarticle.phpに飛ばす。
2, article.phpで入力された文字を配列から検索。
3, 同じ文字があったら、記事表示、無かったら404を表示

# 使うファイル
・article.php
・.htaccess
この二つのファイルを作成してください。

# .htaccess
.htaccessファイルに以下のように記述します。
<pre><code>&lt;IfModule mod_rewrite.c&gt;
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ article.php?requestname=$1 [L]
&lt;/IfModule&gt;</code></pre>

## .htaccessの説明
書き換え機能をONにする
<pre><code>RewriteEngine On</code></pre>
!-fは、すでにファイルがあったら書き換えを実行しない。
(存在するファイルをそのまま表示する)
<pre><code>RewriteCond %{REQUEST_FILENAME} !-f</code></pre>
!-dは、すでにディレクトリがあったら書き換えを実行しない。
(存在するディレクトリをそのまま表示する)
<pre><code>RewriteCond %{REQUEST_FILENAME} !-d</code></pre>
文字があったらarticle.phpに飛ばす。
requestnameパラメータに、入力された値を代入。
<pre><code>RewriteRule ^(.*)$ article.php?requestname=$1 [L]</code></pre>
下の正規表現を使用しています。
.とは任意の文字を表します。
*とは一つ前の文字の0回以上の繰り返しを表します。
()で、括弧内の文字をグループ化します。
<pre><code>^(.*)$</code></pre>

# article.php
article.phpの中にはこのように記述します！
入力された文字を配列から検索して、IDを取得しています！
<pre><code>&lt;?php
//データベースを想定したテスト用配列
$databaseInfo = [
  [
    "id"=>1,
    "file_name"=>"記事"
  ],
  [
    "id"=>2,
    "file_name"=>"ぎっとはぶ"
  ],
  [
    "id"=>3,
    "file_name"=>"きーた"
  ]
];

//requestnameの値を変数に格納
if(!empty($_GET["requestname"])){
  $requestName = htmlspecialchars($_GET["requestname"]);
}else{
  header("HTTP/1.0 404 Not Found");
  exit(0);
}

//同じ文字がないか検索する
$urlExist = false;
$ArticleData = array();
foreach($databaseInfo as $val){
  if($val["file_name"] == $requestName){
    $urlExist = true;
    $ArticleData = $val;
    break;
  }
}

//存在したら記事の内容を表示
//存在しなかったら404を表示
if($urlExist){
  echo "データベースからIdが".$ArticleData["id"]."の記事を表示する";
}else{
  header("HTTP/1.0 404 Not Found");
  exit(0);
}</code></pre>
これで完了です。

# DEMO
URLに「きーた」という日本語を入力して見ます！

<img width="406" alt="スクリーンショット 2016-12-06 8.46.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/89992/be05440c-7298-ce70-9920-862c24987329.png">

3というIDが取得できました！
実際のデータベースの情報もこれと同じように実装できます！

# 結論
・.htaccessで同じファイルに飛ばすことができる。
・.htaccessでファイルやディレクトがあったら書き換えを行わないという記述ができる。
・URLの文字をデータベースから検索して記事を表示する。
・header("HTTP/1.0 404 Not Found");でヘッダ情報を404にできる。

自分は昔はURLの日本語対応を実装できなかったが、改めて行ったら一瞬で実装できた。
phina.jsでアイコンフォントを使ってみる

ちょっとしたミニゲームやモックなどを作る際、わざわざ画像を用意するのが面倒だなぁと思うことがあります。
そんな時、Font Awesome等のアイコンフォントを画像として使うという手がありますが、phina.jsではこれが簡単に実現できます。

[![fa-icons.gif](https://qiita-image-store.s3.amazonaws.com/0/81823/ccc6eda0-3708-bda2-d6e1-bd281afd2b04.gif)
↑ 全部フォント](https://goo.gl/oKwgtv)

### 使用するもの
phina.js v0.2.0
Font Awesome v4.7.0

## １．アイコンフォントの読み込み
まずはフォントデータを読み込む必要があります。
phina.jsのアセットローダーはフォント読み込みにも対応してますので、これを使ってアイコンフォント（今回はFont Awesome）のwoffファイルを読み込みます。やり方は以下のような感じ。

```js
var ASSETS = {
  font: {
    fontAwesome: "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/fonts/fontawesome-webfont.woff"
  }
};
  
phina.main(function() {

  var app = phina.game.GameApp({
    assets: ASSETS,
  });
  
  app.run();
});
```

## ２．アイコンの描画
実際にアイコンを描画する方法は色々ありますが、Labelクラスを使うのが最もお手軽かと思います。

```js
phina.define("MainScene", {
  superClass: "phina.display.DisplayScene",
  
  init: function() {
    this.superInit();
    
    var iconUnicode = 0xf17b; // 10進数（61819）でもok
    phina.display.Label({
      text: String.fromCharCode(iconUnicode),
      fontFamily: "FontAwesome",
    })
    .addChildTo(this);
  }
});
```

アイコンの指定はunicode（10進数 or 16進数）で行います。
unicodeはString.fromCharCodeで変換し、Labelクラスのtextパラメータとして渡します。
fontFamilyには使用するアイコンフォント名を指定します。

[例えばドロイド君アイコンを表示するサンプルはこんな感じになります。](https://goo.gl/usxoiB)

unicodeは[チートシート](http://fontawesome.io/cheatsheet/)などで確認できます。

## 3.　拡張クラス IconShape
もうちょっと使いやすくするため、一例としてphina.display.Labelを拡張して最適化したIconShapeクラスを最後に紹介します。

```js:IconShape
phina.define('IconShape', {
  superClass: 'phina.display.Label',

  init: function(options) {
    if (typeof arguments[0] !== 'object') {
      options = { text: arguments[0] };
    }
    else {
      options = arguments[0];
    }
    
    options = ({}).$safe(options, IconShape.defaults);

    this.superInit(options);

    // width, heightプロパティをフォントサイズに合わせる
    this.setSize(this.fontSize, this.fontSize);
  },

  _accessor: {
    text: {
      get: function()  { return this._text; },
      set: function(v) {
        var iconInt = (typeof v === 'string') ? parseInt(v, 16) : v;
        this._text = String.fromCharCode(iconInt);
        this._lines = (this.text + '').split('\n'); 
      },
    }
  },
  
  _static: {
    defaults: {
      text: 'f024',
      fontSize: 100,
      fontFamily: "FontAwesome",
    },
  },
});
```

##### 引数はunicode単体、オブジェクト型どちらにも対応
通常のLabelクラス同様、引数の型で処理を分け、以下のどちらの書き方でもOKとなっています。

```js
IconShape(0xf024);

IconShape({
  text: 0xf024,
});
```

##### unicodeの文字列指定に対応
accessorをいじり、文字列が渡された場合はparseIntで16進数に変換してるので、`IconShape("f17b")`みたいな書き方にも対応してます。

##### デフォルトパラメータ
各種パラメータを指定しなかった場合に適用されます。ここにデフォルトのfontFamilyを指定しておくと便利かも。

```js
_static: {
  defaults: {
    text: "f024", 
    fontSize: 100,
    fontFamily: "FontAwesome",
  },
}
```

## 所感
アイコンフォントは割りと充実してますので、これらだけで一本ゲームを作ってみるのも面白いんじゃないかと思いました。

ちなみに使えるサービスやアイコンの種類を確認したり、必要なアイコンだけをまとめてパッケージングする際は以下のようなwebサービスが便利です。

- https://icomoon.io/
- http://fontello.com/


## 参考
[phina.js で Webフォント を使ってみるよ！](http://qiita.com/YFukuyama/items/052454c6cbcf91881f77)
[HTML5 CanvasとWebGLでアイコンフォント集Font Awesomeを扱う方法](https://ics.media/entry/8385)
Sass（CSSメタ言語）を使い始めた理由

Sass(SCSS)を業務に導入して３年くらい経った？
どうやらPostCSSへ移行する時期が来てるっぽいので、そもそも何故Sass(SCSS)を使い始めたのか振り返ってみる。

# Sassを知ったきっかけ
正直覚えてない。
zen-codingからemmetに乗り換えるために調べ物をしてる時に、時短技の流れで出会ったような気がする、多分。

# どこを気に入ったか
当時CSSの記述で苦しく感じてた部分を網羅的に解決してくれる手法だった。

- **ベンダープレフィックスの自動付与**
    - ２度と手で書かないと誓った
- **ネストとパーシャルファイルによるコードの構造化**
    - 数千行のcommon.cssを運用・リファクタリングする無理ゲーから解放された瞬間
- **念願の変数！！！**
    - あのカラーコードなんだっけ？ここのフォントサイズいくつだっけ？と調べる手間が減った
    - カラーコードとタイポ周りとz-indexは変数管理することで劇的に楽になる、と最近やっと理解した。

日本語ドキュメントはほぼなかったけれど、本家サイトのドキュメントのコード部分を読むだけで十分なほど単純明快にCSSの物足りなさを補ってくれると理解できた。

mixin機能やCSS4前方互換はオマケ程度の認識だった。
extendには少し期待してた（けど大きな罠だった）


# なぜSass/SCSSを選んだか
CSSに一番近い記述方法だったから、消去法で選んだ。
LESS,Stylusの方がオシャレだなーと思ってたけど、仮に業務で使うとなったら学習コストの低いSassだろうと思った。
さらにSCSSにしたのは、コーディングルールが努力義務程度のデザイナー界隈においてインデント＝ネストなんて恐怖でしかなかった。


# 業務に導入できたきっかけ
サイトカラーを変数化すればCSSファイルを切り替えるだけでサイトの着せ替え機能が作れる？と思案していたところに、当時携わっていたプロダクトの大規模リニューアルにマークアップ担当でアサインされたので、見切り発車で導入した（気がする）。**使い物にならなかったらSCSSファイルを破棄してCSSに戻れば良いだけ**なので、そこはもうシレッと導入した（気がする）。
サイト着せ替え機能は後日実装できればいいなと設計だけ仕込んでおいた。


# どうやって浸透させた

## まず警戒心を解くことから
当時のデザイナーチームはまだ３人しかいなくて、マークアップについては「見た目が大丈夫ならそれでOK」の空気があった。そこに、恐らく一度も使ったことのない黒い画面立ち上げて`npm install`から始まる小難しいコマンド打つわけなので、心理的なハードルはとても高かった。

なので「超絶時短になるから！！」「駄目だったらCSSに戻せばいいし！！」と代償の低い利点をアピールし、とりあえず触ってもらうことから始めた（気がする）。

間違っても「オシャレだから/最新だから/高機能だから」などと言って導入コストを意識させてはいけない。

## 環境設定のフォローに奔走
当初はWin+Dwだった。NodeいれてRuby入れてSass入れてCompass入れて、黒い画面で`compass w`と打つのは辛いから実行するだけの.batファイル作って作業開始時にダブルクリックすればOK状態にし、そのうちエディタ上でビルドできるからSublimeTextに乗せ変えて…と、制作環境が落ち着くまで結構時間がかかった。

PC管理者にはとてもとてもとてもお手間を取らせることとなったし、エラーが出るたびstackoverflowとgithubの英語ナレッジをググりまくるのは少し大変だった（英語ドキュメントに慣れる良いトレーニングにはなった）

今はチームにノウハウが蓄積してるのでMac&Win+ST3/Atom/Dwとマルチ対応できてる有り難さ。

## サイトの着せ替え機能が当たった
折り良くエイプリルフール企画で着せ替え機能を実装する機会が巡ってきて、結果的にちゃんとした１商品として開発してもらうことができた。

初めは季節イベントや単発だけのプレミア枠のハズだったんだけど、どうやら大当たりしたらしく機能拡充を続けていった。とはいえSassがないと期待されるスピードで作れないので、この辺りになると心理的にも業務的にも制作環境におけるSassは必需品となっていた。

今はこれをJSに置き換えて完全管理画面できないかなあと思案してる。


# つまり

使い始めた理由は「CSSの貧弱性を解決した（問題解決）」、現場に浸透した理由は「幸いなことに商品開発につながった（目に見える成果）」になる。


# PostCSS/cssnextに移行するにあたって

2016年現在CSSメタ言語というものがデファクトスタンダードにまで昇格してきた。運に恵まれ早期の導入成功に至ったのは幸甚だったと思う。

で、Bootstrapの作者が「次はPostCSSにするわ」と言ったこともあり、やっぱりPostCSS乗り換えも早く始めたい、というかコッソリ始めてる。
現場ではすでにタスクランナーと組み合わせてるので以前ほどコストはかからない（はず）

CSS4はあと10年は来ないだろうけど、「デファクトスタンダードだから」では学習の動機として薄い。CSS3と同じように「実質的にサポートしてる」が来た時には十分書けるようになっていたいかな。


# そしてやっぱり顔を出してくるJavascript

CSSメタ言語をどれだけ使いこなしたところで最後はただのスタイルシート。
多少条件分岐や関数が使えてもプログラミング言語ほどの柔軟性もなければ深度も浅い、と思ってました、**Gulpfile.js上にJSの記述でmixinを定義できる**と知るまでは。

まだ手元で検証してないのでどんな肌感かわからないけど、SassScriptで無理やりプログラムっぽい真似しなくても良いってことのようで非常に期待してる。
反面、とうとうCSSにすらJSが必要な時代になってしまったようで、10年以上何かと避けてたJSというものを根本から身につけなければいけないくて戦々恐々としてる。

# 来年の抱負
2017年はCSSのためにJavascriptのスキルアップに努めたいと思います。
今度はjQueryに逃げられないので必死です。
ASP.NET Coreで、bowerじゃなくてnpmから取得したパッケージをwwwrootに入れたい

ASP.NET Core Advent Calendar7日目になります。
http://qiita.com/advent-calendar/2016/asp-net

標準のASP.NET Core MVCのテンプレートを使うとbootstrap等のJSパッケージはbowerで取得するように作られています。
これをnpmから取得するように変更します。

# 環境
- Visual Studio 2015 Update3
- Node 7.2.0
- ASP.NET Core 1.0.1

今回はcsprojではなくproject.jsonのプロジェクト構成になります。
ここからはプロジェクトが作成された後の説明になります。

# Nodeを使う準備
## package.jsonの作成 
まずはnpm installに必要な`package.json`を作成します。`project.json`と同じ階層に置いてください。
パッケージの取得がメインなので細かい記述は省いています。例えばAngularJSの場合は以下のように記述します。

```package.json
{
  "name": "AppName",
  "version": "1.0.0",
  "private": true,
  "dependencies": {
    "angular": "~1.5.9"
  }
}
```

### Visual Studioで追加する方法
Visual Studioから追加する方法もあります。ソリューションエクスプローラからプロジェクトを右クリックすると__Quick Install Package__があるのでこれを選択します。
<img width="465" alt="quickinstallpackage.png" src="https://qiita-image-store.s3.amazonaws.com/0/44992/a15612c2-e475-0014-661b-7e45ae0a7b1c.png">
左のカテゴリから__npm__を選択し、パッケージ名を入力します。パッケージ名が正しければ右のバージョン選択ドロップダウンからバージョンを選ぶことができます。
すごく気づきにくいのですが、下の _--save-dev_ は選択すると編集することができます！(気づかないよ・・・:cry:)
_-dev_を消して_--save_とした後、Installを押すと上とほぼ同じような`package.json`が生成されます。
<img width="354" alt="npminstall.png" src="https://qiita-image-store.s3.amazonaws.com/0/44992/ddadd539-49f0-6258-d750-1098caf5c879.png">

Visual Studio2015は`project.json`を見つけると自動的にnpm installしてくれるみたいですね。

## publishの設定
`dotnet publish`でリリース版を固める時に任意のコマンドを実行することができます。ここで`npm install`をするように書きます。

```project.json
"scripts": {
    "prepublish": [ "npm install" ]
}
```

こうすると`dotnet publish`した時に自動的にnpmも実行されます。
Visual Studioのテンプレートから作った場合は`bower install`になってると思いますが、これを`npm install`に変更します。

# BundlerMinifier.Coreの設定
このままnpm installしてもwwwroot内に保存されないですし、保存するように書き換えたとしても、本当に欲しいのはその中のjsファイル一つだけだったりします。今回はMinifierを使うことで間接的に欲しいjsをwwwroot内にコピーする方法を紹介します。

BundlerMinifier.Coreは.NET Core版のMinifiierツールです。gulpとかでやってもいいんですけど、今回はこっち使ってみます。

## project.jsonの設定
`project.json`にBundlerMinifierを登録します。

```project.json
"tools": {
    "BundlerMinifier.Core": "2.0.238"
}
```

BundlerMinifierの最新版は.NET Core 1.1.0をターゲットとしています。1.0.1を使ってる人はこのバージョンを使うと動きます。

## bundleconfig.jsonの作成
`project.json`と同じ階層に`bundleconfig.json`を作成します。ここでどのファイルをminifyするかを設定します。


```bundleconfig.json
[
  {
    "outputFileName": "wwwroot/scripts/vendor.min.js",
    "inputFiles": [
      "node_modules/angular/angular.js"
    ],
    "minify": {
      "enabled": true,
      "renameLocals": true
    }
  }
]
```

ここでnpmから取得したjsをinputFilesに指定します。
inputFilesは複数のファイルを指定することができます。複数指定すると全部ひとまとめにギュッっと圧縮して一つのjsファイルにしてくれます。

### .gitignore
.gitignoreでminifyをはじくようにしないとvendor.min.jsがコミットされてしまいます。outputFileNameで指定したjsをignoreしておきましょう。

## publishの設定
先ほどnpm installするために書いたprepublishに`dotnet bundle`を追加します。このコマンドを実行することによってminifyが実行されます。

```project.json
"scripts": {
    "prepublish": [ "npm install", "dotnet bundle" ]
}
```

## htmlの参照を変更
htmlでminifyしたファイルを見に行くようにします。

```html
<script src="scripts/vendor.min.js"></script>
```

# さいごに
今回はjsのみでしたが、cssのminifyも対応してるみたいです。
私はあまりWeb系詳しくないのでなんでbowerやめる流れなのかはわからないですが、とりあえずnpmに乗り換えることはできそうです。
Rustプロジェクトのディレクトリ構成

# はじめに

これは[Rust その2 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/rust-lang-2)の7日目の記事です。

Rustプロジェクトを新規作成するとき`cargo new`を使うと以下のようなファイルが生成されます。

```
Cargo.toml
▾ src/
  lib.rs
```

大抵の場合これで十分なのですが、[公式ドキュメント](http://doc.crates.io/manifest.html#the-project-layout)を見るとオプション扱いのディレクトリがいくつかあるようです。
このあたりに関するまとまった記事はなさそうだったので、今回は`cargo`が特別扱いするディレクトリを全て使ったサンプルプロジェクトを作って簡単に解説します。

リポジトリはこちらです。
[dalance/sample-rs](https://github.com/dalance/sample-rs)


## ディレクトリ構成

サンプルプロジェクトの構成は以下の通りです。

```
▾ src/           # ソースファイル
  lib.rs         # ライブラリ用のエントリ・ポイント
  hello.rs
  world.rs
  ▾ bin/         # (オプション) 追加の実行可能形式
    hello.rs
    world.rs
▾ examples/      # (オプション) 使用例
  hello_world.rs
▾ tests/         # (オプション) 統合テスト
  hello_world.rs
▾ benches/       # (オプション) ベンチマーク
  hello.rs
  world.rs
```

`src`直下は見たままなので特にいうことはありません。
オプションになっているディレクトリが本題です。

### `src/bin`：追加の実行可能形式

バイナリ用のプロジェクトの場合、デフォルトではプロジェクト名と同じ名前のバイナリが`src/main.rs`をエントリ・ポイントとして生成されます。
もし1プロジェクトで複数のバイナリを生成したい場合、`src/bin`以下に`hoge.rs`などとすることでバイナリ`hoge`を生成できます。
これはライブラリのプロジェクトあっても有効なので、そのライブラリを使った簡易フロントエンドも付けたい、といった場合にも使えます。

このサンプルプロジェクトはライブラリですが、`src/bin/hello.rs`と`src/bin/world.rs`があるので

```
> cargo build
> ls target/debug
build  deps  examples  hello  libsample.rlib  native  world
```

というように通常生成される`libsample.rlib`の他に、`hello`と`world`もそれぞれ生成されます。

### `examples`：使用例

こちらはライブラリ向けですが、`examples/hoge.rs`に

```rust
extern crate hoge

fn main() {
// ライブラリhogeの使用例
}
```

として`cargo run --example hoge`とすると`hoge.rs`が実行されます。ライブラリ作成者の方は使用例を`README.md`に書く代わりにこちらを使うようにすると、実行して確認するといった作業が楽になりそうです。

サンプルプロジェクトでは

```
> cargo run --example hello_world
Hello World!
```

となります。

### `tests`：統合テスト

ユニットテストは各ソースファイルの末尾などに書くと思いますが、ファイルをまたいだ統合テストはこちらに置きます。
ちなみに`cargo`がテストとして認識するのは`tests`の直下だけです。なので、以下のような構成にしておくと各テストファイルから`mod common`として共通のソースを呼び出すことができます。

```
▾ tests/
  test1.rs
  test2.rs
  ▾ common/
    mod.rs
```

### `benches`：ベンチマーク

`#[bench]`を含んだベンチマーク用のファイルをここに置きます。このディレクトリは結構重要で、`#[bench]`を含んだファイルを`src`などに置いてしまうとstableでコンパイルできなくなってしまいます。（ベンチマーク機能は現状unstableなので）
このディレクトリに置かれたファイルは、`cargo build`や`cargo test`では参照されず、`cargo bench`の時だけ参照されるので、テストやバイナリのリリースはstableで行い、ベンチマークだけnightlyで行う、といったことが出来るようになります。

ちなみに`rustup run`コマンドを使うと以下のように通常はstableを使いつつ、ベンチマーク時だけnightlyを使うようにできます。

```
> rustc --version
rustc 1.13.0 (2c6933acc 2016-11-07) 
> rustup run nightly rustc --version
rustc 1.15.0-nightly (28d6623bc 2016-12-03)
> rustup run nightly cargo bench
```

## まとめ

Rustプロジェクトのディレクトリ構成のうちオプション部分を簡単に解説しました。
ちなみに`cargo new`で生成されるディレクトリ構成については[Resubmission of templating PR (#1747)](https://github.com/rust-lang/cargo/pull/3004)なるPRが出ていて

```
cargo new --template https://rustrepos.org/mytemplate foo
```

というようなことが出来るようになるかもしれません。
結構気になっている機能なので入ったら試してみようと思います。
1行のコマンドでローカル環境にEC-CUBEを最速でインストールする

先日、 [ぼくのかんがえたさいきょうのEC-CUBE3開発環境](http://qiita.com/kiy0taka/items/1bd6dae16c8b5c99151a) というエントリがありましたが、もっと手軽に最速で試したい方向けです。

1行のコマンドで、簡単に EC-CUBE3 がローカル環境にインストールできます。
**たぶん最速。手元の環境では10秒程度でインストールできました。** *(もっと速いやり方をご存知の方はつっこみください)*

下準備
---------

### Mac の方

Max OS X 10.9 以降の方は、特に何もしなくて大丈夫です。

### Windows の方

1. [Web Platform Installer](https://www.microsoft.com/web/downloads/platform.aspx) などで **PHP5.4 以降**をインストールします
2. [Git for Windows](https://git-for-windows.github.io) から **Git BASH** をインストールします

以降、 Git BASH でコマンドを実行します。


EC-CUBE3 のインストール
--------------------------

以下のコマンドを Terminal や Git BASH へコピー&ペーストし、実行してください。EC-CUBE のダウンロードからインストール、 Webサーバーの起動まで一発で可能です。
データベースには SQLite3 を使用します。

```shell
## for Mac
export ECCUBE_VERSION=3.0.16 && curl "http://downloads.ec-cube.net/src/eccube-${ECCUBE_VERSION}.tar.gz" | tar xvzf - && cd "eccube-${ECCUBE_VERSION}" && php eccube_install.php sqlite3 none && php -S localhost:8080 -t html index.php

## for Windows
export ECCUBE_VERSION=3.0.16 && curl "http://downloads.ec-cube.net/src/eccube-${ECCUBE_VERSION}.tar.gz" | tar xvzf - && cd "eccube-${ECCUBE_VERSION}" && php eccube_install.php sqlite3 none && php -S localhost:8080 -t html html/index.php
```

このコマンドは、 EC-CUBE3.0.12 以降で使用可能です。
EC-CUBE3.0.12 以降のバージョンを使用したい場合は、 `ECCUBE_VERSION=3.0.16` 等にバージョンを変更してください。

以下のようなメッセージが表示されたら、 ブラウザで http://localhost:8080 へアクセスしてください。

```
EC-CUBE3 install finished successfully!
PHP built-in web server to run applications, `php -S localhost:8080 -t html`
Open your browser and access the http://localhost:8080/
PHP 5.6.15 Development Server started at Mon Dec  5 17:21:50 2016
Listening on http://localhost:8080
Document root is /path/to/eccube-3.0.16/html
Press Ctrl-C to quit.
```

EC-CUBE3 のトップページが表示されると思います！
管理画面には http://localhost:8080/admin にて ID: admin PASS: password でログインできます。

XAMPP や MAMP、 Virtual Box や Vagrant、 Docker などを構築するより断然手軽です。


*ただし、あくまでも開発用ですので、本番環境では絶対に使用しないでください。*

EC-CUBE のインストールで挫折された方も多いと思います。ぜひお試しください。
幼女画像判定システムLolinco 機械学習編

# はじめに
※ **私もロリコンではありません**

この記事は、SLP_KBITその2 Advent Calendar 2016 - Qiitaの7日目の記事です。

この記事は前後編の後編になっているので、この記事を読む前に[こちら](http://qiita.com/gembaf/items/67f9f32dae4346dbe3fb)をご一読ください。

# Lolinco 機械学習編

それでは、SLPで行われたハッカソンで[gembaf](https://github.com/gembaf)と作成した[Lolinco](https://github.com/SLP-KBIT/Lolinco)というアプリの内、私が担当した機械学習の部分について説明します。(理解してなかったりコードすべて説明するとかなり長かったりするので、使い方などのだいぶふわっとした内容になってます)

# 開発環境
今回はGoogleが公開しているTensorflowという機械学習のライブラリを利用します。

Python 2.7.6
pipのリスト tensorflow (0.5.0)

インストールは以下などを参考に
http://qiita.com/bohemian916/items/4f0736dcea932a162d9e

# 処理の流れ
この処理の流れのうち、Tensorflowを利用しているのは、最後のロリかどうかを判定する部分になります。
![image](https://qiita-image-store.s3.amazonaws.com/0/96838/7fb9b239-1ab5-103a-1c5a-7170a169cc3d.png)

※ **画像から顔を抽出はOpenCVを利用している**

# 実装
# 1. モデルの作成
このフェーズでは、[フロント編](http://qiita.com/gembaf/items/67f9f32dae4346dbe3fb)の方で説明されたロリとその他の画像を教師データとして学習させモデルを構築します。

先に学習させるデータとテストデータの画像のpathと画像の分類(ロリかその他か)が入った`test.txt`と`train.txt`を作成します。

```test.txt,train.txt
train_img/loli/image_2942_0.jpg 1
train_img/others/image_1150_0.jpg 0
train_img/others/image_588_1.jpg 0 
          ・
          ・
          ・
```

これらの教師データをもとに、以下のコードからモデルを作成します。
https://github.com/SLP-KBIT/Lolinco/blob/master/lib/init_model.py

コードの最後にあるように、学習結果のモデルは`model.ckpt`として保存されます。

# 2. 画像の判別
それでは、先ほどの`model.ckpt`を使い画像の判別を行います。

画像の判別を行うコード
https://github.com/SLP-KBIT/Lolinco/blob/master/lib/judge_loli.py

実行時には判別したい画像を実行時引数として実行
今回の場合はOpenCVで画像から顔画像を抽出し、その顔画像に対し判別を行っています。

顔画像の抽出や画像の判別はSinatraのroutingに記述しています。
https://github.com/SLP-KBIT/Lolinco/blob/master/app.rb

# 参考文献
TensorFlowでアニメゆるゆりの制作会社を識別する
http://kivantium.hateblo.jp/entry/2015/11/18/233834

# 所感
普段から機械学習をやっているわけではないので、この企画が始まってからいいサンプル見つけてどうにか動かしたというのが実のところでした。

2日間でできるだけ理解して進めようとはしてみたけどコードの説明ですら専門用語が多く難しかったです… orz
また、Tensorflowに触る機会があったら今度はじっくり基礎からやっていきたいと思う所存。
Jupyter Notebook > NewボタンでPython2が選択できない時の対処方法 / Jupyterの気に入っているところ

@aki_yokさんお疲れ様でした。

12月7日分担当の7of9(セブンオブナイン）です。


```txt:動作環境
Ubuntu 14.04 LTS Japanese Remix
```

Jupyter Notebook(以下、Jupyterとする)関連のAdvent Calendarのネタを探す過程で、とりあえず新規Ubuntu環境にJupyter環境をインストールしようとしてました。

色々インストールした結果、Jupyterが起動するようになったのはいいのですが、右上のNewボタンに「Python 2」がない状態となりました。

この問題の対処をAdvent Calendarの記事とすることにしました。

### 症状

Newボタンを押して見えるのは以下のものだけでした。

- Text File
- Folder
- Terminal
- Notebooks

### 対策

以下の作業で「Python 2」が見えるようになりました。

```
$ sudo pip install -U pip
$ sudo pip install jupyter
```

以下の記事を参考にしました。
http://qiita.com/koara-local/items/8d48d0306c85c61aed97
> `4. pip で ipython notebook をインストール

情報感謝です。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/42118496-8be4-b677-f263-3c9114207378.png)

(補足) 
元の記事ではpip installにsudoはつけていません。本当はsudoは不要かもしれませんが、こちらではsudo付きで実行しました。

### 検索結果

同じ状況をgoogle検索したのですが、例は見つかりませんでした。
「Newボタン」「Python」「not found」などでは検索キーワードとしては弱すぎたようです。

Jupyterのインストール関連の記事を色々探して、見つけた上記のリンクのコマンドを試したら偶然直ったという感じです。

## Jupyterの気に入っているところ

Jupyterがない時の作業は以下のような感じでした。

1. ターミナルでエディタを起動しプログラムを作成
2. ターミナルでプログラムを実行
   - 結果のデータが生成される
3. ターミナルでグラフソフトを起動し、結果をグラフ化
   - グラフは複数となることが多いです
4. 1-3の作業を逐次実施する

この方法では「複数日にまたがる作業」をするためにはソフト起動状態を保持しておかないといけませんでした。

Jupyterの場合、ノートブックとして一連の作業が保持されます。一旦作業を終了してOSを落としても、数日後に該当ノートを開いてすぐに続きの作業ができます。

利便性が高いと思っています。

以上です。

明日は @mzmttksさん よろしくお願いいたします。
残念ながら

一昨日の記事で、粘着な煽りをくらっていましたが、
とうとうQiitaサポートにも頓珍漢な対応をされたため、今年はこれで断筆することにしました。

コメントの時系列を追えば、先に煽ってきたのはどちらかが明確なのに、
一方的に悪く罰せられることに、ここに抗議します。

では、さようなら。

煽ってきた奴らの味方をするQiitaで良かったね。


>Qiitaサポート (Qiita/Qiita:Team Support)
>12月6日 18:19 JST
>
>mesaka さま
>
>いつもQiitaをご利用いただきましてありがとうございます。
>Qiitaサポートです。
>
>早速ですがmesakaさまのQiita内でのコメントについて、Qiita利用規約 第8条2項4号に違反しており、他のユーザーさまからも多数ご指摘をいただいています。
>
>【ご指摘頂いたコメントの一例】
>
>http://qiita.com/mesaka/items/41ec09a4dae3fba6dd6c#comment-6b5b3a5ec215decf39d5
>http://qiita.com/mesaka/items/41ec09a4dae3fba6dd6c#comment-e52052e38bfb68992294
>なお現在ご報告いただいているものについては、サービス利用規約第9条7項に基づき当該のコメント内容を削除いたしました。
>
>Qiita利用規約
>
>今後同様な行為のご報告を他のユーザー様から一定数いただいた場合は、
>当社からの連絡の有無を問わずサービス利用規約に基づきコメントの速やかな削除や
>アカウントの削除を含めた対応をさせていただきますので予めご了承ください。
>
>どうぞよろしくお願いいたします。
>
>Qiitaサポート
Vim 8.0 Advent Calendar 7 日目 ウィンドウ ID

この記事は [Vim 8.0 Advent Calendar](http://qiita.com/advent-calendar/2016/vim8) の 7 日目の記事です。

Windows ID を使うことで、特定のウィンドウの追跡が容易になります。

## ウィンドウ ID がなかった時代

ウィンドウの指定はウィンドウ番号で行っていました。これはウィンドウの位置に対応して左上から順に振られます。

```
+-------------------------------+
|               |               |
|               |       2       |
|               |               |
|       1       |---------------|
|               |               |
|               |       3       |
|               |               |
+-------------------------------+
```

ウィンドウへ移動したり、ウィンドウに紐付けられた変数にアクセスする際は、このウィンドウ番号を使っていました。
しかし、このウィンドウ番号はウィンドウを移動すると変わってしまいます。例えば上の例で、ウィンドウ番号 1 の場所で `<C-w>L` を行うと、以下のようになります(括弧内は元のウィンドウ番号です)。

```
+-------------------------------+
|               |               |
|    (2->)1     |               |
|               |               |
|---------------|    (1->)3     |
|               |               |
|    (3->)2     |               |
|               |               |
+-------------------------------+
```

これだと困る、ということで埋まれたのがウィンドウ ID です。

## ウィンドウ ID とは

ウィンドウ ID は全てのウィンドウに振られる ID です。
ウィンドウ番号と違い、ウィンドウを移動しても変わりません。

### ウィンドウ ID の取得

```vim
" 現在アクティブなウィンドウのウィンドウ ID を取得します
let win_id = win_getid()
" 現在タブページからウィンドウ番号を指定してウィンドウ ID を取得します
let win_id = win_getid(winnr)
" タブページとウィンドウ番号を指定してウィンドウ ID を取得します
let win_id = win_getid(winnr, tabnr)

" バッファ名やバッファ番号から最初に見付かったバッファが
" 表示されているウィンドウのウィンドウ ID を取得します
let win_id = bufwinid(buf)

" 指定したバッファ番号のバッファを表示している
" ウィンドウのウィンドウ ID を配列で全て取得します
let win_ids = win_findbuf(bufnr)
```

### ウィンドウ ID の使用

```vim
" 現在のタブページからウィンドウ ID のウィンドウを探してウィンドウ番号を返します
" 見付からなかった場合は 0 を返します
let winnr = win_id2win(win_id)
" ウィンドウ ID のウィンドウを探して、
" そのタブページ番号とウィンドウ番号を要素 2 の配列で返します
" 見付からなかった場合は [0, 0] を返します
let [tabnr, winnr] = win_id2tabwin(win_id)

" 指定のウィンドウ ID のウィンドウに移動します。成功したら TRUE を返します
let succeed = win_gotoid(win_id)
```

## ウィンドウ番号とウィンドウ ID の併用

ウィンドウ ID は 1000 から振られます。これにより、1000 以上の場合はウィンドウ ID、1000 未満の場合はウィンドウ番号と仮定することで、既存の関数でウィンドウ番号を渡していた箇所でウィンドウ ID を渡せるようになっています。以下の関数で利用できます。

- `arglistid()`
- `getcwd()`
- `getloclist()`
- `gettabwinvar()`
- `haslocaldir()`
- `setloclist()`
- `settabwinvar()`
- `winheight()`
- `winwidth()`
IDCFCloud オブジェクトストレージへのファイルアップロード For AWS CLI or SDK

はじめに
===

IDCフロンティア社提供の分散型クラウドストレージ、
[オブジェクトストレージ](https://www.idcf.jp/cloud/storage/)を利用する機会がありました。

Amazon S3との互換性が高いとの事で、
S3的な方法でオブジェクトのアップロード出来るか試してみたのでメモメモ

事前準備
===
1. IDCF Cloudのコンソールからオブジェクトストレージで使う**APIユーザー**を作成
1. **エンドポイント**・**API Key**・**Secret Key**が作られるのでメモメモ
1. 作成した**APIユーザー**に紐付く**バケット**を作成しておく

AWS CLI編
===

* `AWS CLI`本体はインストールされている前提
* ちなみに環境は`Mac`です

これは非常に簡単

まずは認証情報を作成

```bash
$ aws configure
AWS Access Key ID [*****]:       # `API Key`を入力
AWS Secret Access Key [*****]:   # `Secret Key`を入力
Default region name [*****]:     # 適当なregionを指定
Default output format [*****]:   # 適当なフォーマットを指定
```

早速アップロード

```bash
$ aws --endpoint-url [エンドポイント] s3 \
cp [アップロード対象ファイルのパス] \
s3://[バケット]/[アップロード先となる対象ディレクトリのパス]
```

これでOK
単純に`AWS CLI`の`cp`時にオプションで`--endpoint-url`を指定するだけで、後は基本的に同じ
※オプションも同じ様に利用できます(`--recursive`とか`--acl`とかとか)


AWS SDK for JavaScript編
===

これは結論から言うと現時点では出来なかった...orz
ファイルアップロード時に
`No 'Access-Control-Allow-Origin'`
とインスペクターにエラーが表示

AWS S3ならCORS設定を追加・変更し、クロスドメイン制約を回避すれば良いのだが、
残念ながらCORSは未対応の様子でした:tired_face:


AWS SDK for PHP編
===

最新バージョン`3`での署名バージョン`4`には非対応のため、
`AWS SDK for PHP 2`なら可能


まとめ
===
* AWS CLIでは問題なくアップロード可能
* JavaScriptでの直接アップロードは出来ないので、ajaxでサーバ経由して等、一手間必要
* 今回はAWS SDK for PHP 2でも特に問題は無かったので、そこまで手間ではなかった

###### Created by [株式会社デジタルクエスト](https://www.digiq.co.jp) 杉田 允