OmniAICreator/Qiita-1.07M huggingface dataset:
OneThird CMS をXAMPPに導入する

# 目的
Webデーターベースの開発用に手元のPCで軽量なCMSを導入する

# 参考
[AWSのEC2に軽量CMSの「OneThird」をインストールしてみた](https://www.fallapple.net/2017/03/11/post-1200/)

# 環境
いつもの Surface3 (Windows10 Home ver.1709 x64,メモリ4GB)

# 用意したもの

[xampp-win32-7.2.4-0-VC15-installer.exe](https://ja.osdn.net/projects/sfnet_xampp/downloads/XAMPP%20Windows/7.2.4/xampp-portable-win32-7.2.4-0-VC15-installer.exe/)
[onethird.v192.zip](https://onethird.net/download?file=aee0b33eb76b293f67553604cf78f815)

# ポイント
OneThird CMSはPHPとSQLiteで動作するとても軽量なCMSです。
ただ mod_rawrite の使い方に癖(ファイルがないとDocumentRootに遷移する)があるので、htdocsは使わずに独立させて81番ポートに仮想ホストを設定します。

# インストール
1. XAMPPを任意の場所（今回は C:\tmp\xampp にしました）に導入します。最低限、Apacheだけ導入すれば事足ります。（DBはSqlite3を使います）
2. onethird.v192.zip の中身を、C:\tmp\xampp\onethird に展開します。 htdocsに展開しないのがミソです。
3. C:\tmp\xampp\apache\conf\extra\httpd-vhosts.conf の末尾に以下を追加します

 ```httpd-vhosts.conf
　Listen 81
　<VirtualHost *:81>
　DocumentRoot "C:\tmp\xampp\onethird"
　#ServerName
　#ServerAlias
　<Directory "C:\tmp\xampp\onethird">
　Require all granted
　AllowOverride All
　RewriteEngine On
　RewriteBase /onethird
　RewriteRule ^/onethird/index\.html$ 　/onethird/index2.html [R,L]
　</Directory>
　</VirtualHost>
 ```

# CMSの初期設定
1. XAMPPのコントロールパネルからApacheを起動します
2. http://localhost:81 にアクセスします
![image.png](https://qiita-image-store.s3.amazonaws.com/0/99561/37f3233b-2c8c-1b04-b405-2a2377bcc9af.png)
3. "Change language" に進みます
4. from "english" to "japanese" をセットして、"execute patch" を実行します
5. "back to install"
6. "インストール(SQLite)"を実行します
7. 管理者IDとパスワードを入力して、"インストール開始"を実行します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/99561/96be336d-8f77-d7d9-c6ef-f643f75a0233.png)
8. インストールが終了したら、"OneThird CMSを開始する" を押します
![image.png](https://qiita-image-store.s3.amazonaws.com/0/99561/d26fd45e-50ca-8b2b-fac1-a2c633c2e3b9.png)
9. http://localhost:81/login にアクセスして、設定した管理者IDとパスワードでログインできれば設定は終了です。
fontforgeでIPA明朝のカーニングを調整する

IPA明朝を縦書きで使用した際に気になる箇所を一部調整（個人的な好みです）
IPA明朝のバージョンは002.01です。

#日本語バージョンのfontforgeをDL
http://www.geocities.jp/meir000/fontforge/
から「fontforge-cygwin_2016_05_26.zip」をDLして解凍し、パスに日本語が含まれないフォルダに置く

#フォントのカーニング編集
参考：https://fontforge.github.io/ja/editexample5.html
「メトリックとカーニングの検査法と調整法 - FontForge」

fontforge.batをダブルクリックで起動
ipam.ttfを選択

ウィンドウ(W)→メトリックウィンドウを開く(M)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/174634/a514c6a7-c541-81c0-750e-e703f5436459.png)
変更したい文字を上のフォームに貼り付ける
※縦書きの全角文字の調整は＜3,0＞の方でやります

文字をクリックし、エレメント＞変形（Ctrl+￥）で変形
![image.png](https://qiita-image-store.s3.amazonaws.com/0/174634/7355ce28-9e98-1769-da0e-36122668b5ed.png)
一様に拡大縮小で%を入力

!?！？　85%　半角!は少し右に寄せる
半角数字　90%
っ　98%　ちょっと左下に下げる
ッ　95%
上下の位置を変更したい時はフォントをダブルクリック＞Ctrl+A＞カーソルキーの上下

半角!?と半角数字の幅を460に変更

調整後
![image.png](https://qiita-image-store.s3.amazonaws.com/0/174634/23aeaef8-d077-a7bd-59e7-47b57893411f.png)

とりあえずsfdで保存

#フォント情報の変更
元のフォント名と同じだと区別がつかなくなるのでフォント名を変更する
エレメント＞フォント情報
TTF名を変更

#フォントの書き出し
ファイル＞フォントを出力
名前を指定して「生成」
グリッドのエラーが出るがそのまま

#文字幅の修正
参考：http://itouhiro.hatenablog.com/entry/20140910/font
「FontForgeで生成した日本語TrueTypeフォント文字幅広すぎ対策」

http://rtfreesoft.blogspot.my/search/label/ttx
から「WinTTX-2.4-git-behdad-20140317-11580c55bb.7z」をDL

##ttxファイルを出力・修正
ttx.exeとフォントを同じ場所に置き、
コマンドプロンプトで
＞ttx.exe -t OS/2 ipam_xxx.ttf

ipam_xxx.ttxが出力されるので、xAvgCharWidthを変更前のフォントと同じ数値に修正し、ttxファイル名を変更

```
<xAvgCharWidth value="500"/>
```

##ttxファイルを適用
コマンドプロンプトで
＞ttx.exe -m ipam_xxx.ttf ipam-xxx.ttx
とする
ruby 繰り返し処理 基本操作まとめ

##はじめに
rubyの勉強をはじめたので、
自分の思考の整理、メモとして繰り返し処理に関しての基礎的なことを書きます。

- `terminal`にて`irb`と打つことでコードを試すことができる。`exit`で終了
- 拡張子.rbのファイルにコードを記述して`terminal`にて`ruby ファイル名　`でコードを実行できる。
- `puts` `p`で表示できる。jsで言うところ`console.log()`
- コメントアウトは`#`

関連 [ruby 配列 基本操作まとめ](https://qiita.com/may88seiji/items/ce9396a4c267a3d449ae)

##for
あらかじめ指定したオブジェクトから順に値を取り出しながら繰り返す。

```
for 変数 in オブジェクト do
  実行する処理
end
```

`オブジェクト`の部分には配列、範囲オブジェクト、ハッシュ、などが該当

- コード

```ruby
for num in [1,2,3,4] do
  p num
end
```

```ruby
for num in 1..4 do
  p num
end
```

```ruby
animals = {:dog => "いぬ", :cat => "ねこ"}
for key, value in animals
    puts "KEY:#{key} VALUE:#{value}"
end

# KEY:dog VALUE:いぬ
# KEY:cat VALUE:ねこ
```

##while
指定した条件式が真(true)の間、繰り返す

```
while 条件式 do
  実行する処理
end
```

|結果 |条件  |
|---|---|
|真  |false と nil 以外のオブジェクト全て  |
|偽  |false と nil  |

- コード

```ruby
num = 0
while num <= 12 do
  p num
  num += 5
end

#0
#5
#10
```

##until
指定した条件式が偽(false)の間、ループする。  
「while」文が真(true)の間繰り返しを行うのに対して「until」文は偽(false)の間繰り返す。

```
until 条件式 do
  実行する処理
end
```

```ruby
num = 15
until num <=10 do
  p num
  num -=1
end

#15
#14
#13
#12
#11
```

ここまでRubyの制御構造である繰り返し処理
*for while until ではdo省略可

---

##each

```
オブジェクト.each do |変数|
    実行する処理
end
```

- コード

```ruby
(8..10).each do |num|
  puts num
end

#8
#9
#10
```
*範囲オブジェクトは括弧で囲って記述

##each_with_index
eachではindexがとれないのでindexが欲しい時に使用。


```ruby
["dog","cat"].each_with_index do |item,index|
  p "#{index}. #{item}"
end

#"0. dog"
#"1. cat"
```

##times

```
回数.times do
    繰り返す処理
end
```
- 回数を変数として持つ（0から始まる）

```ruby

3.times do |i|
  puts "#{i}回目"
end

#0回目
#1回目
#2回目
```

##upto
timeメソッドと違って指定した初期値から最大値までを1ずつ増やしながらループ

```ruby
1.upto(3) do |i|
  puts "#{i}回目"
end

#0回目
#1回目
#2回目
```

##downto
指定した初期値から最初値まで数値を1ずつ減らしながらループ

```
初期値.downto(最小値) do |i|
    繰り返す処理
end
```

```ruby
3.downto(1) do |i|
  puts "#{i}"
end

#3
#2
#1
```

##繰り返しの制御

|命令 |条件  |
|---|---|
|break  |繰り返しを中断し、繰り返しの中から抜ける|
|next  |次の繰り返しに処理を移す  |
|redo  |同じ条件で繰り返しをやり直す |

- break
 
```ruby
[1,2,3].each do |num|
  break if num ==2
  p num
end

#1
```

- next

```ruby
[1,2,3,4].each do |num|
  next if num ==2
  p num
end
#1
#3
#4
```

- redo

```ruby
[0,1,2].each do |num|
  num += 1
  p num
  redo if num == 1
end

#1
#2
#2
#3
```

まだまだ色々ありますが、今回はここまで。
CEH受験方法まとめ

[CEH(Certified Ethical Hacker)v9　勉強方法・教材など](https://qiita.com/harapeco_nya/items/e90a8e6b3369b22e467d
)の記事などから、受験方法について質問いただいたため、セルフ受験の方法を書きました。

CEHは受験するまでのやり取りがかなりややこしいので、今後受ける方の参考になれば幸いです。
（CEHに限らず、EC-Councilの資格は同様の手順になるかと思います！）

#受験までの手順
前提として、「トレーニングを受けないで受験する」方法について記載しています（↓下記画像の「Option2」の方法）ので、「トレーニングを受けたい！」という方はお気を付けください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102081/f206e030-ba13-68c5-d5f9-7cc258a6a8a4.png)


##１．フォームから受験依頼する
↓下記URLにて、受験費用の概要と、受験希望フォームへのリンクがあります。
https://cert.eccouncil.org/application-process-eligibility.html#ceh

CEHのボタンをクリック。
概要・受験費用・受験方法などについて確認し、OKであれば
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102081/fdb15e61-b5dc-bf0e-5509-8bcd3feef5a6.png)

「Apply Now」からメールフォームを開き、自身の情報を入力、送信します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102081/bf3bf852-6266-5b2d-c84d-1448547800c7.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/102081/e47ffaa1-c6d1-ab4a-961d-6296fd0d3c64.png)

##２．必要書類を添付しメールを返信する
しばらくするとEC-Councilの担当者から、必要書類を送ってほしい旨のメールが届きます。

###・必要書類１：EC-Council Exam Eligibility Application Form

担当者のメールに添付されているPDFです。必要事項の記入はもちろん、上司の承認が必要になります。

###・必要書類２：英文履歴書と社員証
まわりの方に聞いたら必要だった方と必要なかった方がいるようなんですが、私は要求されましたので書きました！
英文履歴書の書き方とかちんぷんかんぷんでしたので、ググって出てきた書きやすそうなフォームに適当に書きました。
たぶんセキュリティに2年以上関わっていることが証明できればOKかと。

社員証は、いま所属しているかどうかを確認したいのだと思います。PDFでスキャンして送っただけです。

###・必要書類３：支払証明
メールにて指定されたものを下記のサイト（EC-council Store）で購入し、＃で始まるコード番号を送付します。
https://store.eccouncil.org/

時々で買うもの違いそうなので参考程度ですが、私は「CEH VUE Exam Voucher」（600ドル）と「Eligibility Application Fee (Non Refundable)」(100ドル)を買いました。

ちゃんとメールで指定されたものを買ってくださいね！

##３．受験するのみ！
あとはピアソンVUE（https://www.pearsonvue.co.jp/）でEC-Council→CEHと対象を探し、

受けたい日時を予約すれば完了です！

当日、試験会場に「名前が証明できるもの　２点！」をお忘れなく！


#おしまい
質問事項、追加の情報などあればコメントにて教えて頂けると嬉しいです(`･ω･´)ｂ
EC2のubuntu16.04にPython 3.6をインストールしたらImportErrorが出た

# 結論
`python3-distutils`を入れる

```bash
sudo apt install python3-distutils
```

参考：
https://github.com/pypa/pip/issues/5356

# 背景
EC2のubuntu16.04に[python Japan様のガイド](https://www.python.jp/install/ubuntu/index.html)に従ってPython3.6のインストールを試みたところ、`get-pip.py`の実行時にエラーが出た。

```bash
$ sudo python3.6 get-pip.py
Traceback (most recent call last):
  File "get-pip.py", line 20649, in <module>
    main()
  File "get-pip.py", line 197, in main
    bootstrap(tmpdir=tmpdir)
  File "get-pip.py", line 82, in bootstrap
    import pip._internal
  File "/tmp/tmpcvlsw3a6/pip.zip/pip/_internal/__init__.py", line 42, in <module>
  File "/tmp/tmpcvlsw3a6/pip.zip/pip/_internal/cmdoptions.py", line 16, in <module>
  File "/tmp/tmpcvlsw3a6/pip.zip/pip/_internal/index.py", line 25, in <module>
  File "/tmp/tmpcvlsw3a6/pip.zip/pip/_internal/download.py", line 35, in <module>
  File "/tmp/tmpcvlsw3a6/pip.zip/pip/_internal/locations.py", line 10, in <module>
ImportError: cannot import name 'sysconfig'
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
    from apport.fileutils import likely_packaged, get_recent_crashes
  File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
    from apport.report import Report
  File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
    import apport.fileutils
  File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
    from apport.packaging_impl import impl as packaging
  File "/usr/lib/python3/dist-packages/apport/packaging_impl.py", line 23, in <module>
    import apt
  File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module>
    import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'

Original exception was:
Traceback (most recent call last):
  File "get-pip.py", line 20649, in <module>
    main()
  File "get-pip.py", line 197, in main
    bootstrap(tmpdir=tmpdir)
  File "get-pip.py", line 82, in bootstrap
    import pip._internal
  File "/tmp/tmpcvlsw3a6/pip.zip/pip/_internal/__init__.py", line 42, in <module>
  File "/tmp/tmpcvlsw3a6/pip.zip/pip/_internal/cmdoptions.py", line 16, in <module>
  File "/tmp/tmpcvlsw3a6/pip.zip/pip/_internal/index.py", line 25, in <module>
  File "/tmp/tmpcvlsw3a6/pip.zip/pip/_internal/download.py", line 35, in <module>
  File "/tmp/tmpcvlsw3a6/pip.zip/pip/_internal/locations.py", line 10, in <module>
ImportError: cannot import name 'sysconfig'
$
```
Firebase Realtime Databaseのソート(order by)について swift4

#はじめに
RDBに慣れ親しんでいる人にとってFirebase Realtime Databaseは色々な所で詰まると思いますが、その一つがソート（order by）だと思います。

今回はシンプルなチャットAppを想定して下記データ形態とします。
<img width="482" alt="スクリーンショット 2018-05-17 16.44.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/240240/69045f99-c46f-18c8-3123-8de5ff60f266.png">

#昇順（ASC）でソート(order by)する方法

```swift:messageModel.swift
            Database.database().reference().ref.child("messages").child("groupID1")
                .queryOrdered(byChild: "created")
                .observe(.childAdded , with: { snapshot in
                    
                    guard let commentsDict = snapshot.value as? [String: Any] else { return }
                    
                    let sender = commentsDict["sender"] as? String
                    let message = commentsDict["message"] as? String
                    let created = commentsDict["created"] as? Int
                    
                    //　data,Messageというオブジェクトを別で定義していますが、今回その部分は割愛します
                    self.data?.append(Message(sender: sender!, message: message!, created: created!))

                })
```

・`.queryOrdered(byChild: "created")` でcreatedを指定します。
・`observe` の第一引数は **`.childAdded`** です。(ここが `.value` だとソートされません)

#降順（DESC）でソート(order by)する方法

**実はFirebase側で降順ソートするAPIが存在しません。**
その為、少し工夫が必要になります。
messageに「orderCnt」というKeyを作ってInsert時にマイナスに増やします。
そのKeyで上記の昇順ソートをすると結果的に降順になる、という手法です。

<img width="522" alt="スクリーンショット 2018-05-17 17.09.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/240240/821c2d3e-54fc-6502-6336-0a3fec85acf3.png">

#まとめ
個人的に「降順（DESC）でソート出来ない」「queryOrdered byChildはchildAddedでオブサーブしないといけない」でハマったので今回まとめました。
UnityでAndroid apkを生成しようとするとGradleエラーで失敗するときの対処法

UnityでAndroid apkを生成しようとすると下記のようなエラーが出てapkの生成に失敗しました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/150763/e557c7c2-367b-7972-ded8-60f8d09db239.png", width=90%>

## 対処方法
`Failed to find Build Tools revision 28.0.0`と書いてあるので、まずAndroid SDKのバージョンを確認します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/150763/40177ab6-6979-2d5a-e68d-d01974d13929.png", width=90%>

最新バージョンは28-rc2であるため、28.0.0でビルドしようとすると失敗します。そこで、`Plugins/Android/`にgradleファイルを作って、buildToolsVersionを指定します。

1. Unityで`File -> Build Settings -> PlayerSettings`を選択し、`Publish Settings`の`Custom Gradle Template`にチェックを入れます。
2. `Plugins/Android/`の`mainTemplate.gradle`を開いて`buildToolsVersion`を変更します。 


* 例

``` gradle
buildToolsVersion '27'
```

以上です。
JavaScriptでリロードしたときにスクロール位置をリセットしたい

`ボタンを押したら同じURLを再表示する`という処理を書こうとして

```javascript
$btn.on('click', function() {
  location.reload();
});
```
としていたら、同じURLを再表示は出来るのですが、ボタンを押す前に画面をスクロールしていると再表示後もスクロールした状態になってしまいました。
ブラウザリロードしているので当たり前ですが、仕様として不都合だったのでリロードではなくリダイレクトさせるために`location.href`を使います。

```javascript
$btn.on('click', function() {
  location.href = location.href;
});
```

一見すると何やってるのかよく分からないコードになってしまいましたが、これで同じURLにリダイレクトさせてスクロール状態などはリセットされるようになりました。
vimとかいうやつ

vimはテキストエディタらしい。

普段はatomを使っているけど、
git commitをするときにvimが出てきた。

これをatomに変える方法もあるけど、なんかちょいちょいvim出てくるから、最小限だけ覚えることにした。


#超スーパーハイパーウルトラ最小限のvim講座

git commitをすると、なんのコミットをするのかのメモを取るためにデフォルトならvimが出てくる。
それ以外にも普通にテキストエディタとしても使える。

vimの超最小限は、
1. インサートモードにして
2. 文字を打ち込んで
3. 保存して終了する。


vimを全く触ったことがなかった自分は、

あれ、入力できないぞ！！！！なんだこれは！！！！どーうやったら文字が打てるようになるんだ！！！！


こんな心境に陥った。

だが、調べたら疑問は解決した。


「インサートモード」っていうのがあるらしい。
インサートモードにしないと文字は打ち込めない。


インサートモードにするのは「a」を押すだけ。笑

すると、文字が打てるようになる。


文字を打ったら、次にどうやって抜け出せばいいかわからない。

抜け出すのは、インサートモードを解除して、あるコマンドを打てばいい。


インサートモードを抜け出すのは「Esc」、通称エスケープキー
Escを押した後に、保存して終了するためのコマンド「:wq」を打つと完成！


# まとめ
vimに何か売り込んで保存するには、、、

1. 「a」を押してインサートモードにする
2. 文字を打ち込む
3. 「Escキー」を押してインサートモード解除する
4. 「:wq」と打る（保存して終了という意味）


ちなみに、「:q」はただの保存
「:w」これは保存
合わせて「:wq」保存して終了。

もっと頑張りたい方は探せば色々あるので、調べてみてください。
HHKB Professional JPをmacOS High Sierraで使うための簡単な設定方法

OS が High Sierra になっている Mac のラップトップで HHKB Professional JP をすぐ使ってみようとすると、うまく動きません。
いろいろ試行錯誤してみた結果、動かす方法はわりと簡単だったので紹介します。

## 設定の前に
まずはキーボードを JIS 配列として認識させる必要があります。
そのために、まずは[ドライバ](http://www.pfu.fujitsu.com/hhkeyboard/macdownload.html)をインストールしましょう。これが一番大事です。

ドライバをインストールして Mac を再起動させたら、キーボードを繋ぎます。
そうするとキーボード設定アシスタントが起動するので、Mac 自体の物理キーボードを利用してキーボードを JIS 配列として認識させてください。（**HHKB で入力してしまうとうまく認識されません**）

認識が完了したら `@` を入力してみてください。
うまく JIS 配列として認識されていれば `@` が表示されます。
`[` が表示されてしまったら US 配列として認識されています。
この場合は Mac の [システム環境設定] -> [キーボード] -> [キーボードの種類を変更] から再度キーボードを認識させましょう。ただし、キーボードは繋いだままにする必要があるようです。

## かんたんな設定
ドライバを入れてキーボードを JIS 配列として認識させるだけでは、英数かなキーによる変換ができません。

キーボード本体の裏に思いっきり書いてあるのですが、[背面スイッチ](https://www.pfu.fujitsu.com/hhkeyboard/leaflet/hhkb_backview.html)の SW1 を ON にして Macintosh モードに切り替えてください。蓋でぐいっとやればスイッチは切り替えれました。
これだけで英数かなキーの変換が有効になります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/37435/37430749-0ab5-1a21-e90f-c183adb90ac7.jpeg" width="300" />

ただし、スイッチを切り替えただけでは反映されないので、必ずキーボードの USB を抜き差ししてください。

## より高度な設定
背面スイッチでできる変更以外のことをしたい場合は Karabiner-Elements が必要になります。
[このページ](https://pqrs.org/osx/karabiner/)からインストールできます。

ここで注意が必要なのが、Karabiner-Elements は v12.0.0 より Virtual Keyboard の互換性向上のため、Mac 側のキーボード設定を利用することになりました。
悲しいことに HHKB Professional JP は Mac がキーボードをうまく認識しないため、Karabiner-Elements 上では US キーボードとして解釈されてしまいます。
それにより、以下の現象が発生します。

- Karabiner-Elements を起動させると、先程設定した英数かなキーによる変換が無効になる
- Karabiner-Elements 側が認識するキーと印字されているキーが一部異なる

なので、 キーバインドは以下のKarabiner-Elements が認識するキーに対して行えば OK です。

印字されているキー | Karabiner-Elements 側の認識するキー
---|---
無変換キー | international5
変換キー | international4
HHKB マーク | grave_accent_and_tilde (\`)
Fn | なし

たとえば、Karabiner-Elements で英数かなキーの変換を有効にしたいのであればこんな感じになります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/37435/66a3db0f-5c4c-a955-7704-3d14c74e216e.png" width="６00" />

なお、例示しているもの以外でも Karabiner-EventViewer を確認することで、どのキーが Karabiner-Elements ではどう認識されるか分かりますので、必要に応じて確認してみてください。

## Karabiner-ElementsにFnキーを認識させる
ただ Fn キーを ⌘ に割り当てたいときに、Karabiner-Elements 側はまったく認識してくれません。
そこで、背面スイッチの SW2 を利用します。

<img src="https://qiita-image-store.s3.amazonaws.com/0/37435/5238681c-4856-1b82-2901-ba95471d8f68.jpeg" width="300" />

Fn キーを Ctrl に、Ctrl キーを英数にし、それぞれにキーバインドを変更するというやり方です。
Karabiner-Elements の設定はこうします。

<img src="https://qiita-image-store.s3.amazonaws.com/0/37435/ed191865-aecd-4889-f49e-273f8827aa98.png" width="６00" />

これで Ctrl ボタンはそのままに、Fn キーを ⌘ に割り当てることができます。

## まとめ
これらを踏まえて、最終的にはこんな感じになりました。

背面スイッチは SW1/SW2/SW5 を ON に、
<img src="https://qiita-image-store.s3.amazonaws.com/0/37435/bc37303c-ba0d-ab93-0a1f-ec32099c056d.jpeg" width="300" />

Karabiner-Elements は英数字キーの変換を有効にし、Fn キーを ⌘ に割り当てて、HHKB マークは ⌥ に割り当てました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/37435/9d487a45-3f73-ed71-0772-94d8b3c43f05.png" width="６00" />

これで Mac 自体の物理キーボードに近い感じになったかと思います。（バックスラッシュは未対応）
ぜひ参考にしてください。
ManyToManyのフィールドを持つformをsaveしても更新されない

Python 3.5.2
Django 2.0

以下のようなモデルとフォームがある。

```
class Event(models.Model):
    party = models.ManyToManyField(User)

class EventForm(forms.ModelForm):
    class Meta:
        model = Event

```

このフォームでオブジェクトを更新しようとしても結果が保存されない。

```
    if request.method == 'POST':
        event = get_object_or_404(Event, pk=pk)
        form = models.EventForm(request.POST, instance=event)
        if form.is_valid():
            event = form.save(commit=False)
            event.save()
            # なぜかフォームで変更した内容が反映されない

```

save()ではなく、save_m2m()を呼ぶ必要があるらしい。

https://stackoverflow.com/questions/5612991/saving-many-to-many-data-via-a-modelform-in-django

https://docs.djangoproject.com/en/2.0/topics/forms/modelforms/#the-save-method

# 追記

save_m2m()を呼ぶ必要があるのはform.save(commit=False)の時だけです。form.save()で済む場合は、ManyToManyFieldの更新も保存されます。
http://djangoproject.jp/doc/ja/1.0/topics/forms/modelforms.html
ブールインデックス参照とSettingWithCopyWarning

# 概要

pandasにて、データフレームのhoge列の0以下の値を欠損値に置換しようと、
以下のようにコードを書くと、`SettingWithCopyWarning`がでる。
~~この警告は、データフレームのコピーを使っているため、無駄にメモリを使っていますよというふうにお知らせしてくれているもので、処理自体はうまくいっているらしいのだが、赤背景の警告文章が表示されると落ち着かないので、調査してみた。~~  
***訂正***
>エラーの最後に提示されているドキュメントによると、SettingWithCopyWarningはindexingの結果がcopyなのかviewなのかは文脈に依存してしまうpandasの仕様を考慮したもので、メモリ使用量に関する警告ではありません。つまり「とりあえず言われた通りに代入はしたけど、もしかしたらコピーに対して代入してるかもしれないので、オリジナルのDataFrameの値は変わってないかもしれないよ。気をつけてね。」という警告です。したがって参考記事にある以下の記事のメモリ使用量がどうこうという理解は完全に的外れです。

だそうです。
`df[df.hoge < 0, 'hoge'] = np.nan`
↓
`df.loc[df.hoge < 0, 'hoge'] = np.nan`

```python
df.loc[df.hoge < 0, 'hoge'] = np.nan
SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  self.obj[item] = s
```

# 原因
pandas(numpy)の配列に対して、ブールインデックス参照によって抽出されたデータは、**必ず**もとデータのコピーであることが原因となっている。

# 解決策
ブールインデックスを使わずに、値を置換すればいいのではないかと思う。
`df.hogewhere(df.hoge >= 0, np.nan, inplace= True)`を実行してみたところ、やはり警告文が出た。

# 結論
どなたか解決策を教えてください。


## 参考記事
[Pythonの覚え書き（DataFrameのSettingWithCopyWarningの対処方法）](http://hirotaka-hachiya.hatenablog.com/entry/2016/01/04/171349)
[SettingWithCopyWarningメモ](http://d.hatena.ne.jp/yasuhallabo/20171114/1510656601)
[python pandas でSettingWithCopyWarning A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value insteadを出ないようにする
](https://qiita.com/gymnstcs/items/c6e450303393d4afa343)
Firebase MLKitのサンプルを試してみる。

Google I/O 2018 で発表になった、FirebaseのMLKitを試してみようと思います。

Firebase MLKit
https://firebase.google.com/products/ml-kit/
Documentation
https://firebase.google.com/docs/ml-kit/

Firebase MLKitは、今のところ下記の機能があります。

・Text recognition：文章読み取り
・Face detection：顔認識
・Barcode scanning：バーコード読み取り
・Image labeling：画像の認識して、ラベルづけ
・Landmark recognition：ランドマーク認識
・Custom model inference：TensorFlowによるカスタムモデルを利用した認識

これらの機能が、
・無料
・Landmark recognition以外の機能がオフラインでも利用可能
であることが魅力的です。


まずは、公式のサンプルプロジェクトを動かしてみます。
https://github.com/firebase/quickstart-ios

実際に動作させた環境は下記の通り
・macOS X 10.12.6
・Xcode 9.2
・CocoaPods 1.5.2
・検証端末のiPhone 6 (iOS 9.2.1)

上記リポジトリの"mlkit"配下のプロジェクトを利用するために行ったことは下記の通り。

・CocoaPodsで関連ライブラリのインストール
・予め用意したFirebaseプロジェクトのGoogleService-Info.plistの追加
・info.plistのbundle identifierを変更（実機で動作確認するため）
・開発用のProvisioning Profileの適用（実機で動作確認するため）
・今回iOS8.0以降でも利用できるか試したかったので、
Realtime Processing機能のカメラ取得部分に下記の変更を加えました。

```diff:FrameProcessingViewController.swift
func prepareCamera() {
    captureSession.sessionPreset = AVCaptureSession.Preset.medium
+    if #available(iOS 10.0, *) {
        captureDevice = AVCaptureDevice.DiscoverySession(
            deviceTypes: [.builtInWideAngleCamera],
            mediaType: AVMediaType.video, position:
            AVCaptureDevice.Position.back
            ).devices.first
+    } else {
+        // iOS10未満の場合のcaptureDeviceの取得方法を追加
+        captureDevice = AVCaptureDevice.default(for: .video)
+    }
    beginSession()
  }
```
AVCaptureDevice.DiscoverySessionは、iOS10以降で利用できるAPIのため、
iOS10未満の場合はAVCaputureDevice.defaultでカメラを取得します。

AVCaptureDevice.DiscoverySession
https://developer.apple.com/documentation/avfoundation/avcapturedevice.discoverysession
default(for:)
https://developer.apple.com/documentation/avfoundation/avcapturedevice/1386589-default

この状態で実機で試すと以下のgifのような動作になります。

![マイムービー.mp4.gif](https://qiita-image-store.s3.amazonaws.com/0/212023/50bec19b-16f2-8579-a3aa-ac83a680d103.gif)


試した感想は、
・英数字であれば問題なく認識してくれる。
・漢字、ひらがな、カタカナの認識はまだうまくできない。
（Google Cloud Visionの機能使えばもしかしたらうまくいくのかな・・・？）
・MLKitとしてできることが、画像認識だけではなく、音声認識が追加されるか気になる。

以上です。
MLKitを使えば、英数字に限定したOCR機能が実現できそうな気がしています。
Rails + apartment gem + multi-server を試してみた

apartment gem にはテナント毎に接続先 DB を切り替える multi-server 機能があります。
テナントが増えてきたら DB 負荷を分散できるように、本機能を試してみました。

https://github.com/influitive/apartment#tenants-on-different-servers

## 環境

Ruby 2.4.4
Rails 5.1.5
MySQL 5.7

## database.yml にテナント DB 接続設定を追加する

今回は調査が目的なので、メイン DB とテナント DB は同一としました。

```
development_tenant_group_1:
  <<: *default
  pool: 1
  username:
  password:
  host: mysql
  socket: /tmp/mysql.sock
```

## apartment の設定を変更する

README の設定例を見ると、テナント名が固定なら Hash で、動的なら lambda で記述する必要があるようです。
作成しているサービスはユーザーの申込みに応じてテナントが動的に増えていくので、lambda で記述する方式としました。

```ruby
db_config = Rails.configuration.database_configuration["#{Rails.env}_tenant_group_1"]
config.tenant_names = -> { Team.all.each_with_object({}) { |e, hash| hash[e.tenant_name] = db_config } }

config.use_schemas = false
config.with_multi_server_setup = true
```

## Puma から Unicorn に変更

動作確認をしてみると、DB 接続でエラーを吐くようになり正常に動作しませんでした。
Issues を漁ってみると、そもそもスレッドセーフでないため Puma 環境では動作しない、ということがわかりました。
Rails + unicorn に変更して対処しました。

https://github.com/influitive/apartment/issues/413

## Apartment#db_config_for のモンキーパッチを適用

ログを見ていると、`Tenant#switch` の度に `Team` を全件取得する SQL が流れていました。
どうも先程設定した `config.tenant_names` が `switch` の度に実行されている模様。

調査したところ `Apartment#db_config_for` が呼ばれるために lambda が実行されてしまうようなので、モンキーパッチを適用してしのぎました。

```ruby
テナント名から DB 接続情報を取得する箇所をモンキーパッチ
module Apartment
  def self.db_config_for(tenant)
    # TODO: 将来的に tenant 毎に DB を切り替える
    Rails.configuration.database_configuration["#{Rails.env}_tenant_group_1"]
  end
end
```

## その他発生した問題

- Mac 環境で RSpec を流すと途中で DB エラーが発生する (未解決)
  - CircleCI や Docker 上で実行する分には発生しなかった
- パフォーマンスが落ちた
  - ローカルで開発していると時折遅くなる
  - NewRelic 上のレスポンスタイムの数値で 40-60ms -> 100-120ms くらいまで落ちた
    - チューニングして 60-80ms まで回復
Laravelで気持ちよく開発をするための拡張機能のまとめ

# 始めに
今まで`Net Beans`使っていたのですが、メモリの消費量の多さが気になったのと`Blade`の補完が全く効かない事を課題に感じたので`Visual Studio Code`(以下、VSCode)に乗換えています。

基本的に何もなくても使えはするのですが、`Laravel`を使う事が多いので、特化した環境を作ってみました。

# インストールした拡張

## PHP関連

### PHP Debug

言わずと知れたPHPをデバッグする為のツール。実行中の変数の内容が見えたり、ステップ実行が出来るので、**快適に**開発をする上では必須ではないでしょうか。

こちらの設定については、色々な方が情報を挙げているので割愛します。

![PHP Debug.gif](https://qiita-image-store.s3.amazonaws.com/0/154110/d7607750-a559-d11f-2c84-a8b3fca76d7d.gif)


### PHP Intelephense

有名なのは、`php-intellisense`[(参考サイト)](https://marketplace.visualstudio.com/items?itemName=felixfbecker.php-intellisense)ですが、私は`PHP Intelephense`[(参考サイト)](https://marketplace.visualstudio.com/items?itemName=bmewburn.vscode-intelephense-client)を使っています。

こちらの方が候補の精度が高く、表示までのスピードも早いと思います。特にuseを使う時に、vendor配下のクラスもきっちりと候補を出してくれるのがお気に入りポイントです。

![PHP Intelliphense.gif](https://qiita-image-store.s3.amazonaws.com/0/154110/0611f254-12da-f00b-d43f-5a4b7f06e2d2.gif)

#### 2019/4/12追記
この`Intelliphense`ですが、更に進化しています。
纏めた記事は[こちら](https://qiita.com/motuo/items/1600ca1fc4e8dd6a19f2)

## Laravel関連

### Laravel 5 Snippets

こちらは、Laravelで良く使うコードを補完してくれるものです。例では`Route`を使っていますが、他にも`Request`等、多くの種類があります。
前述のコード補完と組み合わせると、効率よく作業が出来ると思います。

![Laravel 5 Snippets.gif](https://qiita-image-store.s3.amazonaws.com/0/154110/f5a20cd9-c545-9049-979d-2905f2e2d517.gif)

### Laravel Artisan

`Laravel`を扱う上では欠かせない`Artisan`を`VSCode`上で使える便利コマンドです。

いちいち、コマンドラインを開かなくてよいのが利点ですね。

![Laravel Artisan.gif](https://qiita-image-store.s3.amazonaws.com/0/154110/be902ae1-33a5-93cf-16c0-0a46380d1aac.gif)


### Laravel Blade Snippets

私が個人的に欲しかった`Blade`の拡張機能となります。
使い方は簡単で、`b:`で始まる文字を打つと、自動で必要なブロックを生成してくれます。

![Laravel Blade Snippets.gif](https://qiita-image-store.s3.amazonaws.com/0/154110/2bf9488b-5b85-83de-40ea-4f862a31f667.gif)


これくらいあれば、それなりに快適に開発が進められると思います。
軽量ながらも、IDE並みの可能性を秘めた、`VSCode`を試してみてはいかがでしょうか？
store.js で 閲覧履歴の管理

閲覧履歴を管理したい。
今回は、javascriptのみで行う。

```

<script src="/js/store/store.everything.min.js"></script>

<script>

    $(function () {

        screen_name = '<?=$res->screen_name;?>';
        img = '<?=$res->profile_image_url_https;?>';


//        履歴情報をすべてリセット
//        store.remove('rireki');

//        履歴情報があるか取得
        rireki = store.get('rireki');


//        現在のページと異なる履歴があればすべて読みだし
        data = [];
        $.each(rireki,
            function(i, v) {

                if(v.name != screen_name){
                    data.push(v);
                }

            }
        );


        show_rireki = "";

//        履歴を逆順にして格納
        tmp_data = data.reverse();
        $.each(tmp_data,
            function(i, v) {
                show_rireki += "<a href='/p/"+v.name+"/'>" + v.name + "</a><br>";
            }
        );



//        履歴を表示
        $("#eturan_rireki").html(show_rireki);


//        最新の履歴を格納
        data.push(
            {
                name: screen_name,
                img: img,
            },
        );

        store.set('rireki',data);



//        クリックで履歴をリセット
        $(document).on('click', '#rireki_reset', function() {

            store.remove('rireki');
            $("#eturan_rireki").html("リセットしました");


        });




    });

</script>


<div id="eturan_rireki">




</div>


<a id="rireki_reset">履歴をリセット</a>




```


また時間ある時まとめます。
Python 3 エンジニア認定基礎試験、合格までの備忘録

[Python 3 エンジニア認定基礎試験](https://www.pythonic-exam.com/exam/basic)に合格しました。
何の勉強をしたかという情報と、「受験慣れしてない方への注意事項」を備忘録として記載します。

#学習期間と時間
3週間(本当は2週間で試験を受ける予定でしたが、理由は後述)。
ただし、1日あたり1時間未満だったので、合計学習時間は20Hくらいです。

#試験学習の方法
１．「Pythonチュートリアル 第3版」
２．「[Python チュートリアル](https://docs.python.jp/3.6/tutorial/)」
３．「[Python3エンジニア認定基礎模擬試験 β版](https://diver.diveintocode.jp/exam#exam-list)」

１は認定テキストの本、２は認定テキストのWebサイトとなります。
試験のことだけを考えれば、２のチュートリアルサイトだけで十分学習できるのでテキスト代がもったいない場合は購入しなくても大丈夫だと思いました。

#受験の際の注意事項(本題)
　私が受験慣れしていないこともあり、受験する上で戸惑ったことが何点かありました。人によってはよい注意喚起になると思いますので記載させて頂きます。

###受験方法
>1.  はじめて受験する方は、Odyssey IDを登録します。
>2.  試験会場を検索して、会場にお申込みください。

1について
受験慣れしていない私は１のodyssey IDの登録と受験申込が同時にできるのかなと思ってしまいました。
ですが、違います。受験に必要な「Odyssey ID」の登録と、**受験の申し込み**は別々になります。

2について
試験会場で事前の受験申込書の記入が必要になります。
受験申込と同時に受験料の支払いが必要になります。

また、試験日は**受験の申し込み日から7日後以降**となっています。
ふらっと行って、ふらっと受験できるわけではありません。

さらに、ゴールデンウィークなどの大型連休の前後は特に気を付けて下さい。
受験の申し込みをしたくても試験会場がお休みの場合があります。

よく言われることですが、試験も計画性をもって臨んだ方がよいと思います。

以上が個人的な注意事項となります。
Amazon Sumerianを使ってAR表示（ARKit）

Amazon Sumerianが一般公開されましたのでチュートリアルを元にAR表示を行ってみました。
チュートリアルの通りにやったのにうまくいったりいかなかったりなので、上手く行った例として書くことにしました。

# シーン作成
AWSサービス一覧の中に既にSumerianがありますので、それを選択すると
以下のような画面に遷移します。
Augmented Realityのテンプレートを選択しシーンを新規作成します。

<img width="1435" alt="スクリーンショット 2018-05-17 14.35.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/214400/af388bf4-3ac5-8c9c-1aa2-12e03a570210.png">

作るとこんな画面に遷移します。

<img width="1438" alt="スクリーンショット 2018-05-17 14.36.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/214400/89191c24-75e3-fb35-15c0-fdee23f337b2.png">

# Droneオブジェクトの追加
画面中央上部のImport Assetsをクリックすると以下のような画面に遷移します。

<img width="1432" alt="スクリーンショット 2018-05-17 14.38.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/214400/8988fad2-b8c8-9286-a48d-897c7a9d9cfc.png">

Droneを選択しインポートします。

<img width="265" alt="スクリーンショット 2018-05-17 15.43.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/214400/3743a0b4-dafc-6274-e459-5f996e3ba32b.png">

私は最初どうにもうまくインポートできなかったのですが
上記のスクリーンショットのようになっていればインポート成功です。

で、drone.fbxのところをドラッグし、上部ペインのARAnchorのところでドロップすると
以下のような画面になります。

<img width="1437" alt="スクリーンショット 2018-05-17 14.59.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/214400/28f11bbe-a9c9-5622-43df-53a7e9ed95e9.png">

# 公開する

<img width="345" alt="スクリーンショット 2018-05-17 15.18.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/214400/7b7815d2-2aea-53be-a39d-cf3a771cf3dd.png">

ここのPublishをクリックします。

<img width="1437" alt="スクリーンショット 2018-05-17 15.19.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/214400/9f8c1c6e-4f99-106e-ed6f-c36c65fb1701.png">

完了するとこんな風になります。

# アプリ側
まずgithubからサンプルをダウンロードします。
https://github.com/aws-samples/amazon-sumerian-arkit-starter-app

プロジェクトを開き、ViewController.swiftの20行目を書き換えます。
Publishの際に発行されたURLを入れるのですが、**末尾に/?arMode=trueを追加してください。**

```swift:ViewController.swift
private let sceneURL = URL(string: "https://us-west-2.sumerian.aws/xxxxxxxxx.scene/?arMode=true")!
```

で実行し、正常に動くとこんな風に表示されます。
最初下ばかり見ていたのでドローン出ないなーと思ってましたが、上に向けると表示されていました。

下にちらっと見えているCubeはSumerianではなくアプリ側のサンプルコードから表示されたものです。
ViewController.swiftの59〜63行目

![IMG_7787.PNG](https://qiita-image-store.s3.amazonaws.com/0/214400/eecfac92-399d-9eb8-78cc-365405d544a8.png)

# エラー等
## Cannot read property 'dependencies' of undefined.
<img width="1437" alt="スクリーンショット 2018-05-17 14.47.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/214400/cd992724-aeed-a1de-2cdb-7590ed6e1d5e.png">

私の場合はSceneをブラウザごと一旦閉じて、開き直したら直りました。

Sumerianすごいっす。アプリ側はframeworkやSDK不要でURLを渡すだけ。
ほとんど全部Webで完結してしまっています。
AR,VR限定ですがUnity不要になるのでしょうか？期待。

# 参考
https://docs.sumerian.amazonaws.com/tutorials/create/intermediate/augmented-reality-using-sumerian-arkit/
Ansible の rhsm_repository モジュールがうまく動かない

Ansibleを使って Red Hat Software Collectionsリポジトリを有効にしようとしたが失敗。
正しいリポジトリID（rhel-server-rhscl-7-rpms）を設定したはずなのに下記のようにすげない応答。

```console
 rhel-server-rhscl-7-rpms is not a valid repository ID
```

モジュールのソースを見るとsubscription-managerコマンドでリポジトリ一覧を取得して、playbookで指定したリポジトリの存在チェックをしているが、subscription-managerの出力結果からリポジトリIDの一覧を抜き出すときの条件が「英語」が前提となっていたため、比較不能に。正しい対処かは不明だが、大元のplaybookでLANG環境変数をCに設定してとりあえず動作することを確認。

```yml
- hosts: web
  roles:
    - reposetup
  environment:
    LANG: C
```
プロセスの実行ディレクトリを確認する

VSCode の、ソースコードフォーマットが実施されないので何やってるのか確認してみたのでメモ

### 対象のプロセス番号を確認する。

今回は clang-format のプロセスを探したかったので format で grep.

```bash
asladagsx@ubuntu:~$ ps -aux | grep format
asladagsx   7363  0.0  0.2  48668  8356 ?        S    14:05   0:00 /usr/bin/clang-format-3.9 -style=file -fallback-style=LLVM -assume-filename=/home/asladagsx/w2/trunk/test/test.cc
asladagsx  21803  0.0  0.0   4696   836 pts/0    S+   16:10   0:00 grep --color=auto format
asladagsx@ubuntu:~$ 
```

プロセス番号が 7363 とわかった。

### プロセスの情報を取得

/proc/プロセス番号/cwd を ```ls -al``` すると実行中プロセスのカレントディレクトリがとれた。

```bash
asladagsx@ubuntu:~$ ls -al /proc/7363/cwd
lrwxrwxrwx 1 asladagsx asladagsx 0  5月 17 16:16 /proc/7363/cwd -> /home/asladagsx/w2/trunk/test
asladagsx@ubuntu:~$ 
```
WordPress のショートコードが動かない場合に確認すること

お問い合わせで、某有料テーマに切り替えたところショートコードが動かなくなってしまったという事例があったので解決法をご紹介します。

# 出力の関数が the_content になっているか確認する

今回の事例では、本文の出力部分がこのようになっていました。

```php:content.php
<div class="entry-content">
	<p>
		<?php
			 if( ! is_single() )
			echo get_home_blog_excerpt();
			 else
			echo get_the_content();
		?>
	</p>
</div>
```

## 解決方法
注目ポイントは、[`get_the_content`](https://developer.wordpress.org/reference/functions/get_the_content/) で、ここを [`the_content`](https://developer.wordpress.org/reference/functions/the_content/) と修正すると解決します。
p タグの修正などもまとめて直した結果はこちらです


```php:content.php
<div class="entry-content">
	<?php
		if( ! is_single() )
			echo '<p>' .get_home_blog_excerpt() .'</p>';
		else
			the_content();
	?>
</div>
```

## 原因
今回の元ソースにある[`get_the_content`](https://developer.wordpress.org/reference/functions/get_the_content/)は、本文を echo せずに取得できるため、たとえばトップページの記事一覧で文字数を制限したい場合などに便利です。

ところが、ショートコードの変換などは、関数[`the_content`](https://developer.wordpress.org/reference/functions/the_content/) 内にあるフィルターで変換されているのです。他にも、プラグインなどがフィルターを利用している場合がありますので、本文で使用する場合は必ずこちらの関数を使いましょう。

`the_content` のソースはこちら。`apply_filters( 'the_content', $content );` という部分でいろいろな変換がされています。

```php:wp-includes/post-template.php
function the_content( $more_link_text = null, $strip_teaser = false) {
    $content = get_the_content( $more_link_text, $strip_teaser );
 
    /**
     * Filters the post content.
     *
     * @since 0.71
     *
     * @param string $content Content of the current post.
     */
    $content = apply_filters( 'the_content', $content );
    $content = str_replace( ']]>', ']]&gt;', $content );
    echo $content;
}
```

## テーマユニットテストで防止しよう

また、自分はテーマ作者だという方、クライアントワークで WordPress テーマを作っているという方は、こういったミスが起こらないように、事前に[テーマテストユニット](https://wpdocs.osdn.jp/%E3%83%86%E3%83%BC%E3%83%9E%E3%83%A6%E3%83%8B%E3%83%83%E3%83%88%E3%83%86%E3%82%B9%E3%83%88)で確認することをオススメします！

the_content
submit時のtokenエラー対応

######index.blade.php
```php
<meta name="csrf-token" content="{{ csrf_token() }}" />
```

######index.vue(template内)
```javascript
<form method="post" action="/next">
<input type="hidden" name="_token" :value="csrf">
```

######index.vue(script内)
```javascript
    export default {
        data() {
                return {
                    csrf: document.querySelector('meta[name="csrf-token"]').getAttribute('content')
                }
        }
    }
```
twigでAngularJSの区切り文字を使う方法

## AngularJSのインターポレーションを使う方法

AngularJSのインターポレーションがtwigテンプレートのdelimiterと被ってしまっているので、その対策方法です。
インターポレーションとかdelimiterとか、スッと入ってこない単語が多いですが、変数値をレンダリングするときに使う区切り文字が同じなので困りましたね、の対策です。

## 記法

twigの場合： 

```example.twig
<span>{{ twig_variable }}</span>
```

AngularJSの場合：

```example.angular.html
<span>{{angularjs_variable}}</span>
```

どちらも中括弧'{}'を2個連続させて画面に表示します。

## 対策①：TwigでAngularJSの区切り文字毎レンダリングする

Twigテンプレートで以下のように記述することで、TwigとAngularJSの両方で同じ区切り文字を使用することができます。

```template.html.twig
<span>{{ '{{angularjs_variable}}' }}
```

出力結果：

```template.html
<span>{{angularjs_variable}}</span>
```

`echo('{{angularjs_variable}}');` と同等なので、これで基本的には問題ないと思います。

## 対策②：AngularJSの区切り文字を変更する

AngularJSの区切り文字を変更してしまう方法です。
モジュール宣言後にconfigを編集できるため比較的容易だと思います。
が、一括で変更できないので、モジュールごとに変更しないといけないと思われます。

変更方法：

```Angular.js
var testApp = angular.module('testApp', []);

testApp.config(function($interpolateProvider){
    $interpolateProvider.startSymbol('//').endSymbol('//');
});
```

```example.angular.html
<span>//angularjs_variable//</span>
```

これで、AngularJSの区切り文字がダブルスラッシュになりました。
例ではダブルスラッシュに変更していますが、`https://`などが合った場合にどういう挙動するかまで検証していないので`{[{`などのほうが良いと思われます。

**ぶっちゃけ対策①がベストアンサーやな、って思ってるんで、詳しく検証しなかったです。**

## 結論

対策①のほうが、余計なことしないのでいいと思いました。
Erlangを用いてアーランの損失式を計算

情報通信の講義の中で出てきたアーランの損失式をプログラムとして作成したくなった時に、友人から「Erlangで作ったら？」と言われたので、Erlangで作りました。

## Erlangとは
自分も今回初めてErlangに触れたのですが、ざっくり紹介してみます。
Erlangは通信会社機器メーカーのエリクソンが開発した、並行処理指向の関数型言語です。
他の言語との違いとしては、変数への代入は一度きりで、その変数の先頭は大文字でなければならないという決まりがあります。(小文字だとatomというものになるらしい)
また、for文やwhile文が存在しないため、繰り返しの処理は再帰を用いらなければなりません。

## アーランの損失式とは
アーランの損失式は、下の式で表します。

```math
B=\frac{\frac{a^s}{s!}}{\sum_{i=0}^{s}\frac{a^i}{i!}}
```
この式は、通信の際の呼損率B(相手が呼び出せない確率)を、単位時間あたりの保留時間である呼量aと通信回線数sから求める式です。

## 階乗
早速作成を始めましょう。
まず階乗を行う関数を作成しました。
Erlangは引数によって場合分けが可能なので、以下のように場合分けと再帰を用いて実装しました。

```erlang:factorial.erl

factorial(0) ->
  1;

factorial(N) ->
  N * factorial(N - 1).
```
## 総和
分母で使用する総和を行うプログラムも、再帰と場合分けを用いてこのように実装しました。

```erlang:sigma.erl
sigma(A,0) ->
  1;

sigma(A,S) ->
  T=power(A,S),
  F=factorial(S),
  (T / F) + sigma(A,S - 1).
```
## 結果
Erlangでアーランの損失式を作成できました。
ソースは[github](https://github.com/amataku/erlang_cost)に上がっています。

## まとめ
Erlangを初めて触りましたが、シンプルで使いやすかったです。
次は、Elixirなんかも触りたいと思ってます。

参考ページ
Erlang - Wikipedia (https://ja.wikipedia.org/wiki/Erlang)
スリムタワーメインメモリの交換,Androidエミュレータを高速化

授業始まる前にAndroidStudioのエミュレーターの高速化が遅かったので隣のスリムタワーからメモリを引っこ抜いて自分が主に使っている方のスリムタワーに引っこ抜いたメモリを付けました。そしたら前、遅かったエミュレーターの速度がこの前よりか早くなって動いたのでスムーズにいきました。

<h1>メインメモリの取り外し方</h1>
1. パソコンケースの側面パネルを開け、写真のように横にします。
パソコンを正面から見て左側側面のパネルを外し、マザーボードが取り付けてある側を机に寝かせるように、パソコン本体を横にします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/c3c95b72-dcc0-8084-7b6b-a132ed981705.png)


2. メモリスロットの位置を確認します。
通常は写真のとおり、CPUファンの横にあります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/29b65083-f786-0c70-e03d-31cc4c32c4d1.png)


3. スロットの両側のレバーを外側へ開くようにして外します。
レバーを外すことで、取り付けられているメモリがスロットから押し出されるようにして外れてきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/e4a6f825-b221-7864-0958-b40d0786ef56.png)



4. スロットからメモリがうまく外せたら、直接メモリを持ち上げます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/b6ffb603-5648-6112-4540-f4c7b9970d6b.png)


※マザーボードの種類により、メモリスロットのレバーが片側に1つだけのものがあります。このようなスロットの場合、レバーを外した際にメモリを押し出すようになっていませんので、下記写真のようにメモリを引き抜くようにして取り外します。(上方向に垂直に引き抜きます)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/0d252a9e-4e55-472a-1cb6-0f1472602202.png)
<h1>メモリの取り付け方</h1>
逆にメモリの付け方なんですけど
1. メモリスロットの両側のレバーを外に開き、メモリをセットします。
下記写真のように、メモリの切り欠きとスロットの切り欠きを合わせるようにしてセットします。

【注意】
切り欠きが合わない場合、メモリの規格がマザーボードと合っていない可能性がございますので、一旦作業を中断し、マザーボードとメモリの規格をご確認ください。 (無理に挿しこもうとすると製品が破損します)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/5795d0d0-6cf4-fd88-a5ed-6c487cf44901.png)


2. 切り欠きが合っている状態を確認したら、メモリを垂直に押し込みます。
垂直に押し込みうまくセットできた場合、「カチ」と音がしてスロット両側のレバーが写真のようにメモリと噛合います。写真のようにセットできたら完了です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249283/08b65d48-7f8a-afcd-4c80-01d9c42ec8e9.png)
[HoloLens]UnityでHoloLens向けアプリ作る際にDLLを追加する方法

##背景
HoloLensのアプリをUnityで開発するにあたってSignalRを使いたい！
ってなったのですがdll追加するのにいろいろ手間取ったので備忘録的なメモ書き
例によって例のごとく間違ってる場所とかあったらコメントください…

普通にDLLを追加するとUnity上では普通に動いてもHoloLensへデプロイできないやんけ！ってなります。
UWPって難しいのね…と頭抱えたWebプログラマーです。

##環境
Unity 2017.2.1p2 personal edition
VisualStudio 2017 professional edition

##やり方
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/243544/91af54ee-cbfd-1b8a-e50a-15f5b7c3c776.png)

こんな具合にAssets下にPluginとその下にWSAというファイルを用意します。(まぁ名前はご自由に)

そして画像では入っていますが追加したいDLLを`Plugin下とWSA下の両方に置きます。`

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/243544/78eed32a-6fd0-44ce-db54-9c98278c756f.png)
そしてこちらはPlugin下のSignalRClientのInspectorViewです。
初期では大体AnyPlatformにチェックがついてると思いますが、`AnyPlatformのチェックを外し、その後WSAPlayerのチェックを外します。`

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/243544/756afb11-3984-85c6-bc04-90840ae700cb.png)
そしてこちらはPlugin/WSA下のSignalRClientのInspectorViewです。
こちらもおそらく初期ではAnyPlatformにチェックがついていると思いますが、`AnyPlatformのチェックを外し、WSAPlayerのみにチェックを付けます。`

##SignalR以外のDLLは？
(正直試してないです。)
newtonsoft.jsonとか入れようかと思いましたが、MRTKに普通に入っていたので…
そもそも上記の方法もMRTKのDLLは動いてるやん！ってところから同様に直しただけです。
まぁMRTKに既にいろんなDLLが入ってるのを考えるとどんなDLLでもこの方法で動くのかなぁとか思っています。
Android Studio

※自分のメモ用に書いています。

環境：windows10 AndroidStudio3.1.2

今回はAndroidStudioの画面部品を使ってみる。
初めにString内の書き換えを行う。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/e999c6d3-8820-80db-2bdb-3d4b5cffcfef.png)
次に先ほどのを使うために構文を追加する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/e449189f-8146-462d-a0e7-5ea49ad9d013.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/512179be-624d-0018-28fd-de998dbd1b90.png)
次にテキストボックスを追加する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/6a76c6f4-0c88-9e84-f597-8f4feca69131.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/b5e720fc-184e-43e2-f287-7b593493dd9c.png)
次にボタンを追加するのでボタンテキストを先に用意する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/5ff7965c-56a3-690b-c186-7860a4f35a86.png)
今度はデザインモードに切り替えて、ボタンをテキストボックスの下に置く。
IDを先ほど追加したnameにして、
縦と横を必要分の大きさに設定する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/baa7c9e9-62d0-446e-2fb8-77a065143234.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/962b1b7d-5ab5-9cd8-d86e-3a88df36f75d.png)
結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/2f8fefee-2170-7b1a-bf2a-c7dd66a824fd.png)
次にチェックボックスを使うためにボックステキストを追加する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/02241878-fca0-11fe-6c00-19267a9058d0.png)
次にチェックボックスをメインの画面のボタンの上に追加する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/b7012c8b-8ee1-ce8a-1724-a7260e1ed46e.png)
結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/65d3ecf4-5262-f406-998e-3127a313f1fd.png)
次にラジオボックスを先ほどと同じように追加する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/b0ed1b9b-1754-6d37-2e9d-8857cd420548.png)
結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/e269bcd7-7273-1ab5-a0c1-df874f4a81ef.png)
次にプッシュダウンを追加するために中のテキストを用意する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/18422438-b6eb-2e31-249a-559fd0932c40.png)
メインのほうのラジオボタンの下にプッシュダウンの追加を行う。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/217d02a2-5336-90f9-2f38-c84c7d1a96b8.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/6d14e586-95c0-7482-1e48-a75c7f848a7d.png)
最後にリストを追加するために先ほどと同じように中のテキストを用意する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/6cc77257-c4a6-b41a-ee37-69bc6a6097cd.png)
メインのボタンの下にリストビューを追加する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/494c8267-2a8b-76fe-45b1-7cd78491ee1a.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/249288/f68b0d75-841d-3b7d-8f18-18a5c3c4d041.png)
MFA制限ユーザからAWS CLIを使う

