OmniAICreator/Qiita-1.07M huggingface dataset:
EC2 インスタンス(Amazon Linux)を clocksource=tsc にして現在時刻取得のオーバーヘッドを減らす

# 現在時刻の取得

プログラムを実行する上で、現在時刻を取得する処理が実行されることは少なくありません。意識的に実行していなくても、ロギング、乱数のシード生成、UUID の生成といった様々な用途で現在時刻が用いられていることがあります。

現在時刻の取得のオーバーヘッドを意識することは少ないかもしれませんが、[Netfix 社の事例](https://www.slideshare.net/brendangregg/performance-tuning-ec2-instances/42)で CPU 使用率が 30% も改善したという事例が紹介されているぐらいですし、アプリケーションによっては実際にオーバーヘッドになる事例もありましたので、チューニングしておく価値があると思います。

# TSC clocksource と Xen clocksource

ざっくりとした説明としては、それぞれ以下のような性質を持つ時刻の取得源です:

- TSC clocksource : ユーザーランドで特定の CPU レジスタから時刻を読み取る。Linux Kernel や Xen hypervisor の呼び出しを伴わないので速い
- Xen clocksource (Amazon Linux デフォルト): Kernel 経由で Xen の hypervisor から時刻を取得する。Kernel や hypervisor への切替を伴うので遅い。

詳細については記事末尾の参考記事などを参照ください。

なお、過去には TSC の利用は時刻がズレるため危険でしたが、[2015 年時点ですでに TSC の利用は問題ない](https://www.slideshare.net/AmazonWebServices/cmp402-amazon-ec2-instances-deep-dive/24) とされており、今では[公式にも推奨されています](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-linux-performance/)。PV インスタンスで `cat /proc/cpuinfo | grep constant_tsc` などとすることでも TSC サポートが見て取れますし、利用することには問題ないのではないのでしょうか。

# clocksource=TSC に切り替える Ansible 例

clocksource は Linux の起動時のパラメタによって変更することができます。

OS 起動設定を変える方法を(筆者が)よく忘れがちなので、初代 Amazon Linux と Amazon Linux 2 での Ansible の例を下記に記しておきます:

## Amazon Linux

初代 Amazon Linux は grub 1 なので、grub.conf の `kernel` 行に直接 `clocksource=tsc` オプションを足します:

```yml
  - name: Change kernel parameter
    replace:
      dest: /boot/grub/grub.conf
      regexp: '^(kernel (?!.*clocksource=).*)$'
      replace: '\1 clocksource=tsc'
```

## Amazon Linux 2 

Amazon Linux 2 は grub 2 なので grub.conf は `grub2-mkconfig` で生成するのが正しいです。追加の設定は `/etc/default/grub` (中身はシェルスクリプト) に記述します:

```yml
  - name: Change kernel parameter
    lineinfile:
      dest: /etc/default/grub
      state: present
      regexp: "^GRUB_CMDLINE_LINUX="
      line: "GRUB_CMDLINE_LINUX=\"clocksource=tsc\""
      # 他にもオプションを渡したい場合は上記に追加するか、 GRUB_CMDLINE_LINUX=$GRUB_CMDLINE_LINUX clocksource=tsc などとする
    register: grub_cmdline_linux

  - name: update grub config
    command: /usr/sbin/grub2-mkconfig -o /boot/grub2/grub.cfg
    when: grub_cmdline_linux|changed
```

## OS 稼働中に変更

一時的に動作を確認したい場合、OS 動作中に設定することもできます:

```
echo tsc > /sys/devices/system/clocksource/*/current_clocksource
```

# clocksource の確認

以下のようにすることで確認できます:

```
$ cat /sys/devices/system/clocksource/*/current_clocksource
tsc
```

なお、利用可能な clocksource の一覧も確認できます:

```
$ cat /sys/devices/system/clocksource/*/available_clocksource
xen tsc hpet acpi_pm 
```

# 参考記事:

- [使用している Amazon EC2 Linux インスタンスの CPU パフォーマンスを改善するにはどうしたらよいですか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-linux-performance/)
- [Amazon EC2 Instances Deep Dive](https://www.slideshare.net/AmazonWebServices/cmp402-amazon-ec2-instances-deep-dive/24)
- [Performance Tuning EC2 Instances](https://www.slideshare.net/brendangregg/performance-tuning-ec2-instances/42)
- [gettimeofday() not using vDSO?
](https://stackoverflow.com/questions/42622427/gettimeofday-not-using-vdso/42625952#42625952)
- [gettimeofday(2) は VDSO によりユーザー空間で実行される](http://d.hatena.ne.jp/yohei-a/20140913/1410628229)
Postfix で外部からメールを送信

Postfix で外部からメールを送ろうとして、次のようなエラーが出た時の対応です。

```text
An error occurred while sending mail. The mail server responded:  
4.7.1 <scott@example.co.jp>: Relay access denied.
 Please check the message recipient "scott@example.co.jp" and try again.
```

1) まず、telnet でメールサーバーにアクセスできることを確認します。

```text
$ telnet example.co.jp 25
Trying 133.130.98.29...
Connected to example.co.jp.
Escape character is '^]'.
220 mail.example.co.jp ESMTP Postfix
helo example.co.jp
250 mail.example.co.jp
quit
221 2.0.0 Bye
Connection closed by foreign host.
```

>telnet で、rcpt to: コマンドを入力するとエラーが出ます。

2) /etc/postfix/main.cf を編集します。
 IP アドレスが 153.140.201.204 とすると、次のパラメーターを入れます。

> mynetworks = 168.100.189.0/28, 127.0.0.0/8, 153.140.201.204

そして、postfix を再起動します。

```bash
sudo systemctl restart postfix
```

送信できることを、telnet で確認してから、Thunderbird などのクライアントで確認します。

telnet での確認方法です。

```text
$ telnet example.co.jp 25
Trying 133.130.98.29...
Connected to example.co.jp.
Escape character is '^]'.
220 mail.example.co.jp ESMTP Postfix
helo example.co.jp
250 mail.example.co.jp
mail from: scott@example.co.jp
250 2.1.0 Ok
rcpt to: tiger@gmail.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
Subject: Test Postfix
From: scott@example.co.jp
Test
Good Afternoon
.
250 2.0.0 Ok: queued as E1894260C7B
quit
221 2.0.0 Bye
Connection closed by foreign host.
```
Cognos Analytics で IIS(Internet Information Services) セットアップ用のサンプル・スクリプトありますよ

# Cognos AnalyticsでIISをセットアップする用のサンプル・スクリプト・リンク
Cognos AnalyticsのOptional GatewayをWindows環境にセットアップする場合は、IIS(Internet Information Services)をWEBサーバーとして使用する事が多いと思いますが、マニュアルの手順見るととんでもなく面倒くさいです。
**Cognos Analytics 11.0.4 以降のバージョンでの IIS の設定**
https://www.ibm.com/support/knowledgecenter/ja/SSEP7J_11.0.0/com.ibm.swg.ba.cognos.inst_cr_winux.doc/t_gateway_iis.html

こんな面倒くさい手順やらなくても、IISセットアップ用のサンプルのスクリプトが提供されていますよ、というご紹介のみです。
こちらご参照ください。
**Automatic configuration of IBM #CognosAnalytics Gateway on Microsoft Internet Information Service**
https://www.ibm.com/communities/analytics/cognos-analytics-blog/automatic-configuration-of-ibm-cognosanalytics-gateway-on-microsoft-internet-information-service/

上記Blogのリンク先のTechnoteは、定期的に更新されていますので、最新スクリプトを使うようにしましょう。
**Automate the configuration of Microsoft's Internet Information Service to support IBM Cognos Analytics**
http://www-01.ibm.com/support/docview.wss?uid=swg22000097

# エラーになる場合

今やってみたところ、以下のエラーになりました。

```html
) was unexpected at this time.
```

調べたところ、このエラーが出る時は先のサイトで最新スクリプトをダウンロードして使うのではなく、こちらのインストールフォルダにあるCA_IIS_Config.batファイルを使用しましょう、との事でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/c3844ed7-c9d6-8e1e-dde2-77e5570735c4.png)


# Gateway URIの設定
スクリプト設定後、Cognos ConfigurationのGateway URIは以下の様に変更します。
http://web_server_host_name:80/ibmcognos/bi/v1/disp
GASにPOSTする時はリダイレクトのサポートをオンにするのを忘れるな

NodejsでGASにPOSTしようとしたら"Moved Temporarily"というエラーが出ました。

```postToGas.js
const rp = require('request-promise');
const formData = { hoge : 'payload'};
rp({
  url : 'https://script.google.com/macros/s/xxx/exec',
  method : 'POST',
  form : formData
})
```

```result.txt
Moved Temporarily
The document has moved 
<A HREF=\"https://script.googleusercontent.com/macros/echo?user_content_key=aaa;lib=bbb\">here</A>
```

調べてみると request-promise(request) はデフォルトではリダイレクトはフォローされてないようですので、
followAllRedirects をtrueにしたら解決しました。

```new_postToGas.js
const rp = require('request-promise');
const formData = { hoge : 'payload'};
rp({
  url : 'https://script.google.com/macros/s/xxx/exec',
  method : 'POST',
  form : formData,
  followAllRedirects : true
})
//これで正常にPOSTされます

```
angular-cliで使いもしないテスト環境を作りたくない

テストが存在することが理想的だとは思うものの、プロジェクトの規模によってはテストを使わない、プロジェクト構成を可能な限りミニマムにしておきたいことがある。

Angular-CLIでミニマムなプロジェクトを作りたいときに、次のコマンドを入力するようにしている。

```bash
ng new プロジェクト名 --skip-tests
```

`--skip-tests`オプションを付けると、`ng generate component XXX`でspecファイルが作られなくなる。


## 顧客が本当に欲しかったもの

`--skip-tests`オプションでもテスト環境に関するファイルが多数生成される。これを自前で整理するしかないのだろうか…？

![image.png](https://qiita-image-store.s3.amazonaws.com/0/2544/3e4d33fe-43d3-5f9a-ca36-5656416603ed.png)
S3 × CloudFront × ACM × Route53 静的サイトのSSL化 - 参考になった記事

AWSで静的サイトのSSL化について調べて、やってみたので参考になった記事を備忘します。
今回、 https://s3.koshikawa.net という独自ドメインをSSL化してみました。

<img width="600" alt="スクリーンショット 2018-05-14 14.35.51.png" src="https://qiita-image-store.s3.amazonaws.com/0/51734/d8c92d86-1a21-703b-3177-1253bc29d5fc.png">

# 全般

- [CloudFrontでS3のウェブサイトをSSL化する](https://qiita.com/jasbulilit/items/73d70a01a5d3b520450f)
  - ほぼこちらの記事通りやればできました。
  - ただ、設定完了したと思ったら、設定中はS3のURLにリダイレクトされる仕様があるらしく、以下を参考に30m~1h程度待ったら反映されていました。
    - [S3がOriginのCloudFrontを設定したら307 Redirectされる](http://miyasakura.hatenablog.com/entry/2016/12/28/200000)


# S3で静的Webサイトホスティング

- [独自ドメインを使ってAmazon S3で静的Webサイトをホストする](https://qiita.com/Ichiro_Tsuji/items/c174d580587a622d3358)
- [AWSのS3で静的サイトを公開する方法](http://blog.otsukasatoshi.com/entry/2017/07/26/090000)
- [静的ウェブサイトホスティング用に S3 バケットを設定する方法](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/user-guide/static-website-hosting.html)

# SSL証明書について AWS Certificate Manager

- [AWS Certificate Managerについてザクっと調べてみた](https://recipe.kc-cloud.jp/archives/8646)

# お名前.com の設定とか

- [【AWS】【Let's Encrypt】Let's Encryptを使っての証明書発行をAWS Certificate Managerにして、お名前.comに設定する](http://fujiyasu.hatenablog.com/entry/2018/02/04/150253)

# サブドメインwwwのリダイレクト設定

- [Route53 で S3 バケットへ alias レコードを作った際のリダイレクトのふるまい](https://53ningen.com/route53-s3-alias-redirect/)
- [Amazon Route 53 を使用してドメインを別のドメインにリダイレクトする方法はありますか?](https://aws.amazon.com/jp/premiumsupport/knowledge-center/redirect-domain-route-53/)
WindowsのJIS配列キーボードの変換・無変換キーに英数・カナ切替を割り当てる

家で使用しているMacのキーボードは、スペースキーの横に英数・カナ切替ボタンがあり非常に使いやすので、会社で使用しているWindowsのJIS配列キーボードの変換・無変換キーに同様の機能を割り当ててみました。

## 方法(Microsoft IMEの場合)
1. IMEのプロパティを開く
2. `詳細設定`をクリック
3. `全般`タブを選択し`編集操作－キー設定`の`変更`ボタンをクリック
4. `無変換キー`の`入力/変換済み`列の値を`IME-オフ`に変更
5. `変換キー`の`入力/変換済み`列の値を`IME-オン`に変更
Cognos をデータ・ダウンローダーとして使用する時の注意点

#概要
Cognos AnalyticsやCognos BIを、データ・ダウンローダーとして使用する環境が結構あります。
基本的にCognosはビジネス・インテリジェンスのツールで、レポートやダッシュボードを作るためのツールなので、単純なデータ・ダウンロード用途としてはあまり向いていません。
しかしながら、エンドユーザーの方が自分でデータアイテムを組み合わせて、必要なデータを生成してダウンロードできるのはやはり便利なので、データ・ダウンロードの要件は常に存在します。

このテーマは、過去Cognosのプロジェクトで何度も問題になってきた重要なテーマなので、実機での検証結果とともに、是非覚えておいて頂きたい考慮点をまとめておきたいと思います。

#検証結果
先に実機テストでやった事と結果を記載します。

**環境**
Cognos Analytics 11.0.11 on Redhat 6.8

**ダウンロード・データイメージ**
この様なイメージのリストレポート(GOSALESサンプルデータ51列)を、Excel、Excel Data、CSV形式でダウンロードしてみました。
![001.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/d346668d-ace6-e8c0-4bda-5e45e0803453.jpeg)

**シナリオ及び結果**
色々なバリエーションでデータダウンロード時の、実行時間、BIBusTKServerMainプロセスの使用メモリ、Cognos一時領域の使用容量を結果にまとめました。
![002.JPG](https://qiita-image-store.s3.amazonaws.com/0/147246/80a6cd4f-780c-600d-e969-ce62193c608c.jpeg)

#結果からわかる事
では、結果一覧から読み取れる事を記載していきます。

**出力形式での比較(No 1,2,3 or 4,5,6)**
Excel形式の出力が、他の出力方式に比べて、やはり最も時間がかかり、消費メモリーや一時領域使用も大きい事がわかります。

それぞれの出力形式の意味は、こちらをご参照下さい。
・Microsoft Excel 形式のレポートの作成
https://www.ibm.com/support/knowledgecenter/ja/SSEP7J_11.0.0/com.ibm.swg.ba.cognos.ug_cr_rptstd.doc/c_cr_rptstd_intrd_producing_reports_inexcel_format.html#cr_rptstd_intrd_producing_reports_inexcel_format
・CSV 形式のレポートの作成
https://www.ibm.com/support/knowledgecenter/ja/SSEP7J_11.0.0/com.ibm.swg.ba.cognos.ug_cr_rptstd.doc/c_cr_rptstd_intrd_csv_format.html#cr_rptstd_intrd_csv_format

**クエリーモードでの比較(No 1,2,3 vs 4,5,6)**
CQM(互換モード)でもDQM(動的モード)でも特に実行時間や消費リソースに違いは見られない事がわかりました。
	
**ダウンロード件数での比較(No 4 vs 7 vs 8)**
きれいに比例するわけではないですが、ダウンロード件数が多いと、実行時間、消費リソースは大きくなる事がわかります。
	
**Report Server bitモードでの比較(No 4 vs 9)**
64bitモードにすると、実行時間は多少短縮しますが、リソース使用はメモリーも一時領域も結構増える事がわかります。

#考慮すべきポイント
Cognosの提案や要件定義でデータ・ダウンロードの要件がある時、以下の点を考慮すると良いと思います。
・Excel形式でのダウンロードは時間も負荷も大きいので、可能な限り別の方式のダウンロードを使用する
・リソースとして、BIBusTKServerMain(Report Server)のメモリーと一時領域に注意する。必要容量は、実際にダウンロードするデータ容量(※結果のExcelファイルサイズ参照)より遥かに大きい容量が必要となる。特に、BIBusTKServerMainは、Cognos Analyticsのデフォルトでは32bitなので、メモリー使用が2GBを超えるとエラーとなる。一時領域は、ざっくり100GB程度は用意するのが望ましい。
・経験上、10万件くらいを超えてくると、非常に危険になってくるので、ダウンロード件数の要件は必ず確認しておく。
・Report Server 64bitモードでは、CQM(互換モード)が使用できないので、その制限は理解しておく。
例：汎用ODBC接続が使えない、監査ログにネイティブ・クエリーが出力できない、移行の場合CQM→DQMモデル変換は結構大変、などなど

以上です。
問題となっている環境を何度もお見かけした、Cognos永遠のテーマとも言える重要な議題なので、是非覚えておいて頂き、致命的な事にならないようにお気をつけ頂ければと思います。
PHPWordでdocxに編集履歴を付ける

PHP Wordという、docxをPHPを使って作成できるツールがあります。
今回、コレを使って、[PHPにWordの校閲機能である「編集履歴」](https://teachme.jp/contents/23203)をつける必要があったので、つけてみます。


# PHP Wordのインストール

`dev-develop`ブランチでしかまだ対応してないので、そこを落とします。

```bash
composer require phpoffice/phpword:dev-develop
composer update
```


# 編集履歴「追加」

```php
$text = $section->addText('ボクはnnahitoによって追加されたテキストだよ。');
$text->setTrackChange(new TrackChange(TrackChange::INSERTED, 'nnahito'));
```


# 編集履歴「削除」
```php
$text = $section->addText('消された(´；ω；｀)');
$text->setChangeInfo(TrackChange::DELETED, 'Nな人', new \DateTime('@' . (time() - 3600)));
```


# 参考

え？全体的な使い方を知りたい？
↓こことか参考になるよ！！！（ステマ）
https://nnahito.com/articles/31
CData API Server ハンズオン（サマリ 編） 2018/05

CData API Server ハンズオン（サマリ 編）2018/05

# はじめに

本資料は、[CData Software Japan](http://www.cdata.com/jp/)のCData API Server ハンズオン向けの資料です。本ドキュメントをもとに実機にCData製品をインストールして手順に沿って実際に各種ツールやプログラムから使用する事でCData製品の特徴や具体的な利用方法を理解して頂くことを目的としています。

# 前提環境

ハンズオンには以下の環境が必要となります。

※ハンズオン環境のマシンは、下記の前提環境を満たしておりますので本手順は不要です。

- Windowsマシン
- インターネットへ接続可能　※プロキシサーバ経由でのアクセスが必要な場合は事前にご連絡ください
- Windowsの管理者権限が付与されており、プログラムのインストールが可能であること

# 事前準備

ハンズオンを行うマシンにインストールが必要なソフトウェアは以下の通りです。事前にインストールしてください。

※ハンズオン環境のマシンは、下記のソフトウェアを事前にインストールしておりますので本手順は不要です。

- [MySQL Community Edition](https://www.mysql.com/jp/products/community/)
- [Microsoft Power BI Desktop](https://powerbi.microsoft.com/ja-jp/desktop/)
- [Postman](https://www.getpostman.com/) 

# CData Software社、および、CData　API Server製品概要

以下のスライドをご覧ください。

[SlideShare - CData API Server ハンズオン](https://www.slideshare.net/cdatajapan/cdata-api-server-89593261)

# ハンズオン

## RDBやクラウドサービス・NoSQLからAPIを作ってみよう

- [**RDBからWebAPIをポイント＆クリックで作成**](https://qiita.com/kuwazzy/items/c664570c9d4732a57fac)
- [**Salesforceの取引先担当者情報からWebAPIをポイント＆クリックで作成**](https://qiita.com/sugimomoto/items/5e6798a926fbcff9ce99)
- [**MongoDB NoSQLデータからWebAPIをポイント＆クリックで作成**](https://qiita.com/sugimomoto/items/dcd23466849f114d7bb5)

## 作ったAPIを使ってみよう

- [**CData API Server で作成したWebAPIにPostmanからアクセス**](https://qiita.com/kuwazzy/items/58ec47afdf0f6d9b23f2)
- [**CData API Server で作成したWebAPIにBIツール(PowerBI)からアクセス**](https://qiita.com/kuwazzy/items/14a46c9159e10eaf75fe)
- [**(ご参考)Azure Machine Learning に外部データをフィードする方法（CData API Server からOData でフィード）**](https://qiita.com/jonathanh/items/1bd5b5516e4b4b13aa17)

## Angular ハンズオンでの API Server の設定注意点

「設定 > サーバー」タブ内の「クロスオリジンリソースシェアリング （CORS）」の設定を行います。これは、Ajaxアプリケーションから複数の異なるドメインへのアクセスを許可するための設定です。

| 項目       | 値 |
|:-----------------|:------------------|
| クロスオリジンリソースシェアリング （CORS）を有効化する  | ON |
| すべてのドメインを '*' なしで許可  | ON |
| Access-Control-Allow-Methods:  | GET,PUT,POST,OPTIONS |
| Access-Control-Allow-Headers:  | authorization,Content-Type|

![image.png](https://qiita-image-store.s3.amazonaws.com/0/123181/4a0d78bf-a55c-1adf-bb5b-5cfd39bd8e31.png)

設定したら「Save Changes」ボタンをクリックして保存します。

# (ご参考)CData製品ビルド格納パス　※Amazon S3

- [CData ADO.NET Provider for Salesforce](https://s3-ap-northeast-1.amazonaws.com/cdatajbuilds/HandsOn/20180517/SalesforceADO.NETProvider.exe)
- [CData ADO.NET Provider for MongoDB](https://s3-ap-northeast-1.amazonaws.com/cdatajbuilds/HandsOn/20180517/MongoDBADO.NETProvider.exe)
- [APIServer](https://s3-ap-northeast-1.amazonaws.com/cdatajbuilds/HandsOn/20180517/CDataAPIServer.exe)
CREATE TABLE文のDEFAULT ON NULL句を試す（Oracle Database 12c)


Oracle Database 12cの新機能CREATE TABLE / ALTER TABLE文の列に指定するON NULL句を試します。

# 列のデフォルト値
テーブルに対してINSERT文を実行した場合、値を指定しない列の値はNULL値になります。下記の例ではINSERT文でc1列を省略しているため、NULL値が格納されています。

```
SQL> CREATE TABLE def1(c1 NUMBER, c2 VARCHAR2(10));

表が作成されました。

SQL> INSERT INTO def1(c2) VALUES('data1');

1行が作成されました。

SQL> SET NULL NULL
SQL> SELECT * FROM def1;

        C1 C2
---------- ----------
NULL       data1
```
# DEFAULTの指定
省略時に自動的に指定を行う場合には列に対してDEFAULTを指定します。
下記の例ではc1列が省略されていた場合には100を格納します。

```
SQL> CREATE TABLE def2(c1 NUMBER DEFAULT 100, c2 VARCHAR2(10));

表が作成されました。

SQL> INSERT INTO def2(c2) VALUES('default1');

1行が作成されました。

SQL> SELECT * FROM def2;

        C1 C2
---------- ----------
       100 default1

```

DEFAULTにはリテラル値だけでなく、シーケンスも指定することができます。

```
SQL> CREATE SEQUENCE seq1;

順序が作成されました。

SQL> CREATE TABLE def3(c1 NUMBER DEFAULT seq1.NEXTVAL, c2 VARCHAR2(10));

表が作成されました。

SQL> INSERT INTO def3(c2) VALUES ('sequence1');

1行が作成されました。

SQL> INSERT INTO def3(c2) VALUES ('sequence2');

1行が作成されました。

SQL> SELECT * FROM def3;

        C1 C2
---------- ----------
         1 sequence1
         2 sequence2
```

DEFAULT指定は列値を指定しない場合の値なので、明示的にNULLを指定するとNULL値が格納されます。列にNOT NULL属性が指定されていた場合（またはPRIMARY KEY制約が指定されていた場合も）には、NULL値の入力はエラーになります。
下記の最初の例では強制的にNULL値が格納されています。次の例ではORA-01400が発生しています。

```
SQL> CREATE TABLE def4(c1 NUMBER DEFAULT 100, c2 VARCHAR2(10));

表が作成されました。

SQL> INSERT INTO def4 VALUES (NULL, 'nullval');

1行が作成されました。

SQL> SELECT * FROM def4;

        C1 C2
---------- ----------
NULL       nullval

SQL> CREATE TABLE def5(c1 NUMBER DEFAULT 100　NOT NULL, c2 VARCHAR2(10));

表が作成されました。

SQL> INSERT INTO def5　VALUES(NULL, 'nullval');
INSERT INTO def5　VALUES(NULL, 'nullval')
                         *
行1でエラーが発生しました。:
ORA-01400: ("SCOTT"."DEF5"."C1")にはNULLは挿入できません。
```

# ON NULL句の指定
DEFAULT句にON NULL句を追加すると、省略時と同様に、NULL値が指定された場合でもに強制的に入力される値を指定することができます。
下記の例ではテーブル作成時にDEFAULT ON NULL 20を指定しているため、c1列に対してNULLを指定された場合でも20が格納されています。

```
SQL> CREATE TABLE def6(c1 NUMBER DEFAULT ON NULL 20 NOT NULL, c2 VARCHAR2(10));

表が作成されました。

SQL> INSERT INTO def6 VALUES(NULL, 'nullval');

1行が作成されました。

SQL> SELECT * FROM def6;

        C1 C2
---------- ----------
        20 nullval
```
デザインのスタイルガイドAstrumを導入する

# Astrumとは
めちゃイケてるスタイルガイド
詳しくはこの２つを
http://astrum.nodividestudio.com/
https://www.npmjs.com/package/astrum

## 導入方法
### astrumをグローバルにインストールしてコマンドを使えるようにする
```
$ npm install -g astrum
```

### スタイルガイドを格納するディレクトリを自動作成し、決定
```
$ astrum init ./application/styleguide
```

### 対話形式で新しい部品を作成
```
$ astrum new buttons/default
```

### ビルド済みのスタイル, jsを読み込む
```json:data.jsonの32行目
    "assets": {
        "css": [],
        "js": []
    },
```

### インスタンスサーバーでastrumを起動
```
$ cd ./application/styleguide && php -S localhost:8888
```

### 新たな部品の追加
```
$ astrum new buttons/super
```

### 追加した部品の削除
```
$ astrum delete buttons/default
```

## 最後に
後は画面を見て指示に従ってhtmlを記述するだけです！
良いスタイルガイドを作りましょう！
WindowsServerでNTPサーバを指定する

未だにWindowsServerの時刻同期はW32timeサービスによって管理されている。
ADドメインに参加したWindowsサーバOSでNTPサーバ指定を変更する方法をナレッジとして登録する。


# NTPサーバーを指定する

## 1.Windows Timeサービスを開始する
サービス管理コンソールにて"Windows Time"を開始する

## 2.タイムプロバイダ設定を確認する
現在のタイムプロバイダを確認。/sourceオプションはNTP要求先の確認、/peersオプションはNTPサーバとの同期状態を確認できる。

```:
C:\Windows\system32> w32tm /query /souce
HostName(Active Directory Server Name)

C:\Windows\system32> w32tm /query /peers
ピア数: 1
ピア: HostName
状態: アクティブ
残り時間: 23619.029770s
モード: 3 (クライアント)
階層: 1(主参照 - 電波時計で同期)
ピアポーリング間隔: 15 (32768s)
ホストポーリング間隔: 15 (32768s)
```

## 3.タイムプロバイダを変更する
/manualpeerlistオプションでNTPサーバのアドレスを指定する。サーバーアドレス指定の後に",0x8"とか",0x9"とか指定することがある。これはNTPサーバーに対する挙動を示す。

Clientモードで動作する挙動指定は下記の通り。

:::note warn
Clientモードは時刻同期を受け取るだけのモード。基本的にはこれを使う。
:::

|挙動の指定|動作説明|
|:-:|:-:|
|0x8|RFC1305に準拠した同期を行う|
|0x9|一定の間隔で同期を行う|

:::note alert
Clientモードの他にSymmetricActiveモードというものがある。SymmetricActiveモードは指定したNTPサーバと相互同期を行う。相手にも時刻同期の修正を要求してしまう為、外部NTPサーバにやっちゃダメ。
:::

|挙動の指定|動作説明|
|:-:|:-:|
|0x1|Windowsで実装した一定間隔での同期|
|0x2|フォールバック時に利用するNTPサーバを指定|
|0x4|RFC1305に準拠した間隔での同期||


/syncfromflagsオプションはmanual(手動指定)もしくはdomainhier(ADドメイン指定)のどちらかを選ぶ。

```:
C:\Windows\system32> w32tm /config /update /manualpeerlist:ntpサーバアドレス /syncfromflags:manual
コマンドは正しく完了しました。
```

:::note warn
NTPサーバと通信できないとコマンドが正しく完了してもタイムプロバイダが更新されない。
:::

## 4.タイムプロバイダを確認する

```:
C:\Windows\system32> w32tm /query /souce
NTPサーバのIPアドレス

C:\Windows\system32> w32tm /query /peers
ピア数: 1
ピア: NTPサーバのIPアドレス
状態: アクティブ
残り時間: 97.6056001s
モード: 3 (クライアント)
階層: 2(二次参照 - (S)NTP で同期)
ピアポーリング間隔: 17 (有効範囲外)
ホストポーリング間隔: 10 (1024s)
```

# 余談

## ActiveDirectoryドメインの時刻同期について
メンバーとなるサーバーOSとActive Directoryサーバ間の時刻同期は64秒ごとに行われる。時刻同期の間隔は常に64秒がキープされているわけではない。64->128->256->512->1024(17分)と次第に時刻同期の間隔が延び、パケットの送受信頻度を減らすようになっている。
Active Directoryサーバ間の時刻の問い合わせはSymmetricActiveモードで行われるが、返答はClientモードで返される。

::: note warn
PDCエミュレータが権限のある時刻サーバとして認識されている為
:::

# 参考

## Capm Network　さん

http://capm-network.com/?tag=Windows-NTP%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E8%A8%AD%E5%AE%9A

## @it さん

http://www.atmarkit.co.jp/ait/articles/1203/15/news121.html

http://www.atmarkit.co.jp/ait/articles/1205/17/news135.html

http://www.atmarkit.co.jp/ait/articles/1205/17/news135_2.html

## Microsoft公式

https://docs.microsoft.com/ja-jp/windows-server/networking/windows-time-service/windows-time-service-tools-and-settings
WPS | WRF > namelist.wps | namelist.input > 空間と時間に関する設定 > 設定内容に関するリンク

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
GeForce GT 730 1GB GDDR5
CentOS 6.9 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

WRF(Weather Research and Forecasting Model)とその前処理であるWPS関連。

## 空間と時間に関する設定

WPSとWRFにおいて空間と時間に関する設定項目の説明リンクを整理しておく。

関連: [WPS | WRF > Link > namelist.wps | namelist.input > 設定項目の情報サイト (2018年5月14日版)](https://qiita.com/7of9/items/e39a6487a01f799ce01e)

### WPS

- [interval_seconds](http://www2.mmm.ucar.edu/wrf/users/namelist_best_prac_wps.html#interval_seconds)
    - 入力データの時間分解能
- [dx](http://www2.mmm.ucar.edu/wrf/users/namelist_best_prac_wps.html#dx_dy)
    - This is given in meters for the Lambert, Polar, and Mercator projections.
    - coarse domain resolutionのみ設定する
    - dx, dyは同じ値にする (推奨 for Lambert)
- [dy](http://www2.mmm.ucar.edu/wrf/users/namelist_best_prac_wps.html#dx_dy)

### WRF

- &time_control
    - [interval_seconds](http://www2.mmm.ucar.edu/wrf/users/namelist_best_prac_wrf.html#interval_seconds)
- &domains
    - [time_step](http://www2.mmm.ucar.edu/wrf/users/namelist_best_prac_wrf.html#time_step)
        - 推奨: use a value of 5-6xDX (in km) for a typical case
        - 垂直分解能が高い場合、小さくする
        - CFL errors > unstableとなる > 小さくすること (4xDX or 3xDX)
        - history_intervalの整数割り(約数)にするとよい
    - [dx](http://www2.mmm.ucar.edu/wrf/users/namelist_best_prac_wrf.html#dx_dy)
        - parent_grid_ratioと合わせて、「正確な」値にしないといけない
    - [dy](http://www2.mmm.ucar.edu/wrf/users/namelist_best_prac_wrf.html#dx_dy)
    - [parent_grid_ratio](http://www2.mmm.ucar.edu/wrf/users/namelist_best_prac_wrf.html#parent_grid_ratio)
    - parent_time_step_ratio: [parent_grid_ratio](http://www2.mmm.ucar.edu/wrf/users/namelist_best_prac_wrf.html#parent_grid_ratio)の下に説明がある。
        - モデルにunfamiliarであれば3:1にする
- &fdda
    - [gfdda_end_h](https://pubs.usgs.gov/sir/2014/5089/downloads/namelist.README) 
        - time (in hours) to stop nudging after start of forecast
    - [gfdda_interval_m](https://pubs.usgs.gov/sir/2014/5089/downloads/namelist.README)
        - time interval (in min) between analysis times (must use minutes)
    - [gt](https://pubs.usgs.gov/sir/2014/5089/downloads/namelist.README)
        - nudging coefficient for temp (sec-1)
さくらのクラウドからServersMan@VPSに乗り換えてみる

#はじめに
クーポン2万円分をもらえたことから
現在さくらのクラウドを2年半ほど使っていますが、
そこまで使いこなせていないし、自分にはちょっと高いかなと思い、ServersMan@VPSに乗り換えようと思います。

#ServersMan@VPSとさくらのクラウドを比較してみる
##さくらのクラウドの場合
今契約しているプランです。
一番安いプランだと思いますが、それでも2000円弱かかっています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201860/dce02ea8-8368-bda9-d8d5-afb029f527eb.png)

ちなみに、以下のサイトから簡単に料金のシミュレーションを行えます。
https://cloud.sakura.ad.jp/payment/simulation/#/

###メリット
1．困ったら調べると、色々とでてくる。(情報源が豊富)
2．SSDなので、はやい気がする(違いが分かるほど、使いこなすことはできなかった。。。)

###デメリット
1．高い（私にとっては）

##ServersMan@VPSの場合
基本的な料金体制は、3種類のようです。
月の途中から契約した場合は、日割り計算になるようです。

ServersMan@VPS公式
http://dream.jp/vps/service.html#service_01

![image.png](https://qiita-image-store.s3.amazonaws.com/0/201860/ef61b18a-7fa6-f138-4a3e-59e66e6583e4.png)

###メリット
1．安い！

###デメリット
1. HDDだから今より遅くなる？かも

#その他ServersMan@VPSの基本情報
※2018年5月時点
1. グローバルIPがついている
2. root権限がつかえる
3. CentOSは６か７を選択可能

今さくらのクラウドで動かしているレベルのアプリケーションなら、
移行させても大丈夫でしょう。
（月1500円も違うし！）

#申し込みしてみる
早速、公式ページより申し込みしていきます。
![2018-05-14_093919.png](https://qiita-image-store.s3.amazonaws.com/0/201860/a932845d-4527-bd38-5239-447d7feb21fd.png)

メールアドレス認証後、契約プランを選択できます。
自分でカスタマイズも選択できましたが、
私はCentOS7を使用したく、その他の不要なものはいらないので、
人気No1のプランを選択しました。
![2018-05-14_094243.png](https://qiita-image-store.s3.amazonaws.com/0/201860/db9c6963-24e6-3ad6-2dbd-23e0a09c580f.png)

後は、個人情報と支払方法を入力して完了です。
ログイン情報は、メールで送信されてきました。
TeraTermでログインしたところ、特に詰まることなくサーバに接続できました！

#次回
CentOS7の最低限の設定を、簡単にまとめました！
サーバ設定初心者の方向けの記事になります。

[CentOS7の初期設定をしてみよう](https://qiita.com/ryuji_i3/items/d786f725e3f7c8614b2e)
Ratpack入門 (番外編) - Kotlinで書くRatpack

RatpackはJavaおよびGroovy向けに作られていますが、JVMで動くということは当然、KotlinやScalaのようなほかの言語でも動作します。ここではKotlinでRatpackを書くとどんな感じなのか、ちょっとしたtipsを書いておきます。何かもっといいアイデアがありましたら、ぜひコメント欄でシェアしていただければ幸いです。


## DSL風の記述

RatpackはGroovyのDSLを活用するため、多くの個所でラムダを引数に受け取るメソッドを持っています。例えば、サーバーにハンドラーを設定する部分は以下のように記述できます。

```java
RatpackServer.start(spec -> {
    spec.handlers(chain -> {
        chain.get("index.html", ctx -> {
            ctx.render(ctx.file("index.html"));
        });
    });
});
```

Kotlinはメソッドの引数の最後がラムダを受け取るとき、そのラムダを丸括弧の外側に記述することができます。また、ラムダの引数のプレースホルダーとして、`it`を使用することができます。

```kotlin
RatpackServer.start {
    it.handlers {
        it.get("index.html") {
            it.render(it.file("index.html"))
        }
    }
}
```

さすがにGroovyには劣りますが、DSL風の見た目でコードを記述することができます。


## オペレーター関数

Ratpackは多くの部分で`Action`という関数型インターフェースが用いられています。これはJava 8の`Consumer`に相当するもので、何かの設定を行うのによく使われます。例えばハンドラーをサーバーに設定する`handlers()`メソッドは、`Action<Chain>`を引数に持ちます。このチェーンにURLとハンドラーのマッピングを設定していくわけですが、ある程度ハンドラーが増えてくると、この`Action`を分割したくなってきます。分割された`Action`は`append()`メソッドを使って一つにまとめることができます。でも何度も`append()`を繰り返すのは見た目が分かりづらくなります。出来れば中置記法を使いたいところです。
Kotlinの[Operator overloading](https://kotlinlang.org/docs/reference/operator-overloading.html#operator-overloading)を使い、演算子で結合できるようにしましょう。

```kotlin
operator fun <T> Action<T>.plus(other: Action<in T>): Action<T> = this.append(other)

fun createHandlers() = AccountAction() + HistroyAction() + // ...
```

いうまでもなく、演算子オーバーロードの使い過ぎは厳禁です。


## `Pair`とDestructuring Declaration

`Promise`の`flatRight`などのメソッドは、複数の`Promise`をまとめる、比較的よく使う便利なメソッドです。戻り値の型はRatpackにおけるタプルである`Pair`型になります。
タプルは便利ではありますが、サポートのないプログラミング言語(つまりJava)では`left`、`right`のようなメソッドを使って値を取得しなければならず、アンチパターンとされる場合もあります。

Kotlinはタプルそのもののサポートはありませんが、代わりに[Destructuring Declaration](https://kotlinlang.org/docs/reference/multi-declarations.html)という機能で、疑似的なタプルを実現しています。これは各クラスに`componentN()`(Nは数字)メソッドを持っていると、それぞれの`componentN()`を分割して使用できる機能です。
Ratpackの`Pair`には当然`component1()`メソッドは持っていませんが、拡張メソッドとして実装することで、疑似的に分割代入できるようにします。

```kotlin
operator fun <T> Pair<T, *>.component1(): T = this.left
operator fun <T> Pair<*, T>.component2(): T = this.right
```

`Pair`を分割しているこのような古いコードが

```kotlin
authenticator.checkLoggedIn(ctx).flatRight {
    ctx.parse(ReportParameter::class.java)
}.nextOp { pair ->
    val user = pair.left
    val parameter = pair.right
    // (...)
}
```

このように書けるようになります。

```kotlin
authenticator.checkLoggedIn(ctx).flatRight {
    ctx.parse(ReportParameter::class.java)
}.nextOp { (user, parameter) ->
    // (...)
}
```

惜しいのはIDEの補完が利かず、拡張メソッドの`import`文を自分で書かなければいけない点です。
CentOS7.3にNTPサーバを立てる

# 概要
・NICTに時刻同期を行い、所定のネットワークにあるマシンからの時刻同期要求を受け付ける

# 導入・構築

# 1.NTPDのインストール

```:
[root@servername]# yum -yinstall ntp
```

# 2.NTPDの設定編集

①設定ファイルを開く

```:
[root@servername]# vi /etc/ntp.conf
```

②同期を取るサーバを変更する

```apache:ntp.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html)
# server 0.centos.pool.ntp.org iburst
# server 1.centos.pool.ntp.org iburst
# server 2.centos.pool.ntp.org iburst
# server 3.centos.pool.ntp.org iburst
server ntp.nict.jp minpoll 6 maxpoll 10
server ntp1.jst.mfeed.ad.jp minpoll 6 maxpoll 10
server ntp2.jst.mfeed.ad.jp minpoll 6 maxpoll 10
```
minpoll..最小ポーリング間隔
maxpoll..最大ポーリング間隔
時刻同期が指定のNTPサーバとズレが無くなってきたら、最大ポーリング間隔まで時刻同期のタイミングを遅らせることができる。

③時刻同期を許可するネットワークを定義する

```apache:ntp.conf
# Host on local network are less restricted.
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
restrict xxx.xxx.xxx.xxx mask xxx.xxx.xxx.xxx nomodify notrap
```

# 3.NTPサービス開始&スタートアップ登録

```:
# サービス開始
[root@servername]# systemctl start ntpd

# OS起動時にサービスを開始する(スタートアップ登録)
[root@servername]# systemctl enable ntpd
```

# 4.NTP通信をfirewallに通す

```:
[root@servername]# firewall-cmd --add-service=ntp --permanent
success
[root@servername]# firewall-cmd --reload
success
```

# 5.動作確認

```:
[root@servername]# ntpq -p

remote                refid     st t when poll reach  delay  offset  jitter
============================================================================
*ntp-b2.nict.go. .NICT.          1 u   31   64  377   7.641  -20.779  5.652
+ntp1.jst.mfeed. 133.243.236.17  2 u   28   64  377   5.827  -10.895  7.063
+ntp2.jst.mfeed. 133.243.236.17  2 u   21   64  377   6.632  -13.189  4.819
```

# 参考
+ serverworld さん
https://www.server-world.info/query?os=CentOS_7&p=ntp

+ tetuyai's Blog さん
http://tetsuyai.hatenablog.com/entry/20110411/1302491562
MySQL で英数字のデータを絞り込む

## アルファベットで始まるデータ
```sql
SELECT * FROM `users` WHERE name REGEXP '^[a-zA-Z]'
```
## アルファベットのみのデータ
```sql
SELECT * FROM `users` WHERE name REGEXP '^[a-zA-Z]+$'
```
## 数字で始まるデータ
```sql
SELECT * FROM `users` WHERE name REGEXP '^[0-9]'
```
## 数字のみのデータ
```sql
SELECT * FROM `users` WHERE name REGEXP '^[0-9]+$'
```
WPS | WRF > Link > namelist.wps | namelist.input > 設定項目の情報サイト (2018年5月14日版)

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
GeForce GT 730 1GB GDDR5
CentOS 6.9 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

WRF(Weather Research and Forecasting Model)とその前処理であるWPS関連。

- WPS: namelist.wps
- WRF: namelist.input

上記のファイルの設定項目の意味を紹介しているサイト情報の再整理。

### お薦め 1. 

http://www2.mmm.ucar.edu/wrf/users/namelist_best_prac_wps.html
http://www2.mmm.ucar.edu/wrf/users/namelist_best_prac_wrf.html

関連: [WRF / WPS > Link > namelist.wps / namelist.input > Best practices](https://qiita.com/7of9/items/cd51fda538a8d142b130)

### お薦め 2.

https://esrl.noaa.gov/gsd/wrfportal/namelist_input_options.html

関連: [WRF > namelist.inputのパラメータの説明](https://qiita.com/7of9/items/d2f1bcba840f1f573621)

### お薦め 3.

WRF-NMMの設定例。
https://pubs.usgs.gov/sir/2014/5089/downloads/namelist.README
(WRF-ARW)との違いは未確認。

### お薦め 4.

はじめてのWRF > ナッジング (3D grid nudging) @ 三重大学 生物資源学部 > 未来海洋予測学研究室
https://sites.google.com/site/afcwrf/home/fdda

ナッジング関連の設定(&fdda)の説明がある。

### 一応、公式サイト

上記のサイトで見つからない場合は、以下。

[Chapter 3: WRF Preprocessing System (WPS)](http://www2.mmm.ucar.edu/wrf/users/docs/user_guide_V3/users_guide_chap3.htm)

[「Description of the Namelist Variables」移行](http://www2.mmm.ucar.edu/wrf/users/docs/user_guide_V3/users_guide_chap3.htm#_Description_of_the_1)に説明がある。
正規表現にマッチしたディレクトリを zip 圧縮したい

これ系の話はそっち方面の方々からマサカリとんできそうで怖いのですが、気分転換がてらたまにはいいかなって。

タイトルのとおり。
たとえば「ログファイルが保存されている日付ディレクトリをそれぞれ zip 圧縮したい」というとき、いろんな方法がありますが私はこれが好み、という話です。

で早速ですが、ログフォルダの名前が「2018-05-14」のようなものだった場合、こう。

```bash
for row_name in `find . -type d -regextype posix-egrep -regex "./[0-9]{4}-[0-9]{2}-[0-9]{2}"`
do
  log_dir=`echo $row_name | tr -d ./`
  zip -r ${log_dir}.zip ${log_dir}
  rm -rf ${log_dir}
done
```
「find の正規表現で引っ掛けて for に渡してループ処理する」というもの。
このやり方の利点は

- 「find コマンドに regex というオプションがある」ことだけ覚えておけば、後はその都度ググればいい。
- 普段使ってる正規表現が使える。
- シェルスクリプト書くテイでどうにでもできる。

ということ。
（すこし加齢臭がする手法なことが欠点）

例えば最新の２つは処理対象から外したいなんてときは find の後 sort だの tail だのに渡せばいいだろうし、追加でなにか処理したければループ内でなんでもできる。
あまり小ざかしくなく、シンプルに融通がきくところが気に入っています。


「ログファイルを圧縮って、そんなん td-agent で S3 に上がってんじゃないの？」っておっしゃいますけど、こういうのもまだ必要な場面があるんですよ。
[保存版]プログラミングのエラーを解決する７つの方法

## プログラミングのエラーを解決する７つの方法
開発するうえで、頻繁にエラーに遭遇している。
その時どんな風に問題解決を行うのか。
　
これを体系的にまとめていきたい。
さらにプログラミングにおける王道の問題方法を構築したい。
　
## エラー解決の流れ
コーディング
↓
エラーの発生
↓
周りの人に相談してみる。話をする過程で、散らかった『脳内が整理』されて問題が解決する場合があるので、極論いえば相手は誰でもいい。
↓
英語のエラーメッセージを翻訳（これめちゃくちゃ大事）→日本語にして理解できたらそのままコードの修正→解決
↓
エラーでGoogle検索する→解決策が見つかる→解決（ここまでは普通）
↓
検索して１５分以上経過。何件もサイトをはしごして試行錯誤してみても解決しない（ここらへんからハマっている状態）
↓
検索を続けると集中力が切れて思考停止していくので、エラーが出る原因を考えてどういう可能性があるのか洗い出す。
簡単にでもいいから文章に起こしたほうが良い。
書き出す事は『脳内を整理』するのに役立つ。
↓
これでだめなら（可能なら）帰る、寝る。翌朝改めて挑む。
これはふざけてるようで、結構成功する確率が高いエラー解決法。
一晩寝てリセットし『脳内の整理』が行われるようだ。さらに朝一は脳のパフォーマンスが発揮されやすい。
↓
問題棚上げ。そのエラーを解決する優先度を考える。重要じゃないのであれば棚上げしてしまう（後日対応）。
重要だとしても、解決が無理（＝すごく時間が掛かってること）な場合はほかの手段を使うことを検討する。

　
## 1.質問すること
周りの人（先輩・同僚・仲間）に助けてもらう（質問する）というのが一番早い。
この流れの中のどの段階でも、「質問する」というのは良い。
動けばいい。　

　
## 2.エラーのメリット
短時間で解決できる問題と長時間かかる問題がある。
色々初めての事を試していればエラーが起きるのは当たり前で、それはチャレンジしている証である。
解決に時間がかかりすぎる事は体力的・精神的・経済的な面でデメリットが非常に大きい。
しかし逆に経験値としては上がる。一つの解決しなければいけない問題に長時間取り組むことで、プログラマーとして基礎体力が身につく。　
　
 　
## 3.エラーを見る
必ずエラーを見ること。
動かないときに動かないで終わりにしてはいけない。
必ずエラーメッセージを見る。

必ずデバッグモードをONにしてエラーログを見よう。
WEB開発ならアパッチとフレームワークのエラーログファイルを探す。

　
## 4.エラーを翻訳する
エラーは起こったほうが良い。
なぜなら、エラーが出るという事はすでに半分解決したようなものだから。
エラーとはつまりエラーメッセージのこと。
「所定の処理を続行できない」旨を開発者がユーザーに通知している。
エラーメッセージをしっかり読もう。
必ず翻訳して、日本語で読もう。　

　
　
## 5.エラーを起こすコツ
エラー起こす時は1つづつ。
複数同時にエラーが起こると要因の特定に時間がかかり、がんじがらめになるため。
できるだけシンプルに問題にたどり着ける状態でエラーを起こしていくと解決しやすいエラーが出せる。

　
## 6.エラーを検索する　
エラーメッセージ自体を検索してみよう。
あなたが目の前にしているエラーは他の誰かがすでに経験していてブログに解決方法が書かれていたりすることが大半だから。


　
## 7.脳内の整理
なんどか出てきた『脳内の整理』がエラー解決における大事な作業になる。
　
複雑な問題を解決するには問題を構造的に組み立てて考える必要が出てくる。
そのためにまずは検索をしていろんな情報に触れてインプットをする。
それをヒントにどういった可能性がエラーの原因としてありえるのかを組み立てる。


　
## 8.エラーを楽しむ
エラーとはクイズのようなものである。
「XXが原因でOOが動かない。」
さてどうする？


　
想像して、仮説を立てて、自分の予想が正しいか試していくことができる。
そして解決した時の達成感。感じる自己肯定感。みなぎる自信。
プログラマー冥利に尽きる。


---
エラーサーチという、働くエンジニアのためのメモ帳サービスを運営しています!

自分用の情報をパパッとメモ書きしたり、役立つ情報は整理して他の人にもシェアしたり！
[エラーサーチ] (https://error-search.com/)

[Twitterはこちら] (https://twitter.com/error_search)

---
[初学者向け]Go言語のクロスコンパイル

Go言語はクロスコンパイルができると聞いていたものの、どうやるのか？実際に動くの？という疑問があったので試してみました。結論として、指定するパラメータの値を知りさえすれば、簡単にコンパイルし実行できます。この記事では、実際に1件だけ違うアーキテクチャでの実行(コンパイル[darwin,amd64]->実行[windows,386])を紹介します。

## 手順
1. Mac High Sierra(64bits)とWindows 7(32bits)を用意
2. Macでサンプルプログラムを作成
3. Macでクロスコンパイル実行（一番大事）
4. Windowsでプログラムを実行

### サンプルプログラム
[A Tour of Go](https://tour.golang.org/concurrency/1)から、以下の並列処理プログラムを借りました。

```golang:main.go
package main

import (
	"fmt"
	"time"
)

func say(s string) {
	for i := 0; i < 5; i++ {
		time.Sleep(100 * time.Millisecond)
		fmt.Println(s)
	}
}

func main() {
	go say("world")
	say("hello")
}

```

### クロスコンパイル
ターゲットのアーキテクチャに合わせて、`$GOOS`と`$GOARCH`を設定します。設定値は何にすればいいのか？ですが、[公式HP](https://golang.org/doc/install/source#environment)で丁寧に説明されています。今回は、ターゲットがWindows 7(32bits)なので、下から2番目の[windows,386]です。

| $GOOS | $GOARCH |
|:--|:--|
| android | arm |
| darwin | 386 |
| darwin | amd64 |
| darwin | arm |
| darwin | arm64 |
| dragonfly | amd64 |
| freebsd | 386 |
| freebsd | amd64 |
| freebsd | arm |
| linux | 386 |
| linux | amd64 |
| linux | arm |
| linux | arm64 |
| linux | ppc64 |
| linux | ppc64le |
| linux | mips |
| linux | mipsle |
| linux | mips64 |
| linux | mips64le |
| linux | s390x |
| netbsd | 386 |
| netbsd | amd64 |
| netbsd | arm |
| openbsd | 386 |
| openbsd | amd64 |
| openbsd | arm |
| plan9 | 386 |
| plan9 | amd64 |
| solaris | amd64 |
| `windows` | `386` |
| windows | amd64 |

以下のようにコンパイルします。簡単です。

```bash
$ GOOS=windows GOARCH=386 go build main.go
```

完了すると`main.exe`というWindowsの実行ファイルらしきものができます。

### Windowsで実行
この実行ファイルをWindowsへコピーします。次に、コマンドプロンプトを立ち上げ、実行してみます。問題なく実行できました。

![Screen Shot 2018-05-14 at 12.56.17.png](https://qiita-image-store.s3.amazonaws.com/0/55110/5e7df60f-b85c-74a0-afa8-a850f84fadcf.png)

## 感想
実行するアーキテクチャを気にすることなく、CUIツールを作成し配布できそうで好感触でした。
多次元np.arrayでmapをする

## 多次元配列の場合
```
>>> a = [[3,2,1],[5,4,6]]
>>> [*map(lambda x: sorted(x), a)]
[[1, 2, 3], [4, 5, 6]]
```
普通にやるだけです。

## np.arrayの場合
np.vectorizeは一次元配列の場合mapのように動きますが、多次元の場合、最小の一要素を見ていくようで、ダメです。

```
>>> a = np.array([[3,2,1],[5,4,6]])
>>> np.vectorize(lambda x: sorted(x))(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/numpy/1.14.3_1/lib/python3.6/site-packages/numpy/lib/function_base.py", line 2755, in __call__
    return self._vectorize_call(func=func, args=vargs)
  File "/usr/local/Cellar/numpy/1.14.3_1/lib/python3.6/site-packages/numpy/lib/function_base.py", line 2825, in _vectorize_call
    ufunc, otypes = self._get_ufunc_and_otypes(func=func, args=args)
  File "/usr/local/Cellar/numpy/1.14.3_1/lib/python3.6/site-packages/numpy/lib/function_base.py", line 2785, in _get_ufunc_and_otypes
    outputs = func(*inputs)
  File "<stdin>", line 1, in <lambda>
TypeError: 'numpy.int64' object is not iterable
```

np.apply_along_axisを使いましょう。

```
>>> a = np.array([[3,2,1],[5,4,6]])
>>> np.apply_along_axis(lambda x: sorted(x), 1, a)
array([[1, 2, 3],
       [4, 5, 6]])
```
golangぷちめも3

sync.errgroupとcontext周りの実装見てたら今後もしかしたら何かに使うかもしれない実装方法があったのでメモっておく

```go
package main

import "yourpath/etc"

func main() {
	obj, die := etc.NewEtc()
	obj.Oops()
	die()
}
```

```go
package etc

import "fmt"

type etc struct {}
type EtcFunc func()

func NewEtc() (*etc, EtcFunc) {
	e := &etc{}
	return e, func() { e.die() }
}

func (e *etc) Oops() {
	fmt.Println("oops.")
}

func (e *etc) die() {
	fmt.Println("call die.")
}
```

contextのほうだとcancelをこれで実現してたが、なんかほほーってなったので残し
javascript:初心者のためのPromise入門第１回

## はじめに

ここ最近、アルバイトとしてkintoneのプラグイン開発などをさせていただく中で、javascriptの勉強をしているのですが、その中で**Promise**という便利なオブジェクトを使うことになる機会が多くなりました。初心者からすると意外ととっつきにくかったので、こちらでまとめてみようかなと思います。

何本かの記事に分けてゆっくり説明していく予定です～～(^^)/

## 想定読者

javscriptを勉強して間もない方、Promiseって聞いたことあるけどよく知らない方、など。javascriptのコードを少し読んだことのある人を想定しました。

## ①非同期処理でPromiseを使わないと？？

まずは、下のコードを見てください：

```javascript:code1_1.js
console.log('START!')
setTimeout(function(){
        
    //2秒（＝2000ミリ秒）待ってからここの処理を実行する
    //なにか「外部」のサービスを利用したりすることを想定してください。
    console.log('setTimeout was finished just now!');
            
}, 2000);
console.log('FINISH!');
```

ここで、setTimeout関数は、渡された処理を指定した時間（ミリ秒）だけ待ってから実行する非同期処理の関数です。

上のコードでは、setTimeoutの中の処理のあとに'FINISH!'と出力したいという想定なのですが、このコードの結果は以下のようになります：

```text:出力
START!
FINISH!
setTimeout was finished just now!
```

わかりましたでしょうか？
そうです、**２秒待ってる（かかっている）間に後続の処理が実行されてしまうんですね！**これは困りました。。非同期処理は順序を管理するのがなかなか難しいのです(>_<)

そして、この問題を解決してくれるスーパーヒーローが**Promise**なのです！！

## ②Promiseを使ってみよう

何はともあれ、具体的な使い方を見ていきましょう！

先ほどのcode1_1.jsを、Promiseを使って書き換えてみたものが以下のコードになります：

```javascript:code2_1.js
console.log('START');

//Promiseオブジェクトの中に、監視させたい非同期処理を記述します
new Promise(function(resolve, reject){
        
    setTimeout(function(){
       
        console.log('setTimeout was finished just now!');
        
        //「このPromiseは処理完了状態になりましたよ！」と宣言するものが、resolve関数なのだ！！
        resolve('SUCCESS!');            
                
    }, 2000);
        
})
        
//resolveが呼び出されると、thenの中に記述するコールバック関数が呼び出される
        
.then(function(message){
            
    //resolveの引数をここで受け取って使うことが出来る
    console.log(message);
    console.log('FINISH!');
            
});
```

```text:出力
START
setTimeout was finished just now!
SUCCESS!
FINISH!
```

上のコードについて説明します。

まず最初に、`new Promise`では、非同期処理を監視してくれるPromiseオブジェクトを生成しています。

そしてPromiseの中に記述した関数の中で非同期処理を実行するのですが、そのときの引数**resolve**と**reject**がポイントです。これらはそれぞれ、**Promiseの中の非同期処理が終わりましたよ！失敗しましたよ！**と知らせるための関数なのです！！

別の言い方をすると、**「Promiseは、監視している非同期処理が終わるまで待ってくれるいいやつ！」**と表現することもできます。

また、**`resolve`関数の引数に渡した値をthenのコールバック関数で受け取れる**ことは大事なポイントですのでしっかり覚えておいてください(^^)

なお、`reject`関数が呼び出されたときは、`catch`というメソッドで処理を引き継ぐことができます：

```javascript:code2_2.js
console.log('START');

new Promise(function(resolve, reject){
        
    setTimeout(function(){
        console.log('setTimeout was finished just now!');
        reject('FAIL!');            
    }, 2000);
        
})
.catch(function(message){
    console.log(message);
    console.log('FINISH!');
});
```

```text:出力
START
setTimeout was finished just now!
FAIL!
FINISH!
```

使い方はthenと全く同じことがわかるかと思います！

ただ、実際的な使い方としては、たとえば何かしらのAPIにリクエストを送ったりしたときに、エラーオブジェクトが返ってきた場合にそれをそのまま`reject`に渡すことで、`catch`の部分でそのエラーオブジェクトを出力することがよくあります。


# まとめ

いかがだったでしょうか？

「Promiseって聞いたことあるし何となくコードも読んだことあるけど、ぶっちゃけよくわかってない」という方には新鮮に感じられたのではないかと思います！

それではまた次回の記事で～～(^^)/
Unityをmicro:bitとのシリアル通信でコントロール（mac）

micro:bitからUnityで作ったコンテンツを操作する手順です。
通信はシリアルになりますがmicro:bitを2台使って無線での操作にします。
bluetoothはよくわからなかったのでこの方法にしました。
↓完成形
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">micro:bitとUnityのシリアル通信 <a href="https://t.co/p4J9cWtob9">pic.twitter.com/p4J9cWtob9</a></p>&mdash; atsonic (@atsonic) <a href="https://twitter.com/atsonic/status/995856876934807552?ref_src=twsrc%5Etfw">2018年5月14日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


#micro:bit（操作側）
micro:bitの[エディター](https://makecode.microbit.org/?lang=ja)にアクセスして、
下記スクリーンショットの様にグループの指定（なんでもいいです）と通信の際のトリガーを指定します。
アイコン表示は無くてもいいです。
送信する文字列も、文字じゃ無くてもなんでもいいです。

![FireShot Capture 490 - Microsoft MakeCode for micro_bit - https___makecode.microbit.org__lang=ja.png](https://qiita-image-store.s3.amazonaws.com/0/31194/d1a44e68-ba63-b4d5-5bb4-fb6142df60b3.png)

#micro:bit（受信側）
受信側も最初にグループの指定をします。
グループ番号は送信側と合わせます。
送信側からのデータを受信したら、今度はシリアル通信で文字列を書き出す様にします。
![FireShot Capture 491 - Microsoft MakeCode for micro_bit - https___makecode.microbit.org__lang=ja.png](https://qiita-image-store.s3.amazonaws.com/0/31194/d851161a-3aef-6fbe-6fe2-b55f4d5bbbe1.png)

#Unity
今回はParticle SystemをPlayしてるので下記の様になります。
SerialPortの引数はmicro:bitを接続しているポート名とボーレート（115200）を指定します。
ボーレートは他の記事を参考にこの値を入れています。
※以下のコードではシリアル通信の文字列の判定はしていません。

```c#
using UnityEngine;
using System.Collections;
using System.IO.Ports;
using UnityEngine;
using System.Collections;
using System.IO.Ports;
 
public class Serial : MonoBehaviour
{
	SerialPort stream = new SerialPort("/dev/cu.usbmodem1422", 115200);
	public ParticleSystem p;
	// Use this for initialization
	void Start()
	{
		stream.ReadTimeout = 10;
		stream.Open();
		stream.DiscardInBuffer();

	}

	// Update is called once per frame
	void Update()
	{
		try
		{
			p.Play();
		}
		catch (System.Exception)
		{
		}
	}
}
```
androidのライブラリの取り込み方法がまったくわかりません・・

AndroidStudioに関する質問です。


１．これが欲しいです。
https://github.com/igreenwood/SimpleCropView
そこで、ダウンロードしてみました。


２．自分のプロジェクトに取り込みます。
android studio
FILE -> NEW -> IMPORT MODULE
でダウンロードしたファイルを取り込みます。

３．自分のプロジェクトのbuild.gradleに下記を追記しました。

repositories {
    jcenter()
}
dependencies {
    compile 'com.isseiaoki:simplecropview:1.1.7'
}

４．しかし

mCropView = (CropImageView) findViewById(R.id.cropImageView);
mCropView.load(sourceUri).execute(mLoadCallback);

とMainPctivityに書いたところ、cannot resolve....と赤線がつきます。
これだけでは、動かないのでしょうか？

使い方がよくわかりません・・・
詳しく教えてもらえるとうれしいです・・・
オプションが多い robocopy.exe で必要最小限覚えておけばよい書き方

robocopy.exe は Windows に標準で導入されており、使いやすいコマンドライン向けファイルコピーコマンドだが、オプションが多くてとっつきが悪い。しかし、実際に覚えるべきオプションは2,3個で十分だ。

```
robocopy SRC DST /option …
```

パスの階層
=========

DST（コピー先）の書き方は、UNIX の `cp` などとは違い、SRC（コピー元）とちょうど 1:1 で対応するようなパス階層とする。

`foo\xxx\ `というフォルダーを `bar\` 以下に `bar\xxx\` という体裁で複製したい時、UNIX ならば

```
cp foo/xxx bar/
```

と書けばよかった（`xxx` は省略でき、cp側で足してくれた）が、robocopy・xcopy は

```
robocopy foo\xxx bar\xxx
```

と **1:1 で対応するファイル名まで、きっちり書かねばならない**。(これは xcopy 以降の伝統。copy は必ずしもそうではない）

日常的に使うオプション
====================

だいたい４つで済む。UNIXとは違う、オプションを末尾につける点に注意！

* **`/E`** … サブディレクトリ以下も再帰的にたどってコピー。同じ機能に `/S` もあるが、`/S` は空のサブディレクトリはコピーしてくれないので、ほとんど使わない。E は「empty もコピーするよ」の E 
* **`/MIR`** … ディレクトリのミラーリング。`/E` の機能を含んでいるが、コピー元に存在しないファイルが、コピー先にあったら「削除」する。
* **`/MOVE`** … 移動。コピー元を削除する。move.exe が使えないシーン（ドライブをまたがるディレクトリ移動）では重宝する。`/E` と組み合わせることが多い。似た機能に `/MOV` があるが、こちらはディレクトリは相手にしてくれないので、あまり使わない。
* **`/?`** ヘルプ。他のオプションはこれで見よう。

使用例
======

ヒストリを検索したがいいのがなかった。以下でご容赦いただきたい

```
$ e:
$ cd e:\Users\Hogehoge
$ robocopy go %USERPROFILE%\go /move /E
```

起動ディスクを変更した際に、他のドライブ(E:)に置き去りになった旧ホームディレクトリの go ディレクトリ以下を、新ホームディレクトリ以下に移動させようとしたらしい。（実際は nyagos 上で書いていたので、 `%USERPROFILE%` は `~` と表現したりしていた）

以上
【laravel】repositoryの書き方

laravelでのrepositoryの良さげな書き方を紹介します。

```php
class UserRepository implements UserInterface
{
    protected $user;
    public function __construct(User $user)
    {
        $this->user = $user;
    }

    protected function byFilter(array $filter){
        if (array_key_exists('name', $filter)){
            $data->where('name', $filter['name']);
        };
        if (array_key_exists('email', $filter)){
            $data->where('email', $filter['email']);
        };
        if (array_key_exists('point', $filter)){
            $data->where('point', $filter['point']);
        };
        if (array_key_exists('role', $filter)){
            $data->where('role', $filter['role']);
        };
        return $data;
    }

    public function sumPointByFilter(array $filter = [])
    {
        $data = $this->byFilter($filter);
        $data = $data->sum('point');

        return $data;
    }

    public function existsByFilter(array $filter = [])
    {
        $data = $this->byFilter($filter);
        $data = $data->exists();
        return $data;
    }

    public function getByFilter(array $filter = [])
    {
        $data = $this->byFilter($filter);
        $data = $data->get();
        return $data;
    }

}
```

こうすればgetBy***みたいのを都度書く必要が無くなりRepositoryがスッキリするのではと思いました。

※「もっと良さそうな書き方があるよ」って方は教えてください。
gitでcheckoutでpermission deniedが出る問題

# はじめに
gitでブランチをきりcheckoutするとPermission deniedされてしまう問題が発生したので，その解決方法についてまとめます．
※git初心者なので説明に誤りがあったらすみません

問題の写真がこちらです．
[![https://gyazo.com/b7c7851132e633f3fd5b76070404c8e8](https://i.gyazo.com/b7c7851132e633f3fd5b76070404c8e8.png)](https://gyazo.com/b7c7851132e633f3fd5b76070404c8e8)
「fatal: .git/index: index file open failed: Permission denied」
とPermission deniedされていしまいます．
「.git/index」のパーミッションが変わっているのが原因のようです．

以下のように「ls -la .git/index」とするとわかります
[![https://gyazo.com/6f3704b6e10dc5285103167b7113233d](https://i.gyazo.com/6f3704b6e10dc5285103167b7113233d.png)](https://gyazo.com/6f3704b6e10dc5285103167b7113233d)

なので，以下のようにパーミッションを644に変更するとうまくいきました

[![https://gyazo.com/cb3ce2714682043096f5d5071afa6d0c](https://i.gyazo.com/cb3ce2714682043096f5d5071afa6d0c.png)](https://gyazo.com/cb3ce2714682043096f5d5071afa6d0c)

#環境
Windows 10 
WSL（Windows Subsystem for Linux）
Pc : HP HP Spectre x360

# 参考リンク
https://stackoverflow.com/questions/15255785/git-index-file-open-failed-permission-denied-on-git-status-hosted-on-bitbuc
Service Workersについての初歩

# 概要
ブラウザでもネイティブアプリのようなことができるようになるらしい技術らしいということでメモ

ブラウザが Web ページとは別にバックグラウンドで実行するスクリプトで、Web ページやユーザのインタラクションを必要としない

# ブラウザの対応状況
直近でEdgeとSafariが対応したということで主要なブラウザで対応可能になった

* Chrome
* FireFox（not プライベートブラウズモード）
* Edge
* Safari

# 主な機能

* バックグラウンドでのデータ同期
* プッシュ通知
* キャッシュ

その他の使用例などは下記の参考サイトに

# その他

* プロキシサーバのようなもの
* 利用するにはプロセス（ダウンロード → インストール → 有効化）が必要
* オリジンまたはサブセット内に対して上記のプロセスは実行される
* 以下はポイントになりそう？

```
サービスワーカーは worker のコンテキストで実行されます。従って、 DOM へアクセスすることができず、
アプリを実行する主要な JavaScript とは異なるスレッドで実行されるため、ブロックされることはありません。
完全に非同期で設計されています。
そのため、同期型の XHR や localStorage のような API をサービスワーカーで利用することはできません。
```

# 概要図
![IMG_4463.JPG](https://qiita-image-store.s3.amazonaws.com/0/41506/7e5bcf0f-dc81-33fa-7e2a-cc832016dc8a.jpeg)


# 所感
できることが増えるということは、より便利なものが提供できると同時に
悪用もできる幅が増えるということなので注意が必要になるなと感じました。
実績が増えるにつれ良し悪しに関わらず様々な事例がでると思うので追っていきましょう。

ネイティブアプリをインストールするほどではないが、あると便利なツールくらいの立ち位置になるのか。。。
脱プラットフォーム課金を目指してか。。。


# 参考
[GoogleによるService Workerの紹介](https://developers.google.com/web/fundamentals/primers/service-workers/)
[MDN web docs（原文）](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API)
[MDN web docs（日本）](https://developer.mozilla.org/ja/docs/Web/API/ServiceWorker_API)
[Unity]`GetTexture2DFromByteArray' does not exist と言われたときの対処メモ


```GetTexture2DFromByteArray' does not exist```というエラーが出た時の対処法。

## 原因

Utilsというnamespaceがどこかでバッティングしてる。

## 対処

GoogleMobileAds/Api/CustomNativeTemplateAd.csに ```public Texture2D GetTexture2D(string key)``` というメソッドがあるので、その中の以下のような行を変更する。

```修正前
            return Utils.GetTexture2DFromByteArray(imageAssetAsByteArray);
```

```修正後
            return GoogleMobileAds.Common.Utils.GetTexture2DFromByteArray(imageAssetAsByteArray);
```


## 参考

['Utils' does not contain a definition for 'GetTexture2DFromByteArray'](https://github.com/googleads/googleads-mobile-unity/issues/259)
WPS | WRF > 空間分解能と時間分解能 > 一緒に考える必要がある

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
GeForce GT 730 1GB GDDR5
CentOS 6.9 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(2)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

WRF(Weather Research and Forecasting Model)とその前処理であるWPS関連。

### 空間分解能と時間分解能

空間分解能を変更する時に注意する点は時間分解能。

### 資料1 > NWP Resolution Considerations: Implications for Great Lakes Wind Forecasts (August 2015) by Greg E. Mann

https://www.weather.gov/media/grr/GLOM2015/Presentations/Mann_NWPWindResolution.pdf
p22.

> Temporal Resolution Considerations
> Scales of motion are coupled in space and time and need to be considered

実例として以下の空間と時間分解能が紹介されている

- 12 km grid -> 60+ km feature
    - 3+ hour time evolution
- 4 km grid -> 20+ km feature
    - 1+ hour evolution
- 1 km grid -> 5+ km feature
    - 10+ minute evolution
    
片方だけ分解能を上げても失敗するという認識。