OmniAICreator/Qiita-1.07M huggingface dataset:
git add, commit, pushをまとめてコードをこまめに保存する方法

「コードを書いていたけど、突然PCがフリーズしてデータが消えてしまった...」
「間違えてファイルを削除してしまった...」など、想定外の事故でコードを失うことはよくあると思います。

そこで便利なのが、gitを使いコードを保存しておくことです。

## git add, commit, pushをまとめてコードをこまめに保存する方法

`.bash_profile`または`.zshrc`
の末尾に`alias save="git add . && git commit -a -m 'save' && git push"`
を使いしてターミナルを再起動して下さい。
これにより、`save`コマンドだけで簡単にコードのバックアップをすることが出来ます。

### チーム開発では使用に注意しよう
この`save`コマンドは、コミットメッセージが`save`のみのコミットを作ります。
個人開発の時なら問題ありませんが、チーム開発をしている場合は混乱をもたらす可能性があるので注意してください。
## 終わりに
私は現在、Web3のサービスの開発をしています。詳しくはこちらの記事をご覧下さい。
        [無料でイーサリアムが当たる、Web3時代の寄付サイトを作った話](https://note.com/kenroda/n/n814347fbdcd7)
API GatewayのLambda統合で嵌った話

今まで仕事でLambdaを触っていたけど、自宅で一から作ろうとしたら嵌ったので、その時の話を書いていきます。

仕事の記憶を頼りに、次のようなLambdaハンドラと`serverless.yml`を書きました。ごく単純なPOSTメソッドで、リクエストボディから`param`という値を取り出します。

```python:handler.py
def handle_request(event, context):
    body = event.get('body')
    param = body.get('param')
    # 以下省略
```
```yaml:serverless.yml
functions:
  sample:
    handler: python:handler.handle_request
    events:
      - http: post sample
```

早速リクエストを送ってみると、`502 Internal server error`が返ってきて、Lambdaのログには以下のエラーが出ていました。

```
[ERROR] AttributeError: 'str' object has no attribute 'get'
Traceback (most recent call last):
  File "/var/task/handler.py", line 22, in handle_request
    param = body.get('param')
```

あれ、おかしいな。仕事の時は`body`から`get`するだけでパラメータを取得できていたのだが…。

で、調べてみると、**Lambdaプロキシ統合**が関係していることが分かりました。

![Lambdaプロキシ統合.png](https://qiita-image-store.s3.amazonaws.com/0/269194/bc860d4e-44b4-4156-5122-ef4cc5be4fa9.png)

今までほとんど意識していませんでしたが、これを使用するとAPI GatewayがLambdaへうまい感じにリクエストパラメータ等を渡したり、Lambdaからのレスポンスを処理したりするようです。

ただし、リクエストボディはJSON形式ではなく文字列に変換されてしまうとのこと。Lambdaプロキシ統合を使用しないとJSON形式で扱えたので、この点だけは若干不便な気がします。

```yaml:serverless.yml
functions:
  sample:
    handler: python:handler.handle_request
    events:
      - http:
          path: sample
          method: post
          integration: lambda
```

このように書くと、Lambda統合はされますが、Lambdaプロキシ統合は使用されません。仕事ではこうしていたから`get`だけでうまく行ったんだな。週明けに直さなきゃ！
Pass-The-Hashの仕組み

1. NTLM認証の仕組み
---
- Windowsの仕組みとして、SAM(Security Account Manager)データベースにパスワードのハッシュ値（LMとNTLM）が保存されている。
    - SAMデータベースの実体はファイルであり、C:\WINDOWS\system32\configの中に保存されている。
    - 通常、Windows起動中に開いたりコピーできないようになっているが、ツールを用いることによりハッシュ値をダンプできる。
        - 正しくは直接アクセスできないため、DLL Injectionという手法を用いて、SAMファイルへのアクセスを許可された特殊なプロセスからハッシュを取得する。
            - PwDump
            - Ophcrack
- http://www.byakuya-shobo.co.jp/hj/moh3/pdf/moh3_p174_177.pdf
- http://d.hatena.ne.jp/softether/touch/20130821/p1

2. LSA
---
- LSA (Local Security Authority)は、Windowsのセキュリティに関するサブシステムであり、ユーザーの資格情報を管理しており、メモリ上にパスワードハッシュなどを保持している。
    - これらの情報の窃取を防ぐために、LSAの保護モードを有効化することができる。
    - https://blogs.jpcert.or.jp/ja/2016/09/lsa_protect.html
- lsass.exe
    - Local Security Authority Subsystem Service
    - ユーザーアカウントの管理やログオン認証を実施している。
    - https://wa3.i-3-i.info/word13468.html

3. mimikatz
---
- 実行には管理者権限が必要である。
- Windowsの仕組みを利用し、ハッシュ値等をダンプする。
    - ダンプする際のソースはいくつか指定することができる。
        - SAM
            - mimikatz # lsadump::sam
        - LSA
            - mimikatz # lsadump::lsa /id:<ID_NUM>
        - dcsync
    - https://github.com/gentilkiwi/mimikatz/wiki/module-~-lsadump
- https://www.iij.ad.jp/dev/tech/techweek/pdf/171108_02.pdf

4. Pass-The-Hash
---
- Windowsの仕組みを利用した手法。
- NTLMハッシュ等を活用する。
シェルを使ったデータ前処理のメモ

## cut
デリミタ(区切り文字)を指定して、csvから特定の列のみを抜き出すことができる。
`cut -d デリミタ -f 列番号` 
e.x. 

```bash 
# csvの2列目を抜き出す
cat timestamp.csv| cut -d, -f2 > timestamp_edited.csv
```

## sed
`-i: ファイルを上書き編集`
`1d`: 1行目を削除
`1-5d`: 1行目から5行目を削除

```sh 
# テキストファイルの先頭を削除
sed -i '1d' timestamp.csv
```

## awk
`awk -F デリミタ -v awk内変数名=値 'grep条件 BEGIN{初回処理} {行ごとの処理} END{終了時の処理}'`
(BEGIN,ENDは省略可能)
`$0`: 現在の行の文字列
`$2`: 2つ目のフィールドの文字列
`NR`: 現在の行番号
`NF`: フィールド個数
  - `$NF`: 最終フィールドの値

```sh
## 3つのフォルダで、内部のファイル数を合わせる
# ファイルが一番少ないディレクリでのファイル個数を取得
min_num=$(for i in 1 2 3; do ls dir$i | wc -l ; done | awk 'BEGIN{i=9999999} {if(i>$0)i=$0} END{print i}')
# 多いファイルを削除
cd dir1
ls | awk -F '[e.]' -v min_num=$min_num '$2>=min_num {print $0}' | xargs rm
cd ../dir2
.
.
```

```sh
# ファイルの行数を変更
cat timestamp.csv | awk -v min_num=$min_num 'NR<=min_num {print $0}'> timestamp.txt
```

## Ruby
Rubyでも`-nlaF"[ ]+"`をオプションにつければ、ほとんどawkと同じような使い方ができるらしい。
参考: https://seesaawiki.jp/w/kou1okada/d/Ruby%20-%20AWK%20%A4%AB%A4%E9%A4%CE%B0%DC%BF%A2
関数名のこだわりどころを考えた

先日twitterのTLでこんなのが流れてきて、
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">名前は重要です！ <a href="https://t.co/cMvUdV7LpY">pic.twitter.com/cMvUdV7LpY</a></p>&mdash; ビタワン🐕社畜ちゃん連載中【漫画を毎週日曜に投稿】 (@vitaone_) <a href="https://twitter.com/vitaone_/status/1101386027111870464?ref_src=twsrc%5Etfw">March 1, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

それに対する返信として
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">start/endとbegin/endとか対応する単語をどちらにすべきか？論で2,30分話したことならありますよ！</p>&mdash; お料理エンジニアわかめ (@namawakame) <a href="https://twitter.com/namawakame/status/1101388604637556736?ref_src=twsrc%5Etfw">March 1, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 

というツイートを見たのですが…

どんな言語でどんな機能が前提なのか、そこまで詳細はわからないですが、かつてC++が主戦場だった自分としては

| メソッド名|期待される機能|
|:-:|:-:|
|start/stop|何らかの処理の開始、終了|
|begin/end|イテレータの先頭、終端|

という対応関係を（無意識のうちに）期待してしまいました。
特にbegin/endの方。

個人的には命名規則は各プロジェクトごと、あるいは各社内ごとに決めといてくれればそれに従いますよー（キャメルケース・スネークケースも大してこだわりなく…）という雑なスタンスなんですが、この手の「標準的に使われている一般的な名前」については実用的な意味で言語標準に従うような機能を実装したほうが好ましいと考えています。

なぜそのほうが好ましいかというと、標準で用意されるアルゴリズム等がそういった標準的な機能を期待した作りになっており、新規に作成するクラスもそちらにそろえることによって「既存の機能を利用できるようになる」から。

そもそも、メソッド名とそれに付随する「期待される挙動」がそろってこそ、オブジェクト指向における多態性を生かせると思っているので、決める際はそのあたりを意識した命名規則を採用してほしい…
テンプレート化もしやすいし。

そんなことを思ってつらつら書いたQiita初投稿ポエムでした。
今後ともよろしくお願いします。

※ちなみにstart/stopの方についてはC++というよりもsystemdなどの起動・停止機能をイメージしました。
※元ツイートはstart/endとなっていましたが、startの対はstopかなあ…
停止,同期中のTomcatの開始ができない

タイトル通り停止,同期中のTomcatを開始しようとした際
「ローカル・ホストのTomcat v.7.0ポートでいくつかのポート(8005,8080,8009)がすでに使用中です。このサーバー・・・」メッセージが出て開始できないエラーがでました。

どうもtomcatのbinの階層下のshutdown.batを実行すればよいとのことなのですがshutdownはあるものshutdown.batがみつからず。

エクリプス再起動しても改善しなかったので結局パソコン再起動で解決しました。

なんとも雑な解決法ですが、Qiitaに投稿し始めるきっかけが欲しかったのでご容赦ください！

[追記]
後日Tomcatworkディレクトリをクリーンした後通常のクリーンをして開始すると
エラー解消できました。
rsyslogdのエラー（Too many open files）について

1. 概要
---
rsyslogdプロセスのファイルディスクリプタ数が設定値を超えた場合、ローカルファイルへの書き込みなどができなくなってしまう。
主な原因として、rsyslogdプロセスにおいてログをTCPで受け取っている場合、ログの送信元と送信先の経路上にあるFWなどが勝手にセッションを破棄してしまい、ハーフコネクション状態に陥るためである。
要するに、FWが勝手にそのセッション（サーバ間ではコネクション）でパケットのやり取りが発生していないため、ドロップしてしまう。
TCPの状態遷移や実装に関する情報は以下を参考にさせていただきました。
[TCP/IP通信の状態を調べる「netstat」コマンドを使いこなす (1/2)](http://www.atmarkit.co.jp/ait/articles/0207/20/news003.html)
[net.ipv4.tcp_tw_recycle は廃止されました ― その危険性を理解する](https://qiita.com/tmshn/items/b49f1b51bfc472968b30)  

2. TCPスタックの実装に関する設定
---
特にプロセス側の設定をしていなければ、カーネルの設定を利用する。
まずはカーネルの設定を確認する。

```sh
[root@vps ~]# sysctl -a | grep net.ipv4.tcp
# keepaliveパケットを送信するまで待機する秒数
net.ipv4.tcp_keepalive_time = 7200

# keepaliveパケットを送信し、応答がない場合の継続して送信する回数
net.ipv4.tcp_keepalive_probes = 9

# keepaliveパケットを送信し、応答がない場合の次のパケット送付まで待機する秒数
net.ipv4.tcp_keepalive_intvl = 75

# FIN-WAIT2 から TIME_WAIT に状態が変化するまでの時間
net.ipv4.tcp_fin_timeout = 60

# TIME_WAIT状態のソケットを新しい接続に対して安全に再利用
net.ipv4.tcp_tw_reuse = 0
```

3.対処
---
ここでしっかりと考えないといけないこととして、rsyslogdプロセスで受信している方において
FIN-WAIT_1の場合、net.ipv4.tcp_tw_reuse=1にしたとしても、そもそもFIN-WAIT_1であるから
対処となっていない。この場合は、FWにおけるセッションタイムアウトの時間を長くするか
rsyslogの設定において、keepaliveに関する設定をするかである。
現実的な解としては、後者のrsyslogの設定にkeepaliveに関する設定をすることである。  

## rsyslogにおけるkeepaliveに関する設定
rsyslogの[公式ドキュメント](https://www.rsyslog.com/doc/v8-stable/configuration/modules/imtcp.html)を参考に設定。  

```sh
$InputTCPServerKeepAlive on
$InputTCPServerKeepAlive_probes 5
$InputTCPServerKeepAlive_time 60
```
TypeScriptでインタフェースに余計な属性があっても受け取れるようにする

関数fは、オブジェクトを引数にとります。オブジェクトには、a、bというプロパティがあります。コードにするとこんな感じですね。

```ts
interface P {
  a: string;
  b: number;
}

function f(p: P) {
}
```

この時に省略可能にするには、 ``?`` を使えばOKですよね。これはTypeScriptを使っているだいたいの人は知っていることかと思います。

```ts
interface P {
  a: string;
  b?: number;  // bは省略可能
}
```

逆に、余計な要素が入っていても問題ないようにするにはどうすればいいでしょうか？2つ方法があります。

# インタフェース側に手を加える方法

オブジェクトを汎用のMapがわりに使う記法を使うというのがその1つです。これで、Pには何を入れることもできます。そのため、エラーとはならなくなります。

```ts
interface P {
  a: string;
  b?: number;
  [extraProps: string]: any; // これでどんな属性も受け取れるようになる。
}

function f(p: P) {
}
```

欠点が1つあります。オプションの属性として型定義するときに、余計な属性が入っていると、ユーザーからすると「これはなんだろう？」と疑問を覚えるポイントになるでしょう。これはどんな意味があるのか、どういう影響を与えるのか。コメントが必要になるポイントな気がします。

# 関数側に手を加える方法

もう一つは関数宣言の方でインタフェースの継承とジェネリクスでなんとかする方法もあります。

```ts
// こっちは変更なし
interface P {
  a: string;
  b?: number;
}

function f<P2 extends P>(p: P2) {
}
```

これ、何をしているかというと、未知の型P2を受け取る、という宣言です。P2はPを継承した型です。Pは外で宣言されているもので、属性はすでにわかっています。P2はPを継承しているので、Pが持っている属性はすべて得られる。なおかつ、P2独自の何か特別な属性を持っているかもしれない、という感じの宣言になります。ようするに、Pを内包するものなら受け取れる、ということで、今回のケースではうまく当てはまります。

欠点が2つあります。

dtslintという純正ツールがno-unnecessary-genericsというエラーを出してきます。なので、このツールが必須のDefinitelyTypedにPRを送る時には使えません。

もう一つは、デフォルト引数の分割代入と一緒に使えない点ですね。

```ts
// error TS2322: Type '{ a: string; }' is not assignable to type 'P2'.
function f<P2 extends P>(p: P2 = { a: "" }) {
}
```

``p?: P2`` と書けばいけるので、デフォルト値の処理を手書きすればなんとかいけますが・・・

# どちらがいいの？

どちらも、省略可能な属性のスペルミスをすると気づけない、という欠点は残ります。で、それ以外の要素を見比べた時にどちらがいいのか？というと、基本的には後者の方が筋がいいように思います。

というのも、今回は「余計な要素が入った時も関数で受け取れるように柔軟にしたい」というのが関心ごとです。前者では、引数の情報そのものが増えたという意味になりかねません。ただ、属性は増えてません。なので、可能なら後者一択ですね。ただ、可能じゃないこともあるので、ダメなら前者にフォールバック・・・ですかね。
java Optionalの使い方について 


# Optionalの宣言方法

Optionalを使用するには型をラップして使う

```
Optional<String> opt1;
```
自作クラスでも同様

```testClass.java
public class testClass
{
	private String no;
	private BigDecimal val;
}
```

```
OPtional<testClass> opt2;
```

# 使い方

optional型に値をいれるにはoptional.of か optional.ofNullableを使用する。

```
Optional<String> opt1 = Optional.of("test");
```

ただ、optional.ofは引数がnullの場合Exceptionが発生するので注意。

```
Optional<String> opt1 = Optional.of(null);
```

よって、optional.ofNullableを使用する。

```
Optional<String> opt1 = Optional.ofNullable("test");
Optional<String> opt2 = Optional.ofNullable(null);

testClass test = new testClass();
Optional<String> opt3 = Optional.ofNullable(test);
```

# 値の取り出し方

値を取り出すには、以下を使用する。
get       : nullの場合、Exception発生
orElse    : null出ない場合変数値、nullの場合orElseの引数を返却
orElseGet : null出ない場合変数値、nullの場合,suppelierの結果を返却

```
String val1 = opt1.get();
String val2 = opt1.orElse("")
```

自作クラスから値を取り出すときは、以下を使用してフィールドを取得できる。
map

```
String val1 = opt3.map(testClass::getNo).orElse("1");
String val2 = opt3.map(v -> v.getNo()).orElse("2");
```
AWS Cloud9がConnecting...の画面から抜け出せたので解決方法まとめました。

# 環境
Macbook pro(2013年モデル)
macOS Mojave
AWS Cloud9使用
# 状況
つい先日まで普通に使っていたCloud９が**Connecting...**から動かなくなっていました。特に何かを動かした訳ではないはず...と思いながらも、色々調べてたら解決できたのでその方法書いておきます。
#解決方法
1. まず、AWSのホームへ行き、"EC2"をクリック。
<img width="1280" alt="スクリーンショット 2019-02-28 20.19.18.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/342439/06756746-b4e0-cf8a-1501-c2f989934d77.jpeg">
2. "実行中のインスタンス"をクリック。
<img width="1280" alt="スクリーンショット 2019-02-28 20.24.35.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/342439/b1875dd1-0344-f605-54b1-fd2cc40ea630.jpeg"> 
3. インスタンスの状況がrunningになっていることを確認し、"停止"させる。
<img width="1280" alt="スクリーンショット 2019-02-28 20.28.51.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/342439/bffb168c-257e-47b5-dc21-e5ca9888ba3f.jpeg">
<img width="615" alt="スクリーンショット 2019-02-28 20.49.02.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/342439/fd8ea4a5-b749-df6b-a37d-8f53d5a16388.jpeg">
4. それだけでは、停止せず、runningの状態に戻ってしまうため、もう一度"停止"し、"強制停止"を実行。
<img width="1280" alt="スクリーンショット 2019-02-28 20.41.37.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/342439/7a2dddae-aae3-49e9-74db-5b277d8c1a7a.jpeg">
<img width="747" alt="スクリーンショット 2019-02-28 20.41.52.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/342439/05664300-43b8-c5f3-f0f8-89d7930b5015.jpeg">
5. インスタンスの状況がstopped担っていることを確認し、"開始"をクリック。
<img width="1280" alt="スクリーンショット 2019-02-28 20.42.52.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/342439/5246b1ad-5e31-018f-4f31-7e818cb5c56b.jpeg">
<img width="617" alt="スクリーンショット 2019-02-28 20.44.15.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/342439/099702de-5554-463d-228b-d7b66b0ed7c8.jpeg">
以上で、再開できました！
プログラミング初心者の僕がやってしまった失敗まとめ

初めまして！
未来電子テクノロジー(https://www.miraidenshi-tech.jp/intern-content/program/)
でインターンをしているodattiです。
プログラミングを始めて2週間ほどになります。

初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正しますので、どんどん指摘してください！

今回は、プログラミング駆け出しの僕がやってしまった失敗を、自戒の念も込めてまとめてみました(笑)
僕と同じように、プログラミング初心者の方の参考になったら幸いです。

#"/"を入力し忘れる
私が学習しているのはHTMLとCSSなのですが、タグを囲む際、"/"をつけ忘れてしまうことがあります。
エラーが出ることは出るのですが、具体的に何が間違っているのかはわからないので、これも原因がわからずに止まってしまう要因の一つです。

#classの概念を理解できていない
これは個人差があると思います。
学習する言語によっても形式が異なるかと思います。
HTMLとCSSの場合、class名を指定する際に先頭に"."を付ける必要があります。
どれがclassでどれがclassに属していないか、確認しながら進めずに止まってしまいました。

#スペルミス
この類のミスは、初心者に限らず多いのではないでしょうか？
僕は、"height"と入力するべきところを"hight"と入力していて30分ほど頭を抱えていた経験がありました…悲しい…
他にも。"selected"や"color"など、いかにも間違えやすそうな単語がたくさん出てきます。
ミスがないかを逐一確認しながら進めることが大切だと思っています。

#おわりに
どのミスにも共通して言えることは、「自分のミスは自分で発見しなくてはならない」ということです。
問題解決のための粘り強さが必要だということを、プログラミングから教えられている気がします。
学習効率を上げていくためにも、一つ一つのコマンドをよく見て、ここでまとめたような初歩的なミスを極力減らしたいものです。

以上、簡単ではありますが失敗例をまとめました。
App Links実装手順

# App Links実装手順

## App Links Assistantに従って設定
1. 「Tools」の「App Links Assistant」を選択する。
2. 「App Links Assistant」の画面が出ます。
3. ①~④のステップをやっていきます。

### ①Add URL intent filters
* 「App Links Assistant」の「Open URL Mapping Editor」をクリックする。

#### URL Mapping Editor
1. 「Host」にドメインを記述する。
2. 「pathPattern」にドメイン以降のパスを記述する。
3. 「Activity」に上記のパスでアプリが起動した際に、どのActivityを開くかを指定

```
例）
1. Host ->「https://s-nkmr.github.io」
2. pathPattern -> 「/AppLinksTest/」
3. Activity -> 「.MainActivity」
```

4. 「Check URL Mapping」でURLをマッピングできるか確認<br>
「This URL maps to []指定したActivity]」になっていればOK

```
例）
4. Check URL Mapping ->「https://s-nkmr.github.io/AppLinksTest/」

   This URL maps to .MainActivity(app)
```

### ②Add logic to handle intent
* 「App Links Assistant」の「Select Activity」をクリックする。

#### Select an Activity
1. URLで起動するActivityを選択
2. 「Insert Code」をクリック
3. 自動的にコードが生成される
4. 利用用途に応じて、その後の処理を記載


### ③Associate website
* 「App Links Assistant」の「Open Digital Asset Links File Generation」をクリックする。

#### Associate website
1. 「Site domain」に先ほど指定したドメインが入っているかを確認<br>
入っていなければ修正する。
2. 「Application ID」に自分のアプリのパッケージ名が入ってることを確認する。<br>
入っていなければ修正する。
3. 「Signing config」または「Select keystore file」を選択する。
  * 「Signing config」はデバッグ用<br>
  「debug」を指定する。
  * 「Select keystore file」はリリース用<br>
  APK作成時に使用するjksファイルを使用する。

```
例）
3. 「Signing config」 ->「debug」
```

4. 「Generate Digital Asset LInks file」をクリックする。
5. 「Preview」に「SHA256」などの情報が表示される。
6. 「Save file」をクリックし、「assetlinks.json」ファイルをわかりやすい場所に保存する。
7. サーバーに「assetlinks.json」ファイルを配置する。<br>
ファイルの置く場所は「To complete associating your app with your website, save the above file to [サーバーでファイルを置く場所]」に表示されている。

```
例）
7. To complete associating your app with your website, save the above file to To complete associating your app with your website, save the above file to https://s-nkmr.github.io/.well-known/assetlinks.json
```

8. 「Link and Verify」をクリックして、下記の2点がチェック入っていたらOK
  * 「Added auto Verify to intent filter elements.」
  * 「Success! Tour app is associated with selected domain(s).」

### ④Test on device or emulator
* 「Test App Links」をクリックする。

#### App Link Testing
1. 「URL」にテストしたいURLを入力する。<br>
```
例）
1. URL ->「https://s-nkmr.github.io/AppLinksTest/」
```
2. 入力後「Enter」キーを押下すると「Select Device Target」画面がでる。<br>
出ない場合は「URL」を見直す。
3. 実行したい実機またはエミュレータを選択する。
Webビーコン入りドキュメントを作成してみる

近年標的型メールが大いに騒がれているなか、各社で標的型メールの訓練ということで
様々な工夫がこなされてます。そのなかで、技術的な側面としてWebビーコン入りドキュメントを作成し、
簡単な標的型メールの訓練用ツールを作成してみます。

1.ドキュメントを作成してみる
---
HTMLタグだけを記入したHTMLファイルを作成したのち、MicrosoftWordで開く。
開いたら「上書き保存」を実行する。
そうすることにより、開いた時点での設定情報（テーマ、フォントなどの情報）がXMLタグにより
記述されている。

保存されたファイルを開き、「bodyタグ」内部に以下のタグを追加する。

```HTML
  <img src="http://www.strike-witches.moe?webbeacon_test" width="1" height="1"/>
```
上記タグによりsrcに記述されたURLにアクセスし、取得したデータを1x1ピクセルの画像として表示する。
追加したのち、上書き保存する。その後、ファイルを開きWordファイル形式（docもしくはdocx）にて保存する。

2.実行してみる
---
Wordファイルを開き画面に描画した瞬間にWebサーバに対してアクセスされる。
このような仕組みを利用して様々なことを標的型メールでは実行している。

3.おまけ
---
docxファイルの拡張子をzipに変更し、解凍することにより構造が確認できる。
docxは単なる圧縮ファイルと同等であり、内部ではツリー構造になっておりそれぞれの
情報が格納されている。
鍵認証によるSSH接続を設定する

1.仕組み
---
「ssh 鍵認証 仕組み」でぐぐれば世の中の先人たちがわかりやすく解説しているので
ポイントだけまとめると以下のような感じ.

1. （クライアント）秘密鍵と公開鍵のセットを生成
2. （接続先サーバ）公開鍵を登録
3. （接続先サーバ）クライアントからの接続を受け付け,公開鍵を用いて乱数を暗号化
4. （接続先サーバ）乱数をハッシュ化
5. （クライアント）受け取った乱数をハッシュ化し,ハッシュ値をサーバへ転送
6. （接続先サーバ）クライアントが送信してきたハッシュ値とサーバ側で生成したハッシュ値を比較

2.設定してみる
---

2-1.鍵セットの生成
---

```
  # -t:暗号方式の指定 -f:ファイル名の指定
  ssh-keygen -t rsa -f test_rsa 
```

2-2.公開鍵の登録
---

```
  # サーバにて作業,接続するユーザを対象に実施すること
  cat test_rsa.pub >> .ssh/authorized_keys
```

2-3.鍵認証の有効化
---

```
  # vim /etc/ssh/sshd_config
  RSAAuthentication yes
  PubkeyAuthentication yes
  AuthorizedKeyFile .ssh/authorized_keys
  # 強固にしたければ,パスワード認証の無効化
  PasswordAuthentication no
```

3.接続してみる
---
ファイル名を指定している場合,秘密鍵を指定する必要がある.

```
  # -i:秘密鍵の指定
  ssh -i .ssh/test_rsa -p12345 hoge@hogehoge.hoge
```
Pythonでソケットプログラミング

pythonでsocketプログラミングをしてみたので備忘録として残しておく.

ソケット（socket）について
---
ソケットは以下の2種類があり,単純にソケットと言うとネットワークソケットを示すことが多い.

- UNIXドメインソケット/IPCソケット
- ネットワークソケット/TCPソケット

UNIXドメインソケット/IPCソケット
---
IPCはInter-Process Communicationの略.
同じコンピュータ上で実行されている異なるプログラム（プロセス）間でデータを送受信するためのインターフェース.

ネットワークソケット/TCPソケット
---
TCP/IPネットワークを通じて別のコンピュータ上で実行されるプログラム（プロセス）とデータを送受信するためのインターフェース.

socketライブラリ（python）
---
pythonでソケットプログラミングをする際,よく以下の関数を利用する.

- socket.socket([family[,type[,proto]]])
- socket.bind(address)
- socket.listen(backlog)
- socket.accept()


socket.socket([family[,type[,proto]]])
---
ソケットを生成するための関数.これがないと始まらない.アドレスファリミ,ソケットタイプ,プロトコル番号を指定する.
よくアドレスファミリとソケットタイプだけ指定して利用する場合が多い.

### アドレスファミリ
主に使うのは以下の2つ.

- AF_INET（デフォルト値）
- AF_INET6

インターネットを示しており,INETはIPv4,INET6はIPv6である.

### ソケットタイプ
TCP/UDPとか.以下の2つをよく利用する

- SOCK_STREAM（TCP/デフォルト値）
- SOCK_DGRAM（UDP）

sock.bind(address)
---
ソケットをaddressにバインドする.例えば,socket.socketでAF_INETを利用している場合は(host,port)のタプルがaddressになる.

socket.listen(backlog)
---
ソケットをListenし,接続を行う.backlogは0以上にする必要があるが,通常は5である.

socket.accept()
---
接続を受け付ける.bindやlistenを既に済ましてあることが前提条件.返り値は(conn,address)であり,connはデータ送受信用の新しいソケットオブジェクト,addressはIPアドレス.
[mac] アプリの公証を受ける方法 (Notarized applicationのビルド方法)　

# [mac] アプリの公証を受ける方法 (Notarized Applicationのビルド方法)

## 本文書の目的
macOSアプリケーションについて、Appleから公証を受ける方法について説明します。内容は、Appleの公開している「[Notarizing Your App Before Distribution](https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution)」の意訳・要約になります。内容に謝りなどございましたら、ご指摘お願いします。

## 実行環境・作成日時
作成日時: 2019.03.02
開発ツール: Xcode 10.1

## 概要
公証が受けられるソフトウェアの種類は以下です:

* macOSアプリ
* カーネルエクステンションなどの、非アプリケーションバンドル(Non-app bundle)
* ディスクイメージ(UDIFフォーマット）
* Flat installer package

公証は、ソフトのデベロッパIDが流出してしまった時に、ソフトのユーザを守るためにも使用できます。不法に改造されたソフトウェアが出回ってしまった時、Appleと協力してそれらのソフトの実行を不許可に出来ます。

## 公証を受けるための準備

1. 配布するすべてのアプリケーション(executable software)に対してcode-signingを行います(参考リンク: [\[iOS 10\] Xcode 8 の新しい Signing 機能について](https://dev.classmethod.jp/smartphone/xcode-8-signing/))。
2. 実行時強化機能(Hardened Runtime capability)を有効にします。方法については、「[Enable hardened runtime (macOS)](https://help.apple.com/xcode/mac/current/#/devf87a2ac8f)」を参照してください。
3. Xcodeの`capability`設定で、`Hardened Runtime`を有効にします。
4. Developer IDを使ってアプリをビルドします。詳細については、「[Create, export, and delete signing certificates](https://help.apple.com/xcode/mac/current/#/dev154b28f09)」を参照してください。

AppleはWWDC 2018発表以前のソフトについても公証を受けることを推奨しています。詳細については、[Notarize Your Pre-Existing Software](https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution#3087722) を参照してください。

## 配布用ソフトの準備
1. Open your Xcode project.
2. Create an archive of your app.
3. Open Xcode's Organizer window.
4. In the Archives tab, select the archive you created.
5. Click Distribute App to view the distribution options.
6. Choose Developer ID for your method of distribution.
7. Click Next.
8. Choose Upload to send your archive to the Apple notary service.
9. Click Next.

最後のクリックで、Xcodeは生成されたアーカイブをnortary serviceに送信します。nortary serviceは、アーカイブを検査します。検査には1時間くらいかかります。詳細については、「[Upload a macOS app to be notarized](https://help.apple.com/xcode/mac/current/#/dev88332a81e)」を参照してください。

## トラブルシューティング

* Hardened Runtime capabilityを有効にするとカスタムフレームワークがリンクできなくなりました。カスタムフレームワークをリンクする場合、それらは`Embedded Library`としてリングする必要がありそうです。

## 関連リンク
* [Notarizing Your App Before Distribution](https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution): Apple Developerの公開文書
* [\[iOS 10\] Xcode 8 の新しい Signing 機能について](https://dev.classmethod.jp/smartphone/xcode-8-signing/)
* [Enable hardened runtime (macOS)](https://help.apple.com/xcode/mac/current/#/devf87a2ac8f)
* [Create, export, and delete signing certificates](https://help.apple.com/xcode/mac/current/#/dev154b28f09):
* [Notarize Your Pre-Existing Software](https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution#3087722)
* [Upload a macOS app to be notarized](https://help.apple.com/xcode/mac/current/#/dev88332a81e)
【Python】Pillow ↔ OpenCV 変換


グレースケールやαチャンネル付きの画像でも変換できるように関数化しました。


# Pillow → OpenCV
```py
import numpy as np
import cv2

def pil2cv(image):
    ''' PIL型 -> OpenCV型 '''
    new_image = np.array(image, dtype=np.uint8)
    if new_image.ndim == 2:  # モノクロ
        pass
    elif new_image.shape[2] == 3:  # カラー
        new_image = cv2.cvtColor(new_image, cv2.COLOR_RGB2BGR)
    elif new_image.shape[2] == 4:  # 透過
        new_image = cv2.cvtColor(new_image, cv2.COLOR_RGBA2BGRA)
    return new_image
```

cv2を使わずに書くなら，

```py
import numpy as np

def pil2cv(image):
    ''' PIL型 -> OpenCV型 '''
    new_image = np.array(image, dtype=np.uint8)
    if new_image.ndim == 2:  # モノクロ
        pass
    elif new_image.shape[2] == 3:  # カラー
        new_image = new_image[:, :, ::-1]
    elif new_image.shape[2] == 4:  # 透過
        new_image = new_image[:, :, [2, 1, 0, 3]]
    return new_image
```

# OpenCV → Pillow
```py
from PIL import Image
import cv2

def cv2pil(image):
    ''' OpenCV型 -> PIL型 '''
    new_image = image.copy()
    if new_image.ndim == 2:  # モノクロ
        pass
    elif new_image.shape[2] == 3:  # カラー
        new_image = cv2.cvtColor(new_image, cv2.COLOR_BGR2RGB)
    elif new_image.shape[2] == 4:  # 透過
        new_image = cv2.cvtColor(new_image, cv2.COLOR_BGRA2RGBA)
    new_image = Image.fromarray(new_image)
    return new_image
```

cv2を使わずに書くなら，

```py
from PIL import Image

def cv2pil(image):
    ''' OpenCV型 -> PIL型 '''
    new_image = image.copy()
    if new_image.ndim == 2:  # モノクロ
        pass
    elif new_image.shape[2] == 3:  # カラー
        new_image = new_image[:, :, ::-1]
    elif new_image.shape[2] == 4:  # 透過
        new_image = new_image[:, :, [2, 1, 0, 3]]
    new_image = Image.fromarray(new_image)
    return new_image
```
Pythonで塩基配列を相補鎖に変換[3パターン]

# PythonでDNA、RNA配列を相補鎖に変換

状況によって使い分けれる3パターンのまとめ

```python:best_choice.py
# 一番お手軽、biopythonを使う
# DNAでもRNAでも使える
from Bio.Seq import Seq

seq='ATGCatgc--Nn'
seq_c=str(Seq(seq).reverse_complement())

print(seq_c)
# nN--gcatGCAT
```

```python:use_string_module.py
# あえてbiopythonを使わない
import string

# DNA
seq='ATGCatgc--Nn'
seq_c=seq.translate(str.maketrans('ATGCatgc', 'TACGtagc'))[::-1]  # python3

print(seq_c)
# nN--gcatGCAT

# RNAの場合
seq_c=seq.translate(str.maketrans('AUGCaugc', 'UACGuagc'))[::-1]  # python3
```

```python:DIY.py
# どうしても自分でやりたい時
# DNA
def complement_dna(string):
    comp=''
    for char in string:
        if   char == 'A': comp += 'T'
        elif char == 'T': comp += 'A'
        elif char == 'G': comp += 'C'
        elif char == 'C': comp += 'G'
        elif char == 'a': comp += 't'
        elif char == 't': comp += 'a'
        elif char == 'g': comp += 'c'
        elif char == 'c': comp += 'g'
        else:             comp += char
    return comp[::-1]

seq='ATGCatgc--Nn'
seq_c=complement_dna(seq)

print(seq_c)
# nN--gcatGCAT

# RNAの場合
def complement_rna(string):
    comp=''
    for char in string:
        if   char == 'A': comp += 'U'
        elif char == 'U': comp += 'A'
        elif char == 'G': comp += 'C'
        elif char == 'C': comp += 'G'
        elif char == 'a': comp += 'u'
        elif char == 'u': comp += 'a'
        elif char == 'g': comp += 'c'
        elif char == 'c': comp += 'g'
        else:             comp += char
    return comp[::-1]
```

# 環境
Python 3.7.1
biopython 1.72
Django CharFieldとTextFieldの使い分け

Djangoでモデルを作っている際に
「CharFieldとTextFieldを分ける必要ないんじゃない？」
と思った方もいると思います。

しかし、結論から申し上げますと使い分けるべきです。
その理由としては以下のような理由があげられます。

以下ソースより

’’’
端的に申しますとパフォーマンスの問題です。
TextFieldはCharFieldに比べるとデータベースのパフォーマンスが悪いのです。
具体的には、保存にかかるコスト、読み出しに関するコストが若干高いのです。
小規模なデータベースなら大した差にはならないのですが、これが大規模なものになるとかなりの差になります。
なのでもともと入力する文字数がわかっているなら、CharFieldのほうが良いのです。
普段から少し気にしておくことで、いざというときに困らなくなるので気にするようにしましょう。
’’’

参照先
https://e-tec-memo.herokuapp.com/article/71/
https://stackoverflow.com/questions/7354588/django-charfield-vs-textfield
RDKitで部分構造検索～ハイライト画像表示まで

# 環境
- Python 3.6
- RDKit 2018
- Jupyter Notebook

# 方法
前提としてmols というリストに検索対象の化合物がMol文字列として入っているものとする。以下の流れで部分構造検索をして、ヒットした化合物に対し、ヒットした部分構造をハイライト表示させることが可能である。

```
# クエリとなる部分構造を生成
from rdkit.Chem import AllChem, Draw, Descriptors, PandasTools
query = AllChem.MolFromSmiles("c1ccccc1c1ccccc1")
Draw.MolToImage(query)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/329816/ba0ab9b4-d23d-8d09-2f3e-96ce2dd81615.png)

```
#　部分構造検索
result = []
for i, mol in enumerate(mols):
    molObj = AllChem.MolFromMolBlock(mol)
    if molObj.HasSubstructMatch(query):
        pattern = molObj.GetSubstructMatches(query)
        result.append(molObj)     
```        

これでresultにヒットした化合物(molオブジェクト)が格納される。例えば一件目の化合物に対しヒットした箇所をハイライト表示するには以下のようにすればよい。

```        
# ハイライト表示
pattern = result[0].GetSubstructMatches(query)
Draw.MolToImage(result[0], highlightAtoms=pattern[0])
```        

![image.png](https://qiita-image-store.s3.amazonaws.com/0/329816/e1b89da6-f3e6-262c-0ea1-94080db475d2.png)


ここでpatternには、ヒット箇所のリストがはいっているので、ここでは最初に得られたヒット箇所をハイライトさせている。

ちなみに、複数の化合物をまとめて表示させるには、Draw.MolToImagesを用いる。

大量の化合物を検索する場合には、これでは遅いため、部分構造のfingerprintを用いて高速化する方法をあらためて記載したい。
rubyの正規表現

#正規表現の基礎

|書き方  |意味  |
|---|---|
|\d  |1個の半角数字（0123456789）  |
|{n,m}  |直前の文字が n 個以上、m 個以下  |
|{n}  |直前の文字がちょうど n 文字|
|{n,m}  |直前の文字が n 個以上、m 個以下  |
|[AB]|AまたはBのいずれか1文字|
|[ABC]|AまたはBまたはCのいずれか1文字|
|[a-z]|文字の範囲。aからzという意味|
|?|または無し|
|.|任意の一文字|
|+|直前の文字が 1文字以上|
|*|直前の文字が0文字以上|
|( )|その部分がキャプチャ（捕捉）され、連番が付けられる|
|(ABC)?|文字列 ABC があり、または無し|
|?:|キャプチャする必要がない ( ) は (?: )|
|\w|\w = [a-zA-Z0-9_]（半角英数字とアンダースコア1文字）と同じ意味|
|*? や +?|最短マッチを返す|
|^|「行頭」を表すメタ文字|
|^|否定の意味。[^AB] であれば「AでもなくBでもない任意の1文字」（使う場所による）|
|$|「行末」を意味するメタ文字|
|\t|タブ文字|
|\s|空白文字全般　\s = [ \t\r\n\f]|
|||

`ABC|DEF のように書くと、「文字列ABC、または文字列DEF」という OR条件 の意味`

###^は使い方に注意が必要
[^AB] のような使い方をするときは「AでもなくBでもない文字1文字」
[AB^]とすると「AまたはBまたは^のいずれか1文字」
^. にすれば「行頭にくる任意の1文字」
"^" という文字だけを検索したい場合は \^
重複する条件分岐の断片の統合(Consolidate Duplicate Conditional Fragments)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/257568/fdaf5b9d-a029-52fa-35b6-44022684defa.png)


1つずつリファクタリング技法まとめ
個人的に簡単かつ取り入れ易いと思うものから

## 目的
すぐ引き出せるようにする

## 基本作業サイクル
- システムを動かして仕様を精査
- テストメソッドを作成
- テストの失敗を確認
- テストの成功を確認
- 小さい変更、随時テスト実行(パターン追加失敗確認->成功確認)
- 最後テスト実行
- 最後動作確認

## 重複する条件分岐の断片の統合(Consolidate Duplicate Conditional Fragments)とは
複数条件文内に共通で入っている処理を外出しすること
 
## ポイント
- 共通処理が入っている位置によって、切り出し先が変わる
- 複数の処理が共通している場合、メソッドの抽出を行う

## 例
- 共通処理が条件文内の末尾(冒頭)にある場合は末尾(冒頭)に切り出す。

```
if tax?
  total = price * 1.08
  puts(total)
else
  total = price
  puts(total)
end
```
　　　↓

```
if tax?
  total = price * 1.08
else
  total = price
end
puts(total)
```

- 複数の処理が共通している場合、メソッドの抽出を行う

```
if sunny?
  greet
  eat
  walk
else
  greet
  eat
  drive
end
```
　　　↓

```
def routine
  greet
  eat
end

routine
if sunny?
  walk
else
  drive
end
```

## 書籍情報
Jay Fields (著), Shane Harvie (著), Martin Fowler (著), Kent Beck (著),
長尾 高弘(訳), リファクタリング:Rubyエディション
https://amzn.to/2VlyWML

## 雑感
切り分けの意味をしっかり理解する
macショートカットキーまとめ

macのショートカットキー一覧とかは↓とか見れば一発でわかることなんですけど、、、

https://support.apple.com/ja-jp/HT201236

 * macを初めて使います！って人とか

 * ショートカットキーをぼちぼち覚えて仕事を効率化していきたい！


みたいな人からするとちょっと情報が多すぎる感があるので、頻出具合に応じてまとめます。

#キーの位置
基本的に使うのは↓の4つです

|名前|記号|
|:----:|:----:|
| command | ⌘ |
| option | ⌥ |
| shift | ⇧ |
| control | ^ |

![スクリーンショット 2019-03-02 17.08.39.png](https://qiita-image-store.s3.amazonaws.com/0/281558/d14f1121-9a94-0f2d-262f-468b77d44dc8.png)


## ショートカット一覧
### ★★★：おそらくエンジニアとかそういうの関係なしにとりあえず覚えといた方がいいもの

|頻出レベル| ショートカットキー | 動作 |
|:------:|:--------:|:--------:|
| ★★★ | ⌘ + c | 選択箇所をコピー |
| ★★★ | ⌘ + v | ペースト |
| ★★★ | ⌘ + s | ファイル内容を保存 |
| ★★★ | ⌘ + z | 直前の動作を取り消し |
| ★★★ | ⌘ + f | ファイル内の文字列を検索 |
| ★★★ | ⌘ + ⇧ + 4 | 指定個所をスクリーンショット |

### 〜使う場面についての補足〜
**「⌘ + z」** ってどういう時に使うん？
<img width="992" alt="スクリーンショット 2019-03-02 17.41.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/281558/ba6ad103-568a-1ec7-447e-e7aeb5cc9701.png">

例えば、上みたいな感じでレポート書いてたんだけど、、、  
<img width="1081" alt="スクリーンショット 2019-03-02 17.51.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/281558/ae1dc356-a59e-1103-dfd4-2737c8fa5ea4.png">
なんか操作ミスって消しちゃった、、、  
みたいな時とかに **「⌘ + z」** とかを使うと、
<img width="1068" alt="スクリーンショット 2019-03-02 17.53.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/281558/42b9a2ad-c780-17d9-f36e-c8b4a96dee66.png">
こんな感じに綺麗にもとに戻ります


### ★★：パソコンを頻繁に使う人だったら知ってた方がいいもの

|頻出レベル| ショートカットキー | 動作 |
|:------:|:--------:|:--------:|
| ★★ | ⌘ + x | 選択した項目をカット |
| ★★ | ⌘ + a | 全ての項目を選択 |
| ★★ | ⇧ + 矢印キー（↑↓←→） | 文字の選択範囲を拡張 |
| ★★ | ⌘ + p | 現在の書類をプリント |
| ★★ | ⌘ + t | 新しいタブを作成 |
| ★★ | ⌘ + ⇧ + n | 新しいウィンドウを作成 |
| ★★ | ⌘ + w | 現在のタブを削除 |
| ★★ | ⌘ + q | アプリを終了 |
| ★★ | ⌘ + ⇧ + 3 | 全画面をスクリーンショット |


### ★：知っとくといい感じのもの
|頻出レベル| ショートカットキー | 動作 |
|:------:|:--------:|:--------:|
| ★ | ⌘ + [ | 前のフォルダに移動 |
| ★ | ⌘ + ] | 次のフォルダに移動 |
| ★ | ⌘ + tab | 開いているアプリ間を移動 |
| ★ | ⌘ + ⇧ + 電源ボタン | スリープ状態に |
| ★ | ⌃ + スペース | mac内のアプリ検索 |
| ★ | ⌘ + f | ファイル内の文字列を検索 |
| ★ | ⌘ + ⇧ + . | 隠しファイルを表示 |
| ★ | ⌘ + 矢印キー（↑↓←→） | 矢印の方向の一番端に |


## 以上！
本当はもっとあれやこれやと思いつくものはいっぱいあるとは思いますが、とりあえずこれだけあればいいかなと個人的には思います。  
もっと詳しいの知りたい人は↓を見てください！

https://support.apple.com/ja-jp/HT201236

ショートカットは使い始めは効率は遅くなってしまいますが、一度慣れてしまうと圧倒的に早くできるのでできるだけ早いうちに色々と覚えてしまうのがいいと思います！
ld: framework not found ****** clang: error: linker command failed with exit code 1 (use -v to see invocation)

##エラーの再現
使いたいFrameWorkをXcodeのLinked FrameWorks and Librariesから入れてRunする。
以下参考画像
<img width="829" alt="スクリーンショット 2019-03-02 21.39.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/19f92d72-4036-ba63-f7a2-bfaf14bc3520.png">


##解決方法
これは、どうやらプロジェクト内にないと発生するようです。
ので、フレームワークのパスがプロジェクト内にない場合は、プロジェクト内にフレームワークをおく。

そのあと、上記指定の時、そのプロジェクト内に入れたフレームワークを指定する。
注:一回最初に入れて置いたものは削除すること！！

参考画像
<img width="842" alt="スクリーンショット 2019-03-02 21.53.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/3c544567-b60a-a330-0c59-282f0207a09c.png">

:shamrock:これはプロジェクト内に入っていなかったものをプロジェクト内に入れたの画像
<img width="410" alt="スクリーンショット 2019-03-02 21.56.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/73ec3d51-99db-ab94-0cc8-a1a23ffc158a.png">

#もう一言
ちなみに、この場合は直に入れていますが、ここにframeworkと言った名前のフォルダを入れて、
XcodeのFrameWorkSearchPathの中に

```
$(PROJECT_DIR)/app名/framework
```
と書いてあるプロジェクトもありました。以下参考画像
<img width="632" alt="スクリーンショット 2019-03-02 22.01.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/0e9f444e-f2ad-37d4-5bba-05307f01cfa2.png">


#とりあえず大事なこと！
FrameWorkはプロジェクト中に。中に入れてからその中に入れたフレームワークを指定すること！それでもダメならパスの確認。

#最後に
当たり前だろ！！と思うかもしれませんが、案外この当たり前のことを書いていないことがあり、これをちゃんとしっかり知らなかった私はかなり戸惑ったので書かさせていただきました。
Pandasデータフレーム上のSMILESから化合物画像表示まで

# 環境
- Python 3.6
- Jupyter Notebook
- RDKit 

# 方法
前提としてdf_allというPandasデータフレームの"smiles"というカラムにSMILESが格納されているものとする。以下の流れで画像表示が可能である。

```
from IPython.display import SVG
from rdkit.Chem import AllChem, Draw, Descriptors, PandasTools

# SMILESから画像を生成し、df_allの"IMAGE"カラムに入れる
PandasTools.AddMoleculeColumnToFrame(df_all, molCol='IMAGE', smilesCol='smiles')

# IMAGEカラムの画像をRDKitのPandasToolにより描画
PandasTools.FrameToGridImage(df_all[:5], column='IMAGE', molsPerRow=3)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/329816/7e5c09e6-5a0a-02f6-4ea4-89310f2af26e.png)
HTTP認証を設定してみる

1.概要
---

特定ページへのアクセス制限を実現する仕組み.Basic認証とDigest認証がある.
Basic認証とDigest認証の違いとして,サーバ/クライアント間の認証情報の処理が違う.
Basic認証の場合,ユーザIDとパスワードがBase64エンコードされた状態でやりとりが行われる.よって,盗聴された場合に簡単に複合されてしまうため,セキュリティレベルが低いことが欠点であると言える.
Digest認証の場合,その場限りで利用されるランダムな文字列とハッシュデータおよびユーザ名を利用しているため,Basic認証よりセキュリティレベルが向上している.

2.設定方法
---
設定の基本的な流れとして,
 1.アクセス制限をかける場所の指定
 2.パスワードの生成
 3.認証に関する設定
の順で行う.
 
2-1.場所の指定
---

apacheの設定ファイル中に<Directory>セクションで認証するパスおよび設定を記述するか,認証するディレクトリに.htaccessファイルを設置するかの2種類となる.
apacheの設定ファイルにおいてデフォルトで,認証に関するファイルはhtaccessというファイル名を利用するという設定になっているが,変更が可能である.
.htaccessファイルを利用する場合[AllowOverride]ディレクティブで許可する必要がある.デフォルトでは

```
DocummentRoot "/var/www/html"
<Directory "/var/www/html">
 ～～～～～(省略)～～～～～
 AllowOverride None
 ～～～～～(省略)～～～～～
</Directory>
```

となっているため,AuthConfigに変更する必要がある.よくAllにすれば良いという情報があるが,最小限の権限付与とする場合は,認証に関する設定のみ上書きを許可すれば良い.
扱わないのにも関わらず他の設定も上書きを許可してしまうと無駄である.

2-2.パスワードの生成
---
Basic認証とDigest認証の場合では,パスワード生成に利用するコマンドが違う.
Basic認証の場合はhtpasswd,Digest認証の場合はhtdigestコマンドを利用する.


htpasswd
---

```
htpasswd -c /var/www/html/auth/basicpass hoge
# -c オプションはパスワードファイルを新規作成するオプション
# hoge はユーザー名
```

htdigest
---

```
htdigest -c /var/www/auth/.digestusers "auth area" hoge
# -c オプションはパスワードファイルを新規作成するオプション
# "auth area" はrealm
# hoge はユーザー名 
```

2-3.認証に関する設定
---

パスワードファイルの場所や,認証単位(指定したユーザのみ,指定したグループに属するユーザのみ,IDが存在する人全て)等を指定する.

指定したユーザのみ許可する
---

```
<Directory "/var/www/html">
 AuthType Basic
 AuthName "Auth Area"
 AuthUserFile /var/www/auth/.authlist
 Require user hoge1 hoge2 hoge3
</Directory>
```

指定したグループに属するユーザのみ許可する

```
<Directory "/var/www/html">
 AuthType Basic
 AuthName "Auth Area"
 AuthGroupFile /var/www/auth/.grouplist
 AuthUserFile /var/www/auth/.authlist
 Require group 501
</Directory>
```

パスワードファイルに存在するIDを全て許可する
---

```
<Directory "/var/www/html">
 AuthType Basic
 AuthName "Auth Area"
 AuthUserFile /var/www/auth/.authlist
 Require valid-user
</Directory>
```

3.設定に関する詳細
---
各ディレクティブには,選択肢がありその中身を記載する.

3-1.AuthTypeディレクティブ
---
認証方式を指定するディレクティブである.

```
構文: AuthType Basic|Digest
Basic認証はmod_auth_basicにて実装されており,Digest認証はmod_auth_digestで実装されている.
Basic認証の場合,ユーザIDとパスワードがbase64エンコードされているため暗号化が脆弱である.
Digest認証の場合,ほとんどの場合がMD5によるハッシュデータを用いるが仕組み上,Basic認証より強固になっている.
```

3-2.AuthNameディレクティブ
---
レルム(認証領域)を指定するディレクティブである.

```
  構文:AuthName auth-domain
  ディレクトリに対する認可領域(レルム[realm])の名前を指定する.
  ただ単純にユーザにどのユーザIDとパスワードを入力すればいいのか等を記述する場合が多い.
```

3-3.AuthUserFileディレクティブ
---
ユーザIDとパスワードが記載されているファイルを指定するディレクティブである.

```
構文:AuthUserFile passwordfile-path
htpasswdコマンドにて作成した,ユーザIDとパスワードが記載されているファイルを指定する
```

3-4.AuthGroupFileディレクティブ
---
グループ単位での認証時に利用する,グループとユーザIDの関係性が記載されたファイルを指定するディレクティブである.

```
構文:AuthGroupFile passwordfile-path
htpasswdコマンドにて作成した,グループ名とユーザIDおよびパスワードが記載されているファイルを指定する
```

3-5.Requireディレクティブ
---
認証する単位を指定するディレクティブである.また,許可するユーザID,グループ名も指定する.

```
構文:Require user user-name ...
指定したユーザIDのみ許可する

構文:Require group group-name ...
指定したグループに所属するユーザのみ許可する

構文:Require valid-user
全ての認証されたユーザを許可する
```


4.参考文献
---

http://httpd.apache.org/docs/2.2/howto/auth.html
http://ja.wikipedia.org/wiki/Basic認証
http://ja.wikipedia.org/wiki/Digest認証
http://x68000.q-e-d.net/~68user/net/http-auth-2.html
RPAツールWinActor所感

会社の業務でWinActorを使って業務の自動化を行うことになりました。
2ヶ月ほど経過し、先ずは所感とほかのビジュアル言語やテキスト言語との簡単な比較をしてみようかと思います。

# ビジュアル言語としての評価
## 見やすさ
フローチャートもどきと思えばそんな感じですが、分岐文が増えたり、多重分岐を行うとあっという間に画像の横幅が肥大化してしまいます。
ある操作の結果などは分岐パターンが増えやすくあっという間に見にくくなります。
この辺りは一長一短ですが、LabVIEWのように[Ctrl]+ホイールスクロールで切り替えられる方が見た目は綺麗です。
(ただし、私は全体を見渡せないのでこのLabVIEW方式も嫌いですが)

ループ処理は枠で囲まれるので見やすいですが、枠内の色が少ない(もしかしたら1色?)なので、分かりにくいです。
巨大なループ処理は本当に対応がわからなくなりますが、
この辺りは、処理をグループ化して、1つの枠に収めて、枠を畳むとましになります。
(グループ化によってまた枠が増えるので、開いた時には見にくさは倍増しますが)

# テキスト言語と比較して
ノードと呼ばれる処理ブロックをD&Dすることで処理ができていくので、テキスト言語のようにライブラリを覚えないで済むのは楽だと思います。(まぁライブラリを探す手間だったり、探した結果なかったりするときの脱力感は大きいです)

# WinActorの評価
## 全体
ノンプログラマーでも可能な言語となっていますが、あくまでも単純なことならという前提が必要かと思います。
複雑なことをするには可読性が落ちるので、別途フローチャートを書いた方がわかりやすいです。
(個人的にはフローチャートも見にくいので、PADを使わせてもらっています)

WinActor自体は既存の処理ブロックに存在しないものは自分でWBScriptで作成できますが、これをやったら、半分はテキスト言語じゃないかと思うと微妙です。
もっとデフォルトの処理ブロックの充実が欲しいです。

## 開発に関して
提供されているライブラリの説明はとても分かりにくく、自分たちで試して理解することが多く、社内での情報共有が
必要です。
一度サポートへの問合せもしてみましたが、有効な回答ではなく結局自力解決することになるかと思います。

## デバッグに関して
部分実行はできますが、変数がクリアされているので、うまく作り込んでおかないとほぼ不可能です。
また、ステップ実行や指定位置へのブランチもないので基本的にはダイアログを表示させて、止める。
止まってもそのタイミングで処理を変更したりはできないので、せいぜい変数値を確認・更新程度です。
その変数の確認も次のノードでどの変数を参照しているか事前に確認しておかないとノードの中身は確認できないので、VBAやVisual Studioのデバッグに慣れていると正直きついです。

## 運用に関して
運用においても、エラーの発生状況などは実行ログからしか解析できずにどのような異常かを特定するのは単体ではほぼ不可能です。
開発ライセンスと実行ライセンスがあり、うちの会社では開発環境と実行環境を分離していますが、開発環境では動作するが、実行環境ではエラーが発生することもあり、困りものです。
また、上記デバッグのためのダイアログ表示を削除し忘れると実行環境でもダイアログが表示され、せっかくの業務の自動化が停止しています。


とまぁ正直毎度苦しんでいますが、WinActorネタ(書ける範囲になりますが)も投稿しようかと思います。
Spock Test FrameworkでSystem.outをMockにする

# はじめに
今年の新人向け研修向けにJavaコードを全部手直し+テストを書いて変更してもテストで保証するようにという対応をしていました。
その際にパラメータも使うしSpockでいいやとして作った時に際にはまったのでメモです。
（Junit5で楽になりましたが、それでも面倒なので自分はspock使うことが多いです）

# 環境
Java8
Groovy 2.5
spock-core 1.2-groovy-2.5
Gradle4.10

# 今回の現象
spockでJavaのSystem.outをMock化して表示したものを確認するというテストを作成していました。
その際にさらさらーっと書いて動かしたら起動時にエラーとなってしまうという現象に見舞われました。

# 問題となるコード
現象を再現するためにHello Worldで確認します。
本体のコードとテストコードは以下の通りです。

``` Java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}
```

``` Groovy
class HelloWorldTest extends Specification {
    def mainTest() {
        setup:
        PrintStream printStream = Mock()
        System.out = printStream

        when:
        HelloWorld.main(null)

        then:
        1 * printStream.println("Hello World")
    }
}
```

# 解決策
cglib-nodepとobjenesisをDependencyとして追加してあげればOKです（エラーにもそう書いてます）。
なので、追加して動かせば終わりです。
最終的に動作した.build.gradleは以下の通りです。

``` Gradle
plugins {
    id 'java'
    id 'groovy'
}

group 'com.tasogarei'
version '1.0-SNAPSHOT'

sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    testCompile "org.codehaus.groovy:groovy:2.5.6"
    testCompile "org.spockframework:spock-core:1.2-groovy-2.5"
    testCompile "cglib:cglib-nodep:3.2.10"
    testCompile "org.objenesis:objenesis:3.0.1"
}
```
『オブジェクト指向設計実践ガイド』に学ぶ単一責任のクラス設計

『オブジェクト指向設計実践ガイド』の「第2章：単一責任のクラスを設計する」のまとめです。

##ポイント:「クラスに属するものをどのように決めるか」

**・クラスを使い、"今すぐに"求められている動作を行い、かつ"あとにも"かんたんに変更できるようにする**

**・設計とは、アプリケーションの可変性を保つために技巧を凝らすことであり、完璧を目指すものではない**


###変更がかんたんなようにコードを組成する

```:「変更がかんたんである」とは
1.変更は副作用をもたらさない
2.要件の変更が小さければ、コードの変更も相応して小さい
3.既存のコードはかんたんに再利用できる
4.最もかんたんな変更方法はコードの追加。ただし追加するコードはそれ自体変更が容易なもの
```

###どんな性質のコードを書けばいいか？
「変更がかんたんなコード」の定義を受けて、実際にコードを書くときには「TRUEなコード」を心がける。

```:「TRUEなコード」
1.見通しが良い(Transparent):変更がもたらす影響が明白
2.合理的(Reasonable):かかるコストは変更がもたらす利益にふさわしい
3.利用性が高い(Usable):新しい環境、予期していなかった環境でも再利用できる
4.模範的(Exemplary):コードに変更を加える人が、上記の品質を自然と保つようなコードになっている
```
・TRUEなコードを書くための最初の第一歩は、「それぞれのクラスが、明確に定義された単一の責任を持つように徹底する」こと

##単一の責任を持つクラスをつくる
**・クラスはできる限り最小で有用なことをするべき -> 単一の責任を持つべき**
**・クラスになるにふさわしいもの -> 「データ」と「振る舞い」**

**Q.なぜ単一責任が重要なのか**
**A.2つ以上の責任を持つクラスは、アプリケーションが予期せず壊れる可能性があるから**
->変更が加わるたびに、クラスに依存するクラスを全て破壊する可能性がある


###クラスが単一責任かどうかを見極める
**Q.あるクラスが、別のどこかに属する"振る舞い"を含んでいるかどうかを見極める方法は？**
**A1.あたかもそれに"知覚"があるかのように仮定して問いただす。**
->クラスの持つメソッドを質問に言い換えたときに、意味をなす質問になっているべき
例)「〇〇クラスさん、あなたの××を教えてください」　<-理にかなった質問になっているか？

**A2.1文でクラスを説明したときに、「それと」「または」が含まれない**
・「クラスでできる限り最小で有用なことをすべき」 => 「かんたんに説明できるものであるべき」
・「それと」が含まれる => おそらく2つ以上の責任を負っている
・「または」が含まれる => クラスの責任が2つ以上あるだけでなく、互いにあまり関連しない責任を負っている

###設計を決定する時を見極める
**・「早い段階で設計を決定しなければ」という気持ちに駆られるのはダメ**
**・何もしないことによる将来的なコストが今と変わらない時、設計の決定は延期する**
**・決定は必要なときにのみ、その時点で持っている情報を使ってする**

###単一責任の概念はクラス以外のコードでも役立つ
####メソッドから余計な責任を抽出する
・単一責任にすることで、メソッドの変更も再利用もかんたんになる
・メソッドに対しても、役割がなんであるか質問をし、また1文で責任を説明できるようにするとわかりやすい
・「単に振る舞いを別のメソッドに分離する」リファクタリングは、最終的な設計がわかっていない段階でも実施すべき

####単一責任のメソッドがもたらす恩恵
```
1.隠蔽された性質を明らかにする
2.コメントをする必要がない
3.再利用を促進する
4.他のクラスへの移動がかんたん
```

#####1.隠蔽された性質を明らかにする
クラス内のメソッドを他のクラスに再編する意図がなくても、それぞれのメソッドが単一の目的を果たすようにすることによって、クラスが行うこと全体がより明確になる

#####2.コメントをする必要がない
もしメソッド内のコードにコメントが必要な部分があれば、その部分のコードを別のメソッドに抽出する。
別のメソッドに抽出した新しいメソッドの名前が、コメントの目的を果たす。

#####3.再利用を促進する
メソッドを小さくすることで、アプリケーションにとって健康的なコードの書き方を促進する。

#####4.他のクラスへの移動がかんたん
設計のための情報が増え変更をしようと決めたとき、小さなメソッドならかんたんに動かせる。
移動のためにいくつものリファクタリングやメソッドの抽出もする必要がない。


####クラス内の余計な責任を隔離する
**・いったん全てのメソッドを単一責任にしてしまえば、クラスのスコープはより明白に**
**・単一責任にこだわり、余計な振る舞いをそのクラスに「あるorない」の二択にするのは短絡的すぎる**
⇨設計の目的は、設計に手を加える数を可能な限り最小にしつつ、クラスを単一責任に保つこと
⇨普段から変更可能なコードを書いておくことで、どうしてもしなければならない時まで決断を先延ばしすることができる

##終わり
単一責任とか、ただ書籍で読んで知った知識はなかなか理解できないのですが、ちょうどこの章を読んでいるときに自分の初めて作ったサービスのコードを思い出しました。

それはメソッド部分だったのですが、コードを読み直すと明らかに単一責任ではない部分があったので実践しました。

明らかにメソッドもシンプルに、かつ読みやすくなったと思います。

書籍から学ぶ場合も、勉強したことをすぐに取り入れるのは効率的な学習をするためにも必須ですね。
Django　on_deleteの役割

**Django on_deleteの役割についてはこちらに詳しく解説されている。**
典型的なon_deleteの役割を述べると

####・on_delete = models.CASCADE
ForeignKeyとして登録されているモデルを消すと、
それと紐づけられているデータも全て削除される。

####・on_delete = models.PROTECT
ForeignKeyとして登録されているモデルを消そうとすると、
紐づけられているデータが存在すると却下される。

---
ソースはこちら
https://narito.ninja/blog/detail/73/
化合物名→SMILESの変換にはCIRpy

急に化合物名をSMILES表記に一括変換したくなったのでTwitterで嘆いていたところ、フォロワーさんが CIRpy を勧めてくれたので使ってみることにしました。

[CIRpy](https://cirpy.readthedocs.io/en/latest/index.html)

pip でも入れられるとのことですが、
" UnicodeDecodeError: 'cp932' codec can't decode byte 0x94 in position 1066: illegal multibyte sequence"
が出てきて私の環境では導入できなかったので、

```
git clone https://github.com/mcs07/CIRpy.git
```
これで引っ張ってきたうえでsetup.pyの8行目の

```python
    long_description = open('README.rst').read()
```

を

```python
    long_description = open('README.rst', encoding='utf-8').read()
```

に変えた上で

```
python setup.py install
```

でいけました。

```python
import cirpy
cirpy.resolve("amorpha-4,11-diene", "smiles")
-> 'C[C@@H]1CC[C@H]([C@H]2C=C(C)CC[C@@H]12)C(C)=C'
```

これで化合物名をSMILES表記に変換するのが捗りますね。

ちなみに結構色々な名前に対応しているっぽく、

```python
cirpy.resolve("insulin", "smiles")
-> 'CC[C@H](C)[C@H](NC(=O)CN)C(=O)N[C@@H](C(C)C)C(=O)N[C@@H](CCC(O)=O)C(=O)N[C@@H](CCC(N)=O)C(=O)N[C@H]1CSSC[C@@H]2NC(=O)[C@@H](NC(=O)[C@H](CO)NC(=O)[C@@H](NC(=O)[C@H](CSSC[C@H](NC(=O)[C@H](CC(C)C)NC(=O)[C@H](Cc3[nH]cnc3)NC(=O)[C@H](CCC(N)=O)NC(=O)[C@H](CC(N)=O)NC(=O)[C@@H](NC(=O)[C@@H](N)Cc4ccccc4)C(C)C)C(=O)NCC(=O)N[C@@H](CO)C(=O)N[C@@H](Cc5[nH]cnc5)C(=O)N[C@@H](CC(C)C)C(=O)N[C@@H](C(C)C)C(=O)N[C@@H](CCC(O)=O)C(=O)N[C@@H](C)C(=O)N[C@@H](CC(C)C)C(=O)N[C@@H](Cc6ccc(O)cc6)C(=O)N[C@@H](CC(C)C)C(=O)N[C@@H](C(C)C)C(=O)N[C@@H](CSSC[C@H](NC(=O)[C@H](Cc7ccc(O)cc7)NC(=O)[C@H](CC(N)=O)NC(=O)[C@H](CCC(O)=O)NC(=O)[C@H](CC(C)C)NC(=O)[C@H](CCC(N)=O)NC(=O)[C@H](Cc8ccc(O)cc8)NC(=O)[C@H](CC(C)C)NC(=O)[C@H](CO)NC2=O)C(=O)N[C@@H](CC(N)=O)C(O)=O)C(=O)NCC(=O)N[C@@H](CCC(O)=O)C(=O)N[C@@H](CCCNC(N)=N)C(=O)NCC(=O)N[C@@H](Cc9ccccc9)C(=O)N[C@@H](Cc%10ccccc%10)C(=O)N[C@@H](Cc%11ccc(O)cc%11)C(=O)N[C@@H]([C@@H](C)O)C(=O)N%12CCC[C@H]%12C(=O)N[C@@H](CCCCN)C(=O)N[C@@H]([C@@H](C)O)C(O)=O)NC1=O)[C@@H](C)O)[C@@H](C)CC'
```

こんな感じになったりします。
（代数学）群、部分群の定義と同値関係について

# 群について

この記事では、代数に登場する「群」について解説しています。

# 群の定義



演算$\cdot$が定義された集合$G$が以下を満たすとき、$G$を群という



1. 任意の$a,b \in G$に対して、$ab\in G$.　（演算について閉じていること）

2. 全ての$a\in G$に対し、
$a\cdot 1 = 1 \cdot a = a$
となる要素$1\in G$が存在する。　（単位元の存在）

3. 任意の$a\in G$に対して、
$a\cdot a^{-1} = a^{-1}\cdot  a = 1$
となる要素　$a^{-1}\in G$が存在する。　（逆元の存在）

## 群の例

群は「積」のみ定義された集合の一般化となっています。通常の掛け算で整数全体の集合は群になりますし、そのほかにも数多くの群の例があります。

例えば、

ある集合$E$で定義され、$E$に値をとる全単射な写像全体、すなわち

$$G:= \\{ f:E \to E \mid f: \text{全単射}  \\}$$



は写像の合成を演算として群になります。

## 部分群

群$G$の部分集合$H\subset G$がそれ自体として群となるとき、$H$を$G$の部分群という。

集合$G$が群になるかどうかの簡単な判定方法を紹介します。

命題

以下の条件を満たすと$H$は部分群である。

 $$a,b \in H \Rightarrow a\cdot b^{-1} \in H $$

（証明）

$H$は空集合ではないので、少なくとも１つの要素$a\in H$を持つ。仮定から　$1= a\cdot a ^{-1} \in H$が言える。

次に、任意の要素　$b\in H$をとる。再び、仮定を使うと　$b^{-1}= 1\cdot b^{-1} \in H$がいえる。

以上より、$H$がそれ自体として群になることがわかった。QED

## 同値関係に関する補足

数学全体で重要な概念の一つとして「同値関係」があります。

定義

関係　$x\sim y$が以下の条件をみたすとき、同値関係という。

1. $x\sim y \iff y\sim x$
2. $x\sim x$
3. $x\sim y, y\sim z \Rightarrow x\sim z$

同値関係は通常のイコール（$=$）の一般化になっています。同値関係の例として有名なのは整数の余りでしょうか。

例

$x,y \in \mathbb{Z}$とする。このとき、

$$ x\sim y \iff x-y \text{ が３で割り切れる} $$

と定義すると$x\sim y$は同値関係になる。

このように、ある集合$E$上に同値関係が定義されると、その同値関係により集合は*分割*されます。

「分割」とは、その集合を互いに交わらない部分集合の和集合として表すこと。

なぜなら、

$$ E_{x}:=\\{y\in E \mid x\sim y \\}$$

とおくと、

$$ E=\cup_{x\in E}E_{x},\quad E_{x}\cap E_{y}=\phi\quad  (x!=y)$$

となるからです。

ここで、$E_{x}$とは$x$と同値関係になる要素を全て集めた集合であることに注意して下さい。


上記の「３でわった余り」の同値関係では、整数全体の集合が以下のように分割されます。

| 条件      | 要素        |  
| ------------- |:-------------:| 
| ３で割り切れる     | $\cdots -3,0,3,6,9\cdots$ | 
| ３で割ると１余る| $\cdots -2,1,4,7,10,\cdots$     |   
| ３で割ると２余る | $\cdots -1,2,5,8,11,\cdots$     |    

さきほどの記法では、

$$
E_0=\\{\cdots   -3,0,3,6,9\cdots \\},
\\
E_1=\\{\cdots -2,1,4,7,10,\cdots\\},
\\
E_2=\\{\cdots -1,2,5,8,11,\cdots\\},
$$

ということです。


このように、集合に同値関係が入ると、その同値関係で集合が分割されるということは非常に大切なポイントだと思います。

命題

$G$を群、$H\subset G$を部分群とする。このとき、$G$上に関係$x\sim y$を

$$x\sim y \iff xy^{-1}\in H$$

と定義すると、これは同値関係になる。

（証明）

1.
$$
x\sim y \iff xy^{-1}\in H \iff 
 yx^{-1}=(xy^{-1})^{-1}\in H \iff y\sim x.
$$

2.

$x\cdot x^{-1}=1\in H$より、$x\sim x$.

3.

$x\sim y , y\sim z \Rightarrow xy^{-1}\in H, yz^{-1}\in H$に注意。このとき、
$xz^{-1}=(xy^{-1})(yz^{-1})\in H.$ QED

ここまで準備すると、ラグランジュの定理が証明できます。ただ、今日はこのへんで終わりにしておきたいと思います。最後までお読みいただきありがとうございました。
Python: ラプラス変換（数式通り実装してみた）

# はじめに

## 目標

今回は以下の[ラプラス変換](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%97%E3%83%A9%E3%82%B9%E5%A4%89%E6%8F%9B)の数式を眺めながら実装してみた.

${\displaystyle F(s)=\int _{0}^{\infty }f(t)\mathrm {e} ^{-st}\mathrm {d} t}$

また, タイトルの通りpythonコードと数式を対応させながら実装していく.
※注意: 比較できる実装を見つけられず, 正しく実装出来たかの検証はしていない

# 準備

まず最初のおまじない.これで, πやeなどを使ったり, 求めた値をグラフ化できる.

```python
%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt
```

# 関数fの定義

今回は以下の部分はsin波を用いる事にします.

${f(t)}$

ここは以下のように書くとfがsin関数になります.

```python
f = np.sin
```

tを与えるとちゃんとsin(t)の値が出力される.

```python
>>> t = np.pi / 2
>>> f(t)
1.0
```

# 上限とdtの設定

本来はそのまま以下の数式のように0から∞まで扱いたいのですが・・・

${\displaystyle \int _{0}^{\infty }f(t)\mathrm {e} ^{-st}\mathrm {d} t}$

さすがに無限は扱えないので, 上限とdtの値を設定します.（妥協・・・）
今回は上限を100, dt=0.001とします. そして以下で0から100まで0.001間隔で変化する数列Tが作れます.

```python
dt = 0.001
max_t = 100
T = np.arange(int(max_t / dt)) * dt
```

この数列を関数fに与えてsin波を作ってみると以下のような感じ.

```python
plt.plot(T, f(T))
plt.show()
```

結果　ちゃんとできてそうですね.
![sin.png](https://qiita-image-store.s3.amazonaws.com/0/365961/79c6c94e-fb52-ca98-afda-a4e2dad975f0.png)

# 関数Fの定義
ここまで出来たらF(s)はlambda式を使ってさくっと書けます.
（数式まんまなのでわかりやすい・・・かな？）

```python
F = lambda s: np.sum(f(T) * np.e**(-s * T) * dt)
```

そして以下の式が完成！ρ(・ω・、)

${\displaystyle F(s)=\int _{0}^{\infty }f(t)\mathrm {e} ^{-st}\mathrm {d} t}$

いぁ・・・∞じゃないからこうかな(´・ω・｀)

${\displaystyle F(s)=\int _{0}^{100}f(t)\mathrm {e} ^{-st}\mathrm {d} t}$

最後にsが1~100まで変化した時, F(s)がどのように変化するか見ておきます.
map使ってサクッと作った方が良いのですが・・・F(s)を順番に求めてるのが分かりやすいのであえてfor文で.
ついでにmap使った書き方はコメントで載せておく.

```python
S = range(1, 100)
N = []
for s in S:
    N.append(F(s))
plt.plot(S, N)
# plt.plot(S, list(map(F, S)))
plt.show()
```

![F.png](https://qiita-image-store.s3.amazonaws.com/0/365961/a1ebe8cf-a6b1-f3d4-3e69-4a87c3865024.png)

# まとめ
今回は[ラプラス変換](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%83%97%E3%83%A9%E3%82%B9%E5%A4%89%E6%8F%9B)の数式を眺めながら実装してみた.
未検証で正しく実装出来たかは分からないため, 今後検証は行いたい.

またwikiをみると
ラプラス変換は, 関数 f (t) にいったん e−σtθ(t) を乗じてからフーリエ変換する操作であると考えることができる

${\displaystyle F(s):=F(\sigma ,\omega )=\int _{-\infty }^{\infty }\theta (t)f(t)\mathrm {e} ^{-\sigma t}\mathrm {e} ^{-i\omega t}\,\mathrm {d} t{\overset {s=\sigma +i\omega }{=\!=}}\int _{0}^{\infty }f(t)\mathrm {e} ^{-st}\,\mathrm {d} t}$

っとあるので, 今後は以前実装したフーリエ変換にかけてみたいρ(・ω・、)
（同時に検証もできるかな？）
[ver 1.2] Git でよく使われるコマンドにイラストによる説明を加えて1枚のチートシートにまとめてみた

# 本題のチートシートはこちら

## PNG

![GitCheat Sheet.png](https://qiita-image-store.s3.amazonaws.com/0/70342/47f54fc4-60fa-9384-ba77-0ef4c0ed958d.png)

## SVG

* https://d.kuku.lu/6b5cc7b0a9 から DL できます

# 作った理由

* git って他人に概念を説明するのって難しいし、自身も何度も反復させないと定着しなかったなあという感覚を持っていたので作ってみました:slight_smile:

# 所感

* こちらの Git チートシートですが、この中に盛り込めなかった内容で 第2段 を作成しようか考え中です
* 皆さまのオススメの便利コマンドとか、この内容は必須だろ！的なものがあればをご教示いただければ幸いです
* もし誤りがあれば、作者の心が折れない程度にご指摘いただければ幸いです:bow:

# あとがき

ここまで反響を頂けるとは思っておらず、嬉しい限りです・・・本当にありがとうございます・・・！！
また、図は全て自作です。図における言語は英語、説明は日本語、と言う形に統一しました。（吹き出し部分だけ日本語になっていたのでこちらは修正しました。）
このチートシートだけで git を理解できるようにしようとしたわけではなく、他の方々が書いていらっしゃる記事なども併せながら、ある程度分かってきたけど備忘として・・・ぐらいの感覚で見ていただければと思っております。反復する上で、皆さまの理解の助けになればと言う思いで作りました、伝わりきれなければ私のスキル不足です。。精進します。。

特に直方体による概念が適切かどうかについて、自身の経験としてはこうイメージする事で覚える事ができた頭の中を書き出したものなのですが、フィードバックを頂く中で適切だったのかと自分の中で考える機会も頂きました。ツリーによる表現の方が厳密に説明するのであれば適切だとは考えております。

このように、本チートシートの中には怪しい表現もあるかと思います。なので鵜呑みにしすぎず、試してみて覚えられそう、と感じていただけたならば使っていただけると幸いです。

# 参考

* [Git - Documentation](https://git-scm.com/doc)
* [逆引きGit _ サルでもわかるGit入門【プロジェクト管理ツールBacklog】](https://backlog.com/ja/git-tutorial/reference/)