OmniAICreator/Qiita-1.07M huggingface dataset:
【VBA上達事例】VBAで業務を効率化して会社のヒーローへ

※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの学習法を公開することで、皆様のお役に立ちたい意図で投稿しております。

参考サイト：[【VBA上達事例⑬】VBAで業務を効率化して会社のヒーローへ](http://programming-study.com/case/vba-first/)

#【VBA上達事例】VBAで業務を効率化して会社のヒーローへ

業務を効率化するためにVBAを学習した20代後半男性の体験談です。

##VBAはプログラミング初心者にオススメの言語

プログラミング学習を始める初心者の方に、私がオススメする言語はＶＢＡです。実際、私がＶＢＡからプログラミングの学習を始めて、今ではC言語やJAVAも大体は分かるようになりました。(プログラミングの学習を始めてから3年程度です)
ＶＢＡをオススメする理由として、

Excelは企業で使われていることがとても多い。そのため、VBAを使えたら、将来役立つ可能性が高いこと。(私の場合、会社でたまにヒーロー扱いされます。)
ネット上でVBAのプログラムコードのネタがかなり載っていること。
ことが挙げられます。
実際にプログラムを学習したり、組んだりする際には、後者の方は特に重要だと思います。

##非効率な業務に嫌気が差し、VBAを勉強し始めた

私がＶＢＡのことが大体分かるようになってきたなと感じるまでの期間は、大体3ヶ月程度でした。ここでは、私がVBAの学習を始めたきっかけをお話しします。私が勤めている会社ではExcelを使った業務があります。このExcelを使った業務を初めて先輩社員から教わったとき、非効率的な使い方をしていることに驚きました。私の場合、Excel自体は、高校の情報の授業で少し使った程度で、それ以来使うことはなく、使い方などきっぱりと忘れていました。ですが、この業務を教えられ、そっくりそのままその業務を遂行している時、私の脳の奥の方から「いやいやいや～！Excelをもっと上手く使えば、こんな業務、もっと効率的にできるって～！」という謎の声が聞こえ、後日ネットで調べていく中で、VBAに出会いました。プログラミングと聞くと、「難しそう」などの抵抗があるかもしれません。実際、私がそうでした…。ですが、私の場合、非効率的な業務をやっている(やらされている)ことからの不快感の方が、「難しそう」などの抵抗よりも断然上で、とりあえずでいいからネットで調べてやってみよう！と思い、VBAを始めました。

##とりあえずプログラムを書いて動かしてみることが大事

私がよく学習に使っていたサイトは、Office TANAKAやエクセルの神髄などです。どちらも解りやすく書かれており、初心者でも理解しやすいサイトです。
VBAを実際にやってみた感想ですが、「お！意外といけそう～！」と感じたのが私の感想です。そこからは、「とりあえずプログラムを書いて動かしてみて、思い通りに動かなかった場合、原因をネットで調べる」という方法でどんどん勉強していきました。ちなみに一生懸命考えてプログラムを書き、そのプログラムがうまく動いたときの感動を覚えてしまうと、プログラムの学習が楽しくなってきます。

##プログラミングができれば自信がつく

ＶＢＡが分かるようになってからは、他のプログラミング言語にも興味が出てきて、今も勉強中です。(ちなみにネットで調べているだけですので、私の場合、学習にかかるお金は通信料のみです。) ただ簡単に言えば、「(プログラミング言語は)大体は同じようなもんです！」 それぞれ、プログラムのコードの書き方が違うといったことは当然ありますが、VBAでプログラムの仕組みさえ理解していれば、他の言語の習得も比較的用意になると思います。何度も言いますが私がそうです。また、１つプログラムが学習できたという実感は、他の言語をマスターする時はもちろん、他のことに関しても「私ならできる！」という変な自信を与えてくれます。平々凡々な私が出来たのですから、皆さんもきっとできます。プログラミングを学習した先輩として、皆さんを応援しています！頑張って「変な自信」をつけてください！

【オススメ記事】
➡︎[【VBA上達事例⑫】コツはコードの丸暗記！使ったVBAの書籍は？](http://programming-study.com/case/vba-code/)
➡︎ [VBAの本・参考書の評判](http://programming-study.com/language/vba-book/)
➡︎ [習得必須！VBAを教われるスクールBEST5](http://programming-study.com/language/vba-school/)
➡︎ [10倍早く成果を上げる！初心者にオススメのVBA学習サイト6選](http://programming-study.com/language/vba-site/)
Disney Reasearch提供の3DレンダリングTips

[Disney Research](https://www.disneyresearch.com/publications/)が発表している論文がわくわくするものが多いです

* [リアルタイムゲームでの複数キーワードによる指示をするオンラインゲーム性能](https://www.disneyresearch.com/publication/g-g-go-juuump-online-performance-of-a-multi-keyword-spotter-in-a-real-time-game/)
* [Sparse Sensorsによるリアルタイムの物理モーションキャプチャー](https://www.disneyresearch.com/publication/real-time-physics-based-motion-capture-with-sparse-sensors/)
* [レンダリングのためのイメージ空間制御法](https://www.disneyresearch.com/publication/image-space-control-variates-for-rendering/)
* [たくさんの粒状の効率的なレンダリング](https://www.disneyresearch.com/publication/efficient-rendering-of-heterogeneous-poly-disperse-granular-media/)
* [モデルで構成する歯](https://www.disneyresearch.com/publication/model-based-teeth-reconstruction/)
* [ストーリの世界を構築しやすいアクセスしやすいグラフィカルインターフェイスの評価](https://www.disneyresearch.com/publication/evaluating-accessible-graphical-interfaces-for-building-story-worlds/)
* [Motion Stampを使用したプログラミングで表現できるアニメーションテキスチャ](https://www.disneyresearch.com/publication/programmable-animation-texturing-using-motion-stamps/)
【Ruby上達事例】ドットインストールを使って3ヶ月でRubyをマスター

※こちらの記事は、プロスタ編集部が現在大変人気の高いRubyの学習法を公開することで、皆様のお役に立ちたい意図で投稿しております。

参考サイト：[【Ruby上達事例②】ドットインストールを使って3ヶ月でRubyをマスター](http://programming-study.com/case/ruby-dotinstall/)


#【Ruby上達事例】ドットインストールを使って3ヶ月でRubyをマスター

ドットインストールを使ってプログラミングをマスターした男子大学生の体験談です

##きっかけは大学のプログラミングの授業

私がプログラミングを始めたのは、大学でプログラミングの授業があったことがきっかけでした。その授業では全員C言語を使うことが決められていました。プログラミングのことを知っている人ならわかると思いますが、C言語は初心者にとってはとっつきづらい言語です。もちろんメリットもたくさんありますが、初心者がとりあえずプログラムを書いてみて動かすことを体験する場合にはもっと簡単な言語があります。

そのことをネットで調べて知った私は、たまたま知ったRubyという言語でプログラミングを勉強することにしました。なぜRubyだったかというと、単に言葉の響きがよかったからです（笑）Ruby以外にもJavaやPHPやPythonという選択肢もありましたがイマイチピンとこなかったのです。

##ドットインストールを使って３ヶ月ほどでRubyをマスター

Rubyを勉強することを決めたのはいいけれど、どうやって勉強すればするのかということは手探り状態でした。そんな中で見つけたのが「ドットインストール」というサイトでした。このサイトは「3分動画でプログラミング学習」と銘打っていて、実際に3分前後の動画が数多くアップされています。動画の中では毎回新しいことが勉強できるようになっており、約30回程度で基礎が一通りマスターできるようになっています。

動画なので、講師の画面が実際に見える形での講義となっているため、とてもわかりやすかったです。また、自分がどの段階まで動画を見たのかをキチンと把握できるようになっているため、順を追ってしっかりと学ぶことができました。ただ、1回動画を見ただけでは完全にマスターできないので、1回全部見終わった後にもう一度最初から全部見直しました。

約3ヶ月ぐらいかけて、動画を2週することで基礎を完全にマスターできました。かかった費用はなんと0円です。ドットインストールは無料で学べるサイトなのでお金がかかりません。完全にプログラミング初心者の状態から始めたので３ヶ月かかりましたが、もし他の言語をすでにマスターしている人であれば、1ヶ月もあれば新しい言語を学べると思います。

##人に聞く前に自分の頭で考える時間を持つ

注意してほしいのは、3分の動画を見るだけでできるようになったわけではないということです。動画では詳しく解説してくれていますが、どうしてもわからない部分もでてきます。そういった場合はとりあえず丸1日自分で考えて、どうしても分からない場合は2chなどのプログラミングスレに質問を書き込んで誰かに教えて貰っていました。自分で考えることはとても大変でしたが、そうやって自分で考えた分だけ理解が深まったと思います。

プログラミング初心者の方にたった一つだけアドバイスするとすれば、「自分の頭で考える時間を持つ」ということです。分からないことがあった場合に、自分でしっかり考えてから人に聞くのと、何も考えずにすぐ人に聞くのでは力のつき方が全然違います。ですから、しっかり自分で考えることを意識してプログラミングを勉強していってほしいと思います。

【オススメ記事】
➡︎[【Ruby上達事例①】無料の学習サイトでRubyを３ヶ月で身につけた経験](http://programming-study.com/case/ruby/)
➡︎[【Ruby上達事例③】まつもとゆきひろさんから影響を受けてRubyを勉強](http://programming-study.com/case/matsumoto/)
【Python上達事例】Python初心者におすすめな学習サイトは？

 
※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの学習法を公開することで、皆様のお役に立ちたい意図で投稿しております。

参考サイト：[【Python上達事例①】Python初心者におすすめな学習サイトは？](http://programming-study.com/case/pyhton/)

首都圏のWeb系の会社に勤める男性がPyhtonを学んだ話です。

##IT企業への転職の面接対策でPyhtonの勉強を開始

Pythonを習得した体験談を紹介します。エンジニアとして他のプログラミング言語は使ったことがありましたが、新しく応募した会社ではPythonが必須となっていました。面接の一環として、Pythonを書く必要が生じたため、急遽、Pythonを学びました。PHPやRubyといった似た言語を使った経験があったため、それほど戸惑うことなく、簡単なプログラムを作成することができました。結果として、その会社から内定を得ることができました。

##Pythonは専門性をつけたい方にはおすすめ

Pythonは人気のあるプログラミング言語の一つです。特にデータ処理に強みがあるため、学術計算に使われることが多い言語です。また、Webサイトはもちろん、高速な処理が求められるソフトウェアに利用されるケースもあります。文法が単純であるため、初心者にも好まれるプログラミング言語である一方、データ構造やオブジェクト指向といった高いレベルの機能を有しているので、専門的なプログラマーにも好まれています。

##プログラミング学習サイトを活用し、1ヶ月ほどで基礎を勉強

無料のWebサイトを中心に学習しました。まず、Pythonの文法を学ぶために、チュートリアルに目を通しました。「Python チュートリアル」は日本語にも訳されています。次に、オンラインのプログラミング・スクールを利用しました。英語のサイトですが、「codecademy」を使いました。ブラウザ上で、Pythonの実際のコードを記述すると、その結果が表示される仕組みになっています。初心者でも、何が動いて、何がうまく動かないのかが分かりやすいのが良いところです。まだまだ学習の途中ですが、一か月ほどで概要を抑えることができたと思います。

##数学的な脳みそを使うのが大変だった

高度なデータ構造を理解するのが難しかったです。単純なリストだけではなく、連想配列やタプルといった概念がPythonにはあります。また、行列計算などの数学的な演算がPythonでは可能です。10年前に学んだ数学の知識を思い出しながら、データ構造を理解していく必要がありました。頭の中だけでは分からなくなってしまうので、自分がどのような演算をしているのか、紙に書いて整理しながら、プログラミングを進めていきました。

##初心者でも習得可能、一度身につけると一生役立つ

Pythonは初心者にも分かりやすい単純な文法をもった言語ですので、Pythonからプログラミングを始めることはおすすめできます。また、高度なソフトウェアにも使用されているので、複雑なソフトウェアやゲームなど、将来的にも活用できる余地は大きくあります。

【オススメ記事】
➡︎[【Python上達事例②】Pythonの基礎を無料サイトで2週間で習得した](http://programming-study.com/case/python/)
➡︎[Pythonの本・参考書の評判](http://programming-study.com/language/python-books/)
➡︎[プログラミング初心者がPythonを始めるべき3つの理由](http://programming-study.com/technology/python-recommend/)
PHP（とその他ちょっと）の幾つかのフレームワークで「get started」な状態のベンチを取った話


## 思い立った理由

前回、zephirに触れて[初投稿](http://qiita.com/Tsuchiy@github/items/d0ef6e3f7b379738b000)をしてから2週間ちょっと。

自分のモジュールのベンチも取っては見たものの、
この結果だけ記事にしてもあまりおもしろくないなぁ、と思い。

せっかくなので幾つかのフレームワークでチュートリアル初歩の初歩状態でベンチマーク計測して遊んでみましたので、
その結果を書いてみようかなぁ、と思います。

#### お願いと注意点

+ お金等いろいろないのでVirtualBox環境でやりました。正確な数値じゃないのはごめんなさい。
+ 私は「スケールアウト重視」「可読性重視」といったタイプの人なので、あまりこのデータの有用性とかは考えてませんので、参考程度でよろしくお願いします（汗）
+ そもそもほぼ静的なページを描画するベンチに意味があるのかってツッコミもなしで・・・

## 環境

+ MacMini(OSX 10.11.6)上でVirtualBoxを立ち上げCentOS6.8の仮想VMを作成し実行しました。
+ Webのフロントはnginx(v1.10.2)を利用しています。
+ PHP-fpm(v7.0.14)をUnixドメインソケットで受けて実行しています。Opcacheをenableにしてあります。
+ 割当てCPU数が1なので、子プロセス数も1にしてあります。
+ 転送量を同じにするため、どのフレームワークも描画するページはCodeIgniter3のWelcomeページに差し替えています。これをViewファイル（テンプレートファイル）を読み込む形で描画させています。
+ ベンチはローカルからapache bench(v2.3)で取りました。
実行コマンドは`ab -c 100 -t 5 http://localhost/`のようになります
+ （一応慰め程度に）ベンチを5回取り、その平均のReq/secを調べました。


PHP7.1で動かそうと思ったらZephirが対応していないみたいでビルドしてもセグフォで落ちたので7.0で・・・


## 対象

対象にしたフレームワークは下記のものにしました

#### Phalcon3 (3.0.2)

https://phalconphp.com/ja/
PHPモジュール形式のフレームワーク。
速度を求める皆さんに大人気。最近はzephirで書かれているみたいです。
（というかzephir提供してくれてありがとうございます）
今回は手っ取り早くremiリポジトリのphp-phalconを利用しました

#### CodeIgniter3 (3.1.2)

https://codeigniter.com/
コードベースのフレームワークの中では一番早いと謳われてるみたいです。
Elislabのライセンス絡みで倦厭された時期もありますが、
その速度を理由に使う人も多いみたいです。
あ、そろそろ4が出るらしいですが、なんか機能を聞く限りイケてるフレームワークの気がします
（先日の段階で速度は3の約15%増し？でした）

#### CakePHP (3.3)

https://cakephp.org/jp
言わずもがな「PHPでフレームワークといったらCakeでしょ？」とか言われてしまうやつです。
PHPカンファレンス2016でも人気みたいでした。
個人的には昔バージョン違いで痛い目見たり、FatControllerにならざるを得なかったりで、あまり使わないかもしれません・・・。

#### Laravel (1.3.3)

https://laravel.com/
アーティザン（職人）のためのフレームワーク・・・という響きもさることながら、
PHPカンファレンス2016のフレームワーク投票でCakeと双璧だったらしいです
デザイン性の強いWebサービスの方から「使ってる」って話を聞くような気がします。



※ちなみに私は[Yii2](https://github.com/yiisoft/yii2)が好きなのですが・・・・アレ？


## 結果

以下の表のとおりになっています。

| Framework        | Req/Sec |
|:-----------------|--------:|
|Phalcon:3.0.2     |  844.066|
|CodeIgniter:3.1.2 |  106.068|
|CakePHP:3.3       |   16.194|
|Laravel:1.3.3     |   27.788|


なんだろ・・・CakePHPが予想以上にスピードが出てない
debug=0にはしたのだけど、なにか設定が足りないとかなのでしょうか・・・。


Phalconは自由度が高いので、エンジン自体が軽量ですけど、
フレームワークとしてどう使うかがプロジェクトの質に左右されそうです。

## で・・・

以前より他の方がベンチマークを上げられてたりしたときと、
そんなに変わらないかな（CakePHP除く）といった感じで、
「もっと他に良い記事あるよ・・・」となると思った次第です。

なので、ここからちょこっとだけ追加を。

### Django

https://www.djangoproject.com
nginx + uwsgi(2.0.14) + Python(3.5.2) + django(1.10.4)でも、
同様のことをやってみました。
Python結構好きですが、まだ本当に詳しいところまでは知らないんですよね・・・
以前はgunicornを使っていたのですが、uwsgiで動かす方が良さそう。


### Ruby on Rails

http://rubyonrails.org/
nginx + unicorn(5.2.0) + Ruby(2.3.1) + rails(5.0.0.1)でも、
同様のことをやってみました。
開発時にフレームワークとして重要な「Railsという共通認識」が強力でしょうから、ゲーム業界でも採用されるケースが多いのだと思いますが、
どうも個人的にUnicornは時々何かに引っかかる（動作速度が不安定？）事が多い体感がしまして・・・
多分技術力不足か知識不足なんだと思うので、どなたか色々教えてください！


## 再度、結果


| Framework        | Req/Sec |
|:-----------------|--------:|
|Phalcon:3.0.2     |  844.066|
|django: 1.10.4    |  665.386|
|rails-5.0.0.1     |  262.896|



まぁ、あんまり意味がない数字なんですよね・・・。
いつか生きた数字が取りたいものです。
neovim をインストールしたら、 Conque-GDB でエラーが出てしまった際の対処法

これから Vimmer に成ろうとしている新社会人です。
初めての投稿なので、簡単な内容で備忘録も兼ねてます

# 概要
日時 2016/12/20

neovim が流行っているみたいだと、

<pre>
$ yum install -y neovim
</pre>
と特に調べずインストールしてしまったためはまった。

終わってみると、極めて簡単なエラーだが、
なかなかクリティカルなページが発見できず焦った。

# エラー内容
neovim で
<pre>
: ConqueGDB
</pre>
とすると、以下のエラーが表示され、GDBが起動しない。

=============
Conque ERROR: Python interface cannot be loaded

Your version of Vim appears to be installed without the Python
interface.
You are using a Unix-like operating system. Most, if not all, of the
popular
Linux package managers have Python-enabled Vim available. For example
vim-gnome or vim-gtk on Ubuntu will get you everything you need.
If you are compiling Vim from source, make sure you use the --enable-
pythoninterp
configure option. You will also need to install Python and the Python
headers.
If you are using OS X, MacVim will give you Python support by default.

# 対処法
python3 が必要だった
<pre>
$ yum install -y python3
$ which python3     # /mypath/python3
</pre>

.vimrc (or init.vim) に以下を追加
<pre>
let g:python3_host_prog = expand('$HOME') . '/mypath/python3'
</pre>

最後に以下を実行
<pre>
$ pip install neovim
</pre>

# 参考URL
http://giginet.hateblo.jp/entry/2015/11/24/203823
【Python上達事例】Pythonの基礎を無料サイトで2週間で習得した

※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの学習法を公開することで、皆様のお役に立ちたい意図で投稿しております。

参考サイト：[【Python上達事例③】CodecademyでPythonを学習](http://programming-study.com/case/python/)


#【Python上達事例】Pythonの基礎を無料サイトで2週間で習得した


神奈川県の20代男性がPythonを学習した体験談です。

##様々なサービスで利用され、習得が容易なPythonを選択

私は就活生で、就職先としてIT企業を志望していたものの、プログラミング経験がまったくない状況でしたので、プログラミング独習を始めました。言語は、DropBox、Youtubeなど先進的サービスに利用されていること、他のプログラミング言語に比べ習得が容易なこと、開発スピードが比較的早いことなどの理由でPythonを選択しました。

##無料で利用可能な海外の学習サイトを利用した

学習には「codecademy」というjavascript、php、cssなど複数の言語がWeb上で無料で学習できるサイトを利用しました。このサイトの特徴として、プログラミング環境がウェブ上に用意されておりセットアップが不要なこと、演習形式であり知識を実践しながら体感的に身に着けられること、Ｑ＆Ａコーナーがあり、躓いた際はそこを見れば大抵解決すること、ビギナーにとって網羅性のある用語解説であること、インターフェースがお洒落なことなどが挙げられます。
➡︎[オススメのPython学習サイトはこちら](http://programming-study.com/language/python-site/)

##2週間ほどで概要を理解した

就職活動の合間の空いている時間の殆どを学習に費やしたため、二週間ほど（30時間くらい）で基礎的な知識は網羅しました。学習は、お金が無かったのと、最新の知識を習得したかったためすべてウェブ上で行いました。そのため、ほとんどお金はかかりませんでした。

##わからないときは、無理をしなかった

やはり、初めてのプログラミング言語だということで、感覚がうまくつかめずヒントを見ても処理の中身がわからないといったことは多々ありました。しかし、私はもともと物事をじっくり考えることが好きな人間でしたので、詰まってしまっても、楽しみながら乗り越えることができました。それでもどうしても分からない際は、答えを見る、今までの学習を振り返ってみる、Ｑ＆Ａを探してみる、気晴らしに散歩をしてみるなど。自分の思考が止まっていると感じた場合はムリをせず、別のアクションを起こしてみることが大切だと思います。

##目標の細分化してモチベーションを維持した

私も初心者で苦手意識がある方でしたが、思い切ってやってみると意外にできるものです。ネットには色々な方が親切に情報を提供してくださっているので、ちゃんと情報を集めて、自分の頭で考えれば大抵の作業はこなせるでしょう。自分の手で何が生み出せるのか、想像してワクワクしながら飛び込んでみてください。また、私は就職活動をしながら学習しましたので、時間的に制約が多く、かつモチベーションが下がりやすい状況でした。そこで、小型タイマーアプリfor windows「VbTimer」と、excelシートを活用し、こまめに学習時間や状況、気づきを記録することで自分の頑張りを可視化しました。また、細かく目標を立て、達成していくのもモチベーション維持に有効だと思います。総じて大切なことは、ムリせず、楽しめる工夫を考えることです。プログラミング学習をして良かったと心から言えるように、その経験を今後に生かすことができれば、あなたの人生に良い変化が生まれるでしょう。


【オススメ記事】
➡︎[【Python上達事例①】Python初心者におすすめな学習サイトは？](http://programming-study.com/case/pyhton/)
➡︎[【Python上達事例③】CodeacademyでPythonを学習](http://programming-study.com/case/python-codeacademy/)
➡︎[プログラミング初心者がPythonを始めるべき3つの理由](http://programming-study.com/technology/python-recommend/)
➡︎[Pythonの本・参考書の評判](http://programming-study.com/language/python-books/)
➡︎[Pythonを使うなら知っておくべき！便利なライブラリ10選](http://programming-study.com/technology/python-library/)
cronの環境変数について

# はじめに

cronを実行する度に、`**** is not found`と言われてがっくり来ちゃうので、cronの初期値って一体どうなってるの？と思い、調べてみた次第です。

# 結論

`crontab -e`などで`PATH`変数を明示的に宣言してやらないと、`/usr/bin`と`/bin`しか参照できないようでした。`/etc/crontab`などでも`PATH`は宣言可能のようですが、それは他の記事をググれば良いかと。

# 対象環境

- OS
    - Ubuntu 16.x Server 64bit


# 初期環境変数

```
# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
  *  *  *  *  * env > /tmp/env.log
```
上記で取り出した、cron実行時の環境変数が下記。
`/usr/bin`と`/bin`しか参照しないんですね。

```
HOME=/home/imasami
LOGNAME=imasami
PATH=/usr/bin:/bin
LANG=en_US.UTF-8
SHELL=/bin/sh
PWD=/home/imasami
```

crontabに最初から書かれていたのは下記で、何故かPATHが大きく違う。

```
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
```

これはさておき、好きなPATHにしてしまいましょうか。

# crontab -e 環境変数を書き換え

```
PATH=/usr/bin:/usr/sbin:/home/imasami/.rbenv/shims/:$PATH

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
  *  *  *  *  * env > /tmp/env.log
```

`crontab -e`でPATHを宣言したら下記のように反映されているのを確認できた。

```
HOME=/home/imasami
LOGNAME=imasami
PATH=/usr/bin:/usr/sbin:/home/imasami/.rbenv/shims/:$PATH
LANG=en_US.UTF-8
SHELL=/bin/sh
PWD=/home/imasami
```

$PATHは展開されないんですね。
Excel 2013 > 同時に開くファイル数は15?

```txt:動作環境
Excel 2013 on Windows 8.1 pro(64bit)
```

http://qiita.com/7of9/items/be71e5f8ca67077f7c7d
にて記載した方法で複数ファイルを開こうとした。

エクスプローラで60個のファイルを選択してEnterを押してもExcelが起動しない。

プロテクトがあるようだ。

試したところ、15個では開いた。

キリのいいところで10個単位の処理にするのがいいかもしれない。
UPDATEで他フィールドの値をSETしたい

# やりたいこと

table_hogehoge

|id|value_a|value_b|
|:--|:--|:--|
|1|0|100|
|2|0|200|

上記テーブルで、value_aにvalue_bの値をセットしたい
下記SQLになればOK

```
UPDATE table_hogehoge SET value_a = value_b;
```

# はじめにやってみたこと

テーブルクラス内の記述

```
public function update()
{
    $this->query()
        ->update()
        ->set([
            'value_a' => 'value_b'
        ])
        ->execute();
}
```

出力されたSQL

```
UPDATE 
  `table_hogehoge` 
SET 
  `value_a` = 0
```

まあダメですよね

# おそらく解決

```
public function update()
{
    $this->query()
        ->update()
        ->set([
            'value_a = value_b'
        ])
        ->execute();
}
```

出力されたSQL

```
UPDATE 
  `table_hogehoge` 
SET 
  value_a = value_b
```
PHPからGmail宛に送信されたメールをダウンロードするときにする設定


## はじめに
前にも一回やったことがあったけど、なかなか思い出せなかったので、そのためのメモ程度に残します。

## やること
以下からGmailのWeb版にログイン
[Gmail - Googleのメール](https://mail.google.com/)

1. ログインできれば、右上のほうにある設定のアイコンをクリックし、「設定」をクリック
2. 「メール転送とPOP/IMAP」タブをクリック
3.  上から2番目の「POP ダウンロード」項目の「1. ステータス」で、デフォルトは「POPを無効にする」となっているので、「すべてのメールでPOPを有効にする」のラジオボタンをクリック
4.  下までスクロールして、「変更を保存」をクリック

上記のようにやれば、正常にPHPでメールを好きなように触れます。
【Python上達事例】CodecademyでPythonを学習

※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの学習法を公開することで、皆様のお役に立ちたい意図で投稿しております。

参考サイト：[【Python上達事例③】CodecademyでPythonを学習](http://programming-study.com/case/python-codeacademy/)

#【Python上達事例】CodecademyでPythonを学習

40代前半の男性がCodecademyを使ってPythonを学習した話です。

##自分でアプリを作りたいと思い、プログラミングに興味を持った

一昔前とは違い、今の日本では日常生活にパソコンやらスマートフォン、タブレットなどの各種コンピューターがあふれています。そのため、ごく一般的にそれらのデバイスで動作するソフトウェアを利用していますが、私はある時、「普段インターネットでフリーで公開されているアプリを使っているが、単にアプリのユーザーになるだけでは何の技能も身につかない。一番能力が高いのはこういったアプリを作成している人たちではないのか？」と思ったのです。そして、アプリを自らの手で作れるようになろうと思い立ちました。

##CodecademyでPythonを学習

実は、学生時代に大学でプログラミングの手ほどきは受けていたのですが、それ以降、仕事でも私生活でも全くプログラミングをする機会がなく、プログラミングに関する私の知識は完全にさび付いていました。とりあえず最初は書籍でプログラミングを学習しようと思い、書籍を購入しましたが、プログラミングそのものよりも開発ソフトのインストール方法の解説に大幅なページ数を裂いており、とても読む気にはなれませんでした。代わりに良い本はないだろうかとインターネット上で調べているうちにあるサイトに出会いました。それは、【Codecademy】と呼ばれる外国のサイトで様々なプログラミング言語を無料で学習できるオンライン学習サイトです。
残念なことに、私が利用していた当時はCodecademyは英語オンリーだったのですが、「プログラミングだけでなく、英語の学習にもなる」と思い、Pythonを学習しました。なお、Pythonを選んだ理由は、海外で大人気とのことで、色々と興味をひかれる情報を目にする機会が多かったからです。Codecademyではコースの終わり毎に課題が出されるのですが、簡単なプログラミングの問題を解くことで、すぐに理解度を確認できる点が良かったです。また、書籍でプログラミングを学習した場合、本を読んで実際にパソコンでプログラミングをして、作ったプログラムの動作確認をするという手間がかかる作業が必要ですが、Codecademyの場合は単にパソコンに向かうだけでいいので、かなり学習にかかる手間を減らすことが出来ました。

##英語とPython両方を経験できる

最終的に半年ばかりでPythonの基本を習得できたのですが、これは仕事やプライベートで忙しかった合間の中で学習をしていたからなので、もっと専念できる場合であれば学習期間はかなり短縮できると思います。Codecademyで英文を読むのにはちょっと手間がかかりましたが、やり終えた今では満足度の高い経験をさせてもらえたと思っています。何より「これ、出来ると良いな」と思っていたことを、プログラミングすることで自分で作れるようになったことは何事にも代えがたい喜びです。

【オススメ記事】
➡︎[【Python上達事例②】Pythonの基礎を無料サイトで2週間で習得した](http://programming-study.com/case/python/)
➡︎[プログラミング初心者がPythonを始めるべき3つの理由](http://programming-study.com/technology/python-recommend/)
➡︎[Pythonの本・参考書の評判](http://programming-study.com/language/python-books/)
➡︎[Pythonを使うなら知っておくべき！便利なライブラリ10選](http://programming-study.com/technology/python-library/)
vSphere Host Clientでの大きなOVFファイルのデプロイがタイムアウトで失敗する

# 概要

vSphere Host Clientでの大きなOVFファイルのデプロイがタイムアウトで失敗する場合は、Internet Explorerではなく、ChromeかFirefoxを使用する。

# 詳細

## 問題状況

ESXi 6.0 u2からESXiホストに入ったブラウザベースのクライアント「vSphere Host Client」で15GB超のOVFファイル＋VMDKファイルをデプロイしようとしたところ、タスクが「タイムアウト」で失敗した。またブラウザ上部に以下のエラーが表示された。

     Failed to deploy VM: postNFCData failed.

## 原因と回避策

「[vSphere Host Clientのデータストアブラウザで4GB超のファイルのアップロードが失敗する - Qiita](http://qiita.com/tsukamoto/items/bcbbe4095a16169809c6)」と同様、OVAファイルまたはVMDKファイルが4GBを超える場合、Internet Explorerのアップロードするファイルサイズの制限により失敗する。

回避策として、ChromeまたはFirefoxブラウザを使用するか、旧来のWindows版vSphere Client、またはovftoolやPowerCLIなどのコマンドラインを使用する。

## 備考

[ESXi 6.0 U2 - "Failed to deploy VM: postNFCData... | VMware Communities](https://communities.vmware.com/thread/538481?start=0&tstart=0)にこれに該当する投稿がある。[5番目のコメント](https://communities.vmware.com/message/2621330#2621330)がVMware社員からで、vSphere Host Client 1.9.1版で大きなOVAのデプロイが失敗する問題を修正したとしている。

> We fixed an issue in the recently released host client version 1.9.1 that could cause a large OVA to fail to deploy. The VIB is available here: http://labs.vmware.com/flings/esxi-embedded-host-client

このFling版を適用すると、IEで4GB超のOVFをデプロイしようとした際に、IEの制限でできない旨が表示されるようになった（IEでデプロイ可能になるわけではなかった）。

なお、このほかのケースとしてovftoolでcompressオプションを指定してエクスポートしたOVFファイルは、vSphere Host Client 1.9.1版でも対応していないとのことだった（[コメント10](https://communities.vmware.com/message/2637122#2637122)）。

# 参考

* [ESXi 6.0 U2 - "Failed to deploy VM: postNFCData failed." - when importing a OVA template via ESXi Host Client 1.5.0. | VMware Communities](https://communities.vmware.com/thread/538481?start=0&tstart=0)
* [vSphere Host Clientのデータストアブラウザで4GB超のファイルのアップロードが失敗する - Qiita](http://qiita.com/tsukamoto/items/bcbbe4095a16169809c6)
Excel 2013 > 散布図を開く > Alt + n, d, [Enter]

```txt:動作環境
Excel 2013 on Windows 8.1 pro(64bit)
```

該当データの時系列変化をぱっと見たい。

### 散布図を開く

10個のファイルを確認時、マウス操作では時間がかかる。
ショートカットを調べた。

1. <散布図対象データの選択>
2. Alt + n, d, `<Enter>`

### 応用

1. エクスプローラで10個ファイルを選択し、Excelを開く
   - Shift押しながら選択, `<Enter>`
2. Ctrl + gにてデータ列に移動
   - 例: AK列(AK1)
3. Shift + Control + 下矢印: 1列の全行選択
4. Alt + n, d, `<Enter>`: 散布図作成
5. <データ確認>
6. Ctrl + w, n: ファイルを閉じる (保存しない)
7. 手順2から手順6まで、複数ファイルに対して実施する

10個のファイルの1項目チェックなら~~2分以内~~70秒でできるようになった。
特異状況を発見したら、詳細の調査に移る。
Angular2アプリのURLを#付きスタイルに変更する

Angular2のデフォルトは `http://example.com/top` のようなURLスタイルで、これを `http://example.com/#/top` のような#を挟んだスタイルに変更したい。

デフォルトのスタイルの場合、ブラウザでリロードをかけるとそのようなURLページは存在しないため404になってしまう。

404とならないようにするにはサーバーの設定を変更しないといけない。#スタイルに変更して凌ぐにはprovidersにLocationStrategyで設定します。

    @NgModule({
      ...
      providers: [
        ...
        {
          provide: LocationStrategy,
          useClass: HashLocationStrategy
        },
        ...
      ],
      ...
    })


## 参考

- [Appendix: LocationStrategy and browser URL styles](https://angular.io/docs/ts/latest/guide/router.html#!#browser-url-styles)
github:enterpriseおよびESXiのメンテナンスで困ったこと．

# ESXiのメンテナンスでつまったところ．

## Windows10で.net 3.5がインストールできない〜vSphereクライアントがインストールできない

###Workaroundをまとめると，
1. Windows10のインストールメディアからインストールする
2. 一旦キャッシュをすべて削除する（以下で説明）

### 一旦キャッシュをすべて削除する
1. インストール作業を中止する.
2. `C:\Windows\SoftwareDistribution\Download` フォルダーの中身を削除.
3. コマンドプロンプト(cmd.exe)を管理者として起動. cmdをプログラムを指定して実行に表示して，ctrl+shift+returnで実行すると管理者権限になる．
4. 次のコマンドを実行する.  ```Dism /Online /Cleanup-Image /StartComponentCleanup```
5. PCを再起動.
6. .NET Framework 3.5を再度インストール.

## ESXi〜ESXI EMBEDDED HOST CLIENT

WebブラウザでESXiのホストを調整できる．
https://labs.vmware.com/flings/esxi-embedded-host-client#summary

### インストール方法

```
# ホストにコピー
scp -r /path/to/downloaded/vib/esxui.vib root@<esx ip or hostname>:/tmp
# ログインして・・・・
# インストールのとき
esxcli software vib install -v /tmp/esxui.vib
# アップデートのとき
esxcli software vib update -v /tmp/esxui.vib
# 削除の時
esxcli software vib remove -n esx-ui
```

## VMware Remote Console

VMware Remote Console VIBsを[インストール](https://labs.vmware.com/flings/esxi-embedded-host-client#summary)する．
これを入れておくと，VMware Remote Consoleをインストールしたリモートから直接コンソールを開けるようになる（らしい）

```
# ホストにコピー
scp VMware-Remote-Console-9.0.0-Linux.vib root@<esx ip or hostname>:/tmp
scp VMware-Remote-Console-9.0.0-MacOS.vib root@<esx ip or hostname>:/tmp
scp VMware-Remote-Console-9.0.0-Windows.vib root@<esx ip or hostname>:/tmp
# インストール
esxcli software vib install -v /tmp/VMware-Remote-Console-9.0.0-Linux.vib
esxcli software vib install -v /tmp/VMware-Remote-Console-9.0.0-MacOS.vib
esxcli software vib install -v /tmp/VMware-Remote-Console-9.0.0-Windows.vib
```

### 使い方

リモートコンソールを開きたい端末にアプリケーションを[インストール](https://my.vmware.com/web/vmware/details?downloadGroup=VMRC90&productId=491)する．開くURLは，以下のような形式になる．しかし，マシンIDがわからないので，別途調べる必要がある．

```vmrc://<esx ip or hostname>?moid=<machine id>```

### moidの調べ方

ESXiホストにログインし，コマンド`vim-cmd vmsvc/getallvms`を実行し，`Vmid`を調べる．

```
~ # vim-cmd vmsvc/getallvms
Vmid         Name                                File                            Guest OS      Version   Annotation
3      Hogeeee   [datastore1] Hogeeee/Hogeeee.vmx   ubuntu64Guest   vmx-07 
```
【Python入門】if 文での真偽判定の仕方(TrueとNone)

※こちらの記事は、プロスタ編集部が現在大変人気の高いPythonの文法記事を公開することで、皆様の学習にお役に立ちたい意図で投稿しております。

参考サイト：[【Python入門】if 文での真偽判定の仕方(TrueとNone)](http://programming-study.com/technology/python-ifnone/)


#【Python入門】if 文での真偽判定の仕方(TrueとNone)

python でif文を用いる事が多くありますが、そこで時折登場するNone について説明したいと思います。
if 文の中では、比較する条件があり、その条件文に対して 真 (True) もしくは偽 (False) であるかを判定しています。
None は False に近い概念ではあり、 ほとんどFalse = None と考えて差し支えないです。違いを言うとすれば、False は偽(0)であるという情報を持っているのに対して、None はそもそも「そこにデータが存在しない」ことを示す意味になります。
言葉面だけではわかりにくいかと思うので、具体例を出してみたいと思います。


##True、Falseの取り扱い方

まずは、True と False について例を挙げます。

```
>>> a = 3
>>> if(a > 1):
...  print "a > 1"
a > 1
```


これは値 a が 1 よりも大きい場合は、”a > 1 ” を表示するプログラムになります。
if 文の中では、a > 1 の真偽を判定します。今、a = 3 としているので、判定は真(True)となります。要は判定文の中が真か偽なのかを判定しているだけですので以下のようにしても同じ事です。

```
>>> if(True):
...  print "True"
... 
True
```

```
>>> if(False):
...  print "True"
... else:
...  print "False"
... 
False
```


このように判定文の中が True なのか False か、で決まっており、プログラム内では結局のところ、1と0の判定になります（True = 1、False = 0）

念のため True = 1、False = 0 であることを確認してみましょう。

```
>>> print 1+True
2
>>> print 1+False
1
```

このように Trueと False は1 とゼロに対応した関係になっている事がわかります。

##Noneの取り扱い方

それでは本題の None について述べていきます。
同じように if 文判定しましょう。

```
>>> print 1+True
2
>>> print 1+False
1
```

ここまではどうやら False = None と考えていいようです。
次に足し算をしてみましょう。

```
>>> print 1+None
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
```


むむ、ここでエラーが出てしまいました。
冒頭で述べましたが、None はそこにデータがないということを示すので、値という概念がありません。ですので、その値を足し合わせようとしても無理なことがわかりますね。

どういうときに None が登場するかというと、1例としては辞書型のオブジェクトを使うときが挙げられるでしょう。
辞書型のオブジェクトの例は以下の通りです。

```
test = {"red":"apple","blue":"sky","green":"forest"}
```

red と apple を紐づける事で、red というキーワードで検索すると apple が出てくるようになります。ここでキーワード検索をするときは、get 関数が便利です。

```
>>> print  test.get("red")
apple
```

それでは、この辞書に登録されていない単語(orange)で検索してみましょう。

```
>>> print  test.get("orange")
None
```

ここで None が登場しました。これでお分かりかと思いますが、存在しないデータを示すときに None が使われます。False と意味合いが少し違うというのもおわかり頂けたと思います。

ちなみに test[“キーワード”] で直接アクセスするのも可能なのですが、存在しないキーワードを使ってしまうと以下のようにKeyErrorが出てしまいます。

```
>>> print  test["orange"]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'orange'
```

こうなってしまうとせっかく書いたプログラムが途中で強制終了してしまいますので、終了を伴わない get関数を使うのがオススメです。

##Noneを使った比較

None の論理比較を使うときは、「is」と「==」のどちらでも大丈夫です。

```
>>> a = test.get("orange") # a に None を入れる
>>> if (a == None): # == を使った論理比較
...  print "a == None"
a == None
```

```
>>> if (a is None): # is を使った論理比較
...  print "a is None"
... 
a is None
```

どちらでもちゃんと動いてますね。
ただ強いて言いますと、「is」 のほうが推奨されています。レアケースですが、「==」をエラーが出ることがあるそうです（著者はまだ遭遇した事がないですが）。
また実行スピードも 「is」のほうが早いと言われています。
検証のためにtimeitモジュールを使って処理時間を測定した結果を示します。

```
>>> timeit.timeit("1 == None", number=10000000)
0.3263418674468994
```

これの意味するところは、
「”1 == None” の比較を 10000000回行ったときにかかった所要時間を測定して、0.33秒でしたよ」ということです。

同様に ”1 is None” を行ってみます。

```
>>> timeit.timeit("1 is None", number=10000000)
0.19225311279296875
```

この結果からわかるように is を使ったときの方が 0.19 / 0.33 〜 60 % ほど処理時間が早い事がわかります。
2017年まであと何日？rake taskで書いてみた

Shinosaka.rb Advent Calendar 21日目の記事です。
今回は、Ruby on Railsの中で使われる Rake taskについて書いてみました！

年末ということで、
`「xxxx年まであとxx日xx時間xx分!」`
と教えてくれるtaskを書いてみました。

### Rake taskとは
Rubyの便利ツールRake。処理内容を定義できるビルドツールです。

みなさん、普段開発していて *繰り返し実行したい処理* ってよくありませんか？
それをコマンド一発で叩けたら嬉しい！
それを実現してくれるのが、rake taskです。

[詳しい概要はこちら。個人的にわかりやすかった](http://rubicle.net/rubicle_talk_1-1.html)

今回は、rake taskの実行方法、引数のやり方を
例を用いて解説したいと思います。

### つくってみよう

#### まずはtaskをつくる

```
rails g task countdown
```

```
create  lib/tasks/countdown.rake
```
作られました。

```
rake -T
```
で実行の仕方がわかります。

`rake countdown:run`

いろいろパターンを作ってみました。
時間の計算の仕方は、[秒を時間表示へ変換する](http://qiita.com/riocampos/items/2c4e4a9b45ad83a0bdc7)を参考にさせていただきました。ありがとうございます！

1.実行したら「2017年まであと 何日何時間何分!」と表示する

`rake countdown:run`

```
namespace :countdown do
  desc "カウントダウンします"
  task run: :environment do
    year = 2017
    sec = (Time.zone.parse("#{year}-01-01 00:00:00") - Time.now - 1.day)
    day, sec_r = sec.divmod(86400)
    p (Time.parse("1/1") + sec_r).strftime("#{year}年まであと #{day}日%H時間%M分!")
  end
end
```

2.引数で「xxxx年まで」を指定する ver.1

`rake countdown:run[year]`

```
namespace :countdown do
  desc "カウントダウンします"
  task :run, ['year'] => :environment do |t, args|

    year = 2017
    unless args[:year].blank?
      year = args[:year].to_i
    end

    sec = (Time.zone.parse("#{year}-01-01 00:00:00") - Time.now - 1.day)
    day, sec_r = sec.divmod(86400)
    p (Time.parse("1/1") + sec_r).strftime("#{year}年まであと #{day}日%H時間%M分!")
  end
end
```

3.引数で「xxxx年まで」を指定する ver.2

`ENV` に変えただけですが..

`rake countdown:run year=xxxx`

```
namespace :countdown do
  desc "カウントダウンします"
    task run: :environment do

    year = 2017
    unless ENV['year'].blank?
      year = ENV['year'].to_i
    end

    sec = (Time.zone.parse("#{year}-01-01 00:00:00") - Time.now - 1.day)
    day, sec_r = sec.divmod(86400)
    p (Time.parse("1/1") + sec_r).strftime("#{year}年まであと #{day}日%H時間%M分!")
  end
end
```

4.yes,no判定をつけてみました

`bundle exec 'rake countdown:run[2019]'`

```
namespace :countdown do
  desc "カウントダウンします"
  task :run, ['year'] => :environment do |t, args|

    year = 2017
    unless args[:year].blank?
      year = args[:year].to_i
    end

    STDOUT.puts "Calculate from #{Time.now.strftime('%Y/%m/%d')} to #{year}/1/1. Is it OK? (y/N)"
    if STDIN.gets.strip == 'y'
      show_future_days(year)
    end
  end
end

def show_future_days(year)
  sec = (Time.zone.parse("#{year}-01-01 00:00:00") - Time.now - 1.day)
  day, sec_r = sec.divmod(86400)
  p (Time.parse("1/1") + sec_r).strftime("#{year}年まであと #{day}日%H時間%M分!")
end
```

実行すると、

```
bundle exec 'rake countdown:run[2018]'
Calculate from 2016/12/19 to 2018/1/1. Is it OK? (y/N)
y
"2018年まであと 376日16時間04分!"
```

### ちなみに

今は、
`year = 2017` で固定していますが

来年以降は
`year = Date.current.next_year.year`

としたら使えます(^o^)

### まとめ

rake taskは繰り返し実行したい処理をまとめるのにとっても便利です。

2017年まであと何日でしょう？
よいおとしを〜(゜∀゜)
QUIC はデータロス時の処理待ちをどのようにして最小化しているのか？

# この記事で伝えたいこと
HTTP/2 で HTTP レイヤの Head of Line Blocking 問題が解決した他、Server Push、Prioritization、HPack などの導入によって、HTTP の通信効率を向上させました。
しかし、TCP を使う限り、TCP レイヤの HOL Blocking は依然として残っています。

更なるパフォーマンス向上を目指して、QUIC では UDP を使って通信します。UDP 自体はパケットの欠損検出や再送処理など、TCP では当たり前にある機構が無く、自前で作り上げないといけません。では、QUIC は TCP と同等の機能を実現しながらも、TCP とどこが異なるのかを探っていきます。

ちなみに、QUIC という名前は、**Q**uick **U**DP **I**nternet **C**onnection の略です。

## 復習：HOL Blocking とは？
ウェブブラウザで HTTP/1.1 以前のプロトコルを使うとき、同時に送信できるリクエストの数に上限があります。その上限数より多くリクエストを送信したい場合は、先に出したリクエスト処理が終了するまで待たなければなりません。これは、HTTP レイヤにおける Head of Line Blocking (HOL Blocking) と呼ばれています。

HTTP/2 では、TCP のペイロードを仮想的なストリームに分割することで、1 本の TCP 接続で複数のリクエスト／レスポンスを扱えるようになりました。これにより、先に送信したリクエスト処理の完了を待たずに次のリクエストを送信できるようになり、HTTP レイヤでの HOL Blocking 問題が解決しました。

しかしながら、HTTP/2 は TCP を前提としています。このため、途中でパケットが欠損したとき、再送信されたパケットを受信するまでアプリケーションはそれ以降のデータを受け取ることができず、処理を待たなければいけません。これを TCP の HOL Blocking といいます。もし TCP の HOL Blocking 問題が解決できれば、HTTP の通信をよりハイパフォーマンスなものにできると期待できます。

# QUIC の基本
## 順序は Stream ごとに揃っていればよい
TCP でデータを受信すると、OS でデータの順序を揃え終えた後にアプリケーションにデータを渡します。

一方、QUIC では**全ての**データを順番通りに揃える必要はなく、「**各 Stream 内のデータ順序**さえ揃っていればよい」という考えが土台になっています。先にデータを受信し終えた Stream から処理をディスパッチすることができるため、パケットロスによる処理待ちを最小限に抑え込むことができます。

## 複数の HTTP リクエストを、順番通りに受け取って欲しいときはどうするの？
Stream は複数の Stream Frame から構成されます。複数の HTTP リクエストを意図した順序でアプリケーションに届けるためには、同じ Stream 内にリクエストを並べることで対応できます。各 Frame のデータ開始位置をまとめて指定するフィールドが Stream Offset です。

# TCP の課題をどう解決しているか？
今回は、2 つをピックアップして紹介します。

## 1. 「送信したパケットの順序」と「アプリケーションが受け取るべき順序」を分離
- 送信したパケットの順序を Packet Number と呼び、**再送時であっても必ずインクリメント**する
- アプリケーションに届けたい順序は、同一 Stream 内の Stream Frame の並び順で表現する

これは、TCP で問題になっていた retransmission ambiguity (*1) を解決するためのルールです。このルールのおかげで、送信側は QUIC の Packet Number を使って TCP よりも確実に Fast Retransmit Recovery が利用できようになる上、RTT を正確に把握できるようになります。

### 復習：(*1) retransmission ambiguity とは？
パケットを送信した後、ACK が返ってこないので、同じパケットを再送したとします。再送後に ACK を受信したとき、この ACK は、「最初に送ったパケットに対する ACK」なのか、「再送パケットに対する ACK」なのか区別できません。 

これを retransmission ambiguity といい、TCP では 3 個のパケットが連続して ACK Timeout するまで待つなどしないと効果的な congestion control ができませんでした。

QUIC は再送時にも Packet Number をインクリメントするおかげで、両者を区別できます。

## 2. Reneging 禁止
QUIC の ACK は TCP の SACK (Selective ACK) と同等の情報を持っています。TCP と異なるのは、ACK が返ってきたパケットを後から破棄 (renege) することを禁止した点です。

これによって、送信側と受信側両方の実装を劇的にシンプルにできる上、送信側のメモリ消費を低減できます。

ちなみに、TCP の SACK は 3 個のパケットの ACK 情報までしか格納できません。QUIC では 256 個まで持てるため、ロス率の多い環境でより効率よく Fast Retransmit できます。

# まとめ
QUIC は UDP の上で TCP + TLS + HTTP/2 相当の機能を盛り込んでおり、実装が超絶難しいプロトコルです。RFC draft を読み進めていくと、日常生活でよく使われている TCP にどのような課題があるのかが分かり、とても面白いと思います。

# 参考
https://tools.ietf.org/html/draft-ietf-quic-recovery-00
https://tools.ietf.org/html/draft-hamilton-early-deployment-quic-00
docker build  --build-argするときのDockerfileにご注意

12月中旬なのに、今週は暖かい一週間だそうですね。さて

#> 今日のお悩み

dockerでbuildしたときに、付与している --build-argのパラメータが使われていないよ、という警告が出る。

```
docker build --build-arg NODE_ENV=development --no-cache -t api-test .;
```

*** [Warning] One or more build-args [NODE_ENV] were not consumed ****




# > 解決

DockerfileにARGの定義が必要でした。

```
ARG NODE_ENV
ENV NODE_ENV ${NODE_ENV:-production}
```


詳細は以下のリファレンスのARGの部分を読んでいただきたいのですが
[Dockerfile reference - Docker ](https://docs.docker.com/engine/reference/builder/)

Dockerfile側にARGの定義をしておかないと、build時に --build-argを指定してもエラーになってしまいます


## > AWS ECSで動作させた時にうまく渡らなかった？

これは同様に起きている人がいるのかどうかわからないので、とりあえず対処法だけ。
上記の解決の通り、Dockerfileを書いてbuildしてECRにプッシュして、ECRでサービスとして動作させたのですが、
cloudwatchで以下のようなエラーになってしまいました。

<img width="934" alt="スクリーンショット 2016-12-20 13.12.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/32215/3e47b817-09f2-bf5b-8642-5c347c1380e3.png">

※config/production.jsonは存在します。

で、ECRのタスク定義のところで環境変数を設定し、再度ECRとして起動させたところ、問題なく起動しました。

<img width="813" alt="スクリーンショット 2016-12-20 13.10.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/32215/95e1c7ba-48ef-f99d-13e5-6402ffbf2cbf.png">
CakePHP3：SendGridのインストールからテスト送信まで

ここではCakeを/var/www/html/appにインストールしてある前提で書いています：

1. composerの設定変更

    ```
    cd /var/www/html/app
    vi composer.json
    ```

    次の行を追加：

    ```
    "require": {
    ＜中略＞,
    "sendgrid/sendgrid": "~5.1"
    },
    ```

2. SendGridのPHP用プラグイン（https://packagist.org/packages/sendgrid/sendgrid）をインストール

    ```
    composer require sendgrid/sendgrid
    ```

3. CakePHPにSendGridのプラグインの場所が分かるようにパスを記述

    ```
    cd /var/www/html/app/vendor
    vi cakephp-plugins.php
    ```

    次の行を追加：

    ```
    'SendGrid' => $baseDir . '/vendor/sendgrid/sendgrid/'
    ```

4. bootstrap.phpにプラグインを読み込む設定を追加

    ```
    cd /var/www/html/app/config
    vi bootstrap.php
    ```

    次の行を追加：

    ```
    Plugin::load('SendGrid');
    ```

5. Emailコンポーネットを使ったメールの送信

    Emailコンポーネントを読み込む：

    ```
    use Cake\Mailer\Email;
    ```

    メール送信処理を追加

    ```
    public function index() 
    {
        $body = "hogehoge";
        $email = new Email();
     
        Email::configTransport('SendGrid', [
        'port'     => '587',
        'timeout'  => '30',
        'host'     => 'smtp.sendgrid.net',
        'username' => 'SendGridのID',
        'password' => 'パスワード',
        'client'   => 'WhiteLabelしたドメイン',
        'className' => 'Smtp'
        ]);
    
        $email->template('default')
        ->emailFormat('text')
        ->to('宛先のメルアド')
        ->from('Fromのメルアド')
        ->subject('hello')
        ->transport('SendGrid');
    
        if($email->send($content)){
        // 成功
        }else{
        // 失敗
        }
    }
    ```

6. webrootからのメールの送信

    ```
    <?php
    
    require '../vendor/autoload.php';
    
    $from    = new SendGrid\Email(null, "送信元のメルアド");
    $to      = new SendGrid\Email(null, "宛先のメルアド");
    $subject = "test subject";
    $content = new SendGrid\Content("text/plain", "Hello email\n");
    
    $mail    = new SendGrid\Mail($from, $subject, $to, $content);
    
    $apiKey  = "SendGridのダッシュボードより入手したAPIキー";
    
    $sg = new \SendGrid($apiKey);
    
    $response = $sg->client->mail()->send()->post($mail);
    
    echo $response->statusCode();
    echo $response->headers();
    echo $response->body();
    ```

## エラーについて

こちらのエラーがでる場合：

```
Cannot modify an existing config "SendGrid"
```

Email::configTransport()の呼び出し回数が複数回発生しないようにすると解消します。
（メール1通ずつに呼び出すのはNG）
Angular2アプリに設定config.jsonを持たせる

Angular2アプリの設定をJSONで用意し、デプロイ後に設定JSONを変更することでアプリの動作を変更できるようにしたい。

## 実現方法

APP_INITIALIZERのDIを利用することで、アプリの初期化中に任意の処理を行うことができます。

若干起動に時間がかかるようになることが予想されますが、設定JSON取得後にアプリが立ち上がるためシンプルに実装できます。

## 実装例

環境はangular-cli@1.0.0-beta.21で、angular 2.2.1、rxjs@5.0.0-beta.12です。

JSONデータの読み出しと保持するConfigService。
configが必要なcomponentにこのサービスをDIして使います。

    import { Injectable } from '@angular/core';
    import { Http } from '@angular/http';
    import 'rxjs/add/operator/map';

    @Injectable()
    export class ConfigService {
      config: any;
      constructor(private http: Http) { }

      load() {
        return new Promise((resolve) => {
          this.http.get('config.json')
            .map(res => res.json())
            .subscribe(json => {
              this.config = json;
              resolve();
            });
        });
      }
    }

app.module.tsにAPP_INITIALIZERでの処理を追加します。

    @NgModule({
      ...
      providers: [
        ConfigService,
        {
          provide: APP_INITIALIZER,
          useFactory: configFactory,
          deps: [ConfigService],
          multi: true
        },
      ],
      ...
    })
    
    export function configFactory(cs: ConfigService) {
      return () => cs.load();
    }

Angular 2.2.1ではuseFactory部分は次のように記述しても問題ないようです。

    useFactory: (config: ConfigService) => () => config.load(),

Angularのバージョンか、Angular-CLIのバージョンを上げると次のようなエラーが出るためuseFactoryにはexport functionを指定しましょう。

>Error encountered resolving symbol values statically. Function calls are not supported. Consider replacing the function or lambda with a reference to an exported function ...


## 参考

- [Angular2 load configuration from backend on startup](http://stackoverflow.com/questions/38300116/angular2-load-configuration-from-backend-on-startup)
- [What is best way to load json settings from the server?](https://github.com/angular/angular/issues/9047)
- [Angular 2 make it wait service initialization](http://stackoverflow.com/questions/40591043/angular-2-make-it-wait-service-initialization)
railsでよく使うコマンド

```
#controller作成して消す方法　ディレクトリあるバージョン
rails g controller users/sessions
rails generate controller AdminUsers index
rails destroy controller users/sessions
rails destroy controller Mypge::Top

#factory specを自動生成
rails g factory_girl:model Hoge
# rspecをインストール
rails g rspec:install

#modelを作成
rails g model topic_history　#単数形でOK

#devise インストールしてviewを自動生成
rails generate devise:install
rails g devise:views
devise 用のユーザ作成
rails g devise admin

rails g migration ChangeTimestampInUsers

rails g migration add_user_id_to_applicant user_id:integer

rails generate migration RemoveTagFromPosts tag:string

rails g migration change_datatype_title_of_articles
rails g migration remove_current_step_to_articles current_step

rails g migration create_applicant_request_workplace workplace_id:integer


rails g mailer Mypage::StartupMailer send_when_create

rails g migration rename_investment_day_column_to_startup_investment

#task作成
rails g task sample
```

[migrate関連参考](http://ruby-rails.hatenadiary.com/entry/20140810/1407634200)

rails g rspec:model [Model_Name]
Androidアプリ：Google Play Storeに新規で登録するために必要な情報

Androidアプリを新規でリリースする場合、
自身で開発して、自分自身でリリースする場合は、その場で決めれば良いが、
クライアント様に確認しなければいけない場合、いちいち調べるのが面倒くさいのでまとめました。

# 1. GooglePlayへ登録する情報

|登録項目|制限| 仕様など |
| --- | -------- | ----- |
|タイトル |30文字以内 ||
| 簡単な説明 | 80文字以内 ||
| 詳細な説明 | 4000文字以内 ||
| スクリーンショット | 2枚以上〜8枚まで |JPEG または 24 ビット PNG（アルファなし）<br> 最小サイズ: 320 px 〜 最大サイズ: 3840 px|
| アイコン | 1枚 | 32 ビット PNG（アルファ付き）<br> 512px x 512px |
| ヘッダー | 1枚 | JPG または 24 ビット PNG（アルファなし) <br> 横 1024px x 縦 500px |
| アプリのタイプ | アプリ or ゲーム |  |
| アプリのカテゴリ | [こちら](https://support.google.com/googleplay/android-developer/answer/113475?hl=ja)から選択 |  |
| コンテンツレーティング  | Google Play レーティング | 全ユーザー対象<br>ユーザー成熟度 - 低<br>ユーザー成熟度 - 中<br>ユーザー成熟度 - 高 |
|  | 2.新しいコンテンツレーティング | アンケートに答える必要があります。|
| 連絡先情報 | ウェブサイトURL<br>メールアドレス(公開されます)<br>電話番号 |  |
| プライバシー ポリシー URL |  |  |
| 価格/配布地域  |  |  |

# 2. key store作成時に必要な情報

| 項目  | 説明 | 
| --- | --- |
| key store path | ファイル名 |
| Key store password | ストアのパスワード |
| Alias | キーの識別子 |
| Password | キーのパスワード |
| Validity(years) | 有効期限(25年から変更する場合は確認) |
| First and Last Name | 作者名 |
| Organization Unit | 部署名 |
| Organization | 組織名 |
| City or Locality | 市区町村 |
| State or Province | 都道府県 |
| Country Code (XX) | JP |
MacでのローカルTex環境構築

エディタにAtom, コンンパイラにlatex-mk, ビューアーにSkimを使って行います．

# 準備
### Atom
普通にtexのプラグインを入れる。

### latex-mk
mac Texを入れれば勝手に付いてきます。mac Texはダウンロードに時間がかかるので辛抱強く待つ必要がありますが。。
http://doratex.hatenablog.jp/entry/20180501/1525144736

### Skim
リアルタイムでコンパイル結果を閲覧するためにSkimを導入
https://skim.softonic.jp/mac

設定で下の画像のように「同期する」タブの「ファイルの変更をチェック」にチェックを入れる。
<img width="526" alt="スクリーンショット 2018-12-24 8.45.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/104256/fd648361-e24e-acd0-0a1d-cf52e43b970c.png">


# 論文執筆時
atomで論文を開く。
ターミナルで論文のディレクトリに移動し、下記コマンドを実行

```
latexmk -pvc YOUR_FILENAME.tex
```

skimを開いて正しくコンパイルできているか確認しながら論文φ(｡_｡*)ｶｷｶｷします。


ちなみにarXivにuploadするときは下記コマンドでクリーンして

```
latexmk -C YOUR_FILENAME.tex
```

git管理下に置いている場合は.gitのディレクトリを消去して
tar.gzで圧縮したものをuploadすると良いです。

```
tar -cvzf arXiv.tar.gz arXiv
```

以上です。Overleafは共同編集時には便利ですが、画像のアップロードなど手間な気がするので個人執筆時にはローカルで書いた方が思います。
RustのマクロでLispを作ってみた

## 概要

マクロの勉強がてら、Rustのコード内でLispっぽく記述できるDSL(?)を作ってみました。
（Lispに静的型があったらどうなるのか、というのに興味あったのもある。）
使い道があるかどうかわかりませんが、とりあえず公開しました。

良くも悪くも所詮はRustのマクロ上で構築されたものなので、「静的型＆所有権有り」の言語になっています。


## 使い方

Cargo.tomlファイルに以下の記述を追加します。

```Cargo.toml
[dependencies]
macro_lisp="0.1.0"
```

後は、ソースコード内に、

```rust:
#[macro_use]
extern crate macro_lisp;
```

と記述することでLispっぽいコードを書くことができるようになります。

## サンプル

実際のコードをみるのが手っ取り早いと思いますので、サンプルを載せておきます。
Lispを好きでない方は気持ち悪くなるかもしれないので注意。

ちなみに、Lisp!()マクロ内にLispっぽい記述を書く仕様です。

### FizzBuzz

```rust:fizzbuzz.rs
#[macro_use]
extern crate macro_lisp;

lisp!(defun main() ()
    (dotimes (count 100)
        (defconstant num (1+ count))
        (if (== 0 (% num 3))
            (if (== 0 (% num 5))
                (println "FizzBuzz")
                (println "Fizz"))
            (if (== 0 (% num 5))
                (println "Buzz")
                (println "{}" num))))
);
```

### Unixライクなwcコマンド

```rust:wc.rs
#[macro_use]
extern crate macro_lisp;

lisp!(use std::env);
lisp!(use std::process::exit);

lisp!(defun is_whitespace ((b u8)) bool  // (b u8)はu8型の引数bをとるということ。boolは戻り値の型。　
    (match b
        (0x20 | 0x09 | 0x85 | 0x0a | 0x0b | 0x0c | 0x0d => (true))
        (_ => (false) )) // マクロの限界（？）で、カッコ無しでtrueやfalseと書けるようにできなかった。
);

lisp!(defun main () ()
    (defconstant (args Vec<String>) env::args().collect()) // 型を指定した定数宣言(Rustのlet)
    (if (< (len args) 2)
        (progn
            (println "usage: wc file")
            (exit 0)))

    (defvar char_count 0) // Rustのlet mut
    (defvar word_count 0)
    (defvar line_count 0)
    (defvar in_word false)

    (defconstant path &args[1])
    (with-input-from-file (file path)
        (doiter (byte file.bytes())    // for-in
            (incf char_count)

            (defconstant b byte.unwrap())
            (if (== b 0x0a)
                (incf line_count))

            (if in_word
                (if (is_whitespace b)
                    (setf in_word false))
                (if (! (is_whitespace b))
                    (progn
                        (setf in_word true)
                        (incf word_count))))))

    (println "{:>10} {:>10} {:>10} {}" line_count word_count char_count path)
);
```

## リファレンスは気力がないので、後でその気になったら書く

約束は未定。
[ソースコード](https://github.com/JunSuzukiJapan/macro-lisp)をさらっとみれば、だいたいどんな機能があるかわかる……はず。

とりあえず、サンプルが動く程度の機能しかないと思っていればほぼ正解。

## 余談（個人的感想）

静的型付けのLispってわりといいかもって思えてきた。。。
今度はRustで静的型付Lispでも作ってみようかな……
PagedListを使ってみる


ASP.NET MVCで定番のpager。使い方のメモ。

下記、完成イメージ。

![pagelist](http://www.bluecode.jp/qiita/pagedlist/001.png)

##前提

* testdbにmembersテーブルがある(name,emailカラムが存在)
* とりあえずスキャフォールドでControllerとViewが出来ている状態

##準備

NuGetでPagedList.Mvcをインストールしておく。

##実装

今回はIndexにおけるList表示にPagerを仕込みたいと思います。
標準で生成されているIndexアクションを下記のように変更します。

###Controller

```diff
+using PagedList;

（省略）

// GET: Members
-public ActionResult Index()
-{
-    return View(db.Members.ToList());
-}

+public ActionResult Index(int? page)
{
+    int pageNumber = page ?? 1;
+    int pageSize = 5;

+    var query = db.Members.ToList();

+    return View(query.ToPagedList(pageNumber,pageSize));
}
```

特に難しいところは何もありません。

###View

つづいてView。PagedList.Mvcをusingします。
モデルをIEnumerable<>からPagedLinstIPagedList<>に変更します。

なお、model.name等の指定が使えなくなりますので、model.FirstOrDefault().name等に変更します。

```diff
-@model IEnumerable<pagedlist01.Models.Members>
+@using PagedList.Mvc
+@model PagedList.IPagedList<pagedlist01.Models.Members>

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>
        <th>
+            @Html.DisplayNameFor(model => model.FirstOrDefault().name)
        </th>
        <th>
+            @Html.DisplayNameFor(model => model.FirstOrDefault().email)
        </th>
        <th></th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.name)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.email)
        </td>
        <td>
            @Html.ActionLink("Edit", "Edit", new { id=item.id }) |
            @Html.ActionLink("Details", "Details", new { id=item.id }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.id })
        </td>
    </tr>
}

</table>

<div>
+    Page: @Model.PageNumber / @Model.PageCount
</div>

<div>
+    @Html.PagedListPager(Model, page => Url.Action("Index", new { page, pageSize = Model.PageSize }))
</div>
```

後は必要なフォーマットをHTMLヘルパーで指定します。以上。

##参考

* http://qiita.com/midori44/items/6702f1f041aa663eae57
* https://github.com/troygoode/PagedList
【質問】JPQLで　count関数の中でnullifは使えるのか？

質問失礼いたします。

現在STSでWebアプリケーションを作成しております。
統計をとる画面でユーザーマスタから、条件Aに当てはまる人数、条件Bに当てはまる人数それぞれを一回のクエリで取得したいと考えております。

以下のようなJPQL文を書きましたが、
select new MyClass( count(nullif(m.Column,0)) 
,count(nullif(m.Column,1))) from TUser t join t.mUser m where t.userId = m.userId...

↓のエラーが出てしまいます。
line 1:101: expecting CLOSE, found '('
※101文字目の()は「nullif(m.Column｣のところの()です。

nullif関数をcountの中で使うのはJPQLではサポートされていないのでしょうか？それとも構文の書き方の問題なのでしょうか？
select文の中にnullif単体で書いた場合は成功されている方の例を見て、疑問に思っております。
拙い質問で申し訳ございませんが、ご回答お待ちしております。

環境：Spring Tool Suite 3.8.2
　　　hibernate JPA
OSM.org ウェブサイトの説明ビデオ2つ

以前、初めての方向けに、自分でosm.orgウェブサイトを触りながらOSMの概要を理解してもらうために作ったビデオです。サイトの機能を入り口に、OSMの特徴や注意事項など広めの話題に触れているつもりです。しゃべりは得意ではないので眠たげなところはお許しを。初めての参加者への事前案内などにお使い頂ければ幸いです。

OSM.org ウェブサイトの説明 - 1(9分32秒)
https://youtu.be/XJtGPmRMlb8

OSM.org ウェブサイトの説明 - 2(17分29秒)
https://youtu.be/Hk37QC1aMjw
機械学習論文読みメモ_21


[Heteroscedastic Sequences: Beyond Gaussianity](http://jmlr.org/proceedings/papers/v48/anava16.pdf), ICML2016
heteroscedastic sequenceにおける逐次推論を考える。
この設定では、目的変数の値とその分散の双方が説明変数に依存する場合を扱う。
本論ではregret minimizationの手法を利用する事で、誤差に対する分布を仮定する事のない、この問題設定におけるオンライン学習アルゴリズムを提案する。
本手法では、目的変数の予測誤差、分散予測誤差の２つを用いたregret minimizationを行う。
また観測され得ない目的変数の分散を、そのbiased estimatorを用いる事で予測していく。
提案手法は予測のconfidence boundを与える事が可能で、またARCHモデルに対する適用を行う事が可能である。

[Unitary Evolution Recurrent Neural Networks](Unitary Evolution Recurrent Neural Networks), ICML2016
RNNを学習するに当たって、exploding/vanishing gradientの問題が学習を困難化している。
これは隠れ層間の重み行列の固有値の大きさが１から離れる事により生じてくる。
本論では、重み行列の大きさが１になる（ユニタリ行列）ような学習を行う。
特に大きさを１へ維持するにあたり、大きな計算コストを要求しない手法を提案する。
提案手法では、この行列を学習可能でパラメタライズされた構造を持つ行列の和で表す。
このパラメータの最適化は、隠れ層ノードを複素数領域で定義した場合において可能になる。

[Polynomial Networks and Factorization Machines: New Insights and Efficient Training Algorithms](https://arxiv.org/pdf/1607.08810v1.pdf), ICML2016
polynomial networks（PN)は隠れ層が１つのfeed-forward networkで、活性化関数が入寮のm乗を返すものである。
PNは理論的にシグモイド活性化関数によるfeed-forward netを近似出来る事がわかっている。
polunomial regression (PR)は例えば2次のモデルを考えた場合二項係数を係数行列パラメータとして2変数間の関係をそれぞれ陽に考慮した回帰モデルである。
factorization machine(FM)はPRにおいて係数行列を行列の積へ因子分解した形でモデル化する。
上記に関連して本論では、高次元を含めた特徴間の関係を考慮した回帰モデルとしてカーネル関数を用いた回帰モデルを提案する。
ここでhomogeneous polynomial、ｍ次までの単項成分を全て入れた式、またはANOVA kernel、全単項成分のうち変数入れ替えで被らないものみの和、を選択すると、提案式はPN及びFMへ復元される事を示した。
このモデルに関して低ランクテンソル分解に基づくパラメータ推定を提案し、また最適化問題はmulti-convex problemである事を示した。
MBPのJISキーボードをUS配列として使う時にバッククオートを打てるようにする

私はmacOS SierraでJISキーボードのMacBookProを内部的にUS配列にして使っています

参考: [jis配列からus配列に矯正したけど意外と楽だった話](http://nkk.hatenablog.com/entry/2015/11/21/181705)

## 困っていたこと

* JIS配列キーボードをUS配列にすると、バッククオートとチルダが打てなかった


## 解決方法

* Karabiner-Elementsの設定を1つ追加したらOKだった
<img width="812" alt="スクリーンショット 2016-12-19 15.05.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/7694/279e39f3-d8a8-3506-20f1-f7c3e2271a4f.png">

## 背景

* もともとJIS配列をUS配列に変換するのにKarabiner-Elementsを使っていました
    * `Keyboard Type`を`Default`にセットするとUS配列として使えました
<img width="811" alt="スクリーンショット 2016-12-19 15.06.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/7694/eb1e74a6-ec77-a570-7d89-b20a0c4d9e90.png">

## 感想

international3なんてわからんです :cry:


## 参考

参考にさせて頂きました
ありがとうございました

* http://qiita.com/naoya_t/items/45f0557cb29f2c2e8e3c