OmniAICreator/Qiita-1.07M huggingface dataset:
【解決】ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ 

MySQLサーバーへの接続エラー「ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'」が発生した場合の対処法を紹介します。このエラーは、MySQLサーバーが正しく起動していないか、ソケットファイルが正しく設定されていない場合に発生します。以下の手順で問題を解決できます。


開発実務1年目のボクがハマった勉強中には見なかったエラーの一つ

```terminal
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
```

とかいうエラー

初めてこれにでくわした時は、解決までに3時間くらいは使ったと思います
なんせボクの開発現場ではみんなイヤホンをしているし、ボクは新人なのでエラーで相談は迷惑かなーーーと感じていたからです

いま思えば新人だからこそエラーとか質問しやすいですよねw
ホントばかだったわ泣

ボクの場合は `db:migrate` 後に//localhost:3000に接続できなくなり`Mysql2::Error::ConnectionError: Can't connect to MySQL server on '127.0.0.1' (111)`エラーが吐かれました
調べてみるとmysqlを起動できれば解決しそうだという事まで突き詰めました

### 解決策

#### サーバーのリスタート
まずはMySQLサーバーをリスタートします。

```terminal
$ mysql.server restart
```

### ソケットファイルの削除
次に、MySQLソケットファイルを削除します。

```terminal
$ sudo rm -f /var/run/mysqld/mysqld.sock
$ sudo rm -f /tmp/mysql.sock
```

### MySQLサーバーの再起動
MySQLサーバーを再起動します。

```terminal
$ sudo /etc/init.d/mysql start
```

### MySQLサーバー接続
MySQLサーバーに接続します。

```terminal
$ mysql -u root -p
```

以上の手順で接続できるようになったら、通常の開発作業に戻ります。

```terminal
$ rails db:migrate
$ rails s -b 0.0.0.0
```

初心者向け解説:

MySQL: オープンソースの関係データベース管理システム（RDBMS）で、多くのウェブアプリケーションで使用されています。
ソケットファイル: プロセス間通信のためのファイルで、データベースサーバーとクライアントの間で使用されます。
リスタート: システムやアプリケーションを再起動すること。

キーワード: MySQL, エラー2002, サーバーリスタート, ソケットファイル, データベース接続, 解決策, 初心者向け, リスタート, RDBMS, プロセス間通信
VagrantでEncoding::UndefinedConversionError発生したときは、実行環境フォルダ内の日本語名ファイルがないかをまず疑え。

久しぶりにVagrantに触りました。

Vagrantで構築しているサーバに新たなソースを追加して

```
> vagrant destroy サーバ名
```
からの

```
> vagrant up サーバ名
```

で再構築したときに途中でエラー。

```
~/HashiCorp/Vagrant/embedded/gems/2.2.2/gems/vagrant-2.2.2/lib/vagrant/util/io.rb:32:in `encode': "\x83\xE3" from Windows-31J to UTF-8 (Encoding::UndefinedConversionError)
      from ~/HashiCorp/Vagrant/embedded/gems/2.2.2/gems/vagrant-2.2.2/lib/vagrant/util/io.rb:32:in `read_until_block'
      from ~/HashiCorp/Vagrant/embedded/gems/2.2.2/gems/vagrant-2.2.2/lib/vagrant/util/subprocess.rb:194:in `block in execute'
      from ~/HashiCorp/Vagrant/embedded/gems/2.2.2/gems/vagrant-2.2.2/lib/vagrant/util/subprocess.rb:192:in `each'
      from ~/HashiCorp/Vagrant/embedded/gems/2.2.2/gems/vagrant-2.2.2/lib/vagrant/util/subprocess.rb:192:in `execute'
      from ~/HashiCorp/Vagrant/embedded/gems/2.2.2/gems/vagrant-2.2.2/lib/vagrant/util/subprocess.rb:22:in `execute'
      from ~/HashiCorp/Vagrant/embedded/gems/2.2.2/gems/vagrant-2.2.2/plugins/synced_folders/rsync/helper.rb:197:in `rsync_single'
      from ~/HashiCorp/Vagrant/embedded/gems/2.2.2/gems/vagrant-2.2.2/plugins/synced_folders/rsync/synced_folder.rb:48:in `block in enable'
      from ~/HashiCorp/Vagrant/embedded/gems/2.2.2/gems/vagrant-2.2.2/plugins/synced_folders/rsync/synced_folder.rb:47:in `each'
      from ~/HashiCorp/Vagrant/embedded/gems/2.2.2/gems/vagrant-2.2.2/plugins/synced_folders/rsync/synced_folder.rb:47:in `enable'
　　　・・・
```

Googleで検索したら、似たような事象はあるものの、コアのファイルをいぢって、みたいなものもあって、

