OmniAICreator/Qiita-1.07M huggingface dataset:
Gitリポジトリ内ディレクトリをJenkins Jobのパラメタで選択したい

### これは何
Gitリポジトリ内のディレクトリをJenkins Jobのパラメタで選択したい場面に遭遇したときのメモです。
Jenkins1の設定について記述しています。

<img width="536" alt="スクリーンショット 2018-03-06 19.12.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/25418/ebd09fd4-91e0-ac9d-57f4-ced3540dbc07.png">

### 前提条件
プラグイン 拡張可能な選択 [Extensible Choice Parameter](https://wiki.jenkins.io/display/JENKINS/Extensible+Choice+Parameter+plugin)
がインストールされていること。

#### Extensible Choice Parameter Plugin の File Choice Parameter で実現できそうだけど。。
Extensible Choice Parameter Plugin で選択できる File Choice Parameter は、システム上のファイルやディレクトリを選択肢として設定できます。
しかし、今回の環境では使えませんでした。
理由は、利用しているJenkins環境がJob管理サーバとJob実働サーバで分かれており、Jobを実行すると適宜空いているJob実働サーバに割り振られるため、Job管理サーバにcloneしたリポジトリは保持できませんでした。
今回はGroovyスクリプトで生成する選択肢 System Groovy Script Choice Parameterを利用します。

### あらすじ
2つのJenkinsJobを作成します。
- Job1: Gitリポジトリを取得してディレクトリの内容をファイルに吐き出すジョブ。
- Job2: 最終的に動かしたいジョブ。Job1が吐き出したファイルを読み込み、パラメタにプルダウンメニューを表示する。

### Job1の設定
- *ソースコード管理*でGitを選択。取得するリポジトリを設定。
- *ビルド > ビルド手順の追加* でworkspaceからlsの出力結果をリダイレクトするシェルを追加

```
# 選択肢として表示したいディレクトリのパスを指定します
TARGET_PATH=${WORKSPACE}/target_directory

# ディレクトリ名にCHOICEを含むものを出力します。
echo 'ls -a ${TARGET_PATH} | grep ".*CHOICH.*"'
ls -a ${TARGET_PATH} | grep ".*CHOICH.*" > target.log

echo "cat target.log"
cat target.log
```
- *ビルド後の処理 > ビルド後の処理の追加* で *Copy files back to the job's workspace on the master node* を選択して target.log を指定。
- *ビルドトリガ*に*定期的に実行* もしくは *SCMポーリング* を設定。

### Job2の設定
- *拡張可能な選択 > 選択肢の取得方法* で *Groovyスクリプトで生成する選択肢* を指定。
- Groovyスクリプトに下記を設定。[PATH_TO_WORKSPACE]の箇所は、Job1実行時のコンソール出力に [copy-to-slave] として出力された内容を設定してください。

```
def files = new File("/[PATH_TO_WORKSPACE]/target.log").readLines()
return files
```

以上でJob2のパラメタに選択肢として設定できるはず。
Laravel Eloquent ORMでMySQLの非バッファクエリを使う


データ集計などで膨大なデータ（10万～100万件以上）のデータを処理するとき、デフォルト設定ではバッファを使うためメモリ使用量が大きくなってしまう。
メモリ不足で処理が落ちないように非バッファクエリを使いたい。
Eloquent ORMでの使い方がマニュアルに載っていないので調べた。

非バッファクリエについてはこちら。
[PHPマニュアル - バッファクエリと非バッファクエリ](http://php.net/manual/ja/mysqlinfo.concepts.buffering.php)

# config/database.phpで設定
`connections`の該当接続名の設定の中に`options`を追加する。

```php
'connections' => [
    'mysql' => [
        'driver' => 'mysql',
        'host' => env('DB_HOST', '127.0.0.1'),
        'port' => env('DB_PORT', '3306'),
        'database' => env('DB_DATABASE', 'database'),
        'username' => env('DB_USERNAME', 'user'),
        'password' => env('DB_PASSWORD', 'password'),
        'options' => [
            PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false,
        ],
    ],
]
```

# バッチ処理とか特定の場所だけで設定

```php
$config_key = 'database.connections.mysql.options';
$options = [
    PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false,
];
\Config::set($config_key, $options);
```

※これをDB接続が始まる前に実行すること。

# Empty row packet body
数百万件とか大量のデータを処理しようとすると「Empty row packet body」というエラーが出てしまう時がある。
MySQLの設定で以下のパラメータを長めにすることで緩和。
100%防ぐことが出来ないのでchunkを使った方がよいかもしれない。

```bash
net_read_timeout
net_write_timeout
```

# おまけ：その他オプション
持続的接続は`$options`に`PDO::ATTR_PERSISTENT`を追加

```php
$options = [
    PDO::ATTR_PERSISTENT => true,
    PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => false,
];
````
Raspberry Piで入店音システム5

#【Raspberry Pi】 人を感知して音を流す

前回の記事：[【Raspberry Pi】 USBスピーカーから音を出す](https://qiita.com/namekuji/items/4b86899c2ecb910cdd88)
##第0章　全体の流れ
前回の記事ではUSBスピーカーの設定をして、実際に音を出しました。ここまでの過程でほとんどの技術は習得しています。今回は入店音システムを作ってみましょう。

**第1章**では、必要なアイテム（今回使用したもの）の参考リンクです。
**第2章**では、前回までの記事を参考にして、周辺機器の取り付けを行います。
**第3章**では、センサーで感知した時に、音が鳴るプログラムを作ります。

##第1章　必要なアイテム
1. [Raspberry Pi 3 model B](https://www.amazon.co.jp/gp/product/B01CD5VC92/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1)
2. [macbook](https://www.amazon.co.jp/MacBook-Display-13-3インチ-Graphics-MF839J/dp/B00UJK322O/ref=sr_1_8?s=computers&ie=UTF8&qid=1512355535&sr=1-8&keywords=macbook+pro)
3. [USBスピーカー](https://www.amazon.co.jp/エレコム-スピーカー-コンパクト-2-1W-MS-P05UBK/dp/B007F4J83O/ref=sr_1_7?ie=UTF8&qid=1519035586&sr=8-7&keywords=USBスピーカー&dpID=41Ow5yqdD3L&preST=_SY300_QL70_&dpSrc=srch)<br>
*:sunny:USBのみで使用できるものであれば100均でもOKです*
4. [人感センサーHC-SR501](https://www.amazon.co.jp/HiLetgo-HC-SR501人体赤外線感応モジュール-人体の赤外線の感応器-3個セット-並行輸入品/dp/B010RYGEGM/ref=pd_nav_hcs_bia_t_2?_encoding=UTF8&psc=1&refRID=D794CDP9WZ31W7GE4DFN)
5. [ジャンパーワイヤー（メスーメス）](https://www.amazon.co.jp/gp/product/B00P9C2KE8/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1)

##第2章　取り付けや設定
ログインの方法がわからないときは[最初の記事](https://qiita.com/namekuji/items/ee4cb54d636ec5cd9d47)をみてください。

1. [人感センサーを取り付ける](https://qiita.com/namekuji/items/9b5289ab003f0c54f21d#_reference-6f7e5ef497398baba39e)
2. [USBスピーカーを取り付ける](https://qiita.com/namekuji/items/4b86899c2ecb910cdd88)
3. Raspberry Piの電源をつけて、SSHでログインをする。
4. プログラムを作る準備をする
    1. ``$cd Documents/Python3``でプログラムを収納しているフォルダに移動する。
    2. ``$vi door_sensor.py``で空のプログラムを作る。

##第3章　プログラムを作ります。
**完成系は以下の通りです。**<br>

```
#!/usr/bin/env python
#coding: utf-8

import time
import RPi.GPIO as GPIO
import pygame.mixer

SENSOR_GPIO = 18

GPIO.setmode(GPIO.BCM)
GPIO.setup(SENSOR_GPIO, GPIO.IN)

pygame.mixer.init()
pygame.mixer.music.load("../../Music/ファミマ.wav")

while True:
    if(GPIO.input(SENSOR_GPIO) == GPIO.HIGH):
        print("人を検知しました。")
        pygame.mixer.music.play(0)
        time.sleep(6)
        pygame.mixer.music.stop()

GPIO.cleanup()

```
可能であれば、以下の説明も参考にしてください。

1. **音を出すプログラムについて説明**
    1. ``import pygame.mixer``はpygameというライブラリを利用するためです。
    2. ``pygame.mixer.init()``は初期化です。とりあえず最初に書いとけばいいです。
    3. ``pygame.mixer.music.load("../../Music/ファミマ.wav")``は音楽を読み出しています。<br>
    *:sunny:*ここまでの記事を参考に作った方はMusicフォルダに音楽を入れていると思いますので、これで動きます。<br>
    *:sunny:ファミマ.wavは音楽名です。個人で変えてください。*<br>
    4. ``pygame.mixer.music.play(0)``はミュージックスタートです。
    5. ``time.sleep(6)``6秒後に次の処理
    6. ``pygame.mixer.music.stop()``ミュージックストップです。
2. **保存して終了後、実行します。**
    1. shiftを押しながらzを2回押します。
    2. ``python door_sensor.py``で実行します。
3. **テスト**
    1. 何もない方向にセンサーを向けておいて、音がならないか。<br>
*:sunny:精度が低いため、たまに鳴るかも*
    2. 手をかざした時に、画面に「人を検知しました。」と表示され、音がなる。
    3. 以上2点を確認したのに、完成です。

##第4章　最後に
これで入店音システムの記事は最終回となります。お疲れ様でした！
Docker <none> images を削除する

`dangling` とは「ちゅうぶらり」とかの意味ですが。
`docker images`には`--filter`オプションが用意されており。
`"dangling=true"`という条件を渡してあげると、`<none>`となっているイメージの一覧を取得できます。

```
$ docker images --filter "dangling=true"
```

いままで、このようなワンライナーで<none> Imageを削除していました。

```
$ docker images -a | grep "<none" | awk '{print $3}' | xargs docker rmi
```
しかし、フィルターに`-q`オプションを渡すことで、フィルターした結果のイメージ名だけを抽出してくれます。

そのため、フィルターした結果を`docker rmi`に渡す方法が最適と思います。

```
$ docker rmi $(docker images -a --filter "dangling=true" -q)
```
UITextViewの使い勝手を少しだけ良くする

UITextViewをそのまま使った場合，少し使い勝手が悪い点があるので，その対応についての備忘録を兼ねた小ネタです．

## Paddingを消す
UITextViewはデフォルトでPaddingが設定されています．  
Paddingも考慮してレイアウトを組むのは面倒なので， `viewDidLoad()` などに以下のコードを追加し，Paddingを消去します．

```Swift
textView.textContainerInset = UIEdgeInsets.zero
textView.textContainer.lineFragmentPadding = 0
```


## 全選択を可能にする
`isEditable == false` の場合，ロングタップ時のメニューに全選択がありません．   
以下のように `canPerformAction()` をオーバライドして，メニューをカスタマイズします．
なお，分岐条件に `action == #selector(select(_:))` を追加してメニューに「選択」を表示することもできますが，そのアクションをタップしても選択範囲は変わらず特に何の変化も及ぼさないので，今回は除外しました．

```Swift
class AllSelectableTextView: UITextView {
        
    override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
        
        // すべて選択，コピー，共有のみ利用可能
        if action == #selector(selectAll(_:)) ||
            action == #selector(copy(_:)) ||
            action == Selector(("_share:")) {
            return true
        } else {
            return false
        }
    }
}
```
UITextViewを編集不可にして表示するような場合，ある程度長いテキストを表示することが想定されます．
全選択(からのコピーや共有)を容易にすることで，細かなユーザビリティの改善にも繋がるかと思います．
Xamlで終了後に残りものを出さない

C# WPFでメインウィンドウから別スレッドで通信処理を行っている。
メインウィンドウを閉じてアプリケーション終了後に、別スレッドがメモリに残ってしまうことがある。
そんな場合は、プロジェクトのApp.xamlにShutdownMode="OnMainWindowClose"と指定する。

```app.xaml
<Application x:Class="GateClient.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainWindow.xaml"
             ShutdownMode="OnMainWindowClose"
             Startup="Application_Startup"
             Exit="Application_Exit">
</Application>
【matplotlib日本語表示】matplotlibrcを書き換えずに日本語表示する

# matplotlibrcを書き換える権限がないのでフォント変更ができないのだけど、

世の中にごまんとあるmatplotlib日本語表示解決方法が書かれたブログを見てみると、大筋の流れとしては

1. 日本語対応フォントをDLしてくる
2. DLしたフォントを /fonts 以下にcpする
3. matplotlibrcファイルのフォント指定を書き換える
4. plotする

という手段で解決する。
ただし、自分の環境で困ったのは、ファイル書き込みの権限があまり無い状態では

- 2 ← /fontディレクトリには勝手にファイルをコピーできない
- 3 ← 権限がないのでファイルの書き換えができない

という問題がある。そんな環境でもmatplotlibで正しく日本語表示する方法です。

先に解決のための流れを書いておくと

1. 日本語対応フォントを適当な場所にDLしてくる
2. FontPropertiesにDLしたフォントの任意のパスを教える
3. plotするときに fontproperties=font_prop を渡してあげる
4. plotする→ok

です。

ちなみに、想定環境は ubuntu（※root権限なし）です。

# 日本語対応フォントをDLしてくる

ここは通常通り。
何も考えず TakaoPGothic当たりでもDLしましょう。以下から落とせます。
https://github.com/byrongibson/fonts/blob/master/backup/truetype.original/takao-gothic/TakaoPGothic.ttf

ちなみに、すでにTakaoをDL済みかどうかを確認したい場合は以下コマンドを実行

```bash
$ fc-list | grep Takao
```

matplotlibで日本語表示するためにTakaoPGothicのような日本語対応フォントが必要なわけですが、日本語対応フォントであれば必ずしもTakaoPGothicである必要は無いわけです。
現在すでにインストールされているフォントから日本語フォントを探すには、[こちら](https://qiita.com/kshigeru/items/0cfc0778bab197687967)の記事の「有効なフォントの一覧表示」を試してみてください。「IPA~~~」が日本語フォントです。
ただ、TakaoPGothicをDLする手間の方が少ないと思うので、既存フォントの確認せずにDLしちゃったら良いと思います。


# FontPropertiesにDLしたフォントのパスを教える
特にめんどくさいこともなく、以下の4行を実行するだけ

```python
import matplotlib
from matplotlib.font_manager import FontProperties

font_path = './TakaoPGothic.ttf'  #DLしたパスを指定. /font以下でなくても良い
font_prop = FontProperties(fname=font_path)
```

ポイントは、DLしたフォントデータ（TakaoPGothic.ttf）を、Linux的に正しいフォント格納場所（/usr/share/fonts/） に置かなくても、自分の好きな任意の場所にとりあえず置いておいて、そのパスを`FontProperties`の引数として渡してあげるだけ。

他のブログでは、DLしたフォントを/usr/share/fonts/に置けとけ的なことが書かれているが、ここにファイルをコピーする権限がない場合は上記のようにテキトーな場所に置いてしまってok

# plotするときにfontproperties=font_propを渡してあげる

あとは、実際にplotするときにmatplotlibのplot関数に`fontproperties=font_prop`を引数として渡してあげるだけ

```python
# 例
plt.text(X[i, 0], X[i, 1], hoge, fontproperties=font_prop)
```

これで文字化け（豆腐）が出現すること無く日本語が出るはず

他のブログでは、matplotlibの環境ファイルであるmatplotlibrcファイルの`font.family`の箇所を、DLしたフォント名で指定して、使用するフォントを書き換えているがmatplotrcファイルを書き換えることができない弱い権限のときは plotする時にいちいち引数に`fontproperties=font_prop`を渡してあげることで解決している
（※いちいち引数に書くのはややめんどくさくはあるが、そこまで頻繁にmatplotlibで日本語表示をしない人は、環境ファイルを書き換えて何かよくわからんことになってしまうより、暫定的に変更する方がむしろ楽かもしれない）

`fontproperties=font_prop`をいちいち渡して日本語表示する際の注意点としては、
`plt.legend`するときだけ`fontproperties=font_prop`ではなく、`prop=font_prop`となる点。


```python
# 例
plt.legend(['hoge'], prop=font_prop, loc='upper left')
```

# (備考)MatplotlibのFontキャッシュ削除
Fontのキャッシュが残っていると、設定変更しても反映されない可能性があるのでこれを削除する

```bash
$ rm ~/.cache/matplotlib/fontList.cache
```

ファイル名が異なる場合もあるので、`~/.cache/matplotlib/`以下でfontListがついてるファイルを見つけて削除する

# 参考
https://qiita.com/canard0328/items/a859bffc9c9e11368f37
https://qiita.com/gymnstcs/items/50432a12fb9139b316bc
RailsでjQueryのtoggle,show,hideがうまく動作しなかった

# やりたいこと
`rails`でjQueryを書いている時にハマったことについて共有。
やりたいことは、

![画面キャプチャ.png](https://qiita-image-store.s3.amazonaws.com/0/208338/28ca118e-8043-e2d5-28aa-608db063303a.png)
ここの「回答する」ボタンをクリックすると
![画面キャプチャ2.png](https://qiita-image-store.s3.amazonaws.com/0/208338/62042584-1b23-dfb1-d5a5-25d5a32c579f.png)
回答欄が表示される。これを`jQuery`を使って実現する。

# 環境
* Ruby on Rails(5.1.5)
* Bootstrap(3.3.7)
* query-rails(4.3.1)
* ブラウザはSafari(11.0.2)とChrome(64.0.3282.186)


# 問題のコード
```erb:questions/show.html.erb
<h2 align="center">Title <%= @question.title %></h2>

<div class="well col-xs-8 col-xs-offset-2">
  <%= simple_format(@question.description) %>
  <hr>
  <!-- このボタンを押すと -->
  <button type="button" class="hidden-bin">回答する</button> 

</div>

<!--ここを表示をトグルする-->
<div class="hidden" style="display: none">
<%= render 'answers/form' %>
</div>
```

```coffeescript:question.coffee
$(document).on 'turbolinks:load', ->
  $(".hidden-btn").on "click" , ->
    $(".hidden").toggle()
```
# 解決策
どうやら`Bootstrap`の`class="hidden"`と競合していた模様。class名を`class="hidden-form`と変えることにより解決。わかっている人にとってはとても当たり前のことかもしれないが、2時間くらい悩みました。　

```erb
これを
<div class="hidden" style="display: none">
<%= render 'answers/form' %>
</div>

こうする
<div class="hidden-form" style="display: none"> 
<%= render 'answers/form' %>
</div>
```

```coffeescript
$(document).on 'turbolinks:load', ->
  $(".hidden-btn").on "click" , ->
    $(".hidden-form").toggle()
```
Gitでコミット前にテストを実行し、成功したらコミットされるようにする


## 概要
「テストの実行を忘れがちなんだけど、なんかいい手はないものか。テストコードの修正を忘れたままコミットするのも防ぎたい」と友達に相談したら、「Gitのフックを使えばいいんじゃない？」って教えてもらったので、調査した。


## 前置き
### Git hookとは
Gitで発生するアクションに応じて、任意のシェルスクリプトを実行することができる機能。
[Git フック](https://git-scm.com/book/ja/v1/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%83%95%E3%83%83%E3%82%AF)

クライアントサイドフックとサーバーサイドフックがあって、各々用途が違うんだけど、今回はクライアントサイドフックを利用する。

### Git hookのテンプレート
テンプレートが下記のディレクトリに用意されているので、そのテンプレートをコピーして使うことも可能。

```bash:テンプレートの場所
$ ls /usr/local/share/git-core/templates/hooks/
applypatch-msg.sample  post-update.sample     pre-commit.sample  pre-rebase.sample   prepare-commit-msg.sample
commit-msg.sample      pre-applypatch.sample  pre-push.sample    pre-receive.sample  update.sample
```

### コミット前にスクリプトを実行するためには

#### スクリプトの設置場所
コミット前（正確にはコミットメッセージが入力される前）は `pre-commit` フックを利用する。
参考例ではテンプレートの `pre-commit.sample` を `.git/hooks` ディレクトリにコピーして、名前を変えた。
実行権限をつけることをお忘れなく。

```bash:設置例
$ cd {your_project}/.git/hooks
$ cp /usr/local/share/git-core/templates/hooks/pre-commit.sample pre-commit
$ chmod +x pre-commit
```

これでコミット前（`git commit` 実行時）に `pre-commit` スクリプトが実行されるようになった。

## 本題
### コミット前にテストを実行するためには
下記の記事を参考にカスタマイズさせていただいた。
[Gitでpushする前にテストが通る事を確認する](http://techblog.timers-inc.com/entry/not_push_test_failed)

カスタマイズしたところは下記。

* コミット前に実行したいので、スクリプト名を `pre-commit` に変更した
* configurationを追加して `Debug` にした
* SDKに `iphonesimulator` と指定すると、Watchアプリがターゲットに含まれていた場合にテストが通らないので、SDKの指定を行わないように修正した

```bash:出力されるエラー
Testing failed:
	Target specifies product type 'com.apple.product-type.watchkit2-extension', but there's no such product type for the 'iphonesimulator' platform
** TEST FAILED **
```

[Testing an iOS and watchOS app on a simulator](https://discuss.circleci.com/t/testing-an-ios-and-watchos-app-on-a-simulator/10365)

### スクリプト

```sh:pre-commit
#!/bin/sh

is_workspace=false #CocoaPods等を使用している場合はtrue
project_name="YourProject.xcodeproj" #CocoaPods等を使用している場合は YourProject.xcworkspace
project_path="`pwd`/${project_name}"
scheme="YourProject" #適宜設定して下さい
destination="platform=iOS Simulator,name=iPhone 8 Plus"

if $is_workspace; then
    xcodebuild -workspace $project_path -scheme $scheme -configuration "Debug" -destination "$destination" test
else
    xcodebuild -project $project_path -scheme $scheme -configuration "Debug" -destination "$destination" test
fi

status=$?

if [ $status -eq 0 ]; then
    /usr/bin/osascript -e 'display notification "Test success!" with title "xcodebuild"'
else
    /usr/bin/osascript -e 'display notification "Test failed...orz" with title "xcodebuild"'
fi

exit $status
```

## まとめ
Git便利。
あと、ヒューマンエラーは「起こさないように人間が気を付ける」よりも、「起きないように技術で予防する」ほうがいいよね。
curlコマンドとシェルスクリプトでping的にWebサイトの稼働確認を行う

curlコマンドを定期的に実行してレスポンスとHTTPコードを表示させることで、ping的にWebサイトの稼働確認を行うためのシェルスクリプトです。
後ろの席の人がWebサイトの稼働確認を手作業でやってるのを見て、ついかっとなって作りました。

Webサイトのレスポンスが遅かったり、画面が表示されなかったりする時に、レスポンス時間の平均値やアクセスOK/NG率を定量的に把握することが可能になります。

# スクリプト

```shell
for i in `seq 0 9`
do
  echo -n `date +"%Y/%m/%d %H:%M:%S,"` && \
  echo    `curl -LI http://example.com -o /dev/null -w '%{http_code},%{time_total}\n' -s` ;
  sleep 10 ;
done
```

# 解説

URLの部分(`http://example.com`)を稼働確認したいURLに変えて実行すると以下のような表示が出ます。

```
2018/03/06 19:17:53,200,6.840
2018/03/06 19:18:09,200,1.171
2018/03/06 19:18:21,200,6.570
2018/03/06 19:18:37,200,1.581
2018/03/06 19:18:49,200,1.208
```

カンマ区切りのデータはそれぞれ日時、HTTPレスポンスコード、レスポンス時間です。

``` for i in `seq 0 9` ``` の数字で繰り返し回数を変更できます。この場合は０から９まで、つまり１０回実行されます。
また ```sleep 10``` の数字は待機時間です。単位は秒なのでこの場合は１０秒です。

# 注意点

sleep時間を極端に短くしたり、繰り返し回数を大きくすると、Webサーバに負荷がかかって悪影響を与えることもあるので、その辺を留意の上でお使いください。
batファイルでlinuxパスとWindowsパスを変換する方法

### イントロ
[WSL(Windows Subsystem for Linux)](https://ja.wikipedia.org/wiki/Windows_Subsystem_for_Linux)って使っていますか？？
最高に便利ですよね！

とはいえ，CLIでいろいろ操作するのめんどくさくなってくることもあるかと思います．
そういうときは，batファイルからbashを呼び出すようにすればよいのですが，めんどうなのはパスの扱いです．

### パス変換方法

そんなときに使えるのが下のスニペット

```
set WINPATH=C:\Users\mu-777\Desktop\test.txt
set WSLPATH=%WINPATH:C:=/mnt/c%
set WSLPATH=%WSLPATH:\=/%
echo %WSLPATH%
# /mnt/c/Users/mu-777/Desktop/test.txt
```

1. `WINPATH`にwindowsのパスを入れ，
1. `C:`を`/mnt/c`に置換して`WSLPATH`に入れ，
1. セパレータを`\`から`/`に変換する

という手順で，windows環境のパスをWSL(=linux)のパスに変換でき，
linux側で扱えるようになります．

### 具体的な使い方

これを応用すれば，例えば

```converter.bat
rem @echo off

set INWINPATH=%1
set INWSLPATH=%INWINPATH:C:=/mnt/c%
set INWSLPATH=%INWSLPATH:\=/%

set OUTWINPATH=%~dp1
set OUTWSLPATH=%OUTWINPATH:C:=/mnt/c%
set OUTWSLPATH=%OUTWSLPATH:\=/%

C:\Windows\System32\bash.exe -i ~/converter.bash %INWSLPATH% %OUTWSLPATH%

rem %pause
```

という`converter.bat`ファイルを作ると、
windows環境にあるファイルをこの`converter.bat`にD&Dするだけで，
同じフォルダに`converter.bash`で変換されたファイルができちゃいます．

ffmpegとかwindowsで扱うのめんどいなーと思ってたものとか，今まで作ってきたLinux環境スクリプトがあれば
このbatから呼び出せるようにするだけで，windowsのGUI内だけで完結したlinux処理ができますよ

### まとめ

特にtablet環境だと，キーボード使うのだるい＋D&Dがちょーカンタンの"こうかばつくんだ"状態なので超オススメです．

Enjoy WSL！
最近 vim で編集したファイルを、peco で選択して開く

vim で最近開いたファイルの一覧は `~/.viminfo` に入っているので、これを活用する。

下記のコマンドで、掲題のことが実行できる。

```bash
vim $(egrep '^>' ~/.viminfo | cut -c3- | perl -E 'say for map { chomp; $_ =~ s/^~/$ENV{HOME}/e; -f $_ ? $_ : () } <STDIN>' | peco)
```

## for fish users

自分は fish ユーザーで、 `Ctrl + v` で上記のコマンドを実行したかったので、下記のようにした。

まず関数の定義を作る

```fish:~/.config/fish/functions/peco_open_recent_file.fish
function peco_open_recent_file
    vim (egrep '^>' ~/.viminfo | cut -c3- | perl -E 'say for map { chomp; $_ =~ s/^~/$ENV{HOME}/e; -f $_ ? $_ : () } <STDIN>' | peco)
end
```

config.fish に以下の記述を追加すれば OK 。

```fish:~/.config/fish/confog.fish
function fish_user_key_bindings
    bind \cv peco_open_recent_file
end
```
iOS 11で端のタッチが反応しにくい場合の対処法

iOS 11では，UIViewControllerにpreferredScreenEdgesDeferringSystemGesturesというメソッドが追加されている．
このメソッドで返す値によって，指定した画面の端についてはシステムより優先的にタッチなどのジェスチャを取得することができる．

ここで問題になるのが，iOS 11のマイナーバージョンによる挙動の違いで，iOS 11直後は，このメソッドをオーバーライドしていなくても端のタッチが取れたのだけれど，iOS 11.1以降，このメソッドをオーバーライドしていないと端をタッチした場合にラグが発生し，反応しにくくなった，という感想が来てしまう．

まさかマイナーバージョンの違いでそこまで違いが出るとは思わなかった．
SIGSEGVとSIGILLのあいだ

# はじめに

[この記事](https://qiita.com/kaityo256/items/ae0e1247844570cf0265)で、なぜかメモリの不正アクセスをするとSIGILLが出るコードを見つけたのだけれど、その後、調査を進めて、

```test.cpp
int main(void) {
  __asm__("movl  $0, 0(%rbp,%rdx,1)");
}
```

の一行でSIGILLが出ることがわかった。ここで問題となるのは`%rdx`の値で、これが小さいとSIGSEGV、大きいとSIGILLになるっぽい。`%rdx`のかわりに`%rax`を使ってみよう。

```test1.cpp
int main(void) {
  __asm__("movq  $10000000, %rax");
  __asm__("movl  $0, 0(%rbp,%rdx,1)");
}
```

```shell-session
$ g++ test1.cpp
$ ./a.out
zsh: segmentation fault  ./a.out
```

```test2.cpp
int main(void) {
  __asm__("movq  $10000000000, %rax");
  __asm__("movl  $0, 0(%rbp,%rax,1)");
}
```

```shell-session
$ g++ test2.cpp
$ ./a.out
zsh: illegal hardware instruction  ./a.out
```

というわけで`%rax`に`$10000000`が入ってるとSIGSEGV、`$10000000000`が入ってるとSIGILLが出てるので、その間に境目があるっぽい。

というわけで二分探索でどのあたりに境界があるか調べてみる。

# コード

```test.rb
def output(n)
  f = open("test.cpp","w")
  f.puts "int main(void) {"
  f.puts "__asm__(\"movq  $#{n}, %rax\");"
  f.puts "__asm__(\"movl  $0, 0(%rbp,%rax,1)\");"
  f.puts "}"
  f.close
  system("g++ test.cpp")
end

def search
  s = 10000000
  e = 10000000000
  while (e != s && e != s+1)
    n = (e+s)/2
    output(n)
    `./a.out`
    if $?.to_i == 11
      s = n
      puts "#{n} SIGSEGV"
    else
      e = n
      puts "#{n} SIGILL"
    end
  end
end

search
```

Rubyで外部コマンドを実行した際、エラー終了した時のシグナルは`$?.to_i`で取れる。なんとなく`$?.exitstatus`を使いたくなるが、こちらは正常終了の返り値で、異常終了した場合はnilになるので注意。

# 実行結果

```shell-session
$ ruby test.rb  
5005000000 SIGILL
2507500000 SIGSEGV
3756250000 SIGSEGV
4380625000 SIGSEGV
4692812500 SIGILL
(snip)
4670126427 SIGILL
4670126424 SIGSEGV
4670126425 SIGILL
```

というわけで、4670126424がSIGSEGV、4670126425でSIGILLになった。ただし、実行するたびに結果が微妙に変わる。

また、`movl  $0, 0(%rbp,%rax,1)`を`movl  $0, 0(%rbp,%rax,2)`など、スケールファクターを変えると、その分SIGSEGVとSIGILLの間の値も変わる。

movlのスケールファクターを2にするとこんな感じ。

```
$ ruby test.rb  
5005000000 SIGILL
(snip)
2361903002 SIGSEGV
2361903003 SIGILL
```

概ね半分になった。スケールファクターを4にしてみると境目が1168413942に、8にすると593619583と、だいたいスケールファクター*境目が一定っぽい。

スタックサイズと関係するのかと思ったが、limitで値を変えてみても影響はないようだ。

# まとめ

Macで不正なmovl命令を出すことでSIGILLを出す現象を調べてみた。メモリの不正アクセスなのだから、SIGSEGVかSIGBUSを出すのが妥当だと思うのだが、なぜSIGILLを出すのか理解不能。Macでは[SIGSEGVとSIGBUSの区別がいいかげん](https://togetter.com/li/253717)という指摘もあり、それに関連するのかと思ったが、さすがにSIGILLを出すのは変だと思うのだが。

# 関連記事

* [x86でbus errorを起こす](https://qiita.com/kaityo256/items/fadffae00e517efbc8aa)
[レアケース]AWSルートアカウントでログインできなくなった時の対処法

# 概要
　
　自部門で2つのAWSアカウントを使用しています。AWSからの通知メールを一つのメールアドレスに寄せれるように変更したところ、1つのアカウントでルートアカウントでのログインができなくなりました。
　原因としては、当たり前のことですがAWSは**「アカウント」＝「メールアドレス」**になっているため、同じメールアドレスで複数のAWSアカウントを持つことはできない。これは以前から知っていましたが、AWSコンソールのアカウント画面で↓下記の画像のように表示されていたら、アカウント名（名前）とメールアドレスが分離されているから設定変更しても問題ないと思ってしまったのは私だけでしょうか・・・　
![change-account.png](https://qiita-image-store.s3.amazonaws.com/0/30522/06f2f614-d489-2827-0372-b7f32b80a898.png)

　結局（作業ユーザで）AWSサポートのケースで問い合わせして、解決方法を教えて頂きました。

# 整理

以下のようにアカウント1のメールアドレスをアカウント2に変更しました

アカウント1： aaaaa@abc.com → bbbbb@abc.com
アカウント2： bbbbb@abc.com


# 対処法

さてさて愚痴はこのぐらいにして、対処法について紹介したいと思います。
サポートからの連絡をそのままｗ

1. Your Account (http://www.amazon.com/your-account) にアクセスいただき、画面右上の ”Account & Lists”より、  
   現在の登録メールアドレス( **bbbbb@abc.com** )を使用して Amazon.com へサインイン  
   ※元々使用されていたパスワード( **アカウント1のパスワード** )をご入力ください  
　パスワードが不明な場合、「Forgot your password?」よりパスワードリセットをお試しください
2. 「Login & Security」の項目を選択ください
3. E-mailの横の"Edit" ボタンから以前登録されていたメールアドレス( **aaaaa@abc.com** )へご変更ください
4. "Save Changes"から保存→変更完了です
5. 画面右上の ”Account & Lists” にカーソルをあわせていただき、”Sign Out” を選択してAmazon.com からサインアウトをお願いします
6. 元に戻したメールアドレス( **aaaaa@abc.com** )をご利用いただき、AWSへサインインを実施し、以前からご利用されていたアカウントへアクセスが可能になります

# 教訓

- UIに惑わされるな！
- AWSユーザなら当たり前ですが、IAMユーザで運用していると、いざという時に何かと助かる
C++ Builder XE4 > IDE | UI > コンポーネントの名前をコピーする手順 x 2

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

### 処理

実装対象とするコンポーネントの名前をコピーして、コードやドキュメントに使いたいとき、どのようにするか？

### 方法1. オブジェクトインスペクタ使用

1. コンポーネントを選択する
2. オブジェクトインスペクタでNameプロパティを探す
    - スクロールを使う
3. Name内の文字列を選択する
4. Ctrl+c

### 方法2. 外部エディタ使用

1. コンポーネントを選択する
2. Ctrl+c
3. 外部エディタにペースト
    - Ctrl+v
4. ペーストした文字列のうち、名前をダブルクリック
5. Ctrl+c

### 方法の差異

- 方法1の作業時間 (およその測定)
    - 5秒程度
    - スクロールという不定な作業が入る
        - 探す
    - オブジェクトインスペクタの「表示する項目」の選択状態によりNameが表示されていない場合があり、さらに時間がかかる
- 方法2の作業時間 (およその測定)
    - 5秒程度
    
方法2だとコーディング作業のフロー状態を維持しやすい実感がある。

### Tokyo

[C++ Builder 10.2 Tokyo > IDE > オブジェクトインスペクタ > 検索できるようになっている | UI: 構造の記憶を強いるUIかどうか](https://qiita.com/7of9/items/6fcf0c1147da31b04fc4)

Rad Studio 10.2 Tokyo Update 2ではオブジェクトインスペクタにおいて検索できるようになっている。
XE4よりは使いやすいだろう (推測)。

### その他の方法

コード補完機能を使う。

- 名前の部分文字列を知っておかないといけない
- XE4では補完機能が動かない時がある
webpackerでbabel-polyfillを有効化する

# 環境

```
react-rails(2.4.3)
webpacker(3.2.2)
```

# 事象
webpacker + react-rails を使っていたのですが、古いAndroid系ブラウザで動いてなかったので調査しました。

# 結論

webpackerにはbabel-polyfillがデフォルトで含まれていますが、
それを利用するためにはエントリーポイントに以下の一行を追加する必要があります。

```js:application.js
import "babel-polyfill"
```

あとはビルドし直せばOKです。

webpackerでは最初からbabelが組み込まれており、特に意識することなく利用できますが、、、
それゆえにハマりポイントも多いですね :sweat_smile: 

以上です。

# 参考
- [webpacker/es6.md at master · rails/webpacker](https://github.com/rails/webpacker/blob/master/docs/es6.md)
- [Webpacker 3ではじめるRailsエンジニアのためのモダンフロントエンド入門 〜Sprocketsを使わないRailsプロジェクト試案〜 | blog.tai2.net](https://blog.tai2.net/webpacker3.html)
- [rails/webpacker: Use Webpack to manage app-like JavaScript modules in Rails](https://github.com/rails/webpacker)
- [reactjs/react-rails: Integrate React.js with Rails views and controllers, the asset pipeline, or webpacker.](https://github.com/reactjs/react-rails)
bookdownでRmdファイルをｻｯとまとめてGitHubで公開する

※この記事の内容にセクションを少し加えたページをサンプルとして公開してある→[bookdown_test](https://nozma.github.io/bookdown_test/)

## はじめに

とりあえず細かいセッティングは抜きにして手元のRmdファイルをGitHub上に公開したい、という気持ちだったので最低限の手順をまとめた。

## bookdownとは

R Markdownからドキュメントを作成するパッケージで、通常のR Markdownに対して(というかPandoc Markdownに対して)長編のドキュメントを生成するのに便利な機能が付け加えられている。図表や数式へのナンバリング、相互参照、複数ページのHTML出力などなど。

必ずしも本を書かなくてもいいし、R Markdownじゃなくて普通のMarkdownでも扱えるので、Rのコードを全く含まないポエムを書いたって全く構わない！

## 事前準備

- `bookdown`パッケージをインストールしていなければインストールしておく。

```r
install.packages("bookdown")
```

- githubで新規リポジトリを作成する。
- RStudioから`New Project -> VersionControl -> Git`と選択し、Repository URLに先程作成したリポジトリのURLを指定、新規プロジェクトを作成する。

## Rmdファイルについて

- デフォルトではプロジェクトのトップディレクトリに配置されたRmdファイルが結合されたのち、Knitされる。
    - 全てのRmdファイルが1つのRmdファイルとして評価されるので、例えば設定用のコードチャンクは先頭のファイルに1回書いてあればよい。
    - チャンクラベルが重複しないように注意する必要がある。
- デフォルトではRmdファイルの結合順序は名前順である。
    - ファイル名の先頭に数字を入れると良い。例えば`01_first.Rmd`の次は`02_second.Rmd`といった具合に。
    - ただし、`index.Rmd`というファイルがあれば、常に最初のファイルとして使用される。
    - アンダースコア`_`から始まるファイルは無視される。
    
注: 上記の挙動は当然変更できるが、ここでは説明しない。

## YAMLフィールドの指定

各種の設定は最初のRmdファイル(前述の通り、通常は`index.Rmd`)のヘッダーにYAMLフロントマターとして記述する。以下に最低限の記述を示す。

```yml
---
site: bookdown::bookdown_site
output:
  bookdown::gitbook: default
---
```

- `site: bookdown::bookdown_site`は`bookdown::render_book()`を呼び出すために必要な設定らしい。
- `output`フィールドで出力形式を指定する。
- `site`フィールド以外は別途`_bookdown.yml`というファイルを用意して、そこに記述することもできる。
- 一部の**bookdown**に関連した設定は`_bookdown.yml`からしか読み込まれないので記述しなければならない。GitHubで公開しようとすると出力先ディレクトリを指定する必要があるので、実質`_bookdown.yml`は必須である。
- `_bookdown.yml`の`output_dir`で出力先ディレクトリを指定する。GitHubでサイトとして公開するためには`docs/`以下に出力する必要があるので、最低限以下の設定が必要となる。このとき、`---`は不要である。なお、行末に改行が無いと怒られる(ビルドはできる)。

```yml:_bookdown.yml
output_dir: docs

```

`output`フィールドの内容は時に長くなるのと使いまわしたくなるので、別途`_output.yml`というファイルに記述しても良い。このとき前後の`---`が不要なのに加えて、`output:`も省略して下のフィールドから書き始める。例えば先程のフロントマターの内容を`_output.yml`に記述するなら次のようになる。

```yml:_output.yml
bookdown::gitbook: default

```

## ビルド

- BuildタブのBuild Bookをクリック。
    - Buildタブが無い場合はファイルを保存してRStudioを開き直すと出る。多分。
    
## 公開

- GitタブからCommitしてPush
- GitHubのリポジトリページを開き、Settingsタブの下の方のGitHub PagesのSourceをmaster branch /docs folderに変更してSave
- 今設定したGitHub　Pagesの欄に"Your site is published at ..."と説明が出ているので、そこからリンク先へ飛ぶとdocsフォルダ以下の内容が公開されている。
    - Save直後は404が表示される。反映まで10分くらいかかることがある。
環境変数ファイルで定義されたディレクトリ構造をS3バケット上に再現するシェルを書いた

## モチベーション

設定ファイルでバケット名などを環境変数にセットするケースがあると思います。（`source` コマンドなどで読み込むイメージ）
しかし、対象のバケットを環境ごとに生成するのは手間がかかります。
そこで、設定ファイルに定義されている環境変数からバケットを自動で生成するよなシェルを作成します。

### 設定ファイルのフォーマット

バケット内に生成したいディレクトリが順に定義されているものとします。
下階層のディレクトリの場合はルートからのディレクトリパスを用います。

```shell

R_DIR=rr-rr/
S_DIR=rr-rr/ss-ss/
```

## IAM ユーザ作成とCLI設定

IAMでユーザをつくっておきます。
CLIからのアクセスのみを許可するユーザを作りました。
S3へのFullAccessのポリシーをアタッチします。

AWS CLIにプロファイルを設定します。

```shell

$ aws configure --profile hoge
```

リージョンは東京で設定しました。

```
AWS Access Key ID [None]: A******************Q
AWS Secret Access Key [None]: Z**************************************K
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

設定したユーザをプロファイルとしてAWS CLIを使用します。

```shell

$ export AWS_PROFILE=user2
```

## バケットの作成

```shell

$ aws s3 mb s3://bucket-name
```

***TODO: `BucketAlreadyExists` によるエラーなどのハンドリング*** 

## シェル

### スクリプトの方針

設定ファイルからバケット上に構築したいディレクトリの構造を一度ローカルに生成し、これを `aws s3 sync` を使ってS3のバケット上に写像します。

```shell:init-bucket.sh

#!/bin/bash

BUCKET_NAME="$1"
CONF_FILEPATH="$( cd "$(dirname "$0")" ; pwd -P )"/"$2"

mkdir tmp-sync-dir/
cd tmp-sync-dir/

cat $CONF_FILEPATH | grep -v '^\s*#' | grep -v '^\s*$' | cut -f2 -d'=' | xargs mkdir -p

find . -type d | xargs -I{} touch {}/.dummy

aws s3 sync . "s3://$BUCKET_NAME"

cd -

rm -r tmp-sync-dir/
```

### シェルの実行

```
sh init-bucket.sh bucket-name path/to/config.txt
```

### S3での空ディレクトリの扱いについて

S3にはディレクトリという概念が存在しない。
AWS CLIでディレクトリを `sync` する場合、この空のディレクトリはコピーされない。
そこで、ここではディレクトリの中に、 `.dummy` というファイルを作ることでこの問題を回避している。

### コマンドの利用に関して

それぞれのPOSIXなコマンドの使い方に関しては、より良い実装方法があると思う。

* BSD系では `pwd -P` でのシンボリックリンクの追跡が正常に動かないとかいう話があった気がする。
* `grep -v '^#\s*$'` でコメント行を無視（`-v` オプションは除外）
* `grep -v '^\s*$'`  で空行を無視
* `cut -f2 -d'='` で変数定義したい値を取得
* `mkdir -p` オプションでサブディレクトリを作成
* `xrags -I{} touch {}/.dummy` `-I`オプションで`xargs`の値を変数化できる
`typeof().Name`は同じものを返さない！？

# 現象

## `nameof()` は同じ参照を返す

```csharp
csharp> object.ReferenceEquals(nameof(Object), nameof(Object))
true
```

## 一方で`typeof().Name`は参照が異なる

```csharp
csharp> object.ReferenceEquals(typeof(Object).Name, typeof(Object).Name)
false
```

```csharp
csharp> object.ReferenceEquals(nameof(Object), typeof(Object).Name)
false
```

```csharp
csharp> object.ReferenceEquals(typeof(Object).Name, nameof(Object))
false
```

## とにかく`Type`型の`Name`プロパティは参照が異なる

```csharp
csharp> var t = typeof(Object)
csharp> object.ReferenceEquals(t.Name, t.Name)
false
```

## `GetType()`は同じものを参照してくれるっぽい

```csharp
csharp> var t = typeof(Object)
csharp> object.ReferenceEquals(t.GetType(), t.GetType())
true
```

## 一方で`GetType()`と`typeof()`は異なる

```csharp
csharp> var t = typeof(Object)
csharp> object.ReferenceEquals(t.GetType(), t.GetType())
true
csharp> object.ReferenceEquals(t.GetType(), typeof(Object))
false
csharp> object.ReferenceEquals(typeof(Object), typeof(Object))
true
```

# 結論（ゆるい）

や～これなんか、ビックリした。

なので、クラス名を取得したい時はなるべく、コンパイル時に解決する `nameof()` を使いたい気持ちになった。
Ubuntuの初期設定覚え書き

### ***前提環境***
- Ubuntu 16.04 on Parallels Desktop Lite


### ***First Step***

- リポジトリを日本のサーバー(JAIST)に変更
 - `sudo sed -i.bak -e "s%http://[^ ]\+%http://ftp.jaist.ac.jp/pub/Linux/ubuntu/%g" /etc/apt/sources.list`


- リポジトリ全体をアップデートする
 - `sudo apt-get update`


- インストールされているソフトウェアをとりあえずアップデート
 - `sudo apt-get upgrade`


- システムを再起動する
 - `sudo shutdown -r now`



### Installing  > ***Robot Operating System***

- ROSのリポジトリをインストール
 - `sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'`


- 鍵をインストール
 - `sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116`


- aptをアップデート
 - `sudo apt-get update`


- ROSパッケージをインストール
 - `sudo apt-get install ros-kinetic-desktop-full`

### Install > *** ROS System dependencies manager***
- Initialize
 - `sudo rosdep init`


- Update
 - `rosdep update`


- add source to bash
 - `echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc`


- bash config reload
 - `source ~/.bashrc`


- ROS Setup bash
 - `source /opt/ros/kinetic/setup.bash`


### Installing > ***ROS Python packages***
 - `sudo apt-get install python-rosinstall python-rosinstall-generator python-wstool build-essential`


### Creating  > ***ROS Workspace***

- bash setup
 - `source /opt/ros/kinetic/setup.bash`


- Make a workspace directory
 - `mkdir -p ~/catkin_ws/src`


- Going to workspace directory
 - `cd ~/catkin_ws/`


- catkin setup
 - `catkin_make`


- bash setup
 - `source devel/setup.bash`


- reference PATH
 - `echo $ROS_PACKAGE_PATH`

### Installing > ***Arduino IDE***
- Get Arduino Packages
 - `sudo apt-get update && sudo apt-get install arduino arduino-core`


### Installing > ***NextCloud Sync Client App***
- Add Repository by ppa
 - `sudo add-apt-repository ppa:nextcloud-devs/client`


- aptをアップデートしてPPA経由でnextcloudのsyncクライアントをインストール
 - `sudo apt-get update && sudo apt-get install nextcloud-client`



### Installing > ***Google Chrome Installing***

- Keyをダウンロード
 - `wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -`


- debファイルのリポジトリをインポート
 - `sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'`


- アップデート
 - `sudo apt-get update`


- Google Chromeをダウンロード
 - `sudo apt-get install google-chrome-stable`


- 重複するソースを削除
- `sudo rm -rf /etc/apt/sources.list.d/google.list`





### Installing >  ****.deb Packages***

-  *.deb Packagesを`~/Downloads`にダウンロード


- ~/Downloadsディレクトリに移動
 - `cd ~/Downloads`


- dpkgでdebパッケージをインストール
 - `sudo dpkg -i *.deb`


- 不要なパッケージを削除して、依存関係をインストール
 - `sudo apt autoremove && sudo apt-get -f install`
serverless frameworkでswaggerで定義したAPI GatewayとLambdaをデプロイする方法

# はじめに

# 準備
AWS CLI、Node.js、serverless frameworkのインストールをしておきます。
AWS CLIは設定とかも完了していること。
それと、このプロジェクト用にディレクトリを作っておきます。ここで作業します。

```bash:console
$ pwd /Development
$ mkdir serverless
$ cd serverless
```

# プロジェクトの作成
Lambda関数のpython3のテンプレートを使用
sls-testという名前で作成

```bash:console
$ sls create -t aws-python3 -p sls-test
Serverless: Generating boilerplate...
Serverless: Generating boilerplate in "/Development/serverless/sls-test"
 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v1.26.1
-------'

Serverless: Successfully generated boilerplate for template: "aws-python3"

$ cd sls-test
```

# Lambda関数
とりあえず適当な文字を返すだけでいいので以下に書き換える

```python:hello.py
def hello(event, context):
  message = 'serverless test'
  return message
```

# swaggerファイル
/apiのみのシンプルな構成です。
リージョンは東京です。
\<api name\>や\<account id\>は適宜置き換える。
\<lambda function name\>はあとでserverlessの設定ファイルで一致させる必要があります。
変数的なもので置き換えられるなら誰か教えてください。

```yaml:swagger.yaml
swagger: "2.0"
info:
  version: "1.0.0"
  title: "<api name>"
paths:
  /api:
    get:
      consumes:
      - "application/json"
      produces:
      - "application/json"
      responses:
        200:
          description: "200 response"
          schema:
            type: string
          headers:
            Access-Control-Allow-Origin:
              type: "string"
      x-amazon-apigateway-integration:
        responses:
          default:
            statusCode: "200"
        uri: "arn:aws:apigateway:ap-northeast-1:lambda:path/2015-03-31/functions/arn:aws:lambda:ap-northeast-1:<account id>:function:<lambda function name>/invocations"
        passthroughBehavior: "when_no_match"
        httpMethod: "POST"
        contentHandling: "CONVERT_TO_TEXT"
        type: "aws"
```

# 設定ファイルの編集
serverless.yml
最初はほとんどコメントアウトされていて

```yaml:serverless.yml
service: sls-test
provider:
  name: aws
  runtime: python3.6
functions:
  hello:
    handler: handler.hello
```

これぐらいしか有効になっていないのでコメント外したり
追加したりしていきます。


```yaml:serverless.yml
service: sls-test
provider:
  name: aws
  runtime: python3.6
  region: ap-northeast-1
functions:
  hello:
    name: <lambda function name>
    handler: handler.hello
resources:
  Resources:
    ApiGatewayRestApi:
      Type: AWS::ApiGateway::RestApi
      Properties:
        Body: ${file(../swagger.yaml)}
#        BodyS3Location:
#          Bucket: <bucket name>
#          Key: swagger.yaml
```


functionの名前は任意、他の設定などで使用しなければなんでもいい。
handlerは
\<ファイル名(.pyを除く)\>.\<関数名\>
です。

```yaml
functions:
  hello:
    events:
      http:
        path: api
        method: get
```
こんな感じでAPI Gatewayを設定するとswaggerと衝突するので注意。
特にリソース名を同一にしたとき。

swagger仕様はインラインでも記述可
S3に保存しているswaggerを使用する場合は
BodyS3Locationで指定。

# デプロイ
```bash:console
$ sls deploy
```

# まとめ
Androidアプリ内で作ったデータベースを確認したい

## はじめに
Androidのバージョンによって、方法が異なる（っぽい）
細かい検証はしていないが、簡単に言うとAndroid7（くらい）で出来ていた方法が、機種変更した（Android8）ら出来なくなった。
色々調べる前に、ひとまず確認できた方法をメモしておく。

## Android7あたりまで出来ていた方法

```
adb shell
run-as ［パッケージ名］
cp databases/［データベース名］.db /［端末のアクセスできる場所］/［データベース名］.db
exit
exit
adb pull /［端末のアクセスできる場所］/［データベース名］.db C:\［ローカルの適当なパス］\［データベース名］.db
```

## Android8.0.0でとりあえず出来た方法

```
adb shell "run-as ［パッケージ名］ chmod 777 /data/data/［パッケージ名］/databases/［データベース名］.db"
adb shell "cat data/data/［パッケージ名］/databases/［データベース名］.db > /［端末のアクセスできる場所］/［データベース名］.db"
adb pull /［端末のアクセスできる場所］/［データベース名］.db C:\［ローカルの適当なパス］\［データベース名］.db
```

+ `chmod 666`だと、パーミッション足りないって言われた
なぜあなたのコードは汚いのか？


## "汚い"の定義

- しばらくすると自分でも難解な
- 他人が読んで難解な

## スパゲッティではないきれいで簡素なコードを書くコツ

- コメントに頼る前に、変数名や関数名で説明を。
    - この時みんなの共通認識の単語の中で命名すること。 例: `add, run, remove, play, stop`
    - シンプルに命名できない場合、新しいクラスを用意すること。
        - 新しいクラスが主語となり自然言語に近い（=可読性が上がる）。例: `mailServer.send()`
        - そもそもオブジェクト指向とはそういうものだ。

上記のことが出来れば自然と以下ができている。

- 関数はファットにしすぎない
  - 数行程後で納まるようにする
  - それ以上増える場合は細分化する

その他のヒントとして

- 関数には動詞で命名を
- 変数には名詞で命名を
- 配列なら複数形で命名を。例: `apples, elements, data`
    - dataの単数形は `dat`
    - 連想配列は単数で良い。例: `dat.elements[2].style.backgroundColor`
- 関数内で別の関数を呼ぶのを極力避ける
  - でないと関数間の依存性が強くなりすぎる
  - 表層の関数にとっても子孫関数が何をしているのかわからないので読み解くのが大変（=改修が大変）
chatworkにメッセージを送るワンライナーとrubyスクリプト



環境変数のAPI_KEYにチャットワークのAPIが入っている前提です。
export API_KEY=XXXXXXとか実行してください。
ルーム番号とメッセージは適宜書き換えてください。


# ワンライナー

```ワンライナー
curl -X POST -H "X-ChatWorkToken: $API_KEY" -d "body=`ruby -e 'require "cgi";print CGI.escape("メッセージ")'`" "https://api.chatwork.com/v2/rooms/ルーム番号/messages"
```

# rubyスクリプト

./chatwork.rb ルーム番号 "メッセージ"

```chatwork.rb
#!/usr/bin/env ruby

require 'net/https'

def post_chatwork_api(room_id, message)
  url = "https://api.chatwork.com/v2/rooms/#{room_id}/messages"
  uri = URI.parse(url)
  https = Net::HTTP.new(uri.host, uri.port)
  https.use_ssl = true # HTTPSでよろしく
  request = Net::HTTP::Post.new(uri.request_uri)
  request.add_field "X-ChatWorkToken", ENV["API_KEY"]
  request.set_form_data :body => message
  response = https.request(request)
  puts response.body
end

post_chatwork_api ARGV[0], ARGV[1]
```

# API_KEYの取得方法　

チャットワークAPIは [APIトークン発行ページ](https://www.chatwork.com/service/packages/chatwork/subpackages/api/token.php)から取得できます。


# ルーム番号のとり方

![ルーム番号.png](https://qiita-image-store.s3.amazonaws.com/0/75491/a0b7460d-ec4d-0503-1367-e5a5d31cb309.png "ルーム番号.png")

該当するルームのチャットの発言でメッセージにある「リンク」をクリックすると出て来る
https://www.chatwork.com/#!ridNNNNNNN-XXXXXXXXXXXXXX
にある、ridと-の間の所がルームIDです。
render-prop で お手軽な状態管理層を作る

## 同期

ちょっとした状態を作るのに `extends React.Component` したくない。状態を隠蔽したHOCも書きたくない。

かつそれでいてある程度宣言的にしたい。

render-props で実装すれば良いのでは？

## 実装

```js
/* @flow */
import React, { type Node } from 'react'

// Generic State Manager
export default class WithState<State> extends React.Component<
  {
    initialState: State,
    render: (State, ((State) => State) => void) => Node
  },
  State
> {
  constructor(props) {
    super()
    this.state = props.initialState
  }
  render() {
    return this.props.render(this.state, this.setState.bind(this))
  }
}
```

## 使い方

```js
type State = { value: number }
const initialState: State = { value: 0 }

<WithState
  initialState={initialState}
  render={(state: State, update: ((State) => State) => void) => {
    return (
      <span onClick={() => update(s => ({...s, value: s.value + 1}))}>
        {state.value}
      </span>
    )
  }}
/>
```

ちゃんと作ったりすると reducer の中に押し込んだりするんだけど、デバッグ中や小さい状態管理に便利
Holoviewsでjupyter notebook上に無理やりplotする


holoviews自体の説明はqiita内を検索してください。
matplotlibでいうshowのようなものがないのでloop中でplotする方法わからず困っていた。

hv.ipython.display()を使えばよい

```
import holoviews as hv
hv.extension('bokeh')
%matplotlib inline


# データ生成
import numpy as np
x = np.linspace(-np.pi, np.pi, 100)
plot_obj = hv.Curve((x, np.sin(x)))

for i in range(5):
	hv.ipython.display(plot_obj)
```
【 Visual Studio Code 】のターミナルの背景を痛く出来ないか試してみた

##はじめに

※20/1/8追記
新しくVSCodeのターミナルの背景を変更する記事を書きました！
今度はtabごとに画像を変えたり、split機能で分割されたターミナルにそれぞれ画像を当てたりしています！
詳しくはこちら！
[【 Visual Studio Code 】痛ターミナル化計画　そのに！](https://qiita.com/chado/items/ce0d12e280e31d8acfa7)


###今回に至るまでの流れ

「VSCodeを痛くしたい、でもいったいどうすればいいんだ！」
[workbench.colorCustomizationsを用いた痛Visual Studio Code化計画](http://artfulplace.hatenablog.com/entry/2017/05/21/115110)
「cssをいじるだけで背景を変更できるのか。これ、ターミナルもいじれないかな。」

というわけでやってみた



##その1 cssファイルを探そう!
まずVSCodeを起動します（こいつを起動しなきゃ何も始まらないからね）

タブの「ヘルプ」→「開発者ツールの切り替え」を順にクリックしてデベロッパーツールを有効化
デベロッパーツールを駆使してcssファイルの場所を探しましょう

![ソース位置.png](https://qiita-image-store.s3.amazonaws.com/0/202504/2a33fd94-9146-3198-a98f-f0e3c3691d54.png)

\Microsoft VS Code\resources\app\out\vs\workbench\workbench.main.css
にありますね
レッツ、オープン！

![わけわかめ.png](https://qiita-image-store.s3.amazonaws.com/0/202504/f4ac6fb2-e060-0684-b5b5-e66963770210.png)

？？？？
わけわかめ

##その2 ターミナルの要素を探そう！

どうせ中身はcssなんだ、上書きすれば問題なし！

ということで次はターミナル背景をいい感じにつけられそうな要素を探しましょう！
探す方法は簡単！ターミナルの要素に片っ端からbackground-colorを突っ込んでいくだけ！
背景の色が変わればそれがあたりなのだ！

![要素多すぎぃ！.png](https://qiita-image-store.s3.amazonaws.com/0/202504/c2a9d371-8d38-4063-6b57-6592a3124b4b.png)

ターミナルの要素多くね・・・？

##その3 cssを調整しよう！

いろいろ試した結果、どうやら「xterm-link-layer」という ~~id~~ classの付いた要素がよさそう
※18/3/9追記
3/8の更新で、上記の要素がclassに変更されました。~~投稿して1日で使用不可とか･･･~~

という訳で早速いろいろcssを直当てしてみよう
![5.png](https://qiita-image-store.s3.amazonaws.com/0/202504/e65fa4d2-280d-f331-2c9f-9fe0c6b4f097.png)

手元の画像がペンギンしかねぇ･･･
しかも、上に被っちゃって文字がみえねぇ･･･
もぅﾏﾁﾞ無理。透過しよ･･･

![透過後.png](https://qiita-image-store.s3.amazonaws.com/0/202504/a2467f93-47df-b5f1-1173-b70473b4c0ba.png)
うむ、いい感じ


##その4 変更を保存しよう！
調整が終わったらworkbench.main.cssの末尾に調整したcss

```css:css
/*呪文の最後に記述*/
.xterm-link-layer {
  opacity: 0.1;
  background-image: url(痛画像URL);
  background-size: cover;
/*他調整内容*/
}
```
と入力して上書き保存、再起動して反映されていれば完成！
※workbench.main.cssを上書きするときは管理者で保存してください。

##まとめ
これを応用すれば、ターミナル以外の箇所も自分好みに作り変えられる！
みんなも自分だけのVSCodeを作ってみよう！

ふと思ったんだけど、あらかじめ透過した画像を使うならもう少し別の方法があったかも？

##**※注意点**
リンクレイヤーに画像をはめているため、ターミナルに表示されるリンクの下線が消えます。
それでも問題ない、という人だけ適用してください。

※18/3/7追記
VSCodeのウィンドウを拡縮した際にターミナルの文字が非表示になることがあります。
発生した場合は、一度ターミナルを開きなおすことで解消されるようです。（CTRL+@）
※18/3/8追記
VSCodeをアップデートすると、workbench.main.cssがリセットされます。
再度cssを上書きしてください。

※18/3/9追記
3/8の更新で、xterm-link-layer要素がidからclassに変更されました。

※19/5/30追記
VSCodeのversionが1.34になったことでDOM構造に変更があったようです。
1.34対応版はこちら
https://qiita.com/moritanian/items/fb444c13f2f799cf0959

※20/1/08追記
新しくターミナル背景設定記事を書きました！
[【 Visual Studio Code 】痛ターミナル化計画　そのに！](https://qiita.com/chado/items/ce0d12e280e31d8acfa7)
SolidityにおけるContractの仕様

##コントラクトの作成

solidityにおけるコントラクトはオブジェクト指向言語におけるクラスのようなものである。コントラクトはトランザクションもしくは他のコントラクトを通して作られる。Ethereumでコントラクトを作成するには、JavaScript API web3.jsを使用する。コントラクト作成を容易にするweb3.eth.Contractというメソッドが存在するからだ。コントラクトが作成されると、コンストラクタ（コントラクトと同じ名前の関数）が1回実行される。内部的には、コンストラクタの引数は、契約自体のコードの後にエンコードされたABIに渡されるが、web3.jsを使用する場合は、このことを気にする必要はない。コントラクトが別のコントラクトを作成する場合作成されたコントラクトのソースコード及びバイナリを作成したコントラクトに知らせなければならない。

##visibility

solidityには２種類の関数呼び出し(内部呼び出し、外部呼出し)が存在し、4種類の関数と変数のvisibilityがある。関数にはexternal,public,internal,privateを設定可能でデフォルトはpublicである。変数にはpublic,internal,privateを設定可能でデフォルトはinternalである。

- external
他のコントラクトやトランザクションから呼び出すことが可能。内部的に呼び出すことができない(つまりf()は機能しないが、this.f()は機能する)。大規模なデータ配列を受け取るのに適している。

- public
内部的にまたはメッセージ経由で呼び出すことができる。public変数の場合自動でgetter関数(getdata())が生成される。

- internal
内部的にのみ呼び出すことができる(現在のコントラクトもしくはそれから派生したコントラクト）。

- private
定義されているコンストラクトのみで利用可能。派生したコントラクトでは使用できない。

##modifier
modifierを使って関数の実行の前に自動的に状態をチェックすることができる。"_"の後に関数内の処理が続く。

##viewとpure
関数はviewを宣言することができ、その場合状態を変更しないことを約束する。以下は状態を変更するとみなされる。

- 状態変数への書き込み

- イベントを出す

- 他のコントラクトを作成する

- selfdestructの使用

- call経由でEtherを送信

- viewまたはpureが宣言されていない関数を呼び出す

また関数はpureを宣言することができ、その場合状態を読み書きしないことを約束する。上記の状態の変更とみなされる操作に加えて以下の状態の読み取りとみなされる操作を行わない。

- 状態変数からの読み込み
- this.balance,address.balance
- block,tx,msgのメンバーへのアクセス(msg.sigとmsg.dataを除く)
- pureとマークされていない関数を呼び出す

##名前のない関数

コントラクトは名前のない関数を一つだけ取ることができる。この関数は引数を持たず何も返さない。ほかの関数が指定された関数識別子と一致しなかった場合もしくはEther(データなし)の送金を受けた場合に実行される。Etherを受け取るにはpayableを宣言する必要がある。


##参考
http://solidity.readthedocs.io/en/develop/contracts.html#low-level-interface-to-logs
Insight REST API でモナコインのトランザクションを調べる

漢ならモナコインのトランザクションを REST API で取得したいですね!

やりましょう!

## Insight API

https://github.com/bitpay/insight-api

ここにあります.

## Insight サービス

モナコインの Insight サービスはいくつかありますが, とりあえず

mona.chainsight.info

を使ってみます. ここでは直接 API については言及していませんが, insight をそのまま動かしているなら API で叩けると予想できます.

bitpay insight のページを参考に, API エントリポイントを推定し(今回は `api`, くっつけてクエリしてみます.

https://mona.chainsight.info/api/tx/ce4f1fcbc78be4c68aaef689238c85425c703c39bd2a60826f06232a42722314

```
{"txid":"ce4f1fcbc78be4c68aaef689238c85425c703c39bd2a60826f06232a42722314","version":1,"locktime":0,"vin":[{"coinbase":"0304481304554f9e5a08080022da070000000d2f6e6f64655374726174756d2f","sequence":0,"n":0}],"vout":[{"value":"25.00166018","n":0,"scriptPubKey":{"asm":"OP_DUP OP_HASH160 20a292d73cb62ba3c50f27081c4369fd461bb1f3 OP_EQUALVERIFY OP_CHECKSIG","reqSigs":1,"type":"pubkeyhash","addresses":["MAsicP1ZQKQtsJQbCuVM8mqZBuCm3RmMTY"]}}],"blockhash":"f9bb2bda8cf47930d168c3c638a6cf7f0d6054c746f225065ba9cb695f72dc84","confirmations":1,"time":1520324437,"blocktime":1520324437,"isCoinBase":true,"valueOut":25.00166018,"size":117}
```

Voila! 無事取得できました.

## TODO

* Rate limit に引っかからないようにする
* 自前で insight サーバを立て, クエリ中にユーザの CPU リソースでマイニングしてサーバと帯域代を捻出するスキームを確立したい.
swiftでiOS 10のみうまくローカル通知が動作しない問題


```swift:localpush.swift
import UIKit
import UserNotifications // pushを使用するためにインポート
 
class ViewController: UIViewController {
 
    override func viewDidLoad() {
        super.viewDidLoad()
         
        // 通知を使用可能にする設定
        let center = UNUserNotificationCenter.current()
        center.requestAuthorization(options: [.alert, .badge, .sound]) { (granted, error) in
            if granted {
                print("Allowed")
            } else {
                print("Didn't allowed")
            }
        }
         
        // 通知設定
        let content = UNMutableNotificationContent()
         
        content.title = NSString.localizedUserNotificationString(forKey: "通知タイトル", arguments: nil)
        content.body = NSString.localizedUserNotificationString(forKey: "通知するメッセージ", arguments: nil)
        content.sound = UNNotificationSound.default()
         
        // アプリを起動してから3秒後に通知を送る
        let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 3, repeats: false)
         
        let request = UNNotificationRequest(identifier: "Identifier", content: content, trigger: trigger)
         
        // 通知を登録
        center.add(request) { (error : Error?) in
            if error != nil {
                 print("error: \(error as AnyObject)")
            }
        }
    }
}
```

UNMutableNotificationContent()で通知の設定をする際
タイトルとボディとサウンドのうちタイトルだけでいいやと思って他を設定せずにやっていました。
するとiOS11では正常に動作していたのに
iOS10だと・・・あら不思議通知が来ません・・・
どうやら全部空でも設定してあげないとダメみたいです！
aws-sdk-mockを使ってdynamoのテストをする方法

入社して1年になろうとしている中、やっとdynamo周りのテストを書く気になりました。
今までdynamo周りのテストは本番テーブル見に行くの良くないしテスト書くの苦手だしテストにdynamoDB local用意するのは面倒だし...って言い訳をいっぱい作ってサボっていたのですが **aws-sdk-mock** なるものがあるとのことだったので使ってみました。
今回のテストは **ava** を使っています。
## テーブルの内容
今回デモのテーブルとしてパーティションキーを `user_id` として以下のような構造にしています。
そしてやりたいこととしては指定したユーザーIDの名前と年齢を取得する、というものです。

| user_id | name | age|
|:-:|:--:|:-:|
|1|yamada|18|
|2|suzuki|20|

## 本番のコード
```models/demo.js
const AWS = require("aws-sdk");
class Users {
	constructor() {
    this.table = "demo";
    this.dynamodb = new AWS.DynamoDB.DocumentClient({
      region: "ap-northeast-1"
    });
  }
  
  getData(userId){
  	const params = {
      TableName: this.table,
      Key: {
        id: userId
      }
    };
    return new Promise((resolve, reject) => {
      this.dynamodb.get(params, (err, data) => {
        if (err) {
          console.error(err);
          return reject(err);
        } else {
          return resolve(data.Item);
        }
      });
    });
  }
}

```


## テストコード
``` tests/user.test.js
const test = require("ava");
const aws = require("aws-sdk-mock");
const path = require("path");
const testUserId = "1";
const Users = require("../../models/demo");

let allUserObj = {};
aws.setSDK(path.resolve("node_modules/aws-sdk"));

test.serial("prepare aws-sdk-mock environment", t => {
  aws.mock("DynamoDB.DocumentClient", "get", function(params, callback) {
    callback(null, { Item: { user_id: params.Key.user_id, name:"yamada", age:18 } });
  });
  allUserObj = new Users();
  t.pass();
});

test.serial("get user info", t => {
  const ansData = {
  	user_id: "1",
  	name: "yamada",
  	age: 18
  };
  return allUserObj.getData(testUserId).then(data => {
    t.is(ansData, data);
  });
});

```

callbackの第二引数の部分に仮にテーブルに入れておくデータを指定します。getだけでなくscanも同じ要領です。queryも。scanやqueryに関してはItemsの中身を複数個入れないといけないのでちょっと面倒でした...

```
✔ models › demo › prepare aws-sdk-mock environment
✔ models › demo › get user info
```
無事に通りました:raised_hands: 
これでローカルでdynamoのテストができるので本番テーブルに影響を与える心配も利用料取られる心配もなく安心してテストできます。
これからはテストをもう少し積極的にしていきます。

## 参考
https://qiita.com/horike37/items/41f9586d315c91d49305
Redmine マイページの「担当しているチケット」の表示件数を変更する

## 環境
bitnami Redmine 3.4.2

## 表示件数編集
例) 10件 → 20件
`$ vi /opt/bitnami/apps/redmine/htdocs/app/helpers/my_helper.rb`

```ruby:my_helper.rb 
  def render_issuesassignedtome_block(block, settings)
    query = IssueQuery.new(:name => l(:label_assigned_to_me_issues), :user => User.current)
    query.add_filter 'assigned_to_id', '=', ['me']
    query.column_names = settings[:columns].presence || ['project', 'tracker', 'status', 'subject']
    query.sort_criteria = settings[:sort].presence || [['priority', 'desc'], ['updated_on', 'desc']]
    issues = query.issues(:limit => 10)

    render :partial => 'my/blocks/issues', :locals => {:query => query, :issues => issues, :block => block}
  end
```

L:101
`issues = query.issues(:limit => 20)`
に変更する


## 再起動
`$ sudo service bitnami restart`