OmniAICreator/Qiita-1.07M huggingface dataset:
WebdriverIO で Enter キーを送る方法

WebdriverIO で Enter キーを送るのにはまったのでメモ。

## 結論

クロスブラウザできちんと動かすには以下のようにする。

```js
if (browser.options.desiredCapabilities.browserName == 'MicrosoftEdge') {
  element.setValue('');
  browser.keys('\uE007'); // Firefox ではサポートされない
} else {
  element.setValue('\n'); // Edge ではEnterキーイベントに化けない
}
```

## 背景

あるフォームで、送信ボタンでは期待通り動作するのに、IE11にかぎり入力欄にフォーカスして Enter キーだと動作しない不具合があり、そのテストケースをつくるのに WebdriverIO をつかってみた。

当初の実装では

```js
browser.click('INPUT_SELECTOR'); // 入力欄にフォーカス
browser.keys('Enter'); // Enter キーを送信
```

のようにしており、Chrome ではこれでうまく動作した。

が、Firefox で動かしてみると、 Selenium からこのプロトコルを実装していないというエラーが返され、しかも `browser.keys()` はすでに非推奨であるという。

そこでドキュメントを参考に `browser.actions()` で keyDown と keyUp のイベントの送信するようにしてみたが、これもうまくいいかず。

結局 Firefox で動く実装は下のものだった。

```js
var element = browser.element('INPUT_SELECTOR');
element.setValue('\n');
```

しかし、[StackExchange の記事](
https://sqa.stackexchange.com/questions/22259/how-to-send-an-enter-using-webdriverio) によると、Edge ではこの方法では動かないとのこと。

よって、`browser.desiredCapabilities` をみて切り替える、というのが結論。

冒頭のコードもこのリンク先から引用・改変した。
How to get WWN on ESXi

###

- Retrieve Fiber Channel Card WWN info

```shell-session
̀% esxcli storage core adapter list


BA Name  Driver    Link State  UID                                   Capabilities         Description                                                                     
--------  --------  ----------  ------------------------------------  -------------------  --------------------------------------------------------------------------------
vmhba0    vmw_ahci  link-n/a    sata.vmhba0                                                (0000:00:11.4) Intel Corporation Wellsburg AHCI Controller                      
vmhba1    vmw_ahci  link-n/a    sata.vmhba1                                                (0000:00:1f.2) Intel Corporation Wellsburg AHCI Controller                      
vmhba2    lsi_mr3   link-n/a    sas.50030057023a36a0                                       (0000:01:00.0) Avago (LSI) MegaRAID SAS Invader Controller                      
vmhba3    lpfc      link-up     fc.20000090fadbf946:10000090fadbf946  Second Level Lun ID  (0000:81:00.0) Emulex Corporation Emulex LPe12000 8Gb PCIe Fibre Channel Adapter
vmhba4    lpfc      link-up     fc.20000090fadbf947:10000090fadbf947  Second Level Lun ID  (0000:81:00.1) Emulex Corporation Emulex LPe12000 8Gb PCIe Fibre Channel Adapter
vmhba32   vmkusb    link-n/a    usb.vmhba32                                                () USB           

```
ジョーカーが教えてくれた社会人としての教訓6か条


DCが生んだスーパーヴィランことジョーカーさん。
しっかりとした哲学と信念のもと悪事を働いていた彼は様々な名言を残しています。そんなジョーカーさんの有り難いお言葉をご紹介。

# 自分を安く売らない

> If you are good something, never do it for free.

作中では「この腕前はタダじゃないぜ」と訳されてますね。
「お友達価格」ダメ、絶対。

- - -

# チームワークが大事

> Team work makes the dream work.

「チームワークが夢のような仕事を作り上げる」
作中では手下へ全幅の信頼を寄せるジョーカーさんの姿が描かれてました。

- - -

# 準備が大事

> Being prepared does not necessarily mean having a plan.

「準備と計画は必ずしもイコールではない」

何事も計画を立てるのは大事。でも常に計画通りにはいかないもの。
計画が台無しになっても、臨機応変に対応できるように準備しておくこと。

- - -

# ターゲットを見定める

> Know the competition, opposition inside and outside.

「競争相手のことは徹底的に把握しろ」

プロジェクト内外のステークホルダーを把握、コントロールが大事

- - -

# 出来ないことはプロに任せる

> Awareness is the most precious kind of freedom.

「自分の無知に気付くことこそが自由を手にするきっかけだ」

自分の得手不得手をきちんと把握し、苦手なことはそれを得意とする者に任せる

- - -

# 楽しむ

> Never stop having fun.

「楽しむことを忘れるな」

黒犬騎士団心得「エンジョイ・アンド・エキサイティング」
Julia で a == 1 && a == 2 && a == 3 を true にする

StackOverflow で話題になった記事が他の言語版に派生しているようなので取調中の Julia 0.6.2 でも。

元ネタ: https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3-ever-evaluate-to-true

動的型付き言語ながら多重ディスパッチではスパルタンな型検査が行われる点などが気に入っている Julia ですが、マクロで AST (抽象構文木) を扱える言語なのでマクロで書き換えます。ありきたりですみません (だがタイトルは間違っていない!)。

```julia
macro 🍣(expr)
  if expr.head == :if && expr.args[1] == :(a == 1 && a == 2 && a == 3)
    expr.args[1] = :(true)
  end
  expr
end

a = 1
@🍣 if a == 1 && a == 2 && a == 3
  println("真")
else
  println("偽")
end
# ==> 真
```

(マクロ識別子の🍣に特に意味はありません) 見ての通り `a==1 && a==2 && a==3` を条件に持つ `if` 文に付けられていたらその条件部分を固定値 `true` に置き換えるだけです。

三項演算子 `exp? A: B` も `if` 構文と解釈されるので使えます。

```julia
@🍣 (a == 1 && a == 2 && a == 3)? println("真"): println("偽")
# ==> 真
``` 

ただし `println()` 内で条件式を記述した AST はこのマクロでは機能しません。葉方向に下ってないからね。

```julia
@🍣 println(a == 1 && a == 2 && a == 3? "真": "偽")
# ==> 偽
```

条件文に付ければ OK

```julia
println(@🍣 a == 1 && a == 2 && a == 3? "真": "偽")
# ==> 真
```

寿司マクロが何をやっているかというと、構文解析で AST に展開された `if` の条件評価部分が `args[1]` であるため、そこを `true` に置き換えてコードを `if(true)` へ変換しているわけです (Julia の配列は 1-origin です)。

ちょっと長いですが `if(...)` 部分の AST ダンプはこのようになります。AST は `Expr` という型で表されます。また `:(...)` は中の構文を AST に変換します。

```julia
julia> dump(:(if(a == 1 && a == 2 && a == 3) true else false end))
Expr
  head: Symbol if
  args: Array{Any}((3,))
    1: Expr
      head: Symbol &&
      args: Array{Any}((2,))
        1: Expr
          head: Symbol call
          args: Array{Any}((3,))
            1: Symbol ==
            2: Symbol a
            3: Int64 1
          typ: Any
        2: Expr
          head: Symbol &&
          args: Array{Any}((2,))
            1: Expr
              head: Symbol call
              args: Array{Any}((3,))
                1: Symbol ==
                2: Symbol a
                3: Int64 2
              typ: Any
            2: Expr
              head: Symbol call
              args: Array{Any}((3,))
                1: Symbol ==
                2: Symbol a
                3: Int64 3
              typ: Any
          typ: Any
      typ: Any
    2: Expr
      head: Symbol block
      args: Array{Any}((2,))
        1: Expr
          head: Symbol line
          args: Array{Any}((2,))
            1: Int64 1
            2: Symbol REPL[34]
          typ: Any
        2: Bool true
      typ: Any
    3: Expr
      head: Symbol block
      args: Array{Any}((2,))
        1: Expr
          head: Symbol line
          args: Array{Any}((2,))
            1: Int64 1
            2: Symbol REPL[34]
          typ: Any
        2: Bool false
      typ: Any
  typ: Any
```

余談ですが、REPL や Jupyter Notebook など、Julia 環境は Unicode の **タブ補完シーケンス** をサポートしていて、`\:sushi:`<kbd>Tab</kbd> と入力すると 🍣 が入力されます。数学記号を入力しやすくするためですが ZWJ も使えて `\:man:`<kbd>Tab</kbd> `\:skin-tone-5:`<kbd>Tab</kbd> の順で 👨🏾 となります。スゴイ! (誰得)。

* [Unicode Input](https://docs.julialang.org/en/stable/manual/unicode-input/#)
Loader.io で負荷テストしてみた


#前置き

ときおりYahoo砲にさらされるサービスの保守に関わっています。
負荷テストといえば言わずと知れた

> Jmeter
http://jmeter.apache.org/

だと思っていましたが、Yahoo砲の再現に必要なクラスタを組む(主に精神的な)フォースパワーが足りないし、特定のページに単純にアクセスが集中するだけでシナリオ,cookieもろもろ不要、ということで気軽に負荷テストを行えるサービスを探しておりたどり着きました。


> Loader.io
https://loader.io/


WEBサービス的な負荷テストは、こちらの方がよくまとめてくださっています。


> SaaS系負荷計測サービスまとめ 2017年1月
https://qiita.com/nottegra/items/8f4597da60167f0de5e2


見ていただくと結構SaaSな負荷テストってあることに気がつくと思います。
その中で、なぜLoader.ioを選んだのか？
それは、フリープランで**10Kreq/min**で負荷テストできる！これに尽きます。


**Yahoo砲とはいうけれど、いったいどんだけのアクセスをさばく必要があるんだ？**
の手がかりとしては


> Yahoo!砲/ ヤフー砲
http://www.paradisearmy.com/doujin/pasok_yahoohou.htm

これを見る限り、**100req/sec** 程度、毎分に直しても**6Kreq/min**。ということでフリープランの範囲でYahoo砲を再現できてしまいます。そうLoader.ioならね。😀


使い方はこちらの方がバッチリまとめてくださっています。

> カヂュアル負荷試験ツール（サービス） loader.io を使ってみる
https://cloudpack.media/10885


2015年の記事ですが、ほぼ変わっていません。2018年でも余裕で通用します。そのためここでは注意点についてのみまとめてみます。


#注意点

- HTML内で読み込んでいる、JS,CSS,画像などのリソースは読んでくれない。

FAQによれば

```
Do you load linked resources/assets?

No. Our load generators only know about the URLs you give us when you create a test. We don't parse the HTML and we don't download javascript, CSS, or images linked to within pages.
```

とのこと。Jmeterならチェックボックスひとつで読み込めるものが読み込めません。大量なjsや画像を読み込んだりする必要サイトでは現実的な負荷テストにならないかも？


- ブラウザキャッシュは再現できない

同じくFAQによれば

```
Does loader.io do any caching?

We do not cache anything.
```

ということでキャッシュしてほしいものもキャッシュしてくれません。まあこの辺厳密にやりたいなら、Jmeterでやれってことですね。

- US-eastからしか負荷をかけられない


最後もFAQによれば

```
What testing locations are available?

Currently all tests are run from Amazon’s US-east datacenter.
```

残念ながら日本国内からのアクセスはエミュレートできない模様。致命的ではないとは思いますがちょっと残念ですね。
厳密さをもとめるならやはり自前でJmeterクラスタを....orz




これらのことが問題にならないのであれば、簡単なサインアップ、URLのverificationのみで使えるので、10分もあれば負荷テストを開始できます。
この手軽さは素晴らしいです。負荷テストの選択肢にぜひ。
vue.js + vue-c3でグラフを書く

#前提条件
.vueファイルをwebpackなどでビルド できる環境になっていること。

#インストール
```
npm install --save vue-c3
```

#コンポーネント(.vueファイル)
```html
<template>
  <div>
    <vue-c3 :handler="handler"></vue-c3>
  </div>
</template>
 
<script>
import Vue from 'vue'
import VueC3 from 'vue-c3'
import 'c3/c3.min.css'
 
export default {
  name: 'コンポーネント名',
  components: {
    VueC3
  },
  data () {
    return {
      handler: new Vue()
    }
  },
  mounted () {
    let options = {
      //c3.chartのデータ例
      data: {
        columns: [
          ['data1', 30, 200, 100, 400, 150, 250],
          ['data2', 50, 20, 10, 40, 15, 25]
        ]
      }
    }
    this.handler.$emit('init', options)
  }
}   
</script>
```

#ポイント
c3のc3.min.cssをimportすること。

#書ききれなかった事
c3のデータはdata > columsをpropsなり、vuexなりで渡し
オプションはコンポーネント内に設定すると使いまわしが良さそう。

# 追記
## スタイル指定
例えばlineチャートの線を太くしたい場合

```html
<style>
.c3-line {
  stroke-width: 3;
}
</style>
```

このように単一ファイルコンポーネントのスタイル部分にsvgのスタイルを当ててやれば良い
これはsvg製のグラフライブラリのメリットだと思った。
Android Studio (Kotlin) Windows10上での開発環境構築

#環境
Windows10　32bit
#Android Studio をインストールする
https://developer.android.com/studio/index.html
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143249/3d4cde2a-79fa-9939-a970-db7200a9849a.png)
同意してインストール
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143249/5515ff21-6cce-6156-7f52-774aef565172.png)
ダウンロードしたファイルを実行する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143249/860d68b6-88c1-ffc9-f2eb-cc571b75353c.png)
インストール
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143249/e107cbab-3828-f3e8-eff4-814751811381.png)

