OmniAICreator/Qiita-1.07M huggingface dataset:
Unityでaudioのピッチを変えずにテンポを変える

# はじめに
こんにちは。久々の投稿です。
Unityでaudioのピッチを変えずにテンポを変える、いわゆるタイムストレッチの実装をしました。
UnityのAudioSourceはPitchの値をいじることで、audioの再生速度（テンポ）を速くしたり遅くしたりできますが、同時に音の高さ（ピッチ）も変わってしまいます。そこでUnityでaudioの音の高さを変えずに再生速度を変える方法）をAudioSourceのPitchだけでなく、AudioMixerのPitchShifterも同時にいじることで実現しました。


# PitchShifterとは
PitchShifterはAudioMixerのコンポーネントの出力に効果を与えられるAudioEffectの一つです。AudioEffectには他にLowpassやEcho等があります。PitchShifterの効果は再生速度は変えずに音の高さを変えることです。
https://docs.unity3d.com/ja/current/Manual/class-AudioPitchShifterEffect.html


PitchShifterを使えば、例えばAudioSourceの音の高さを変えずに再生速度を2倍速くする方法は、
①AudioSourceのプロパティであるPitchの値を2.0に設定する。（再生速度が2倍、音の高さが2倍になる）
②PitchSifterのプロパティであるPitchの値を0.5に設定する。（再生速度は2倍のまま、音の高さが2*0.5=1倍になる）
で実現できます。

ただし、PitchShifterのプロパティPitchは0.5-から2.0までしか値が取れないのでMaxで2倍速しか取れません。

先ほどの方法は、Editor上のみで設定したため、動的に再生速度を変更することはできません。動的に変更するためにはスクリプトで制御する必要があります。AudioSourceはスクリプトからでも簡単に値を制御できますが、AudioMixerのAudioEffectの１つであるPitchShifterは、スクリプトで制御するためには一工夫が必要になります。その部分を詳しく書こうかと思ったのですが公式に「AudioMixerのプロパティにアクセスする方法」がまとめられていたので、そちらを参考にしてください。
https://unity3d.com/jp/learn/tutorials/topics/audio/exposed-audiomixer-parameters

# おわりに
とても短い記事になってしまいました。。。
短すぎるのもあれなので、この記事を書くことになった経緯をお伝えしたいと思います。
この記事に書いてある内容は、就職活動中に志望先の企業のエンジニアの方々に教えて頂いたものです。
当時、自分では実装方法がなかなか思いつかず、だめもとで志望先の面接官の方に「困ってます！！」とお話したら、現場のエンジニアの方に質問内容を回してくださり、後日、ソースコードと共に回答が返ってきました。
自分がさんざん悩んだ実装をさらりと回答する辺り、「プロのエンジニアめちゃくちゃすごい！！！」ってなったのは勿論のこと、まだその企業で働くことも決まっていない赤の他人のために時間を割いてくださった事にとても感動して、自分も困っている誰かのために情報を伝えたいなと思って記事を書きました。
結局、その企業とはご縁がありませんでしたが、就活中で最も印象に残っているエピソードです。いつか一緒にお仕事ができたらいいなと思います。
tokio-uds で docker.sock を叩く


