OmniAICreator/Qiita-1.07M huggingface dataset:
WordPress マルチサイト時のユーザ名制限解除

# 背景
WordPressのマルチサイト機能をONにした際に、ユーザ名の登録制限がかかり、アルファベット小文字と数字のみのユーザ名しか設定できない。
ユーザ認証をActive Directory認証にしている事から、Active Directoryのユーザ名として利用している文字列は登録できるようにしたい。

# 概要

マルチサイトでのユーザ追加時の入力チェック関数 wpmu_validate_user_signup で発生するエラーに WordPressのフィルターフックを設定し、独自ルールにカスタマイズ

- WordPress及びPluginの更新によりカスタマイズが消失しないように、既存ソースの変更は行わない

# 実装
#### プラグインフォルダの作成
WordPressディレクトリのwp-content 内にmu-plugins フォルダを作成
`mkdir wp-content/mu-plugins && chmod 744 wp-content/mu-plugins`

#### フィルターフック用のPHPファイルを作成する
mu-plugins に配置されたPHPファイルは自動的に適用される
`vim wp-content/mu-plugins/multisite-userfilter.php` 

``` ./wp-content/mu-plugins/multisite-userfilter.php
<?php
add_filter('wpmu_validate_user_signup', 'mywp_username_validation');

/* ユーザ名にハイフンを含める為のフィルター */
function mywp_username_validation($result){
    # ユーザ名で小文字＋及び数字のみのエラーが発生している場合は エラーをリセット
    if (isset($result['errors']->errors['user_name']) && ($key = array_search(__('Usernames can only contain lowercase letters (a-z) and numbers.'), $result['errors']->errors['user_name'])) !== false) {
        unset($result['errors']->errors['user_name'][$key]);
        if (empty($result['errors']->errors['user_name'])) unset($result['errors']->errors['user_name']);

        # オリジナル条件でユーザ名をチェック
        # ここではアルファベット（大文字、小文字）、数字、記号（ハイフン、アンダースコア、アットマーク、ドット）を許可
        if ( $user_name != $orig_username || preg_match( '/[^A-Za-z0-9-_@\.]/', $user_name ) ) { 
            $errors->add( 'user_name', __( 'Usernames can only contain Alphabets (A-Z, a-z) and numbers, 4 special caracters (-,_,@,.)' ) );
            $user_name = $orig_username;
        }
    }   
}

?>
```

Active Directoryのユーザ名として一般的に利用しているハイフンだけでもOKでしたが、今後の拡張を考えて、他の記号も追加してみました。

# 参考ページ

