OmniAICreator/Qiita-1.07M huggingface dataset:
【swift】AutoLayoutのConstraintで端末毎のサイズを変更する

storyboardのautolayoutを使った場合に、端末毎のサイズは画面サイズから比率で表示させる等をしなければなりませんが、NSLayoutConstraintを継承したクラスを作成してgetter,setterを設定することで、端末毎に対応したNSLayoutConstraintを利用することが出来ます。

```swift:Setting.swift
// 基準とする画面縦幅
let baseScreenHeight: CGFloat = 667.0
// 基準とする画面横幅
let baseScreenWidth: CGFloat = 375.0

// 端末サイズ計算 (Height)
func calculateDeviceHeightSize(_ values: CGFloat) -> CGFloat {
    // iPhoneXの場合は、iPhone6の基準に合わす
    if UIScreen.main.bounds.size.height == 812.0 {
        return values
    }
    return values * UIScreen.main.bounds.size.height / baseScreenHeight
}
// 端末サイズ計算 (Width)
func calculateDeviceWidthSize(_ values: CGFloat) -> CGFloat {
    return values * UIScreen.main.bounds.size.width / baseScreenWidth
}
```

```swift:CustomConstraint.swift
/**
 Constraintを端末サイズ毎に変更するカスタムクラス
 横方向のサイズに利用
 */
class CustomConstraintWidth: NSLayoutConstraint {
    override var constant: CGFloat {
        get {
            return calculateDeviceWidthSize(super.constant)
        }
        set {
            super.constant = newValue
        }
    }
}

/**
 Constraintを端末サイズ毎に変更するカスタムクラス
 縦方向のサイズに利用
 */
class CustomConstraintHeight: NSLayoutConstraint {
    override var constant: CGFloat {
        get {
            return calculateDeviceHeightSize(super.constant)
        }
        set {
            super.constant = newValue
        }
    }
}
```

storyboardで設定する場合は、以下のようにCustom Classを設定します。

