OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScriptでエラーが起きた時、別scriptタグに影響があるか調べてみた

JavaScriptはエラーが起きると、エラー箇所以降の行が実行されなくなる性質がある。
scriptタグに書いたJavaScriptコードでエラーが起きた時、
別のscriptタグに書かれたJavaScriptコードに影響があるかどうかを調べてみました。

# 検証環境
* Google Chrome 61
* Firefox 55
* Microsoft Edge 40

# 検証1：直接書いたJavaScriptがエラーになった時、別scriptタグのコードは実行されるか？
scriptタグを分けてJavaScriptコードを書き、エラーを起こした時どんな挙動になるか確認した。

## 検証コード
```test.html
<html>
<body>
<script>
console.log("hoge");
</script>
<script>
// 定義されていない変数を参照する
var aaa = bbb;
console.log("fuga");
</script>
<script>
console.log("piyo");
</script>
</body>
</html>
```

## 実行結果
<img width="484" alt="スクリーンショット 2017-09-18 20.03.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/116289/23a3a08b-82ef-e0fb-d745-d1d5e07f22d2.png">

定義されていない変数を参照したところでエラーが起きている。
エラーの次の行にある console.log("fuga") が実行されていない。
しかし、その後に出てくる別scriptタグ内に記述された console.log("piyo") は実行されている。
このことから、エラー以降の行が実行されない性質は、scriptタグの中に留まることが言えそう。

# 検証2：読み込んだJavaScriptがエラーになった時、別scriptタグで読み込んだ内容は実行されるか？
検証1のコードを外部ファイルに直してみた。

## 検証コード
```test.html
<html>
<body>
<script type="text/javascript" src="./hoge.js"></script>
<script type="text/javascript" src="./fuga.js"></script>
<script type="text/javascript" src="./piyo.js"></script>
</body>
</html>
```

```hoge.js
console.log("hoge");
```

```fuga.js
// 定義されていない変数を参照する
var aaa = bbb;
console.log("fuga");
```

```piyo.js
console.log("piyo");
```

## 実行結果
<img width="465" alt="スクリーンショット 2017-09-18 20.23.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/116289/448b701f-7985-b0ee-237f-164a8ce42381.png">

検証1と同様の結果になった。
エラー以降の行が実行されない性質はエラーが起きたscriptタグだけに留まっている。

# まとめ
scriptタグに書いたJavaScriptコードでエラーが起きても、
別のscriptタグに書かれたJavaScriptコードはちゃんと実行されることが分かった。
このことから全てのJavaScriptのコードを１箇所にまとめず、scriptタグをあえて分ける方法も考えれそう。

例えば、自サイトにアフィリエイトを貼り付けているとしたら...

```html
<script type="text/javascript" src="自サイトのロジックが書かれたjsファイル"></script>
<script type="text/javascript" src="アフィリエイトのjsファイル"></script>
```

といった感じに書けば、自サイトのロジックがバグってエラーを起こしても、アフィリエイトの貼り付けは問題なくできる。

必要に応じてscriptタグを分けるといいのかもしれない。
Macの装飾キー(特殊キーボードキー)とUnicode名称


Macを利用する際にショートカットに使用されている装飾キーが何なのかわからなくなることがあるためチートシートを作成した。
また、Unicodeでの名称についても記載する。

