OmniAICreator/Qiita-1.07M huggingface dataset:
確認ログの出し方

<!--
<form name="toukou" method="post" action="" onsubmit="return checkForm()">
お名前：<input type="text" name="name" value="<?php echo $edit_name; ?>"><br>
コメント：<input type="text" name="comment" value="<?php echo $edit_comment; ?>"><br>
<?php
if($_POST['edino']){
  $edino = $_POST['edino'];
echo '<input type="hidden" name="mode" value="editmode">';
echo '編集番号<input type="text" name="edino">';
}
?>

パスワード：<input type="password" name="pass" value="<?php echo $edit_pass; ?>"><br>
<input type="submit" name="write" value="送信">
<!--javascriptによる未入力エラー -->
<script type="text/javascript">
  function checkForm(){
    var name = document.toukou.name.value;
    var pass = document.toukou.pass.value;

    if( name == ""){
      alert("名前を入力してください。");
      document.toukou.name.focus();
      return false ;
    }
    if( pass == ""){
      alert("パスワードを入力してください。");
      document.toukou.pass.focus();
      return false;
    }
    return true;
  }
</script>　
</form>

-->
Visual Studio | WPF > カスタム添付プロパティ > AttachedPropertyBrowsableForType > Getには指定して、Setには指定しない

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

