OmniAICreator/Qiita-1.07M huggingface dataset:
[C++]関数のデフォルト引数の指定でハマった件

#概要
関数のデフォルト引数の指定実装でちょっとハマった件のめも

#環境
MacOSX10.13
XCode8.3.3
C++11

#ソース
```
void hoge (char* foo = "bar");

void hoge (char* foo = "bar"){
    
}

int main() {
    
    hoge();
    
}
```

- 以下のビルドエラーが発生した。

```
Redefinition of default argument
```

#原因
ヘッダーとソース両方で、デフォルト値を設定していた為

#修正後のソース
```
void hoge (char* foo = "bar");

void hoge (char* foo){　　　　//修正前：char* foo = "bar"
    
}

int main() {
    
    hoge();
    
}
```

- エラーメッセージはよく見ないとハマりますね。
- メッセージを見ると一目瞭然でした。
- Redefinition of default argument（意訳：デフォルト引数が再定義されています。）
アルゴリズムの超基本　線形探索と二分探索

アルゴリズムを勉強すれば最初に出会うであろう線形探索と二分探索をまとめてみる。

＊線形探索（リニアサーチ）……リスト化されたデータを先頭から順に分析。ターゲットが見つかったところで探索終了（break)

コードの記述がめちゃくちゃ簡単だけど、データの大きさがめっちゃ大きい場合、ステップ数が多くなるため向いてない。

実際にコードを書くとこんな感じ（php）
(例　ターゲットを3とする。リスト化された数列の中から探し出す。）

```php:search.rb

<?php

for($i=0, $i<count($list) $i++){
if ($list{$i} == 3){
print($i);

break;

}

}
```


二分探索……配列をソートしたのち、配列の中央を抽出。ターゲットが配列中央と等しいか、大きいか、小さいかを比べる。
①等しい場合…探索終了
②小さい、大きい場合…該当する半分を更に半分にし中央を抽出。ターゲットとの比較を再び行う。
これを繰り返し、ターゲットを見つける。
線分探索に比べ実装に手間がかかるが、データが膨大であればあるほど作業時間短縮に効果を発揮する。

コードを書くとこんな感じ?（php）
（例　1～100の数字の中からターゲットである28を見つける）

```php:search.rb

<?php

$nums = range(1,100)

$tar = 28

function search($nums $target){

$length = count($nums);

$half = $length / 2;

$pivot = int($half);

if ($nums[$pivot] === $tar){

print ($tar);

break;}

elseif ($nums[$pivot] > $tar{
  search(array_slice($nums, 0, $pivot), $tar);}

else{
  search(array_slice($nums, $pivot), $tar);
}
}
Android Nougat対応についてまとめ

# Android Nougatとは
公式：https://developer.android.com/about/versions/nougat/android-7.0
Android 7.0のこと。
何故Nougatかというと、毎versionでお菓子の愛称を付けているから。
6.0はMarshmallow、8.0はOreo。
なぜPの話題ではなくNougatの話題なのかといえば、仕事でNougat対応していないアプリを一気にOreo対応までさせるために個人的にまとめたかったため。

# 機能的な変更点
参考：[Android 7.0 Nougat(ヌガー)の新機能・変更点・不具合まとめ](http://androidlover.net/android-os/android-m/android-m-surely-releases-2015.html)

* Android 7.0ではマルチウィンドウが正式採用
* 新機能「データセーバー」使用でモバイルデータ通信時のパケット消費を節約できる
etc

古い話なので詳細は参考URLの方で。

# 開発面での変更点
公式：https://developer.android.com/about/versions/nougat/android-7.0-changes

詳細は公式に譲るとして、以下にいくつかの部分のみ抜粋。

| 項目 | 概要 |
|:--|:--|
| Dozeモードの改良 | 端末を電源と接続せずに画面をオフにすると、端末が静止していなくても CPU およびネットワーク制限のサブセットがアプリに適用される |
| Project Svelte:バックグラウンド処理の最適化 | CONNECTIVITY_ACTION、ACTION_NEW_PICTURE、ACTION_NEW_VIDEOの暗黙的ブロードキャストが削除 |
| ファイルシステムの権限変更 | プライベートディレクトリにアクセス制限。MODE_WORLD_READABLE や MODE_WORLD_WRITEABLE を使用して権限緩和しようとすると、SecurityException がトリガーされる等 |
| アプリ間のファイルの共有 | 自身のアプリ外への file:// URI の公開を禁止する StrictMode API ポリシーが適用される等 |
| NDK | NDK 以外のライブラリを動的にリンクできなくなる |

# Nougat対応系記事
[Android N で 注意すること (その1 : 暗黙的なintentの挙動変更)](https://qiita.com/hidenorly/items/baf2735701e472569c07)
[Android7.0以上のバージョンではPeriodicなJobのintervalを１５分以下にすることができない](https://qiita.com/mu-777/items/aa69de4a9a50aad35976)
[Android7に更新すると音が鳴らなくなる・音が消える](https://qiita.com/sadak/items/dc5ccf12da901c0ba334)
[Android Nのマルチウインドウ対応について調べて驚いたところ](https://qiita.com/takahirom/items/6efc39a7bfe00144ff32)
[Android N での file:// スキーマによるファイル共有の挙動](https://qiita.com/Shiozawa/items/06ea0dd423c63c20c2f8)
[Android Nでたくさんの通知をまとめてみたよ](https://qiita.com/syarihu/items/3f4a8cb3c93f00dc03ee)
[Android マルチウインドウのライフサイクル](https://qiita.com/Shiozawa/items/456438cf5995952c01e8)

# その他のリンク
[[Android]Androidバージョンと対応するAPIレベル/コードネーム一覧](http://to-developer.com/blog/?p=2154)
[AndroidのAPI LevelとVersionの対応関係一覧表](https://feel-log.net/android/api-level/)

# 後書
もう結構前の話だし、今はOreoがベースでPieに移行する話が出てるので、情報自体が少ないですね。。
さほど対応事項や懸念事項はなさそうな感じがします。
Vim — q とコロン ( q: ) で出てくるあいつは何と呼ぶのか > 「コマンドライン・ウィンドウ」らしい

Vimを終了 ( `:q` ) させようとすると、たまに押し間違えてでてくるあいつ。

コマンドラインウィンドウ。
カタカナで書くと山口百恵の曲っぽい。

もしくは単に「コマンドウィンドウ」と呼ぶみたいだ。

![image](https://user-images.githubusercontent.com/13635059/44454133-a8c8a780-a635-11e8-9611-6817ccd3d153.png)

## 用途用法

通常の1行のコマンドモードとは違って、Vim的なキーストロークやショートカットキーなどを保ったまま、コマンド履歴を扱えたり、コマンドを打てるっぽい。

Enterでコマンド実行。
`:q` でウィンドウから抜けられる。 ( `q:` ではない )


いいね！


「[vimでコマンドラインウインドウを使わないのはもったいない](https://qiita.com/shiena/items/d73ca1dd9d2855c98829)」 の「履歴をvimのコマンドラインに送る」という説明に納得。

## しかし、めちゃくちゃググりにくい

英語で思いつく限りの単語でググっても出てこないレベル。
ググり方が悪いのだろうか？

- Google "Vim q and colon" (思うような結果なし)
- Google "Vim q before colon" (思うような結果なし)
- Google "Vim colon after q" (思うような結果なし)
- Google "Vim command line q colon" (思うような結果なし)

名前が分からないとそもそも始まらない。

vimの画面には `Command Line` と表示されていることを頼りに `Vim command line q ` とぐぐったらようやくヒットした。

## ドキュメント


```
6. Command-line window				*cmdline-window* *cmdwin*

							*command-line-window*
In the command-line window the command line can be edited just like editing
text in any window.  It is a special kind of window, because you cannot leave
it in a normal way.
{not available when compiled without the |+cmdline_hist| or |+vertsplit|
feature}

OPEN						*c_CTRL-F* *q:* *q/* *q?*

There are two ways to open the command-line window:

```


[Vim documentation: cmdline](http://vimdoc.sourceforge.net/htmldoc/cmdline.html)

## 参照

```
Vim command window

...

q: — Open with a command history from normal mode
q/ — Open with a search history from normal mode (to search forward)
q? — Open with a search history from normal mode (to search backward)
Ctrl+F — Open with a command history from command mode
```

[Vim command window | Arabesque](https://sanctum.geek.nz/arabesque/vim-command-window/)

## あわせて読みたい？

- [Qiitaに記事を書く動機は「ググりにくい記事を、ググりやすく」するためでOK - Qiita](https://qiita.com/YumaInaura/items/e83df9a45836f7b2929b)
- [vimでコマンドラインウインドウを使わないのはもったいない - Qiita](https://qiita.com/shiena/items/d73ca1dd9d2855c98829)

## Thanks to

[Vim — コマンド入力モードで移動するショートカット (普通のショートカットが効かない) - Qiita](https://qiita.com/YumaInaura/items/2ca09661f5197386aae9) でコメントいただいた @shiracamus さん

## Links

- [Vim — What is the name of "q and colon" mode? ( A. command-line window )](https://gist.github.com/YumaInaura/8deb53846b8a9edf243b5589c5dda938)
- [Medium—imported](https://medium.com/supersonic-generation/vim-what-is-the-name-of-q-and-colon-mode-a-command-line-window-25bf42f8f776)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Windows の PHP 起動時、追加したモジュールが読み込めない時に疑うポイント


## 発生する事象

PHP の起動時（あるいは Apache などの起動時）に PHP のエラーログに以下のようなエラーが記録されている場合です。

```
PHP Warning: PHP Startup: Unable to load dynamic library '...\xxx.dll' - 指定されたプロシージャが見つかりません。 in Unknown on line 0
```

## はじめに

こちらを参照して、疑わしいところがあればつぶしておきます。

[【PHP】追加したモジュールが読み込めない時に疑うポイント - Qiita](https://qiita.com/nnmr/items/778c3e9c4dbb7fb25a73)

## php.ini が間違っていない場合

php.ini で extension 関連の設定が間違っていない場合、また同じ extension に対して２行の Warning が出るような場合、その dll の__依存モジュール__が読み込めていない可能性があります。依存モジュールはモジュールごとに異なります。

以下、モジュールごとに疑われる可能性を記します。

### php_curl.dll

libeay32.dll と ssleay32.dll とにパスが通っているか、または httpd.conf で LoadFile しているか確認します。

また、パスが通っていて PHP の起動自体には成功している場合も、実行時に以下のようなエラーが出ることがあります。

```
... Fatal error: Call to undefined function curl_init() ...
```

この場合、`libeay32.dll` と `libssh2.dll` と `ssleay32.dll`（いずれも PHP に同梱されていると思います）が Apache の bin フォルダに入っていることと、PHP が参照しているものと同じものかどうかなどを確認します。（[参考](http://php.net/manual/fr/curl.installation.php)）

私は PHP の 5.6.31 から 5.6.37 への入れ替え時にこのエラーを経験しました。PHP の入れ替えでも発生するときと発生しないときがあります。

### php_oci8.dll

Oracle Instant Client をインストールするのが近道とのこと。おそらく oci.dll にパスが通っているか、または httpd.conf で LoadFile しているかしないといけないのでしょう。

### php_mysql.dll

libmysql.dll と libpq.dll と libmcrypt.dll とにパスが通っているか、または httpd.conf で LoadFile しているか確認します。

### php_pgsql.dll, php_pdo_pgsql.dll

libpq.dll にパスが通っているか、または httpd.conf で LoadFile しているか確認します。

### php_wfio.dll

PHP 7.1 以降は不要だと思います。[参考](https://github.com/kenjiuno/php-wfio)
SROS2スイッチングスクリプト

ROS2の動作環境がある場合、SROS2のセットアップは環境変数を設定するだけなので大したことはないのですが、SROS2をon/offするたびに、いちいち3つ設定するのも面倒なのでスクリプトを作りました。

# 使い方
SROS2をオンにするときは
source sros_switch.sh on

SROS2をオフにするときは
source sros_switch.sh off

# コード

```bash:sros_switch.sh
#!/bin/bash


if [ $# -eq 1 ]; then
	if [ $1 = "on" ]; then
		echo "set environment variables"
		export ROS_SECURITY_ROOT_DIRECTORY=~/sros2_demo/demo_keys #適当なディレクトリに変えてください
		export ROS_SECURITY_ENABLE=true
		export ROS_SECURITY_STRATEGY=Enforce
	elif [ $1 = "off" ]; then
		echo "clear environment variables"
		unset ROS_SECURITY_ROOT_DIRECTORY
		unset ROS_SECURITY_ENABLE
		unset ROS_SECURITY_STRATEGY
	else
		echo "check argment"
	fi
else
	echo "check argment"
fi
```
Doctrine2でQueryBuilderを使ってUPDATE xxx SET hoge = NULLする方法

```php
class XxxRepository extends EntityRepository
{
    public function clearHogeColumn(): void
    {
        $this->createQueryBuilder('x')
           ->update(Xxx::class, 'x')
           ->set('x.hoge', ':null')
           ->setParameter('null', null)
           ->getQuery()
           ->execute()
        ;
    }
```
RailsでHandsOnTableを利用するベストプラクティス

##HandsOnTableについて

基本的な使い方はこちらの記事が詳しいです。
https://qiita.com/opengl-8080/items/ac19deec388c357cd498
https://qiita.com/opengl-8080/items/9d25e106ff48b66cb908

Jsでこれだけきっちり動くグリッドコンポーネントは本当に使いやすいです。
今回はコンポーネントをRailsでうまいこと動かすためのプラクティスをいくつか紹介します。

##前提条件の説明

####今回はAjaxをバリバリ使っているので、まだJquery依存な形で作成していきます。
####ページング処理には、Kaminariを利用しています。
####Rails5以上推奨です。
yarn使った方が、良いので。
####セットアップについては省きます。
yarnで、HansonTable入れたり、モデル作成部分は説明しません。
今回は一例として、ユーザー管理画面の作成としてみます。

##まずはコントローラーから

最初の表示用にhtmlを利用し、データの取得には*.erb.jsを利用します。
コントローラー内部でうまく使い分けしています。

こうすることで、1回目の読み込み処理を遅延読み込みにし、初回表示速度を早めています。

###Controller(users_contoroller.rb)
```*.rb
class UserssController < ApplicationController
  # GET /users
  def index
    respond_to do |format|
      format.html {}
      format.js {
        @users= User.page(params[:page])
      }
    end
  end
end

```

###index.erb.html
```*.erb.html
<div id="hot" class="cursor"></div>
<div id="paginator"></div>
<script>
  var hotElement = document.querySelector('#hot');
  var columns = [{  
      title:"ID",
      data: "id",
      readOnly: true,
      type: 'text',
  },{   
      title:"ユーザー名",
      data: "name",
      readOnly: true,
      type: 'text',
  }]
  var hotSettings = {
    data: {},
    columns: columns,
    };
  var hot = new Handsontable(hotElement, hotSettings);

  var loadData = function(){
    $.ajax({type:"GET",url:"/users",dataType:"script"});
  };

  loadData();

</script>

```
###HTMLについて
本来なら、JSを分けるべきですが、一旦同じファイルに記載しています。
Jsにて、HansOnTableのセットアップを行っていますが、この時点で、データは空です。

###Ajaxでのデータ読み込み
このajaxでの処理がポイントになります。
dataType:"script"とすることで、index.js.erbに記載したscriptの処理を実行することができます。
この方法は、link_toなどで、remote:trueの処理を書く場合と同じ方法ですね。


###View(index.js.erb)
```*.js

// URLの書き換え処理
history.replaceState("permit",null,"<%= request.url %>");  

// ページングと、検索条件の表示を更新
$("#paginator").html("<%= j paginate(@user,remote:true) %>");

// Gridデータを更新
hot.loadData(<%= raw ActiveModel::Serializer::CollectionSerializer.new(@user).as_json.to_json %>);

```
Ajaxからの読み込み処理、index.js.erbを利用したデータ描画を行います。

ここで、hansontableにJson化したUserデータを挿入しています。
加えて、URLの書き換えも行っています。初回読み込み時には必要ありませんが、
ページング処理や、検索条件の変更などがあった場合に使えます。

##Kaminariを利用したページングの使い方。

今回はKaminariのデフォルトテンプレートを生かしたまま動作するようにしています。

paginateでHtmlを生成し、そのままDivの中身を差し替えしています。
remote:trueを指定することで、ページング処理から呼ばれるときも、index.js.erbで処理されるため、
レイアウトは更新されず、HandsOnTableの中身と、ページネーションだけ更新されていきます。

この方法を利用して、実運用では、検索条件のテンプレ更新も使っています。
js.erbを利用して、コンポーネントごと差し替えをしていると、Jsが破綻しないので、オススメです。
（turbolinkつかえっていう話もありますが）

##まとめ

データをjson読み込んだりするのを非同期処理で書くのは難しいですが、こうしてIndex.js.erbに書くと、可読性が高く、不具合が起きにくい書き方にすることができます。

Paginationがそのままテンプレートとして、利用できるのは大きいですね。
この方法をそのまま利用して、検索条件やページごとの変動項目の書き換えなども可能です。

細かいプラクティスとしては、エラーハンドリングは書かず、別途documentでAjax:errorイベントなどを拾ったり、error.js.erbを作成して、アラートを表示させたりしています。

こうすることで、比較的Jsを書かずに、データの更新処理かけるので、ぜひ利用してみてください。
【AWS公式ドキュメントを噛み砕く】Lambdaとは？

# はじめに
結構割愛してるので、正しい情報は公式ドキュメント見てください。
ってか、lamdaじゃなくて、lam **b** daなのね・・・

ぶっちゃけ、lambdaは大した文章量じゃないので、公式ドキュメント読み切れると思う。
（なので、この記事なんて読まずにそっちへGO）

# 概要
「[ここ](https://aws.amazon.com/jp/lambda/)」の話

## 利点
なんか、文章を箇条書きに変えただけになった。

**サーバー管理が不要**

- サーバーのプロビジョニングや管理は必要ありません。

**継続的スケーリング**

- 自動的にアプリケーションをスケールします。


**ミリ秒単位の課金**

- 以下で課金するぜ（それ以外は課金されないよ！）
    - コードが実行される 100 ms ごと
    - コードがトリガーされた回数

# 特徴
「[ここ](https://aws.amazon.com/jp/lambda/features/)」の話。

11個を横に並べるのはちょっと多くね？
（一部、疲れたので記載してません）

- **カスタムロジックで他の AWS サービスを拡張**
    - S3やDynamoDBに簡単に組み込めるらしい
- **カスタムバックエンドサービスの作成**
    - クライアント側（スマホとか）に実装していた処理を、Lambdaに寄せよう！
    - そうすることで、クライアントプラットフォームのばらつきを回避し、バッテリーの消耗を軽減し、より容易な更新を実現できる！
- **独自コードの採用**
    - Lambda特有のフレームワークとかツールは無いので、既存のソースコードをそのまま使えるよ！
    - サードパーティー製のライブラリも使えるよ！
- **完全に自動化された管理**
    - インフラはAWSのサービスが勝手によろしくやるから気にしなくていいよ！
- **組み込みの耐障害性**
    - 高可用性！
    - メンテナンスの時間帯や定期的なダウンタイムはありません。
- **自動スケーリング**
    - リクエスト受信の回数に合わせて自動的にスケール
    - コードが処理できるリクエスト数に上限はありません。
- **Amazon CloudFront リクエストに応答してコードを実行**
- **複数の関数の調整**
- **統合型セキュリティモデル**
    - SOC、HIPAA、PCI、ISO に準拠しています。
- **利用に応じた支払い**
    - 料金は 100 ミリ秒の増分で計算されます
- **柔軟性のあるリソースモデル**
    - 割り当てるメモリ量を選択すると、AWS Lambda はそれに比例した CPU パワー、ネットワーク帯域幅、ディスク I/O を割り当てます。

# 開発者ガイド
日本語対応してあるぜ！やったぜ！

## Amazon Lambdaとは
「[ここ](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html)」の話

「[入門動画](https://aws.amazon.com/jp/lambda/)」を見るのが良さそう。
基本的には概要と同じ話しか無い。

## ユースケース
全部は取り上げない

### SQS
「[ここ](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-sqs.html)」の話

ちゃんと設定すると、以下を勝手にやってくれるらしい。

- 自動的にメッセージを取得して、ターゲットの Lambda 関数にルーティングします。
- Lambda 関数が正常に完了すると、メッセージを削除します。

**注意事項**

- **同期呼び出し** – AWS Lambda は、RequestResponse 呼び出しタイプを使用して Lambda 関数を呼び出します。
- **イベント構造** – Lambda 関数が受け取るイベントは AWS Lambda が読み取る Amazon SQS キューのメッセージです。

上記対応のため「CreateEventSourceMapping」「UpdateEventSourceMapping」を使うのが良いらしい。
そして使う際に以下注意が必要とのこと。

- **BatchSize**: AWS Lambda が各 ReceiveMessage 呼び出しから取得するレコードの最大数。
- **Enabled**: 指定された Amazon SQS キューのポーリングを開始する必要がある AWS Lambda を通知するフラグ。
- **EventSourceArn**: AWS Lambda が新しいメッセージをモニタリングする Amazon SQS キューの ARN (Amazon リソースネーム)。
- **FunctionName**: AWS Lambda が設定した Amazon SQS キューで新しいメッセージを検出したときに呼び出す Lambda 関数。

### DynamoDB
「[ここ](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-ddb.html)」の話

DynamoDBストリームと直接連携する時の話。

トリガーを作成するには、まずテーブルに対して Amazon DynamoDB Streams を有効にします。次に、ストリームに対して発行する更新を処理する Lambda 関数を記述します。

- **ストリームベースモデル** – これは、AWS Lambda がストリームを 1 秒間に 4 回のレートでポーリングし、新しいレコードを検出すると、更新イベントをパラメータとして渡して Lambda 関数を呼び出すモデルです。
- **同期呼び出し** – AWS Lambda は、RequestResponse 呼び出しタイプ (同期呼び出し) を使用して Lambda 関数を呼び出します。
- **イベント構造** – Lambda 関数が受け取るイベントは、AWS Lambda がストリームから読み取るテーブル更新情報です。

# さいごに
だいたい1時間くらいで読み終わった。

以上
Ionic/Angularと相性抜群のNodeフレームワーク「NestJS」をLambdaで公開する方法

Ionic/Angularでは、TypeScriptを採用しているので、APIからのレスポンスを型定義します。で、常々、「バックエンドでも型定義をして、それをフロントエンドと共有できたら最強では」と思っていたのですが、先日Angularから強い影響を受けたTypeScript製Node.jsフルスタックフレームワーク「NestJS」の存在を教えてもらいました。

どのようなものかは [【Node.js】TypeScript製Node.jsフルスタックフレームワーク Nest 導入編](https://nowscripting.com/posts/blogs/node_nest_intro)をご覧ください。

これを採用したことにより、今はInterfaceをフロントエンド・バックエンドで共有できていて、とても快適に開発を進めていたのですが、「いざ公開」の段になって、Lambda + API Gatewayで苦戦したのでまとめておきます。

# Lambdaで公開する手順
Serverless Framework経由にLambdaに公開する設定については https://github.com/rdlabo/serverless-nestjs でパッケージ一式で公開しています。

## 既存のプロジェクトに設定する方法
### 1. Serverless FrameworkとLambda用のパッケージを追加

```bash
$ npm install aws-lambda aws-serverless-express express
```

### 2. Lambda関数用の `src/index.ts` を作成

```src/index.ts
import { Context, Handler } from 'aws-lambda';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { Server } from 'http';
import * as serverless from 'aws-serverless-express';

const express = require('express')();
let cachedServer: Server;

function bootstrapServer(): Promise<Server> {
  return NestFactory.create(AppModule, express)
    .then(app => app.enableCors())
    .then(app => app.init())
    .then(() => serverless.createServer(express));
}

export const handler: Handler = (event: any, context: Context) => {
  if (!cachedServer) {
    bootstrapServer().then(server => {
      cachedServer = server;
      return serverless.proxy(server, event, context);
    });
  } else {
    return serverless.proxy(cachedServer, event, context);
  }
};
```

通常公開と違い、Lambdaの関数としてNestJSを利用するので、専用の公開ファイルを用意する必要があります。

### 3. Serverless Framework設定ファイルの serverless.yml を追加

```serverless.yml
service: serverless-nestjs

provider:
  name: aws
  runtime: nodejs8.10
  region: ap-northeast-1

package:
  exclude:
    - .git/**
    - src/**
    - test/**
    - nodemon.json
    - README.md

functions:
  index:
    handler: dist/index.handler
    events:
    - http:
        cors: true
        path: '/'
        method: any
    - http:
        cors: true
        path: '{proxy+}'
        method: any
```

regionは、東京で設定します。また、先ほど作成したLambda用関数を、Lambdaに紐つけるために、functionsを設定します。NestJS内でのルーティングをLambda経由で反映させるために `path: {proxy+}` をトップディレクトリとは別に設定します。

## デプロイ方法

```bash
$ npm run prestart:prod
$ sls deploy
```

`npm run prestart:prod`を実行すると、`src/`フォルダからtscを使って`dist`ファイルを生成します。そのあと、Serverless Frameworkのコマンドを叩いてデプロイを実行してください。

うまくいくと、 https://mmjdx4zxmc.execute-api.ap-northeast-1.amazonaws.com/dev/ ができます。

# おまけ
IonicとNestJSのInterfaceをどうやって共有するかについては、こちらで「どうしたらいいかなぁ」とツイートしておりますのでご参考になりましたら幸いです。これがベストプラクティスだ！！っていうのありましたらコメントかリプライでご教示いただけましたら幸いです。
https://twitter.com/rdlabo/status/1031760620654276608
Unityで音ゲーのアルゴリズム・制作の際気をつけること

# 制作とアルゴリズム編
### 譜面制作

譜面はCSVファイルやJsonファイルなどのテキストファイルを用いてつくります。
制作する音ゲーに合わせた譜面制作ツールを自作するのが望ましいですが、手っ取り早く済ませたい場合はsetchi氏の「__NoteEditor__」がオススメです。
>[NoteEditor紹介ページ(HatenaBlog)](http://baba-s.hatenablog.com/entry/2018/04/16/085900#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB)

直感でノーツを置けて、できた譜面はJsonファイルとして出力してくれます。

### 譜面を読み込む

できた譜面を音ゲーで読み込むには、例えばJson形式なら
`OtogeFumen fumen = new OtogeFumen`でノーツの生成に必要な変数を持ったクラス、OtogeFumenのインスタンス(実体)を作っておき、

`fumenjson = Resources.Load<TextAsset>("パス").ToString`でJsonファイルの中身をstring型で受け取って、

`JsonUtility.FromJson<OtogeFumen>(fumenjson)`を使って作ったインスタンスに値を反映します。

その後は`fumen.notestype[i]`などで必要な情報を使うわけですね。

詳しくはLemontea氏が分かりやすくまとめてくれています。

>[Unity Json形式とファイルへの書き出し・読み込み](https://www.sawalemontea.com/entry/2017/09/22/112538)

### 譜面制作ツールを自作する際、必要な値は？

譜面制作ツールを自作する場合、先ほどの「fumen」クラスには、
・ノーツが落ちてくるレーン(int型)

・曲が始まってからの時間(float型の配列)
または
・小節の位置(int型の配列)と、BPM(float型)
が必要です。小節位置とは、4分音符が置ける位置に通し番号をつけた、その番号のことです。

ロングノーツ(長押しノーツ)を入れたいなら、
・ノーツのタイプ(通常ノーツかロングノーツか)

・ロングノーツの始点と終点の、曲が始まってからの時間
または
・ロングノーツの始点と終点の小節位置に通し番号を付けたもの
が必要です。

### ノーツの座標を計算する

今回は小節位置で計算する方法をとって考えます。x,z方向に平らな平面を想像してください。
z方向にノーツが落ちてくる、4レーンの音ゲーと仮定すると、

x座標はそのまま、ノーツが落ちてくるレーンを記録した変数(int型)をswitchを使って振り分けます。
y座標は変化がないので固定の値です。

z座標ですが、まずは最も細かく通常ノーツを配置したときの間隔(時間)を出します。
60(秒)/(BPM*4)で算出できます。ここでの4は4分音符の4です。

次に、小節位置と、ノーツ間の最短間隔を使ってノーツを押すタイミング(曲が始まってからの時間)を出します。
(小節位置)*(ノーツ間の最短間隔)で算出します。

そして、ノーツを押すタイミングと、ノーツが動く速さ(距離/秒)から、ノーツの座標を出します。
(押すタイミング)*(速さ)です。

しかし、このままでは判定ラインからの相対的な座標になってしまうので、
(ノーツのz座標)+(判定ラインのz座標)
で、World座標にします。

これで、ノーツの座標が計算できました。

### 判定する

ノーツと判定ラインのCollider衝突判定を使うと、若干の誤差が生まれるうえに、transform.positionをUpdate関数で書き換える方法でノーツを動かしている場合、小さなワープの連続と同じなので衝突判定をすり抜けてしまいます。

なので、基本的には時間で判定します。
`Time.timeSincelevelLoad`を使うとシーン読み込みからの時間を取得することができます。
キー押下時の時間を、シーン読み込みからの時間をfloat型の変数に代入することで保存し、判定に使います。

キーが押されたら、そのキーに対応したレーンのノーツを`GameObject.FindGameObjectsWithTag`を使って取得し、foreachを使って距離を一つずつ比較し、最終的に判定ラインに最も近いノーツを取得します。

そして、判定ラインに最も近いノーツの、押すべきタイミングを使い、判定します。

キーを押すべきタイミングは「ノーツの座標を計算する」で出したものを使います。
(ノーツの座標を計算する際に配列に詰めておきます)
(押すべきタイミング)-(キー押下タイミング)の絶対値をとり、if elseで振り分けて判定します。

判定は以上です。

# 気をつけること編
### 重い処理をしない

Unityの関数の中でもInstantiateやDestroyは非常に重たい関数です。
プレイ中にこれらの関数を使うのは、誤差を著しく嫌う音ゲーにとって好ましくありません。

よって、ノーツの生成はStart関数の中に書きましょう。
また、Destroyの代替として、`GameObject.SetActive`を使います。この関数でノーツのオブジェクトを無効化することで、消えたように見せることができます。`GameObject.SetActive`は「自分自身」には使えないので、他のオブジェクトにアタッチしたスクリプトから実行しましょう。

音ゲー制作で気をつけることはこれくらいです。

# ひとこと
音ゲーは簡単なものであれば計算は算数の知識だけで済みます。
その分演出をどれだけ凝るかというものなので、気になったものはどんどん検索して、知識を吸収・ゲームに反映しましょう！
Mac で Julia #4 Control Flow


前回に引き続きJuliaについてです。

[ドキュメント](https://docs.julialang.org/)に沿って試していきます。

## Compound Expressions

```julia
julia> a = begin
       x = 1
       y = 2
       x + y
       end
3

julia> a
3

julia> x
1

julia> y
2
```

なんて言い方がいいかわかりませんが、表現の中にbegin-endが使えるそうで。

```julia
julia> b = (x=3;y=4;x+y)
7

julia> b
7
```

カッコとセミコロンでも表現できるそうです。

### Conditional Evaluation

```julia
julia> function test(x,y)
                  if x < y
                      relation = "less than"
                  elseif x == y
                      relation = "equal to"
                  else
                      relation = "greater than"
                  end
                  println("x is ", relation, " y.")
              end
test (generic function with 1 method)

julia> test(1,2)
x is less than y.

julia> test(1,1)
x is equal to y.

julia> test(2,1)
x is greater than y.

julia> test(2,1.0)
x is greater than y.

julia> test(2,'a')
ERROR: MethodError: no method matching isless(::Int64, ::Char)
```

まぁ普通でしょうか。

```julia
julia> x = 5
5

julia> 1 < x < 6
true

julia> 5 < x < 7
false
```

数式っぽくかけるはいいですね！

### Repeated Evaluation: Loops

```julia
julia> i = 1;

julia> while i <= 5
       println(i)
       global i+=1
       end
1
2
3
4
5
```

globalとして呼び出さないとだめなんですね。

```julia
julia> for i= 1:5
       println(i)
       end
1
2
3
4
5

julia> i
6

julia> for a = ['a' 'b' 'c']
       println(a)
       end
a
b
c
```

次はfor文です。```1:5```というのはrange objectというそうです。

```julia
julia> for x in ['a' 'b' 'c']
       println(x)
       end
a
b
c

julia> for x ∈ ['a' 'b' 'c']
       println(x)
       end
a
b
c
```

よくあるinの他に∈も使えました。ますます数学ちっく！


```julia
julia> for i = 1:2, j = ["a" "b" "c"]
       println("$i -- $j")
       end
1 -- a
1 -- b
1 -- c
2 -- a
2 -- b
2 -- c
```

ループの入れ子でfor-for-と続けなくていいんです。

### Exception Handling

```julia
julia> f(x) = try
       sqrt(x)
       catch e
       println(e)
       -x
       end
f (generic function with 1 method)

julia> f(4)
2.0

julia> f(-1)
DomainError(-1.0, "sqrt will only return a complex result if called with a complex argument. Try sqrt(Complex(x)).")
1
```

try-catchも普通に使えます。

```julia
julia> f(x) = try
       sqrt(x)
       catch e
       println(e)
       -x
       finally
       print("fin!")
       end
f (generic function with 1 method)

julia> f(2)
fin!1.4142135623730951

julia> f(-1)
DomainError(-1.0, "sqrt will only return a complex result if called with a complex argument. Try sqrt(Complex(x)).")
fin!1
```

finallyも使えますが先にfinally句のがくるのかな？

今日はこの辺で。
Vim — コマンド入力モードで移動するショートカット (普通のショートカットが効かない)

## 結論から書く

- `CTRL-B` (行頭に移動)
- `CTRL-E` (行末に移動)

を覚えておくだけで相当便利になりそう。

## ショートカット一覧

```

CTRL-B or <Home>
        cursor to beginning of command-line
CTRL-E or <End> 
        cursor to end of command-line
CTRL-H              
<BS>        Delete the character in front of the cursor (see |:fixdel| if
        your <BS> key does not do what you want).
<Del>       Delete the character under the cursor (at end of line:
        character before the cursor).
CTRL-W      Delete the |word| before the cursor.  This depends on the
        'iskeyword' option.
CTRL-U      Remove all characters between the cursor position and
        the beginning of the line.  
```


## コマンド入力モードとは

`:` `/` とかで出てくるあいつ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/d1dde06d-38ae-c141-88d7-73c52721e45e.png)

正式には『コマンドラインモード」というらしい。(今回はじめて知った)

>Command-line mode is used to enter Ex commands (":"), search patterns
("/" and "?"), and filter commands ("!").

[Vim documentation: cmdline](http://vimdoc.sourceforge.net/htmldoc/cmdline.html)


## 悩み

普通のショートカットがいきなり効かなくなる。

`Ctrl+a` も `^` も `$` も使えないし、なんなの。

と思いつつ Vim 使用頻度が低いので放置していた。

## Versions

- VIM - Vi IMproved 8.1 (2018 May 18, compiled Aug  7 2018 21:57:52)
- Mac OS High Sierra

## Links

- [text editor - Navigating in Vim's Command Mode - Stack Overflow](https://stackoverflow.com/questions/6920943/navigating-in-vims-command-mode)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
複数のcommitをまとめてcherry-pickして、コンフリクトが生じたときの手順

## まずは複数のcommitをまとめてcherry-pickする方法

```
git cherry-pick 123456..abcdef
```

とすれば可能。
ただし、起点の方は **取り込みたいcommitの一つ前の番号** にすることに注意。

## cherry-pick中にコンフリクトが起きたとき
「最初の2つはうまいことcherry-pickされたのに、3つめでコンフリクトしちゃって止まっちゃったわ...」というときにすることの手順。

### 手順
1. コンフリクトを resolve する。（PhpStormを使ってるならツールバーのresolve conflictを使うと便利）
2. コンフリクトを解決しても、そのままcherry-pickをすると

```
ShononoMBP:hoge shono$  git cherry-pick 123456..abcdef
error: a cherry-pick or revert is already in progress
hint: try "git cherry-pick (--continue | --quit | --abort)"
fatal: cherry-pick failed
```

とでる。
どうやら「cherry-pickやってる途中なんですけど、どうします？」と聞いているようなので、 `git cherry-pick --continue` を叩いて「cherry-pick続けます」と意思表示をする。
3. 以降のコミットでコンフリクトが起こらなければ完了。コンフリクトがおきれば再度 1.2. を繰り返す。

#### わけがわからなくなったとき

`git cherry-pick --quit` をすればcherry-pickは一旦とまる。
ただし、コンフリクトするまでに取り込まれたcherry-pickは元に戻らないので、戻したい場合は `git reset --soft abcdef` 等で戻してください。
Retrofit+moshi+kotshiが動かない話

以下のコードを動かそうとすると。``Unresolved reference: KotshiApplicationJsonAdapterFactory``というエラーが出て動きません。

kotshiのReadmeにはKotshiApplicationJsonAdapterFactoryはあなたのカスタムアダプタだと書いてありましたが、他のプロジェクトを見るとapp/build/generated配下に生成されている物を発見しました。
これはkaptで生成させるものなのでしょうか？私のプロジェクトはそうなりません。どうしたら生成されますか？それとも自分で書くものなのでしょうか？その場合はどのように書いたらよいでしょうか？

このコードはどうしたら動くようになりますか？

```gradle
apply plugin: 'kotlin-kapt'
dependencies {
    // 略
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'com.squareup.moshi:moshi:1.6.0'
    implementation 'com.squareup.retrofit2:converter-moshi:2.3.0'
    implementation 'se.ansman.kotshi:api:1.0.4'
    kapt 'se.ansman.kotshi:compiler:1.0.4'
}

```

```kotlin
    override fun onResume() {
        super.onResume()
        simpleService()
    }

    @JsonSerializable
    class Contributor(
            val login: String,
            val contributions: Int,
            @Json(name = "node_id") val nodeId: String
    )

    interface GitHub {
        @GET("/repos/{owner}/{repo}/contributors")
        fun contributors(
                @Path("owner") owner: String,
                @Path("repo") repo: String): Call<List<Contributor>>
    }

    private fun simpleService() {
        val moshi = Moshi.Builder().add(ApplicationJsonAdapterFactory.INSTANCE).build()
        val retrofit = Retrofit.Builder()
                .baseUrl("https://api.github.com/")
                .addConverterFactory(MoshiConverterFactory.create(moshi))
                .build()

        val github = retrofit.create(GitHub::class.java)
        val call = github.contributors("square", "retrofit")

        call.enqueue(object : Callback<List<Contributor>> {
            override fun onResponse(call: Call<List<Contributor>>, response: retrofit2.Response<List<Contributor>>) {
                // Response https://api.github.com/repos/square/retrofit/contributors
                val contributors = response.body()
                for (contributor in contributors!!) {
                    Log.d("simpleService", contributor.login + " (" + contributor.contributions + ") : " + contributor.nodeId)
                }
            }

            override fun onFailure(call: Call<List<Contributor>>, t: Throwable) {
                Log.d("simpleService", t.toString())
            }
        })
    }

    @KotshiJsonAdapterFactory
    abstract class ApplicationJsonAdapterFactory : JsonAdapter.Factory {
        companion object {
            val INSTANCE: ApplicationJsonAdapterFactory = KotshiApplicationJsonAdapterFactory()
        }
    }
```
GCPのサービスアカウント用のキーを発行する方法

# はじめに
サービスアカウントのキー発行手順が分からなかったので、メモしておきます

#　画面遷移
APIとサービス → 認証情報 → 認証情報を作成 → サービス アカウント キー

# サービス アカウント の操作
- 新しい サービスアカウントの作成を選択
  - サービスアカウント名と役割を選択
  - key type は json
viewportで気になった点があったので、改めてviewportを学んでみた

viewportに触れる機会があり、少し手こずったので
改めて学んでみました。

viewport=サイトをスマートフォンサイズに合わせるときに使う。

日本語では「表示領域」という言葉がしっくりくるらしい。

width,height共に200px-10000pxまで指定できる、
デバイス幅に合わせるdevice-width,device-heightがある。

initial-scale（初期倍率）
初期値は1倍

minimum-scale(最小倍率)
初期値は0.25倍

maximum-scale（最大倍率）
初期値は1.6倍

user-scalable（ユーザーのズーム操作の可否）
ユーザー側でズームできるようにするかできないように
指定できる。初期値はyes(1)。
ズームさせない場合はno(0)を指定する。

この形が一番見る形ではないでしょうか。
![スクリーンショット 2018-08-22 16.30.38.png](https://qiita-image-store.s3.amazonaws.com/0/263583/2e217244-44c4-4644-c157-63d40879c02a.png)

MonacaではAndroidやios専用のviewportの
指定ができたりします。
dep-dlを少し直した

大したことではないですが、けっこういろんなフォーマットがあるのでちょっと対応していなかったのに対応しました。
今回は、`k8s.io` にあるのに対応しました:

```xml
            <html><head>
                  <meta name="go-import"
                        content="k8s.io/client-go
                                 git https://github.com/kubernetes/client-go">
                  <meta name="go-source"
                        content="k8s.io/client-go
                                 https://github.com/kubernetes/client-go
                                 https://github.com/kubernetes/client-go/tree/master{/dir}
                                 https://github.com/kubernetes/client-go/blob/master{/dir}/{file}#L{line}">
            </head></html>
```
今まで、`go-import` や `go-source` が複数あるのは想定していなかったのですが、初めてそうゆうのに遭遇して直しました。
[正規表現をサクッと変える程度](https://github.com/take-cheeze/dep-dl/commit/3334a5a8c01cd00a8039cdfafc2698ae81617c2b)で済んだのでよかったです。
取り消し線の文字列を削除

# 取り消し線が設定された文字列を削除
#### むかし書き溜めたVBAのTips
取り消し線が部分的に設定された文字列があるセル範囲を選択して実行すると、取り消し線のある文字列を全部削除する。セル内の文字全部に取り消し線が設定されている場合は削除しない。セル範囲を選択するフォームと合わせて使うと便利。

```
' 取り消し線文字列削除
Sub StrikethroughStringDelete()

  Dim i As Integer
  Dim strTmp As String
  Dim rngTarget As Range

  Application.ScreenUpdating = False
  For Each rngTarget In Selection
    If IsNull(rngTarget.Font.Strikethrough) Then
      ' 256文字以内であれば書式を保持したまま削除可能
      If Len(rngTarget) <= 256 Then
        For i = Len(rngTarget) To 1 Step -1
          With rngTarget.Characters(Start:=i, Length:=1)
            If .Font.Strikethrough = True Then
              .Delete
            End If
          End With
        Next

      ' 256文字より多い場合は書式を破棄して削除
      Else
        strTmp = ""
        For i = 1 To Len(rngTarget)
          With rngTarget.Characters(Start:=i, Length:=1)
            If .Font.Strikethrough = False Then
              strTmp = strTmp & Mid(rngTarget.Value, i, 1)
            End If
          End With
        Next
        rngTarget.Value = strTmp
      End If
    End If
  Next
  Application.ScreenUpdating = True

  MsgBox "完了♪"

End Sub
```
class内のフックを外したりする時のメモ


クラス内のフックについてはうまく外せない事があるが、
クラス側の書き方によって外し方も異なるのでメモ

__construct　からフックする時に get_called_class() にしておくと、外す時に比較的ラクに外せる。

```
class Vk_Mobile_Nav {
	public function __construct() {
		add_action( 'wp_footer', array( get_called_class(), 'menu_set_html' ) );
	}
}
$vk_mobile_nav = new Vk_Mobile_Nav;

// 外す
remove_action( 'wp_footer', array( 'Vk_Mobile_Nav', 'menu_set_html' ) );
```

__construct で $this などで書かれている場合は、
new された グローバル変数を配列に入れて remove_actionすれば外せる。

```
class Vk_Mobile_Nav {
	public function __construct() {
		add_action( 'wp_footer', array( $this, 'menu_set_html' ) );
	}
}
global $vk_mobile_nav;
$vk_mobile_nav = new Vk_Mobile_Nav;


// 外す
global $vk_mobile_nav;
remove_action( 'wp_footer', array( $vk_mobile_nav, 'menu_set_html' ) );
```

下記にも詳しくかかれている。
https://labelog.net/post/820
ファイル差分コマンド

git管理しているけどデプロイにgitを使用していないソースがあり、確認する際に使用したコマンド。
以下の2パターンを使うのがスムーズだったのでメモ

## 差分のあるファイル一覧を出力
- 対象配下を再帰的に(-r)
- 改行コードを無視して(--strip-trailing-cr)
- 特定のディレクトリを除外し(-x)
- ファイル名のみ出力(-q)

```
diff -r --strip-trailing-cr -x "ディレクトリ" -q  [比較対象1] [比較対象2]
```

## ファイル内の差分出力
- 改行コードを無視して(-w)

```
git diff -w [比較対象1] [比較対象2]
```
- 備考
  - git diffはデフォルトで差分が色付き表示
  - git diffは管理対象外のファイルも可 
  - git diffは比較対象除外を指定するオプションがデフォルトでなさそう
php

# foreachとコロン構文
- as 中身を取り出したい条件
    - 例：＄colors as ＄value

- コロン構文
    - 波括弧の開きをコロン、終わりをendを使う
    - 例えば ; ...endforeach

**HTML がよりスッキリかける**

#関数
- function　+関数の名前
    - function(){} echo
- 引数
    - 初期値は引数が設定されなかったときに表示される
- 返り値
    - return　を使う。関数の処理を終了させつつ、返り値を呼び出してくれる
- 関数内で定義したものは、その関数内でのみ有効ある
    - 関数内と関数外に注意

- 組み込み関数
    - ceil, floor, round,rand
    - strlen, mb_strlen, printf
    - count, implode

#アクセス権

- private そのクラスないからのみアクセス可能
- protected　そのクラス＋親子クラスからのアクセス可能
- public　どこからでもアクセス可能

#static キーワード

- インスタンス化しなくても使えるメソッドやプロパティ。　::を使う

#interface

- 必ず実装してほしいメソッド
- implementsをクラスに使う
- 実装漏れを防げる

#ファイルの呼び出し

- require: fetal error 
- require_once phpが自動的にチェック
- include: 　warning
- include_once
- autoload:クラスが未定義であっても自動的に処理がされる
    - spl_auto_register

#名前空間
- 自分が作ったクラスにつけて、他の人と被らないようにする
- 階層的に管理ができる　バックスラッシュで
- namespace
- use・・・asで名前の置き換えができる

#例外処理
- try を使い　
- throw newで自分で例外を投げる
- catch
Electronのdialogを使ってファイルピッカーを作る

# 参考
[dialog | Electron](https://electronjs.org/docs/api/dialog)
[続・Electronでファイルやフォルダの選択(保存もあるでよ)](https://qiita.com/_takwat/items/11dae9f4650767d20c4f)

# はじめに
この記事ではElectronのdialogを使用して最小構成のファイルピッカーを作ります。
Electronを触り始めて2秒しかたっていない私にとってわかりやすい記事がなかったためメモ書き程度にまとめました。少しでも私と同じ境遇の人の助けになれば幸いです。
JavaScriptの"Hello Word"が読める人を対象にしています。

# 必要なもの
- Electronの最小構成のアプリケーション
この記事ではElectronの最小構成のアプリケーションを上書きする形でアプリを作っていきます。[このサイト](https://electronjs.org/docs/tutorial/first-app)を参考に最小構成のアプリケーションを用意してください。

- 空のスクリプト
ファイル名は``DialogSample.js``としてください。このファイルにアプリのファイルピッカー部分を書き込んでいきます。

### フォルダ構成
```
Sample
├─node_modules // Electronをインストールした際に作られる
│ ├.bin
│    ・
│    ・
│    ・
├─DialogSample.js // 空のスクリプト
├─index.html
├─main.js
├─package.json
└─package-lock.json // Electronをインストールした際に作られる
```

# アプリのイメージ
今回は下の画像のようなアプリを作ります。ボタンを押すとファイルピッカーが起動し、ファイルを選択するとConsoleに選択したファイルへのパスが出力されるようにします。
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/281068/1300e4e8-46c6-6f3e-9f39-2e8afdbfb831.png)

# ソースコード
```html:index.html
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>dialog sample</title>
</head>

<body>
  <button id="open-file-button">open file</button>
  <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
  <script src="./DialogSample.js"></script>
</body>
</html>
```

```javascript:DialogSample.js
const remote = require('electron').remote;
const Dialog = remote.dialog;

$(function(){
  $('#open-file-button').on('click', function(){
    Dialog.showOpenDialog(null, {
    }, (fileNames) => {
      console.log(fileNames);
    });
  });
});
```
### 出力結果
![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/281068/60f0d30e-1cc4-a963-6f1d-51c7c96ec061.png)

# おまけ　オプションについて
もう少しカスタマイズされたファイルピッカーが作りたいという方にオプションが用意されています。下のように記述することができます。詳しくは[こちら](https://electronjs.org/docs/api/dialog)に書かれているので参考にしてください。

```javascript
Dialog.showOpenDialog(null, {
  // ここにオプションを書く
  title: 'title',
  defaultPath: 'C:\\ ',
  buttonLabel: 'buttonLabel',
  filters: [
    {name: 'HTML', extensions: ['html']},
    {name: 'JavaScript', extensions: ['js']},
    {name: 'All', extensions: ['*']}
  ],
  properties: ['openFile']
}
```
【Laravel】スケジューラはいつ動く？

## Laravel にはコマンドスケジューラという機能がある。
詳しくは [[ここ](https://readouble.com/laravel/5.5/ja/scheduling.html)] を読んでってことなのだが
crontab に以下の様に記述しておくと、app/Console/Kernel.php の schedule メソッドに記述することで
色々スケジュール実行できるようになるというもの。

```
* * * * * php /あなたのプロジェクトのパス/artisan schedule:run >> /dev/null 2>&1
```
crontab をいちいち設定しなおす必要がないし、設定は Git などで管理できるのでメリットは多い。

で、日毎に実行とか月毎に実行とか色々指定できるのだが、
じゃ実際いつ動く？って情報が見つからなかったのでまとめておく。
分 時 日 月 曜日は cron の記述に対応。

|メソッド|説明    | 分       | 時        |日      |月       |曜日   |補足     |
|:------|:-------|:---------|:---------|:-------|:--------|:------|:-------|
|->cron('* * * * * *');|CRON記法|*|*|*|*|*|
|->everyMinute();|毎分|*|||||
|->everyFiveMinutes();|5分毎|*/5|
|->everyTenMinutes();|10分毎|*/10|
|->everyFifteenMinutes();|15分毎|*/15|
|->everyThirtyMinutes();|30分毎|0,30|
|->hourly();|毎時|0|
|->hourlyAt(17);|毎時17分|17|||||設定値が入る|
|->daily();|毎日深夜0時|0|0|
|->dailyAt('13:00');|毎日13:00|0|13||||:がないと分は0|
|->twiceDaily(1, 13);|毎日1:00と13:00時|0|1,13||||,で連結|
|->weekly();|毎週|0|0| | |0|日曜0時|
|->monthly();|毎月|0|0|1|||1日0時|
|->monthlyOn(4, '15:00');|毎月4日の15:00|0|15|4|
|->quarterly();|四半期毎|0|0|1|1-12/3|
|->yearly();|毎年|0|0|1|1|
|->weekdays();|ウイークデーのみ|||||1-5|
|->sundays();|日曜だけ|||||0|
|->mondays();|月曜だけ|||||1|
|->tuesdays();|火曜だけ|||||2|
|->wednesdays();|水曜だけ|||||3|
|->thursdays();|木曜だけ|||||4|
|->fridays();|金曜だけ|||||5|
|->saturdays();|土曜だけ|||||6|

空欄の部分は他と複数設定可能。
最後まで設定されなかった空欄は * で設定される。
例えば ->fridays()->daily() で金曜0時の設定になる。
確認はしていないが、既存の設定を上書きする設定を実行したら後勝ちになるはず。
例えば ->yearly()->dailyAt('13:00') だと1月1日13:00に実行されるはず(笑)。

[- 目次 -](https://qiita.com/search?q=laravel+nekyo)
Mac — Vimでクリップボードのテキストを直接編集する

pbpaste と pbcopy をうまく組み合わせれば出来るはずと思って試した結果。

## 結論から先に書く

```sh
function pbvim (){
  readonly pbvim_tmp_file=./.pbvim.tmp

  pbpaste | vim - +"w $pbvim_tmp_file"
  cat "$pbvim_tmp_file" | tr -d "\012"| pbcopy # tr は末尾の改行を削除するため

  rm -f "$pbvim_tmp_file"
}
```

上記の関数を rc ファイルに追加する。 ( e.g `~/.bashrc` `~/.zshrc` )

シェルを再起動して `pbvim` を実行すると、vimでクリップボードのテキストを直接編集して上書き出来る。

[ccc/pbvim at master · YumaInaura/ccc](https://github.com/YumaInaura/ccc/blob/master/source/pbvim)

## ステップ解説

### Step. 標準出力からVim編集を開始する

```
pbpaste | vim -
```

ただ、このやり方だとファイル名を渡していないため、そのままだと編集できない

### Step. Vimにファイルパスを渡す

```
pbpaste | vim - +"w some_filepath"
```

「シェルから実行するvimコマンド」の引数として「vim 内部のコマンド」を渡す。

`:w some_filepath` という「vim内部のコマンド」がファイル編集前に実行される。 ( `some_filepath` という名前で編集内容を保存 )

### Step. 一時ファイルを利用

vimでの編集内容を pbcopy コマンドに標準入力として渡したいが、
vim コマンドはファイル内容を標準出力するわけではないので、ここでは一時ファイルを利用する。

1. 一時ファイルを作成
2. pbpaste での標準出力をvimに渡す
3. vimで編集して一時ファイルに記録された内容を、別コマンド ( cat ) で標準出力する
4. 標準出力を pbcopy コマンドに渡す
5. 一時ファイルを削除する

この流れ全体を実行したのが最初の例である。

## Versions

- VIM - Vi IMproved 8.1 (2018 May 18, compiled Aug  7 2018 21:58:18)
- Max OS X High Sierra

## Ref

- [Read from stdin to new, named, file in vim - Super User](https://superuser.com/questions/421367/read-from-stdin-to-new-named-file-in-vim)
- [How to save as a new file and keep working on the original one in Vim? - Stack Overflow](https://stackoverflow.com/questions/4980168/how-to-save-as-a-new-file-and-keep-working-on-the-original-one-in-vim)

## Links

- [Gist](https://gist.github.com/YumaInaura/6585e10fd96dcf1b0088f20c40cd448e)
- [Medium—imported](https://medium.com/p/2238783e2ad9)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Axlsxにて、条件付き書式を使う

RubyでExcelファイルを生成できるAxlsxで、条件付き書式を設定したいと思いました。

# 条件付き書式とは？

条件付き書式とは、セルの値が条件に合ったら文字の色や背景色を変えるとか、そういうのができるやつです。

よくある使い方では、テストで成績が

* 上位な人のセルは緑、
* 中位の人のセルは黄色
* 下位の人のセルは赤

にするとかですね。

# Axlsxで条件付き書式を設定する

## 書式を定義する

まず、条件付き書式で使う書式を定義します。その際に、`type: :dxf`を指定します。
サンプルコードを飛ばし読みしていたせいでここになかなか気付かなくて數十分時間を無駄にしました…。

```ruby
Axlsx::Package.new do |package|
  package.workbook do |workbook|
    red_text = workbook.styles.add_style(
      font_name: 'ＭＳ Ｐゴシック',
      sz: 10,
      fg_color: 'FF0000',
      type: :dxf # ここ重要
    )
  end
end
```

## 条件付き書式をセルに反映する

条件付き書式をセルに反映するには、`WorkSheet#add_conditional_formatting`メソッドを使います。

今回は、A列の値が0未満だったら赤文字にするという条件付き書式を設定してみます。

```ruby
red_text = workbook.styles.add_style(
  font_name: 'ＭＳ Ｐゴシック',
  sz: 10,
  fg_color: 'FF0000',
  type: :dxf
)

workbook.add_worksheet(name: 'sheet1') do |worksheet|
  # 行を入れていく処理などを行う、が省略…

  # 条件付き書式を設定
  worksheet.add_conditional_formatting(
    "A1:A1048576",
    type: :cellIs,
    operator: :lessThan,
    formula: '0',
    dxfId: red_text,
    priority: 1
  )
end
```

結果は以下のような感じ。いいですね！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/10078/560d7e46-83d6-ab05-a902-68ec662f5b35.png)

## その他、サンプル

サンプルは、githubにもあります。こちらのほうには様々な条件付き書式のサンプルがあるので参考にしましょう。

[example_conditional_formatting.rb](https://github.com/randym/axlsx/blob/master/examples/conditional_formatting/example_conditional_formatting.rb)
MacのpyenvでPython3.7.xインストール時のエラー

さて、GAE 2nd genの3.7ランタイムを使うために3.7をインストールしようとして以下のようなエラーが出てきた。

```
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?
```

OpenSSLのライブラリがない、というエラー。

これはエラーログにも出てくるリンクだけど、ここを見ろと言われる。
https://github.com/pyenv/pyenv/wiki/Common-build-problems#error-the-python-ssl-extension-was-not-compiled-missing-the-openssl-lib

毎回入力するのもめんどいから.bash_profileに以下の行を追加してみた。

```bash:.bash_profile
# about openssl
export CFLAGS="-I$(brew --prefix openssl)/include $CFLAGS"
export LDFLAGS="-L$(brew --prefix openssl)/lib $LDFLAGS"
```

そうすると今度はこういうエラーに変わった。

```
ModuleNotFoundError: No module named 'pyexpat'
```

pyexpatはXMLパーサーの一つ。
https://docs.python.org/ja/3.7/library/pyexpat.html


しかし最近の情報を見ていくと、こんな漢字で、そもそもCFLAG消したらうまく言ったぜぐへへ的なコメントも合った。
https://github.com/pyenv/pyenv/issues/1066#issuecomment-387211005

うーん、なんともうまくいかないなぁと思って更に調べていたところこのコメントに出会って解決。
https://github.com/pyenv/pyenv/issues/1184#issuecomment-409320318

#解決法
```
CONFIGURE_OPTS="--with-openssl=$(brew --prefix openssl)" pyenv install 3.7.0
```

うおーインストールされてる！
例のごとく.bash_profileに追記して動かしてます。
ASP.NET > LinqKit > doesn't implement IAsyncEnumerable.



ASP.NET CoreにてLinqKitを使った際に、ToListAsyncを呼び出したら以下のようなエラーになりました。　の解決の備忘録

```
The source IQueryable doesn't implement IAsyncEnumerable. Only sources that implement IAsyncEnumerable can be used for Entity Framework asynchronous operations.
```

環境：
* ASP.NET Core2.1
* DB:SQL Server


LinqKit.Microsoft.EntityFrameworkCore


当初はLINQKit.Coreを使っていましたが、それは間違いで、LinqKit.Microsoft.EntityFrameworkCoreを使う必要があった模様です。



[LinqKit and async in Entity Framework - Stack Overflow](https://stackoverflow.com/questions/35903848/linqkit-and-async-in-entity-framework)

### こっち正解
[NuGet Gallery | LinqKit.Microsoft.EntityFrameworkCore 1.1.15](https://www.nuget.org/packages/LinqKit.Microsoft.EntityFrameworkCore/)

### こっち違う
[NuGet Gallery | LINQKit.Core 1.1.15](https://www.nuget.org/packages/LINQKit.Core/)
ワープ変換で行きませんか、歪み無き次元へ

<img src="https://qiita-image-store.s3.amazonaws.com/0/242602/358d085d-fbdb-0d22-f281-43d181086668.jpeg" style="width:100%">

#OpenCV
OpenCV(Open Source Computer Vision Library)は、インテルによって開発されたコンピュータビジョンのライブラリです。
Pythonで簡単に使えるほか、C++、Jave、MATLABなど各種言語用のバインディングが利用可能です。OpenCVはありとあらゆる画像操作の要素技術の集合体なので、頭に思い浮かぶ何ら頭の画像変換はまず実装されているでしょう、と言って過言でないくらい多機能です。公式ページはこちら[1]。

[1] [OpenCV](https://opencv.org/)
[https://opencv.org/](https://opencv.org/)

#インストール
Pythonの標準ライブラリではないので利用にはインストールが必要です。pipを利用して簡単にインストールすることができます。また、依存関係にあるライブラリとして、数値計算ライブラリであるNumpyも必要です。自分の環境ではAnacondaを使っているのでNumpyは既に利用可能でした。

```
pip install opencv-python
```

#ワープ変換
ワープ変換は線形変換/射影変換の一種で、画像を比較的自由に歪ませることができます。これは単純な移動・拡大・回転の操作ではできない変換で、歪ませられるということは逆に、歪みを取れることもできます。カメラを利用した紙書類の電子化など、内部でOpenCVが使われているかは分かりませんが、この種の歪み除去技術は活用されているはずです。

#コード
ワープ変換には、変換の基準となる4点を、変換前と変換後とで2組用意する必要があります。基準点の組から変換行列をgetPerspectiveTransformによって得て、それをwarpPerspectiveに渡す流れです。warpPerspectiveには画像データと変換後の画像サイズも渡します。

以下、全コードです。

```python:warp.py

import cv2
import numpy as np

img_target = cv2.imread('original.png')
pnt_from = np.float32([[62,35], [500,30], [46,316], [497,332]])
pnt_to = np.float32([[0,0], [550,0], [0,367], [550,367]])
matrix_warp = cv2.getPerspectiveTransform(pnt_from, pnt_to)
dim_target = (550, 367)
output = cv2.warpPerspective(img_target, matrix_warp, dim_target)
cv2.imwrite('warp.png', output)
```

#まとめと応用
・コンピュータビジョン用ライブラリOpenCVはPythonから簡単に使える。
・様々な画像変換を簡易に行うことができる。

これを応用して、
・OCRや3DCG用テクスチャなどをカメラ画像から得ることができる。
・スキャン画像の傾きや歪みを除去してきれいなドキュメントを得ることができる。
php

![Screen Shot 2018-08-19 at 22.39.51.png](https://qiita-image-store.s3.amazonaws.com/0/274410/503aa6ec-362e-970e-4766-6588bea7632a.png)
![Screen Shot 2018-08-19 at 23.21.29.png](https://qiita-image-store.s3.amazonaws.com/0/274410/57782dab-ab31-cf60-887b-27c6aed6287b.png)
![Screen Shot 2018-08-19 at 23.36.06.png](https://qiita-image-store.s3.amazonaws.com/0/274410/126368eb-5a95-cfc1-1319-0672cc615cb2.png)
![Screen Shot 2018-08-22 at 13.15.45.png](https://qiita-image-store.s3.amazonaws.com/0/274410/c879ebaf-fd74-c188-6dd5-f6e52492944e.png)
![Screen Shot 2018-08-22 at 14.26.48.png](https://qiita-image-store.s3.amazonaws.com/0/274410/56c76da3-cb0a-96d1-71fa-86f66d75da65.png)
![Screen Shot 2018-08-22 at 14.43.10.png](https://qiita-image-store.s3.amazonaws.com/0/274410/128dab43-7b55-6e40-f5e2-3b2d535baead.png)
![Screen Shot 2018-08-22 at 14.49.12.png](https://qiita-image-store.s3.amazonaws.com/0/274410/d56b44ef-c67a-6e58-54bc-3f8c056101f0.png)
![Screen Shot 2018-08-22 at 15.17.37.png](https://qiita-image-store.s3.amazonaws.com/0/274410/00e2b5f3-8edd-d8f2-aa94-b740d40758ea.png)
cssのanimationでサイケ感を出す

特に難しいことはなく、
filter:hue-rotate(0deg) の値を @keyframes で変更すればOK

特定要素のみでも良いし、ページ全体に適応すればかなり気持ちが悪くなる

実装例 https://codepen.io/ynhrrr/pen/yxyqwG

```css
body {
  animation: huerotate 3s linear infinite;
}
@keyframes huerotate{
  from{
    filter:hue-rotate(0deg);
  }
  to{
    filter:hue-rotate(360deg);
  }
}
```

filter:invert(0%) の値を動かせばチカチカとした点滅も出来る。


マウスオーバーエフェクトや、メインビジュアルなどでも使えるかもしれないし、ネットアートなどにも適応出来るかも
（:hover に transition-duration 設定しておけば必要ないかもしれないが）
Ansible でFTPサーバーにファイルを追加したかった...

Ansibleで非SFTPなFTPサーバーにファイルをPUTしようとして試行錯誤したが、結局 `curl` 叩くのがベストかなと思った次第です。


`curl` の `--ftp-create-dirs` オプション凄く便利だなって思った。

- [curl \- How To Use](https://curl.haxx.se/docs/manpage.html)
    - [\--ftp-create-dirs](https://curl.haxx.se/docs/manpage.html#--ftp-create-dirs)


# 環境

```
$ docker inspect --format="{{.Config.Image}}" pure-ftpd
stilliard/pure-ftpd:hardened
```
```
$ curl --version
curl 7.54.0 (x86_64-apple-darwin17.0) libcurl/7.54.0 LibreSSL/2.0.20 zlib/1.2.11 nghttp2/1.24.0
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz HTTP2 UnixSockets HTTPS-proxy
```



# curl で色々

```
$ curl -I ftp://foo:bar@localhost/1/; echo $?
0

$ curl -I ftp://foo:bar@localhost/404; echo $?
curl: (19) Given file does not exist
19

$ curl --silent ftp://foo:bar@localhost/newdir/newfile --ftp-create-dirs --upload-file /path/to/test.txt; echo $?
0

$ curl -I ftp://foo:bar@localhost/newdir/newfile; echo $?
Last-Modified: Wed, 22 Aug 2018 05:51:55 GMT
Content-Length: 143
Accept-ranges: bytes
0
```

# 期待した通りにディレクトリを作成してくれないケース

`curl` の仕様なのか `Pure-FTPd` の仕様なのかはたまたRFCで定義されているのか、そこまで未調査ではありますが作成するディレクトリの名称に半角スペース ` ` (0x20) を含む場合、半角スペースが `_` に置換された名称のディレクトリが作成されてしまうことを確認済みです。

そもそもそこまで考慮するなら FTPサーバーとの通信に `curl` なんて使わない方が良いと個人的には思うのでこれ以上は追求していません :sweat_smile: 

```
$ curl --silent --ftp-create-dirs "ftp://foo:bar@127.0.0.1/x/ z/xz.log" --upload-file "x/ z/xz.log" -vvvvvvvvvvv
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 21 (#0)
< 220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
< 220-You are user number 1 of 5 allowed.
< 220-Local time is now 09:34. Server port: 21.
< 220-This is a private system - No anonymous login
< 220 You will be disconnected after 15 minutes of inactivity.
> USER foo
< 331 User foo OK. Password required
> PASS bar
< 230 OK. Current directory is /
> PWD
< 257 "/" is your current location
* Entry path is '/'
> CWD x
* ftp_perform ends with SECONDARY: 0
< 250 OK. Current directory is /x
> CWD  z
< 550 Can't change directory to  z: No such file or directory
> MKD  z
< 257 "_z" : The directory was successfully created
> CWD  z
< 550 Can't change directory to  z: No such file or directory
* Server denied you to change to the given directory
* Uploaded unaligned file size (0 out of 18 bytes)
* Connection #0 to host 127.0.0.1 left intact
```

# 参考

- [curl](https://curl.haxx.se/)
- [Pure\-FTPd \- About](https://www.pureftpd.org/project/pure-ftpd)
Wordpress：マルチサイトで子ブログの記事一覧を表示しアイコンをつける

# 要件
マルチサイト化した親ブログのindexに子ブログa、b、cの記事一覧をブログ名のアイコン付きで表示し、かつ子ブログaの場合はブログ名のアイコンではなく、カテゴリーのアイコン付きで表示したい。
# 各ブログの表示
とりあえず子ブログa、b、cの表示についてはこちらのサイトを参考にさせていただきました。
[CattleMute　マルチサイト内で複数のブログ記事を表示するコード](http://www.cattlemute.com/2016/07/06/387/)

アイコンの画像ファイル名はブログidを引用し[icon_0n.gif]としました。

`<img src="icon_0<?php echo $entry->site_id; ?>.gif">`

該当するブログのidがファイル名に入ります。
# 子ブログのカテゴリ
アイコン画像の記述部分を子ブログaとそれ以外にif文で出し分けます。
子ブログaのアイコン画像ファイル名はカテゴリスラッグを引用し[icon_a_hoge.gif]としました。

`<?php if ($entry->site_id == a): ?>
<img src="icon_a_<?php echo $cat_slug; ?>.gif">
<?php else: ?>
<img src="icon_0<?php echo $entry->site_id; ?>.gif">
<?php endif; ?>`

子ブログaの場合該当するカテゴリのアイコンが表示され、その他の子ブログはブログ名のアイコンが表示されます。
# 完成したソース
`<dl>
<?php
$entries = get_multisite_posts(array(a, b, c));
foreach($entries as $entry){
get_multisite_posts_prep($entry);
$category = get_the_category();
$cat_slug = $category[0]->slug; 
?>
<dt><?php echo get_the_time('Y年n月j日') ?></dt>
<dd>
<?php if ($entry->site_id == a): ?>
<img src="icon_a_<?php echo $cat_slug; ?>.gif">
<?php else: ?>
<img src="icon_0<?php echo $entry->site_id; ?>.gif">
<?php endif; ?></dd>
<dd><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></dd>
<?php get_multisite_posts_prep(); } ?>
</dl>`

初投稿でした。わかりやすく説明するの難しいですね…
ご参考になれば幸いです。