#MFA制限ユーザからAWS APIへリクエストを送る
まずはMFA制限されているユーザーからS3へのputが出来ないことを確認

```
$ aws s3api put-object --bucket hugahugabuket --key test --body yarn.lock 
An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
```

#トークン取得
```bash:セッショントークンの発行
$ aws sts get-session-token --serial-number arn:aws:iam::{yourAWSAccountNum}:mfa/{yourUserName} --token-code {yourTokenCodeNow}
{
    "Credentials": {
        "SecretAccessKey": "seeeeeeeeecreeeeeeet", 
        "SessionToken": "dummyXdzEHEaDLlHR//cWKN9N6alSyKwAUTtBljrCbQsJAyokX+MmchXOn/FmrDCeRzf+DBWpShOu3WYUdEYBF70ew7DHUrYepLzQZBVcKZwRVpZokPtwu6/xM9S0p67G658auQs1d5K3Nbpqt/+AHX23CGyICXOHeCgjw1fCpkEuqvsdro0Cgx43d+CZ47cT0voIrm3WCZdSZpWyViig4uhw817LUVIEzdDq5KKbO4jTv/uQNGAiBzGVMqrsLnTKrXGxbqebKdtKOa5rc4F", 
        "Expiration": "2017-01-01T00:00:00Z", 
        "AccessKeyId": "keyiddddddddddd"
    }
}
```