[Visual Studio | WPF > カスタム添付プロパティの使用例 | link:AttachedPropertyBrowsableForType](https://qiita.com/7of9/items/eff609eeb0b7c4381d0b)
で気になった「AttachedPropertyBrowsableForType 」について。

[AttachedPropertyBrowsableForTypeAttribute クラス](https://msdn.microsoft.com/ja-jp/library/system.windows.attachedpropertybrowsablefortypeattribute(v=vs.110).aspx)

> This .NET Framework attribute should only be applied on the get accessor of attached property definitions. Do not apply this .NET Framework attribute to the set accessor. 

「getには使ってよいが、setには使わないように」ということのようだが、検索で見つかる使用例ではsetにも使っているものもある。

- setでも使っている例
    - [[WPF][C#]DataGridの列の自動生成を属性でカスタマイズ その２](http://blogs.wankuma.com/kazuki/archive/2009/05/26/173590.aspx)
    - https://github.com/chitoku-k/Chipmunk/blob/master/Chipmunk/WindowBehavior.cs
- setでは使っていない例
    - https://github.com/vboctor/MantisSubmit/blob/master/MantisSubmit2/DesignExtensions.cs
Node.js で AWS の SNS にパブリッシュする

Node.js で、AWS の SNS にパブリッシュ（投稿）する方法です。
Arch Linux と Raspbian で動作を確認しました。
topic は変更して下さい。

```js
#! /usr/bin/node
// ---------------------------------------------------------------
//	sns_test.js
//
//					Dec/08/2017
//
// ---------------------------------------------------------------
// exports.send_sns_handler = function(event, context) {
function send_sns_handler (event, context)
{
	console.error ("*** end_sns_handler *** start ***")
	var aws = require('aws-sdk')
	var sns = new aws.SNS({
		apiVersion: '2010-03-31',
		region: 'ap-northeast-1'
	})


	sns.publish({
		Message: event.body,
		Subject: event.subject,
		TopicArn: event.topic
		}, function(err, data){
		if ( err )
			{
			console.error ("*** end_sns_handler *** error ***")
			context.fail('fail')
			}
	})  
}

// ---------------------------------------------------------------
console.error ("*** 開始 ***")

const event = {
    "topic": 'arn:aws:sns:ap-northeast-1:999999999999:test_sns',
    "subject": "This is the subject of the message. Dec/08/2017",
    "body": "This is the body of the message. Dec/08/2017 PM 13:29"
}

var context=""

send_sns_handler(event,context)

console.error ("*** 終了 ***")
// ---------------------------------------------------------------
```

python3 のサンプルはこちらです。
[python で AWS の SNS にパブリッシュする](https://qiita.com/ekzemplaro/items/87154a6e93f051c16567)
Azure VM上でSQL Serverを稼働させるときに検討する項目

オンプレミス上でSQL Serverを稼働させていてこれをAzureへ移行するときにVM上でSQL Serverを検討すると思う。
そのときの稼働設定で注意する点を、調査してのでまとめておく。

## セットアップ時の検討項目

[Azure における SQL Server のパフォーマンスに関するベスト プラクティス | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/sql/virtual-machines-windows-sql-performance)

2017-12-08現在参考価格：

* 西日本 DS12 v2 4コア メモリ28GB 一時ディスク56GB 
SQL Server Standard ¥76,157/月


* 西日本 DS3 v2 4コア メモリ14GB 一時ディスク28GB 
SQL Server Enterprise ¥155,599/月
SQL Server Standard ¥73,469/月
SQL Server Web ¥45,993/月

* Premium ディスク 
    * P20 ¥8,588/月 500GB 2,300IOPS 150MB/秒
    * P30 ¥15,854/月 1TB 5,000IOPS 200MB/秒

### 関連リンク
必見動画[SQL Server on Azure 仮想マシン (IaaS) の可用性とパフォーマンス | de:code 2015 | Channel 9](https://channel9.msdn.com/Events/de-code/decode-2015/DBI-007)

[Azure 仮想マシン上に作成した SQL Server の日本語化手順（Windows OS 版 SQL Server 2017 対応手順） – Microsoft SQL Server Japan Support Team Blog](https://blogs.msdn.microsoft.com/jpsql/2017/11/16/azure-%E4%BB%AE%E6%83%B3%E3%83%9E%E3%82%B7%E3%83%B3%E4%B8%8A%E3%81%AB%E4%BD%9C%E6%88%90%E3%81%97%E3%81%9F-sql-server-%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%8C%96%E6%89%8B%E9%A0%86%EF%BC%88windows-os/)

[SQL Database (PaaS) とクラウドの VM 上の SQL Server (IaaS) | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/sql-database/sql-database-paas-vs-sql-server-iaas)

[Azure 仮想マシン上の SQL Server にデータを移動する | Microsoft Docs]( https://docs.microsoft.com/ja-jp/azure/machine-learning/team-data-science-process/move-sql-server-virtual-machine)



## 移行後のチューニング
[SQL Server 2016 環境構築時のパフォーマンスに関するベストプラクティス – Microsoft Japan Data Platform Tech Sales Team Blog](https://blogs.msdn.microsoft.com/dataplatjp/2016/10/28/sql-server-2016-%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89%E6%99%82%E3%81%AE%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E3%83%99%E3%82%B9%E3%83%88/)

## SQL Serverでのチューニング実績
* ディスクアロケーションユニットを64KBでフォーマットする
* TempDBをCPU数分確保する
* ログファイル、マスター、トランザクションは別ディスクにする
* 最大サーバーメモリは、OSの50%から70%にする。OSのサービス、ディスクキャッシュとしてかなり消費されるため。日々の稼働状況をみて設定値を探る


## 移行時の課題がよくまとまっているブログ
[SQL Server を「Microsoft Azure」上に移行する際の課題と方法。そしてAzure上でのデータベースの可用性をさらに高めるLifeKeeper/DataKeeper](https://bcblog.sios.jp/means-and-issues-to-migrate-sql-server-to-the-cloud/)

ここでのポイントは
* Azureのテンプレートからデプロイした場合には、OSとSQL Serverともに英語版のイメージしかない。→日本語化するには、日本マイクロソフトが日本語化を全自動で行うスクリプトを提供しているのでそれを使用する。（URLは未調査）
* 「ディスクの種類の選択」「ストレージの構成」「SQL Serverの基本設定」「SQL Server IaaS Agent 拡張機能」を検討する
* 「SQL Server」のバージョンは「2008 R2 SP3以降」で、「2012 SP3」、「2014 SP2」、「2016 SP1」のみ


### 移行後のチューニング
「Azure VM上のSQL Server パフォーマンス」でぐぐる

1. 仮想マシンのサイズ
2. ストレージ（地理的冗長を無効にするなど）
3. ディスク（少なくともP30のディスクを2つ設定）
4. ディスクキャッシュ（ログファイルのディスクではキャッシュを有効にしない）
5. NTFSアロケーションサイズ（64KBでフォーマットする）
6. ディスクストライピングサイズ（New-VirtualDisk のストライプサイズ（Interleave）は、OLTP：64KB / DWH：256KBの設定を推奨）
7. 初期ファイルの割り当ての短縮（サービスアカウントに「ボリュームの保守タスクを実行」の権限を付与）
8. ページングアクティビティ抑制（サービスアカウントに「メモリ内のページのロック」の権限を付与）
Railsアプリケーションの脆弱性試験の際にdeviseでアカウントをロックしない方法

# やりたいこと
- AppScanを使ってRailsアプリケーションの脆弱性をチェックしたい
- ログイン周りの処理はdeviseを使って実装済み

# 発生した問題
- AppScanでテストすると、**セッション情報が無効です**と言われてテストが途中で止まる

# 原因
- deviseのアカウントがロックされている
    - AppScanが大量に不正ログインを試みた結果と思われる

# 対策
- deviseでアカウントをロックしない
- `:failed_attempts`から、`:none`に変更する

```rb
  # ==> Configuration for :lockable
  # Defines which strategy will be used to lock an account.
  # :failed_attempts = Locks an account after a number of failed attempts to sign in.
  # :none            = No lock strategy. You should handle locking by yourself.
  # config.lock_strategy = :failed_attempts
  config.lock_strategy = :none
```
Visual Studio | WPF > カスタム添付プロパティの使用例 | link:AttachedPropertyBrowsableForType

```txt:動作環境
Windows 8.1 Pro (64bit)
Microsoft Visual Studio 2017 Community
Sublime Text 2
```

Behaviorの実装を検討中。

[添付ビヘイビアを使い TextBox で数値以外を入力できなくする。](http://d.hatena.ne.jp/hilapon/20101021/1287641423) by hilaponさん
を見つけた。

### コードの構造とカスタム添付プロパティ

「添付ビヘイビア」のコードの構造を見ると、以下のようだ。

- IsNumericというDependencyProperty を定義
- GetXXX()を定義
- SetXXX()を定義
- XXXChanged()を定義
- XXXChanged()において、イベントを登録したり削除したりする
    - 例: OnKeyDownイベント
    - 例: OnTextChangedイベント

プロパティ自身の名前により関数名が決まるので、関連情報は見つけにくいように思う。

下記が関連しそうだ (WPFでなくUWPとなっているが)。
[カスタム添付プロパティ](https://docs.microsoft.com/ja-jp/windows/uwp/xaml-platform/custom-attached-properties)

### AttachedPropertyBrowsableForType

`[AttachedPropertyBrowsableForType(typeof(TextBox))]`という部分については以下を見つけた。
[[WPF][C#]DataGridの列の自動生成を属性でカスタマイズ その２](http://blogs.wankuma.com/kazuki/archive/2009/05/26/173590.aspx) @ かずきのBlog

公式は以下のようだ。
[AttachedPropertyBrowsableForTypeAttribute クラス](https://msdn.microsoft.com/ja-jp/library/system.windows.attachedpropertybrowsablefortypeattribute(v=vs.110).aspx)

「キーワード」+Attributeで公式を見つけられるのかもしれない。
システム障害解析におけるログのあれこれ

この記事は [Akatsuki Advent Calendar 2017](https://qiita.com/advent-calendar/2017/aktsk) の 8 日目の記事です。
7日目: [バイナリのビルド作業はそろそろボタンをポチるだけにしようぜ](https://qiita.com/tomotaka-yamasaki/items/f84adef4dcc0908942e7)

# 背景

システムを運用していると、日々アプリケーション・ミドルウェア・インフラのログが蓄積されていきます。これらのログはシステムの障害対応・解析のための貴重な情報源となりますし、そうであることが期待されます。
しかし、これらのログの取り扱いを誤ると誤った障害解析結果を導き出してしまったり、解析にいたずらに時間がかかったり、障害を特定することができなかったりといったことが起こります。
今回はこれらのログを扱う上で注意すべき点とその改善案を紹介をしたいと思います。

# 前提

私はソーシャルゲームのインフラとサーバサイドアプリケーションを担当しており、下記のサービス・ソフトウェアを利用しています。

- AWS
  - ELB (Classic)
  - EC2 (AmazonLinux)
  - RDS (MySQL)
  - CloudWatch
  - 他 
- nginx
- Ruby on Rails (unicorn)
- 他 BigQuery, ElasticSearch, Re:dash, Kibana, Mackerel 等

# そのタイムスタンプ、いつのもの？

通常、ログデータにはタイムスタンプが付けられていますが、このタイムスタンプは一体「いつ」の時刻を記録したものなのでしょうか。

ほとんどの場合、対象ソフトウェアが処理を開始した時間が記録されるのですが、実は例外もあります。
私の所属しているプロジェクトで使っているソフトウェアの中では nginx がこれに該当します。
nginx では「処理が完了した時刻 (= レスポンスを返した時刻)」が記録されます。

システムが正常に稼働している限りこれらの違いを気にすることは少ないと思いますが、障害解析時はその限りではありません。
各アプリケーション・ミドルウェア・インフラのログを少なくとも秒単位であわせ解析する必要があるため、各タイムスタンプが「いつ」の時刻を記録したものなのか把握していないと、誤った障害解析結果を導きかねません。
特にタイムアウト処理が絡んだ場合、レスポンスを返した時刻はリクエストを受けた時刻と大きな差が発生します。

何気なく記録されているログのタイムスタンプにも罠があります。ご注意ください。


# 必要な情報出してる？

前項で「nginx のタイムスタンプはレスポンスを返した時刻」と説明しましたが、ではいったいどうやって「処理を開始した時刻(= リクエストを受けた時刻)」を出力するのでしょうか。
実は nginx のデフォルトの設定ではこれができません。

nginx で「リクエストを受けた時刻」を記録する方法はいくつかあるようなのですが、最も簡単なのは「レスポンスを返すまでにかかった時間」を一緒に記録することです。ログの解析時にそれらの値を使って「リクエストを受けた時刻」を求めることができます。ログ解析時に前処理は必要になりますが、それを低コストで行える環境もあわせて用意しておくとよいです（後述)

(※ 最も良いのはもちろん予めログにリクエストを受けた時刻を記録することですが、ログ収集時に計算させる方法も可能です）


# 死ぬ前の情報は残した？

エラー時の情報は貴重です。この情報の有無で障害解析のスピードと精度は数倍変わってくるでしょう。しかし、中にはエラー時の情報を残さずに死んでしまうソフトウェアもあります。私のプロジェクトで利用しているもの中では unicorn がこれに該当します。

unicorn はリクエストを処理する worker プロセスと、workerプロセスを管理する masater プロセスから構成されます。
 unicorn はタイムアウトの設定を持ち、worker プロセスの処理がこのタイムアウト内に完了しない場合、master プロセスは workerプロセスに対して即座に SIGKILL を送りつけます。その結果、「タイムアウト内に完了しなかった処理」がログに記録されないという事態が発生します。

これに対する改善策はいくつかあります。

1. より上位にあるソフトウェアで記録を残す
   - 具体的には ELB や nginx でログを残す。当該リクエストを処理したホストの情報、エラーコード、エンドポイント等を記録する。
2. SIGKILL の代わりにトラップ可能な SIGINT 等を利用し、そこで `Rails.logger.flush` させる
   - [参考] http://blog.mirakui.com/entry/2012/02/19/how-to-flush-rails-logger-if-unicorn-timeout
3. Rails の ActionController の `around_action` で "ソフトな" タイムアウトを設定する

```ruby
around_action :global_timeout

def global_timeout
  Timeout.timeout(TIMEOUT_SEC) do
    yield
  end
end
```

私の所属するプロジェクトで実際に適用されているのはまだ1のみですが、2,3の手法も評価していく予定です。

# ログデータ膨大すぎるんだけど...

正確な障害解析には普段から多くの情報を取得しておく必要がありますが、その結果、解析に時間がかかったり、そもそも普通のマシンでは処理ができなかったりといったことが発生します。
私の所属するプロジェクトでは、ログをBigQueryとElasticSearchに格納し、Re:dashやKibanaで可視化できる仕組みを構築しています。

普段はマクロなインフラメトリクス（や、売上情報等）を表示するために使っていますが、障害解析時はクエリを書くことで簡単に情報を絞り込んだり、可視化することができ、便利です。nginxのタイムスタンプ問題もクエリを書くことで簡単に解決できます。

(※ すべてBigQuery+Re:dash に統一化したいなぁ)

# さいごに

障害解析は「より少ない情報、より少ない時間で原因を特定する」エクストリームスポーツではありませんし、そうあってはなりません。
エンジニアにエスパーの力を求めるのは間違っています。
また、「システムの癖を知った、長年の経験のあるエンジニアにしかできない作業」であってもなりません。

障害解析のために十分な情報を集めることや、スピーディに解析できる環境を用意することは言うほど簡単ではありませんし、コストもかかりますが、安定したサービスを提供するには必要不可欠なものです。

堅牢なシステムの構築は１日にして成らず、頑張っていきましょう。
python で AWS の SNS にパブリッシュする

python3 で、AWS の SNS にパブリッシュ（投稿）する方法です。
Arch Linux と Raspbian で動作を確認しました。
topic は変更して下さい。

```py3
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	sns_test.py
#
#						Dec/08/2017
#
# --------------------------------------------------------------------
import sys
import json
import urllib
import boto3

# --------------------------------------------------------------------
def send_to_sns(event, context):
	sns = boto3.client('sns')
	sns.publish(
		TopicArn=event['topic'],
		Subject=event['subject'],
		Message=event['body']
	)

	return ('Sent a message to an Amazon SNS topic.')
#
# --------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
event = {
	"topic": "arn:aws:sns:ap-northeast-1:999999999999:test_sns",
	"subject": "This is the subject of the message. Dec/08/2017",
	"body": "This is the body of the message. Dec/08/2017 PM 13:01"
}

context = ""
rvalue = send_to_sns(event, context)
print(rvalue)
#
sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------
```

Node.js のサンプルはこちらです。
[Node.js で AWS の SNS にパブリッシュする](https://qiita.com/ekzemplaro/items/b44b1dbce2a597ac0918)
array_mergeのメモ的なやつ

```php
<?php
$array_a = array(
    "a" => "1",
    "b" => "2"
);

$array_b = array(
    "a" => "2",
    "b" => "3"
);

var_dump(array_merge($array_a, $array_b));
```
↓

```
$ php test.php
array(2) {
  ["a"]=>
  string(1) "2"
  ["b"]=>
  string(1) "3"
}
```

上書きされる
符号化の検討(暗号化,復号化)

こんにちは。フリーランスの永田です。

年末で飲み会もあり、本日は、仕事、個人のgithubのpush、qiitaの記事、忘年会とスケジュールがぎっしり埋まっているので、休憩時間に今回の記事を書かせていただいています。
その前に最近は、勉強会に積極的に参加させていただいています。
今週も複数の勉強会に出席しました。

昨日,12月７日はメルカリの忘年会,Swiftに参加させtいただきました。
豪華なイス、美味しい食事、共に好きなプログラムということで、楽しかったです。

なるべく、早めに仕事のプログラムを実装したかったので、懇親会は１次会までにして、寝落ちするまで、検討を進めて、本日に挑みました。

ハマればqiitaもかけない。githubもpushできない。忘年会もいけないなど、己の実力勝負になります。
34歳　フリーランス Swift3年目、、、幕の内一歩のデンプシーロールのイメージ

徹底的に毎日、鍛え上げるしか道はないんです。

ということで、話は逸れましたが、符号化の検討を進めて行きます。

###符号化とは

別の規則にのっとった異なるデジタルデータに変換、圧縮すること。 

###今回の目的
Swift4,5にあたり　符号化して、暗号化をオリジナルでできないものか？
という想いでした。

理由はほとんど、暗号化までの実装がライブラリーに頼ったものです。

しかし、認証系、セキュリティーのカテゴリーでは、非常に重要な部分です。
いつなん時、ライブラリーの機能が使えなくなるかもしれません。
（多分使える確率の方が、圧倒的に高いと思いますが、、、、）

実装をする前に、実装する簡単な手順を書き残すというものになります。


単純な手順から、簡単な図を書き、具体的にどのように実装するか?イメージを高めていきます。(実施後図もサイドアップデートします。)


そして、実際の実装は、23日もcocoa勉強会でも同じ項目を記載していますので、
実装レベルに上げていきたいと思います。


#　検討内容
###暗号化Flow

AES-256,AES128　ー＞　適当な256か１２８ビット長の鍵用意

鍵をエンコードし、さらにバイト列に変換

エンコードの方は、
Base64文字列にエンコードなど。
ここは実装仕様によって型変換を取り決める。

###復号化Flow

復号化とは、元のデータに戻すこです。

サーバーはSakuraサーバーを使用します。アプリ側で、暗号化、復号化処理を実装します。

サーバーには、パスワードを送信します。

iosから受信したパスワードを称号して、合っていれば鍵を開けるios側に送信します。


#まとめ
仕様がはっきりしていない段階でも検討という部分で仕様が可能かどうか。期間はどれくらいかなどの疑問が生まれます。

その一つ一つを検討段階でタスク化したり、実際に形にして、仕様=>設計=>実装と進めていける部分もありますので、検討能力が高いと、上手くいきやすい部分があると考えました。

繰り返しになりますが、23日のcocoaでの記事で、実装レベルまで上げていきたいと思うます。

貴重なお時間をお読みくださいまして、誠にありがとうございます。
folium+jupyterで忘年会の場所決め

# はじめに
12月といえばadvent calendar、そして忘年会。

忘年会に参加する人が色んな場所に散らばってると
場所を決めるのが結構苦労しますよね

参加する人の職場(最寄り駅)の座標から重心取って
そこらへんを開催場所にすれば公平になるな、
わかりやすく地図にプロットして可視化したいな、と思い
実際にやってみた、という内容です。

googleマップでできるかな？と思いましたが、
各駅調べて座標取って計算する、とかが大変そうでした。
(もしかしたらうまいやり方があるのかもしれません。。。)

簡単に地図に座標プロットして、計算もできるものないかなと色々調べた結果
foliumを活用しました。

# folium

[folium](https://github.com/python-visualization/folium)は[leaflet.js](http://leafletjs.com/)というマップライブラリを使い、
簡単にデータを可視化できるpythonライブラリです。

インストールはconda(もしくはpip)にて簡単に行えます。
私はcondaで実行しました。

```bash
conda install folium
```

*foliumについてはこちらの@nakakenashiさんのqiitaの記事を参考にさせていただきました。
[Folium: Pythonでデータを地図上に可視化](https://qiita.com/nanakenashi/items/824c0cb16860ca59a424)

# やってみました
以下の方針で実施しました。
1. 駅名から座標へ変換する
2. 座標の平均をとる = 開催場所とする
3. 各駅/開催場所をプロットして可視化する

### 1.駅名から座標へ変換する

駅名、座標を保持したデータないかと探したところ、
色々と見つかりましたがその中でも
[駅データ.jp](http://www.ekidata.jp/) を使用しました。

無料で会員登録を行い駅データの最新版を取得。
station20171109free.csvという名前のファイルがダウンロードできます。
中を見てみるとこのようになっていました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/76107/729ea76d-606b-2e2d-20e8-b771a8ab5b5f.png" width=90%>

駅名(station_name),緯度(lat),経度(lon)を使います。


*駅データ探しはこちらの@kouさんのqiitaの記事を参考にさせていただきました。
[駅とか路線のマスターデータの入手方法](https://qiita.com/kou/items/e0d3fab106e4c52a7f26)

### 2. 座標の平均をとる = 開催場所とする

csvデータをpandasで読み込み
対象の駅データを抽出。
緯度/経度の平均を求めます。

```py3
import pandas as pd
df = pd.read_csv('station20171109free.csv')[['station_name','lat','lon']]
# 駅データには複数路線の駅データがあるため駅名ごとに1つに絞る
df = df.drop_duplicates(['station_name'])

# 参加者の最寄り駅
base_station = ['秋葉原','厚木','市川','横浜','大岡山','高田馬場','池尻大橋']

for index, row in df.iterrows():
    if row['station_name'] not in base_station:
        df = df.drop(index)

# 平均をとる
average_pos = df.mean()
```
結果として以下のような駅データと平均座標が求められます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/76107/ce8bec20-f965-33ac-be64-4a8efbd00ee7.png" width=70%>

### 3. 各駅/開催場所をプロットして可視化する

あとは取得した各駅と計算した中心の座標を地図にプロットします。
ようやくfoliumを使います。

```py3
import folium
# 中心座標付近の地図を作成
m = folium.Map(location=[average_pos['lat'], average_pos['lon']], zoom_start=11)
# 各駅をプロット(色は青)
df.apply(lambda row:
             folium.Marker(
                 location=[row['lat'], row['lon']],
                 popup=row['station_name'],
                 icon=folium.Icon(color='blue')
             ).add_to(m), axis=1)
# 中心座標をプロット(色は赤)
folium.Marker(
    location=[average_pos['lat'], average_pos['lon']],
    popup='集合場所',
    icon=folium.Icon(color='red')
).add_to(m)
```

結果こうなりました。
<img src="https://qiita-image-store.s3.amazonaws.com/0/76107/b51442c0-42e2-ba99-b7d8-3ac6e2b58a3e.png" width=90%>


中心は、、、

<img src="https://qiita-image-store.s3.amazonaws.com/0/76107/c8092366-deb9-e2ef-dd3d-6c5b76438476.png" width=90%>

都立大学駅付近ですね


# 最後に
foliumを使うと本当に簡単に地図にデータを表示できたな、と思います。
Map,Marker以外にも色々あるので使ってみてまた記事を書ければいいなと思います。

.
.
ちなみに結局忘年会の場所は渋谷になりました。(近からずとも遠からず？)
無線LANアダプターのドライバが動かなくなる

aptでUbuntuのアプリケーションを更新したあと、無線LANアダプターが動かなくなることがある。

# TL;DR

DKMSって大事だよ、というはなし。

# aptでアプリケーションを更新する

例えばこんなかんじ

```bash
The following packages were automatically installed and are no longer required:
  linux-headers-4.10.0-37 linux-headers-4.10.0-37-generic linux-image-4.10.0-37-generic
  linux-image-extra-4.10.0-37-generic
Use 'sudo apt autoremove' to remove them.
The following NEW packages will be installed:
  linux-headers-4.10.0-42 linux-headers-4.10.0-42-generic linux-image-4.10.0-42-generic
  linux-image-extra-4.10.0-42-generic
The following packages will be upgraded:
  apport linux-generic-hwe-16.04 linux-headers-generic-hwe-16.04 linux-image-generic-hwe-16.04 lxd lxd-client
  python3-apport python3-problem-report rsync
9 upgraded, 4 newly installed, 0 to remove and 0 not upgraded.
Need to get 67.1 MB of archives.
After this operation, 308 MB of additional disk space will be used.
Do you want to continue? [Y/n] 
```

これでLinux Imageが更新されるとドライバがlsmodでも表示されなくなる

# 解

DKMSというカーネルイメージが更新されると自動でドライバを再インストールしてくれる機能を使う
詳しくは[こちらの記事](https://qiita.com/amazipangu/items/aca136fc88044fdd73b5)におまかせします（手抜き）
multipart/form-dataのリクエストで地味にハマったメモ

#multipart/form-data
先日、JavaのHttpURLConnectionを用いて通信処理の実装をしてました。
その中で、multipart/form-data形式で汎用的に送信できる部品を作っていたのですが、何故か何度通信してもmultipart/form-dataのリクエストとして認識されず、解決にかなりの時間を費やしてしまいました。

原因はとてもしょうもない内容で、こんな事でハマるやつが他にいるのか？という感じだったのですが、備忘録的な意味合いも兼ねて書いておきたいと思います。

ちなみに最初に書いてしまうと、原因はこいつでした。
![imageのコピー2.jpg](https://qiita-image-store.s3.amazonaws.com/0/220849/54ed553a-d3d5-9ad1-b1a5-c40635568590.jpeg)




#multipart/form-dataのリクエストボディ
一般的なのはこんな感じです。
以下のような形式で組み立てた内容をBodyに乗せて通信します。

```text:multipart/form-dataのボディ
--[Boundary文字列]
Content-Disposition: form-data; name="[フォーム名]"

<<フォームの内容>>
--[Boundary文字列]
Content-Disposition: form-data; name="[フォーム名]"; filename="[ファイル名]"
Content-Type: text/plain

<<ファイルの内容>>
--[Boundary文字列]
・
・
・
送る分だけ続く
・
・
・
--[Boundary文字列]--
```
リクエストヘッダのContent-Typeはmultipart/form-data、Boundary文字列はContent-Typeの後ろに書いておきましょう。
改行コードは必ずCRLFで。

#何故か認識されない・・・
送信したリクエストのリクエストボディを見るも、上記の形式と比べてパッと見間違っている気配がなく、リクエストヘッダのContent-TypeのBoundary指定も間違いない。
うーん？

#原因
Postmanからformdata形式で通信し、正常に認識できているリクエストと比較したら、

```text:multipart/form-dataのボディ
--[Boundary文字列]
```
の、最初の「--」がありませんでした。。
最初、あまりmultipart/form-dataの仕組みに詳しくなく、ネット上のサイトを参考に作っていたのですが、色々なサイトでBoundary文字列として「--------ランダムな文字列」みたいな指定だったので、それに習って最初に「--------」を付けた文字列を指定しており、最初に別途「--」が必要だという認識が欠けてた事と、実際抜けてるかどうかの確認がし辛かった事が原因でした。（RFCちゃんと読めと言う話ですが。）

ちなみに最後の区切りは後ろにも「--」が必要だゾ！（念押し）

#教訓
思い込みは怖い。

同じような内容で詰まる人が出ないように書き記しておきます。（そんな人いないか）

#ついでに
ちなみに、HTTP通信のテストを行うときは下記のサイトがおすすめです。
GETやPOSTで送ったリクエストの情報とかをJSONの形で返してくれるようなエンドポイントや、バイナリのレスポンスを返してくれたり、他にも色々なエンドポイントが用意されているので、簡単な通信内容の確認から結構しっかりした通信のテストも行えます。

ご存知でない方がいたら是非利用してみてください。捗ります。
httpBin: https://httpbin.org/
Illustratorのスクリプトで、名刺の氏名部分のカーニングを自動調整

#Illustratorのスクリプトのリファレンスはpdf形式

＿人人人人人人人人人人人人＿
＞　リファレンスがpdf　 ＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣

https://www.adobe.com/devnet/illustrator/scripting.html

これは見つけにくいよ！
先人のブログが少ないので取っ掛かりにくく感じますが、実際にはただのJSなので恐るに足りません。まずは挑戦あるのみ。
#名刺の氏名部分のカーニング調整を自動で行うスクリプト
名刺の「氏名」部分は、住所などの普通の文字よりも間隔が開いています。また、姓と名の間も、微妙に大きな間隔があります。
![namespace.PNG](https://qiita-image-store.s3.amazonaws.com/0/80956/7ddd0c8c-f7b6-5f11-709e-553db97cc14c.png)
※「ディレクター」の部分の文字間隔より、赤ライン部分、青ライン部分の文字間隔が広い

この微妙な間隔はIllustratorのカーニング機能でデザインしているのですが、なんと変数でaiデータに氏名を流し込むと、カーニング情報が消えてしまいます。手でポチポチ何十人分もカーニング設定し直すのは大変…

ということで、変数で氏名情報を流し込んだ後、カーニング情報を再設定してあげる小さいスクリプトを書くことにしました。
#解説
氏名情報は「佐藤　太郎」のように、姓名の間に全角スペースが入った状態で流し込んでいます。今回は、

* 1文字目と全角スペースのカーニングは0
* 名前の1文字目（この場合は「太」）のカーニングは250
* それ以外の文字のカーニングは750

としてみました。
##使ったメソッドなど
###activeDocument.selection
クリックしたオブジェクトの情報を取得します。今回は、氏名部分をクリックしてからこのスクリプトを実行するので、取得するのは「氏名」部分のオブジェクトになります。
###activeDocument.selection[0]
文字を選択した状態では、0番目で文字情報が取得できます。
###characters.length
文字列の長さ。
###characters.contents
文字をstringで取得します。
###kerning
カーニングの値を指定します。Illustrator上で普段使っているのと同じです。

#完成
```js:kerning.jsx
var headOfLine = 0;
var spaceKerning = 0;
var afterSpace = 250;
var ordinaly = 750;

var nameInfo = activeDocument.selection[0];

for (i=0; i<nameInfo.characters.length; i++) {
  targetChar = nameInfo.characters[i];
  if(i==0){ //1文字目
    targetChar.kerning = headOfLine;
  }else if(targetChar.contents == "　"){ //スペース
    targetChar.kerning = spaceKerning;
  }else{
    beforeChar = nameInfo.characters[i-1];
    if(beforeChar.contents == "　"){ //名前の1文字目
      targetChar.kerning = afterSpace;
    }else{ //上記以外
      targetChar.kerning = ordinaly;
    }
  }
}
```
#まとめ
リファレンスがpdfな時点で心がくじけそうになりましたが、思ったよりシンプルで直感的にIllustratorのさまざまなプロパティをいじることができます。名刺など、多種の制作物と戦うデザイナーの心を軽くすることでしょう。スクリプト怖くない！
[連載 GLSL 物語] チカラが欲しいか……（最終話）ベクトルディスタンスフィールドの正体に迫る

# まずは原点を中心としたディスタンスフィールドを可視化してみます。

![acircle.png](https://qiita-image-store.s3.amazonaws.com/0/135381/6f607bac-50f3-e86b-1832-b2b69150bf43.png)
https://goo.gl/JDmjGv

```glsl
 precision mediump float;
 uniform vec2  m;       // mouse
 uniform float t;       // time
 uniform vec2  r;       // resolution
 uniform sampler2D smp; // prev scene

 void main(void){
   vec2 p = (gl_FragCoord.xy * 2.0 - r) / min(r.x, r.y); // 正規化
   float l=0.;
   l=length(p);
   gl_FragColor = vec4(vec3(l), 1.);
 }
```
正規化されたpをlengthに掛けるだけですね。
原点oを中心に段々距離が遠くなっていきますね。
円状に広がっていきますが、この時点ではまだ形が定まっていません。

![originarrow.png](https://qiita-image-store.s3.amazonaws.com/0/135381/eb5cb4b9-22cd-f7bb-1d98-b99e98b7c76c.png)
https://goo.gl/emfgKe

この時点では普通のベクトル空間です。

# 次に距離を定めて円を描いてみましょう

![circle65.png](https://qiita-image-store.s3.amazonaws.com/0/135381/6881a83e-1518-f1a9-7067-f38768ba1cb7.png)
https://goo.gl/sGp37W

```glsl
 precision mediump float;
 uniform vec2  m;       // mouse
 uniform float t;       // time
 uniform vec2  r;       // resolution
 uniform sampler2D smp; // prev scene

 void main(void){
   vec2 p = (gl_FragCoord.xy * 2.0 - r) / min(r.x, r.y); // 正規化
   float l=0.;
   l=length(normalize(p)*.65-p);
   gl_FragColor = vec4(vec3(l), 1.);
 }
```

半径を0.65と定めると円が出来ました。
これは、図で見るとなんとなくそうだなと分かります。

![circlevdf.png](https://qiita-image-store.s3.amazonaws.com/0/135381/e629b070-179c-7ef7-667a-ecbcd3c1de9a.png)
https://goo.gl/KQEv9N

でも、このベクトルディスタンスフィールドを可視化すると....。

原点Oが点だったのに対し、原点Oが円状になってる！？
何これキモイ。

ここで、察しがいい人はもう、お分かりかと思いますが、シェーダーアートは原点で描くアートだったんですね。

# 図形のアフィン変換
ところで、このディスタンスフィールドを移動・回転は正規化されたフラグメントシェーダーが実行されている座標pを操作して移動するのでしたよね。

pを4倍にしたら、図形は1/4に縮小、図形を左に回転させたら右に回転、図形を右に移動させたら左に移動、つまり、pに対する操作なので、逆行列を掛けてるわけですね。図形の拡大・縮小・移動などアフィン変換については通常のベクトル操作の逆行列を掛ければ良いので、ここは問題ありません。

では形の方はどうでしょうか？

# 極座標リプリケーションを可視化する 
今度は極座標リプリケーションを見てみましょう。
![6circle.png](https://qiita-image-store.s3.amazonaws.com/0/135381/2d150c18-2fe7-4af8-03dd-8974558077b2.png)
https://goo.gl/CmE2rs

ディスタンスフィールドを表示してみると

![6circledf.png](https://qiita-image-store.s3.amazonaws.com/0/135381/69e25f4d-1819-0096-5cd8-e2e7d4fb0ee5.png)
https://goo.gl/F28WZt

さらに気持ち悪い図形が浮かび上がってきました。
ベクトルディスタンスフィールドを表示してみると

![6circlevdf.png](https://qiita-image-store.s3.amazonaws.com/0/135381/18bad718-fac7-9d09-d19d-863220075a2f.png)
https://goo.gl/cctW83

原点が6個に増えてますね。

ちなみに、白い境界は、6つに分かれた平行世界の世界線です、この境界は絶対越えられません。iq先生みたいに、物体がはみ出そうになったら、物体の形で境界線を歪ませる。なんてことはできるみたいですけどね。
![sekaisenyugami.png](https://qiita-image-store.s3.amazonaws.com/0/135381/3fd8d307-4faf-de8b-a3c5-0b628ac06e39.png)
https://www.shadertoy.com/view/XtSczV

理論上は、この物体の形に境界線を切って動かすことは可能な筈ですが、その場合でも、同一の空間が重なることはできません。但し、平行世界の位相をずらした左右隣の平行世界を重ねることで疑似的に境界線を越えるように見せることは可能です。話が逸れました。これは、また別記事で解説します。

長くなりそうだったので一旦投稿
あとで続き書きます。
JPAでEntityを作る時にむやみに@GeneratedValueをつけるな

まあ、メモ程度の内容なのでちょっといらっとしてtwitterにつぶやくかなと思ったけどあえてqiitaで記録する。

JPAのハンズオンやらサンプルやら説明サイトやら色んな所でコードを書く時にEntity設定をコピペーで作ってしまって説明が抜けてる手抜きサイトが多いですが、

たとえば、以下のサンプルコードがあったとしましょ

```java

@Entity
@Table(name="users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @Column(name="name")
    private String name;

    @Column(name="password")
    private String password;

    ...
}
```
質問：これだけで動きますか？

正解：動きません

理由：DB上にキーに対する定義をしないと動きません。
たとえば、MySQLだとキーにAUTO_INCREMENTなどの設定をしないと**動きません。**
なのでUUIDなどをjavaから生成してキーにしているテーブルを使っている場合は@GeneratedValueアノテーションを外してください。

このへんを説明しないサイトを見てこちらに問い合わせするのはやめてくれ。。。

結論：
@GeneratedValueを使う時はDBの設定も設定で行うこと。
してないなら外す。
SSHサーバonWi-Fiが応答しなくなることがある

# TL;DR
現在のところ原因ははっきりとはわかっていないが、SSHサーバが落ちるわけではないのに接続できなくなる現象が発生している。そのため、自動的にネットワークを再起動するスクリプトを動かしている。

# 状況の列挙

* サーバはWifiで動いている。
* 突然接続できなくなり、Pingも通らない。
* Journalctlのログにもエラーらしいエラーはない。
* SSHなどで接続していると突然応答がなくなり、復帰できる場合もあるが、復帰できないこともある
* ルータが落ちることがあるらしく、動かないと思ってルータのコンソールにアクセスすると勝手にルータが再起動する（ただし、ルータが動いていてもだめなケースもある）
* Wifiの強度はそれほど強くないので環境としてはあまりよくない
* RaspberryPiなんかを無線で運用する場合に同様の現象が発生するかもしれない
* ディスクアクセスが増えたときに落ちやすい気がするが、Wifi->Samba on Docker->ZFSとなってるからどこが原因かぱっとはわからない
* SambaじゃなくてNetatalk使ったら安定してるｰ>Sambaのバグ？
* Wicdでアクセスポイントを見つけたら接続する機能を使えば再接続してくれるかも？→してくれなかった

# で、結局？

多分無線の強度が弱くて、接続が不安定なのではないかとみられる。

# 現在の対処
ルータに対してPingが通らなかったらNetworkingを再起動するようにした。
ただし、UbuntuでNetworkingは再起動できないのにハマった。

```bash:これはだめ
sudo systemctl restart networking
```

で、実際に使ったスクリプトはこんなかんじだった。

```bash:network-watchdog.sh
#!/bin/bash

while true
do
        ping -A -c 1 192.168.1.1 # ルータのIPにPing
        if test $? -eq 1         # 自分の環境ではPingのリターンコードが1のときタイムアウトエラー
        then
                date >> /var/log/network-watchdog.log # ログは適当
                echo "restart network interfaces." >> /var/log/network-watchdog.log
                sudo systemctl restart wicd >> /var/log/network-watchdog.log
                echo " " >> /var/log/network-watchdog.log
        fi
        sleep 60s
done
```

自分の環境ではwicdを再起動すればうまく動いてくれたのでとりあえずそれで運用している。
あとはこれをサービスとして登録する。
参考にしました→[Systemdを使ってさくっと自作コマンドをサービス化してみる](https://qiita.com/DQNEO/items/0b5d0bc5d3cf407cb7ff)

```bash:/etc/systemd/system/network-watchdog.service
[Unit]
Description = watchdog timer of network connection.
Requires = networking.service
After = networking.service

[Service]
ExecStart = /usr/local/bin/network-watchdog.sh
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target
```

あとは有効にするだけ

```bash:
# 自動起動on
$ sudo systemctl enable network-watchdog
# 起動
$ sudo systemctl start network-watchdog
```
SVGでラジオボタンとチェックボックスをデザインする

できた作ったものはこちら
https://codepen.io/Misaki-Shibata/pen/EbBEeK

<img width="213" alt="radio_and_check.png" src="https://qiita-image-store.s3.amazonaws.com/0/49384/9d3c69e2-ce45-4047-12e3-33c6b73ba14d.png">

CSSでラジオボタンとチェックボックスの見た目をデザインする手法はいくつか
ありますが、SVGのstrokeとfillでも同じようなことができたので投稿しました。
spfレコードに対象hostのIPアドレスを追加しまくったら長いと怒られた

### 前提
* DNSはroute53
* サーバはクラウド
    * IPアドレスセットがバラバラになる
* メールは各サーバから
* システムが構築されるたびにwebサーバ群のIPを登録
    * +ip4:123.456.789.0/24　こんな感じ

### 増やしすぎて怒られる

512バイトが上限なのでまだいけると思ってたけど怒られる、、、
![kako-wEIvFfYWAh0XzByQ.png](https://qiita-image-store.s3.amazonaws.com/0/35464/f0e56beb-93f2-46db-aaaa-33aaa5f16bb5.png)


サポートされる DNS リソースレコードタイプ - Amazon Route 53 - http://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/ResourceRecordTypes.html

> TXT レコードには、スペースで区切られた、二重引用符で囲まれた文字列のリストが含まれます。1 つの文字列には、最大 255 文字が含まれます

RFCで連結した後の1つのレコードが450バイト以下であることが目安とされているため
妥当と思われる255バイトで制限かかってるところが多いらしい

　
### 分割をしよう

間違いから学ぶSPFレコードの正しい書き方 : 迷惑メール対策委員会 - http://salt.iajapan.org/wpmu/anti_spam/admin/operation/information/spf_i01/

TXTレコードを単純に分けてはダメらしい

### baseレコードとincludeレコードに分ける
オリジナル

```
"v=spf1 mx ip4:123.456.000.0/24 +ip4:123.456.111.0/24 +ip4:123.456.222.0/24 +ip4:123.456.333.0/24 +ip4:123.456.444.0/24 +ip4:123.456.555.0/24 +ip4:123.456.666.0/24 +ip4:123.456.999.0/24 +ip4:123.456.888.0/24 +ip4:123.456.999.0/24 include:spf-bma.mpme.jp ~all"
```
分割
↓
baseレコード：mydomain.com. IN TXT

```
"v=spf1 mx ip4:123.456.000111.0/25  include:spf.mydomain.com include:spf-bma.mpme.jp ~all"
```
includeレコード：spf.mydomain.com IN TXT 

```
"v=spf1 +ip4:123.456.111.0/24 +ip4:123.456.222.0/24 +ip4:123.456.333.0/24 +ip4:123.456.444.0/24 +ip4:123.456.555.0/24 +ip4:123.456.666.0/24 +ip4:123.456.999.0/24 +ip4:123.456.888.0/24 +ip4:123.456.999.0/24 ~all"
```

### レコードチェックする
無事通りましたヽ(･∀･)人(･∀･)ﾉ
http://www.kitterman.com/spf/validate.html
実際のメールでも確認
　
### 問題点
includeレコードの中身が増え続けていくのですぐに同じ問題にぶち当たる可能性
#### 解決策案
* スーパー楽な手段
    * 第2オクテットで登録 ： 123.456.0.0/25
        * 漏れが発生する可能性は残る 
* さらに入れ子にする
    * ベース - include:ドメインtxt include:txt ~all"
    * ベース - include:ネットワークセット include:ネットワークセット ~all"
        * ネットワークセット - include:ドメイン名txt ~all"
    * ドメイン名別にtxtを用意すると削除がしやすい
* MXをアウトソースにする
    * 余計な作業が減る
        * お金はかかる
async/await で Modal の Queueing

## モーダル被ってませんか？
モーダルを実装するにあたり「表示条件によって被って表示されてしまう」「例外発生時の仕組みがない」という問題に直面したことはありませんか？また、ユーザーステータスによって数種類のモーダルを異なる順番で表示したい、という要件もあるかと思います。

本項では ES2017 の async/await を使ってQueueing を実装する方法を紹介します。vanilla なので、どのフレームワークやアーキテクチャを採用していても導入出来ます。

![Untitled.gif](https://qiita-image-store.s3.amazonaws.com/0/59071/b4f74ac9-5408-5c0b-7c00-13bd23a15890.gif)

sample: https://github.com/takefumi-yoshii/async-await-modal-queue

サンプルは chrome で、babel や webpack を使用せずにそのまま実行出来ます。もちろんプロダクトコードは適宜バンドラや polyfill を利用してください。


## モーダル画面を一つのPromiseと捉える
Promise といえば、XHR で json を取得したり、アニメーションの完了を待ったりする非同期処理のためのもの、というイメージが強いかと思います。「モーダルが表示されてから閉じるまで」などのUIの一連の操作も、期待値を待っている非同期処理と同等と捉えることが出来ます。

モーダル画面を表示する際の関数に、Promiseを発行させます。そして「閉じるボタン押下、背景押下」などの閉じる相当の行為で、発行された Promise を resolve する様に仕込んでおきます。

``` promises.js
export function clickModalCloseButton () {
  return (() => new Promise(resolve => {
    document.getElementById('modal-close-button')
      .addEventListener('click', resolve, { once: true })
    })
  )
}
```

## async/await で Queueing
async function に無限ループを置きます。Queue配列に格納された Promise をひとつずつ取り出して await します。Queueが空になったら、無限ループを break。async function 自体の戻り値も Promise なので、クロージャの末尾まで到達・例外throw で resolve・reject となります。

```asyncs.js
let queue = []

async function playQueue() {
  while (true) {
    const { resolvedModalPromise, value } = queue[0]
    await openModalAnimation(value)
    await resolvedModalPromise()
    await closeModalAnimation()
    queue.shift()
    if (queue.length === 0) break
  }
}
```

## Queueの再生

今度は別の async function で、
Queueに溜まったモーダルを再生させるイベントを待ちます。ボタン押下イベントを待つものもまた Promise として扱い、ループの中で await します。

```promises.js
export function clickPlayButton () {
  return new Promise(resolve => {
    document.getElementById('play-button')
      .addEventListener('click', resolve, { once: true })
  })
}
```

「Queueの再生が全て終わったら、また再生ボタン押下を待つ」というループですね。

```asyncs.js
export async function watchPlay() {
  while (true) {
    await clickPlayButton() // Promise
    await playQueue() // async function
  }
}
```

Redux や Flux では、特定の Action を待つ Promise を発行すれば良いですね。redux-saga や vuex-saga を導入していれば、async/await と同じ様に saga はデザインされているので、そちらに組み込みましょう。サンプルは分かり易さをとったので、jQueryライクな書き方を随所にしていますが、ご承知下さい。
a bit less painful scripting

Elasticsearch の [scripting](https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-scripting.html) は、スクリプト言語である painless が実は結構 painful に感じていて、出来るだけ使いたくないなと思ってます。理由は、painless のデバッグがしづらい上に、そもそも書きづらいからです。スクリプト自体をJSONの中に改行せずに書かなくてはならないので、可読性もすこぶる悪いです。

と思っていたのですが、実はスクリプトを改行できることに[これ](https://discuss.elastic.co/t/dec-5th-en-elasticsearch-using-painless-to-prepare-for-the-holiday-season-deals/110211)見て気付きました。Kibana の DevTools で見るとシンタックスもハイライトされて、だいぶ良くなった感じします。
![スクリーンショット 2017-12-08 14.21.35.png](https://qiita-image-store.s3.amazonaws.com/0/42252/b00c2a7f-c82a-127b-fcea-239a8d57fb1b.png)



ちなみにこの記事は、アドベントカレンダーを紹介している[この記事](https://www.elastic.co/blog/elastic-advent-calendar-2017-week-one)からたどって行きました。
ラズパイ画面の豆腐文字を撲滅する

RaspberryPiに最新のRaspbianをインストールしたけど、こんな風に文字化けしてませんか？

![171206_raspberrypi2017_05.png](https://qiita-image-store.s3.amazonaws.com/0/69327/efe32ca1-585a-3de5-1224-964b46771ee8.png)


# 問題点
RaspbianのGUI画面の右上に謎の四角い文字（通称「豆腐」）が出ている。
本来は、CPUの使用率が数値と%で表示されるはずです。


#解決策
文字化けしない日本語フォントをインストールします。

```bash
sudo apt-get install fonts-noto
```
これでrebootすればちゃんと表示されます。

![171206_raspberrypi2017_09.png](https://qiita-image-store.s3.amazonaws.com/0/69327/97f9a5c5-578c-88db-af86-706a8c588127.png)
とうふ撲滅！

# 解説
フォント "Noto" はGoogleによるオープンソースのフォントファミリーです。
名称の由来はこちらの通り。

>コンピューターで表示できない文字がある場合、文字の代わりに小さい四角(□)、通称"豆腐"が表示されることが多いが、すべての言語に対応したフォントを開発することで"豆腐"が現れることがなくなるようにという意味を込めてNoto(no more tofu)という名称が付けられた。

[Wikipediaより](https://ja.wikipedia.org/wiki/Noto)


# 参考サイト
[クラゲのIoTテクノロジー](http://jellyware.jp/kurage/raspi/raspberrypi2017.html)


良きラズベリーパイライフを！
ではまた。
.htaccess の書き方メモ

普段は BASIC 認証をかけたいディレクトリに .htaccess を設置するのだけれど、そのディレクトリが存在しない（example.jp/index.php/admin/ が管理画面の URL）システムに BASIC 認証をかける時に悩んだので。
httpd.conf が触れるのであれば、LocationMatch とかを使えばいいらしいが、レンタルサーバではそういうわけにもいかなかったので、.htaccess で対応。
仮想ディレクトリとでもいうのだろうか。
「特定の URL に BASIC 認証をかける」ではなく、「特定の URL（本番環境のフロント全部）だけ BASIC 認証をかけない」というやり方。

```htaccess:.htaccess
# 大前提として、全部閲覧禁止とする
Order deny,allow
Deny from all

# BASIC認証が通った場合は閲覧許可
AuthUserFile "/home/SERVER_ID/example.jp/htpasswd/.htpasswd"
AuthName "Input your ID and Password."
AuthType Basic
require valid-user

# もしくは・・・
Satisfy any

# URL が管理画面か、ホスト名がテスト環境で無い場合は閲覧許可
SetEnvIf Request_URI "/admin/*" noauth
SetEnvIf Host "test.example.jp" noauth
allow from env=!noauth
```



参考にさせていただいたサイト
[特定URL時のみ、basic認証](http://starfam.hatenablog.com/entry/2017/02/01/152148 "特定URL時のみ、basic認証")
Movable Typeで「Can't locate parent.pm in...」というエラーを解決する

![28b83e6e9ea0679d5b797fbace9fa79c.jpg](https://qiita-image-store.s3.amazonaws.com/0/21117/de2b2c0d-e358-f91f-1d21-27036c83a057.jpeg)

Movable Typeで、バージョンアップをしたときや、新しいプラグインを追加したときに「**Can't locate parent.pm in &#64;INC...**」というエラーが表示され、動作しなくなることがあります。

これは、Movable Typeコアもしくは追加したプラグインで利用する前提となっているPerlモジュール、「parent.pm」が利用中のサーバーに設置されていないことにより発生するものです。

```
Can't locate parent.pm in @INC (@INC contains: /home/path/to/movabletype/mt/plugins/mixiComment/lib
/home/path/to/movabletype/mt/plugins/spamlookup/lib
/home/path/to/movabletype/mt/plugins/WidgetManager/lib
/home/path/to/movabletype/mt/plugins/SmartphoneOption/lib
・・・
```

## Perlの設定が可能なサーバーの場合

CPAN等のモジュール管理ツールで、parentモジュールを追加してください。

## レンタルサーバー等、設定できないサーバーの場合

### parentモジュールを入手する

![26e1858f3cdf24dc2c9db5624426da82.jpg](https://qiita-image-store.s3.amazonaws.com/0/21117/c4714600-fb33-4114-f208-2a055ef6052f.jpeg)

CPANのウェブサイトにアクセスし、ページ中央のフォームに「parent」と入力して、モジュールを検索してください。

[http://search.cpan.org/](http://search.cpan.org/)

![9c2a1aa2625a2a6a35cacf43bf1e0933.jpg](https://qiita-image-store.s3.amazonaws.com/0/21117/f0e5e77e-606e-c2ed-7936-4ce43b2c9ced.jpeg)

検索結果に「parent」モジュールがあるので、詳細ページへ移動し、「source」リンクを右クリックして、リンク先のファイルを保存してください。保存ファイル名は「**parent.pm**」にします。

### Movable Typeにモジュールを追加する

「parent.pm」ファイルを、以下のいずれかのディレクトリにアップロードしてください。
Movable Typeのメンテナンスを自分が行わないなどの理由で、コアファイルが上書きされてしまうのを避けたい場合は、プラグイン内に追加する方が安全です。ディレクトリがなければ作成してください。

```
Movable Typeを設置したディレクトリ/extlib
Movable Typeを設置したディレクトリ/plugins/エラーが発生したプラグイン/extlib
```

## 参照元

もう少し詳しい話は、荒木さんの解説を参照ください。

[Perlで「Can&#039;t locate parent.pm」が発生する場合の対処: 小粋空間](http://www.koikikukan.com/archives/2013/07/05-005555.php)
Xcode 9.2 新機能


# はじめに
2017/12/8にXcode9.2がリリースされました。バグ修正は訳してもつまらないので新機能を中心に見ていきたいと思います。

# 新機能
## Xcode9 Build Systemの新機能
Buildの並列性を高める機能が追加されました。

機能を有効にするにはMacのTerminalアプリで以下のコマンドを入力する必要があります。

> defaults write com.apple.dt.Xcode BuildSystemScheduleInherentlyParallelCommandsExclusively -bool NO

この機能を無効にするには以下のコマンドを入力します。

> defaults delete com.apple.dt.Xcode BuildSystemScheduleInherentlyParallelCommandsExclusively

ちょっと使ってみてMacのアクティビティモニタで見てみましたが、clangの同時実行数が増えているようでした。効果は、当方の端末が古い（2013年のMacBookAir）せいでよく分かりませんでした（悲）

## CoreMLの新機能
* ニューラルネットワークモデルのfloat16 weightsとカスタムレイヤーを含む.mlmodel バージョン2のサポートが追加されました。
* Modelビューアを更新して、カスタムレイヤの依存関係を表示しました。

## Interface Builderの新機能
* UICollectionViewのSectionの余白をどの対象と開けるかを指定出来るように、サイズインスペクタでサポートされるようになりました。セーフエリアを基準にするといったことが出来ます。

これはいい変更！iPhoneXがリリースされてセーフエリアは超重要になりましたので、こういった機能はどんどん追加して欲しいです。


新機能は以上です。はじめてリリースノートで新機能を追ってみましたが楽しいし勉強になりますね。今後もがんばろ（怪）
未定義なHTMLタグをTypeScriptで使いたい！でもビルド警告は消したい！

この記事は [BRIGHT VIE Advent Calendar 2017](https://qiita.com/advent-calendar/2017/brightvie) 9日目の記事になります。


#なぜ未定義のHTMLタグを使う必要があったのか

弊社のグラフインターフェイスは [Highcharts](https://www.highcharts.com/)を使うことが多く、
ネットにあったサンプルをIonicのビューへ貼り付け、そこからロジックをカスタマイズをします。

仕様に合わせていろいろ組み込んでますが、こんな感じでしっかり動きます。

<img width="971" alt="スクリーンショット 2017-12-08 11.41.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/34871/8f0166f7-e380-dd3d-c0a5-b8d26e10f97e.png">


で、改めてHTMLコードをみると、こんなコードになっています。

```html:
<chart></chart>
```

<chart>ってHTMLタグが使われていました。
chartタグを使う必要は全くなかったのですが、
「ここにグラフが描画されるってのは、コードの可視性としてはちょっとわかりやすいなぁ」と思い、
「未定義なHTMLタグって使っていいんだろうか？」と考えました。

#未定義なHTMLタグ、使って良いのか？

どうやら「HTMLUnknownElement：未定義なHTMLエレメント」として、仕様上は許可されているようです。

[HTMLUnknownElement](https://developer.mozilla.org/ja/docs/Web/API/HTMLUnknownElement)

褒められた使い方ではないにしても、
絶対に使っちゃだめ！ということではないのかもしれませんｗ

#TypeScriptではビルド警告がでる

ただ、VSCodeなどでは、警告がでます。

<img width="146" alt="スクリーンショット 2017-12-08 11.30.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/34871/368e8705-ea54-23af-4014-8599747d71f9.png">

カーソルをあてると、以下のような警告がでていました。

>[Angular]
>'chart' is not a known element:
>1. If 'chart' is an Angular component, then verify that it is part of this module.
>2. To allow any element add 'NO_ERRORS_SCHEMA' to the '@NgModule.schemas' of this component.

こんなタグしらないとおこられています。

#HTMLUnknownElementを使用しても警告がでないようにする

「未定義なタグも許可してね」と定義します。
NO_ERRORS_SCHEMAのimportと、@NgModule.schemasへの追加でOKです。

```js:home.module.ts
import { NgModule, NO_ERRORS_SCHEMA } from '@angular/core'; //← NO_ERRORS_SCHEMA 追加
import { IonicPageModule } from 'ionic-angular';
import { CarenoteBrowseOneGraphPage } from './carenote-browse-one-graph';
import { ComponentsModule } from '../../../../components/components.module';
import { ChartModule } from 'angular2-highcharts';
declare var require: any;
const Highcharts = require('highcharts');

@NgModule({
  declarations: [
    HomePage,
  ],
  schemas: [    //← schemasへNO_ERRORS_SCHEMAを追加
    NO_ERRORS_SCHEMA
  ],
  imports: [
    ChartModule.forRoot(Highcharts),
    IonicPageModule.forChild(HomePage),
    ComponentsModule,
  ],
})
export class HomePageModule {}
```

定義外のHTMLタグを使う事自体が、バッドノウハウであるとは認識していますが、
HTMLのわかりやすさを重視する場合にはこういった回避策もあるのかもしれません！


(追加：2017/12/08)
コメントで指摘いただきましたように、
Web Componentsの仕様で「ハイフンが必須」ということもあるようですので、
独自にタグをつけちゃう場合には

```html
<my-chart></my-chart>
```

と定義し、

```js:home.module.ts
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; //← NO_ERRORS_SCHEMA 追加

@NgModule({
  schemas: [
    CUSTOM_ELEMENTS_SCHEMA
  ],
})
export class CarenoteBrowseOneGraphPageModule {}
```

とするのが、ベストプラクティスのようです！
[Web Componentsの構成要素まとめ（基本編）](https://qiita.com/masashi127/items/9d81b0396f4834062ead)


#参考URL

[NgModule#schemas](https://angular.io/api/core/NgModule#schemas)
[NgModule#schemas - NO_ERRORS_SCHEMA] (https://angular.io/api/core/NO_ERRORS_SCHEMA)
【恐怖】サイバードの企画職の実態

# ご挨拶
はじめまして！プランナーの深井です。
エンジニアではないですが、企画職のあり方を考え直すきっかけとなったエピソードを
赤裸々に書こうかなーと思います。当社の企画職の実態を暴くことになります。お楽しみに…！

・・・まず本題に入る前に、軽く自己紹介をさせていただきます！しばしお付き合いくださいませ。

![IMG_0926.jpg](https://qiita-image-store.s3.amazonaws.com/0/214472/a9e24fe4-da38-8931-afc7-b9b6daf1ede3.jpeg)

私は2014年にサイバードにJOINし、3年間の運営を経て、
今夏リリースしたゲームアプリの立ち上げをプランナーとして担当しました。

その前は某化粧品メーカーで集客用コンテンツサイトの企画・運営に携わってまして、
「モバイルに強くなりたい」という思いからゲームに関わることになりました。

それまでスマフォゲームはほとんどやっておらず、やるとしたら家庭用ゲームがほとんどでした…。
最近は「[STAR WARS バトルフロント2](https://www.ea.com/ja-jp/games/starwars/battlefront/battlefront-2)」がでたので毎日遊んでます。
![IMG_182.JPG](https://qiita-image-store.s3.amazonaws.com/0/214472/481995b0-8f57-d656-d5b2-3c1a167c6fed.jpeg)


そういえば今月はやっと[episode8](http://starwars.disney.co.jp/movie/lastjedi.html)の公開ですね！！！2年前から楽しみにしてました。
前売り券手に入ったら早退させてください。

・・・とまあ、ちょっと脱線しましたが、そのような感じでサイバードの企画職は
前職ゲーム会社でゴリゴリゲーム作ってました！という方もいれば、
私のようにまったくゲームに関係ない仕事をしていた方も結構多いと思います。


# 企画職の実態と課題
単刀直入に言います。私を含め、サイバードの企画職は

- 担当しているゲームのデータがどう扱われているのか知らない
- クライアント側とサーバ側の開発の違いがわからない
- ぎっとはぶ？ぷるりく？なにそれ状態
- えすきゅーえる？くえり？なにそれ状態

課題意識は以前から社内にありましたが、なかなかそこを改善しようとはならず
ぶっちゃけこんなレベルでした…。

ただ、ここ最近でその文化が良い方向に変化してきているのも事実です！
その課題解決の大きな一歩は、「Planter」の開発だったと思います。


# 「Planter」って？
『Planter』をひとことでお伝えすると、
「データを投入するだけで、誰でも簡単に施策が実装できるツール」です。
ちなみに『Planter』は「プランナーが使う」「（データを）植え替える」というような意味で当社エンジニアがつけてくれました。愛着わきますね。

Excelに記入したデータを『Planter』に投入し、そこからGitHubにあるmasterデータにログを残しながら
ゲーム側に反映もできる優秀なツールです。

私が担当したアプリの立ち上げにおいて、
「生産性向上」と「企画職のスキルアップ」が同時ミッションだったのですが、
そのために開発された社内ツールでした。

今回私はゲーム側のプランナーという役割を担いながら、
この『Planter』での運用を視野に入れて各施策の基本設計を担当する、
という新しい取り組みも担当させていただきました。

この取り組みは、今までのゲームプランナーというあり方を覆しました…。

まず『Planter』を扱う以前に、
- データ構造を理解しないといけない
- どのデータがゲーム上にどう表示されるか理解しないといけない
というような、イケてるゲーム会社なら当然、基本中の基本のようなことから再スタートです。

他のゲームタイトルのデータを参考にしながら構造を考えて、
簡単にイベント等の施策が打てるようになるのが私のミッションでした。

このあたり色々細かく書くとすごい量になってしまうので「がんばった」という言葉で割愛しますが、
上記にあげたところを理解することで、
「他にどんな施策ができるか」など後々の施策の検討に役立ったり、
「ゲームのここの表示を変えたいのだがここにこんなカラムを追加するのはどうか」など
エンジニアに対して踏み込んだ質問ができたりなど、
ちょっとはイケてる企画職に近づけたかな、と思います。思うことにします。

ちなみに、今では新卒1年目・2年目のプランナーもそのあたりを理解して
GitHub、Jenkins、SourceTree、Planterを使いながら施策の実装を行うことができています。
これは企画職にとっても会社にとっても大きな進展だったのではないでしょうか。
エンジニアの皆さん、今までご苦労おかけしました…

以上、サイバードの企画職の実態という名の反省文でした。
読んでいただきありがとうございました！
pip install gensim がうまくいかない時

# pip install gensim がうまくいかない時
pipでパッケージをインストールするときに
`pip install パッケージ名`

で、

`Command "python setup.py egg_info" failed with error code 1 in C:\Users\ユーザー名\AppData\Local\Temp\pip-build-81v4m7pj\gensim\`

こんな時ありますよね。
まじか、なんやねんこれって思ってエラー読んでもよくわからないやつです。

で、ググったら案外すぐ出てきたので同じことで困った人がいたらおそらく次のコマンドで解決すると思います！

ちなみに環境はwindows10でPython3.6.1が対象となっています。

`pip install --upgrade setuptools`

これで解決です！！

ちなみに元ネタは[ここ](https://github.com/thisbejim/Pyrebase/issues/179)からです。
DockerでRe:Dashを構築する

環境：Amazon linux

## DockerとDocker-composeをインストール

####`docker`をインストール

```
sudo yum update
sudo yum install docker
```

サービス起動：

```
sudo yum service docker start
```

ユーザに権限追加

```
sudo usermod -a -G docker $USER
```

サーバが再接続してから`docker`を使えるようになります

####`docker-compose`をインストール

```bash
# 一時的にスーパーユーザーになる
$ sudo -i

# ここから一時的にスーパーユーザー ----
$ curl -L "https://github.com/docker/compose/releases/download/1.11.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# docker-compose コマンドに実行権限付与
$ chmod +x /usr/local/bin/docker-compose

# スーパーユーザーを抜ける
$ exit
# スーパーユーザーここまで ----

# docker-compose コマンドの実行確認
$ docker-compose --version
docker-compose version 1.11.2, build dfed245
```

####補足

```bash
# Shortcut追加
alias d='docker'
alias dc='docker-compose'
```

## Re:Dash構築

ソースクローン

```bash
# クローンプロジェクト
git clone https://github.com/getredash/redash.git redash

cd redash
```

`docker-compose.yml`ファイルを修正

```docker-compose.yml
version: '2'
services:
  server:
    image: redash/redash:latest
    command: server
    depends_on:
      - postgres
      - redis
    ports:
      - "5000:5000"
    environment:
      PYTHONUNBUFFERED: 0
      REDASH_LOG_LEVEL: "INFO"
      REDASH_REDIS_URL: "redis://redis:6379/0"
      REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
      REDASH_COOKIE_SECRET: [YOUR SECRET KEY]
      REDASH_WEB_WORKERS: 4
      REDASH_HOST: "http://[YOUR HOST NAME]"
      REDASH_ALLOW_SCRIPTS_IN_USER_INPUT: "true"
      REDASH_CSV_WRITER_ENCODING: "utf-8"
    restart: always
  worker:
    image: redash/redash:latest
    command: scheduler
    environment:
      PYTHONUNBUFFERED: 0
      REDASH_LOG_LEVEL: "INFO"
      REDASH_REDIS_URL: "redis://redis:6379/0"
      REDASH_DATABASE_URL: "postgresql://postgres@postgres/postgres"
      QUEUES: "queries,scheduled_queries,celery"
      WORKERS_COUNT: 2
      REDASH_CSV_WRITER_ENCODING: "utf-8"
    restart: always
  redis:
    image: redis:3.0-alpine
    restart: always
  postgres:
    image: postgres:9.5.6-alpine
    volumes:
      - /opt/postgres-data:/var/lib/postgresql/data
    restart: always
  nginx:
    image: redash/nginx:latest
    ports:
      - "80:80"
    depends_on:
      - server
    links:
      - server:redash
    restart: always
```

サービスを`up`します

```bash
dc up -d
```

DB構築設定

```bash
# npm install
# optional: run npm via docker image
docker run -it --rm --name my-running-script -v "$PWD":/usr/src/app -w /usr/src/app node:latest npm install

dc run --rm server create_db
```

## まとめ

+ DockerとDocker-composeで構築するので早く出来上がります
+ REDASH_CSV_WRITER_ENCODING: "utf-8"を設定するとCSVをダウンロードできますが、Excelで開くと文字化けになります。`cp932`を設定すると時々ダウンロードできないんですが文字化けしない

以上です。
pdfbox-2.0.8 でPDFからJavaでテキスト抽出



```java
import java.io.File;
import java.io.IOException;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;

public class PdfToTextMain1 {

	public static void main(String[] args) {

		// https://pdfbox.apache.org/download.cgi
		// pdfbox-2.0.8
		// fontbox-2.0.8.jar

		String filepath = "file/pdf_ja.pdf";

		try {

			PDDocument pdDoc = PDDocument.load(new File(filepath)); // throws
																	// IOException
			PDFTextStripper pdfStripper = new PDFTextStripper();// throws
																// IOException

			pdfStripper.setStartPage(1);
			pdfStripper.setEndPage(5);

			String parsedText = pdfStripper.getText(pdDoc); // throws
															// IOException

			System.out.println(parsedText);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

```


-->
これはテストです。
zpreztoのgitエイリアスを簡単に調べる

zpreztoが入れてくれるgitコマンドのショートカットはとても便利である一方、よく忘れるのでそのたびにググりがち。

そんな人は多くの場合
`~/.zprezto/modules/git/alias.zsh` にgitのエイリアスが記述されているので、そこを参照できるようにしておくととても便利。

## .zshrcに追記
```bash
$ vim .zshrc

# zpreztoのgit ショートカットを一覧化
alias zgit='cat ~/.zprezto/modules/git/alias.zsh | grep "alias "'
```

## 使い方

### 特定のコマンドを調べたい
```bash
$ zgit | grep gls

  alias gls='git log --topo-order --stat --pretty=format:"${_git_log_medium_format}"'
```

### すべて見たい

```bash
$ zgit

  alias g='git'
  alias gb='git branch'
  alias gba='git branch --all --verbose'
  ...
  alias gwC='git clean -f'
  alias gwx='git rm -r'
  alias gwX='git rm -rf'
```
pythonでデータベースにselectし、1行でも取得できたかをif文で判断させたいです。

初めてQiitaを利用するので質問の仕方が下手になるかもしれません。
まずはコードを張ります
シンタックスハイライトの使い方が分からなかったので、見づらいです,すいません。


　　#乱数生成
 　　runnum = random.randint(1,10)

    # ＤＢに接続
    connector =psycopg2.connect(host="ec2-54-243-39-245.compute1.amazonaws.com", database="d1ha84jurcr3ff",user="vnlxcgzgpqcbrl",password="32db2fdd39e308d7dee47e7830d1fb7331d6f6968f7624b548d6d16e2bb4af06")
    cursor = connector.cursor()

    #IDが生成した乱数と一致する行を探す
    cursor.execute("select id,namae from konkaimondai where id = %s",(runnum))

　　#kekkaに取得した行を入れる
    kekka = cursor.fetchall()


乱数と同じ数字のＩＤを持つ行が一行もないか確認したいです。
if kekka is None:
などで大丈夫なんでしょうか。
宜しくお願いします。