OmniAICreator/Qiita-1.07M huggingface dataset:
docker-compose で簡単! 最小お手軽構成のPythonテスト環境

# お手軽Python環境を構築しました。

## 手順
- docker-compose.yml ファイルを作る
- test.pyみたいな適当なPythonファイルを作成する
- `docker-compose up -d`
- `docker exec -it python /bin/bash`
- Pythonのコードを書いて色々テストや検証をする

## サンプルコード
書いたコードはこちら

### docker-compose.yml
```docker-compose.yml
version: '3'
services:
  app:
    image: python:3.6
    volumes:
      - './:/var/www/html'
    container_name: python
    tty: true
    working_dir: '/var/www/html'
```

### test.py
```test.py
print('Hello world')
```

## Githubに置きました。
ここにアクセス！　[tyamahori](https://github.com/tyamahori/python-test-env)
iOS UIWebView で404などのステータスコードを取得する。

# UIWebViewでステータスコード取得

UIWebViewはステータスコードを簡単に取得できないくそAPIでした！

が下記のようにすれば取得できます。

```Objective-C
//
//  ViewController.m
//  lp
//
//  Created by Shichimitoucarashi on 2018/02/26.
//  Copyright © 2018年 keisuke yamagishi. All rights reserved.
//

#import "ViewController.h"

@interface ViewController () <UIWebViewDelegate>
@property (weak, nonatomic) IBOutlet UIWebView *web;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSURL* url = [NSURL URLWithString: @"http://shichimitoucarashi.com/api/image/88a8e8049f751ac/TE/"];
    NSURLRequest* request = [NSURLRequest requestWithURL:url];
    self.web.delegate = self;
    [self.web loadRequest:request];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    NSCachedURLResponse *urlResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:webView.request];
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*) urlResponse.response;
    NSInteger statusCode = httpResponse.statusCode;
    
    NSLog(@"status code: %ld",(long)statusCode);
}

@end

````

### 参考サイト

https://stackoverflow.com/questions/2236407/how-to-detect-and-handle-http-error-codes-in-uiwebview
Excelのお作法から解放されたい、MarkDownで作業手順書を作成

## きっかけ

リリース手順書等の手順書を作成する際に前の人が使っていた、もしくは別のプロジェクトで作成したExcelのテンプレートをアレンジして手順書作成を行っていたのだが、結局列幅の調整やメリハリを付けたフォントの調整、A1に選択位置を合わせるといったExcelのお作法の微調整をイライラしながら行っていた。

表示形式は他に任せたいと思ったら以下の記事を見つけ、やってみた所感を記載する。

▼エクセルで手順書を作るのはきっとやめた方がいい
https://qiita.com/n_slender/items/2b237c17605372a4b845
## 完成品
![md2.png](https://qiita-image-store.s3.amazonaws.com/0/230829/2c08e7e3-db62-9296-8acf-310a17ec6bd0.png)

## 必要なソフト、以下ダウンロードしておくこと
* Visual Studio Code （Atomでも多分OK、インストール済みなので使ってみた）
* MarkDown PDF （Visual Code Studioのプラグイン、PDFやHTMLで出力できる）

## 手順

### 0.Visual Studio Code の設定追加

```json:ユーザー設定
    "markdown-pdf.convertOnSave": true, //自動保存、MDファイルと同じ箇所に保存される
    "markdown-pdf.type": "html"
```
###1.mdファイルを用意
```md:MarkDown.md
# 作業手順書
## 更新履歴
|更新日|更新者|更新内容|
|:-----------|:-----------|:-----------|
|2018.02.27|h2|新規作成|
|2018.02.28|h2|切り戻し手順書追記|
## 前提条件
* 作業するPCに○○のソフトウェアがダウンロード済みであること
* 作業用のアカウントのロック解除されていること
* 不具合発生時に**10分**以上調査に時間がかかり復旧困難な場合、以下の緊急連絡先に連絡すること
## 環境情報
|環境名|URL|ログイン|パスワード|
|:-----------|:-----------|:-----------|------------:|
|本番環境|xxxx.com|Administrator|Password|
## 手順＆タイムテーブル
|No|確認チェック|作業内容|確認手順|作業時間|備考|
|:-----------|:-----------|:-----------|:-----------|:-----------|:------------|
|1||上記の環境にログイン|画面が正しく表示されていること|5分||
|2||画面の管理->ソース管理をクリック|ソース管理画面が正しく表示されていること|3分||
|3||以下のソースファイルを上書きする|●●機能が正しく動作すること|7分|<div style="color:red">ネットワークトラブル等で上書きできない場合は、一度ログアウトを行い手順1から実施し直す</div>|
```

###2.プレビューで確認＆保存すると自動的にHTMLファイルが作成・上書きされる
画面の右上の虫眼鏡アイコンを押すとプレビューが表示される。
![md1.png](https://qiita-image-store.s3.amazonaws.com/0/230829/24d1bfb4-8092-ca78-4d77-b07dedcff0d2.png)

## 使ってみての所感
* 便利！レイアウトを気にせず書くことができ、表がきちんと整形され表示される
* A1にセルを合わせるとかお作法について気を使わないくて良い
* HTMLタグを使えるのでCSSとか使えばある程度レイアウト自由自在

## 反対にExcelのほうが良いと思った所
* 強調したい箇所の色を変えるのが少し面倒。ワンクリックでいけない。styleを書かないとイケない。（反対にコード指定のため、複数箇所で細かい色を使うとき統一しやすくなったかも）

* 画像を手順書に載せるのも同じ。imgタグを書かないといけなそう。
　ただ作業手順書の資料はコマンドの入力等がメインなため、画像の切り張りはいらないかもしれないが反対にユーザ向けの資料（画像が多いもの・図を挿入したいもの）の資料作成にこの方法はむかないかも。
* 作業時間の合計を求めるのが、、、計算式を組めないのが不便かも
[Node.js]WebページのHTMLをダウンロードする方法

##WebページのHTMLをダウンロードする方法
```javascript:index.js
//モジュールのインポート
const https = require('https');
const fs = require('fs');

// ダウンロード先のURL
const url = 'https://github.com/';
// HTMLの保存先
const savepath = 'test.html';

https.get(url, (res) => {
  res.pipe(fs.createWriteStream(savepath))
  .on('error', (error) => console.error(error))
  .on('finish', () => console.log('ok'));
});
```
**解説:**
**1. モジュールのインポート**
インポートするモジュールはアクセスするページのプロトコルによって異なります。
"http://"にアクセスするならhttpモジュールをインポートしてください。
**2. Webページにgetメソッドでアクセスする**
https.getに与える引数は、URL,コールバック関数です。
###スクリプトの実行
```node ./index.js``` を実行すると、プロジェクトのディレクトリの直下にtest.htmlが出力されます。

##おまけ
```javascript:index.js
//モジュールのインポート
import fs from 'fs'
import request from 'request'

// ダウンロード先のURLを指定
var url = "https://github.com/";
// HTMLの保存先を指定
var savepath = "test.html";
var outfile = fs.createWriteStream(savepath);

request(url).pipe(outfile)
```
これでも同じことができます。
SQL*Plusよく使うコマンド

###よく使うコマンド
|コマンド|説明|
|:--|:--|
|start ファイル名|.sqlとかを実行する|
|show user|今ログインしてるユーザー名を表示|
|show parameters instance_name|SIDを表示|
|show parameters db_recovery_file|フラッシュリカバリ領域の場所、サイズを表示|
|show parameters memory_target|自動メモリ管理で使用可能なメモリ。手動管理だと0を表示|
|show parameters background_dump_dest|アラートログの出力先を表示|
|show parameters control_files|制御ファイルの場所を表示|
|select * from dba_users;|ユーザー一覧|
|select * from dba_files;|データファイルの表示（TEMP除く）|
|select * from dba_temp_files;|データファイルの表示（TEMPのみ）|
|select * from dba_tablespaces;|表領域の表示|
|select * from v$log;|REDOログの情報|
|select * from v$logfile;|REDOログファイルの場所を表示|
|archive log list|ログモードを確認する|
|alter database archivelog;|アーカイブログモードに変更|

###小ネタ
|コマンド|説明|
|:--|:--|
|set linesize [文字数]<br>set pagesize [行数]|表示する領域を増やす|
|rman target/<br>advise failure all<br>repair failure|壊れたら大抵これで治ります😆|
Makey Makey 

Mac


![Kobito.JO4ZyP.png](https://qiita-image-store.s3.amazonaws.com/0/49910/7aecc862-7a2a-a244-134c-86fd426cd810.png "Kobito.JO4ZyP.png")


公式に書いてあるとおりにこのウィンドウを閉じる

<pre>
The MaKey MaKey doesn’t exactly have a shift key, much less a key next to it. I’m not exactly sure of what Mac OS is trying to do here, but you’re safe to ignore this window by just closing it. You’ll only be asked to “Identify Your Keyboard” the first time you plug the MaKey MaKey in.
</pre>



[ Makey Makey ](https://makeymakey.com/how-to/classic/)
どっきりｗ C言語のCGI でウィルス判定。みんなも試してみよう

以下ファイルを用意します。

```c:index.h
#ifndef INDEX_CGI_INDEX_H_
#define INDEX_CGI_INDEX_H_
/* 特に意味はありません */
#endif /* INDEX_CGI_INDEX_H_ */
```
```c:index.c
#include "index.h"
#include <stdio.h>

int main(void) {
	return 0;
}
```

```sh:Makefile
all:
	@make clean
	@make index.cgi

index.cgi:
	@gcc index.c -o index.cgi
	@mv index.cgi ${DIR}/dest/

clean:
	 @rm -rf index.cgi
	
```

make を実行します。

なぜか mv で **Heur.AdvML.B** が検出されます。
gcc の出力では判定されないのにｗ
CSSアニメーション入門

## animationプロパティを指定する

### Usage

```
animation: [キーフレーム名] [アニメーション時間]
    [アニメーションのイージング指定] [アニメーション開始時間]
    [繰り返し回数] [アニメーション終了後プロパティをどのように保持するか]
```

### キーフレーム一覧

・fadeout
要素が徐々に透明になって消えるアニメーション（フェードアウト）。

### アニメーションのイージング指定

http://www.htmq.com/css3/animation-timing-function.shtml

### 繰り返し回数

http://www.htmq.com/css3/animation-iteration-count.shtml

### アニメーション終了後プロパティをどのように保持するか

https://dekiru.net/article/13263/

## `@keyframes {}`を指定する

0% ~ 100%の間にプロパティを指定してアニメーションを作っていく。
動画編集するときのキーフレームと同様。
中間点を細かく打っていくことで複雑なアニメーションも組むことができる。

### Usage

```
@keyframes [keyframe-name] {
    [percentage] { [property]: [field] }
}
```

### cssアニメーション専用プロパティ

https://qiita.com/miyagaw61/private/5f4de8498457cfc0f592

## 負荷/処理速度

アニメーションをたくさん使う場合は、translateやscaleのような描画コストが少ないものできるだけ指定してあげると良い。

## 注意

メディアクエリを使用している場合は、`animation`プロパティを重ねて宣言してはいけない。
javascriptを使うとうまくいかないことがある？？
Rails：カラム名を別名で返したい場合は素直にAS句を使った方が良いかも 1000件で380ms速くなった

早々にすみません、諸事情によりコードはお見せできず、サンプルコードで例を示します。

# 改善前

下記のコントローラーでは、user_nameというカラムをnameという別名のkeyで返したいが為に入れ替えを行っている。

※実際にはもっと色々なフィールドを移し替えていました。

```ruby:users_controller.rb

def index 
  all_user = []

  User.all.each do |user|

    hash = {
        id:   user.id,
        name: user.user_name
      }

    all_user.push(hash)
  end

  render all_user
end
```

# 改善後

下記のコードの場合は取得後に移し替えるのではなく、AS句を使って取得と整形を同時に行っている


```ruby:users_controller.rb

def index 
  render User.select("id, user_name AS name").as_json
end
```

# 結果
厳密にはサンプルコードの結果ではないのですが、手元にあるAPIのINDEXメソッドでは1000件ほどのレコード数の場合、改修前後で約<b>`380ms`</b>の違いが出ました。

|改善|速度(ms)|
|---|---|
|前|560ms|
|後|180ms|
|計|-380ms|


# 感想
<b>380ms</b>はデカいです。。

参考のコードはかなりシンプルになってしまったのですが、実際のコードでは改善前後で行数や複雑度はそこまで変わりませんでした。

あまり変わらないのであれば改善前のように`ActiveRecord`オンリーで書くスタイルの方が一般的には（少なくとも私の現場では）良いとされているため、改善後のようなSQL混じりのコードを書くことは避けられる傾向にあります。

しかし速度の面でSQLは無視できないメリットがあるため、うまく改行を使ったり、スコープとして切り出すなどして<b>SQL混じりでも読みやすいようなスタイル</b>を取り入れるのも十分に検討の余地があるなと。


# まとめ
* 一時変数のhashに代入しまくっている箇所があったら怪しいと思った方が良い
* 素直にAS句で取り出してそのまま使う方が速い
* SQL混じりでも読みやすいスタイルを検討する


# 参考にしたWebページ
[Qiita - rails ActiveRecordでAS句を使う方法
](https://qiita.com/TakakiSato/items/f4192611a4737323fcb4)
Wifi接続の際、Raspberry Pi 3 Model Bに固定IPアドレスを設定する

#参考にしたサイト
https://qiita.com/shin1kt/items/e2f57fcff95f5196cd4d

#手順
- /etc/dhcpcd.confを開く

```ruby
$ sudo nano /etc/dhcpcd.conf
```

-開いた画面の一番下に下記のように任意の固定IPアドレスを記入

```ruby
interface wlan0
static ip_address=192.XXX.XX.XX/24
static routers=192.XXX.XX.X
static domain_name_servers=192.XXX.XX.X
```

ip_address　設定したいIPアドレス
routers ルータのIPアドレス
domain_name_server ルーターのDNSアドレス

-ターミナルを閉じてRaspberry Piを再起動
```ruby
$ sudo reboot
```
CentOS 7 OSインストール後の初期設定

# 動作確認環境
- 仮想環境 VMware Workstation Player 14.1.1
- OS Windows 10 Pro 64bit

# 仮想環境
- OS CentOS 7.4 (1708) minimalインストール
- メモリ 2GB
- HDD 250GB

# 基本パッケージのインストール
minimalインストールには、サーバソフトウェアを構築するためのツールが無いので、必要なパッケージを導入する。

````
yum -y groupinstall base
yum -y groupinstall development
yum -y groupinstall network-tools
````

# yum アップデート

````
yum -y update
````

# 不要サービスの停止

````
systemctl disable abrt-ccpp
systemctl disable abrt-oops
systemctl disable abrt-vmcore
systemctl disable abrt-xorg
systemctl disable abrtd
systemctl disable atd
systemctl disable auditd
systemctl disable avahi-daemon
systemctl disable kdump
systemctl disable mdmonitor
systemctl disable dmraid-activation
````

# SELinux無効設定
SELinuxを無効にするため`selinux`設定ファイルを変更する。

````
vi /etc/sysconfig/selinux
````

変更箇所

````/etc/sysconfig/selinux
SELINUX=disabled
````

設定を反映させるため再起動する。

````
shutdown -r now
````

---
[目次](https://qiita.com/knutpb1205/items/3ece0cab588afdb13f02)
IBOutletにおける weak vs strong

storyboardのオブジェクトをコードに関連づけるとき、 `@IBOutlet weak var hogehoge: UIView!` みたいなコードが自動生成される。
ただ、`weak`はいらないだの、`!`を`?`にした方がいいなど議論があるので、それについて検証した。

解放されるか確認するために、こんなViewで検証を行った。

``` swift
class HogeView: UIView {
  deinit {
    print ("deinit!!!!")
  }
}

```

# `@IBOutlet weak var hogehoge: HogeView!` について

``` swift
@IBOutlet var hogehoge: HogeView?

viewDidLoad() {
  super.viewDidLoad()
  
  hogehoge.removeFromSuperview()
}
```
上記のコードだけでdeinitが呼ばれる、つまりsuper viewからremoveされたらもうそのviewが使えなくなる。
使おうとしようものなら、クラッシュが発生する、怖い

# `@IBOutlet var hogehoge: HogeView!` について

``` swift
@IBOutlet var hogehoge: HogeView?

viewDidLoad() {
  super.viewDidLoad()
  
  hogehoge.removeFromSuperview()
  hogehoge = nil
}
```
nilを入れて初めてdeinitされる。逆にいうと、removeしてもインスタンスが解放されないので使い回せるので便利。
ただ、removeする前に`hogehoge = nil`を入れても、`ViewController.view.subviews`が参照しているので、インスタンスは解放されないので注意。

# `@IBOutlet weak var hogehoge: HogeView?` について
最初のコードと挙動は同じだが、使おうとしてもクラッシュはしないので安全。
安全、かつインスタンスも解放されやすいので、これが最もおすすめ

# 結論
やっぱりケースバイケースで使うべき。

- IBOutletのViewをremoveする予定がなければ、適当でOK
- IBOutletのViewをremoveし、その後は使わなければ、`@IBOutlet weak var hogehoge: HogeView!`
- IBOutletのViewをremoveし、その後また使うなら`@IBOutlet var hogehoge: HogeView!`
- なにも予想できない場合は、`@IBOutlet weak var hogehoge: HogeView?`

という感じになるのかな。新たな知見がある場合はコメントください。

# おまけ
やっぱりprivateつけたいよね
`@IBOutlet private weak var hogehoge: HogeView?`
Powershellの-Pathパラメータの挙動が怪しかったので備忘

## 書きたいこと。

* あくまで備忘録。ちゃんと検証とかしていない。
* 発生条件がはっきりしておらず、他の環境で発生するか分からず。

## 事象の環境

| MW | バージョン |
|:-:|:-:|
| OS | Windows7, Windows10  |
| Powershell  | 2, 5  |


## 何が起きたのか。

コマンドプロンプト上でPowershellを実行しました。
すると、出力系のコマンドレットで -Path や -LiteralPath がうまく処理されなかったのです。

``` cmd
cmd> powershell -Command "& { Get-ChildItem | Export-Csv -LiteralPath ./out.csv }"
cmd> powershell -Command "& { Get-ChildItem | Export-Csv -Path ./out.csv }"
cmd> powershell -Command "& { Get-ChildItem | Out-File -Path ./out.txt }"
```

この時本来であれば ``-Path`` や ``-LiteralPath`` に指定した先にファイルが出来上がるはずなのですが。

> Out-File : パラメーター名 'Path' に一致するパラメーターが見つかりません。
> 発生場所 行:1 文字:28
> + &{Get-ChildItem | Out-File -Path ./dir.txt}
> +                            ~~~~~
>    + CategoryInfo          : InvalidArgument: (:) [Out-File]、ParameterBindingException
>    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.OutFileCommand

こんな感じにPathがちゃんと見てくれない。
※Export-Csvはもしかしたらちゃんと動くかも。


代わりに、-Pathを明示的に指定しないで実行すると、

``` cmd
cmd> powershell -Command "& { Get-ChildItem | Out-File ./out.txt }"
```

これはうまくできる。なぜだろう……
pix2pix_multiGANモデルができたよ♬

前回の報告で、[CycleGAN－likeなモデル](https://qiita.com/MuAuan/items/8f42b742f639c802de5f)について報告した。

今回は、その延長として、さらにGANを連結するとどうなるか？
を調べてみた。
以下のモデルでその収束性などを見た。

今回のコードは以下に置いた
[MuAuan/multiGAN](https://github.com/MuAuan/multiGAN) 
#今回提案のモデル
３連結GANを提案する。というかある意味これ以上の高次の連結GAN、すなわちmultipleGANである。ここではベースのGANに敬意を表して
　　`pix2pix-multiGAN`
と称することとする。
　　`X ⇒ G(Dx) ⇒ Y'`
　　`Y ⇒ G(Dy) ⇒ Z'`
　　`Z ⇒ G(Dz) ⇒ X'`
通常だと、到底収束しないだろうと考えられるが、今まで見てきたようにpix2pix構造のcGANでは、過学習のおかげか一つ一つのＧＡＮは収束することから、同じGeneratorを使ったとしても収束する可能性は高い。

ということで、早速結果を以下に示す。
#結果
猫・犬顔－男性顔－飛行機の連続するGANを8000epoch回した。一回当たりの経過時間は、486min/8000epoch～3.645sec/epochである。この時間で３つのGANを回しているので、やはり相対決め打ちでフィッティングしているようだ。そして、得られた結果は以下の通りとなった。
上段：入力
中断：出力
下段：ターゲット元画像
![current_batch_validation7500.png](https://qiita-image-store.s3.amazonaws.com/0/233744/b3ab215c-1670-e8c3-7d11-608def9bc7db.png)
![current_batch_validation1_6800.png](https://qiita-image-store.s3.amazonaws.com/0/233744/997d7932-0a59-47c8-5a3f-b8d2c1daa529.png)
![current_batch_validation2_4500.png](https://qiita-image-store.s3.amazonaws.com/0/233744/3c3b517f-808c-1d27-2b84-b85674ac4170.png)
データが１０個ずつでランダムに選ばれるので、なかなかサイクリックな状況を示し難いが、一応見えると思う。
そして、猫の瞳や飛行機の空の青さまでかなり再現しているのがわかる。

次に、このフィッティングで得られたパラメータを使って、名画－男性顔のテストデータに適用した絵が以下の通りとなった。
![current_batch_validation2.png](https://qiita-image-store.s3.amazonaws.com/0/233744/9b33fc41-9718-bc2c-ef61-5e7b77dc3dfe.png)
![current_batch_validation1.png](https://qiita-image-store.s3.amazonaws.com/0/233744/d806a661-f20b-3b02-07c2-0f79bc74d97b.png)

結果は極めて不可解である。なんとなく男性顔や犬顔が出てきているようである。しかし不鮮明である。そして何より前回のpix2pix-cycleGAN-likeで示した画像ペアや上記の画像ペアと同じペアが表れている。
[pix2pix_cycleGAN-likeモデルができたよ♬](https://qiita.com/MuAuan/items/8f42b742f639c802de5f)
もう一度言うが、名画の情報は一切入れていない。
ということで、以下二つのことが推測される。
####①このモデルは完全に過学習というわけでもない
####②相対ペアは何らかの法則で決められる
#まとめ
1.pix2pix-cycleGANの延長として、新たにpix2pix-multiGANを提案した。
2.モデルで得られるテンソルは完全に過学習というわけではない
3.グループで変換した場合でも、何らかの法則に従って相対ペアが形成され、フィッティングが実施される。その結果、計算(収束)速度は連結するGANの個数にリニアに依存する。
#課題
1．相対ペアの形成は依然不明である
2,pix2pix-multiGANは、トポロジカルに単連結なネットワークであれば、どこまで増やしても収束するのか
　⇒次回は６連ガチャに挑戦したいと思う
Unityでデスクトップマスコットのためにタイトルバー非表示した

#はじめに
[前回の記事](https://qiita.com/gatosyocora/items/7cbe14914f8e603f2eab)に引き続き、Unityでデスクトップマスコットを作成しています。
その過程で必要なのが**ウィンドウのタイトルバーの非表示**です。
こちらも前回同様、詰まった案件なのでメモ程度に記事に書こうと思います。

#開発環境
- Unity 5.6.3f1
- Microsoft Visual Studio

前回と同じですね。

#実際のコード

以下のようなコードを記述しました。

```C#:DisvisibleTitleBar.cs
using UnityEngine;
using System;
using System.Runtime.InteropServices;

public class DisvisibleTitleBar : MonoBehaviour
{

    [DllImport("user32.dll", EntryPoint = "FindWindow")]
    public static extern int FindWindow(String className, String windowName);

    [DllImport("user32.dll", EntryPoint = "GetWindowLong")]
    private static extern uint GetWindowLong(int hWnd, int nIndex);
    [DllImport("user32.dll", EntryPoint = "SetWindowLong")]
    private static extern uint SetWindowLong(int hWnd, int nIndex, uint dwNewLong);
    [DllImport("user32.dll", EntryPoint = "SetWindowPos")]
    private static extern int SetWindowPos(int hwnd, int hwndInsertAfter, int x, int y, int cx, int cy, uint uFlags);

    int handle; // ウィンドウ

    const String WINDOW_NAME = "[ウィンドウの名前]"; // ウィンドウの名前

    const int GWL_STYLE = -16; // ウィンドウスタイルを書き換えるためのオフセット
    const int WS_BORDER = 0x00800000; // 境界線を持つウィンドウを作成
    const int WS_DLGFRAME = 0x00400000; // ダイアログボックスのスタイルの境界を持つウィンドウを作成
    const int WS_CAPTION = WS_BORDER | WS_DLGFRAME; // タイトルバーを持つウィンドウを作成

    const int HWND_TOP = 0x0; // 最前面に表示
    const uint SWP_NOSIZE = 0x1; // 現在のサイズを維持(cxとcyパラメータを無視)
    const uint SWP_NOMOVE = 0x2; // 現在の位置を維持(xとyパラメータを無視)
    const int SWP_FRAMECHANGED = 0x0020; // SetWindowLongの内容を適用
    const int SWP_SHOWWINDOW = 0x0040; // ウィンドウを表示

    void Start()
    {

#if UNITY_EDITOR

#else

        handle = FindWindow(null, WINDOW_NAME); // 指定したウィンドウを取得

        // タイトルバーを非表示
        uint style = GetWindowLong(handle, GWL_STYLE); // ウィンドウの情報を取得
        SetWindowLong(handle, GWL_STYLE, style ^ WS_CAPTION); // ウィンドウの属性を変更

        // SetWindowLongによる変更を適用
        SetWindowPos(handle, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_FRAMECHANGED | SWP_SHOWWINDOW);

#endif

    }

}

```

今回もUnity Editorで実行するとめんどくさいことになるので
ビルドしたプログラムでのみ非表示になるようにしています。
また、今回はあらかじめタイトルバーを非表示にするウィンドウを
ウィンドウの名前から指定できるようにしました。

しかし、タイトルバーを消すとウィンドウ右上にある閉じるボタンも
非表示になってしまうため、タスクマネージャーとかで終了させる必要があります。

(2020年2月25日追記)
上記の方法でも少しタイトルバーが残ってしまうことがあるようです。
こちらにその対処法が紹介されていましたので参考にして下さい。
https://teratail.com/questions/190646

# 最後に
今回の記事と[前回の記事](https://qiita.com/gatosyocora/items/7cbe14914f8e603f2eab)を使えば
デスクトップマスコットに近づくかと思います。
今後はウィンドウの移動でマスコットの移動を表現したり、
マスコットにいろいろなリアクションを実装したいですね。

# 参考
http://dss.o.oo7.jp/cgi/PT.cgi?VCPP/MFC/Window/WindowTitleBar
https://gist.github.com/mattatz/ca84b487c5697e7d43f8216c57a2b975
http://chokuto.ifdef.jp/urawaza/prm/window_style.html
BIG-IP tmsh を使って、Priority Group Activation の値を設定する

BIG-IPで多数のpoolの Load Balancing 設定 の Priority Group Activation を
まとめて Disabled に変更したい事がありました。

![Capture.PNG](https://qiita-image-store.s3.amazonaws.com/0/164201/3097d634-812b-97ba-759f-ad610f234106.png)



とてもGUIでポチポチやる気力はなかったので、tmshでやろうと考えたのですが、
例に依って検索力と英語力の低い私では合致するサイトを見つけられなかったので、
適当に弄んでたどり着いた答えを覚え書き。

```tmsh

# modify /ltm pool test-pool min-active-members 0
```

poolの min-active-members の数を "0" に指定することでDisabledに変更することが
できました。因みにここに"1"以上の値を入れた場合は、Avairable Member(s) の部分に
値として入ります。



このパラメータを見つけてから調べたらちゃんとガイドに載ってました。

```
[min-active-members]
Specifies the minimum number of members that must be up for traffic to be confined to a priority group
when using priority-based activation. The default value is 0 (zero). An active member is a member that
is up (not marked down) and is handling fewer connections than its connection limit.
```

ASK F5
Manual: Traffic Management Shell (tmsh) Reference Guide
https://support.f5.com/kb/en-us/products/big-ip_ltm/manuals/product/bigip-tmsh-reference-12-0-0.html
ExcelVBAでIEからユーザID・パスワード（「＊」でマスク）を入力してログインする

前投稿した以下2つの記事の内容をミックスさせました。
[Excelでパスワードを「＊」で表示させる](https://qiita.com/salmonosushi/items/7e001c39589716936d60)
[ExcelVBAでIEからユーザID・パスワードを入力してログインする](https://qiita.com/salmonosushi/items/9ce79759de6aa3d422e0)

シート1に以下のログインボタンがあります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185546/880925f2-0982-4baf-4f7d-4545ad15bef7.png)

シート2に以下のログインボタンがあります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/185546/2994ea2e-e761-3fc9-fb20-f0c37f1f5aa3.png)

同じマクロを使って、どちらでもログインできるように作りました。

#VBAソースコード

```

Sub login()

    Dim objIE As InternetExplorer 'IEオブジェクトを準備
    Set objIE = CreateObject("Internetexplorer.Application") '新しいIEオブジェクトを作成してセット
             
    objIE.Visible = True 'IEを表示
 
    Dim strUrl As String '次ページのURL
    strUrl = "https://connpass.com/login/"
 
    objIE.navigate strUrl 'IEでURLを開く
 
    Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE '読み込み待ち
 
        DoEvents
 
    Loop
 
    Dim strUsername As String
    strUsername = GetUsername
    
    Dim strPassword As String
    strPassword = GetPassword
    

    Dim htmlDoc As HTMLDocument 'HTMLドキュメントオブジェクトを準備
    Set htmlDoc = objIE.document 'objIEで読み込まれているHTMLドキュメントをセット
    
    htmlDoc.getElementsByName("username")(0).Value = strUsername 'name="username"にユーザー名を入力
    htmlDoc.getElementsByName("password")(0).Value = strPassword  'name="password"にパスワードを入力
    htmlDoc.getElementById("login_form").submit  'フォームの内容を送信
     
End Sub

Function GetUsername() As String

    Dim username As String
    username = ActiveSheet.Range("C3").Value 'ユーザー名を取得する
    GetUsername = username

End Function

Function GetPassword() As String

    Dim password As String
    If Range("C4").Value = "" Then
        password = ActiveSheet.OLEObjects("TextBox3").Object.Value 'パスワードをテキストボックスから取得する
    Else
        password = Range("C4").Value  'パスワードをセルから取得する
    End If
    GetPassword = password
    
End Function

```

#備忘録

##ActiveXコントロールを使っているときは、OLEObjectを使うこと
テキストボックスからの値の取得方法を調べて、最初は「strPassword = TextBox3.Value」と書いていました。
すると「オブジェクトが必要です」というエラーに。
こちらとしてはオブジェクトあるじゃん・・と思いながら。
しかしActiveXコントロールのオブジェクトは取得方法が違うようです。

>各 OLEObject オブジェクトは、ActiveX コントロール、リンクされた OLE オブジェクト、または埋め込まれている OLE オブジェクトを表します。

[OLEObjects オブジェクト (Excel)](https://msdn.microsoft.com/ja-jp/vba/excel-vba/articles/oleobjects-object-excel)より

**★ActiveXコントロールを使っているときは、OLEObjectを使うこと**


##戻り値を返すメソッドには、Functionプロシージャを使うこと
今回ユーザーネームを取得するところとパスワードを取得するところを、外に出してみました。
しかしなかなかうまくいかないのは、「Subプロシージャ」と「Functionプロシージャ」の違いを分かっていなかったからでした。

>Subプロシージャ：戻り値がない
Functionプロシージャ：戻り値を返せる

[【VBA】Sub／Functionプロシージャの違いと使い方【Excelマクロ】](http://www.milkmemo.com/entry/vba_SubProcedure_FunctionProcedure_chigai)より

最初はSubプロシージャで書いていたため、戻り値を受け取れていなかったようです。

**★戻り値を返すメソッドには、Functionプロシージャを使うこと**
Amazon echoからLINEメッセージ送信

#はじめに
ようやくAmazon echo dotが手に入ったので、活用方法を探索しています。
まずAmazon echoからのLINEへメッセージ送信をIFTTTを使って簡単にやりたいと思いました。実現のためにひとクセあったので、同じポイントで悩んでいるかもしれないAmazon echo初心者向けに投稿します。
(この投稿はIFTTTアプリの紹介に過ぎません。)

##IFTTTとは
IFTTTは、サービスとサービス、モノとサービスを紐付けしてくれるサービスです。
あるモノやサービスへの操作をトリガーに別のモノやサービスへ予め決めておいた操作を実行してくれます。
　https://ifttt.com/

以下はIFTTTアプリの設定の参考です。

- [作りながら覚える「IFTTT」レシピの使い方活用講座！（全5回）](http://hoomey.net/ifttt_study_1/)
- [【スマホにボタン】1pushで家族グループLINEに「牛乳買ってきて」とか]
(https://qiita.com/kg1/items/4d6e942e94b6498cff77)


#準備
##準備するもの
Amazon echo（dot）←言語設定は日本語
スマホ（iPhone）
IFTTTアプリ（iOS）

#利用のためのポイント

1. IFTTTのalexaの設定フレーズは、「1単語」または「1単語+助詞」×N（Nは1以上）の形にする。もちろん日本語で。
Amazon echoへの呼びかけを考慮すると、助詞は「の」がおススメ。

2. 諸々設定後、Amazon echoにはこう呼びかけて起動します。
「アレクサ、〇〇(設定フレーズ)トリガー」

※「Alexa trigger 〇〇」ではありません。

##利用ポイントをふまえた例
| LINEで送るメッセージ       |       IFTTTの設定フレーズ |    Amazon echoへの呼びかけ（IFTTTトリガー起動）    |
|:-----------------|:------------------|:-------------------|
| 帰りにお茶買ってきてほしい             |    お茶の           |    アレクサ　お茶のトリガー       |
| 帰りに牛乳買ってきてほしい             |    牛乳の           |    アレクサ　牛乳のトリガー       |
| 今日ご飯作ってないの。外で食べてきて  |    パパの外食の           |    アレクサ　パパの外食のトリガー       |
| 今日帰りに子供迎えに行って  |    子供のお迎えの           |    アレクサ　子供のお迎えのトリガー       |

IFTTTからのLINEメッセージはこんな感じです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188272/54ff42e4-365a-124b-abfc-416c144e3d39.png)



##IFTTTの設定
IF「Amazon Alexa」THEN「LINE」のレシピを作ります。

- Amazon Alexa

「Say a specific phrase」を選びます。
「What phrase？」のおススメの設定は、利用のためのポイント1を参照。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188272/22329dd7-9e5e-2572-ef6e-0259cb135ab0.png)


- LINE

「Send message」を選びます。他に選択肢ないです。
送るメッセージを決めましょう。
送信先はLINEグループになります。送りたいLINEグループを選びそのグループにはLINE Notifyをメンバーに追加する必要があります。
また、メッセージの送り手はLINE Notifyになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/188272/baae05a9-7559-6194-33e2-e83ad610f42c.png)



#クセ
Amazon echoは言語設定日本語ですが、IFTTTは日本語をサポートしていないのです。（2018/2/22現在）
なので、IFTTTアプリ上の設定の記載が、Amazon echoの設定言語が英語前提のものだったりします。
「”Alexa trigger”+the phrase 」とか「Use lower-case characters only」とか。
これでいろいろと私は混乱しました。（「Alexa trigger 〇〇」と呼び続けてました。）が、この英文を気にせず、日本語で「利用のためのポイント」に記載した内容で設定すればよいです。

#まとめ
以上 Amazon echoでIFTTTのトリガー起動にひとクセあったよ、という話でした。
swiftmoduleをビルドしたSwiftバージョンの確認方法

# はじめに

必要になることは少ないですが、外部から提供されたライブラリのswiftmoduleを確認したいことがあるかもしれません。
そんな時はこのコマンドで確認出来ます。

# 確認方法

```
$ strings /path/to/module.swiftmodule | grep Swift
Apple Swift version 4.0.3 effective-3.2.3 (swiftlang-900.0.74.1 clang-900.0.39.2)
```

# おわりに

もしかすると `swift` コマンド等でもう少しスマートに確認する方法があるかもしれません。
ご存知の方いらっしゃいましたらコメントください。
Athenaの結果をSedコマンドでBlazingText用に整形する


備忘録的なものですが。
athenaで得られた結果は以下のcsvになってます。

```
"column"
"ああああ いいいい うううう"
"ああああ いいいい うううう"
"ああああ いいいい うううう"
"ああああ いいいい うううう"
```

BlazingTextで読み込むかたちにするには以下

1. head行を取り除く
2. 先頭、最後のダブルクォーテーションを取り除く
3. 中身が半角スペースで分かち書きされている
	* こちらに関しては事前に


整形コマンド
---

ヘッダーをまず削る。

```
sed '1d' athena.csv > noheader.txt
```

先頭と最後のダブルクォーテーションを取り除く

```
sed -e 's/^"//g' -e 's/"$//g' noheader.txt > result.txt
```
レベル０のDockerプレイヤーが可能な限りシンプルな状態から勉強したい時の話

Dockerの性質上、いろんなものがくっついた状態で渡される事が多い。
（そういう使い方を期待してるし、想定しているから当然ではある）
これがDockerへの参入障壁を逆に高くしてしまっているところがあるかも知れない、という事で備忘録ついでに、なんでDockerに対して参入障壁が高いのか、自分なりに考えてみた。

# シンプルな環境を作って勉強したいときに使えるもの

``` ubuntu.Dockerfile
FROM ubuntu:latest
```

``` centos.Dockerfile
FROM centos:latest
```

``` other.Dockerfile
FROM <image>:latest
```

Ubuntuの上にCentOSを作りたい！という場合はcentos.Dockerfileの内容を持っていって使う。
Ubuntuの上にUbuntuのコンテナを作ることもできる。
説明のためにファイル名を意図的に設定しているが、使うときはDockerfileにリネームを推奨。

## ざっくりと解説

``` torisetsu.Dockerfile
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
```

imageはOS名、
tagはバージョン
digestは使ったことないので、私が説明できません。
解説している場所を参考情報にまとめさせていただく。

構築の練習をしたいだけなら、imageだけ必須。

# 使い方
**以下、コマンド**

上記をDockerfileとして配置し、
```
docker build .(コロン。Dockerfileを置いてる場所)
```
でdockerのイメージが作成できる。
```
docker build . -t test_image
```
test_imageっていう名前のイメージを作る。

**ここで作ったイメージを元に、コンテナを作る。**
これは大事な事なんで、頭の片隅に置いてほしい。

# コンテナを作る
```
docker run test_image
```
先ほど作ったtest_imageを使ってコンテナを作る。
```
docker run test_image --name test_container
```
先ほど作ったtest_imageを使ってtest_containerという名前をつけてコンテナを作る。

その後、
```
docker start test_container
```
で立ち上げて（立ち上がってるかも？）
```
docker exec -it test_container /bin/bash
```
でコンテナに入れる。

execの -itと最後の/bin/bashはかなり大事な意味があるんだけど、とりあえずおまじないだと思ってもらって大丈夫。
ただ、後述のDockerfileを編集する段階になったらちゃんと勉強しておいたほうが**絶対に**いい。

## Dockerfileを編集する
解説不要なぐらいわかりやすいので、参考の紹介に留める。
多分読み進めると引っかかるところが、RUNとCMDとEND POINTだと思う（私は引っかかった）ので、面白かったものを参考より先に紹介させていただく。

https://qiita.com/YusukeHigaki/items/044164837daa5e845d50
参考を読み進める際は、この絵を覚えておくと理解がしやすいかもしれない。

# 参考
イメージとコンテナの作成・削除
https://qiita.com/kooohei/items/0e788a2ce8c30f9dba53
https://qiita.com/tifa2chan/items/e9aa408244687a63a0ae

↑が出来たら、コンテナに入る
https://qiita.com/noralife/items/18301143c20cc5172c56

コンテナとホストのファイルを共有したい
https://qiita.com/Yarimizu14/items/52f4859027165a805630

https://qiita.com/jagaximo/items/c810ebce796d9e5e496e
↑の事もあって、sshでつなごうかと思ったけど、docker execやdocker cp、マウントが使えたので参考程度。リモート接続時は必要かも

そろそろ分かってきたので、Dockerfileについてちゃんと勉強する。
https://qiita.com/soushiy/items/0945bcbc7ecce4822985
https://qiita.com/tanan/items/e79a5dc1b54ca830ac21
http://docs.docker.jp/engine/userguide/eng-image/dockerfile_best-practice.html

トラブルシューティング的に、Docker内の環境変数について
https://qiita.com/lilacs/items/4d4e3f169a04560dee76

似たような問題。Dockerコンテナでcronを実行する時の話
http://higelog.brassworks.jp/1775
https://nsmr.tk/yumcron.html

# 初級者以上、プロフェッショナルの方
「自分はこうやって勉強したよ！」

っていう話がDockerの勉強会などでもあまり見られなかったです。
例えば、ハマったところとかトラブルシューティングはいっぱいあるんだけど、「こういう時にこうする」っていうシチュエーションだと勉強を進めにくいのです…。
本などがあれば参考にさせていただきたいです。
暗号化されたパスワードの一致処理

**この投稿について**
　暗号化されたパスワードの一致処理を書いてみました。

```ruby:状況
受け取ったパスワード値を$passwordとします。
この$passwordと一致するユーザがいるかチェックします。
authを使用しないパターンです。
usernameとpasswordを受け取ります。
```


```ruby:テーブル
    users
      id integer not null
      username varchar(16)
      password varchar(64)
```
```ruby:use
use Cake\Utility\Hash;
use Cake\Auth\DefaultPasswordHasher;
```

        $this->Users = TableRegistry::get('users');
        $user = $this->Users
            ->find()
            ->where(['Users.username' => $username])
            ->select(['id','password'])
            ->toArray();

        if (!empty($user)) {
            $user_password = Hash::get($user, '0.password');
            $user_id = Hash::get($user, '0.id');

            $pass_checker = new DefaultPasswordHasher();
            $pass_check = $pass_checker->check($password, $user_password);
            if($pass_check) {
                //パスワード一致しました！
            }
        }

あえてauthを使用しない方法です。
Laravelでhttpリクエストをlaravel.logに出力する

Railsみたいにhttpリクエストをログファイルに出力する

出力用のMiddlewareを追加

```php:app/Http/Middleware/RequestMiddleware.php
<?php

namespace App\Http\Middleware;

use Closure;

class RequestMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (in_array(app()->environment(), ["local", "development"])) {
            $this->writeLog($request);
        }
        return $next($request);
    }

    private function writeLog($request)                                                                                                 
    {
        $query = collect($request->all())->except("q")->all();
        \Log::debug($request->method(), ["path" => $request->query("q", "/"), "query" => http_build_query($query)]);
    }
}
```

`Kernel.php`で読み込むように`RequestMiddleware.php`を追加する。

```diff:laravel/app/Http/Kernel.php
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
        \App\Http\Middleware\TrimStrings::class,
        \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \App\Http\Middleware\TrustProxies::class,
+       \App\Http\Middleware\RequestMiddleware::class,
    ];
```

`http://localhost/groups?hoge=fuga&111=333`にアクセスすると下記のログが出力される

```console:storage/logs/laravel.log
[2018-02-27 19:14:41] local.DEBUG: GET {"path":"/groups","query":"hoge=fuga&111=333"} 
[2018-02-27 19:14:41] local.DEBUG: SQL {"time":"9.19 ms","sql":"select * from \"groups\" order by createdday desc limit 10"} 
```
autosshがハングした時の対処法

接続を自動で維持してくれるはずのautosshがどうしても動かない時のチップです。どうしてハングアップするのか原因不明なので、たまたまうまくいってるだけかもしれません。。

以下のようなコマンドで接続が確立しているケースを想定します。

```
autossh -f -N -R 10022:localhost:22 user@example.com
```

example.comホスト上からは、以下のようなコマンドでautosshを実行しているホストに接続ができるはずです。が、時々どういうわけかポートは開いてるのに通信ができなくなります。

```
ssh -p 10022 user@localhost
```

`lsof` コマンドで該当のポートを使用しているプロセス番号を探してkillしてしばらく待つとうまくいくことがあるようです。

```
# lsof | grep 10022
sshd      1991          ubuntu    4u     IPv4              31886       0t0        TCP localhost10022 (LISTEN)
sshd      1991          ubuntu    9u     IPv4              44041       0t0        TCP localhost10022->localhost:53012 (CLOSE_WAIT)
```

```
# kill 1991
```
Processing - 14 - ifとelse if、fillとマウス座標を使った描画

<img width="498" alt="スクリーンショット 2018-02-23 00.21.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/45520/f16d319a-11d0-462d-e76c-70a48c997f06.png">


```java:
void setup() {
  size(500, 500);
  noStroke();
}
void draw() {
  background(204);
  if ((mouseX <= width/2) && (mouseY <= height/2)) {
    fill(0);
    rect(0, 0, width/2, height/2);
  } else if ((mouseX > width/2) && (mouseY < height/2)) {
    fill(50);
    rect(width/2, 0, width/2, height/2);
  } else if ((mouseX > width/2) && (mouseY > height/2)) {
    fill(100);
    rect(width/2, height/2, width/2, height/2);
  } else {
    fill(150);
    rect(0, height/2, width/2, height/2);
  }
}

```
Azure Web AppでPython3.6を動かす方法！！

Azureは本当に情報が錯綜していて辛い…沼い…
以下参考情報たち。答えは６にあり。
1. [Azure App Service での Python の管理](https://docs.microsoft.com/ja-jp/visualstudio/python/managing-python-on-azure-app-service)
2. [Azure に Python Web アプリを作成する](https://docs.microsoft.com/ja-jp/azure/app-service/app-service-web-get-started-python)
3. [Azure App Service Web Apps による Python の構成](https://docs.microsoft.com/ja-jp/azure/app-service/web-sites-python-configure)
4. [Install Python Modules on Azure App Services](https://blogs.msdn.microsoft.com/azureossds/2015/06/29/install-native-python-modules-on-azure-web-apps-api-apps/)
5. [Code 2015 in 定山渓温泉で学んだ Flask による Web アプリを Azure Web Apps に配置してみる](https://devadjust.exblog.jp/22051849/)
6. [Using python 3.6 on azure app services - not working despite it is installed as extension
](https://stackoverflow.com/questions/46882424/using-python-3-6-on-azure-app-services-not-working-despite-it-is-installed-as)

## やりたかったこと
ローカル開発環境で使っていたバージョンの`Python 3.6.4`で動く環境を`Azure Web App`に構築したかった。

## 困ったこと
なーんにも考えずに動かすと`Python 2.7.8`で動いちゃう。
拡張機能で`Python3.6`とか入れても無駄無駄ァ。

## 解決できたこと
私のリポジトリにそのまま動くもの置いてあるので、ここから引っこ抜いたソースを自分で作った**WebApp＋拡張機能Python3.6.4**にデプロイしてみてください。
（もちろん参考６にある通り`python.exe -m pip install --upgrade -r D:\home\site\wwwroot\requirements.txt`も動かしてからね）
ちゃんとバージョン表示がされるはずです。
https://github.com/ShikaTech/python-docs-hello-world

## ポイント
- 拡張機能で新しいPython入れただけでは有効にならない
- `runtime.txt`は配置してはならない
- `web.config`はいい感じの指定を記述する必要がある
- `requirements.txt`を配置した方が良いが手動でinstallする必要がある
- `.skipPythonDeployment`を配置する必要がある


まぁ例によって、サンプルコードをそのまま動かしても意図通り動かないって、MSのいつものことですね！！
pandas.read_csvの型がころころ変わる件

# はじめに

ソネット・メディア・ネットワークスでは、2017年12月に新サービス[VALIS-Cockpit](https://cockpit.valis-ai.com/about/)をリリースしました。弊社のデータサイエンティストが開発した分析手法をパッケージ提供し、広告主企業のマーケターが各種分析を利用できるサービスです。

VALIS-Cockpit開発チームでは、データサイエンティストチームが作った分析用のソースコードを、安定的に提供できるようブラッシュアップしています。その中で、アドホック分析としては問題ないが、製品としてリリースすると確率的に問題が発生するソースコードに出会ったのでこの場で紹介します。

## pandas.read_csv(pd.read_csv)

アドホックな分析で良く使う `pd.read_csv` ですが、製品として使うには厄介な存在です。

#### 問題が起きないパターン
よく有るのは下記のようなcsvファイルです。

```bash
$ cat sample1.csv
col1,col2,col3
1,2,3
4,5,6
```
このファイルであれば、オプションの指定なしで、何も考えなくてもcsvファイルを読み込むことが出来ます。

```python
import pandas as pd

df = pd.read_csv('sample1.csv')
df.head()
```
![Screenshot from 2018-02-26 16-59-27.png](https://qiita-image-store.s3.amazonaws.com/0/240750/eaf95559-4bc2-aed4-c623-58dade342bed.png)

#### 問題が起きるパターン

では、次のようなファイルはいかがでしょうか。先程の `sample1.csv` に加えて1行分のデータが加わりました。しかし、col2については欠損値となっています。前工程のファイル出力の仕様が雑だと、`0` という値が欠損値として出力されたりします。

```bash
$ cat sample2.csv
col1,col2,col3
1,2,3
4,5,6
7,,9
```

同様のコードでcsvファイルを読み込んでみましょう。

```python
import pandas as pd

df = pd.read_csv('sample2.csv')
df.head()
```

![Screenshot from 2018-02-26 17-03-28.png](https://qiita-image-store.s3.amazonaws.com/0/240750/9b6ec955-b483-76a9-bf72-45f6b423e6cb.png)

col2の型が変わっています。df.dtypesを参照するとわかりますが、`int64` から `float64`　に変わっていることがわかります。読み込むデータによって型が異なると、その後の様々な処理結果も変わってしまいます。そのため、製品版のコードにする際には、様々なデータが入力されることを想定し、欠損値を含むデータであっても想定通りの型として読み込むべきです。

#### 問題の有る対策方法

```python
import pandas as pd
import numpy as np

df = pd.read_csv('sample.csv', dtype={'col1':np.int64, 'col2':np.int64, 'col3':np.int64})
df.head()
```
一見、これでうまく行きそうに見えますが、これでもだめです。col2は `float64` になっています。
![Screenshot from 2018-02-26 17-55-00.png](https://qiita-image-store.s3.amazonaws.com/0/240750/de99d5b1-c7ee-4178-cd1e-7174d04b3bc3.png)

#### 正しい対策方法

integerのカラムとして扱うためには以下のように、明示的に変換してあげる必要があります。fillnaがないと、`ValueError: Cannot convert NA to integer` って怒られてしまいます。

```python
import pandas as pd
import numpy as np

df = pd.read_csv('sample.csv')
df['col2'] = df['col2'].fillna(0).astype(np.int64)
df.head()
```

![Screenshot from 2018-02-26 18-08-35.png](https://qiita-image-store.s3.amazonaws.com/0/240750/76a2abba-ebe5-f899-2837-88f91c6d0c87.png)


## まとめ

`pd.read_csv` を製品版ソースで利用する場合には以下のことに気をつけましょう。

* 各カラムのデータ型はなにか？
* 各カラムに欠損値を含む可能性はあるか？
* 各工程の入出力ファイルの仕様を明確にする（特に欠損値処理）。
Database Migration Serviceでタイムスタンプデータ移行時のバグ

仕事でAWSのDatabase Migration Serviceを使用しようとした際にバグが発生したので、メモ。 (2018年2月27日現在)

DMSで他クラウド上に乗っているMySQLデータをRDSのAuroraへ移行しようとしたところTIMESTAMP型が下記のように移行されてしまう。

***移行前***

|Column|Datatype|Value|
|:-----------------|:------------------|:------------------|
|date1|TIMESTAMP|0000-00-00 00:00:00|

***移行後***

|Column|Datatype|Value|
|:-----------------|------------------:|:------------------:|
|date1|TIMESTAMP|1971-07-08 22:09:26|


上記を回避するにはDMSの管理画面からターゲットエンドポイントにある「追加の接続属性」（コンソールだと、「アドバンスド」メニュー下にある）へ下記内容を追加する。
***loadUsingCSV=N***

もしすでに他の値が設定されている場合は、「;」をつけて保存する
***parallelLoadThreads=1;loadUsingCSV=N***

こうすることで、移行後でも「0000-00-00 00:00:00」としてデータの移行ができる。

ただここでもう一つ問題が発生する。
下記のようなカラム構成の場合、左側のカラム情報が引き継がれて保存されてしまう。

***移行前***

|Column|Datatype|Value|
|:-----------------|:------------------|:------------------|
|date1|TIMESTAMP|2018-02-28 12:20:30|
|date2|TIMESTAMP|0000-00-00 00:00:00|

***移行後***

|Column|Datatype|Value|
|:-----------------|------------------:|:------------------:|
|date1|TIMESTAMP|2018-02-28 12:20:30|
|date2|TIMESTAMP|2018-02-28 12:20:30|


DMSを使用して移行作業をされる方はご注意ください。
Mac > CH341,CH340　のドライバ


Arduino系、ESP32系、その他マイコンにUSB端子が付いている場合、
USB部分にはCH34x系が使われている場合があります。UNO等はFT232R等のFT系

FT系の場合、MacではUSBに刺すだけで使えたりします。


が、CH34系の場合にはドライバを入れないとMacで認識されません。

## ドライバの探索

いろいろ辿ってこちらのページで配布しているドライバがうまくいきました。
[How to use cheap Chinese Arduinos that come with with CH340G / CH341G Serial/USB chip \(Windows & Mac OS\-X\) · by Konstantin Gredeskoul \(@kig\)](https://kig.re/2014/12/31/how-to-use-arduino-nano-mini-pro-with-CH340G-on-mac-osx-yosemite.html)


セキュリティの設定でインストールがブロックされているので、
その場合には解除します。


## 旧ドライバ
本来のドライバはここのようですが、古くて動かないようです。
[CH341SER\_MAC\.ZIP下载页面\-江苏沁恒股份有限公司](http://www.wch.cn/download/CH341SER_MAC_ZIP.html)



## 参考
[Arduino Nano（互換機）をMac OS X El Capitanと接続する \- FIGROBOKOUBOU](http://figrobo.blog.fc2.com/blog-entry-20.html)
Chrome Custom Tabs(CCT) pros/cons

## きっかけ
* 自社コンテンツをwebページとして閲覧する用途にCCTを使いたいと思いました。
* WebViewよりも新しいコンポーネントなので負債になりづらいのでは？と思いました。
* WebViewとCCTの比較をしたい

## この記事について
* 実際に実装せずに資料を見て自分の考えをまとめています。CCTでもWebViewの代わりになるよ！ってご意見もあると思います。

## 参考ページ
* [When should I use Chrome Custom Tabs vs WebView?](https://developer.chrome.com/multidevice/android/customtabs#whentouse)  

* CustomTabsSample
https://github.com/sakebook/CustomTabsSample
https://play.google.com/store/apps/details?id=com.sakebook.android.sample.customtabssample    

# Chrome Custom Tabs(CCT) pros/cons

## Pros
* ブラウザとデータを共有できる。
* WebViewsはブラウザと状態を共有せず、保守オーバーヘッドを追加します。
* WebViewよりもシームレスにアプリとwebを行き来できる。
* パフォーマンス良い。アプリケーションから余計なリソースを奪わない。プリフェッチ。
* lolipop未満の端末でも最新のブラウザ機能を使えるよう。
* アドレスバーでSSL証明書を確認することができる。
* 外部のドメインのwebを表示するときに向いている。

## Cons
* 自社コンテンツを表示するだけならWebViewの方が良いかも（信頼できるのでセキュリティ要件が低いからだと思います）
* URLハンドリングなど複雑なことできるか調べる必要ある。
* 複雑な処理が大変そう。
* ページの一部にwebを表示することが大変そう
* webViewでもAndroid5以降で、Safe Browsingを有効にできる


## 結論　
### WebViewの方が良さそう
* 自社コンテンツを表示するのでセキュリティ要件はそこまで高くなさそう
* アプリ内の操作のためURLハンドリングや細かい処理が必要そうだがCCTが対応しているか不明
* ページの一部にwebを表示したいという要望が出た時にCCTだと辛そう。


## CCTに向いていることは？
* CCTはチャットワークやTwitterのような外部ページへの遷移用途に向いてそう（OSのリソースを無駄遣いしない）
* OAuth 2.0を利用するにも良いのかなという印象です。
    * [参考資料（OAuth2について触れられている箇所がありました）](https://techblog.yahoo.co.jp/web/auth/oauth2_device_flow/)


## 最後に
* CCTはDroidKaigi2017でセッションを聞いてWebViewの後継コンポーネントだと思っていましたが、調べるうちに考え直しました。パフォーマンス、シームレスなWeb表示などは強化されていますが、WebViewの強みはまだ残っていました。
* 画面の一部だけWebを表示したいや、柔軟な処理が必要な場合はまだまだWebViewが必要になりそうですね。
* 誤っている箇所や認識などありましたらご指摘いただけますと幸いです。:nose_tone2:
Typescript+Vue.jsにおいて、vue-class-componentを使わずにmixins先のmethods, dataを推論できない問題

typescript + vueにおいて、クラスベースの書き方(= vue-class-component)を使わずにmixin先を推論する方法がどうしてもわからず頭を抱えていたが、一旦の回避策を得たのでそのご紹介。

なお[日記](https://issus.me/projects/100/issues/60)に書いた内容の拡充版です。


## 前提
- typescript 2.7 + Vue.js 2.5
- vue-class-componentは使いたくないので使わない

## 問題
mixinした先のメソッドやデータに対してthisが推論してくれない。この問題がどうしても解決できなかった。

もうわからなさすぎたのでvue forumに質問したら回答をもらえた。(感謝)

https://forum.vuejs.org/t/typescript-mixins-methods-data/28374

## 結論
今はmixin先のdata, methods, props, comuptedなどを推論することはできない。
なので対応策としては2つ。

## 1. thisをanyにキャストする
フォーラムでもらった回答がこちら。全く考えもつかなかった...
確かにこれが一番手軽で良さそう。

> `console.log(this.msg)`
to
`console.log((this as any).msg)`

（少し行儀は悪いけど）困ったらanyにキャストすればいい。

## 2. (冗長だが) 局所的にVue interfaceを拡張する

自分で試していたのはこちら。mixin先をいちいち見なくとも何が生えているのか見えるのはいいが、同じものを二度書きするのが冗長で辛い。また型を間違えると大変なことになりそう


```typescript
interface Vue {
  
  // @mixin HogeMixin
  hogeMixinSomeData: string       // this is sample.
  hogeMixinSomeMethod: () => void // this is sample.
  // ... 他にもdata, methods, computedなど記述する

  // @mixin GehoMixin
  gehoMixinSomeData: number
  gehoMixinSomeMethod: () => void
}

Vue.extend({
  mixins: [HogeMixin, GehoMixin]
  methods: {
    doSomething () {
      console.log(this.hogeMixinSomeData) // ok
      console.log(this.gehoMixinSomeData) // ok
      this.hogeMixinSomeMethod()          // ok
      this.gehoMixinSomeMethod()          // ok
    }
  }
})
```

## 所感
mixin先まで推論できるようになると嬉しいなぁ。


## 追記
<blockquote class="twitter-tweet" data-partner="tweetdeck"><p lang="ja" dir="ltr">さっそく、ktsnさんが何やら作った。<a href="https://t.co/taZflRMroC">https://t.co/taZflRMroC</a> / Typescript+Vue.jsにおいて、vue-class-componentを使わずにmixins先のmethods, dataを推論できない問題 - Qiita <a href="https://t.co/ejmjdbLvza">https://t.co/ejmjdbLvza</a></p>&mdash; 🐤kazupon🐤 (@kazu_pon) <a href="https://twitter.com/kazu_pon/status/968441464446267392?ref_src=twsrc%5Etfw">February 27, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

...!!!

ありがとうございます :bow: 
さっそく試してみます。
【Swift4】UIImageで画像のサイズ変更、指定した倍率で拡大/縮小

# 環境

Xcode ９.２
Swift 4.0.3

## 方法の追加

extensionで画像の`サイズ変更`と`指定した倍率で拡大/縮小`との二つ方法を追加

```swift 
extension UIImage {
    // resize image
    func reSizeImage(reSize:CGSize)->UIImage {
        //UIGraphicsBeginImageContext(reSize);
        UIGraphicsBeginImageContextWithOptions(reSize,false,UIScreen.main.scale);
        self.draw(in: CGRect(x: 0, y: 0, width: reSize.width, height: reSize.height));
        let reSizeImage:UIImage! = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        return reSizeImage;
    }
    
    // scale the image at rates
    func scaleImage(scaleSize:CGFloat)->UIImage {
        let reSize = CGSize(width: self.size.width * scaleSize, height: self.size.height * scaleSize)
        return reSizeImage(reSize: reSize)
    }
}
```

## 使う例

画像のサイズ変更：

```swift 
let reSize = CGSize(width: self.size.width * scaleSize, height: self.size.height * scaleSize)
image?.reSizeImage(reSize: reSize)
```

0.5倍率で画像を縮小する：

```swift 
image?.scaleImage(scaleSize: 0.5)
```
[Resolved] Raspberry Pi > GPIO > GPIO26の出力設定(Hレベル)でssh接続が切れる > link: Why are some GPIO pins not available? | Revisionにより使えるポートはさらに変わる

**(追記 2018/03/01) 以下に記載のGPIO pins not availableについてはRaspberry Pi2とPi3には適用されない情報かもしれません。実際にRaspberry Pi 2 Model BにてGPIO26は出力操作できることも確認しました。**

```txt:動作環境
Raspberry Pi 2 Model B (以下RPi)
Raspbian Jessie
Python 2.7.9
```

### 試したこと

- `/sys/class/gpio`にてGPIO26を設定
    - export: 26
    - direction: out
    - value: 1
    - >> CentOSからのssh接続が切れる

### 参考

[Why are some GPIO pins not available?](https://raspberrypi.stackexchange.com/questions/27651/why-are-some-gpio-pins-not-available)
> According to [this guide](https://elinux.org/RPi_Low-level_peripherals#GPIO_hardware_hacking), only the following pins are available for my use:
> 2, 3, 4, 7, 8, 9, 10, 11, 14, 15, 17, 18, 22, 23, 24, 25, 27, with 28, 29, 30, 31

GPIO26は使えない。

アタリ。

1時間無駄にした。

### GPIO hardware hacking

さらに以下の情報も見つけた。

https://elinux.org/RPi_Low-level_peripherals#GPIO_hardware_hacking
> The complete list of chipset GPIO pins which are available on the GPIO connector is:
0, 1, 4, 7, 8, 9, 10, 11, 14, 15, 17, 18, 21, 22, 23, 24, 25
(on the Revision2.0 RaspberryPis, this list changes to: 2, 3, 4, 7, 8, 9, 10, 11, 14, 15, 17, 18, 22, 23, 24, 25, 27, with 28, 29, 30, 31 additionally available on the P5 header)

Revisionにより使えるポートはさらに変わる。

どちらのRevisionでも使えるのは以下だろう。(~~疲れたので、~~自分でリストを作りたくないのでPythonで）。

参考: [リストとリストを比較して、共通する要素をリストで取り出す方法](https://qiita.com/yamao2253/items/309fdaa74b8f9d38ac46)

情報感謝です。

https://ideone.com/4jGX3b

```py
# Python 2.7.13
gpio_rev1 = [0, 1, 4, 7, 8, 9, 10, 11, 14, 15, 17, 18, 21, 22, 23, 24, 25]
gpio_rev2 = [2, 3, 4, 7, 8, 9, 10, 11, 14, 15, 17, 18, 22, 23, 24, 25, 27, 28, 29, 30, 31]

rev1_set = set(gpio_rev1)
rev2_set = set(gpio_rev2)
print(list(rev1_set & rev2_set))
```

```txt:run
[4, 7, 8, 9, 10, 11, 14, 15, 17, 18, 22, 23, 24, 25]
```

~~GPIO09 (SPI_MISO)とGPIO10 (SPI_MOSI)には自作ピンヘッダでラベル付けしているので、これを使うと配線の時間を短縮できそう。~~

GPIO09とGPIO10で出力方向に設定しても、電圧が一定にならない。
何か理解してない仕組みがあるのだろう(未消化)。


### 解決

(追記 2018/03/01)

犯人は自分であり、GPIO26のH,L監視により、シャットダウンする機能を実行していました。

外部スイッチでのシャットダウンに使っています。
Docker コンテナのターミナルで文字が折り返される時の対処法

```
docker exec -it コンテナ名 bash
```

こんな感じで Docker コンテナに bash で入って作業をする人で、文字が変に折り返されて発狂していたんですが、環境変数を渡してあげることで幸せになりました。

```
docker exec -it -e COLUMNS=$COLUMNS -e LINES=$LINES -e TERM=$TERM コンテナ名 bash
```

本来、自動でターミナルの大きさに合わせて環境変数 `$COLUMNS` が設定されるんですが、 Docker コンテナに直接入ると初期値で設定されるっぽいです。もし打つのが面倒くさい場合は、下記エイリアスが使えます。

```sh
function dke (){ docker exec -it -e COLUMNS=$COLUMNS -e LINES=$LINES -e TERM=$TERM $@ bash }
```

これで `dke コンテナ名` で入れます。幸せですね。
WebCamTexture を最小限で使うクラス

```csharp
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

namespace Foo {
	public class WebCamComponent : MonoBehaviour {
		////// Demi-Constructors //////
		protected void Start() {
			var devices = WebCamTexture.devices;

			var validDevices = WebCamTexture
				.devices
				.Where(x => x.isFrontFacing == this.isUseFrontCamera);

			if (validDevices.Count() > 0) {
				var webcamTexture = new WebCamTexture(validDevices.First().name);
				this.targetMaterial.mainTexture = webcamTexture;
				webcamTexture.Play();
			}
		}

		////// Props //////
		[SerializeField] private Material targetMaterial = null;
		[SerializeField] private bool isUseFrontCamera = false;

		////// Methods //////
	}
}
```
MAYAでイメージプレーンやポリゴンを選択されないようにする

#はじめに

MAYAでイメージプレーン*(Image Plane)*に設計図などの画像を設置して作るときに選択されてしまうと邪魔ですよね？
それを解決していこうと思います。
**ポリゴンでも同じ方法で大丈夫です。**

##1
イメージプレーンを選択
##2
　　チャンネルボックス/レイヤエディタ
ー＞レイヤ
ー＞選択項目からレイヤを作成
ー＞　V　P　□　となってるところの□を二回クリックしてRにする
![MAYA_r1.gif](https://qiita-image-store.s3.amazonaws.com/0/237205/793807df-f102-6b80-536c-8a4832414518.gif)
**解像度低くてごめんなさい**
##3
これで出来上がり！

#最後に
選択されないようにした後に選択したくなったら**アウトライナ**から選択できますよ〜
ネットで検索しても出てこなかったんですが僕の検索能力が悪かったんですかね・・・
SQL Serverにつながらなくなった時に確認したこと

#突然つながらなくなった
SQLServerをインストールしたPCが1台
ExcelVBAでテーブルを書き換えるテストをしたりしていて
ひと段落ついたので何気なくSQLServeマシンを再起動

！！！つながらない！！！！

##サーバエラーは2
技術的な問題が云々と書かれたエラーメッセージが出たけれど、これさっきまでアクセス出来てたし！！

いろいろ検索したことを試したら、繋がりました。

コントロールパネル→システムとセキュリティ→管理ツール→サービス

名前順に並べて"SQLServer"で始まっている行を探す。
もし"SQL Server Browser"が無効になっていたら、自動にして再起動。

他にも無効になっているのがありますが、この設定変更のみで接続できました。

今後、接続できないようなことがありましたら、ここに追記しようと思います。
Jenkins Pipelineでユーザー名を取得する

マニュアルに書いてあるが、知らないは探せない。
[Pipeline: Basic Steps](https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#wrap-general-build-wrapper)

## 必要なプラグイン

- [user build vars](https://plugins.jenkins.io/build-user-vars-plugin)


## コード

```groovy
wrap([$class: 'BuildUser']) {
    echo "${BUILD_USER} @${BUILD_USER_ID}"
    echo "${BUILD_USER_FIRST_NAME} ${BUILD_USER_LAST_NAME} <${BUILD_USER_EMAIL}>"
}
```
centos7 kernel tuningでとりあえず流す memo

```
cat <<'EOF' > /etc/security/limits.d/01-origin.conf
* soft nproc 65535
* hard nproc 65535
* soft nofile 65535
* hard nofile 65535
EOF

cat <<'EOF' > /etc/sysctl.d/01-origin.conf
net.nf_conntrack_max = 65535
net.ipv4.ip_local_port_range = 10000    64999
net.core.netdev_max_backlog = 4096
net.core.somaxconn = 65535
EOF

systemctl stop firewalld.service
systemctl disable firewalld.service

sed -i "s/SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
setenforce 0
systemctl stop    ip6tables.service
systemctl disable ip6tables.service
systemctl stop    iptables.service
systemctl disable iptables.service

```
TypeScriptのUMD未対応な型定義ファイルのワークアラウンド対応


moment.jsは現在(2018/2/27)型定義ファイルがUMD未対応のようです。
UMDとは何かということでしたら[こちら](https://qiita.com/chuck0523/items/1868a4c04ab4d8cdfb23#umd)を参照下さい。

つまりは index.htmlのsrcに以下のように設定した場合に

```
	<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.20.1/moment.js"></script>
	<script src="./index.ts"></script>
```

``moment.js`` がグローバル変数``mement``に設定されます。
その場合型定義ファイルがUMDに対応していれば、以下のようにtsファイルから使うことでできます。

```index.ts
/// <reference path="../node_modules/moment/moment.d.ts"/>
alert(moment().format("YYYYMMDD hh:mm:ss"));

```
ですが対応していない場合があります。

そういう場合の暫定対応方法があります。 以下のように型定義ファイルをつくります。

```mement.custom.d.ts

import * as _moment from "moment";
export as namespace moment;
export = _moment;

```


index.tsは以下となります。

``moment.custom.d.ts`` を読みに行っています。

```index.ts
/// <reference path="./mytypes/moment.custom.d.ts"/>
alert(moment().format("YYYYMMDD hh:mm:ss"));

```

これで動きます。動く環境をこちらにおいています。
https://github.com/m0a-mystudy/umd-ts

``parcel src/index.html`` で実行して下さい

参考: https://github.com/moment/moment/pull/3688