OmniAICreator/Qiita-1.07M huggingface dataset:
5．ビットコインの所有権とプライバシーの問題 - 非対称暗号化アプリケーション

この記事は
[https://learnblockchain.cn](https://learnblockchain.cn)
を元に編集したものです。
翻訳者のTwitter Account：[taro03293](https://twitter.com/taro03293)


この章では、Bitcoinシステムが、Bitcoinの所有権をどのように保証しているかについて説明します。

##銀行システム
まず現在の銀行のシステムについて考えてみましょう。
銀行に口座を開設するには、自分の個人情報を銀行に提供する必要があります。
銀行に自分の口座ができたとき、その口座の所有権は個人情報を渡した“自分”にあります。
誰かにお金を支払うとき、銀行は我々のリクエストに応じて、自分の口座から対象の口座へお金を振り込みます。
あなたの個人情報は自分と銀行両方がそれぞれ管理しています。

##Bitcoinシステム
では、Bitcoinは、銀行が関与していない状態で、どのように口座(アカウント)の所有権を決め、そしてどのように個人情報を守るのでしょうか。
実は、Bitcoinのアカウントはaddressで表され、個人情報はネットワーク上には表示されません。
Bitcoinにおける取引、とはあるaddressから別のaddressにBitcoinを動かすことを指します。
Bitcoinシステムで記録される取引は次のようになります。

```
{
    "金額を支払うaddress "："2A39CBa2390FDe"
    "金額を受け取るaddress "："AAC9CBa239aFcc"
    "金額"："0.2btc"
}
```

BitcoinシステムでBitcoinを取引する場合、addressとそれにリンクするPrivate Key(パスワードのようなもの)が必要です。

addressとPrivate Keyは非対称の関係にあります。
Private Keyをシステム的に計算(2回Hash化します)すれば、そのKeyに紐づくaddressを得ることができます。
逆にaddressからPrivate Keyを求めることはできません。

コードで表すと下記のようになります。

```
address： 2A39CBa2390FDe
Private Key： sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgal

Hash(Hash(fun(sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgal)))  -> 2A39CBa2390FDe
```

>銀行システムの場合は、口座情報とパスワードは完全に独立しています。
よって、銀行取引する場合、口座情報、パスワード両方を検証する必要があります。

先程の取引の場合、address(2A39CBa2390FDe)のPrivate Key(sdgHsdniNIhdsgaKIhkgnakgaihNKHIskdgal)を持つ人だけが、この支払いを実行できます。

```
{
    "金額を支払うaddress "："2A39CBa2390FDe"
    "金額を受け取るaddress "："AAC9CBa239aFcc"
    "金額"："0.2btc"
}
```

##取引記録にデジタル署名をするには
取引情報から要約情報を取得するためにハッシュ化を行い、次に要約情報をデジタル署名します。 
プロセスは大体次のようになります。

1.取引情報をハッシュ化して、ハッシュ値を求める

```
hash('
    {"金額を支払うaddress"："2A39CBa2390FDe",
    "金額を受け取るaddress"："AAC9CBa239aFcc",
    "金額"："0.2btc"
    }') -> 8aDB23CDEA6
```

2．Private Keyを使ってハッシュ値にデジタル署名をする

```
#パラメーター1はハッシュ値
#パラメーター2はPrivate Key
#sign(パラメーター1,パラメーター2)でデジタル署名を返す
sign("8aDB23CDEA6", "J78sknJhidhLIqdngalket") -> "3cdferdadgadg"
```

デジタル署名の後、支払いノードは隣のノードに
“Address：AAC9CBa239aFccに0.2btcを送り、デジタル署名は3cdferdadgadgです。”
という内容を隣のノードに送ります。
隣のノードは、上記内容を検証した後、その情報を隣のノードに送り、最終的にネットワーク全体に上記の情報が広まります。

ノードは第一のノードから情報を受け取ったあと、デジタル署名が支払いの時に使われたPrivate Keyから生まれたものかを検証します。
もし、検証が確認出た場合、取引が有効になり、相応する金額が別の口座に記録されます。
(実際には、支払い者の残高照会の検証がさらに必要ですが、ここでは省略します)
コードで表すと下記に様になります。

```
#パラメーター1はデジタル署名
#パラメーター2は支払い方のAddress
#verify()でハッシュ値を返す
verify("3cdferdadgadg", "2A39CBa2390FDe") -> "8aDB23CDEA6"
```

もし検証結果verify()と元のハッシュ値が一致していれば取引が有効になり、相応する金額が別の口座に記録されます。

```
if(verify("3cdferdadgadg", "2A39CBa2390FDe")
    == hash('{"支払い方のAddress"："2A39CBa2390FDe",
              "受け取り方のAddress"："AAC9CBa239aFcc",
              "金額"："0.2btc"}')) :
    # 記帳する
    # 他のノードに伝える
else:
   # 検証結果が無効の場合、何もしない
```

ここまででPrivate KeyとAddressとデジタル署名の関係が分かったと思います。
さらに詳しく知りたい方はそれぞれの概念についてGoogleで調べてみてください。

続く
初心者が学習するSQL（DDLの構文）#pert2

# **データベースの操作**

#### SHOW DATABASES文
※SQL文の終わりにはセミコロンをつける。
※SQL文は小文字でも実行できる。（今回は強調する意味で大文字にしている）

```ruby:ターミナル
SHOW DATABASES; #データベースを一覧で表示するSQL文。
```

#### CREATE DATABASE文
```ruby:ターミナル
CREATE DATABASE データベース名; #指定したデータベース名が作成される。
```

#### USE文
```ruby:ターミナル
USE データベース名; #データベースを選択する。
```


# **テーブル構造の操作**


#### SHOW TABLES文
```ruby:ターミナル
SHOW TABLES; #テーブルの一覧を表示する。
```

#### CREATE TABLE文
```ruby:ターミナル
CREATE TABLE テーブル名（カラム名 カラム名の型,....）; #指定したカラムを持ったテーブルが作成される。
```

#### テーブル構造の確認

```ruby:ターミナル
SHOW columns FROM テーブル名;　#テーブルの構造（カラム、データ）を見る。
```
#### カラムの追加

```ruby:ターミナル
ALTER　TEBLE　テーブル名　ADD　カラム名　カラムの型; #カラムを一つだけ追加する。
ALTER　TEBLE　テーブル名　ADD　（カラム名 カラムの型,....）; #カラムを複数追加する。
```

####　カラムの修正

```ruby:ターミナル
ALTER TEBLE テーブル名　CHANGE　古いカラム名　新しいカラム名　新しいカラムの型;　#古いカラムが新しいカラム名、型に変わる。
#たとえ変更前と変更後のカラムの型が同じでも記述しなくてはならない。
```

#### カラムの削除

```ruby:ターミナル
ALTER TEBLE　テーブル名　DROP　カラム名;
```

これらがSQLのDDLの基本構文！
第二創業の条件。仮説(69)

第二創業を歌う会社を時々みかける。

実態をよくぞんじあげない。

この話は、プログラム国、プログラム県、プログラム市、プログラム町在住のプログラマ氏の落書きです。私自身の書き込みではありません。

もし、日本国内の話であったとしたら、日本国内の法律に照らして妥当かどうか検討中とのこと。

対象となる会社は、プログラム、ソフトウェアの売り上げを伸ばすことが鍵だと考えていることを仮定する。

# 第二創業と言えるための条件を計画(program)

### 1. 役員を十分の１にする。
役員になってもらう代わりに、新しい関係会社を作ってもらう。
役員を半分とかって中途半端すぎ。創業時の役員数に戻さないで、第二創業って何？

### 2. 会議の時間は５分の１にする。
１日２時間会議をしている会社は、５分の１の１日24分にする。１日４時間会議をしている会社は、２０分の１の１日12分にする。１日８時間会議している会社は、会議をやめる。会議をやめない人は会社を辞めてもらう。

「会議をやっている暇があったらプログラムを組め」を垂れ幕に

１日１時間会議をしている場合は、全員にその１時間で書いたプログラムの内部公開を義務付ける。ただし、機密のプログラムを書く場合には、会議前に「機密プログラム中」を宣言することを義務付ける。

これで、会議中には無駄な発言をするものがなくなり、ソースコードの合同レビューで、コードを書かない人の発言もなくなることを想定。

ソースコードのレビューで書き直し案が提出できない人の発言は、口頭ではなく、オンラインの書き込みを原則にする。

利用者の意見を封殺するといけないため、利用者の意見収集は口頭の会話とるす。動画撮影を原則とする。動画撮影が、発言の範囲を狭める場合は行わない。

「会議は30分未満」小耳にはさんだ話。臨機応変。
https://qiita.com/kaizen_nagoya/items/55ab43e7f50434156ff4

### 3. 組織内外の技術者、芸術家との交流の場を広げる

外との交流を第二創業と言っている会社で、内の交流が押し付け的なものしかないのに遭遇したことがある。

外との交流に、お金を費やして新聞に記事を掲載したり、お金を使った行事で意見をおしつけるのを交流と呼んでいることを目撃したことがある。

ソフトウェアであれば、一人年間1000行、オープンソースに貢献し、githubに掲載するプログラムはdocker上で動作することを義務付ける。
プログラムでない場合は、絵、図、写真または三次元の製作物を毎日一つ公開。

各種公募、競技会、LINEスタンプなどの登録を推奨する。

### 4. 技術要件(technical requirements)

つぎのうちいずれか一つまたは全部を満たす。

1)  github-docker連携でソースコードを管理する
2) 機械学習・量子計算機の原理の改良に貢献する
応用分野の適用は三年間評価しない
3) 言語、OS、DB、通信、WEBのいずれか２つの連携を専門登録する

