OmniAICreator/Qiita-1.07M huggingface dataset:
Macのアップデートで失敗した時の対処方法

#Macのうるさいアップデート通知に負けてアップデートしたら失敗した

アップデート後Macを起動するとAppleマークが途中で止まり、「アップデートができませんでした」との文字が。

「ログを確認すると解決策が見つかるかもしれません」と言われてもこんな大量のエラーログ見てられるかよ...
とりあえず何回か再起動してもだめだったのでmacOSを再インストールすることにしました
(もちろん元のデータは消えません)

すごくあっさり治ったのでメモ。


#① macOSユーティリティを起動させる

電源を落としてから、　⌘Rと電源ボタンを押します(コマンドとRと電源ボタンを同時に押す)


#② macOSを再インストール

macOSユーティリティが起動したら、「macOSを再インストール」という項目をクリック。
 (私の場合、家のルーターと接続が切られていました。もしインターネットに繋がっていなかったら繋いでおきましょう)
そのまま流れで同意する項目に同意、Mac内蔵ディスクを選択し、再インストールします。

ちなみに再インストールに30分程かかりました。



#完了

再インストールが完了すると自動的にMacが起動します
初期設定を完了させれば完了です！

壁紙は初期のものになってしまってはいますが、その他のデータはそのままです。


#やっぱり安易にアップデートしたくない

ね。
PHPUnitでパラメタライズドテストをやってみる

## 概要
チームのメンバーがPHPUnitでのパラメタライズドテストを、都度読み出す形で書いていました。
PHPUnitの機能を使えば、もっと可読性を上げられると思ったので、自己学習も兼ねてやり方をまとめてみます。

## パラメタライズドテスト
パラメタライズドテストとは、 `渡す引数が違うだけで同じメソッドを何度もテストする`というテスト方法になります。
今回は下記のFizzBuzzを使って、説明していきます。

```php:FizzBuzz
declare(strict_types=1);

class FizzBuzz
{
    public function toFizzBuzz(int $count)
    {
        $result = '';
        if ($count % 3 == 0) {
            $result .= 'Fizz';
        }
        if ($count % 5 == 0) {
            $result .= 'Buzz';
        }
        if (!($count % 3 == 0)
            && !($count % 5 == 0)
        ) {
            $result .= $count;
        }
        return $result;
    }
}
```
このプログラムでテストコードを書く場合、 `$count`には複数のパラメータでテストを行うと思います。

* 3の倍数のとき
* 5の倍数のとき
* 3と5の倍数のとき
* それ以外の数字のとき

これを愚直に実装しようとすると

```php
class FizzbuzzTest extends TestCase
{
    /**
     * @test
     */
    public function toFizzBuzzTest()
    {
        $obj = new FizzBuzz();
        $res = $obj->toFizzBuzz(1);
        $this->assertEquals($res, 1);

        $res = $obj->toFizzBuzz(3);
        $this->assertEquals($res, 'Fizz');

        $res = $obj->toFizzBuzz(5);
        $this->assertEquals($res, 'Buzz');

        $res = $obj->toFizzBuzz(15);
        $this->assertEquals($res, 'FizzBuzz');
    }
}
```
こんな風に冗長的になってしまうかなと思います。
これをPHPUnitの機能を使って、可読性を上げてみます。
使うのは`@dataProvider`アノテーションです。
`@dataProvider`アノテーションを使うことで、下記のように配列でデータを渡すことが出来ます。

```php
class FizzbuzzTest extends TestCase
{
    public function toFizzBuzzDataProvider()
    {
        return [
            'number 1' => [1, 1],
            'number 3' => [3, 'Fizz'],
            'number 5' => [5, 'Buzz'],
            'number 15' => [15, 'FizzBuzz'],
        ];
    }

    /**
     * @test
     * @dataProvider toFizzBuzzDataProvider
     */
    public function toFizzBuzzTest($param, $actual)
    {
        $obj = new FizzBuzz();
        $res = $obj->toFizzBuzz($param);
        $this->assertEquals($res, $actual);
    }
}
```

こうして書いた方がパラメータが増えた時にテストが見やすくなるかなと思います。

### 備考
`@dataProvider`で渡す配列に名前をつけておくと、どこで失敗したかわかりやすいです。

<img width="276" alt="スクリーンショット 2018-04-04 15.27.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/39671/ae5b86a2-9a61-1f2f-3b30-2713067e0b77.png">

## 最後に
今回の例ですとそこまで便利には見えませんが、複数のパラメータを渡して、何千行とコードが膨れ上がる際には、特に有効なのかなと思います。

最後まで読んで頂きありがとうございました。

## 参考
https://phpunit.readthedocs.io/ja/latest/writing-tests-for-phpunit.html
NSUserDefaultsの変更通知を受信する

UserDefaultsに保存した値を取得しTableViewを更新しようと下記のようなコードを書きました。

```
- (void)viewDidLoad
{
    [super viewDidLoad];

    [[NSUserDefaults standardUserDefaults] addObserver:self
                                            forKeyPath:@"Key"
                                              options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld
                                               context:NULL];
}

- (void)dealloc {
    [[NSUserDefaults standardUserDefaults] removeObserver:self forKeyPath:@"Key"];
}

- (void)observeValueForKeyPath:(NSString *) keyPath ofObject:(id) object change:(NSDictionary *) change context:(void *) context
{
    if ([keyPath isEqualToString:@"Key"]) {
         //Do something
        [ self.tableView reloadData ];
    }
}

```

そしたら、UserDefaultsに変更をすると、2回通知が来てしまいました。しかも、なぜか初回はそもそもの通知が来ない。。Developer Forum等をみると、iOS9の頃にバグレポートがあり、すでに修正されたとあるのですが、ググってみると同じように同様の問題が発生するというのがありました。

とりあえず、今回は別の方法を使ってやってみようと思います。
jq で curl とかに渡す JSON パラメータをいい感じに組み立てる

`jq` なしでやろうとするとエスケープとか難しいので。

```sh
REQUEST_BODY=`jq \
  --null-input \
  --monochrome-output \
  --compact-output \
  --arg pull_request_body "Hey yo!" \
  '{title: "Title", head: "feature", base: "master", body: $pull_request_body}'`

curl https://api.example.com -d "${REQUEST_BODY}" -H "Content-type: application/json"
```
React16 jsx 最小構成のビルド環境 WebPack

# 関連記事

React16 最小構成のビルド環境 browserify babelify JSXあり - Qiita
https://qiita.com/standard-software/items/fa64563077118b631867

この記事の続きみたいなものです。

ビルドツールを Browserify から WebPack に変えました。

# 環境

環境は Windows10 です。 node.js インストール済みとします。
Mac でも同じだと思います。

# インストール

フォルダを作成して、そこをカレントディレクトリにしてコマンドを打ちましょう。

```
  npm init -y
  npm install --save react
  npm install --save react-dom
  npm install --save-dev babel-core
  npm install --save-dev babel-loader
  npm install --save-dev babel-preset-env
  npm install --save-dev babel-preset-react
  npm install --save-dev webpack
  npm install --save-dev webpack-cli
```

フォルダに、package.json が作られてその中身の一部はこのようになります。

```js
  "devDependencies": {
    "babel-core": "^6.26.0",
    "babel-loader": "^7.1.4",
    "babel-preset-env": "^1.6.1",
    "babel-preset-react": "^6.24.1",
    "webpack": "^4.4.1",
    "webpack-cli": "^2.0.13"
  },
  "dependencies": {
    "react": "^16.3.0",
    "react-dom": "^16.3.0"
  }
```

# ファイル

次の構成にします。作成されたフォルダの中に次のファイルがある状態にしてください。

```
  index.html
  .babelrc
  development.js
  webpack.config.js
  src フォルダ
    hello.jsx
  build フォルダ
    build.js
```

build.js は WebPack によって生成されます。

```index.html
<!DOCTYPE html>
<html>
  <head>
  </head>
  <body>
    <div id="app01"></div>
    <div id="app02"></div>
  <script src="./build/build.js"></script>
  </body>
</html>
```

```jsx:hello.jsx
const React = require('react');
const ReactDOM = require('react-dom');

class HelloWorld extends React.Component {
  render() {
    return <div>Hello World {this.props.name}</div>;
  }
}

const hwElement = <HelloWorld name="01" />;
ReactDOM.render(hwElement,
  document.getElementById('app01'));

const hwFactory = React.createFactory(HelloWorld);
 ReactDOM.render(
  hwFactory({name: '02'}),
  document.getElementById('app02')
);
```

Babel用の設定ファイルを用意します。

```json:.babelrc
{
  "presets": ["env", "react"],
}
```

WebPack用の設定ファイルを用意します。

```js:webpack.config.js
require('babel-core/register'); 
module.exports = require('./development');
```

```js:development.js
import path from 'path'

const src  = path.resolve(__dirname, 'src')
const dist = path.resolve(__dirname, 'build')

export default {
  entry: src + '/hello.jsx',

  output: {
    path: dist,
    filename: 'build.js'
  },

  module: {
    rules: [
      {
        test: /\.jsx$/,
        exclude: /node_modules/,
        loader: 'babel-loader'
      }
    ]
  },

  plugins: []
}
```

# 実行

ビルドコマンドは次のとおりです。決めたフォルダをカレントディレクトリにしてコマンド実行してください。
オプションなどを設定しなくても webpack.config.js をデフォルトで読み取ってそのとおりに動作します。


```
>.\node_modules\.bin\webpack
```

実行結果は次のとおりになります。

