OmniAICreator/Qiita-1.07M huggingface dataset:
Ubuntu環境でinotifywaitを使いファイル更新時に特定のコマンドを実行する方法


```bash
# install
sudo apt install inotify-tools

# /tmpにあるaaaとbbbのフォルダ以下のファイルが更新されたら、echoが出力される
inotifywait -e create,delete,modify,move -mr /tmp/aaa /tmp/bbb |while read;do while read -t 0.3;do :;done;echo "aaa";done
```

あまりに覚えづらいので、関数定義をbashrcとかに入れておくと良いかも(alias登録だとダメだったので、関数にしました)

```bash
cat << 'EOS' >> .bashrc
# シングルフォルダ：d-watch /tmp/aaa 'echo aaa'
# 複数フォルダ：d-watch '/tmp/aaa /tmp/bbb' 'echo aaa'
function d-watch(){
  inotifywait -e create,delete,modify,move -mr $1 |while read;do while read -t 0.3;do :;done; $2 ;done
}
EOS
```

LinuxOSなら、どのディストリビューションでも出来ると思う。

完全に余談ですが、d-watchという命名ですが、個人的にalias系のコマンドが他とかぶらないようにするため、daijinloadの頭文字を取って、d-で始めているというのが理由です。

```bash
### 登録しているものは、こんな感じっす
alias d-open="xdg-open ."
# alias d-tom="ps -ef | grep tomcat | grep -v 'grep' | awk {'print \$2'} | xargs kill -9"
alias d-push='git push origin `git rev-parse --abbrev-ref HEAD`'
alias d-push-f='git push -f origin `git rev-parse --abbrev-ref HEAD`'
```
FlutterでWidgetのグローバル座標を取得する

