OmniAICreator/Qiita-1.07M huggingface dataset:
GISの独習をGISの専門書以外によって始める『図説わかる測量』等

　GISの独習を行うにあたって参考になる書籍を探し続けた結果、次の書籍に辿り着きました。いままさにGISを学び、難しさに悩んでいる方のために紹介します。

『図説わかる測量』　学芸出版社　2014年12月1日発行　ISBN：978-4-7615-2583-5
11章　GIS（地理情報システム）この章は、152頁から164頁まで。執筆は那須充（なす・みつる）先生によるものです。その他の章は無視して、11章だけを読めばよいということではありません。この書籍全体がGISの学習に役立ちます。

目次より、大まかな掲載内容をご紹介します。
１．GISとは
２．GISの構成要素を理解しよう
３．データベースに格納するデータはどのように準備するか
４．GISエンジンとデータベース管理システム
５．GISが装備しているさまざまなデータ処理・加工の機能
６．GISのさまざまな利活用の展開

　この書籍の注目した章を読んでわかったこと。これは2つあります。ひとつは、GISであつかう地理空間情報（以下、データ）が、どこから、どのようにしてやってくるのか。もうひとつは、GISでデータを処理・加工するときに出てくるGIS用語がいったい何を意味しているのか。このふたつが明瞭に記されていたことが大きな収穫でした。
　そして、測量を知らずに、いきなりGISソフトウェアを使って何かをしてみようとするアプローチには、その行為による落し穴があります。

　この穴への落下を回避するために、紹介した『図説わかる測量』にてGISを学習する場合は、2章 地球の形と地図の表し方を知る－第1節 地球の形と基準を知ろう － ３．地球上の位置を求める基準 の項にある座標系の知識を逃さないことが重要です。「地理座標系」と「測地座標系」というなじみのない用語に慣れて、説明に納得がいくようになるまで、複数のGISに関する書籍を開いてみる必要があるかもしれません。前述の『GIS実習オープン教材』に「測地系と座標系」という項があります。こちらも参照ください。

　那須充先生については、ウェブで調べていただければ納得される方が多くいらっしゃると思いますが、参考までに著作（翻訳本）をひとつご紹介して本稿を終わります。
『インターネットGIS』B.プリュー 著；岡部篤行，東明佐久良，那須充　訳　古今書院　2001.6
Laravel HTTPテスト POSTで値を投げる方法

# 前提
Laravel 5.5
PHP 7.1
PHPUnit 6.5.8

# 書くこと
LaravelのHTTPテストでPOST値を投げる書き方
（公式ドキュメントで見つけられなかった。 見逃したかな）

# やり方

```php
<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;

class ExampleTest extends TestCase
{

    public function test_商品の登録処理()
    {

         //第二引数にPOST値の配列を渡すだけ
         $response = $this->post('/item/add',[
            'item_id' => '1',
            'item_name' => 'ほげほげ'
        ]);

        //登録処理が完了して、一覧画面にリダイレクトすることを検証
        $response->assertRedirect('/list');
    }

    //POSTするフォームが配列型の場合（items[][item_id]みたいな
    public function test_複数商品の登録処理()
    {

         //第二引数にPOST値の配列を渡すだけ
         $response = $this->post('/item/add',[
            'items' => [
                 [
                     'item_id' => '1',
                     'item_name' => 'ほげほげ'
                 ],
                 [
                     'item_id' => '2',
                     'item_name' => 'ほげほげ2'
                 ],
             ];
        ]);

        //登録処理が完了して、一覧画面にリダイレクトすることを検証
        $response->assertRedirect('/list');
    }
}

```
rosでリアルタイムにプロットする

# 使うもの
rqt_plot 

# インストール
`rosdep install rqt_plot`

## 描画
### 1. コマンドラインで
```
rqt_plot
```


### 2. topicの追加
今走っているTopicを使う
```
/ardrone/navdata/ax
```

### 3. subplotしたい場合はコマンドラインで
```
rqt --command-start-plugin rqt_plot --args
```