#Android Studio の実行
Include Kotlin supportをチェックし、
新規アプリケーションの生成
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143249/3995c8e7-0139-29e5-8c8d-baca1db9580e.png)
対象プラットフォームの設定
対応させたOSの下限を選ぶ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143249/ced89fcc-3f74-cb12-a45e-82fd6f7e45f0.png)

Activityの設定
今回はEmptyActivityを選択した
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143249/217c31dd-96f9-8559-2b11-3f24eb6edb45.png)
Activityはデフォルトのまま
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143249/382fd117-b873-1356-adda-35c3e9aeb235.png)
エラーが発生してビルドできませんでした。
CreateProcess error=216
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143249/1d6670c8-c011-c675-507c-680977cb4c51.png)
JDK 32bit用をダウンロードして
インストール
http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143249/c5f15e04-b7ff-581a-b4bf-6d76f33c8414.png)
JDKのチェックをはずして、
インストール先のフォルダを指定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143249/85b1d2e0-4ae7-a2d1-e1a2-9ec873c7a596.png)
ビルドすると、
エラーの内容が変わりました。SDKが見つからない
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143249/96a6a271-957f-1312-5b88-59c61233c25c.png)

SDKをインストールします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143249/33967d5c-9048-392e-e7cb-7dc4b4071271.png)
SDKTOOLSが見つからないようです。
SDK TOOLSをアップデートします。
Android Support LibraryのVersionが古かったようです。
-->追記 proxyの設定が必要でした。(httpとhttpsの両社にProxyを設定してあげます。)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143249/b6e3da45-79da-6f4d-f5ea-51323759d0b0.png)
エミュレーターを立ち上げ、
プログラムも実行します。
またエラーです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143249/15292a31-456c-1d62-a45f-6a5c5ba8601d.png)
設定は特に変更していませんが、
Debugにてプログラムが正常に実行されました。
開発マシンが貧弱なので、TimeOutでエラーになっていたようです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143249/866369e3-3681-4116-c8ff-c91b2d2d89f0.png)
在线最佳图像调整

