OmniAICreator/Qiita-1.07M huggingface dataset:
デザインを考える上で、参考にしたいおしゃれなサイト

#1.高級ホテル・高級旅館の宿泊予約サイト「 Relux（リラックス）」
##情報過多じゃないイケてる旅行サイト

![高級ホテル・高級旅館の宿泊予約_Relux（リラックス）.png](https://qiita-image-store.s3.amazonaws.com/0/200663/db86b93b-42d9-9992-d47e-6251a19745cc.png)

るるぶトラベルのような旅行サイトにありがちな情報過多なサイトと異なり、情報が整理されていて、とても見やすいデザインです。

機能面で言えば、検索機能もあります。

URLはこちら：https://rlx.jp/

#2.ビジネスSNS「Wantedly」

![はたらくを面白くするビジネスSNS・Wantedly.png](https://qiita-image-store.s3.amazonaws.com/0/200663/b0abbf85-45bd-cf43-fd1f-95e239e1927d.png)

顔をモザイクで隠したら、なんかめちゃくちゃ怪しくなってしまいましたね。

Webサイトの構造がスタンダードなので参考になるかもです。
Relux同様、検索機能とかもありますね。SNSのため、フィードがあるのも特徴の一つです。

URLはこちら：https://www.wantedly.com/

#3.音楽メディア「Spincoaster」
##メディア系のWebサービスを作りたいなら

![Spincoaster__スピンコースター_｜心が震える音楽との出逢いを.png](https://qiita-image-store.s3.amazonaws.com/0/200663/a9d5209f-9600-dfb6-03d9-20ccbb5d549a.png)

WEBサイトはこちら：https://spincoaster.com/

#【おまけ】デザイン性の高いWebサイトを集めたギャラリーサイト

##　① 1guu

![webデザイナーのためのギャラリー・サイトリンク集___1GUU.png](https://qiita-image-store.s3.amazonaws.com/0/200663/11685420-23d4-ead3-b578-7c7ed5f52404.png)

Webサイトはこちら：https://1guu.jp/

##② MUUUUU.org

![縦長のwebデザインギャラリー・サイトリンク集｜MUUUUU_ORG.png](https://qiita-image-store.s3.amazonaws.com/0/200663/64f13376-41c3-8204-075b-827b9f6b8b28.png)

Webサイトはこちら：http://muuuuu.org/
git hub からセキュリティ上の脆弱性を見つけたというわれたとき

全然知らなかったのですが、githubにソースを上げておくと脆弱性があるよと教えてくれるらしいです。
言われたとおりアップデートしました。


We found a potential security vulnerability in a repository for which you have been granted security alert access.

Known moderate severity security vulnerability detected in
rack >= 2.0.4, < 2.0.6

```Gemfile.lock
 rack (2.0.6)
```

```bash
bundle update
```

参考ページ
Bundler, Gemfile, Gemfile.lock について
https://qiita.com/tsubasakat/items/169833d4c8baf79e1b52
Pythonでunittestを行うとき、参照パスがずれる問題

一般的にPythonでプロジェクトを作る場合、以下のようにすることが多いと思います。

* srcフォルダ配下に実際に使うソースコード
* testsフォルダ配下にテストケース

```text
+ プロジェクトルート
| 
+---src
|   +---ここにソースファイル
|   +---ここにソースファイル
|   +---ここにソースファイル
|   +---ここにソースフォルダ
|       \---ここにソースファイル
+---tests
|   +---test_ここにテストケース.py
|   +---test_ここにテストケース.py
|   \---test_ここにテストケース.py
\ (必要に応じて)起動スクリプトなど
```

で、通常はプロジェクトルートフォルダをカレントディレクトリとし、`python .\src\main.py`などとしてプログラムを起動する というのが、Python的に推奨されたプログラムの実行方法 だと思っています。

さて、そのような場合、testsフォルダ配下のテストケースとsrcフォルダ配下の実ファイルにて、参照パスが異なってくるため、srcフォルダ内でフォルダを分けたりすると、参照パスがずれてきてテストケースでModuleNotFoundErrorが頻発します。

そのような場合、とりあえずの対処として、ModuleNotFoundErrorが発生したらテスト環境とみなし、srcフォルダからのフルパスを指定することでなんとか対処していたのですが…

```py:テスト対象のファイル(以前のもの)
import unittest
try:
  import プロジェクト内の別モジュール
except ModuleNotFoundError:
  import src.プロジェクト内の別モジュール

…
```

最近これでもModuleNotFoundErrorがたまに出てくるようになってしまい、どうしたものかと思っていました。

# 解決策

テストケースのファイル先頭で、srcフォルダ配下にも参照パスを追加して、srcフォルダ配下にファイルが置かれているのと同じ状態にしました。

```py:テストケース
import unittest
from pathlib import Path
import sys
sys.path.append(str(Path(__file__).parent.parent))
sys.path.append(str(Path(__file__).parent.parent / "src"))
import src.テスト対象のモジュール

class Test_TEST(unittest.TestCase):
  pass
```

このようにすると、Visual Studio Code上でも、テストケース上でも、もちろん実際に実行するプログラム上でもModuleNotFoundErrorには悩まされなくなります。

また、テスト対象の(src配下の)ファイルでも、ModuleNotFoundErrorをキャッチして処理を分けるなんていう面倒くさいこともしなくて良くなりました。

正直この方法が正しい方法なのかどうかわかりませんが、ひとまず問題はなくなった ということで。

# 参考資料

* [python3 \- python unittestしたときに別モジュールを読み込まない \- スタック・オーバーフロー](https://ja.stackoverflow.com/questions/44740/python-unittest%E3%81%97%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB%E5%88%A5%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BE%E3%81%AA%E3%81%84)
dependencyの追加でエラーがでる

Eclipse利用中、Mavenプロジェクトに<dependency>を追加したら、TOMCATが起動しなかった場合。

```java
Exception in thread "main" java.lang.UnsupportedClassVersionError: org/apache/maven/cli/MavenCli : Unsupported major.minor version 51.0
```
コンソールログに、上記エラー（Javaの実行環境が古くてMavenが動かない）が出ていたら、実行環境をJava 1.8へ変更する。
1. プロジェクト→JREシステム・ライブラリーを右クリック→プロパティ
2. Javaのビルド・パス→ライブラリー→JREシステム・ライブラリーをダブルクリック
3. 実行環境をJavaSE-1.8へ変更


また、「問題」ログに、「invalid ... header」といったエラーが出てる場合は、
・Eclipseを閉じて、「C:¥Users¥{各ユーザー名}¥.m2¥repository」を削除し、再起動
※再コンパイル時にEclipseが全て再構築してくれる


参照：[maven を使用してライブラリを追加してもエラーが解消されなかった話](maven を使用してライブラリを追加してもエラーが解消されなかった話http://hiisori.jugem.jp/?eid=26)
参照：[Java 6 Unsupported major.minor version 51.0](https://stackoverflow.com/questions/31394456/java-6-unsupported-major-minor-version-51-0)
Juliaで学ぶ確率変数(6) - 一様分布（連続型）

[Juliaで学ぶ確率変数(1) - 確率変数の定義 - Qiita](https://qiita.com/sand/items/afb5976ad28120d216c4)
[Juliaで学ぶ確率変数(11) - まとめ - Qiita](https://qiita.com/sand/items/e4b32f7cfd74dea40298)



　確率変数を勉強中ですが、**「確率統計」（森北出版）**は数学的に明確な定義がしっかり書かれているので、これを中心に勉強しています。あわせて**「統計学入門」（東京大学出版会）**と**「確率論入門」（ちくま学芸文庫、赤攝也）**も併読しています。

　本記事は、それらの教科書を読みながら、実際に例題や問題をJuliaで解いていく試みです。Juliaの連続型確率変数のライブラリのドキュメントです。　==>[Distributions/Univariate/ContinuousDistributions](
https://juliastats.github.io/Distributions.jl/latest/univariate.html#Continuous-Distributions-1)


#１．一様分布 U(a,b)


```math
\begin{align}
\\
\\
&a,bをa<bとなる定数とする\\
\\
&X: \Omega \rightarrow 区間 \; [a, b]\\
\\
&確率密度関数f(x)が以下のように書けるとき、Xは一様分布U(a,b)に従うという。\\
\\
&f(x) =
\left\{
\begin{array}{ll}
\frac{1}{b-a} & (a \leqq x \leqq b \;のとき) \\
0 & (x<a\;または\;b<xのとき)
\end{array}
\right.\\
\\
\\
&ここで、以下が成り立つ。\\
&E[X] = \int_{-\infty}^{\infty} xf(x) dx =\frac{a+b}{2}\\
&V[X] = \int_{-\infty}^{\infty} (x - E[X])^2 f(x) dx = \frac{(b-a)^2}{12}\\
\\
&\qquad \qquad  \qquad \qquad  \qquad \qquad  \qquad \qquad \qquad  \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad  \qquad  \\
\end{align}
```


##１－１．Juliaで例題を解いてみる

Juliaで分布を扱うための基礎知識は以下のページを参照してください。
[「Juliaで学ぶ確率変数(1) - 確率変数の定義」の「４．Juliaで確率分布を扱う」](https://qiita.com/sand/items/afb5976ad28120d216c4)



Juliaでは正規分布の確率密度の定義はDistributions.Uniformを使います

サイト[「連続一様分布2 - 統計Web」](https://bellcurve.jp/statistics/course/8015.html)の例題をJuliaで解いてみましょう。

**0以上5以下の範囲で乱数を10,000個作成したとき、その中で1以上2以下の値をとる確率はいくらでしょうか。**

連続型確率変数の、区間[a,b]の確率は分布関数の引き算**cdf(d,b)-cdf(d,a)**で求まります。

```
using Plots
using Distributions
using StatPlots

d=Uniform(0,5)
println( cdf(d,2)-cdf(d,1) )

plot(d,xticks = -1:1:7, xlims = (-1,7), ylims = (0,2/5))
```

cdf(d,2)-cdf(d,1)=0.2が出力されます。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/61915/d86e44a6-b1ae-442a-f789-2c866a65ca52.png)


今回は以上です。
Railsのマイグレーションについて初心者なりに勉強してみた

Railsをたまに触っているのですが、ちゃんと整理したことがなかったので書きました。

### マイグレーションとは

開発状況に応じてデータベース内にテーブルやカラム、インデックスを追加・削除をしたり、既存データに修正を加えるといったことを行う必要がある。これを楽に行えるようにしてくれるのがマイグレーション。

### マイグレーションの手順

基本的には下記のステップで行う

1. DBの構造（これをスキーマという）を変更するコード、それをRubyで記述したマイグレーションファイルを作成する。
2. 作成したマイグレーションファイルを下記のコマンドでデータベースに適用する（migrateする）


```
rails db:migrate
```

### バージョンの上げ下げ

マイグレーションは、1つのマイグレーション（ファイル）が1つのバージョンを表している。
1つのマイグレーションを追加して適用すると、データベースの構造（データベーススキーマ）のバージョンを1つあげることが出来る。
逆に、適用されているマイグレーションを取り消すと1つバージョンを下げることが出来る。

### データベース変更のタイミングはいつなのか？

マイグレーションファイルを作った時点では、データベースは変更されない。マイグレーションを適用した時に初めて、マイグレーションファイルに書かれたコードが実行されて、データベースが変更される。
適用を取り消す際にも同様で、マイグレーションファイルを削除しただけではデータベースの変更は行われない。（この時は、マイグレーションを取り消すコマンドを実行する必要がある）


### マイグレーションはデータベースごとの適用

どうやら、デフォルトでは開発用のデータベースに対してマイグレーションが実行される。
マイグレーションを実行するには

```
bin/rails db:migrate
```

とする。

本番環境にマイグレーションを実行したい場合、つまり本番環境のデータベースを変更したい時には

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

のようにすれば問題なく本番データベースが変更される。

本や記事によっては、bin/rake を使っているものもあるが、Rails5系からbin/railsが推奨されている。

### バージョンの上げ下げのコマンド

上げる場合

```
bin/rails db:migrate
```

下げる場合

```
bin/rails db:rollback
```

いくつかのマイグレーションファイルを変更したい場合（例として3つ分を取り消したい場合）

```
bin/rails db:rollback STEP=3
```

とすると3つ分戻ってくれる。

### マイグレーションの名前の付け方

マイグレーションの名前はアプリケーション内で一意である必要がある。
テーブルのCreateは一度だけ行われることも多いので、あとで別カラムを追加したいと思った時にはAddPurchaseDayToItems（itemsテーブルにpurchase_dayカラムを追加する）のように具体的な名前にすると良い。

Railsは現在のデータベースの構造をdb/schema.rbに自動的に出力する。

```
db:schema:dump
```

で手動で出力することもできる。

schema（スキーマ）情報の例はこんな感じ。

```ruby
ActiveRecord::Schema.define(version: 20080906171750) do
  create_table "authors", force: true do |t|
    t.string   "name"
    t.datetime "created_at"
    t.datetime "updated_at"
  end
 
  create_table "products", force: true do |t|
    t.string   "name"
    t.text     "description"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string.  "part_number"
  end
end
```

### マイグレーションで使いそうなコマンド
```
bin/rails db:migrate
→最新までマイグレーションを適用する。

bin/rails db:rollback
→バージョンを1つ戻す。

bin/rails db:rollback STEP=n
→バージョンをn個分戻す。

bin/rails db:migrate VERSION=20181114051058
→指定のバージョンまでマイグレーションが適用された状態にする。

bin/rails db:migrate RAILS_ENV=test
→特定の環境下でマイグレーションを適用する。
```

今までなんとなくやっていたところがちゃんと理解できてよかったです。
Swift：CFDataGetLengthの値がおかしい話

[こちら](https://qiita.com/lovee/items/74c0310a50d1b752ceb8)を参考にしてCGImageのピクセルデータを抽出して色々しようとしていたところ，`CFDataGetLength`で取得する値が明らかにおかしいことがあることに気づきました．

基本的に画像のピクセルデータは`Red`,`Green`,`Blue`,`Alpha`の４つで，`CFDataGetBytePtr`ではその四つが数珠繋ぎ状に連なったデータが手に入るはずです．
その場合，そのデータ数は`画像の横幅`×`画像の高さ`×`4`となるはずなのですが，`CFDataGetLength`で取得するデータ数はこれよりも大きな値が返ってくることがあります．
写真データではこの問題が発生しないようなのですが，アルバムに保存したイラストなどの画像データだと頻発するようです．

実際にどんな値が入っているのか観察してみました．
![data.png](https://qiita-image-store.s3.amazonaws.com/0/67153/fba794ed-1bb1-62b7-23a5-bfdb8d11e81c.png)

1行の終わりの位置で`Red`,`Green`,`Blue`,`Alpha`の４つ全てが0になっている謎のポイントがあることに気づきました．
これを検出してあげればいいのでしょうか．
NodeJS(JavaScript)でAzure API Management のSASを発行する

#１．背景
Nodeで動くシステムで、AzureのAPI Managementにアクセスする為にSASを発行したかったが、公式にはC#のサンプルしか無かった。
今時Nodeのサンプルが無いとかふざけてるよね？

で、色んな所探したけど、載ってなかったorz

っという訳で3時間ほど試行錯誤してやっとたどり着いた答えを惜しげも無く公開しよう(ﾟ∀ﾟ)ﾊｧﾊｧ

#２．コード
四の五の言わずにコードだけ。

```javascript

    /**
     * APIManagementにアクセスする為のSASを作る
     */
    protected getAPIManagementSAS(){

        // この二つはnpm install 必要っす
        let utf8 = require("utf8")
        let crypto= require("crypto")

        // キーはAzureポータルから取って来てねー(ﾟ∀ﾟ)  
        let identifier = process.env.API_IDENTIFIER;
        let key = process.env.API_KEY;

        var now = new Date;
        // UTCの時間にします
        var utcDate = new Date(now.getUTCFullYear(),now.getUTCMonth(), now.getUTCDate() , now.getUTCHours(), now.getUTCMinutes(), now.getUTCSeconds(), now.getUTCMilliseconds());

        // 有効期限1分でキーを作成。いい感じに時間を足して有効期限作って下さい！
        // フォーマット"yyyy-MM-ddThh:mm:ss.0000000Z"
        let expiry = addMinutes(utcDate,1,"yyyy-MM-ddThh:mm:ss") + '.0000000Z'

        // ごにゃごにゃして、、
        var dataToSign = identifier + "\n" + expiry;
        var signatureUTF8 = utf8.encode(key); 
        var signature = crypto.createHmac('sha512', signatureUTF8).update(dataToSign).digest('base64'); 
        var encodedToken = `SharedAccessSignature uid=${identifier}&ex=${expiry}&sn=${signature}`;   

        // 出来上がり･⌒ ヾ(*´ｰ｀) ﾎﾟｲ 
        return encodedToken

    }
```

#3．注意
キー情報があるんで、JSと言えどもフロントでやったらあきませんよーヽ(・∀・)

まぁ、需要ないだろうなー(ノ▽｀)
2018年11月第2週　今週気になった記事まとめ

# 今週気になった記事まとめ
##■サイバーセキュリティー担当大臣にも関わらず「PCを触らない」「USBが何か知らない」日本の政治家に世界中が騒然
https://gigazine.net/news/20181116-japan-cyber-security-minister-sakurada/
これはあまりにも知らなすぎる例ではあるものの、大臣になるからと言ってその分野にバリバリ精通していることが必要かと言われると難しいのでは…？
細かい話は結局有識者を集めて進めるのだろうし、それをガバナンス取っていく時にIT知識はそうは必要ない気がする。

##■YouTube Premium インプレッション：これ…中毒性たかすぎじゃない…？
https://www.gizmodo.jp/amp/2018/11/youtube-premium.html
魅力的ではあるのだけれど、月額1000円オーバーはなかなかにハードルが高い。
800円、せめて980円とかだと手出せそうなのだが。
YouTubeMusic分も含まれるから多少高いのはしょうがないのだろうか・・・。

##■女子高生AI「りんな」、スマホのカメラで「目」を獲得　ユーザーと同じ世界を見て会話可能に
http://www.itmedia.co.jp/news/articles/1811/05/news126.html
見たものに感情のこもったコメントを生成する、とあるが、どういうレベルのものなのだろうか・・・。
コンセプトイメージだとネクタイのデザインを批評するワンシーンがあるけれど、おそらくは何らかの統計（色彩学とか、良いとされるデザインパターンの蓄積データとか）に基づいて適したメッセージを返す感じかなと。
ただそれだと共感視覚というには少し大げさなような気もする。

##■AIっぽいが実はAIではない「ゾンビAI」とは？
https://gigazine.net/news/20181105-do-not-invest-zombie-ai/
上の記事にも少し絡みますが、結局AIも極端な言い方をすればIf文の集合体みたいなものだと思うので、AIもゾンビAIもつまるところは違いは無いんじゃ・・・。
精度とかパターンのレベルが違うだけってことではないのだろうか。

##■無料送金アプリ「プリン(pring)」が12.8億円の資金調達！メッセージを送る感覚で簡単にお金のやりとりを
https://techable.jp/archives/86757
少し調べた感じだとあまりセキュリティの仕組みに関する言及がないのがちょっと気になる。
そもそもそういう部分をあまり気にしないでいい仕組みってことなのかな。
便利そうなのは確かなのだけれど、この手のアプリで課題になりがちなセキュリティに関してほとんど触れられてないのは不思議。


##■世界最大のソフトウェア開発プラットフォームで最も人気なプログラミング言語は何なのか？
https://gigazine.net/news/20181116-top-programming-languages-2018/
JavaScriptがダントツ1位なのは意外だった。
Java、Python、PHPあたりが上位だろうとは思ってたけどJavaScriptはダントツ人気になるような印象は無かった。
GitHubリポジトリ数っていう指標が影響しているのかも？

##■意味のある「良いアドバイス」をするために必要なこととは？
https://gigazine.net/news/20181116-how-to-better-advice/
相手のことを考えるというのは当たり前のことだけれど、一般的なそれとは少し観点の違う「相手のことを考える」の話だった。
ためになる。
BootStrap4で複数要素の高さの合計を100%にする

下記例は、見出し（h1）の行と、ラベルとテキストエリアの行と、ボタンの行を足して100%の高さになるようにしています。

それらのすぐ親の要素で`d-flex flex-column`を指定ているので、前述の3行は縦に並ぶflex-itemとして扱われます。また、ラベルとテキストエリアの行では`row flex-grow-1`を指定しているので、3行合計が100%の高さになるように、ラベルとテキストエリアの行の高さが広がります。

また、各所に`h-100`を指定してブラウザの高さ全体を使っていますが、`d-flex flex-column`の子要素は自動的に高さが決まるので`h-100`は指定しません。

```html
<!DOCTYPE html>
<html class="h-100">![h-100.png](https://qiita-image-store.s3.amazonaws.com/0/157704/2a7a4fb8-0380-b78f-7a0f-de621d07558f.png)

  <head>
    <meta charset="utf-8" />
    <title>見出しとコンテンツを足して高さ100%</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous"/>
    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous"></script>
    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous"></script>
  </head>
  <body class="h-100">
    <div class="container h-100 d-flex flex-column">
      <h1 class="bg-info">見出し</h1>
      <div class="form-group row flex-grow-1" style="height: 0;">
        <label class="col-3">私はボタンですか？</label>
        <div class="col-9 h-100">
          <textarea class="form-control h-100">いいえ、あなたはラベルです。</textarea>
        </div>
      </div>
      <div class="form-group row">
        <div class="col-9 offset-3">
          <button class="btn btn-primary">私がボタンです。</button>
        </div>
      </div>
    </div>
  </body>
</html>
```

このように表示されます。

![h-100.png](https://qiita-image-store.s3.amazonaws.com/0/157704/5ca94d66-8032-1f75-040e-2d4bb5ae5fd0.png)

なお、`.flex-grow-1`のタグに`style="height: 0;"`を指定しているのは、この指定がないとWebkitでは高さが画面の下端まで届かないためです。FirefoxもEdgeもIEすらも、`style="height: 0;"`の指定がなくても正常に表示されるのに、Chromeだけおかしい……。
[Python]リスト、タプル、辞書、集合の違い

#リスト、タプル、辞書、集合の違い
Pythonでは、データを格納・操作するためのオブジェクトとして、**「リスト[ ]」「タプル( )」「辞書{ }」「集合{ }」**の4種類があります。

**リスト [ ]**はミュータブルで要素の挿入と削除を行うことができ、
インデックス（番号）で要素にアクセスします。

```rpython:list1.py
List = ["A", "B", "C", "D", "E"]
print(List)  
# ⇒ ['A', 'B', 'C', 'D', 'E']
```

```rpython:list2.py
List = ["A", "B", "C", "D", "E"]
print(List[2])  
# ⇒ C
```
```rpython:list3.py
List = ["A", "B", "C", "D", "E"]
List[2]="Y"
List
# ⇒ ['A', 'B', 'Y', 'D', 'E']
```
**タプル ( )**はイミュータブルで要素の書き換えができません。
リストと同様、インデックス（番号）で要素にアクセスします。

```rpython:tuple1.py
Tuple = "A", "B", "C", "D", "E"
print(Tuple) 
# ⇒ ('A', 'B', 'C', 'D', 'E')
```
```rpython:tuple2.py
Tuple = "A", "B", "C", "D", "E"
print(Tuple[2]) 
# ⇒ C
```
```rpython:tuple3.py
Tuple = "A", "B", "C", "D", "E"
Tuple[2]="Y"
Tuple
# ⇒ Error  
#TypeError: 'tuple' object does not support item assignment
```
**辞書 { }**はミュータブルでリストに似ていますが要素へのアクセスは値に一意なキーで行います。

```rpython:dictionary1.py
Dictionary = {"USA":1, "JAPAN":2, "Germany":3}
Dictionary 
# ⇒ {'USA': 1, 'JAPAN': 2, 'Germany': 3}
```
```rpython:dictionary2.py
Dictionary = {"USA":1, "JAPAN":2, "Germany":3}
Dictionary["JAPAN"] 
# ⇒ 2
```
**集合 { }**は辞書と同様、要素へのアクセスは値に一意なキーで行いますが同じ要素を一つしか持てないため辞書のように値はありません。

```rpython:set1.py
SET = set(["USA","JAPAN","Germany","JAPAN"])
SET
# ⇒ {'Germany', 'JAPAN', 'USA'}
```

#リスト [・・・]の作成
要素をカンマで区切って全体を角かっこで囲んで作ります。

```rpython:list.py
Last_name = ['Yamada','Sato','Suzuki']
```

list( )関数を用いれば他のデータ型をリストに変換することもできます。
⑴　文字列を１文字ごとのリストに変換

```rpython:strlist.py
list("Empty")
# ⇒ ['E', 'm', 'p', 't', 'y']
```

⑵タプルからリストへ変換

```rpython:tuplelist.py
tuple = ( "A", "B", "C", "D", "E")
list(tuple)
# ⇒ ['A', 'B', 'C', 'D', 'E']
```
#タプル (・・・)の作成
要素の後ろにカンマをつけて作成します。
（）は必要ないがつけてもエラーにはなりません。

```rpython:tuplel4.py
tuple = "A", "B", "C", "D", "E"
tuple
# ⇒ ('A', 'B', 'C', 'D', 'E')
```
#辞書 {・・・}の作成
辞書を作るにはkey : valuのペアで感まで区切って並べ波括弧({ })で囲みます。

```rpython:dictionary3.py
atomic_weight = { 
             "H":1.008, 
             "C":12.01, 
             "O":16,
             "N":14.01} 
atomic_weight 
# ⇒ {'H': 1.008, 'C': 12.01, 'O': 16, 'N': 14.01}
```
#集合 {・・・}の作成
集合を作るにはset()関数を使うか、１個以上のカンマ区切りの値を波括弧で囲んでだ代入します。

```rpython:set2.py
atomic = {'H','C','O','N'}
atomic
# ⇒ {'C', 'H', 'N', 'O'}
```

```rpython:set3.py
set("philadelphia") 
# ⇒ {'a', 'd', 'e', 'h', 'i', 'l', 'p'}
```
リストから集合を作る

```rpython:set4.py
US_list = ["Philadelphia","New York","LA","Boston","New York"]
set(US_list) 
# ⇒ {'Boston', 'LA', 'New York', 'Philadelphia'}
```
タプルから集合を作る

```rpython:set5.py
US_list2 = ("Philadelphia","New York","LA","Boston","New York")
set(US_list2) 
# ⇒ {'Boston', 'LA', 'New York', 'Philadelphia'}
```
辞書をset()で囲むとキーだけが使われる

```rpython:set6.py
atomic_weight = {'H': 1.008, 'C': 12.01, 'O': 16, 'N': 14.01}
set(atomic_weight) 
# ⇒ {'C', 'H', 'N', 'O'}
```
Railsの動的レスポンスをCloudFrontにキャッシュさせる

# やりたいこと
Railsで以下のような条件のデータをCloudFrontにキャッシュさせる
- レスポンスをはやくしたい
- 更新頻度が低い
- 最新の情報を配信する必要が無い

# デフォルトの動作

Railsのデフォルトのレスポンスには`Cache-Control: max-age=3600, private`というヘッダが付与されているため、CloudFrontのキャッシュ対象(`X-Cache: Miss from cloudfront`)にならない。

```shell-session
$ curl -i https://xxxxx.cloudfront.net/users.json
HTTP/2 200
...
Cache-Control: max-age=3600, private
...
X-Cache: Miss from cloudfront
...
```

# キャッシュ対象にする

controllerでキャッシュのポリシー(`expires_in `)を設定する

```ruby:app/controllers/users_controller.rb
class UsersController < ApplicationController
  def index
    @users = User.all
    # キャッシュの期間と共有を有効化
    expires_in 1.hour, public: true
  end
end
```

# キャッシュが有効化されたことを確認

Railsのレスポンスヘッダに`cache-control: max-age=3600, public`が付与され、CloudFrontのキャッシュ対象(`x-cache: Hit from cloudfront`)になった

```shell-session
curl -i https://xxxxx.cloudfront.net/users.json
HTTP/2 200
...
cache-control: max-age=3600, public
...
x-cache: Hit from cloudfront
...
```

# 参考
Railsのキャッシュについて以下の投稿を参考にさせていただきました。
[Rails でブラウザのキャッシュを利用する \- Qiita](https://qiita.com/7kaji/items/98d5875cf91f0e3f904f)
Goでods(Open Office Spreadsheet)ファイルを読み込む

急にGoがやりたくなったのですが、odsを読めるライブラリに使い方が書いてなくってtestから読み解かなければならなかったので、使い方のメモを残します。

## ライブラリの導入
```bash
go get github.com/knieriem/odf
```

## import
odfでなくて、その中のodsを使う。

```go
import (
	"github.com/knieriem/odf/ods"
)
```

## open&read
```go
f, err := ods.Open("test.ods")
if err != nil {
	panic(err)
}
defer f.Close()

var doc ods.Doc
if err := f.ParseContent(&doc); err != nil {
	panic(err)
}
```

## sheet
Docの[]Tableがsheet。Nameで名前が拾えるので必要なsheetを拾う。
１つしかsheetが無いんだったらdoc.Table[0]でもいい。

```go
for _, sheet := range doc.Table {
	fmt.Print(sheet.Name)
}
```

## データ
Strings()で表全部のデータが[][]stringで取得できる。intのフィールドも全部stringで返ってくるので、strconv.Atoi等で適当に変換する。

```go
cells := sheet.Strings()
```
<%= render @hogehoges %>でなぜ/hogehoges/_hogehoge.html.erbを使ってくれるのか

間違っていたら教えてほしいです。

タイトルの通りRailsは省略記法やら使うファイル名を勝手に気を利かせてくれるところが便利でわかりにくいところだと常々おもっております。今回もその愚痴です。
## <%= render ほげほげ %>
HTMLを描写してくれるERbの書き方で

```
<%= render 'XXX' %>
```
というのがあります。'XXX'の部分に/viewディレクトリにあるパーシャル（テンプレートみたいなもん）を読み込んで描写してくれる、という1文です。

```
<%= render 'dir/sample' %>
```
と書いてあれば、"/app/view/dir/_sample.html.erb"を読み込んで"<%= render"を記載した箇所に描写してくれるということです。

##ここがわからん
で、Ruby on Railsチュートリアルの[「13.3.3 フィードの原型」](https://railstutorial.jp/chapters/user_microposts?version=5.1#sec-a_proto_feed)に下記の記載方法が登場しました。

```/app/views/shared/_feed.html.erb
<% if @feed_items.any? %>
  <ol class="microposts">
    <%= render @feed_items %>
  </ol>
  <%= will_paginate @feed_items %>
<% end %>
```
これです。

```
<%= render @feed_items %>
```
この書き方は何なのだろう、と。チュートリアルの説明文を呼んでみると、
>@feed_itemsの各要素がMicropostクラスを持っていたため、RailsはMicropostのパーシャルを呼び出すことができました。このように、Railsは対応する名前のパーシャルを、渡されたリソースのディレクトリ内から探しにいくことができます。

ちょっと何言っているかわからない。そもそも@feed_itemsはStaticPagesコントローラで下記のように定義されています。

```/app/controllers/static_pages_controller.rb
class StaticPagesController < ApplicationController
  def home
    if logged_in? #Cookieを見てログインしている状態(true)であることを確認。今回ほぼ無関係。
      @micropost  = current_user.microposts.build
      @feed_items = current_user.feed.paginate(page: params[:page])
      #current_userには現在ログイン中のユーザが代入されている（=User.find(params[:id]))
    end
  end
end
```
で、この.feedというメソッドがUserモデルで定義されています。

```/app/models/user.rb
class User < ApplicationRecord
・・・
  def feed
    Micropost.where("user_id=?", id)
  end
・・・
end
```
##勝手にこんなふうに解釈していますよ
つまり、.feedというメソッドを使うとMicropostモデル（Micropostクラス)に所属するオブジェクトを参照することとなるのでモデル名と同じ名称のディレクトリの/app/view/microposts/に入っているパーシャルを自動的に選択してくれる、ということです。
また、.feedで参照した値はMicropostsテーブルのレコードが配列変数の形で代入されたものとなります。
なので、.feedで参照した値を代入した@feed_itemsも同様です。
結果として下記の動作となります。
・Micropostsテーブルの値が代入された配列なので、Railsの仕様で自動的に/app/view/microposts/のパーシャルを使う
・使うパーシャルのファイル名は、Railsの仕様でMicropostsの単数形がつけられたファイル名を使う
・代入されたレコードの数だけ<%= render 'microposts/micropost" %>を繰り返す
よって、

```
<%= render @feed_items %>
```
の1行は下記と同義となります。

```
<%= render 'microposts/micropost' %> #@feed_itemsの1件目
<%= render 'microposts/micropost' %> #@feed_itemsの2件目
<%= render 'microposts/micropost' %> #@feed_itemsの3件目
・
・
・
<%= render 'microposts/micropost' %> #@feed_itemsのn件目
```
Unity　全シーン管理マネージャーの作成

# Unity　全シーン管理マネージャーの作成
　Unityを実行するとき任意のシーンが呼び出され，そのシーンの中にあるマネージャーがただ一つ存在し続けるようにするための方法

Unity 2018.2.12.f.1　使用

参考　[全てのシーンに存在し、かつ、一つしか存在してはいけないマネージャー的存在の実装方法【Unity】 - (:3[kanのメモ帳]](http://kan-kikuchi.hatenablog.com/entry/ManagerSceneAutoLoader)

完成イメージは以下のgifを参照
![nk1w7-wsfm5.gif](https://qiita-image-store.s3.amazonaws.com/0/171702/4dca40e0-e724-c178-722b-5f1f9c15dffc.gif)

## 手順1 呼び出されるだけのシーンを作成する
カメラオブジェクトも削除しておく
![スクリーンショット 2018-11-16 0.03.37.png](https://qiita-image-store.s3.amazonaws.com/0/171702/c20cc98c-ad87-c1ab-9052-9c5cb2f527d8.png)

## 手順2 Sceneを追加する

 ![スクリーンショット 2018-11-16 1.54.36.png](https://qiita-image-store.s3.amazonaws.com/0/171702/8e1f1f02-2a8d-3813-157e-f850edd78c3b.png)


## 手順3 スクリプトを作成する

以下のスクリプトを作成する．それだけでよく何かのオブジェクトにアタッチする必要はない．
RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)でシーンのロード前に呼び出される．

```C#:ManagerSceneAutoLoader.cs

using UnityEngine;
using UnityEngine.SceneManagement;

public class ManagerSceneAutoLoader : MonoBehaviour {

    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
    private static void LoadManagerScene(){
        string managerSceneName = "ManagerScene";

        //ManagerSceneが有効でないときに追加ロード
        if(!SceneManager.GetSceneByName(managerSceneName).IsValid()){

           SceneManager.LoadScene(managerSceneName, LoadSceneMode.Additive);

        }
    }
}

```

## 手順4 全シーンに適応したいマネージャーを用意

今回はスマホゲームによくある時間によって回復する行動ポイントを管理するマネージャを全シーンに配置する．
![image.png](https://qiita-image-store.s3.amazonaws.com/0/171702/0af5fb3e-5101-bb15-03fc-131cf12824cb.png)

## 手順5  全シーン管理マネージャーをシーン遷移しても消えないようにする

DontDestroyOnLoadメソッドを使って消えないようにする．

```C#:DDManager.cs

using UnityEngine;

public class DDManager : MonoBehaviour {

    public GameObject gameObject;

	void Start () {
        DontDestroyOnLoad(gameObject);
	}
	
}
```

![スクリーンショット 2018-11-16 2.09.23.png](https://qiita-image-store.s3.amazonaws.com/0/171702/97a18b1d-7461-7d46-19b3-dab1a840392a.png)

これで実行すれば，実行されたところからManagerSceneが起動し，DDManagerによりActionPointManagerが残り，重複することなく全シーンに配置される．
laravelでpowershellからmigrateしようとしたらcould not find driverが出る

初投稿です。
よくわからないところで詰まってしまったので覚書に
#症状
- xamppからshellを使うと普通にmigrateできた
- powershellで`php artisan migrate`したら次のようなエラーが出た

```
Illuminate\Database\QueryException  : could not find driver (SQL: select * from information_schema.tables where table_schema = laravel and table_name = migrations)
```
#原因
`C:\php`の`php.ini`で`php_pdo_mysql.dll`を読む設定になっていなかった。
そのため、`php.ini`内の`extension=pdo_mysql`のコメントアウトを外した。

`C:\xampp\php`の`php.ini`はデフォルトで読み込むようになっていたので問題なくmigrateできていた。
#結論
環境が汚いのはよくない
Relation or Enumerable?

Railsで引いてきたリレーションには、`Enumerable`として使うこともできます。状況によって、どちらがいいのか考えてみましょう。

## 概論

### リレーションとして使う

`Model.where(条件)`としてもその場でSQLが実行されるわけではなく、必要になるギリギリまで遅延されます。データとして欲しい最終形によって、

* モデルの配列のように使う
* `count`や`sum`でDBレベルの集計をかけて、結果を取る
* `pluck`で必要な列だけ抽出する

のように、多様なアクセスができます。集計はDBレベルで行われますので、SQL文を投げることとなります。

### `Enumerable`として使う

上で「モデルの配列のように使う」とありましたが、`.each`もありますし、`Enumerable`として`.map`などの集計メソッドを使うことも可能です。これはいったんテーブルを引いて、結果を全部展開してから実行します。

## ケーススタディ

### 巨大なデータセットの場合→リレーションとして処理

処理すべきデータが数十万件あるような場合には、`Enumerable`として処理しようとすれば、そのデータを全件転送する必要がありますが、転送だけでも明らかに負担となります。このような場合は、リレーションのまま集計関数をDBに投げて、結果だけ取得したほうが効率的です。

### 件数取得→`size`がよさげ

リレーションの長さを取得するには、`count`、`length`、`size`の3つのメソッドがあります。

* `count`→DBに`COUNT`クエリを投げる
* `length`→（データがなければ全件取得して）数を数える
* `size`→データが取得済みなら`length`、なければ`count`（[ソース](https://github.com/rails/rails/blob/b5302d5a820b078b6488104dd695a679e5a49623/activerecord/lib/active_record/relation.rb#L239)）

ということで、前後でのリレーションの使用状況が不明なら`size`を使うのが無難な気がします。

### リストの`has_many`→Eager Load+`Enumerable`で処理する

リストからさらにリレーションをたどるような場合、N+1クエリが問題となりますが、リレーションのまま`maximum`などを投げると、これもN+1クエリとなります。`includes`などで子リレーションをロードしておいた上で、データアクセスは`Enumerable`としてその集合内に対して行う、というようにすれば、DBアクセスの回数は最小限となります。

### 一部の列のみの取得→Rails 5では`pluck`で問題なし

Rails 4までは、`pluck`は必ずデータベースにアクセスするようになっていましたが、Rails 5では、すでにリレーションを読み込み済みの場合、そちらを参照するようになります。なので、リレーションが読み込み済みかどうかにかかわらず`pluck`を使って問題ありません。
JDKの公式Dockerイメージを使って手っ取り早くjshellを使うメモ

# 公式Java Dockerイメージを活用する
- 特定のバージョンのJVMを使ってテストしたい
- JVMのインストールが面倒

って時はJVMのDockerイメージを活用すると楽ですね。

```shell
$ cat Hoge.java 
public class Moge {
  public static void main(String[] args) {
	System.out.println("hoge");
  }
}

$  docker run --rm -it --volume `pwd`:/tmp adoptopenjdk/openjdk11-openj9 java /tmp/Hoge.java
hoge
```
> javaをコンパイルせずに実行してる？
> -> JEP330
> [Java11：単一ファイルのJavaコードをそのまま実行](https://qiita.com/gayou/items/db8c6c65e78bd80aa67e)
> [Java11ではjavacせずにJavaファイルが実行できるようになる](http://d.hatena.ne.jp/nowokay/20180617)

> 参考
> [Dockerで色んなJDKを試す](https://qiita.com/kikutaro/items/d140f519253f276b94e0)
> AdoptOpenJDK https://adoptopenjdk.net
> 公式Dockerイメージ https://hub.docker.com/u/adoptopenjdk/

#### メモ：繰り返し実行

```shell
$  docker run --rm -it --volume `pwd`:/tmp adoptopenjdk/openjdk11-openj9 /bin/sh -c 'for i in `seq 1 10`; do java -jar /tmp/MDTest.jar |grep -v dig; done' | awk '{sum+=$3} END {print "avg="sum/NR}'
avg=26.1
```

# jshell
- 手っ取り早くJavaで（記述した）処理を実行したい
- クラスやmainなど書きたくない、コンパイル＆実行面倒

って時は [jshell](https://docs.oracle.com/javase/jp/9/jshell/introduction-jshell.htm)が便利ですね。DockerがあればJava9以降を入れてない環境でもサクッと使えますし。

```shell
$  docker run --rm -it adoptopenjdk/openjdk11-openj9 jshell
Nov 16, 2018 12:00:26 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
|  Welcome to JShell -- Version 11.0.1
|  For an introduction type: /help intro

jshell> System.out.println("moge")
moge

jshell> java.time.Instant.ofEpochMilli(1294012469700l);
$1 ==> 2011-01-02T23:54:29.700Z

jshell> 
```

そや、one-linerってどうやって書くんでしょう？
> [JavaのJShellでワンライナーのスクリプトを書く方法(ついでにFizzBuzzのコードゴルフ)]
(http://sucrose.hatenablog.com/entry/2018/05/05/230434)

なるほど！

```shell
$ echo 'println("hello, world!")' | docker run --rm -it adoptopenjdk/openjdk11-openj9 jshell PRINTING -
the input device is not a TTY
```
あれ？ああ。

```shell
$ echo 'println("hello, world!")' | docker run --rm -i adoptopenjdk/openjdk11-openj9 jshell PRINTING -
Nov 16, 2018 3:12:46 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
hello, world!
```

なんでもかんでも -it つけてた。

> 参考
> [JShellで始めるJava - Javaの世界を覗いてみる](https://qiita.com/nowokay/items/e0b9c676567134e4a622)
> [JShellを使ってJava2Dであそぶ](http://d.hatena.ne.jp/nowokay/20180503)
> [[Java9 新機能] jshell入門](https://qiita.com/HomMarkHunt/items/6579cc3587972909d85f)
Go言語を真剣に勉強してみた〜RevelでJSONを扱って見よう〜

#はじめに
こんにちは。某学校でプログラミング等の勉強中のサーバーサイドのプログラマーのワタタクです。:relaxed:
今回はRevelを使っての、JSONについて書いていきます。

Revelを用いるとJSONも簡単に扱うことができるので、早速やっていきましょ。
#RevelでのJSONの扱い

- **1. app/controllers/json.goを作る**

```go:json.go
package controllers

type JsonResponce struct {
	Responce interface{} `json:"responce"`
} 
```
- **2.app/controllers/~~~~_api.goを作る**

```go:~~~~_api.go
package controllers

import (
	"github.com/revel/revel"
)

type Api struct {
	*revel.Controller
}

func (c Api) GetApi() revel.Result {

	//何らかの処理を記述（DB処理など）

	response := JsonResponce{}
	response.Responce = "レスポンス" //ここで返すレスポンスを指定

	return c.RenderJSON(response)
}
```



#TIPS
##JSONで飛んできた値を受け取る

```
 c.Params.Get("キー")
```

以上。短いですがこれでJSONの処理は何とかなります。
あとは煮るなり焼くなりして下さい。
もし何か間違っている等のご指摘があればご連絡ください。
最後まで読んで頂きありがとうございました。
vbsの作法 その3

#概要

vbsの作法、調べてみた。
csvを読んでみた。

#サンプルコード

```
Set db = CreateObject("ADODB.Connection")
db.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=c:\;ReadOnly=1"
Set rs = db.Execute("SELECT * FROM [test.csv]")
Do Until rs.EOF
	msgbox "lat: " & rs(0) & " lon: " & rs(1) & " mise: " & rs(2)
	rs.MoveNext
Loop
rs.close
db.close

```

#test.csv

```
lat, lon, mise
 "37.929687", "140.151111", "オートショップユニット"
 "37.929220", "140.109344", "（株）エイジュウプロ"
 "37.923453", "140.093108", "（株）ホンダウイングロードショウ"
 "37.911333", "140.112004", "（有）カーセンター葵商会"
 "37.907591", "140.108036", "塚本サイクル"
 "37.928429", "140.114247", "サイクルショップ川口"
 "37.916279", "140.099879", "サイクルショップ中村"
 "37.917854", "140.101416", "菅原商会"
 "37.912485", "140.108688", "サイクルセンター卯月"
 "37.912049", "140.105914", "ホンダ野村モータース"
 "37.869915", "140.103534", "モーターハウスＫ"
 "37.918955", "140.109289", "ライダースサロン・ヤマカ"
 "37.915746", "140.108313", "中央ホンダ"
 "37.905011", "140.107225", "香澄ホンダ"
 "37.912663", "140.123328", "佐藤オート商会"
 "37.910789", "140.121636", "香坂輪店"
 "37.958525", "140.125682", "斎藤モータース"
 "37.956678", "140.117820", "ニューホンダ石山"
 "37.903901", "140.131694", "二輪屋たかはし"
 "37.886019", "140.104554", "夢工場"
 "37.874814", "140.103239", "あべ輪店"
 "37.905055", "140.137379", "レッドバロン米沢"

```


以上。
connpassのAPIをPythonから動かす

#はじめに
　connpassは便利。APIは便利。Pythonは便利。全部まとめてconnpassのAPIをPythonから動かす。
#環境
　PC:Raspberry Pi 3 Model B+
　OS:Raspbian GNU/Linux 9.4 (stretch)
　Python3.5.3
　requests:2.12.4
　beautifulsoup4.6.3
#インストール
　ターミナルを開いて、以下のコマンドを入力する。

```console
$ sudo pip3 install requests beautifulsoup4
```
#connpassのAPIについて
　詳しい仕様が[公式サイト](https://connpass.com/about/api/)にあるので、ご覧になることをお勧めする。イベントの概要やID、開催場所の緯度・開度に至るまで取得できる。今回は「ユーザー名を入力するとその人が参加・予約したイベントを表示する」というプログラムを紹介する。
#本題
　全体のプログラムはこんな感じ。

```python3:connpass.py
import requests
import bs4

def main():
	name = None
	while name != "":
		name = input("検索したいユーザー名を入力してください。")
		userSearch(name)
	

def userSearch(nickname):
	url = "https://connpass.com/api/v1/event?nickname=" + nickname
	data = requests.get(url).json()
	events = data["events"]
	print(nickname + "は以下のイベントに参加、もしくは予約しました。\n")
	for event in events:
		for k, v in event.items():
			if k == "owner_nickname":
				print("開催者：")
				print(v)
			if k == "place":
				print("場所：")
				print(v)
			if k == "title":
				print("イベント名：")
				print(v)
		print("\n")
		
main()
```
#仕組み
##import
　まず、必要なモジュールを読み込む。requestsはウェブページのソースコードを取ってくるモジュールで、bs4(beautifulsoup4)は、そこから抜き出しを行うためのモジュール。

```python3
import requests
import bs4
```
##main()
　メイン処理は以下のようになっている。

```python3
def main():
    name = None
    while name != "":
        name = input("検索したいユーザー名を入力してください。")
        userSearch(name)
```
　検索したいユーザー名を入力すると、何かが入力される限りuserSearch()を実行する。
##userSearch()
　取ってくるURLを生成。　

```python3
url = "https://connpass.com/api/v1/event?nickname=" + nickname
```
　ダウンロード。

```python3
data = requests.get(url).json()
```
　参加したイベント一覧を取得。

```python3
events = data["events"]
```
　メッセージ表示して、

```python3
print(nickname + "は以下のイベントに参加、もしくは予約しました。\n")
```
　実行。

```python3
for event in events: #参加したイベントを順番に取得
        for k, v in event.items(): #辞書形式のイベント情報を順番に取得
            if k == "owner_nickname": #開催者名を取得
                print("開催者：")
                print(v)
            if k == "place": #場所を取得
                print("場所：")
                print(v)
            if k == "title": #イベント名を取得
                print("イベント名：")
                print(v)
        print("\n")
```
　最後にまとめて実行。

```python3
main()
```

#終わりに
　紹介した機能は一部でしたが、リファレンスを見れば、開催地の座標から「参加したイベントの会場で一番北だったのはどこか」を調べるというような応用も効きます。是非やってみてください。
Nuxt.jsのsitemapにWordPressの記事一覧を含める方法（非同期と再帰を使ってページIDのリストを取得する方法）

## モチベーション
フロントエンドはNuxt.jsでWordPressの記事を表示するサイトを作っているときにハマりました。

## 結論

```js
  sitemap: {
    async routes () {

      const getPostRoutes = async function(page = 1) {
        const fragment = await getPostRoutesFragment(page);
        if (fragment.nextPage) {
          return fragment.data.concat(await getPostRoutes(fragment.nextPage));
        } else {
          return fragment.data;
        }
      };

      const getPostRoutesFragment = (page) => {
        return axios.get(`https://example.com/wp-json/wp/v2/posts?&page=${page}`)
          .then(res => {
            const data = res.data.map(post =>  '/posts/' + post.id);
            return {
              data,
              nextPage: page < Number(res.headers['x-wp-totalpages']) ? page + 1 : 0,
            }
          });
      };

      return await getPostRoutes();
    }
  },
```

## 参考にしたサイト
Asynchronous with async … の部分
https://blog.scottlogic.com/2017/09/14/asynchronous-recursion.html
JUCEで日本語文字を表示するときのTips

# JUCEって何？

JUCE (Jules' Utility Class Extensions)は、C++言語によるマルチメディア系アプリケーションの開発を支援するフレームワークです。クロスプラットフォーム設計のライブラリと、付属されているプロジェクトジェネレータ『Projucer』から各種IDE(VisualStudio, Xcode, Makefile)向けにプロジェクトファイルを出力することで、ワンソースからWindows, macOS, Linux, iOS, Android で動作するアプリケーションを作成することができます。
[公式サイト](https://juce.com/)


# 日本語の文字表示が豆腐になってしまう

JUCEフレームワークは主に英語圏で開発されている事もあり、英語以外の言語の文字表示があまり意識されていません。
以下の画像は`juce::AudioDeviceSelectorComponent`の表示例ですが、チャンネル名に日本語文字列が含まれている場合、日本語の文字表示が豆腐になってしまいます。

![tofumoji.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/2c5633de-a4ab-6937-036b-9ce7b64968d5.png)



# 簡単な解決方法

JUCEフレームワークでは、アプリケーション中のGUIの表示に関する詳細な実装（ルック・アンド・フィール）が`juce::LookAndFeel`クラスで定義されています。
アプリケーションには必ずデフォルトのLookAndFeelオブジェクトが用意されているので、その設定を変更することでアプリケーション全体で使用するフォントを切り替えることができます。

以下では、OSがWindowsの場合ではWindowsに標準でインストールされていて日本語グリフが含まれている`Meiryo UI`フォントを、macOSの場合では`Arial Unicode MS`フォントを、Linuxの場合では`IPAGothic`フォントを使用するように実装しています。

```
MainComponent::MainComponent()
{
#if JUCE_WINDOWS
  juce::String typeFaceName = "Meiryo UI";
  juce::Desktop::getInstance().getDefaultLookAndFeel().setDefaultSansSerifTypefaceName(typeFaceName);
#elif JUCE_MAC
  juce::String typeFaceName = "Arial Unicode MS";
  juce::Desktop::getInstance().getDefaultLookAndFeel().setDefaultSansSerifTypefaceName(typeFaceName);
#elif JUCE_LINUX
  juce::String typeFaceName = "IPAGothic";
  juce::Desktop::getInstance().getDefaultLookAndFeel().setDefaultSansSerifTypefaceName(typeFaceName);
#endif

     ~~~中略~~~
}
```

# 日本語文字が正しく表示された

![nottofumoji.PNG](https://qiita-image-store.s3.amazonaws.com/0/93566/d73e612d-40a5-3c4a-e504-46f20010e83b.png)

ただし、デフォルトの設定を変更するため、アプリケーション全体に`Meiryo UI`フォントが適用されてしまうという副作用があります。
コンポーネントごとに適用したいフォントを切り替えるには、面倒ですがコンポーネントごとにフォントを切り替えるように実装コードを記述しましょう。


# 参考

https://forum.juce.com/t/embedding-unicode-string-literals-in-your-cpp-files/12600
日能研の問題をGo言語で力づくで解いてみた(2018/11)

[2018年11月の日能研の広告の問題](https://www.nichinoken.co.jp/shikakumaru/201811_sa)を力づくで解くページを見かけた

- [日能研の問題を解く(2018/11) - Qiita](https://qiita.com/sora410/items/bd349c48e7920e7f2573)
- [日能研の問題をCで解いてみた(2018/11) - Qiita](https://qiita.com/98hira/items/7a704fa0d1082c2e1190)

ので，私は [Go 言語]で解いてみる。

```go
package main

import "fmt"

func Permutations(cards []int) <-chan []int {
	ch := make(chan []int)
	go func() {
		defer close(ch)
		perm(ch, make([]int, 0, len(cards)), cards)
	}()
	return ch
}
func dup(list []int) []int {
	l := make([]int, len(list), cap(list))
	copy(l, list)
	return l
}
func perm(ch chan<- []int, list []int, rest []int) {
	if len(rest) == 0 {
		ch <- dup(list)
		return
	}
	for i, v := range rest {
		restx := dup(rest)
		restx = append(restx[:i], restx[i+1:]...)
		listx := append(list, v)
		perm(ch, listx, restx)
	}

}

func list2num(list []int) int {
	v := 0
	for i, t := len(list)-1, 1; i >= 0; i, t = i-1, t*10 {
		v += list[i] * t
	}
	return v
}
func main() {
	for p := range Permutations([]int{1, 2, 3, 4, 5, 6}) {
		res := true
		for i := 2; i <= 6; i++ {
			if list2num(p[:i])%i != 0 {
				res = false
				break
			}
		}
		if res {
			fmt.Println(list2num(p))
		}
	}
}
```

これで[問題なく動作する](https://play.golang.org/p/z0fgDhSWzE4)。

標準ライブラリには順列を生成する関数はないし reduce のような気の利いた高階関数もないので，ひたすら for 文で回します（笑）

特に [Go 言語]っぽいトピックはないけど，強いて挙げるなら「配列は値だけど slice は配列への参照（単なるポインタじゃない）を表す」というところだろうか。なので slice の複製を作るのに `dup()` 関数みたいなのを用意する必要があるわけですね。

あとは順列を生成するのに goroutine でジェネレータ・パターンを構成していることだろうか。

## 参考

- [Go言語で順列組み合わせ(Permutations and Combinations) - Qiita](https://qiita.com/kokardy/items/a18b574d548c212e58e6)
- [gitchander/permutation: Simple permutation package for golang](https://github.com/gitchander/permutation)

[Go 言語]: https://golang.org/ "The Go Programming Language"
bootnode コマンドが入った Docker イメージを作成する

geth の Docker イメージは [ethereum/client-go](https://hub.docker.com/r/ethereum/client-go/) から取得できるんですが geth コマンドしか入ってないので bootnode コマンドは使えません。
bootnode を使いたいときは go-ethereum のソースコードを Github から取得して自分でビルドしましょう。

# Docker イメージのビルド

[ethereum/go-ethereum: Official Go implementation of the Ethereum protocol](https://github.com/ethereum/go-ethereum)

トップレベルディレクトリに Dockerfile が2つと containers/docker にもいくつか入っています。今回はトップレベルディレクトリにある Dockerfile.alltools を使います。

まずは Github から clone して ethereum/client-go-alltools という名称で Docker イメージを作成します。

```shell
$ git clone git@github.com:ethereum/go-ethereum.git
$ cd go-ethereum
$ docker build -f Dockerfile.alltools -t ethereum/client-go-alltools .
```

ビルドが終わったら bootnode を実行してみましょう。

```shell
$ docker run -t ethereum/client-go-alltools bootnode
Fatal: Use -nodekey or -nodekeyhex to specify a private key
```

bootnode コマンド入りのイメージが作成できました。
確率分布備忘録

## この記事について
[統計学入門(東京大学出版会)](https://www.amazon.co.jp/gp/product/4130420658/)

「統計学入門」第6章を読んでいてまとめが欲しくなったので自分で作ることにしました。
間違っている箇所があればコメントをお願いします。
## おもな離散型の確率分布
### 超幾何分布
2種類A,BからなるN個の物があって、それぞれM個、N-M個あるとする。この集団からn個取り出したときに、Aがx個、Bがn-x個であるとすると、確率分布

```math
f(x) = \frac{_MC_x ・ _{N-M}C_{n-x}}{_NC_n}\\
x \in \{Max(0, n-(N-M)), \cdots, Min(n, M)\}
```
を超幾何分布と言う。
その期待値、分散は

```math
E(X) = \frac{nM}{N}\\
V(X) = \frac{nM(N-M)}{N^2} ・ \frac{N-n}{N-1}
```
である。
### 二項分布
2種類の可能な結果A, Bを生じる実験があり、それらの確率をそれぞれp, 1-pとすると、Aがx回、Bがn-x回生じるとすると、確率分布

```math
f(x) = {_nC_x}p^x(1-p)^{n-x} \quad (x \in \mathbb{N})
```
を二項分布といい、Bi(n, p)で表す。
その期待値、分散は

```math
E(X) = np\\
V(X) = np(1-p)
```
である。
### ポアソン分布
二項分布において、nが大かつpが小である場合を考える。
**ポアソンの小数の法則**(**Poisson's law of small numbers**)

```math
np \rightarrow \lambda, n \rightarrow \infty, p \rightarrow 0\\
を満たす極限では\\
\forall x \in \mathbb{N}, {_nC_x}p^x(1-p)^{n-x} \rightarrow \frac{e^{-\lambda}\lambda^x}{x!}\\
```
上の法則をもとにして、

```math
f(x) = \frac{e^{-\lambda}\lambda^x}{x!}\\
(\lambda>0, x \in \mathbb{N})
```
をポアソン分布といい、P0(λ)で表す。
その期待値と分散は

```math
E(X) = \lambda\\
V(X) = \lambda
```
である。
### 幾何分布
二項分布において、最初にAが出現するまでの試行回数をxとすれば、q=1-pとして以下の確率分布が得られる。

```math
f(x) = pq^{x-1}\\
x \in \{1, 2, 3, \cdots \}
```
これを幾何分布という。
その期待値と分散は

```math
E(X) = \frac{1}{p}\\
V(X) = \frac{q}{p^2}
```
である。
### 一様分布
さいころを振ったときに出る目Xの確率分布

```math
f(x) = \frac{1}{N}\\
x \in \{1, 2, \cdots, N\}
```
を1, 2, ..., N上の離散一様分布という。
その期待値と分散は

```math
E(X) = \frac{N+1}{2}\\
V(X) = \frac{N^2-1}{12}
```
である。

## おもな連続型の確率分布
### 正規分布
### 指数分布
### ガンマ分布
### ベータ分布(と一様分布)
### コーシー分布
### 対数正規分布
### パレート分布
### ワイブル分布
Perlハッシュの同列同keyのvalueを合算させる

Javascriptとかだとlodashでいい感じにできるんですけど、Perlでやろうとしたら割と苦戦した。

#やりたい事
lsitの同配列番号の同keyのvalueを合算させたい
dateだけそのまま

```perl

$list = 
  [
    {
      'ringo' => 10,
      'banana' => 20,
      'date' => "2018年10月1日"
     },
     {
      'ringo' => 40,
      'banana' => 50,
      'date' => "2018年10月2日"
     }
  ],
  [
    {
      'ringo' => 100,
      'banana' => 200,
      'date' => "2018年10月1日"
     },
     {
      'ringo' => 400,
      'banana' => 500,
      'date' => "2018年10月2日"
     }
  ];

# 最終的にこうしたい
$result = 
  [
    {
      'ringo' => 110,
      'banana' => 220,
      'date' => "2018年10月1日"
     },
     {
      'ringo' => 440,
      'banana' => 550,
      'date' => "2018年10月2日"
     }
   ];
```

# 解決

### 空のリストを作っておき、ハッシュキーを1個1個指定してループ中で代入する

```perl

my $result = 
  [
    {
      'ringo' => 0,
      'banana' => 0,
      'date' => "2018年10月1日"
     },
     {
      'ringo' => 0,
      'banana' => 0,
      'date' => "2018年10月2日"
     }
   ];

for my $rows ( @$list ) {
  for ( my $i = 0; $i < scalar( @$rows ); $i++ ) {
    $result->[$i]->{ringo}  += $rows->[$i]->{ringo};     
    $result->[$i]->{banana} += $rows->[$i]->{banana};     
  }                                               
}
warn Dumper $result;
```

```perl

# 結果 ($result)
$VAR1 = [
          {
            'ringo' => 110,
            'banana' => 220,
            'date' => "2018年10月1日"
          },
          {
            'ringo' => 440,
            'banana' => 550,
            'date' => "2018年10月2日"
          }
        ];
```

dateまで足してしまうと、 `"2018年10月1日2018年10月1日"` みたいになるので外しました
足したいvalueが文字列になっている場合、文字列結合してringoの例だと、10010みたいになるので気をつけてください
perlは型指定が無いので少し油断しちゃうとすぐ数字が文字列型になって困ります


### キーを一つ一つ指定しなきゃダメなの？
ハッシュを丸ごと代入してみたパターン

```perl


for my $rows ( @$list ) {
  for ( my $i = 0; $i < scalar( @$rows ); $i++ ) {
    $result->[$i] += $rows->[$i];     
  }                                               
}
warn Dumper $result;
```


```perl

# 結果 ($result)
$VAR1 = [
          445320520,
          445134824,
          445244752
          ...
        ];
```

謎の数字で返ってきました
印刷用スタイルシートprint.cssを無理やりいい感じに横幅フィットさせてみた

IEのプリントの挙動が不審者すぎる。。
なので、当てずっぽうですがIEを無理やり解決してみました。
印刷結果が完全にキレイというではないけれど、なんとかデフォルトでお客様に満足いただける挙動まで達成できました。

もっと数字的な根拠を交えた指定方法があるのなら、ぜひ知りたい。。。
でも、自分のリテラシーと工数では現状これが限界だった。。。


## 背景
デフォルトでは大きすぎるコンテンツを縮小して印刷させたいとの要望で始まった、プリント用css対応。激ハマりました。（主にIE対応が）

chromeは、なんとか意図したとおりに動いてくれたのですが、
IEは意図の逆をいく結果で大変、本当にハマりました。(2回目)

-- 背景の続きは後日記載 --

次回のために、これをタレにしようと思い今回も投稿しました。
以下コードです。（案件では、html上にmedia="print"としてprint.cssを読み込みました。）

## 今回使った解決方法

```css:style.css
@media print {
	body {
		zoom: 0.68;
		-webkit-print-color-adjust: exact;
	}
}


/* IE10以上 */
@media print and (-ms-high-contrast: none) {
        /* @pageの指定いらないかも */
	@page {
		size: A4;
		margin: 12.7mm 9.7mm;
	}

	body {
		zoom: 1.8;
		width: 1200px;
		transform: scale(0.5);
		transform-origin: 0 0;
	}
}
```

### 最後に

もしもっと良い解決方法をご存知の方、ぜひ！！ぜひ！！！
コメントくださいませ。
vbsの作法 その２

#概要

vbsの作法、調べてみた。
文字入力、文字出力やってみた。

#写真

![image](https://qiita-image-store.s3.amazonaws.com/0/18104/fd3b5de7-8499-92d1-067a-26a2bcd57ad0.png)


#サンプルコード

```
Title = "検索語" 
strFindText = InputBox("検索する単語を入力して下さい。" & vbCrLf & "(例　山形)" & vbCrLf & "入力が無い場合は、終了します。" , Title, "山形")
If strFindText = "" Then
	WScript.Quit
End If
MsgBox ("検索する単語は、" & vbCrLf &strFindText)


```

以上。
PWA のインストールを LAN 内で完結させたかった

# はじめに
同一 LAN 内の PC に立てた Web サーバーにアクセスして、手元の Android に PWA (Progressive Web Apps) をインストールしたかった。
というのも、

- 社内レギュレーションなどの都合で、Web サーバーをインターネット上に公開したくない
- ソースコードの更新のたびにわざわざデプロイするのが面倒だ

からです。

#### 2019/03/29 追記
Mac/Windows Chrome 73 以降で利用可能な [Desktop PWA](https://developers.google.com/web/progressive-web-apps/desktop) についても検証してみたところ、下記 1〜7 いずれの方法でもインストール不可（8 の方法ではインストール可）でした。

# TL;DR
Android を PC に USB デバッグ接続し、Chrome の Port forwarding 機能で Android から localhost にアクセスすれば十分かも。

# 検証
PWA として認識される（Service worker が動く）条件に、

- HTTPS または localhost であること

があるらしいので、いろいろ試してみます。

ちなみに、Android から同一 LAN 内の PC に立てた Web サーバーに localhost としてアクセスするには、以下２つの方法があるようです。

- Android の Wi-Fi 設定で、手動でプロキシ（`<PC のローカル IP アドレス>:<Web サーバーのポート番号>`）を設定し、`http://localhost` にアクセスする[^5]
- Android を PC に USB デバッグ接続し、Chrome の Port forwarding 機能で `<任意のポート番号>` を `localhost:<Web サーバーのポート番号>` に forward して、`http(s)://localhost:<任意のポート番号>` にアクセスする[^6]

[^5]: [How to serve your local development application on local network using localhost domain to enable Service Worker, Push Notifications, etc.](https://medium.com/@sayhicoelho/how-to-serve-your-local-development-application-on-local-network-using-localhost-domain-to-enable-4f3c48c79137)
[^6]: [Access Local Servers](https://developers.google.com/web/tools/chrome-devtools/remote-debugging/local-server)

## 環境
- Android 8.0.0
- (Android 6.0.1)

## 結果
|#|接続|信頼する証明書|Web サーバーの指定||結果|
|--:|:--|:--|:--|:--|:-:|:-:|
|1|HTTP|--|PC のローカル IP アドレス||×|
|2|HTTPS|なし|PC のローカル IP アドレス||×|
|3|HTTPS|オレオレ証明書|PC のローカル IP アドレス||△|
|4|HTTP|--|localhost (Proxy)||△|
|5|HTTP|--|localhost (Port forwarding)||○|
|6|HTTPS|なし|localhost (Port forwarding)||○|
|7|HTTPS|オレオレ証明書|localhost (Port forwarding)||○|
|||||||
|8|HTTPS|パブリック証明書|ドメイン（インターネット上にデプロイした通常の運用）||◎||

|凡例|ホーム画面に追加時の振る舞い[^1]|実際に追加されるアイコン[^2]|起動するアプリ[^3]|オフライン（Web サーバー停止）時の表示|
|:-:|:--|:--|:--|:--|
|×|ショートカット|ショートカット|Chrome|表示されない|
|△|ショートカット|ショートカット|Chrome|再読み込みするまで表示される|
|○|PWA|ショートカット|PWA[^4]|再読み込みした後も表示される|
|◎|PWA|PWA|PWA|再読み込みした後も表示される|

[^1]: ショートカットだとすぐにアイコンが作成されるが、PWA だとしばらく時間がかかって（キャッシュを保存して？）からアイコンが作成される。
[^2]: ショートカットには、アイコン右下部に Chrome マークが表示される。Android 6.0.1 だとアイコンに違いは見られない。
[^3]: タスク一覧でアプリを確認した際に表示される名前。
[^4]: Android 6.0.1 では Chrome が起動する。

どうやら信頼されていない Web サーバーへの HTTPS 接続ではダメっぽいですね（当たり前といえば当たり前か）。
オレオレ証明書（自己署名証明書）か否かもしっかり判断しているみたい…？？？？

# むすびに
いろいろ検証した結果、（少なくとも自分の実力では）インターネット上にデプロイした PWA と等価なインストールを LAN 内で完結させることができませんでした。
とは言うものの、PWA の特長である“オフラインでも動作する”点を享受するには、上記の「○」、すなわち、

- Android を PC に USB デバッグ接続し、Chrome の Port forwarding 機能で Android から localhost にアクセスする

ので十分かもしれません。

「ここ間違ってるよ」とか「こういう方法もあるよ」という方がいましたら、ぜひコメントにてご指摘ください。
Rでバブルソート

# Rでバブルソート

## 再帰で実装

```r
bubble_sort <- 
  function(x) {
    len_x <- length(x)
    for(i in 1L:(len_x - 1L)){
      if(x[i] > x[i + 1L]) {
        x[i:(i + 1L)] <- c(x[i + 1L], x[i])
        x <- sort_bubble(x)
      }
    }
    x
  }

x <- 100:1
bubble_sort(x)
```

```console
  [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14
 [15]  15  16  17  18  19  20  21  22  23  24  25  26  27  28
 [29]  29  30  31  32  33  34  35  36  37  38  39  40  41  42
 [43]  43  44  45  46  47  48  49  50  51  52  53  54  55  56
 [57]  57  58  59  60  61  62  63  64  65  66  67  68  69  70
 [71]  71  72  73  74  75  76  77  78  79  80  81  82  83  84
 [85]  85  86  87  88  89  90  91  92  93  94  95  96  97  98
 [99]  99 100
```


## 実行時間計測
要素数が多くなるとネストが深くなってエラー．

```console
> bench::system_time(bubble_sort(100:1))
process    real 
 46.8ms  50.2ms 
> bench::system_time(bubble_sort(1000:1))
Error: evaluation nested too deeply: infinite recursion / options(expressions=)?
```

## 再帰なしで実装

```r
bubble_sort2 <- function(x) {
  i <- 1
  while(i < length(x)){
    if(x[i] > x[i + 1]) {
      x[i:(i+1)] <- c(x[i+1], x[i])
      i <- 1
    }else{
      i <- i + 1
    }
  }
  x
}
```

## 実行時間計測2

```console
> bench::system_time(bubble_sort2(10:1))
process    real 
      0  89.2us 
> bench::system_time(bubble_sort2(100:1))
process    real 
 46.8ms  41.7ms 
> bench::system_time(bubble_sort2(1000:1))
process    real 
  30.5s   30.6s
```

## Plot

```r
library(tidyverse)

vector_len <- c(10, 100, 200, 300, 400, 500, 1000)
sec <- 
  map_dbl(vector_len, ~ bench::system_time(bubble_sort2(.x:1)) %>% .[2])

plot(vector_len, sec, type = 'b')
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/64669/5efdb0ee-de16-5058-93f1-c80c8dd1ecac.png)
[Rails] fields_forで引数に@child_modelsを取ると、バリデーションエラー時にfields_for内の値が編集前の値に戻ってしまう

fields_forを使う時、表示順を指定するために、

```ruby:controller
@child_models = @parent_model.child_models.order(created_at: :desc)
```

```haml:view
# view
= f.form_for @parent_model do |f|
  = f.fields_for :model @child_models do |ff|
    〜
```

とすると、バリデーションエラー時にfields_for内の値が編集前の値に戻ってしまう。

なので、以下のように値をコントローラでセットしてからrenderする。

```ruby:controller
def update
    if @parent_model.update(parent_model_params)
      〜
    else
      
      # ここでセットする
      @child_models.each do |c|
        c.attributes = params.permit![:parent_model][:child_model_attributes]
          .to_h
          .select{ |k, v| v[:id] == d.id.to_s }.values[0]
          .slice(
             :セットしたい値1,
             :セットしたい値2,
             ...
          )
      end
      
      render :edit
    end
  end
```