- [Wrodpress.org マルチサイト時のユーザー名の文字種制限について](https://ja.wordpress.org/support/topic/%E3%83%9E%E3%83%AB%E3%83%81%E3%82%B5%E3%82%A4%E3%83%88%E6%99%82%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E5%90%8D%E3%81%AE%E6%96%87%E5%AD%97%E7%A8%AE%E5%88%B6%E9%99%90%E3%81%AB%E3%81%A4%E3%81%84/) 
- [wpmu_validate_user_signup関数](https://core.trac.wordpress.org/browser/tags/4.8/src/wp-includes/ms-functions.php#L411)
- [ユーザ作成でのフィルターフック（同じメールアドレスを許可する仕様例 英文）](
https://premium.wpmudev.org/forums/topic/how-can-i-give-a-deleted-user-a-new-signup-chance-in-multisite)
vagrant up が 途中で停止してしまう

vagrant で ubuntu をセットアップしている時に操作をもとめられてしまう事がありました。
おかげで vagrant を途中終了させなくてはならなくなってしました。

```
==> cakephp-box-003: Package configuration┌──────────────────────────┤ Configuring grub-pc ├─────────────────────
─────┐│││ The grub-pc package is being upgraded. This menu allows you to select││ which devices you'd like grub-install to be automatically run for, if││ any
.││││ Running grub-install automatically is recommended in most situations, to  ││ prevent the installed GRUB core image from getting out of sync with GRUB  ││ modules or grub.cfg.││││ If you're unsure which drive is designated as boot drive by your BIOS,    ││ it is often a good idea to install GRUB to all of them.││││ Note: it is possible to install GRUB to partition boot records as well,   ││ and some appropriate partitions are offered here. However, this forces    ││ GRUB to use the blocklist mechanism, which makes it less reliable, and    ││ therefore is not recommended.││││<Ok>☼│││└────────────────────────────
───────────────────────────────────────────────┘
```


vagrant のスクリプトに以下を追加
 
```
export DEBIAN_FRONTEND=noninteractive
```

具体的には、こんな感じにした。

```
export DEBIAN_FRONTEND=noninteractive

info "Add apt-repository for PHP5.6, 7.0, 7.1"
sudo apt-get install -y software-properties-common
sudo add-apt-repository -y ppa:ondrej/php

info "Update OS software"
apt-get update -y
apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" upgrade
```


# 参考
https://qiita.com/furushchev/items/168a53415f16fa0e5f86
Ruby on Railsを使ってクエリを直に書く

# 環境

+ CentOS6.5
+ Rails 5.1.4
+ MySQL 5.7

[RailsでMySQLのテーブル作成](https://qiita.com/shell/items/cc1e66d56b0267c4b4ab)で作成したテーブルを使います。

```
users = User.find_by_sql(['ここにクエリを書く'])
```

例：

```
users = User.find_by_sql(['SELECT id, name FROM users WHERE id BETWEEN ? AND ?', 10, 30])
```
【豆知識】Bluemix付属のGithubでチケット管理

最近知ったことのメモ書き。

BluemixでToolchainの設定を行うと、[https://git.ng.bluemix.net](https://git.ng.bluemix.net)にあるGithubにもユーザー登録がされます。
ここでは、Toolchainと関係なく、独自の新規プロジェクト作成が可能。
ダミーのREADME.mdファイルを作って、最初のコミットをした後、「Issue」のタブを選択すると、ここで簡易的なチケット管理システムが使えます。
他のBluemixユーザーの招待もすぐできますし、添付ファイルがイメージだとサムネイル表示もできて結構便利です。
Keybaseを使って暗号化 git repositoryを作ろう

## private repository欲しいときありますね

- 発表前の研究
- 小説
- プライベートファイル or プロジェクト
- APIキー
- シークレット
- ビジネスドキュメント

gitは便利だしバージョン履歴が残るし、もっと使いたい。
でもGithub private repositoryはお金がかかるし、情報漏洩とか不安。
そう思ったことはないでしょうか。
そこでKeybaseを使いましょう。

> 先日、公開鍵基盤のKeybaseがencrypted gitをローンチしました
> Keybaseアプリを使うと完全に暗号化されたprivate repositoryを作ることができます。

## Keybaseの登録方法

### https://keybase.io/download

作成したアカウントを Github, Twitter, Facebook, Redditなどなどで認証を行う必要があります。
私は[gist](https://gist.github.com/wshino/2044b1ac283be26d908f19c8c9447ec5)で登録しました。

## encrypted git の作り方

### new personal repositoryを選びます

<img width="912" alt="personal-repo.png" src="https://qiita-image-store.s3.amazonaws.com/0/1853/280289b5-e59f-de53-c4c7-e1b85c4f4f30.png">

### repository名を入力する

<img width="912" alt="create-new-repo.png" src="https://qiita-image-store.s3.amazonaws.com/0/1853/303f4b7b-f222-9253-73d5-ab1a9f08feeb.png">

### repository登録完了

<img width="912" alt="repo-has-been-created.png" src="https://qiita-image-store.s3.amazonaws.com/0/1853/314043f8-f40e-0553-cdb7-2c139ce1661b.png">

### git clone

```bash
git clone keybase://private/wshino/mogemoge
```

## encrypted git のいいところ

- 認証がとれたデバイスでしか利用できません。うっかり他の端末からのアクセスを防げます。
- エンドツーエンドで暗号化されています。中間経路で悪さができません。
- リポジトリ名やブランチ名も暗号化されています。Keybaseサーバー側もレポジトリ名を知りません。
- pushしたデータはデバイスが持つ秘密鍵で署名されています。もし、ハッキングで盗まれても秘密鍵がないと復元できません。

## encrypted git の残念なところ

- 今はGUIツールがありません。GUIが欲しい人は好きなクライアントを使いましょう。
  - Github Desktop
  - SourceTree
  - IntelliJ
- PRとかissueもない。

## 既存のgitをencryptedにする方法

```
# 1. make the encrypted remote repo
keybase git create sbt-rpm

# 2. get your old stuff into a temp directory
git clone --mirror https://github.com/wshino/sbt-rpm _tmp.git

# 3. head north of the wall
cd _tmp.git

# 4. push onward, to Craster's keep
git push --mirror keybase://private/wshino/sbt-rpm

# 5. back to Winterfell; kill some boltons
cd .. && rm -rf _tmp.git

# 6. DONE. You can clone anywhere and find this repo in the Keybase app
git clone keybase://private/wshino/sbt-rpm
```

---

Keybaseにはチャットツールが付いているので議論は便利かもしれません。

## その他

- 容量のリミットは1アカウント100GB
- 1チームごとにも100GB
- commitに署名はしていない
Ruby on Railsを使っての基本的なデータ取得を学ぶ

RubyOnRailsの基本的なデータ取得方法をまとめます。

# 環境

+ CentOS6.5
+ Rails 5.1.4
+ MySQL 5.7

[RailsでMySQLのテーブル作成](https://qiita.com/shell/items/cc1e66d56b0267c4b4ab)で作成したテーブルを使います。

# 全件取得

```
users = User.all
```

# 条件付き

## id = 1

```
users = User.where("id = ?", 1)
```

プライマリキーを条件に使う場合はこのようにも書ける

```
users = User.find(1)
```

上の場合は何件返ってくるかわからない。下の場合はプライマリキー用の取得方法なので最大１件返ってくる。

## id > 5 かつ id < 10

```
users = User.where("id > ? and id < ?", 5, 10)
```

# 指定したカラムのみ取得

```
users = User.select('id, age')
```

# Group by

```
users = User.select('age, count(*) as count').group('age')
```

# Group by having

```
users = User.select('age, count(*) as count').group('age').having('count > ?', 50)
```

# Limit（取得件数上限）

```
users = User.select('id, age').limit(10)
```

# Order by

## ASC（昇順）

```
users = User.limit(10).order('id')
```

## DESC（降順）

```
users = User.limit(10).order('id DESC')
```
BigDecimalの使い方

小数を扱うコードを作成していて、色々と嵌ったのでそのときのメモ。

# 起きたこと
小数の値を除算する必要があったので、以下のようにBigDecimalを利用して除算するコードを書いた。

```java
public class Divide {
	public static void main(String[] args) {
		BigDecimal num1 = new BigDecimal(1.1);
		BigDecimal num2 = new BigDecimal(100);

		System.out.println(num1.divide(num2));
	}
}
```
1.1÷100なので、結果は0.011になるはずだが、実行してみると「0.01100000000000000088817841970012523233890533447265625」と出力される。
なんでやねん、と思ったが使い方が悪かった。

# 何が起きていたのか
BigDecimalを生成するときに1.1を引数にしているが、こいつがすでに誤差を含んでいるらしい。
10進数小数を2進数小数で表すため、そもそも表現できない値がある。考えてみれば当たり前だ。。。
1.1はその表現できない値であるため、それをもとにBigDecimalを生成すると、その誤差まで保持してしまう。

# どうすればいいのか
以下のように、doubleやfloatの値を利用しないようにする。

```java
public class Divide {
	public static void main(String[] args) {
		BigDecimal num1 = new BigDecimal("1.1");
		BigDecimal num2 = new BigDecimal("100");

		System.out.println(num1.divide(num2));
	}
}
```
こうすれば、正確な計算が行われる。
それなら、BigDecimalにdoubleを引数とするコンストラクタは必要なのか・・・？

# さらに嵌ったこと
以下のように割り切れない値を計算するとArithmeticExceptionが発生する。

```java
public class Divide {
	public static void main(String[] args) {
		BigDecimal num1 = new BigDecimal("1.1");
		BigDecimal num2 = new BigDecimal("3");

		System.out.println(num1.divide(num2));
	}
}
```
BigDecimalのdivideメソッドはデフォルトだと割り切れない場合、例外を発生させるらしい。
そのため、以下のように桁数と丸め方を指定して利用する。

```java
public class Divide {
	public static void main(String[] args) {
		BigDecimal num1 = new BigDecimal("1.1");
		BigDecimal num2 = new BigDecimal("3");

		System.out.println(num1.divide(num2,2,RoundingMode.FLOOR));
	}
}
```
vue-cli用のテンプレート作ってみた

# 作成背景
- アイディアからすぐにプロトタイププロジェクトを作成できるようにしたかった
- 都合のよいパッケージ組み合わせを一発で立ち上げたかった
- 公式テンプレートの問い合わせ（vue init時の問い合わせ）をカットしたかった

※すべての問い合わせを削除する方法がわからない・・できないのか？

# テンプレートベース
- 公式のwebpackテンプレート[vuejs-templates/webpack](https://github.com/vuejs-templates/webpack)

# 前提
```
$ npm install -g vue-cli
```

# テンプレート１
![vue-vuex-pug-bootstrap-stylus.png](https://qiita-image-store.s3.amazonaws.com/0/38275/14134d99-156e-db09-50b0-a610e51fb1d9.png)
https://github.com/yoko0180/vue-vuex-pug-element-stylus

## 変更点
- Pug導入
- Stylus導入
- Bootstrap導入
- Vuex導入
- lint関連削除
- e2e関連削除
- unitテスト関連削除
- build後のfile://～index.htmlでも動作するように変更

## 起動手順
```
$ vue init yoko0180/vue-vuex-pug-bootstrap-stylus my-project
$ cd my-project
$ npm install
$ npm run dev
```

## 起動画面
![vue-vuex-pug-bootstrap-stylus.png](https://qiita-image-store.s3.amazonaws.com/0/38275/0b0853a3-4686-ef4c-a166-880ac537650e.png)


# テンプレート２
![vue-vuex-pug-element-stylus.png](https://qiita-image-store.s3.amazonaws.com/0/38275/8f77983f-1bff-9307-4b93-0d47d6175943.png)
https://github.com/yoko0180/vue-vuex-pug-element-stylus

## 変更点
- テンプレート１のBootstrapをElementUIに置き換え

## 起動手順
```
$ vue init yoko0180/vue-vuex-pug-element-stylus my-project
$ cd my-project
$ npm install
$ npm run dev
```

## 起動画面
![vue-vuex-pug-element-stylus.png](https://qiita-image-store.s3.amazonaws.com/0/38275/bbb95f5f-f830-38e7-bbec-139431fcd392.png)


# （参考）
- [vue-cli用のテンプレートを作成する - Qiita](https://qiita.com/nakajmg/items/806b50ddd474dd7ecb4f)
- [VuejsのコンポーネントライブラリElementUIを使ってみた - Qiita](https://qiita.com/naoki0531/items/0fe96c21cdb62751d6c6)


# おわりに
テンプレート内の条件分岐は可読性が下がるのでできるだけ使いたくないと考えてテンプレート自体を別にしたが考えどころ・・・
Rails + faker でダミーデータ作成

Railsで学習する時にダミーデータが必要かなと思った調べたのでまとめます。


# 環境

+ CentOS6.5
+ Rails 5.1.4
+ MySQL 5.7

# Faker取得

Gemfileに

```
gem 'faker'
```

を追記し　bundle installする。

```
$ gem list | grep faker
faker (1.8.4)
```

でfakerが入っていることを確認する。

[RailsでMySQLのテーブル作成](https://qiita.com/shell/items/cc1e66d56b0267c4b4ab)で作成したテーブルを使います。

# seed.rbにダミーデータ作成処理を作る

```
$ vi db/seed.rb

↓をコピペする

100.times do
     User.create(
        name: Faker::Name.first_name,
        uuid: Faker::Internet.password,
        age: rand(0..100)
      )
end
```

これは、Usersテーブルに１００個ダミーデータを作成しますという処理になります。

# テーブルに反映する

```
$ rails db:seed
```

これで完了です。
オフラインリアルタイムどう書くE18の問題


オフラインでリアルタイムに「どう書く」をやるイベント( https://yhpg.doorkeeper.jp/events/64726 )を行っています。

問題は「ドット直角三角形の共通部分」という名前で、詳細は
http://nabetani.sakura.ne.jp/hena/orde18twintri/
です。

出題者の気分としては、問題を読み始めてから解けるまで1時間あればなんとかなると思ってますが、ひとそれぞれで。

実装ができた方はこちらのコメント欄からリンクを張っていただくと見つけやすくて助かります。

似たような問題をもっと解きたいという方は、
https://nabetani.hatenadiary.com/entry/yhpg_list
に過去問リンク集がありますので、そちらをご覧になると良いと思います。
RailsでMySQLのテーブル作成

Railsでテーブルを作成する方法をまとめました。

#環境

+ CentOS6.5
+ Rails 5.1.4
+ MySQL 5.7

＊ここからはRails環境、MySQLが使えるという前提で説明していきます。

# 基本

Usersというテーブルを作ってみます。

カラムは

+ uuid (データ型：string)
+ name (データ型：string)
+ age (データ型：integer)

## Railsコマンドでマイグレーションファイルを作成

```
$ rails g model User uuid:string name:string age:integer
invoke  active_record
create    db/migrate/20171007062120_create_users.rb
create    app/models/user.rb
invoke    test_unit
create      test/models/user_test.rb
create      test/fixtures/users.yml
```

コマンドの意味を説明します。

User = テーブル名の単数形（実際にはUsersというテーブルが作成される。仮にここに「Users」と入れると怒られる。でもUsersっていうテーブルを作るのね、って解釈される）

uuid:string = カラム名：データ型　という関係


色々作成されましたね。ここで重要なのはマイグレーションファイルである db/migrate/20171007062120_create_users.rb ですのでちょっと覗いてみましょう。

```
$ cat db/migrate/20171007062120_create_users.rb
class CreateUsers < ActiveRecord::Migration[5.1]
  def change
    create_table :users do |t|
      t.string :uuid
      t.string :name
      t.integer :age

      t.timestamps
    end
  end
end
```

こんな感じになってるはずです。create_tableでusersっていうテーブル作るんだな。カラムはuuid、name、ageとかなんだなっていうのがなんとなくわかるはずです。


## RailsコマンドでマイグレーションファイルをDBに反映

先ほど作成したマイグレーションファイルを

```
rails db:migrate
== 20171007062120 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0410s
== 20171007062120 CreateUsers: migrated (0.0411s) =============================
```

これでテーブルが作成されているはずです。
OpenStreetMapのデータでルート検索を行うroutinoを、Ver.3.2にアップデートしてみた。

# はじめに

AWS EC2 で動作している Ubuntu-16.04LTS上の、routino-3.1 を、routeino-3.2 に更新します。更新といっても、一式をダウンロード／makeなので、実質的に再インストールです。

この記事は、以前の「[ルート検索routinoをインストールする][link-1]」の続編です。
[link-1]:http://qiita.com/drafts/c686397e4a0f4f11683

# routine-3.2 のインストール

## 環境

Ubuntu 16.04LTS 
Apache/2.4.18 (Ubuntu)

## アップデート

念のためパッケージ類のアップデート

```
$ sudo apt-get update 
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade
```

## Routinre-3.2のダウンロード＆make

既に必要なパッケージはインストールずみなので make 一発です。

```
$ wget http://www.routino.org/download/routino-3.2.tgz
$ tar xvfz routino-3.2.tgz
$ cd routino-3.2/
$ make
```

（参考）SVNから最新のソースが取得できるようです。

```
$ svn co http://routino.org/svn/trunk routino
```

## Web配置とパーミッション変更

```
$ sudo cp -a web /var/www/routino-3.2
$ sudo chown -R www-data:www-data /var/www/routino-3.2
```

## leaflet/OpenLayersのインストール。

いずれも地図表示用ライブラリで、Webページ上で動作確認するには必要です。

### leaflet

レガシー版の 0.7.7 が入ります。

```
$ cd /var/www/routino-3.2/www/leaflet/
$ sudo -u www-data install.sh
```

### OpenLayers

OpenLayers が github から配布されるようになっていたので、install.sh を編集してから実行します。

```
$ cd /var/www/routino-3.2/www/openlayes/
$ vi install.sh
---
(変更箇所)
#wget http://openlayers.org/download/OpenLayers-$version.tar.gz    # コメントアウト
wget https://github.com/openlayers/ol2/releases/download/release-2.13.1/OpenLayers-2.13.1.tar.gz
---
$ sudo -u www-data install.sh
```

## 地図データ準備とパラメータ設定

以前の記事の、[OpenStreetMap データダウンロード＆データ変換][link-2]、及び
[地図パラメータ設定][link-3]のとおり設定。


[link-2]:https://qiita.com/yasushi00/items/f4eb5d126dbeff905909#openstreetmap-%E3%83%87%E3%83%BC%E3%82%BF%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%83%87%E3%83%BC%E3%82%BF%E5%A4%89%E6%8F%9B
[link-3]:https://qiita.com/yasushi00/items/f4eb5d126dbeff905909#%E5%9C%B0%E5%9B%B3%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E8%A8%AD%E5%AE%9A

## apacheの設定

基本設定はできているので、元のバージョンに簡単にもどせるよう、シンボリックリンクで変更

```
# cd /var/www/
# sudo mv routino routino-3.1.1
# sodo ln -s routino-3.2 routino
```
　
# 動作確認

ブラウザでアクセスし本家( http://www.routino.org/uk/ ) と同様の画面で、日本地図表示されルート検索できることを確認。今まで動作していたなら特につまずくこともないでしょう。

# 参考

* https://qiita.com/yasushi00/items/f4eb5d126dbeff905909
* https://www.openstreetmap.org/
* http://www.routino.org/
* http://leafletjs.com/
* http://openlayers.org/
Windows10 64bit環境でPythonとpipを使えるようにする

# Windows10 64bit機にAnacondaでPythonを入れる。  
Anacondaの公式ページからWidows 64bit版のインストーラを使ってPython、Numpy、Scipy、Pandas、iPython、Spyder、Jupyterなどデータ分析で必要なパッケージを一括でインストール。今までAnaconda以外の方法でやろうとしてとても躓きが多かったけど、Windows10にAnacondaでPythonを設定する方法はノンプログラマの自分にも簡単に出来ました。

#Windows PowerShell上でpipを使えるようにする。
「設定」から「環境変数を編集」を検索。ユーザー環境変数の「Path」を選択・編集し、次の二つのPathを追加する。(ユーザー名の所だけ各環境に合わせて書き換えてください。ここではhrst)

* まずPythonやiPythonなどのコマンドを使えるようにするために次のPathを追加。

> C:\Users\hrst\AppData\Local\Continuum\Anaconda3

* その後pipを使えるようにするために次のPathを追加。

> C:\Users\hrst\AppData\Local\Continuum\Anaconda3\Scripts

以上の二つのPathを追加すればコマンドプロンプトやPowerShell上でPython系のコマンドが使えるようになります。
IntelliJ IDEA での自動ビルド設定

# はじめに
* 当記事は下記の環境にて動作を確認しています。  
 1. IntelliJ IDEA Community 2017.2

---

# 結論
下記箇所にチェックを入れてください。
File > Settings... > Build, Execution, Development > compiler
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/c7739b16-c6b3-6721-7564-f18519a3324a.png)

---

# 参考URL

[Intellij IDEA Java classes not auto compiling on save](https://stackoverflow.com/questions/12744303/intellij-idea-java-classes-not-auto-compiling-on-save)
Ubuntuのポート開放方法（ファイアウォールを設定する）

pythonでsocketを使っていたときに少し躓いたので、メモを残しておく。
# とりあえずポートを開放する
## 現在の状態を確認

```bash
$ sudo ufw status
```

```
Status: active

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere
22 (v6)                    ALLOW       Anywhere (v6)
```

この例だと、22番ポート（ssh）しか通らない。
apacheを使いたい場合など、80番ポートを開けたいときには、以下のようにする。

```bash
$ sudo ufw allow 80
$ sudo ufw reload
$ sudo ufw status
```

```
Status: active

To                         Action      From
--                         ------      ----
22                         ALLOW       Anywhere
22 (v6)                    ALLOW       Anywhere (v6)
80                         ALLOW       Anywhere
80 (v6)                    ALLOW       Anywhere (v6)
```

80番ポートが開いた。これで無事にapacheのスタートページが見られるようになる。
# その他便利なコマンド
システムでファイアーウォールを有効/無効にする。

```bash
$ sudo ufw enable
$ sudo ufw disable
```

すべてのポートを閉じる/開く。

```bash
$ sudo ufw default DENY
$ sudo ufw default ALLOW
```

下手に全ポートを閉じたらsshから作業できなくなるので、
実機を直接いじれる場合にだけ試すこと。
python　音声(wav)を読み込み、波形を出力

#初めに
友達に頼まれて音声からノイズを除去することになりました。
その第一段階として今回は音声を読み込み波形を出力しました。

python、信号処理の知識はあまりないので、アドバイスなどいただけると助かります。

今回はlibrosaというものを使用しています。
librosaのインストール方法は
[自由研究の準備（その１０）pythonライブラリのlibrosaで音楽を解析します](http://np2lkoo.hatenablog.com/entry/2016/09/22/052354)
を参考にいたしました
#つまずいたところ
[Pythonでmp3の波形を描く](https://qiita.com/tackey/items/225fdb5f07f2033377fa)
を参考にさせていただいたのですが、librosa.displayの部分がうまく動作せず、別の方法で描画をしました。

また、フィルタをかける音声信号が48分とデータ数が多くてmatplotlibでOverflowErrorが出てしまいました。
(解決策は[matplotlibでOverflowError: In draw_path: Exceeded cell block limitというエラーが出る](http://accent.hatenablog.jp/entry/2016/10/13/174310)を参考にしました)
#コード

```python:test.py
import sys
import librosa
import matplotlib.pyplot as plt
import numpy as np
import matplotlib as mpl

args = sys.argv
filename = args[1]

y,sr=librosa.load(filename)#音声ファイルの読み込み
print("loaded")
totaltime = len(y)/sr#動画の時間(秒)
time = np.arange(0, totaltime, 1/sr)#時間の配列を作成
mpl.rcParams["agg.path.chunksize"]=100000#データ数が多く、overflowErrorが出た場合これを入れるといいみたいです
plt.plot(time,y)
plt.show()
```
コマンドライン引数でファイル名を取得できるようにしています。

#結果
![Figure_1.png](https://qiita-image-store.s3.amazonaws.com/0/184254/a22ca5e9-0f50-145c-4dd8-37067cbc338f.png)

横軸は時間[秒]ですが、48分のデータでデータ量が多いため、波形がつぶれています。

#今後の予定
この波形データをフーリエ変換し、ノイズの周波数を求めフィルターをかけたいと思っています。
中学生時代につかっていたチートシート(~/myhelp/*.txt)

HDD掃除してたら見つけてﾌﾌｯと笑ってしまったので載せてみる

```bash:docker
info ホストの情報
version バージョン情報
pull [イメージ名:タグ名] イメージをhubからダウンロード
images ローカルにダウンロード済みのイメージ
run [--name コンテナ名] [イメージ名:タグ名] [-it 入力を開く] [-d バッググラウンド] [-p ホストのポート:コンテナのポート ]
ps [-a 停止中も] コンテナ一覧
commit [コンテナー名またはコンテナID] [ユーザー名(任意)/イメージ名]
stop [コンテナ名またはコンテナID]
rm [コンテナ名またはコンテナID]　コンテナ削除
rmi [イメージ名またはイメージID]　イメージ削除
start [イメージ名またはコンテナID] 停止したコンテナを再実行
build [-t イメージ名:タグ名] .
        dockerfileからイメージ作成


dockerfile
        ｛命令｝        用途
        FROM                            元となるDockerイメージの指定
        MAINTAINER      作成者の情報
        RUN                                     コマンドの実行
        ADD                                     ファイル／ディレクトリの追加
        CMD                                     コンテナーの実行コマンド 1(run上書き可能)
        ENTRYPOINT      コンテナーの実行コマンド 2(run上書き不可)
        WORKDIR                 作業ディレクトリの指定
        ENV                                     環境変数の指定
        USER                            実行ユーザーの指定
        EXPOSE                  ポートのエクスポート
        VOLUME                  ボリュームのマウント
```

```sql:mysql
CREATE USER 'ユーザー名'@'localhost' IDENTIFIED BY 'パスワード'; ユーザー作成
DROP USER 'ユーザー名'@'localhost';ユーザー削除
GRANT ALL ON db.* TO user; 権限設定
GRANT ALL privileges ON db.* TO user1@"192.168.3.%" identified by 'パスワード' with grant option; 外部からでもアクセス許可

CREATE DATABASE db; データベース作成
SHOW DATABASES; データベース一覧
SHOW TABLES FROM db ; テーブル一覧
CREATE TABLE db.table(カラム名 型,カラム名 型); テーブル作成
ALTER TABLE db.table ADD (カラム名 型,カラム名 型...);カラム追加
ALTER TABLE db.table DROP カラム名;カラム削除
ALTER TABLE db.table MODIFY カラム名 型;
DROP TABLE db.table;//テーブルさ駆除
SELECT Host, User, Password FROM mysql.user; ユーザー一覧
|=カラムの型===============|
|       型          |内容  |
|--------------------------|
|   int             |数字  |
|   varchar(文字数) |文字列|
|==========================|
INSERT INTO db.table (カラム名,カラム名...)  VALUES (データ,データ...); データ挿入
SELECT * FROM db.table WHERE カラム名 LIKE '値'; 読み出し
UPDATE db.table SET 変更するカラム = 値 WHERE  指定カラム = 値;
DELETE FROM db.table WHERE k = d;
```

```php:php-mysql
$link = mysql_connect('mysqlサーバーアドレス', 'ユーザー', 'パスワード'); mysqlに接続
if (!$link) {
    die('接続失敗です。'.mysql_error());
}

$db_selected = mysql_select_db('データベース名', $link);
if (!$db_selected){
    die('データベース選択失敗です。'.mysql_
}

$result = mysql_query('SQL文セミコロンなし')
if (!$result) {
    die('クエリーが失敗しました。'.mysql_er
}

mysql_close($link); mysql切断

暗号化
function pass($arg){
  $pass = MD5($arg);//まずMD5しときます
  $pass2 = sha1($pass);
  $pass3 = '21'.$pass2.'43'.$pass;
  $pass4 = hash('sha256',$pass3);
  $pass5 = MD5($pass4);
  $pass6 = sha1($pass5);
  $pass7 = hash('sha256',$pass6);
}
```

```bash:wget
    $ wget -O - --post-file=login.txt --save-cookies=cookie.txt --keep-session-cookies

wget -O - --load-cookies=cookie.txt


wget -O - --save-cookies=cookie.txt --keep-session-cookies
wget -O - --load-cookies=cookie.txt

--post-data="a=1&b=2"
```
マップ移動中だけHP・MP増減効果をキャンセルする方法

MVでは毎ターンHP・MP増減させる装備を作成できるが、実はあれは戦闘中だけでなく、マップ移動中にも適用されてしまう。

戦闘中だけで良いという場合は、以下のコードを自作プラグインなどにぶちこもう。

```
  Game_Actor.prototype.turnEndOnMap = function() {};
```
ScrollViewのデフォルト位置を常時１番下にする

# やりたいこと
- ScrollView内のコンテンツの一番下にアイテムが追加された時、一番下にスクロールバーを下げたい。

- コマンドライン風UI作ってる時にコマンドラインって画面が常時一番下にスクロールした状態になるのでこれがやりたかった。

### こんな感じ
![ConsoleTest.gif](https://qiita-image-store.s3.amazonaws.com/0/143871/f11e767a-8f73-9af9-6e6c-ff8cc67521bf.gif)


# やりかた
ScrollRect.verticalNormalizedPositionってパラメータをいじる

- 0だと一番下
- 1だと一番上

こんな感じの構成で
<img width="344" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/143871/6590cef0-5a23-e9b0-4c40-4f5393e47e1b.png">

ScrollView/ViewPort/Textを今回ScrollRectのContentに設定してる。<img width="426" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/143871/4e9102d1-6236-09c2-fba8-8f04de1f39e3.png">

テキストにはContentSizeFilterをaddして
vertical FitをPrefferred Sizeにすることで自動で高さ調整
<img width="438" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/143871/08f8dd44-de34-6f21-48ec-512b4ab47578.png">

InputFieldにConsoleTextCoreをaddしてOnEndEditでConsoleTextCore.OnInputを呼ぶようにする。
<img width="426" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/143871/64c420bb-1279-c558-45ec-1104729113fb.png">


```csharp:ConsoleTextCore

public class ConsoleTextCore : MonoBehaviour
{
	private InputField _inputField;
	public Text ConsoleText;
	public ScrollRect ScrollRect;
	
	// Use this for initialization
	void Start ()
	{
		_inputField = GetComponent<InputField>();
		InitInputField();
	}
	
	// Update is called once per frame
	void Update () {
		
	}

	public void OnInput()
	{
		string inputValue = _inputField.text;
		WriteConsole(inputValue);
		InitInputField();
	}

	void WriteConsole(string text)
	{
		ConsoleText.text += "\n" + text;
	}
	
	
	
	void InitInputField() {
 
		// 値をリセット
		_inputField.text = "";
 
		
		// フォーカス
		_inputField.ActivateInputField();
 
		ScrollRect.verticalNormalizedPosition = 0; //ここでスクロールを一番下にする
	}
}

```


inputfieldが入力されたらOnInput()が呼ばれ、上のコンソール風にしたテキストに表示され、一番下にスクロールするようにした。

# 問題点
[この方がおっしゃられているのですが](http://koroworks.jp/2017/02/05/unity-%E3%82%B9%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AE%E3%82%B9%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB%E3%82%92%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%8B/)これをやってもなぜか一番下にならず微妙に余った状態になってしまう。

### こんな感じでスクロールバーが下に行かない

![ConsoleTest2.gif](https://qiita-image-store.s3.amazonaws.com/0/143871/aa85129a-3a6c-9cbd-c26a-60ab04e43f27.gif)


よく見てみると更新された高さ分余ってる。
これscrollviewがコンテンツの高さ更新を認識してないのかなと思ったが、そもそも高さが更新されるのがポジションをいじるのより遅いんじゃねって考えた。
要はConsoleText.textにstring足すだけだとContentSizeFilterがその変更を反映してないときにポジション変更呼んじゃってるんじゃないかと。
なのでなんか高さ更新的なメソッド無いかなぁって探したら
` ContentSizeFilter.SetLayoutVertical()`ってのがあった。
めっちゃそれっぽい。
とりあえず呼んでみた。

```csharp
public void WriteConsole(string text)
	{
		ConsoleText.text += "\n" + text;
		ConsoleText.GetComponent<ContentSizeFitter>().SetLayoutVertical();//<-これ追加
	}

```


**動いた！!（再掲）**
![ConsoleTest.gif](https://qiita-image-store.s3.amazonaws.com/0/143871/f11e767a-8f73-9af9-6e6c-ff8cc67521bf.gif)
この方法があってるかわからんけど明示的に高さ更新されたよって教えてあげるとなんかうまくいった。
間違ってたらすいません。今回の場合はうまくいきました。

# まとめ
1. コンテントにアイテムとか追加して高さを変える
2. ContentSizeFitter.SetLayoutVertical()を呼んで明示的に高さを更新してあげる
3. ScrollRect.verticalNormalizedPosition = 0（一番下にスクロール位置をもってく場合）と変更する。

以上!
navigation bar の右側に storyboard を使わずに2つボタンを置く


# まとめ
UIButtonItem を2つ作って`self.navigationItem.rightBarButtonItems`
に配列で渡すだけ。
メソッドは別で用意してください。

#サンプルコード
        let refleshButtonItem = UIBarButtonItem(
            barButtonSystemItem: UIBarButtonSystemItem.refresh,
            target: self,
            action: "onClickNavBarRefleshButton"
        )
        
        let addButtonItem = UIBarButtonItem(
            barButtonSystemItem: UIBarButtonSystemItem.add,
            target: self,
            action: "onClickNavBarAddButton"
        )
        self.navigationItem.rightBarButtonItems = [refleshButtonItem,prizeButtonItem]
Jupyter > 変数の初期化 > del 変数 | %reset

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
```

Jupyter上での失敗。

```py
#vor = Voronoi(points)

#以下でvorを使った処理
```
vorへの代入をコメントアウトしてしまい、それでも動作していた。
以前vorへ代入したものがJupyterでは記憶されているため。

対処法として変数の削除が考えられる。

参考: https://stackoverflow.com/questions/22934204/how-to-clear-variables-in-ipython


### del vor

```py
vor = 1
del vor
print(vor)
```

```txt:run
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-73-76b2d61c664a> in <module>()
      1 vor = 1
      2 del vor
----> 3 print(vor)

NameError: name 'vor' is not defined
```

きちんとエラーが出た。

### %reset

```py
vor = 1
%reset
print(vor)
```

実行後、以下のように質問される。y+[Enter]を入力するまで実行されない。

> Once deleted, variables cannot be recovered. Proceed (y/[n])?
Terraformのresource名を変更





### Terraformのresource名を変更
Terraform v0.10.7でのやり方を簡単にご紹介。

terraform.tfstateを直接編集行するよりも安全かつ正しい手順のようです。

hogeをfugaに変更したいとき。

#### 1 .tfを編集

```
resource "aws_instance" "hoge" {
}
```

↓

```
resource "aws_instance" "fuga" {
}
```

#### 2 terraform state mv

```
$ terraform state mv aws_instance.hoge aws_instance.fuga
```

#### 3 terraform plan
```
$ terraform plan
```
差分がなければ :ok:


### 参考
- https://www.terraform.io/docs/commands/state/mv.html#example-rename-a-resource
Mac OS High Sierra(10.13)でエミュレータが起動しない問題をとりあえず解決する方法

# 概要
* Mac OS High Sierra(10.13)でエミュレータが起動しない問題が起きたのですが、API
 Level26であれば解消できたのでその方法の共有です

# 問題の内容
* AVD ManagerでHAXMをインストールしようとすると以下のエラーが出て失敗します。

```
Running Intel® HAXM installer

HAXM silent installation only supports macOS from 10.8 to 10.12 !

Done
```
なんてこった...

# 解決方法
[issuetracker](https://issuetracker.google.com/issues/62395878)に書いてある方法で解決しました。

```
Try running the emulator on Canary channel 26.1.x (API 25/26 recommended) with Hypervisor.Framework; 
put the text "HVF = on" in ~/.android/advancedFeatures.ini 
(create this file if it doesn't exist already).
```

# やったこと
* Android Emulatorは最新版をインストール
* ~/.android/advancedFeatures.iniを作成

```
$ cat ~/.android/advancedFeatures.ini
HVF = ON
```
* AVD Managerを開いてエミュレータを作成する
    * system imageはAPI Levelが26のものを選ぶ
* 成功

# 解決できていないこと
* API Levelが25以下だと起動しないです...

```
failed to initialize HAX: Operation not supported by device
```
* 解消できる方法があれば教えてくださいmm
Perlの備忘録

### 配列をシャッフルする。結果は毎回異なる。
```lang:Perl
use List::Util;
@shuffled = List::Util::shuffle @data;
```

### コマンド引数の数を $#ARGV で取得する。実際のコマンド引数よりも1だけ小さい値が格納されている。
```lang:Bash
$ cat number_of_command_arguments.pl 
#!/usr/bin/env perl
print "$#ARGV\n"
$ ./number_of_command_arguments.pl first second third fourth fifth
4
```

### dbmファイルを作成、およびそれを読み込む。
```lang:Perl
#!/usr/bin/env perl
use English;
use DB_File;
use Fcntl;
my $file_name = 'data.dbm';
my %data;
tie %data, 'DB_File', $file_name, O_CREAT|O_RDWR, 0644, $DB_HASH or die "$OS_ERROR (creating): $file_name";
$data{'key1'} = 'value1';
untie %data;
my %retrieval;
tie %retrieval, 'DB_File', $file_name, O_RDONLY, 0644, $DB_HASH or die "$OS_ERROR (opening): $file_name";
print "$retrieval{'key1'}\n";
untie %retrieval;
exit
```
Terminal作業をちょっと楽にした話 with zsh

最近Terminal上で作業することが増え，デフォルトのbash/zshでは作業効率が悪かったので，ちょっとだけTerminal環境を構築しました．これだけでかなり効率上がったんで，素bash/zshを使ってる人は是非やってみてください．

## [prezto](https://github.com/sorin-ionescu/prezto)
Zshのconfiguration framework（便利な機能をパッといれてくれるもの）です．
auto-completeやsyntax-highlighting，カッコイイpromptなどを一気に入れてくれます．これを入れるだけで随分作業が楽になります．とりあえず入れとけばいいと思います．

![](https://camo.githubusercontent.com/6c95dcd9dc8219ab4a256f6b7463bf417c7dc67a/68747470733a2f2f7261772e6769746875622e636f6d2f64617669646a726963652f7072657a746f5f706f7765726c696e652f6d61737465722f70726f6d70742e706e67)

参考
[zshでpreztoを使う手順](https://qiita.com/tukiyo3/items/2c3b3a5f53ebcb83cffc)
[pezto_powerline](https://github.com/davidjrice/prezto_powerline)

## [enhancd](https://github.com/b4b4r07/enhancd)
`cd`コマンドの拡張です．ディレクトリ移動をめっちゃ簡単にしてくれます．
directoryのfuzzy searchなどを実装しているので，`cd test`ってするだけで`test`をfuzzy searchして複数候補をリストしてくれます．その他にも

+ `cd` : 訪れたdirectoryの履歴を表示・選択できる．めっちゃ便利．
+ `cd -` : 訪れた**直近10件**のdirectoryを表示・選択できる． なかなか便利．
+ `cd ..` : parent directoryを再帰的に表示・選択してくれる．とても便利．

お気に入りは`cd`で，後述する`peco`とあわせることで自分がどこにいても飛びたいdirectoryをincremental searchしてくれます．

![](https://raw.githubusercontent.com/b4b4r07/screenshots/master/enhancd/demo.gif)

参考
[ターミナルのディレクトリ移動を高速化する](https://qiita.com/b4b4r07/items/2cf90da00a4c2c7b7e60)

## [peco](https://github.com/peco/peco)
`peco`はインタラクティブにCLをフィルタリングできるツールです．(`ps aux`などの結果を絞り込んだりしてくれます）
さらにそこにcommand historyを組み合わせることで，一度打ったコマンドを素早くincremental searchしてくれます．
例えば`ansible-playbool my_task.yml --connection=local -vvvv --check`とかめっちゃ長いコマンドでも`ans my task`と打てば一発です．楽ちん

![](https://camo.githubusercontent.com/715a08103573b9eeed2542be00af526a31bec263/687474703a2f2f7065636f2e6769746875622e696f2f696d616765732f7065636f2d64656d6f2d6d756c7469706c652d717565726965732e676966)

参考
[pecoをインストールして、zshのhistoryを軽快に検索](https://qiita.com/kp_ohnishi/items/3009e2083831af3a7c5c)

## [auto_cd](http://zsh.sourceforge.net/Doc/Release/Options.html)
directoryを移動したあとは`ls`を打つ人が多いと思いますが，これを設定すると`cd`するだけで`ls`を自動実行してくれます．

```shell
setopt auto_cd
function chpwd() { ls }
```

をzshrcに追記することで実現できます．細かいけど便利．

![Untitled3.gif](https://qiita-image-store.s3.amazonaws.com/0/144707/19932d4a-2cf7-f196-3fba-200345e55261.gif)

## [zsh-notify](https://github.com/marzocchi/zsh-notify)
実行時間の長いコマンド(ex. brew install, rspec, vagrant up etc)などの終了をデスクトップに通知として飛ばしてくれます．
とりあえずコマンド打って，別の作業してnotificationが来たらまたterminalに戻って....っていう作業がちょっと楽になります．

<img width="417" alt="Screen Shot 2017-10-07 at 5.06.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/144707/13227478-e8bb-0e8c-ee47-f498e1d7ebcf.png">
iOSアプリからWalletの特定のPassを表示する

##はじめに
「アプリからWalletの特定のPassを表示する」ということがあったので、
その手順をまとめます。
アプリからといってもURLSchemeでWalletを開くだけですが...

##アプリからWalletのPass一覧を取得する
まずはWalletからPass一覧を取得します。
Wallet Developer Guideには以下のように書いてあります。
>PKPassLibraryクラスのpassesメソッドで、アプリケーションがアクセス可能なパスをすべて取得できます。

アプリーケーションがアクセス可能なパスとは、**Pass Type IDs**がアプリとPassで一致しているものになります。
Pass Type IDsはentitlementsファイルに記述します。
![スクリーンショット 2017-10-07 10.40.37.png](https://qiita-image-store.s3.amazonaws.com/0/121288/b7b7fba5-3208-355c-ee41-04945047fa63.png)

debugとReleaseでPassを分けている場合はentitlementsファイルをそれぞれの環境に合わせたものを作成する必要があります。
ビルド毎のentitlementsファイルの設定はTARGETS→Build Settings→Code Signing Entitlementsで確認できます。

Pass Type IDsを一致させたらGuideに従ってPKPassLibraryクラスのpassesメソッドでPassの一覧が取得できます。

##アプリからWalletの特定のPassを開く
Passの一覧が取得できたら後は簡単です。
PKPassクラスのpassURLで取得したURLをURLSchemeで呼び出します。

Walletが立ち上がり、指定したPassが表示することができます。
WebサイトをWindows 10のタイルに対応させる【Webサイトのピン留め】

# ■ はじめに
自分のWebサイトがWindows 10等でスタートメニューにピン留めされたとき、Webページタイルに独自のアイコンを表示する方法。

# ■ 用意するもの

* browserconfig.xml
* 70 x 70の画像
* 150 x 150の画像
* 310 x 310の画像
* 横310 x 縦150の画像

```xml:browserconfig.xmlの例
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
 <msapplication>
  <tile>
   <square70x70logo src="/tileImg-70x70.png"/>
   <square150x150logo src="/tileImg-150x150.png"/>
   <square310x310logo src="/tileImg-310x310.png"/>
   <wide310x150logo src="/tileImg-310x150.png"/>
   <TileColor>#ff0000</TileColor>
  </tile>
 </msapplication>
</browserconfig> 
```

![tile01.png](https://qiita-image-store.s3.amazonaws.com/0/142879/8ef727d1-2ce5-2691-1a34-8b8f944a6087.png)

# ■ wwwrootにアップロード

xmlと画像ファイルをサイトのwwwroot直下にアップロードする。

![tile02.png](https://qiita-image-store.s3.amazonaws.com/0/142879/6ae78506-02f6-ee7b-bef6-d57c2246f79a.png)

これで作業は完了。

# ■ スタートにピン留めしてみる

Microsoft Edgeでサイトを開き、メニューから「このページをスタートにピン留めする」を選択する。
![tile03.png](https://qiita-image-store.s3.amazonaws.com/0/142879/c86017f5-c79c-011e-5230-c3e9af84b409.png)

「このタイルをスタートにピン留めしますか？」で「はい」を選択する。
![tile04.png](https://qiita-image-store.s3.amazonaws.com/0/142879/4433eec8-9a8c-12f0-923b-eb6bcf350530.png)

カスタマイズしたタイルがピン留めされた。
![tile05.png](https://qiita-image-store.s3.amazonaws.com/0/142879/e7affae9-1fd2-5e1c-c217-21e05860e617.png)

横長タイル
![tile06.png](https://qiita-image-store.s3.amazonaws.com/0/142879/c7ca7fd9-2eab-8e91-3f26-3daf3e043f58.png)

大タイル
![tile07.png](https://qiita-image-store.s3.amazonaws.com/0/142879/993c573b-eb3d-5800-bd7f-555d6fa3701c.png)

# 参考URL
* [IE11 での Web サイト用カスタム タイルの作成 - MSDN](https://msdn.microsoft.com/library/dn455106(v=vs.85).aspx)
* [ライブ タイルの作成 - MSDN](https://msdn.microsoft.com/library/dn439794(v=vs.85).aspx)
geometry > Voronoi を試してみた (2D, 3D)

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
```

https://docs.scipy.org/doc/scipy-0.18.1/reference/generated/scipy.spatial.Voronoi.html

実施してみた。

### link

- [scipy Voronoi by @kwi さん](https://qiita.com/kwi/items/4b7162fbada390501d06)
- https://docs.scipy.org/doc/scipy-0.18.1/reference/genindex.html#V
- [scipy.spatial.Voronoiの使い方 by nobUnagaさん](http://nobunaga.hatenablog.jp/entry/2016/01/11/200357)
- [球面上の格子の作り方 by @kei2ishihara さん](https://qiita.com/kei2ishihara/items/0f60446cab4bd5caa014)


## 2D

Jupyterコード。

```py:Voronoi_2d_171007.ipynb
import numpy as np
from scipy.spatial import Voronoi, voronoi_plot_2d
import matplotlib.pyplot as plt
import sys

'''
v0.1 Oct. 7, 2017
  - show 4 Voronoi vertices generated for 9 points
'''

points = np.array([[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2],
                  [2, 0], [2, 1] , [2, 2]])
vor = Voronoi(points)
voronoi_plot_2d(vor)
plt.show()

for idx, pts in enumerate(vor.points):
    print("point " + str(idx) + "(" + str(pts) + ")")
    
for idx, vts in enumerate(vor.vertices):
    print("vertices " + str(idx) + "(" + str(vts) + ")")
```

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/361c1e12-f4fe-5853-0362-da7b0f8da013.png)

```txt:run
point 0([ 0.  0.])
point 1([ 0.  1.])
point 2([ 0.  2.])
point 3([ 1.  0.])
point 4([ 1.  1.])
point 5([ 1.  2.])
point 6([ 2.  0.])
point 7([ 2.  1.])
point 8([ 2.  2.])
vertices 0([ 0.5  0.5])
vertices 1([ 1.5  0.5])
vertices 2([ 0.5  1.5])
vertices 3([ 1.5  1.5])
```

与えられたpointsに対してverticesを計算できるようだ。

## 3D

VoronoiクラスはN次元対応のようだ。
3D描画は用意されていないようではある。

Jupyterコード。

```py:Voronoi_3d_171007.ipynb
import numpy as np
from scipy.spatial import Voronoi, voronoi_plot_2d
import matplotlib.pyplot as plt
import sys

'''
v0.1 Oct. 7, 2017
  - calc Voronoi (3D)
'''

inx = np.linspace(0, 2, 3, endpoint=True)
iny = np.linspace(0, 2, 3, endpoint=True)
inz = np.linspace(0, 2, 3, endpoint=True)
mx, my, mz = np.meshgrid(inx, iny, inz)

arr = []
for ax in range(len(mx)):
    for ay in range(len(my)):
        for az in range(len(mz)):
            arr += [[mx[ax][ay][az], my[ax][ay][az], mz[ax][ay][az]]]

points = np.array(arr)
vor = Voronoi(points)

#voronoi_plot_2d(vor)
#plt.show()

#for idx, pts in enumerate(vor.points):
#    print("point " + str(idx) + "(" + str(pts) + ")")
    
for idx, vts in enumerate(vor.vertices):
    print("vertices " + str(idx) + "(" + str(vts) + ")")
```

```txt:run
vertices 0([ 1.5  1.5  1.5])
vertices 1([ 1.5  0.5  1.5])
vertices 2([ 1.5  0.5  0.5])
vertices 3([ 1.5  1.5  0.5])
vertices 4([ 0.5  0.5  0.5])
vertices 5([ 0.5  0.5  1.5])
vertices 6([ 0.5  1.5  0.5])
vertices 7([ 0.5  1.5  1.5])
```
Paper > 形状の対称性識別に関する論文 | 粒子の対称性を利用した計算の効率化

### link

- [Detection of Symmetry Points in Images by Christoph Dalitz et al. (2013)](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.361.7211&rep=rep1&type=pdf)

- [Symmetry in 3D Geometry: Extraction and Applications by Mitra et. al. (submitted 12/2012)](http://vecg.cs.ucl.ac.uk/Projects/SmartGeometry/symmetry_survey/paper_docs/symmetrySurvey_cgf13.pdf)

### 備考

非球形粒子の光学特性を計算する時、[Euler Angle](https://en.wikipedia.org/wiki/Euler_angles)の３つの角度をランダムに取り計算し、その結果を平均化するということは一般的に行われる（γは独自平均される場合があるので、α、βのみでの平均の場合もある）。
(追記 2017/10/28: ADDAの場合、manual.pdf 8.2 Orientation averagingに記載があるとおり、αは1回の計算内で平均されるので、β、γを平均する）。

粒子が対称性を持っている形状の場合、その対称性を利用して、上記の計算回数を減らすという方法は考えられる。

https://github.com/adda-team/adda/blob/master/doc/manual.pdf
p59 B.3 alldir_params.dat
に記載のinput/alldir_param.datに以下の記載がある。

```input/alldir_param.dat
# Description of the coverage of the whole solid angle for integration 
#
# This file should be manually modified by user. 
# Program does not assume any symmetries of the particle. Therefore, possible symmetries should be considered by user
# and this can lead to decrease of integration limits 
...
```

三次元形状が与えられた時、その対称性を判別するような仕組みを用意して、必要なEuler Angleの範囲を自動計算して[ADDA](https://github.com/adda-team/adda/)に与える。

この方法の制限として、自然界に多く見られる対称性が少ない非球形粒子には適用できないということ。
その例として、六角柱が多数くっついた粒子(氷雲内にある？）や[irregularly shaped Voronoi aggregates(Masuda and Ishimoto, JQSRT, vol. 190, 60-68, 2017)](http://www.sciencedirect.com/science/article/pii/S002240731630454X)、球形が葡萄の房のようにくっついた粒子（宇宙空間のダスト）、球粒子の上に微小粒子が吸着した粒子（大気エアロゾルの一種）などは対象外。

Voronoi aggregatesの場合、角度の計算例として$10^4$から$10^5$角度の計算をしてようやく収束する、という結果もある。
それは吸収効率、散乱効率のような「方向積分した光学特性」の例であり、位相角ごとの散乱強度などの「方向ごとの光学特性計算」の場合は、さらに１から２オーダー計算回数を増やさないと精度が出せない可能性がある。
Amazon Linux 上の tomcat で動く Java プロセスから R を動かす

意外とまとまった内容がなくはまったのでメモ

## 概要

Java/R Interface 自体の説明は公式を参照 https://www.rforge.net/JRI/

## Javaのインストール

通常通りJavaをインストールしてPATHを通すだけなので省略。

## Rインストール

yumでもたぶんOKだが、古いバージョンを入れたかったので自分でmakeした。

```bash
wget https://cran.r-project.org/src/base/R-3/R-3.2.0.tar.gz
tar zxvf R-3.2.0.tar.gz
cd R-3.2.0
./configure --with-x=no && make && sudo make install
```

rJavaパッケージを入れる

```bash
sudo R CMD javareconf ## RにJavaの環境情報を自動で設定する
sudo R ## Rの対話シェルが起動する
[R console] > install.packages('rJava') ## localインストールで良いか聞かれるので yes
[R console] > system.file("jri",package="rJava") ## (1) rJavaの場所
```

環境変数を設定する

```bash
R RHOME ## (2) Rの場所。which R と結果が違うがこっちが正しい。
vi ~/.bash_profile
```
```bash
## bash_profileに適当に追加
LD_LIBRARY_PATH=/usr/lib64/R/library/rJava/jri/:/usr/local/lib64/R/lib/ ## (1)
export LD_LIBRARY_PATH
R_HOME=/usr/local/lib64/R ## (2)
export R_HOME
```
```bash
source ~/.bash_profile
```

お好みの方法でサーバーを起動すれば、正しくRがJavaに認識されるはず。
Ruby の Proc オブジェクトのソースを表示するコード

Proc オブジェクトのソースを表示するコードを書いてみました。

```rb:proc_source.rb
require "ripper"

class Proc
  def proc_source
    return @source if @source
    filepath, start_pos = source_location

    code = File.readlines(filepath)[(start_pos-1)..-1].join
    tokens = Ripper.lex(code).drop_while do |t|
      !proc_token?(t)
    end

    @source = " " * tokens[0][0][1].to_i

    while token = tokens.shift
      @source += token[2]
      break if valid_proc_source?(@source)
    end

    @source
  end

  private

  def proc_token?(token)
    _pos, event, ident = token
    return true if event == :on_const && ident == "Proc"
    return true if event == :on_ident && ident == "lambda"
    return true if event == :on_ident && ident == "proc"
    return true if event == :on_kw && ident == "do"
    return true if event == :on_lbrace
    return true if event == :on_tlambda
    false
  end

  def valid_proc_source?(source)
    source = "Proc.new " + source if source =~ /\A\s*(do|{)/
    eval(source).instance_of?(Proc)
  rescue SyntaxError, ArgumentError
    false
  end
end
```

こんな感じのコードを書くと

```rb
a = -> { 'hi' }
puts a.proc_source
```

こんな感じで表示されます。

```
    -> { 'hi' }
```


## Gem にしてみました

せっかくなので gem にしました。

https://github.com/siman-man/proc_source


## うまくいかない例

いくつかうまくソースが取得出来ないケースを見つけているのですが、対応するのがつらいのでやる気があるときに頑張りたいと思います。

`eval` で作られる

```rb
lambda1 = eval('lambda { "hi" }')
puts lambda1.proc_source  #=> No such file or directory @ rb_sysopen - (eval) (Errno::ENOENT)
```

多重代入される

```rb
proc1, proc2 = Proc.new { "hi" }, Proc.new { "hey" }
puts proc1.proc_source #=>                Proc.new { "hi" }
puts proc2.proc_source #=>                Proc.new { "hi" }
```

etc...



`#source_location` が列番号も返してくれると問題も解決しやすくなりそうです。


## 追記 (2019/01/30)

Ruby 2.6 から `RubyVM::AbstractSyntaxTree.of` が使えるようになり、より簡潔にソースを取得出来るようになりました。

https://qiita.com/siman/items/b6f856263b11df74d852

## 参考サイト

https://docs.ruby-lang.org/ja/latest/class/Proc.html
GKEで動作させたHaskellプログラムから出力したログが見れない問題を解決した


# GKEでログが見れないという問題が発生
Stackdriverのログ機能を有効にして、GKE上でアプリケーションを実行すれば、標準出力にログを出力するだけで、GCPのコンソール上（ウェブ画面）でそのログを見ることができます。大変便利です。
しかし今回、Haskellで作成した実行ファイルから標準出力に出力したログが、コマンド（kubectl logs）でもコンソール上（ウェブ画面）にもどこにも現れないという問題が起こりました。原因を特定して解決するのに一日かかってしまったので、共有しておきたいと思います。

# 原因はログがバッファに溜め込まれていたことだった
結論を言うと、ログがバッファに溜め込まれていて、出力されていなかったことが原因でした。
結局、バッファリングのモードを変更する下のコードで解決しました。

```hs
import System.IO

hSetBuffering stdout LineBuffering -- 標準出力に出力されたデータは行単位で出力されるように設定
putStrLn "message" -- １行出力
```

`hSetBuffering stdout LineBuffering`で１行ごとにバッファに溜め込まれたデータを標準出力に出力させるように設定します。一度この設定をしておくことで、`putStrLn`のタイミングでコンソール上にちゃんとログが現れるようになります。
Dockerで標準出力に出力されたデータは一旦ファイルに出力されて、それをstackdriverが拾う仕組みになっているはずです。ファイルに出力しているならば、そりゃバッファに溜める仕組みになっているだろうなと思いますが、標準出力に出力しているという感覚で考えていたため、当然１行ごとにフラッシュされるだろうと思って、この原因を見逃していました。しかも、ローカル環境で`docker logs`した場合にはちゃんとログが見れていましたからなおさらです。

（ちなみに、数行`putStrLn`した後に`hSetBuffering`して、その後`putStrLn`すると、それまでバッファに溜まっていたログが全て一気に出力されます。）

このことから、フラッシュをすれば、改行なしでもそのタイミングでログを拾ってくれるのかと思い、下のコードを試しましたがダメでした。改行は必要なのですね。ウェブ画面で見るログメッセージの末尾が改行されていて不格好だから修正したかったのですが仕方がありません。

```hs
putStr "message" -- 改行しないでおく
hFlush stdout -- バッファに溜めたデータを出力させたい。けどだめだった。
```

Haskellではなく、他言語でもこのようなことが発生するかもしれません。そのような場合は、バッファリングの設定を変えてみると解決するかもしれません。
astah communityをUbuntuに導入する

自分で考えていることを整理するのに、ひとまず使い慣れているastah communityを入れてみる。

Windowsでは使ったことがあるものの、現状利用頻度が高いのはUbuntu。
そこで、Linuxでも使えるかを調べるところから始めた。

調べてみると、WindowsだけでなくMacやLinux(Debian系やRedHat系も)でも利用できることが判明。
下記のサイトを参照してインストールすることができた。
[Linuxでastah*を使う](http://astah.change-vision.com/ja/feature/astah-on-linux.html#apt)

Javaのバージョンには要注意。
2017/10/07時点ではJava9には非対応。
↓のポップアップが出て使えなかった。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/159748/28f8a61a-eb33-c7d8-41fa-493ad6470770.png)

今回はDebian系のAptリポジトリを利用したインストール方法を試した。
途中dpkgの更新を促す画面が出たけれど、指示にそのまま従えばOK。

ここからはちょっと余談。
astah SysMLではROSと連携できるプラグインが用意されているみたい。
[Sugar Sweet Robotics > ROS-SysML連携](http://sugarsweetrobotics.com/?page_id=64)
50日のトライアルもあるので、余裕ができたら使ってみようかな。
n番煎じの powershell 向け shebang !

PowerShell のスクリプトを実行しようとすると、実行ポリシーを一時的に変えるため

```
powershell -ExecutionPolicy RemoteSigned -file HOGE.ps1
```

と長い起動コマンドラインになってしまいがちです。

ということで、`HOGE.ps1` を実行するために、別途 `HOGE.cmd` などのバッチファイルを用意したりしますが、ファイルが増えると、配布する手間、説明する手間（「二つを同じフォルダーに置いて実行してください！」とか）も増え、しかも使ってもらえなくなったりして、なかなか難儀です。

そこでバッチファイルの中に PowerShell スクリプトを組み込んで、１ファイル化しようということになります。過去、PowerShell をバッチファイルに組み込む方法は、過去いろいろ記事がありました。

* [PowerShell をバッチファイルに組み込もうとしたけれども（追記：解決した！） - Qiita](https://qiita.com/zetamatta/items/a9b5201b7d8009fad06b) 
* [Windowsでshebangもどき、またはバッチにスクリプトを埋め込む方法 - Qiita](https://qiita.com/snipsnipsnip/items/50e4ca88e3ce3f8cffda)

そんな中、先日見つけた記事：

* [バッチファイルにPowerShellスクリプトを埋め込む - Programming Field](https://pf-j.sakura.ne.jp/program/tips/ps1bat.htm)

これはかなり決定打のように思われました。`echo` がバッチコマンド、PowerShell 両方にある（`echo` = `Write-Output` のエイリアス）ことを利用するなど、よく考えられたものです。ただ、惜しまれるのはバッチとの共用行が長くて、覚えづらいということでしょうか。

そこで、自分なりにアレンジしてみました。

```shebang.cmd
@set "args=%*"
@powershell "iex((@('')*3+(cat '%~f0'|select -skip 3))-join[char]10)"
@exit /b %ERRORLEVEL%

Write-Output $env:args

# vim:set ft=ps1:
```

* プログラム的にバッチファイルの先頭３行を空行に差し替えて、Invoke-Expression(iex)で処理するようにした（３行を差し替えずに、そのまま消してもよかったのだが、エラーの行番号がズレさせたくなかったため）
* 改行を表す「\"`n\"」を [char]10 などに置き換えた（エディターのシンタックスハイライトに優しい）
* 引数は残念ながら `$args[]` ではなく、`$env:args` を使う（とほほ）

しかし、こういうのも、多分、どこかで既出なんでしょうね
GitbucketをWindows上で動かしてみる

# やりたいこと
Linux上で本格運用する前にテストとしてWindows 10上で動作させてみる。
あくまでも動作テスト的な感じ。

# Gitbucketの導入
[ここ](https://github.com/gitbucket/gitbucket)からwarファイルをダウンロードして

```shell-session
java -d64 -jar .\gitbucket.war --port=8000
```

とかやるとポート8000番で起動できる。

設定ファイルとかは %userprofile%\.gitbucketにできる
この中にプラグインとかを突っ込んでいけばオレオレリポジトリが簡単に作れる。

# GitbucketにCIプラグインをインストール
ここからjarをDLして%userprofile%\.gitbucket\pluginsに放り込むだけ。
https://github.com/takezoe/gitbucket-ci-plugin

ちょー楽。なにこれ。
ここに放り込まれると自動的にリロードされるので便利。
技術の進歩を感じる。

# Gitbucketでビルドスクリプトを構成する
ビルドついでに、ユニットテストをぶん回す感じで。
コミットするとユニットテストを走らせて、
その結果がGitbucketにビルド成功・失敗の形で載る。

今回コミットしたプロジェクトはRustなので、cargo test だけ書く。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/30037/031afc0a-bf42-5a0a-6342-24c3f18dac82.png)

コミットするたびにビルドログが出る。
これでコミットのたびにユニットテストが失敗したかどうかが分かる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/30037/7eed42a2-0ecd-e503-7682-386fd5736526.png)

プロジェクトのMarkdownからも参照できるので
Githubと同じ感じのことができるカッコイイ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/30037/d3d8de02-5161-50fc-c200-237b8f6c3571.png)



# 感想
ガッチガチの開発よりは、趣味レベルで公開するほどでもないけどバージョン管理したいなーと言うものはこれでいけそう。

あとは、会社で作ったけど、ファイルサーバに上げてバージョン管理がなされない状態になるとか絶対にイヤダ！でもあんまり手間を掛けたくない！というエンジニアには結構向いてそう。

ファイルで管理するよりは100倍くらいマシ
SRE本まとめ（12章 効果的なトラブルシューティング）

自分の理解を深めるためにまとめてみました。[11章](https://qiita.com/bassbone/items/b603435e37c72641062f)の続きです。

## 12章 効果的なトラブルシューティング

### 理論
トラブルシューティングのプロセスは仮説演繹法の応用と考えられる。プロセスとしては「トリアージ→観察→診断→対処」となる。

### 実践
全ては問題のレポートからスタートする。問題毎にBTSにチケットを登録して処理するほうがよい。問題発生時はまずはトリアージを行うが、最速で原因究明をしようとは考えずに、システムがその状況で出来る限り正常動作するように振る舞うことが大切。診断の際はにはコンポーネント間の接続を注意深く観察する。ブラックボックステストを行うことも有効である。分割統治法は非常に有用なテクニックである。問題の整理にあたっては「What」「Where」「Why」を意識すること。

### 否定的な結果の素晴らしさ
否定的な結果は、無視したり過小評価したりするべきではない。否定的な結果を理解することには大きな意味がある。否定的な結果が出た実験は決定的なものである。ツールや方法論は有益である。極力ケースを周囲に公開することで業界全体の底上げとなる。

### トラブルシューティングを容易にするために
- 観察のための仕組みを構築する。
- システム設計時に既知の技術を使ってコンポーネント間に観察可能なインターフェースを持たせる。

（[13章](https://qiita.com/bassbone/items/883cf21f5a1f44b8b1c2)に続く）