なお、macOSのメニューに表示される装飾キーについては、以下のapple公式サイトにまとめられている。
[Mac のメニューに表示される記号 (macOS Mojave)](https://support.apple.com/ja-jp/guide/mac-help/cpmh0011/10.14/mac/10.14)

|修飾キー|シンボル|コードポイント|Unicode名称
|-------|------|-------|------|
|Command|⌘|U+2318|PLACE OF INTEREST SIGN|
|Shift|⇧|U+21E7|UPWARDS WHITE ARROW|
|Option|⌥|U+2325|OPTION KEY|
|Control|⌃|U+2303|UP ARROWHEAD|
|Enter|⌤|U+2324|UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS|
|Return|↩<br>⏎|U+21A9<br>U+23CE|LEFTWARDS ARROW WITH HOOK<br>RETURN SYMBOL|
|Delete|⌫|U+232B|ERASE TO THE LEFT|
|Forward Delete|⌦|U+2326|ERASE TO THE RIGHT|
|Caps Lock|⇪|U+21EA|UPWARDS WHITE ARROW FROM BAR|
|上矢印|↑|U+2191|UPWARDS ARROW|
|下矢印|↓|U+2193|DOWNWARDS ARROW|
|左矢印|←|U+2190|LEFTWARD ARROW
|右矢印|→|U+2192|RIGHTWARDS ARROW|
|Page Up|⇞|U+21DE|UPWARDS ARROW WITH DOUBLE STROKE|
|Page Down|⇟|U+21DF|DOWNWARDS ARROW WITH DOUBLE STROKE|
|Top (Home)|↖|U+2196|NORTH WEST ARROW|
|End|↘|U+2198|SOUTH EAST ARROW|
|Tab Right|⇥|U+21E5|RIGHTWARDS ARROW TO BAR|
|Tab Left|⇤|U+21E4|LEFTWARDS ARROW TO BAR|
|Esc|⎋|U+238B|BROKEN CIRCLE WITH NORTHWEST ARROW|

# 参考サイト
- [Mac の特殊キー記号の由来](http://penguinlab.jp/blog/post/2035), Online; accessed 23–Sep–2017.
- [キーシンボル（コマンド、オプション、シフトキーなど）の入力方法と、ユニコード](http://wikiwiki.jp/naokitakisaw/?misc%2FMacKeySymbol), Online; accessed 23–Sep–2017.
- [Mac のメニューに表示される記号 (macOS Mojave)](https://support.apple.com/ja-jp/guide/mac-help/cpmh0011/10.14/mac/10.14), Online; accessed 18–Feb–2019.
[baidu echarts] bootstrapのtab-panel中のEchartsが表示されない現象の対策


# 結論

`bootstrap/bootstrap.min.css` ファイル中の
`.tab-content>.tab-pane`と`.tab-content>.active`部分のCSSを
下記のように変更することで表示されるようになった。

```
.tab-content>.tab-pane{display:block;height: 0;overflow-y:hidden}
.tab-content>.active{height:auto;}
```


# 参考になったリンク
https://segmentfault.com/a/1190000004338672
http://aifan.jp/baidu-echarts-bootstrapのtab-panel中のechartsが表示されない現象の対策/
RaspberryPi3でPDOを使えるようにする（メモ）

# なんでこんな記事書いてるん?
・RaspberryPi3にRaspbianを突っ込んでphpでデータベース使って遊ぼうかなとか思ってたら、phpinfoさんに「pdoないやで」とか言われてしまった。
・前にも似たようなことに遭遇して解決したのに、やり方を忘れた。
・もう忘れんぞ! と言うことでメモる。

# 環境
・ハードウェア
　RaspberryPi3。いい遊び道具。だと思ってます。

・OS
　Raspbianのデスクトップの方。バージョンは8でした。

・サーバ
　Apache2.4.10

・PHPのバージョン
　5.6.3

# 方法
## やってたこと
・アップデートしてアップグレードして、php5とMariaDB入れてました。

```:使ったコマンド
sudo apt update
sudo apt -y upgrade
sudo apt -y install php5
sudo apt -y install mariadb-server
```

## やったこと
・これで解決しました。2つ目はApacheリロードするときに使いました。

```:使ったコマンド
sudo apt -y install php5-mysql
sudo systemctl daemon-reload
```

# 感想
　コマンド一発で解決できるって楽でいいですよね。
Qiitaで多いタグを１年前と最近とで比較してみた

# 概要
Qiitaの投稿に付与されたタグを集計し、１年前と比較して、最近増えたタグを確認してみた。
具体的には、1年前と直近の1ヶ月分（8月22日~9月22日）の投稿を全て取得し、それらに付与されているタグを集計した。
このような内容を集計すれば、最近の実際に手を動かしてみるレベルのトレンドが分かるような気がする。

## 環境
- Qiita APIv2
- PHP

# 手順
- 1年前と直近の1ヶ月分の投稿を全て取得する（PHP、以下にサンプルコード）
- それらに付与されたタグを全て抽出する（PHP）
- 1年前と直近とで、タグ数を集計する（Excel）

## サンプルコード（抜粋）

-  `query` で期間を指定する。
-  `page` で100件ごとの投稿が取れるので、ここはプログラムの中で変数で増やしていく必要がある（今年の8月22日~9月22日であれば、6500前後の投稿があったので、1~65前後指定して繰り返す必要がある）

```php:test.php
$curl = curl_init("http://qiita.com/api/v2/items");
$json = [
      "page" => 1,
      "per_page" => "100",
      "query" => "created:>2016-08-22 created:<2016-09-22"
 ];
$option = [
    CURLOPT_CUSTOMREQUEST => 'GET',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POSTFIELDS => json_encode($json),
    CURLOPT_HTTPHEADER => [
      'Authorization: Bearer xxxxxxxx', //アクセストークン
      'Content-Type: application/json',
    ],
];
curl_setopt_array($curl, $option);
$result = curl_exec($curl);
$json_result = json_decode($result, true);
curl_close($curl);
```

# 結果
## 1年前多かったタグ数ベスト10

![１年前.png](https://qiita-image-store.s3.amazonaws.com/0/50690/093820d1-44ac-29e7-fba8-1e1d7f4b32c6.png)


## 直近で多かったタグ数ベスト10
![直近.png](https://qiita-image-store.s3.amazonaws.com/0/50690/9455ecdd-4df4-68d5-649d-05f1f2e7aec5.png)

1年前と比較すると、

- Python3
- docker

が入ってきている。あと、全体的な投稿数自体も増えているみたい。
やはり全体としてWeb系のプログラミングが多い印象。

## １年前との比較で増えた数の多いタグ数ベスト10

![比較.png](https://qiita-image-store.s3.amazonaws.com/0/50690/1ca10f26-021c-919b-b842-5ff1aeec58db.png)

直近のタグ数-1年前のタグ数を算出し、多い順にベスト10を並べたみた（したがって、絶対数が少なくても、比較して数が多いタグが含まれる）。
やはりPython3系が多くなっていることと、機械学習、kotlin、DeppLearning、Blockchain等、最近HOTっぽいキーワードの投稿は増えたようである(自分はスマホプログラミングは特に疎いので、kotlinに関しては全く知らなかったけど)。
というわけで、時々比較してみると、最近のトレンドが反映されていて、面白い気がする。
gphoto2でCanon Powershot G7Xを操作でき、ない。


PCからカメラを操作できるgphoto2。手持ちのCanon kiss x7, x7iの動作は確認していたんだけど、そういえばG7Xもあったのでこいつを操作できないか試してみた。

###G7X↓(Mark2ではありません)
<img src="https://qiita-image-store.s3.amazonaws.com/0/199149/6e5c7f7a-6f61-960b-423a-4eca257ec921.jpeg" width=50%>


##■結果
`gphoto2 --summary`にて情報取得。

```
MacBook-Pro:~ Clses$ gphoto2 --summary

Camera summary:                                                                
Manufacturer: Canon Inc.
Model: Canon PowerShot G7 X
  Version: 1-14.0.1.0
  Serial Number: 
Vendor Extension ID: 0xb (1.0)

Capture Formats: JPEG
Display Formats: Association/Directory, Script, DPOF, MS Wave, JPEG, Defined Type, Unknown(b103), Unknown(b982), Unknown(b105), Unknown(bf01)

Device Capabilities:
	File Download, File Deletion, File Upload
	No Image Capture, No Open Capture, Canon EOS Capture 2

Storage Devices Summary:
store_00010001:
	StorageDescription: SD
	VolumeLabel: None
	Storage Type: Removable RAM (memory card)
	Filesystemtype: Digital Camera Layout (DCIM)
	Access Capability: Read-Write
	Maximum Capability: 31474089984 (30016 MB)
	Free Space (Bytes): 18613665792 (17751 MB)
	Free Space (Images): -1

Device Property Summary:
Event Emulate Mode(0xd045):(readwrite) (type=0x4) Enumeration [1,2,3,4,5,6,7] value: 2
Property 0xd04a:(readwrite) (type=0x2) Enumeration [0,1,2,3] value: 0
Size of Output Data from Camera(0xd02e):(read only) (type=0x6) 524288
Size of Input Data to Camera(0xd02f):(read only) (type=0x6) 524288
Battery Level(0x5001):(read only) (type=0x2) Enumeration [0,1,2,3] value: 3% (3)
Battery Type(0xd002):(read only) (type=0x4) Enumeration [0,1,2,3,4,5] value: Unknown (0)
Battery Mode(0xd003):(read only) (type=0x6) Enumeration [0,1,2,3] value: Normal (1)
UNIX Time(0xd034):(readwrite) (type=0x6) 1506204149
Type of Slideshow(0xd047):(read only) (type=0x4) 0
DPOF Version(0xd046):(read only) (type=0x4) 257
Remote API Version(0xd030):(read only) (type=0x6) 256
Model ID(0xd049):(read only) (type=0x6) 58195968
Camera Model(0xd032):(read only) (type=0xffff) 'Canon PowerShot G7 X'
Camera Owner(0xd033):(readwrite) (type=0x4002) a[0] 
Firmware Version(0xd031):(read only) (type=0x6) 16777216
Property 0xd050:(read only) (type=0x2) 0
Property 0xd051:(read only) (type=0x0) Undefined
Property 0xd052:(read only) (type=0x2) 0
Property 0xd053:(readwrite) (type=0x4002) a[0] 
Property 0xd054:(readwrite) (type=0x4002) a[0] 
Property 0xd402:(read only) (type=0xffff) 'Canon PowerShot G7 X'
Property 0xd406:(readwrite) (type=0xffff) 'Windows'
Property 0xd407:(read only) (type=0x6) 1
Property 0xd303:(read only) (type=0x2) 1
Property 0xd055:(readwrite) (type=0x2) 0
Property 0xd056:(readwrite) (type=0x2) 0
Property 0xd106:(readwrite) (type=0x2) 0
Property 0xd1b0:(readwrite) (type=0x2) 0
Property 0xd111:(read only) (type=0x0) Undefined
Property 0xd112:(read only) (type=0x0) Undefined
```


カメラ自体の認識はしていて、ちゃんとG7Xとも出てきているけれど、
`Device Capabilities`のところで、
`No Image Capture`となっているので、撮影操作はできない模様。
確かにUSBに繋いだら勝手に再生モードになってしまうし駄目っぽい。
こいつが操作できれば、そこそこコンパクトに行けるかと思ったんだけどね。
おとなしくKissで試すことにしようか。

 **(誰かGoProとかでgptoho2の動作確認している人いないかな・・・)**
ImageSharp 基本操作

サーバーサイドで System.Drawingを使ってはダメ、らしいのでいろいろ調査した結果、SixLabors/ImageSharp とやらがよさげ、らしい。

サーバーサイドで System.Drawingを使ってはダメ
http://qiita.com/kazuk/items/9758b90b2a480454215a

SixLabors/ImageSharp
https://github.com/SixLabors/ImageSharp

## インストール

nugetで"SixLabors.ImageSharp"インストールする。現在のバージョンは1.0.0-beta0001なので、パッケージマネジャー画面では「プレリリースを含める」にチェックを入れないと表示されない。

## 基本操作

`using SixLabors.ImageSharp;` を追加しないと拡張メソッドが使えない。

### 画像のサイズを計測する

```csharp
using SixLabors.ImageSharp;
using (Image<Rgba32> image = Image.Load("c:/var/file/sample.jpg"))
{
   var height = image.Height;
   var width  = image.Width;
}
```

### 画像を縮小する

サムネイル画像作成とか。
サンプルは バイト配列に結果を入れるけども Saveメソッドにファイル名を設定すれば直接ファイルに保存できる。

```
using SixLabors.ImageSharp;
byte[] content;
using (Image<Rgba32> image = Image.Load("c:/var/file/sample.jpg"))
{
    // 画像の操作をMutateメソッドで行う
    image.Mutate(x =>
    {
        x.Resize(image.Width / 4, image.Height / 4)
        ;
    });
    using (var stream = new MemoryStream())
    {
        var encoder = new SixLabors.ImageSharp.Formats.Jpeg.JpegEncoder();
        image.Save(stream, encoder);
        content = stream.GetBuffer();
    }
    // 結果画像を保存
}
```

## 他

SixLaborsのgithubに ImageSharp.Web ってのがあるけどよくわからん。
UnityビルドiOS・Android強制アップデート　テスト　　メモ

## iOS

　・UnityからBundle Identifier とBuild　を指定
　例）Bundle Identifier=0.0.0
     Build=1

　１．ビルドしてXcodeプロジェクトを吐き出す
　２．Xcodeを開く
　３．Product->Archiveよりアーカイブ出力を行う。

　　注意点：
　　　Distributionのプロビジョニングプロファイルが必要
　　　iTunesConnectのAppleIDをPreferenceに登録しておいて、
　　　Upload時に選択できるようにしておく

　４．出力完了後、Organizerが開くので、「Upload To App Store」をクリック

　５．iTunesConnectよりマイAppの指定アプリに遷移して、
　　　指定バージョンアプリが上がっていることを確認

　■iTunesのTestFlight設定に関しては下記URLなどを参照の事
　　https://qiita.com/Raugh/items/9e803fbb03391cf1b388


　６．しばらく立つとアプリiTunesConnectユーザーの欄が準備中から「輸出~・・・・」に代わるので
　　　クリックして、「いいえ」を押す。

　７．テスト中になる。
　８．左欄のiTunesConnectユーザを選んでテスターに自分を登録しておく

　ここからはiPhone側操作
　９．TestFlightアプリをインストールテスターに登録したAppleIDでログインする。
　
　この辺からちょっとあやふや
　１０．招待メールが自分のメールアドレスに届くのそれを見る
　１１．TestFlightかメールのリンクからコードが表示されるページにとぶ
　１２．TestFlightを立ち上げRedeemをクリックしてコードを入力する
　１３.アプリがダウンロードできるようになる。
【viの使い方】これさえ覚えておけばなんとかなるviのコマンド【初心者必見】

先日、初めてviを起動する後輩が右往左往:sweat_drops:していたので、教えてあげました。
これさえ覚えておけば、とりあえずviが使えます:bangbang:

# 文字を入力する
|コマンド|動作|
|:---|:---|
|i|入力モードにする。|
|ESC|入力モードから抜ける。|
入力したい部分まで頑張ってカーソルで移動したら、「i」キーを叩いて入力モードに切り替えます。
入力が終わったら、「ESC」キーを叩いて、入力モードを解除します。
どうしていいかわからなくなったら、とりあえず「ESC」キーを叩いて先輩に助けを求めましょう:hatched_chick:

# viを終了する
|コマンド|動作|
|:---|:---|
|:q!|保存**せず**に閉じる。|
|:q|閉じる。|
|:wq|保存**して**閉じる。|
|:w|保存だけする。|
もしも、「うわぁ:sweat_drops:これどうやって戻せばいいかわからない:scream:」ってなったら、迷わず「:q!」を叩きましょう。
「！」をつけなくてもviは終了しますが、「！」を付けることで保存せずに終了するため、間違って入力した文字はなかったことになります。
無事に入力出来たら、「:wq」で保存してから終了しましょう。qを付けない「:w」だと、保存だけ出来ます。
最終行のunexpected end of fileでハマった(ショートタグの置換時の注意)

乱文申し訳ない
新卒でカバーも少ない中PHP4.3→7.1の移行プロジェクトをやっていて発生したトラブル

前提条件としてショートタグを使用した場合<?xml version="1.0" encoding="UTF-8"?>
絡みのトラブルに遭遇したのか（確証がない）ソースがある地点からすべてテキストで書き出されていた
そのためショートタグを廃止し<?php に置換したのだが、
その後　最終行のunexpected end of fileエラーでソース頭のprintも受け付けない状態が発生した

原因は置換が「<?」　→　「<?php」　となっていたのが原因（無論既に<?phpになってる部分と<?=は考慮する）で
<?phpif(foo)後略
みたいな行が悪さをしていた
（なお<?if　は動くらしい）　

対処法は「<?」　→　「<?php 」（スペース入れる）

なお見つけたのは藁をも掴むで導入したNetBeansIDE先生という
やっぱvimだけじゃきついっすね…（頭抱え）
自動で(大量の)壁紙を切り替えたい on Mac

## はじめに
なんやかんやあって大量の壁紙画像があり、気分にあわせて切り替えられる量をはるかに越え、"デスクトップとスクリーンセーバー"から画像フォルダを選択すると落ちる、Finderもサムネイル生成で固まる、そういった自分向けの記事です。本記事執筆時点で31000枚の画像が壁紙フォルダにある。

## 落とさないための戦略
Finder関係で死ぬのは要はファイルがいっぱいあるからです。分けましょう。
ハッシュ値と、その先頭数桁を使ったサブフォルダに割り振る、みたいなのがいいと思います。
Zshだと以下みたいにやるとできます。

```zsh
BGROOT=/path/to/new/wallpapers/
function mmd5 (){
    pic="$1"
    #ext=$(identify -format "%m" "$pic""[0]" | tr "[A-Z]" "[a-z]")
    ext=${pic##*.}
    md5sum=$(md5 -q "$pic")t
    target=$BGROOT/$(echo $md5sum | head -c 2| sed -e 's/./&\//')/$md5sum"."$ext
    mv "$pic" $target
}
zargs -l -- /path/to/wallpapers/**/*(.) -- mmd5
```

## 自動で壁紙を切り替える
サブフォルダに分けてしまうと、"デスクトップとスクリーンセーバー"から最早制御できないので、直接コマンドを叩いて切り替える。AppleScriptでFinderの`desktop picture`にパスを与えればいい。切り替え時のフェードイン・フェードアウトができなくなるが、致し方ない。毎回素直に全ファイルランダムにソートするとそれだけで重いので、手を抜いている。昔はMac起動時に全ファイルをランダムに並べたものをOSX標準のmemcachedに載せておいて取得するようなものを書いていたが、いつからかmemcachedがプリインストールされなくなったのでやめた。一時ファイルをつくりたくないという縛りをしていたので、一時ファイルやsqliteのデータベースなどあればもっと楽にできるであろう。

```zsh
BGROOT=$HOME/Pictures/wallpaper

BGDGT=$BGROOT/$(printf "%04x" $(jot -r 1 0 255) | perl -pe 's/.*(.)(.)$/$1\/$2/')
NOFBG=$(ls $BGDGT | wc -l)

find $BGDGT | tail -n $(jot -r 1 1 $NOFBG) | head -n 1 \
  | xargs -I{} osascript -e "tell application \"Finder\" to set desktop picture to (POSIX file \"{}\" as alias)"
```

上記スクリプトを適当に纏めて、LaunchAgentに食わせればOK。以下のようなplistで30秒ごとに切り替わる。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>com.example.desktop.changerr</string>
	<key>OnDemand</key>
	<true/>
	<key>Program</key>
    <string>/path/to/script</string>
	<key>RunAtLoad</key>
	<true/>
	<key>StartInterval</key>
    <integer>30</integer>
</dict>
</plist>
```

## 壁紙の参照
以下のスクリプトでPreview.appに出る。手違いで入ってしまった画像に気付いたらこれで呼び出せばフルパスがわかるので削除できる。PreviewがLionぐらいからファイルを1枚しか開いてないときに削除ができなくなったのは改悪だと思う。

```applescript
tell application "Finder"
	set randomImage to desktop picture as alias
end tell

tell application "Preview"
	launch
	open randomImage
end tell
```

## メモリリークについて
長時間前述の自動切り替えplistを回していると、Dock.appの使用メモリが徐々に増えていく(ことがある)。どうも無圧縮TIFFのあつかいが正しくないらしく、気がつくとメモリ圧縮前で8GBとかまで食っていることがある。JPGにすると解決する、との報告もあるが、JPGやPNGばっかりでも起きるように思う。この場合、Dockをkillして対応する。数回に一回`killall Dock`をするようスクリプトに書いてもよさそう。
GNU Arm Embedded Toolchainとシステムコールの実装について

# GNU Arm Embedded Toolchainとnewlibとシステムコール

ARMでのCortex-M用のフリーなコンパイラとしては、GNU Arm Embedded Toolchainがよく使われています。

https://developer.arm.com/open-source/gnu-toolchain/gnu-rm

GNU Arm Embedded ToolchainはOSのない、bare　metal環境に標準対応しています。OSがない場合、通常はOSが用意している標準Cライブラリ(libc)もないため、自前で用意する必要があります。

GNU Arm Embedded Toolchainでは、組込み環境向けの標準Cライブラリであるnewlib(+libgloss)が同梱されています。

https://sourceware.org/newlib/

このnewlibの特徴的なところに、システムコールの詳細を実装していない点があります。具体的に言うと、例えばメモリを確保するC標準関数である`malloc()`関数自体は実装されているのですが、この関数は空きメモリの中から使いたいメモリの確保を行うシステムコール`_sbrk()`を内部で呼んでいます。この`_sbrk()`の方が実装されていないのです。そのため、素朴にビルドするとリンク時にエラーになるので、別途`_sbrk()`などのシステムコール実装を用意する必要があります。

# システムコールを使えるようにする

システムコールを使えるようにするには３つの方法があります。

1. 自前で実装する
2. libnosysを使う
3. rdimonを使う（semihosting環境を使う）

以下、それぞれ見ていきます。

## 1. 自前で実装する

普通に実装すれば、個別の環境に応じた形で対応できます。ひたすら頑張る方式です。
が、そこまでしなくても対応するための選択肢が他にもあります。

## 2. libnosysを使う

最低限のものでよければ、libnosysを使うという方法があります。
libnosysはnewlibに同梱されているもので、その実体は以下にあります。

https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;a=tree;f=libgloss/libnosys;hb=HEAD

これを見て分かる通り、だいたいの関数はerrnoにENOSYSを設定して-1を返すだけの、とりあえずリンカのエラーを出さないようにするだけのものです。まともに使えるようになるわけではありません。とはいえ`_sbrk()`だけは（ないと困るからだと思いますが）まともに使えるようにちゃんと実装してあります。もっとも、これもヒープの大きさのチェックなどはなく、溢れたら突き抜けるだけの簡易な実装です。

使い方は、以下のようにgccのオプションに`--specs=nosys.specs`を追加します（※注 `-lnosys`を追加する必要があるか要確認）

```shell-session
$ arm-none-eabi-gcc --specs=nosys.specs $(OTHER_LINK_OPTIONS)
```

## 3. rdimonを使う（semihosting環境を使う）

もうちょっと特殊なケースとして、Semihosting環境を使う例があります。

Semihosting環境とは、ターゲット環境とホスト環境とがつながっている状態で、一部の機能をターゲット側とホスト側の両方で分担して実行するものです。

> セミホスティングとは、ARMターゲット上で実行されているコードで、デバッガを実行しているホストコンピュータの入出力機能と通信し、これを使用することを可能にするメカニズムです。
> これにより、ホストコンピュータのキーボード入力、画面出力、ディスクI/Oなどを使用できます。例えば、このメカニズムを使用すると、`printf()` や `scanf()` などの Cライブラリ関数で、ターゲットシステム上の画面とキーボードではなく、ホストの画面とキーボードを使用することができます。
>
> (「ARM® コンパイラ ソフトウェア開発ガイド　v5.6 　7.1 セミホスティングとは」http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0471c/Bgbjjgij.html より)

こうすると、ホスト・ターゲット間の通信さえできれば、細かい機能はホスト側でよろしくやってくれるので、ターゲット側の実装を頑張らなくて済むようになります。

このようなSemihosting環境の実現のために、rdimon.specsというものがあります。rdimonというのは、どうもRDI(Remote Debug Interface) MONitorの略のようです。
このシステムコールの実体は以下にあります。

https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;a=blob;f=libgloss/arm/syscalls.c;hb=HEAD

これを使うには、以下のようにgccのオプションに`--specs=rdimon.specs`を追加します。

```shell-session
$ arm-none-eabi-gcc --specs=rdimon.specs $(OTHER_LINK_OPTIONS)
```

## 参考

* https://launchpadlibrarian.net/287100883/readme.txt
* http://ww1.microchip.com/downloads/en/DeviceDoc/Frequently-Asked-Questions-4.9.3.26.txt
* http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0471c/Bgbjjgij.html
* http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0471c/Bgbjjgij.html
* http://www.embecosm.com/appnotes/ean9/ean9-howto-newlib-1.0.html
* https://community.nxp.com/thread/389156
* http://www.openstm32.org/Other+Manuals
Firebase tips(Database rule .3)

#FIREBASE TIPS

## Validate If Specific Object exists.
```json:database.rule.json
{
  "rules": {
    ".read": false,
    ".write": false,
    "coffeeandcode-japan":{
      "user": {
        ".read": true,
        ".write": true
      },
      "room" :{
        ".write": "root.child('coffeeandcode-japan/user/' + auth.uid).exists()"
      }
    }
  }
}
```

`database`
![database.png](https://qiita-image-store.s3.amazonaws.com/0/199460/9b494353-1677-bf4a-a4c3-51e9c49b4f1b.png)

- TEST1: A member who has no user info tries to make a room object.

```js
    firebase.auth().signInWithEmailAndPassword('coffeeandcode.tokyo2@gmail.com', 'coffee').catch((error) => {
        console.log('code:' + error.code + ' message:' + error.message);
    });
    firebase.auth().onAuthStateChanged((user) => {
        if (user) {
            console.log('login success');
            database.ref('coffeeandcode-japan/room/' + 'testroom1').set(
                {
                    room_name: 'coffee'
                }
            ).catch((error) => {
                console.log('code:' + error.code + ' message:' + error.message);
            });
        } else { }

    });
```

`result`
![result1.png](https://qiita-image-store.s3.amazonaws.com/0/199460/232e0871-2098-955e-b006-72e5594b2b62.png)



- TEST2: A member who has a user info in "user" object tries to make a room object.

```js
    firebase.auth().signInWithEmailAndPassword('coffeeandcode.tokyo@gmail.com', 'coffee').catch((error) => {
        console.log('code:' + error.code + ' message:' + error.message);
    });
    firebase.auth().onAuthStateChanged((user) => {
        if (user) {
            console.log('login success');
            database.ref('coffeeandcode-japan/room/' + 'testroom1').set(
                {
                    room_name: 'coffee'
                }
            ).catch((error) => {
                console.log('code:' + error.code + ' message:' + error.message);
            });
        } else { }

    });
```

`result1`

![result2.png](https://qiita-image-store.s3.amazonaws.com/0/199460/67fb66be-7f41-1c4a-3968-b56149fb3afa.png)

`result2`

![result3.png](https://qiita-image-store.s3.amazonaws.com/0/199460/56dea4cc-6954-4073-e789-1b6155bc5cd9.png)
Android 標準 Button の余白をデフォルト値以下に変更してみた件

# 通常サイズの [Button](https://developer.android.com/reference/android/widget/Button.html)

``` xml
<android.support.v7.widget.AppCompatButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="ボタン" />
```

![Screenshot_1506103524.png](https://qiita-image-store.s3.amazonaws.com/0/6881/9f8d3930-8ef7-3a97-d23f-6260181eb21b.png)

# 上下左右の余白をデフォルトより小さくしたい

`android:padding="0dp"` を設定してみましたが、変化はありませんでした :no_good:

``` xml
<android.support.v7.widget.AppCompatButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:padding="0dp"
    android:text="ボタン" />
```

![Screenshot_1506103524.png](https://qiita-image-store.s3.amazonaws.com/0/6881/9f8d3930-8ef7-3a97-d23f-6260181eb21b.png)

# 調査してみたところ :mag:

Stack Overflow に[回答](https://stackoverflow.com/a/24993216)がありました。
`android:minHeight="0dp"` & `android:minWidth="0dp"` を設定すると、上下左右の余白を無くすことができました :ok_woman:

``` xml
<android.support.v7.widget.AppCompatButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:minHeight="0dp"
    android:minWidth="0dp"
    android:text="ボタン" />
```

![Screenshot_1506163868.png](https://qiita-image-store.s3.amazonaws.com/0/6881/6515ad78-e9b0-668c-7854-9d6af5d725de.png)


## 更に `padding="8dp"` を設定してみると

パディング未指定時より小さくなりました。

``` xml
<android.support.v7.widget.AppCompatButton
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"
    android:minHeight="0dp"
    android:minWidth="0dp"
    android:padding="8dp"
    android:text="ボタン" />
```

![Screenshot_1506106103.png](https://qiita-image-store.s3.amazonaws.com/0/6881/7555f21c-0bfe-e6a8-37f8-d01921035468.png)

## 続けて `padding="0dp"` にすると

小さくなり過ぎました。

``` xml
<android.support.v7.widget.AppCompatButton
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"
    android:minHeight="0dp"
    android:minWidth="0dp"
    android:padding="0dp"
    android:text="ボタン" />
```

![Screenshot_1506105383.png](https://qiita-image-store.s3.amazonaws.com/0/6881/c30b47a3-ff9d-865a-d060-9fe96f6f7f1b.png)
Zabbix3.0：ダッシュボードで特定のホストグループのみを表示

# 問題点

多くのホストグループがある場合、ダッシュボード１画面では表示しきれない。
例えば、４７都道府県のグループがあった場合、４７行のホストステータス(システムステータス)が表示されるため、ぱっと見ただけでは全体把握が出来ない。
マウススクロールが必要になる。

例えば(以下画面)、４７都道府県分ずらずら表示され、全体が見渡せない。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/82244/9d4abb24-6981-546a-2e66-fa140835da97.png)

解決方法としては以下が想定できるが難しい。

+ 本来はホストグループを減らす対応が必要になるが、どうしてもホストグループを減らせない場合がある(例:イベント一覧等で細分化したホストグループを利用したい等の理由で)。
+ Zabbix3.2以上の「ホストグループの分割」機能で違ったアプローチできるかもしれないが、そもそもZabbix3.0には分割機能がないので対応できない。

# 対応策

ホストグループ都道府県に、「地方」(東北、関東、関西等)の情報を与え、ダッシュボード上では「地方」情報のみを表示するようにする。

# 対応策詳細

+ ホストグループ名に、大分類(「地方」)と小分類(「都道府県」)の２つの情報を埋め込む。
+ ホストグループ名に、大分類と小分類との２つの情報のセパレート文字を定義する(ここでは”＝”(イコール))
+ 大分類として「地方」を用意する。
    + 例：　「北海道地方=」、「東北地方=」・・・「九州地方=」
+ 既存の都道府県のホストグループを用意する。
    + 例：　「北海道地方=北海道」、「東北地方=青森」・・・「九州地方=沖縄」
+ 各ホストは、ホストグループとして「該当の都道府県」と「地方」を持つ。
    + 例： 佐賀県に存在するサーバは、ホストグループ「佐賀」と「九州地方=佐賀」

# 実作業

+ Zabbix設定画面で、ホストグループを作成する。
    + 例：　「北海道地方=」、「東北地方=」・・・「九州地方=」
+ Zabbix設定画面で、ホストグループの「都道府県」を作成する。
    + 例：　「北海道地方=北海道」、「東北地方=青森」・・・「九州地方=沖縄」
+ 各ホストの設定にて、「地方」「都道府県」の２ホストグループを登録する。

+ Zabbix3.0ダッシュボードのWidgetを直接触ってしまう。
    以下、２ファイル修正します(例として、rpm(zabbix-server-3.0.10))。

```ruby
# diff -up  /usr/share/zabbix/app/views/monitoring.widget.hosts.view.php.org  /usr/share/zabbix/app/views/monitoring.widget.hosts.view.php
--- /usr/share/zabbix/app/views/monitoring.widget.hosts.view.php.org	2017-09-23 20:39:30.039812624 +0900
+++ /usr/share/zabbix/app/views/monitoring.widget.hosts.view.php	2017-09-23 20:39:58.355666793 +0900
@@ -230,6 +230,9 @@ foreach ($groups as $group) {
 	if (!isset($hosts_data[$group['groupid']])) {
 		continue;
 	}
+	if ( preg_match( "/=.+$/", $group['name'])) {
+		continue;
+	}
 
 	$group_row = new CRow();
```

```ruby
# diff -up /usr/share/zabbix/include/blocks.inc.php.org  /usr/share/zabbix/include/blocks.inc.php
--- /usr/share/zabbix/include/blocks.inc.php.org	2017-09-23 20:43:18.795634494 +0900
+++ /usr/share/zabbix/include/blocks.inc.php	2017-09-23 20:43:36.510543259 +0900
@@ -402,6 +402,9 @@ function make_system_status($filter, $ba
 
 	foreach ($groups as $group) {
 		$groupRow = new CRow();
+	        if ( preg_match( "/=.+$/", $group['name'])) {
+	                continue;
+	        }
 
 		$name = new CLink($group['name'], 'tr_status.php?filter_set=1&groupid='.$group['groupid'].'&hostid=0'.
 			'&show_triggers='.TRIGGERS_OPTION_RECENT_PROBLEM
```

# 結果

以下のように、ダッシュボードの"Host status","System status"の表示がすっきりしました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/82244/d66e1d00-971f-27cf-df8d-43b8ea563288.png)
[RaspberryPi]RaspberryPi用のTensorFlow作りました。

何日かかったのかわかりませんが、
成功して嬉しいです。

![giphy-downsized (1).gif](https://qiita-image-store.s3.amazonaws.com/0/137182/a3fe6349-cac5-a9fa-e1e6-63a70c63cc0b.gif)

なんと話すというと、Tensorflow API r1.3をRaspberryPiで使うことができました。Pythonバージョンは3.5.2です。

Tensorflow **1.1.0**のRaspberry バージョンはありますよね。
でも、これは**python 3.4**のようです。



# 内容

1. TENSORFLOW VERSION : 1.3.0
2. PYTHON 3.5.2 
3. BUILD & TEST MODEL : ARM NEON、RASPBERRY PI MODEL 3
4. Bazel version : 5.4.0
5. gcc 4.8, g++ 4.8 

# Bazel Build 時間

ほぼ５時間かかりました。

# Link

buildしてできたwhl私のgithubに載せておきました。
[Github link](https://github.com/JAICHANGPARK/tensorflow-raspberrypi)
iPhoneでフォーム入力しようとすると画面が勝手に拡大されるのまじやめて欲しいので対応方法探した

`font-size:16px`以上だと拡大されないらしい。
試してみたらうまく行った！

(参考)
http://webdev.jp.net/iphone-forcus-zoom-dissolve-user-scalable/
zshからfish-shellへ体験入門

サラッと試してみた感じを綴っただけなのでサラッと読んで下さい。
# fish-shell

[fish](https://github.com/fish-shell/fish-shell)とはbashやzshと同じシェルの一つ。

## 導入

導入自体はすごく簡単で[homebrew](https://brew.sh/index_ja.html)を入れていれば

```scm
$ brew install fish
```

これでインストール完了。

デフォルトで使うために`$ chsh -s /usr/local/bin/fish`を忘れずに。

設定し終わるとデフォルトでいかした感じの画面になっていた。

## プラグインマネージャーの選定

- [oh-my-fish](https://github.com/oh-my-fish/oh-my-fish)
- [fisherman](https://github.com/fisherman/fisherman)

ネットでさらっと見た感じこの2つが候補になった。
zshで例えると前者は`oh-my-zsh`,後者は`zplug`みたいな印象

とりあえず今回はお試しみたいな感じだったので後者の`fisherman`を選択した。

```scm
$ curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs https://git.io/fisher
```

それなりに仕上げるべく、プラグインをインストール

```scm
$ fisher z fzf edc/bass refaelrinaldi/pure
```

インストールしたプラグイン一覧は`~/.config/fish/fishfile`で見ることができる。

`~/.config/fish`のディレクトリ下に`config.fish`ファイルを作る。(.zshrcのようなもの)

ここにパスなどの設定を書いた。

見よう見まねで書いた内容(あってるかわからないですが。)

```shell
# homebrew
set --export PATH /usr/local/sbin $PATH

# node
set -gx NVM_DIR $HOME/.nvm

# android
set --export ANDROID_DIR $HOME/Library/Android/sdk
set --export PATH $ANDROID_DIR $PATH
set --export PATH $ANDROID_DIR/platform-tools $PATH
set --export PATH $ANDROID_DIR/tools $PATH

# keybind
function fish_user_key_bindings
  # peco
  bind \cr 'peco_select_history (commandline -b)'
end
```
homebrewへのパス`/usr/local/bin`へはデフォルトでPATHが入っていたので書きませんでした。その辺調べていないのでこれから使っていく中で調べれたらと思います。

## zshとの比較

正直な感想、速さを求めるならありだと思う。起動速度は体感で感じるほどzshとの違いを感じた。
逆に今の環境に満足している人はやめたほうが無難な感じもある。
パスの書き方が違ったり、今使っている`nvm`などのバージョン管理ツールが対応していない場合がある。
(nvmの場合それ用の[wrapper](https://github.com/fisherman/nvm)がある。)
その他のツールについてもほとんどがbash、zshを意識して作っているので導入しようとすると、あれ？みたいなところはある。
そのあたりはプラグインで入れた`bass`などを上手く使って対処するしかないのかなと思った。

半年くらいは試しで使ってみようかなと思う。
エクスプローラーのフォルダ右クリックメニューに「Open with Bash」を追加する

掲題の通り。
（当然ですが、WSLがインストールされていることが前提です。）

以下コマンドでレジストリ追加して終了！

```cmd
reg add HKEY_CLASSES_ROOT\Directory\shell\bash /t REG_SZ /d "Open with Bash"
reg add HKEY_CLASSES_ROOT\Directory\shell\bash\command /t REG_SZ /d "C:\Windows\System32\bash.exe"
reg add HKEY_CLASSES_ROOT\Directory\Background\shell\bash /t REG_SZ /d "Open with Bash"
reg add HKEY_CLASSES_ROOT\Directory\Background\shell\bash\command /t REG_SZ /d "C:\Windows\System32\bash.exe"
```

おわり。
Windows7にNATさせて裏側のサービス(ポート)にアクセスする

WindowsでNATさせて違うセグメントのネットワークにアクセスしたいときがありました。netshコマンドを使うとできたのでメモ。ちなみに管理者権限でコマンドプロンプトを起動しないと設定できないので注意。

```
netsh interface portproxy add v4tov4 listenport=443 listenaddress=192.168.1.10 connectport=443 connectaddress=192.168.2.10
```
PepperからWatson Visual Recognitionを呼ぶ

この記事はペッパソンの最中に書いているメモです。

Watson Visual Recognition のAPIリファレンスはこちら
APIリファレンス　https://www.ibm.com/watson/developercloud/visual-recognition/api/v3/?curl#introduction

Watson Visual RecognitionをPepperから呼ぶ場合、Pythonのモジュール　watson-developer-cloud をPepperに入れるのは依存関係の問題で大変なので、エンドポイントを直接呼びたい。で、ドキュメントのcURLのサンプルを参考に、PepperのPythonボックス内で、requestsモジュールを使って

```python:
import requests
api_key = self.getParameter("api_key")
url = "https://gateway-a.watsonplatform.net/visual-recognition/api/v3/classifiers?api_key=%s&version=2016-05-20" % api_key
res = requests.get(url)
```
ってやったら落ちてしまってハマりました。
ちなみに、上記コードはjupyter notebookだと動きます。

で、どうするかというと、Node-redにご登場いただきます。
そもそも上の「分類器一覧取得」は Watson Visual Recognition Utilっていうノードで取れるのですが、敢えてhttp requests ノードを使って、
以下のような簡単なフローを書くと、ちゃんと取れるようになります。
<img width="494" alt="スクリーンショット 2017-09-23 20.25.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/45591/68d25135-ed9f-ba27-635a-30cd0bb2bd9c.png">

```json
[{"id":"48072e51.0a369","type":"http in","z":"6675f4be.253fac","name":"","url":"/getClass","method":"get","upload":false,"swaggerDoc":"","x":104.5,"y":231,"wires":[["5f0b2d0a.5f86f4"]]},{"id":"eb2a569b.9e94d8","type":"http response","z":"6675f4be.253fac","name":"","statusCode":"","headers":{},"x":435.5,"y":232,"wires":[]},{"id":"5f0b2d0a.5f86f4","type":"http request","z":"6675f4be.253fac","name":"","method":"GET","ret":"obj","url":"https://gateway-a.watsonplatform.net/visual-recognition/api/v3/classifiers?api_key=<YOUR_API_KEY>&version=2016-05-20","tls":"","x":284.5,"y":233,"wires":[["eb2a569b.9e94d8"]]}]
```

ハマったのでメモ
あなたはなぜQiitaに投稿する？

# はじめに
私自身がQiitaユーザなので、 **なぜQiitaに投稿するのか?**　投稿することによってどんなメリット、心理があるのかを整理してみました。

# 前提
* 自分ががQiitaに投稿する理由を言語化しただけ
* プログラミングとは関係ない
* コメント歓迎

# 理由１　備忘録
###クラウドに保存でき、記事として公開できるため、強力な備忘録置き場として使える

## 備忘が目的なら、、、
他にもBoostnoteなどがあるが、Boostnoteはそのマシン内に保存するので、ふとした拍子にマシンが壊れたりを考えると、管理してもらえるQiitaは優秀。

## 他人からレビューされる
* 他人が分かるように心がけるため、自分の中で整理する
* 曖昧なものが浮き彫りになる
* 「分かる」→「説明できる」に変わる
* 間違い、よりいい方法が指摘してもらえる


# 理由２　貢献欲求
###自分のが躓いたところは、同じように躓いている可能性が高い。

## 自らも情報発信する
自分が苦労した点などネットに公開することで、同じようなことで悩んでいる人々を助けることができます。また、こうした活動は業界で盛んに行われているため就職・転職・社内評価で有効です。

# 理由３　承認欲求
###自分の投稿を他に認められたい

## 承認されることによって自信が付く
会社で評価されなかった内容・実績でもQiitaで評価されれば自信がつきますよね？
実際にQiitaに投稿し、自信を貰っていた人がいました。（それを社内評価で持ち出すようです）

# 理由４　その他いろいろ
* IT業界に特化していて、閲覧者も業界に興味ある人が多い
* Markdown記法
* 広告がうざくない
* ブログでない
* 専用の投稿ツールがある
* アフィリエイト禁止（金儲けの人の投稿は内容がスカスカな場合が多い）
* 他人のコメントを投稿者が制御できない
* 意識高い系を装うため（就活、転職）
* 投稿している方がかっこいい
* 最新技術のキャッチアップ

# 最後に
私がQiitaに投稿する理由はこんな感じです。他に私はこうなどコメントがあると嬉しいです。
マルチドメインでのSSLの設定（CentOS7）

# マルチドメインの場合のSSLの設定
複数のドメインを管理している場合のウェブサーバーで、SSLの設定をします

証明書の取得等は下記サイトを参考にしました
[さくらVPSでApache+SSL環境の構築](https://qiita.com/kazu56/items/a5eaa9afed4b76caf847)

一つ問題となったのがssl.confを書き換えるところです
ssl.confを書き換えてしまうと対応できるドメインが一つに限られてしまうという点です

# 使用するファイル
|ファイル|説明|
|-----|-----|
|CSR|認証局に申請するのに必要なデータです<br>秘密鍵と一緒に作成されます|
|秘密鍵|SSLの設定に必要なデータです<br>CSRと一緒に作成されます<br>***.keyという名前で保存します|
|証明書|SSLの設定に必要なデータです<br>認証局から発行されます<br>***.crtという名前で保存します|
|中間証明書|SSLの設定に必要なデータです<br>認証局から発行されます<br>***.crtという名前で保存します|

CSRと秘密鍵の作成はツールを使うと便利です
[CSR・秘密鍵生成](http://tech-unlimited.com/csr.html)

SSLの設定にはSSLのモジュールが必要になりますので、インストールしておきましょう
インストール時に/etc/httpd/conf.d/以下にssl.confが作成されます

```
yum install mod_ssl
```

# 設定方法
SSLの設定の方法を調べるとssl.confを直接書き換えているところが多いですが、今回はssl.confは書き換えません
/etc/httpd/conf.d以下に新しいファイルを作成して設定します
既にバーチャルホストの設定を行っているものがあればそれを利用しても構いません

ssl.confの設定を見ると実はデフォルトの設定を行うファイルになっています

```ssl.conf
<VirtualHost _default_:443>
  ...
</VirtualHost>
```

新しく作ったファイルにSSLの設定をしていきます

```new.conf
NameVirtualHost *:443

<VirtualHost *:443>
  DocumentRoot /var/www/html  # ディレクトリ
  ServerName example.com  # ドメイン

  SSLEngine on
  SSLCertificateFile /etc/pki/tls/certs/example.crt  # 証明書
  SSLCertificateKeyFile /etc/pki/tls/certs/example.key  # 秘密鍵
  SSLCertificateChainFile /etc/pki/certs/rapid.crt  # 中間証明書

  <Directory "/var/www/html"> # .htaccessで上書きできます
    AllowOverride All
  </Directory>
</VirtualHost>
```

80番ポートも書き込みます
使わないのでhttpsにリダイレクトするなりしましょう

```new.conf
NameVirtualHost *:80

<VirtualHost *:80>
  DocumentRoot /var/www/html  # ディレクトリ
  ServerName example.com  # ドメイン

  <IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
  </IfModule>
</VirtualHost>

NameVirtualHost *:443
...
```

マルチドメインの場合は同じ要領でNameVirtualHostの下にVirtualHostタグを増やしていけばできます

# 設定の反映
CentOS7では勝手に443ポートが開いていないので、ファイアウォールの設定をします
なぜかhttpsを開けるとhttpが接続できなくなるので、両方開けるようにしましょう

```
firewall-cmd --permanent --zone=public --add-service=http 
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
```

ウェブサーバーの再起動をします
ウェブサーバーの起動時に/etc/httpd/conf.d/以下のファイルが読み込まれるため、そこに配置したssl.confとnew.conf(名前は何でもいい)が読み込まれます

```
systemctl restart httpd.service
```

# まとめ
ssl.confの設定は443ポートのVirtualHostのデフォルト設定でした
直接ファイルを書き換えずに、新しいファイルから設定を上書きするようにしましょう
初心者がRails5.1でLINE_BOTを作る時に躓いたこと

これ（[Qiita:Line Messaging API オウム返しBot(rails × heroku)](https://qiita.com/YoheiMiyamoto/items/f6851cdb40891edf0e57))をやっていたら、一箇所詰まったのでメモ。

Rails5.1では以下のように書けないみたいで。

``` rb
render :nothing => true
```

こちらの記事によると
[Rails5なAPIで単純に404を返す方法](https://qiita.com/ukoasis/items/53cebcfb9b6c7ee9dbeb)

``` rb
head :not_found
```

と書けばいいみたいな。
知らねえよ。

素人が何も考えずに新しいバージョンを使うと罠に陥る例でした。
【PlayCanvas】エンティティ属性のアトリビュートのスクリプトにアクセスする方法

entity.script.[entityにアタッチしているスクリプト名]

例
1. GameManagerにcharactorというアトリビュートを設定する。
2. charactorにはspriteというscriptをアタッチしている。

アトリビュート

```js:

GameManager.attributes.add('charactor', { type: 'entity' });

```

spriteのアクセス

```js:

this.charactor.script.sprite

```

Unityなら

```csharp:

this.charactor.GetComponent(sprite);

```

になる。
【numpy】np.arange()を使用した負の指数計算トラップ

`np.arange()`を使用して
n^-3, n^-2, 2^-1...
のように一定範囲の負の指数計算をnumpyで計算しようとしたらちょっと躓いたのでメモ。

##まず書いてみる
`2**np.arange(-3, -1)`

エラー発生。

```
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-4-d719d82f8b72> in <module>()
----> 1 2**np.arange(-3, -1)

ValueError: Integers to negative integer powers are not allowed.

```
負の整数は許されてないだと？

##ちなみにrange()使うとこう書ける
```
[2**i for i in range(-3, 0)]
->  [0.125, 0.25, 0.5]
```
ただ、`range()`の弱点はstepに小数を刻めないことなんだよね。

##np.arange()使って小数刻みで計算させると？
```
2**np.arange(-3, 0, 0.5)
-> array([ 0.125, 0.1767767, 0.25, 0.35355339, 0.5, 0.70710678])
```
普通にうまくいった。
ということは、、、負の指数もfloat扱いしてやればうまくいくのかな？

```
2**np.arange(-3, 0, dtype=float)
-> array([ 0.125,  0.25 ,  0.5  ])
```
なるほど。明示的にfloatでarangeしてあげると良いのですね！
【Laravel】TokenMismatchExceptionが発生する原因

# TokenMismatchExceptionが発生する原因
フォーム等でPOSTをする際、Laravel が発行する**CSRFトークン**が必要で、
そのトークンがないと表題の**TokenMismatchException**が発生するようになります。
（詳しくはリーダブル参照： [CSRF保護 5.4 Laravel](https://readouble.com/laravel/5.4/ja/csrf.html)）
  
以下のコードをブレードのformタグ内に埋め込む必要があります。

```blade.php
{{ csrf_field() }}
```

以下**Laravel5.6以前**の記述例

```html:form.blade.php
<form method="POST" action="/profile">
    {{ csrf_field() }}
    ...
</form>
```

以下**Laravel5.6系以降**の記述例

```html:form.blade.php
<form method="POST" action="/profile">
    @csrf
    ...
</form>
```

HTMLのソースでは↓のように表示されます

```html
<input type="hidden" name="_token" value="DC83jdkaHfAlskdjvskjiSVHEcrvzNK2fjcjpa3s*****">
```
  
逆に言うとTokenMismatchExceptionが発生する場合、作成したフォーム要素内にCSRFトークンが埋め込まれてない可能性大です
  
  
# TokenMismatchException発生時の挙動制御
**\app\Exceptions\Handler.php**の**renderメソッド**で挙動を制御できます。

```Handler.php
/**
 * Render an exception into an HTTP response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $exception
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $exception)
 {
    // TokenMismatchException発生時
    if ($exception instanceof TokenMismatchException) {
        // TokenMismatchException発生時はindexへリダイレクトさせる
        return redirect('/index');
    }
    return parent::render($request, $exception);
}
```
  
設定したことを忘れないようにしてください。
（403エラーページなどに飛ばした方がいいのかもしれません。）
  
# 有効期限

defaultで120分(2時間)みたいです。

```config/session.php
    /*
    |--------------------------------------------------------------------------
    | Session Lifetime
    |--------------------------------------------------------------------------
    |
    | Here you may specify the number of minutes that you wish the session
    | to be allowed to remain idle before it expires. If you want them
    | to immediately expire on the browser closing, set that option.
    |
    */

    'lifetime' => 120,

    'expire_on_close' => false,
```
Android 8 Oreo でホームショートカットを作成する

Android 8 Oreo がリリースされて少し経ちました。
新機能をさっと眺めていたところホームショートカットの作成が、今までの方法ではできなくなると見かけました。

https://qiita.com/takahirom/items/e0eea409a8fedf430184#whats-new-in-notifications-launcher-icons-and-shortcuts
> Android Oではcom.android.launcher.action.INSTALL_SHORTCUTが無効化された。かわりにrequestPinShortcutを使う。

そこで実際に確かめてみました。

https://github.com/takeo-asai/oreo-shortcut

emulator だけでの確認ですが、Oreo からは Broadcast による登録は不可能、requestPinShortcut() からは以下の UI から登録できました。

![screenshot.png](https://qiita-image-store.s3.amazonaws.com/0/110715/94829b75-0bbd-2129-2308-b7781fccbd7c.png)

# Android 8 以降

ShortcutManager#requestPinShortcut() を使います。以前に必要であった AndroidManifest.xml への permission を追加する必要はありません。

```kotlin
val manager = getSystemService(Context.SHORTCUT_SERVICE) as ShortcutManager
val info = ShortcutInfo.Builder(this, "shortcut-id")
    .setShortLabel("label")
    .setIcon(Icon.createWithResource(this, R.mipmap.ic_launcher_round))
    .setIntent(intent)
    .build()
manager.requestPinShortcut(info, null)
```

これだけですが、API >= 26 が必要です。

# Android 7.1 以前

こちらも比較のために乗せておきます。

AndroidManifest.xml へ

```xml
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
```

を追加した上で、

```kotlin
Intent intent = new Intent("com.android.launcher.action.INSTALL_SHORTCUT")
...
sendBroadcast(intent)
```

Broadcast するだけです。Android 8 でこれを実行しても、残念ながら登録されません。エラーも表示されないため、知らないと意味がわからないかと思います。

Android 8 でホームショートカットを作成する皆様の参考になれば幸いです。
ディープラーニングの基礎の基礎 - その1

機械学習の中の一分野、ディープラーニングについてお勉強中。
ディープラーニングとは入力値を複数階層にわたり分析、評価して分類、予測に紐づく出力をするための概念といったところか。
まずは初歩の初歩としてパーセプトロンとニューラルネットワークについて学んだ。
※ちょいちょいコードに出てくるnpはpythonのNumPyライブラリ

# 活性化関数について
前層の出力値を次の層に渡す際に、活性化関数を通してから渡す。
この活性化関数の違いにより、パーセプトロンなのか、ニューラルネットワークなのかが変わる。

# パーセプトロン
まず抑えておくとニューラルネットワークをより理解しやすくなると思う。
パーセプトロンは活性化関数としてステップ関数を使う。

## ステップ関数
ステップ関数は入力値に対して重み、バイアスを使って総和を出し、それが0より大きいか否かを判定する。
```
総和(入力値 * 重み) + バイアス > 0 = 1
総和(入力値 * 重み) + バイアス <= 0 = 0
```

パーセプトロンを使って、AND、NAND、OR、XORを表現しようとすると、XORだけ多層で処理しないと判定できない。

# ニューラルネットワーク
ニューラルネットワークもパーセプトロンと同様に、入力値に対して重みをかけ、バイアスを加算し、活性化関数を通して次の層へ値を渡す。最終的な出力値を出すそうは出力層として活性化関数を使わずに恒等関数、またはソフトマックス関数を使用する。

## ニューラルネットワークの活性化関数
ニューラルネットワークでは活性化関数としてシグモイド関数を使用する。が、最近ではrelu関数が主に使用されるとのこと。ニューラルネットワークではこれらの非線形関数で層を掘っていくが、線形関数じゃ何で駄目なのかと言われると、線形関数だと中間層(隠れ層)がなくなっちゃうから。h(x)=cxの線形関数を使うとして、`y(x) = h(h(h(x))) = c * c * c * x = ax (a=cの3乗)`と一回の掛け算で算出できちゃうので中間層なんてないものとできちゃう。そもそもディープラーニングの概念じゃなくなっちゃうってこと・

### シグモイド関数
```
y = 1 / (1 + np.exp(-x))
```
exp(-x)は自然対数e(ネイピア数)に対して-x乗した値が入る

### relu関数
```
y = np.max(0, x)
```

## 恒等関数とソフトマックス関数
最終的な出力を行う際、解析したい問題に応じて関数を使い分ける必要がある

### 恒等関数
出力層の直前層から送られてきた値をそのまま出力する。
データから、値を予測するといった回帰問題で使用する。

### ソフトマックス関数
犬の画像を探し出すなど、分類問題で使用する。

```
def softmax(x):
    x = x - np.max(x) # overflow対策
    exp_x = np.exp(x)
    sum_exp_x = np.sum(exp_x)
    return exp_x / sum_exp_x

x = np.array([0.5,2,3.5])
y = softmax(x) # [ 0.03911257  0.17529039  0.78559703]
sum = np.sum(y) # 1.0
```
ソフトマックス関数で変換された出力値は総和が1になる。
これにより、各出力値を確率として扱うことが出来るので犬である確率が何％かといった分類が可能になる。
Migration の revert 機能の使い方

便利機能を見つけたので紹介します。

次のような処理があったとします。

```rb:カラム追加
change_table :users do |t|
  t.string :name
end
```

それを revert ブロックで囲めば逆の処理が走ります。

```rb:カラム削除
revert do
  change_table :users do |t|
    t.string :name
  end
end
```

既存の migtation を丸ごと revert したい場合はそのクラスを指定するだけでよいようです。

```rb:既存のmigration定義をrevertする
revert CreateUsers
```

以下は確認用コードです。

```rb
require "active_record"
ActiveRecord::VERSION::STRING   # => "5.1.4"
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")

class A < ActiveRecord::Migration[5.1]
  def change
    create_table :users do |t|
      t.string :name
    end
  end

  run self
end

class B < ActiveRecord::Migration[5.1]
  def change
    # users を drop
    revert A

    # 逆の逆の逆の逆なので users を create
    revert do
      revert do
        revert do
          revert A
        end
      end
    end

    # 再び users を drop
    revert A

    # users を create
    ActiveRecord::Migration.run A # A.migrate(:up) でも実行できる

    # 「nameカラム追加」の逆なので「nameカラムを削除」
    revert do
      change_table :users do |t|
        # 本当は string 型だけど嘘を書いてもいい
        t.integer :name
      end
    end

    # users を drop
    revert do
      create_table :users
    end
  end

  run self
end
# >> -- create_table(:users)
# >>    -> 0.0018s
# >> -- drop_table(:users)
# >>    -> 0.0001s
# >> -- create_table(:users)
# >>    -> 0.0003s
# >> -- drop_table(:users)
# >>    -> 0.0001s
# >> -- create_table(:users)
# >>    -> 0.0002s
# >> -- remove_column(:users, :name, :integer, {})
# >>    -> 0.0046s
# >> -- drop_table(:users)
# >>    -> 0.0001s
```

drop や remove 系メソッドに変換しなくてもいいのが楽ですね。
wordpressのテンプレートタグ・カスタムヘッダーの表示

#wordpress（企業サイト制作を前提）
##テンプレートタグ
-  有効にしているテーマのスタイルシートのパスを出力するタグ<br>
`get_stylesheet_uri();`<br>
※ php bloginfo('stylesheet_url'); という記述もありますが、現在は非推奨。

【テンプレートタグ】
1. サイト名称を出力
`php bloginfo('name');`
2. ヘッダーを読みこむ
`get_header();`
3. フッターを読み込む0
`get_footer();`
4. サイドバーを読み込む
`get_sidebar();`


※上記の2 3 4 のタグは `get_template_part();`に置き換えできる。
　例：header.php ファイルを読み込むときは
　　　`get_template_part('header');`



- header.php, footer.phpに追記必須のテンプレートタグ<br>　⇒　メタタグの出力、Javascriptライブラリの読み込み、Wordpressのツールバーの表示させる

（header.phpファイル）
\</head>の直前に下記を追加
```<?php wp_head(); ?>```

（footer.phpファイル）
\<body/>の直前に下記を追加
 ```<?php wp_footer(); ?>```

- トップページへリンクを出力<br>
```<?php home_url('/'); ?>```

##カスタムヘッダーでメインイメージを表示させる<br>
  <p>カスタムヘッダー機能を利用することで、トップページのメインイメージを管理画面で設定できるようになる。</p>

1.   .../ themes / ※自作テンプレートフォルダ / functions.php を作成して、下記を記述する。
<pre>例:
//カスタムヘッダー
add_theme_support(
'custom-header',
      array(
		'width' => 950,
		'height' => 295,
		'header-text' => false,
		'default-image' => '%s/images/top/main_image.png',
       )
);
</pre>

2. 上記のファイルを追加することで、管理画面「外観」にて画像のアップロードができる状態になる。
ng-if・ng-show/hideの違いでrequiredの挙動が異なる

入力フォームをAngularJSを用いて実装した際に困ったことを紹介します。

#必須入力と表示非表示
以下のような入力フォームを構成するhtmlと、ボタンが押されると呼び出されるfunctionを定義しました。

```html:sample.html
<!DOCTYPE html>
<html ng-app='App'>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.6/angular.min.js"></script>
   <script type="text/javascript" src="controller.js"></script>
  <title>test</title>
</head>
<body ng-controller="AppController">
  <form name="form" ng-submit="hoge()">
    <input type="text" ng-show="true" required>
    <input type="text" ng-show="false" required>
    <button type="submit" >send</button>
  </form>
</body>
</html>
```

```js:sample.js
var app = angular.module('App', []);

app.controller('AppController', function($scope){
  $scope.hoge = function(){
    console.log('hoge is called');
  }
});
```

するとこんな感じに。ng-show="false"を指定しているinputは表示されません。またそれぞれのinput要素でrequiredによる必須入力を指定しています。
<img width="199" alt="test.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/203706/e0b2dded-b990-ce42-fa59-b5f74ccff5c3.jpeg">


フォームに適当な文字を入力し、sendボタンを押すと、上で定義したfunctionが実行されるはず...だと思ったのですが、実行されず。ng-show="false"を指定しているinputのrequiredが効いてしまっています。

次に同様な機能のディレクティブ、ng-ifを使ってみます。先ほどのinput要素を以下のように書き換えます。

```html
    <input type="text" ng-if="true" required>
    <input type="text" ng-if="false" required>
```

先ほど同様な見た目になり、文字を入力しsendを押すと、functionが実行されログが出力されます。

#ng-if・ng-show/hideの違い
先ほどの事象が起きるまでng-if、ng-showの違いを理解していませんでしたが、調べると次のような違いがあります。

* ng-if：DOMの追加と削除
* ng-show/hide : CSSによる表示非表示切り替え

したがって、ng-show="false"を指定しただけではDOMとして要素が存在しておりrequiredが効く状態になっていました。

#必須入力を評価できるディレクティブ：ng-required
必須入力を動的に変化させたい場合、ng-requiredというディレクティブを使うことで実現できます。イコールで評価式（true,false）を指定すると、trueの評価のときだけ必須入力となります。
[Docker] Docker for Macでmysqlを起動〜接続

手元で複数のバージョンや設定を使い分ける場合に便利。
以下3ステップで起動〜接続まで。

### 1. mysqlのイメージをdockerhubからpull

```
docker pull mysql
```

※ バージョン指定する場合は `docker pull mysql:5.6` のようにコロンの後にバージョン（タグ）指定する
※ pull可能なバージョンは以下を参照
https://hub.docker.com/_/mysql/


### 2. コンテナをビルド&起動

```
docker run -e MYSQL_ROOT_PASSWORD=password -d -p 3306:3306 mysql
```

### 3. ローカルのmysqlクライアントから接続

```
mysql -uroot -p -h 127.0.0.1
```

※ localhostだと名前解決されないようで、 -h 127.0.0.1 を付けないと起動できない
API Connectでカスタムの流量制御を使ってみた

# 前提バージョン
IBM API Connect 5.0.6.3
※当記事ではVMware Workstation PlayerでAPI ConnectがPC上に導入済みとします。
#1 API Connectの流量制御について
API Connectでは、APIに対して「プラン」と呼ばれる流量制御の設定が可能です。
APIを利用する開発者は、開発者ポータルのサイトでプランの利用登録（サブスクライブ）をすることで、そのプランで指定された分だけAPIを呼び出すことができます。

APIが最大でどれだけ呼び出し可能になるかというと、
`最大の流量 = プランへの登録数 × プランの制限流量`
となるため、システムを保護する観点での流量制御を行う必要が生じる場合があります。

この記事では、APIのアセンブル処理の「gatewayscriptポリシー」でシステム保護のための流量制御を実施する方法について紹介します。
※gatewayscriptポリシーを使うため、OAuthプロバイダーAPIやMicroGatewayにはこの方法は適用できません。

#2 API Connect設定
#2-1 API定義の作成
API Manager（またはAPI Designer） で、通常のAPI定義を作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/aadd9c21-3646-9cbd-dc89-5cc93bffe29c.png)

#2-2 流量制御のポリシーを追加
「アセンブル」タブに移動し、「gatewayscript」アクションを追加します。
以下の設定では「lim01」をキーとし、5秒間（固定時間でカウント）に100回を超える呼び出しが発生すると、ユーザー定義の例外を発生させます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/193975/a1430cbd-2861-5c06-73c9-280ca71ed51e.png)

```
var rl = require('ratelimit');
var apim = require('./apim.custom.js');
var lim01Rate = rl.rateCreate('lim01', 100, 5, 'fixed');
lim01Rate.remove(1, function(error, remaining, timeToReset) {
  if (error) {
    apim.error('ThrottleError', 429, 'Too Many Requests', 'Throttle Error has been occured.');
  } else {
    apim.readInputAsBuffer(function(error2, buffer) {
      session.output.write(buffer);
    });
  }
});
```

以上で設定完了です。
APIごとにどのキーを割り当てるかによって、キーの単位で流量を調整することが可能になります。

#2-3 流量制御が行われる範囲
上記「ratelimit」モジュールの「rateCreate」における流量制御は、プランの流量制御とは異なり（※）、DataPower Gatewayサーバーの割り当て量制約サーバーの設定内容に応じて、その制御範囲が変わります。
割り当て量制約サーバーの設定でピアグループの設定を行うと、その範囲で流量制御が行われます。
逆にピアグループの設定を行わない場合、上記の流量制御はサーバー単位となってしまいますので注意が必要です。
また、APIConnectのプロバイダー組織が複数ある場合、プランの流量制御はGatewayクラスターの範囲で制御されるのに対し、「rateCreate」の機能は（おそらく）DataPower Gatewayサーバー全体に対して行われるため、流量制御に使用するキーの文字列は適切なネーミングルールを決める必要があるでしょう。

※プランの流量制御は、APIMドメインのSLMピアグループの設定に基づいています。つまり、プランの流量制御の範囲はGatewayクラスター内ということになります。

#2-4 サーバー単位で流量制御したい場合
DataPowerサーバー自体への負荷を抑える目的でサーバー単位で流量制御したい場合、キーとなる値に「_システムID」を付与することで、サーバごとにキーを割り当てられます。
システムIDはGatewayScriptでシステムのコンテキスト変数から取得できます（ちょっと面倒ですが。。。）。

# 免責事項
この記事の内容は不正確である可能性があります。この記事の内容やその利用等によって生じた、いかなる損害に対しても責任は負いません。
virtualbox+vagrant+centos+atom→phpstorm｜開発環境

phpstromがいいとよく聞くのでatomから乗り換えてみました。
英語大変ですが勉強になります。

#環境
virtualbox+vagrant+centosでwin10上に環境を構築している。

これまではatomエディタでssh接続して直接centos上のファイルを開き保存などしていた。

#ファイルの管理方法
ローカルwin上で普通に保存（管理）したり
ceontos上のフォルダをwinと同期させたり（vagrant synced folders）
atomのremoteftp何かで直接centos上のディレクトリをいじったり
いろいろな方法があるが直接いじる方法が一番安定感があったので採用。

※vagrant synced foldersをリアルタイム同期するのがメンドウだった。
慣れている人はそっちのほうが簡単というパターンもあるかもです。

#phpstormからサーバ上のファイルを直接編集できた
この情報がなかなか見つけられなかった。結局本家にありました。
https://blog.jetbrains.com/jp/2014/02/04/390

前提としてsetting→deploymentでサーバ情報を登録しておく必要があります。

ファイル編集したら保存ではなくアップロードボタンを押すと反映されています。

当然ながらパーミッション、所有者、グループはphpstormから編集できるように設定しておく必要があります。

#phpstormを少し触ってみて便利に感じたところ
・コーディング規約設定が超楽。プロジェクト単位で設定可能でwordpressなら項目からwordpressと選ぶだけで設定可能。
・ターミナルをIDE内で立ち上げられる。vimも立ち上げられる。
・vagrant upなどもボタン1発でIDE内で行える。
・定義もとへのジャンプが便利。（atomでもできないことはなさそう）
・atomに比べると設定が楽だった。バグが少ない印象

総合的にみなさんが『いい』とおっしゃっている理由を自分なりに書いてみると
ちょっとしたことなんですが設定が楽だったり、補完機能が充実していたりというところじゃないかなと。
またgitなんかの機能と連携させてみて気になるところがあれば追記します。
基本情報技術者試験に出てくるx mod yをrubyで書くとこうなる


# 本題
引用先リンク：[基本情報技術者試験ドットコム](http://www.fe-siken.com/fekakomon.php)
>第1問
>
関数 f(x，y)が次のように定義されているとき，f(775，527)の値は幾らか。ここで，x mod yはxをyで割った余りを返す。
f(x，y): if y = 0 then return x else return f(y，x mod y)
>
> ア0　　イ31　　ウ248　　エ527
>
平成29年春期　問6



# rubyで書いてみる

```ruby:test.rb

class Test

  def f(x , y)

    if y == 0
      x
    else
      f(y, xmody(x, y))
    end
  end

  def xmody(x, y)
    x % y
  end
end


instance = Test.new

puts instance.f(775, 527)
```


test.rbを実行

```
$ ruby ./test.rb
31
```

31という答えが得られた。イを選択し正解でした。
`x mod y`というメソッドの呼び方が見慣れないし、その形式を用いる必要性もよくわからない。
この形式について考察している時間のほうが勉強の時間よりも長い、まずい。。