# まとめじゃないもの(仮説)
第二創業と言える変革例を列記した。

一つ一つは、絶対ではない。
それぞれ、相当の代替の施策でもよい。

## 不規則発言
この発言は、ネットで見つけた仮定の不規則発言です。人の発言で気分を害される方は読まないでください。

>創業時の努力を知らない人が、どこかのベンチャーを買収して第二創業って片腹痛い。

>「会社名を背負ってはいけない」という社長が、会社名を背負った発言しかできないのはなさけない。

## お断り
この文章は、ポエムであり、プログラム国、プログラム県、プログラム市、プログラム町でのことです。内容は特定の企業、特定の個人を指すものではありません。

# 文書履歴(document history)
ver. 0.01 初稿 20190314
ver. 0.02 GitHub, docker 追記 20190315 早朝
ver. 0.03 不規則発言みだし等追記 20190315 朝
ver. 0.04 技術要件追記 20190315 昼前
ver. 0.05 標題追記 20190526
ver. 0.06 「会議は30分未満」小耳にはさんだ話。臨機応変。URL追記　20220307

最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
irbで簡易的にプログラム動作をチェックする

# irbで簡易的にプログラム動作をチェックする
プログラミングを行う場合
<br>・テキストエディタでプログラムを書く
<br>・ファイルを保存する
<br>・ターミナルでファイルを動かす（Macの場合）
<br>といった手順が必要になります。
<br>プログラム初心者の場合は短いコードを書くことから始まります。
<br>その短いコードのために、いちいちファイルを作成して動作を確認するのは面倒ですよね？
</br>
- [目次]
	- [irbを使用すれば簡易的にプログラムの動作を確認できる]
		- [irbとは]
		- [どうやって使用するの？]
		- [実際に使用]
		- [irbの終了]
	- [irbの使用は簡単]
	
## irbを使用すれば簡易的にプログラムの動作を確認できる
### irbとは
irbとは**interactive Ruby**の略です。日本語にすると**対話的Ruby**。
<br>対話的とは、コンピュータの質問に一つ一つ答えていけば目的が達成できるということです。
<br>ソフトウェアをインストールする場合などをイメージしていただけると分かりやすいかと。
<br>このirbを使用すれば、簡易的なコードであれば、ファイルを作成する必要なくプログラムの動作を確認することができます。
</br>
### どうやって使用するの？
irbはRubyに付属しています。なのでRubyをインストールしていれば使用することが可能です。
<br>起動方法は簡単で
1. ターミナルを起動する<br>
 
```console
hosokawakiyoshiya-no-MacBook-Pro:~ hosokawakiyoshiya$
```

2. 『irb』と入力する<br>

```
hosokawakiyoshiya-no-MacBook-Pro:~ hosokawakiyoshiya$ irb
irb(main):001:0> 
```

これだけです。
### 実際に使用
では、数字の計算をしてみましょう。
- 入力<br>

```
hosokawakiyoshiya-no-MacBook-Pro:~ hosokawakiyoshiya$ irb
irb(main):001:0> puts(1+2+3+4+5)
```
- 出力<br>

```
15
=> nil
```
### irbの終了
ターミナルのウィンドウを閉じるか、『**quit**』と入力してください。

```
irb(main):002:0> quit
```

```
hosokawakiyoshiya-no-MacBook-Pro:~ hosokawakiyoshiya$
```
## irbの使用は簡単
irbはコマンドを打ち込むだけですぐに起動できるので、初学時のプログラム動作チェックに利用してみて下さい。
heroku　git push heroku masterが拒まれた話

#herokuを使ってデプロイ

herokuを使ってデプロイをしようとしたところ
###
```
$git push heroku master


remote:  !
remote:  !     Failed to install gems via Bundler.
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: !	Push rejected to muji-app-copy.
remote: 
To https://git.heroku.com/****.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/***.git'
***noMacBook-Pro:*** ***$ bundle install
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
Using rake 12.3.2
```

との事、、、


調べると以下を実行すれば通るとの事だが
###
```
$ bundle install --without production
$ git commit -a -m "Update gemfile.lock for heroku"
$ heroku create
$ git push heroku master```

remote:  !
remote:  !     Failed to install gems via Bundler.
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: !	Push rejected to muji-app-copy.
remote: 
To https://git.heroku.com/****.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/***.git'
***noMacBook-Pro:*** ***$ bundle install
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
Using rake 12.3.2
```

しかし結果は変わらず、、、

エラー文を見てみると
###
```
Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java.
```

とのメッセージが
###
```
$ bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java
$ git commit -a -m "change　gemfile.lock for heroku"
$ heroku create
$ git push heroku master
```

を実行してみると、、、通った！！


###まとめ
###
```
$ heroku logs
```
などをしてエラーメッセージ、ログをしっかり読む！！


###追記
###
```
$ rake assets:precompile
```
も役立つ！！
【WordPress】記事IDを指定して抜粋を取得したい（get_the_excerpt()関数の代替案）


# 記事IDを指定して抜粋を取得したい

他の関数みたいに`get_the_excerpt()`の関数に記事IDを指定すればそのIDの記事の**抜粋**（本文の最初の一部）を取得できると思ったら**できなかった**。

[テンプレートタグ/get the excerpt - WordPress Codex 日本語版](https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/get_the_excerpt)

# 記事IDを指定して抜粋を取得する方法

```php
echo wp_trim_words ( strip_shortcodes( $post->post_content ), 55 );
```

これで`get_the_excerpt()`みたいに取得できました。
※文字数を変更する場合は`55`を任意に変更すること

# 他の方法

こっちは**抜粋欄にある文字を表示**するみたいで、自分がしたかった（本文の最初の一部を取得）ことじゃなかったので他の方法として書いておきます

```php
echo apply_filters( 'the_excerpt', get_post_field( 'post_excerpt', $post->ID ) );
```

# 参考
- [wordpress get excerpt by id - Stack Overflow](https://stackoverflow.com/questions/11370599/wordpress-get-excerpt-by-id)
- [テンプレートタグ/get the excerpt - WordPress Codex 日本語版](https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/get_the_excerpt)
【VScode】出会って600秒で合体 - AtomからVScodeへ乗り換えました

自分はもともとAtomを使っていましたが、とうとう昨日VScodeに乗り換えてみて「すばらしい！」となったので、1日の間（触ったのは2,3時間）に使用した素直な感想をメモがてら簡潔に書きます。

こちらに参考にした方々の記事を貼っておきます。

[なぜ、VSCodeを使うのか？](https://qiita.com/lldev2/items/46d55f71bdc1af2e3b10)
[Visual Studio Code上でイマドキのJavaScript開発環境を構築する](https://qiita.com/tochi_ondy/items/8ad0a46299697ef0d12f)
[開発が捗る Visual Studio Code 拡張機能](https://qiita.com/Yuta_Yamamoto/items/fbeb7b31173b3e787fc2)

##乗り換え前エディタ
Atom

##乗り換えた理由

### 動作が重すぎる
PC環境が悪いのかそもそも自分が負荷をかけてしまっていたのかは分かりませんが、起動時に早くて4～5秒・ひどいときには10秒以上かかったりとしていたので、我慢の限界で「試しに入れてみるか」という軽い気持ちでした。まさか、一瞬で虜になるとは・・・。

入れる前にいろいろと調べましたが、動作の重さを理由に乗り換える方が多い印象でした。

###検索/置換するにあたって、複数行がやり辛い
こちらも結構不便していて、複数行はDWで行なっていました。
一応、解決方法も探してみましたが見つからず・・・。検索力がまだまだですかね。

###プラグインの整理が面倒くさい。
そのまんまです。

##乗り換えて感じたメリット

###動作がスピードがAtomの1/2
先述しましたが、この理由が大きいです。
起動させてみて、スムーズに動く様を見たときにテンションが最高潮。
なにこれCSSアニメーションみたい・・・クリックした時の動作も速いしなにこのイケメン・・・。
この時点で今後使っていこうと思いました。

###設置の手間はインストールのみ<br>初期装備で普通に作業できる<br>初期装備が普通に優秀
インストールも合わせて本当に１０分ぐらいで使用出来たような気がします。（測っていませんが）
それぐらいお手軽に導入できました。
Atomの時はもっと手順があったような・・・。

Emmetなど様々な機能がデフォルトで入っているので、すぐに使用感を確かめられるのもいいですね。

###UIデザインが良いので見やすい
左にある機能バーのおかげか、とてもすっきりとしてAtomより見やすい・使いやすい印象を受けました。

###コンソールがしっかり使える
実はあるときを境にAtomで上手く動作しなくなってしまったんですよね。そちらが使えるようになったのはよかったです。

###Atomとだいたい同じ
大元に使用されているものは同じですので、Atomで似たような感覚で触れました。
そのおかげもあったで簡単に移る気になりました。

もちろんGitなどにも対応しています。
AtomのKeymapが拡張機能で補完可能ですので、全てとはいかないまでも手間をかけずにある程度同じにできました。
インストールしているソフト（Gitとか）に応じて推奨拡張機能とかもサジェストしてくれるので、便利です。

###拡張機能のかゆいところに手が届くものが多い
これは単純にAtomに関する知見がなかっただけかもしれませんが、少し調べただけで「この機能ほしかったんだよ！」な機能が多数あって嬉しくなりました。


##今後使い込んでいきたい機能
・デバッグ機能
どういうことだってばよ状態ですので、追い追い詰めていきます。

・ソース管理
Git苦手マンとか言ってられないので、とりあえずひたすら勉強します。


##まとめ

以上、数時間触った感想でした。
高機能エディタ最高。速さは正義。
気になっている方はぜひお試しを。すぐに使えます。
これから使い込むのが楽しみです。
初心者が学習するSQL（SQLとはなんぞや？）  #pert1

# データベースとは
膨大なデータをひとまとめにしたもので、さらにそのデータを何らかのルールに基づいて整理・管理したもの。

# リレーショナルデータベース（RDB）とは
データをテーブルという表形式の構造で管理するデータベースのこと。
![Relational_model_concepts_Version_Japanese.png](https://qiita-image-store.s3.amazonaws.com/0/314973/d03dd0c6-dba4-b347-86c4-6c40554b6d70.png)

# SQLとは
SQL（Structured Query Language）とは、リレーショナルデータベース（RDB)を操作するためのデータベース言語。データベースに要求を出すことをクエリ（問い合わせ）という。このクエリの中身であるSQL文はユーザーが作成する場合と、ユーザーは簡単な操作を行うだけでソフトウェアが作成してくれるのものがある（railsでいうとActive　RecordがSQLを発行してくれる）。

SQLはデータベースやテーブルに対して様々な操作を行うが、その命令は大きく分けて２つ。
データを定義するDDL（DataDefinitionLanguage）、データを操作するDML（DataManipulationLanguage）がある。
次に記述するのが**SQLの基本構文**である。

### **DDLでできること**

|命令|機能|
|-------|--------|
|CREATE |データベースやテーブルの作成|
|ALTER  |データベースやテーブルの更新|
|DROP   |データベースやテーブルの削除|

### **DMLでできること**

|命令|機能|
|-------|--------|
|INSERT |データの登録|
|UPDATE |データの更新|
|DELETE |データの削除|
|SELECT |データの検索|
【WordPress】管理画面にメニューとサブメニューを追加、または削除（非表示）する


# 管理画面にメニューを追加

```functions.php
/**
 * 管理画面にメニューを追加
 *
 * 第1引数：メニューが選択されたとき、ページのタイトルタグに表示されるテキスト
 * 第2引数：メニューとして表示されるテキスト
 * 第3引数：メニューを表示するために必要な権限
 * 第4引数：メニューのスラッグ名
 * 第5引数：（任意）メニューページを表示する際に実行される関数
 * 第6引数：（任意）メニューのアイコンを示す URL
 * 第7引数：（任意）メニューが表示される位置
 */