```bash:環境変数に設定
$ export AWS_ACCESS_KEY_ID=keyiddddddddddd
$ export AWS_SECRET_ACCESS_KEY=seeeeeeeeecreeeeeeet
$ export AWS_SESSION_TOKEN=dummyXdzEHEaDLlHR//cWKN9N6alSyKwAUTtBljrCbQsJAyokX+MmchXOn/FmrDCeRzf+DBWpShOu3WYUdEYBF70ew7DHUrYepLzQZBVcKZwRVpZokPtwu6/xM9S0p67G658auQs1d5K3Nbpqt/+AHX23CGyICXOHeCgjw1fCpkEuqvsdro0Cgx43d+CZ47cT0voIrm3WCZdSZpWyViig4uhw817LUVIEzdDq5KKbO4jTv/uQNGAiBzGVMqrsLnTKrXGxbqebKdtKOa5rc4F 
```

#MFA制限ユーザからAWS APIへリクエストを送る
```
$ aws s3api put-object --bucket hugahugabuket --key test --body yarn.lock 
{
    "ETag": "\"2c641037fc0f3493es507a3d6wa6957d\""
}

```
成功ー!
async/await 使ってみる

#大雑把にどんなもの?
async/awaitはこんな感じです。

波動拳 → Promise → async/await

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">understanding async/await in 7 seconds <a href="https://t.co/IJOQJ2DR35">pic.twitter.com/IJOQJ2DR35</a></p>&mdash; Wassim Chegham (@manekinekko) <a href="https://twitter.com/manekinekko/status/855824609299636230">2017年4月22日</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

