OmniAICreator/Qiita-1.07M huggingface dataset:
TeraTermマクロ：Cisco機器 SSH接続してsh-run取得したらexit(sh-runマクロ)

# TeraTermマクロ：Cisco機器 SSH接続してsh-run取得したらexit(sh-runマクロ)

更新日：2019/08/17
    - マクロ内容を大きく変更（log出力フォルダ構成、誤操作防止、マクロダイアログ非表示 等）

+ 本ページはWindows10でCisco機へSSH接続するためのTeraTermマクロを記載しています。
+ 本業がプログラマでは無いため、レベル的には高く無いと思います。
+ 実機での検証はしていますが、環境によって内容が変わることがあるため参考にする際は自己責任でお願いします。
+ Cisco機器へのSSH接続とsh-runログ取得をするTeraTermマクロです。


## 検証に使用した機器
+ __Ciscoルータ__：CISCO892-K9 (IOS-Version 15.2(4)M3)
+ __検証用PC__：Window10 (TeraTerm Version 4.100)


### マクロファイル(.ttl)の置き場
__フォルダ(任意)__
&nbsp;&nbsp;<font color="Gray">※本ページのマクロファイルは、どこへ置いても動作するため指定無し。</font>

__ファイル名__
&nbsp;&nbsp;<font color="Gray">※本ページのマクロ内容を「任意の名前.ttl」として格納してください。</font>



## ログ保存名および保存フォルダ
__ログ保存場所__
C:\teraterm\log

__ログ保存名__
HOSTNAME_YYYYMMDD_HHMMSS_sh-run.log
&nbsp;&nbsp;<font color="Gray">※「HOSTNAME」はマクロファイル内で指定。</font>



## TeraTermマクロの内容

### マクロファイル(.ttl)

```python:sh-run_Cisco-RT_HOSTNAME_ssh.ttl

;# ■概要
;# ・Cisco機器へSSH接続し、show run取得後にTeratermを閉じます。
;# 
;# ・ログ出力場所
;#       C:\teraterm\log
;# 
;# ・ログ名
;#       \HOSTNAME_YYYYMMDD_HHMMSS.log
;# 
;# ■接続情報の設定(環境に合わせて修正)
HOSTS_IP = '192.168.0.1'
HOSTNAME = 'hostname'
LOG_USER = 'login-user'
LOG_PASS = 'login-pass'
ENA_PASS = 'enable-pass'
SHOW_COM = 'show running-config'

;# ～～～～以下は修正不要です。～～～～
;# ■変数等の作成
;## ログ保存先指定
LOG_PATH = 'C:\teraterm'
LOG_FILE = LOG_PATH
strconcat LOG_FILE '\log'

;## ログファイル名の設定
getdate DATETIME '_%Y%m%d_%H%M%S_sh-run.log'
FULLPATH = LOG_FILE
strconcat FULLPATH '\'
strconcat FULLPATH HOSTNAME
strconcat FULLPATH DATETIME

;## プロンプトの作成
PP_CISCO = HOSTNAME
strconcat PP_CISCO '#'

;## SSH接続コマンド作成
COMMAND = HOSTS_IP
strconcat COMMAND ':22 /ssh /2 /auth=password /user='
strconcat COMMAND LOG_USER
strconcat COMMAND ' /passwd='
strconcat COMMAND LOG_PASS
;#↓設定ファイルを機器毎に分ける場合の設定ファイル指定（今回はOFF）
;strconcat COMMAND ' /F=C:\teraterm\ini\test.ini'
;#↓SSHでの初回接続確認をOFFにするオプション（今回はOFF）
;strconcat COMMAND ' /nosecuritywarning'


;# ■マクロの実行～終了
;## 「MACRO ダイアログ」ウィンドウを非表示 ※デバッグ時はOFFにする。
show -1

;## ログ保存先のフォルダが無ければ作成。
foldersearch LOG_FILE
if result = 0 then
    foldercreate LOG_FILE
    if result <> 0 then
        messagebox 'Folder Error'
        end
    endif
endif


;## SSH接続
connect COMMAND

;## キーボード入力抑制（誤操作防止）開始
enablekeyb 0

;## 接続判定(接続が出来たか確認）
if result <> 2 then
    messagebox 'Connection Error'
    end
endif


;## ログの取得開始
loginfo logfilename
if result <> -1 then
   logclose
   logopen FULLPATH 0 1
else
   logopen FULLPATH 0 1
endif
sendln ''

;## 「Tera Term: ログ」ウィンドウを非表示
showtt 6

;## enable, ter len 0
wait '>' 
sendln 'enable' 
wait 'Password:' 
sendln ENA_PASS

wait PP_CISCO
sendln ''
sendln 'terminal length 0'
mpause 200
sendln 'terminal exec prompt timestamp'
mpause 200


;## showコマンドの取得
sendln ''
wait PP_CISCO
mpause 200
sendln SHOW_COM
pause 3    ;#show tech等の長いコマンドはpauseを長くする
sendln ''
sendln ''

;# コマンド終了後にTeraTermを閉じる
sendln ''
wait PP_CISCO
mpause 500
sendln 'exit'
unlink

```

以上です。
線同士の重なりを防ぐ対策

# リストに枠線をつけたい

リストを1pxの太さの枠線で囲みます。

```
li{
  border:solid 1px #EEE;
}
```

上記のコードだけだと枠線が重なり、線の太さが2pxになってしまいます。

<img width="307" alt="スクリーンショット 2019-01-27 17.44.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/331247/cc33ae9b-e040-95ec-25cb-a75db4535058.png">

# 重なりをなくす

下記のコードの li + li  はリストの二つ目以降という意味になります。
つまり二つ目以降は上の枠線を消すということです。

```
li{
  border:solid 1px #EEE;
}

li + li {
  border-top:none;
}
```

# なくした結果

上記のコードを記述することで線の重なりをなくすことができました
<img width="301" alt="スクリーンショット 2019-01-27 17.59.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/331247/edd09fff-f733-a6d7-4498-cafcef780281.png">

# 最後に
他にもっと良い方法がありましたら教えてください
TeraTermマクロ：Cisco機器 SSH接続してログ取得の自動開始(Loginマクロ)

# TeraTermマクロ：Cisco機器 SSH接続してログ取得の自動開始(Loginマクロ)

更新日：2019/08/17
    - マクロ内容を大きく変更（log出力フォルダ構成、誤操作防止、マクロダイアログ非表示 等）

+ 本ページはWindows10でCisco機へSSH接続するためのTeraTermマクロを記載しています。
+ 本業がプログラマでは無いため、レベル的には高く無いと思います。
+ 実機での検証はしていますが、環境によって内容が変わることがあるため参考にする際は自己責任でお願いします。
+ Cisco機器へのSSH接続とログ取得開始をするTeraTermマクロです。


## 検証に使用した機器
+ __Ciscoルータ__：CISCO892-K9 (IOS-Version 15.2(4)M3)
+ __検証用PC__：Window10 (TeraTerm Version 4.100)


### マクロファイル(.ttl)置き場

__フォルダ(任意)__
&nbsp;&nbsp;<font color="Gray">※本ページのマクロファイルは、どこへ置いても動作するため指定無し。</font>

__ファイル(任意)__
&nbsp;&nbsp;<font color="Gray">※本ページのマクロ内容を「任意の名前.ttl」として格納してください。</font>



## ログ保存名および保存フォルダ
__ログ保存場所__
C:\teraterm\log

__ログ保存名__
HOSTNAME_YYYYMMDD_hhmmss.log
&nbsp;<font color="Gray">※「HOSTNAME」はマクロファイル内で指定。</font>



## TeraTermマクロの内容

### マクロファイル(.ttl)

```python
:Login_Cisco-RT_HOSTNAME_ssh.ttl

;# ■概要
;# ・Cisco機器へSSH接続し、ログ取得を自動開始します。
;# 
;# ・ログ出力場所
;#       C:\teraterm\log
;# 
;# ・ログ名
;#       \HOSTNAME_YYYYMMDD_HHMMSS.log
;# 
;# ■接続情報の設定(環境に合わせて修正)
HOSTS_IP = '192.168.0.1'
HOSTNAME = 'hostname'
LOG_USER = 'login-user'
LOG_PASS = 'login-pass'
ENA_PASS = 'enable-pass'


;# ～～～～以下は修正不要です。～～～～
;# ■変数等の作成
;## ログ保存先指定
LOG_PATH = 'C:\teraterm'
LOG_FILE = LOG_PATH
strconcat LOG_FILE '\log'

;## ログファイル名の設定
getdate DATETIME '_%Y%m%d_%H%M%S.log'
FULLPATH = LOG_FILE
strconcat FULLPATH '\'
strconcat FULLPATH HOSTNAME
strconcat FULLPATH DATETIME

;## プロンプトの作成
PP_CISCO = HOSTNAME
strconcat PP_CISCO '#'

;## SSH接続コマンド作成
COMMAND = HOSTS_IP
strconcat COMMAND ':22 /ssh /2 /auth=password /user='
strconcat COMMAND LOG_USER
strconcat COMMAND ' /passwd='
strconcat COMMAND LOG_PASS
;#↓設定ファイルを機器毎に分ける場合の設定ファイル指定（今回はOFF）
;strconcat COMMAND ' /F=C:\teraterm\ini\test.ini'
;#↓SSHでの初回接続確認をOFFにするオプション（今回はOFF）
;strconcat COMMAND ' /nosecuritywarning'


;# ■マクロの実行～終了
;## 「MACRO ダイアログ」ウィンドウを非表示 ※デバッグ時はOFFにする。
show -1

;## ログ保存先のフォルダが無ければ作成。
foldersearch LOG_FILE
if result = 0 then
    foldercreate LOG_FILE
    if result <> 0 then
        messagebox 'Folder Error'
        end
    endif
endif


;## SSH接続
connect COMMAND

;## キーボード入力抑制（誤操作防止）開始
enablekeyb 0

;## 接続判定(接続が出来たか確認）
if result <> 2 then
    messagebox 'Connection Error'
    end
endif


;## ログの取得開始
loginfo logfilename
if result <> -1 then
   logclose
   logopen FULLPATH 0 1
else
   logopen FULLPATH 0 1
endif
sendln ''

;## 「Tera Term: ログ」ウィンドウを非表示（今回はOFF）
;showtt 6

;## enable, ter len 0
wait '>' 
sendln 'enable' 
wait 'Password:' 
sendln ENA_PASS

wait PP_CISCO
sendln ''
sendln 'terminal length 0'
mpause 200
sendln 'terminal monitor'
mpause 200
sendln 'terminal exec prompt timestamp'
mpause 200
sendln '! OK.'

;# キーボード入力抑制（誤操作防止）解除
enablekeyb 1

```