function add_origin_menu_at_admin_view() {
    // メニューに「ニュース」を追加
    add_menu_page( 'ニュース', 'ニュース', 'edit_dashboard', 'edit.php?post_type=news', '', 'dashicons-admin-post', 5 );
}
add_action( 'admin_menu', 'add_origin_menu_at_admin_view' );
```

詳細は [関数リファレンス/add menu page - WordPress Codex 日本語版](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/add_menu_page)

# 管理画面にサブメニューを追加

```functions.php
/**
 * 管理画面にサブメニューを追加
 *
 * 第1引数：親メニューのスラッグ
 * 第2引数：サブメニューが選択されたとき、ページのタイトルタグに表示されるテキスト
 * 第3引数：サブメニューとして表示されるテキスト
 * 第4引数：サブメニューを表示するために必要な権限
 * 第5引数：サブメニューのスラッグ名
 * 第6引数：（任意）このページのコンテンツを出力するために呼び出される関数
 */
function add_origin_submenu_at_admin_view() {
    // サブメニュー「サブニュース」を「ニュース」に追加
    add_submenu_page( 'edit.php?post_type=news', 'サブニュース', 'サブニュース', 'edit_dashboard', 'edit.php?post_type=sub_news', '' );
}
add_action( 'admin_menu', 'add_origin_submenu_at_admin_view' );
```

詳細は [add_submenu_page() | Function | WordPress Developer Resources](https://developer.wordpress.org/reference/functions/add_submenu_page/)

# 管理画面のメニューを削除（非表示）
```functions.php
/**
 * 管理画面のメニューを削除（非表示）
 *
 * 第1引数：メニューのスラッグ
 */
function remove_menu_at_admin_view() {
    // 「投稿」を非表示
    remove_menu_page( 'edit.php' );
    // 例）カスタム投稿タイプ「ニュース」メニューを削除（非表示）
    remove_menu_page( 'edit.php?post_type=news' );
}
add_action( 'admin_menu', 'remove_menu_at_admin_view' );
```

詳細は [関数リファレンス/remove menu page - WordPress Codex 日本語版](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/remove_menu_page)


# 管理画面のサブメニューを削除（非表示）
```functions.php
/**
 * 管理画面のサブメニューを削除（非表示）
 *
 * 第1引数：親メニューのスラッグ
 * 第2引数：サブメニューのスラッグ
 */
function remove_submenu_at_admin_view() {
    // 例）カスタム投稿タイプ「お知らせ」の「新規投稿」を削除（非表示）
    remove_submenu_page( 'edit.php?post_type=info', 'post-new.php?post_type=info' );
}
add_action( 'admin_menu', 'remove_submenu_at_admin_view' );
```

詳細は [関数リファレンス/remove submenu page - WordPress Codex 日本語版](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/remove_submenu_page)

# おわり
- `add_submenu_page()`だけ日本語版Codexなかったので誰かかいて
C言語の中括弧の位置を一発で自分好みに修正するvimscript

#はじめに
突然ですが、皆さんはC言語での関数やforの中括弧、どこに書いてますか？

```c
int main(void){
	//関数の括弧のすぐに書く横派
}

int main(void)
{
	//改行した行頭に書く派
}
```

僕は上の括弧のすぐ横に書く派なのですが、学校で配布されるサンプルプログラムは改行した行頭に中括弧がついているのです。おまけにインデントが2tabだし、代入するときにイコールと変数の間にスペースを入れるし、~~GUIのemacs使ってるやつがほとんどだし、~~とことん僕と趣味が合わないのです。（穏やかな表現）
インデントの2tabはgg=Gで修正できますが、中括弧の位置は置換とかではどうにもなりません。
括弧の横に中括弧が無いと気が済まないので毎回半ギレで修正しています。
今回はvimscriptをかいてvimからコマンドで中括弧の位置を自動で修正できるようにしたいと思います。
#環境
```zsh
# uname -a                                                                                                                               
Linux kali 4.18.0-kali2-amd64 #1 SMP Debian 4.18.10-2kali1 (2018-10-09) x86_64 GNU/Linux
# nvim -v                                                                                                                                      
NVIM v0.3.4
```
今回は、neovimですが当然vimでも同じ要領で動きます。
#準備
##vimscriptを置くディレクトリを作成する
既にある人は飛ばしてください。
作成するところは適当なところで構いません。僕は~/.vimにmy_scriptというディレクトリで作成しました。

```zsh
# mkdir ~/.vim/my_script 
```
##ファイルを作成し、設定する
そうしたら、vimscriptを記述するファイルを適当に作成し、

```zsh
# touch ~/.vim/my_script/bracket.vim
```
vimを使っている人はvimrcにneovimを使っている人はinit.vimに以下の一文を追加します。

```vim
"source さっき作成したファイルのパス
source ~/.vim/my_script/bracket.vim
```

#プログラム
さっき作成したファイルに記述していきます。
まともなvimscriptを書くのは初めてなのでガバガバですが、一行ずつ確認していって行頭あるいは、複数の\tの後ろに中括弧（{）があったら、その行を削除し一つ前の行の末尾に中括弧を追加しています。
もしかしたら、中括弧の後にコメントを書く狂人がいるかもしれないので、その場合は行を削除せず、中括弧だけ消しています。

```vimscript:bracket.vim
"Fixがコマンド名。ここを書き換えれば、呼び出すコマンド名を変えられる。
command! Fix call Fix_bracket()

