OmniAICreator/Qiita-1.07M huggingface dataset:
メイン関数（エントリーポイント）を非同期にする

## C# バージョン7.1からエントリーポイントも非同期にできる

以前なら `static async Task Main` はエントリーポイントとみなされずビルドエラーが発生しました。
`C# 7.1` なら エントリーポイントを非同期処理にすることができます。

Main 関数が非同期にできる為、そのまま非同期メソッドを await で呼ぶことができます。

```c#
using System;
using System.Net.Http;
using System.Threading.Tasks;

namespace AsyncMainSample
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // Mian 関数で非同期メソッドを await で呼べる
            string doc = await GetMSDocAsync();
            Console.WriteLine(doc);
        }

        // 非同期メソッド
        static async Task<string> GetMSDocAsync() => 
            await new HttpClient().GetStringAsync(@"https://docs.microsoft.com/ja-jp/");
    }
}
```

今までも`AsyncMethod().GetAwaiter().GetResult();` と呼ぶことができましたがこっちのほうが綺麗です。

## 使うには C# の言語バージョンを7.1以上に設定する

非同期のメインメソッドがサポートされるのは `C# 7.1` 以上なので言語バージョンを7.1以上に設定する必要があります。

Visual Studio のビルドの詳細設定を開きます。
`ソリューションエクスプローラー` > `プロジェクトを右クリック` > `プロパティ` > `ビルド` > `詳細設定`

`言語バージョン`を `C# 7.1` 以上に設定します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/195024/40bfb611-b938-9338-ce31-ff200fc1436e.png)

読んでいただきありがとうございました。
Rails5でpuma + nginx連携

Rails5で作成したアプリケーションをpuma + nginxで動かすというのをやってみた。

**本記事で知ることのできること**
・最低限の設定
・躓いたところ
**知ることのできないこと**
・nginx, pumaの詳細な設定
・セキュリティを意識した設定

**環境**
・OS Ubuntu16.04
・Rails 5.1.5
・nginx 1.10.3


# pumaの設定
今回はsocketでpumaとnginxを連携させるため、Rails.root/config/puma.rbを編集。

```
# ポートでのlistenは不要なのでコメントアウト
#port  ENV.fetch("PORT") { 3000 }

# socketの設定
# ディレクトリがない場合は作成しておく
bind "unix://#{Rails.root}/tmp/sockets/puma.sock"
```

この際に、ポートでのlistenはコメントしておかないとsocketのlistenが行われず（pumaの仕様？）ハマった。
参考：　https://qiita.com/kappy0322/items/b6c267dfb330a47fea9f

これでpumaを起動すればsocketファイルができ、待受け完了。
``` rails s -e production ```


# nginxの設定
設定ファイルは大きく２つあるみたい。
nginxの基本的な設定
・/etc/nginx/nginx.conf
各サイト用の設定
・/etc/nginx/sites-available/*

今回は/etc/nginx/sites-available/配下に myapp ファイルを作成し、設定を記述。

```
upstream puma {
  # pumaの設定で指定したsocketファイルを指定
  server unix:///home/ubuntu/myapp/tmp/sockets/puma.sock;
}

server {
  # nginxが待ち受けしたいポートを指定
  listen 3000 default_server;
  listen [::]:3000 default_server;
  server_name puma;

  location / {
    proxy_read_timeout 300;
    proxy_connect_timeout 300;
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # 上記server_name で設定した名前で指定
    proxy_pass http://puma;
  }
}
```

記述ができたら、設定ファイルのシンボリックリンクを作成。
```ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/myapp```
次に、nginxの設定ファイルを再読込させる。
```nginx -s reload```

これで、設定完了。
http://あいぴーあどれす:3000 にアクセスするとnginxが受け、pumaへ回してくれる。

**課題**
・nginxの設定内容の詳細を理解する
「開業届」を提出する理由

私自身が提出を検討・情報整理した過程で「なかなかたどり着かなかったが、本当は最初に知りたかった」と思った情報を整理します。

フリーランス・個人事業主に関する情報は多くの方がまとめていらっしゃいますので、他の Qiita posts やブログなどをご覧いただけると幸いです。（既に見ていらっしゃると思いますが…）

# 最初にまとめ

事業所得の説明から税金の計算の仕方まで、国税庁の [ホーム＞税について調べる＞タックスアンサー＞所得税＞事業主と税金](http://www.nta.go.jp/taxes/shiraberu/taxanswer/shotoku/shoto316.htm) に全てがまとめられています。

一次情報で理解・納得・消化して行動の判断したいタイプの人（＝私自身です）は、上記のリンクで情報を吸収するのが一番納得できます :smiley: 
これを伝えたかったがための post です。。。

## 開業届

「個人事業の開業・廃業等届出書」、俗に「開業届」と呼ばれるものです。

http://www.nta.go.jp/tetsuzuki/shinsei/annai/shinkoku/annai/04.htm

## どこに提出するのか

「税務署」です。

税務署の所在地等については、国税庁ホームページの [所在地及び管轄](http://www.nta.go.jp/soshiki/kokuzeikyoku/kankatsukuiki/syozaiti.htm) で確認してください。

## 提出する理由

提出先が「税務署」である点でお気づきかもしれませんが、提出の有無が大きく影響するものは「税金」です。

例えば、何らかの「研究・開発・検証」を個人で行っているとします。
必要なリソースは、ソフトウェア開発であれば「時間」が最大のリソースですが、ハードウェア開発が絡むと「時間」に加えて各種「器材」の購入費用も無視できないものになります。

「開業届」を出さずに個人で活動をする場合、すでにある「所得」の中から費用を出しますが、税金は「所得」に対してかかります。「研究・開発・検証」にかかる費用は、税金を引かれた残りの金額から捻出しなければいけません。

ところが、成果を社会に役立てたいと思い、他の個人や企業への製品・サービス提供を考えていれば、「事業」となりえます。「開業届」を出していると、「研究・開発・検証」は「事業」の「経費」であるとして、税金の対象から外れます。「経費」を差し引いた残りの「所得」に対して税金がかかるため、いわゆる「節税」になります。

ここで、誰でも「開業届」を出せば「脱税」につながってしまうのではないか、という懸念が生まれますので、そのポイントを続けていきます。

## 「開業届」を出すか出さないかのポイント

執筆中。。。
TypeScriptをASP.NET MVCに組み込む

今回はASP.NET MVCにTypeScriptを組み込んでみます。
環境はVisual Studio 2015です。

## ASP.NET MVC サンプル作成

まず、ファイル->新規作成->プロジェクトでプロジェクト作成画面を開きます。
そして、ASP.NET Web アプリケーションを選択します。  

![create_new_asp_dotnet_sample.png](https://qiita-image-store.s3.amazonaws.com/0/246211/683769c3-3e97-d5bd-4f43-db7ca8ecd29d.png)

今回はEmpty、MVCを選択します。

![empty_mvc.png](https://qiita-image-store.s3.amazonaws.com/0/246211/d2e5a429-8c04-2ad2-2415-2cd91ea3862f.png)

空のMVCなため構成はこんな感じです。

![empty_mvc_constitution.PNG](https://qiita-image-store.s3.amazonaws.com/0/246211/d16ff3e7-fdba-a6b4-b582-81ad2cacfe6d.png)

空でなんもないんでControllers配下にHomeController.csを追加します。

HomeController.cs

```cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace TypeScriptSample.Controllers
{
    public class HomeController : Controller
    {
        // GET: Home
        public ActionResult Index()
        {
            return View();
        }
    }
}
```

対応するViewをViews/Home配下に追加しましょう。

Index.html

``` html
<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title></title>
</head>
<body>
    <label>Sample page</label>
</body>
</html>
```

これでソリューションを実行すれば下記画面が表示されるはずです。

![empty_mvc_index.png](https://qiita-image-store.s3.amazonaws.com/0/246211/b4ed0b04-3fb9-0d54-c738-a0c7ea5d6e48.png)

## TypeScriptを組み込む

先ほど作成したサンプルにTypeScriptを組み込んでみましょう。
まず、ソリューションを右クリックし、追加->新しいフォルダでTypeScriptを置くフォルダを作りましょう。
フォルダ名は何でもいいです。

追加したフォルダを右クリックし、追加->TypeScriptファイルでTypeScriptファイルを作成します。

app.ts

``` typescript
class Person {
    private name: string;
    public getName(): string {
        return this.name;
    }
    constructor(name: string) {
        this.name = name;
    }
}

window.onload = function () {
    const p = new Person("Hoge");
    alert(p.getName());
}
```

ソリューションをビルドするとjsにトランスパイルされます。

![mvc_with_ts_constitution.PNG](https://qiita-image-store.s3.amazonaws.com/0/246211/972f315a-dbf5-9868-ba71-69a45d6d7ac6.png)

画面にapp.jsへの参照を追加しましょう。  

Index.html

``` html
<!DOCTYPE html>

<html>
<head>        
    <script src="~/ts/app.js"></script>
    <meta name="viewport" content="width=device-width" />
    <title></title>
</head>
<body>
    <label>Sample page</label>
</body>
</html>
```

準備は整いました。  
ソリューションを実行すると下記画面が表示されるはずです。  

![mvc_with_ts_index.PNG](https://qiita-image-store.s3.amazonaws.com/0/246211/86b8fd56-9aa5-925f-345a-dcc2cabf21ac.png)


以上、TypeScriptをASP.NET MVCに組み込むの回でしたー
travis 上で webpack-dev-server に HEAD リクエスト送るとうまくいかない

タイトルのとおりです。

```
    "wait-on": "^2.1.0",
    "webpack": "^4.2.0",
    "webpack-cli": "^2.0.13",
    "webpack-dev-server": "^3.1.1"
```

## TL;DR

HEAD の代わりに GET を使いましょう。

---

やりたかった事としては、テスト実行時に webpack-dev-server でサーバーを立ち上げて、ready になったら後続の処理を行うというもの。
npm に [wait-on](https://www.npmjs.com/package/wait-on) というモジュールがあり、これを使ってサーバーが準備完了となるのを待っていた。

```js
waitOn(
      {
        resources: ["http://localhost:9999"]
      },
      err => {
        if (err) return reject(err);
        resolve();
      }
    );
```

こんな感じ。

ローカルではこれでうまく行っていたが、travis で実行すると wait-on のところでタイムアウトになっていた。
travis に ssh デバッグして curl したりしてもちゃんと返ってきているのでなんだろうと。
wait-on の実装を読むとデフォルトでは HEAD リクエストで完了を待っている模様。
試しに curl で HEAD を送ると見慣れない終了コードが返ってきていて、これで失敗してタイムアウトタイムアウト気づく。
wait-on は `http://` だと HEAD リクエストを送るが `http-get://` なら GET リクエストを送って待ってくれるみたいなので、これを使って事なきを得た。
TypeScriptでKnockout!!

TypeScriptでKnockoutを使ってみます。
ただし、下記コマンドが実行できる前提です。
- npm
- tsc
- typings

## 環境構築

今回はVisual Studioを使わず、testフォルダ内にサンプルを作ってみます。  
testフォルダで下記コマンドを実行し、tsc、typings、npmを実行出来る環境を用意します。

```cmd
tsc --init
typings init
npm init
```

## 型定義ファイルの取得

型定義ファイルを取得しましょう。  
今回はKnockoutの型定義ファイルを取得します。  

``` cmd
typings install dt~knockout --global --save
```

## knockout.jsの取得

npmでknockout.jsを取得します。

``` cmd
npm install knokcout 
```

## サンプル実装

まず、ViewModelを作ります。  

viewModel.ts

``` typescript
/// <reference path="../typings/index.d.ts"/>

class ViewModel{
    // property
    private privateMsg = "隠しメッセージ";
    
    // ko observable
    private observableMsg = ko.observable("");

    constructor(){
        // ko observableに値をセット
        this.observableMsg("Hello Knockout World!!!");
    }

    /**
     * 隠しメッセージを表示します。
     */
    private showMsg(): void{
        alert(this.privateMsg);
    }
}
```

次に、ViewModelをバインドします。  

app.ts

``` typescript
/// <reference path="../typings/index.d.ts"/>
/// <reference path="viewModel.ts"/>

