OmniAICreator/Qiita-1.07M huggingface dataset:
【Laravel】URLに指定したidなどをフォームリクエストでバリデーションする方法

## URLに指定した値をバリデーションしてくれない!?
フォームリクエストバリデーションについては [Laravel 5.4 バリデーション](https://readouble.com/laravel/5.4/ja/validation.html) を参照してもらうとして、
例えば routes/web.php に

```php:
Route::get('/foo/{id}', 'foo@baa');
```
と書いておくと

```php:
class foo extends Controller {
          :
    public function baa($id)
    {
```

の様に受け取れるが、
これにフォームリクエストを追加した場合

```php:
class foo extends Controller {
          :
    public function baa(CustomRequest $request, $id)
    {
```
rule() を記述しても id のバリデーションは行われない。
心情としては \$id のバリデーションも CustomRequest で一括してやりたい。
## 推察
フォームリクエストのルールは $request に含まれているものに反応する。
上記の \$id の様に URL に直接指定した値は、上記の配列に含まれないので評価されない。
## 解決方法
validationData 関数を使用する。
フォームリクエスト内で \$this->id の様に変数名を直接指定した場合は値が取得できるので、リクエスト配列の後ろに値をマージしてやる。
これで通常の rule() で評価できるようになる。

```php:
    /**
     * ルート引数は対象にならないのでマージする
     * @return 配列
     */
    protected function validationData()
    {
        return array_merge($this->request->all(), [
            'id' => $this->id,
        ]);
    }
```

[- 目次 -](https://qiita.com/search?q=laravel+nekyo)
Kotlin覚書 - KotlinからJavaにデコードする方法

# はじめに
Kotlinをやり始めると思うことは、やはりJavaだとどういう記述になっているのかということ。
そんなときのために、KotlinからJavaに変換する方法を記載しておきます。

# KotlinからJavaに変換する方法
1. まず、ktファイルを開いた状態で[Tools]->[Kotlin]->[Show Kotlin Bytecode]
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151973/51b24622-161c-8bf5-6f13-390a83e83134.png)

2. Windowの右側（僕の環境ではそうでした）に、専用の枠が出てくるので、[Decompile]を選択する![image.png](https://qiita-image-store.s3.amazonaws.com/0/151973/a12d2afe-92e0-9af1-2281-2c77a8885738.png)

3. DecompileされてJavaのコードが表示されます！![image.png](https://qiita-image-store.s3.amazonaws.com/0/151973/55c7b110-d6fd-84bd-6f9d-ca4010109655.png)

今後Kotlinをやってく上では、基本的にはKotlinでどんどんコードを書いていってしまうのが一番覚えるのは早そうですが、やはりやり始めってどうすればいいかわからなくてJavaを見返したくなることもあると思うので。

複雑な処理であればなおさらかなと思います。
iTerm2でTouch Barに何も表示しなくする方法

## はじめに
iTerm2をVersion 3.1にアップデートしたら、タッチバーにいろいろなものがチラチラ表示されるようになってしまいました。
このままだと発狂してしまうので無効にする方法を探しましたが見つからず、マニュアルを読んだところかろうじて全てのボタンを非表示にできたので、せっかくなのでお昼休みに書いています。

## 環境

* iTerm2 Build 3.1.1
* MacBook Pro (13-inch, 2016, Four Thunderbolt 3 Ports)
* macOS Sierra 10.12.6


## 手順
1. メニューバーより `View > Customize Touch Bar` を選択する<br>
  →タッチバーがプルプルモードになる
1. マウスカーソルをタッチバーまで移動できるようになるので、いらないボタンを画面上にドラッグ&ドロップする
1. `Done` を選択する

以上です。

## 補足
* 私は応急処置的に全て消してしまいましたが、以下のメニューから好きな機能を割り当てることもできるようなので、便利な使い方を思いついたら追加してみてもいいかもしれません。
`Preferences > Keys > Add Touch Bar Item`
<br>

* [change log](http://iterm2.com/downloads/stable/iTerm2-3_1_0.changelog) にこんなことが書いてありました。フルスクリーンでタブが使いたい、かつキーボードショートカットは使いたくないようなケースでは便利かも？

```
Marquee Features
- Add touch bar support.
  * Use the touch bar to select tabs in full screen
  * Assign labels to function keys with a shell script
```

## 参考
https://www.iterm2.com/documentation-touch-bar.html
matplotlibチートシート

自分用メモ

#まず必要なこと
importとinline

```py3:test.py
import matplotlib.pyplot as plt
%matplotlib inline
```
import : ライブラリを使えるようにする
inline : グラフをjupyter上で使えるようにする

#グラフのサイズ、フォントのサイズを指定したい
##グラフのサイズを指定する

```python:test.py
plt.figure(figsize = [10,10])
```
##フォントのサイズを指定する

```python:test.py
plt.rcParams["font.size"] = 18
```

#グラフに表示する情報（凡例とか）
##軸ラベル

```python:test.py
plt.xlabel('hoge')
plt.ylabel('fuga')
```

##凡例
①　引数にlabel（リスト系をいれる）を追加

```python:test.py
labels = ['りんご', 'みかん', 'バナナ']
plt.bar(list_x,list_y, label = labels)
```
②　plt.legend()を追加

```python:test.py
plt.legend()
```

##データに名前つける
引数にtick_label(リスト系を入れる）を追加。

```python:test.py
labels = [
  'Canned Soft Drink'
  , 'Steak Burrito'
  , 'Chips and Guacamole'
  , 'Chicken Burrito'
  , 'Chicken Bowl'
]
plt.bar(list_x,list_y, tick_label = labels)
```
![test.png](https://qiita-image-store.s3.amazonaws.com/0/203205/bf33080b-6aa8-c52c-8e8a-f7b8413370fc.png)

#円グラフ（pie chart）
##jupyter上で円が楕円になるとき
jupyter上でパイチャートを描くと楕円になる
![image.png](https://qiita-image-store.s3.amazonaws.com/0/203205/c8facd42-15fc-a97c-6483-a64236f50394.png)

plt.axis('equal')で解決
![image.png](https://qiita-image-store.s3.amazonaws.com/0/203205/fa7641ff-f664-0d44-3e22-c86bc8c90852.png)
##参考
上記以外にも円グラフのあれこれが載っている
http://pythondatascience.plavox.info/matplotlib/%E5%86%86%E3%82%B0%E3%83%A9%E3%83%95

# savefigについて
[公式ドキュメント](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.savefig.html)
## 透過PNGにしたい

```python
plt.savefig('hoge.png',transparent=True)
```
WordPressでVK Link Target Controllerプラグインを使うときに注意すること

WordPressでは記事ページや固定ページを作成できますが、一覧のなかにpdfとかへのリンクを入れるということが難しいです。
例えば「会社概要」というカテゴリーに「社長あいさつ」「理念」などはページを作成してそこに並列で「パンフレット」を追加してpdfへのリンクにしたい。とか。

そこで登場するのが [VK Link Target Controller](https://ja.wordpress.org/plugins/vk-link-target-controller/) なんですが、このプラグインを使うときに注意しないといけないことが1つ。

**`the_permalink()` をしている aタグの親タグに `post-[ID]` というid属性が必要**

なんです。
そうしないと、管理画面で「別ウィンドウで開く」を設定していても *リンクが同じウィンドウでしか開かない* ということになります。
詳しくはプラグインページのFAQ「My link won’t open on a new window.」の項目を参照してください。

## なんで？

the_permalink() のURLの書き換えはプラグインでできるのですが、別のウィンドウで開くためにtarget属性を設定するのは別途jsで行っているようです。
そのときに、target属性を設定するaタグを判別するために親タグのid属性に **post-[ID]** を持つものを指定していました。

## サンプルコード

```php:sample.php
<?php while (have_posts()): the_post(); ?>
<div class="entry">
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
<span><?php the_excerpt(); ?></span>
</div>
<?php endwhile; ?>
```

というような場合、 `<div class="entry">` のところに id属性 を次のように設定します。

`<div class="entry" id="post-<?php the_ID(); ?>">`

WordPressに標準添付されているテーマ twentyfifteen, twentysixteen, twentyseventeen などは articleタグに同じようにid属性が設定されているのでそれを想定して VK Link Target Controller 側が実装しているようです。
オリジナルのテーマを作成する場合とかは頭の片隅に入れておく必要があります。
Kinect V2でミラー表示をやめるには

Kinect V1では、```kinect.setMirror(false);```とすれば左右反転の鏡面表示でなく
そのまま表示されるらしいですが
Kinect V2は、そのメソッドがないみたい。。。

before(鏡面になっている状態):
![before.png](https://qiita-image-store.s3.amazonaws.com/0/68563/ade14b6f-8c2e-3b94-5908-47ed76e92e23.png)

そのため、下記関数を使って左右反転を戻しました。

```cpp 
void reflectImage(byte* colorData, int width, int height)
{
	byte* imageBase = colorData;
		// Get the base position as an integer pointer
		int* imagePosition = (int*)imageBase;
		// repeat for each row
		for (int row = 0; row < height; row++)
		{
			// read from the left edge
			int* fromPos = imagePosition + (row * width);
			// write to the right edge
			int* toPos = fromPos + width - 1;
			int tempPos;
			while (fromPos < toPos)
			{
				tempPos = *toPos;
				*toPos = *fromPos;
				*fromPos = tempPos;
				//copy the pixel
				fromPos++; // move towards the middle
				toPos--; // move back from the right edge
			}
		}
	
}
```

after:
![after.png](https://qiita-image-store.s3.amazonaws.com/0/68563/3292e780-157c-3a32-351b-35c21b6807c0.png)


下記のコードほとんどそのままです。

参考：
https://stackoverflow.com/questions/18253032/creating-oposite-mirror-picture-by-manipulate-kinect-color-pixels
【Python】一行でif/elseを書く

Pythonの基本中の基本だけれど、いっつも忘れるのでメモ

```python:
if a > 5:
	i = a
else:
	i = 0
```

は

```python:
i = a if a > 5 else 0
```

みたいな感じで書ける

<hr>

True/Falseの条件式の場合

```python:
if string:
	i = "True"
else:
	i = "False"
```

と

```python:
i = "True" if string else "False"
```

は同じ
WowzaStreamingEngineでAPIを叩いてアプリケーション情報を取得する方法

## はじめに
動画ライブ配信アプリを開発したいと思い[WowzaStreamingEngine](https://www.wowza.com/products/streaming-engine)を利用した際に、WowzaStreamingEngineのアプリケーション(動画配信のルームみたいなやつ)情報をapiを叩いて取得する方法を調べたのでメモ。

## cURLコマンド

下記のようにapiを叩けば`testlive`という名前のライブ配信用のアプリケーション(ルームみたいなもの)情報が取得できます。

```
curl -X GET --header 'Accept:application/json; charset=utf-8' http://[ドメイン・IPアドレス]:8087/v2/servers/_defaultServer_/vhosts/_defaultVHost_/applications/testlive
```

ちなみに、以下のように叩くと作成しているすべてアプリケーション一覧が取得できます。

```
curl -X GET --header 'Accept:application/json; charset=utf-8' http://[ドメイン・IPアドレス]:8087/v2/servers/_defaultServer_/vhosts/_defaultVHost_/applications
```
MacでOpenGL(GLFW)環境設定


[以前投稿した記事](https://qiita.com/s_s_k/items/fa4de44acb09d715a935)より簡単に設定できるようになっています。

今回試した環境は以下の通りです。
Mac OSX 10.12.6


利用するライブラリは以下の通りです。

+ OpenGL
+ GLSL
+ GLFW3
+ GLEW
+ GLM

OpenGLはMacにすでにインストールされているので、GLFWのインストールから進めます。
ちなみにXcodeを利用します。


## GLFWのインストール

homebrewにGLFW3が入ったので、brew installコマンドで完了です。

```bash
$ brew install glfw
```

インストールされた場所を調べて置いてください。後ほどxcodeにパスを設定します。

## GLEWをインストール
GLEW(OpenGL Extension Wrangler Library)はOpenGL拡張をロードしてくれるライブラリです。GLEWを用いることでOpenGL拡張を手軽に用いることができます。

これもHomebrewでインストールできます。

```bash
$ brew install glew
```

インストールされた場所を調べて置いてください。後ほどxcodeにパスを設定します。


## glmのインストール
OpenGL Mathematics (GLM)。OpenGLで利用する数値計算ライブラリです。とりあえずこれは入れて置いた方が便利です。

```bash
$ brew install glm
```

インストールされた場所を調べて置いてください。後ほどxcodeにパスを設定します。

## Build PhaseでLink Binaryを設定する
GLM以外はdylibファイルがあるので、これをリンクさせます。
Finderからファイルをドラッグでリンクが設定されます。

![スクリーンショット 2017-09-20 9.40.56.png](https://qiita-image-store.s3.amazonaws.com/0/15535/7a1cdd6f-bd72-13cf-c552-fa9a493bbeb0.png "スクリーンショット 2017-09-20 9.40.56.png")

## Header Search Pathを設定
さらに、Build SettingsでHeader Search Pathを設定します。
ここで先ほどインストールした3点のそれぞれにincludeディレクトリがあると思います。
そこまでのパスを設定します。

以上で完了です。
引数の数をcountでチェックするなら一度変数に入れる

```bash:ダメ
function hoge
    if count $argv -ne 1
       echo "error argv"  $argv
       return
    end
end
```

```bash:いい
function hoge
    set length (count $argv)
    if test $length -ne 1
       echo "error! argv" $argv
       return
    end
end
```


[countの結果は標準出力に出力されるので]？
逆に終了ステータスで判定したい場合は`if count`の最後に`> /dev/null`とリダイレクトして出力を捨てないといけない。
`if count`とすると終了ステータスのチェックになるのでだめ。

久しぶりに書くとうっかりこうなる。

bashの`$#`はないのかな？

[引数を処理する | UNIX & Linux コマンド・シェルスクリプト リファレンス]

***

と思ってたんですが、ダメな方をよく見ると、引数なしの実行で標準出力に吐かれるintが2。引数を足していくとインクリメントしていく。
`set length (count $argv)`の変数の値と、`count $argv`の出力が一致しないので、何か見落としている気がする。


[countの結果は標準出力に出力されるので]:http://fish.rubikitch.com/count/


[引数を処理する | UNIX & Linux コマンド・シェルスクリプト リファレンス]:http://shellscript.sunone.me/parameter.html#%E6%8C%87%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%9F%E5%BC%95%E6%95%B0%E3%81%AE%E6%95%B0%E3%82%92%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B
HTTPModule の作り方

MicrosoftのIIS上のHttpModuleを作るときの注意点をいくつか。

基本的には、以下のWebサイトで全てだけど、自分用のメモ的位置づけ

---
# 参考

- [［ASP.NET］アプリケーション共通のロギングを行うには？（HTTPモジュール編）](http://www.atmarkit.co.jp/fdotnet/dotnettips/130asploghttp/asploghttp.html)
- [How To Create an ASP.NET HTTP Module Using Visual C# .NET](https://support.microsoft.com/en-us/help/307996/how-to-create-an-asp-net-http-module-using-visual-c--net)
- [Custom HttpModule Example](https://msdn.microsoft.com/en-us/library/aa719858(v=vs.71).aspx)
- [INFO: ASP.NET HTTP Modules and HTTP Handlers Overview](https://support.microsoft.com/EN-US/help/307985)

---
# ISAPIとの比較

多分、以下のような対応関係がイメージしやすいかもしれない
- ISAPIフィルタとHttpModule
- ISAPI拡張とHttpHandler

ただし、ワイルドカードHttpHandleとかもあるから、1:1対応とはいえないかもしれない。

---
# 作成から登録までの基本的な流れ

- system.web.dllに含まれている[System.Web.IHttpModule](https://msdn.microsoft.com/en-us/library/system.web.ihttpmodule(v=vs.110).aspx)インターフェイスを継承してDLLを作る
- イベントドリブンな普通のWindowsFormアプリケーションを作るような感覚で C# でコーディングできる
- Webアプリケーション(IISマネージャで設定する)配下の「bin」というディレクトリにdllを配置する
- アプリケーションプールと同じ.NET FrameworkのバージョンでコンパイルしたDLL(HttpModuleをコンパイルしたDLL)でないと動作しないよ
- IISマネージャのGUIの一覧には出てこないかもしれない
- web.configのaddタグは、system.web→httpModulesタグでもsystem.webserver→modulesタグでも一緒だと思うけど、こちらの書式が、「＜add type=”［COM+ Class］, ［Assembly］” name=”［ModuleName］” /＞」
- COM+ Class というのは、名前空間から始まってクラス名まで。(つまり、クラスのフルパスだな)
- Assembly というのは、dllのファイル名(dllという拡張子は除く)
- ModuleName は任意だと思うぞ

---
# 実行ユーザ名

System.Environment.UserName の結果(EndRequestイベント)は、アプリケーションプールの「全般」の「名前」でした。(.NET4 の場合は「ASP.NET v4.0」)

この人誰?

System.Security.Principal.WindowsPrincipal で、System.Security.Principal.WinsdowsPrincipal.WindowsBuiltInRoleの「User」「Administrator」「Guest」は、いずれもFalseでした。
処理待ち中にボタンの上にSpinnerを表示する(React版)

これは、[初心者歓迎！Reactとvte.cxでWebアプリケーションを作成する#2<動作確認〜ソース解説>](https://vtecx.connpass.com/event/65163/)の説明に使う予定の資料です。

今回は、Reactの理解のために、処理待ち中にボタンの上にSpinnerを表示する実装について説明します。
こんな感じで、メールを送信するボタンを押すと、クルクル回るスピナーを表示するものです。

![develop.gif](https://qiita-image-store.s3.amazonaws.com/0/17472/108f9b2d-926d-2009-5cd4-7e1d18101ab8.gif)

## ソース解説

[パスワードリセット画面のソース](https://github.com/reflexworks/vtecxblank/blob/master/src/components/forgot_password.js)の一部を抜粋したものが以下になります。

###ロジックの部分

まず、stateにisLoadingを追加します。（初期値はfalse）
サーバアクセス時に、trueにし、実行後にfalseにするだけです。

```javascript
constructor() {
	this.state = { isLoading: false }
}
handleSubmit(e:InputEvent){
	this.setState({isLoading:true})
	axios({
         ・・・
	}).then( () => {
		this.setState({isLoading:false})
	}).catch((error) => {
		this.setState({isLoading:false})
	}
}
```

###JSXの部分

JSXでは、isLoadingがfalseのときに「メールを送信する」を、trueのときに、スピナーと「送信中」を表示するようにします。disabledを指定すると送信中はボタンを押せなくなります。

```html
<Button type="submit" className="btn btn-lg login_form__btn--submit" disabled={this.state.isLoading}>
{this.state.isLoading ? <span><span className="glyphicon glyphicon-refresh glyphicon-refresh-animate"></span>　送信中</span> : 'メールを送信する'}
</Button>
```

###CSSの部分

スピナーは、イメージ画像ではなく、css3のanimationが使われています。
参考：[Animated button](https://www.bootply.com/128062)

```css
.glyphicon-refresh-animate {
    -animation: spin .7s infinite linear;
    -webkit-animation: spin2 .7s infinite linear;
}

@-webkit-keyframes spin2 {
    from { -webkit-transform: rotate(0deg);}
    to { -webkit-transform: rotate(360deg);}
}

@keyframes spin {
    from { transform: scale(1) rotate(0deg);}
    to { transform: scale(1) rotate(360deg);}
}
```
超朗報。Xcode 9でやっとSwiftのリファクタリングが可能に

Xcodeでは、Swift登場時のバージョン6から前バージョン8.3に至るまで、Swiftのリファクタリングができませんでした。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/786f2f40-2b38-c076-8d53-2cc6082ff155.png)

▲ 筆者のこれまでの嘆き

本日（2017/09/20）リリースされた[Xcode 9](https://developer.apple.com/xcode/)で、やっと、やっとSwiftコードのリファクタリングが可能になりました。

# リファクタリングの方法
リファクタリングしたい箇所を選択して[Editor]→[Refactor]→[Rename]を実行します。使用頻度も高いので、ショートカットキーを設定するとよいでしょう。

<img width="509" alt="スクリーンショット 2017-09-20 4.02.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/67884/66b50e9b-cdd8-adbf-0aaa-e74534886757.png">

従来は「Swiftはリファクタリングできない」という旨の~~忌々しい~~アラートが表示されていましたが、Xcode 9では心地よいアニメーションと共に動作します。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/341ab4e7-5c9e-22ba-8d04-0e46166fcd48.gif)

3年間も。。。待たせやがって。。。。。。
iPhone Xを購入せず、無料でウェブページの表示確認を行う方法 (macOS)

今年10月に発売が予定されている[iPhone X](https://www.apple.com/jp/iphone-x/)は、その独特なディスプレイの為にセーフエリアを意識したウェブデザインが必須です。iPhone Xで意図せぬ表示にならないように実機の購入が必要だと考えるかもしれませんが、**実はmacOSユーザーであれば、iPhone Xを購入せず無料でウェブページの表示確認を行えます**。このエントリーでは、iPhone Xでの表示確認方法について紹介します。

<img width="433" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/67884/6c6636ea-8df2-c175-7af1-610993be362c.png">

▲ iPhone Xでの表示確認をしている様子

# iPhone Xで起こりうる意図せぬ表示
たとえば、画面最下部にコピーライトを固定表示しているサイトをよく見かけますが、iPhone XのSafariではメニューバーを表示する為のボタンで隠れる可能性があります。また、横持ちでコンテンツの左右が途切れてしまう可能性もあります。

![](https://qiita-image-store.s3.amazonaws.com/0/67884/65d90cdf-b1cf-8cce-52d4-da9ddfe039ec.jpeg)

▲ 「[iOS Human Interface Guidelines](https://developer.apple.com/ios/human-interface-guidelines/overview/whats-new/)」より

これらの表示をあらかじめ把握して対策するには、Xcodeに付属するSimulatorを用います。

# iPhone X(Simulator)での表示確認方法
① Xcodeの最新バージョン9を[App Storeよりインストール](https://itunes.apple.com/jp/app/xcode/id497799835?mt=12)します。

② インストールが完了したら、一度Xcodeを起動し、画面にしたがって利用規約の同意やコンポーネントのインストールを行います（すべてYesでOK）。完了したらXcodeは閉じて構いません。

③ [アプリケーション]フォルダーのXcodeのアイコン上で右クリックし、[パッケージの内容を表示]をクリックします。

<img width="405" src="https://qiita-image-store.s3.amazonaws.com/0/67884/ec04bef6-7a09-c791-cca0-53007556902e.png">

④ Xcode.appの中身が表示されるので、[Contents]→[Developer]→[Applications]より、[Simulator]をクリックします。

<img width="370" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/67884/433ebfdb-b44d-0fc3-2d38-9bdb21c0d235.png">

⑤ iOSのデバッグ確認を行うSimulatorが起動します。Xcode 9では初期状態でiPhone Xが起動します。

⑥ Safariを起動し、確認したいウェブサイトのURLを入力すれば、iPhone Xでの表示確認ができます。

<img width="433" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/67884/6c6636ea-8df2-c175-7af1-610993be362c.png">

# デバッグが便利になるテクニック


## 横持ちでの表示確認
[コマンド]キー+[→]キーを押すとディスプレイが横向きに回転するので、iPhone Xを横持ちにした時の表示確認ができます。

**多くのサイトでは、横持ちの際にコンテンツの左右が途切れていることがわかるでしょう**。

<img width="852" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/67884/c1f86aae-5bf1-b8f5-fee4-c254b499afdf.png">

この左右の余白の原因や解消方法については、記事「[Removing the White Bars in Safari on iPhone X](http://stephenradford.me/removing-the-white-bars-in-safari-on-iphone-x/)」にて解説されています。

## ホーム画面へ戻る
[command]+[shift]+[H]をクリックするか、画面下からスワイプします。

## デバイスを変更する
iPhone X以外の端末での表示確認を行うには、[Hardware]→[Device]より別の端末を選択します。

<img width="913" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/67884/c2231496-3eb8-76b0-4387-39a3aa03f43d.png">

# iPhone Xがリリースされる前にウェブサイトの対策を
iPhone Xが独特なディスプレイを持っているとは言え、その挙動を把握しておけば恐れることはありません。Simulatorを使えば100%ではありませんが高い精度でiPhone Xの振る舞いを確認できます。iPhone Xがリリースされる前に、担当しているウェブサイトの表示に不具合がないかを確認するのがよいでしょう。


※ 本エントリーをInternet Watchにて紹介していただきました。
「[【やじうまWatch】 表示エリアが独特なiPhone X、実機を購入せずにウェブページの表示確認を行う方法 \- INTERNET Watch](http://internet.watch.impress.co.jp/docs/yajiuma/1082456.html)」
キーボード入力 + デバッグコンソールを使用する(VSCode(Python))

# はじめに
* 当記事は下記の環境にて動作を確認しています。  
 1. Python 3.6.2  
 1. Visual Studio Code 1.16.1(64bit)

---

# 結論
integrated Terminal/Console を選択してデバッグを実行しよう！

---

# サンプルコード

```python:test.py
# テスト用コード

tempStr = input('文字を入力してください')
print(tempStr)
```

---

# サンプルコードの実行

![sample.gif](https://qiita-image-store.s3.amazonaws.com/0/196422/9768b27d-cb40-d066-f32a-da627e3eceaa.gif)

---

# 解決方法

![sample.gif](https://qiita-image-store.s3.amazonaws.com/0/196422/8dc67cda-6fa2-106e-8ef7-786983e7a60e.gif)

ターミナルから起動するようになりますので、そっちでinputに対する入力が可能になります。
なお、この状態でもデバックコンソールはそのまま使えます。

---

# 参考URL
gidhubの対象ページ  
https://github.com/DonJayamanne/pythonVSCode/wiki/Capture-User-Input-via-input%28%29-or-raw_input%28%29
Laravel5.4ではbladeファイル内で`{{--*/ $hoge = 'hoge' /*--}}`といった書き方で変数代入できない

「Laravel blade 変数 代入」でググると、一番上に[こちら](http://recipes.laravel.jp/recipe/114)のサイトが出てきます。

こちらによると以下の書き方で変数代入が行えるとあります。

> またはBladeのコメントを使うこともできます
>
> ```php
{{--*/ $var = 'test' /*--}}
{{$var}}
```
> Bladeのコメントは以下の形式を利用しているため、上記のコメントを使った代入方法で動作させる事が出来ます
>
> ```php
<?php /*COMMENT*/ ?>
```
> したがって、上記の変数の代入は次のPHPコードに変換されます
>
> ```php
<?php /**/ $var = 'test' /**/ ?>
```

# Laravel5.4ではこの書き方が使えない

そのまんまです。先述の書き方をしても変数に値が代入されませんでした。

## 検証

bladeファイルのコンパイル結果は`storage/framework/views`配下に出力されるので、コンパイル前とコンパイル後の内容を比較してみます。
※Laravel5.4と5.2でしか検証していないです。

```php:コンパイル前（blade）
<?php $hoge = 'hoge'; ?>
{{--*/ $hoge = 'hoge'; /*--}}
<?php /* こめんと */ ?>
{{-- こめんと --}}
```

こちらのファイルがコンパイル後どういったphpファイルに変換されるかを見てみます。

### Laravel5.4

```shell-session
$ php artisan -V
Laravel Framework 5.4.26
```

```php:コンパイル後
<?php $hoge = 'hoge'; ?>

<?php /* こめんと */ ?>
```

### Laravel5.2

```shell-session
$ php artisan -V
Laravel Framework version 5.2.45
```

```php:コンパイル後
<?php $hoge = 'hoge'; ?>
<?php /**/ $hoge = 'hoge'; /**/ ?>
<?php /* こめんと */ ?>
<?php /* こめんと */ ?>
```

# 上記検証からわかったこと

Laravel5.4からは`{{-- --}}`のblade用のコメントは、コンパイル後のphpにそもそも出力されないことがわかります。
この変更の背景としては、開発を行っているときに実際に見るファイルはコンパイル前のbladeファイルだけなので、コンパイル後の素のphpファイルにはコメントを出力する必要がない（こちらのファイルを確認することは基本的にない）といった感じでしょうか？あくまで予想です。

# 「Laravel blade 変数 代入」でググると、一番上に出てくる[サイト](http://recipes.laravel.jp/recipe/114)

こちらのサイトはLaravel4.0-4.2向けの情報を日本語訳したものらしいので、5系で使用すること自体が間違っていました（たまたま5.2ではまだ有効な記述方法だった）。


# 対策

## 簡単な方法
普通にphpのタグを使って代入すれば問題ありません。`<?php $hoge = 'hoge'; ?>`
もしくは`@php` https://laravel.com/docs/5.5/blade#php を使えばOKです。

## bladeの拡張構文

bladeを拡張して変数代入用の構文を追加することも出来ます。勉強も兼ねて今回はこっちで対応してみました。
公式にしっかり[手順](https://laravel.com/docs/5.2/blade#extending-blade)が書かれています。

この例は文字列型の引数を1つしか受け取らないような場合の話ですが、
今行いたいのは変数への代入なので、「変数名」と「値」といった2引数を扱う必要があります。
最初から提供されている`@section`（引数を2つ受け取る）の定義を見てみると正規表現で頑張っていることがわかりました。
あとは https://laracasts.com/discuss/channels/laravel/how-to-do-this-blade-directive?page=1 では配列で渡すか正規表現で分割しなってコメントが書かれています。
今回は正規表現で分割してみました。
※単純な使い方しか想定していないです（変数が配列の場合などは一切テストしていないです）。

```php:AppServiceProvider.php
    public function boot()
    {
        \Blade::directive('set', function($arg){
            list($key, $value) = explode(',', $arg);
            return "<?php $key = $value; ?>";
        });
    }
```
```php:blade.php
@set($hoge,'hogehoge')
{{ $hoge }}
```
旧版Tomcat環境（5.5/6.0）でTomcat関連ログをログローテする

# はじめに
旧版Tomcat（5.5/6.0）でTomcat関連ログをログローテする方法について検討した結果を記載。

# 背景
ログローテのやり方自体についてはネット上探せばゴロゴロ出てくるのですが、
導入されているTomcatのバージョンによってログ周りの設定も色々異なるため、
備忘録としてこの記事を作成しました。
~~というかバージョン上がるたびにコロコロ設定変わり過ぎだろ~~

# Tomcat5.5系
ログ周りの設定はTomcatインストール先/conf/logging.propertiesに記載されているのですが、
5.5系ではrotatableパラメータもないので、素直にcrontabにコマンド書いて定期的に削除するのが一番楽な気が。

```shell-session
0 0 * * * /usr/bin/find /Tomcatインストール先/logs/ -mtime +14 -exec rm -f {} \; > /dev/null 2>&1
```

上記の例だと毎日0時にlogsディレクトリの中のタイプスタンプの更新日時が2週間以上前のファイルを一括で削除する動作になります。findのパスやTomcatのインストール先は環境によって異なるはずなので環境に合わせて修正してください。

~~というかTomcat5.5系の場合は普通に使ってたらcatalina.out以外のログに、
何かしら書き込まれるのって再起動のタイミングくらいな気が~~

# Tomcat6.0系
Tomcat6系だとlogging.propertiesのFileHandlerにrotatableパラメータが追加されているため、
こいつを明示的にfalseにしてやれば日付ごとにファイルは作成されず、
常に単一のファイルに追記されるようになります。

```properties:logging.properties
1catalina.org.apache.juli.FileHandler.suffix = log
1catalina.org.apache.juli.FileHandler.rotatable = false

2localhost.org.apache.juli.FileHandler.suffix = log
2localhost.org.apache.juli.FileHandler.rotatable = false

3manager.org.apache.juli.FileHandler.suffix = log
3manager.org.apache.juli.FileHandler.rotatable = false

4host-manager.org.apache.juli.FileHandler.suffix = log
4host-manager.org.apache.juli.FileHandler.rotatable = false
```

こんな感じ。
後はlogrotateでTomcat用の設定ファイルを追加してやれば、
細かくログローテの設定ができるはず。

```properties:/etc/logrotate.d/xxx（任意）
/Tomcatインストール先/logs/*.log
{
    copytruncate
    daily
    dateext
    missingok
    rotate 14
    compress
    create 0644 tomcat tomcat
}
```
Tomcatのユーザ名なんかはこれまた環境によって異なるかもしれないので
各自で自分の環境に合わせてください。

勿論5.5系と同じようにfindコマンドとrmコマンドを組み合わせて、
削除する方法も使えます。

# Tomcat7.0系以降
Tomcat7.0系以降だとFileHandlerにmaxDaysプロパティが追加されたことで、
更に設定が楽になったようです。~~まだ試してないけど~~

デフォルトの設定を見た限りだと、ログは永久的に保存される設定になっていますが、
maxDaysプロパティに明示的に値を指定してあげることで、
ログを保管する期間を設定できるようです。

つまりログの種類によって保持する期間を変更したい場合など、
わざわざlogrotateに設定した上でログごとによって設定ファイルを分けたりする必要もなくなる訳ですね。

# おわりに
サーバ複数台構成の大きいシステムだとサーバごとによってミドルウェアのバージョン違いによる細部の設定が異なったりするので、
何か変更を加える際は、導入されているバージョンで有効な設定なのか、十分な確認が必要ですね（ありきたり）。
jestのテストで存在しないファイルをしようとするとき

## 結論

再インストールすれば直る

```
$ yarn remove jest
$ yarn add --dev jest
```

## 試してダメだったこと

noキャッシュ。
しかしキャッシュを参照してダメ。

```
$ yarn run test -- --no-cache
```

## 原因
おそらく使ってないスナップショットを残してテストを書き換えたところ発生した感じがある
Raspberry Pi に入れた OpenTalk の音響モデルを換える


FabBot Kannna-chan など Raspberry Pi に入れた OpenTalk の音響モデルを換える手順のメモ

## 音響モデルを入手する

[Open JTalk の音響モデルを試す::まほろば](http://mahoro-ba.net/index.php?j=1875)
音響モデルの入手先を紹介していて、サンプルもいくつか聴ける。


## 音響モデルをコピーする

SSH 接続だけでコピーを行うには scp を使う。

```
scp ./hts_voice_nitech_jp_atr503_m001-1.05.tar.gz pi@192.168.42.1:/home/pi/
```


## ファイルを解凍する

```
tar xvf hts_voice_nitech_jp_atr503_m001-1.05.tar.gz
```


## jsay コマンドを修正する

エディタを起動する。

```
sudo nano ~/bin/jsay
```

`HTSVOICE=` を書き換える。

```:jsay
HTSVOICE=/home/pi/hts_voice_nitech_jp_atr503_m001-1.05/nitech_jp_atr503_m001.htsvoice
```
ESP-WROOM-32 を Mac で遊ぶための準備



## ブツを入手する
banggood から買ってみた。doit社製。ちょっと不安だったけど、安さにつられて(700円くらい)買ってみた。

https://www.banggood.com/ESP32-Development-Board-WiFiBluetooth-Ultra-Low-Power-Consumption-Dual-Cores-ESP-32-ESP-32S-Board-p-1109512.html?p=0S13109449737201703M

配送方法に送料無料のを選んだら、受け取るまで２週間くらいかかった。けど、ちゃんと届いた。

## USB シリアルドライバをインストールする
手元のボードのチップは SILABS CP2010Z と書かれていたので、https://jp.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers#mac をインストールした。

再起動は不要だった。

## Arduino IDE をインストールする
https://www.arduino.cc/en/main/software から　Mac OS X 用をダウンロードしてインストールする。

## Arduino IDE に　ESP32 用の設定をする
https://github.com/espressif/arduino-esp32 を使う。

https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/mac.md の手順でインストールする。
クローン先のパスは正確に合わせないと動かないので注意。　(~/Documents/Arduino/hardware/espressif)

Arduino IDE 再起動後、ツール > ボード に ESP32 があれば OK。

Arduino IDE のメニューで、ツール > ボード を　ESP32 Dev Module、ツール > シリアル　を　/dev/cu.SLAB_USBtoUART　に変更する。

## シリアル出力

```cpp
void setup() {
  Serial.begin(115200);
  while (!Serial);

  Serial.printf("Revision: %d\r\n" , ESP.getChipRevision());
}

void loop() {
  Serial.write("loop\n");
  delay(1000);
}
```

ツール > シリアルモニタを起動して、ボーレートを 115200 に設定。
USB でつないで実行すると "loop" が流れる。

## Lチカ

![DSC_0045.JPG](https://qiita-image-store.s3.amazonaws.com/0/9549/583afb26-b363-7721-8a0c-0e87c319d375.jpeg)

写真だと分かりにくいけど、GND に抵抗、D2にLEDを接続している。

```cpp
void setup() {
  pinMode(2, OUTPUT);
}

void loop() {
  digitalWrite(2, HIGH);
  delay(250);
  digitalWrite(2, LOW);
  delay(250);
}
```

やってみて気付いたけど、ボードにLEDがのってて、GPIO2につながっているのね。
https://github.com/SmartArduino/ESP/blob/master/SchematicsforESP32.pdf

あと、ボードの幅が広くてブレッドボードの穴が足らず、片側のピンしか使えない。ぐぐって見ていると皆さんサンハヤトのを使っているぽいので、~~今度買ってこよう~~ 買ってきた。

## タクトスイッチ
![led-switch.png](https://qiita-image-store.s3.amazonaws.com/0/9549/164380af-75e4-b7fa-7ee6-026b00cf1c77.png)

LED はオンボードの (GPIO2) で代用。

```cpp
const int ledOnBoard = 2;
const int buttonPin = 4;

void setup() {
  pinMode(ledOnBoard, OUTPUT);
  pinMode(buttonPin, INPUT);
}

void loop() {
  int flag = digitalRead(buttonPin);
  if (flag == LOW) {
    digitalWrite(ledOnBoard, LOW);
  } else {
    digitalWrite(ledOnBoard, HIGH);
  }
  delay(10);
}
```

## INPUT_PULLUP
プルダウン抵抗を入れていたけど、pinMode() に `INPUT_PULLUP` を指定すると内部の抵抗を使うようになって、部品が減らせる。

![input_pullup.png](https://qiita-image-store.s3.amazonaws.com/0/9549/dcabce36-f048-a02e-9f54-0966d9c45250.png)

```cpp
const int ledOnBoard = 2;
const int buttonPin = 4;

void setup() {
  pinMode(ledOnBoard, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP);
}

void loop() {
  int flag = digitalRead(buttonPin);
  if (flag == HIGH) {  // ボタンを離した状態がプルアップになる
    Serial.printf("low\r\n");
  } else {
    digitalWrite(ledOnBoard, HIGH);
  }
  delay(10);
}

```
Craft CMSをインストール（Cloud 9編）

なにかと話題の Craft CMSを、Cloud 9の環境にインストールしてみました。

## ワークスペースを作る

Craft CMSは、Version 2現在で PHP 5.3以降の環境が必要です。そこで、ワークスペースを、「PHP」で作成します。

![2017-09-20_5-52-46.png](https://qiita-image-store.s3.amazonaws.com/0/3977/0689c66c-b281-54e3-500e-dac3efeb81e0.png)

## ファイルをコピーする

以下のサイトからファイルをダウンロードして、Cloud 9にアップロードします。

- [Craft CMS \| Focused content management for web professionals](https://craftcms.com/)

## ドキュメントルートを変更する

Craft CMSは、「public」フォルダーをドキュメントルートにする必要があるので、Cloud 9の bashに次のように打ち込んで、設定ファイルを編集します。

```shell-session
sudo vi /etc/apache2/sites-enabled/001-cloud9.conf
```

そして、「DocumentRoot」の設定を次のように変更します。

```shell-session
DocumentRoot /home/ubuntu/workspace/public
```

そして、Apacheを再起動します。

```shell-session
sudo service apache2 restart
```

## データベースの設定

次に、データベースを設定します。`craft/config/db.php`を編集して、次のように設定します。

```php
<?php

/**
 * Database Configuration
 *
 * All of your system's database configuration settings go in here.
 * You can see a list of the default settings in craft/app/etc/config/defaults/db.php
 */

return array(

	// The database server name or IP address. Usually this is 'localhost' or '127.0.0.1'.
	'server' => '127.0.0.1',

	// The name of the database to select.
	'database' => 'c9',

	// The database username to connect with.
	'user' => 'root',

	// The database password to connect with.
	'password' => '',

	// The prefix to use when naming tables. This can be no more than 5 characters.
	'tablePrefix' => 'craft',

);
```

## インストール画面を表示

そしたら、[Run Project] ボタンをクリックしてプレビュー用URLを発行し、次のようなURLにアクセスしましょう。

`http://example.com/admin/`

セットアッププログラムが起動して、各種設定を行なうことができます。
今のPHPらしい書き方をするためには


# 前提
- PHPをかじり始めたのは随分と昔だったのですが、気がつけばPHPも最近は書きやすくなっていました
- 最近のPHPらしい書き方を調べたので今後のコーディングのベースにするために備忘録を残したいと思います
- PHP7前提の話です。古いバージョンのPHPでは使えない場合があります
- まとめの粒度や順番は主観によるものです。省略している部分もあります

# バグの少ないキレイなコーディングをするために...
## 名前空間(PHP5.3から)
http://php.net/manual/ja/language.namespaces.rationale.php

```php
// ネームスペースを付けることでクラス名などの競合を避けることができる
namespace App¥Hoge
```

## 遅延静的束縛(PHP5.3から)
http://php.net/manual/ja/language.oop5.late-static-bindings.php

```php
// クラス名::hoge は呼び方によらず、そのクラスを参照
// self::hoge はメソッドの書かれたクラスを参照
// static::hoge メソッドを呼んだクラスを参照
// static::hoge によるメソッド参照は、そのメソッドを含むクラスを更に継承した時に変化が生じる
```

## 無名関数・クロージャ(PHP5.3から)
http://php.net/manual/ja/functions.anonymous.php

```php
// $hoge に無名関数を代入
$hoge = function ( $name ) {
    printf('これは %s', $name);
};

// 代入した関数が実行される。
$hoge('りんご');
```

```php
$greet = function($name)
{
    printf("Hello %s\r\n", $name);
};

$greet('World');
$greet('PHP');
```

## 配列(PHP5.4から)
```php
// 昔
$hoge = array();
$hoge = array(1,2,3);

// 今
$hoge = [];
$hoge = [1, 2, 3];
```		

## 引数の可変長(PHP5.6から)
```php
function sum(...$number)
{
	$hoge = 0;
	foreach($number as $val){
		$hoge += $val;
	}
	return $hoge;
}

// 10が返ってくる
$ten = sum(1, 2, 3, 4, 5);
```		

## 型宣言(PHPのバージョンごとに順次できることが増加中)
- PHPのタイプヒンティングはデフォルトでは厳格ではありません
- int / bool / float / string / array / クラスなどの一部の型しか使えません
- 厳格な型指定を行うためには、ファイル内に「decleare(strict_types=1)」と指定する必要があります
- NULLを許容する場合は型の前に?を記入します(PHP7.1)
- 返り値がないことを明示したい場合は戻り値宣言にvoidを付けます(PHP7.1)

```php
// 昔
型宣言しなくてもOK（だから不具合がよく起こった

// 今（タイプヒンティングができるようになった）
function(int $hoge, array $day): int
{
	return $hoge;
}
```

## NULLチェック

```php
// $appleがNULLでなければ$apple。$appleがNULLであれば$orange。
$name = $apple ?? $orange;
```

# 参考
- [PHP]PHP7.0での変更点とアップグレード時の対応
    - http://php-archive.net/php/php7/
- PHP7.0がでたので、いまどきの「普通」のPHPの話
    - http://qiita.com/urakawa/items/c5fe8859647f5ecfbb10
Vagrantのconfig.vm.synced_folderのパスの設定、絶対パスか相対パスか

VagrantfileでホストOSとゲストOSのフォルダを同期したい時に`config.vm.synced_folder`で設定しますが、ホストOS側、ゲストOS側それぞれパスの設定の仕方を華麗にミスったせいでよく分からんフォルダ同士が謎に同期されるという事象が起きたので、２度とこのようなことが起こらぬようここに記しておきます。

##※追記
コメントでご指摘がありましたが、
ホスト側のパスはVagrantfileからの相対パスだそうなので修正しました。

##■結論
以下のように、ホストOS、ゲストOS共に最上位のフォルダからのパスをきちんと書いて、かつホストOS側のフォルダが存在しない場合は自動生成する`create:"true"`というオプションをつけることでうまくいきました。

```ruby
config.vm.synced_folder "/docker", "/home/ubuntu/vagrant",create:"true"
```


##■フォルダ構成
ホストOS
VagrantのゲストOSにUbuntuを導入して、そこにdockerを試しに入れてみようと思っていたので、Developフォルダの中に`Vagrantfile`を設置し、同じくDevelopフォルダの中に`docker`というフォルダを作成しました。

```
/Users/katsuki_y/Develop/docker
```
ゲストOS

```
/home/ubuntu
```


##■もともとどんな設定をしたか
###1.最初の設定

```ruby
Vagrant.configure("2") do |config|
   config.vm.box = "ubuntu/xenial64"
   config.vm.synced_folder "/docker","/vagrant"
end
```
`docker`フォルダ内に`Vagrantfile`が存在したので、ホストOS側のdockerフォルダを同期しようと思いました。
また、ゲストOS側は`/home/ubuntu`の下に`/vagrant`フォルダを自動作成して`docker`フォルダと同期しようとしました。

↓

結果、ホストOS側の`/docker`フォルダがありません！と怒られました。

###1.次の設定
そうか、ホストOS側は`docker`フォルダからの相対パスだから、`/docker`じゃ無くて、`/`にすればいいのか！
と思って以下のように設定しました。

```ruby
Vagrant.configure("2") do |config|
   config.vm.box = "ubuntu/xenial64"
   config.vm.synced_folder "/","/vagrant"
end
```
↓

結果、ホストOS側の'/'以降の全てのフォルダ(`Users`とか`Desktop`とか全部)が同期されて訳わからんくなってましたw

そうか、絶対パスなんだ！
と、ここでようやく気づき、少し調べて`create:"true"`が必要ということがわかり、上部の結論に書いた設定に至りました。

##■もう一度結論

```ruby
config.vm.synced_folder "/Users/katsuki_y/Develop/docker", "/home/ubuntu/vagrant",create:"true"
```

パスって難しいですね><

以上。
0x80240017: Failed to execute MSU package. の解消方法

Windows7を最近クリーンインストールしたときの話。

#症状
Visual Studio 2015 の Visual C++ 再頒布可能パッケージ
https://www.microsoft.com/ja-jp/download/details.aspx?id=48145

Microsoft Visual C++ 2015 再頒布可能パッケージ Update 3 RC
https://www.microsoft.com/ja-jp/download/details.aspx?id=52685

上のどちらかをインストールすると、0x80240017が出る時がある。
MSU パッケージが実行できなかったらしい。

# 解消方法
SP1適用する

https://www.microsoft.com/ja-JP/download/details.aspx?id=5842
から
windows6.1-KB976932-X64.exe (64bit)
windows6.1-KB976932-X86.exe (32bit)
あたりをダウンロードしてインストールする。

SP1適用ってよく忘れるよね。
それだけの話でした。修復すれば再インストールされます。
決まった時間にネットワークを切断/接続する

テストのときに、～時間後にネットワークを切断/接続するという条件があった時に放置するための小技。

Windows10 pro. で確認。
何を考えたか、図多めで。


1. タスクスケジューラを起動する
「ここに入力して検索」にタスクと入れるとすぐ出てくる
![クリップボード01.png](https://qiita-image-store.s3.amazonaws.com/0/3677/0e7667c4-ee8c-cf9b-b403-3473e3f82191.png)
タスクマネージャではなくて、アプリの「タスク スケジューラ」を選ぶ

2. タスクを追加する。
![クリップボード02.png](https://qiita-image-store.s3.amazonaws.com/0/3677/f1624c00-df86-708f-1da2-2fb7ae9e35b2.png)
右ペイン「操作」の基本タスクの作成...をクリック。
![クリップボード04.png](https://qiita-image-store.s3.amazonaws.com/0/3677/7ab5dc21-f0b4-8543-00af-40cbf3d9a8dd.png)
適当な名前をいれて、次へ
![クリップボード05.png](https://qiita-image-store.s3.amazonaws.com/0/3677/6c883250-1f1e-a6f7-576e-5002e3f2d5b1.png)
「一回限り」を選んで、次へ
![クリップボード06.png](https://qiita-image-store.s3.amazonaws.com/0/3677/c2c70887-3f61-7c51-e95e-444164452abb.png)
時間を設定して、次へ
![クリップボード07.png](https://qiita-image-store.s3.amazonaws.com/0/3677/7427b28c-2131-3e51-be92-e499aafb4a71.png)
「プログラムの開始」を選んで、次へ
![クリップボード8.png](https://qiita-image-store.s3.amazonaws.com/0/3677/cdda7432-d623-b141-a3b6-3b4bda88351c.png)
「プログラム」```netsh```
「引数の追加」```interface set interface name="イーサネット 2" admin=DISABLED```
を指定して、次へ。
当然、```interface set interface name="イーサネット 2" admin=DISABLED``` の「イーサネット 2」の部分は人によって違うので、自分の環境にあったものを使う。確認方法は後述。
切断じゃなくて接続したい場合は```DISABLED```の部分を```ENABLED```。
![クリップボード10.png](https://qiita-image-store.s3.amazonaws.com/0/3677/5f8508c5-74b2-82e1-2bac-90bb07f2682b.png)
「[完了]をクリックしたときに～」のチェックボックスをチェックして、完了。

3. タスクの権限を設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3677/fb72202d-c60d-36f7-02a9-270876976f7d.png)
これが必要なのかはホントは確認していないのだけど一応念のために「最上位の権限～」をチェックして、OK。

以上。

#### アダプタ名の確認
上で、
>当然、```interface set interface name="イーサネット 2" admin=DISABLED``` の「イーサネット 2」の部分は人によって違うので、自分の環境にあったものを使う。確認方法は後述。

と書いたので、確認方法。

![クリップボード14.png](https://qiita-image-store.s3.amazonaws.com/0/3677/9e292209-4a1d-b887-764d-2d92c3af8b86.png)
タスクトレイのネットワークアイコンを右クリックして、「ネットワークと共有センターを開く」をクリック
![クリップボード16.png](https://qiita-image-store.s3.amazonaws.com/0/3677/53fb4de9-5521-7f4e-531e-962a179eb204.png)
「アダプターの設定の変更」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/3677/f845dcb3-4435-b7a1-bdf4-8dda769092e8.png)
切断/接続したいアダプタの名前を確認する。

以上。
WebUSBからPIC18Fをつついてみる(仮)

うっほあー、USB関連勉強した後だとめっちゃ簡単、というか、libusbそのまんまやんこれ
ベンダーIDも変更してみるか
Microsoft OS 2.0 Descriptorが自動認識の鍵になっているのはわかった。Win8.1以降から使えるらしい。

```html:webusb.htm
<html>
Hello<br>
<script src="webusb.js"></script>
<input type="button" onClick="connectbutton()" value="接続">
</html>
```

```js:webusb.js
function connectbutton()
{
	var device;
	var buf = new ArrayBuffer(1);
	var dat = new Uint8Array(buf, 0, buf.length);
	dat[0] = 0x81;
		
	navigator.usb.requestDevice({ filters: [{ vendorId: 0x04D8 , productId: 0x0053}] })
	.then(selectedDevice => {
	   device = selectedDevice;
	   return device.open(); // Begin a session.
	 })
//	.then(() => device.selectConfiguration(0)) // Select configuration #1 for the device.
	.then(() => device.claimInterface(0)) // Request exclusive control over interface #2.
	.then(() => device.transferOut(1, dat)) // Waiting for 64 bytes of data from endpoint #5.
	.then(() => device.transferIn(1, 64)) // Waiting for 64 bytes of data from endpoint #5.
	.then(result => {
		for(i=0;i<result.data.byteLength;i++)
		{
			console.log('Received: ' + result.data.getInt8(i));
		}
	})
	.catch(error => { console.log(error); });
}
```

#動作サンプル
もうちょっとマシなやつを実際に動く形で置いてみました．
Chromeの最新版をお使いの場合は、以下のページのWebUSBで確認ができます．
https://sabowl.sakura.ne.jp/gpsnmeajp/webusb/webusb.htm



#参考文献
Access USB Devices on the Web
https://developers.google.com/web/updates/2016/03/access-usb-devices-on-the-web
iPhone Xのセーフエリアやマージン幅について

## 論理尺度比較図

ピクセル値ではなく、iOS ランタイムで扱われる論理尺度での比較図を作りました。単位は `pt` です。プログラミングにおいては実際にはこちらの座標系が利用されるからです。

<img width=2943 alt="iPhone X Series" src="https://qiita-image-store.s3.amazonaws.com/0/3603/1903a24a-d083-b50a-f6da-cee8f271f3d3.png">
*iPhone X, iPhone XR, iPhone XS, iPhone XS Max 反映版。間違ってたらごめんなさい。*

|デバイス|解像度|論理尺度|物理尺度|セーフエリア（縦）|セーフエリア（横）|
|:---|:---|:---|:---|:---|:---|:---|
|iPhone XS Max|3x|414×896 pt|1242×2688 px|414×818 pt|808×393 pt|
|iPhone XR|2x|414×896 pt|828×1792 px|414×818 pt|808×393 pt|
|iPhone XS|3x|375×812 pt|1125×2436 px|375×734 pt|724×354 pt|
|iPhone X|3x|375×812 pt|1125×2436 px|375×734 pt|724×354 pt|

X と XS はレイアウトの上では同一です。XR と XS Max は物理サイズと解像度が異なるだけで、論理尺度では一致することがわかります。また、414 という数値は Plus 系に出てきた値であることから、XS Max は Plus 級であることが見て取れます。

iPhone シリーズのレイアウトに関するより詳しい情報は HIG にまとまっています。
https://developer.apple.com/design/human-interface-guidelines/ios/visual-design/adaptivity-and-layout/


### Large Title 時のステータスバーとナビゲーションバーの高さ

iPhone 8 と iPhone X の高さを比較すると、その差は**145pt**となります。Large Title 時のナビゲーションバー下端までの距離は 140pt ですから、差し引いた分が iPhone 4.7" の高さと一致するかと思いきや実は**5pt**ずれるようです。*（過去に一致すると書いてしまっていたのは間違いでした。）*

ステータスバーのアイコンは中央に配置されていることや、ツールバーとタブバーの高さの差異が無くなったなどの特徴を目視で判断することができます。

<img width=1684 alt="iPhone 8 vs. iPhone X, XS" src="https://qiita-image-store.s3.amazonaws.com/0/3603/06ec1b18-0045-9b61-0880-8a9c9a2e3155.png">

<img width="798" alt="スクリーンショット 2017-09-20 2.17.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/3603/a8a519c2-0f14-3c64-4102-bab820b2d6ff.png">
*iOS HIG (2017); https://developer.apple.com/ios/human-interface-guidelines/overview/iphone-x/*

## Interface Builder でマージン位置にガイド線を引く

`Editor` > `Canvas` > `Show Layout Rectangles` でガイド線を表示できる。

![](https://qiita-image-store.s3.amazonaws.com/0/3603/7bae0636-f390-f482-2976-a08ba86041b5.png)

## 適切なマージンを保つ Auto Layout 制約を設定

`Constrain to margins` を有効にし、左右制約を Safe Area ではなく View を対象にする。マージンを0にする。
Portrait/Landscapeで変化するマージン幅にも対応できる。

![](https://qiita-image-store.s3.amazonaws.com/0/3603/3432db2b-3385-6d46-8320-aef9e3abbafb.png)

![](https://qiita-image-store.s3.amazonaws.com/0/3603/752ee7c4-21ba-3cdc-31ff-7b5f81e4f2aa.png)

![](https://qiita-image-store.s3.amazonaws.com/0/3603/9c176014-f03c-a85b-f45f-d1fdb63c5213.png)
rbenvをupdateして最新のRubyバージョンをインストール


Homebrewを使用して、rbenv・rbenv-buildを最新にする

```
# Homebrewをアップデート
$ brew update
```

```
# ruby-buildをアップデート
$ brew upgrade ruby-build
```

```
# インストール可能なrubyのバージョンを確認
$ rbenv install --list
```

```
# Rubyの指定したバージョンをインストール
$ rbenv install 2.4.1
```
最新のバージョンを調べてインストールして下さい！

```
# 通常使う　Rubyを設定
$ rbenv global 2.4.1
```

```
# 設定結果を確認
$ rbenv versions
```

```
# Rubyのバージョンを確認
$ ruby -v
```

以上で最新のRubyを利用できるようになります
Control + l

# Control + l

Macのターミナルとかでコマンドプロンプト(入力する部分)を
見やすくするためにEnterを連打したり

```
$ clear
```
打ってコマンドプロンプトを画面の上部に表示させたりするけど、

```
Control + l
```
これでclearと同じ意味になる。


### 用語
---
コマンドプロンプト

```
macのターミナルやLinuxの画面で入力を促すマーク。

一般ユーザだと「$」で、root権限だと「#」になる。

厳しい現場の手順書書く時とか、logを捏造する時には注意。
```

CUI

```
macのターミナルとかLinuxのコンソール画面とか

背景が黒い画面(黒とは限らないが)の

文字表示だけのいかにもエンジニアっぽい画面。

反対にアイコンとかある画面をGUIっていう。
```
Goで指定したディレクトリ配下のファイルをフラットにする

Goで指定したディレクトリ配下のファイルをフラットにするロジック。

これを、

```
$ tree
.
├── file_1.txt
├── file_2.txt
├── sample_1
│   ├── file_3.txt
│   └── file_4.txt
└── sample_2
    ├── file_5.txt
    ├── file_6.txt
    └── sample_3
        ├── file_7.txt
        └── file_8.txt
```

こうする。

```
$ tree
.
├── file_1.txt
├── file_2.txt
├── file_3.txt
├── file_4.txt
├── file_5.txt
├── file_6.txt
├── file_7.txt
└── file_8.txt
```

### ソース

```go:dirFlatten.go
package main

import (
	"io/ioutil"
	"os"
	"path/filepath"
)

func main() {
	baseDir := "/tmp/test"
	dirFlatten(baseDir, baseDir)
	deleteDir(baseDir)
}

func dirFlatten(dir string, base string) error {
	files, err := ioutil.ReadDir(dir)
	if err != nil {
		return err
	}

	for _, file := range files {
		if file.IsDir() {
			err = dirFlatten(filepath.Join(dir, file.Name()), base)
			if err != nil {
				return err
			}
			continue
		}
		err = os.Rename(filepath.Join(dir, file.Name()), filepath.Join(base, file.Name()))
		if err != nil {
			return err
		}
	}
	return nil
}

func deleteDir(dir string) error {
	files, err := ioutil.ReadDir(dir)
	if err != nil {
		return err
	}

	for _, file := range files {
		if file.IsDir() {
			err = os.RemoveAll(filepath.Join(dir, file.Name()))
			if err != nil {
				return err
			}
		}
	}
	return nil
}
```

### 実行

```
$ go run dirFlatten.go
```

### 参考
- [Golangでディレクトリ内のファイル一覧を入手する](http://qiita.com/tanksuzuki/items/7866768c36e13f09eedb)
- [Go言語入門(ファイル・ディレクトリ操作)](http://qiita.com/knt45/items/557ee65c46a685ea4f59)

[Golangでディレクトリ内のファイル一覧を入手する](http://qiita.com/tanksuzuki/items/7866768c36e13f09eedb)のコメントで紹介されていた https://golang.org/pkg/path/filepath/#Walk を使えばもっと簡単に出来たのか、と今気付いた(´°̥ω°̥｀)
【python】numpy配列連結操作備忘

配列にデータ列を1カラムしたいことがあったが、スマートに書けずに詰まってしまった。色々と触ってみたらnumpyの行列の概念について気づきがあったのでまとめておく。

## 背景
X: n*m行列(n:データ数、m:特徴量次元)の標本データと、正解ラベルy:n個 ( `np.array([])`で定義。後述の通り、行・列の両方として機能)があるとき、配列Xのm+1列目に正解ラベルyを追加して、データ一覧と正解ラベルを並べて見たいことがあった。

具体的には下記のようなことである。

```python3:Xは標本データ、yは正解ラベル
X = np.array([[1,2],[3,4],[5,6]])
y = np.array('a','b','c')
```

上のようなデータがあるとき、次のように標本データに正解ラベルのカラムを1列追加したい

```python3:標本データに正解カラムを1列追加した例
-> array([[1,2,'a'],
          [3,4,'b'],
          [5,6,'c']])
```

## やりかた
### vstackを使う方法
Xを転置させ、正解ラベルyを末尾に1行連結する。最後に全体を転置して完成。
`np.vstack((X.T, y)).T`


### appendを使う方法
yを明示的にn行1列の配列としてリサイズする。axis=1とすることでXにyを列方向に連結する。
`np.append(X, y.reshape(len(y), 1), axis=1)`


### 変則的な別解
あらかじめ正解ラベルを`y = np.array([['a','b','c']])`として`[]`を二重にして、1行3列の配列として生成させる。ここで、y.Tとすると下記のように3行1列となる。

```python3
array([
['a'],
['b'],
['c']
])
```

よって、この場合は下記のコマンドでうまくいく。
`np.append(X, y.T, axis=1)`


## わかったこと
・1行3列を明示的に表現するには `np.array([[1,2,3]])`
・`np.array([1,2,3])`と表記すると1行3列の配列になると思い込んでいたが、shapeを確認すると(3,)と出力された。`np.array([1,2,3).T`としても同様。
・すなわち、np.array([1,2,3])と表記しただけでは行や列の概念がないと解釈できる。（というより、臨機応変に「行」や「列」として動作しているようだ)
ごめんな、安くてコスパのよいCIサービスを探してんだ。 2017秋

CIにお金をかけられない小さな会社や、個人プロダクト、その他諸事情でお金をかけられない場合ってあるじゃないですが。
何を選ぶべきか、いくつかサービスの価格面、機能面を比較のためメモしてみます。

## shippable

https://www.shippable.com/pricing.html

**Freeプラン**

- 公開リポジトリならビルド無制限
- プライベートリポジトリは150 ビルド/月
- c4.large(ec2?)

**$25/75/150/月プラン**

- public/private問わずビルド無制限
- インスタンスによって料金がかわる。

**$500/月プラン**

- 高いので知らん！その分いろいろいいはず!
- サポートもしてくれるしいいインスタンス使えるし

### 特徴

- travis, circleCIと比べると知名度低いかもしれないが、  
  他のCIサービスみたいにyml書く普通のCIサービス
- circle ci2.0みたいに素のdockerコンテナを動かしたりは、できないかな?  
  (shellscript動くのでどうにかなるかもしれないが...)
- サンプル   
  https://github.com/devops-recipes/basic-node/blob/master/shippable.yml

## CircleCI
価格 https://circleci.com/pricing/  
2.0のdocument https://circleci.com/docs/2.0/  

**Freeプラン**

- 月のビルド時間1,500分(==25時間)まで
- 1container
- 並列ビルドはできない

**それ以外は従量課金**

- 2container(1並列ビルド) : $50/月
- 3container(1並列ビルド) : $100/月
- 4container(4並列ビルド) : $150/月

### 特徴など
- osxでのビルドもできる(iOS向け?)
- 上記料金プランはlinuxビルドの場合
- 2.0で色々設定方法(.circlci/config.yml)が変わった。
- 2.0から普通のdockerコンテナが使える
- jobとかworkflowとかstepとかキャッシュ機能とかついている。
  1系しか知らないのでなんか設定調べるのだるい。
- でもローカルで動かせるらしい
- dockernizeされたアプリケーションだろうと、kubernetesアプリだろうとなんだかんだ1手間2手間設定があるし、安くすませようとしたら、本番と違ってコンテナ数を抑えたテスト環境を設定しなくてはならん。
  (どこでも同じ環境が一発で立ち上がるのがコンテナの良さだったのでは...)
- 有名なので結構情報はある。ただし、それは1系の話。
  2.0の情報はまだ少ない
  なので雰囲気で2.0の設定を書いているとあちこちではまるのでちゃんとドキュメント読もう

## TravisCI

https://travis-ci.com/plans

**Bootstarpプラン $69/月**

- 1ジョブのみ(並列できない)
- 月のビルド時間制限ない
- リポジトリ制限なし

**Startupプラン $129/月**

- 2並列ジョブまわせる

**Small Businessプラン 高い!**

- $249/mo ...
- 5 並列ジョブまわせる

**Premiumプラン とてもお高い!!**

- $489/mo .....
- 10並列ジョブまわせる

### 特徴など

- OSSならフリー
- 必要な機能はそろってるっぽいし、前に個人リポジトリで例に使ったことあるし不満はない。
- 若干割高感はある。

## 所感
circleCIでいくか。
2.0の設定方法よく調べたいと思います。

お金やコスパの話はおいといて、CIって裏側の仕組みがなんとなく垣間見えたりするので、いろいろと勉強させてもらいます。

CIサービス運営してる会社の方本当すみません。
こんな投稿して。
いつか一発当たったらガンガンお金払ってCIまわさせてもらいます
COPYとcopyメタコマンド

# COPY
SQLコマンド
```
COPY table_name  FROM 'filename'
```
[公式ドキュメント:copy](https://www.postgresql.jp/document/9.6/html/sql-copy.html)

# copyメタコマンド
psqlで開いたターミナルで利用できるコマンド
```
\copy  {table} from 'filename'
```
[公式ドキュメント:psql](https://www.postgresql.jp/document/9.6/html/app-psql.html#app-psql-meta-commands-copy)


# 違い
SQLコマンドはリモートサーバー（SQLコマンドが実行されるDBが存在するサーバー）のファイルを読み込む
copyメタコマンドはローカルサーバー（ターミナルを開いているサーバー）のファイルを読み込む
Linux OSの種類とバージョンの調べ方

このマシンのＯＳなんだっけ。
そんな時は、何も考えず下記のコマンドをコピペ実行！
CentOSでもRedHat EnterpriseでもUbuntu、Alpine、Fedore、Debian、SUSE Linux、Solarisでも問題なし！(たぶん。)

# ■コマンド
$ grep -H "" /etc/\*version ; grep -H "" /etc/*release

なお、 grep -H "" /etc/{*version,*release}だと上手くDebian7の環境で{}のワイルドカードが正しく動作しなかった。。

# ■こんな長いコマンド覚えられない!
覚えなくてOK。
要は
cat /etc/*release
cat /etc/\*version
すればどんなＯＳか分かるということです。


# ■動作確認済み

## ■CentOS6.9
$ grep -H "" /etc/\*version ; grep -H "" /etc/\*release
grep: /etc/*version: そのようなファイルやディレクトリはありません
/etc/centos-release:CentOS release 6.9 (Final)
/etc/redhat-release:CentOS release 6.9 (Final)
/etc/system-release:CentOS release 6.9 (Final)

## ■Debian7
$ grep -H "" /etc/\*version ; grep -H "" /etc/*release
/etc/debian_version:7.11
/etc/os-release:PRETTY_NAME="Debian GNU/Linux 7 (wheezy)"
/etc/os-release:NAME="Debian GNU/Linux"
/etc/os-release:VERSION_ID="7"
/etc/os-release:VERSION="7 (wheezy)"
/etc/os-release:ID=debian
/etc/os-release:ANSI_COLOR="1;31"
/etc/os-release:HOME_URL="http://www.debian.org/"
/etc/os-release:SUPPORT_URL="http://www.debian.org/support/"
/etc/os-release:BUG_REPORT_URL="http://bugs.debian.org/"

##  ■Raspbian8の場合
$ grep -H "" /etc/\*version ; grep -H "" /etc/*release
/etc/debian_version:8.0
/etc/os-release:PRETTY_NAME="Raspbian GNU/Linux 8 (jessie)"
/etc/os-release:NAME="Raspbian GNU/Linux"
/etc/os-release:VERSION_ID="8"
/etc/os-release:VERSION="8 (jessie)"
/etc/os-release:ID=raspbian
/etc/os-release:ID_LIKE=debian
/etc/os-release:HOME_URL="http://www.raspbian.org/"
/etc/os-release:SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
/etc/os-release:BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

## ■Ubuntu 14
$ grep -H "" /etc/\*version ; grep -H "" /etc/*release
/etc/debian_version:jessie/sid
/etc/lsb-release:DISTRIB_ID=Ubuntu
/etc/lsb-release:DISTRIB_RELEASE=14.04
/etc/lsb-release:DISTRIB_CODENAME=trusty
/etc/lsb-release:DISTRIB_DESCRIPTION="Ubuntu 14.04.5 LTS"
/etc/os-release:NAME="Ubuntu"
/etc/os-release:VERSION="14.04.5 LTS, Trusty Tahr"
/etc/os-release:ID=ubuntu
/etc/os-release:ID_LIKE=debian
/etc/os-release:PRETTY_NAME="Ubuntu 14.04.5 LTS"
/etc/os-release:VERSION_ID="14.04"
/etc/os-release:HOME_URL="http://www.ubuntu.com/"
/etc/os-release:SUPPORT_URL="http://help.ubuntu.com/"
/etc/os-release:BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

## ■Alpine 3.9
/usr/src/app # grep -H "" /etc/*version ; grep -H "" /etc/*release
grep: /etc/*version: No such file or directory
/etc/alpine-release:3.9.4
/etc/os-release:NAME="Alpine Linux"
/etc/os-release:ID=alpine
/etc/os-release:VERSION_ID=3.9.4
/etc/os-release:PRETTY_NAME="Alpine Linux v3.9"
/etc/os-release:HOME_URL="https://alpinelinux.org/"
/etc/os-release:BUG_REPORT_URL="https://bugs.alpinelinux.org/"

## ■参考
CentOS、UbuntuなどLinux OSのバージョン確認をするコマンド | UX MILK http://uxmilk.jp/13610
LinuxのOSバージョン情報を確認する http://uguisu.skr.jp/Windows/linux_os_version.html
Solarisのバージョンを確認する方法 - ablog http://d.hatena.ne.jp/yohei-a/20090626/1246023366
sklearn の train_test_split でデータの順番の情報を保持しておく

### sklearn の train_test_split でデータの順番の情報を保持しておく

```
この記事ではscikit-learn0.18.1を利用しています。
```
### はじめに
***

データを学習用とテスト用に分割する train_test_split は非常に便利なのですが、
時系列データなど「順番」に意味がある場合、分割後もその情報を持っていたいケースがあるかと思います。

シンプルなデータであれば、順番の情報を持った上で分割し、後から取り除く・・・などあるのですが、
データが画像のような複雑な場合はうまくいかない。どうしよう・・・と思っていたら、
以下のようなシンプルな方法でできました。

### データの分割
***

```py
# coding:utf-8

import numpy as np
from sklearn.model_selection import train_test_split

X = np.arange(10).reshape((5, 2))
Y = np.array([1,1,0,1,0])
indices = np.array(range(X.shape[0]))

X_train, X_test, Y_train, Y_test, indices_train, indices_test = train_test_split(X, Y, indices, test_size=0.33, random_state=111)

```
indices で順番の情報を持っておいて、これもまとめて分割しています。

keras で画像データを解析していて、この問題に直面しました。
データフレームにすればインデックス番号を利用できると思ったけど、多次元データのデータフレーム化は
なかなかうまくいかず、numpy でいろいろやろうと思ったけどうまくいかず。
で、調べていたら上のようなシンプルなやり方がありました。