function! Fix_bracket()
	let index=0
	
	"全行を取得し配列に格納
	let line_list=getline(0,'$')
	
	for row in line_list
		"もし、rowの行頭に(tabを除く)｛があったら
		if row=~'^\t*{$'
			"該当する行を削除
			execute index+1."delete"
			let index-=1
			"該当する行の一つ前の行の末尾に｛を挿入
			call setline(index+1,getline(index+1)."{")
		elseif row=~'^\t*{.\+'
			let row=substitute(row,'{','','g')
			call setline(index+1,row)
			call setline(index,getline(index)."{")
		endif
		let index+=1
	endfor
	"ついでにオートインデントで2tabや4tabを8tab(自分が設定しているtabstop)に修正
	normal gg=G
endfunction

```
保存してvimで

```
:Fix
```

と実行すると、オートインデントされ、きれいに中括弧の位置が整えられます。

これが
>![Screenshot from 2019-03-15 00-30-53.png](https://qiita-image-store.s3.amazonaws.com/0/332794/43dab59c-ff59-dc36-3d6f-181a236ada6d.png)



こーなる
>![Screenshot from 2019-03-15 00-31-40.png](https://qiita-image-store.s3.amazonaws.com/0/332794/18bbedc9-d232-987b-7c74-52e117a2286e.png)


すっきり。（個人的に）
#最後に
初めてvimrc以外でvimscriptをさわりました。記法もそうですが正規表現の癖がすごいですね...(惨敗)
間違えていたり、こうしたほうがいいよという部分があればコメントお願いします。
#アレ？逆verは？
ねぇよそんな危険なもん。
Redmineでのコード表示に行番号を付加する（IE不可）

ViewCustomizePluginを使います。

* Redmine3.4, 4.0
* Chrome/Firefox/Edge

で動作確認しました。
IEでは動きませんでした…



Path pattern: `/.*`
Type: `JavaScript`

```javascript
$(function(){

  // Redmine 3.x
  //const highlightClass='.CodeRay';
  // Redmine 4.x
  const highlightClass = "[class$='syntaxhl']";

  let codeBlocks = document.querySelectorAll( highlightClass );

  let LINE_DELIM_EXP = /\n(?!$)/g;

  Array.prototype.forEach.call(codeBlocks,function( codeBlock ) {

    if (codeBlock.tagName != "CODE") { return; }

    // 行数取得
    let codeLines = codeBlock.innerHTML.split(LINE_DELIM_EXP);
    // 行の桁数
    let figures = String(codeLines.length).length;

    let newCode = '';

    Array.prototype.forEach.call(codeLines , function ( codeLine , index ) {

      // 行番号をつける
      let lineStr = (Array(figures).fill(' ').join('') + ( index + 1 ) ).slice( -1 * figures );
      let lineNumber = document.createElement("span");
      lineNumber.innerHTML = lineStr + ' ';
//      lineNumber.className = 'line-numbers';
      lineNumber.style = 'padding: 2px 4px 2px 4px; background-color: #eee; margin:0px 5px 0px 0px;';

      newCode += lineNumber.outerHTML;
      newCode += codeLine;
      newCode += '\n';
    });
    codeBlock.innerHTML = newCode;

  });
});
```
* 4行目/6行目はRedmineのバージョンに合わせてください。
* 昔のRedmineのソースでは、class="line-numbers"となっていましたが、今のRedmineのCSSには存在しないようなので、適当にstyleを書いています。


こんな感じになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/63464/fcd264e7-b772-16cd-e2ed-b9020ee00432.png)
【Laravel5.7】文面固定のテキストメールを送りたい

[メールのマニュアル](https://readouble.com/laravel/5.7/ja/mail.html)には、Mailableをextendsしたクラスを用意してBladeで書いたテンプレをviewで指定してデータをwithでカスタマイズして、とやたら面倒臭いことが書いてあります。

実際はSMTP送信するMailableが最初からデフォルトで用意されているので、それを使えばわざわざMailableを作る必要はありません。

```php
$params = ['foo'=>'bar', 'hoge'=>'fuga'];
$ret = Mail::send('emails.template', $params, function ($message) {
  $message
    ->to('送信先'))
    ->from('送信元')
    ->subject('件名');
});
```

これで、`.env`に書かれているMAIL_HOST、MAIL_USERNAME、MAIL_PASSWORDに従って[メールが送信されます](https://qiita.com/ubonsa/items/5514fb9c5d5783bcc758)。
複雑な処理を必要とするメールでもないかぎり、これで十分でしょう。

しかしテンプレとかいらない、ただ単に文面固定のテキストメールを送りたいだけなんだ、という要望にはこれでもまだオーバースペックです。
もっとこう、`Mail::from($from)->to($to)->title($title)->body($body)->send();`みたいなのはないのか？


# 答え

```php
$ret = Mail::raw('本文', function ($message) {
  $message->to('送信先'))->from('送信元')->subject('件名');
});

// もしくは
$ret = Mail::send(['raw'=>'本文'], function ($message) {
  $message->to('送信先'))->from('送信元')->subject('件名');
});
```

たったこれだけ調べるのにどんだけ苦労したと思ってるんだ！

メール送信の本文は`Illuminate\Mail\Mailer`あたりに[書かれている](https://github.com/illuminate/mail/blob/5.7/Mailer.php#L226)のですが、これがもうわけがわからない。

```php
    /**
     * @param  string|array|\Illuminate\Contracts\Mail\Mailable  $view
     * @param  array  $data
     * @param  \Closure|string  $callback
     * @return void
     */
    public function send($view, array $data = [], $callback = null)
    {
        if ($view instanceof MailableContract) {
            return $this->sendMailable($view);
        }

        [$view, $plain, $raw] = $this->parseView($view);

        $data['message'] = $message = $this->createMessage();

        call_user_func($callback, $message);

        $this->addContent($message, $view, $plain, $raw, $data);

        if (isset($this->to['address'])) {
            $this->setGlobalToAndRemoveCcAndBcc($message);
        }

        $swiftMessage = $message->getSwiftMessage();

        if ($this->shouldSendMessage($swiftMessage, $data)) {
            $this->sendSwiftMessage($swiftMessage);
            $this->dispatchSentEvent($message, $data);
        }
    }
```

これで`$view['raw']`に値があればプレーンテキストメール送信だと理解る人がどれだけ存在するのかと。
ソースを辿って[Swift_DependencyContainer](https://github.com/swiftmailer/swiftmailer/blob/master/lib/classes/Swift/DependencyContainer.php#L101)あたりに行き着いたところで、ソースから解読するのを諦めました。


# マニュアル

実はこの`Mail::raw`、公式マニュアルの[Laravel5.2版](https://readouble.com/laravel/5.2/ja/mail.html#sending-mail)には記載されていたのですが、[5.3で削除されています](https://readouble.com/laravel/5.3/ja/mail.html)。
なんで。

[英語の時点で消えてる](https://readouble.com/laravel/5.3/en/mail.html)ので、日本語訳の手抜きとかでもありません。
このような方法は推奨できない、必ずテンプレートを使え、ということでしょうか。
php-master-changes 2019-03-13

今日は構造体のアライメント調整、mbstring の Win32 版ビルドの修正、ドキュメントの更新、ビルドエラーの修正があった！

# 2019-03-13
## dstogov: Better data packing
- https://github.com/php/php-src/commit/824a9333987805cdaacc99589763a9f93b72633a
- [7.4~]
- GC 用の構造体 zend_gc_globals のフィールド順を変更
- アライメントの調整っぽい、多分 zend_bool が unsigned char なので 4 つ並んで 4 バイト、の次に 64 bit マシンの 8 バイトなポインタ来ると揃わなくて 4 バイトのパディング来そうとかそんなの

## weltling: Sync with ZEND_ENABLE_STATIC_TSRMLS_CACHE enablement in ext/mbstring
- https://github.com/php/php-src/commit/e10349152bafa359d69efcd4b3ab8e3db16e8004
- [7.4~]
- ext/mbstring で、Win32 版[でも](https://github.com/php/php-src/commit/0490a322490ecf19aa428d2790a95db7ac953e00) ZEND_ENABLE_STATIC_TSRMLS_CACHE を有効にするよう修正

## petk: [ci skip] Mention removed m4 macros
- https://github.com/php/php-src/commit/75023cf9a9ebb64894972d8384f9548cc8304d63
- [7.4~]
- UPGRADING.INTERNALS で、不要な削除された m4 マクロへの言及を追加

## petk: Fix duplicate symbols _zend_ce_weakrefs
- https://github.com/php/php-src/commit/50a6a0d819ed31b01d2d2dd10770442de580eaa7
- [7.4~]
- 弱参照の実装で、_zend_ce_weakrefs が extern 指定されていなかった問題の修正
- [PR:3939](https://github.com/php/php-src/pull/3939)
Basic data structure and Algorithms in Python

## 1. Unpacking Variables

```python
colors = ["red","green","blue"]
a,b,c = colors
print(a)
# red
```

## 2. Unpacking Group of Variables

```python
fruits = ["orange","apple","kiwi","strawberry","grape"]
a, *b, c = fruits
print(b)
# ["apple","kiwi","strawberry"]
```

## 3. Finding the Largest/Smallest N Items

```python
from heapq import nlargest, nsmallest
numbers = [1,2,3,4,5,6,7,8,9]
three_largest = nlargest(3,numbers)
print(three_largest)
# [7,8,9]
three_smallest = nsmallest(3,numbers)
print(three_smallest)
# [1,2,3]
```

## 4. The defaultdict

```python
d={}
print(d["a"])
# Error

