OmniAICreator/Qiita-1.07M huggingface dataset:
baserCMS データーバリデーションの問題

プラグインに新しいモデルを作って、コントローラー側でデーターバリデーションを使う時、
$this->Model名->validates()のことがうまく動いてなかったら、
プラグインの```setting.php```の**'userModel'**の設定を確認してみましょう！
いつも問題になることにはありませんが、問題があったら必ず**プラグイン名も**追加してください。

```setting.php
 <?php
  $config['BcAuthPrefix'] = array(
	'mypage' => array(
		'name'		    => 'マイページ',
		'alias'		    => 'mypage',
		'loginRedirect'	=> '',
		'loginTitle'	=> '',
		'userModel'	    => 'プラグイン名.モデル名',
		'loginAction'	=> '',
		'logoutAction'  => '',
		'toolbar'	    => false,
		'username'	    => 'name',
		'password'	    => 'password',
		'sessionKey'	=> '',
		'passwordHasher'=> ''
	)

```
laravelのSQLのログの出し方

laravelで実行されたSQLを確認しようとする際に、bindされた変数を置換するのが面倒なのでそのまま実行可能なSQLをログに吐き出す方法。

```app/Providers/AppServiceProvider.php
    public function boot()
    {
        \DB::listen(function ($query) {
            $sql = $query->sql;
            for ($i = 0; $i < count($query->bindings); $i++) {
                $sql = preg_replace("/\?/", $query->bindings[$i], $sql, 1);
            }
            \Log::info($sql);
        });
    }
```
いろいろ演習してよかったメモ

最近、暇つぶしに[ハッカーランク](https://www.hackerrank.com/)にはまってます。。。


# 1. 配列aの最大公倍数にnをかけた値がいくつ配列Bに含まれるかの演習
[こちら](http://simanman.hatenablog.com/entry/2013/03/24/212452)に良い書き方が載っていたので忘れないようにメモっておきます。

1. LCMとは最小公倍数
2. GCDとは最大公約数　
2. Arrayに機能をInject

```ruby
def getTotalX(a, b)
    # Complete this function
    # 1. find the LCM of all the integers of array A. 最小公倍数　least common multiple
    lcm1 = a.lcm
    # 2. find the GCD of all the integers of array B. 最大公約数　	greatest common divisor
    lcd1 = b.gcd 
    # 3. Count the number of multiples of LCM that evenly divides the GCD.
    count = 0
    for m in 1..100 do
       if (lcd1 % (lcm1 * m)) == 0 then
        count += 1
       end
    end
    puts count
end
    
class Array
  def lcm
    self.inject{|a,b| a.lcm(b)}
  end

  def gcd
    self.inject{|a,b| a.gcd(b)}
  end
end
```
numpy.core.records.fromarrays

```python
def pR(Z):
 print(Z)
 R = np.core.records.fromarrays(Z, names='col1, col2, col3', formats='S8, f8, i8')
 print(R.col1)
 print(R.col2)
 print(R.col3)
 print(R)

Z = np.array([("Hello", 2.5, 3),
              ("World", 3.6, 2)])
#pR(Z) # invalid:mismatch between the number of fields and the number of arrays
pR(Z.T)
```
```
[['Hello' 'World']
 ['2.5' '3.6']
 ['3' '2']]
['Hello' 'World']
[ 2.5  3.6]
[3 2]
[('Hello', 2.5, 3) ('World', 3.6, 2)]
```
# Refs.
* [numpy.core.records.fromarrays](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.core.records.fromarrays.html)
Eclipse Oxygen の Java 開発環境を日本語化 

babel.eclipse.org でダウンロードできる言語パックのなかから下記を選択した状態です。
- 2017/08/19 時点の翻訳データに基づいてリリースされた、R0.15.0 での結果です。
- 2017/12/31 時点の翻訳データに基づいてリリースされた、R0.15.1 では試していませんが、8月20日以降に追加した翻訳データは微小なので、ほとんど変わらないと予想されます。

|プラグイン名|翻訳率|
|:---------:|:---:|
|eclipse|92.48|
|modeling.emf|75.93|
|mylyn|79.14|
|technology.egit|72.42|
|technology.jgit|15.09|
|technology.packaging|56.22|
|technology.packaging.mpc|61.28|
|technology.recommenders|16.01|
|webtools|84.99|


![ecl_oxy_capture.png](https://qiita-image-store.s3.amazonaws.com/0/27855/f614c985-9082-9d4b-37e0-416aea434a14.png)
python seleneのCookie情報をrequestsに渡してアクセスする方法

Seleneを使ってログインをした後、Selene/Seleniumでは処理しづらく、urllibやrequestsなどの別ライブラリを併用したくなるようなケースに遭遇する事があります。
その場合、SeleneのCookie情報を取得し、別ライブラリに渡すとことで解決するのですが、方法が特殊なのかあまり例が見当たらないので調べて見ました。
今回はSeleneを使ってログイン後、Cookieをrequestsにセットする方法を試しています。

```python
import os
from selene.browsers import BrowserName
from selene.api import *
import requests

TARGET_URL = {ログイン対象のURL}
LOGIN_ID = os.getenv("LOGIN_ID")
PASSWORD = os.getenv("PASSWORD")

def main():
    try:
        # 利用ブラウザを設定
        config.browser_name = BrowserName.CHROME
        # 対象ページを開き、IDとPASSWORDをセットしてログイン（仮）
        browser.open_url(TARGET_URL)
        s('input[id="login_id"').set(LOGIN_ID)
        s('input[id="password"').set(PASSWORD)
        s('input[id="submit"').click()

        # Cookieを取得
        cookies = browser.driver().get_cookies()
        # 取得したCookieをrequestsに渡す形に変換
        d = []
        for cookie in cookies:
            d[cookie["name"] ] = cookie["value"]

        # user-agent設定（必要なら）
        headers = {
            'User-Agent': 'Mozilla/5.0 xxxx'
        }

        # Cookieを引数にrequestを呼び出し
        request_url = {クッキーが必要なURL}
        r = requests.get(request_url, headers=headers, cookies=d)
        print(r.text)
    except:
        raise


if __name__ == '__main__':
    main()
```

Seleneでログイン後、HTMLそのものを取得したい場合、HTMLをPDF等に変換したい場合など、用途は限定的だと思いますが、知っておくと便利。
IT派遣について

こんにちは。@sumida1234です。
フリーの外国籍ＩＴエンジニアの方から、
>自分はｘｘｘ社のプロジェクトで派遣として働いています

と言ったことをよく聞きます。

おそらく彼らが言っている「派遣」とは、「客先に常駐して働いていること」を意味してるんだろうなと思いますが、正確に言うと、フリーの方々は派遣労働者として働くことはできません。
派遣労働者として働くには、所属している会社が派遣許可を持っていて、所属会社と雇用契約を締結していなければいけません。
変な誤解が生じないよう、「客先常駐」と「派遣」を正しく使い分けていくことをお勧めします。
又２０１５年９月に労働者派遣法が改正され、大きな改正ポイントとして、届出制であった「特定労働者派遣」が廃止され、労働者派遣事業は全て許可制となりました。

http://www.mhlw.go.jp/file/06-Seisakujouhou-11650000-Shokugyouanteikyokuhakenyukiroudoutaisakubu/0000098917.pdf

所属している会社の「派遣許可有り・無し」は、少なからずエンジニアの方々にも影響がでてくると思っています。
例えば、Ａ社のエンジニア（社員）が、自分のキャリアを考え、Ｂ社のあるプロジェクトで仕事をしたいと希望していて、Ｂ社のプロジェクトへの参画条件が「派遣契約」だった場合、Ａ社が派遣許可をもっていない場合は、そのエンジニアの方は希望するＢ社のプロジェクトには参画できないことになります。
所属している会社の「派遣許可有り・無し」により、エンジニアの方々のキャリアＵＰに影響が出る可能性が考えられます。
ご自分のキャリアＵＰの為にも、所属する会社が派遣許可を持っているかどうか、自分のキャリアＵＰを会社はどのように考えてくれるのか等を確認してみてください。
Webex Teams API Clientを使って、Botからメッセージを投稿(15秒で実装)

多少サバ読みしつつ、Webex Teams API Clientを使って、
15秒で、Botからメッセージを投稿するまでを実装してみます。

以下の記事で、**事前準備は完了しているのが前提**です。

* [Webex Teams API Clientを使って、Cisco Webex TeamsのBotを作ってみる(準備編)](https://qiita.com/thrzn41/items/ff049b972cbc6893e3c6)

**TeamsAPIClientのインスタンスも作成済みの前提**です。
以下の記事では、インスタンスは、`teams`という変数名で参照します。

**※トークンは、Botアカウントのトークンを使ってください。**

``` csharp
// Cisco Webex Teams API Clientのインスタンスを作成します。
TeamsAPIClient teams = TeamsAPI.CreateVersion1Client(protectedToken);
```

# 1. では、Botからメッセージを投稿してみます

``` csharp
var result = await teams.CreateDirectMessageAsync("your_teams_account@example.com", "Hello, Cisco Webex Teams!!");
```

`your_teams_account@example.com`の部分は、自分のCisco Webex Teamsのアカウント名にします。
これで、Botから、自分あてにメッセージが投稿されるはずです。

CreateDirectMessageAsync()は、Cisco Webex Teamsの1対1スペースにメッセージを投稿するメソッドです。
最初の引数が宛先となるCisco Webex Teamsのユーザで、2つ目の引数が投稿するメッセージのテキストです。

# 2. 成功したかどうかをチェックする

実際のアプリでは、成功したかどうかをチェックする必要があります。
こんな感じです。

``` csharp
var result = await teams.CreateDirectMessageAsync("your_teams_account@example.com", "Hello, Cisco Webex Teams!!");

if(result.IsSuccessStatus)
{
  // 成功。
  Console.WriteLine("メッセージを投稿しました: text = {0}, id = {1}", result.Data.Text, result.Data.Id);
}
else
{
  // 成功していなければ、失敗。
  Console.WriteLine("失敗しました: statusCode = {0}", result.HttpStatusCode);
}
```

戻り値を使って、成功したかどうかなどを確認できます。
成功していれば、`result.Data`に、Cisco Webex Teams APIのデータが含まれています。
メッセージを投稿した場合は、投稿したメッセージを表すオブジェクトが格納されています。
今回は、事始めなので、さくっとやってみるのが目的です。
中身の詳細は、また別途記事にする予定です。


# 3. マークダウンで投稿してみる

``` csharp
var result = await teams.CreateDirectMessageAsync("your_teams_account@example.com", "Hello, **Cisco Webex Teams!!**");
```

Cisco Webex Teams APIを使ったメッセージの投稿では、一部のMarkdownが利用可能です。
[Cisco Webex Teams APIで利用可能なMarkdownに関してはこちらを参照](https://developer.webex.com/formatting-messages.html)。

上の例では、
Hello, **Cisco Webex Teams!!**
のように、一部太字で投稿されるはずです。
3大クラウドのCPU脆弱性(Meltdown/Spectre)対応状況メモ

#AWS
1/11 Amazon Web Services ブログに下記の日本語訳版が投稿されました。
**プロセッサの投機的実行に関する公開調査について**
https://aws.amazon.com/jp/blogs/news/processor_speculative_execution_research_disclosure/
***

**Processor Speculative Execution Research Disclosure**
https://aws.amazon.com/jp/security/security-bulletins/AWS-2018-013/

すでに脆弱性から保護された状態にある。
圧倒的多数のEC2で有意義なパフォーマンスへの影響も見られなかったとしている。

ただし、保護強化のため仮想マシンOSレベルでも顧客自身でパッチを適用することを推奨している。

Amazon Linux については既に更新されたカーネルが提供されており、2018年1月3日午後10時45分（GMT）以降にデフォルトの構成で起動されたEC2インスタンスにはこの更新が含まれる。
既存のインスタンスはyumのupdate kernelと仮想マシンの再起動が必要。

Windows向けには更新済みのAMIがリリースされた。
必要なパッチがインストールされ、レジストリキーが有効になっている状態。
既存のインスタンスに関してはWindows Updateによる更新またはセキュリティ更新プログラムの個別インストールが必要

1/9の更新ではOSのパッチに関する継続的な調査と分析の結果、準仮想化(PV)方式のインスタンスでは問題への保護が不十分であるとして、HVM方式への移行を強く推奨している。

ECS向けにも 更新が含まれたAmazon ECS Optimized AMI 2017.09.eがリリースされている。

Beanstalkも全てのLinuxベースのプラットフォームが更新されている
[マネージドプラットフォーム更新](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/environment-platform-update-managed.html)を設定している環境ではメンテナンスウインドウの中で自動的に更新される。
Windwosプラットフォームの更新は1/9時点で提供されていないが、顧客自身でEC2のセキュリティ更新プログラムをインストールすることは可能。

**Release: AWS Elastic Beanstalk Linux-based platform security updates on January 6, 2018**
https://aws.amazon.com/jp/releasenotes/release-aws-elastic-beanstalk-linux-based-platform-security-updates-on-january-6-2018/

#Azure
脆弱性情報の公開により、1/9までの予定だったセルフメンテナンス期間が前倒しされ、米国時間の1/3 15:30から順次VMの自動再起動が行われた。

**Securing Azure customers from CPU vulnerability**
https://azure.microsoft.com/ja-jp/blog/securing-azure-customers-from-cpu-vulnerability/

パフォーマンスに大きな影響を与えないとしているが、影響を受けた場合はAccelerated Networkingを使用することで対処することができる

**Create a Linux virtual machine with Accelerated Networking**
https://docs.microsoft.com/en-us/azure/virtual-network/create-vm-accelerated-networking-cli

またAzure はハイパーバイザー層で脆弱性に対応しているので、仮想マシンOSレベルでの対処は不要とある
ただし、本脆弱性に関わらず、セキュリティのベスト・プラクティスとしてVMのアップデートは常に行うことを推奨している

**Accelerated maintenance frequently asked questions**
https://docs.microsoft.com/en-us/azure/virtual-machines/windows/accelerated-maintenance

#GCP
Google Compute Engineのインフラストラクチャに対してはすでにパッチを適用済み。

**Google’s Mitigations Against CPU Speculative Execution Attack Methods**
https://support.google.com/faqs/answer/7622138

GCPに関しては、ライブマイグレーション技術により、ホストマシン側のメンテナンスによる
ユーザ側の作業(仮想マシンの再起動)が不要というのがAWS/Azureとは異なる点。
(AWS同様に仮想マシンレベルのパッチ適用/再起動は推奨されている)

**ライブ マイグレーションを使い、Google Compute Engine にダウンタイムのないサービス インフラストラクチャーを**
https://cloudplatform-jp.googleblog.com/2015/03/google-compute-engine.html

#追記分
まとめサイト
**Meltdown and Spectre**
https://spectreattack.com/

##IBM Cloud
2018年1月5日から2018年1月8日までに世界中のクラウドホストにパッチを適用。
ベアメタルサーバーはファームウェアのアップデートとOSのアップデートが必要。
更新可能になり次第通知される。

**We’re taking action to secure our cloud against recent security vulnerabilities**
https://www.ibm.com/blogs/bluemix/2018/01/ibm-cloud-spectre-meltdown-vulnerabilities/

## さくらインターネット
**【重要】MeltdownおよびSpectre（CPUの脆弱性）による弊社サービスへの影響について**
https://www.sakura.ad.jp/news/sakurainfo/newsentry.php?id=1832

## IDC フロンティア
> 仮想マシン収容ホストのパッチ適用の全作業は以下日程を予定しています。
> 1月5日(金) 19時00分 から 1月10日(水) 22時00分 まで

**MeltdownおよびSpectre脆弱性への対応ついて**
https://www.idcf.jp/topics/20180105001.html
PythonでNimの関数を使う


#はじめに
Nimが結構速くて良さげなのでNimで書いた処理をPythonで使ってみます。

#準備
MacでのNimのインストールは

```console
$ brew install nim
```

でできます。
<br />


コンパイルは

```console
$ nim c test.nim
```

#本題
今回はフィボナッチ数を求める関数を作ります。

```nim:test.nim
proc fib_nim(n: int): int {. exportc, dynlib .} =
  if n < 2:
    return n
  else:
    return fib_nim(n - 1) + fib_nim(n - 2)
```
`{. exportc, dynlib .}` は共有ライブラリ化するのに必要なようです。
<br />


保存して共有ライブラリにコンパイル

```console
$ nim c --app:lib -d:release test.nim
```

コンパイルすると`libtest.dylib`というファイルができているので、それをPythonで利用する。

```python3:main.py
from ctypes import *

def fib_nim(n):
    test_lib = CDLL('./libtest.dylib')
    return test_lib.fib_nim(n)

print(fib_num(40))
```

<br />

実行してみると

```console
$ python main.py
102334155
```

#速度比較
Pythonで書いたフィボナッチ数を求める処理と比較してみます。

```python3:fib_py.py
def fib_py(n):
  if n < 2:
    return n
  else:
    return fib_py(n - 1) + fib_py(n - 2)

print(fib_py(40))
```
<br />

`fib_py.py` の実行速度は

```console
$ time python fib_py.py
102334155
python fib_py.py  52.65s user 0.15s system 99% cpu 52.977 total
```
<br />

Nimで作成した共有ライブラリを用いた場合

```console
$ time python main.py
102334155
python main.py  0.70s user 0.07s system 94% cpu 0.812 total
```


#最後に
Nimは速度かなり出るので使い所ありそうって感じです。
dockerからdocker-ceへアップデートするときにやったこと

# 最初に
基本的にドキュメント通りに対応するだけで問題なくアップデートできると思います。

参考（というかそのまま）
http://docs.docker.jp/engine/installation/linux/docker-ce/centos.html

# 環境
windows + VirtualBox + vagrantで仮想マシンのcentos7上にdockerをインストールしています。


# アップデート手順
## dockerをアンインストール
dockerをアンインストールしてもコンテナやイメージは消えず、docker-ceで継続して利用可能です。

```
$ sudo yum remove docker docker-common docker-selinux docker-engine
```
## OSアップデート
メンテナンスされているcentosでないと動きません。
古いcentosだと`oci runtime error`が発生しコンテナを起動できません。

```
$ sudo yum update
$ sudo reboot
```
## docker-ceのインストール
stable（安定版）のインストールです。edge、testingが利用したい場合は別途有効化が必要です。

```
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
$ sudo yum-config-manager --add-repo  https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum makecache fast
$ sudo yum install docker-ce
```
## docker設定
プライベートレジストリをhttpで利用していたので設定
元々は`/etc/sysconfig/docker`内のOPTIONSに`--insecure-registry`で指定していたもの

```
$ sudo vi /etc/docker/daemon.json

{
  "insecure-registries" : ["xxx.xxx.xxx.xxx:5000"]
}
```
## docker起動
```
$ sudo systemctl enable docker
$ sudo systemctl start docker
```
## 動作確認
```
$ sudo docker run hello-world
```

## 追記（2018/03/07）
Amazon linux 2に新規インストールしようとしたらエラーが出てしまったのでついでに記載

```
$ sudo yum install -y http://mirror.centos.org/centos/7/extras/x86_64/Packages/container-selinux-2.21-1.el7.noarch.rpm
$ sudo yum-config-manager --add-repo  https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum makecache fast
$ sudo yum install docker-ce
```
AzureマーケットプレースのRedmineにLet’s Encryptの証明書を設定する

# 前提
* bitnamiのVMイメージを使ってRedmineを構築していること

　　参考：[Azure上にRedmineを立てる \- Qiita](https://qiita.com/sunack/items/1acf7e3f852bd2108471)

# Let's Encryptの証明書を取得
```bash:bash
#install
wget https://dl.eff.org/certbot-auto
chmod a+x certbot-auto
./certbot-auto #注意：関連するyumやaptのパッケージが実行時にアップデートされる

#証明書の取得
./certbot-auto certonly --webroot -w /var/www/html -d <your domain ex. www.example.com>
# E-Mailアドレスの入力
# 80ポートのオープンが必要

./certbot-auto certonly --webroot -w /opt/bitnami/apps/redmine/htdocs/public -d <your domain ex. www.example.com>

#取得した証明書の確認 (liveは最新の証明書へのシンボリックリンク)
sudo ls /etc/letsencrypt/archive/
sudo ls /etc/letsencrypt/live/

```
  参考: [Let's encrypt運用のベストプラクティス \- Qiita](https://qiita.com/tkykmw/items/9b6ba55bb2a6a5d90963)


  参考：[Let's Encrypt の使い方 \- Let's Encrypt 総合ポータル](https://letsencrypt.jp/usage/)

# Apacheに証明書を設定する
```bash:bash
sudo vi /opt/bitnami/apache2/conf/bitnami/bitnami.conf
```

```bash:bitnami.conf
SSLCertificateFile “/etc/letsencrypt/live/<your domain nane>/fullchain.pem”
SSLCertificateKeyFile “/etc/letsencrypt/live/<your domain name>/privkey.pem”
```

```bash:bash
sudo /opt/bitnami/ctlscript.sh restart apache
```
　　
## httpアクセスをhttpsへリダイレクトする
```bash:bash
sudo vi /opt/bitnami/apps/redmine/conf/httpd-prefix.conf 
```

```bash:httpd-prefix.conf
#先頭に追記
RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/(.*) https://%{SERVER_NAME}/$1 [R,L]
```

```bash:bash
sudo /opt/bitnami/ctlscript.sh restart apache
```

## 証明書を更新する
Let’s Encrypt の証明書は3ヶ月で切れるので更新する

```bash:bash
#Redmine関連のサービスを全て止める
sudo /opt/bitnami/ctlscript.sh stop
```

80ポートへインターネットからアクセスできるようにNSGやファイアウォールをオープンする

```bash:bash
./certbot-auto renew --standalone
./certbot-auto renew --standalone --force-renewal
```

再度NSGやファイアウォールを閉じる

```bash:bash
#Redmine関連のサービスを全て再開
sudo /opt/bitnami/ctlscript.sh start
```
エクスペクト・パトローナム！守護霊よ来たれ！ くらいわかりやすい呪文「git push origin master」

# Gitコマンド、呪文みたいだよね

みなさんこんにちは。

```
git push origin master
```

Git、いきなり使い始めると、

Gitコマンドがただの呪文のように見えますよね。


Gitコマンド使い始めの頃は、

ハリーポッターででてくる浮遊呪文

<b>「ウィンガディアム・レヴィオーサ！」</b>

みたいに、

単語自体には意味がない、丸覚えするしかないものだと思ってました。

※　きっとこれも調べたら意味はあるとは思います


# 実は「エクスペクト・パトローナム」くらいわかりやすい

ハリーポッターに、

<b>エクスペクト・パトローナム（守護霊よ来たれ）</b>

![30357927_1355212412_236large.jpg](https://qiita-image-store.s3.amazonaws.com/0/74851/980a28b1-3c74-e4e1-2ccf-c147f78893a6.jpeg)

って呪文がありますよね。

これをとなえると、

たしかきれいな馬みたいな守護霊がやってきて、

ディメンターをふっとばしてくれる、そんなすごい呪文です。



実はこの呪文、メッチャわかりやすい呪文なんですよ。

> ラテン語Expecto「期待する、待ち望む」

> ラテン語patronus「救世主、霊、守護の聖者」

なので、そのまんまなんですよね。


## なにがいいたいかっていうと

```bash
$ git push origin master
```

この呪文も、じつはめっちゃわかりやすくて、

そのまま解釈できるってことなんです。


# git push origin master

## git

Gitコマンドですよ


## push

リポジトリにソースコードを送りますよ


## origin

originというリポジトリに送りますよ


## master

masterブランチに送りますよ


以上です。簡単でしょ？


# originというリポジトリって何？

```bash
$ git remote show origin
```

と打ってみましょう。

```bash
* remote origin
  Fetch URL: git@github.com:carotene4035/hoge.git
  Push  URL: git@github.com:carotene4035/hoge.git
```
こんなのがでてきますよね。

この「origin」というのは、実はリポジトリURLの<span style="font-size: 150%">あだな</span>のようなもので、

```bash
$ git push origin master
```

というのは、

上の例で言えば、

```bash
$ git push git@github.com:carotene4035/hoge.git master
```
と同じなのです。


## Gitコマンドわかりやすい

こうして紐解いてみると、Gitコマンドって結構わかりやすい。

ハリーポッターの呪文と一緒に覚えちゃいましょう。

Enjoy Git!
`diff` を表示する時に余計な空白の変更を表示しない方法

`diff` や `git diff` コマンドを利用時にインデントや空白の変更がノイズになりがちなのを表示から除去できる方法があるのでまとめがてら書きます。
Pythonだと、インデントが構文の一部な扱いなので、あまり有用でないかもしれません。

## `diff` や `git diff` で
[diffのオプション一覧](https://www.gnu.org/software/diffutils/manual/html_node/diff-Options.html)が一番参考になるかと思いますが、 `-b` か `-w` オプションを覚えればいいかと思います。
一応、意味を書いておくと

* `-b` : 行末以外の空白の変更を無視する
* `-w` : すべての空白の変更を無視する

`-w` だと空白の変更を見きれなくてこわい場合は `-b` にしておくのが無難かもしれません。

[gitのリファレンス](https://git-scm.com/docs/git-diff)にもありますが、基本的に `diff` コマンドと同じみたいです。

## GitHubで
[GitHub Secrets](https://github.com/blog/967-github-secrets)という記事で取り上げられています。

URLの末尾に `?w=1` を追加すると空白の変更を除いた変更が見れます。
Pull Requestのページの時に重宝するかと思います。

## magitで
magitの画面で `D` キーを押すとdiffの表示設定を変更できます。
詳細は[このissue](https://github.com/magit/magit/issues/204)に書いてあります。
Swift 端末のバージョン取得

# Swift で端末のバージョンを取得する。

端末のバージョンを取得しそのバージョンが指定バージョンよりも高いか低いかを判定する方法になります。

実行中のアプリのバージョンが8.0.0以上か以下かの判定を行えます。

下記サイト引用

http://nshipster.com/swift-system-version-checking/

```
switch UIDevice.current.systemVersion.compare("8.0.0", options: .numeric) {
        case .orderedSame, .orderedDescending:
            print("iOS >= 8.0")
            return true
        case .orderedAscending:
            print("iOS < 8.0")
            return false
        }
```
Swift でSize Class を取得する 

# Size Classの値を取得

## Overview

https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/AutolayoutPG/Size-ClassSpecificLayout.html

Interface Builderのストーリーボードは、デフォルトでサイズクラスを使用します。サイズクラスは、シーンやビューなどのユーザーインターフェイス要素に割り当てられた特性です。それらは要素のサイズの大まかな表示を提供します。Interface Builderを使用すると、現在のサイズクラスに基づいてレイアウトの多くの機能をカスタマイズできます


こんな感じのものをStoryboardで端末毎で指定できます。


下記が端末毎でのSize Class の値になります。

|Device|Portrait|Landscape|
|:-----|:-------|:--------|
iPad (all)<br> iPad Mini|Vertical size class: Regular <br> Horizontal size class: Regular | Vertical size class: Regular <br> Horizontal size class: Regular|
|iPhone 6 Plus|Vertical size class: Regular <br>Horizontal size class: Compact| Vertical size class: Compact <br> Horizontal size class: Regular|
|iPhone 6 |Vertical size class: Regular <br> Horizontal size class: Compact | Vertical size class: Compact <br> Horizontal size class: Compact|
|iPhone 5s <br>iPhone 5c<br>iPhone 5|Vertical size class: Regular<br>Horizontal size class: Compact|Vertical size class: Compact<br>Horizontal size class: Compact|
|iPhone 4s|Vertical size class: Regular<br>Horizontal size class: Compact|Vertical size class: Compact<br>Horizontal size class: Compact|

IMPORTANT

Never assume that your app will be displayed with a specific size class on a device. Always check the size class found in an object’s trait collection when making decisions about how to configure that object.

Creating Custom Presentations

Building an Adaptive Interface

Copyright © 2017 Apple Inc. All rights reserved. Terms of Use | Privacy Policy | Updated: 2015-09-16

こんな感じのものをStoryboardで指定したりできますが、これをコードで取得します。

```swift

        let horizonSizeClass = UITraitCollection(horizontalSizeClass: .regular)
    
        if traitCollection.containsTraits(in: horizonSizeClass) {
            print ("Regular")
        } else {
            print ("Compact")
        }

```

Apple API UITraitCollection
https://developer.apple.com/documentation/uikit/uitraitcollection

こんな感じで取得できます。
Angular4プロジェクトがIE11でエラーになる

Angular CLI(1.2.1) を使って、Angular4 のアプリケーションを作っていたときに、IE11 でエラーが出て動かなかった。

```
SCRIPT5: Access is denied.
File: rcj-99d43ead6bdf30da8ed5ffcb4f17100c.html, Line: 1, Column: 1
```

```
SCRIPT5022: Exception thrown and not caught
File: app.js, Line: 1012, Column: 36
```

![error-on-ie11-2.png](https://qiita-image-store.s3.amazonaws.com/0/72663/7102a4d5-6b70-d002-c5f7-36e89d972df8.png)

ES6 周り？の polyfill が必要だったようで、 `src/polyfill.ts` 内の下記の `import` のコメントアウトを外し、

```ts
/** IE9, IE10 and IE11 requires all of the following polyfills. **/
// import 'core-js/es6/symbol';
// import 'core-js/es6/object';
// import 'core-js/es6/function';
// import 'core-js/es6/parse-int';
// import 'core-js/es6/parse-float';
// import 'core-js/es6/number';
// import 'core-js/es6/math';
// import 'core-js/es6/string';
// import 'core-js/es6/date';
// import 'core-js/es6/array';
// import 'core-js/es6/regexp';
// import 'core-js/es6/map';
// import 'core-js/es6/weak-map';
// import 'core-js/es6/set';
```

 `main.ts` の中で `import './polyfill.ts'` をしたら無事に動作しました。SVG で ngClass を使うときや Web Animations API を使うときなどは、`src/polyfill.ts` 内の該当箇所をコメントアウトすればIEでも動くみたいですね。

また、CLI ユーザーでない場合は、 polyfill スクリプトをホストWebページ（index.html）に直接追加する必要があるとのことです。

```html
<!-- pre-zone polyfills -->
<script src="node_modules/core-js/client/shim.min.js"></script>
<script src="node_modules/web-animations-js/web-animations.min.js"></script>

<!-- zone.js required by Angular -->
<script src="node_modules/zone.js/dist/zone.js"></script>

<!-- application polyfills -->
```
Jenkins導入からjenkinsによるdjangoアプリの自動デプロイまで試した際のメモ

## まえがき

今まで構築済みのJenkinsプロジェクトをただ使うだけで、
Jenkinsのプロジェクトの設定を自分で全くしたことがなかったので、
プロジェクトの作成と設定、自動デプロイまでをとりあえずやってみることにした。

## お世話になった記事/サイトなど

https://qiita.com/japboy/items/42aeee94512495a6ddd4
http://www.buildinsider.net/enterprise/jenkins/001
http://sil.hatenablog.com/entry/jenkins-github-auto-deploy
https://qiita.com/yasuhiroki/items/61a2be613fc7dcfc8682

## サーバの環境

- Ubuntu 16.04
- Memory 8GBくらい
- HDD 500GBくらい

## Jenkinsの導入(Dockerコンテナ)

> Dockerの導入は省略。。

Docker Hub上で公式イメージがあるのでこちらを使用
[Jenkins Official Repo](https://hub.docker.com/_/jenkins/)

```
sudo  docker run  -v /var/jenkins_home -p 8080:8080 -p 50000:50000 --name jenkins  -d jenkins
```

オプションの意味:
`-v` Data Volume
`-p` port forwarding
`-d` background

しばらくすると、jenkins上がってくるので　[http://サーバのIPアドレス:8080](http://サーバのIPアドレス:8080) にアクセス

adminのトークンを求められるので、下記のコマンドを叩いて取得する

```
docker exec -ti jenkins cat /var/jenkins_home/secrets/initialAdminPassword
```

次画面で推奨するプラグインを導入するか、選択して導入するかを聞かれるのでどちらかを選択する

プラグイン導入後、ユーザ作成画面に移り、これが終われば導入が完了

## jenkinsのアップデート

Dockerコンテナ内のjenkinsが既に古いバージョンの場合、
Warningsが表示される
アップデートする方法は下記の通り

```
# jenkinsのコンテナにrootで入る
docker exec -ti  -u root jenkins bash
cd /usr/share/jenkins/
wget http://updates.jenkins-ci.org/download/war/2.89.2/jenkins.war
mv jenkins.war.1 jenkins.war
# jenkinsのコンテナから抜ける
exit
# jenkinsのコンテナを再起動
docker restart jenkins
```

## projectの作成

### Github Enterprisesとの連携
Build Triggerを使いGHEにpushした段階でビルドが走るようにしたかったが，
自分が建てた場所が悪く，GHEが動いているサーバからjenkinsのトリガを引くことができないので保留...
 


### 自動デプロイ

下地処理として，デプロイ先サーバでpyenv環境を整えてpython3.6を導入しておく
その後，`git pull`から`runserver`まで行ってくれるシェルをデプロイサーバ内に書き，jenkinsから叩くことにした
jenkinsのビルド時に任意のシェルを実行させるには「プロジェクト設定」->「Build」にある「execute shell」欄にシェルを書く

```
ssh -i /var/jenkins_home/.ssh/id_rsa  target_server@xxx.xxx.xxx.xxx './init.sh'
ssh -i /var/jenkins_home/.ssh/id_rsa  target_server@xxx.xxx.xxx.xxx 'git clone git@ghe.net:your-name/reponame.git'
ssh -i /var/jenkins_home/.ssh/id_rsa  target_server@xxx.xxx.xxx.xxx '/bin/bash /home/django/run.sh'
```

上記に登場する，`init.sh`と`run.sh`の内容
これらのシェルはデプロイ先サーバに配置

```init.sh
if [ -e /home/django/reponame/README.md ]; then
   # リポジトリが既に存在する場合は消す
   rm -rf /home/django/reponame
else
   # 存在しない場合は何もしない
   :
fi
```

```run.sh
#!/bin/bash
source ~/.profile
pgrep -f 'runserver' | xargs kill 2>/dev/null
# 標準入出力を捨てなければ，build時に帰ってこれなくなるのでjenkinsがタイムアウトしてしまう（ハマったポイント）
python /home/django/test2/mysite/manage.py runserver 0:5000  > /dev/null 2>1& < /dev/null &
```

自己満足だが，これでなんとかCIっぽい環境が自分でも構築できた
requirements.txtに対応するとさらによさそう
macOSのアップグレードで動作しなくなったphpenvのphpを復活させる


## 条件
* anyenvでphpenvをインストール済
* OSをSierraからHigh Sierraにアップグレード


### phpコマンドのエラー

アップグレード完了後、ターミナルからいつも通りphpコマンドを叩いてみる。

```
$ php
dyld: Library not loaded: /usr/local/opt/icu4c/lib/libicui18n.59.dylib
  Referenced from: /Users/USERNAME/.anyenv/envs/phpenv/versions/7.1.8/bin/php
  Reason: image not found
Abort trap: 6
```

icu4cのライブラリがロードされないとかで動作しなくなってしまった。

## アンインストール〜再インストール失敗

ググってもphpenv関連で同じエラーが見つけられなかったため、一旦アンインストールする。

```
$ phpenv uninstall 7.1.8
Are you sure you want to remove version ‘7.1.8’? [y/N]: y
Version ‘7.1.8’ (/Users/USERNAME/.anyenv/envs/phpenv/versions/7.1.8) successfully removed.
```

再度phpenvで同じバージョンのphpをインストールする。

```
$ phpenv install 7.1.8
[Info]: Loaded extension plugin
[Info]: Loaded apc Plugin.
[Info]: Loaded composer Plugin.
[Info]: Loaded github Plugin.
[Info]: Loaded uprofiler Plugin.
[Info]: Loaded xdebug Plugin.
[Info]: Loaded xhprof Plugin.
[Info]: Loaded zendopcache Plugin.
[Info]: php.ini-production gets used as php.ini
[Info]: Building 7.1.8 into /Users/USERNAME/.anyenv/envs/phpenv/versions/7.1.8
[Downloading]: https://secure.php.net/distributions/php-7.1.8.tar.bz2
[Preparing]: /var/tmp/php-build/source/7.1.8

-----------------
|  BUILD ERROR  |
-----------------

#ビルドエラー発生、ログを確認する。

$ vi /tmp/php-build.7.1.8.20180105145726.log

configure: error: in `/var/tmp/php-build/source/7.1.8':
configure: error: C compiler cannot create executables
See `config.log' for more details
```

Cのコンパイラが実行できないようなので、gccをチェックする。どうもXcodeのコマンドラインツールのパスが通っていないらしい。

```
$ gcc
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

## xcode-selectを再インストールして再挑戦

xcode-selectを再インストールしてgccを使えるようにする。

```
$ xcode-select --install

$ gcc
clang: error: no input files
```

phpenvで再度phpをインストールする。

```
$ phpenv install 7.1.8
[Info]: Loaded extension plugin
[Info]: Loaded apc Plugin.
[Info]: Loaded composer Plugin.
[Info]: Loaded github Plugin.
[Info]: Loaded uprofiler Plugin.
[Info]: Loaded xdebug Plugin.
[Info]: Loaded xhprof Plugin.
[Info]: Loaded zendopcache Plugin.
[Info]: php.ini-production gets used as php.ini
[Info]: Building 7.1.8 into /Users/USERNAME/.anyenv/envs/phpenv/versions/7.1.8

# (略)

[Success]: Built 7.1.8 successfully.

#インストール成功

$ phpenv versions
  system
* 7.1.8 (set by /Users/USERNAME/.anyenv/envs/phpenv/version)
```

phpコマンドが使えるようになった。

```
$ php -v
PHP 7.1.8 (cli) (built: Jan  5 2018 15:31:20) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.1.8, Copyright (c) 1999-2017, by Zend Technologies
    with Xdebug v2.5.5, Copyright (c) 2002-2017, by Derick Rethans

```
モデル間にアソシエーションを追加するときのDB側のやり方とアンチパターン

# 前提
User-Micropost 間に 1:多 のアソシエーションを追加する場合の解説です。

# 外部キー制約をつける正しい方法
reference 型のカラムで実現するので、以下のように行う。

```bash
# Micropost 作成
$ rails generate model Micropost content:string
# 外部キー制約をつける
$ rails generate migration AddUserIdToMicroposts user:references
```

まとめてやってもよい。

```
$ rails generate model Micropost content:string  user:references
```

# アンチパターン
すでにあるマイグレーションファイル(`2018xxxxxxxxxx_create_microposts.tb`とか)に `t.integer: user_id` などとベタ書きしてはならない。
それでも`User.first.microposts`とかで取ることはできるが、↑に比べると諸々十分ではない。

そもそも一般に、すでに master に push されたマイグレーションファイルを編集して上げ直すのはよろしくないはず。変更するマイグレーションを新たに作るべし。
Windows10 のTips


# 特定の領域を指定してキャプチャする

Windows 10のバージョン1703（Creators Update、ビルド15063、RS2）以降では、新しく「領域を指定して画面をキャプチャーする方法」が追加されました。
手順は以下のとおりです。今まではフリーソフトなどを使ってましたが、インストール不要で便利ですね。

1.［Windows］＋［Shift］＋［S］キーを押す
2.画面全体が白くなるので、キャプチャーしたい領域の左上隅へマウスを移動させる
3.マウスを左クリックしてからドラッグし、領域の右下でマウスのボタンをリリースする

# エクスプローラのアドレスバーからコマンドプロンプトを起動する

Windows10からというわけではありませんが、エクスプローラの、アドレスバーに「cmd」と入力してEnterキーを押すと、表示しているフォルダがカレントフォルダになった状態でコマンドプロンプトが起動します。

「powershell」と入力すれば、同様に表示しているフルだがカレントフォルダになった状態でPowerShellのコンソールが表示されます。
(初心者向け）vpsを契約して、Capistrano3でRailsアプリをデプロイするまで  [その3 補足]


[(初心者向け）vpsを契約して、capistrano3でRailsアプリをデプロイするまで   その1 サーバー設定編 - Qiita](https://qiita.com/ryo2132/items/f62690f0b16ec11270fe)
の補足です。

手順を実行すると各種エラーが出ることがあるかと思います。
その際の覚え書きとして、今回のデプロイを通して所持たエラーの回避について記します。

# Permission denied エラー
サーバー、ローカルのどちらの作業でもpermission deniedというエラーログが表示されること多々あると思います。
コンピューターが言いたいことは一つ、*お前権限ないけど!!*ってことです。なのでその時は何も考えず、*sudo*を前につけて実行しましょう。
コマンドを管理者権限で実行することができます。

```bash
# ファイルを作成したいけど作れない！
$ mkdir hoge
Error xxxx Permission dinied!
# 管理者権限で実行
$ sudo mkdir hoge
```

毎回sudoを付けるのが面倒！！という時は「sudo chown ユーザー名 ファイル名orディレクトリ名」 でファイル、ディレクトリの所有者を設定できます。そうすれば、設定したユーザーで操作を行う際は、sudoを付ける必要がなくなります。ただ、こちらセキュリティ的にあれな時あるので注意してください。
なお、あるディレクトリ以下のディレクトリ、ファイルを再帰的に権限を設定したい場合は-Rのオプションをつけます。

```bash
# fugaディレクトリにhogeを所有者として設定
$ sudo chown hoge fuga
# fugaディレクトリ以下、すべてのファイルの所有者をhogeに設定
$ sudo chown -R hoge fuga
```


#  ssh接続でWARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!が出た時

```
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
```

私も作り直して接続して、、、を繰り返している内に上記が出てしまい接続不可となりました。
その場合は、known_hostsの設定削除を行えば良いらしいです。

```bash
# known_hostsの更新
$ ssh-keygen -R [conohaのipアドレス]
```

より詳細については以下記事が分かりやすかったです。
[SSH接続エラー回避方法：.ssh/known_hostsから特定のホストを削除する/削除しないで対処する3つの方法 - Qiita](https://qiita.com/grgrjnjn/items/8ca33b64ea0406e12938)

# unicornが再起動しない
capistranoでデプロイが成功してもunicornが再起動しない場合があります。
その場合は、サーバーにて手動でプロセスを削除後、再度capistrano deployを行いましょう。

プロセスの確認

```:bash
$ ps -ef | grep unicorn
unityro+  8575     1  0 17:18 ?        00:00:01 unicorn_rails master -c config/unicorn.rb -E production -D
unityro+  8579  8575  0 17:18 ?        00:00:00 unicorn_rails worker[0] -c config/unicorn.rb -E production -D
unityro+  8582  8575  0 17:18 ?        00:00:00 unicorn_rails color=auto unicorn
```

プロセスIDを確認後（上記の場合は8575、8579）それをkill

```:bash
# 上記の場合は$ kill -QUIT 8575
$ kill -QUIT [PID]
```

以下記事参考にさせて頂きました。

[unicornの起動と終了 - naichi’s lab](http://blog.naichilab.com/entry/2015/12/05/230828)
pythonで否定的先読みというのをつかいたい。

### 前置き
 
【否定的先読み】については色々な方のサイトを参考にしたほうが良いと思います。

`bcd`という文字列が来たときは処理したいけど、
`abcd`という文字だったら処理したくない！
という感じのときに使うものらしいです。（多分）

### サンプルコード

python 3.6.3ですが、他のバージョンでも動くんじゃないかなあ。

```
main.py
# coding: utf-8

import re
import sys

argvs = sys.argv

print(argvs)

print("argvs[1] : ",argvs[1])
print("type(argvs[1]) : ",type(argvs[1]))


if re.search(r'^(?!.*abcd).*(?=bcd|def).+$' ,argvs[1]):
    print("True")
else:
    print("False")

```

`re.search(r'^(?!.*abcd).*(?=bcd|def).+$' ,argvs[1])`
ここの`^(?!.*abcd)`が、`abcdを除外する`で、`.*(?=bcd|def).+$`が
`bcdとdefを検知する`のような形になるみたいです。



###実行ログ

```
ajitama-server$ python main.py "abc"
['main.py', 'abc']
argvs[1] :  abc
type(argvs[1]) :  <class 'str'>
False
ajitama-server$ python main.py "abcd"
['main.py', 'abcd']
argvs[1] :  abcd
type(argvs[1]) :  <class 'str'>
False
ajitama-server$ python main.py "bcd"
['main.py', 'bcd']
argvs[1] :  bcd
type(argvs[1]) :  <class 'str'>
True
ajitama-server$ python main.py "def"
['main.py', 'def']
argvs[1] :  def
type(argvs[1]) :  <class 'str'>
True

```


re.searchじゃなくてもre.matchを使ったほうがちゃんとできるかもしれませんが、
slackbotの正規表現はどうもmatchではなさそうだったのでこれで対処しました。

賢くないので、わかりにくいっす…。
非エンジニア向けSQLの基礎 Pt.2

[非エンジニア向けSQLの基礎](https://qiita.com/mrdShinse/items/447d1d5ad319b0f944da)の続きです

## ゴール(再掲)

- 簡単な集計SQLを書けるようになること
- 会社ごとの〇〇率をグラフ化して、と言われてSQLを書きはじめられるようになること
- SQLの結果をRedashで棒グラフ、積み上げ棒グラフで表現できること

## 想定する受講者

- データベース関係の基本的な用語について、聞いたことはある人
  - テーブル、カラム、レコード、フィールド、SQLなど。
  - 参考) https://academy.gmocloud.com/know/20160425/2259
- Redashなどのダッシュボードツールを見たことはある人

---

## 関数を使えるようになろう

---

## ExcelにあるIF()とかそういうアレ


---

# [MySQL 5.6 リファレンスマニュアル](https://dev.mysql.com/doc/refman/5.6/ja/func-op-summary-ref.html)

---

# 以上

---

# ではツラいのでいくつか抜粋

##### でも、自分でリファレンス読めるようになってくださいね

---

## [CASE WHEN ~ THEN ~ END](https://dev.mysql.com/doc/refman/5.6/ja/control-flow-functions.html#operator_case)

```sql
SELECT
	CASE WHEN a.sign_in_count = 0  THEN 'ログインしたことない人'
		 WHEN a.sign_in_count < 5 THEN '何回かログインしたことある人'
		 ELSE 'めっちゃログインしたことある人'
	END AS HOW_TO_CASE,
	a.*
FROM accounts a
;
```

* ExcelでいうIF関数
    * `CASE WHEN {条件} THEN {値} ELSE {値} END`

* 同じ事ができるIF関数もあるが、DBによって使えたりダメだったりするので、CASE WHEN ~ を覚えた方がよい。まじで。

---


## [COUNT()](https://dev.mysql.com/doc/refman/5.6/ja/group-by-functions.html#function_count)

```sql
SELECT COUNT(*) AS COMPANY_COUNT FROM companies AS c;
```

* 読んで字のごとくカウントします。
    * COUNT(c.id)のようにカラム指定もできるが、この場合はNULLだとカウントされません。

```sql
SELECT COUNT(c.deleted_at) FROM companies c WHERE c.deleted_at IS NULL;
```

```sql
SELECT COUNT(c.id) FROM companies c WHERE c.deleted_at IS NULL;
```

            * なぜ結果が異なるのか考えてみましょう。

---
## COUNTの活用法

### WHEREとの組み合わせ

* 〇〇な人何人いる？→どんなデータ入っている？
    * そんなパターンでよく使う

```sql
SELECT COUNT(*) FROM owners o WHERE o.note IS NOT NULL;
```

    * `COUNT(*)` → `o.*` に変更することで、データの中身がすぐに確認できる。

---
### CASEとの組み合わせ

* Redashでよく使う。SQL一発の情報量が高まる。
    * ログイン済みアカウントと、そうでないアカウントの集計

```sql
SELECT
	COUNT(CASE WHEN a.sign_in_count = 0 THEN 1 ELSE NULL END) AS ACCOUNTS_NOT_SIGNIN,
	COUNT(CASE WHEN a.sign_in_count > 0 THEN 1 ELSE NULL END) AS ACCOUNTS_SIGNIN
FROM accounts a
;
```

---

## 演習1

- 問1
    - ownersテーブルから、owners.emailが入っていない人の件数をSQLで調査してください。
- 問2
    - emailが入っている人、入っていない人の件数をSQL一発で出してください。
    - 期待する実行結果↓

|WITHOUT_EMAIL|WITH_EMAIL|
|:--|:--|
|9999|3333|

---

## 関連テーブルの情報をくっつけてみよう(JOIN句)

```sql
SELECT o.name AS OWNER_NAME,
       c.name AS COMPANY_NAME
FROM owners o
LEFT OUTER JOIN companies c ON c.id = o.company_id LIMIT 10 ;
```


---


## 演習2

- 問1
    - 日本の住所を持っていないオーナーの物件一覧を抽出してください。
    - 日本の住所を持っていない、は `owners.address_code IS NULL` でOK
- 問2
    - 問1で出した物件が、東京・神奈川・埼玉に何件ずつあるのか出してください。

|TOKYO_COUNT|KANAGAWA_COUNT|SAITAMA_COUNT|
|:--|:--|:--|
|9999|3333|1111|

<!---
## もっと詳しく知りたい方に
---
## グルーピングをしてみよう(GROUP BY句)
---
## データの構造を理解しよう(ER図)
--->
box-sizing

#CSS3のbox-sizingプロパティ

box-sizingはCSS3から実装された便利なプロパティで、要素の高さや幅の計算方法を変更できます。
これを使うことでborderやpaddingのサイズを気にせずwidthやheightを指定することができるようになります。

```html

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>box-sizing</title>
<style>

div {
	width: 100px;
	height: 100px;
	margin-bottom:10px;
	border: 10px solid;
	padding: 10px;
	margin:10px;
	background-color: red;
}

#box-sizing {
	box-sizing: border-box;
	background-color: blue;
}

</style>
</head>
<body>
<div>
</div>
<div id="box-sizing">
</div>
</body>
</html>
```

これでこの画像のようになります。
赤いボックスはbox-sizing: "border-box"を指定していません。もう一方の青いボックスはborder-boxを指定しています。
![box-sizing.png](https://qiita-image-store.s3.amazonaws.com/0/221164/840d3546-b907-8ec8-6f7f-6bd0a20c0bd7.png)

各ブラウザへの実装状況はこちら
https://caniuse.com/#search=box-sizing
jqueryとpicodomを組み合わせてちょっと幸せになりたい

`jquery`はなんやかんや今も現役で、消えることはないんじゃないかと思っているnakazatoです。
これはそんな現役バリバリの`jquery`を`picodom`を使ってちょっと幸せに使いたい、という趣旨の記事です。

## `jquery`の辛いところ
「フォーム画面でリアルタイムに入力内容を反映させたいんですー。」という要望があったとします。
これを`jquery`で実装しようと思った場合

1. 結果反映用の要素をhtml側に用意し
2. 各フォーム要素にイベントを張り
3. 値を取得して保持し
4. 結果反映用要素に変更を加える

という具合になると思います。この時辛いのが

> ４. 結果反映用要素に変更を加える

こいつです。
反映箇所が多ければ多いほど、class振ったり取得したりと辛いのです。
ここを`picodom`を使って省略し、ちょっと幸せになってみます。

## `picodom`について

_VDOMでページを操作する1 KBのJSライブラリ_、ということで最近話題の`hyperapp`の記事に登場していました。
参照：[2018 年は Hyperapp の年だ](https://qiita.com/JorgeBucaran/items/c48446babe0627e25ee6#picodom%E3%81%A8%E3%81%AF)
> Picodom をベースにしたオリジナルビューライブラリや、VDOM 系ツールとか、ユーザーが楽しく簡単に作れたら嬉しいと思う。

ということで、VDOMの力をわずかばかり借りてみます。

## やること

<img width="471" alt="スクリーンショット 2018-01-05 14.11.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/100188/f6310aad-c9fa-1b50-e825-e1a058d6134c.png">
[デモ](http://jsdo.it/bgn_nakazato/Olj1)

購入個数を変更したら即座に概算が出るような画面です。

## 実装

[Github](https://github.com/nkzttt/picodom-test)にあげたコードを元に解説します。

まずざっくり、このような`html`がありました。（作り荒いですがデモなので・・・）

``` html
<body>
<div>
    <label>
        りんご（100円）
        <input type="number" value="0" min="0" name="apple" data-price="100">個
    </label>
</div>
<div>
    <label>
        なし（130円）
        <input type="number" value="0" min="0" name="pear" data-price="130">個
    </label>
</div>
<div>
    <label>
        ぶどう（350円）
        <input type="number" value="0" min="0" name="grape" data-price="350">個
    </label>
</div>
<div>
    <button>購入する</button>
</div>
</body>
```

ここに、結果反映用の要素と`script`の読み込みを`body`の閉じタグ上に追加します。

``` html
<div id="result"></div>
<script src="index.js"></script>
```

`index.js`は以下のようになっています。

``` javascript
import $ from 'jquery';
import { h, patch } from 'picodom';

const state = {
  apple: 0,
  pear: 0,
  grape: 0
};

let node;

function render() {
  patch(node, (node = view()), $('#result')[0]);
}

function view() {
  let result = state.apple + state.pear + state.grape;
  return h('div', null, null, [
    h('p', null, `概算：${result}円`),
    h('p', null, `（内訳：りんご - ${state.apple}円、なし - ${state.pear}円、ぶどう - ${state.grape}円、）`)
  ]);
}

render();

$('[type="number"]').on('change', (e) => {
  state[e.currentTarget.name] = e.currentTarget.value * e.currentTarget.dataset.price;
  render();
});
```

簡単に説明していきます。

### `state`変数
状態を保持させます。

### `render`関数
`picodom`の描画用関数です。
第1引数に前の状態の要素を、第2引数に新しい状態の要素を、第３引数に描画の対象となる要素を指定します。
（2018/1/5現在、[picodom](https://github.com/picodom/picodom)の`readme`と引数の順番が違ったのでちょっと注意です）

### `view`関数
仮想DOMを作っている部分で、変数`state`を使っていろいろと表示させています。

### `jquery`イベントバインド
最後に`input type="number"`な要素に`change`イベントを張り、変数`state`の値を変更後、`render`関数で仮想DOMを再描画させています。
html側の`input`要素では、以下のように`name`属性と変数`state`のキーがマッチするようにしているので、これを使って値の変更をしています。

``` html
<input type="number" value="0" min="0" name="apple" data-price="100">個
```

これで[デモ](http://jsdo.it/bgn_nakazato/Olj1)のように各個数を変更することで概算やら内訳やらが更新されるようになります。

## まとめ

**ちょっと幸せになれたでしょうか？**

`pidocom`はVDOMの基本機能を極シンプルに提供してくれている印象で、本家様の紹介にもあったように、これをベースに独自に作り込んでいくのが良さそうだと思いました。
私個人こういったシンプルなライブラリが大好きなので、上手く使っていきたいと思います。
Perl で文字列から URL (http/https) を抽出する正規表現

## サンプルコード

```perl
# 抽出テスト用URL
@urls = (
  'https://ja.wikipedia.org/wiki/A',
  'https://ja.wikipedia.org/wiki/%E6%84%9B',
  'https://ja.wikipedia.org/wiki/%E6%84%9B_(%E6%9B%96%E6%98%A7%E3%81%95%E5%9B%9E%E9%81%BF)',
  'https://ja.wikipedia.org/wiki/ABCDE?FGHIJ=KLMNO#PQRST',
  'https://ja.wikipedia.org/wiki/愛',
  'https://ja.wikipedia.org/wiki/愛_(曖昧さ回避)',
  'https://ja.wikipedia.org/wiki/あいうえお?かきくけこ=さしすせそ#たちつてと',
);

# 抽出テスト用URLを出力
print "*** Source URLs ***\n";
foreach my $url (@urls){
  print "Source URL=[$url]\n";
}
print "\n";

# 抽出テスト用URLをひとつの文字列につなげる
$text = join(' ', @urls);

# URLを抽出するための正規表現
@patterns = (
  'https?://[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+', # 一般的なURL
  'https?://[^\s]+', # 日本語を含むURL
);

# 正規表現にマッチしたURLを出力する
foreach my $pattern (@patterns){
  print "*** Pattern: $pattern ***\n";
  while ($text =~ /$pattern/gp) {
    print "Matched URL=[${^MATCH}]\n";
  }
  print "\n";
}
```

## 実行結果

```
*** Source URLs ***
Source URL=[https://ja.wikipedia.org/wiki/A]
Source URL=[https://ja.wikipedia.org/wiki/%E6%84%9B]
Source URL=[https://ja.wikipedia.org/wiki/%E6%84%9B_(%E6%9B%96%E6%98%A7%E3%81%95%E5%9B%9E%E9%81%BF)]
Source URL=[https://ja.wikipedia.org/wiki/ABCDE?FGHIJ=KLMNO#PQRST]
Source URL=[https://ja.wikipedia.org/wiki/愛]
Source URL=[https://ja.wikipedia.org/wiki/愛_(曖昧さ回避)]
Source URL=[https://ja.wikipedia.org/wiki/あいうえお?かきくけこ=さしすせそ#たちつてと]

*** Pattern: https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+ ***
Matched URL=[https://ja.wikipedia.org/wiki/A]
Matched URL=[https://ja.wikipedia.org/wiki/%E6%84%9B]
Matched URL=[https://ja.wikipedia.org/wiki/%E6%84%9B_(%E6%9B%96%E6%98%A7%E3%81%95%E5%9B%9E%E9%81%BF)]
Matched URL=[https://ja.wikipedia.org/wiki/ABCDE?FGHIJ=KLMNO#PQRST]
Matched URL=[https://ja.wikipedia.org/wiki/]
Matched URL=[https://ja.wikipedia.org/wiki/]
Matched URL=[https://ja.wikipedia.org/wiki/]

*** Pattern: https?://[^\s]+ ***
Matched URL=[https://ja.wikipedia.org/wiki/A]
Matched URL=[https://ja.wikipedia.org/wiki/%E6%84%9B]
Matched URL=[https://ja.wikipedia.org/wiki/%E6%84%9B_(%E6%9B%96%E6%98%A7%E3%81%95%E5%9B%9E%E9%81%BF)]
Matched URL=[https://ja.wikipedia.org/wiki/ABCDE?FGHIJ=KLMNO#PQRST]
Matched URL=[https://ja.wikipedia.org/wiki/愛]
Matched URL=[https://ja.wikipedia.org/wiki/愛_(曖昧さ回避)]
Matched URL=[https://ja.wikipedia.org/wiki/あいうえお?かきくけこ=さしすせそ#たちつてと]
```

「https?://[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+」では英数字やエンコードされた日本語のURLにマッチする。

「https?://[^\s]+」ではエンコードされていない日本語が含まれるURLにもマッチする。

## 参考資料

- [perlre \- Perl 正規表現 \- perldoc\.jp](http://perldoc.jp/docs/perl/5.14.1/perlre.pod)
- [Perl の正規表現でマッチした文字列自体を取得する今昔 \- Qiita](https://qiita.com/xtetsuji/items/1f9ce837f282dabc5ce8)
- [Perlメモ](http://www.din.or.jp/~ohzaki/perl.htm)
- [URLを抽出する正規表現はどう書くべきか \- すたら日記](http://d.hatena.ne.jp/sutara_lumpur/20100827/1282872312)
Confluence グラフの挿入

# Confluence グラフ挿入

その他のマクロを追加 ＞ チャート
チャートマクロ内に表を挿入することで、グラフが生成

編集画面
![スクリーンショット 2018-01-05 14.47.09.png](https://qiita-image-store.s3.amazonaws.com/0/65876/cda3436a-0d23-c2d4-5a4e-9f231b445ed4.png)

ページ
![スクリーンショット 2018-01-05 14.46.27.png](https://qiita-image-store.s3.amazonaws.com/0/65876/68d11cce-2e13-c6f5-c676-1006b8c722fc.png)

## タイプ
- pie
    - 円グラフ
- bar
    - 棒グラフ
- line
    - 線グラフ
- area
    - 面グラフ
- scatter
    - 散布図


## 困った時
- グラフと一緒にデータテーブルも表示したい
    - 「描画データの表示」の値を変更する
        - after　グラフの下部にデータテーブルが表示される
        - before　チャートの上部にデータテーブルが表示される

- 描画する列を指定したい
    - 「列」の値を指定する
        - 見出し列を0としてグラフにしたい列をカンマ区切りで指定（例：1,3,5）
direnvでエイリアス

.direnvrcで

```
export_function() {
  local name=$1
  local alias_dir=$PWD/.direnv/aliases
  mkdir -p "$alias_dir"
  PATH_add "$alias_dir"
  local target="$alias_dir/$name"
  if declare -f "$name" >/dev/null; then
    echo "#!/usr/bin/env bash" > "$target"
    declare -f "$name" >> "$target" 2>/dev/null
    echo "$name" >> "$target"
    chmod +x "$target"
  fi
}
```

.envrcで

```
hoge() {
  コマンドずらずら
}
export_function hoge
```

参考
https://github.com/direnv/direnv/issues/73
HTTPStartでデータを受け取る

# はじめに
HTTPからリクエストを受け取る場合にはHTTPStartコンポーネントが使えます。ヘルプをみるとブラウザのフォームリクエスト(POSTメソッド)をメインに書かれていますが、GETメソッドでURLパラメーターをとるときの設定で少し悩んだので確認したことを残しておきます。

# 環境
+ OS : Windows 10
+ Java：1.8.0.121
+ ASTERIA WARP : 1703

# フロー
HTTPStart -> Mapper -> HTTPEnd で簡単なフローを作って
<img width="1027" alt="HTTPStart01.png" src="https://qiita-image-store.s3.amazonaws.com/0/180292/94fe2ef1-7968-8cc1-582e-ba7cfaeb77e0.png">

URL実行設定しておきます。
<img width="884" alt="HTTPStart02.png" src="https://qiita-image-store.s3.amazonaws.com/0/180292/34622417-ccfc-6619-23b2-9a1956a4bfd9.png">

# POSTでフォームデータを受け取る
今回はRestコンポーネントにPrameterListのデータを差し込んで動作を確認してみました。
<img width="954" alt="HTTPStart03.png" src="https://qiita-image-store.s3.amazonaws.com/0/180292/8652bf89-79e1-bf91-6eac-06b5e8f24588.png">

フローの実行結果
<img width="657" alt="HTTPStart04.png" src="https://qiita-image-store.s3.amazonaws.com/0/180292/a1f71233-ea99-ecd2-8f82-4c4915bf94be.png">

フォームデータをHTTPStartのPrameterListで受け取っているようです。

# GETでURLパラメーターを受け取る
こっちもひとまずRestコンポーネントで試してみました。
<img width="960" alt="HTTPStart05.png" src="https://qiita-image-store.s3.amazonaws.com/0/180292/03f5f959-68bb-f9dd-9040-b50821a799fc.png">

URLパラメータータブで`value1`に値をセットしておきます。
<img width="497" alt="HTTPStart06.png" src="https://qiita-image-store.s3.amazonaws.com/0/180292/d2bd4624-6d5e-7930-3723-78a27664eb26.png">

フローの実行結果
<img width="652" alt="HTTPStart07.png" src="https://qiita-image-store.s3.amazonaws.com/0/180292/48ce0aa0-0bc1-bfb1-018c-d9df4e448dda.png">

URLパラメーターもさっきと同じフローで取得できてます。

# ヘルプを見直してみる
([HTTPStartコンポーネントのヘルプ](https://help.asteria.com/documentation/warp/ja/current/flow/designer/reference/component/HttpStart.html)より)
> 出力ストリームがParameterListの場合はURLパラメーターもParameterListのフィールドに設定されます。 


と書いてありました。つまり、POSTメソッドでフォームデータを受け取るのと同じようにGETメソッドのURLパラメーターもPrameterListで受け取れるようです。

ブラウザからも試してみました。
<img width="732" alt="HTTPStart08.png" src="https://qiita-image-store.s3.amazonaws.com/0/180292/6d09349e-34ca-2d77-d52c-b5d641479ac4.png">

`?value1=123`というURLパラメーターをフローで受け取れて処理されているようです。

さらにヘルプには

> 出力ストリームがMIMEでURLパラメーターを取得する場合
出力ストリームがMIMEの場合にURLでQueryStringとして指定されたパラメーターを取得する場合はそのパラメーター名を公開フロー変数として設定することで変数値として設定されます。 

とも書いてありましたので試してみました。
HTTPStartの出力ストリームをMIMEにしてフロー変数を１つ作り、「公開」しておくと同じようにGETメソッドのURLパラメーターが取れるみたいです。
<img width="970" alt="HTTPStart09.png" src="https://qiita-image-store.s3.amazonaws.com/0/180292/0acbfd2b-4ae7-33ef-8e2a-e8313fd8701e.png">

# おわりに
GETメソッドのURLパラメーターを受け取るときもURLを解析するとか小難しいことは考えず、ParameterListでフィールドを指定して受け取れるようです。GETメソッドでもPOSTメソッドでも同じフローで動くのがうれしいところです。
ヘルプにはちっちゃくさらっと書いてありますがMIMEの場合も公開フロー変数に自動セットされるので、MIMEデータ解析と同時にURLパラメーターの値も必要なときでも使えそうです。
CircleCIでServerspecやawspecを定期実行する

CircleCIではv2からWorkflowsの機能を使って、定期実行を実現することができます。

https://circleci.com/docs/2.0/workflows/#scheduling-a-workflow

具体的なコードは以下のような `.circleci/config.yml` になります。

AWS環境やサーバ構成のテストとPHPアプリケーションのコードが同じリポジトリあるイメージです。

`AWS_ACCESS_KEY_ID` 、 `AWS_SECRET_ACCESS_KEY` やサーバへの接続のためのSSH秘密鍵はCircleCI側に設定します。

```yaml
version: 2
jobs:
  phptest:
    docker:
      - image: someone/php:7
      - image: mysql:5.6
        environment:
            MYSQL_ROOT_PASSWORD: ******
            MYSQL_USER: testuser
            MYSQL_PASSWORD: ******
            MYSQL_DATABASE: database_test
    steps:
      - checkout
      - run:
		  name: composer install
		  command: composer install
      - run:
          name: Test
          command: ./vendor/bin/phpunit
  infratest:
      docker:
      - image: circleci/ruby:2.4
    environment:
      - AWS_REGION: ap-northeast-1
    steps:
      - checkout
      - run:
          name: Pre
          command: sudo apt-get install libpcap-dev
      - run:
          name: bundle install
          command: |
              cd server/spec/
              bundle install
      - run:
          name: Test
          command: |
            cd server/spec/
            bundle exec rake spec
workflows:
  version: 2
  normal_workflow:
    jobs:
      - phptest
  scheduled_workflow:
    triggers:
      - schedule:
          cron: "0 1 * * *"
          filters:
            branches:
              only:
                - master
    jobs:
      - infratest
```

`jobs:` に `phptest` を `infratest` をそれぞれ定義しています
`workflows:` で通常時( `normal_workflow` )と定期実行( `scheduled_workflow` )の定義をしています。

上記の設定では

- `normal_workflow` では `phptest` が実行
- `scheduled_workflow` では `infratest` が定期実行 ( 毎日1:00 UTC に masterブランチのコードで実行 )

されることになります。

これで一度書いたServerspecやawspecのコードで外形監視どころか症状監視までできるようになります。

最高ですね！
C++ Builder XE4, 10.2 Tokyo > DateUtils > MilliSecondsBetween > 秒とミリ秒の違いをミリ秒の単位で返す

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2
```

http://docwiki.embarcadero.com/Libraries/Tokyo/en/System.DateUtils.MilliSecondsBetween

> Returns the number of milliseconds between two specified TDateTime values.
>
Call MilliSecondsBetween to obtain the difference, in milliseconds, between two TDateTime values.
>
MilliSecondsBetween always returns a positive result and therefore the parameter values are interchangeable.

SecondsBetween()という関数は「秒の違い」を「秒の単位」で返す。

MilliSecondsBetween()は「秒とミリ秒の違い」を「ミリ秒の単位」で返す。
「ミリ秒の違い」を「ミリ秒の単位」で返す、のではない。
例として、9909ミリ秒などが返される。

### 想定される失敗

```cpp
__int64 interval_sec = SecondsBetween(Now(), nextdt);
__int64 interval_msec = MilliSecondsBetween(Now(), nextdt);

/* (interval_sec * 1000 + interval_msec)ミリ秒後の処理 */
```

上記を実装すると9.9秒差の場合に18.9秒後の処理になってしまう(秒の差のダブルカウント)。
Safari：sandboxのエラー

:warning: はじめに :warning:
これはエラーに右往左往しただけの記事です。
最終的に解決しましたが、
結局のところ原因が何だったのかわかってません。

---

# こういうエラーが出た
```Blocked script execution in 'http://www.test.jp/yyy/' because the document's frame is sandboxed and the 'allow-scripts' permission is not set.
```
※URL部分は伏せてます。

# Google翻訳にぶっこむ
```'http://www.test.jp/yyy/'でスクリプトの実行をブロックしました。これは、ドキュメントのフレームがサンドボックス化されていて、 'allow-scripts'権限が設定されていないためです。```

## つまり
▼現象
・スクリプトの実行がブロックされたらしい

▼原因
1. ドキュメントのフレームが `サンドボックス化` されていて、
2.  `allow-scripts` 権限が設定されていないから

# 1. ドキュメントのフレームが `サンドボックス化` されている
サンドボックスってなんだ・・・
![814JKRetKRL._SX385_.jpg](https://qiita-image-store.s3.amazonaws.com/0/210553/5fd8360c-1eda-54a4-e625-d0b603061eb4.jpeg)
引用：https://goo.gl/rX1aX8

## サンドボックスとは
https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%B3%E3%83%89%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9_(%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3)
>
コンピュータセキュリティ技術において、 サンドボックス（sandbox）は、外部から受け取ったプログラムを保護された領域で動作させることによってシステムが不正に操作されるのを防ぐセキュリティ機構のことをいう 

・・・らしいです。

## よくわからなかった
Wikiの文章をざっと読んで噛み砕いてみる

```
ウェブページに配置された
- Javaアプレット
- Flash
- JavaScript 
などのプログラムは自動的に実行される。
```

:arrow_down: そのため :arrow_down:

```
気づかないうちに
コンピュータ上にあるファイルを盗み見られたり書き換えられたり、
あるいは
コンピュータウイルスに感染させられたりするおそれがある。
```

:arrow_down: そこで :arrow_down:

```
安心してウェブサーフィンを楽しめるように提供されたのが、
そういった攻撃のできない安全な「砂場」(サンドボックス)である。
```

へぇ・・・

サンドボックスについてはわかったけど
解決法がわからず

# 2.  `allow-scripts` 権限が設定されていない
これが原因か？
いや、そもそも `allow-scripts` 権限ってなんだ

## 調べる
`allow-script` で日本語の記事が出てこない・・・

## 察する:bulb:
JavaScript の設定の話かな？

## Safariの設定を見直す
![image.png](https://qiita-image-store.s3.amazonaws.com/0/210553/feb98b6e-22fe-c4c3-4f54-032a4b346c6e.png)

既に JavaScript は許可されている・・・
それに、他のページのJSは普通に動いている

なんでエラーが出るんだ・・・

# 迷走
・セキュリティソフトを切ってみる
・「JavaScriptを有効にする」のチェックを外したり付けたりしてみる
・インターネットプラグインの設定を変えてみる

# 直った
・迷走した後、Safariを再起動してみる

=> *エラーが消えてる！！！！*

# なんで？
何が良かったんだろう？
謎である

# 今後の対処法
とりあえず Safari を再起動したらいいと思いました(´・_・｀)

〜完〜