以上です。
平成年表というWebサービスを5日で個人開発してリリースしました

# 平成年表というWebサービスを5日間で作ってリリースしました。
こんにちは、かつおです。本日、「[平成年表](https://heisei.me/)」というWebサービスを構想から5日間でリリースしました。選定した技術、助けられたQiita記事などなどを紹介したいと思います。
## つくったサービス
[平成年表](https://heisei.me/)
![sample1.a473b0f.png](https://qiita-image-store.s3.amazonaws.com/0/161023/4ad3d808-66b4-63a9-515b-750fc2f65abd.png)
* 気軽に平成の想い出を年表にして投稿することができます
* 自由なテーマで投稿できます
* 投稿した年表をSNSへシェアしたり、サイト上でコメントしたりして盛り上がれます
## サービスへの想い
平成がもう終わってしまいます。あと3か月です！！平成は本当にいろんなことがあったと思います。たぶん皆さんも同じだと思います。いろんな想い出を年表にして、みんなで懐かしんだり盛り上がったりしませんか？平成をあと少しだけ…
##使った技術
* vue.js => [フロント]
    * vue-router
    * vuex
    * vuetify
* firebase  => [バック]
    * Hosting
    * functions
    * firestore
    * Authentication
    
要はvue.js＋firebaseのみです。firebaseのfirestoreでデータを保存してます。サーバー回りを全部firebaseに寄せることでフロントの開発だけに時間を集中することができました。firebaseはほんと凄いよ。私なんてエンジニアといえるほどの実力ないので、多分この構成じゃないと開発するのは無理だっただろうなぁって思ってます。
##助けられたドキュメント
#### firebaseの公式ドキュメント  
firebaseはほんとうに公式ドキュメントが充実していて助けられました。
#### Qiita
https://qiita.com/zaru/items/829b4017a33df907f087
色々見ましたけど、とくにこちらの記事。平成年表はサーバーサイドレンダリングをやっていませんでした。リリース間際になって本番で色々と試していた時、Twitterカードが出ないことに気づいたんですね。SNSへシェアできるという手軽さを売りにしたかったのに、これは焦りました。この解決方法ってSSR化することが一般的なのだとは思うのですが、経験も知識もなく困ってたところ、この記事に出会いました。この記事では、SNS向けのリンクからのアクセスの場合、firebase Functionsにルーティングし、FunctionからSNSへ必要なタグだけ返すという実装方法を紹介いただいてます。ほんとに神記事でした。ありがとうございます。
## 5日間でリリースできた理由
### 1 Vue、firebaseの開発の手軽さ
ほんとうに手軽に開発できるのでオススメの組み合わせです。ただ全文検索などできない（別サービスと組み合わせれば可能）なのでやりたいこととスピード感との比較にはなるでしょう。vue.jsは長きに渡っていたDOMとの戦いを一切やらなくていいので、開発のストレスが本当に少なく、サクサクとUIを作り進めることができました。
### 2 機能を絞る
例えば、こんな感じで絞りました。
* ログインはTwitterのみ（facebookも実装したい）
* 投稿できるのはテキストのみ（画像も追加したい）
* 投稿者のみしか編集できない（共同編集機能も作りたい）
* 検索機能なし笑（新着順と人気順ソートのみ、タグもなし）⇒投稿が多いようなら何か実装する
* プロフィール編集機能なし笑　⇒Twitterのみの間はいいかなと...facebookログイン導入の際に実装かな。。
* デザインへのあきらめ（泣）
### 3 Twitterと嫁さんに宣言する
これは絶対にやったほうがいいでしょう。
### 4 平成自体のタイムリミット
のんびり作ってたら平成のタイムリミットに間に合わない！というプレッシャーも笑
## さいごに
なんとかリリースすることができました。作っている間は本当にワクワクすることができたなぁと思ってます。使ってくれる人が出てきてくれることを祈ります！よろしくお願いいたします。
GoogleCTF #beginners/misc-media-db

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/9797b9c9-6c70-c5e3-bbde-6a273992a20b.png)


#問題

https://capturetheflag.withgoogle.com/#beginners/misc-media-db

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/fbb86bbd-ce35-e082-3439-342072bd4bb5.png)


#解いてみた

通信先として書かれている以下にアクセスしてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/449adcfb-e9ce-9892-bf11-57ec3a41571a.png)

対話できるやつです。
歌手と曲を登録したり、ランダムに歌手を選んだりできるシステムのようです。

そして、添付ファイルをダウンロードして開いてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/136c448a-a538-875d-17f7-3f56c6e2d703.png)

Pythonのファイルでした。
内容を見る限り、さっきの接続先に置かれているPythonファイルっぽいので、このソースから脆弱な部分を見つけてflagをgetするという流れになりそうです。

ソースを見るとoauth_tokenというファイルに書かれているflagをoauth_tokensというテーブルに書き込んでいます。
歌手と曲はmediaというテーブルに書き込んだり読み出したりしているようです。

SQLインジェクションをどうやってやるかというところが問題な気がします。
SQL文を見てみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/de366648-3596-194e-793c-6c8beb1b9e8b.png)

2や3が一番手っ取り早そうですが、「'」を空に置換している処理があることがわかりました。
なので

```
' or 1 = 1 --
```

のようなことができないということです。

よく見ると1も置換しているものの「'」は置換していないことが分かります。
そして4を見ると歌手をselectして、その文字列でさらにselectしていることが分かります。

ということはやりたいことは以下の流れでしょうか。

- 1でSQLインジェクションできる文字列を歌手としてDBに保存する
- 4でその歌手をselectして、SQLインジェクションをして、flagをgetする。

音楽テーブルとflagのテーブルが異なるのでunionを使用する必要がありそうです。
テーブルのカラムについてはCREATE TABLEのところを見れば書いてあるのでわかりました。
まとめますとどのようなSQLを投げたいかというと

```
SELECT artist, song FROM media WHERE artist = '' union SELECT 1, oauth_token FROM oauth_tokens --
```

というような感じでしょうか。
実際にやってみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/6b9aeaf6-7e38-e876-0466-226d12a91957.png)

できました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/17681/6d30fb11-de56-2231-0895-85c2add3a28f.png)
pip install poencv-pythonで入れたopenCVのバージョンを変更する

# tl;dr

下記のコマンドでインストールされるopenCVのバージョンが'4.0.0'となりました。
私の既存の環境では、3.x.xで開発していたため、新しい環境でopenCVを入れ直すと、エラーが出るようになりました。
暫定措置でopenCVをダウングレードすることにしました。その手順を記載します。

```
pip install opencv-python
```

# コマンド

uninstallしてバージョン指定して再インストールします。この例では、3.4.5を入れています。

```
pip3 uninstall opencv-python
pip3 install opencv-python==3.4.5.20
```
RailsでRedisを使ってpvカウント

#初めに
railsでredisを使ってpv数をカウントする機能を実装してみました。

#設定

redisをインストールする

```
gem 'redis-rails'
```


bundle install

#実装

controllersのconcernsに

count_pv.rbファイルを作って

中に

```ruby 
module CountPv
    extend ActiveSupport::Concern

    def count_pv(action,controller)
        redis = Redis.new
        count = redis.get "count_#{controller}_#{action}"
        redis.set "count_#{controller}_#{action}", count.to_i + 1
        p redis.get "count_#{controller}_#{action}"
    end 
end 
```


pvカウントしたいコントローラーで


```ruby:users_controller.rb
class UsersController < ApplicationController
  include CountPv

  def index
    count_pv("index", "users")
  end

  def index_a
    count_pv("index_a","users")
  end 
end

```



みたいにする。

これでカウントできる。



#終わりに

redisの使い方がわからないんですがこれって

redis-railsをbundle installすればredisって勝手に起動するんですかね？

あとログが全くでないのはデフォルトなのかな？


なんのログも出ないけど一応使えてるのが気持ち悪いし起動しなくても使えるからほんとにredis使えてるのか不安になる（笑）
Ruby

C:/Rails/asagao/config/routes.rb:7:in `block in <top (required)>': undefined method `get' for main:Object (NoMethodError)

---以下、routes.rb
Rails.application.routes.draw do
  root "top#index"
  get "about" => "top#about", as: "about"
end

 1.upto(18) do |n|
  get "lesson/step#{n}(/:name)" => "lesson#step#{n}"
	end
---

--以下、コントローラー
class LessonController < ApplicationController
	def step1
		render plain: "こんにちは、#{params[:name]さん}"
 end

---
Cents OS 6.x系　/etc/resolv.confが更新されない

# 再起動もしくはネットワークの再起動で/etc/resolv.confが元に戻ってしまう場合

NetworkManagerが原因

