OmniAICreator/Qiita-1.07M huggingface dataset:
ブラウザで圧縮されたJSコードを整形して見る方法

コードを確認したいサイトのJSやCSSが圧縮されていて見づらいことはままあります。が、どうやらchromeで簡単に解決できるみたいです。

## 方法

1. 調べたいサイトで開発者ツールを開く


2. Sourcesで確認したい圧縮ファイルを開く


3. 画面下にある{}を押す
![スクリーンショット 2018-06-28 18.30.57.png](https://qiita-image-store.s3.amazonaws.com/0/237008/d6d97c12-d4f1-abdd-62ca-c4996e447fba.png)


4. コード綺麗になった！！
![スクリーンショット 2018-06-28 18.17.50.png](https://qiita-image-store.s3.amazonaws.com/0/237008/98acbc2f-c469-ef00-318b-3ce82b092d2b.png)


以上
Jenkins の Multibranch Pipeline でプルリクエストのときに checkout でマージする

[Multibranch Pipeline](https://jenkins.io/doc/book/pipeline/multibranch/) の「Branch Source」に GitHub を使うと、ジョブ実行時に自動的にリポジトリーをチェックアウトしてくれます。事情があってこの自動的なチェックアウトが使えないときはステップ内で `checkout` を使うことになります。

プルリクエストの対象ブランチ名は `env.CHANGE_TARGET` から得られるので、`PreBuildMerge` で設定することになります。

```groovy
    stages {
        stage('Prepare') {
            steps {
                checkout([
                    $class: 'GitSCM',
                    branches: [[name: "${env.CHANGE_BRANCH}"]],
                    doGenerateSubmoduleConfigurations: false,
                    extensions: [
                        [$class: 'PreBuildMerge', options: [fastForwardMode: 'NO_FF', mergeRemote: 'origin', mergeTarget: "${env.CHANGE_TARGET}"]],
                    ]),
                    submoduleCfg: [],
                    userRemoteConfigs: [[name: 'origin', url: 'git@github.com:example/something']]
                ])
            }
        }
    }
```

ログでは次のようにマージされていることがわかります。

```console
Merging Revision 65ff6d17f1915b8aa998c2e54af7e4dfce1588bd (refs/remotes/origin/test/pr) to origin/master, UserMergeOptions{mergeRemote='origin', mergeTarget='master', mergeStrategy='null', fastForwardMode='--no-ff'}
 > git rev-parse origin/master^{commit} # timeout=10
 > git config core.sparsecheckout # timeout=10
 > git checkout -f origin/master
 > git merge --no-ff 65ff6d17f1915b8aa998c2e54af7e4dfce1588bd # timeout=10
```

プルリクエストからのジョブであればこの設定で OK なのですが、ブランチからののジョブで実行されると失敗します。

```console
Merging Revision 65ff6d17f1915b8aa998c2e54af7e4dfce1588bd (origin/test-branch) to origin/null, UserMergeOptions{mergeRemote='origin', mergeTarget='null', mergeStrategy='null', fastForwardMode='--no-ff'}
 > git rev-parse origin/null^{commit} # timeout=10
```

`env.CHANGE_TARGET` が `null` となるためです。

分岐を入れたいですが、[Declarative Pipeline](https://jenkins.io/doc/book/pipeline/syntax/#declarative-pipeline) で書こうとすると、気軽に `if` は入れられません。ただ三項演算子は有効なので、これを使って強引に `extensions` の配列に設定を加えてしまいました。

```groovy
                    extensions: []
                    .plus(env.CHANGE_TARGET == null ? [] : [
                        [$class: 'PreBuildMerge', options: [fastForwardMode: 'NO_FF', mergeRemote: 'origin', mergeTarget: env.CHANGE_TARGET]],
                    ]),
```
非線形相関係数、MICは本当に万能か?

# 初めに

非線形相関分析というのはとても難しい問題です。
何故なら多くのパターンがあり、それを見分けなくてはならないからです。
タイトルでは"万能か?"と書きましたが実際に万能な非線形相関分析は現在存在しない(存在していたら研究が終わっている)ため、MICがどこまで使用可能かを検証したいと思います。

# test

## 線形(正規分布ノイズ)

まず、線形が出来ないと話になりません、そこで線形を検証したいと思います。
サンプル数は1000個です

```math
0<=x<=100\\
サンプル数は1000個\\
y=2*x+1+N(0,10)
```

![1.png](https://qiita-image-store.s3.amazonaws.com/0/206651/fcccaf5e-3f37-3d6a-0f9b-23f7eb946c86.png)

これはどちらも問題無いようです。

```text:結果
MIC:0.96635278923073
相関係数:0.9849755611746215
```

## 線形(対数正規分布ノイズ)

では対数正規分布の時はどうか?

```math
0<=x<=100\\
サンプル数は1000個\\
y=2*x+1+lognormal(1,2)
```

![2.png](https://qiita-image-store.s3.amazonaws.com/0/206651/30d6ef60-4e55-af12-64c4-f3b9375a6b1d.png)

```結果
MIC:0.9055543552706471
相関係数:0.7196100545913859
```

## 指数関数(正規分布ノイズ)

```math
0<=x<=100\\
サンプル数は1000個\\
y=\exp(x)+N(0,10)
```


```text:結果
MIC:1.0000000000000002
相関係数:0.24246752108964334
```
![3.png](https://qiita-image-store.s3.amazonaws.com/0/206651/e1c18298-1185-6c46-57af-abd643b25a24.png)

やはり、相関係数は非線形では使用出来ないようです。

## sin波(正規分布ノイズ)

```math
0<=x<=100\\
サンプル数は1000個\\
y=\sin(x)+N(0,0.3)
```

![4.png](https://qiita-image-store.s3.amazonaws.com/0/206651/a848197d-604f-2eb9-2234-c7c4d844de2e.png)


```text:結果
MIC:0.7474931153267849
相関係数:-0.045197656184598076
```

MICは、sin関数は得意ではないようです

## sin波(分散の大きい正規分布ノイズ)

```math
0<=x<=100\\
サンプル数は1000個\\
y=\sin(x)+N(0,1)
```

```text:結果
MIC:0.29054446304410836
相関係数:-0.05035333156386222
```

![5.png](https://qiita-image-store.s3.amazonaws.com/0/206651/f2c9a85b-867f-6ec3-91b4-40708e87c4e2.png)


上手くいきませんでした。

## tanh関数(正規分布ノイズ)

```math
0<=x<=100\\
サンプル数は1000個\\
y=\tan(x)+N(0,1)
```

グラフを誤って上書きしてしまいました

```text:結果
MIC:0.4646033589341278
相関係数:0.026627230647174878
```


## シグモイド関数(正規分布ノイズ)

```math
-10<=x<=10\\
サンプル数は1000個\\
y=1/(1+\exp(-x))+N(0,0.1)
```

![6.png](https://qiita-image-store.s3.amazonaws.com/0/206651/75f79284-bbaa-3919-bf0f-57b2ca288147.png)

```text:結果
MIC:1.0000000000000002
相関係数:0.9137437197125787
```


こちらは相関係数でも上手くいきました

## 正規分布(正規分布ノイズ)

正規分布の確率密度関数そのものでもやってみました。

```math
-2<=x<=2\\
サンプル数は1000個\\
y=normal(x,mean=0,\sigma=1)+N(0,0.05)
```

![8.png](https://qiita-image-store.s3.amazonaws.com/0/206651/cbbfc9b3-60e0-77d8-0b22-a4dc1876b9ea.png)


```text:結果
MIC:0.8289557320644945
相関係数:0.005338872881598092
```

## 自己回帰(正規分布ノイズ)


```math
0<=i<1000\\
サンプル数は1000個\\
y[0]=100\\
y[i+1]=0.5*y[i]+1+N(0,0.1)
```

![9.png](https://qiita-image-store.s3.amazonaws.com/0/206651/5ab397ec-0bc1-c848-4762-e611a963f99a.png)


```text:結果
MIC:0.22676923525337073
相関係数:0.0775566558512887
```

# 結論

これを見ると必ずしも、MICが万能ではないことが分かります。
何事も過信は良くありませんね。
複数のテキストファイルを結合するには？(前編)

# ワイルドカードとリダイレクトの存在を知れば解決できる。


- ワイルドカード「*」記号は「任意」という意味である。例えば、任意のファイルに対して何かを実行できるという使い方ができる。
- リダイレクト「>」記号は「出力先を変える」という意味である。例えば、計算結果をディスプレイではなく、テキストファイルに出力することができる。

従って、各テキストファイルの内容をひとつのテキストファイルにまとめることが可能である。[^1]

```
type *.txt > result.txt '各テキストファイルの内容をresult.txtに書き出す。
```

## 上記コマンドで解決できない場合[^2]

大量のデータを結合するときに上手くいかない場合があったので、
そのときはcopyコマンドを試してみてほしい。[^3]

```
copy *.txt result.txt '各テキストファイルの内容をresult.txtにコピーする。
```

[^1]: このコマンドはまとめるテキストが置いてあるフォルダ毎に実行する必要がある。フォルダ毎に実行する必要があるので自動化とは言い難い。そのためタイトルを「前編」とした。
[^2]: 2019/02/19(Tue)にtypeコマンドで上手くいかない場合の対応について補足した。
[^3]: なぜ、typeコマンドで上手くいかないか原因が分からなかった。数万件以上のデータを結合するときに問題が発生した。結合するファイル数というよりはファイルに書き込まれている行数で問題が発生している様に感じられた。typeコマンドでは同じ内容が重複して書き込まれた様に見受けられた。最初からCopyコマンドを使った方が確実かもしれない。
Rails チュートリアル メモ 第8章

# メモ

* form_for はモデルがなくても使うことができる
    * `form_for(:session, url: login_path)`
    * 所感: セッションを管理するモデルを作るような設計にはできないのだろうか

----

* 認証するときは、モデルのインスタンスから生えている `authenticate` メソッドが使える
    * モデルで `has_secure_password` すると生えるやつ（復習）

----

* render で flash を表示させると、メッセージが残ってしまう
    * render は強制的な画面の描画であり、リクエストとは見なされないため？
    * `flash.now` を使う

----

* 本来ヘルパーは（たぶん）view で使うものだが、`include` さえしてしまえばコントローラーでも使える

----

* `session` について
    * ハッシュ感覚で使える
    * データは「セッション Cookie」に保存される（= ブラウザを閉じると消える）
    * 自動的に暗号化される！
        * なので、`session` には割と気軽にデータを入れちゃってよい
        * `cookies` は暗号化されないらしい
            * 今回みたいに DB 上のユーザー ID を `cookies` に入れてしまうと、簡単に他のユーザーに成りすますことができてしまう

----

* 都度 DB 検索が走るのが嫌なら、取得結果をインスタンス変数に格納するとよい

----

* fixture の yml では erb が使える

----

> ```ruby
user = users(:michael)
```
上の users は `fixture` のファイル名 users.yml を表し、`:michael` というシンボルはリスト 8.22 のユーザーを参照するためのキーを表します。

----

* assert_select でこういう書き方ができる

```ruby
assert_select "a[href=?]", logout_path
``` 

* 前はこうやって書いたけど、お手本の方がきれいだ

```ruby
assert_select "a[href=\"#{logout_path}\"]"
 ```

* さらに、ヒットしないことをテストするには `count` を使ってこのように書ける

```ruby
assert_select "a[href=?]", login_path, count: 0
```

* これも前は `false` を渡して書いたけど、意味がよくわからないのでお手本の方が意図が伝わりやすい

```ruby
assert_select "a[href=\"#{login_path}\"]", false
```

---- 

* session を消すときは `session.delete(:user_id)`

----

* `is_logged_in` というメソッド名はいかがなものかと思い、`test_logged_in` という名前にしたら、`test_` から始まるメソッド名は minitest ではテストケースを意味してしまうので、テスト全体がバグって実行できなくなってしまった・・・。

----

* 前述の通り、毎回 DB を検索するのを嫌って、このサンプルアプリでは current_user をインスタンス変数に格納している。
* しかし、それをやったからには log_out メソッドで `@current_user` を忘れずに nil にする必要がある
Custom Post Type Generatorで登録したカスタム投稿タイプが表示されないことの対応方法

## 現象
WordPressのプラグイン、Custom Post Type Generatorを使ってカスタム投稿タイプを登録したのに、メニューに出てこない。

## 原因
なぜかと調べたら、"高度な設定"項目のshow_ui, show_in_menu の値がfalseになっているからだった。

参考：
https://masaroku.com/?p=1005
メニューに出ないぞ、Custom Post Type Generator

## 原因の背景
ではなぜここをfalseにしているかと調べたら、関数register_post_typeの
引数であるshow_ui, show_in_menu の値がfalseだかららしい。

https://codex.wordpress.org/Function_Reference/register_post_type
Codex

https://hijiriworld.com/web/cptg-2-3-0/
Custom Post Type Generator ver.2.3.0 リリースノート
"すべてのパラメータの初期値をAPIに合わせて見直しました。"

## 解決方法
"高度な設定"項目の"public"をtrueにする
その際、"依存する設定項目も更新する。"のチェックボックスもチェックした上で更新保存する。
JavaScript学習記録6　2018年6月28日分

使用図書
『ここからはじめるJavaScript入門』（井上久夫　2002年1月25日発行）

やったこと
・関数について
　関数ってなんだってところからだけど、命令を何個かまとめて名前つけたものってことでいいのかな。んで名前を唱えると用意してた関数が出てくると。詠唱破棄……！みたいなノリ？

functionで関数を設定して、設定した名前を使うとぱぱっと使い回せるみたいだ。

・配列について
　テキストエリアを複数設定して関数を動かすことはできるわけだけれど、じゃあテキストエリアの指定方法は？って時に配列が使われるっぽい。今回はformを複数個なのでform配列！<FORM>タグを付けると自動で０．１．２……とついていくらしい。JavaScriptは０から始まるのがデフォなのかね。同時にelementでフォーム内の記述にも配列が使える。これも０．１．２……と振られるからそのように書けばよいね！

```html
<FORM>
  <TEXTAREA cols="20" rows="4"> ニュース1</TEXTAREA>>
  </FORM>
```
を複数書いてテキストエリアを量産したら

```html
<script lang="JavaScript">
 document.forms[0].elements[0].value="特にないよ！";
 document.forms[1].elements[0].value="無いったら無いよ！";
 document.forms[2].elements[0].value="ごめん、本当はちょっとある。ちょっとだけ";
</script> 
```
こんなかんじで配列を指定していくと。大量になんか書くときとか便利そうね。
さらにさらに、関数を２つ作って、片方をonMouseOver,もう片方をonMouseOutにすると文章が戻る仕様にもできる。

……終わったー！　使用図書読了！　まだいろんな機能付き掲示板は遠い気がするから、もう一冊追加するか、web上の講座を一つやってみるか、もしくは一回組んでみるか。いずれにせよ次をぱぱっと始めますわ。
vue-cliでnpm run serveができない。

# こんなエラーに出くわした
vue-cliを使って開発中に``npm run serve``を打ち込んでいると次のようなエラーに出くわしました。

```terminal
sh: vue-cli-service: command not found
npm ERR! file sh
npm ERR! code ELIFECYCLE
npm ERR! errno ENOENT
npm ERR! syscall spawn
npm ERR! images@0.1.0 serve: `vue-cli-service serve`
npm ERR! spawn ENOENT
npm ERR! 
npm ERR! Failed at the images@0.1.0 serve script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /Users/username/.npm/_logs/2018-06-28T09_01_39_272Z-debug.log
```

# 環境
* Mac book air High Sierra 
* node 10.1.0
* npm 5.10.0

# エラー経緯
* もともと``npm install -g vue-cli``を入力していた。
* 学習先のサイトが``vue create プロジェクト名``を使っていたので真似ようとしたら注意された。

```terminal
 vue create is a Vue CLI 3 only command and you are using Vue CLI 2.9.6.
  You may want to run the following to upgrade to Vue CLI 3:

  npm uninstall -g vue-cli
  npm install -g @vue/cli
```

* 注意書をよく読まず``npm install -g @vue/cli``だけ実行
* うまくインストールされたが、最初に記述したエラーに出くわす。

つまり、原因は2ですね汗
``vue-cli``と``@vue/cli``は異なるものであることを認識しました。


# 解決策
``npm uninstall -g vue-cli``を入力。
パーセプトロンの実装

授業でパーセプトロンを習ったので、イメージを掴むために実装しました。

#<パーセプトロン実装>

```python

#訓練データ
train_x0 = [1, 1, 1, 1 ,1 ,1]
train_x1 = [1.2, 0.2, -0.2, -0.5, -1.0, -1.5]

#訓練データのクラス
train_y = [1, 1, 1, 2, 2, 2]

#学習係数
p = 0.5

#重みベクトル
w0 = 0.5
w1 = 0.5
    
#誤りの修正回数
error_count = 0

# 識別関数の定義    
def learn():
    global w0, w1, error_count
    for i in range(5):
        g = w0 * train_x0[i] + w1 * train_x1[i] 
        if train_y[i] == 1 and g > 0:
            pass
        elif train_y[i] == 1 and g <= 0:
            w0 += p * train_x0[i]
            w1 += p * train_x1[i]
            error_count += 1   
        elif train_y[i] == 2 and g <= 0:
            pass
        else:
            w0 -= p * train_x0[i]
            w1 -= p * train_x1[i]
            error_count += 1

#学習回数
train_count = 0

#１回目の学習
learn()
train_count += 1

#２回目以降の学習
while error_count != 0:
    error_count = 0
    learn()
    train_count += 1

print("学習後のw0:" +str(w0))
print("学習後のw1:" +str(w1))
print("学習回数:" + str(train_count))

```
Octoparseが日本語化サービスを開始！

Octoparseは2016年3月15日に公開されたから2年も経ちました。ここ2年間では、高成長期を迎えてお＊り、今年からも多くのアップデートが行われています。

Octoparseの成長に関するチャートがあります：
![1.png](https://qiita-image-store.s3.amazonaws.com/0/262932/a7195877-cfbb-7c2a-877f-f0e49080aea0.png)
*Google TrendsにOctoparseの人気度*


  

**過去2年間にやったこと**

2016年3月15日、初めのユーザーが登録しました。4月に初めのユーザーが契約しました。Octoparseの公開以来、私たちはユーザー体験の向上に専念しています。

1.　お客様の要望をより詳しく了解するために、たくさんのアンケート調査を行い、お客様から多くのアドバイスをもらいました。これらのアドバイスに基づいて、ユーザーに役に立つコンテンツの作成は仕事重心になりました。

2.　チュートリアル、活用例、FAQ、スクレイピングの紹介ブログなど、600以上のコンテンツを編集しました。各チュートリアルはビデオまたはGIFを使って、操作の手順がよく説明されています。さまざまな目的でWebスクレイピングしたいユーザーにも、Octoparseを使ってデータを取得できるのは私たちの目指すことです。

3.　コンテンツ以外にも、すべてのユーザーにタスク作りのサポートを提供しています。毎日平均86件のタスク作りに関する問題を処理します。これまで、40000人以上のユーザーをサポートしていました。

4.　ユーザー体験を改善するために、Octoparseを定期的にリリースします。より迅速なデータ抽出を実現するために、追加料金なしで、有料ユーザーのクラウドサーバー数を6から14に引き上げました。2018年3月に新しいバージョンOctoparse V7.0.0がリリースされました。このリリースでは、デザイン、UI、内蔵ブラウザ、ブロック防止機能などを改善しました。

これらの努力により、2016年にサービスを開始して以来、Octoparseは月間ユニークビジター数が5万人を超えるまでに成長しました。今年から新たな顧客獲得に注力することで積極的な事業拡大を図ります。今では全世界の人がOctoparseを利用しており、日本からのユーザーが10％を占めるなど日本でも人気を集めていました。ですから、新たな成長戦略の一環として、日本市場は重要です。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/262932/e7bdddc1-4936-54d3-34cc-9f7fd462c5ac.png)
*Google TrendsにOctoparse人気度の地域ランキング*


実はOctoparseを日本語化するかどうかを長い間に悩んでいます。「世界第3位の経済大国」と言っている日本は「特殊な存在」と思います。Octoparseのユーザーに日本の方は大きな部分を占めるため、やるしかありません。ですから、初めの一歩を踏み出した。2018年6月から日本語でのサービスを開始しました。今後、日本語でOctoparseを利用できるようになります。

新たに開設された日本語版サイトではほとんどのページが日本語化されましたが、ログイン、新規登録、お問い合わせに、クライアント関わるページは英語版のみがあります。でも、日本語でのお問い合わせが対応でき、これからも引き続き改善します。日本から[英語サイト](https://www.octoparse.com/)にアクセスすると下部にある「Octoparse Japan」から日本語版ページにアクセスできるようになっており、「[https://www.octoparse.jp/](https://www.octoparse.jp/)」で直接日本語版ページにアクセスできます。

多くのユーザーは、「スクレイピングツール」を検索する時、Octoparseに関する文章を見たことがきっとありますよね。それは熱心のユーザーが日本の方にOctoparseの使い方などを紹介するために書いたブログです。今では、新しいバージョンOctoparse V7Xの[使い方、活用例](https://www.octoparse.jp/tutorial)、[ブログ](https://www.octoparse.jp/blog)では日本語版を用意しており、日本語の[Facebook](https://www.facebook.com/OctoparseJapan)、[Twitter](https://twitter.com/OctoparseJapan)アカウントも開始しました。日本では、より多くの人々がOctoparseを知ることに信じています。

Octoparseにはきっと多くの不足が存在していますが、ユーザーとの交流を踏まえて、今までよりも積極的なサービスを提供して、努力を続けることによって、より多くの顧客を獲得できるでしょう。
MYSQLで急にrootで接続できなくなった時の復旧。（Mysql 5.0系対応）

備忘録として残します。

急にrootでログインできなくなった。
SELECTしかしていないのになぜ。


原因は不明ですが、入れないと作業にならないため調べると下記のサイトがヒット。
https://stackoverflow.com/questions/41645309/mysql-error-access-denied-for-user-rootlocalhost


![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/a1a964e3-be76-2f55-12d3-eb48b7da9d7c.png)

一番評価が高い方法をためすが、６で躓く。

5.0系ではこのSQLはダメみたいです。
そのため、公式のリファレンスを見て下記のステップ６を下記の構文に代用
![image.png](https://qiita-image-store.s3.amazonaws.com/0/213462/1f8e663d-af75-8859-5d6c-524cb60c92fd.png)


以上です。

原因が解明できていないため、一時しのぎではあるが、とりあえず備忘録として。。

今回のようなrootでログインできなくなる事象について原因を知っている方、
コメント頂けるとありがたいです。
C++ Builder XE4 > LME288 (2018-06-28版) (Windows 7) > 対処 > Link: 【RS10.2Tokyo】リンクできません、の続き @ BLOGN.MONZEN.ORG 様 > 再発

```txt:動作環境
C++ Builder XE4
```

### 関連

- [C++ Builder XE4 > LME288 (2018-05-15版) (Windows 7) > 対処 > (*.objファイル削除 + IDEを再起動) * 数回](https://qiita.com/7of9/items/f9f9552377d6ba25f90b)

### 症状

- LME288のエラーが出る

対処できたと思っていたが、再び発生するようになった。

### 対処link

- [【RS10.2Tokyo】リンクできません、の続き](http://www.monzen.org/blogn/index.php?e=169)
    - @ BLOGN.MONZEN.ORG 様

記載の「方法3」を試したところLME288のエラーが出なくなりました。

情報感謝です。

### 再発

上記の対処により、LME288は発生しなくなった。

PCを再起動後、LME288エラーが再発するようになった。

さらにPC再起動後、LME288エラーが発生しなくなった。

安定しない。
Google検索を毎日するからこそ知っておきたい検索のコツ7選

Google検索はエンジニアにとって常に参照したい辞書・教科書であり、1日に数えきれないほどの検索をします。そのため、エンジニアとしてgoogle検索で欲しい情報を正確にピックアップする能力は必須です。しかし、ただ単語を並べるだけの検索をしていませんか？**Google検索で欲しい情報を確実にゲットするためのコツ**があるので、それをまとめてみました。


# 1. 指定した句で完全一致させたい時： `""`

何かしらの句を`""`で囲んで検索すると、単語も単語の語順も、句として完全一致した結果が出ます。

例えば、`SyntaxError: Missing parentheses in call to 'print'`というエラーが出た時、そのまま検索すると、`SyntaxError`にヒットして関係のないエラーが出ることがありますが、

```
"SyntaxError: Missing parentheses in call to 'print'"
```

と`""`で囲んで検索すれば、完全一致する結果が出ます。

<img width="500" alt="Screen Shot 2018-06-28 at 16.57.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/108729/5943f30d-8cfe-1555-1fbe-e9b4aa4a28c8.png">

# 2. ワイルドカードを使いたい時： `*`

検索句の中で、「この部分の単語だけ分からない」という場合や、「この部分にはどんな単語が入ってもいい」という場合、つまりワイルドカードを使いたい時は、おなじみのアスタリスク`*`で対応できます。

例えば、`SyntaxError: Missing parentheses in call to 'print'`というエラーが出たが、`print`というのは特定の場合で、そもそも`SyntaxError: Missing parentheses in call to`というエラーが何を表しているのか知りたいという場合は、

```
SyntaxError: Missing parentheses in call to *
```
と検索するとよいです。

<img width="500" alt="Screen Shot 2018-06-28 at 17.02.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/108729/9baf302f-244b-3e9a-d093-a308e19441a6.png">

# 3. ある単語を検索結果から除外したい時： `-`

検索結果の中から、この単語を含むものを除外して欲しいという場合は、マイナス`-`を使います。例えば、`anaconda`を検索したいが、pythonに関するものが出てきてしまう、純粋な`anaconda`を検索したいんだ！という場合です。

```
anaconda -python
```
のように検索します。

<img width="500" alt="Screen Shot 2018-06-28 at 17.11.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/108729/b1db753a-1c8b-e628-b89a-3c046ba2588d.png">

# 4. 特定のサイト内を検索したい時： `site:`

特定のサイト内で検索をしたい時は、`site:`を使います。

例えば、`channels`という単語をGolangの公式サイト内で検索したい場合は、

```
channels site:https://golang.org
```
とします。

<img width="500" alt="Screen Shot 2018-06-28 at 17.16.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/108729/bf2eb92f-7697-6ab3-6426-c7557289f46c.png">

# 5. 単語の定義を知りたい時： `DEFINE:`

単語の定義を知りたい時は、`DEFINE:`を使えば、一発で定義を知ることができます。

例えば、`SyntexError`の意味が分からない時、

```
DEFINE: SyntaxError
```
とします。

<img width="500" alt="Screen Shot 2018-06-28 at 17.23.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/108729/e838ea01-d041-13a5-35e7-bffa0582505a.png">


# 6. 関連サイトを検索したい時： `related:`

特定のサイトに関連するサイトを検索したい時は、`related:`を使います。

```
related:https://golang.org/
```
<img width="500" alt="Screen Shot 2018-06-28 at 17.33.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/108729/12894c20-6b0d-2ee8-1eb7-8e3190c1258e.png">

# 7. 特定のURLにリンクしているサイトを知りたい時： `link:`

特定のURLにリンクしているサイトを知りたい時は`link:`を使います。

```
link:https://www.hongkiat.com/blog/better-google-searching/
```

<img width="500" alt="Screen Shot 2018-06-28 at 17.37.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/108729/20d81f79-4fcb-1d89-ea3c-d1aed74c5861.png">

# 参考
http://time.com/4116259/google-search-2/
https://www.hongkiat.com/blog/better-google-searching/
【Swift】タップしたら大きくなって離したらボヨボヨするUIButtonのサブクラスを作ったよ

さがせばgithubにもっといいのあると思うけどね

# 環境

Xcode9.4.1
Swift4

# イメージ

![test.gif](https://qiita-image-store.s3.amazonaws.com/0/70276/33806566-9a54-b94b-174c-432776c6ee06.gif)


# 実装

```swift
class ExpandButton: UIButton {
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.commonInit()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.commonInit()
    }
    
    func commonInit() {
        self.addTarget(self, action: #selector(self.touchDownAnimation), for: .touchDown)
        self.addTarget(self, action: #selector(self.touchUpAnimation), for: .touchUpInside)
        self.addTarget(self, action: #selector(self.touchUpAnimation), for: .touchUpOutside)
        self.addTarget(self, action: #selector(self.touchUpAnimation), for: .touchCancel)
    }
    
    @objc
    func touchDownAnimation() {
        let scale: CGFloat = (round(UIScreen.main.bounds.width / self.bounds.width / 2) / 10) + 1
        UIView.animate(
            withDuration: 0.1,
            delay: 0,
            options: .curveLinear,
            animations: {
                self.transform = self.transform.scaledBy(x: scale, y: scale)
        },  completion: nil)
    }
    
    @objc
    func touchUpAnimation() {
        UIView.animate(
            withDuration: 0.5,
            delay: 0,
            usingSpringWithDamping: 0.2,
            initialSpringVelocity: 10,
            options: .curveEaseOut,
            animations: {
                self.transform = .identity
        }, completion: nil)
    }
}

```

# 説明とか

- ボタンの色が変わるのが嫌な場合はStyleをCustomにすれば大丈夫なはず！
- `let scale: CGFloat = (round(UIScreen.main.bounds.width / self.bounds.width / 2) / 10) + 1`これは、ボタンのサイズによって拡大率を適当に調整しています。小さいボタンだったら、大きなボタンだったら小さめに大きくなります。同じ倍率で大きくすると変だったので！(これ+50ptとかで指定して大きくしたほうがよかったかも...)
macOSでのPython3.7のインストール方法（インストーラ利用）

Pythonの最新バージョン、3.7の正式版がリリースされました。インストール方法はいくつかありますが、今回はイントーラを利用した方法の紹介をします。なお、macOSですとdmg形式のことが多いですが、Windowsで言うmsi形式に該当するpkg形式です。

# 公式ホームページからインストーラをダウンロードします。
![Python公式ホームページのダウンロードページ](https://qiita-image-store.s3.amazonaws.com/0/139375/f87f16eb-4020-4ffc-4756-07f309970413.png)
こちらの[Python公式ホームページのダウンロードページ](https://www.python.org/downloads/release/python-370/)で、上記画像赤枠部分からインストーラをダウンロードします。

<img width="269" alt="スクリーンショット 2018-06-28 14.48.37.png" src="https://qiita-image-store.s3.amazonaws.com/0/139375/8475f12d-4594-12c9-1221-8ad3604bbfd8.png">

ダウンロードしたインストーラはこのように表示されます。このインストーラを開き、インストール作業に入ります。インストーラなので、GUIで特に迷うことなくインストール作業自体は終えることが出来るでしょう。インストールが完了すると、ApplicationsディレクトリにPython 3.7のディレクトリが作成されます。最後にインストールができているか確認します。ターミナルを開き、以下のコマンドを実行してみてください。

```shell
$ python3 -V
```

Python 3.7と表示されていれば、インストールは完了です。






# 追記 HomebrewでPythonのインストールをするとどうなるか

この投稿の最初にも記載しましたが、dmg形式やpkg形式はダウンロードしたディスクイメージ、パッケージをインストールします。これに対してHomebrewは、リポジトリ上に用意されたパッケージを検索し、インストールできます。また、あるパッケージを利用したい場合、別のパッケージがその動作に必要なことがありますが、動作に必要なパッケージも同時にインストールしてくれます。これを「パッケージ管理システム」と呼びます。他にもMacPortsがありますが、現在はHomebrewを利用するのが一般的です。仕組みとしてはソースコードをビルドしてインストールするという流れです。加えてHomebrewでは、ビルド済みのバイナリを提供する「homebrew-binary」も途中から提供され始めました。

このHomebrewを用いて、インストールを試みるとどうなるでしょうか。ターミナルで以下のコマンドを実行してみてください。

```shell
$ brew install python
```

しかし、2018/06/28時点でまだインストール可能なのは3.6.5.1。3.7のインストールをするにはソースコードをダウンロードして、ビルド、インストールする手段もありますが、少々敷居が高いため、現時点ではインストーラを用いたほうがいいでしょう。

関連ページ
[Pipenvを用いたPythonの環境構築](https://qiita.com/anvinon/items/5d9c128ef8b65b866dfe)
（Pythonのインストールを完了した後は、Pipenvを用いて環境構築に入るとベターです）
他のエディタと同じようにVSCodeでも選択したテキストをクォートで囲う

下記のようにキーバインドを追加すればOK。
（※Windows/JISキーボード）

```json:keybindings.json
{
    "key": "shift+7",
    "command": "editor.action.insertSnippet",
    "when": "editorTextFocus && editorHasSelection",
    "args": {
        "snippet": "'$TM_SELECTED_TEXT$0'"
    }
},
{
    "key": "shift+2",
    "command": "editor.action.insertSnippet",
    "when": "editorTextFocus && editorHasSelection",
    "args": {
        "snippet": "\"$TM_SELECTED_TEXT$0\""
    }
}
```
![5086c78012dace71fae0361aaf47f6c6.gif](https://qiita-image-store.s3.amazonaws.com/0/34660/6eef7223-5ee4-a808-a48c-bbe3aba0be67.gif)
【AWSによるサーバーレスアーキテクチャ】3章

### 3章のはまり所
---
めちゃくちゃハマっているので各章での備忘録をまとめます。

---
### ハマりポイント
---
1. P66 AWS SNSのアクセスポリシーの書き換え
2. P67 SNSトピックの設定画面


- P66 AWS SNSのアクセスポリシーの書き換え

本のまんまやると構文エラーになる。
Amazonの公式ページの設定内容を見ると
Conditionフィールド内のアトリビュートが複数ある場合は
カンマを使用する必要がある。

```
{
    "Version":"2012-10-17",
    "Id":"MyAWSPolicy",
    "Statement" :[
        {
            "Sid":"My-statement-id",
            "Effect":"Allow",
            "Principal" :"*",
            "Action":"sns:Publish",
            "Resource":"arn:aws:sns:us-east-1:111122223333:My-Topic",
            "Condition":{
                "StringEquals":{ "AWS:SourceAccount":"444455556666" } ,
                "ArnLike": {"AWS:SourceArn": "arn:aws:s3:*:*:*" }
            }
        }
    ]
}
```

- P67 SNSトピックの設定画面

なぜかパーミッションエラーとなる。アクセスポリシーのConditionフィールド内
StringEqualsをまるっと消したらエラーが消えた。。

StringEqualsについては調べる体力がないのでこれまで

本に行き詰ったときにはURLが参考になるでしょう。←ならない・・・

---
## 追記(2018/8/16)

FFprobeのStatic Buildを用意する必要がありWindowsPCで色々試行していたが上手くいかなかった。

ffmpeg の Static Build を Linux 環境に導入するワンライナー
http://blog.morugu.com/entry/2018/02/06/013551

こちらの記事を参考にLinux(AWS Linux)でffmpegをビルドしてffprobeのみ
プロジェクトフォルダの/binフォルダに格納して解決。
Ubuntu14.04 で OpenPose を使おうとしてつまったところ

#環境
ubuntu 14.04
cuda 8.0
cuDnn 5.1.5
[OpenPoseを動かしてみた。](https://qiita.com/nnn112358/items/a4490d85dac5827db53b)を参考にセットアップ
#エラー
OpenPose のインストールするところでエラー

>Errors detected. Exiting script. The software might have not been successfully installed.

#解決

[OpenPose - Installation](https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/installation.md)を読んでCmakeを使ったらいけた。
#雑感
Taitan Xでfps15～17程度だった。ハンドやフェイスも取ると更に落ちる。
使い道はたくさんあるし遊びがいがありそう。
Hyperledger Composer をたじたじと使ってみた(作成編)

この記事は Hyperledger Composer のチュートリアルを読みつつメモのためにざくざくと和訳、加筆したものです。
準備編はこちら → https://qiita.com/Real_analysis/items/4f6a2943df9a5b1c4d8e

# Developer tutorial for creating a Hyperledger Composer solution

## Step One: Creating a business network structure

yo で雛形を作るよ。いろいろ聞かれるからこんな感じに入力しようね

```bash
yo hyperledger-composer:businessnetwork
Welcome to the business network generator
? Business network name: tutorial-network 
? Description: hogehoge
? Author name: yourname
? Author email: hogehoge@hugahuga.co.jp
? License: Apache-2.0
? Namespace: org.example.mynetwork
? Do you want to generate an empty template network? 
No: generate a populated sample network
```

## Step Two: Defining a business network

### Modelling assets, participants, and transactions

定義体をつくるよ。詳しいことはここ [Hyperledger Composer Modeling Language](https://hyperledger.github.io/composer/latest/reference/cto_language.html) に書いてあるよ。
それぞれの定義の違いはなんとなくこんな感じだよ

* Asset:操作されるもの
* Participant:操作する人
* Transaction:データを操作するためのトリガ

これを定義するといい感じにRESTポイントが作成されるよ。

### Adding JavaScript transaction logic
JSでロジックを書いていくよ。
APIについては[ここ](https://hyperledger.github.io/composer/latest/api/api-doc-index)に書いてあるよ。

* `@param` 書いた形と定義体が対応していて、通知があるとこの関数が実行されるよ

### Adding access control
アクセスコントロールを書いていくよ。
今回は全許可でいくよ。

## Step Three: Generate a business network archive

composer にインポートするためのバイナリを作成するよ。

```bash
composer archive create -t dir -n .
```

## Step Four: Deploying the business network

### Deploying the business network

今のファイルをインポートしてスタートするよ

(私はなぜか `--archiveFile tutorial-network@0.0.1.bna` の部分が `fabric-dev-servers` からの相対パスじゃないと通りませんでした)

```bash
composer network install --card PeerAdmin@hlfv1 --archiveFile tutorial-network@0.0.1.bna
composer network start --networkName tutorial-network --networkVersion 0.0.1 --networkAdmin admin --networkAdminEnrollSecret adminpw --card PeerAdmin@hlfv1 --file networkadmin.card
composer card import --file networkadmin.card
composer network ping --card admin@tutorial-network
```


## Step Five: Generating a REST server

RESTサーバがコマンド一つで立つよ。すごい。
(本家でガイドされている質問内容と出てくる質問の内容が微妙に違うので注意)

```bash
composer-rest-server
? Enter the name of the business network card to use: admin@tutorial-network
? Specify if you want namespaces in the generated REST API: never use namespaces
? Specify if you want to use an API key to secure the REST API: No
? Specify if you want to enable authentication for the REST API using Passport: 
No
? Specify if you want to enable event publication over WebSockets: Yes
? Specify if you want to enable TLS security for the REST API: No

```

`http://localhost:3000/explorer/` にアクセスするとテスト用のページが開けるよ

----
ちなみにアップグレードはソースプロジェクトの `package.json` のバージョンを更新したあとにbnaを再生成し `composer network upgrade` 行えます

```bash
composer network upgrade --networkName tutorial-network --networkVersion 0.0.2 --card PeerAdmin@hlfv1
```

----
Paginator リファクタリング

# Before

```js
const p = (s, n) => {
  const r = []
  for (let i = 1; i <= s; i++) {
    if (i < n - 5) {
      if (i == 1) r.push(i)
      continue
    } else if (i > n + 5) {
      if (i == s) r.push(i)
      continue
    } else if (i == n + 5) {
      if (i == s) {
        r.push(i)
        continue
      }
      r.push('...')
    } else if (i == n - 5) {
      if (i == 1) {
        r.push(i)
        continue
      }
      r.push('...')
    } else if (i == n) {
      r.push(`[${i}]`)
    } else {
      r.push(i)
    }
  }
  return r
}

console.log(p(20, 10).join(' ')) // 1 ... 6 7 8 9 [10] 11 12 13 14 ... 20
```

# After

```js
const q = (s, n) => {
  const r = []
  const m = Math.max(1, n - 4)
  const mm = Math.min(s, n + 4)

  if (1 < m) r.push(1)
  if (2 < m) r.push('...')

  for (let i = m; i <= mm; i++) {
    if (i == n) {
      r.push(`[${i}]`)
    } else {
      r.push(i)
    }
  }

  if (mm < s - 1) r.push('...')
  if (mm < s) r.push(s)

  return r
}

console.log(q(20, 10).join(' ')) // 1 ... 6 7 8 9 [10] 11 12 13 14 ... 20
```

# Compare

```js
const f = (func, s, n, t) => {
  console.time(t)
  console.log(func(s, n).join(' '))
  console.timeEnd(t)
}

f(p, 20, 10, 'p')       // p:  0.312255859375ms
f(q, 20, 10, 'q')       // q:  0.317138671875ms
f(p, 2000000, 10, 'p')  // p: 14.244140625ms
f(q, 2000000, 10, 'q')  // q:  0.30615234375ms
```

てか良い子はライブラリを使おう
超解像用のPSNRをPythonで算出する

# 単一画像超解像の評価方法
単一画像超解像の評価にはSSIMやPSNRなどの指標が挙げられますが，今回は特にPSNRを焦点に当てます．
多くの論文はおそらく
https://github.com/jbhuang0604/SelfExSR
の sr_quant_eval.m の実装を参考にしていると思います．

この中でやっていることは
超解像画像と正解画像をRGBからYCbCrに変換して輝度値Yだけを取り出す．
周囲 $cr$ ピクセルを除外した上で超解像画像と正解画像の $\mathrm{MSE}$ を算出する．
その上で以下の式を用いて $\mathrm{PSNR}$ を求める．

$$ \mathrm{PSNR} = 10\times log_{10}{\frac{255^2}{\mathrm{MSE}}} $$

式自体は非常に単純であるので上のリンクはMATLABで書いていますが別に他の言語でも実装は簡単そうです．

特に最近は機械学習の影響でPythonで実装しようとする方も多いと思います．
その際，OpenCVを使うと思わぬ穴にはまります．

# MATLABとOpenCVではRGB→YCbCrの計算式が異なる
上に書いた通りです．MATLABとOpenCVではRGB→YCbCrの計算式が異なります．
なるべく寄せたコードがこちらです．

```python
import numpy as np
import math

def psnr(img1, img2):
    mse = np.mean((img1 - img2) ** 2)
    if mse == 0:
        return 100
    PIXEL_MAX = 255.0
    return 10 * math.log10(PIXEL_MAX * PIXEL_MAX / mse)


def extract_y(image: np.ndarray) -> np.ndarray:
    if image.ndim == 2:
        return image
    image = image.astype(np.float64)
    return ((image[:, :, 2] * 65.481 / 255.
             + image[:, :, 1] * 128.553 / 255.
             + image[:, :, 0] * 24.966 / 255.) + 16)

def evaluate(img1: np.ndarray, img2: np.ndarray, upscaling=4):
    # BGR -> YCrCb
    # 画像はcv2.imreadで読まれている前提 [0, 255]
    y1 = extract_y(img1)
    y2 = extract_y(img2)

    # 周囲のcropping
    # assert y1.shape == y2.shape
    h, w = y1.shape
    cr = upscaling
    cropped_y1 = y1[cr:h - cr, cr:w - cr]
    cropped_y2 = y2[cr:h - cr, cr:w - cr]

    # psnr
    psnr_val = psnr(cropped_y1, cropped_y2)
    return psnr_val
```

まだ微妙にMATLABとずれるので厳しい
WA-IFTTT integrationでのwa chabot app の使い方

https://wpa-chat-bot.mybluemix.net/  にアクセスしてください

![スクリーンショット 2018-06-28 17.00.31.png](https://qiita-image-store.s3.amazonaws.com/0/181748/9636fdf7-e800-c0dc-3078-ea19dd5cb10d.png)


##■初期状態

https://wpa-chat-bot.mybluemix.net/にアクセスすると、
表示された初期　current settings  はそれぞれと思います。

--なので、settingの変更が必要です。--

##■WA-IFTTT tutorialで使えるようにために変更必要項目

WA key ：tutorialで使っているWAS consoleにログインするためのapi-key
skillset：tutorialで作成したskillsetのname (注意：/SkillSets-Skills APIで skill-skillsetのlinkが必要です)
userid：SSOの登録で利用しているIBMidのメールアドレス

##■変更方法

/WA key api-key  (例：/WA key 1234567-8900-0000-0000-000000000000 )
/skillset skill名　(例：/skillset xxiftttskill0627 )
/userid メールアドレス　(例：/userid xxxxx_xxxx_com)
*注意：1234@gmail.comの場合、1234_gmail_comに変更してください。

##■確認方法

画面の右側上のrequset JSONで変更した設定を確認できます。
画面の右側下のresponse JSONで予想のreturnが返すかどうかを確認できます。
同じような if 文が複数箇所に現れる場合、Strategyパターンを検討しよう。

[これ](https://twitter.com/amoO_O/status/1012167368020090880)

```js
const func = (type) => {
  if (type == 'foo') {
    // ...
  } else { // type == 'bar'
    // ...
  }
  // ...
  // ...
  if (type == 'foo') {
    // ...
  } else {
    // ...
  }
  // ...
  // ...
}
```

このように `type` とか `hoge_flg` みたいなものによって処理の **一部** が変わるような場合、その部分の処理は実はその `type` そのものに帰属する、と考えるとうまくいくことがある。
以下では `type` の代わりに `strategy` というオブジェクトを用意し、`type` ごとに異なる `strategy` を渡すことで処理の違いを表現している。

```js
const func = (strategy) => {
  strategy.f()
  // ...
  // ...
  strategy.g()
}
```

適用前では下記のようなデメリットがあったのが、適用後で払拭されるだけでなく、新たなメリットも生んでいる。

- 適用前
    - 新しいタイプ `'baz'` が出来た時複数箇所を修正する必要がある
    - 一つの関数内に、`type` ごとに異なる処理が一緒くたにされておりテストしづらい
- 適用後
    - テスト対象が `foo_strategy`, `bar_strategy`, 及び `func` に分離できる
    - `func` のテストには `mock_strategy` を渡すことで処理を模倣することができる
    - 新しい `baz_strategy` が増えても既存のコードの変更は不要
Proxy パターン

Proxy パターンは、あるオブジェクトと同じように振る舞う代理クラスを用意する、という実装テクニックである。
代理クラスを用意するテクニックはいろいろなところで使われる。例えば、

- String の代わりに HTMLString, RawString といったクラスを用意する
    - ユーザーが入力した文字列を直接表示してしまうことによる XSS 攻撃を防ぐ
- Image の代わりに LazyImage クラスを用意し、実際に画像が必要になるまで読み込みを遅らせる
- 本物のオブジェクトの代わりに Mock オブジェクトを使う
- 実際のオブジェクトの代わりにそのオブジェクトの参照と参照カウンタを持つオブジェクトを使う
- 読み込むのに時間がかかるデータを待たずに Future オブジェクトを返す
    - 代理人を用意するという点で Proxy パターンの亜種ではあるが、クラス図や振る舞いが異なるので同じパターンと言って良いかは微妙

# クラス図
![439px-Proxy_pattern_diagram.svg.png](https://qiita-image-store.s3.amazonaws.com/0/38864/b3d04043-8ed8-1526-5c35-ef70d0da79df.png)

# 実装例

## String の代わりに HTMLString, RawString といったクラスを用意する

```scala
trait SmartString {
  def get: String
}

class RawString(val original: String) extends SmartString {
  def get: String = original
}

class HtmlString[T <: SmartString](val original: T) extends SmartString {
  lazy val escapedString = original.get
    .replaceAll("<", "&lt;")
    .replaceAll(">", "&gt;")

  def get: String = escapedString
}

// 引数に HtmlString を指定することで、Escape されていない RawString が表示されるのを防ぐ
def showText[T <: SmartString](text: HtmlString[T]): Unit = {
  println(text.get)
}

val x = new RawString("<script>alert(\"this is raw string\");</script>")
val y = new HtmlString(x)

// showText(x)  // コンパイルエラー
showText(y)     // &lt;script&gt;alert(\"this is raw string\");&lt;/script&gt;
```

# 実装 in real world
- shared_ptr
    - 直接オブジェクトの生成／破棄を管理する代わりに、参照カウントを保持するオブジェクトを生成して管理させる
    - リファレンス https://isocpp.org/wiki/faq/cpp11-library#shared-ptr
    - ライブラリ https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/include/bits/shared_ptr.h#L103
- 画像の遅延ロード
    - 実際に画像が必要になるまで読み込みを遅らせる
    - https://github.com/tuupola/jquery_lazyload/blob/master/jquery.lazyload.js#L99

# 他のパターンとの関係

- Adaptor パターン
    - Adapter パターンは、既存クラスを変更することなくインターフェースを変えるテクニックである。
        - 同じ機能を持つ複数のサードパーティ製ライブラリを、ユーザーの好みで切り替えて使えるようにしたいが、インターフェースが各社バラバラで、サードパーティ製なのでインターフェースをいじれない。
        - そういった時に使えるデザインパターン
    - サードパーティ製ライブラリの「代わりに」使うという点で Proxy パターンと似ているが、本物クラスとプロキシクラスのインターフェースは共通していないという点で異なる。目的も違うので間違うことは少ないだろう
- Decorator パターン
    - Decorator パターンは、既存クラスを変更することなく新たな機能を加えるテクニックである。
    - デコレートしたオブジェクトを、実際のオブジェクトの「代わりに」使うという点で、 Proxy パターンとよく似ている。
    - 目的が異なる
        - Decorator パターンは機能の追加に主眼をおいている
        - Proxy パターンは本物のオブジェクトが何らかの理由（負荷やまだ存在しない、など）で利用出来ない場合にその代理を行う
【AWSによるサーバーレスアーキテクチャ】3章Lambdaのエラーについて

### はじめに
---
AWSによるサーバーレスアーキテクチャという書籍を参考に
AWS Lambdaにコードをアップロードしたところ下記の通り
エラーとなった。

**エラーメッセージ**

```
Unable to import module 'index': Error
```

根本的な原因は分かっていないが、結果としてAWS Lambdaを動作
させる事に成功したのでやったことを記録として残しておきます。

OS : Windows10

---
### やったこと
---
1. 書籍に記載されている通り環境設定
- Windowsのためgnuwin32よりzipを個別インストール
- AWS Lambdaにコードを含めたファイルをzip化してアップロード　※エラー

package.jsonのscripts欄にzip化を自動的に行うように設定しています。

---
### その後
---
- jsファイル含めた一式を手動でzip化（zipソフトはlhaplus）してアップロード AWS Lambda動作成功

やったことの３の後、参考にさせていただいサイトを見て、書籍の通りzip化するとフォルダ毎zipにされるためハンドラ名と一致しないのが原因だと分かり、ハンドラ名をzipファイル名/index.handlerに変えてもダメでした。

gnuwin32のzipがおかしいと思いますが
何が原因なのかは特定できてません。

### 参考
---
- [Lambdaでアップロードしたzipに対してハンドラーを指定する方法についての、あまりなさそうな勘違い](https://qiita.com/attakei/items/e4c2b885da77faed01db "Lambdaでアップロードしたzipに対してハンドラーを指定する方法についての、あまりなさそうな勘違い")

- [S3からAmazon Elasticsearch Serviceへログを流してみた](https://qiita.com/tom_furu/items/1750cc5ca28b76da11f1 "S3からAmazon Elasticsearch Serviceへログを流してみた")
iTermのタイトルバーDark設定。おまけにタブLeft。

こんにちは、先日vscodeからiTermに帰ってきました、ただいまiTerm。vscodeは機能がすごいですねー便利でした。

# グレーのタイトルバー黒く、おまけにタブもなんだかオシャレだな

いやーいつ設定できるようになってたんだろう、やっぱ黒いとHyperみたいでかっこいいね。
前からこれ黒くしたかったんだよねー、けっこう前からできるようになってたんかなー、わからんけど。

<img width="224" alt="2__zsh.png" src="https://qiita-image-store.s3.amazonaws.com/0/131847/674535da-60dc-8f7f-21fb-065c070ded4d.png">

# タイトル黒くする設定

1.iTerm開く
2.⌘ + ,
3.Appearance
4.左上あたりのTabs → Theme → Dark
5.右下あたりのWindow → Show line under ... → チェックはずす
　(*お好みで、はずしたらフラットになってすきかな)

# タブの位置設定

1.iTerm開く
2.⌘ + ,
3.Appearance
4.左上あたりのTabs → Tab bar location → Left

<img width="775" alt="iterm.setting.1.png" src="https://qiita-image-store.s3.amazonaws.com/0/131847/3d226974-3537-a2bd-59ef-e5ae5b95b21a.png">
ディレクトリ(フォルダ)を作成するプログラム

#はじめに
今回はフォルダを作成するプログラムを組みました。

#ソースコード
```
namespace Sample
{
    class Sample
    {
        static void Main()
        {
            string path = @"C:\oosako";

            Directory.CreateDirectory(path);

            Console.WriteLine("フォルダを作成しました");
            Console.ReadKey();
        }
    }
}
```
![foruda.png](https://qiita-image-store.s3.amazonaws.com/0/249273/eab0f5bc-951e-c350-cad6-eae8a1f62989.png)
#実行結果

![foruda2.png](https://qiita-image-store.s3.amazonaws.com/0/249273/f9d62d0d-d93c-c4a5-ab35-c7ae87d1f26b.png)

#フォルダの確認
これだけじゃ本当に作成できたのかわからないので確認するプログラムを作成

![foruda3.png](https://qiita-image-store.s3.amazonaws.com/0/249273/13b4b54f-c8d9-845b-a03f-22862ad7ef13.png)

実行結果
![foruda4.png](https://qiita-image-store.s3.amazonaws.com/0/249273/ee5cfe61-944e-bf44-445d-24f160229e0e.png)
BetterErrors のエディタを $EDITOR 以外のENVで設定できるようにする

- 基本的には環境変数　`$EDITOR` を参照してくれるようにもともとなっている。
- 今回の場合は `$EDITOR` では設定したくない場合用
- `$EDITOR` で設定する場合には公式ドキュメント参照 ([Link to your editor · charliesome/better\_errors Wiki](https://github.com/charliesome/better_errors/wiki/Link-to-your-editor))


**config/initializers/better_errors.rb**

```ruby
# ENV['BETTER_ERROR_EDITOR']
#
# Uses one of the preset editor configurations.
# Valid text are:
#   'atom', 'vscode', 'textmate', 'txmt',
#   'tm', 'sublime', 'subl', 'st', 'macvim'
if Rails.env.development? && ENV['BETTER_ERROR_EDITOR']
  BetterErrors.editor =
    case ENV['BETTER_ERROR_EDITOR']
    when 'atom' then 'atom://open?url=file://%{file}&line=%{line}'
    when 'vscode' then 'vscode://open?url=file://%{file}&line=%{line}'
    else ENV['BETTER_ERROR_EDITOR'].to_sym
    end
end
```

**設定確認**

```shell_session
$ spring stop; BETTER_ERROR_EDITOR='vscode' rails c
Spring stopped.
Running via Spring preloader in process 16746
Loading development environment (Rails 5.2.0)

Frame number: 0/29
[1] pry(main)> BetterErrors.editor.call
=> "vscode://open?url=file://&line="
```
WindowsでもProcessingでshell関数を使うメモ

# 概要
- Processingにはシェルコマンドを実行できるshell関数がある
- しかしながらWindowsにはしばらく対応していなかった
- いつの間にか対応していたことをついさっき教わったので書く
- Windows Subsystem for Linuxを併用する場合についても書く

# 環境
- Windows 10 Pro
- Processing 3.3.7

# 基本的な使い方
```java
StringList strout=new StringList(); //出力が入る変数
StringList strerr=new StringList(); //エラーが入る変数

shell(strout,strerr,"dir"); //三つ目の引数に実行したいコマンドを入力する

for(String el:strout){
  println(el);
}

for(String el:strerr){
  println(el);
}
```

## ポイント
- コマンドはワンライナーで書くと良い
    - コマンドプロンプトで二つ以上のコマンドを連ねる場合は `&&` を用いる
    - `shell(strout,strerr,"cd ..\\ && dir");` のようになる

## bashのコマンドを使いたい場合
- コマンドの前に `wsl ` をつける
    - `wsl ls`みたいに
- bashで二つ以上連ねる場合は `;` を使う
    - `shell(strout,strerr,"wsl cd ../;ls");`

# 注意
## カレントディレクトリの保持問題
- これはできない
    - `shell(strout,strerr,"wsl cd ../&&dir");`
- これはできる
    - `shell(strout,strerr,"cd ..\\&&wsl ls");`
- `wsl` が叩かれた時のカレントディレクトリはコマンドプロンプトから引き継いでいる
    - コマンドプロンプトで試してみれば分かる

##  文字コードの問題
- これもできない
    - `shell(strout,strerr,"echo こんにちは");`
- これはできる
    - `shell(strout,strerr,"wsl echo こんにちは");`
- コマンドプロンプトの文字コードはShift-JISでProcessingの標準出力はUTF-8
- `dir`コマンドも日本語名のファイルは文字化けする
    
## その他覚えておくと良いこと
- `call`と`start`の違い
    - `shell(strout,strerr,"wsl echo こんにちは >> note.txt&&call notepad.exe note.txt&&wsl cat note.txt");`
    - メモ帳が閉じたときの`note.txt`の内容が出力される
- 改行コードの違いとかも忘れないでおきたい

# まとめ
- 途中からコマンドプロンプトとBash on Windowsを併用したワンライナーの説明みたいになってた
- Processingの夢が広がるたのしいshell関数みんなも使ってみてね
java ディレクトリ作成

ディレクトリの作成にはFileクラスのmkdirメソッドを使用します

```java
public class fileClass{
	public fileClass() throws IOException{
		
		File dir = new File("/Users/Shared/java/");
 
		//mkdirを使用してディレクトリを作成する
		dir.mkdir();
	}
}
```

上記のサンプルコードではFileクラスのインスタンスに絶対パスでディレクトリを作成し、mkdirメソッドで作成しています。

ファイルを作成する際、すでに作成済みでもさらに作成されることはないです。
java ファイル作成

 javaでファイルを作成する際、FileクラスのcreateNewFileメソッドを使います。
  File newfile = new File("/Users/Shared/java/ファイル名");        
すでに同名のファイルが存在する場合、作成に失敗するのでfalseを返します.


サンプルコード

```java
public class fileClass{
	public fileClass() throws IOException{
		
		File file = new File("/Users/Shared/java/java.txt");
		
		//createNewFileメソッドを使用してファイルを作成する
		if (file.createNewFile()){
			System.out.println("ファイル作成成功");
		}else{
			System.out.println("ファイル作成失敗");
		}
	}
}
```

指定先のディレクトリが見つからない場合、"IOException”の例外が発生するので注意が必要です。
javaで日付を取得する方法

javaで日付を取得する方法は色々あります。

Dateクラス

java.util.Date
Dateクラスはjavaの初期から使われているクラスで日付の取得や表示に使われることが多い。
しかし非推奨のメソッドが多いので注意が必要。

Calendarクラス

java.util.Calendar
CalendarクラスはDateよりも機能が豊富で日付の計算や参照ができるクラス。

ここではcalendarクラスを使用した日付の取得方法を紹介します。

```c#:java
import java.util.Calendar;

public class Main {
	public static void main(String args[]){
		//日付を取得
		Calendar cal = Calendar.getInstance();
                //月のみ0から数えるため+1しておくとわかりやすい.
                int month = cal.get(Calendar.MONTH) + 1;
                System.out.println(cal.get(Calendar.YEAR) + month + cal.get(Calendar.DATE));


	}
}
```

実行結果(2018年6月28日の場合)
2018628
イライラするWindowsの英数/かな入力切り替えをMacライクに変更する

Windows環境でMacみたいに”英数を押したら英数に、かなを押したらかな入力に”したい人向け。

Win10だと、IME（ツールバーの”あ”というアイコン）右クリック→プロパティ→全般タブの編集操作-変更
下図のように英数キーとひらがなキーのキーバインドを変更すればOK


![image.png](https://qiita-image-store.s3.amazonaws.com/0/256786/a61ba13a-2290-5591-1058-642069479ba4.png)


この設定なら、Googleと打ちたいのにかな入力のまま打ってしまい、
<u>ごおｇぇ</u>
となっても英数キーを押下すれば修正可能。
【React Native】Cannot Add a child that doesn't have a YogaNode to a parent with out a measure function


## エラー内容
`Cannot Add a child that doesn't have a YogaNode to a parent with out a measure function`
iOSでは発生せず、Androidのみ発生。

## 原因
エミュレータやネイティブ環境には原因がなく、実装上の問題
`<Text>`で囲まれていない文字列がある場合に発生。

## 今回の場合
- ボタンクリックでコンポーネントを表示したい => デフォルトで非表示になる子コンポーネントを作成
- 子コンポーネントはフラグによって`''`を返す => **アウト**

## アウト
例：パスワード表示/非表示にするtoggle

```jsx
const SubComponent = (props: togglePasswordProps) => {
  const {
    style, name, togglePassword,
  } = props;

  if (name !== NAMES.PASSWORD) return ``;

  return (
    <TouchableOpacity
       onPress={togglePassword}
    >
      <Text style={style}>表示</Text>
    </TouchableOpacity>
  );
};
```

## OK
例：パスワード表示/非表示にするtoggle

```diff
const SubComponent = (props: togglePasswordProps) => {
  const {
    style, name, togglePassword,
  } = props;

-  if (name !== NAMES.PASSWORD) return ``;
+  if (name !== NAMES.PASSWORD) return null;

  return (
    <TouchableOpacity
       onPress={togglePassword}
    >
      <Text style={style}>表示</Text>
    </TouchableOpacity>
  );
};
```

## 参考
https://github.com/facebook/react-native/issues/13243
文字列を連結するプログラムの作成　C#

#はじめに
今回は文字列を連結させる簡単なプログラムを作成しました。

表示させるのはVisualstudioを連結させたいと思います。


#ソース
```
namespace Sample
{
    class Sample
    {
        static void Main()
        {
            string str1 = "Visual";
            string str2 = "studio";
 
            StringBuilder sb = new StringBuilder();
            sb.Append(str1);
            sb.Append(str2);
 
            string result = sb.ToString();
 
            Console.WriteLine(result);
 
            Console.ReadKey();
        }
    }
}
```


#![無題.png](https://qiita-image-store.s3.amazonaws.com/0/249273/079d3339-561c-4301-df5f-4cd3aac8e9ff.png)

#実行結果
![a.png](https://qiita-image-store.s3.amazonaws.com/0/249273/cca75b85-a65a-b8e1-1cd2-ccd1f29e4761.png)
blacklistd(8) 利用中 Windows 版 filezilla でログイン出来ない時の対処法

#環境
FreeBSD 11.1-RELEASE
ipfw 運用中
blacklistd で ssh を監視
port は標準外で運用 (_9022 を利用を仮定_ )

#対処法
```txt:/etc/blacklistd.conf
9022		stream	*	*		*	4	60
```

#原因
認証失敗回数がデフォルトの記述では **3 回**となっているので **4 回**に増やせば回避できる。
Tableau WDCの「Allow-Control-Allow-Origin: *」問題を回避してみる（Ajax+JSONP版）

[Tableau WDCの「Allow-Control-Allow-Origin: *」問題を回避してみる（Proxy https版）](https://qiita.com/tashiro_gaku/items/6aa91507df786fc12cb7)

をJSONPを使っての対応版です。
こちらすごく簡単でした

プロキシーを使って、CORSを回避する方法

```javascript
    myConnector.getData = function (table, doneCallback) {
        tableau.log("getData" );
        $.getJSON(
            "http://localhost:8889/ucopendb.gsi.go.jp/ucode/api/search.json?pref_code=11",
//           "http://ucopendb.gsi.go.jp/ucode/api/search.json?pref_code=12",
            function(resp) {
                var feat = resp.items, tableData = [];

                // Iterate over the JSON object
                for (var i = 0, len = feat.length; i < len; i++) {
                            tableData.push({
                        "status_code": feat[i].status_code,
                        "ucode_url": feat[i].ucode_url,
                        "name": feat[i].name,
                        "feature": feat[i].feature,
                        "city_code": feat[i].city_code,
                        "ucode": feat[i].ucode,
                        "longitude": feat[i].coordinate.longitude,
                        "latitude": feat[i].coordinate.latitude,
                    });
                }
                table.appendRows(tableData);
                doneCallback();
            }
        );
    };
```

JSONPを使って回避する方法
思った以上にコチラ簡単だった・・・

- urlに `&callback=?` をつける
- $.getJSON(url).done(function(resp) を使う　※ここはよくわかってない

```javascript
myConnector.getData = function (table, doneCallback) {

        tableau.log("getData JSONP" );
        var url = 'http://ucopendb.gsi.go.jp/ucode/api/search.json?pref_code=12&callback=?'
        $.getJSON(url).done(function(resp) {
                var feat = resp.items, tableData = [];

                // Iterate over the JSON object
                for (var i = 0, len = feat.length; i < len; i++) {
                            tableData.push({
                        "status_code": feat[i].status_code,
                        "ucode_url": feat[i].ucode_url,
                        "name": feat[i].name,
                        "feature": feat[i].feature,
                        "city_code": feat[i].city_code,
                        "ucode": feat[i].ucode,
                        "longitude": feat[i].coordinate.longitude,
                        "latitude": feat[i].coordinate.latitude,
                    });
                }
                table.appendRows(tableData);
                doneCallback();
            }
        );
    };
```

参考：　[「JSONとJSONP」
～マンガでプログラミング用語解説](https://codezine.jp/article/detail/10712?p=5　)
openFrameworksでdylib使おうとしてはまったら取り敢えずやってみると幸せになれるかもしれないこと

## 注意

これで100%解決できるとは言い切れませんが過去何度かこれでうまくいったので情報共有まで

## 手順

* "Build Phases" で "Copy Files" の "Destination" を "Executables" にする
* "+" をクリックして使いたいdylibファイルを選択する
* "Build Settings" で "Linking" の下にある "Runpath Search Paths" の値を `@executable_path` に設定する

以上です.
プログラム初心者のWebページ作り

#自己紹介的な
初めてQiitaに投稿させていただきます。今年で20歳で学生をしています。
ここいらでプログラムの勉強をしてみようと思い勉強をはじめました。勉強したことをコツコツQiitaに投稿していこうと思います。よろしくお願いします。
#はじめに
twitterでプログラムを勉強している方々を見るとどうやらProgateという学習サイトが流行りらしく自分もやってみようと思った次第であります。      
[Progate様](https://prog-8.com//)

2日前にProgate様のHTML & CSS 初級編をやり始めて昨日修了したので何か成果物をと思いWebページを作ったので備忘録的なことを書いていきます。

#手順
Webページを公開する方法を調べたところ大まかに分けてこんな感じでした
1.サーバをレンタルする。
2.HTMLファイルとCSSファイル
3.FTPソフトを使ってHTMLファイルとCSSファイルをアップロードする。

#できたもの
[ベー太の備忘録](http://beeta.ikidane.com/)
#感想
少し感動を覚えました。インプットだけしてても気が滅入りますがこうやって勉強の成果が目に見えるとモチベーションがあがりますね。
サーバ1つとってもわからないor聞いたこともない言葉がたくさんあったので、これからもコツコツ頑張っていこうと思います。
jr: jq-like JSON processor for Rubyists @ Meguro.rb#16

## Hello

* Twitter: [@yuya_takeyama](https://twitter.com/yuya_takeyama) / GitHub: [@yuya-takeyama](https://github.com/yuya-takeyama)
* SRE at Quipper
  * Previously a Web Engineer (Rails, React, React Native)
  * StudySapuri for Japan
  * Quipper for Global
* We're hiring!
  * [SRE](https://www.careertrek.com/jobs/view/635675/com_detail)
  * [Web Engineer](https://www.careertrek.com/jobs/view/614827/com_detail)

---

## 世界は JSON でいっぱい

---

## JSON と仲良くなる必要がある

---

## まずは jq の紹介

---

## jq

* JSON を pretty print したり
* map/filter 的な操作をコマンドラインで行う
* 便利

---

## jq で不便なところ

---

## ちょっと複雑なことをやろうとすると途端に面倒になる

---

## ちょっと複雑なこと

* reduce 的な集約処理
  * 一応できるけど専用の記法とか関数とかいちいち覚えてられない
* モジュールシステム
  * 1.5 ぐらいで実装された
  * 個人的には document 一見して面倒になったので実は使ったことがない (すいません)

---

## Ruby でできたくない?

---

## できるようにしてみた

---

## jr

---

## Basic mechanism of jr

```rb
json_enumerator.instance_eval do
  # Your jr filter runs here
end
```

* JSON を yield する `Enumerator`
* メソッドチェインでなんでも繋げられる
* 結果は勝手に出力される

---

## jr の便利なところ

* Ruby で書ける
  * 独特の記法を覚える必要がほぼない
* RubyGems が使える
  * `--require` オプションを使う
* jq のオプションもいろいろ移植している
  * `--raw-output`: JSON でなく生の文字列として出力 (sed/awk/grep とかに渡すのに便利)
  * `--unbuffered`: tail とかからパイプして JSON のログを眺めるのに便利
  * `--raw-input`, `--monochrome-output` などなど

---

## jr の不便なところ

* 単純な map なら jq の方が簡単
  * jq: `jq '.foo'`
  * jr: `jr 'map(&:foo)'`
* シングルバイナリではない
  * mruby とかにするとどうだろう? RubyGems は使えなくなる?

---

## gem i jr-cli

---

## その他使い方: http://qiita.com/tags/jr

---

## Fork me https://github.com/yuya-takeyama/jr

---

![image.png](https://qiita-image-store.s3.amazonaws.com/0/208/fa80c5d4-b0d6-fadc-a5d4-ba87bcca05a1.png)

https://www.quipper.com/career/Japan/

---

![image.png](https://qiita-image-store.s3.amazonaws.com/0/208/c0c7134e-3ead-1f88-fe80-359043dff249.png)

https://techplay.jp/event/680406

---

![image.png](https://qiita-image-store.s3.amazonaws.com/0/208/33544dcf-12d7-826e-1c4e-c73eeff37e25.png)

https://techplay.jp/event/680407