OmniAICreator/Qiita-1.07M huggingface dataset:
Dartのbuild_runnerエラー「pub finished with exit code 1」でハマった件

# 経緯

FlutterでJSONいじるのに[json_serializable](https://pub.dev/packages/json_serializable)というパッケージを試す際、Dartの`build_runner`のエラーにハマったのでメモ。

# Dartのbuild_runnerでエラー 

`json_serializable`を使うためのパッケージを追加し、モデルクラスを作成。`build_runner`コマンドで自動生成を走らせようとすると、エラーになってしまいました。

```
wiz:json_serializable_sample unsoluble_sugar$ flutter packages pub run build_runner build
[INFO] Generating build script...
[INFO] Generating build script completed, took 368ms

[INFO] Initializing inputs
[INFO] Reading cached asset graph...
[INFO] Reading cached asset graph completed, took 75ms

[INFO] Checking for updates since last build...
[INFO] Checking for updates since last build completed, took 781ms

[INFO] Running build...
[SEVERE] json_serializable:json_serializable on lib/ user.dart:

NoSuchMethodError: The getter 'element' was called on null.
Receiver: null
Tried calling: element
[INFO] 6.8s elapsed, 2/3 actions completed.
[INFO] Running build completed, took 7.4s

[INFO] Caching finalized dependency graph...
[INFO] Caching finalized dependency graph completed, took 35ms

[SEVERE] Failed after 7.5s
pub finished with exit code 1
```

> NoSuchMethodError: The getter 'element' was called on null.

で「pub finished with exit code 1」となり、無事詰む／(^o^)＼

# 原因
ググっていろいろ調べてみるも、全然わからん。
クラス名とファイル名が一致してなかったりするのかなぁ…
![スクリーンショット 2019-11-07 16.18.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6380/e0ceaebc-b763-8cf4-b6ac-9190953bcfd3.png)

んあああああああああああああああああああ！！！！
![スクリーンショット 2019-11-07 16.18.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6380/de447af2-f44f-6de6-01e7-f9065924a07b.png)
ファイル名の先頭にスペースが混入していたという凡ミス＼(^o^)／

# 解決

ファイル名を修正して再度`build_runner`を走らせます。
`$ flutter packages pub run build_runner build`

```
wiz:json_serializable_sample unsoluble_sugar$ flutter packages pub run build_runner build
[INFO] Generating build script...
[INFO] Generating build script completed, took 384ms

[INFO] Initializing inputs
[INFO] Reading cached asset graph...
[INFO] Reading cached asset graph completed, took 74ms

[INFO] Checking for updates since last build...
[INFO] Checking for updates since last build completed, took 810ms

[INFO] Running build...
[INFO] Running build completed, took 856ms

[INFO] Caching finalized dependency graph...
[SEVERE] The outputs field in json_serializable_sample|lib/user.g.dart references a non-existent asset json_serializable_sample|lib/ user.json_serializable.g.part and will corrupt the asset graph. If you encounter this error please copy the details from this message and add them to https://github.com/dart-lang/build/issues/1804.
[INFO] Caching finalized dependency graph completed, took 32ms

[INFO] Succeeded after 897ms with 2 outputs (3 actions)
```
今度は成功。
無事にモデルクラスに対応したファイルが自動生成されました。
![スクリーンショット 2019-11-07 16.18.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6380/a7672232-a6a1-037b-48a0-8fc7b752896f.png)

NoSuchMethodErrorというメッセージから、ファイル名に問題があるという原因にたどり着くのはなかなか難しいですね…

コマンドの実行ログでファイルパスが出てるので、よく見れば気付くミスでした。

```
[INFO] Running build...
[SEVERE] json_serializable:json_serializable on lib/ user.dart:
```

凡ミスへの反省の念も込めて書き残しておきます。
さくらのVPSをバックアップする

#準備
以下の記事を参考に環境を確認する。
[さくらのVPSに無料の外部自動バックアップ機能を追加する方法](https://qiita.com/halpas/items/2f51d3b9954367f1587e)

お手軽に（安易に）、
イメージバックアップツールで丸ごとバックアップして、オンラインストレージに保存する環境構築を目指してみました。

#イメージバックアップツールのインストール
私の環境は、
Ubuntu 16.04.5 LTS

以前試したことのある（確か挫折したはず）、[Mondo Rescue](http://www.mondorescue.org/)をインストールする。

[Ubuntu 16.04-17.04世代のMondo Rescueのインストール](https://www.valuestar.work/news/archives/130)が参考になるのだが、apt-getでインストールが失敗してしまうのは、Mondo RescueのFTPサイトからダウンドーロしてインストールした（はず）。
FTPサイトは、
ftp://ftp.mondorescue.org/ubuntu/16.04/
からダウンロードすると失敗するが（インストールに必要な該当バージョンが無かったかも）
ftp://ftp.mondorescue.org/test/ubuntu/16.04/
からダウンロードすると成功する。
確か、mindi-busyboxとかだったと思う。

※インストール後の細かな設定はググって下さい。

#リプレイスの確認
古いMacBook Airにインストールしてある、VirtualBOXでリプレイス可能かの確認を行った。
Mondo Rescueでバックアップしたイメージからリプレイスすると、上手く行った風になるけどOSのBootに失敗してしまいます。

Debianのレスキューディスクを使用してGRUBの再インストールを行うとBoot可能になります。
以下の、12あたりからが参考になります。
https://server-setting.info/debian/mondo-rescue-vm-restore.html

※リプレイスした後にあると便利なネットワーク情報やディスク情報はググって下さい。

#未設定とか
私はBOXをバックアップ先にする予定です。
[rclone](https://rclone.org/)でコピーする設定をしなければならないのですが未設定です。

rcloneはかなり便利です。
GUIでの設定はよくありますが、CUIでも設定可能です。
頑張ってググりましょう。
[HTML][初心者]これだけ覚えれば大丈夫！重要な5つのタグ

#そもそもHTMLってなに？
HTMLは「HyperText Markup Language」の略で、インターネットで公開できるWebページを作成するために作られた言語です。
HTMLにはたくさんのタグが定義されています。そのタグを使って「ここが見出しで」「これは箇条書きで」「ここに画像を載せる」などと、ページの中身をコンピュータに指示するのがHTMLの役割です。
HTMLによって書かれたファイルのことをHTMLファイルと呼びます。**HTMLファイルの拡張子は、「.html」「.htm」です。**

#コピペでOK！始めるうえで必要なテンプレート
```template.html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>タイトル</title>/*webページのタイトル記述*/
</head>
<body><!-- ここにhtmlを記述 -->

　<!-- 例 -->
　<h1>青空カフェ</h1>
　<p>本日のおすすめ</P>

</body>
</html>
```

#これだけで大丈夫！最重要タグ
###１．見出しを意味する＜h1＞＜h2＞タグ
＜h1＞＜h2＞は見出しを意味するタグです。見出しは６レベルあり、＜h1＞、＜h2＞、＜h3＞＜h4＞、＜h5＞、＜h6＞があります。＜h1＞タグが最も重要な見出しで、**「h」に続く数字が大きくなるにつれて重要度が下がります。またそれに伴って文字の大きさも小さくなっていきます。**

```
<h1>青空カフェ</h1>
<h2>本日のおすすめ</h2>
```

###２．テキストの段落を意味する＜ｐ＞タグ
＜ｐ＞タグはHTMLで最もよく使われるタグのひとつで、＜ｐ＞～＜/ｐ＞に囲まれたテキストを**1つの段落**にします。

```
<ｐ>はじめまして</p>
<ｐ>よろしくお願いします</p>
```

###３．サイトのページを行き来できる＜nav＞タグ
よくホームページの上部などに設置されており他ページに行き来するためのものです。
番号なしリスト（箇条書きのこと）である＜ul＞タグ、＜li＞タグと一緒に記述するのが一般的です。

```
<nav>
  <ul>
    <li>ホーム</li>
    <li>店舗情報</li>
    <li>アクセス</li>
    <li>メニュー</li>
    <li>お問い合わせ</li>
  </ul>
</nav>
```


###４．サイト内のリンクを設定する＜a＞タグ
＜a＞タグは、＜a＞～＜/a＞で囲まれたテキストなどのコンテンツにリンクを設定します。

```
<a href="パスまたはURL">詳細はこちら</a>
```

３で説明したナビゲーションの項目にリンクを追加することで他のページへ移動できるようになります。

```
<nav>
  <ul>
    <li><a href="ホームまでのパスまたはURL">ホーム</a></li>
    <li><a href="店舗情報までのパスまたはURL">店舗情報</a></li>
    <li><a href="アクセスまでのパスまたはURL">アクセス</a></li>
    <li><a href="メニューまでのパスまたはURL">メニュー</a></li>
    <li><a href="お問い合わせまでのパスまたはURL">お問い合わせ</a></li>
  </ul>
</nav>
```

###５．ページに画像を挿入する＜img＞タグ
ページに＜img＞タグを設定することで画像を挿入することができます。

```
<img src="画像までのパス">
```







#使用した参考書
・スラスラわかるHTML＆CSSのきほん（狩野祐東 著）


#さいごに
どうでしたか？「これだけなら余裕じゃん！」と感じませんでしたか？
しかも、HTMLは、無理に覚える必要はありません。やっていくうちに勝手に覚えていくものです。
**大事なのは、手を動かして動作を実感することです。**
もちろん今回説明したタグの他にもたくさんの種類や組み合わせが存在しますが、それらは徐々に覚えていけばいいと思います。今回説明した5つのタグを用いれば大体のサイトは作成可能です。
社内勉強会「レンダリング合宿１」 ソフトウェアラスタライザー基本実装編 08.バイリニアフィルタリング

#ソフトウェアラスタライザー基本実装編 08.バイリニアフィルタリング
前回はパースペクティブコレクトによりパースの補正処理を入れました。
テクスチャマッピングの最低限の要件は満たせたかと思いますので、今回はバイリニアフィルタリングを実装していきたいと思います。

##リポジトリ
https://github.com/NoriyukiHiromoto/Rendering01_SoftwareRasterizer/tree/01_08_bilinear_filtering

今回の実行結果になります。
前回までのざらざらした感じがなくなって滑らかな見た目になったかと思います。
![top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358928/9a9dba1a-10d4-c43f-9a23-64824134094c.png)

##やりかた
前回は (u, v) 値からテクスチャのピクセル座標を求めてその色を使っていました。
しかし実際にUV値は整数ではなく浮動小数点ですのでその部分を考慮して隣接テクスチャから補間をしてUVに対して正確なテクセルを取得します。

##実装
テクスチャのサンプル処理を見てみます。
前回と同じように与えられたUV値からテクセル座標を求めていますが、さらにX+1,Y+1のテクセル座標も取得しています。
この4つのテクセルからUVの余剰部分の小数点を使ってブレンドしていきます。

```cpp:Texture.cpp
Color Texture::Sample(fp32 u, fp32 v) const
{
	u += 256.0f;
	v += 256.0f;

	const auto& Src = _Surface[0];

	const auto uf = u * fp32(Src.Width);
	const auto vf = v * fp32(Src.Height);
	const auto ui0 = int32(uf);
	const auto vi0 = int32(vf);

	const auto mui0 = ui0 % Src.Width;
	const auto mui1 = (ui0 + 1) % Src.Width;
	const auto mvi0 = vi0 % Src.Height;
	const auto mvi1 = (vi0 + 1) % Src.Height;

	const auto x0y0 = Src.Color[mui0 + (mvi0 * Src.Width)];
	const auto x1y0 = Src.Color[mui1 + (mvi0 * Src.Width)];
	const auto x0y1 = Src.Color[mui0 + (mvi1 * Src.Width)];
	const auto x1y1 = Src.Color[mui1 + (mvi1 * Src.Width)];

	return Color::Lerp(x0y0, x1y0, x0y1, x1y1, uf - fp32(ui0), vf - fp32(vi0));
}
```

以下のメソッドで４つの色をそれぞれX方向とY方向のブレンド率を使ってブレンドしています。

```cpp:pch.cpp
static Color Lerp(Color x0y0, Color x1y0, Color x0y1, Color x1y1, fp32 rateX, fp32 rateY)
{
	// y0
	Color y0;
	y0.r = uint8(x0y0.r + fp32(x1y0.r - x0y0.r) * rateX);
	y0.g = uint8(x0y0.g + fp32(x1y0.g - x0y0.g) * rateX);
	y0.b = uint8(x0y0.b + fp32(x1y0.b - x0y0.b) * rateX);
	y0.a = uint8(x0y0.a + fp32(x1y0.a - x0y0.a) * rateX);
	// y1
	Color y1;
	y1.r = uint8(x0y1.r + fp32(x1y1.r - x0y1.r) * rateX);
	y1.g = uint8(x0y1.g + fp32(x1y1.g - x0y1.g) * rateX);
	y1.b = uint8(x0y1.b + fp32(x1y1.b - x0y1.b) * rateX);
	y1.a = uint8(x0y1.a + fp32(x1y1.a - x0y1.a) * rateX);
	// result
	Color result;
	result.r = uint8(y0.r + fp32(y1.r - y0.r) * rateY);
	result.g = uint8(y0.g + fp32(y1.g - y0.g) * rateY);
	result.b = uint8(y0.b + fp32(y1.b - y0.b) * rateY);
	result.a = uint8(y0.a + fp32(y1.a - y0.a) * rateY);
	return result;
}
```

#最後に
今回はバイリニアフィルタリングを行いました。
バイリニアフィルタリング自体はただのブレンド処理なので安価に見た目を改善できますので是非とも入れておきたい機能になります。
[WordPress] GitHub API v4を WordPress から呼んでみる

GitHub API v4 を使って、WordPress で GitHub のデータを取得する方法です。
参考: [GitHub API v4をPHPから呼んでみる](https://qiita.com/mifumi323/items/aabab173df983960e83a)

v4 では GraphQL のクエリを含んだ JSON を POST する形になります。
https://developer.github.com/v4/

# GraphQL のクエリ

取得したいデータに合わせて [GraphQL](https://graphql.github.io/) のクエリを作成しましょう。
[GitHub GraphQL API](https://developer.github.com/v4/explorer/) で、実際にクエリ作って確認することができます。

僕は、release データからパッケージのダウンロード URL を取得したかったので、こんな感じで作りました。

```
{
  repository(owner: "getshifter", name: "shifter-github-hosting-plugin-sample") {
    releases(last: 1){
      edges {
        node {
          releaseAssets(last: 1) {
            nodes {
              downloadUrl
              url
            }
          }
          url
          tagName
          isPrerelease
          publishedAt
          updatedAt
        }
      }
    }
  }
}
```

結果

```
{
  "data": {
    "repository": {
      "releases": {
        "edges": [
          {
            "node": {
              "releaseAssets": {
                "nodes": [
                  {
                    "downloadUrl": "https://github.com/getshifter/shifter-github-hosting-plugin-sample/releases/download/1.0.1/shifter-github-hosting-plugin-sample.zip",
                    "url": "https://github-production-release-asset-2e65be.s3.amazonaws.com/205090003/f64b1a80-cd47-11e9-81c2-8e04f2876f81?....."
                  }
                ]
              },
              "url": "https://github.com/getshifter/shifter-github-hosting-plugin-sample/releases/tag/1.0.1",
              "tagName": "1.0.1",
              "isPrerelease": false,
              "publishedAt": "2019-09-02T06:07:38Z",
              "updatedAt": "2019-09-02T06:07:38Z"
            }
          }
        ]
      }
    }
  }
}
```

最終リリースパッケージをダウンロードするための URL が取得できたよー

# トークンを取得する

API v4 を叩くには、個人アクセストークンを取得する必要があります。
アクセストークンの取得方法は、公式ドキュメントを参考に
[コマンドライン用の個人アクセストークンを作成する](https://help.github.com/ja/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line)

# POST する

WordPress には [wp_remote_post()](https://developer.wordpress.org/reference/functions/wp_remote_post/) という関数があるので、それを使いましょう。

```
$query = '__GRAPHQL_QUERY_HERE__';
$token = '__GITHUB_ACCESS_TOKEN_HERE__';

$options = [
    'method'  => 'POST',
    'headers' => [
        'Authorization' => 'bearer ' . $token,
        'Content-type'  => 'application/json; charset=UTF-8',
    ],
    'body'    => json_encode(['query' => $query]),
];
$res = wp_remote_post( 'https://api.github.com/graphql', $options);

if (200 !== wp_remote_retrieve_response_code( $res )) {
    return new \WP_Error(
        wp_remote_retrieve_response_code( $res ),
        wp_remote_retrieve_body( $res )
    );
}
$body = json_decode( wp_remote_retrieve_body( $res ) );

return $body;
```

簡単ですね。

実際にこのコードを使って作った WordPress プラグインが以下になります。
[shifter-github](https://github.com/getshifter/shifter-github/)
PythonでYahoo!ニュースのタイトルと配信日時を取得する

###こんにちは

ふと
```cd desktop/python
```をして
```ls
```したところ、3分クッキング的にできるスクレイピングがあったので記事にしようと思います。

###最初に

「ではこちらが環境設定のできているPCになります〜〜」なんてアシスタントの人が持ってきてくれるわけでもないので環境設定からやりましょう。

ちなみに僕の環境はmacOS Catalina10.15です、不具合だらけで最近よくいろんなアプリが落ちます。

あ、Python3は入ってる前提でお願いします。

今回用意するモジュールは
```BeautifulSoup```と```requests```です
どちらも入っていない人は```pip3 install 〇〇```でインストールしてください。
これでとりあえず材料が揃った感じです。
ここまでで3分経ってそうですね、頑張っていきましょう。

###次に
ターミナルを開いて```cd destkop```(ここは自分が保存したい場所でいいです)をして保存先を決めましょう。オススメはデスクトップに```Python```というファイルを作ることです。

そうしたら```vim news.py```としてPythonファイルを作ります。ここは趣味でvimを使っているだけなのでAtomとかVSCodeでOKです。 
#####vimはいいぞ。

今回はYahoo newsからスクレイピングしてくるので
```https://news.yahoo.co.jp/```をurlとして使います。


<img width="332" alt="スクリーンショット 2019-11-07 15.29.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526861/901e54f8-7f66-0446-03a0-4eb0590d0774.png">
このアクセスランキングの場所を表示します、楽しくなってきましたね。

<img width="1440" alt="スクリーンショット 2019-11-07 15.39.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526861/490b6caa-f0fc-b006-b4b9-5d4cec594876.png">
この写真で選択されている```yjnSub_list```をスクレイピングします。
Chromeでデベロッパーツールを開いてのぞいてみて下さい。

###コード
まずはモジュールをimportしないと話にならないのでチャチャッと入れます

```news.py
import requests
import bs4
```
そしたらurlとかsoupとかにいい感じに代入してあげて関数作ってprintすれば完成です。
簡単ですね。

```news.py
url = 'https://news.yahoo.co.jp'
html = requests.get(url)
soup = bs4.BeautifulSoup(html.text, 'html.parser')
lank = soup.find('ol',class_='yjnSub_list')
urls = list(map(lambda l:l.find('a').get('href'), lank))

def get_title(url):
    html = requests.get(url)
    soup = bs4.BeautifulSoup(html.text, 'html.parser')
    return soup.find('div',class_='hd').text

titles = list(map(get_title, urls))
print('title'.join(titles))
```
最後の```print('title')```のtitleは適当に書き換えても大丈夫です。

コードがかけたらターミナルで
```python3 news.py```と入力しましょう。
エラーもなくニュースと配信日時が取得できるはずです。

moduleエラーを吐かれてしまったら最初の環境設定に戻って```pip3 uninistall 〇〇```とかして再度インストールしてみてください。

お疲れ様でした。
Rails groupでカラム別にcountする

countする時groupでカラム別にcountする

```ruby
#Userモデル
User(id: integer, email: string, status: integer)

# User.statuses
{"init"=>0, "using"=>1}

User.all.count
   (233.9ms)  SELECT COUNT(*) FROM `users`
 => 10 

User.all.group(:status).count
   (135.6ms)  SELECT COUNT(*) AS count_all, `users`.`status` AS users_status FROM `users` GROUP BY `users`.`status`
 => {"init"=>4 "using"=>6} 

```
Swift いろいろ <ラベル>

#Label

###ラベル
break文やcontinue文の制御の移動先の指定ができる機能

##labelなし

```swift
for element in [1,2,3] {
    print("element: \(element)")

    for nestedElement in [1,2,3] {
        print("nestedElement: \(nestedElement)")
        break
    }
}
```
####出力結果
```
element: 1
nestedElement: 1
element: 2
nestedElement: 1
element: 3
nestedElement: 1
```
こちらはbreakの制御範囲がnestedElementに限られているので、3回実行されました。

##labelあり

```swift
label: for element in [1,2,3] {
    for nestedElement in [1,2,3] {
        print("for文")
        break label
    }
}
```
これだとwarningが出るかもしれないので
```element →　_
nestedElement → _
```にするとでなくなりました。

####出力結果
```
for文
```
####なぜこのような挙動をするのか？？
```break ラベル名```とすることにより、labelに指定した場所によって変化するので、
今回はlabelが1回目のループの外にあったので一気に２つのループを抜けたということになります。

####補足
```swift
for element in [1,2,3] {
    label: for nestedElement in [1,2,3] {
        print("for文")
        break label
    }
}
```
####出力結果
```
for文
for文
for文
```
こんなことも実装できます。

c言語のgoto文と同じように書けます。
macOS でZIP 圧縮した、複数のZIPファイルから __MACOSX と .DS_Store を一括して取り除く


macOS で Finder を使うと `__MACOSX` や `.DS_Store` などのドットファイルが作成される。そのため macOS で ZIP 圧縮するとドットファイルが含まれる。
この ZIP ファイル を UNIX 環境や Window 環境で伸張すると不要なドットファイルのゴミファイルが発生する。
その防止策として、複数の ZIP ファイルから __MACOSX と .DS_Store を一括して取り除く shell のワンライナー。

```bash:ubuntu
$ cd ~/temp/zip
$ find . -type f -iregex ".*\.zip$" -print0 | xargs -0 -I{} zip --delete {} "*__MACOSX*" "*.DS_Store"
```

```bash:macOS
$ cd ~/temp/zip
$ find -E . -type f -iregex ".*\.zip$" -print0 | xargs -0 -I{} zip --delete {} "*__MACOSX*" "*.DS_Store"
```

参考資料
[ZIPファイルから.DS_Store,.__MACOSXを取り除く](https://www.okamoto-net.com/a10013/)
[MacでZIPファイル圧縮したとき.DS_Storeを含めないようにする](https://qiita.com/ywindish/items/ad86013620d61050fc39)
Maya python で画像テクスチャをマテリアルに割り当てるメモ

## 背景

Maya でマテリアル設定をスクリプトで処理したい.


## 手順

Applying a Texture in Python
https://forums.cgsociety.org/t/applying-a-texture-in-python/1573565/7

Assigning a Material using Pymel
https://discourse.techart.online/t/assigning-a-material-using-pymel/1240

maya.cmds を使うと想定

```
import maya.cmds as mc
```

File シェーダを作り, テクスチャファイルパスを設定.

shader ノードを作り, テクスチャを割り当てたい shader の attribute(e.g. `color`) と, `file.outColor` をつなぐ

シェーダは直接オブジェクト(メッシュ)に割り当てできないようなので, shadingGroup ノード(surface shader や, volume shader などをまとめるノード)を介する.

shadingGroup ノードの `.surfaceShader` を, file shader の `.outColor` とつなぐ.

shadingGroup を, オブジェクトに割り当てる. いろいろ方法があるようだが, maya.cmds だと sets が楽か?

```
mc.sets("geo", edit=True, forceElement="sg1")
```


構造としては以下のようになる(Maya Node editor で確認したほうがわかりやすいかしらん)
 
```
object(mesh) <- shadingGroup node (.surfaceShader) <- (.outColor) File shader (.fileTextureName) <- Texture filename
```


## 発展

volume shader や displacement shader として割り当てたい場合は shadingGroup のつなぐ attribute を変えればよい.
日々のプログラミング学習の記録

##JavaScript
**コメントアウト**
文頭に「//」
**文字列と数値**
文字列は""で囲む、数値は囲まない
**変数を使うメリット**
1同じ値を何度も使える
2変更に対応しやすい
3値の意味がわかりやすい
**テンプレートリテラル**
文字列の中に定数（変数）を埋め込むことがでる
書き方　(`~~~${###}~~~`)
バッククォーテーションで囲む
**かつ、または**
&&,||
**switch文**
ある値によって処理を分岐する場合にswitch文を用いる
書き方 「switch(条件の値){ 処理 }」
switch文の中にcaseを追加することで処理を分けることができる
breakとはswitch文を終了する命令
caseのどれにも一致しなかった時、defaultのブロックが実行される。defaultはif文のelseに似たようなもの
 **if文**
while文以外にもfor文というものがある。できることはwhile文と同じだが、while文に比べてシンプルに書くことができるのが特徴
書き方　「変数の定義」「条件式」「変数の更新」の3つを括弧の中に書きます。括弧の中ではそれぞれをセミコロン（;）で区切る
**計算式の省略化**
「number += 1」は「number ++」のように省略して書くことができる
**配列**
複数の値をまとめて管理するには、配列というものを用います。
配列は、[値1, 値2, 値3] のように作る。配列に入っているそれぞれの値のことを要素と呼ぶ
複数の文字や数値をまとめて書くことができる
配列の要素にはそれぞれインデックス番号という番号がついている
.lengthで配列の要素数を取得
**オブジェクト**
オブジェクトは配列と同じく複数のデータをまとめて管理するのに用いられる
配列は複数の値を並べて管理するのに対して、オブジェクトはそれぞれの値にプロパティと呼ばれる名前をつけて管理
オブジェクトは、{プロパティ1: 値1, プロパティ2: 値2}のようにつくる
{},:を使う 
プロパティを取り出すには「オブジェクト.プロパティ名」
**オブジェクトを要素に持つ配列**
要素ごとに改行、インデックス番号が割り振られている
#html＆css
レスポンシブデザイン
**メディアクエリ**
ブラウザの画面サイズに応じてCSSのスタイルを設定できる手法
書き方　@media (条件) { .... }
**ブレイクポイント**
max-width: ◯◯px（またはmin-width: ◯◯px）のようにメディアクエリの条件を指定するとき、「◯◯px」の部分をブレイクポイントと呼ぶ
**レイアウトの崩れ**
box-sizing: border-box;を使う
要素の幅(width)の合計にpaddingとborderが含まれる
＊(アスタリスク)に対して指定する、これはCSSを全要素に指定する

通常、親要素の高さは子要素を包む高さとなる。しかし、子要素が全てfloatの時、親要素の高さは0となってしまうという性質がある。これは、floatは「浮いている」という意味で、親要素から見るとfloatの子要素は存在しないように見えるからである。
floatはclear: left;で「浮いている」状態を解除できる
**viewportの設定**
headタグ内にviewportを設定
viewportを設定しないと、スマートフォンやタブレットでの閲覧時にメディアクエリが正しく機能しない
**要素の表示/非表示**
要素を非表示にするにはdisplay: none;を用います。
非表示にした要素を表示させる時は、display: block;を用いて表示します。
プログラミングできない生徒が地域の商店街のLINE＠を授業で作ってみる。

#目次
[１．この授業について](#１この授業について)
[２．商店名](#２商店名)
[３．ペルソナ](#３ペルソナ)
[４．LINE＠に何を入れるのか](#４LINE＠に何を入れるのか)
[５．感想](#５感想)



#１．この授業について
近年LINEは誰もがインストールしているアプリであり、高校生も身近なアプリである。
今回LINE＠を活用した授業にしたのは広告という観点で授業に入れようと思ったからである。
そして何よりもこの授業を選択している生徒はプログラミングが出来ない。
しかし、プログラミングが出来なくても、できないことでできる人とは違う発想が出てくるのであと思ったからである。
授業時間数は全部で８時間で実施をしてる。

#２．商店名
静岡県島田市付近の商店で２人で作成をする。制作は１人１つで作成する。

#３．ペルソナ
ペルソナマーケティングとしては
年齢（年代）
性別
職業
勤務先（役職や仕事の概要）
年収（年収）
家族構成
結婚（婚姻歴などパートナーの有無）
居住地
性格
教育（最終学歴）
趣味
1日の過ごし方（行動パターンをもとに行動シナリオ作成）
消費行動
価値観
口癖
悩み
愛読書（雑誌）
よく見るWebサイト
情報の入手先（情報収集行動）
デバイス
いつ見るのか
どこで見るのか

様々な要素を組み込み実際の人物像の設定を実施している。
[(terr 良質なペルソナ分析と作り方と手法を公開を引用)][link-1]

[link-1]:https://tree-file.com/marketing/analysis-and-how-to-make-high-quality-persona-technique/
#４．LINE＠に何を入れるのか


|グループ|テーマ|作成者|作成者|
|---|---|---|---|
|１|チャールストン|[そごー][link-3]|[ありんこ][link-4]|
|２|たこまん|[ほーりー][link-5]|[おゆや][link-6]|
|３|ポプリ|[あいこっこ][link-7]|[マキシマム][link-8]|
|４|ふじのくに 茶の都 ミュージアム|[すーこ][link-9]|[きのみん][link-10]|
|５|TRENTE-TROIS CAFE|[なご][link-11]|[もえひさ][link-12]|
|６|meguri 石畳茶屋|[シナモン][link-13]|[マイメロ][link-14]|
|７||[ポムポムプリン][link-15]||


[link-3]:https://qiita.com/sogousaku0102/private/69c9a298fa4a01b12378
[link-4]:https://qiita.com/arinkosenei0126/private/2ca33560f60c51726a3a
[link-5]:https://qiita.com/hooree/private/2dd5f8cb4ac8f463e6f5
[link-6]:https://qiita.com/yuyanayuanteng/private/fd51be2b9f0a9ad91f5f
[link-7]:https://qiita.com/aaaiko/private/00fb94aeb435aa529e00
[link-8]:https://qiita.com/6117maiaka/private/42ed23e1b39db5e0cf8f
[link-9]:https://qiita.com/pineapple124fuko/private/9d1ca438936c63f06253
[link-10]:https://qiita.com/y_m_uoxou_ka07/private/6726a5e05e3a9daaebf5
[link-11]:https://qiita.com/makinoharanonago/private/172b7bbab64600768ff5
[link-12]:https://qiita.com/meghanmmmmmmm/private/9cd8e628189e4447e3af
[link-13]:https://qiita.com/kokorozengtian/private/34df5699705246b41dfd
[link-14]:https://qiita.com/miri1112happy/private/e7a38c4b56c3079b91d7
[link-15]:https://qiita.com/harukanakao4/private/763be51ab1a95c24adc8

#５．感　想

静岡県立島田商業高校　こちらを[クリック][link-16]
[link-16]:http://www.edu.pref.shizuoka.jp/shimada-ch/home.nsf/IndexFormView?OpenView

LINE Developers　こちらを[クリック][link-17]
[link-17]:https://developers.line.biz/ja/
Javaのstaticメソッドを学ぶ

Java初心者の忘備録。

練習問題でmainとは別にメソッドを作った時。

```main.java
class Main {
  public static void main(String[] args) {
    Person person = new Person;
    ｛中略｝
    printData(person);
  }
  public static void printData(Person person) {
    System.out.println(person.firstName + person.lastName);
  }
}
```

あれ、このprintDataメソッドに付くstatic修飾子はどんな意味を持つんだったろうか？と思い調べた。

####staticメソッドはクラスメソッド
Javaのメソッドは必ずクラスかインスタンスに属する。
staticメソッド(クラスメソッドとも呼ぶ)はクラスが持ち、クラスが実行するメソッドのこと。
インスタンスメソッドは、インスタンスが持ち、インスタンスが実行するメソッドのこと。

練習問題のprintDataメソッドの場合、Mainクラスに属するstaticメソッドとなる。

####staticメソッドのアクセス範囲
staticメソッドを実行するクラス自体はインスタンスではないため、staticメソッドからインスタンスに属するフィールドやメソッド、staticではない内部クラスを使うことはできない。
staticメソッドで扱えるのはstaticフィールドや他のstaticメソッド、引数を使ったプログラムとなる。

※インスタンスが持つフィールド・メソッドにアクセスしたい場合
インスタンスに属するものは直接参照できないが、staticメソッド内で自クラスのインスタンスを生成する、または引数として受取るのであれば使用可能。
grpcをさくらのレンタルサーバにインストールする(さくらインターネットのPHPサーバ)

# grpcをさくらのレンタルサーバにインストールする(さくらインターネットのPHPサーバ)
1. pearをインストール
2. composerのインストール
3. grpcをインストール
4. php.iniに記述
5. php バインドする

## pear

```bash:bash
mkdir -p ~/workspace
mkdir -p ~/tmp
cd ~/workspace
wget http://pear.php.net/go-pear.phar
php go-pear.phar
```

以下になるように設定

```bash:
 1. Installation base ($prefix)                   : /home/{username}/pear
 2. Temporary directory for processing            : /home/{username}/tmp/pear/install
 3. Temporary directory for downloads             : /home/{username}/tmp/pear/install
 4. Binaries directory                            : /home/{username}/pear/bin
 5. PHP code directory ($php_dir)                 : /home/{username}/pear/share/pear
 6. Documentation directory                       : /home/{username}/pear/docs
 7. Data directory                                : /home/{username}/pear/data
 8. User-modifiable configuration files directory : /home/{username}/pear/cfg
 9. Public Web Files directory                    : /home/{username}/pear/www
10. System manual pages directory                 : /home/{username}/pear/man
11. Tests directory                               : /home/{username}/pear/tests
12. Name of configuration file                    : /home/{username}/.pearrc
```

## composerのインストール
```
cd ~/workspace
curl -sS https://getcomposer.org/installer | php
cp composer.phar ~/bin/composer
```

## grpcのインストール
```
git clone -b v1.20.x https://github.com/grpc/grpc
git pull --recurse-submodules && git submodule update --init --recursive
phpize 
./configure
make
mkdir -p ~/php_modules
cp modules/grpc.so ~/php_modules
```

## php.iniへ記述
`~/www/php.ini` に追記します

```
extension_dir=/home/{username}/php_modules/
extension=grpc.so
```

## php と composer をphp.iniを参照するようにする
bashの場合、以下で.bash_profileを書き換えてください。

```
alias php='php -c /home/{username}/www/php.ini'
alias composer='php -c /home/{username}/www/php.ini $HOME/bin/composer'
```

## 終わり。
ミスってたら、連絡くれれば直します
Rails controllerで早期returnするTips

# TL;DR

```users_controller.rb
def show
  @user.do_something(params[:foo])

  my_redirect && return # 注目

  @user.do_something_other
end

private

def my_redirect
  if @user.some_flag?
    redirect_to some_path(@user.some_attr)
  end
end
```

# 解説
以下の要望があると考えましょう、`@user.do_something(params[:foo])`で、paramの一部を処理してから、`@user.some_flag?`を判断して、`some_path(@user.some_attr)`に動的リダイレクトしたいです。
また、リダイレクトが実行された場合、`@user.do_something_other`を実行しないことです。
特にSEO系の要件でそういうリダイレクト処理が多いと思いますね。


## Guard Clauseとは
条件分岐や関数の途中、早期に脱出する手段の一つです。積極的に使うと、ソースコードの可読性が向上し、性能もアップすることが期待されています。「ガード節」、「早期復帰」など和訳があります。
Rubyの場合、Guard Clauseはループ途中の`next`や`break`、あるいはメソッド途中明記的な`return`などがあります。


## まずは正攻法

```users_controller.rb
def show
  @user.do_something(params[:foo])
  redirect_to some_path(@user.some_attr) && return if @user.some_flag?

  @user.do_something_other
end
```

リダイレクトの判断ロジックがシンプルで再利用する予定がない場合、正攻法は大体対応できます。
しかし複雑なロジックでリダイレクトを組む場合、コントローラーが肥大化になりがちです。

## 今までの王道

`before_action` に該当ロジックをHookさせると、Actionが実行する前の段階でリダイレクトが実行され、Actionの実行がSkipされます。
例として、**[devise](https://github.com/plataformatec/devise)**の`before_action :authenticate_user!`が有名です。

```users_controller.rb
before_action :setup_user, only: :show
before_action :my_redirect, only: :show

def show
  @user.do_something_other
end

private

def setup_user
  @user.do_something(params[:foo])
end

def my_redirect
  if @user.some_flag?
    redirect_to some_path(@user.some_attr)
  end
end
```

ご覧のように、`before_action`で対応する場合、リダイレクトがActionが実行する前の段階で実行されるので、`@user.do_something(params[:foo])`も`before_action`に出さなければいけません。
修正範囲が広くなり、ロジックが複雑な場合、返って不便になります。

## 今回紹介したい手法

```users_controller.rb
def show
  @user.do_something(params[:foo])

  my_redirect && return # 注目

  @user.do_something_other
end

private

def my_redirect
  if @user.some_flag?
    redirect_to some_path(@user.some_attr)
  end
end
```

### 原理
まず`my_redirect`は、`@user.do_something(params[:foo])`で実行されます。

次に`@user.some_flag?`が`false`の場合、`nil`が返されて、`my_redirect && return`が[短絡評価](https://ja.wikipedia.org/wiki/%E7%9F%AD%E7%B5%A1%E8%A9%95%E4%BE%A1)の影響で飛ばされ、以降の処理が続かれます。

`@user.some_flag?`が`true`の場合、下記の内容が返されて、`truthy`なので、`&& return`が実行され、メソッドが脱出され、以降のロジックが実行されません。

```ruby
Redirected to http://localhost:3000/some_path?foo=bar
"<html><body>You are being <a href=\"http://localhost:3000/some_path?foo=bar\">redirected</a>.</body></html>"
```

以上でした。

# 参考
- [Rails controller で早期で綺麗にreturnする方法](https://qiita.com/benridane/items/bb90be99b0deb09b2587)
- [例外で深くなったネストをGuard Clauseですっきりさせる](https://techracho.bpsinc.jp/hachi8833/2016_10_11/26950)
- [&&とandの違い](https://qiita.com/fukayatsu/items/920ad8e4d099c3fec890)
中国のQRコード決済関連の嬉しいニュース

2019年11月初旬、中国に行く人には嬉しいニュースが飛び込んできました。
(急いでまとめたので間違ってたらコメントなどで教えてください。)

# 背景

中国では2大決済サービスがある。Tencentの運営しているWechat Pay（微信支付）と、AlibabaグループのAnt Financialが運営しているAlipayです。

それぞれ、外国人が利用するにはかなりハードが高く、抜け道のような物を誰かが探して使っていると、急にふさがれたりと状況が安定しなかった。それも、外国人には正式には利用させるとはなっていなかったからです。

何かをするたびに実名認証をおこないなさいと言われます。実名認証には銀行口座と、中国の身分証明書が必要になります。我々外国人にはこの身分証明書はむずかしいですが、銀行口座はまだ何とかなるものでしたが、正式には就業ビザなどが必要とされていました。

つまり、銀行口座も身分証明書も無い、通常の旅行者は中国の2大決済サービスを使えないのです。もちろん使えなければ現金もあるのですが、最近では決済サービス前提のサービスも出てきたため、悔しい思いをすることもあります。

ところで、なぜ銀行口座が身分証明になるかというと、銀行口座を開くときは身分を証明して口座を開くからです。方や、旅行者に銀行口座を開かせると（できなくは無い）、パスポートとホテルなどの住所、電話番号などで登録しますが、海外の身分証明まではできないので銀行側がリスク（マネーローンダリングや詐欺利用など）を負う可能性があります。

# 嬉しいニュース

- Alipayが国際クレジットカードでチャージが可能なAliapyミニアプリ TourPassを開始。
- WeChat Payに登録できる、旅行者でも作れる銀行口座が開設可能に
- WeChatもサービスを限定して国際クレジットカードが利用可能に

## Alipayが国際クレジットカードでチャージが可能なAliapyミニアプリ TourPassを開始。

クレジットカードからのチャージはクレジットカードの現金化に似ていて難しいだろ言う話でしたが、今回の規制緩和で様々な条件付きで可能になりました。

- 上限は 2000 元まで
- ビザもしくはパスポートの登録が必要
- ウォレットでは無くTourPassというミニアプリという形式。
- 店舗への支払のみ。個人間送金は不可。
- 90日立つと未使用分は払い戻し
- 登録すると上海銀行のバーチャル口座のような物ができます。

残高は通常のウォレットとは別に管理されます。
なお、支払をするときっはわざわざミニアプリを開かなくても、いつも通りの支払方法で、支払元を上海銀行に選択し直すだけで良い。

私も開設からチャージをやってみましたが、とても簡単にチャージ、支払をすることができました。現時点では私はこれをよく使いそうです。

## WeChat Payに登録できる、旅行者でも作れる銀行口座が開設可能に

```
https://twitter.com/kerotto/status/1191773449921761280?s=20
シンガポール系の「大华银行」(ユナイテッド・オーバーシーズ銀行/UOB)が、旅行や出張などの短期滞在でも
口座開設可能、海外電話番号のままWeChatPayを利用できるサービスをはじめたようです。
アリペイTourPassのオフライン版みたいな感じ
https://mp.weixin.qq.com/s/hCvlcVA4396YAhD8GcTJIQ
```

と言う情報を聞きつけたので、丁度深圳にいたので、深圳の支店に行ってきました。

結果は、ダメでした。

- 深圳支店は法人のみ対応
- 個人は、上海と重慶のみ。そこで聞いてくれ。

実際UOBの深圳支店は、KK100という金融ビルに入っていて、超高層ビルです。1階で受付をしてカードを貰い、エレベーターはカードをかざさないと止まりません。40階まで行くと超見晴らしのいいフロアが広がります。そして、60階まで行くとオフィスがありました。当然こんなセキュリティの堅いセキュリティの場所に個人向けの支店があるわけもなく。話を聞いてみましたが断念しました。

ぜひ、上海に行かれる方はチャレンジしてみてください。

## WeChatもサービスを限定して国際クレジットカードが利用可能に

これは、実は昔から国際クレジットカードは登録できました。しかし、私も使ったことが無く実体が良く分かっていませんでした。
対応ブランドはVisa/Mastercard/AMEX/Discover/JCBで、情報によると、DiDiや高速鉄道のチケットが買える12306というサービスなどで利用可能だそうです。

今見てみると、支払ができなかった場合、次のカードが使われますと書かれているので、残高がゼロにならないといけないようです。でも今それはやりたくないのでちょっと挑戦はためらっています。

# こうなった背景

トランプ大統領と習近平氏主席との会談で銀行の規制緩和に関する進展があったそうですが、その影響もあってと考えるとスピードがとても速いですね。

こちらもけろっとさんの情報によると、中国人民銀行上海本部が10月30日に公布した《关于促进金融科技发展 支持上海建设金融科技中心的指导意见》40項目の中に、外国人が支払アプリを利用する際の障壁を取り除くことを模索すべきとあるので、これに応じてアリペイやWeChatPayが対応しはじめたようです。
http://sh.sina.cn/news/2019-10-31/detail-iicezuev6053392.d.html?from=wap
RubyonRails 速習実践ガイド自分まとめ1-1

#RubyonRails 速習実践ガイド　自分まとめ
###chapter1-1

`クラスとインスタンス`
 *例　
　クラス→人間
　インスタンス→吉岡里帆
　　
　クラス→猫
 　インスタンス→タマ*

吉岡里帆のクラスは人間
吉岡里帆は人間のインスタンス
タマは猫のインスタンス

`オブジェクトの機能はクラスで決まる`
"氏名".length 
=> 2

*Stringクラスのオブジェクトだからlengthが使える*

1.length　　　　
=> Nomethod error

*Integerクラスにlengthを使っても答えてくれない*

Rubyでプログラムをつくるには
どのクラスのオブジェクトにどんな機能があるのか、
目的にあったクラスのオブジェクトを使うことが大切

`変数`
"氏名".class
"氏名".object_id →この２つの氏名は違うオブジェクトとして扱っている

label = "氏名"のように、何かのオブジェクトを指し示すために変数が必要
変数に代入することによって何度object_idを使っても同じ値が返ってくる
![無題の図形描画 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483758/c36e7ec7-66e4-d891-83ce-f93f9efcd524.jpeg)

`メソッド`
オブジェクトの振る舞いはメソッドとして記述する

メソッドを定義する場所→クラス
メソッドを呼び出す対象→インスタンス

引数をつけるメソッドは（）の省略が可能
message1.count(message2,message3)
message1.count message2,message3

上記の２つはどちらも同じ内容を示す
PythonistaでiOSの写真に画像を追加する

# Pythonistaで処理した画像をiOSの写真に追加したい

## サンプルコード

``` sample.py
import photos
import os
import tempfile
from PIL import Image

imageName = 'lena.png'
img = Image.open(imageName)
temp_path = os.path.join(tempfile.gettempdir(),imageName)
img.save(temp_path)
photos.create_image_asset(temp_path)

```

## 解説

画像を追加する関数は``photos.create_image_asset() ``なのですが、どこかに画像が保存されていないといけないので、``temp_path ``を取得し、一旦そこに保存しているよって感じです。

スクリプトがあるディレクトリと同じところに一旦保存するよりもなんとなくスマートですね。
Railsのserver.pid.を削除したら出たエラーを対処してみた

## 自己紹介

今月からプログラミングスクールに通ってRuby on Railsを勉強してます！
Qiita初投稿なので初歩的なことかもしれないですが、書いていきます！

## エラーが発生
カリキュラムを進めるために、Railsのサーバーを起動させようとしたところ、エラーとなりました。

```zsh
A server is already running. Check /home/ec2-user/environment/pictgram/tmp/pids/server.pid.
```

サーバーはもう動いているみたい。えっ再起動どうするの。

てことで、調べてみるとこんな投稿が！
[A server is already running 対処方法【Rails】
](https://qiita.com/uloruson/items/78b0d2d5c30a1f79fc02)

①ターミナルの再起動→ダメ、、、
②server.pidの削除したら直るでしょと思いきや、、、

rails s をするとエラー発生です。どうしましょ。

```zsh
Address already in use - bind(2) for "127.0.0.1" port 8080 (Errno::EADDRINUSE)
```

次に調べて行き着いたのはこの投稿でした。
[Address already in use の対処法](https://qiita.com/arashida/items/8b8d9d2f1f040b2aecf1)
>```zsh
># ポートNoが分かっていればこれで確認できる
>$ lsof -i:ポートNo
>```

そういえば、ポート番号はさっきのエラーに8080と出ていたなと。

```zsh
$ lsof -i:8080
COMMAND  PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ruby    4162 ec2-user   14u  IPv4  14892      0t0  TCP localhost:webcache (LISTEN)
ruby    4162 ec2-user   15u  IPv6  14893      0t0  TCP localhost6:webcache (LISTEN)
ruby    4162 ec2-user   20u  IPv4  15297      0t0  TCP localhost:webcache->localhost:39268 (CLOSE_WAIT)
```

そして、PIDの値を知ることができました。
なので、先ほどの投稿にあったとおりに

```zsh
$ kill -9 4162
```

直ってくれーと祈りながらサーバーを起動してみると、大成功！

まとめると、こうすれば対処できるみたいです！

```zsh
# PIDの確認
$ lsof -i:[ポートNo]

# プロセスの強制終了
$ kill -9 [PID]
```

## さいごに
初投稿、なんだかすんなり書けました笑
また色々と投稿していきたいと思います！
Spring  AOPの技術によるシステムログ出力を行う

### Spring  AOPとは
　Spring Frameworkにおいて、DI（Dependency Injection、依存性注入）と並び重要な根幹技術となっているのが「AOP」というものです。
　AOPは、「Aspect Oriented Programming（アスペクト指向プログラミング）」の略です。アスペクトというのは、一般に「横断的関心事」と呼ばれるものです。

### 環境
- spring
- java8
- Log4j

### Spring  AOPのアノテーション用語
１．@Aspect
　　@Aspectをクラスにつけることで、そのクラスはAspectとして認識されます。
２．@Pointcut
　　横断的な処理を挿入する場所(メソッド)を指定する。
３．@Before
　　対象のメソッドの処理前に実行されるAdviceです。
４．@After
　　対象のメソッドの処理結果に関わらず、必ず実行されるAdviceです。
５．@AfterReturning
　　対象のメソッドの処理が正しく終了した場合にのみ実行されるAdviceです。
６．@AfterThrowing
　　対象のメソッドの処理中に例外が発生した場合にのみ実行されるAdviceです。

### 実装デモ
```java:LoggingAspect.java
package aspect.log;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Arrays;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

/** ログ出力のアスペクトクラス. */
@Aspect
@Component
public class LoggingAspect {

  private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);

  /** publicメソッドのポイントカット. システムエラーログ出力*/
  @Pointcut("execution(public * *(..))")
  private void publicLog() {}

  /** daoパッケージのポイントカット. db操作ログ出力 */
  @Pointcut("within(app.dao..*)")
  private void dbLog() {}

  /** webパッケージのポイントカット. リクエスト、レスポンスなどのログ出力*/
  @Pointcut("within(app.web..*)")
  private void webLog() {}

  /**
   * メソッド実行前にログ出力します.
   *
   * @param jp ジョインポイント
   */
  @Before("publicLog() && (dbLog() || webLog())")
  public void dobefore(JoinPoint jp) {

    Signature sig = jp.getSignature();
    String args = "無し";
    if(jp.getArgs() != null && jp.getArgs().length > 0 ) {
    	args = Arrays.toString(jp.getArgs());
    }
    logger.info("【操作開始】" +"メソッド："+sig.getDeclaringTypeName() + "."+sig.getName()+"#入力パラメータ："+ args);
  }

  /**
   * メソッド実行後にログ出力します.
   *
   * @param jp ジョインポイント
   */
  @AfterReturning(pointcut="publicLog() && (dbLog() || webLog())",returning="returnValue")
  public void doAfterReturning(JoinPoint jp,Object returnValue) {
    Signature sig = jp.getSignature();
    logger.info("【操作終了】"+"メソッド："+sig.getDeclaringTypeName() + "."+sig.getName()+"#戻り値：" + returnValue);
  }

  /**
   * エラーが発生した場合、ログ出力します.
   *
   * @param jp ジョインポイント
   */
  @AfterThrowing (pointcut="publicLog() && (dbLog() || webLog())",throwing="ex")
  public void doAfterThrowing(JoinPoint jp,Exception ex) {
	  Signature sig = jp.getSignature();
	  StringWriter erMessage=new StringWriter();
	  ex.printStackTrace(new PrintWriter(erMessage));
	  logger.info("【エラー】" + "メソッド："+sig.getDeclaringTypeName() + "."+sig.getName()+"#エラーメッセージ：" + erMessage.toString());

  }
}

```

### 最後に
最後まで読んでいただき、ありがとうございます。

参考：
https://docs.spring.io/spring/docs/5.0.5.RELEASE/spring-framework-reference/core.html#aop
https://iikanji.hatenablog.jp/entry/2018/04/26/204324
クロージャってなに！？

Swiftを勉強をする中で、よくわからなかったのが「クロージャ」・・・<br />
クロージャと言われても、何の事かさっぱり<br />
でも、参考サイトや本を読むというよりは、実際に簡単なコードを書いて動かすと少しは理解出来る<br />
使わないと忘れてしまうので、これも備忘録として投稿します<br />

<hr />

### 大まかなクロージャの要点
・クロージャの文法でできることは、基本的に関数でも出来る・・・というより、関数もクロージャである
・ぶっちゃけ、無理にクロージャを使用する事はない
・クロージャを使用するメリットとしては、場合によってはコードが短く簡潔になるという事

# クロージャの基本文法

```swift
{ (引数) -> 戻り値の型 in  
処理
 }
```

基本文法に当てはめて動かすと

```swift
var closureTest = { () -> () in
    print("クロージャのテスト")
}

//クロージャの実行
closureTest()
```
closureTest()でクロージャの実行が行われ、print("クロージャのテスト")が表示される

# 関数とクロージャ
#### 引数なしの処理

```swift
// 関数
func testFunction() {
    print("これは、関数です。")
}

testFunction()
```
実行結果

```
これは、関数です。
```

```swift
// クロージャ
var testClosure: () -> () = {
    print("これは、クロージャです。")
}

testClosure()
```
実行結果

```
これは、クロージャです。
```
関数とクロージャ共に似た実行結果になります

<hr />

#### 引数ありの処理

```swift
// 関数
func testFunction(a:Int, b:Int)->Int{
    return a + b
}

print(testFunction(a: 5, b: 7))
```
実行結果

```
12
```

```swift
// クロージャ
var testClosure: (Int, Int) -> Int

testClosure = { a, b -> Int in
    return a + b
}

print(testClosure(5, 7))
```
実行結果

```
12
```
実行結果は同じですが、引数の扱いがシンプルになり、見やすくなります

## 終わりに
関数とクロージャを比較し、実際に記述するとより理解がしやすいです<br />
まだ他にも省略記述など、クロージャについて色々あります<br />
クロージャを理解するためには、まずは関数を理解する事<br />
関数があって、初めてクロージャの利便性が見えてくる気がします<br />
まだまだ自分もわからない事だらけなので、実装しながらより理解を高めていこうと思います<br />
PythonでOpenCVのBoVWを使ってみた


#BoVW(Bag of Visual Words)の概要について


画像認識の分野ではよく知られているBoVW（Bag of Visual Words）。
今回はBoVWの概要とOpenCVを用いたコードの記述方法についてまとめました。

#BoVWとは

まずBoVWの先駆けとなったBoWという手法について触れたいと思います。

##BoW（Bag of Words）

BoVWの元になった手法で、文章の特徴を単語ごとの出現回数で表した特徴ベクトルです。
つまり、BoWは文書ごとの単語出現数のヒストグラム(度数分布)を作ることを指します。

##BoVW（Bag of Visual Words）

BoWを応用して画像の特徴を特徴点が属する`Visual Word`ごとの出現回数で表した特徴ベクトルです。
この特徴ベクトルのヒストグラムを画像の特徴を表すものとして識別に利用します。画像処理版BoWとも言えます。
Bag-of-FeaturesやBag-of-Keypointsとも呼ばれることがあります。
技術の背景を鑑みると、BoVWが覚えやすいですね。

#BoVWの流れ

1.入力画像の`keypoints`, `descriptors`を取得

```python:python
keypoints, descriptors = detector.detectAndCompute(image, None)
```

2.クラスタを準備

```python:python
bowTrainer = cv.BOWKMeansTrainer("クラスタの数")
```

3.準備したクラスタに特徴点（```keypoints```の```descriptors```）をセット

```python:python
bowTrainer.add(descriptors)
```

4.```descriptors```でクラスタリングする(`codebook`＝Visual Wordの作成)

```python:python
codebook = bowTrainer.cluster()
```

5.```Visual Word```の出現頻度でヒストグラムを作成
（このヒストグラムが画像の特徴を表現する）

次に画像認識や機械学習の用語について解説していきたいと思います。

#局所特徴量とは？

特徴点検出法により画像中 の濃淡の変化が大きい特徴点を検出し、その特徴点周りの領域を画素値や微分値により特徴ベクトルにしたものです。

プログラム中では`descriptors`と定義されていることが多いです。

#クラスタリングとは？

教師なし学習の一つで、データの集合をクラスタという部分集合に分けることです。
BoVWでは、取得した`descriptors`に対してクラスタリングを行います。

さらにクラスタリングについて知りたい方は[こちら]((https://qiita.com/suecharo/items/20bad5f0bb2079257568))を参考にしてください。
何ができるのか、実際にどう使うのかを体系的に学ぶことができます。
BoVWでのクラスタリングにはk-meansを用いることが多いです。


#OpenCVで用意されているBoVWの関数

上記のコードではOpenCVに用意されている以下の関数を使っていますが、OpenCVには利用用途に応じで他にもBoVWのための関数が用意されています。

その他の関数については[こちら]((https://docs.opencv.org/master/d2/d6b/classcv_1_1BOWImgDescriptorExtractor.html))を参考にしてください。

テンプレートマッチングのように```matchTemplate```関数を用いて一発でBoVWが取得されるということではなく、
BoVWを作成するための手段として組み合わせて使う、と考えるとイメージしやすいかと思います。

##OpenCVで用意されているBoVWのための関数（一部）

* `BOWKMeansTrainer`
  BoVWでk-means法によるクラスタリングを行う。
  クラスタの中心（`codebook`）を返す。

* `bowTrainer.add`
  クラスタリングする`descriptors`を分類器に追加する。

* `bowTrainer.cluster`
  追加した`descriptors`をクラスタリングする。

# 参考文献

[Lecture 17: Bag-of-Features (Bag-of-Words)]((https://www.youtube.com/watch?v=iGZpJZhqEME))
英語の講義動画ですが、図が多いのでBoVWについてとてもわかりやすく解説しています。
よかったら参考にしてみてください。

[OpenCV: 局所特徴量による類似画像検索/分類]((https://hazm.at/mox/machine-learning/computer-vision/recipes/similar-image-retrieval.html))
日本語ですとこちらがおすすめ。
こちらでは実際のコードも合わせてアルゴリズムも含めわかりやすく解説しています。

---
今後もBoVWだけでなく、画像認識や機械学習について時間を見つけて記事を書きたいと思います。
FullCalendarでテキストとして休日（などの情報）を表示する

fullcalendar.jsでイベントではなく、テキスト情報として、日付の隣などに休日（などのテキスト）を表示する方法。検索しても探し出せなかったので残しておきます。使用バージョンはv3.10.0です。

## 完成図
日付の左側の祝日理由の部分です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20132/e81ee5a9-a37b-7688-ac0d-25d5b17d086b.png" width=75% alt="fullcalendar show holiday text">

## 休日イベントの取得
eventSourcersで通常のイベントとは別に休日情報を取得してclassNameでclassをつけておく。googleカレンダーの日本の祝日から引っ張ってくるのも良いかと。

参考：events from Google Calendar （US holidayの例が載っています）
https://fullcalendar.io/docs/google-calendar

```js
eventSources: [
    {
        url: '/events',
    },
    {
        url: '/holiday',
        className: 'holiday',
    }
],
```

## 祝日データの表示
上記のままだとイベントとして祝日が表示されてしまうため、eventRendarを使って、日付欄横に祝日理由を追加し、イベント欄の情報は隠します。

ざっとマニュアルを見た感じだと、v4はeventRendarの部分が変わってるので、eventElement→elとかにすると良いのかもしれません（試していません）。

eventRender
https://fullcalendar.io/docs/eventRender

```js
eventRender: function(event, eventElement) {
    if (event.source.className == "holiday"){
        //祝日データを表示
        jQuery('.fc-day-top[data-date=' + event.start._i + ']').prepend("<span class='holiday-text'>" + event.title + "</span>");
        //内容は表示しない
        return false;
    }
},
```

日付の色も変えたいときは、

```js
eventRender: function(event, eventElement) {
    if (event.source.className == "holiday"){
        jQuery('.fc-day-top[data-date=' + event.start._i + ']').addClass("fc-holiday");
        jQuery('.fc-list-heading[data-date=' + event.start._i + ']').addClass("fc-holiday");
        return false;
    }
},
```
cssでこんな感じにすると良いかと。

```css
.fc-holiday, .holiday-text {
    color: #e74c3c;
}
```
private,protected,privateのアクセス権-java

privateの代わりにprotectedを用いると、
クラス内とサブクラスからのみアクセスを許すフィールドを作ることができます。

####「public」「protected」「private」「デフォルト（何もつけない）」アクセス権について
**・public**: どこからでもアクセス可能
**・protected**: そのクラスと子クラス内からのみアクセス可能
**・private**: そのクラス内からのみアクセス可能（クラス外からのアクセスにはゲッター＆セッターが必要）
**・デフォルト修飾子**:ある要素に何も指定しなかった場合、その要素のアクセスはデフォルトとみなされ、同じパッケージ内のクラスから利用可能になります。

| アクセス権|       public|    protected    | private    |デフォルト|
|:------------|:----------:|:------:|:---:|:-----:|
| クラス内　　　|      ○ |      ○    |○|○
| サブクラス内       |   ○ |     ○       |×|×
| クラス,サブクラスの外|  ○ |  ×|×|×
WordpressのPassword保護ページをオリジナルに変更

投稿ページや固定ページで、パスワード保護をかけた場合に表示されるページをオリジナルに変更することが出来そうなので備忘用にメモしました。

１．「保護中：」を消去

functions.phpに以下を追記
```
add_filter('protected_title_format', 'remove_protected');
function remove_protected($title) {
       return '%s';
}
```


２．テキスト変更

functions.phpに以下を追記
```
function my_password_form() {
  return
    '<p>ここにテキストを入れる<p>
    <form class="post_password" action="' . home_url() . '/wp-login.php?action=postpass" method="post">
    <input name="post_password" type="password" size="24" />
    <input type="submit" name="Submit" value="' . esc_attr__("パスワード送信") . '" />
    </form>';
}
add_filter('the_password_form', 'my_password_form');
```


３．Cookieの有効期限を変える

一度パスワードを入力すると、デフォルトでは10日間パスワードの入力が不要となっているので、１時間に変更。
```
function custom_postpass_time() {
    require_once ABSPATH . 'wp-includes/class-phpass.php';
    $hasher = new PasswordHash( 8, true );
    setcookie( 'wp-postpass_' . COOKIEHASH, $hasher->HashPassword( wp_unslash( $_POST['post_password'] ) ), time() + HOUR_IN_SECONDS, COOKIEPATH );
    wp_safe_redirect( wp_get_referer() );
    exit();
}
add_action( 'login_form_postpass', 'custom_postpass_time' );
```

HOUR_IN_SECONDS の部分を変更することで時間を設定できる。

1分間…　MINUTE_IN_SECONDS
30分間…　30 * MINUTE_IN_SECONDS
1日…　DAY_IN_SECONDS　　　など



4.特定のページのみ変更したいとき

投稿ページ編
```
function my_password_form() {
if(is_single('ページID')){
return
'<p>このページを閲覧するにはコードを入力してください</p>
<form style="margin-bottom: 200px;" class="post_password" action="' . home_url() . '/wp-login.php?action=postpass" method="post">
<input name="post_password" type="password" size="24" />
<input type="submit" name="Submit" value="' . esc_attr__("送信") . '" />
</form>';
}
else{
return
'<p>このコンテンツはパスワードで保護されています。閲覧するには以下にパスワードを入力してください。<p>
<form class="post_password" action="' . home_url() . '/wp-login.php?action=postpass" method="post">
<input name="post_password" type="password" size="24" />
<input type="submit" name="Submit" value="' . esc_attr__("確定") . '" />
</form>';
}
}
add_filter('the_password_form', 'my_password_form');
```

固定ページの時は

if(is_single('ページID'))　の部分を　if(is_page('ページID'))　に変更




以下のページを参考にさせていただきました。
https://tetrachroma.co.jp/blog/131111_postpassword_custom/
https://design-plus1.com/tcd-w/2016/08/password.html
https://pokomichi.com/wordpress-password
JavaScriptのDate型を「2019-11-06」みたいな形式に変換


JavaScriptのDate型のオブジェクトから、
「2019-11-06」みたいな形で、
・ハイフン区切り
・1桁の月や日は頭に0をパディング
にするのが面倒だったので、以下のような変換用関数を作りました。

```js
//ハイフン区切りの文字列へ変換  ex)2019-11-06
function getDateString (date) {
  return date.getFullYear() + '-' 
    + ('0' + (date.getMonth() + 1)).slice(-2) + '-'
    + ('0' + date.getDate()).slice(-2)
}
```

DateオブジェクトのgetMonth()メソッドが0〜11を返すのが罠。

自分で今後も他でも使いそうなのと、
他の方にも役立つかもしれないので、置いておきます。
Docker for mac / windows で OS ホストの IP アドレスを直接指定する方法と、そのIPアドレスを確認する方法

# host.docker.internal

- `host.docker.internal` という特殊な DNS 名で、Mac OSの内部的なIP アドレス / プライベートのIPアド絵rすを使えるようだ。
- ssh コマンドや curl に指定してみると、実際の接続先のIPアドレスが分かるようだ

# curl

```
/ # curl -v https://host.docker.internal
*   Trying 192.168.65.2:443...
* TCP_NODELAY set
* connect to 192.168.65.2 port 443 failed: Connection refused
* Failed to connect to host.docker.internal port 443: Connection refused
* Closing connection 0
curl: (7) Failed to connect to host.docker.internal port 443: Connection refused
```

192.168.65.2に接続しようとする。
特にMac OS で サービス起動しているわけではないので接続自体は落ちる。

# ssh

```
/ # curl -v https://192.168.65.2
*   Trying 192.168.65.2:443...
* TCP_NODELAY set
* connect to 192.168.65.2 port 443 failed: Connection refused
* Failed to connect to 192.168.65.2 port 443: Connection refused
* Closing connection 0
curl: (7) Failed to connect to 192.168.65.2 port 443: Connection refused
```

# プライベートの IPアドレスを直接指定すると

同じ結果になる気がする

```
/ # curl -v https://192.168.65.2
*   Trying 192.168.65.2:443...
* TCP_NODELAY set
* connect to 192.168.65.2 port 443 failed: Connection refused
* Failed to connect to 192.168.65.2 port 443: Connection refused
* Closing connection 0
curl: (7) Failed to connect to 192.168.65.2 port 443: Connection refused
```

# 192系のIPアドレスって？ 

プライベートIPアドレスだっけ。

![image](https://user-images.githubusercontent.com/13635059/68352442-c8b88e00-0149-11ea-8cbf-d5e38ec3f544.png)

# Mac で ifconfig を叩いてみる

ここで分かるものではないらしい。

```
$ ifconfig | grep 192
$
```

# docker container で ifconfig

```
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:AC:11:00:04
          inet addr:172.17.0.4  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3744 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1111 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:5083958 (4.8 MiB)  TX bytes:71770 (70.0 KiB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

```

こっちにあるわけでもないっぽい。

# Ref

[Networking features in Docker Desktop for Mac | Docker Documentation](https://docs.docker.com/docker-for-mac/networking/#i-want-to-connect-from-a-container-to-a-service-on-the-host)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
webhookを使ったMerossのsiriショートカット作成の忘備録（iOS13）

##はじめに

最近、自宅の家電をsiriで操作させることにはまっています。
まず手始めに、Nature remoを使って、リモコンで動かす家電（主にエアコンと照明）をコントロールしはじめました。

そして今回、リモコンのついていない照明を、【スマートコンセント】を使ってオンオフをsiriで管理しようと思い立ちました。

購入したのは、Meross社から出ているWi-Fiスマートプラグです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178673/9c32f39e-fa48-92b4-630a-08019dca4919.jpeg" width ="30%">


##Merossはショートカットに対応してねぇ、、、
買ったは良いものの、ショートカットでMerossのアプリが表示されないトラップ、、、、

グーグル先生で色々調べたところ、[このサイト](https://gadget-shot.com/guide/42820)などを参考にIFTTTからwebhookとMerossのアプレットを作ればいいじゃんとなった。アプレット作成は超絶簡単。IFTTTって本当に便利よね。じゃあWebhookのURLをショートカットで叩けるようにしたら終わりじゃん！

##POSTでwebhookのURLを叩いても実行されない、、、

ところがどっこい、グーグルで出てくる色々なサイトを参考に、ショートカットで、【ULRの内容を取得】を使って、GET、POSTを使って叩いてみるも、音沙汰なし、、、、いろんなサイトみてもこの方法やんけ、、、どうしたもんか、、、

##結局どうしたの？

<img width="320" alt="ファイル 2019-11-07 13 14 06.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178673/f1322847-ae43-7c99-273b-009c9b79e1d4.jpeg">

じゃあどうやったかというと、二つ目の【URLの展開】を使ったところ、うまくいきました。

##原因はなに？
WebhookのURLは正しく設定できていたので、ネットに上がっているやり方はiOS12までのやり方なのかなぁ、、、と（自分のOSは13なので）。

##最後に
今回初めてiOSのショートカットの設定をやったけど、siriとのやり取りをオリジナルに構築して色々なことができそう。
RailsじゃないRspecで書かれたテストに途中からFactoryGirl導入する時の小技

#背景
Railsではない環境で書かれたRspecにFactoryGirlを導入して？ってぶん投げられたとき

既存のspec_helperの設定を変えずに新しく作ったfactory有のspecファイルの設定を分けたい。

#shared_contextの活用
Factoryを使用するspecと使用しないspecでshared_contextを分けて定義する。

```ruby:/spec/spec_helper.rb
shared_context 'Factory init', :factory_init => true do
  RSpec.configure do |config|
    # factory method
    config.include FactoryGirl::Syntax::Methods

    # factory path
    FactoryGirl.definition_file_paths = [File.expand_path('/home/imada/rails_app/spec/factories/', __FILE__)]
    FactoryGirl.find_definitions
  end
end
```

このshared_contextを定義することで既存specとfactoryを使用したspecとで設定を分けることができる。

後は実際のspecファイル内で

```ruby:実際のテストspec
RSpec.describe "factory test", :factory_init => true do
end
```
を記述すればOK

#まとめ
RailsじゃないRspecの情報が少なすぎて自分でどうにかするしかない。

途中でFactoryGirl導入して？って渡されたときはこの記事を有効活用してください。(そんなことないと思うけど)