from collections import defaultdict
d = defaultdict(list)
print(d["a"])
# []
```

## 5. Keeping the Dictionaries Order

```python
from collections import OrderedDict
d = OrderedDict()
d["a"] = 1
d["b"] = 2
d["c"] = 3
d["d"] = 4
for key in d:
    print(key,d[key])
# a 1
# b 2
# c 3
# d 4
```

## 6. Calculate with Dictionaries

```python
prices = {"orange":2.99,"apple":3.99,"kiwi":1.99,"melon":5.99}
min_price = min(zip(prices.keys(),prices.values()))
print(min_price)
# 1.99 "kiwi"
max_price = min(zip(prices.keys(),prices.values())
print(max_price)
# 5.99 "melon"
```

## 7. Finding Commonalities in Two Dictionaries

```python
foo = {"x":1,"y":2,"z":3}
bar = {"x":2,"y":3,"a":4}
print(foo.keys() & bar.keys())
# {"x","y"}
print(foo.keys() - b.keys())
# {"z"}
```

## 8. Store slice in Variables

```python
fruits = ["orange","apple","kiwi","strawberry","grape"]
a = slice(1,4)
sliced_fruits = fruits(a)
print(sliced_fruits)
# ["apple","kiwi","strawberry"]
```

## 9. Count the Items Appearance in a List

```python
from collections import Counter
numbers = [1,2,5,2,1,2,3,5,6]
numbers_count = Counter(numbers)
print(numbers_count)
# Counter({2: 3, 1: 2, 5: 2, 3: 1, 6: 1})
top_three = numbers_count.most_common(3)
print(top_three)
# [(2, 3), (1, 2), (5, 2)]
```

## 10. Extracting a Subset of a Dictionary

```python
prices = {"orange":2.99,"apple":3.99,"kiwi":1.99,"melon":5.99}
extracted = { key:value for key,value in prices.items() if value > 3 }
print(extracted)
# {'apple': 3.99, 'melon': 5.99}
```

## 11. Named Tuple Object

```python
from collections import namedtuple
Fruit = namedtuple("Fruit",["price","color"])
banana = Fruit("2.99","yellow")
print(banana)
# Fruit(price='2.99', color='yellow')
print(banana.price)
# 2.99
```

#12. Combining Multiple Mappings

```python
from collections import ChainMap
a = {"x":1,"y":2,"z":3}
b = {"x":2,"y":3,"j":4}
c = ChainMap(a,b)
print(c["x"])
# 1
print(c["y"])
# 2
print(c["j"])
# 4
```
Monacaで<audio>タグを使って音楽再生と正解・不正解の音を鳴らす

会社ブログからの転記記事です。

### Monacaとは

Monacaはウェブ上でスマートフォンアプリを作成できる、アプリ開発プラットフォームサービスです。
HTML5でiOS & Android 向けのアプリを同時開発できます。
https://ja.monaca.io/

### 料金

無料プランと有料プランがあります。

有料プラン
https://ja.monaca.io/pricing.html

無料プラン
https://ja.monaca.io/free-plan.html

### やってみた内容

<p><br />Monacaを使って、下記をやってみました。<br />クイズアプリなどを作るときに使えると思います。</p>
<ul>
<li>BGMを自動再生する</li>
<li>正解・不正解の音をボタンを押したときにならす</li>
</ul>
<p>ただし、Monacaの公式ドキュメントでは「HTML5の audio タグは、iOS端末では正常に動作しない可能性があります。」との事でした。<br />iphone7の実機で確認したところ再生できました。他機種について再生できるか不明ですので、実機で確認されるのが良いかと思います。</p>
<p>BGM,正解・不正解のmp3は、サイトからダウンロードして、wwwフォルダにアップロードしました。</p>

### Monaca設定等

<p>Monacaのテンプレート：最小限のテンプレート</p>
<p>BGM：<a href="http://www.hmix.net/music_gallery/music_top.htm" target="_blank" rel="noopener noreferrer">http://www.hmix.net/music_gallery/music_top.htm</a>の優しい・癒しの曲「Dear Childhood Friend」</p>
<p>正解音：<a href="https://soundeffect-lab.info/sound/anime/" target="_blank" rel="noopener noreferrer">https://soundeffect-lab.info/sound/anime/</a>の「ラッパのファンファーレ」</p>
<p>不正解音：<a href="https://soundeffect-lab.info/sound/anime/" target="_blank" rel="noopener noreferrer">https://soundeffect-lab.info/sound/anime/</a>の「運命2」</p>
<p>&nbsp;</p>
### ソース
```
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    <meta http-equiv="Content-Security-Policy" content="default-src * data: gap: content: https://ssl.gstatic.com; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'">
    <script src="components/loader.js"></script>
    <link rel="stylesheet" href="components/loader.css">
    <link rel="stylesheet" href="css/style.css">
    <script>
        // 参考：HTML5のaudio要素とJavaScriptで作るオーディオプレイヤー
        // https://mae.chab.in/archives/1975
        function playSound1(){
            audio = new Audio('trumpet1.mp3');
            audio.play();
        }
        function playSound2(){
            audio = new Audio('fate2.mp3');
            audio.play();
        }
    </script>
</head>
<body style="text-align: center">
    <!-- 
        <audio>タグ。背景ミュージック。autoplay=自動再生、loop=ループ再生 
        参考：https://developer.mozilla.org/ja/docs/Web/HTML/Element/audio#Attributes
    -->
    <audio src="n46.mp3" autoplay loop></audio>
    <!-- 開発中に再生の停止ボタンを表示する場合は、下記を使う -->
    <!-- <audio src="n46.mp3" autoplay loop controls></audio> -->

    <button onclick="playSound1()">正解</button>
    <button onclick="playSound2()">不正解</button>
</body>
</html>
```

### Monaca画面
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/109904/23290e79-a8ff-a0b2-d89c-89968067d72c.png)

### 参考リンク
<p>音楽の再生方法 | Monaca Docs<br /><a href="https://docs.monaca.io/ja/sampleapp/tips/media/" target="_blank" rel="noopener noreferrer">https://docs.monaca.io/ja/sampleapp/tips/media/</a></p>
背景色を元に文字色を白か黒どちらにすべきか判定

# コード

```swift
extension UIColor {
    
    var textColor: UIColor {
        let ciColor = CIColor(color: self)
        
        let red = ciColor.red * 255
        let green = ciColor.green * 255
        let blue = ciColor.blue * 255
        
        if (red * 0.299 + green * 0.587 + blue * 0.114) < 186 {
            return .white
        } else {
            return .black
        }
    }
}
```

# 解説
## 1. 色の数値を取得

今回は CIColor 経由で取得しました。
取得方法は様々あるのでお好きな方法でどうぞ。
https://qiita.com/yuki0n0/items/91cbbc000eb3b583905d

値は `0.0 ~ 1.0` なので、 `0 ~ 255` の値にするために `255` を掛けます。

## 2. 文字色を判定

```swift
(red * 0.299 + green * 0.587 + blue * 0.114) < 186
```

上記条件が `true` なら `白文字` 、 `false` なら `黒文字`


# 参考
- https://qiita.com/t_fujise/items/3346a54854bf3b1f5537
- https://stackoverflow.com/questions/3942878/how-to-decide-font-color-in-white-or-black-depending-on-background-color
- https://stackoverflow.com/questions/946544/good-text-foreground-color-for-a-given-background-color/946734#946734
UIColor から rgba を取得

各記事が乱立してるのと、`CIColor` 経由の記事があまり無いような気がしたので書きました。
他にも方法があれば教えてください。

# CIColor 経由で取得
やり方はいくつもありますが、おそらく一番手っ取り早い方法。

```swift
let color: UIColor = .red
let ciColor = CIColor(color: color)
ciColor.red   // 1.0
ciColor.green // 0.0
ciColor.blue  // 0.0
ciColor.alpha // 1.0
```

# CGColor 経由で取得

そんな大きな問題は無いのかもしれないけど、 `optional型` という面倒くささと、配列なので `fatal error: Index out of range` の恐れがなんとなくある。

```swift
let color: UIColor = .red        
color.cgColor.components![0]
color.cgColor.components![1]
color.cgColor.components![2]
color.cgColor.components![3]
```

# ポインタ 経由で取得

事前に変数を用意しなければいけないデメリット。

```swift
let color: UIColor = .red

var red: CGFloat = 0
var green: CGFloat = 0
var blue: CGFloat = 0
var alpha: CGFloat = 0

color.getRed(&red, green: &green, blue: &blue, alpha: &alpha)
print(red, green, blue, alpha)
```

# 環境

- Swift 4.2

# 参考
- https://developer.apple.com/documentation/coreimage/cicolor
- https://qiita.com/KikurageChan/items/e1c00c53364e6e3e423a
- https://studio.beatnix.co.jp/develop/swift/uicolor2rgb/
iPad でkaggleをしようとしたら躓いた時のメモ

タイトルの通りです

~~結論としては**「Google Colaboratoryを使え」**でした~~
結論としては**「jupyterサーバ立ててJUNOを使え」**でした


iPadでkaggleにアクセスすると・・・

- サインインはできます
- kernelもぼちぼち読めます
- 結果の提出もできます
- kernelのeditができませんでした

たぶんiPadのiframeが上手く表示されないのが原因だと思われます
safari、chrome、firefoxを試しましたがダメでした

iPadでGoogle Colaboratoryを使うと・・・
- 見るのはOKです
- 編集が凄くやり辛い・・・
- 文字がなかなか入力できない
- コピペしようにも、コピーのための選択ができない
- 他のアプリでコピーしても、ペーストがなかなかできない
- そもそもセルがなかなか選べない


androidタブレットなら特に問題なくできるのになぁ


参考

Google Colaboratoryでタブレット・スマホからプログラミングや機械学習ができるようになっていた話
https://qiita.com/koshian2/items/9a649b8b3141dd8a826c

Google Colaboratory で始める Kaggler 生活(データ入手と提出編)
https://qiita.com/fam_taro/items/eb9bae0b82248f9abd28

Google Colab上でKaggleのデータをロード、モデル訓練、提出の全てを行う
https://qiita.com/katsu1110/items/a8d508a1b6f07bd3a243
プログラミング学習記録26〜Railsの全体像を理解〜

##今日やったこと
- Progate Rails 1を徹底的にやる

今日はProgateのrailsを整理しながらじっくりやってみました。

今までは何回も繰り返すことで無理やり理解していましたが、今日は少しづつ確かめながら理解を深めることに専念しました。

少なくともProgateのrailsで１番重要なのは全体像を理解することだと思いました。

手書きの絵ですが、全体像をまとめてみました↓

![IMG_6622.JPG](https://qiita-image-store.s3.amazonaws.com/0/323324/576e8e61-9269-5790-90b6-0db6f883631b.jpeg)

新しくページを追加・編集する時にはルーティング、コントローラ、ビューの３つを最低でも確認する必要があるみたいです。

以下、自分用のメモです↓

###Railsで開発を進める時に最初に使うコマンド
`rails new アプリケーション名`

このコマンドを打ち込むとアプリケーション名と同名とフォルダが作成され、その中に必要なフォルダとファイルが用意されます。


###開発中のアプリケーションをブラウザ上で表示させるコマンド
`rails server`
もしくは
`rails s`


###トップページを作るコマンド
`rails generate controller home top`

Configフォルダの中のroutes.rbに「`get "URL" => "コントローラー名#アクション名”`」が書き込まれます。

Controllersフォルダの中にhome_controller.rbというファイルが作られ、ファイルの中にtopメソッドが追加されます。コントローラ内のメソッドを「アクション」と呼びます。

アクションはコントローラと同じ名前のビューフォルダから、アクションと同じ名前のHTMLファイルを探してブラウザに返します。


Viewsフォルダの中にhomeフォルダが作られ、その中にtop.html.erbファイルが作られます。

あと、stylesheetsフォルダにhome.cssが追加されます。
このhome.cssは特に何も記述しなくても、homeフォルダ内の全てのhtmlに適用されます。



###ページ作成に必要なもの
ビュー
コントローラ
ルーティング


####ビュー(View)とは？
ページの見た目を作るためのHTMLファイルのことです。
Railsではerbというrubyを含んだHTMLファイルを使います。


####コントローラとは？
ページを表示させる時に必要なものです。
Railsはコントローラを経由してビューをブラウザに返します。

####ルーティングとは？
送信されたURLに対して「どのコントローラの、どのアクション」で処理するかを決める「対応表」のことです。

ルーティングは「config/routes.rb」に定義され、右の図のように
「`get "URL" => "コントローラー名#アクション名"`」という文法で
書かれます。
これによって、ブラウザから「localhost:3000/home/top」というURLが
送信されたときに、homeコントローラーのtopアクションで処理されるようになります。

Ex)URLの部分を”/“に変えるとlocalhost:3000がトップページになります。
WKWebView で表示前に CSS を適用



