OmniAICreator/Qiita-1.07M huggingface dataset:
Kotlin で文字列から URL を抽出する

## 概要
- Kotlin の Regex クラスと正規表現で URL の文字列を抜き出す。

## サンプルコード

```kts
// 文字列からURL文字列を抽出する
fun extractURLs(text: String): List<String> {
    // 正規表現は一例。状況に応じてもっと良いのがあればそれを。
    val regex = "(http://|https://){1}[\\w\\.\\-/:\\#\\?\\=\\&\\;\\%\\~\\+]+"
    val urls = regex.toRegex(RegexOption.IGNORE_CASE).findAll(text).map{it.value}
    return urls.toList()
}

// テストケース
val testCases = listOf(
    "hello, world", // URLが0個
    "goodbye https://example.com", // URLが1個
    "konichiwa https://example.com:80/ http://example.com/foo?q=%E3%81%82#hello", // URLが2個 (ポート番号やパラメータ)
    "sayounara https://example.com/ http://example.com/?a=b&c=d https://example.com/" // URLが3個 (同じURLが2個+1個)
)

// テストケースの文字列からURLを抽出する
for (case in testCases) {
    println("----------------------------------------")
    println("Test case: " + case)
    val urls = extractURLs(case)
    println("Number of matched: " + urls.size)
    for (url in urls) {
        println("URL: " + url)
    }
    println()
}
```

## 実行結果

```
$ kotlinc -script extract_urls.kts 
----------------------------------------
Test case: hello, world
Number of matched: 0

----------------------------------------
Test case: goodbye https://example.com
Number of matched: 1
URL: https://example.com

----------------------------------------
Test case: konichiwa https://example.com:80/ http://example.com/foo?q=%E3%81%82#hello
Number of matched: 2
URL: https://example.com:80/
URL: http://example.com/foo?q=%E3%81%82#hello

----------------------------------------
Test case: sayounara https://example.com/ http://example.com/?a=b&c=d https://example.com/
Number of matched: 3
URL: https://example.com/
URL: http://example.com/?a=b&c=d
URL: https://example.com/
```

### 今回の環境

```
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.14.2
BuildVersion:	18C54

$ kotlinc -version
info: kotlinc-jvm 1.3.11 (JRE 11.0.1+13-LTS)
```

## 参考資料