[dockerd の API は docker.sock を介して REST API になってます。デフォルトは unix domain socket になっていて、起動オプションで http に変えることができます。](https://docs.docker.com/engine/reference/commandline/dockerd/#examples)

[tokio-uds](https://github.com/tokio-rs/tokio/tree/master/tokio-uds) を使って unix domain socket 経由で [docker engine api](https://docs.docker.com/engine/api/v1.24/) を叩いてみましょう。

```toml
[dependencies]
futures = "0.1"
mdo = "0.3"
mdo-future = "0.2"
tokio = "0.1"
tokio-uds = "0.2"
tokio-timer = "0.2"
```

```rust
extern crate futures;
extern crate tokio;
extern crate tokio_uds;
extern crate tokio_timer;
#[macro_use]
extern crate mdo;
extern crate mdo_future;

use mdo_future::future::*;
use futures::prelude::*;
use futures::future;
use tokio_uds::UnixStream;

fn main() {
    let docker_sock = std::path::Path::new("/var/run/docker.sock");
    tokio::run(mdo!{
        mut client =<< UnixStream::connect(&docker_sock);
        _ =<< {
            use std::io::Write;
            let request = format!("GET /containers/json?all=1&size=1 HTTP/1.1\r\nHOST: rust\r\n\r\n");
            println!("{}", request);
            future::result(client.write_all(request.as_bytes()))
        };
        _ =<< tokio_timer::sleep(std::time::Duration::from_secs(1)).map_err(|err| std::io::Error::new(std::io::ErrorKind::Other, format!("{:?}", err)));
        _ =<< {
            use std::io::Read;
            const BUFFER_SIZE: usize = 1024;
            let mut buffer: [u8; BUFFER_SIZE] = [0; BUFFER_SIZE];
            let mut raw: Vec<u8> = Vec::new();
            loop {
                let ret = client.read(&mut buffer).map(|len|{
                    println!("{}", len);
                    for i in 0..len { raw.push(buffer[i]); }
                });
                if let Err(err) = ret {
                    if err.kind() == std::io::ErrorKind::WouldBlock {
                        break;
                    }
                    panic!("{:?}", err);
                }
            }
            let ret = std::str::from_utf8(&raw).unwrap();
            println!("{}", ret);
            future::ok(())
        };
        ret future::ok(())
    }.map_err(|_| () ));
}

```

これを hyper を使って実装したものが [Boondock](https://github.com/faradayio/boondock) です。
dotCover でコードのカバレッジを取る

Get Started 通りの説明だけど、便利なのに日の目を見ることがない便利ツールで終わってしまいそうな気がしたので書いてみました。

## dotCover とは？

>JetBrains dotCover は、Visual Studio に統合できる .NET 単体テスト ランナーとコード カバレッジ ツールです。 
>単体テストでカバーされるコードの範囲を確認してください。 dotCover は、ターゲットとなる .NET Framework、Silverlight、さらに .NET Core のアプリケーション内のステートメント レベルでコード カバレッジを計算、レポートします。

簡単にまとめるとコードのカバレッジを見やすく出してくれるツールです。
C# 界隈では有名な ReSharper と同じ JetBrains のツールです。 ReSharper Ultimate のライセンスがあれば使用できます。 ReSharper と同様に 30日間は試用期間で使えるので、気になった方はインストールしてみてください。

## インストール手順

ReSharper Ultimate のインストーラーを起動して dotCover を選択してください。
`Next` -> `Install` の順に選択することでインストールが完了します。
[![Image from Gyazo](https://i.gyazo.com/cc61b3aad7def068d57be1cb18ff0ec8.png)](https://gyazo.com/cc61b3aad7def068d57be1cb18ff0ec8)

## dotCover の使い方

### テスト実行

テスト対象のコードを用意します。今回は成功用の `MethodA` と、失敗用の `MethodB` を用意しました。

```csharp
public class CoverageService
{
    public int MethodA(int id)
    {
        if (id == 0)
        {
            return 0;
        }
        else if (id > 1)
        {
            return 1;
        }
        else
        {
            return -1;
        }
    }

    public int MethodB(int id)
    {
        if (id == 0)
        {
            return 0;
        }
        else
        {
            return -1;
        }
    }
}
```

単体テストのコードを用意します。今回は `xUnit` のテストライブラリを使用しました。 `MSTest` と `NUnit` も対応しています。

```csharp
[Fact]
public void MethodATest()
{
    Assert.Equal(0, new CoverageService().MethodA(0));
    Assert.Equal(1, new CoverageService().MethodA(5));
    Assert.Equal(-1, new CoverageService().MethodA(-5));
}

[Fact]
public void MethodBTest()
{
    Assert.Equal(9, new CoverageService().MethodB(0));
}
```

Visual Studio のメニューから、 `ReSharper` -> `Windows` -> `Unit Test Coverage` を選択します。ついでに `Unit Test Explorer` も開いておきます。
[![Image from Gyazo](https://i.gyazo.com/9e04352c713295937804ac3c5488b345.png)](https://gyazo.com/9e04352c713295937804ac3c5488b345)

`Unit Test Explorer` ウィンドウから、盾アイコンの `Cover Unit Tests` を実行して、結果を表示します。
[![Image from Gyazo](https://i.gyazo.com/b35955f59a51b09240ebd58a44c11d45.png)](https://gyazo.com/b35955f59a51b09240ebd58a44c11d45)

### カバレッジの見方

まずは `Unit Test Coverage` ウィンドウから見ていきます。
今回用意した成功用の `MethodA` は全ての条件を通るテストコードを用意したので、カバレッジが 100％ になりました。一方、失敗用の `MethodB` は一つの条件しか通っていないため 100％ になりませんでした。  

次にテスト対象のコードを確認します。
コードの左側にある緑色、赤色、灰色の線が、テストの結果とカバレッジの結果と一致するようになっています。 `MethodA` はテストが全て成功しているので緑色のみ。 `MethodB` はテストに失敗した部分が赤色、条件に当てはまるテストがなかった部分に灰色が付いている状態になっています。

### カバレッジのレポート出力

dotCover はレポート出力機能も備えているので、開発者以外の関係者に提出するときも便利です。
出力方法は `Unit Test Coverage` ウィンドウから、右上矢印アイコンの `Export coverage report` を選択するだけです。形式は `HTML` / `JSON` / `XML` があります。今回は `HTML` で出力した結果を貼り付けておきます。
[![Image from Gyazo](https://i.gyazo.com/c015ca9ea75269125463732c3e03550b.png)](https://gyazo.com/c015ca9ea75269125463732c3e03550b)

## 備考

今回は単体テストを紹介しましたが、統合テストやウェブサーバーでのカバレッジにも対応しています。もっとたくさんのこと知りたいよ！という方は、参考文献に dotCover のマニュアルへのリンクを記載しておくので見てください。（そして、たくさんの方に広めてください！）

## 参考文献

[dotCover: A Code Coverage Tool for .NET by JetBrains](https://www.jetbrains.com/dotcover/)
[Get Started - Help | dotCover](https://www.jetbrains.com/help/dotcover/Getting_Started_with_dotCover.html)
Qiitaで記事作成中に画像が貼れなくなる

<p>Qiitaにて記事を書いている際に、はじめは問題なく表示されていた画像が急に`![error]()`となり、表示されなくなってしまった。
</p>
<p>容量制限かな？なんて思っていたらそのようでした。</p>
<div>
どうやらQiitaで記事を一度も投稿したことがない場合は、画像アップロード制限は2M/月とのこと。
ただし一度でも投稿すれば、制限は100M/月になるようです。
</div>
というわけで投稿。
ちなみにこういうのを書いたことがないので、100M/月というのはどうなのだろう。

#参考
[初めてQiitaに投稿すると1ヶ月の画像アップロード制限が2MB→100MBにアップします](http://blog.qiita.com/post/75674629515/image-capacity-expansion)
homebrewで入れたmysqlを8系から5系にダウングレードする

## WHY
MySQLを**8系**にアップグレードしたところ、**mysql2** gemが入らなくなり、Railsが起動できなくなってしまったため。
[Homebrew で MySQL を 5.7.22 から 8.0.11 にバージョンアップしたら Rails が動かなくなったので対処する](https://qiita.com/renny1398/items/5df494a2b2f5d74b24f4)

## HOW
**1. mysqlをアンインストールする**
アンインストールの手順は以下の記事を参考にしてください。
[MacでMySQL5.7をアンインストールする](https://qiita.com/sato11/items/ba887a5655217f60f2a2)

**2. MySQL 5系のインストール**

```
$ brew search mysql
```

で、利用可能なフォーミュラを検索。
mysql@5.7があるのを確認して、

```
$ brew install mysql@5.7
```

インストールが完了したら、パスを通す。

```
$ echo 'export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"' >> ~/.bash_profile
```

```
$ source ~/.bash_profile
```

以下で起動できればインストール成功！

```
$ mysql.server start
```

自動起動の設定もしておきましょう。

```
$ ln -sfv /usr/local/opt/mysql@5.7/*.plist ~/Library/LaunchAgents
```

```
$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mysql@5.7.plist
```
GitHub で pull request のテンプレートを複数使いわける

## きっかけ
社内で使っている pull request のテンプレートがあり、各人でブックマークレットや、[Using saved replies](https://help.github.com/articles/using-saved-replies/) などを利用してテンプレートを適用しているのですが、テンプレート原本の内容がちょいちょい更新されるので、人によって使っているテンプレートが古いままだったりすることがありました。

それを解消する方法はないものかなーと思っていたところ、[GitHubのIssue・Pull Requestのテンプレート機能を使おう](https://qiita.com/nyamogera/items/3fe6985b45fbd5377184) の記事を見つけました。

問題自体はこれで解決しましたが、ふと pull request のテンプレートを複数使いたい場合はどうすればいいんだろう？という疑問が浮かびました。調べてみたところ公式に書いてありましたので本日はそれをまとめてみたいとおもいます。

※なお、今回は pull request に話を限定します。

## テンプレートが1つだけでいい場合

これは先ほど貼った記事リンクにも記載されているものですが、おさらいと整理のため記載します。

リポジトリ直下に `.github/PULL_REQUEST_TEMPLATE.md` を設置します。
すると`PULL_REQUEST_TEMPLATE.md` の内容が pull request 作成時に自動的に挿入されます。

![tmpmd.png](https://qiita-image-store.s3.amazonaws.com/0/70638/86b92b36-f45d-34f2-d34c-53bd18618108.png)


## テンプレートを複数使い分けたい場合

こちらが今日の本題です。

リポジトリ直下に `.github/PULL_REQUEST_TEMPLATE/` ディレクトリを作成し、その中にテンプレート用のマークダウンファイルを作成します。ファイル名はなんでもOKです。ここでは例として `.github/PULL_REQUEST_TEMPLATE/` に `template1.md` と `template2.md` を作成します。

![tmp1.png](https://qiita-image-store.s3.amazonaws.com/0/70638/9fdfc260-f4e6-5751-7d4e-522a907acd6f.png)


pull request 作成時、URLに `?template=template1.md` というクエリを付けてリクエストを送信すると、先ほどの `template1.md` が pull request の本文に挿入されます。

![temp2.png](https://qiita-image-store.s3.amazonaws.com/0/70638/1d6012fe-b995-68fe-894f-33cd0d3c6526.png)


## 所感
pull request のテンプレートが1つでいい場合は完全に自動化できるので非常に良さそうです。
ただ、テンプレートを複数使う方法は現状 `?template=xxxxx` のクエリ付与にひと手間がかかるので、業務等に導入するにはもう一工夫要りそうかと感じました。こちらはまた何か良い情報等が見つかりましたら記事に追加したいと思います。~~まあ、そもそもpull requestのテンプレートって何種類もいらないんじゃn(ry~~


## 参考
[GitHubのIssue・Pull Requestのテンプレート機能を使おう](https://qiita.com/nyamogera/items/3fe6985b45fbd5377184)

公式ヘルプ
https://help.github.com/articles/creating-a-pull-request-template-for-your-repository/
> To create multiple pull request templates and use the template query parameter to specify a template to fill the pull request body, type .github/PULL_REQUEST_TEMPLATE/, then the name of your pull request template.

https://help.github.com/articles/about-automation-for-issues-and-pull-requests-with-query-parameters/
> Query parameters are optional parts of a URL you can customize to share a specific web page view, such as search filter results or an issue template on GitHub.
シーザー暗号の解読(CpawCTF write up)

#はじめに
CpawCTFを解いていて、久々にC言語を書きたくなったのでプログラムを作成する。
＊自分用メモ
＊初投稿のため、誤字脱字・コードの間違い等ありましたら申し訳ありません。

#問題
今回の問題はQ6.[Crypto] Classical Cipherである。
問題として出題されていた暗号文は「fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}」である。
そのため、この問題を解くためのプログラムを作成する。
##コード

```c
#include<stdio.h>
int main(void){
	char str[256] = {'\0'};
	char answer[256]= {'\0'};
	char flag[256]= {'\0'};
	
	printf("Please enter a FLAG=");
	gets(flag);
	printf("Please enter Caesar cipher=");
	gets(str);
	
	for(int i = 0;i < 26; i++){
		for(int n = 0; str[n] != '\0' ; n++){
			if(str[n] >= 'A' && str[n] <= 'Z'){
				if(str[n] + i > 'Z') answer[n] = (str[n] + i) - 26;
				else answer[n] = str[n] + i;
			}else if(str[n] >= 'a' && str[n] <= 'z'){
  				if(str[n] + i > 'z') answer[n] = (str[n] + i) - 26;
				else answer[n] = str[n] + i;
			}else answer[n] = str[n];
		}
		if(answer[0] == flag[0]) printf("%s\n",answer);
	}	
	return 0;
}
```

上記のプログラムを作成した。
「flag」の配列に入れた文字列とi文字シフトした文字列の一文字目を比較し、一致した場合のみ出力する。
そのため、今回は最初の入力時に「cpaw」と入力し、二度目の入力に暗号文を入力すると答えが出力される。

#まとめ
もう少しわかりやすくコーディングできるかもしれないが、簡単なシーザー暗号を解くにはこのプログラムで十分だと思う。
見直してみると配列名と最初に出力する文はflagではなくkeyの方がよかったかもしれない。
iOS開発しているときに便利だなって感じたWebサービス

iOSアプリを作成していると、大体のことはXcodeで済んでいますが、
一部はめんどうな作業が発生することがあります。

ここでは、iOSアプリを作成していく上で便利だなっと思ったサービスを紹介していきます。


# WebカラーからUIColorに変換する
[UI Color - Convert HEX & RGB colors to UIColor](http://uicolor.xyz/#/hex-to-ui)

HTMLで使われる16進数のカラーコードからSwiftのUIColorを生成してくれるサービスです。
桜色のカラーコード（#FBDADE）を入力したら、下記のソースコードを生成してくれました。

``` swift
UIColor(red:0.98, green:0.85, blue:0.87, alpha:1.0) // 桜色
```

なおXcodeにColor Literalという機能があるので、Xcode標準でもこのWebサービスに近いことはできます。
[UIColorをColor Literalで定義する - Qiita](https://qiita.com/okuderap/items/f980dde37e3f44fd9d01)


# 画像ファイルからアプリアイコンを生成してくれるサービス
[App Iconizer - Icon Generator](https://appiconizer.com)

アプリをAppStoreにリリースする際にアイコンを作成する必要がありますが、
iOS用のアイコンを作成するには様々なサイズの画像が必要です。

このサービスは画像ファイルがあれば、自動的にiOSアプリに合わせた画像ファイルが作成されるので、
便利です。

# Objective-C -> Swift変換ツール

[Objc2Swift.js](http://okaxaki.github.io/objc2swift/)

Web上でSwift変換できるツール
Swiftifyのようにログインする必要がないので、セキュリティが厳しい環境からのアクセスに重宝しました。

# アイコン

https://www.flaticon.com

https://nucleoapp.com

https://thenounproject.com

# デモ用顔写真

https://uifaces.co

# Flat UI Color
色を探すのに便利

https://flatuicolors.com

# NSDateFormatterを形式を教えてくれるサイト

https://nsdateformatter.com

# PNGファイルからiOS開発で使用するアイコンサイズに変換してくれるサービス

https://appicon.co

# その他（デザイン素材）
[Apple Design Resources - Apple Developer](https://developer.apple.com/design/resources/)
link_to でパラメータを渡す方法について

Ruby on railsでwebサイトを作っていてヘッダーにメニューを作るところで起きたトラブルのメモです。

```app/views/layouts/_header.html.erb
<%# link_to 'クイズを解く', {controller:'quizzes', action: 'select', my_str: 'rand'} %>
```
と

```app/views/layouts/_header.html.erb
<%= link_to 'クイズを解く', select_quizzes_path(my_str: 'rand') %>
```
では後者の方が良いという自分の結果。一見両方とも同じ結果のリンクコードであると思われるが、違いがあった。
前者の問題点として、メニューからログインを押した場合、deviseのコントローラーのアクションを利用することになる（？）みたいなので、
route エラーが起こって、
No route matches {:action=>"select", :controller=>"devise/quizzes", :my_str=>"rand"}
というエラーメッセージが出た。つまり、deviseのコントローラーにquizzesなんてアクションはないと警告が出ているというエラーです。
そのため、後者のような記述にしたら、解決したという内容です。

では、なぜ前者の書き方をしたかというと、パラメータをリンクの際にアクションに渡したいということで、前者の書き方をしていたのですが、どうやら後者の書き方のほうが良さそうだということでした。
しかし、それにしても、このようなことを書いている記事がweb上にまったくないような気がする。自分の検索の仕方が悪いだけなのでしょうか？

勢いで書いた記事なので、もっとよいやり方があるでしょうけれど、熟練rubyistの人たちはどうやっているのだろうか。

なお、自分と同様の初心者の方のために、もう一つ。以下のようにルーティングしないとエラーになります。以下の記述をすると、select_quizzes_pathが作成されるということになります。

```config/routes.rb
  resources :quizzes do
    collection do
      get 'select'
    end
  end
```
treeコマンドの表示条件を指定する

Linuxコマンドには`tree`というものがあり、実行したディレクトリ配下のファイルをツリー状に表示してくれます。

```sh
$ tree
.
├── .gitignore
├── README.md
├── package.json
├── public
│   └── index.html
├── src
│   ├── actions
│   ├── components
│   ├── containers
│   │   └── App.tsx
│   └── index.tsx
├── tsconfig.json
├── tslint.json
├── webpack.config.js
└── yarn.lock
```

*Macの場合デフォルトでは使えないですが、homebrew等を使って入れることができます

```sh
$ brew install tree
```

この`tree`コマンドですが、デフォルトでは`.`から始まるファイルを表示できなかったり、`node_modules`のようなディレクトリも展開して表示してしまいます。

そこで、僕はこんな感じでaliasを指定してます

```sh:.zshrc|.bash_profile
alias tree = 'tree -a -I "\.DS_Store|\.git|node_modules|vendor\/bundle" -N'
```

## `-a`
`.`から始まるファイルも含める

## `-I`
`|`つなぎでパターンを指定して結果から除外する

## `-N`
表示できない文字(日本語)も表示する


他にも色々オプションがあります。

https://www.geeksforgeeks.org/tree-command-unixlinux/
Laravel5.5で認証(login)機能を追加する

login機能を設定します。

コマンドラインで以下を入力

```
php artisan make:auth
```
以下が作成される。
LoginController.php
RegisterController.php
ResetPasswordController.php


マイグレーションする

```
php artisan migrate
```

ログイン後でないとアクセスできないように設定

```\app\Http\Controllers\ArticleController.php

    public function __construct()
    {
        $this->middleware('auth');
    }
```

ログインした先のパスを設定

```\app\Http\Controllers\Auth\LoginController.php
    protected $redirectTo = '/article';
```

以下にも同じように設定
\app\Http\Controllers\Auth\RegisterController.php
\app\Http\Controllers\Auth\ResetPasswordController.php



ちなみにこんな感じでログインしているユーザのidが取れます。

```php
 $login_use_id = Auth::id();
```

参考
Laravel 5.5 認証
https://readouble.com/laravel/5.5/ja/authentication.html
古い subversion のレポジトリを git に変換した

# 古い subversion のレポジトリを git に変換した

Windows で TortoiseSVN で管理していたローカル svn レポジトリを git に変換した.
もう変換作業はないと思うが、一応記録しておく.

前提条件:

1. レポジトリは trunk すらなく、/ の直下に各プロジェクトのディレクトリが存在し、このディレクトリごとに git レポジトリを作成する
2. IaaS で CentOS 7.5 のまっさらな VM を作業用に用意(使い捨て)
3. Windows 上の fsfs な svn レポジトリを zip で固めて scp で 2. の Linux に転送
4. 作業が終わったら固めて、scp で Windows に戻す

以下、作業ログ

```
$ sudo su -
# yum install mod_dav_svn git-svn unzip
# cd /etc/httpd/conf
# cp -p httpd.conf httpd.conf.bak
# vi httpd.conf
# diff -u httpd.conf.bak httpd.conf
--- httpd.conf.bak      2018-06-26 18:07:11.000000000 +0000
+++ httpd.conf  2018-07-22 13:08:00.058609793 +0000
@@ -39,7 +39,7 @@
 # prevent Apache from glomming onto all bound IP addresses.
 #
 #Listen 12.34.56.78:80
-Listen 80
+Listen 127.0.0.1:8080

 #
 # Dynamic Shared Object (DSO) Support
@@ -351,3 +351,8 @@
 #
 # Load config files in the "/etc/httpd/conf.d" directory, if any.
 IncludeOptional conf.d/*.conf
+
+<Location /svn>
+    DAV svn
+    SVNPath /var/www/repository
+</Location>
# cd /var/www/
# unzip /home/c-yan/repository.zip
# apachectl configtest
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 10.0.1.4. Set the 'ServerName' directive globally to suppress this message
Syntax OK
# apachectl start
# cd
# svn co http://127.0.0.1:8080/svn/ svn
# mkdir git
# cd git
# ls ../svn | while read i; do
> mkdir $i
> cd $i
> git svn init -T /$i http://127.0.0.1:8080/svn/
> git svn fetch
> cd ..
> done
# for i in *; do \rm -r $i/.git/svn; done
# for i in *; do \rm $i/.git/refs/remotes/trunk; done
# cd ..
# tar cf - git > /home/c-yan/git.tar
# chown c-yan /home/c-yan/git.tar
```

`git svn clone`はエラーでコケることが多いので、`git svn init`と`git svn fetch`にバラして実行したほうが良い. また、svn は ignore がファイルではないので、`svn propget svn:ignore`で拾って`.gitignore`を作成する必要があるが、この作業には含まれていない.
ROSのcppのpkgでstd_msgに値を代入したい

投稿日2018/07/22
cppのpkgでの、std_msgへの値の代入で引っかかってしまったのでメモ。

#間違ったコード
(例)floatの場合

```
std_msgs::Float32 val_float32;
val_float32 = 123.4;
```


#コンパイル時に出たエラー
error: conversion from ‘float’ to non-scalar type ‘std_msgs::Float32 {aka std_msgs::Float32_<std::allocator<void> >}’ requested


#正しいコード
```
std_msgs::Float32 val_float32;
val_float32.data = 123.4;
```

#説明
てっきりstd_msgだからそのまま代入だろ、と思い込んでいました。
twist型だったら、

```
twist.linear.x = 0.0;
```

という感じでやるのにね。
SSH設定-Githubのkey設定

#初心者用

##Githubの**登録**
下記の方法でアカウント作成。リポジトリの作成を行う。

>[GitHubアカウント作成とリポジトリの作成手順](https://qiita.com/kooohei/items/361da3c9dbb6e0c7946b)

##Terminalにてバージョンの確認
terminalにて以下のコマンドを入力。

```
$ git --version
```
macの場合、最新のバージョンでなければ、インストール画面が表示される。
インストールが完了するまで待機。

##公開鍵と秘密鍵の作成
```
$ cd ~/.ssh
$ ssh-keygen -t rsa -C "自分の登録したメールアドレス"
```

sshディレクトリがない場合は作成する。

```
$ mkdir ~/.ssh
```

作成後、公開鍵と秘密鍵の名前を指定する。
変更ない場合は以下のまま。

```
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/~/.ssh/id_rsa): 
```
変更する場合は、

```
Enter file in which to save the key (/Users/~/.ssh/id_rsa):/Users/~/.ssh/任意の名前
```
renterを押す。
任意のパスフレーズを作成する。

```
Enter passphrase (empty for no passphrase): 任意のパスフレーズ
Enter same passphrase again: 先程指定したパスフレーズの確認
```
~/.sshの中に先程作成したid_rsa,id_rsa.pubがあることを確認する。
任意で作成した人は、任意で作成した名前のファイル,任意で作成したファイル.pubがあることを確認。

##SSH接続時の認証
SSH接続の際にパスワード入力を省略するために認証を行う。

```
$ ssh-add -K ~/.ssh/id_rsa
```
認証されたかの確認。

```
$ ssh-add -l
```
##id_rsa.pub内のkeyのコピー
id_rsa.pub内をすべてコピー
中身は照合させるkey.

```
$ pcopy < ~/.ssh/id_rsa.pub
```

##Githubでの設定
Githubにて自分のアイコンをクリック。
-[settings]を開く。
-[SSH and GPG keys]を選択。
-[New SSH key]を選択。
-任意の[title]を作成。どのデバイスのSSHか分かるようにすると良い。
-さきほどコピーしたid_rsa.pubの中身を[key]に貼り付ける。

##Terminalで無事に設定できたかの確認

```
$ ssh -T git@github.com
```
上記のコマンドrenter後、

```
Are you sure you want to continue connecting (yes/no)? 
```
と表示されるので

```
Are you sure you want to continue connecting (yes/no)? yes
```
"yes"と入力。

```
shell access.
```
と表記されれれば完了。
Github>[settings]>[SSH and GPG keys]を確認。
緑色に鍵のマークが変われば完了。

##その他
clone時にエラーが出る場合は、
~/.ssh/configに以下を書き込む。

```
Host github
    HostName github.com
    IdentityFile ~/.ssh/id_rsa
    User git
```
Bootstrapのナビゲーションバー(navbar)の背景色を好きな色にする方法とは？

#やりたいこと
Bootstrap4を使って、navbarの色を好きな色に設定すること。

#どうすればいいのか？
こうすればOK！
styleの#以降に好きなカラーコードを指定すればよし！

``` ruby:HTML
<nav class="navbar navbar-dark" style="background-color:#e3f2fd;">
・・・
</nav>
```

#どういう仕組みか？
もともと好きな背景色にこだわらなければこう書けばOK。

``` ruby:HTML
<nav class="navbar navbar-dark bg-dark">
・・・
</nav>
```
navbar-darkまたはnavbar-lightでnavbar-darkで
「そもそもnavbarって明るめの背景=黒文字っすか？それとも暗めの背景=白文字っすか？」
と指定する。

そしてbg-**の部分で背景色を決めている。
（classにbg-**って書くのがbootstrapによってラクできるところっすからね。）

このbg-**を指定せずにstyleを書けばよし！ということっすな。

参考URL
http://cccabinet.jpn.org/bootstrap4/components/navbar#navbar-bg-state

#最後に
最後まで読んでいただいてありがとうございました！

実は、ナビゲーションバーの文字色も変えたいんすが、
それはまた後日ということで。
このあたりを解釈すればできるっぽいけど、まだ解釈ができてない。。。
https://torina.top/detail/172/

Twitterでフォローしていただいて応援していただけますと、
もっといろいろ書いていきますー。
https://twitter.com/pocket_ma_kun
CentOS6.xにyumで最新のgitをインストール

CentOS6.xだとgitは標準でインストールされていますが、かなり古いです。

```shell:Gitのバージョン確認
# git --version
git version 1.7.1
```

なので最新をインストールしたいとこですが、普通にyumするだけではダメなので下記手順を実行します。
まずは、古いgitをアンインストール。

```shell:Gitをアンインストール
# yum remove git
```

次に、wingリポジトリを登録。

```shell:wingリポジトリを登録
# cd /etc/yum.repos.d/
# wget http://wing-repo.net/wing/6/EL6.wing.repo
```

最後に、wingリポジトリを有効にするオプションを付けながらyumを実行します。

```shell:最新Gitのインストール
# yum --enablerepo=wing install git
```

これで最新のgitがインストールされたはずです。

```shell:Gitのバージョン確認
# git --version
git version 2.7.2
```
数字のループ

何となくやってみました。5回の繰り返しです。すべてわかるでしょうか。

```ruby:Ruby
$ pry
[1] pry(main)> 5.times {|i| puts i}
0
1
2
3
4
=> 5
[2] pry(main)> (1..5).each {|i| puts i}
1
2
3
4
5
=> 1..5
[3] pry(main)> 1.upto(5) {|i| puts i}
1
2
3
4
5
=> 1
[4] pry(main)> for i in 1..5
[4] pry(main)*   puts i
[4] pry(main)* end  
1
2
3
4
5
=> 1..5
[5] pry(main)> i = 1
=> 1
[6] pry(main)> while i <= 5
[6] pry(main)*   puts i
[6] pry(main)*   i += 1
[6] pry(main)* end  
1
2
3
4
5
=> nil
[7] pry(main)> def count(i)
[7] pry(main)*   return if i > 5
[7] pry(main)*   puts i
[7] pry(main)*   count(i + 1)
[7] pry(main)* end  
=> :count
[8] pry(main)> count(1)
1
2
3
4
5
=> nil
[9] pry(main)> co = Enumerator.new do |y|
[9] pry(main)*   i = 1
[9] pry(main)*   while i <= 5
[9] pry(main)*     y << i
[9] pry(main)*     i += 1
[9] pry(main)*   end  
[9] pry(main)* end  
=> #<Enumerator: ...>
[10] pry(main)> loop {puts co.next}
1
2
3
4
5
=> nil
[11] pry(main)> co = Enumerator.new do |y|
[11] pry(main)*   i = 1
[11] pry(main)*   loop do
[11] pry(main)*     y << i
[11] pry(main)*     i += 1
[11] pry(main)*   end  
[11] pry(main)* end  
=> #<Enumerator: ...>
[12] pry(main)> puts co.take(5)
1
2
3
4
5
=> nil
[13] pry(main)> puts 1.step.take(5)
1
2
3
4
5
=> nil
```

ふーんという感じでしょうか。
デザインとかわからないけどスマホアプリ作ってみた

プライベートでAndroidアプリを作って公開してみたくなりました。

実装の仕方はなんとかなったんですが、どうにもならなかったので**デザイン**です。デザインの知識も経験もまったくない。

ニガテなことは、人の力を借りよう！


ネットのチカラを借りてなんとかリリースまでこぎつけたので、役に立ったサイトをまとめました。できる限りWebサービスでやってます。

## 配色

配色は難しいですねー
とりあえず[material design palette](https://www.materialpalette.com/)でキーになる２色を選んでみましょう。細々とした配色設定をいいかんじに作ってくれます。
![1.MaterialDesignColorPaletteGenerator.png](https://qiita-image-store.s3.amazonaws.com/0/113146/de10147d-2748-04b6-8a06-c846aaa0816f.png)

## アイコン

アイコンは難しいですねー
自分でアイコン描くのは早々にあきらめました。

フリー素材を使わせてもらいましょう。例えば[ICOOON MONO](http://icooon-mono.com/)でSVGアイコンをダウンロードします。

![2.icooonmono.png](https://qiita-image-store.s3.amazonaws.com/0/113146/49c55ac2-c30d-4234-5976-eeaab21725bc.png)


これを[Launcher icon generator](https://romannurik.github.io/AndroidAssetStudio/icons-launcher.html)でAndroidアプリ用のアイコンに加工します。アプリには様々なサイズのアイコンが必要なのですが、こちらのサイトで一気に作ってくれます。
![3.Launchericon.png](https://qiita-image-store.s3.amazonaws.com/0/113146/a1e8fa25-c461-c340-28db-f8320ecb65d5.png)

## ヘッダー画像

ヘッダー画像は難しいですねー
作ったAndroidアプリを公開しよう、となると、GooglePlayでアプリの説明を作る必要があります。その中の必須入力項目に「ヘッダー画像」があるんです。スマホでGooglePlay開いたときなんかに表示される画像なんですが、次の制約があります。
　横 1,024 x 縦 500
　JPG または 24 ビット PNG（アルファなし）

とりあえず[Canva](https://www.canva.com/)などのテンプレートでTwitterヘッダーを作って、サイズを調整してみましょう。
![4.Canva.png](https://qiita-image-store.s3.amazonaws.com/0/113146/0e05aba3-9d85-c1d9-30fe-9304e3f24489.png)

## まとめ

これでデザイン知識ゼロから初めて、アプリ作成からGooglePlayでの公開まで一通り出来ました。各種サイトに感謝です。他にもいいサイトをご存知でしたら、ぜひコメント欄で教えてください。
Google Colaboratoryの90分セッション切れ対策【自動接続】

#はじめに
対話型でPythonやDeep Learningのコードが実行可能なJupyter notebook環境を、即座にブラウザ上で利用できるGoogle Colaboratory。個人でGPUマシンを調達するハードルが高かったので非常に重宝しています。しかし、90分目を離すと実行が振り出しに戻ってしまい、萎えぽよな気持ちになることが何度かあったので本記事で対策方法を共有します。

#12時間&90分ルール

Google Colaboratoryでは以下の条件を満たす場合、実行中のプログラムがあってもインスタンスの状態がすべてリセットされていまいます。

* 【12時間ルール】新しいインスタンスを起動してから**12時間経過**
* 【90分ルール】ノートブックのセッションが切れてから**90分経過**

1つ目の12時間ルールについては、学習データや中間生成物をGoogle Driveに退避させることで学習を継続することができます。多くの記事でGoogle Driveとの連携は紹介されており、私も連携して利用する事が多いです。以下の記事でGoogle Driveの連携について言及しています。

> 　[ Google ColaboratoryでLINEスタンプ画像生成に挑戦！](https://qiita.com/ku_don/items/01c3abccd4b132865686)

2つ目の90分ルールの対策について、本記事で取り扱います。ノートブックのセッションが切れて90分経過すると、書いたコードは残ってはいるものの、また環境準備の一連の流れをやり直す必要があります。




#90分ルール対策

ノートブックを定期的にアクティブな状態にすることで、インストールしたツールや中間生成ファイルを最大12時間は継続利用することができます。アイドル状態が続くとノートブックの接続が切れますが、ノートブックの画面右上の"再接続"ボタンから再接続すれば、アイドル状態を解除できます。対策は至ってシンプル。1時間おきにノートブックをリロードするだけ！2つの方法を紹介します。

* 方法1：スクリプトの作成
* 方法2：ブラウザのアドオンを利用

方法1のスクリプトも超簡単ですが、それも面倒くさいという人はブラウザのアドオンを使えば一発です。

##方法1：スクリプトの作成
定期的にノートブックをブラウザのタブで開いてスクロールすれば問題ありませんが、寝てる間に学習を実行したいですよね。そこで、1時間おきにノートブックにアクセスするスクリプトを書きました。（恐ろしくシンプルなコードですが…）Mac環境であれば```open```コマンドで開いたURLが自動的にリロードされるので、とても簡単に実行可能です。


自分のノートブックのURL(```https://colab.research.google.com/drive〜```)を記載するだけで利用できます。

```bash:access_colab.sh
#!/bin/bash

for i in `seq 0 12`
do
  echo "[$i]" ` date '+%y/%m/%d %H:%M:%S'` "connected."
  open <<自分のノートブックのURL>>
  sleep 3600
done
```

スクリプトファイル"access_colab.sh"を作成し、初期設定で実行権限がない場合は```chmod```で権限の変更をします。

```config:権限設定
$chmod 755 access_colab.sh
```

実行すると勝手に1時間おきにページにアクセスしてくれます。

```config:実行画面
$ ./access_colab.sh
[0] 18/07/21 18:37:00 connected.
[1] 18/07/21 19:37:00 connected.
:    :
[12] 18/07/22 06:37:00 connected.
```

ノートブックの接続がタイムアウトすると、右上のステータス表示が「再接続」に変わります。上記のスクリプトを実行すると、1時間おきにノートブックにアクセスして「接続中」ステータスに変わります。

![スクリーンショット 2018-07-22 21.22.20.jpg](https://qiita-image-store.s3.amazonaws.com/0/113129/5b536081-6e6d-4100-5e55-f7228fd452e8.jpeg)


###注意点
* パソコンは自動スリープしない設定にすること

##方法2：ブラウザのアドオンを利用
90分対策の他の方法として、ブラウザのアドオンで自動リロードしてくれるツールをインストールすれば簡単に回避することができます。私は、自宅の環境ではラズパイが常時電源オンなので、Chromiumブラウザのアドオンを入れて定期的にリロードする設定にして放置することが多いです。

* Chromium、Google Chromeなどで利用可能なアドオン： [Auto Refresh](https://chrome.google.com/webstore/detail/auto-refresh/ifooldnmmcmlbdennkpdnlnbgbmfalko)

![スクリーンショット 2018-07-23 2.31.21.jpg](https://qiita-image-store.s3.amazonaws.com/0/113129/07f2bfc9-02cf-3533-5136-a38b08936615.jpeg)

右上のアイコンに、経過時間や色が表示されるのでカウントもわかりやすいです。

###注意点
* メニュー上で「ランタイム」→「ランタイムのタイプを変更」にて「このノートブックを保存する際にコードセルの出力を除外する」にチェックをいれる
* リロードの実行の1回目だけ、再読込み実行時に確認のウィンドウが出るので「再読み込み」ボタンを押す

 ![スクリーンショット 2018-07-23 2.23.54.jpg](https://qiita-image-store.s3.amazonaws.com/0/113129/b412e950-15b1-ebf3-91dc-ece96b8762c0.jpeg)



#まとめ
90分問題には地味に苦しめられていましたが、ちょっとした工夫ですぐ解決することができました。非常に簡素ですが、同じくGoogle Colaboratoryのセッション切れが煩わしいと感じている人にはおすすめです。
ぜひ、お試しあれ！

以上
pandasを使ってcsvファイルを整形

# 目的
データ分析のため、日付と株価の４本値が記載されたcsvファイルを整形する。
方針としては
①TA-Libを使用してテクニカル指標を列に追加する
②日付を引数とし、過去分の4本値・テクニカル指標を列に追加する

# 1.TA-Libを使用してテクニカル指標を列に追加する
今回使用するcsvファイルは下記の通り

```
日付け、終値、始値、高値、安値
2018年6月20日、23,280.00,23,140.00,23,400.00,22970.00
2018年6月19日、23,100.00,23,390.00,23,430.00,23080.00
…
```

## TA-Libとは
金融に関する分析指標を算出するライブラリ。今回はTA-Libを使って60日移動平均を算出する。

##関数の実装
dfはpandasのread_csvで読み込んだ結果とします

```
import talib
import numpy as np

def getTALib(df):
    #dfからカラム毎にデータを抽出
    #日付はstring、数値はfloat
    date =df['日付け'].str.replace('(年|月|日)','' )
    open = np.array(df['始値'].str.replace('(,|\.0)', '').astype(np.float))
    close = np.array(df['終値'].str.replace('(,|\.0)', '').astype(np.float))
    high = np.array(df['高値'].str.replace('(,|\.0)', '').astype(np.float))
    low = np.array(df['安値'].str.replace('(,|\.0)', '').astype(np.float))

    #表示データを指定
　　#outputにデータ、colsに列名を指定

    #4本値
    output = date.copy()
    cols = ['date']
    output = np.c_[output, open]
    cols += ['open']
    output = np.c_[output, close]
    cols += ['close']
    output = np.c_[output, high]
    cols += ['high']
    output = np.c_[output, low]
    cols += ['low']
    output = np.c_[output, talib.SMA(open, timeperiod=60)]

    #60日移動平均
　　#TA-LibのSMAを使用して移動平均を取得。
　　#第一引数で計算するデータ、第二引数のtimeperiodで何日間の移動平均を計算するかを指定
    cols += ['SMA60_open']
    output = np.c_[output, talib.SMA(close, timeperiod=60)]
    cols += ['SMA60_close']
    output = np.c_[output, talib.SMA(high, timeperiod=60)]
    cols += ['SMA60_high']
    output = np.c_[output, talib.SMA(low, timeperiod=60)]
    cols += ['SMA60_low']
    data = pd.DataFrame(output,columns=cols)
    
    #日付をdate型に変換
    data['date'] = pd.to_datetime(data['date'])
    
    return data
```

# 2.過去分のデータを右列に追加
見出しだけだと何のこっちゃという感じでしょうが、先ほどと同様に右側に列を追加していきます。
今回追加するデータは過去の4本値、テクニカル指標(60日移動平均)です。
例えば引数で"1"を指定すれば前営業日のデータが足され、"2"を指定すると、前営業日と前々営業日のデータが足されるイメージ。
ヘッダーは以下のようになります。
日付、その日の４本値、その日までの移動平均、前営業の４本値、前営業日までの移動平均、前々営業日の４本値、前々営業日までの移動平均…

## 関数の実装
引数のdataFrameは先ほどの関数の戻り値、daysには整数を指定します

```
import talib
import pandas as pd

def merge_past_datas(dataFrame,days):
    
    #戻り値用のDataFrame
    result = dataFrame
    
    for i in range(1,days+1):
        temp_data = dataFrame[i:]
        #列名を一括置換(元のカラム名 - 遡った日数)
        #マージのため、indexをリセット
        edit_data = temp_data.rename(columns=lambda a: a + '-' + str(i) ).reset_index()
        #過去データを右列に追加
        edit_data = pd.concat([result,edit_data],axis=1,sort=False)
        
        #indexと日付のデータは不要なので削除
        dropcol=["date-" + str(i)]
        if i>= 2:
            dropcol.append("index")
            
        result = edit_data.drop(dropcol, axis=1)
        
    return result
```
for文の中

- 追加するデータを取り出し、カラム名を変更。前日の始値なら"open-1"
- 元のDataFrameとマージする際に、indexで紐づけるため、indexをリセットする 
- マージするとindexが生成されてしまうので削除する。また、日付も追加する必要がないので削除

## 感想
- TA-Libに関してはまとめてあるサイト等が少なく、あまり知見が得られていない状態です。移動平均以外にも何か追加していく予定
- コードも雑ですが今後精査していく予定。for文は使いたくない…
- pandasに慣れたい…
- データ分析をするにしても、このようなデータ前処理にかなりコストがかかるようです。すんなりできると活躍の場が広がりそうです。
Linuxでスクリーンショットを撮るならHeadless Chromeで決まり！

#はじめに

[君の鯖は。](https://kimisaba.cloudremix.net/)では、ウェブサイトのスクリーンショットを撮影しています。
環境はPHP +α なんですが、これが結構むずいです。

[PHP PhantomJS](http://jonnnnyw.github.io/php-phantomjs/)だったり、[wkhtmltoimage](https://wkhtmltopdf.org/)だったりを使ってきましたが、どうしてもレイアウト崩れが発生します。

最近？インフラをVPSに移行したので、**Headless Chrome**を試したら感動しました。

#Headless Chrome
直訳すると**頭のない**とか、**首を切られた**とか不穏な単語が並びますが、
すごく簡単にいうとGUIがない、コマンドから使えるGoogle Chromeです。

GUIがないだけで、JavaScriptやレタリングは完璧で、スクリーンショット撮影にはもってこいです。（本来は自動テスト用）

`--print-to-pdf`を使えばPDFを取得することもできます。



```:使用例
google-chrome\
 --headless\
 --screenshot\
 --window-size=1280,1000\
 https://qiita.com/
```

![alt](https://qiita-image.cloudremix.net/Chrome-headless-Screenshot.png)

#インストール方法
[こちらを](https://qiita.com/shadowhat/items/af6b973df43d75abfe8e)を参考に

リポジトリを用意して

```
vi /etc/yum.repos.d/google.chrome.repo

[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
```

`yum`からインストールします。

```
yum update
yum install google-chrome-stable
```

エイリアスはお好みで

```
alias chrome="google-chrome"
```

ちなみに、公式ブログでは`chrome-canary`をインストールするよう書かれていますが、`Stable`で問題ありません
[https://developers.google.com/web/updates/2017/04/headless-chrome?hl=ja](https://developers.google.com/web/updates/2017/04/headless-chrome?hl=ja)

#使い方
公式ブログを参考に

```:エイリアスあり
chrome --headless --screenshot https://qiita.com/
```

```:エイリアスなし
google-chrome --headless --screenshot https://qiita.com/
```

でカレントディレクトリにスクリーンショット（screenshot.png）が出力されます。

下記のようなエラーがでる場合は

```
Fontconfig warning: "/etc/fonts/fonts.conf", line 146: blank doesn't take any effect anymore. please remove it from your fonts.conf
```

`/etc/fonts/fonts.conf`を開いて、86行目`<blank>`と146行目`</blank>`を消します。

["Fontconfig warning: line 146: blank doesn't take any effect anymore. please remove it from your fonts.conf" というエラーがRictyを入れ直したときに出たのでその対処法 - Qiita](https://qiita.com/y-temp4/items/f4841be65f9f4d34e08a)

#オプション

オプションとして[起動オプション](http://chrome.half-moon.org/43.html)が使えます。

スクリーンショット関連だと、

```:ファイル名指定
google-chrome\
 --headless\
 --screenshot="/temp/top.png"\
 https://qiita.com/
```

```:サイズ指定
google-chrome\
 --headless\
 --screenshot\
 --window-size=1280,1080\
 https://qiita.com/
```

```:証明書エラーを許容
google-chrome\
 --headless\
 --screenshot\
 --ignore-certificate-errors
 https://qiita.com/
```

```:ユーザーエージェント指定
google-chrome\
 --headless\
 --screenshot\
  --user-agent="Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv 11.0) like Gecko"\
 https://qiita.com/
```

```:言語指定
google-chrome\
 --headless\
 --screenshot\
 --lang=ja\
 https://qiita.com/
```

```:JavaScript無効
google-chrome\
 --headless\
 --screenshot\
 --disable-javascript
 https://qiita.com/
```
Zabbixでヒストリデータがあるはずなのにitem.get APIでデータが取れなくなった話

# はじめに

業務でZabbixから監視itemのデータを元に何か動作させるプログラムを開発していたのですが、
ヒストリデータはあるはずがなぜか監視データが取れなくなったので調査した話です。
これで数時間失ったので記事として記録に残します。ダレカノヤクニタテバ嬉しいです。
zabbixは3.0系です。　

# どういうことが起こったか

Zabbix api(item.get)で、とある監視データのlastvalueを取得。
監視hostを無効化したあと、しばらく取得し続けるとヒストリデータが7日の設定であるはずが、
1日後に取得できなくなりました（lastvalueの値が0となりました）。

# 先に結論

結果から、、`ZBX_HISTORY_PERIOD`設定しましょう。
Zabbix api(item.get)の[lastvalue](http://www.zabbix.jp/node/3888)に上記パラメータがあり、これが悪さをしていた。
[設定方法は　defines.inc.php](https://www.zabbix.com/documentation/3.0/manual/web_interface/definitions)　というphpファイルに直書きするようです。

# 調査

## 取得監視itemの設定とその取得方法

* 取得監視itemの設定

| 設定名 | 値 |
----|---- 
| item名 | `system.cpu.util[,idle]` |
| ヒストリ | ７d |
| トレンド | 365d |
| ステータス | Enabled |

↑ この設定から最低でも７日間はデータを取得できるはずです(でもできない)。

* 取得方法
  * Zabbix api `item.get` で lastvalueを見て監視itemデータを取得
  * 監視しているhostの監視状態を有効化から無効化に切り替え
  * 監視しているhostをシャットダウン
  * ちょうど1日間 監視itemデータ(lastvalue)をapiで取得し続ける

具体的には以下のような感じ

* 取得方法詳細  

```
curl -sS -X POST http://<zabbix_host>/api_jsonrpc.php \
    -H 'Content-Type: application/json-rpc' -d '
{
    "jsonrpc": "2.0",
    "method": "item.get",
    "params": {
        "output": ["key_", "lastvalue"],
        "hostids": "<監視するhostid>",
        "search": {
            "key_": "system.cpu.util[,idle]"
        },
        "sortfield": "name"
    },
    "auth": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "id": 1
}'
```

* 1日流し続けた結果
  
```
{
    "id": 1,
    "jsonrpc": "2.0",
    "result": [
        {
            "itemid": "23689",
            "key_": "system.cpu.util[,idle]",
            "lastvalue": "98.3248"        ← とれてる
        }
    ]
}

:

{
    "id": 1,
    "jsonrpc": "2.0",
    "result": [
        {
            "itemid": "23689",
            "key_": "system.cpu.util[,idle]",
            "lastvalue": "98.3248"        ← とれてる
        }
    ]
}

： 監視host無効化してから1日経過

{
    "id": 1,
    "jsonrpc": "2.0",
    "result": [
        {
            "itemid": "23689",
            "key_": "system.cpu.util[,idle]",
            "lastvalue": "0"        ← ここで急に0になる
        }
    ]
}

{
    "id": 1,
    "jsonrpc": "2.0",
    "result": [
        {
            "itemid": "23689",
            "key_": "system.cpu.util[,idle]",
            "lastvalue": "0"        ← 以降0になる
        }
    ]
}
```

以下が被疑所となりました。

* ヒストリデータの設定が7dだがZabbix内の何かの設定で上書きされている
* 監視hostを無効化した場合、ヒストリ以外の他の設定でデータを残す期間が決まっている
* housekeepingがヒストリデータを削除している(可能性低)  

と調べ続けたのですが、1日後、というキーワードに引っかからず、どれも外れ。違いました。

そもそもzabbix api [item.get](https://www.zabbix.com/documentation/3.0/manual/api/reference/item/get)で実は1日間しかデータを参照してくれないのでは?と疑問に思い、apiの仕様を調査して見ました。
apiのI/Fでは特に取得範囲を設定するような箇所がなかったため、ダメ元でitem.getで取得している[lastvalueについて調べてみる](http://www.zabbix.jp/node/3888)とどうも`ZBX_HISTORY_PERIOD`という設定値に従うことが分かりました。。
ここにたどり着くのにどれだけ時間のかかったことか。

[設定方法は　defines.inc.php](https://www.zabbix.com/documentation/3.0/manual/web_interface/definitions)　というphpファイルに直書きです。こんな分かりにくい所に設定があるなんて・・・itemのヒストリ設定はapiによっても設定が多岐に渡るようです
これを設定して item.getで lastvalueを 1d以上 取得することができました。

以上
Dockerでカンタン開発環境作成

# 新しい言語の実行環境が欲しい
例えばGolang
**でも、もうマシンにインストールするウンザリはやめたい。**

# ディレクトリ構成

```
.
├── Dockerfile
├── docker-compose.yml
└── src
```

src配下にソースコードを置く。**ホスト側のエディタから編集⇒docker側で実行**という流れ。
ここで紹介する内容だけならDockerfileだけでも十分だと思いますが、後の拡張性のためにdocker-compose.ymlも使うようにしてます。

# Dockerfile

```Dockerfile:Dockerfile
#利用するのイメージ
FROM golang:1.8
```

# docker-compose.yml

```yml:docker-compose.yml
golang:
  build: .
  volumes:
    - ./src:/home/src
  tty: true
```

あとは`docker-compose up -d`で立ち上げた後に`docker-compose exec golang /bin/bash`でdocker内に入ればOK

# 他の言語でも
DockerfileのFROMを変更したらどんな言語でも実行環境つくれる。楽ちん。
`docker <言語名>`とかで検索するとDockerHubで公式イメージがある(と思う)のでそれ使えばなんでもいける。
Laravel5.5 データ一覧表示と登録まで

eloquentで実装してみました。


```\resources\views\article\index.blade.php
<form method="POST" action="/article">
    {{ csrf_field() }} <!-- セキュリティ上必要 -->
    title<input type="text" name="title"><br><br>
    body<input type="text" name="body">
    <input type="submit" value="投稿">
</form>
<br><br>
<!-- 一覧 -->
@foreach($articles as $article)
    {{$article->title}}<br>
    {{$article->body}}<br><br>
@endforeach
```

```\app\Http\Controllers\ArticleController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Article;

class ArticleController extends Controller
{
    public function index()
    {
    	// データベースから全データを取得
        $article = Article::all();
        // viewにデータを渡す
        return view('article.index', ['articles' => $article]);
    }

    public function post (Request $request)
    {
    	// インスタンスを作成
        $article = new Article;
        // 格納するデータを代入
        $article->user_id = '1';
        
        // post送信されたデータを代入
        $article->title = $request->input('title');
        $article->body = $request->input('body');
        // データを保存
        $article->save();

        // 終わったらリダイレクトする
        return redirect()->to('/article');
        
    }
}
```
ユーザー作成から秘密鍵を使ってsshでログインするまで

# 環境
**サーバー側OS**:CentOS Linux release 7.5.1804 (Core) 
**クライアント側OS**: macOS High Sierra 10.13.6

# 実施手順
上から順に

## 秘密鍵と公開鍵のペアを生成する
### **クライアント側の作業**
* 鍵の生成

```
ssh-keygen
```

## ユーザー追加　〜　.sshフォルダ権限変更まで
### **サーバー側の作業**
* ユーザー追加

```
useradd <ユーザー名>
```

* .sshフォルダ作成

```
mkdir /home/<ユーザー名>/.ssh
```

* .sshフォルダのパーミッション変更

```
chmod 700 /home/<ユーザー名>/.ssh
```

`700`は.sshフォルダの所有者のみ読み書き可、実行権限有りの意味

* .sshフォルダの所有者、グループの変更

```
chown <ユーザー名> /home/<ユーザー名>/.ssh
chgrp <ユーザー名> /home/<ユーザー名>/.ssh
```

所有者、グループを追加したユーザーにする必要がある

## 公開鍵の送信

### **クライアント側の作業**

* 公開鍵をサーバーへ送信

```
scp <公開鍵のパス> <サーバーのIPアドレス>:/home/<ユーザー名>/.ssh/authorized_keys
```

ファイル名を**authorized_keys**にする必要がある

## 公開鍵の権限関連
### **サーバー側の作業**
* 公開鍵の権限関連

```
chmod 600 /home/<ユーザー名>/.ssh/authorized_keys
chown <ユーザー名> /home/<ユーザー名>/.ssh/authorized_keys
chgrp <ユーザー名> /home/<ユーザー名>/.ssh/authorized_keys
```

`600`は.authorized_keysの所有者のみ読み書き可の意味

## sshで接続
```
ssh <ユーザー名>@<サーバーのIPアドレス>
```

ssh-keygenで鍵作成するとデフォルトで使う秘密鍵に設定してくれるっぽい。
-iオプションを使えば明示的に秘密鍵を指定することも可。

以上。
Rubyの正規表現の覚書

Ruby技術者認定試験Silver取得のため勉強にあたり、私が知らなかった内容をまとめます。
参考書は[Ruby技術者認定試験合格教本](https://www.amazon.co.jp/%E6%94%B9%E8%A8%822%E7%89%88-Ruby%E6%8A%80%E8%A1%93%E8%80%85%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93%E5%90%88%E6%A0%BC%E6%95%99%E6%9C%AC-Silver-Gold%E5%AF%BE%E5%BF%9C-Ruby%E5%85%AC%E5%BC%8F%E8%B3%87%E6%A0%BC%E6%95%99%E7%A7%91%E6%9B%B8/dp/4774191949)です。

## 演算
- `"`のかわりに`/`を使う
- マッチしているかは`===`を使う

```ruby
/Ruby/ === "Ruby on Rails" #=> true
```
- マッチした箇所を取得するには`=~`を使う

```ruby
"Ruby on Rails" =~ /Rails/ #=> 8
```
- マッチした結果は組み込み変数`$&`で取得できる

```ruby
$& #=>  Rails"
```

## 基本の表現方法
- 行頭は`^`
- 行末は`$`
- 改行を除く任意の一文字は`.`
- or条件的なのは`[]`で囲む
  - 中の文字どれか一つが条件になる

```ruby
"Rails" =~ /[ao]/ #=> 1
```
- `-`で文字の範囲を表現できる
  - 例えば、`[1-5]`は1~5どれか

```ruby
"Rails is no 1 !!!" =~ /[0-9]/ #=> 12
```

```ruby
"ok google" =~ /[a-i]/ #=> 3
```

## 繰り返し
- `*`は直前の文字を0回以上繰り返す
- `+`は直前の文字を1回以上繰り返す
- `()`はパターンのグループ化

```ruby
/(hoge)+/ === "hogehogehoge" #=> true
```
Anaconda愛用者へ．qtconsoleのショートカットはここです

Anacondaインストール後に，スタートメニューに作成されるショートカットの中に，qtconsoleは含まれません．（2018/7/22）

そんなqcon(qtconsole)のショートカットをご所望のあなたへ．

# Explorerから探す（笑）
めちゃめちゃアナログですが，これが確実な方法だと思います．

- Explorerから「Anaconda」フォルダを見つけて入る．（Start Menuに表示される「Anaconda」ではありません．オリジナルの方です．）
- 検索ボックスに「jupyter-qtconsole」と打ちましょう．
- 検索結果の中に，アプリケーションとしての「jupyter-qtconsole」ファイルがあります．これが目的のファイルです．
- どこえなりとも，ショートカットを作ってやってください．
- ダブルクリックで，cmdとqtconsoleが起動します．（最初は起動に時間がかかります）

以上です．
え？知ってました？これは私の備忘録だからいいんです！
画像ファイルの上に文字を書く方法

#Q.画像ファイルの上に文字を書くことができるのか？

A.可能！ 例えば、下記のようにすればOK！

↓↓↓↓↓↓↓ あなたの記事の内容
```html:HTML
───────
``` html:HTML
↑↑↑↑↑↑↑ 編集リクエストの内容
<div class="cover">
 <p>画像の上に文字を置くよ！</p>
</div>
```

↓↓↓↓↓↓↓ あなたの記事の内容
```css:CSS
───────
``` css:CSS
↑↑↑↑↑↑↑ 編集リクエストの内容
.cover{
  background: url(img/bg.jpg);
  background-size: cover;
  height: 500px;
}
```

divにclassを定義して、
そのclassの中でbackground:url(パス);
としつつ、divでpを囲むとよし。

（実は、自分photoshopがいじれるので
Photoshopで写真の上に文字を追加してしまいたい気持ちにもなった。

とはいえ、例えば、ユーザが投稿したアイコンに名前を上に表示する場合などを考えると、Photoshopという手段は使えないから、こういうのは知っておくといいよね！）

#最後に
最後まで読んでいただいてありがとうございました！
Twitterをフォローして応援してもらえると、もっと書く気になります！＼(^o^)／
https://twitter.com/pocket_ma_kun
続：OpenShift Origin MinishiftをCentOS7にインストールしてみた

前回、CentOS7へのminishiftのインストールを挑戦しましたが、うまくいかなかったので、リトライしてみました。

# 1.事前準備
今回は下記のようなマシンで検証しています。
環境の際は各自で確認して下さい。
なお、minishiftのマニュアルでは手動でlibvirtやqemu-kvmなどのパッケージをインストールする手順ですが、面倒なので、OSインストール時にインストールパッケージを選択する事で、省略しています。

- CentOS7をセットアップ
  - バージョン : CentOS-7-x86_64-DVD-1804.isoを利用
  - インストールパッケージ : 「サーバ(GUI使用)」+「開発ツール」+「仮想化ハイパーバイザー」を選択


- minishiftのダウンロード
  - ダウンロードURL : https://github.com/minishift/minishift
  - バージョン : v1.21.0

# 2.インストール
### 1. 仮想環境の準備

1. KVM Driverのセットアップ

        # sudo curl -L https://github.com/dhiltgen/docker-machine-kvm/releases/download/v0.7.0/docker-machine-driver-kvm -o /usr/local/bin/docker-machine-driver-kvm
        # sudo chmod +x /usr/local/bin/docker-machine-driver-kvm

2. libvirtのセットアップ

        # sudo usermod -a -G libvirt <username>
        # sudo newgrp libvirt

### 2. minishiftをインストール
1. バイナリの配置
    ダウンロードしたminishiftを/usr/local/binに配置します。
    場所は特に何処でも良いみたいですが、既にPATHが通っているところが便利です。
    独自の場所(例:/optなど)に配置する際は、自分でPATHを通す必要があります。

        # sudo mv minishift-1.21.0-linux-amd64 /usr/local/bin
        # sudo chown -R root:root /usr/local/bin/minishift-1.21.0-linux-amd64

    簡単に使うためにちょっと一工夫します。

        # cd /usr/local/bin
        # sudo ln -s ./minishift-1.21.0-linux-amd64/minishift minishift

2. minishiftの起動
    初回の実行では必要なパッケージ群をダウンロードします。
 
        # minishift start --iso-url centos

と、ここまでは順調だったのですが、起動時にVMが起動しないトラブルが発生しました。
いろいろ調査した結論としては...

「Virtualboxは仮想環境の入れ子をサポートしない為、minishiftの内部で起動するKVMが使えない」

という事になりました。
思わぬ盲点でした。
皆様もVirttualboxで検証する際はKVMは使えないと頭の片隅に入れておきましょう。

### 2018.7.24 追記
VMware Playerで検証したところ、同じ手順でminishiftが起動しました。
手順としては問題無いようです。
visual studio code で、実践的に正規表現つかってみる


visual studio code で正規表現を使うのは下記を参考にしてしてください。

[Visual Studio Codeを用いた簡単な正規表現検索](https://qiita.com/kgsi/items/a88662c6e43fa5311288)

ここでは、実践的なところのみ説明します。

（事例）同じ会社でもいろいろ表記があって名寄せをする必要があります。
そのときに正規表現つかうと検索、置換ができて便利です。
サンプルので、データは下記のように、コード番号、会社名になっています。コード番号は、
単純化のために、001 にしてあります。

```
001,株式会社日本貿易
001,株式会社日本貿易 
001,株式会社 日本貿易
001,株式会社　日本貿易
001,日本貿易株式会社
001,日本貿易㏍.
001,ｶﾌﾞｼｷｶｲｼｬﾆﾎﾝﾎﾞｳｴｷ
001,㈱日本貿易
001,カ）ニホンボウエキ
001,ｶ)ﾆﾎﾝﾎﾞｳｴｷ
```

正しいのは、
001,株式会社日本貿易　だとします。

株式会社日本貿易だと思われるデータを見つけて、株式会社日本貿易に置換していきます。

- まずは、検索です。
- 最初の 001,株式会社日本貿易 を探します。次の正規表現を入れると一件だけでてきます。

```
^\d+,株式会社日本貿易$
``` 
- 正規表現の説明です。
  - ^ は、行の最初という意味です。
  - \d+ は数字（\dが数字の意味）が１つ以上(+がその意味)ならんでいるという意味です。
  - , は、カンマそのものです。
  -  株式会社日本貿易 もそのままです。
  -  最後の$ は、行の最後です。

- 2行目は、1行目とそっくりですが、ひっかかりません。
- それは、最後に空白があるからです。下記にするとひっかかります。
 -  
```
^\d+,株式会社日本貿易 $
``` 
- ３，４行目は、株式会社と日本貿易の間に、半角、全角の空白がはいっています。
 - 下記の正規表現をいれると、4件でてきます。

```
^\d+,株式会社.*日本貿易.*$
```
- 正規表現の説明です。
 - .* は、なんかの文字(.がなんかの文字の意味)がはいっているかはいっていなくてもよし（\*がその意味、+は一文字はかならずないといけません。\d\* は数字なしでもいいですが、\d+は数字がなんかはいっていないとだめです。* と + 似ていますが、違うのです。）
 
- では、置換しましょう。001,株式会社日本貿易に置換では、つまらないので、下記のようにします。かっこで囲みます。1行名が、検索で、2行目が置換です。

```
^(\d+),(株式会社).*(日本貿易).*$
$1,$2$3
```
- 正規表現の説明です。
 - ()で囲んだ部分は、置換のところで、順に、置換で、$1 $2 $3 と使えます。

実際に置換してみましょう。結構面白いのではないでしょうか？
RailsのRoutingネストについて

# RailsのRoutingのネストについて、整理してみた。　
そもそものお話。
RailsにおけるルーティングとはViewで受け取ったURLを認識してコントローラ内に定義したアクション（メソッド）に割り当てる働きをするものです。

Railsのルーティングはconfig/routes.rbで設定します

```config/routes.rb
>>Rails.application.routes.draw do
get 'URL'　　　=>　コントローラー名＃メソッド　　　　
なんちゃら
なんちゃら
end
```

こんな感じのやつです。

アプリケーションでどういう風に設定されているかは下記のコマンドをTerminalで叩いて確認します。

```rake routes```

or

```bundle exec rake routes```


##resouce/resourcesとかいうやつ
アプリケーション開発していくとRoutingの記述がかなり増えてきて、とても見辛くなってしまいます。
そこでresourcesの登場です。

routingにて特定のコントローラーに対してresoucesを記述することによりindex、create、new、edit、show、update、destroyの標準的な機能を想定したルーティングを設定してくれます。

```config/routes.rb
>>Rails.application.routes.draw do
　resources :review
end
```

上記のように記述するとこんな感じでルーティングを設定してくれます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134077/69585fa4-163b-d11f-a5aa-e3c167bd865c.png)


##Routingをネストさせる

さてここで本題です。
今、アニメのレビューサイトを作ろうとしていて、1つのアニメに対してたくさんのレビューがあるとします。もし、一つ一つのレビューのURLを特定の規則に則って振り分ける場合、サイトのURLはおそらく「https://×××××××/anime/id/review/id」とかになるはずです。

こんな時にRoutingをネストさせます。

ネストの書き方

```config/routes.rb
Rails.application.routes.draw do
　resources :anime do
　resources :review
　end
end
```
このようにRoutingをネストさせるとどうなったかrake routesで確認してみます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/134077/c34da4da-2471-6f2c-5404-69adaf5f669c.png)

ネストさせたことによりanime/:anime_id/reviewとなったことが確認できると思います。
また、ネストさせることによってconfig/route.rbの記述量を減らすことができ、ルールにしたがってURLを振ることができます。


##「resources」と「resource」の違いについて
複数形と単数形の複数系がありますが、これは単純に対象のオブジェクトが複数あるか単数なのか違いです。

具体的にいうと、、、
例えば地球は一つしかありません。でも地球の中には国がいっぱいあるとした時。
こんな感じでroutingが書けます。

```config/routes.rb
Rails.application.routes.draw do
resource :earth do
　　resources :country
　end
end
```
すると

![image.png](https://qiita-image-store.s3.amazonaws.com/0/134077/8d408bf8-a06b-eae7-8622-5cb02c19022c.png)

こんな感じになります。

先ほどとの違いは、地球は１つしかないのでidを振られていません。逆にanimeは複数あったのでidが振られていました。
ただもし、宇宙の中に惑星がたくさんあって地球はそのうちの一つみたいな考え方をする場合はidを振らなければいけなさそうなのでresourcesと書くのが適切になりそうです。

という感じで整理すればいいと思います。

##ネストは一回までにしましょう。
ルーティングのネストは実際は一階層以上させることはできますが、複雑になり扱いづらくなるため推奨されていないようです。



参照
・　https://techracho.bpsinc.jp/baba/2014_03_03/15619
・　https://railsguides.jp/routing.html
Vue Routerのrouterではまった

#はじめに
初めまして@chan_kakuです。
最近Vueを使い始めて、あることがきっかけでVue Routerを使い始めました。
その時に、自分がはまったことを皆さんに共有したいと思います。
#Vue Routerとは？
そもそもVue Routerとは？という人のために簡単に紹介したいと思います。
詳しくはここをチェック
[Vue Router](https://router.vuejs.org/ja/)
簡単に説明するとSPAを手軽に作れる優れものです笑

#どうやって遷移するのか
そもそもSPAはページの更新をするときに、ページ自体を更新するのではなく、変更が必要なコンポーネントだけ更新します。
よってコンテンツごとにコンポーネントを作るため、親コンポーネントと子コンポーネントを作るのが一般的だと思います（多分）。
また、ルートを変更したいとき（ボタンを押した後の遷移など）では以下のように記述することでルートの変更ができます。

```html:index.vue
<router-link to="home"></router-link>
```

これをスクリプトでかくと、

```js:index.vue
router.push('home');
```

のようになります。
これらは、別のルートに遷移する際はあまり考慮しなくてもいいのですが、同じルートに遷移したい(更新など)時などは注意しなければなりません。

#どこで詰まったのか
ようやく本題です笑
Vue Routerのどこで詰まったかと言いますと、上で記載したrouterで同じルートにpushもしくはreplaceした時に詰まりました。
子コンポーネントからrouter.pushした時に別のルートだと問題なく発火するようなのですが、SPAなので、おなじルートにrouter.push(replace)したい場面が出てきました。
そんな時、私は今まで通り子コンポーネントからrouter.pushを行なっていました。
しかしながら、このpushが任意のタイミングで発火してくれず、画面が遷移しない状況に陥りました。
なぜかわからなかった私は、色々調べてみましたがあまり良い記事が見つからず途方に暮れていました。。。。
そんな時ふと思いついたのが、pushする時に、データを子コンポーネントからemitした後、親コンポーネントでpushすればいいのではないかと。
これは、自分だけの考えではなく、先輩などに相談した結果ですが笑
結果として無事同じルートにpush(replace)することができました！！

#終わりに
結果として、今まで何も考えず子コンポーネントでrouter.pushを行なっていましたが、どうやら親コンポーネントで行なったほうが安全であることがわかりました。
この方法は正解ではないかもしれませんので、何かこの辺り詳しい方が居りましたらご教授していただけると幸いです。