OmniAICreator/Qiita-1.07M huggingface dataset:
bundle exec rake db:createや、rails sでnokogiriエラーの原因は--path vendor/bundleかも


【PC：MacBookPro2012(13-inch, Mid 2012)、MacOS Mojave 10.14.4】
【ruby 2.3.7p456 (2018-03-28 revision 63024) [x86_64-darwin18]】
【Rails 5.2.3】
【mysql Ver 8.0.15 for osx10.14 on x86_64 (Homebrew)】



それは急に訪れました。
いつものようにrailsアプリを作成しようとしたところ・・・

```
$ rails new アプリ名
```
```
$ bundle exec rake db:create
Could not find nokogiri-1.10.4 in any of the sources
Run `bundle install` to install missing gems.
```

え、つい３日前にrails newした時にはエラー出なかったのに・・・
エラー出た・・・
こんな時は余計なことせずにシンプルに試そう。
エラーメッセージを無視して（笑）

```
$ gem update --system
```

もしかしたらこれで・・・

```
$ bundle exec rake db:create
Could not find nokogiri-1.10.4 in any of the sources
Run `bundle install` to install missing gems.
```

あかんのかーい！！
こうなったら素直にエラーメッセージに従おう。

Gemfileに gem 'nokogiri', '~> 1.10.4'　追記。
その後　↓↓↓


```
$ bundle install
```


```
$ bundle exec rake db:create
Created database 'db/development.sqlite3'
Created database 'db/test.sqlite3'
```

できた！
と思ったら・・・
その後すぐに試しでrailsシステムを立ち上げてみると・・・

```
$ rails s
Could not find nokogiri-1.10.4 in any of the sources
Run `bundle install` to install missing gems.
```
また同じエラー！

そこで作成したrailsアプリを確認すると、vendor/bundle/ruby/2.3.0　のディレクトリが・・・
これか、こやつが原因か！
そこで試しに新規railsアプリ作成後にgemにnokogiri追記してから　↓↓↓

```
$ bundle install
```
```
$ rails s
起動
```


なんとかクリア！

ただ、毎回 

```
$ bundle exec rake db:create
Could not find nokogiri-1.10.4 in any of the sources
Run `bundle install` to install missing gems.
```
これが出ちゃうってことは他の原因を解明しないと。
とりあえず今はここまで。
根本治療にはなってないので順次わかり次第追記します。

わかる人いましたらご教授お願いいたします。
情報セキュリティ白書2019を読み解く：DDoS攻撃

引用元：
https://www.ipa.go.jp/security/publications/hakusyo/2019.html

##DDoS攻撃

######DDoS（Distributed Denial of Service）攻撃
Web サーバ等の攻撃対象に対して多数の端末からデータを送信することで、
攻撃対象のリソースに負荷をかけ、サービス運用を妨害する攻撃を指す。


##事例
######（a）オンラインゲームの運営サーバに対するDDoS 攻撃
手口を変えながら断続的に攻撃。（マルチベクトル型攻撃）


######（b）DDoS 攻撃代行サービスサイトの摘発
表向きは登録ユーザの所有、運用するサーバに対して負
荷テストを行うサービスを装っているが、実際には第三
者が運用するサーバへのDDoS 攻撃に用いられている。

2018 年4 月には欧州刑事警察機構（Europol）が
「Operation Power Off」と呼ばれる作戦を展開し、世
界最大規模のDDoS 攻撃サービス「Webstresser」を
摘発し、管理者とされる人物を逮捕した。


##DDoS 攻撃の手口
DDoS 攻撃では、攻撃対象のリソースに負荷をかける
ことができれば、そのサービス運用を妨害できる。
#####（a）ボットネット、IoT ボットを用いる手口
**ボット**・・・脆弱性の悪用やウイルス感染によって、攻撃者に制
御を奪われたインターネット上の端末。

攻撃者がボットへ命令を送るためのC&Cサーバと、複数のボットで
構成される、いわゆる「ボットネット」と呼ばれるネットワーク
がDDoS 攻撃に悪用される。

IoT 機器のボット化（IoT ボット）を狙った攻撃が確認されており
増加傾向となっている。

**Mirai**・・・工場出荷時の初期設定のままのネットワーク機器やIoT 
機器を狙うウイルス


######（b）リフレクター攻撃
送信元IP アドレスを攻撃対象のIP アドレスに偽装したパケットを、
不特定多数の正規のサーバに対して送信することで、それらのサーバ
からの応答パケットが攻撃対象の端末へ送信されることを悪用
した攻撃。

**SYN/ACKリフレクション攻撃**
TCP の80 番ポートを開放していることを悪用した攻撃。
送信元を偽装したSYNパケットをこれらのサーバ群に送信し、応答の
SYN/ACK パケットを攻撃対象の端末に送信させ、処理負荷を生じさせる。
攻撃に悪用されるサーバ群は、正規の目的でTCP の80 番ポート
を開放しているため、アクセス制御やポート閉塞等による対策が困難。
また、送信元を偽装したSYN パケットの送信状況等によっては、攻撃対象
の端末からSYNフラッド攻撃を受けているようにも見える。

**対策：**
ISP 事業者と連携したり、不審なSYN パケットあるいはSYN/ACK パケット
の送信元IP アドレス情報を基に、悪用されているサーバの運営者と攻撃対象
サーバの運営者が連絡を取り合う。

 マルチベクトル型攻撃
　様々な手口を併用して攻撃しつつ、攻撃効果や状況に応じて、
　有効な手口に絞った攻撃に切り替える攻撃方法。


##DDoS 攻撃への対策
######（a）DDoS 攻撃の被害に遭った場合の対策
DDoS 攻撃によって送られてくる通信データを遮断する。
正常なアクセスとDDoS 攻撃によるアクセスを、いかにして切り分けるかが
ポイント。

・アクセスログや通信ログ等を確認し、攻撃が特定の
　IP アドレスから行われていると判断できる場合は、当
　該IP アドレスからのアクセスを遮断する。

・国内からのアクセスを主に想定しているサイトでは、海
　外のIP アドレスからのアクセスを一時的に遮断するこ
　とも検討する。

・攻撃者が攻撃元のIP アドレスや攻撃方法を定期的
　に変更してくる場合があるため、継続して監視を行い、
　攻撃方法に合わせた対策を実施する。

・組織内で対処できない程大規模な攻撃や執拗な攻撃
　を受けている場合は、ISPとの連携や警察等への通
　報を実施する。

・DDoS 対策製品やISP 事業者が提供するDDoS対策サービス
　の利用を検討する。

######（b）攻撃に加担しないための対策
・OS やファームウェアを最新の状態に保ち、脆弱性を
　突いて感染するウイルスを防ぐ。

・パスワードが初期設定のままの機器が存在しないか確
　認し、存在した場合は適切なパスワードを設定する。
　インターネットに直接つながっていない端末においても
　同様の対策が必要。
　→「Mirai」対策

・組織内のDNS、NTP、memcached 等のDDoS 攻撃に
　悪用されることの多いサービスが動作するサーバに関
　して、各サービスが脆弱性を含むバージョンで稼働して
　いないことを確認する。それらのサービスが意図せず
　インターネット上に公開していないことやDDoS 攻撃に
　悪用され得る設定になっていないことを確認する。

・組織内の端末の外向けの通信を監視し、異常な通信
　を確認した場合等は、組織内の端末が攻撃の踏み台
　となっている可能性があると判断し、ウイルス感染等
　が生じていないか調査、対処を行う。
【Rails】business_time gemの祝日の設定方法と営業日計算

# はじめに