```
# setup
```
![スクリーンショット 2019-01-27 18.04.49.png](https://qiita-image-store.s3.amazonaws.com/0/266239/f6fb20ab-7174-912b-1d9f-214df62a2f17.png)

![スクリーンショット 2019-01-27 18.05.05.png](https://qiita-image-store.s3.amazonaws.com/0/266239/4b807264-5f8a-490f-a2a3-3ecb2aef5ccf.png)


NetworkManagerを無効にして再起動する
Windows10 Pro x64 + Python3 + pyodbc より Ubuntu 16.04 + SQL Server2017 Express にアクセスする

#目的
Windows10 + Python3 + pyodbc -> Ubuntu 16.04 + SQL Server2017 Express にアクセスする
まずは SELECT から
対象テーブルは[Ubuntu 16.04 x64 + SQL Server2017 Express で AdventureWorks2017.bak を復元してみる](https://qiita.com/tabizou/items/ec4153fcaae6bb022592)とする
##環境変数の追加
Windows版のVsCodeでPythonを使う場合、出力ターミナルで日本語の文字化けが発生する
これを回避する手段はいくつかあるようだけど、自分は環境変数に以下を追加して回避している
　変数:PYTHONIOENCODING
　値：UTF-8
##pyodbcのインストール
$ sudo pip3 install pyodbc
##サンプルコード
```python:test01.py
import pyodbc
# Windows Add env PYTHONIOENCODING = UTF-8 & restart vscode
# Some other example server values are
# server = 'localhost\sqlexpress' # for a named instance
# server = 'myserver,port' # to specify an alternate port
server   = 'tcp:xxx.xxx.xxx.xxx' 
database = 'AdventureWorks2017' 
username = 'demo' 
password = 'demo' 
constr = 'DRIVER={SQL Server};SERVER=' + server + ';DATABASE=' + database + ';UID=' + username + ';PWD=' + password
cnxn = pyodbc.connect(constr)
# Create a cursor from the connection
cursor = cnxn.cursor()

cursor.execute("SELECT * FROM Person.Address")
row = cursor.fetchone()
if row:
    print(row)
```
##参考にしたのは以下のサイト
[Python SQL ドライバー - pyodbc](https://docs.microsoft.com/ja-jp/sql/connect/python/pyodbc/python-sql-driver-pyodbc?view=sql-server-2017)
作成希望一覧

作成しようとしているツール
・指定された日付以前のファイル一覧を出力する機能（1/27）

レビュー、お試し中ツール
・定期的に出勤管理の月末処理依頼を全員にメールする機能（1/27）
　https://qiita.com/SequencePalladium/items/eb7a87b2063bcfb6b960

作成完了したツール
（問題なさそうになったらこっちに移動）
Twitterログイン認証で404(forbidden)や401(Unauthorized)エラーがでたときの対処法

##はじめに
TwitterのAPIを使ってTwitterログイン機能を作っているのですが、認証エラーでハマったのでメモ。

今回は
**・404(forbidden)**
**・401(Unauthorized)**
の対処法を解説していきます。

##401エラーの対処方
<img width="1036" alt="Action_Controller__Exception_caught.png" src="https://qiita-image-store.s3.amazonaws.com/0/242611/e5a05dda-7ee6-64ca-76bd-71b158d12414.png">

401エラーとは、認証エラーのことで、リクエスト側に問題があるということです。

**原因: API keyが間違っていた。**
`consummer key`や`consumer sercret`が間違っている可能性があるので、[developerページ](https://developer.twitter.com/en/apps)でe`key`を間違えて打っていないか確かめて見ましょう。

```config/initializers/devise.rb
  config.omniauth :twitter, (consummer key), (consumer sercret)
```

さて、これが治ると次は403エラーにたどり着きました。

##403エラーの対処法
<img width="996" alt="Action_Controller__Exception_caught.png" src="https://qiita-image-store.s3.amazonaws.com/0/242611/8234afda-772b-3341-6f82-d604b84a7b60.png">

403エラーは、閲覧が禁止されてると言う意味です。

**原因: callbackのurlと`localhost`のurlが一致していなかった。**

[developer画面](https://developer.twitter.com/en/apps)に移動し、アプリの詳細画面に移動して、登録したcallbackのurlを確認してみましょう。

<img width="1155" alt="Twitter_Developers.png" src="https://qiita-image-store.s3.amazonaws.com/0/242611/7f5e27ff-c80a-5cc5-0876-2d0a0dfc0e68.png">

この赤で囲ったurlの部分と、local環境で使いたいurlが一致しないとエラーを吐いてしまいます。

`rails routes | grep callback`で、callbackのurlを確認します。

```
user_twitter_omniauth_authorize GET|POST /users/auth/twitter(.:format)          omniauth_callbacks#passthru
user_twitter_omniauth_callback GET|POST users/auth/twitter/callback(.:format) omniauth_callbacks#twitter
```

ここでは`users/auth/twitter/callback`に飛ばしたいので、

callback URLは`http://127.0.0.1:3000/users/auth/twitter/callback`としました。

と、ここまでで解決する人もいたりいなかったりすると思うんですが、個人的に一部ハマったポイントとしては、**起動しているローカル環境のurlと、developerで設定したcallback_urlが完全一致してない**と同じように`403エラー`が発生してしまうところです。

つまり、
callback_url　→　
`http://127.0.0.1:3000/users/auth/twitter/callback`
ローカル環境で立ち上げたurl→
`http://localhost:3000/users/auth/twitter/callback`
はエラーになります。


正しくは、
callback_url　→
`http://127.0.0.1:3000/users/auth/twitter/callback`
ローカル環境で立ち上げたurl　→
`http://127.0.0.1:3000/users/auth/twitter/callback`
です。

このように、**ドメイン名も**設定した`callback_url`と一致させるようにしましょう。

##確認事項
・keyが間違っていないか？
・developerのcallback_urlが間違っていないか？
・ドメイン名も一致しているか？

ここであげたもの以外にもエラーの原因となるものはたくさんあるかと思います。
単に`API key`が間違っていただとか、リクエストに問題があることも多いので、焦らずひとつづつ潰していきましょう。
Pythonista3でブラウザで開いているURLのタイトルを取得する

iPhoneで見ていたページを共有する方法は幾つかあるが、その場で共有するならともかく、一旦、どこかで保持してから共有するのは、どうも使いにくい。下の３枚の画像は①SafariからiOS標準のメモ帳で記録し、②メモ腸からTwitterで共有する、という流れだが③でURLの情報が失われている。
![01.png](https://qiita-image-store.s3.amazonaws.com/0/33389/346a8f9c-42cf-55df-9d52-775c68a26b3b.png)

といって、URLだけ保存していると、QiitaのURLのように、あとでURLを見て何のページかわからない。そこでPythonista3でURLにタイトルを付与するというスクリプトを書いてみた。利用イメージとしては、下の３枚の画像のように①事前にPythonistaを有効にしておき、②Safariの共有で「Run Pythonista Script」を起動して、③URLを送るスクリプトを送るという流れである。

![02.png](https://qiita-image-store.s3.amazonaws.com/0/33389/250ba750-218c-3d6c-054b-1cdbc3555abc.png)

URLはappex.get_url()もしくはクリップボードから取得し、タイトルの取得にはBeautifulSoupを使っている。

```py
import sys
import appex
import urllib.request
import clipboard
from bs4 import BeautifulSoup

def main():
	if appex.is_running_extension():
		url = appex.get_url()
	else:
		url = clipboard.get()
	
	try:
		html = urllib.request.urlopen(url=url)
		soup = BeautifulSoup(html, 'html.parser')
		title = soup.title.string
		print(title+'\r\n'+url)
		clipboard.set(title)
	except:
		print(url)
		print(sys.exc_info()[0])
		pass
	
if __name__ == '__main__':
	main()
```

後半に`print(title+'\r\n'+url)`で書いているようにタイトル、URLの順で画面表示され、クリップボードにタイトルが格納される。

単にタイトルを取得するだけでなく、あんなことやこんなことにも応用できそうだ。
備忘録 関数ポインタ,関数ポインタの配列(C言語)

#関数ポインタって
関数のアドレスが入った変数のようなものです。
忘れないようにメモっておきます。

#関数ポインタの使い方
##宣言の方法
```c:ex_01.c
int (*hoge)(int,int);
```
こんな感じに宣言できます。
関数型なども決めちゃいます。

##代入の方法
```c:ex_02.c
int fuga(int x,int y){//関数の宣言
     //何らかの処理
     return z;
}

int main(){
    int x,y;
    int (*hoge)(int,int);
    hoge=fuga;//ポインタに関数fugaを代入
    return 0;
}
```
こんなかんじに代入できます。

##使い方
```c:ex_02.c
int fuga(int x,int y){//関数の宣言
     //何らかの処理
     return z;
}

int main(){
    int s,t;
    int (*hoge)(int,int);
    hoge=fuga;
    //付け足したコード　はじめ
    int ans=hoge(s,t);
    //おわり
    return 0;
}
```
int型変数`ans`を宣言して`fuga(int,int)` の戻り値を代入しています。

#関数ポインタの配列
関数ポインタは配列にすることができます。
##宣言
```c
int (*fn_p[5])(int,int);
```
これでint型関数のアドレスが５つ入る配列ができました。

##代入
```c
(*fn_p[5])(int,int)={sum,diff,pro,quo};
//関数は宣言したものとします。
```
関数名を入れることで代入することができます。

##使い方
```c
(*fn_p[5])(int,int)={sum,diff,pro,quo};
//関数は宣言したものとします。

int ans=fn_p[0](5,3);
//関数sumを呼び出し(第一引数に５、第二引数に３)
```
このようにして呼び出します。

##活用法
「"関数ポインタの配列"なんて意味不明なもの何に使うんだ」
と思うかもしれませんが添字の数値で関数を呼び出すことができます。
これによりループ処理などに応用することが可能です。
[Rails]モデルにScopeを定義し、コントローラーで呼び出す

下記のように同じようなクエリメソッドを繰り返す場合、可読性も保守性も非常に悪いです。そんな時にはモデルにScopeを定義することで同じ記述を一つのメソッドとして使用することができます。

```ruby:notes_controller.rb
    @manga_notes    = Note.where(category: 0).includes(:user).order("created_at DESC").limit(9)
    @column_notes   = Note.where(category: 1).includes(:user).order("created_at DESC").limit(9)
    @novel_notes    = Note.where(category: 2).includes(:user).order("created_at DESC").limit(9)
    @photo_notes    = Note.where(category: 3).includes(:user).order("created_at DESC").limit(9)
    @sound_notes    = Note.where(category: 4).includes(:user).order("created_at DESC").limit(9)
    @business_notes = Note.where(category: 5).includes(:user).order("created_at DESC").limit(9)
```

これらをScopeに定義することで一つのメソッドとして定義することができます。

```ruby:note.rb
    scope :recent, -> { includes(:user).order("created_at DESC").limit(9) }
```
```ruby:notes_controller.rb
    @manga_notes     = Note.where(category: 0).recent
    @column_notes    = Note.where(category: 1).recent
```
モデルで定義したScopeをコントローラーで呼び出しています。

```ruby:note.rb
    enum category: { マンガ: 0, コラム: 1, 小説: 2, 写真: 3, サウンド: 4, ビジネス: 5, ライフスタイル: 6 }
    scope :search_with_category, ->(category) { where(category: category) }
    scope :recent, -> { includes(:user).order("created_at DESC").limit(9) }
```
```ruby:notes_controller.rb
    @manga_notes     = Note.search_with_category(0).recent
    @column_notes    = Note.search_with_category(1).recent
    @novel_notes     = Note.search_with_category(2).recent
    @photo_notes     = Note.search_with_category(3).recent
    @sound_notes     = Note.search_with_category(4).recent
    @business_notes  = Note.search_with_category(5).recent
    @lifestyle_notes = Note.search_with_category(6).recent
```
上のようにスコープ同士をマージさせて使用することが可能です。また、スコープに引数を渡すことも可能で、上の例ではenumで定義しているカテゴリ番号を引数をして渡すことで、Noteモデルからそのカテゴリを持つレコードを取得します。
これからKotlinを始めるJavaエンジニアの方へ

Java開発者に向けたKotlinハンズオン用にまとめた資料です。
ハンズオンの概要は[こちら](https://javado.connpass.com/event/112816/)

[Java開発者に送るKotlinことはじめ](https://qiita.com/watanave/items/9cd217e927df27eab088)

[Java開発者に送るKotlinのClass](https://qiita.com/watanave/items/4c8f3a74dcc77ac13aa3)

[Java開発者に送るKotlinの関数とラムダ](https://qiita.com/watanave/items/0f270b3a62c929529d35)

[Java開発者に送るKotlinのNull安全](https://qiita.com/watanave/items/d56bebe53671635dd605)

[Java開発者に送るKotlinのClass part.2](https://qiita.com/watanave/items/1386d450f11ddf7d6c09)

[Java開発者に送るKotlinのスコープ関数](https://qiita.com/watanave/items/9a2cd5e8def7efdb9f91)

[Java開発者に送るKotlinのジェネリック](https://qiita.com/watanave/items/d3d5b529b4c66ff3c872)

[Java開発者に送るKotlinとの相互運用Tips](https://qiita.com/watanave/items/c2f08e67db2fd7af9602)

## 個人的なKotlinのオススメ資料
* JetBrainsの公式 https://kotlinlang.org/docs/
* Kotlinスタートブック (著) 長澤太郎
* Kotlinイン・アクション (著) Dmitry Jemerov
* Kotlin koans https://play.kotlinlang.org/koans/
Java開発者に送るKotlinのClass

Java開発者の方に向けて、Kotlinのクラスについて書きます。

# クラスの定義
`class`キーワードに続いて、クラス名を記述します。
Dogクラスを定義してみます。

```kotlin
class Dog {
}
```

クラスの継承やインターフェースの実装はコロンに続けて記述します。
先ほどのDogクラス、Animalクラスを継承させてみます。

```kotlin
class Dog: Animal() {
}
```

さらに、Walkableインターフェースを実装してみましょう。

```kotlin
class Dog: Animal(), Walkable {
}
```

# プロパティ
Kotlinのクラスはプロパティを持つことができます。
これは**Javaのフィールド、ゲッター、セッターを合わせたもの**です。
DogクラスにnameというString型のプロパティを宣言してみましょう。
`var`キーワードを使います。

```kotlin
class Dog {
    var name: String = "pochi"
}


val dog = Dog()
val aName = dog.name // ゲッターとして動作
dog.name = "taro" // セッターとして動作
```

読み取り専用にしたければ、`val`キーワードを使いましょう。

```kotlin
class Dog {
    val name: String = "pochi"
}

val dog = Dog()
val aName = dog.name // ゲッターとして動作
dog.name = "taro" // コンパイルエラー！
```

`val`キーワードは再代入不可のため、クラス内部からも値を変更できません。
クラス内で変更可能とする場合は`private set`キーワードを使います。

```kotlin
class Dog {
    var name: String = "pochi"
        private set
    
    fun updateName(newName: String) {
        this.name = newName
    }
}

val dog = Dog()
dog.updateName("taro")
```

ここで、「いやいや、JavaでフィールドをPublicにしたのと一緒でしょ？」と思った方は鋭いです。
Kotlinのプロパティはゲッター、セッターそしてフィールドが明確に分かれています。
詳しくは[こちら](https://qiita.com/watanave/items/1386d450f11ddf7d6c09#プロパティとバッキングフィールド)

## プライマリコンストラクタ
Kotlinのコンストラクタは少し変わった位置に書きます。

```kotlin
class Dog constructor(/* ここがコンストラクタ */) {
}
```
`constructor`キーワードは省略できます。アノテーションを付加する場合などは省略できません。
この位置に書くコンストラクタを**プライマリコンストラクタ**と呼びます。
コンストラクタと言っても、記述できるのはプロパティとコンストラクタの引数リストです。


### コンストラクタでプロパティ定義する
コンストラクタ引数に`var`や`val`キーワードをつけると、そのままプロパティになります。

```kotlin
class Dog(var name: String) {
}
```

↑は↓と同義です。

```kotlin
class Dog(name: String) {
    var name: String = name
}
```

## イニシャライザ

プライマリコンストラクタは、コンストラクタ引数とプロパティの宣言が出来ました。その他、クラスの初期化時に行う処理はイニシャライザに記述できます。

```kotlin
class Point(val x: Int, val y: Int)
class Size(val width: Int, val height: Int)

class Regtangle(val origin: Point, val size: Size) {
    val area: Int

    init {
        this.area = this.size.width * this.size.height
    }
}

val rectangle = Regtangle(30, 10, 10, 20)
println(rectangle.area)
```

クラス`Regtangle`はコントラクタに原点と大きさを受け、イニシャライザで面積を計算しています。

## セカンダリコンストラクタ

プライマリコンストラクタがあるのでセカンダリコンストラクタもあります。
セカンダリコンストラクタは複数定義することができます。
セカンダリコンストラクタは`:`に続けてプライマリコンストラクタを呼び出す必要があります。

```kotlin
class Point(val x: Int, val y: Int)
class Size(val width: Int, val height: Int)

class Regtangle(val origin: Point, val size: Size) {

    constructor(x: Int, y: Int, width: Int, height: Int): this(Point(x, y), Size(width, height))

}
```

クラス`Regtangle`に原点とサイズを個別のパラメータで受け取るコンストラクタを追加しました。

# JavaとKotlinを見比べてみる

JavaでDogクラスを定義します。
nameとageというフィールドがあり、それぞれゲッターとセッターが定義されています。

```java
public class Dog {
    
    private String name;
    private int age;
    
    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    
}
```

これをKotlinで書くと？

```kotlin
class Dog(var name: String, var age: Int)
```

これだけで済んでしまいます。
バスのオープンデータに触れたら頭がたんぽぽになったのでAPIを作った

# はじめに
🌻←これは**ひまわり**

## 2020/02/08追記
今更**OpenTripPlanner**を知りました
穴があったら潜って冬眠したい

## 📖 前提条件
General Transit Feed Specification (GTFS)とGTFS Realtimeを理解していること

## 今回触れる事
- GTFS-JP
- GTFS Realtime

## 今回触れない事
- GTFS
- たんぽぽ

### なぜ触れないのか
GTFSには**GTFS**と**GTFS-JP(標準的なバス情報フォーマット)**と**Googleが拡張しているGTFS**が存在し、日本では主に**GTFS-JP**が使われているから触れない

正直紛らわしいからGoogleのやつに統一して欲しい

## 🚩 この記事の目標
頭がたんぽぽになる前にAPIを使って欲しい事を伝える

# 🔗 利用するデータ
宇野バス: http://www3.unobus.co.jp/opendata

## 宇野バスのデータを使用する理由
~~ライセンスめっちゃ緩いから~~
普段乗っているのが宇野バス🚌であり、現実とデータの比較がしやすいから

# オープンデータに関して
## 出会い
筆者は宇野バスのデータを約3年間研究してきた
その最中に出会った仕様との出会いをここに書いておく

### 🕛 リアルタイムデータの更新頻度
公式には
> 約20秒ごとに更新

と書かれているが、実際は3~25秒程の周期で更新されている
*※2017年に__CSVデータ__で計測した時の値*

### 🕓 リアルタイムデータの遅延
宇野バスのリアルタイムデータは現実から15~30秒程遅れている
~~果たしてこれはリアルタイムと言って良いのだろうか~~

### ✅ データの信頼性
運行中のバスがリアルタイムデータに無い時がある

リアルタイムデータに無い時は、そもそもバスからデータが送られていないらしい
**※中の人に聞いた**

### 📍 位置情報の誤差
たまに5m程離れた所に居る事がある

これは一般のスマートフォンで起こる位置ズレと同等

### 📝 その他メモ
本記事とは関係ないが、宇野バスのCSVデータは更新時に一瞬空になる
これはデータ内に`//LAST`が存在するかどうかで更新処理が完了したか分かるらしい
**※これも中の人に(ry**

## ❗ 伝えたい事
オープンデータは所詮オープンデータなので、割り切って使おう

# 🍳 GTFSの調理法
まずは刺身にたんぽぽを（うわなにをすくぁwせdrftgyふじこlp

## 🚌 バスの位置情報と運行ルートの取得方法
これは**GTFS Realtime**に含まれている**[VehiclePosition](https://developers.google.com/transit/gtfs-realtime/reference?hl=ja#message-vehicleposition)**を使えば取得出来るのだけれど、方法が2通りある

1. `VehiclePosition.trip.trip_id`を利用する方法
2. `VehiclePosition.trip.route_id`と`VehiclePosition.trip.start_date`と`VehiclePosition.trip.start_time`を利用する方法

1は簡単、2の場合はGTFSを使って`trip_id`を導き出さなければならない、面倒くさい

そして、`trip_id`を使って**[stop_times.txt](https://developers.google.com/transit/gtfs/reference/?hl=ja#stop_timestxt)**内を検索すると運行ルートが出てくる

**が**、実際は**[calendar.txt](https://developers.google.com/transit/gtfs/reference/?hl=ja#calendartxt)**とかの処理もしないといけない、面倒くさい

## とにかく面倒くさい
実際GTFSを調理している時に頭がたんぽぽになりかけたし、記事を書くのが面倒くさくなった

後で気づいた事だが、宇野バスのオープンデータはちゃんと整備されてて凄く扱いやすい
他社のオープンデータはマジで頭たんぽぽになる
~~特に両備、時刻表が存在しない停留所を何故残しているんだ~~

# 👄 愚痴だけでは終われない
面倒くさい事をしなくていいようにAPIを作りました
https://github.com/come25136/Atom

Atomは静的データとリアルタイムデータに対応しており、データの自動更新も行ってくれます

また、リアルタイムデータは[socket.io](https://socket.io/)を使用してWebSocketでデータが自動的に流れてきます(環境によってはポーリング)
**※リアルタイムデータに関しては利用方法が定まっておらず、ドキュメントには記載していません**

現時点では公開サーバーが無い為、試しに使ってみたいという方が居れば [@come25136_air](https://twitter.com/come25136_air)までメッセージを送ってください
開発用の不安定なサーバーで良ければ、リンクをお教えします

## 余談
運賃の計算APIとかは用意していないので、必要であればプルリク送ってください
[wordpress]更新エラー

# wordpressの更新時に以下のエラーが発生
```
WordPress を更新
https://downloads.wordpress.org/release/ja/wordpress-5.0.3.zip から更新をダウンロード中…

更新を展開しています…

いくつかのファイルをコピーできないため、最新版のインストールができません。これはたいていの場合、ファイルのパーミッションが適切でないことが原因です。: wp-admin/includes/update-core.php

インストール失敗
```

# 原因として考えられること
- ファイル・ディレクトリの所有権の問題
- ファイル・ディレクトリの書き込み権の問題
- サーバのセキュリティ設定

# 所有権の確認
- 以下のように、ファイル・ディレクトリのオーナーをwebサーバのユーザ：グループに変更する。

```nginxの場合
cd ドキュメントルート
chown -R nginx:nginx wordpress
```

```apacheの場合
cd ドキュメントルート
chown -R apache:apache wordpress
```

# 書き込み権の問題
- wordpressをインストールしたディレクトリ以下の権限を以下のように変更する

```
chmod -R 755 wordpress
```

# SELINUXの問題
- 以下のコマンドがあれば、状態を確認する。

```
$> getenforce
Enforcing
```

```
Enforcing: SELinuxが有効
Disable: SELinuxが無効
Permissive: SELINUXは有効だが、アクセス制限は行わず警告を出力
```

- 一旦、以下のコマンドで無効にして、インストールを実行してみる

```
setenforce 0
```

- インストールが成功したら以下のコマンドで、再度有効にしておくこと

```
setenforce 1
```
Date Range Pickerでnull(空白)許容する

DateRangePickerでnullを許容したくてなかなかできずハマった。

nullを許容する場合
`autoUpdateInput: false`
をオプション指定すればnullになるが、日付を指定した場合に反映されない。
コールバック関数で指定してあげれば反映される。



```js

$(function () {
    $(function () {
        "use strict";

        moment.locale("ja");
        $('#selector').daterangepicker({
            singleDatePicker: true,
            calender_style: "picker_3",
            format: 'YYYY/MM/DD',
            //初期値NULLにする＆NULL許容する
            autoUpdateInput: false,
            locale: {
                cancelLabel: 'Clear'
            },
        },
            //autoUpdateInputが入っていると日付指定できなくなるのでcallback関数で指定する
            function (date) {
                $('#selector').val(date.format('YYYY/MM/DD'));
            }
        );
    });
});
```


参考
http://www.daterangepicker.com/#ex5
未成熟な開発組織の開発/進捗/課題管理ツールを変更する(その3 導入後)

### 前回から
前回以降、以下の点で変更があった。

- 新たなプロジェクトが始まった
- スクラムマスターが入った

### 結果
trelloがめちゃくちゃ使われることになった。
というのも、新しいプロジェクトは仕様変更がかなり多く、これだとWFだとまずいなということになりアジャイルでやっていくことになった。
それに加え、スクラムマスター経験者が入社したというのも大きい。

### 他にも
実はスクラムマスターが入る前からtrelloがプロジェクトで活発に動き始めていた。
導入にGoサインを出した上司が活発にタスクをカードに切ってくれて、使ってくれているおかげでチーム内にtrello でタスク管理するということが根付きつつあった状態であった。

### 結論
#### 最初は誰かが引っ張らないと浸透しない

今回は自分＋上司が率先して使っていた。
動きが活発じゃないとあまり関心を持ってもらえず、「どうせ更新されてないし見なくてもいいだろ」となりがち。
こまめに更新することによって、チーム全体がそのツールを見る/使う習慣を付けさせていく。

#### 使うための心理的障壁を下げていくことが大事

これについては主に以下のことを行った

- 使う際のルール・ガイドラインをきちんと決める
- 使う際の例を挙げる(どの単位でカードを作るか等)
- 積極的に人にカードを作らせる・運用させる

人間、慣れてないことをするのが非常にストレスになる。
なので強制的に慣れさせることで、使用への心理的な抵抗を無くさせた。

#### 手段が目的になってはならない

これはもちろん大前提の話。
今回の目的は以下であった。

- 進捗確認しやすくしたい
- 個々のタスクを可視化したい
- なおかつイケてる感じにしたい
- コストはあまりかけられない

という点より、決してtrelloが使いたいからtrelloを使っているわけではない。
より良いツールがあればそちらに乗り換えるつもりではいる。


ということで、ひとまず完結させました。
他に何かしら動きや、改善点あれば書いていこうと思います。
Python手遊び(wget)

#この記事、何?

pythonを使って、Windowsでhttpsからファイルを取得するという話。

ちょっと前の記事でWindowsでwget代わりにPowerShellでInvoke-WebRequestしてた。
ただ、https相手だとうまくいかなかった。
それをトラブルシュートするよりpythonしたほうが楽っぽかったので頼ってみた、という話。

#どういう人向け?
まあ・・・自分あて。
クローニングとかもいろいろ潤沢な時代に「httpsあてでもファイル取れるわ～」って言われても、ね?
でもQiitaの記事を取れるバッチファイルも付けたのでよければどうぞ。

#参考にした記事

結局は他力本願なんですけどね。
Alice1017さん、ありがとうございます。

■Pythonでバイナリファイルを保存する
https://qiita.com/Alice1017/items/34befe8168cd771f535f

#やったこと

Pythonスクリプト1つ、呼出用のバッチが一つ。


```python

#17-01.py
#Qiitaの投稿ID(?)をもらって、Markdownをファイル化
import sys
import shutil
import requests
args = sys.argv
id = args[1]
URL = 'https://qiita.com/siinai/items/' + id + '.md'
print(URL)
filepath = id + '.md'
print(filepath)
res = requests.get(URL, stream = True)
with open(filepath, 'wb') as fp:
    shutil.copyfileobj(res.raw, fp)

```

```
rem 呼び出し用のバッチファイル
rem python 17-01.py [qiita-id]
python 17-01.py 4deb8529a2224a238b91
python 17-01.py 7b4196f4271448093a1f
python 17-01.py 457977b61b6c4cb15ac4
...

```

#感想
まあ・・・普通。
Pythonってこんなに簡単なのね・・・
いいわぁ♪
Slackにポケモンの絵文字を追加する

# 概要
Slack内にポケモンが大好きなメンバーがいたので、ポケモンの絵文字を追加しました。
これで、ちょっと幸せになれるはず。

# 作業環境
* MacOS Mojave
* Google Chrome

# 作業手順
## 1. 絵文字画像を入手
Slack絵文字向けのポケモン画像をgithubで提供している方がいるのでそちらから入手。
ありがたい:joy:
https://github.com/Templarian/slack-emoji-pokemon

## 2. 画像名を変更する
Slackのメッセージ入力欄からポケモンの絵文字が検索しやすくなるよう、
Macのターミナルから画像ファイル名を以下のフォーマットに一括変更する。
```pokemon-{name}.png```

```terminal
cd slack-emoji-pokemon-master/emojis
rename 's/^/pokemon-/' *.png

---
変更前：zubat.png
変更後：pokemon-zubat.png
```

* 画像ファイル名が絵文字の検索名になる。
* MacOSに```rename```コマンドがインストールされていない場合、```brew install rename```でインストールする。  
MacOSにHomebrewがインストールされていない場合、インストールする。  
[macOSにHomebrewをインストール](https://qiita.com/pypypyo14/items/4bf3b8bd511b6e93c9f9)

## 3. Slack絵文字一括登録用のアプリをChromeにインストール
Slackは絵文字を１つずつしか登録できないため、ポケモンの数分、登録作業を行う必要がある。
それだと大変なので、絵文字を一括登録できる拡張プラグインをChromeにインストールする。

[Neutral Face Emoji Tools](https://chrome.google.com/webstore/detail/neutral-face-emoji-tools/anchoacphlfbdomdlomnbbfhcmcdmjej)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/269537/475546d2-645b-f871-ea7a-62bc626e0434.png)

## 4. Slack絵文字を登録
``` https://{team_name}.slack.com/customize/emoji ```にアクセスし、ポケモン画像をドラック&ドロップしてSlackに登録する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/269537/5e64ee66-2d32-ca87-4510-07277afd0a6a.png)

## 5. 動作確認
こんな感じで絵文字入力できるようになる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/269537/158a8711-70df-2c1f-3329-ed98fa1e7cd6.png)

↑ポケモン名が英語圏のものなので、名前検索しにくいです。
画像ファイル名を日本名で登録すれば、検索しやすくなると思います。

# 参考
[Slack絵文字にポケモン導入](https://qiita.com/ksyunnnn/items/7cd149744d51d4359663)
ReflectionException  : Class ClassName does not exist

Seederとmigrationのクラスをいじってて名前が気に入らなくて、コマンド使わずに、手でリネームしたらクラスがないと怒られた。


```bash
ReflectionException  : Class NameSeeder does not exist

// classがないと言われたらこれを打つ。
composer dump-autoload
```

composer dump-autoloadが面倒くさい Laravel
https://qiita.com/ytake/items/98c438d6a006f61df54a
S3 SELECTの Where like で絵文字を部分一致検索できない

# 起こったこと

絵文字入りのCSVファイルに対し、S3 Selectでクエリを投げてみます。

``` csv:アップロードしたCSV
v_name,oshimark
周防パトラ,🦀❤️
蒼月エリ,🥀💎
島村シャルロット,♣️❄️
西園寺メアリ,🍼🔮
堰代ミコ,🔱🍏
```


``` sql:SQL
select * from S3Object s where s.v_name = '周防パトラ' -- -> 周防パトラ,🦀❤️
select * from S3Object s where s.v_name like '%パ%' -- -> 周防パトラ,🦀❤️
select * from S3Object s where s.oshimark = '🦀❤️' -- -> 周防パトラ,🦀❤️
select * from S3Object s where s.oshimark like '%❤️%' -- -> 周防パトラ,🦀❤️
select * from S3Object s where s.oshimark like '%🦀%' -- -> 結果がありません
```

ん？


# サロゲートペア文字が原因（っぽい）

Where likeでうまく結果をとれた「❤️」は、UTF-16のコードポイント上で U+2764 と U+FE0F (異体字セレクタ) ️で構成された文字に対し、「🦀」は U+1F980 のサロゲートペア文字です。
同じくサロゲートペア文字である「💎」「🍏」なども、Where likeで取得することができませんでした。

一方で、非サロゲートペア文字＋異体字セレクタで構成された「♣️」などはちゃんとで取得できました。

AWS側のバグなのでしょうか・・・。


# 対策

絵文字がそのまま使えない以上、別のフォーマットで保存するほか無さそうです。
私の場合は、URLエンコードをかけた形式で保存することで対応しました。

```csv
v_name,oshimark
周防パトラ,%F0%9F%A6%80%E2%9D%A4%EF%B8%8F
蒼月エリ,%F0%9F%A5%80%F0%9F%92%8E
島村シャルロット,%E2%99%A3%EF%B8%8F%E2%9D%84%EF%B8%8F
西園寺メアリ,%F0%9F%8D%BC%F0%9F%94%AE
堰代ミコ,%F0%9F%94%B1%F0%9F%8D%8F
```
Microsoft Edge での Kaliダウンロード と VirtualBox での Kali起動 が失敗した話 と その解決方法

# はじめに
[ハッキング・ラボ](https://www.shoeisha.co.jp/book/detail/9784798155302)で体験学習するにあたり、導入にて少々つまづきました。その際の解決方法記事です。

本記事と同様なトラブルで悩んでいる方は、環境によってWindows設定やBIOS設定の名称が違うことがあると思います。適宜読み替えたり、似た機能を推測してトラブル解決へ向けて試行錯誤して頂ければと思います。

体験学習導入でつまづいてしまい、そのまま諦めてしまう方が少しでも減ってくれれば幸いです。

# 体験学習環境
|  項目  |  スペックなど  |
| ---- | ---- |
|  PC  |  Lenovo V310  |
|  CPU  |  Intel Corei3-6006U 2.00GHz  |
|  BIOS(UEFI)  |  Phoenix SecureCore Technology |
|  OS  |  Windows10 Home  |
|  メモリ  |  8GB(オンボード4GB + 増設4GB)  |
|  ブラウザ１  |  Microsoft Edge 17.17134  |
|  ブラウザ２  |  Google Chrome 71.0.3578.98  |

# つまづきポイント
## Microsoft EdgeでKali Linuxのダウンロードが行えない  
[Kali Linux Vbox 64 Bit Ova](https://www.offensive-security.com/kali-linux-vm-vmware-virtualbox-image-download/)ファイルのダウンロードで、`Microsoft Edge`はブラウザ上に`OVAファイル`の中身を表示してしまいダウンロードが行えませんでした。
<img width="767" alt="edge ova.png" src="https://qiita-image-store.s3.amazonaws.com/0/246506/40144539-30f1-b749-3f17-ab3c56417259.png">
### 解決方法
単純ですが、`Chrome`を利用してダウンロードを行いました。
## VirtualBoxでKali Linuxが起動しない
`Kali Linux`ダウンロード後、`VirtualBox`へのインポートを行い`Kali Linux`を起動すると、`VitualBox`からエラーメッセージが表示されたり、`Kali Linux`が黒画面のまま先に進まないような状態となりました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246506/87d8a700-242f-d99c-c86e-74f37c690142.png)

### 解決方法
`Windows10`機能の設定と`Bios`機能の設定が影響していました。私の環境で`Kali Linux`が起動した設定内容を記載します。

|  種類  |  設定名  |  設定内容  |
| ---- | ---- | ---- |
|  Windows10  |  Windows ハイパーバイザプラットフォーム  |  未チェック  |
|  BIOS  |  Intel Virtual Technology  |  Enabled  |

+ Windows10 - ハイパーバイザプラットフォーム -
`[コントロールパネル]` --> `[プログラム]` --> `[プログラムと機能]` --> `[Windowsの機能の有効化または無効化]` から `[Windows ハイパーバイザプラットフォーム]`設定を行います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/246506/aac4e986-5586-47e0-a0b2-8e0722d721c7.png)

+ BIOS - Intel Virtual Technology -

`[Windows10起動状態からShiftキー押しながら再起動]` --> `[トラブルシューティング]` --> `[詳細オプション]` --> `[UEFI ファームウェア設定]` --> `[再起動する]` から`BIOS`に移行させ`[Intel Virtual Technology]`設定を行います。
※BIOS起動方法はいくつかあるようですが難なくBIOS起動行えた方法を記載

+ Windows ハイパーバイザプラットフォーム と Intel Virtual Technology 設定の関係性

| kali Linux 起動結果 |  Windows ハイパーバイザプラットフォーム  |  BIOS Intel Virtual Technology  |  状態  |
| ---- | ---- | ---- | ---- |
|  OK |  未チェック |  Enabled  |  正常起動  |
|  NG |  未チェック |  Disabled  |  仮想マシン"Kali-Linux-2018.4-vbox-amd64"のセッションを開けませんでした  |
|  NG |  チェック  |  Enabled  |  黒画面のまま進まない  |
|  NG |  チェック  |  Disabled  |  仮想マシン"Kali-Linux-2018.4-vbox-amd64"のセッションを開けませんでした  |

# 最後に
序盤でつまづきそうな人に少しでもお役に立てる情報であればと思います。
Vagrant で ローカル環境を汚さずにサクッと Open-FaaS を試す

# TL; DR
- OpenFaaS というサーバーレス環境を立てられる OSS があります
- いろいろ試してみるのに、Vagrantに閉じ込めた環境を用意しました

リポジトリ: https://github.com/ryskiwt/openfaas-in-vagrant

# 使い方
- ほとんど上のリポジトリに書いてあるので割愛

# ちょっと解説

## provision.sh

- Vagrantfile から `config.vm.provision "shell", path: "provision.sh"` で呼び出します

- docker, docker-compose のインストール
    - Vagrantfile に以下のように記述するだけでも `docker` と `docker-compose` は入りますが、今回は使いたいバージョンが入らなかったので、プロビジョニング用のshellを書いています。

```
  config.vm.provision :docker
  config.vm.provision :docker_compose
```

- open-faas の環境構築
    - 複数のNICがある場合は、追加でオプションの指定が必要（ `docker swarm init --advertise-addr=192.168.33.40` ）
    - open-faas の環境構築は、 公式リポジトリを clone して `./deploy_stack.sh --no-auth` だけで終わり

# 参考リンク集
- github
    - https://github.com/openfaas/faas
- 公式のドキュメント
    - https://ericstoekl.github.io/faas/
- OpenFaaS の APIドキュメント
    - https://github.com/openfaas/faas/tree/master/api-docs
- OpenFaaS の ワークショップ（日本語）
    - これだけで、構築〜CLIツールの使い方まで一通りわかります
    - https://github.com/openfaas/workshop/tree/master/translations/ja
- Vagrant内にDocker環境をつくるのに参考にさせていただきました
    - [VagrantでDocker環境を自動構築する。 | Technology is endless journey](http://tec-jn.com/vagrant/create-doker-environment-for-vagrant)
- function template のリポジトリ
    - function の雛形の定義が格納されている
    - https://github.com/openfaas/templates
    - https://github.com/openfaas-incubator （この配下に `xxx-template` のリポジトリがいくつか）
- watchdog のリポジトリ
    - watchdog 書いてしまえば魔改造も可能らしい
    - 旧版: https://github.com/openfaas/faas/tree/master/watchdog
    - 次世代版: https://github.com/openfaas-incubator/of-watchdog
AWSでハニーポットを動かして、GuardDutyも動かしてみた

#冬休みの自由研究的な
そんなノリでやってみました。
結果は正直微妙でしたが、個人的にGuardDuty使ったのは初めてだったので、いい勉強になりました。
長くなりそうなのでいくつかの記事に分けて掲載しようかと思いますが、最終的にはこれ↓がたくさん出たよって話です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/254738/38b9ccb1-ce98-d27a-fbcb-d151c185da62.png)


よろしければお付き合いください。

##AWSでハニーポット用インスタンスを準備する
まずはT-Potを動かすためのインスタンスを作成します。
無料枠にも収まらないので、コストも意識しながら進めていきます。
慣れている方なら、記事は読まずに以下のスペック以上のEC2インスタンスを作成してください。
セキュリティグループでは、現時点では自身のIPのSSH接続(22/TCP)のみ許可します。

- Ubuntu 18.04 LTS x86-64
- t2.large
- 120GB SSD



**AWSでハニーポット（T-Pot）用インスタンスを準備する**
https://qiita.com/yifey/items/f91d1a02714ba7a563ba

##T-potのセットアップ

**EC2にハニーポットのT-pot 18.11をインストール**
https://qiita.com/yifey/items/757715169b800fce3656

本家T-potのページはこちら。

**T-Pot 18.11**
https://github.com/dtag-dev-sec/tpotce

##GuardDutyのセットアップ
GuaradDutyのセットアップは驚くほど簡単でした。
しかもトライアルで無料でしたし。AWS先生ありがとうございます！
数年前にクラウド上で初めてEC2インスタンス建てたときの手軽さと同じかそれ以上の感動です笑
サンプルログの出力や、CloudWatchとの連携などを確認してみました。

**GuardDutyの有効化**
https://qiita.com/yifey/items/e260ee318a5cd8f566ce

##ロ、ログがでた！が、、
TBH

##まとめ
GuardDutyを使い始めるまでの簡単さには驚きました。
IDSとして、ネットワークベースで不審な動作を検出できるのは良いですね。
ただ、ハニーポット上の出力と比べると、情報量がかなり違うので、
これだけに頼るのはちょっと難しいのかなという印象もありました。（もともとそういう意図で設計されてはいないと思いますが。）
GuardDutyのFindingsベースでLambdaの関数を動作させることもできるので、近未来的にはIRの自動化とかもできるのかな。
【Rails】ActionMailerで画像のURLを絶対パスで表示させる

ActionMailerで送信したメールに絶対パスで画像を表示させたい中でハマった。

Mail内で以下のように表示させるために

```html:index.html
 <img src="http://myfullappurl.dev/assets/myimage.png">
```

development.rbにて以下のようにメーラーを設定

```ruby:development.rb
config.action_controller.asset_host = 'myfullappurl.dev'
config.action_mailer.asset_host = config.action_controller.asset_host
config.action_mailer.default_url_options = { host: 'myfullappurl.dev' }
```

しかしmail内でのhtmlでは

```html:index.html
 <img src="//myfullappurl.dev/assets/myimage.png">
```

とプロトコルが表示されない。railsコードに

```ruby:asset_url_helper.rb
URI_REGEXP = %r{^[-a-z]+://|^(?:cid|data):|^//}
```

有効なActionMailer URIを定義する正規表現があるようで

```ruby:development.rb

config.action_controller.asset_host = 'myfullappurl.dev'
config.action_mailer.asset_host = 'http://myfullappurl.dev'
```
にしなければならない。  
https://codeday.me/bug/20180720/199491.html  
https://stackoverflow.com/questions/29887668/how-to-use-image-url-in-rails-to-show-images-in-production
Install Keycloak 4.8.3 on CentOS 7

![keycloak_wallpaper_1024x768.png](https://qiita-image-store.s3.amazonaws.com/0/348116/8a9b3035-8128-f5ea-598e-e1410d1069d8.png)

# 2020/10/23 追記

記事内容は、[Zenn.dev](https://zenn.dev/ymasaoka/articles/install-keycloak-483-centos-7) へ移すことにしました。
~~当面の間、内容はこちらにも記載しておきますが、そのうち削除するつもりです。~~

Qiita での記事内容は削除しました。
Zenn.dev 側で掲載していた内容と同じものを公開しているので、そちらをご確認ください。

- [Install Keycloak 4.8.3 on CentOS 7](https://zenn.dev/ymasaoka/articles/install-keycloak-483-centos-7)
コマンドプロンプトのプロンプト部分を非表示にしたい！

## はじめに
 (環境:Windows10 Home Edition)
Linuxだとこの内容に関することはごろごろ出てくるのに、windowsだとあんまり見つからなかったので、Qiitaを書く練習がてらまとめてみました。間違いなどあればご指摘をお願いします。
## プロンプトとは
コマンドプロンプト(以下cmdと表記)で、`cd` するとだらだら長くなっていくやつ(下の画像の > の左側部分)
![prompt.png](https://qiita-image-store.s3.amazonaws.com/0/285841/e8446147-75b4-bf1b-c7b2-5f3fbe14ade6.png)
(実際はこのような意味のわからない`cd`をすることはない。しかし私の場合、ディスプレイの右半分にcmd,左半分にその他アプリケーションという使い方をしてるので、`cd`すると徐々に見にくくなる。)

## プロンプトの設定を確認する
cmdを起動 →`set` と入力するといろいろ出てくる(一部抜粋)
![whenSet.png](https://qiita-image-store.s3.amazonaws.com/0/285841/7be4950e-cb76-eb32-3135-c8f62c64753a.png)
画像の赤線部分**PROMPT=\$P\$G** が現在プロンプトに施されている設定である。
(詳しくは [プロンプトの変更](https://www.adminweb.jp/command/display/index2.html) 参照)

## 本題：プロンプトの設定を変更しよう
- 一時的な変更→cmdで`set PROMPT=$G` とすれば、> だけが表示される。ただし、ウィンドウを閉じてしまうとその設定は失われる
- 永続的な変更→以下で手順を説明   
  1.`Windowsキー+Pause/Breakキー`を押す  
  2.画面左側の`システムの詳細設定`をクリックし、`詳細設定タブ`を開く  
  3.`環境変数`をクリック  
  4.以下の番号にそって設定する(ただしこれはシステム環境変数にPROMPTが無い場合。既にある場合はPROMPTを選択してから`編集`する)
![setting.png](https://qiita-image-store.s3.amazonaws.com/0/285841/7bf47bc8-d93f-722c-5834-65b7430e9ddf.png)

以上の手順を終えた後にシステム環境変数に**PROMPT \$G**が追加されていたら設定完了、もう一度cmdを開いて、プロンプトが非表示になっていたら成功である。

## あとがき
鬱陶しかったから非表示にしたものの、ぱっと見で分からないのは意外と不便だと思った(本末転倒)
災害発生時における信用できる発信源からの情報取得〜首相官邸が緊急地震速報をツイートしたら、LINEに通知させる方法〜

![スクリーンショット 2019-01-27 15.48.35.png](https://qiita-image-store.s3.amazonaws.com/0/199441/e01d46b2-ae82-896e-3121-68fbd1ab371e.png)


## この記事で書くこと
災害発生時における信用できる発信源からの情報取得の方法の考察


## 災害発生時の課題
**災害発生時における信用できる発信源からの情報取得は難しい**
（例1）2018年9月4日 台風21号
（例2）2018年9月6日 北海道胆振東部地震

上記災害に共通すること：
→ 災害発生直後に停電が発生しテレビからの情報取得が難しい
→ SNSでシェアされる情報にはデマが含まれる

（災害発生時 SNSで拡散したデマの事例）
2016年4月14日・16日 熊本地震：「ライオンが脱走」
2018年6月18日 大阪北部地震：「京阪電車脱線」「京セラドームの屋根に亀裂」

**解決すべき課題**
<font color="red">**災害発生時に信用できる発信源から情報を取得できること**</font>

## 課題解決の方法
IFTTT Twitter LINE を連携させて、公的機関からの情報を取得

（具体例）
そこで首相官邸（Twitter: @Kantei_Saigai）が`【緊急地震速報】`を含むツイートを送信した時に、LINEに通知するように設定

```txt:首相官邸（@Kantei_Saigai）がTwitterで緊急地震速報を送信した際の文面例
【緊急地震速報】
北海道道南で地震　北海道で強い揺れ
強い揺れに警戒してください。
発表日時 5日08時59分
対象地域：胆振地方中東部、日高地方西部、日高地方中部、石狩地方南部、空知地方南部、石狩地方中部、石狩地方北部
```

**Twitterで単に首相官邸のアカウントをフォローすればいいのでは？** と思われるかもしれません。緊急地震速報以外のツイートも送信されるため、IFTTTで抽出することで緊急地震速報を受信した時だけ通知を送るように今回は設定しました。

## 前提条件
IFTTT・Twitter・LINEのアカウントはすでに準備されていること

## 設定
1 . IFTTTの `New tweet from Search` を設定
`Kantei_Saigai`が`【緊急地震速報】`を含むツイートを送信した時に発火するトリガーを設定

<font color="red">**2019.01.29 追記
`"Kantei_Saigai" "【緊急地震速報】"` のトリガーは首相官邸のツイートをリツイートしたものも抽出します。より正確には `From:Kantei_Saigai 【緊急地震速報】` と設定すると良いとのご連絡をいただきました。ご指摘いただきありがとうございます。</font>**


ポイント： "Kantei_Saigai"と"【緊急地震速報】"の間は半角空ける
<img width="375" alt="IMG_2941.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/199441/d018562c-3c59-3bec-0822-5233138f8562.png">

Message欄で通知文面を編集できる
<img width="375" alt="IMG_2942.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/199441/d2c83d9f-6ef6-4e56-ea67-c03c39197a6b.png">



2 . トリガーが発火したら、LINEに通知を送る`Send Message`を設定


## 流れ図
![スクリーンショット 2019-01-27 16.19.48.png](https://qiita-image-store.s3.amazonaws.com/0/199441/846e8789-e9cd-1f78-98cf-c40b2463dea4.png)

## この方法の課題
**<font color="red">速報性がない</font>**
首相官邸のツイートからLINEに通知されるまで時間がかかる。今回紹介した方法は、あくまでも災害発生時に信用できる発信源からの情報を取得することが目的。


**実際に緊急地震速報が発令された際の通知結果**
2019年5月10日 08:48発生 日向灘（最大震度：5弱）
2019年5月10日 09:38 LINEに通知
<img width="375" alt="IMG_3251.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199441/b3387427-9f22-2269-ef54-28e552c29fd3.png">


## 応用
①検索条件の変更
例１：緊急地震速報が大阪府を対象に発令された時だけ通知 
`From:Kantei_Saigai "緊急地震速報" ("近畿" OR "大阪")`

例2：大津波警報・津波警報・津波注意報が発令された時
`From:Kantei_Saigai （"大津波警報" OR "津波警報" OR "津波注意報")`

②通知先を指定したメールアドレスやSMSに設定することも可能


## 感想
・1からコードを書かなくても設定でき、予想していた以上に簡単。
・誰でも情報を発信できる時代だからこそ、（特に災害時は）信用できる発信先から情報を取得することが求められている。
・ただし情報を待つのではなく、**<font color="red">自分が危険と感じた際には自分の判断で逃げることも必要</font>**
年賀状宛先自動入力をMicrosoft Excel & Word for Macで無料で作る


作成日：2019年1月27日

### はじめに

紙媒体の年賀状を個人間で送り合う文化も薄れてきたように感じましたが、最近再び結婚式などを機に友人から年賀状が届くなるようになりました。今後の作業効率を考えて、年賀状の宛先の自動入力ソフトを馴染みにエクセルとワードで作ってみました。

### 補足

Windows版ワードは、Mac版ワードと異なり、「はがき宛名面印刷ウィザード」があるので、この記事に記載しているやり方とは異なる方法で作成することになります。
Windows PCで年賀状の宛先自動入力をしたい方は、以下を参考にしてください。
-->「[年賀状の宛名印刷～ワープロソフト編](https://www.nengasyotyuu.com/nenga/npcnenga/npcnenga_05/)」


---

## 環境\&使用ソフト

Mac OS High Sierra (10.13.6)

- Microsoft Word 2018 for Mac
- Microsoft Excel 2018 for Mac

## テンプレート

**連名**が可能で、**会社関係**の方にも使用できるテンプレートになっています。

### 1.エクセルの準備

テンプレートを以下からダウンロードして、宛先を記入してください。

ダウンロード → [**エクセルテンプレート**](https://github.com/xenial-ovis/postcard/blob/master/postcard.xlsx)
(「View Raw」あるいは「Download」を押すとダウンロードできます）

#### エクセルテンプレートの説明

<img width="889" alt="excel_template.png" src="https://qiita-image-store.s3.amazonaws.com/0/287890/3a6664ac-fc37-02c8-06ee-ff6811c3c995.png">

- **氏**：苗字
- **名**: 名前
- **敬称**: 敬称 (様・御中)
- **名2**: 連名者の名前
- **敬称2**: 連名者の敬称 (様・御中)
- **会社**: 会社名
- **部署**: 部署名
- **郵便番号**: 郵便番号(「ー (ハイフン) 」なしの7桁）
- **住所1**: 県庁所在地・区市町村・番地
- **住所2**: アパート名・部屋番号

※ 記入する必要のない項目は、空欄にしておいてください。
※ 数字は、漢字で記入してください（そうでなければ横書きになります）。

### 2.ワードの準備

テンプレートを以下からダウンロードして、5つの手順で作成を進めてください。

ダウンロード → [**ワードテンプレート**](https://github.com/xenial-ovis/postcard/blob/master/postcard.docx)
(「View Raw」あるいは「Download」を押すとダウンロードできます）

※ ワードを開く際に以下のメッセージが出るときがあるので「OK」を選択してください。
<img width="416" alt="word_message.png" src="https://qiita-image-store.s3.amazonaws.com/0/287890/d0ab6556-d041-1ebc-4d5f-21ab975832d1.png">


#### ワードテンプレートと手順

<img width="1080" alt="word_template.png" src="https://qiita-image-store.s3.amazonaws.com/0/287890/e5da96b3-5d32-3e01-478b-5daf9ae693f1.png">

① 「差し込み文書」を選択する
② 「宛先の入力」＞「既存のリストの選択...」を選択し、先ほどダウンロードした「postcard.xlsx」を選択し、「2019年」シートを選択する
③ 赤枠に自分の住所などを直接記入する
④ プレビュー結果を選択して、差し込みがうまくいっているか確認する
<img width="900" alt="word_preview.png" src="https://qiita-image-store.s3.amazonaws.com/0/287890/51379616-d8b3-bca5-2246-4edd6a10bf92.png">
  
⑤ プレビュー結果がよければ、「差し込みと完了」＞「個々のドキュメントの編集...」を選択すると、別ウィンドウが開くので、一つ一つの宛先について微修正を行うことができる。編集が終われば、片面印刷すればOKです！

#### サンプル例 （プレビュー結果）

 <img width="349" alt="word_sample1.png" src="https://qiita-image-store.s3.amazonaws.com/0/287890/e2f81f5d-692c-3b95-0d38-426f8399fc42.png">
<img width="347" alt="word_sample2.png" src="https://qiita-image-store.s3.amazonaws.com/0/287890/7334ff6d-8900-f87a-2b6a-222be5d7d1ea.png">


----

以上になります。
質問・コメントなどあれば気軽にご連絡ください！
イベントハンドラーの活用例

## まえおき
今更なのですが、jQuery大好きなので、jQuery Advent Calendar 2013に参加したく、記事を書きました。ここ数年の間に便利なjavascriptフレームワークもたくさん出てきてjQueryは影が薄くなっているようですが、数多くの使い勝手の良いCSSフレームワークやCMSにはがっちり組み込まれているので、まだまだ必要な技術なんだなと思います。
今もBootstrap4を使ったコンテンツの開発をしているので、相変わらずjQueryは触り続けています。
今回は過去実装したイベントハンドラを使った小技（？）を書かせていただければと思っております。

## 背景
画像表示をする際に画像が全て揃っているかどうかわからない環境で画像がない時にはデフォルトの画像を表示したいときに実装した方法です。

## サンプル
<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="html,result" data-user="tomoka" data-slug-hash="aXNmeV" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="error sample">
  <span>See the Pen <a href="https://codepen.io/tomoka/pen/aXNmeV/">
  error sample</a> by tomo (<a href="https://codepen.io/tomoka">@tomoka</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

## 説明
### errorEvent
今回の処理にerrorEventを使いました。
errorEventが発火する状態には色々な状態があります。その中で、画像がない時に404エラーが帰ってきます。

参考：HTMLImageElement
https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement#Errors

よって画像がない時は"Null"が帰ってきて自動的にエラーを取得できるので、404エラーが起こった時のみ、画像を差し替えるように設定しました。

### 実装方法
実装方法はイベントハンドラーであれば自動的に帰ってくるのでjQueryのon()に実装できます。

参考：.on()
http://api.jquery.com/on/

```
$(".itemPhoto").on("error",function(){
  console.log("画像がありません");
})
```

404エラーを出すsrcを持つimgにイベントを付けます。
もちろん、通常のイベントなので、同じように設定できます。
書き方は、いつもと一緒。

## あとがき
まだまだjQuery書いてます。

イベントつながりで、最近、とても便利そうなjQuery Pluginを見つけました。
https://hammerjs.github.io/
APIに無いイベントの取得で過去にiOSとAndroidの検知の違いで苦労したことがあるため、Swipeを使いやすい形で実装できることに感動しました。（３本指のスワイプジェスチャー(MozSwipeGesture)ではなく１本指のSwipeに対応。）

書き方もこんな感じ。
http://hammerjs.github.io/getting-started/

```
var hammertime = new Hammer(myElement, myOptions);
hammertime.on('pan', function(ev) {
	console.log(ev);
});
```

使えるようになるイベントも豊富。
http://hammerjs.github.io/touch-action/

まだまだ、見つけたばかりで、documentの読み込みもできていなし理解もしていないので、実装予定があるので、実装してみたら報告したいと思います。
最後まで読んでいただきありがとうございました。