OmniAICreator/Qiita-1.07M huggingface dataset:
AWSでExcelからPDF変換を行う

Excelの見た目のままPDFを作成するために、`libreconv`を使用してExcelからPDFへconvertをしてみた

## 環境
- Amazon Linux
- Ruby 2.3.0
- Ruby on Rails 5.0.1

## AWSにLibreOfficeをインストールする
```
$ sudo wget http://ftp.yz.yamagata-u.ac.jp/pub/tdf/libreoffice/stable/5.3.3/rpm/x86_64/LibreOffice_5.3.3_Linux_x86-64_rpm.tar.gz
$ tar xvzf LibreOffice_5.3.3_Linux_x86-64_rpm.tar.gz
$ cd LibreOffice_5.3.3.2_Linux_x86-64_rpm/
$ cd RPMS/
$ sudo yum install *.rpm
$ sudo yum install dbus-glib
```

## gemのインストール
Gemfileに下記を追加
`gem 'libreconv'`

## 実装
```
  require 'libreconv'

  def convert_pdf
    Libreconv.convert('public/sample.xlsx', 'public/sample.pdf')
  end
```

出力されるpdfはxlsxで指定した印刷イメージで作成されるようだが、指定のフォントがない場合は、多少印刷イメージがずれることがある。
印刷イメージがずれる場合は適宜フォントをインストールする必要がある。
複数のpythonのバージョンを動作させようとしてつまづいた話（Mac編）