window.onload = function(){
    const viewModel = new ViewModel();
    ko.applyBindings(viewModel);
}
```

画面を作ります。  
~~node_moduleを直に参照するのは。。。~~

index.html

``` html
<html>
    <head>
        <script src="node_modules/knockout/build/output/knockout-latest.js"></script>
        <script src="ts/viewModel.js"></script>
        <script src="ts/app.js"></script>
    </head>
    <body>
        <div data-bind="text: observableMsg"></div>
        <button type="button" data-bind="click: showMsg">メッセージを表示する</button>
    </body>
</html>
```

## tsのトランスパイル

tsファイルをjsファイルにトランスパイルします。

``` cmd
tsc app.ts
tsc viewModel.ts
```

今回は手動でトランスパイルしましたが、gulpやらgruntで自動化するのが望ましいです。  
~~そもそもVisual Studio使えばこんな面倒なことしなくても~~

## 画面の表示

早速画面を表示しましょう。

![typescript_knockout_index.png](https://qiita-image-store.s3.amazonaws.com/0/246211/2002ee73-808a-f9f3-9ea8-337d3d93e37b.png)

ボタンをクリックするとViewModelで定義した関数が呼び出されます。

![typescript_knockout_index_clicked.png](https://qiita-image-store.s3.amazonaws.com/0/246211/0c0eee40-bd4a-0fef-fc8d-d595af7ff7d1.png)


## サンプルの構成

![typescript_knockout_constitution.png](https://qiita-image-store.s3.amazonaws.com/0/246211/18a63a7a-3245-68df-e28c-499fe6d6a984.png)
Visual StudioでTypeScriptを使ってみる

Visual StudioでTypeScriptを使ってみます。  
環境はVisual Studio 2015です。  

## TypeScriptのプロジェクト作成

ファイル->新規作成->プロジェクトでプロジェクト作成ダイアログを開きます。  
テンプレートからTypeScriptを使用したHTMLアプリケーションを選択します。

## 構成

このテンプレートには画面とTypeScriptファイルとcssのみが含まれています。

![constitution.PNG](https://qiita-image-store.s3.amazonaws.com/0/246211/23d4a25e-c01b-064d-2aff-cbe1ae80304c.png)


app.tsでは時間を画面に表示する処理が書かれているようです。

app.ts

``` typescript
class Greeter {
    element: HTMLElement;
    span: HTMLElement;
    timerToken: number;

    constructor(element: HTMLElement) {
        this.element = element;
        this.element.innerHTML += "The time is: ";
        this.span = document.createElement('span');
        this.element.appendChild(this.span);
        this.span.innerText = new Date().toUTCString();
    }

    start() {
        this.timerToken = setInterval(() => this.span.innerHTML = new Date().toUTCString(), 500);
    }

    stop() {
        clearTimeout(this.timerToken);
    }

}

window.onload = () => {
    var el = document.getElementById('content');
    var greeter = new Greeter(el);
    greeter.start();
};
```

画面ではトランスパイルしたファイルをソースに指定します。

index.html

``` html
<!DOCTYPE html>

<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>TypeScript HTML App</title>
    <link rel="stylesheet" href="app.css" type="text/css" />
    <script src="app.js"></script>
</head>
<body>
    <h1>TypeScript HTML App</h1>

    <div id="content"></div>