WKWebView で表示したものをいじりたい場合、値を取得したい場合などは、以下で JavaScript を実行すればよいです。

https://developer.apple.com/documentation/webkit/wkwebview/1415017-evaluatejavascript

```swift
func evaluateJavaScript(_ javaScriptString: String, completionHandler: ((Any?, Error?) -> Void)? = nil)
```

ただ、上記の実行は、表示が完了してからでないとできません。
例えば、消したい要素がある場合、一瞬表示されてから消えることになります。

# 対応策

下記のようにすることで、上述の問題は発生しません。
例えば、消したい要素がある場合、最初から消されて表示されます。

```swift
let script = WKUserScript(source: "JavaScriptコード", injectionTime: .atDocumentEnd, forMainFrameOnly: true)

// 既に WKWebView インスタンス生成済み
webView.configuration.userContentController.addUserScript(script)

// WKWebView インスタンス生成時に適用
let controller = WKUserContentController()
controller.addUserScript(script)
let configuration = WKWebViewConfiguration()
configuration.userContentController = controller
let webView = WKWebView(frame: view.bounds, configuration: configuration)
```

`JavaScriptコード` 部分は各自でお願いします。
例えば下記のような感じです。

```javascript:JavaScript
var element = document.querySelector('.classname');
element.style['margin-top'] = '0';
```

# 参考
CSS の操作で、 `display: none;` にしたいだけであれば、 `WKContentRuleListStore` を使用したほうが良いのかなと思います。簡単ですし。

詳しくは下記の記事をご参考にどうぞ。
https://qiita.com/ShingoFukuyama/items/d9b7dd86a9a4bfdc6b22


# 環境
- Swift 4.2

# 参照
- https://teratail.com/questions/113681
- https://qiita.com/takecian/items/9baf7e2bd611aac4791d
An error occurred while installing mysql2 (0.4.10)

```
$ rails _5.0.1_ new hogehoge -d mysql
```
実行時

```
An error occurred while installing mysql2 (0.4.10)
```
ここでエラーが出るのは２度めなので書いておく

```
$ gem install mysql2 -v '0.4.10' --source 'https://rubygems.org/' -- --with-cppflags=-I/usr/local/opt/openssl/include --with-ldflags=-L/usr/local/opt/openssl/lib
$ cd hogehoge
$ bundle install
```
結論としてはCloud9使いたい
XCODE 実機Provisioning Profilesが問題ないのに「iPhone has denied the launch request」エラーの解決策

XCODE 実機Provisioning Profilesが問題ないのに「iPhone has denied the launch request」エラーの解決策

```
メニューのProduct▶Scheme▶Edit Scheme▶Executable▶Ask On Launch に変更するだけで解決
```
【iOS】ジオフェンスに21個以上regionを登録したい場合

## iOSのジオフェンスに21個以上登録したい
iOSのジオフェンス機能は同時に20箇所までしかモニタリングしてくれません（Androidは100箇所とか…）。21箇所以上は登録できないので、まずは近くの20件を登録しておいて、移動や時間が空いたタイミングで再度近隣の20件を登録するという方法を取る必要があります。
移動を検知して新しくregionを登録する際は、以前登録したregionを破棄する必要があります。
破棄する場合は

```objective_c
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
[[locationManager monitoredRegions] enumerateObjectsUsingBlock:^(__kindof CLRegion * _Nonnull region, BOOL * _Nonnull stop) {
    [locationManager stopMonitoringForRegion:region];
}];
```
ですべて削除可能です。
ジオフェンスをすべて削除したあとにジオフェンスを新規に登録すればOK

## 再度ジオフェンスにregionを登録するタイミング