どれが本当なんだろ(^^;

・・・と思ってたら、一緒に仕事してる人が、以前にもそのエラー見たことあるとのこと！！

そのときは、**Vagrantfile から実行しているshファイルの文字コードが違った** ことで起こったそうで、以下のように**`sed`コマンドでファイルごと改行コードを変換**させて解決したとのこと。

```
sed -i 's/\r//' シェル名.sh
```

早速 Vagrantfileの中身を確認。
それらしき箇所はあったけれど、、、このシェルの辺りはエラーになる前から何も変えていないところ。
今回はあまり関係なさそう。

なんだろう。。。
出力されたログを追っても何もなく、載せてるVirtual Boxのバージョンも他の人と変わらない。

調べているうちに、他の人が気付いた。
**Vagrantfileで起動させるフォルダ内に、日本語で書かれたファイル等があるのでは？**

あ・・・そういえば、Vagrantを初めて使ったときにも陥ってたな、それ(・▽・;)

ということで、フォルダを確認した。
あった、いつの間にか作られていた「Vagrant- ショートカット」・・・

削除して`vagrant up`を実施。

・・・無事動きました！(∩´∀｀)∩


 ﾅﾑ(-人-)ﾅﾑ
VSTUを使わずに、Unityから生成されたsln / csprojファイルをスクリプトから変更する

# やりたいこと

Unityが生成するslnファイルは、手動で外部のcsprojを足しても勝手に巻き戻されてしまいます。
そこで、スクリプトからslnファイルにcsprojを追加するようにします。

既存のやり方としてVSTUのイベントにHookさせる方法がありますが、この方法はIDEにRiderを使っている場合は利用できませんでした。

# やり方

[AssetPostprocessor](https://docs.unity3d.com/2018.3/Documentation/ScriptReference/AssetPostprocessor.html)の`OnGeneratedSlnSolution`を使います。
(ドキュメントには書いてないですが、2018.2からこのイベント関数が追加されています。）

そこで、次のようなエディタ拡張を配置すれば自動的にslnファイルにcsprojが追加されるようになります。

```cs
using UnityEditor;

public class SolutionFileFixer : AssetPostprocessor
{
    private static string OnGeneratedSlnSolution(string path, string content)
    {
        var solutionGuid = "solutionのGUID";
        var projectGuid = "projectのGUID";
        var projectName = "プロジェクト名";
        var projectPath = "csprojへのパス";
        var add =
            $"Project(\"{solutionGuid}\") = \"{projectName}\", \"{projectPath}\", \"{projectGuid}\",\"{Environment.NewLine}EndProject";

        // 最後に追加
        var newContent = content.Replace($"EndProject{Environment.NewLine}Global",
            $"EndProject{Environment.NewLine}{add}{Environment.NewLine}Global");
        return newContent;
    }

}
```

# おまけ

* [みんな大好き Boo.Lang を SATSUGAI する方法](https://speakerdeck.com/grabacr07/minnada-hao-ki-boo-dot-lang-wo-satsugai-surufang-fa)

を参考に、Boo.Langも消し去るようにしてみます。

使うものは`OnGeneratedCSProject`イベントです。

```cs
using UnityEditor;

public class SolutionFileFixer : AssetPostprocessor
{
    private static string OnGeneratedSlnSolution(string path, string content)
    {
        var solutionGuid = "solutionのGUID";
        var projectGuid = "projectのGUID";
        var projectName = "プロジェクト名";
        var projectPath = "csprojへのパス";
        var add =
            $"Project(\"{solutionGuid}\") = \"{projectName}\", \"{projectPath}\", \"{projectGuid}\",\"{Environment.NewLine}EndProject";

        // 最後に追加
        var newContent = content.Replace($"EndProject{Environment.NewLine}Global",
            $"EndProject{Environment.NewLine}{add}{Environment.NewLine}Global");
        return newContent;
    }

    private static string OnGeneratedCSProject(string path, string content)
    {
        var document = XDocument.Parse(content);
        document.Root.Descendants()
            .Where(x => x.Name.LocalName == "Reference")
            .Where(x => (string) x.Attribute("Include") == "Boo.Lang")
            .Remove();
        return document.Declaration + Environment.NewLine + document.Root;
    }
}
```
フォアグランドとバックグランドのジョブの切り替え

# はじめに
LinuxのCGIでフォアグラウンドジョブとバックグランドジョブと、ジョブを切り替えて作業をする方法についてまとめてみました。

# 環境
Ubuntu 16.04.6 LTS

# 内容

まずは、Rubyで作成してプログラム（ジョブ）を普通にフォアグランドで実行します。

```command
./test.rb
```

実行中のプログラム（ジョブ）を停止する場合は、`Ctrl + z`

ジョブが停止している事の確認を行います。

```command
jobs
[1]+  停止                  ./test.rb
```

ジョブ番号と一緒にプロセス番号も表示したい場合は、オプションを指定します。21407がプロセスIDになります。

```command
jobs -l
[1]+ 21407 停止                  ./test.rb
```

ちなみにだが、プロセスIDのみを表示する場合。

```command
ps -a
  PID TTY          TIME CMD
22625 pts/8    00:00:28 ruby
22858 pts/8    00:00:00 ps
```

停止中のジョブをフォアグランドで再開する場合は、ジョブ番号を指定して再開します。[1]がジョブ番号になります。ちなみに、`fg 1`だけでも動きます。

```command
fg %1
```

実行中のジョブを強制的に終了する場合は`Ctrl + c`。ただし、余程の事情がない限り、あまりしない方がいいと思われる。

停止中のジョブをバックグラウンドで再開する場合。

```command
bg %1
```

バックグラウンドでジョブが動いている状態で、`jobs`を打つと、確かに実行中である事が確認できます。ジョブの後ろに**&**がついている事が、バックグラウンドで動いている事の印になります。

```command
jobs
[1]+  実行中               ./test.rb &
```

**&**をつけて、最初からバックグラウンドで動かす事もできます。

```command
./test.rb &
```

バックグラウンドで動いているジョブを一時停止したい場合は、`fg %1`でフォアグランドにもってきた後に、`Ctrl + z`する事になります。


バックグラウンドで動いていようと、フォアグランドで動いていようと関係なく、実行中のジョブを強制終了する場合、`Ctrl + c`以外に、ジョブ番号を指定して終了する事もできます。

```command
kill %1
```

この後、`jobs`を打つと、終了した事が表示されます。

```command
jobs
[1]+  Terminated              ./test.rb
```

`kill`で強制終了する場合は、ジョブ番号を指定する以外に、プロセスIDを指定して強制終了させる事もできます。ジョブ番号の時は**%**を指定したが、プロセスIDの場合は付けない事になります。21407はプロセスIDです。

```command
kill 21407
```

ちなみにですが、バックグランドで動いているジョブに対し、フォアグランドでコマンドを打ちたい場合は、`Enter`を押すと、コマンドプロンプトが表示されます。

最後にだが、今、画面で動いているジョブが、フォアグランドなのか、バックグランドなのか確認したい場合は、`Enter`を押す事になる（と思われます）。`Enter`を押して、コマンドプロンプトが表示されたら、バックだし、何も反応がなければ、フォアという判断しかしようがないと（思われる）。
PhpStormでキャレットを増やして複数行を同時に編集する

PhpStormには「Add multiple carets on double ⌥ with arrow keys」という機能があり、これを使うと複数行同時編集することができます。

![2019-04-17 13.36.44.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/ad59ef0b-2bf5-bab0-9723-cc68f7baf8c6.gif)

<kbd>option⌥</kbd>を2回押して、上下矢印キーでキャレットを増殖できます。

## 設定方法

<img width="993" alt="Preferences.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/8b22b353-fee1-452b-89f2-a7a22692782f.png">

「Add multiple carets on double ⌥ with arrow keys」にチェックを入れる。

## 関連

* [知らないと｢PhpStormのライセンス料をドブに捨ててる｣も同然のショートカットキーを教えてください - Qiita](https://qiita.com/suin/items/bda682201fed0936cf95)
pyenv installでコケる(zlib)

## pyenvでpythonのバージョンを上げたい


```
$ pyenv install 3.x.x   // ここで止まる
$ pyenv global 3.x.x
```


### エラー

```
$ pyenv install 3.x.x
python-build: use openssl from homebrew
python-build: use readline from homebrew

<...>

BUILD FAILED (OS X 10.14.3 using python-build 20180424)

Inspect or clean up the working tree at /var/folders/82/wbj2z1dx1px5tgqszjg3fdt80000gn/T/python-build.20190417125321.77862
Results logged to /var/folders/82/wbj2z1dx1px5tgqszjg3fdt80000gn/T/python-build.20190417125321.77862.log

Last 10 log lines:
  File "/private/var/folders/82/wbj2z1dx1px5tgqszjg3fdt80000gn/T/python-build.20190417125321.77862/Python-3.5.1/Lib/ensurepip/__main__.py", line 4, in <module>
    ensurepip._main()
  File "/private/var/folders/82/wbj2z1dx1px5tgqszjg3fdt80000gn/T/python-build.20190417125321.77862/Python-3.5.1/Lib/ensurepip/__init__.py", line 209, in _main
    default_pip=args.default_pip,
  File "/private/var/folders/82/wbj2z1dx1px5tgqszjg3fdt80000gn/T/python-build.20190417125321.77862/Python-3.5.1/Lib/ensurepip/__init__.py", line 116, in bootstrap
    _run_pip(args + [p[0] for p in _PROJECTS], additional_paths)
  File "/private/var/folders/82/wbj2z1dx1px5tgqszjg3fdt80000gn/T/python-build.20190417125321.77862/Python-3.5.1/Lib/ensurepip/__init__.py", line 40, in _run_pip
    import pip
zipimport.ZipImportError: can't decompress data; zlib not available   👈 zlibを入れればええんか？
make: *** [install] Error 1
```


### これで解決しました

```
$ brew install zlib
$ brew install sqlite
$ export LDFLAGS="${LDFLAGS} -L/usr/local/opt/zlib/lib"
$ export CPPFLAGS="${CPPFLAGS} -I/usr/local/opt/zlib/include"
$ export LDFLAGS="${LDFLAGS} -L/usr/local/opt/sqlite/lib"
$ export CPPFLAGS="${CPPFLAGS} -I/usr/local/opt/sqlite/include"
$ export PKG_CONFIG_PATH="${PKG_CONFIG_PATH} /usr/local/opt/zlib/lib/pkgconfig"
$ export PKG_CONFIG_PATH="${PKG_CONFIG_PATH} /usr/local/opt/sqlite/lib/pkgconfig"
$ pyenv install 3.6.8
```

参考： https://github.com/jiansoung/issues-list/issues/13#issuecomment-470275744



### 他に試したこと

```
$ sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
```
-> 同様にfailed

```
$ brew install zlib
```
-> zlibだけ入れても意味がなかった
slackでのgithub subscribe コマンド全部やる

似たようなissueは立っているようです。
その中のコメントから拾っておきました。
https://github.com/integrations/slack/issues/374#issuecomment-386325109

```console
/github subscribe owner/repo issues pulls deployments statuses public commits commits:all releases comments branches reviews
```


https://github.com/integrations/slack/issues/374#issuecomment-457905350
この方は、５０００兆回ぐらい見にきてるようですね。

- [GitHub-と-Slack-を連携させる](https://slack.com/intl/ja-jp/help/articles/232289568-GitHub-%E3%81%A8-Slack-%E3%82%92%E9%80%A3%E6%90%BA%E3%81%95%E3%81%9B%E3%82%8B)
自宅Raspberry Piに外出先からポート開放せずSFTPでファイルにアクセスする方法

# はじめに
わたくしの家は色々特殊でポート開放ができず、外からRaspberryPiにアクセスすることが不可能でした。そのRaspberryPiではDiscordBOTをホストしていて、万が一BOTが落ちた時には帰宅してからの対応しかできませんでした。しかし、とある方法を利用することで外からでのアクセスもできるようになるのでご紹介します。この記事ではMacでのやり方を説明しています。

# 使うもの
- RaspberryPi
- ネットワーク環境
- Dataplicity

# 設定開始
とりあえず[Dataplicity](https://www.dataplicity.com/)にアクセスして、指示に従えばできる。

(ここから先はDataplicityの方法をそのまま書いてありますので別に読まなくても大丈夫です。)
まずはサイトを開いて①をやる。①はメールアドレスを入れるだけ。そうしたら確認メールが届くので認証する。

②はラズパイにSSHとかでアクセスしてコンソールから以下のコマンドを入力します。

```console:コンソール
curl https://www.dataplicity.com/hoex5qsx.py | sudo python 
```

# SSHの準備

今回はSFTPでSSHを利用します。
わたくしはラズパイのSSH接続設定はもともとしていたのでこのまま進みます。してない人は接続設定をしておきましょう。

次に接続用のアプリケーションをインストールします。接続用アプリケーションは[Porthole](https://github.com/wildfoundry/dataplicity-porthole-releases-osx)というアプリです。

アプリをインストールしたら起動し、真ん中の**Add new**をクリックし、設定します。
次の画面では①②③と表示が出ていると思いますが、まずは①にMacで使うローカルのポートを指定します。このポートは被ってなければどこのポートでも大丈夫です👌

続いて②でRaspberryPiの選択をし、③でアクセスしたいポート(5901 or 22)を選択します。今回はSSHを利用するので22を選択します。

*もしSSHなどのポートを変更している場合は別途課金が必要なようです。

# 接続
FTPマネージャーなどで以下のように設定します。

| 設定名 | 入力するやつ |
|:------|:------|
| ファイルプロトコル | SFTP |
| アドレス | localhost |
| ポート | Portholeで設定した①のポート |
| ユーザー名 | ラズパイのユーザー名 |
| パスワード | ユーザーのパスワード |

設定できたらPortholeアプリケーションを起動しておきます。そしてFTPアプリケーションでアクセスすれば完了です！お疲れ様でした。
Commit failed - exit code 1 receivedの対処法の忘備録

対処法をググってもパッと理解できなかったので忘備録として残しておく。

### 経緯
[laradock](https://laradock.io)を自分のレポジトリ内に`git clone`して`commit`しようとしたら
```Commit failed - exit code 1 received```
が出てしまった。

### 原因
自分のレポジトリ内部の`.git`
と
git cloneしたlaradockディレクトリ内部の`.git`
が存在すること。

- 例）自分のレポジトリrepoで、laradockをgit cloneすると
  - `repo/.git`
  - `repo/laradock/.git`
  - がrepo上に存在してしまってCommit failedが出てくる、という感じ

（だと思う）

### 対処
git cloneしたlaradockディレクトリ内部の`.git`を削除する。


### 結果
commitできるようになった。

### 懺悔

お恥ずかしいことに、git cloneではない方法で導入する方法が公式ドキュメントに載っていましたね。
[A.1) Already have a PHP project:](https://laradock.io/#A1)
プログラム初心者のためのC#入門 #7 関数

# #7 関数
今回のテーマは関数です．皆さんご存知のアレです．`y = f(x)`です．数学で言う関数は「`x`を定めると，`y`が一意的に出てくる」というもので，言い換えると「`x`という入力があって，`y`という出力がある」とも言えます．プログラムで言う関数は入力がない関数も出力がない関数もあります．なので，プログラムの関数は一連の処理をひとまとめにしたものという感じです．何はともあれ実際に関数を見てみましょう．

```
戻り値の型 関数名(引数の型 引数名)
{
    処理
}
```

これが関数の基本形です．戻り値は出力，引数(ひきすう)は入力です．

```
y = f(x) = 3x + 2
```

数学の二元一次関数です．これをC#で表すと，

```cs
long f(int x)
{
    return 3 * x + 2;
}
```

この関数はint型のデータを受け取って，long型のデータを返します．`return`で値を返します．

```FunctionSample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FunctionSample
{
    class Program
    {
        static long f(int x)
        {
            return 3 * x + 2;  // 3. xに5を代入して演算した結果を返す．
        }

        static void Main(string[] args)
        {
            long y;    // 1. yの定義．
            y = f(5);  // 2. f関数に5を渡す． 4. yに返ってきた17を代入．
            Console.WriteLine(y);  // 5. yを画面に出力．
        }
    }
}
```

Main関数で使うためには`static`が必要なので付けといてください．
`y = f(5)`を見ると数学の関数と何ら変わりないように見えますね．f関数にはint型ならどんなリテラルも変数も渡せます．

---
数学で言うような関数もある一方で，Main関数やConsole.WriteLine関数のように戻り値を持たないものもあります．

```cs
void PlusOneAndDisplay(int num)
{
    Console.WriteLine(++num);
}
```

受け取った値をインクリメントして出力する関数です．`PlusOneAndDisplay(7);`と書くと画面に`8`が出力されます．

---
引数を複数取る関数もあります．

```
int Add(int num1, int num2)
{
    return num1 + num2;
}
```

使う場合もカンマ区切りで`Add(3, 6)`のように書くと`9`を返してくれます．

---
ここで，便利な関数を紹介します．
`string Console.ReadLine()` : キーボード入力を受け付ける関数．
`int int.Parse(string)` : string型のデータをint型のデータに変換する関数．
この2つを使うと，

```
string str = Console.ReadLine();
int num = int.Parse(str);
Console.WriteLine(num + 4);
```

のようにしてキーボード入力されたものをint型にして4足したものが出力されるような処理が書けます．慣れてくるともっと簡単に

```
Console.WriteLine(int.Parse(Console.ReadLine()) + 4);
```

と書くこともできます．まだ他にもMicrosoftが標準で用意してくれている関数があるので，気になる人は調べてみてください．

次回は[構造体](https://qiita.com/17t7037t/items/0048d3b0cc393623c7b1)について説明します．

##練習問題
引数が2つのint型，戻り値もint型で，2つの数値の中で大きい値を返すGetLarger関数を作ってください．

<details><summary>解答例</summary><div>
三項演算子というものを使ってみました．もちろんif文で条件分岐してもOKです．

```FunctionSample.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ArraySample
{
    class Program
    {
        static int GetLarger(int num1, int num2)
        {
            return num1 < num2 ? num2 : num1;
        }

        static void Main(string[] args)
        {
            Console.WriteLine(GetLarger(5, 7));
        }
    }
}
```

</div></details>
nuxt.jsにおけるコンポーネントの規約（没案）：ignorePrefixプロパティ版


- 2020/2/4 追記

やはり重い。没案として残しておきます。[nuxt.jsにおける「components」ディレクトリの規約（案）](https://qiita.com/amishiro/items/c7493f5e9375a0609bdc)をお勧めします。

- 2019/10/8 追記

ignorePrefixプロパティを使ったファイルが増えると、コンパイル時間が長くなるので注意。

以下本文

---

nuxt.jsでは、特殊な事情がない限り、３つのディレクトリにコンポーネントが格納される。「[layouts](https://ja.nuxtjs.org/guide/views#%E3%83%AC%E3%82%A4%E3%82%A2%E3%82%A6%E3%83%88)」と「[pages](https://ja.nuxtjs.org/guide/views#%E3%83%9A%E3%83%BC%E3%82%B8)」と「[components](https://ja.nuxtjs.org/guide/directory-structure#components-%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA)」をignorePrefixを活用することで、活かす方法を考えてみる。

# コンポーネントの規約（案）

規約はいいすぎか？
以下はシンプルな案なので、みんな仲良く話し合うといい。


## 今回対象とするコンポーネントファイルとは…

論点がずれないようにコンポーネントファイルについて定義しておく。
今回は「再利用可能」もしくは「複数回利用」するコンポーネントをコンポーネントファイルと呼ぶことにする。

- 再利用可能なコンポーネント
    - 他プロジェクトでも流用する可能性がある
    - 他プロジェクトでも必ず作成するから置き場を固定したい
- 複数回利用するコンポーネント
    - UIに関するコンポーネント
    - カテゴリ単位で使い回すコンポーネントなど

※pagesコンポーネントやlayoutコンポーネントは対象から除外。

## コンポーネントファイルには、ignorePrefixを必ずつける。

コンポーネントファイルのファイル名の先頭に、`-`（[ignorePrefix](https://ja.nuxtjs.org/api/configuration-ignore/)）を必ずつける。すると、ファイル名にかかわらずなんのファイルか判断することができる。もちろんわかりやすい名前にしたほうが良いのだが…なかなか難しいので。

- /pages
    - sample.vue ←これはpagesコンポーネントファイル
    - -about.vue ←これはコンポーネントファイル

## ディレクトリ構成

Nuxt.js規約の「layouts」「pages」「components」へファイルを振り分ける。呼び出し元のファイルとコンポーネントファイルが近くにあることで探しやすい。

- /pages
    - index.vue
    - /sample
        - index.vue
        - about.vue
        - -foot-link.vue 
        - -side-nav.vue 
- /layout
    - defult.vue
    - -header.vue
    - -nav.vue
    - -footer.vue
- /components
    - -ui-button.vue
    - -ui-figure.vue
    - -main-section.vue
    - -main-title.vue

以上で規約（案）は終了。ignorePrefixプロパティを活用することで、かなりシンプルに考えられる。

## 呼び出し方法について

「layouts」と「pages」は、個別にコンポーネントを登録しても手間はない。しかしながら、「components」は肥大化しがちなので**一括で登録**したい。

### 個別登録＆呼び出し（例）

```vue:layouts/default.vue
<template lang="pug">
.layouts
  header.layouts__header
    l-header
    l-nav
  main.layouts__main
    nuxt
  footer.layouts__footer
    l-footer
</template>

<script>
import LHeader from './-header'
import LNav from './-nav'
import LFooter from './-footer'
export default {
  components: {
    LlHeader,
    LNav,
    LFooter,
    ...
  },
  ...
}
</script>
```

### 一括登録＆呼び出し（例）

plugins経由で登録を行うことで、どこからでも呼び出せるようになるのでcomponents.jsを作成する。

```javascript:plugins/components.js
import Vue from 'vue'

import UButton from '~/components/-ui-button'
import UFigure from '~/components/-ui-figure'
import MSection from '~/components/-main-section'
import MTitle from '~/components/-main-title'

Vue.mixin({
  components: {
    UButton,
    UFigure,
    MSection,
    MTitle,
  }
})
```

components.jsをnuxt.confing.jsに登録

```javascript:nuxt.config.js
module.exports = {
  plugins: [
    { src: '~plugins/components' },
    ...
  ],
}
```

毎回importしなくても呼び出せるようになる。

```vue:test.vue
<template lang="pug">
.main
  m-title(:title="規約大好き" :sub="love")
  m-section
    u-button(to="/") ボタン
</template>
```

---

### おまけ

ignorePrefixプロパティを使ったファイルが増えると、コンパイル時間が長くなるので注意。[こちらの記事](https://qiita.com/amishiro/items/c7493f5e9375a0609bdc)をお勧めします。

シンプルに生きたい。
Firebase Authenticationで作成されたユーザーをFirestoreに放り込んでいろいろしたい

# やりたいこと
Firebase Authenticationでログインしたユーザーに、より多くの情報を持たせたい。
ので Firestore で 'users' collection を作ってFirebase Authenticationのユーザーをそこに放り込んでいろいろしたい。

# とりあえずコード

```javascript
function googleLogin() {
  const googleAuth = new firebase.auth.GoogleAuthProvider();
  firebase.auth().signInWithPopup(googleAuth).then((cred) => {
    const db = firebase.firestore();
    const users = db.collection('users');
    users.doc(cred.user.uid).set({
      datetime: moment().format('YYYY/MM/DD HH:mm'),
    });
  });
}
```

# 流れ
1. Firebase Authenticationでログイン（今回はGoogle Auth）
2. [1]でログインしたユーザーに自動的に固有のIDが付与される
3. Firestore に 'users' collection を作る
4. [3]に[2]のユーザーIDと同じIDのdocumentを作る

# 詳細
## Googleアカウントでログイン

```javascript
const googleAuth = new firebase.auth.GoogleAuthProvider();
firebase.auth().signInWithPopup(googleAuth);
```

ここまででログインはできます。

## ログインしたユーザーの情報を得る

```javascript
firebase.auth().signInWithPopup(googleAuth).then((cred) => {
  ...
})
```
`signInWithRedirect` という方法もあるけど、それだとユーザー情報を返してくれません。
`signInWithPopup`だと`credential`を`return`してくれるのでそれを使います。

## *users* `collection`を作成する

```javascript
const db = firebase.firestore();
const users = db.collection('users');
```

## *users* `collection`の中に`document`を作成する

```javascript
users.doc(cred.user.uid).set({
  datetime: moment().format('YYYY/MM/DD HH:mm'),
})
```
`document`がひとつも入ってないとcollectionを作ってくれません。
なのでとりあえず作成日時でも入れておきます。
（ここでは[moment.js](https://momentjs.com/)を使用しています）

# おしまい
これでuser IDをdocumentで管理して都度突合したりしなくていい！やったー！

# 参考
[Firebase Auth Tutorial #15- Firestore Users Collection
](https://www.youtube.com/watch?v=qWy9ylc3f9U)
04ArduinoでDCモータを簡単に回してみる

Arduinoを使って簡単にDC（直流）モータを回してみます。

[03でLEDをPWM制御](https://qiita.com/mat-MUNET/items/1ef0affa49b1177815eb)しましたが、その時のピン（ポート）を使ってモーターの回転数も調整してみたいと思います。

まず、回路図です。
##回路図
![モーター制御回路2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/0cb895fc-5c1b-fcf0-e853-feacd1a1223e.png)

＜補足＞
抵抗R1はダンパ抵抗と呼ばれるものです。今回は100Ω程度に設定します。
抵抗R2はR1の100倍程度、10kに設定します。


制御素子に「MOSFET」を使います。FETは電圧制御素子ですので、マイコンなどからの微電流信号でも比較的簡単に扱えます。
モータは、小型DCモータ（1A以下）を想定しています。

FETに並列に接続されているダイオードは、モータの逆起電力防止用です。
詳しくは触れませんが、一般整流用ダイオードでいいのでつけましょう。
##実際の結線
![hhg.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/08855b40-739a-30eb-90cf-42a55292b432.jpeg)
ブレッドボード上に結線してみました。
ぐちゃぐちゃで　すみません　motor電源はUSBからもらいます。
回路図にありませんが、GNDはArduinoボードと共通にします。

早速、結線して電源投入・・・の前にいくつか注意が

###回路上の注意
電源電圧は、モータブラシの定格電圧とFETの定格電圧を超えないようにしてください。また、FETに接続されている抵抗は、R1＝100Ω位、R2＝10kΩ位に設定してください。
R1をダンパ抵抗と呼ばれています。
FETのゲートには、わずかですがコンデンサの成分があり、ダンパ抵抗を介さずに直接接続すると、瞬時に大電流が流れしまいポートを破壊する恐れがあります。
今回は、PWM信号のように高速でON/OFF繰り返す制御をしますので、必ず設置してください。

###プログラム上の注意
LEDのプログラムは実行後（電源投入後）直ちにLEDが点灯し始めましたが、モータなどはいきなり動き出すとびっくりするだけでなく、危険なのでスタートスイッチのような機能を付けましょう。

スイッチの回路図を追加します。

##スイッチ回路図
![SW回路１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355420/27a09c98-eca4-09dc-39ff-2e8dcbcb0e71.png)

えらくシンプルです。
Arduinoのピンには、プルアップ機能が備わっていて、回路上（スイッチの手前）にプルアップ抵抗を挿入する必要がありません。助かります。

これらを踏まえて、スタートスイッチ付のプログラムを作ってみました。

##モータ制御プログラム１

```cpp:robot19
void setup() 
{ 
  pinMode(14, INPUT_PULLUP);
}
void loop() 
{ 

  //pin14の信号が来るまで待つ
  while(digitalRead(14) != 0);
  
  analogWrite(6,125);
     
}
```
pin14に接続されているスイッチを押した瞬間にモーターが回りだします。
しかし、電源を切らない限り止まりません。

###ストップスイッチも付けたい
いや付けないと止まらない。

##ストップスイッチpin15を追加する。

###ストップ機能追加プログラム

```cpp:robot19
byte ON_flag=0;
void setup() 
{ 
  pinMode(14, INPUT_PULLUP);
  pinMode(15, INPUT_PULLUP);
}

void loop() 
{
  //スタートスイッチとストップスイッチを監視する
  //スタートスイッチ
  if(digitalRead(14) == 0)
    ON_flag = 1;
  //ストップスイッチ
  if(digitalRead(15) == 0)
    ON_flag = 0;

    if(ON_flag)//flagが１ならモータon
      analogWrite(6,125);
    else //flagが０ならモータoff
      analogWrite(6,0);
}
```

一度スイッチを押したら動作（on,off）を継続するために、動作状態を保持する変数ON_flagを用意すると調子がいい。

###確認１
motorが動作したら、パワーを80%にしてみたい

###確認２
motorが動き出す最小の値はいくつか、調べたい
sudo権限がなくても最新のgccを使いたい！！

## はじめに
レンタルサーバーや会社が管理しているサーバーでは、自分のアカウントにsudo権限が与えられておらず、apt-getやyumなどで自由にアプリケーションをインストールできない場合が多い。

とはいっても、必須なアプリケーションはシステム自体にインストールされているため実際に困ることは多くないが、「**gccのバージョンが古い**」などの致命的な問題があったりなかったりラジバンダリ・・・（zshとか、Pythonの一部のライブラリとかね）


そこで、「**ローカル環境に無理やり最新版のgccをインストールしてしまおう！**」と思い立ち、いろいろ調べてやってみた結果をまとめました。

## gccをインストールする際の注意点
gccはかなり容量の大きいアプリケーションです（確か４Gくらい）。そのため以下のことに気を付けましょう
    
- インストール先の空き容量
    - 容量を検討してディスクを決めましょう
- インストール時間（makeにじかんがかかるがかかる）
    - tmuxとかを使っておくと安心

## gccのインストール方法
以下が実際に実行したコマンドになります。なお、各種ソースは2019年4月現在での最新のものになります。

```
# 適当なディレクトリへ移っておく（ご自由に）
cd ~/TMP

# gccソースのDLと解凍
wget http://ftp.tsukuba.wide.ad.jp/software/gcc/releases/gcc-8.3.0/gcc-8.3.0.tar.gz
tar -zxvf gcc-8.3.0.tar.gz
# gccディレクトリへ移動
cd gcc-8.3.0


#依存関係のあるパッケージをgccのディレクトリへ入れておく
# gmp
wget https://gmplib.org/download/gmp/gmp-6.1.2.tar.bz2
tar xjf ./gmp-6.1.2.tar.bz2
mv gmp-6.1.2 gmp

# mpfr
wget https://www.mpfr.org/mpfr-current/mpfr-4.0.2.tar.bz2
tar xjf ./mpfr-4.0.2.tar.bz2
mv mpfr-4.0.2 mpfr

# mpc
wget http://ftp.gnu.org/gnu/mpc/mpc-1.1.0.tar.gz
tar -zxvf mpc-1.1.0.tar.gz
mv mpc-1.1.0 mpc


# buildとinstall
mkdir build
cd build

# configureやmakeをするディレクトリへLIBRARY_PATHを通しておく
unset LIBRARY_PATH

# 環境によってオプションは適宜変更すること（私の環境では以下の通り）
../configure --prefix=$HOME/local --enable-languages=c,c++ --disable-multilib
make
makefile
```

これでOKです。エラーが出た場合は、まずconfigureのオプションから確認するとよいでしょう。

また、インストールしたディレクトリにパスを通すのを忘れないようにしましょう。

## 参考
[GCC 4.8.2をビルドしてホームディレクトリにインストール](http://d.hatena.ne.jp/muupan/20140219/1392823181)
Golangでメソッド呼び出しによる部分適用

出来ないかなーと思いつつ遊んでいたら出来たのでメモ。

```go
// 関数に名前付き型を定義する
type Add func(int, int) int

// 上で定義したAdd型に部分適用するメソッドを定義
func (f Add) apply(applyValue int) func(int) int {
	return func(value int) int {
		return f(value, applyValue)
	}
}

// Add型と同じ型を持つ関数を定義
func add(a, b int) int {
	return a + b
}

func main() {
	// 関数addがAdd型として扱えるように変数に格納する
	var f Add = add

	// Add型であるfからはapplyメソッドが呼び出せる
	f2 := f.apply(2)

	// 部分適用した関数ｆ２は引数が一つで呼び出せるようになる
	fmt.Print(f2(1)) // 3
}

```

このような方法を取らなくても、以下のような部分適用する関数を定義すればいいだけなので無性にメソッド呼び出ししたくなった時に利用するといいでしょう。

```go
func add(a, b int) int {
	return a + b
}

func apply(f func(int, int) int, applyValue int) f(int) int {
	return func(value int) int {
		return f(value, applyValue)
	}
}

func main() {
	add2 := apply(add, 2)
	fmt.Print(add2(1)) // 3
}
```
XVim2をinstallする

[XVim2/SIGNING\_Xcode\.md](https://github.com/XVimProject/XVim2/blob/master/SIGNING_Xcode.md)

### 1. 自己証明書の作成
![](https://github.com/XVimProject/XVim2/raw/master/Documents/Images/Keychain1.png)

![](https://github.com/XVimProject/XVim2/raw/master/Documents/Images/Keychain2.png)

※ 自己証明書の期限は1年なので、期限切れしたら再作成すること

### 2. 作成した証明書でXcodeに再署名

```sh
$ sudo codesign -f -s XcodeSigner /Applications/Xcode.app
```

### 3. XVim2をBuildする

```sh
$ make
```
docker docker-compose コマンド

日時: 2019.4/17
Dockerバージョン: Docker version 18.09.2

目的:よく使うdockerコマンドをメインに、基本的なdockerコマンドを集めていく

# ■よく使うシリーズ

## docker-compose build
docker-compose.ymlの内容に基づいてイメージを作成する

```
$ docker-compose build
```

## docker-compose up
docker-compose.ymlに書かれた依存関係をもとに、よしなにイメージを元にしてコンテナの作成と起動してくれる。
イメージはdocker-compose buildで作成する必要があります。

```
$ docker-compose up
```

## docker-compose down
docker-compose.ymlに書かれている内容をみてコンテナを停止してくれる。また、そのコンテナとネットワークの削除もしてくれます
「--rmi all」オプションをつけると、コンテナだけでなく、もとになったイメージも削除してくれます。

```
$ docker-compose down
```

## docker-compose down --rmi all --volumes
ちなみに、「--rmi all」オプションに「--volumes」もつけると、

コンテナを止めて、ネットワークを削除して、ボリュームもイメージも削除してくれる凄いコマンドになります

```
$ docker-compose down --rmi all --volumes
```


## docker ps 
現在起動しているコンテナの一覧を見れる

```
$ docker ps
```

## docker ps -a
起動しているものと起動していないもの、全てのコンテナの一覧をみれる

```
$ docker ps -a
```

## docker images
Dockerfileを元にbuild（作成）したイメージの一覧を表示してくれる

```
$ docker images
```

## docker logs （コンテナのID）
docker psコマンドで表示されるコンテナIDを引数に指定すると、logの確認ができます

```
$ docker logs 
```

# ■dockerコンテナの中に入って作業をしたい時
いくつか方法があるのでお好きな方法で作業してください


# docker exec -it コンテナ名 bash
すでに動いているコンテナはdocker psコマンドで確認できます。コンテナ名も同時に確認できます
コンテナから抜けたい場合は、[Ctl] + [C]コマンドで抜けれます。

```
$ docker exec -it nginx(← 例です) bash
```

# docker attach コンテナ名またはコンテナID
注意点としては、
このコマンドでコンテナ内に入った場合、[Ctl] + [C]コマンドでコンテナから抜けるとコンテナは停止してしまいます。

コンテナを起動したままコンテナから抜けたい場合は、
[Ctl] + [p], [Ctl] + [q] の両方を同時に押してください。

```
$ docker exec -it nginx(← 例です) bash
```

# ■その他dockerを使う上で必要なコマンド

## dockerコンテナを削除
コンテナ名orコンテナIDは「docker ps -a」コマンドを実行すると見れます

```
$ docker rm コンテナ名orコンテナID
```

## dockerイメージを削除
イメージIDは、「docker images」コマンドで確認できます

```
$ docker rmi イメージID 
```

## dockerイメージの詳細情報確認
イメージIDは、「docker images」コマンドで確認できます

```
$ docker inspect　イメージID
```

## イメージからコンテナの作成
コンテナの作成をするだけで、コンテナの起動はしません

```
$ docker create　イメージID
```


その他にも、
「docker create」
「docker run」 
「docker start」 
「docker stop」 
「docker restart」 
「docker stats」
「docker pause」
「docker unpause」
「docker top」
「docker port」
「docker rename」
「docker cp」
「docker diff」
「docker version」
「docker info」
などがありますが、ここで書くよりもググったほうがわかりやすい記事があると思います笑
この時代にJackson formatter XMLでJavaBeanとXMLを変換してみた

#経緯
~~お察しください~~

#準備
pomに下記を追加

```xml

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.9.8</version>
</dependency>
```

#詳細な使い方
http://fasterxml.github.io/jackson-dataformat-xml/javadoc/2.9/

#もろもろのクラス準備
###前提
・Beanのデータを作るときにLombokの＠Builderを使いました(本記事では触れてません)
　　https://projectlombok.org/

###Bean
```TestBean.java
@Data
@Builder
@JacksonXmlRootElement(localName = "top_element")
public class TestBean implements Serializable {

    // isAttribute = trueを付与すると属性になる
    @JacksonXmlProperty(localName = "id", isAttribute = true)
    private String topElement;

    @JacksonXmlProperty(localName = "test_field")
    private String testField;
    
    // ネストしたBeanも書ける
    @JacksonXmlProperty(localName = "test_inner_bean")
    private TestInnerBean testInnerBean;

    // Beanのリストをフィールドに持てる
    @JacksonXmlElementWrapper(localName = "dtls")
    @JacksonXmlProperty(localName = "dtl")
    private List<DtlsInnerDto> dtlsInnerDto;
```

###ネストするBean
```TestInnerBean.java
@SuppressWarnings("serial")
@Data
@Builder
public class TestInnerBean implements Serializable {

    @JacksonXmlProperty(localName = "inner_field_one")
    private String innerFieldOne;

    @JacksonXmlProperty(localName = "inner_field_two")
    private String innerFieldTwo;
}
```

###ネストするBeanのリスト
```DtlsInnerDto.java
@SuppressWarnings("serial")
@Data
@Builder
public class DtlsInnerDto implements Serializeble {
    @JacksonXmlProperty(localName = "dtl_item")
    private String dtlItem;
}
```

#Bean→XML変換処理のコード
```java
import com.fasterxml.jackson.dataformat.xml.XmlMapper;

String xml = new XmlMapper().writeValueAsString(Bean組み立て処理());
```


#変換結果

```xml
<top_element id="xxx">
  <test_field>xxx</test_field>
  <test_inner_bean>
     <inner_field_one>xxx</inner_field_one>
     <inner_field_two>xxx</inner_field_two>
  </test_inner_bean>
　<dtls>
    <dtl>xxx</dtl>
    <dtl>yyy</dtl>
    <dtl>zzz</dtl>
  </dtls>
</top_element>
```

#XML→Bean変換処理のコード
```java
import com.fasterxml.jackson.dataformat.xml.XmlMapper;

Beanクラス bean = new XmlMapper().readValue(xml文字列,　Beanクラス.class)
```

##メモ
- リストを表現したいとき http://labs.opentone.co.jp/?p=6634
pythonでpsycopg2のインストールでエラー出た時の対処法のメモ

`pip install django-heroku`
を実行した時に

```Command "python setup.py egg_info" failed with error code 1 ```
のエラーが出てインストールされない時

`brew install postgresql`
して

`export PATH="/usr/pgsql-9.4/bin:$PATH"`

するといける。

参考
http://h2shiki.hateblo.jp/entry/2016/05/05/210738
Dockerコンテナ上で起動したアプリケーションで時間がおかしい

# はじめに
どうも@chan_kakuです
今回は社内ツールをDocker化した際に問題が発生したので、その問題と今回打った対策、そして苦労した点など紹介していきます。

# 問題
今回はJavaのアプリケーションで問題が発生しました。
その問題というのは、とある箇所で、DBにて永続化させる時間を`new Date()`で現在時間をとって永続化させるような処理でした。
今までは、Dockerを使っておらず、ホストサーバのタイムゾーンに依存してましたので、JSTで時間が取れており、何も問題がありませんでした。
しかしながら、このツールをDocker化した後にこの`new Date()`での現在時間がずれるというような問題が発生してしまいました。

## 原因と推測
そもそも自分はDockerについての知識があまりなく、Java側のコードに問題があると推測していました。
しかしながら、上記にあるように、現在時刻を`new Date()`でとっていたため、その推測は外れてしまいました。
次の推測としては、ホストサーバのタイムゾーンでした。しかしながら、`date`コマンドを打つと、`JST`と表示されたため、こちらも外れました。
僕の考えられる推測が尽きてしまったため、Dockerに詳しい方々に聞いたところ、どうやらDocker内にも時間があるらしく、こちらの時間がずれているのではないかという情報を得ました。
そこで、以下のコマンドでDocker内に入り、同じようにDockerコンテナ内のタイムゾーンを調べました

```
docker run -t -i (対象のdocker image)  /bin/bash → docker起動して中に入る
# date
```

ここでは先ほどと同じように`JST`となっておりました。

## 対策
もはや、ここで万策尽きたと嘆いていたところ、とある方から鶴の一声が、、、
「Docker内で`/etc/timezone` の中身見てみて〜」
この方を信じ、Docker内に入り、`/etc/timezone`　をみてみたところ、ここが`UTC` となっていました
もしやということでDockerfileで `/etc/timezone`を `Asia/Tokyo`になるように以下のように修正しました

```Dockerfile
ENV TZ="Asia/Tokyo"
RUN echo $TZ > /etc/timezone

// timezone関連以外の記載は省略
```

今回あえてechoで変えた理由としては、ツールの要件的に時間系のタイムゾーンはJSTであることが求められていたので、ここはDockerfileに記載すべきだと判断しました

## 終わりに
Dockerについての知識があまりなかったためにいろんなところで苦労はしましたが、ひとまず解決して良かったです！
もっとこうした方がスマートだよなどのマサカリをお待ちしております
BigQueryにおけるSQL文の例

#素のデータの表示
　基本は次の文です。これで閲覧したいデータを表示してくれます。
SELECT * FROM '$データ名'

　ただしこのままでは巨大なデータすべてを表示することになってしまうので、表示個数を制限しましょう。次の文では表示件数が1000になります。
SELECT * FROM '$データ名' LIMIT 1000

##データの選別
　ここからは利用するデータを選別していきます。基本は次の文です。〇〇の値が△△と一致するものを選んで表示してくれるようになります。例えば日付="0417"のようなものを選べます。
SELECT * FROM '$データ名' WHERE 〇〇="△△"

　選ぶ条件は増やすこともできます。さらに表示件数を100に絞ると次の文になります。
SELECT * FROM '$データ名' WHERE 〇〇="△△" and □□="××" LIMIT 100

###２つのデータの参照
　ここからは具体的な例を用いて解説していきます。以下の状況を想定してください。
「データ名１」の中には「日付」、「店員名」、「商品」
「データ名２」の中には「商品」
という項目があるとします。「データ名１」を参照して、【4月17日に「データ名２」に含まれる商品を売った店員】を特定したい！という気持ちが芽生えたとします。すると以下の文になります。
SELECT x.日付,x.店員,x.商品
FROM '＄データ名１' as x,'＄データ名２' as y
WHERE x.日付=’0417’ and x.商品=y.商品

２行目から見てください。ここで「データ名１」を x 、「データ名２」を y という名前で呼びますよ、と言います。
３行目では、日付が0417のもの、xのうちyに含まれる商品を取り出しています。


今回はここまでにします。
gem install mysql2のエラー対応

macでローカル環境を作るときに出やすいエラー

```
An error occurred while installing mysql2 (0.5.2), and Bundler cannot
continue.
Make sure that `gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'`
succeeds before bundling.

ERROR: While executing gem ... (Errno::EACCES)
Permission denied @ rb_sysopen
```

対応

```
$ sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
$ sudo chown -R (ユーザ名):staff /Users/(ユーザ名)/.rbenv
$ bin/bundle config --local build.mysql2 "--with-cppflags=-I/usr/local/opt/openssl/include"
$ bin/bundle install --path vendor/bundle
```
centos 7のdocker devicemapperのディスク割当を増やす

# 何故増やすのか
centos7のdockerはデフォルトでdevice mapperで動いているが、こいつがコンテナにデフォルトで割り当てるディスクサイズが10GBのため

# 環境

```
# cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 
```


# 方法

## 前提
まず大前提としてdocker daemonを停止した上で```/var/lib/docker```を削除する

コンテナやイメージが全て消えるので必要な場合はバックアップなどを取ること

なお、データをマウントしていたりする場合は当然そのデータは消えない

## 設定

筆者はsystemctlでdockerを起動しているため```/lib/systemd/system/docker.service```に設定を記述した

dockerdを直接叩いている場合でも結局同じオプションになるはず

```
ExecStart=/usr/bin/dockerd -H fd:// -s devicemapper --storage-opt dm.basesize=20G
```

あとはsystemctlのreloadとstartでok

大事なのは```-s devicemapper```と ```--storage-opt dm.basesize=20G```の2つである

### ```--storage-opt dm.basesize=20G```

こいつが本体

割り当てたいディスクのサイズにしてもらえれば良い　ただしグローバル設定なのですべてのコンテナがこのサイズになる

### ```-s devicemapper```

**ハマりポイント**

storage-opt dm.basesizeだけを設定するとなぜかoverlayfsが反応してエラーを出して動かなくなるので明示的にdevicemapperを使うことを知らせる

~~挙動があからさまにバグである~~
Recovery Servicesコンテナーのサブスクリプション間/リソースグループ間移動について紹介

#Recovery Servicesコンテナのリソース移動対応の概要
##はじめに
2019年4月16日、Azure Backupの保存領域となるRecovery Servicesコンテナーのリソース移動機能がGAされました。
[Announcing Azure Backup support to move Recovery Services vaults across subscriptions and resource groups](https://azure.microsoft.com/ja-jp/updates/azure-backup-support-to-move-recovery-services-vaults/)

Azureリソース管理に関連する機能なので技術的な機能更新ではありませんが、せっかくなので紹介します。

##Azure Resource Move
多少話がそれますが、現在のAzure ARM環境では、リソースグループにネットワークや仮想マシン、ネットワークインターフェースなど個々のリソースを格納し管理しています。その中で、リソースを別のリソースグループやサブスクリプションへ移動する機能があり、それがAzure Resource Moveと呼ばれています。
[新しいリソース グループまたはサブスクリプションへのリソースの移動](https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/resource-group-move-resources)

このResource Move、移動できるサービスや構成に制限が多々あり、Recovery Servicesコンテナーは移動不可のサービスだったのかと思います。(リソース移動を使う機会がないため把握しておらず。。。)

##利点
話を戻して、タイトルのとおりなのですが、Recovery Servicesコンテナーのサブスクリプション/リソースグループ間移動がGAとアナウンスされました。

Microsoft社がこの機能による利点として挙げているのは以下です。

〇Key Benefits
1.柔軟に移動可能
　古いサブスクリプションの失効、EA契約からCSP契約への移行、組織的な変更、本番/検証環境の分離に役立ちます。
2.コンテナー内のバックアップデータには影響なし
　すべての設定やポリシー、バックアップデータは維持されます。
3.旧サブスクリプションVMのリストアが可能
　コンテナー移動後も、バックアップ対象のVMを一緒に移動しているかどうかによらず、バックアップからのVMリストアが可能です。

そもそも移動の機会がないので、如何とも言い難いところはありますが。。。

##方法
ポータルから2~3クリックなので非常に簡単です。
1.折り畳みを展開
![2019-04-17_11h24_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187836/e217f24a-23f7-3359-03f4-b5fe25adf874.png)

2.[変更]をクリック
![2019-04-17_11h25_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187836/116d90fa-3339-aa81-4664-0c9c2934ed04.png)

3.コンテナー以外の移動対象があればチェックを入れ、移動先のサブスクリプション/リソースグループを指定すればOK
※最後のチェックは、移動完了まで対象リソースの操作ができなくなるため、その確認です。
![2019-04-17_11h32_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187836/fc42c81a-a349-15eb-c030-7a60124d353b.png)

##注意
注意点としては、やはり制限事項でしょうか。
以下のサイトを確認すると、Azure FilesやFile Sync、VM内のSQL Server DBをバックアップしているコンテナーの移動はサポートされていないようです。

Azure Site Recovery用コンテナーの移動は「まだ」できないという書き方なので、今後可能となるかもしれません。

[Move a Recovery Services vault across Azure Subscriptions and Resource Groups](https://docs.microsoft.com/en-us/azure/backup/backup-azure-move-recovery-services-vault)

##終わりに
コンテナーの移動がGAされたため紹介しましたが、リソース移動自体をしたことがない、もしくは機能の存在を知らない方も少なからずいるのではないでしょうか。

1つのサブスクリプション/リソースグループに環境が混在していれば使用できますが、日本では初めから明確に分類する方が多いように思うため、使用機会はあまりないかもしれません。(私も顧客環境で実施したことはありません。。。)

とはいえ、Microsoft社が述べるようEAからCSPへの契約変更時など、何かしらで役に立つこともあるかもしれないので、記憶に留めておいて損はないかもしれませんね。
【秒速】PythonのPelicanを使ってウェブサイト（Coreserverで）を作ってみる。

##Pelicanとは

>Python製の静的サイトジェネレータです。Ruby製のJekyllやOctropressに似ていますが、PelicanはPythonだけで動かせます。GitHub Pagesへの公開も非常に簡単です。
公式サイトがとても充実していますが日本語の資料少ない。
[Python製 Pelican を使ってサクッとブログを公開する] (https://qiita.com/saira/items/71faa202efb4320cb41d)  より

前まで自分のウェブサイトをワードプレスで使ったりしていましたが、テック系の記事はQiitaに書きますし、ブログはnote、つぶやきはtwitterとそれぞれの役割が分担してきたので定期的にコンテンツを自分で書くウェブサイトはいらないのかなと考えていました。

ただ、自分のホームページはほしいので自己紹介を含めた簡単まとめとしてペリカンで軽くサイトを作ることにしました。

Pythonだし、退屈なことはあとあと自動化しようかと思ってます。

##早速サイトを作る！
まず、この記事を使ってCoreserverで体験用ドメインとpythonのセットアップを終えてください。

[https://qiita.com/twinoze/items/5bd62a2bc08fee7596f1](CORESERVERでDjangoのサイトを作るまで)

次にpipでpelicanとmarkdownします。

````
$ pip install pelican markdown
````
サイトを入れるフォルダをどこでもいいので作ってから、そこに入りpelican quick-startを実行します。
初期設定用の質問に答えれば、簡単なデモサイトが出来上がります。

````
$ mkdir mysite
$ cd mysite
````

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295666/4c616169-2908-684f-8d9b-cd5f4d32bd52.png)

output内にhtmlファイルがいくつか作られるのですが、これをpublil_htmlに入れることで自分のウェブサイトを公開することができると思います。

毎回、場所を変えるのは面倒なので、viでpelicanconf.pyの最後の行に

````
OUTPUT_PATH = '../public_html/atomscott.com/'
````

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295666/268b06bf-4870-3a0b-893e-a4451b4040d6.png)

をくっつけるとpublic_html直下のatomscott.comフォルダにサイトをoutputしてくれます。

[atomscott.com](atomscott.com)にお邪魔してみると（いまは開発を進めたのでもっとかっこいいサイトが出てくるかもしれません！）こんな画面が！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295666/1140d2b0-3557-9b88-731a-671b0b428ed1.png)

楽ですね〜
今日はこれで以上です。
SQL構文メモ

# はじめに

SQLを使い始めたので、備忘録として学んだことをまとめていこうと思います。
# 基本
項目の取得には SELECT を用います。

```sql
SELECT 取得する項目名 FROM テーブル名 ・・・・・
```

これが基本構文で、・・・・・の部分に色々とオプションを追加することができるので以下にまとめます。

# データの絞り込み、加工

| SQL文| 説明|
|---|---|
|WHERE 条件式|条件式に合致するもののみ取得|
|LIMIT 数字|上から"数字"個だけデータを取得|
|ORDER BY 項目|データを"項目"に関してソートする




WHERE中の条件式には様々な演算子を用いることができ、さらにその条件式をand,orでつなぐこともできます。


（例）ENERGYが500以上のカレーのデータを3つ取得する

```sql
SELECT * FROM table1 WHERE ENERGY>=500 and NAME="カレー" LIMIT 3
```
を実行すると以下のようなデータが得られます。（項目名の*は全要素を表す）

|DATE | NAME|ENERGY|PRICE|
|---|---|---|---|
|20190411|カレー|530|500|
|20190411|カレー|700|700|
|20190412|カレー|660|700|

# データのグループ化、集計
SELECT〜のところに 関数(項目名) を入れることで集計結果を表示させることもできます。

|関数名| 説明|
|---|---|
|SUM(項目名)|"項目"の値の総和を出力|
|AVG(項目名)|"項目"の値の平均を出力|
|COUNT(項目名)|"項目"の値のデータ数を出力

また、FROM〜の後に
GROUP BY 項目名　を加えると"項目"の各々の要素ごとの集計結果が得られます。

（例）日ごとの商品別総売上を取得する

```sql
SELECT DATE,NAME,SUM(PRICE) AS SALES FROM table1 GROUP BY DATE,NAME ORDER BY DATE
```
を実行するとこのようなデータが得られます。

|DATE|NAME|SALES|
|---|---|---|
|20190411|カレー|15000|
|20190411|ラーメン|18000|
|20190412|ラーメン|20000|
|20190412|カレー|12000|

###  〜型変換〜
今回分析に用いたデータの数値が文字列として保存されていたので、型変換する必要がありました。
CAST(項目名 AS 型)でその項目のデータを一括型変換できます。

```sql
SELECT SUM(CAST(PRICE AS float64)) FROM table1 ・・・ 
```

これでPRICEの和を得ることができました。
Docker-Composeでコンテナをビルドする際に起こったエラーと解決策まとめ

はじめましての方ははじめまして。


[未来電子テクノロジー](https://www.miraidenshi-tech.jp/)でインターンをしている<@kento_o>です。

今回は、[Quickstart: Compose and Django](https://docs.docker.com/compose/django/)を一通り試してみる中で起こったエラーと解決策をログとして残しておきます。

#起こったエラー
・Dockerファイルを誤植した際に起こったエラー
・データベースにコネクトし、ページを表示する際に起こったエラー
1つ目のエラーは至極単純なものですが、2つ目が厄介でした。

#Disarrowed?
![Screenshot from 2019-04-17 11-22-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320820/4ad89743-9e83-53b8-ff57-6dcb978b684b.png)
このようなエラーが出力されました。
んん?hostが許されていない......?
1時間ほどエラー原因を探してみたところ、どうも「Setting.py」の設定ミスのよう。

```python:setting.py

ALLOWED_HOSTS = []

```

となっていたので、

```python:setting.py

ALLOWED_HOSTS = ['*']

```

に変更

#解決

![django-it-worked.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320820/3170cc41-e670-44e5-bd4b-e5502d9e8845.png)

やりました,b
Android build時にapkにcommitHashを埋め込んでアプリ上で確認する

自分用メモ

/app/build.gradle

```
//commit hash 取得
def getCommitHasH() {
    def process = "git rev-parse --short HEAD".execute()
    process.waitFor()
    (process.exitValue() == 0) ? process.text.trim() : ""
}

android {
    defaultConfig {
        // BuildConfig へ埋め込み
        buildConfigField("String", "COMMIT_HASH", "\"" + getCommitHasH() + "\"")
    }
}
```

kotlinで表示制御する場合
HogeActivity.kt

```
//debugビルドなら表示する
if(BuildConfig.DEBUG){
  commitHashText.text = BuildConfig.COMMIT_HASH
  commitHashText.visibility = View.VISIBLE
}else{
  commitHashText.visibility = View.GONE
}
```

layoutxmlで表示制御する場合

```
<!-- import BuildConfig -->
<data>
    <import type="com.hoge.BuildConfig"/>
</data>

<!-- Data binding -->
<TextView
    tools:text="@{BuildConfig.COMMIT_HASH}"
    android:visibility="@{BuildConfig.DEBUG ? View.VISIBLE : View.GONE}"
/>

```



ref
- https://gist.github.com/kappa-lab/fd8650dfcc2f780055255fa982e82473
- https://qiita.com/kawachi/items/d97c448b013c37f2f198
コールバックの種類

コールバック：登録や削除イベントの前後に挟む任意の処理のこと

|コールバックの種類|代表的な用途|
|:------------|:---------|
|before_validation|検証前の値の正規化|
|after_validation|検証結果（エラーメッセージの正規化）|
|before_save<p>before_create</p>before_update|saveのために裏側で行いたいデータ準備を行う。<p>検証エラーを出してもユーザー側からどうしようもない状態異常を防ぐために例外を出す。</p>|
|after_save<p>after_create</p>after_update|モデルの状態に応じて他のモデルの状態を変えるなどの、モデルの状態に連動した挙動を行わせる。<p>検証エラーを出してもユーザー側からどうしようもない状態異常を防ぐために例外を出す。</p>|
|before_destroy|削除してOKかをチェックし、ダメなら例外を出すなどして防ぐ。|
|after_destroy|そのモデルの削除に応じて他のモデルの状態を変えるといった連動した挙動を実現する。|
1行でウェブサイトをスクレイピングしてJSON化できるコマンドを作った

# [できたもの](https://github.com/rike422/kirinuki-cli)

https://github.com/rike422/kirinuki-cli

サンプル： qiitaの新着ページをスクレイピングしてjsonとして取得するコマンドです。

※[jo](https://github.com/jpmens/jo)でjsonを作成して[jq](https://stedolan.github.io/jq/)で整形してます。


`jo -B topics="$(jo -B title="$(jo -a .tr-Item_title text)" link=.tr-Item_title _unfold=true )" | xargs -0 kirinuki scrape -p https://qiita.com/ | jq .`

![qiita.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16172/24d05ca2-31ee-dab4-f15f-12e6d60c283c.gif)


`xargs -0 kirinuki scrape -p https://qiita.com/`
部分が作った[コマンド](https://github.com/rike422/kirinuki-cli)になります。


## できること

[cssSelectorを値として書いたjsonで、データの加工処理なしにjsonを取得することができます。](https://github.com/rike422/kirinuki-core)


[記法について書いた過去記事](https://qiita.com/rike422/items/9b8a6f9bf16a5cbf5c99)


## [ocilif](https://github.com/oclif/oclif)

過去記事がありました。
https://qiita.com/mokamoto/items/f70eaff72f795f1d7322

### 良さ

- [ソースコード内に書いたhelp等のデータからReadmeなどのドキュメントを自動生成してくれる](https://github.com/rike422/kirinuki-cli)
- デフォルトでtypescriptサポート
- [デバッグが楽](https://oclif.io/docs/debugging)

### 今回は使わなかった良さ

- サポートしてるフィードバックのインターフェースがリッチ
    - [対話型インターフェース](https://oclif.io/docs/prompting)
    - [通知](https://oclif.io/docs/notifications)
    - [テーブル](https://oclif.io/docs/table)
    - [スピナー](https://oclif.io/docs/spinner)
- [ocilif自体のプラグインがつくりやすい](https://oclif.io/docs/plugins)
- [オートアップデートもさくっとできる](https://oclif.io/docs/releasing#autoupdater)

commanderとかつかってリッチなフィードバックを作ろうとすると、外部ライブラリ使うことになったりするので、さっと作りたい時最高だと思います。

## puppetter

みんな大好き[Headless Chrome Node API](https://github.com/GoogleChrome/puppeteer)

puppetterそのものを通常の依存関係にすると巨大なchromiumの実行ファイルをDLすることになるので、[puppetter-core](https://github.com/GoogleChrome/puppeteer#puppeteer-core)を依存関係に追加するのみにしました。
オプションでchormeの実行パスを渡せるようにし、インストール済みchromeを使えるようにしています。
グローバルなどにインストールされたpuppetterがある場合そちらを参照しに行きます。


# まとめ

定期的に監視したいページとか、jsonで取りたいページがあるときに使ってください。
devise NoMethodError (undefined method `utc'

こんなエラーが出てしまった場合

```
I, [2019-04-17T02:04:34.636864 #7612]  INFO -- : [18ca5a07-0693-4dd5-8be1-ac3c7c5ea47d] Started GET "/users/sign_in" for 133.218.55.173 at 2019-04-17 02:04:34 +0000
I, [2019-04-17T02:04:34.637545 #7612]  INFO -- : [18ca5a07-0693-4dd5-8be1-ac3c7c5ea47d] Processing by Users::SessionsController#new as HTML
D, [2019-04-17T02:04:34.639131 #7612] DEBUG -- : [18ca5a07-0693-4dd5-8be1-ac3c7c5ea47d]    (0.2ms)  SET NAMES utf8mb4 COLLATE utf8mb4_bin,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
D, [2019-04-17T02:04:34.639915 #7612] DEBUG -- : [18ca5a07-0693-4dd5-8be1-ac3c7c5ea47d]   User Load (0.3ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1
I, [2019-04-17T02:04:34.641703 #7612]  INFO -- : [18ca5a07-0693-4dd5-8be1-ac3c7c5ea47d] Completed 500 Internal Server Error in 4ms (ActiveRecord: 1.0ms)
F, [2019-04-17T02:04:34.642646 #7612] FATAL -- : [18ca5a07-0693-4dd5-8be1-ac3c7c5ea47d]
F, [2019-04-17T02:04:34.642770 #7612] FATAL -- : [18ca5a07-0693-4dd5-8be1-ac3c7c5ea47d] NoMethodError (undefined method `utc' for Sat, 06 Apr 2019:Date):
F, [2019-04-17T02:04:34.642858 #7612] FATAL -- : [18ca5a07-0693-4dd5-8be1-ac3c7c5ea47d]
F, [2019-04-17T02:04:34.642973 #7612] FATAL -- : [18ca5a07-0693-4dd5-8be1-ac3c7c5ea47d] devise (4.5.0) lib/devise/models/rememberable.rb:118:in `remember_me?'
[18ca5a07-0693-4dd5-8be1-ac3c7c5ea47d] devise (4.5.0) lib/devise/models/rememberable.rb:143:in `serialize_from_cookie'
[18ca5a07-0693-4dd5-8be1-ac3c7c5ea47d] devise (4.5.0) lib/devise/strategies/rememberable.rb:22:in `authenticate!'
[18ca5a07-0693-4dd5-8be1-ac3c7c5ea47d] warden (1.2.8) lib/warden/strategies/base.rb:54:in `_run!'
[18ca5a07-0693-4dd5-8be1-ac3c7c5ea47d] warden (1.2.8) lib/warden/proxy.rb:369:in `block in _run_strategies_for'
[18ca5a07-0693-4dd5-8be1-ac3c7c5ea47d] warden (1.2.8) lib/warden/proxy.rb:365:in `each'
[18ca5a07-0693-4dd5-8be1-ac3c7c5ea47d] warden (1.2.8) lib/warden/proxy.rb:365:in `_run_strategies_for'
[18ca5a07-0693-4dd5-8be1-ac3c7c5ea47d] warden (1.2.8) lib/warden/proxy.rb:335:in `_perform_authentication'
[18ca5a07-0693-4dd5-8be1-ac3c7c5ea47d] warden (1.2.8) lib/warden/proxy.rb:110:in `authenticate'
[18ca5a07-0693-4dd5-8be1-ac3c7c5ea47d] warden (1.2.8) lib/warden/proxy.rb:120:in `authenticate?'
```

ローカルのクッキーを削除
AIを使ったテストツール「Testim」のざっくり特徴

AIを用いたテストツールでは、国内だとMagicPodが有名ですが、実際にはAI技術を実装したツールはまだ触ったことがありません。
同じくTestimのハンズオンが都合よく参加できたので、忘れないために記載しておきます。

<img width="927" alt="NoName_2019-4-16_19-37-43_No-00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220327/a31eb5a8-8f9b-c6a4-cab5-93562314e816.png">

## 概要

* テスト対象
  * Webアプリ

* ツール構成
  * 管理サーバと実施クライアントがある
     * 管理サーバ：SaaS版、オンプレ版
     * 実施クライアント：Chromeの拡張機能

* Testimメリット
  * テストケースが頑健になる
  * テストケースのメンテナンスもしやすい

* 主な特徴機能
  * キャプチャリプレイ 
  * セルフヒーリング etc,..,

* 特徴機能の具体例
  * 同じようなものが並んでいるもの、順番が変わったりもする
      * 要素や文字も記録しているので類似している要素から認識することができる
      * 重視する要素も指定できる
  * 色々情報を記録しているので、前と同じボタンだということがわかるようになっている
      * 頑健にできる

## 管理サーバ

* 実際のテストを作成・管理する

<img width="960" alt="Testimio - Simply Automate - Google Chrome_2019-4-16_19-36-58_No-00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220327/708ceadc-856e-8d71-bbab-b5acc42f03ea.png">

## 実施クライアント

* テストを実施する

<img width="900" alt="NoName_2019-4-16_19-34-30_No-00.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/220327/fb75abac-dc9f-a02b-be72-a0d2e15abb0e.png">

## 実際の利用

* youtubeにGetting Startedの動画があるのでこちらを参照してみてください
  * https://www.youtube.com/watch?v=bCvVgT5owv0

## 所感

* セルフヒーリングやメンテのしやすさが魅力的
  * ブラウザやモバイルであれば構造情報があるので、そういった情報からAI技術を用いて自動的に判断することが可能のようです。
  * Sikuliという画像ベースの操作自動化ツールもありますが、こちらよりも扱う情報量が多い印象です。
* 基盤技術は、Seleniumをベースに開発
  * MagicPodもそうでしたが、やはりオープンソースの自動テストを発展させたものとして様々な企業で作られているようです。

## 参照

* Magic Pod
  * https://magic-pod.com/
* Sikuli
  * http://www.sikuli.org/
* Testim
  * https://www.testim.io/
* AIを使ったテストツール「Testim」ハンズオン勉強会
  * https://techplay.jp/event/722190
  * https://techplay.jp/column/496