#少し詳しく
1行目: 関数宣言時にasyncをつけてやると準備完了です (ES7の機能なので`yarn add`とかは別途必要です
3行目: Promiseを返す関数(非同期処理)を呼び出す際に先頭にawaitをつけてやると同期的に処理を待つことが出来ます
7行目: async/awaitは途中で処理を抜けることができるので使い勝手がPromiseより高いです

18, 19行目: async/awaitの関数の返り値はPromiseで包まれます。

13行目: Demo関数の中で実行する関数がPromiseのrejectで解決する場合はtry/catchで拾うことが出来ます。

```js
async function Demo() {
  try {
    const registration1 = await navigator.serviceWorker.ready; // awaitをつけると同期的にまつ
    const registration2 = navigator.serviceWorker.ready; // awaitをつけないと非同期的
 
    if (registration1 === null) {
      return 'result1'; // 途中で処理を抜けることができる
    }
 
   // ~~~ なんか処理 ~~~
 
   return 'result2';
  } catch (e) {
    throw new Error(`faile Demo: ${e}`);
  }
}
 
const demoRes = Demo(); // 返り値はPromiseでラップされている
demoRes.then((res) => console.log(res)); // result2      (result2のreturnで解決していた場合
```
centOS7＋Ruby2.5.1の環境でruby on Rails5をいれたよ

フレームワークアレルギーだけど、そうも言ってられないのでRuby on Railsに手を出すことにした。
このために[仮想サーバー](http://...)たてて、[MariaDB](https://qiita.com/nyanyamo/items/02fe96f0a197f8983f03)いれて、[ruby](https://qiita.com/nyanyamo/items/952823ca044859232d82)もいれたので、いよいよ本命のRails5導入。

rbenvいれて、ruby2.5.1を指定した状態からキロク

## 環境
OS：centOS7
DB：MariaDB v10.2.14
ruby：v2.5.1

## 流れを把握、確立出来てなかったので、色々修正

## Ruby on Railsのインストール手順

gemコマンド一覧
[http://guides.rubygems.org/command-reference/](http://guides.rubygems.org/command-reference/)

#### 1.gemアップデート

```cmd:コマンド
$ gem update --system
```

#### 2.Rails最新バージョン確認
マイナーバージョンもチェックしとくよ。

```cmd:コマンド
$ gem search rails

--- 結果 ---
rails (5.2.0)
```
というわけで、v5.2.0いれよっと。

#### 3.railsインストール
```cmd:コマンド
gem install -v 5.2.0 rails
````

#### 4.mysql2インストール
mariaDB使いたいから必要なものをいれる。

```cmd:コマンド
# mysql-develインストール
$ sudo yum install mysql-devel MariaDB-shared

# mysql2のインストール
$ gem install mysql2
```

## 補足：後からDBを切り替えるなら

rails new したときに、特にDB指定しなかった場合はデフォルトのSQLiteが設定される。
作成したアプリの

```cmd:
$ vi config/database.yml 
```

ここらの書き換え。

```cmd:
     12 default: &default
     13   adapter: mysql2
     14   encoding: utf8
     15   pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
     16   username: root
     17   password:
     18   socket: /var/lib/mysql/mysql.sock
```

らしい。
やったことはないけど、いつかやりそうだからメモっとく。

## アプリの作成
DBはMySQLですよオプションつけて。

```cmd:コマンド
$ rails new [アプリ名] -d mysql
```

## 疑問。bundlerをどのタイミングでいれるか

rails new でアプリを作ると、bundlerも一緒に入る。
自動でGemFileも作られるので、必要なものはそこに追記してbundler経由でインストール。

```cmd:コマンド
# gemfileに追加gemを入力
$ vi Gemfile

# インストール
$ bundle install --path vendor/bundle/
```

bundlerって度頭でいれて、何もかもbundler経由でgemは入れるもんだと思ってた。
そういうやり方もあると思うけど、自分なりに納得した流れでキロク。

けど、共同開発したことないからこれが一般的かわからない。
みんなどうしてるんだろ。

逆にrailsもbundler経由で入れるメリットってなんなんだろう。
自動で作られるGemfileにもrails書かれてるよね・・・

うーん?
あれ、なんか迷子。
MySQL上の改行コードを取り除く

## SELECTしにくいデータ

最近こんなデータを目にしました

- クエリ

```
SELECT
  some.`整理番号` 
  , HEX(some.`整理番号`) 
FROM
  tmp.`some_table` some
```

- 結果
    - なんか改行コード(=0x0D)が混じっている

```
整理番号, HEX(some.`整理番号`)
9734601 , 39373334363031200D
9734602 , 39373334363032200D
2747031 , 32373437303331200D
```

## 取り除く

- とりあえず以下で取り除く
- `UNHEX` は16進数で文字を指定できる

```
TRIM( UNHEX('0D') FROM some.`整理番号` )
```

## 環境

MySQL Aurora 5.6.10-log
＜python＞モジュールの場所

#モジュールはどこにある？

モジュールなどをを使いたい時、私たちはこうするだろう。
```import (モジュール名、またはファイル名)```



しかし、pythonはどのようにしてこれを探すのか、つまり、モジュールなどの場所はどこか。

pythonを用いて、以下のようにそれらの場所を探すことができる。
```import sys```
```for place in sys.path:```
``` print(place)```

#結果
これのどれか。カレントディレクトリ→深いディレクトリの順で、pythonは探してくれるようだ
```/Users/Ryusei/Desktop
/Users/Ryusei
/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/bin
/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python36.zip
/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6
/usr/local/Cellar/python3/3.6.4_2/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload
/usr/local/lib/python3.6/site-packages```
Windows コマンドでファイルの文字コード変換

### 目的
   Windows＋Pythonでファイルを処理すると、「Unicodeｘｘｘが認識されない」旨のメッセージで怒られた。ファイルをSakuraで開いてみると、やはりSHIFT-JISですね。いつもの場合、SakuraでUTF-8に変換ー＞保存　すればいいのだが、今回はファイル数が多いので、手作業は勘弁だ。
　Macで使い慣れているiconvでBatで変換しないかとおもったが、Windowsだから、そのコマンドがないよ。

###  ツールの準備

   調べてみると、iconv for windows があるので、それを使おうと思ったら、Git　Bashからも使えると分かったので、その手間もかかることなくですむのだ。Git　for windows をインストールすれば自動的に入るので、それを使うことにした。

### 文字コードを調べる

```shell
   file -i WT.csv
```

```shell
   Non-ISO extended-ASCII text, with CRLF line terminators
```

 Non-ISO extended-ASCII textでなんなんだ。実はSHIIF-JISのこと。
 [ここ](http://note.kurodigi.com/linux-charconv/)に詳しく記述されているとおり。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186671/7cae4a48-cd01-2a75-0eca-68d91141afa9.png)

ただし、「findコマンド」ではなく「file」コマンドのほうが正しい。

### 文字コードを変換する

最後は下記のように変化すればOK

```shell
   iconv -f SHIFT-JIS -t UTF-8 WT.csv  > WT-UTF8.csv
```