![Capture.PNG](https://qiita-image-store.s3.amazonaws.com/0/183339/00c7a050-7274-ebb5-a5f3-b7295211805f.png)
There is a new and very well executed website that allows you to reduce the image size to 70% and speed up the site, I tried it and got the best result, completely free and not requiring any type of registration.
I think you need to check this site https://www.resizejpeg.com/
LogstashでS3にoutputするときに日付で階層を作っておきたい

# 結論

**prefixのところで指定できる！**

```ruby

input {
  stdin {
  }
}

filter {
}

output {
   s3 {
     access_key_id => "**********************"
     secret_access_key => "*************************"
     region => "ap-northeast-1"
     bucket => "hoge.bar.piyo.fuga"
     prefix => "%{+YYYY}/%{+MM}/%{+DD}"
     size_file => 2048
     time_file => 10
     codec => "plain"
     canned_acl => "private"
   }
}
```

prefixのところで、%{+YYYY}, %{+MM}などを使って指定してやるとよい。
`@timestamp`のところの値が取れていると思う。

HHやらDDやら、書式については、以下のページが参考になる。
https://www.elastic.co/guide/en/logstash/current/plugins-filters-date.html

%{+HH}を指定して時刻の部分も付与してやってみた例がこちら。

![S3 Management Console.png](https://qiita-image-store.s3.amazonaws.com/0/111676/7a474628-7b5c-22bd-0b28-5b693119f1d5.png)
ZoneID を再生成するスクリプト

### ZoneID を再生成するスクリプト

Windowsで、マルウェアが感染するのを防ぐSmartScreenなどに、ZoneIDは必要だったりする。

ZoneIDってこんなやつ
![ZoneIDが表示されているプロパティ](http://rocketeer.dip.jp/sanaki/free/free141d.jpg)


なので、消した場合、復活させるスクリプト(WSH/VBScript)を作った。

ダウンロードは以下。
[ZoneID を再生成するスクリプト](http://rocketeer.dip.jp/sanaki/free/free141.htm)

ファイルのアイコンにDrag&Dropしてもよいし、SendToにショートカットを置いてもいいし、レジストリ操作して右クリックメニューに追加してもいいでしょう。
Elastic Beanstalkで独自のログを定義してCloudWatchに流す

ElasticBeanstalkでデフォルトにはないログをCloudWatchに連携する方法を書いていきます。

以下の手順で進めていきます。

- Apacheのログ出力の設定を追加する
- CloudWatchLogsエージェントの設定を追加する
- ElasticBeanstalkのroleにCloudWatchの書き込み権限を追加する

# Apacheのログ出力の設定を追加する
```yaml:.ebextensions/log_format.config
files:
  "/etc/httpd/conf.d/log_format.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      <IfModule log_config_module>
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" custom
        CustomLog "logs/custom_log" custom
      </IfModule>
```

`/etc/httpd/conf.d/`以下に`/etc/httpd/conf.d/log_format.conf`という名前でファイルを作ります。
`/etc/httpd/conf.d/`以下に`.conf`の拡張子で設定ファイルを設置すれば`/etc/httpd/conf/httpd.conf`にincludeされて読み込まれます。
LogFormatの部分は、必要な形に変更してください。

# CloudWatchLogsエージェントの設定を追加する。
```yaml:.ebextensions/aws_logs.config
files
  "/etc/awslogs/config/custom_log.conf":
    mode: "000644"
    owner: root
    group: root
    content: |
      [/var/log/httpd/madirect_custom_log]
      log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/httpd/custom_log"]]}`
      log_stream_name={instance_id}
      file=/var/log/httpd/custom_log*
```
`/etc/awslogs/config/`以下に`.conf`拡張子でファイルを置くとCloudWatchLogsエージェントの設定として読み込まれます。設定の書き方は<a href="https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/AgentReference.html">こちら</a>。

# ElasticBeanstalkのroleにCloudWatchの書き込み権限を追加する
IAMのロールからaws-elasticbeanstalk-ec2-roleを選んでCloudWatchの権限をアタッチして下さい。
全てうまく行くと、CloudWatchのロググループに新しいグループが追加され、ログが流れてくるようになります。
a == 1 && a == 2 && a == 3がtrueになるGroovyスクリプト

いま流行の`(a == 1 && a == 2 && a == 3)をtrueにできるか`をGroovyでやってみます。

Groovyは演算子オーバーロードが使えるので
`==`を上書きすれば良いのですが今回は別のアプローチを

```groovy
class Hoge {
    def a = 1
    def getA() { this.a++ }
}

new Hoge().with {
    if (a == 1 && a == 2 && a == 3) {
        println 'true'
    } else {
        println 'false'
    }
}
```

`with`を使うことでGetterをシンプルに呼びだしています。

# まとめ
[元ネタ](https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3-ever-evaluate-to-true)に同じ解法があるので何番煎じかわかりませんが、
とりあえずブームの波に乗ってみました。
HPE Insight Diagnostics　 完全メモリテストで障害

HPE Insight Diagnostics - HPE Intelligent Provisioning 2.60または2.61経由でInsight Diagnostics 完全メモリテストあるいは カスタムメモリテストを実施すると、
誤ったメモリ障害が報告されることがある

https://support.hpe.com/hpsc/doc/public/display?docId=emr_na-a00018309en_us
ふぁぼったツイートの画像を手元に保存するRubyスクリプト

# 動機
「このツイートの画像、いいな！」と思ってお気に入り登録したツイートの添付画像を、一括でダウンロードしたい！・・・その一心で作りました。

# ソースコード
twitterのgemを利用します。コンシューマキーなどは、自分のものを利用してください。
Twitterクライアントのfavoritesメソッドでお気に入りに登録されているツイートを取得していきながら、画像をダウンロードしていきます。favoritesメソッドを呼ぶときに、pageを指定すると、過去にお気に入り登録したツイートを取得できます。指定するpageの値を大きくしていきながら、お気に入りのツイートを遡っていきます。

```ruby:twitter_client.rb
require 'twitter'

class TwitterClient
  def initialize
    @client = Twitter::REST::Client.new do |config|
      config.consumer_key = ""
      config.consumer_secret = ""
      config.access_token = ""
      config.access_token_secret = ""
    end
  end

  def favorite(num=20,page=1)
    # pageを指定すると、より過去のお気に入りツイートが見れる
    begin
      @client.favorites({count: num, page: page})
    rescue Twitter::Error::TooManyRequests => error
      STDERR.puts "Twitter::Error::TooManyRequests while getting favorite tweets."
      sleep error.rate_limit.reset_in # APIの規制が解除されるまでsleep
      retry
    end
  end
end
```

```ruby:get_favorite_tweet_picture.rb
#!/usr/bin/env ruby

require './twitter_client.rb'
require 'open-uri'

def fetch(url)
  p url
  html = open(url)
  body = html.read
  mime = html.content_type
  return body, mime
end

client = TwitterClient.new
picture_counter = 1 #画像の名前をつけるための、暫定的なカウンター
page = 1
until (favorites = client.favorite(20,page)).nil? do
  favorites.each do |tweet|
    p tweet.text
    unless tweet.media.empty?
      picture_dir = 'favorite_picture/'
      Dir.mkdir(picture_dir) unless File.exist?(picture_dir)
      media_urls = tweet.media.map{|media| media.media_url.to_s}
      media_urls.each do |url|
        img,mime = fetch url
        next if mime.nil? or img.nil?
        ext = ''
        if mime.include?('jpeg')
          ext = '.jpg'
        elsif mime.include?('png')
          ext = '.png'
        elsif mime.include?('gif')
          ext = '.gif'
        else
          next
        end
        result_file_name = picture_dir + picture_counter.to_s + ext
        picture_counter += 1
        File.open(result_file_name, 'w') do |file|
          file.puts(img)
        end
      end
    end
  end
  page += 1
end
```
Laravel環境でMailgunがcURL error 60を返すようになった



## 環境
>Laravel 4.2
Guzzle v3.9.3


## TL;DR
`cacert.pem`を更新する

```
$ cd /path/to/laravel/vendor/guzzle/guzzle/src/Guzzle/Http/Resources
$ mv cacert.pem cacert.pem.bk
$ wget curl.haxx.se/ca/cacert.pem 
```

## 事の顛末
メールの配信にMailgunを使っているのですが、2018/1/23に突然メールが送れない状態になりました。

Mailgunの[Status Page](http://status.mailgun.com/)を見ても何も書いていなかったので、Twitterからネトストしました。
するとこんなつぶやきがありました。

![スクリーンショット 2018-01-24 15.09.13.png](https://qiita-image-store.s3.amazonaws.com/0/79598/b65c726d-7d51-37f9-3438-a493b21583fe.png "スクリーンショット 2018-01-24 15.09.13.png")

どうやらMailgunがSSL証明書を更新したことによってエラーが起きていたようです。
このTweetの後にメール送信できないぞいというリプが続々と付いてました。


## 対応
その後Mailgunの[Status Page](http://status.mailgun.com/incidents/0y2g8f3cvvz5)を見てみると

>
If you are receiving errors while attempting to send messages using Mailgun, you will need to update your local CA bundle.

とのこと。

何はともあれエラーを見てみます。

```
exception 'Guzzle\Http\Exception\CurlException' with message '[curl] 60:  [url] https://api.mailgun.net/v2/app/messages' in /directory/to/laravel/vendor/guzzle/guzzle/src/Guzzle/Http/Curl/CurlMulti.php:359
Stack trace:
(後略)
```

後略の中を詳しく見てみると`Client.php`の中に下記のコードを発見。

```
$opts[CURLOPT_CAINFO] = __DIR__ . '/Resources/cacert.pem';
```

`__DIR__`はPHPのマジカル定数で、そのファイルが存在するディレクトリを指します。
このファイルが存在している`laravel/vendor/guzzle/guzzle/src/Guzzle/Http/Resources`を見てみるとありました、`cacert.pem`です。
これを下記のように更新します。

```
$ cd /path/to/laravel/vendor/guzzle/guzzle/src/Guzzle/Http/Resources
$ mv cacert.pem cacert.pem.bk
$ wget curl.haxx.se/ca/cacert.pem 
```

これで無事にメールが送信できるようになりました。
【Underscore.js】最初の壁を攻略してみた


配列データの処理を行う際に便利な
javascriptのライブラリ「Underscore.js」

難しいアルゴリズムを書かなくても
短いコードで処理が出来るらしいので、
インストールしてみました。

ただ、インストールするだけでは使えずしょんぼり。
なので、いろいろ調べながら解決してみました。

その方法をまとめてみる。

###まずはUnderscore.jsをインストール
http://underscorejs.org/


```shell:shell
yarn add underscore

// npmの場合
npm install underscore
```

インストール完了！

###実際に使ってみる

インストールできたので、
試しに配列から任意の条件に合う値を出力してみる。

```js:js
var _ = require('underscore');

var array = [1,2,3,4];
var result = _.filter(array, function(num){
    return num>3;
});
console.log(result);

// 配列[1,2,3,4]から4より大きい数字をコンソールに出力
```

###あれ？エラーが出たよ

```console:console
require is not defined
```

underscoreを読み込むために記述している
requireが定義されていませんと出ている。


###なんでだろう？グーグル先生に聞いてみた


そもそもnode.jsの関数だからブラウザでは使えないので、
今度はブラウザでもrequireが使えるように
browserifyを使ってビルドしてあげる必要があるらしい。


###早速browserifyをインストール

http://browserify.org/

```shell:shell
yarn add browserify
// npmの場合
npm install -g browserify
```

インストール完了！

###ビルドします

```shell:shell
browserify assets/js/script.js -o build.js

// script.jsをbuild.jsと言う名前で出力
```

ビルド完了！


###出来上がったjsファイルに変更

もともとscript.jsを読み込んでいた部分を出来上がったjsファイルに変更します。

```html:html
<script type="text/javascript" src="./build.js"></script>
```

これで、requireが使えるようになりました！


###もう一度、チャレンジしてみる

requireが使えるようになったのか、
再度、配列から任意の条件に合う値を出力してみます。

```js:js
var _ = require('underscore');

var array = [1,2,3,4];
var result = _.filter(array, function(num){
    return num>3;
});
console.log(result);

// 配列[1,2,3,4]から3以上の数字をコンソールに出力
```

```console:console
[4]
```

できた！

これで、Underscore.jsを使うための準備が整いました。

やったね！

###おまけ1：最大値を出力してみる

せっかくなので、_maxを使って、配列の中から最大値を出力してみます。

```js:js
var _ = require('underscore');

var array = [1,2,3,4];
var result = _.max(array, function(num){
    return num;
});
console.log(result);
// 配列[1,2,3,4]から最大値をコンソールに出力
```
 
```console:console
[4]
```

できた！

##おまけ2：毎回ビルドする度にコマンド打つのは大変！効率化してみた

毎回ビルドする度にコマンド打つのは大変なので、
gulpを使って自動化します。


###まずは事前にvinyl-source-streamをインストール
gulpでbrowserifyを使うには、これが必ず必要。
[詳しくはこちらのサイトが参考になりました。](http://umai-bow.hateblo.jp/entry/2014/10/08/002235) （ありがとうございます！）


``` shell:shell
yarn add vinyl-source-stream
// npmの場合
npm install vinyl-source-stream
```

インストール完了！

###gulpfileにタスクを書く

まず、ビルドを実装するためにタスクを書きます。

```js:gulpfile
/**
 * browserify
 */
gulp.task('browserify', function() {
return browserify('script.js')
  .bundle()
  .pipe(source('build.js'))
  .pipe(gulp.dest('assets/js'));
});

```

``` shell:shell
gulp browserify
```

ビルドの実装完了！

###gulpfileにwatchタスクを追加

さらに、常に監視しておいてほしいので、
上で作ったタスクをwatchに追加します。

```js:gulpfile
/**
 * watch
 */
gulp.task('watch', function() {
  gulp.watch(directory. , ['browserify']);
});
```

```shell:shell
gulp watch
```

できた！これで、jsに変更があれば自動でbrowserifyタスクが動いてくれます。

毎回ビルドする面倒もなく、
Underscore.jsで配列処理の作業が出来るようになりました。

###やったね！

おわり
ROSでIMUにSparkFun SEN-14001(9DoF Razor IMU M0)を使う

#基本
Ros WikiのSensorの9DoF Razor IMUで利用可能
http://wiki.ros.org/razor_imu_9dof
https://github.com/KristofRobot/razor_imu_9dof

##変更点
Arduino　Firmware の``#define HW__VERSION_CODE 1401``のコメントを外す。
my_razor.yamlのportを/dev/ttyUSB0 から/dev/ttyACM0にする。

##はまりどころ
###Arduinoが最新版では書き込みができなかった。
https://learn.sparkfun.com/tutorials/9dof-razor-imu-m0-hookup-guide?_ga=2.212823956.1062149601.1516752321-215560038.1516752321
と同じ、
Arduino 1.6.12
Arduino SAMD Boards 1.6.8
SparkFun SAMD Boards 1.3.0
にバージョンをおとすと書き込みできた。

###書き込み時はボードのSCLとGNDをショートして立ち上げる。

##その他
WindowsのDriverがインストールできない（セキュリティカタログファイルがない）
python3 で Decimal を JSON に変換

AWS の DynamoDB では、Decimal という型が使われます。この型を JSON に変換する方法です。

変換できない例

```py3:error.py
#! /usr/bin/python
#
import json
from decimal import Decimal

# ----------------------------------------------------------------
aa = [Decimal(3.4),Decimal(5.3)]
json_str = json.dumps(aa)
print(json_str)
# ----------------------------------------------------------------
```

実行結果

```text
$ ./error.py 
Traceback (most recent call last):
  File "./error.py", line 8, in <module>
    json_str = json.dumps(aa)
  File "/usr/lib/python3.7/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python3.7/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python3.7/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/usr/lib/python3.7/json/encoder.py", line 179, in default
    raise TypeError(f'Object of type {o.__class__.__name__} '
TypeError: Object of type Decimal is not JSON serializable
```

ちゃんと変換できる例

```py3:ok.py
#! /usr/bin/python
#
import json
from decimal import Decimal

# ----------------------------------------------------------------
def decimal_default_proc(obj):
	if isinstance(obj, Decimal):
		return float(obj)
	raise TypeError
# ----------------------------------------------------------------
aa = [Decimal(3.4),Decimal(5.3)]
json_str = json.dumps(aa,default=decimal_default_proc)
print(json_str)
# ----------------------------------------------------------------
```

実行結果

```text
$ ./ok.py 
[3.4, 5.3]
```

確認したバージョン

```text
$ python --version
Python 3.7.2
```
phpbrew install でエラーが発生した時の対応

macOS Sierra 10.12.6
php5.6
環境にてphpbrewでphp7をインストールしようとした時にエラーでつまづいたのでメモ。

```
$ phpbrew install 7.2.1
```

OpenSSLでなんちゃらエラー

```
configure: error: OpenSSL version 1.0.1 or greater required.
```

まずは以下の方法でOpenSSLを更新しましょう。

[Mac OS X] OpenSSLバージョンの更新
https://qiita.com/smith_30/items/a275f30b040c1ea74520

```
$ openssl version
OpenSSL 1.0.2n  7 Dec 2017
```
よっしゃよっしゃと、再実行。


```
$ phpbrew install 7.2.1
(中略)
configure: error: OpenSSL version 1.0.1 or greater required.
```

更新は間違いなくできているが、どうやらOpenSSL参照先が間違っているようだ。
色々調べて brew link openssl --force とやらを試すが何も変わらず。
そこで以下のようにOpenSSLを明示的に指定すると先に進めた。

```
$ phpbrew install 7.2.1 +openssl=$(brew --prefix openssl)
(中略)
configure: error: off_t undefined; check your library configuration
```
今度はoff_t undefinedのエラー。
以下のコマンドで通った。

```
$ LDFLAGS="-L/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib/system" phpbrew install 7.2.1 +openssl=$(brew --prefix openssl)
```

[リンク]
phpbrew github
基本のコマンド類は一通り記載されているので必ずこちらも目を通しましょう。
https://github.com/phpbrew/phpbrew
GitHub の隠し URL を使って手軽にアバター画像や公開鍵を取得する

エンジニアなら誰もがアカウントを持っているであろうサービスであるところの GitHub。
アバターは勿論、 Git 操作のために SSH 公開鍵を登録している人も多いはず。

もし日常的に GitHub を利用している人で、「このページに載せるからアイコン頂戴」や、「SSH の公開鍵をもらっていい？」と出先で言われた時は、 GitHub には、実はそれらの表示用の URL が存在するので、その URL を投げてやると便利。

ざっと調べたけれどこれらへのエンドポイントの説明がないので、いつまで使えるかは不明。けど数年使えるので多分なくならない。

## 画像の URL

画像の URL は、 https://github.com/:user_id.png の形式。
例えば自分の場合、 potato4d なので https://github.com/potato4d.png となる。

内部でリダイレクトが走り、GitHubの該当ユーザーの画像ファイルのURLに飛んでくれる。画像パス自体を指定するわけではないので、アイコンが変わった場合もわざわざ追従しなくて便利。

![Screen Shot 2018-01-24 at 15.28.06.png](https://qiita-image-store.s3.amazonaws.com/0/75633/07c31db1-2246-b248-7513-e626edd7781b.png)

昔の形式の URL は GitHub のヘルプページにあるけど、こっちは特に示されていない様子。
https://help.github.com/articles/setting-your-profile-picture/

## SSH 公開鍵の URL

SSH 公開鍵の URL は、 https://github.com/:user_id.keys の形式。
GitHub に登録している鍵が全て表示されるので便利。

![Screen Shot 2018-01-24 at 15.29.34.png](https://qiita-image-store.s3.amazonaws.com/0/75633/70712584-4a7b-db56-9a2e-e644e20d0920.png)

## おわりに

急にアイコンや鍵を求められることは多いので、覚えていたらこれを投げてやるとコピペミスとかも起こらないので便利。
type traits techniques 01

# is_iterable
```cpp
namespace detail_type_traits {
    template<class T>
    auto is_iterable(int) -> decltype(std::begin(std::declval<T&>()) != std::end(std::declval<T&>()), void(), ++std::declval<decltype(std::begin(std::declval<T&>()))&>(), void(*std::begin(std::declval<T&>())),std::true_type{});
    template<class T>
    std::false_type is_iterable(...);
}
template<class T>
using is_iterable = decltype(detail_type_traits::is_iterable<T>(0));
```
> source: https://stackoverflow.com/questions/13830158/check-if-a-variable-is-iterable

# is_gettable (usable like as tuple)
```cpp
namespace detail_type_traits {
    template<class T>
    auto is_gettable(int) -> decltype(std::get<0>(std::declval<T&>()), std::true_type{});
    template<class T>
    std::false_type is_gettable(...);
}
template<class T>
using is_gettable = decltype(detail_type_traits::is_gettable<T>(0));
```

# Example
https://ideone.com/DLODNJ
Windows上で実行したPythonの出力ファイルの改行コードが変わる

Windows上でPythonを実行した際、出力ファイルの改行コードが勝手にCRLFに変更されます。

# 環境
* Windows 10 Enterprise
* Python 3.5.2

# CRLFに改行コードが変わる

Windows上でPythonからファイル書き込みを行った場合、デフォルトでは改行コードが強制的にCRLFに変更されます。

```py3
outputFile='./test.txt'

with open(outputFile,'w') as fo:
    fo.write('hello world !\n')
```

上記のプログラムでは改行に`\n`を使用し、プログラム中では紛れもなく改行コードはLFです。しかし、実行し書き出されたファイルは以下のようになっており、何故か改行がCRLFになっています。
![新しいビットマップ イメージ.png](https://qiita-image-store.s3.amazonaws.com/0/200861/94da560d-9090-b59d-eb29-75e08b96ce85.png)

# 対策
改行コードを変更されないためには、ファイルを開く際に改行コードを指定する必要があります。`newline`はファイルの改行コードを指定する引数です。

```py3
outputFile='./test.txt'

with open(outputFile,'w',newline="\n") as fo:
    fo.write('hello world !\n')
```

実行結果は下のようになり、しっかりと改行コードがLFになっていることが確認できます。
![pic2.png](https://qiita-image-store.s3.amazonaws.com/0/200861/d1115dd8-83ba-9c48-653e-a83e3c50a6c4.png)

# おまけ：csvモジュールを使った場合
csv形式のファイルを扱うためのcsvモジュールには、書き込みファイルの改行コードを指定する引数が存在します。これを使った場合どうなるのか調べました。

```py3
import csv
outputFile='./test.txt'

with open(outputFile,'w') as fo:
    writer=csv.writer(fo,lineterminator='\n')
    writer.writerow(['hello','world','!'])
    writer.writerow(['hello','world','!'])
```

`lineterminator`で改行コードを`\n`に指定しますが……。
![pic3.png](https://qiita-image-store.s3.amazonaws.com/0/200861/d0fbf293-f313-0a19-18e8-da9b4e7175bf.png)
うーん、残念ながら無力。
それどころか、ファイルを開く際の`newline`とcsv形式の指定`lineterminator`の両方で改行コードを指定しなければ、LF改行になりませんでした。

# 参考サイト

* [Python(Windows)でファイル出力する際に改行コードをLFにする &mdash; gh-pages  ドキュメント](https://ksomemo.github.io/contents/qiita/Python(Windows)%E3%81%A7%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AB%E6%94%B9%E8%A1%8C%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92LF%E3%81%AB%E3%81%99%E3%82%8B.html)
特定のURLに大量のリクエストを飛ばす方法

chromeの開発者ツールを起動(F12)してNetworkのタブを表示した状態でリクエストをブラウザから飛ばすと実行ログを残せる

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214653/85f9c78b-e4da-dc46-22ce-8e43f966bf5c.png)

リクエストを右クリック > Copy > Copy as cURL(bash)
を選ぶことでクリップボードにリクエストがコピーされる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/214653/93d192ba-4cf0-9db1-2b45-b4ce0aa16dba.png)

後はシェルで実行するだけで同じリクエストを飛ばすことができる。

```
for i in `seq 1 10000`
do
   【リクエスト】
done
```

こんな感じで繰り返すようにすれば大量に呼び出し続けてくれる。
imgの画像をfitさせたい時はobject-fit属性を使おう

画像を潰さずに表示したい場合は
imgタグにobject-fitを設定すれば解決できます。
![ovject_fit.gif](https://qiita-image-store.s3.amazonaws.com/0/24013/fc91668a-da3b-007c-e1bf-98c1071b4c54.gif)

※こちらIEには対応しておりません。
[コメントにて対応方法追記していただきました。ありがとうございます](https://qiita.com/ozepon/items/21e205121f9142b1b22a/#comment-1bb3359802c854f9c714)
【サルが書く】phpでのforをforeachで代用してみよう！

```php

for ($i = 0; $i <= 5; $i++) {
    echo $i;
}

```
いつもの書き方でやるならこうしていた。

単純に何回ループを回すって指定したい！

foreachでもrangeを使うことで実装できるようでやってみました。

```php

foreach (range(0,5) as $i) {
    echo $i;
}

```

でも、foreachを使うことで処理速度が遅くなることがあるらしい、また、rangeを変数に入れてやると処理が早くなるらしい。


```php

$range = range(0,5);
foreach ($range as $i) {
    echo $i;
}

```
CSVでファイルを取り込んで正規表現をかけて結果を出力する

簡単だけど結構ハマったのでメモ。

▼サンプルコード
//ファイルの読み込み
$string=file_get_contents("sample.log");

//正規表現検索
preg_match_all("/\d{4}-\d{2}-\d{2}\t\d{2}:\d{2}:\d{2}/", $string, $match);

var_dump($match);

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
▼CSV
以下のようなデータ。

・
・
TestNo: 1.0
Date: 2017-09-29
2017-09-29    10:50:14    * 合格点 = 50
2017-09-29    10:50:14    24480    (a)1234567    [INFO]    得点 = 50    -
2017-09-29    10:50:14    24480    (c)0099322    [INFO]    合否フラグ = ture    -
2017-09-29    10:50:14    24480    (b)7777777    [INFO]    得点 = 30    -
2017-09-29    10:50:14    24480    (c)0099322    [INFO]    合否フラグ = false    -
・
・

＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝
▼出力結果
array(1) {
  [0] =>
  array(20) {
    [0] =>
    string(19) "2017-09-29      10:50:14"
    [1] =>
    string(19) "2017-09-29      10:50:14"
    [2] =>
    string(19) "2017-09-29      10:50:14"
    [3] =>
    string(19) "2017-09-29      10:50:14"
    [4] =>
    string(19) "2017-09-29      10:50:14"
    [5] =>
    string(19) "2017-09-29      10:50:14"
    [6] =>
    string(19) "2017-09-29      10:50:14"
    [7] =>
    string(19) "2017-09-29      10:50:14"
    [8] =>
    string(19) "2017-09-29      10:50:14"
    [9] =>
    string(19) "2017-09-29      10:50:14"
    [10] =>
    string(19) "2017-09-29      10:50:14"
    [11] =>
    string(19) "2017-09-29      10:50:14"
    [12] =>
    string(19) "2017-09-29      10:50:14"
    [13] =>
    string(19) "2017-09-29      10:50:14"
    [14] =>
    string(19) "2017-09-29      10:50:14"
    [15] =>
    string(19) "2017-09-29      10:50:14"
    [16] =>
    string(19) "2017-09-29      10:50:14"
    [17] =>
    string(19) "2017-09-29      10:50:14"
    [18] =>
    string(19) "2017-09-29      10:50:14"
    [19] =>
    string(19) "2017-09-29      10:50:14"
  }
}
[Swift] で a == 1 && b == 2 && c == 3 を真にする その２

こっちを攻めてみました。

```swift
func &&(lhs: Bool, rhs: Bool) -> Bool { return true }

let a: Int = 123_456_789

if a == 1 && a == 2 && a == 3 {
	print("ちゅるーー！！")
}
```
IdeaVimのvim-surroundチートシート

##対応コマンド
ys, cs, ds, S

## 文字を囲む
単語をシングルコーテーションで囲む
``` ysiw' ```
↑の「iw」の部分は、vimのテキストオブジェクト(t、f、$等）を指定できます
覚え方はyield surround xxxx かな？


行末までシングルコーテーションで囲む
``` ys$' ```

単語をタグで囲む
``` ysiw<html> ```

単語をカッコで囲む
``` ysiw) ``` or ``` ysiw} ```

カッコと単語の間に空白を入れて囲む
``` ysiw( ``` or ``` ysiw{ ```

## 囲み文字を消す
シングルコーテーションを消す
``` ds' ```
覚え方は delete surround xxxx と思われる。

タグを消す
``` dst ```

## 囲み文字を変更する
コーテーションをタグに
``` cs'<html> ```
覚え方は change surround src dst です、多分。

タグをコーテーションに
``` cst' ```

シングルコーテーションをダブルコーテーションに
``` cs'" ```

## 選択状態の文字を囲む
シングルコーテーションで囲む
``` S' ```
覚え方はSelectedか。これだけ大文字。気合いで覚えよう。

タグで囲む
``` S<html> ```
日本語入力中か否かを調べる方法

# IME での日本語入力中を判定する
Windows フォームアプリケーション上で日本語入力中か否かを取得するためのオブジェクトを実装してみます。
ファンクションキーの処理を実装したけど日本語入力中には機能させたくない、などニーズがある場合に使えるかと思います。

# 実装概要
1. IMessageFilter を実装するクラスを作ります。
2. PreFilterMessage メソッドの実装を、ウィンドウメッセージに基づいて日本語入力の開始と終了を判別するようにします。
3. Application.AddMessageFilter メソッドで、自身のインスタンスをアプリケーションレベルのメッセージフィルターとして登録します。
4. 作成したクラスのインスタンスをアプリケーション開始時などに作成・保持しておきます。
5. インスタンスの Compositing プロパティが true の場合は、日本語入力中です。

```C#
using System.Windows.Forms;

namespace ImeStatus
{
    // ウィンドウメッセージを処理するために
    // IMessageFilter インターフェイスを実装します。
    public class ImeStatus : IMessageFilter
    {
        public ImeStatus()
        {
            // コンストラクター内で
            // メッセージフィルターとして自身を登録します。
            Application.AddMessageFilter(this);
        }

        public bool Compositing
        {
            get; private set;
        }

        // アプリケーションがウィンドウメッセージを処理する前に
        // 呼び出されます。
        public bool PreFilterMessage(ref Message m)
        {
            const int WmStartComposition = 0x10D;
            const int WmEndComposition = 0x10E;
            switch (m.Msg)
            {
                case WmStartComposition:
                    // 日本語入力の開始
                    Compositing = true;
                    break;
                case WmEndComposition:
                    // 日本語入力の終了
                    Compositing = false;
                    break;
            }
            return false;
        }
    }
}
```
Swift備忘録

#はじめに
ただの私のための備忘録です。参考にならないと思います。
過度な期待はしないでください。

#環境
Xcode9.2

#今回の備忘録

##フォーマット
```
String(format: "桁数指定", ○)  //○に値を入れる
```

##三項演算子
```
(条件式) ? (条件式がtrueの場合) : (条件式がfalseの場合)
```

##画像を回転させる
```
let angle: CGFloat = CGFloat(○) //回転角度を指定、○の中に数値を入れる
○○.transform =  CGAffineTransform(rotationAngle: angle)  //回転用のアフィン行列を作成、〇〇の中に画像の名前を入れる
```
GitHubのリリース(Releases)を削除する

# どういう状況か
新しい機能をリリースしたのでTagをつけてReleaseを作成したが、機能に問題があったためなかったことにしたい！
といったときに、GitHubのReleasesを削除する方法です。
結果的にTagを削除します。

# Release機能について
Release機能の使い方に関しては以下の記事が参考になります。
[GitHubのリリース機能を使う](https://qiita.com/todogzm/items/db9f5f2cedf976379f84)

# 削除の方法
まず先にTagを削除する必要があります。
画面からはできないので、以下のコマンドを実行します。

```sh
git push --delete origin 削除するタグ名
```

すると、対象のReleaseがDraft状態になるので、これでDraftを破棄すれば削除されます。
AWS Media Services まとめ (自分用)

# AWS Media Services まとめ（自分用）

## はじめに
AWS Media Services が発表されたので、遅まきながら自分用にまとめます。

## AWS Elemental MediaLive
高品質のブロードキャストやストリーミング配信が可能な**ライブエンコーディングサービス**。
:grinning::speech_balloon:「ビデオ(映像コンテンツ)をインプットして、ライブ出力に変換」する

- 負荷とチャネル数に基づいて柔軟に拡張できるリソースで、ライブチャネルを数分で展開
- チャンネルベースのPay-as-you-goサービスに監視や回復機能が組み込まれており、運用を簡素化し、コスト効率を向上可能
- エンコードやパラメータを完全に制御して柔軟な24時間365日のライブビデオワークフローやイベントベースのライブストリームを配信可能で、業界標準のビデオプレーヤーや、幅広いCDNをサポートしており、ベストオブブリードで構築可能
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189312/0960142b-e980-e3ea-aafc-2be32fbc7584.png)

## AWS Elemental MediaPackage
単一の素材から多種類のデバイスに対して**セキュア**なストリーミングを行うための**ジャストインタイムパッケージサービス**。
:grinning::speech_balloon: 「多種類のデバイスに向けてブロードキャストに配信」する

:warning: Input 形式は **Apple HLS** しか指定できません (2018.1.26現在)
:warning: Output 形式は **Apple HLS, DASH-ISO, Microsoft Smooth** が指定できます (2018.1.26現在)

- ワークフローの複雑さを軽減し、オリジンの可用性を向上させ、インフラストラクチャのリソースの過不足リスクなしにマルチスクリーンコンテンツを保護
- 幅広いデバイスにビデオを効率的に配信
    - HLS, DASHおよびMSS出力のジャストインタイムパッケージ
- リッチコンテンツ保護機能
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189312/0960142b-e980-e3ea-aafc-2be32fbc7584.png)

## AWS Elemental MediaConvert
高品質のビデオトランスコードと放送レベルの機能を備えた、ビデオオンデマンドコンテンツを簡単に作成できるファイルベースの**動画変換サービス**。
:grinning::speech_balloon:「動画ファイルを多種類のフォーマットに変換する」

- 入力ビデオボリュームの変動に応じて自動的に拡大縮小
- ジョブの処理能力と順序を管理
![image.png](https://qiita-image-store.s3.amazonaws.com/0/189312/4fc00b0a-cd1f-b185-20a6-e32c6956af11.png)

## 終わりに
MediaStoreとMediaTailorは時間のある時に書きます。
Golangの最新版をソースからビルドする

Ubuntu 16.04 でgolang 1.9.3 をビルドしました。
2018.2.19 golang 1.10のビルドを追記しました。

# 準備

golangはv1.5以降golang自身で書かれているため、ソースからビルドするためにはまずなんとかしてそこで使用できるgolangをインストールする必要があります。
そのためにはいくつか方法があります。

- Ubuntuのリポジトリにあるgolangをapt-get でインストールする
- golang v1.4のソースコードを入手してビルドする

ここではてっとりばやく前者を試しました。

```
$ sudo apt-get install golang-go
```

```
$ which go
/usr/bin/go
$ go version
go version go1.6.2 linux/amd64
```

#golang のソースを入手してビルド

```
wget https://dl.google.com/go/go1.9.3.src.tar.gz
tar xf go1.9.3.src.tar.gz 
cd go/src
GOROOT_BOOTSTRAP=/usr/lib/go ./make.bash 
```

```
$ ../bin/go version
go version go1.9.3 linux/amd64
```

go/bin に実行ファイルが置かれるので、このディレクトリをPATHに追加すればインストール完了。



ビルドとテストを行うには make.bashの代わりにall.bash を実行します。(非力なマシンではテストにけっこう時間がかかります。)

```
GOROOT_BOOTSTRAP=/usr/lib/go ./all.bash 
```

#追加情報(2018.1.30)
メモリ600MBの仮想マシンでビルドしたら、out of memory error でビルドが失敗しました。
1.7GBに増やしたら成功しました。

#追加情報(2018.2.19)
golang　1.10ではGOROOT_BOOTSTRAPを明示的に指定しなくても、現在のPATHにgoコマンドがあれば、それを使ってくれるように変わりました。

```
$ which go
/home/koba/work/go/go1.9/bin/go
$ cd src
$ ./make.bash
Building Go cmd/dist using /home/koba/work/go/go1.9.
Building Go toolchain1 using /home/koba/work/go/go1.9.
Building Go bootstrap cmd/go (go_bootstrap) using Go toolchain1.
Building Go toolchain2 using go_bootstrap and Go toolchain1.
Building Go toolchain3 using go_bootstrap and Go toolchain2.
Building packages and commands for linux/amd64.
---
Installed Go for linux/amd64 in /home/koba/work/go/go1.10
Installed commands in /home/koba/work/go/go1.10/bin
```

```
c$ cd ../bin
$ ./go version
go version go1.10 linux/amd64
```
C#でも(a == 1 && a == 2 && a == 3) を常に真にできますか？

お昼休みに書いてみた
演算子オーバーロードあるし普通ですね

元ネタはこれらしい
https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3-ever-evaluate-to-true

```csharp
using System;


class MainClass
{
    public static void Main(string[] args)
    {
        var a = new A();
        if(a==1&&a==2&&a==3){
            Console.WriteLine("true");
        }
    }
}
class A
{
    public A() { }
	public static bool operator ==(A a1,int a2)
	{
		return true;
	}
    public static bool operator !=(A a1, int a2)
    {
        return true;
    }
}

```
Javaで(a == 1 && a == 2 && a == 3)をtrueにしたかった

stack overflowで[(a ==1 && a== 2 && a==3)を常にtrueにできるか](https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3-ever-evaluate-to-true)という記事が流行っています。
元ネタはjavascriptの問題ですが、Periで同様の問題をやっている記事を見かけので、私も流行に乗るべく記事を投稿します。

現在、業務で主にJavaを使用しているのですが、そこでJavaならどうやってできるか考えました。
流石にQiitaのどこかに上がってるでしょ～って気分で色々漁りましたが、[(a==1&&a==2&&a==3)を常にtrueにするStackOverflowの問題を解いたQiita記事まとめ](https://qiita.com/aimof/items/bb786c112f7dcc3be6c9)を見る限りでは無さそうでした。
じゃあ見つければ一番乗りでは？　と思い、試行錯誤して玉砕した結果がこれです。

# 考えられる解法

解法はいろいろあるようです。一例としては、こんな感じ。

* `==`演算子のオーバーロードによって全ての真偽値判定を真にする
* aを関数にして、呼ばれる度にaの戻り値を変更する
* aをオブジェクトにして（以下略）

参考：（[(a == 1 && a == 2 && a == 3) を常に真にできますか？](https://qiita.com/Morichan/items/4894d7d92ecab7a3afd8)）

とりあえずこれだけ試行しました。
Javaはコーディング制約が厳しいというか、他の言語ではできるような書き方の省略を許していなかったり、他の言語にある機能を実装していなかったりすることが多いので、基本的にうまくいきませんね。

## `==`演算子のオーバーロード

Javaには演算子のオーバーロードなんて高度な機能は実装されていません。
C++やPerlにはあるのに。

## aを関数にする

```java:Main.java
public class Main {
	static int i = 1;
	
	public static void main(String[] args) {
		System.out.println(a() == 1 && a() == 2 && a() == 3);
		//trueが表示される
	}
	
	static int a() {
		return i++;
	}

}
```

Javaに「引数の無い関数は()を省略してもよい」みたいな機能があればできました。多分これが一番惜しいと思います。

## aをオブジェクトにする

そもそもオブジェクトとプリミティブ型を比較することができないと怒られてしまいます。

```java
		Object a = 1;	
		System.out.println(a == 1 && a == 2 && a == 3); //コンパイルエラー
```

オブジェクト内のフィールドやメソッドを呼ぼうにも、結局は`a.number`や`a.getint()`のように書かなければならないため、ダメです。

オブジェクトをそのまま呼んでも勝手に型変換してくれる都合の良いクラスはあるにはあります。ラッパークラスです。

```
		Integer a = 1;
		System.out.println(a == 1); //内部的にはa.intValue() == 1になる
```

じゃあこれを継承したクラスを作って`intValue()`を弄ればいいじゃん！　と思ったら、finalクラスで継承できませんでした。そりゃそうですよねー。

「関数インタフェースを使用した場合、引数が無いときは()を省略してもよい」みたいなルールでもできませんかね。

# 結論

Javaでは(a == 1 && a == 2 && a == 3)を常にtrueにするのは不可能説。
解法を知ってる方は是非教えてください。。。

# 追記
ちゃんと調べればありました。先人の皆様、すみませんでした。
[Java でもa == 1 && a == 2 && a == 3でtrueって出力させたい](https://qiita.com/opengl-8080/items/a9e53d38c18a473e85b1)
[Java でもa == 1 && a == 2 && a == 3でtrueって出力させたい（黒魔術編）](https://qiita.com/deaf_tadashi/items/f145bc4645127b88281b)
[Javaでif (a == 1 && a‬ == 2 && a‬‬ == 3)でtrueを出力（見えない識別子編）](https://qiita.com/nagise/items/ab83229123d16791c32e)
[Java でもa == 1 && a == 2 && a == 3でtrueって出力させたい（PowerMockito編）](https://qiita.com/ngsw_taro/items/594f14dd22afd1660091)
[Java でもa == 1 && a == 2 && a == 3でtrueって出力させたい(真っ黒編)](https://qiita.com/Wreulicke/items/425601e0d2b754e1251a)

PowerMockito使えばIntegerを無理矢理継承できたんですね。
redmine 構築備忘録

#ほんと、今更なものだしメモなので。
トレンドなカッコイイものを期待してはいけない（汗）
bitnamiはオールインワンでいいですね。面倒臭くない。

ローカルnwのみで作業してインターネット接続していない場合は前もってパッケージはダウンロードして転送する準備をしておいてください。（perl-data-dumperあたりは落とさないと無いかも。）
インターネット接続しているサーバからであれば、wgetで直接ダウンロードしてくればスマートで最新を用意しやすいですね。

---

環境　CentOS7
redmine　bitnami-redmine-3.4.4-1-linux-x64-installer.run

OSインストール　起動時のオプション　vga=791
IP設定　nmtui
SSH・Selinux・FIREWALL確認

teratermでSSH接続

メディアマウント　mount /dev/cdrom /media/cdrom
yum レポジトリ確認　cat /etc/yum.repos.d/CentOS-Media.repo・・・

SCPで上記ファイル転送
実行権利与える　chmod 777 bitnami～

必要パッケージを入れる
yum install perl
yum install perl-Data-Dumper

###インストール実行
./bitnami-redmine-3.4.4-1-linux-x64-installer.run
　※警告がある場合は中断して、すべて解決してから再実行する
　※インストール中にgit、subversion、phpmyadminを有効にするか聞かれる。
　※管理者情報、メール通知を使うかなども聞かれる

---
###運用シェル作成（お好みで。
vi /home/redmine-status.sh
/opt/redmine-3.4.4-1/ctlscript.sh status mysql
/opt/redmine-3.4.4-1/ctlscript.sh status apache
/opt/redmine-3.4.4-1/ctlscript.sh status subversion

vi /home/redmine-start.sh
/opt/redmine-3.4.4-1/ctlscript.sh start mysql
/opt/redmine-3.4.4-1/ctlscript.sh start apache
/opt/redmine-3.4.4-1/ctlscript.sh start subversion

以上
railsのtrailing_slash: trueがテストの時だけ効かない

# 起きたこと

```ruby:config/application.rb
# 前略
  config.action_controller.default_url_options = { trailing_slash: true }
# 後略
```

て書いたところ

```ruby
> new_user_session_url
# こうなってほしい
"/users/sign_in/"
# けど、テスト内で呼び出すとこうなる
"/users/sign_in"
```

# 解決策

```ruby:config/environments/test.rb
# 前略
  Rails.application.routes.default_url_options = { trailing_slash: true }
# 後略
```

て書いたところ、無事想定通りに動いた :tada:
テスト実行時とサーバー実行時でdefault_optionsの参照が変わるってことなのか…？ :thinking: 

#参考

https://github.com/rspec/rspec-rails/issues/1275#issuecomment-249609283
[読書メモ]Pattern-Oriented Software Architecture（下準備） - 分散システムとは？

# （What）分散システムとは？
ネットワークに繋がれた複数のコンピュータを使って、プログラムを同時並行的に実行するシステムのこと。

# （Why）なぜ分散システムを使うのか？
以下三つの観点がある

1. Scalability
    - より多くのPCリソースを使うことで、計算処理をより早く終わらせるため。
2. Resilience
    - 処理を担当できるPCが複数台あることで、その中のどれかがクラッシュなどで処理不能になった場合でも、処理自体は完遂可能にするため。
3. Location
    - ネットワーク通信は時間がかかる（特に日本とブラジルのように物理的にも距離が遠いとなおさら）が、物理的にユーザとサーバを近づけることでネットワーク通信の速度を短縮するため。

# 特徴（分散システムをうまく動作させるために）
- 個々のプログラムを疎結合にする必要がある。
個々のプログラムはAPI経由で連携を取り合い、それぞれの実装については知っていてはならない。

- データを重複して持っている必要がある。
それぞれのプログラムが同じデータを参照すると、分散させている効力が発揮できない？
だが、重複してデータを持つことは潜在的なバグの温床になるので、難しいところ。

# 参考
http://container-solutions.com/what-is-a-distributed-system/
https://ja.wikipedia.org/wiki/%E5%88%86%E6%95%A3%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0
MariaDB起動時のエラー(エラーとは言っていない)

```
$ sudo service mysql start
 * Starting MariaDB database server mysqld                                        [ OK ] 
 * Checking for corrupt, not cleanly closed and upgrade needing tables.
```

corruptとか脅してくるmaria様。

```
$ mysql_upgrade -u panel -p
(略)
Could not create the upgrade info file '/var/lib/mysql/mysql_upgrade_info' in the MySQL Servers datadir, errno: 13
```

しかし、*mysql_upgrade*でアップグレードしたら上述のエラーが起きる。

```
$ apt-cache policy mariadb-server
  Installed: 5.5.57-1ubuntu0.14.04.1
  Candidate: 5.5.58-1ubuntu0.14.04.1
  Version table:
     5.5.58-1ubuntu0.14.04.1 0
        500 http://archive.ubuntu.com/ubuntu/ trusty-updates/universe amd64 Packages
        500 http://security.ubuntu.com/ubuntu/ trusty-security/universe amd64 Packages
 *** 5.5.57-1ubuntu0.14.04.1 0
        100 /var/lib/dpkg/status
     5.5.36-1 0
        500 http://archive.ubuntu.com/ubuntu/ trusty/universe amd64 Packages
```

最新バージョンがあるようだ。

```
$ sudo apt-get update
(略)
  mariadb-client-5.5 mariadb-client-core-5.5 mariadb-common mariadb-server
  mariadb-server-5.5 mariadb-server-core-5.5 multiarch-support mysql-common
(略)
$ sudo apt-get upgrade
```

他にも色々更新があったのでまとめて更新。

```
$ mysql_upgrade -u username -p
(略)
Could not create the upgrade info file '/var/lib/mysql/mysql_upgrade_info' in the MySQL Servers datadir, errno: 13
```

しかし、やはりエラーになる。エラー13番ってなんだろ。

```
#define EACCES          13      /* Permission denied */
```

Qiitaの記事「[errnoの値の定義を探す](https://qiita.com/h2suzuki/items/0cc924cdd9d5c6d47448)」より。権限周りらしいのでsudoで試す。

```
$ sudo mysql_upgrade -u panel -p
This installation of MySQL is already upgraded to 5.5.58-MariaDB, use --force if you still need to run mysql_upgrade
```

ということで*--force*オプションが必要らしい。

```
$ sudo mysql_upgrade -u panel -p --force
(略)
OK
```

**OK**が出たのでMariaDBを再起動してみる。

```
$ sudo service mysql restart
 * Stopping MariaDB database server mysqld                                   [ OK ] 
 * Starting MariaDB database server mysqld                                   [ OK ] 
 * Checking for corrupt, not cleanly closed and upgrade needing tables.
```

……何がOKだったのだろうか…。
ちなみにこのメッセージは出ても問題ないらしい…。

[参照1](http://nackedape.blogspot.jp/2009/05/mysql.html) [参照2](http://d.hatena.ne.jp/jitsu102/20100208/1265608600) [参照3](https://serverfault.com/questions/613533/how-to-fix-corrupt-not-cleanly-closed-and-upgrade-needing-tables-in-mysql)