```html
<body>
    <div id="app01"><div data-reactroot="">Hello World 01</div></div>
    <div id="app02"><div data-reactroot="">Hello World 02</div></div>
```

これで、Babel を使って ES の最新と React の変換を行えます。

# GitHub
2018/04/08追記

少しソースコードをシンプルにして次の場所に配置しました。
https://github.com/standard-software/React_Hello-World_Sample
CDN版 Reactのみ / React+JSX
Browserify版 Reactのみ / React+JSX Reactify / React+JSX Babelify
WebPack版 Reactのみ / React+JSX
これらが全て含まれています。
WSLでgem install mysql2が出来ないときの対処

`bundle install`すると `gem install mysql2`を行えとエラーが出たため、実行するとこれまたエラー
Ubuntuでも同じ症状出る模様です。
死ぬほどハマったので共有

## よく出てくる解決法
`sudo apt-get install libmysqld-dev`
`sudo apt-get install ruby-dev`
ググるとこの解決策はよく出てくる様子。
しかし、私の場合はこれではダメでした・・・

## それでもダメな場合
上記の解決策ではダメだったので、英語も含めてググりまくると以下が出てきました
https://stackoverflow.com/questions/37240720/how-to-install-mysql2-on-ubuntu-16-04-error-error-installing-mysql2-error-f
`sudo apt-get install libnetcdf-dev libssl-dev libcrypto++-dev libgmp-dev`
これで何とか解決！
めっちゃ時間かかった・・・
Visual Studio 2017 オフラインインストールファイル作成コマンド

#概要
オフラインインストールファイルを指定無しで作成すると約４０ＧＢほどになります。
なので、狙った機能のみを対象にしましょう。
**この記事ではインストールファイルを作るコマンドだけに焦点を当てています。**
ダウンローダの入手やインストールファイル作成後の作業は他の有志者の記事を参照願います。

『Visual Studio 2017』をオフラインでインストールする方法 - Qiita : https://qiita.com/takamon9/items/b3effb7701bb304c0a68
VisualStudio2017のオフラインインストール - Qiita : https://qiita.com/cactanaka/items/360df46a18cca7895ae4

#コマンド作成

<img src="https://qiita-image-store.s3.amazonaws.com/0/35095/bf847af9-ffbc-67ec-4e7a-f807eb36c050.png" width=75%>