![CustomConstraint.png](https://qiita-image-store.s3.amazonaws.com/0/194104/32518982-fc2b-06dd-dffd-5b269fa6e7cf.png)


StackViewのspacingを端末サイズ毎に変更する場合は、こちらになります。

```swift:CustomSpacingStackView.swift
/**
 StackViewのspacingを端末サイズ毎に変更するカスタムクラス
 */
class CustomSpacingStackView: UIStackView {
    override var spacing: CGFloat {
        get {
            return super.spacing
        }
        set {
            if axis == .horizontal {
                super.spacing = calculateDeviceWidthSize(newValue)
            } else {
                super.spacing = calculateDeviceHeightSize(newValue)
            }
        }
    }
}
```
FragmentでMapViewを使うとANRでフリーズした


FragmentでMapViewを表示していたところonDestroyのタイミングでANRが発生しフリーズしてしまう問題でハマりました。
`/data/anr/traces.txt`には以下のログが記録されていました。

```
"main" prio=5 tid=1 Native
  | group="main" sCount=1 dsCount=0 obj=0x75de1f90 self=0x7f8ca96a00
  | sysTid=16689 nice=-10 cgrp=default sched=0/0 handle=0x7f90e67aa0
  | state=S schedstat=( 9184704295 1676607665 12039 ) utm=773 stm=144 core=6 HZ=100
  | stack=0x7ffb204000-0x7ffb206000 stackSize=8MB
  | held mutexes=
  kernel: __switch_to+0x88/0x94
  kernel: futex_wait_queue_me+0xd8/0x144
  kernel: futex_wait+0xec/0x200
  kernel: do_futex+0xdc/0x494
  kernel: SyS_futex+0x110/0x19c
  kernel: el0_svc_naked+0x24/0x28
  native: #00 pc 000000000001c22c  /system/lib64/libc.so (syscall+28)
  native: #01 pc 00000000000765a0  /system/lib64/libc.so (pthread_cond_wait+96)
  native: #02 pc 00000000004ad0e8  /data/app/jp.co.runners.runand.dev-2/lib/arm64/libmapbox-gl.so (???)
  native: #03 pc 00000000004ad9f8  /data/app/jp.co.runners.runand.dev-2/lib/arm64/libmapbox-gl.so (???)
  native: #04 pc 00000000000a11ec  /data/app/jp.co.runners.runand.dev-2/lib/arm64/libmapbox-gl.so (???)
  native: #05 pc 00000000002228a0  /data/app/jp.co.runners.runand.dev-2/lib/arm64/libmapbox-gl.so (???)
  native: #06 pc 0000000000222a04  /data/app/jp.co.runners.runand.dev-2/lib/arm64/libmapbox-gl.so (???)
  native: #07 pc 000000000008400c  /data/app/jp.co.runners.runand.dev-2/lib/arm64/libmapbox-gl.so (???)
  native: #08 pc 00000000000840b8  /data/app/jp.co.runners.runand.dev-2/lib/arm64/libmapbox-gl.so (???)
  native: #09 pc 000000000008d9f0  /data/app/jp.co.runners.runand.dev-2/lib/arm64/libmapbox-gl.so (???)
  native: #10 pc 000000000008da64  /data/app/jp.co.runners.runand.dev-2/lib/arm64/libmapbox-gl.so (???)
  native: #11 pc 0000000000150210  /data/app/jp.co.runners.runand.dev-2/oat/arm64/base.odex (Java_com_mapbox_mapboxsdk_maps_NativeMapView_nativeDestroy__+124)
  at com.mapbox.mapboxsdk.maps.NativeMapView.nativeDestroy(Native method)
  at com.mapbox.mapboxsdk.maps.NativeMapView.destroy(NativeMapView.java:124)
  at com.mapbox.mapboxsdk.maps.MapView.onDestroy(MapView.java:422)
```

# 解決方法
`MapView#onDestroy`を`Fragment#onDestoryView`の中で呼ぶ。
誤って`Fragment#onDestroy`の中で呼び出していたのが、原因で今回の問題が発生したようです。
名前が同じだったので間違いやすいと思います。

## 参考
https://github.com/mapbox/mapbox-gl-native/issues/10809
ArduinoとRails(Ruby)を繋げて入室管理を作ってみた

## 概要
研究室でハッカソンみたいなことしよう!(深夜1:00)みたいなノリがあって、作ってみました。
作ったのは入室管理システムです。
arduinoをrailsでシリアル通信する記事少なかったので,
こんな風に書きますよーっての紹介(参考までに)

## 使用したgem
https://github.com/hparra/ruby-serialport

## 内容
そんなに細かく書かないです。

Model
・ Student /学生
・ LabStatus /研究室の状況
など

```ruby:
require 'active_record'
namespace :arduino_data do
  desc 'Get arduino status 1 or 0'
  task :receiver => :environment do
    SerialPort.open('/dev/cu.usbmodem1421', 9600, 8, 1, 0) do |sp|
      sp.read_timeout = 10000000
      begin
        arduino_data = sp.readline.slice(0)
        time_now = Time.now

        config = YAML.load_file('./config/database.yml')

        ActiveRecord::Base.establish_connection(config["development"])

        #研究室に人がいる場合
        if arduino_data == '1' && !LabStatus.where(exit_time: nil).present?
          lab_record = LabStatus.new
          lab_record.light_entry = arduino_data
          lab_record.entry_time = time_now
          lab_record.save
        #研究室に人がいない場合
        elsif arduino_data == '0' && LabStatus.where(exit_time: nil).present?
          puts "get 0"
          lab_record = LabStatus.where(exit_time: nil).last
          lab_record.light_entry = arduino_data
          lab_record.exit_time = time_now
          lab_record.update(light_entry: arduino_data, exit_time: time_now)

          #are_you_now status of all students change false 
          Student.all.each do |student|
            student.total_time += student.exit_time.strftime("%H").to_i - student.entry_time.strftime("%H").to_i
            student.save
          end
          Student.all.update_all(entry_time: nil, exit_time: nil, are_you_now: 0)
        #ardinoからの値が取得されない場合やその他の挙動
        else
          puts 'not mutch'
        end

        if @line.present?
          break
        end
      rescue EOFError
        break
      end
    end
  end
end

```

自分の作ったapplicationから一部を切り抜いてきました。
https://github.com/ryotamorohashi/furulab

## まとめ
Socket通信やらSerial通信やら興味あるので、知見を深めていきたいなーって思います。

dormvicfirthさん、khskさん編集リクエストありがとうございます。
ささっと書いたので誤字多いですが、悪しからず。
AWS認定ソリューションアーキテクトプロフェッショナル試験を2回受けて気づいたこと

# これから書くこと

2018年9月に初めてAWS認定ソリューションアーキテクトプロフェッショナル試験に合格しました。
察しの良い方は気付いたと思いますが、つまり、一度落ちています。

１回目の試験結果

```
総合成績： 63%

分野別の成績 :
1.0  High Availability and Business Continuity: 66%
2.0  Costing: 100%
3.0  Deployment Management: 87%
4.0  Network Design: 75%
5.0  Data Storage: 66%
6.0  Security: 56%
7.0  Scalability & Elasticity: 53%
8.0  Cloud Migration & Hybrid Architecture: 28%
```

２回目の試験結果

```
総合成績： 82%

分野別の成績 :
1.0  High Availability and Business Continuity: 83%
2.0  Costing: 100%
3.0  Deployment Management: 100%
4.0  Network Design: 87%
5.0  Data Storage: 91%
6.0  Security: 75%
7.0  Scalability & Elasticity: 76%
8.0  Cloud Migration & Hybrid Architecture: 57%
```

１回目の受験結果でわかった弱い部分を重点的に学習したというのも、もちろんあるのですが、
２回受けたからこそわかったことを別な視点から
これから受験する方の参考になればと思いまとめてみました。

# 前提のAWSスキル

これまでのAWS経験ですが、
サーバーレス案件とプロトタイプ案件が１〜２件程度です。
業務での経験はほとんどありませんが、興味があり個人的にいじっていたという感じです。
2018年7月にAWSソリューションアーキテクトアソシエイトは合格しています。

# 問題文の日本語の完成度にムラがある

合格者の方のブログなり見ていると、
日本語がやばいという方と、まともな日本語だったという方と意見が分かれているようです。

実際のところ、２回受けた私の感想として、
模擬試験の問題文と比較して、最初の試験はGoodな日本語でしたが、
２回目に受けた試験は機械翻訳？と思うほど読むのが辛くなるものでした。（フォントもやばいやつでした）
つまり、どちらに当たるか運次第ということです。

ここは、AWSジャパンの方に頑張っていただいて日本語のクオリティを上げていただきたいですね。
ちなみに、模擬試験の日本語もなかなかに読み辛いということをお伝えしておきます。

# 同じような問題が出る

サンプル問題や模擬試験と同じような問題（全く同じ？？）が本試験でも出てきました。
また、本試験も１回目と２回目で重複する問題が出ていたように思います。
つまり、本試験を受ければ受けるほど、早く問題（の日本語）を理解することができます。

プロフェッショナルの問題はかなりの長文なので、早く理解することで
気持ちに余裕が生まれ、有利にすすめていくことができると思います。

実際、１回目の試験は１７０分ギリギリまでかかりましたが、
２回目の受験では７０分程度で試験を終えることができました。

# 出題範囲

出題範囲は公表されていません。というかAWSのサービス全てです。以上！

とはいえ、そこは模擬と２回の本試験を受けて
ある程度つかめた傾向を以下に記載していきます。

## 以下のサービスの理解は必須

コスト効率や可用性、耐障害性に合わせてストレージクラスやRDSの構成を選択する問題や、
セキュリティ要件に合わせてVPCの構成を選択させる問題がよく出ます。

* S3のストレージクラスの違い（RRS、低頻度アクセス、Glacier）
* RDSのマルチAZとリードレプリカの違い
* VPC、サブネット
* IAM

## よく出てきたサービス

オンプレとVPCを接続してハイブリッドな構成、または、オンプレからAWSへ移行する問題や、
SQSで耐障害性、低コスト構成を選択させる問題もよく出ますので
このあたりも抑えておかないと合格は厳しいと思いました。

* DirectConnect
* VPN
* SQS
* Kinesis
* CloudFront
* STS（WEBフェデレーション、オンプレADあたりと絡んで出てくる）
* Route53

## その他

* WAFはAWSマネージドのWAFだけではなく、EC2でWAFサンドイッチパターンとかもあります。
* NATもNATゲートウェイだけとは限りません。
* ENIのことは覚えておくのがお得です。多分。

# 模擬試験は必ず受けましょう

40問で税別4,000円は高いと思うかもしれませんが、
問題（の日本語）に慣れるためにも受けることを強くおすすめします。
ちなみに、模擬試験も２回受けましたが同じ問題でした。（悲しい）

# 試験会場について

他の受験者様の情報から判断して、歌舞伎座タワーを選択していたのですが、
これは正解だと思っています。

アソシエイトから数えてこれまで３回利用していますが、
カメラで監視されることもなく、静かで快適に試験を受けられます。
ちなみに、試験後回収されますが筆記用具ももらえます。

# 参考にすると良いサイト

学習方法は多くの合格者の方が詳しく書かれているので、
そちらを読んでいただくとして
ここでは、私が参考にしたサイトのみ記載します。

これは必見。「AWSサービス別資料」
https://aws.amazon.com/jp/aws-jp-introduction/


次は海外のサイトですが、情報が体系的にまとまっていてとても参考になるサイトです。
こちらも合格者の方がよく参考にしているようですが納得です。

Jayendra's Blog
http://jayendrapatil.com/

# まとめ

私は、１度目の不合格から３週間程度で２度目を受験しました。
一度落ちると気落ちしますが、さっさと気持ちを切り替えて
感覚が残っている間に次の受験をしたことが良かったのかもしれません。

今までなんとなく使ってたAWSのサービスも、試験勉強を通じてより理解が深まると思いますので
これからはAWSだよねって方は受験されてみるのはいかがでしょうか。
Firefox の Headless モード (Ruby)

Firefox の Headless モードの使い方です。

```rb:headless_firefox.rb
#! /usr/bin/ruby
# -*- coding: utf-8 -*-
#
#	headless_firefox.rb
#
#					Sep/18/2018
#
# ------------------------------------------------------------------
require 'selenium-webdriver'

# ------------------------------------------------------------------
STDERR.puts "*** 開始 ***"
url_target = ARGV[0]
STDERR.puts url_target

options = Selenium::WebDriver::Firefox::Options.new(args: ['-headless'])

driver = Selenium::WebDriver.for(:firefox, options: options)

driver.get(url_target)

version = driver.execute_script('return jQuery.fn.jquery')

STDERR.puts "Using jQuery #{version}"

puts driver.title

driver.save_screenshot("out.png")

html = driver.page_source

driver.quit

print(html)

STDERR.puts "*** 終了 ***"
#
# ------------------------------------------------------------------
```

実行結果

```text
$ ./headless_firefox.rb https://ekzemplaro.org/storytelling/
*** 開始 ***
https://ekzemplaro.org/storytelling/
Using jQuery 3.3.1
ストーリーテリング
<html lang="ja"><head>
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-cache">
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8">
<script src="/js/jquery-3.3.1.min.js"></script>
<script src="storytelling.js"></script>
<link rel="stylesheet" href="storytelling.css">
<title>ストーリーテリング</title>
</head>
<body>
<h2>ストーリーテリングを味わう機会</h2>
<blockquote>
<div class="information"></div>
</blockquote>
<h2>ストーリーテリングの私のレパートリー</h2><p>
</p><div class="contents"></div>

<hr>
<a href="html_src/">src</a><br>
<hr>
<a href="../">Return</a><p>
Aug/18/2018 AM 07:00</p><p>


</p></body></html>*** 終了 ***
```
Goland で Ginkgo のテストファイルを実行する

# はじめに

* Goland はデフォルトで Go の標準的な開発をする環境が整っているが、Ginkgo などの標準から外れたライブラリを利用する際には一手間必要になる。
* 標準の testing を使って書かれたテストファイルであれば、右クリックから Run や Debug を行うことができるが、Ginkgo のテストファイルはテストファイルとして認識されないのかそのままでは Run できないので Run Configuration を作成する必要がある。

# バージョン

* Goland 2018.2.2

# 手順

* メニューの `Run > Edit Configuration` で設定ウィンドウを開く
* `+ > Go Test` で新しい設定を追加
  * `Test framework` を `gotest`
  * `Test Kind` を `File`
  * `Files` にテストファイル名を入力
  * `Working directory` にテストファイルのあるディレクトリ名を入力
  * `Program arguments` に `-ginkgo.v -test.run .* -ginkgo.focus REGEX` と入力
    * `REGEX` の部分は実行したいテストの Description がマッチする正規表現を入力する.
  * `OK` で設定を終了
* `Run` などからテストを実行する

# 解説

* 実際に実行されるコマンドは以下の通り

```
go test -c -o /private/var/folders/xf/b6ynjs6577zd2n27r375y6lsnscvtp/T/___foo_test_go -gcflags "-N -l" -a github.com/bar/baz #gosetup
/Applications/GoLand.app/Contents/plugins/go/lib/dlv/mac/dlv --listen=localhost:63693 --headless=true --api-version=2 --backend=default exec /private/var/folders/xf/b6ynjs6577zd2n27r375y6lsnscvtp/T/___foo_test_go -- -test.v -test.run ^$ -ginkgo.v -test.run .* -ginkgo.focus SomeRegex #gosetup
```

* ひとつ目の `-test.run` にはおそらく testing 向けの `TestFoo` などの関数名がパースされて指定されるものと思われるが、Ginkgo では定義されないので空になりテストが実行されないので `Program arguments` の `-test.run .*` にて改めて全件マッチするように指定する
* 実際のテスト対象の指定は `Program arguments` の `-ginkgo.focus` にて行う

# おわりに

* testing を使ったほうがいい
commitメッセージやPRのdescriptionで、リポジトリをまたいでGitHubのissueをクローズしたいとき

commitメッセージやPRのdescriptionで

```
username/repository#issue_number
```

とする。

#### 例

```
sshono1210/laravelBot#13
```

### 参考ページ
https://help.github.com/articles/closing-issues-using-keywords/
$axios.$deleteでデータを送る方法

## 最初に
ゲームのリセット機能を作ったのですが、誰でも使えるのではなく、キーワードを知っている人だけ許可しようと実装しました。その際に詰まったのが、$deleteする時にデータを送る方法。

ググれば出てきますが、英語の質問サイトが多く出てきたので、こちらに日本語で投稿しときます。

## $postの場合

\$axios.<font color="red">$post()</font>では、中身に「url」と「引数(データ)」と「コンテントタイプヘッダー」を入れれば大丈夫です。

![Screen_Shot_2018-09-18_at_9_42_01.png](https://qiita-image-store.s3.amazonaws.com/0/252687/68ce4623-0816-c04b-25f8-deb30acbe0ab.png)
## $deleteの場合
しかし、\$axios.<font color="red">$delete</font>の場合はそれだけではうまく行きませんでした。
![Screen_Shot_2018-09-18_at_9_33_13.png](https://qiita-image-store.s3.amazonaws.com/0/252687/4c5c3aa9-1be4-7d5d-78d2-935e844af7c0.png)
例)引数に送りたいデータだけを入れる
→　**失敗**。。。。


## 調べてみると
そこで調べてみると、$deleteの際は引数で**「data(データ)オブジェクト」を定義**する必要があるようです。

参考：https://github.com/axios/axios/issues/736

例) {data: '送りたいデータ'}を引数に入れる
![Screen_Shot_2018-09-18_at_9_28_52.png](https://qiita-image-store.s3.amazonaws.com/0/252687/edd94cd3-e9a6-9cb0-af3c-77263e2ffa6d.png)

こうすることでうまく、削除機能と同時にデータをサーバー側に渡すことができました。削除の際にパスワードやキーワードで認証したいときなどは必要ですよね。

## 最後に
先ほどの参考サイトでは、他にも'params'プロパティを使えば良いと書いてあります。

```index.js
$axios.$delete(URL, {
     params: { foo: 'bar' } //{foo:'bar'}が送りたいデータ
})
```
こちら試してみたのですが、うまく行きませんでした。
なぜだろう。。。

議論が分かれているようですが、ひとまず私は動く方のdataプロパティを使ってみようと思います。
Selenium でリンクをたどる (Ruby)

Selenium でリンクをたどるサンプルです。

```rb:follow_link.rb
#! /usr/bin/ruby
# -*- coding: utf-8 -*-
#
#	follow_link.rb
#
#					Sep/18/2018
#
# ------------------------------------------------------------------
require 'selenium-webdriver'
# ------------------------------------------------------------------
STDERR.puts	"*** 開始 ***"
URL = 'https://ekzemplaro.org'

driver = Selenium::WebDriver.for :firefox
driver.get(URL)

STDERR.puts	"*** sleep start ***"
sleep(10)
STDERR.puts	"*** sleep end ***"

tag = driver.find_element(:id, 'ekzemplaro')
tag.click()
#
STDERR.puts	"*** sleep start ***"
sleep(10)
STDERR.puts	"*** sleep end ***"
#
tag = driver.find_element(:link, 'English')
tag.click()
#
STDERR.puts	"*** 終了 ***"
# ------------------------------------------------------------------
```

実行方法

```bash
./follow_link.rb
```
FileMakerServer17の自動バックアップをコマンドラインで停止させる

# 環境と想定読者
* FileMakerServer 17 を利用している FileMakerServer 管理者

# ハマりポイント
* FileMakerServer 17 では「自動バックアップ」というものがデフォルトで走るように設定されている。毎日 00 時 00 分に実行されるようになっており、この時刻を変更することはできない。
* GUI の AdminConsole 上で、自動バックアップを停止する手段が用意されていない。
* このせいで、以下の点で悪影響がある。
    * 今までの慣例から手動でバックアップを設定していると、重複してしまってディスク領域を二重にくらわれる。
    * 時刻変更できないので柔軟なバックアップ計画が実行できない。
* 公式ドキュメントのどこに停止手段が書かれているか探すのが大変。

# 解決策
* FileMaker CLI を使って以下のコマンドを実行し、自動バックアップを停止させる。

```
fmsadmin disable schedule 1
```

* 公式ドキュメントにおけるこのことの記載箇所は以下の通り。
    * https://fmhelp.filemaker.com/help/17/fms/ja/index.html#page/FMS_Help%2Fconfig-backup-auto-on-demand.html%23

「メモ」じゃないですよまったく！！
Ubuntu 18.04 LTS環境でNetplanをつかったネットワークブリッジの構築方法

Ubuntu 18.04 LTS（厳密には17.10）より、ネットワーク設定はNetplanで行うことになりました。

NICへ普通にアドレスを振る方法はすでにいろいろな方がすでに紹介されていますので、ここではネットワークブリッジの構築方法を紹介したいと思います。

# 従来の設定方法

まずは、従来の設定方法(ifupdown)でネットワークブリッジを組む方法をおさらいします。

/etc/network/interfaces

```
auto ens160
iface ens160 inet manual

auto br0
iface br0 inet static
  bridge_ports ens160
  bridge_stp off
  address 192.168.0.1
  network 255.255.255.0
  gateway 192.168.0.254
  dns-nameservers 192.168.0.254
  dns-search example.com

iface br0 inet6 static
  address fc00:dead:beef:1::1
  netmask 64
  gateway fc00:deed:beef:1::fffe
```

# Netplan での設定方法

上記の内容を Netplan で設定しようすると以下のようになります。

IPv6のネットワーク設定は今回あえて手動での設定方法を紹介しています。自動的に行いたい場合は環境に応じて dhcp6 または accept-ra を有効にします。

設定ファイルは /etc/netplan ディレクトリに保存されていますが、ファイル名は環境によって異なる場合があります。

/etc/netplan/01-netcfg.yaml

```yaml
network:
   version: 2
   renderer: networkd
   ethernets:
     ens160:
       dhcp4: no
       dhcp6: no
       accept-ra: no
   bridges:
     br0:
       dhcp4: no
       dhcp6: no
       accept-ra: no
       addresses:
         - 192.168.0.1/24
         - fc00:dead:beef:1::1/64
       gateway4: 192.168.0.1
       gateway6: fc00:dead:beef:1::fffe
       nameservers:
         addresses:
           - 8.8.8.8
           - 8.8.4.4
           - 2001:2860:4860::8888
           - 2001:2860:4860::8844
         search:
           - example.com
       interfaces:
         - ens160
       parameters:
         stp: no
```

## 設定の反映

NICへの反映は以下の通り。以前はNICを直接Down/UPしなければならなかったりしたのを考えると楽になっています。

```bash
sudo netplan apply
```
Windowsでパーティションの変更する方法

# Windowsでパーティションを簡単に変更できるを記載します。
- 概要
    - EaseUS Partition Maseter を使う方法です
    - 私が使ったのは、EaseUS Partition Master 12.10
    - とても便利なツールで有料版と無料版があります
    - 「パーティションの変更と移動」であれば無料版でできます
    - とても便利で簡単に使えるので一度お試しください
- ダウンロード
    - EaseUS Partition Maseter の公式ページからダウンロードできす
        - https://jp.easeus.com/partition-manager-software/free.html
    - また窓の杜からもダウンロードできます
        - https://forest.watch.impress.co.jp/library/software/easeuspart/
- EaseUS Partition Maseter の機能のポイント
    - 自在にパーティションを編集できるソフト
    - ドライブ内のデータを破壊することなくパーティションの作成・削除・サイズ変更などが可能
    - OSがインストールされたパーティションの編集も可能
    - 作成したパーティションはNTFS/FATでフォーマット可能
- EaseUS Partition Maseter の使い方
    - 公式ページで分かりやすく解説してくれてます
    - 画像もついているのでイメージしやすいですよ
    - https://jp.easeus.com/tutorial/win-partition-manager-free.html
Azure DevOps (旧VSTS) の Android Signing で Zipalign を ON にしよう

## 【問題】Azure DevOps でビルドした .apk が動かない？

Xamarin プロジェクトのビルドを Azure DevOps (当時は VSTS) に乗せたかったのですが、作成された .apk が動かなくて[悩んでいました](https://twitter.com/NakamuraYoichi/status/974215268762238976)。

- .ipa は動く
- ローカルPCでビルドすれば動く
- インストールはできる
- 起動直後にスプラッシュ スクリーンより前に落ちる
- AppCenter に Crash を記録する前に落ちる

だいぶ長い間[ネグって](https://www.weblio.jp/content/%E3%83%8D%E3%82%B0%E3%82%8B)いたのですが、やっと解決したので報告します。

## 【解決】原因は zipalign

Android Device Monitor でアプリが起動するときの様子を観察したところ、次のようなエラー メッセージが出ていました。Tag は `monodroid-assembly` です。

> Assembly 'assemblies/hoge.dll' is located at a bad address 0x9e3eb44e
> You MUST run 'zipalign' on base.apk

なるほど、どうしてもっと早く Android Device Monitor を見なかったんだ。 **Android Signing** / **Zipalign Options** / **Zipalign** を **ON** に変えたら解決しました :smile:

### 愚痴

タスク Android Signing の初期状態で Zipalign は OFF になっているし（Sign the APK も OFF ですが）、説明も次のような感じで、

> Select if you want to zipalign your package. This reduces the amount of RAM consumed by an app.

別に OFF のままでもよさそうじゃないですか :angry: 

## 【ハズレ】署名を疑う

はじめは署名を疑っていました。 **Android Signing** / **Signing Options** / **Jarsigner arguments** は本当に初期値 `-verbose -sigalg MD5withRSA -digestalg SHA1` のままでよいのか、という疑いです。

署名に異常が無いか調べます:

```
jarsigner -verify -verbose -certs hoge.apk
```

実機にインストールして動作を確認します:

```
adb install hoge.apk
```

比較のため、ローカルPCでも Azure DevOps と同じコマンドで署名してみます:

```
jarsigner -keystore Hoge.keystore -storepass xxx -keypass xxx -verbose -sigalg MD5withRSA -digestalg SHA1 -signedjar hoge.apk hoge-unsigned.apk Hoge
```

次のような状況でした。

| .apk | 署名の verify | アプリの動作 |
| --- | --- | --- |
| Azure DevOps で署名した .apk | OK | 起動直後に終了してしまう |
| ローカルで jarsigner で署名した .apk | OK | 起動直後に終了してしまう|
| ローカルで Visual Studio の GUI で署名した .apk | OK | 正常に動作する |

[Visual Studio が実行しているであろうコマンドを調べてみる](https://github.com/xamarin/xamarin-android/blob/master/src/Xamarin.Android.Build.Tasks/Tasks/AndroidSignPackage.cs)と、`-digestalg SHA1` と `-sigalg md5withRSA` をデフォルトで指定しているようです。

結局、署名の部分は信用して良さそう、ということになりました。というか、途中で気付いたのですが、もし署名に問題があるのならば、起動以前にインストールの時点で失敗するはずです。 .keystore ファイルを何度かアップロードし直したりしたのに :cry: 

## 参照

- [Android signing build and release task](https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/build/android-signing) - [Azure DevOps &amp; TFS | Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/devops)
- [Android アプリケーション パッケージに署名する](https://docs.microsoft.com/ja-jp/xamarin/android/deploy-test/signing) - [Xamarin | Microsoft Docs](https://docs.microsoft.com/xamarin)
ISOに頼り切って52週を集計するコピペコード

![image.png](https://qiita-image-store.s3.amazonaws.com/0/129854/d5cac972-60ed-0520-933f-b7e99c46feec.png)

# 「52週間前」って何月何日？

1年の数字の変化を追うのに、12か月だとばっくりし過ぎていて365日だとギザギザすぎ。
そこで「週単位」にすると、曜日の影響もなくなってスムーズ。
52個の数値の変化がグラフにしたとき見た目にちょうどいい。
そこで、52週分の集計をしようと思ったけど、

- 週単位って、月曜始まり？ 日曜始まり？ 
- 52週前の月曜日って何日？
- どうやって計算するの？

そんなこと、もう悩まなくて大丈夫。偉い人が考えていて「国際規格」にまとめてくれていて、各種プログラミング言語でも標準で使えるようになっています。

この記事は、その国際規格に合わせたコードを、**PHP ＋ MySQL ＋ Laravel** という環境で、コピペで使えるようにまとめたものです。


# ISO-8601 による 週番号

そもそも、馴染みがありませんが、1年を52週に割って、1月から番号を振ったものを「週番号」と言うそうです（そう言われればスケジュール帳には週番号が書いてあります）。
その週番号のカウント方法はいろいろあるのですが、いろいろあるとめんどくさいので、ISOがビシッと定めてくれています。

[ISO_8601#年と週と曜日](https://ja.wikipedia.org/wiki/ISO_8601#%E5%B9%B4%E3%81%A8%E9%80%B1%E3%81%A8%E6%9B%9C%E6%97%A5) (wikipedia)

ずばり、

- 月曜始まり 
- 1月4日を含む週が第1週（第1週には4日以上含む）

これを MySQL、PHP、Laravelでどう扱うか…。


# MySQL

[MySQL YEARWEEK() Function](https://www.w3schools.com/sql/func_mysql_yearweek.asp)

YEARWEEK関数の「モード3」です。

> 3 - First day of week is Monday and the first week has more than 3 days

とありますが、要するにこれが ISO-8601 ということ。
こうなります。

```sql
SELECT YEARWEEK( created_at, 3 ) AS week
```

# PHP

date には W を与えると週番号になります（単にWをそのまま出力したい場合は \W とエスケープする必要があります）。
strtotime では、年と週番号を W を挟んで `'yyyyWww'` という形式で与えます。たとえば `'2018W35'`。

```php
date('Y/m/d'); // 今日が 2018/08/29 だとすると…

date('Y\WW',strtotime("-0 weeks")); // 2018W35（1つ目のWはエスケープしてそのまま出力）
date('Y/m/d D',strtotime("2018W35"));  // 2018/08/27 Mon

date('Y\WW',strtotime("-52 weeks")); // 2017W35
date('Y/m/d D',strtotime("2017W35"));  // 2017/08/28 Mon
```

-0 weeks だと今日を含む週で、まだ7日経過していないません。
通常は集計対象から外して、集計期間を **-52週～-1週** を対象とします。


# Laravel

MyOrdersList という Eloquent モデルがあったとして…

```php
// 集計したい週数
$weeks = 52; 
// 開始日時をタイムスタンプにしておく
$start_time = strtotime(date('Y\WW',strtotime("-{$weeks} weeks")));

$result = MyOrdersList::select(
    DB::raw('YEARWEEK(created_at,3) AS week'), 
    DB::raw('sum(*) AS price')
)->whereRaw("created_at >= '".date('Y-m-d 00:00:00',$start_time)."'")
->groupBy('week')
->pluck('price','week')
->toArray();

// 歯抜けなしデータにしながらキーをY-m-d形式に
$filled_result = [];
for( $i=$weeks; $i>=1; $i-- ){
    $week = date('YW',strtotime("-$i weeks"));
    $date = date('Y-m-d',strtotime("-$i weeks"));
    $filled_result[$date] = isset($result[$week]) ? $result[$week] : 0;
}
return $filled_result;
```

```:return
=> [
     "2017-08-30" => 351,
     "2017-09-06" => 0,
     "2017-09-13" => 524,
     "2017-09-20" => 434,

     ......

     "2018-08-01" => 144,
     "2018-08-08" => 264,
     "2018-08-15" => 0,
     "2018-08-22" => 491,
   ]
```

# 感想

また誰得な記事が出来上がってしまいましたが…。ユーザーが一人でもいればいっか（自分を含めて）、と思うことにしています。

個人的には週始まりは月曜日派ですが、カレンダーは日曜始まりが多いことないですか？（iPhoneのカレンダーアプリも日曜始まり。これは確か言語と地域の設定による）きっとこれが、僕がカレンダーを全然めくらない理由に違いない。
Cookieとキャッシュとセッションの違いをまとめた

それぞれの違いについて
-----------

Cookieとは
--------

> Cookie（クッキー）とは、ホームページを訪問したユーザーの情報を一時的の保存する仕組み、またはそのデータです。
> ID、パスワード、メールアドレス、訪問回数などが ユーザー情報として保存されます。
> これによって再訪問したときに ユーザーを特定し、情報を入力する手間が省けます。
> ショッピングサイトに訪問したとき、すでにログイン状態になっている、以前カートに入れた商品がそのまま残っているのは、Cookie機能がはたらいているからです。

* Webページ(TwitterやFacebookなど)でログインした時の情報を保存して、入力する手間を省いてくれる仕組みのこと。
* ログインをしたあとの画面(URL)にログアウトしたあとアクセスするとエラー画面になる。ログイン状態を保つ仕組みでもある。
* `Cookie`内にはpasswordやuser_idなどがあるためセキュリティ上危険。そのため`セッション`により安全に情報を保持する。

セッションとは
-------

> セッションとは、一連のインタラクティブな操作のこと。
> 例えばECサイトには、商品を探し、カートに入れ、購入するという一連の流れがある。
> このように同一利用者からのアクセスを関連性のある一連のアクセスとして扱いたい場合、Cookieを使ってセッション管理が行われる。

* `Cookie`を使用した一連の操作のこと。 `Cookie` による`セッションID`の管理が行われる。
* Webサーバは`Cookie`を受け取ると格納された`セッションID`を元に、メモリ上にあるログイン状態を復元する。
* セッションIDによるやりとりにより安全性が高い。

キャッシュとは
-------

> キャッシュとは、閲覧したWeb ページの情報を一時的に保存する機能です。
> キャッシュデータを保存しておくと、2回目に同じWebページに訪問したときに表示するスピードが上がりより閲覧しやすくなります。

* 閲覧ページの情報(`キャッシュ`)を保存することにより、再度閲覧したページにアクセスする際のページの読み込みスピードを早める仕組みのこと。
* `セッション`により情報を管理しているため、ブラウザバックや「戻るボタン」により一つ前の状態に戻れていまう。ショッピングサイトなら、注文後一つ前に戻ると注文前の状態になり、再注文できてしまう。
* 誤動作しないようにキャッシュを無効化するなどして対策をする必要がある。

まとめ
------------------
* **Cookieとキャッシュ**は「ユーザ情報」なのか、「Webページの情報」なのかの部分に違いがあると理解しました。:thinking:

* **セッション**はCookieやキャッシュのいわゆる「固有のデータ」ではなく、「Webページ上(通販サイトなど)で操作したデータ(履歴)」であり、ユーザの情報(`Cookie`)を使用してログインの制御をする仕組みと理解しました。

to be continued...
------------------

実現される環境にも違いがあるようで、セッションはアプリケーション側で、CookieはブラウザとWebサーバの間でやり取りされる仕組みのようです。

参考文献
----
■ Cookieとキャッシュについて

* https://ferret-plus.com/6692

■ セッションについて

* https://qiita.com/mogulla3/items/189c99c87a0fc827520e
* https://thinkit.co.jp/story/2015/11/02/6565
* http://e-words.jp/w/%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3ID.html

■ 本

* プロになるためのweb技術入門
code_sniffer で「namespace 宣言のあとに 1 つの空行を記述してください。」

## Question

Sider（旧SideCI）の CodeSniffer で**空行を入れているのにグローバル名前空間の場合エラーが発生する**。

> [code_sniffer] namespace 宣言のあとに 1 つの空行を記述してください。
> There must be one blank line after the namespace declaration

```php:エラーが起きるパターン１
<?php
// 汎用のため明示的にグローバル名前空間に設置
namespace {

/* [Main] ============================================================== */

// コード
````
```php:エラーが起きるパターン２
<?php
namespace { // 汎用のため明示的にグローバル名前空間に設置

/* [Main] ============================================================== */

// コード
````

## Answer

**名前空間を明示的にグローバル名前空間にする**場合、`namespace` の後には２行入れないとパスしないらしい。何気にハマってしまった。ちょっと気持ち悪い。

```php:OKパターン１
<?php
// 汎用のため明示的にグローバル名前空間に設置
namespace {


/* [Main] ============================================================== */

// コード
```
```php:OKパターン２
<?php
namespace { // 汎用のため明示的にグローバル名前空間に設置


/* [Main] ============================================================== */

// コード
```

### SideCI.yml の設定

```yaml:sideci.yml
linter:
  code_sniffer:
    version: 3
    dir: ./
    options:
      extensions: php,inc
      standard: PSR2
      encoding: utf-8
```
.bash_profileの設定を間違えて、どんなコマンドも"command not found"になってしまったときの解決方法

# はじめに
サーバの設定をいろいろと変更しているときに、Linuxの環境変数を触っていました。
そのときに失敗してしまい、```ls```とか```vi```とか、標準的なコマンドを入力しても"command not found"になってしまいました。
その際に、実施した復旧方法を記載しています。

# 環境
- EC2
- Cent OS 7

# 対処方法①：rootユーザに切り替える

rootユーザに切り替えて、間違えて編集してしまった.bash_profileを修正する方法です。

```
$ su -
```

あとは使いたいコマンドのパスが通っているか確認します。

```
$ which ls
$ which vi
```

あとは、ゆっくり.bach_profileを修正します。

```
$ vi .bash_profile
```

編集し終わったら、.bash_profileを再読込します。

```
$ source .bash_profile
```

# 対処方法②：exportで各種コマンドを実行できるようにする

exportコマンドで$PATH（パス）を通します。

```
$ export /bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/home/(ユーザ名)/bin
```

上記のコマンドを実行すると、各種コマンドが使用できるようになっているはずです。
あとは、ゆっくり.bash_profileを修正し直します。

# あとがき

AWSの勉強中にやらかしました。
インスタンス削除して一からやり直さないといけないのか…？ってめっちゃ焦りました。

他にも方法はありそうですが、今回実施した2つの方法を記載しました。
Fujitsu ARROWS NX F-01F(4.4.2)の標準ブラウザでcalcの引き算ができない

※自分への備忘録として書いてます

Android4.4はcalcで足し算・引き算はできるはずなのですが、Fujitsu ARROWS NX F-01F(4.4.2)の標準ブラウザではバグがあり引き算してくれません。（足し算は未検証）
Android4.4だし標準ブラウザだしいいかな…と諦めたいところですが、かろうじて弊社は対応範囲の機種だったので、困りました…。

解決策としては

```
width: 125px; //Fujitsu ARROWS NX F-01F(4.4.2)の標準ブラウザ用
width: calc(100% - 30px);
```
と言った感じで、地道に計算したwidthを先に書いて、そのあとにcalcを書いてあげると問題なく対応範囲の機種全てで意図通り表示されました。
一つのreturn命令文で複数の値を返す方法

通常一つのreturn文では複数の値を返すことができない。
ただ**返す値を配列にしてあげる**ことで問題は解決する。

```php:ex.配列で返す)
//テストの点数配列を用意
$testScore = ['math' => '70',
              'japanese' => '60',
              'english' => '80',
              'history' => '50'
             ];

//returnで配列を返している
function grade($testScore) {
    $total = array_sum($testScore);
    $count = count($testScore);
    $median = $total / $count;
    $rate = ($total / '500') * '100'.'%';
    
    return array($total, $median, $rate);
}

$array = grade($testScore);
var_dump($array);
//array(3) { [0]=> int(260) [1]=> int(65) [2]=> string(3) "52%" }
```

因みに連想配列にして返すことも可能だ。

```php:ex.連想配列で返す)
....
function grade($testScore) {
    $total = array_sum($testScore);
    $count = count($testScore);
    $median = $total / $count;
    $rate = ($total / '500') * '100'.'%';
    
    return array('total'  => $total, 
                 'median' => $median,
                 'rate'   => $rate
                );
}

$array = grade($testScore);
var_dump($array);
//array(3) { ["total"]=> int(260) ["median"]=> int(65) ["rate"]=> string(3) "52%" }
a-blog cmsで、URLクエリパラメータをグローバル変数にする

URLに付与されたクエリパラメータを、個別にグローバル変数にする。

参考：[フック処理](https://developer.a-blogcms.jp/document/user_hook/)

まず、config.server.php の HOOK_ENABLE を1にしてフック拡張を有効にする。

```
define('HOOK_ENABLE', 1);
```

次に、a-blog cmsインストールディレクトリのextension/acms/Hook.phpを開いて、「グローバル変数の拡張」の部分を編集する。

```
public function extendsGlobalVars(&$globalVars)
{
	$url_params = $_SERVER['QUERY_STRING'];//URLクエリパラメータの取得
	parse_str($url_params, $param_array);//配列に
	foreach ($param_array as $key => $value) {//キーを変数名にして値を設定
		$globalVars -> set(strtoupper($key), $value);
	}
}
```
Deep Temporal Linear Encoding Networksを読んだ

Deep Temporal Linear Encoding Networks [A. Diba+, CVPR17]
-[CVF](http://openaccess.thecvf.com/content_cvpr_2017/papers/Diba_Deep_Temporal_Linear_CVPR_2017_paper.pdf)
# 1.どんなもの？
時間的リニアエンコーディング（TLE）と呼ばれる新しいビデオ表現を提示

# 2.先行研究と比べてどこがすごいか？
動画像全体をコンパクトな特徴にエンコードできること
TLEをビデオ分類のための2Dおよび3DCNNのようなあらゆる種類のネットワークに適用可能なこと
可変長の動画像データセットを使用可能
![スクリーンショット 2018-09-18 4.45.20.png](https://qiita-image-store.s3.amazonaws.com/0/249838/6155fb11-0374-d17c-ab4b-3d9e4fa88bad.png)


# 3.技術や手法の肝はどこにあるか？
長時間の時間構造から重要な情報をフレームからキャプチャし、リニアエンコーディングによってコンパクトで堅牢な特徴表現に集約する(高次元から低次元に変換する)
可変長の動画像全体を使うため認識精度が良い(これまで固定長の動画像)
特徴マップを時間集約関数を用いることで１つの特徴マップXを生成
特徴マップXをエンコードして特徴ベクトルyを得る
![スクリーンショット 2018-09-18 4.03.44.png](https://qiita-image-store.s3.amazonaws.com/0/249838/75c0eb50-ee52-42d7-4b6c-c1f29bd3d070.png)
３パターンの方法で実験した結果、乗算の方法が一番いい結果をもたらした![スクリーンショット 2018-09-18 4.16.36.png](https://qiita-image-store.s3.amazonaws.com/0/249838/8db33f79-ae3b-aaf9-4d2a-9c204b539109.png)
線形符号化(EncodingMethod)の方法としてBilinearモデルとFully connected poolingがある
End-to-End学習の簡略図↓![スクリーンショット 2018-09-18 4.23.07.png](https://qiita-image-store.s3.amazonaws.com/0/249838/938e112e-e85f-f63c-943f-abd181edc72b.png)


# 4.どうやって有効だと検証した？
・HMDB51とUCF101データセットで実験
・Two-Stream ConvNetsとC3D ConvNetsで比較検証
Two-Stream ConvNetsでの時間集約関数の比較
![スクリーンショット 2018-09-18 4.57.08.png](https://qiita-image-store.s3.amazonaws.com/0/249838/27ec9116-fd04-2345-c35e-22c50f5f0b2a.png)
C3D ConvNetsでの時間集約関数の比較
![スクリーンショット 2018-09-18 5.00.52.png](https://qiita-image-store.s3.amazonaws.com/0/249838/22082c2c-b654-e2df-62aa-be65bd397d65.png)
乗算を使ったTLEを組み込んだConvNetsでの性能比較
![スクリーンショット 2018-09-18 5.02.32.png](https://qiita-image-store.s3.amazonaws.com/0/249838/2975fc0a-d78b-1b21-0562-4812a863d284.png)

![スクリーンショット 2018-09-18 5.02.42.png](https://qiita-image-store.s3.amazonaws.com/0/249838/da6375cc-5520-d90b-9687-cece4693ea77.png)
「ポリモーフィズムって何？」をRubyを使って説明してみた

##はじめに
[『オブジェクト指向でなぜつくるのか』](https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A7%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%AE%E3%81%8B-%E7%AC%AC2%E7%89%88-%E5%B9%B3%E6%BE%A4-%E7%AB%A0/dp/4822284654/ref=sr_1_1?ie=UTF8&qid=1537195482&sr=8-1&keywords=%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%A7%E3%81%AA%E3%81%9C%E3%81%A4%E3%81%8F%E3%82%8B%E3%81%AE%E3%81%8B)を読んでいて、オブジェクト指向の三大要素の一つである、<br><strong>ポリモーフィズム</strong>についてがいまいち理解できなかったので、Rubyを使って私なりにまとめてみました。
##ポリモーフィズムとは
書籍では以下の説明でした
>メソッドを呼び出す側を共通化する

「・・・・・・？？」
さっぱりわからなかったので、ネットで調べてみたところ以下の説明に行き着きました。
>同じメソッドでも継承したサブクラスによって振る舞いが異なる

なんとなくはイメージができるのですが、まだ納得し辛いので、Rubyを使って動きを見てみます。

##Rubyで見てみる
```ruby:sample.rb
class Animal
  attr_accessor :name

  def cry(voice='')
    "#{self.name}: #{voice}"
  end
end

class Dog < Animal
  def cry(voice='わんわん')
    super
  end
end

class Cat < Animal 
  def cry (voice='にゃーにゃー')
    super
  end
end

dog = Dog.new
dog.name = 'ポチ'

cat = Cat.new
cat.name = 'タマ'

dog.cry     #=>ポチ: わんわん
cat.cry     #=>タマ:　　　にゃーにゃー
```

どうでしょう？
dog1もcat1も同じcryメソッドを受けているのに、振る舞いが異なっていることがわかります。

##参考
[ポリモーフィズムを優しく解説します](http://variable-fixed.hatenablog.com/entry/2017/01/17/170747)
[ポリモーフィズム(多態性)ってなんだよ【Ruby】](https://qiita.com/kansiho/items/ffb765a87a5fb93e498c)
simple modal

シンプルなモーダルウインドウです。

```html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="viewport" content="width=device-width">
<title>Document</title>
<script src="http://code.jquery.com/jquery-3.2.1.js"></script>
<script src="scripts.js"></script>
<style>
*,
*::before,
*::after {
  box-sizing: inherit;
}
html {
  box-sizing: border-box;
}

.modal {
  position: absolute;
  overflow: hidden;
  visibility: hidden;
  width: 0;
  height: 0;
  margin: 0;
  opacity: 0;
  transition: opacity 0.3s ease;
}
.modal.is-show {
  z-index: 99;
  overflow: visible;
  visibility: visible;
  opacity: 1;
}
.modal-overlay {
  position: fixed;
  top: 0;
  left: 0;
  width: 100vw;
  height: 100vh;
  background-color: rgba(0,0,0,0.4);
  cursor: pointer;
}
.modal-window {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%,-50%);
  display: inline-block;
  width: 90%;
  max-width: 940px;
  padding: 20px;
  border-radius: 5px;
  background-color: #fff;
}
.modal-body {
  max-height: calc(90vh - 40px);
  overflow-y: auto;
}
.modal-close {
  position: absolute;
  top: 0;
  right: 0;
  cursor: pointer;
}

</style>
<script>
$(function() {
  $('[href^="#modal-"]').on('click', function(e) {
    var $modal = $($(this).attr('href'));
    $modal.addClass('is-show');
    $modal.find('.modal-close,.modal-overlay').on('click', function() {
      $modal.removeClass('is-show');
    });
    e.preventDefault();
  });
});

</script>

</head>
<body>

<p><a href="#modal-01">modal-01 open</a></p>

<div id="modal-01" class="modal">
  <div class="modal-overlay"></div>
  <div class="modal-window">
    <div class="modal-close">x</div>
    <div class="modal-body">
      <p>
      モーダル<br>
      モーダル<br>モーダル<br>モーダル<br>モーダル<br>モーダル<br>モーダル<br>モーダル<br>モーダル<br>モーダル<br>モーダル<br>モーダル<br>モーダル<br>モーダル<br>モーダル<br>モーダル<br>
    </div>
  </div>
</div>

</body>
</html>
```

以上
GASでパターン網羅を作る

Google Apps Scriptを利用してスプレッドシートに改行付きでまとめられた表を分解して組み合わせパターン網羅表を作ることになったときのためのTips。


### 今回のゴール
シート１で一行ごとにCaseAとCaseBの改行をそれぞれ配列にしてAとBの組み合わせ網羅表をシート２に作る。
<img width="360" alt="スクリーンショット 2018-09-18 2.29.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/26911/fb1679b9-45c2-527e-0a7b-0412b4ce35d1.png">

### スクリプトエディタを開く
「ツール」→「スクリプトエディタ」で開けます



### 実際のコード
```javascript
function myFunction() {
  var bk = SpreadsheetApp.getActiveSpreadsheet();
  var sheet1 = bk.getSheetByName("シート1");
  var sheet2 = bk.getSheetByName("シート2");
  var data = sheet1.getRange("A:A").getValues();
  var counter = 0;
  
  for(var i =1;i<data.length;i++){
    if(sheet1.getRange(i+1, 1).getValue() != ""){
      var a_arr = getCaseA(sheet1,i);
      var b_arr = getCaseB(sheet1,i);
      for(ai in a_arr){
        for(bi in b_arr){
          counter++;
          sheet2.getRange(counter+1,1).setValue(counter);
          sheet2.getRange(counter+1,2).setValue("【CaseA】"+a_arr[ai]+ String.fromCharCode(10) +"【CaseB】"+b_arr[bi]);
        }
      }
    }    
  }
}

function getCaseA(sheet,target){
  return sheet.getRange(target+1,2).getValue().split(/\r\n|\r|\n/);
}

function getCaseB(sheet,target){
  return sheet.getRange(target+1,3).getValue().split(/\r\n|\r|\n/);
}
```

実行は再生ボタンを押せば動きます。

### シート２の結果
期待したとおりの結果が表示されました。
<img width="201" alt="スクリーンショット 2018-09-18 2.38.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/26911/bd232ba8-4ce2-5a4e-29a3-a439ae926a55.png">

`getValues`使えばもっと簡略化できそうな気もしなくもないですが。。。
それはまた今度時間ができたときゆっくり見ます。
Apacheのプロキシ機能を使って特定のパスのみTomcatへ連携(AJP連携)する

Apache/Tomca連携で調べたことをメモっておく（特に目新しい内容はないけど・・・）。

# 前提

* 特定のパス（例：`/hello`)のみTomcatに連携し、それ以外のパス(HTML、CSS、JavaScriptなどの静的コンテンツ)へのアクセスはApacheのドキュメントルートにあるファイルを応答
* Tomcatアプリにはコンテキストパスがある（例：`/app`）
* Tomcatへの連携はAJP経由で行う（HTTPではなくAJPを使う理由は特に触れないw）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/23f3cf49-aba0-aff0-49fd-f2ff986ee01d.png)


# Apacheの設定

Apacheに以下の設定を追加する。

```
# コメントアウトされている場合はコメントを除去
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so

# ...

# リバースプロキシの設定
ProxyRequests Off
ProxyPass /hello ajp://ap:8009/app/hello
# レスポンスヘッダー値からコンテキストパスを除去
ProxyPassReverse / /app/
# クッキーパスの書き換え
ProxyPassReverseCookiePath /app /
```

# 検証アプリ

* https://github.com/kazuki43zoo/apache-spring-boot-demo

バックエンドアプリをSpring Boot(組み込みTomcat)で作っていることに特に意味はなし。単にTomcatインストールして・・・設定追加して・・・とかが面倒だっただけ。実際・・・調べた内容を反映することになる実アプリは・・・Spring Bootアプリじゃない(ってかSpringも使ってない)w

でもって、検証アプリでは以下の動作を検証した。

## Apache管理のリソースへのアクセス

単純にApacheのドキュメントルート内で管理しているリソースへアクセスしてみる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/777f4ad4-4e4b-deca-a20d-7d4a2840abd8.png)

## Tomcat管理のリソースへのアクセス

Apache経由でTomcatで管理しているリソースへアクセスしてみる。リバースプロキシの確認をするために意図的にリダイレクトしている。なお、Springのフラッシュスコープを使うことでセッション（＝クッキー）連携の検証も行っている。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/cf959ba0-633a-40ac-c076-026f4894e045.png)

## TomcatからApache管理のリソースへのリダイレクト

念のため・・・実アプリのエラーパターンも確認しておく。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117313/30eb9256-4cb9-85b1-e6d8-3e057189242b.png)

# 補足

リバースプロキシの設定はヘッダー値の書き換えは行うが、レスポンスBODY内にあるURLの書き換えは行われない。
レスポンスBODYの中にあるコンテキストパスを除去する場合は・・・

* mod_substitute
* mod_actions
* mod_ext_filter
* mod_proxy_html

などを使う必要があるが、今回は未検証。
GLSLのビルトイン関数をContainerにしてノーディングを捗らせる

![TouchDesigner_ C__Users_02oz_Documents_TouchDesigner_github_PixelStorm_Examples_RotateCircle.toe 2018_09_18 1_25_30.png](https://qiita-image-store.s3.amazonaws.com/0/152718/b357809f-1d89-22b1-3d63-ffdddf64f71d.png)

TouchDesigner用のGPU Particleライブラリをアップデートしました。
ソースは[ここ](https://github.com/ToyoshiMorioka/PixelStorm)。
今回の大きな変更点はGLSLのビルトイン関数を用意したことです。
UnityのShader Graph然り、GLSLを直接打ち込むのではなく、ノードで編集することはメジャーになってきており、TouchDesignerもTOPはほぼGPUに最適化されているため、Shader Graphのように最適化はされないものの、ある程度ノードだけで同じようなことができます。
ただ、CHOPほど計算系のオペレータが多くないため、四則演算と画像バッファ全体にかける計算（Math TOPやLevel TOP）以外はGLSLを記述する必要がありました。
そこでOpenGLの定義している主なビルトイン関数をContainer化しました。
これでTouchDesigner上で簡易Shader Graphができます。
Shader Graphと違って一枚のShaderにはなっていないため、効率は落ちますが、これでプロトタイピングしたあとに1枚のShaderにまとめなおすのはそれほど難しくないと思います。
抜けてる関数があればご連絡ください。
Discardが入れれば最高なんですが、TouchDesignerの構造上難しいですね・・・。
カルマンフィルタのPython実装

# 概要
線形カルマンフィルタをPythonのnumpyパッケージを用いて実装します。

参照したプログラムは、[Artificial Intelligence for Robotic](https://www.udacity.com/course/artificial-intelligence-for-robotics--cs373)のLesson 5.6で課題として提出されているもので、mathパッケージを使用していました。
有名な課題なので、類似したプログラムは、ネットで検索すれば幾らでも出てきます。本記事とほぼ同じもの多く、本記事の解説は屋上屋を重ねているだけとも言えます。

[Artificial Intelligence for Robotic](https://www.udacity.com/course/artificial-intelligence-for-robotics--cs373)がどのようなものかについては、以下をご参照ください。

[カルマンフィルタを避けてきた社会人プログラマが自動運転の勉強を始める際の最短経路](https://qiita.com/nnn112358/items/9a9891619e755bee5d4b)

# 実装
以下は、2次元を移動する物体の位置と速度を追跡するプログラムです。
状態は2次元座標と2次元速度を並べた$(x, y, \dot x, \dot y)$の4次元状態です。

計測は位置だけを取得でき、速度は計測不能とします。ここでは0.1秒間隔で6回計測したとします。

$P$は共分散行列で、この値が大きいほど予測が広く分布し、値の精度が悪いことになります。
$F$は状態遷移行列です。次の時刻での状態を求めるのに使用します。
$H$は観測行列です。観測値は位置だけなので、4次元状態から位置だけを抽出する役割を持ちます。
$R$はノイズです。計測結果はノイズにより不確かなものとなります。

カルマンフィルタは予測の不確かさと、計測の不確かさを共に減らし、より精度の良い予測値を導出することができます。
（ただし、4次元状態、遷移確率、計測の3つがガウス分布に従うという条件がつきます。）

以下のプログラムでは6回の計測後の、位置と座標の予測値を出力します。

```python:KalmanFilter.py
import numpy as np

measurements = [[7., 15.], [8., 14.], [9., 13.], [10., 12.], [11., 11.], [12., 10.]] #位置[x,y]の計測結果
initial_xy = [6., 17.] #初期位置

dt = 0.1 #計測間隔

x = np.array([[initial_xy[0]], [initial_xy[1]], [0.], [0.]]) # 初期位置と初期速度を代入した「4次元状態」
u = np.array([[0.], [0.], [0.], [0.]]) # 外部要素

P = np.array([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 100., 0.], [0., 0., 0., 100.]]) # 共分散行列
F = np.array([[1., 0., dt, 0.], [0., 1., 0., dt], [0., 0., 1., 0.], [0., 0., 0., 1.]])  # 状態遷移行列
H = np.array([[1., 0., 0, 0], [0., 1., 0., 0.]])  # 観測行列
R = np.array([[0.1, 0], [0, 0.1]]) #ノイズ
I = np.identity((len(x)))    # 4次元単位行列

def kalman_filter(x, P):
    for n in range(len(measurements)):       

        # 予測
        x = np.dot(F, x) + u
        P = np.dot(np.dot(F, P), F.T)
        
        # 計測更新
        Z = np.array([measurements[n]])
        y = Z.T - np.dot(H, x)
        S = np.dot(np.dot(H, P), H.T) + R
        K = np.dot(np.dot(P, H.T), np.linalg.inv(S))
        x = x + np.dot(K, y)        
        P = np.dot((I - np.dot(K, H)), P)
        
    x = x.tolist()
    P = P.tolist()
    return x,P


print("6回の計測後の位置と速度の予測値：",kalman_filter(x, P)[0])
```

例えば、上のプログラムを実行すると以下を得ます。

```
6回の計測後の位置と速度の予測値： [[11.993413830954994], [9.623490669593853], [9.989023051591657], [-12.294182217343579]]
```

得られた予測値は、6回目の観測値$[12,10]$よりわずかに下方へ修正されています。
速度は10分の1にして0.1秒単位で計算すると、x方向に約1で、y方向に約-1となっており、観測値の変化から推測できる値に近い結果が出ています。
Convolutional Networks with Adaptive Inference Graphsを読んだ

Andreas Veit, Serge Belongie
[arxiv](https://arxiv.org/abs/1711.11503), [pdf](https://arxiv.org/pdf/1711.11503.pdf)

#1.どんなもの？
クラス数が増えるにしたがって層の数もどんどん増えていっているが，異なるクラスにとっては必要のない層を多く含んでいる．
そこでこのネットワークはクラスの認識に必要な層のみを使用する．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/252474/347fe138-b8ca-4219-df2c-0a5334a5d4b1.png)

#2.先行研究と比べてどこがすごいの？
クラスの認識に必要な層のみを実行することで計算時間も短縮でき，不要な層を介さないので精度も向上している．

#3.技術や手法のキモはどこにあるか？
一般的なレイヤーの関係は次式のように表せる．

$$X_l=F_l(X_{l-1})$$
ResNetはレイヤーをスキップするパスを持っていて次式のように表すことができる．
$$X_l=X_{l-1}+F_l(X_{l-1})$$
提案するレイヤーは次のような式で表せる構造になっている．
$$
X_l=X_{l-1}+z(X_{l-1})\cdot F_l(X_{l-1})\\\
where z(X_{l-1})\in {0,1}
$$

$z(X_{l-1})$は次のレイヤを実行するかを決定するゲートで，離散的である必要があるが学習時には勾配が必要になるので，Gumbel-Max trickとsoftmax relaxationを用いて実現する．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/252474/580cd79d-a3c0-a470-3478-5243a706cc1a.png)

特徴マップに最大値プーリングを行い得られたものを2層のFC層を通すことで関連性スコアを推定する．
順伝播の時は推定されたスコアのargmaxから離散的な結果を得ます．
逆伝播の時はsoftmaxによって勾配を得ることができる．

#4.どうやって有用だと検証した？
##ImageNetを使用してResNetと比較
![image.png](https://qiita-image-store.s3.amazonaws.com/0/252474/3f2f0450-e317-5c8a-9eef-762683d4aa7f.png)
結果より，同じ構造のResNet以上の性能を出していることがわかる．
また，レイヤーの使用率を下げることで処理速度が向上していることがわかる．

![image.png](https://qiita-image-store.s3.amazonaws.com/0/252474/3b4c5482-45cb-a998-11cc-4b8403a118c8.png)
上図はカテゴリごとにどのようにレイヤーを使用しているかを視覚化したものである．
カテゴリごとに特徴があることがわかる．
図の左側から，入力側の初めの層はカテゴリとの関係性がないことが判明したので，101層モデルでは入力側の層は常に使用するようにしている．


##少ない層で済んだ画像とたくさんの層を使用した画像の例
![image.png](https://qiita-image-store.s3.amazonaws.com/0/252474/1145396c-c656-df12-2292-4e3bb3f1ce61.png)
画像に全体がうまく写っているものは少ない層で推定が行えている．
逆に対象が小さかったり一部しか写っていないとたくさんの層を必要とした．

##adversarial attacksに対する検証
![image.png](https://qiita-image-store.s3.amazonaws.com/0/252474/ae286dcf-abe4-b4cf-fca5-ddb6eb610ae1.png)
左のグラフは敵の強さ横軸に対する精度縦軸を表したもので，ResNetと比較して頑健であることがわかる．
右のグラフは層の使用率を表したもので，あまり差が見られなかった，これはもともとノイズを付与しているので追加のノイズの影響が少なかったと考えられる．

#5.議論はあるか？
敵対的攻撃に強いことがわかったが，ゲートを対象とした攻撃について調べると面白いかもしれない．
Google Cloud Speech APIを使ってみた！

# はじめに

少し前にGoogle Cloud Speech APIを使って色々ハマったので内容をまとめておきます。
ホントはもっと色々やってから書こうと思ったのですが、違う技術に目移りしてしまって…

HelloWorldぐらいのレベル感なので、半日もあれば「音声ファイルをテキスト変換できる」ようになるかと思います。
※GCPのアカウントは持っている前提です。

# ① Storageを作成する

ここはあまり悩まないはず。
Storageから「バケットの作成」で以下設定にする

1. 名前はなんでも良いです（あとあと${bucket}に当て込んでください）
2. ストレージクラスはRegionalを利用
3. リージョンは、us-west1（米国）を利用
4. 鍵はgoogle管理

※※ちなみに[Cloud Storageの料金](https://cloud.google.com/storage/pricing?hl=ja)を見るとタダで使うにはこの２点を守ればよさそう。
試してはいないのであっているかはわかりません。
・ Regional Storage 5GBまで無料
・ リージョンは`us-west1`、`us-central1`、`us-east1`のみ

# ② Cloud Speech API を設定

以下設定を行う。

1. Cloud Speech APIの有効化：ナビゲーション メニュー＞APIとサービス＞ライブラリ
   1. Cloud Speech API を検索
   2. 「有効にする」を選択（「無効化する」となっていれば放置していい）
2. API キーの作成：ナビゲーション メニュー＞APIとサービス＞認証情報＞認証情報を作成（APIキー）
   1. 名前は適当
   2. アプリケーション制限
      1. なし
   3. API制限
      1. 「Cloud Speech API」のみ
3. できたAPIキーをメモしておく（あとあと${api_key}に当て込んでください）

※※ちなみに、ここのやり方を「サービスアカウントキーを作成」としても大丈夫です。最後のリクエスト情報とAPIの叩き方が変わるのみです。

# ③ 音声ファイルをアップロード

**★★ハマりポイント：音声ファイルの形式が違うと「空ファイル」になるので注意**

僕はMacを利用していて**「ffmpeg」**というツールを利用して音声変換を実施。
Quick Time Player で「新規オーディオを作成」で作成した音声を以下コマンドで変換。

```
## ffmpegインストール
brew install ffmpeg
## 変換
ffmpeg -i "input-audio.m4a" -vn -ar 16000 -ac 1 -acodec flac -f flac "output-audio.flac" `
```

よくわかっていないですが、後で出てくる設定ファイルに合わせて色々変換をかける感じ。
サンプルレートヘルツ？を16000へ、エンコード？をflacへ変換する。

変換した音声ファイルを、Storageへアップロードする。
ブラウザからアップロード（${bucket}/audio/へアップしました）

# ④音声ファイルを読み取り可能にする

**★★ハマりポイント：デフォルトで読み取り不可になっていて以下エラーが出続けるので注意**

```
{
  "error": {
    "code": 403,
    "message": "The caller does not have permission",
    "status": "PERMISSION_DENIED"
  }
}
```

Google Cloud Shellを利用して、読み取り権限をつける

1. Google Cloud Shell の実行
   1. Homeの右上に起動ボタンがあるので押下（「Cloud Shellをアクティブにする」と出るやつ）
2. 以下コマンドを実行（${bucket}はよしなに変えてください）
   1. `gsutil acl ch -u AllUsers:R gs://${bucket}/audio/output-audio.flac`

# ⑤ Speech APIを実行

Macのターミナルから実行可能。
request 情報をjsonで用意して、API（curlコマンド）を叩く

```
$ cat request.json
{
  "config": {
      "encoding": "FLAC",
      "sampleRateHertz": 16000,
      "languageCode": "ja-JP",
      "enableWordTimeOffsets": false
  },
  "audio": {
      "uri":"gs://${bucket}/audio/output-audio.aifc"
  }
}
$ curl -s -X POST -H "Content-Type: application/json" --data-binary @request.json "https://speech.googleapis.com/v1/speech:recognize?key=${api_key}"
```

※※ちなみに、**「無料は月1時間」**となっているらしいので使いすぎには注意

# おわりに

ひたすらに③、④でハマりました。
PHPerがElixir + Phoenixの環境を構築する

## 概要
バックエンドのプログラムの学習としてElixirを使ってアプリケーションを作って見ようと思います。
そこで、Elixirについて勉強してみたことをまとめていきます。

※しばらく凍結していたものを動かしたので情報は古めです。

## Elixirとは
ElixirはErlangのVM上で動作する関数型言語です。
Elixirの特徴は以下となります。

* スケールしやすい
* 耐障害性が高い(フォールトトレラント)
* 関数型プログラミング
* 拡張しやすい

## 環境構築
1. Erlang関係のパッケージを導入

```Bash
sudo yum install ncurses ncurses-devel openssl openssl-devel gcc-c++ unixODBC unixODBC-devel fop *openjdk-devel inotify-tools
```

2. 作業ディレクトリ作成＆移動

```Bash
mkdir work
cd work/
```

3. Erlangの最新コード(2017/01/14時点で19.2)をダウンロードして解凍

```Bash
wget http://erlang.org/download/otp_src_19.2.tar.gz
tar -zxf otp_src_19.2.tar.gz
```

4. ビルド＆インストール

```Bash
cd otp_src_19.1/
./configure
make
sudo make install
```

5. Erlangが入ったか確認

```Bash
erl -version
```

6. Elixirのソースコードをダウンロード＆解凍（解凍は/opt/elixirに）

```Bash
cd ..
wget https://github.com/elixir-lang/elixir/releases/download/v1.4.0/Precompiled.zip
sudo unzip Precompiled.zip -d /opt/elixir
```

7. PATHに追記して再起動

```Bash
sudo vim ~/.bash_profile
   (以下追記)
   export PATH=/opt/elixir/bin:$PATH
sudo reboot
```

8. Elixirが入ったか確認

```Bash
$ elixir -v
```

9. パッケージ管理ツールHexを標準ビルドツールmixでインストール

```Bash
$ mix local.hex
```

10. WebフレームワークPhoenixをmixでインストール

```
$ mix archive.install https://github.com/phoenixframework/archives/raw/master/phoenix_new.ez
```

これで一先ずインストールは完了です。

## アプリケーションの準備

アプリケーションを構築します。
このとき、DBを指定しないとPostgreSQLがインストールされます。
  
```Bash
mix phoenix.new elixir_blog  --no-brunch --database mysql
```

![スクリーンショット 2018-09-14 0.01.29.png](https://qiita-image-store.s3.amazonaws.com/0/39671/6ef0f750-55d4-9eae-71d6-2bf70655e601.png "スクリーンショット 2018-09-14 0.01.29.png")

インストールが完了すると、上記画面が表示されます。
このまま、 `mix phoenix.server` を実行しても、DBがなくエラーとなります。そのため、次はDBを構築します。

DBを構築するため、`mysql` にDBを作ります。

```Bash
$ mix ecto.create
The database for ElixirBlog.Repo has been created
```

これで立ち上げる準備が整いました。  
では、Phoenixを立ち上げます。

```
$ mix phoenix.server
[info] Running ElixirBlog.Endpoint with Cowboy using http://localhost:4000
```

`http://localhost:4000` にアクセスするとデフォルトの画面が表示されます。

![スクリーンショット 2018-09-18 1.26.28.png](https://qiita-image-store.s3.amazonaws.com/0/39671/94cfe669-63b3-8f83-6bfc-87255e0fbd6a.png "スクリーンショット 2018-09-18 1.26.28.png")


これで環境構築はできました。
これから開発していこうと思います。

以上、最後まで読んで頂きありがとうございました。

## 参考
* [Phoenix + Vue.js入門](https://qiita.com/koga1020/items/c02a0fd5ae11fb5da1e0)
* [【入門】Elixir + Phoenix + MySQL で API サーバ](https://qiita.com/yyh-gl/items/6b4d07c256d1bf3e7eb8)