Railsで営業日計算をするのに便利なgem [business_time](https://github.com/bokmann/business_time)の祝日の設定方法と営業日計算の紹介です。

# 祝日を設定する

祝日は以下のように`BusinessTime::Config.holidays`にセットしていきます。

```ruby
holiday = Date.parse('2019/9/16') # 敬老の日
BusinessTime::Config.holidays << holiday
holiday = Date.parse('2019/9/23') # 秋分の日
BusinessTime::Config.holidays << holiday
```

注意したいのは`Date`型を入れないと祝日を含めて営業日計算できません。
`ActiveSupport::TimeWithZone`型ではダメです（特にエラーは出ないようなので注意!）。もし、`ActiveSupport::TimeWithZone`型ならば、以下のように`Date`型に変換してあげればOKです。

```ruby
holiday = Time.zone.local(2019, 9, 23) # 秋分の日
BusinessTime::Config.holidays << holiday.to_date
```

# N営業日後を計算する

以下は10営業日後を計算する例です。なお、営業時間は24時間、営業日は月曜から金曜に設定にしています。

```ruby
BusinessTime::Config.beginning_of_workday = "00:00:00"
BusinessTime::Config.end_of_workday       = "23:59:59"
BusinessTime::Config.work_week            = [:mon, :tue, :wed, :thu, :fri]
holiday = Date.parse('2019/9/16') # 敬老の日
BusinessTime::Config.holidays << holiday
holiday = Date.parse('2019/9/23') # 秋分の日
BusinessTime::Config.holidays << holiday

date = Time.zone.local(2019, 9, 7) # 土曜日
10.business_days.after(date)
=> Wed, 25 Sep 2019 09:00:00 JST +09:00
```

土曜日(9/7 Sat.)のように営業時間外を指定すると、翌営業日(9/9 Mon.)を起点に、その次の営業日(9/10 Tue.)を1営業日目として計算します。よって上記の例では、敬老の日と秋分の日が間にあるため、9/25が10営業日目となります。

<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73490/0b1d92fb-4b14-421d-a147-69e903381159.png">
Django 開発にあたり便利なサイト

私は今までpythonを触れてきて次にPythonのフレームワークであるDjangoに触れている初心者です！今回やっていくにつれ便利だなと思ったサイトについて説明していくので、もしこのサイト追加してほしいなどありましたら編集リクエストにてお知らせください。お願いします！！

# 無料PyCharmでの開発環境
https://akiyoko.hatenablog.jp/entry/2018/06/17/182651

## 全体を掴む

https://codor.co.jp/django/
https://djangobrothers.com/
# admin
## モデルのものを管理する
https://www.sejuku.net/blog/27082
## CSSなどでadminをカスタマイズ
https://qiita.com/okoppe8/items/702dab51e4db5d0ed677

##adminでの操作
https://qiita.com/RAGUNA2/items/84fe845d84aa2ae0cbf8

# モデル
## MTVについて
https://www.sejuku.net/blog/27387

## モデル層
https://qiita.com/sandream/items/494887598bacfc2b244c

# Views
## 関数ベースかクラスベースか
https://codeday.me/jp/qa/20181220/89034.html

## クラスベースビューについての説明
https://qiita.com/felyce/items/7d0187485cad4418c073

## getなどのメソッドの違いについて
https://teratail.com/questions/118626

# urls
https://hodalog.com/django-view-and-url/
# settings
https://djangoproject.jp/doc/ja/1.0/topics/settings.html

# その他
決済システムの構築
https://narito.ninja/blog/detail/63/

GoogleMap
https://qiita.com/otsukitak/items/073468efb3e2979e2c9a

プレビュー付き画像
https://narito.ninja/blog/detail/139/

写真の表示
https://hombre-nuevo.com/python/python0065/

他にもありましたらぜひおしらせください！！
PandasのSeriesとDataFrame基礎(随時更新予定)

##はじめに
自分の備忘を兼ねてまとめました。随時更新(予定)

##Pandasをインポートする
```py
import pandas as pd
```

SeriesはDataFrameの1つのカラムを指すデータ構造(一次元のデータ構造)
DataFrame内のデータは多数のSeriesの集まり(二次元のデータ構造)
## Series
###Seriesを定義する
array型とdict型の2種類.

```py
#array型の定義
animals1 = pd.Series([4, 5, 6, 3], index=['cats', 'dogs', 'birds', 'pigs'])
animals1

#dic型の定義
animals2 = pd.Series({'cats': 4, 'dogs': 5, 'birds': 6, 'pigs': 3})
animals2

##結果はどちらも同様で、以下。
cats  4
dogs  5
birds 6
pigs  3
dtype: int64
```


###データを取り出す

こちらもarray型とdict型の２種類。

```py
# array型
animals1[1] #5

# dict型
animals1['dogs'] #5

#=> 60
```

##DataFrame
###DataFrameを定義する
array型とdict型の2種類(Series同様).

```py
#array型
df1 = pd.DataFrame([animals1, animals2], index=['Yuka', 'Mika'])
df1
#outputs
      cats   dogs   birds  pigs
Yuka   4      5      6      3
Mika   4      5      6      3


#dict型
df2 = pd.DataFrame({'Yuka': animals1, 'Mika': animals2})
df2
#outputs2
      Yuka Mika
cats   4    4
dogs   5    5
birds  6    6
pigs   3    3
```


## DataFrameから値を取り出す
```py


animals1.loc['Mika', :]
#outputs
cats   4    
dogs   5    
birds  6    
pigs   3    
Name: Mika, dtype: int64

animals1.loc[:, 'cats']
animals1.cats #上記と同様
#outputs
Yuka  4
Mika  4
Name: cats, dtype: int64
```

##情報を取得する
###pandas.DataFrame
df.info() #行数・列数などを表示

len(df) #行数を取得
len(df.columns) #列数を取得

df.shape #行数・列数を取得 
df.shape[0] #0番目の列に属する行数を取得

df.size #全要素数（サイズ）を取得

###pandas.Series
len(s) #全要素数（サイズ）を取得
s.size #同上

##参考
https://qiita.com/HiromuMasuda0228/items/a7a861796dfeac604f47
https://qiita.com/tonluqclml/items/33b541801dbd12d1bb09
https://note.nkmk.me/python-pandas-len-shape-size/
【メモ】HTMLタグの整理

#【メモ】HTMLタグの整理

###頻出度：★★★★★

`<!DOCTYPE>`
ドキュメントタイプの宣言

`<html>`
HTML文書の開始を宣言してドキュメントルートを定義する

`<head>`
ドキュメントのヘッダーを定義する

`<title>`
ウェブページのタイトルを指定する

`<body>`
ページ本体の表示領域

###頻出度：★★★★

`<h1> 〜 <h6>`
見出しを指定する

`<p>`
段落を指定する

`<div>`
ブロックレベル要素としての範囲を指定

`<span>`
インライン要素としての範囲を指定する

`<a>`
リンクを指定する

`<img>`
画像を表示する


###頻出度：★★(HTML5のみ)

`<article>`
自己完結した記事であることを示す

`<aside>`
本筋から分離しても問題のない余談や補足を表す

`<canvas>`
スクリプトで定義したグラフィックスを描画するための領域を配置する

`<footer>`
セクションのフッターを表す

`<header>`
セクションの先頭となるグループを表す

`<nav>`
ページ上の主要なナビゲーションであることを表す

`<section>`
ウェブページ内の文章構造におけるセクションを定義する

`<video>`
ページ内に動画コンテンツを表示する
[EC2]本番環境でDBの中身を削除する

#はじめに
EC2サーバーにて`rake db:seed RAILS_ENV=production`をしても前回seedさせたデータがテーブル内に残ってる為上手く反映されないのでテーブルの中身を削除する事にしました。

#本番環境のDBの操作
まずEC2サーバーにてmysqlサーバーを立ち上げる。

```ruby:EC2サーバー
mysql -u root -p
```
DBの確認

```
mysql> show databases;
  Database                          
+-----------------------------------+
| Database                          |
+-----------------------------------+
| information_schema                |
| freemarket_sample_production      |
| mysql                             |
| performance_schema                |
+-----------------------------------+    
```

使用するDBの選択

```
mysql> use freemarket_sample_production;
```

テーブルの確認

```
mysql> show tables;
+---------------------------------------------+
| Tables_in_freemarket_sample_production      |  
+---------------------------------------------+
| ar_internal_metadata                        |
| brands                                      |
| categories                                  |
| credits                                     |
| items                                       |
| schema_migrations                           |
| sessions                                    |
| users                                       |
+---------------------------------------------+
```

 テーブルの中身確認、今回はcategoriesテーブルの中身を削除します。

```
mysql> select * from categories;
+----+-----------------+---------------------+---------------------+----------+
| id | name            | created_at          | updated_at          | ancestry |
+----+-----------------+---------------------+---------------------+----------+
|  1 | レディース         | 2019-07-15 00:00:00 | 2019-07-15 00:00:00 | NULL     |
|  2 | メンズ            | 2019-07-15 00:00:00 | 2019-07-15 00:00:00 | NULL     |
|  3 | 本・CD            | 2019-07-15 00:00:00 | 2019-07-15 00:00:00 | NULL     |
+----+-----------------+---------------------+---------------------+----------+

```

後ほどseedコマンドでDBに追加をするので、テーブルの中身全てを削除。

```
mysql> delete from categories;
```

#まとめ
本番環境もローカルの時と同じ手順で操作出来ました。違うところといえばseedファイルを読み込むところぐらいでしょうか。これで無事本番環境でもseedファイルのデータを反映される事が出来たのでよかったです。
ですがいちいち操作をするのも手間になるかもしれませんので、seedファイルの修正などが終わってからseedコマンドをうつよう心掛けたいと思います。
【Vue初心者向け】並び替え（sort）のサンプルコード

Vue.jsで作ったシンプルなサンプルコードです。

対象者は、Vue.jsを始めたところで、色々サンプルコードをいじってみたい人です。

並び替えたい項目のボタンをクリックすると順番に並び替えます。

実際に動作はこちらで確認できます。
[並び替え（sort）のサンプルコード](https://code.ameneko.com/sort)

```
<template>
    <div class="sort_component">
        <p>並び替え</p>
        <ul>
            <li><button @click="sort(0)">id順</button></li>
            <li><button @click="sort(1)">名前順</button></li>
            <li><button @click="sort(2)">年齢順</button></li>
        </ul>
        <div v-for="item in sortItems" :key="item.id">
            id:{{item.id}} 名前:{{item.name}} 年齢:{{item.age}}
        </div>
    </div>
</template>

<script>
export default {
    data(){
        return{
            sortItems:[
                {id:1, name:"taro", age:10},
                {id:2, name:"akane", age:20},
                {id:3, name:"yuki", age:12},
                {id:4, name:"hanako", age:9},
                {id:5, name:"takasi", age:27},
                {id:6, name:"kaori", age:32}
            ]
        }
    },
    methods:{
        sort(index){
            switch(index) {
            case 0:
                this.sortItems.sort(function(a,b){
                    if(a.id < b.id) return -1;
                    if(a.id > b.id) return 1;
                    return 0;
                });
                break;
            case 1:
                this.sortItems.sort(function(a,b){
                    if(a.name < b.name) return -1;
                    if(a.name > b.name) return 1;
                    return 0;
                });
                break;
            case 2:
                this.sortItems.sort(function(a,b){
                    if(a.age < b.age) return -1;
                    if(a.age > b.age) return 1;
                    return 0;
                });
                break;
            default:
            }
        }
    }
}
</script>

<style scoped>

</style>
```
ポイントは、各ボタンにindexとして数字を振っておいて、switchで分けている所です。並び替えの方法は色々ありますが、今回はシンプルに順番を比較して並び替えてます。
ボタンをクリックしたら並べ替えるのでmethodsでやってますがデータを取得した瞬間に並べ替えたいならwatchとかで使えば入れ替えできます。

宣伝：ブログやっています→ [ブログ](https://www.katonobo.com/)
macOS+Vagrant(CentOS)でpysparkを動かす

#はじめに
macOSにVirturalBoxインストールしてCentOSを動かし、Apache sparkをダウンロードしてpysparkの実行環境を作る


#Vagrantのダウンロード
https://www.vagrantup.com/downloads.html

バージョン確認

```
$ vagrant --version
Vagrant 2.2.5
```

#VirtualBoxのダウンロード
![VirturalBox](https://www.virtualbox.org/graphics/vbox_logo2_gradient.png)
https://www.virtualbox.org/wiki/Downloads


#Boxの追加
CentOS 7.2 x64 を使用します。

```
$ vagrant box add centos72 https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box
```

#Boxの確認
```
$ vagrant box list
centos72 (virtualbox, 0)
```

#VMの作成＆起動
```
$ mkdir -p ~/Vagrant/CentOS72
$ cd ~/Vagrant/CentOS72
$ vagrant init centos72
```

#Vagrantfileの編集
~/Vagrant/CentOS72の中に、Vagrantfileというファイルが作成されているので、
下の3つの部分の#を外し、数値を設定する

```Vagrantfile
config.vm.network "forwarded_port", guest: 8888, host: 8888

config.vm.network "private_network", ip: "192.168.33.10"

config.vm.provider "virtualbox" do |vb|
  vb.memory = "4096"
end
```

#Vagrantの起動とSSH接続
※ログインパスワードは「vagrant」です

```
$ vagrant up
$ ssh vagrant@192.168.33.10
```

#必要コンポーネントのインストール

```
$ sudo yum install -y git git-core java-1.8.0-openjdk epel-release python-pip gcc python-devel libevent-devel
```

#Sparkのインストール
※2019/9/1時点の最新版のインストール

```
$ sudo su -
# wget https://www-eu.apache.org/dist/spark/spark-2.4.4/spark-2.4.4-bin-hadoop2.7.tgz 
```

#ファイルの解凍とシンボリックリンクの作成
```
# tar xvzf spark-2.4.4-bin-hadoop2.7.tgz
# mv spark-2.4.4-bin-hadoop2.7 /usr/local
# ln -s /usr/local/spark-2.4.4-bin-hadoop2.7/ /usr/local/spark
```

#環境変数の設定
※vagrantユーザの.bashrcにも記載してください

```
# export SPARK_HOME=/usr/local/spark
# export PATH=${SPARK_HOME}/bin:${PATH}
# export PYTHONPATH=${SPARK_HOME}/python/:${SPARK_HOME}/python/lib/py4j-0.10.4-src.zip:${PYTHONPATH}
# source ~/.bashrc
```

#Pythonのインタラクティブシェルで起動する

```
$ pyspark
```
shellについて

こんにちはまちゃです!
今回はshellについてまとめようと思います!

#shellとは
shellさんはめっちゃかんたんに言うと、ユーザーとOSを繋いでるもので、Linux上で使用できるコマンドをまとめて記述して実行できるもの。
は?ってなる人もいると思うので詳しく書いていきます!
PCを動かすのに必要なものの一つのOS(窓とかりんごが作ってるやつとか)、そのLinux版(Linuxシステム)はカーネルを核としたプログラムの集合体です。で、そのカーネルをいじいじするのをユーザーがコマンドを打って実行してくれるのがshellです。
shellさんにも色々種類があってLinuxに標準的に入ってるのはbashとなっていてtcshやzshなどあります。今回は説明しません!

#カーネルとは
前の話で出てきたカーネルについてです!
カーネルさんはハードウェアとソフトウェアの間にいるとてもおえらいさんのこと!
PCによってついてるものはそれぞれ違います。でもその違いを認識してどのPCでも同じような動作をしてくれるものがカーネルさんです。とてもえらいので崇めておきましょう(|||ﾉ｀□´)ﾉｵｵｵｫｫｫｰ!!
認識的にはOSの一部で大丈夫です。

#ユーザーランドとは
カーネルさんがOSの一部ならあとは何なの?って思った方、朗報です、カーネル以外はユーザーランドです!
LinuxOSはカーネルとユーザーランドの２つで構成されています。shellはユーザーランドに含まれます。

今回はかんたんなことしか触れませんがshellの書き方やshellの使い方なども書いているので良かったら見てみてください!(下記途中なのはごめんなさい!)
[シェルスクリプトについて](https://qiita.com/maachan_9692/items/ed4a99e0a1fb04c47c19)
【JavaScript】HTML文字列から特定のタグ内のテキストを取得する

#背景
某CMS対応案件にて、HTML生成後、見た目を変更する必要が有った。
CMSが密接に絡んでいる箇所において、変数に格納されたHTML文字列を書き換える必要が有った。正規表現でHTML文字列内のタグテキストを取得し編集する必要が有り対応した。その際の知見を活かして、「HTML文字列から特定のタグ内のテキストを取得する」関数を作成した。

#正規表現メモ

## 正規表現パターン
- 静的、又は動的に定義できます。

### 静的

- 静的な文字列で正規表現パターンを定義します。

```javascript
var str = "<span><b>こんにちは、「Bタグ文字列1」です。</b><b>ここは、「Bタグ文字列2」です。</b><strong>こちらは、「strongタグ文字列」です。</strong></span>";
var pattern = /<("[^"]*"|'[^']*'|[^'">])*>/g
var result = str.match(/<b(?: .+?)?>.*?<\/b>/g);
console.log(result);

```
出力結果：

```
["<b>こんにちは、「Bタグ文字列1」です。</b>", "<b>ここは、「Bタグ文字列2」です。</b>"]
```

### 動的 

- RegExpコンストラクタにて、動的に正規表現パターンを生成できます。

```javascript
var str = "<span><b>こんにちは、「Bタグ文字列1」です。</b><b>ここは、「Bタグ文字列2」です。</b><strong>こちらは、「strongタグ文字列」です。</strong></span>";
var tag_val="b";

//動的に正規表現パターンを生成するには「RegExp」を使用します。
var pattern1 = new RegExp("<"+tag_val+"(?: .+?)?>.*?<\/"+tag_val+">", "g"); 
var result = str.match(pattern1);
console.log(result);

```

出力結果：

```
["<b>こんにちは、「Bタグ文字列1」です。</b>", "<b>ここは、「Bタグ文字列2」です。</b>"]
```

## 主な正規表現

|正規表現|説明|
|:-----------------|:------------------|
|^|入力の先頭にマッチします。|
|$|入力の末尾にマッチします。|
|.|任意の1文字にマッチします。（改行コードと\u2028、\u2029を除く）|
|*|指定した文字の0回以上繰り返しパターンにマッチします。「x*」の場合、xの0回以上繰り返しパターンを指します。|
|?|指定した文字の0回か1回の繰り返しパターンにマッチします。「x*」の場合、xの0回以上繰り返しパターンを指します。|


# サンプル関数

- 説明用に読みやすくする為、冗長な書き方をしております。

```javascript

// HTMLタグのテキスト取得関数
// 引数：
// 　target_val：HTML文字列
// 　tag_val：タグ文字(例：bタグのテキストを取得したい場合は、"b"を指定する。)
// 戻り値：
// 　引数「tag_val」に囲まれたテキスト(例：HTML文字列が「<b>あいうえお</b>」で、タグ文字が「b」の場合、「あいうえお」が戻り値となる)
function extractTagText(target_val,tag_val){

    // 戻り値配列　※指定タグで複数一致した場合の考慮
    var retArry = [];
    
	// 引数で指定されたタブをHTML文字列から、正規表現で検索する
	var pattern1 = new RegExp("<"+tag_val+"(?: .+?)?>.*?<\/"+tag_val+">", "g"); 
	var result = target_val.match(pattern1);

    // HTMLタグのみを除去する正規表現のパターン
	var pattern2 = new RegExp("<(\"[^\"]*\"|'[^']*'|[^'\">])*>", "g"); 

    result.forEach(function( value ) {
        // HTMLタグのみを削除して戻り値配列に格納
    	retArry.push(value.replace(pattern2, ""));

    });

    // 戻り値を返す
    return retArry;
}

var htmlText = "<span><b>こんにちは、「Bタグ文字列1」です。</b><b>ここは、「Bタグ文字列2」です。</b><strong>こちらは、「strongタグ文字列」です。</strong></span>";
var ret = extractTagText(htmlText, "b");
console.log(ret);

ret = extractTagText(htmlText, "strong");
console.log(ret);
```

出力結果：

```
[ 'こんにちは、「Bタグ文字列1」です。', 'ここは、「Bタグ文字列2」です。' ]
[ 'こちらは、「strongタグ文字列」です。' ]
```
C#でWebHookを送信するプログラムを作ってみる

DiscordでWebHookを使いたいから作りました。
取り敢えずプロジェクト作成してフォームとか全体図とか決めてみた
![2019-09-03 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491887/0b6bb8cd-7b20-c551-ffe3-1fbd3ea1c4d7.png)
ダサいけどしょうがないね
label1 => コンテンツ
label2 => WebHookの名前
label3 => WebHookのアイコン
TextBoxは上から同じ感じにする（適当）

そんでusing ディレクティブを3個追加

```cs:MainForm.cs
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Runtime.CompilerServices;
```

次にDiscordでWebHookを作成
![bandicam 2019-09-03 20-21-34-725.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491887/80ac6eac-6cdf-fef8-84cf-45159c0ff0ef.jpeg)
作ったらURLコピーしてWebHookのURLのとこにペースト

```cs:MainForm.cs
public static string WebHookUrl = "WebHookのURL";

private void WebHookBtn_Click(object sender, EventArgs e)
{
    HttpClient httpClient = new HttpClient();
    Dictionary<string, string> strs = new Dictionary<string, string>()
        {
            { "content", textBox1.Text },
            { "username", textBox2.Text },
            { "avatar_url", textBox3.Text }
        };
    TaskAwaiter<HttpResponseMessage> awaiter = httpClient.PostAsync(WebHookUrl, new 
    FormUrlEncodedContent(strs)).GetAwaiter();
    awaiter.GetResult();
}
```

こんな感じで完成
あとは個人で使えるかテストしてください
PowerShell: function の返り値に配列を使う際の TIPS

# function の返り値に配列を指定しても、思い通りにならない事例


## 返り値は空配列・その1         
     function func1
     {
         $Response = @()
         $Response
     }

     $r = func1
     write-host $r.GetType()
     write-host $r.Length

<font color="Red">
null 値の式ではメソッドを呼び出せません。
発生場所 行:32 文字:1
+ write-host $r.GetType()
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) []、RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
</font>
0


## 返り値は空配列・その2
     function func2
     {
         $Response = @()
         ,$Response
     }

     $r = func2
     write-host $r.GetType()
     write-host $r.Length

System.Object[]
0

## 返り値は配列で、要素は 1 つだけ・その1
     function func3
     {
         $Response = @("abc")
         $Response
     }

     $r = func3
     write-host $r.GetType()
     write-host $r.Length

System.String
3


## 返り値は配列で、要素は 1 つだけ・その2
     function func4
     {
         $Response = @("abc")
         ,$Response
     }

     $r = func4
     write-host $r.GetType()
     write-host $r.Length

System.Object[]
1

## まとめると
### function を呼びだした側が受け取ったものは…
|  | 返り値の記述 | コンマ無し | コンマ有 |
|:-:|:-:|:-:|:-:|
| function 内での配列長  |   |   |  |
| 0  |   | $null  | @()   |
| 1  |   | "abc"  | @("abc")  |
Latex(documentstyle)

# Latexのdocumentstyleでハマったところ

## documentstyleとdocumentclass
まず，Latexには大きく分けてdocumentstyleとdocumentclassの２つがある．簡単に違いは

- sytle: LaTeX2.09（古い）
- class: LaTex 2e（新しい）

新しいか，古いか，それだけ．．．ではなかった．
## もうちょっと詳しく違いを
styleとclassでは新旧以外にも"お作法"に違いがある．
例えば，classでは画像を挿入したいときには一般的に`\usepackage[dvips]{graphicx}`というおまじないを書けば，`includegraphics`できる．でも，styleは`usepackage`できない．`usepackage`を使おうとすると「は？ナニソレ，意味不なの使わないで」と怒られてしまう．
じゃあ，どうするの？？
styleでは`documentstyle[ココ]`の`ココ`に`graphicx`を書けばいいらしい！！つまり，こういうこと
`documentstyle[graphicx]`
これで`includegraphics`できる！その他のusepacageで使いたいものは**ココ**の部分に`,`を挟んで書き足していけばよいらしい．

```
\documentstyle[graphicx, hoge, hogehoge]{jarticle}
```
みたいな感じになる．（hoge, hogehogeは適当）
TypeORMでSTIするときに分岐するcolumnをクエリ結果に含める

# 問題

TypeORMはSTIをサポートしている。

>typeorm/entity-inheritance.md at master · typeorm/typeorm
https://github.com/typeorm/typeorm/blob/master/docs/entity-inheritance.md

上記に記載のとおり、以下のように書ける。

```typescript
@Entity()
@TableInheritance({ column: { type: "varchar", name: "type" } })
export class Content {
    
    @PrimaryGeneratedColumn()
    id: number;
 
    @Column()
    title: string;
    
    @Column()
    description: string;
    
}

@ChildEntity()
export class Photo extends Content {
    
    @Column()
    size: string;
    
}

@ChildEntity()
export class Question extends Content {
    
    @Column()
    answersCount: number;
    
}
```

ただ、ここでいうContent型でクエリしたときに"type" columnが返ってこない。

# 解決

いまいちどこにも記載がないのだけど、以下のようにすると解決した。

```typescript
@Entity()
@TableInheritance({ column: { name: "type" } })
export class Content {
    
    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    type: string
 
    @Column()
    title: string;
    
    @Column()
    description: string;
    
}
```
[PHP] (1次元の)配列から連想配列を作る一番簡単な方法

少し感動したのでその勢いのまま記事にします。

## TL;DR

[array_fill_keys](https://www.php.net/manual/ja/function.array-fill-keys.php)関数を使う。ただし注意点あり。

## 問題

こんな配列があるとします。

```php
>>> $array = array('pen', 'pineapple', 'apple');
=> [
     "pen",
     "pineapple",
     "apple"
   ]
```

そしてこんな連想配列を作りたいとします。

```php
[
     "pen" => 0,
     "pineapple" => 0,
     "apple" => 0
]
```

どう作ればよいでしょうか？

## 解法

foreachを使って次のように作る方法があります。

```php
$array = array('pen', 'pineapple', 'apple');
$result = array();

foreach($array as $key) {                                                                     
   $result[$key] = 0;                                                                                  
}
```

```php:結果
   [
     "pen" => 0,
     "pineapple" => 0,
     "apple" => 0,
   ]
```

これでも良いですが、もっといい方法があります。

## 解法(その2)

それはarray_fill_keys関数を使うことです。
この関数の処理は[ドキュメント](https://www.php.net/manual/ja/function.array-fill-keys.php)を読んでもらうとして、この関数を使うと次のように作れます。

```php
$array = array('pen', 'pineapple', 'apple');
$result = array_fill_keys($array, 0);
```

```php:結果
   [
     "pen" => 0,
     "pineapple" => 0,
     "apple" => 0,
   ]
```


## 注意

ただし注意することがあります。
ドキュメントにも書いてありますが配列の値が重複していても連想配列は重複しません。
つまりこうなります。

```php
$array = array('pen', 'pineapple', 'apple', 'pen');
$result = array_fill_keys($array, 0);
```

```php:結果
   [
     "pen" => 0,
     "pineapple" => 0,
     "apple" => 0,
   ]

```

参考
[PHP: array\_fill\_keys \- Manual](https://www.php.net/manual/ja/function.array-fill-keys.php)
[php \- How to convert a simple array to an associative array? \- Stack Overflow](https://stackoverflow.com/questions/6153360/how-to-convert-a-simple-array-to-an-associative-array)
【R】データフレームの出力

備忘録的なメモです。

データフレームを出力する方法。

データフレームは、Rの標準データの、


**InsectSprays**


です。

```R
DF <- InsectSprays
```


出力には**write.table()**関数を使います。

```R
write.table(DF, "InsectSprays.csv", append = F,sep = ",", row.names = F, quote = F)
```

`append`：Fだと上書き、Tだと追記
`sep`：","で文字列を区切る
`row.names`：行名を加えるかどうか
`col.names`：列名を加えるかどうか
`quote`：Tだと二重引用符""で囲まれる

保存場所は、ディレクトリで指定。
なんとなくわかった

```  
 $.ajax({
          headers: {'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')},
          url: '{{route("api.order.carrier_register")}}',  //POST送信を行うファイル名を指定
          type: "POST",
          data: {
            "payment-method" : $('input[name="payment-method"]').val(),
            "delivery-date" : $('input[name="delivery-date"]').val(),
            "delivery-time" : $('input[name="delivery-time"]').val(),
            "remarks" : $('input[name="remarks"]').val(),
            "reason-for-purchase" : $('input[name="reason-for-purchase"]').val(),
            'carrier_type' : $('input[name="carrier_type"]').val(),
          }
        }).done(function(data) {
          //通信完了後 zeusに遷移
          //ZEUSに送信するデータを追加
          $('#zeus_form').children("*[name=money]").val(data.total_cost);
          $('#zeus_form').children("*[name=username]").val(data.member_name_kana);
          $('#zeus_form').children("*[name=telno]").val(data.tel);
          $('#zeus_form').children("*[name=success_url]").val(data.success_url);
          $('#zeus_form').children("*[name=failure_url]").val(data.failure_url);
          $('#zeus_form').children("*[name=sendid]").val(data.order_no);
          $('#zeus_form').submit();
        }).fail(function(data){
          alert("決済会社との通信に失敗しました");
          // console.log(JSON.stringify(data));
          // TODO エラーログを記述する
        });
```

dataってレスポンスのことか！！
【Hugo】静的Webサイトを作る

# Hugoとは
静的サイトジェネレータ。MarkdownファイルをHTMLファイルへ変換し、Webサイトにできるツール。
[公式サイト](https://gohugo.io/)

# 説明の前提条件
Hugoアプリケーションの置場所：`C:\Hugo\bin`
上記フォルダにPATHを通すので、置場所は違っていても大した問題ではない。

Webサイトのソースの置場所：`C:\Hugo\Sites`
これも実際はどこでも構わない。

# インストール

Hugoのバイナリを https://github.com/gohugoio/hugo/releases からダウンロードする。
Windows用のバイナリを探してダウンロード。
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/1c2a79dd-7754-fe17-7a35-e859c690f786.png)

zipファイルを解凍したら、`C:\Hugo\bin`をPATHに追加する。
もしexeファイルが`hugo.exe`ではない場合、ファイル名を変更しておく。

## 稼働確認
コマンドプロンプトを起動し、`hugo help`と入力する。以下のようなヘルプが出ればOK。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/424975/e092edb1-47df-6840-35c0-5bba03261cce.png)

コマンドプロンプトは、「管理者として実行」しないとhugoコマンドが動作しない場合がある。
(おそらくログオンアカウントの権限による)

# 新しいサイトを作る
コマンドプロンプトで以下を実行。

```
cd C:\Hugo\Sites
hugo new site example.com
```

sitesフォルダ配下に`example.com`というフォルダが作られ、他にも色々フォルダが出来ている。

## 設定ファイルを編集する
サイトフォルダ直下にある`config.toml`をテキストエディタで開くと、以下が既に書かれているので、適切な値へ直す。

```:config.toml
baseURL = "http://example.org/"
languageCode = "en-us"
title = "My New Hugo Site"
```

## ソースをGitに登録する
`example.com`フォルダをGitリポジトリとする。

# テーマを適用する
https://themes.gohugo.io/ へ行って、好きなテーマを探す。
テーマはすべてGitリポジトリにあって、使う場合はsubmoduleとして追加するか、cloneするか、頑張ってダウンロードするかのいずれかで取得する。
テーマを決めたら、`themes`フォルダ内に追加する。

```Batchfile
git.exe submodule add   -- "https://github.com/dim0627/hugo_theme_beg.git" "themes/beg"
```

テーマを追加した後、`config.toml`を編集し、themesフォルダ配下に作ったフォルダ名をテーマ名として指定する。

```:config.toml
theme = "beg"
```

# 新しい記事を書く
以下を実行。

```
hugo new <カテゴリ名>/my-first-post.md
```

カテゴリが無い場合は、指定なしでも良い。
ブログサイトの記事を書くなら、カテゴリ名は`blog`や`posts`がよさそう。
mdファイルは、`content`フォルダ配下に作成される。

## moreタグを入れる
記事中にmoreタグを入れると、一覧画面での記事を途中で分割できる。
これをいれないと、サマリーでHTMLが有効にならない。タグを入れない場合、サマリーがテキストのみになる。

[Content Summaries | Hugo](https://gohugo.io/content-management/summaries/)

# テストする
サイトフォルダ直下で以下を実行。

```
hugo server -D
```

`-D`はdraftsが有効になるオプション。

ブラウザで http://localhost:1313/ にアクセスすると結果が見られる。

# 静的ページを生成する
サイトフォルダ直下で以下を実行。

```
hugo
```
既定では`public`フォルダに生成される。
`-d`オプションを付けるか、設定ファイルに`publishDir`を指定すると、生成先を変えられる。

生成されたフォルダをgitリポジトリとし、GitHub Pages用のリポジトリに登録すれば公開できる。
Azure Blockchain Serviceのチェーンにtruffle deployしたらエラーが発生

# 事象
Azure Blockchain Serviceのチェーンに対して、truffle deployした際にエラーが発生（2019/09/03）

```
$ yarn truffle deploy --reset
yarn run v1.16.0
$ /workspace/example/node_modules/.bin/truffle deploy --reset

Compiling your contracts...
===========================
> Everything is up to date, there is nothing to compile.


Starting migrations...
======================
> Network name:    'development'
> Network id:      1403
> Block gas limit: 0x29b92700


1_initial_migration.js
======================

   Deploying 'Migrations'
   ----------------------
   > transaction hash:    0xdd8253a9f0052e0e94672591a0d377885c4c60b8bf6f4f5d80b5ade88e65ef0b
   > Blocks: 1            Seconds: 4
   > contract address:    0x64f5dEBd06144F83C6f081d1b838bab6434E1F97
   > block number:        70323
   > block timestamp:     1567507557
   > account:             0x489c419eDD8D03cDeDBf6Fb5a7882C9357351EA7
   > balance:             0
   > gas used:            261393
   > gas price:           0 gwei
   > value sent:          0 ETH
   > total cost:          0 ETH


   ⠙ Saving migration to chain.Error: Error: StatusError: Transaction: 0xff9173a50c95373b2a4ddda74c01f4d561fd49baa1a055612d1af64996f52f8c exited with an error (status 0) after consuming all gas.
     Please check that the transaction:
     - satisfies all conditions set by Solidity `assert` statements.
     - has enough gas to execute the full transaction.
     - does not trigger an invalid opcode by other means (ex: accessing an array out of bounds).
    at Object.run (/workspace/example/node_modules/truffle/build/webpack:/packages/truffle-migrate/index.js:92:1)
    at processTicksAndRejections (internal/process/task_queues.js:89:5)
Truffle v5.0.34 (core: 5.0.34)
Node v12.4.0
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this comman
```
Migrationsコントラクトに対するトランザクションで失敗した様子

### 使用したTruffleのバージョン

```
Truffle v5.0.34 (core: 5.0.34)
Solidity v0.5.8 (solc-js)
Node v12.4.0
Web3.js v1.2.1
```

### 解決策
Truffleのバージョンを下記に下げたら解消した

```
Truffle v5.0.5 (core: 5.0.5)
Solidity v0.5.0 (solc-js)
Node v12.4.0
pragma solidity 0.5.0;
```
curl した tar.gz を解凍すると gzip: invalid magic エラー

> `curl` でダウンロードした tar.gz ファイルを解凍すると `gzip: invalid magic` エラーが出る。ブラウザなどからダウンロードすると問題ない。

```shell-session:エラー概要
$ curl -S -O https://sample.com/sample.tar.gz \
    && tar -xzvf ./sample.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   129    0   129    0     0    443      0 --:--:-- --:--:-- --:--:--   443
gzip: invalid magic
tar: Child returned status 1
tar: Error is not recoverable: exiting now
```

[「curl gzip: invalid magic」で Qiita 記事をググって](https://www.google.com/search?q=site:qiita.com+curl+gzip:+invalid+magic)もヒットしなかったので、自分のググラビリティと戒めとして。

## TL; DR <sub><sup><sub><sup>（今北産業）</sup></sub></sup></sub>

1. `gzip: invalid magic` エラー自体は「ファイルが壊れている」という意味です。
2. ダウンロードしたファイルを `cat` などで開いてみてください。おそらく `curl` 時に `-L` オプションが抜けていたため、リダイレクトに失敗しています。
3. **`curl` の `-L` オプションをつける**とリダイレクト先からダウンロードされるようになります。

## TS; DR

ファイルが壊れているとばかり思い込んでいたのですが、`curl` 単体でダウンロードを試してみると妙にサイズが小さいことに気づきました。

```shell-session
$ curl -S -O https://github.com/tensorflow/tensorflow/archive/v1.8.0.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   129    0   129    0     0    440      0 --:--:-- --:--:-- --:--:--   441
$ ls -la
total 8
drwxr-xr-x  3 admin  staff  102  9  3 19:53 .
drwxr-xr-x  8 admin  staff  272  9  3 19:53 ..
-rw-r--r--  1 admin  staff  129  9  3 19:47 v1.8.0.tar.gz
$ cat v1.8.0.tar.gz
<html><body>You are being <a href="https://codeload.github.com/tensorflow/tensorflow/tar.gz/v1.8.0">redirected</a>.</body></html>
```

`cat` コマンドで中身を見ると、なんと「リダイレクトされてるよん」と HTML のエラーページをダウンロードしておりました！そりゃ解凍もできませんわね。

１つ１つ確認せずに、横着して一気にコマンドを実行したことが災いしました。とほほ。

- 検証環境：
    - macOS Mojave（OSX 10.14.6）
    - curl: v7.54.0
    - tar: bsdtar v2.8.3
PHP学習の復習のために資格とってみた（PHP7技術者認定試験）

#経緯
プロゲートを数周やる
↓
Laravelで何か作ってみようかなあ
↓
フレームワークの参考書でハンズオン学習
↓
覚えること多過ぎて理解が追い付かず挫折
↓
そもそもPHPの理解が浅いことに気づく（当たり前）

#目的
PHPを基礎から体系的に学びなおす上での目標設定のため
（モチベを保つため）

#PHP技術者認定試験とは？
大まかな概要はこちらに載ってます
[PHP7初級試験]
(https://www.phpexam.jp/summary/novice7/)
初級と上級に分かれていますが、上級は未経験者が独学で合格できる最高難易度に設定されているらしいです…



##使用テキスト
###独習PHP 第3版
[独習PHP 第3版]
(https://www.amazon.co.jp/dp/B01FH3KVNU/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
詳細に解説がされていて学習する上では良書だと感じました。
しかし認定教材ではないので範囲外の部分もあり、試験対策用にはあまりお勧めはできないです…

認定教材はこちらです。
[初めてのPHP]
(https://www.amazon.co.jp/dp/4873117933/)


###徹底攻略PHP7技術者認定初級試験問題集
[徹底攻略PHP7技術者認定［初級］試験問題集 ]
(https://www.amazon.co.jp/dp/B07V2MK63C/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
認定教材のいわゆる「黒本」です。
参考書で一通り学んだ後にこれを2週くらいすればほぼ合格点は取れますが、実際の試験問題の方が難易度が高かったので油断は禁物です。

#勉強法
・参考書でハンズオン学習（2週間くらい）
・黒本で試験対策（3日）
（勉強法とは言えないくらい単純ですが…）

#振り返り
1000点満点中合格ラインが700点で、800点で受かりました。
Swift Mailを使ったメール送信や、各種フレームワーク（Symfony、ZendFrameworkなど）について、PHPコマンドラインなど、未経験の技術に関する問題がとっつきにくかった印象です。
なのでそのあたりを一度触っておくと理解を深めやすいと思います。
MacでPythonのインストールに失敗


解決策

```
SDKROOT=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk MACOSX_DEPLOYMENT_TARGET=10.14 pyenv install
```

エラー内容

```エラー内容
$ pyenv install 3.7.3
python-build: use openssl@1.1 from homebrew
python-build: use readline from homebrew
Downloading Python-3.7.3.tar.xz...
-> https://www.python.org/ftp/python/3.7.3/Python-3.7.3.tar.xz
Installing Python-3.7.3...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk

BUILD FAILED (OS X 10.14.6 using python-build 20180424)

Inspect or clean up the working tree at /var/folders/wg/lf0jxmqj6cz419lmgj2ryd1w0000gn/T/python-build.20190903194102.4918
Results logged to /var/folders/wg/lf0jxmqj6cz419lmgj2ryd1w0000gn/T/python-build.20190903194102.4918.log

Last 10 log lines:
  File "/var/folders/wg/lf0jxmqj6cz419lmgj2ryd1w0000gn/T/tmpbbtoajfs/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/cli/cmdoptions.py", line 22, in <module>
  File "/var/folders/wg/lf0jxmqj6cz419lmgj2ryd1w0000gn/T/tmpbbtoajfs/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/utils/hashes.py", line 10, in <module>
  File "/var/folders/wg/lf0jxmqj6cz419lmgj2ryd1w0000gn/T/tmpbbtoajfs/pip-19.0.3-py2.py3-none-any.whl/pip/_internal/utils/misc.py", line 21, in <module>
  File "/var/folders/wg/lf0jxmqj6cz419lmgj2ryd1w0000gn/T/tmpbbtoajfs/pip-19.0.3-py2.py3-none-any.whl/pip/_vendor/pkg_resources/__init__.py", line 35, in <module>
  File "/private/var/folders/wg/lf0jxmqj6cz419lmgj2ryd1w0000gn/T/python-build.20190903194102.4918/Python-3.7.3/Lib/plistlib.py", line 65, in <module>
    from xml.parsers.expat import ParserCreate
  File "/private/var/folders/wg/lf0jxmqj6cz419lmgj2ryd1w0000gn/T/python-build.20190903194102.4918/Python-3.7.3/Lib/xml/parsers/expat.py", line 4, in <module>
    from pyexpat import *
ModuleNotFoundError: No module named 'pyexpat'
make: *** [install] Error 1
```
jQuery-validate VS jQuery-validationEngine

フロントの作業でフォームの入力チェックで使うjQueryのライブラリとして以下の二つをよく見れれます。

- [jQuery-validate](https://qiita.com/namari/items/72758ebcbc48bf618378)
- [jQuery-validationEngine](https://qiita.com/january108/items/a917dfd78d65b81fba55)

## jQuery-validate
フォームを指定してまとめたルールを定義して利用する例が多かったです。多分、その目的で作られたような気がします。リンクした記事ではセレクターで選択した項目に個別設定する方法が書いております。

まとめて設定するのが良いとは思いますが、ディフォルトがフォームのname属性でルールを設定しないといけな行くて、バックエンドに影響されるのが一番問題だと思います。

フロントでモックを作成して作成されたHTMLをバックエンドでテンプレートを作成する流れになるので、命名規約がフロントバックが違ったり、バックエンドの作業が同時に進んでる場合はリファクタリングが必要になったりします。

自分の場合は変数名とデーターベースのField名が関連される場合が多いので最悪の場合は全ソースの修正が必要となります。

JSでフォームを個別に設定すると問題がないですが、効率が悪い感じがします。

## jQuery-validationEngine
フォームのclassの定義で入力チェックを行う方法です。上記「jQuery-validate」に書いた問題点を解決できるような認証です。

フロントの実装的にも良いし、フロントとバックエンドの独立的作業ができると思うので良いかと思います。

## その他
jQuery-validateのダメ話になっておりますが、自分が分からない部分があったら教えてください。個人的にjQuery-validateで作業されて全フォームのname属性を修正した経験があるので、バックエンドとしてこういうのがありますって思い出書いてみました。簡単にいうと**name属性でComponentを制御しちゃダメです！！**との事です。
[Golang]GETリクエストして、返ってきたJSONを確認するだけのサンプルコード

# いきなり結論のコード

注）今回は、なるべく簡潔なコードでAPIを叩く確認をすることを優先しました。
そのため、コメントでお叱りを受けた通り、本当なら必要なはずのエラーハンドリングを省略していますので、このコードを利用される方は、その点をご注意ください。
また、コメント欄で@nobonobo 様から非常に丁寧に説明を頂いております。読んで頂く方は、ぜひそちらも読んでもらえると良いかと思います。

```golang:サンプルコード
package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
	"net/url"
)

func main() {
	base, _ := url.Parse("http://zipcloud.ibsnet.co.jp")
	reference, _ := url.Parse("api/search?zipcode=100-0001")
	endpoint := base.ResolveReference(reference).String()
	req, _ := http.NewRequest("GET", endpoint, nil)

	var client *http.Client = &http.Client{}

	resp, err := client.Do(req) // 2019/09/04修正
	if err != nil {
		log.Fatal(err)      // コメント欄を参照して下さい
	}
	defer resp.Body.Close()

	body, _ := ioutil.ReadAll(resp.Body)
	fmt.Println(string(body))
}
```

```json:実行結果
{
        "message": null,
        "results": [
                {
                        "address1": "東京都",
                        "address2": "千代田区",
                        "address3": "千代田",
                        "kana1": "ﾄｳｷｮｳﾄ",
                        "kana2": "ﾁﾖﾀﾞｸ",
                        "kana3": "ﾁﾖﾀﾞ",
                        "prefcode": "13",
                        "zipcode": "1000001"
                }
        ],
        "status": 200
}
```
# していること

今回は[こちらのAPI](http://zipcloud.ibsnet.co.jp/doc/api)を使わせてもらいました。
シンプルに、エンドポイントに郵便番号を入れてリクエストを送ると、住所がJSONで返されるAPIです。

# 解説

## `url.Parse()`でURLが正しいものか確認

```golang
base, _ := url.Parse("http://zipcloud.ibsnet.co.jp")
```

- `http://zipcloud.ibsnet.co.jp`を入れることで、URLを確認
- `base`という変数に代入
- 第二引数は**ブランク修飾子**にしているが、変数をセットすると、エラー内容が代入される。

## `ResolveReference`でURLを安全に繋げる

```golang
endpoint := base.ResolveReference(reference).String()
```

- `base`変数の値に、`reference`変数の値を、繋いでいる。
- `endpoint`変数に代入している。
- ちなみに、この時点で`endpoint`変数には、`http://zipcloud.ibsnet.co.jp/api/search?zipcode=100-0001`が代入されている。

## `http.NewRequest`でリクエストを投げる準備

```golang
req, _ := http.NewRequest("GET", endpoint, nil)
```

- struct(構造体)を作成している
- まだURLにアクセスはしていない
- 第三引数はGETリクエストなので、`nil`ですが、POSTの際などにはバイトを入れる

## `&http.Client{}`でクライアントをつくる

```golang
var client *http.Client = &http.Client{}
```

ここはおまじない的に捉えています。
僕の実力では、うまく説明ができない…

とにかく、作成したものを`client`変数に代入してます。
まだURLにアクセスしていません。

## `client.Do()`でURLにアクセス

```golang
resp, err := client.Do(req)
```

- `req`には`NewRequest()`で用意したstructが代入されている
    - ちなみに`req`の中には
        - GETでのリクエスト
        - URLエンドポイント
        - nil

        が入っている
- アクセス結果を`resp`変数に代入している
- ここに関しては、コメントでツッコミを頂いておりますので、ぜひご参照下さい。

## `ioutil.ReadAll`で読み込んで出力

```golang
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
```

ここの解説は[以前の記事](    )に任せます。

# さいごに

最後まで読んで頂き、ありがとうございました。
また、間違い等があればコメントでツッコミ頂けると嬉しいです。
Raspbianプロキシ設定まとめ

Raspbian Busterでプロキシをもろもろ設定したのでまとめます。

# apt-get

```bash
export http_proxy="http://USERNAME:PASSWORD@IP:PORT/"
export https_proxy="http://USERNAME:PASSWORD@IP:PORT/"
export ftp_proxy="http://USERNAME:PASSWORD@IP:PORT/"
```

# 時刻
プロキシ経由だとntpが効かない。
次のコマンドの後rebootで時刻を合わせる。

```bash
date --set @"$(wget -q https://ntp-a1.nict.go.jp/cgi-bin/jst -O - | sed -n 4p | cut -d. -f1)"
```

# chromium

オプションをつけて起動かプラグインを入れるか。
プラグインを入れると通常起動でプロキシが使える。
下記コマンドでchromiumを起動して、Chromeウェブストアからプラグイン「Proxy SwitchyOmega」を追加する。

```bash
chromium-browser --proxy-server=https=IP:PORT
```

追加できたら次のように設定し「Apply change」を押す。
※時刻が合ってないとプラグインの追加ができないっぽい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488658/001b5e5e-c88d-e763-9b2b-2c31ccd60b1f.png)

# wget

`/etc/wgetrc`の`You can set the default proxies...`のところに追記

```conf:/etc/wgetrc
http_proxy="http://USERNAME:PASSWORD@IP:PORT/"
https_proxy="http://USERNAME:PASSWORD@IP:PORT/"
ftp_proxy="http://USERNAME:PASSWORD@IP:PORT/"
```

# git

```bash
git config --global http.proxy http://IP:PORT
git config --global https.proxy http://IP:PORT
```

# python

pythonのリクエストモジュールは大文字の指定しか読み込まないらしい。

```bash
export HTTP_PROXY="http://USERNAME:PASSWORD@IP:PORT/"
export HTTPS_PROXY="http://USERNAME:PASSWORD@IP:PORT/"
export FTP_PROXY="http://USERNAME:PASSWORD@IP:PORT/"
```

# pip instal

pipはオプションにつけるしかない

```bash
pip install もじゅーる --proxy="http://USERNAME:PASSWORD@IP:PORT/"
```

SSL認証系のエラーが置きたら以下のオプションを追加するといい

```bash
 --trusted-host pypi.org --trusted-host www.piwheels.org
```

# curl

-x で指定

```bash
curl ~~ -x http://IP:PORT
```

# Docker
## daemon

```bash
sudo mkdir -p /etc/systemd/system/docker.service.d
echo -e "[Service]\nEnvironment=\"HTTP_PROXY=http://IP:PORT\"" | sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf
sudo systemctl daemon-reload
sudo systemctl restart docker
```

## container

```bash
mkdir ~/.docker
nano ~/.docker/config.json
{
    "proxies":
    {
        "default":
        {
            "httpProxy": "http://IP:PORT"
        }
    }
}
```

# npm

```bash
sudo npm -g config set proxy "http://USERNAME:PASSWORD@IP:PORT/"
sudo npm -g config set https-proxy "http://USERNAME:PASSWORD@IP:PORT/"
sudo npm -g config set registry "http://registry.npmjs.org/"
```
Processingで３次元空間上に文字をかくやり方

#やりたいこと
３次元空間では視点を変えると、単にtext()で表示させているだけの文字も移動してしまう。デカルト座標に依存せずに画面に文字を固定表示させたい。

#実装方法
```java
void showText3d(String str1) {
  pushMatrix();
  camera();
  hint(DISABLE_DEPTH_TEST);
  noLights();
  textMode(MODEL);
  text(str1, 20, 20);
  hint(ENABLE_DEPTH_TEST);
  popMatrix();
}
```
pushMatrix()とpopMatrix()の組み合わせで解決。
KoaでレスポンスのContent-Typeを取得する(charsetなどなしのもの)

KoaでレスポンスのContent-Typeを取得する方法を紹介する。

## `ctx.response.type`で取得できる

```js
ctx.response.type // "text/html"
```

これは、`charset`などのパラメータを除いた部分になる。

## 参考

* [koa/response.md at master · koajs/koa](https://github.com/koajs/koa/blob/master/docs/api/response.md#responsetype) - 公式ドキュメント
【スマートスピーカー】サーバをコントロールするのにGoogle Homeをリモコンとして使う

#GoogleHomeでサーバ動作をコントロールしてみる
##【課題】
　　前回、投稿したスマホからの位置情報でLineを送るBOTサーバー。運用していく中で一定の動作させるには非常に便利で重宝していて、日常生活においても活用の場を増やしたいと考えていました。
　しかし課題があらかじめ設定した動作以外に動作を変化させるには、ターミナルなどから一度サーバにログインして定期的な情報メンテナンスや操作が必要になってしまう。

##【解決策】
　　GoogleHomeから操作出来るようにすればGoogleHomeおよびスマホのアシスタントから操作が可能になる。

##【結果】
　　GoogleHomeを使うことで動作オプションをつけるような使い方が可能。
　あとはセキュリティーとの兼ね合いでどこまでの操作を出来るようにするかの定義は必要かと思います。
　アプリケーションなどのアップデートなどそのものをGoogleHomeでするとかはあまり精神的にもセキュリティー的にもよろしくないかなと思います。

##○今回、具体的に何を操作したいのか
　　前回投稿していたスマホの位置情報から到着時間を送信してくれるBotの動作をコントロール
　　・特定の場所までの所要時間を計算するだけでなく変更したい
　　　→目的地の変更オプションが欲しい
　　・勤務パターンに合わせて常にLineを送る
　　　→時々送らないというオプション選択も欲しい
　　・Lineの送り先などの変更
　　　→Lineのいろんなグループやルームに送れると便利だよね

##イメージ

<img width="824" alt="スクリーンショット 2019-09-03 18.22.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431024/6cee3a42-e600-1317-bfce-b80bc20ddca2.png">

##動作手順
　主なポイントはDialogflowによるIntentとEntityと呼ばれる部分の設定になるかと思います。
　まだ自分自身いまいち理解が深まってなくこの辺の解説は他の方々のqiitaをご覧ください。

　ここでは僕はEntityを動作定義として使っています。
　まずactionsという名前のEntityを作成してreference valueに「chan_dist」、synonymに「目的地」「もくてきち」「目的地を変更」などといったリストを作成しています。
　これによってユーザの発した言葉に「目的地」といった言葉が含まれているとactionsというパラメータに「chan_dist」が追加されるというイメージです。

　そこからIntent側で「Training　Phrases」に「〇〇を▲▲にして」「〇〇に××って送って」といった設定をしてEntitityで登録されていないものはsys.anyというEntityを使ってパラメータ作成をしています。あとはwebhookでjson形式でパラメーターが送信されるのでそれを受け取って処理するAPIのようなものをサーバ側に構築する。

###　【サーバ側動作】
　　json形式でパラメータがDialogflowから飛んでくるので、解析。
　　上記で作成したDialogflowでは「actions」というキーに「chan_dist」という値が設定されていたらsqlite内の目的地設定の値を変更する。という動作をさせるようにしています。



##【編集後記】
　　まだまだ特にDialogflow部分など理解が深まってなくうまく解説できていないですね。今後さらに触ってみて理解が深まり解説出来るようになったら再編集ですね。
PHPでISO8601 durationを日本語化する

PHPで、Web APIを実行したときのレスポンスに`PT1H1M1S`なdurationが返ってきたときに、日本語化するラッパクラスがほしかったので書いてみました。

ISO 8601 duration specificationについては、[P2Y3DT6H8M！？　この暗号を解読するための ISO 8601 duration specification とは](https://amg-solution.jp/blog/9491)が詳しかったのでそちらを参照ください:smile:

参考：[PHP: DateInterval::format \- Manual](https://www.php.net/manual/ja/dateinterval.format.php#refsect1-dateinterval.format-examples)

```php
class Iso8601Formatter
{
  public $val;
  public function __construct($duration){
    $this->val = $duration;
  }
  
  function toJp()
  {
    $interval = new \DateInterval($this->val);
    $fmt = "";
    if($interval->h > 0) {
      $fmt.=('%h時間');
    }
    if($interval->i > 0){
      $fmt.=('%i分');
    }
    if($interval->s > 0){
      $fmt.=('%s秒');
    }
    return $interval->format($fmt);
  }
}

echo join(PHP_EOL,
  [
    (new Iso8601Formatter('PT1H1M1S'))->toJp(),
    (new Iso8601Formatter('PT14M10S'))->toJp(),
    (new Iso8601Formatter('PT2H9M'))->toJp(),
    (new Iso8601Formatter('PT2H59S'))->toJp()
  ]);
```

```shell:実行結果
1時間1分1秒
14分10秒
2時間9分
2時間59秒   
```
【Laravel5.6】firstOrCreateの罠

## firstOrCreateとは

https://readouble.com/laravel/5.6/ja/eloquent.html#other-creation-methods

> firstOrCreateメソッドは指定されたカラム／値ペアでデータベースレコードを見つけようします。
> モデルがデータベースで見つからない場合は、最初の引数が表す属性、任意の第２引数があればそれが表す属性も同時に含む、レコードが挿入されます。

以下のように実装した場合

```php
User::query()->where('uuid', '=', $uuid)->firstOrCreate([
    'uuid' => $uuid,
    'type' => $type,
    'event' => $event,
]);
```

以下のようなSQLが発行される

```sql
select * from `users` 
where `uuid` = ? and (`uuid` = ? and `type` = ? and `event` = ?)
limit 1
```

```sql
insert into `users` (`uuid`, `type`, `event`) values (?, ?, ?)
```

select文が…！

Laravel側のソースを見てみると、引数を全てWhere句に突っ込んでるんですね。

```php
/**
 * Get the first record matching the attributes or create it.
 *
 * @param  array  $attributes
 * @param  array  $values
 * @return \Illuminate\Database\Eloquent\Model
 */
public function firstOrCreate(array $attributes, array $values = [])
{
	if (! is_null($instance = $this->where($attributes)->first())) {
		return $instance;
	}

	return tap($this->newModelInstance($attributes + $values), function ($instance) {
		$instance->save();
	});
}
```

ドキュメントを言葉通りに受け止めましょうという話

> firstOrCreateメソッドは指定されたカラム／値ペアでデータベースレコードを見つけようします。
Facebook系のpodのバージョンを上げたときのエラー

FacebookCore と FacebookLogin のバージョンを 0.6から０.7にあげようと思ったらいたるところでエラーが起こった :frowning2:
なにやら0.6から0.7でbreaking changeがあった模様。

実際の変更点としては[こちら](https://github.com/facebook/facebook-swift-sdk/compare/v0.6.0...v0.7.0)

# xcodeが直してくれる

## `'FBSDKAppEvents' has been renamed to 'AppEvents'`

`Replace 'FBSDKAppEvents' with 'AppEvents'` 

`FBSDKAppEvents.logEvent("sign_up")` から `AppEvents.logEvent(AppEvents.Name(rawValue: "sign_up"))` 

## `'FBSDKApplicationDelegate' has been renamed to 'ApplicationDelegate'`

Replace 'FBSDKApplicationDelegate' with 'ApplicationDelegate'

# 手で直すもの

## `No type named 'ReadPermission' in module 'FacebookCore' `

FacebookCore の Permissionに書き換え

## `'FBSDKApplicationDelegate' has been renamed to 'ApplicationDelegate'`
  
`FBSDKApplicationDelegate.sharedInstance()` から `ApplicationDelegate.shared` へ

## `Use of unresolved identifier 'LoginManager'`

`LoginManager` から `FBSDKLoginKit.LoginManager()`

## `Value of type 'AccessToken' has no member 'userId'; did you mean 'userID'?`

Replace 'userId' with 'userID'

## `Value of type 'AccessToken' has no member 'authenticationToken'`

(たぶん) token.tokenString に書き換え？
Atcoder ABC 026 C-高橋君の給料

#Atcoder ABC 026 C-高橋君の給料
#問題概要
略

#考え方
まず、一次元配列を要素とする一次元配列Gを、G[b]が社員番号bの部下の社員番号が格納されるようにする。
このようにして得たGは、各社員の上司ー部下の関係を表すグラフと捉えられる。（G[i]を参照すれば社員iの部下がわかる）
後は再帰関数を使って一気に各社員の給料を求めていく。dfs(u)がuの給料を返す再帰関数を作る。上司ー部下グラフにおいて葉となる社員、つまり部下がいない社員の給料は1である。葉以外の社員においては、G[u]の全ての要素vのdfs(v)から最大のものと最小のものの和に1足したものを返り値とすればよい。(社員uの給料dfs(u) = dfs(v)のMAX + dfs(v)のMIN + 1 (uの部下vとする））。
このようにしてdfsを作ると、葉の上の社員の給料から順々に給料が決まっていき、最終的に社員番号１の高橋君の給料が得られる。


```c++
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 1000000000;
vector<int> G[25];/*G[b]には社員number:bの部下のnumberが格納されている
配列を要素とする配列*/

int dfs(int u){
    int ma = 0;
    int mi = 10000000;
    if(G[u].size() == 0){/*節点uが葉の時、つまりuに部下がいない時、給料は1*/
        return 1;
    }
        for(auto v:G[u]){/*uの部下のvに対して最大の給料をmaに、
        最小の給料をmiに格納*/
            ma = max(ma,dfs(v));
            mi = min(mi,dfs(v));
        }
        return ma + mi +1;
}

int main() {
int n;
cin >> n;
for(int i = 2;i<=n;i++){
    int b;
    cin >> b;
    G[b].push_back(i);

}
    cout << dfs(1) << endl;
}
```
SOAPUIのScriptAssertionでPropertyを使用する方法

#SOAPUIのScriptAssertionでPropertyを使用したい
SOAPUIのScriptAssertionを用いると、Groovyのスクリプトを用いてアサーションを行うことが可能です。前のステップの戻りの値などを後続のステップで使用したい場合には、一度プロパティにセットする手法をよく使いますが、ScriptAssertion内でその値を使用したい場合の方法について説明します。

##RESTAPIの戻りの一部をPropertyにセット

以下のようなGroovy Scriptのステップで、レスポンス・テキストをJSONにパースし、プロパティにセットすることが可能です。

```sample.groovy
import groovy.json.JsonSlurper

//前のステップのレスポンスを取得
response =  context.httpResponse.responseContent;
//レスポンスをパース
obj = new JsonSlurper().parseText(response);
//テスト・スイートのプロパティにセット
testRunner.testCase.testSuite.setPropertyValue( "param1",obj.id.toString() )
```

##Assertion Script内でのプロパティの取得
Assertion Script内では以下のようにcontext.expandを使用してプロパティを取得し利用することが可能です。

```sample2.groovy
//テスト・スイートのプロパティを取得
def id= context.expand('${#TestSuite#id}')
```