OmniAICreator/Qiita-1.07M huggingface dataset:
Spikeが終了するらしいのでオンライン決済サービスを比較してみた

# はじめに

2018年5月31日にオンライン決済サービスSpikeの[サービス終了アナウンス](https://support.spike.cc/hc/ja/articles/360000089722-2018%E5%B9%B45%E6%9C%8831%E6%97%A5-%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E5%81%9C%E6%AD%A2%E3%81%AE%E3%81%8A%E7%9F%A5%E3%82%89%E3%81%9B)がありました。

![スクリーンショット 2018-08-30 16.08.27.png](https://qiita-image-store.s3.amazonaws.com/0/240907/ddca08f0-7f1c-b3c5-7bf5-97ee4403dc56.png)

サービスはプランごとに順次停止され、8月末にフリープラン決済サービス、11月末にビジネスプレミアム決済サービスが停止するそうです。

![スクリーンショット 2018-08-30 16.08.45.png](https://qiita-image-store.s3.amazonaws.com/0/240907/d96d4d7c-a1ff-f90e-9dca-4486156e1a5f.png)

決済サービスの乗り換え先を探す必要のある人が出てくると思うので、spikeのようにAPIで利用できるオンライン決済サービスを比較してみました。

比較軸は「利用料金」、「決済手段の種類」など人それぞれだと思いますが、決済サービスを選ぶ参考になれば幸いです！

# 比較対象サービス

APIを利用して簡単にクレジットカード決済機能を組み込むことのできるサービスを比較対象として取り上げます。
ウェブサイトに価格を公開していない企業は除外しています。（抜け漏れがあればぜひご連絡ください。）

（アルファベット順）
- [Omise](https://www.omise.co/ja)
- [Pay.jp](https://pay.jp/)
- [Paypal](https://www.paypal.com/jp/home)
- [Stripe](https://stripe.com/jp)

# 比較軸

- 料金（初期費用・決済手数料・その他維持費等）
- 対応している決済手段の種類
- 継続課金対応（毎月決まった金額を課金するような決済方法に対応しているか）
- マーケットプレイス対応（マーケットプレイス型のビジネスのモデルに対応しているか）

# 比較表
(略称) Visa: V, Master Card: M, JCB: J, AMEX: A, Diners: D, Discover: Ds

| サービス名 | 初期費用 | 月額費用 | 決済手数料 | その他 | 対応決済手段 | 継続課金 | マーケットプレイス |
|:--|:--|:--|:--|:--|:--|:--|:--|
| Omise | 無料 | 無料 | V, M：2.95%<br/>J, A, D：3.6%<br/>コンビニ、Pay-easy、ネットバンク：0.5%+150円 | 売上を口座に入金する際に振込手数料260円が掛かる | クレジットカード (V, M, J, A, D)<br/>コンビニ<br/>Pay-easy<br/>ネットバンク | ○ | ○ |
| Pay.jp (ベーシックプラン) | 無料 | 無料 | V, M：3.0%<br/>J, A, D, Ds：3.6% | なし | クレジットカード (V, M, J, A, D, Ds)<br/>Apple Pay | ○ | ○ |
| Pay.jp (プロプラン) | 無料 | 10000円 | V, M：2.59%<br/>J, A, D, Ds：3.3% | なし | クレジットカード (V, M, J, A, D, Ds)<br/>Apple Pay | ○ | ○ |
| Paypal (エクスプレスチェックアウト、ウェブペイメントプラス) | 無料 | 3000円 | 30万円以下：3.6 % + 40 円 / 件<br/>30万円超100万円以下：3.4 % + 40 円 / 件<br/>100万円超1,000万円以下：3.2 % + 40 円 / 件<br/>1,000万円超：2.9 % + 40 円 / 件 | なし | Paypal<br/>クレジットカード (V, M, J) | ○ | ○ |
| Stripe | 無料 | 無料 | V, M, J, A, D, Ds：3.6% | なし | クレジットカード (V, M, J, A, D, Ds)<br/>Alipay, WeChat Pay | ○ | ○ |

# 参考リンク

- [オンライン決済サービスの比較（2016年11月）](https://qiita.com/Masaaki_Inaba/items/c2a5afd1481276f4c60f)
- [Omise](https://www.omise.co/ja)
- [Pay.jp](https://pay.jp/)
- [Paypal](https://www.paypal.com/jp/home)
- [Stripe](https://stripe.com/jp)
PowerPointの総ページ数をPowerShellで更新（課題残り）

#はじめに
弊社のPowerPointのフォーマットには総ページ数の項目があるのですが、
ここが更新されていないばっかりに資料が通らないことが何度もありました。
（中身を見てくれ…）
具体的には`<#>/000`というテキストボックスがスライドマスターに設定されています。
ここの000を総ページ数に手動で更新する必要があるのですが、手間です。
ポチッと更新せんと組み始めたのですが、引っかかっております。

#参考資料
[PowerPoint VBA リファレンス](https://msdn.microsoft.com/ja-jp/vba/vba-powerpoint)
前回のExcelと違って妙にしっくりこないことが散見される。

#環境
- Windows10 Pro Ver.1703
- PowerPoint 2016
- PowerShell

#ソースコード
```Powershell:PageCount.ps1
#PowershellでPowerPointの総ページ数を更新
#未解決問題2点あり

#ダイアログを使えるようにする
[void][System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms")
$dialog = New-Object System.Windows.Forms.OpenFileDialog
$dialog.Filter = "pptファイル(*.ppt;*.pptx)|*.PPT;*.PPTX"
$dialog.InitialDirectory = "C:\Users\1501275\Desktop\kojin"
$dialog.Title = "ファイルを選択"
if($dialog.ShowDialog() -eq [System.Windows.Forms.DialogResult]::OK){
    $filepath = $dialog.FileName
    #なにかと便利なのでつい用意してしまう
    $folder = Split-Path -parent $filepath
    $filename = [System.IO.Path]::GetFileNameWithoutExtension($filepath)
    $extension =[System.IO.Path]::GetExtension($filepath)
} else {
    Read-Host "キャンセルされました。ENTERキーを押してください。"
    return    
}

#PowerPoint側の作業
$pp = New-Object -ComObject PowerPoint.Application
$pp.Visible = "msoTrue" #可視化
$pp.DisplayAlerts = "ppAlertsAll" #アラート類も可視化
$slide = $pp.presentations.Open($filepath)

#変数定義
$variable = "‹#›"
$pagecount = $slide.Slides.Count

#実行部分
foreach ($shape in $slide.slidemaster.shapes){ #スライドマスター内の各オブジェクトについて
    if($shape.HasTextFrame){ #そのオブジェクトがテキストを持っていれば
        $text = $shape.TextFrame2.TextRange.Text #テキストの内容を取得し
        $pos_variable = $text.indexof($variable) #テキスト内のvariableの位置を取得し
        if($pos_variable -ge 0){ #variableが存在すれば対象の図形と判断し
            $shape.TextFrame2.textrange.replace("000",$pagecount)
        }
    }
}
$pp.ActivePresentation.SaveAs($folder + "\" + $filename +"_更新" +$extension)

#末端処理
$slide.Close()
$pp.Quit()
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($pp)
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($slide)

```

#出力
Before
![2-000.png](https://qiita-image-store.s3.amazonaws.com/0/276779/2267bf35-4be6-6efb-3eb4-e7eb631baf96.png)
After
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/276779/07d499e0-cc03-6a64-14ff-76bd57bdba62.png)

やったぜ。

あとなぜかスライドは閉じることができるんだけどPowerPoint自体が終了できない。

目下調査中です。
Photoshop extensionでjsxを呼び出す方法

#Photoshop extensionでjsxを呼び出す方法
複数のjsxを作成してくると、scriptで呼び出しするのが面倒になり、Extensionでボタン一個で呼び出したくなる。
最初はmanifest.xmlに複数ScriptPathを入れればうまくいくだろーと言う気持ちだったのですが、これがどうにもうまく行かず....(一つしか読み込めない仕様なのかな？)
仕方なく、押したパネルのボタンに応じてjsxを読み込む方式にすることに。
ちょっと癖があったので備忘録。

## 現在のScriptPathを取得
jsxの読み込みは相対パスだとうまく行かないので、絶対パスを取得する。
埋め込んでもいいですが、汎用性が低くなるのでプログラムで取得したい

```jsx
function getScriptPath()
{
  return new CSInterface().getSystemPath(SystemPath.EXTENSION);
}
```
CSInterfaceくん便利....

## 指定したjsxを実行

```jsx
function scriptExecuter(name)
{
  var path = getScriptPath() + "/jsx/"+name+".jsx";
  try { csInterface.evalScript('$.evalFile( "'+path+'")'); }
  catch(e) { alert(e); }
}
```
jsxはextensionプロジェクト以下の/jsxフォルダに全部まとめる。
呼び出すjsxの中身は即時関数になっているか、読み込んだタイミングでうまくメインの関数が呼ばれる仕組みになっていないといけないのが注意.

普段、スクリプトから呼び出す形式で開発していたjsxをそのまま配置すれば使えるので、なかなか便利。
スクリプトでは普通に```#include hogehoge```とか使えます
JavaScriptのテンプレートエンジンはHandlebars.jsが最強なんじゃないか説

ReactやAngularを導入するまでもないような、小規模のWebシステムをチャチャッと作る時、Handlebars.jsを使ったら便利過ぎたのでメモ。

[Handlebars.js: Minimal Templating on Steroids](https://handlebarsjs.com/)


# Handlebars.js に出会う前の私

APIから受け取ったデータでHTMLを組み立てる際、こんなことをしていました…。

```js:JavaScript
function createHTML(data) {
    var html = '<ul>';
    for (var i=0; i<data.items.length; i++) {
        html+= '<li>' + data.items[i].name + '</li>';
    }
    html+= '</ul>';

    return html;
}
```
これはあくまで例なのでシンプルですが、実際はこんなもんじゃ済まないですよね。

# Handlebars.js に出会ってからの私

```html:HTML
<script type="text/x-handlebars-template" id="template">
  <ul>
    {{#each items}}
    <li>{{name}}</li>
    {{/each}}
  </ul>
</script>
```

```js:JavaScript
var source = $('#template').html();
var template = Handlebars.compile(source);
var values = data;
var html = template(values);
```

これなら複雑なHTMLにも対応できますね！
記法もLaravelのBladeに似ているので、ララベラーの方も導入しやすいんじゃないでしょうか。
Android Studioでlogcatが出ない場合の対策

小さな気づきですが、あんまり記事が見つからなかったので、自分へのメモに書いときます。
会社の達人に教えてもらいました。


### 環境

* macOS バージョン10.13.3
* Android Studio 3.1.4


### 事象

logcatが出ない。

View > Tool Windows > 「Logcat ⌘6」が選択できない状態になっている。

久しぶりにデバッグしようとしたらこうなってた。原因不明。

### 対処法

（１）MacでAndroidStudioを完全アンインストール
https://qiita.com/nagaoyuriko/items/f310b595ff16061e1186

（２）再インストール時に、以前の設定を引き継ぎますか？というポップアップが出るので、「Do not import settings」を選んでOKをクリックする。


![importsettings.png](https://qiita-image-store.s3.amazonaws.com/0/173392/df639c7d-02d9-f71c-1db6-bbe1e4bae72f.png)

（３）つづけてパッケージ類を特に悩まずにインストール。

### 復旧したの図

![dekita.png](https://qiita-image-store.s3.amazonaws.com/0/173392/eb3645ea-2178-d995-801f-82960eab00fd.png)


### 感想

急いでたので、だいぶ焦った。
facebookログインが失敗!?

自分メモです。

運営しているサイトで、突然facebookログインができなくなった。
表示されるエラーは

```
facebook response exception: 無法載入網址: 這個網址的網域未包含在應用程式的網域中。若要載入這個網址，請在應用程式設定的「應用程式網域」欄位中新增應用程式的所有的網域及子網域。
```

これ。なぜ中国語になっているかは別問題？だけど、URLが違うのでアクセスできないとのこと。

何も設定変えていないのになぜ？と調査を開始。

エラーが出ているのは、

```php:callback_for_facebook
$helper = $fb->getRedirectLoginHelper();
$accessToken = $helper->getAccessToken();
```

この部分。どうやらアクセストークンが取れていない模様。

facebook developer で設定を確認しても特に問題はなさそう。
ということで、Google先生に聞いてみる。

https://stackoverflow.com/questions/51875266/facebook-sdk-graph-api-v3-1
このサイトがヒットして、同じ症状とのこと。
コメント欄に回答あり！やったー！

完全な解決方法ではないとの注釈はあるけど、同じように修正したらアクセストークンが取得できた。
パラメータに渡すということは、不正利用ができそうな気もするけれど。。。

まずは、解決。よかった。
Hueのクエリエディターで、自作UDFのFunctionを使う方法

# Hueのクエリエディターで、自作UDFのFunctionを使う方法

私が採用している方法は、以下の２つ

----
## 方法1　クエリエディタのSettingsで、UDFのJARファイルをアップロードし、Functionを定義追加する

①SettingsのFilesで、UDFのJARファイルをアップロードする

私は、/user/hadoopにアップロードしています。

②アップロードしたJARファイルを選択

テキストボックスに、アップロードしたJARファイルへのパスが表示される。

Path: /user/hadoop/udfs-all.jar

③Functionsに、function名とjavaのパッケージ〜クラス名を入力

Name：　udf_my_sum
Class: jp.co.sampel.udf.MySum

④実際にクエリから利用する

```sample.q
SELECT id, udf_my_sum(price) FROM books;
```

----
## 方法2　s3バケット上のUDFのJARファイルを参照する

事前にアクセスキーなど設定が必要ですが、EMRを利用している事として既にバケットにはアクセス可能な前提

①クエリで、CREATE FUNCTIONする

```sample.q
CREATE FUNCTION udf_my_sum AS 'jp.co.sampel.udf.MySum' USING JAR '${LIB}/udfs-all.jar';

SELECT id, udf_my_sum(price) FROM books;
```

変数：LIB=s3://my-bucket

と設定して実行

---

他にもあるとは思いますが、基本的にはこの２つで良いかと
Photoshop ScriptのSolidColorではまったところ

# SolidColor生成がどうしても真っ白になる

ちょっとはまったので備忘録.

photoshopのスクリプトでは選択範囲を塗りつぶす時に

```jsx
app.activeDocument.selection.fill(RGBColor, ColorBlendMode.NORMAL, 100, false);
```

と言うコードを書くが、どうにもRGBColorの生成がうまく行かないらしく、真っ白で塗りつぶされてしまう

```jsx
/** うまくいかない例 **/
var RGBColor = new SolidColor();
RGBColor.model = ColorModel.RGB; // これは実はいらないかも？？
RGBColor.red = 255;
RGBColor.green = 0;
RGBColor.blue = 0;
```

諦めて[公式のpdf](https://wwwimages2.adobe.com/content/dam/acom/en/devnet/photoshop/scripting/photoshop_scriptref_js.pdf)を覗きに言ったところ、red,green,blueと言うプロパティはないらしい.....
代わりにrgbと言うプロパティがあるので、ここに突っ込んで見ることに。

```jsx
/** うまくいく例 **/
var RGBColor = new SolidColor();
RGBColor.model = ColorModel.RGB; // これは実はいらないかも？？
RGBColor.rgb.red = 255;
RGBColor.rgb.green = 0;
RGBColor.rgb.blue = 0;
```
と言うことで、これで治りました

どっかのタイミングで変わったのかな？
photoshopのバージョンによって違うかもです。(この検証時ではphotoshop cc2018[v19.15])
テプラのインストール時の注意

## テプラのインストール時の注意

テプラの最終的にインストールはできたのですが、はじめうまくいかなかったので手順を紹介します。

## 使用テプラ
使用したテプラは[「テプラ」PRO SR3500P](https://www.kingjim.co.jp/products/tepra/sr3500p.html)になります。

## 説明
まず初めにSR3500Pの初期ドライバSPC9というのを使用したのですが、Windows10に対応しておらず、インストールするとバグります。現在のドライバはSPC10になるので、公式サイトからSPC10をダウンロードして使います。

##### SPC10ダウンロードページ：https://www.kingjim.co.jp/download/tepra/spc10_api/

ここから下のほうにあるダウンロードボタンからSPC10をダウンロードしてください。
後はそのままの流れでインストールすれば大丈夫です。

## 補足
基本的にはこれでどうにかなるはずですが、間違ってSPC9をインストールした場合の対処について紹介します。
SPC9をインストールするとたまになのか絶対なのかわかりませんがアンインストールができなくなるので、[GeekUninstaller](https://www.vector.co.jp/soft/winnt/util/se498412.html)を使用して強制アンインストールして削除してください。
macで、astah* ver.6.9が起動しない場合

macで、astah community ver 6.9を起動しようとするとこけるので調べた

# 参考先

[Macで、astah* バージョン 6.9が起動しない不具合](https://ja.astahblog.com/2017/09/27/6-9-no-launch-on-mac/)という記事があったので、参考にさせていただきましたが、注意書きにある「初めてバージョン6.9を起動する場合は、Aの回避方法は利用できません。」ってのに従おうと思ったんですが、Bを行うのはちょっとNGだったので、強制的にAを行いました
書いても仕方がないかと思ったんですが、一応１ケースでこんなのもあるよということで共有です

# 基本変わらないが強制対応しましたってことです

### astah-community をダウンロードしてからバイナリイメージを展開する

```bash:shell
 unzip _ astah-community-6_9_0-b4c6e9.zip

```

### 一度、command line上で astahを起動する

```bash:shell
 cd {astahをインストールしたパス}
 java -jar astah-community.jar

```

### ユーザーホーム配下にある設定ファイルを編集する

```bash:shell
vi {ホームパス}/.astah/community/Jude.properties

  diagram.editor.initial_operation=false

```

上記の設定が存在しない場合は追記する。存在してtrueになっている場合はfalseにする
ケース共有なので、ダメだったら、基本に戻っていただければと思います。
Unity3D で一発で読み込めないPolyWorld のモデルを読み込めるようにする。

PolyWorldはグーグルが公開してくれているほぼフリーラインセンスで使えるモデル公開サイトですが
たまに、そのままＤＬしてUnity3Dで使おうとしても色が抜けてしまうものがある。そこで読みこみやすいfbx形式に変換してやる必要があるのですが、そんなときに使えるのがAutodeskのFBX Converterです。

これを使えば大半はテクスチャ抜けずに使えるはず
Acknowledgement on Setting

1. Add settings.Bundle
2. add script to [Build Phases]-[Run Script]
3. add this to Podfile

```
# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

def install_pods
  pod 'SVProgressHUD'
  pod 'CTCheckbox'
  pod 'ionicons'
  pod 'CWPopup'

  pod 'AFNetworking', '~> 3.0'
end

target 'StationNotification' do
  # Uncomment the next line if you're using Swift or would like to use dynamic frameworks
  # use_frameworks!

  install_pods

  # Pods for StationNotification

  post_install do | installer |
      require 'fileutils'
      FileUtils.cp_r('Pods/Target Support Files/Pods-StationNotification/Pods-StationNotification-acknowledgements.plist', 'Roulette/Settings.bundle/Acknowledgements.plist', :remove_destination => true)
  end

end
``` 
4. pod install

```
APP_VERSION=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" $PRODUCT_SETTINGS_PATH)
/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:1:DefaultValue ${APP_VERSION}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/Settings.bundle/Root.plist"
```
PHP: なぜ !$value instanceof ClassName という書き方が問題なく動くのか？

PHPで`instanceof`演算子は、変数がクラス(またはサブクラス)のインスタンスであれば`true`、そうでなければ`false`を返す。


```php
$date = new DateTime();
assert($date instanceof DateTime);
assert(($date instanceof StdClass) === false);
```

PHPには`not instanceof`のような逆の演算子は存在しない。そのため、論理演算子`!`を組み合わせて使う:

```php
!$date instanceof StdClass
```

この書き方は一見すると常に`false`を返すように見える。なぜなら、次のように式が評価されると思われるからだ。

```php
$date = new StdClass();
!$date instanceof DateTime
((!$date) instanceof DateTime)
(false instanceof DateTime)
(false)
false
```

しかし、上記の評価順の認識は誤りで、実際は`$date`が`DateTime`のインスタンスでないときだけ`false`を返す。つまり、`not instanceof`としての期待通りの評価になる。

こうした誤認は、`instanceof`演算子と他の演算子(例えば比較演算子の`===`など)と評価の優先度が同じだと勘違いしているときに起こりうる。例えば、`!$a === $b`は`!($a === $b)`と同じでないが、`!$a instanceof $b`は`!($a instanceof $b)`と同じである。

PHP7.2の演算子の優先順位では、`instanceof`は第5位で、`！`は第6位であるから、`instanceof`は`！`よりも先に評価される。

<img width="874" alt="PHP__演算子の優先順位_-_Manual.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/189e98a8-7b01-768d-3421-5cb74ee429c9.png">


一方で、`===`の優先順位は`！`よりもずっと後であるから、`！`が評価された後に、`===`が評価されるわけだ。

```php
$n = 5; $m = 5;
!$n === $m
((!$n) === $m)
(false === $m)
(false)
false
```

## 参考文献

[PHP: 演算子の優先順位 - Manual](http://php.net/manual/ja/language.operators.precedence.php)
Unityで使える音声認識(音声入力)調べてみた

##音声認識いっぱいあった

**Unityで作ったVRコンテンツの中で、音声入力で文字をおこしたい...!!**
ということで色々調べたら、めっちゃ種類があったので自分用にまとめ

日本語聞き取りからの文字起こしがどんな感じか、を中心に書いてるよ
多数の先人の知恵借りてます...大感謝

<font color=red>追加でこんな特徴あるよ、があったら！ぜひ！教えてください！</font>

今の所よさそうなのはWatsonかIntelかな...?

##各種紹介(アルファベット順)　
※は参照した意見なので後ろに参照元書いてます

###Google Cloud Speech API
Watsonより精度がいいとか※3
POST用の音声データ変換にはSoX(Sound eXchange)というOSSを使うが、Pythonでの使い方紹介が多い印象※1
60日までは無償利用可、以後は利用体系に応じて料金がかかる※1
Unityの有料アセットあった([Google Cloud Speech Recognition [VR\AR\Desktop\Desktop]](https://assetstore.unity.com/packages/add-ons/machinelearning/google-cloud-speech-recognition-vr-ar-desktop-desktop-72625?aid=1011lGbg&utm_source=aff))

###IBM Watson Speech to Text
[Watson×Unity！初心者でもできる、VR 空間で Unity ちゃんとおしゃべりアプリ！](https://www.ibm.com/developerworks/jp/cloud/library/unity/)で実施
(↑エラーはコメントアウトしちゃえば良いっぽい)
マイクにしっかり声が入ってればそこそこの精度
IBM Cloundの登録あるのがなんか面倒そう(メモリ量限られた範囲内であれば無料で使える)
文字から喋らせたり翻訳したり、他の機能の拡張は楽そう

###Intel RealSense

単語は怪しいこともあるが、7割方文章をそのまま文字に起こしてくれていたので優秀そう
SDKとるときexeだからmacの人注意
資料が豊富※2
自由な会話向き※2
[Unityで手っ取り早くマイクの音声を文字列にする](https://qiita.com/miyumiyu/items/e01f4493ee59da3dfef1)で本当に秒で実装できた

###Julius
精度を上げるには慣れが必要になりそう※2
限られたキーワード向き※2

###UnityEngine.Windows.Speech
Macでは動かない
ネットワーク接続は必須※1
感覚的には認識精度はあまり高くない※1
精度は高い※2
限られたキーワード向き※2

###VR Watson Speech Sandbox
めも：Watsonの純正チュートリアル→Unity 2018.2とってきて使ってみる？

###Web Speech API
node.jsでサーバたてる必要あり
精度が高い※2
資料が多く導入しやすい※2
自由な会話向き※2

※1:[【Unity】公式アセット「Speech-to-Text」の使い方とTips紹介](https://www.crossroad-tech.com/entry/UnityAsset_Speech-to-Text#4-%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AE%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D)
※2[【Unity】音声認識エンジンについて調べてみた](https://qiita.com/tomori_hikage/items/af1e0d00fc6f6f00e40e)
※3[Twitterのツイート](https://twitter.com/mild100/status/735341693143265280)
PHPでTSVファイルを読み込む時の注意点

区切り文字にタブを指定しているにもかかわらず、変な位置で区切られてしまったのでメモ。

```php:php
$file_path = 'data.tsv';

// TSVファイル読み込み
$file = new SplFileObject($file_path, 'r');

while ($file->valid()) {
    $row = $file->fgetcsv("\t", '"');
    // なんやかんや

    $file->next();
}
```

うまくいかない場合は、先頭に以下を追記するといいかもです。

```php:php
setlocale(LC_ALL,'ja_JP.UTF-8');
```

PHP5でgetcsv()関数を使用すると、日本語文字が消えるまたは一部消えることがあるようです。
[fgetcsv関数を文字化け対応 setlocaleの文字コード指定](http://pentan.info/php/fgetcsv_char.html)

# 2018-09-11追記

[Comma-Separated Values - Wikipedia](https://ja.wikipedia.org/wiki/Comma-Separated_Values)

> 類似したフォーマットとして、タブで区切られた tab-separated values (TSV)や、欧文間隔 (いわゆる半角スペース) で区切られた space-separated values (SSV) などがあり、これらをまとめて character-separated values (CSV)、delimiter-separated values (DSV) とも呼ばれることも多い。

タブで区切られていても、**character-separated values (CSV)**と呼ばれることも多いらしい。
マジかｗｗｗ
【Ruby】乱用厳禁！？後置ifで書くとかえって読みづらくなるケース

## はじめに

Rubyではif文を後置if（if修飾子）を使って1行で書き直すことができます。

```ruby
# 普通のif文
if foo
  bar
end

# 後置ifを使ったif文
bar if foo
```

ただし、後置ifが使えるからといって、無理に普通のif文を後置ifに書き直す必要はありません。
むしろ、後置ifを使うとかえって読みづらくなるケースもあります。

## 後置ifが不向きなケース

たとえば、あなたがコードレビューをしているとき、こんな（物騒な）コードを見かけたらどう思いますか？

![Screen Shot 2018-08-31 at 8.20.08.png](https://qiita-image-store.s3.amazonaws.com/0/7465/7bb53606-0de0-424e-03e5-c04b1c929829.png)

「おいおい、頭大丈夫？」と思うようなコードですが、実はこのコードは後置ifで書かれていました。
（ユーザがゾンビだった場合のみ、メッセージを返すメソッドだった！）

![Screen Shot 2018-08-31 at 8.21.31.png](https://qiita-image-store.s3.amazonaws.com/0/7465/dc7bf303-10e7-827c-140f-b100b2652535.png)

後置ifを読むときは条件文があとにやって来ます。
コードが横に長いと条件文がぱっと目に入らないため、「えっ、なんでこのタイミングでこんな処理が入るの！？」と読み手を困惑させる原因になります。

こういったケースでは普通のif文で書いた方が可読性が高くなります。

```ruby
def message_to(user)
  # 普通のif文で書けば、特定の条件のみメッセージを返すことは明らか
  if user.zombie?
    '絶対ぶっ○す！絶対ぶっ○す！絶対ぶっ○す！絶対ぶっ○す！絶対ぶっ○す！絶対ぶっ○す！'
  end
end
```

もちろん、ここで挙げた例は少し極端ですが、読み手は「上から下へ」「左から右へ」コードを読んでいくことを考えると、後置ifは可読性を悪化させる一因になることが想像できるのではないでしょうか。

## 後置ifが向いているケース（主観）

個人的には後置ifはあまり多用すべきではないと考えています。
僕がRubyのコードを書くときは単純に「後置ifに直せるかどうか」にかかわらず、「これは後置ifで書いた方がシンプルでわかりやすい」と思う場合のみ、後置ifを使うようにしています。

具体的には次のようなケースです。

- 後置ifを使っても横に長くならない
- 自然な英語っぽく読める（「do A if B ＝ BならAせよ」の形式で読める）

後置ifが特に便利なのは、ガード節をシンプルに書きたいときですね。

```ruby
def go_to_school
  # 眠かったら通学しない（処理中止）
  return if sleepy?
  
  get_up
  eat_breakfast
  leave_house
end
```

returnの代わりに例外を発生させて処理を中断するコードに使うのもいいと思います。

```ruby
def buy(item)
  # お金がなければ買えないので例外を発生させて中断する
  raise TooPoorError if no_money?
  
  self.money -= item.price
end
```

もちろん、ガード節以外のときに使うのもありです。
以下のようなコードは「英語っぽく読める」という条件には合致しないかもしれませんが、「横に長くならない」という条件は満たしているのでOKだと思います。

```ruby
price = item.price
# 特売日なら10円引き
price -= 10 if special_day?
price
```

前述のとおり、横に長くなったり、凝ったコードを書いたりする場合は、普通のif文を使いましょう。

```ruby
price = item.price
if special_day?
  # 横に長くなったり、凝ったコードを書いたりする場合は後置ifを避ける
  price = calc_special_price(price) { |rate| rate * item.rate_adjustment }
end
price
```

## おまけ：後置ifを使わずに同等の処理を1行で書く方法

if + then + end で1行に書く方法もあります。
ただし、英文っぽく読むにはendがちょっと邪魔な気がしますね。

```ruby
# もし金を持っていなければ処理中止
if no_money? then raise TooPoorError end
```

こちらは`and`演算子でつなげる書き方です。
ただ、こういう書き方（イディオム）に馴染みがないと、何をやっているのか一見わかりづらいかもしれません。

```ruby
# 金なしか？それなら処理中止
no_money? and raise TooPoorError
```

`or`演算子を使って「A? or B ＝ Aか？さもなければBせよ」という書き方もあります。（Perl風）

```ruby 
# 金を持っているか？さもなければ処理中止
has_money? or raise TooPoorError
```

このようにいくつかのバリエーションはありますが、個人的には後置ifが一番スッキリしていて好きです。

```ruby 
# 個人的にはこれがベスト！
raise TooPoorError if no_money?
```

## Rubocopの設定を変更する

(2020.11.2追記) Rubocopに後置ifを使え、と怒られるときは設定を変更してしまいましょう。

```.rubocop.yml
Style/IfUnlessModifier:
  Enabled: false
```


## まとめ

というわけで、この記事では後置ifの向き不向きについて考えてみました。
もちろん、これはあくまで僕個人の主観なのでまったく強制力はありません。

ですが、今まであまり深く考えずに後置ifを多用してきた人は、後置ifのせいでコードの可読性が落ちていないか、これから少し注意するようにしてみてください :smiley:
KeyboardEvent について調べた

キーボードのボタンを押した際と、ボタンを離した際にイベントが発生する（`keydown`, `keyup`）。なお、押されたのが普通の文字(ctrl, altとかじゃない奴ら)の場合、`keydown`に続いて`keypress`が発生するので、大抵はこっちの方が便利。

イベントを `e`とする。`e.key` で何が押されたかがわかるし、 `e.ctrlKey`, `e.altKey`, `shiftKey` などの bool値を調べれば、その文字と一緒に押されたキーがわかる

以下のコードでそれを確かめれられる:

```js
window.addEventListener('keydown', ev => {
  const ctrl = ev.ctrlKey ? 'Ctrl + ' : '';
  const shift = ev.shiftKey ? 'Shift + ' : '';
  console.log(`${ctrl}${shift}${ev.key} is pressed`);
});
```

上記の例では、`ev.key` が直接文字を返すので、shift 判定はあんまり重要でない。a が押された場合は `ev.key` は `'a'` になるし、shift + a が押された場合は、`'A'`になる。

重要なのは、キーの押しっぱなしで連続してイベントが発生しうることだ。例えば、「Shift + a を押したいな」というときは、まずは Shift を押しっぱなしにして、それから a を押す。このようなシチュエーションでは、`keydown` イベントが山ほど来る。そのほとんどは Shift の押しっぱなしのせいだ。

それがいやだよ、って場合は `keydown` ではなく、 `keypress` を使うべきなのだろうが、それはそれでめんどくさい。例えば、Ctrl + z が押された場合。この場合、`keypress` における、`ev.key`は z ではなく、`^Z`になってしまう。また、`ev.code` の値も入っていない。なので`keypress`でハンドルするのはそれはそれでややこしい。


参考: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent
シェル — 変数を使って動的に関数を定義する

## 例

### 変数定義

```
function_name="some_func"
```

### eval を使う

```sh
eval "function $function_name() { echo ok this is dynamic defined function; }"
```

別の書き方

```sh
eval function "$function_name"\(\) \{ echo ok this is dynamic defined 
 function\; \}
```

上の例は両方、次のように評価される

```sh
function some_func(){ echo ok this is dynamic defined function; }
```

`$function_name` だけがシェル的に変数展開されてから eval が実行される

### 実行例

```sh
$ some_func
ok this is dynamic defined function
```

## Versions

- bash-4.4
- sh-3.2
- GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin17)


## Links


- [Gist](https://gist.github.com/YumaInaura/dc13022e82401e6381b6ff6430a94b0f)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
NavigationBarの背景をスクロールの位置によって変える

NavigationBarの背景をimageViewの上では透明に、imageViewの下までスクロールしたら変更する方法をメモ

<img src=https://qiita-image-store.s3.amazonaws.com/0/237025/4c68720f-a235-7c46-500d-bfd77b667f50.png width=30%> <img src=https://qiita-image-store.s3.amazonaws.com/0/237025/cc7ca9b8-2d3d-cd76-3535-443a48365ee4.png width=30%> <img src=https://qiita-image-store.s3.amazonaws.com/0/237025/c541cf5f-54cc-e048-65c9-886c52cfa920.png width=30%>


```swift
// はじめにNavigationBarを透明に
override func viewDidAppear(_ animated: Bool) {
    navigationController?.navigationBar.tintColor = .white
    navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
    navigationController?.navigationBar.shadowImage = UIImage()
    navigationController?.navigationBar.isTranslucent = true
}

// scrollViewのデリゲートメソッド
func scrollViewDidScroll(_ scrollView: UIScrollView) {
    // imageViewの下までスクロールしたら NavigationBarの色を変更
    if scrollView.contentOffset.y > imageView.layer.frame.height - (navigationController?.navigationBar.frame.height)! - UIApplication.shared.statusBarFrame.height {
        // NavigationBarの背景色変更
        navigationController?.navigationBar.barTintColor = .white
        navigationController?.navigationBar.tintColor = .black
        navigationController?.navigationBar.setBackgroundImage(nil, for: .default)
        navigationController?.navigationBar.shadowImage = nil
       
    } else {
        navigationController?.navigationBar.tintColor = .white
        navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
        navigationController?.navigationBar.shadowImage = UIImage()
        navigationController?.navigationBar.isTranslucent = true
    }
}
```
Google製の強化学習フレームワークDopamineを使ってみる

# TL; DR
[Dopamine](https://github.com/google/dopamine)を使ってちょっと遊びます。
まだ触り始めで、分からないことは多いです。

# インストール方法

[macのインストール方法](https://github.com/google/dopamine#mac-os-x)はこちらです。(公式より)

```bash
$ brew install cmake zlib
$ pip install absl-py atari-py gin-config gym opencv-python tensorflow
$ pip install dopamine-rl
$ pip install atari-py
```

ここで一点注意があってpython3.7では[問題](https://github.com/tensorflow/tensorflow/issues/20444)があったようです。
実際、[2018/08/30, 09:09]時点では以下のようなエラーが出ました。
> No matching distribution found for tensorflow

setup.pyの中にも書いてました。

```python
        'Programming Language :: Python :: 2',
        'Programming Language :: Python :: 2.7',
        'Programming Language :: Python :: 3',
        'Programming Language :: Python :: 3.4',
        'Programming Language :: Python :: 3.5',
        'Programming Language :: Python :: 3.6',
```

と言うことで、サクッとpython3.6.6に戻してインストールし直します。
そして、これを実行して動けば、ひとまずインストールは成功していそうです。

```bash
$ python tests/atari_init_test.py
```

Atari2600を強化学習で解くためには

```bash
python -um dopamine.atari.train \
  --agent_name=dqn \
  --base_dir=/tmp/dopamine \
  --gin_files='dopamine/agents/dqn/configs/dqn.gin'
```
とする様です。


これだけ見ると、エージェントとconfigを読ませればAtariが解けるんだろうとは
予想がつくわけですが、自分が解きたい問題に適応するにはどうすれば良いのか不明瞭です。

dopamine.atari.trainの中を見る限り、ある程度自分で実装する必要がありそうです。
tensorflowでDeep Learningをするときも、実際いろいろと書いていたので、
まぁそう言うものなのかもしれません。
DQNの実装を自分でしなくて良い分、楽にはなっているはずです。
tensorflowの時と同じ感覚で使うことを、Googleが想定しているなら、
tensorboardみたいな可視化ツールもある気がします。

実際に試す手順としては、atariやcommonのコードを見ながら、データ整形とかの部分を実装して
dopamine/agents/dqn/configs/dqn.ginなどを見ながらconfigを設定して実行という流れになるんでしょうか。

~~ちゃんと試したら、また書きます。~~
[またちょっと書きました](https://qiita.com/t-Asai/items/88cf083165abbe08aa57)

# TO DO
- チュートリアルの実装を追いかける
- api_docs/pythonをちゃんと読む
- ブラックジャックでも何でも良いから実装して見る
- 可視化ツールを試す(baselines/plots.htmlかな？facetsでも良いのか)
İnstagram Hesap Silme

Instagram günümüzde artık temel ihtiyaçlarımız arasında ilk sıralara geldi. Neredeyse her anımızı instagram üzerinde fotoğraf ve video paylaşarak geçiriyoruz. Bu nedenle sosyal medya denince akla ilk gelen bir platform olarak instagram gösterilir. Son zamanlarda canlı yayın özelliği ile de kullanıcıların ilgisini çekmeyi başardı. Popüler fotoğraf ve video paylaşım platformunu insanlar evde, cafede ve işyerinde kullanırken, kurumsal markalar ise genellikle daha geniş kitlelere ulaşmak için kullanıyor. Instagram ilk piyasaya sürüldüğü zamanlarda bu kadar popüler olmasa bile son zamanlarda çok kullanılan bir uygulama olmuştur. Instagram kullanıcıları instagram hesap silme işlemini yapmayı tam olarak yapamasalar bile web site içerisindeki bir sayfa içerisinden kolaylıkla işlemi yapabilmeleri için bir sayfa oluşturuldu. Kolay adımlardan oluşan bir kaç işlem ile dakikalar içinde hesabınızı silebilirsiniz. Instagram hesabını tamamen silmek isteyen kişiler bu işlemi uygulamak için bir internet tarayıcısına ihtiyaç duymaktadır.

Hesabınızı silmek için ilk olarak hesap ayarları sayfasına girin. Unutmadan hatırlatmakta fayda var instagram hesabınızı silmek şuanda uygulama üzerinden olmuyor. Instagram geliştiricileri tarafından yapılan açıklamada şuan bu ekrana sadece bir internet tarayıcısı üzerinden girildiği bilgisi veriliyor. Bu işlemi uygulamak için mobil cihazınız ya da masaüstü bilgisayarınızda bulunan herhangi bir web tarayıcısı üzerinden Instagram hesabınıza giriş yaparak kalıcı hesap silme sayfasına ulaşmalısınız. Ardından silme nedeninizi belirtin.

Bu alanların eksiksiz bir şekilde doldurulması ile birlikte instagram silme işlemini sorunsuz olarak tamamlayarak hesabınızı kapatabilirsiniz. Bu işlem sonucunda instagram hesabınız tamamen kapatılacak ve tekrar geri alınmayacaktır.

Detaylı Anlatım: https://nasilist.com/instagram-hesap-silme-nasil-yapilir/
Kaynak: https://nasilist.com/instagram-hesap-silme-nasil-yapilir/
Sublime textの日本語入力対応メモ

VS Codeより使い勝手が良さげなSublime textを使っているのだが、日本語入力がデフォルトではできないのは痛い。

日本語入力に対応してみた。

mozcは以前から使用しているので割愛。
まず、emacs mozcをインストール。

>sudo apt-get install emacs-mozc

「ツール」→「コマンドパレット」から
>add repo
で、「Package Control: Add Repogitory」
![スクリーンショット_2018-08-31_06-22-12.png](https://qiita-image-store.s3.amazonaws.com/0/283529/fec05f75-f706-f1ff-ea4c-34ee68cbfecc.png)

下にURL入力フォームが出てくるので、以下を登録。
>https://github.com/yasuyuky/SublimeMozcInput
![スクリーンショット_2018-08-31_06-25-49.png](https://qiita-image-store.s3.amazonaws.com/0/283529/95d5a799-8e8e-a3ef-0556-0f089fbdced0.png)

「ツール」→「コマンドパレット」から「Package Control: Install Package」
>install
![スクリーンショット_2018-08-31_06-36-25.png](https://qiita-image-store.s3.amazonaws.com/0/283529/0ee13a8d-af81-491d-a1df-7441f5dd8aa2.png)

「SublimeMozcInput」を登録。
>mozc
![スクリーンショット_2018-08-30_22-22-53.png](https://qiita-image-store.s3.amazonaws.com/0/283529/8af15d96-5550-dfaa-6ab9-88a35bd088a9.png)

キーバインドを登録。
「基本設定」→「キーバインド」で、キーマップのユーザー側に以下を追加。「ctrl + space」で日本語入力へ切り替え。
>{ "keys": ["ctrl+space"], "command": "toggle_mozc" },
![スクリーンショット_2018-08-31_06-31-58.png](https://qiita-image-store.s3.amazonaws.com/0/283529/f130c044-d94f-98aa-bcf5-8705171d2421.png)

わお！
![スクリーンショット_2018-08-31_06-33-27.png](https://qiita-image-store.s3.amazonaws.com/0/283529/3492d4ec-f68a-349f-1453-cb53957e2598.png)

ちゃんちゃん！
ubuntuでxselが入ったtmuxからintellij等のjavaプログラムへコピペができない

# 前提

tmux-yankとxselが入った状態でターミナル上の文字列をコピーした。
それをブラウザやテキストエディタなどには貼り付けることができるが、Intellijではなぜか貼り付けられない。

# 原因

[Bug 1473002 – xsel needs patch to support pasting into java programs](https://bugzilla.redhat.com/show_bug.cgi?id=1473002)
これ。

# 解決方法

対策が入ったxselのバージョンを使用する。ただし修正されたxselのバージョンはまだ正式リリースされていないようなので野良ビルドを使う。

1. `sudo apt purge xsel`
2. [1\.2\.0\+git9bfc13d\.20180109\-1 : xsel : amd64 : Cosmic \(18\.10\) : Ubuntu](https://launchpad.net/ubuntu/cosmic/amd64/xsel/1.2.0+git9bfc13d.20180109-1)から.debファイルをダウンロード
3. debファイルからインストール
Laravel　タスクスケジュール作成の一連の流れ



#概要

Laravelでcronから実行する処理の作成をまとめました。

#作成方法

##１．コマンドのクラス作成
処理を記述するクラスを作成

```
$ cd {path_to_project}
＄ php artisan make:command TestCommand
```

##２．処理の追加
１で作成されたクラスに処理を追加
コマンド名、コマンドの説明を変更し、処理を追加します。

``` path_to_project/app/Console/Commands/TestCommand.php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class TestCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    //コマンド名を設定（元：command:name→変更後：command:testcommand）
    protected $signature = 'command:testcommand';  

    /**
     * The console command description.
     *
     * @var string
     */
    //コマンドの説明（元：Command description→変更後：testcommandのコマンド説明）
    protected $description = 'testcommandのコマンド説明';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {

         // ここに処理を記述
         echo "testcommand実行！！\n";
    }
}

```

## ３．コマンドの登録、スケジュールの登録
記述した処理のコマンド登録、cronで実行するスケジュールの登録

``` path_to_project/app/Console/Kernel.php
<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{

	/**
	 * The Artisan commands provided by your application.
	 *
	 * @var array
	 */
	protected $commands = [
		\App\Console\Commands\TestCommand::class,	//コマンドの登録
			
	];
	

	/**
	 * Define the application's command schedule.
	 *
	 * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
	 * @return void
	 */
	protected function schedule(Schedule $schedule)
	{
		// スケジュールの登録（「->daily()」は毎日深夜１２時に実行）
		$schedule->command('command:testcommand')->daily();
	}

	/**
	 * Register the commands for the application.
	 *
	 * @return void
	 */
	protected function commands()
	{
		$this->load(__DIR__.'/Commands');

		require base_path('routes/console.php');
	}
}
```

##4,登録したコマンドの確認
コマンドが登録されているかリストより確認

```
 $ php artisan list

...(中略)

 command
  command:testcommand          testcommandの説明  

...(中略)
```

##5,コマンド実行
登録したコマンドを実行

```
$ 　php artisan command:testcommand
testcommand実行！！
```

##6,cronにエントリの追加

毎分Laravelのコマンドスケジューラを呼び出すよう、以下のエントリを追加

```
$ crontab -e

* * * * * php /{path_to_project}/artisan schedule:run >> /dev/null 2>&1
```

これで登録したスケジュール通りにコマンドが実行されるようになります。
Rubyを絵文字で書けるようにするGemつくった

# まえがき
プログラマ歴半年弱で文系の僕には横文字は刺激が強すぎて辛かったので、
もっとポップになればプログラミングも楽しくなるはずだと思い、
Rubyを絵文字で書けるようにするGemを作りました。

# つくったもの
## Github
https://github.com/rnitta/emozi


## RubyGems
RubyGemsにもプッシュしてるので
https://rubygems.org/gems/emozi

グローバルにインストールするなら(非推奨)

```bash
$ gem install emozi
```

or
適当なディレクトリで

```ruby
# Gemfile
gem 'emozi', '~> 0.0.4'
```

```bash
$ bundle install
```

で使えるようになります。


# 使い方

```ruby
require 'emozi'

💆💋💊💉
🐶🐻🐻👞
👻💂💂💅
🐶👭💅💈
💂👺🐷🐻
# => Hello World!
```
といった感じで絵文字でRubyが書けます。

```ruby
def hoge(x, y)
 p x + y
end

hoge(1, 2) # => 3
```
↑このコードだと、こういうふうに書けます↓

```ruby
require 'emozi'

👺👻👼🐶👾💅👽👻🐾💎
👂🐶💏🐿🐠🐶💆🐶💎🐶
👁🐶💏🐠👻💄👺🐠🐠👾
💅👽👻🐾👇👂🐶👈🐿🐠 # => 3
```

絵文字に明るくない方のためにコードを絵文字に変換するメソッド `#emozify`も用意しました。

```ruby
require 'emozi'

emozify('p "hoge"') # => 💆🐶🐸👾💅👽👻🐸
```

複数行のコードにも対応してます。多分。

時々変換できないコードもあります。黒魔術系のコードは変換出来ない傾向にあります。


# どうやってつくったか

実装自体は14行しかないので、実装の中身の話はコードを読んでもらったほうが早いかなと思います。
https://github.com/rnitta/emozi/blob/master/lib/emozi.rb

```ruby
MAGIC_NUMBER = 128_022
$🤔 = ''

def emozify(str)
  puts str.chars.map { |char| (char.ord + MAGIC_NUMBER).chr('UTF-8') }.join
end

def method_missing(emoji, *_)
  $🤔 << emoji.to_s
end

at_exit do
  eval$🤔.chars.map { |char| (char.ord - MAGIC_NUMBER).chr('UTF-8') }.join
end
```

`method_missing`で絵文字をメソッド名として第一引数でシンボル化された絵文字が取れるので、
グローバル変数のstringにto_sしてくっつけていき、
`at_exit`で終了時に変数に格納された絵文字をコードに変換してevalで実行してるだけです。

`emozify`はなくても動くので、実装は実質8行ぐらいです。



以下作り方というか何を考えてつくったかいうポエム↓

## 前提
もしかしたらご存じない方もいるんじゃないかと思いますが、
Rubyは変数名やメソッド名に日本語が使えます。
（そんなにめずらしいことではない）

なので、

```ruby
def 引数を２倍にして返す関数(引数)
  引数 * 2
end

伍 = 5
引数を２倍にして返す関数(伍) # => 10
```

こんなことができます。擬似コードじゃないですよ。

日本語が使える、というよりマルチバイト文字が使えるので、当然絵文字も使えるわけです。
そうすると次は絵文字だけでコードが書きたくなりますね。

## eval

みんな大好きevalを使えばなんでもできます。
evalは引数の文字列をコードとして解釈して実行してくれるので、

（入力）絵文字　→　コードに変換 → evalで実行(出力)

というフローに思い至ります。


## 絵文字をどうやってコードに変換するか

絵文字にも、アルファベットや記号にも当然Unicodeが振られてますから、
絵文字のユニコードをアルファベットや記号のユニコードまでシフトさせちゃえばいいわけです。

しかしここで問題が発生します。

絵文字のユニコードは必ずしも連番とは限らないのです。
参考: https://ja.wikipedia.org/wiki/Unicode%E3%81%AEEmoji%E3%81%AE%E4%B8%80%E8%A6%A7

<img width="167" alt="スクリーンショット 2018-08-31 3.18.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/265793/4d9f8066-84d7-aed2-bc5d-dadecd83df78.png">
例えばこの謎絵文字と謎絵文字は連続のようでいて、ユニコード的には1F3F6が飛んでいます。

こういった飛び地があるので、適当な範囲の絵文字を適当にアルファベット/記号に変換すると、
その文字が飛び地にあたった場合、「aとcは絵文字で表現できるけどbに対応する絵文字が無い」みたいな辛さが発生します。

したがってアルファベットや記号をどれだけシフトさせるか（どのように対応させるか）が大事になってきます。

# 眠くなってきました。続きは需要がありそうだったら書きます。

テストも書いてないしバグも多い気がするのでマサカリお待ちしてます。
Mac で Android Studio で エミュレータからネットに接続できない件

10.0.2.3が First DNS Serverとして設定されているので /etc/hosts に以下の行を追加。

```
8.8.8.8         10.0.2.3
```

参考: [Set up Android Emulator networking](https://developer.android.com/studio/run/emulator-networking)
HerokuアプリからGoogleスプレッドシートを操作する際、認証情報を環境変数から読み込みたい

# 目的
Google Sheets APIのPythonクライアントライブラリ『gspread』を使って、Heroku上のPythonスクリプトからGoogleスプレッドシートを操作したい

- [gspread API Reference — gspread 3.0.1 documentation](http://gspread.readthedocs.io)

# 問題
- Google Sheets APIでGoogleスプレッドシートを操作するには、OAuth認証が必要
 - [https://www.kumilog.net/entry/2018/03/22/090000](https://www.kumilog.net/entry/2018/03/22/090000)
- gspreadのリファレンスには『認証に必要な情報をJSONファイルで渡し、生成したcredentials変数』を使って認証する方法が紹介されている
 - [https://gspread.readthedocs.io/en/latest/oauth2.html](https://gspread.readthedocs.io/en/latest/oauth2.html)

```python:
import gspread
from oauth2client.service_account import ServiceAccountCredentials

scope = ['https://spreadsheets.google.com/feeds',
         'https://www.googleapis.com/auth/drive']

credentials = ServiceAccountCredentials.from_json_keyfile_name('gspread-april-2cd … ba4.json', scope)

gc = gspread.authorize(credentials)

wks = gc.open("Where is the money Lebowski?").sheet1
```

- Heroku上のPythonスクリプトで上記手順を実行するには、『認証に必要な情報が書かれたJSONファイル』をHerokuにデプロイする必要がある
- しかし、秘密情報である『認証に必要な情報が書かれたJSONファイル』をHerokuに置きたくない
- 認証に必要な情報はHerokuの環境変数から読み込みたい

という状況で、以下の記事を見つけた。

[PythonのHerokuアプリケーションからGoogle Spread Sheetの読み書き](https://www.virtual-surfer.com/entry/2018/06/20/190000)

この記事では、環境変数とテンプレートから『認証に必要な情報が書かれたJSONファイル』を生成しているが、もっとシンプルな方法はないのか。

# 解決策
credentials変数を生成する際に、from_json_keyfile_nameではなく、from_json_keyfile_dictを使う。
from_json_keyfile_dictならば、認証に必要な情報をPython辞書オブジェクトで渡せる。

[oauth2client.service_account module — oauth2client 4.1.2 documentation](https://oauth2client.readthedocs.io/en/latest/source/oauth2client.service_account.html#oauth2client.service_account.ServiceAccountCredentials.from_json_keyfile_dict)

認証に必要な情報をJSONファイルで渡す必要がなくなるので、『認証に必要な情報が書かれたJSONファイル』をHerokuに置く必要もなくなる。

# コード
```python:
import gspread
from oauth2client.service_account import ServiceAccountCredentials

scope = ['https://spreadsheets.google.com/feeds',
         'https://www.googleapis.com/auth/drive']

# 辞書オブジェクト。認証に必要な情報をHerokuの環境変数から呼び出している
credential = {
                "type": "service_account",
                "project_id": os.environ['SHEET_PROJECT_ID'],
                "private_key_id": os.environ['SHEET_PRIVATE_KEY_ID'],
                "private_key": os.environ['SHEET_PRIVATE_KEY'],
                "client_email": os.environ['SHEET_CLIENT_EMAIL'],
                "client_id": os.environ['SHEET_CLIENT_ID'],
                "auth_uri": "https://accounts.google.com/o/oauth2/auth",
                "token_uri": "https://oauth2.googleapis.com/token",
                "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
                "client_x509_cert_url":  os.environ['SHEET_CLIENT_X509_CERT_URL']
             }

credentials = ServiceAccountCredentials.from_json_keyfile_dict(credential, scope)

gc = gspread.authorize(credentials)

wks = gc.open('Where is the money Lebowski?').sheet1
```

# その他
- Herokuの環境変数にPRIVATE KEYを登録する際は、改行したうで、改行コードを消す。

>hkmdvQ2feNjbklxE2MLRXrsDg<font color="red">\n</font>VCCHmuITKnfFfrrXvUrkQLzVt
↓
hkmdvQ2feNjbklxE2MLRXrsDg
VCCHmuITKnfFfrrXvUrkQLzVt
ElasticsearchのAPI

# 更新履歴

|日付|内容|
|:--|:--|
|2022.07.20|v8.2のもので差し替え|
|2018.08.31|初版|

# はじめに

業務でElasticsearchを多少触ることになったので
提供しているRestApiをざっくりまとめます。

# コマンド一覧
| API名：パス                                                                                                                        | メソッド   | 内容               |
| :----------------------------------------------------------------------------------------------------------------------------- | :----- | :--------------- |
| [Search：/{index}/\_search](https://www.elastic.co/guide/en/elasticsearch/reference/8.2/search-search.html)                | Get    | 検索               |
| [Count：/{index}/\_count ](https://www.elastic.co/guide/en/elasticsearch/reference/8.2/search-count.html)              | Get    | インデックスのドキュメント数取得 |
| [Delete index：/{index} ](https://www.elastic.co/guide/en/elasticsearch/reference/8.2/indices-delete-index.html)            | Delete | インデックスの削除        |
| [Exists：/{index} ](https://www.elastic.co/guide/en/elasticsearch/reference/8.2/indices-exists.html)                | Head   | インデックスの存在確認      |
| [Clear cache：/{index}/\_cache/clear ](https://www.elastic.co/guide/en/elasticsearch/reference/8.2/indices-clearcache.html) | Post   | インデックスのキャッシュクリア  |
Haskell入門　型

##haskellと型
haskellの学習を進めるにあたり慣れていない概念が、型。すごH本を参考にまとめてみます。
##型変数って？
Haskellでは、式も関数も型が重要である。とくに、関数を定義する際には、明示的に宣言しておいたほうがいい。
しかし、中にはいろいろな型に対して動作する関数がある。試しに、head関数の型を調べる。

```haskell
ghci> :t head
head :: [a] -> a
```

aは型変数。どんな型も取りうることを意味する。headの型宣言は「任意の型のリストを引数に取り、その型の要素を一つ返す」と読める。
型変数を用いた関数を**多相的関数**という。

##型クラス、インスタンスって慣れなてないなあ...
ちょっと抽象的で慣れてないので、具体例から考える。

```haskell
ghci> :t (==)
(==) :: (Eq a) => a -> a -> Bool
```

**=>**は、型クラス制約という。
「等値性関数は、同じ型の任意の２つの引数を取り、Boolを返す。引数の２つの値の型はEqクラスのインスタンスでなければならない」と読める。Eq型クラスは、等値性をテストするためのインターフェイスを提供する。
ここで用語を整理します。
#####型クラス
関数の集まりを定める。なんらかの振る舞いを定義。
#####インスタンス
その型クラスが記述する振る舞いを実装する。

等値性関数の例で言うなら、ある２つの値の等値性を比較することに意味があるなら、その型はEq型クラスのインスタンスにできる、ということ。

ある**型**クラスのインスタンスに、ある**型**がなる、ということに注意。

####Eq型クラスで具体例
**型が関数を実装しているとは、その関数がその特定の型に対して使われたときに、どういう振る舞いをするか定義するということ。**Eqのインスタンスが実装するべき関数は、== と　 /=　である。
Eqの様々なインスタンス（＝**型**）に対する == と　 /= の動作が定義される。

```haskell
ghci> 5 == 5
True
ghci> 5 /= 5
False
ghci> 'a' == 'a'
True
ghci> "Ha Ha" == "Ha Ha"
True
```
勇者と学ぶスクラム開発

元エンジニアの勇者がスクラム開発手法を用いて、魔王を討伐する物語です。

## あらすじ

ある日、王様は勇者を城に招き、魔王討伐の任を言い渡した。
勇者は父から学んだ技術をもとに酒場でメンバーを集め、魔王討伐の旅に出るのであった。

## メンバー紹介

### 勇者
- 役割: プロダクトオーナー
- 職業: 元フルスタックエンジニア

### 商人
- 役割: スクラムマスター
- 職業: 元プロジェクトマネージャー

### 戦士
- 役割: チーム
- 職業: 元フロントエンドエンジニア

### 僧侶
- 役割: チーム
- 職業: 元バックエンドエンジニア

### 魔法使い
- 役割: チーム
- 職業: 元バックエンドエンジニア

## Story.1 酒場にて - バックログ作成

### 旅に必要なこと - プロダクトバックログ
勇者達一行は魔王討伐のために何が必要なのかを話し合い、それぞれに優先順位を決めた。

- どうのつるぎを入手する。
- はがねのつるぎを入手する。
- ホイミを覚える。
- メラを覚える。
- うろこのたてを入手する。
- スカラを覚える。
- ギラを覚える。
- 洞窟の魔物を討伐する。
- 船を入手する。
- 空飛ぶ鳥を蘇らせる。
- 魔王を討伐する。

> 本来のバックログはもっと細かい単位です。今回は旅をクリアするまでを優先したいので、かなり大きな単位でバックログを作りました。

### 最初の旅でやること - スプリントバックログ
最初の旅では洞窟の魔物を討伐するところまで進めることにした。そして、それに必要な準備をまとめた。

- どうのつるぎを入手する。
- はがねのつるぎを入手する。
- ホイミを覚える。
- メラを覚える。
- うろこのたてを入手する。
- スカラを覚える。
- ギラを覚える。
- 洞窟の魔物を討伐する。

## Story.2 旅立ちの日 - スプリント
勇者たちは故郷に別れを告げ、洞窟の魔物を討伐するための旅を始めた。

### 一日目の朝 - デイリースクラム
商人が中心となり、戦士、僧侶、魔法使いのチーム三名は日没までに達成するものを自分たちで考え、本日の予定を作成した。

- 戦士
    - どうのつるぎを入手する。
    - はがねのつるぎを入手する。
- 僧侶
    - ホイミを覚える。
- 魔法使い
    - メラを覚える。

> チームの役割はそれぞれが協力してゴールを目指すことです。重要なのはチーム三名がそれぞれ自分達の本領を発揮しながら、優先順位をもとに作業をすることです。

### 戦士、僧侶、魔法使いの冒険結果
それぞれの冒険結果は下記の通りになった。

- 戦士
    - どうのつるぎを入手する。 -> 完了
    - はがねのつるぎを入手する。 -> 売っている店が見つからなかったので、商人に相談した。
- 僧侶
    - ホイミを覚える。 -> 完了
- 魔法使い
    - メラを覚える。 -> 完了

### 勇者と商人の冒険結果
チームがそれぞれの役割を実施している間、勇者と商人は自分達の役割の対応をしていた。

#### 勇者
- 王様から状況を教えてほしいと連絡を受け、その報告
- 装備を購入するための資金調達

> プロダクトオーナーの役割はプロジェクトに問題がないことを保障することです。顧客の意志の代表として作業するので、プロジェクトが顧客の意志と別方向に進まないようにしていく必要があります。

#### 商人
- 戦士から相談を受けた、はがねのつるぎが売っている店の調査
- 旅の途中で出会った遊び人からの依頼対応

> スクラムマスターの役割は正しくスクラムが機能していること、チーム内外の調停をすることです。外部的要因が発生してチームの作業が止まることがないようにする必要があります。

### 二日目以降
洞窟の魔物を討伐するための旅を進めていき、ギラを覚えること以外全て完了することができた。
冒険をしている途中、ギラの代わりにヒャドが必要になったため、それを完了させて冒険を進めていった。

## Story.3 次の旅に向けて - スプリントレビュー
無事に洞窟の魔物を討伐したので、勇者達は王様へ結果の報告を行った。
王様は魔物がいなくなったおかげで近隣の村が平和になったことを確認したので、次の旅に出発してほしいと勇者へ連絡をした。
ギラを覚えるタスクは完了できなかったが、次回の旅に持ち越すことで問題ないことを確認したため、持ち越すことにした。

> ここで必要なことはスプリントで作成したものに対してのレビューすることです。レビュー結果をもとに新たなバックログの作成をして、次のスプリントへ進むことになります。

## Story.4 宿屋にて - 振り返り
勇者たちは宿屋に集まり、今回の旅の達成度や発生した問題、改善策などについて話し合い、次回の旅へ向けて休息をとった。

## Story.5 祖国にて - クロージャ
旅の中で、船を入手し、空飛ぶ鳥を復活させ、魔王を討伐した勇者は祖国へ帰還した。
勇者達は王様へ魔王討伐ができたことを報告して、今回の旅を終えるのであった。

> これをもってプロジェクトは終了となります。

## スクラム開発の関係図

[![Image from Gyazo](https://i.gyazo.com/c84be9b6e2a161408ea6c82e4b9ea227.jpg)](https://gyazo.com/c84be9b6e2a161408ea6c82e4b9ea227)

## 参考文献

[スクラム (ソフトウェア開発) - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%82%AF%E3%83%A9%E3%83%A0_(%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E9%96%8B%E7%99%BA))
[正しく理解しようアジャイルとスクラム　〜スクラムの概要を知ろう | PSYENCE:MEDIA](https://tech.recruit-mp.co.jp/scrum/scrum_introduction/)
[アジャイル開発 ～顧客を巻き込みチーム一丸となってプロジェクトを推進する～ （前編）: コラム | NECソリューションイノベータ](https://www.nec-solutioninnovators.co.jp/column/01_agile.html)
Traefikをリバースプロキシとして利用してDockerで起動したサービスに接続する

## Traefikとは
Traefik: https://github.com/containous/traefik

Go言語製のリバースプロキシ兼ロードバランサ。
## やりたいこと
jenkins.shikugawa.netでアクセスしてDockerコンテナ上で起動しているJenkinsサーバーに接続したい。また、WWW->Traefik間はSSLで通信したい。

![Untitled Diagram (2).png](https://qiita-image-store.s3.amazonaws.com/0/163803/6d8bb225-94df-68f6-3ce5-1237ea9c4dae.png)

## 手順
### CloudFlare上のDNSの設定
Traefik上でLet's Encryptで取得した証明書の更新を行いたいが、サポートしているプロバイダ上で提供されているDNSサーバーを経由しないと対応出来ないため、レジストラが提供するDNSが使えないために移管する必要がある。これらの中だとCloudFlareが無料で使えて手軽。以下のような感じで設定すればよい。

![スクリーンショット 2018-08-31 1.12.59_censored.jpg](https://qiita-image-store.s3.amazonaws.com/0/163803/07a7873d-bc7f-bc1e-6f4f-b25fea1195bd.jpeg)

参考: https://docs.traefik.io/configuration/acme/#dnschallenge
### traefikを起動する

```docker-compose.yml
version: '2'

services:
  traefik:
    image: traefik:alpine
    environment:
      - CLOUDFLARE_EMAIL=${CLOUDFLARE_EMAIL}
      - CLOUDFLARE_API_KEY=${CLOUDFLARE_API_KEY}
    ports:
      - 80:80
      - 8080:8080 # WebUIを有効化させる際に必要
      - 443:443
    volumes:
      - .:/etc/traefik/
```

```traefik.toml
defaultEntryPoints = ["http", "https"]

[traefikLog]
  filePath = "/var/traefik/traefik.log"
  format = "json"

[entryPoints]
  [entryPoints.http]
  address = ":80"
  [entryPoints.https]
  address = ":443"
    [entryPoints.https.tls]

[acme]
email = "YOUR EMAIL"
storage = "/etc/traefik/acme.json"
entryPoint = "https"
  [acme.dnsChallenge]
    provider = "cloudflare"
    delayBeforeCheck = 0
  [[acme.domains]]
    main　　=　　"*.shikugawa.net"

[file]
watch = true

[backends]
  [backends.jenkins]
    [backends.jenkins.servers]
      [backends.jenkins.servers.server0]
        url = "http://jenkins:8080" 
        weight = 1

[frontends]
  [frontends.jenkins]
    backend = "jenkins"
    passHostHeader = true # これをつけないとヘッダ情報がサービス側に飛ばない

    [frontends.jenkins.routes.host]
      rule = "Host:jenkins.shikugawa.net"

[api]
  entryPoint = "traefik"
  dashboard = true # WebUIの有効化
```

これで```docker-compose up -d```すればいい。
ハマりポイントとしてはbackends.jenkins.servers.server0のurlの部分である。後に起動するjenkinsサービスをtraefik_defaultネットワーク内で起動した場合、ポートがホストマシン側から見た場合のポートではなく、コンテナ側から見たポートをセットしなければならない事に注意。何故なら、Docker Engineが提供する内部DNSによってホスト名からホスト名が指すアプリケーションが起動しているコンテナのIPがアドレスに変換される為である。

## Jenkinsを起動する
公式イメージが配布されている。
https://hub.docker.com/r/jenkins/jenkins/

```docker-compose.yml
version: '3'

services:
  jenkins:
    image: jenkins:latest
    networks:
      - traefik_default
    ports:
      - "8090:8080"
      - "50000:50000" # Slave用
    volumes:
      - './data:/var/jenkins_home'

networks:
  traefik_default:
    external: true
```

## 終わりに
Consulを使ったほうが良さそう。
https://docs.traefik.io/configuration/backends/consul/
https://qiita.com/woremacx/items/b6215cd6cf919fdb3824
（備忘録）AmazonDashButton＋RaspberryPi記事のまとめ

https://qiita.com/zono_0/items/d85d45b448ee28299d9e
http://blog.roy29fuku.com/iot/amazon-dash-button%E3%82%92python%E3%81%A7%E3%83%8F%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B-part1-%E8%A8%AD%E5%AE%9A/
https://qiita.com/tokio-takeda/items/02bae474f8f20f35a02c
https://qiita.com/tokio-takeda/items/a061df1f254117659b0c
https://qiita.com/takustaqu/items/8539b33780c9675c8657
http://www.tatetate55.com/entry/2016/12/17/000000
http://www.neko.ne.jp/~freewing/hardware/amazon_dash_button_hack_iot/
https://qiita.com/jsoizo/items/3b8bba4160f41aef20f4
php-master-changes 2018-08-30

もう 1 日がんばるとちょうど[「今日だけ」](https://qiita.com/sj-i/items/8d716a389057d041623f)言ってはじめた時から 1 ヶ月分追ってきたことになる

# 2018-08-30
## sgolemon: Prep for 7.1.23
- https://github.com/php/php-src/commit/5fee4e71088a9827e4ca2d27975941be3b07d695
- PHP 7.1.22 をリリース（9/13 予定）して 7.1.23 の作業をはじめる準備

## petk: Make PHP development tools files and scripts executable
- https://github.com/php/php-src/commit/02294f0c84740a2c3fd2d13a4a66544717d778bb
- 開発用のツール類のファイルに実行許可ビットをつけて shebang を追加

## petk: Remove AC_STRUCT_TM macro
- https://github.com/php/php-src/commit/cbc785dc8c89a5ff085909e555d677d4d8d7c9a1
- autoconf のマクロ AC_STRUCT_TM を削除
- 古いシステム以外では不要みたい

## petk: Remove AC_FUNC_VPRINTF
- https://github.com/php/php-src/commit/ef12e9621517ba33f11c6983c607fae56cefc54a
- autoconf のマクロ AC_FUNC_VPRINTF を同様に削除
- ↑のとあわせてコミットメッセージで啓蒙活動がされてる
- しかしこの petk の人、流しの m4 屋さんというか、autotools 一点突破型みたいな面白い人だな
- 他リポジトリへのコントリビューション見てもわりとこの手のビルドシステム系ずっとやってる

## dstogov: Fixed incorrect ZEND_ACC_ARENA_ALLOCATED usage (it must be used only for internal functions).
- https://github.com/php/php-src/commit/709e4e4f17ddbeb99b366c293c3e2eaa16480a7a
- ZEND_ACC_ARENA_ALLOCATED は内部関数用なのに間違って使われていた問題の修正

## remicollet: fix double cast to int on 32-bit
- https://github.com/php/php-src/commit/c1729272b17a1fe893d1a54e423d3b71470f3ee8
- 端数処理の問題で GCC 8.2 32bit でテストがこけるのを修正
- [PR](https://github.com/php/php-src/pull/3476) の方に細かめの情報がある
- 負値の double を unsigned int にキャストするのは[鼻から悪魔](https://stackoverflow.com/questions/10541200/is-the-behaviour-of-casting-a-negative-double-to-unsigned-int-defined-in-the-c-s)
- [php-langspec](https://github.com/php/php-langspec) が PR コメントの会話でふつうに参照されたのに少しびっくりした
- ところで今気付いたけど、[鼻から悪魔の元ネタ](https://groups.google.com/forum/#!msg/comp.std.c/ycpVKxTZkgw/S2hHdTbv4d8J)の人、別の有名な格言[「あなたのコードをメンテナンスすることになる人が、あなたの住所を知る強烈なサイコパスになりうるのを常に想定してコーディングしなさい」](https://groups.google.com/forum/#!msg/comp.lang.c++/rYCO5yn4lXw/oITtSkZOtoUJ)の人と同じ人じゃんね……すごい言語センスだ

## remicollet: NEWS for [#76818](https://bugs.php.net/bug.php?id=76818)
- https://github.com/php/php-src/commit/cc6356840016bdb3e381a5fb3b53aedc4e033ff2
- NEWS へ[昨日の revert](https://qiita.com/sj-i/items/b75bec1ef1cf29b7a707#remicollet-revert-dont-report-mmap-failure-if-it-is-expected) でメモリ破壊が修正されたむね追記