</body>
</html>
```

## ビルド

ソリューションをビルドしてみます。  
ビルドするとtsがjsにトランスパイルされます。

![js.PNG](https://qiita-image-store.s3.amazonaws.com/0/246211/601688ad-62b3-9373-52d1-c5fedc3bf890.png)

app.js

``` javascript
var Greeter = (function () {
    function Greeter(element) {
        this.element = element;
        this.element.innerHTML += "The time is: ";
        this.span = document.createElement('span');
        this.element.appendChild(this.span);
        this.span.innerText = new Date().toUTCString();
    }
    Greeter.prototype.start = function () {
        var _this = this;
        this.timerToken = setInterval(function () { return _this.span.innerHTML = new Date().toUTCString(); }, 500);
    };
    Greeter.prototype.stop = function () {
        clearTimeout(this.timerToken);
    };
    return Greeter;
}());
window.onload = function () {
    var el = document.getElementById('content');
    var greeter = new Greeter(el);
    greeter.start();
};
//# sourceMappingURL=app.js.map
```

## 実行

ソリューションを実行すると下記画面が表示されます。  

![index.png](https://qiita-image-store.s3.amazonaws.com/0/246211/5bf8cfb0-18b6-a5be-fa9b-c78b01cdea71.png)


## TypeScriptのビルド設定

ソリューションを右クリックし、プロパティを表示します。  
左側にあるTypeScriptビルドを選択すると設定が表示されます。

![typescript_build_setting.PNG](https://qiita-image-store.s3.amazonaws.com/0/246211/17e922fb-092c-2531-8ae0-ab01123d3452.png)



## まとめ

Visual StudioでTypeScriptファイルを含むソリューションをビルドするとTypeScriptファイルからJavaScriptファイルにトランスパイルされます。  
画面で読み込む際にはトランスパイルされたJavaScriptファイルを参照しましょう。
Emacsのキーボードマクロでアルファベットの連番を入力する方法

数字の連番の入力方法はググればいろいろ見つかるのですが、**アルファベットの場合** がなかなかわからなかったので調べてみました。

| 操作              | 意味            |
|------------------|-----------------|
| C-x C-k C-c ?a   | a から始める    |
| C-x C-k C-f %c   | %d から %c に変更←**重要なのはここだけ** |
| C-x (            | キーボードマクロ開始 |
| C-x C-k C-i      | a, b, c... と入力させる |
| C-x )            | キーボードマクロ終了 |
| C-x e e e ...    | キーボードマクロ実行 |

当初 `M-: (insert (format "%c" C-x C-k C-i ))` みたいなことをしていたんですが <kbd>C-x C-k C-f</kbd> で書式を変更できることを知りました。
書式には他の文字列も含められるので `(%c)` のようにしたら `(a) (b) (c) ...` と入力できました。

# 参照

Keyboard Macro Counter - GNU Emacs Manual
http://www.gnu.org/software/emacs/manual/html_node/emacs/Keyboard-Macro-Counter.html#Keyboard-Macro-Counterundefined
MacのlocalhostにiPhoneで接続する方法

ローカル環境で開発していて、テストサーバに上げる前に自分のiPhoneで確認したい、というときのメモです。MacとiPhoneが同じWi-Fiに接続している状態で、自分のMacに接続する方法。

## iPhoneの設定

1. iPhoneで設定を開く。
2. Wi-Fi > 接続するネットワークのiボタンをタップ。
3. 「HTTPプロキシ」の設定を手動にする。
4. サーバにMacのIPアドレスを入力。
5. ポートにローカルホストのポート番号（8080とか）を入力。

## MacのIPアドレスの確認方法
システム環境設定 > ネットワーク を開けば見れます。

## iPhoneでチェック
その後、SafariとかのiPhoneブラウザで普通にlocalhostからのアドレスを入力すれば接続できるようになります。
Puppeteerで困っていること

## はじめに
別記事でテストツール比較としてPuppeteerとSeleniumの比較を行いました。
（Puppeteerはテストツールではないけど）
その中でPuppeteerの操作を思ったように実装できなかったので書き溜めておきます。

## 実装できなかった動き
[フロントエンド・テストツール比較 Puppeteer #02テスト編](https://qiita.com/creaith/items/cde0cbf56c88021b534d)
この記事で実装できなかったブラウザの動きは以下の三点
> 1. アサーションについてはpuppetterの機能ではできないので省略。nodeのパッケージを別途用意してください。（Seleniumのようなテストツールじゃないので仕方なしか？）  
2. ドラッグ＆ドロップについては、puppetterのAPIであるmouse.up()の不具合（？）により実装不可。
3. ブラウザバックについては、page.goBack()が用意されているがこれを実装するとブラウザバックはしてくれるが、その後puppeteerが終了しなくなる。

(1については触れないでおきます。)

## どのように実装しようとしたか
### ドラッグ＆ドロップについて
[この画面](https://qiita.com/creaith/items/cde0cbf56c88021b534d#%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E5%BE%8C%E3%81%AE%E4%B8%80%E8%A6%A7%E7%94%BB%E9%9D%A2%E3%81%AE%E6%93%8D%E4%BD%9C)のリスト部分には、それぞれIDを`list_label1`,`list_label2`,`list_label3`とふってあります。

```script.js
(async () => {
    const browser = await puppeteer.launch({
        args: [
            '--no-sandbox',
            '--disable-setuid-sandbox'
        ]
    });

    // 新規ページを開く
    const page = await browser.newPage();

		(省略)

    const list3 = await page.$('#list_label3');
    const rect3 = await list3.boundingBox();

    const list1 = await page.$('#list_label1');
    const rect1 = await list1.boundingBox();

    await page.mouse.move(rect3.x + rect3.width / 2, rect3.y + rect1.height / 2);
    await page.mouse.down();
    await page.mouse.move(rect1.x + rect1.width / 2, rect1.y + rect1.height / 2);
    await page.mouse.up();

    await page.screenshot({path: 'image/sample.png'});

	// ブラウザを閉じる
    browser.close();
})();
```
上の処理では、一番上にある要素`#list_label3`を一番下に移動させようとして書いたものです。
実行し、スクリーンショットを確認してもリストの要素の入れ替えは行われていません。  

```
await page.mouse.up();
```
この処理がうまく動作していないのが原因だと思っているが、どうなんだろう。
処理自体にエラーはなく、nodeも正常に終了しています。
しかし私の環境ではテスト終了後、エディタにカーソルをもっていくと常に何かをドラッグしている挙動が発生します。
OSに影響（？）がでてちょっと大変。どうすればいいんだろう。

