OmniAICreator/Qiita-1.07M huggingface dataset:
DayOne v2.9.1 がアレだったので Quiver に移行したはなし

# TL;DR
- DayOne もうつらい、移行先は [Quiver](http://happenapps.com/)
- Quiver はデータフォーマットが公開されていて、それが直感に近いものになっている
- iOS アプリもあって、Dropbox 経由でも同期可能
- 移行ツールつくった [Releases · isann/dayone-to-quiver](https://github.com/isann/dayone-to-quiver/releases)


# ことのはじまり
DayOne に技術的なメモをしている人がそれほどいるとは思えないが、自分がそうだった。
そしてアップデートがあったのでなにも考えずに DayOne v2.9.1 にアップデートした。
いままでもアップデートのたびに WYSIWYG っぽいみためになって、それは自分の理想としているエディタではなかったが、慣れの問題だと思って使ってきた。
しかし今回は個人的に引き返せないレベルだった。

たとえば次のようにコードブロックの開始を書くとそれだけでコードブロックがエディタ上にできる。
これが気持ち悪い。

![demo2.gif](https://qiita-image-store.s3.amazonaws.com/0/34022/f33193d7-7d0d-2be2-0c2e-84c31245cc61.gif)

また編集モードとプレビューモードが、以前は Command ＋ Enter で編集モードの切り替わっていたのに、いまはマウスで左クリックして文字選択しようとしたら編集モードになる。
UI 上いまどっちのモードなのかわからないので非常につかいにくい。

これを後方互換なく、設定で変更できないことがもう嫌で仕方ない。

なので、移行を考え始めたら azu さんの記事をみつけた。
[メモアプリをDayOneからQuiverに移行した | Web Scratch](https://efcl.info/2016/02/03/quiver/)

Quiver、トライアルもあり使ってみたところかなりよかった。
Bear もいいなと思ったけど、同期するのに課金かきんですし、コードブロックのプレビューが気持ち悪い。
色使いとかレイアウトはいいんだけど。。。
というわけで、Quiver を移行先にする。

# Quiver のいいところ
データフォーマットが公開されている。
[Quiver Data Format · HappenApps/Quiver Wiki](https://github.com/HappenApps/Quiver/wiki/Quiver-Data-Format)
これがあると移行してきやすいし、いざというときに移行しやすい（移行先が import できるフォーマットあれば・・・だけど）。

そして、流行りのサブスクライブではなく買い切り。

DayOne の移行スクリプト azu さんがつくってくれている。

iOS アプリもあって、Dropbox 経由で同期可能。
（DayOne は最近 Windows 版だすみたいですね。）

などなど。

# Quiver 移行ツールつくる
でも、 DayOne v2 には対応していなかった。
なのでつくりました。
思ったよりもかんたんでした。

DayOne v2 は、 エクスポートで json を選択できるので json で出力。
データをながめているとなんとなくルールがわかる。

`dayone-moment://xxx` は画像リンクで、画像は photos に `xxx = uuid` としてマッピングされており、 `md5` が実ファイルとマッピングされている。

なのでこのへんを Quiver フォーマットみながらさくっと記述すれば移行ツールかんたんにできます。

ちゃんと動くかわかりませんが [Releases · isann/dayone-to-quiver](https://github.com/isann/dayone-to-quiver/releases) に実行バイナリおいています。

```bash
./dayone-to-quiver -i "~/Desktop/exporttech/tech.json" -o "/tmp/dayone.qvnotebook"
```

↑
こんなコマンドで移行できると思います。

タグがうまく表示されていないことだけは謎ですが。
【小ネタ】Androidビルドでfirebase-core:16.0.5を使うとエラー (2018/11/10)

# はじめに

未来には解決しているかもしれませんが
本日2018年11月10日、軽い気持ちでAndroidのFirebaseバージョンを最新版にあげたらビルドエラーになりました。

``` app.gradle
:

dependencies {
:
    //Firebase
    implementation 'com.google.firebase:firebase-core:16.0.5'
    implementation 'com.google.firebase:firebase-ads:17.1.0'
    implementation 'com.google.firebase:firebase-auth:16.0.5'
    implementation 'com.google.firebase:firebase-config:16.1.0'
:
```

<img width="1280" alt="スクリーンショット 2018-11-10 12.21.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/19692/b8ea00d9-d1b4-f54d-9304-d540f1359878.png">

# 解決編

まずログ確認。

`Program type already present: com.google.android.gms.internal.measurement.zzdz` というエラー。
依存関係ぽいので以下コマンドで依存関係を確認。

```
$ ./gradlew :app:dependencies > dependencies.txt
```

たしかにmeasurement関連で依存問題起きているっぽいのですが解決せず。

```
com.google.android.gms:play-services-measurement-base:[16.0.4] -> 16.0.4
:
com.google.android.gms:play-services-measurement-base:[16.0.3] -> 16.0.4
```

Webサイトで最新バージョンを確認しました。

Firebase Android Release Notes
https://firebase.google.com/support/release-notes/android#latest_sdk_versions

<img width="746" alt="スクリーンショット 2018-11-10 11.36.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/19692/85c03b1f-575d-e90c-8aec-46d1bc55e4b5.png">

firebase-coreの最新版は16.0.5でなく16.0.4！
16.0.4にバージョンダウンしたらビルドエラーはなくなりました。

# 教訓
- AndroidStudioの警告に従っても最新版バージョンが合わないことがある
- ライブラリはリリースノートでバージョン確認する
- ライブラリのバージョンがわかるものをコメントに書くと良い

<img width="580" alt="スクリーンショット 2018-11-10 12.25.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/19692/50d7efe0-5496-0b5c-b8bc-ebd6d781c614.png">
初心者エンジニア 働くうえでのPull Requestのルール

## 働くうえでのPull Requestのルール
僕がインターンでプルリクをする際に気をつけていることです。

1. タイトルは『ブランチ名 要約』とする
2. ディスクリプションの記述を忘れない
3. ディレクトリ階層のルールを忘れない
4. コメントアウトや不要なコードはコミットしない
（必要であればその旨を記載すればOK）
5. 対象のコードと関係のないファイルは変更しない
6. レビューでコメントを受けた内容で同様の箇所がないか確認する
7. レビュー依頼時にPUSHし忘れていないか、最新の状態になっているかを確認する
8. コメントの返信を忘れない
RubyでTCP通信 on windows

# RubyでTCPサーバー/クライアントを作ってみる

サンプルをコピペしただけだと上手く動かないor微妙な点がいくつかあったので備忘録です。

## サーバー

```rb
# server
require 'socket'
# 3030番ポートを開く
gs = TCPServer.open(nil, 3030)
socks = [gs]

puts "server is on #{gs.addr}"

loop {
  nsock = select(socks)
  next unless nsock[0]
  nsock[0].each do |s|
    if s == gs
      ns = s.accept
      socks.unshift ns
      puts "#{ns} is accept"
    else
      if s.eof?
        puts "#{s} is gone."
        s.close
        socks.delete(s)
      else
        msg = s.readpartial(4 * 1024)
        p msg
      end
      break
    end
  end
}
```

## クライアント

```rb
# client
require 'socket'

s = TCPSocket.open("localhost", 3030)
while msg = gets
  puts "write #{msg}"
  s.write msg
end
```

## 仕様を変更した点
- サーバー側の通信読み込み部分を`s.gets`から`s.readpartial`へ変更  
文字列ならばいいのかもしれないが、今後バイト列を書き込み/読み込みを考えると`gets`ではダメな可能性がある。
- サーバー側の`accept`時に`socks.push`ではなく`socks.unshift`を用い`TCPServer`ソケットの優先度を下げた
- select後TCPSocketに対して通信を行ったあとはbreakで再度`select`へ移行するようにした。  
上２つはwindows特有のバグなのかは分かりませんが、`readpartial`時に指定した以上の長さの通信がある場合  
次回の`select`で、どういうわけか`TCPServer`が読み込み待ちになるバグへの対処です。

## 反省
`s.nread`でブロックなしに読み取れるバイト数が取れるのでコレを使うといいかもしれない。
但し、タイミング次第でやはりselectのバグ？を踏むと思われるので待ち行列の優先度等については考慮する必要がある。
csv


```ruby

require 'csv'

CSV.open("sample.csv") do |csv|
 csv.each do |row|
  p row[0]
  p row[2]
 end
end

結果

"abc"
"ede"
"123"
"234"
"asadas"
"dsds"
```


```ruby

require 'csv'

CSV.open("sample.csv") do |csv|
 csv.each do |row|
  p row
 end
end

結果

["abc", "def", "ede"]
["123", "234", "234", "22"]
["asadas", nil, "dsds", nil, nil]

```


```ruby

require 'csv'

CSV.open("samplesample.csv", "w") do |row|
 row << ["asd", "sds", "ssss"]
 row << ["see","sss", "sdd"]
end


結果

asd,sds,ssss
see,sss,sdd

rowは一行一行

```
rails5 非同期通信

## ajaxの場がれ

## remote:true
指定のアドレスにアクセス

```ruby:ajax.controller

class AjaxController < ApplicationController
  def index

  end

  def data
    @ajax_data = User.find 1
  end
end


```


```ruby:index.html.erb

対象を設置
id ="name"

id = "mail"

actionはアクションを指定
<%=link_to 'linkby Ajax',{action:'data'},remote:true %>

```

```ruby:routes
  get 'ajax/data'

```

```ruby:data.js.erb

$('#id').text('<%=@ajax_data.id%>')
$('#name').text('<%=@ajax_data.name%>')
$('#mail').text('<%=@ajax_data.mail%>')


```
【Eclipse】(L)ubuntuのEclipseでGitのパスワードが保存できない

# INDEX
- 概要
- 環境
- やったこと
- まとめ

# 概要
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">LubuntuのEclipseでGitHub連携しようとして苦労した。この画面のエラーメッセージや.metadataのログからどれだけの人が正解にいけるんだろう。<a href="https://twitter.com/hashtag/%E7%A4%BE%E7%95%9C%E3%81%A1%E3%82%83%E3%82%93%E5%8F%B0%E8%A9%9E%E3%83%A1%E3%83%BC%E3%82%AB%E3%83%BC?src=hash&amp;ref_src=twsrc%5Etfw">#社畜ちゃん台詞メーカー</a> <a href="https://t.co/rHdsYHelTL">https://t.co/rHdsYHelTL</a> <a href="https://t.co/Ouft0DCa0d">pic.twitter.com/Ouft0DCa0d</a></p>&mdash; まあにい (@mahny_b) <a href="https://twitter.com/mahny_b/status/1061091478850613248?ref_src=twsrc%5Etfw">2018年11月10日</a></blockquote>

…という事で、一日ハマってたので解決策を備忘録として残しておきます。
解決策だけ知りたい場合は、[まとめ](#まとめ)にジャンプだ。

# 環境
- Lubuntu 18.0.1 LTS（VirtualBox）
- Oracle JDK 1.8.0_192
- Eclipse SimRel 2018-09（Java EE版）
    - EGit4.6

# やったこと
失敗した事も含めて右往左往した記録です。
基本的には、「ググる → 検証」の繰り返しです。

## Eclipseの設定から、セキュアストレージ→Gitの設定を消せ！（失敗）
- 検索キーワード
    - 「Eclipse Git パスワード 保存できない」等
- 国内サイトで探すとだいたいこれがヒットするが解決には至らず

## セキュアストレージの設定ファイルを直接消せ！（失敗）
- 検索キーワード
    - 「Eclipse Git パスワード 保存できない」等
- 国内サイトで（ｒｙ

## OSのセキュリティ設定を使わないようにしたらどうだ？（成功）
- こんだけ探して無いならみんな引っかかっていないんだろうな…って事で公式ドキュメント（英語）に特攻
    - 公式ドキュメント
        - https://www.eclipse.org/documentation/
    - SimRel 2018-09版は502エラーで見えない…（2018/11/08時点）
    - しょうがないのでPhoton版で調べる
        - https://help.eclipse.org/photon/topic/org.eclipse.platform.doc.user/reference/ref-securestorage-start.htm
- ブレスト1
    - What encryption is used?
        - JavaVM毎に暗号方式が違うとかなんとか。何だろうこれ？
    - How do I change a password?
        - だからこっから変更できねーって言ってんだろうが！
    - Lost secure storage password or invalid secure storage password
        - ここまでたどり着けていないです。
    - If all else fails
        - だから消してんだけど保存できねーって言ってんだろうが！！
- ブレスト2
    - WindowsではならなかったんだからLinuxと「What encryption is used?」だろうなあ
        - 何となく画面確認
        - ![image.png](https://qiita-image-store.s3.amazonaws.com/0/92447/ddd3afc9-b264-4f2b-0c54-3fb2bb0a3a78.png)
        - マーカー部分の説明（Google翻訳）
        - ![image.png](https://qiita-image-store.s3.amazonaws.com/0/92447/315e7606-f033-2992-a2b6-4741b0d5982d.png)
    - あれ？これ、OSのセキュリティってかマスターパスワードを使わなければいいんじゃね？って事でデフォルト設定ではチェック付きだったんだけど、これを外して適用。その後git fetch
        - エラーダイアログが出ずにfetch成功の画面が出た！いいんじゃないか？（終わり）

# まとめ
- Ubuntu/Lubuntuに関しては、OS側のセキュリティ設定を使わないようにする事で解決できた（セキュリティ設定を使わないなんてトンデモナイ！とかはとりあえず置いておきます）
    - メニューから、「ウィンドウ＞設定＞セキュリティー＞セキュア・ストレージ」を開く
    - 「マスター・パスワード・プロバイダー」枠内、「Linux Integration (64bit)」のチェックを外す
    - 「適用して閉じる」ボタンを押下（一応、セキュアストレージの内容の設定は消しておいてね。）
- その後、EGitによるgit操作を行い、ID/パスを入力、「セキュア・ストレージに保存」にチェックを入れれば、保存できるようになる

以上！
KotlinでToDoアプリを作ってみる1（準備）

#はじめに
本稿では、ToDoアプリ作成にあたりKotlinを使えるようにして、
AndroidStudioでプロジェクト作成して、**よし！始めるぞ！！**と意気込むところまでを記載します。
　1. KotlinによるToDoアプリ作成の理由
　2. Kotlin開発する前にやったこと
　3. プロジェクト作成

#KotlinによるToDoアプリ作成の理由
KotlinでToDoアプリを作ろうと思った理由は2つあります。

1つ目は「Android開発をJavaからKotlinに移行したい」という話が職場で出たからです。
**いい機会だし、トレンドの言語だし、勉強しよう！**
と思い、Kotlinの勉強を兼ねてアプリ開発することになりました。

2つ目は、職場の先輩から「勉強するなら目標があったほうがいい、２週間でToDoアプリを作って見せて」という課題を出されたからです。
やろうやろうと思ってても、なかなか始められずにいたので**良いきっかけ**になりました。

#Kotlin開発する前にやったこと
準備として以下を行いました。
***AndroidStudioのアップデート***
→（旧）2.3.1.0　（新）3.2.1.0
AndroidStudio3.0から正式にKotlinに対応しているみたいなので、バージョンアップしました。
|<img src="https://qiita-image-store.s3.amazonaws.com/0/314474/bd080d39-e4f2-34c4-599c-fdccaa4777e9.png" width="25px">[Develpers : Android Studioのダウンロードページ](https://developer.android.com/studio/ )|

#プロジェクト作成
では、AndroidStudioでKotlinが利用できるようになりましたので、早速プロジェクトを作成したいと思います。
<img width="500" alt="スクリーンショット 2018-11-10 10.36.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/314474/6006baef-f1a6-abdd-ffee-8667c7a9aac5.png">
- ApplicationName：ToDoApp 
- Company domain：なんでもいいので、今回はデフォルトにします
- Project location：ローカルにあるAndroidフォルダ直下にToDoフォルダとして入れていくことにします。
- Include Kotlin support：今回はKotlinで開発を行うため、チェックを入れました。

<img width="500" alt="スクリーンショット 2018-11-10 10.37.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/314474/f846fae7-90d5-a829-ed46-afcce47f0cbc.png">
デフォルトで設定します。


<img width="500" alt="スクリーンショット 2018-11-10 10.37.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/314474/1c7620cf-c19d-7fec-721f-77aa330443f7.png">
これもデフォルトのままで次に進みます。


<img width="500" alt="スクリーンショット 2018-11-10 10.37.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/314474/0985413e-93d1-5dd2-bbb7-32070a6e44fd.png">
メイン画面のActivityも今回はデフォルトのまま「MainActivity」とします。

これで**Finish**を押せば、プロジェクト作成完了！！

<img width="500" alt="スクリーンショット 2018-11-10 10.37.21.png" src="https://qiita-image-store.s3.amazonaws.com/0/314474/237b1076-be28-49fb-8c84-8e9b6ca68179.png">
「MainActivity.kt」ファイルが表示されているため、Kotlinプロジェクトの作成に成功したことが確認できました。

#おわりに
今回は、プロジェクト作成までになりますが、初めてのKotlinなので勉強しながらToDoアプリ開発していきたいと思います。
Qiitaも初めてなので、ToDoアプリの開発過程も載せていければいいかなと思っています。

**よし、開発やるぞー！！**
Raspberry PiへのpipでPyOpenglのインストールが出来なかった時

# インストール方法
raspberry piへのPyOpenglのインストールはpipで入るというのがよくみられるのですが、自分はpipで入らなったので、異なる方法を用いました。忘れないように書いておきます。

## 自身でのインストール方法
自分はpipで入らなったので、apt-getでPyopenglを入れました。以下に自身の環境を示します。

| ソフトもしくはハード        |       バージョン | 
|:-----------------:|:------------------:|
| Raspberry pi         |              Model 3 b+ |  
| ディスクイメージ           |            2018-10-09-raspbian-sterech |  
| Python             |              2.7 |    

コマンドは次の様になります。

```bash

$ sudo apt-get install python-opengl
```

## Pipではなぜ入らなかったのか

PyopenglにはGLUT等の依存関係ライブラリが実行時に必要となる為、pipではそれらの依存関係ファイルを指定してインストールする必要があります。apt-getでは、依存関係ライブラリを一緒に入れてくれるため一度でインストールがすみます。

## 参考
http://ytyaru.hatenablog.com/entry/2018/06/15/000000
全ての開発者がQiitaへのアウトプットをやめるべき理由

（タイトルは流行に合わせて付けました）

エンジニアのアウトプット、Qiita記事の質、おかしな記事のアカウント停止等、Qiita周辺で色々と話題が耐えない昨今ですが
[Qiitaでのアカウント停止に関する考えについて \- Qiita Blog](https://blog.qiita.com/account-suspension-in-qiita/)
という記事が発表され

> Qiitaでは「技術的にレベルが低い」「技術的に間違っている」「Qiitaというサービスや運営に批判的である」といった理由で記事の非公開化やアカウント停止という措置を取ることはございません。

と明言されたのでこの機会にQiitaに記事を書くのをやめるべきだと思う理由を書かせていただきます。

## アウトプット＝Qiitaではない
* 「エンジニアのアウトプットは大切」
* 「Webでアウトプットが確認できると採用可能性が上がる」

これらは事実でしょう。しかしアウトプット先がQiitaである必要は全くありません。

### むしろ個人サイトのほうが技術証明になる
* Qiitaに登録してMarkdownで記事を書いているだけの人
* 個人サイトでWordPress等のシステムを運用して記事を書いている人

これだけで比較した場合、技術力の証明という意味では後者のほうが優れているのではないでしょうか？  
特にWordPressやRails、React等、需要の高い技術を使って個人サイトをしっかりと構築すればそれ自体がポートフォリオとなるでしょう。

## 技術記事には価値がある
ダンピングという言葉を知っていますか？

[不当廉売 \- Wikipedia](https://ja.wikipedia.org/wiki/%E4%B8%8D%E5%BD%93%E5%BB%89%E5%A3%B2)	
> 不当廉売（ふとうれんばい、英語: dumping, ダンピング）とは、市場の健全な競争を阻害するほど不当に安い価格で商品を販売すること。

技術的知識には一定の価値があります。どんな軽いことでも時間を費やして得た知識には価値があります。それどころかとても高度な記事をQiitaに投稿する人もいますよね。皆さんが無償でQiitaに記事を書く行為もこのダンピングに近いのではないでしょうか？
自己運営のブログに公開すれば直接的でなくともアフィリエイト等で本人に対価が行く可能性もあったはずです。より高度な知識なら、個人でもnoteや技術系同人誌などの方法で販売することもできたはずです。しかし皆がQiitaに無償寄稿し続ける限り儲けるのはQiitaだけです。

## SEOによる悪循環
皆がQiitaを利用し大量の記事が集まることによりQiitaはSEOに極端に強くなり、何で検索しても結果上位がQiitaとなっています。これは主に以下2つの結果をもたらします。

* 質の低い記事でもQiitaにあるだけで上位に表示される
* 個人サイトへのアクセスが減りQiitaだけが儲かる

## Qiitaをやめればおかしな人達を排除できる
意味のわからない記事を書いて炎上しトレンドに入る人、注目されやすさを狙った記事を書き売名を狙う人、それらの人達がQiitaに来る理由はQiitaに人が集まっているからです。既に人が集まっているからそういう人達が寄ってくるのです。これはQiitaの人気がこのまま続く限り避けられません。  
しかし高品質な記事を書く人達がQiitaを使うのをやめれば、次第にQiita自体の価値が下がるでしょう。そしてQiitaに目を向ける人が減れば、上記のような注目されたいだけの人も行き場を無くすでしょう。

## まとめ
* Qiita以外のアウトプット場所を自作する方が技術力の証明になる
* Qiitaに投稿することで各個人が本来取り得た対価を損なっている
* Qiitaへの一極集中が解消されれば
  * 質の低い記事を目にすることも無くなる
  * 注目目当ての人達の居場所も無くなる

以上のことから、全ての開発者がQiitaを離れるという選択肢は様々な一考の価値があると私は考えます。
将来Qiitaが廃れたときのリスクヘッジの意味でも、早いうちに個人サイトを作成して独り立ちしておくことをお勧めします。
Dockerってなに？？おいしいの？？

# Dockerとは
Dockerはコンテナ型仮想化ソフトのひとつです。

昔は仮想環境に名前をつけて可愛がっていた時代があったそうですが、最近は仮想環境を使い捨てるらしいです。
 
まずは、従来のホスト型仮想化や、ハイパーバイザー型との違いをみていきましょう。

# くらべてみる

## ホスト型仮想化
ホスト型仮想化は、ホストのOSに仮想化ソフトをインストールして仮想化する方法です。
>Oracle VM Virtual Box

>ParallelsDesktop など

ホストOSを動かしながら余ったハードウェアリソースを用いるので重たくなりがちです。

## ハイパーバイザー型仮想化
ハイパーバイザー型仮想化は、コンピュータに仮想化専用のOSのハイパーバイザーを用いることによって仮想化する方法です。
>Citrix XenServerなど

基本的にはリモデスやSSHで仮想OSを操作するためノートパソコンでハイパーバイザーして持ち歩く人はそうそういないと思います。

個人というよりも、データセンター向きの仮想化の方法です。

## コンテナ型仮想化(記事の主役)
LinuxOSなどにはカーネル(核になる部分)と呼ばれるものがあり、どのディストリビューションにも共通して存在します。

そのカーネルを共用して仮想化するのがコンテナ型仮想化です。カーネルを複数保存しなくても済んだりするためハードウェアリソースを有効活用できます。

# Dockerを少しだけさわってみる
さわってみましょう。事前にDockerにログインを済ませておいてください。
## pull

``$docker pull <イメージ名>``で

好きなOSイメージをダウンロードできます。イメージ名はDockerHubを参照してください。

## run

``$docker run -it <イメージ名>``で

コンテナが作成され、コンテナ内のコンソールに移動します。

## ps
``$docker ps -a`` 

で、作成したコンテナ一覧とその様子を確認できます。

aオプションを忘れると動いているコンテナのみしか表示されません。

## rm
``$docker rm <コンテナ名orコンテナID>``
で

コンテナを削除できます。

# Dockerコンテナのホスティング 
Dockerコンテナをホスティングするサービスがあります。
https://arukas.io/

レンタルサーバでおなじみのさくらインターネットさんのDockerホスティングサービスです。

Arukasでは無料で128MBのRAM、カスタムドメインも利用できます。
有料版もあるそうです。
firefox をソースからビルドする

rustのお膝元であるfirefoxをソースコードからビルドしてみました。
rustが使われているところの観賞用。もしかしたらデバッガ当ててみたり。

# 準備

Ubuntu 18.04を使用しています。
基本手順はここに書いてある通り。
https://developer.mozilla.org/ja/docs/Developer_Guide/Build_Instructions/Linux_Build_Prerequisites

```
mkdir firefox
cd firefox/
wget -q https://hg.mozilla.org/mozilla-central/raw-file/default/python/mozboot/bin/bootstrap.py -O bootstrap.py
python bootstrap.py
```

以下のように聞かれるので、1を選択しました。

```
Please choose the version of Firefox you want to build:
1. Firefox for Desktop Artifact Mode
2. Firefox for Desktop
3. Firefox for Android Artifact Mode
4. Firefox for Android
Your choice:
```

それ以外の質問にはYで回答しました。

# ソースコードの入手

```
hg clone https://hg.mozilla.org/mozilla-central
```

# ビルド

```
cd mozilla-central/
./mach bootstrap
./mach build
```

`clang`がubuntu 18.04 に入っているよりも新しいものが必要だったのですが、`./mach bootstrap` を実行することで自動で準備してくれました。

# ビルドしたものを実行

```
./mach run
```

ビルドしてできたものは以下のディレクトリにあります。
`obj-x86_64-pc-linux-gnu/dist/bin`
NLBの小ネタ

投稿内容は私個人の意見であり、所属企業・部門見解を代表するものではありません。

##
NLBは、2018/2/22からクロスゾーン負荷分散ができるようなった。
https://aws.amazon.com/jp/about-aws/whats-new/2018/02/network-load-balancer-now-supports-cross-zone-load-balancing/

以下のようにAZをまたがって負荷分散が行える。
![nlb.png](https://qiita-image-store.s3.amazonaws.com/0/78184/c8ed1977-cd1f-defb-72ac-08fe31130d10.png)

上記は前提として、NLBがマルチAZで配置されていることとなり、以下のようにシングルAZ構成だとクロスゾーン負荷分散できない。
![nlb2.png](https://qiita-image-store.s3.amazonaws.com/0/78184/6042e8a7-cbca-8665-6cf3-7adc8f2b7b91.png)

シングルAZ構成で、マルチAZでターゲットグループを設定してもNLBのないAZにあるEC2は、Healtyにならない。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/78184/ed17d2db-20a3-974e-16c5-4ef3dd15e43d.png)
さくらインターネットでdiscordrbを使ったボットを稼働させる

初投稿です；

# ボットを作成する

ここらへんは説明しません。
すみません。以下の記事を参照してください。
[イチからDiscord Bot 。for Ruby](https://qiita.com/deneola213/items/efaeb0f5c20d44608a71)

満足のいくボットが作れたら、さくらインターネットに自分の作ったボットを導入して、いつでもボットが応答できるようにしましょう。

# さくらインターネットの設定

まずOSをインストールします。
たぶん、どんなOSでも大丈夫だと思いますが、
私はカスタムOSで`Ubuntu 18.04 amd64`をインストールしました。

# コンソールを起動

ログインしたら、次のコマンドを打ちます

```:コンソール
sudo apt update
sudo apt upgrade
```

aptのバージョンが古いのでアップデート＆アップグレードします。

```:コンソール
sudo apt install ruby
sudo apt install ruby-dev
```

これでRudyがインストールされました

```:コンソール
sudo gem update
sudo gem upgrade
sudo gem install discordrb
```

これでdiscordrbがインストールされました

# 自分の作ったボットのソースコードを導入

一番、手っ取り早いのはGitHubです。

さくらインターネットでは最初からgitコマンドが使えると思います。
あらかじめ、リモートに上げておいたソースコードをクローンしていきます。

```:コンソール
git clone [URL]
```

## ソースコードで注意すべきこと

ここで注意してほしいのは、ボットのトークンなどを間違ってGitに上げないこと。
ボットが乗っ取られる可能性があります。

```rb:main.rb
require 'discordrb'

bot = Discordrb::Commands::CommandBot.new (
token: 'HjJhk7hjHJKj765.Gwrjid82b3y.jaHHuTrdsU7.TDwd6ud8aadawo02hdz', # 危険！
client_id: 473987432971231273,
prefix:'/',
)
```

こんなふうに埋め込むのは非常にまずいです。
間違ってもこの状態でリモートにpushしないでください。

```rb:main.rb
require 'discordrb'

bot = Discordrb::Commands::CommandBot.new (
token: File.read('token').chomp
client_id: File.read('client_id').chomp
prefix:'/',
)
```

こんなふうに別のファイルにして、.gitignoreに追加しましょう。

```:.gitignore
token
client_id
```

さくらインターネットのサーバーをクローンした後は、

```:コンソール
vi token
```

などして、

```:token
HjJhk7hjHJKj765.Gwrjid82b3y.jaHHuTrdsU7.TDwd6ud8aadawo02hdz
```
というふうに書き込みましょう。（`client_id`も同様）

# 実行

あなたが書いたソースコードの名前が`main.rb`の場合、

```:コンソール
ruby main.rb
```

これで実行できます。

# 感想

Qiita記事ってこんな感じで書けばいいのかなぁ、
よくわかんない。

さくらインターネットで環境整えるのに3日かかったので、
自分のためにこの記事を書きました。
ほんとすまん。
【Python】Python入門②【変数について】

#**Python入門**
![fail2ban-unwanted-robots-crawlers-spiders.jpg](https://qiita-image-store.s3.amazonaws.com/0/307312/a3eb44b2-1680-fc7e-fdf1-d44edd027f2b.jpeg)
自分がPythonを学習し始めて数か月が経ちました。最初はAIとか機械学習とか面白そうと思って学習し始めたのですが、クローリングとスクレイピングに興味がわき前回作ったようなヤフオク落札履歴検索ツール [ヤフオク落札履歴を抽出するツールが使えます 販売、落札したい商品の適正価格がいくらか事前に知りたい方に](https://qiita.com/dmm7txk2/items/3b5047e14b043c52d6d2)やら記事にはしてないけど**Twitterで特定ユーザーのフォロワーをフォローするツール**を作ったりしてました。

ある程度クローリング＆スクレピングの技術はそこそこ使えるようになったので、今まで学習したことを忘れた時の為や、誰かが学習する時に役に立つ様に基本からアウトプットすることにしました。内容は学習するときに買った本を基に作成します。

##**変数について**
Pythonにも例によって変数というものがあります。「変数」とはPCのメモリ上に一時的にデータを記憶しておく為の入れ物のようなものの事です。数値や文字に限らず画像や映像、音声など様々なデータを記憶することが出来ます。
 
 
###**変数を使うには？**
Pythonで変数にデータを記憶するには「変数名 = 値」と記述します（よく変数を定義すると言います）。プログラム上では以下のように書きます。

```
price = 1200 　#　←　変数「price」に1200を代入
print(price)　　#　←　変数「price」の値を参照し画面に出力
```

この様にすることで変数に値を代入することができます。 変数名にはアルファベット（aからz、AからZ）と数字（0から9）、アンダースコア（_）に加えて、漢字やひらがな・カタカナ、ギリシャ文字が使えます。ただし、数字から始まる変数名は使えません。 ※基本的に変数名はアルファベット、数字、アンダースコアのみを使用します。これはPythonがマルチプラットフォームで動作するため、Windows、macOS、Linuxなど異なるプラットフォームでは漢字コードが異なる為、漢字などの全角文字を使うと意図しない漢字になる（文字化けとも）のでアルファベット、数字、アンダースコア等の半角文字を使用するのが通例となっています。
![WS000024.JPG](https://qiita-image-store.s3.amazonaws.com/0/307312/cf530b38-5bde-2349-7338-2ffbad0b9246.jpeg)
###**使う事の出来ない変数**
1. 数字で始まる名前
2. アンダースコア（_）から始まる名前
3. 予約語

アンダースコアから始まる名前は特別な用途で利用されることが決まっています。文法的には使用できますが、基本的に使用しないように注意してください。
予約語についてはforやifなどPythonの命令として使われている語句があり、これらは変数名として使用することが出来ません。これには以下のような語句があります。
![WS000025.JPG](https://qiita-image-store.s3.amazonaws.com/0/307312/e9779c9a-1661-4d76-077a-66dcd0e23270.jpeg)

###**変数を使うと分かりやすくなる**
ところで、なぜ変数をつかうのでしょうか？変数を使うとプログラムを分かりやすくできます。数字だらけだったプログラムに意味を与えることが出来ます。 例えば自動車で東京から大阪まで何時間かかるかを計算して表示するプログラムがあるとします。これを変数を使わないで作ると以下のようになります。 速度は時速80km、距離は507.5kmとします。 

####**東京から大阪まで何時間？**
```
print(507.5 / 80)
```
表示するだけなので1行で済みますが、これではなにをしたいのかが分かりません。さらに時速60kmの場合、時速100kmの場合や大阪ではなく、広島や福岡など目的地が変わった場合等、変更箇所が分かりにくいです。 簡単なプログラムではマシですが、大きなプロジェクトになるとそうはいきません。変数の数も求める結果も、もっと複雑で大きなものになります。その時に例のようなプログラムでは汎用性もなく対応も取り切れません。 この例を変数を使うと以下のようになります。 

**東京から大阪まで何時間？**

```
kyori = 507.5
jisoku = 80
jikan = kyori / jisoku
print(jikan)
```
この様に長くなりますが、それぞれの値が何を指しているか分かりやすくなりました。距離が変われば「kyori」の値、時速が変われば「jisoku」の値を変えればいいという事がパッと見で分かるようになりました。
 
###**変数の有効期限**
ところで、一度変数に代入された値はいつまで使う事が出来るのでしょうか？ 勿論、プログラムの終了までは使う事が出来ます。しかし、変数にはスコープと呼ばれる有効範囲というものが存在します。まだこの時点では意識する必要はないでしょう。ただ、スコープと呼ばれるものがあるという事だけは覚えておいてください。
Nodejsでモジュールバージョンが合わないときにまずやること

nw.jsとneon-cliを使っていてバージョン違いに疲弊したのでメモ。
nodejs初心者なので、パッケージ管理ツールの使い方がおかしいかもしれません。こうした方がいいとかあれば是非教えていただきたい。

#地獄のエラーメッセージ「compiled against a different Node.js version」
自分はパッケージ管理にyarnを使っていたのでハマりました。yarnでパッケージ管理をしていると、npmパッケージ系のコマンドが効かないシーンがあるのかもしれません。そこをゴッチャにすると、ハマります。

このエラーは、__モジュールが別のnodejsバージョンで動作するもの__だと言っているようです。

##実行環境
OS→OSX10.14(Mojave)
nodeバージョン管理→nodebrew
nodeグローバルパッケージ管理→npm
nodeローカルパッケージ管理→yarn

nodejs→v11.0.0
(バージョン変更したりしていますが、v10.9あたりと行き来していました)

##しらみつぶしにやりましょう

###1.現在のnodejsのバージョンを確認
ターミナルから
```node -v```

###2.必要な全てのモジュールが対応しているnodejsのバージョンを確認
これは手作業で全部確認したんですが、もっとざっと見れる方法があったんでしょうか..。

####必要があればnodejsのバージョン変更
インストール済みのバージョンを確認
```nodebrew ls```

ここに欲しいバージョンがなければインストール
```nodebrew install v0.0.0```←欲しいバージョン入力

バージョン適用
```nodebrew use v0.0.0```←適用バージョン入力

###3.npmのグローバルインストールをリビルド
これは正直意味があったのかはわかりません。
```npm rebuild -g```

###4.npmまたはyarnのローカルインストールをリビルド
node_modulesなどはそのままに、
<dt>npmの場合</dt>
<dd>```npm rebuild```</dd>
<dt>yarnの場合</dt>
<dd>```yarn install --force```</dd>
これらのコマンドでバージョンが噛み合うようにモジュールをアップデートしてくれるはずです。

###5.プロジェクトのnode_modulesディレクトリを削除,モジュール再インストール
なぜか4の方法でダメだった時はこれも試します。
__node_modules削除__
```rm -r node_modules```

__再インストール__
package.jsonのdependencies内の、それぞれのモジュールバージョンを確認。
そしてパッケージ再インストール
```npm install```

##終わりに
今の所はこれぐらいの対応でなんとかなりました。
これでも無理な時は、もしかしたら欲しいモジュールの必要nodeバージョンが全部違っているのかもしれません。その時はあきらめましょう!
ファイル名に()半角括弧などの文字列は避けよう

#たまにファイル名に括弧を使う方がいらっしゃるが、面倒なのでやめよう
ファイル名に（）があると検索もしづらいし、tabで文字の補完もしづらいので気をつけよう。

もしファイルを指定するならこれではダメ。

```
$ cp test(yameyou).cpp ../test
```

このようにダブルクオーテーションか、シングルクオーテーションで指定する。
ファイルごとにつけるのは非常に面倒ですよね。補完機能で出でこないですし。

```
$ cp test"("yammeyou")".cpp ../test
```

ファイル名には以下のような物を入力しようとしないでください。自分じゃない誰かにヘイトがたまってしまいます。基本的に記号自体やめたらいいんじゃないかな。アンダーバーは許せるけども。

```
(),.-/!¥
```

追記：コメントにありましたように空白や日本語も同様にいやですね
Oculus Goのブラウザのキャッシュをクリアする方法

React360でWebVRを開発していた最中に、Webサーバに配置したファイルの最新内容がOculus GOのブラウザに反映されない現象が発生したものの、ブラウザキャッシュクリアの方法がわからなくて少々ハマっていたのでメモ。

#ブラウザキャッシュクリアをするには「デスクトップ」ボタンを押す！
分かってしまえば簡単だったのですが、ブラウザの「デスクトップ」ボタン（正確には「デスクトップモードをオンにする」ボタン）を押すだけでした。

これ、本来はWebサイトのデスクトップ版のページを要求するために使用するのですが、内部的にはキャッシュクリアもされている模様（そりゃそうか）。

![oculus_capt.jpg](https://qiita-image-store.s3.amazonaws.com/0/150996/46789a7f-8c67-ed0e-d3ca-faf645b26382.jpeg)

上記画像の赤丸で囲ったボタンを押すとデスクトップ版のページが読み込まれるので、読み込みが終わり次第もう一度押すとモバイル版のページに戻る。

この過程でキャッシュはクリアされ、Webサーバにある最新の内容がブラウザに読み込まれている。はず。


以上！
Juliaを起動時にactivateを指定

Julia起動するたびにPkg REPL-modeにはいってactivateするのがめんどくさい。
パッケージを開発してるディレクトリでは環境変数 `JULIA_PROJECT`を設定するようにした。

```shell
export JULIA_PROJECT="."
```

# 参考

- [Juliaでプロジェクトを指定して起動](https://scrapbox.io/eiel/Julia%E3%81%A7%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E8%B5%B7%E5%8B%95)
NodeJS - コマンドラインの黒画面のままで、電卓を使いたい。。。ということで作ってみた。cli電卓。

#tl;dr
電卓をいちいち起動するのも、、
コマンドラインで完結させたい。
という考えから、cli電卓を nodejs で作ってみました。
（気づいたら、ググるより早く手が動いていました。だれか作っていると思いますが、あえて。）

## 作ってみよう。
```javascript:index.js
let readlineSync = require("readline-sync");
let math = require("mathjs");

let variables = {};
let flagFinish = false;

do{
	process.stdout.write("\u001b[36m数式を入力\u001b[0m\n    = ");
	let input = readlineSync.question();

	if(input.startsWith(">$")){
		let variableName = input.slice(1)
		variables[variableName] = variables.$ans;
		process.stdout.write(` \x1b[4m${variableName} に $ans (${variables.$ans}) が保存されました。\u001b[0m\n`);
	}else if(input.startsWith(">exit")){
		flagFinish = true;
	}else{
		let ans = math.eval(input, variables);

		if(ans){
			process.stdout.write(` ans: \x1b[4m\x1b[35m${ans}\u001b[0m\n`);
			variables.$ans = ans;
		}
	}

	process.stdout.write("\n");

}while(!flagFinish);
```

コマンドラインで次を入力:

```console
npm install readline-sync
npm install mathjs

...バーーーーーーーっとなんか出る。
```

これだけ！！！？

## 使い方！

### 数式を入力する

![スクリーンショット (35)_.png](https://qiita-image-store.s3.amazonaws.com/0/193558/c9891e4f-ab7f-e1eb-553b-f687b7662f8d.png)

<details><summary>コード</summary><div>

```javascript
1 + 1       // -> 2
2018 - 2020 // -> -2
100 * 200   // -> 20000
20 / 3      // -> 6.666666666666667
8 ^ 3       // -> 512
4!          // -> 24
```

</div></datails>

数式に関しては、普通に四則演算はもちろん、その他色々を入力するだけです。
完全に、math.js の仕様に依存します。

### 最後の計算結果を使用する

![スクリーンショット (37)_.png](https://qiita-image-store.s3.amazonaws.com/0/193558/3388ff98-dd16-747e-d51a-207b42c3c048.png)

<details><summary>コード</summary><div>

```console
    = 10!
 ans: 3628800

    = $ans
 ans: 3628800
```

</div></details>

最後の計算結果は、 `$ans` に格納されています。

### 計算結果をメモリに保存しておく

![スクリーンショット (35).png](https://qiita-image-store.s3.amazonaws.com/0/193558/66e0603d-e5de-16d9-d980-775d752d1dc6.png)

<details><summary>コード</summary><div>

```console
数式を入力
    = sqrt(2)
 ans: 1.4142135623730951

数式を入力
    = $ans
 ans: 1.4142135623730951

数式を入力
    = >$memory
 $memory に $ans (1.4142135623730951) が保存されました。

数式を入力
    = sqrt(3)
 ans: 1.7320508075688772

数式を入力
    = $ans
 ans: 1.7320508075688772

数式を入力
    = $memory
 ans: 1.4142135623730951
```

</div></details>

### 終了する

![スクリーンショット (36).png](https://qiita-image-store.s3.amazonaws.com/0/193558/2265d5a9-9524-287e-58a7-d71c2207ce1f.png)

<details><summary>コード</summary><div>

```console
数式を入力
    = >exit
```

</div></details>

`>exit` と入力してください。
（雑なんで、スペースが `>` と `exit` の間に入ってると動きません。）

# 最後に
バグ修正などはしていないので、ご了承ください。 
機能の追加などは、コメントお願いします。
（時間があるときや、気の向いたときに直します。 :disappointed_relieved::scream: ）
php-master-changes 2018-11-09

今日は ext/ftp と ext/sockets のテストの修正があった！

# 2018-11-09
## mizunashi-mana: Ignore getaddrinfo failed message
- https://github.com/php/php-src/commit/17d76e530de46acaf41edb0731ed6e3ebac8e5dc
- ext/ftp で、Mac では getaddrinfo() の EAI_NONAME のエラーメッセージが異なるため、その部分を無視するよう修正
- [PR: 3659](https://github.com/php/php-src/pull/3659)

## mizunashi-mana: Suppress already used warning
- https://github.com/php/php-src/commit/8021e0f5dcc52af60d1b1b823c732e22a390d48a
- ext/sockets のテストで、警告を `@` で抑止
- ある範囲でポートを変えながら成功するまで socket_bind() しようとするようなフォールバック処理を含むものがある
- どれかのポートで成功すればよい、という意図のものだったが、実際には 1 度でも失敗すると警告が出てその出力によりテストがこけるため修正
- [PR: 3660](https://github.com/php/php-src/pull/3660)
DockerとDocker-CEの違いについて

# はじめに
Dockerが世に登場してはや5年が経ちました。
で、環境構築するたびに、はてDockerどうやってインストールするんだったかなとググるわけです。
すると、だいたい *docker* をインストールする方法と *docker-ce* をインストールする方法が出てきてしまい、どっちだよ！ってなるわけです。

ってことで、調べてみました。

# Dockerの誕生
Dockerは2013年に爆誕したようです。

- [Dockerの歴史から紐解く、コンテナ型仮想化の「今まで」と「これから」](https://www.sbbit.jp/article/cont1/34350)

で、この時は普通に*docker*と呼んでいて、例えばCentOS7にインストールする時は、

```bash
$ sudo yum install docker
```

ってやってたわけですね。

# Docker-CEの登場
ところが、2017年DockerはCE（コミュニティエディション）とEE（エンタープライズエディション）２つのソリューションの提供を開始しました。

- [Docker v17.03がリリース。今月からバージョン番号制度が変更になり、毎月リリース体制に](https://www.publickey1.jp/blog/17/docker_v1703.html)
- [Dockerが商用版Dockerとして「Docker Enterprise Edition」発表、認証済みイメージやプラグインなど提供。無償版は「Community Edition」に](https://www.publickey1.jp/blog/17/dockerdockerdocker_enterprise_editioncommunity_edition.html)

いわゆる、無償版と有償版ってやつですね。
サポートなどに違いが出てきますが、とりまサクッと手元の環境で試したい！という時はCEを選択することになります。

Docker-CEの場合、インストールするパッケージ名が変わってきます。

```bash
$ sudo yum install docker-ce
```

したがって、公式のインストール方法にはちゃんと、古いdockerは消してね！って書いてありますね。

- [Get Docker CE for CentOS](https://docs.docker.com/install/linux/docker-ce/centos/#docker-ee-customers)

>**Uninstall old versions**
Older versions of Docker were called docker or docker-engine. If these are installed, uninstall them, along with associated dependencies.

```
$ sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine
```

# 2018年11月現在のバージョン
2018年11月現在の(CentOS向け)最新バージョンをyumリポジトリで確認してみました。

```
$ yum --showduplicates list | grep docker
docker-ce.x86_64                           3:18.09.0-3.el7              @docker-ce-stable
docker.x86_64                              2:1.13.1-75.git8633870.el7.centos
```

ということで、
docker-ceが18.09.0(2018/09版)、dockerが1.13.1が最新とのこと。
また、これからdockerを導入する方は迷わずdocker-ceを選択してくださいね！
ちょっぴり変わった、PHPの歴史

PHPの歴史を振り返ってみると、少し変わった誕生の経緯がありました。

## プログラミング言語を作る理由

新しいプログラミング言語が作られる理由としては、以下のようなものが考えられます。

* 特定の分野、あるいは状況で使いやすいような言語を作る
* 既存の言語で不足する点があるので、その改良

一方、PHPの場合は、少し特殊な経緯をたどっています。

## PHPの歴史をたどる

[オライリー](https://www.oreilly.co.jp/)[^1]から出ている「プログラミング PHP」の第2版を開いてみると、PHPの歴史についてもまとめられていました。

### 1.0

PHP 1.0が発表されたのは1995年6月のことでしたが、なんと、この当時は**プログラミング言語ではありませんでした**。この時点でのPHPは「Personal Home Page tools」の略で、

* アクセス解析
* SSIの処理
* アクセスカウンタ
* フォーム処理

などを備えた、Webサイト向けのツール群でした。これらはC言語で書かれていて、Cで拡張できるようにもなっていました。本人いわく、「スクリプト言語を作るなどといった考えはまったくなかった」とのことです。

### 2.0

このように、プログラミング言語ではなく、それを作るつもりもなかったところから動き出したPHPですが、C言語で拡張しようとする人はそうそう現れず、タグ埋め込みについての機能要望が殺到した結果、タグとして条件分岐やループを実装して、結局スクリプト言語へと変貌していくこととなりました。そして、Apacheへの組み込みという形式を取るようになったのも、この頃です。

## 名残り

このようによく言えば実用本位な形で、悪く言えば付け焼刃的に生まれた結果として、PHPのライブラリ関数はあまり一貫性がないままとなっています。

また、PHP 7ではほぼ全て解消していますが、昔はセキュリティ的にもよろしくない機能があって、「例えば、PHPを避ける」などと過去に言われたこともありました。

* GETやPOSTで来た値の名前の変数を自動生成する、`register_globals`（[詳細](http://php.net/manual/ja/security.globals.php)、PHP 4.2でデフォルト無効化、PHP 5.4で完全廃止）
  * 攻撃者が自由に好きな名前の変数を作れる、という現代から考えれば危険すぎる機能でした。
* 外部入力の一重引用符などに自動でバックスラッシュを補う、[マジッククオート](http://php.net/manual/ja/security.magicquotes.php)（PHP 5.3で非推奨、PHP 5.4で廃止）
  * SQLインジェクション予防のために行われていたのですが、本来ならSQLインジェクションにはDBアクセスで対応すべきで、それ以外の場所には邪魔にしかならない、ということもあって廃止されています。ただ、WordPressでは過去との互換性もあって、[同等の処理を自前で行っているままとなっています](https://core.trac.wordpress.org/ticket/18322)。

歴史を見ていくと、普段見ているのとは違ったものが見えてくる気がします。The world around you is not what it seems.

[^1]: プログラミング系の出版社で、本の表紙が動物の木版画になっていることでお馴染みです。
Vue.js で逆ポーランド電卓のスタックを見る

`2 * 3 + 4 * 5` という数式は人間には一目でもコンピュータには難しいのでいったん `2 3 * 4 5 * +` という並びにしてから実行します。

Ruby でもこんな風にすると並びが変わっているのが確認できます。

```rb
puts RubyVM::InstructionSequence.compile("2 * 3 + 4 * 5").disassemble
# >> == disasm: #<ISeq:<compiled>@<compiled>:1 (1,0)-(1,13)>=================
# >> 0000 putobject        2                                               (   1)[Li]
# >> 0002 putobject        3
# >> 0004 opt_mult         <callinfo!mid:*, argc:1, ARGS_SIMPLE>, <callcache>
# >> 0007 putobject        4
# >> 0009 putobject        5
# >> 0011 opt_mult         <callinfo!mid:*, argc:1, ARGS_SIMPLE>, <callcache>
# >> 0014 opt_plus         <callinfo!mid:+, argc:1, ARGS_SIMPLE>, <callcache>
# >> 0017 leave            
```

で、その並びの実行を試せるようにしたのがこれです。

<p data-height="265" data-theme-id="0" data-slug-hash="jQrBLb" data-default-tab="result" data-user="akicho8" data-pen-title="RPN" class="codepen">See the Pen <a href="https://codepen.io/akicho8/pen/jQrBLb/">RPN</a> by Akira Ikeda (<a href="https://codepen.io/akicho8">@akicho8</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

`2 3 * 4 5 * +` の順に入力していくとどのようにスタックが変化していっているかがわかります。

# コードの内容

```slim:pug
#app
  input(v-model.trim="str" @keyup="run")
  input(v-for="e in [...stack].reverse()" :value="e" readonly)
```

```js:js
new Vue({
  el: "#app",
  data: {
    str: "",
    stack: [],
  },
  methods: {
    run() {
      if (this.str !== "") {
        if (/\d+/.test(this.str)) {
          this.stack.push(this.str)
        } else {
          const left = this.stack.pop()
          const right = this.stack.pop()
          this.stack.push(eval(`${left}${this.str}${right}`))
        }
        this.str = ""
      }
    },
  },
})
```

数字なら push してそうじゃないなら2つ取り出して演算して push します。
かなり手抜きです。
`@keyup` のところを `@keyup.enter` にすると2桁以上の実行ができます。

# おわり

結局何の記事かよくわからなくなってしまいましたが、HTMLの部分も含めて Vue.js だとこんなのが書きやすいです。
CentOS7で論理ボリューム(LV)を拡張する

# CentOS7で論理ボリューム(LV)を拡張する

## 手順
1. ディスクパーティションをLVM(Logical Volume Manager)用に設定する
2. LVMで使用するためのPV(Physical Volume)を初期化する
3. VG(Volume Group)に初期化したPVを追加する
4. VGの拡張したい対象のLV(Logical Volume)を拡張する
5. LVのファイルシステムをresizeする

1~4まではググるともっと詳しい解説があるが、CentOS7の標準ファイルフォーマットxfsなので
5の手順はxfs_growfsを使うというのが意外にハマリどころ

### ディスクパーティションをLVM用に設定する
fdiskでpartition IDを0x8e(LVM)にセットする

### LVMで使用するためのPVを初期化する
以下、root権限が必要なので、suするかsudoで実行します
`% pvcreate <pv>`

### VGに初期化したPVを追加する
`% vgextend <vg> <pv>`

CentOS7をデフォルトでインストールするとcentosというVGが作られている。
`% vgextend centos <pv>`

### VGの拡張したい対象のLVを拡張する
`% lvextend -L +<Size>G <lv>` \<lv>を\<Size>G拡張する
`% lvextend -l <num>%FREE <lv>` \<lv>をVGの空領域の100%まで拡張する

\<lv>はLV Pathで指定する。/homeを増やすなら/dev/centos/homeとなる
`% lvdisplay` -> LV情報を一覧する
<pre>
  --- Logical volume ---
  LV Path                /dev/centos/home ->これ
  LV Name                home
  VG Name                centos
  --- <略> ---
</pre>

### LVのファイルシステムをresizeする
CentOS7のデフォルトインストールの場合、LVはxfsファイルフォーマットになっている
<pre>
#
# /etc/fstab
# Created by anaconda on Sun Dec  3 18:02:17 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=9fbf4083-0dd0-4ed4-b13f-ec180a54a479 /boot                   xfs     defaults        0 0
UUID=0AEE-587B          /boot/efi               vfat    umask=0077,shortname=winnt 0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
</pre>

resize2fsではリサイズができない。拡張の場合は代わりにxfs_growfsを使用する
`% xfs_growfs <mount point>`
/homeであれば
`% xfs_growfs /home`

※縮小する時はどうするんだろね？
Wagby概観


##目的
Wagbyに触れる機会があったため、ざっと概要や使い勝手を書く

##Wagbyとは

Javaベースの超高速開発ツール(開発元:[ジャスミンソフト][1])
[1]:https://www.jasminesoft.co.jp/
基本的な開発はWebブラウザ(GoogleChrome)上で動作するWagbyDesignerを介して行う。
![Wagby.jpg](https://qiita-image-store.s3.amazonaws.com/0/292905/56b0e5e0-ac4c-405a-7b7b-07c45c4e7f63.jpeg)
中身は上記のような構造になっており、自動的に生成されるコードは特に特殊な構造になっているわけでもない為、Javaのコードが理解できれば問題なく解読することが出来ます。後述するカスタマイズなどの時にEclipseなどのIDEを使用することもできます。(注意点あり)

Wagbyで開発するアプリケーションは基本的には在庫管理や顧客管理システムなどの基幹システムに適する形態のものを作成しやすくなっています。

開発の基本的な流れは

モデル定義(DBでいうテーブル)をWagbyDesigner上で定義→ビルド

以上

という訳ではありませんが、簡単な在庫管理システムなどであれば実際上記のワンステップで開発することが出来ます。
モデル定義を行うと、検索画面や一覧画面、詳細画面などは自動的に生成され、モデル間の参照構造なども指定さえすれば自動的に行ってくれます。
外部DBとの連携もJDBCドライバを適切な場所に置いてDesigner側で設定をすれば簡単に連携できます。

##カスタマイズ

細かな調整や外部のアプリケーションとの連携などは自動生成されたソースコードをいじってやらなければいけません。
カスタマイズが可能な範囲はHTML,JS,CSS,Javaのログオンや認証周り以外の部分とかなり広範囲ではあります。
カスタマイズは基本的には自動生成されたコードを上書き、もしくはカスタマイズしたいクラスを継承してそれぞれ適切なフォルダ内に配置して再度ビルドをかけることでカスタマイズが適用できます。

前述した注意点というのがここで出てくるのですが、カスタマイズする際にビルドエラーや動作時のエラーなどが頻発することがあります。Eclipseとの連携がうまくいっていないのか、何故かビルド前にEclipseを再起動するとエラーが起きにくくなります。

##問題点

Wagby側の問題点は細かいバグがあるとか仕様上対応不可能な面があるなどありますが、大きな部分ではアプリケーション開発には必要十分な実力を持っています。
むしろ、往々にしてアプリケーション開発にはありがちですが、いかにWagby開発に適したシステム、DBの構成を考えるかが重要であると考えられます。

また、カスタマイズを一切行わない場合、実際に発行されるSQL文の最適化はほぼされていない為、パフォーマンス上の問題になる可能性があります(未検証)

##まとめ
完成度は高いが、構築するシステムの構造を考えてやらないと
ドツボにハマりそう
WebサイトのUI/UX – ユーザーは独自文化・裏技・オリジナル利用法を自分で作る。Twitterのハッシュタグ・リツイート機能みたいに。

# 題材

俺だぜ。


# 他の人のQiita記事に「引用」+「グッドの絵文字1個」でコメントを付けてみる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/7e0b768f-8aba-3dec-99f0-f95037eca505.png)

[侍エンジニア塾とAidemyの杜撰さから学ぶべきこと - Qiita](https://qiita.com/nkmk/items/ee346c0da365e988e2dd#comment-c526baecdc87f7a6b8ec)




# その理由は？

それを説明するならば。

- 記事の中で「ぐっときた部分」「印象的だった部分」を伝えたい、記録したいから。
- ただそれだけがしたくて、コメントを書く中身は思い浮かばなかったから。
- 「コメントが思い浮かばないから、何もしない」じゃなくて、自分が良いと思った部分にハイライトを当てたい。
  - 「ひとりの読者には、特にこの部分響きましたよ」「皆さん、記事の中では、特にここがポイントじゃないですか」という意味で、「本文からのただの引用」も大きな意味を持つ。
  - [Qiitaの記事には絶対コメントを書いてはいけない (わけがない) - Qiita](https://qiita.com/YumaInaura/items/5532cb4eea013b2f4a4b)

# ところでMediumにはハイライト機能がある

これも他の人の記事。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/89f88f7e-3a48-033f-5e16-e4fbbf159b6b.png)

そして、ハイライトしたテキストは自動記録、共有される。

[Aimingでの3年間の日々と感謝 – Yoshiyuki Hirano – Medium](https://medium.com/@yhirano55/aiming%E3%81%A7%E3%81%AE3%E5%B9%B4%E9%96%93%E3%81%AE%E6%97%A5%E3%80%85%E3%81%A8%E6%84%9F%E8%AC%9D-f575a06129cf)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/17fc8c91-3f5f-d560-5cf6-fcda55fb3ff8.png)

[Story highlights by Yuma Inaura @yumainaura ( 稲浦悠馬 ) – Medium](https://medium.com/@YumaInaura/highlights)


# Qiitaに書いたコメント。これって「ハイライト機能」みたいだ。

あとからそのことに気付いた。

1. 「Qiitaにつけるコメントって、ごく簡単なものでも良いよね」
2. コメントさえなくても良いよね。「引用＋絵文字」ぐらいのリアクションでも良いよね。
3. これって「ハイライト機能」の代替えだと言えるよね。

自分が「Mediumのようなハイライト機能」に、実際に影響を受けたかどうかは分からないが、コメント機能というよりハイライト機能に近い使い方をしていることに気付いた。

# 教訓。Twitterのハッシュタグ、リツイート機能に学ぶ。

- ユーザーは現状の機能を使って、独自機能、オリジナル利用法を生み出す場合がある。
- 何らかの独自利用がされる時、そこには潜在的な「機能に対するニーズ」がある。
- Twitterのハッシュタグやリツイート機能なんかが良い例。あれもユーザー独自の利用法が、あとから公式採用されたものだったはず。

# 自分をサンプルにしよう

- ユーザー行動を理解するのに、一番手近にいるサンプルは「自分」だ。
  - 「自分、このサービスで、なんでこんなことしてるの？」と思ったら、それはユーザー行動について検証するチャンス。

# 原題 – Qiita にはハイライト機能がないから、替わりにコメント機能で「引用+絵文字」を付けてみるテスト。

記事を書いている間に、UI/UX論にテーマが発展した。


# 次回予告、サービスの不具合はユーザー行動に影響を与える。


この記事に3コメントがついているように見えるが、コメントなんか存在しない。なぜなのだろうか。

そう、仮にこれが不具合だとすれば、Webサイトの不具合もユーザー行動に影響を‥続きはまた別の話で。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/77f0159a-43cf-aa9a-6b52-8d18dd8f4254.png)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
【UiPath】「セルを読み込む」アクティビティについて

「Excelのセルのサマった値（SUM）が取れない！！」という事案が発生し、
「そんなバカな。。。！！」と思い、調べた備忘録です。
結論、関数値でも書式がユーザー定義のセルでも値は取れるようです。

##「セルを読み込む」アクティビティは２つある
日本語版のUiPathでは「セルを読み込む」と訳されているアクティビティは２つあります。
僕はこのトラップに見事に引っ掛かりましたｗ

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/88598dbe-4a69-0dfa-384a-45baa2c568c4.png)

青枠の「セルを読み込む」はRead Cell
赤枠の「セルを読み込む」はExcel Read Cell
です。

###Read Cellのプロパティ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/d67946af-3b1b-bc59-a5d3-170666682453.png)

###Excel Read Cellのプロパティ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/aeb70259-24ea-8e05-90af-f76410b22abc.png)

##Read CellとExcel Read Cellの違い
Read Cellはそれ自身がExcelファイルを指定できるようになっており、単独で使えますが、Excel Read CellはExcel application scopeの中で使うことが前提となっています。

他にもオプションが多少異なり、Read Cellには「パスワード」がありますが、Excel Read Cellにはありません。

問題なのは、**「表示形式を保持」オプションの返却値が異なる**という点です。

試しに、以下のサンプルに話を進めることにします。
A1～A5セルは、それぞれユーザー定義[h]: mm:ssが設定されており、A6セルで=SUM(A1:A5)として合計時間を算出しています。
今回はA6セルの値を取得してみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/9c91b0e7-cbdc-d660-32af-71ff626a836d.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/0090cd60-6af6-e8ae-e6d3-811a083347c5.png)

###Read Cellの場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/3c8bf5a6-9590-f74a-4f23-d16e466b2eac.png)
「表示形式を保持」オプションをオンにして、結果を変数result（型はGenericValue）に入れるものとします。resultをメッセージボックスに表示させてみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/49b164f2-f4fc-1f60-bcae-0431ca162577.png)

セルに表示された合計時間とは異なる値が取得できてしまいました。

この値の正体は、セル書式を「標準」とした場合の表示値です。
ユーザー定義されたセル値は取得できるようなのですが、
関数値になるとセル書式が「標準」の場合の値を取得してしまうようです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/d3bc7e7c-5a3c-bb9e-00ba-573a505c7013.png)


###Excel Read Cellの場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/a5fa5f59-dab0-69bd-f9a3-56b2ab651ac5.png)
Read Cellと同様にやってみます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/186221/177f7623-9a04-0a1c-7f84-ff80c72f733f.png)

結果、きちんとセルに表示されている合計時間が取得できています。

##まとめ
関数値の取得はExcel Read Cellを使いましょう。
Read Cell以外にも同じ日本語訳がされているアクティビティがあり混同しがちなので、Excel操作系のアクティビティは「アプリの統合」→「Excel」直下に置かれたアクティビティを使うのが無難と思われます。
NSUserDefaults の setValue と setObject

何回かはまったので備忘録。

#### 事象

```swift
NSUserDefaults.setValue("String Value", forKey: "String Key")
```

とやると

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<Class address> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key String Value.'

と出てアプリがクラッシュする。

#### 解決方法

`setValue` じゃなくて `setObject` を使う。

```swift
NSUserDefaults.setObject("String Value", forKey: "String Key")
```

#### 説明

**set(_:forKey:) - NSUserDefaults**
https://developer.apple.com/documentation/foundation/userdefaults/1414067-set
The value parameter can be only property list objects: NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary. For NSArray and NSDictionary objects, their contents must be property list objects. For more information, see What is a Property List? in Property List Programming Guide.

ということなので、Stringなんかを保存したい場合はこちら。

`setValue` は NSUserDefaults のメソッドではなく、親クラスのNSObjectのメソッド

**setValue(_:forKey:) - NSObject**
https://developer.apple.com/documentation/objectivec/nsobject/1415969-setvalue

Key-Value Coding のためのメソッドなので、NSUserDefaults compatible じゃないものを突っ込もうと思うとエラーになるのでした。

#### 言い訳

実際頭の中では `setObject` だよと思いながら補完で失敗したので、余計に時間を使ってしまった・・・。
PostgreSQLシェルスクリプトでSQLに引数を渡して実行

シェルスクリプトからSQLを実行する際に引数を渡す方法をご紹介します。

## 環境
環境はDockerを使って検証しています。
docker
 ├ PostgreSQL 10.1
 └ bash 4.4.12

下記のテーブルは存在している前提です。

```sql

CREATE TABLE IF NOT EXISTS test
(
  id        INTEGER,
  username  VARCHAR(30),
  age       INTEGRE
);
```

## 手順

### 数値を渡す場合
シェルスクリプトでは、-vオプションをつけて、「SQLの変数名=数値」または「SQLの変数名=bashの変数」としてSQL実行コマンドに加えます。

```bash:init-db.sh
psql -U user -d database < "/docker-entrypoint-initdb.d/insert-example.sql" -v num=1
```

実行されるSQLでは、「:変数」として値を受け取ります。

```sql:insert-example.sql
INSERT INTO test VALUES(1, 'Taro', :num);
```

### 文字列を渡す場合
シェルスクリプトでは、同様に-vオプションをつけて、「SQLの変数名="文字列"」または「SQLの変数名="bashの変数"」としてSQL実行コマンドに加えます。

```bash:init-db.sh
psql -U user -d database < "/docker-entrypoint-initdb.d/insert-example.sql" -v string="test"
```

実行されるSQLでは、「:変数」として値を受け取ります。

```sql:insert-example.sql
INSERT INTO test VALUES(1, :string, 1);
```
sympyで「楕円の面積」をやってみた

(参考)モンテカルロ法で楕円の面積を求めてみる
https://qiita.com/jp_yen/items/5d561ada97dd4fc6d558
(参考)Ellipses＞area
https://docs.sympy.org/latest/modules/geometry/ellipses.html
(参考)高校数学の美しい物語＞楕円の面積公式の３通りの導出
https://mathtrain.jp/sofdaen

```fullscript.py 
from sympy import *
p1 = Point(0, 0)
e1 = Ellipse(p1, 160, 90)
print(e1.area)                           　    # 14400*pi
print(float(e1.area))                        # 45238.93421169302
#
var("x, y, a, b")
p1 = Point(x, y)
e1 = Ellipse(p1, a, b)
print(e1.area)                               # pi*a*b
print(float(e1.area.subs(a,160).subs(b,90))) # 45238.93421169302
#
var("aa, bb")
f=4*bb*(1-x**2/aa**2)**(1/2)
print(integrate(f, (x, 0, aa)))   #4.0*aa*bb*hyper((-0.5, 1/2), (3/2,), exp_polar(2*I*pi))
```
正しいうるう年(閏年)の求め方

指定された西暦がうるう年(閏年)かどうかの求め方は知っているかな？

そのためにはまず、うるう年(閏年)の定義を確認する必要がある。

ここは日本だ。だから日本の法律を確認しよう。

日本で閏年に関する法律は、次のものである。

[明治三十一年勅令第九十号（閏年ニ関スル件）](https://elaws.e-gov.go.jp/document?lawid=131IO0000000090_20150801_000000000000000)

これに基づいて実装する。

まず、法律の内容を実装する前準備として **西暦**を**神武天皇即位紀元(皇紀)** に変換する必要がある。

```
year_kouki = year_ad + 660
```

さて、まず最初の部分「**神武天皇即位紀元年数ノ四ヲ以テ整除シ得ヘキ年ヲ閏年トス**」だけでコードにすると次のようになる。

```
year_kouki % 4 == 0
```

しかしながら、法律では「但シ～」と続く。
「**紀元年数ヨリ六百六十ヲ減シテ百ヲ以テ整除シ得ヘキモノ**」は次の条件を満たす年のことである。

```
(year_kouki - 660) % 100 == 0
```

その続きの部分も含めて「**紀元年数ヨリ六百六十ヲ減シテ百ヲ以テ整除シ得ヘキモノノ中更ニ四ヲ以テ商ヲ整除シ得サル年**」は

```
((year_kouki - 660) % 100 == 0) and ((year_kouki - 660) // 100) % 4 != 0)
```

これを最初と合わせると

```
(year_kouki % 4 == 0) and (
    not (((year_kouki - 660) % 100 == 0) and (((year_kouki - 660) // 100) % 4 != 0)))
```

となる。

これを関数にすると次のようになる。

```is_japanese_strict_leapyear.py

def is_japanese_strict_leapyear(year_ad):
    year_kouki = year_ad + 660
    return (year_kouki % 4 == 0) and (
        not (((year_kouki - 660) % 100 == 0) and (((year_kouki - 660) // 100) % 4 != 0)))
```

法律はきちんと守りましょう(ヲイ)

・・・エープリルフールネタにすればよかったか。


https://qiita.com/kjm_nuco/items/fd16c2af6b089c4849cd
y.tab.cを実行したときのWarningへの対処


### 表示された　Warning
```
y.tab.c:1223:16: warning: implicit declaration of function 'yylex' is invalid in C99 [-Wimplicit-function-declaration]
      yychar = YYLEX;
               ^
y.tab.c:579:16: note: expanded from macro 'YYLEX'
# define YYLEX yylex ()
               ^
y.tab.c:1341:7: warning: implicit declaration of function 'yyerror' is invalid in C99 [-Wimplicit-function-declaration]
      yyerror (YY_("syntax error"));
      ^
y.tab.c:1487:3: warning: implicit declaration of function 'yyerror' is invalid in C99 [-Wimplicit-function-declaration]
  yyerror (YY_("memory exhausted"));
  ^
```

### 解決策
ファイル名.y　に　以下を付け加える

```
%{
  int yylex();
  void yyerror(const char *s);
%}
```
Optional#orElseの欠陥

Qiitaにコメントを書いていて気づいたことを書き留めておく

### Listの場合
```java:上限境界ワイルドカードList
List<Integer> list = new ArrayList<>();
list.add(1);
List<? extends Number> list2 = list;
```

を考える。この段階でlit2が扱うのは「Numberを継承した何か」であって、それがIntegerなのかDoubleなのかわからない。だから

```java:上限境界ワイルドカードListに追加はできない
list2.add(0.5);  // コンパイルエラー
```

これはコンパイルエラーとなる。現に今list2に入っているのはIntegerのListで、Doubleを入れることはできないし、できたら型安全が崩れる。
しかし一方で、「Numberを継承した何かが入っている」のは確かなので、

```java:上限境界ワイルドカードListから取得はできる
Number num = list2.get(0);
```

とすることはできる。実際入っているものがIntegerだろうがDoubleだろうが、Numberにアップキャストが可能だからだ。

###本題：Optionalの場合
```java:上限境界ワイルドカードOptional
Optional<? extends Number> op = Optional.of(1);
```

を考える。getは(あまり推奨されないが)Listのgetと同じ理由で、Numberとして取り出すことができる。

```java:上限境界ワイルドカードOptionalから取得できる
Number num = op.get();
```

ではorElseはどうか？orElseはOptionalが空だった場合に返すデフォルト値を渡す必要がある。
getではNumberを取得できるのだから、Numberを渡せば…

```java:上限境界ワイルドカードOptionalでorElseが使えない
Number num2 = op.orElse(0.5);  // コンパイルエラー
```

**…あれ？**

そう、理屈としてはList#addと同じ。引数型Tに当たる型が「Numberを継承した何か」であり、それがIntegerかDoubleかわからないため、確実に安全に入れられる型が存在しないのだ。

**…おかしくね？**
そもそもList#addとOptional#orElseでは引数の性質が全く異なるはずである。
Listのほうはある型についての要素をまとめるもので、異なる要素が紛れ込むのは避ける必要がある。
しかし、Optionalは中身が空だった場合に代わりに使うものであり、Optionalの中に入れたりすることが無いため、異なる型がまぎれたりする恐れはない。そもそも扱う型の親の型にならなんにでも入れられるはずなのに、そこの柔軟性がないのはおかしい。つまり、Optional#orElseの定義は

```java:Optional#orElseのあるべき定義
public <U super T> U orElse(U other)
```

こうでなければならないはずだ。

しかし今やってみたら、ワイルドカードでない総称型に`super`は使えないらしい…
これをやろうと思ったら、いったんmapで型を変えないといけないのか…

```java:Optionalの型の親の型を返すためにいったん変換
Number num3 = op.map(n -> (Number) n).orElse(0.5);
```
Discord.jsを使って誰でも簡単に作れる入退室通知BOTの作り方

# はじめに
Discord.jsを使ってBOTを作ろうと思って調べてみると意外と簡単だったので
記していきたいと思います。
技術記事を書くのは初めてなので至らぬ点があるかもしれませんがご了承くださいm(_ _)m
ソースコード
https://github.com/koyomivr/DiscordBot

#前提
**Node.jsがインストールされていること**
インストールしてない人はググって入れてください。
[インストール方法が書いてあるの記事](https://qiita.com/kyosuke5_20/items/c5f68fc9d89b84c0df09)

**DiscordのAPI Tokenを取得しておく**
[こちら](https://discordapp.com/developers/applications/)を開いてログインしてください。

**手順**
1.Create an applicationをクリック
2.APP NAME(アプリ名)を書いて変更を保存
3.Client IDをcopyします
4.ブラウザで以下のURLにアクセスします

```
https://discordapp.com/oauth2/authorize?&client_id={Client ID}&scope=bot&permissions=0
```
**{Client ID}**のところは先程copyしたのを入れてください
5.Botを追加するサーバーの選択をし、追加します

#実際に作っていく
**1.作業するディレクトリを作っていく**

```
mkdir sample-bot
cd sample-bot
```

**2.[Eris](https://abal.moe/Eris/)をインストールする**

```
npm install eris
```

**3.ソースコードを書いていく**
適当な名前のjsファイル(例:index.js)を作成する

```index.js
const Eris = require("eris");

// botのトークンID
var bot = new Eris("BOT_TOKEN");

bot.on("ready", () => {
  // botの準備できたら呼び出されるイベント
  console.log("Ready!");
});


bot.on("voiceChannelJoin", (member, newChannel) => {
  // 入室処理
  let ch = newChannel.guild.defaultChannel;
  console.log("%s が チャンネル %s に入室しました。", member.username, newChannel.name);
  bot.createMessage('Channel ID', member.username + "が チャンネル[" + newChannel.name + "] に入室しました");
});

bot.on("voiceChannelLeave", (member, oldChannel) => {
  // 退室処理
  let ch = oldChannel.guild.defaultChannel;
  console.log("%s が チャンネル %s を退室しました。", member.username, oldChannel.name);
  bot.createMessage('Channel ID', member.username + "が チャンネル[" + oldChannel.name + "] を退室しました。");
});

// Discord に接続します。
bot.connect();
```

**BOT_TOKEN**には先程のアプリの名前などを設定できるページを開いてサイドにあるSetting欄のBOTをクリックしてAdd Botをクリックした後、
Click to Reveal Tokenを押してcopyして貼り付けてください。

**注意:このTokenは絶対に他人に教えないでください!!**

入室処理にある**Channel ID**のところには[こちら](https://support.discordapp.com/hc/ja/articles/206346498-%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC-%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8ID%E3%81%AF%E3%81%A9%E3%81%93%E3%81%A7%E8%A6%8B%E3%81%A4%E3%81%91%E3%82%89%E3%82%8C%E3%82%8B-)を参考にしてIDを取得して貼り付けてください。
退室処理のところも同様です。

ここまでできたら保存して以下のコマンドを実行してください。

```
node index.js
```

成功すると**Ready!**と表示されます。

実際にDiscordでボイスチャンネルに入退室して任意のテキストチャンネルで通知がこれば完成です。