OmniAICreator/Qiita-1.07M huggingface dataset:
Nextcloud の外部ストレージ連携

#はじめに
Nextcloud（ownCloudも）は、構築をする際の初期設定で、ファイルの保管場所を指定します。よく、/dataや、/home/data なんかを指定する事が多いです。ただ、既存のストレージがあるのであれば、有効に活用したいと思いますよね。今回は、Nextcloud（ownCloudも）の人気の機能である、「外部ストレージ連携機能」を紹介したいと思います。CIFSのファイルサーバとか、S3互換APIといったストレージのフォルダ（バケット）をNextcloud上に表示する事ができる機能です。

#プラグイン
プラグイン名は「External storage support」です。これを有効にします。
![画像53.png](https://qiita-image-store.s3.amazonaws.com/0/308127/6cfbdf01-634e-367a-f94e-77e1b0e04e2f.png)

#設定画面
プラグインを有効にすると、管理者画面に項目が追加されます。
![画像54.png](https://qiita-image-store.s3.amazonaws.com/0/308127/06dc562e-9197-c481-1b40-9cceda420885.png)
これだけのストレージが連携できます。よく使われるのは、SMB/CIFSと、AmazonS3ですね。
![画像56.png](https://qiita-image-store.s3.amazonaws.com/0/308127/8afb3133-840f-0599-5c15-1d5bf6314523.png)
追加のプラグインで、Sharepointや、
![画像59.png](https://qiita-image-store.s3.amazonaws.com/0/308127/b0f978a8-07a0-8e94-a41c-a9b25429bc77.png)
GoogleDriveの項目も追加できます。
![画像60.png](https://qiita-image-store.s3.amazonaws.com/0/308127/8a85c5cb-2008-3c48-ac95-141fdbd7217d.png)
ユーザ自身が外部ストレージ連携設定をできるように許可もできます。その際に、どのストレージを許可するかの選択もできます。
![画像55.png](https://qiita-image-store.s3.amazonaws.com/0/308127/e4bb5d0d-5542-c72e-c1b0-237b125f3da7.png)
ユーザが設定できる許可をしたら、個人設定画面にも外部ストレージ連携の画面が表示されます。ちなみに、ローカルストレージは連携できません。（当たり前か）
![画像58.png](https://qiita-image-store.s3.amazonaws.com/0/308127/9aaa1c11-c563-bc57-8448-0c2fb7850739.png)
連携設定ができたら、ホーム画面に連携したフォルダ（やバケット）が表示されます。フォルダアイコンに矢印が付いているのが外部ストレージ連携したフォルダです。
![画像57.png](https://qiita-image-store.s3.amazonaws.com/0/308127/d3cc089c-46c3-0587-add4-63891f653037.png)

#まとめ
この機能は、ownCloudの初期の頃から提供されている機能で、非常に人気がある機能です。よく、「iPadやスマートフォンでファイルサーバ内のファイルを見たい」なんて時に、提案できます。また、Nextcloud内にはファイル自体は保存しない（DB上にメタデータだけ登録している）ので、Nextcloudのローカルディスクはほとんど使わなくさせ、ファイルサーバ連携をメインにするお客様も多いです。

この記事は、[スタイルズ社のNextcloudサイト](https://nextcloud.stylez.co.jp/nextcloudblog)にも公開しております。
e Builder（2018 Summer）スクリプト開発時のエディタ設定メモ

使いにくいところをカスタイマイズしたので手順をメモ
デフォルトのインデント設定はタブなのでスペースに変更

#設定の基礎知識
e BuilderはJavaScriptエディタにVJET eclipseプラグインを使っている
拡張子jsはこちらの設定が使われているようなので、設定 > VJET以下で設定する
JavaScript側設定をいじっても反映されない


#1. 中括弧 { 入力後のインデント崩れ対応
![いけてない.gif](https://qiita-image-store.s3.amazonaws.com/0/22172/fb825007-68c3-cc25-5c01-415a58a212f0.gif)

この自動保管される閉じ括弧が必ずインデントされるので
if-else文を書いたりしただけでひどいことになる

**括弧を自動で閉じる設定をオフにする**
ウィンドウ ＞ 設定 ＞ VJET ＞ Editor ＞ Typing
{Braces}チェックOFF
![かっこ自動補完OFF.png](https://qiita-image-store.s3.amazonaws.com/0/22172/8059fc5d-3040-0d60-d8e5-d2e31bc68197.png)

色々試したけど自動で閉じる設定をオンにしたままインデントをうまいことするやり方は分からなかった

#2. インデントをタブからスペースに変更
**VJETエディタのインデント設定とフォーマッタ設定変更**
ウィンドウ ＞ 設定 ＞ VJET ＞ Editor 
Character to use when indentingを「Spaces」に変更
![インデントその１.png](https://qiita-image-store.s3.amazonaws.com/0/22172/c1678303-ce91-bc9c-a517-758c25d30d75.png)

ウィンドウ ＞ 設定 ＞ VJET ＞ Formatter
Editボタンより設定変更
![インデントその２.png](https://qiita-image-store.s3.amazonaws.com/0/22172/1ee3966a-4d43-c208-b6e5-e0d4dc7e284c.png)
![インデントその3.png](https://qiita-image-store.s3.amazonaws.com/0/22172/7d5d1332-0ca8-ca9a-f780-1e964a4085cc.png)
Tab policyをSpaces onlyに変更
![インデントその4.png](https://qiita-image-store.s3.amazonaws.com/0/22172/01bd880c-3ea0-f0db-d9e2-c33b789d15a2.png)
ついでに行あたりの文字数が80文字では使い物にならないので200文字に拡張
デフォルト設定プロファイルは上書きできないので、設定名を変更してからOKすると設定が変わる


#3. タブなどの空白文字を表示
ウィンドウ ＞ 設定 ＞ 一般 ＞ エディタ ＞ テキストエディタ
空白文字を表示チェックON
![空白文字を表示.png](https://qiita-image-store.s3.amazonaws.com/0/22172/1b25aa75-b40f-44e0-8288-5cf7defb964b.png)

色々やっても、ふとした拍子にタブが紛れ込むことがあり、これに気が付くためには必須
MySQL8.0で文字コードを変更する方法(UTF8対応)

# 概要
MySQL8.0で文字コードの設定をしようとする時、それまでのバージョン(7.x以前)とは少し設定ファイル(my.ini)と内容が異なるので紹介します。


## 環境

* Windows10
* MySQL 8.0.12

(LinuxOSの場合、my.iniを`/etc/my.cnf`に置き換えて読めば同様にできるかもしれません。)


## 文字コードの設定全体をcp932からutf8に置き換えるまで

utf8で書かれたsqlファイルを読み込むのをデフォルトにするためにMySQL側の文字コードを変更することに。

既存のバージョンだと、以下の2箇所を変更するのが普通です。

(インストーラのデフォルト設定だと`C:\ProgramData\MySQL\MySQL Server 8.0`以下にある`my.ini`に記載されています。)

```

[mysqld]
default-character-set=utf8

## ...中略...

character-set-server=utf8
```

本来であれば、これでMySQL80サービスを`タスクマネージャー > サービス タブ`から再起動するだけでいけますが、

mysqlを起動して`show variables like "chara%";`を確かめてみると

![default_setting.png](https://qiita-image-store.s3.amazonaws.com/0/278105/5722a1c2-dde2-a805-81ba-3551eaed0899.png)

デフォルトのエンコード(cp932)のままです。

色々と調べた結果、下記のUTF8の設定を`my.ini`に手動で入れる必要があることがわかりました。


```
## UTF 8 Settings
init-connect='SET NAMES utf8'
collation_server=utf8_unicode_ci
character_set_server=utf8
skip-character-set-client-handshake
```

これを`[mysqld]`と書かれている直後に配置します。
(mysqldはMySQLサーバのことです)

アンダーバー(`_`)とハイフン(`-`)の違いが煩雑ですが、これで合っているようです。

ここまで終わったら`MySQL80`サーバの再起動をします。

![サーバ再起動.png](https://qiita-image-store.s3.amazonaws.com/0/278105/bccdda6e-5d10-93c7-3a7c-83619cf18b09.png)

`タスクマネージャー > サービス タブ`より。

最後に、テーブルのデータを再作成して完了。(各自入れたいデータを入れなおしてください。)

mysql上で文字コードを確認してみると、無事に変更されています。

![変更後.png](https://qiita-image-store.s3.amazonaws.com/0/278105/3d1b8ab8-a0e0-34e3-70fd-b89dab9ee2e9.png)


## 絵文字などに対応する必要がある場合(4bitのUTF-8問題)

参考までに、sql読み込み時に下記のようなwarningが出る場合

```
Incorrect string value: '\xF0\xA6\x9A\xB0\xE7\x94...' for column 'name' at row 1
```

`utf8`で設定した場所を`utf8mb4`に設定しなおすことでうまくいくことがあります。(MySQL5.5.3以降)

`utf8mb4`とはUTF-8を4バイトの文字コードで扱うための設定です。

UTF-8 は1～4バイトで1文字が構成される文字コードですが、MySQLでは`utf8`の設定では4バイトのUTF8が扱えません。

`utf8mb4`で設定すると絵文字なども登録できるようになります。

今から新規で設定するなら`utf8mb4`のほうが良さげです。

↓設定例

```
## UTF 8 mb4 Settings
init-connect='SET NAMES utf8mb4'
collation_server=utf8mb4_unicode_ci
character_set_server=utf8mb4
skip-character-set-client-handshake
```


## 参考

- [MySQL 5.x 文字コードの設定](https://www.dbonline.jp/mysql/myini/index3.html)
- [MySQL(5.7)の日本語文字化け回避！文字コードを確認＆変更する方法](http://proengineer.internous.co.jp/content/columnfeature/6653)
- [MySQL 文字化けを防ぐ、文字コードの確認と設定](http://ext.omo3.com/linux/mysql_character_set.html)
- [MySQL Incorrect string value: の解決策](https://accelboon.com/tn/mysql-incorrect-string-value-%E3%81%AE%E8%A7%A3%E6%B1%BA%E7%AD%96/)
- [MySQL(InnoDB) で charset を utf8mb4 にする注意点の現在](https://dev.to/seizans/mysqlinnodb--charset--utf8mb4--1451)
IRuby を Ubuntu 18.10 にインストールする

[IRuby](https://github.com/SciRuby/iruby) は [Jupyter Notebook](http://jupyter.org/) 用の Ruby Kernel です。


公式READMEは 17.04 のインストール方法が記述されていますが、
18.10 も 公式ドキュメントの 17.04 と同じようにしてインストールできました。

```bash
sudo apt install make libtool libffi-dev libzmq3-dev libczmq-dev
```

ここで libzmq5 ではなく libzmq3 を選ぶのが唯一のポイントです。あとは

```bash
gem install cztop
gem install iruby --pre

# カーネルを Jupyter に追加
iruby register --force
```

として通常通りインストールされました。
Haskellの真似した4行で書けるRubyのqsort

# はじめに
- ちょっとしたお勉強程度なので，特にコードにこだわりなし
- 基本，余計なライブラリなしの環境で実行できるプログラム
- これがquicksortかと言われれば，まぁちょっと違うかも
- いつか計測してみようかな...
- コメントあれば，お願いします

## Haskell

```haskell:qsort.hs
# haskell
qsort :: (Ord a) => [a] -> [a]
qsort [] = []
qsort (n:ns) = 
    let left  = [a | a<-ns, a <  n]
        right = [a | a<-ns, a >= n]
    in left ++ n ++ right 

main = print $ qsort $ reverse [0..100]
```

## Ruby

```ruby:qsort.rb
# ruby
def qsort(ns)
  return [] if ns.length < 1
  left  = ns.drop(1).select { |n| n <  ns[0] }
  right = ns.drop(1).select { |n| n >= ns[0] }
  return qsort(left) + [ns[0]] + qsort(right)
end

ns = (0..100).to_a.reverse
p ns
p qsort(ns)
```

## 実際，ソートはこれなんでしょうけど

- 配列の乱数生成も楽だし，arrayクラスさまさまですね

```ruby:sort.rb
ns = (0..100).to_a.shuffle
p ns.sort
```
ssh option 覚え書き

# ほぁ〜、こんな事できるんかぁ
ってオプションたち

基本的に SSH をする上でオプションって多用しないんですけど、ssh トンネルとかする時とかに山のようにオプションが出てくる上に意味がわからない

ので備忘録

## `-i <identity_file>`: 秘密鍵ファイルの指定

これはまぁ、よく使うやつ。
鍵認証を利用している場合に使う。
`id_rsa` や `id_dsa` といった `id_<cryptosystem>` のフォーマットだとオプションを省略できるけど、個別に命名している場合に必要となる。

ちなみに `~/.ssh/config` ってファイルを作って、ホストの設定に
`identityfile <identity_file_fullpath>` みたいに設定しても、オプションを省略できる。

## `-f`: 実行するコマンドをバックグランドで実行

これは ssh してコマンドは実行したいけど、その実行はバックグランドで実行されていて欲しい場合に利用する。
バックグラウンドで通信はつなぐけど、別にそれがターミナル上で実行されている必要は無いものに使う。

## `-o <ssh_option>`:

細やかなオプションの設定ができる。
細かすぎて一々コマンドのオプションにしたくなかったんだろうと思う←

#### `ExitOnForwardFailure=<yes|no>`

その名の通り forwarding がうまく行かなかったときにどうするかのオプション。

細かい挙動の注意があるみたいだけど、まだよく分かっていない。

## `-L <port_forwarding>`

to be continued...
FlutterでWebViewを使う

FlutterでWebViewを使うためには少しいじる必要があります。

# flutter_webview_plugin
Flutterで Nativeの `WebView` を呼び出すには `flutter_webview_plugin` の依存を追加する必要があります。

```pubspec.yaml
dependencies:
  flutter_webview_plugin: "0.2.1+2"
```

バージョンは[こちら](https://pub.dartlang.org/packages/flutter_webview_plugin#-versions-tab-) からご覧ください。

ターミナル上で

```
flutter packages get
```

インストールすることで使えるようになります。

また、WebViewはWdigetTreeには統合されていないためSnackBarやDialogを使うところはできません。

インポート文は

```dart
import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';
```

# 実装
Flutter Navigationを利用して起動します。
公式サンプルのままですが

```dart

new MaterialApp(
      routes: {
        "/": (_) => new WebviewScaffold(
              url: "https://www.google.com",
              appBar: new AppBar(
                title: new Text("Widget webview"),
              ),
            )
      },
    );
```

`WebviewScaffold` を使ってその中で諸々セットして使います。
特に難しいことはありません。


# その他の使い方
WebViewはシングルトンインスタンスで提供されているのでどこからでもイベントをハンドリングできます。

## WebView内でページが移動した際のイベント
WebViewで移動するイベントをハンドリングできます。

```dart
    final flutterWebViewPlugin = new FlutterWebviewPlugin();

    flutterWebViewPlugin.onUrlChanged.listen((String url) {
      print(url);
    });
```

## WebView内のスクロールイベント
WebView内のスクロールイベントをハンドリングできます。

```dart
    flutterWebViewPlugin.onScrollYChanged.listen((double offsetY) {
      print(offsetY);
    });

    flutterWebViewPlugin.onScrollXChanged.listen((double offsetX) {
      print(offsetX);
    });
```

## WebViewを隠す、隠されたやつを表示する
`WebView` を隠したり表示したりするには

```dart
    // 表示する
    flutterWebViewPlugin.launch("https://www.google.com", hidden: false);

    flutterWebViewPlugin.launch("url",hidden:true);
```

単純に隠したり表示したりするなら

```dart
    flutterWebViewPlugin.show();
    flutterWebViewPlugin.hide();
```

もあります。

## リロード

```dart
flutterWebViewPlugin.reloadUrl(url)
```


## JS実行

```dart
flutterWebViewPlugin.evalJavascript(code)
```

code は String です。

## その他イベント
- Stream<Null> onDestroy
- Stream<WebViewStateChanged> onStateChanged
- Stream<String> onError

WebViewが破壊されたとき
WebViewのステータスが変わった時
WebViewでエラーが起きた時　など。
既存Reactプロダクトにbabel7と@babel/preset-typescriptを使ってFlowとTypeScriptを共存させる方法

## 現状について
もともとはPropTypesを使っていたReactのプロダクトだったんだけど、Flowを導入し始めていました。なので、Flowを使っているところとPropTypesを使っている部分が混在している状態です笑

ただ、実際はもともとFlowを入れたかった訳ではなく、本当はTypeScriptに移行したかったんですよね。なんでかというと、FlowだとBuidが通ってしまうから。

lint-stagedを使ってcommit時にチェックする方法もあるけど、TypeScriptの方がそもそもエラーあるとビルド通らないしいいなと。

## babel7の@babel/preset-typescriptの登場

babel7によりTypeScriptのコードをJavaScriptにパースすることができ、なおかつ@babel/preset-typescriptによりFlowと同じように型情報を取り除くこともできるようになりました。

Flow廃止してTypeScriptに以降したいけど、結構苦行だよね？ってことで二の足を踏んでいたんですが、babel7の@babel/preset-typescriptの登場により一旦共存をさせてから徐々に以降できるんじゃない？ってことで試してみる価値はありそうってことでやってみました。

結論から言って共存は可能でした。とりあえずやり方は以下で！


## インストール
```
$ npm install --save-dev @babel/preset-typescript typescript
```

## .babelrc
一旦でも共存という道を選んでいるのでかなり気持ち悪い状態汗

```
{
  "presets": [
    "@babel/typescript",
    "@babel/preset-env",
    "@babel/preset-flow",
    "@babel/preset-react"
  ],
  "plugins": [
    "@babel/plugin-proposal-class-properties",
    "@babel/plugin-proposal-object-rest-spread",
    "react-hot-loader/babel",
    "@babel/plugin-proposal-optional-chaining"
  ]
}
```

## webpack.config.js

babel-loaderのtestを変更する

``` javascript
{
  test: /\.(ts|js)x?$/,
  exclude: /node_modules/,
  use: ['babel-loader']
}
```

## buildしてみる
適当にtsのエラーになるように仕込んでbuildしてみます。

が、

build通ってしまいます。

IntelliJ側ではTSエラー出ているのにbuildが通ってしまいます。多分なんですけどpreset-flowとpreset-reactがあるとbuild自体は通ってしまうようです。

エディタではエラーになっているのでいいっちゃいいのですが、できればエラーがある場合はbuild通らないようにしたい。というか、build通るならFlowでいいじゃん。


## エラーがあったらbuildを通さないようにする

以下のプラグインの`async: false`にすることで、webpackの出力をブロックして、TypeChecker/linterを待機させてWebpackのコンパイルにエラーを追加することができます。

[Realytics/fork-ts-checker-webpack-plugin: Webpack plugin that runs typescript type checker on a separate process.](https://github.com/Realytics/fork-ts-checker-webpack-plugin)

```
$ npm install --save-dev fork-ts-checker-webpack-plugin
```

### webpack.config.js
```
plugins: [
  new ForkTsCheckerWebpackPlugin({ async: false }),
]
```

これでbuildが通らなくなりました。一旦望み通りの挙動にすることができた感じです。

## tslint & prettier

うまく動かないかなと思ったけど、割とうまく行くのでお好みで設定すれば良さそうです。

```
$ npm install --save-dev tslint tslint-config-prettier tslint-config-standard tslint-plugin-prettier
``` 

## まとめ
FlowとTypeScriptを共存させてしまっている状態ですごく気持ち悪いですね。ただ今後の以降方針としては

- Flowを使っているところからTypeScriptに移行
- Flowの設定外す
- ほかjsファイルをtsファイルへ
- babel/preset-typescriptはやめてts-loaderへ

@babel/preset-typescriptを使うことでというように一つクッションを置くことができるんじゃないかなと思います。ただ、新規でプロジェクトやる場合はTypeScript一択ですけどね笑
Unity覚書　テクスチャのサイズにオブジェクトを合せる（UI)

UIに関する質問より。

#テクスチャのサイズにオブジェクトを合せる（UI)

「画像のサイズが正方形ではない場合、テクスチャの縦横のサイズがImageオブジェクトの縦横のサイズとなるように張り付ける簡単な方法があるかどうか。」

ライフゲージのような、デザインされた部品の一部をゲームの進行状況に応じて色を変える場合など、部品の一部だけを画像ファイルにして重ねたい場合があります。

##Assetsに、UIで使用する画像ファイルをドラッグ＆ドロップで追加
##Texture Typeを変更
Assetsに追加した画像ファイルをクリックし、InspectorパネルでTexture TypeをSprite(2D and UI)にし、Applyする。
（UIの部品に張り付けるため）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/234600/12ea75b0-4b9f-0b4a-2442-3d7aa70416a0.png)

##Create→UI→ImageでImageを追加する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/234600/4fbe9a72-c560-96a4-2c43-f74a1a1998ef.png)

##ImageのInspectorのSource Imageのところに、Assetsの中にある画像をドラッグ＆ドロップで設定する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/234600/5868ad61-4edc-a8b8-6f6f-15b667733423.png)

##InspectorパネルのAdd Componentから、Content Size Fitterを追加する。
##Content Size Fitter(Script)パネルで、Horizontal FitとVertical Fitを「Preferred Size」に変更する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/234600/fadcdaed-154c-b16b-ccd9-221f413b51c1.png)
##画像サイズと同じサイズに変更される
Rect TransformのWidthとHeightが画像サイズと一致している
![image.png](https://qiita-image-store.s3.amazonaws.com/0/234600/8365fe6a-9b2b-e2dc-c63e-1a0d8b871686.png)
さくらレンタルサーバのDBにSSH経由でC#を使って接続する

##流れ
- 公開鍵を作る
- Renci.SshNet.dllを使ってポートフォワード
- データベース接続

##公開鍵を作る
TeraTermでさくらに接続。~/.sshに作るのが良いらしいので下記のようにした。

```console
$ mkdir ~/.ssh
$ cd ~/.ssh
$ ssh-keygen -t rsa
```
パスワードを聞かれるのでお好きなパスワードを入力。
下記ファイルが作成される。

- id_rsa・・・秘密鍵
- id_rsa_pub・・・公開鍵

公開鍵の名前を変更。あと、オーナーだけが変更できるように権限を変更。

```console
$ mv id_rsa_pub authorized_keys
$ chmod 600 authorized_keys
```

秘密鍵(id_rsa)はクライアント側で使うので、適当なFTPアプリでダウンロードする。サーバ側のid_rsaは削除。

##Renci.SshNet.dllを使ってポートフォワード

C#でゴリゴリ書く。

```C#
// keyFile：ダウンロードしたid_rsaの物理ファイルパス
// sshPasswd：「パスワードを聞かれるのでお好きなパスワード入力」で入力したパスワード
var pkfile = new PrivateKeyFile(keyFile, sshPasswd);

// さくらのホスト名(xxxxx.sakura.ne.jp)
string host = "xxxxx.sakura.ne.jp";
// user：さくらのユーザ名(xxxxx)
string user = "xxxxx";
var sshClient = new SshClient(host, 22, user, pkfile);

// ここで例外エラーが起こらなければSSH接続はOK
sshClient.Connect();

uint dbPort = 3306;
uint localPort = 3306;
// さくらのサーバコントロールパネル-データベース一覧の「データベースサーバ」を設定
string serverName = "yyyyy.db.sakura.ne.jp";
var sshForward = new ForwardedPortLocal("127.0.0.1", localPort, serverName, dbPort);
sshClient.AddForwardedPort(sshForward);
sshForward.Start();
```

##データベースに接続する
接続文字列は下記の通り。Pooling=Falseをつけてないと再接続が遅くなることがあるらしいのでとりあえずつけておく。

```
DB名：さくらのサーバコントロールパネル-データベース一覧の「データベース名」
ユーザID：さくらのユーザ名(xxxxx)
パスワード：さくらでDBを作成したときに入力したパスワード
server=127.0.0.1;database=DB名;Uid=ユーザID;Pwd=パスワード;Port=3306;Pooling=False
```

##参考サイト
http://kumakawa.hatenadiary.jp/entry/2015/02/23/C%23_%E3%81%8B%E3%82%89_SSH_%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6_MySQL_%E3%82%92%E4%BD%BF%E3%81%86%E6%99%82%E3%81%AB_MySQL_%E3%81%B8%E3%81%AE%E5%86%8D%E6%8E%A5%E7%B6%9A%E3%81%8C%E9%81%85%E3%81%84

http://vdeep.net/sakura-ssh
****.py "keyword"  でGoogle検索結果のタイトルとURLをcsvに書き込む

# Goal：pythonを用いて検索結果一覧をみたい

## 目的
SEO関連の調査を行うにあたり、検索結果の一覧が欲しいと考えました。

https://www.google.com/search?num=2&q=〇〇 
のnum=を書き換えて一覧を取得する方法でもいいかな、と思いましたが、
毎回するのは不格好で、かつ、requestsとbs4の勉強もかねて作ってみました。

実行は
```***.py "keyword"```
で実行してください。
例えば、バターナイフを調べたい場合は
<code>***.py バターナイフ</code>
となります。

複数キーワードを設定したい場合は、```keyword1+keywors2+...```
と引数を設定すると実行できます。

## 成果物
```python
# -*- coding: utf-8 -*-
import requests
import sys
from bs4 import BeautifulSoup
import csv
# 項目数を増やす場合は、num=100 など変更します
google = 'https://www.google.com/search?num=10&q='
re = requests.get(google+ ''.join(sys.argv[1:]))
soup = BeautifulSoup(re.text, "lxml")

#soupの具材をみてどこから探すか検討。google検索の場合、下記でうまくいきます。
elems = soup.select(".r a")

for elem in elems:
    #text抽出
    txtelem = elem.getText()
    #url抽出 余分な接頭辞があるので空白に置き換えます。
    repelem = elem.get('href').replace('/url?q=','')
    #確認用に出力しています。不要であれば削除してください。
    print('{} ,{}'.format(txtelem, repelem))
    data = [[txtelem, repelem]]
    with open('googlesearch.csv', 'a', newline='') as f:
        writer = csv.writer(f)
        writer.writerows(data)
```


同一フォルダ内にgooglesearch.csvが作成、実行ごとに結果が取得されます。

###都度csvを上書きをしたい場合は
<code>a</code> を <code>w</code> に変えるだけで本来はいいのですが、for で回しているので一行ごとに上書きされてしまいます。
そこで、実行時に前回の内容を削除するコマンドを実行します。


for の前に

```python
with open('googlesearch.csv', 'w', newline='') as f:
    f.write("")
```
を追記するとうまくできます。


###結果を確認
```
Qiita ,https://qiita.com/&sa=U&ved=0ahUKEwjv-sT0977eAhXNa94KHVMHCLcQFggUMAA&usg=AOvVaw0y_sHe_tLOSNzkcjQHvct_
Qiita (キータ) 公式 (@Qiita) | Twitter ,https://twitter.com/qiita&sa=U&ved=0ahUKEwjv-sT0977eAhXNa94KHVMHCLcQFggaMAE&usg=AOvVaw1qhHoSKmnAa69GduySbEpl
....
```


検索結果は、下記の通りです。
なお、soupの内容からコードを作成しており、オーガニックな結果のみ（広告・ニュースを除く）取得するようにしています。
広告・ニュースなど、すべての結果を取得する場合、```soup```の中身をみて、```soup.select()``` の箇所を変更してみるとうまくいくと思います。
<img width="348" alt="qiitasearch.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/266495/c288c46b-429f-53c9-f488-209b8cc8bbab.png">


課題は、日本のデータはこれで取得できますが、海外の場合はどうしたらいいのいか、です。

# 追記（2018年11月8日）
課題に対して、mareku さんよりコメント欄に以下の記述がありました。

>URLにパラメータを追加すれば、海外のGoogle検索結果を見れますよ。
gl 国を指定する。
米国ならgl=us
国コードはISO 3166 - Wikipediaのalpha-2が使用されています。
hl 言語を指定する。
英語なら hl=en
言語コードはISO 639-1 - Wikipediaが使用されています。
ですべてを含むと https://www.google.com/search?&gl=us&hl=en&num=10&q=

ありがとうございました！！！
最も簡単なChrome拡張機能を作ってみた

初心者が最も簡単にGoogle Chromeの拡張機能（Firefoxのアドオン）を作ることを目的に最も簡単なChrome拡張機能を作ってみた。

# 拡張機能の概要

拡張機能は、ブラウザのツールボックスにアイコンを表示させ、アイコンクリック時にメッセージを出すもので、ファイル数は３つだけ。

拡張機能の名前は ***SimpleExtension***。

ソース　https://github.com/querykuma/SimpleExtension/tree/v1.0


# 開発の手順

## アイコンを作る (1/3)

サイズは48x48とする。![SimpleExtension48.png](https://qiita-image-store.s3.amazonaws.com/0/309644/b15090e0-7493-3661-5b38-ddbad9ef3289.png)

## manifest.json を作る (2/3)

manifest.json は拡張機能の設定項目を１つにまとめたファイルで必ず必要。

```JSON:manifest.json
{
  "description": "最も簡単な拡張機能",
  "manifest_version": 2,
  "name": "SimpleExtension",
  "version": "1.0",
  "permissions": [
    "notifications"
  ],
  "background": {
    "scripts": [ "background.js" ]
   },
  "icons": {
    "48": "SimpleExtension48.png"
  },
  "browser_action": {
    "default_icon": "SimpleExtension48.png",
    "default_title": "Simple Extension"
  }
}
```

<font color=#0d61da>"background"</font>は拡張機能が有効になった時に一回だけスクリプトを実行する設定項目で<font color=#0d61da>"background.js"</font>を実行。

<font color=#0d61da>"browser_action"</font>はツールバーのアイコンファイルを指定。

<font color=#0d61da>"icons"</font> は拡張機能タブに表示するアイコンファイルを指定。

<font color=#0d61da>"permissions"</font> はアクセス権を宣言する設定項目。メッセージを出す関数 `chrome.notifications.create` を使うので<font color=#0d61da>"notifications"</font>を宣言。

## background.js を作る (3/3)

```javascript:background.js
chrome.browserAction.onClicked.addListener(function(){
	let	options={
		type: "basic",
		title: "Simple Title",
		message: "簡単です",
		iconUrl: "SimpleExtension48.png"
	};
	chrome.notifications.create(options);
	console.log("debug", options);
});
```

<font color=#0d61da>chrome.browserAction.onClicked.addListener</font> はイベントリスナーを登録する関数で、ツールバーのアイコンクリック時に引数の無名関数を実行。

<font color=#0d61da>chrome.notifications.create</font> はメッセージを出す関数。

<font color=#0d61da>console.log</font> はおまけ。デバッグに役立つ。

以上３つのファイルをフォルダSimpleExtensionの中に置いて開発終了。<font color=#eb4a3c>***簡単でしょ。***</font>



# 動かしてみる

## Chrome で動かす

拡張機能(chrome://extensions/)を開き、デベロッパーモードにしてパッケージ化されていない拡張機能を読み込み、フォルダ SimpleExtension を選択。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/309644/e2c082ee-5478-6457-91d3-07dc6c022e96.png)

ツールバーのアイコンをクリックして「簡単です」のメッセージが出たら成功。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/309644/2e61c81c-255a-238e-9e8f-9871dc0b3af8.png)

## Firefox で動かす

アドオンのデバッグ(about:debugging#addons)を開き、アドオンのデバッグを有効化し、一時的なアドオンを読み込み、フォルダ SimpleExtension 内のいずれかのファイルを選択。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/309644/fad46e96-a75a-3a8d-d68d-75d3cbb085cd.png)

ツールバーのアイコンをクリックして「簡単です」のメッセージが出たら成功。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/309644/cde5e93b-a3f8-c6d8-81f5-d75d41244476.png)
[VB.NET]マシンの物理メモリ使用量を取得する

久々にVB.NETを触ったので備忘録

## 環境
.NET Framework 4.5
(.NET Framework 2.0以上なら動く？らしい)

## 物理メモリ使用量を取得する
物理メモリ使用量は直接取得できないので
「合計物理メモリ量」と「使用可能な物理メモリ量」から計算する

```vb.net:Main.vb
Module Main

    Sub Main()

        ' 合計物理メモリ
        Dim totalPhysicalMemoryByte As Decimal = CDec(My.Computer.Info.TotalPhysicalMemory)
        Dim totalPhysicalMemoryKB As Decimal = totalPhysicalMemoryByte / 1024
        Dim totalPhysicalMemoryMB As Decimal = totalPhysicalMemoryByte / 1024 / 1024
        Dim totalPhysicalMemoryGB As Decimal = totalPhysicalMemoryByte / 1024 / 1024 / 1024

        ' 利用可能な物理メモリ
        Dim availablePhysicalMemoryByte As Decimal = CDec(My.Computer.Info.AvailablePhysicalMemory)
        Dim availablePhysicalMemoryKB As Decimal = availablePhysicalMemoryByte / 1024
        Dim availablePhysicalMemoryMB As Decimal = availablePhysicalMemoryByte / 1024 / 1024
        Dim availablePhysicalMemoryGB As Decimal = availablePhysicalMemoryByte / 1024 / 1024 / 1024

        ' メモリ使用量を計算
        Dim usedPhysicalMemoryByte As Decimal = totalPhysicalMemoryByte - availablePhysicalMemoryByte
        Dim usedPhysicalMemoryKB As Decimal = usedPhysicalMemoryByte / 1024
        Dim usedPhysicalMemoryMB As Decimal = usedPhysicalMemoryByte / 1024 / 1024
        Dim usedPhysicalMemoryGB As Decimal = usedPhysicalMemoryByte / 1024 / 1024 / 1024


        Console.WriteLine("[メモリ情報]合計物理メモリ(Byte)：{0} Byte 利用可能な物理メモリ：{1} Byte メモリ使用量：{2} Byte" _
                          , totalPhysicalMemoryByte.ToString("0"), availablePhysicalMemoryByte.ToString("0"), usedPhysicalMemoryByte.ToString("0"))

        Console.WriteLine("[メモリ情報]合計物理メモリ(KB)：{0} KB 利用可能な物理メモリ：{1} KB メモリ使用量：{2} KB" _
                          , totalPhysicalMemoryKB.ToString("0"), availablePhysicalMemoryKB.ToString("0"), usedPhysicalMemoryKB.ToString("0"))

        Console.WriteLine("[メモリ情報]合計物理メモリ(MB)：{0} MB 利用可能な物理メモリ：{1} MB メモリ使用量：{2} MB" _
                          , totalPhysicalMemoryMB.ToString("0"), availablePhysicalMemoryMB.ToString("0"), usedPhysicalMemoryMB.ToString("0"))

        Console.WriteLine("[メモリ情報]合計物理メモリ(GB)：{0} GB 利用可能な物理メモリ：{1} GB メモリ使用量：{2} GB" _
                          , totalPhysicalMemoryGB.ToString("0"), availablePhysicalMemoryGB.ToString("0"), usedPhysicalMemoryGB.ToString("0"))
    End Sub

End Module

```

こんなの絶対忘れる
iterm2 に表示される hostname を変更する方法

# 前提

- 最近 Macbook を買い替えた or 会社で新しく取り寄せた方向け

# 環境

- macOS High Sierra 10.13.5

# TL;DR
Mac に標準で入っている `hostname` コマンドで変更することができます。

```
$ sudo hostname [変更したい名前]
```

↓↓これが…
![スクリーンショット 2018-11-06 13.43.43.png](https://qiita-image-store.s3.amazonaws.com/0/156176/8516c48a-2c69-7d73-acfa-fc5bbcf71ee5.png)

↓↓こうなって…
![スクリーンショット 2018-11-06 13.49.13.png](https://qiita-image-store.s3.amazonaws.com/0/156176/7390cf59-c6ca-4f7b-504f-e5efb6cd4152.png)


↓↓こうじゃ！
![スクリーンショット 2018-11-06 13.49.45.png](https://qiita-image-store.s3.amazonaws.com/0/156176/fbaf541e-c85d-bd15-8d3d-6a92567c6996.png)


# 詳細

`hostname` のマニュアルは以下の通りです。みたところとても単純なコマンドです。これなら忘れない！

```
$ man hostname

HOSTNAME(1)               BSD General Commands Manual              HOSTNAME(1)

NAME
     hostname -- set or print name of current host system

SYNOPSIS
     hostname [-fs] [name-of-host]

DESCRIPTION
     The hostname utility prints the name of the current host.  The super-user can set the hostname by supplying an argument.  To keep the hostname between reboots, run `scutil --set HostName name-of-host'.

     Options:

     -f    Include domain information in the printed name.  This is the default behavior.

     -s    Trim off any domain information from the printed name.

SEE ALSO
     gethostname(3), scutil(8)

HISTORY
     The hostname command appeared in 4.2BSD.

BSD                            December 7, 2006                            BSD
```

# 参考文献
なし（たまたま hostname って打ったら出てきた）
Google Maps APIを用いて指定された緯度経度範囲内にランダムなポリラインを描画する

個人的なメモ

```swift:swift.swift
var polyline: GMSPolyline = GMSPolyline()
func createDummyData() {
    let path: GMSMutablePath = GMSMutablePath()
        
    // 1000本ランダムで作る
    for _ in 0...1000 {
        let a = getRandomNumber(Min: 34.693329, Max: 34.708026)
        let b = getRandomNumber(Min: 135.496979, Max: 135.507312)
        print("#### \(a), \(b)")         
        let coordinate = CLLocationCoordinate2DMake(CLLocationDegrees(a), CLLocationDegrees(b))
        path.add(coordinate)
    }
        
    polyline.map = nil
    polyline.strokeColor = UIColor(red: 1.0, green: 0, blue: 0, alpha: 0.5)
    polyline.strokeWidth = 3
    polyline.path = path
    polyline.map = googleMap
    self.googleMap.moveCamera(GMSCameraUpdate.fit(GMSCoordinateBounds(path: path)))
}
    
func getRandomNumber(Min _Min : Float, Max _Max : Float)->Float {
    return ( Float(arc4random_uniform(UINT32_MAX)) / Float(UINT32_MAX) ) * (_Max - _Min) + _Min
}
```
```java:java.java
private void createDummyData() {
		ArrayList<LatLng> locationList = new ArrayList<>();
		mMap.moveCamera(CameraUpdateFactory.newLatLng(new LatLng(34.7025505, 135.500997)));
		for (int i = 0; i < 750; i++) {
			locationList.add(new LatLng(getRandomLatLng(34.693329, 34.708026), getRandomLatLng(135.496979, 135.507312)));
		}

		PolylineOptions rectOptions = new PolylineOptions()
				.addAll(locationList)
				.color(Color.parseColor("#59ff0000"));
		Polyline polyline = mMap.addPolyline(rectOptions);
	}

	private double getRandomLatLng(double min, double max) {
		double x = (Math.random()*((max-min)))+min; //    This Will Create A Random Number Inbetween Your Min And Max.
		double xrounded = Math.round(x * 1000000.0) / 1000000.0; // Creates Answer To The Nearest 100th, You Can Modify This To Change How It Rounds.
		System.out.println(xrounded); //    This Will Now Print Out The Rounded, Random Number.
		return xrounded;
	}
```
javascript で CSV 変換

### Csv.stringify

@param [[]]

### Csv.parse

@param string

#### Setup
```bash
git clone https://github.com/jobscale/csv.git
```

#### Example
```bash
echo "const { Csv } = require('csv');
      
const logger = console;
const main = () => {
  Csv.stringify([[1, 2, 3, 4]])
  .then(logger.info);
  Csv.parse('1,2,3,4')
  .then(logger.info);
};
main();" > example.js
```

### Run
```bash
NODE_PATH=. node example.js
```
Raspberry Pi Headless Setup with UART Console

#ヘッドレスで設定したい
　Raspberry Piはデスクトップ代わりというより組み込みマイコンかサーバー代わりに使うことが多いのでディスプレイとか使いたくない。
#シリアルでやりたい
　Raspberry Pi Zeroとかはイーサネットポートがついていないので、どれでも同じように設定するためにはシリアルでやるのが一番良い。
　イーサネットポートがついている奴だけでやるなら、mDNSを入れてpi@raspberrypi.localにsshするのもよいだろう。windowsの場合はAppleのBonjourを入れればよい。LinuxはAvahi。
#インストール時のひと手間
　最近のRaspbianはsshがデフォルトでは有効化されていないので、sshという名前の空のファイルをSDカードのBootパーティションに作っておくことが必要である。UARTもデフォルトでは有効でないので、Bootパーティションにあるconfig.txtの最後に、``enable_uart=1``と付け加える。
#接続
　Raspberry Piの電源を入れる前に、物理的に接続してシリアルコンソールを開いておくのが一番問題が出にくいのでお勧めする。ボーレートは115200である。Windowsの人はTeratermとかを使うときはデフォルトが違うので文字化けをする。ちゃんと設定するように。シリアルのつなぎ方はほかのサイトを参照のこと。USBシリアル変換はAliexpressとかだと安く手に入るし、Amazonでも中国直輸入っぽいのを買えばよい。FT232が有名なチップ。CH340は中華Arduinoによくついている奴だがドライバ周りでもめやすい。
2019/02/15追記:最近はCH340でもWin10なら自動でドライバーインストールしてくれるっぽい？
#Wi-Fi
シリアルで入れればあとはwpa_supplicantの設定をすればよい。大学のネット環境に入りたいときはeduroamの設定を真似すればよいだろう。
Gitのリモートリポジトリどこにするか

# Gitホスティングサービス選び
`リモートリポジトリの設置場所`を`Gitホスティングサービス`と呼称するそうです。

`Git`といえば`GitHub`にリモートリポジトリを作るものかと思っていましたが、
よくよく調べてみたら色々ありました。

以下、メジャー？なGitホスティングサービスを調べました。
自分の基準は`無料か有料`か、`プライベートかフルオープン`か、`上限の有無はどう`か。

### GitHub
Webサービス型
無料でリポジトリを作成できる。
プライベートリポジトリは有料。（学生、先生なら無料）
プライベートじゃない場合は他の人がリモートリポジトリを閲覧、ダウンロードできる。
プルリクエストも出せる。
就活でアカウントがあると有利とか諸説あり。
SESでエンジニアやってると必ずぐらい触る機会あり。

### Bitbucket
Webサービス型。
無料でリポジトリを作成できる。
プライベートリポジトリも５つまで無料。
プライベートリポジトリはSSH接続、https接続選択できます。
プルリクエストも出せる。
2GBを超えるとハードリミット（コミットの削除とコミットを戻すことしか出来なくなる）。
LargeFileStorage（画像など大きいファイルを配置するストレージ）は無料プランでは1GB。お金払うと増やせる。

### GitLab
インストール型。
GitLabはGitHubのクローンプロジェクト。（オープンソースのGithub）
セルフホスト。（自前のサーバーに自分でホスティングする必要あり）
自分で設定する必要あるが、サーバーから自前で用意したものになるのでサーバー次第で特に制限なし。
日本語対応。

### GitBucket
インストール型。
GitLabと同じセルフホスト。
GitBucketはScalaで実装されており、Javaサーブレットとして動作する。
GitLabより軽くて早いらしい。
日本語非対応。

### Assembla
Webサービス型。
プライベートリポジトリを無償で持つことができる。
プライベートリポジトリ無制限。
メンバー無制限
プルリクエストも出せる。
SSHなし。

###各種レンタルサーバー
git用のGUIとか不要な人（コマンドでgitを使ってる人）。
レンタルサーバーに`ssh`でログインを行い、`gitホスティングの設定`すればリモートリポジトリを作れる。
例：https://qiita.com/shu1rou/items/ad70aee1d0c8f20a9feb
#####結局これにした
・よくよく考えたらGUIもgitのWebサービスも使ってないし要らない。（一人だからw）
・オンプレミスを用意するのが面倒。（一人だからw）
・レンタルサーバ（有料）だから他に払ったり管理することを考えなくて良い。
・deployするのもどうせ同じ場所。
・自分のレンタルサーバなので`プライベート`は担保されてる。
・一括管理することになるので`上限とか気にしないで済む`。

### その他
他にもPhabricatorとかありましたが下記の記事を参照。
無料で使える! Gitのホスティングサービス5つ
https://www.find-job.net/startup/5-git-hosting
統計検定１級（人文科学）チートシート [正規分布]

統計検定１級応用（人文科学）の固有トピックを備忘録的にまとめています。

[統計検定１級（人文科学）チートシート [正規分布]](https://qiita.com/jytwelve/items/46f39de383a1aa0a76cc)
[統計検定１級（人文科学）チートシート [分散分析]](https://qiita.com/jytwelve/items/f5084ed445f68d4a34fe)
#1次元正規分布の確率密度関数
```math
f(x) = \frac{1}{\sqrt{2\pi\sigma^2}}\exp \left( -\frac{(x-\mu)^2}{2\sigma^2} \right)\ \  (-∞<x<∞)
```
特に、$\mu=0, \sigma^2=1$の場合を標準正規分布と呼ぶ。
確率変数 $x$ が1次元正規分布に従うとき、$x \sim N(\mu, \sigma^2)$と表記し、確率密度関数、分布関数をそれぞれ $\phi(x)$, $\Phi(x)$で表す。


#多次元正規分布の確率密度関数
```math
f(\boldsymbol{x}) = \frac{1}{(\sqrt{2\pi})^{n}\ \sqrt{|\Sigma|}}\ exp\Big\{-\frac{1}{2}(\boldsymbol{x}-\boldsymbol{\mu})^T\Sigma^{-1}(\boldsymbol{x}-\boldsymbol{\mu})\Big\}
\ \ (\boldsymbol{x} \in R^d)
```
確率変数 $\boldsymbol{x}$ が多次元正規分布に従うとき、$\boldsymbol{x} \sim MVN(\boldsymbol{\mu}, \Sigma)$と表記する。

#確率変数の線形変換
多次元正規分布に従う確率変数 $\boldsymbol{x}$ を行列$A$で変換したときの確率分布

```math
A\boldsymbol{x} \sim MVN(A\boldsymbol{\mu}, A \Sigma A^{\mathrm{T}})
```
##出題
* 2013年 問2 [1],[2]
* 2014年 問1 [1],[2]

#切断正規分布
標準正規分布の定義域を $a<x<∞$ に制限した確率密度関数を考える。

```math
f(x) = \frac{1}{\sqrt{2\pi}}\exp \left( -\frac{x^2}{2} \right)
\Biggl(\int_{a}^{∞}\frac{1}{\sqrt{2\pi}}\exp \left( -\frac{x^2}{2} \right)dx\Biggl)^{-1}=
\frac{\phi(x)}{1-\Phi(a)}\ \ (a<x<∞)
```
```math
\begin{eqnarray}
E[x] &=& R^{-1}(a)\\
V[x] &=& 1 + aR^{-1}(a) - R^{-2}(a)\\
R(a) &=& \frac{1-\Phi(a)}{\phi(a)}
\end{eqnarray}
```
##出題
* 2014年 問1 [3],[4]
* 2016年 問2 [2],[3]
* 2017年 問3 [3]

#条件付き分布
```math
\begin{bmatrix}\boldsymbol{x_1}  \\ \boldsymbol{x_2}\end{bmatrix}
\sim
MVN(\begin{bmatrix}\boldsymbol{\mu_1}  \\ \boldsymbol{\mu_2}\end{bmatrix},
\begin{bmatrix}\Sigma_{11} & \Sigma_{12} \\ \Sigma_{21} & \Sigma_{22}\end{bmatrix})
```

ならば、　

```math
\boldsymbol{x_1} | \boldsymbol{x_2} \sim N(\boldsymbol{\mu_{1|2}},\ \Sigma_{11 \cdot 2})
```
ただし、

```math
\begin{eqnarray}
\boldsymbol{\mu_{1|2}} &=& \boldsymbol{\mu_1} + \Sigma_{12} \Sigma_{22}^{-1}(\boldsymbol{x_2}  - \boldsymbol{\mu_2})
\\
\Sigma_{11 \cdot 2} &=& \Sigma_{11} - \Sigma_{12}\Sigma_{22}^{-1}\Sigma_{12}
\end{eqnarray}
```

##出題
* 2017年 問3 [1],[2]
統計検定１級（人文科学）チートシート [分散分析]

統計検定１級応用（人文科学）の固有トピックを備忘録的にまとめています。

[統計検定１級（人文科学）チートシート [正規分布]](https://qiita.com/jytwelve/items/46f39de383a1aa0a76cc)
[統計検定１級（人文科学）チートシート [分散分析]](https://qiita.com/jytwelve/items/f5084ed445f68d4a34fe)
#一元配置分散分析

##統計モデル
$y_{ij}=\mu + \alpha_i + \epsilon_{ij}$

$y_{ij}$: 観測データ $(i = 1,..,a,\ \ j=1,...,n)$
$\mu$: 母平均
$ \alpha_i $: 要因Aにおける水準$i$の主効果
$\epsilon_{ij} $: 観測誤差

##分散分析表

| 因子 | 平方和 | 自由度 | 平均平方和 | F値 |
|:-----------|------------:|:------------:|:------------:|:------------:|
| A | $SS_A=\sum_{i=1}^{a}n(\bar{y} _ {i \cdot} - \bar{y}_{\cdot \cdot})^2$ | $a-1$ | $MS_A = \frac{SS_A}{a-1}$ | $\frac{MS_A}{MS_R}$ |
| 残差 | $SS_R=\sum_{i=1}^{a}\sum_{j=1}^{n}(y_ {ij} - \bar{y} _{i \cdot})^2$ | $a(n-1)$ | $MS_R = \frac{SS_R}{a(n-1)}$ |  |
| 全体 | $SS_T=\sum_{i=1}^{a}\sum_{j=1}^{n} (y_{ij} - \bar{y}_{\cdot \cdot})^2$ | $an-1$ |  |  |

##出題
2017年 問2 [1]~[4]

#乱塊法

##統計モデル
$y_{ij}=\mu + \alpha_i + \beta_j + \epsilon_{ij}$

$y_{ij}$: 観測データ $(i = 1,..,a,\ \ j=1,...,b)$
$\mu$: 母平均
$ \alpha_i $: 要因Aにおける水準$i$の主効果
$\beta_j $: 要因Bにおける水準$j$の主効果
$\epsilon_{ij} $: 観測誤差

##分散分析表

| 因子 | 平方和 | 自由度 | 平均平方和 | F値 |
|:-----------|------------:|:------------:|:------------:|:------------:|
| A | $SS_A=b\sum_{i=1}^{a}(\bar{y} _ {i \cdot} - \bar{y}_{\cdot \cdot})^2$ | $a-1$ | $MS_A = \frac{SS_A}{a-1}$ | $\frac{MS_A}{MS_R}$ |
| B | $SS_A=a\sum_{j=1}^{b}(\bar{y} _ {\cdot j} - \bar{y}_{\cdot \cdot})^2$ | $b-1$ | $MS_B = \frac{SS_B}{b-1}$ | $\frac{MS_B}{MS_R}$ |
| 残差 | $SS_R=\sum_{i=1}^{a}\sum_{j=1}^{b}(\bar{y} _ {ij} - \bar{y} _ {i \cdot} - \bar{y} _ {\cdot j} + \bar{y}_{\cdot \cdot})^2$ | $ab - a - b +1$ | $MS_R = \frac{SS_R}{ab-a-b + 1}$ |  |
| 全体 | $SS_T=\sum_{i=1}^{a}\sum_{j=1}^{b} (y_{ij} - \bar{y}_{\cdot \cdot})^2$ | $ab-1$ |  |  |

##出題

#二元配置分散分析

##統計モデル
$y_{ijk}=\mu + \alpha_i + \beta_j + r_{ij} +  \epsilon_{ijk}$

$y_{ijk}$: 観測データ $(i = 1,..,a,\ \ j=1,...,b,\ \ k=1,...,n)$
$\mu$: データの母平均
$ \alpha_i $: 要因Aの水準$i$の主効果
$\beta_j $: 要因Bの水準$j$の主効果
$r_{ij} $: 要因A,Bにおいてそれぞれ水準$i, j$のときの交互作用
$\epsilon_{ijk} $: 観測誤差

##分散分析表

| 因子 | 平方和 | 自由度 | 平均平方和 | F値 |
|:-----------|------------:|:------------:|:------------:|:------------:|
| A | $SS_A=bn\sum_{i=1}^{a}(\bar{y} _ {i \cdot \cdot} - \bar{y}_{\cdots})^2$ | $a-1$ | $MS_A = \frac{SS_A}{a-1}$ | $\frac{MS_A}{MS_R}$ |
| B | $SS_B=an\sum_{j=1}^{b}(\bar{y} _ {\cdot j \cdot} - \bar{y}_{\cdots})^2$ | $b-1$ | $MS_B = \frac{SS_B}{b-1}$ | $\frac{MS_B}{MS_R}$ |
| A*B(交互作用) | $SS_{A×B}=n\sum_{i=1}^{a}\sum_{j=1}^{b}(\bar{y} _ {ij \cdot} - \bar{y} _ {i \cdot \cdot} - \bar{y} _ {\cdot j \cdot} + \bar{y}_{\cdots})^2$ | $(a-1)(b-1)$ | $MS_{A×B} = \frac{SS_{A×B}}{(a-1)(b-1)}$ | $\frac{MS_{A×B}}{MS_R}$ |
| 残差 | $SS_R=\sum_{i=1}^{a}\sum_{j=1}^{b}\sum_{k=1}^n (y_{ijk} - \bar{y} _ {ij \cdot})^2$  | $ab(n-1)$ | $MS_R = \frac{SS_R}{ab(n-1)}$ |  |
| 全体 | $SS_T=\sum_{i=1}^{a}\sum_{j=1}^{b}\sum_{k=1}^n (y_{ijk} - \bar{y}_{\cdots})^2$ | $abn-1$ |  |  |

##出題
2015年 問5 [1]~[4]
Nuxt.jsでCSSがminifyされてないので、気持ちよくminifyする

nuxt.config.jsのbuildのところに下記のように追加してあげるだけで
私の気持ち良いと思う感じにしてくれる。

```
build: {
    postcss: [
      require('postcss-custom-properties')({
        warnings: false
      }),
      require('cssnano')({
        preset: 'default'
      })
    ],
...
```


### Before
![image.png](https://qiita-image-store.s3.amazonaws.com/0/139023/fb42e8bc-0524-a7fe-aaa3-3b471ff8db29.png)

### After
![image.png](https://qiita-image-store.s3.amazonaws.com/0/139023/c066297a-fd78-6fed-b70d-590c260f6730.png)

コードまで見るのが好きな私だけの趣味的なものかもしれないのですが、こっちの方が気持ちいいので。
デフォルトでMinifyこれでもいいのにな〜って思うぐらいです。

以上、自分記録用。
【CentOS7.5】タイムゾーンの設定

#作業環境
CentOS 7.5
macOS 10系

#参考
[このサイト](https://www.server-memo.net/centos-settings/centos7/timedatectl.html)に倣って作業を行います。ありがたや〜です！

#手順
##現在の設定を確認

```
# timedatectl
      Local time: 火 2018-11-06 02:56:53 UTC
  Universal time: 火 2018-11-06 02:56:53 UTC
        RTC time: 火 2018-11-06 02:56:52
       Time zone: UTC (UTC, +0000)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
```
timedatectlってなんだろう。。と思いつつコマンド入力。
デフォルトだと[UTC](https://wa3.i-3-i.info/word11831.html)なんですね（そりゃそうだ）。

##タイムゾーンの一覧からAsia/Tokyoを検索

```
# timedatectl list-timezones | grep -i asia/tokyo
Asia/Tokyo
```
grepしなかったら当然ですが一覧がわーっと出力されます。最初やりました。

##タイムゾーンの変更

```
# timedatectl set-timezone Asia/Tokyo
# timedatectl
      Local time: 火 2018-11-06 12:02:13 JST
  Universal time: 火 2018-11-06 03:02:13 UTC
        RTC time: 火 2018-11-06 03:02:13
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
```
本題。Asia/Tokyoを指定して設定が反映されているか確認します。
再起動が必要なのかなーと思ってましたが即時反映されました。
この手順は永続的なものですので、サービスのenableは不要です。

公式ドキュメントを見るまでもない手順でさえすぐに忘れるぼくのメモリはなんなのでしょうか。。
Showroomの前田裕二さんがメモは外部HDD、と仰られていたのでそれを信じることにします！
簡単ですが以上です。
俺のフレームワークが、1205行で実装できる訳がない！

# すみません
タイトルは釣りですが、釣られて下さってありがとうございます。

# 書いたもの
[\_(losand).\_](https://github.com/johnny-shaman/losand)
[$(dsand).$()](https://github.com/johnny-shaman/dsand)

## 基底ライブラリ:　[\_(losand).\_](https://github.com/johnny-shaman/losand)
最初は、モナドそのものの実験的な実装だけをやりました。
そのうち、javascriptがとり得る最低限の圏に対しての自己関手ぐらいは実装したものにしようという意欲が湧きました。
前作、[de.js](https://github.com/johnny-shaman/de.js-webRTC-Template)より、既存コンストラクタのprototypeを出来る限り拡張しないでも実装出来ないだろうか？
全て、_で繋いで文脈を理解させるのも限界がある等、色々失敗した後だから色々試しました。失敗も多かったです。
例えば、JSONを丸渡ししてオブジェクトの振る舞いを書ければ…
なども候補にありました。
losandそのものはstateモナドとして実装されているのですが、使う側のことを考えたらstate側を明示で呼び出すのは苦しい言い訳がある（要は使いづらい）ので、モノイドをかなり意識しました。
最後に　**.\_**　で閉じるまでは、すべての命令を |> で繋いだ表現として書くことも可能です。

```html
<script src="https://cdn.jsdelivr.net/npm/losand@1.2.0/losand.js"></script>
```
で読み込み出来ます。
以下は例です。

```javascript
//ex
_({a: 1})
.draw({b: 3})
.map(
  o => _(o)
  .vals
  ._
  .reduce((a, b) => a + b, 0)
)
._
// 4

_({a: 1, b: 3, c: 5})
.hold("a", "c")
._
```

\_記号にサンドイッチされた計算機構と考えたので、
losand
になりました。
これが460行です

## VDOM on Pure Javascript [$(dsand).$()](https://github.com/johnny-shaman/dsand)

上述、losandを使って凝集度を上げに上げて作った結果、745行のVDOMまでを賄うフレームワークを書きました。

まずは読み込み…

```html
<script src="https://cdn.jsdelivr.net/npm/dsand@0.3.5/dsand.js"></script>
```

最初に、\$.dataに閲覧可能な状態(state)を書き込みます。
閲覧対象の指定は、各 Render（後述します。） の持つ、markメソッドに、$.dataの持つプロパティ名を入れてあげることで、指定した閲覧を可能にします。

閲覧は、RenderFunctionの持つlookで出来ます。

```javascript
_($.data).draw({
  test: {
    state: "success on load at test state"
  }
});
```

次に、役割のための振る舞いを記述します。
この振る舞いは、あるHTMLエレメントで指定されたイベントが発火したときに、
そのエレメントが持つclass名をキーにして実行されるように出来ています。
引数に渡されるのは、eventオブジェクトです。
ここには、MVCで言うところの　Mの持つドメインロジックを記述していきます。

```javascript
_($.role).draw({
  doTest (e) {
    alert($(e).look.state);
    return "marked data loaded on .look"
  }
});
```

次に、見た目を変更する記述をします。
これも、HTMLエレメントで指定されたイベントが発火したときに、
そのエレメントが持つclass名をキーにして実行されます。
第1引数はeventオブジェクトが渡りますが、
第2引数は、$.roleで行った振る舞いのreturn値が入ります。
生成されたエレメントの見た目をごっそり書き換えたい場合、
.seem が便利です。

ちなみに、packという名前の由来ですが、振る舞った後は、unpackされたという言語的概念に即してみました。

```javascript
_($.pack).draw({
  doTest (e, d) {
    $(e).seem(d);
  }
});
```

いよいよレンダリングです。
各タグがそのままエレメントを返すためのgetメソッドとして機能しています。
\$.bodyはbodyタグを表し、.\$は基本的にappendを行います。

ちなみに、\$(Element).\$(undefined)なら、その要素をremoveします。

```javascript
const myButton = button
.mark("test")
.class("doTest")
.$("load state data")
.on("click");

$.body.$(
  p.$(myButton)
);
```

745行ほどで、この実装が出来ています。
主なサポート対象はchromeで、phonegap を使ったSPAを素早く作れます。
AndroidアプリのwebViewで正常に動作するので、ネイティブっぽいSPAを作ることも可能です。
グローバルのgetメソッドに各タグの為のレンダーが当たっているのは、コンポーネントを実際に生成する場合は、グローバル領域を使わないようにして欲しいという気持ちがあります。

なお、formタグ内のname属性を持つElementに対してであれば、
.set({[name]: value})
で値の設定ができ
.get
で、オブジェクトが返ってきます。

返ってきたオブジェクトを

```javascript
_(Object).json
```
とするだけで、JSON取れます（笑）

```javascript
JSONStr.json._
```
でパースされて戻ってきますが、

```javascript
JSONStr.json
```
で、losandに代入されたオブジェクトとして扱えます。
理由は…

```javascript
_({a: 3}).json.json._
```

というstringifyしてparseするというところで明示をしたかったためです。

以上、お読みいただきありがとうございました。
Keccak と SHA3 の関係

### 結論

先に結論だけ書くと、**SHA3（正確にはFIPS-202とされているものに限定するのかもしれない） と Keccak は同じメッセージでも出力が違うので別物であると捉え、各ライブラリがどちらの実装であるかをよくよく確認しないといけない(具体的には、空メッセージを一度関数にかけて確認すべき)。**

### Keccak とは

Keccak(ケチャック)と呼ばれるハッシュ関数で、後にSHA3として採用される。スポンジ構造と呼ばれる構造を有しており、暗号化は `absorb (吸収)` と `squeeze (搾取)` という２つのフェーズによって行われるらしいが、詳しい仕組みはよく分かってない。

### SHA3 とは

SHA3(シャースリー)は **Standard Hash Algorithm 3** の略称で、 **SHAシリーズ** の3番目のハッシュ関数群という意味を持つ。

このSHAシリーズは **FIPS (Federal Information Processing Standards)** と呼ばれるアメリカの標準規格の中に定められており、これを発行しているのは　**NIST (National Institute of Standards Technology)** と呼ばれる機関である。

このうち、SHA3は`FIPS 202`で定義されており、その中にあるのが `SHA3-224` `SHA3-256` `SHA3-384` `SHA3-512` である。(また、これらに加えて `SHAKE128` `SHAKE256` もある)

ちなみに、SHA2は `FIPS 180-4` で標準化されている。

### ２つの関係

KeccakはSHA3として採用された。なので、 **Keccak = SHA3 かと思ってしまうが、実はそうではない。**

SHA-3 (FIPS 202) は Keccak を基にして決められた標準の実装群であり、オリジナルの実装からいくつか変更が加えられている。詳しいことは分からないが、そもそもKeccakはパラメータを可変させられるよう設計されているものであり、そのパラメータをいじったのだとか。（これに関しては、あるレベルのセキュリティを求めた上で応募をかけて決めたくせに、標準化の道中で変更するとは何事だと揉めたらしい）

なので、設計レベルで言うとどちらもKeccakということになるのかな？オリジナル実装をKeccakと呼び、SHA3実装はあくまでSHA3と呼ぶべきなんだろうか。割とややこしい。

ともかく結果としては、`Keccak-n (original)` と `SHA3-n (FIPS 202)` とでは出力されるデータが変わる。下記はそれぞれ　`""`　(空のメッセージ) をハッシュ化した結果。

`Keccak-n`

```
Keccak-224("")
0x f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd
Keccak-256("")
0x c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470
Keccak-384("")
0x 2c23146a63a29acf99e73b88f8c24eaa7dc60aa771780ccc006afbfa8fe2479b2dd2b21362337441ac12b515911957ff
Keccak-512("")
0x 0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e
```

[https://ja.wikipedia.org/wiki/SHA-3 より引用]

`SHA3-n`

```速度について
SHA3-224("")
0x 6b4e03423667dbb73b6e15454f0eb1abd4597f9a1b078e3f5b5a6bc7
SHA3-256("")
0x a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a
SHA3-384("")
0x 0c63a75b845e4f7d01107d852e4c2485c51a50aaaa94fc61995e71bbee983a2ac3713831264adb47fb6bd1e058d5f004
SHA3-512("")
0x a69f73cca23a9ac5c8b567dc185a756e97c982164fe25859e0d1dcc1475c80a615b2123af1f5f94c11e3e9402c3ac558f500199d95b6d3e301758586281dcd26
```

[https://ja.wikipedia.org/wiki/SHA-3 より引用]

### SHAKEs

FIPS-202には、SHA3-nの他に、 **SHAKE128** と **SHAKE256** が定められれている(SHA KEccak)。これらは出力を可変できるハッシュ関数で、それぞれ欲しい強度によって2つを使い分ける。

```
SHAKE256[32byte]("")
0x 46b9dd2b0ba88d13233b3feb743eeb243fcd52ea62b81b82b50c27646ed5762f
```

### おまけ : KangarooTwelve

SHAKE同様、出力を可変できるハッシュ関数。KangarooTwelveはKeccakベースで **SHA2-FIPS202 , SHAKE よりも高速に動く** ことを目指して作られたらしい。同じ出力メッセージ長、同じメッセージでも、出力結果はSHAKEsと違う。

```
KangarooTwelve[32byte]("")
0x 1ac2d450fc3b4205d19da7bfca1b37513c0803577ac7167f06fe2ce1f0ef39e5
```
### さいごに

地味にこういうことって誰も書いてくれないよね。

### 参考

[keccak team] https://keccak.team/

[wikipedia] https://ja.wikipedia.org/wiki/SHA-3

[FIPS-202] https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf

[オンライン暗号ツール] https://emn178.github.io/online-tools/

[KangarooTwelveの速度] https://keccak.team/2017/is_sha3_slow.html

[githubのissueより] https://github.com/status-im/nim-keccak-tiny/issues/1

[変更で揉めた件] https://www.schneier.com/blog/archives/2013/10/will_keccak_sha-3.html
分類アルゴリズムいろいろ　（２）

#はじめに
こんにちは、supercellです。復習のために分類アルゴリズムをまとめていきたいと思います。
#目次
1．カーネルSVM
2．決定木
3．ランダムフォレスト
4．k近傍法(KNN)
#1．カーネルSVM
カーネルSVMとは、線形分離不可能なデータを高次元空間へ射影して線形分離できるようにする手法です。
しかし、高次元空間へ射影するとき、かなりの計算量が必要となります。そのため、「カーネルトリック」を用います。

まず、カーネル関数を定義します。

```math
\kappa(x^{(i)},x^{(j)})=\phi(x^{(i)})^T\phi(x^{(j)})\tag{1}
```

最も使用されているカーネルの一つは、**動径基底関数カーネル**です。このカーネルはRBFカーネル、ガウスカーネルとも呼ばれます。

```math
\kappa(x^{(i)},x^{(j)})=\exp\Biggl(-\frac{||x^{(i)}-x^{(j)}||^2}{2\sigma^2}\Biggl)\tag{2}
```

この関数は、次のように簡略化されます。

```math
\kappa(x^{(i)},x^{(j)})=\exp\biggl(-\gamma||x^{(i)}-x^{(j)}||^2\biggl)\tag{3}
```

$\gamma=\frac{1}{2\sigma^2}$は、ハイパーパラメータです。
「カーネル」は、「類似性を表す関数」と解釈することができます。べき乗部分が0から無限大の値をとるため、カーネル関数の値は0から1までの値に収まります。

以上が、カーネルSVMの簡単な説明となります。

#2.決定木
決定木学習は、得られた結果の意味を解釈したい場合に有効なモデルです。
このモデルでは、一連の質問を学習して、クラスラベルを推測します。特徴量が実数値の場合は、しきい値を設定して、その値を超えるかどうかで推測することになります。
決定木のアルゴリズムでは、**情報利得**が最大となる特徴量でデータを分割します。情報利得は、分割された集合の要素についてのばらつきの減少を表します。
ばらつきの減少がなくなる（葉が純粋になる）まで、分岐条件（子ノード）を繰り返していきます。

情報利得を最大とするように分割するためには、最適化する目的関数を定義する必要があります。


```math
IG(D_p,f)=I(D_p)-\sum_j\frac{N_j}{N_p}I(D_j)\tag{4}
```

ここで、$f$は分割を行う特徴量であり、$D_p$は親のデータセット、$D_j$は$j$番目の子ノードのデータセットです。$I$は不純度を数値化したものであり、$N_p$は親ノードのサンプルの総数、$N_j$は$j$番目の子ノードのサンプルの個数です。このように、情報利得は親ノードの不純度と子ノードの不純度の合計の差にすぎません。つまり、子ノードの不純度が低いほど、情報利得は大きくなります。
ほとんどのライブラリでは、組み合わせ探索空間を減らすために、二つの子ノードに分割します。

二分決定木で使用される不純度の分割条件は、**ジニ不純度**、**エントロピー**、**分類誤差**の3つです。
まずは、エントロピーの定義です。

```math
I_H(t)=-\sum_i p(i|t)\log_{2}p(i|t)\tag{5}
```
$p(i|t)$は、あるノード$t$においてクラス$i$に属するサンプルの割合を表します。
そのため、エントロピーが最大となるのは、各クラスが一様に分布している場合となります。二値分類では、二つのクラスにそれぞれ属する確率が$0.5$であるとき、最大となります。

ジニ不純度は、誤分類の確率を最小化する条件であると解釈できます。

```math
I_G(t)=\sum_i p(i|t)(1-p(i|t))=1-\sum_i p(i|t)^2\tag{6}
```
エントロピーと同様、ジニ不純度が最大となるのは、クラスが一様に分布しているときです。

分類誤差は、決定木の深さを調整する際に用いられます。

```math
I_E(t)=1-\max{p(i|t)}\tag{7}
```

分類誤差は、エントロピーやジニ不純度にくらべて、決定木を深くさせるには向いていません。

以上が、決定木の説明となります。

#3.ランダムフォレスト

**ランダムフォレスト**は、複数の決定木を平均化して汎化性能を高めることができるモデルです。
このモデルでは、以下の手順で学習していきます。

1. トレーニングデータから$n$個のサンプルを選ぶ
2. $d$個の特徴量を非復元抽出して、決定木を成長させる。
3. 1、2の手順を$k$回繰り返す。
4. 手順ごとで、多数決でクラスラベルを割り当てる。

ランダムフォレストの利点として、調整するパラメータが少ないことが挙げられます。基本的には、手順を繰り返す$k$の値を調整するだけで済みます。このようなアンサンブルな学習では、個々の値のノイズに強いという特徴があります。そのため、決定木の深さを調整する必要がありません。

抽出する特徴量の個数$d$は最適化が可能です。
scikit-learnでは、デフォルトで$d=\sqrt{m}$と設定されています。ここで、$m$はトレーニングサンプルの特徴量の個数です。

以上がランダムフォレストの説明となります。

#4.k近傍法(KNN)

k近傍法は、今までのアルゴリズムと異なり、クラスを分類させる判別関数を学習しません。
代わりに、トレーニングデータを暗記します。
具体的には、以下の手順で学習します。

1. kの値と距離指標を選択する。
2. 分類したい点に最も近いサンプルをk個選択する。
3. 多数決によってクラスラベルを割り当てる。

このアルゴリズムの利点として、新しいトレーニングデータにすぐに順応することができます。しかし、サンプル数が増加するにつれて、計算量も増えてしまう欠点があります。

うまく学習させるには、、距離指標の選択と、データの標準化が重要となります。
距離指標は、多くの場合、ユークリッド距離が使用されます。

```math
d(x^{(i)},x^{(j)})=\sqrt[p]{\sum_k|x^{(i)}-x^{(j)}|^p}\tag{8}
```

$p=2$の時に、ユークリッド距離と呼ばれます。この距離では、データを標準化しておくことが重要となります。他にも様々な距離指標があるので、調べて見てください。

#おわりに
様々なアルゴリズムを見てきましたが、数学的な知識を必要とするものが出てきました。(例えば、SVM)この本に合わせて数学も勉強する必要がありますね。

#参考文献
[Python機械学習プログラミング](https://www.amazon.co.jp/Python-機械学習プログラミング-達人データサイエンティストによる理論と実践-impress-gear/dp/4295003379)
AtomでPHPに対してatom-beautifyを使う時にエラーが出たら

OSはWindows 10です。

大雑把に言うと、「ちゃんとパスを通そう、php-cs-fixerをダウンロードしよう」ということです。

#「Could not find 'php'. The program may not be installed.」と怒られた

私は、少し前にXAMPPをインストールしてPHPを勉強し始めた初心者です。
色んなエディターを試してみて、「Atom」が良いかな～、なんて思っていたのですが、自動でコードを整形してくれるプラグイン「atom-beautify」を使おうとすると、「Could not find 'php'. The program may not be installed.」と怒られました。
直接的な解決法が見つからなかったので、書き残しておきます。

#phpのフォルダにパスを通そう

エラー文から察するに、atom-beautify(もしくはAtom自体)にはPHPがインストールされていないように見えているようです。
XAMPP内のphpに上手くパスを通せば動くのかもしれませんが、いっそのこと普通にPHPをインストールしようと思いました。
(多分、XAMPPだとパスとか意識しなくても良くなっちゃうから、こういう問題が起こるんでしょうね)
インストール(と言ってもダウンロードして配置するだけですが)とパスを通す方法は、「[PHPのダウンロードとインストール | PHPインストールと初期設定](https://www.javadrive.jp/php/install/index1.html)」なんかが参考になると思います。

#今度は「Could not find 'php-cs-fixer'. The program may not be installed.」と怒られた

すると、今度は「Could not find 'php-cs-fixer'. The program may not be installed.」と怒られるようになってしまいました。
こちらは検索すれば解決したのですが、ちょっと(と言うか結構)戸惑ったので書き残しておきます。

#php-cs-fixerをダウンロードしよう

[こちら](https://github.com/FriendsOfPHP/PHP-CS-Fixer)の「Installation」の「Locally」から「php-cs-fixer.phar(もしくはphp-cs-fixer-v2.phar)」をダウンロードして、phpのフォルダに配置しましょう。

#php-cs-fixer.pharの絶対パスを入力しよう

Atomの「ファイル→環境設定→パッケージ→atom-beautify」にある設定画面で、php-cs-fixer.pharの絶対パス(例：C:\php\php-cs-fixer-v2.phar)を入力しましょう。

ただし、ここで注意点。
下の方にある「PHP(項目が沢山ある)」の中の「PHP-CS-Fixer PATH」に入力してしまうと、「The "PHP - PHP-CS-Fixer Path (cs_fixer_path)" configuration option has been deprecated. Please switch to using the option in section "Executables" (near the top) in subsection "PHP-CS-Fixer" labelled "Path" in Atom-Beautify package settings.」と怒られます。
上から2番目の「Executables」の中の「PHP-CS-Fixer(項目が1つしかない)」の中の「Binary/Script Path」に入力しましょう。
(開閉を表すアイコンが非常に分かり難いので気を付けてください・・・)

#はい、動きました

・・・私は動きました。
Sass(scss)の導入～

弊社のcssもとうとうscss化を行い（え？いまさら？ﾌﾟﾌﾟｯ:smirk:）、自動化も進みかなり効率よく作業ができるようになりました。

##導入準備

- Gulpのインストール
- ガイドラインの作成
- sass-lintの設定
- .csscomb.jsonの設定

Gulpのインストール系は、得意な方にやってもらって私はガイドラインやcss回りの設定を担当しました :relaxed:。

新規参入者用にコーディングのガイドラインをweb化していたので、そちらにSass、Gulpの導入マニュアルやガイドラインを追加。

##ガイドラインの作成

主に以下の項目でまとめました

1. ファイル構成
2. scss配下について
3. sass-lintについて
4. Sassコーディングの注意点

###1.ファイル構成
リポジトリ配下を説明。コンパイルされるcssと実際に作業するscss、HTMLを構成するモジュールのパーツ、画像を管理するフォルダ、コンパイルされる画像の場所、などをツリーにして表しました。

###2.scss配下について
実際に作業するscss内の構成も＠importとモジュール単位でのscss管理、それぞれの関係をツリーにして表しました。

###3.sass-lintについて
https://github.com/sasstools/sass-lint/tree/develop/docs/rules
を参考に翻訳しながら :weary: 設定＆自分用も兼ねてマニュアルを作成しました。（正直これが一番しんどかった :sob::sob::sob:）

###4. Sassコーディングの注意点
コーディング手法、作業の流れについての説明。
せっかくsassにするのだから、細かくモジュールに分けて管理しよう、と思ったものの、カテゴリに対してモジュール数が多く、cssはカテゴリ毎にまとめたかったので＠importでまとめる方法を採用。このあたりはGulpに詳しい方と相談して設計から考えました。


#sass化のメリット・ガイドラインの意図
sassを採用するにあたって、より構造的な考え方ができるので、無駄なcssを省いたり、html構造をより想像しやすくなると個人的には思っています。

- インデントを最小限にすることにより、無駄なcssや重複するcssが省ける。
- （また別記事にまとめますが）構造的な考え方をすることで文書構造を意識でき、HTMLも想像しやすい。
- プロパティやセレクタの順番を指定することで「大きなまとまりから小さなまとまり」になり、意図したものに自然と近づく。
- .csscomb.jsonを導入することで、プロパティの順番が自動で並び替えられ、統一されるので非常に楽。
- Gulpのプラグインでベンダープレフィックスの自動付与や画像の圧縮、cssのminify化が自動で行えるので効率的。


#.csscomb.json
http://csscomb.com/config
↑で簡単に設定ファイルが作れます。
インデントも自動で行ってくれるし、scssの整形ルールがある程度オリジナルで作成できるので、使い方によっては非常に便利。（combが悪だという噂もありますが、複雑な事をしなければまあまあ使えるかな、と）

最後に、チームでやっていく上でルールの継承や伝達・意思統一がなかなか難しいです。
どうしても多忙になってしまうと、細かな事がなおざりになってしまいます。
説明が下手くそなので「これ見てね！」ってポイッと渡せるガイドラインを充実させていきたいと思います :muscle::muscle::muscle: