OmniAICreator/Qiita-1.07M huggingface dataset:
[Python] Django 管理サイトのパスワードリセット機能を有効化する

##この記事について

PythonのWebアプリケーションフレームワーク Djangoの解説記事です。

Djangoの管理サイトではメール送信を使ったパスワードリセット機能が使えます。
初期状態では無効化されていますが、簡単な設定で有効になります。

## 設定方法

プロジェクトのurls.pyに以下の4行を追加します。
元のコードは「contrib/auth/urls.py」にサンプルとして定義されている設定です。

追加した後で、一番上の行の「password_reset」を「admin_password_reset」に変更してください。

```py:urls.py

from django.contrib import admin
from django.contrib.auth import views
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),

    path('password_reset/', views.PasswordResetView.as_view(), name='admin_password_reset'),
    path('password_reset/done/', views.PasswordResetDoneView.as_view(), name='password_reset_done'),
    path('reset/<uidb64>/<token>/', views.PasswordResetConfirmView.as_view(), name='password_reset_confirm'),
    path('reset/done/', views.PasswordResetCompleteView.as_view(), name='password_reset_complete'),

]

```

追加後に管理サイトにアクセスすると、パスワード入力欄の下にリンクが表示されます。ここクリックするとリセット処理のフローが始まります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/217094/d422f4e0-a0fd-5768-7c1d-1e1e76365eea.png)


## パスワードリセットのフロー

各画面、確認メールの本文は日本語化されています。ありがたいですね。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/217094/da507e2c-3f4e-89bb-27d3-a90629de7162.png)


##メール送信の設定方法

パスワードリセット時に確認メールが送信されます。
ですので実際に使うにはSettings.pyにSMTPの設定が必要となります。
以下、設定例です。

```py:settings.py

# 本番用 django/conf/global_setting.py を見て差分を修正する
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'your.address@gmail.com'
EMAIL_HOST_PASSWORD = 'passowrd'
EMAIL_PORT = 587
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'

# 開発用 コンソールに出力する
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

# 開発用 ファイルに出力する
EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
EMAIL_FILE_PATH = '/tmp/app-messages' # change this to a proper location

```

