OmniAICreator/Qiita-1.07M huggingface dataset:
Golang の echo で MariaDB の Read

次のページを参考にしました。
[Golang+Echo+dbrでMySQLのCRUDをする／JSONでDBの値を返却する話](https://qiita.com/CST_negi/items/5e276ddc0412cefef7e3)

MariaDB から読んだデータを、JSONで出力します。

Mysql への接続情報
>User: scott
Password: tiger123
データベース: city
テーブル名: cities

MariaDB の状態

```text
$ mysql -uscott -ptiger123 city
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 24
Server version: 10.1.33-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [city]> select * from cities;
+-------+--------+------------+------------+
| id    | name   | population | date_mod   |
+-------+--------+------------+------------+
| t3321 | 岡山   |     725139 | 2002-2-9   |
| t3322 | 倉敷   |     417328 | 2002-5-15  |
| t3323 | 津山   |     891654 | 2002-7-21  |
| t3324 | 玉野   |     265981 | 2002-11-12 |
| t3325 | 笠岡   |     284597 | 2002-4-24  |
| t3326 | 井原   |     671942 | 2002-2-8   |
| t3327 | 総社   |     265481 | 2002-8-3   |
| t3328 | 高梁   |     792356 | 2002-3-14  |
| t3329 | 新見   |     415892 | 2002-1-15  |
+-------+--------+------------+------------+
9 rows in set (0.00 sec)

MariaDB [city]>
```

```golang:server.go
// -----------------------------------------------------------------------
/*
	server.go

						Jun/11/2018
*/
// -----------------------------------------------------------------------
package main

import (
    "net/http"
    "github.com/labstack/echo"
    "github.com/labstack/echo/middleware"

    _ "github.com/go-sql-driver/mysql"

    "github.com/gocraft/dbr"
)

type (
	cityinfo struct {
	ID   string     `db:"id"`
	Name string  `db:"name"`
	Population int  `db:"population"`
	Date_mod string  `db:"date_mod"`
    }

    responseData struct {
    Users	[]cityinfo      `json:"cities"`
    }
)

var (
    tablename = "cities"
    seq   = 1
    conn, _ = dbr.Open("mysql", "scott:tiger123@tcp(127.0.0.1:3306)/city", nil)
    sess = conn.NewSession(nil)
)

// -----------------------------------------------------------------------
func selectCities(c echo.Context) error {
    var u []cityinfo

    sess.Select("*").From(tablename).Load(&u)
    response := new(responseData)
    response.Users = u
    return c.JSON(http.StatusOK,response)
}

// -----------------------------------------------------------------------
func main() {
    e := echo.New()

    // Middleware
    e.Use(middleware.Logger())
    e.Use(middleware.Recover())

    // Routes

    e.GET("/cities/",selectCities)

    // Start server
    e.Start(":1323")
}

// -----------------------------------------------------------------------
```

サーバーの起動

```bash
go run server.go
```

クライアントでアクセス

```bash
curl http://localhost:1323/cities/ | jq .
```
🔰Mac入門



## 本を買っておくと良き

以下を抑えておく

- 日本語と英語の切り替え方
- アプリの起動の仕方
- アプリの終了の仕方
- アプリの探し方
    - Spotlight
    - Launchpad
- スクリーンショットのとり方
    - 全画面 ※1
    - 部分 ※1
    - 窓ごと ※1
    - デスクトップに保存せずに貼り付ける方法（Google "command shift control 4"）
        - クリップボードにコピーして、LINEなどにそのまま貼ることができる
- 装飾キーの記号
    - ![image.png](https://qiita-image-store.s3.amazonaws.com/0/17342/838eb872-eede-2236-dfda-583a4b0820d0.png)

※1: ファイルとして保存するやり方と、クリップボードにコピーしておく方法、両方をマスターすると良い

## 作業の速さが運転の差！

以下を調べて覚えておくと良い

- ショートカットキー
- ジェスチャー（トラックパッド）
Cognos テキストボックスのプロンプトのデフォルト値にデータアイテムの値を入れる

#概要
Cognos AnalyticsやCognos 10 BIで、テキストボックスのプロンプトを配置した時に、デフォルトの値をどっかのデータアイテムから取得できると便利ですよね。
![011.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/8677c737-d4c1-93df-1026-111a6195082d.jpeg)

JavaScriptで、本日の日付とかをデフォルト値で入力するのは、こちらのDeveloperWorksの記事にあり、よくお世話になっているやり方ですが、JavaScriptで生成できる値であればこのやり方で良いのですが、生成できない場合に、どこかのデータアイテムから取得したいよ、というパターンです。
**Setting Dynamic Date Prompt Values within IBM Cognos 10.2 Report Studio**
https://www.ibm.com/developerworks/library/ba-pp-reporting-scripting_techniques-page634/index.html

#実装
本体ページにリストを置き、「製品ライン」と「数量」を置いてみます。
![012.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/0647aeef-cc5b-d66d-f63f-d0a3a6cc4e51.jpeg)

リストのクエリーはこんなイメージで、「数量」に対して、pFrom と pTo というパラメーターで、フィルターをかけています。 
![017.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/e629cecc-fe17-c461-29b2-261dce8fcec8.jpeg)

プロンプト・ページは2つあり、「ダミー・プロンプト・ページ」というのが、以下のイメージで、これがポイントです。
![018.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/d2477b61-ad66-8a0b-1aa2-5aaf2768ed9f.jpeg)

ダミー・プロンプト・ページで使用するクエリーは、以下のものを使用します。
つまり、「数量最大-10000」から「数量最大」の間の販売数量の製品にフィルターして、先ほどのリストに表示したいというシナリオです。
この「数量最大-10000」と「数量最大」のデータアイテムの値を、最初にお見せしたテキストボックスのプロンプトのデフォルト値として入力しようというものです。
![013.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/7d34b851-6026-b819-6e1b-339a0ec8ba75.jpeg)

右側の値のプロンプトの指定イメージです。
クエリー：製品数量、使用する値：数量最大、パラメーター：pToを指定しています。
また、値のプロンプトの名前を To に指定しています。
![014.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/37dd0c08-f319-9805-5bd4-d4744a8a82a5.jpeg)

左側の値のプロンプトの指定イメージです。
クエリー：製品数量、使用する値：数量最大-10000、パラメーター：pFromを指定しています。
また、値のプロンプトの名前を From に指定しています。
![015.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/feb03114-d7e1-5ce4-5f7e-dfa8ce929a6b.jpeg)

左側のHTMLItemです。

```html
<div  style = "Display:none">
```

右側のHTMLItemです。
これで、二つの値のプロンプトのデータアイテムの値を読み取って、pFromとpToのパラメーターにセットして、100msec後に「Next」で次のプロンプトページに遷移します。
「From」の部分と「To」の部分が、先ほどの値のプロンプトで名前を指定したところと一致させます。

```html
</div>

<script language="javascript">


function setDefaultVaule()
{
	var form = getFormWarpRequest();
	form._oLstChoicesFrom.options[2].selected = true;
	form._oLstChoicesTo.options[2].selected = true;
	setTimeout("promptButtonNext();",100);
}

setDefaultVaule()

</script>
```

次のプロンプトページ、「プロンプト・ページ1」のイメージです。
左のテキストボックスのプロンプトのパラメーター：pFrom
右のテキストボックスのプロンプトのパラメーター：pTo
を指定しているのがポイントです。
これにより「ダミー・プロンプト・ページ」で設定されたパラメーターを受け取り、ここのテキストボックスのプロンプトに入力できます。
![016.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/d9ee7da4-bf41-9834-9732-36722f63799f.jpeg)

これで、レポートを実行すると、「ダミー・プロンプト・ページ」は、一瞬でスキップされ、この様にテキストボックスにデフォルト値が入った画面になります。
![019.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/bfcde982-a41f-f904-3328-b8b033f300fc.jpeg)

「終了」でレポート実行すると、製品の販売数量が指定の範囲で絞り込まれた結果が表示されます。
![020.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/cb760b5f-28d9-7557-a477-cc385057448c.jpeg)

一瞬「ダミー・プロンプト・ページ」を経由するのは、あまり美しくない実装かも知れないですが、好きなデータアイテムの値を、テキストボックスのプロンプトのデフォルト値に入れれるのは、色々と応用範囲が広がる使える手だと思いますので、ご活用頂ければ幸いです。
EmbulkのLiquidで日付計算をする

## 概要
Embulkで集計期間などの日付のデフォルト値を自動でセットするようにしたくて、liquid内で日付計算する方法を調べたのでメモしておく。

## 本日
today文字列からdateフィルターで、本日の日付を生成する。

```liquid
{% capture today %}{{ 'today' | date: '%Y-%m-%d' }}{% endcapture %}
```

## 昨日
secondsで1日の秒数を計算した値をセットする（ 1日 x 60秒 x 60秒 x 24秒 = 86,400秒 ）。
minusフィルダーで減らして、dateフィルターで日付の文字列に整形する。

```liquid
{% assign seconds = 1 | times: 24 | times: 60 | times: 60 %}
{% capture yesterday %}{{ 'today' | date: "%s" | minus: seconds | date: "%Y-%m-%d" }}{% endcapture %}
```

## 使ってみる
本日と昨日の日付を検索してパラメータの初期値として使い、Google Analyticsのページビューの取得対象を自動指定する。

```liquid
{% assign type = 'hoge' %}
{% assign seconds = 1 | times: 24 | times: 60 | times: 60 %}
{% capture yesterday %}{{ 'today' | date: "%s" | minus: seconds | date: "%Y-%m-%d" }}{% endcapture %}
{% capture today %}{{ 'today' | date: '%Y-%m-%d' }}{% endcapture %}
in:
    type: 'google_analytics'
    auth_method: 'service_account'
    json_key_content: '{{ env.GOOGLE_API_JSON }}'
    view_id: '100000000000000000000'
    time_series: 'ga:date'
    start_date: '{{ env.START_DATE | default: yesterday }}'
    end_date: '{{ env.END_DATE | default: today }}'
    incremental: true
    metrics:
      - 'ga:pageviews'

filters:
  - type: 'column'
    add_columns:
      - {name: 'type', type: 'string', default: '{{ type }}'}

out:
    type: 'td'
    apikey: '{{ env.EMBULK_TREASURE_DATA_API_KEY }}'
    endpoint: 'api.treasuredata.com'
    database: '{{ env.EMBULK_QLIFE_OUT_DB }}'
    table: 'daily_google_analytics_pageviews'
    mode: 'append'
    default_timezone: 'Asia/Tokyo'
    default_timestamp_format: '%Y-%m-%d'
```
## 参考サイト
- [Adding days to a date excluding weekends in Shopify](https://stackoverflow.com/questions/39730058/adding-days-to-a-date-excluding-weekends-in-shopify)
- [plus – Liquid template language](https://shopify.github.io/liquid/filters/plus/)
- [minus – Liquid template language](https://shopify.github.io/liquid/filters/minus/)
- [default - Liquid template language](https://shopify.github.io/liquid/filters/default/)
よく使うRustのクレートを目的別に一言で紹介


Rustでプログラミングする上で、よく使いそうなクレートを目的別に一言で紹介します。

| 目的 | クレート |
|:--|:--|
| グローバル変数を使いたい | [lazy_static](https://crates.io/crates/lazy_static) |
| バイナリデータを読み書きしたい | [byteorder](https://crates.io/crates/byteorder) |
| JSONを読み書きしたい | [serde](https://crates.io/crates/serde)と[serde_json](https://crates.io/crates/serde_json)の組み合わせ |
| TOMLを読み書きしたい  |[serde](https://crates.io/crates/serde)と[toml](https://crates.io/crates/toml)の組み合わせ |
| 乱数を使いたい | [rand](https://crates.io/crates/rand) |
| 正規表現を使いたい |  [regex](https://crates.io/crates/regex) |
| CのAPIとやりとりしたい | [libc](https://crates.io/crates/libc) |
| ビットでフラグを管理したい | [bitflags](https://crates.io/crates/bitflags) |
| 日付を扱いたい | [chrono](https://crates.io/crates/chrono) |
| コマンドライン引数をパースしたい | [clap](https://crates.io/crates/clap) |
| 実行中のログをとりたい | [log](https://crates.io/crates/log)と[env_logger](https://crates.io/crates/env_logger)の組み合わせ |
| BigIntや有理数型、複素数型を使いたい | [num](https://crates.io/crates/num) |
| 多次元配列を使いたい | [ndarray](https://crates.io/crates/ndarray) |
| 簡単にイテレータの計算を並列化したい | [rayon](https://crates.io/crates/rayon) |
| イテレータに追加の機能が欲しい | [itertools](https://crates.io/crates/itertools) |
| 高速なハッシュテーブルが欲しい | [fnv](https://crates.io/crates/fnv) |
| CPUのコア数が知りたい | [num_cpus](https://crates.io/crates/num_cpus) |
| ディレクトリの中身を再帰的に探索したい | [walkdir](https://crates.io/crates/walkdir) |
| 一時ファイル・ディレクトリが欲しい | [tempfile](https://crates.io/crates/tempfile) |
| 圧縮ファイルを読み書きしたい | [tar](https://crates.io/crates/tar)や[flate2](https://crates.io/crates/flate2)、[zip](https://github.com/mvdnes/zip-rs) |
| Rustのエラー処理を高機能にしたい | [anyhow](https://crates.io/crates/anyhow), [thiserror](https://crates.io/crates/thiserror) |
| パニック時のメッセージを豪華にしたい | [human-panic](https://crates.io/crates/human-panic) |
続Unity2017+iOSで色んなSDKを入れた場合のエラー備忘録


### 「library not found for -lGoogleToolboxForMac」エラー

```library not found for -lGoogleToolboxForMac```

xcode上で、　add framework で入れる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/ac3f2b4e-e8b9-f799-6315-3558ac73710c.png)

---

### xcodeで、lnanopb　がないと言われたら

add frameworkで libnanopbを入れる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/4921230e-a534-59d4-d96b-b5f7f3be7f26.png)

---

### libAppLovin.aの重複エラーがでたら

AppLovin.frameworkを外したりしてみる

### 「_inflateMemoryWithHint in ZipUtils.o」のようなエラーがでる場合

Build Settingsの「Other Linker Flag」項目に「**-lz**」を追加 

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/fc233438-c4e6-a70e-ca14-5ad3e225b97d.png)

---

### 「Use of '@import' when modules are disabled」 とでる場合

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/f7b9d194-c97c-bebe-b9f8-b2a3931275a5.png)


Build Settingの、「**Enable Modules (C and Objective-C)**」項目 を 「No」 → 「Yes」に。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/37406/e8449071-53c8-e4ce-17cb-09622000b876.png)
[Review] Massively Parallel Methods for Deep Reinforcement Learning ~GORILA~ 

## Foreword
Recently I have started reading the paper about Asynchronous Advantage Actor-Critic in reinforcement learning. And this paper is referred by that paper on the subject of distributed learning in reinforcement learning.
So in this article I would like to briefly summarise it.

Author:
Arun Nair, Praveen Srinivasan, Sam Blackwell, Cagdas Alcicek, Rory Fearon, Alessandro De Maria, Vedavyas
Panneershelvam, Mustafa Suleyman, Charles Beattie, Stig Petersen, Shane Legg, Volodymyr Mnih, Koray
Kavukcuoglu, David Silver
Published Year: 2015
Link: https://arxiv.org/pdf/1507.04296.pdf

## Introduction
They have presented first massively distributed learning in deep reinforcement learning and the generated agent did outperform the normal DQN agent on Atari 2600 games. They quoted the success case of distributed learning by (Coates
et al., 2013; Dean et al., 2012) in deep learning domain.
However in traditional reinforcement learning, many great schemes or theories have mainly focused on a single agent learning. Hence they have prepared multiple servers for each learning agent to store their learning history and the encountered experiences. This is called Distributed Experience Replay memory in the paper.
Applying the asynchronous stochastic gradient descent (ASGD), distributed learners can efficiently learn from the experience memory.

## DQN Architecture
<img width="541" alt="Screen Shot 2018-06-11 at 19.26.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/a5fa8a92-0171-a9c0-4823-cba56147243e.png">

## Gorila (General Reinforcement Learning Architecture)
<img width="1105" alt="Screen Shot 2018-06-11 at 19.27.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/7fb9e77b-81c4-c5ce-62da-e5d47fbbe353.png">

**Algorithm**
<img width="403" alt="Screen Shot 2018-06-11 at 19.27.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/906512ee-14f9-91f0-cb83-fe9b57cfa699.png">

## Experiments
They evaluated Gorila by conducting experiments on 49 Atari 2600 games using the Arcade Learning Environment.
<img width="422" alt="Screen Shot 2018-06-11 at 19.28.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/0aefce06-3345-b9e1-8cff-8f88f9ad6771.png">

<img width="664" alt="Screen Shot 2018-06-11 at 19.29.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/240801/f394a8fd-7dee-fc2e-2e59-12ab043f4a3d.png">
Nokogiriでスクレイピングをするときにはまったこと

簡単なはずのスクレイピングにおいてどうしても狙った値を取得できずにはまってしまった

#環境
 - chromeデベロッパーツール
 - nokogiri 

#「任意タグ」が原因だった
HTMLタグの中にはツールやブラウザによって認識されたりされなかったりする、__「任意タグ」__と呼ばれるものがあるらしい
今回の原因は、「tbody」がchromeデベロッパーツールでは認識されているにも関わらず、nokogiriでは認識されず、そこで食い違いが起きていた

みんなも気をつけてね泣
5分でラズパイにつけたカメラでストリーミング映像を見れるようにする

## ラズパイ起動


## コンソール起動


## IPの確認
```
ifconfig
```


## 一応最新にアップデートする
```
sudo aptitude update
sudo aptitude upgrade

```


## パッケージインストール
```
sudo aptitude install libv4l-dev libjpeg8-dev subversion imagemagick
```


## mjpg-streamerをリポジトリからcloneしてきます
```
svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
```


## make
```
cd mjpg_streamer
make USE_LIBV4L2=true clean all
```


## おまじない
```
sudo modprobe bcm2835-v4l2
```


## mjpg-streamerを起動させます
```
./mjpg_streamer -i "./input_uvc.so -d /dev/video0 -r 640x480 -f 60 -y -n" -o "./output_http.so -p 8081 -w ./www -c test:test"
```


## ブラウザで確認
```
http://【確認したIP】:8081
```
に接続すると、認証ポップアップがでますので、id:test、パスワード:testと入れてOKボタンをクリックすると画面が表示されます。
streamタブを開くとカメラでストリーム映像が見れます。
SwiftTourをさっと読む ~ Simple Values ~

# SwiftTourをさっと読む ~ Simple Values ~

Swiftの勉強を始めたので公式の[A Swift Tour](https://docs.swift.org/swift-book/GuidedTour/GuidedTour.html)をさっと読んでみました。
今回は[Simple Values](https://docs.swift.org/swift-book/GuidedTour/GuidedTour.html#ID461)をさらっとまとめました。というかそのまんまだけど。

バージョンは`4.2`です。

## 標準出力
  ```Swift:標準出力
  print("Hello World")
  ```

## 変数宣言・定数宣言
### 変数
  ```Swift:変数宣言
  var myVariable = 42
  myVariable = 50
  ```

### 定数
  ```Swift:定数宣言
  let myConstant = 42
  ```
  
  定数のため、再代入は不可

  ```Swift:定数への再代入はエラー
  let myConstant = 42
  myConstant = 3 // ←これはエラーになる
  ```

#### 型を指定して宣言
  ```Swift:型を指定して宣言
  var myVariable:Int = 42
  let myConstant:Int = 5
  ```

## 型変換
  ```Swift:型変換
  // 変換先の型(変換する値)
  let intVal = 10
  let strVal = String(intVal)
  ```

  初期値がない、あるいは不足している場合でも型を宣言すればコンパイラが推論を行ってくれる

  ```Swift:型推論による型変換
  var myVariable1 = 42 // Intの42
  var myVariable2:Double = 42 // Doubleの42.0
  ```

  暗黙的に型変換は行われないので明示的に書く必要がある

  ```Swift:明示的に変換する必要がある
  let label = "The width is "
  let width = 94
  let widthLabel = label + String(width) // "The width is 94"
  // let widthLabel = label + width これはエラーになる
  ```

## 文字列操作
### 文字列内における値参照
  ```Swift:文字列内における値参照
  let name = "Taro"
  let message = "Hello, \(name)"
  ```

### 複数行の文字列
  ```Swift:複数行の文字列
  let ppap = """
  I have a pen
  I have an apple
  uh!
  apple-pen
  """
  ```
## 配列と辞書
### 配列
  ```Swift:配列
  var shoppingList = ["catfish", "water", "tulips", "blue paint"]
  print(shoppingList[1]) // "water"
  shoppingList[1] = "bottle of water"
  print(shoppingList[1]) // "bottle of water"
  ```

### 辞書
  ```Swift:辞書
  var occupations = [
    "Malcolm": "Captain",
    "Kaylee": "Mechanic",
  ]
  print(occupations.count) // 2
  occupations["Jayne"] = "Public Relations"
  print(occupations.count) // 3
  print(occupations["Malcolm"]) // Optional("Captain")
  ```

#### 空の配列・空の辞書
  ```Swift:空の配列・空の辞書
  shoppingList = []
  occupations = [:]
  ```

  型推論が可能な場合に限り利用可能

  ```Swift:型推論ができない場合はエラー
  var shoppingList = [] // ←これはエラーになる
  var occupations = [:] // ←これはエラーになる
  ```

  型を指定すれば可能

  ```Swift:型指定を行い空を入れる
  var shoppingList:[String] = []
  var occupations:[String:String] = [:]
  ```

## おわり

  他の言語を経験していれば難しいことはなさそうですね。
  何か間違いがあればご指摘お願い致します。

  おしまい。
dateコマンドで日付計算

## 概要
Linuxのコマンドにて日付計算をすることがあったので調べた内容をメモしておく。

## 本日
```bash:ターミナル
$ echo `date +'%Y-%m-%d'`
2018-06-11

# 変数に代入
$ TODAY=`date +'%Y-%m-%d'`
$ echo $TODAY
2018-06-11
```

## 昨日
```bash:ターミナル
$ echo `date -d "1 day ago" +'%Y-%m-%d'`
2018-06-10

# 変数に代入
$ YESTERDAY=`date -d "1 day ago" +'%Y-%m-%d'`
$ echo $YESTERDAY
2018-06-10
```

## 1週間前
```bash:ターミナル
$ echo `date -d "7 day ago" +'%Y-%m-%d'`
2018-06-10
```

## 1日(今月)
```bash:ターミナル
$ echo `date +'%Y-%m-01'`
2018-06-01
```

## 1日(先月)
```bash:ターミナル
$ echo `date -d "$(date +'%Y-%m-01') 1 month ago" +'%Y-%m-01'`
2018-05-01
```

## 1日(半年前)
```bash:ターミナル
$ echo `date -d "$(date +'%Y-%m-01') 6 month ago" +'%Y-%m-01'`
2017-12-01
```

## 参考サイト
- [dateコマンドで前月を計算する時の注意](http://totech.hateblo.jp/entry/2015/07/31/063037)
Wantedly課題

<課題１>
私がすごいと思った機械学習は、ディープラーニング（深層学習）についてです。
ディープラーニングは、２０１６年に人口知能の囲碁プログラミンでプロ棋士に勝利しました。
それを知り、僕は何通り先も相手の動きなどを読んで行う囲碁で、公式などないのに人工知能が世界トップレベルに勝利したことが凄くてとても驚きました。
また、ディープラーニングでは、画像認識・音声認識・自然言語処理・異常検知など行うことができ、社会の中に深くかかわるものが多く、すごいと感じました。
<課題２>
・話題の下の日付を押したら、カレンダーが出て、自分の見たい日付を選択したら、その日のニュースが出てくるような機能を付けたら、見たい日のニュースが素早く見れるようになると感じます。
・ニュースのタブを開いているときに、下にスライドしたら、見ていた記事の前のホームの画面にいくのが不便に感じたのでそれを改善したほうがいいと感じます。
・記事のもっと読むを開いている時に、左上のボタンを押さなくても、左にスライドしたら前の画面に戻るようにしたらより便利になると感じます。
gitでブランチやタグを一括削除する

git bashを使います（windows環境だと通常gitインストール時に同梱されているはず）  
### xargsコマンドを使う
標準入力から受け取って、任意のコマンドに引数として渡すコマンド
# ローカルブランチを一括削除する
`git branch | xargs git branch -D`
これで現在のブランチ以外強制で消せる
タグも同じ要領で消せる
`git tag | xargs git tag -d`

# masterとdevelop以外を消す
### grepコマンドを使う
ファイル中の文字列を検索するコマンド

`git branch | grep -vE '^\*|master$|develop$' | xargs -I % git branch -D %`
-vは一致しないものを検索するオプション
-Eは拡張正規表現を使うオプション

辞書登録しておくと便利なのでおすすめです:grinning:

# リモートにないローカルリモート追跡ブランチを消す

`git fetch -p`
-p は--pruneの略

# リモートにあるブランチを消す
`git push origin :ブランチ名`
空の箱をリモートにプッシュして消すイメージ
コロンの左側にローカルブランチ右側にリモートの対象ブランチ
githubだと画面でゴミ箱のアイコンを押せばいい

# リモートにあるブランチを一括で消す
### cut コマンドを使う
指定した部分だけを切り出すコマンド

originなら下記で行けるはず  
`git branch -r | cut -c 10- | xargs -I % git push origin :%`
branch -r でリモートの一覧を出すが
リモート名が邪魔なのでcutで消す。  
`git branch -r | cut -c ？？-`  
でどうなるか結果を確認したら良い
まぁ使うことなさそう
Railsでmysqlをdump、reset、restoreするRakeタスク

# やりたいこと

以下の処理を行うRakeコマンドを作る。
1. mysqlのデータをダンプする。
2. `rails db:migrate:reset`でスキーマを初期化する。
3. 1でダンプしたデータをリストアする。


# ソースコード

```lib/tasks/db.rake
namespace :db do
  desc 'Dump the database to tmp/dbname.dump'
  task dump: %i[environment load_config] do
    config = ActiveRecord::Base.configurations[Rails.env]
    ignore_table_option = %w[ar_internal_metadata schema_migrations].map { |table| "--ignore-table=#{config['database']}.#{table}" }.join(' ')
    sh "mysqldump -u #{config['username']} -p#{config['password']} #{config['database']} --no-create-info #{ignore_table_option} > tmp/#{config['database']}.dump"
  end

  desc 'Restore the database from tmp/dbname.dump'
  task restore: %i[environment load_config] do
    config = ActiveRecord::Base.configurations[Rails.env]
    sh "mysql -u #{config['username']} -p#{config['password']} #{config['database']} < tmp/#{config['database']}.dump"
  end

  desc 'Dump and reset and restore'
  task dump_reset_restore: %i[environment load_config] do
    Rake::Task['db:dump'].invoke
    Rake::Task['db:migrate:reset'].invoke
    Rake::Task['db:restore'].invoke
  end
end
```

# 使い方

```sh
rails db:dump_reset_restore
```

# 参考

- [mysqldumpでダンプするrakeタスク](https://qiita.com/hmuronaka/items/e778b234e8c4798953f6)
- [[Ruby on Rails 4] Rails で mysqldump する場合は no-create-info オプションを付けると良い](https://www.d-wood.com/blog/2017/04/18_8896.html)
Keras で学習するとき、 initial_epoch を使って学習を途中から始める方法

## 背景
Keras では、 `model.fit()` を何度もコールすると続きから学習を再開することが可能です。しかし、 Tensorboad でのログを出力する必要がある場合、`epochs` と `initial_epoch` を適切に設定する必要があります。

## 問題点

`model.fit()` を単純に何度も呼ぶと、 Tensorboard 用のログには、毎回 0 epoch から始まったとして記録されます。そうすると、下記の画像のように、同じ範囲を何度も繰り返すグラフができてしまいます。

![スクリーンショット 2018-06-11 18.12.29.png](https://qiita-image-store.s3.amazonaws.com/0/17385/d92ca7e8-6bdf-88cd-38c8-d826cd284316.png)

この図の例では、 `epochs = 100` を設定し `model.fit()` を繰り返しました。
`model.fit()` を複数回に分けて実行し、かつ、グラフも正しく途中からはじまり、自然につながったものを書くには、 `initial_epoch` と `epochs` を適切に設定する必要があります。

## 解決方法

`initial_epoch` を設定したとき、 `epochs` は最終 epoch を意味します。最終 epoch というのが何を表しているのか、具体例とともに説明します。
ここでは、一回の施行で 100 epochs の学習を行い、これを 1 step　として、合計 5 steps 行うとします。
はじめの step では、

```python

model.fit(x, y, initial_epoch=0, epochs=100)  # step1
```

とすることで学習できます。
次の step では、 `initial_epoch=100` とします。このときに、 `epochs=100` のままではなくて、 `epochs=200` にする必要があります。この `epochs=200` というのが最終 epoch という言葉の意味を表しています。
言い換えると、 `epochs` は実際に学習する epoch の数ではなく、 N epochs まで学習するという、 epoch の終わりを意味していると言えます。公式ドキュメントにも下記のように書かれています。

> initial_epochと組み合わせると，epochsは「最終エポック」として理解されることに注意してください．
このモデルはepochsで与えられた反復回数の訓練をするわけではなく，単にepochsという指標に試行が達するまで訓練します．

では、残りの 4 step を一度に書いてみます。

```python

model.fit(x, y, initial_epoch=100, epochs=200)  # step2
model.fit(x, y, initial_epoch=200, epochs=300)  # step3
model.fit(x, y, initial_epoch=300, epochs=400)  # step4
model.fit(x, y, initial_epoch=400, epochs=500)  # step5
```

ちなみに、 例えば step 5 では、 `initial_epoch=400`, `epochs=500` となっていますが、 `initial_epoch=401` のように開始を 1 ずらさなくてもいいのでしょうか？
keras のコードを確認してみると、

```python

for epoch in range(initial_epoch, epochs):
    ...
```

というように記述されています。このことから、 `initial_epoch=400`, `epochs=500` で問題ないことがわかります。

該当コード: https://github.com/keras-team/keras/blob/a80ecd78daf7d464a6ff915111f62b8cd21c8b6b/keras/engine/training_arrays.py#L140

では、以上を踏まえて、 code snippet としてまとめて終わりとします。

```python

epochs = 100
step = 5
for s in range(step):
    start_epochs = epochs * s
    end_epochs = start_epochs + epochs
    model.fit(x, y, initial_epoch=start_epochs, epochs=end_epochs)
```
![スクリーンショット 2018-06-11 18.36.48.png](https://qiita-image-store.s3.amazonaws.com/0/17385/c85dc514-d2a1-c714-5aaf-3711acdb88c4.png)


## 参考

- 公式ドキュメント
    - https://keras.io/ja/models/model/
- SO
    - https://stackoverflow.com/questions/47750388/tensorboard-callback-in-keras-does-not-respect-initial-epoch-of-fit
CentOS7にPHP7.2とphp-pecl-zipを入れてもzipが有効にならない件

#背景
CentOS7にPHP7.2を入れてLaravelをインストールしようとしていた。
で、composer global require "laravel/installer" したところで以下のようなエラー。

```
$ composer global require "laravel/installer"

Changed current directory to /home/webuser/.config/composer                                                                          
Using version ^2.0 for laravel/installer
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - laravel/installer v2.0.1 requires ext-zip * -> the requested PHP extension zip is missing from your system.
    - laravel/installer v2.0.0 requires ext-zip * -> the requested PHP extension zip is missing from your system.
    - Installation request for laravel/installer ^2.0 -> satisfiable by laravel/installer[v2.0.0, v2.0.1].

  To enable extensions, verify that they are enabled in your .ini files:
    - /etc/opt/remi/php72/php.ini
    - /etc/opt/remi/php72/php.d/20-bz2.ini
    - /etc/opt/remi/php72/php.d/20-calendar.ini
    - /etc/opt/remi/php72/php.d/20-ctype.ini
    - /etc/opt/remi/php72/php.d/20-curl.ini
    - /etc/opt/remi/php72/php.d/20-exif.ini
    - /etc/opt/remi/php72/php.d/20-fileinfo.ini
    - /etc/opt/remi/php72/php.d/20-ftp.ini
    - /etc/opt/remi/php72/php.d/20-gettext.ini
    - /etc/opt/remi/php72/php.d/20-iconv.ini
    - /etc/opt/remi/php72/php.d/20-json.ini
    - /etc/opt/remi/php72/php.d/20-phar.ini
    - /etc/opt/remi/php72/php.d/20-sockets.ini
    - /etc/opt/remi/php72/php.d/20-tokenizer.ini
  You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode.

Installation failed, deleting ./composer.json.
```

PHP7.2とphp-zipはremiレポジトリからインストール済。

##やったこと
php.dにzipの表記がないからかな？と、とりあえず設定を入れてみる。

```
$ sudo echo "extension=zip.so" > /etc/opt/remi/php72/php.d/20-zip.ini
$ php --ri zip
PHP Warning:  PHP Startup: Unable to load dynamic library 'zip.so' (tried: /opt/remi/php72/root/usr/lib64/php/modules/zip.so (/opt/remi/php72/root/usr/lib64/php/modules/zip.so: cannot open shared object file: No such file or directory), /opt/remi/php72/root/usr/lib64/php/modules/zip.so.so (/opt/remi/php72/root/usr/lib64/php/modules/zip.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
Extension 'zip' not present.
```

やっぱあかん。zip.soどこにあるんよ。

```
$ sudo find / -name zip.so -print
/usr/lib64/php/modules/zip.so
/usr/lib64/php-zts/modules/zip.so
```
なんでremiレポジトリから入れてるのに普通っぽいところに入ってるの・・・？

とりあえずリンクとか張ってみてもう一回見てみる。

```
$ sudo ln -s /usr/lib64/php/modules/zip.so /opt/remi/php72/root/usr/lib64/php/modules/zip.so
$ php --ri zip
zip

Zip => enabled
Zip version => 1.15.2
Libzip headers version => 1.3.2
Libzip library version => 1.5.1
```
いけた、、のか？バージョン自体はyumでインストールしたときのと同じっぽいけど・・・。

なんかしっくりこない・・・。
CakePHP3.6で Router::url(null, true) の挙動が変わった

ちょっとハマったので同じような方がいたときのために残しておきます。

## 変更点
- クエリパラメーターも返すようになった。ただ、それだけです。

### 3.5系
- 3.5.12で検証（controller / component内から実行）

```php
// http://example.com/api/users?page=1 にアクセスした場合
$currentUrl = Router::url(null, true);
echo $currentUrl; // http://example.com/api/users が返ってくる
```

### 3.6系
- 3.6.4で検証（controller / component内から実行）

```php
// http://example.com/api/users?page=1 にアクセスした場合
$currentUrl = Router::url(null, true);
echo $currentUrl; // http://example.com/api/users?page=1 が返ってくる
```

## ちょっと深掘り
- [このタイミング](https://github.com/cakephp/cakephp/commit/54cd172c605f7f11db75ba46dd56b136965d556a#diff-53e2eaefba8d08c4ae2d0d082ef4d2d4R624)で変更になったようです。
- 3.5系では `$request->here` が取得元で `$here` は[このように設定](https://github.com/cakephp/cakephp/blob/3.5.17/src/Http/ServerRequest.php#L326)されており、クエリパラメーターが付与されていない。
- 3.6系では `$request->getRequestTarget()` が取得元で `getRequestTarget()` は[このようなメソッド](https://github.com/cakephp/cakephp/blob/3.6.4/src/Http/ServerRequest.php#L2330)になっており、クエリパラメーターが付与されている。
- すべてのパターンをみたわけではないので、間違っている箇所・説明不足な点がありましたら、ご指摘いただけると幸いです。
【備忘録】Pythonセットアップ

#はじめに
この備忘録は、Anaconda3 5.1.0 (Python3.6.4) のインストール時のメモ書きです。
最終的にはPyCharmで開発を行えるようにしたいと思います。

#OS
Windows 10 Pro 64bit

#手順

まずは、下記URLからAnacondaのインストーラをDL。
https://www.anaconda.com/download/
![1-01.png](https://qiita-image-store.s3.amazonaws.com/0/236851/0b11c710-33bf-4504-5758-9cb62cbcef1d.png)

画面の下に行くとダウンロードボタンがあるので、自分の環境に合わせたものを選択。
![1-02.png](https://qiita-image-store.s3.amazonaws.com/0/236851/43a9b627-c125-4cf1-67eb-32cb84edacc2.png)

DLしたexeをダブルクリックで実行する。

Next >
![1-03.png](https://qiita-image-store.s3.amazonaws.com/0/236851/50106ec3-0abc-11d2-4a10-86ed9b34ed8c.png)

(利用規約を読んで) I Agree.
![1-04.png](https://qiita-image-store.s3.amazonaws.com/0/236851/48f328b3-1177-cfef-7b7a-5280e87df8d4.png)

Just Me を選択して Next >
![1-05.png](https://qiita-image-store.s3.amazonaws.com/0/236851/7c0d62a8-4ade-cd8b-3a31-5ad400471802.png)

任意のディレクトリを指定
(今回はデフォルトのまま、ユーザのディレクトリ下にインストール)
![1-06.png](https://qiita-image-store.s3.amazonaws.com/0/236851/c40fbcec-3937-76f5-f05b-5531bc1cb618.png)

このまま Next >
![1-07.png](https://qiita-image-store.s3.amazonaws.com/0/236851/d5661efb-35c5-129d-eace-0274f574cf20.png)

インストールちう…
![1-08.png](https://qiita-image-store.s3.amazonaws.com/0/236851/5ffbd34f-8c40-e4a0-e52f-157518b5d4b6.png)

おわった！
![1-09.png](https://qiita-image-store.s3.amazonaws.com/0/236851/580dc56f-c5f2-14f2-08ec-06f9a7f14d13.png)

せっかくなので(?) VSCodeも入れておく
![1-10.png](https://qiita-image-store.s3.amazonaws.com/0/236851/25777b86-a32f-5d32-1de5-8791bf73dd39.png)

インストール完了！！
![1-11.png](https://qiita-image-store.s3.amazonaws.com/0/236851/29082ccc-7b33-d14c-dee2-d82e2c4da3f4.png)


##試しに動かしてみる…
IDLEで起動してみる。
実行する場合は、このあたりのパスを通しておいたほうがらくちん
![1-12.png](https://qiita-image-store.s3.amazonaws.com/0/236851/9f3f36fe-055f-b9a3-9999-e0dfdb6ee5f5.png)

Win + R から、IDLE と入力
![1-13.png](https://qiita-image-store.s3.amazonaws.com/0/236851/02436440-5062-6f24-c345-94d3b5248a93.png)

一度まっくろな画面が立ち上がった後…
![1-14.png](https://qiita-image-store.s3.amazonaws.com/0/236851/942bda32-8a6f-bcad-998d-925a72b74849.png)

PythonのShellで入力できるようになる
![1-15.png](https://qiita-image-store.s3.amazonaws.com/0/236851/09110e49-57d0-a239-b976-61bd0adfa14b.png)


#次回
次はPyCharmのインストール備忘録予定
特定の build tag がある場合に処理を実行する

Go では、ビルド時やテスト時に build tag と呼ばれるフラグを渡すことができます。

build tag を使うことで、ビルド対象となるファイルを切り替えることができます。
今回、特定の build tag が指定されている場合にのみ関数を実行するヘルパー関数と、そのヘルパー関数をコード生成するコマンドをパッケージ化しました。

# build tag の扱い方

build tag が指定されている/いない場合に行う処理は、どのように書くでしょうか。

例えば、`go build -tags "debug"` として "debug" が渡された場合にのみ有効にする、という状況を考えてみます。

## 普通のやり方

コメントに [Build Constraints](https://golang.org/pkg/go/build/#hdr-Build_Constraints) を記述します。

```go:myapp_debug.go
// +build debug

func init() {
    app.InitDebugLog()
}
```

このように書くのが一番わかり易いと思います。

## ものぐさな書き方

以下のような方のために、この buildcond パッケージを作りました。

### メリット

* いちいち別ファイルを作りたくない
* 初期化処理が複数のファイルに分断されるのが嫌
* (+build の書き方を忘れそう)

### 例

[![](https://img.shields.io/badge/GitHub-shu--go%2Fbuildcond-brightgreen?logo=github)](https://github.com/shu-go/buildcond)

```go:myapp.go
import "github.com/shu-go/buildcond/cond"

func main() {
    // init hogehoge
    //   :
    cond.IfDebug(func() {
        app.InitDebugLog()
    })
}
```

```
go get github.com/shu-go/buildcond/...
```

※末尾の "/..." は必要です。

関数 buildcond/cond.IfDebug の方で debug タグ付きでビルドされたかを判断します。
debug の場合は引数の関数を呼び出し、そうでなければ呼び出しません。

あまり難しいことを考えなくてもビルド条件を考慮したコードを記述できます。

### デメリット

ただし、デメリットもあります。

* 結果的に実行不要な場合でも IfDebug は呼び出されるため、若干速度が低下する
* バイナリに不要なコードが含まれることになる
* 環境依存のコードを含む場合にビルドできない
* 型の定義を切り替えるようなことはできない

例にあるような、(しないこともできるが)追加で行うこともできるような処理を切り替える用途に使うのが、一番マッチすると思います。

# コマンド buildcond

buildcond には、コマンド buildcond が付属しており、このコマンドを使って好きな build tag の有無判断をするようなソースコードを生成できます。
このコマンドは、引数に指定したタグがある場合のコードとない場合のコードを生成します。

上記の例で出てきた関数 IfDebug はこのコマンドで生成されています。

```go
//go:generate buildcond --tag=debug --pkg=cond
//厳密にはこう解釈される … go:generate buildcond --tag=debug --pkg=cond --output=cond
```

やっていることは簡単で、text/template を使ってソースファイルを生成しています。
既存のソースファイルの解析などもせず、毎回生成先ファイルを上書きしています。
お決まりのコードをファイル単位で吐き出すだけですので、ASTを見たりもしていません。

手を入れている場所といえば、template.FuncMap を使ってキャピタライズしているくらいです。

```go
funcMap := template.FuncMap{
    "capitalize": strings.Title,
}
templ, err := template.New("tag").Funcs(funcMap).Parse(templText)
// :

// templText の中身(一部)
func If{{capitalize .Tag}}(f func()) {
```
Google Play Storeから古いapkを無効にする

minsdkをあげた時やpermissionを追加した時なんかに、古いバージョンのapkと新しいapkが混在することがあります。

そういう時に、古いapkをどこから消すのかという話です。

**結論から言うと、新しくリリースする時に無効にするボタンが表示されるので、それをポチポチ押してからリリースすると無効にできます。**

----

Artifact libraryメニューにもApp releasesメニューにも、どこにも削除や無効ボタンが見当たりません。

![20180611_172028_App releases - Kyash - ウォレットアプリ - Google Play Console.png](https://qiita-image-store.s3.amazonaws.com/0/15267/660d9150-b667-504e-bbf8-e501464567f8.png)

しかし、CREATE RELEASEから新しいリリースを作る画面に行くと、なんとDEACTIVATEボタンが表示されているではありませんか。

![20180611_180904_App releases - Kyash - ウォレットアプリ - Google Play Console.png](https://qiita-image-store.s3.amazonaws.com/0/15267/4e4826a0-2e8a-1da9-b153-54f305f4d19b.png)

新しいリリースをする時に、このDEACTIVATEボタンをポチポチ押してからリリースすると無効化できます。

みなさん、安心してminsdkを21にあげていきましょう。
PHPファッ〇ンキャスト

#はじめに
初投稿です。
PHPの文字列とかの比較のキャストがよくわからない仕様だったので自分なりにまとめたものです。

#バグかと思いきや仕様です
```php:PHP
if ("3aaaaa" == 3) 
{
    echo "true";
}
else
{
    echo "false";
}
```
さぁ結果はどうなったでしょう？
結果は～
**ture**

私は最初「は？」と思いましたが、どうやらPHPの仕様だそうです。
>PHPでは文字列型と数値型など異なる型で比較を行うと文字列は数値にキャスト(変換)
されます。

この仕様のお陰で文字列をintにキャストすると

```php:PHP
echo (int)"3aaaaaaa";    //3 と出力される
echo (int)"hoge";        //0 と出力される
echo (int)"01aaaaa";     //1 と出力される
echo (int)"   01db";     //1 と出力される
```
と表示されます。
これらからわかるようにキャストにもルールがあります。

**キャストルール**
文字列の先頭が数値ならばそこが抜き出され、
そうでなければ0になる。
なお、先頭の空白や0は無視される。

とありますが例外もあります、あります･･･。

##例外
文字列が数値形式である場合

```php:PHP
if ("3.0" == "3") {
    echo "true";
}else{
    echo "false";
}
```
結果**true**

```php:PHP
if ("3e0" == "3") {
    echo "true";
}else{
    echo "false";
}
```
結果**true**

あれ～おかしいね～""で囲ってるから文字列のはずなんだけどな～～
これもキャストの仕様です。

**キャストルール**
PHPでは数値形式の文字列を比較する場合、それは整数として比較されます。
つまり、文字列型と文字列型の比較の場合においてでも、
**比較対象が両方とも数値形式**(数値として解釈できる文字列)場合は、
整数型としての比較になります。

因みに以下が数値として見られる文字列です
"123" ← 数字だけ
"3.0" ← 小数点
"-6" ← 負数
"0003" ← 先頭に0と数字だけ
"1e3" ← 浮動小数点数
"0x3A" ← 16進数

#たくさんの0
```php:PHP
if ( null == false) {
    echo "true";
}else{
    echo "false";
}
```
```php:PHP
if ( 0 == "") {
    echo "true";
}else{
    echo "false";
}
```
結果  **両方ﾄﾓtrue**
一体どこにtrue要素があるのか理解に苦しみますがこれもキャストのせいです。
なんと全部0にキャストされてるのでtrueです。
ヤバイね
#対策
- 比較などをする際は必ず””(ダブルクォーテーション)で囲うなど型を意識して使う
    - 例外などを除きある程度これで対策できる
- ===(イコールイコールイコール)を使う
    - ===は$aが$bに等しく、および同じ型である場合にtrueとなるので型変換が行われず比較が行われる。
    - 但し何も考えずすべて===を使用すると動的型付け言語であるPHPとしては少々もったいないので適材適所==と===を使い分ける。
    
なので===を使うと上記の0で全部処理されていたものが以下のようになります

| ==    |null|false|“” |0   |
|:------|:---|:---|:---|:---|
| null  |true|true|true|true|
| false |true|true|true|true|
| ""    |true|true|true|true|
| 0     |true|true|true|true|
**全部true**

| ===    |null|false|“” |0   |
|:------|:---|:---|:---|:---|
| null  |<font color="Red">true</font>|false|false|false|
| false |false|<font color="Red">true</font>|false|false|
| ""    |false|false|<font color="Red">true</font>|false|
| 0     |false|false|false|<font color="Red">true</font>|
**区別される**

#まとめ
・文字列型と数値型の比較の場合、数値型と同じ型にキャストされる
・文字列型と文字列型の比較でも、両方とも数値形式の場合、数値型へキャストされる
・”==”と”===”の機能の使い分けをする、特にnull,false,””,0の比較に関しては”==”だと全てキャストされ”0”として認識され比較がすべてtrueになるので注意
　-”===”を使いキャストせずに比較する事。
PHP言語構造～真偽値～

#式
###【代入】
- 値が左オペランドに**代入される場合**

    ｛$変数名 = 値; , $変数名 = 式;｝

- 値が左オペランドに**代入されない場合**
 
    ｛$変数名 = $変数名(値が代入されていない場合)｝

###【関数】
- $変数名 = 関数( )は関数内にreturn文があれば式として成立するので右オペランドに記述できる。
- return文が無い場合はNULLを返すのでエラーにならない。

<font color="CornflowerBlue">エラーにならない理由:　返り値がある場合は式の扱いになるため</font> 

**代入時に関数を定義するとエラーがでる**
ただし、PHP5.3から無名関数というものが導入され、代入時に関数を定義できる。

###文
- 「；」が文末についていれば文になる。
文は式の中には書けない。

#真偽値の判定
###【[「偽」パターン](http://blog.livedoor.jp/shoeberry/archives/52272492.html)】
- 論理型(boolean)のFALSE
- intergerの0
- Floatの0.0
- 空の文字列、および文字列の"0"
- メンバ変数の数がゼロであるオブジェクト(PHP 4のみ)
- 特別な値NULL(値がセットされていない変数を含む)
- 空のタグから作成された SimpleXML オブジェクト

上記以外は「<font color="Red">真</font>」となる。

[真偽値の比較一覧](http://php.net/manual/ja/types.comparisons.php)

###【[比較演算子](https://wp-p.info/tpl_rep.php?cat=php-biginner&fl=r22)】
- ==  : オペランド同士が等しいならば『true』を返します
- === : オペランド同士が厳密に等しいならば『true』を返します
- !=  : オペランド同士が等しくないならば『true』を返します
- !== : オペランド同士が厳密に等しくないならば『true』を返します
- >   : 左オペランドが右オペランドより大きいならば『true』を返します
- >=  : 左オペランドが右オペランドより大きいまたは等しいならば『true』を返します
- <   : 左オペランドが右オペランドより小さいならば『true』を返します
- <=  : 左オペランドが右オペランドより小さいまたは等しいならば『true』を返します

#言語構造
言語構造は最初から存在しているため、そのまま使える。

- if
- else
- elseif
- evho
- print
- function
- for
- foreach
- array()
- break
- const
- die()
- empty()
- eval()
- exit()
- isset()
- list()
- return

言語構造には返り値の有無が存在するので右オペランドに記述できるものもある。
記述例:  print
<php?

$a  =  print  '<font color="Blue">テストだよ</font>' ;

var_dump(<font color="DarkOrange">$a</font>);

?>
上のコードを実行すると「<font color="Blue">テストだよ</font><font color="DarkOrange">int(1)</font>」と表示される。
仮にechoを右オペランドに記述するとエラーが発生してしまう。
何故かというとprintには返り値の有り、echoには返り値が無いからである。

参考サイト
>- [Markdown記法](http://www.markdown.jp/syntax/)
- [【PHP超入門】式・文・構文・言語構造・制御構造について - Qiita](https://qiita.com/7968/items/d739e926189e219273bd)
- [真偽値(論理値)と比較演算子|PHP入門編](https://wp-p.info/tpl_rep.php?cat=php-biginner&fl=r22)
- [ミネソタに移住した生涯プログラマーなホッケーライフブログ](http://blog.livedoor.jp/shoeberry/)
2018/06_02 御題決め

# 今週の課題

はい。ってことで２つめのワンドロ開発。

先週はなんかギリギリになってましたが
まぁ、いいでしょう（自分に甘い）


そんなわけで今回の御題はこちら！

**「LAN内で利用するテキスト通信アプリケーション」**

イメージ的には[IPMessanger](https://ipmsg.org/)様みたいな感じね。
いやぁ、サラリーマン時代は大変お世話になりました。
今後もお世話になるかもしれないけど。

これ一週間で出来るかなー？


言語はJavaで行きましょうか。
通信アプリなんだし、OS選びたくないものね。

とりあえず送受信が出来ればいいかな。

名前は、そうね。
privateMessangerとでもしますか。

さて、出来るかなー？
前回は調査時間あんまりとらなかったけど、今回は結構調べ物入りそう。

さ、何はともあれ設計からはじめましょうか。
【A Tour of Go】Concurrency/Exercise: Equivalent Binary Trees (8/11)

A Tour of Go の Exercise を実施したときのメモ。

# Walk の処理

treeをたどりながら channel に値を書き出す。
1. まず、Left を端までたどる(Leftで Walk を再帰呼び出し)
2. 末端(t == nil)になったら tree を戻る
3. 戻ったところで Valueを出力し、Right で Walk を再帰呼び出し

```exercise-equivalent-binary-trees.go
package main

import "golang.org/x/tour/tree"
import "fmt"

// Walk walks the tree t sending all values
// from the tree to the channel ch.
func Walk(t *tree.Tree, ch chan int) {
	if t == nil {
		return
	}
	Walk(t.Left, ch)
	ch <- t.Value
	//fmt.Println("V: ", t.Value)
	Walk(t.Right, ch)
}

// Same determines whether the trees
// t1 and t2 contain the same values.
func Same(t1, t2 *tree.Tree) bool {
	return true
}


func main() {
	ch := make(chan int, 10)
	go Walk(tree.New(1), ch)
//	for c := range ch {
//		fmt.Println(c)
//	}
	for i := 0; i < cap(ch); i++ {
		fmt.Println(<-ch)
	}
}
```

## Walk の処理2

* `t.Left == nil && t.Right == nil` の条件を追加すると、再帰呼び出しの回数が減らせる
* ただ、判定処理が追加になるので速度がどうなるか

```go:
func Walk(t *tree.Tree, ch chan int) {
	switch {
	case t == nil:
	case t.Left == nil && t.Right == nil:
		ch <- t.Value
		fmt.Println("N: ", t.Value)
	default:
		Walk(t.Left, ch)
		ch <- t.Value
		fmt.Println("V: ", t.Value)
		Walk(t.Right, ch)
	}
}
```

# Same の処理

* 2つのtreeをそれぞれWalkで処理し、channel の値を順に読み出して比較する
* どれか1つでも異なるものがあれば false にする
  * が、内容確認のため全件確認している

```go:
// Same determines whether the trees
// t1 and t2 contain the same values.
func Same(t1, t2 *tree.Tree) bool {
	ch1 := make(chan int, 10)
	ch2 := make(chan int, 10)
	go Walk(t1, ch1)
	go Walk(t2, ch2)
	ret := true
	for i := 0; i < cap(ch1); i++ {
		i1 := <-ch1
		i2 := <-ch2
		fmt.Println(i1, i2)
		if i1 != i2 {
			ret = false
		}
	}
	return ret
}
```
brewでCrystalのREPLのicrをインストール

## やりたいこと

[Crystal](https://crystal-lang.org/)のREPLの[`icr`](https://github.com/crystal-community/icr)をMacにインストールします

`icr`があるとRubyの`irb`や`pry`ようにインタラクティブにCrystalを試せます。

## インストール

```bash
brew install crystal-icr
```

## 実際に使う

以下のように色もついてくれて、便利に使えました。

![opt.gif](https://qiita-image-store.s3.amazonaws.com/0/84451/b6b68cb1-8eca-8d10-0c4e-87199ff6bdaf.gif)



## 先駆者さん

@takiuchi さんが　[CrystalでREPLを実現するcrystal-icrの紹介 - Qiita](https://qiita.com/takiuchi/items/fa828cc7b60c1b2b4816)　で `icr`のついて説明されています。当時はhomebrewの公式のリポジトリに、icrがなかったようです。現在は <https://github.com/Homebrew/homebrew-core/blob/master/Formula/crystal-icr.rb> のように公式にFormulaがあるので、上記のコマンドでインストールできました。

## 参考

* [CrystalでREPLを実現するcrystal-icrの紹介 - Qiita](https://qiita.com/takiuchi/items/fa828cc7b60c1b2b4816)　
* [CrystalIcr — BrewFormulas](http://brewformulas.org/CrystalIcr)
Chefで、Ruby実行時とリソース実行時の変数の値の差を抑えるには、イテレータで変数として渡された値を使うと容易

#fileリソースでのcontentに対するlazy指定
個人的には、その前のリソースで既に編集されている可能性があるファイルを編集する際には、fileリソースでcontent lazy {  } をよく使う。
(lazy指定が無いと、編集対象が、他リソース未適用のファイル内容となってしまう。)

```ruby:recipes/default.rb


file '/tmp/test.txt' do
  content lazy {

    # 何らかの文字列を返す処理
    `cat #{path} | sed -e 's/^AAA=.*$/AAA=true/'`

  }
end

```
この例では、ファイルの内容に対して、sedにて編集を行なっている

#Ruby実行時とリソース実行時のズレによる問題の例
ここで、このcontent lazy { } の中に値を渡す時には、Ruby実行時とリソース実行時のズレを考慮しないと問題となりうる。

```ruby:recipes/default.rb

val = 'true'

file '/tmp/test.txt' do
  content lazy {

    # 何らかの文字列を返す処理
    `cat #{path} | sed -e 's/^AAA=.*$/AAA=#{val}/'`  # この#{val}の値は？

  }
end

...

val = 'false' # 別の処理でvalに'false'を設定して使用

...

```
適用時には、どの様にリソースを実行するのかを決める為にまずRubyのプログラムとして実行され、その後、その結果に基づいてリソースの反映が行われる。
しかし、lazy指定箇所はリソース反映時に処理される。その為、この例の場合、#{val}にはRuby実行終了時点で設定されている値、つまり'false'が使用されてしまう。

#簡単な対応方法

イテレータでブロックに渡される変数を使う

```ruby:recipes/default.rb

node.default['file_edit']['AAA'] = 'true'

node['file_edit'].each do |key, val|
  file '/tmp/test.txt' do
    content lazy {

      # 何らかの文字列を返す処理
      `cat #{path} | sed -e 's/^#{key}=.*$/#{key}=#{val}/'`

    }
  end
end

...

val = 'false' # 別の処理でvalに'false'を設定して使用

...


```

これなら、最初のvalは.eachのブロック内でのみ有効なので、#{val}には'true'が設定される。
(ついでにkey部分も汎用化)








#蛇足 : 汎用的な対応？？？
イテレーターへの値渡し以外では、


```ruby

# NG
begin

  ...

end


# NG
1.times {

  ...

}


# OK イテレータへの値渡しそのもの
[val].each do |val|

  ...

end


# OK やりすぎ感
def file_tmp_test_txt(val)

  ...

end

file_tmp_test_txt(val)


```

予想外にも、あまり綺麗な方法は見つかっていない。
日本の方がよく使うタイルをQGIS3.0xに一発でたくさん登録できてた件

この記事のやり方はもう古いので2023/7に書き直しました、お手数ですが下記でご確認をお願いいします🙇‍♂

https://qiita.com/Yfuruchin/items/d94a72dcbce9373f0928


---

## タイルレイヤプラグインは便利だった（遠い目
QGIS2.xでは[タイルレイヤプラグイン](http://space.geocities.jp/bischofia_vb/qgis-plugins/TileLayerPlugin/)というものがあります。このプラグインをインストールして、tsvファイルという設定ファイルを作っておけば、様々な古今東西天地無用の地図タイルファイルの読み出しや管理ができてて背景に使ったりアレコレ出来て便利だったのですが、QGIS3.0にはXYZタイル追加機能が標準で実装されたので、[現在のところこのプラグインのアップデートはしばらくなさそうです](https://github.com/minorua/TileLayerPlugin/issues/35)

## でも一個一個QGIS3に登録するのはなんかつらい
ということで、[このように](https://github.com/MIERUNE/mierune-qgis)、一個一個XYZタイルのアドレスを追加していくのもよいのですが、お気に入りのタイルがTSVにある方は、移行がめんどくさいったらありゃしない。むしろ有効活用したい

ということで、[タイルをまとめて、QGIS3に一括登録できるスクリプト](https://raw.githubusercontent.com/klakar/QGIS_resources/master/collections/Geosupportsystem/python/qgis_basemaps.py)をちょっといじらせてもらって、日本にいる人がよく使う一覧をこさえました。

登録されるのは、以下のタイルです。
※利用規約が怖い某大手のアレとか特許からみそうなアレとかは避けてますすみません。

MIERUNE_Color
MIERUNE_Mono
OpenStreetMap
日本CS立体図（5mメッシュあり）
北海道CS立体図(10mメッシュのみ）
九州沖縄CS立体図（10mメッシュのみ）
地理院標準地図
地理院淡色地図
地理院白地図
地理院English
地理院色別標高図
地理院写真
国土画像情報（第一期：1974～1978年撮影）
国土画像情報（第二期：1979～1983年撮影）
国土画像情報（第三期：1984～1986年撮影）
国土画像情報（第四期：1988～1990年撮影）
空中写真（1961～1964年）
空中写真（1945～1950年）
簡易空中写真（2004年～）
数値地図5000（土地利用）
土地利用図

## 使い方
1. [スクリプト](https://github.com/Yfuruchin/QGIS_resources/raw/master/collections/Geosupportsystem/python/qgis_basemaps_jp.py)を任意のフォルダ(c：tempなど)にダウンロード
2. QGIS3を開く
3. プラグイン→Pythonコンソール
 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/100567/57465f98-7bb7-418e-dc68-f713bfff1788.png)
4. コンソールに
` exec(open('C:\temp/qgis_basemaps_jp.py',encoding='utf-8').read())`
![image.png](https://qiita-image-store.s3.amazonaws.com/0/100567/bb5040e7-07c0-d710-0862-c2eec42f1bf6.png)
を入力してリターン
※`C:\temp`部分は、保存したフォルダに変えてもOKです、OSXな方は書類フォルダなどにおいた場合、`/Users/【ユーザー名】/Documents/`　になります
※UTF-8がうまく通らないのでめんどくさい起動のやり方になってますすみません（もしくはいいやり方あればお教え下さい）
5. ブラウザパネルに追加されまくりで登録完了！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/100567/b5156e36-a4f0-fcaf-c794-78e40bb24a4c.png)
6. 使いたいレイヤをダブルクリックすると、マップキャンバスに追加されます
 ![image.png](https://qiita-image-store.s3.amazonaws.com/0/100567/edb68582-f050-b3b0-734c-c203026cab4e.png)

7．成果物に使用するときは、ブラウザのXYZレイヤのプロバティの著作権表記テキストを確認しれ、表記しましょう！([Maptiles by MIERUNE, under CC BY. Data by OpenStreetMap contributors, under ODbL.とか(C)OpenStreetMap contributors とか、地理院タイル　とか…)
※[こちら](https://maps.gsi.go.jp/development/ichiran.html)なども御覧ください




※WMS/WMTSレイヤの追加でもできなくもないが…まあいいか
MyBatis3で<mappers><package name="...">を指定した時の動きについて


背景
------

ある日、MyBatis3の機能を眺めてた。

http://www.mybatis.org/mybatis-3/ja/configuration.html#mappers 

``` xml
<!-- Register all interfaces in a package as mappers -->
<mappers>
  <package name="org.mybatis.builder"/>
</mappers>
```

お、パッケージ名与えればMapperクラスやMapperXMLファイルを呼んでくれそうだ。便利そう。

でもドキュメントに詳しく書かれていないので動きが良くわからない。不安。

具体的には以下が不安。

- 上記のパッケージ指定の場合、`org.mybatis.builder` の「何」が読みこまれるのか？
  - Classファイルは読むのか？ 
  - Mapper XMLファイルは読むのか？どういう規則で？

調べれば出てきそうだけど、ググりにくかったので実際にコードみて調べました。


先に結論
--------------

- パッケージ直下のinterfaceなクラスファイルは全部Mapperクラスと判断する（っぽい）
- Mapperクラスと同じPathかつ同名のXMLファイルがあれば読み取る

具体的な例として、パッケージ名として例(`org.mybatis.builder`)を与え、そのパッケージ直下にもし`UserMapper`というクラスがあった場合・・・

- クラスパス上の`org/mybatis/builder/UserMapper.class`というインタフェースがあれば読み取る
- さらにクラスパス上に`org/mybatis/builder/UserMapper.xml`も存在すれば読み取る。(無ければ特に何もしない。)




コードをよんだ
------------

当時最新(?)の3.4.xブランチをベースに読みました。

XMLの設定ファイルである`<mappers>`がどう扱われるかから追います。この設定ファイルを処理するクラスが`XMLConfigBuilder`です。

- https://github.com/mybatis/mybatis-3/blob/3.4.x/src/main/java/org/apache/ibatis/builder/xml/XMLConfigBuilder.java
  - mapperElementでXML設定ファイルから<package>の値が読まれる
  - package値を使い、Configuration#addMappersを呼ぶ
- https://github.com/mybatis/mybatis-3/blob/3.4.x/src/main/java/org/apache/ibatis/session/Configuration.java
  - MapperRegistry#addMappersを呼び出す（たらいまわし）
- https://github.com/mybatis/mybatis-3/blob/3.4.x/src/main/java/org/apache/ibatis/binding/MapperRegistry.java
  - resolverUtil.findでパッケージ配下のクラスを探す（クラスパス依存で、再帰ではなさそう）
  - 見つけたクラスを片っ端からaddMapperする
  - その際、interfaceであることをチェックし、interfaceでないなら無視する。
  - addMapper内でMapperAnnotationBuilder#parseを行う
- https://github.com/mybatis/mybatis-3/blob/3.4.x/src/main/java/org/apache/ibatis/builder/annotation/MapperAnnotationBuilder.java
  - 見つけたクラス(type)を「`type.getName().replace('.', '/') + ".xml"`」で変換し、XMLファイルパスを作り、XMLMapperBuilderで読む


ドキュメントにもうちょい書いてほしい...
AppEngineGo フォルダ構成

#AppEngineGoにおけるフォルダ構成
こんにちは、少し前に[AppEngineGoの環境構築のお話](https://qiita.com/IJN-Penguin/items/782a23662d68aab1316c)を書きました。
今回はGoの公式ドキュメントに従ってAppEngineGoにおけるフォルダ構成を考えてみようと思います。
フォルダ構成について述べられている日本語のドキュメントが少ないのでこれからAppEngineGoを始める方の参考になればと思います。
※今回もあくまで自分のメモ程度
##プロジェクトフォルダの作成場所
環境構築が終わり Hello,World アプリをデプロイすると次に行うのはプロジェクトフォルダの作成だと思います。
AppEngine...というよりGoにおけるプロジェクトフォルダの構成になりますが、公式に従うと以下のようになります。

$GOPATHが現在のカレント

```bash:terminal
$ tree
.
├── bin
├── pkg
└── src
    ├── github.com
    │    └── 製作者ハンドルネーム(制作チーム名など)
    │  　　　　　　　　   └── アプリケーション名
    │　　　　　　　　　　　　　　　　　　　　　　　  ├──　　app
    │　　　　　　　　　　　　　　　　　　　　　　　  │   ├── app.go
    │　　　　　　　　　　　　　　　　　　　　　　　  │   └── app.yaml
    │　　　　　　　　　　　　　　　　　　　　　　　  │
    │　　　　　　　　　　　　　　　　　　　　　　　  └── hoge
    │                  └── hoge.go
    │           
    ├── golang.org
    └── google.golang.org
```

[AppEngineGoライブラリをgo getで取得](https://qiita.com/IJN-Penguin/items/782a23662d68aab1316c#go%E3%81%ABappengine%E9%96%A2%E9%80%A3%E3%81%AE%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B)まで完了するとGOPATH配下にはbin,pkg,srcが生成されていてsrcフォルダの中にgithub.comなどのフォルダがあると思います。
公式ドキュメントに従ってプロジェクトを作成するなら、このgithub.comフォルダの下に製作者のハンドルネームなどをつけたフォルダを作ります。
私であれば「ijn-penguin001」などですね。
さらにその下にアプリケーション名をつけたフォルダを作ります。
これがAppEngineGoにおけるプロジェクトフォルダです。
プロジェクトフォルダの下には各パッケージフォルダを作成します。
上の構成における「main.go」からローカルパッケージhogeの参照は以下のように書けます。

```go:main.go
package main

import (
    "github.com/製作者名/アプリケーション名/hoge"
)
```

全部が正しいかと言われると私もまだ曖昧な点がありますが、github.comフォルダの配下に作っていくのはGo公式のドキュメントで説明されていますので正しいと思います。

##あとがき
まだまだ日本語ドキュメントが少ないGolang。
ましてAppEngineGoとなると検索して出てくる日本語の情報はそこまで多くないと思います。
この記事がこれからAppEngineGoを始める方の参考に少しでもなれば幸いです。

今回も自分のメモ程度ですが、間違っている点等ありましたらコメントなどで教えて頂ければと思います。
aws-cliがいきなり"AuthFailure"となった件

# 発生したエラー
```
[nkym@localhost ~]$ aws ec2 describe-instances

An error occurred (AuthFailure) when calling the DescribeInstances operation: AWS was not able to validate the provided access credentials
```

# 原因特定までの道のり
１.`aws configure`を叩いてキーを確認
問題なし。

２.`IAM`確認
問題なし。

３.`aws --debug ec2 describe-instances`を叩いてデバッグ

```
[nkym@localhost ~]$ aws --debug ec2 describe-instances

<省略>
2018-06-11 16:57:10,271 - MainThread - botocore.vendored.requests.packages.urllib3.connectionpool - DEBUG - "POST / HTTP/1.1" 401 None
<省略>
```
http 401がでている。
このデバッグのログを調べたところ、時間がずれているとaws-cliが通らないとの情報入手（先人の方々と公式ドキュメントに感謝）。
公式ドキュメント：https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/set-time.html

４．`date`コマンド叩く
ローカルPCの時刻が正しい時間から５分進んでいるのでこれが原因。

#解決
以下のコマンドを叩いてntpサーバと同期して解決。

```
sudo ntpdate -v ntp.nict.jp
```
私の場合は社内のポート123が閉じられてたので社内ntpサーバを指定したが、
時刻同期がしっかりしていれば問題なく使用できた。

#蛇足
ためしに`sudo date -s "06/11 17:00 2018"`というコマンドを時刻になった時に、
目測で合わせてあげてもaws-cliは問題なかった。
ntpサーバと同期するのが一番ではあるが気になったので。
[Excel関数版] userAgentでブラウザ＆デバイス判別

#Excelでユーザーエージェント判定
webで探したら見つからなかった。
もう２度と作りたくないからメモ。

■シチュエーション
ExcelのセルA1に、useragentが入っていると仮定して、デバイス判定&ブラウザ判定
■確認Version 
Excel 2016 for Mac

```
▼デバイス判定
=IF(COUNTIF(A1,"*iphone*")>0,"iphone",IF(COUNTIF(A1,"*ipod*")>0,"ipod",IF(COUNTIF(A1,"*android*")>0,"android",IF(COUNTIF(A1,"*windows*")>0,"windows",IF(COUNTIF(A1,"*mac os x*")>0,"mac os","other")))))
```

```
▼ブラウザ判定
=IF(COUNTIF(A1,"*edge*")>0,"edge",IF(COUNTIF(A1,"*iemobile*")>0,"iemobile",IF(COUNTIF(A1,"*trident/7*")>0,"ie11",IF(COUNTIF(A1,"*opera*")>0,"opera",IF(COUNTIF(A1,"*msie 6.*")>0,"ie6",IF(COUNTIF(A1,"*msie 7.*")>0,"ie7",IF(COUNTIF(A1,"*msie 8.*")>0,"ie8",IF(COUNTIF(A1,"*msie 9.*")>0,"ie9",IF(COUNTIF(A1,"*msie 10.*")>0,"ie10",IF(COUNTIF(A1,"*chrome*")>0,"chrome",IF(COUNTIF(A1,"*safari*")>0,"safari",IF(COUNTIF(A1,"*firefox*")>0,"firefox","other"))))))))))))
```


参考：「userAgentでブラウザ＆デバイス判別 2017年版」
https://qiita.com/gurigurico/items/bd19ed121bfdf77fced6