OmniAICreator/Qiita-1.07M huggingface dataset:
Web設計(Design)善(best)悪(worst)

調べごとで、ネットで検索して、辿り着いたところが、不便極まりないところに到達することがある。

その不便なところに行ってみると、逆にそうでなければ便利なのだということに気がつく。

便利なところは、意識しないことがあり、便利であることに感謝し忘れる。
不便なところに出会って、便利なところに気がつく。

 <この項は書きかけです。順次追記します。>

 

#好ましくないと感じた所
## 1. 組織名を文字で表示していない

組織名を画像ファイルでしか表示しない場合がある。
ひどいところは、全頁に組織名がない。
もっとひどいところは、どの組織、どの個人の頁か、画像ですらない。
なにか、本人だけが知っている印がどこかにあるのかもしれないが、初めて来た人にはわからない。

## 2. 画面が派手
文字を読むのに派手すぎる画面はうんざり。目が疲れる。

## 3. やたら動画が動く
動画を再生するボタンがある場合はよいが、画面に到達したら動き始めているのは勘弁。
従量制で接続している場合もまだある。契約によっては超過するとネットにつながらない。泣）


## 4. 連絡先がない。
個人・または組織への連絡方法が書いてない。
特定のサービス上であれば、そのサービス上の連絡方法があるのかもしれない。どのサービスを利用しているかの表示がないと連絡先を探すのが手間。

## 5. 一覧機能がない
２段階で２０頁程度なら一覧がなくても、最初の頁が一覧だと思えば良い。
100頁あって、一覧がないのはひどい。
1000頁あって、階層化一覧がないのは勘弁。


## 6. 検索機能がない
自社内、自組織内でも不便だろうに。

## 7. 不必要に別の窓を開こうとする。
窓を開いてもよいのは、支払いとか、認証とか、特別の機能の場合だけにしてほしい。

## 8. 権利義務関係を表示していない。
著作権、免責事項、契約、引用・参照など、提示した情報に対する権利、義務関係を表示していない。

## 9. やたら長いアンケートで、最初にアンケートの予想時間を表示していない
３分以上かかるアンケートは、何分くらいかかるかを例示してください。
項目数を最初に表示してもよい。

#好ましい所

## 1. 各頁に、組織名が文字で入っている。
再下段の著作権表示のところ、最上段のみだしのところ。どこかにあれば、そこを許諾を得て、引用、参照する際に、どの組織の頁かがその中にある。

## 2. 色万能設計
白黒にしても見分けられるような色設計をしている。

## 3. 動画には開始釦を
動画がいっぱいあるのはうれしい。勝手に動き始めるのではなく、開始釦をつけてください。

## 4. 複数の連絡先表示
メール、line, twitter, facebook, instagram, 電話、FAXなど、複数の連絡先を表示している。

## 5. 階層化一覧がある。



## 6. 検索機能がある。

## 7.  今開いている窓だけですべての処理が終わる。
支払いや、認証のための特別な操作は、特別な窓が出てくるのは、勘違いを防ぐ意味で有用。
そうでないときに、別の窓を開くのは、やめてほしい気がする。

## 8. 権利義務関係表示。

著作権、免責事項、契約、引用・参照など、提示した情報に対する権利、義務関係を表示している。

## 9. アンケートに項目数、予想時間、贈呈物の提示がある。
20年ほど前、ホームページ作成の訓練などを実施していた頃には、アンケートの作りの妥当性などを確認するため、やたらめったらアンケートに回答していたことがある。

項目数、予想時間などが見積もれないと、電車の待ち時間とかに答えていいものかどうか迷う。

5分くらいかかるアンケートなら、500円くらいの贈呈物があると嬉しいかもしれない。
何かのポイントでもよい。


<この項は書きかけです。順次追記します。>

#参考資料(reference)
プログラマが知っているとよい色使い(安全色)
https://qiita.com/kaizen_nagoya/items/cb7eb3199b0b98904a35


 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
 

#文書履歴(document history)
ver. 0.01 初稿 20190320 早朝
ver. 0.02 連絡先、権利義務　追記 20190320 朝
ver. 0.03 アンケート追記 20190320 午前
ver. 0.04 参考資料追記 20190320 昼前
ver. 0.05 4,5,6,7順番入れ替え 20190320　昼
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
UIButtonをタップして画像を切り替える

Todoリストなどを作成するとき、チェックマークのUIButtonをタップしてボタンの画像を切り替えたい時があると思います。実際に実装して注意点があったので書き残しておきます。

## すぐ思いつく実装

自分は最初に以下のように実装しました。あまりにシンプルですね。

```swift:ViewController.swift
class ViewController: UIViewController {
    @IBOutlet weak var imageButton: UIButton!

    @IBAction func imageButtonPush(_ sender: Any) {
        
        let image = UIImage(named: "icon")
        imageButton.imageView?.image = image
    }
}
```

しかし、実際にボタンをタップしてみたところ画像は元のままで見た目が変更されませんでした。
UIImageViewから差し替える必要があるのでは？と思い、以下に変更して再度実行してみました。

```swift:ViewController.swift
class ViewController: UIViewController {
    @IBOutlet weak var imageButton: UIButton!

    @IBAction func imageButtonPush(_ sender: Any) {
        
        let image = UIImage(named: "icon")
        let imageView = UIImageView(image: image)
        imageButton.imageView? = imageView
    }
}
```

しかし、これでも画像がUIButtonに反映されませんでした。
そこでUIButtonをもう少し見てみると、 `setImage`メソッドを発見！こちらを試してみました。


```swift:ViewController.swift
class ViewController: UIViewController {
    @IBOutlet weak var imageButton: UIButton!

    @IBAction func imageButtonPush(_ sender: Any) {
        
        let image = UIImage(named: "icon")
        let state = UIControl.State.normal
        
        imageButton.setImage(image, for: state)
        
    }
}
```

上記実装でボタンを押下したところ、無事画像が切り替わりました。
【勝手に毎日投稿祭り】エンジニアもホンキーマンになったら人生ハッピー説

1週間限定で、「勝手に毎日投稿祭り」と題して毎日投稿をすることにしました。
ぜひぜひ、皆さんも便乗して下さい。