参考：[Djangoで簡単にGmailでメールを送る](https://qiita.com/nnsnodnb/items/e771364e53ce37b38059)

##仕組みについて

- パスワードの変更用のクラスベースビューはビルトインアプリ「auth」より提供されている。`django/contrib/auth.views.py`参照

- 各ビューに対応するテンプレートはビルトインアプリ「admin」で提供されている。ディレクトリ`contrib/admin/templates/registration`参照

・ビュー名：admin_password_resetが存在する時、管理サイトのログイン画面にリンクが表示されるようになっている。`contrib/admin/templates/registration/login.html`参照

クラスベースビューのクラス名とデフォルトテンプレート名の関係をまとめたものが以下の表です。

|機能|CBV名|テンプレート名|
|:--|:--|:--|
|ログイン|LoginView|login.html
|ログアウト|LogoutView|logged_out.html
|パスワード変更|PasswordChangeView|password_change_form.html
|パスワード変更（完了）|PasswordChangeDoneView|password_change_done.html
|パスワード再設定 申請|PasswordResetView|password_reset_form.html
|パスワード再設定 申請完了|PasswordResetDoneView|password_reset_done.html
|パスワード再設定メール本文||password_reset_email.html
|パスワード再設定 再設定|PasswordResetConfirmView|password_reset_confirm.html
|パスワード再設定 完了|PasswordResetCompleteView|password_reset_complete.html

各ビューに対応するテンプレートを用意することで自作の画面を作ることができます。

## 参考サイト
- [Djangoでログイン認証できるようになるまで](https://codelab.website/django-login/)
【Laravel】eventを2回以上呼ばないようにjQueryで制御する



「送信ボタンを押してメールを送る」実装を以下のようにeventで実装している。
このままだと、ボタンを押した数だけeventが発動してしまうのでメールが何通も送られてしまう。

```
public function postMail()
{
    event(new MailEvent());
    return redirect()->route("index");
}
``` 

これを解消する1つの手段として、jQueryを使ってクリック時のeventを制御する方法がある。
ポイントとしては `click` `dblclick`（ダブルクリック）の2つの場合を考慮しておくこと。

```js
$(()=>{
    var sent = false;
    $('.sendBtn').on("click", (e)=>{
        if(sent){
           e.preventDefault()
        }
        sent = true
    })
    $('.sendBtn').on("dblclick", (e)=>{
        e.preventDefault();
    })
})
```
SpringBootでJackson使用時にnullを空文字として扱いたい

# 目的
@ResponseBodyを利用時にフィールドにnullが設定されているオブジェクトを送信する際に生成されるJSONをnullを空文字に変換して送信したい。

これを

```Json:before
{
 "hoge":null,
 "fuga":"fuga"
}
```
こうしたい

```Json:after
{
 "hoge":"",
 "fuga":"fuga"
}
```


# まとめ
Jacksonが提供するObjectMapperに独自定義したシリアライザーをDefaultSerializerProviderを通して設定してやればよい。
この流れをSpringBootで実現する方法。
# 設定方法
SpringBoot利用時にはなるべくXML等を利用せず設定用のBeanを@Configrationを設定したクラスにまとめることが推奨されているので例にならって実装します。
## 設定用BeanComponent
```Java:AppConfig.Java
@Configuration
public class AppConfig {
  @Bean
  public Jackson2ObjectMapperBuilder jackson2ObjectMapper() {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder() {
      @Override
      public void configure(ObjectMapper objectMapper) {
        super.configure(objectMapper);
        DefaultSerializerProvider.Impl dsp = new DefaultSerializerProvider.Impl();
        dsp.setNullValueSerializer(new NullValueSerializer());
        objectMapper.setSerializerProvider(dsp);
      }
    };
    return builder;
  }
}
```
## 独自シリアライザ
```Java:NullValueSerializer.Java
public class NullValueSerializer extends JsonSerializer<Object> {
	@Override
	public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers)
			throws IOException, JsonProcessingException {
		gen.writeString("");
	}
}
```
# 参考
https://qiita.com/hikaruworld@github/items/0d629580584de1708b71
http://www.ne.jp/asahi/hishidama/home/tech/java/spring/boot/rest/jackson.html
RailsTutorial 6章 メモ

#6章　ユーザーモデルを作成する
##6.1 Model
Webアプリケーションではユーザの個別のデータを保存することが必要である。
Modelはデータの保存する手段を提供してくれる。
##ユーザの検索方法
- idで検索する方法

```ruby:
User.find(id)
```

- 属性で検索する方法

```ruby:
User.find_by(属性: 属性の値)
```

- 最初のレコードを取得

```ruby:
User.first
```

- 全てのレコードを取得

```ruby:
User.all
```

##レコードの属性の更新及び保存
- 1つの属性のみ更新する場合


```ruby:
user.update_attribute(name:"unio")
```

- 複数の属性を更新する場合


```ruby:
user.update_attributes(name: "unio", email "tutorial@gmail.com")
```
*※update_attributesでは1つの属性でエラーが出ると全ての更新が失敗する*

##6.2 ユーザを検証する
###Validationの種類
- 存在性　presence
- 長さ　length
- フォーマット　format
- 一意性　uniqueness
- 確認　confirmation

###検証（バリデーション）の記述方法
```ruby:
   validates :対象属性, 検証の種類
```

*記述例*

```ruby:app/models/user.rb
class User < ApplicationRecord
  validates :name, presence: true, length: { maximum: 50 }
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
  validates :email, presence:   true, length: { maximum: 255 },
                    format:     { with: VALID_EMAIL_REGEX }
end
```


###検証が失敗した場合
errorsオブジェクトが作成される
`>> user.errors.full_messages
=> ["Name can't be blank"]`

###正規表現
有効なメールアドレスには決まったルールが存在する。
そのルールに従っていないアドレスを検出してエラーを出せば無効なメールアドレスを登録してしまうことがない。
そのような決まった文字列にルールを与えられるようにするのに便利なのが**正規表現**。

```ruby:email属性に関する正規表現の例
  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
```
###インデックス
usersテーブルではemail属性に重複するデータが作成されるのを許したくない。
しかし検証(バリデーション)のみでは一意性を完全に保障することはできない。
データべースレベルで一意性を強制するためには**インデックス**が必要。

```ruby:インデックス追加の例
$ rails generate migration add_index_to_users_email
```

```ruby:db/migrate/[timestamp]_add_index_to_users_email.rb
class AddIndexToUsersEmail < ActiveRecord::Migration[5.0]
  def change
    add_index :users, :email, unique: true
  end
end
```

###パスワードハッシュ化
前提としてgem 'bcrypt'が必要

```ruby:password_digest属性の追加
$ rails generate migration add_password_digest_to_users password_digest:string
```

あとは `has_secure_password` をUserモデルに記述するだけでハッシュ化させられる。
デザイナーでも最低限Gitは使えるようになった方がいい理由

# Gitとの出会い
記事にこう書いたのに、去年の2017年3月に転職するまで、僕自身Gitなんて使ったことがなかった。
Gitすら知らなかった。

でも、うちの会社では自社システムを扱う都合上、**広報もバンバンGit使う**ので、技術職のデザイナーでも、Gitは当たり前の様に使う（当時社内でデザイナーは僕だけでしたが）

# そもそもGitって何？
と思うデザイナーも多いと思います。
Gitは分散型のバージョン管理システムの事で、元々はLinuxのソースコードを効率よく管理するために開発されました。
SVNが進化した感じですね。
ここでは詳しいGitの使い方は省きますので、Gitに関しては詳しくは、[ここのサイト](https://backlog.com/ja/git-tutorial/)を見てもらうのが早いと思います。
初心者向けっぽいですが、実務で使うものは大体ほぼ全て載っています。

# 実績のある会社は、デザイナーでも当たり前の様にGitを使う
と書いたのは、普通にCookpadでもデザイナーがGithubを織り交ぜた記事を書いていたりするからです。
http://techlife.cookpad.com/entry/2016/10/12/110000
僕は勉強会には結構参加するタイプなので、Cookpad以外にも様々な会社のデザイナーさんとよく会いますが、皆さん当たり前の様にGitを使いこなしています。

# デザイナーがGitを使うメリットって何？
Gitを知らないデザイナーは、そう思うと思います。

### 1. バージョン管理がやりやすい
Gitを使うメリットはいくつかありますが、まず**バージョン管理がやりやすい事**だと思います。
元々ソースコードのバージョンを管理したり、ソースコードの差分を分かりやすく表示させるために開発されたものですが、
このバージョン管理機能や差分表示は、**デザインデータでも応用が出来る**のです。
つまり、**ai,psd,xd,sketch等あらゆるデザインデータも、バージョン管理する事が可能**なのです。
これにより、

* いちいちデザインデータを変更するたびに、フォルダを作り分けたりする必要はなくなる
* 誰がどのようにデータを変更したのか、簡単に見る事が出来る

等のメリットがあります。
長い目で見れば、**作業時間の大幅な短縮**につながるのです。

### 2. 他の作業者と共同作業がやりやすくなる
**Gitは自分が作業した内容を、他の人に簡単に引き継ぐことが出来ます。**
例えば、僕がaiデータのアイコンを作成して、その続きを他の人に引き継ぐ事が簡単に出来ます。
具体的には、

* 作業内容を`git commit`して、`git push`して、`Pull Request`を出す。
* 他のデザイナーが`git fetch`して、`git checkout [branch名]`を入れる。

これだけでOKです。
他の人の作業を引き継ぐ場合、ファイルを手渡しするという方法もありますが、
それだと誰が、どのような変更を加えたのか分かりません。
履歴も残りません。

### 3. エンジニアとも共同作業がやりやすくなる
エンジニアと共同作業する場合、必要な画像データを渡すことがありますが、
Git管理する事によって、必要な画像を一元管理する事が可能です。

* 最新のデータはここにあるので、Repositoryをcloneしてください
* 画像データを変更したので、fetchしてmergeするか、pullしてください

で終了です。
カラーコードも、RepositoryのREADMEにでも入れておけば、簡単に見てもらうことが可能です。

# ただ、それなりに学習コストがかかります
Gitは便利ですが、意外とそれなりに学習コストが高いです。
デザイナーが使いこなすには、相応の訓練が必要なのもありますが、

* 他の人と共同作業しないと、Gitの真価を説明することが出来ない（他の作業している人のbranchを引き継いだり、コンフリクトの概念を理解する等）
* デザイナー目線から見た、Gitのメンターが少ない

のが主な理由になると思います。
ですが、覚えればおそらくかなり実務で役に立つ事でしょう。
実績は十分にあります。
VirtualBoxにRaspbianをインストール

Minecraft Pi Editionで遊びたかったのですが、どうやらRaspberry PiのGPU専用に出来て
いるらしく、Minecraftはインストールすることが出来ませんでした。

ともあれ、デスクトップ自体は無事に起動しました。公式サイトでDesktop版が提供されています。

https://www.raspberrypi.org/downloads/raspberry-pi-desktop/

ここからダウンロードしたisoを仮想CD-ROMにセットして、あとはインストーラの指示通りに進みます。

コツが必要だったのが、Guest Additionのインストールです。自動的に起動してきませんでしたので、
(CDを挿入後)以下のコマンドを実行します。

```
sudo bash /media/cdrom/VBoxLinuxAdditions.run
```

これが済むとディスプレイの解像度を変更することが出来るようになります。
PyMieScatt > LowFrequencyMieQ() > for small size parameter

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
```

http://pymiescatt.readthedocs.io/en/latest/forward.html#LowFrequencyMieQ

```math
c = \lambda f
```

```math
f = \frac{c}{\lambda}
```

LowFrequencyの時、$\lambda$は大きくなる。

それによりsize parameter x(下記)は小さくなる。

```math
x = \frac{\pi d_p}{\lambda}
```

### TODO

- [ ] 実装の元になっている式の整理
NginxのアクセスログをJSON形式で出力する

# TL;DR

`log_format` ディレクティブでパラメータ `escape=json` を指定する。

- http://nginx.org/en/docs/http/ngx_http_log_module.html#log_format

```Nginx:nginx.conf
http {
  :
  log_format json escape=json '{"time": "$time_iso8601",'
    '"host": "$remote_addr",'
    '"vhost": "$host",'
    '"user": "$remote_user",'
    '"status": "$status",'
    '"protocol": "$server_protocol",'
    '"method": "$request_method",'
    '"path": "$request_uri",'
    '"req": "$request",'
    '"size": "$body_bytes_sent",'
    '"reqtime": "$request_time",'
    '"apptime": "$upstream_response_time",'
    '"ua": "$http_user_agent",'
    '"forwardedfor": "$http_x_forwarded_for",'
    '"forwardedproto": "$http_x_forwarded_proto",'
    '"referrer": "$http_referer"}';

  server {
    :
    access_log /path/to/access_log json; # 上で設定したjsonフォーマットを使う
    :
  }
  :
}
```

# 解説

この `escape` パラメータのデフォルト値は `default` である。
この場合、 `"` (0x22)や `'` (0x27)はそれぞれ `\x22`, `\x27` のようにエスケープされる。[^1]

`json` オプションはNginx 1.11.8で導入された。

また、Nginx 1.13.10では `escape=none` によって、エスケープしないというオプションが追加されるようだ。[^2]

[^1]: 0x00-0x1F, 0x7F-0xFFの範囲の文字も同様にエスケープされる。参考: http://nginx.org/en/CHANGES v0.7.0, v1.1.6の変更。
[^2]: https://trac.nginx.org/nginx/ticket/1450 のパッチによるようだ。

## 数値を数値型で扱わないのはなぜか？

`$status` や `$request_time` のような、本来JSONの数値型で扱うべき値も `"$status"` のように文字列型で扱っていることが気になるという人がいるかもしれない。

これらのような値をクォートしない形式で設定するとどうなるだろうか。
実は、値が取得できないときに空文字になり、invalidなJSONになってしまう。
結果として、エラーによりログ出力ができなくなってしまう。

そこで、ここでは簡単のため文字列型で扱う例を示した。

# 参考

- [logging - How to generate a JSON log from nginx? - Stack Overflow #42564710](https://stackoverflow.com/questions/25049667/how-to-generate-a-json-log-from-nginx/42564710#42564710)
- [nginxのアクセスログをjson形式で出力する - Qiita #comment-44552e94bfe652f88560](https://qiita.com/kumata/items/15d05a662b1add87546f#comment-44552e94bfe652f88560)

# 脚注
Python > package > PDielec package > calculates the infrared absorption characteristics of a crystalline material

> The Python package, PDielec calculates the infrared absorption characteristics of a crystalline material supported in a non absorbing medium by post processesing the output of solid state quantum mechanical and molecular mechanical calculations of the phonons or dielectric response of the crystalline material. 

- Authors: John Kendrick and Andrew Burnett
- Reference
    - John Kendrick and Andrew D. Burnett Journal of Computational Chemistry 2016, vol 27, 1491-1504 [DOI: 10.1002/jcc.24344](https://onlinelibrary.wiley.com/doi/abs/10.1002/jcc.24344)
- Auxilliary programs are also distributed
    - pgdui
    - preader
    - phonana

http://pymiescatt.readthedocs.io/en/latest/forward.html#AutoMieQ
> Thanks to [John Kendrick](https://github.com/JohnKendrick/PDielec) for discussions about where to best place the crossover point.
phpで日付をフォーマットに当てはめて表示するのに苦労した話

今回、日付をフォーマットに当てはめて表示するのに苦労した。

```php
<?php
        $week = ['日', '月', '火', '水', '木', '金', '土'];
        foreach($caht_query as $row) { ?>
        <dl>
          <dt class="chatmb-name<?php
          $current_user->ID == $row->from_user_id ? print ' chatmb-self' : print ' chatmb-partner';
          ?>"><?php echo $row->from_user_name; ?></dt>
          <dd class="chatmb-message"><?php
          image_flag ? print $row->message : print $row->message;
          ?></dd>
          <dd class="chatmb-date"><?php
          $date = new DateTime($row->create_time);
          echo $date->format('n.j(').$week[$date->format('w')].$date->format(') H:i');
          ?></dd>
        </dl>
        <?php } ?>
```

って感じでなんとかうまくいった。

# 曜日の日本語化

ポイントは、曜日の日本語化だったかな。

まず配列に文字を入れる。

```php
        $week = ['日', '月', '火', '水', '木', '金', '土'];
```

オブジェクト化する

```
          $date = new DateTime($row->create_time);
```

出力の際、通常のやつと曜日とで分ける。

##date関数だけじゃったらフォーマットうまくいかんかった。
苦労したのは

```php
date(フォーマット形式 [, タイムスタンプ]（[ ]は省略可）);
```

みたいな形がダメじゃったこと
たぶん、タイムスタンプとして持ってきてた変数が、形式がダメじゃったんじゃろう。


#参考URL
PHPで日付関数を使いこなす（date, strtotime）
https://qiita.com/shuntaro_tamura/items/b7908e6db527e1543837

PHP: date
http://php.net/manual/ja/function.date.php

【PHP入門】DateTimeを使って日付をフォーマットしてみよう！
http://programming-study.com/technology/php-datetime/
phpで変数はダブルクオーテーションの中に入れられるよ、という話

すっごい初歩的な話ですけど。

わざわざ`br`タグを2行にして書く必要ないですよ、というのと
ダブルクオーテーションの中だったら変数もちゃんと変換してくれるよ、という話。

```php
echo $row->from_user_id
echo "<br>";
```

こう書き換えられます。

```php
echo "$row->from_user_id<br>";
```
スッキリ☆


さらに言うと、変数は{}で囲んだほうがいいらしい！

```php
echo "{$row->from_user_id}<br>";
```
ddコマンドでファイルを作成する

# はじめに
一定のサイズのファイルを作るのに便利なddコマンドの使い方を勉強しました。

# 書式
dd if=/dev/zero of=filename bs=size count=1

```
[root@sv12-CentOS74 ~]# dd if=/dev/zero of=ddtest bs=1024 count=1
1+0 レコード入力
1+0 レコード出力
1024 バイト (1.0 kB) コピーされました、 0.000419075 秒、 2.4 MB/秒
[root@sv12-CentOS74 ~]# ls ddtest -lh
-rw-r--r-- 1 root root 1.0K  3月 19 04:21 ddtest
```

bsで指定するファイルサイズにはKやMをつけることができます。分かりやすくて良いですね。

```
[root@sv12-CentOS74 ~]# dd if=/dev/zero of=ddtest bs=1M count=1
1+0 レコード入力
1+0 レコード出力
1048576 バイト (1.0 MB) コピーされました、 0.00152422 秒、 688 MB/秒
```

メモリに乗り切らないぐらいの大きさのbsを指定すると失敗します。

```
[root@sv12-CentOS74 ~]# dd if=/dev/zero of=ddtest bs=1G count=1
dd: 大きさ 1073741824 バイトの入力バッファによりメモリを使い果たしました (1.0 GiB)
```

この場合にはbsの値を小さくして、countの値を大きくすることで対応しましょう。bs*countの値が最終的に出力されるファイルサイズです。

```
[root@sv12-CentOS74 ~]# dd if=/dev/zero of=ddtest bs=1M count=1024
1024+0 レコード入力
1024+0 レコード出力
1073741824 バイト (1.1 GB) コピーされました、 2.70237 秒、 397 MB/秒
[root@sv12-CentOS74 ~]# ls ddtest -lh
-rw-r--r-- 1 root root 1.0G  3月 19 04:27 ddtest
```
Ethereum クライアント


Ethereum を利用するための統一的なクライアントがあるわけではなく、様々なクライアントが用意されている。go-ethereum と Parity の開発が活発らしい。

| Client	| Language	| Developers	| Latest release|  
| :--------|----------|-------------| --------------| 
| [go-ethereum](http://www.ethdocs.org/en/latest/ethereum-clients/go-ethereum/index.html#go-ethereum)	<br>＊geth| Go	| Ethereum Foundation	| go-ethereum-v1.8.2<br>(2018.3)| 
| [Parity](http://www.ethdocs.org/en/latest/ethereum-clients/parity/index.html#parity)	| Rust	| Ethcore <br>＊Ethereum Foundationメンバーで設立	| Parity-v1.8.11<br>(2018.3)| 
| [cpp-ethereum](http://www.ethdocs.org/en/latest/ethereum-clients/cpp-ethereum/index.html#cpp-ethereum)	| C++	| Ethereum Foundation	| cpp-ethereum-v1.3.0<br>(2016.7 ???)| 
| [pyethapp](http://www.ethdocs.org/en/latest/ethereum-clients/pyethapp/index.html#pyethapp)	| Python	| Ethereum Foundation	| pyethapp-v1.5.0<br>(2016.8)| 
| [ethereumjs-lib](http://www.ethdocs.org/en/latest/ethereum-clients/ethereumjs-lib/index.html#ethereumjs-lib)	| Javascript	| Ethereum Foundation	| ethereumjs-lib-v3.0.0<br>(?)| 
| [Ethereum(J)](http://www.ethdocs.org/en/latest/ethereum-clients/ethereumj/index.html#ethereum-j)	| Java	| ＜ether.camp＞	| ethereumJ-v1.6.3<br>(2017.11)| 
| [ruby-ethereum](http://www.ethdocs.org/en/latest/ethereum-clients/ruby-ethereum/index.html#ruby-ethereum)	| Ruby	| Jan Xie	| ruby-ethereum-v0.11.0<br>(2016.11)| 
| [ethereumH](http://www.ethdocs.org/en/latest/ethereum-clients/ethereumh/index.html#ethereumh)	| Haskell	| BlockApps	| no Homestead release yet| 


# 参考
- http://www.ethdocs.org/en/latest/ethereum-clients/choosing-a-client.html
- 各クライアントのサイト
JavaScriptのシンプルなグラフ表示ライブラリ

# Chart.js
* Canvas で描画するため、ラスター形式（ビットマップ形式）で描画。
* 他ライブラリに依存しないグラフライブラリ
* レスポンシブ対応

# Chartist.js
* SVG で描画
* 他ライブラリに依存しないグラフライブラリ
* レスポンシブ対応

https://qiita.com/laqiiz/items/b67ac5ae93f83c4bd0b6

http://webcake.no003.info/webdesign/chartjs.html
google検索の「他の人はこちらも検索」をけすchrome拡張の作成

# 動機
「他の人はこちらも検索」が鬱陶しいので，消したかった．

# ソースコード

```json:manifest.json
{
  "name" : "Remove People also search for",
  "version" : "0.1",
  "manifest_version" : 2,
  "description" : "google検索の他の人はこちらも検索を消す",
  "content_scripts" : [{
    "matches" : ["https://www.google.com/*","https://www.google.co.jp/*"],
    "css" : ["remove.css"]
  }]
}
```

```css:remove.css
div.AUiS2{
    display: none !important;
}
```

この2つのファイルをおいたディレクトリをパッケージ化されていない拡張機能を読み込むで読みこめば良い

# 参考
[Chrome拡張（4）特定のページで背景画像を変更する - 日常の進捗 - takawo](http://takawo.hatenablog.com/entry/2017/10/05/234924)
[Remove "People also search for" suggestions that show up below a visited link ](https://productforums.google.com/forum/#!msg/websearch/nBBYVJ-sZZg/uXndlFcDCgAJ)
dyld: Library not loaded: /usr/local/opt/mpfr/lib/libmpfr.4.dylib   Referenced from: /usr/local/bin/awk   Reason: image not found

# 状況

- 良くわからないが、rails s をした時にこのようなエラーがでる。

```
dyld: Library not loaded: /usr/local/opt/mpfr/lib/libmpfr.4.dylib
  Referenced from: /usr/local/bin/awk
  Reason: image not found
```

- zshのcdコマンド単体が下記エラーが出てうごかない

```
$ cd
: no such file or directory
```

# 解決策

```
brew upgrade gawk
```

シンボルリンクを張り直したり、zshrcを何回も確認したりしたが治らなかった。
原因としては、postgreSQLを9.6系から10.3系にあげる際に

https://gist.github.com/giannisp/ebaca117ac9e44231421f04e7796d5ca

コレをやったのが原因だと思う。詳しく調べられていないので、メモ代わり的にここに置いておきます。


# 痕跡
https://qiita.com/sudahiroshi/items/97cbc8571ebb239202af
https://stackoverflow.com/questions/40240938/the-mac-os-has-a-bad-shell
https://qiita.com/jshimazu/items/edc92ee731d9fa711f49
アンテナ屋内、屋外利用のデメリット


# 屋内利用時のデメリット

携帯電話基地局が屋外に設置されている為、屋内利用時は電波の到来の観点では、壁や窓を通過する為、屋外利用と比較し不利に。

# 屋外利用時のデメリット
屋外に設置する為に、延長ケーブル等を利用した場合は、
ケーブルによる減衰があり、それも性能劣化の要因となる。
node.jsインストールしたが扱い方忘れたメモ

node.jsを以前インストールしましたが、扱い方を忘れてしまったので、今後同じことがないようにメモしておきます。

## node.jsの概要

サーバーサイドのJavaScript実行環境。以下のメリットがある。
- 非同期処理を容易に実行できる。
- シングルスレッドで動作する。デッドロックが発生しない。多数の同時接続を処理することが可能。

## node.js周りのツール

### nodebrew

node.jsのバージョン管理ツール。nodebrewのインストールは下記コマンド。
設定ファイルの変更が必要。

```bash
$ curl -L git.io/nodebrew | perl - setup #nodebrewインストール
$ vi ~/.bash_profile #bash_profile変更
$ export PATH=$HOME/.nodebrew/current/bin:$PATH #左記を加える
```

nodebrewのバージョン関連のコマンドは下記。

```bash
$ nodebrew -v #現在利用中のバージョンを確認
$ nodebrew use vx.x.x #利用するnodeのバージョンを指定
$ nodebrew ls #インストールされているnodeのバージョン一覧を表示
```

最新のnodeのバージョンを確認するためには下記。

```bash
$ nodebrew ls-remote
```

nodeをインストール。

```bash
$ nodebrew install stable #最新の安定版をインストール
$ nodebrew install-binary x.x.x #バージョン指定してインストール
```

### nvm

Node Version Manager。node.jsのバージョン変更を容易にするツール。nodebrewと役割は同様。

nvmのインストールは、gitからホームディレクトリにnvmをcloneする。

```bash
$ git clone git://github.com/creationix/nvm.git ~/.nvm
```

nvmのバージョン関連のコマンドは下記。

```bash
$ nvm --version
```

nvmの利用方法は下記記事を参照。
https://qiita.com/tanishi/items/f741e4bebfb6b6d470dc

### npm

Node Packaged Modules。node.jsをインストールするとnpmも利用できるようになる。npmはローカルモード、グローバルモードでパッケージをインストールできる。

- ローカルモードでは、カレントワーキングディレクトリのnode_modulesフォルダーにパッケージをインストールできる。所有者はカレントユーザ。
- グローバルモードでは。rootが所有する{prefix}/lib/node_modules/にパッケージをインストールできる。所有者はrootユーザ。パッケージをグローバルにインストールするには `sudo` を利用する。

グローバルパッケージの一覧を表示するには下記コマンド。

```bash
$ npm list --global
```

npmのバージョン関連のコマンドは下記。

```bash
$ npm --version #現在利用中のバージョンを確認
$ npm -v #上記と同じ
$ npm install -g npm #npmのバージョンを上げる（npmでnpm自身をアップデート笑）
```

npmは他にも様々なコマンドがある。

```bash
$ npm i [パッケージ] #パッケージをローカルにインストール
$ npm i -g [パッケージ] #パッケージをグローバルにインストール
$ npm un [パッケージ] #ローカルパッケージをアンインストール
$ npm up #パッケージを更新
$ npm t #テストを実行
$ npm ls #インストールしたモジュールを一覧表示
$ npm ll #モジュールを一覧表示するとともに追加のパッケージ情報を表示
$ npm la #上記と同じ
```

## nodeを利用開始

ターミナル起動直後ではnodeは利用できない。設定ファイルを実行する必要がある。

```bash
$ source ~/.bash_profile
```

ただ、設定ファイルを下記に書き換えれば、都度上記を実行せず済む。

```bash
$ export PATH=$HOME/.nodebrew/current/bin:$PATH #変更前
#↓変更後
if [[ -f ~/.nodebrew/nodebrew ]]; then
    export PATH=$HOME/.nodebrew/current/bin:$PATH
    nodebrew use v0.12.7
fi
```

## nodeを起動

対話環境の立ち上げで簡単にnode実行を試してみる。

```bash
$ node #対話環境立ち上げ
> console.log("hello world");
hello world
> .help #使えるコマンドを参照
> .exit #退出
```

実際にjsファイルを作成し、実行するには下記。

```bash
$ node /<path>/app.js #jsファイルの実行
$ open http://localhost:3000/ #ブラウザ起動して確認する場合、例えば左記
```

## まとめ

普段扱ってないとすぐ忘れてしまいます。。。
随時更新していければと思います。
さくらVPS SSH接続

## sshコマンドによるサーバ接続

下記コマンドでssh接続。xxx部分はサーバのIPアドレス。

```
ssh root@xxx.xxx.xxx.xxx
```

OSを再インストールの場合に、上記コマンドを打つとエラーが出て接続出来ない場合がある。その場合は、`~/.ssh/known_hosts`ファイルに鍵認証が残っていないか確認し、あれば削除する。

## OSアップデート

```
# yum update
```

## rootユーザーのログインを禁止

一般ユーザを作成

```
# adduser sampleuser
```

一般ユーザのパスワードを設定

```
# passwd sampleuser
```

rootユーザでのアクセス終了

```
# exit
```

一般ユーザでssh接続

```
ssh sampleuser@xxx.xxx.xxx.xxx
```

rootユーザに切り替え

```
$ su -
```

設定ファイルのバックアップ作成

```
# cd /etc/ssh
# cp sshd_config sshd_config.old
```

設定ファイルを編集

```
# vim sshd_config
```


`#PermitRootLogin yes`の記述を検索し、`PermitRootLogin no`に変更する。

sshdを再起動すると設定が有効になる。

```
# systemctl restart sshd.service
```

## ssh接続を鍵認証で行う

鍵を作成

```
cd ~/.ssh
ssh-keygen -f sakura_rsa -t rsa -b 2048
```

鍵をサーバに登録

```
ssh-copy-id -i ~/.ssh/sakura_rsa.pub sampleuser@xxx.xxx.xxx.xxx
```

接続確認

```
ssh -i ~/.ssh/sakura_rsa sampleuser@xxx.xxx.xxx.xxx
```

## パスワードでのログインを禁止

sshのコンフィグファイルを開く。

```
$ sudo vim /etc/ssh/sshd_config
```

下記の設定を`no`に設定する。

```
PasswordAuthentication no 
```

設定を反映。

```
$ sudo systemctl restart sshd
```

## SSH接続ポートを変更

```
$ sudo vim /etc/ssh/sshd_config
```

下記の記述を検索する。

```
#Port 22
```

コメントアウトを外してポート番号を10022に変更。

```
Port 10022
```

コンフィグファイルを編集したら忘れずに設定を反映させる。

```
$ sudo systemctl restart sshd
```

このままだとログインできないためfirewalldの設定を変更する。

```
$ sudo vim /usr/lib/firewalld/services/ssh.xml
```

portの番号を10022に変更。

```xml
<port protocol="tcp" port="10022"/>
```

firewalldの設定を反映。

```
$ sudo firewall-cmd --reload
```
apache2: Configuration error: More than one MPM loadedのへの対処


apt-getup gradeでapache2のバージョンが2.4.10になったことにより、
設定ファイルに複数のmpmモジュールを記載していると競合が発生し、apach2が起動しない事象が発生した。

```
Starting web server: apache2AH00534: apache2: Configuration error: More than one MPM loaded
```


下記のようにバッティングしているファイルを削除したところ、
apacheが起動するようになった。

```
$ view /etc/apache2.conf
# Include module configuration:
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf

$ ls -l /etc/apache2/mods-enabled/mpm*

$ rm -f /etc/apache2/mods-enabled/mpm_event.load
$ rm -f /etc/apache2/mods-enabled/mpm_event.conf
```

---
OpenVPNでのクライアントのIP固定化

OpenVPNでのクライアントのIP固定化

1. クライアント別の設定ファイルを読み込むディレクトリを指定
 
```
$ view /etc/openvpn/server.conf
client-config-dir ccd

※ 上記の設定の場合 /etc/openvpn/ccd配下にあるファイルを読み込みます。
```

2. クライアント名ごとに下記のファイルを作成する

```
$ view /etc/openvpn/ccd/client_name
ifconfig-push 10.10.0.22 10.10.0.23

※ コマンド クライアントのアドレス サーバのアドレス の順に記載する
※ アドレスは4づつずらす、つまり、次のクライアントに割り当てるIPアドレスは10.10.0.26
```




----
Python 機械学習プログラミング P.34 2.5.5式の導出方法コラムのメモ

少し詰まって、微分の教科書を出して来たので、一応メモ。
偏微分は対象の変数以外を定数として扱うので基本的には微分と同様。
ここの導出過程のコラムの2つ目から3つ目への計算で用いられているのは、以下の合成関数の微分公式。

{f(g(x))}’ = f’(g(x)) * g(x)’

この場合、g(x) = y - φ(z)となり

f’(y - φ(z))
 = f’(u) * g(x)’
 = {(u)^2}’ * g(x)’
 = 2u * g(x)’
 = 2(y - φ(z)) * (y - φ(z))’

となるわけですね。
微分の記憶がかけらもなかったので、全然わかりませんでした。
因みに、この公式の導出もかなり簡単です。
私は以下の本を参照にしました。

[1冊でマスター 大学の微分積分](https://www.amazon.co.jp/dp/B06Y2T6MTK/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
¥と\って同義だと思ってた。違うのね＞＜

#初めてQiitaに投稿します。
Railsを覚える取っ掛かりとしてまずはRubyを覚えようと勉強始めました。

###環境など
- macbook
- MacOS High Sierra
- IME Atok
- RubyMine体験版
- [Rubyによるクローラー開発技法](http://www.sbcr.jp/products/4797380354.html)　のP41の正規表現部分


今までWindowsだからか同義だと思って意識してなかったけど、
『＼』と『￥』が違う事に気が付かずメチャクチャハマってしまった。


色々やってダメで、
サンプルソースを手に入れてRubyMineにコピペしした時に、
\と¥が同時に表示されて『ファ！？』ってなった。
```
  dates_bad      = page_source.scan( %r!(¥d+)年 ?(¥d+)月 ?(¥d+)日<br />!)
  dates_good       = page_source.scan( %r!(\d+)年 ?(\d+)月 ?(\d+)日<br />!)
```
dates_badだとどうしても上手く正規表現が動かない、
そもそも書籍には¥が表示されてるから間違ってないと思ってた。
MESHで喋る枕をつくる

#この記事について#
MESHというあらゆるものをIOT(センサーを組み込み、連携する)化できる商品があるとネットで見て、さっそく使ってみた。
使い方の一例として、ぬいぐるみに取り付けて、喋るぬいぐるみにできるとあったので、ぬいぐるみの代替として、枕を使った。

#作品名#
パンチすると痛がる枕

#作り方
MESHアプリをダウンロード
↓
アプリで動きを設定
■動き
MESHの動きタグ(入力:振動したら)→→→メディアのスピーカータグ(出力:録音した音を出す)
↓
設定が終わったら、MESHを枕に入れる。
↓
枕に振動を加える。(パンチ)
↓
枕が痛そうな声を出す。(ように見せかけられる。実際はスマホから録音した音が出る。これは他の機器で代替可能)

たったこれだけである。

#感想
枕になんらかの動きを加えると喋るというのはとてもシュールで思わず笑ってしまった。
応用例として、抱き枕に仕込んで不健全な台詞を喋らすことも可能かもしれない。

#参考
[おすすめ！ソニー発の電子タグ「MESH」を楽しむレシピ5選](http://blog.meshprj.com/entry/column2)
Python3でNEMのAPIを叩く-007-アカウントが作成したモザイク定義を取得<コーディング編>

#はじめに
[前回](https://qiita.com/oden_umai/items/a835355fcbdbaefb8936)は事前準備としてモザイクを定義しました。
今回では、そのモザイク定義をAPIを使って取得します。

#使うAPI
/account/mosaic/definition/page　を使用します。

>![スクリーンショット 2018-03-19 0.54.30.png](https://qiita-image-store.s3.amazonaws.com/0/242994/e6cf1e08-1a63-98f9-610e-96c2a24122ce.png)
>(解説：和訳)https://www.pr1sm.com/crypto-coin/nem-nis-api-documentation-in-japanese/#retrieving-mosaic-definitions-that-an-account-has-created

>![スクリーンショット 2018-03-19 0.56.44.png](https://qiita-image-store.s3.amazonaws.com/0/242994/d3066547-df2a-067c-0fd7-2d40d3d535ad.png)
>(解説：本家)https://nemproject.github.io/#retrieving-mosaic-definitions-that-an-account-has-created


#サンプル
##コード
実行環境が無い方はpaizaで試せます。
https://paiza.io/ja

```python:Python3
import requests
import json

node = 'http://50.3.87.123:7890'    # テストネットのノード
api = '/account/mosaic/definition/page'
parameter = 'address=TCJC5VFBIYF5TKEUS273XS7IXUKJ36I3JCJQ7WOH'
url = str(node + api + '?' + parameter)

r = requests.get(url).json()

print(json.dumps(r,indent=4))
```

##結果の例
```json:json
{
    "data": [
        {
            "id": {
                "name": "tamago",
                "namespaceId": "oden"
            },
            "levy": {},
            "properties": [
                {
                    "name": "divisibility",
                    "value": "6"
                },
                {
                    "name": "initialSupply",
                    "value": "9000000000"
                },
                {
                    "name": "supplyMutable",
                    "value": "true"
                },
                {
                    "name": "transferable",
                    "value": "true"
                }
            ],
            "creator": "756317d797f742b695cece76aa74ecd47305b48d5158c6dab44a48592de0325e",
            "description": "\u304a\u3067\u3093\u306e\u5b9a\u756a\u3002tamago\u3067\u3059\u3002\u304a\u3067\u3093\u306e\u51fa\u6c41\u3092\u5438\u3044\u53d6\u3063\u3066\u30a6\u30de\u30a6\u30de\u3067\u3059\uff01"
        }
    ]
}
```

##解説
前回作成したネームスペースodenのモザイクtamagoの定義が返ってきていますね。
propertiesがNano Walletで見たとき、下図になります。

```json:json
            "properties": [
                {
                    "name": "divisibility",
                    "value": "6"
                },
                {
                    "name": "initialSupply",
                    "value": "9000000000"
                },
                {
                    "name": "supplyMutable",
                    "value": "true"
                },
                {
                    "name": "transferable",
                    "value": "true"
                }
            ],
```
![スクリーンショット 2018-03-19 1.08.01.png](https://qiita-image-store.s3.amazonaws.com/0/242994/3e006a48-d079-e3bb-f7ee-fa1e5cbb3fb4.png)

#次回
[Python3でNEMのAPIを叩く-008-[最終回]アカウントのトランザクションデータを取得する
](https://qiita.com/oden_umai/items/da463568449aa0941eed)
自分メモ用　2つのベクトルの角度を求めるソースコード

```csharp
static float Angle(3DVector A,3DVector B)//適宜3Dvectorを必要に応じて変更する
{
    float dot=((A.x*B.x)+(A.y*B.y)+(A.z*B.z));
    float magnitude=((A.x*A.x)+(A.y*A.y)+(A.z*A.z))*((B.x*B.x)+(B.y*B.y)+(B.z*B.z))
    float cos=dot/magnitude;
    float acos =Acos(cos);//ここも必要に応じて変更する
    float angle =acos*180/3.14
//度に変換すること

    return angle;
}
```
Python3でNEMのAPIを叩く-006-アカウントが作成したモザイク定義を取得<準備編>

#はじめに
[前回](https://qiita.com/oden_umai/items/10da8b59a9b0091505c3)はXEMについて取り扱いましたが、今回はモザイクについて取り扱おうと思います。

モザイクとはNEMで発行できる独自のトークン（通貨みたいなもの）です。手数料がXEMで少し必要ですが、Nano Walletから数分で簡単に独自トークンを発行することが出来ます。

どんなモザイクの情報を取得してもいいのですが、順を追って説明しやすいので、私がテストネットで作ったモザイクを使おうと思います。
今回はモザイクを定義して、次回でモザイク定義を取得するAPIの紹介で活用します。

モザイクの作成には、以下の手順を踏みます。
1.ネームスペースの作成（必須）
2.サブネームスペースの作成（任意）
3.モザイクの作成(必須)

ネームスペースとサブネームスペースについては、トレストさんのサイトを引用します。
>counterpartyなど他に独自トークンを発行できるものは単一のトークン名を付けるだけになりますが、NEMではまずネームスペースというものを得るところが特徴的です。

>NEM公式情報では、インターネットでいうドメインのようなものだと定義されています。

>ネームスペースはレンタルすることで取得できます。もしあなたが「diner（ダイナー、食堂）」というネームスペースを取得すると、他の誰かはそれを重複して取得することはできません。レンタルの有効期限は1年間です。

>また、サブドメインと似たような感覚でサブネームスペース（sub-namespace）を1つのネームスペースにつき最大2階層まで取得することができます。
>diner.sub01.sub02
>2016_insert_image_000265

>ネームスペースはこのように、.(ドット)区切りで、1つのルートネームスペースと2つまでのサブネームスペースの最大3レベルまで構成することができます。

>ルート名が違えば、サブは誰かのヤツと重複してもＯＫです。

>発行者A氏：diner.sub01.sub02
>発行者B氏：diner.sub01.sub02（←ダメ）、cafe.sub01.sub02（←問題ナシ）
>(引用元)https://www.cryptostream.jp/nem-namespace-mosaic-3551/#namespace

#ネームスペースの作成
Nano Walletを起動します。
ログインして、「サービス」をクリックします。
![スクリーンショット 2018-03-11 0.59.13.png](https://qiita-image-store.s3.amazonaws.com/0/242994/cb43aff8-f9d9-7408-a381-d68b0fb0c84c.png)

「ネームスペースの作成」をクリックします。
![スクリーンショット 2018-03-11 0.59.24.png](https://qiita-image-store.s3.amazonaws.com/0/242994/0434a69a-182d-96fc-817b-cf43bd6d9dca.png)

「ネームスペース」に自分の好きな名前を入力します。ウォレットのパスワードを入力して、「登録」ボタンをクリックします。
![スクリーンショット 2018-03-11 0.59.41.png](https://qiita-image-store.s3.amazonaws.com/0/242994/785a144c-8747-9e1d-fb0d-bc8362559a32.png)

登録が完了すると、ダッシュボードに登録結果が表示されます。
![スクリーンショット 2018-03-11 1.01.23.png](https://qiita-image-store.s3.amazonaws.com/0/242994/5fbe0ac1-4724-34c5-214b-e03848569b8d.png)

#モザイクの作成
ネームスペースと同じく「サービス」を開き、「モザイクの作成」をクリックします。
![スクリーンショット 2018-03-11 1.01.36.png](https://qiita-image-store.s3.amazonaws.com/0/242994/3419b4a8-d0e8-e80c-b732-bc9bad46d0d0.png)

「親ネームスペース（名前空間）」は先ほど作成したネームスペースを選びます。
「モザイク名」に好きなモザイク名を入力し、「説明」にモザイクの説明を入力します。（この説明ってどこに活用されてんの？何の意味あんの？って思っていますがとりあえず入力しました）
「初期供給量」にモザイクの発行枚数を入力し、「可分性（小数点の有無）」に枚数に小数点をいくつまで許可するか設定します。
ウォレットのパスワードを入力し、「送信」ボタンをクリックします。
![スクリーンショット 2018-03-19 0.39.07.png](https://qiita-image-store.s3.amazonaws.com/0/242994/af61cdb7-d5e9-24aa-2ee8-a7afee807c2a.png)

モザイクの作成が完了すると、ダッシュボードに結果が表示されます。
![スクリーンショット 2018-03-11 1.06.46.png](https://qiita-image-store.s3.amazonaws.com/0/242994/c7feb460-25a6-88c5-d332-e95e8e496f86.png)

エクスプローラーに先程作成したモザイクが表示されていればOKです。
![スクリーンショット 2018-03-11 1.07.16.png](https://qiita-image-store.s3.amazonaws.com/0/242994/37414600-6dd5-3314-8644-b563be82554d.png)

#次回
[Python3でNEMのAPIを叩く-007-アカウントが作成したモザイク定義を取得<コーディング編>
](https://qiita.com/oden_umai/items/12949c8b435ce137e44f)
BeautifulSoupでノーベル賞受賞者の国籍を取得する(PJDV 5.7.3章)

# 概要

- [前回](https://qiita.com/int_main_void/items/be86128d7694a13cdde3)の続き
- [O'Reilly Japan - PythonとJavaScriptではじめるデータビジュアライゼーション](https://www.oreilly.co.jp/books/9784873118086/)(PJDV)の勉強用です。
- PJDV 5.7.3章(p131-p132)と同じく、"Nationality"で国籍が取れない場合はあきらめている
    - [Henry Dunante](https://en.wikipedia.org/wiki/Henry_Dunante) : "Nationality"で国籍が取れる。
    - [Marie Curie](https://en.wikipedia.org/wiki/Marie_Curie) : "Nationality"で国籍が取れない。"Citizenship"を使う必要がある
- PJDV 6章(Scrapy)でうまく処理できるようになるので深追いしない。

PJDV 5.8章p133
> 次の章では、高性能なスクレイピングライブラリScrapyを使って本書の可視化に必要なすべてのノーベル章データを取得します。


# サンプルコード

```py:pjdv_s5_7_3.py
# -*- coding: utf-8 -*-
import pjdv_s5_7_s5_7_1 as mylib1
import re

def get_nobel_winner_nationality(nobel_winner):
    """ 受賞者のWikipediaページから国籍を取得する。取得できない場合はNoneを返す """
    BASE = 'https://en.wikipedia.org'

    soup = mylib1.get_soup(mylib1.join_url(BASE, nobel_winner["link"]))
    nationality = None
    for tr in soup.select(".infobox tr"):
        try:
            th_text = tr.select_one("th").text
            if th_text == "Nationality":
                nationality = re.sub(r'\[.+?\]', "", tr.select_one("td").text)
                nationality = re.sub(r'\n', ",", nationality)
                break
        except AttributeError:
            pass
    return nationality

def main():
    nobel_winners = mylib1.get_nobel_laureates()
    num = 20
    print("start get_nobel_winner_nationality ({0} of {1})".format(num, len(nobel_winners)))
    for w in nobel_winners[:num]:
        print(".", end="")
        nationality = get_nobel_winner_nationality(w)
        w["nationality"] = nationality
    print("done")
    dat = [x for x in nobel_winners if w["nationality"]]
    print(dat[0:num])

if __name__ == '__main__':
    main()
```

# tips

- [ipython を起動しながら自作モジュールを修正した場合 - Qiita][autoreload]
- autoreloadを使って自動リロードにしておく

```python
In [2]: %load_ext autoreload

In [3]: %autoreload 2

In [4]: import pjdv_s5_7_s5_7_1 as mylib1

In [5]: import pjdv_s5_7_3 as mylib2
```

[autoreload]:https://qiita.com/Accent/items/f6bb4d4b7adf268662f4
さくらVPSのCentOSがKernel panicで起動しなくなった場合の復旧方法

表題の状況にそもそも陥る人はあまりいないかもしれません。
もしそうなったらCentOSのRescueModeというので復旧できます。

私の場合、さくらVPSのCentOS6(6.7)で無理矢理glibcの2.17動かそうとしたら、sshログインもsftp接続もできなくなり、OSを落としたらKernel panicで起動しなくなりました。
VNCコンソールでこういう画面になるやつです

```
Kernel panic - not syncing : Attempted to kill init!
Pid: 1, comm: init Not tainted 2.6.32-504.3.3.el6.x86_64 #1
Call Trace:
[<ffffffff81529277>] ? panic+0xa7/0x16f
[<ffffffff8107a5f2>] ? do_exit+0x862/0x870
[<ffffffff8107a658>] ? dp_group_exit+0x58/0xd0
[<ffffffff8107a6e7>] ? sys_exit_group+0x17/0x20
[<ffffffff8100b072>] ? system_call_fastpath+0x16/0x1b
```
~~サポートに問い合わせて「root権限渡しているんで」というテンプレ回答だった場合などは~~
下記方法を試して頂けると復旧できるかもしれません。

#レスキューモードで起動
さくらのコントロールパネルにログイン->各種設定->OSインストール->centos6 x86_64->VNCコンソールを起動->Rescue installed system
->choose language "English" ->Keyboard type "jp106" -> Setup networking "NO"
->Continue -> shell Start shell

これで/mnt/sysimage以下にディスクをマウントした状態になりました。
つまり、/root/は今は/mnt/sysimage/rootになっている状態という事です。
そして、viコマンド等、色々なコマンドが使えるようになってます。

#原因箇所を修正
(私の場合はetc/ld.so.confを修正しました
修正上書き

```
$: vi /mnt/sysimage/etc/ld.so.conf
```
キャッシュファイルが残っているのを確認

```
$: ls /mnt/sysimage/etc | grep ld.so.cach
```
キャッシュファイル削除

```
$: rm /mnt/sysimage/etc/ld.so.cache
```

#レスキューモードから抜ける
原因箇所を修正したら、ディスクのマウントを解除して、OS再起動します。

```
$: exit
```
そして
reboot Reboot -> Boot from local driver

これで正常にOSが起動するはずです


#そもそもやろうとした事
https://qiita.com/Wanwannodao/items/42c93686e49498c43529
これのLD_LIBRARY_PATH指定がすごく長くて嫌だったので、http://www.8wave.net/ldconfig.html
このページみたいに/etc/ld.so.confにglibcへのpassを通してldconfig叩いちゃいました。

なので余計なことしないで、pyenv、anaconda環境でこのページ通りにやってみたのですが、下記エラーでtensorflow動きませんでした...

```
relocation error: /tmp/libc6_2.17/lib64/libc.so.6: symbol _dl_starting_up, version GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2 with link time reference
```

どなたかわかる方いらっしゃいましたら教えてくださいmm
基本、CentOS7に上げて使えって話なんですけどね...
Laravel5.1最初の設定、DB設定

###Laravel5.1の設定しました。

##タイムゾーンなどを設定
```config\app.php
    'timezone' => 'Asia/Tokyo',
    'locale' => 'ja',
```

##いじらない
このファイルはそのまま。後述の.envファイルの設定を読み込んでくれるらしくいじらなくてもよいらしい。

```config\database.php
        'mysql' => [
            'driver'    => 'mysql',
            'host'      => env('DB_HOST', 'localhost'),
            'database'  => env('DB_DATABASE', 'forge'),
            'username'  => env('DB_USERNAME', 'forge'),
            'password'  => env('DB_PASSWORD', ''),
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'strict'    => false,
        ],
```

##いじる
```\.env
       DB_CONNECTION=mysql
       DB_HOST=127.0.0.1
       DB_DATABASE=Laravel5.1
       DB_USERNAME=root
       DB_PASSWORD=''
```
xammp環境なのですが、127.0.0.1のpassを設定するとうまくいかず、試しにlocalhostユーザのパスワードを設定したらphpmyadminに入れなくなり、その際、他の設定ファイルをいじる必要があったため今回は、パスワードなしにしました。
必要があれば今後調査したいです。


##ためす
```console
$ php artisan migrate // table作成
$ php artisan tinker // 確認

>>> App\User::all()->toArray();
=> []
>>>
```

おそらく正常。

大変参考になりました。
初めてのLARAVEL 5.1 : (6) データベースの環境設定
https://laravel10.wordpress.com/2015/02/21/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%AE%E7%92%B0%E5%A2%83%E8%A8%AD%E5%AE%9A/#more-269
さくらVPS OS再インストール手順

1.コントロールパネルの各種設定ボタンを押して、OSインストールを選択
2.標準OSを選択
3.インストールするOSを選択
4.管理ユーザのパスワードを設定
5.設定内容を確認ボタンを押す
6.サーバのステータスが稼働中になればOS再インストール完了
H2OをDocker上でNon rootで動かす

H2Oをdocker上で80/443で動作させたい場合、起動後setuidによりh2o.confのuserとして動くため、Dockerfile中ではrootとしてH2Oを起動する

# 背景
http serverはnon rootで動かしたい。
そして複数のIPアドレスを持つ(IPv4 dhcp,autoip,IPv6など)ため、IPアドレスを指定せずに任意のアドレスINADDR_ANY(0.0.0.0)で待ち受けたい。
しかしport:80などの1024未満のポート番号は、CAP_NET_BIND_SERVICE権限を持つプロセスのみがbindできるとなっているため、権限がないとエラー(EACCES)になってしまう。
[マニュアル](https://linuxjm.osdn.jp/html/LDP_man-pages/man7/ip.7.html)


### nginx
nginxはプロセス分離といった対策を取っている。rootで起動、port:80をbind,その後forkし、一般ユーザーで動く

### H2O
H2Oはrootで起動、port:80をbind, その後setuidで一般ユーザーになる

### with docker
しかしdocker上で、wwwといったユーザーを作り、port:80で待ち受けようとすると、H2Oで以下のエラーがでる。

```
$ ./h2o -c /usr/www/conf/h2o.conf
failed to listen to port ANY:80: Permission denie

$ ./h2o -m master -c /usr/www/conf/h2o.conf 
failed to bind to 0.0.0.0:80:Permission denied at /usr/www/share/h2o/start_server line 9
```

###原因
原因はDockerfile内、および、docker run時のオプションでH2Oをwwwユーザーとして起動していたため。
INADDR_ANY(0.0.0.0)かつ1024未満のポート番号であるため、CAP_NET_BIND_SERVICE権限が要求されるが、wwwユーザーにはない。
###対策
対策はrootユーザーで起動する事。もちろんH2O起動後によりsetuidによりNon rootとなるため、rootで動き続ける危険はない。


```h2o.conf
user: www
listen: 80
listen:
  port: 443
  ssl:
    certificate-file: tls/server.crt
    key-file: tls/server.key
hosts:
  "*":
    paths:
      /:
        mruby.handler-file: mruby/header_add.rb
        file.dir: doc_root
        file.dirlisting: ON
    access-log: /dev/stdout

```

```Dockerfile
# buildに必要なtoolchain,h2oのbuildは以下を参照
# https://github.com/kawaway/h2o_docker

RUN	groupadd www && useradd -m -d /usr/www -g www www
USER	www
WORKDIR	/usr/www

RUN	mkdir -p conf && \
	mkdir -p tls && \
	mkdir -p doc_root && \
	mkdir -p share/h2o && \
	mkdir -p mruby && \
	cp -r /usr/local/share/h2o/* share/h2o && \
	cp    /usr/local/share/doc/h2o/examples/h2o/server.key tls && \
	cp    /usr/local/share/doc/h2o/examples/h2o/server.crt tls

# H2O run as root for bind port:80/443(require CAP_NET_BIND_SERVICE, cause EACCES) first. then www by setuid
USER	root
ENV	H2O_ROOT=/usr/www
CMD	["h2o", "-m", "master", "-c", "/usr/www/conf/h2o.conf"]	
```


```docker-compose.yml
version: '3'
services:
   h2o:
      build: .
      ports:
         - "80:80"
         - "443:443"
      volumes:
         - ./doc_root:/usr/www/doc_root
         - ./conf:/usr/www/conf
         - ./mruby:/usr/www/mruby
```

docker-compose buildでbuild
docoker-compose up -dでコンテナ起動

###参考
[明日使えない Linux の capabilities の話](http://nojima.hatenablog.com/entry/2016/12/03/000000)
[[Go] port 80を開いたあとroot権限を捨てるwebサーバの例](https://qiita.com/sfujiwara/items/b312fbdd2660e43b6717)
今更ながら Ruby on Rails Tutorial をやってみた (その6)

## この記事について…

普段はRuby on Railsと無縁なプログラマなんですが、今更ながら**面白そう**という単純な理由から[**Ruby on Rails Tutorial**](https://railstutorial.jp/)をやってみようと思い立ちました。今回は[前回の記事](https://qiita.com/hideki0145/items/ae11503651e5c90b28dd)の続きで第6章をやっていきます。
尚、Rails 5.1に対応した第4版を用いて、かつVagrantを使用した環境で進めていきます。

## 第6章 ユーザーのモデルを作成する

[Windows環境へのRubyセットアップ](https://qiita.com/hideki0145/items/0ba53ef35bcc67bbc8f1)をゆったりやっていたので前回から時間が経ちました。今回から第12章迄、全7章を通してログインと認証の機能を完成させていきます。

まず初めにUserモデルを作成します。ここで気を付けるべきは「コントローラ名には複数形を使い、モデル名には単数形を使う」という慣習です。コントローラは`Users`、モデルは`User`となります。更に、「テーブル名は複数形を使う」という習慣の為、テーブル名は`users`となります。チュートリアル中は問題ないですが、独自に開発する際は以前紹介した`active_support`を活用して複数形・単数形に誤りがないようにしたいですね。

```bash
rails generate model ModelName column1:string column2:string ...
```

上記のようにコマンド実行することで、モデルの雛形を自動生成してくれます。

### モデルのテスト駆動開発で詰まる

指示通りに`test/models/user_test.rb`を編集し、`rails test:models`を実行したところ…

```bash
$ rails test:models
rails aborted!
ActiveRecord::Tasks::DatabaseAlreadyExists: ActiveRecord::Tasks::DatabaseAlreadyExists
/vagrant_data/environment/sample_app/bin/rails:9:in `require'
/vagrant_data/environment/sample_app/bin/rails:9:in `<top (required)>'
/vagrant_data/environment/sample_app/bin/spring:15:in `require'
/vagrant_data/environment/sample_app/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'

Caused by:
Errno::ETXTBSY: Text file busy @ unlink_internal - /vagrant_data/environment/sample_app/db/test.sqlite3
/vagrant_data/environment/sample_app/bin/rails:9:in `require'
/vagrant_data/environment/sample_app/bin/rails:9:in `<top (required)>'
/vagrant_data/environment/sample_app/bin/spring:15:in `require'
/vagrant_data/environment/sample_app/bin/spring:15:in `<top (required)>'
bin/rails:3:in `load'
bin/rails:3:in `<main>'
Tasks: TOP => db:test:load => db:test:purge
(See full trace by running task with --trace)
Migrations are pending. To resolve this issue, run:

        bin/rails db:migrate RAILS_ENV=test
```

何やら怒られてしまいました。「テスト用のデータベースをマイグレーションしなさいよ」ということらしいですね。
そこで、`rails db:migrate`について新たに学んだのがこちら。

```bash:migrateについて
rails db:migrate RAILS_ENV=test # テスト環境のデータベースをマイグレーションする
rails db:migrate # この場合 RAILS_ENV=development をデフォルトとして実行していたのでした
rails db:migrate:status # 現在のマイグレーション適用状況が確認できる
```

今回は`rails db:migrate RAILS_ENV=test`を実行することでエラーを解消することができました。
(関係ないですが、`rails test:models`は`rails t:models`とは省略できないようです。)

### モデルの構造変更

一度作成したモデルの構造を変更する場合は`migration`を使用します。

```bash
rails generate migration migration_file_name
# ファイル名を一定の規則で命名すると、その規則に従って自動的に適切なマイグレーションファイルが生成される
# 例えばファイル名を ..._to_users と命名すると、usersテーブルにカラムを追加するというマイグレーションが自動生成される
```

`migration`によって作成されたファイルに変更内容を記述します。データモデルの変更が必要になったらその都度マイグレーションを行うのがRails流のようです。


その他、この章ではパスワードをセキュアに管理する方法について述べられています。
RubyGemsの`bcrypt`を使用してハッシュ化したパスワードをデータベースに保持する作りとなっており、パスワード検証用メソッドである`authenticate`も提供されています。これにより、驚くほど少ないコーディングでセキュアな認証機構を作る土台が出来上がったことになります。

それでは、次回 第7章から再開したいと思います。
IBM Cloud k8s でダッシュボードにサインインする


ぶっちゃけここに書いてあるけど、jsonpathの書き方がよく分からなかったんでメモ。  https://console.bluemix.net/docs/containers/cs_app.html#cli_dashboard 

---

### トークンをクリップボードにコピー
私の環境の場合、 複数のkubeconfig読み込んでるのでname指定でuserを指定やる.

```
kubectl config view -o jsonpath='{.users[?(@.name == "hoge@anonymous.co.jp")].user.auth-provider.config.id-token}' | pbcopy
```

### ダッシュボードにアクセス

（便宜上バックグラウンドでproxyコマンド実行していますが　、フォアグランドで実行してブラウザにURL入力の方が楽)

```
kubectl proxy &
open http://127.0.0.1:8001/ui 
```

### サインイン

ヘッダー上部のサインインボタンからサインイン画面に遷移、「Authentication method」 で **token** を選択して、クリップボードにコピーしておいた トークンを貼り付けて **Sign in**
中央ぞろえは何度も調節？まだそんなことやっているんですか？　UnityEditor拡張　その１

UnityEditorの拡張を始めました。

しかし、UnityEditor拡張とかを行っていくのに、どうしてもネックになってくるのが、
UIの配置。
このボタンの配置は、真ん中に置きたいのにーーー
真ん中は配置したがいいが、特定の大きさでしか、真ん中の配置にならないよーーー

対象人物像
・エディター拡張に興味がある人
・UIの配置までこだわりたい人



開発環境
Unity2017.1.1f1
VisualStudio2017community


##こんな事ってありませんか？

 - 横並びに配置したい
   
　例えば、UIを横並びに配置したいのに、普通に記述してしまうと縦に並んでしまいます。
　これを防ぐために以下のようなコードを記述します

```sample1.cs
EditorGUILayout.BeginHorizontal();

並べたいUI

EditorGUILayout.EndHorizontal();
```

このEditorGUILayout.BeginHorizontalは、ここから横並びでという意味で、
必ずEditorGUILayout.EndHorizontalでくくらなければいけません。

なので、これらを使う場合は、可読性を上げるために、私の場合は、以下のように{}でくくったりします。

``` sample1arrange.cs
EditorGUILayout.BeginHorizontal();
{
    並べたいUI
}
EditorGUILayout.EndHorizontal();

```



 - 縦並びに配置したい
   
  縦に並ぶのだから、問題ないのでは？と思った人もいるかもしれません。
しかし、横並びの途中で、縦並びの配置を使いたいそんな時ありませんか？
そういった時に、使用したりするものです。

```sample2.cs

EditorGUILayout.BeginVertical();
{
    並べたいUI
}
EditorGUILayout.EndVertical();

```


 - 複雑なUI構成を実現したい。

縦部分で少しお話しましたが、二つを使ったものです。

```sample3.cs

EditorGUILayout.BeginHorizontal();
{
    ボタンのUI
　　
　　EditorGUILayout.BeginVertical();
　　{
　　　　ボタンのUI
　　　　ボタンのUI
　　}
    EditorGUILayout.EndVertical();
}
EditorGUILayout.EndHorizontal();

```

とすると以下のような感じの並びになります。![qitasample.png](https://qiita-image-store.s3.amazonaws.com/0/101366/ff5d70e8-79a3-c8e6-979a-9154e01b8d3d.png)







 - 左寄せ（もしくは、中央寄せ、もしくは右寄せにしたい）

左寄せの場合

```sample4.cs
//以下のくくりは、調整したい方向に対してのくくり
//今回は水平方向での左寄せの場合
 EditorGUILayout.BeginHorizontal();
{
    配置したいUI
    GUILayout.FlexibleSpace();
}
EditorGUILayout.EndHorizontal();
```
中央寄せの場合

```sample5.cs

 EditorGUILayout.BeginHorizontal();
{
     GUILayout.FlexibleSpace();
    配置したいUI
    GUILayout.FlexibleSpace();
}
EditorGUILayout.EndHorizontal();
```


右寄せの場合

```sample6.cs
 EditorGUILayout.BeginHorizontal();
{
    配置したいUI
    GUILayout.FlexibleSpace();
}
EditorGUILayout.EndHorizontal();
```



###注意
基本的には、その前後関係に配置したいUIをおけばいいのですが、
このGUILayout.FlecibleSpace()には、とんでもない悪魔が潜んでいたりします。
内部の動きではどういった関係で、なっているのかわからないのですが
配置したいUIの幅設定をGUILayout.Expand~~(true)に弱い側面を持っています。


例えば
以下のコードを記述した場合

```sample7.cs
EditorGUILayout.BegineHorizontal();
{
テキストフィールドなど、中身がないけど幅が必要なUI
GUILayout.FlexibleSpace();
}
EditorGUILayout.EndHorizontal();
```

と記述した場合で
幅の設定をGUILayout.Expand~~(true）にしてしまう事で
ほとんど入力欄が見えないUIが出来上がってしまいます。

ここからは推測なのですが、（ドキュメントを詳しく読み漁りきってないともいう）
基本的なUIの大きさの設定は、GUILayout.Expand~~(true）の設定で入っていて、
これはあくまでも幅が余っていたら、それに合わせて、UIを大きくする。といったもので
全ての配置が済んだ後にその大きさなどが決まる。
そしてその幅を決める処理も順序が存在しており
GUILayout.Expand~~（true）よりも先に、GUILayout.FixibleSpace()
が適用され、結果的に、後者がほとんどの幅を占有して、前者が、その残りという計算方法の結果になるからではないかと推測しています。(真実は不明）


なので、色々入れ子にした際はその辺を注意した上で、UIを構成してください。
NatureRemoのAPIを活用する準備

#APIが公開されてました
NatureRemoの公式APIが公開されてました！
ってことなんだけどAPIってなんじゃらほい。ってのが始まりでした。
##APIってなんなん
こういうことらしいです（丸投げ
ありがとうございます
[いまさら聞けない！APIとは何か？〜基礎の基礎を学ぼう〜](https://www.sejuku.net/blog/7087)
##個人的解釈
外部から叩けば制御できるコード的ななにか（？
コマンド叩けば制御できる感じかなーっていう

#NatureRemoのデータを取得する
NatureRemoのAPIを叩いて作動させるため、ID等を取得しようと思います。

integromatなんかを使い、NatureRemoを作動させるために使用します。


#PC環境
すいません、ぼくはWindows使いなのです。
LinuxでもUbuntuでもないんです。すみません。
<br><br><br>

#導入するもの
curlコマンド
*Windows 10 1803以降は標準で搭載されたので、別途導入する必要はない

jqコマンド

を導入。

[Windows > curlを使う](https://qiita.com/sugasaki/items/ba9737d13db33d2cd71f)
参考にしました。ありがとうございます。



[jq Download](https://stedolan.github.io/jq/download/)
対応したファイルを落としてください。
jq.exeにリネームしてcurlと同じフォルダにぶち込みました。

<br>
###追記
Chocolatey　というインストールパッケージを導入することでjqをインストールするみたいです。

参考にしました。ありがとうございます
[Windows 7でパッケージ管理システム「Chocolatey」を導入する](http://yuukiar.co/blog/2015/04/04/windows-chocolatey/)


管理者権限でcmd開く

```
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "(iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))) >$null 2>&1" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin
```
<br><br>
再起動後、
jqインストール

```
chocolatey install jq
```

<br><br>
#NatureRemoのアクセストークンを発行する
[https://home.nature.global/](https://home.nature.global/)
Generate Access Tokenでトークンを作成してください。
NatureRemo固有のトークンになりますので他人に知られないように注意。

#NatureRemoのデータを取得する
このコマンドで.jsonファイルが作成されます。

```
curl -X GET "https://api.nature.global/1/appliances" -H "Authorization: Bearer [アクセストークン]" >> data.json
```

そのままでもいいんですがとても見づらいのでjqコマンドを利用します。
<br>
<br>

```
curl -X GET "https://api.nature.global/1/appliances" -H "Authorization: Bearer [アクセストークン]" | jq . >> data.json
```


あとはjsonファイルのまま開くなり
txtファイルに変更するなりして、必要なIDを見つけてくださいー
<br><br>
#実際に取得したデータの一部
```
{
    "id": "[device id]",
    "device": {
      "name": "Remo",
      "id": "[device id]",
      "created_at": "2018-02-20T12:02:31Z",
      "updated_at": "2018-03-18T10:22:27Z",
      "firmware_version": "Remo/1.0.62-gabbf5bd",
      "temperature_offset": 0,
      "humidity_offset": 0
    },
    "model": null,
    "nickname": "light",
    "image": "ico_light",
    "type": "IR",
    "settings": null,
    "aircon": null,
    "signals": [
      {
        "id": "[on/offするためのid]",
        "name": "on/off",
        "image": "ico_off"
      },
      {
        "id": "[常夜灯にするためのid]",
        "name": "small",
        "image": "ico_io"
      },
      {
        "id": "[フル点灯するためのid]",
        "name": "full",
        "image": "ico_on"
      }
    ]
  },
```

見た感じ分かりやすいと思います。
#まとめ
実用するための記事は次回書きます。。。。。。。

#追記
書きました　
[NatureRemoをもう少し便利に作動させる](https://qiita.com/onm/items/0a04ce562e99442c4f1a)
【Ruby】アクセスメソッドの小さなメモ

attr_reader：読み込み
attr_writer：書き込み
attr_accessor：読み込み＆書き込み

アクセスメソッドを定義する

```ruby
class Test
  attr_reader :p1
  attr_writer :p2
  def initialize(p1, p2, p3)
    @p1 = p1
    @p2 = p2
    @p3 = p3
  end

  def get_p3
    return @p3
  end
end

test = Test.new(1,2,3)
p test.get_p3
p test.p1
test.p2 = 4
```