OmniAICreator/Qiita-1.07M huggingface dataset:
CloudFrontの地域制限を利用してコンテンツを配信する国を制限

[docomo Developer support](https://dev.smt.docomo.ne.jp/)の[@akatsukaha](https://qiita.com/akatsukaha)です

CloudFrontの地域制限を利用して，コンテンツを配信する国を制限することが出来ます．
これによりサービス提供したい国を限定することが出来ます．

今年ですとGDPRが施行され複数のサイトがEUからのアクセスを許可しないブロッキングを実施しました．施行されたばかりでどのようなペナルティが課されるか不透明なところもあり，EUのみをブロッキングするという手段をとったのだと思います．ここで記載した内容を用いることで，サービス提供したい国に限定することも出来ますし，特定の国々に対してのみブロッキングするという事もできます．

# **1. CloudFrontの事前準備**

オリジンをAPI Gatewayにした，CloudFrontを事前に準備しておきます．

API Gatewayへのアクセスし，レスポンス内容を確認

```bash
$ curl https://m6f4prq5ac.execute-api.ap-northeast-1.amazonaws.com/v1/aaa/bbb
```

```json
{"message":"hello world"}
```

CloudFrontのAPIにアクセスし，レスポンス内容を確認

```bash
$ curl https://d3f5bbalyot7v2.cloudfront.net/v1/aaa/bbb
```

```json
{"message":"hello world"}
```

# **2. CloudFrontで地域制限を設定**

下記のブログで詳しく設定方法が記載されています．

[Amazon CloudFront の地域制限を使用して、ホワイトリストまたはブラックリストを基に、特定の地域にいるユーザーにウェブコンテンツへのアクセスを制限また許可する方法を教えてください。](https://aws.amazon.com/jp/premiumsupport/knowledge-center/cloudfront-geo-restriction/)

まずは，日本と米国のみアクセスを許可するという設定にします．

[CloudFrontのコンソールに移動] で，対象となるDistribution(ディストリビューション)を選択

![00.png](https://qiita-image-store.s3.amazonaws.com/0/262328/a834378f-54de-eb9b-0c9e-70c1ab0c8089.png)

[Restriction(制限)] タブを選択して，[Geo Restriction]にチェックを入れ，[Edit(編集)] を選択

![01.png](https://qiita-image-store.s3.amazonaws.com/0/262328/f804e0ec-69a1-2fce-f4da-b859f5f4788a.png)

下記の通り選択

- [Enable-Restriction(有効化-制限)] から [Yes(はい)] を選択
- [Restriction Type(制限タイプ)] に対して、[Whitelist(ホワイトリスト)] または [Blacklist(ブラックリスト)] を選択．ここでは，日本と米国のみ許可する例として，[Whitelist(ホワイトリスト)]を選択します．
- [Countries(国)]から[JP(日本)]と[US(米国)]を選択
- [Yes Edit(編集完了)]を選択

![02.png](https://qiita-image-store.s3.amazonaws.com/0/262328/b38d6e88-5ec5-d8c6-eac2-8cc69d8a6456.png)

これで処理は終了です．あとはCloudFrontに反映されるまで待てば大丈夫です．

# **3. 動作確認**

反映後にcURLを実行して確かめてみます．

先ずは日本からアクセスして，アクセス出来ることを確認します．

```bash
$ curl https://d3f5bbalyot7v2.cloudfront.net/v1/aaa/bbb
```

```json
{"message":"hello world"}
```

続いてEU(フランクフルトリージョン)で作成したEC2からアクセスし，アクセス出来ないことを確認します．
想定通りエラーになりました．

```bash
$ curl https://d3f5bbalyot7v2.cloudfront.net/v1/aaa/bbb
```

```html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML><HEAD><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<TITLE>ERROR: The request could not be satisfied</TITLE>
</HEAD><BODY>
<H1>403 ERROR</H1>
<H2>The request could not be satisfied.</H2>
<HR noshade size="1px">
The Amazon CloudFront distribution is configured to block access from your country.

<BR clear="all">
<HR noshade size="1px">
<PRE>
Generated by cloudfront (CloudFront)
Request ID: R0vLQabzkIHILRQSyY3s04t_Dut-2bQkjkk5NyDgwR7Fkxy9hOC9iA==
</PRE>
<ADDRESS>
</ADDRESS>
</BODY></HTML>
```

上記のエラーメッセージですが，デフォルトのものから変更したいというニーズがあると思います．Blacklist(ブラックリスト)の国のユーザーがコンテンツへのアクセスを試みた場合にソーリーページを作成することもCloudFrontでは容易です．詳しくは[カスタムエラーメッセージを作成](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/custom-error-pages.html)を参照してください．
Ubuntu + i3wm + ybacklightでディスプレイの輝度を変える

#xbacklightじゃないの?

i3wm + Ubuntuをつかっているあなた、xbacklightを使ってディスプレイの輝度変更をしたい、またはショートカットキーを作りたいようですね...

```ruby:termial
$ xbacklight -inc 10
No outputs have backlight property
```

あれ?変更できないしなんか変なコメント出てきた...調べてみよう...
そこで出てくるほとんどのサイトが**英語**なのです...~~まじで許さん~~

#そこで!

今回は~~ちょっと怪しい~~`ybacklight`というコマンドを使って、輝度変更をかんたんに行います!

#必要なコマンドたち

今回は`vim`,`git`,`build-essential`,`meson`を使います。vimではなく`emacs`でも可です。

```ruby:terminal
sudo apt install vim
sudo apt install git
sudo apt-get install meson
sudo apt-get install build-essential
```

#ybacklightのインストール

gitといえばの`git clone`から始めます。今回はホームディレクトリにcloneします。

```ruby:terminal
cd ~
git clone https://github.com/szekelyszilv/ybacklight
cd ./ybacklight
make
sudo make install
```

インストールは完了しました。ただ、この`ybacklight`はなぜか特定のファイルに書き込み権限を与えなければならないので

```ruby:terminal
sudo chmod 666 /sys/class/backlight/intel_backlight/brightness
```

これ、事案なのが、**PCの起動時に毎回やらなきゃいけないこと**
これ本当にきつい。~~ほんま病む~~

#i3 Window Managerに適用させる

`i3wm`の`.config`に書き込んでいきます。

```ruby:terminal
cd ~/.config/i3
vim config
```

```ruby:~/.config/i3/config
# Screen brightness controls
bindsym mod1+Shift+u exec ybacklight -inc 3 # Alt+Shift+u
bindsym mod1+Shift+i exec ybacklight -dec 3 # Alt+Shift+i
```

ここでPCの**再起動**をかけます。
そのあと**chmod**します。なぜか半角全角が効かなくなることがあったので、`chmod`をする前に、**半角全角キーを押して変更できるか確認してから**権限を与えるとできるはずです。
わからなかったらひたすら`reboot`,`半角全角連打`,`chmod`し続けてください。~~なんなんこれ。~~

#終わりに

起動時は`chmod`を忘れずに!
`sudo`にパスワードをかけていない人は、`~/.config/i3/config`に`exec --no-startup-id sudo chmod 666 /sys/class/backlight/intel_backlight/brightness`でいけたりするのかな?
i3 Window Manager(i3wm) + Ubuntu初期設定【備忘録】

# 追記

私と友人で書いているブログにi3wmの設定などの記事を書いているのでぜひ見に来てください
https://students-tech.blog/

# はじめにインストールしておくコマンドたち

今回は`vim`を使います。

```ruby:terminal
sudo apt install vim
```

# i3 Window Managerのインストール

```ruby:terminal
sudo apt update
sudo apt install i3
```

このあとPCの**再起動**をかけてください。terminalで再起動をかける場合は下のコマンドでできます。

```ruby:terminal
reboot
```

再起動をかけた後に、ログイン画面(パスワードを打つときの画面)にある歯車マークをクリックします。

そのときに`i3`と表示されていれば成功。

# fcitx-mozcのインストール

```ruby:terminal
cd
sudo apt install fcitx-mozc
vim .profile
```

vimで`.profile`を開いたら、↓これらを1番下に追加してください。
vimのコマンドは[こちら](https://eng-entrance.com/linux-vi-save)

```ruby:.profile
export DefaultImModule=fcitx
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS="@im=fcitx"
```
また、起動時にmozcが勝手に起動するようにします。  
 
```ruby:terminal
cd
cd ./.config/i3
vim config
```
このあとに、どこでもいいので`exec --no-startup-id fcitx`を追加してください。

そのあとは必ず**ログアウト**します。再ログインして、

```ruby:terminal
fcitx-config-gtk3
```

上のコマンドを打ったあとに、Ubuntuのインストール時の設定したキーボードレイアウト(今回は`日本語`)と`mozc`が出ていれば成功です。半角/全角キーの切り替えで日本語が打てるようになっているはず。
デフォルトで日本語入力にしたい人は、クルマのナビみたいな矢印を使ってmozcを1番上に持ってくる。

# 終わりに

どうあがいてもArch Linuxのソースしかなくてしばらく頭を抱えていたので、そんな人がもう出ないようにここに書いておきました :)
ここまでやれば日本語も打てるようになっているはずなので、ある程度はi3wmで暮らせるようになる(はず)。
VALUE SERVER上のWordpress製サイトをフルSSL対応する

# どんなサイト？
* Wordpress4.9.7製の個人サイトです
* [VALUE-DOMAIN](https://www.value-domain.com) で取得したドメインを、[VALUE SERVER](https://www.value-server.com)で運用
* ドメインは https://altneuland.net

# なぜ記事にするのか
* 拍子抜けするくらい簡単だったから。宣伝かよと思われそうですが本当にビジュアルコンソールだけで終わってしまった…

# なぜSSLにするのか
* 理由１　GoogleがSSLを優遇するようになったから
  * スノーデンの告発でhttpに対する国家的かつ広範囲な盗聴行為が明らかに
    * 詳しい記事。<a href="https://employment.en-japan.com/engineerhub/entry/2018/02/14/110000">https://employment.en-japan.com/engineerhub/entry/2018/02/14/110000</a>
  * 事態を受け（乗じ、かもしれませんが）GoogleがSEOでHTTPSを優遇等
  * ついにChrome70(2018年10月予定)からhttp接続ページは保護されていませんとURLバーが赤くなる警告機能が導入されるそうです。

* 理由２　SSL対応を無料でできるようになったから
  * 正規に所持しているドメインを証明するには、第三者＝認証局が必要
  * 認証局による証明書発行はビジネスで、毎年数千〜数万円払う必要があった。
  * そのうえ[いろいろあって](http://arakan-pgm-ai.hatenablog.com/entry/2018/04/20/100000)、上述のChrome70では、こうしたもののうち[Symantec系（Thawte、VeriSign、Equifax、GeoTrust、RapidSSLなど）が発行した証明書が全て無効になる](http://www.itmedia.co.jp/enterprise/articles/1803/08/news066.html)そうです。さんざんですね。
  * 事態を受けて？ドメイン所持者に無料でSSL証明書発行を可能にする認証局 <a href="https://letsencrypt.org/">Let's Encrypt</a>が2016年４月にサービスを開始
  * Let's Encryptは公益法人の Internet Security Research Group (ISRG) が運営しています。


# 手順

1. Wordpressを先に設定しておく
  * 先にホスティング側作業をすると詰む
  * Wordpressのバージョンアップする
  * バックアップはしておく
  * CSSやjsの``http://``で直接ファイルパスを記入してる箇所はさらって``//``に書き直しておく。
  * プラグイン[Really Simple SSL](https://wordpress.org/plugins/really-simple-ssl/)を入れる。自動でこれまでのページURLがhttpsに移行。

1. VALUE SERVERのコンソールに入る
![image.png](https://qiita-image-store.s3.amazonaws.com/0/151668/5c6774a7-49b3-d815-290c-afad5673e0fc.png)
  * 「ドメインウェブの設定」
  * 最初はこうなっています。Mainにドメインが1個設定してあるだけです。
  * ![image.png](https://qiita-image-store.s3.amazonaws.com/0/151668/2cb1f6b8-ca37-d9ce-c45a-f79d96b9be62.png)
  * SSL用のドメイン欄にも、Mainと同じドメイン名を設定します ![image.png](https://qiita-image-store.s3.amazonaws.com/0/151668/3d3cd3b3-1755-30d3-fcd1-acab8e9b649b.png)
  * 「無料SSL設定」でLet's Encryptをコンソールで設定できます。ここが簡単すぎてビビるところ。該当のドメインをチェックして「無料SSL」ボタン押すだけ…設定画像はVALUEサーバ公式からお借りします。　![image.png](https://qiita-image-store.s3.amazonaws.com/0/151668/d2f75d76-b666-9087-0206-6eb114302c54.png)
  * 完成！![image.png](https://qiita-image-store.s3.amazonaws.com/0/151668/7e9bd81b-e36d-4e2d-1a9c-d51f92bab191.png)



# まとめ
* WordpressのSSL化なら、Really Simple SSLが便利。
* Let’s Encryptのため、certbot入れたりする手順ももちろん覚えて損はないが、支援機能があるホスティングサービスを使えるときは、遠慮なく使って楽をしましょう！
* VALUE SERVERのほか、Let’s Encryptに対応してるサービスを探してみたら、だいぶ増えましたね、さくらインターネット、zenlogic、wpXクラウド、mixhost、ロリポップ、エックスサーバー…などなど。
夢のある日経平均のグラフをシェル芸で書く


<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">有名な海外投資家の方が投稿した<br>『長期BTCチャート』<br><br>これを見てどう思うか。<br><br>長期で考えれば、<br>500万程度は通過点にしか<br>見えませんね。 <a href="https://t.co/WaQJ2eEQjT">pic.twitter.com/WaQJ2eEQjT</a></p>&mdash; Yu- BtcTrader (@yu_btctrader) <a href="https://twitter.com/yu_btctrader/status/1011809077003866112?ref_src=twsrc%5Etfw">June 27, 2018</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

上の図がとても良かったので、自分のように寿命が数百年有る存在にとってはバブル期に到達できなかった日経平均4万円も通過点にしか見えないのではと思い達スッと似たようなグラフを書いてみた



一度ファイルに吐いてるのでワンライナーとは行かない。


# 使うもの

- curl
- pup
- jq
- sed
- gnuplot


# 日経平均の過去データを持ってくる

日経平均の過去データを公開しているサイトからサッと引っ張る。htmlで返ってくるので、pupで必要なdom要素を引っこ抜いてjsonにして、jqで時系列のtsvにする。数値に,が入っているのでsedで消す。あんまりリクエスト投げても良くないのでURLは自分で調べてね。

```
for year in `seq 1949 2018`; do for month in `seq 1 12`; do
curl -s "{URL}?list=daily&year=${year}&month=${month}" | pup "tr json{}" |jq -r '.[1:-1] | .[].children | [.[].text] |@csv' | sed s/\"//g; sleep 60; done; done > out.tsv
```

sleep入れてやると良い。


# グラフ化

gnuplotで適当な画像を出力する

```
gnuplot -e 'set size ratio 0.75; set terminal png; set output "out.png"; unset key;set xdata time;set timefmt "%Y.%m.%d";set format x "%Y";set yrange [-50000:700000];set xrange ["1949.01.01":"2300.12.31"];plot "out.tsv" using 1:5 with lines'
```

グラフ見せるのは利用規約的に微妙っぽいので自分で作ってみてね。
GoogleAppEngineにwildcardでドメインを割り当ててアクセスできるようにする

件名通りです。
hoge.example.xxxや、foo.example.xxx、bar.example.xxxといったどんなドメインでも
GAEにアクセスさせて処理を返させる……といったことがしたかったので。（後々の開発環境の改善的にも:stuck_out_tongue_closed_eyes:）
ドメインはGCPで管理できているという前提で！

# GAEの設定

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235100/cfc696f8-c6a5-adf3-138a-0674dc637409.png)

といっても難しい設定は何もないです。
GAEの画面から対象のドメインと、*で設定してあげるだけです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235100/e5c09305-81b9-6a13-faa0-3d614d448620.png)

最終的にはこんな感じになりました。
最初の添付の画像では追加していなかったんですが、foo.neko-daisuki.siteというのも後の検証のために追加してみました。

# DNSへの反映

*.neko-daisuki.siteに対してCNAMEが設定されています。
これでfooだろうが、barだろうがwildcardの部分に来る分については、
全てgoogle側で判定、GAEにリクエストを送ってくれるようになります！
let's encryptを使用して自動でhttpsにも対応してくれるので本当に楽です！

# 反映結果

- http://neko-daisuki.site
- http://foo.neko-daisuki.site
- http://bar.neko-daisuki.site
- http://foobar.neko-daisuki.site

アクセスできるようになりました！
が、一つ問題が……
let's encryptを使用して自動的にhttpsにしてくれるgaeのマネージドセキュリティは、
**ワイルドカードに対応していなかった！**
オリジナルのneko-daisuki.site以外では、
明示的に設定したfoo.neko-daisuki.siteしかhttpsにアクセスできません！:sob:

-  httpsでアクセスできる
    - https://neko-daisuki.site
    - https://foo.neko-daisuki.site
-  httpsでアクセスできない
    - https://bar.neko-daisuki.site
    - https://hoge.neko-daisuki.site

最近ではあるんですが、let's encryptはwildcardにも対応するようになったので、
gaeのマネージドセキュリティも対応してくれると嬉しいんですが。
対応の予定はあるのだろうか……問い合わせてみよう。

# 作ってみたもの
https://github.com/nekokari/neko-gae-multi-service
※以前作ったリポジトリにmulti domain用のサービスを追加しています

# 最後に

[株式会社ネコカリ](https://www.nekokari.co.jp/)では猫の手も借りたい🔥炎上中🔥なお仕事を募集しています！
一緒に働くメンバーも募集していますので、よかったら是非！
bbc1を使って何かしらの利用履歴を記録するアプリケーションを作ってみた

今回作ったusage\_ledger.pyの利用方法について解説します。リポジトリは[こちら](https://github.com/kichinosukey/bbc1_app/tree/develop/usage_ledger)。

# 狙い
- bbc1の実応用を考慮してトランザクションIDやアセットID以外の検索機能の実装をしてみる
- また、その実装から得られる課題を抽出する

# 想定する利用シーン
- 公共施設の利用履歴を記録したい時、例えば図書館など
    - 以降の説明手順は、単なるコードの利用手順ですので悪しからず・・・

# 利用手順
大まかな利用手順は以下の通り。
- 初回のみの作業
    - コアノードの立ち上げ
    - ドメイン情報の登録
- 初回以降の作業
    - ユーザーの場合（利用実績を記録したい時）
        - 記録に残したい名前を入力
    - オーナーの場合（利用記録を検索したい時）
        - 検索したい日時と（このコードでは西暦年）名前を入力

# 初回のみの作業 
まずはコアノードを立ち上げる。

```shell-session
cd ./usage_ledger
bbc_core.py --no_nodekey
```

次にドメイン情報を登録する。

```shell-session
$ bbc_domain_update.py -d 748c0b3fafa02e150928a7d3764a4bb1b16a21cb61a1d3f51ed2021933042baa -a
Result: success
```
これでusage\_ledger.pyが使えるようになりました。

# 利用実績を記録する
まずuserディレクトリに移動してからコードを実行します。
すると入力を要求されるので登録したい名前を入れてください。

```shell-session
$ python usage_ledger.py
user id: 04f8996da763b7a969b1028ee3007569eaf3a635486ddab211d512c85b9df8fb
domain id: 748c0b3fafa02e150928a7d3764a4bb1b16a21cb61a1d3f51ed2021933042baa
type "user" or "owner"> user
> kichinosukey
------- Dump of the transaction data ------
* transaction_id: b'31ea3df770a03afee10f4655d22ec874dff1b9d11e157408717e183b799f111d'
version: 0
timestamp: 1532869590
Event[]: 0
Reference[]: 0
Relation[]: 1
 [0]
  asset_group_id: b'91b31622dea099f3a0294596010919a163ccbbe0184e49b5adb36e236948661d'
  Asset:
     asset_id: b'd4f0c727aa789b5c961ab4a80231d1c8bd3100d9f4e1eb4775a37f7567670670'
     user_id: b'04f8996da763b7a969b1028ee3007569eaf3a635486ddab211d512c85b9df8fb'
     nonce: b'10b8bf1154a794fd'
     file_size: 4
     file_digest: b'9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'
     body_size: 12
     body: b'kichinosukey'
Witness:
 [0]
  user_id: b'04f8996da763b7a969b1028ee3007569eaf3a635486ddab211d512c85b9df8fb'
  sig_index: 0
Cross_Ref: None
Signature[]: 1
 [0]
  key_type: 1
  signature: b'b3c3cf28acbdd0c2ede347f746e3c08b8c274f082c25044efecb6f748a9bfce22439f05c682d89c2dcd78c517efd3ea8e7214eb6ad69b35ddfaadb0346da7715'
  pubkey: b'04badaa9f6e46f42b80c0d2cf4f749ec49e1c5673b5850d8306328f54947a37650927a2d67226d5d4d0d967a3dca2a9d79781fc60741ea2c5bb3a15ace6eee6859'
```

# 利用記録を検索する
こちらはownerディレクトリに移動してからコードを実行します。
初めの入力では"owner"を、次の入力では検索対象の年度を入力してください。（次も入力を求められますが、こちらは空白で大丈夫です。）

```shell-session
$ cd owner
$ python usage_ledger.py
user id: 4c1029697ee358715d3a14a2add817c4b01651440de808371f78165ac90dc581
domain id: 748c0b3fafa02e150928a7d3764a4bb1b16a21cb61a1d3f51ed2021933042baa
type "user" or "owner"> owner
> 2018
>
Username: kichinosukey
Time: 2018-07-29 22:06:30
```

# コードを書いてわかった課題
- 機能の抜け漏れを防ぐためにも実際の利用シーンをいくつか想定する必要がある

# まとめ
bbc1を使った利用履歴台帳のサンプルコードを作りました。[公式のリポジトリ](https://github.com/beyond-blockchain/bbc1)にあるサンプルやドキュメントにはトランザクションIDやアセットIDによる検索の記述はあります。しかし実際の応用では日時や名前といった情報による検索が必要になると思うのでそういったケースの実装の一例として今回のサンプルを作りました。荒削りなのは承知の上ですが、何か意見などあれば気軽に連絡ください。よろしくお願いします。
CODE BLUE CTF 2018 Quals Write-up

[CODE BLUE CTF 2018 Quals](http://ctf.codeblue.jp/) に チーム [m1z0r3](https://ctftime.org/team/7694) として参加しました。

Scrap Square v1.0 という問題を解いたので、忘れないうちに Write-up を書きます。

## Scrap Square v1.0

メモを記録するアプリケーション。ソースコードも渡される。ユーザ登録ができ、問題のあるメモは Admin に報告することができる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/86238/08674941-82df-d476-b1fe-82142381ba0b.png)

## 解答

適当なユーザ（uid: uid1）を作成して、その後

```html
<form name="admin" id="[uid1]"></form>
<script src="/static/javascripts/load-scrap.js"></script>
<script src="/static/javascripts/report-scrap.js"></script>
<script src="/static/javascripts/periodically-watch-scrap-body-and-report-scrap-automatically-with-banword.js"></script>
<!-- 
```

というユーザ名でユーザ（uid: uid2）を登録し、 

```
http://v10.scsq.task.ctf.codeblue.jp:3000/scraps/[uid2]/hoge?fuga=../..
``` 

という URL を報告すると、最初に作成したユーザに admin のトップページの情報が報告される。

あとは、

```
http://v10.scsq.task.ctf.codeblue.jp:3000/reports
``` 

を見ると、admin のトップページの情報からメモのタイトルの一覧がわかるので、

```
http://v10.scsq.task.ctf.codeblue.jp:3000/admin/[Title]
```

にアクセスすると FLAG が手に入る。

## 解説

### ■ ポイント1: ユーザ名に関して

```html
<form name="admin" id="[uid1]"></form>
<script src="/static/javascripts/load-scrap.js"></script>
<script src="/static/javascripts/report-scrap.js"></script>
<script src="/static/javascripts/periodically-watch-scrap-body-and-report-scrap-automatically-with-banword.js"></script>
<!-- 
```

- ユーザ名はサニタイズされないため XSS 利用可能。
- `periodically-watch-scrap-body-and-report-scrap-automatically-with-banword.js` をロードすることで、自動で `reportScrap()` が実行される。
- `reportScrap()` では `window.admin.id` 宛に報告されるので、 **DOM Clobbering** によって `window.admin.id` の値を自分の UID に書き換える。
- のちにロードされる `config.js` によって `window.admin.id` の値が書き換えられるのを阻止するために最後にコメントアウトする。
- コメントアウトにより、必要な JS ファイルもロードされなくなってしまうので、必要なファイルはあらかじめロードする。


### ■ ポイント2: 報告する URL に関して

> ```
http://v10.scsq.task.ctf.codeblue.jp:3000/scraps/[uid2]/hoge?fuga=../..
``` 
>
> という URL を報告すると、最初に作成したユーザに admin のトップページの情報が報告される。

`load-scrap.js` を見ると、現在の URL を `/` で区切って、 `user` と `title` を取得して GET する URL を組み立てている。

```js:load-scrap.js
const urls = location.href.split('/')
const user = urls[urls.length - 2]
const title = urls[urls.length - 1]

// ...

$.get(`/static/raw/${user}/${title}`)
  .then(c => {
    const scrapBody = $('<pre class="scrap-body">')
    scrapBody.text(c)
    $('.scrap-wrapper').append(scrapBody)
  })
```

例えば `http://v10.scsq.task.ctf.codeblue.jp:3000/scraps/hoge/fuga?piyo=../..` という URL の場合には、 `/static/raw/../..` という URL（つまり `/` ）を load してくる。

この URL を報告することにより、 `load-scrap.js` は admin のトップページの情報を取得して HTML に反映する。
PostgreSQLの基本(ユーザー追加DB作成)


PostgreSQLは、GUIを伴うphpPgAdminなどのDB操作ツールがあり便利だが、これらがPostgreSQL本体の更新に追いついていない感もある。基本操作について言えば、コマンドラインから専用コマンドを使う方が確実である。本稿では、PostgreSQLの専用コマンドの一部を紹介する。

#認証
##peer認証
debianのPostgreSQLでは、DBの管理者がPostgreSQLのユーザーとしてpostgresで登録されている。このユーザはlinuxのユーザとしても登録されており、既定値設定では、linuxユーザpostgresとしてログインしなければPostgreSQLに接続し操作することができない。この設定をpeer認証と呼ぶ。peer認証の場合パスワードは必要ない。この設定は次のファイルにある。

```/etc/postgresql/9.6/main/pg_hba.conf
local   all             postgres                                peer
local   all             all                                     peer
```

##管理者権限
以降の説明のうちpsqlコマンドとpg_dumpコマンドを除いて、PostgreSQLの管理ユーザーであるpostgresで操作する前提で記載した。rootではDBの操作は行わない。また、環境変数usernameにDBユーザー名を、環境変数databasenameにデータベース名をそれぞれ設定する。途中のcdコマンドは、linuxユーザーpostgresのhomeデレクトリィでる/var/lib/postgresqlに移動する。

```bash:suコマンドの実行にはroot権が必要
su postgres
cd 
username=DBユーザー名
dbname=データベース名
```

##パスワードを環境変数で指定
環境変数 PGPASSWORD にパスワードを設定すると、下記のツールは自動的にパスワードとして利用する。環境変数は、root権があれば他のプロセスから読み出すことができるので注意が必要だ。他にもここでは触れないが、~/.pgpassword使う方法がある。

```bash
PGPASSWORD=パスワード
```

#ユーザーの追加と削除

```bash:ユーザー作成
createuser -P  $username
```
 -Pでパスワードを設定する。(対話形式)

```bash:参考/パスワード生成のワンライナー
perl -e "@c = (a..z,A..Z, 0..9); print @c[rand @c] for 1..10"
```

```bash:ユーザー削除
dropuser  $username
```

#データベースの追加と削除

```bash:データベース作成
createdb -O $username $dbname
```
規定文字コードはUTF8になる。

```bash:データベース削除
createdb  $dbname
```

#データベーススキーマの表示

```bash
pg_dump  -s $dbname -U $username -w
```

#データベースバックアップ

Linuxのユーザーpostgresで操作するときは、デレクトリィのパーミッションに注意する。

```bash
pg_dump $dbname -U $username -w | gzip  ${dbname}.sql.gz
```
#データベース復元

postgresなどの管理者権限で行う。

```bash
createdb -O $username $databasename
zcat ${dbname}.sql.gz | psql $dbname -U $username -w
```
#データベースの操作

```bash:psqlコマンド
psql $dbname -U $username -w
```
psqlでの対話モードには、通常のSQLの他に\を使ったコマンドが使える。

|コマンド|意味|
|---|---|
|\q|終了|
|\t|テーブルリスト|
|\l|データベースのリスト|
|\?|\コマンドのヘルプ|
ES2015から始めるJavaScript入門

# はじめに
ES6 改め ES2015 が出て久しいですが、ECMAScript は2015以降毎年更新されているのはご存知ですか？
ECMAScript とは JavaScript の標準を定めた規格で、別々のベンダーで作られるブラウザの JavaScript の実装を統一するために定められているものです。毎年更新されるということはES5以前の知識しか無いままでいるとどんどん置いてかれていってしまいます。const や let で バリバリ書いている人もいますが、ES2015 から3年経っても（ブラウザの仮実装を含めたらもっと）、未だに var を使っている人も多く見られます。ですが、これらの更新の際に安全性だったり、最適化が施されているので、もっとちゃんとした JavaScript を書ける人が増えると良いなと思った次第です。

# 資料
JavaScript をちゃんと書きたい人向けに、ECMAScript2015(ES6) 以降の構文や機能の初歩的な部分を解説したスライドを作りました。講義の一環で発表時間5分のものに補足を付け加えたものなので、サラッと目を通せると思います。

## 内容
1. JavaScript の簡単な説明
2. 構文の解説
    1. 厳格モード
    2. 変数宣言
    3. 比較演算子

https://speakerdeck.com/takashift/javascript-zai-ru-men-qi-false1

# 補足
其の1となっていますが、なんかお褒めの言葉を頂いたり、続きが欲しいという声が私の耳に届いたら、暇な時に続きの資料も作ろうかなと思ってます。
別に ES2015 以降の内容に絞ろうというつもりはなくて、JavaScript をちゃんと書きたい人向けなので、機能や設計思想の話だったり、JavaScript 特有のプロトタイプベースオブジェクト指向について説明したりしようと思っています。
一応内容としては以下のような感じにしようと思ってます。

1. JavaScript の簡単な説明
2. 構文の解説
    1. 厳格モード
    2. 変数宣言
    3. 比較演算子
3. 関数
4. コンストラクタ
5. プロトタイプ
    6. そもそもオブジェクト指向とは
    7. クラスとの違い
[祝GA] lightning:input の DatePicker は入力可能な日を制限できる


永らく beta であった `lightning:input` タグ。
先週くらいにふと見ますと、GA になっていました。これで何のためらいもなく使える！

使いたかったのは、件名の通り「入力可能な日を制限する」機能。

lightning:input - example - Salesforce Lightning Component Library
https://developer.salesforce.com/docs/component-library/bundle/lightning:input/example

を参考に、試しに以下のようにコーディング。
(2018-07-05 から 2018-07-20 まで選択可能にしてみる。css はキャプチャ用に見た目を整えるだけ)

```html
<!-- sample.ccmp -->
<aura:component implements="force:appHostable,flexipage:availableForAllPageTypes">

    <div class="row">
        <h2 class="header">Advanced Input Date</h2>
        <lightning:input type="date" name="input8" label="Date field with min and max values"
            value="2018-07-10" min="2018-07-05" max="2018-07-20" />
    </div>

</aura:component>
```
```css
/* sample.css */
.THIS {
    background-color: white;
    margin: 5rem;
    height: 30rem;
    padding: 2rem;
}
```

このコンポーネントを配置すると、以下のようになりました。
(赤線は「選択可能な部分の説明用」で、実際には表示されません)
![datepicker.png](https://qiita-image-store.s3.amazonaws.com/0/43550/55e23fa3-8eb5-0376-73d5-c539aac8654e.png)

`aura:attribute` 経由で controller/helper で min/max の値を指定してやれば、動的に変更することも可能です。
実際の業務では

* n日以降から入力可能としたい
* n日以前は入力不可としたい

のようなケースが多々あると思いますので、この機能が GA なのは本当にありがたいですね :smile:
dep ensure でプライベートリポジトリのデータを取りに行くときに hang する。

`dep ensure -v` しても処理がダウンロード途中で止まること以外情報を得ることができず、何が原因かわからくて困った。

### 原因
dep 内で実行されたコマンドで入力を求める処理があった場合、dep は hang する。

下記に書いてあった。
https://golang.github.io/dep/docs/failure-modes.html#hangs

### 解決策
dep が git コマンドを実行するときに、入力を求めないようにすればよい。

https://golang.github.io/dep/docs/FAQ.html#how-do-i-get-dep-to-authenticate-to-a-git-repo
[HTML]button 系のタグで value 属性を省略した場合の表示を見てみる

## あらすじ
とあるHTMLを書いているときに、凡ミスで `<input type="submit">` に value 属性を付けるのを忘れてしまったのですが、WEBページ上ではこんなふうに[送信]という文言が表示されており、おや？と思いました。

![submit2.png](https://qiita-image-store.s3.amazonaws.com/0/70638/32745e6f-f421-dbbd-036f-20f3dc7183b3.png)


value 属性書けば終わる話ですが、気になったので軽く調べてみました。
が、この value 属性を省略した場合はどうなるかというのはうまく情報が見つかりませんでした。結局 HTMLをブラウザがどう解釈するか、によるので定まった情報はないんですかね？

## それなら
情報探すよりも実際にブラウザで確認するほうが早そうなので検証してみることにしました。
input タグの type が reset, submit, button の場合は value に設定したものがボタンのテキストとして使われるようなので、とりあえずこの3つでやってみたいと思います。



https://www.w3schools.com/tags/att_input_value.asp
> - For "button", "reset", and "submit" - it defines the text on the button


## 検証用ページ
検証用に value 属性の無い input タグを置いただけの簡単なページを用意しました。これをいろんなブラウザで開いてみます。
https://jpsern.github.io/gh-pages-test/input-test.html


説明するほどでもないですがコードも載せておきます。
検証 type の増減が楽なのでスクリプトで HTML を生成するようにしてみました。

```html:input-test.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>value属性のデフォルト値検証ページ</title>
  <script type="text/html" id="tpl-li">
    <li>
      <span>type={%type%}: </span><input type="{%type%}">
    </li>
  </script>
  <script>
    //対象の type 属性値
    const types = [
      "submit", "reset", "button"
    ];

    //types 配列の要素分だけ input タグを生成する
    document.addEventListener("DOMContentLoaded", function(event){
      const inputs = document.getElementById("inputs");
      types.forEach(function(value){
        const tpl = document.getElementById("tpl-li").innerHTML;
        inputs.innerHTML += tpl.split("{%type%}").join(value);
      });
    });
  </script>
</head>
<body>
  <h1>value属性のデフォルト値検証用HTML</h1>
  <ul id="inputs"></ul>
</body>
</html>
```


## 検証結果
もっとバラけるかと思いましたが、IE、Edge以外はみんな同じでした。~~結局またいつものやつらか~~

### PC
|type|Google Chrome|Mozilla Firefox|Internet Explorer11|Microsoft Edge|Opera|
|---|---|---|---|---|---|
|submit|送信|送信|クエリ送信|クエリ送信|送信|
|reset|リセット|リセット|リセット|リセット|リセット|
|button|なし|なし|なし|なし|なし|

### スマートフォン
|type|Mobile Safari|Chrome for Android|
|---|---|---|
|submit|送信|送信|
|reset|リセット|リセット|
|button|なし|なし|

## 結論
ということで value 属性の値を省略した場合はブラウザによって挙動が異なる場合があるので、value 属性は忘れずに入れましょう(自戒
終わってみれば当たり前な話ですみません。

## 使用端末

- PC1(Windows7 Professional SP1 64ビット)
- PC2(Windows10 Professional 64ビット)
- iPhone6s(iOS 9.3.5)
- Nexus7(2012版)(Android 5.1.1)

なお、Chrome, FireFox, Opera の検証結果については2018/07/30時点の最新版によるものです。
ReactNativeを選ぶ前にちょっと聞いてほしい

ReactNativeをどんな時に選ぶべきか自分なりに整理します。
環境構築は以下がわかりやすいと思います。
環境構築：Expo XDEでReact Native入門 https://qiita.com/ykubot/items/963df6499af5ffc3a0b2

# ReactNativeはどんな時に有用？
- ベンチャーなど開発リソースが少ない時
- iOS/Android開発に対して多少の知見がある人が社内にいる時
- Reactなどフロントエンドの技術者が多い時(今回触れない)

メインでは上３点かと思います。
それぞれの理由として

### ベンチャーなど開発リソースが少ない時
RNはWEBフロントに近い内容でアプリの開発が行えます。
そのため、アプリ開発の知見が多少ともあれば開発が行えます。
（なくても動きはしますが、多少ないと厳しいことが多いです。詳細は後続）

開発リソースが潤沢にある場合はOSごとのパフォーマンス向上ライブラリが利用できるため、ネイティブで書いたほうが良いかと思います。
RNにもパフォーマンスを向上させるためのライブラリはいくつかありますが、iOS/Android両方に対応していることが少なく
個別最適化が多少なりとも必要になってきます。
(ex iOS：[react-native-wkwebview](https://github.com/CRAlpha/react-native-wkwebview) など)

### iOS/Android開発に対して多少の知見がある人が社内にいる時
Expoを使うことによって、ハードルをさらに下げることは可能ですが、主に以下のような理由でネイティブの知識が必要かと思います。

- Push通知開発
- Android/iOSのパーミッションの設定
- ネイティブAPIを使うモジュールの組み込み

上２つに関してはExpoのドキュメントを読み漁ればある程度対応はできますが、問題は最後のネイティブAPIを使うモジュールの組み込みです。
当初の計画としては、ネイティブAPIを使う予定が全くなかったため、Expoでの実装をしていました。

しかし、データ解析のための[google-analytics-bridge](https://github.com/idehub/react-native-google-analytics-bridge)や広告測定の[adjust](https://github.com/adjust/react_native_sdk)はExpoに対応していないことが発覚し、類似の機能を提供しているサービスも見当たらなかったため、RN5.6で一部作り直すことにしました。


# まとめ
ベンチャーなどの小規模開発で、多少ネイティブの知識がある場合はRNを使うのおすすめだよ！
それ以外はネイティブで作ることも再度検討してみてはいかがでしょうか？

間違っているところ、ご指摘などありましたらコメントお願いします！
複数列の値を引数に計算→新しい列に結果代入

忘備録です。


+ エクセルっぽく、列の値を使って掛け算などの計算をして新たな列に代入する。

流れは、まず空の列をつくり、
引数に列を取るような関数を作って、axis=1方向にデータフレームにapply。

```python
import pandas as pd
import numpy as np

#サンプルデータ作成
data = {"name":["高橋","鈴木","田中","松本"],
        "score": [80, 90, 70, 75],
        "number":[1,2,1,3],
        "sex":["m", "f", "f", "m"]}

df = pd.DataFrame(data,columns=["name","sex","number","score"])
print(df)

  name sex  number  score
0   高橋   m       1     80
1   鈴木   f       2     90
2   田中   f       1     70
3   松本   m       3     75
```

結果を入れる空の列を作成。

```python
df["result"]=np.nan
print(df)
  name sex  number  score  result
0   高橋   m       1     80     NaN
1   鈴木   f       2     90     NaN
2   田中   f       1     70     NaN
3   松本   m       3     75     NaN
```
numberとscoreを掛け算する関数をつくる。

```python
#今回は番号で列指定。
def kakezan(x):
    return x.iloc[2] * x.iloc[3]
```

applyする。

```python

df["result"] = df.apply(kakezan, axis=1)
print(df)
  name sex  number  score  result
0   高橋   m       1     80      80
1   鈴木   f       2     90     180
2   田中   f       1     70      70
3   松本   m       3     75     225
```
※ご指摘等あればよろしくお願いします。
GitLab CIの一番簡単そうなチュートリアルをやってみた

# はじめに
GitLab CIを使って見たかったので、一番簡単そうなチュートリアルを探して試してみた。
下記サイトを見ながらやったらできたけど、ちょっと迷ったので情報を残しておく。

[GitLab CIの基本チュートリアル（翻訳）](https://kore1server.com/351/GitLab+CI%E3%81%AE%E5%9F%BA%E6%9C%AC%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%EF%BC%88%E7%BF%BB%E8%A8%B3%EF%BC%89)
[GitLab CI: Run jobs sequentially, in parallel or build a custom pipeline | GitLab](https://about.gitlab.com/2016/07/29/the-basics-of-gitlab-ci/)

# 準備
まず、GitLabでci_testってプロジェクトを作る。
次に、ローカルでfile1.txt, file2.txtを作ってpullする。
こんな感じ。

```
echo -n Hello\  > file1.txt
echo world > file2.txt
git init
git remote add origin git@gitlab.com:xxx/ci_test
git pull origin master
```

# テスト（チュートリアルにそって進めた）

次に、GitLabでSet Up CI/CDってとこを押して、チュートリアルに書かれているように`.gitlab-ci.yml`を編集して`commit`のボタンを押す。別にGitLabの画面上で作らなくても、ローカルで作ってもよかったっぽい。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/9e2f784f-7e59-0b2a-a067-01f1c36b3c7e.png)

すると、環境作ってtestを実行してくれる。
どうもdockerのコンテナ使ってるらしい。
passした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/d708bc90-594f-9724-43c3-18592b4569c7.png)

チュートリアルにそってworldをAfricaにして試してみる。
ローカルで修正したらpush。
テストが終わってないときにみると、runningになってる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/3aa85e12-2ff9-cc15-bbee-b84eb3ee141b.png)

failしたときはこんな感じ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/e479129d-95c8-5f5e-21dd-03ad7df23494.png)

ログ見るとこんな感じ。Using Dockerとか書いてる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/95157ea4-4f35-eb24-9a6c-5ff24e04bdcc.png)

生成されたものは右側のボタンからダウンロードできるようになってた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/38bd67f5-86b5-077a-bc78-5fa464e12ad1.png)

# おわりに
初心者には良いチュートリアルやった。
毎回、実行環境をDockerでコンテナ作ってやるってのが、まだピンと来ない。
なんか無駄が多い気がするけど、毎回、きれいな環境で実行しようと思うとそうなるんかな。
複雑なソフト作ろうと思ったらそうなるんかな。
make cleanで環境が綺麗になるプロジェクトだと、ありがたみがよくわからんのかな。
Amazonlinux1でNuxt.js、Laravelの環境構築した際に打ったコマンドメモ

## メモ

```sh
echo 'yumをアップデートする'
yum update -y
echo '必要なパッケージをインストールする'
yum install -y \
  php71 \
  php71-cli \
  php71-common \
  php71-devel \
  php71-json \
  php71-mbstring \
  php71-mysqlnd \
  php71-pdo \
  php71-process \
  php71-xml \
  php71-fpm \
  php71-gd \
  mysql \
  epel-release \
  nginx \
  git
echo 'TimezoneをAsia/Tokyoにする'
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
echo -e 'ZONE="Asia/Tokyo"\nUTC=false' > /etc/sysconfig/clock
echo 'nginxを自動起動設定する'
chkconfig nginx on
echo 'nginxを起動する'
service nginx start
echo 'php-fpmを自動起動設定する'
chkconfig php-fpm-7.1 on
echo 'php-fpmを起動する'
service php-fpm-7.1 start
echo 'AWS cliをインストールする'
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
python get-pip.py
pip install awscli
echo 'node.jsをインストールする'
yum install nodejs npm --enablerepo=epel
echo 'nvmをインストールする'
git clone git://github.com/creationix/nvm.git ~/.nvm
source ~/.nvm/nvm.sh
echo 'node.jsをアップデートする'
NODE_VERSION='10.6.0'
nvm install v${NODE_VERSION}
nvm use ${NODE_VERSION}
echo 'nvmを自動起動設定する'
echo "source ~/.nvm/nvm.sh
nvm use ${NODE_VERSION}" > ~/.bash_profile
echo 'npmをアップデートする'
npm install -g npm
echo 'yarnをインストールする'
npm install -g yarn
echo 'forever, initd-foreverをインストールする'
npm install -g forever initd-forever
```

## 一言

いつか、ちゃんと整理してDockerfileにしてGitHubとDockerHubにあげたい。
ローカルのファイルで置いてると忘れそう&他の人にとっても多少は需要ある気がしたので載せた。
コマンドプロンプトでよく使うコマンド

# よく使うコマンド
windowsのファイル操作のコマンドについてまとめます。

# エクスプローラーを開く
    start .
# フォルダの作成
    mkdir aaa\bbb\ccc
# 空ファイルの作成
    copy nul a.txt
# ファイルのコピー
    copy a.txt b.txt
# 名前の変更
    move a.txt b.txt
# ファイルの削除
    del b.txt
# ファイルの移動
    move a.txt aaa
# ファイルの結合
    copy *.txt a.txt

copyコマンドは、複数のファイルを一つのファイルにすることができます。この場合は、拡張子txtのファイルを、a.txtに出力します。

# ファイル一覧の作成
    dir /b/a-d/s

dirに引数を指定すると、フォルダ内のファイル一覧をフルパスで取得できます。


# 結果をファイルに保存する ( 上書き )
    dir /b/a-d/s > a.txt

「> 」が、出力の記号で、「a.txt」がファイル名になります。


# 結果をファイルに保存する ( 追記 )
    dir /b/a-d/s >> a.txt

「>> 」が、上書きの記号で、「a.txt」がファイル名になります。
スクラムマスター宣言

1.  Dedicated Delivery Improver
2.  Foster Continuous Improvement
3.  Help Continuous Improvement
4.  Empower Coach Deliver
5.  Nurtures The Team
6.  Transparent Team Helper
7.  Commitment To Excellence
8.  Empathetic Evangelistic Guide
9.  Resistant Persistent Dedicated
10. Help The Team 
11. Awareness Then Improvement
12. Agile Driving Force

http://www.infoq.com/news/2012/01/scrum-master-full-time-role
デザイン自動化メモ（InDesignオブジェクトの不透明度を変更する）

#オブジェクトの不透明度を変更する。

アクティブドキュメントの全てのオブジェクトに対して不透明度を設定します。
オブジェクトpageItemの不透明度を変更するには、transparencySettings.blendingSettings.opacityを変更します（0ー100）。

###例
```js
pageItem.transparencySettings.blendingSettings.opacity = 50;
```

###サンプル
下記の例では、スクリプトラベルに「hoge」が設定されていないオブジェクトに対して不透明度を設定します。

```js
function setAppearance_Opacity(pageItem,opacity) {

    pageItem.transparencySettings.blendingSettings.opacity = opacity;
}

function doMain() {
 
    pageObj = app.activeDocument.pages[0];
    total = pageObj.allPageItems.length;
    
    var i = 0;
    
    for (i=0;i<total;i++) {
       var label = "";
       var typeName = "";
       var pageItem;
        
       pageItem = pageObj.allPageItems[i];
 
       var typeName = pageItem.constructor.name;
       label = pageItem.label; 
 
        // 特定のテキストフレームは処理をしない。ここではスクリプトラベルで判断する。
        if (label=="hoge") {
                   
            continue;
        } 
       
       // オブジェクトの不透明度を変更する（アピアランス設定）
       if (typeName=="TextFrame") {
 
            setAppearance_Opacity(pageItem,50);
       }
    }
}

function main() {

      app.doScript("doMain()",ScriptLanguage.JAVASCRIPT,[],UndoModes.fastEntireScript);
 }

main();
```

#実行結果

実行前
![スクリーンショット 2018-07-29 23.45.32.png](https://qiita-image-store.s3.amazonaws.com/0/139650/cd36d10c-d9c4-0907-8229-c652fdd6a920.png)


実行後
![スクリーンショット 2018-07-29 23.45.49.png](https://qiita-image-store.s3.amazonaws.com/0/139650/98cbf7cf-ae4c-3a95-9228-7033ed528667.png)
ExcelでVBAを使用せず，プルダウンリストで選択したデータのリンクへ飛ぶ

# はじめに  
タイトル通り，VBAを使用せず，プルダウンリストで選択した項目へジャンプするリンクを生成する方法です．
プルダウンリスト内に直接リンクを置くのはVBAなしじゃできそうにないと思ったので試しです．
お試しで確認がてら作ったので，もっと他にいい方法があるかもしれません．

# 詳細
以下のような感じで作ってみました．
![20180729235930.jpg](https://qiita-image-store.s3.amazonaws.com/0/249420/e00d418d-daec-6dea-a634-144bc3e13f58.jpeg)


B列：プルダウンリストに表示するデータ
C列：プルダウンリスト
D列：対象データへのリンク(HYPERLINK関数)
E列：プルダウンリストで選択したデータ列が対象データ列の何行目に存在するかを取得(MATCH関数)
F列：E列で取得したデータのセル番地を取得(ADDRESS関数)

## 関数詳細
D列：
("#対象データのあるシート名!"&対象セル(関数より算出),リンク名)

```
=HYPERLINK("#Sheet1!"&F2,C2)
```

E列：
(取得対象データ,対象データ集合)

```
=MATCH(C2,B1:B6)
```

F列：
(取得対象行,取得対象列)

```
=ADDRESS(E2,2)
```

以上．
CentOS7でApatchとnginxの共存（503 bad gatewayの対処）

#概要

これも何番煎じかわかりません、、、
Apatchとnginxを共存させた際の、503 bad gatewayへの対応メモです。

#方法

ApatchのLissenのポートを適当な番号に変えて、nginxをインストールする。
（インストールの方法はググったらいくらでも出てくるので割愛）

##Apatch側のConfig

```config:/etc/httpd/conf/httpd.conf

Listen 80
↓ #変更
Listen 50080

```

## nginx側のConfig

```config:/etc/nginx/conf.d/default.conf

server {
  listen 80;
  
  location / {
    proxy_pass http://127.0.0.1:50080;
    proxy_redirect                          off;
    proxy_set_header Host                   $host;
    proxy_set_header X-Real-IP              $remote_addr;
    proxy_set_header X-Forwarded-Host       $host;
    proxy_set_header X-Forwarded-Server     $host;
    proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
  }
}

```

こっからが問題でした、、、

#503 bad gatewayへの対応

nginxのログには次の記録が残っていました。

```text:/var/log/nginx/error.log

2018/07/29 23:23:12 [crit] 15305#15305: *3 connect() to 127.0.0.1:50080 failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:50080/", host: "localhost"

```

SeLinuxのログには次の記録が残っていました。

```text:/var/log/audit/audit.log

type=AVC msg=audit(1532874320.236:3240): avc:  denied  { name_connect } for  pid=16087 comm="nginx" dest=50080 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:ephemeral_port_t:s0 tclass=tcp_socket

```

SeLinuxで弾かれていました。
SeLinuxは無効にするのは気が引けるので、設定で通信を許可するようにします。

```sh
#確認
[root@localhost conf.d]# getsebool httpd_can_network_connect
httpd_can_network_connect --> off

#通信許可
[root@localhost conf.d]# setsebool -P httpd_can_network_connect 1

#確認
[root@localhost conf.d]# getsebool httpd_can_network_connect
httpd_can_network_connect --> on

```

これで503 bad gateway問題は解消されるはずです。

httpd_can_network_connectの詳細は[redhat. customer portal](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/selinux_users_and_administrators_guide/sect-managing_confined_services-the_apache_http_server-booleans)を参照。
CircleCIからSlackにファイルをアップロードする


## はじめに

今回CircleCIで技術書を書いてるときにビルドしたPDFをSlackに投げるようにしたのでその時のメモ

## 今回使うもの
* slackcat
    * slackに対してCUIからファイルの送信をするために使います

## slackmeの設定
まずCircleCIに設定する前にslcakのアクセストークンを得る必要とアプリケーションをSlackのワークスペースにインストールする必要があります。
今回は以上の前準備をローカルのmacで行います
### インストール
githubにslackcatのインストール方法が書いてあります。 もしbrewがインストール済みなら下のコマンドで可能です。
https://github.com/bcicen/slackcat

```bash
$ brew install slackcat
```

その後設定を行います。 設定は以下のコマンドを実行します

```bash

$ slackcat --configure
```

実行するとブラウザが立ち上がってインストールの許可を求められるので対処のワークスペースを選択して Authorizeを押します。
![スクリーンショット 2018-07-28 14.49.04.png](https://qiita-image-store.s3.amazonaws.com/0/77203/936cf90b-a887-29b5-f9b0-8b497698f2fa.png)

問題がなければトークンが表示されるのでメモします
![スクリーンショット 2018-07-28 14.49.43.png](https://qiita-image-store.s3.amazonaws.com/0/77203/51b6802d-bf09-57bc-1dfa-f7bec36f8903.png)

これで前準備は終わりです。

## CircleCIの設定yaml
CircleCIの設定をしていきましょう。

まずslackのトークンをCircleCIに登録してきましょう。
CircleCIのプロジェクト設定を開いて ` Environment Variables ` を開きます。
![スクリーンショット 2018-07-28 15.08.17.png](https://qiita-image-store.s3.amazonaws.com/0/77203/108d3b63-0a2e-f71e-8891-6f85818bb31f.png)

開いたら右上にある ` Add Variable` をクリックします。
![スクリーンショット 2018-07-28 15.08.21.png](https://qiita-image-store.s3.amazonaws.com/0/77203/e63e1e6d-bbbe-4037-dc10-23fe37612a33.png)

するとモーダルが表示されるのでNameに `slack_token` Valueには先程のトークンを入力しておきます。  ここにある値はYamlファイルで `${Name}`の形で呼び出せます。

以下が今回使用した設定Yamlです  
例としてNodeのイメージを使用しています

```yaml

version: 2
jobs:
  build:
    docker:
      - image: circleci/node:8
    steps:
      - checkout
      - run:
          name: npm install
          command: npm install
      - run:
          name: run textlint
          command: npm run lint
  deploy:
    docker:
      - image: node:6.10.0
    steps:
      - checkout
      - run: curl -Lo slackcat https://github.com/bcicen/slackcat/releases/download/v1.4/slackcat-1.4-$(uname -s)-amd64 && mv slackcat /usr/local/bin/ &&  chmod +x /usr/local/bin/slackcat
      - run: echo ${slack_token} > ~/.slackcat
      - run: slackcat --channel [投げるSlackのチャンネル名] ./[投げたいファイル]

workflows:
  version: 2
  build_and_deploy:
    jobs:
      - build
      - deploy:
          requires:
            - build
```

最初の下の部分はslackcatの設定ですね。Githubから落として実行可能状態にしています。また先程CercleCIに登録したSlackとトークンの情報を~/.slackcatに書き込んでいます。


```yaml
- run: curl -Lo slackcat https://github.com/bcicen/slackcat/releases/download/v1.4/slackcat-1.4-$(uname -s)-amd64 && mv slackcat /usr/local/bin/ &&  chmod +x /usr/local/bin/slackcat
    - run: echo ${slack_token} > ~/.slackcat
```

最後のいちぶんで 実際にSlackにファイル送信をしています。

```yaml
- run: slackcat --channel [投げるSlackのチャンネル名] ./[投げたいファイル]
```


## 実装結果
アカウントは自分のものになっていますが無事CircleCIのビルド時にPDFのポストされました！
![スクリーンショット 2018-07-29 0.09.38.png](https://qiita-image-store.s3.amazonaws.com/0/77203/5decfb37-458d-371d-3a12-2706496e61cd.png)
Golang で Let's Encrypt の証明書を発行して使用する

Golang で ACME プロトコルがサポートされてたみたいなので試してみた。


Document のとおりなんだけれど、以下のコードだけで証明書を発行してListenまでしてくれる。

[golang.org/x/crypto/acme/autocert](https://godoc.org/golang.org/x/crypto/acme/autocert)

```golang

package main

import (
        "fmt"
        "log"
        "net/http"

        "golang.org/x/crypto/acme/autocert"
)

func main() {
        mux := http.NewServeMux()
        mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
                fmt.Fprintf(w, "Hello, TLS user! Your config: %+v", r.TLS)
        })
        log.Fatal(http.Serve(autocert.NewListener("www.example.jp"), mux))
}
```

`autocert.Manager{}` を使えば、もっと細かく制御できるっぽい。
Python環境構築個人メモ

#Anacondaインストール
AnacondaはPythonのサイエンスパッケージ．必要なもの(エディター・パッケージ等)は大体手に入る．

インストール先レジストリで気を付けるべきこと
(1) スペースのないレジストリを使う(C:\Program File\Anacondaなどは良くない)
(2) 隠しファイルの中にインストールしない(その後うまくアップデートできなくなる)
(3) インストール時VCコードのオプションを選択するとエラーになりうる（Windows10おいて）．

#Minicondaインストール
Anacondaは容量が大きすぎるので，適切に自分が使うパッケージを選択してインストールすることにした．その際，最低限のパッケージが入っているminicondaを利用した．
(1) [Minicondaインストール](https://conda.io/miniconda.html) から適切に環境を選んでインストール
(2) Anaconda PromptだけがWindows10のアプリとして認識される．
(3) Anaconda Promptにまずconda install spyder と入力すると，しばらくダウンロードされるパッケージが現れる．最後にProceed?(進むか？)と聞かれるのでyを入力すると，spyderのパッケージがダウンロード開始となる．

```
conda install spyder
...(省略)
Proceed ([y]/n)? y
```


#pipを用いてモジュールをインストール
pipはモジュールをインストールするためのプログラムである[1].特に問題がない限りこれを用いてモジュールをインストールする．ただしサイエンスパッケージ(Anacondaなど)ではpipインストールができない場合がある．そのような場合はパッケージ全体の更新を行う(下記参照)．

```py

#Command Promptなどで

#(pip自体がない場合のみ)
python -m ensurepip --default-pip            
#Packageのインストール
python -m pip install SomePackage 
#Packageの更新
python -m pip install --upgrade SomePackage

#Anaconda Promptで
pip install openpyxl
pip install -U openpyxl #Update
```

#Anaconda & Spyder Update
pipでアップデートすると現在の環境が維持できないという警告が出たので，pip以外でアップデートすることを考える．

1. まずanacondaパッケージをupdateする．
Anaconda Promptを開き，conda update anacondaを入力する．これによりanacondaをアップデートする．

```
> conda update anaconda
```

2.上記のupdateでは，spyderはアップデートできなかった(2018/7)．そこで以下のコードをAnaconda Promptに記入し，spyderのアップデートを行った．その結果，spyderのアップデートができた．

```
> conda update spyder
```

**参照**
[1] [Installing Python Modules](https://docs.python.org/3.6/installing/index.html#installing-python-modules)
SpringBootのアプリをherokuにアップしてみた

[前回](https://qiita.com/keb/items/977b5901fb8e1b54f90e)の続き

SpringBootで作成したアプリをherokuにアップしてみた。

### 環境

- Mac High Sierra 10.13.5
- Java 1.8.0_11
- Maven 3.5.4
- springboot 2.0.3

### 手順

- githubとherokuを連携
herokuログイン後、アプリケーションを選択し、Deploy→Deployment methodでgithubを選択。App connected to GitHub で自分のgithubのリポジトリを探して、連携する。

- Procfileの設定
[herokuの手順](https://devcenter.heroku.com/articles/setting-the-http-port-for-java-applications)を参考に、Procfileを設定。

```:Procfile
web: java -Dserver.port=$PORT -jar target/[mvnで作成したjarファイル]
```

- system.propertiesの設定    
javaのバージョンを指定。

```:system.properties
java.runtime.version=1.8
```

あとは、ローカル→githubにpushすれば、自動でherokuに連携される。
herokuにうまく反映されたか確認するにはアプリケーションのOverviewを見れば、OK。
うまく行けば、「Build succeeded」と表示される。
アプリケーション設計

# Laravelでアプリケーション設計
## この記事の目的
今回Laravelでアプリケーションを開発していて、設計の現状と課題をまとめておく。具体的には、どこに何を書くべきなのかをまとめている

## 現状
現状は、Controller/Service/Model/Typeを使っている

## それぞれの現状の役割

### Controller
- ViewからReqeustを受けとって、RequestをServiceに渡して返ってきたデータをjsonにして返却している
- アクセス許可などもここで判定して返却することもある。

メソッド：index（一覧）、store（登録）、update（更新）、show（詳細）、delete（削除）

### Service
- 新規登録で渡ってきたフォームデータのバリデーション
- ModelにDBの値を取得するよう命令
- データの加工（ModelからDB値を取得してそのデータを加工する）
- ファイルアップロードの命令をする

### Model
- クエリビルダや生SQLを使ってDBから値を取得する
- リレーションの設定

### Type
- DBでENUMで定義されているものや1/0で定義しているものを定数で宣言している

## 課題
- Serviceが肥大化している
- Serviceでデータの加工/計算などをすべきか？

## 現状の答え
- Serviceが肥大化している
→ Repositoryクラスを使って、Serviceはメソッドを呼び出すだけにする

- Serviceでデータの加工/計算などをすべきか
→ データの加工/計算などはModelがすべきだと言われているが、これもRepositoryクラスで行う

## 備考
- ドメイン駆動設計（DDD）をちゃんと読んでいないので読まないと...
- この辺の設計で参考になる記事/書籍などはないだろうか？

## 更新内容
こんな記事があった。参考になりそう。
[Laravelリポジトリパターンの実装](https://qiita.com/bmf_san/items/c8d7b38b5f1f5747c2fd)
HalideのAndroid用デモを動かしてみたい

Halideは画像処理を高速に行うためのDSLです。Halideで適切なコードを書けば、CPUの拡張命令などを適切に使用して高速に画像処理を行うプログラムを作成することができます。

HalideはAndroidにも対応しています。より具体的に言うと、Qualcomm Snapdragon 820以降に搭載されているQualcomm Hexagon DSPで使うことができる拡張命令 (HVX) を使用したプログラムを作成することができます。

以下のREADMEに従って進めてみました。

https://github.com/halide/Halide/tree/cd95b27d6b969a1da8337ba820ad8d0c50884bff#halide-for-hexagon-hvx

### Halideをビルドする

libHalide.a が必要なので、最初にHalideをビルドします。zlibをリンクする必要があるので、インストールしておきましょう。

```
$ sudo apt install zlib1g-dev
```

あとは Halide のルートディレクトリで make するだけです

```
$ git clone --depth 1 https://github.com/halide/Halide.git
$ cd Halide
$ make -j3
```

### LLVMをビルドする

https://github.com/halide/Halide/tree/cd95b27d6b969a1da8337ba820ad8d0c50884bff#1-obtain-and-build-llvm-and-clang-v50-or-later-from-llvmorg

このREADMEの中ではSubversionを使ってLLVMのソースコードのダウンロードを行うこと勧めています。それに従ったのですが、少し時間がかかったので git `--depth 1` オプションを付けてGitでダウンロードしたほうが高速かもしれません。

### Hexagon SDKをインストーする

https://github.com/halide/Halide/tree/cd95b27d6b969a1da8337ba820ad8d0c50884bff#2-download-and-install-the-hexagon-sdk-and-version-80-hexagon-tools

少し面倒ではありますが、インストーラをダウンロードする際にサインアップを要求されます（登録は無料）。

ここには罠が2つあります。

1. Hexagon SDK 3.0を入れるとHexagon Tools 8.0がインストールされそうな雰囲気の説明がされていますが、Hexagon SDK 3.0に含まれているHexagon Toolsは7.2.12なので問題が起こります。Hexagon SDK 3.1を入れるとHexagon Tools 8.0.08がインストールされるので、Hexagon SDK 3.0とHexagon SDK 3.1を両方インストールしましょう。注意点として、Hexagon SDK 3.1に含まれるHexagon Toolsのインストール先は `$HOME/Qualcomm/Hexagon_SDK/3.1/tools/HEXAGON_Tools/8.0.08/Tools` です。
2. Hexagon SDKとHexagon Toolsをインストールすればよいと書いてありますが、実際にはAndroid NDKも後で必要になってきます。↓のダイアログが表示されたときにはチェックを入れておきましょう。Eclipseは不要です。Hexagon SDK 3.0の場合は1. で述べた理由によりHexagon Toolsも不要です。

![Screenshot from 2018-07-29 22-39-13.png](https://qiita-image-store.s3.amazonaws.com/0/154409/9726a823-1853-cc70-bbac-600af7ff48e5.png)

### Hexagon HVXのデモをシミュレータ上で動作させる

https://github.com/halide/Halide/tree/cd95b27d6b969a1da8337ba820ad8d0c50884bff#3-build-and-run-an-example-for-hexagon-hvx

`HL_HEXAGON_TOOLS` の環境変数を設定するときは、場所が変わっているので注意しましょう。

```
export HL_HEXAGON_TOOLS=$HOME/Qualcomm/Hexagon_SDK/3.1/tools/HEXAGON_Tools/8.0.08/Tools
```

シミュレータ上では動作したので、ビルド手順は正しいはずです。

### Hexagon HVXのデモをAndroidの実機上で動作させる

実機がないので未確認です。
Vue.jsをシンプルに理解しよう その4 -propsとemitについて-

# その4です
今回はpropsとemitについて紹介します。
難しいというよりかは、ややこしいので順を追って理解しましょう。

# 概念
<img width="400" alt="名称未設定 2018-07-28 23-43-17.png" src="https://qiita-image-store.s3.amazonaws.com/0/251548/ce457f8e-6e13-90ef-9424-1c872ecf7098.png">

propsとemitは親コンポーネントと子コンポーネント間での値の受け渡しに使います。
web系エンジニアの方なら、このような狂った親子ゲームには慣れてらっしゃいますよね？

# 具体例 props

まずpropsについてです、以下の図を見てください。

<img width="901" alt="Vue - JSFiddle 2018-07-29 15-46-33.png" src="https://qiita-image-store.s3.amazonaws.com/0/251548/a7fe51dc-ac96-4c8e-f2fc-3a994217b751.png">

v-bindを使ってbindした変数などをpropsで受け取ることで、親コンポーネントから子コンポーネントに値を渡します。

[JSFiddleで確認してください](https://jsfiddle.net/yusuke_ten/sLx6r1z9/)


## ケバブケースとキャメルケース
更に注意点としてhtmlは大文字を認識してくれません。


```html:だめな例
<my-component v-bind:childWord="parentWord"></my-component>
```

v-bind:の属性名はキャメルケースではなくケバブケースを用いましょう

```html:いい例
<my-component v-bind:child-word="parentWord"></my-component>
```

しかしケバブケースではjsの方で受けとれなくなります、なぜなら変数名にハイフンが使えないからです。

```javascript:だめな例
props: ['child-word']
```

vue.jsの粋な心遣いとして、htmlでケバブケースでv-bindした属性はpropsに渡ったときに勝手にキャメルケースに変換してくれます。（話をややこしくしている原因）

```javascript:いい例
props: ['childWord']
```

以下の図は問題なく動作します

<img width="928" alt="Vue - JSFiddle 2018-07-29 01-16-33.png" src="https://qiita-image-store.s3.amazonaws.com/0/251548/68e7e82a-8e3f-5de4-c72b-f18adf7abaaf.png">

非常にややこしい

# 具体例 emit
次にemitについてです、以下の図が最も簡単で基本的なemit例になると思います

<img width="988" alt="Vue - JSFiddle 2018-07-29 15-11-08.png" src="https://qiita-image-store.s3.amazonaws.com/0/251548/35644ce9-c8f6-5132-8649-267a54f55b7d.png">

親コンポーネントはイベントを受け取るときはv-onディレクティブでイベントを受け取ります。v-bindではないので注意しましょう。
またイベントを受け取ったら基本的にmethodsで関数を実行するといいでしょう。

[JSFiddleで確認してください](https://jsfiddle.net/yusuke_ten/6qftcsvk/)

emitは実行場所を選びません、また以下の図のように引数を付けてイベントを実行し、引数を親コンポーネントで受け取ることもできます。

<img width="1177" alt="Vue - JSFiddle 2018-07-29 15-38-14.png" src="https://qiita-image-store.s3.amazonaws.com/0/251548/2df95bc3-9497-a2f4-bffa-0b62c5a8ab41.png">

[JSFiddleで確認してください](https://jsfiddle.net/yusuke_ten/q9xr6wev/)

## ケバブケースとキャメルケース
emitではキャメルケースとケバブケースを勝手に変換してくれたりはしません、なのでイベント名は常にケバブケースを使いましょう。

# propsとemitを両方使う

<img width="1075" alt="Vue - JSFiddle 2018-07-29 17-47-56.png" src="https://qiita-image-store.s3.amazonaws.com/0/251548/9b7be843-ec25-1fcc-c9cd-d20bc76a587a.png">


書くのに疲れたので[JSFiddleで確認してください](https://jsfiddle.net/yusuke_ten/78d90nkL/)

v-forでたくさんコンポーネントを作って、propsで渡し、emitで受け取るのは結構使えるテクニックだと思うので覚えておくいいでしょう。

また注意点として、methodsなどからpropsの値を使う場合は以下のように

```javascript:
methods: {
  childFunction: function () {
    this.$emit('child-event', this.$props.childWord)
  }
}
```

と書きましょう

#　おわり
おわり
ローカルのJSONを読み込んでUITableViewで表示

iOSのプログラムをしてみました。

Xcode9のplaygroundでローカルのJSONファイルを読み込んでUITableViewで表示してみました。

以下のようなJSONファイルを使いました。

```json:users.json
[
  {
 "id": 1,
 "name": "Alice",
  },
  {
 "id": 2,
 "name": "Bob",
  }
]
```
このファイルをplaygroundのResoucesフォルダに追加します。

JSONのデコードはCodableを使いました。

JSONの１エントリをdecodeするCodableの構造体を定義して、JSONDecoder().decode()の引数に、その構造体のArray ```[User].self```を指定します。
とりあえず、これだけでJSONがデコードできます。


以下XcodeのPlaygroundで動くプログラムです。

```swift
import UIKit
import PlaygroundSupport

struct User: Codable {
    var id: Int
    var name: String
}

class TableViewController : UITableViewController {
    
    var users: [User]?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        loadJsonFile()
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.users?.count ?? 0
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell(style: .default, reuseIdentifier: nil)
        cell.textLabel?.text = "\(self.users?[indexPath.row].name ?? "null")"
        return cell
    }
    
    func loadJsonFile() {
        guard let path = Bundle.main.path(forResource: "users", ofType: "json") else { return }
        let url = URL(fileURLWithPath: path)
        do {
            let data = try Data(contentsOf: url)
            let users = try JSONDecoder().decode([User].self, from: data)
            self.users = users
        } catch  {
            print(error)
        }
    }
}

let tableViewController = TableViewController(style: .plain)
PlaygroundPage.current.liveView = tableViewController

```

実行するとこんな感じです。

<img width="377" alt="スクリーンショット 2018-07-29 22.05.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/42120/ca681d03-2959-c37c-99f8-ce5e1ad8be26.png">