ジオフェンスに登録するタイミングですが、アプリがバックグラウンドに入ってしまってからの話なので次のタイミングがいいかと思っています。
1. [Significant-Change Location](https://developer.apple.com/documentation/corelocation/getting_the_user_s_location/using_the_significant-change_location_service?language=objc)
2. ジオフェンスに入った・出たタイミング

①の場合はジオフェンス登録箇所が少なく、それぞれのregionがバラバラな場合
②の場合はregionがある程度密集している場合
に適しているのではないかと思います。

## ジオフェンスの登録に失敗...
上記方法で、ジオフェンスを登録→削除→登録とすると[monitoringDidFailForRegion](https://developer.apple.com/documentation/corelocation/cllocationmanagerdelegate/1423720-locationmanager?language=objc)が呼ばれ
`Error Domain=kCLErrorDomain Code=5 "(null)"`
という結果が返ってきてしまいました。このエラー内容からは実際には何が原因でエラーが発生しているかはわからないのですが、調べると21箇所以上登録した際に発生することが多いようです。
ただ今回の場合はしっかりregionを全部削除してから登録しているので問題がないはず…

しかしregionの削除コードで以下を試してみたところ…

```objective_c
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
[[locationManager monitoredRegions] enumerateObjectsUsingBlock:^(__kindof CLRegion * _Nonnull region, BOOL * _Nonnull stop) {
    [locationManager stopMonitoringForRegion:region];
}];
// 同じコードの繰り返し
CLLocationManager *locationManager = [[CLLocationManager alloc] init];
[[locationManager monitoredRegions] enumerateObjectsUsingBlock:^(__kindof CLRegion * _Nonnull region, BOOL * _Nonnull stop) {
    [locationManager stopMonitoringForRegion:region]; // 呼ばれないと思っていたら呼ばれることがある
}];
```

全削除の直後に削除コードを呼び出しても登録済みのregionが取得できてしまいました。そしてこれは取得できたりできなかったり。

ここからは推測でしかないんですが
[Location Manager stopMonitoringForRegion Not Working](https://stackoverflow.com/questions/21608956/location-manager-stopmonitoringforregion-not-working)
このstackoverflowの投稿を見ると同じ現象に遭遇している人が多いみたいです。推測するにregionの削除は同期的に行われるわけではなく、どこかのキューに入れられて随時削除されていくという方法が取られているようです。

必ず登録に成功させたい場合の一つのやり方として[monitoringDidFailForRegion](https://developer.apple.com/documentation/corelocation/cllocationmanagerdelegate/1423720-locationmanager?language=objc)の中で失敗したregionを再登録する方法があります。

```objc
-(void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error {
    [_locationManager startMonitoringForRegion:region];
}
```
ただこのコードに１点問題があって、21箇所以上ジオフェンスのregionを登録しようとすると無限ループすることになってしまいます。
間違いなく20箇所以下しか登録しないと保証できればこれで間違いなく登録できるはずです。

現状そこまで失敗する確率が高くなく、いくつかのタイミングでジオフェンスを登録できるようにしているため現状では失敗時に再登録処理はしないつもりです。他に良い方法があれば教えていただきたいですm(_ _)m
WordPressの/wp-json/ へのアクセスはどうしていますか？

# WordPressのREST API
WordPress v4.7以降（だったと思います）にはREST APIが搭載されており、デフォルトで有効になってます。自社（自分）のサイトをWordPressを使って構築しているのなら、`https://YourSiteURL/wp-json/`でアクセスしてみてください。（インストールしているディレクトリがドキュメントルートではないなら、`https://YourSiteURL/hoge/wp-json/`の場合もあります）

**何か表示されましたか？もしかしたら、このようなJSONが表示されていませんか？**（この画面ショットではJSONを整形して表示してます）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/77333/60ba2f01-1e61-8f17-9e3a-991330ced737.png)

こうなったら注意が必要です。:warning:

# 認証が不要なendpointがある
WordPressはAPIを使っていろいろな情報を取得できたり更新できるようになっています。この中で認証不要なendpointがあります。例えば、ユーザー情報の取得とかは認証不要です。
こんなURLでアクセスしてみましょう。

```
https://YourSiteURL/wp-json/wp/v2/users/1
```
あら不思議。**管理者のアカウントが表示されていませんか？:skull_crossbones:** 
WordPressインストール時に作成したユーザーをそのまま管理者として利用していることが多いと思います。そのようなケースでは、管理者のアカウントが表示されてしまいます。

複数ユーザーが登録されている場合は、1を2,3,4と変更してアクセスするとユーザー情報が次々と表示されます。

このような意図しない情報公開により、こんなこともあるかと思います。

- **WordPressの運用を制作会社に業務委託しており、その制作会社名が表示されている**
- **運用担当者の実名が公開されている**

WordPressの便利APIの存在を知らないと、管理者アカウント情報をWEB上で公開することになります。さすがに`/wp-admin/`に対するアクセスを、何の制限も設けていないずぼらな運用担当はいないと思うので、すぐに何かをされてしまうことはないと思います。**（もし/wp-admin/への制限をつけてないならすぐにやりましょう！）**
しかし管理者アカウントが外部に漏れたりしたらどこでなにがあるかわかりません。また担当している側にしてみたら、自分の名前が意図していないところで公開されているのは気持ちいいものではありません。

# REST APIの塞ぎ方
ではAPIにアクセスさせないようにするにはどうすればよいでしょうか？プラグインを探せばありますが、信用できるプラグインでしょうか？
信用できないプラグインなら、コードを書きましょう。
私は@TanakanoAnchanさんの記事を参考にさせていただきました。

- [WordPressのREST API周りのfilter hook / action hook のまとめと、一部のREST APIを開放する方法](https://qiita.com/TanakanoAnchan/items/f4fc11f66e9cf2d7490e) :arrow_right:

# 他にもあるよ
APIだけではなく、このようなURLにもWordPressは応答を返してくれます！親切？

+ /feed/
+ /rss/
+ /robots.txt

見られて問題無い情報であればよいのですが、そうでないならすぐに塞ぐようにしましょう。大抵のことは検索すればでできます。

# 最後に
意外とAPIのことを知らない人が多いと思いましたので、ここに投稿させていただきました。少しでも、`/wp-json/`にアクセスできるWordPressがなくなりますように:star:（意図して公開しているサイトを除く）
IM-FormaDesigner / IM-BISで先頭空白行ありセレクトボックス ドリルダウン処理実装

## 前提
- intra-mart Accel Platform 
- IM-BIS導入環境
- IM-BIS / IM-FormaDesiner

## 参考資料
- [IM-BISで複数のセレクトボックスを連動させて利用する方法](https://dev.intra-mart.jp/cookbook111261/)
- 上記を参考にドリルダウン処理を実装した

## やりたいこと
- 会社 ＞ 組織1階層目 ＞ 組織2階層目  組織階層で絞り込むUI
![ドリルダウンサンプル.gif](https://qiita-image-store.s3.amazonaws.com/0/22172/5c087653-ec7d-34d3-8db3-502dd40bab28.gif)
    - こんな具合の動作にしたい
    - 組織を選択しない、組織未所属もありうるので空白行も選びたい

## サンプルファイル
- サンプルファイルをアップロードしたので参考にどうぞ<br>
[Forma アプリケーション定義 データソース定義のエクスポートファイル](https://doriburu.github.io/%E3%83%89%E3%83%AA%E3%83%AB%E3%83%80%E3%82%A6%E3%83%B3%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB.zip
)
- intra-martのサンプルがインストールされている環境だとキレイに出るはず
- 2018summerで作ったのでそれより前のバージョンだとインポートエラーになるかも

## ポイント
1. 初期表示イベント設定。各セレクトボックスに外部連携設定
登録データ編集時、参照時の初期表示時に登録データが表示されるようにするために設定している。
![初期表示イベント設定.PNG](https://qiita-image-store.s3.amazonaws.com/0/22172/3fd0958a-8f59-74e9-ceae-4599b7e089c5.png)


1. アイテムイベント設定。会社セレクトボックスと組織階層１セレクトボックス入力イベント設定
![アイテムイベント設定.PNG](https://qiita-image-store.s3.amazonaws.com/0/22172/a7bb8e42-5768-cd41-1032-f915ceae4c23.png)
![組織階層１アクション設定.PNG](https://qiita-image-store.s3.amazonaws.com/0/22172/041a3064-41b8-ab47-816c-21d8b6565869.png)

    入力イベントで下位組織セレクトボックスをクリアしてから外部連携でセレクトボックスを設定する。
    下位組織セレクトボックスをクリアするスクリプトは下記のとおり

``` javascript:組織階層1セレクトボックス入力_カスタムスクリプト.js
// 組織階層1セレクトボックス入力 カスタムスクリプト
// フィールド識別IDを指定
var input_id = "dep2_selectbox";
var args = {};
// Option項目設定
args.master = {};
args.master[input_id] = [];
// 空行設定
var emprow = {};
emprow["value_" + input_id] = "";
emprow["key_" + input_id] = "";
args.master[input_id].push(emprow);
// master変更時の初期値クリア
$('[name="escape_'+ input_id + '"]').val("");
// 選択値設定
args.data = {};
args.data[input_id] = "";

formaItems.product_80_selectbox.setItemData[input_id](args);
```

## 試行錯誤の経緯
1. セレクトボックス先頭に空白行を挿入したところ問題発生
    - 空白行選択時に下位組織セレクトボックス内容がそのままになる
    - 回避方法検討
    変更時に下位のセレクトボックス内容をすべてクリアすることで対応できるはず
1. カスタムスクリプトでセレクトボックスクリア処理をやろうとするが分からない
    クリア処理調査＆実装する
    調査した結果が下記の記事になる<br>
    [IM-FormaDesigner / IM-BIS セレクトボックス Option値をAPIで設定する](https://qiita.com/doriburu/items/639e7104ac33911c0e1c)
1. 軽く動作させると謎の動きをするので直す
    - 再現手順を下記に示す
        1. 登録ボタン後、修正時発生
        1. 階層1を空白にすると階層2も空白になる
        1. 階層1を元の値にすると階層2も元の値になる
            階層2は空白であってほしい
    - 修正方法の検討
        1. 元の値をどこかに保持しているっぽいのでhtmlを捜索
        1. escape_%フィールド識別ID% というnameのhidden発見
        1. こいつをクリアすると元に戻らないことを確認したので、適時クリアする
        1. formaのソースを確認すると初期表示時に選択値に設定するためのもので、これが暴発しているよう
        初期表示以外には使わないのでクリアして問題なしと判断

1. 上記調査結果を組み合わせてintra-martサンプル導入環境で動作するサンプル作成

## 愚痴
簡単かと思ったら妙に大変。なぜ空白行選択時に外部連携データが更新されないのだ。。。<br>
やはり下記の記事のとおりの大変さである<br>

[IM-FormaDesigner／IM-BISでのアプリケーション作成工数は限定条件下でしか低コストにならない](https://qiita.com/doriburu/items/47af1f8f743b35789839)

本当はグリッドテーブルでドリルダウンサンプルを作る記事を書きたくて、その前段階としてこの記事のサンプルを用意したのだけど、思った以上の面倒くささだった。。。
グリッドテーブルはもっと酷くなる。ツライ
CakePHP3 - モデルのないフォームでカスタムバリデーションを使用する

公式Cookbook
[バリデーション](https://book.cakephp.org/3.0/ja/core-libraries/validation.html)

###カスタムフォームを作成する
ここではmaxAmountというメソッドを定義して、$validatorに追加

```php
class CustomForm extends Form
{
    protected function _buildSchema(Schema $schema)
    {
        return $schema
            ->addField('amount', ['type' => 'integer'])
    }

    protected function _buildValidator(Validator $validator)
    {
        $validator
            ->integer('amount')
            ->greaterThan('amount', 0, __('金額を入力してください'))
            ->naturalNumber('amount', true, __('整数を入力してください'))
            ->add('amount', 'custom', [
                'rule' => [$this, 'maxAmount'],
                'message' => __('金額の上限を超えています')
            ]);

        return $validator;
    }

    protected function _execute(array $data)
    {
        return true;
    }

    
    public function maxAmount($check, array $context)
    {
        if ($check > $context['providers']['hoge']['balance']) {
            return false;
        }

        return true;
    }
}
```

### コントローラでバリデーションをする

カスタムフォームに定義したバリデーションメソッドの引数の$contextにバリデーションで使用する値を設定できる。

```php

if ($this->request->is(['post'])) {
    $form = new CustomForm();
    $form->getValidator('default')->setProvider('hoge', ['balance' => 10000]);
    if ($form->validate($this->request->getData())) {
        // ok
    } else {
        // ng
    }
}
```
シェルスクリプトで配列を作る方法

# はじめに
シェルスクリプトをゴリゴリ書く機会はそれほど多くないので、シェルスクリプトで配列を作る方法を備忘録としてサクッとまとめてみました。

シェルスクリプトで配列を操作する方法も併記しているので、この記事を読んだ方にチートシートとして使って頂けると幸いです。


# 要素を1つずつ追加して配列を作る

* `変数名[要素番号]`とすることで、配列を作ることができます。
* 添え字の番号は0からスタートしなくても正常に動作します。
 * いきなり`array[3]=8`としても、ArrayIndexOutOfBoundsException的なエラーになりません。
* `${配列名[@]}`と入力すると、配列の中身を一括して参照できます。

```shell
[root@kumotori ~]# array[0]=0
[root@kumotori ~]# array[1]=2
[root@kumotori ~]# array[2]=4
[root@kumotori ~]# array[3]=8
[root@kumotori ~]# array[4]=16
[root@kumotori ~]# echo ${array[@]}
0 2 4 8 16
```

# 初期値を指定して配列を作る

* 丸カッコ内に半角スペース区切りで値を入力することで、簡単に配列を生成することができます。
* 私は静的に配列を作ることが多いので、この方法で配列を生成することが多いです。
* `${配列名[@]}`をfor文に渡すと、配列の中身を一つずつ取得して処理できます。
 * Javaの拡張for文と似た構文でスッキリしているので、添え字が要らない時はこの書き方が良さそう。

```shell:array1.sh
#!/bin/bash

langs=("c#" "java" "sql" "ruby")

for lang in ${langs[@]}; do
  echo $lang
done
```

```:array1.shの実行結果
[root@kumotori scripts]# ./array1.sh 
c#
java
sql
ruby
```

# ブレース展開を利用して配列を作る

* `{始まりの数..終わりの数}`とすることで、開始値と終了値を指定して配列を作ることができます。
* この方法はブレース展開と呼ばれますが、中カッコ（brace）で囲まれていることが名前の由来だと思います。

```shell:array2.sh
#!/bin/bash

for i in {1..5}; do
  echo "${i}番目"
done
```

```shell:array2.shの実行結果
[root@kumotori scripts]# ./array2.sh 
1番目
2番目
3番目
4番目
5番目
```
Docker on HDP

参考資料：
https://docs.hortonworks.com/HDPDocuments/HDP3/HDP-3.1.0/data-operating-system/content/run_docker_containers_on_yarn.html

Docker install Shell file:

```
#!/usr/bin/env bash

sudo yum check-update

curl -fsSL https://get.docker.com/ | sh

sudo systemctl start docker
sudo systemctl status docker

sudo systemctl enable docker


docker info
docker run hello-world

echo " === docker install finished === "
```

Docker EEより、Docker CE(Community Edition)が良い。

# Docker設定
/etc/docker/daemon.json

```json

{
       "live-restore" : true,
       "debug" : true
}
```

```bash
sudo vi /usr/lib/systemd/system/docker.service
```

Add `--exec-opt native.cgroupdriver=cgroupfs `

```
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 
--->
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=cgroupfs

```
多階層セレクトボックスを作ってみた

#実現したいこと
セレクトボックスでグループを選択すると、そのグループに所属する人をさらに選択できるようにしたい。
ファイルの階層構造をイメージして下さい。

#出来上がったもの

<p class="codepen" data-height="265" data-theme-id="0" data-default-tab="js,result" data-user="exchange-wata" data-slug-hash="ZPvdVz" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" data-pen-title="multi-layers selectbox">
  <span>See the Pen <a href="https://codepen.io/exchange-wata/pen/ZPvdVz/">
  multi-layers selectbox</a> by Mizuki (<a href="https://codepen.io/exchange-wata">@exchange-wata</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>


#終わりに
表示させるスペースの関係で、はじめに表示されるセレクトボックスの下に別のセレクトボックスを表示、ということができなかったので、何か方法は、と考えた結果です。
もう少しシンプルで短いjsのコードが書きたかったなあ。。。

一応、こちらも置いておく。→[GitHub](https://github.com/exchange-wata/CodePen-selectbox)
AndroidのPinView所感

- https://github.com/aritraroy/PinLockView
  - Lock画面とセットなのでPinViewがほしい気持ちにはあっていない
- https://github.com/DavidPizarro/PinView
  - Viewだけ出してくれるのでよさげなのだが、一旦入力してからの修正が使いづらい。一文字ずつ戻れないし、全クリアもできない
- https://github.com/ChaosLeong/PinView
  - gradleでしんでしまい導入に手間がかかりそうなので見送り
- https://github.com/GoodieBag/Pinview
  - 下線があるだけのViewへの切り替えはできないが入力はしやすい
3.3GBのCSVをpushしちゃってbitbucketの2.0GB制限をぶち破いた

# 3.3GBのCSVをpushしちゃってbitbucketの2.0GB制限をぶち破いた

##敗因
- Ploom Sを買って浮かれてた　ごめんなさい
- gitignoreにテスト用のCSVのパスを追加するの忘れてた

~~Bitbucketにリポジトリ制限あるの知らなかったよ…~~


深呼吸して同期に聞いた

<h3>同期「手が震えると思うけどforce pushをするんだ」

##手順
まずバックアップとります
僕は一度もバックアップとってなかったので

```
$ cp -a app_dir/ bk_app_dir/
```
ちゃんとバックアップとろうね

そしてgit resetを行う

```
$ git reset --hard 戻したいところまでのリビジョン番号
```

リビジョン番号の調べ方よくわかんなかったから
$ git log でcommit番号メモって

```
$ git reset --hard 戻したいcommit番号
```
で戻しました

戻したら、強制する必要があるので、git push --force

###同期「手が震えると思うけどforce pushをするんだ」

```
$ git push -force orign master
```

でーーーきた
あとはなんかいろんな記事みてたら$ git gcするとgitリポジトリが軽くなる
ただ今回は自分のミスなんでいいかな

####まとめ
嬉しいことあってもgitignoreを確認しよう