１．対象のエディションに合わせてURLに遷移
[Visual Studio Enterprise 2017](https://docs.microsoft.com/ja-jp/visualstudio/install/workload-component-id-vs-enterprise)
[Visual Studio Professional 2017](https://docs.microsoft.com/ja-jp/visualstudio/install/workload-component-id-vs-professional)
[Visual Studio Community 2017](https://docs.microsoft.com/ja-jp/visualstudio/install/workload-component-id-vs-community)

２．赤枠からインストールしたい機能を選択

３．ワークロードIDをメモ
選択した機能の青枠に書いてあるIDをメモしてください。
なお、依存関係の種類が必須のコンポーネントはデフォで全てインストールされます。

４．（必要であれば）コンポーネントIDをメモ
紫枠の様に「依存関係の種類が推奨/Optional」の機能（コンポーネント）が必要ならそのIDもメモしてください。

５．他に必要な機能がある場合は２～４を繰り返す

６．コマンド作成
[ダウンローダファイルパス] --layout [保存先フォルダ] --add [ワークロードID/コンポーネントID]

(図の場合）
vs_community.exe --layout c:\vs2017 -add Microsoft.VisualStudio.Workload.NativeCrossPlat -add Component.Linux.CMake

(図の場合 + .NET デスクトップ開発の場合)
vs_community.exe --layout c:\vs2017 -add Microsoft.VisualStudio.Workload.NativeCrossPlat -add Component.Linux.CMake -add Microsoft.VisualStudio.Workload.ManagedDesktop

以降は他の有志者の記事を参照願います。
mackerel-plugin-accesslogで２つ以上のログファイルを対象に監視を行いたい時のconfの書き方

# Mackerelとは

https://mackerel.io/ja/

> Mackerel（マカレル）は、運用中のクラウドもしくはオンプレミスのサーバにエージェントを1つ入れるだけで、簡単にサーバ管理を始められます。監視サーバ自身の構築・運用は不要です。さらに負荷のリソース状況などの数値をグラフに可視化します。障害発生時にはアラートが記録され、様々なツールに通知できます。システム運用保守に最適な監視サービスです。

昔Zabbixの運用経験もあったので、色々念入りに細かく設定できるミドルウェアの良さもあったのですが、少人数で運用する際の機能としては十分なほど揃っているというところと、費用面でだいぶ割安なイメージがあったので、Mackerelの導入を決めました。

AWSのCloudWatchの運用も考えましたが、自分たちのサービス独自のメトリクスの監視やアラートに対応しているところも、Mackerelの推しポイントです。

Blogもめっちゃ更新されてるので是非チェックしてみてください。
https://mackerel.io/ja/blog/

# Mackerelプラグイン（mackerel-agent-plugins）について

基本的にMackerelのエージェントを入れると、サーバのメトリクス（CPUやMemory）は自動的に監視ができるようになるのですが、サーバーにインストールしている様々なミドルウェアや、アプリケーション独自のログ監視などをするために、公式のプラグインが提供されています。それが `mackerel-agent-plugins` です。

https://mackerel.io/ja/docs/entry/howto/mackerel-agent-plugins

下記のGithubレポジトリを見るとわかるんですが、「どんだけあんねん！！！！」と突っ込みたくなるほどの品揃え。これだけあれば、大抵のニーズには応えられるのではないかと思いつつ、しかもソースが公開されてるので自前でなんでも書こうと思えば書けてしまう気前のよさ。

好きだなーMackerel。

# mackerel-plugin-accesslogについて

上記で紹介したプラグインの一つである、 `mackerel-plugin-accesslog` というのがあるんですが、ApacheやNginxのアクセスログを解釈して、リクエスト数やステータスコードのカウント、レイテンシーなどのメトリクスを監視できるようになります。

詳しくは、こちらをご覧くださいませ。
https://mackerel.io/ja/blog/entry/advent-calendar2017/day9-mackerel-plugin-accesslog

# 困ったこと

で、ですよ、

仕様をよく確認すると、LTSVフォーマットのログであれば、このプラグインが解釈してくれるという開発者の想いのこもった拡張があるわけです。

つまり、

「Apacheのアクセスログと別にあるアプリケーションのログも一緒にこのプラグインで監視したい」

っていうことも可能なのです。

さて、mackerel-plugin-accesslogで２つ以上のログファイルを対象に監視を行いたい時のconfの書き方はどう書けばいいのでしょうか？

例１）２回書く

```
  [plugin.metrics.accesslog]
  command = "mackerel-plugin-accesslog /var/log/a.log"

  [plugin.metrics.accesslog]
  command = "mackerel-plugin-accesslog /var/log/b.log"
```

例２）引数を増やす

```
  [plugin.metrics.accesslog]
  command = "mackerel-plugin-accesslog /var/log/a.log /var/log/b.log"
```

こんな想像をしていたのですが、どちらも違いました。

# 解決方法

以下のように `metric-key-prefix` オプションを指定する。

（参考：https://github.com/mackerelio/mackerel-agent-plugins/blob/master/mackerel-plugin-accesslog/lib/accesslog.go#L185 ）

```
[plugin.metrics.accesslog_a]
command = "mackerel-plugin-accesslog /var/log/a.log --metric-key-prefix accesslog_a"

[plugin.metrics.accesslog_b]
command = "mackerel-plugin-accesslog /var/log/b.log --metric-key-prefix accesslog_b"
```

mackerel-agent.confは[TOML](https://github.com/toml-lang/toml)形式で書かれているので、 `[plugin.metrics.accesslog_a]` と `[plugin.metrics.accesslog_b]` のように、設定名は別々のユニークな名前にしておくのもポイントです。

Mackerelはソースコードも公開されてるので、ちゃんと読んで理解しておけば、公式マニュアルに載ってないようなオプションも使ってみることができるのもいいところだなあと思いました。
Azure Active Directory B2Cでマルチテナントサンプルを動かしてみた(2)

# TL;DR

[Azure Active Directory B2Cでマルチテナントサンプルを動かしてみた(1)](https://qiita.com/hydrangeas/items/becb6b1986ff1823a167) 続き。

まだまだ設定が残っているので少しずつ書き換える。

# Reset Password

サインインをしようとして、おもむろに **Forgot your password?** をクリックすると、404エラーになります。demoサイトではTOPに遷移するだけなので、とりま付け足した機能なのかもしれません。

```
'/' アプリケーションでサーバー エラーが発生しました。
リソースが見つかりませんでした。
説明: HTTP 404. 探しているリソース (または、その依存関係の 1 つ) が削除されたか、名前が変更されたか、また一時的に使用できません。以下の URL のスペルが正しいことを確認してください。 

要求された URL: /Account/ResetPassword

バージョン情報: Microsoft .NET Framework バージョン:4.0.30319; ASP.NET バージョン:4.7.2633.0
```

**Startup.Auth.cs** では認証失敗時に **AuthenticationFailed** メソッドへ遷移するよう設定されていますが、リダイレクトURLが **/Account/ResetPassword** になっているのが原因です。（きっと**/Home/Error?message=** の部分もエラーになるような気がします・・）

```csharp:Startup.Auth.cs
        // Used for avoiding yellow-screen-of-death
        private Task AuthenticationFailed(AuthenticationFailedNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> notification)
        {
            notification.HandleResponse();

            // Handle the error code that Azure AD B2C throws when trying to reset a password from the login page 
            // because password reset is not supported by a "sign-up or sign-in policy"
            if (notification.ProtocolMessage.ErrorDescription != null && notification.ProtocolMessage.ErrorDescription.Contains("AADB2C90118"))
            {
                // If the user clicked the reset password link, redirect to the reset password route
                notification.Response.Redirect("/Account/ResetPassword");
            }
            else if (notification.Exception.Message == "access_denied")
            {
                notification.Response.Redirect("/");
            }
            else
            {
                notification.Response.Redirect("/Home/Error?message=" + notification.Exception.Message);
            }
            return Task.FromResult(0);
        }
```


で、なぜこれがダメなのかというと、**RouteConfig.cs** に以下のような実装がされていることに依ります。

```csharp:RouteConfig.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;

namespace B2CMultiTenant
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{ttype}/{controller}/{action}/{id}",
                defaults: new { ttype = "b2c", controller = "Home", action = "Index", id = UrlParameter.Optional }
            );
        }
    }
}
```

**b2c/Account/ResetPassword** じゃないとダメ、と・・。

```csharp
                notification.Response.Redirect("b2c/Account/ResetPassword");
```

お。上手く**ResetPassword()** も通過して上手くいったようですね！

# 雑感

URLのハードコーティングは好きじゃないので、なんとかしたいところですね。

で、リダイレクトされるとmicrosoftonline.comになっちゃって、アカウントの回復どころじゃない・・ってなるんですが、これについてはまた書きます。

たぶん、**Web.config** で`aad:ClientId`とか`aad:ClientSecret`とかを設定してないからではないかな？と邪推してます。が、疲れたのでごめんなさい。


以上。
[ストレージ]3PARコマンド読み方「showqos編」

■概念：
QoS（Quality of Service）とは：サービス品質のことです。
ストレージのQoSとは：複数のサーバで共有されるストレージの性能を維持するための技術です。

■環境：3PAR、OS：Release version 3.2.2 (MU4)

■下記showqosコマンド結果：

```
3PAR-hostname cli% showqos
                                       -I/O_per_second- -KBytes_per_sec-            
Id Type  Name             QoS Priority     Min      Max     Min      Max LatencyGoal
 6 vvset VVSet_XXX-XX-XX  on  normal      3000     8000   20000    60000       15.00
12 vvset VVSet_XXX-XX-XXX on  normal     20000   400000  100000  3000000        1.00
11 vvset VVSet_XXX-XX-XXX on  normal      3000     8000   20000    60000       15.00
------------------------------------------------------------------------------------
 3 total  
```
■説明：

 - Id：QoSルールのId番号。QoSルール作成時、順次付与された番号。
 - Type：QoSルールのタイプ。vvset、domain、all_others、3種類ある。
 - Name：QoSルールの名前
 - QoS：ステータス、onとoffがある。
 - Priority：優先度
 - I/O_per_second（Min-Max）：IOPSのMinとMax、1秒I/Oリクエスト数の意味
 - KBytes_per_sec（Min-Max）：スループットのMinとMax、1秒何KBytesのI/Oの意味
 - LatencyGoal：レイテンシの目標、単位はMillisecond

■動きの説明

- Type：3PARのvvset単位でQoSルール作るか、domain単位で作るか。all_othersは定義されているQoSルール以外のtarget（vvsetやdomainの総称）を規制する。
defaultではall_othersがないため、QoSルール以外のtargetのI/Oが無制限となる。
- QoS：onの場合、QoSルールが有効。offの場合QoSルールが無効。
- Max：QoSルールにあるtargetはMaxまでのIOPSとスループットが出来る。
- Min-Max＋Priority＋LatencyGoal：複数のtargetがあり、皆MaxまでI/Oできる。
あるtargetのservice time(latency)はLatencyGoal以下になると、Priority低いtargetのMaxが段々下がる。下げる下限はMinです。


■補足：statqosコマンドは時間間隔でQoSのステータスを確認できます。
　Svt msはservice time(latency)。I/O発生時、Svt msはGoalに超過すると、Qt(QoSのMax)が下がる。

```

3PAR-hostname cli% statqos
   23:00:33 04/03/2018 r/w     I/O per second      KBytes per sec          Svt ms    Wtt ms IOSz KB               
 Type             Name         Qt Cur Avg Max      Qt Cur Avg Max  Goal  Cur  Avg  Cur  Avg Cur Avg Rej Qlen WQlen
vvset  VVSet_XXX-XX-xx   t   8000   4   4   4   60000  17  17  17 15.00 0.16 0.16 0.00 0.00 3.7 3.7   0    0     0
vvset VVSet_XXX-XX-XXX   t 400000   0   0   0 3000000   0   0   0  1.00 0.00 0.00 0.00 0.00 0.0 0.0   0    0     0
vvset VVSet_XXX-XX-XXX   t   8000   4   4   4   60000  21  21  21 15.00 0.15 0.15 0.00 0.00 4.7 4.7   0    0     0
Press the enter key to stop...


```
保育園のバザーに向けてペットボトルでスマートガーデニングシステムを作る

#1,はじめに
　今年度、私の娘が保育園に入園することになりました。娘の保育園では行事にバザーというものがあり、１１月なのですがちょっと気合を入れて盛り上げたいと思い、１００均で売ってるちょっと珍しい花の種を育ててバザーで売りさばこうと計画しています。そこで、せっかくなら光・温度・水やりをスマート化するシステムをDIYしてしまおうというわけで、Qiitaにも記事で残すこととしました。
#2,構成
##2-1,回路
　このシステムのコアとなる制御回路はArduinoを中心に構成します。その他、温度センサ、発熱系機構、水やり機構、発光機構、UIを接続し、とりあえずネットにつながず動作するものとして考えました。また、とりあえず水やりは自動化せず、ユーザー(私)がポチッと押したらその分水が出るような機構としてみました。システムブロックは以下です。
![スマートガーデンシステムブロック.jpg](https://qiita-image-store.s3.amazonaws.com/0/117189/8f1b5d4d-2732-2e08-af54-91e3492d49f9.jpeg)

##2-2,ペットボトル
　このシステムのボディはペットボトルをそのまま流用します。２Ｌのお茶のペットボトルなんかを使い、その中にプランターを入れて温室にするイメージです（下の図を参照）。これだけでも温室になるわけですがさらに光と温度と水を制御する機構を組み込みます。
![ボトル加工.jpg](https://qiita-image-store.s3.amazonaws.com/0/117189/0fb73698-85c4-358d-1ce3-5e4f02666955.jpeg)

#3,材料
**1. Arduino**
　Arduino UNOを使います。後述のTFTディスプレイを載せるのでIOが足りなくなりそうですがMegaに切り替えたりはしません。UNOの限られたハードのみで何とかしようと思います。

**2. ディスプレイ**
　[Elgoo TFTタッチスクリーン](https://www.amazon.co.jp/gp/product/B06Y5ZXXL8/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1)というものをAmazonで見つけたのでこれを使ってUIも実装してしまいます。物理スイッチでポチッとやってもよかったのですが、タッチペンでポチッとやるの今風なやつに憧れてます。ちなみにIOはディジタルは2～9, アナログはA1～A4まで全部使ってしまいます。A4はI2Cにも使うピンなのですが、A4に入るべきピンをジャンパしてArduinoのRESETに入れれば両立できます。

**3. 温湿度センサ**
 [Bosch社のBME280](https://strawberry-linux.com/catalog/items?code=12280)を使います。温湿度だけでなく気圧も計測できます。I2Cで制御します。

**4. ウォーターポンプ**
　水やり機構として[ウォーターポンプ](https://www.amazon.co.jp/gp/product/B01ARKAKI4/ref=oh_aui_detailpage_o01_s00?ie=UTF8&psc=1)を使います。サイズの合うチューブも一緒にAmazonで注文してしまいます。ちなみにDCモーターなのでArduinoからの信号で制御する際はパワーMOS FETでモータードライブ回路を構成します。私は手持ちのNch FETと抵抗とダイオードで簡単に構成しました。Arduinoに入力する電源(9V)をスイッチングするだけです。定格は12Vですが9Vで十分です。（以下、回路図）
![ドライブ.jpg](https://qiita-image-store.s3.amazonaws.com/0/117189/7ecc4e7d-d31d-4203-323c-a1fb3399c918.jpeg)

**5. その他**
　その他でまとめてしまいますが、発光機能についてはフルカラーLEDを使用しました。これによって少ないIOが圧迫されますがこだわりみたいなもんです。また、発熱機構はセメント抵抗とMicrochip社のサーミスタとパワーMOS FETを組み合わせてスタンドアロンで温度調節してくれるような機構としました。よって、発熱機構については今回はArduinoから制御しないことになります。

#4,ソースコード
　ソースコードはまぁいろんなところからコピペしまくりで構成しました。基本的にはタッチスクリーンに付属したソースコードをベースにスクリーンの右端にカラーボタンを配置して左側に温湿度と気圧を表示のような感じです。
[こちら](https://github.com/aizulabHata/smartGardenSystem/tree/patch-1)に載せました。

#5,完成画像
![DSC_1712.JPG](https://qiita-image-store.s3.amazonaws.com/0/117189/0bbe9549-f2e5-6ab0-5613-919e50ac1965.jpeg)
![DSC_1715.JPG](https://qiita-image-store.s3.amazonaws.com/0/117189/a5411eed-6787-0e9d-adf2-57b48a65d551.jpeg)
この何とも言えぬ手作り感。
次回は、フルカラーLEDをパワーLEDに替え、温度調整をArduinoから制御するようにしようか検討してます。また、シリアル通信ポートが空いているのでWi-Fiを利用したIoT化も検討しています。
新卒 研修１日目 HTML基礎


#新卒未経験に毛根が出来るまで 

こんにちは。こんばんは。
初投稿なので簡単に自己紹介します。

新卒で、福岡は天神のWebサービス・システム開発会社に入りました。
大学院では半導体の評価技術開発の研究をしていましたので、IT知識は授業で習った程度です。

Qiitaは主に備忘録として使うつもりですが、新卒未経験に毛が生えていく過程を晒すことで、ITに興味のある人の背中を少しでも押せるのではと思ったのでなるだけ発信していこうと思います。

ちなみに、文章中の表現は大いに間違っている可能性があります。
ご注意願います。
精進していきますのでご容赦くださいませ。。

-----------------------------------------------------------------
2018年4月5日追記
viewが予想外に増えていたので、twitterで記事エゴサしてみました。それで気づいたのですが、Qiitaって「**プログラミングに関する知識を記録・共有するためのサービス**」なんですね。ガイドラインにも書いてありました。ってことで、本記事のような内容だとブログの方が適切だと確認しましたので、[ブログ](https://kawano-fusic.hatenablog.com/)開設しましたー。
技術的に役立てることを書けるよう頑張っていきまーす。
-----------------------------------------------------------------

##本日の取り組み

###PCセットアップ等

PC(MacbookPro 13inch)を支給頂きましたー。本当に嬉しいです、ありがとうございます。頑張っていきます。
必要なアプリなどを入れていきます。

**atom** ：テキストエディタ
**VirtualBox**：仮想化ソフト
**iTerm**：ターミナル（標準のよりも機能が豊富らしい）
**CotEditor**：テキストエディタ
**xcode**：アプリ開発ツール

あとはウイルス対策ソフトとOfficeを入れました。

###[ドットインストール HTML入門](https://dotinstall.com/lessons/basic_html_v3)

今日午後、全２４回をひと通り取り組みました。
HTMLの基本的な記述方法が分かります。
動画と同じコードをatomに書き、ブラウザで動作を確認しました。
一度ここで「こういうものがあるのか」と分かっておけば、コードの書き方を忘れてもググればいいのです。
最初から覚えることはきっとできないでしょうから、最初の段階で必要なのは
-**コードを書くことに慣れる**
-**どのような技術があるのかを知る**
ことだと思います。

###作った.phpファイルをブラウザ(Chrome)で読み込む
サーバーに、ドットインストールで作成した.phpを置く。
なお、ドットインストールでは .html で作っていますが、僕は今後phpを主に取り組んでいくので.phpで作りました。

iTermを開き、マウントを行います。
マウントとは、
>コンピューターに接続した周辺機器や外部記憶装置等をオペレーティングシステム（OS）に認識させ、利用可能な状態にすることを指します。 ... 逆に、接続装置などをOSから切り離して取り外しが可能な状態にすることや、ラックからサーバー機器等を取り外すことを「アンマウント（unmount）」と呼びます。
※出典：https://www.idcf.jp/words/mount.html

手元でサーバー上にあるファイルを扱えるようにする、っていう感じだと思います。
コマンドは
`sshfs root@100.100.100.100:/var/www/html/kawano kawano`
`100.100.100.100`は任意のIPアドレスです。
ローカルの /kawano にマウントを行います。

アンマウント時は
`umount -f kawano`
でok



間違いが多く含まれていると思いますが、
初心者がどのように取り組み始めたか、これを参考にして頂ければ幸いです。

それではまた。
Swift4 PickerView doneボタン　エラー

プログラミング 初心者です
swiftにて,xcode内でPickerViewのコーディング作業中ですがエラーが出ます
pickerviewのdoneボタンの設定でエラーとなります
youtubeの古い動画を参考にしてやっているのが原因かと思います
原因のわかる方がいればご教授お願いします




func create_toolbar()
    {
        let toolbar = UIToolbar()
        toolbar.barStyle = .default
        toolbar.sizeToFit()
        
        let doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector("doneClick"))  ←ここでエラー！
        let spaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
        let cancelButton = UIBarButtonItem(title: "cancel", style: .plain, target: self, action: #selector("cancelClick")) ←ここでエラー！
        toolbar.setItems([doneButton , spaceButton , cancelButton], animated: false)
        
        text_field_daieria.inputAccessoryView = toolbar
        text_field_chueria.inputAccessoryView = toolbar
        
    }
    
    func doneClick()
    {
        //doneClick
        active_textfield.resignFirstResponder()
    }
    func cancelClick()
    {
        //cancelClick
        active_textfield.text = ""
        active_textfield.resignFirstResponder()
    }

}
2018-04-03 Tokyo GAS on GCPUG 2018 Spring

# What's new in Apps Script by サントリー
## Who
大橋さん
Google Developer Expert
→ Googleさんから公認の人〜。

## What's
4年分の新しくなったこと喋るぞー。  

## 追加さんたち
- 2015年
  - HTMLサービスにIFRAMEモード追加  
  - Add-onsの追加  
    SSのアドオン機能ですね〜。  
  - Execution API追加  
- 2016年
  - Android Add on  
  - Console.Logの追加  
    GCPに出せる→これ使ってみたいぞ。  
    トリガーものでもconsole.logで吐けばOKらしい・・・まじでか???  
  - SSで名前付き範囲の定義できるようになった  
- 2017年  
  - Google Slede/sheets向けのAdvanced Serviceが追加  
  - GASを使う時にGoogleに対して認証が必要になった(一部)  
    危険だからダメだぞってアレ!  
    **GsuitのアカウントでScriptで作成 + 別アカウントに対してアプリ提供 + Google承認なし**  
    のときに発生する。  
  - Stackdrive Error Reportingサポート  
    どこで、どんなエラーが出ているのか終えるようになってきた  
  - manifest, deploymentが追加  
    JSONファイルで、Scoprやライブラリ、認証情報、デプロイした場合の設定を指定できる。  
- 2018年  
  - CalendarのEvent CreateをTriggerにできるようになった  
  - Dashboadの登場で管理・監視しやすくなった  
 
## まとめ
- 2015年  
  割りと辛い年  
  API廃止が多くてで自分で実装する部分が増えた頃  
  UiAppの削除   
  一般の人が使う新しい機能追加が少ない  
  →でも、今振り返ると必要な機能が追加された年でした  
- 2016年  
  何もなかった年・・・。  
  目立った機能の追加がなかった。  
  ただ、ホントは準備の年だった  
- 2017年  
  急に増えすぎじゃね?ww  
  2015, 16年は不良債権返済的な年だった模様。  
  お金を詰めばGASで解決できることが増える→6分制限とか  
- 2018年  
  Googleの重要な機能を操るためのGASという路線もでき始める  

## 資料  
[Google Slides](https://docs.google.com/presentation/d/14D5gGWTfkh7atuZyulgAGs9VKiDrB5yA5hp1dM1ddEg/edit)

# DataStudio Community Connectors  
Ianさん
Googleの中の人

## DataStudio  
簡単なDashboardだよ
元々GAとかを可視化するものだけど、汎用的に使えますよ〜。  

## Community Connectors  
Google Apps Scriptでデータソースをつくるお。  
感覚としては、GASででTreasure Dataにデータ投げるのとかなり似ている。  
もうちょっと丁寧に、Schemeとか設定してあげなきゃいけないっぽい。  

## サンプル  
Ianさん作成の、 Google Fitを用いだサンプル。
[githubレポ](https://github.com/google/datastudio/tree/master/community-connectors/google-fit)

## 参考  
[参考URL](https://www.impression.co.uk/blog/8178/build-google-data-studio-community-connector/)

# 社内雑務の自動化をやってみた  
## Who  
新井さん @satsukiasa
株式会社マナボ
iOSエンジニア

## なにやっとる?  
宿題わかんないよー → 助けて〜大学生!!
の宿題わかんないくんたちの登録がめんどくさい。

### なぜ?
登録方法
- Google Forms

### なにがめんどい?
間違いデータの登録を削除しなければ・・・。

### じゃぁ、どうするよ
1. 新規登録時の重複削除  
2. 今までの分の名寄せ  

### キー
名前 x 住所の複合ユニーク

### 1. 新規登録時の重複削除
トリガーをフォーム送信にして、シートのデータを全権引っ張ってきてぐるぐるさせる。

### 2. 今までの分の名寄せ
リナックスコマンドで手抜きしました。
→こういうの知ってたら、私も楽に慣れたのになぁ。

# GAS開発環境向上委員会  
## Who  
児玉さん
本業: 組み込み

ボランティアでやってるのがあるのだ。
[わたしのフクシ](http://watashinofukushi.com/)

## What  
メールの中にフォームを埋め込んだり
シート上の計算をやらせたり

## 便利で楽しいけど、運用には厳しい  
テスト環境構築とか
継続運用改善とか
を考えると。

## で、どうしてる。  
GASを、ローカル上でNode.jsっぽく開発する一連の手法を取っている。

# GASやったことない人がやるべきこと10選  
グロービスの方
[Qiita](https://qiita.com/tanabee/items/2c51681396fe12b6a0e4)

# GASを使えばマネージャーは死なない  
[コイケヤさんのQiita](https://qiita.com/co-ikeya)

# フォームとGASで簡易ワークフローを作ってみた by gasakamaki
Kei Sakamakiさん
[Qiita](https://qiita.com/gasakamaki)
[フォームとGASで簡易ワークフローを作ってみた](https://qiita.com/gasakamaki/items/5303f935742daa9234c0)

# 質疑・Tips  
## 演習しよう
[Google codelabs](https://codelabs.developers.google.com/codelabs/clasp/index.html?index=..%2F..%2Findex#0)  

## 管理画面を使おう
[script.google](https://script.google.com/u/1/home)

# 備考
資料はconnpassにあがっていくはず。期待。
https://gcpug-tokyo.connpass.com/event/81041/

あと、[tanabeさんのイベレポ](https://qiita.com/tanabee/items/d478276e281045e37076)が最強。。。
関数名の目的語を省略した場合

動詞には be動詞 と 一般動詞 があり、一般動詞には 自動詞 と 他動詞 があります。
他動詞には目的語が必要です。
「○○を」に相当するのが目的語です。

英語で関数名を考えるとき、目的語に相当するものがあれば他動詞にするのが一般的だと思います。
目的語は引数になることもあるし、関数名に含まれることもあります。

```c++
// ファイルを開く
fileManager.open( file );

// キーワードを見つける
string.find( keyword );

// インジケーターを表示させる
view.showIndicator();

// 全プロセスを殺す
system.killAllProcesses();
```

しかし、他動詞を使いながら目的語を省略する場合もあります。
以下の関数名はどちらも目的語がありませんが、個人的には特に違和感がありません。

```c++
// ファイルを削除する
file.remove();

// ファイルリスト画面を更新する
fileListView.update();
```


## 世界の例

例えば、Swift の ```UIViewController``` には [isEditing](https://developer.apple.com/documentation/uikit/uiviewcontroller/1621498-isediting) というプロパティーがありますが、目的語がありません。

同様に、Qt の ```QFile``` には [remove](http://doc.qt.io/qt-5/qfile.html#remove) という関数がありますが、引数(目的語)はありません。

Android の ```File``` にある [delete](https://developer.android.com/reference/java/io/File.html#delete())、```Process``` にある [destroy](https://developer.android.com/reference/java/lang/Process.html#destroy()) も同様です。

edit、remove、delete、destroy は全て他動詞です(たぶん)。
つまり目的語がなければ、英語として成り立ちません(たぶん)。

```UIViewController``` の ```isEditing``` は、[編集]ボタンをONにして、画面を編集モードにすると true になるフラグです。
つまり、編集しているのは画面(```UIViewController```)です。
```remove``` や ```delete``` の対象が ```File``` なのも、```destroy``` の対象が ```Process``` なのも明白です。
目的語が省略されると、目的語は自分自身になっているようです。


## 推測

関数名には
「目的語が自分自身になる場合、他動詞でも目的語を省略できる」
というルールが適用できるのではないかと思っています。

上記の例は暗黙的に以下のように解釈されるのではないでしょうか。

```c++
// ファイルを削除する
file.removeItself();

// ファイルリスト画面を更新する
fileListView.updateItself();
```

と個人的には思っているのですが、このルールがどこかに書かれているわけではないので、推測の域を出ていません。


## 2018/04/07 追記

コメントでご指摘いただきましたが、C++の非静的メンバー関数には ```this``` が隠し引数として渡されます。
つまり上記の例は以下のように解釈できると思います。

```c++
// ファイルを削除する
file.remove( &file );

// ファイルリスト画面を更新する
fileListView.update( &fileListView );
```
cocos2d-xをVisual Studio 2017でビルドする

### 環境

- Windows10 (Fall Creators Update)
- cocos2d-x 3.16
- Visual Studio 2017

### 経緯

[この間](https://qiita.com/FrozenVoice/items/0645ab5dc1edf46fdadf) Andorid向けのcocos2d-x環境を作ったけど、色々と試すのにエミュレータ or 実機に都度デプロイするのがちょっと面倒。

クロスプラットフォームな点を活かして、Win32アプリとして実行した方が試行錯誤するには良いかな?と考えた。

後は、C++を扱うならAndroid StudioよりもVisual Studioの方がなんとなく良さそうに思えた。

### ビルドまでの手順

- Visual Studio 2017で \proj.win32\xxxx.slnを開く
- 起動時に「プロジェクトの再ターゲット」のダイアログが出るのでそのままOKボタン押下
- 「ソリューションエクスプローラー」のツリーで下記2つのプロジェクトを右クリックして「プロジェクトの再ターゲット」を選択してOKボタン押下
  - libbox2d
  - librecast
- ビルドして実行
- 起動時に MSVCR110.dllが無いとのメッセージが出る場合は下記より再頒布可能パッケージをDLしてインストール
  - https://www.microsoft.com/en-au/download/details.aspx?id=30679

### ウィンドウサイズ変更

そのままだとウィンドウサイズとしてdesignResolutionSizeが適用されて480x320と小さめになってしまう。
下記のようにsetFrameSize()の指定を追加してウィンドウサイズを大きくした。

AppDelegate.cpp

```c++
bool AppDelegate::applicationDidFinishLaunching() {
    …中略…

#if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32) || (CC_TARGET_PLATFORM == CC_PLATFORM_MAC) || (CC_TARGET_PLATFORM == CC_PLATFORM_LINUX)
        glview = GLViewImpl::createWithRect("xxxx", cocos2d::Rect(0, 0, designResolutionSize.width, designResolutionSize.height));
		glview->setFrameSize(1280, 720);
#else

    …以下略…
```
LVMでdumpを取ってみる

#Introduction
こんにちは、はにおかさいです。
LVMでバックアップする方法を探していましたので、まとめました。
ただ、致命的なことにリストア方法がわからない、、、。

#Backup Script

```shell-session
#!/bin/sh
GROUPNAME=グループ名
TARGETVOLUME=ターゲットのボリューム
SAVEDIR=保存先

#4日前に作られたものを削除
find $SAVEDIR -mtime 4| xargs rm -f

#スナップショット lv_root_snap が保存名
lvcreate -s -l 80%FREE -n lv_root_snap /dev/$GROUPNAME/$TARGETVOLUME

#ダンプ　保存先
dump -0 -f $SAVEDIR/lv_root_snap`date "+\%Y\%m\%d_\%H\%M\%S"`.dump /dev/$GROUPNAME/lv_root_snap

#スナップショットの削除
lvremove -y /dev/$GROUPNAME/lv_root_snap
```

#コピーに関して。。。
mkdir /osbp
mkdir /mnt2

```shell-session
#!/bin/sh
GROUPNAME=グループ名
TARGETVOLUME=ターゲットのボリューム
SAVEDIR=保存先
SPEED=転送速度(kb/s) 
TARGETFILE=バックアップされたいファイルパス
SAVENAME=保存名

#4日前に作られたものを削除
find $SAVEDIR -mtime 4| xargs rm -f

#スナップショット lv_root_snap が保存名
lvcreate -s -l 80%FREE -n lv_root_snap /dev/$GROUPNAME/$TARGETVOLUME

#マウント
mount /dev/$GROUPNAME/lv_root_snap /mnt2

#コピー
rsync -av --progress --bwlimit=$SPEED 

#アンマウント
cd /
umount /mnt2

#スナップショットの削除
lvremove -y /dev/$GROUPNAME/lv_root_snap
```


#Conclusion
バックアップはこれで取れます。
だが、リストア方法がわからず、、、。


#Reference
https://uc2.h2np.net/index.php/LVM%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%82%B9%E3%83%8A%E3%83%83%E3%83%97%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88

https://blog.cles.jp/item/5286

https://qiita.com/tukiyo3/items/bf8164c6bc703c894598
電子部品めも

# 目次
- 機器間コネクタ
- 基板で利用するコネクタ

## 機器間コネクタ
とあるターゲットと、それを制御するマイコン側との接続のコネクタを探したが、なかなか丈夫なやつが見つからない。内部配線用では、堅牢性が足りずすぐだめになりそうだし、業務用では大きすぎたりする。

適切な使い方ではないが、USB Type-Cを使うことにした。秋月電子で購入したreceptacleのbreakoutで、これならリバーシブルで利用できるので接続も簡単である。すべてのピンが利用できるわけではない。マイコンなしでリバーシブル接続できるわけではなくて、その前の段階の接続でリバーシブルになるところのみ利用できるもの。2018年4月で350円だった。まだUSB Type-C関連は高い。

[秋月電子 USB Type-CコネクタDIP化キット(シンプル版)](http://akizukidenshi.com/catalog/g/gK-13080/)


## 基板で利用するコネクタ

ブレッドボードの信頼性が低いというか、実用で使おうとするとすぐ抜けたりするので
基本的に全部半田付けすることにした。でも、取り外したい部分があるのでコネクタにしたい。
何が一番いいか調べてみる。

### XHコネクタ

秋月電子でXHコネクタをいくつか買って試したところ、丈夫で良好なので整理しておく。

|種類|特徴|ピッチ|
|----|:----:|-----|
|**XHコネクタ**|[メーカーサイト](http://www.jst-mfg.com/product/detail.php?series=277)|2.5mm|
|PHコネクタ|[メーカーサイト](http://www.jst-mfg.com/product/detail.php?series=199)|2.0mm|
|VHコネクタ|[メーカーサイト](http://www.jst-mfg.com/product/detail.php?series=262)|3.96mm|
|ZHコネクタ |[メーカーサイト](https://www.jst-mfg.com/product/detail.php?series=287) | 1.5mm |
|SHコネクタ|[メーカーサイト](http://www.jst-mfg.com/product/detail.php?series=231)|1.0mm|

pitchを見ると、universal 基板では、2.5mmピッチのXHコネクタが良さそうだ。5ピンまでなら2.54pitchに入りやすく、6ピンになるとぎりぎりで一度刺したらぬけなくなるレベルとなるのでPCBの穴を大きめにする必要がある。

### XHコネクタセット

秋月電子で単体で買うよりは、ebayのセットが安いのだが本物だろうか...プロトタイプなのでとりあえずebayでセットの商品をオーダーした。純正品のreceptacleとeBayの格安セットの接続は問題なかった。

### XHコネクタ用のツール

金属とwireをかしめるためのツールは　ENGINEER PA-21　を利用した。
1.6mmを利用しないと、サイズが大きくなってしまって、ハウジングに収まらなくなるので注意。

### XHケーブル
ebay.comなどでXHのpin数に応じて、配線済みのケーブルが発売されている。
手間が省けて効率がよいし、信頼性もあるようなので、2pin, 3pin, 4pin, 5pinのケーブルを発注して使うようにした。
最近は amazon.co.jp でも入手できる。

### ZH コネクタ
XHはじょうぶで取り扱いが楽だが厚みが6mm程度あり、薄く作りたい部分には向いていない。そこでZHコネクタを試してみた。高さは抑えられるが挿抜はきつくて少しやりにくい。

## 履歴
2021/12/04 ZH コネクタ情報を追加した
Screenにattachしたらウインドウサイズが小さい場合に、自分のウインドウサイズに合わせる

## Screenにattachしたらウインドウサイズが小さい？
例えば業務でScreenのセッションを共有する場合、attachしてみたらウインドウサイズがやけに小さい時があると思います。

これは大抵、他の人が開いているScreenのセッションが先にあって、他人が開いているTerminalのサイズにScreenのウインドウサイズが合わせてあるため、そこに自分がattachしたことで、その人のウインドウサイズで自分も表示されるというようなパターンが多いのかなと思います。（→なんか説明に自身が無いです…）
(※これ以外にもウインドウサイズが小さくなるパターンはあります)


# 自分のTerminalのウインドウサイズに合わせるには
Screenを開いている状態で下記を実行することで自分のウインドウサイズにfitします。

```
Ctrl-a F 
```

※ Ctrl-aはScreenのデフォルトのエスケープキーなので、各自Ctrl-tなどの設定しているエスケープキーとして考えて下さい。
※ Fは小文字ではなく ```shift-f``` です。Fはfitの頭文字と考えると覚えやすいです。

一応```Ctrl-a F```についてマニュアルなどに説明を求めると、例えば下記のリンク先のgnu.orgでは『Resize the window to the current region size. 』と書かれていたりします。
https://www.gnu.org/software/screen/manual/screen.html

## 注意点
但し、これを実行すると他人がattach中のセッションのウインドウサイズが、今度は自分のウインドウサイズに変わってしまいます。
なので、こちらを実行する際に他の人がattach中ではないか、または変更してもよいかは確認しておく必要がありそうです。
avaのsnapshotが便利だった


avaはjavascriptのテストフレームワークです。私は最近mochaから乗り換えて色々と試しています。

> [JavaScriptのテストフレームワークはAVAが流行り気味らしいので調べてみた \- Qiita](https://qiita.com/niisan-tokyo/items/000db7cd0e995c802334)

avaはドキュメントの日本語訳があります。

> [ava\-docs/ja\_JP at master · avajs/ava\-docs](https://github.com/avajs/ava-docs/tree/master/ja_JP)

しかし情報が古く、[本家](https://github.com/avajs/ava)のREADMEには追いついていません。  

本家のREADMEには[snapshot-testing](https://github.com/avajs/ava#snapshot-testing)という項目があったので試してみました。

## 環境
- node: v8.9.1
- ava : 0.25.0


## 試してみた
### 1. 登録
 
```js:snapshotTest.js
test.only('snapshotのtest', (t) => {
  var fn;
  fn = () => {
    return {
      a: 1,
      b: 2
    };
  };
  t.log(fn());
  t.snapshot(fn());
});
```
簡単なテストコードを書いてみました。決まったObjectを返す関数をsnapshot関数に渡しています。  


```shell
✔ snapshotTest › snapshotのtest

    ℹ {
        a: 1,
        b: 2,
      }

1 test passed [20:38:08]
```

動作させた時にsnapshotが存在しなければ登録されます。
testディレクトリに以下のファイルが作成されます。

- ~/project/test/snapshots/snapshotTest.js.snap
- ~/project/test/snapshots/snapshotTest.js.md

.snapの方はバイナリ、.mdファイルの方は以下の様な感じ。

```md:snapshotTest.js.md
## snapshotのtest

> Snapshot 1

    {
      a: 1,
      b: 2,
    }
```

`snapshotのtest`の1つめのSnapshotが登録されていることが確認できます。

### 2. テストを失敗させてみる

fn関数の`{a: 1}`の部分を書き換えて`{a: 2}`を返すようにしてみます。logはもう必要ないので消しておきます。

```js:snapshotTest.js
test.only('snapshotのtest', (t) => {
  var fn;
  fn = () => {
    return {
      a: 2,
      b: 2
    };
  };
  t.snapshot(fn());
});
```

結果はこちら。失敗してます。

```shell
  Did not match snapshot

  Difference:

    {
  -   a: 2,
  +   a: 1,
      b: 2,
    }
```

### 3. snapshotを更新する

コンソールからavaを再起動します。その際に`--update-snapshots`オプションを付けます。

```shell
> ava --update-snapshots

✔ snapshotTest › snapshotのtest

1 test passed [21:10:55]
```
通りました。mdファイルを確認してみます。

```md:snapshotTest.js.md
## snapshotのtest

> Snapshot 1

    {
      a: 2,
      b: 2,
    }
```
ちゃんと更新されています。


## まとめ

テスト駆動開発は最初にテストを書いてから関数を実装します。しかし大きなオブジェクトを返す関数などは先に実装させてからテストを書くことが多々あります。(あるよね？)  
その場合は返り値をコピペしてequalしてるかをテストコードに書くのですが結構手間だしコードも助長になりがちです。  
テストに大事なのは関数の返り値が変わらない事を保証することなので、snapshotで実現するのは便利だなーと思いました。活用しようと思います。
PHPExcelで出力したExcelの数式で再計算が実行できなくなった時の対処法

PHPExcelでレポート的なものを出力するプログラムの面倒を見ているのですが、最近のWindows Updateに伴ってOffice365がアップデートされ、恐らくそれが原因でPHPExcelで出力したExcelの数式が再計算できなくなってしまったようです。
数式が入力された大量のセルをひとつずつダブルクリックしていけば再計算されて正しいデータが表示されるのですが、そんなにヒマなわけもないので対処法を探し出しました。

## 発生バージョン
- Office365 bussiness バージョン1803(これ以前のバージョンでは発生していないようです）

参考：https://technet.microsoft.com/ja-jp/office/mt465751

## 前程
- PHPExcelのPHPExcel_IOFactory::createWriterでExcel2007を使用している

参考：PHPExcel https://github.com/PHPOffice/PHPExcel

## 対処法
~~PHPExcelの中を直に変更してしまうことになりますが、下記対応で一旦解消しました。~~

```php:PHPExcel/Classes/PHPExcel/Writer/Excel2007.php
protected $preCalculateFormulas = false;
↓
protected $preCalculateFormulas = true;
```

**2018年6月追記**
setメソッドがあるとご指摘いただいたので修正です。
PHPExcelではhttps://github.com/PHPOffice/PHPExcel/blob/1.8/Classes/PHPExcel/Writer/Abstract.php#L110 にsetメソッドがあるので、こちらを使用するようにしてください。
ちゃんとドキュメントにも記載がありました。
https://github.com/PHPOffice/PHPExcel/blob/1c8c2379ccf5ab9dd7cb46be965821d22173bcf4/Documentation/markdown/Overview/10-Reading-and-Writing.md#formula-pre-calculation

これで出力されたファイルで開いた際にちゃんと数式が計算された状態にすることができます。
ただし、書き込み時に再計算している？挙動になるかと思うので、書き込みにかかる時間は少し長くなりますのでご注意ください。

**2018年6月追記**
ただし、この修正の仕方だと書きこんだ部分しか再計算が適用されません。
書き込み箇所以外の再計算が必要な場合はこちらも直修正にはなってしまいますが
https://qiita.com/no22@github/items/3401b10d2e389b9ed55e
を参照ください。

なお、PHPExcelはサポートを中止してPhpSpreadsheetに移行していますので、あんまりいないかもしれませんがこれから利用を検討している方はhttps://github.com/PHPOffice/PhpSpreadsheet を利用するようにしましょう。

これ、PhpSpreadsheetに移行したらデフォルトでもちゃんと再計算されるようになるんだろうか？
試せたらまた追記しますね。もっと良さげな対処法知っている方は是非教えてくださいー。
Excelのピボットで四分位を計算する方法（が無いので代わりの方法）

ここの記事の完全にパクリです。ですが、日本語のQ＆Aが無かったので、和訳的に紹介します。
英語が読める方は下記リンクでどうぞ。
https://stackoverflow.com/questions/13441090/using-quartile-in-an-excel-pivot-table-to-summarise-data-by-sub-populations

こういう縦積みデータがありまして、

|IndivID   |SubPopID  |Value|
|---|---|---|
|   1      |    A     |  33.56|
|   2       |   E       |42.31|
|   3       |   D       |16.35|
|   4       |   A       |50.59|
|   5       |   F       |80.63|
|   ...|

こんな感じに、SubPopID別の四分位を一気に計算したいという時、どうするか？

|SubPopID |     Min |    Q1   |  Q2    |    Q3   |   Max|
|---|---|---|---|---|---|
|   A|         3.23  |  12.06 |  20.35 |  28.29 |    50.59|
|   B |
|   C|
|   ...|

ピボットテーブルに「四分位」という計算があれば良いのですが、ありません。
Rに入れちゃえとかはあるんですが、
Excelで計算したい時は、下記の「配列数式」で実現できます。
（データはそれぞれテーブル化してあります）

配列数式なので、式を入れた後、Ctrl+Shift+Enter で確定して下さい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/100646/165fa902-ff6f-a27a-bc4a-6d76ee61f5ce.png)

■最小値
{=QUARTILE.INC(IF(データ[SubPopID]=[@SubPopID],データ[Value]),0)}

■第１四分位
{=QUARTILE.INC(IF(データ[SubPopID]=[@SubPopID],データ[Value]),1)}

■第２四分位（中央値）
{=QUARTILE.INC(IF(データ[SubPopID]=[@SubPopID],データ[Value]),2)}
以下同様・・・
【新卒向け】社会人になって6年たった自分が後悔していること・良かったことまとめ

# はじめに
この記事は[【新人向け】入社して３年たった僕が後悔していることまとめ(Qiita)](https://qiita.com/januaryCOM/items/07569baa0fc699c7766b)の影響を大きく受けています。
「新卒は3年は続ける」という、賛否両論の言葉もある中、
自分はちょうど倍の6年のキャリアを積んできたので、完全に便乗ですが、記事としてまとめてみました。いわゆるポエムです。
一般的なエンジニアさんと比べるとかなり異色だとは思いますが、こんな生き方もあるよ、ということで参考にしていただけると嬉しいです。


## 略歴
大卒エンジニア(28歳) エンジニア歴6年
主にC#、python、PHPのWebエンジニア
現在はフリーランスとして現場に常駐

# 後悔
## 【後悔1】 人と話すのがどんどん恐くなってしまった
この1年ほどで、自分はエンジニアとして生きていくんだ、という強い思いを抱いてやってきたのですが、
人と話すのがものすごく怖くなってきました。人見知りが加速してきた気がします。
その原因として、少し前は色んなイベントだったり、新しい出会いを目指して行動などしていたのですが、
最近はコーディングのために部屋にこもることが多くなって、人と出会う絶対数が少なくなってしまっているのかもしれないです。
人間関係でトラブルがあったりして、トラウマもあるのかもしれません。
もっと色んな人との出会い、それも対面での交流を続けていけばよかったなと思っています。
これから社会人になる方は、学生時代の友達だけでなく、まったく違う業種やタイプの人との交流を進めていけるといいと思います。


## 【後悔2】 自分の欠点を埋めようと脇道に逸れてしまった
元々の性格がかなりネガティブなこともあって、エンジニアとして食べていけるのか、すごく不安がありました。
そのため、『無い物ねだりで』自分の不安と欠点を埋めようと、脇道に逸れた行動をしていた時期がありました。
具体例には、MLMを誘われてやってみたり、新しい教育ということで数百万投資したりです。
本当は「フリーランスとして、自分を商品としてやってみたい」という思いをずっと前から持っていたのですが、その挑戦と決断をするのがだいぶ遅くなってしまいました。
その行動自体で得たものも多かったのですが、『欠点と不安を埋める』ための行動は必要なかったなと思っています。


## 【後悔3】 世界を見据えて勉強や行動をしていなかった
エンジニアとして生きていくならば、英語は必須です。
ということを、自分は3ヶ月間オフショア開発のために行ったベトナムで学びました。

ベトナムでは、交流する時は英語がメインでした。
（ちなみにベトナムの公用語はベトナム語です。お互い第2言語で交流していました）
学生時代から「どうせ俺は国内で生きていくから笑」と、まったく英語を勉強していなかった自分は、この時ものすごく後悔しました。まったく聞き取れなかったし話せなかったです。
英語が出来ていないと、エンジニアとしての20%程度しか活躍できないと思って下さい。公式ドキュメントも、ちょっと難しめのドキュメントであれば英語オンリーです。
英語が苦手な新人の方は、今からでも少しずつでも、英語の勉強してほしいです。


## 【後悔4】 『自分がやった方が早い』という呪縛から逃れられていない
エンジニアとして開発を続けてきた結果、ちょっとした開発であればかなり出来るようになってきました。
ただその弊害として、プロジェクトに対して『自分がやった方が早い』という思いがものすごくあります。
自分がプログラミングを教えたり、若手に開発を振ったりするのですが、
進捗が思わしくないと「あー俺がやっちゃおうかな」と、正直思ってしまっています。
それは絶対絶対×××です。本当に自分がやってしまったら、若手の成長を阻害してしまうし、やる気も奪ってしまいます。そして自分自身の時間も取られてしまいます。
なので、「人に依頼する・任せる・振る」という経験をもっと積みたかったなと思っています。
振ることで、進捗を確認するタイミングやスケジュール管理など、コーディングするものとは別の経験・能力を得ることが出来たなと思いました。


# 良かったこと
## 【良1】 どこでも活躍できる自信がついた
自分は新卒で入った会社を11ヶ月で辞めました。
また、【後悔2】でも触れましたが、脇道は逸れたものの、大分色んな挑戦をすることが出来ました。
その結果、本当にやってみたかったフリーランスになることを決断し、今は色んな人にお世話になりながら、活動することが出来ています。
イヤな会社はちゃっちゃと辞めろ、自分次第でどうにでもなるから・・・という話をすることも出来ます。
エンジニアは残念ながら、労働環境が悪いところも非常に多いです。
エンジニアと会社との相性が悪いと、どれだけ優れた人でも『使えない人』になったりします。
そんな時には決断し、自分の意志で行動してください。
そのために、どこでも活躍できるような、自分の武器を磨き続けることを続けていってください。


## 【良2】 「どうせ失敗するときはする」ということを学んだ
人間、絶対「失敗したくない」という気持ちを持っていると思います。
自分も一緒。失敗なんてしたくない。
けど、色々やってるうちに『どうあっても失敗するときはする』ということを学びました。

自分の問題、相手の問題……色んな要因はありますが、どれだけ気をつけてようが何しようが、失敗するときは絶対する。
なので、「どうせ失敗するなら、やるだけやって失敗しよう」と思うようになりました。
これも上の方で書いた、色んな挑戦をしてみて、失敗して学んだことです。
今後、人生において『分岐点』が訪れると思いますが、その時は、「どうせ失敗するから、やってみよう」ぐらいの気持ちで、チャレンジをしてみてほしいなと願っています。


# まとめ
新卒3年の頃は、自分のスキルを高めることに必死だった記憶がありますが、
6年経った今は、求めたいこと・求められることも変わってきました。
その時その時で、必要なことが変わっています。
新卒の皆には、きっと色んなことがあると思いますが、
その場その場の波に、頑張って向き合って欲しいなと思っています！
Vimの:tabsからfzfで検索してタブを開く

## まえがき
ザクッと作ってみたので共有します。
vim8でも、NeoVimでも大丈夫です。
fzfはすでにインストールしてある前提です。

```vimscript:.vimrc
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'
```

## .vimrc または init.vimに以下を記述
以下を.vimrcまたはinit.vimに書きます

```vimscript:.vimrc
" [tab open] ----------------------------------
" 数あるタブから開く

" leader to で開始するための設定
nnoremap <leader>to :FZFTabOpen<CR>
command! FZFTabOpen call s:FZFTabOpenFunc()

function! s:FZFTabOpenFunc()
	call fzf#run({
			\ 'source':  s:GetTabList(),
			\ 'sink':    function('s:TabListSink'),
			\ 'options': '-m -x +s',
			\ 'down':    '40%'})
endfunction

function! s:GetTabList()
	let s:tabList = execute('tabs')
	let s:textList = []
	for tabText	 in split(s:tabList, '\n')
		let s:tabPageText = matchstr(tabText, '^Tab page')
		if !empty(s:tabPageText)
			let s:pageNum = matchstr(tabText, '[0-9]*$')
		else 
			let s:textList = add(s:textList, printf('%d %s',
				\ s:pageNum,
				\ tabText,
				\	))
		endif
	endfor
	return s:textList
endfunction

function! s:TabListSink(line)
	let parts = split(a:line, '\s')
	execute 'normal ' . parts[0] . 'gt' 
endfunction
```

## 実行イメージ
![スクリーンショット 2018-04-03 21.03.53 1.png](https://qiita-image-store.s3.amazonaws.com/0/73446/177ce360-1f8f-8408-a7e8-18a3ac3cd9a6.png)

## あとがき
```:tabs``` コマンドと同じように現在開いているものには```>``` が付いたりもします。(基本的に```:tabs``` のファイル名の行をそのまま出力します)
一つのタブの中で複数のbufferを開いている場合もすべて列挙し、左の数字がどのタブ番号かを教えてくれます。

最近OniVimを使っていて、一つのVimを開きっぱなしにしていることが多くなったので開きっぱなしのタブも増えてきた…ということで組んでみました。
OniVimについてはまた今度まとめます。
RxJava/RxAndroidの非同期テストで「 java.lang.ExceptionInInitializerError 」が発生した時に…

# java.lang.ExceptionInInitializerError
RxJava/RxAndroidの非同期テストを書いていたときに、「 java.lang.ExceptionInInitializerError 」というエラーが発生しました。

```
java.lang.ExceptionInInitializerError
	at io.reactivex.android.schedulers.AndroidSchedulers$1.call(AndroidSchedulers.java:35)
	at io.reactivex.android.schedulers.AndroidSchedulers$1.call(AndroidSchedulers.java:33)
	at io.reactivex.android.plugins.RxAndroidPlugins.callRequireNonNull(RxAndroidPlugins.java:70)
	at io.reactivex.android.plugins.RxAndroidPlugins.initMainThreadScheduler(RxAndroidPlugins.java:40)
  Caused by: java.lang.RuntimeException: Method getMainLooper in android.os.Looper not mocked. See http://g.co/androidstudio/not-mocked for details.
  	at android.os.Looper.getMainLooper(Looper.java)
  	at io.reactivex.android.schedulers.AndroidSchedulers$MainHolder.<clinit>(AndroidSchedulers.java:29)
  	... 41 more
```

# 原因
皆さんよく書くと思われる `.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())` の部分で
`AndroidSchedulers.mainThread()` がAndroidに依存したクラスを利用しているから、とのことです。

:bow: 参考 :bow:
https://stackoverflow.com/questions/43356314/android-rxjava-2-junit-test-getmainlooper-in-android-os-looper-not-mocked-runt
https://qiita.com/ko2ic/items/397fd147d4f3d0bdca09

# 対策
RxJavaPlugins/RxAndroidPluginsを使用する。

下記のような処理をテストの `@Before` などに書くと、Schedulerを指定することが出来、エラーを回避できました。

```
val immediate = object : Scheduler() {
    override fun scheduleDirect(run: Runnable, delay: Long, unit: TimeUnit): Disposable {
        return super.scheduleDirect(run, 0, unit)
    }

    override fun createWorker(): Scheduler.Worker {
        return ExecutorScheduler.ExecutorWorker(Executor { it.run() })
    }
}
RxJavaPlugins.setInitIoSchedulerHandler { immediate }
RxJavaPlugins.setInitComputationSchedulerHandler { immediate }
RxJavaPlugins.setInitNewThreadSchedulerHandler { immediate }
RxJavaPlugins.setInitSingleSchedulerHandler { immediate }
RxAndroidPlugins.setInitMainThreadSchedulerHandler { immediate }
```

# さらなる問題
これで大丈夫と思いきや、さらなる問題が…

***非同期処理が成功したあとに、続けて非同期処理を行うと、2回目の非同期処理が永遠に終わらない状態に。***
（この対策とは関係のない部分が原因の可能性も否定できませんが…）

# 対策（2）
テスト時だけ、
`.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())` を
`.subscribeOn(Schedulers.trampoline()).observeOn(Schedulers.trampoline())` に変更。

Schedulerを変更させちゃえばいい、という発想ですね。

DroidKaigiのアプリを見てみると、Repositoryが `SchedulerProvider` をInjectするようになっており、テスト時には `TestSchedulerProvider` というのを注入する形になっていました。
https://github.com/DroidKaigi/conference-app-2018/blob/master/app/src/main/java/io/github/droidkaigi/confsched2018/data/repository/ContributorDataRepository.kt#L19

https://github.com/DroidKaigi/conference-app-2018/blob/master/app/src/test/java/io/github/droidkaigi/confsched2018/util/rx/TestSchedulerProvider.kt

確かにRxJavaPlugins/RxAndroidPluginsで変更させるのは若干の黒魔術感があるので、DIで変えてあげるほうがいいのかもしれないと思いました。

# 結論
・Schedulerを変更させる必要があります。
・DIでSchedulerを注入させて、テスト時は `Schedulers.trampoline()` にする、のがいいかもしれない。
[Progate学習memo] JavaScript Ⅰ~Ⅳ

Progateは月額980円(税込み)でプログラミングを学べるサービス (無料会員でも一部サービスを利用できる。)
[Progate レッスン一覧](https://prog-8.com/languages)
# JavaScript
## <font color="">デバック</font>
```javascript
console.log("  ");
```
```javascript
console.log("Hello,World!");
console.log("Hello,"+"World!");
console.log(3+5);
console.log("3"+"5");
```
<font color="silver">結果</font>

```
Hello,World!
Hello,World!
8
35
```
## 変数宣言
```javascript
var 変数名 = 値;
```
```javascript
var name="Raara";
var age=11;
```
## 条件分岐
### 比較演算子
| 論理式 | a=b | a≠b | a<b | a≦b | a>b | a≧b |
|:-:|:-:|:-:|:-:|:-:|:-:|:-:|
| JS | a===b | a!==b | a<b | a<=b | a>b | a>=b |

※  JavaScriptでは、<font color="red"> 等号は  a===b</font>    <font color="red">不等号は  a!==b</font>
### 複数条件式
```javascript
// かつ
条件式1 && 条件式2

// または
条件式1 || 条件式2
```
### if文
```javascript
if(条件式1){
    処理a
}else if(条件式2){
    処理b
}else{
    処理c
}
```
### switch文
```javascript
switch(対象){
    case 値1:
        処理a
        break;
    case 値2:
        処理b
        break;
    default:
        処理c
}
```
## ループ
### for文
```javascript

for(変数の定義; 条件式; 変数の更新){
    処理
}
```
```javascript

for(var i=0; i<=2; i++){
    console.log(i);
}
```
<font color="silver">結果</font>

```
0
1
2
```
### while文
```javascript

while(条件式){
    処理
}
```
```javascript

var i=0;
while(i<=2){
    console.log(i);
    i++;
}
```
<font color="silver">結果</font>

```
0
1
2
```
## 配列
### 配列の操作
```javascript

var 配列=[値1, 値2];
```
``` javascript

var soramiSmile=["Raara", "Mirei", "Sophie"];
console.log(soramiSmile[0]);

// 要素数(lengthメソッド)
console.log(soramiSmile.length);

// 要素の更新
soramiSmile[0]="Non";
console.log(soramiSmile);
```
<font color="silver">結果</font>

```
Raara
3
["Non", "Mirei", "Sophie"]
```
### 追加(pushメソッド)
```javascript

配列.push(追加したい要素);
```
```javascript

var aromagedon=["Mikan", "Aroma"];
aromagedon.push("Gaaruru");
console.log(aromagedon);
```
<font color="silver">結果</font>

```
["Mikan", "Aroma", "Gaaruru"]
```
### 連想配列(辞書?)
```javascript

var 連想配列={キー1：値1, キー2：値2};
```
```javascript

var godIdol={"name":"Raara", "color":"purple"};
console.log(godIdol.name);
console.log(godIdol["color"]);
```
<font color="silver">結果</font>

```
Raara
purple
```
## 関数
```javascript

function 関数名(引数){
    実行処理
}
```
###戻り値
```javascript

function add(a, b){
    return a+b;
    console.log("計算が終わりました"); // returnの後ろ呼び出されない
}
add(3,5);
```
<font color="silver">結果</font>

```
8
```

記事の制作者：
https://twitter.com/amber_seia
Macでmatplotlibの日本語文字化けを解決する方法

フォントをダウンロードするのが面倒だったため色々探していたら下記だけで解決しました。

```python
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'AppleGothic'
```

そうすると下図のように日本語がちゃんと表示されます。

<img width="452" alt="スクリーンショット 2018-04-03 20.56.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/199445/cf427000-38f4-2289-63c5-9e81f9b5005d.png">

以上です。
raven-ruby で Sentry にパラメータを送る

[getsentry/raven-ruby](https://github.com/getsentry/raven-ruby) の `Raven.capture_message` メソッドへのパラメータの渡し方は、こういう風になっている。

```ruby
Raven.capture_message 'My Event!',
  logger: 'logger',
  extra: {
    my_custom_variable: 'value'
  },
  tags: {
    foo: 'bar'
  }
```

https://docs.sentry.io/clients/ruby/context/

なので、こう送ると、

```ruby
# capture_exception は capture_message の alias
Raven.capture_exception(
  e,
  {
    extra: {
      foo: 'foo'
    }
  }
)
```

こういう風にパラメータが見れる。

<img width="1000" alt="Screen Shot 2018-04-03 at 20.42.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/339/60978676-adf9-7d48-b090-e70538e1764b.png">
Encrypted Secretsで暗号化したsecrets.ymlでタイポした時

# 起こった問題

Encrypted secretsで暗号化したsecrets.ymlを編集

```bash
bin/rails s
```

を実行したら、エラー

```bash
psych.rb:377:in `parse': (<unknown>): could not find expected ':' while scanning a simple key at line 5 column 3 (Psych::SyntaxError)
```

どうやら原因はsecrets.ymlのタイポらしいので修正を試みる

```bash
EDITOR=vim bin/rails secrets:edit
```

するとまた同じエラー

```bash
psych.rb:377:in `parse': (<unknown>): could not find expected ':' while scanning a simple key at line 5 column 3 (Psych::SyntaxError)
```

タイポのせいで`bin/rails`コマンドが全て封じられたっぽい
エラーの輪廻に閉じ込められてしまった。。。笑

# 解決策

config/application.rbを以下のようにする

```ruby
config.read_encrypted_secrets = false
```

encrypted secretsの設定を読み込まないようにしたところ

```bash
EDITOR=vim bin/rails secrets:edit
```

のコマンドで編集できるようになった。
タイポを修正して、config/application.rbを元に戻す

```ruby
config.read_encrypted_secrets = true
```