![rqt_graph.png](https://qiita-image-store.s3.amazonaws.com/0/146448/38bc58d9-7279-84d2-a73b-313746f810d4.png)
jQueryの処理はComponentに書く

#趣旨
angularからjQueryの処理を呼び出すためにはどうすればいい？
jQueryの処理を記載してみたものの、どうにも動かなくて困った...:thinking:
どこでつまづいたのか、どう対応したのかについて説明します。

#つまづきポイント
angularに自動で読み込んでほしかったので、assets配下にコードとjQuery.jsを配置。

```assets/common.js
// ロード時処理
$(function() {
    ...
});
```

開発ツールで確認。
コードもjQueryもangularによってscripts.bundle.jsにまとめられてる。
htmlのヘッダにscripts.bundle.jsの呼び出し宣言もつけてくれている。

…でも、どうにも実行されていないっぽい:disappointed_relieved:

#対応
jQueryの処理は、Componentの中に書く！

そもそも宣言されてるだけでただの飾りになってるのでは？と思い
Component内に移植してやるとうまく動きました:relaxed:

```main.component.ts
import { Component, OnInit } from '@angular/core';

// jQuery用の変数宣言
declare var $;

@Component({
  selector: 'main-component',
  templateUrl: './main.component.html'
})
export class MainComponent implements OnInit {
    ngOnInit(): void {
        // ロード時処理
        $(function() {
            ...
        });
      }
    }
}
```

##そんな実装で大丈夫か？
自己解決した後、調べてみると普通に対応策書かれてましたね:laughing:
[Angular2/4にてjQueryを読み込んで使用する](http://karoten512.hatenablog.com/entry/2017/11/27/162522)

今回はindex.htmlにjQueryの呼び出し宣言書いてないから、
実装には微妙な違いがあったりするけど。

一番いい実装は型宣言ファイル引っ張ってくる方式なのかなぁ？

```shell:command
npm install jquery --save
npm install --save-dev @types/jquery
```

個人的には、jQueryは必要なComponentでのみ
明示的に変数宣言して使ったほうがいいんじゃないかと思います。

後からソースコードにgrepかけて、jQuery使ってるところを簡単に特定できるし:thumbsup:

```
declare var $;
```
文字列の時間を数字に変換する

# ユースケース
CSVに時間が文字列で記載されており、データベースに格納するときに数字にしたい

# 調査
英語の検索ワードは、「Convert time to seconds?」や「Convert HH:MM:SS to seconds」で調べることができる

# 結論
86400で割った余り
86400 = 24(時) * 60(分) * 60(秒)


```
> Time.parse("12:00:00").to_i % 86400
=> 43200
```

秒がなくても変わらない

```
> Time.parse("12:00").to_i % 86400
 => 43200 
```

61秒にするとエラー

```
> Time.parse("00:00:61").to_i % 86400
=> ArgumentError: argument out of range
```
Linux—シェルスクリプトで日付でループする (Mac対応あり)



```bash:date_loop.sh
#!/bin/bash -eu

#
# YYYY-MM-DD
#
readonly start_date=2014-02-20
readonly end_date=2014-03-02

# For mac OS
#
# You need before run this script
# $ brew install coreutils
#
# shopt -s expand_aliases
# alias date=gdate

current_date="$start_date"
while true; do

        # 処理
        echo "$current_date"

        if [ "$current_date" = "$end_date" ] ; then
                break
        fi

        current_date=$(date -d "$current_date 1day" "+%Y-%m-%d")
done
```

- [linuxのシェルスクリプトで日付でループする](https://qiita.com/hawaku/items/2f0a8454bbead2f070d2) のちょっとだけ改訂版
- シェル文法を改定
- gdateを使えばMacでも動くように

## 結果


```
2014-02-20
2014-02-21
2014-02-22
2014-02-23
2014-02-24
2014-02-25
2014-02-26
2014-02-27
2014-02-28
2014-03-01
2014-03-02
```

## バージョン

```
GNU bash, version 4.4.0(1)-release (x86_64-apple-darwin15.6.0)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
```








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Rubymineことはじめ（キーボードショートカット系）

# ファイル名を指定して開く`command + shift + O`
`TODO:`
# ファイルを往復する`control + tab`、`command + E`
- 開いているファイルだけを対象にする **Switcher** (`control + tab`)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/2883/defca6ac-177a-a14f-dfdd-370ef407782d.png)

- これまで開いた履歴を対象にする **Recent Files**(`command + E`)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/2883/1b6f78a5-5a9f-7eca-422e-9b6993c9d71b.png)
白抜きボタンをホバーしたときにCSSでアニメーションしながら背景色と文字色を反転する

こんな感じです。

![btn.gif](https://qiita-image-store.s3.amazonaws.com/0/42231/2adeff95-e14d-6968-9d81-ed183a6d4d03.gif)

1つのクラスで全て記述しても問題ありませんが、背景色・文字色・余白・幅を変えられるように別のクラスで記述して指定しています。

```html
<html>
<head>
<title>test</title>
</head>
<style>

/* btn はベースのスタイル。汎用性を高めるために背景色と文字色を別で指定する */
.btn {
    text-align: center;
}
.btn a {
    position: relative; 
    display: block;
    color: #fff;
    transition: .6s ease;
    text-decoration: none;
}
.btn a span {
    position: relative;
    z-index: 2;
}
.btn a::before {
    content: "";
    position: absolute;
    top: 0;
    left: 0;
    z-index: 1;
    display: block;
    width: 100%;
    height: 100%;
    background: #fff;
    opacity: 0;
    transition: .4s ease; 
    transform: scale(0, 1);
    transform-origin: center left;
}
.btn a:hover::before {
    opacity: 1;
    transform: scale(1, 1);
}

/* 背景色と文字色、上下の余白・幅の指定 */
.btn-red {
    width: 300px;
    border: solid #bb000c 1px;
}
.btn-red a {
    background: #bb000c;
    padding: 5px 0;
}
.btn-red a:hover {
    color: #bb000c;
}

</style>
<body>

<div class="btn btn-red"><a href="#"><span>Button</span></a></div>

</body>
</html>
```
[覚書]Flutter でよくある問題とその解決方法

仕事でFlutterやっていてどハマりしその後解決した時の事と、Webで同様な質問をちらほら見かけたので備忘録的なもの。

## Firebase導入で、こんなエラーがでる。
<img width="1084" alt="スクリーンショット 2018-08-10 9.51.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/269117/0b38d79f-ad03-4240-cf3a-f33fbe1f4d41.png">
問題としてはサポートバージョン違うぞコラァというエラー。
解決方法：firebaseの設定画面でAndroidならこう指定しろというバージョンが表示されるが、Flutterだとこれが出てしまう。出ないバージョンを根気よく探せばエラーがでないバージョンがある。
projectのbuild.gradleのdependenciesで
classpath 'com.google.gms:google-services:4.0.0'
をセットしろと出るのだが、そのままセットするとこのエラーになった。
classpath 'com.google.gms:google-services:3.2.0'
にしたら通った
<pre>
subprojects {
    project.evaluationDependsOn(':app')
    subprojects {
        project.configurations.all {
            resolutionStrategy.eachDependency { details ->
                if (details.requested.group == 'com.android.support'
                        && !details.requested.name.contains('multidex')) {
                    details.useVersion "26.1.0"
                }
            }
        }
    }
}
</pre>
これも追加したほうが良いみたい。（あまりわかっていないが）


## setStateでうまくUIが動かない場合
解決方法というか対処法：StatefulWidgetを使って単体Widgetを入れてState管理してやる
Stateの変更の影響範囲はなるべく小さくする事を心がける。
StatfulWidgetの値のやり取りがメンドイのだが、こういうデザインと思うしか無い。
グローバル変数は敬遠されているのはわかっているが入れ子の入れ子を頻繁に行うFlutterだと、グローバル変数もやむなしなシーンもある気がする。

## State変更のせいか沢山APIを叩いてしまう
  
解決方法: FutureBuilder等を使って組むと良いとStackOverflow等で見かけるが、こいつにAPIを読み込む非同期関数を組み込むと、UIを表示する毎、Stateが変更される毎にAPIを叩いてしまうので、UI読み込みと切り離してAPIを読み込みたい場合はInheritedWidgetを継承したStateクラスを作って、間に噛ませる。APIがロードし終わると、State変更をかける仕組みになるので、Widgetが入れ子になりすぎて、Classが別ファイルになっても、これでState管理する事もできる。
これ以外にBLoCパターンを採用すればできるらしいが、redux系のパッケージを入れなければならないのと、やってみたけど、腑に落ちない感じだったので、私はもう少し成熟するのを待つことにした。

需要があれば、githubにサンプルをアップします。

*利用シーン*
店舗詳細画面に　詳細API,メニューAPI、スケジュールAPI等、店舗詳細を開いた時に1度読み込んで、それ以降はロードしたくない場合とかに使う。予めPlaceHolder用のUIと、データが伴ったUIの両方を用意しておいて、InheritedWidgetのイベントで置き換える様にする。
APIに限らずSqlite等のi/oアクセスの無駄打ち抑制にも使う。
面倒くささがあるとすれば、ListやMap等に適用できず、いちいちモデルクラスを定義する必要がある点だろうか。

##パッケージ系

### push通知使いたい
→　[FireBase](https://firebase.google.com/)を使おう。
[firebase_core](https://pub.dartlang.org/packages/firebase_core),
[firebase_messaging](https://pub.dartlang.org/packages/firebase_messaging)
アプリ起動中じゃないと使えないのでいいなら
→　[flutter_local_notifications](https://pub.dartlang.org/packages/flutter_local_notifications) を使うと良いかも

### gps情報を取得したい
location 使おう
→ [location](https://pub.dartlang.org/packages/location)

### 他のアプリを起動したい
電話番号を電話アプリにパスしたい
google Mapアプリにパスしたい
Webページを表示したい（ユーザーのブラザーアプリで）
→ url_launcherを使おう
[url_launcher](https://pub.dartlang.org/packages/url_launcher)

### Sqliteを使いたい 
→ sqfliteを使おう
[sqflite](https://pub.dartlang.org/packages/sqflite)
よくFirebaseを勧められるが、有料だから、集計目的以外で使わない方が良いと思うのでsqliteを使いたい需要の為。

後日加筆するかも。
findのmtimeオプションの挙動

findで-mtimeオプションを使用した場合の挙動について、
カレントディレクトリが下記の状態で、検証を行う。

```
24962 -rw-r--r-- 1 root root 0 Aug  7 11:00 3ago
25688 -rw-r--r-- 1 root root 0 Aug  8 11:00 2ago
25689 -rw-r--r-- 1 root root 0 Aug  9 11:00 1ago
25686 -rw-r--r-- 1 root root 0 Aug 10 11:00 today
24998 -rw-r--r-- 1 root root 0 Aug 11  2018 tomorrow
```

* 1日前のファイル

```
find -mtime 1 | sort
./1ago
```

* 1日前*より*以前のファイル

```
find -mtime +1 | sort
./2ago
./3ago
```

* 1日前より以降のファイル

```
find -mtime -1 | sort
./today
./tomorrow
```
JUnitでprivateメソッドをテストする

# 背景
今日JUnitで書かれたテストコードを見ていたらprivateメソッドのテストが書かれていなかった。privateメソッドを呼び出すサンプルを作ったので投稿しようかと思いました。

追記
詳しくは@Kilisame様のコメントを参照して頂きたいのですが、privateのテストを忘れてたからテストしました、と言う主旨の記事ではありません。呼び出し側のpublicのテストが出来ないと言うか大変と言うか....（お察し頂きたい）感じなので、せめてprivateのテストをしたくて書いてみました。


# コード

```java
import static org.junit.Assert.*;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import org.junit.Test;

/** サンプルクラス*/
public class private_Test {

	public class Sample{
		private int fuge(int i) {
			return i;
		}
	}
	
	@Test
	public void test() {
		
		Sample sample = new Sample();
		try {
			Method method = Sample.class.getDeclaredMethod("fuge", int.class);
			method.setAccessible(true);
			int rtn = (int)method.invoke(sample, 2);
			assertEquals(2,rtn);
			
		} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
			// TODO 自動生成された catch ブロック
			e.printStackTrace();
		}
	}

}

```

getDeclaredMethod()メソッドでメソッドを取得し、setAccessible(true)で外部アクセスを許可、method.invoke()で実行できます。
AndroidStudioで突然 Please select Android SDK エラー

ここ最近2回このエラーに悩まされました。
バージョンは3.1.3/3.1.4です。

ぐぐったところ、どうやらいろいろな原因があるっぽいです。
とりあえず今回復旧した時にやったことは次のような感じ。

最終的にAndroidStudio > Check for update でAndroid Studioを3.1.3→3.1.4にして、レコメンドされるSDKのバージョンアップを行って(←たぶんこれが大事)、Android Studioの再起動で解決しました。

ちなみにこのエラーが出ているときも`./gradlew assembleDebug` でのビルドはできるので、AndroidStudio依存の問題であろうとは思うのですが。。。
Google Cloud Next '18 Day3 ノート

Day3 のメモ。

## Keynote [Made Here Together](https://www.youtube.com/watch?v=JQPOPV_VH5w)

Innovation, Openness, and Community.

- GCP Ops
   - Cloud Build & Spinneker
   - Stackdriver APM & Profiler
- [Go Cloud Project](https://github.com/google/go-cloud)
- ML
   - [Firebase ML Kit](https://firebase.google.com/products/ml-kit)
   - [Kaggle](https://www.kaggle.com/)


## [Centralized Logging Solution for Google Cloud Platform](https://www.youtube.com/watch?v=6GQqneNFVkU)

- [Stackdriver](https://cloud.google.com/stackdriver/)
    - Logging
    - Monitoring
    - APM
- [fluentbit](https://fluentbit.io/)

## [Architecting for Performance at Cloud Scale](https://www.youtube.com/watch?v=fxhOctgm5Gw)

- SLIs and SLOs
- Turn focus toward effiency
Vue.jsのv-ifで出現するフォームにオートフォーカスする方法

Vue.jsの[Todoアプリのサンプル](https://jp.vuejs.org/v2/examples/todomvc.html)を参考にTodoアプリを作成した際に知った、ダブルクリック後に出現するフォームにオートフォーカスする方法についてのメモ。

実際にelectron-vueで作成したTodoアプリは https://github.com/x-color/todo-app に置いてある。

# どうなるか

## before

ダブルクリック後にフォームが出現しているのだが、オートフォーカスしていない。

![todos-1.gif](https://qiita-image-store.s3.amazonaws.com/0/279498/6399c055-c33e-9ed9-41f1-112675036863.gif)

## after

ダブルクリック後にフォームが出現し、オートフォーカスしている。

![todos-2.gif](https://qiita-image-store.s3.amazonaws.com/0/279498/f64f919e-efaa-d82a-8d7c-4ac3b7ab23ef.gif)


# 何をしているのか

Todoを表示する部分。ダブルクリック時に`editTodo()`を実行する。

```html
<label @dblclick="editTodo(todo)">{{ todo.title }}</label>
```

入力フォーム部分。`v-if`で描画するかを制御している。

```html
<input v-if="todo.isEditing" id="edit-todo" v-model="todo.title" type="text">
```

Todoがダブルクリックされた場合に実行される関数。入力フォーム部分の描画条件を`true`にして、自動で入力フォームにフォーカスしている。

```js
editTodo(todo) {
  todo.isEditing = true;
  this.$nextTick(() => document.getElementById('edit-todo').focus());  
}
```

# 簡単な解説

`v-if`で描画を制御している場合、条件が真になった直後に、

```js
document.getElementById('id').focus();
```

このコードを実行してもフォーカスしない。これは、条件が真になった直後にDOMが更新されているとは限らないため。

なので、DOMの更新を待った後に実行するために、以下のように`nextTick()`を用いて呼び出す必要がある。

```js
nextTick(() => document.getElementById('id').focus());  
```

# 備考

バージョンや実行環境によって、`nextTick()`の挙動が変わるので注意。

```js
Vue.nextTick(() => document.getElementById('id').focus());

// Promiseがサポートされている実行環境かつ、Vue.js 2.1.0以上
Vue.nextTick().then(() => document.getElementById('id').focus());
```

詳しくは https://jp.vuejs.org/v2/api/index.html#Vue-nextTick を参照
ファイルサーバ移行でのお話。

#背景
共有ファイルサーバのライセンス切れに伴う移行作業をすることになった。

#この記事を残す意図

- 使ったコマンドを残しておこう。
- 使われるタイミングはもう来ないと願い、自分のそばではなく、ちょっと遠い外の世界に残しておこう。


#前提
- 権限設定は、別途実行されていること。
    - 管理者さんと、お偉いさんに実施していただいた
- 実行ローカル環境　Windows 10 1709
    - CPU
        - Core i7-7500U @2.70GHz 2.90GHz
    - Memory
        - ８GB 

#というわけで作業内容

##  コマンド　Robocopy

ファイルサーバ間のコピーはこれが定石の様子。
管理者さんからもこのコマンドをご利用くださいと連絡が来た。

### 実際のコマンド

`Robocopy /e /purge /r:1 /w:1 /xo /log+:"c:\log.txt" /ns /np /ndl "【FROM】" "【TO】"`

##### オプション補足

ログとか、FROM、TOは端折ってます。

|オプション|意味　　　　　　　　　　　　　　　　　　　　　|
|:---|:---|
|/e|空のディレクトリでもコピーする|
|/purge|コピー元に存在しないファイル　または　ディレクトリはコピー先で削除する|
|/r:1|コピー失敗時の試行回数を1回にする(指定しないと1,000,000回！！)|
|/w:1|再試行時の待機時間を１秒にする（指定しない場合は、30秒）|
|/xo|コピー元ファイルがコピー先にあり、コピー先より古い場合、コピーしない|
|/ns|ファイルサイズをログに記録しない|
|/np|コピー完了率をログに記録しない|
|/ndl　　　　|ディレクトリ名をログに記録しない|

### 実行方法
1. Windowsアイコンを右クリック
2. Windows PowerShell(管理者)を選択
3. 実行許可の確認　で　はい
4. 上記コマンドをCopy
5. PowerShell ターミナル上で右クリックしPaste & run

### 実行結果

#### ヘッダー部

開始時間、FROM、TO、オプションがわかる。
次にやる人への情報提供がバッチリ

```log.txt:ヘッダー部
-------------------------------------------------------------------------------
   ROBOCOPY     ::     Windows の堅牢性の高いファイル コピー                              
-------------------------------------------------------------------------------

  開始: yyyy年MM月dd日 HH:mm:ss
   コピー元 : 【FROM】
     コピー先 : 【TO】

    ファイル: *.*
	    
  オプション: *.* /NS /NDL /S /E /DCOPY:DA /COPY:DAT /PURGE /NP /XO /R:1 /W:1 

------------------------------------------------------------------------------
```

#### ファイル一覧部
ショートカットも「.link」として移動されている。　リンクURLは変わっていないので要修正

```log.txt:ファイル一覧部
	  新しいファイル			【FROM】\tools.lnk
	  新しいファイル			【FROM】\.DS_Store
	  新しいファイル			【FROM】\追加ディスプレイ用接続端子確認.xlsx
```

#### フッター部

実行時間、総ファイル・ディレクトリ数が確認できる。

```log.txt:フッター部
------------------------------------------------------------------------------

                  合計     コピー済み      スキップ       不一致        失敗    Extras
   ディレクトリ:      1563       1562          1         0         0         0
 　　　ファイル:      6733       6733          0         0         0         0
     　 バイト:    7.233 g    7.233 g          0         0         0         0
          時刻:    1:17:57    1:12:02              0:00:00   0:05:55

       速度:             1796923 バイト/秒
       速度:             102.820 MB/分
   終了: yyyy年MM月dd日 HH:mm:ss

```
ブランチの変更をgrepする

# これはなに

gitでソース変更の差分を良い感じにgrepする方法のメモ

# やりたかったこと

リファクタリングの一貫で使われなくなった画面を削除した。
画面のテンプレートではi18nの言語キーが埋め込まれているのだけど、使われなくなった言語キーも削除したい。

# ブランチの変更をgrepする

## ながれ

1. 派生元ブランチのリビジョンをとってくる
2. そのリビジョンで git diff る

## 派生元ブランチのリビジョンをとってくる

git diff で差分を出したい。作業ブランチの派生元のリビジョンをとってきて、作業ブランチを差分だせばいいじゃん。

```console

# 作業ブランチに切り替えておく
$ git branch --contains=HEAD
feature/作業ブランチ

# 派生元のリビジョン
$ git merge-base develop HEAD
aaaaaaaaabbbbbbbbbbbcccccccccccddddddddddd
```

## そのリビジョンで git diff る

```console

$ git diff aaaaaaaaabbbbbbbbbbbcccccccccccddddddddddd HEAD
```

## diff ったら削除された行だけgrepする

```console
$ git diff aaaaaaaaabbbbbbbbbbbcccccccccccddddddddddd HEAD | egrep '^-' 
```

# まとめ：作業ブランチの差分をワンライナーで

```sh
$ git diff `git merge-base develop HEAD` HEAD |grep hoge
```
APK を Google Play に自動アップロードする

# 概要
Android アプリを自動的に Google Play へアップロードする方法について述べます。

## 手動でのリリース
個人のAndroid アプリ開発だとこんな感じではないでしょうか。

1. ローカルPCでAPKをビルド
2. APK を Google Play の Developer Console にアップロード
3. mapping.txt を Google Play の Developer Console にアップロード
4. リリースノートを Google Play の Developer Console に記入
5. βチャネルでのリリース前テストが終わったら公開

自動化すると、1-4までは自動化できます。

## どうやるのか？
今回は [gradle-play-publisher](https://github.com/Triple-T/gradle-play-publisher) という Gradle プラグインを使います。

### 特徴
- (サービスアカウントがあれば) build.gradle に追記するだけで使える
- APKの作成からアップロードまで一括して実行
- アップロードチャネルを指定可能

----

# 導入
以下3ステップが必要です。

1. サービスアカウントを発行
2. signingConfigs を分離
3. Gradle ファイルに設定を追加

## 1. サービスアカウントを発行
[こちらの記事の #サービスアカウントの登録](https://qiita.com/Horie1024/items/0d3d50405f0b4bef1792#%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%82%A2%E3%82%AB%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E7%99%BB%E9%8C%B2)を参考に、サービスアカウントを発行します。

![serviceaccount.png](https://qiita-image-store.s3.amazonaws.com/0/102004/bb93ea1e-144a-5461-7165-44d315ba5522.png)


## 2. signingConfigs を分離
署名等の情報を別のファイルに定義し、そのファイルを.gitignore に登録して git の構成管理から外しておきます。

```groovy
signingConfigs {
  release {
    storeFile file("keystore.jks")
    storePassword "st0rep@ssw0rd"
    keyAlias "keyaliasname"
    keyPassword "keyp@22w0rd"
  }
}
```

### .gitignore

```:.gitignore
/app/signing
```

## 3. Gradle ファイルに設定を追加
まずプロジェクトルートの build.gradle に依存を追加します。

```groovy:build.gradle
buildscript {
  dependencies {
    classpath 'com.github.triplet.gradle:play-publisher:1.2.0'
```

続いて、 app/build.gradle にプラグインの追加と、2. で分離した signing config の追記、Google Play サービスアカウントの設定をします。

```groovy:app/build.gradle
apply plugin: 'com.github.triplet.play'

// 分離した signingConfigs を include
apply from: 'signing/config.gradle', to: android

android {
//...
    playAccountConfigs {
        defaultAccountConfig {
            serviceAccountEmail = 'account-name@api-XXXXXXXXXXXXXXX-XXXXXXX.iam.gserviceaccount.com'
            jsonFile = file('signing/Google Play Android Developer-xxxxxxxxx.json')
        }
    }
    play {
        track = 'beta'
        untrackOld = true
    }
```

#### playAccountConfigs
先ほど発行したサービスアカウントの情報を指定します。JSON ファイルは安全のため、バージョン管理から外しておくのが無難でしょう。

#### play
Google Play のアップロード先等を指定できます。今回はリリース前テストを実行してから本番リリースをしたいので、βを指定しておきます。

----

# 実行
ここまでの設定が上手くいっていれば、```gradle tasks``` で publishApkRelease というタスクが追加されているはずです。

あとは開発が終了次第、タスクを実行しましょう。

```
$ gradle publishApkRelease
```

これだけで APK のビルドからアップロードまで自動でやってくれます。なお、時間は多少かかります。

----

# 自動化すると何がよいのか？
Google Play の Developer Console を使えば APK のアップロードはできますし、ストア情報の更新も同様に可能ですので、導入のコストを支払ってまで自動化する必要はないのではと思われるかもしれません。

## よいこと
- 「うっかり別アプリの情報を編集していた！」が防げる
- クラッシュレポートが送信されてから「あ、mapping.txtアップロードし忘れてた！しかもローカルから消えてる！」が防げる
- リリース時のストアの更新情報を git でバージョン管理できる（しなくてもよい）

なお、Firebase 等のクラッシュレポートツールを用いている場合は別途そちらへ mapping ファイルをアップロードする必要があります。

----

# 考慮点
会社で使う場合、CI が Gradle の実行タスク変更に対応していること、サービスアカウント作成が可能であること、を確認する必要があります。

----

# まとめ
Gradle プラグインを使って APK を自動アップロードする方法について説明しました。手作業でミスするリスクを最小化しましょう。
Qiita—Mediumに記事をインポートしてみよう (ただし文章系記事に限る)

Mediumがコード表示に対応していないのでなんとも微妙ではある。
コードのない文章系のQiita記事では、インポートをしてみても良いかもしれない。

MediumとQiitaの両方を使っている人は、インポートを試してみるのはいかがだろうか。(どちらにも置いて良いと思う記事は)

## まとめ

- Qiitaの記事はMediumにインポート可能。(2018年8月現在)
- Qiitaに自分が書いた記事を、Meiumにも置くことが出来る。
  - 画像もインポートされる。
  - コードはうまく整形してくれない。
- Medium側でHTML的にもCanonical属性を付けてくれるので、検索エンジン的にも悪くない。(重複コンテンツにならない)

## 動作イメージ

### URLを入力

[Import your story](https://medium.com/p/import) からQiita記事のURLを入力

ここでは [プログラミングはドラクエの竜王の城 - Qiita](https://qiita.com/YumaInaura/items/bba1657b5f1f807830e3) を使って試してみる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/c8ce45cc-0cd0-9f32-3f1c-7637e6d0d363.png)

### インポート処理が進む

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/f7e79db8-bf10-7f06-f278-037b5bb71bae.png)

### 編集画面

必要ならここで微調整。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/e2ecdacd-abf2-4486-edb6-7ad3f0394b88.png)

### 投稿成功

例:

[プログラミングはドラクエの竜王の城 – Yuma Inaura ( 稲浦悠馬 ) – Medium](https://medium.com/@YumaInaura/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%AF%E3%83%89%E3%83%A9%E3%82%AF%E3%82%A8%E3%81%AE%E7%AB%9C%E7%8E%8B%E3%81%AE%E5%9F%8E-6e6dcd771ba6)


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/ac9de362-427c-9570-568c-89ee09d5daad.png)


### 引用リンク

Mediumの記事末尾に、Qiitaの元記事へのリンクも自動生成される

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/976fc536-c8d3-6c26-b274-d9fe7184e2a4.png)

### Canonical属性

HTMLには元のQiita記事へのCanonical属性が付く。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/e064fc1e-2dfb-840d-a855-4a1be25a5446.png)

### コードは崩れる

コードブロックのある記事をインポートしようとした時の例。

残念。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/42051273-92f4-88a6-ceb2-ce1145137de2.png)









<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
C++ Builder XE4 > TMemo > Strings[0]とTextの違い

```txt:動作環境
C++ Builder XE4
```

### 状況

[C++ Builder XE4 > クリップボードの文字列中の"/"を"／"に変換するツール v0.1, v0.2](https://qiita.com/7of9/items/676451366ba97f13c89e)
のv0.1にて実装した処理で、長さのある文字列が途中で途切れた。

その理由を整理するため、プログラムしてみた。

### code 

```Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TMemo *Memo1;
	TButton *B_execute;
	TEdit *Edit1;
	TEdit *Edit2;
	TLabel *Label1;
	TLabel *Label2;
	TEdit *Edit3;
	TLabel *Label3;
	void __fastcall B_executeClick(TObject *Sender);
	void __fastcall FormShow(TObject *Sender);
private:	// ユーザー宣言
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------

static const String kTemplateString =
L"123456789" // 0..4
L"123456789"
L"123456789"
L"123456789"
L"123456789"
L"123456789" // 5..
L"123456789";

void __fastcall TForm1::B_executeClick(TObject *Sender)
{
	// 1. Copy to clipboard
	Edit1->Text = kTemplateString;
	Edit1->SelectAll();
	Edit1->CopyToClipboard();

	// 2. Paste from clipboard
	Memo1->PasteFromClipboard();

	// 3. Copy only first string
	Edit2->Text = Memo1->Lines->Strings[0];

	// 4. Copy all the strings
	Edit3->Text = Memo1->Lines->Text;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormShow(TObject *Sender)
{
	Edit1->Text = L"";
	Memo1->Lines->Clear();
	Edit2->Text = L"";
	Edit3->Text = L"";
}
//---------------------------------------------------------------------------
```

### 実行

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/77735b9a-2f8f-1a86-8e86-b108b0ac71b7.png)

### 失敗の理由

- Memoから文字列を取出すとき、`Text`でなく`Strings[0]`としてしまっていた
- Memoの幅より長さの短い文字列でテストしていた
Rubymineことはじめ（設定系）

# ホワイトスペースを表示する
何も表示されていないスペースにそわそわしてしまうため。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/2883/16166ee9-5ceb-ee71-2a85-28f57962fc91.png)


# Fontを変更
Windows環境で長く使ってきた `Source Code Pro` を選択。
フォントサイズは`14`にしているけれど、慣れたら小さくしていく予定。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/2883/37877598-cef8-f92f-69d9-d7e24700106e.png)

# Color Schemaを変更
`Monokai`の背景が黒に近いブラウンなのが目にちょうどいいことと、ビビットピンクがかなり気に入っています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/2883/98158230-2d72-12a8-bfeb-a1cc35defc8f.png)

# `TODO`を目立たせる
Rubymineでは`TODO`コメントを自動的に検出してジャンプしてくれる機能があるので、この機能と併用していきたい。
`Monokai`デフォルトの濃い紫だと危機感が薄れそうだったので、赤系色にしてみました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/2883/01b5b5c5-afea-0ad0-33fc-ea60ee83baac.png)

# `White space`の色を背景より少し明るくする
スペースを表示する設定にしたのに反映されないな？とおもっていたのですが、背景色に溶け込んで見えづらいだけでした。
**視認できるけどコードの邪魔にならないトーン**まで明るくすることで解決しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/2883/28276e6e-017b-d17e-b06c-7b882fd2d286.png)
JavaおじさんがPythonを使えるようになるまでの全記録（その12）

#Djangoの環境再構築中
とりあえずVagrantなしでもVagrantありでもこのページを出すところまでは到達した。

![2018-08-10.png](https://qiita-image-store.s3.amazonaws.com/0/275064/3dfe163b-5186-6081-877c-0bb5b89798a0.png)

ただ、Vagrantありの環境だとそもそもソースコードの編集がWindows上でダイレクトにできない（＝テストもVagrantの中で実行することになる）というちょっと面倒な状態なのでとりあえずブツを作ることを前提にVagrantなしの環境でいろいろ作っていこうかなと思っている。

ちなみにVagrantなしの環境構築は[こちら](http://arakan-pgm-ai.hatenablog.com/entry/2018/01/27/080000)を参考にしました。

#で、テキストは読んでるのかよ？
うん、[テキスト](https://www.amazon.co.jp/gp/product/4764905183/ref=oh_aui_detailpage_o02_s00?ie=UTF8&psc=1)は「9章 計算複雑性入門」と「10章 いくつかの単純なアルゴリズムとデータ構造」は読みましたよ？

でも9章はほぼビッグオー記法（メガデウスではない）を中心としたアルゴリズムの最悪計算時間の話に終始していて、しかもいくつか訳注で指摘されている間違いがあるので、知ってる話だし特に書くこともないなあ。
みんな知ってるよね？

10章は本当にみんな知ってるおなじみのバイナリサーチやマージソートなんかのアルゴリズムを実装コードを示して再帰や計算複雑性について説明しているので、試しに書けるコードがないのよね...
ティムソートは初めて知ったけど、これはビルトイン関数に実装済みだしあえて書くこともないような気はする。
結構ハッシュについて詳しく書いてあるけどこれを記事に起こして意味あるのかな。
あるなら書くけど。

#エディタ再考
Djangoの環境構築をするついでにSpyderも試してみたけど、Djangoの起動がうまくいかない...
Visual Studio CodeだとDjangoの起動用プロファイルもあるから考えることもないかな。こういう時に例のPyCharmを検討するべき、なのかしら。
でもDjango使うにはProfessional Editionが必要だ、と。ふむふむ、リモートデバッグもProfessional Editionのみ、Code CoverageもProfessional Editionのみか...
Visual Studio Codeでこの辺できないかな。ググろ。

...お、[こんなページ](https://qiita.com/YukinoriManome/items/119cd490513a091e649e)が。ありがたや。
...なるほど、ptvsdをリモート側に仕込んでおけと。
後で試してみよう。

追記：[このページ](http://nodecastle.jp/2018/06/24/VisualStudioCode%E3%81%8B%E3%82%89vagrant%E3%81%AEVM%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%80%81%E7%B7%A8%E9%9B%86/)をまず先に試すべきかな。これ使えれば今作ってあるVagrant環境上のnginx+Djangoがそのまま使えるはず。やることはいろいろあるなあ。
Embulk を docker で動かす Dockerfile の例

## Dockerfile

javaを入れてからembulkをダウンロードするだけ。

```:Dockerfile
FROM java:8

RUN apt-get -y update && apt-get -y upgrade

RUN curl --create-dirs -o ~/.embulk/bin/embulk -L "https://dl.embulk.org/embulk-latest.jar"
RUN chmod +x ~/.embulk/bin/embulk
ENV PATH="/root/.embulk/bin:${PATH}"
```

## 動作方法

こんな感じ

```
$ docker build . -t embulk
$ docker -it run embulk /bin/bash
```

```
root@b65c16fcfef2:/# embulk --version
embulk 0.9.7
```

## バージョン

- Docker version 18.03.1-ce, build 9ee9f40

## Links

- [Embulk Dockerfile example](https://gist.github.com/YumaInaura/31f5fabaa1b5819cfe74ad3c7b782b71)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
anaconda 仮想環境の Jupyter notebook で ModuleNotFoundError: No module named '～～～' が出る


ちゃんと

```
activate env_kaihatsu1
conda install hogehoge
```
したのに！
python の対話入力では

```
_>>>import hogehoge
```
で怒られないんだけど！

## 一時しのぎ方法：

その .ipynb で、

```
HOGE_LIB_DIR = 'C:\\Users\\xxxxx\\AppData\\Local\\Continuum\\anaconda3\\envs\\hogehoge\\lib\\site-packages'
import sys
sys.path.append(HOGE_LIB_DIR)
```

### HOGE_LIB_DIR はどうやってしらべるのん？
例えば、opencv2なら

```
_>>> import cv2
_>>> cv2.__file__
'C:\\Users\\xxxxx\\AppData\\Local\\Continuum\\anaconda3\\envs\\opencv\\lib\\site-packages\\cv2.cp36-win_amd64.pyd'
_>>>
```

と出てくるので、この場合は最後を削って、

```
HOGE_LIB_DIR = 'C:\\Users\\xxxxx\\AppData\\Local\\Continuum\\anaconda3\\envs\\opencv\\lib\\site-packages'
```

です。


ほんとはどうするのでしょうか？
Redmine 3.4.6 表示カスタマイズ

# ガントチャートの表示を変更
##元cssのバックアップ

```
cd /var/lib/redmine/public/stylesheets/
cp application.css application.css.bak
```

##変更点

```
vi application.css

// チケット一覧の文字サイズ
1149 .gantt_subjects { font-size: 0.8em; } 
↓
1149 .gantt_subjects { font-size: 1.0em; } 

//チャート内文字の文字サイズ
1159   font-size:0.8em;
↓
1159   font-size:1.0em;

//左のサイドバーのサイズ
 //文字位置
  85 #sidebar{ float: right; width: 22%; position: relative; z-index: 9; padding: 0; margin: 0;}
  86 * html #sidebar{ width: 22%; }
 //グレー部分のサイズ
  96 #content { width: 95%; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; }
  97 * html #content{ width: 95%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;}
↓
  85 #sidebar{ float: right; width: 13%; position: relative; z-index: 9; padding: 0; margin: 0;}
  86 * html #sidebar{ width: 13%; }
  96 #content { width: 85%; background-color: #fff; margin: 0px; border-right: 1px solid #ddd; padding: 6px 10px 10px 10px; z-index: 10; }
  97 * html #content{ width: 85%; padding-left: 0; margin-top: 0px; padding: 6px 10px 10px 10px;}
```
##タスク一覧の幅
https://www.yamamanx.com/redmine-gantt/


# チケットの進捗率を5%刻みにする
##元erbバックアップ

```
cd /var/lib/redmine/app/views/issues/
cp _attributes.html.erb _attributes.html.erb.bak
```

##変更点

```
72行目
<p><%= f.select :done_ratio, ((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }), :required => @issue.required_attribute?('done_ratio') %></p>

↓

<p><%= f.select :done_ratio, ((0..10).step(0.5).to_a.collect {|r| ["#{(r*10).to_i} %", (r*10).to_i] }), :required => @issue.required_attribute?('done_ratio') %></p>
```
git svn fetch で The server sent an improper HTTP response エラー対策

SVNブランチのマージに失敗した人が居て、その影響で大量のファイルが新規作成されることになり、アップデートが長すぎてSVNがこけるようになった。

SVN自体はクライアントの機能を有効化するとアップデートできるけれど、`git-svn`ではその機能がどうもデフォルトでは有効になっておらず、有効にする方法も見当たらず困っていた。

# 環境

```
$ git svn --version
git-svn version 2.18.0.windows.1 (svn 1.9.7)
```

# 試したこと

`%APPDATA%/Subversion/servers` に以下を追加する。
（TortoiseSVNかSVN.exeを導入時に作成されていた？）

```
http-bulk-updates = yes
```

このときのファイルパスを `c:/path/to/Subversion/servers`とする。
`servers`がおいてあるパスを`git-svn-fetch`時に指定する。

```
git svn fetch --config-dir=c:/path/to/Subversion
```

すると100回以上失敗していた`fetch`が成功した。

とはいえ`--config-dir`オプションに関する情報が少なく、たまたま成功しただけかもしれないので、機会があればもうちょっと試してみる。

# 試してないこと

[ここ](https://stackoverflow.com/questions/33115508/git-svn-clone-error-from-svn-220001-item-is-not-readable)によると、`%APPDATA%/Subversion`を`.subversion`としてシンボリックリンクを張ると良いとのことなので、`~/.subversion`に張れば毎回`config-dir`オプションを利用せずにすむのかな？

もともと`~/.subversion/servers`があったため、そちらに上記の対応を追加し、`--config-dir`オプション抜きで試してみる。
Laravelのマイグレーションで気が付いたこと

#Laravelのマイグレーションで気が付いたこと

##前提

Laravel 5.5でcitysテーブルとCityモデルを作成しました。
英語が苦手なのがばれてしまうのですが、テーブルは複数形でcitiesでなければなりません。

## エラーが発生！

tinkerで、

```
$ php artisan tinker
>>> use App\City
>>> City::all()
```

としたときに下記エラーが出ました。(恥)
「citiesテーブルがないみたいだけど？？？」

```
Illuminate/Database/QueryException with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'marutora.cities' doesn't exist (SQL: select * from `cities`)'
```

## 簡単で便利だったマイグレーション手順！

**①モデルファイルとマイグレーションファイル一気に作成**

```
$ php artisan make:model City -m
```

※マイグレーションファイル名ちゃんと複数形で作成されました。

**②マイグレーションファイルの編集**

**③データベースをフレッシュし、全データベースのシードを実行**

```
$ php artisan migrate:fresh --seed
```

※フレッシュとリフレッシュについて(テーブルのデータ消したくない人は要注意)
refresh：全マイグレーションロールバック→マイグレーション
fresh：全テーブルをドロップ→マイグレーション

**④tinkerで確認**

```
$ php artisan tinker
>>> use App\City
>>> City::all()
>>> Illuminate\Database\Eloquent\Collection {#略}
```

今までマイグレーションとモデルを単体で作成していたので、この方法は楽でした。
複数のボタンで同じモーダルを使い回す場合の実装例

複数行出力させないといけないページで、それぞれの行にモーダル表示のボタンを配置したいが、モーダルのコードは１個にしたい時の実装例

EC-CUBEで規格・カテゴリ・配送方法などの一覧画面で項目削除ボタンにモーダルを配置したのでその時の実装が以下

```twig
{% block javascript %}
    <script>
        $(function() {
            // 削除モーダルのhref変更
            $('#delete_modal').on('shown.bs.modal', function(event) {
                var target = $(event.relatedTarget);
                $(this).find('[data-method="delete"]').attr('href', target.data('url'));
            });
        });
    </script>
{% endblock %}

{% block main %}

<!-- 省略 -->

<div>
    <ul>
        {% for Category in Categories %}
        <li>
            {% if Category.id != TargetCategory.id %}

            <!-- 項目の出力 -->

            <a class="btn btn-ec-actionIcon" data-toggle="modal" data-target="#delete_modal" data-url="{# ここに削除のためのURLを出力 #}">
                <i class="fa fa-close fa-lg text-secondary"></i>
            </a>
            {% endif %}
        </li>
        {% endfor %}
    </ul>
    <div class="modal fade" id="delete_modal" tabindex="-1" role="dialog" aria-labelledby="delete_modal" aria-hidden="true">
        <div class="modal-dialog" role="document">
            <div class="modal-content">

                <!-- モーダルの内容の出力 -->
                
                <a href="#" class="btn btn-ec-delete" data-confirm="false" data-method="delete">
                    削除
                </a>
            </div>
        </div>
    </div>
</div>

<!-- 省略 -->

{% endblock %}
```

該当のプルリクは[こちら](https://github.com/okazy/ec-cube/commit/a382936850db6334df45d40375c7ae957e26ca49)
Google Cloud FunctionsのPython(Bata)で環境変数を利用する

## 概要

GCPの管理コンソール上で環境変数の登録ができるのはわかったけど、どうやって使うの？って迷ったのでまとめておきます。

## 手順

```sh
> cd 任意のディレクトリ
> touch main.py
> vi main.py
```

```python:main.py
import os

def hoge(request):
    return f"{os.environ['HOGE']}: {os.environ['FUGE']}"
```

で、デプロイします。

```sh
> gcloud beta functions deploy hoge \
    --trigger-http \
    --runtime=python37 \
    --set-env-vars \
    HOGE=hoge,FUGE=fuge
```

で、呼び出します。

```sh
> gcloud beta functions call hoge

executionId: gs8um8ry6n3s
result: 'hoge: fuge'
```
はい。


## 参考

下記ドキュメントに詳しくのってました。

Using Environment Variables
https://cloud.google.com/functions/docs/env-var


Cloud FunctionsでPython利用記事まとめ
https://qiita.com/kai_kou/items/2f65db5305ba280ad81e
プログラミングってドラクエの竜王の城


## その心は

- 最初にいきなり見えてる
- だけど意外に遠い
- そして冒険は楽しい (敵を倒したり経験値をためたり)


(どのドラクエの話が分からない人は、お兄さんやお父さんに聞いてみよう！)
(ヒント: ファミリーコンピューター)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/5e517939-46a8-e9c1-26a6-2572e4279959.png)

[「ドラクエ 竜王の城 ファミコン 見えてる」でGoogle画像検索](https://www.google.co.jp/search?tbm=isch&q=%E3%83%89%E3%83%A9%E3%82%AF%E3%82%A8+%E7%AB%9C%E7%8E%8B%E3%81%AE%E5%9F%8E+%E3%83%95%E3%82%A1%E3%83%9F%E3%82%B3%E3%83%B3%E3%80%80%E8%A6%8B%E3%81%88%E3%81%A6%E3%82%8B&oq=%E3%83%89%E3%83%A9%E3%82%AF%E3%82%A8+%E7%AB%9C%E7%8E%8B%E3%81%AE%E5%9F%8E+%E3%83%95%E3%82%A1%E3%83%9F%E3%82%B3%E3%83%B3%E3%80%80%E8%A6%8B%E3%81%88%E3%81%A6%E3%82%8B)

## 冒険の書

なまえ ゆうま

- ライブラリの挙動について調べようとする
- 一連の挙動を動作確認するため、シェルにコマンドを書き連ねる
  - シェルの基本で分からない動作があることに気付く
    - シェルの基本を理解するために動作確認する
      - Mac の bash のバージョンが古いことに気付く
      - zsh で bash のバージョンを新しくする方法を調べて実行
  - シェルの基本を理解した記事をMarkdown形式でGithubGistにまとめようとする
     - Markdownのコードブロックからスクリプト生成できたら便利だろうなと思い立つ
     - Markdownのparserを探して見つける
     - だがそのparserに不具合を見つけたので、Github に Issueを立てようとする
     - Issueで不具合を再現するコード例を提示しようとするが、まさにそのIssueに書くコードブロック内で、コードブロックを書く方法が分からない
     - Markdownのコードブロックの中にコードブロックを書く方法を探す
   - プログラミングって竜王の城みたいなものだよなと気付く
   - Qiitaに「プログラミングは竜王の城」っていう記事を書こうと思いつく
   - **↑ 今ここ ↑**

## いったん竜王は忘れよ

冒険を続けていると、つい最終目標を忘れることがある。
だけどこれはゲームなのだから、冒険は楽しんだもの勝ちだ。

一見遠回にも思えるこういったイベントのひとつずつが、実はゲームの醍醐味を、味わい深さを生み出している。

どうせならユーザーに退屈させないような、エキサイティングな演出をほしいとも思う。
だけどこのゲームはプレイヤーもクリエイターも僕ら自身だ。作れ。RPGツクール。

実はそういった遠回りは、じわじわとプログラマとしての基礎力を上げてくれるのではないだろうか。
僕自身も身近なエンジニアで、わりと詳細に立ち入りがちだけど、毎回、大いなる基礎・教訓を得て帰ってくる人を知っている。



## 結果にコミットしない

 (何ザップ？)

この世界でいちばん大事なのは、自分自身がプログラミングを楽しめること。プログラミングでエキサイト出来るということ。
これが崩れると他全てのものも崩れる。

結果にコミットするのが楽しい人は、そうすれば良い。
詳細に立ち入るのが楽しい人は、そうすれば良い。

自分自身のレベルや性格によっても、楽しみ方は変わってくるだろう。

>重要なのは多様性

[流行りのモブプログラミングをやって分かった 個人の開発手法の違い - Qiita](https://qiita.com/YumaInaura/items/ef2904676ad1707b7001#%E9%87%8D%E8%A6%81%E3%81%AA%E3%81%AE%E3%81%AF%E5%A4%9A%E6%A7%98%E6%80%A7)

「楽しさ」が担保されている限りはそうすれば良いし、もし崩れるようなら、道を選び直す必要がある。

## 詩

>「イタカへ向かうなら願え、長い旅になるように」
>(詩人 コンスタンディノス)

## リンク

- [ゲーム画面のイラスト | かわいいフリー素材集 いらすとや](https://www.irasutoya.com/2017/12/blog-post_121.html)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
鳥の鳴き声の録音

自宅の近くに飛んでくる鳥の鳴き声を録音してみました。

録音は[FreeBSDなMIPSルーターにUSBモジュールを接続](https://qiita.com/yamori813/items/b7616918fcfae5b75311)して、[Macの古いマイク](https://qiita.com/yamori813/items/737f54bbcc584df8791e)を利用し自作のコマンドで行いました。録音フォーマットは44.1kHzの16BitモノでWAVEファイルにしました。

録音したものをMacのAudacityで開いてみるとこのようになっています。AudacityはApp Storeではなくインターネットからダウンロードしたものですが、開発者の証明書が貼ってあるようで、そのまま利用できるようです。

![スクリーンショット 2018-08-10 7.24.40.png](https://qiita-image-store.s3.amazonaws.com/0/104066/e5f50da4-2d8a-d137-d5ae-c77335f9ba91.png)

実際のデータはSoundCloudに上げてあります。

https://soundcloud.com/user-740080194/shijyukara

これの単位時間(0.1秒)のゼロクロスとパワーをざっくりrubyスクリプトで計算してみました。ゼロクロスとは波形データがゼロを通過するすなわち符号が逆転することで、パワーは振幅になります。雑音に比べて鳥の鳴き声は一般的に高い音が含まれるので、ゼロクロスが多くなるという理屈です。人間の音声認識でも使われる手法です。

WAVEデータのサンプルは無音が0で上下32767(0x7fff)から-32767(0xffff)まで変動します。Audacityの波形の1.0が32767で-1.0が-32767になります。

```ruby
# check zero cross script

io = File.open(ARGV[0], "rb")
# skip wav header
io.seek(44)

i = 0
while TRUE do
  sample = io.read(4410*2)
  if sample.size != 4410*2 then
    break
  end

  m = sample.unpack("s*")

  zero = 0
  power = m[0].abs;

  num = 1
  while num < 4410 do
    if (m[num - 1] < 0 && m[num] > 0) ||
      (m[num - 1] > 0 && m[num] < 0) then
      zero = zero + 1
    end
    power = power + m[num].abs;
    num = num + 1
  end

  sec = i / 10.0
  power = power / 1000000
  val = power * zero
  print sec.to_s + "," + zero.to_s + "," + power.to_s + "," + val.to_s + "\n"
  i = i + 1
end
```

結果

0.0,696,3,2088
0.1,660,3,1980
0.2,659,2,1318
0.3,774,2,1548
0.4,1343,13,17459
0.5,1311,10,13110
0.6,1314,11,14454
0.7,1270,8,10160
0.8,1317,9,11853
0.9,1172,4,4688
1.0,1096,6,6576
1.1,1057,4,4228
1.2,780,2,1560
1.3,661,2,1322
1.4,709,2,1418
1.5,626,3,1878
1.6,693,2,1386
1.7,707,2,1414
1.8,711,2,1422
1.9,750,2,1500
2.0,651,2,1302
2.1,673,2,1346
2.2,669,2,1338
2.3,654,3,1962
2.4,692,3,2076
2.5,830,3,2490
2.6,1063,4,4252
2.7,965,4,3860
2.8,988,4,3952
2.9,883,3,2649
3.0,807,3,2421
3.1,737,3,2211
3.2,800,3,2400
3.3,757,4,3028
3.4,712,3,2136
3.5,764,3,2292
3.6,798,3,2394
3.7,786,3,2358
3.8,761,3,2283
3.9,779,3,2337
4.0,724,3,2172
4.1,798,3,2394
4.2,740,3,2220
4.3,727,3,2181
4.4,737,3,2211
4.5,707,3,2121
4.6,722,3,2166
4.7,997,4,3988

最初が秒数で、次がゼロクロス数で、次が振幅の絶対値の合計を1000000で割ったもの、次が2番目の値と3番目の値を掛けたものになります。

振幅の合計を1000000で割っているのは数字が大きくなり分かりにくくなるためです。

FreeBSDではmixerコマンドでマイクのボリュームを変更できます。ボリームを変更するとゼロクロスはボリュームには影響しませんが、振幅は変わります。

最初の大きな鳴き声の0.4秒のところは、かなりきっちり判別ができますが、2.6秒や4.7秒の鳴き声は数字にはでていますが、微妙な感じです。何らか他の要素を加えないと判定は難しい気がします。

その時点の値ではなく、その直前の値との差で判断するのが良さそうです。

この録音はよく撮れた方で実際にはいろいろ試行錯誤が必要です。

とりあえず始まりを判定して適当な長さの録音を行い、それを認識ロジックに放り込むことを考えているので、終わりに判定は行いません。

鳥によって鳴くときの音量は違いますが、どの程度の距離にいるかでも違ってきます。8mのところと16mのところでは4分の1の音圧になります。周りの雑音にもよりますが、どの程度の距離までを対象にするかを検討する必要もありそうです。

これを始めたのは夏で、時間によっては蝉の鳴き声に消されてあまりうまく行えませんでした。また今年(2018)は猛暑で鳥が少ない気がします。涼しくなると夜中は鈴虫などが入ってきてしまうのでしょうね。

自動観測は24x7でやるのは無理があり、環境雑音の評価や天候なども考慮して、行うのが良い気がします。天候の情報は天気概況などをネットから拾って判断する方法もあると思います。

鳥の鳴き声録音用のAndroidアプリも作ってあるのですが、こちらは録音開始と停止を人間が行い、停止前5秒を保存するようにしてあります。

AudacityはpluginがPythonで書けるようなので、このロジックの検証用のpluginがあると良いのですが、python分からないので作れません。
ChromeOSでファイルを開く際のデフォルト設定変更方法（拡張子とアプリの関連付け）

# はじめに
ChromeOSで、ファイルを開くときのアプリのデフォルト設定をどこで変えたらいいかよくわからなかったので、調べた。拡張子の関連付け。

# やったこと

ここに書いてあった。

[ChromeOSのファイルアプリ(2015/11/16 時点 ver46.0.2490.82):Chrome OS JHGN - ブロマガ](http://ch.nicovideo.jp/tekitoumemo/blomaga/ar908661)


試してみるとこんな感じ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/0c7feebf-3228-9303-c165-536df072c134.png)

右クリックしても出てこないのがいけてない。

# おわりに
こういうちょっとした情報がなかなか見つからないのが、ChromeOSの微妙なところ。
英語で調べたら、まだましなんかな。関連付けって英語でなんていうんやろう。
BiqQueryに関する情報源へのポインタ

BiqQueryに関するQiita上の記事や、各種ページへのリンクと個人的なメモです（作成中）

# BigQueryへのデータのロード
- [スプレッドシートのデータをBigQueryにインポートしてみた \| apps\-gcp\.com](https://www.apps-gcp.com/spreadsheet-to-bigquery/)
    - 「Create new table」
    - テーブル作成画面に遷移後、「Location」に「Google Drive」を選択
    - スプレッドシートのURLを入力（スプレッドシートではなく、DriveのURLを入力する必要がある）
    - 最新のスプレッドシートの内容がクエリを発行する都度反映される

# BigQueryからのデータのダウンロード

# BigQueryでのクエリの発行
- [Bigqueryの日時に関係する関数全部試してみた ①Date編 \- Qiita](https://qiita.com/amidara/items/1416135863a023a09127)

- [Google Developers Japan: BigQuery 活用術: UNNEST 関数](https://developers-jp.googleblog.com/2017/04/bigquery-tip-unnest-function.html)
    - GA360やFirebaseのようなJSONのような構造をもったデータに対するUNEST処理の分かりやすい解説
- [BigQuery: Google Analytics 360のネストされたデータをフラット変換するSQL \| エクスチュア株式会社ブログ](https://ex-ture.com/blog/2017/12/13/unnest-ga360-bq-data-with-standardsql/)
    - GAのカスタムディメンションの値をUNNESTして取得するクエリのサンプルあり
    -  (SELECT MAX(IF(index=1, value, NULL)) FROM UNNEST(hits.customDimensions)) AS dimension1　のようにする
- [cross join unnestを利用して、カンマ区切りのデータを単一の列の複数レコードに分解する。 \- Qiita](https://qiita.com/shohei727/items/80aebf3956d48fb509a6)


## クエリの標準化
- [BigQueryで読みやすいSQLを書くコツ \- たったの３つであなたの意図はもっと伝わる。 \- Timers Tech Blog](https://techblog.timers-inc.com/entry/2018/01/29/122206)
- [分析SQLのコーディングスタイル \- クックパッド開発者ブログ](https://techlife.cookpad.com/entry/2016/11/09/000033)

# BIツールとの連携
- [Tableau×BigQueryをコスパ良く使う方法 \| エクスチュア株式会社ブログ](https://ex-ture.com/blog/2018/07/18/tableauxbigquery%E3%81%AE%E8%AA%B2%E9%87%91%E5%AF%BE%E7%AD%96%E6%B3%95/)

# DatalabからのBigQueryの操作

- [\[GCP\] Datalab の起動方法 \- Qiita](https://qiita.com/nanairoGlasses/items/2a22768d996862140552)

    - 新規構築：datalab create xxx --zone asia-east1-a 
    - 接続：datalab connect xxx
    - 終了：「Stop VM」を選択することでDatalabを終了

- [Google DatalabからBigQueryへ標準SQLを投げたい \- Qiita](https://qiita.com/sutoh/items/a3ca635babbcdd25e801)

    - %%sql方式のとき　　%%sql -d standard
    - moduke形式のとき

> import datalab.bigquery as bq
> bq.Query(std_sql_sample).to_dataframe(dialect='standard')
Ruby　配列　あれこれ

# Ruby Array
配列の代入方法を備忘録として記述

#### 特定の値の抽出
```Ruby:通常
a = ["aaa", "bbb", "ccc"]

ary1 = []
ary2 = []
a.each do |t|
  case s
  when /aaa/
      ary1 << t
  else
      ary2 << t
  end
end
```
```:結果
ary1 #=> aaa
ary2 #=> bbb, ccc
```
長い・・・

```Ruby:select
a = ["aaa", "bbb", "ccc"]
ary1 = a.select { |t| t =~ /aaa/ }
ary2 = a - ary1
```
よくなった

```Ruby:partition
a = ["aaa", "bbb", "ccc"]
ary1,ary2 = a.partition { |t| t =~ /aaa/ }

```
よき
Pythonのnumpyの配列でつまづいた時の対処法

# Python の numpy の配列でつまづいた
ある事情で, numpyを使ったのだけれどそこでnumpy式配列(np.array)を操作する上で
色々つまづいたので備忘録も兼ねて残しておく. 
## numpyで配列を用意
今回は配列と言うか行列が欲しいので以下のように今回は配列を複数用意

```python
import numpy as np
matrix_1 = np.zeros(m, n)
vec_1 = np.zeros(m, 1)
matrix_2 = np.zeros(m, n)
```

このように適当に0行列を作成(m, nには任意の自然数を入れてください).
これをあーだこーだ計算して, とりあえず`matarix_1`と`vec_1`に値が入っているとします.
## 色々操作する
計算も終わり、さて`matrix_2`に値を入れていく.
今回は, 縦ベクトルで各列を置換していきたい.なので, とりあえずコードを書く.

```python
vec = matrix[:, i] * vec_1 # これは要素同士の掛け算になる
matrix_2[:, i] = vec
```

iは0<i<nです.
これでいいだろうと, 実際に動かすと 
***エラーを吐く.***
主に`matrix_2[:, i] = vec`の部分で次元が違うとかでエラーを吐く.
### 何で？
要素同士で, かつ縦ベクトル同士の掛け算では？ってなりそうなのだけれども実際のところこれは, 
***サイズ3の横型配列と(3,1)のベクトルの計算に当たる.***
つまり`vec = matrix[:, i] * vec_1`の結果は(m, m)の行列が返ってくることになる.
だからエラーを吐く. なので以下のようにしてあげると吉.

```python
vec = matrix[:, i].reshape(-1, 1) * vec_1
```

こうするとスライスした部分を縦ベクトルに変換してくれる. 
ちなみに, numpyのreshapeに-1を引数として渡すと勝手に残りの引数からサイズを計算してくれる. 便利.
## 続き
とりあえず, 上のエラーも直したのだから実行し直そうとすると
***またもやエラーを吐く.***
同様に次元がウンタラカンタラで. 
### 何で？(2回目)
これはスライスした場合の結果の値の問題で, スライスした値を何かの変数に代入しようとしたり, 計算に使おうとすると横型配列になる. これは上の事例を見てもらえばわかる通り. 
では, 置換しようとして`matrix_2[:, i]`のように指定すると, どうなるか.
結果は***縦型の配列***として扱うことになる.
色々面倒だけど, 実際にこうなる.つまり, `matrix_2[:, i] = vec`というのは, サイズmの配列(1次元)に対し, サイズ(m, 1)の縦ベクトル(2次元)を代入しようとしているのでエラーを吐いている.見た目は同じ1次元なのだけれどもね.
ということで, 修正する.

```python
vec_r = vec.reshape(m)
matrix_2[:, i] = vec_r
```

こうすると, 無事エラーを吐かずに, 計算が終わる.
## まとめ
配列、もしくは行列のスライスの結果は1次元の配列として返ってくる.
なので、縦ベクトルにしたり縦ベクトルで置換したい場合はreshapeで次元を変えてあげるのが吉.
##参考サイト様
- [配列の次元数や大きさの操作](http://www.kamishima.net/mlmpyja/nbayes2/shape.html)
CODEPENでお絵かき１

CODEPENでは、グラフィカルな作品も多くとても綺麗で、自分もチャレンジしたいと思いお絵描きしてみました。
<p data-height="350" data-theme-id="0" data-slug-hash="mMMWNe" data-default-tab="css,result" data-user="tomoka" data-pen-title="Minion Bob" class="codepen">See the Pen <a href="https://codepen.io/tomoka/pen/mMMWNe/">Minion Bob</a> by tomo (<a href="https://codepen.io/tomoka">@tomoka</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

大きさを測る時は、photoshopでピクセルで大きさを図りました。
数値をそのままcssに反映。

色はもちろんphotoshopのスポイトで取得。

こだわったのは、DOMの構造です。
左右の手を示すのに、少し深くネストしました。

例えば、手。

腕
├左ー手
|　　├指１
|　　├指２
|　　└指３
└右ー手
　　　├指１
　　　├指２
　　　└指３

ソースにすると以下のような感じ。

```
      .arms
        .left
          .hand
            .finger01
            .finger02
            .finger03
        .right
          .hand
            .finger01
            .finger02
            .finger03
```
顔も、体も、カテゴリ分けしてネストすることに意味を持たせたく。
絵を描いたのはずいぶん前なのですが、また描こうかなと思ったので記事を書きました。
Herokuにサンプルのアプリ(Rails)を参考サイトを見ながらデプロイする手順をまとめた。


# What
HerokuにRailsのサンプルアプリをデプロイしたのでその手順をまとめた。

# Why
Herokuへのデプロイ手順がわからなかった。参考サイトを探すのが手間なので。:sweat_smile:

# Herokuサンプルアプリをデプロイ

## 参考にしたサイト
https://techacademy.jp/magazine/6401<br>

## 実際の作業と手順で詰まったところ
1. アカウントの登録
 ここから→https://signup.heroku.com/<br><br>

1. Railsアプリケーションの作成(参考サイトに従います。)<br><br>
1. Herokuで公開する<br>
・ 本番用の推奨DBをGemfileに記述し、<code>bundle install</code>を実行。gemのpgがインストールの際エラー。<br>こちらで対応 → https://qiita.com/masanarih0ri/items/5ad2f7e11c8c94170d6b<br>DBのpostgreSQLをMAC自身にインストールする必要があるらしい。<code>brew install postgresql
</code>
・ <code>heroku create （Herokuアプリケーション名）</code>でherokuコマンドがないとのことで、インストール<br> 参考→ https://devcenter.heroku.com/articles/heroku-cli <br><code>brew install heroku/brew/heroku</code>を実行(Macなので)<br><br>※herokuのアプリ名は名前は小文字と数字とダッシュだけ(ユーザ名+アプリ名なら他と被らないかも)<br>
・ <code>push heroku master</code> でうまくpushできなかったので対応<br>参考 → https://qiita.com/EntreGulss/items/8186938683f929a0dae2 <br>

```bash
# リポジトリの初期化
$ git init

# コミットするファイルを選択
$ git add .

# メッセージをつけてコミット
$ git commit -m "first commit"

# 再度リモートのブランチへpush
$ git push heroku master

```
4.HerokuURLにて確認<br>
http://（Herokuアプリケーション名）.herokuapp.com
で無事にデプロイできました！

<h2>まとめ</h2>
herokuは一定期間なら自身のアプリケーションをあげられ、本番環境でないとわからないことを確認できる
今後はアプリをHerokuにデプロイして閲覧数を確認する仕組みを作りたい。:v: