OmniAICreator/Qiita-1.07M huggingface dataset:
Sassのmixinで引数の順序に依存せず特定の値を変更する

Sassのmixinには複数の引数を持たせることができます。  
例えば以下の例では、引数なしで角丸のボックスを、引数に値を順番に指定することで引数の順序通りに値を上書きすることができます。

```scss
// scss
@mixin box($width: 10px, $height: 10px, $radius: 3px) {
  width: $width;
  height: $height;
  border-radius: $radius;
}

.foo {
  @include box();
}
.bar {
  @include box(100px, 100px, 50%);
}
```

```css
/* CSS */
.foo {
  width: 10px;
  height: 10px;
  border-radius: 3px;
}

.bar {
  width: 100px; /* 変更 */
  height: 100px; /* 変更 */
  border-radius: 50%; /* 変更 */
}
```

では、角丸の値だけを変えたい場合はどうすればいいんでしょうか？`box(10px, 10px, 50%)`のようにデフォルト値を渡すしかない？  
検索するとMap形式の変数や可変長引数を使う方法がありましたが、ちょっとややこしい。

そこで[Sassの公式ドキュメント](http://sass-lang.com/documentation/file.SASS_REFERENCE.html#Keyword_Arguments0)を見ていると以下のような箇所がありました。

> Named arguments can be passed in any order, and arguments with default values can be omitted. Since the named arguments are variable names, underscores and dashes can be used interchangeably.

要約すると、

- 「名前付きの引数（`$radius`など）は任意の順序で呼び出すことができる
- `$height: 10px;`のようにデフォルト値が設定されている引数は省略できる

つまり、以下のように値だけでなく、名前付きの引数ごと指定してあげれば引数の順序に関係なく値を変更することができます。

```scss
// scss
.baz {
  @include box($radius: 50%);
}
```

```css
/* CSS */
.baz {
  width: 10px;
  height: 10px;
  border-radius: 50%; /* 変更 */
}
```

もしくは、最初の引数と最後の引数だけを変更するということもできます。

```scss
// scss
.qux {
  @include box(100px, $radius: 50%);
}
```

```css
/* CSS */
.qux {
  width: 100px; /* 変更 */
  height: 10px;
  border-radius: 50%; /* 変更 */
}
```
Array要素の削除に$null代入するとビックリすることがある

# 概要

PowerShell の配列の要素を削除する際、「要素に `$null` を書き込む」と解説してあるサイトをよく見かける。ある意味において間違いではないが、「配列要素の**切り詰め**＝対象に `$null` 代入」と記憶していると処理後の配列について直感と異なる結果が返るので記録しておく。

# 環境

```PowerShell:バージョン情報
PS> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.15063.502
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.15063.502
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
```


# 実験

適当な配列を与え、その 0 番目の要素に `$null` を書いてみる。

```PowerShell:RemovingArrayElementTest.ps1
PS> $array = (1..10)
PS> foreach ($i in $array) { $a += $i }
PS> $a
55

PS> $array.Length
10

PS> $array[0] = $null
PS> $a = 0
PS> foreach ($i in $array) { $a += $i }
54
```

一見すると 0 番目の要素であった 1 が「なくなった」ように見える。
しかし、

```PowerShell:RemovingArrayElementTest(cont'd).ps1
PS> $array.Length
10 # 「 9 じゃないの!?」

PS> $array[1]
2 # 「 3 じゃないの!?」
```

「要素を削除した」にもかかわらず、次のようになっていることがわかる。

* 配列の長さが変わらない
* 配列の要素が詰まって（シフトして）いない


# 何が起きているのか

その答えはこちら[^perf] に書いてあった。

> `+=演算子` で文字列の追加を行う場合に、PowerShell の `@()` による `Array` は固定長なので配列をいちいち作り直します。

PowerShell の配列は**固定長**である。したがって配列の長さを変えられないのが仕様であった。

ではさっきのテストコードにおいて、 `$array[0]` はどうなっているのだろう。

```PowerShell:RemovingArrayElementTest(cont'd2).ps1
PS> $array[0] -eq $null
True
```

当たり前だが、自ら行った操作通り `$null` であった。したがって `$array` は `$null` を先頭に残りが 2 から 10 の整数が格納された、長さ 10 の配列であることがわかる。

当初のテストコードのように、 `$null` が要素に含まれる配列をイテレータとして利用する分には問題ない。一方で、 Length や Count で配列の長さを取得し、条件分岐等に使うケースでは問題になり得る。

# `$null` 要素を取り除く

フィルターとしての `-ne` を使って、次のように実現できる。

```PowerShell:RenewArray.ps1
PS> $newarray = $array -ne $null
PS> $newarray.Length
9
```


# 結論

* `@()` で定義される Array は固定長である
* 配列要素に `$null` を書き込むと：
  * イテレータとしては直感通り動作する
  * 長さが問題になるケースでは注意が必要

# 補足

参考文献[^perf] にあるとおり、 Array の要素を増減させるには配列を作り直して再度代入する必要があるため、計算コストが高い。配列の要素が頻繁に増減する環境では、代わりに（固定長ではない） ArrayList や List を使う方が計算コストを低くできる。


# 参考文献

[^perf]: [PowerShell の +=演算子 パフォーマンス と その回避方法 - tech.guitarrapc.cóm](http://tech.guitarrapc.com/entry/2013/09/22/100203)
【Java】Selenium2で新規タブを開いたときのお話

はじめましてtsuttieです(*'▽')
Seleniumを使って色々としましたので、まとめていければと思ってます。


#1. Selenium2を使ってみて
Webアプリのテスト自動化を目的としてSelenium2を使ったので詰まった点を数回に分けてまとめて行きたいと思います。
#2. 使用したSelenium
・Selenium IDE
・Selenium Webdriver (Java 3.5.0)
※導入方法についてはわかりやすくまとめていらっしゃる方が多くおりますので、そのあたりのお話は省きます。
#3. 【本題】新しくタブを開いたときに動作が止まる
　Selenium2を使っていて最初に躓いたのは新規タブを開いたときでした。
　クリックしたときに現在のタブではなく新規でタブ開くリンクを踏んだときに操作不能になるんです。色々検証してわかった原因としては、新しいタブは開いたときにハンドルは古いタブに向いているということ。画面上では新しいタブを見てる分、少しわかりにくかった・・・(/o＼)

解決方法としては、
**新しいタブにハンドルを移す！**
これだけでした。

とは言っても大体の場合処理をした後に元のページに戻るので元のページのハンドルを保持させたりくらいはしないといけないとは予想されますが・・・
とにかく原因さえわかれば調べるだけ！！

以下の処理で解決することが出来ました。

```java:HandleTest.java
package ~;

import java.io.IOException;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;

public class HandleTest {

	private WebDriver driver;

	@Before
	public void setUp() throws Exception {
		System.setProperty("webdriver.gecko.driver", "./geckodriver.exe");
		driver = new FirefoxDriver();
	}

	@After
	public void tearDown() throws Exception {
		driver.quit();
	}

	@Test
	public void test() throws InterruptedException {

		try {
			//元のページのハンドルを記憶
			String Handle = driver.getWindowHandle();

			//新しくタブを開くリンクをクリック
			driver.findElement(By.id("LinkID")).click();

			//次のタブのハンドルを用意し、タブが新しく開かれていたらnewHandleに代入する
			String newHandle = null;
			for (String id : driver.getWindowHandles()) {
				if (!id.equals(Handle)) {
					newHandle = id;
				}
			}
			//newHandleにハンドルを移す
			driver.switchTo().window(newHandle);

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

もっと特殊な処理が必要かと思いましたが、`driver.switchTo().window(*)`がしっかりと用意されていました！
もし、処理が終わって元のタブに戻ったのであれば
`driver.switchTo().window(Handle);`
この一行を入れてあげるだけでOKです！
基点となるページが存在するなら最初にハンドルだけ変数に入れていおいてもいいかもしれません。

#4. まとめ
タブをガンガン開いたり閉じたりする操作を書くときには処理を入れるのをついつい忘れてしまいそうそうなので、どこにハンドルがむいているのか意識して書いていくように気を付けたいところです。

次は、ハンドルの移動ダイアログ(fancybox)について記載します('ω')ノ

#5. 参考資料
[u-sukeのメモ: Seleniumで新しいタブを開いた時にハマった](http://y-s-k-h-r-n.blogspot.jp/2014/09/selenium.html)
備忘録メモ WildFlyのJDBCドライバにpostgresqlを追加

※備忘録メモです

# 前提
~/wildfly-10.1.0.Final/bin 配下にJDBCドライバjarが格納されていること。

#手順
```bash

module add --name=org.postgresql --resources=postgresql-42.1.1.jar --dependencies=javax.api,javax.transaction.api

/subsystem=datasources/jdbc-driver=postgresql:add(driver-module-name=org.postgresql,driver-name=postgresql,driver-class-name=org.postgresql.Driver)

/subsystem=datasources/jdbc-driver=postgresql:read-resource
```
ELBのアクセスログを手動で解析する

# 前提
## ELB

### 以下が設定されていること

- アクセスログ
    - S3 の場所 *log-bucket-name* / *prefix*

### ARNの番号を取得

- ARN
    - arn:aws:elasticloadbalancing:ap-northeast-1:*account-id*:loadbalancer/app/*名前*/XXXXX

## AWS Credentials

以下のファイルが設定されていること

```bash
~/.aws/credentials
```

# download
## 1日分

```bash
aws s3 cp s3://[log-bucket-name]/[prefix]/AWSLogs/[account-id]/elasticloadbalancing/ap-northeast-1/[YYYY]/[MM]/[DD] . --recursive
```

## ひと月分

```bash
aws s3 cp s3://[log-bucket-name]/[prefix]/AWSLogs/[account-id]/elasticloadbalancing/ap-northeast-1/[YYYY]/[MM]/ . --recursive
```

### ひと月分は多いぜ、って時は

- 01日〜09日

    ```bash
aws s3 cp s3://[log-bucket-name]/[prefix]/AWSLogs/[account-id]/elasticloadbalancing/ap-northeast-1/[YYYY]/[MM]/ . --recursive --exclude "*" --include "*_YYYYMM0*"
    ```

- 10日〜19日

    ```bash
aws s3 cp s3://[log-bucket-name]/[prefix]/AWSLogs/[account-id]/elasticloadbalancing/ap-northeast-1/[YYYY]/[MM]/ . --recursive --exclude "*" --include "*_YYYYMM1*"
    ```

- 20日〜29日

    ```bash
aws s3 cp s3://[log-bucket-name]/[prefix]/AWSLogs/[account-id]/elasticloadbalancing/ap-northeast-1/[YYYY]/[MM]/ . --recursive --exclude "*" --include "*_YYYYMM2*"
    ```

# 展開

```bash
find . -name "*gz" -exec gunzip {} {} \;
```

# 解析例①：検索

```bash
find . -name "*\.log" | xargs grep "検索文字列" > グレップ.txt
```

# 解析例②：特定の1時間に来たリクエストを、エンドポイントごとに集計

2020/01/01の9時台(UTC)に来たリクエストの場合

```bash
ag "https 2020-01-01T09:" *.log > 2020010109.csv
# リクエストごとに集計して、少ない順にソート
# path parameterの場合は、別途sedとか必要
cat 2020010109.csv | awk -F "\"" '{print $2}' | awk -F "?" '{print $1}' | sort | uniq -c | sort -n
```

# 解析例③：とあるパスの平均レスポンスタイムを取得

2020/01/01の9時台(UTC)に来たリクエストの場合

```bash
ag "https 2020-01-01T09:" *.log > 2020010109.csv

# リクエスト総数
REQSUM=`ag "とあるパス" 2020010109.csv | wc -l`
# レスポンス合計
RESSUM=`ag "とあるパス" 2020010109.csv | awk  '{print $7}' | awk '{sum=sum+$1}END{print sum}'`
# 平均(小数第3位まで)
echo "scale=3; ${RESSUM} / ${REQSUM}" | bc
```

# 解析例④：URLエンコードされてるので、デコードしたい

全部

```bash
find . -name "*\.log" | while read -r fname; do echo -e ${REPLY//%/\\x}; done
```

1ファイル

```bash
while read; do echo -e ${REPLY//%/\\x}; done < ファイル名.log
```
swaggerのAPIをCocoaPods経由で取り込むまでの手順

# はじめに
Swaggerで生成したAPIをCocoaPodsを使ってXcodeにframeworkとして取り込むまでのアレコレ。
ほぼ自分用のメモ。

# CocoaPodsインストール~PodFile配置まで
参考ページ[iOSライブラリ管理ツール「CocoaPods」の使用方法](http://qiita.com/satoken0417/items/479bcdf91cff2634ffb1)
参考ページ[【Swift】CocoaPods導入手順](http://qiita.com/ShinokiRyosei/items/3090290cb72434852460)

この２ページを参考にすればOK。
注意点はPodFile生成時は`pod init`コマンドを使うこと

# swaggerでSwift3のAPIを生成
重要なのはビルド時のコンフィグ。これでCocoaPodsのアレコレを設定する。
以下は、「[社内のスマホ端末管理にTSUTAYAレジ風システムを導入した(予定)](http://qiita.com/k_keisuke/items/edaf0371bc289c4067c6)」で使用したAPI用に作成したやつ。

```json:swift-config.json
{
  "artifactId":"device-kanri-api",
  "podSource": "{ :git => \"https://github.com/kiuchikeisuke/DeviceKanriSanAPI-for-Swift.git\"}",
  "podAuthors": "k-kiuchi",
  "projectName": "DeviceKanriSanAPI",
  "responseAs": "RxSwift",
  "podHomepage": "https://github.com/kiuchikeisuke/DeviceKanriSanAPI-for-Swift",
  "podSummary": "DeviceKanriAPI",
  "podVersion": "1.0.0"
}
```

podXXXとなっているものがCocoaPodsで使用するパラメータ。厳密に調べてはいないが、必須パラメータが混じってるので注意(podSummaryの設定消したら取り込み時に怒られたのでこれは必須っぽい) 。

Githubの指定方法は「[初心者向けCocoaPodsで最低限必要な用語の解説とTips](http://qiita.com/yusuga/items/d7c764c23e9ad9d6d5de)」の「Gitリポジトリを直接指定する方法」を参考に。
「{}」内がそのまま反映される。
**podSourceに指定したgitリポジトリが最終的にXcodeで参照するgitリポジトリになるので注意**

これらの設定をしたconfigファイルとswagger-codegen-cli.jarを用意したら以下のコマンドでAPIをビルド

`java -jar ./swagger-codegen-cli.jar generate -l swift3 -i ./swagger.yaml -o ./out-swift3 -c ./swift3-config.json `

out-swift3ディレクトリにAPI一式が生成される

# APIをGitリポジトリに配置
これはGithubでもGithubEnterpirseでもGitlabでも同じ。出力されたout-swift3の中身をGitレポジトリにpushしてあげればよい

# PodfileにAPI用の記載を追加
こんな感じ

```
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'PlayGround' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  # Pods for PlayGround
  pod 'DeviceKanriSanAPI', :git => 'https://github.com/kiuchikeisuke/DeviceKanriSanAPI-for-Swift.git'

  target 'PlayGroundTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'PlayGroundUITests' do
    inherit! :search_paths
    # Pods for testing
  end

end
```

あとは`pod install`やら`pod update`を叩けばOK
正しく設定できていればPods系の管理下に置かれるようになる。
.NET Framework で ZipArchive.CreateEntryFromFile メソッドにうまくアクセスできないとき

#最初に結論
参照設定に System.IO.Compression と System.IO.Compression.FileSystem の2つのアセンブリを追加し、さらに using (VB.NET ではImports) ステートメントで System.IO.Compression 名前空間を参照させましょう。

#経緯
.NET Framework 4.5 以降で ZIP ファイルの作成、更新、解凍を行う機能が搭載されました。
ネット上には有志の方が、サンプルコードなどの情報を提供してくださっています。

任意のひとつのファイルをもとにZIPファイルを作成しようとして、ネット上の情報をもとに次のような CreateEntryFromFile を使用したコードを作成しました。
プロジェクトは今回「コンソールアプリケーション」テンプレートから作成し、参照設定に System.IO.Compression と System.IO.Compression.FileSystem の2つのアセンブリを追加してあります。

```C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TESTAPP
{
    class Program
    {
        static void Main(string[] args)
        {
            var targetFilePath = "SAMPLE.TXT";
            var zipFilePath = "SAMPLE.ZIP";
            if (System.IO.File.Exists(zipFilePath))
                System.IO.File.Delete(zipFilePath);
            using (var arc = System.IO.Compression.ZipFile.Open(zipFilePath, System.IO.Compression.ZipArchiveMode.Create))
            {
                arc.CreateEntryFromFile(targetFilePath, System.IO.Path.GetFileName(targetFilePath));
            }
        }
    }
}
```
しかし
> エラー	1	'System.IO.Compression.ZipArchive' に 'CreateEntryFromFile' の定義が含まれておらず、型 'System.IO.Compression.ZipArchive' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。

とのエラーで、ビルドに失敗しました（もっとも、インテリセンスに "CreateEntryFromFile" が出てきません）

MSDN の情報では [ZipArchive](https://msdn.microsoft.com/ja-jp/library/hh485720.aspx) と [ZipArchiveExtensions](https://msdn.microsoft.com/ja-jp/library/system.io.compression.zipfileextensions.createentryfromfile.aspx) の2つのクラスのメンバーとして登録されています。で、よく見ると前者には「拡張メソッド」と書かれており、後者のシグネイチャは第一引数が "this ZipArchive destination," となっていることに気づきました。
このメソッドは、System.IO.Compression.ZipArchiveExtensions クラスが提供する、System.IO.Compression.ZipArchive クラスへの拡張メソッドだったのです。

コードの先頭あたりに

```C#
using System.IO.Compression;
```

を追加して、万事うまくいきました。
iPhone/iPad/iPodアップデートエラーと対策まとめ

#はじめに
この記事は、iPhone/iPad/iPodのソフトウェアアップデートを行う際によく出たエラーをまとめて、対策を説明します。
例えば、iPhoneをアップデートする時、「アップデートを検証できません」、「アップデートをインストールできません」、「iCloudの設定をアップデート中」のようなエラーが表示され、iPhoneのアップデートが失敗または終わらないのです。
#6つ！iPhoneをアップデート中に出たエラー
###エラー１　「アップデートを確認できません」
デバイスをアップデートする際に、「ダウンロードとインストール」をタップした後、「アップデートを確認できません」エラーが表示され、iPhoneをアップデートできません。その時は、２つの対策があります。
####対策１　安定したWi-Fiに接続する
Wi-Fiの状態が悪い場合は、アップデートの情報を取れないので、「アップデートをあっ九人できません」エラーが起きやすいです。
####対策２　iPhoneを強制再起動する
また、ネットワークの状態が良いし、「アップデートを確認できません」エラーを解消できないと、お使いのデバイスを強制再起動してみてください。
###エラー２　「アップデートを検証できません」
このエラーが出る原因は、iPhoneに古いアップデートファイルが保存されているのです。そのため、古いアップデートファイルを削除すれば良いです。
####対策　古いファイルを削除する
手順１：「設定」　＞「一般」　＞「ストレージとiCloud使用状況」　＞「ストレージを管理」の順でタップします。
手順２：「iOS ○○．○．○」　＞「アップデートを削除」をタップして、「アップデートを削除」を確認します。
###エラー３　「アップデートをインストールできません」
アップでするファイルがダウンロード済み、「アップデートをインストールできません」エラーが表示される場合は：
####対策１　iPhoneを再起動する
iPhoneを再起動して、「アップデートをインストールできません」エラーを解消することがあります。デバイスを再起動した後、アップデートを再実行してみます。
####対策２　デバイスの空き容量を増やす
また、デバイスの空き容量が足りないと、iOSのインストールをできないのです。iPhoneの空き容量を増やして、再インストールします。
###エラー４　「iCloudの設定をアップデート中」
iOSのインストールが終わった後、iPhoneが自動的に再起動され、iCloudを設定する際に、「iCloud設定をアップデート中」が表示され、iPhoneのアップデートが終わらないのです。
####対策　「このステップをスキップ」
手順：iPhoneを再起動して、言語や位置情報を設定した後、iCloudの設定をする際に、iCloudのパスワードを入力してから、「この手順をスキップ」を選択します。
###エラー５　「ソフトウェアをアップデートできませんでした」
###[…続き読む＞＞＞](https://www.itkaigai.com/tips/iphone-update-error-matome.htm)
#まとめ
iPhone/iPad/iPodをワイヤレスでアップデートするには、エラーや不具合がよく発生するので、できるだけiTunesからアップデートした方が良いです。
Xamarin.FormsとPrismでPageDialogService.DisplayAlertAsyncが落ちる

XamarinとPrismで開発しているときに **OnNavigatingTo** とかで↓のみたいなのコード書いてると落ちた。

```CSharp
public async void OnNavigatingTo(NavigationParameters parameters)
{
    await _pageDialogService.DisplayAlertAsync("確認", "aaaaaaa", "閉じる");
}
```

調べてみるとPrismのIssuesにあった

[GitHub pageDialogService MainPage reference is always null inside OnNavigatedTo after app is launched #1098](https://github.com/PrismLibrary/Prism/issues/1098)


#Task.Yield()で解決
```CSharp
public async void OnNavigatingTo(NavigationParameters parameters)
{
    await Task.Yield();
    await _pageDialogService.DisplayAlertAsync("確認", "aaaaaaa", "閉じる");
}
```


Issues(~~Google翻訳~~)によると、**AppDelegate.FinishedLaunchingの呼び出しが完了するより前にPageDialogService.DisplayAlertAsyncが呼び出される**ことが原因のようです。
実際にデバッグで**PageDialogService**のMainPageがnullになっているのを確認できます。

~~ただこの問題は**CanNavigateAsyncなどでは起こりません。**
CanNavigateAsyncはNavigateAsyncのあとで呼び出しされ、
そのときにはViewの初期化は完全に終わってるはずなのでAppDelegate.FinishedLaunchingの呼び出しは完了してるはずです。~~

##書き終わってから自信がなくなった…
ほんとにCanNavigateAsyncはFinishedLaunchingよりあと呼び出されるのか？
時間があったら調べて追記します。。。それか誰か教えてk(ry



##これは動く
```CSharp
public async Task<bool> CanNavigateAsync(NavigationParameters parameters)
{
    return await _pageDialogService.DisplayAlertAsync("確認", "Text Speech画面へ遷移しますか？", "OK", "Cancel");
}
```

＃遷移時は普通に動いてたから６時間くらい嵌った…
Android開発で便利な拡張関数

#Android開発で便利な拡張関数
Kotlinを使ってみて拡張関数がとても便利だったので、
Android開発のときに定義している拡張関数をメモ。
##トースト
簡単にトーストを出す。

```kotlin:utils.kt
private val uiHandler = Handler(Looper.getMainLooper())
//UIスレッドで実行
fun mainThread(runnable: () -> Unit) {
  uiHandler.post(runnable)}

//短いトースト
fun Context.toast(message: String) {
  mainThread { Toast.makeText(this, message, Toast.LENGTH_SHORT).show()}}

//長いトースト
fun Context.longToast(message: String) {
  mainThread { Toast.makeText(this, message, Toast.LENGTH_LONG).show()}}
```
##インテント
```kotlin:utils.kt
//インテントを作成
inline fun <reified T : Context> Context.newIntent(): Intent = Intent(this, T::class.java)

//Bundle付き
inline fun <reified T : Context> Context.newIntent(extras: Bundle): Intent = newIntent<T>(0, extras)

//インテントを定義してアクティビティを起動
inline fun <reified T : Activity> Activity.startActivity(): Unit =this.startActivity(newIntent<T>())
```

```kotlin:HogeActivity.kt
val intent=newIntent<FooActivity>()

start<FooActivity>()
```



##システムサービス
getSystemServiceのテンプレコードも楽に書ける。

```kotlin:utils.kt
fun Context.getActivityManager(): ActivityManager =
        getSystemServiceAs(Context.ACTIVITY_SERVICE)

fun Context.getClipboardManager(): ClipboardManager =
        getSystemServiceAs(Context.CLIPBOARD_SERVICE)

fun Context.getCameraManager(): CameraManager =
        getSystemServiceAs(Context.CAMERA_SERVICE)

fun Context.getNotificationManager(): NotificationManager =
        getSystemServiceAs(Context.NOTIFICATION_SERVICE)

@Suppress("UNCHECKED_CAST")
fun <T> Context.getSystemServiceAs(serviceName: String): T =
        this.getSystemService(serviceName) as T
```
##API判定


```kotlin:utils.kt
private val version: Int
    get() = Build.VERSION.SDK_INT

fun fromApi(fromVersion: Int, inclusive: Boolean = true, action: () -> Unit) {
    if (version > fromVersion || (inclusive && version == fromVersion)) action()
}
```

```kotlin:HogeActivity.kt
fromApi(23){
//パーミッションの処理などに使える
}
```



##まとめ
よく使うのはこの辺り。
他にも便利な定義知ってるよって人は教えて欲しいです。
Rails Ransack sort_linkが使えない統計カラムなどをソートするヘルパーを作ってみた

# 事実確認とやりたいこと
## Ransackのsort_linkでは統計カラムのソートができない
Railsプロジェクトにおいて検索機能を「[Ransack](https://github.com/activerecord-hackery/ransack)」というgemを使って作成している場合、
[sort_link()](https://github.com/activerecord-hackery/ransack#ransacks-sort_link-helper-creates-table-headers-that-are-sortable-links)というヘルパー一発でソート機能を実装できます。
しかし、それは単にModelに存在しているカラムのソートが簡単に実装できるヘルパーであってSUMなどの統計後のデータに対してのソートはできません。

例えば以下のような売上データがあるとします。

salesテーブル

|id|name|price|
|:--|:--|:--|
|1|うまい棒|10|
|2|うまい棒|10|
|3|よっちゃんイカ|30|
|4|うまい棒|10|
|5|うまい棒|10|

このテーブルをSUMで統計して売上合計が大きい順にソートしたいです。
期待している出力結果は以下の通りです

|name|price|
|:--|:--|
|うまい棒|40|
|よっちゃんイカ|30|

しかし、```sort_link()```ではModelに存在しているカラムしか指定できません。
```sort_link(@q, :price)```では以下のような出力となってしまいます。

|name|price|
|:--|:--|
|よっちゃんイカ|30|
|うまい棒|40|

## やりたいこと
```sort_link(@q, :total_price)```みたいなのができたらベストだと考えます。
ぐぬぬぬ。何かいい方法はないのでしょうか？

# ソートするヘルパーを作ってしまえ
「ないのなら作ってしまおう。今後も使うことあると思うし！」
と勢いで作ってみました。
JSまで巻き込んでしまったのは自分でもいい判断だったのかはわからないですが、
こんな感じに実装しました。

## Controller
orderでsortパラメーターを使ってソートします。

```rb:controller
@q = Sales.select('name, sum(price) as total_price').group(:name).order(params[:sort]).ransack(search_params)
@sales = @q.result
```

## View
テーブルのヘッダーに今回作ったヘルパーtable_sort()を指定します。
検索ありです。
※slimを使っています。

```rb:view
= search_form_for @q, url: sales_path, class: 'search-form' do |f|
  = hidden_field_tag :sort
  = f.search_field :name_cont,
  = f.submit '検索'


table
  thead
    tr
      th = "name"
      th = table_sort('price', 'total_price')
    - @sales.each do |item|
      tr
        th = item.name
        th = item.total_price
```

## Helper
ヘッダーに表示するテキストとソートする対象の名前を引数に、
```href="javascript:void(0)"```のlink_toを返します。

```rb:helper
# テーブルのソートリンクを作成する
def table_sort(text, target)
  order = (params[:sort].present? && params[:sort].include?(target) && params[:sort].include?('asc')) ? 'desc' : 'asc'
  text +=  params[:sort].present? && params[:sort].include?(target) ? params[:sort].include?('asc') ? ' ▲' : ' ▼' : ''
  link_to text, 'javascript:void(0)', class: 'sort-link', data: {colmun: target, order: order}
end
```
## Javascript
今回JSを使用したのは検索条件を引き継ぐためです。
リンクの最後にgetパラメータを全て連ねる方法もありますがスマートじゃないと思いやめました。

```js:js
$(function() {
    $(document).on("click", ".sort-link", function() {
      $('#sort').val($(this).data('colmun') + ' ' + $(this).data('order'));
      $('.search-form').submit();
    });
});
```

# 最後に
ベストプラクティスなのかはわかりませんが、今のところ自分では満足しています。
イイね！と思ったら使ってみてください。
実用的なALBアクセスログ用のAthenaDDL

リクエストURIの部分をHTTPメソッド、ホスト名、パス、QueryStringに分割しました。
Athenaの`?`の認識が怪しかったので、`\?`ですむところをわざわざ`[?]`にしたりしています。

```sql
CREATE EXTERNAL TABLE IF NOT EXISTS table_name (
    type string,
    request_timestamp string,
    elb_name string,
    client_addr string,
    client_port int,
    target_addrport string,
    target_addr string,
    target_port int,
    request_processing_time double,
    target_processing_time double,
    response_processing_time double,
    elb_status_code int,
    target_status_code string,
    received_bytes int,
    sent_bytes int,
    request_method string,
    request_uri string,
    request_host string,
    request_path string,
    query_string string,
    request_proto string,
    user_agent string,
    ssl_cipher string,
    ssl_protocol string,
    target_group_arn string,
    trace_id string
)
PARTITIONED BY (ymd string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
    'serialization.format' = '1',
    'input.regex' = '^(https?|h2|wss?) ([^ ]+) ([^ ]+) ([^:]+):([0-9]+) (([^:]+):([0-9]+)|-) ([0-9.]+|-1) ([0-9.]+|-1) ([0-9.]+|-1) ([0-9]+) ([0-9]+|-) ([0-9]+) ([0-9]+) "([^ ]+) ([^:]+:\/\/([^:]+):[0-9]+(\/[^ ?]+)?[?]?([^ ]+)?) ([^ ]+)" "([^"]+)" ([^ ]+|-) ([^ ]+|-) ([^ ]+) (.+)$'
)
LOCATION 's3://[your-bucket]/[your-prefix]/AWSLogs/[your-account-id]/elasticloadbalancing/[your-region]/'
TBLPROPERTIES ('has_encrypted_data' = 'false')
```

### 追記

ymdというstringのパーティションを作成している。
よくyear, month, dayでパーティションしてるサンプルを見かけるけど、クエリ書くときパーティションキーは１つの方が楽だからこうしてる。
また、パーティションを自動拡張するLambda関数も書いた。
後で追記予定。
NTLM認証Proxy環境下でconda/pip/gemを動かす

# 概要
- conda/pip/gemのネットにあるProxy設定の情報方法を試してもダメな場合、NTLM認証だからかもしれません。
- cntlmをローカルに入れて、そこを通すことでconda/pip/gemが使えるようになります。

# 環境
- Windows 7 - 64bit
- gem 2.5.1
- pip 9.0.1
- conda 4.3.24

# 手順
まず、[Cntlmを使いNTLM proxy環境下でもnpmを使いたい_OPC Diary][2]を読んで、cntlmを設定します。「npmの設定」の部分は飛ばしてＯＫです。

> ### Cntlmとは
Cntlmはオープンソースで提供されているNTLM認証Proxy環境下で、各種ツールに変わりNTLM認証の代行を行うProxyサーバーです。今回はWindowsで動かしますが、Linux、Mac版もあります。(事実上NTLM認証Proxy環境下でLinuxやMacのHomebrew使うなら必須じゃないかな。。。)
> ### まとめ
という事で、npmに限らずproxy設定できるツールならCntlmを使えば有利な戦いがで切るんじゃないかな！


# conda
[Proxy下のWindowsでPython(Anaconda)環境を整える - Qiita][3]を読み、.condarcのプロキシ設定を以下のようにする。

```
proxy_servers:
    http: http://[プロキシアドレス]:[ポート番号]
    https: https://[プロキシアドレス]:[ポート番号]
```

cntlm.iniのデフォルトを使うならば、ポート番号は3128なので以下です。

```
proxy_servers:
    http: http://localhost:3128
    https: https://localhost:3128
```


# pip
[pythonメモ proxy下でのpip、easy_install - Qiita][4]を参考に、コマンドpip installする前に以下を実行します。

```shell-session
set HTTP_PROXY=http://localhost:3128
set HTTPS_PROXY=https://localhost:3128
```
[プロセス固有の環境変数(PATH)を設定したコマンドプロンプトを立ち上げる-Qiita][6]の応用例1を使って、

```vbnet:vbs抜粋
set env = shell.Environment("Process")
env.Item("HTTP_PROXY") =  "http://localhost:3128"
env.Item("HTTPS_PROXY") =  "https://localhost:3128"
```

のように設定してコマンドプロンプトを立ち上げておくといいかもしれません。

# gem
gem installは、-pでプロキシを指定できるので、以下のようにします。

```shell-session
> gem install serialport -r -p https://localhost:3128
```

[gem install時にcertificate verify failed が発生したら - Qiita][5]で証明書を入れ替える必要があるかもしれません。


```
> gem install serialport -r -p http://localhost:3128
RROR:  Could not find a valid gem 'serialport' (>= 0), here is why:
         Unable to download data from https://rubygems.org/ - SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://api.rubygems.org/specs.4.8.gz)
```

「certificate verify failed 」が発生したら、

```
C:\Ruby23-x64\lib\ruby\2.3.0\rubygems\ssl_certs\AddTrustExternalCARoot-2048.pem
```
のバックアップを取ったあと、テキストエディタで開いて、

> View in Base64で見れる証明書

の内容をコピーして保存すればいけると思います。

[httpでなんとかする](http://book.scss.jp/code/c2/07.html)という方法もあるようですが、「セキュリティ上httpsを推奨するとメッセージが出る」ようなので、こちらの方が若干クリーンかなと。


# 参考
[Cntlmを使いNTLM proxy環境下でもnpmを使いたい_OPC Diary][2]
[[Windows]Forefront TMGのNTLM認証プロキシをCntlmでなんとかする_エンジニ屋][1]
[gem install時にcertificate verify failed が発生したら - Qiita][5]
[プロセス固有の環境変数(PATH)を設定したコマンドプロンプトを立ち上げる-Qiita][6]

[6]:http://qiita.com/int_main_void/items/e9f3fd0b80a1099dc7ff
[5]:http://qiita.com/hirokishirai/items/7579eaad5132a8e48975
[4]:http://qiita.com/FJKei/items/5589ad89eed14e486d27
[3]:http://qiita.com/mishan88/items/2f9e1c5e9e2572ba8a36
[2]:https://opcdiary.net/?p=30377
[1]:http://sevenb.jp/wordpress/ura/2016/01/27/windowsforefront-tmgのntlm認証プロキシをcntlmでなんとかする/
Linuxでディスク容量はあるのに容量不足エラーが出る場合の対処法

# はじめに
Bind on unix socket: No space left on device
とか
Error: unable to create temporary file; errno: 28
とか
Can't create/write to file '/tmp/#xxxx' (Errcode: 28)
とか

ディスク容量不足系エラーが出るけど、dfしたらディスク容量には余裕がある！
どうしたらいいんだ！
という人向け

# 結論

①書き込み先ディレクトリの権限がない
②inodeが枯渇している
だいたいどっちか

# ①書き込み先ディレクトリの権限がない

1.パーミッションの確認

```
# ls -ld /tmp
dr-xr-xr-x. 11 root root 4096 Aug 21 04:08 /tmp
```

2.フルパーミッションの付与

```
# chmod 1777 /tmp
```

3.パーミッションの確認

```
# ls -ld /tmp
drwxrwxrwt 3 root root 4096 Aug 21 04:08 /tmp
```

これでだいたいなんとかなるはず
なんとかならなかった人は②へ


# ②inodeが枯渇している

1.dfで容量の確認

```
# df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/xvda1       8123812 4815712   3207852  61% /
tmpfs             508628       0    508628   0% /dev/shm
```

2.df -i でinode利用量の確認

```
# df -i
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     6406144 6406144 0   100% /
tmpfs          127157      1 127156    1% /dev/shm
```

3.どのディレクトリがinodeを使い込んでいるのか確認

```
# for i in /*; do echo $i; find $i |wc -l; done
```

または

```
# echo "==== `pwd` ====" ; for i in `ls -1`;do echo -n "## $i ### " ; echo "(`find ./$i -type f |wc -l`)" ;done | sort -r
==== /var ====
```

4.怪しい奴を見つける

```
/foo
1
/piyo
2
/hoge
6370020
```

5.原因のディレクトリのファイルを削除

```
# rm -rdf /hoge/*
```

だいたいLogかMailが原因なので、そこらへんに当たりをつけると探しやすいかもです。

# cf.

Linuxでディスクが一杯になった時の対処法 - Qiita
http://qiita.com/masarufuruya/items/0c794083fc4ea03cd9f9

inodeとは/inode消費が多いディレクトリの確認
http://tagutagu.com/?page_id=985
ASUS TinkerBoard の初期設定

Maker Faire Tokyo 2017 にて ASUS TinkerBoard を購入したので、セットアップのメモなど。
OS は　TinkerOS v1.8 (Debian 9 ベース)を使用します。
OS環境を Raspberry Pi (Raspbian) に近づけるべく、セットアップします。

# microSDカードにOSイメージを書き込む (macOS)
* ホームページから最新の TinkerOS-Debian をダウンロードする。(2017.08.21 現在、TinkerOS v1.8 が入手できます。)
* https://www.asus.com/jp/Single-Board-Computer/Tinker-Board/
* → 20170417-tinker-board-linaro-stretch-alip-v1.8.zip
* unzip → 20170417-tinker-board-linaro-stretch-alip-v1.8.img

* ターミナルを起動

```コマンド
$ diskutil list
/dev/disk0
   .....
/dev/disk1
   .....
```

"disk2"がそれっぽいのでアンマウントする。

```bash:コマンド
$ sudo diskutil unmount /dev/disk2s1
```

* microSDカードへの書き込み
ddコマンドでmicroSDカードに書き込む。

```bash:コマンド
$ sudo dd bs=1m if=/User/(username)/Download/20170417-tinker-board-linaro-stretch-alip-v1.8.img of=/dev/disk2
```

# TinkerOS の起動
* MacからmicroSDカードを抜き、TinkerBoard に挿して起動。
* GUIモードで起動する。画面の解像度が合わないかもしれないが、後で設定する。
Intel(Altera)FPGAのMAX10についてまとめ

#電源
MAX10には、シングル電源デバイスとデュアル電源デバイスと2種類がある

###シングル電源デバイス
3.3V単電源で使用できる
VCCIOも3.3Vである場合は完全に単電源で使用できる

###デュアル電源デバイス
2.5Vおよび1.2Vの2種類の電源を必要とする
VCCIOが3.3Vの場合は、3種類の電源が必要となる

###VCCIO
VCCIOはMAX3.9Vとなっており、5Vの入力はできない
入力トレラントも無し

#ピンマイグレーション
ピンマイグレーションとは、電源やJTAGなどのファンクションピンが同一のレイアウトになっており、回路の変更をすることなくチップを置き換えることができる機能のこと

E144パッケージの10M04,10M08,10M16,10M25の4種は、ピンマイグレーションとなっており、リソースが不足または過剰となった際に、回路の変更をすることなく置き換え可能である

**ただし、E144パッケージはexposed padのサイズが異なっているので注意すること**
[デバイス・パッケージ情報](https://www.altera.co.jp/support/literature/lit-index/lit-pkg/package.html?family=MAX_10)
リンク切れの場合は、*Device Package Information* か *Package and Thermal Resistance* のキーワードで検索して探し出す

#ファンクションピン

###コンフィグ関連ファンクションピン
nCONFIG
nSTATUS
CONF_DONE
CONFIG_SEL
これらのピンはコンフィグ中は専用ピンとして動作し、ユーザーモードに入った後には、ユーザーIOとしても使えるピン。
ただし、ユーザーIOとして使いたい場合でも、コンフィグ中はプルアップまたはプルダウンの処理が必要でユーザー回路から切り離されている必要がある。

###ユーザーモード関連ファンクションピン
DEV_CLRn
DEV_OE
CRC_ERROR
これらのピンはコンフィグが完了し、ユーザーモードへ移行した後に、専用ピンとして機能する。
ユーザーIOとして使用する場合は、他のIOと同じ処理で良い。

#リセットについて
MAX10のLEには同期リセット用のリソースと非同期リセット用のリソースどちらも用意されている。

#シミュレーションについて
ADCコアやUFMコアのシミュレーションを行うとき、

```
# ** Error: (vsim-3033) ../lib/fiftyfivenm_atoms.v(6979): 
Instantiation of 'fiftyfivenm_unvm_encrypted' failed. The design unit was not found.
```
のようなエラーが出る場合があり、
"fiftyfivenm_unvm_encrypted"モジュールを探して、いろんなディレクトリを全文検索しても見つからずにハマることがある。
`C:\intelFPGA_lite\17.1\quartus\eda\sim_lib\mentor\fiftyfivenm_atoms_ncrypt.v`
このファイルに暗号化されていて、一緒にコンパイルすればsimが通るようになる。


#
flocssのメモ

書いていくほどに苦しめてくるのがCSSだったので、これは設計手法を学ぼうと思ってあれこれ探した結果、flocssというものに当たり、整理の意味も含めてメモ。全然違うこと書いてるかもしれません、ごめんなさいin advance。

##flocssとは
なにはともあれ、ドキュメント。
[hiloki/flocss: CSS organization methodology.](https://github.com/hiloki/flocss)
OOCSSやSMACSSなどの影響を受けている。日本人のhirokiさんが発案らしい。

CSSを設計する際に、ざっくりと以下のような構成にする。

```
|---foundation
|---layout
└---object
    |---component
    |---project
    └---utility
```
3レイヤーに分けて、構造を分離しつつ、メンテナンス性、生産性、可読性を高めるというメリットが合わさって最強に見えるというもの。componentニキが強い。

###foundation
resetやnormalizeの役割を持つcssを分類する。

###layout
ざっくりとしたワイヤーフレームまでの構成要素を記述する。

###object
残りの枝葉末節パーツたちは、以下３つの子レイヤーに分類。

####component
使い回しの効くパーツが分類される。
ボタンやテキストのようなgeneralなものから、カルーセルやテーブルデザインのような自前のものなど、複数箇所で使い回したいものがそれに当たる。

####project
project毎のcssが分類される。
最初はなんのこっちゃわからなくて、ｳｰﾝとなっていたけど、どうも最終的なviewとなるものの仕上げをするというような感覚ぽい。padding/margin、color系などはここで決めておくと、他がスッキリして全体としての使い回し性が上がるのかも。

####utility
汎用的な機能を持ったクラスが分類される。
例えばmarginの微調整や、jsを元にした見た目の変更、変数まとめなど。

##作成メモ

###prefixについて
どのレイヤーに属しているかわかるようににprefixをつけて置くと可読性がｸﾞｰﾝする。
.l　=>　layout
.c　=>　component
.p　=>　project
.js　=>　jsにかかわるもの

###カスケーディングについて
カスケーディングは原則しない。なぜならやたらめったらのカスケーディングこそが後々の運用を苦しめているから。
派生したクラスを作りたい場合は、そのクラスそのものには要素を持たせず、名前を命名規則に基づいて拡張し、擬似的に作成する。必要に応じて@extendしたり。
例：

```css
.c-button{
  padding: 0.5rem 1rem;
  background-color: #eee;
  font-size: 1rem;
  color: #333;
}
.c-button--big{
  @extend .c-button;
  padding: 1rem 2rem;
  font-size: 2rem;
}
```

###命名規則について
MindBEMdingという命名規則を推奨している。
フォーマット：
`.prefix-classname--modifier__element`

例：

```　css
.c-button--big
.p-headliner__title
```

##thoughts
###jsで扱われるクラスの分類について
modalなど汎用的なもので、かつjsと切っても切り離せないものをどこに置くか悩んだ。
一応上で書いている通りutilityに入れたけど、どちらかというと分類的にcomponentに置きたかった気がする。

###延々と伸びていくクラス名
多分抽象化がうまくできていないんだと思うけど、例えばちょっとネストしたcomponentを作っている時に、結構簡単にクラス名が伸びていってしまう。

```
.c-card-history{
  &__card-box {
    &--left {
      .user-img{
      }
    }
    &--main {
      &__description {
        &__header {
        }
        &__body {
        }
      }
    }
  }
}
```
例えば↑のようなものがあって、descriptionのbodyをviewに付与したい時のクラス名は・・・
`.c-card-history__card-box--main__description__body`
となる・・・ｳｰﾝ
パッと見てわかりやすいけど。

##反省
neatやbourbonを使ってみる。
phina.jsでUiとゲーム画面をレイヤー分けする

#はじめに
ゲームを作っていて、レイヤー分けをしたくてそれに関する記事を探したのですが、見当たらなかったのでtimlib.jsのサンプルを参考にしながら記事を書きました。
参考:[timlib.jsレイヤー分け](http://jsdo.it/phi/fwst)
#サンプル
```js
phina.globalize();

phina.define("MainScene",{
    superClass:'DisplayScene',
    init:function(){
        this.superInit();
        this.circleNum = 0;
        this.gameLayer = DisplayElement().addChildTo(this);//レイヤー追加
        this.uiLayer = DisplayElement().addChildTo(this);
        panel = RectangleShape({
            x:this.gridX.span(12),
            y:this.gridY.center(),
            fill:'yellow',
            width:this.gridX.span(6),//grid6つ分の横幅
            height:this.gridY.span(4),
        }).addChildTo(this.uiLayer);
        panel.alpha = 0.5;
        Label({
            text:"gameLayer",
            x:this.gridX.center(),
            y:this.gridY.center(), 
            fontSize:100,
        }).addChildTo(this.gameLayer);

        this.circleNumLabel = Label({
            text:this.circleNum,
            x:this.gridX.span(12),
            y:this.gridY.span(6),
            fontSize:this.gridX.span(1)-10,
        }).setOrigin(0.5,0).addChildTo(this.uiLayer);
        
        Label({
            text:"uiLayer",
            x:this.gridX.span(12),
            y:this.gridY.center(),
        }).addChildTo(this.uiLayer);
    },
    update(app){
        if(app.frame%30 == 0){
            var x = Math.randint(0,640);
            var y = Math.randint(0,960);
            (48).times(function (i) {
                Circle1(x,y, (360 / 48) * i).addChildTo(this.gameLayer);
                this.circleNum++;
            }, this);
        }
        this.circleNumLabel.text = "円の数" + this.circleNum;
    }
})

phina.define("Circle1",{
    superClass:'CircleShape',
    init:function(x,y,dir,){
        this.superInit();
        this.radius = 50;
        this.setPosition(x,y);
        this.direction = dir * Math.DEG_TO_RAD;
        this.movX = Math.cos(this.direction)*10;
        this.movY = Math.sin(this.direction)*10;
    },
    update:function(){
        this.x += this.movX;
        this.y += this.movY;
        if(this.x <= -this.radius*2||this.x >=640+this.radius*2 || this.y <= -this.radius*2 || this.y >= 960+this.radius*2){
            this.parent.parent.circleNum--;//親の親を指定
            this.remove();
        }
    }
});

phina.main(function(){
    var app = GameApp({
        startLabel: 'main',
    });
    app.run();
});

```
[Runstantで確認](http://runstant.com/TakabayaP/projects/026531f9)

#解説
```js
this.gameLayer = DisplayElement().addChildTo(this);
this.uiLayer = DisplayElement().addchildto(this);
```
でそれぞれのレイヤーを定義しています。```uiLayer```をあとから追加することで```gameLayer```の上に描画するようにしています。
あとは```addChildTo()```で追加する時に```this.gameLayer```か```this.uiLayer```を指定することでそれぞれのレイヤーに追加できます。もちろん、```this```を指定しても問題ありません。この場合、普通に追加したものがレイヤーの追加よりあとだった場合、すべてのレイヤーより上に描画されます。
レイヤー内での描画はレイヤー内での追加の順番で決まります。

子要素では```parent```を２つつなげることで```DisplayScene```を指定していますが、後々のことを考えるとやめたほうがいいような気もします。

#おわりに
これを使ってレイヤー分けすると要素の整理がしやすくなると思います。
しかし、gridは便利ですな〜。
Oracle JDK 7, 8, etcをUbuntuインストーラ経由で対話をスキップしてインストール

oracle-java*-installer を使用してインストールをすると、インストール途中でライセンス許諾の対話を求められてしまうというのは、試そうとした方には経験のあることと思います。

ところが、CI や、Infra as Code のような仕組みで、対話なくセットアップを進めたい場合、これは都合が悪いです。

ググってみたものの、アタリを引くまでに少し手間取ったので、ここにメモしておきます。
以下のようにコマンドを発行することで、対話することなく、ライセンス許諾を `<OK>` して、インストールを進めることができます。

```console
$ sudo add-apt-repository -y ppa:webupd8team/java
$ sudo apt-get update
$ echo debconf shared/accepted-oracle-license-v1-1 select true | sudo debconf-$ set-selections
$ echo debconf shared/accepted-oracle-license-v1-1 seen true | sudo debconf-set-selections
$ # sudo apt-get -y install oracle-java7-installer
$ sudo apt-get -y install oracle-java8-installer
```

以下が、辿り着いた Stackoverflow のトピックです。
https://stackoverflow.com/questions/19275856/auto-yes-to-the-license-agreement-on-sudo-apt-get-y-install-oracle-java7-instal

なお、対話を飛ばした分のライセンス許諾は、別途きちんと確認しておきましょう。
http://www.oracle.com/technetwork/jp/licenses/javase-dev-license-2595998-ja.html
TensorFlowでYOLO（備忘録）

TensorFlowでYOLO使いたい　というか物体検出したいというモチベです

#YOLO_tensorflow
ここを見ました
http://qiita.com/koji-t/items/a33bc8297c9a03b38c74
https://github.com/gliese581gg/YOLO_tensorflow

事前にDarknetを入れておく必要があるっぽい？

#DarkFlow
ここを見ました
http://qiita.com/Almond/items/9987bb4a54a1570eddee
https://github.com/thtrieu/darkflow

```python
from darkflow.net.build import TFNet
```
の部分でTensorFlowを使ってるということなのでしょうか…？
Darkflowの中でTensorFlowが使われているような印象　Kerasみたいな感じ？
Darknetを入れておく必要がないようですし，こっちのほうが扱いやすそうな気がします
StatusCake での API キーの取得のやり方

# ０．はじめに

サイト監視で利用している StatusCake というサービスの API キーの取得のやり方

# １．StatusCake の API キーの取得

1. StatusCake へログイン。
    * [StatusCake - Join Now](https://app.statuscake.com/Login/?redirect=/&nosession=true)
<br><br>
1. 左側ペインから「User Details」を選択し、「API Key」ボタンを押下すると、「API KEY」画面の「Below is your API Key」に API キーが表示されます。新しく API キーを作り直したければ、「CREATE NEW API KEY」ボタンを押下すれば OK です。
<br><br>
    * ![FireShot Capture 081 - StatusCake - Control Panel - https___app.statuscake.com_APIKey.php.png](https://qiita-image-store.s3.amazonaws.com/0/161939/a5076911-5d6e-b6e6-f4c3-0f17baa32ba3.png)

# ９９．ハマりポイント

* 特にありません。

# ＸＸ．まとめ

StatusCake は最低限の API はあるかな、って感じですね。
これを使って他システムとの連携など試してみては♪

* [StatusCake API Documentation](https://www.statuscake.com/api/)
「REMOTE HOST IDENTIFICATION HAS CHANGED」の対応策

最近ＶＰＳのＵｂｕｎｔｕにＳＳＨログインする時、下のような謎警告が出てきて、ログイン不能になった。

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ECDSA key sent by the remote host is
SHA256:OxAch4XQKDrevbrPNfLojXur4gf26XupgqhUPCzG+x0.
Please contact your system administrator.
Add correct host key in /Users/ABC/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/ABC/.ssh/known_hosts:66
ECDSA host key for 111.111.111.111 has changed and you have requested strict checking.
Host key verification failed.
```

調べてみたら、クライアントで下記の命令を実行すればいい。

```
ssh-keygen -R 111.111.111.111
```

原因とは、そのサーバに変化があって、クライアントに登録したＫＥＹは失効した。そして新しいＫＥＹを登録する必要がある。
【HTML】input type = "submit" と "button" の違いって・・・？

検索条件を入力し、`<form>`の中の`<input>`で発火するjQueryでのDOM操作(append)を書いていて、ちょっと嵌ったので書いておく。
後でちゃんと分かったらもう少し追記したい。

`<tbody>`部分に`<td>`要素をappendしていきたかった。
1. うまくappendされなかったコード

```sample.html
<form>
 <input type="text" id="name">
 <input type="submit" id="btn" value="search">
</form>

<table>
 <thead>
  <th>term A</th>
  <th>term B</th>
 </thead>
<!-- ここにappendされる -->
 <tbody id="results"></tbody>
</table>
```

```sample.js
//searchボタン押下で発火
$(document).ready(function(){
    $('#btn').on('click',function(e){
        ajax();
    });
});

//DBからのデータ取得のためPHPへ
function ajax(){
  var search_val=$('#name').val();
  $.post('./search.php', {search_term : search_val}, function(data){
  append(data);
 },'json');
}

//json形式のデータをfor文で回してtbodyにappend
function append(data){
  var record = '';
  for(var i=0; i<data.length; i++){
    record += '<tr><td>'+ data[i].term_a +'</td><td>'+ data[i].term_b +'</td></tr>';
  }
  $('#results').append(tweets);
}
```

ブラウザでの挙動を見ていると、appendされてから消えているような・・・。
早すぎて見えない・・・。

2.appendされたコード
sample.htmlは同じ。
結論だけ言うと、submitのデフォルトアクションをキャンセルする
`preventDefault()`を追記したら回避できた・・・。

```sample.js
//searchボタン押下で発火
$(document).ready(function(){
    $('#btn').on('click',function(e){
//submitのデフォルトアクションをキャンセル
        e.preventDefault();
        ajax();
    });
});

//DBからのデータ取得のためPHPへ
function ajax(){
  var search_val=$('#name').val();
  $.post('./search.php', {search_term : search_val}, function(data){
  append(data);
 },'json');
}

//json形式のデータをfor文で回してtbodyにappend
function append(data){
  var record = '';
  for(var i=0; i<data.length; i++){
    record += '<tr><td>'+ data[i].term_a +'</td><td>'+ data[i].term_b +'</td></tr>';
  }
  $('#results').append(tweets);
}
```

以前も同じようなコードを書いて嵌らなかったのは、
`<input type="button">`でHTMLを記述していたからっぽく、HTML側をそう修正してもうまくいった。

submitとbuttonの違いって・・・？
送信機能がもともと実装されているか否かだけじゃないのか・・・？
なんか押下時のスクリプトの実行のタイミングが違ったりして、そのせいかなー？とか推測していますが、調べてもよく分からん。
HTML5でブラウザゲームを作る（ハイブリッドアプリ）

ブラウザゲームに関して何もノウハウが無い状態からGoogle先生を頼りに頑張る事約半年、やっと公開できるレベルに達しました。
道中、何度も落とし穴に嵌って、その都度、解決に相当時間を取られました...
たくさんのブログ記事にも色々と助けられなんとかここまで来れましたので恩返しの意味も兼ね、今後Qiitaでこのゲーム作りで得られた技術情報やTipsを共有していきたいと思います。
のんびり投稿していきますので気長にお待ちください。　ｍ（＿ ＿）ｍ

初回投稿ですのでまずは完成したハイブリッドゲーム（中身はブラウザゲームそのもの）の紹介

#HMG大富豪オンライン

**Androidアプリ版**
GooglePlay
https://play.google.com/store/apps/details?id=net.hasemonmon.df5on

![_1-min.jpg](https://qiita-image-store.s3.amazonaws.com/0/198186/fef6a768-a7e5-4791-733d-db3b2e627e5b.jpeg)![_2-min.jpg](https://qiita-image-store.s3.amazonaws.com/0/198186/1120fc3d-6360-bf48-f39c-0ccd12275c93.jpeg)![_3-min.jpg](https://qiita-image-store.s3.amazonaws.com/0/198186/6275f7e9-b4ac-1c90-e6d6-4dbe4b276bff.jpeg)

#概要
トランプゲームの大富豪です。
オンライン対戦（４人まで）とAI対戦（一人用）が可能です。

**Webブラウザ版**
https://hasemonmon.net/df5/
Android 4.0以上　最新Chromeブラウザ
iOS 8以上 Safariブラウザ
Windows10モバイル Edgeブラウザ

描画はcanvas+pixi.jsをメインにGLSLのカスタムシェーダーを部分的に使用。
ゲームサーバーはnode.js+socket.ioで構築。
ハイブリッドアプリ化はcordovaを使用。
Site24x7 での API キーの取得のやり方

# ０．はじめに

サイト監視で利用している Site24x7 というサービスの API キーの取得のやり方




# １．Site24x7 の API キーの取得

1. Site24x7 へログイン。
    * [Site24x7:ログイン](https://www.site24x7.com/login.html)
<br><br>
1. 左側ペインから「管理者」→「開発者」→「API」を選択し、API の画面を表示し、API キーの作成用のリンクをクリックする。
<br><br>
    * ![FireShot Capture 079 - Site24x7 - https___www.site24x7.com_app_client_a=f&a=f#_admin_developer_api.png](https://qiita-image-store.s3.amazonaws.com/0/161939/84d6551d-8009-e500-46d9-9213fb8c42b9.png)
<br><br>
1. 別画面が表示され、API キーが作成される。
<br><br>
    * ![FireShot Capture 082 -  - https___accounts.zoho.com_apiauthtoken_create_SCOPE=Site24x7_site24x7api.png](https://qiita-image-store.s3.amazonaws.com/0/161939/4059c94b-22a4-b340-1407-636bcd2cae00.png)
<br><br>
1. 左側ペインから「管理者」→「開発者」→「API」を選択し、API の画面を表示し、「AUTHTOKENの管理」のリンクをクリック、「Zoho アカウント」画面の左側ペインから「セッション」→「有効な認証トークン」を選択すると、一覧が表示されるので、有効な認証トークンの確認や不要なトークンの削除が出来ます。
<br><br>
    * ![FireShot Capture 079 - Site24x7 - https___www.site24x7.com_app_client_a=f&a=f#_admin_developer_api - コピー.png](https://qiita-image-store.s3.amazonaws.com/0/161939/c1e0ac4f-2f4e-effa-8914-3e3d575f7269.png)
<br><br>
    * ![FireShot Capture 080 - Zoho アカウント - https___accounts.zoho.com_u_h#sessions_userauthtoken.png](https://qiita-image-store.s3.amazonaws.com/0/161939/b4e8bad3-acbd-78cc-499b-1080b92d0100.png)

# ９９．ハマりポイント

* 特にありませんが、ちょっとわかりづらい手順かもしれませんね。

# ＸＸ．まとめ

Site24x7 は API もかなり揃っているので、これを使って他システムとの連携など、結構使えるんじゃないかと思います。

試してみては♪

* [Site24x7 \| API Reference](https://www.site24x7.com/help/api/)
flex-grow: 1な感じで作った不定の要素の高さを知る子要素を作りたい

# なやみ

下みたいなflex-grow: 1で作った子要素を、親要素と同じ高さにしたい

![Group.png](https://qiita-image-store.s3.amazonaws.com/0/99270/0d0a2b88-3797-efb1-1951-a8dce91feb1a.png)

# つらい

試しに子要素を `height: 100%` にしてみると、まぁそりゃ子要素見ちゃうよね

![Group 3.png](https://qiita-image-store.s3.amazonaws.com/0/99270/de9f96e9-edbf-7d46-7ec2-074169a4e283.png)

じゃあ親要素を100%にすればいいじゃん、としても、その親の高さを見ちゃうのでflex-grow台無し。そんなに人生甘くない

![Group 4.png](https://qiita-image-store.s3.amazonaws.com/0/99270/7845b95c-9758-39d8-8abc-5d12cca67f13.png)

ここで子要素100%にしても残当な結果

![Group 5.png](https://qiita-image-store.s3.amazonaws.com/0/99270/a362f027-4263-04d1-33e3-6b0c7cc6a39f.png)

# ひらめき

https://www.w3.org/TR/css-position-3/#valdef-position-absolute

> The box’s position (and possibly size) is specified with the top, right, bottom, and left properties. These properties specify offsets with respect to the box’s containing block

`position: relative / absolute` の関係にすれば、子absoluteは包含するrelativeの座標系になるはず、じゃあ100%というのも親をとれる…？

![Group 6.png](https://qiita-image-store.s3.amazonaws.com/0/99270/54b74a2b-2e57-ce46-206a-b8da51fce101.png)

# 出来た
:tada:

サンプル ↓
https://codepen.io/anon/pen/zdwQRG


# 他にも
Thanks for @nanto_vi :clap:

コメントに貴重な知見頂いて、赤枠をflexboxにし、黄色にflex-grow: 1を適用することでも同等のスタイルを当てることができます！
確かに幾つかボックスを更に内側に並べるのであれば、このやり方のほうが賢い！かと思います。
ありがとうございます！
atomのauto-sasscomipleでパーシャル保存時にメインファイルを保存してcompileさせる

Bootstrapなど、ファイルがパーシャルに分かれているsassファイルを保存した時に、メインのファイルを自動保存することで、コンパイルさせる設定方法です。

シンプルなのですが、ぱっと分からないので残しておきます。

編集するパーシャルの１行目に main: [メインファイルへの相対パス] の形式で自動保存したいファイルを記載します。 

```scss:_variables.scss
// main: ../style.scss
$bootstrap-sass-asset-helper: false !default;
//
// Variables
// --------------------------------------------------


```

これで、_variables.scssファイルを保存した際に、同時に style.scss も保存されるので、自動的にコンパイルされます。
中学一年生がPythonの知識ゼロからAIを作るまで

こんにちは、zenboですm( _ _ )m
これからPythonの知識ゼロから学習していきたいと思います!(^_^)

#そもそもなぜPythonをやろうと思ったの？
近年、AIの注目度が格段に上がりました、それが、機械学習やディープクラーニングの技術の発展です。 この中で、今後ITの世界でやっていくには、今ぐらいから、AIについて学んでおくべきだと思ったのです。
そんな時、あるネット記事を読みました、そこには、AIの作成にはPythonが勧められていました！ここで、Pythonに興味を持ち始めました

#今の所Pythonってマイナーな感じがするけど...
確かに今の所日本では、そこまで有名じゃありませんが
海外では、とても使われていて、
YouTube
Dropbox
Instagram
などがあります。
この情報を見て、Pythonの学習を決心しました。

では次から実際に学習を始めていきたいと思います。
また、これからの記事を見て、何かアドバイス等がありましたら、コメントをよろしくお願いいたします。もともとQiitaで記事を書きながら学習をしようと思ったのも、アドバイスなどを受けられたらと思ったからです。では、今回はここで締めさせていただきます。

では、これから宜しくお願いします！
家族3人でMVNOに乗り換えたときのメモ

#概要
IDOの時代からのAUユーザが格安SIMに変更してみた時のLogです

#動機
「通信費が高い！格安SIMというのがあるらしい。乗せ換えたまえ」とのお達しが。
###夫婦に小学生の子供がひとり。実家のインフラも担当していて回線契約主がバラバラだった。

#移行前の状況
自分：AUもうすぐ20年目。iPhone7ユーザ。契約はLTEフラット（たまに6Gくらい使う）契約主は自分。
奥様：AU16年目くらい？iPhone6ユーザ。契約はLTEフラット（ほとんど3Gで収まる）契約主は奥様
子供：AUもうすぐ2年目。こどもケータイ(マモリーノ3)使用中。契約主は奥様
実家：e-Mobile時代からの乗換えでY!モバイル使用中(305ZT)。もうすぐ契約更新月。契約主は自分。
その他保有機器：E-MobileのGL06P、SIMフリーのNokiaLumia636、AUのiPhone5
　　　　　　　　AUのIS03(2012年7月から使用不可)、D25HW(ネットワークロックでロクに使えない)

#手順
１．まずは格安SIMを選ぶ。
　　うちは想定のSIM枚数が多いのでIIJmioのファミリーシェアプランを検討。
　　BicSIM(2か月/3GBのPrePaid)をデータSIMとしてひとつ契約。
　　うちにあるe-mobileのGL06PがSIMフリーなのでBicSIMを入れて実家で動作試験。
　　結果良好なのでBicSIMのSIMを正式にIIJmio契約に変更。その際ファミリープランにしておく。
　　Y!モバイルを契約更新月に解約。305ZTは保持し、別途SIMフリー化しておく（DC-Unlocker使用 7ユーロ）
　　みおぽんアプリを別のiPhone、Lumiaにインストールし使い勝手に慣れておく。

２．奥様は番号を引き継ぎたいが子供は番号引継ぎ不要だったので新規契約に。
　　まずは奥様契約だった回線を自分名義に名義変更実施。（AUショップで）
　　その際は免許証等身分証明書と委任状が必要。口座が同じ場合、印鑑は不要らしい。
　　AUでSIMロック解除も実施。今回はWebで2台とも実施。無料。
　　名義を揃えたらAUのMNP窓口に電話してMNP番号を発行してもらう。
　　今回はまず奥様分を処理。その際、各携帯電話の4桁の暗証番号も必要。
　　MNP番号を払い出してもらったらファミリープランのアカウントからSIM追加で申し込み
　　SIMサイズを選び、MNP番号、期日を入力して送信。併せて子供のSIMも新規申し込み。
　　その後メールで本人確認の問い合わせが来るので免許証等身分証明書を携帯カメラで撮り送付。
　　数日後には宅急便で届く。それまでに携帯メールでのみ連絡取ってる人に新メールを連絡。

３．IIJmioから届くMNP手続きにIIJmioオンデマンド開通センターに電話して携帯番号などを送信。
　　IIJmioのAPNプロファイルを事前に入れておき、しばらく待つと手続き完了のメールが届くので
　　念のためiPhoneを再起動すると、Docomoのアンテナを最初から掴んでいる。
　　通話試験も着信も問題なし。

４．子供の携帯にNokiaLumia636を考えていたが、奥様がiPhoneじゃないと
　　子供の質問に答えられないとのことで、急遽iPhoneに。
　　ただし空いているのがiPhone5でSIMロック解除対応前のものしかない。
　　ファクトリーアンロックは高いし、中古のSIMフリーiPhoneも高い。
　　ということでR-SIM11+をAmazonで購入(1000円ちょっと)し実験することに。

５．iPhoneをリセットした後、AUの生きているnanoSIMを挿して設定で4Gを無効化。
　　AUのSIMを抜き、Wi-Fi環境を使ってIIJmioのAPNプロファイルを事前に入れておく。
　　R-SIM11+をSIMトレーに置いてその上にSIMを載せ、電源入れっぱなしのiPhone5にSIMを挿す。
　　するとキャリア選択画面などを経由せずDocomoが表示され使えるようになった。
　　iOS9.3.2で実施。10.3.3にしたらどうなるかは今後確認予定。
　　iPhone5はそもそもLTEが弱いので3G限定で使用させる予定。みおぽんもOffで200kbps。
　　これにて子供の携帯iPhone化も済み。ペアレンタルコントロールについても勉強中。

６．無事に開通することが見届けられたので自分のSIMもファミリープランのアカウントからSIM追加。
　　Lumia636は自分が海外行ったときのケータイとして確保。
　　305ZTも自分が海外に行ったときのモバイルルータとして利用予定。
　　
#結果
　変更前月額費用（Total＝約18,000円、21GB(7GBx3)）
　　2x（LTEプラン＋LTEフラット(7GB/月)）＝2x7,000円＝14,000円
　　こどもケータイ＝210円
　　ポケットWi-Fi(7GB/月)＝4,400円
　変更後月額費用（Total＝約5,500円、10GB）
　　IIJmioファミリーシェアプラン
　　　基本契約＝2,560円
　　　3x音声契約SIM＝2,100円
　　　2xData契約SIM＝0円
　　　SIMカード利用料(4枚目以降課金)＝800円

#備考
　実際にはMNP転出・転入の手数料、AU解約時の違約金等が別途掛かっている。
　純粋に月額費用での比較を行った。

#その他
　次は家のBroadband環境の見直しか。
環境コピーしてbundle installをvendor/bundleにしたらrails sで'sudo apt-get install libreadline-dev'の警告が出た

いつもはbundle installだけで作業しているんだけど、ちょっとしたことを試したくて

```
$bundle install --path vendor/bundle
```

こちらを実行してみた

途中capybaraのwebkitで怒られるも、

```
brew upgrade
brew install qt@5.5
brew link --force qt@5.5
```

して解決

ようやくサーバー起動しようとしたら

```
rails s -b 0.0.0.0
    Sorry, you can't use byebug without Readline. To solve this, you need to
    rebuild Ruby with Readline support. If using Ubuntu, try `sudo apt-get
    install libreadline-dev` and then reinstall your Ruby.
```

こんなエラー

調べて見てもlibreadline-devはinstallされている・・・

いろいろ調べていたら以下のコメント欄で「いいね」されまくってるコメント発見！
https://github.com/deivid-rodriguez/byebug/issues/289

```
ln -s /usr/local/opt/readline/lib/libreadline.dylib /usr/local/opt/readline/lib/libreadline.6.dylib
```

試したらうまくいった！

理解はしてないｗ