###皆さんは、ホンキーマンと聞いて、パッと頭に思い浮かぶだろうか？
[![Image from Gyazo](https://i.gyazo.com/14985eae4b2e52e3607d11127543f5fb.png)](https://gyazo.com/14985eae4b2e52e3607d11127543f5fb)

昨年終了したイケてるテレビ番組「めちゃめちゃイケてる」の27時間テレビ回で、"本気"をテーマにした企画の中、岡村が扮装していたキャラクターだ。

このキャラクターがというよりは、岡村の本気で臨む姿勢が私は大好きだ。
特にオファーシリーズは、誰がなんと言おうと、いつも感動と元気をもらっていた。

私がこの番組放映時、ふと思っていた事がある…

####「最近、本気になってないな～」と。

大人になってから本気で何かに取り組むってどれだけしてるだろうと考えると、どこか手を抜いてしまったり、セーブしている自分がいると気づいた。大人になってからは、楽することばかり考えているなと。

学生の時は、朝練2時間して、昼練して、部活して、部活後にチャリで1時間かけてジムに行って筋トレして、って生活を週6してたのになぁ…と過去の栄光のようなものを武勇伝のように語るオヤジになってしまった。

本気で何かしようとしても今は体が動かない。。。
私は、もうすでに本気のなり方を忘れてしまっているのだ。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235933/c7d16219-7007-084c-bb3b-fdd9b53d9ca5.png)

このままでは、何も成せない、輝けないまま、変化のない日々を過ごすだけになると焦りを感じた。
まだまだ×100 守りに入る年ではないと、気づいたのだ。

そして、私は***本気になるリハビリをすることにした。***

過去のリハビリ履歴の内のひとつが、こちらだ。
[資格取得の為の一週間短期集中学習。資格勉強の恩恵を感じた一週間を振り返る](https://qiita.com/shimatter/items/7eb586ddf43fbd8a81a8)

そして、最近また行ったのが、Java SE8 Silverの資格取得だ。2週間で取ったという方がいたので、1週間で取る目標でおこなった。
別に早く資格が取れたら偉いとか言いたい訳ではなく、本気を出したらここまでいけるということにチャレンジしたかったのだ。(もちろん、短期で取って内容を覚えてないんじゃ意味がないことは分かっているので、その後に復習はしている。)

結果としては、32時間確保して8日間の学習で資格取得が出来た。夜勤業務や家庭の都合など悪条件が重なったのだが、前回の資格取得時よりは学習時間を捻出しながら、なかなかの本気度で取り組めたかなと個人的には思った。

私もまだまだ試行錯誤中ではあるが、ここで、私の思う、本気になって得られたメリットを挙げてみる。

***■達成感・充実感が得られる***

***■人生にハリが出て、同じことをするのでも100倍楽しくなる***

***■新しいことに取り組みたいと思う次の意欲に繋がる***

***■自分に言い訳しないカッコいい生き方ができる***

要するに、学生時代に必死になって何かに取り組んでいたあの時の感じだ。
まだ、全力の本気って出したことないかもって人も上記のようなことに魅力を感じるなら、これからそれを味わっていけばいいと思う。

いかに楽をするかばかり考えて、毎朝、気持ちをどんよりさせながら出勤して一日が過ぎるのを待つ人生より、取り組む姿勢を変えてみませんか。

私は、今のところ、この説は間違いないと思い、上記のメリットも感じている。そして、これからの人生の経過をもって、説を立証していきたいと思う。

皆さんも、この説を信じてもらえたなら、一緒に立証していきませんか。

[![Image from Gyazo](https://i.gyazo.com/11acfd871bfaed41d9cfdd1a4e80d50d.png)](https://gyazo.com/11acfd871bfaed41d9cfdd1a4e80d50d)
以上。
独自設定ファイルの fluentd コンテナを作成し、Fluentd logging driver で使ってみる

検証で [Fluentd logging driver](https://docs.docker.com/v17.09/engine/admin/logging/fluentd/) コンテナを使う必要があり、独自の設定ファイル(flunetd.conf)のイメージを作成するまでをやったのでメモ。

# 設定ファイルを検証する

[Test container loggers](https://docs.docker.com/v17.09/engine/admin/logging/fluentd/#test-container-loggers)

まずはローカルで設定ファイルを検証する。
ドキュメント通りだがやってみる。

設定する flunetd 用の設定ファイルを作成。
Input されたものを標準出力する設定ファイルとする。

```test.conf
 <source>
   @type forward
 </source>

 <match *>
   @type stdout
 </match>
```

以下でコンテナを起動させる。

```bash
$docker run -it -p 24224:24224 -v `pwd`/test.conf:/fluentd/etc/test.conf -e FLUENTD_CONF=test.conf fluent/fluentd:latest
```

別 terminal でコンテナを起動する

```bash
$docker run --log-driver=fluentd busybox echo hoge
```

この時に fluentd コンテナで以下が出力されれば OK.

```bash
2019-03-19 21:34:06.000000000 +0000 10e9f96207fe: {"source":"stdout","log":"hoge","container_id":"10e9f96207fec6ead0d5757457c0446c4320c3b2b5c8c92588be721005909609","container_name":"/stupefied_cartwright"}
```

ドキュメントに書いてある通り、source や コンテナ ID などのフィールドの追加も確認出来たので成功。

# Image を作成する

設定ファイルが問題なさそうなのでイメージを作成する。

[fluent/fluentd](https://hub.docker.com/r/fluent/fluentd/)

作成方法は fluentd の DockerHub の「How to build your own image」に詳細をが記載されていたのでこちらを参考にやってみる。

```bash
# Create project directory.
mkdir custom-fluentd
cd custom-fluentd

# Download default fluent.conf. This file will be copied to the new image.
# VERSION is v1.3 or v0.12 like fluentd version and OS is alpine or debian.
# Full example is https://raw.githubusercontent.com/fluent/fluentd-docker-image/master/v0.12/debian-onbuild/fluent.conf
curl https://raw.githubusercontent.com/fluent/fluentd-docker-image/master/VERSION/OS-onbuild/fluent.conf > fluent.conf

# Create plugins directory. plugins scripts put here will be copied to the new image.
mkdir plugins

curl https://raw.githubusercontent.com/fluent/fluentd-docker-image/master/Dockerfile.sample > Dockerfile
```

次に `flunetd.conf` を先程検証したファイルに変更する。
最後に build する。

```bash
$docker build -t toshihirock/dump-fluentd .
```

問題ないか確認。

```bash
$docker run -it -p 24224:24224 toshihirock/dump-fluentd:latest
```

```bash
$docker run --log-driver=fluentd busybox echo hoge
hoge
```

これで同じように flunetd コンテナにログが出ることを確認。

DockerHub に push しておく。

```bash
$docker push toshihirock/dump-fluentd
```


なお、今回は利用していないが plugin を使う場合には `Dockerfile` において `sudo gem install fluent-plugin-elasticsearch`という感じで指定すれば良さそう。
とあるエンジニアの問題意識 2019-03-19

# 駆け出しのエンジニアの頃、僕は人より10倍も速いスピードで、プログラミングしようと思っていた。
だけど実際には、人よりも10倍も遅かった。手を動かすスピードじゃなくて、コミュニケーションの方法がまずかったり、要件定義の問題で、恐ろしいほどの手戻りが発生したりしていたのだ。今でも、自分が思う理想よりも3分の1ぐらいのことしか、実際にはできないのだと、心を決めている。実際にそうなのだから。だがそれでも、仕事はちゃんと回っているようだ。エンジニアの仕事は、本当に、わずかずつの、パズルの組み合わせであり、ピースさえうまくはまえれば、最小限の力で、最大限の力を出すことが出来るんだよな。 
# 仕事は褒めることが大事だという。
だけど人見知りなエンジニア同士、どうやって褒めたら良いのか。コードレビューに good の絵文字ひとつ。これですよ、これ。 :+1: 
# プログラミングや業務の手順などで、おそらく自分が意識できない部分で、複雑性に行き当たって、なんだか嫌な感じがした時は、ぐっと足の裏に力を入れる。

堺筋マッスルに訴えかければ、ある程度、もやもやしたストレスを解消できる気がする。

ストレスというとまあなんとも、もやっとした平凡な言い方で、嫌なのだけれども。

 

# 疲労感というのはなんとも不思議なものだ。

単にエネルギー低下とは認識できず、世界観まで変わってしまう感じがする。やはり脳のハッキングが起こる。これを単純なメーターの下降だと認識できれば。 

# 駆け出しの #エンジニア の頃、僕は人より10倍も速いスピードで、プログラミングしようと思っていた。だけど実際には、人よりも10倍も遅かった。手を動かすスピードじゃなくて、コミュニケーションの方法がまずかったり、要件定義の問題で、恐ろしいほ..

(290文字)

<https://t.co/zEIxxJXSme>

# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【Unity】UnityでAnimatorControllerを設定する

環境メモ

⭐️Mac OS Mojave バージョン10.14
⭐️Unity 2018.2.15f1
⭐️Blender v2.79.6
⭐️Mac Book

実際に動かした動画はこちら↓↓
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Blenderで作った✨アニメーション✨「Run」「Jump」「WOW」🤩<br>をUnityにFBXエクスポートして💫<br>Unityの🌸AnimatorController🌸で動かしてみたよぉ。😊<a href="https://twitter.com/hashtag/Unity?src=hash&amp;ref_src=twsrc%5Etfw">#Unity</a> <a href="https://twitter.com/hashtag/unity3d?src=hash&amp;ref_src=twsrc%5Etfw">#unity3d</a> <a href="https://t.co/1EY2NhdPrU">pic.twitter.com/1EY2NhdPrU</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1108086008422137856?ref_src=twsrc%5Etfw">2019年3月19日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



AnimatorControllerを設定する。
<img width="804" alt="スクリーンショット 2019-03-17 14.14.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/93155/bf072906-0add-5c0e-d0b4-a89127d5c647.png">

<font color="Magenta">画像が多いとQiitaの容量オーバーで画像が貼り付けられなくなるので</font>
詳細は、「はてなブログ」に記載してます↓
[かぴばらさんの覚書ブログ nonkapibara](https://nonkapibara.hatenablog.com/entry/2019/03/20/034338)
AWSのEC2インスタンスリタイア通知が届いた時の対応

# 概要
個人的メモ。
「EC2が利用しているハードウェアが故障したので他のハードウェアに移ってほしい」というお願いメールが、たまにAWSから届きます。
何も対処しないと指定日時にインスタンスが停止するため、継続利用するためには作業が必要です。

※通知メールの題名と本文は英文で見逃しやすいですが、対応期限があるため要注意です。

# EC2 インスタンスのリタイアとは
「EC2インスタンスが利用しているハードウェアが劣化・故障したから、近いうちにハードウェアを停止させるね(EC2も停止する)。継続利用したいならちゃんと対応してね」というものなのですが、知らない人が見たら驚きますよね。

継続利用する場合はハードウェアが停止する前に、メールの内容に従ってEC２インスタンスが利用するハードウェアを変更する必要があります。

※ハードウェアが停止する日時はメール本文に記載されていますが、予定日時より早くにEIPがデタッチされることがあったりするようなので、可能なら早めに対応しておきたいですね。

## リタイア通知メール
### メール題名
Amazon EC2 Instance Retirement [AWS Account ID: xxxxxxxx]

### メール本文(一部抜粋)
>Hello,
>EC2 has detected degradation of the underlying hardware hosting your Amazon >EC2 instance (instance-ID: xxxxxxxx) associated with your AWS account (AWS >Account ID: xxxxxxxx) in the xxxxxxxx region. Due to this degradation your >instance could already be unreachable. We will stop your instance after >20xx-01-01 00:00 UTC.

>You can find more information about maintenance events scheduled for your >EC2 instances in the AWS Management Console (https://console.aws.amazon.com/ec2/v2/home?region=xxxxxxxx#Events)

>* What will happen to my instance?
>Your instance will be stopped after the specified retirement date. You can >start it again at any time after it’s stopped. Any data on local instance->store volumes will be lost when the instance is stopped or terminated.

※通知メール本文の和訳は以下の記事に記載されています。詳細が気になる方はどうぞ。
[[Retirement Notification] Amazon EC2 Instance scheduled for retirement.](https://qiita.com/bezeklik/items/b99f8a03881d34d4f2b1)

# 対応手順
## リタイア日時を確認する
リタイア日時はメール本文に記載されていますが念のため「EC２ダッシュボード」-「イベント」からも確認しておきましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/269537/ba03ed71-7a7f-dd1d-550d-67612d87b969.png)

## EC2インスタンスのルートデバイスタイプを確認する
リタイヤ対象のEC2インスタンスの説明欄内にある「ルートデバイスタイプ」を確認します。この値が```ebs```か```instant store```かで作業内容が変わります。
<img width="268" alt="スクリーンショット 2019-03-16 13.07.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/269537/04e437c8-458f-b7ec-cb1a-0bad9247488e.png">

## ルートデバイスタイプが```ebs```の場合
リタイヤ対象のインスタンスを一度「停止」させてから「起動」するだけでOKです。
※「停止」させてから「起動」すると、物理的に実行されるハードウェアが自動的に変更されます。「再起動」のみだとハードウェアは変わらないため注意が必要です。

## ルートデバイスタイプが```instant store```の場合
1. EC2インスタンスからイメージを作成する。
1. ↑で作成したイメージを利用し、別のEC2インスタンスを立ち上げる。
1. 元のEC2インスタンスは削除する、

## 完了確認
念のため、「EC２ダッシュボード」-「イベント」から、リタイヤイベントが消えていることを確認しておきましょう。
<img width="1692" alt="スクリーンショット 2019-03-09 4.24.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/269537/f0ab88ad-af78-c6ae-00e7-c3ae3e14469b.png">


# 参考
[AWS特有の運用イベントまとめ（非障害系）](https://dev.classmethod.jp/cloud/aws/operational-event-on-aws/)
PHPの緩い比較とCTF

#はじめに
CTFのWeb問で登場したので取り上げます。
完全に自分用のメモで、後半はPHPの比較と全く関係ないごった煮ですがご了承を。

## PHPの緩い比較と厳密な比較

PHPには`==`と`===`の2つの比較演算子があり、
・前者は型変換をおこなった上で比較(緩い比較)
・後者は緩い比較に加えて型の一致も必要条件に(厳密な比較)

特にstringsとnumberを比較する場合、stringsをnumberに変換するので
'123abc' $\rightarrow$ 123
'12.34a' $\rightarrow$ 12.34
'aaaaa999' $\rightarrow$ 0
と、先頭から数字として認識できる部分までを抽出してしまいます。
そのため

``` php
<?php
    # 厳密な比較
    echo (123 === "123abc");
    # 何も返さない -> False

    # 緩い比較, 順序は問わない
    echo (123 == "123abc");
    echo ("123abc" == 123);
    # 共に1を返す -> True

    #文字列同士ならnumberに変換はしない
    echo ("123" == "123a");
    # 何も返さない -> False
?>
```
##CTFでの活用

CTFで出された問題では、とあるURL[^1]とCookie`otadmin = {"hash": hoge}`を付与してHTTP通信し、hogeの部分が正しいとflagが表示, 誤りだと以下のif文が実行されるという流れです。

```php 
# 与えられたPHPコードの一部

# otadmin = {"hash": 123}なら$session_data = 123
$session_data = json_decode($_COOKIE['otadmin'], true);

if ($session_data['hash'] != strtoupper(MD5($cfg_pass))) {
    echo ("I CAN GIVE YOU A HINT\n");
    # 以下, ヒントを表示するコードが存在
    # MD5($cfg_pass))は, 各桁が数字なのか文字なのかだけは判明している
    # 本問では最初3桁は数字, 4桁目はアルファベットということが既知
    exit();
}
```
さて、`$cfg_pass`も`MD5($cfg_pass)`もわからない状態でどうif文を回避するかですが、このif文の条件式に緩い比較が使われているのがミソになります(厳密な比較だと`!==`となるはず)。

もし仮に
`MD5($cfg_pass) = 76a2173be6393254e72ffa4d6df1030a`
だとしましょう[^2]。先程の説明から、緩い比較をする際にはstringsはnumberに変換、つまり`$session_data['hash']`と76を比較することになります。

もうお分かりでしょうか。今回は最初の3桁は数字、4桁目はアルファベットとわかっているので、緩い比較を行う際には`strtoupper(MD5($cfg_pass))`は高々3桁の数として認知されるわけです。
これならbrute forceで探索しても問題はなく、

```python:solve.py
import requests

url = '(与えられたURL)'
for i in range(1000):
     # hashに0~999を代入してbrute force 
     r = s.get(url, cookies = {'otadmin': '{"hash": %d}' % i})
     # 注意 : r.contentはバイナリ形式。
     if b'HINT' not in r.content:
          print(r.content)
          break
```
とすることで答えが得られます。


[^1]: 攻撃されることも考慮してあえて載せません。
[^2]: "passwd"のMD5変換です。
【Python3】超初心者のデコレータMEMO

#はじめに
この記事は超初心者の覚書です。
言語はPython3系。

#decoratorの定義

```python

def decorator1(func):
    ~何らかの処理~

```

があったとして、
…


```python

@decorator1
def kansuu(~):
    ~何らかの処理~
```

と

```python

def kansuu(~):
    ~何らかの処理~

kansuu = decorator1(kansuu)
```

は**全く同じ意味**です。


#練習問題をやってみよう
このままでは物足りないので、簡単に練習問題を書いてみました。
##問題
次のコードの実行結果を答えてください。
(直後に答えを書きます)

```python

def decorator1(func):
    def wrapper(text):
        print('1')
        func(text)
        print('2')
        print('text:'+text)
        print('3')
    
    return wrapper

@decorator1
def myouzi(name):
    print('私の名字は「'+name[0:2]+'」です。')


myouzi('浦島太郎')
```
##答え

```実行結果
1
私の名字は「浦島」です。
2
text:浦島太郎
3
```

##解説
最初に書いたようにデコレータを書き換えてみます

```python
def decorator1(func):
    def wrapper(text):
        print('1')
        func(text)
        print('2')
        print('text:'+text)
        print('3')

    return wrapper

def myouzi(name):
    print('私の名字は「'+name[0:2]+'」です。')


myouzi = decorator1(myouzi)  #ここがミソ


myouzi('浦島太郎')
```

すると、`myouzi('浦島太郎')`で呼び出されるのは、

```python
    print('1')
    print('浦島太郎'[0:2])   #元のmyouzi関数の処理
    print('2')
    print('text:'+'浦島太郎')
    print('3')
```


となります。

`myouzi`には`decorator1`内の`wrapper関数`の`func関数`が`myouzi関数`に置き換わったものが`decorator1(myouzi)`の戻り値として代入されるからです。

(いい加減＆文法的に間違ってそうな説明でごめんなさい)


#終わりに
当方超初心者のため間違っている説明やわかりにくいところがあると思うのでその際は遠慮なく指摘お願いします。
Linuxでbashrcなどで設定をミスってpathが通らない時の覚書

#pathが通らなくなった
.bashrcを弄りたくてもテキストエディタ関連の環境変数も死んでいるので弄れない、そんな時のメモ

```
$ export PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin
```

コレをしてから.bashrcなどを直します


#参考
https://forums.ubuntulinux.jp/viewtopic.php?id=9225
Symfony4でCRUD

# Somposerをインストール
```
$ brew install composer
```

# Symfonyのプロジェクト作成
```
$ composer create-project symfony/website-skeleton bookshelf
$ cd bookshelf
```

# サーバー起動
```
$ bin/console server:run
```

# Mysqlの設定(Dockerから)
```
$ docker run -d -p 3306:3306 \                                                                                                                                                      
    -e MYSQL_USER=db_user \
    -e MYSQL_PASSWORD=db_password \
    -e MYSQL_DATABASE=db_name \
    -e MYSQL_RANDOM_ROOT_PASSWORD=yes \
  mysql:5.7
```

# Doctrineのインストール
```
$ composer require symfony/orm-pack
$ composer require symfony/maker-bundle --dev
```

# Entityの作成
```
$ php bin/console make:entity                                                                                                                                                        
 Class name of the entity to create or update (e.g. VictoriousJellybean):
 > Book
 New property name (press <return> to stop adding fields):
 > title
 Field type (enter ? to see all types) [string]:
 > string
 Field length [255]:
 > 255
 Can this field be null in the database (nullable) (yes/no) [no]:
 > no
 updated: src/Entity/Book.php
 Add another property? Enter the property name (or press <return> to stop adding fields):
 > description
 Field type (enter ? to see all types) [string]:
 > text
 Can this field be null in the database (nullable) (yes/no) [no]:
 > no
 updated: src/Entity/Book.php
 Add another property? Enter the property name (or press <return> to stop adding fields):
 > content
 Field type (enter ? to see all types) [string]:
 > longtext
 Field type (enter ? to see all types) [string]:
 > text
 Can this field be null in the database (nullable) (yes/no) [no]:
 > no
 updated: src/Entity/Book.php
 Add another property? Enter the property name (or press <return> to stop adding fields):
 > <return>
```

# マイグレーションの生成
```
$ php bin/console make:migration
```

# マイグレーションの実行
```
php bin/console doctrine:migrations:migrate
```

# CRUD
```
php bin/console make:crud Book
```

# 確認
```
bin/console server:run
```
常用漢字を取得するgolang packageを作った

おもしろい記事を見つけました。
[常用漢字の中からランダムで元号を生成するコマンドを作りました](https://qiita.com/suzuki86/items/b64b52b6092214879b56)

気になったのでソースを覗いたら常用漢字がベタ書きされていました。
https://github.com/suzuki86/gengo-generator/blob/master/main.go#L26-L2166

そして思いました。
常用漢字をコードポイントで計算 or 取得できないものだろうか:thinking:と。

コードポイントの方は調べたら結構バラバラだったので無理そうでした。

取得はAPIは見つからなかったものの、[Wikipedia](https://ja.wikipedia.org/wiki/%E5%B8%B8%E7%94%A8%E6%BC%A2%E5%AD%97%E4%B8%80%E8%A6%A7)に一覧があったためそこから取得することにしました。

## Repository

https://github.com/178inaba/go-joyokanji

## GoDoc

まだドキュメント全然書いてないですが。

https://godoc.org/github.com/178inaba/go-joyokanji

## 使い方

`joyokanji.List()` で常用漢字のリストが取得できます。
型は `[]rune` です。

```go
package main

import (
	"fmt"
	"log"

	"github.com/178inaba/go-joyokanji"
)

func main() {
	ks, err := joyokanji.List()
	if err != nil {
		log.Fatal(err)
	}

	for _, k := range ks {
		fmt.Printf("%#U\n", k)
	}

	fmt.Printf("Total: %d.\n", len(ks))
}
```

### 結果

```
U+4E9C '亜'
U+54C0 '哀'
U+6328 '挨'
...
U+67A0 '枠'
U+6E7E '湾'
U+8155 '腕'
Total: 2136.
```

## gengo-generator

自分も元号ジェネレータを書いてみました。

### インストール

```console
$ go get -u github.com/178inaba/go-joyokanji/cmd/gengo-generator
```

### 使い方

```console
$ gengo-generator
尿球
$ gengo-generator
胞膨
$ gengo-generator
食乱
$ gengo-generator
遠腰
$ gengo-generator
汗逆
```

食乱は治安が悪そうな時代ですね:sweat:
Macのキーボードの隠しコマンド

## Macのキーボード周りにはいろいろな秘密がつまっている！

プログラミングをするときなどIDEの機能で行ごと上下に移動したり一気にインデントしたり、キーボード周りの入力で長い文字列を作成する手間を省こうとしますが、
Pagesを使ったりメモを入力したり、日常的な文章の作成でもカーソル移動がめんどくさいとか、ありますよね！ね！

その悩み、解決できます。

(別にMacだけじゃないかも)(何番煎じ)

## Option + カーソルキー / Cmd + カーソルキー
(個人的にMacの好きなところNo.1かも)
<kbd>option</kbd>を押しながら矢印キーを押す事で、どのアプリでも（諸説あり）単語ごとに移動することができます！
<kbd>shift</kbd>も押せば選択することも可能です。

![option](https://i.gyazo.com/8839006a5594f9bdd61332570ab908c3.gif)

<kbd>command</kbd>はwindowsでいう<kbd>ctrl</kbd>と機能が似ていますね。
矢印キーと組み合わせれば行頭、行末、ファイルの先頭、ファイルの末尾に移動することができます。
<kbd>shift</kbd>も押せば選択することも可能です。

![command](https://i.gyazo.com/55f133d103cae954ce12444ca943af17.gif)

## 矢印出すの面倒くさくね。。？
日本語入力中ならそんなことはないですよ！<kbd>k</kbd>→<kbd>a</kbd>と入力されると即座に「か」に変換されるように、<kbd>z</kbd>→<kbd>h</kbd>,<kbd>j</kbd>,<kbd>k</kbd>,<kbd>l</kbd> を入力するとそれぞれ「←」「↓」↑」「→」に変換されます。楽チンです。

![arrows](https://i.gyazo.com/7ea608ddbf3b1a9720981bd12dc14351.gif)

## 数学の記号とか入力しにくいよねー

実はものによっては一瞬で入力できます。(LateX使おうはなしで、、)

optionを押しながら通常のキーを入力するとキーボードには印字されていない文字が入力でき、その中に一部の数学記号などが含まれています。下はJISキーボードの例なのでUS配列だとまた違うかもです、、

基本のキーボード配列
<pre>
[ 1][2][3][4][5][6][7][8][9][0][-][^][¥]
[⇥][q][w][e][r][t][y][u][i][o][p][@][[]
[^ ][a][s][d][f][g][h][j][k][l][;][:][]]
[⇧  ][z][x][c][v][b][n][m][,][.][/][_]
</pre>

<kbd>option</kbd>を押しながら入力したとき： {}内のキーは修飾文字が入力されるので何かしらの母音と組み合わせて初めて見えるようになります。（下では全てaを使ってますが他の母音にもつけられます。）
<pre>
[ ¡][™][£][¢][∞][§][¶][•][ª][º][–][≠][\\]
[⇥][œ][∑]{á}[®][†][¥]{ä}{â}[ø][π][“][‘]
[^ ][å][ß][∂][ƒ][©][˙][∆][˚][¬][…][æ][«]
[⇧  ][Ω][≈][ç][√][∫]{ã}[µ][≤][≥][/]{à}
</pre>

<kbd>option</kbd> + <kbd>shift</kbd>を押しながら入力したとき：
<pre>
[ ⁄][€][‹][›][ﬁ][ﬂ][‡][°][·][‚][—][—][|]
[⇥][Œ][„][´][ ][ˇ][Á][¨][ˆ][Ø][∏][”][’]
[^ ][ ][ ][Î][Ï][˝][Ó][Ô][][Ò][Ú][Ú][»]
[⇧  ][ ][ ][ ][◊][ı][˜][Â][¯][˘][¿][`]
</pre>


## おわり
他にこういう機能ありますよーとかあったら教えてください！
Emacsで類語や変数名の候補をサッと調べる

**これは[「Qiita/Vimで類語や変数名の候補をサッと調べる」](https://qiita.com/no_clock/items/a513c1cc8a116ca76115) のリスペクト記事です**

今回作った package は [GitHub/zenrei.el](https://github.com/blue0513/zenrei.el) に置いておきます。

## この package は何？
+ クラス名・メソッド名・変数名の使用実績検索サービス[「zenrei」](https://zenrei.nyamikan.net/)の API を Emacs から叩けます
+ 結果を[「posframe」](https://github.com/tumashu/posframe)で表示させられます

![zenrei](https://i.gyazo.com/07e7d6fe8293de85911c043abf00db22.gif)

## 何が嬉しいの？

+ スター数の多いレポジトリの変数や、入力した単語の類語を教えてくれるので、コーディング中の命名が楽になります
+ エディタ上で結果を見ることができるので、カーソルをブラウザに移動させる手間を省けます

## セットアップ

### 事前準備

+ [posframe.el](https://github.com/tumashu/posframe) を使っているため `posframe.el` を事前にインストールする必要があります
+ [jq](https://stedolan.github.io/jq/) コマンドを使用しているので、こちらも事前インストールが必要です

### 本設定

`git clone` して init.el を以下のように編集するだけです。

```lisp
(add-to-list 'load-path "/path/to/zenrei.el")
(require 'zenrei)
```

## 使い方

（API の詳しいレスポンス等は [GitHub: typewriter/zenrei](https://github.com/typewriter/zenrei) を見てください）

### Search API

`M-x zenrei-search RET YOUR_STRING`
入力した string が使用されているレポジトリとファイル名がわかります
（注）データはRubyスクリプトのみを対象としているようです

### Suggest API

`M-x zenrei-suggest RET YOUR_STRING`
GitHubのスター数上位のリポジトリから、入力した string と前方一致した使用頻度の高い名前を10件表示します
（注）データはRubyスクリプトのみを対象としているようです

### Synonyms API

`M-x zenrei-synonyms RET YOUR_STRING`
[日本語 WordNet](http://compling.hss.ntu.edu.sg/wnja/)のデータに基づき、入力した string の類語の情報を表示します

### Delete posframe API

`M-x zenrei-delete`
表示された `posframe` を消します

## 参考

+ [GitHub: typewriter/zenrei](https://github.com/typewriter/zenrei)
+ [GitHub: typewriter/zenrei.vim](https://github.com/typewriter/zenrei.vim)
+ [Qiita: no_clock/Vimで類語や変数名の候補をサッと調べる](https://qiita.com/no_clock/items/a513c1cc8a116ca76115)
【Xcode】テストコードの補完が効かないとき

自分の場合です。あくまで参考までに。

# 原因
**SchemeのRunとTestに設定しているConfigurationがバラバラだったので、うまくいかなかったようです。**

# うまくいかない時
## Run
<img width="898" alt="スクリーンショット 2019-03-20 1.02.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/114709/e8d14950-0f32-25f1-8922-1722b09778d2.png">

## Test
<img width="895" alt="スクリーンショット 2019-03-20 1.02.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/114709/542ce6a0-44c4-5010-d658-82891ddb148d.png">

# 治った時
## Run
<img width="898" alt="スクリーンショット 2019-03-20 1.02.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/114709/a623cba1-192f-b7a9-16a5-86a531eea080.png">

## Test
<img width="898" alt="スクリーンショット 2019-03-20 1.02.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/114709/e2825194-5b02-33d6-4d34-e6c648756501.png">
asciidoctorでstylesheetを指定して出力する

メモ書きで恐縮ですが、取り急ぎ記録のため。

## はじめに
asciidocの標準スタイルに飽きてきた。。

## 前提
Windows10
ruby 2.4.2
asciidoctor 1.5.8

## asciidoctorによるstylesheetの指定

-a : これからattribute書くよ（なのか？）
stylesheet=＜cssファイル名＞ : cssを指定する用のやつ

```
asciidoctor -a stylesheet=sample.css sample.adoc
```

※sample.adoc、sample.cssは同じディレクトリ配下です、取り急ぎ。


検証のため、cssは下記を参考にしました。取り急ぎ。
https://github.com/asciidoctor/asciidoctor-stylesheet-factory

## 実行結果
### before
```
asciidoctor sample.adoc
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/129204/b3079ad7-f274-b4b5-75fc-121d4e27ad86.png)

### after
```
asciidoctor -a stylesheet=sample.css sample.adoc
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/129204/858baaab-2ac0-9367-4e8d-08eaac08994a.png)

取り急ぎですが、指定したcssを読み込んでくれました。
出力したhtmlに、cssの内容がべた書きされるので誰かにhtml渡すときにcssも渡すの忘れてた！という凡ミスを防いでくれます。助かります。

### まとめ
約3年前に、フッターに出力する内容を変えたり色々したかったため、ゴリゴリ対応したときの記録を残したいと思います。
cssの参考に使用したasciidoctor-stylesheet-factoryをちゃんと使ってみたら記事を書きます。

乱文失礼いたしました。取り急ぎ。
Java8で、UTC日時のDate型を取得する

# はじめに
Java8で、Joda-time APIのconvertUTCToLocal()やconvertLocalToUTC()相当の処理です。
Date型はtimezoneに依存してしまうので、差を考慮してDate型にします。
データベースにUTC日時を保存するときに使いました。

# Javaコード
## Java7まで
org.joda.timeを使います。

```java
    public static Date getUtcDate() {
        Date local = new Date();
        DateTimeZone zone = DateTimeZone.getDefault();
        long utc = zone.convertLocalToUTC(local.getTime(), false);
        return new Date(utc);
    }
```
## Java8
java.timeを使います。

```java
       public static Date getUtcDate() {
              ZonedDateTime now = ZonedDateTime.now(ZoneOffset.UTC);
              ZonedDateTime local = now.withZoneSameLocal(ZoneId.systemDefault());
              return Date.from(local.toInstant());
       }
```
# 参考
https://stackoverflow.com/questions/45584220/utc-to-local-method-in-datetimezone-of-joda-time-to-java-8
https://docs.oracle.com/javase/jp/8/docs/api/java/time/ZonedDateTime.html

# 終わりに
Java8の日時は、すっきりしていいですね！
BigQueryでURLパラメータから値を抽出する 

#はじめに
BigQueryでURLパラメータから値を抽出する方法です。

#方法
正規表現で分解します。

```sql
SELECT 
  REGEXP_EXTRACT(url, r"^.*param1=([^&]*)&?.*") param1,
  REGEXP_EXTRACT(url, r"^.*param2=([^&]*)&?.*") param2,
  REGEXP_EXTRACT(url, r"^.*param3=([^&]*)&?.*") param3,
  REGEXP_EXTRACT(url, r"^.*param4=([^&]*)&?.*") param4,
  REGEXP_EXTRACT(url, r"^.*param5=([^&]*)&?.*") param5
FROM 
(
  SELECT 
    "param1=abc&param2=値&param4=zzz&param5=" url 
)
```

#おわりに
UDFも試しましたが、正規表現が一番シンプルに書けました。
【Excel】解除できないリンク切れを特定する

# きっかけ
だいたい名前定義などでリンク切れがよく発生しますが、時々どこでエラーになってるかわからない、かつリンクを解除できないことがある。なので解決方法を調べてみた。

# 解決法
## エクセルって実際はzip
問題のブックの拡張子をzipに変更する。
(バックアップを取っておくこと)

## 解凍できる
windows標準のツールなどで解凍するとxmlとかフォルダが出てくる。

## grepできる
外部参照しているパス名の一部や"#REF"などでgrepをかけると問題の部分がヒットする。

僕の場合、
あるシートを定義するxmlに問題の外部参照している記載を見つけた。
↓

```xml:sheet4.xml
<x14:conditionalFormattings>
～この中～
<x14:conditionalFormattings>
```

# 原因
このタグ名を見ると明らかに**「条件付き書式」**って主張しているっぽいので条件付き書式のルールの管理を見てみるとありました！

まさか条件付き書式で外部参照していたとはねー。
FXで一分足の情報から五分後の騰落を特定条件下で60％の正解率をだす深層学習

#結論

平均して五時間に一回ほど60％の正解率を出すことができた。

#理論

学習部分は前回の記事でまとめている方法を使っています。

"""
FXの一分足データから五分後の上昇下落を予想する
https://qiita.com/nanamesincos/items/34b3d7d624a31b06509d
"""

上の記事で正解率はほぼ50％で騰落を予測できているとはあまり言えませんでした。

しかし、出力層で活性化関数をsoftmax関数にしているのでscoreという形で予測の確信度を見ることができると考えました。

行ったことはscoreの値が大きいときほど正解する確率が上がっているのではないかと言うことを可視化することです。

#実装
（ソースコードが拙いのは目をつむっていてください。もっとスマートなコード書きたい）

モデルは前回のままなので確認したい方は上のURLから飛んでみてください。

kerasで実装したmodelにはpredictとpredict_classesというメソッドがあります

predictでは活性化関数の値を、predict_classesでは分類されたクラスを表示します。

これをそれぞれlistに格納します。


```py

aa = [] #scoreの値
bb = [] #予測したラベル

for i in range(85910):
  y_pred1 = model.predict(X_test[i].reshape(1,len(X_train[i])),verbose = 0)
  y_pred2 = model.predict_classes(X_test[i].reshape(1,len(X_train[i])),verbose = 0)
  bb.append(y_pred2)
  aa.append(float(np.max(y_pred1)))

```

次にscoreがある一定の値以上のときの正解率を算出します。

ニクラス分類問題であるのと、分類が難しい問題なのでscoreは0.5から大きく離れた値にはなりませんでした。

なので今回は0.02刻みの幅で正解率の変化を見ていきます。


```py
c = np.array([0,0,0,0,0,0,0,0])  #データの個数を格納
d = np.array([0,0,0,0,0,0,0,0])  #正解したデータの個数を格納
for i in range(85910):
  for v in range(0, 8):
    l_score = v / 50 + 0.5
    if l_score < aa[i]:
      c[v] += 1
      if bb[i] == y_test[i]:
        d[v] += 1
```

最後に出力

```py

for v in range(8):
  l_score = v / 50 + 0.5
  print(str(l_score) + "の時の正解率")
  print(d[v]/c[v]*100)
```

#結果

score =< 0.5の時の正解率
52.098707950180426

score =< 0.52の時の正解率
53.33433399090831

score =< 0.54の時の正解率
55.09140353527723

score =< 0.56の時の正解率
59.51940850277264

score =< 0.58の時の正解率
100.0

score =< 0.6の時の正解率
nan

score =< 0.62の時の正解率
nan

0.64の時の正解率
nan

全データ数85910

各scoreでのデータの個数
[44758, 24873,  7293,   322,     4,     0,     0,     0]

#感想

scoreが0.56を超えてくると正解率が約60％になった。その時のデータ数が322なので全体の個数を割ると1/256になる。

256分に一回なので五時間のうち一回は六割の正解率で騰落を予測できている。

また、結果から見てもscoreが上がるに連れて正解率も上がっている。流石に100％はサンプル数が４つしかないので信用出来ないという面もあるが。


流石にまだギャンブルできるほどの確率ではないにしても改善方法に心当たりがあるのでこれから試行錯誤していきます。

参考にさせていただいた記事
https://qiita.com/ishizakiiii/items/3b894b6e987fdf87093e
Emacsでファイルパスから中身を透視する

`recentf` などを実行した時に、ファイルの中身がわからず、確認する手間が発生するときがあります。
そこで、ファイルパスから中身を透視（second sight）できる package を作ってみました。

本体は [GitHub/second-sight](https://github.com/blue0513/second-sight) に置いておきます。PR/issue 待ってます。

## これは何？

ファイルパスからその中身を、ファイルを開かずに確認できます。

`thing-at-point` での例
[![thing-at-point](https://i.gyazo.com/04cf3320ecec8a007354d72456fb4d26.gif)](https://gyazo.com/04cf3320ecec8a007354d72456fb4d26)

`counsel-find-file` での例
[![counsel](https://i.gyazo.com/7050db79f0e21280cd67f00e46a0ec65.gif)](https://gyazo.com/7050db79f0e21280cd67f00e46a0ec65)

## 何が嬉しいの？

buffer を開く手間を減らせます！
buffer 移動をせずに中身を見られるので、buffer 迷子にならずに済みます！

## セットアップ

### 事前準備

この package は [posframe.el](https://github.com/tumashu/posframe) を使っています。
そのため `posframe.el` を事前にインストールする必要があります。

### 本設定

`git clone` して init.el を以下のように編集するだけです。

```lisp
(add-to-list 'load-path "/path/to/second-sight")
(require 'second-sight)

;; 必須ではないですが、おすすめです
(global-set-key (kbd "YOUR KEY") 'second-sight)
```

## 使い方

### 基本

以下を評価すると、ファイルの中身が記述された `posframe` が表示されます。

```elisp
(second-sight-file "filepath")
```

また、カーソルの下にファイルパスがある状態で `M-x second-sight` を実行しても `posframe` が表示されます。

```
"/pa|th/to/file"
↑ your cursor
```

`posframe` を消したい場合は、もう一度式を評価するか `M-x second-sight` を実行すればOKです。

### ivy/counsel との連携

```elisp
;; この設定が必要
(global-set-key (kbd "YOUR KEY") 'second-sight)
```

この package は部分的に [ivy/counsel](https://github.com/abo-abo/swiper) をサポートしてます。
例えば、 `counsel-find-file` や `counsel-recentf` を実行後に上記のショートカットを打つと、選択している候補のファイルパスの内容を透視できます。

## その他の活用方法

この package は `second-sight-file` という関数を提供しています。

```lisp
(defun second-sight-file (full-path)
	"Basic function to show second-sight's posframe with the file-content at FULL-PATH."
	(second-sight--show-file-safely full-path))
```

もしお気に入りのコマンド（`find-file` や `helm` 等）を対応させたい場合は、候補選択中にコレを呼び出せば `posframe` を表示できます。
例えば、`dired` はこんな感じで対応できます。

```lisp
(defun second-sight-dired ()
	"Second-sight for `dired'."
	(interactive)
	(let* ((full-path (dired-get-filename)))
		(second-sight-file full-path)))
```
暗号方式メモ

##### 共通鍵暗号方式と公開鍵暗号方式

##### 共通鍵暗号方式
![image.png](https://qiita-image-store.s3.amazonaws.com/0/301697/3bdc9622-2761-64fa-3f78-fc4a68d1365c.png)

* １つの鍵を用いて暗号化、復号を行う。
* メリットはシンプルであり、処理速度が速いこと。
* デメリットは鍵を連携する際などに、第三者に盗まれてしまうと情報漏洩のリスクが発生する。

##### 公開鍵暗号方式
![image.png](https://qiita-image-store.s3.amazonaws.com/0/301697/afc3b0c9-f1ab-a55c-001b-d787acd6a9f1.png)

※黄色の鍵で施錠したら、青色の鍵を使わないと開けることができないイメージ

* ２つの鍵を用いて暗号化、復号を行う。
* 片方の鍵で暗号化された場合、もう片方の鍵でしか復号することができない。言い方を変えると一つの鍵を誰からも盗まれなければ、送られてくるもう片方の鍵で暗号化されたデータを第三者に復号されてしまう可能性はかなり低い。
* データ受信者は送られてくるデータの情報漏洩を防ぐために、この原理を利用している。データ受信者は誰にも盗まれないように一つの鍵（秘密鍵）を管理。一方、もう片方の鍵（公開鍵）は公開し、データ送信時はその鍵にて暗号化させるようにする。もちろん公開鍵は第三者に盗まれる可能性があるが、たとえ盗まれたとしても公開鍵だけではデータ送信者から送信される暗号データを復号させることができないため、情報漏洩のリスクはほぼない。
未経験の学習記録: 2 　MVCモデルについて

# MVCモデルとは
- 「データモデル（Model）」、「画面（View）」、「ModelとViewの操作（Controller）」の３つのプログラムに分けて開発を進めていくプログラム構造のこと。

## それぞれの役割
### Model（データモデル）
- データベースから情報を取り出したり、反対にデータベースに情報を格納したりする
- 実際のデータ処理を行うところ

- データベース
    - 特定の条件にあったデータを使いやすいように整理したデータの集合体
    - 複数で共有、利用すること、と検索、加工することを目的として作られた。

### View（画面）
- ページの見た目を作るHTMLファイル
- モデルの状態を表示する所

### Controller（ModelとViewの操作）
- ユーザーの入力に基づき、ModelとViewを制御する



##処理の基本的な流れ

(![MVCモデル.png](https://qiita-image-store.s3.amazonaws.com/0/298765/3b2bface-dbeb-7de9-5fdc-c53af015e910.png)





1. ブラウザからのリクエストをサーバーが受け取り、Routesに送る
2. RoutesがURLとHTTPメソッドにマッチするコントローラーに処理を振り分ける
3. コントローラーのアクション（処理）の中にモデルに関係する記述があれば、モデルに命令を出す
4. モデルはデータベースにデータ操作の命令を出す
5. データベースは該当するデータをモデルに返す
6. モデルはデータベースから受け取ったデータをコントローラーに返す
7. コントローラーは得られた結果をViewに渡す
8. ViewはHTMLを作成し、ブラウザに表示する 


## メリット
- 3つの役割を分担することで開発も効率的に分業できる。
- それぞれのプログラムの独立性が高くなり、仕様変更に柔軟な対応ができる。
dockerの起動、停止、再起動

# docker停止
　dockerを普段利用していますが、いつもターミナルを終える時になんとなく、以下の作業を行なっていました。

```
docker-compose down
```

　しかし、最近コンテナ内で作業している時に、インストールしたはずのgemやEDITORが無いことに気づきました。
 色々と調べてみると、どうやら上記のコマンドを打つ度にコンテナが消滅しているようでした。
　

　ですので、dockerの停止は、

```
docker stop コンテナ名
```

 で、OKです。



#dockerの起動
　それでは、一度停止したdockerの起動なのですが、以下のコマンドで再び立ち上がります。

```
docker start コンテナ名
```



#dockerの再起動
　よく、gemをインストールしたあとなどに再起動が必要になる事があると思います。
以下のコマンドで再起動ができます。

```
docker restart コンテナ名
```



#dockerの状態確認
　dockerのコンテナの起動状態を見る場合は、

```
docker ps
```

　で、OKです。


ぜひ、試してみてくださいね。



参考にした記事
[@koooheiさん](https://qiita.com/kooohei/items/0e788a2ce8c30f9dba53)
[@okame_qlitaさん]
(https://qiita.com/okame_qiita/items/201ebc85b3d317364b4d)
Raspberry Pi Zero WH と シリアルUSB接続


Raspberry Pi Arduino PL2303HX内蔵USBシリアル変換ケーブルでmacとRaspberry Pi をシリアルUSB接続させる

ドライバを探す

```
$ brew search PL2303
==> Casks
homebrew/cask-drivers/prolific-pl2303
```

ドライバインストール

```
$ brew install homebrew/cask-drivers/prolific-pl2303
==> Tapping homebrew/cask-drivers
Cloning into '/usr/local/Homebrew/Library/Taps/homebrew/homebrew-cask-drivers'...
remote: Enumerating objects: 191, done.
remote: Counting objects: 100% (191/191), done.
remote: Compressing objects: 100% (185/185), done.
remote: Total 191 (delta 9), reused 46 (delta 3), pack-reused 0
Receiving objects: 100% (191/191), 78.59 KiB | 9.82 MiB/s, done.
Resolving deltas: 100% (9/9), done.
Tapped 161 casks (209 files, 288.9KB).
==> brew cask install homebrew/cask-drivers/prolific-pl2303
==> Caveats
To install and/or use prolific-pl2303 you may need to enable their kernel extension in

  System Preferences → Security & Privacy → General

For more information refer to vendor documentation or the Apple Technical Note:

  https://developer.apple.com/library/content/technotes/tn2459/_index.html

==> Satisfying dependencies
==> Downloading http://www.prolific.com.tw/UserFiles/files/PL2303_MacOSX_1_6_1_20171018.zip
######################################################################## 100.0%
==> Verifying SHA-256 checksum for Cask 'prolific-pl2303'.
==> Installing Cask prolific-pl2303
==> Running installer for prolific-pl2303; your password may be necessary.
==> Package installers may write to any location; options such as --appdir are ignored.
Password:
installer: Package name is Prolific USB to Serial Cable driver v1.6.1
installer: Installing at base path /
installer: The install was successful.
installer: The install requires restarting now.
🍺  prolific-pl2303 was successfully installed!
```

デバイス確認

```
$ ls /dev/tty.usb*
/dev/tty.usbserial
```

接続する

```
$ screen /dev/tty.usbserial 115200
```
データベースの各種情報を取得したい!!

# TODO
- [ ]  解決したコード情報を記載!!　※解説含めた補足情報も(差分書く!?)

# スキーマの全テーブル/カラム情報を取得したい!!
```sql:getALL_TAB_COLUMNS.sql
SET PAGESIZE 2000;
SET LINESIZE 200;
SET LONGCHUNKSIZE 200;
SET LONG 10000;

SELECT
    TABLE_NAME ||','|| COLUMN_NAME ||','|| DATA_TYPE ||','|| DATA_LENGTH ||','|| DATA_PRECISION ||','|| DATA_SCALE
  FROM ALL_TAB_COLUMNS TC
  WHERE OWNER='SYSTEM'
  ORDER BY TABLE_NAME,COLUMN_ID;
```
【参考サイト情報】
　◆[ Oracle ] テーブル定義情報の取得 ( ALL_TAB_COLUMNS )
　　https://hensa40.cutegirl.jp/archives/1195
　◆【Oracle】テーブルのカラム情報をSQLで取得する方法
　　https://qiita.com/riekure/items/b54c8a21d77e5fe1776d
　◆【Oracle】テーブル定義情報を確認する方法（テーブル名やカラム名、データ型で検索）
　　https://notepad-blog.com/content/90/

# スキーマの全テーブルのレコード数を取得したい!!

```sql:tryTableCount.sql
-- 案1
select table_name,
to_number(extractvalue(xmltype(dbms_xmlgen.getxml(
  'select count(*) X from '||table_name)),'/ROWSET/ROW/X')) count
from all_tables
where owner = 'schema_name' 

-- 案2
select owner, table_name,
  to_number(
    extractvalue(
      xmltype(dbms_xmlgen.getxml(
        'select count(*) c from ' || owner || '.' || table_name))
      ,'/ROWSET/ROW/C')) "count"
from all_tables
where owner in ('hoge','fufu')
order by owner, table_name; 

-- 案3
select table_name,
  to_number(extractvalue(xmltype(dbms_xmlgen.getxml(
    'select count(*) c from '||owner||'.'||table_name
      )),'/ROWSET/ROW/C')) as count
from all_tables
where owner = 'EDW'
```

これだとテーブルがありませんでエラーとなってしまうので...(失敗の原因はわかったので、後で追記)

```sql:tableCountNG.sql
SELECT
  table_name,
  TO_NUMBER(
    extractvalue(
      xmltype(
        dbms_xmlgen.getxml('SELECT COUNT(*) c FROM '||table_name))
      ,'/ROWSET/ROW/C')) count
FROM user_tables;
```

以下のPL/SQLを試してみる...

```tableCount1.sql
puts 'The best way to log and share programmers knowledge.'
DECLARE
  CURSOR c1 IS SELECT table_name, CONSTRAINT_name FROM user_constraints WHERE index_name IS NOT NULL;
BEGIN
  FOR r1 IN c1 LOOP
    SELECT r1.table_name AS table_name ,COUNT(*) AS count FROM r1.table_name;
  END LOOP;
END;
/
```
```tableCount2.sql
set echo off
set heading off
set pagesize 0
set linesize 10000
set trimout on
set trimspool on
set feedback off

set serveroutput on size 1000000

col spool_file_name new_value spool_file_name for a100
select lower(username)||'_table_count_'|| to_char(sysdate,'YYYYMMDDHH24MISS') || '.csv' spool_file_name from user_users;

spool &spool_file_name
declare
        cursor cu is select segment_name from user_segments where segment_type = 'TABLE';
        sql_stmt varchar2(200);
        cnt number(20);
begin
        for rec in cu loop
                sql_stmt := 'select count(ROWID) from '||rec.segment_name;
                execute immediate sql_stmt into cnt;
                dbms_output.put_line(rec.segment_name||','||cnt);
        end loop;
end;
/
spool off

exit
```
GCP で tensorflow 遊び5.1


[GCP で tensorflow 遊び5](https://qiita.com/makainuma/items/e178752587b4db546d37)の続き

暇なうちにちょっと実験しておく。

今までは、100ファイル1バッチにして50回学習させて次のバッチに移り、全ファイル舐めたら1ジョブ終了でジョブのたびにシャッフルしてバッチを作っていた。これを10回学習で1ジョブにして5倍のジョブを回すようにしてみる。

細かくバッチが組み替えられる代わりにファイルリードが5倍に増えて大変不利だが、よっぽど特をするようなら500ファイルを1回リードして10回学習をシャッフル挟んで5回とかやる手はある。

で、確認に実際計算してみたがこんな結果。

![CNN4_10x5.png](https://qiita-image-store.s3.amazonaws.com/0/170148/dd533c3c-78a3-1356-2189-810600dc47fd.png)

50x6 の最初の2点は 10x30 できっちり再現できているのが意味なくすごい。
そのあとは、だいたい同じくらい、という程度でしかないけれど、 50x6 の1回毎の変動の大きさを 10x30 で殺せているように見える。 50x6 の時のままだと博打すぎてちょっと提出できんのじゃないだろうか
exif.jsでタグを追加して、レンズ名を取得する方法

#はじめに
　JavaScriptを使ってExif情報を取得するときに、[Exif.js](https://github.com/exif-js/exif-js)がとても便利です。たった３行程の実装でカメラの機種やシャッタースピードなど基本のExif情報を取り出せます。
ただ、最近はレンズ情報もexifに入ってるんですが、デフォルトだとレンズ情報のタグが含まれおらず残念ながら取り出せません。（issueで上がってるので近々対応しそうではありますが。。）
　レンズ情報を取る方法がないか調べてたら、Exifのタグ情報を追加することで取得できたのでメモにしておきます。

#準備
### Browsersyncインストール
htmlとjsファイルだけで実行しようとするとCORSエラーがでるので、Browsersyncを使います。

インストールはこちらを参照
https://tech.medpeer.co.jp/entry/2015/06/09/071758

なお、chromeのセキュリティーポリシーを回避する方法もあるので、そちらの方法でもOKです。

# 実装

```index.html
<img src="image1.jpg" id="img" />
<pre>Make and model: <span id="lens"></span></pre>
```
EXIF.getDataの前に、EXIF.Tagsにtagを追加します。


``` sample.js
window.onload=getExif;

window.onload=getExif;

function getExif() {
    var img = document.getElementById("img");
    EXIF.Tags[0xA433]="LensMake"; // tagを追加
    EXIF.Tags[0xA434]="LensModel"; // tagを追加
    EXIF.getData(img, function() {
        var make = EXIF.getTag(this, "LensMake");
        var model = EXIF.getTag(this, "LensModel");
        var makeAndModel = document.getElementById("lens");
        makeAndModel.innerHTML = `${make} ${model}`;
        debugger;
    });
}
```

index.htmlを開くとレンズメーカーとレンズ機種が表示されます。
Warning: git 2.18.0 is already installed and up-to-date

```
$ brew update
Warning: git 2.18.0 is already installed and up-to-date
To reinstall 2.18.0, run `brew reinstall git`
```

Command Line ToolsをインストールすればOK

```
$ xcode-select --install
xcode-select: note: install requested for command line developer tools

$ brew update
Already up-to-date.
```
環境遅延変数の原因と2つのポイント

#概要

最近、for文でがっつりはまりました。。。

以下のfor文はファイルの中身を1行ずつ読み取り、
full_nameをechoするもの。この例センスない...
hoge.txtの中身は
![image.png](https://qiita-image-store.s3.amazonaws.com/0/351623/61820f85-ed6c-eb08-eeb3-a84264c9db70.png)



```read.bat
@echo off
set name=hoge
for /f %%a in (hoge.txt) do (
    set full_name=%%a%name%
    echo %full_name%
)
```
これを実行すると、以下のような結果となります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/351623/2140ba05-b854-8f6a-7f96-1840cd292b2d.png)

このメッセージ「ECHOはOFFです。」はECHOした変数が初期化されているときに出力されるメッセージです。
つまり、変数full_nameは初期化状態のまま、出力されているということになります。
これが謎でした...

#原因
この原因は、`変数を読み込むタイミング`が問題でした。
**%で囲まれた変数はその行の読み始めで展開される**
**()で囲まれたコマンドは1行とみなされる**
のです。まじ謎。
つまり、何度for文を回そうとも、full_nameが初期化状態でechoされていたのです。

#環境遅延変数
これを解決するのが、`環境遅延変数`です。
環境遅延変数とは、変数を読み込むタイミングを遅延させることができる変数で以下のように表します。

1.  **変数を%で囲わず、!で囲む**
2.  **setlocal enabledelayedexpansionを書く**

修正したread.batはこちら

```read.bat
@echo off
setlocal enabledelayedexpansion

set name=hoge
for /f %%a in (C:\work\hogehoge\hoge.txt) do (
    set full_name=%%a%name%
    echo !full_name!
)

```

実行結果は以下のようになり、full_nameが変更されて出力されています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/351623/d02edd49-5b63-35b3-4790-8ee4c0eb464f.png)

##まとめ
通常、変数を読み込むタイミングは
**その行の読み始めで、()で囲まれたコマンドは1行とみなされる**

環境遅延変数を用いれば、このタイミングを直前に変更でき、その方法は
**1. ()で囲まれたコマンドは1行とみなされる**
**2. setlocal enabledelayedexpansionを書く**
7日目: Generating Synthetic Time Series to Augment Sparse Datasets

# Generating Synthetic Time Series to Augment Sparse Datasets 要約
## 読んだ論文
Generating Synthetic Time Series to Augment Sparse Datasets
Germain Forestier, François Petitjean, Hoang Anh Dau, Geoffrey I. Webb, Eamonn Keogh 
https://germain-forestier.info/publis/icdm2017.pdf
https://ieeexplore.ieee.org/document/8215569/authors#authors
上記の論文を読んだので簡単にまとめます． 2017 IEEE International Conference on Data Mining (ICDM)で発表されているようです．PDFは筆頭著者さんの個人サイトで公開されていました．昨日読んだ論文[Data augmentation using synthetic data for time series classification with deep residual networks](https://qiita.com/himatya/items/97b35eb6d1b847996876)の第二著者の人ですね．

## 3行でまとめる
- 時系列分類問題におけるデータ拡張手法を提案する．昨日読んだやつの先行研究の様子．
- おなじみUCR公開データセットで評価して有用性を示した．

## 前提知識
### DTW (Dynamic Time Wrapping)
- DTWは2つの時系列の類似度を示す指標である．
 - 例えば，シンプルにMSEなどを考えると同じ長さの時系列でないといけなかったり，位相のズレに弱かったり，周波数のズレに弱かったりと時系列にマッチしていない．なので各時系列の各要素すべての組み合わせで距離を算出し，各要素対の最短となるパスを考えることで時系列間の類似度とするのがDTWな様子．
- [こちらのブログ](http://sinhrks.hatenablog.com/entry/2014/11/14/232603)の説明と可視化がとてもわかり易いのでおすすめ．

### DBA (DTW Barycenter Averaging)
- DBAは複数の時系列データから平均的な時系列データを算出する方法である．
- DTWの過程で算出した距離マトリックスを利用して時系列の平均を算出する．
 - とある時系列を初期値として選択し，その他の時系列とのDTWを算出する．
 - DTW算出過程で得られる要素間の対応を元に，各要素が重心となるように更新する．
 - 上記を収束するまで繰り返す．
- [こちらのブログ](https://y-uti.hatenablog.jp/entry/2016/01/10/200944)の説明がわかりやすかったです．

上記の前提知識を踏まえて本論文の提案手法を確認しましよう．

## 提案手法
### 重み付け
1. 長さが異なる時系列データセット$D={T_1, T_2, ... T_N}$を考える．
2. $D$の中からとあるクラス$C1$に属する時系列サブセット$S_{C1}$を取り出し重み付け平均$\bar{T}$を算出する．
3. $\bar{T}$を生成データとして$D$に追加する．

※データの多様体を表現できるように重みを算出することが本稿の貢献らしい．

ここで$\bar{T}$は以下の式で与えられる．
$argmin \bar{T} \in E \sum_{i=1}^{N}DTW^2(\bar{T}, T_i)$
※個人的にこれは$\bar{T} = argmin_{\bar{T}}( E \sum_{i=1}^{N}DTW^2(\bar{T}, T_i))$という意味じゃないかなと思っているんですがいかがでしょうか．．．
即ち，与えられた時系列データセットそれぞれに対してDTWの二乗和が最小となるような$\bar{T}$を求める．ただ，これを探索的に最適化しなければいけないので，本論文では$\bar{T}$の算出にDBAを使用する．
今回は重み付きでこれを算出するため，上式の各DTWに$T_i$に対応する重み$w_i$を掛け合わせる．

### 重み決定方法
1. **Average All (AA)**：　全ての入力時系列を用いて重み付け平均を求める方法．ただし多様性を生み出すために全ての時系列に異なる重みを割り当てる．
2. **Average Selected (AS)**：　一部の近い入力時系列を用いて重み付け平均を求める方法．最初にランダムに一つ時系列を選択し0.5の重みを与え，その近傍5つから2つをランダムに選択し0.15の重みを割り当てる（あれ，この手法昨日読んだ論文と同じだぞ）．残った0.2の重みを残った時系列で分配する．
3. **Average Selected with Distance (ASD)**：　ASをベースに，近傍を選択した際に距離を考慮した手法．

## まとめ
- 時系列データの拡充手法として，Weighted DBAを提案した．
- （昨日の論文は本稿の発展として，ResNetとアンサンブルResNetを使って評価した点が新規性だったのかもしれない．）

## 所管
本日はなんだかんだ2時間くらいかかってしまいました．しっかり理解しようとするとどうしても止まってしまいますが，本論文の一段落を読み込んで止まっているよりは，さっさと次を読んだり，むしろ周辺知識や関連研究を軽く流したりしてから再読したほうが理解が進見ます．ちなみに本稿の更に第二著者の方がDBAの発案者なようですね．
よーくお目にかかるエラーに関するオススメサイト

プログラミング初学者です。
エラーってよくでますよね。
エラー内容を調べることは沢山あります。
そのエラーが一体何を伝えようとしているのか大まかにでも分かれば解決への前進だと思います。
だから、定番エラーのことをわかりやすく伝えているサイトを載せようと思います。

まずは、
##500エラー
これは、内部エラーと呼ばれている。
原因はファイルの置き場所が悪かったり、単純なプログラムミスもある。
そんな原因を色々教えてくれているサイトがこちら！
**https://www.sejuku.net/blog/77760**
※PHPの500エラーとは書いてありますがどの言語でも共通しているエラーなので大丈夫！

##404エラー
これはリクエストしたページがなんらかの理由（サイトが消されてる、URLの打ち間違い等）で存在しなかった時によく出るエラー。
そんな存在しない理由の例をあげてくれているサイトはこちら！
**https://seolaboratory.jp/92739/**

##400エラー
これはWEBブラウザがサーバーに理解できないことを無理に要求している状態の時にでちゃうエラー。
ちょっとめんどくさいイメージ。
このエラーのイメージを掴むにはこちら！
**https://wa3.i-3-i.info/word1490.html**
このサイトは本当に初学者の味方ですよね。

##一番よく見るエラー集
**①　java.lang.NullPointerException
②　java.lang.ArrayIndexOutOfBoundsException
③　java.lang.NumberFormatException
④　java.lang.ClassCastException
⑤　java.lang.ArithmeticException
⑥　java.lang.NoClassDefFoundError
⑦　java.lang.OutOfMemoryError**

こいつらは一気にまとめてこちらのサイト！！
**https://eng-entrance.com/java-basic-error**
わかりやすく概要が説明されていてなんどもお世話になっているこのサイト。
解決の糸口が見えてくるはずです。


#結局エラー解決になにが大事なのか？
それはやっぱり**エラー文を読む**ことですよね。
どのサイトでもみんな口を揃えて言ってる。
みんなわかってるけど億劫になって読まない。
でも、読むところって意外と１〜２行だったりするので僕も含めて勇気持って読みましょう。
Node-RED 0.20の新機能　その４

3/12(日本時間だと3/13)にNode-REDの0.20がリリースされました。

せっかくなので[Node-REDのブログ](https://nodered.org/blog/)に投稿されている[Version 0.20 released](https://nodered.org/blog/2019/03/12/version-0-20-released)の内容を試してみようと思います。

[その１の記事はこちら](https://qiita.com/kazsharp/items/43878eabe57d9d752bdb)
[その２の記事はこちら](https://qiita.com/kazsharp/items/a4e6b55bf6dc2d89b7a6)
[その３の記事はこちら](https://qiita.com/kazsharp/items/c9e7303d3c2b15cde246)

##Subflow Instance properties
[前回](https://qiita.com/kazsharp/items/c9e7303d3c2b15cde246)、サブフローテンプレートでの環境変数の設定を試してみましたが、今回はサブフロー**インスタンス**での環境変数の設定を試してみます。
サブフローインスタンスとは普通のフロー内に置かれたサブフローのことです。
![subflow-instance1.png](https://qiita-image-store.s3.amazonaws.com/0/100799/7b179503-bc45-b33f-414c-aeb0e6693d56.png)
上図は前回作ったサブフローを使ったフローですが、この真ん中のサブフローがサブフローインスタンスです。
このサブフローインスタンスをダブルクリックするとサブフローインスタンスの編集ダイアログが表示されます。
![subflow-instance2.png](https://qiita-image-store.s3.amazonaws.com/0/100799/3e889920-b96a-418a-aa7b-2b5b6a86b1ed.png)
そしてサブフローインスタンの編集ダイアログを見ると、サブフローテンプレートで設定した ```ENV1``` という環境変数がすでに設定されていることがわかります。
ここで「追加」ボタンをクリックすることでサブフローテンプレートでは設定されていない環境変数を追加することができます。
![subflow-instance3.png](https://qiita-image-store.s3.amazonaws.com/0/100799/af6ca80a-5205-2293-de8c-15ecca356009.png)
また、この画面をよく見るとサブフローインスタンスで追加した環境変数( ```ENV2``` )は変数名も値も変更できるのに対して、サブフローテンプレートで設定した環境変数( ```ENV1``` )は値のみ編集できることがわかります。さらに、 ```ENV2```の方は「×」ボタンが右端にあり削除可能なのに対し、 ```ENV1``` の方は削除不可なのもわかります。
要はサブフローテンプレートで設定した環境変数**自体**を変更することはできないということです。
ただ、サブフローテンプレートで設定した環境変数もその**値**は変更できます。
![subflow-instance4.png](https://qiita-image-store.s3.amazonaws.com/0/100799/0743b670-5be3-a4a3-a7b8-55c7f26a8dd2.png)
これは、サブフローテンプレートで設定した環境変数の値をサブフローインスタンス毎に変更できるということで、何かに使えそうな機能に思えます。
そしてサブフローテンプレートの環境変数の値を変更した場合、右端に「デフォルトに戻す」ボタンが表示されます。
このボタンをクリックするといつでもサブフローテンプレートで設定された値に戻すことができます。

以上、サブフローインスタンスでの環境変数の設定でした。