OmniAICreator/Qiita-1.07M huggingface dataset:
foodcriticで、Chefの静的コード解析のチェック対象を絞り込む

![27.jpg](https://qiita-image-store.s3.amazonaws.com/0/199531/33968bd0-12df-6996-436b-2739e6bf167d.jpeg)

# はじめに
foodcriticは、Chef Cookbookのスタイルをチェックしてくれる静的コード解析ツールです。
今回、foodcriticにて、コードチェック対象外とする方法を整理します。

コードチェック対象は、foodcritic -lコマンドにて確認できます。また、下記ディレクトリ等にて、コードチェック対象が設定されています。foodcritic関連のディレクトリを確認したい場合には、gem environmentコマンドを実行して下さい。
C:\xxx\gem\ruby\2.4.0\gems\foodcritic-11.4.0\lib\foodcritic\rules

[foodcriticのホームページ](http://www.foodcritic.io/)から、チェック項目の内容を確認できます。


# 1.コードチェック対象外を指定

- 1-1.Chefレシピにコードチェック対象外を指定
- 
チェック対象外とする項目を、Chefレシピに直接設定する方法です。各スクリプトにて、チェック対象外とするIDを、#~<ID>のように記載します。

```
node['modules'].each do |modules|
  package "#{modules}" do	#~FC002
    action [:remove]
  end
end
```


- 1-2.foodcriticファイルにコードチェック対象外を指定
-

チェック対象外とする項目を、1つのファイルに設定する方法です。cookbook配下に.foodcriticファイルを作成し、チェック対象外とするIDを記載します。

```
PS C:\xxx\chef-repo\site-cookbook\common > cat .foodcritic
~FC064
~FC065
~FC069
~FC071
~FC078
```


- 1-3.foodcriticコマンド実行時にコードチェック対象外を指定
-

foodcritic実行時に、チェック対象外のIDを指定する方法です。この場合、上記の1-1と1-2の設定が無視されます。

```
PS C:\xxx\chef-repo\site-cookbook\common > foodcritic -C ./ -t ~FC002
PS C:\xxx\chef-repo\site-cookbook\common > foodcritic --help
foodcritic [cookbook_paths]
    -t, --tags TAGS                  Check against (or exclude ~) rules with the specified tags.
```


# 2.コードチェック対象を指定
反対に、コードチェック対象のみを指定することも可能です

- 2-1.foodcriticコマンド実行時にコードチェック対象を指定
-

foodcritic実行時に、チェック対象のIDを指定します
```
PS C:\xxx\chef-repo\site-cookbook\common > foodcritic -C ./ -t FC002 
```

foodcritic実行時に、チェック対象のtagを指定します。tagは[foodcriticホームページ](hhttp://www.foodcritic.io/)にて確認して下さい。

```
PS C:\xxx\chef-repo\site-cookbook\common > foodcritic -C ./ -t roles
```


# 3. 設定例
インターネットアクセスがない環境だったため、.foodcriticファイルを配置する1-2の方法にて、以下をチェック対象外としました。
FC064: Ensure issues_url is set in metadata
FC065: Ensure source_url is set in metadata
FC069: Ensure standardized license defined in metadata
FC071: Missing LICENSE file
FC078: Ensure cookbook shared under an OSI-approved open source license

```
PS C:\xxx\chef-repo\site-cookbook\common > cat .foodcritic
~FC064
~FC065
~FC069
~FC071
~FC078
```

# まとめ 
1-2の.foodcriticファイルにチェック対象外とするIDを指定する方法が、一番楽かと思います。
【CentOS7】プロキシ経由でyum/wgetする手順

##yum/wgetそれぞれのconfに直書きする
保存したら即時反映される

##■yum(最下行に追記)
```:/etc/yum.conf 
proxy=http://XXX.XXX.XXX.XXX(IPアドレス):XX(ポート番号)
proxy_username=XXXX
proxy_password=XXXX
```

##■wget(最下行に追記)
```:/etc/wgetrc
http_proxy = http://XXX.XXX.XXX.XXX:XX(IPアドレス):XX(ポート番号)
proxy_user = XXXX
proxy_passwd = XXXX
```
Angular-cli環境をssl化したい（MacOS

# 目的

- angular-cli 環境で localhost に ssl 接続できるようにする

# 証明書発行

- 認証情報をまとめるフォルダをプロジェクトルートに作成します

```
mkdir ssl
cd ssl
```

* Mac の場合下記参照先に openssl の設定ファイルが存在し、権限の問題で編集できないためコピーを作成します

```
cp /System/Library/OpenSSL/openssl.cnf openssl-dev.cnf
```
- 設定ファイルの末尾にドメイン設定を追記します

```
vim openssl-dev.cnf
```

```text:openssl-dev.cnf
[ SAN ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = localhost
```

* 証明書を作成します
* パスワードは設定しなくて大丈夫です

```
openssl req \
    -newkey     rsa:4096 \
    -keyout     server.key \
    -x509 \
    -nodes \
    -out        server.crt \
    -reqexts    SAN \
    -extensions SAN \
    -config     openssl-dev.cnf \
    -days       3650
```

* 下記ファイルが生成されます
    * server.key
    * server.crt


# 証明

* 前章で生成した `server.crt` を Finder 上でダブルクリックします
* まだ証明されていません

![スクリーンショット 2017-10-13 13.17.26.png](https://qiita-image-store.s3.amazonaws.com/0/41793/f8e90857-6552-2650-ff29-ebf0743a3d04.png)

* 右クリック > 情報を見る

![スクリーンショット 2017-10-13 13.17.44.png](https://qiita-image-store.s3.amazonaws.com/0/41793/e2b1ceb8-5011-fc2e-e333-82e6145a79b9.png)

* 「信頼」のプルダウンを開き常に信頼に変更します

![スクリーンショット 2017-10-13 13.18.01.png](https://qiita-image-store.s3.amazonaws.com/0/41793/9c655975-41b2-f898-5967-6a6abfb9fd1a.png)

* ポップアップを閉じると警告マークが消え信頼状態となります

![スクリーンショット 2017-10-13 13.18.26.png](https://qiita-image-store.s3.amazonaws.com/0/41793/2a741fbf-229d-3843-92c9-370fbc3368df.png)

# angular-cli.json の設定

* 起動時に毎回 `--ssl-key` 及び `--ssl-cert` を指定するのは面倒なので `.angular-cli.json` に下記設定を追記します

```json:.angular-cli.json
{
    ...
    "defaults": {
        ...
        "serve": {
            "sslKey": "ssl/server.key",
            "sslCert": "ssl/server.crt"
        }
    }
}
```

# 追記： Angular6 ~

Angular6 からの設定ファイルは `.angular-cli.json` ではなく、`angular.json` です。
`angular.json` での設定は次のようになります。

```json:angular.json
        ...
        "serve": {
          "builder": "@angular-devkit/build-angular:dev-server",
          "options": {
            "browserTarget": "myApp:build",
            "ssl": true,
            "sslKey": "ssl/server.key",
            "sslCert": "ssl/server.crt",
            "disableHostCheck": true
          },
          "configurations": {
            "production": {
              "browserTarget": "myApp:build:production"
            }
          }
        },
        ...
```

# Local Server 立ち上げ

```
ng serve --ssl
```

# 結果

* 無事緑の鍵マークがつきました！
 
<img width="333" alt="スクリーンショット 2017-10-13 13.29.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/41793/4f71c84e-ac9f-03c3-ebb2-5b72d499959e.png">

<img width="514" alt="スクリーンショット 2017-10-13 13.29.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/41793/fa4a6387-6a41-507a-db08-217d19198859.png">


# 参考

- https://qiita.com/sutara79/items/21a068494bc3a08a4803
float型を使うときの入力値の境目チェックに注意

# 最初に

たまたまfloatで発見しただけで、doubleでも値を調べれば同様のことは起きると思います。

# テストコード

```Java
public class Main {
    public static void main(String[] args) throws Exception {

        System.out.println("Float.parseFloat(999999967)  --> " + Float.parseFloat("999999967"));
        System.out.println("Float.parseFloat(999999968)  --> " + Float.parseFloat("999999968"));
        System.out.println("Float.parseFloat(999999969)  --> " + Float.parseFloat("999999969"));
        System.out.println("Float.parseFloat(999999999)  --> " + Float.parseFloat("999999999"));
        System.out.println("Float.parseFloat(1000000000) --> " + Float.parseFloat("1000000000"));
        System.out.println("Float.parseFloat(1000000001) --> " + Float.parseFloat("1000000001"));
        System.out.println("Float.parseFloat(1000000010) --> " + Float.parseFloat("1000000010"));
        System.out.println("Float.parseFloat(1000000020) --> " + Float.parseFloat("1000000020"));
        System.out.println("Float.parseFloat(1000000030) --> " + Float.parseFloat("1000000030"));
        System.out.println("Float.parseFloat(1000000031) --> " + Float.parseFloat("1000000031"));
        System.out.println("Float.parseFloat(1000000032) --> " + Float.parseFloat("1000000032"));
        System.out.println("Float.parseFloat(1000000033) --> " + Float.parseFloat("1000000033"));
        System.out.println("Float.parseFloat(1000000034) --> " + Float.parseFloat("1000000034"));
        System.out.println("Float.parseFloat(1000000035) --> " + Float.parseFloat("1000000035"));
        System.out.println("Float.parseFloat(1000000040) --> " + Float.parseFloat("1000000040"));
 
    }

}

```
# 実行結果

```Java
Float.parseFloat(999999967)  --> 9.9999994E8
Float.parseFloat(999999968)  --> 1.0E9
Float.parseFloat(999999969)  --> 1.0E9
Float.parseFloat(999999999)  --> 1.0E9
Float.parseFloat(1000000000) --> 1.0E9
Float.parseFloat(1000000001) --> 1.0E9
Float.parseFloat(1000000010) --> 1.0E9
Float.parseFloat(1000000020) --> 1.0E9
Float.parseFloat(1000000030) --> 1.0E9
Float.parseFloat(1000000031) --> 1.0E9
Float.parseFloat(1000000032) --> 1.0E9
Float.parseFloat(1000000033) --> 1.00000006E9
Float.parseFloat(1000000034) --> 1.00000006E9
Float.parseFloat(1000000035) --> 1.00000006E9
Float.parseFloat(1000000040) --> 1.00000006E9
```

# Webでの動作確認用URL
https://paiza.io/projects/KMTyqbyvAG1M_8KslEVWiQ

# まとめ
999,999,999と1,000,000,000がfloatに変換すると同じ値になってしまいます。
それだけではなく、999,999,968から1,000,000,032までが同じ値と判断されます。

999,999,999 より大きい値（=1,000,000,000）を入れたらエラーとしたい、というようなチェックを行う際には気を付けましょう、という例でした。
この例でいえば、doubleを使うか、BigDecimalを使うかの2択で、出来ればBigDecimalを使うのが望ましいです。
【CentOS7】システム時刻を9時間戻す手順

##■事象
CentOS7をインストールしたらシステム時刻が9時間進んでいた


```:コマンドライン
[root@localhost ~]# date
2017年 10月 13日 金曜日 22:03:36 JST
[root@localhost ~]#
```

```:コマンドライン
# timedatectl
[root@localhost ~]# timedatectl
      Local time: 金 2017-10-13 22:03:39 JST
  Universal time: 金 2017-10-13 13:03:39 UTC
        RTC time: 金 2017-10-13 13:03:38
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
```

##■原因
RTC(ハードウェアクロック)が"UTC"になっていた

##■対処
\# hwclock -s --localtime

```:コマンドライン
[root@localhost ~]# hwclock -s --localtime
[root@localhost ~]#
[root@localhost ~]# timedatectl
      Local time: 金 2017-10-13 13:05:34 JST
  Universal time: 金 2017-10-13 04:05:34 UTC
        RTC time: 金 2017-10-13 13:05:34
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: no
      DST active: n/a
```

\# timedatectl set-local-rtc true

```:コマンドライン
[root@localhost ~]# timedatectl set-local-rtc true
[root@localhost ~]# 
[root@localhost ~]# timedatectl
      Local time: 金 2017-10-13 13:23:25 JST
  Universal time: 金 2017-10-13 04:23:25 UTC
        RTC time: 金 2017-10-13 13:23:25
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: yes
      DST active: n/a

Warning: The system is configured to read the RTC time in the local time zone.
         This mode can not be fully supported. It will create various problems
         with time zone changes and daylight saving time adjustments. The RTC
         time is never updated, it relies on external facilities to maintain it.
         If at all possible, use RTC in UTC by calling
         'timedatectl set-local-rtc 0'.
[root@localhost ~]#
```
CakePHP3のMigration時のインデックス名の付け方

先に結論から書くと
$table->addIndex(['started','ended'], ['name' => 'started_ended']);
っと書けば付けれる。

CakePHP3のMigrationツールであるPhinxにおいて
インデックスを付ける場合
$table->addIndex('mail');
っと書くとmailというインデックス名でindex keyを作成してくれるが
$table->addIndex(['started','ended']);
っと書いた場合、インデックス名がstartedっとなって具合が悪かったので
インデックス名を付けたかった。

UNIQUE keyにする場合は
$table->addIndex(['email'], ['unique' => true, 'name' => 'uq_mail']);

参考
https://github.com/cakephp/phinx
【更新中】Xtion 2を購入したのでmacOSで動作させるまでを記録する。

知っている人、誰か助けてください！

# Xtion 2

> 革新的な可能性を探る開発者向けソリューション「Xtion 2」

![P_setting_fff_1_90_end_500.jpg](https://qiita-image-store.s3.amazonaws.com/0/80287/6da8db79-19b0-8567-66f7-58599dfd512e.jpeg)

https://www.asus.com/jp/3D-Sensor/Xtion-2/

## なぜこれを選んだのか？
知識ゼロの中、これが一番小さそうで、よくわからんがOpenNIと互換性があるらしので、**OpenNI**は絶対使いそうな雰囲気があったのでこれにしました。

## でもmacOSじゃ動かない。
どうやらWindowsとLinuxにしか対応してないらしい。

なんとかするしかなかろう。

# ハードウエアを動かすまでの挑戦が始まる。

ハードが動かないならドライバーを作る！ってことでこの記事を読みました。

https://qiita.com/usp/items/d869aa27003dd8a0136c

このコマンドでUSBに接続され認識されていることはわかった。
`system_profiler SPUSBDataType`

```
USB:

    USB 3.0 Bus:

      Host Controller Driver: AppleUSBXHCIWPT
      PCI Device ID: 0x9cb1 
      PCI Revision ID: 0x0003 
      PCI Vendor ID: 0x8086 

        4-Port USB 3.0 Hub:

          Product ID: 0x0401
          Vendor ID: 0x0bda  (Realtek Semiconductor Corp.)
          Version: 1.03
          Speed: Up to 5 Gb/sec
          Manufacturer: Generic
          Location ID: 0x14400000 / 22
          Current Available (mA): 900
          Current Required (mA): 0
          Extra Operating Current (mA): 0

            ASUS Xtion2 Depth:

              Product ID: 0x182c
              Vendor ID: 0x0b05  (ASUSTek Computer Inc.)
              Version: 0.15
              Serial Number: 200901010001
              Speed: Up to 5 Gb/sec
              Manufacturer: Generic
              Location ID: 0x14420000 / 24
              Current Available (mA): 900
              Current Required (mA): 800
              Extra Operating Current (mA): 0

            ASUS Xtion2 RGB:

              Product ID: 0x182d
              Vendor ID: 0x0b05  (ASUSTek Computer Inc.)
              Version: 0.05
              Serial Number: 0x0001
              Speed: Up to 5 Gb/sec
              Manufacturer: Generic
              Location ID: 0x14410000 / 23
              Current Available (mA): 900
              Current Required (mA): 800
              Extra Operating Current (mA): 0
```

## ドライバの前にOpenNI2をもっとよく見てみる。

https://qiita.com/yagizo/items/e32daa243c91e112c0ba

この記事を参考にやってみることにした。

OpenNI2はここから入手
https://github.com/occipital/OpenNI2

```
After initialization:

SimpleViewer: Device open failed:
	DeviceOpen using default: no devices found
```

エラーから

``` cpp
OniStatus Context::deviceOpen(const char* uri, const char* mode, OniDeviceHandle* pDevice)
{
	oni::implementation::Device* pMyDevice = NULL;

	const char* deviceURI = uri;
	if (xnOSStrLen(m_overrideDevice) > 0)
		deviceURI = m_overrideDevice;

	xnLogVerbose(XN_MASK_ONI_CONTEXT, "Trying to open device by URI '%s'", deviceURI == NULL ? "(NULL)" : deviceURI);

	m_cs.Lock();

	if (deviceURI == NULL)
	{
		// Default
		if (m_devices.Size() == 0)
		{
			m_errorLogger.Append("DeviceOpen using default: no devices found");
			xnLogError(XN_MASK_ONI_CONTEXT, "Can't open default device - none found");
			m_cs.Unlock();
			return ONI_STATUS_ERROR;
		}

		pMyDevice = *m_devices.Begin();
	}
```

ここが悪いことがわかった。
デバイスを認識できてないようだ。

## ドライバーについて勉強

http://hp.vector.co.jp/authors/VA009278/misc/macusb.html
PHPMailerを5.1から6.0.0にアップグレード

#何をしようとしているか
PHPのバージョンを5.3.xから7.1.xまで上げたので、同時にPHPMailerのアップグレードをしたい
ちなみに、特にこれといって躓いたところはなかったけれど、作業記録として残しておく

#コンテキストとゴール
PHPMailerからは基本的な機能しか使用していない
通常のテキストメールとファイルの添付くらい

アップグレード時に最適化などをするつもりもなく、これまでと同等の処理が行えればOKとした

#どう解決したか
`class.phpmailer.php`を読み込んでいたところを下記に置き換え
`require_once('extensions/PHPMailer/PHPMailer.php');`

`new PHPMailer`でエラーがでるので、下記を追加
`use PHPMailer\PHPMailer\PHPMailer;`

`public function getSMTPInstance()`でエラーが出るので、下記を追加
`require_once('extensions/PHPMailer/SMTP.php');`

とりあえず、ここまでで正常系テストでメール送信できたことを確認できた。
続いて、host指定時に空文字列の状態にしてテストすると、Exceptionをcatchできずに落ちたので、下記を追加
`require_once('extensions/PHPMailer/Exception.php');`
それからcacthの部分を、

```
try {
    // なんらかの処理
} catch (phpmailerException $e) {
    echo $e->errorMessage();
} catch (Exception $e) {
    echo $e->getMessage();
}
```

から

```
try {
    // なんらかの処理
} catch (Exception $e) {
    echo $e->errorMessage();
} catch (\Exception $e) {
    echo $e->getMessage();
}
```

という感じに変更
あと、`use PHPMailer\PHPMailer\Exception;`は特に必要なかったはずだけど、念のため記述はしておいて完了とした

#参考URLなど
ここに書いてあることをやっていれさえいれば、特に問題なかった
https://github.com/PHPMailer/PHPMailer/blob/master/UPGRADING.md
ブランチのマージ中にコンフリクトしたとき

```
git version 2.12.2
```

自分用のメモ。
feature に master をマージする場合。

# とりあえずマージをトライ
```shell-session
git checkout feature 
git merge master
```

# コンフリクトしてたら共通コミットを確認
```shell-session
git merge --abort
git merge-base master feature
```

# 共通コミットからのdiffをそれぞれ見ながら最適なコードを検討
`git add`したあとに`git diff --cached`を確認したらmasterの差分と一致しているのが理想。
単純に修正できないときは頑張るしかない。

```shell-session
git diff -p <commit> master <filepath>
git diff -p <commit> feature <filepath>
```

* `commit`は共通コミットのハッシュ値
* `filepath`はコンフリクトしているファイルのパス

ファイル名の変更などで`filepath`がカレントブランチにない場合はエラーになるが
`touch <filepath>`で空ファイルを作ってあげれば大丈夫だった。
空ファイルの消し忘れや誤コミットに注意する。
IE11で背景に指定したSVGが正しく表示されない件

#IEはまだ俺たちを苦しめるのか
またかいな。時代が進んでもIE対応は必要という事だな。
##状況
SVGアイコンを作成、要素の背景として下記プロパティを設定した。
background-size: 13px;
background-position: left center;

他のブラウザでは期待通りの表示となったが、IE11は以下のようになった。
・アイコンが超ちっちゃい（1px?）
・要素の中央に表示される

##原因
Illustratorから吐き出したSVGをそのまま使ってしまうと起こるらしい。
##対処方法
・SVGタグにwidth,heightを追記
・SVGタグに「preserveAspectRatio=”xMinYMid”」を追記

##参考URL
詳しくは下記を見てくださいな。
http://personal.loudandproud.me/ie11-background-image-svg/
http://ssvvgg.net/post/140503977275/ie9-11%E3%81%A7%E8%83%8C%E6%99%AF%E7%94%BB%E5%83%8F%E3%81%AEsvg%E3%81%AE%E8%A1%A8%E7%A4%BA%E3%81%8C%E5%B4%A9%E3%82%8C%E3%82%8B%E5%95%8F%E9%A1%8C%E3%81%A8%E5%AF%BE%E5%87%A6%E6%B3%95
【R】PDB形式ファイルを3d-plotで表示する

##目的
タンパク質の立体構造に座標軸を串刺しに通した図を描きたかった
PyMOLでどうやるかわからなかったのでRを使った

##表示してみたもの
- Sirtuin1 (PDBID:5BTR) ...緑色のline 
- resveratrol ...青色のdot

##Rについて
- R version 3.4.1

##使用したパッケージ
- bio3d 
- scatterplot3d  

##コード
```R:pdb_lineplot3d.r
#パッケージ読み込み
library(bio3d)
library(scatterplot3d)

#ファイルの読み込み
pdb <- read.pdb("5btr") #RCSB PDBのIDを指定

#A鎖のCαの座標をdata.frameにする
ca.inds <- atom.select(pdb, "calpha",chain = "A")
pdb_xyz <- matrix(pdb$xyz[, ca.inds$xyz],ncol=3,byrow=T)
pdb_xyz <- data.frame(pdb_xyz)

#resveratrolの座標
stl.inds <- atom.select(pdb,resid = "STL",chain = "A")
stl_xyz <- matrix(pdb$xyz[, stl.inds$xyz],ncol=3,byrow=T)
stl_xyz <- data.frame(stl_xyz)

#3D plot
colnames(pdb_xyz) <- c("x","y","z")

scatterplot3d(pdb_xyz,type="l",color="#b2df8a",lwd=3,
              xlim=c(min(pdb_xyz$x),max(pdb_xyz$x)),
              ylim=c(min(pdb_xyz$y),max(pdb_xyz$y)),
              zlim=c(min(pdb_xyz$z),max(pdb_xyz$z)),
              col.axis="gray",col.lab="gray")
par(new=T)
scatterplot3d(stl_xyz,type="p",color="#1f78b4",pch=16,
              xlim=c(min(pdb_xyz$x),max(pdb_xyz$x)),
              ylim=c(min(pdb_xyz$y),max(pdb_xyz$y)),
              zlim=c(min(pdb_xyz$z),max(pdb_xyz$z)),
              axis = FALSE,grid=FALSE)

#串刺し
axis_line <- rbind(c(min(pdb_xyz$x),60,0),c(max(pdb_xyz$x),60,0),
                   c(-10,min(pdb_xyz$y),-0),c(-10,max(pdb_xyz$y),0),
                   c(-10,60,min(pdb_xyz$z)),c(-10,60,max(pdb_xyz$z)))
par(new=T)
scatterplot3d(axis_line[1:2,],type="l",color=1,
              xlim=c(min(pdb_xyz$x),max(pdb_xyz$x)),
              ylim=c(min(pdb_xyz$y),max(pdb_xyz$y)),
              zlim=c(min(pdb_xyz$z),max(pdb_xyz$z)),
              axis = FALSE,grid=FALSE)
par(new=T)
scatterplot3d(axis_line[3:4,],type="l",color=1,
              xlim=c(min(pdb_xyz$x),max(pdb_xyz$x)),
              ylim=c(min(pdb_xyz$y),max(pdb_xyz$y)),
              zlim=c(min(pdb_xyz$z),max(pdb_xyz$z)),
              axis = FALSE,grid=FALSE)
par(new=T)
scatterplot3d(axis_line[5:6,],type="l",color=1,
              xlim=c(min(pdb_xyz$x),max(pdb_xyz$x)),
              ylim=c(min(pdb_xyz$y),max(pdb_xyz$y)),
              zlim=c(min(pdb_xyz$z),max(pdb_xyz$z)),
              axis = FALSE,grid=FALSE)

```
##結果
できた。
![5btr_3dplot.png](https://qiita-image-store.s3.amazonaws.com/0/207005/a0c752df-67b1-79ab-a10e-627632f4bdce.png)
Play Framework (Play2) をインストール

[前回](https://qiita.com/MiraGi/items/11741f6436b52aa45c81)の続きで、
CentOS7にScalaが動く状態から、今回はPlay2をインストールしてみる。

## 1. Activator をインストール
参照先の手順にもあるようにActivatorを使う必要があるみたいです。

```
# wget https://downloads.typesafe.com/typesafe-activator/1.3.12/typesafe-activator-1.3.12.zip
# unzip typesafe-activator-1.3.12.zip
# mv activator-dist-1.3.12/ /opt/
# ln -s /opt/activator-dist-1.3.12/bin/activator /usr/local/sbin/activator
```

## 2. パスを通す

```
# vim /etc/profile
最終行に追加
export PATH=/usr/local/sbin/activator:$PATH

# source /etc/profile
確認
# echo $PATH
```

## 3. プロジェクト作成

```
# cd /var/www/
# activator new ploject-name play-scala
```

## 4. 起動

```
# cd project-name
# activator run
```

Runningの表示がでたらブラウザからアクセスしてみる。

### エラー

```
IOException: Cannot run program "javac"
```
上記のようなエラーが出てしまった。。
調べてみると、java-1.8.0-openjdk　だけではjavacが使えないようで、
java-1.8.0-openjdk-devel　も必要なようです。
※最新情報は[公式サイト](http://openjdk.java.net/install/index.html)を確認ください。

```
# javac
-bash: javac: command not found

# yum install java-1.8.0-openjdk-devel

確認
# javac
Usage: javac <options> <source files>

```

これで大丈夫そうなので、再度起動してみると無事Welcome画面が表示されました。

![welcome_play.jpg](https://qiita-image-store.s3.amazonaws.com/0/118362/92dd63cf-d5d6-457b-dfae-b94195ed70e0.jpeg)
Seleniumとsocket通信を使って，遠隔のPCに指定のWebページを表示する．

#この記事が役に立つ人

何らかの理由でモニターが接続されていない機器から，プロジェクターなどで，画像やWebページを簡単に表示したい人．

#必要な環境
- 問題の機器と同じサブネットに接続できるChromeがインストールされているPC
- PCにSeleniumのWebDriverをインストールする．
- PCに，pythonとseleniumモジュールがインストールされていること．seleniumはpipでインストール可能．
- PCのFirewallに，使用するport番号で，サブネットの中から，inboundできるよう設定する．

私は，Windows10のPCで実行しましたが，おそらく，Macでも可能と思います．インストールでは，次のページを参考にさせていただきました．

[【windows7】pythonでChromeのブラウザ操作を自動化 　～Selenium WebDriverを利用](https://qiita.com/ynishimura0922/items/a3332b5beb394248e44e)

#表示するPC上の処理

次のPython(2.7)のプログラムを起動しておきます．ソケットを開けて，urlの文字列を受信し，WebDriverに渡すだけです．
ここでは，ポート番号は5000番を使っています．

```python:runchrome.py
import socket
from time import sleep

from selenium import webdriver
browser = webdriver.Chrome('C:\selenium\chromedriver')

s = socket.socket()

port = 5000
s.bind(('', port))

while True:
    print('listening')
    s.listen(5)
    c, addr = s.accept()
    print('receiving')
    inurl = c.recv(4096)
    print('input:' + inurl)
    if inurl != '':
    	browser.get(inurl)
    c.send(inurl)
    c.close()
s.close()
```
#表示を指示する機器上の処理

ソケットを開けて，表示するurlの文字列を送信するだけです．
どの言語でも良いですが，私はpythonで書きました．python2.7です．

```python:dispUrl.py
    def dispUrl(p):
        ipv = xx.xx.xx.xx
        portv = 5000
        
        s.connect(ipv,portv)
        s.send(p)
        s.recv(4096)
        s.close()
        
        return
```
#補足
一応，受信した文字列を返信して，双方向にしていますが，場合によってはここは直した方が良いかもしれません．
sleepを入れなくても，私の環境では動きましたが，必要な場合もあるかもしれません．
余計なソフトを入れたくない人に役に立てば幸いです．
sftpのみ使用するユーザーで鍵認証を使用する

# 環境
## クライアント側
- OS: Windows 10 Pro
- SSHクライアント: Putty
- SSH鍵作成ソフトウェア: PuttyGen
- SFTPクライアント: WinSCP

※Pageantは未使用

## サーバー側
- OS: Raspbian(Debian)
- SSHサーバー: OpenSSH

# sftpサーバーの環境を作る
今回は以下の投稿を参考にして構築した。ここでの投稿での説明は割愛する。

> SFTPサーバを用意する - Qiita (usutaniさんの投稿)

> https://qiita.com/usutani/items/fdabef73b5dff60c95c6

# 鍵を作る
クライアント側でPuttyGenで鍵を作成する。鍵の長さは任意に設定しても問題はない。
"Generate"ボタンをクリックし、ウィンドウ内(Keyエリア内)でマウスをゲージが満タンになるまで動かし続ける。満タンになりしばらくすると鍵が作成される。
作成した鍵にコメントを設定した方が良い。任意であるがパスフレーズの設定も行える。セキュリティを高めたい場合は推奨する。
作成したら"Save private key"で保存する。"Public key for pasting into OpenSSH authorized_keys file:"内にある"ssh-rsa ..."をクリップボードにコピーする(メモに控える)。

# 鍵を許可する
サーバー側でsftpのみ接続するユーザーの".ssh/authorized_keys"のファイルを開く。
控えた公開鍵を追記する。(もし他の鍵がある場合は改行して追記すること)
保存したらファイルは閉じる。

# sshd_configの設定
先程の「sftpサーバーの環境を作る」というセクションの追記となる。

```
Match group sftponly
  ChrootDirectory /home/%u
  X11Forwarding no
  AllowTcpForwarding no
  ForceCommand internal-sftp
```
これだけだと公開鍵を見つけることができず、認証エラーとなってしまうからだ。その原因は```sudo usermod -d / sftp-user```のコマンドでホームディレクトリが変更されているからだ。なので、デフォルトである```AuthorizedKeysFile %h/.ssh/authorized_keys```の設定が効かないのである。その原因を解決するために以下の設定項目を追記する。

```
  AuthorizedKeysFile /home/%u/.ssh/authorized_keys
```
これにより設定はこうなるはずだ。

```
Match group sftponly
  ChrootDirectory /home/%u
  X11Forwarding no
  AllowTcpForwarding no
  ForceCommand internal-sftp
  AuthorizedKeysFile /home/%u/.ssh/authorized_keys
```
保存したらSSHサーバーの再起動を忘れずに。

# 接続テストをする
設定が終わったら接続テストを行う。
高度なサイトの設定ウィンドウで```SSH > 認証```のセクションに移動する。
認証条件のエリアで秘密鍵を参照し、OKをクリックする。
ログインをクリックする。パスフレーズ設定をしている場合はパスフレーズを入力する。認証できればアクセスができる。

# トラブルシューティング
設定がうまくいかなかった場合は以下の内容を見直すと良い。

- ユーザーは設定したグループに入っているか。
- .ssh/authorized_keysの権限設定がおかしくないか。
- SSHサーバーが起動していない。(設定が不適切で起動できていないのが主な原因と思われる)
- .ssh/authorized_keysのファイル名があるか(スペルミスなどでよくある)

# 補足
sftpユーザーのルートディレクトリは権限の都合上設置することができない。そのため別途フォルダを作成し、所有権をsftpユーザーに設定しなければならない。

# 参考文献
- SFTPサーバを用意する - Qiita (usutaniさんの投稿)

https://qiita.com/usutani/items/fdabef73b5dff60c95c6

- chrootされたsftp専用ユーザを作る - Qiita (kawazさんの投稿)

https://qiita.com/kawaz/items/53d1c837dd762337eb3b
CardViewを横いっぱいに広げる

CardViewの使い方メモ

#こまったこと
CardView内の各要素のlayout_widthを"match_parent"に設定しても、CardViewが横いっぱいに広がらない。
![イメージ3.png](https://qiita-image-store.s3.amazonaws.com/0/207158/7705018b-9458-745c-a2ea-03b65d8197ef.png)

※使用したソースコード

```xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/cardView"
    android:layout_marginBottom="10dp"
    card_view:cardBackgroundColor="#ffc"
    card_view:cardCornerRadius="7dp"
    card_view:cardElevation="5dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TableRow
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <TextView
                android:layout_weight="7"
                android:layout_width="0dp"
                android:id="@+id/pointView"
                android:textSize="15sp"/>

            <!--0dpがないと、@+id/titleViewの文字列長にあわせて、レイアウト比率がずれる-->
            <TextView
                android:layout_weight="3"
                android:layout_width="0dp"
                android:text="test"/>

        </TableRow>

        <TableRow
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/titleView"
                android:textSize="15sp"/>

        </TableRow>

    </TableLayout>

</android.support.v7.widget.CardView>
```

#解決方法

```xml
CardViewを乗せるRecycleLayoutのlayout_widthを、"wrap_content"からmatch_parent"に変更する。
        <android.support.v7.widget.RecyclerView
            android:id="@+id/rv"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </android.support.v7.widget.RecyclerView>

```

解決した
![image1.png](https://qiita-image-store.s3.amazonaws.com/0/207158/7dffe08a-c8c2-a3ae-c4ca-a912e24edeb2.png)
数学-Σ計算の証明

# Σ計算の証明

[数学に戻る](eb2ee12608a969cea3e4)

## 1. 定数 c

```math
\\
\begin{array}{ll}
\\
&\sum_{k=1}^{n}c   = c + c + c + ... = nc（c を n 個足す）\\
\\
\end{array}
```

## 2. 変数 k

```math
\\
\begin{array}{ll}
\\
&\begin{array}{rll}
   &1  &+ 2     &+ 3     &+ ... &+ n&\\
+) &n  &+ n-1   &+ n-2   &+ ... &+ 1&\\
&---   &----    &----    &---   &----&\\
&(n+1) &+ (n+1) &+ (n+1) &+ ... &+ (n+1) &= (n+1) \cdot n \\
\end{array}\\
\\
&2\sum_{k=1}^{n}k = n(n + 1)\\
\\
&\sum_{k=1}^{n}k = \frac{n(n + 1)}{2}\\
\\
\end{array}
```

## 3. 変数 k^2

```math
\\
\begin{array}{ll}
\\
&(k+1)^3 - k^3 = 3k^2 + 3k + 1　\because (k+1)^3 = k^3 + 3k^2 + 3k + 1 \\
\\
&\begin{array}{rll}
   &2^3 &-1^3 &= 3\cdot1^2 &+ 3\cdot1 &+ 1\\
   &3^3 &-2^3 &= 3\cdot2^2 &+ 3\cdot2 &+ 1\\
   &4^3 &-3^3 &= 3\cdot3^2 &+ 3\cdot3 &+ 1\\
   &&:&:\\
+) &(n+1)^3 &-n^3 &= 3\cdot n^2 &+ 3\cdot n &+ 1\\
&---   &----    &----    &---   &----&\\
&(n+1)^3 &-1^3 &= 3\sum_{k=1}^{n}k^2 &+ 3\sum_{k=1}^{n}k &+ n\\
\end{array}\\
\\
&\begin{array}{rll}
&3\sum_{k=1}^{n}k^2 &= (n+1)^3 - 1^3 - 3\sum_{k=1}^{n}k - n \\
& &= (n+1)^3 - (n+1) - 3 \cdot \frac{n(n+1)}{2}\\
& &= \frac{1}{2}(n+1)\{2(n+1)^2 - 2 - 3n\}\\
& &= \frac{1}{2}(n+1)\{2n^2 + n\}\\
& &= \frac{1}{2}n(n+1)(2n + 1)\\
\\
&\sum_{k=1}^{n}k^2 &= \frac{n(n + 1)(2n + 1)}{6}\\
\end{array}\\
\\
\end{array}
```

## 4. 変数 k^3

```math
\\
\begin{array}{ll}
\\
&(k+1)^4 - k^4 = 4k^3 + 6k^2 + 4k + 1 \\
&\because (k+1)^4 = k^4 + 4k^3 + 6k^2 + 4k + 1\\
\\
&\begin{array}{rll}
   &2^4 &-1^4 &= 4\cdot1^3 &+ 6\cdot1^2 &+ 4\cdot1 &+ 1\\
   &3^4 &-2^4 &= 4\cdot2^3 &+ 6\cdot2^2 &+ 4\cdot2 &+ 1\\
   &4^4 &-3^4 &= 4\cdot3^3 &+ 6\cdot3^2 &+ 4\cdot3 &+ 1\\
   &&:&:\\
+) &(n+1)^4 &-n^4 &= 4\cdot n^3 &+ 6\cdot n^2 &+ 4\cdot n &+ 1\\
&---   &----    &----    &---   &----&\\
&(n+1)^4 &-1^4 &= 4\sum_{k=1}^{n}k^3 &+ 6\sum_{k=1}^{n}k^2 &+ 4\sum_{k=1}^{n}k &+ n\\
\end{array}\\
\\
&\begin{array}{rll}
&4\sum_{k=1}^{n}k^3 &= (n+1)^4 - 1 - n - 6\sum_{k=1}^{n}k^2 - 4\sum_{k=1}^{n}k\\
& &= (n+1)^4 - (n+1) - 6 \cdot \frac{n(n+1)(2n+1)}{6} - 4 \cdot \frac{n(n+1)}{2}\\
& &= (n+1)\{(n+1)^3 - 1 - n(2n+1) - 2n\}\\
& &= (n+1)\{(n+1)^3 - (2n^2 +3n +1)\}\\
& &= (n+1)\{(n+1)^3 - (2n+1)(n+1)\}\\
& &= (n+1)^2\{(n+1)^2 - (2n+1)\}\\
& &= n^2(n+1)^2\\
\\
&\sum_{k=1}^{n}k^3 &= \frac{n^2(n + 1))^2}{4} = \{\frac{n(n+1)}{2}\}^2\\
\end{array}\\
\\
\end{array}
```
【ARkit】初音ミクを現実世界に出現させる


動機：話題のARkitを使ってみたかった()


#開発環境

Xcode9.1 beta (9B46)/Swift4/iOS11/Blender2.79

#ソースコード

[準備中]()

#1.配置したいMMD素材をDLする

配置する物体はMMDがベースになるので、好きなMMD素材をDLしまして下さい。

今回はニコニ立体よりミクさんのMMDをお借りしました。

[Link](http://3d.nicovideo.jp/works/td20923)

#2.DLした素材をBlenderを使ってdae形式に書き出す

Xcodeは **dae** 形式でしか受け付けてくれません。なので1度[Blender](https://www.blender.org/download/)で読み込み、その後Xcodeが受け取れる形で書き出します。

尚、Blenderは元々の状態ではDLした状態のpmx形式のファイルに対応していない為、[MMDTools](https://github.com/sugiany/blender_mmd_tools)がインストールされているものとします。


まず、ファイルの作成時に生成される余計なCamera、Cube、Lampを削除します。

<img width="577" alt="Item-0_と_Item-0_と_Item-0_と_Item-0_と_Item-0_と_Item-0_と_Item-0_と_Item-0_と_com_parallels_toolbox_と_Item-0_と_Item-0_と_Item-0_と_Item-0_と_Item-0_と_info_eurocomp_Timing-setapp_TimingHelper_mainStatusItem.png" src="https://qiita-image-store.s3.amazonaws.com/0/185109/6bf93f0f-6b80-713b-2b7b-91463ee891df.png">

Blender上部から ファイル->インポート->MikuMikuDanceModelを選択、DLしたファイルの階層に行き、pmxファイルを読み込みます。(読み込みには時間が掛かります。）

読み込みが終わったら、ファイル->エクスポート->Colladaを選択、元ファイルの階層に書き出します。


**この際、「COLLADAのエクスポート」設定を必ず以下の様に行って下さい。**
<img width="602" alt="Blender.png" src="https://qiita-image-store.s3.amazonaws.com/0/185109/b3442f05-5cd1-ed25-484f-dbd6914bf535.png">

#3.Xcodeのファイル作成

Xcodeでファイルを作成する際に、 **AugmentedRealityApp** を選択して下さい。　Appleが用意してくれているサンプルコードから始める事が出来ます。

![スクリーンショット 2017-10-13 10.53.31-squashed.png](https://qiita-image-store.s3.amazonaws.com/0/185109/6c4fef28-55ee-d9b8-fc8a-4998f4a8a8f5.png "スクリーンショット 2017-10-13 10.53.31-squashed.png")




#4.Xcodeへのファイルの取り込み

先程出力した.daeファイルをXcodeの`art.scnassets`ファイルに取り込みます。
元ファイルにあったテクスチャ画像のファイル等も同時に取り込んで下さい。

![_Users_satokihigashi_Desktop_Swift_ARkitMiku_ARkitMiku_art_scnassets_と_art_scnassets.png](https://qiita-image-store.s3.amazonaws.com/0/185109/00cb5f25-fdc0-3569-f8d2-2c3666f22873.png "_Users_satokihigashi_Desktop_Swift_ARkitMiku_ARkitMiku_art_scnassets_と_art_scnassets.png")



#5.コード記述

今回の場合、先程も記述した様にサンプルコードがあるので、そこにあるファイルを呼び出す為のコードの値を変更するだけになります。

`ViewController`内のコードを記述します。(拡張子をDAEに変えても問題ありません。)

![ViewController_swift.png](https://qiita-image-store.s3.amazonaws.com/0/185109/c9dcfe0c-f870-ad0e-b78f-4d186d0a5f8c.png "ViewController_swift.png")

#6.完成

以上で終了です。尚、実機でしかRun出来ないのでDeveloper登録を行っていない方は注意が必要です。

私の場合、サイズの変更がうまくいかなかったので直接`mikusan.scale = SCNVector3(0.5, 0.5, 0.5)`と記述しました。
lubuntu17.10で/etc/network/interfacesを使う

今回はlubuntu17.10でvirt-managerを使ってkvmを動かしたかった。
bridge設定をするため使い慣れた /etc/network/interfaces を使いたかった。

* [lubuntu 17.10 ダウンロード](http://cdimage.ubuntu.com/lubuntu/daily-live/current/)

```sh:
apt install -y \
 ssh virt-manager fcitx-mozc xfce4-screenshooter
```

## ネットワーク設定

/etc/network/interfacesを利用するには ifenslave パッケージが必要。

```sh:
apt install -y ifenslave
```

```rb:/etc/network/interfaces
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback

allow-hotplug enp0s31f6
iface enp0s31f6 inet manual

auto vmbr0
iface vmbr0 inet static
	address 192.168.100.54
	netmask 255.255.255.0
	gateway 192.168.100.1
	bridge_ports enp0s31f6
	bridge_stp off
	bridge_fd 0
```

```sh:NetworkManagerの無効化
systemctl disable network-manager
```

* NetworkManagerを使わないため、systemd-resolved でDNS設定が必要。

```sh:/etc/systemd/resolved.conf
[Resolve]
DNS=8.8.8.8
FallbackDNS=8.8.4.4
Domains=local
```

```sh
reboot
```


## KVMでqedフォーマットを使うメモ

```
cd /var/lib/libvirt/images/
qemu-img create -f qed disk-1.qed 12G
```

![スクリーンショット_2017-10-13_10-58-58.png](https://qiita-image-store.s3.amazonaws.com/0/25728/aaaa84e8-db9b-11d5-31fc-c9bcc76f4d98.png)
数学-三角関数-倍角・３倍角・半角の公式の導出

# 倍角・３倍角・半角の公式の導出

[戻る](12efd87e80b55fc0835f)

## 倍角

[加法定理](12efd87e80b55fc0835f#%E5%8A%A0%E6%B3%95%E5%AE%9A%E7%90%86)より

```math
\\\
\begin{array}{ll}

\sin 2x &= \sin(x+x)\\
&= \sin x \cos x + \cos x \sin x\\
&= 2 \sin x \cos x\\
\\
\cos 2x &= \cos(x + x)\\
&= \cos x \cos x - \sin x \sin x\\
&= \cos^2 x - \sin^2 x\\
\\
&= \cos^2 x - (1 - \cos^2 x) = 2 \cos^2 x - 1\\
&= (1 - \sin^2 x) - \sin^2 x = 1- 2 \sin^2 x\\
\\
\tan 2x &= \tan(x + x)\\
&= \frac{\tan x + \tan x}{1 - \tan x \tan x}\\
&= \frac{2 \tan x}{1 - \tan^2 x}\\
\end{array}
```

## ３倍角

[加法定理](12efd87e80b55fc0835f#%E5%8A%A0%E6%B3%95%E5%AE%9A%E7%90%86)と[倍角の公式](#倍角)より

```math
\\
\begin{array}{ll}

\sin 3x &= \sin(2x + x)\\
&= \sin 2x \cos x + \cos 2x \sin x\\
&= (2 \sin x \cos x) \cdot \cos x + (1 - 2 \sin^2 x) \cdot \sin x\\
&= 2 \sin x \cos^2 x + \sin x - 2 \sin^3 x\\
&= 2 \sin x (1 - \sin^2 x) + \sin x - 2 \sin^3 x\\
&= -4 \sin^3 x + 3 \sin x\\
\\
\cos 3x &= \cos(2x + x)\\
&= \cos 2x \cos x - \sin 2x \sin x\\
&= (2 \cos^2 - 1) \cdot \cos x - (2 \sin x \cos x) \cdot \sin x\\
&= 2 \cos^3 x - \cos x - 2 \sin^2 x \cos x\\
&= 2 \cos^3 x - \cos x - 2 (1 - \cos^2 x) \cos x\\
&= 4 \cos^3 x - 3 \cos x\\
\end{array}
```

## 半角

[倍角の公式](#倍角)より

```math
\\
\begin{array}{ll}
\sin 2x &= 1 - 2 \sin^2 x\\
2 \sin^2 x &= 1 - \sin 2x\\
\sin^2 x &= \frac{1 - \sin 2x}{2}\\
\\
\cos 2x &= 2 \cos^2 x - 1\\
2 \cos^2 x &= 1 + \cos 2x\\
\cos^2 x &= \frac{1 + \cos 2x}{2}\\
\\
\tan^2 x &= \frac{\sin^2 x}{\cos^2 x}\\
&= \frac{\frac{1 - \sin 2x}{2}}{\frac{1 + \cos 2x}{2}}\\
&= \frac{1 - \sin 2x}{1 + \cos 2x}\\
\end{array}
```
Excel　シート名を取得する

VBAに頼り始めると、まずは関数を使って結果を出す。という意識が薄れがち

```Excel.vba
dim sh
sh = sheets(1).name
```
とかで取得しようとする、僕の悪い癖（杉下風）
関数でどうやるかというと、Cell関数を使う

####■Cell関数
https://support.office.com/ja-jp/article/CELL-%E9%96%A2%E6%95%B0-51bd39a5-f338-4dbe-a33f-955d67c2b2cf

検査値として ``` "filename"```を指定してあげればファイル名が取得されるので

```Excel.関数
=cell("filename",A1)
```
としておくと,A1セルに```フルパス名\[ファイル名]シート名```で出力される
で、ほしいのはシート名なので、"]"より右側だけほしい

```Excel.関数
=RIGHT(CELL("filename",A1),LEN(CELL("filename",A1))-FIND("]",CELL("filename",A1)))
```
↑
この部分はもう少しスマートにならないかなとも思うけど、こんな感じ
Webサイトの翻訳見積もり

Webサイトの翻訳依頼があった場合の大まかな見積もり作業をメモってみました

1. [sitemapxml](http://www.sitemapxml.jp/)で、Webサイトのsitemap(xml)を生成
2. [convertcsv](http://www.convertcsv.com/xml-to-csv.htm)で、xmlからxlsx (csv)に変換
3. 翻訳するページをピックアップし、[wordcounter](https://wordcounter.net/website-word-count)で文字数をカウント
4. 自分で大まかに見積もりするか、翻訳業者に見積もり依頼

convertcsvでワードカウントする際ページごとにカウントするのが面倒ですが、取り急ぎこんな感じでやってみましたが、もっと賢い方法があるはず。いい方法があれば、教えてください。
Calendar.MONTHは0から始まる

# Calendarクラスの月が「0」から始まるのは何故？
ある日、なんで`month`がひと月ズレるのかって話になりました。

`int month = Calendar.getInstance().get(Calendar.MONTH);`

このコードを実行したのが2月だと、monthは「1」になります。
「0」から始まるからだよって答えると、何故「0」からなのか、不便じゃない？
って話になりました。
今まで意識してなかったのですが、言われてみると「0」から始まるのはおかしい！
って気になり、知ってそうな方に聞いてみたところ、

>日本は月を数えるとき、「1月、2月、3月・・・」というように表現するけど
英語圏は、数字じゃなくて「January、February、March・・・」と文字で表現するから
配列とかプログラムで管理しやすいように「0」始まりにしてるのでは？

という回答を頂き、これが正しいのか分からないけど、なるほど！と思いました。
ネットでも調べてみると、同じような疑問と回答がありました。

私が主に担当しているシステムは、未だにJava5や6で動いているため、
現在の「月」を取得したい場合、下記のように記載する事が多いです。

```java
int month = Calendar.getInstance().get(Calendar.MONTH) + 1;
System.out.println(month + "月");
```

**Java8以降**であれば、LocalDateクラスを使うことで「+1」を書かずに現在の「月」を取得できます。

```java
int month = LocalDate.now().getMonthValue();
System.out.println(month + "月");
```
cordova build android で作ったアプリで起動が遅い問題について（解決してない）->解決した

# アプリの構成
 - ios/android app (webview) + front server(onsen ui + angular2 + monaca) + api server (rails)　

# 問題
 - `cordova build android` で作ったandroidアプリで異常に起動が遅い問題が出た
 - iosアプリはすぐに起動する

# 調査結果
 - androidアプリの挙動を見ると、front server から取得する app.bundle.js の実行が異常に遅い(20秒くらいかかっている)
 - android ブラウザから直接アクセスするとすぐに動く

# 未解決
 - ここまで調査結果から、 cordovaでビルドしたアプリに何らかの問題がありそうだけど、よくわからず時間切れ。。。。

# 再調査(2017/10/27)
## 調査結果
 - デバッグしていくと `cordova.js` の `DOMContentLoaded` が発火しないことがわかった
 - `AppModule` に全クラスの定義をしているので、削除してみると、遅延が半分くらいになった。

## まだ未解決だけどtryする価値があること
 - `AppModule` の定義を極力削る
 - `monaca transpile` をやめる
 - angularのAoTコンパイルを試す


# tryした結果
 - angularのAoTコンパイルで実測してみたら、20秒->5秒になった

# 結論
 - `onDOMContentLoaded` の発火が遅いときは、html/css/jsのパースに時間かかってるのでそこを見直せ
【Android】RecyclerView inside CardView

### こういうレイアウト
<img width="316" alt="スクリーンショット 2017-10-13 10.51.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/128180/d24db82c-0efe-807b-c4fc-79879358f41c.png">

```xml:activity.xml
<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <!-- Activity側で recyclerView.setNestedScrollingEnabled(false); -->
        <android.support.v7.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </android.support.v7.widget.CardView>
</android.support.v4.widget.NestedScrollView>
```
TableLayoutの使い方_任意位置の表示

TableLayoutの使い方メモ

#やりたいこと
TableLayout内の要素の任意の位置に表示する。
どのCardViewでも右側の開始位置を同じにする。
![イメージ1.png](https://qiita-image-store.s3.amazonaws.com/0/207158/3b41d57c-629c-1d47-8c76-d4c0a7d4f93c.png)

#やったこと
xmlを修正する
android:layout_weightを使用して比率を指定。今回は、7:3。
android:layout_width="0dp"を使用する。未使用だと、右側の開始位がずれる。
![イメージ2.png](https://qiita-image-store.s3.amazonaws.com/0/207158/64f4dc72-d6b0-48d0-0c3d-73048afb0c96.png)

#ソースコード

```xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/cardView"
    android:layout_marginBottom="10dp"
    card_view:cardBackgroundColor="#ffc"
    card_view:cardCornerRadius="7dp"
    card_view:cardElevation="5dp"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TableRow
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <TextView
                android:layout_weight="7"
                android:layout_width="0dp"
                android:id="@+id/pointView"
                android:textSize="15sp"/>

            <TextView
                android:layout_weight="3"
                android:layout_width="0dp"
                android:text="test"/>

        </TableRow>

        <TableRow
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/titleView"
                android:textSize="15sp"/>

        </TableRow>

    </TableLayout>

</android.support.v7.widget.CardView>
```
exceljsでのセル内改行


NodeでExcelを扱う際に使用するモジュール
・exceljs
https://github.com/guyonroche/exceljs

セル内改行をする際は、値の改行を下記のように置換する必要がある。
※シングルクォーテーションではなく、ダブルクォーテーションにやらないとうまくいかないのでご注意。
`val.replace(/¥n/g,"¥r¥n")`
Macのターミナルを開くと「You have mail.」と表示される

# 「You have mail.」というメッセージは何？

Macは内部でメールサーバーが動いています。
Mac内部のメールサーバーから、ログインしているユーザー宛のメールがありますよ、というメッセージです。
普段目にすることはないかもしれませんが、
Cron実行時にメールが送信されたときなどに、このメッセージが出ることがあります。

# メールの場所

このメールは「/var/mail/ユーザー名」にあります。
lessコマンドやviコマンドなどで内容を確認できます。

```
less /var/mail/ユーザー名
```

このメッセージが気持ち悪ければメールデータを削除することで消すことができます。
まずはmailコマンドで届いたメールの一覧を出します。

```
mail
```

全て消去する場合は「d *」で削除できます。

```
? d *
```

削除したら「q」でmailコマンドを抜ければ完了です。

```
? q
```
【Android】TabLayout + ViewPager + RecyclerView の上にViewを置いてスクロールでTabLayoutは上部に固定したい

# どんなレイアウトなのか？（メモ）
こういうレイアウトがあって、下にスクロールした時にTabはToolbar or ActionBarの下にピタッと止めたいってデザイナーさんに言われた時に組んでみたレイアウト。

<img width="315" alt="スクリーンショット 2017-10-13 10.13.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/128180/50e3f476-d56c-8828-c82d-e8364ea5fe04.png"><img width="310" alt="スクリーンショット 2017-10-13 10.14.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/128180/dd16befb-a322-47a7-adc0-88e4ae03f9a2.png">
### ◯◯◯Activityのレイアウト
```xml:activity.xml
<android.support.design.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <!-- 上記の図にあるViewの部分 -->
        <include layout="@layout/header_view" />

        <android.support.design.widget.TabLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>
```

### 上部に表示させたいViewのレイアウト
```xml:header_view.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    app:layout_scrollFlags="scroll|enterAlwaysCollapsed">

<!-- --- -->

</LinearLayout>
```

### ViewPager内の◯◯◯Fragmentのレイアウト
```xml:fragment.xml
<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipToPadding="false"
    android:fillViewport="true"
    app:layout_behavior="@string/appbar_scrolling_view_behavior" />
```
picojsonで、jsonデータを作る処理

コード内部で、0からjsonデータを作っていく処理

```c++
	picojson::object license;
	picojson::array datalist;
	
	{
		picojson::object data;
		data.insert(std::make_pair("unixtime", picojson::value(static_cast<double>(::time(nullptr)))));
		data.insert(std::make_pair("key", picojson::value("1111111111")));
		
		picojson::object id;
		id.insert(std::make_pair("id", picojson::value(1.0)));
		id.insert(std::make_pair("data", picojson::value(data)));
		
		datalist.push_back(picojson::value(id));
	}
	
	{
		picojson::object data;
		data.insert(std::make_pair("unixtime", picojson::value(static_cast<double>(::time(nullptr)))));
		data.insert(std::make_pair("key", picojson::value("2222222222")));
		
		picojson::object id;
		id.insert(std::make_pair("id", picojson::value(2.0)));
		id.insert(std::make_pair("data", picojson::value(data)));
		
		datalist.push_back(picojson::value(id));
	}
	
	license.insert(std::make_pair("license", picojson::value(datalist)));
	
	std::cout << picojson::value(license) << std::endl;
```

出力結果

```
{"license":[{"data":{"key":"1111111111","unixtime":1507857663},"id":1},{"data":{"key":"2222222222","unixtime":1507857663},"id":2}]}
```

整形した内容

```
{
    "license": [
        {
            "data": {
                "key": "1111111111", 
                "unixtime": 1507857663
            }, 
            "id": 1
        }, 
        {
            "data": {
                "key": "2222222222", 
                "unixtime": 1507857663
            }, 
            "id": 2
        }
    ]
}
```
Codefestival_equalB_A,B,C問題

問題はこちらから=>http://code-festival-2017-qualb.contest.atcoder.jp/assignments

#A問題
##考え方
Pythonのスライスを利用する
文字列の0番目から-n番目までを参照すると書くと,後ろからn個の文字が消去されるのを利用。

##コード
```py3:A.py

S = input()
S = S[0:-8]
print(S)
```

##参考資料
https://qiita.com/ycctw1443/items/03f99f3f72a797fdcbf6

#B問題
##考え方
forで適当に回すだけでは制約オーバー
Counterなどで数え上げて比較する
C++ではmapを利用するやり方もあるらしいので,Pythonでもできそう

```py3:B.py

from collections import Counter
 
N = int(input())
D = list(map(int,input().split()))
M = int(input())
T = list(map(int,input().split()))
 
res = 'YES'
counter_d = Counter(D)
counter_t = Counter(T)
 
set_t = list(set(T))
for i in set_t:
    if counter_d[i] < counter_t[i]:
        res = 'NO'
        break
 
print(res)
```

#C問題
##考え方
グラフ理論の問題
まず試しに簡単な一直線のグラフを書いてみる。
始点から奇数長の位置にある頂点はすべて辺を結べることがわかる

この際,辺の長さが奇数の閉路（奇サイクル）があるとし,
始点から頂点vに行くまでの距離は二通りあるので,l(v),l'(v)とする

l(v)+l'(v)は常に奇数となるので,l(v)が偶数でもl'(v)は奇数となることから
奇サイクルにあるすべての頂点と始点は辺を結べることがわかる。

すると奇サイクルから飛び出す形で連結しているグラフの頂点も
その頂点以外のすべての頂点と辺を作れる。



また,グラフ内に奇数長の閉路が存在しないグラフが2部グラフであるため,
2部グラフかどうかを判定し,値の出力方法を変えればよい



2部グラフでないなら,すべての頂点が自身を除くすべての頂点と辺を作る完全グラフになることができるので　N*(N-1)-M　と出力

2部グラフなら…（解説のほうがわかりやすいと思ったので参考資料から見てください）

##コード
```py3:C.pu
from collections import deque
from collections import defaultdict
from collections import Counter

N,M = list(map(int,input().split()))
G = defaultdict(set)

color = [0 for i in range(N+1)]

for _ in range(M):
    A,B = map(int,input().split())
    G[A].add(B)
    G[B].add(A)

color[1] = 1
que = deque([1])
bip = True

while len(que):
    p = que.popleft()
    for q in list(G[p]):
        if color[q] == 0:
            color[q] = -color[p]
            que.append(q)
        elif color[q] == color[p]:
            bip = False
            break
    
if bip:
    B = Counter(color)[1]
    W = Counter(color)[-1]
    print(B*W-M)

else:
    print(int(N*(N-1)/2-M))

```

##参考資料
https://img.atcoder.jp/code-festival-2017-qualb/editorial.pdf
http://www.i.kyushu-u.ac.jp/~eiji/GraphCombinatorics/graph-combinatorics2.pdf
Rails | 3ヶ月くらいで学んだこと

##　やったこと、覚えたこと
- - -
- git,github
- RESTful
- DB設計（n対nの設計）
- ActiveRecord(パターン)
- ActionMailer
- Deploy
- テスト（Rsepc)
- Ajax

- - -
- includes,preload,eager_load
- STI、ポリモーフィック
- enum
- デザイン(bootstrap)
- etc

- - -

## gem

- - -

- paperclip
- devise
- ransack
- slim-rails
- rails-erd
- omniauth
- etc

- - -

## 参考にした書籍
- [パーフェクト Ruby on Rails](https://www.amazon.co.jp/%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88-Ruby-Rails-%E3%81%99%E3%81%8C%E3%82%8F%E3%82%89-%E3%81%BE%E3%81%95%E3%81%AE%E3%82%8A/dp/4774165166)
- [Ruby on Rails4 アプリケーションプログラミング](https://www.amazon.co.jp/Ruby-Rails-%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E5%B1%B1%E7%94%B0-%E7%A5%A5%E5%AF%9B/dp/4774164100/ref=pd_lpo_sbs_14_t_0?_encoding=UTF8&psc=1&refRID=6H1W096AAKQS7GGM2ZV7)
- [RailsによるアジャイルWebアプリケーション開発 第4版](https://www.amazon.co.jp/Rails%E3%81%AB%E3%82%88%E3%82%8B%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%ABWeb%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-%E7%AC%AC4%E7%89%88-Sam-Ruby/dp/4274068668)
- [Rails AntiPatterns] (http://www.informit.com/store/rails-antipatterns-best-practice-ruby-on-rails-refactoring-9780321604811)

- - -

- [Everyday Rails - RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)
- [Webを支える技術](https://www.amazon.co.jp/Web%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-HTTP%E3%80%81URI%E3%80%81HTML%E3%80%81%E3%81%9D%E3%81%97%E3%81%A6REST-WEB-PRESS-plus/dp/4774142042)

- - -
## これから

- - -
- テストをより詳しく
- オブジェクト指向をより深く
- Railsらしい設計(設計思想、歴史を把握したい）
- TDD,DDD
- JavaScript
- フロントエンドフレームワーク（React,vue)
- Deployはdockerで
- サービスをフルスクラッチで作成
Rのwrite.csvで列名指定を有効にする

Rでcsvを出力する関数であるwrite.csvで、たまに以下のような警告が出て困っていたので対策して見ます。

```R:エラー
write.csv(df, pipe("pbcopy"), row.names=F, col.names=F)

警告メッセージ: 
 write.csv(df, pipe("pbcopy"), row.names = F, col.names = F) で: 
   'col.names' への変更の試みは無視されました 
```

# 前提

`write.csv`は名前の通り、データをcsv形式で出力する関数です。
ファイルを指定して書き出したり、クリップボードに出力することもできるのでわりと重宝します。

```R:write.csv
# 適当データ
df <- data.frame("ID" = c("A1","A2","A3"),
                 "Value" = c("abc", 123, T))
# ファイル出力
write.csv(df, "output.csv")

# クリップボードにコピー
## Windowsの場合
write.csv(df, "clipboard")
## Macの場合
write.csv(df, pipe("pbcopy"))
```
出力形式を色々設定できる`write.table`のラッパーです。
親である`write.table`には行名・列名の出力を制御する`row.names=(TRUE/FALSE/ベクトル)`と`col.names=(TRUE/FALSE/NA/ベクトル)`がありますが、`write.csv`に指定してみると上記のようなエラーが出ます。

# 仕様です

マニュアルを読むとちゃんと書いていました。
`write.csv`や`write.csv2`は出力したcsvを他のソフト（Excelなど）に貼り付けた時にcsvの行や列が崩れるのを防止するために制約をきつくしてるよ、"col.names"や"sep"は制限してるよ、とのこと。

確かに試しに制限を受けない`write.table`のほうに`write.table(...,row.names=T, col.names=T)`のような指定をすると

```R
"ID" "Value"
"1" "A1" "abc"
"2" "A2" "123"
"3" "A3" "TRUE"
```
こんな感じにいかにも列がずれそうな出力になります。

ああ、なるほど仕様でしたか。

とは言うものの、`write.csv`からクリップボード経由でExcelに貼れるのを非常に重宝している身としては、列名なしでコピーとかをしたいわけです。
そんな訳で改造して見ます。

# col.namesが有効になるよう改造してみる

Rでは関数のオーバーライドが簡単にできてしまうので、おもむろにwrite.csvを上書きします。

```R
write.csv <- function (...) {
    Call <- match.call(expand.dots = TRUE)
    # チェック対象から外す
    for (argname in c("append", "sep", "dec", "qmethod")) if (!is.null(Call[[argname]])) 
        warning(gettextf("attempt to set '%s' ignored", argname), 
            domain = NA)
    isFALSE <- function(x) identical(F, x)
    rn <- eval.parent(Call$row.names)
    cn <- eval.parent(Call$col.names)
    Call$append <- NULL
    # 列がずれるパターンは回避
    Call$col.names <- 
      if (!is.logical(rn) && !isFALSE(cn))
        NA
      else if (isTRUE(rn) && !isFALSE(cn))
        NA
      else if (isFALSE(rn) && is.na(cn))
        F
      else 
        cn
    Call$sep <- ","
    Call$dec <- "."
    Call$qmethod <- "double"
    Call[[1L]] <- as.name("write.table")
    eval.parent(Call)
}
```
列のズレが起こる以下のパターン

- row.names=c("行名", "を", "指定"), col.names=T
- row.names=c("行名", "を", "指定"), col.names=c("列名", "指定")
- row.names=T, col.names=T
- row.names=T, col.names=c("列名", "指定")

と、そもそも指定ができない

- row.names=F, col.names=NA

のパターンの場合は回避するようにしています。
これで列名なしでコピペもできますね。

```R:出力
write.csv(df, pipe("pbcopy"), row.names=T, col.names=T)
"","ID","Value"
"1","A1","abc"
"2","A2","123"
"3","A3","TRUE"

write.csv(df, pipe("pbcopy"), row.names=T, col.names=F)
"1","A1","abc"
"2","A2","123"
"3","A3","TRUE"

write.csv(df, pipe("pbcopy"), row.names=F, col.names=F)
"A1","abc"
"A2","123"
"A3","TRUE"
```
果たしてニーズあるのかと言われると、、、微妙。

なお、write.csvを元に戻す場合は、utilsパッケージに元のがあるので上書きすれば大丈夫です。

```R:元に戻す
write.csv <- utils::write.csv
```