FlutterでレイアウトしたWidgetの表示されている座標を取得したかったので調べました。[RenderBox](https://docs.flutter.io/flutter/rendering/RenderBox-class.html)を使うとできました。RenderBoxにアクセスするためにはWidgetに[Key](https://docs.flutter.io/flutter/widgets/Widget/key.html)を渡す必要があります。なるほど、Keyってこういう時に使うんですね。

```dart
class MyWidget extends StatelessWidget {
  final widgetKey = GlobalKey();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('My app'),
      ),
      body: Stack(
        children: <Widget>[
          Positioned(
            right: 100,
            bottom: 200,
            child: FlutterLogo(
              key: widgetKey, // 座標を取得したいWidgetにkeyを付けると、後から参照できる
              size: 64,
            ),
          ),
        ],
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          // widgetKeyを付けたWidgetのグローバル座標を取得する
          final RenderBox box = widgetKey.currentContext.findRenderObject();
          final globalOffset = box.localToGlobal(Offset.zero);
          print(globalOffset);
        },
        child: Icon(Icons.add),
      ),
    );
  }
}
```
土地用語

#公示地価と基準地価の違い

簡単な話
「調査対象範囲が違う」
「同じ「全国平均」でも公示地価は「都市部の平均」であり、基準地価は「町村部も含んだ全国の平均」である」
https://realestate.yahoo.co.jp/magazine/corp_reexbrain/20161006-00000001

#土地の筆（ヒツ）とは

土地登記簿においては、1個の土地を指す単位を筆（ふで）と言い、1筆（いっぴつ）2筆（にひつ）と数えます。登記所ではふと筆ごとに登記が行われ、地番がつけられることとなっている。
1筆の土地を分けて取引したい場合、文筆登記を行う。その場合は、地番が変わることとなる。合筆の場合は地番がまとまることとなる。

#信託受益権
「資産から発生する経済的利益を受け取る権利」のことを信託受益権

資産そのものを売買する場合、資産の所有権が売主から買主へ譲渡されます。これが、従来の不動産売買の一般的な形態であるといえます。一方で、「資産をいったん信託銀行などに信託し、それによって取得した、その資産から発生する経済的利益（賃料収入など）を受け取る権利を売買する」という取引形態が昨今増加しており、これを資産の流動化といいます。

#棚卸資産
企業が販売する目的で一時的に保有している商品・製品・原材料・仕掛品の総称。一般的には在庫と表現される。
土地の場合の棚卸資産とは、
所有する土地が棚卸資産か否か。棚卸資産の土地とは、他者への販売を目的として所有している土地をいい、例えば、不動産業における商品としての土地や、投資用の土地・マンションの敷地などが含まれる。法人の税務上・会計上の扱いが「棚卸資産」になっているかどうかは問わない。

#権原
私法上の概念で、ある法律行為または事実行為を正当とする法律上の原因をいう。

例えば、他人の土地に建物を建築する権原は、地上権、賃借権等である。

ただし、占有の場合には、占有を正当とする権利にもとづかないときにもその権利は保護され、占有するに至ったすべての原因が権原となることに注意が必要である。権限と区別して、「けんばら」と読むこともある。

#地上権
建物や工作物を所有する目的で、他人の土地を使用する権利のこと（民法第265条）。

土地賃借権と地上権は非常によく似ているが、次のような違いがある。

1．土地賃借権は債権だが、地上権は物権である
2．地上権は、土地所有者の承諾がなくても、他人に譲渡することができる。
3．地上権を設定した土地所有者には登記義務があるので、地上権は土地登記簿に登記されているのが一般的である。

#建蔽率と容積率
「建蔽率」：土地の何割を建物用に使えるか
駅周辺の「商業地域」では、このように「建ぺい率100%」という場所がある。さらに、商業地域では「隣の家にかかる日陰」に関する規制がないなどの理由により、建物と建物がぴったりくっつくように建設しても違法ではない。

建ぺい率が大きければ大きいほど、建物用に活用できる面積が広くなるため、「土地の利用価値が高い」とされる。逆に、建ぺい率が小さくなると、利用価値も下がる。

「容積率」：その土地に建設できる建物の延べ床面積

建蔽率、容積率でその土地にどんな建物が建てられるかが決まってくる。

（参考）
https://www.homes.co.jp/cont/buy_kodate/buy_kodate_00092/

#不整形地
整形地とは、正方形や長方形などの整形地ではない、L字型や三角型などの土地のこと。土地としての利用が難しくなるため、評価額・取引価格は一般に低くなる。

（参考）
https://www.homes.co.jp/cont/buy_kodate/buy_kodate_00092/
Laravelのmigrationエラー解決方法　SQLSTATE[42S01]: Base table or view already exists: 1050 Table 〇〇 already exists


Laravelのマイグレーションしてて、あっタイポしてエラー出ちゃった！
修正して。。。。。。`php artisan migrate`実行！

```terminal
SQLSTATE[42S01]: Base table or view already exists: 1050 Table 〇〇 already exists......
```
.....あるあるですね。**僕は200万回経験しました。**
どうやら先ほどタイポしたテーブルはすでにあるよ。って言われているだけなので、そのテーブルだけをrollbackすれば戻ることもあります。

```terminal
php artisan migrate:rollback(一つ前の状態にロールバック)
```

それでも無理でテーブルの中身をクリアしてもよければ↓

```terminal
php artisan migrate:fresh
```

それでも無理ならDBごと消して再度作成しましょう（投げやり）

以上。なんの役にも立たない備忘録でした。
単位変換: マイクロ秒↔ミリ秒、ミリ秒↔秒

マイクロ秒とミリ秒の単位変換、ミリ秒と秒の単位変換の計算方法です。

秒 → ミリ秒 → マイクロ秒 に行くほど小さい単位になります。

変換元単位 | 変換先単位 | 計算方法
--------|-----|-------
マイクロ秒 | ミリ秒 | milliseconds = micorseconds / 1000 |
ミリ秒 | マイクロ秒 | microseconds = milliseconds * 1000 |

変換元単位 | 変換先単位 | 計算方法
--------|-----|-------
ミリ秒 |秒 | seconds = milliseconds / 1000 |
秒 | ミリ秒 | milliseconds = seconds  * 1000 |

## 秒・ミリ秒・マイクロ秒早見表


| 秒 | ミリ秒 | マイクロ秒 |
|--:|--:|--:|
| 100 | 100000 | 100000000 |
| 10 | 10000 | 10000000 |
| 1 | 1000 | 1000000 |
| 0.1 | 100 | 100000 |
| 0.01 | 10 | 10000 |
| 0.001 | 1 | 1000 |
| 0.0001 | 0.1 | 100 |
| 0.00001 | 0.01 | 10 |
| 0.000001 | 0.001 | 1 |
IBM Cloud で注文した VMware 入りベアメタルのハードウェアエラー "Status of other host hardware objects" を消す方法


# 「Status of other host hardware objects」のエラー
このようなエラーが初期状態で出ることがありますので、このエラーを消す方法を書きます。
実際の動作には問題ないのですが、プロビジョニングの過程で「Chassis Intru」のハードウェアアラートが残ってしまっていることに起因します。

![Kobito.wgJUw0.png](https://qiita-image-store.s3.amazonaws.com/0/101361/6adaeca9-56c9-55ba-2ec4-fa38c507caea.png "Kobito.wgJUw0.png")
![Kobito.gwCwQ3.png](https://qiita-image-store.s3.amazonaws.com/0/101361/7d99f430-6ee4-2b2c-8fe4-db0d63b0ce74.png "Kobito.gwCwQ3.png")

# IPMI の操作権限を「Operator」から「Administrator」へ変更依頼を投げる

「Chassis Intru」のアラートを消すには、IPMIから「Administrator」権限での操作が必要です。
以下の例のように、対象のサーバーを紐づけてサポートケースを起票し、対応してもらいます。

>以下のようなチケットを発行し、rootユーザーに対して権限を強くしてもらいます。ちなみに、rootユーザーよりADMINユーザーの方が権限が強いのですが、ADMINユーザーはSoftLayerの中の人用なので、rootユーザーをADMINユーザー相当に強くしてもらうというリクエストを発行します。

>Title: Add the admin privileges to the IPMI root user
Contents: Could you please change our IPMI root users privileges on these servers to administrator, because we are sometimes requested to use stronger privileges when we access IPMI ?

>[ShinobiLayer: SoftLayerのSupermicroのBIOS設定をテキスト形式で取得する方法 - Qiita](https://qiita.com/testnin2/items/976d1116eb2c404882ef#5-%E3%83%81%E3%82%B1%E3%83%83%E3%83%88%E3%82%92%E8%B5%B7%E7%A5%A8%E3%81%97root%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AE%E6%A8%A9%E9%99%90%E3%82%92%E5%BC%B7%E3%81%8F%E3%81%97%E3%81%A6%E3%82%82%E3%82%89%E3%81%86)

![Kobito.regJW6.png](https://qiita-image-store.s3.amazonaws.com/0/101361/fdbab38d-c82c-dd25-3efa-ead0c41c8b37.png "Kobito.regJW6.png")
![Kobito.iN1ch4.png](https://qiita-image-store.s3.amazonaws.com/0/101361/201d46e4-55a3-bf53-4454-a6953004aa9b.png "Kobito.iN1ch4.png")

# IPMI で「Chassis Intru」アラートをリセット
https://cloud.ibm.com/classic/devices/ から対象のサーバーを選択し、以下の画面から IPMI のアクセス情報を取得します。

![Kobito.8q6yns.png](https://qiita-image-store.s3.amazonaws.com/0/101361/282d17b4-6a40-41fa-a1a9-ebbc416e47d5.png "Kobito.8q6yns.png")

VPN 接続の上で、Remote Mgmt インターフェイスの 10.x.x.x にブラウザでアクセスし、「Intrusion Reset」を押下します。

![Kobito.LAjjmO.png](https://qiita-image-store.s3.amazonaws.com/0/101361/71a43bba-f4e3-ccce-2c62-0365e8b7dc25.png "Kobito.LAjjmO.png")
![Kobito.8XKleI.png](https://qiita-image-store.s3.amazonaws.com/0/101361/59547f70-811e-3ae1-26ae-d764ce2be05e.png "Kobito.8XKleI.png")

↓↓↓↓↓↓

アラートがなくなり、正常なステータスとなったことがわかります。

![Kobito.w9Z88s.png](https://qiita-image-store.s3.amazonaws.com/0/101361/0584426c-02dd-8123-de22-fae6dcc4f6d0.png "Kobito.w9Z88s.png")

#さいごに

vCenter の画面からもアラートが消えました。
実際の動作には問題ないものの、アラートが気になる人はぜひお試しください。

![Kobito.D8n8Oq.png](https://qiita-image-store.s3.amazonaws.com/0/101361/8c683072-2002-b6f7-254c-16f3bcce4e98.png "Kobito.D8n8Oq.png")
![Kobito.4Sg2XH.png](https://qiita-image-store.s3.amazonaws.com/0/101361/dfea1021-6ea4-4371-44c4-d37c1486246e.png "Kobito.4Sg2XH.png")


#参考リンク
- [FAQ Entry | Online Support | Support - Super Micro Computer, Inc.](https://www.supermicro.com/support/faqs/faq.cfm?faq=28545)
#docker で コンテナIDを指定して毎回 docker kill するのが面倒なので peco を使ってインタラクティブに削除できるようにする

```
$ docker kill $(echo $(docker ps | sed 1d | peco) | awk '{ print $ 1}')
```

キャンセル時の挙動などは特に考慮していない

![image](https://user-images.githubusercontent.com/13635059/55522607-98df6e80-56c0-11e9-9d86-dc74dd7828e5.png)

# .zshrc などへの登録

てきとうに。

```

function dockerkill() {
  local container=$(docker ps | sed 1d | peco)
  local container_id=$(echo "$container" |  awk '{ print $1 }')
  docker kill "$container_id"
}

```

```
$ dockerkill
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1062








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Swaggerについて簡単な理解＜初心者＞

[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしているryota_miraidenshiです。
今回はSwaggerについて勉強したのでまとめておきたいと思います。

#Swaggerとは
SwaggerとはRESTful APIを効率よく記述するためのオープンソースフレームワーク、
Swagger SpecというSwagger の仕様に準じたドキュメント形式で記述でき、Swagger EditorというSwagger Specを記述するために開発されたエディタがサポートされていたり、Swagger UIというSwagger Spec で記載された設計書をもとにドキュメントをHTML形式で自動生成してくれるツールがあったりとAPI仕様書を効率よく作成するための周辺ツールも豊富なのが特徴。

#Swagger UI
Swagger UIは定義したYAMLファイル(書き方の一つ)を元にAPIドキュメントを自動的に生成してくれる。
→クライアントに渡すAPIドキュメントをいちいち手書きすることもなくなるのでとても便利。

#Swagger UIをdocker-composeで管理するには
そもそもDocker Composeでは、Dockerビルドやコンテナ起動のオプションなどを含め、複数のコンテナの定義をymlファイルに書き、それを利用してDockerビルドやコンテナ起動をすることができる。
一つの簡単なコマンドで複数のコンテナを管理できるようになる。
これを使ってSwagger UIを使いたい場合の簡単な手順について解説。

1. https://knowledge.sakura.ad.jp/16862/ を見ながらdocker-composeをインストール。
2. docker-composeにはdocker-compose.ymlというファイルが必要。
3. これの書き方はhttp://igatea.hatenablog.com/entry/2018/02/21/120007 を参照。

#終わりに
プログラム初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正しますのでどんどん指摘してください。
#docker ps で コンテナIDだけ表示する #shell のコマンド例

```
$ docker ps | sed 1d | awk '{ print $1 }'
227d157d5a43
f502f888c23d
3a2d17b2d0a1
```



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1059








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#shell の標準出力から最初の1行だけ削除する例

```sh
$ echo "1\n2\n3\n4" | sed 1d
2
3
4
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1058








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【PL/SQL】重複レコードの抽出

#重複レコードの抽出
##やりたいこと
以下のようなテーブルが存在した場合に「PRODUCT_CD」、「PRODUCT_NAME」が重複しているレコードを抽出します。

| ID               | PRODUCT_CD |   PRODUCT_NAME |  PRICE  |
|----------------:|:-----------------:|:------------------:|------------------:|
| 1             |       p001 |    ノート       |    350      |
|2          |            p002 |     ボールペン      |  150     |
| 3            |         p002      |   ボールペン        |   100       |
| 4             |            p003 |    手帳       |      1000        |
| 5           |             p003 |      手帳       |     500        |
| 6         |           p003|      手帳    |      350       |

##重複レコードを1行にまとめて抽出
重複しているレコードを`GROUP BY`と`HAVING`句を使用して抽出します。

```sql
SELECT product_cd,
       product_name,
       COUNT(1)             -- 重複している件数
FROM  product_tbl
GROUP BY product_cd, product_name
HAVING COUNT(1) > 1
;
```
抽出結果は以下のようになります。

| PRODUCT_CD |   PRODUCT_NAME | COUNT(1)  |
|:-----------------:|:------------------:|:------------------:|
|            p002 |     ボールペン      | 2     |
|            p003 |    手帳       |    3     |


##重複レコードを全件抽出
上記SQLでは重複レコードをまとめて抽出しましたが、重複レコードの内容を詳しく確認したい場合もあります。
その場合には下記のように対象データを副問い合わせを使用して抽出します。

```sql
SELECT *
FROM product_tbl
WHERE (product_cd, product_name) 
      IN (
         SELECT product_cd, product_name
         FROM product_tbl
         GROUP BY product_cd, product_name
         HAVING COUNT(*) > 1
         )
ORDER BY product_cd
;
```

抽出結果は以下のようになります。

| ID               | PRODUCT_CD |   PRODUCT_NAME |  PRICE  |
|----------------:|:-----------------:|:------------------:|------------------:|
|2          |            p002 |     ボールペン      |  150     |
| 3            |         p002      |   ボールペン        |   100       |
| 4             |            p003 |    手帳       |      1000        |
| 5           |             p003 |      手帳       |     500        |
| 6         |           p003|      手帳    |      350       |
Committee(Test Assertions)とCommittee::Railsについて

会社のRailsプロジェクトで初見のgemに出くわし、便利だったので書きます。
基本的には公式ドキュメントを参考に書いています。

##概要
概要を先にまとめると、Committee で、Specを書く際、API設計をしているopenapiドキュメントの内容に沿った、出力がされているかテストすることができる。
Committee::Rails でrails内でCommitteeの利用を可能にする。
実際にはこの二つの組み合わせによって、assert_schema_conformというメソッドが使用可能になり、それをテスト内で使用できるというもの。
テストで期待するいちいち出力の形を定義しなくていいので便利。

それぞれcommittee、committee-railsというGemで利用する。

##[Committee](https://github.com/interagent/committee)とは
JSON Schema, OpenAPI 2, OpenAPI 3.を使って、サービス立ち上げをサポートするための複数のミドルウェアが集まったもの
サポートしているRubyのバージョンは以下。
* 2.3
* 2.4
* 2.5
* 2.6

ミドルウェアの集合体であるため、それぞれのミドルウェアで機能を持つ。
その中で今回はTest Assertionsという便利な機能についてまとめた。

Test Assertionsとは
Committee::Middleware::ResponseValidationに含まれている一つの機能。
Test AssertionsもCommitteeに付随している、ract.testと併用するように設計された少数のスキーマ用のテストアサーション。
HyperSchema とOpenAPI 3 に対応している。
Committee::Middleware::ResponseValidation自体はHyper-SchemaとOpenAPI 2、OpenAPI 対応。

下記のように使う。

```
describe Committee::Middleware::Stub do
  include Committee::Test::Methods
  include Rack::Test::Methods

  def app
    Sinatra.new do
      get "/" do
        content_type :json
        JSON.generate({ "foo" => "bar" })
      end
    end
  end

  def committee_options
    @committee_options ||= { schema: Committee::Drivers::load_from_file('docs/schema.json'), prefix: "/v1", validate_success_only: true }
  end

  describe "GET /" do
    it "conforms to schema" do
      assert_schema_conform
    end
   end
end
```

Load_form_fileの後に参照したい、JSON Schema, OpenAPI 2, OpenAPI 3.のいずれかで書かれているファイルのパス、prefixでURLを指定する。
validate_success_onlyは、200系 レスポンスでない場合のみバリデーションをするか否かを指定する。
あとはexample内(it内)でassert_schema_conformを呼ぶだけでOK。

##[Committee::Rails](https://github.com/willnet/committee-rails)とは
上記の通り、Committee提供される機能を railsで使えるようにするために存在している。

下記のように使う。

```
describe 'request spec' do
  include Committee::Rails::Test::Methods

  def committee_options
    @committee_options ||= { schema_path: Rails.root.join('schema', 'schema.json').to_s }
  end

  describe 'GET /' do
    it 'conform json schema' do
      get '/'
      assert_schema_conform
    end
  end
end
```

Committeeで定義されているcommittee_optionsを、Committee::Railsでオーバーライドしている模様。

Rspecの場合はRails 内のrails_helper.rbに上記の内容を書いて、
Specのexample内でassert_schema_conformを使うだけで良さそう。

```
RSpec.configure do |config|
  config.add_setting :committee_options
  config.committee_options = { schema_path: Rails.root.join('schema', 'schema.json').to_s }
end
```

やっぱRspec使った方いい。


参照
[Committee git hub](https://github.com/interagent/committee)
[Committee::Rails git hub](https://github.com/willnet/committee-rails)
Cordovaでテストをする方法サーベイ

## やりたいこと

- Cordovaで作られたiOSアプリ、Androidアプリと、それとコードを共有するウェブアプリ(Cordova管理外)を、メンテコストの低い形でUIテストする

## 前提

- webview内のコードはウェブアプリ(cordova管理外)と共有している
- webview内のコードはコードはプラットフォームごとの細かい分岐や、cordovaプラグインの呼び出しが含まれる
- UIはプラットフォームごとに少しずつ異なる。

## 方針

cordovaのwebview内の要素にアクセスできるようなselenium driverがあれば、ウェブアプリとテストコードを共有できて楽そう。

-> 多分このリポジトリで可能。androidの例のみ
https://github.com/asialgearoid/cordova-appium-example

## 疑問

### appiumでcordovaのwebviewのdomにアクセスできるのか？

それができることを匂わせる記事
https://docs.microsoft.com/en-us/visualstudio/cross-platform/tools-for-cordova/debug-test/appium-ui-sequences?view=toolsforcordova-2017

それができることを匂わせるリポジトリ
https://github.com/asialgearoid/cordova-appium-example/blob/master/tests/spec/button.js

それができないことを匂わせる記事
https://www.ninton.co.jp/?p=1673

これじゃね？
https://github.com/asialgearoid/cordova-appium-example/blob/master/tests/wdio.conf.js#L27
これから推測すると、設定次第ではできるし、設定次第ではできない

### appiumをnative appに対して使う場合、UIとかの要素は指定できるのか？それともピクセル指定か？

できることを匂わせる記事
https://qiita.com/yuuhu04/items/5a96608ad96eccee34a0

以前、linuxでUIをいじろうと思って、sikulixやxdotoolに行き着きましたが、appiumでもできるかもしれません。
https://qiita.com/engineer/items/9989b388a0a9e3fa5bee#sikulix%E3%82%92%E4%BD%BF%E3%81%86%E6%96%B9%E6%B3%95

### XCUITestはandroidに使えるのか？

調べていない

## 用語集

wdio

https://webdriver.io/
たぶんseleniumとかテストフレームワークとかを束ねる存在
cordova + appiumの設定例
https://github.com/asialgearoid/cordova-appium-example/blob/master/tests/wdio.conf.js

XCUITest

https://qiita.com/y-some/items/d0c32f6e60e8ea2367fa

appium

selenium webdriver
https://qiita.com/k5n/items/899cf40a0021a6a92efd
多分seleniumのAPIでiphoneとかsimulatorとかを動かせるやつ。

appium-doctor

たぶんappiumがちゃんと設定できているかチェックするツール
https://github.com/appium/appium-doctor

selendroid

たぶんappiumの仲間

ios-driver

たぶんappiumの仲間
http://ios-driver.github.io/ios-driver/

http://selendroid.io/

nightmare

多分rubyのcapybara的なもの。javascriptで抽象的にブラウザを操作できる。
seleniumは使わないらしい。
electronを使うらしい。つまりchromiumを使うのが特徴ということか？
cordova関係無く、e2eテストに使える。
iosのテストには多分使えない。

ava

多分rspecとかmochaとかjasmine的なもの。
テストフレームワーク。

jsunit

すごい古そう
http://www.jsunit.net/
mochaとかの仲間？

## 参考リンク

ios, android, hybridについて、テスト手法をまとめてある。
https://stackoverflow.com/questions/18739352/automatic-testing-for-cordova-phonegap-webview-on-android

nightmare + avaでe2eテスト。cordovaとタイトルがついているが、あまり関係ない。
http://blog.aqutras.com/entry/2016/08/10/210000
CODE COMPLETE (上) まとめ - はじめに -

自分の理解を深めるために投稿します。
## はじめに
### 対象読者
- 経験豊富なプログラマ
- 技術指導者
- 独学で学んだプログラマ
- 学生

要するにみんな読んでおくといい！

### この本はどんな本か
- 様々な情報源からの**コンストラクションテクニック**を総合したもの
- 完全な解説書
- **プログラミング言語に関わらず**応用できる概念

### この本が書かれた理由
- コンストラクションは軽視されがちだが重要であるため
  - 大概のプロジェクトの作業の50%以上を占める
  - 大概のエラーの50%以上がコンストラクションのエラーである

### そもそもコンストラクションとは?
- 本の注釈には以下のように書いてある。

> ソフトウェア開発フェーズの中で、ほぼ詳細設計からテストまでの部分を指す。その中心はコーディングとデバッグである。
#docker コンテナをバックグラウンド ( detach ) モードで起動させて、すぐに終了しない方法。 (初心者向け)

# お手軽に、すごく長く sleep させる例

```
$ docker run -d alpine sleep 6000000000000
d132264c44f6c8f547fd0a8e9a14779d0cdf7b5c8f03a84ffc608bbf0d0c32ff
```

# loop で永遠に sleep させる例

```
$ docker run -d alpine /bin/sh -c "while true; do /bin/sleep 1; done"
eb72942c5b162e684172e8b6a180bf426913a218af7bbd7ed1002134b7c2f90e
```

# sleep infinity が使えればそうする

```
$ docker run -d centos sleep infinity
12684c6f20d3907b5c9f129ab818670afa2bf030ad8092324733d46968d9d2b7
```

# docker ps の結果例

```
$ docker run -d alpine sleep 6000000000000
3a2d17b2d0a130da0be4efebd5c59024adc6fcf838e7fe93936c93c93cd5e905
$ docker run -d alpine /bin/sh -c "while true; do /bin/sleep 1; done"
f502f888c23d6e071339a4228cb511d6dd7488560c640ebf54ac5408cd97bc31
$ docker run -d centos sleep infinity
2b171fa8a2c5ec86de214969c8e4c33fdc8bf27069241cf88dc4fdce9f41557e
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
2b171fa8a2c5        centos              "sleep infinity"         2 seconds ago       Up 1 second                             kind_noether
f502f888c23d        alpine              "/bin/sh -c 'while t…"   7 seconds ago       Up 6 seconds                            eloquent_raman
3a2d17b2d0a1        alpine              "sleep 6000000000000"    11 seconds ago      Up 10 seconds                           mystifying_goldstine
```

# docker container への接続

CONTAINER_ID を指定して docker exec 

```
$ docker exec -it 2b171fa8a2c5 /bin/bash
[root@2b171fa8a2c5 /]#
```

```
$ docker exec -it 3a2d17b2d0a1 /bin/sh
/ #
```

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1056








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
[JavaScript]非同期通信・フォーム送信後最下部までスクロールする方法

#最下部まで自動でスクロールするには

今回は非同期通信を使って、LINEのように投稿送信時に送信するたびに最新の投稿である最下部まで自動でスクロールさせる方法を紹介したいと思います。

自分もなかなか理解できない部分だったので備忘録として残しておきます。

何か間違ってる部分などありましたら訂正依頼いただけるとありがたいです。


それではコードを見ていきます。

```非同期通信.js
$(document).on('turbolinks:load', function(){
	function buildHTML(message) {
		var html = `
                    省略
                    `
        return html;
	}
	$('html要素').on('submit', function(e){
		e.preventDefault();
		var formData = new FormData(this);
		var href = window.location.href;
		$.ajax({
			type: "POST",
			url: href,
			data: formData,
			dataType: 'json',
			processData: false,
			contentType: false,
	    })
	    .done(function(data){
	    	var html = buildHTML(data);
	    	$('html要素').append(html);
	    	$('html要素').val('');
	    	$('html要素').removeAttr('disabled');
                //データ受け取り後画面最下部までスクロール
	    	$('html要素').animate({ scrollTop: $('html要素')[0].scrollHeight});
	    	return false
	    })
	    .fail(function(){
	    	alert('error');
	    });
	});
});
```

ajax通信をして、非同期にメッセージを行う処理をしています。
animateは非同期通信成功時にアニメーションをつけることができます。今回はscrollTopを引数にすることにより、メッセージ送信後にスクロールするよう設定しています。

##scrollTopについて
今回animateの引数に指定したscrollTopはレシーバに指定した要素に対する要素の上部からのスクロール位置を指定することができます。
例えば、

```scrollTop.js
$('html, body').animate({ scrollTop: 500});
```
このように指定すれば画面全体に対して上部から500pxの位置までスクロールします。
ただし今回はメッセージを送るたびにそのメッセージの位置まで（今回は最下部）スクロールしなければなりません。

```scrollTop.js
$('html要素').animate({ scrollTop: $('html要素')[0].scrollHeight});
```

このようにすることにより最下部までスクロールできます。
この'html要素'にはcssでoverflow: auto; を指定した要素が入っています。
scrollTopのバリューで指定している$('html要素')[0].scrollHeightと記述することによって、最新の投稿までの高さを取得しているのでその位置までスクロールという意味になります。
gitのlogを書き出す

備忘録として。

## 全履歴を取得
`git log --branches > log.txt`

## 日付をYYYY-MM-DD形式に
`git log --branches --date=iso > log.txt`

## 1週間分だけ
`git log --branches --date=iso --since="1week" > log.txt`

## 2019/01/01以降
`git log --branches --date=iso --since="2019/01/01" > log.txt`
bxSliderがクリック出来なくなった時の応急処置

以下で応急処置しました。

```javascript

<script type="text/javascript">
$(function(){
    var bxSliderConfig = {
      //使用しているサイトにあったオプション,
      //使用しているサイトにあったオプション,
      //使用しているサイトにあったオプション,
      touchEnabled: false
    };
    var ua = navigator.userAgent;
    if (ua.indexOf('iPhone') > 0 || ua.indexOf('Android') > 0 && ua.indexOf('Mobile') > 0) {
      bxSliderConfig.touchEnabled = true;
    }
    var slide = $('#slider ul').bxSlider(bxSliderConfig);
});
</script>
```

##　ブラウザのアップデートで
色々調べみると、特定のversionのChromeやfirefoxでスライド内のリンクが効かなくなったりするそうです。
今回のchromeのアップデートではスマホに不備はありませんでしたので、PCとタブレットの時だけ`touchEnabled: false`を当てて応急処置としました。
[.NET] コンストラクタより先にメソッドが実行されてしまうからくり――を解き明かすために派生クラスのインスタンス生成過程を追跡する

.NET では、コンストラクタから仮想メソッドを呼び出すと、派生型コンストラクタが処理されていない状態でオーバーライドメソッドが実行されてしまいます。

例として、基底クラス Base と 派生クラス Derived があるとします。
（括弧付き数字は実行される順番です）

```c#
// 基底クラス
class Base
{
    private static bool baseStaticFieldInitialized = ConsoleOut("(1) 基底型静的フィールドの初期化");
 
    private bool baseInstanceFieldInitialized = ConsoleOut("(4) 基底型インスタンスフィールドの初期化");
     
    public Base()
    {
        ConsoleOut("(5) 基底型コンストラクタの実行");
 
        // ※派生型コンストラクタはまだ実行されていないが、この時点でもインスタンスは派生型
        Assert.AreEqual(typeof(Derived), this.GetType());
         
        // ※オーバーライドされた派生型メソッドが実行される。
        OverridableMethod();
    }
 
    // 仮想メソッド
    protected virtual void OverridableMethod()
    {
        // ※インスタンス型でオーバーライドされている場合、コンストラクタからの呼び出しでも実行されない。
        Assert.Fail();
    }
 
    protected static bool ConsoleOut(string step)
    {
        Console.WriteLine(step);
        return true;
    }
}
 
// 派生クラス
sealed class Derived : Base
{
    private static bool derivedStaticFieldInitialized = ConsoleOut("(2) 派生型静的フィールドの初期化");
 
    // ※基底型インスタンスフィールド、基底型コンストラクタより先に処理される。
    private bool derivedInstanceFieldInitialized = ConsoleOut("(3) 派生型インスタンスフィールドの初期化");
     
    private bool derivedConstructorCalled = false;
     
    public Derived()
    {
        ConsoleOut("(7) 派生型コンストラクタの実行");
 
        this.derivedConstructorCalled = true;
    }
    
    // オーバーライドメソッド
    protected override void OverridableMethod()
    {
        ConsoleOut("(6) 派生型オーバーライドメソッドの実行");
 
        // ※基底型コンストラクタから呼び出された場合、
        // 　派生型フィールドは初期化済みだが、派生型コンストラクタが未処理のまま実行されてしまう。
        Assert.IsTrue(this.derivedInstanceFieldInitialized);
        Assert.IsFalse(this.derivedConstructorCalled);
    }
}
```

実行結果は以下のようになります。

```c#
new Derived();
```

```
(1) 基底型静的フィールドの初期化
(2) 派生型静的フィールドの初期化
(3) 派生型インスタンスフィールドの初期化
(4) 基底型インスタンスフィールドの初期化
(5) 基底型コンストラクタの実行
(6) 派生型オーバーライドメソッドの実行
(7) 派生型コンストラクタの実行
```

なお、非 sealed 型コンストラクタからの仮想メソッドを呼び出しは、コード分析 FxCop（[弊社支援サービス参考](https://localhost/CodeOneWebSite/Services/Rules.aspx)）で、「[CA2214: コンストラクターのオーバーライド可能なメソッドを呼び出しません。](https://docs.microsoft.com/ja-jp/visualstudio/code-quality/ca2214-do-not-call-overridable-methods-in-constructors?view=vs-2017)」として警告されます。
【Laravel】XAMPPに指定アドレスで公開

初学者です。
Laravelでプロジェクトを作成,公開までを覚え書き。

#まずプロジェクトの作成#
デスクトップに仮に作るということで、

```
cd /Users/ユーザ名/Desktop/
laravel new laravelapp
```
これだけ。
もし動かなかったら

```
composer create-project laravel/laravel laravelapp --prefer-dist
```
でもできる。
内蔵のWebサーバーを立ち上げる場合は、

```
cd laravelapp
php artisan serve
```
これでよい。
`Laravel development server started: <http://127.0.0.1:8000>`
が表示されたらヨシ。

#XAMPPで公開#
`htdocs`に`lacavelapp`というプロジェクトがある前提。

- 普通にXAMPPでデプロイしようとする場合
     - `http://localhost/laravelapp/public/`
     - これが普通の方法だがめんどくさい。

- 指定アドレス(短いアドレス)でデプロイしたい場合
    - `http://localhost/`
    - これは`httpd.conf`の末尾に下記コードを足す。

```
Alias / "/Applications/XAMPP/htdocs/laravelapp/public/"

<Directory "/Applications/XAMPP/htdocs/laravelapp/public/">
	Options Indexs FollowSymLinks MultiViews
	AllowOverride all
		Order allow,deny
	Allow from all
</Directory>
```


これ(`/Applications/XAMPP/htdocs/laravelapp/public/`)が
ローカルホストにアクセスした時に初めに表示される場所ですよ
っていうコードらしい。
*※動作確認用だからこれで公開はNG。*
*※XAMPPを普通に立ち上げてボタンぽちぽちする方法とは共存できないので注意。*

#参考書籍#
[PHPフレームワークLaravel入門]
(https://www.amazon.co.jp/dp/B07CLLW4MX/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
Chapter1-2 Pp.18
Project Euler 60問目

#はじめに
C#を用いてProjectEulerに挑戦している人の記録です。VisualStudio2017で、1つのフォームアプリの中に問題番号のボタンを作成し、そのボタンをクリックすると結果をラベルに表示するという形式でやっています。

#60問目
素数3, 7, 109, 673は非凡な性質を持っている. 任意の2つの素数を任意の順で繋げると, また素数になっている. 例えば, 7と109を用いると, 7109と1097の両方が素数である. これら4つの素数の和は792である. これは, このような性質をもつ4つの素数の集合の和の中で最小である.

任意の2つの素数を繋げたときに別の素数が生成される, 5つの素数の集合の和の中で最小のものを求めよ.

```CSharp
 private void button60_Click(object sender, EventArgs e)
        {
            int SumLimit = 30000;
            var PrimeList = new List<int>(Eratosthenes(SumLimit));

            var Stk = new Stack<StackState>();
            StackState WillPush;
            foreach (int Each in PrimeList)
            {
                WillPush.ValList = new List<int> { Each };
                WillPush.Path = Each.ToString() + ",";
                Stk.Push(WillPush);
            }

            string AnswerPath = "";
            int AnswerSumMin = SumLimit;
            int ComboCount = 5;

            while (Stk.Count > 0)
            {
                StackState Popped = Stk.Pop();

                int wkSum = Popped.ValList.Sum();

                if (Popped.ValList.Count == ComboCount && wkSum < AnswerSumMin)
                {
                    AnswerSumMin = wkSum;
                    AnswerPath = Popped.Path;
                    continue;
                }

                int ValCnt = Popped.ValList.Count;
                int RestCnt = ComboCount - ValCnt;

                int LastVal = Popped.ValList[ValCnt - 1];
                foreach (int Each in PrimeList.Where(X => X > LastVal && AnswerSumMin > wkSum + X * RestCnt))
                {
                    bool flag;
                    flag = Popped.ValList.TrueForAll(X => Sosuu(long.Parse(X.ToString() + Each.ToString())));
                    if (flag == false) continue;
                    flag = Popped.ValList.TrueForAll(X => Sosuu(long.Parse(Each.ToString() + X.ToString())));
                    if (flag == false) continue;

                    WillPush.ValList = new List<int>(Popped.ValList);
                    WillPush.ValList.Add(Each);
                    WillPush.Path = Popped.Path + Each.ToString() + ",";
                    Stk.Push(WillPush);
                }
                label1.Text = "Answer=" + AnswerSumMin.ToString();
            }
        }
```
スタックを使った全探索をしています。それぞれに素数かどうか判定しています。30000までの素数をつなげることにしたのは、これ以上が答えになることはないと考えたからです。
#終わりに
スタックを使った全探索は便利ですね。ただ、まだ動作や書き方など理解できていない部分もあるので、勉強する必要があるなと思いました。
MojavaでCypressの設定で「This is usually caused by a missing library or dependency」

以下の環境で、`yarn run cypress open`するとエラーが出て、めっちゃ悩んだ

| os/soft | version |
|:---|:---|
| darwin | 18.5.0 |
| Cypress | 3.2.0 |

#### エラーの内容
```
Cypress failed to start.

This is usually caused by a missing library or dependency.

The error below should indicate which dependency is missing.


https://on.cypress.io/required-dependencies

If you are using Docker, we provide containers with all required dependencies installed.
----------

/Users/hoge/Library/Caches/Cypress/3.2.0/Cypress.app/Contents/MacOS/Cypress: bad option: --smoke-test
/Users/hoge/Library/Caches/Cypress/3.2.0/Cypress.app/Contents/MacOS/Cypress: bad option: --ping=452
----------

Platform: darwin (18.5.0)
Cypress Version: 3.2.0
error Command failed with exit code 1.
```

まぁ、結論からかくと、`sudo`をつければ良いだけ。

```
sudo yarn run cypress open
```

ネットで調べると、`/Users/{アカウント}/Library/Caches/Cypress`を削除して、再インストールとか書いてあるけど、結局、`sudo`だった。

よくよく考え見ると、 `yarn run cypress install` で、Cypressというアプリをインストールして、それを起動したところで、failしているのだから、`sudo`じゃなきゃ起動できないのも、一応、筋は通っている気がする。

#### 参考
https://github.com/cypress-io/cypress/issues/3116
#Zapier | #Twitter でハッシュタグ付きの自分のツイートを #Slack チャンネルに投稿する例

# Twitter の My Tweet をトリガーにする

![image](https://user-images.githubusercontent.com/13635059/55520195-1ce02900-56b6-11e9-86c8-cdcb72c28363.png)

# Zapier の only continue if ... フィルタを使う

テキストに `#job` などが含まれている場合に、適当に正の判定がされるようにしておく
タスク数が消費されないように簡素な設定に抑えておく
Zapier の Filter を通らなかった場合は消費タスク数は 0 のようなので安心

# Slack の Send Channel MEssage アクションを使う

![image](https://user-images.githubusercontent.com/13635059/55520285-94ae5380-56b6-11e9-8430-02bd140cb652.png)



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1054








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Excel VBAを使ってみる

#はじめに

ここでは、基本的なExcel VBAの使い方を書いていく。
応用的なことは書かないが、コメントが多数寄せられれば考えていく。

###VBAを使うことでどんなことができるの？
VBAを使うことで連続した計算、何行もあるデータの整理等ができるようになり、
VBAをマスターすれば、日常の面倒臭い業務から解放されます。

#VBAの使い方
##Excelを開く

<img width="211" alt="スクリーンショット 2019-04-03 18.43.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/343721/323335d8-e1a8-b168-50a0-f589f6b32c71.png">
環境設定を開く
<img width="712" alt="スクリーンショット 2019-04-03 18.43.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/343721/039eb7e6-e7cb-bae8-5ab9-4c05bb767594.png">
リボンとツールバーを選択する

コマンドの選択からメインタブを選択する
<img width="798" alt="スクリーンショット 2019-04-03 18.44.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/343721/7cdd1efd-1e75-a190-6db3-d30ef2374e78.png">


<img width="798" alt="スクリーンショット 2019-04-03 18.47.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/343721/c0212f2b-8604-78f8-bdd2-fde7575c4a85.png">

下の方に開発をあるので▶︎を押下してコードディター、コード、アドイン、コンソールも同様に▶︎を押下して要素を表示する。

画面中央部にある<strong>></strong>を押下してリボンに追加し、保存を押下する

Excelの左上に
開発タブが現れれば、成功です。
<img width="610" alt="スクリーンショット 2019-04-03 18.50.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/343721/f935902a-ecea-c3d8-1f7d-91ad4de4ed12.png">


## Visual Basicの使い方
先ほど追加された開発タブを押下すると以下のようなコマンドが現れるので
<img width="745" alt="スクリーンショット 2019-04-03 18.52.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/343721/dbe05bb4-6bac-6e5f-0542-f076b65bc6b7.png">

Visual Basicを押下する
押下するとこのようなウィンドウが表示される
<img width="1486" alt="スクリーンショット 2019-04-03 18.53.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/343721/1d82ca2c-fbff-2263-5b63-ba8320f3f66f.png">

##使ってみる
ウィンドウの左にある
<img width="204" alt="スクリーンショット 2019-04-03 18.56.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/343721/8b35102c-b2ce-53c5-861c-4aedb359f32e.png">
Sheet1(Sheet1)をダブルクリクする


このようなウィンドウがひらけばOK
<img width="1104" alt="スクリーンショット 2019-04-03 18.58.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/343721/4a24c7c3-df6f-f0b0-fb47-af06588712d0.png">
ここにソースを打ち込んでいく

##簡単な表示を行う

```vb
Sub sample()
    Cells(1, 1) = 'Hello World!'
End Sub

```

ここまで書いて、
<img width="562" alt="スクリーンショット 2019-04-03 19.07.14.png" src="https://qiita-image-store.s3.amazonaws.com/0/343721/142b6997-3b53-e7a2-0e7a-4644356dd43d.png">
青い三角を押下する(どっちでもいい)

怒られた
<img width="532" alt="スクリーンショット 2019-04-04 9.22.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/343721/b6865156-e422-ed1d-c448-f47173606fa2.png">

どうやら、文字列はダブルクォーテーション""で囲わないとエラーになってしまうようだ


それを踏まえて

```vb
Sub sample()
    Cells(1, 1) = "Hello World!"
End Sub
```

実行してみると

<img width="249" alt="スクリーンショット 2019-04-04 9.27.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/343721/2cd7e6b6-863c-5fcc-32a6-c01bdce2f194.png">

(1,1)にHello World!の文字が表示されたらOK！

ちなみに


```vb
    Cells(1, 1) = "Hello World!"
```

は

```vb
    Cells(1, "A") = "Hello World!"
```

でもOKです。

このときも
'A'ではなく　"A"とすることに注意が必要です。


ではまた、次回の記事でお目にかかりましょう
最低である(Be the Worst)について

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257568/14928177-ec85-888e-45aa-fbe04394d32c.png)

こちらの本を読んでパターンを1つずつまとめ
個人的に実践可能そうなものから

## アプレンティスシップ・パターンとは
アプレンティスシップとは徒弟制度のことで、よく起きる問題への共通の解決策に実際なっているものをパターン化したもの

### アプレンティスであるということは
**今まで行ったことや今やっていることをより良く、さらに賢く、もっと速く行う方法が常にあるという態度を基本的に持つこと**

## 前提
- あなたの曖昧で暗黙の知識を他の人々が共有できると、安易に思い込まない事
- パターン同士は結びついているので、あるパターンを既に知っているという事は未知のパターンを辿る事ができる
- 優れたプログラマになる方法を教えるのではなく、優れたプログラマになるための学び方を教える

## 最低である(Be the Worst)とは
一番自分ができないようなレベルの高い環境に身をおきましょうということ

## 状況
情熱を放つ(Unleash Your Enthusiasm)ことで新たなスキルを学べる機会を利用してきた。
その結果大きく成長した。

## 問題
学習スピードが横ばいになっている

## 解決方法
あなたより優れた開発者に囲まれるようにする

## ポイント
- 最低に留まることが目標ではなく、最低から始めて地道に努力することが目標
  - 意識して改善方法を探す
  - 強力なメンバーを模倣する 
- やる気を向上させるためにリスクを認識する
  - フィードバック・ループを構築する(Create Feedback Loops)でチームが自分より先にいるのか、努力しようとする人々に対して友好的かを把握する
  - 床を拭く(Sweep the Floor)と具体的スキル(Concrete Skils)で自己中心的面を補う
- どのような問題に自分が直面しているかを分かるようにする

## 行動
- あなたが知っている全てのチームを列挙する(オープンソース、他部門、他の会社など全て) 
- スキルレベルでそのチームを順位づけする
- 地道に努力したい新たなメンバーに対してオープンなチームを特定する
- 相対的なスキルレベルを測るために様々な人に質問する
- スキルレベルの比較力の向上と共にチームを持つ力もそなえる

## 関連パターン
- [壊してよいオモチャ(Breakable Toys)](https://qiita.com/dich1/items/3a818c477b62d30bae42)
- 具体的スキル(Concrete Skils)
- フィードバック・ループを構築する(Create Feedback Loops)
- 良き指導者を見つける(Find Mentors)
- 自分の仕事を省みる(Reflect As You Work)
- 現場に留まる(Stay in the Trenches)
- 床を拭く(Sweep the Floor)
- 難しいこと(The Deep End)
- 情熱を放つ(Unleash Your Enthusiasm)

## 書籍情報
Dave H. Hoover (著), Adewale Oshineye (著), 柴田 芳樹 (翻訳), アプレンティスシップ・パターン
https://amzn.to/2UCKF9D

## 雑感
モチベーションを最大化できる自分に合った考え方をみつける事が重要そう
OculusGoで撮影した動画がPCで再生できないとき

### はじめに
* OculusGoの動作を共有しようと思って動画撮影したらうまくいかなくて焦ったときのメモ。

### 症状
* OculusGoで録画した動画ファイルをPCで再生できない
    * OculuGo上では再生できる（けどアイコンが出ない）
    * PCにDLしたファイルをffmpegで確認すると「moov atom not found」と出る
    * 以前録画した動画ファイルはDLして再生できる

### 対応方法
* OculusGoを再起動する
    * 再起動後に対象ファイルをみるとアイコンが出るようになっている
    * 再起動後にDLした動画ファイルは問題なく再生できる

### 原因？
* OculusGoがアプデしたときに本体内の動画ファイル変換優先度が下がった？

### まとめ
* 困ったら本体再起動ｗ 
* 慌てない
    * 納品用データを作成していたのでちょっと慌ててDL繰り返してました
4/4 Javascriptコードレシピ集 replaceWith textContent

#replaceWith

旧ノードと新ノードを入れ替える
旧ノード.replaceWith(新ノード)

```js:js
// 旧ノードを取得
const disappearBox = document.querySelector('.disappear');

// disappearをクリックした時に発火
disappearBox = addEventListener('click', () =>
{
  // .disappearがクリックされたらdiv要素を作成
  // createElement(作成する要素)
  const appearBox = document.createElement('div');

  // div要素にテキストを追加
  appearBox.textContent = '新しいBOX';

  // div要素にクラスを追加
  // 対象の要素.classList.add(追加したいクラス)
  appearBox.classList.add('new-box', 'new');

  // disapperBoxとappearBoxを入れ替える
  disappearBox.replaceWith(appearBox);
});
```

```html:html
<div class=.disappear>置き換わります</div>
```

#textContent

要素内のテキストの取得・更新を行う
対象要素.textContent

```js:js
// アラートでlanka要素のテキストを表示する
const lanka = document.querySelector('#lanka');
alert(lanka.textContent);
```

```html:html
<div class="lanka">アーユボーワン</div>
```
【基本情報技術者試験対策】SQLインジェクションから防御するには

参考サイト:
https://blogs.mcafee.jp/sql-injection-prevention

#サーバでの対策
入力した文字列にSQL文を仕込まれた場合に、それを命令文と認識してしまうことに問題があるため、<font color="Red">SQL文を成立させないエスケープ処理の実装や入力エリアに入力できる文字や文字数などに入力制限を設ける</font>。

#ネットワークでの対策
<font color="Red">Webアプリケーションファイアウォールの導入</font>など脆弱性を狙った攻撃を検知するソリューションを導入する。
公開されたパッチやアップデートを適用するという対処もありですが、その場合、適用の前に検証が必要になります。
(検証ってどんことするの？ってことが気になる方は<a href="https://www.itmedia.co.jp/enterprise/articles/0408/27/news078.html
">こちら</a>のサイトをご覧ください)

#WEBの脆弱性対策
外部から擬似的な攻撃を行い、悪用されると危険な脆弱性があるかどうかを確認する<font color="Red">脆弱性診断</font>というサービスがあります。
それを利用して脆弱性の有無を定期的にチェックする

#各担当者による対策
##開発者
<font color="Red">SQLインジェクションを引き起こされないようプログラミングする</font>。
どんなことに気を付けてプログラミングすればよいか記載されている、ガイドラインなるものも存在するんだそうな。
>・IPA：「<a href="https://www.itmedia.co.jp/enterprise/articles/0408/27/news078.html
">安全なウェブサイトの作り方</a>」
・OWASP Top 10：「<a href="https://www.owasp.org/images/2/23/OWASP_Top_10-2017%28ja%29.pdf
">最も重大なウェブアプリケーションリスクトップ10（PDF）</a>」
・JSSEC：「<a href="https://www.jssec.org/report/securecoding.html
">Androidアプリのセキュア設計・セキュアコーディングガイド</a>」
・経済産業省：「<a href="https://www.meti.go.jp/policy/netsecurity/secdoc/dev_contents.html
">開発者向けセキュリティ関連コンテンツ</a>」

##発注・依頼者
仕様書などの脆弱性対策を確認するWebアプリケーションやデータベースなどを発注する側は、<font color="Red">依頼書や仕様書に脆弱性対策があることを確認</font>しましょう。
とあるエンジニアの問題意識 2019-04-03

# もし僕らのMacBookがタッチディスプレイでさえあれば、豊かな絵面でプログラミングについて表現することだって、できただろうに。


# 未知の言語のコードリーディングのコツは、記号を読まずに自然言語に読むことかもしれない。

主語が大きい話ではあろうと思う。僕はその昔、プログラミングに関して、昔は一句一句の記号に対してまで、何をやっているかまるで分からぬという感覚があった。だが今は記号など無視して、だいたいこのようなことをやっているのだろうなあと、未知の言語であってもある程度は、言語も読め、作用も読めるような気がする。もちろん自分が体験したものと似た言語に限ってではあると思うが。たとえば自分はWeb開発でもフロントサイド、vue.js などは触ったことがなく、ただその新規キーワードに恐れおののいていたのであるが、いざ触ってみればなんのことはない。とても記述的でわかりやすい言語だという感触を得た。plainのjavasriptを触るよりも遥かにわかりやすい。これは初学者にも相当にとっつきやすいであろうなと思った。ところでプログラミングにおけるコードリーディングのこつは、あまり細部にこだわらず自然言語的にキーワードを読んでいくことであるかもしれない。もちろんこれもそもそもの言語仕様にはよるだろうが。ひとつひとつの矢印に至るまで目で追って、何をやっているかを考えなくとも良い。そうではなく俯瞰的に、このプログラムは何をしたがっているかということに敏感になり、まるで生き物のように、気持ちをわかってあげることが大事である。tags:qiita,medium,hatena

# 休憩能力の向上を責務にすると良い。
たとえばプログラミングを果たしてまだ頭がぐるぐると回っている最中に、呼吸30回分目を閉じて休むことの、なんと難しいことか。しかし訓練を積めばいずれ鍛えられるであろう。

# いったん問題解決が済んでしまうと、もっと問題を、問題解決の対象をくれ、と思ってしまうのであるよ。
だがしかし決して圧倒されすぎず、とても良いころあいのものを。まあ我々が食べるものなど探せばいくらでもあるだろうけれども。

# 問題解決に一段落して一息つくのは、とてもよろしい心持ちである。
それでは三杯目の抹茶ティーラテでもいただこうかと思う。

目を閉じながら vue.js のドキュメントが読めるようなライブラリは存在しないのであろうか？

# ボトムアップで学習すればトップダウンが良いような気がしてくるし、トップダウンで学習すればボトムアップが良いような気がしてくる。
そろそろちょっと落ち着けよ。どちらの道であろうとも、道は通じているはずさ。


# じっくりことこと煮込んだスープ。
朝起きて、エネルギー状態のスタートアップに4時間もかかるなど、正気なのだろうか。だがじわじわと、最善を尽くし、決して呼吸に力を込めずに、淡々とエネルギーを見つめる。たまに思い出すのは、昔のハウンドドッグというロックバンドだ。それを尾崎豊という、また古い伝説の歌手がインタビューで褒めていた。ハウンドドッグのライブで、最初、どうにも低調気味で、お客も盛り上がらない。だけどそこで諦めずに、後半、じわりじわりとパフォーマンスを上げてゆき、最高の状態ではないにしろ、それなりのエンゲージメントを達成したのであると。普通なら諦めているところであると褒めていた。僕の一日もそのようでありたい。普通であれば無謀な戦いを繰り広げて疲弊するか、もしくは単にやる気をなくして休眠するかの間に、じわりじわりと諦めずに、自分というものの火を高めてゆく方法があろうかと思う。たとえそれが何時間かかろうとも、常に善処を尽くす。じわりじわりとである。tags:hatena,medium

# 今、一番やりたいことを忠実にやれば良いのだ。
これを世の中の人は、今一番やりたくないことをするのが正解だと、真逆のことを思い込んでいる。

# vue.js をどうやって美しく思えるかを考えている。
手に触れる javascript はないのだろうか。

# 信じられないほどゆっくりと動き、信じられないほどゆっくりと呼吸するということを、実践していく。
呼吸と身体的動作の芸術を完成させる。そう考えると僕は身体動作に関しての熟練度が、レベル0程度には低いことが分かってくる。

# ひとつの働きをpythonスクリプトの中で完結させた方が良いか、shellに委ねた方が良いかというようなことを、考える。
なんとも素朴な選択ではあるけれども、

# 毎日朝ごはんを食べるように、毎日プログラミングというものをおこない、太陽とともに生き、暗い夜とともに眠り、世界に感謝する手段としようではないか。


‪もしかして生きること自体がプログラミングなのではあるまいか？‬

# たとえば体は死にそうになりながらもプログラミングは出来る身体環境を整えておきたい。

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/1053








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【Oracle】スキーマ名を指定してダンプを取得するバッチファイル

定期的に取っておくと何かと役立つOralceダンプファイルですが、Windowsのタスクスケジューラや手動で手軽にダンプを取得するためのバッチファイルを作成しました。

ダンプはDataPump形式で取得します。

# データベース側の事前準備

## SYSユーザーでダンプ取得用のユーザーを作成

バッチでSYSは使いたくないので、どのスキーマでもインポート/エクスポートできる専用ユーザーを切る。

```sql
CREATE USER "DATAPUMP_USER"
   IDENTIFIED BY "PASSWORD"
   DEFAULT TABLESPACE "USERS"
   TEMPORARY TABLESPACE "TEMP"
;

-- ロールと権限
GRANT CONNECT TO "DATAPUMP_USER";
GRANT CREATE ANY DIRECTORY TO "DATAPUMP_USER";
GRANT DATAPUMP_IMP_FULL_DATABASE TO "DATAPUMP_USER";
GRANT DATAPUMP_EXP_FULL_DATABASE TO "DATAPUMP_USER";
GRANT UNLIMITED TABLESPACE TO "DATAPUMP_USER";
```

## ディレクトリオブジェクトの作成

インポート/エクスポート用ユーザ用ユーザーでログインし、ディレクトリオブジェクトを作成する。

```sql
CREATE OR REPLACE DIRECTORY DATAPUMP_DIR AS 'D:\datapump';
```

DataPumpはディレクトリオブジェクトを指定しなければ実行できない。


# バッチ

ディレクトリオブジェクトのパスに配置する。
引数%1にスキーマ名を渡す

```datapump_export.bat
@echo off
cd /d %~dp0

set DumpFile=%1.dump
set LogFile=%1.log

:: エクスポート
expdp DATAPUMP_USER/PASSWORD@localhost/orclpdb directory=DATAPUMP_DIR schemas=%1 dumpfile=%DumpFile% logfile=%LogFile%

:: タイムスタンプの取得
call :getTimeStamp

:: ダンプ・ログのリネームと古いダンプ・ログを削除（更新日7日以上前）
move "%DumpFile%" "%DumpFile%_%TimeStamp%"
move "%LogFile%" "%LogFile%_%TimeStamp%"
forfiles /D -7 /M "%DumpFile%*" /c "cmd /c del @path"
forfiles /D -7 /M "%LogFile%*" /c "cmd /c del @path"

exit /b

:getTimeStamp
	setlocal

	set YYYY=%DATE:~0,-6%
	set MM=%DATE:~5,-3%
	set DD=%DATE:~-2%
	set /a H=%TIME:~0,-9%
	set M=%TIME:~3,-6%
	set S=%TIME:~6,-3%
	if %H% lss 10 (
		set H=0%H%
	)
	endlocal & set TimeStamp=%YYYY%%MM%%DD%-%H%%M%%S%
exit /b
```

実行するときはこんな感じ。

`>datapump_export.bat HOGE_SCHEMA`

これで取った日時のダンプが出来上がります。

# インポート

取ったダンプを別スキーマにインポートするときはこんな感じ。

```
impdp DATAPUMP_USER/PASSWORD@localhost/orclpdb directory=DATAPUMP_DIR dumpfile=HOGE_SCHEMA.dump remap_schema=HOGE_SCHEMA:FUGA_SCHEMA
```

---
調整して便利につかって頂ければ何よりです。
CompletableFuture手始め2 (CompletableFutureを作ってみる)

[CompletableFuture手始め（先ずはFuture)](https://qiita.com/koma_/items/aca99a9f5939609375bd)
の続き

## CompletableFuture
<img src=https://qiita-image-store.s3.amazonaws.com/0/202689/c710deee-5b1a-6576-a675-d63b327a632d.png width=55%>

図の通り、`CompletableFurure`は、
`Future`、`CompletionStage`インターフェースを実装している。
`CompletionStage`はJava8で導入されたインターフェース。

CompletableFutureは、非同期処理を表し、利用可能となった時にその結果を保持する。

##### Futureとは何が違うのか？
`CompletableFuture`
> 明示的に(その値とステータスを設定して)完了できるFutureです。
> その完了時に発生する依存関数およびアクションをサポートし、CompletionStageとして使用できます。 
> [CompletableFuture@Oracle](https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/CompletableFuture.html#complete-T-)

この「完了時に発生する依存関数およびアクションをサポート」が`CompletableFuture`の大きな特徴

`Future`の特徴である、「時間のかかる処理で待たされることがなくなる」に加え、
以下のようなことが行える。

処理の結果が利用可能となった際、
通知を出したり、ラムダ式やメソッド参照により定義されたコールバックを実行したりすることができる。

### 基本的な使用法

```java
public Future<Double> getDoubleAsync(String variable){
    // 計算結果が保持されるCompletableFutureを作成
    CompletableFuture<Double> futureValue = new CompletableFuture<>();
    new Thread( () -> { // 別スレッドで処理を非同期で実行
        try {
　　　　　　　// 時間のかかる処理
            double price = doSomeLongComputation(variable);
　　　　　　　// 結果の値を設定
            futureValue.complete(price);
        } catch (Exception ex) {
            futureValue.completeExceptionally(ex);
        }
    }).start();
    // 計算を待つことなくFutureを返す
    return futureValue;
}
```

上記メソッドの呼び出し方

```java
// 戻り値の型は、Future<Double>
Future<Double> futureValue = getDoubleAsync("test");
try {
    // ここで呼び出す。値が利用可能となっていなければブロックされる
    double value = futureValue.get();
    System.out.printf("value is %.2f%n", value);
} catch (ExecutionException | InterruptedException e) {
    throw new RuntimeException(e);
}
```

#### `SupplyAsync`を使用する場合
`CompletableFuture`クラスには、複数のファクトリーメソッドがある。

> supplyAsync(Supplier<U> supplier)
ForkJoinPool.commonPool()で実行されているタスクが指定されたサプライヤを呼び出して取得した値を使用して非同期的に完了する新しいCompletableFutureを返します。
> [supplyAsync@Oracke](https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/CompletableFuture.html#supplyAsync-java.util.function.Supplier-)

```java
public static Future<Double> getDoubleAsyncHandy(String arg) {
    return CompletableFuture.supplyAsync(() -> doSomeLongComputation(arg));
}
```

`supplyAsync`メソッドを使うと上記のように簡易に`CompletableFuture`を書くことができる。
jQueryで非同期通信のcallbackの記述方法について（success, error, completeは非推奨）

jQueryで非同期通信を書く時には$.ajaxを使いますが、パラメータを覚えられないためテンプレートを投稿しようとして調べていたところ、いつもcallbackに使っていたsuccess, error, completeがdepreciatedになっていたので切り替える必要があることに気づきました。

参照：[jQuery API Documentation](https://api.jquery.com/jQuery.Ajax/#jQuery-ajax-url-settings)

今後は.done(), .fail(), .always()を使うそうです。promise的な記述なので今風ですね。

ということで、だいたい使うものは以下になります。

```javascript
$.ajax({
  type: "POST",
  url: "someurl",
  data: {"some": "parameters"},
  dataType: "json", //結果をjsonで受信する場合
})
.done(function(data) {
  //正常時の処理を記述
})
.fail(function(jqXHR, textStatus, errorThrown) {
  //失敗時の処理を記述
});
```
JavascriptでDateを比較する

指定した時間になったらリンク先を切り替えるような処理をJavascriptで記述してみました。
実際の運用ではJavascriptで取得する時間はクライアントに依存するため、クリティカルな処理には向かないと思いますが、それほど重要でないけどサーバでやるのはちょっと。。。という時に使えます。

```javascript
//チェックする時間をDate型オブジェクトで生成する
let check = new Date('2019/04/09 12:00:00');

//現在時刻を取得する。
let now = new Date();

if(now >= check){
//指定時刻になった時の挙動を記述
//例えばURLを切り替えるなど
}
```
【基本情報技術者試験対策】IDS と IPS

参考サイト:
http://ur0.work/Yfw7

#はじめに
基本情報技術者試験対策で勉強をしていると、IDS と IPS について問われる問題が出てくることが多いので、備忘録も兼ねて記事にしておきます。

#IDS とは
Intrusion Detection System。
侵入検知システム。
ホストやポートをスキャンするような偵察行為や不正侵入などインシデントの兆候を検知し、管理者に通知するシステム。

#IPS とは
Intrusion prevention system。
侵入防止システム。
検知した不正を自動的に遮断する。

#IDS！IPS！2つあわせて……！！
IDPS！！
……とかいったりする場合もあるそうだよ。

#IDSの詳細
IDSは監視方法によって、次の2つのタイプに分けられる。
>ネットワーク型
ホスト型

##ネットワーク型
ネットワークを流れる通信パケットを監視

##ホスト型
監視対象のサーバに置かれ、通信の結果生成されたサーバ上の受信データやログを監視

#IPSの詳細
IDSが「検知(Detection)」するのに対して、IPSは侵入を未然に「防止(Prevention)」することができるから、IDSより優れているって程度の認識でいいかな(逃)

#まとめ
IDS と IPS が、それぞれ何の略称なのか覚えておけば基本情報技術者試験に臨む上では大丈夫そう。
過去問解いてて「それは違うよ！」ってなったら、また更新か別記事かわからんけどなんか書きます。
cachet + bluemix(ibm cloud)

[CachetHQ/Cachet](https://github.com/CachetHQ/Cachet) on [bluemix](https://console.au-syd.bluemix.net)(ibm cloud).

cachetというappをibm cloudで動かす手順を記録します。

```sh
$ git clone https://github.com/CachetHQ/Cachet
$ cd !$:t

# masterでは、bootstrap/autoload.phpのerrorが出るため特定のcommitまで戻す。おそらく原因は、secrity updateの"Bump bootstrap-sass from 3.4.0 to 3.4.1"です
$ git reset --hard b82651f7943619ebc9df46dd5ebbe14f809791d8
$ git checkout -b master

$ cp .env.example .env

# myslqDBが必要になる, herokuのcleardbを使わせてもらいます
$ heroku create $APP_NAME
$ heroku addons:add cleardb:ignite -a $APP_NAME
$ heroku config -a $APP_NAME

$ vim .env
APP_URL=https://$APP_NAME_BLUEMIX.mybluemix.net
DB_DRIVER=mysql
DB_HOST=$DB_HOST
DB_UNIX_SOCKET=null
DB_DATABASE=$DB_NAME
DB_USERNAME=$DB_USER
DB_PASSWORD=$DB_PASS
DB_PORT=3306
DB_PREFIX=null
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

$ vim .bp-config/options.json
{
    "COMPOSER_INSTALL_OPTIONS_DEBUG": [ "--no-dev", "-o"],
    "PHP_VERSION": "{PHP_71_LATEST}",
    "COMPOSER_VENDOR_DIR": "vendor",
    "WEBDIR": "public",
    "PHP_EXTENSIONS": ["bz2", "pdo", "zlib", "curl", "mcrypt", "mbstring", "mysqli", "gd", "zip", "pdo_mysql", "pdo_sqlite","iconv",  "openssl" ]
}

$ vim manifest.yml
applications:
- path: .
  name: cachet
  memory: 256M
  command: null
  buildpack: https://github.com/cloudfoundry/php-buildpack

$ mkdir htdocs
$ mv database htdocs/

$ php -v
7.1.27

# 修正箇所を示します。
$ vim composer.json
    "require": {
        + "php": "7.1.27"
    }
    "autoload": {
        "classmap": [
            + "htdocs/database"
        ]
    }
    "config": {
        "platform": {
            + "php": "7.1.27"
        }
    }

$ php artisan key:generate
$ php artisan migrate --force

$ cf login
$ cf api https://api.ng.bluemix.net
$ cf target
$ cf target -o $USER -s dev
$ vim .gitignore
- .env

$ composer install --no-dev -o
$ composer update

# previewする
$ cd public
$ php -S localhost:8000
$ php artisan up
$ php artisan down

$ git add .
$ git commit -m "first"
$ cf push $APP_NAME_BLUEMIX
```

## 参照

`.bp-config/options.json` : https://docs.cloudfoundry.org/buildpacks/php/gsg-php-config.html

cachet docs : https://docs.cachethq.io/docs/installing-cachet

## ヒント

### bluemix上でmigrateが失敗する

おそらく、`PHP_EXTENSIONS": [ "mysqli", "pdo_mysql ]`あたりを追加すると行けると思います。

### 問題を調査する

```sh
# buildpackを使ってdeployは正常に完了する場合
$ cf ssh $APP_NAME_BLUEMIX
$ HOME=/home/vcap/app source app/.profile.d/finalize_bp_env_vars.sh
$ php -v

# web server関連のlogを表示する
$ cf logs $APP_NAME_BLUEMIX --recent

# オプションを有効にする
$ cf set-env $APP_NAME_BLUEMIX OPTIMIZE_MEMORY true

# deployする際に、詳細にlogを表示する
$ cf set-env $APP_NAME_BLUEMIX BP_DEBUG true
or
$ ibmcloud app env-set cachet BP_DEBUG true
```

### issueを読む

問題が発生したとき、こちらにissueを書きました。参考になるかもしれません。

https://github.com/cloudfoundry/php-buildpack/issues/295

### php.ini

おそらく、このあたりが参考になると思います。

```sh
$ cf ssh $APP_NAME_BLUEMIX
$ vi ~/app/php/etc/php.ini
```

https://github.com/cloudfoundry/php-buildpack/blob/master/defaults/config/php/7.1.x/php.ini


動いた日付 : 2019年04月04日