- [toRegex \- Kotlin Programming Language](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/to-regex.html)
- [Regex \- Kotlin Programming Language](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex/index.html)
- [RegexOption \- Kotlin Programming Language](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/-regex-option/index.html)
- [Java 文字列内のURLをリンクに変換 – Chat&Messenger 無料](https://chat-messenger.com/blog/java/geturl-link-from-string)
- [\[ヅ\] JavaでテキストからURLを抽出する正規表現 \(2010\-01\-13\)](http://www.nilab.info/z3/20100113_zlashdot_001094.html)
- [Java \- Kotlinの正規表現を使って文字列からURLを抜き出したい。｜teratail](https://teratail.com/questions/155175)
AtCoder 過去問精選 10 問 を Ada で解いてみる

#はじめに
タイトルの通りですが、受験生なもので、勉強の合間にやりたいと思います。
そのため随時更新していく形になりますがなにとぞよろしくお願いします。

[「AtCoder に登録したら次にやること ～ これだけ解けば十分闘える！過去問精選 10 問 ～」](https://qiita.com/drken/items/fd4e5e3630d0f5859067)

こちらの記事の問題をAda言語で10問解いていこうと思います。

#環境
 - OS : Windows10
 - IDE : GNAT community 2018

## 第１問 : [ABC 086 A - Product](https://beta.atcoder.jp/contests/abc086/tasks/abc086_a) (100 点)

```
with Ada.Text_IO;
with Ada.Integer_Text_IO;

procedure main is

   a, b : Integer;

begin

   Ada.Integer_Text_IO.Get(a, 0);
   Ada.Integer_Text_IO.Get(b, 0);

   if ( (a * b) rem 2 ) = 0 then
      Ada.Text_IO.Put_Line("Even");
   else
      Ada.Text_IO.Put_Line("Odd");
   end if;

end main;

```

## 第 2 問:  [ABC 081 A - Placing Marbles](https://beta.atcoder.jp/contests/abc081/tasks/abc081_a) (100 点)
```
with Ada.Text_IO;
with Ada.Integer_Text_IO;

procedure main is
   
   s : String (1 .. 3);
   last : Natural;
   counter : Integer := 0;
   
begin
   
   Ada.Text_IO.Get_Line(s, last);
   
   if(s(1) = '1')then
      counter := counter + 1;
   end if;
   
   if(s(2) = '1')then
      counter := counter + 1;
   end if;
   
   if(s(3) = '1')then
      counter := counter + 1;
   end if;
   
   Ada.Integer_Text_IO.Put(counter, 0);
   
end main;
```
## 第 3 問:  [ABC 081 B - Shift Only](https://beta.atcoder.jp/contests/abc081/tasks/abc081_b) (200 点)
## 第 4 問:  [ABC 087 B - Coins](https://beta.atcoder.jp/contests/abc087/tasks/abc087_b) (200 点)
## 第 5 問:  [ABC 083 B - Some Sums](https://beta.atcoder.jp/contests/abc083/tasks/abc083_b) (200 点)
## 第 6 問:  [ABC 088 B - Card Game for Two](https://beta.atcoder.jp/contests/abc088/tasks/abc088_b) (200 点)
## 第 7 問:  [ABC 085 B - Kagami Mochi](https://beta.atcoder.jp/contests/abc085/tasks/abc085_b) (200 点)
## 第 8 問:  [ABC 085 C - Otoshidama](https://beta.atcoder.jp/contests/abc085/tasks/abc085_c) (300 点)
## 第 9 問:  [ABC 049 C - Daydream](https://beta.atcoder.jp/contests/abc049/tasks/arc065_a) (300 点)
## 第 10 問:  [ABC 086 C - Traveling](https://beta.atcoder.jp/contests/abc086/tasks/arc089_a) (300 点)

#おわりに
センター試験やってる場合じゃねぇ!
このプロジェクト、なんの言語で書かれてるんや

#ってなることが多いのでツール作った

#背景
Githubには様々なコードが置かれていて、大変参考になります。
その反面、いろいろ置かれすぎていて、なんの言語で書かれているかを確認するだけでも
ちょっと疲れてしまいます。
そんな時に、GithubのURLを入力するだけで、なんの言語で書かれているかを
概観できるツールが欲しくなった。

ツールは[こちら](https://github.com/iaoiui/WhatLanguageTheyUse/blob/master/README.md)

# 実現方法
完璧なものでなくていいので、拡張子を判断材料とした。
ファイル全ての拡張子を頻出順にソートして出力することで、
だいたい何の言語で書かれているかわかるじゃろ(適当)という発想



# 試してみた
この[Moby](https://github.com/moby/moby)っていうプロジェクトは何の言語で書かれているんじゃろ?
<img width="1436" alt="Screen Shot 2019-01-02 at 19.11.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/94861/d82bc9d7-461e-596b-982d-3a7490722d84.png">

ぱっと見ても分からなすぎて、ページを閉じたくなります。
ツールを使ってみると下記の結果が得られます。


```:実行結果
sh run.sh https://github.com/moby/moby
Cloning into 'moby'...
remote: Enumerating objects: 6552, done.
remote: Counting objects: 100% (6552/6552), done.
remote: Compressing objects: 100% (5734/5734), done.
remote: Total 6552 (delta 766), reused 2995 (delta 437), pack-reused 0
Receiving objects: 100% (6552/6552), 9.17 MiB | 886.00 KiB/s, done.
Resolving deltas: 100% (766/766), done.
4744 go
 219 md
  89 proto
  46 s
  21 sh
  15 c
  13 pem
  13 conf
  10 sample
  10 json
   9 tar
   9 png
   8 installer
   5 txt
   3 yml
   3 rc
   3 ps1
   3 docs
   3 code
   2 yaml
   2 vim
   2 markdown
   2 h
   1 windows
   1 validate
   1 tmPreferences
   1 tmLanguage
   1 sysconfig
   1 swagger-yamllint
   1 socket
   1 simple
   1 service
   1 rules
   1 rst
   1 rpm
   1 plist
   1 pack
   1 nanorc
   1 mc
   1 manifest
   1 mailmap
   1 integration-test-helpers
   1 integration-daemon-stop
   1 integration-daemon-start
   1 integration-daemon-setup
   1 initd
   1 idx
   1 ico
   1 gotmpl
   1 go-autogen
   1 gitignore
   1 febootstrap-minimize
   1 ensure-emptyfs
   1 e2e
   1 dockerignore
   1 detect-daemon-osarch
   1 default
   1 config
   1 confd
   1 binary-setup
   1 binary
   1 BSD
   1 APACHE
```

# まとめ
拡張子ついてないファイルが下の方に台頭していますが
goで書かれたプロジェクトといって良さそうです。
エンジニアになって3ヶ月だけどOSSにプルリクしてみました


OSSである[git-tips](https://github.com/isotai/git-tips)のReadMeへのコントリビューションをした際の記録です。

# プルリクを出すOSSを決める

以下の記事を参考にスターの多い順番でGitHub見て回りました。
https://qiita.com/yhay81/items/3773ab2e001a9e39ccc8
スターの多い順検索：
https://github.com/search?utf8=%E2%9C%93&q=stars%3A%3E10000&type=Repositories

中国語、韓国語、タイ語など各国ドキュメントが揃っているのに日本語はすくないですね。

OSSによって翻訳の方法が異なるようなので
1.すでに何らかの言語に訳されいて翻訳方法が確立されていそう
2.数日で終わる分量
を基準にして探しました。

結果として各国翻訳されていますが日本語がなかった[git-tips](https://github.com/git-tips/tips)というgitコマンドが試せるツールのドキュメントを訳すことにしました。

![スクリーンショット 2019-01-02 17.50.26.png](https://qiita-image-store.s3.amazonaws.com/0/162167/fda7ee19-bf24-6f35-935d-8de8b5a0c412.png)

#修正方法を探る
git-tipsのReadMeやコントリビューションガイドには翻訳方法の記載はなかったため、過去のプルリクから翻訳に関するものを確認しました。

韓国とベトナムの方のプルリクがあったので見てみるとどうやら
1.git-tipsというリポジトリを作ってReadMEを翻訳する。
2.本家のリポジトリをフォークして、本家ReadMeに翻訳した自分のリポジトリにあるgit-tipsのReadMeへのリンクを追加してプルリクを出すという流れのようです。
![スクリーンショット 2019-01-02 18.00.18.png](https://qiita-image-store.s3.amazonaws.com/0/162167/4ae54986-6638-e7fd-0d82-2ade459ca916.png)

#翻訳する
やるのみです。


#プルリクを出す。
作法などわからないので怖さはありますが勢いで出します。

1. フォークした状態
![スクリーンショット 2019-01-02 15.02.01.png](https://qiita-image-store.s3.amazonaws.com/0/162167/de351781-a44a-5d8b-fac9-b9c3656cd4a3.png)

2. フォークしたのをローカルにクローン後修正して、そのままpushします。
![スクリーンショット 2019-01-02 15.03.53.png](https://qiita-image-store.s3.amazonaws.com/0/162167/a369bed1-0b26-6a01-83a4-76b8fc068bb5.png)

3. 左上のNew PullRequestを押すとマージ先を聞かれるので選択したあと、Create pull requestをクリック
![スクリーンショット 2019-01-02 15.04.49.png](https://qiita-image-store.s3.amazonaws.com/0/162167/f8f4d012-12d7-333e-bfa7-c69e82972841.png)

4. コメントを書きます
![スクリーンショット 2019-01-02 15.09.53.png](https://qiita-image-store.s3.amazonaws.com/0/162167/8dad9288-fa6b-1fc0-7457-8e08355fe1e7.png)

5. 変更はリンクを追加しているだけなのでこれだけです。
![スクリーンショット 2019-01-02 15.10.12.png](https://qiita-image-store.s3.amazonaws.com/0/162167/b47cacfa-de63-5542-94e5-0672c040245b.png)

6. Done
![スクリーンショット 2019-01-02 15.11.15.png](https://qiita-image-store.s3.amazonaws.com/0/162167/5708ef79-a9c8-ff50-174a-1f8c4cb41bdb.png)

# その後
無事マージしてもらえました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162167/0df67244-bfb3-be65-4e07-4c162b80036d.png)


スターつけてくれている方もいるようなのでやった意義がありました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162167/08fe8e13-31a4-34ea-ab9e-fc8da602940f.png)
julia Plots,gr()で凡例の位置

参考: [How to change legends place with Plots, gr() ?](https://discourse.julialang.org/t/how-to-change-legends-place-with-plots-gr/7294/4).
# 指定方法
```
using Plots
plot( rann(10,3), legend = :bottomleft )
```

使える記号
- `:right`
- `:left`
- `:top`
- `:bottom`
- `:inside`
- `:best`
- `:legend`
- `:topright`
- `:topleft`
- `:bottomleft`
- `:bottomright`

# グラフの外には出力できない !
`:outtoprint`は非対応
はやく対応してほしいなあ．
TypeScriptのコンパイル時のエラー対処法：「Expression has type `void`. Put it on its own line as a statement.」

## エラー文
```
Expression has type `void`. Put it on its own line as a statement.
```

## 解決法
[ここ](https://stackoverflow.com/questions/49599999/cannot-deploy-function-to-firebase)にもある通り、宣言されたものは基本的に何か値を返すことが、[void](https://qiita.com/Im0_3/items/2ebbee06b8ca293e26ba#void)型以外は必須。

つまり、自分の例では以下の通り。

こちらでは、`handleError()`が何も返さないが、

```before.ts
const render = (req, res) => {

  const handleError = (err) => {
    if (err.url) {
      res.redirect(err.url);
    } else if (err.code === 404) {
      res.status(404).send('404 | Page Not Found');
    } else {
      res.status(500).send('500 | Internal Server Error');
    }
  }

  const context = { url: req.url }

  renderer.renderToString(context, (err, html) => {
    if (err) {
      return handleError(err);
    }
    res.end(html);
  })
}
```

以下のように、`handleError()`に`return`を与える必要がある。

```after.ts
const render = (req, res) => {

  const handleError = (err) => {
    if (err.url) {
      return res.redirect(err.url);
    } else if (err.code === 404) {
      return res.status(404).send('404 | Page Not Found');
    } else {
      return res.status(500).send('500 | Internal Server Error');
    }
  }

  const context = { url: req.url }

  renderer.renderToString(context, (err, html) => {
    if (err) {
      return handleError(err);
    }
    res.end(html);
  })
}
```
RakWireless 化粧箱　中紙製作

RakWirelessの化粧箱(ギフトボックス￥）が段ボールからプラスティックに変わりました。
しかし、入っている紙が、あまり意味がありません。
STマイクロのSTM32のブリスターのようにピンの仕様など使える資料が良いと思いましたので、作ってみました。
というか・・・作ることになったのは僕が、この紙に対して「センス無い」とYUKIに言ったのが原因です。
YUKIからは、だったら作りなさいという事を言われたので、時間が取れる正月に作ってみました。
別段特殊な事をしているわけではなく、マニュアルから必要そうなところを抜き出しただけです。

でも、これがあるかないかで全く違いますね・・・
![Rak-giftbox-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/8103dc93-3cd6-6603-b7ea-10480f0dd942.jpeg)
![Rak-giftbox-1-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/a35ab456-1cb3-1f82-6036-269b804b998d.jpeg)
![Rak-giftbox-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/285344/c0c17207-25df-911a-0f7c-ce84f423958c.jpeg)
Rails4.1から4.2へのアップデートでハマったActiveRecordの謎挙動

一言でまとめると、__integerなどの数値系のカラムに空文字を代入しないこと__。
以下、平成も終わるというのに未だにRails4.1で疲弊している男のつぶやきです。

---

こんな感じの商品テーブルがあるとします。

```ruby
create_table :products do |t|
  t.string :name, null: false, default: ''
  t.integer :price, null: false, default: 0
  t.timestamps null: false
end
```

`default: 0` が設定されているのでnewするとpriceは0です。

```ruby
product = Product.new
product.price # => 0
```

ここで空文字を代入してみます.

```ruby
product = Product.new
product.price = ''
product.price # => nil
```

ふむふむ、空文字はnilとして評価されて、デフォルト値の0から変更されている(ように見えます)。
`null: false`なのでこのままでは保存できないのかなと思いきや...

```ruby
product.price # => nil
product.changes #=> {} ???
product.save #=> true ????
product.price # => 0 ?????
```

一瞬priceがnilになっていたのに、changesが更新されておらず、priceはデフォルトの0のままで保存されるというのが、今回紹介したい謎挙動です。
Rails4.2にアップデートした時に、このバグのような挙動を前提にしていたコードが動かなくなってハマりました。

Rails4.2以降だと、普通にchangesが更新されます。

```ruby
product = Product.new
product.price = ''
product.price # => nil ここまでは同じ
product.changes # => {"price"=>[0, nil]} ちゃんと0→nilに更新されている
product.save # => null: falseなのでちゃんとraiseする
```

空文字以外の文字列は`to_i`された結果が入るので問題無いようでした。

```ruby
product = Product.new
product.price = '1'
product.price # => 1
product.changes # => {"price"=>[0, 1]}
```

integerだけでなく、decimalやfloatでも同様の挙動を示します。
今回は`write_attribute`をoverrideして、数値系カラムに空文字を代入している箇所をログ出力し、コードを修正してから再度アップデートにチャレンジすることになりました。

```ruby
class ActiveRecord::Base
  def write_attribute(attr_name, value)
    column = self.class.columns.find { |c| c.name.to_s == attr_name.to_s }
    if column && column.type.in?(%i[integer decimal float]) && value == ''
      Rails.logger.warn "Deprecated: assigning blank string into #{column.type} column. #{caller.first}"
    end
    super
  end
end
```

callerメソッドって初めて使いましたが便利ですね。


5.2への道のりは長い...
DockerComposeでRails環境を構築する際に利用するコマンドたち

インフラは苦手だけどRails環境を整えたい！
DockerでRails環境を作ろう系の記事を読んで作ってみたけど途中で動かなくなった！
みたいなインフラアレルギー持ちのプログラマ向けの記事です。

「Dockerで Ruby on Rails の環境を作ってみた」系の記事は既にいくつかあるものの、状況によって実行するべきコマンドが違うみたいで非常にややこしい。私の頭が弱すぎるのが悪い？そんな馬鹿な。
「とにかくプログラミングがしたいだけなのになんで環境作りで躓かないといけないんだ！俺はもうLAMP環境に帰らせてもらうぞ！」と死亡フラグを立ててしまわない為に、各コマンドを実行する目的を整理しておくことにしました。

全体的なセットアップ手順や詳細は下記の記事を参考にしています。
この記事では補足的な内容しか取り扱いません。
Rails環境を構築したことがないぞって人はまずは先人の記事を読んできましょう。

[DockerでRuby on Railsの環境構築【初心者向け】](https://student-engineer.net/docker-rails/)
[新規Railsプロジェクトの作成手順まとめ](https://qiita.com/yuitnnn/items/b45bba658d86eabdbb26)

自分なりに調べた結果の解釈を添えてありますが、間違っている箇所があればご指摘をお願いします。
アレルギー持ちの人間は時として常軌を逸する解釈をしたりします。助けてスーパーインフラエンジニア。

## コンテナ作成時

```
$ docker-compose build
```

Dockerfileとか設定ファイルの準備が終わったらこのコマンドを実行する。
LAMP環境とか作る時と変わらないのでつまづく心配はないと思う。
ここでつまづくならとりあえずDockerComposeの使い方を調べてこようか。

## コンテナ起動時

```
$ docker-compose up -d
```

これも同じく。
コンテナがうまく起動していない、すぐに落ちてしまう。
なんて時はオプションの -d を外してログを確認してみよう。
エラー内容で検索すれば大体なんとかなる。

## Gemfileからプロジェクトを作る時に実行するやつ

```
$ docker-compose run web rails new . --force --database=mysql
```

DockerでRailsの環境を作ろうぜ！系の記事には絶対書いてあるこれ。完全なる罠である。
既に完成済みのRailsプロジェクトをGitから落としてきて環境だけ作りたいって時にはいらないコマンド。

数日前に作ったコンテナを作り直そうって時に何も考えずに実行しちゃって意味わからないことになったりもするんじゃないかな？私はなりました。

本当にイチからRailsのプロジェクトを作ろうって時にだけ実行しましょう。
これを実行するとGemfileを元にプロジェクトに必要なファイルたちがいい感じで作成される。たぶん。おそらく。

## DBのスキーマを作成する場合

```
$ docker-compose run web rake db:create
```

Railsプロジェクトの設定を元にデータベースのスキーマを作ってくれる。
既にスキーマを作成済みの場合はもちろん実行する必要はない。

DBの作成に失敗しているのに何も言ってくれなかったりする。恐ろしい。
完了メッセージが表示されない限り誰も信じるな。何なら自分でDBの中身を確認しに行け。

## DB構造やデータを初期化する場合

```
$ docker-compose run web rake db:reset
$ docker-compose run web rake db:migrate
```

いざコンテナが立ち上がってWebサイトにアクセスした際に「マイグレーションが終わってないよ！」みたいなエラーがでる場合がある。
たぶんこのコマンドを実行したら解決すると思う。既にあるデータは丸っと消されるので注意。

手動でDBの中身を色々いじりまくって訳わからなくなった時にも使える子。
DBを初期化したいな！初期に用意したデータにだけ復活してもらいたいな！って時はこれしましょう。

## コンテナを停止する時

```
$ docker-compose down
```

LAMP環境とかだとstopコマンドを使ってたと思うけど、それだとキャッシュが残って面倒くさいことになるらしい。
Rails環境ではstopコマンドの存在は忘れてください。

## downで停止したコンテナを再起動する時

```
$ docker-compose up -d
```

downで停止したコンテナを再起動したい時。いつもと同じである。
ちゃんとルールを守ってコンテナを停止したなら何の問題もないよね？

## stopで停止しちゃったコンテナを再起動する時

```
$ rm tmp/pids/server.pid
$ docker-compose up -d
```

downで止めろと言われても、手癖でstopを実行してしまう時もあるものです。
そんな時はキャッシュファイルを削除してから起動してやりましょう。
キャッシュファイル名を覚えるのは面倒くさいからdownで止めた方が楽だね。そう思ったキミはもう間違えることはないだろう。数日間は。
dionaea（ハニーポット）を立てる

# dionaeaとは
[公式ドキュメント](https://dionaea.readthedocs.io/en/latest/introduction.html)
> dionaea intention is to trap malware exploiting vulnerabilities exposed by services offerd to a network, the ultimate goal is gaining a copy of the malware.

つまりは公開された脆弱性を悪用するマルウェアの取得を目的としたハニーポットです。


# 環境
* さくらのVPS
  * ゾーン: 石狩第1ゾーン
  * メモリ: 1 GB
  * ストレージ: SSD 30 GB
  * CPU: 2 コア
* Ubuntu 16.04 amd 64
  * スタートアップスクリプト: [public] Ubuntu_Setup

# 1. dionaeaのインストール
以下のコマンドを実行して、dionaeaをインストールします。

```shell
$ git clone https://github.com/DinoTools/dionaea.git
$ cd  dionaea
$ sudo apt install build-essential cmake check cython3 \
     libcurl4-openssl-dev libemu-dev libev-dev libglib2.0-dev \ 
     libloudmouth1-dev libnetfilter-queue-dev libnl-3-dev \ libpcap-dev     
     libssl-dev libtool libudns-dev python3 python3-dev \
     python3-bson python3-yaml ttf-liberation
$ cd build
$ cmake -DCMAKE_INSTALL_PREFIX:PATH=/opt/dionaea ..
$ make
$ sudo make install 
```

# 2. iptables（ファイヤーウォール）の設定
以下のコマンドで必要なポートを解放しました。

```shell
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 20 -j ACCEPT
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 21 -j ACCEPT
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 42 -j ACCEPT
$ sudo iptables -I INPUT 5 -p udp -m udp --dport 69 -j ACCEPT
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 80 -j ACCEPT
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 81 -j ACCEPT
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 135 -j ACCEPT
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 445 -j ACCEPT
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 1433 -j ACCEPT
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 1723 -j ACCEPT
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 1883 -j ACCEPT
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 3306 -j ACCEPT
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 5060 -j ACCEPT
$ sudo iptables -I INPUT 5 -p udp -m udp --dport 5060 -j ACCEPT
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 5061 -j ACCEPT
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 27017 -j ACCEPT
```


# 3. dionaeaの起動
以下のコマンドでdionaeaを起動します。

```shell
$ sudo /opt/dionaea/bin/dionaea -D \
    -c /opt/dionaea/etc/dionaea/dionaea.cfg
```

# 4. 蜜によってきた輩の取得
以下のディレクリにいろいろなログ等が追加される。

> *  /opt/dionaea/binaries/
* /opt/dionaea/log/
* /opt/dionaea/rtp/
* /opt/dionaea/wwwroot/

[こちら](https://www.morihi-soc.net/?p=96)の記事が詳しくまとめられている。


# 参考
* [Introduction &mdash; dionaea 0.8.0 documentation](https://dionaea.readthedocs.io/en/latest/introduction.html)
* [Installation &mdash; dionaea 0.8.0 documentation](https://dionaea.readthedocs.io/en/latest/installation.html)
* [ハニーポット観察記録(9)](https://www.morihi-soc.net/?p=96)
RSpecでActionMailerのテストをシンプルに書けるgem作った

featureテストなどで、メール送信を含む一連のアクションをテストしたい時、毎回こういうことやってました。

```ruby
before do
  ActionMailer::Base.deliveries.clear
end

it do
  # 〜なんかテキトーな処理〜

  expect(ActionMailer::Base.deliveries.first).to be_present
  expect(ActionMailer::Base.deliveries.first.to).to include 'to@example.org'
end
```

あるアクションで送信されるメールが一通なら`first`で大丈夫ですが、ユーザーと管理者にそれぞれ送っている場合、送る順番が変わると`first`で取れないので`find`とかで配列操作したりして、結構面倒でした。
また、`ActionMailer::Base.deliveries.clear`を忘れると別のテストで送ったメールが残っていたりして、「なぜか関係ないメールが送られてる？？？」となることもありました。

そこで、とりあえず何か処理したらそれによって意図したメールが送られているか、それだけのテストをシンプルに書けるように、RSpecの抹茶を作ってみました。

https://github.com/d-mato/rspec-mailer_matcher

READMEそのまんまですが、こんな感じで`expect`にblockを渡します。

```ruby
it 'メールが送られる' do
  expect {
    # 〜なんか素敵な処理〜
  }.to deliver to: 'to@example.org', subject: 'Hello world'
end
```

`subject`と`is_expected`を使うと更にシンプルに。

```ruby
subject {
  proc { # 〜なんか素敵な処理〜 }
}

it { is_expected.to deliver to: 'to@example.org', subject: 'Hello world' }
```

比較対象として`to`と`subject`、`from`が使えます。完全一致するメールがある場合のみTrueとなります。

```
it { is_expected.to deliver to: 'to@example.org', subject: 'Hello world', from: 'from@example.org' }
```

gemを作って紹介記事まで書くのは初めてなので、アドバイスやご指摘など頂けるととっても嬉しいです。

以上、2019年の書き初めでした。
Whooshで全文検索

Whooshで全文検索してみました。

[Whoosh](https://bitbucket.org/mchaput/whoosh/wiki/Home)はピュアPythonな検索ライブラリです。

# Whooshのインストール

pipでインストールできます。

```
$ pip3 install whoosh
```


# 英語のテキストを登録して検索

テキストを登録する。

```python:add.py
from whoosh.index import create_in                                                        
from whoosh.fields import *                                                               

schema = Schema(title=TEXT(stored=True), path=ID(stored=True), content=TEXT)              
ix = create_in("indexdir", schema)                                                        

writer = ix.writer()
writer.add_document(title=u"First document", path=u"/a",                                  
                    content=u"This is the first document we've added!")                   
writer.add_document(title=u"Second document", path=u"/b",                                 
                    content=u"The second one is even more interesting!")                  
writer.commit()
```


テキストを検索する。

```python:search.py
from whoosh.index import open_dir                                                         
from whoosh.fields import *
from whoosh.qparser import QueryParser                                                    

schema = Schema(title=TEXT(stored=True), path=ID(stored=True), content=TEXT)              
ix = open_dir('indexdir')                                                                 

with ix.searcher() as searcher:                                                           
  query = QueryParser("content", ix.schema).parse("first")                                
  results = searcher.search(query)
  print(results)
  for r in results:
    print(r)
```

実行してみた。

```
$ python3 add.py 
$ python3 search.py
<Hit {'path': '/a', 'title': 'First document'}>
```

検索用のindexは指定したディレクトリに作成される。

```
$ ls indexdir/
MAIN_WRITELOCK  MAIN_nhzytp3bq1twwpkx.seg  _MAIN_1.toc
```
Twitter12周年！だけどリプの仕組みがどこでチェーンするのか理解できずに途方にくれる初心者ユーザー‥ #UI #UX つらいよ‥


- Twitterのリプライの仕組みめちゃくちゃ難しい
- UI UX 的に｢どっちに何をつけたら、どう返信がコンボするの？｣が全然分からないし,2時間考えても直感的に分からないし、何度でも間違う自信がある
- Twitterで｢串方式じゃないリプライ｣をつけて他のユーザーに迷惑をかけてしまったのをUI のせいにするのは日本人的なマナーに反すると思うけどとにかく本当に理解できない‥むずい



# @Twitter 12th! but reply chain feature is to difficult to beginner user is me

# In  Web UI with Google Chrome

chainged blue line

![image](https://user-images.githubusercontent.com/13635059/50585599-1f659380-0eb9-11e9-90f6-9b0411c40b56.png)

https://twitter.com/sharara1998/status/1080387116599730178

# But this URL

not chainged

![image](https://user-images.githubusercontent.com/13635059/50585634-5045c880-0eb9-11e9-9f52-a7f2eed92a6d.png)

https://twitter.com/YumaInaura/status/1080389129869783040

# Two replay form is there

![image](https://user-images.githubusercontent.com/13635059/50585683-90a54680-0eb9-11e9-9621-51f3918070f0.png)
![image](https://user-images.githubusercontent.com/13635059/50585684-913ddd00-0eb9-11e9-97b9-c5406c7e927f.png)

# Which should i use?

- I dont under stand which is like "Proxy" chained replay
- Im thinking abount an hour but i dont understand
- Actually my understanding Twitter skill is too low but i maybe never unstand reply feature with this UI..........

# UX

- I use stand before "No See Form" for replay
- Twitter dear other users feel "Too noisey" my replay
- But im not unerstanding "What is not noisey reply chain" 

![image](https://user-images.githubusercontent.com/13635059/50585770-eda0fc80-0eb9-11e9-8736-f5118a678e33.png)

# TL DR Japanese 

https://github.com/YumaInaura/YumaInaura/issues/187

---

https://github.com/YumaInaura/YumaInaura/issues









<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
React Reduxでコンポーネント間の値共有を行う場合のメモ

## 概要
新年早々にReact Reduxを試してみたいと思い立ち、いろいろ調べる中でふとコンポーネント間の値共有ってどうやるんだろうと思って作ってみたサンプルのメモです。なお、React Reduxの仕組み等々については@erukitiさんの記事[React+Redux入門](https://qiita.com/erukiti/items/e16aa13ad81d5938374e)や書籍 [React入門 React・Reduxの導入からサーバサイドレンダリングによるUXの向上まで]( https://amzn.to/2RsCKxt)を参考にするとよいと思います。
## 例題
下記のようにテキストボックスに入力するコンポーネント、入力した内容を表示するコンポーネントで分けたときに値の共有を行うサンプルを記載します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/32098/28025f85-8f87-b469-4590-a22338f9fbac.png)
## サンプルソース
###index.js
InputAppが入力部分、ViewAppが表示部分になります。

```index.js
import React from 'react';
import {Provider} from 'react-redux';
import {createStore} from 'redux';
import {render} from 'react-dom';
import inputReducer from './reducers/input';
import InputApp from './containers/InputApp';
import ViewApp from './containers/ViewApp';

const store = createStore(inputReducer);

render( 
  <Provider store ={store}>
    <InputApp />
    <ViewApp />
  </Provider >,
  document.getElementById('root')
);
```
###containers
```InputApp.js
import {connect} from 'react-redux';
import InputApp from '../components/InputApp';
import {inputName} from '../actions/input';

function mapStateToProps({name}) {
  return {name};
}

function mapDispatchToProps(dispatch) {
  return {
    inputName(name) { dispatch(inputName(name)); }
  };
}

export default connect(mapStateToProps, mapDispatchToProps)(InputApp);

```
```ViewApp.js
import {connect} from 'react-redux';
import ViewApp from '../components/ViewApp';

function mapStateToProps({name}) {
  return {name};
}

export default connect(mapStateToProps)(ViewApp);
```
###components
```InputApp.js
import React from 'react';

export default function InputApp({name, inputName}){
  return (
   <div>
    【名前】
       <input type ="text" onChange = {(e) => inputName(e.target.value)} />
   </div>
  );
}

```
```ViewApp.js
import React from 'react';

export default function ViewApp({name}){
  return (
    <div>
    【名前】{name}
    </div>
  );
}
```
###actions

```input.js
export const inputName = (name) => (
  { type: 'INPUT_NAME', payload: {name} }
);
```
###reducers
```input.js
const initialState = { name: ''};

export default function inputReducer(state = initialState, action) {
  switch (action.type) {
    case 'INPUT_NAME':
     return { ...state, name: action.payload.name};
    default:
     return state;
  }
}
```
Swiftで日付が過ぎた値を取り出す


今回は日付が過ぎているかどうかの値の判定の仕方について記載したいと思います。
この部分で僕自身が結構つまづいてもいたので、備忘録として残しておきます。

###値

```swift
var today:[String] = ["2018-12-10T10:30:00+09:00","2019-01-01T17:00:00+09:00","2019-01-05T19:00:00+09:00","2019-01-24T10:00:00+09:00","2019-01-25T19:30:00+09:00",]
//日付の値はString形式にしています
```

###現在の日付


```swift

// 現在の日付を作成
var today = Date()
print(today) //2019-01-02 07:44:17 +0000
```

※書式を合わせないと比較できないため、Dateオブジェクトを
dateFormatにて書式を整形してます。

```swift

let dateFormater = DateFormatter()
dateFormater.locale = Locale(identifier: "ja_JP")
dateFormater.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
let date = dateFormater.string(from: Date())

print(date)//2019-01-02T16:44:17+09:00

```

###メソッド

今回は**filter**を使ってみました。
filterは、条件にマッチした要素を取り出したい場合に使用します。

```swift

var array = [1,2,3,4,5]
var arrays = array.filter { $0 < 4 }
print(arrays) // [1,2,3,4]
```

以下のコードで日付が過ぎたものに対して取り出す条件式を書いています。

```swift

var today:[String] = ["2018-12-10T10:30:00+09:00","2019-01-01T17:00:00+09:00","2019-01-05T19:00:00+09:00","2019-01-24T10:00:00+09:00","2019-01-25T19:30:00+09:00",]

let dateFormater = DateFormatter()
dateFormater.locale = Locale(identifier: "ja_JP")
dateFormater.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ"
let date = dateFormater.string(from: Date())

today = today.filter { $0 > date }
print(today)
//["2019-01-05T19:00:00+09:00", "2019-01-24T10:00:00+09:00", "2019-01-25T19:30:00+09:00"]

```
下記参照
>https://developer.apple.com/documentation/swift/array/2994718-filter
脊柱管狭窄で、さらにコスパに敏感になった爆速希望のアジャイル開発エンジニア、シムシティの懐かしさ

脊柱管狭窄で、さらにコスパに敏感になった爆速希望のアジャイル開発エンジニア、シムシティの懐かしさ

# 歩けない

- 大阪梅田茶屋町エリアから出られない
- 友達と初詣に行く予定、親戚の実家に行く予定もキャンセルした
- ひたすらスタバとファミリーマートを往復するだけの日々、楽しい

# コスパを意識せざるをえない

- コンビニに行くかトイレに行くかだけでもめちゃくちゃ重要な選択肢になる、歩けないから
- 限られたリソースで移動距離を計算するようになる、結果、ほどんど移動しなくなったが、MacBookで勉強できる時間は大幅に増えたかもしれない
- コンビニでおでんを食べるときもコスパを意識して、熱すぎるので砕いて食べたりするようになった

[おでん yumainaura - Google Search](https://www.google.com/search?q=%E3%81%8A%E3%81%A7%E3%82%93+yumainaura&oq=%E3%81%8A%E3%81%A7%E3%82%93+yumainaura+&aqs=chrome..69i57j69i60l2.2762j0j7&sourceid=chrome&ie=UTF-8)

# 昔を思い出すシムシティをsfcでやってる時のような感覚

![image](https://user-images.githubusercontent.com/13635059/50585397-158f6080-0eb8-11e9-84ff-2c4e48cb0871.png)


- トイレにいくのにも街づくりとの計画性の兼ね合いを考えて、1秒1秒を争う感じだった
- この感覚はシュミレーションゲームをする人はよく覚える感覚らしい
- 日常生活全てがシムシティになっていく気がする、なかなか悪くない感覚ではある


---

https://github.com/YumaInaura/YumaInaura/issues

https://github.com/YumaInaura/YumaInaura/issues/186








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
低スペックマシンを子ども用マシンにする際のOS選定（ペアレントコントロール）

## 概要
低価格で子どもにプログラミングを教えるための
低スペックパソコンを提供したいと思い
いろいろ試した結果を共有いたします。

## 低スペックマシンの例

・CPU core2 メモリ最大２GB
・CPU core2　シングルコア メモリ最大 1.5GB
・USBブートできないやつ


## CPU core2 メモリ最大２GB

ここが最初で最大の分水嶺

ペアレントコントロールは、OS win10が安定と考える、、、
ブラウザの年齢制限もがっちりかけてくれる

### win10
システム要件
https://www.microsoft.com/ja-jp/windows/windows-10-specifications#primaryR2

### win10が入らない
最新の1805でデバイスの関係でwin10がインストールできないケースがあった
古い昨年のwin10インストールディスクでインストールできたが
更新をかけるとやはりエラーに、、、という現象があるので注意ください。

### win10以外
linuxのフリーOSなど、しっかり年齢制限をかけられるのが難しい
→そもそもペアレントコントロール機能がない
→ブラザアカウントでログイン状態なら監視できるがログアウトしたら駄目

chrome OS
→chrome OS(CloudReady.)を入れたパソコンではペアレントコントロールが有効にならなかった。
　（2018年末）

## CPU core2　シングルコア メモリ最大 1.5GB
ペアレントコントロールが効かないがブラザのみの動作なので
chrome OSが安泰な気がします。

ブラウジング、youtubeを見るくらいならこの機能で十分。

OSインストールが終わるとシャットダウン状態になるので
「これインストール終わった？」みたいになります。

また1.8HDD など、レアなHDDが必要なマシンに関してUSB上で動作するので
レアなHDDコストがかからない。

chrome OS
https://www.neverware.com/#introtext-3

## USBブートできないやつ
zorin lite 32bitが計量でDVD-ROMが読み込めるものは問題なく
動作するが、wifiデバイス認識しにくい
インストール時間がかかる。

アプリのインストール権限などはコントロールできる、、、

https://zorinos.com/

## まとめ

低スペックマシンを子ども用にしても
それなりにコストがかかってしまう
Input Backslash in JApanese. Mac Setttings has no setting.  Open Google IME Preference

Input Backslash in JApanese. Mac Setttings has no setting.  Open Google IME Preference

# in Mac setting? no !

NO There is not!
NO There is not!
NO There is not!

![image](https://user-images.githubusercontent.com/13635059/50585076-93eb0300-0eb6-11e9-818e-43cd7dd66e02.png)

# Open Google IME PReference

![image](https://user-images.githubusercontent.com/13635059/50585113-c563ce80-0eb6-11e9-921a-a3f03a034660.png)

https://github.com/YumaInaura/YumaInaura/issues/185
---

https://github.com/YumaInaura/YumaInaura/issues








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Azure DevOpsで無料リポジトリを使用する

# 概要
Microsoftが提供するクラウドサービス Azure DevOpsを利用してプライベートのリモートリポジトリを使用するときに引っかかったことのメモ。

サービスについてはこちら。
https://azure.microsoft.com/ja-jp/pricing/details/devops/azure-devops-services/ 

# やりたいこと
GitHubのようなプライベートなリモートリポジトリを無料で使用したかった。
検索した結果、Microsoftからリリースされているこのサービスに出会った。

## 環境
PC: Windows10
git: git for windows / git Extensions(git client)
PC → リモートリポジトリ へのアクセスは、 ssh による接続を行う。

## SSH接続までの準備(うろ覚え)
1. Azure DevOps の利用を開始する(microsoftアカウントを登録)
2. Projectを作成する
3. git Extensions(Putty)にてSSHアクセス用の公開鍵、秘密鍵を作成する。  
(Tools -> PuTTY -> Generate or import Key から作成可能)
4. 公開鍵 をAzure DevOpsのアカウントに登録する。  
(右上のアカウントアイコン -> Security -> SSH Public Keys に作成した公開鍵の中身をペーストし、Add)

SSH関係の設定手順はこちらにマニュアルあり
https://docs.microsoft.com/ja-jp/azure/devops/repos/git/use-ssh-keys-to-authenticate?view=vsts 

## リポジトリのクローン
あとはプロジェクトのClone用URLをコピーするだけで接続できると思ったがうまくいかなかった。

- Azure DevOps上で表示されるCloneURL  
ユーザー名@vs-ssh.visualstudio.com:v3/ユーザー名/Organization名/Project名

これをgit Extentionsに入力してもエラーとなった。

- こうすることで解決  
ssh://ユーザー名@vs-ssh.visualstudio.com:22/Organization名/_ssh/Project名

一度 ssh:// から始まるURLでリモートリポジトリの設定をしたら、  
ユーザー名@・・・のURLでもリモートに接続できるようになった。
原因はよくわからないが、たぶんgit Extensions側の問題？
Englis - 大量爆速アウトプットするエンジニア勉強！ Mac Bookが手元にない時に出来ること

# Many outputs trial for engineer studying! Things you can do when have no MacBook time

# 大量爆速アウトプットするエンジニア勉強！ Mac Bookが手元にない時に出来ること

# iPhone

- Twitter favo / emoji reaction comment / reply but easy typing only
- Take a note of new ideas for next outputting with MacBook Keyboard
- Take a Photo for will new born articles next is like sketching 

# Minfulness and body and Yoga Strech

- Take a Mindfulness breath feel body sense
- Do "ずぼら" Relaxing Yoga means super special light Yoga or STrech

![image](https://user-images.githubusercontent.com/13635059/50584915-b3356080-0eb5-11e9-823d-42b20806e9d1.png)

---

https://github.com/YumaInaura/YumaInaura/issues

https://github.com/YumaInaura/YumaInaura/issues/184








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
麻雀の点数判定アプリを作る#1

#昨年こんなアプリがリリースされました
[麻雀の得点計算が簡単に！「麻雀カメラ」iOS向けに配信開始]
https://game.watch.impress.co.jp/docs/news/1129819.html

「麻雀のルールは知ってるけど点数計算はよく分からない」
「満貫以上の点数なら分かる」
そんな麻雀ビギナーあるあるがこれで解消されるなあと思ったんですが，精度が非常に悪いと不評で，App Storeの評価値は1.7/5となっています．これはひどい．

#じゃあもっと精度のいいアプリ作ります
開発ど素人の僕ですが，「麻雀カメラ」は画像から牌を検出し，役や点数を判定するアルゴリズムに入力しているんだなーくらいの検討はつきます．OpenCVの画像認識は少し触ったことがあったので，頑張れば僕でも作れるんじゃないかと開発に乗り切りました．後に分かるのですが，ど素人の僕にはここで地獄の蓋が開いたとは分かりません．

#おおよその見当と流れ 
- 
OpenCVで和了画像読み取り
    - 前処理を行い個々の牌の輪郭検出
    - 配列に格納し点数計算アルゴリズムに入力する
- 受け取った配列を基本和了形である4面子1雀頭に変形
    - 条件分岐を用いて役と点数を判定
    - 画像からは得られない偶然役を付加するコンフィグを設定

漠然極まりないけれど，この土台は変わらないはず．
次回より，細かい部分を見ていくことにする．

※2019/01/09追記
現在は異なる手法で開発を進めていますが，備忘録として当時考えていたことをまとめています．追いつくにはもう少し時間がかかりそうです．

#麻雀が分からない方のために
[麻雀ルール]https://ja.wikipedia.org/wiki/麻雀のルール
Wikipediaのリファレンスが分かりやすいので参考になります．
今後，麻雀用語がかなりの頻度で登場することが想定されますので一読されることをお勧めしますが，一度で理解することは困難と思います．ゆえに，そういった方でも僕の思考過程や試行の意図が分かるような記述を心がけます．
Footerの下の余白

こんにちは、coding初心者です。
Footerの下に余白ができ、どうしても取れません。
解決策をご享受していただければと思います
<img width="1280" alt="スクリーンショット 2019-01-02 0.31.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/324727/551bd908-d797-2704-bf3e-163724f11a3e.png">
【Ruby】数値型と文字列型の変換、連結

下記の通り、文字列型と数値型の「12345」を定義します。

```ruby.rb
str = "12345"
int = 12345
```

##文字列 → 数値へ変換
上記で定義した文字列型の「12345」を数値型へ変換します。
文字列型→数値型への変換はto_iを使用します。

```ruby.rb
#文字列 → 数値
puts str.to_i
```
##数値 → 文字列へ変換
数値型の「12345」を文字列にしてみましょう。
数値型→文字列型への変換はto_sを使用します。

```ruby.rb
#数値 → 文字列
puts int.to_s
```
##数値へ変換して連結
先程、文字列型→数値型へ変換した「12345」に「67」を加えます。

```ruby.rb
#文字列 → 数値
puts str.to_i + 67
```
実行すると、数値型同士の足し算になるので12345+67=12412がstr.to_iに入ります。

```ruby.rb
#数値同士の計算
12412
```
##文字列へ変換して連結
数値型→文字列型へ変換した「12345」に「67」という文字列を加えます。

```ruby.rb
#文字列 → 数値
puts int.to_s + "67"
```
実行すると、文字列同士の結合になるので「1234567」の文字列がint.to_sに入ります。

```ruby.rb
#文字列が連結される
1234567
```
EmacsLisp弱者のためのオレオレカスタマイズ: キーボードマクロは便利です

# はじめに
私はEmacsが好きです. 
Emacsなしで文章をしたためることに抵抗を覚えてしまう、典型的なEmacserです.
もちろん、`init.el`は散々弄っています. ええ、もちろん.

**しかし、自分で関数を定義してどうこう、、、ということはあまりしていません.**
**何故ならEmacsLispが苦手だからです.**

もちろん勉強しようとはしましたよ.
しかし、いくらEmacsのためとはいえ、Emacs以外で特に用途のない言語を勉強しようというモチベーションが、、、ごにょごにょ、、、

まあ確かに、関数型言語の勉強の足しに、というお題目を掲げることはできますが、でも仕事でそんなに使うこともないし、どうせ勉強するんなら括弧おばけがない言語で、、、ごにょごにょ、、、

...

そもそも標準関数を操れるだけで十分だし！どうせ欲しいと思ったものは大方`melpa`に転がってるし！
と思っていました. 

**しかしながら、怠惰欲には限りがありません. 正月ですから.**
パッケージにするほどのことでもない細々とした操作を関数にまとめたくなりました. 
でもそのためにElispを勉強するモチベは湧きません. **なんたって正月ですから.**

> その程度勉強すればいいじゃない、とお思いでしょうが、Elispというのは常日頃から触るものではないのです. Emacsのお手入れをするのは暇を持て余す長期休みくらい. 年に数回くらいしか触らない言語仕様は、海馬にも大脳皮質にも留まってはくれません. とほほ、、、

という私のような怠惰なあなたのために、本題に入ります.

# キーボードマクロ
Emacsにはキーボードマクロという便利な機能があります. Vimにもあるはず.
キーの動作を記録してマクロとして保持する機能です.

使い捨てなので関数を作成する程でもないけど、ちょっと繰り返し実行したいコマンドがあるんだけどね、的なニーズにがっつり応えてくれます.

**キーボードマクロ記録開始は`C-x (` . キー操作を実行し、`C-x )`で記録です.**
**マクロを実行するには `C-x e` です. そのあと`e`を連打すればさらにマクロを実行します.**

たとえば、

```text
emacs, emacs, yes! emacs!
emacs, emacs, love! emacs!
emacs, emacs, peace! emacs!
```

を行ごとに括弧でくくりたいとします:

```text
(emacs, emacs, yes! emacs!)
(emacs, emacs, love! emacs!)
(emacs, emacs, peace! emacs!)
```

これは `C-x (`  `C-a` `(`  `C-e` `)` `C-n` `C-x )` というマクロを作ればよいのです. 

カーソルを行の先頭へ移動 → (を入力 → 行末へ移動 → )を入力 → 下の行へ移動

という流れです. あとは `C-u 3 C-x e`でマクロを3回実行します. 
![Peek 2019-01-02 17-24.gif](https://qiita-image-store.s3.amazonaws.com/0/146775/c746998c-ff89-e44a-0aef-012524cc6e8d.gif)
完璧！！

もちろん3行くらいなら手でやれよ、と思うかもですが、これが100行あったらさすがに嫌になります.
でもこの程度の作業に別スクリプトをつくるのは癪ですね.
**キーボードマクロは「Emacs上の使い捨て関数」だと思っていただければ良いと思います.**

**さらに、\*scratch\*を利用した応用を理解するとさらに幅が広がります:**
![Peek 2019-01-02 10-31.gif](https://qiita-image-store.s3.amazonaws.com/0/146775/8625ab30-ca75-db2e-9396-c52137570789.gif)

**手入力ではなく、マクロを使用して連番を作成しています.** 
**Lisp Interaction Modeの\*scratch\*で順次1を加算しているのです.**
カーソル上の数字をコピー → \*scratch\*で1加算 → 結果を元バッファにヤンク → \*scratch\*バッファを整える
てな具合です.

ちょっと頭を働かせれば何でもできそうですね.
**「Emacsはエディタではなく環境」**という格言が身に沁みます.

# Elisp弱者の救世主: elmacro.el
もうなんとなくお察しだと思いますが、**キーボードマクロをElispに変換するパッケージがあります.**
るびきちさんのサイトが詳しいので、詳細はそちらでどうぞ:

[elmacro.el : キーボードマクロで超簡単に自作コマンドを作ろう！](http://emacs.rubikitch.com/elmacro/)

自分はこれで何がしたかったのかと言うと、**`M-u`と同じような感覚で単語の頭だけ大文字変換したかったのです.**
めでたく自分でElispを書くことなく解決することができました.
もちろん、Elispに変換しても大したことない関数なのですが、手前で書くよりも楽ちんなはずです.
ゴリゴリLisperの方も是非どうぞ.

これでElisp弱者にも希望が見えてきました. 良い正月になりそうです.
では皆様、よきEmacsライフを.
![Peek 2019-01-02 10-08.gif](https://qiita-image-store.s3.amazonaws.com/0/146775/305d3b33-5227-9bcd-09f6-c7f419f93f91.gif)
ghq利用時の新規gitレポジトリ作成

ghqでローカルリポジトリの管理をしていると、既存のリモートリポジトリを取ってくるのは楽なのですが、新規リポジトリを作ろうとすると若干面倒です。
そこで、新規リポジトリ作成→ghqの管理下に置く、という操作を簡略化するshell関数`ghq-new`を登録しておくと便利です。

https://blog.nishimu.land/entry/2015/03/12/193340 で既にやられている方がいましたが、`~/.ghq`以下に自分で`git init`したくない、`ghq get`でcloneした状態にしておきたい
、といった理由から別バージョンを作って使っています。

↓を`.bashrc`に書いておきます。

```sh
function ghq-new() {
    local REPONAME=$1

    if [ -z "$REPONAME" ]; then
        echo 'Repository name must be specified.'
        return
    fi

    local TMPDIR=/tmp/ghq_new
    local TMPREPODIR=$TMPDIR/$REPONAME

    mkdir -p $TMPREPODIR
    cd $TMPREPODIR

    hub init
    hub create

    local REPOURL=$(git remote get-url origin)
    local REPOPATH=$(echo $REPOURL | sed -e 's/^https:\/\///' -e 's/^git@//' -e 's/\.git$//' -e 's/github.com:/github.com\//')
    local USER_REPO_NAME=$(echo $REPOPATH | sed -e 's/^github\.com\///')

    ghq get $USER_REPO_NAME

    cd $(ghq root)/$REPOPATH

    rm -rf $TMPREPODIR
}
```

やっているのは↓です。
1. `/tmp` 以下に新規Repoを作成
2. そのディレクトリに移動して`hub create`
3. 作成されたgithubのリモートリポジトリを`ghq get`
4. `ghq get`でcloneしてきたローカルリポジトリに移動＆`/tmp`以下のリポジトリは削除

`REPOPATH`変数の部分が`sed`で色々汚いことになっていますが、`hub create`で使われるプロトコルがSSHでもHTTPSでも対応できるようにしたらこうなってしまいました。
（`hub create`で利用するプロトコルの固定自体は`git config --global hub.protocol https`でできるようです: https://hub.github.com/hub.1.html ）

# 使用例


```shell-session
$ ghq-new test
Initialized empty Git repository in /private/tmp/ghq_new/test/.git/
Updating origin
https://github.com/tuttieee/test
     clone https://github.com/tuttieee/test -> /Users/tuttieee/.ghq/github.com/tuttieee/test
       git clone https://github.com/tuttieee/test /Users/tuttieee/.ghq/github.com/tuttieee/test
Cloning into '/Users/tuttieee/.ghq/github.com/tuttieee/test'...
warning: You appear to have cloned an empty repository.

$ pwd
/Users/tuttieee/.ghq/github.com/tuttieee/test
```


# 参考
* https://blog.nishimu.land/entry/2015/03/12/193340
* https://np-complete.gitbook.io/cho-practical-git/nofur
irbで日本語が入力できなかった時の対応方法

# irbで日本語を打ったら文字化けした

```terminal
$ irb
```
として適当に日本語の変数を入れたみたところ

```
irb(main):001:0> b = '\U+FFE5\U+FFA0'
```

と表示されて文字化けをしてしまった。

別にこれができなくても開発は出来ないわけではないが、気持ち悪いので直すことに。

* 方法1（僕はこちらを試しました）：コマンド入力ライブラリを変更する
* 方法2：Rubyのアンインストール→再インストール

ググってみたところ上記2通りが出てきましたが、僕は1の方法でやってみました。（2でも解決している方は多数いそうです。）

ちなみに

irbがコマンド入力を受け取る際に使っているライブラリ（libedit）が日本語に対応していないのが原因であるらしく、日本語対応のライブラリ（readline）に切り替えることで解決ができる模様。

# ライブラリの参照先を変更する

```
$ brew list readline | grep libreadline.dylib
```
これで

```
/usr/local/Cellar/readline/7.0.5/lib/libreadline.dylib
```
のような形でパスが返ってくる場合はインストール済みなので、これをメモ帳にでも保存しておいて、そのまま下記の手順へ。

もしインストールされていない場合は

```
$ brew install readline
```
でインストールする。

インストールしただけでは何も起こらないので、ここから設定開始。

まずは

```
$ irb
```
そこで

```
> puts $LOADED_FEATURES.grep /readline/
```
と入力。

```
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/universal-darwin13/readline.bundle
```
のようなパスがでてくるので、それをどこかに保存します。（メモ帳とかでOK）

このreadline.bundleが参照しているのが日本語が使えないライブラリを参照してしまっているようなので、その参照先を変更します。

readline.bundleが参照しているライブラリは、

```
$ otool -L
```
というコマンドで参照できるのでさきほどのパスをここに入れて

```
$ otool -L /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/universal-darwin13/readline.bundle
```
とコマンドを打ちます。
結果として

```
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib (compatibility version 2.0.0, current version 2.0.0)
	/usr/lib/libedit.3.dylib (compatibility version 2.0.0, current version 3.0.0)
	/usr/lib/libncurses.5.4.dylib (compatibility version 5.4.0, current version 5.4.0)
	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1197.1.1)
	/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
```
といった感じでライブラリの参照先が出てくるので、一番上の

```
/usr/lib/libedit.3.dylib
```
をまたメモ帳にでもメモしておきます。


これで準備ができたので

```
$ install_name_tool -change
```
というコマンドを使って参照するパスを変更していきます。

と、その前に一応メモした内容が何だったのか、ということだけ整理しておきます。

| 内容 | 結果 |
|:-----------|------------:|
| 参照しているbundleのパス | /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/universal-darwin13/readline.bundle|
| 古いライブラリのパス | /usr/lib/libedit.3.dylib | 
| 新しいライブラリのパス | /usr/local/Cellar/readline/7.0.5/lib/libreadline.dylib | 

それぞれのパスを使って、参照先を変えます。

コマンドの使い方は下記になります。

```
$ install_name_tool -change 古いライブラリのパス 新しいライブラリのパス 参照しているbundleのパス
```

上記の例の場合はかなり長いコマンドになりますが、こんな感じですね。

```
$ install_name_tool -change /usr/lib/libedit.3.dylib /usr/local/Cellar/readline/7.0.5/lib/libreadline.dylib /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/universal-darwin13/readline.bundle
```

僕の場合はこの方法で解決しました。
シングルクォート(')とダブルクォート(")、結局どちらを選ぶべきなのか

JavaScript で文字列を扱うとき、いまだにシングルクォートとダブルクォートのどちらを使うか迷ってしまいます。
そうこうしているうちに 2019 年を迎えてしまいましたが、そろそろ一つ選ぼうと思いざっくり調べたので、ついでにまとめてみました。

##TL;DR
- シングルクォートとダブルクォートには**本質的な違いはない**。
- それぞれの利点の比較では、**どちらかを選ぶ決め手がない**。
- シングルクォートとダブルクォートに加えて、**テンプレートリテラルという選択肢**もある。
- 一つのクォートに絞らず、**文字列の内容によって使い分ける**方法もある。
- 個人的には、テンプレートリテラルを頑張って使っていこうと思った。

##本質的には同じもの
シングルクォートとダブルクォートの仕様としての共通点を以下にあげています。
キーボードの種類によって多少の苦労は変わりつつも、シングルクォートとダブルクォートには**本質的な違いはない**ようです。

- 文字列を表す。
- システムの解釈において違いはない。
- 開始したクォートと同じクォートでとじる必要がある。
- クォート内で同じクォートを利用するときは、エスケープする必要がある
    - `'シングルクォート内のシングルクォート(\')はエスケープする'`
    - `"ダブルクォート内のダブルクォート(\")はエスケープする"`
- 一方のクォート内で、もう一方のクォートをエスケープする必要はない。
    - `'シングルクォート内のダブルクォート(")はエスケープしない'`
    - `"シングルクォート内のシングルクォート(')はエスケープしない"`
- ドイツ、ハンガリー、オーストリアなどのキーボードでは、シングルクォートとダブルクォートの両方で`Shift`キーを必要。
- トルコ Q キーボードでは、シングルクォートの入力に`Shift`キーが必要・

##違いはあれど、決め手とはならず
シングルクォートとダブルクォートの違いやそれぞれの利点として Web 上の議論でよく見かけたものをあげてみました。
それぞれの利点の比較としては、論点の粒度が非常に細かく、**どちらかを選ぶ決め手としては不十分**な印象を受けました。

####シングルクォート
- HTML を文字列で記述するときに、ダブルクォートをエスケープする必要がない。
 - `"<div id=\"foo\"></div>"`
 - `'<div id="foo"></div>'`
- 空文字を表現するときに、ダブルクォートでは煩雑な印象となるが、シングルクォートはでシンプルで可読性が高い。 例: `"" vs ''`
- シングルクォートは`Shift`キーを押す必要がない（一部のキーボードを除く）。
- メジャーな JavaScript ライブラリでもシングルクォートが採用されている。

####ダブルクォート
 - ダブルクォートが採用されている JSON ファイルと統一の取れたコーディング規約を適用できる。
 - 多くの言語が文字列をダブルクォートで表現しているため、JavaScript への参入障壁が低い。
 - 英語の文章を書くときに、アポストロフィー(')をエスケープする必要がない。

##テンプレートリテラル(バッククォート)というもう一つの選択肢
ES6 で登場した[テンプレートリテラル](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/template_strings)ですが、粛々と[パフォーマンス改善](https://stackoverflow.com/questions/29055518/are-es6-template-literals-faster-than-string-concatenation)や[ブラウザ対応](https://caniuse.com/#feat=template-literals)がすすめられ、今では実用レベルにまで達しています。
また、バッククォート(\`)で囲うため、シングルクォートやダブルクォートのエスケープの必要がなくなり、可読性向上においても大きく貢献します。
あえて短所をあげるとすれば、まだまだ新しい技術のためノウハウが溜まっていない事でしょうか。


##１つに絞らないルールをつくる
どのクォートも一長一短であり、**プロジェクト内での統一は必要**ですが、あとは好みの問題ということになります。
しかし、一つのクォートに絞ったコーディング規約を作ってしまうと、エスケープが多発したときに可読性の維持が難しくなります。
そこで以下のように、文字列の内容によって使い分けるコーディング規約もあります。

- [Google JavaScript Style Guide](https://google.github.io/styleguide/jsguide.html#features-strings-use-single-quotes) ではシングルクォートを推奨しているが、文字列がシングルクォートを含む場合、バッククォートの使用を推奨している。
 - `'文字列にシングルクォート(\')が含まれる'`
 - `` `文字列にシングルクォート(')が含まれる` ``
- 過去、 Standard JS　では以下のルールを適用していた([#issues421](https://github.com/standard/standard/issues/421))。
    - シングルクォートを使用
    - 文字列がシングルクォートを含む場合、シングルクォートをエスケープするか、ダブルクォートを使用
    - 文字列がダブルクォートを含む場合、ダブルクォートをエスケープするか、バッククォートを使用

##まとめ
- キーボードの種類によって多少の苦労は変わりつつも、シングルクォートとダブルクォートには**本質的な違いはない**。
- それぞれの利点の比較ではポイントの粒度が細かく、**どちらかを選ぶ決め手がない**。
- シングルクォートとダブルクォートに加えて、**テンプレートリテラルという選択肢**もある。
- 一つのクォートに絞らず、**文字列の内容によって使い分ける**方法もある。

個人的には、テンプレートリテラルを頑張って使っていこうと思いました。


##参考:
- https://staxmanade.com/2018/03/should-i-use-javascript-single-or-double-quotes/
- https://stackoverflow.com/questions/29055518/are-es6-template-literals-faster-than-string-concatenation
- https://www.deep-rain.com/programming/javascript/904
- https://github.com/standard/standard/issues/421
- https://stackoverflow.com/questions/37777677/is-there-a-downside-to-using-es6-template-literals-syntax-without-a-templated-ex
new[] で作ったポインタを基底クラスへのポインタに変換してはいけない

# まずいコードの例

要するにこういうの

```c++:c++
base_t * p = new derived_t[2];
// do something
delete[] p;
```

は、ダメ。警告出ないけど、ダメ。

念のために周りを書いておくと。
こんな

```c++:c++

class base_t
{
  // 略
public:
  base_t(){ /* 略 */  }
  virtual ~base_t(){ /* 略 */  }
};

class derived_t : public base_t
{
  // 略
public:
  derived_t(){ /* 略 */  }
  ~derived_t() override { /* 略 */  }
};
```

感じ。

# なぜダメなのか

`new derived_t[2]` で作られるメモリは、派生クラスの配列（のようなもの）。得られるポインタはその先頭。

例えば

```c++:c++
char * addr = reinterpret_cast<char*>( new derived_t[2] );
```

とすると、ふたつ目の `derived_t`。は、`addr+sizeof(derived_t)` から始まる。
ここで派生クラスのサイズが必要になる。

これを

```c++:c++
base_t * p = new derived_t[2];
```

と、基底クラスに変換してしまうと、`p[1]` が `addr+sizeof(base_t)` を指すことになり、不幸になる。

`delete[]` で死ぬ。
【GoldenGate】ダウンストリーム構成についてのあれこれ

JPOUGのAdvent Calendarが終わって年が明けました！

実家って退屈ですよね

なのでダウンストリーム構成について調べたことを書きます！

参考：Oracle® Fusion Middleware Oracle DatabaseのためのOracle GoldenGateの使用 12c (12.3.0.1) [B ダウンストリーム・マイニング・データベースの構成 ](https://docs.oracle.com/cd/E92689_01/gg-winux/GGODB/configuring-downstream-mining-database.htm#GUID-E265AB7E-6255-496E-896F-32E943C362D9)

#GoldenGate ダウンストリーム構成について

##１．ダウンストリーム・デプロイとは
[GoldenGate布教活動④　～GoldenGateプロセスの構成～](https://qiita.com/ch0c0bana0/items/651e8378a74ba9c0059e)にも記載しましたが、統合Extractではいくつかのモードを選択することができます
統合Extractの稼動モードの1つであるダウンストリーム・デプロイを選択することで、ソース・データベースとは別のデータベースにてREDOログ・アーカイブログのマイニング処理を実施することができるため、ソース・データベースの負荷を軽減できます。

またソース・データベースとマイニング・データベースを明確に分離することで、GoldenGate使用に伴うソース・データベース変更を極小化することがでます
ダウンストリーム構成の1つであるダウンストリーム・ソースレス構成を選択することにより、ソース・データベースからGoldenGateを完全に分離することができ、ソース・データベース障害時にGoldenGateの処理を止めることなく運用が可能になります

また複数のソース・データベースのREDOデータを1つのダウンストリーム・データベースに送信できます。ただし、ダウンストリーム・マイニング・データベースは、それらのソース・データベースの1つからのみオンラインREDOログを受け入れることができます。残りのソース・データベースはアーカイブ・ログを送る必要があります。 

またソース・データベースとマイニング・データベースは、エンディアンとビット・サイズ(64ビット)が同じであることに加えて、下記のDocumentにあるようにソース・データベースとマイニング・データベースは同一プラットフォームである必要があります。

[Can't Register GoldenGate Extract Ext1 Database In OGG 11.2.1.0.0 Integrated Capture, ERROR OGG-01755 Cannot register or unregister EXTRACT EXT1 because of the following SQL error: OCI Error (Doc ID 1434963.1)](https://support.oracle.com/knowledge/Middleware/1434963_1.html)

具体的な構成は下記のような感じ

![WS000000.png](https://qiita-image-store.s3.amazonaws.com/0/60220/4702ee09-a0bb-9c10-8361-7c3b3415d469.png)
参考：[Oracle GoldenGate 12c Release 1の新機能概要](https://www.oracle.com/assets/oracle-goldengate-features-wp-2030476-ja.pdf)

##２．ダウンストリームの種類
ダウンストリームは下記の3つのモードを選択することができます

###ダウンストリーム・デプロイ
こちらが最も一般的なダウンストリーム構成となります。
ログマイニング・サーバーはマイニング・データベースへ構築され、REDOログやアーカイブログをソース・データベースからマイニング・データベースへ転送し、マイニング・データベース上でログマイニングを行います。
この構成によって、ソース・データベースへの変更を最小限に留めることが可能であり、キャプチャのオーバーヘッドや変換によるその他のオーバーヘッドおよび本番サーバーの他の処理を軽減することが可能です。

###ダウンストリームOracle Active Data Guardデプロイ
上記のダウンストリーム構成とアーキテクチャはほぼ同じですが、一部のLOBデータなどソース・データベースにフェッチが必要な処理をADGスタンバイDBから取得します。
実際の統合ExtractコンポーネントはREAD/WRITEデータベースで実行する必要がある点に注意してください。

###ダウンストリーム・ソースレスExtractデプロイ
こちらの構成はソース・データベースの状態にかかわらずGoldenGateを稼動させることができます。
ただしソース・データベースにフェッチが必要なデータが伝播された場合については、統合ExtractがABENDするような動作になります。
このデプロイメントでは、ソース・データベースのREDOがOracle GoldenGateリリース11.2.0.4以上と互換性があることが必要です。
※マイニング・データベースのVersionではない点に注意してください

このメソッドをFETCHUSERIDおよびFETCHUSERIDALIASとともに使用して、ADGスタンバイからフェッチすることもできます。

##おわりに
もう少しいろいろ書くことがあるかと思ったのですが、意外となかったのでココらへんにします
次回は実際に手順に沿ってダウンストリームDBを作成して検証していきたいと思います
Rubyでエンコードのエラーの対処

#Rubyでのエンコードエラー

rubyでエンコードのことでエラーが出たのでその対処法

使うエンコードを指定する場合は

```ruby
Encoding.default_external = 'UTF-8'
```

とやってる。

これに関してはいろりろ書き方があると思うから好きなのを使うとよいと思う。


今回であったのが

invalid byte sequence in UTF-8

みたいなやつ


出会った経緯としてはウェブページをスクレイピングしてたらそこにUTF-8以外の文字があってそれを処理しようとしたら出た。

自分の場合はとりあえずエラーさえ出なければよかったので


```ruby
string.encode("UTF-16BE", "UTF-8",
           invalid: :replace,
           undef: :replace,
           replace: '.').encode("UTF-8")
```

これでエラーが出てる部分の文字を.に変えたらエラーは出なくなった。