OmniAICreator/Qiita-1.07M huggingface dataset:
React Nativeで現在地をもらってくる

React Nativeでの現在地の取り方について。自分用メモ。

AndroidとiOSと[Web](https://github.com/necolas/react-native-web)のすべてに対応すると考えるにしても、ざっくりこれでいいかなって。

```js
async function getCurrentPosition(timeoutMillis = 10000) {
  if (Platform.OS === "android") {
      const ok = await PermissionsAndroid.check(PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION);
      if (!ok) {
          const granted = await PermissionsAndroid.request(PermissionsAndroid.PERMISSIONS.ACCESS_FINE_LOCATION);
          if (granted !== PermissionsAndroid.RESULTS.GRANTED) {
              // TODO ユーザーにGPS使用許可がもらえなかった場合の処理
              throw new Error();
          }
      }
  }

  return new Promise((resolve, reject) => {
      navigator.geolocation.getCurrentPosition(resolve, reject, { timeout: timeoutMillis });
  });
}
```

動くサンプルはこちら↓

https://github.com/Nkzn/RNGeolocationSample

### 使い方

```js
async componentDidMount() {
  try {
    const position = await getCurrentPosition(5000);
    const { latitude, longitude } = position.coords;
    this.setState({
      coords: {
        latitude,
        longitude
      }
    })
  } catch(e) {
    alert(e.message)
  }
}

render() {
  return (
    <View style={styles.container}>
      { this.state.coords ? <Text>here: {this.state.coords.latitude}, {this.state.coords.longitude}</Text> : null }
    </View>
  );
}
```

### 感想

Webの文脈で現在地を取るのは楽だなあ。。。。
Route53 でとれるドメイン(TLD)の価格順リスト


https://console.aws.amazon.com/route53/home#DomainRegistration からデータを取ってきます。

![Fullscreen_2018_02_23_12_44.png](https://qiita-image-store.s3.amazonaws.com/0/40717/eb755933-a213-9dcd-77d3-c6a8c565a0a0.png)

ソートしてprintするコードです。

```js:domainlist.js
// @flow

import fs from 'fs'
import _ from 'lodash'

const text = fs.readFileSync(__dirname + '/domains.txt', 'utf8')
const res = text
	.trim()
	.split('\n')
	.map(line => {
		const m = line.match(/^(.*) - \$(.*)$/)
		if (!m) {
			return null
		}
		const [, domain, priceStr] = m
		const price = parseInt(priceStr, 10)
		return { domain, price }
	})
const domains = _.compact(res)
console.log(
	_.sortBy(domains, 'price')
		.map(v => `${v.domain} - $${v.price}`)
		.join('\n')
)
```


出力 [(Full はここ)](https://gist.github.com/elzup/74a4d32c71270ecf27a899c26bd50040)

```txt
.me.uk - $8
.co.uk - $9
.de - $9
.be - $9
.name - $9
.org.uk - $9
.uk - $9
.click - $10
.es - $10
.link - $10
.nl - $10
.pictures - $10
.net - $11
.com - $12
.org - $12
...
```

Peco
![1__js-playground__babel-node___src_domain_index_js___peco__peco_.png](https://qiita-image-store.s3.amazonaws.com/0/40717/1049ca1a-4cac-d7ac-f58b-44f5896a504f.png)
UI > rotate arm (to the) right > どういう動きなのか? | コマンド案 v0.1 > home position | hand roll | forearm pitch | arm yaw


プロジェクト開始: https://qiita.com/7of9/items/4077c92b9a773e054193

前回: [MemoryEnhancer > MEGLV > UI > 音声によるコマンド受付の応答 | sayコマンドのセットアップ(Ubuntu 16.04 LTS)](https://qiita.com/7of9/items/11659f3f7038e00b7a78)

ESP8266 + MPU-9250を実装したグローブを装着し、その動きにより数種類のコマンドを識別しようとしている。

動きとしては以下のような要素がある(検討中)。

- 腕(arm)の動き
    - 上下の動作
    - 水平方向の開閉
    - 右回転し続ける
    - 左回転し続ける
- 手(hand)の動き
    - 手のひら下
    - 手のひら上


「腕を右に回転(rotate arm (to the) right)」という定義をしたとき、意味のとらえ方が異なる。

- 腕を右にねじる
- 腕を垂直方向維持のまま、90度右に回転する (ニホンゴムズカシイ）


橈骨遠位端骨折（とうこつえんいたんこっせつ）の[経験者](https://qiita.com/search?utf8=%E2%9C%93&sort=created&q=user%3A7of9+tag%3Aonearmed)としては、そのリハビリがヒントになるかと思ったが、違った。

### UIの例

UIというか動作の名前を探してみた。
あまり見つからない。

- [女性と男性の絵を使った例](https://www.acefitness.org/fitness-certifications/resource-center/exam-preparation-blog/3535/muscles-that-move-the-arm)
    - AdductionとAbduction
    - FlexionとExtension
    - ...
    - これが腕の動きとしては標準的な用語だろうか
- [がいこつの絵を使った例](https://medical-dictionary.thefreedictionary.com/_/viewer.aspx?path=elsevier&name=bm01-10-9780443102158.jpg&url=https%3A%2F%2Fmedical-dictionary.thefreedictionary.com%2FInward%2Brotation)
    - Internal/External rotation
    - Circumduction
    - Supination/Pronation
    - Flexion/Extension
- [橈骨遠位端骨折のリハビリでやっていた動き](http://morphopedics.wikidot.com/physical-therapy-management-of-colles-fracture)
    - Flexion
    - Extension
    - Radial deviation
    - Ulnar deviation
    - Pronation
    - Supination

専門用語だと実装後数年すると「どういう意味だろうか?」と分からなくなりそう。

### コマンド案 v0.1
(追記 2018/2/25)

@tenmyo さんのコメントをもとに考えてみた。

- 座標系
    - z軸は下向き（天頂角180度)
    - 時計回りを正回転の方向とする
    - UIは正回転をとらえる
        - 逆回転の使用可否はデータ取得後に追加で検討
- コマンド案 v0.1
    - home position
        - 右手を使う
        - 手のひらは下向き (palm down)
        - 右腕を前にのばした状態 (arm stretched)
    - hand roll
        - 手のひらをroll正回転
        - 結果として、手のひらが上向きの状態になる (palm up)
    - forearm pitch
        - 前腕をpitch正回転
        - 結果として、前腕を上（天頂角0度)にした状態になる (forearm up)
    - arm yaw
        - 腕をyaw回転
        - 結果として、腕を右方向にした状態になる (arm right)
Xamarin.FormsのNavigationBarにカラーアイコンをつけて動的に変更も反映させたい

# いきさつ

Xamarin.Formsでナビゲーションバーにアイコンを置くと、Androidは問題ないんだけどiOSだと単色表示になる
アイコン画像そのままの色を出したかったので下記サイトを参考に実装してみたところ、これだと初期表示はうまく表示されるんだけど、表示後にアイコンを差し替えると単色表示に戻ってしまう
あれこれ調べてなんとか動いたのでメモ

最低限動くだけのコードしかないので色々処理が(不足|過剰|無駄)かも

# 作ったカスタムレンダラ（iOS）

```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Input;
using UIKit;
using CoreGraphics;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using Sample.iOS.Renderer;

[assembly: ExportRenderer(typeof(ContentPage), typeof(SamplePageRenderer))]
namespace Sample.iOS.Renderer
{
    public class SamplePageRenderer : PageRenderer
    {
        List<ToolbarItem> _primaryItems;

        protected override void OnElementChanged(VisualElementChangedEventArgs e)
        {
            var page = e.NewElement as Page;
            if (page != null)
            {
                _primaryItems = page.ToolbarItems.ToList();
            }
            base.OnElementChanged(e);
        }

        public override void ViewWillAppear(bool animated)
        {
            base.ViewWillAppear(animated);

            if (this.NavigationController == null) return;

            var items = this.NavigationController.TopViewController.NavigationItem;

            foreach (var item in items.RightBarButtonItems)
            {
                if (item.Image == null) continue;

                foreach (var tool in _primaryItems)
                {
                    tool.PropertyChanged += this.ToolPropertyChanged;
                }

                item.Image = item.Image.ImageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal);
            }
        }

        public override void ViewDidDisappear(bool animated)
        {
            base.ViewDidDisappear(animated);

            foreach (var tool in _primaryItems)
            {
                tool.PropertyChanged -= this.ToolPropertyChanged;
            }
        }

        void ToolPropertyChanged(object sender, EventArgs args)
        {
            var navigationItem = this.NavigationController.TopViewController.NavigationItem;
            if (navigationItem != null)
            {
                var item = sender as ToolbarItem;
                if (navigationItem.RightBarButtonItems[item.Priority].Image != null)
                {
                    navigationItem.RightBarButtonItems[item.Priority].Image = navigationItem.RightBarButtonItems[item.Priority].Image.ImageWithRenderingMode(UIImageRenderingMode.AlwaysOriginal);
                }
            }
        }

    }
}
```

# 参考にさせて頂いたサイト

Xamarin.Forms で iOS のナビゲーションバーに色付きアイコンを置きたい（Microsoft 系のあれこれ）
http://shunsukekawai.hatenablog.com/entry/2017/09/01/220523

iOSのToolbarItemのスペースを調整してレイアウトを整える方法 | Xamarin.Forms（ITブログ時々なんでもブログ）
http://itblogdsi.blog.fc2.com/blog-entry-277.html
URLエンコード/デコード

表題のとおり　urlエンコード/デコードしたい
linux で　パイプやリダイレクトで利用したい

nkf を利用する方法がいくつか試みたが
どうも長い文字列などで文字化けするようだ

こんな時は perlが頼り

```perl:urlencode.pl
#!/usr/bin/perl

while(<>){
  $str .= $_;
}
$str =~ s/([^ 0-9a-zA-Z])/"%".uc(unpack("H2",$1))/eg;
$str =~ s/ /+/g;
print($str);

```

```perl:urldecode.pl
#!/usr/bin/perl

while(<>){
  $str .= $_;
}
$str =~ s/\+/ /g;
$str =~ s/%([0-9a-fA-F]{2})/pack("H2",$1)/eg;
print($str);
```

動作チェック

青空文庫「走れメロス」をエンコードしてデコード
比較する

```
curl -s http://www.aozora.gr.jp/cards/000035/files/1567_14913.html | nkf -w > sample.txt
urlencode.pl sample.txt | urldecode.pl  > sample.out
cmp sample.txt sample.out 
```

参考にしたページ
- [nkfでURLエンコード](http://u-tamax.jp/2012/08/nkf%E3%81%A7url%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89/)
- [URLエンコード / URLデコードするには (urlencode, urldecode)](https://hydrocul.github.io/wiki/programming_languages_diff/string/urlencode-urldecode.html)
ベイズ公式メモ

ベイズ統計入門の15-3章を読んでベイズの公式どうやって出てきたかを勉強になったので、それを簡単にまとめるメモ


## 問題
目の前にツボが一つあり、AのツボかBのツボであることはわかっているが、見た目ではどちらかわからない。知識として、Aのツボには９個の白球と1個の黒球が入っており、Bのツボには8個の黒球と2個の白球が入っていることを知っている。今、ツボから1個球を取り出したら、黒球だった。目の前のツボはどちらのツボか。

黒球取り出して、Bツボである確率を計算みると

```
P(B|黒)  = P(B & 黒) / P(黒) 

= ( P(B) x P(黒|B) ) / P(黒)

= ( P(B) x P(黒|B) ) / ( P(A & 黒) + P(B & 黒))

= ( P(B) x P(黒|B) ) / ( ( P(A) x P(黒|A) ) + ( P(B) x P(黒|B) ) ) 
```


補足

```
P(A|B) = P(AとBの重なり) / P(B)
```
selenium インストール

seleniumからgoogle chrome を引っ張ってきて動かす

環境
Mac OS high sierra
バージョン　10.13.3

python 3.6.1

selenium インストール
pip install selenium 


Chrome driver インストール
brew install chromedriver

コードは以下

```
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from time import sleep

driver = webdriver.Chrome()

driver.get("https://www.google.co.jp/")

driver.find_element_by_id("lst-ib").send_keys("selenium")
driver.find_element_by_id("lst-ib").send_keys(Keys.ENTER)

driver.find_element_by_link_text("Selenium - Web Browser Automation").click()

sleep(5)

driver.close()
```


参照サイト
（https://qiita.com/chachamalu/items/7b6f2a95ea45667e1029）

phantomJSをブラウザとした時のページ
（https://qiita.com/kotaaaa/items/656fa8856bcdd6d9b563）
Jupyter Notebook の利用

# Jupyter Notebook
Python を学習する場合 Jupyter Notebook を利用するといろいろな機能が利用でき、学習しやすいです。

Jupyter Notebook のいろいろな機能を使ってみたいと思います。

環境の構築に関しては以下のリンク先を確認してください。

- [Python 環境構築手順 Windows編 - Qiita](https://qiita.com/xza/items/14738b2b05d1e3f3cde6)

# Cell の利用

「Cell(セル)」という領域に文字を入力します。

![jupyter_cell.png](https://qiita-image-store.s3.amazonaws.com/0/203673/7b23906e-407e-de6c-aae2-f8c0ed7cb801.png)

ここにプログラムが書けます。

実行は ![ctrl_enter.png](https://qiita-image-store.s3.amazonaws.com/0/203673/2aa4b480-d7e5-b9bd-9147-5798a081c7da.png) です。


```python
2 + 1
```
    3


プログラムコードは実行すると「output area」に結果が表示されます。

![jupyter_output.png](https://qiita-image-store.s3.amazonaws.com/0/203673/c0dcf2ca-d2ec-3a33-a0ba-b5d5e557923a.png)

「 In[実行履歴番号]」、「Out[出力履歴番号]」が表示されます。

Cell では、notebook 上の方になる選択ボックで「Code」や「Markdown」等が選択できます。

![jupyter_cell_type.png](https://qiita-image-store.s3.amazonaws.com/0/203673/c10be10e-3f9c-3c46-dda7-54d0e62e27ed.png)

# プログラムをいろいろ書いてみて、履歴実行

Pytyon のコードが通常通りに記載できます。


```python
import numpy as np
np.sin(6) ** 3
```

    -0.021814811956275375

実行履歴を参照して、実行する事も可能です。「アンダーバー(_)」+「実行履歴番号(In [数字の番号])」です。


```python
_1
```
    3



実行番号を利用して、再度計算をする事もできます。


```python
_1 * 10
```
    30



# 変数の取り扱い

変数の取り扱いは注意すべき点があります。

Notebook 上のそのまま書いた変数はNotebook内でのグローバル変数になり、プログラムのように上から実行されているわけではない事に注意してください。


```python
# これをまず実行
a = 10
```


```python
# これを実行
print(a)
```
    10



```python
# これを実行してから、上の print を実行
a = 20
```

実行順序によっては意図しない結果になる場合もあります。

現在どのような変数が宣言されているか知るには「%who」や「%whos」を利用すると可能です。

「%whos」は型や、変数の内容も表示しますので便利です。


```python
%who
```
    a	 



```python
%whos
```
    Variable   Type    Data/Info
    ----------------------------
    a          int     20


# help機能


「?」や「??」を付与する事で、変数、オブジェクト、ライブラリ等のヘルプを参照できます。


```python
a?
```


```python
import numpy as np
np.sin?
```

「アスタリスク(*)」を付与して「?」を参照すると、参照可能な候補一覧が表示されます。


```python
np.s*?
```

notebook上は「タブ(TAB)キー」で補完も可能ですが、多少遅い場合や、ブラウザの環境によってはみずらい場合もあるので、便利でしょう。

# Notebook独自コマンド

Notebook上ではいくつか便利なコマンドが利用できます。「%」を前に付与してコマンドが利用できます。

http://ipython.readthedocs.io/en/stable/interactive/magics.html


```python
# 現在作業フォルダを表示
%pwd
```


```python
# ディレクトリ内一覧
%ls
```

```python
# 実行時間計測
%time np.random.rand(100, 100)
```
    CPU times: user 602 µs, sys: 261 µs, total: 863 µs
    Wall time: 544 µs

# OSコマンドを利用する


「エクスクラメーション(!)」を先頭に付与する事で、OSのコマンドを呼べます。


```python
!dir
```

Windows では、あまりコマンドを利用しないかもしれませんが、Mac/Linux系利用の方はターミナルにわざわざ移行する必要はありません。

# 数式のサポート

「Markdown」セルでは Mathjax を利用した数式の表示がサポートされています。

詳細は Mathjax のドキュメント( http://docs.mathjax.org/en/latest/index.html )を参照する必要がありますが以下のような数式が書けます。

「 \sigma^2=\frac{1}{n}\sum_{i}(x_i-\mu)^2 」この文字を「ドルマーク」で囲んで書くと、以下のような数式が表示されます。

$\sigma^2=\frac{1}{n}\sum_{i}(x_i-\mu)^2$

# その他補助機能

「%%」で指定したプログラム言語が実行できます。


```javascript
%%javascript
// alert('Hello World')
```

ほかにもいろいろな機能があります。Jupyter のマニュアルも確認してみてください。

[The Jupyter notebook — Jupyter Notebook 5.4.0 documentation](http://jupyter-notebook.readthedocs.io/en/stable/index.html)

# 書いた人に関して
[Tech Fun株式会社](http://www.techfun.co.jp/)スペシャリスト、xza です。

社内で開催した初学者向け勉強会で利用した資料等を公開しています。
俺言語 その7

#概要

俺言語をやってみた。
arduinoに実装してみた。
拡張して、Lチカしてみた。

#拡張
ポートを叩ける様にする。
変数r は、DDRB
変数o は、PORTB
変数p は、PINB

arduino unoのピン配置

PB0     D8
PB1     D9 (OC1A)
PB2     D10 (SS, OC1B)
PB3     D11 (MOSI, OC2A)
PB4     D12 (MISO)
PB5     D13 (SCK)
PB6     xtal
PB7     xtal

なので、D8からD13は、叩ける。

ビット演算
&　and
|  or
~  not
^  xor

論理演算
!  not

ディレイ
" 10ミリ秒。

#サンプルコード
Lチカ

```
10 r=32    DDRBにbit5をセット(d13)
20 o=32　　PORTBにbit5をセット(d13)
30 b=1     変数bに、１をセット
40 b=b!b　　変数bを、反転
50 "=100　　１００掛ける１０ミリ秒をスリープ（１秒）
60 #=b=1*90　変数bが、１なら、行９０に飛ぶ
70 o=0　　　　PORTBをクリア。
80 #=40　　　　行40へ飛ぶ。
90 o=32　　　PORTBにbit5をセット(d13)
100 #=40　　　行40へ飛ぶ。
```
Lチカ

```
10 r=32     DDRBにbit5をセット(d13)
20 o=32　　 PORTBにbit5をセット(d13)
30 "=100　　１００掛ける１０ミリ秒をスリープ（１秒）
40 o=0　　　PORTBをクリア。
50 "=100　　１００掛ける１０ミリ秒をスリープ（１秒）
60 #=20　　　行20へ飛ぶ。
```
以上。
ビットコインエクスプローラー(ウォレットコマンド:ec-to-public)

# ビットコインエクスプローラー(ウォレットコマンド:ec-to-public)

原文(https://github.com/libbitcoin/libbitcoin-explorer/wiki/)

## bx ec to public

楕円曲線秘密鍵から、公開鍵を生成する。

```
bx ec-to-public --help
```

```
Usage: bx ec-to-public [-hu] [--config VALUE] [EC_PRIVATE_KEY]

情報: 楕円曲線秘密鍵から、公開鍵を生成する。デフォルトでは、圧縮公開鍵フォーマットで出力。

オプション (named):

-c [--config]        コンフィギュレーションファイルを指定        
-h [--help]          コマンドの説明を表示
-u [--uncompressed]  非圧縮公開鍵フォーマットで出力。

引数 (positional):

EC_PRIVATE_KEY       BASE16楕円曲線秘密鍵を指定。なければ、STDINから読み込む。                     
```

#### Example 1

```
bx ec-to-public 8ed1d17dabce1fccbbe5e9bf008b318334e5bcc78eb9e7c1ea850b7eb0ddb9c8
```

```
0247140d2811498679fe9a0467a75ac7aa581476c102d27377bc0232635af8ad36
```

#### Example 2

非圧縮形式公開鍵で出力

```
bx ec-to-public -u 8ed1d17dabce1fccbbe5e9bf008b318334e5bcc78eb9e7c1ea850b7eb0ddb9c8
```

```
447140d2811498679fe9a0467a75ac7aa581476c102d27377bc0232635af8ad36e87bb04f401be3b770a0f3e2267a6c3b14a3074f6b5ce4419f1fcdc1ca4b1cb6
```

#### Example 3

パイプコマンドの利用

```
bx seed | bx ec-new | bx ec-to-public
```

```
02daa7db1b30da2a9a457171f5861d98d055b3bb0f31316679766fd1c774519d2a
```
Cordovaでサクッとモバイルアプリ開発デビュー！

<!-- Cordovaでサクッとモバイルアプリ開発デビュー！ -->
# はじめに
Cordovaでアプリを一本作ってみて「これはイケてる！」と思ったのでご紹介の記事です。  
こんな方におすすめです！
 * モバイルアプリを簡単に作ってみたい！
 * iOSもAndroidも対応したアプリが作りたい！
 * フロントエンドしかやったことないけどアプリに手を出したい！


---

# Cordovaで開発するメリット
## JavaScriptで書ける！
フロントエンジニアほぼ必須のJavaScriptを使用するので新規言語を習得し直す必要なし！ 

## IDE必要なし！
HTML + JavaScript で記載するので、メモリをやたら食うIDEなんかは必要なし！ 
私はVisualStudioCodeで書きました！

## クロスプラットフォーム！
MacだろうとWindowsだろうとiOSだろうとAndroidだろうとなんでも動きます動かせます！ 
カメラとか位置情報、センサー類も使えます！通知だって出せます！ 
[参考:Platform Support](https://cordova.apache.org/docs/en/latest/guide/support/)

## 動作確認が簡単！
モバイル版のみでしか動かない機能(プラグインなど)を除けばブラウザで開けば動作確認できます！

## 実機確認も簡単！
AndroidではUSBで繋いでコマンドを一つ叩くだけで実機で動作確認できます！

---

# Cordovaで開発するデメリット
## JavaScriptで書かないといけない
ビューもコアとなる処理もコントローラーも全部JavaScriptで書かないといけません。  

## IDEがない故にビルドも手動
ビルドもコマンドを叩く必要があります。 
自動保存したらそのまま自動ビルド、とは行きません。 
[androidアプリのapkのビルドと、リリース手順メモ](https://qiita.com/nogson/items/abe1016f36c3b331db30)

## 日本語の記事が少ない
困った！→ググる→日本語の記事は1件とかもザラです。
もちろんJavaScript自体は日本語記事も多く大丈夫ですが、cordovaの記事はまだまだ数が少ないです。

## クロスプラットフォーム
cordovaはWebView上で動作するハイブリッドアプリケーションです。 
故にそれぞれのWebViewの実装状況に応じて使える機能が異なります。 
使いたかった機能がiOSでは対応していない！とかもあるかもしれません。 
[参考:Platform Support](https://cordova.apache.org/docs/en/latest/guide/support/)

## ローカルコンテンツ以外のアクセスはセキュリティ的に厳しい
WebView上で動作するが故に、一般のブラウザと違い、基本的にWebViewでは本当に信頼できるコンテンツ以外はインターネット上のコンテンツにアクセスしてはいけません。
[WebViewのセキュリティについて](https://qiita.com/serisawa/items/b24fa444b1f09c036c70)

## 動作速度が遅い
いわゆるネイティブアプリと比べると遅めです。 
ただし、最新機種では体感できるほどの違いはありません。 
逆に言えば古い端末を使わざるを得ない場合(でバリバリアニメーションとか書いたりゴリゴリ重い処理したりする場合)は遅いかもしれません。 
[ハイブリッドアプリとは? ](https://qiita.com/soarflat/items/cf5d343c75baadb461dc)

---

# 参考に~~なる~~してほしいリンク
 * [チュートリアルを読んでから自分で作ったアプリ](https://play.google.com/store/apps/details?id=com.tokky.dropChecker)
 * [チュートリアル:Cordovaのチュートリアルをやってみる 第一回](https://qiita.com/tokky_se/items/dabc97d23f444f8d25e5)
 * [環境構築:cordova&VSCodeで環境を構築するまでの右往左往メモ。](https://qiita.com/tokky_se/items/346429d234c91bece11d)
Googleカレンダーで設定した予定が近づいたらSlackに通知する

#はじめに
自分の予定をすっぽかすことがあったりしますよね。
そんなときのために、Googleカレンダーの予定をSlackに通知してくれればもっと分かるかもと思った結果、ありました。
Slackの機能で！
ということで、設定したことと結果を書きます。

#設定
1. `https://<<workspace>>.slack.com/apps/manage` へアクセス

2. 「Google Calendar」をクリック
<img width="856" alt="101.png" src="https://qiita-image-store.s3.amazonaws.com/0/105220/f5bdd17b-04e2-94a1-9ce2-2cb1485a6f29.png">

3. 「Connect Google Account」をクリック
<img width="868" alt="102.png" src="https://qiita-image-store.s3.amazonaws.com/0/105220/42a4e478-0268-e40e-baab-6cca24e2037e.png">
後は、操作に従って、アカウントを選択したり、許可をしたりして下さい。


4. 左上に通知したいカレンダーのユーザ情報であるGoogleアカウントを選択
右上で通知したいSlackチャネルを選択
真ん中あたりで、時間を設定
最後に、「Save Integration」を選択
![103.png](https://qiita-image-store.s3.amazonaws.com/0/105220/5d8c87b8-1da2-964d-88bb-bbc99ec56f13.png)

5. 最後に「I'm done」をクリック
<img width="784" alt="104.png" src="https://qiita-image-store.s3.amazonaws.com/0/105220/9ee27f44-4dde-6947-bbc2-ae384bd78646.png">

#結果
Googleカレンダーに設定した情報がslackチャネルに出てきました
<img width="376" alt="105.png" src="https://qiita-image-store.s3.amazonaws.com/0/105220/a8597cd8-6abd-52ea-a3d9-6913ce98a051.png">

#さいごに
これで、他の方の予定もいけそうです。なので、今度はそれも視野に入れて使っていこうと思います。
AppEngineのcronを更新する方法（または更新されないときの解決方法）

# はじめに

cron.yaml書き換えて`gcloud app deploy`しても「cronが更新されない、なんでだ！？」と半日ぐらい悩んだので同じことにはまった人が悩まないように解決策を書いておきます。

# 答え

```
gcloud app deploy cron.yaml
```

# 説明

`gcloud app deploy`だけだとapp.yamlを見てデプロイが行われます。cron.yamlは見られません。
前にcron.yaml更新したときはそんな指定しなかった気がするけどgcloud以前のツールだったかな。
push通知の確認ダイアログを再度表示する(chrome)

## 概要
一度、push通知の確認ダイアログで「×」ボタンを押した場合、
再度確認ダイアログを表示するにはどうするのかわからなかったので調べた内容をメモしておきます。

## push通知の確認ダイアログ
push通知を導入しているサイトの場合、下記のようなダイアログで通知を受けるかどうか聞かれます。

![step01.png](https://qiita-image-store.s3.amazonaws.com/0/142279/56687392-b6d2-c98e-2b7f-b840db999364.png)

※上記ダイアログで、「許可 / ブロック」のどちらも選ばずに「×」ボタンで閉じると確認ダイアログは表示されなくなります。

## push通知の設定状況を確認する
ブラウザのURLのボックスの右端にある「鍵マーク」をクリックします。

![step02.png](https://qiita-image-store.s3.amazonaws.com/0/142279/1117c8ba-66e8-5187-47b4-1bb6a6cbbbe9.png)

下記のメニューが表示されます。
通知部分が「自動ブロックされました」となっています。

![step03.png](https://qiita-image-store.s3.amazonaws.com/0/142279/38a2bc69-cc75-8d2d-72bd-b0056f1cf43e.png)

右端の「ブロック」をクリックして、「グローバルのデフォルト値（「確認」）を使用」を選択します。
![step04.png](https://qiita-image-store.s3.amazonaws.com/0/142279/358ab1b9-3a18-48c0-3843-023502383266.png)

これで再度、確認ダイアログが表示されるようになります。

## グローバルのデフォルト値が「ブロック」になっている場合
chromeの設定からデフォルト値を変更します。

### chromeの設定画面を開く
ブラウザの右上の「![5C6FB52C8BBB2C12DC89B5F42F16B9B5E9CF.png](https://qiita-image-store.s3.amazonaws.com/0/142279/4e13236d-e581-8a58-85ac-d3f26305aff6.png)」をクリックして、「設定」を選択する。
（ chrome://settings/ ）

![step05.png](https://qiita-image-store.s3.amazonaws.com/0/142279/c19af99d-d42a-b86a-700b-ffca836ecb36.png)

詳細設定をクリックして、「プライバシーとセキュリティ」を開き、「コンテンツの設定」を開く。
（ chrome://settings/content ）

![step06.png](https://qiita-image-store.s3.amazonaws.com/0/142279/828b7d4f-b270-f006-53ec-3b44ee36076c.png)

通知を選択します。
（ chrome://settings/content/notifications ）
![step07.png](https://qiita-image-store.s3.amazonaws.com/0/142279/22c8ba70-a970-8368-890e-53a52706ba98.png)

通知のすぐ下にあるブロックをOFFにする。
![step08.png](https://qiita-image-store.s3.amazonaws.com/0/142279/07be4852-0192-6570-c9e7-36f8a5d3efa8.png)

グローバルのデフォルト値が「送信する前に確認する（推奨）」に変更になります。
![step09.png](https://qiita-image-store.s3.amazonaws.com/0/142279/4ee8b789-5d56-5e3c-a9c7-041283d4a7af.png)

以上です。
NCL > error > Resource directory </usr/share/ncarg/resfiles> does not exist. > 対処: NCARGとNCARG_ROOT以外の環境変数を定義しない

```txt:動作環境
CentOS 6.8 (64bit)
on VMWare workstation
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
WRF3.9
WPS3.9
NCL v6.3.0 (ncl_ncarg-6.3.0.Linux_RHEL6.4_x86_64_gcc447.tar.gz)
```

NCL(NCAR Command Language)関連。

NCLのバイナリをセットアップし、実行してみたところ、下記のエラーが出る。

```bash
$ ng4ex gsun01n -clean
Resource directory </usr/share/ncarg/resfiles> does not exist.
```

http://mailman.ucar.edu/pipermail/ncl-install/2016-February/001976.html
http://mailman.ucar.edu/pipermail/ncl-install/2016-February/001978.html
> grep NCARG ~/.*
>
If you see anything but NCARG_ROOT, then edit the file that it's being set
it, and comment it out.

### NCARG関連の環境変数

以下は上記のエラーが出る環境。

```bash
$ export  | grep NCARG
declare -x NCARG="/home/wrf/WRFV3.7.1/ncl"
declare -x NCARG_DATABASE="/home/wrf/WRFV3.7.1/ncl/lib/ncarg/database"
declare -x NCARG_FONTCAPS="/home/wrf/WRFV3.7.1/ncl/lib/ncarg/fontcaps"
declare -x NCARG_GRAPHCAPS="/home/wrf/WRFV3.7.1/ncl/lib/ncarg/graphcaps"
declare -x NCARG_LIB="/home/wrf/WRFV3.7.1/ncl/lib"
declare -x NCARG_NCARG="/usr/share/ncarg"
declare -x NCARG_ROOT="/home/wrf/WRFV3.7.1/ncl"
```

以下はエラーは出ない環境 (Xeon + VMWare不使用のCentOS6.8環境)。

```bash
$ export | grep NCARG
declare -x NCARG="/home/y_okada/WRFV3.7.1/ncl"
declare -x NCARG_DATABASE="/home/y_okada/WRFV3.7.1/ncl/lib/ncarg/database"
declare -x NCARG_FONTCAPS="/home/y_okada/WRFV3.7.1/ncl/lib/ncarg/fontcaps"
declare -x NCARG_GRAPHCAPS="/home/y_okada/WRFV3.7.1/ncl/lib/ncarg/graphcaps"
declare -x NCARG_LIB="/home/y_okada/WRFV3.7.1/ncl/lib"
declare -x NCARG_ROOT="/home/y_okada/WRFV3.7.1/ncl"
```

`declare -x NCARG_NCARG="/usr/share/ncarg"`の有無が異なる。


NCARG_NCARGをどこで定義しているのかは不明。

[NCL environment variables](https://www.ncl.ucar.edu/Document/Language/env.shtml)

### 対処

「NCARGとNCARG_ROOT以外の環境変数を定義しない」ことで実行できるようになった。

```.bashrc
### NCARG NCL stuff
export NCARG=${WRF_BASE}/ncl
export NCARG_ROOT=${WRF_BASE}/ncl
export PATH=${NCARG_ROOT}/bin:${PATH}
# below commented out 2018-02-23 (Resource directory </usr/share/ncarg/resfiles> does not exist.)
#export NCARG_LIB=${NCARG_ROOT}/lib
#export NCARG_DATABASE=${NCARG_LIB}/ncarg/database
#export NCARG_FONTCAPS=${NCARG_LIB}/ncarg/fontcaps
#export NCARG_GRAPHCAPS=${NCARG_LIB}/ncarg/graphcaps
```

参考: https://www.ncl.ucar.edu/Support/install_archives/2013/0102.html
> If so, then you should *only* set NCARG_ROOT, and do not set NCARG_NCARG, NCARG_LIB, NCARG_GRAPHCAPS, NCARG_FONTCAPS, or NCARG_DATABASE. 

```bash
$ export | grep NCAR
declare -x NCARG="/home/wrf/WRFV3.7.1/ncl"
declare -x NCARG_ROOT="/home/wrf/WRFV3.7.1/ncl"
```

ワークステーション(Xeon + VMWare不使用のCentOS6.8環境)では上記のコメントアウトした環境変数は残ったままであるが、エラーは出ていない。
How to set Google Analytics tracking code in Nginx conf

### Prerequisites

- http://nginx.org/en/docs/http/ngx_http_sub_module.html

Nginx **--with-http_sub_module** <- with yum install, nginx comes with this module included.


>nginx -V

>nginx version: nginx/1.13.9
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-18) (GCC) 
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module <font color=red>--with-http_sub_module</font> --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
```


### How to set 

- create a conf file with sub_filter directive

```nginx:/etc/nginx/conf.d/analytics.conf
sub_filter '</head>' '<script type="text/javascript">var _gaq = _gaq || [];_gaq.push(["_setAccount", "UA-99999999-9"]);_gaq.push(["_trackPageview"]);(function() {var ga = document.createElement("script"); ga.type = "text/javascript"; ga.async = true;ga.src = ("https:" == document.location.protocol ? "https://ssl" : "http://www") + ".google-analytics.com/ga.js";var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(ga, s);})();</script></head>';
```

↑ replace UA-9999999-9 with appropriate UA ID


### References

Add Google Analytics tracking code to HTML via nginx 
https://gist.github.com/jirutka/5279057
drone.ioでmaven local repositoryをcacheして爆速する

# TL;NR

- drone v0.8を自前のクラウドで使いたい
- maven3でspring bootの自動テストしたい
- maven3のrepositoryをdrone v0.8のキャッシュプラグインを利用したい
- ローカルリポジトリのファイルもキャッシュから使いたい
- データベース連携したテストケースも実行したい

# note

1. `.drone.yml`を書く
2. drone.io上のrepository設定でtrustedを設定する（具体例はググって欲しい）
3. drone.ioでbuildする


# .drone.yml

```yml
pipeline:
  restore-cache:
    image: drillster/drone-volume-cache
    restore: true
    mount:
      - /drone/.m2
    volumes:
      - /tmp/cache:/cache
    ttl: 7
    when:
      event: push

  test:
    image: maven:3.5.2-jdk-8
    commands:
      - mvn install:install-file -Dfile=./legacyLibraries/kuromoji-0.7.7.jar -DgroupId=org.atilika.kuromoji -DartifactId=kuromoji -Dversion=0.7.7 -Dpackaging=jar -DgeneratePom=true -Dmaven.repo.local=/drone/.m2/repository
      - sleep 10
      - export SPRING_PROFILES_ACTIVE=ci-test
      - mvn dependency:go-offline -Dmaven.repo.local=/drone/.m2/repository clean test

  rebuild-cache:
    image: drillster/drone-volume-cache
    rebuild: true
    mount:
      - /drone/.m2
    volumes:
      - /tmp/cache:/cache
    ttl: 7
    when:
      event: push

services:
  database:
    image: mysql
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci --explicit_defaults_for_timestamp=true --skip-character-set-client-handshake --character-set-filesystem=utf8
    environment:
      - MYSQL_ALLOW_EMPTY_PASSWORD=yes
      - MYSQL_DATABASE=foo2018
      - MYSQL_USER=root

```

# あとがき

`drillster/drone-volume-cache`のmountでマウントされるディレクトリ位置やmavenのデフォルトリポジトリパスの指定方法などが分からず四苦八苦したが、なんとか今の設定でキャッシュを使ってのビルドは出来ている。

コツは、１回目は具体的なテストは実行せず、`mvn install:install-file`と`mvn dependency:go-offline`で共に`-Dmaven.repo.local=/drone/.m2/repository`してから、テストケースの実行をしたほうがいい。というのも、テストケースがsuccessにならない限り、rebuild-cacheが実行されず、キャッシュが保存されない。よって、テストのたびに依存ライブラリのDownloadingが行われてしまう。
無駄な差分を出さないVim

## 無駄な差分
無駄な差分とは、以下の３つです。

* 文字コードが変わる（例: Shift_JIS　→　UTF-8）
* 改行コードが変わる（例: CRLF → LF）
* EOFが変わる（例: EOF改行なし → EOF改行あり）

これらは、Vimのデフォルト設定値によって勝手に書き換えられてしまい、ソースファイルに無駄な差分がでてしまい、レビュワーや自分を困らせてしまいます。

ですので、これを未然に防ぐVimの設定を行います。

## 設定
```vim:.vimrc
set fileencodings=utf-8,sjis,cp932
set fileformats=unix,dos,mac
set nofixendofline
```

* `fileencodings`は、左から順にファイルがどの文字コードか調べ、その文字コードで開きます
 * ※ 新規ファイルの場合は、一番左の`utf-8`となります。

* `fileformats`も、`fileencodings`と同じ流れで改行コードを決定します。

* `nofixendofline`は、元ファイルのEOF状態のままにします。つまり、EOFでの差分がでなくなります。

## まとめ
たった3行追加するだけで、無駄な差分を無くなりました。
自分の開発環境に合わせた設定に変更して、快適なVimライフ送れるようにしましょう。
電子回路入門　トランジスタ

#**はじめに**
[書籍](https://www.amazon.co.jp/%E9%9B%BB%E5%AD%90%E9%83%A8%E5%93%81%E3%81%94%E3%81%A8%E3%81%AE%E5%88%B6%E5%BE%A1%E3%82%92%E5%AD%A6%E3%81%B9%E3%82%8B-Raspberry-Pi-%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C%E5%AE%9F%E8%B7%B5%E8%AC%9B%E5%BA%A7-%E7%A6%8F%E7%94%B0/dp/4800711614 "電子部品ごとの制御を学べる！Raspberry Pi 電子工作実践講座")に沿って引き続き進めていきます。

#**トランジスタとは？**
役割として、電気信号によってONとOFFを切り替えるスイッチングと、電気信号を増幅させる役割の2つが挙げられます。
今回はスイッチング回路を作成します(・ω・)ノ
よくモーターの制御なんかに使用されてます。
使用するトランジスタは**2SC3198Y**です。(編集前は2SC3190Yとしていましたが、8でした。)

型番の読み方

<TABLE>
<TR><TD>2S</TD><TD>トランジスタ</TD></TR>
<TR><TD>C</TD><TD>高周波のNPN</TD></TR>
<TR><TD>3198</TD><TD>型番</TD></TR>
<TR><TD>Y</TD><TD>120~240hFE</TD></TR>
</TABLE>

NPNというわけのわからない言葉が出てきましたしたが、要はトランジスタの構造を意味します。
N型半導体の間にP型半導体があるのでNPNと呼ばれます。
逆にPNPも存在しますが、役割は変わらないのでここでは触れません(o*。_。)o


その他、トランジスタにおいて確認しておきたい項目(使用するトランジスタの仕様書に書いてあります。)↓

<TABLE>
<TR><TD>名称</TD><TD>略称</TD><TD>役割</TD><TD>今回使用する値</TD></TR>
<TR><TD>エミッタ-コレクタ間電圧</TD><TD>VCEO</TD><TD>最大でかけることができる電圧</TD><TD>50V</TD></TR>
<TR><TD>直流コレクタ電流</TD><TD>Ic</TD><TD>最大でかけることができる電流</TD><TD>0.15A</TD></TR>
<TR><TD>コレクタ損失</TD><TD>Pc</TD><TD>最大電力</TD><TD>625mW</TD></TR>
<TR><TD>直流電流増幅率</TD><TD>hFE</TD><TD>直流電流増幅率</TD><TD>100</TD></TR>
<TR><TD>トランザクション周波数</TD><TD>fr</TD><TD>切り替えに対応できる周波数</TD><TD>80MHz</TD></TR>
<TR><TD>べース-エミッタ間電圧</TD><TD>VBE</TD><TD>ベースとエミッタ間の電圧</TD><TD>1V</TD></TR>
</TABLE>

先に書いたようにトランジスタにはスイッチング以外に増幅させる役割があります。
増幅率は型番見たときにYだったから120～240じゃないの？と、思いますが、YやOなら大体100だと覚えておけば大丈夫です。(使用用途がスイッチングの場合)
前回と同様に、LEDには20mAの電流を流したいので、
`流したい電流(A) ÷ 直流電流増幅率(hFE) = ベースに流す電流(IB)`
今回の場合、
0.02 ÷ 100 = 0.0002 = 0.2mA

ベースに流れる電流を抑えるための抵抗値を求める計算式
`Vbe(V) ÷ IB(A) = ベース前に置く抵抗値(Ω)`
今回の場合、
1 ÷ 0.0002 = 5000 = 5kΩ

#**使用部品**
- [PsoC5](http://akizukidenshi.com/catalog/g/gM-09432/)
- 2SC3190Y(トランジスタ_日本語の取り扱いサイトが見当たりませんでした。)
- 抵抗[100Ω](http://akizukidenshi.com/catalog/g/gR-25331/),[5kΩ](http://akizukidenshi.com/catalog/g/gR-25512/)
- [LED](http://akizukidenshi.com/catalog/g/gI-11655/)

#**回路図**
回路を作成する前に、トランジスタのピン配列を確認します。トランジスタの平たい面を上にしてみましょう。
今回使用する**2SC3198Y**は図のようなピン配列でした。(※要仕様書確認)
![oneトランジスタ.png](https://qiita-image-store.s3.amazonaws.com/0/195542/be8add7d-dfb1-43ef-4dfe-aaa06376ed09.png)


このように配線します。
![トランジスタ_ブレッドボード.png](https://qiita-image-store.s3.amazonaws.com/0/195542/cdce515c-9423-a410-8301-b273ceb3667e.png)


回路図はこのようになっています。
5Vを受けているのがコレクタ、電気信号を受け取っているのがベース、LEDに出力しているのがエミッタです。
![トランジスタ_回路図.png](https://qiita-image-store.s3.amazonaws.com/0/195542/5c14f4d3-a552-5493-5e7b-3047222fb3de.png)

#**プログラム**
[Lチカ](https://qiita.com/aikawa_YO/items/a3002a0e687d9d6bf3ac)のときと同様のプログラムです。トランジスタがスイッチの代わりとなり、LEDがチカチカします。

```c
#include "project.h"

int main(void)
{
    CyGlobalIntEnable;

    for(;;)
    {
     LED_Write(1);
     CyDelay(500);

     LED_Write(0);
     CyDelay(500);
    }
}
```
メモ: xubuntu17.10に xrdp で接続し日本語入力する

```
apt install -y xrdp \
 tigervnc-standalone-server \
 x11vnc
```

```apache:/etc/xrdp/xrdp.ini
# ユーザー名、パスワードを入力してログイン。
[Xvnc]
name=Xvnc
lib=libvnc.so
username=ask
password=ask
ip=127.0.0.1
port=-1

# vncpasswdで設定した値でログイン
[console]
name=console
lib=libvnc.so
ip=127.0.0.1
port=5900
username=na
password=ask
#delay_ms=2000
```

```~/.xsession
export XMODIFIERS="@im=fcitx"
export QT_IM_MODULE=fcitx
export GTK_IM_MODULE=fcitx
export DefaultIMModule=fcitx
fcitx-autostart

xfce4-session
```

```
/etc/init.d/xrdp restart
```
phpでseleniumを動かして躓いた点まとめ（2018年2月ver）

とりあえず、なんにも考えずに以下の通りにした

[seleniumを使ってPHPでChromeの自動操作をする - Qiita](https://qiita.com/Rasukarusan/items/0ca204d5b0f0fb876252)

古い情報なので当然エラーとかがでて動かない

・JDKのバージョンが古いと怒られた
　・seleniumがJDK8を要求してるようだけど入ってなかったので入れた

・ChromeDriverのバージョンが合ってなかった
　・元記事では親切にURLを決め打ちしているけど、chromeはアップデートペースが早いのですぐ動かなくなる、chromedriverでぐぐると公式が出てくるので最新を入れる

以上で動いた

[PHPでブラウザ自動化 - Qiita](https://qiita.com/tsuuuuu_san/items/61379b797878d0e0f4d7)
みたら、selenium-standalone いらんとか書いてるなあ
sshが使えないサーバーでDBの操作したい奴が色々した記録（session.save_path変更＆phpMyAdminの代替ツールAdminerの導入）


# sshが使えないサーバーがあるらしい
自分初心者なんでサーバーのことわかんないですけど、なんかsshが使えないサーバーが存在するみたいです。へぇって感じだ。
しかも[phpMyAdmin](https://www.phpmyadmin.net/)とかも入ってないサーバーがあるらしいです。
もちろんmysqlコマンド使えないし・・・DB操作するのにどうすりゃいいんだ:thinking:

# サポートサイトみてみた
サポートサイト見てみたら、データベース用のメンテナンスツールを自分で入れるかプログラム書けみたいなことしか書いてなかった。
じゃあまあ[phpMyAdmin](https://www.phpmyadmin.net/)を入れるかと思いサーバーに入れてみました。

# phpMyAdminにログインできません
結論、入れた[phpMyAdmin](https://www.phpmyadmin.net/)にログインできなかった。
ポート番号がMySQLのデフォルトじゃなかったんで設定ファイルとかいじってみましたがダメだった。
（ログイン認証はされているみたいですが、セッション関係がなんかぁゃιぃそうでしたが結局わからず**※**）

**※最後に原因ぽいのが判明します。**

# 代替案、というか救世主？「Adminer」
エロい人に助けを求めたらphpMyAdminの上位互換（？）ツール、[Adminer](https://www.adminer.org/)というのがあるらしい。
なんと「adminer-\*.\*.\*.php」という名の1ファイルだけで動くらしい。すごい
しかも日本語にも対応してるみたい。すごい

↓ログイン画面はこんな感じ
![adminer.png](https://qiita-image-store.s3.amazonaws.com/0/85815/43df18fb-ede7-a08c-347f-e5d2c4b1054b.png)


こいつをサーバーに入れて、それぞれ入力
（この時、ポート番号がデフォルトでない場合はサーバー入力部分に**サーバー名:ポート番号**を入れる）
し、ログインしてみた。

しかし*「セッションの期限切れ。ログインし直してください」*というエラーが

ログインできへんやん

やっぱりセッション関係が問題あるらしい。

# session.save_pathを変更する

もう一回サポートサイトみてみた。
どうやらロードバランサーの下にWEBサーバーが複数あるらしく、サーバーのローカルにセッション関連のファイルを保存させないようにしているらしい。~~はよいえや~~

サーバーの`.htaccess`に以下の記述を追記してセッションを保存させるようにした。

```:.htaccess
php_value session.save_path /****/****/ドキュメントルート/セッション用ディレクトリ名/
```

設定後、再度Adminerにログインしてみたら無事にログインできました。



# おわり
- ssh使えないサーバーあるなんてしらなかった。勉強になった。
- 結局Adminer使ったけど最後の`session.save_path`を変更で恐らくphpMyAdminも使えると思います
- でも1ファイルでいろいろできるAdminerすごい
- あんまり防御策にならんと思うが、Adminerのファイル名は適当に変えておくべき・・・
- というか、使用後は削除して必要に応じて都度Adminerをおくべきかなぁと


# 参考
- [Adminer - Database management in a single PHP file](https://www.adminer.org/)
- [Adminerを設置する - Qiita](https://qiita.com/nissuk/items/2b1aee7f81f351c7ab05)
- サーバーのサポートサイト
ROS C++ でサービスの書き方


#クライアントの書き方
##Emptyで宣言する場合

ヘッダーファイルの宣言

```
#include <std_srvs/Empty.h>
```
関数内での記述

```
ros::NodeHandle nh;
ros::ServiceClient client = nh.serviseClient<std_srvs::Empty>("pkg名(例:imu/set_zero_orientation)"); //サービスのクライアント宣言
std_srvs::Empty srv;　 //

client.call(srv);  //サービスを配信する

```
【Swift4】AutoLayoutを使ってサイズを比率で指定する方法

## 実行環境
【Xcode】Version 9.2
【Swift】Version 4.0.3

## 概要
AutoLayoutの`Equal Widths`と`Equal Heights`を使ってサイズを決める方法のメモです。

## 方法
サイズを指定したいアイテムを選び`Control`を押しながら基準にしたいものにドラッグします。
今回は、画面サイズに対しての比率を指定するので親の`view`を指定しています。
<img width="684" alt="a.png" src="https://qiita-image-store.s3.amazonaws.com/0/238595/fade1c55-7fe5-8850-40f7-51a76bf4bfd2.png">

ドラッグするとポップアップが出てくるので、高さか幅かどちらか基準にしたい方を選びます。
<img width="457" alt="b.png" src="https://qiita-image-store.s3.amazonaws.com/0/238595/6d972dc4-6214-5612-0233-c688e67c55f5.png">

`Equal Widths`を選ぶと新しく`width`に関する制約が追加されるので、その制約を選択します。
<img width="998" alt="c.png" src="https://qiita-image-store.s3.amazonaws.com/0/238595/702d4b70-ec74-2929-5a2e-85f23d0719af.png">

制約を選択するとユーティリティーエリアに`Multiplier`のプロパティを設定する項目があるので、その値を変えます。
画面サイズの`50%`にしたいなら`0.5`にするみたいな感じです。

<img width="998" alt="d.png" src="https://qiita-image-store.s3.amazonaws.com/0/238595/7b4c8c81-f9bb-1ea6-6aac-309ce768aa34.png">

これだけで、画面サイズに応じたサイズに可変する部品を作ることができます！

## 完成形
ラベル幅を画面幅の50%になるように指定してます。
<img width="935" alt="e.png" src="https://qiita-image-store.s3.amazonaws.com/0/238595/4954c6d1-b1e1-6109-c1c1-28381943ae4f.png">
array_reduceのバグがhhvmにあるか調べる

報告したけど絶賛放置中wのarray_reduceの性能問題( https://bugs.php.net/bug.php?id=75533 ) [^1] ですが、hhvmは実装が違うだろうから多分ないと思うので確認してみた。

型とかつけて以下のように書き換えて実行。

test_array_reduce.php:

```php
<?hh

function test_array_reduce(int $n): void
{
    $d = range(1, $n);

    $t0 = microtime(true);
    $r = array_reduce(
            $d,
            function (&$carry, $item) {
                $carry []= $item;
                return $carry;
            },
            []
        );
    printf("%fms\n", (microtime(true) - $t0) * 1000);
}

test_array_reduce((int)$argv[1]);

```

test_my_reduce.php:

```php
<?hh

function foo_reduce<T1,T2>(array<T1> $array, (function(T2, T1): T2) $func, T2 $init): T2
{
    $carry = $init;
    foreach ($array as $item) {
        $carry = $func($carry, $item);
    }
    return $carry;
}

function test_my_reduce(int $n): void
{
    $d = range(1, $n);

    $t0 = microtime(true);
    $r = foo_reduce(
            $d,
            function (&$carry, $item) {
                $carry []= $item;
                return $carry;
            },
            []
    );
    printf("%fms\n", (microtime(true) - $t0) * 1000);
}

test_my_reduce((int)$argv[1]);

```

結果はこんな感じで問題なし。

```console
% hhvm test_array_reduce.php 100000
17.694950ms
% hhvm test_my_reduce.php 100000
15.845776ms
% hhvm test_array_reduce.php 200000
24.797916ms
% hhvm test_my_reduce.php 200000
23.839951ms

```

組み込みのarray_reduceより自分で書いた関数の方が速いのはご愛敬か?

さらにいうと`foo_reduce`の中で`$carry`の値は`$func`の呼び出し後は必ず破壊されるので保持する必要がないからさらにリファレンスカウントを1つ減らすことが可能で、そのような最適化を行えば`$carry`を参照渡しにしなくてもコピーが行われなくなり便利そうですが、さすがにそこまではやってないようでした。

[^1]: 組み込みのarray_reduceが`$carry`が大きな配列でcallback関数の中で書き換えを行うときに、`$carry`を参照渡しにしていても自分でforeach使って実装したのより遅くなることがあるという性能バグです。(array_reduceの内部で$carryへのリファレンスを1つ余分に持っているので参照で受けても余計な配列コピーが行われる模様)
JavaScript Tips

JavaScriptを書く時に気をつけることとか定型化できそうな処理のメモ

- for文のindexは慣例的にiでよい
- jQueryオブジェクトの変数は$をつけて明示的にする
- === の逆は !==
- if文中の処理が長くなりインデント増えるくらいなら、逆の条件にしてインデントあげる

```js
if( A === B ){
  処理 １００行
}
```
↓

```js
if( A !== B ){
  return;
}
処理 １００行
```

- あるリストから選択された値だけひっこぬいたリスト欲しい

-- _.filter : 第1引数「配列（Object）」の値の中で第2引数の関数の条件を満たしている値のみの配列を返す。
-- _.find : 第1引数「配列（Object）」の値の中で第2引数の関数の条件を満たしている最初の値が返される。（!つけてるので逆）

```js
function getSomeList(allList, selectedList) {
  var filterdList = _.filter(allList, function(item) {
    var notFound = !_.find(selectedList, function(compare) {
      return item.someName === compare.someName;
    });
    return notFound;
  });
  return filterdList;
}
```
System.Net.Mail.SmtpClientでのGmailリレー設定

# 概要

* SmtpClientでGmailリレーでの接続を試した
* ポート465では接続できず・・
* ポート587でもEnableSSL=Trueだと認証エラーに。。
* Credentialをブランクにしたら成功！

# 結論

.Net Framework2.0 のSmtpClientでGmailとのリレー設定をする必要があり、色々試した。

何度試してもうまく行かなかったが、最終的にはSmtpClient.Credencialの中身をブランクにしたところうまく行った。

## Gmail側の設定
https://support.google.com/a/answer/2956491

上記URLにある各種設定を以下に設定
ステップ 1: SMTP リレーサービスを使用して送信メールの経路を指定する
　　6 [許可する送信者] → ドメイン内のアドレスのみ
　　7 [認証] → 指定したIPアドレスからのみメールを受信する
　　9 [TLS暗号化を必須とする] → チェックなし


## 失敗した設定
```vbnet
Dim client As SmtpClient = New SmtpClient("smtp-relay.gmail.com", 587)
client.EnableSSL = True
client.Credentials = new NetworkCredential("USER_ID", "PASSWORD")
client.Send(Message)
```

#### 返ってきたエラー
5.5.1 Authentication Required.


## 成功した設定
```vbnet
Dim client As SmtpClient = New SmtpClient("smtp-relay.gmail.com", 587)
client.EnableSSL = True
client.Credentials = new NetworkCredential("", "")
client.Send(Message)
```

結局、ユーザ単位での認証になってしまっていてエラーになっていたのか、ユーザを未設定にするとIPアドレス認証が効いてうまくいったようだ。
記事投稿機能と画像アップ機能とプレビュー機能

・画像をドラッグ＆ドロップを行う範囲
・入力するテキストエリア
・プレビュー
この三つを用意します。下記を参考に。

```index.html
<div ondragover="onDragOver(event)" ondrop="onDrop(event)">
    <textarea id="text_input" rows="3">
    </textarea>
    <div id="content"></div>
</div>
```


プレビューはテキストエリアに入力された内容をそのまま#contentに表示させるだけです。

```preview_jQuery.js
	$('#text_input').keyup(function() {
		var text = $('#text_input').val();

		$('#content').html(text);
	});
```

下記は参考にしたものを追加できるようにしたものです。

```Image_upload.js
	// Drop領域にドロップした際のファイルのプロパティ情報読み取り処理
    function onDrop(event) {
        // ブラウザ上でファイルを展開する挙動を抑止
        event.preventDefault();

        // ドロップされたファイルのfilesプロパティを参照
        var files = event.dataTransfer.files;
        for (var i=0; i<files.length; i++) {
            // 一件ずつアップロード
            imageFileUpload(files[i]);
        }
    }


    // ファイルアップロード
    function imageFileUpload(f) {
        var formData = new FormData();
        formData.append('image', f);
        $.ajax({
            type: 'POST',
            contentType: false,
            processData: false,
            url: '/admin/sync/img_uplodar',
            data: formData,
            success: function(data) {
                document.getElementById('text_input').value += data;
            }
        });
    }
```

参考にしたもの
https://qiita.com/uda0922/items/4e22908ce2acb3a28f29
e(fx)clipse トラブルメモ

## これまでのあらすじ

作ったあとずっと放置していたJavaFXのコードを少し触ってみようかなあ。そういえば開発環境のEclipseももう古いなあとか思って、Eclipseの最新バージョンをダウンロードしてJavaFXのプラグインを追加して、さてプロジェクト構築するかねと思ったらトラブル。出足をくじかれる。

## なにが起こったか

現象としては、こんな感じ。

* Windows環境
* Eclipse Oxygen(4.7.2) をインストール
* Eclipse Marketplace経由でe(fx)lipseプラグインをインストール
* JavaFXプロジェクトを生成しようとするとプログレスバーが19%で停止したまま進まない。

ぐぐるさんに聞いてみても日本語の情報はナシ。まあマイナーだよねJavaFX。私は嫌いじゃないのだけれど。

## 解決方法

結論から言うと Eclipse Marketplace からインストールできる 3.0.0 じゃなくて、Install New Software に http://download.eclipse.org/efxclipse/updates-nightly/site/ を登録して 3.1.0 のほうをインストールすることで解決します。GitHubのリポジトリ見る感じからするに、これマーケットプレイスへの登録し忘れなんじゃないかなあ。

同じトラブルに遭遇した人がぐぐってここが引っかかるとはあまり思えないのだけれど、一応トラブルメモとして残します。
最古の重複行を1行残して削除するSQL

自分用メモ

```
delete from `[table_name]` where id not in (select min_id from (select min(t1.id) as min_id from `[table_name]` as t1 group by t1.`[duplicate_col]`) as t2);
```

`[table_name]`にテーブル名
`[duplicate_col]`に重複を検知できるカラム名を入れるだけ。

参照
[【MySQL】重複しているレコードを最古のものを残しすべて削除するSQL。](http://note.onichannn.net/archives/1495)
AVDからホストPCにHTTP接続【Android】


## 環境
- macOS Sierra 10.12.6
- AVD(Android Virtual Device）
  - Emulator : Nexus_6_API_27
  - AndroidOS : 8.1.0
  - API : 27

## 困ったこと
アンドロイドエミュレーター(以下AVD)から、AVDを動かしているホストPC上で立ち上げたサーバーにhttp接続しようとすると以下のエラーが発生する。

```
 java.net.ConnectException: Failed to connect to xxx
```

## 解決策
1. `php -S 127.0.0.1:8000/` でphpのビルトインサーバーを起動
2. Androidからは、 `http://10.0.2.2:8000/xxx` で接続する。

- AVDでは、ホストPCへのネットワーク接続は　`10.0.2.2` のIPで割当てられているみたい。
  - `10.0.2.2` はあくまでエイリアスとしてのIP。
  - ホストPCに実際に割り当てられているIPでも、もちろんつながる。
- Virtualbox上から、ホストPCに接続するときもこのIPだった気がする。
  - [why do we use 10.0.2.2 to connect to local web server instead of using computer ip address in android client
](https://stackoverflow.com/questions/9808560/why-do-we-use-10-0-2-2-to-connect-to-local-web-server-instead-of-using-computer)
      - The reason why you use 10.0.2.2 is because it's the special alias to your host loopback interface (aka 127.0.0.1).(ANSWER 抜粋)
【支払総額約６億円】バグや脆弱性を報告するだけでお金がもらえる！！企業まとめ

ハッキングなどの犯罪が非常に増えている中で、最近非常に面白い取り組みがされております。

「バグバウンティ（バグ脆弱性報告）」と呼ばれる取り組みで、webサイト、アプリケーションのバグや脆弱性を報告したエンジニアに対して報奨金を支払うと呼ばれるものです。

企業がバグや脆弱性を完全に無くすことは不可能で、それが悪意のあるハッカーに知られる前に防ごうという考え方のもとスタートされました。

今回は、そのバグバウンティの簡単な説明と実際にバグバウンティをしている企業を20社まとめてみました！


バグバウンティは、欧米を中心としたセキュリティリテラシーが高い企業では積極的に行われており、有名な企業の一覧としましては、

google
Twitter
TOYOTA
スターバックス
任天堂
・
・
・

と言った超有名企業が行っておりまして、年収2000万円以上のバグハンターと呼ばれる職業も存在します。


一応、バグバウンティをご存知ない方のために、LINE社を例として簡単に説明させて頂きますね。
https://bugbounty.linecorp.com/ja/


LINE社ではすでに総額で1600万円以上の支払いをしています。。。！

![IMG_4025.jpg](https://qiita-image-store.s3.amazonaws.com/0/237990/7f822b68-5ffc-8bef-3373-f56f4161952a.jpeg)

現在募集をしている内容はこのようになっております。

![IMG_4026.jpg](https://qiita-image-store.s3.amazonaws.com/0/237990/f847e088-4588-26bf-fd21-6724bc2a0a37.jpeg)


もちろんすべてのバグや脆弱性が対象というわけではなく、対象外のものありますので確認をしてみてください。

![IMG_4027.jpg](https://qiita-image-store.s3.amazonaws.com/0/237990/9b91d0c2-bb69-2c21-d6f6-d8e8f886cdd2.jpeg)


決まった報告フォーマットがない企業の場合は、

・会社名（ＵＲＬ）
・バグ脆弱性の概要
・危険性
・再現手順
・確認ＵＲＬ
・その他

といった形で報告すると企業側に喜ばれます。

あとは、バグや脆弱性が見つかった場合に指定のフォームで問い合わせを行い審査を待つのみとなります。


一つの報告で場合によっては100万円を超えますので、非常に面白いですね！



バグバウンティは自社のサイトなどで募集していることが多いのですが、今回は現在バグバウンティを実施している有名企業を20社ピックアップしてみました！

以下の企業は現在(2018/2/23時点)、バグバウンティを行っております。
（米法人が対応窓口になっていると思います）

１．Twitter
２．TOYOTA
３．intel
４．Huawei
５．Google play
６．starbucks
７．Apple
８．Nintendo
９．AT＆T
１０．snapchat
１１．Slask
１２．Adobe
１３．Dell
１４．eBAY
１５.google
１６．Yahoo!
１７．Uber
１８．GitHub
１９．Spoify
２０．Rockstar Games

こちらの企業累計20社で今までの支払総額が約６億円です！

一応、下記アンケートフォームに答えて頂いた方には各ページのURLをまとめてお送りしますので、ぜひ挑戦してみてください＾＾
https://docs.google.com/forms/d/e/1FAIpQLSec8ZMkkLSqNVIfT6bA5FYxQqQOXUXQ4FA3YPUNobmlQE72SA/viewform?usp=sf_link

今回は、20社のみピックアップしましたが、要望がありましたら追加などしますのでまた感想など教えて頂けましたら嬉しいです。。。
(掲載終了企業もございますので、その場合はご了承ください)
postgresql コマンドメモ

 ログの場所

```
/var/lib/pgsql/data/pg_log/　
```

postgresに接続

```
psql -U [ユーザー名] -d [db名]
```

DBの一覧

```
\l
```

DBの使用

```
\c
```
テーブルの一覧

```
\d
```


指定したテーブルの列一覧

```
\d [teble名]
```

sqlファイル実行

```
\i [ファイルのpath]
```
Zabbix unreachable poller processes more than 75% busy の対策

# Zabbix unreachable poller processes more than 75% busy

zabbixが↓というときの対策

```
Zabbix unreachable poller processes more than 75% busy
```

まず基本のきとして、zabbix-server/agentのversionをあわせる。

zabbix-serverはweb画面で、agentは以下でわかる。
```
zabbix_agentd -V
```

zabbix-server側は以下の値を適度に増やして、Zabbix server のgraphで効果を確認。

特に `Zabbix data gathering process busy %` がわかりやすい。

```yml
# unreachable対策=>
- ZS_StartPollers=128
- ZS_StartPollersUnreachable=30
- ZS_StartPingers=10
- ZS_StartDiscoverers=10
# <=
```

screenでagentのcpu/network/memoryとzabbix serverのbusyを並べて関連性を探す。

agent側で詰まってるように見えたら、agentを疑う。

zabbix-agent側でログレベルを上げて眺めれば、何かわかるかも。
```
DebugLevel=4
```

今回は追加したuserparameterがsyntax errorを起こしていたのが原因だった。ubuntuでも `[[` を使ってしまう悪い癖。
agentがerrorになるitemに連続トライしていた。

あとは、`configuration > Host > items` で、右側に `!` がついている項目をひたすら減らしていくと良さそう。

そんなことで？と思ったけど、実際に直ったので、それが原因だったと考えるしかない状態なう。
ビットコインエクスプローラー(ウォレットコマンド:ec-to-address)

# ビットコインエクスプローラー(ウォレットコマンド:2)

原文(https://github.com/libbitcoin/libbitcoin-explorer/wiki/)

## bx ec to address

楕円極性公開鍵を、ペイメントアドレスに変換する。

```
bx ec-to-address --help
```
```
Usage: bx ec-to-address [-h] [--config VALUE] [--version VALUE] [EC_PUBLIC_KEY]

情報：楕円極性公開鍵を、ペイメントアドレスに変換する。

オプション (named):

-c [--config]        コンフィギュレーションファイルを指定
-h [--help]          コマンドの説明を表示
-v [--version]       バージョンの指定(10進数 testnet<111>)          

引数 (任意):

EC_PUBLIC_KEY        BASE16楕円曲線公開鍵、指定しなければ、STDINから読み込む。
                     
```
#### Example 1

アドレスの作成(圧縮公開鍵)

```
bx ec-to-address 0247140d2811498679fe9a0467a75ac7aa581476c102d27377bc0232635af8ad36
```
```
1EKJFK8kBmasFRYY3Ay9QjpJLm4vemJtC1
```

#### Example 2

testnetアドレスの作成(圧縮公開鍵)

```
 bx ec-to-address -v 111 0247140d2811498679fe9a0467a75ac7aa581476c102d27377bc0232635af8ad36
```
```
mtqFYNDizo282Y29kjwXEf2dCkfdZZydbf
```

#### Example 3

アドレスの作成(非圧縮公開鍵)

```
bx ec-to-address 0447140d2811498679fe9a0467a75ac7aa581476c102d27377bc0232635af8ad36e87bb04f401be3b770a0f3e2267a6c3b14a3074f6b5ce4419f1fcdc1ca4b1cb6
```
```
197FLrycah42jKDgfmTaok7b8kNHA7R2ih
```

#### Example4

testnetのアドレス作成(非圧縮公開鍵)

```
bx ec-to-address -v 111 0447140d2811498679fe9a0467a75ac7aa581476c102d27377bc0232635af8ad36e87bb04f401be3b770a0f3e2267a6c3b14a3074f6b5ce4419f1fcdc1ca4b1cb6
```
```
modCdv4bPiVHWRhJPLRxdfKuzjxz275cah
```

#### Example 5

パイプコマンドの利用

```
bx seed | bx ec-new | bx ec-to-public | bx ec-to-address
```

```
13ua8RRSxLpL5WL5cKUDepUCvJZgGWuKh7
```
* `bx seed`は、ランダムなエントロピーを生成します。
FirebaseAuthがシュミレータで動かした時に動かない


結論からいうと動かすことができました。
問題から解決方法まで書いていきます。
誰かの力になれば。


## Calbackが返ってこない

AndroidでTwitterでログイン機能を実装したときにこんなコードを書いていました。

```kotlin
 mAuth.signInWithCredential(credential)
                .addOnCompleteListener(this) { task ->
                    if (task.isSuccessful) {

                        val user = mAuth.currentUser
                        if (user != null) {
                        　　　　//ここでuser情報をColudFirestoreに保存する処理
                        }
                    } else {
                        Toast.makeText(this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show()
                    }
                }
```

ここで `onCompleteLitener` にコールバックされないませんでした。
しかもこの事象が起こるのはあくまで `シュミレータ` で動かした時だけで実機で動かしたときはちゃんとコールバックされます。


## 解決方法

スタックオーバーフローにも同じような事象が起こっている人がしました。
https://stackoverflow.com/questions/45054620/android-studio-2-1-2-with-firebase-not-working

解決方法は上に書いてある通りで下記の二つをやると解決しました。

* シュミレータのアップデート
* シュミレータでグーグルアカウントにログインする


## シュミレータのアップデート


[Android Studio]→[Preferences]→[Appearance & Behavior]→[System Setting]→[Android SDK]→[Android Emulator]

でアップデートできます。

![スクリーンショット 2018-02-23 9.53.40.png](https://qiita-image-store.s3.amazonaws.com/0/139360/8ce428bb-f854-4701-12a4-b56bfdc45205.png)


## シュミレータでグーグルカウントにログインする

ログインしましょう。
やり方は割愛します。


自分は上の２つをやると動きました。
誰かの力になれば。
Processing - 13 - forとlineを使った描画

<img width="497" alt="スクリーンショット 2018-02-23 00.19.40.png" src="https://qiita-image-store.s3.amazonaws.com/0/45520/2193c526-4ec7-2866-418b-4babfbb239af.png">


```java:
void setup() {
  size(500, 500);
  background(0);
  stroke(255, 60);
  noLoop();
}

void draw() {
  for (int i = 0; i < 100; i++) {
    float random = random(30);
    strokeWeight(random);
    float offset = random * 20.0;
    line(i-20, height, i+offset, 0);
  }
}

```