[以前](http://qiita.com/K_M95/items/a175964f8a89bb1e84cb)の記事で紹介した仮想環境を構築する方法で機械学習のライブラリを色々セットアップしてたのですが、色々調べていくうちにpython3系の動作環境で作成されたコードもあり、毎回Python2用に書き換えるのも面倒なので今回はMacにあるデフォルトのPythonの環境を壊すことなくPython3を導入してみた話をしたいと思います。

- 参考:[HomebrewのPython2とPython3でvirtualenv環境を作成する手順メモ](https://hnakamur.github.io/blog/2015/07/26/how_to_use_venv_with_homebrew_python2_and_3/)

#開発環境

- MacOS Sierra
- virtualenv 15.1.0
- Homebrew 1.2.3

#事前準備
- Homebrewのアップデート

```
$ brew update
```
- virtualenvのインストール

```
$ pip install virtualenv
```
- Python3のインストール

```
brew install python3
```

#環境構築
```
$ mkdir -p $(作業ディレクトリ名)
$ cd $(作業ディレクトリ)
$ python3 -m venv venv
$ source venv/bin/activate
```
試したところ、上から３行目のコマンドを入力したら、以下のエラーが出ました。

```
Failed to import the site module
Traceback (most recent call last):
  File "/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site.py", line 544, in <module>
    main()
  File 

(中略)

"/usr/local/Cellar/python3/3.6.1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/collections/__init__.py", line 32, in <module>
    from reprlib import recursive_repr as _recursive_repr
  File "/usr/local/lib/python2.7/site-packages/reprlib/__init__.py", line 7, in <module>
    raise ImportError('This package should not be accessible on Python 3. '
ImportError: This package should not be accessible on Python 3. Either you are trying to run from the python-future src folder or your installation of python-future is corrupted.
```
調べてみると、　前に設定したPYTHONPATHが邪魔していたようです。

```
PYTHONPATH=/usr/local/lib/python2.7/site-packages
```
これが原因でPython3が動作しなかったようです。（[参考](https://stackoverflow.com/questions/42214414/this-package-should-not-be-accessible-on-python-3-when-running-python3)）
というわけで、以下のコマンドでPYTHON_PATHの設定を解除します。

```
$ unset PYTHONPATH
```
これで再度試したら、問題なく環境構築ができ、

```
(venv)$
```
となりました。
これでPython3を動かすことができます。あとはこの環境で必要になるライブラリを一からインストールしていけば使えます。ちなみに、元の環境に戻したい場合は前回同様、

```
$ deactive
```

と入力すれば出来ます。
NyARToolkit for JavaのWebCamCaptureサンプル実行方法

NyARToolkitはJMFやWebCamCapture、QuickTimeなどさまざまなカメラライブラリを使用できますが、プロジェクトにはJMFを使ったサンプルが多いです。
しかし、JMFは2003年から更新が止まっているレガシープロジェクトで、これを使ってアプリケーションを開発すると環境構築に時間を大きく取られる上、開発環境に激しく依存し、頒布、再利用がしにくくなるなどの事態に陥る可能性が高いです。
また、eclipseのプロジェクトとして配布されているプロジェクトなのですが、Readmeが少々わかりにくく、導入でつまずくことが多かったです。
NyARToolkit4.1.1よりライブラリに標準同梱されているWebCamCaptureを使ったサンプルの動かし方を記します。

NyARToolkitはeclipseのプロジェクトとして配布されているのでeclipseを手に入れてください。

NyARToolkitをZipでもgit cloneでも良いのでダウンロードします。 
https://github.com/nyatla/NyARToolkit

lib,sample,utilsディレクトリをFileメニューからimport projectでインポートします。

NyARToolkit.sample.joglプロジェクトのWebCamSample.javaを開きます。

NyARToolkit.sample.joglプロジェクトを右クリックしBuild PathからConfigure Build Pathを選択します。

ProjectsタブからNyARToolkit.utils.jmfを、Librariesタブからjmf.jarを除きます。

これてプログラムが実行できます。

プロジェクトとしてインポートするところなど、ミスるとハマります。

私の環境ではカメラの軌道に時間がかなりかかりました。JMFではそのようなことは起きませんでしたが、何が原因となって遅くなっているのかについてはわかりません。
【メモ】nvm0.33.2 でnode.jsのインストールがこける場合の対処法

http://qiita.com/ozawan/items/86ca7551d59005128892
こちらを参考にnodeをインストールしようとしてこけたので、その対処法をメモ。

```
$ nvm install stable
Downloading and installing node v8.1.2...
Downloading https://nodejs.org/dist/v8.1.2/node-v8.1.2-linux-x64.tar.xz...
curl: (3) <url> malformed
######################################################################## 100.0%
grep: /root/.nvm/.cache/bin/node-v8.1.2-linux-x64/node-v8.1.2-linux-x64.tar.xz: No such file or directory
Provided file to checksum does not exist.
Binary download failed, trying source.
Detected that you have 4 CPU core(s)
Running with 3 threads to speed up the build
Downloading https://nodejs.org/dist/v8.1.2/node-v8.1.2.tar.xz...
curl: (3) <url> malformed
######################################################################## 100.0%
grep: /root/.nvm/.cache/src/node-v8.1.2/node-v8.1.2.tar.xz: No such file or directory
Provided file to checksum does not exist.
```
curl: (3) <url> malformed が発生。100%になってるけど実際にはダウンロードされていない。

nvmのバージョンを確認

```
$ nvm --version
0.33.2
```

手元のvagrant環境ではstableのインストールが通るのでnvmのバージョンを確認してみる。

```
$ nvm --version
0.33.0
```
nvmのバージョンを0.33.0に合わせてみる。
gitなのでtagをチェックアウトしてみる。

```
$ cd .nvm
$ git checkout -b v0.33.0 refs/tags/v0.33.0
```

バージョン確認してみる。

```
$ source ~/.nvm/nvm.sh
$ nvm --version
0.33.0
```
0.33.0になったので再度nodeをインストール。

```
$ nvm install stable
Downloading and installing node v8.1.2...
Downloading https://nodejs.org/dist/v8.1.2/node-v8.1.2-linux-x64.tar.xz...
######################################################################## 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v8.1.2 (npm v5.0.3)
Creating default alias: default -> stable (-> v8.1.2)
```
無事に成功。
potatotips #41でAndroidのFont周りの新機能について発表しました。


普段は勉強会に参加してもずーっと聞く立場でいつかアウトプットしたいなーと思っていたところ、たまたまGoogle I/Oでフォント周りの発表があり、自分がやってきた案件でもフォント周りでそこそこ苦労してたので初めて人前で発表しようと思った次第です。


## スライド

https://speakerdeck.com/tsuyosh/android-font-updates

## 準備

* 参考資料をチェックしながらサンプルコードを漁っていろんな機種で動作確認したりしながら発表内容を練っていきました。3週間前から少しずつやってたのですが夏休みの宿題と一緒で結構ギリギリまでかかってしまいました。
* TwitterでエゴサしてたんですがあんまりDownloadable Fontsは関心ないかなーと不安だった(^_^;)
* 最初は[Marp](https://yhatt.github.io/marp/)でmd形式で作ってたのですが絵文字のアニメーションGIFはPDFでは出力できないのでKeynoteに乗り換えました。Marp使いやすかったので今後の更新に期待。

## 感想

* Support LibraryのFont in XMLサポートは正直凄いと思った。できるのかとw
* ネタ被りが一部発生しましたが元々分量が多かったので結果オーライでした(^_^;)
* 発表中はテンパってたのでオーディエンスの反応を見る余裕は無かったのですが、終わった後にTLを見てたらちらほらコメントしてくれて個人的にとても嬉しかったデス。
* 絵文字デザインの変更ネタはスライドではおまけ扱いでしたがこれを一番訴えたかったw
* またネタを探して発表したいです( ･`д･´)


## 改善したいところ

* もっと長い枠で発表しておけばよかったorz
* カンペを作ってたしスマホでタイマーをセットしてたけどテンパって全く役に立ってない。事前の予行演習大事!
* プレゼン資料を作る際にコードをスクリーンショットで撮ってコピペするのが苦痛だった。後からAndroid StudioはコードをRTF形式でコピペできるのを知って( ﾟдﾟ)ﾎﾟｶｰﾝとなったorz

## 発表しなかった部分

* Google FontsにCJKフォントがない件は日本語については[Early Access](https://googlefonts.github.io/japanese/)が去年からあります。CJKフォントはサイズが大きいのでそれを圧縮して配信するのは中々ハードルが高そうです。
* Downloadable Fontsではセキュリティ周りの話もありました。FontRequestには証明書のデータが必要ですが、それはFont Providerの身元を確認するためのものです。過去のAndroidではフォントローディングの脆弱性があるのでそれを考慮したものだと思います。因みにGoogle Fontsのフォントは全てチェック済みだそうです。
* Downloadable Fontは有償フォントの提供やフォントのバージョン指定についてもPodcastの中で触れられていました。(英語スキルないので間違ってたらごめんなさい)
* 絵文字のグリフの数が急激に増えていっていますが、顔文字の肌の色を人種毎(大まかに5種類)に用意するとか[職業を表す顔文字(医者とか宇宙飛行士とか)で男女で差がないようにする](https://medium.com/google-design/taking-the-equality-conversation-to-emoji-e6dce28e006d)とか[家族のバリエーション](http://blog.emojipedia.org/why-there-arent-black-family-emojis/)にも配慮していること等が原因だと思います。
	* 因みに文字コード自体は[Skin Tone Modifier](http://emojipedia.org/modifiers/)や[ZWJ(Zero Width Joiner)](https://emojipedia.org/zero-width-joiner/)等の導入で効率的に割り当てされるように工夫されています。

## 今後調べたいこと

* Downloadable Fontでmemory(RAM)消費を抑えられるのか実測したかったけど間に合わなかった。
* ResourcesCompat#getFontの実装。特にDownloadable Fontの取得をどうやってるか。
* EmojiSpanの実装。

## 参考資料
SpeakerDeckはスライドのリンクが消えてしまうようなので再掲します。

* Fonts in XML
https://developer.android.com/preview/features/fonts-in-xml.html
* Downlodable Fonts
https://developer.android.com/preview/features/downloadable-fonts.html
* Get Started with the Google Fonts for Android (beta)
https://developers.google.com/fonts/docs/android
* Downloadable Fontsのサンプルコード
https://github.com/googlesamples/android-DownloadableFonts
* Emoji Compatibility
https://developer.android.com/topic/libraries/support-library/preview/emoji-compat.html
* EmojiCompatのサンプルコード
https://github.com/googlesamples/android-EmojiCompat
* What's New in Android Support Library (Google I/O '17)
https://youtu.be/V6-roIeNUY0?t=7m4s
* Best Practices to Slim Down Your App Size (Google I/O '17)
https://youtu.be/AdfKNgyT438?t=17m43s
* Android Developers Backstage: Episode 67: Fontastic
http://androidbackstage.blogspot.jp/2017/05/episode-67-fontastic.html
* Redesigning Android Emoji
https://medium.com/google-design/redesigning-android-emoji-cb22e3b51cc6
Cython環境のセットアップとコンパイルの方法


# 必要な環境

+ Python
+ pip (Python 3.xの場合は標準でついてくる)
+ Pythonに合ったコンパイラ環境
	- Macの場合はXcodeのcommand-line toolsが必要…なはず。
	- Windowsの場合、Visual Studioに加えて"Python compiler"だとかいうツールをインストールしなければならなかった気がする。
	- その他Unixの場合は、すでにgccやらが入っているはず。

>（2020.04.05追記）
> Windowsの場合、コンパイルできるようになるまでの道のりがけっこうややこしい。いちおうCython公式ページにいろいろなヒントが書かれているけれど…読むのはだるい：
> 
> - [Pythonのコンパイル環境を手に入れるための記事](https://github.com/cython/cython/wiki/CythonExtensionsOnWindows)：最近のバージョンの場合、Windows SDK C/C++ Compilerなるものが必要らしい。基本的にはPythonがビルドされたバージョンのWindows SDKのコンパイラが必要（詳しくは[このPython wikiページ](https://wiki.python.org/moin/WindowsCompilers)を参照）
> - [Anaconda etc.でインストールするためのヒント](https://github.com/cython/cython/wiki/InstallingOnWindows)：ここにはそこまで目新しい情報はないけれど、念のため
> 
> さらにCythonからコンパイラを使うためには、ビルド環境が正しくセットアップされた端末エミュレータ上でPython（Cython）を走らせる必要がある。最もシンプルなのは
> 
>   1. Windows標準のシェルでpython環境が動くようにする
>   2. Visual Studioのコマンドプロンプトを起動して、そこでpythonのsetup.pyを動かす
>  
> という方法だけれど、Anacondaの仮想環境を使いたい場合はとてもややこしい事態になるだろう。どこでどういう環境変数をセットアップすればanaconda prompt上で使えるようになるのか試行錯誤中…

# インストール

pipを使えばすぐに終わる。確か管理者権限は必要なかったような気がする…。

```shell
$ pip install cython
```

# コンパイルできるか確認

[Cython: Basic tutorial](http://cython.readthedocs.io/en/latest/src/tutorial/cython_tutorial.html)のコードをそのままコピペして、コンパイルできるかチェックする：

1. 開発用のディレクトリを作成。この中にファイルを作成していく。
2. ".pyx"ファイルを作成。これがコンパイル元のコード。
3. "setup.py"ファイルを作成。これがビルドファイルになり、コンパイルのされ方を指定する。
4. 開発用ディレクトリ内で端末エミュレータを開き、``python setup.py build_ext --inplace``を実行。Windowsの場合、必要なコマンドやインクルードファイルを使うためにdeveloper command prompt上で行う必要がある。

``setup.py``実行の際、``--inplace``オプションをつけないと、あるいはPythonのライブラリーの方にインストールされてしまうやもしれない（未確認）。

コンパイルが成功すれば"Finished"的なメッセージとともにsetup.pyが終了する。その場合、pythonコンソール上で``import <pyxファイル名>``とすることでコンパイル済みファイルをインポートできる。

一方、コンパイルが失敗した場合、"Failed"的なメッセージが出てくる。端末エミュレータの出力の少し前に戻るとエラーのより詳細な内容がわかる。ほとんどの場合は.pyxファイルの記述間違いか、インクルード/リンクファイルが見当たらないというものだと思う。


# ライブラリヘッダファイルの追加

[Stack Overflowの解答](https://stackoverflow.com/questions/14657375/cython-fatal-error-numpy-arrayobject-h-no-such-file-or-directory)よりコードを抜粋。

Cythonからnumpyを使ったりする場合、numpyライブラリのCヘッダファイル群が必要になる。gccやらを用いて直にコンパイルする場合はわかりやすいが、setup.py経由でコンパイルする場合は``-I``オプションが使えない。

この場合、``distutils``の``Extension``オブジェクトを利用する：

```python:setup.py
from distutils.core import setup, Extension
from Cython.Build import cythonize
import numpy

setup(
    ext_modules=[
        Extension("my_module", ["my_module.c"],
                  include_dirs=[numpy.get_include()]),
    ],
)
```

この場合の2つ目の引数は、ソースファイルのリスト（の絶対あるいは相対パス）を指定する。``include_dirs``キーワード引数で、追加したいインクルードパスを列挙する。

あるいは[Cython documentation](http://cython.readthedocs.io/en/latest/src/reference/compilation.html)を見ると、``cythonize()``そのものに``include_dirs``というオプションがあるらしい：

```python:setup.py
from distutils.core import setup
from Cython.Build import cythonize

setup(
    name = "My hello app",
    ext_modules = cythonize("src/*.pyx", include_path = [...]),
)
```


``numpy``は``get_include()``という関数を提供してくれているのでそれを使えばよいし、ネイティブのライブラリでもpkg-configなりなんなりの出力を使用すればよかろう。
unsigned doubleをunsigned intとして扱う処理系は合法か？

[C - C言語のunsigned doubleとは何か？(80733)｜teratail](https://teratail.com/questions/80733)
より。

```c
#include<stdio.h>

int main() {
    unsigned double  aa = 0.345;
    signed double bb = 0.4509;
    double cc = 0.472873;
    printf("%f\n", aa);
    printf("%f\n", bb);
    printf("%f\n", cc);
}
```

gccではエラーになる

```
prog.cc: In function 'int main()':
prog.cc:4:22: error: 'signed' or 'unsigned' invalid for 'aa'
     unsigned double  aa = 0.345;
                      ^~
prog.cc:5:19: error: 'signed' or 'unsigned' invalid for 'bb'
     signed double bb = 0.4509;
                   ^~
```

ところがvisual studio 2015 ver 14.0.25431.01 update3では

```
warning C4076: 'unsigned': cannot be used with type 'double'
warning C4076: 'signed': cannot be used with type 'double'
warning C4477: 'printf' : format string '%f' requires an argument of type 'double', but variadic argument 1 has type 'unsigned int'
warning C4477: 'printf' : format string '%f' requires an argument of type 'double', but variadic argument 1 has type 'int'
```

となる。ここでC4076の説明を読みに行こう。

[Compiler Warning (level 1) C4076 | Microsoft Docs](https://docs.microsoft.com/ja-jp/cpp/error-messages/compiler-warnings/compiler-warning-level-1-c4076)

>'typemod' : can not be used with type 'typename'
A type modifier, whether it is signed or `unsigned`, cannot be used with a noninteger type. **typemod is ignored.**

typemod is ignoredだぁ？いやそれignoreしちゃっていいのかい？明らかに意図に反するコードを作っちゃわないかい？

ここで疑問なのはこれは合法なのかということだ。

# 規格書を読む

調査中です、しばらくお待ちください。情報提供もお待ちしています...

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">C++11 規格書だと 7.1.6 (特に 7.1.6.2) が問題になりそう。</p>&mdash; Tsukasa #01 [要出典] (@a4lg) <a href="https://twitter.com/a4lg/status/877500280576671745">2017年6月21日</a></blockquote>

[![image.png](https://qiita-image-store.s3.amazonaws.com/0/94177/32ff7040-6a53-5da5-f24a-ad18027d4a4a.png)](https://friends.nico/users/EzoeRyou/updates/3585576)

まだ規格書読み途中ですが7.1.6見る限り特に制約はしていなさそうです。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">この件を調べようとして long int は int long と書いても良いことを今更発見した。<br><br>unsigned doubleをunsigned intとして扱う処理系は合法か？ by <a href="https://twitter.com/yumetodo">@yumetodo</a> on <a href="https://twitter.com/Qiita">@Qiita</a> <a href="https://t.co/zZXnCD5syB">https://t.co/zZXnCD5syB</a></p>&mdash; 齊藤敦志@仕事ください (@SaitoAtsushi) <a href="https://twitter.com/SaitoAtsushi/status/877831452242595840">2017年6月22日</a></blockquote>
大量の行を含む文書から該当する文字列を含む1行を消去する 

##やりたいこと
大量の行数を含むファイルから該当する文字列を探して、その行を削除したい

##どうやってやったか　sed編
たとえばこんなファイルがあったとします。

```ruby:file_A
さる:Monkey
ひつじ:Sheep
いぬ:Dog
ねこ:Cat
くじら:Whale
ラッコ:Sea otter
コアラ:Koala
ランドセル:school bag
```

`'くじら'`を含む行を消したい。

sedコマンドを実行
`sed -i '/くじら/d' file_A`


確認してみましょう

#####cat file_A

```ruby:file_A
さる:Monkey
ひつじ:Sheep
いぬ:Dog
ねこ:Cat
ラッコ:Sea otter
コアラ:Koala
ランドセル:school bag
```
イイ感じ!!
## 他の方法をやってみた　grep -V編
`'さる'`を含む行を消したい
`grep -V 'さる' file_A`

```ruby:出力結果
ひつじ:Sheep
いぬ:Dog
ねこ:Cat
くじら:Whale
ラッコ:Sea otter
コアラ:Koala
ランドセル:school bag
```
イイ感じ!!
しかし、これはfile_Aが上書きされたのではなく、file_Aから`'さる'`を含む行を表示していないだけ

ってことは、`grep -V 'さる' file_A`の出力結果をfile_Aに書き込めばよい!?

## `grep -V 'さる' file_A`の出力結果をfile_Aに書き込む!?


`grep -V 'さる' file_A > file_A '`
**これをするとファイル(file_A)の中身消えます。**

なぜだ。　ちなみにファイルの書き込み先が異なると成功する
`grep -V 'さる' file_A > file_B`

これだと、当然fileBに書きこめている。

~~yokuwakanne!~~
#Algebra_nobu　さんのおかげで理由がわかりました。　ありがとうございます。



grep -V 'さる' file_A   **>** **file_A**    
先に太字の部分が実行されます。　file_Aという空のファイルを作成します。
そのあとで
**grep** **-V** **'さる'** **file_A**
が実行されます。　この時のfile_Aは先ほど作成したばかりのfile_Aです。つまり空です。
理解できてすっきりしました。
gaccoのディスカッションはmarkdownで


​時々、guccoの講義を受けているのだが、先日コメントで、入力の書式設定が、markdown記法になっていることを知った。
アイコンやショートカットで指定できるので、わざわざマークダウンで書く人がどれだけいるかというと疑問だが、情報として残しておいても邪魔にはなるまい。そこで、今更だとは思うが、直接入力できたものをまとめておく。
ただし、適用スタイルが異なるので、実際の表示は、qiitaでの表示とは異なる。

- 強制改行が半角スペース２つ
- 空白行が段落の分かれ目

これは当然。

次は、

- \*\*太字\*\*で、**太字**

残念ながら\*斜体\*は使えない。

続いて、

\>引用で、

> 引用

次は箇条書きシリーズ。

1\.  箇条書き  
1\.  箇条書き

で、

1. 箇条書き
1. 箇条書き


\* 点箇条書き  
\- 点箇条書き

で

- 点箇条書き
* 点箇条書き

点箇条書きは両方ともちゃんと使える。

\# 見出し

で

# 見出し

ですが、これはレベル1のみ。

\--- で水平線

---

\!\[テキスト](画像のurl)で、

![画像](https://lms.gacco.org/asset-v1:gacco+ga085+2017_07+type@asset+block@course_card085.jpg)

\[テキスト](url)で、

[URLへリンク](https://projects.repo.nii.ac.jp/?action=pages_view_main&active_action=repository_view_main_item_detail&item_id=799&item_no=1&page_id=13&block_id=21)​

なお、リンク先は私の初論文です。

ここまでは、gaccoのアイコンに及びショートカット・キーにもあるものです。
「コード」もあるのですが、これがよくわからない。

\`文字列\`

で若干ホントが変わるので、これかも知れない。

あと、アイコンにはないのですが、LaTexで数式も書けるみたいです。

\$\$r_{xy} = \frac{\displaystyle \sum_{i = 1}^n (x_i - \overline{x})
(y_i - \overline{y})}{\sqrt{\displaystyle \sum_{i = 1}^n 
(x_i - \overline{x})^2}\sqrt{\displaystyle \sum_{i = 1}^n 
(y_i - \overline{y})^2}}$$

と、書くと、

$$r_{xy} = \frac{\displaystyle \sum_{i = 1}^n (x_i - \overline{x})
(y_i - \overline{y})}{\sqrt{\displaystyle \sum_{i = 1}^n 
(x_i - \overline{x})^2}\sqrt{\displaystyle \sum_{i = 1}^n 
(y_i - \overline{y})^2}}$$

これと同じものがちゃんと表示されます。

結構行けるのだが、残念なことに表組みは使えない。​
HTAで高速にExcelデータを読み込む

HTAアプリケーションは、実体が単なるHTMLなので、必要知識で事が足り、また柔軟に処理を作り込むことができます。そのため、作業ツールをパパッと作るのに非常に向いています。
実際、単純な業務を自動化する目的で使用することが多いと思います。さらに言うと、業務内のツールですので、Excelのデータを読み込んで、加工してファイル等にアウトプットするようなものが多いと思います。    
HTAからExcelにアクセスするには、ActiveXObjectを生成して、そのオブジェクト経由でという形が普通です。ですがこの方法では、読むセル数が大量にある場合、使い物にならないくらいに遅くなります。例えば、数万行のデータを1セル1セル読み込んで、加工データを作成するような場合、処理時間は、数十分、数時間というレベルになってきます。

ほとんどの時間は、セルデータ読み込みに使われています。
わたしは次の方法で、ActiveX経由でセルを読み込まないようにし、通常数十分かかる処理を数秒から数十秒程度で済ませられるようにしています。

1. ActiveXでファイル読み込み
1. 各シートをタブ区切りで保存
1. 保存したファイルを読み込み
1. 改行コードでsplit
1. splitされた各要素をタブでsplit

あとは、全てjavascriptの配列アクセスだけで処理できます。

サンプルをgistにあげました。
https://gist.github.com/kenmazsyma/610c7fc1c92180579bc8c8924615f447
ひよっこサーバエンジニアまとめ集

情報学科卒のひよっこSEが四苦八苦しながら勉強するページのまとめです。


###[【第一回】Virtual Boxで仮想CentOS7の環境を作る(2017/06/21)](http://qiita.com/Saki-Hit-Out/items/cb3bfdbdd675d0afb399#%EF%BC%94%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E3%81%AE%E5%88%9D%E6%9C%9F%E8%A8%AD%E5%AE%9A)

メモ
rootで入る→userアカウントを作る
(初心者向け)Getting Startedを読んでみる

Macbookで[TensorFlow](https://www.tensorflow.org/)でAIを使ってみよう、という企画です

#1. TensorFlowのGettingStartedを読む
- [Getting Started With TensorFlow](https://www.tensorflow.org/get_started/get_started)を読んで基本を理解します

##Tensor
- *The central unit of data in TensorFlow is the tensor.* 
    - TensorFlow内でのデータの基本的なユニットはtensor。
-  *A tensor consists of a set of primitive values shaped into an array of any number of dimensions.*
    - tensorは任意のN次元の配列に整形されたプリミティブ値のセットで構成される
-  *A tensor's rank is its number of dimensions.*
    - tensorのrankは次元数を表す
- *3 # a rank 0 tensor; this is a scalar with shape []*
    - 3はrank0のtensor。[]の形のスカラー。
- *[1. ,2., 3.] # a rank 1 tensor; this is a vector with shape [3]*
    - [1.,2.,3.]はrank1のtensor。[3]の形のベクター。
- *[[1., 2., 3.], [4., 5., 6.]] # a rank 2 tensor; a matrix with shape [2, 3]*
    - [[1., 2., 3.], [4., 5., 6.]]はrank2のtensor。[2,3]の形の行列。
- *[[[1., 2., 3.]], [[7., 8., 9.]]] # a rank 3 tensor with shape [2, 1, 3]*
    - [[[1., 2., 3.]], [[7., 8., 9.]]]はrank3のtensor。[2,1,3]の形。

##TensorFlow Core tutorial
- *A computational graph is a series of TensorFlow operations arranged into a graph of nodes.* 
    - 計算グラフとは、一連のTensorFlow操作をノードのグラフに配置したもの
- Each node takes zero or more tensors as inputs and produces a tensor as an output.
    - 各ノードは、0以上のtensorを入力として受取り、一つのtensorを出力する
-
読み取りロック


InnoDBではデフォルトでトランザクション分離レベルが
REPEATABLE READになっています。

REPEATABLE READの場合は
トランザクション開始後の最初のクエリの時点のスナップショットを参照するします。

## たとえば
tags tableというものがあるとします。

このテーブルに二つのターミナルを使って
トランザクションでデータを挿入します。

![スクリーンショット 2017-06-21 14.52.46.png](https://qiita-image-store.s3.amazonaws.com/0/70960/20f5aabc-5587-50bb-b070-02c46f8e40b0.png "スクリーンショット 2017-06-21 14.52.46.png")

1.左と右でトランザクション開始(`begin`)
2.スナップショットを取得するため、両方で`select`を実行
3.左側で value 20を代入し、`commit`

を行うと
右側のターミナルでは `name:20`の値を取得することができません。

## 解決方法

### for update

`select ... for update`を使うことで読み取ることができます。


![スクリーンショット 2017-06-21 14.57.33.png](https://qiita-image-store.s3.amazonaws.com/0/70960/0b0de428-3bf7-21a8-1505-3e8d0ce8e70d.png "スクリーンショット 2017-06-21 14.57.33.png")

### LOCK IN SHARE MODE



`select ... OCK IN SHARE MODE`を使うことで読み取ることができます。


このモードは読み取ることができるすべての行にロックをかけて、
他の


![スクリーンショット 2017-06-21 15.00.21.png](https://qiita-image-store.s3.amazonaws.com/0/70960/e8f228a3-c6e1-464e-4b09-10512da19736.png "スクリーンショット 2017-06-21 15.00.21.png")



## 参考
https://dev.mysql.com/doc/refman/5.6/ja/innodb-locking-reads.html
CircleCIにImageMagick v7系をインストールする

## これはなにか？

CircleCIのv1系で動いている[Ubuntu 14.04 (Trusty)](https://circleci.com/docs/1.0/build-image-trusty/)にはデフォルトでImageMagick v6系が入ってるんですが、実装の都合上v7系をインストールしたかったのでその時の対応についてです。

## aptで入れられたら簡単だったのですが…

とりあえず `circle.yml` にaptからインストールするコードを書けばOKかなと思ったのですが、どうやらデフォルトで登録されてるリポジトリはImageMagick v6系だけのようでした（aptにリポジトリを追加すればv7系をインストールすることも可能かもしれませんが試してない）

## じゃあソースコードからインストールするか

ググった感じみんなソースコードをダウンロードしてきて `make install` してるみたいだったのでそうすることにしました。

というわけで以下が `circle.yml` に書いたもの。

```yaml:circle.yml
dependencies:
  pre:
    - sudo apt-get remove imagemagick
    - wget http://www.imagemagick.org/download/ImageMagick.tar.gz
    - tar -xvf ImageMagick.tar.gz
    - cd ImageMagick-7.* && ./configure && make && sudo make install
    - sudo ldconfig /usr/local/lib
```

やってることは以下になります。

1. aptでインストール済みのImageMagickをアンインストール
1. wgetでオフィシャルから最新のImageMagickをダウンロード
1. 解凍してmakeしてinstall
1. 共有ライブラリの更新

注意点としてはv7系であることを前提として `cd ImageMagick-7.*` としてるので、将来v8が出たら修正しないと動かないでしょう。

最新版じゃなくていいなら http://www.imagemagick.org/download/releases/ からバージョンを指定してダウンロードするのが良さそう。その場合security fix的なバージョンアップがあった場合は手動で修正して追随する必要がありますが。まあCIだから大して心配する必要はないか。
SoftLayerのVyOS/VyattaでGRE接続 -> Static RoutingでNW間を接続

#1. はじめに
[SoftLayerのVyOS/VyattaでGRE接続](http://qiita.com/testnin2/items/c02b1fe63a5df1253286)の続きです。
今回は、Static Routingで172.16.0.0/24と172.16.1.0.24の間を接続したいと思います。ネットワークが2つしかないなら、Static Routingで十分でしょうね。

![vyos_gre.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/c2443cfc-b6db-0ca6-eab1-eca94e7ad56b.jpeg)

#2. Static Routingの設定

vyostok1では、172.16.1.0/24へは192.168.0.1経由でアクセスします。
vyoshkg1では、172.16.0.0/24へは192.168.0.2経由でアクセスします。

```txt:static_routingの設定
#vyostok1
vyos@vyostok1# set protocols static route 172.16.1.0/24 next-hop 192.168.0.2
vyos@vyostok1# commit

#vyoshkg1
vyos@vyoshkg1# set protocols static route 172.16.0.0/24 next-hop 192.168.0.1
vyos@vyoshk1g# commit
```

```txt:static_routingの確認
vyos@vyostok1:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
       I - ISIS, B - BGP, > - selected route, * - FIB route

S>* 0.0.0.0/0 [1/0] via 161.202.86.1, eth1
S>* 10.0.0.0/8 [1/0] via 10.132.75.65, eth0
C>* 10.132.75.64/26 is directly connected, eth0
C>* 127.0.0.0/8 is directly connected, lo
C>* 161.202.xx.xx/27 is directly connected, eth1
C>* 172.16.0.0/24 is directly connected, eth0
S>* 172.16.1.0/24 [1/0] via 192.168.0.2, tun0
C>* 192.168.0.0/30 is directly connected, tun0


vyos@vyoshkg1:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
       I - ISIS, B - BGP, > - selected route, * - FIB route

S>* 0.0.0.0/0 [1/0] via 119.81.163.33, eth1
S>* 10.0.0.0/8 [1/0] via 10.111.147.65, eth0
C>* 10.111.147.64/26 is directly connected, eth0
C>* 119.81.xx.xx/29 is directly connected, eth1
C>* 127.0.0.0/8 is directly connected, lo
S>* 172.16.0.0/24 [1/0] via 192.168.0.1, tun0
C>* 172.16.1.0/24 is directly connected, eth0
C>* 192.168.0.0/30 is directly connected, tun0

```

これでネットワークが繋がりました。
Javascript 「if文」と「switch文」の処理速度を調べる

##したいこと
if文とswitch文の処理速度どっちが早い？

**console.time('');　〜　console.Endtime('');**を使用

##実験code
```js:if文
console.time('実行速度');
if($(this).hasClass('today')){
　　get_date.val(get_date_today);
}else if ($(this).hasClass('tomorrow')){
 get_date.val(get_date_tomorrow);
}else if ($(this).hasClass('day_after_tomorrow')){
 get_date.val(get_date_day_after_tomorrow);
}else{
 get_date.val(get_date_today);　　　　
}
console.timeEnd('実行速度');
```

```js:switch文
console.time("実行速度");
switch(true){
 case ($(this).hasClass('today')) : get_date.val(get_date_today); break;
 case ($(this).hasClass('tomorrow')) : get_date.val(get_date_tomorrow); break;
 case ($(this).hasClass('day_after_tomorrow')) : get_date.val(get_date_day_after_tomorrow); break;
 default : get_date.val(get_date_today);
}
console.timeEnd("実行速度");
```

##結果
swith文の方が**0.0775146485ms**早い

|No.|if文|switch文|
|:---|---|---|
|1|0.623046875ms|0.477050781125ms|
|2|0.22900390625ms|0.14404296875ms|
|3|0.27099609375ms|0.06005859375ms|
|4|0.134033203125ms|0.058349609375ms|
|5|0.1259765625ms|0.10693359735ms|
|6|0.060302734375ms|0.50048828125ms|
|7|0.05810546875ms|0.0810546875ms|
|8|0.086181640625ms|0.05025390625ms|
|9|0.10302734375ms|0.260009765625ms|
|10|0.065185546875ms|0.05615234375ms|
|Average|0.3441162109ms|0.2666015624ms|
*「ms（ミリセカンド）」は1/1000秒*

##追記
###if文とswitch文用途で使い分ける場合
多分岐の場合 → switch文が適している
二分岐の場合 → if文が適している

詳細については、こちらの記事が分かりやすかったです。
[分岐処理のすすめ～用途で使い分ける～](http://www.linuxacademy.ne.jp/lablog/programmer/807/)
GO言語 から bluemixのObject Strageを使用する。

# 経緯
bluemix上にデプロイしている自作のGO言語アプリケーションで、大容量ストレージが必要になってきたため、bluemixで提供されているストレージサービスを調べてみました。
使用できるサービスは、BlockStorage、FileStorage、ObjectStorageの3つですが、ObjectStorage以外はどれもちゃんとしたサーバーからアクセスする前提となっているようで、CloudFoundryからは使用出来ないようです。（FileStorageを使用しようと試行錯誤しましたが、出来ませんでした。） 
で、このObjectStorageを使用する場合も、Node.jsでアクセスするサンプルコードは見つかるのですが、GO言語のものが英語サイトでも見つかりませんでした。
結局、自力で解決したので、その辺りのノウハウを共有したいと思います。

# 準備
### 接続情報取得
まず、bluemixコンソールから、下記の手順で接続情報を確認します。

1. アプリから”ObjectStorage”を選択
![qiita2017062101.png](https://qiita-image-store.s3.amazonaws.com/0/39724/5a8dc58a-035d-b789-357f-1e9a8f1a2f4b.png)
  
  
1. 左側メニューの “サービス資格情報”を選択
1. メイン部分に表示される”サービス資格情報”内の”詳細の表示”ボタンを選択
![qiita2017062102.png](https://qiita-image-store.s3.amazonaws.com/0/39724/caa41a11-7949-89ce-9dbd-6ec5df9ce34d.png)


すると、下記のようなJSON形式の情報が表示されます。これをどこかにメモります。

``` json
{
    "Object-Storage": [
        {
            "credentials": {
                "auth_url": "https://identity.open.softlayer.com",
                "project": "…",
                "projectId": "…",
                "region": "…",
                "userId": "…",
                "username": "※1",
                "password": "※2",
                "domainId": "※3",
                "domainName": "…",
                "role": "admin"
            },

```


### OpenStack Swiftライブラリインストール
次にOpenStack Swiftにアクセスするためのライブラリ取得します。

```
go get github.com/ncw/swift
```

準備は、以上で完了です。

## 実装

下記は、接続から"test"という名前でコンテナを作成するまでの実装サンプルです。
swift.connection部分を自分用に置き換えれば、そのまま使用できると思います。
このコードで、ローカルマシンでも、bluemixにデプロイした状態でも動作します。

``` go
import (
// …
"github.com/ncw/swift"
// …
)

var c = swift.Connection{}
var CONNAME = "test"


func init() error {
	c = swift.Connection{
		UserName: "※1",
		ApiKey:   "※2",
		AuthUrl:  "https://identity.open.softlayer.com/v3/",
		DomainId: "※3",
	}
	// Authenticate
	err := c.Authenticate()
	if err != nil {
		return err
	}
	// コンテナ名一覧を取得
	containers, err := c.ContainerNames(nil)
	if err != nil {
		return err
	}
        // 探しているコンテナ名があるか
	found := false
	for _, name := range containers {
		if name == CONNAME {
			found = true
			break
		}
	}
        // 無ければ作成
	if !found {
		err = c.ContainerCreate(CONNAME, nil)
		return err
	}
	return nil
}
```

ファイル保存、読み込みはこんな感じです。

```go
    // 保存
	out, err := c.ObjectCreate(CONNAME, "ファイル名", true, "", "", nil)
	if err != nil {
		// エラー処理
	}
	if size, err := out.Write([]byte("データ")); err!=nil {
		// エラー処理
	}
	if err = out.Close(); err != nil {
                // エラー処理
    }
```

```go
    // 読み込み
    data, err := c.ObjectGetBytes(CONNAME, "ファイル名")
```
本当に比較して一致したのか不安な人向けdiff

diffコマンドはファイルの比較結果が一致していると何も表示せずに終わるタイプのコマンドです。その結果何が起こるかというと、自動テストコードのファイル比較処理で実行ログ上何も記録が残らず、

- 比較処理自体を書き忘れてはいないか
- 比較元も比較先も生成に失敗した結果両方0バイトなのを成功として通してしまっていないか

などといった不安感の漂う成果物となったりするわけです。

こんな`vdiff`（Verbose DIFF）コマンドを用意してみてはいかがでしょう。

```bash
#!/usr/bin/env bash

diff\
  <(tee <$1 >(echo 左側:`wc -l`行>&2)) \
  <(tee <$2 >(echo 右側:`wc -l`行>&2)) &&\
echo 一致しました>&2
```

- 一致ならリザルトは0、それ以外なら>0
- 一致なら標準出力は汚さない

といったdiffコマンドの基本仕様はそのまま、左右ファイルの行数と、成功した場合は「一致しました」のメッセージを標準エラー出力に出してくれます。

process substitutionという記法を用いているのでshでは動きません。bashかzshで使ってください。
Gentoo with systemd 環境でのElasticsearchのインストール

少し時間とられたのでメモです．

# インストール
インストールはすんなりといけるはず．`package.accept_keywords`の変更をする必要があるかも．

```shell-session
sudo emerge elasticsearch
```

# systemd.service テンプレートの場所
emergeでインストールするとopenrc用のinitスクリプトは自動で配置されるがsystemdのserviceファイルは
自分で配置する必要がある．
ただ，サンプルはemerge時に配置されるようで
```
/usr/lib/systemd/system/elasticsearch.service
```
に転がっているので
```
/etc/systemd/system/
```
以下にコピーすると良い．

# ディレクトリの所有者の変更
openrcのinitスクリプトには，Elasticsearchがログの出力などに使用するディレクトリの権限やパーミッションを確認する処理が書かれているが，systemdのテンプレートにはそのような記述がないのであらかじめ自分で所有者とグループを変更する必要がある

```
chown elasticsearch:elasticsearch /var/log/elasticsearch
chown elasticsearch:elasticsearch /var/lib/elasticsearch
chown elasticsearch:elasticsearch /run/elasticsearch
```

ここは記憶を頼りに書いているのでもしかしたら他にも所有者を変更する必要のあるディレクトリがあるかもしれない．

# elasticsearch.service ファイルの修正
インストール時に配置されるserviceファイルが古いのか，` default.path.home` なんぞ知らんと怒られる．
`ExecStart`を設定している箇所の`default.path.name`に関する行を丸々削除すると問題なく起動するようになる．

# 自動で起動するように設定
```
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
```

# 余談
そもそもこれぐらいの変更量ならsystemd USEフラグを立てている人のためのportageのPull Request書いた方がいいのだろうけど詳しいやり方知らないのと面倒臭いので保留中．
Fragment変更時にナビゲーションドロワーアイコンをアニメーションさせる

Gmailアプリでメール一覧 ⇔ メール詳細に移動した時のように、ナビゲーションドロワーアイコンをアニメーションさせます。

こんな感じです。

![ezgif-1-d071526deb-iloveimg-resized.gif](https://qiita-image-store.s3.amazonaws.com/0/88858/99413609-ad8f-ae9e-5098-f3f0cc47a661.gif "ezgif-1-d071526deb-iloveimg-resized.gif")

ナビゲーションドロワー付きのActivity内にFragmentを持ちます。
FirstFragment のボタンをタップすると SecondFragment が表示されます。
バックボタンをタップするとFirstFragmentにもどります。


## 実装

※すでに[ナビゲーションドロワー](https://developer.android.com/training/implementing-navigation/nav-drawer.html?hl=ja)の実装が完了していることを想定しています。

FirstFragment ⇔ SecondFragment 移動時に下記のメソッドを呼び出しています。

```java
private void setNavigationIcon(boolean isSecondFragment) {
        ValueAnimator valueAnimator;
        if (isSecondFragment) {
            valueAnimator = ValueAnimator.ofFloat(0, 1);
        } else {
            valueAnimator = ValueAnimator.ofFloat(1, 0);
        }

        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                float slideOffset = (Float) valueAnimator.getAnimatedValue();
                toggle.getDrawerArrowDrawable().setProgress(slideOffset);
            }
        });
        valueAnimator.setInterpolator(new DecelerateInterpolator());
        valueAnimator.setDuration(250);
        valueAnimator.start();
    }
```

ナビゲーションドロワーアイコンは[DrawerArrowDrawable.setProgress()](https://developer.android.com/reference/android/support/v7/graphics/drawable/DrawerArrowDrawable.html#setProgress(float))に0.0〜1.0の値を渡すことによってハンバーガーアイコン⇔矢印アイコンの変化度合いを設定することができます。
```setProgress(0.5f);```とした場合はこのような状態になります。

![スクリーンショット 2017-06-21 19.14.46.png](https://qiita-image-store.s3.amazonaws.com/0/88858/f25b91b0-a5ab-3761-eb9a-6cd170321aab.png "スクリーンショット 2017-06-21 19.14.46.png")


[DrawerArrowDrawable.setProgress()](https://developer.android.com/reference/android/support/v7/graphics/drawable/DrawerArrowDrawable.html#setProgress(float))に0.0〜1.0の値を連続的に渡すことでナビゲーションドロワーアイコンのアニメーションさせることができます。

これには[ValueAnimator](https://developer.android.com/reference/android/animation/ValueAnimator.html)を使用しています。

 ```ValueAnimator.ofFloat()``` で開始値と終了値を設定します。
 ```ValueAnimator.setDuration()``` で設定したアニメーション時間の間で開始値〜終了値に値を変化させます。
値が変更される毎に```onAnimationUpdate()```が呼び出されます。

FirstFragment → SecondFragmentの場合は1.0〜0.0に変化させ、
SecondFragment → FirstFragmentの場合はその逆の0.0〜1.0に変化させています。


## 参考

* [Animate drawer icon into arrow on setDisplayHomeAsUpEnabled?](https://stackoverflow.com/a/26577437)
* [Androidでアニメーションしたい](http://qiita.com/stenpel/items/30d841a4ad637960670a)
Jekyll での SEO関連タグ

#やりたいこと
* Google サーチコンソールのタグ埋めたい
* Google アナリティクスのコード入れたい
* OGタグをいい感じに出したい
* xmlサイトマップは自動生成したい
* Feed もあるといいよね

# Feed

[Jekyll Feed plugin](https://github.com/jekyll/jekyll-feed) を使う。
入れておけば自動でフィードを生成してくれる。

# xmlサイトマップ

[Jekyll Sitemap Generator Plugin](https://github.com/jekyll/jekyll-sitemap) を使う。
入れておけば自動でxmlサイトマップを生成してくれる。

# Googleアナリティクス

いい感じのプラグインがないので、自作。

参照：https://michaelsoolee.com/google-analytics-jekyll/

1 `_config.yml` に変数書いておく（なくも2のテンプレートに直接書いてもよい）

```
google_analytics: UA-XXXXXXXX-X
```

2 `_includes/analytics.html` を作る

```
<script>
	(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
	(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
	m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
	})(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

	ga('create', '{{ site.google_analytics }}', 'auto');
	ga('send', 'pageview');

</script>
```

3 `</head>` の前辺りに include する
例は `JEKYLL_ENV=production` でビルド実行時に `_config.yml` に `google_analytics` が設定されてたときだけソースが書き出される

```
{% if jekyll.environment == 'production' %}
{% if site.google_analytics %}{% include google-analytics.html %}{% endif %}
{% endif %}
</head>
```

# OG タグとか Google サーチコンソール
[Jekyll SEO Tag](https://github.com/jekyll/jekyll-seo-tag) を使う。
いわゆるSEOに必要そうなタグはこれで。

## Googleサーチコンソール
`_config.yml` で `google_site_verification` にサーチコンソールの確認方法の「HTML タグ」に出てくる `content` の値を設定しておく。

```
<meta name="google-site-verification" content="xxx" />
```

## `<title>`
テンプレートに `<title>` がすでにあるとプラグインの出すタグと重複してしまう。
テンプレート側を活かす場合は `{% seo title=false %}` を書いておく

## Description
`_config.yml` の他、各ドキュメントの Front Matter でも設定できる。

## OGタグ、Twittercard
og:image含め一通り対応してる。
Descriptionと同じく `_config.yml` の他、各ドキュメントのFront Matterでも設定できる。

## Canonical URL
Front Matter で `canonical_url`を設定する。

CMSでなくてもここまでできますよーということで、現場からは以上です。
C++ Builder > Form > マウスクリックしても他のフォームが常に前面になる場合の対策

```txt:動作環境
C++ Builder XE4
```

### 状況

- とある画像関連のSDKを使用
- HWND型変数を渡す
- 渡したHWNDのFormに対して描画を行う
- 渡したHWNDのFormが常に前面に出るようになった
    - マウスクリックで別のFormをクリックしても、そのFormが前面に出ない

### 効果があった方法

プロジェクトの.cppに対して以下とする。

```cpp
Application->MainFormOnTaskBar = false;
```

参考: [Top > コンポーネント > フォームの重なり順序を変更する方法は？ @ C++ Builder / Turbo C++ 質問の木](http://gimite.net/bcbqtree/qtreemain.cgi?mode=thread&thread=1291)
の 山本隆さんの回答。
情報感謝です。


### 効果がなかった方法

```
	// 以下の対策をしたが効果はなかった
	// SetWindowPos(Handle,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE);
	//
	// 効果なし
	// this->SetFocus();
	//
	// 効果なし
	// EnableWindow(0, true);
	//
	// 効果なし
	// SetWindowPos(previewHwnd, HWND_NOTOPMOST,0,0,0,0,SWP_NOSIZE | SWP_NOMOVE);
	//
	// 効果なし
	// PreviewForm->FormStyle = fsNormal;
```
UIImagePickerControllerで取得した画像の形式を取得する

(NS)Dataに変換する時に以下の2種類あるのでその判定用。
UIImageJPEGRepresentation
UIImagePNGRepresentation

```
enum ImageType: String {
    case jpg = "JPG"
    case png = "PNG"
    case gif = "GIF"
}

extension SomeViewController: UIImagePickerControllerDelegate {
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String: Any]) {
        var imageType: ImageType?
        if picker.sourceType == .camera {
            // カメラはjpg固定
            imageType = .jpg
        } else {
            // ファイルの格納先の拡張子から形式を取得する
            if let url = info[UIImagePickerControllerReferenceURL] as? URL, let component = URLComponents(url: url, resolvingAgainstBaseURL: false) {
                if let queryItems = component.queryItems {
                    for query in queryItems {
                        if let value = query.value, query.name == "ext" {
                            imageType = ImageType(rawValue: value)
                        }
                    }
                }
            }
        }

        guard let image = info[UIImagePickerControllerOriginalImage] as? UIImage else { return }
 
        // some action
    }
}
```
Angular,Riot,Vue.js使ってみた雑感

# 2020.12 追記

今と状況が違いすぎるので読まないでください！参考にしないでください！

Vue3サイコー

# 試用内容

- それぞれで、サーバー側のプログラム（api）を使った動的webサイトを開発。
- 全て内蔵のルーターや推奨ルーターを用いたSPA。
- Angularは2系、Riotは3系、Vue.jsは2系を利用。

# Angular
機能性や安全・安定性に関してはなかなかよい。
複雑で大規模なサイトを作るならアリかもしれない。
ただ、自分のプロダクトで使いたいかと言われれば微妙。

設計はMVCフレームワークに馴染みがある人ならしっくりくると言うか、違和感なく理解できると思う。
TypeScriptも、JAVAやCなどの経験者なら特に学習は不要だし、純粋なJavaScriptよりも安全に書けてよい。
静的型付けなので問題有りな代入などはコンパイルで弾いてくれるし、テキストエディタのリアルタイムチェックもがっつり受けられる。

人数の多い開発の場合、今回比較する3つの中で最も破綻しづらいかもしれない。ただ、メンバーのレベルにバラつきがあると最初がつらそう。

学習コストの大部分は、MVCの仕組み、JSより厳格なTypeScript、のような理解に関する部分であり、既に近い技術の知見があるならその点での学習は不要になる。

（ここで「Angular難しい／そうでもない」派に別れるのだと思う）

ng-cliという開発を便利にするcliツールがある。逆に自力で開発環境を整えるのは相当しんどそう。

# Riot
あまりのシンプルさと簡単さに驚き。
導入もjQueryのように読みこむだけ。
導入コストに関しては間違いなく一番。

Viewのみを担当するライブラリなので、例えばデータの取得はjQueryのajaxを使うなりFetchを使うなりして自分で組んでいく必要がある。
（場合によってはメリットになりうる）

コンポーネントを別ファイル化しつつscriptタグのsrc属性で読み込むことができるので、ビルドの仕組みを一切導入しなくても使える。

riot独自のルールを覚えなければいけない機会は限りなく少ない。

それなりに大きなプロダクトを作ろうとすると色々辛くなってくる。

あと、他の2つに比べると知名度が低く、検索で得られる情報は少ない。
「`riot ほげ`」と調べれば「`もしかして: react ほげ`」と言われてしまう。

ほんとにちょっとしたときに使うには手軽でよい。

# Vue.js

Angularにちょっと似ていると思った。

Riotよりも高機能で、Angularほど大げさでもない。
一通りこなせるし、一番バランスがとれている。

最近は人気も高く、情報もしっかり得られるしアップデートも盛ん。使えれば仕事でも有利だと思う。

vue-cli経由で環境構築すると、かなりいい感じで必要なものが揃う。
Hello,worldレベルならRiotのようにソースを読みこむだけで使えるが、素直にvue-cliに頼るのがよさげ。

本格的なことをやろうとするとライブラリを選んで導入していかないといけないReactに比べ、vueは単体・またはvuexやvue-routerといった公式の拡張で一通りのことができる。

# 総評

基本的にはVue.jsがおすすめ。
Angularと比べても守備範囲に不足ないうえ、Angularより手軽で自由だと思います。

Riotは耐えうるプロダクトが限られているように思うし、残念なことに最近は名前すら聞かない…。

Reactは今から選ぶには後発のライブラリと比べてメリットが少ないように思えて触ってみる気になれなかった。
【Go言語/PHP】「ログインしていないと見れない画像」を実装

条件は「ログインしていないと」に限らず、「夜しか見れない」とかでもなんでもよく、ある条件のときだけ閲覧できる仕組みです。

こんなこともできるんだー的な紹介であって、一般的なプロダクトで有用な手法ではありませんので、何らかの理由でこの記事のような機能を必要としている場合、別の方法を検討することをおすすめします。
（例えば、画像URLを予測不能なものにする、「画像自体」ではなくHTMLで制御する、など）

# 仕組み

- 画像ファイル本体はWebからアクセスできないディレクトリに置く。
- ログインチェックし、ログインしていないなら403を返す。
- ログインしているなら対応する画像データを（レスポンスヘッダでContent-typeを指定したうえで）返す。
- ログインしていても、対応する画像がなければ404を返す。

という感じです。

# Goで実装

ginというWAFを使ってリクエストとレスポンスを制御していますが、そこは重要ではないので好きに置き換えて大丈夫です。

```go:main.go
package main

import (
  "github.com/gin-gonic/gin"
  "os"
  "mime"
  "strings"
  "io/ioutil"
)

func main() {
  router := gin.Default()
  router.GET("/img/:filename", getImage)
  router.Run(":8080")
}

// ログインしているときだけ画像を表示
func getImage(c *gin.Context) {
  if isLoggedin() {
    // ログインしている
    dir := "./img"
    filename := c.Param("filename")
    file, e := os.Open(dir+"/"+filename)
    if e == nil {
      // 画像が存在する
      contentType := getContentType(filename)
      fileData, _ := ioutil.ReadAll(file)
      c.Data(200, contentType, fileData)
    } else {
      // 画像が存在しない
      c.Status(404)
    }
  } else {
    // ログインしていない
    c.Status(403)
  }
}

// ファイル名からcontentTypeを取得
func getContentType(filename string) string {
  pos := strings.LastIndex(filename, ".")
  contentType := mime.TypeByExtension(filename[pos:])
  return contentType
}

// ログインしているかどうか
func isLoggedin() bool {
  return true // ログインしている
  // return false // ログインしていない
}
```

画像は以下のように配置しておく。

```
project/
  ├ main.go
  └ img
     └ hoge.png
```

## 確認

実行後、`http://localhost:8080/img/hoge.png`にアクセスして画像が表示されることを確認してください。

次に、`isLoggedin()`の結果をfalseに変更した上でもう一度アクセスし、403エラーが返ってくることを確認してください。

実際のファイルの閲覧権限を弄ったりしているわけではないので、`./img/`ディレクトリがウェブから見える位置にあれば当然見えてしまうので注意してください。


# PHP版

```php:index.php
<?php 
define('DIR', '../img/');

function main() {
	if(isLoggedin()) {
		// ログインしている
		$filePath = DIR.basename($_GET['filename']);
		if(file_exists($filePath)) {
			// 画像が存在する
			$contentType = mime_content_type($filePath);
			header('Content-Type: Content-type: '.$contentType);
			readfile($filePath);
		} else {
			// 画像が存在しない
			header('HTTP/1.1 404 Not Found');
		}
	} else {
		// ログインしていない
		header('HTTP/1.1 403 Forbidden');
	}
}

function isLoggedin() {
	return true; // ログインしている
	// return false; // ログインしていない
}

main();
```

画像は以下のようにドキュメントルートの外に配置しておく。

```
project/
  ├ htdocs
  │  └ index.php
  └ img
     └ hoge.png
```

## 確認

`http://xxx/index.php?filename=hoge.png`へアクセスし、Goのときと同様に`isLoggedin()`がtrueのときだけ見れることを確認して下さい。

ルーティングはhtaccessなりで変更し、`http://xxx/img/hoge.png`で実行できるようにしたらいいかと思います。
MYSQLでスロークエリのログが出力されない

###**事象**
表題の通り。
スロークエリを確認しようと思ったら出力されずにハマったのでメモ。


###**スロークエリの出力設定**
サーバは再起動したくなかったのでset globals で対応。

```
set global slow_query_log = 1;
set global long_query_time = 5; --5秒以上なら出力
set global slow_query_log_file ='slow_query.log'; -- 出力先

```


設定を確認

```

SELECT * 
FROM information_schema.global_variables
WHERE VARIABLE_NAME = "slow_query_log"
OR VARIABLE_NAME = "long_query_time"
OR VARIABLE_NAME = "slow_query_log_file";

+---------------------+---------------------+
| VARIABLE_NAME       | VARIABLE_VALUE      |
+---------------------+---------------------+
| SLOW_QUERY_LOG      | ON                  |
| LONG_QUERY_TIME     | 5.000000            |
| SLOW_QUERY_LOG_FILE | slow_query.log      |
+---------------------+---------------------+
3 rows in set (0.00 sec)
```
正常に設定されました。
出力先にもちゃんとログファイルが作成されています。



###**実際に確認**
設定が完了したので、実際に重たいクエリを実行。
その後、ログファイルを確認。

ファイルの権限も問題ないのに出力されない・・・。



###**原因**
「log_output」が "NONE"になっていました・・・。
FILEにしてやると正常に出力されました。
```
set global log_output = 'FILE';
```

めでたしめでたし。


ちなみに、TABLEにするとslow_logテーブルに出力されるようになりました。
```
set global log_output = 'TABLE';
SELECT * FROM mysql.slow_log;
```
【PHP】 外部apiの実行結果をキャッシュする仕組みを独自に実装

# 例えば

- Qiitaの記事取得apiを叩いて自分のサイトに表示したい！
- でもapi叩くのに1秒弱かかるから、24時間くらい結果をキャッシュしたい！
- キャッシュ用のプラグインとかは入れたくない！

# 完成品

```php:index.php
<?php 

// file_get_contentsの結果をキャッシュしつつ返す
function getCacheContents($url, $cachePath, $cacheLimit = 86400) {
  if(file_exists($cachePath) && filemtime($cachePath) + $cacheLimit > time()) {
    // キャッシュ有効期間内なのでキャッシュの内容を返す
    return file_get_contents($cachePath);
  } else {
    // キャッシュがないか、期限切れなので取得しなおす
    $data = file_get_contents($url);
    file_put_contents($cachePath, $data, LOCK_EX); // キャッシュに保存
    return $data;
  }
}
```

説明するまでもないですね！

# 使い方

```php:index.php
<?php 
// qiitaの記事を取得
function getQiitaItems() {
  $res = getCacheContents('https://qiita.com/api/v2/users/laineus/items?page=1&per_page=20', './cache');
  return json_decode($res);
}
?>

<ul>
  <?php foreach(getQiitaItems() as $val): ?>
  <li><a href="<?= $val->url ?>" target="_blank"><?= $val->title ?></a></li>
  <?php endforeach; ?>
</ul>

```

# 動作サンプル

http://demo.laineus.com/qiita/

サンプルでは、その取得がキャッシュなのか新規にリクエストしたものかが表示されます。
また、キャッシュ有効期間は10秒になっていますので、何度かリロードしてお試し下さい。
vim-cellmode

PythonコードをVimで編集しながらiPythonなどのインタラクティブ環境で実行したい。手元の環境がPyhton3かつipython6とかなので便利そうなの([vim-ipython](https://github.com/ivanov/vim-ipython)とか)は軒並み使用できなかった(多分)。たどり着いたのは[vim-cellmode](https://github.com/julienr/vim-cellmode/blob/master/doc/cellmode.txt)というプラグインでvimからipythonを起動したtmuxセッションにコードを投げてくれる。

この時のvimファイルは##で囲んだ範囲をcellとして扱いこの範囲を実行してくれる。これが面倒そうで試した順番があとになったが、最近jupyter-notebookを使っていてcellごとに実行命令ができるのは範囲選択してから実行するより一段早い(通常ブロックごとに実行したいことが多い)こともある。また、構造がシンプルでバージョンの依存性が低そうなのも良い。ただし、要tmux。

### インストール
[vimplugを使っていれば](http://qiita.com/skoyama427/private/a9741d5b32666f09b201)、.vimrcに一行追加し:PlugInstallを打つだけだ

```
Plug 'https://github.com/julienr/vim-cellmode'
```


### 実行
やや面倒。tmuxを立ち上げてセッションリネーム(ipython限定)しねばならない

```
tmux
tmux rename-session ipython
```

そしてtmuxが立ち上がっているのとは違うコンソールでvimを開く

```py3

##
import numpy as np      #(*)
##

##
np.array([[1,2,3],[4,5,6],[7,8,9]])
##
```

*の行にカーソルを持っていて
Ctrl-g:##から##までのコマンドを実行
Ctrl-b:##から##までのコマンドを実行して後の##の次の行へ
Ctrl-c:現在選択中のコマンドを実行

とできる。立ち上げなんかがやや面倒ですが、これでpythonをvimからインタラクティブに実行できる。/tmp/以下に投げるコードを一旦書き出してそれをipython側からロードしているらしい。少しいじればRにも応用できそうだと思った。##を変更してしまえばvimでfoldしてしまえるのも良いと思った。
[Unity] ドラッグ&ドロップ一切使わずスクリプトのみで画像・動画・テキスト・Prefab取り込み

#D&Dに頼らずアセットをシーンに…

この状態からスクリプトだけで色々取り込む
![1_first.png](https://qiita-image-store.s3.amazonaws.com/0/186209/c6ddd675-328a-7f49-cdaf-c8c03baba352.png)

##前提
- HoloLens上での動作を目指しています
- D&Dなし（くりかえし）
- スクリプトのみ（くりかえし）

##環境

Unity  5.6.1f1 Personal
HoloLens OS build 10.0.14393.1198
HoloToolKit Merge #716

##アセット

- 画像(png,jpg) ※360度ビュー可
- 動画(ogv) ※360度ビュー可
- テキスト(txt, json)
- 3Dモデル(fbx)

*360度視野の画像・動画は専用の球体のPrefabをPlaneの代わりに作れば可能ですがここでは割愛*

###Tree

```bash:Project
Assets
├── StreamingAssets
│   └───Resources
│        ├──images
│        │   └── exIm.png
│        ├──movies
│        │   └── exMv.ogv
│        ├──texts
│        │   └── exTx.txt
│        └──models
│            ├── exMd.fbx
│            └───Prefabs
│                └──model.prefab
└─── Prefabs
     └──3DTextPrefab.prefab

PrefabsファイルはResources内で一つにまとめても良い

```
streamingAssetsについては[HoloLens上でスクリプトを用いて外部ファイルの読み込みをしたい](http://qiita.com/gshirato/items/dbefd28b570d98cb4da9)を参照


```csharp:using
using UnityEngine;

//テキスト読み込み用
using System.IO;
using System.Text;

```
###画像

Planeを生成して画像を2Dテクスチャとして貼り付ける

```csharp:画像
GameObject image = GameObject.CreatePrimitive(PrimitiveType.Plane);
string path = "images/exIm" //Resources.Loadのために拡張子つけない
Renderer rend = image.GetComponent<Renderer>();
Texture2D tex2d = new Texture2D(1, 1); //コンストラクタの値はなんでも良い
//Photo読み込み
tex2d = Resources.Load(path) as Texture2D;
//PlaneのTextureに画像を指定
rend.material.mainTexture = tex2d;

```

###動画

Unity 5.6からはVideoPlayerというのが使えるらしい…

```csharp:動画
GameObject movie = GameObject.CreatePrimitive(PrimitiveType.Plane);
string path = "images/exMv" //Resources.Loadのために拡張子つけない
Renderer rend = movie.GetComponent<Renderer>();
//Movie読み込み
MovieTexture movieTexture = Resources.Load(path) as MovieTexture;
//Audio取り付け・読み込み
AudioSource audioSource = movie.AddComponent<AudioSource>();
audioSource.clip = movie.audioClip;

//PlaneのTextureに動画を指定
rend.material.mainTexture = movieTexture;
//再生
movieTexture.Play();
audioSource.Play();


```


###テキスト

textPrefabは[HoloToolKit-Unity](https://github.com/Microsoft/HoloToolkit-Unity)の[UI/Prefabs/UITextPrefab.prefab](https://github.com/Microsoft/HoloToolkit-Unity/tree/master/Assets/HoloToolkit/UI/Prefabs)を使用

```csharp:テキスト
//ーー関数外ーー
public GameObject textPrefab;//ここD&D使ってました(その気になればこれも読み込みできるはず)
//ーーーーーーー

GameObject textGO = Instantiate(textPrefab);
TextMesh text3d = textGO.GetComponent<>();
string path = Application.streamingAssetsPath 
    + "/Resources/texts/exTx.txt";
FileInfo file = new FileInfo(path) // フルパス・拡張子必要

using (StreamReader sr = new StreamReader(file.OpenRead(), Encoding.UTF8)
{
 
    string text = sr.ReadToEnd();
    text3d.text = text;
　　　//Close() メソッドはWindows Store系アプリの場合使えないのでDispose()で代用
    sr.Dispose(); //↑結構大事
}

```

###3Dモデル

```csharp:モデル
GameObject prefab = Resources.Load("models/Prefabs/model");
GameObject model = Instantiate(prefab);

```

##以上
よりダイナミカルなシーンを組むことが可能に


#HoloLens開発記事一覧
[こちら](http://qiita.com/gshirato/items/6c026f2c67dc332f829b)から
使用できるP12を誰も持っていないので、新しくCertificates作ってRevokeした



Macを初期化してクリーンな環境になったはいいが、リリースに必要なp12証明書を書き出せる人が誰もいなく、Storeにアップロード出来ない。。

## 対応

新しくCertificatesを作り、今あるCertificatesを削除する。

## 手順

## CertificateSigningRequest.certSigningRequestの作成

1. Macにてキーチェーンアクセスを起動する
1. キーチェーンアクセスの環境設定から、証明書を表示し、下記設定を行う
 - OCSP -> 切
 - CRL -> 切
1. キーチェーンアクセスの証明書アシスタントから、認証局に証明書を要求する
1. 証明書アシスタントの下記に入力し、続ける
 - ユーザーのメールアドレス:メールアドレス
 - 通称:適当な名前
 - CAのメールアドレス:未記入
 - 要求の処理
 - [x] ディスクに保存
 - [x] 鍵ペア情報を指定
1. 鍵ペア情報に下記を設定し、続ける
 - 鍵のサイズ:2048ビット
 - アルゴリズム:RSA
1. 指定したフォルダに下記ファイルが出力されるので、取っておく
 - CertificateSigningRequest.certSigningRequest

## Certificatesの新規作成

1. [Apple Developer Program](https://developer.apple.com/programs/jp/)にアクセスし、アカウントからCertificates, Identifiers & Profilesを表示する
1. iOS Certificatesの+ボタンをクリック
1. App Store and Ad Hocを選択し、Continue
1. Continue
1. Choose File...からCertificateSigningRequest.certSigningRequestの作成で取得した、CertificateSigningRequest.certSigningRequestを選択し、Continue
1. Downloadをクリック
1. ダウンロードした、ios_distribution.cerをダブルクリックで、インポート

## Provisioning Profilesの更新

1. Provisioning Profilesから対象のProvisioningを選択する
1. Edit
1. Certificatesから、新規作成したCertificatesを選択
1. Generate
1. Download&インポート

## 古いCertificatesの削除

1. iOS Certificatesから対象のCertificatesを選択
1. Revokeを選択して完了

## 感想

全てに影響すると言われていたの、おっかなびっくり実施していました。
管理体制をちゃんとしてないと、また実施することになりそうなので備忘録。
[WIP] 意図せぬMerge Hellを防ぐ


## WIP
- 本記事は執筆中です。ご意見募集中。

## 前説
- gitを用いて複数人で開発する際、機能毎にブランチを切り、プルリクエストを出すことで開発をすすめることが多いと思います。
- しかし、機能Aと機能Bを開発したあと、機能Bのブランチに機能Aのブランチをマージ(※BはAより優先度が低いとします)してpushするだけでも意図せぬMerge Hellは簡単に起こってしまいます。
- 特に、「機能Bのブランチに機能Aのブランチをマージ」した状態で常用するとこの現象はそれなりに発生すると思います。

コマンド例です。

```sh
git checkout -b featureA
...
git push # make pull request
...
git merge featureB
git push # pull request broken
```

## 次善策
- 自分専用のメインブランチを持ち、そこにマージする。
- アカウントごとにリポジトリが異なる場合は良いと思いますが、リポジトリを共有している場合は非推奨と考えられます。

## AやBに依存する機能Cを作る場合
- 普通にブランチを切れば良いと思います。

## AとBを両方持った状態で常用するには
- マージすることが問題だとすれば、(以下執筆中)