おそらくこれが関係ある？
[関連issue](https://github.com/GoogleChrome/puppeteer/issues/1265)

### ブラウザバックについて

```
await page.goBack();
```
任意のページへ遷移した後、上記の処理で元の画面に戻ろうと上記の処理を実装した。
ヘッドレスモードをオフにして画面を確認してみると、戻ってはいる。
しかしその後の処理が続行されず、タイムアウトでnodeが落ちます。
以下がエラー

```
(node:26682) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Navigation Timeout Exceeded: 30000ms exceeded
(node:26682) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
```
これ is 何。よくわからない。
とりあえずこれが課題なんだろうか？？[関連issue](https://github.com/GoogleChrome/puppeteer/issues/1166)

## まとめ
本当はここでどう解決するかを書くのがベストなんでしょうけど、力尽きてます…ｗ
皆さんのお力をお借りしてサクッと解決したい他力本願主義ですいません。
よろしくお願いします。

## 関連記事
puppeteerとSeleniumでいろいろやっていこうとしてます

Puppeteer編

1. [フロントエンド・テストツール比較 Puppeteer #01環境構築編]()
* [フロントエンド・テストツール比較 Puppeteer #02テスト編]()

Selenium編

1. [フロントエンド・テストツール比較 Selenium #01環境構築編]()
* [フロントエンド・テストツール比較 Selenium #02テスト編]()
bootstrap3 modal 背景をスクロールさせない

modalを使うと、背景がスクロールしてしまう。
これはご遠慮願いたい。

```

<script>
var current_scrollY;
    $(function () {
    //    modalを開いた時
        $('#profile-modal').on('shown.bs.modal', function (event) {
            current_scrollY = $( window ).scrollTop();
            $('body').css( {
                position: 'fixed',
                width: '100%',
                top: -1 * current_scrollY
            } );
        });

        //  modalを閉じた時
        $('#profile-modal').on('hidden.bs.modal', function (event) {
            $( 'body' ).attr( { style: '' } );
            $( 'html, body' ).prop( { scrollTop: current_scrollY } );
        });

    });


</script>

```

これでOK
SQL/ActiveRecord：or句では前方の条件に一致するレコードがあっても後方の条件は破棄されず評価される

# コード
```ruby
[19] pry(main)> User.where("users.id = 1 or users.id = 2").count
   (1.0ms)  SELECT COUNT(*) FROM "users" WHERE (users.id = 1 or users.id = 2)
=> 2
```


ActiveRecordで書いても同じ（当たり前か）

```ruby
[18] pry(main)> User.where(id: 1).or(User.where(id: 2)).count
   (1.1ms)  SELECT COUNT(*) FROM "users" WHERE ("users"."id" = $1 OR "users"."id" = $2)  [["id", 1], ["id", 2]]
=> 2
```

# 補足
一件だけ取れると想定していたのですが、二件取れました。

rubyでは下記のようにor（`||` ダブルパイプ）を使用すると前方（左側）から評価されていき、trueのものが現れたらそれ以降の条件は破棄されて評価されません。

SQL/ActiveRecordのOR句も同じような評価の仕方をするのだろうと誤解していました。

```ruby
foo = 1
bar = 2

hoge = foo || bar

puts hoge
=> 1
```


# 感想

SQL/ActiveRecordとRubyは違う（当たり前）
iOS Simulatorの細かいTips

iOS開発で使うSimulatorの、少しだけ便利なTipsです。

## 1. Simulatorのウインドウサイズをドラッグで変えられる

<img width="320" alt="スクリーンショット 2018-03-29 10.51.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/10057/2c35b661-4f49-4eef-4d45-ec718a9c212d.png">

Simulatorの左下や右下にマウスをあわせるとカーソルが変形し、ドラッグで拡大/縮小することができます。

元のサイズに戻すには、Window > Physical Size を選択します。（ショートカットは⌘1）
<img width="200" src="https://qiita-image-store.s3.amazonaws.com/0/10057/87961982-ea56-d98e-45bb-31d018a92b66.png">

## 2. トラックパッドで3本指スクロールを有効にする

タイムラインなど縦に長い画面をデバッグするとき、縦にスクロールして下の方まで動かすのが大変です。
トラックパッドの3本指スクロールを有効にすることで、かなり楽になります。

**システム環境設定 > アクセシビリティ > マウスとトラックパッド**

を選択して、

トラックパッドオプションをクリックして開くメニューで、「ドラッグを有効にする」に「3本指のドラッグ」を割り当てます。

<img width="600" alt="スクリーンショット 2018-03-29 10.55.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/10057/c92ec4d4-6c2d-a186-e19e-58fbd717aa4a.png">

Simulator上で3本指ドラッグをすると、高速にスクロールできるはずです。


## 3. ブラウザなどでコピーした文字列をSimulatorのアプリで貼り付ける

<img width="600" src="https://qiita-image-store.s3.amazonaws.com/0/10057/927d3998-1207-3c4a-b992-0d1622878d35.png">

ブラウザやメモアプリで文字列をコピーした状態とします。

Simulatorにフォーカスが当たった状態で **⌘Vを入力（またはEdit > Paste）**すると、iOS Simulatorのクリップボードに文字列がペーストされます。
この状態で上の画像の吹き出しの中の「Paste」を選択すると、貼り付けることができます。


## 4. JISキーボードで"_"を入力する

めちゃくちゃ細かいtipsです。

JISキーボードでは「ろ」のキーで "_" が入力できますが、Simulatorではこれができません。
**Shift+「ほ」のキー** で入力できます。

これになかなか気づけず不便な思いをしたので、tipsとして書きました。
macでphpstorm のxdebugがやっと動いた

# ローカル

①phpバージョン確認でxdebug入ってるか確認

```ruby:ターミナル
php -v
PHP 7.1.14 (cli) (built: Feb  2 2018 08:42:59) ( NTS )
Copyright (c) 1997-2018 The PHP Group
```

はい、デフォルトでは入ってないね

②xdebugをインストール
※phpのバージョンに合わせて

```ruby:ターミナル
brew install php71-xdebug
```

③再度確認

```ruby:ターミナル
php -v
PHP 7.1.14 (cli) (built: Feb  2 2018 08:42:59) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
    with Xdebug v2.6.0, Copyright (c) 2002-2018, by Derick Rethans
```

これでローカルにもxdebugが入った


# vagrant/homestead

①SSHログイン

```ruby:ターミナル
vagrant ssh
```

②PHPにデバッグで使うideキーを追記
※homesteadは複数のバージョンのPHPがあるので使うバーションを指定すること

```ruby:ターミナル
sudo vim /etc/php/５．６/fpm/conf.d/20-xdebug.ini
```

最後の行に下記の１行を追加

```ruby:ターミナル
xdebug.idekey = "PHPSTORM"
```

で保存

```ruby:ターミナル
：wq
```


# PHPSTORM
①PHPの指定
prefarences -> languages&flameworks -> php

CLIインタープリターが最初は何も入ってないので指定してあげる
「・・・」をクリック

「＋」をクリックすると、PHP関連の選択肢が出てくるので選択する
俺の場合は「/usr/local/Cellar/php71/7.1.14_25/bin/php」
→MACのPHPがどこに入ってるかわからんくてめちゃ悩んだで・・・

そしたら「デバッガー：Xdebug2.6.0」が表示されていればOK
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246228/d46c056a-62d8-ece3-5526-850276311199.png)

②SERVERの指定
prefarences -> languages&flameworks -> php -> server

名前：homestead
ホスト：xxx.test(自分で指定したURL)
ポート：80
デバッガー:xdebug
プロジェクトファイルに合わせたサーバー上のパスを指定：/home/vagrant/code/xxx

でOK

③デバックの構成を編集
実行 -> 構成の編集

「＋」
PHPリモート・デバッグ

名前：homestead
サーバー：②で指定したhomestead
ideキー：PHPSTORM

でOK

④デバッグ実行

⑤デバッグで止めたいところにマーク

⑥ブラウザでURLをたたく前に下記をブックマークに保存しておく

Start debugger

```ruby:ブラウザーのブックマーク
javascript:(/** @version 0.5.2 */function() {document.cookie='XDEBUG_SESSION='+'PHPSTORM'+';path=/;';})()
```

ちなみに Stop debuggerはこれ

```ruby:ブラウザーのブックマーク
javascript:(/** @version 0.5.2 */function() {document.cookie='XDEBUG_SESSION='+''+';expires=Mon, 05 Jul 2000 00:00:00 GMT;path=/;';})()
```

⑦⑥のStart debuggerをクリック

⑧ブラウザでURLを叩く

そしたらデバッグで止まった！
Javascriptのin演算子とhasOwnPropertyの違い	

言語仕様を意識せずになんとなく書いていたところがあるのですが、確認してみました。
結論から述べると、

- inはプロトタイプチェーンをたどって走査する
- hasOwnPropertyはプロトタイプチェーンをたどらない

となります。

確認に使ったコードは下記です。
toStringはObjectが保有するプロパティ。
→https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/toString


```javascript:property.js
// プロトタイプチェーンの確認
const myObject = {
  foo: 'prop1',
  bar: ['a', 'b', 'c'],
};

/*
  hasOwnPropertyは、対象のオブジェクトが持っているプロパティを判定する。
  プロトタイプチェーンを走査しない。
*/
console.log('[hasOwnProperty]');
console.log('foo: ', myObject.hasOwnProperty('foo')); // true
console.log('toString: ', myObject.hasOwnProperty('toString')); // false

/*
  inは、プロトタイプチェーンまで走査してプロパティの有無を判定する
*/
console.log('[in]');
console.log('foo: ', ('foo' in myObject));  // true
console.log('toString: ', ('toString' in myObject));  // true

```
Android開発者登録 2018年3月Ver.


Androidのアプリを作りたい時に
まず必要なのが、開発者登録（デベロッパー登録）です！

開発者登録の手順はころころ変更が入るのですが、
今回は2018年3月時点での手順を書いていきたいと思います。

# 準備するもの

・Googleアカウント
・25ドル

登録する時にまず必要になるのが「Googleアカウント」です。
開発時に使用する「Googleアカウント」（Gmail）を用意してください。

普段プライベートで使っているGmailでも登録はできますが、
Gmailに対してアプリ開発者としての情報を入力していき、
またアプリリリース後もログイン時などに使い続けるものになるので、
開発用に別途準備する方がよいと思います。

また、開発者として登録するためには25ドルの支払いが必要です。
ちなみにApple（iPhone用アプリなど）の開発者登録の場合は
毎年10,000円くらいの支払いが必要になりますが、
Androidの場合は初回に一回支払えばおしまいです。
（今回支払った時点では、25ドルは約2,670円でした）

準備ができたら、
次の手順でいよいよ開発者登録をしていきます！

### 開発者登録

https://www.google.co.jp の右上から、
Android開発時に使うGmailを使ってログイン。

![Androidデベロッパー登録00_1.png](https://qiita-image-store.s3.amazonaws.com/0/113935/324f1c04-f92e-bb0f-f208-e3ced90fb663.png)

https://play.google.com/settings/ を開き、
下にある「デベロッパー」をクリック。

![Androidデベロッパー登録01.png](https://qiita-image-store.s3.amazonaws.com/0/113935/90b203fc-48b6-7043-db77-5f2c1cc3660f.png)

右上の「PLAYコンソール」をクリック

![Androidデベロッパー登録02_1.png](https://qiita-image-store.s3.amazonaws.com/0/113935/42ed34ae-02f0-09b5-2e67-5b898fecc076.png)

デベロッパー契約を確認し、よければチェックをつける。
販売・配布する国やクレジットカードなどを確認・準備したら、
「支払いに進む」をクリック。

販売・配布する国は、ここでは詳細をヘルプを見て確認するだけになるので、
特に入力や選択は必要ありません。

![Androidデベロッパー登録03.png](https://qiita-image-store.s3.amazonaws.com/0/113935/fe92ceb2-96d9-891e-9974-74f227a859d5.png)

クレジットカードの情報と、住所を入力します。
「CVC」はカード裏面の番号（最後の3桁）、
「住所」は日本であれば郵便番号を入れるだけでいいみたいです。

![Androidデベロッパー登録04.png](https://qiita-image-store.s3.amazonaws.com/0/113935/b1a4b413-f685-ff3e-b45a-e173ec68bea2.png)

支払い完了です！

![Androidデベロッパー登録05.png](https://qiita-image-store.s3.amazonaws.com/0/113935/ab7256b8-5e18-2b38-c7d4-bc4606aff501.png)

アカウントの詳細の入力をしていきます。

![Androidデベロッパー登録06.png](https://qiita-image-store.s3.amazonaws.com/0/113935/5cb2d7ae-2d04-032c-3fa6-e5bc19652b11.png)

【デベロッパープロフィール】
この情報は、必要に応じて「アカウントの設定」で後から変更できます。

- **デベロッパー名**
　デベロッパー名はアプリ名の下に表示されます。
　50文字以内で設定してください。

- **メールアドレス**
　登録時のGmailとは別のものでもOKなようです。
　2018年3月時点では公開はされないものになっています。

- **ウェブサイト**
　なければ登録しなくてもOKなようです。

- **電話番号**
　この電話番号は、公開されたアプリで問題が発生した場合に、
　Google から連絡を取るためのものになります。
　2018年3月時点では公開はされないものになっています。
　日本の電話番号の場合、
　市外局番の先頭の「0」を取り、
　日本の国番号の「81」を付けてください。
　（例：03-xxxx-xxxx → +81-3-xxxx-xxxx）

他に、メールサービスの設定にも必要に応じてチェックを入れてください。

![Androidデベロッパー登録07.png](https://qiita-image-store.s3.amazonaws.com/0/113935/b9bca415-5b27-334e-151f-2b622fa9c621.png)

これで登録完了です！

この先 Androidアプリをリリースする際には
このGoogle Play Consoleから作ったアプリをリリースしたり、
またリリース後にダウンロード数などを確認する際には
ここで確認ができたりします！
PerlでBuilderパターンを書いてみた。

# 概要
PerlでBuilderパターンを書いてみました。

---

# Builderパターンとは
- オブジェクト
- 必須パラメータ
- optionalパラメータ

を渡すといい感じに動的にオブジェクトを作ってくれる。

---

## wiki
Builder パターン（ビルダー・パターン）とは、GoF（Gang of Four; 4人のギャングたち）によって定義されたデザインパターンの1つである。 オブジェクトの生成過程を抽象化することによって、動的なオブジェクトの生成を可能にする。

https://ja.wikipedia.org/wiki/Builder_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

---

## Effective Java
コンストラクタの引数には, Builder オブジェクトを渡す。
Builder オブジェクトの引数には必須の情報を渡す。
任意の引数には, setter を用意する。

```
Dinner dinner  = new Dinner ("焼肉").setDrink("ビール").setDessert("アイス").build();
```

http://futurismo.biz/archives/2706

---

# Perlで実装
```DinnerBuilder.pm
package DinnerBuilder;
use strict;
use warnings;
use utf8;

use Mouse;

has food => (
    is       => 'ro',
    isa      => 'Str',
    required => 1,
);

has drink => (
    is       => 'ro',
    isa      => 'Str',
    required => 1,
);

has dessert => (
    is       => 'ro',
    isa      => 'Str',
    required => 1,
);

has price => (
    is      => 'rw',
    isa     => 'Int',
    default => 0,
);

sub create {
    my ($class, $food) = @_;

    return $class->new(
        food    => $food,
        drink   => 'none',
        dessert => 'none',
        price   => 1000,
    );
}

sub set_drink {
    my ($self, $drink) = @_;
    $self->drink = $drink;

    $self->price += 100;
    return $self;
}

sub set_dessert {
    my ($self, $dessert) = @_;
    $self->dessert = $dessert;

    $self->price += 500;
    return $self;
}

sub build {
    my $self = shift;
    return $self;
}

sub payment {
    my $self = shift;
    return join(',', ($self->food, $self->drink, $self->dessert, $self->price));
}

no Moose;
__PACKAGE__->meta->make_immutable;
```

---

```Dinner.pl
use strict;
use warnings;
use utf8;

use feature qw/say/;
use DinnerBuilder;

my $pay1 = DinnerBuilder
    ->create('Sushi')
    ->set_drink('Beer')
    ->set_dessert('Icecream')
    ->build()
    ->payment();

say $pay1;

my $pay2 = DinnerBuilder
    ->create('Sushi')
    ->build()
    ->payment();

say $pay2;
```

---

# 結果
```
$ perl Dinner.pl
Sushi,Beer,Icecream,1600
Sushi,none,none,1000
```
かっこよくて良いなと思いました。

---
webpackerでswiperを利用する際に Unexpected token: name (Dom7) と出た場合の対処法

## 結論

dom7とswiperをbabel-loaderのexcludeから外す。

```js
// config/webpack/swiper_config.js
module.exports = {
  module: {
    rules: [
      {
        test: /\.js$/,
        exclude: /node_modules\/(?!(dom7|swiper)\/).*/,
        loader: 'babel-loader'
      }
    ]
  }
};
```

```js
// config/webpack/environment.js
const { environment } = require('@rails/webpacker')
const swiperConfig = require('./swiper_config')

environment.config.merge(swiperConfig)

module.exports = environment
```

## 理由

swiperの3.4.2からES5で配布されなくなったようなので、ビルド時にトランスパイルする必要がある。コードがdom7に依存しているので、あわせてbabel-loaderの除外対象から除外する必要がある。（webpackerのデフォルトはnode_modules全体を除外している）
CentOS6環境にRabbitMQ3.7をインストール & 

# 環境
OS：CentOS6.9 64bit

# 参考URL
https://www.rabbitmq.com/install-rpm.html
https://www.erlang-solutions.com/resources/download.html
# 事前準備
### socat インストール

```
yum install epel-release
yum install --enablerepo=epel socat
```

### erlang インストール

```
wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
yum install erlang
```

# RabbitMQ インストール
(2018/09/19時点最新は、3.7.7-1)

```
wget https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.7/rabbitmq-server-3.7.7-1.el6.noarch.rpm
rpm -ivh rabbitmq-server-3.7.4-1.el6.noarch.rpm
```

# 起動設定
### OS起動時に動作するように
```
chkconfig rabbitmq-server on
```

### 手動起動・停止

```
/etc/init.d/rabbitmq-server start
or
/etc/init.d/rabbitmq-server stop
```
パッケージ管理ソフトの種類とか

# はじめに
どのOSに、どんなパッケージ管理ソフトがあるのか、知りたい。
でもマイナーなのも含めるとまとめきれないので、聞く頻度が高いやつだけ並べる。

- [RedHat系Linux](#redhat系linux)
- [Debian系Linux](#debian系linux)
- [Arch Linux](#arch-linux)
- [Windows](#windows)
- [PHP](#php)

# RedHat系Linux
(CentOSとかもここだね)

- rpm
- Yum
- DNF

## rpm
RedHat系Linux用のパッケージを管理する最初期のやつ。
依存関係を自動で解決しない。

## Yum
rpmに依存関係を自動で解決する機能を付与したみたいなの。
ていうかパッケージDL等の機能はrpmを使用してる。
rpmをラップして使いやすくしたのがこれ。
Python 2でしか動かないのと、改修めんどくさいからDNFが生まれたらしい。
2015年あたりで標準じゃなくなった。
けどたぶん2018年中は現役っしょ(古いCentOS使いつつ)。

## DNF
2015年あたりで標準になった子。
Python 2,3両方で動く子。
文法はYumから引き継いでいるから、YumをDNFに替えるだけでいい。



# Debian系Linux
(Ubuntuとかもここだね)

- dpkg
- APT

## dpkg
ローカルにあるパッケージを管理するだけ。
パッケージのDL等の機能は無い。
でもマイナーチェンジがあり、APTとの差別化は図られている。


## APT
パッケージのDLや、依存関係の解消等までこなす。
普通に使うならdpkgの上位互換。
APTにも色々マイナーチェンジがある。

### apt-get
古いやつ。古いOSならこっちしかないかも。
RedHat系で言うとYumの立ち位置。

### apt 
新しいやつ。apt-getの完全上位互換なので普通はこっち使ってね。
RedHat系で言うとDNFの立ち位置。

# Arch Linux

- pacman
- yaourt

## pacman
公式のパッケージを管理する。
地味にWindowsのUnixライクなシェル環境「MSYS2」で使うパッケージ管理もこれ。

## yaourt
非公式なパッケージを管理する。


# Windows

- Nuget
- chocolatey

## Nuget
VisualStudio(以下VSと略す)のパッケージ管理ソフトとして有名。VS2012から標準で居る。
でもNugetのバージョン上限がVSのバージョンに依存するという仕様により、VS2012のNugetじゃDL出来ないパッケージが地味にある。
そういう場合はVSとは関係なくNuget単体をDLしてインストールして、コマンドプロンプトで欲しいパッケージをDLして、VS側のパッケージ参照を手動で入れる必要がある。
常に最新のVSを使う場合なら問題ないけど、大人の事情でVS2012で止まってるとかの場合、わりかし苦労する。

- GUI = VS版Nuget
- CUI = Nuget

## chocolatey
この子が扱うパッケージの形式自体はNugetのパッケージだが、Windowsでの開発環境構築に関する**実行ファイルを含んだNugetパッケージ**を対象にしている。
クロームとか、ファイヤーフォックスとか、スカイプとか、Gitとか、nodejsとか、VisualStudioCodeとか、VisualStudioとか、とにかく見慣れたモノから、見慣れないモノまで色々。
Windowsでの開発環境をぽんぽこ構築&破壊する際、いちいち公式サイト行くのめんどいとか、
アップデート確認が超絶めんどいとか、毎回Yesとか押すのめんどいとかいう時に有効。



# PHP

- Composer

## Composer
PHP開発でパッケージを利用する場合、依存関係とか諸々解決してくれる。
さらにオートローダーも吐いてくれる優れもの。

- GUI = Composercat
- CUI = Composer
AWSでLambdaの関数を実行する

AWSでLambdaの関数を実行します。

今回で使うHelloWorldは
https://qiita.com/ep001/items/2af614843a5424a140c6
の記事で作成しています。
HelloWorld関数が必要な人はこちらを先に実施してください。


<img width="239" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/246190/f9ff9455-b31e-fe6d-d1c8-5a8a3f73cdfe.png">
サービス画面でLambdaを選択します

<img width="421" alt="スクリーンショット 2018-03-29 7.55.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/246190/2f28f0a7-f416-6349-96c5-38bbe2eeb096.png">
テストボタンを押下します。

<img width="619" alt="スクリーンショット 2018-03-29 7.56.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/246190/e5b94664-5c3d-2503-6009-ea55a372bebd.png">
イベント名を設定します。

<img width="315" alt="スクリーンショット 2018-03-29 7.57.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/246190/8ed6ceea-35b8-6d06-2c55-317729fcf449.png">
作成したイベントを選択して再度「テスト」ボタンを押下します。


<img width="1636" alt="スクリーンショット 2018-03-29 7.58.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/246190/ec2ed463-3a0d-1bc4-c0d5-e0037139bcc5.png">
「ログ」を押下する

<img width="779" alt="スクリーンショット 2018-03-29 7.59.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/246190/e0c5b26e-cb67-e1b2-28af-beaca791f4ca.png">
HelloWarldがLogで確認できました。
AWS LambdaでHolleWorldを作成

AWSのLambdaを書いていきます。

<img width="239" alt="スクリーンショット 2018-03-29 7.34.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/246190/9b3ff902-649f-15fd-534c-0be91040d34c.png">
サービス画面でLambdaを選択します。

<img width="1785" alt="スクリーンショット 2018-03-29 7.37.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/246190/da167b89-5240-f572-54e6-f2edf51f5975.png">
今回は設計図を選択します。

<img width="721" alt="スクリーンショット 2018-03-29 7.39.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/246190/ae0a3efa-b4e7-db29-42a6-49a644f49df0.png">
Hello-worldで検索し選択します。

<img width="790" alt="スクリーンショット 2018-03-29 7.40.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/246190/b73c94aa-ed3f-49e6-1bb8-319efdf6a9a1.png">
名前と権限の範囲を設定します。

<img width="955" alt="スクリーンショット 2018-03-29 7.46.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/246190/10583040-0679-11a2-a65f-77246ae9a8c9.png">
ここでソースをいじることができます。
HelloWarldを作っているのに
console.log('HelloWarld');
がないので追加しました。

<img width="1640" alt="スクリーンショット 2018-03-29 7.48.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/246190/faec55dc-a58c-1052-7433-fe02d7a1ce23.png">
これで関数は完成になります。
失敗・炎上に名前をつけることで、僕たちはもっと強く、生産的になれる。

## TL;DR

起きた失敗、炎上には名前を付けよう。
名前を付けることで似たような問題が見えやすくなる。
名前を付けることで問題に取り組みやすくなる。

名前を付けないと、見過ごされ対策されずに過ちを繰り返す。

## 「要望真に受けて無事死亡パターン」という**名前**の力

システム開発において、ユーザ要望を文字通り実装することは、
バッドノウハウであることは、読者諸賢は十二分にご存じかと思う。

しかし、これが意外と撲滅されない。
特に若手やリーダー1年目が良くやらかすから、組織としてごくありふれた失敗事例となる。

そんなある日、
「それってよくあるパターンで、名付けて”**要望真に受けて無事死亡パターン**”だよね。」
という話をしたら若手から、
「そういうあるあるパターンにキャッチーなネーミングを付けて普及させたら、
　失敗も減るんじゃないですかね？」
という素晴らしい提案を受けた。

## ジョシュアツリーの法則

これは実は昔からよく知られた、問題解決の方法論で、「ジョシュアツリーの法則」の活用とも言える。

ジョシュアツリーとは、
ある人が植物図鑑で「ジョシュアツリー」という植物を知った帰り道、
実は自分の家の近くにも植わっていて、
だけど、**名前を知るまでは、目に入っても、認識できなかった**
というエピソードに基づいている。

このことから、
**問題を認識し対応するためには、「まず名前を付けるべし」**
という教訓を生み出した法則であり、
みんな大好き [プリンシプル オブ プログラミング](https://www.amazon.co.jp/dp/B071V7MY82/?tag=gakury-22)にも掲載されている。

## プロセス改善、組織改善もまずは**キャッチーな名前から**

なにか改善をしようとするときに、無関心の壁にぶつかる人は多いのではないだろうか。

自分は、○○を改善したいと思っている。○○すればもっと良くなると思っている。
でも、周りが協力してくれない。周りがその価値を認めてくれない。
だから改善が自分ひとりで閉じてしまい、周囲に波及しない。

その無関心の壁を打ち破るためにも、問題に名前を付けるべきではないだろうか。

無関心を突破するためにも、名前で問題の認知をはかり、
時とタイミングを見て、問題にまつわる悲劇のストーリーを吹き込む。
問題意識が醸成されたタイミングで改善策と結果を吹き込む。
こうすることで無関心の壁を突破できるのではないだろうか？

## 先ず隗より始めよ

というわけで、上記の仮説の正否を確認するために、
自社内で「○○無事死亡パターン」を随時つくって普及をはかり、
その効果をおいおい、また、ここに掲載したいと思う。
AWSでIAMロールを設定する

AWSのIAMの設定方法を記します。

IAMロールはIAMのグループになります。
ユーザがロールに所属することで権限を付与することができます。

<img width="309" alt="１.png" src="https://qiita-image-store.s3.amazonaws.com/0/246190/274d68a1-a5a7-5fc7-037d-0316bda16cac.png">

AWSのサービス一覧からIAMを探します。

<img width="166" alt="スクリーンショット 2018-03-29 7.17.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/246190/c81ae930-2170-55aa-50c0-af7da4f84ee3.png">
ロールを選択します。


<img width="303" alt="スクリーンショット 2018-03-29 7.19.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/246190/7235c3da-733e-802c-e373-da8b549dbb07.png">
ロールの作成を選択します。

<img width="1027" alt="スクリーンショット 2018-03-29 7.20.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/246190/891a59a6-2a06-c99e-5596-c6fbb4b8cb53.png">
必要なロールのタイプを選択します。

<img width="998" alt="スクリーンショット 2018-03-29 7.22.01.png" src="https://qiita-image-store.s3.amazonaws.com/0/246190/4bc0764e-85b9-6302-c547-18808c5050a3.png">

ポリシーを選択します。

<img width="988" alt="スクリーンショット 2018-03-29 7.22.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/246190/aa183601-4c55-deea-a9db-caa216de799d.png">
ロールの名前を決めて完成します。
初心者向け　kintone カスタマイズ と HTML、JavaScript の学びについて（第０回）

サイボウズのWebデータベースサービス kintone には、JavaScript,HTML,CSSで見た目や動作をカスタマイズできる機能があります。
kintoneは各地に立ち上がっているユーザー会の活動も活発で、また下記リンクにあるように、サイボウズの開発者サイトでカスタマイズに関する質問やナレッジノートで開発者によるナレッジの共有も多く投稿されています。

https://developer.cybozu.io/hc/ja
>「cybozu developer network」 は、デベロッパー同士が課題を解決し合えるオープンなコミュニティです。
cybozu.com 上のサービスにおいて、API ドキュメントを調べたり、Tipsやサンプルプログラムなどに質問したり、
コミュニティを通じてデベロッパーに質問することができます。

しかし、kintone は最初の導入は用意ですが、私自身も含め、カスタマイズを行うとなると急にどうしたらよいのか分からず、そこに高い壁があるなと考えています。

その壁は何なのかを自分なりに書き出して、初心者でも、kintoneカスタマイズが気軽に、楽しくできるようになると良いなと考えています。

# cybozu developer コミュニティ の歩き方
普段私が、kintone カスタマイズの情報を、どのように調べているかをリンク付きで紹介してみます。

## cybozu developer network
https://developer.cybozu.io/hc/ja
サイボウズの開発者情報サイトのトップページです。ここで、主に更新情報欄をチェックしています。
他に、twitter の情報も流れているので、興味を持った投稿をチェックしています。

## kintone developer JP twitter
https://twitter.com/kintonedevjp
kintone の技術情報のtwitterです。フォローしています。
developer network のトピックスから、イベント情報、またkintoneに関する外部メディアの情報などが流れます。

## developer network へようこそ
https://developer.cybozu.io/hc/ja/articles/200929540
いわゆる GettingStarted。ここをステップに沿って読んでいきましょう。
ここで強くおすすめしたいのは、developer network にメンバー登録して、開発者ライセンスを取得しましょう！

#学びの進め方について
ここまで書いて本連載に当たり、カスタマイズの壁が何か？それを乗り越えるにはどんなことを学ぶ必要があるのかを書き出すことにします。
それを元に、連載のタイトルとして進めたいと思います。

- kintoneカスタマイズに必要な知識は何か？
- どんなときにkintoneのカスタマイズが必要となるのか？
- 動かない！ そんな時どうするのか？

---
追記：2020-08-28

# kintoneカスタマイズに必要な知識は何か？

何かしらのプログラミング言語で、一通りのプログラミングを経験したバックグラウンドがあると良いかと思いますが、kintoneをきっかけにしてプログラミングを初めるというのも良いかと思います。

必要となる知識をリストアップしておきます。

* JavaScript
* HTML
* ブラウザの開発者コンソールの利用方法
* エディタ or IDE
* jQuery
* REST API

これぐらいあれば良いかと思います。

---
今回はここまで。
少しづつ追記していきます。
ラズパイ3初期設定などのメモ

[前回](https://qiita.com/gn5r/items/647b581ed72a98ef52ed)に続き、ラズパイ3のメモになります。
学校での発表が終わり、初期化したので設定をする上で必要なことなどをまとめようと思います。
主に組み込みプログラムを作るので、wiringPiがファームウェアダウングレードしないと使えない(現在はどうなのでしょうか？)記憶があったので、そこら辺を中心に。
今更というかサイト巡っていれば見つかるのですけど、要所要所で...ということが多いので1つにまとめようと思います。
(僕の投稿は基本メモですので需要とかはあまり考えていません。ですが1人でも誰かのお役に立てたのなら嬉しい限りです)

## 更新と必要アプリケーションのインストール
※解像度変更や使用するインターフェイス(I2CやSPIなど)の変更などは各自でお願いします。

NOOBSなどでインストールor初期化した直後はまっさらな状態なので以下コマンドを実行
`sudo apt update && sudo apt -y upgrade && sudo apt install -y vim ibus-anthy`
更新ついでにvimとanthyをインストールしてます。世間ではEmacs派とvim派で分かれているらしいですが、僕はvimしか使ったことないのでvimにしています。ここは適宜変えていただければと。
あと、mozcは変換時のサジェストのUIがあまり好きではないのでAnthyにしてます。(偏見多くて申し訳ないです)

## ディレクトリを日本語から英語に変更する
次いで、NOOBSなどで日本語インストールした場合、HOME直下のディレクトリが日本語なので英語に変更します。
`LANG=C xdg-user-dirs-update --force`
英語になったフォルダが新しく生成されます。一度再起動してから元の日本語フォルダの削除を勧めます。
このコマンド実行直後に、規定ディレクトリが英語ディレクトリに変更されたのか不確かなので...
英語から日本語に戻す場合はこちら
`LANG=ja_JP.UTF-8 xdg-user-dirs-update --force`
こちらも実行後、再起動をお勧めします。その後、英語ディレクトリを消していただければ。

## ファームウェアダウングレード
次はwiringPiを使う人向けですが、ファームウェアのダウングレードをします。
まず、`uname -a`を実行し現在のファームウェアを確認します。
僕のラズパイ3では4.9.80(以下略)　と表示されましたので、このバージョンを4.4.xに下げます。(画像がなくて申し訳ないです。ダウングレード後にこの記事書いてます)
`sudo rpi-update 52241088c1da59a359110d39c1875cda56496764`
このコマンドで、4.4.50にダウングレードできます。
ほかバージョンにダウングレードしたい場合は[こちら](https://github.com/Hexxeh/rpi-firmware/commits/master)の対象バージョンの「kernel: Bump to x.x.xx」を探し、右側のメモ帳マーク(？)を押してハッシュ値をコピーして
`sudo rpi-update コピーしたハッシュ値`　を実行して下さい。
再起動後、再度`uname -a`実行でバージョンが正しくできたらダウングレード成功です。

## IP固定化
これはサーバー運用などでしか設定しないと思いますが、一応書いておきます。
いろいろと方法はありますが、再起動無しでやるならば、**/etc/dhcpcd.config**と**/etc/network/interfaces**の2つのファイルを編集することで出来ました。
他に効率の良いor簡略な方法があるのであれば是非お教え願いたいです。

```/etc/dhcpcd.config
interface eth0
static ip_address=192.168.0.123 ←ラズパイに割り当てたいIPアドレス
static routers=192.168.0.1 ←ルーターのIPアドレス
static domain_name_servers=192.168.0.1 ←DNS設定。僕の場合はルーターのIPと同じにしてあります。
```

次に/etc/network/interfacesの編集です。

```
auto eth0
iface eth0 inet manual
```
編集し終わったら以下コマンドを実行。

```
sudo ifup eth0     ←先にifupしないと、何故かifdownできませんでした。教えて頂きたいです…
sudo ifdown eth0
sudo ifup eth0
ifconfig eth0
```

ifconfigにてeth0を直接指定しています。ifupから少し待ってから実行すると、表示されたIPアドレスが設定したIPアドレスになっているかと思います。

## BashにGit Branchを表示する
ラズパイでGitとか使うのかわかりませんが、他Linuxディストリビューションでも流用できますので一応載せます。

`sudo vim ~/.bashrc`で編集画面へ

``` ~/.bashrc
export PS1='${debian_chroot:+($devian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\$ '

GIT_PS1_SHOWDIRTYSTATE=true　　　　　#←変更があれば*が表示される commitされてなければ+と表示
GIT_PS1_SHOWUNTRACKEDFILES=true　　 #←addされていない新規ファイルがあれば%が表示される
```

ターミナルの色設定を変更していたら各々の色になると思います。ただ、初期の黒背景には非常に相性悪いかと...

IDとパスワード記憶は

```
git config --global credential.helper cache --timeout 600 ←10分間記憶
git config --global credential.helper store　←ファイル保存 ~/.git-credentialsに保存される模様です
```
のどちらかでできます。`--global` を外せば、ローカルリポジトリ(ディレクトリ)毎に設定できますが、忘れるとcommit時に怒られます。

お疲れ様でした、以上で初期設定などのメモになります。
誤字・誤情報などありましたら指摘のほどよろしくお願いいたします。
goでfmt.Scanする際の注意点

## はじめに
Goを勉強しようと思い、せっかくなので競技プログラミング系の問題を解きながら基本文法の整理をしようとしていました。
そうなると、標準入力が発生するので、以下の投稿を参考にして実装

[Go 言語で標準入力から読み込む競技プログラミングのアレ --- 改訂第二版](https://qiita.com/tnoda_/items/b503a72eac82862d30c6)

なるべく短くしたいので、`fmt.Scan`を使って

```go
package main

import (
	"fmt"
)

func main() {
	var a string
	fmt.Scan(&a)
	fmt.Println(a)
}
```

を使うことに。

## 問題
よっしゃこれでいいでしょ！と思い、`hello world`を入力してそのまま帰ってくるか検証してみることに

```bash

$ go run practice.go
hello world
hello
```

あれ・・・？なぜかhelloだけ。

色々試行錯誤した結果[ドキュメント](http://golang.jp/pkg/fmt)を読むとこんな風に書いてました。
> ##Scan関数
`func Scan(a ...interface{}) (n int, err os.Error)`
Scanは、標準入力から読み込んだテキストをスキャンし、**スペースで区切られた値として、順に引数に格納します**。改行文字はスペースとしてカウントされます。この関数はスキャンに成功した項目数を返します。この数が、引数の数より少ないときは、errにその理由を返します。

つまり、自動で空白区切りで返してくれるんですね！
というわけで以下のように書いたら解決

```go
package main

import (
	"fmt"
)

func main() {
	var a, b string
	fmt.Scan(&a, &b)
	fmt.Println(a, b)
}
```

## 結論
ちゃんとドキュメント読みましょう！笑
cakephp3の最小開発

※まだまだ未完成です。少しずつ完成させていきます。

フレームワークには様々な機能があります。
cakephp3も同様で、なかなか全てを理解して使いこなすのは難しいです。

便利な機能だけを使う事で、プログラムが少し苦手な人でも、変にエラーではまることなく、
一定のスピード感をもって進捗を出せます。
それでもフレームワークの恩恵は十分に受けれますし、業務システムレベルなら十分に開発できます。

ここでは、cakephp3の便利な機能だけに絞って開発する「cakephp3の最小開発」を書きます。


【コントローラー】


【モデル】


【ビュー】

【設定関連】
#sql ログ出力
config/app.php

```
'Datasources' => [
 'default' => [
  'log' => true, //ここをtrueにすると logs/queries.log に出力される
```
vagrant, Ansible 使ってみた

職場でAnsibleをキャッチアップする機会をもらい、その際にやったことを残していこうと思います。
まだキャッチアップ間もないのでビジバシ突っ込んでいただけると…

## 環境
- ホスト PC: Mac
- Ubuntu ver: 16.04.4
- 仮想環境: VirtualBox
- Vagrant: 2.0.3
- ansible: 2.5.0

## Ansibleってなんだ？
- 構成管理ツール

サーバーのOSやミドルウェアに対して、あるべき姿を定義したり定例的な作業を登録しておくことで作業を効率化・短時間化したり、人的ミスが起きるリスクを減らしたりすることを目的としたツール。

[公式ドキュメント]
http://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html


# vagrantで仮想環境を作ってみる
- vagrantとは？

仮想マシンの作成と環境構築をまとめて実行できるようにしたツールのこと

[公式ドキュメント]
https://www.vagrantup.com/docs/

## Ubuntu 16.04のBoxをダウンロードする
ダウンロードするBoxを探した時に参考にしたサイトはこちら
http://www.vagrantbox.es/

```
# Boxを取得する
$vagrant box add ubuntu-16.04 https://cloud-images.ubuntu.com/xenial/current/xenial-server-cloudimg-amd64-vagrant.box
```

取得できているか確認します

```
$vagrant box list
ubuntu-16.04     (virtualbox, 0)
```

できてるーっ

次にVagrantを初期化します
このコマンドを打つことによって`Vagrantfile`という設定ファイルが作成されます

```
$vagrant init ubuntu-16.04
# ubuntu-16.04はBoxの名前になります
```

- vagrantを実行

```
$vagrant up
```

- vagrantで立てたサーバーに対して sshで接続

```
$vagrant ssh
Welcome to Ubuntu 16.04.4 LTS (GNU/Linux 4.4.0-116-generic x86_64)
```

vagrantで立てたサーバーに対してssh接続できました！

## Ansibleを使ってみる
vagrantを使い仮想環境を作り上げることが出来たので、実際にAnsibleを使っていきたいと思います

## Vagrantfileを編集し、仮想環境上にサーバーを2つたてる
- vagrantfileを以下のように設定し、仮想環境上にサーバーを2つたてます

```Vagrantfile
VAGRANTFILE_API_VERSION = '2'

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "ubuntu-16.04"

  # VM
  config.vm.define :'host1' do |host|
    host.vm.hostname = 'host1'
    host.vm.network :forwarded_port, guest: 22, host: 2001, id: "ssh"
    host.vm.network :private_network, ip: "192.168.100.11"
  end

  config.vm.define :'host2' do |host|
    host.vm.hostname = 'host2'
    host.vm.network :forwarded_port, guest: 22, host: 2002, id: "ssh"
    host.vm.network :forwarded_port, guest: 80, host: 8000, id: "http"
    host.vm.network :private_network, ip: "192.168.100.12"
  end

  config.vbguest.auto_update = false
end

```
Vagrantfileを編集後に

```
$vagrant up
```

Ansibleサーバーを`host1`,Ansibleに制御されるサーバーを`host2`とします。
Ansible はエージェントインストールの必要がないのでSSH でログインできる環境であれば、ただそれだけで構成管理の対象にすることができます

起動後にAnsibleでhost1からhost2にsshするために秘密鍵をコピーします

```
$ vagrant ssh-config host1 > ssh_config
$ scp -F ssh_config .vagrant/machines/host2/virtualbox/private_key host1:.ssh/id_rsa
```

host1からhost2にssh接続できるかを確認します
```
$vagrant ssh host1
$vagrant ssh host2
```

いよいよAnsibleをインストールします

## `host1`にAnsibleをインストール
```
# host1にsshで接続
$vagrant ssh host1

# Ansibleをインストール
$sudo apt-get update
$sudo apt-get install software-properties-common
$sudo apt-add-repository ppa:ansible/ansible
$sudo apt-get update
$sudo apt-get install ansible


vagrant@host1:~$ ansible --version
ansible 2.5.0

```
Ansibleをインストールすることが出来ました！

Ansibleは安全のために、あらかじめ指定したサーバー以外は接続しないようになっているので`/etc/ansible/hosts`ファイルに接続先のIPを追加しましょう

/etc/ansible/hosts
```
192.168.100.12
```

疎通確認を行います

```
$ansible 192.168.100.12 -m ping
192.168.100.12 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
```

無事成功しました！

一旦は疎通確認が成功したところまでまとめました。
次回はplaybookについてまとめていこうと思います！
ありがとうございました！
FreeBSD (Apache) において拡張モジュールの設定と「ログ」の取得

今回は拡張モジュールを用いてFreeBSDに機能を追加していきましょう。
Apacheには初期状態から多くのモジュールがインストールされています。

- ユーザ認証
- アクセス制限
- HTTPSプロトコルの実装
- Proxy機能
- ログ

などなど・・・
　　
## 現状の確認
まずは現状でどれだけのモジュールが既に組み込まれているのか確認して見ましょう。
httpdコマンドに「-M」オプションを付けると組み込まれているモジュールを一覧表示できます。モジュール名の横に付いている（static/shared）はモジュールタイプを示しており、

「static」は静的リンクを使用しており、Apacheのインストール時から組み込まれているものです。「shared」は動的リンクを使用しており、必要に応じて組み込むことのできるモジュールです。

```java:組み込み済みモジュールの確認
$ su    ←まずはスーパーユーザになって下さい
# httpd -M
Loaded Modules:
 core_module (static)
 so_module (static)
 http_module (static)
 ...



 logio_module (shared)
 socache_shmcb_module (shared)
```  
静的なものは切り離し・組み込みの際にApacheを再インストールする必要があります。
一方、動的なものは設定ファイルで簡単に有効 / 無効を切り替えることができます。  
  
  
  
## mod_statusの利用
では、簡単にモジュールを追加して見ましょう。  

```java:mod_statusのインストール
まずhttpd.confを編集します
# vim /usr/local/etc/apache24/httpd.conf
↓httpd.conf↓
#Server configuration
ServerRoot "/usr/local"
Listen 80

#LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so
LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so
...ずっと続きます。変更点は以下です。
（「＃」はコメントアウト）

LoadModule status_module libexec/apache24/mod_status.so
コメントアウトを外す
status_moduleとういモジュールをロードしてくれます

ExtendedStatus On
追加情報を表示

<Location /server-status>
        SetHandler server-status
        Order Deny,Allow
        Deny from all
        Allow from 192.168.56.1   ←192.168.56.1からのみ見られるように設定
</Location>
これらは追記して下さい
```

設定完了後、apachectlを用いてApacheを再起動を行い、アクセスを許可されたクライアントから**「http://サーバ名/server-status」**に接続します。
　　
以下のようなページが表示されたら成功です。
![server-status.png](https://qiita-image-store.s3.amazonaws.com/0/241572/add33aa3-61f3-a8dd-22c8-ee3ae0d52f08.png)  

  
  
  
  
またURLに「?auto」に付加した**「http://ホスト名/server-status?auto」**を指定することで文字列としてサーバステータスを取得できます。
![server-status?auto.png](https://qiita-image-store.s3.amazonaws.com/0/241572/4efeca45-d203-f549-366d-634108448ee8.png)
  
## ログの設定
ではいよいよログについてやっていきます。**「カスタムログ」**を用いることで、URL参照元やクライアント情報などをログ出力に加えることができます。　　
それでは先ほどと同様にhttpd.confを編集していきます。

```java:ログの設定
# vim /usr/local/etc/apache24/httpd.conf
↓httpd.conf↓
#Server configuration
ServerRoot "/usr/local"
Listen 80

#LoadModule mpm_event_module libexec/apache24/mod_mpm_event.so
LoadModule mpm_prefork_module libexec/apache24/mod_mpm_prefork.so
...ずっと続きます。変更点は以下です。



#以下の２行のコメントアウトを外して下さい
LoadModule log_config_module libexec/apache24/mod_log_config.so  ←ログを拡張できる
LoadModule logio_module libexec/apache24/mod_logio.so

#エラーログの設定
ErrorLog "/var/log/httpd-error.log"  ←エラーログの出力先の設定
LogLevel warn  ←ログレベルの設定

#カスタムログの設定
<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined  ←ログフォーマット「combined」の定義
    LogFormat "%h %l %u %t \"%r\" %>s %b" common  ←  ログフォーマット「common」の定義

    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio ←ログフォーマット「combinedio」の定義
    </IfModule>

    CustomLog "/var/log/httpd-access.log" common ←/var/log/httpd-access.logにcommonのフォーマットに従って記述する
</IfModule>
```  
ではアクセスログを見てみましょう。  
![access_log.png](https://qiita-image-store.s3.amazonaws.com/0/241572/705543ab-887e-b216-831a-da3d5a3626a8.png)
  
まあ外と繋がっていないのでアクセスは自分だけです。笑
以上で今回は終了です。