OmniAICreator/Qiita-1.07M huggingface dataset:
DataFrame備忘録

DataFrameを使う上での備忘録あれこれ。解決していないやり方も書いていくつもりですので、その点はご了承ください。

# 日付関係
## Excelファイルから日付データの読み込み
`pd.read_excel`か`pd.ExcelFile.parse`で読み込み。エクセルの書式設定でYYYY/M/Dとなっている場合は、自動的に日付データとして認識されるので、それ以外の場合での引数`converters`の設定方法。

### "YYYYMMDD"形式(文字列)
| date       |
|:----------:|
| "20190131" |
| "20190228" |
| "20190331" |

```python
pd.read_excel('foo.xlsx', converters={'date':pd.Timestamp})
```

### YYYYMMDD形式(数値)
| date     |
|:--------:|
| 20190131 |
| 20190228 |
| 20190331 |

```python
def from_int(x):
    return pd.Timestamp(str(x))

pd.read_excel('foo.xlsx', converters={'date':from_int})
```

あるいは、ラムダ式を使って

```python
pd.read_excel('foo.xlsx', converters={'date':lambda x:pd.Timestamp(str(x))})
```

### Excelのシリアル値
| date  |
|:-----:|
| 43861 |
| 43890 |
| 43921 |
```python
def from_serial(x):
    #-25569 = pd.Timestamp('1899-12-30').to_julian_date()
    #        - pd.Timestamp('1970-1-1').to_julian_date()
    return pd.Timestamp(x-25569, unit='D')

pd.read_excel('foo.xlsx', converters={'date':from_serial})
```
もちろんラムダ式を使っても可。
↓気になる人は気になる。
http://d.hatena.ne.jp/bonlife/touch/20071016/1192526451

## 日付のオフセット
### 月末かどうか
#### Timestampのアトリビュートを使用
http://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#time-date-components

```python
pd.Timestamp('20190130').is_month_end
# False
pd.Timestamp('20190131').is_month_end
# True
pd.Timestamp('20190201').is_month_end
# False
```

#### offsetsを使用
http://pandas.pydata.org/pandas-docs/stable/user_guide/timeseries.html#dateoffset-objects

```python
pd.offsets.MonthEnd().onOffset(pd.Timestamp('20190130'))
# False
pd.offsets.MonthEnd().onOffset(pd.Timestamp('20190131'))
# True
pd.offsets.MonthEnd().onOffset(pd.Timestamp('20190201'))
# False
```
### 月末日へオフセット（月末日はそのまま）
```python
pd.offsets.MonthEnd().rollforward(pd.Timestamp('20190131'))
# Timestamp('2019-01-31 00:00:00')
pd.offsets.MonthEnd().rollforward(pd.Timestamp('20190131'))
# Timestamp('2019-01-31 00:00:00')
pd.offsets.MonthEnd().rollforward(pd.Timestamp('20190201'))
# Timestamp('2019-02-28 00:00:00')
```

# MultiIndex
↓に移動しました。
https://qiita.com/k_maki/items/f31db2ec797d73393672

# その他
## Update and Insert（Upsert的な）
https://stackoverflow.com/questions/33001585/pandas-dataframe-concat-update-upsert

```
df1:
                    A      B
    date
    '2015-10-01'  'A1'   'B1'
    '2015-10-02'  'A2'   'B2'
    '2015-10-03'  'A3'   'B3'

df2:
    date            A      B
    '2015-10-02'  'a1'   'b1'
    '2015-10-03'  'a2'   'b2'
    '2015-10-04'  'a3'   'b3'
```
↑から↓を作りたい。10/2と10/3は更新(update)し、10/4を追加(insert)する。

```
df3:
                    A      B
    date
    '2015-10-01'  'A1'   'B1'
    '2015-10-02'  'a1'   'b1'
    '2015-10-03'  'a2'   'b2'
    '2015-10-04'  'a3'   'b3'
```

```python
df3 = df1.copy()
df3.update(df2)
df3 = pd.concat([df3, df2.loc[~df2.index.isin(df3.index)]], sort=True)
```


次は何を書こうか…
【Tips】go1.11+google/wireの組み合わせで起きたエラー解消方法

# お題
ただのTips。
Google純正のGoで書かれたDIツールである [wire](https://github.com/google/wire) を使おうとして発生した問題と解消方法。
**※現在自分が使用しているGoのバージョンは「1.11」、その環境下において発生した問題**

表題の組み合わせで同じエラーが起きた人向けなので、そもそもgoogle/wireとは？といったことは説明しない。

# 作業環境
### # OS
```
$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
```

### # 言語
```
$ go version
go version go1.11.4 linux/amd64
```

# 本題
## wireインストール時の問題
公式のREADMEに「 `go get github.com/google/wire/cmd/wire` 」でインストールするように書いてあったのでトライ。
https://github.com/google/wire#installing

すると、まさに↓に書いてある通りのことが発生した。
https://qiita.com/x-color/items/3b3acd3bcab74e1f15ca

なので、上記にならって、以下のようにして解決。

端末エミュレータを開いて、GOPATHをセット。
言わずもがなだけど、↓ではコマンド叩いてセットしてるが `~/.bashrc` あたりに書いておくといい。
**※必要なディレクトリは、あらかじめ掘ってある前提**

```
$ export GOPATH="/home/sky0621/work/src/gopath"
$ cd $GOPATH/src/github.com/google
$ git clone https://github.com/google/wire.git
$ cd wire/cmd/wire
$ go install
$
$ ls -l $GOPATH/bin | grep wire
-rwxr-xr-x 1 sky0621 sky0621  7424404  2月 17 23:08 wire
```

**当然ながら、上記の `$GOPATH/bin` にはパスを通しておく。**

## wireコマンド実行時の問題

google/wireのGitHubソースに[チュートリアル](https://github.com/google/wire/blob/master/_tutorial/README.md)があったので、まんま同じソースを書いて、 `wire` コマンドを叩いてみると、・・・。

```
$ wire
go [list -e -json -compiled -test=false -export=false -deps=true -find=false -tags=wireinject -- .]: exit status 1: go: cannot determine module path for source directory /home/sky0621/work/src/go111/src/github.com/sky0621/try-googlewire (outside GOPATH, no import comments)
	
wire: generate failed
```

う〜ん、とにかく `GOPATH` 外ではダメな様子。
ソースを `GOPATH` に置かなくてよくなった Go1.11 と、 `GOPATH` 内でないと叩けない wire コマンドは相容れない？

ふと、↓の記事に「GO111MODULE」について書かれていたことを思い出す。
https://budougumi0617.github.io/2019/02/15/go-modules-on-go112/

Go1.11では、ライブラリ管理には「Go Modules」を使っている。
この「Go Modules」は「GOPATH mode」と「module-aware mode」という２つのモードがあるらしい。

・GOPATH mode
　＝標準pkg以外を全部 GOPATH 以下のディレクトリで管理

・module-aware mode
　＝標準pkg以外の全てのパッケージをモジュールとして管理

これらのモードをどう扱うかが環境変数「GO111MODULE」のセット内容によって変わるのだとか。
最初にGo1.11をインストールした時に見た記事に「`export GO111MODULE=on`」と書いてあって、何も理解せずそのまま環境変数にセットしていた。
こうすると、常に「module-aware mode」で動作するらしい。
で、環境変数「GO111MODULE」のセット方法には「on」「off」「auto」の３つがあり、「auto」の場合は、
『$GOPATH 配下ではGOPATH modeで，それ以外のディレクトリではmodule-aware modeで動作する』とのこと。

というわけで、試しに、・・・。

```
$ export GO111MODULE=auto
$
$ wire
_/home/sky0621/work/src/go111/src/github.com/sky0621/try-googlewire: wrote /home/sky0621/work/src/go111/src/github.com/sky0621/try-googlewire/wire_gen.go
$
$ ls -l wire_gen.go 
-rw-r--r-- 1 sky0621 sky0621 336  2月 17 22:22 wire_gen.go
```

うん、出来た。
ちょっと理屈がわかっていない。。。
「Go Modules」に関しては、ちょうど今が `GOPATH` から「Go Modules」への過渡期のよう。
Go1.13 ぐらいからは基本的に `GOPATH` は使わなくなるのかな。
Windows更新プログラムの既知の問題をスクレイピングで取り出す（Python）

# 環境
Python 3.7
BeautifulSoup
Selenium

# 対象ページ
MicrosoftのWindows更新プログラムのページから、「この更新プログラムの既知の問題」を取り出してみました。更新プログラムのページというのは例えば次のページです。
https://support.microsoft.com/ja-jp/help/4487044/windows-10-update-kb4487044

ページ内に次のような表がありますので、この「現象」と「回避策」の情報を取り出しています。

![「この更新プログラムの既知の問題」の表](https://qiita-image-store.s3.amazonaws.com/0/346413/bfded5fb-53e8-14a3-ed92-1cceae39a4e1.png)
# 表の構造
ページのソースを確認したところ、該当のテーブルは次のようになっていました。
一つ目の`<tr>`がヘッダー行、二つ目以降が「現象」と「回避策」の内容です。

```html
<table class="table ng-scope">
	<tbody>
		<tr>
			<td class="x-hidden-focus">現象</td>
			<td>回避策</td>
		</tr>
		<tr>
			<td>・・・</td>
			<td>・・・</td>
		</tr>

		・・・
```

# コード
上記の構造をもとに、１行目の最初のセルに「現象」とあれば対象の表と判断し、２行目以降を抽出しています。

```python
from bs4 import BeautifulSoup
from selenium import webdriver

url = 'https://support.microsoft.com/ja-jp/help/4487044'

# Headlessモードで動かす
options = webdriver.chrome.options.Options()
options.add_argument('--headless')
driver = webdriver.Chrome(options=options)
driver.implicitly_wait(10)

driver.get(url)

tbodies = driver.find_elements_by_tag_name('tbody')
for tbody in tbodies:
    soup = BeautifulSoup(tbody.get_attribute('innerHTML'), 'html.parser')

    # ヘッダー行（1つ目の<tr>タグ）の内容で、取り出したい表かどうかを確認
    header = soup.find('tr').find('td')
    if header.text != '現象':
        continue

    # 2つ目以降の<tr>タグから現象と回避策の情報を抽出
    for row in soup.find_all('tr')[1:]:
        cells = row.find_all('td')
        print('===================')
        print('--- 現象 ---')
        print(cells[0].text)
        print('--- 回避策 ---')
        print(cells[1].text)
        print('')

driver.quit()
```

# 結果

```
===================
--- 現象 ---
この更新プログラムのインストール後、日本の元号名の最初の文字が省略形として認識されず、日付を解析する際に問題が発生することがあります。
--- 回避策 ---

日本の元号の 2 文字の省略形で、次のとおりレジストリを修正します。
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\Calendars\Japanese\Eras]
"1868 01 01"="明治_明_Meiji_M"
"1912 07 30"="大正_大_Taisho_T"
"1926 12 25"="昭和_昭_Showa_S"
"1989 01 08"="平成_平_Heisei_H"
マイクロソフトは解決方法に取り組んでおり、今後のリリースで更新プログラムを提供します。

```
vue-chartjsで凡例をカスタマイズ

#はじめに
凡例は文字の太さや位置はオプションで対応可能ですが、レイアウトなどになるとそのままでは対応出来ませんでした。

調べたところ、大本のchart.jsでは、凡例部分のHTMLを出力させてstyleで対応させていました。
vue-chartjsでも対応する為のコードがあった為、それで対応しました。

備忘かねて投稿します。

#やった事
- mount後に'generateLegend()'して、凡例のHTMLを取得。
- 取得したHTMLに対してstyleを設定

## 今回の案件では
- 生成したHTMLを親コンポーネントに送る
- 親コンポーネントでイベント購読し、凡例部分のHTMLを取得する。
- HTMLとして出力。style設定

###今回の注意事項
-生HTMLなので、v-htmlを使う。
-凡例部分のHTMLにstyleを設定する際、scopedにするとstyleが反映されないので注意。（[data-v-***]がない）

```javascript

  // 凡例のHTMLを生成
  this.legend = this.generateLegend();

  // 生成したHTMLを親に送出する場合
  this.$emit('legend', this.htmlLegend);

```

# 参考
https://qiita.com/choro/items/69029ac20a539670ee68
https://vue-chartjs.org/api/#generatelegend
https://stackoverflow.com/questions/44649247/how-to-create-custom-legend-in-chartjs
HEADS UP! i18n 1.1 changed fallbacks to exclude default locale. But that may break your application.

Ruby on Rails での新規プロジェクト立ち上げ時に

```
$ bundle install --path vendor/bundle --jobs=4
```

を実行すると、次のような注意がでたので調査。

```
HEADS UP! i18n 1.1 changed fallbacks to exclude default locale.
But that may break your application.

Please check your Rails app for 'config.i18n.fallbacks = true'.
If you're using I18n (>= 1.1.0) and Rails (< 5.2.2), this should be
'config.i18n.fallbacks = [I18n.default_locale]'.
If not, fallbacks will be broken in your app by I18n 1.1.x.

For more info see:
https://github.com/svenfuchs/i18n/releases/tag/v1.1.0
```

## Ruby の `i18n gem` とは
[Rubyの多言語化API](https://railsguides.jp/i18n.html)。
（Internationalizationを略して、i18n。）
> アプリケーションの文言を英語以外の 別の1つの言語に翻訳 する機能や 多言語サポート 機能を簡単かつ拡張可能な方式で導入するためのフレームワークを提供します。


## config.i18n.fallbacks とは？

RAILSGUIDS / Railアプリを設定する/3 Railsコンポーネントを構成する/[3.5 i18nを設定する](https://railsguides.jp/configuring.html#i18n%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)
によると、
> config.i18n.fallbacksは訳文がない場合のfallback動作を設定します。

として、具体的な３つの設定パターンが紹介されています。

1.　defaultのlocaleをfallback先として使う場合、trueを設定。

```./config/environments/production.rb
config.i18n.fallbacks = true
```

2.　localeの配列をfallback先に使う場合。

```./config/environments/production.rb
config.i18n.fallbacks = [:tr, :en]
```

3.　localeごとに個別のfallbackを設定する場合。 例:azと:deに:trを、:daに:enをそれぞれfallback先として指定する場合は、次のようにします。

```./config/environments/production.rb
config.i18n.fallbacks = { az: :tr, da: [:de, :en] }
#or
config.i18n.fallbacks.map = { az: :tr, da: [:de, :en] }
```

## 結局どうすれば良いか
警告文の第２段落によると、

`I18n(>= 1.1.0)` かつ `Rails (< 5.2.2)` において fallback 機能を有効にしたい場合、

または、

警告文の第３段落で紹介されている[github](https://github.com/ruby-i18n/i18n/releases/tag/v1.1.0)のページによると、

`I18n 1.1.x` 系において fallback 機能を有効にしたい場合、

```./config/environments/production.rb
config.i18n.fallbacks = [I18n.default_locale]
```


### ※[fallbackとは](http://e-words.jp/w/%E3%83%95%E3%82%A9%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF.html)
> フォールバックとは、システムに障害が発生したときに性能を落としたり機能を制限したりして限定的ながら稼動を続行すること。あるいは、利用したい機能が条件が悪く使えない場合に、代替となる機能に切り替えること。また、そのような機能や構成。
heroku上のPostgres SQLにデータを挿入する


sqllite3のDBにインサート
https://qiita.com/tetsu-sh/items/51e76aa69b45a3c67631

今回は上記記事に関してheroku上のPostgresSQLにデータをINSERTした

正直アクセス先を変更してやることと、sqlite3とPostgresSQLとのシンプルな変更点のみ
で基本は同じ

変更点
・モジュールをsqlite3からPostgres用のpsycopg2にする
・connectの引数においてhost,port,dbname,userを指定する。herokuのダッシュボードのcredientialから見れる。
・プレースホルダーが？から％sになる。

```
import psycopg2

connection = psycopg2.connect("host= port= dbname= user=")
cursor = connection.cursor()


try:
    cursor.executemany("INSERT INTO table名 VALUES(%s,%s,%s,%s,%s,%s,%s)",ids)
    connection.commit()
＃idsはリストの入ったタプル

except psycopg2.Error as e:
    print('psycopg2.Error occurred:', e.args[0])
    
cursor.execute('SELECT*FROM table名')
res=cursor.fetchall()
print(res)


"""
cursor.execute("SELECT*FROM table名")
for x in cursor.fetchall():
    print(x)
"""

connection.close()

```

プレースホルダーの違いというところにたどり着くまでが大変だった。
いつも大きな進展となる課題解決法はシンプル
自身の TextNode が親から見て何番目の Node なのかを知る方法

```html
<p>テキスト１<strong>強調１</strong>テキスト２</p>
```

こんな HTML があった時、node の構造としては以下のようになっています。

<img width="699" alt="domtree.png" src="https://qiita-image-store.s3.amazonaws.com/0/2152/8488ebb9-ab09-0dcd-a86e-077173796c56.png">

この時、`テキスト２` となっている TextNode が `p` から見たときに何番目の Node なのを知りたくなったので、こんな感じのコードを書きました。取得したいのは３番目の Node ということです（0 始まりなのでコード的には 2）。

```javascript
const sel = window.getSelection()
const range = sel.getRangeAt(0)
let targetNode = range.startContainer
let i = 0
while ((targetNode = targetNode.previousSibling) !== null) {
  i++
}
```

単に `previousSibling` で前の node を存在するまで見ていくだけ。
TwitterAPIで、フォロワー,フォロー情報を200人以上取得する方法(3000人まで)

TwittwrAPIはフォロワー情報を取得する際の取得する数が最大200人までなので、全てのフォロワーの情報を取得する方法を書きます。

TwitterAPIでは、カーソリングという技術を使い、取得したデータをページネートしている。


>Twitter REST API では‘カーソリング(cursoring)’と呼ばれる技術を使って大量の取得結果をページ制御しています。 カーソリングでは取得結果を複数のページに分割し(ページのサイズはリクエスト時に設定したcountパラメータによって決められます)、それらのページ間を前後に移動するための方法が用意されています。
(Twitter開発者ドキュメント　)

このページ間を前後に移動するための方法が、APIを呼び出す時にparams内でcursorを指定するというものになる。
デフォルトでは-1に設定されていますが、cursorにnext_cursorを指定することで、繰り返した場合に次のページの情報を取得できるということになる。

下記サンプルコードです。

```php
$params = [
    'cursor' => '-1',
    'count' => '200',
    'skip_status' => 'true',
    'screen_name' => '...',
];
$followers = [];

do {
    $response = $connection->get('followers/list', $params);
    if (!isset($response->users)) {
        echo 'TwitterAPIの制限がかかっちゃってる！ごめんなさい！' . PHP_EOL;
        break;
    }
    $followers = array_merge($followers, $response->users));
} while ($params['cursor'] = $response->next_cursor_str);

// ↑ $params['cursor'] に代入しつつカーソルの値をループ条件に使う
```

これで、$follower[]に全てのフォロワーの情報が格納されている。


参照
http://westplain.sakuraweb.com/translate/twitter/API-Overview/Using-cursors-to-navigate-collections-Cursoring.cgi

~~ 追記 ~~
2019/02/18
ご指摘いただいた内容に基づいて内容を修正しました。
新しい言語のチュートリアルをやるときの5つのTips

最近、Rustなど新しい言語を勉強する機会が多いのだが、いちいち言語を変えるたびに環境を作るのが面倒なので、楽にやる方法を工夫してみた。なお、環境はMacOS。

# エディタ

ま、ご自由に

# fswatch

チュートリアルは、コードを少し書き換えては実行コマンドを繰り返すので、保存するたびに実行コマンドが走ってくれると便利。

Macなら

```
brew install fswatch
```

でインストールし、

```
fswatch -o src/ | xargs -n1 -I{} cargo run
```

で実行するとsrc配下の変更があるたびに`cargo run`が実行される。

# bash + peco

historyに日付を入れると便利なので`bash_profile`に

```
export HISTTIMEFORMAT='%F %T ';
```

という一行を入れておく。

pecoは`history | peco`と打つと昨日にやったことを絞り込んで表示できる。

<img width="544" alt="スクリーンショット 2019-02-17 22.56.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/33389/199977fc-0be3-cae1-bd0a-eb26c79bffc1.png">


# today.sh

ソースコードに、こんな感じで２行目に参照するページ、３行目にfswatchのコマンドを書いておき、

```rs
/*
https://doc.rust-jp.rs/book/second-edition/ch05-03-method-syntax.html
fswatch -o src/ | xargs -n1 -I{} cargo run
*/

fn main(){
}
```

こんな感じで`today.sh`を実行すると、エディタが開き、2行目に書かれていたURLが開き、fswatchが起動される。

```sh
cd rust/book
atom src/main.rs
head -n 2 src/main.rs | tail -n 1 | xargs open
fswatch -o src/ | xargs -n1 -I{} cargo run
```

# alacritty

ターミナルもご自由に。最近はRust厨なのでAlacrittyを使ってる。
vue-chartjsで、ツールチップをカスタマイズ

#始めに
仕事で「vue-chartjs」を使用したのですが、グラフで表示するツールチップのカスタマイズ依頼がありました。
次のやり方で対応したので、備忘かねて投稿します。


#コード例（抜粋）

```javascript
    this.renderChart(
      {
        // valueの部分は置き換えてください。
        labels: this.$options.aaa,
        datasets: aaa
      },
      {
        responsive: true,
        maintainAspectRatio: true,
        tooltips: {
          enabled: true,
          callbacks:{
            label: function(tooltipItems, data) {
              const label = data.datasets[0].data;
              // ツールチップとして出力されるテキスト
              // 今回は％を追加してみました。
              const labelText = `${data.labels[tooltipItems.index]}:${label[tooltipItems.index]}%`;
              return labelText;
            }
          }
        }
      }
    );
```

#注意
- ツールチップの内容を全部書き直す事になります。（デフォルトに対して、一部追加変更できないので注意）
- callbackではなく「callbacks」（ちょっとはまりました。。）

# 参考にしたページ
https://qiita.com/fm0707/items/944c2f22184633859637
https://qiita.com/gorogoroyasu/items/77b03beca3a5e27716e3
https://github.com/apertureless/vue-chartjs/issues/173
https://tr.you84815.space/chartjs/configuration/tooltip.html
ExpoでfontqwesomeのIconを使うと、?マークが出てしまう。[個人メモ]

Expoのアイコンを使う時に少しハマったのでメモ

## Expoは以下のサイトに乗っているアイコンを組み込みで使えるらしい。
webでいうfontAwesomeみたいなものだね。
https://expo.github.io/vector-icons/

しかし、

```jsx
  <Ionicons name="check" size={32} color="green" />
```
と書くと、チェックマークの代わりに、？マークが表示されてしまう。


## 結論
Iconiumという種類のアイコンしか使えない模様。
上の問題はIconiumには、checkと言う名前のアイコンがないため起こった。

つまりfontAwesomeはそもそも使えなかった。
使えるようにするにはfontをloadしたりしないといけない？

手軽さがIconのウリで、セットアップが必要なら、png画像でいいので、私は当分
Ioniconsという種類のアイコンだけ使うことに決めた。


ただ、Ioniconsは全体的にとってもダサかった。
This is Expo !!!
Time型のデータの値を、時刻部分だけ表示する

# 問題：Time型のデータの表示に余計なものがくっついてくる
Time型のデータをRailsのビューで表示する時、そのままで呼び出してしまうと余計な年月日まで表示されてしまう。

↓2000-01-01 **07:00**（←ここだけ表示したい）:00 UTC となっている。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/348384/b52ef92c-4f66-3d9c-bfdb-4c5fa99e0add.png)


それを、↓のように時刻だけにしたい。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/348384/b637db0d-8c5f-81c9-26a9-47e9876c566a.png)

なお、データベースには以下のようなデータが保存されている。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/348384/0179ce78-8316-d4fa-1de9-5dda98d627d0.png)

# 解決方法
strftimeを用いて日付をフォーマットする。

```
# もともとのコード（抜粋）
"#{t.departure_time}発"

# 解決後のコード（抜粋）
"#{t.departure_time.strftime('%H:%M')}発"
```
%Hなどは表示したいものに合わせて変える。

参照：
http://railsdoc.com/references/strftime
クリップボード内のMarkdownをHTMLに変換して貼り付ける 

さてみなさま。クリップボードツールには何をお使いでしょうか。わたしはClipboard-Historyというツールを利用しています。ざっくり以下のような機能をサポートしているツールです。

* クリップボードの履歴取得・履歴からの貼り付け
* スタッククリップボード(連続コピー＆連続貼り付け)機能
* 定型文貼り付け機能
* 定型文への簡単な文字列処理組込み機能
* 定型文メニューからのスクリプト呼び出し機能←ここについて書きます

Config.txtというテキストファイルの記述によって、定型文メニューを生成、そこで選択した項目をクリップボードに貼り付けたり、メッセージダイアログとして表示したりと、色々出来るツールです。この種のソフトはいろいろありますが、作者さんも現在アクティブに活動されているツールのようでありがたく使用させて頂いております。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/14499/85c92425-e87d-c4e9-4392-365ef29e3138.png)

ということで、今回は定型文メニューからのスクリプト呼び出し機能を使って、クリップボードにコピーしたMarkdown記法をHTMLとして貼り付ける ということをやってみたので、今回簡単に書きます。

# 定型文メニューからのスクリプト呼び出し機能について

Clipboard-Historyの該当機能というのは、定型文メニュー用のコマンド、RunにPythonなどのスクリプトファイルのパスを指定することで、スクリプトに現在のクリップボードの中身を引き渡したり、その出力をそのまま現在アクティブなウィンドウに貼り付けたりすることができる というものです。

例えば以下のように書くと…。

```text:Config.txt
クリップボードのMarkdownをHTMLに変換	|| <#clip, #paste> || Run | ＜スクリプトファイルパス＞ | I O
```

標準入力にクリップボードの中のテキストを入れた状態でスクリプトファイルが起動し、処理結果を現在アクティブなウィンドウに貼り付けることができます。

# PythonでMarkdown形式テキストをHTMLに変換する

PythonでMarkdown形式テキストを扱う場合は、Markdownというそのままの名前のモジュールを使うのが便利です。

事前にpipでインストールしておきます。

```powershell:コマンド
> pip install markdown
```

そして、次のようなスクリプトを適当なフォルダに配置します。

```python:md.py
r"""
クリップボード内のMarkdownをHTMLに変換して貼り付ける。
markdownモジュールのインストールが必要
`pip install markdown`
# Clipboard-Historyで使う場合の例
クリップボードのMarkdownをHTMLに変換	|| <#clip, #paste> || Run | D:\Users\TakamiChie\AppData\Local\Packages\6432853C62D86.ClipboardHistory_mmq3pnrvshaxt\LocalCache\Roaming\ClipboardHistory\md.py | I O
"""
import sys
from markdown import Markdown
base = "\n".join(sys.stdin.readlines())
md = Markdown().convert(base)
print(md)
```

一応GithubのGistにもアップロードしています。

https://gist.github.com/TakamiChie/101e4ee6d3c5582e7b639bf4c444c94e

そして、作成したmd.pyを、Clipboard-Historyのコンフィグファイルから呼び出します。

※ なお、Clipboard-Historyのヘルプによると、「パスを相対パスとした場合、Config.txtからの相対パスとみなす」とのことですが、そのとおりConfig.txtと同じフォルダにmd.pyを置いてファイル名のみを記述しても、現行のClipboard-Historyではうまく動きませんでした。絶対パスでスクリプトファイルを指定する必要があります。

すると、大体以下のような感じ。Markdownを受け付けてくれないサイト等では役に立つかなと。

![2019-02-17_22h31_15.gif](https://qiita-image-store.s3.amazonaws.com/0/14499/0dcd7001-a7ec-5e2b-a3fc-73e7198ea234.gif)


Clipboard-History自体は、Python以外でも、インタプリタ系の言語であればなんでも受け付けるので、いろいろ応用はできると思います。
ただし、Clipboard-Historyは仮にスクリプトがエラーを発生しても(標準エラーに何か出力しても)それを捨ててしまうので、何かがあったときの対処はベットしておいた方が良さそうですね。
xerrorsパッケージがWrapメソッドではなく : %w でラップする理由

[Goの新しいerrors パッケージ xerrors(Go 1.13からは標準のerrorsパッケージに入る予定)](https://qiita.com/sonatard/items/9c9faf79ac03c20f4ae1) で紹介した通り、Goの新しいerrors パッケージではpkg/errors パッケージとは異なり`Wrap` メソッドではなく `: %w`でラップする仕様となっています。

```go
// pkg/errors
errors.Wrap(err, "message")
// xerrors
xerrors.Errorf("message: %w", err)
```

多くの方が違和感を持つと同時に `Wrap` メソッドではいけないのか？と疑問を持ったと思います。

この記事ではその理由を[Proposal: Go 2 Error Inspection](https://go.googlesource.com/proposal/+/master/design/29934-error-values.md)から考察します。

## `: %w` の理由
> - We included a Frame in the errors returned by errors.New and fmt.Errorf so that existing Go programs could reap the benefits of location information. We benchmarked the slowdown from fetching stack information and felt that it was tolerable.
- We changed the behavior of fmt.Errorf for the same reason: so existing Go programs could enjoy the new formatting behavior without modification. We decided against wrapping errors passed to fmt.Errorf by default, since doing so would effectively change the exposed surface of a package by revealing the types of the wrapped errors. Instead, we require that programmers opt in to wrapping by using the new formatting verb %w.

上記の文章から`errors.New` や `fmt.Errorf` に渡したerrorをデフォルトで今回の仕様変更に対応させたかったようです。
つまりGo 1.13からは `errors.New` や `fmt.Errorf` で作成したエラーにもコールスタックの情報を付与したかったということです。これらの関数を実行すると、`nowrapError` と `wrapError` のどちらかにラップされ、コールスタック情報を保持するようになります。

実際に比較してみたいと思います。

```go
err := fmt.Errorf("base error")
fmt.Printf("%+v", err)
```

もしフォーマットでラップする仕様にしなかった場合の出力結果

```
base error
```

フォーマットでラップする仕様にした場合の出力結果(Go 1.13以降)

```
base error:
    main.main
        /Users/sonatard/tmp/xerrors/main.go:13
```

## まとめ

xerrorsパッケージがWrapメソッドではなく `: %w` でラップする理由は、インターフェースの下位互換は保ちつつ、コールスタックの情報をerrorに付与したかった。ベンチマークをとった結果としてはパフォーマンスの問題はなかった。

## プロポーザル提案者のコメント
- https://github.com/golang/go/issues/29934#issuecomment-464201672
- https://github.com/golang/go/issues/29934#issuecomment-464208038

## 関連情報
- [xerrors - 関連情報](https://qiita.com/sonatard/items/802db82e7275f17fe702)
【Pyxel】VSCodeでデバッグ実行すると pyxel.image().load() で読み込みに失敗する時の対処方法

Pyxelから　VSCodeで「デバッグ実行」すると以下のようなエラーが出て、画像の読み込みに失敗するようです。(通常のタスク実行であれば実行可能）

```
例外が発生しました: FileNotFoundError
[Errno 2] No such file or directory: '/Users/syun/.vscode/extensions/ms-python.python-2019.1.0/pythonFiles/cat.png'
  File "/usr/local/lib/python3.7/site-packages/PIL/Image.py", line 2634, in open
    fp = builtins.open(filename, "rb")
  File "/usr/local/lib/python3.7/site-packages/pyxel/image.py", line 47, in load
    pil_image = PIL.Image.open(filename).convert("RGB")
  File "/Users/syun/Desktop/py_click/main.py", line 50, in __init__
    pyxel.image(0).load(0, 0, "cat.png") # 画像読み込み
```

どうも読み込もうとしている画像のパスが、VSCodeのプラグインのパスを見ている様子……。
調べたところ、同じように悩んでいる人を発見。

・VSCode内であるPythonプログラムが実行できず、エラーが発生する
https://teratail.com/questions/162688

以下のような回答を発見
> pyxel.image(0).load 内で、カレントディレクトリではなく、スタックからディレクトリを取得しているようですね。  
> 
> def load(self, x, y, filename):
> dirname = os.path.dirname(inspect.stack()[-1].filename)
> filename = os.path.join(dirname, filename)
> 
> ここを参照してください。
> https://github.com/kitao/pyxel/blob/master/pyxel/image.py

どうやら、Pyxelが `inspect.stack` を使っていることが原因のようです。

GitHub の Pyxel の Issue を見たところ、すでに報告されていた
・[Jupyter Notebook] Cannot load img with relative path #105
https://github.com/kitao/pyxel/issues/105

こちらによると、絶対パスで画像ロードすればできるけど……、と書いてあったので、該当のコードを絶対パスに修正

``` python:main.py
# pyxel.image(0).load(0, 0, "cat.png") # 画像読み込み
# 絶対パスで読み込み
pyxel.image(0).load(0, 0, "/Users/syun/Desktop/py_click/cat.png")
```

ひとまずこれで動きました。
バグフィックスされるまでは、 load() を直接使わずに絶対パスで読みこむ関数でラップした方が良さそうな感じです。
（もしくは VSCode の設定で回避できるかもしれない……）
OSSを読む - flask編-

# 目次

1. OSS読めば幸せになれるか
2. flaskってなんだろう
3. どこを見よう
4. なんでこういう実装なんだろう
5. 結局僕たちはどうすればいいんだろう

---

# 1. OSS読めば幸せになれるか

+ 世界中の人が利用、開発するソフトのコード = たぶん良いコード
+ 個人開発 -> 自由にかけちゃう -> 発散、そして崩壊
+ 「愚者は経験に学び、賢者は歴史に学ぶ」
    + 歴史 = 他者の経験

---

# 2. flaskってなんだろう

+ pythonの軽量webフレームワーク
+ OSSの中では比較的シンプルな構成
    + 比較的に読みやすいはず

https://github.com/pallets/flask

---

# 3. どこを見よう

+ OSSとして公開するために必要なものはチラッと見る
    + ドキュメント、メタデータなど
+ 主要なのは"flask"ディレクトリだけ
    + それでもガッツリ見るのは大変
    + よく使うものは注視する

---

# 4. なんでこういう実装なんだろう

---

+ `__init__.py, __main__.py`
    + どのスクリプトでも使うとこはここでまとめてやる
+ `_compat.py`
    + 2,3系、どちらでも使えるようにしてる

---

`app.py`

+ アプリクラスを作るとこ（一番重要）
+ 各関数にコメント -> sphinxでドキュメントに
+ デコレータ利用
    + 標準 (property, staticmethod)
    + 作成 (setupmethod)
+ ドキュメント部が多いがコード量は少ない
    + 結局werkzeugのrun_simpleでサーバ起動

---

`cli.py`

+ コマンドライン用
+ やっぱclick便利なんすね

`templateing.py`

+ 似た処理の関数は共通部分を切り出す
    + 外部参照しない抽象化した関数を使う

---

`wrapper.py`

+ Response, Requestクラス
    + Mixinクラスを継承
    + 必要最小限のpropertyだけ

---

+ かなりコード量は少ない
+ 標準、外部パッケージを有効利用
+ WSGI : Web Server Gateway Interface
    + python公式
+ Werkzeug : WSGIのutilityライブラリ
+ Jinja : テンプレートエンジン
    + HTMLにpythonの結果埋め込むやつ

---

pallets projectsはすごい
https://palletsprojects.com/
![alt](https://palletsprojects.com/logo-large.png)

---

# 5. 結局僕たちはどうすればいいんだろう

---

# 分からない、俺達は雰囲気でコードを書いている

---

俺はpythonの標準機能使えてるだろうか

+ except, raise, finally
+ `*args`, `**kwargs`
+ ENV
+ itertools, functools
+ decorator

---

+ ドキュメントを読もう
    + 細かい仕様分からなくなったらコードを見よう
    + ドキュメント無い、間違ってることはよくある、コードは嘘つかない
+ outputすると無知度合いに気づく
    + 発表する -> 分からない -> 調べる -> チョットワカル
    + 質問される -> 死 -> 調べる -> チョットワカル
launchの起動を遅延させる"timed_roslaunch"がaptに対応！

小生が開発した題記「timed_roslaunch」を`ROS Buildfarm`に追加し、`apt`で取得できるようにしました。

# 「timed_roslaunch」について

## 小生ブログでのまとめ
- [【ROS】launch ファイルの起動を遅延させる"timed_roslaunch"のご紹介](http://www.moriken254.com/entry/2019/02/17/213433)

## Qiita での過去エントリ
- [launchファイルを指定時間sleep後に起動する "timed_roslaunch"](https://qiita.com/MoriKen/items/a1f29f5637732ac18a1c)

- [launchの起動を遅延させる"timed_roslaunch"が使いやすくなりました](https://qiita.com/MoriKen/items/26a92ef834c3e054e34d)

# インストールコマンド
現状は`kinetic`のみですが、追って他のディストリビューションでも対応できるようにする予定です。

## コマンドライン
本題です。下記コマンドでインストール可能です。

```sh
sudo apt install ros-kinetic-timed-roslaunch
```

## rosdep

rosdep で依存関係を解決したい場合は、package.xml で下記のタグを追加下さい。

```xml
  <exec_depend>timded_roslaunch</exec_depend>
```

# 使用例
拙著「[実用ロボット開発のためのROSプログラミング](http://af.moshimo.com/af/c/click?a_id=724749&p_id=170&pc_id=185&pl_id=4062&s_v=b5Rz2P0601xu&url=http%3A%2F%2Fwww.amazon.co.jp%2Fexec%2Fobidos%2FASIN%2F462767581X)」のサンプルコードで、package.xml に上記タグを追加しています。よろしければご参照下さい。
　↓
https://github.com/Nishida-Lab/rosbook_pkgs/blob/master/chapter10/smach_sample/package.xml#L26

[![rosbook](https://qiita-image-store.s3.amazonaws.com/0/110138/39079efa-f6c4-9130-4519-0ecdf0024f9b.png)](http://af.moshimo.com/af/c/click?a_id=724749&p_id=170&pc_id=185&pl_id=4062&s_v=b5Rz2P0601xu&url=http%3A%2F%2Fwww.amazon.co.jp%2Fexec%2Fobidos%2FASIN%2F462767581X)
Anaconda 環境で、ダウングレードしてしまったパッケージをもとに戻す

# はじめに
簡単な方法で元のバージョンに戻すことができます．
だからぜひ``いいね``してください．
結論だけさっさと知りたい方は，下記の**穢土転生の術**まで読み飛ばしてください．

# 悲しい出来事（この記事を書くきっかけになった出来事）
## 前置き
趣味で作成している`Python`のライブラリがあるのですが，そのライブラリのプロファイリングをしようとしたときの話です.

[こちら](https://qiita.com/hoto17296/items/d5e238d5e7d931bd24d7)の記事にも書いてあるとおり，`cProfileV` という便利なものがあるそうです．
記事内では`pip`コマンドでインストールするように書かれていましたが，`Anaconda`環境なので、`Anaconda`用に配布されてないかな〜と思ったところ，[ありました](https://anaconda.org/indico/cprofilev)．

## インストール
以下，ログの一部です

```
The following packages will be UPDATED:

  ca-certificates    conda-forge::ca-certificates-2018.11.~ --> pkgs/main::ca-certificates-2019.1.23-0
  pkginfo                                      1.4.2-py37_1 --> 1.5.0.1-py27_0
  setuptools                                  40.6.3-py37_0 --> 40.7.3-py27_0
  tqdm               pkgs/main/linux-64::tqdm-4.28.1-py37h~ --> pkgs/main/noarch::tqdm-4.29.1-py_0

The following packages will be SUPERSEDED by a higher-priority channel:

  certifi            conda-forge::certifi-2018.11.29-py37_~ --> pkgs/main::certifi-2018.11.29-py27_0
  pip                            pkgs/main::pip-18.1-py37_0 --> pkgs/free::pip-7.1.0-py27_0
  requests                pkgs/main::requests-2.21.0-py37_0 --> pkgs/free::requests-2.14.2-py27_0

The following packages will be DOWNGRADED:

  backports                                      1.0-py37_1 --> 1.0-py27_1
  backports.shutil_~                           1.0.0-py37_2 --> 1.0.0-py27_2
  python                                   3.7.1-h0371630_7 --> 2.7.15-h9bab390_6


Proceed ([y]/n)? y
```
思いっきり`y`と押してますが、<font color="red">**Python2.7 までダウングレードしています**</font>．
押してから気づきました（妙に時間がかかると思ったわけです...）

コンソールも悲しみですね...

```
$ python
Python 2.7.15 |Anaconda, Inc.| (default, Dec 14 2018, 19:04:19)
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

# 穢土転生の術
## Step1. 過去の環境でのバージョンを確認
下記のコマンドで，過去に自分が**どのパッケージ**の**どのバージョン**を利用していたか，確認できます．

```
$ conda list --revisions
〜〜〜〜〜〜〜〜省略〜〜〜〜〜〜〜〜
2019-02-06 21:40:33  (rev 2)
    +deap-1.2.2 (conda-forge)

2019-02-17 20:52:26  (rev 3)
     backports  {1.0 -> 1.0}
     backports.shutil_get_terminal_size  {1.0.0 -> 1.0.0}
     ca-certificates  {2018.11.29 (conda-forge) -> 2019.1.23}
     certifi  {2018.11.29 (conda-forge) -> 2018.11.29}
     pip  {18.1 -> 7.1.0}
     pkginfo  {1.4.2 -> 1.5.0.1}
     python  {3.7.1 -> 2.7.15}
     requests  {2.21.0 -> 2.14.2}
     setuptools  {40.6.3 -> 40.7.3}
     tqdm  {4.28.1 -> 4.29.1}
〜〜〜〜〜〜〜〜省略〜〜〜〜〜〜〜〜
```
読み方ですが，`rev2`がさっきまで使ってたやつ，`rev3`がやっちまったあとのバージョンです．
(`Python本体`以外にも、悲しいダウングレード攻撃の餌食になっているパッケージがが多々いますね...)

## Step2. 蘇らせる
```
$ conda install --revision [revision number]
```
これだけです．

今回の場合だと、

```
$ conda install --revision 2
```
ですね！

`conda-forge`からのインストールが含まれている場合には、

```
$ conda install --revision 2 -c conda-forge
```
を代わりに実行しましょう．

## 生存確認

```
$ python
Python 3.7.1 (default, Dec 14 2018, 19:28:38)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
```
自分のような愚か者のために，こんな簡単なコマンド１つで戻せるなんて！
やっぱ``Anaconda``は神．
Nodeからfont-awasomeを使ってみる


chrome拡張で後から読み込みで使った。
svgを吐き出すこともできたが、cdnをpathに設定して`icon().html`をつかうのを主に採用しそう。

## 公式

font-awesome - npm
https://www.npmjs.com/package/font-awesome

Sass | Font Awesome
https://fontawesome.com/how-to-use/on-the-web/using-with/sass

Configuration | Font Awesome
https://fontawesome.com/how-to-use/with-the-api/setup/configuration

icon() | Font Awesome
https://fontawesome.com/how-to-use/with-the-api/methods/icon

## mixinでつかう

gulp-ruby-sassでfont-awesomeをコンパイルしたら文字化けした件 - Qiita
https://qiita.com/nekoneko-wanwan/items/e0f5a71a7d603215bcc3

	今回は起きなかったけど、pathの変数設定がよくわからず、
	ブラウザには豆腐が出たので、cssを確認しながら考えた

## 事例

Font Awesome 5 の導入 - Qiita
https://qiita.com/oreo3@github/items/08a350520a1f0eaf6e42

## CDN

Start | Font Awesome
https://fontawesome.com/start

このCDNを使った。
`$fa-font-path: "https://use.fontawesome.com/releases/v5.7.2/webfonts";`
複数値を許可した参照列はグルーピングのキー列として使えない

小ネタです。

## 発生した現象
複数値を許可した参照列をグルーピングのキー列に指定すると、ビュー上で同じアイテムが複数行表示されるなど表示に異常が発生する。

## 現象の再現手順
1. 参照列（複数値NG）を作成する
2. リストにアイテムを登録する
3. 参照列（複数値NG）をグルーピングのキー列に指定する
4. 参照列の設定を 複数値NG から 複数値 OK に変更する
5. アイテムを編集して、参照列（複数値OK）に値を複数設定する

グルーピングのキー列を指定する設定画面に 複数値OKの参照列 は表示されません。
ですが、複数値NGの参照列をキー列に指定してから、列の設定を変えて複数値OKにすることができてしまいます。

## 結論
おそらく、参照列のバグ。（Microsoftには未確認）
複数値を許可した参照列はグルーピングのキー列として使えない仕様。
けれど、設定手順によってキー列に指定できてしまう。この手順で設定したビューは表示がおかしくなる。
php-master-changes 2019-02-16

今日は com_dotnet の typelib 経由での定数定義まわりの修正、Preloading の改善、run-tests.php 並列実行のための準備とインデント整理があった！

# 2019-02-16
## cmb69: Deprecate marking typelibs to load constants case-insensitively
- https://github.com/php/php-src/commit/0520eb8772280be6469200e37f6e3f25a9c4ff96
- [7.4~]
- ext/com_dotnet で、[昨日](https://qiita.com/sj-i/items/17eb3aa8f1c34dce4c38#cmb69-deprecate-case-insensitive-constants-via-typelib-import)やった typelib インポート経由での case-insensitive 定数非推奨化の残りに対応

## nikic: Fix preload auto globals handling
- https://github.com/php/php-src/commit/a9497cecf3a76b3264ed0807023cd59e9bcf6f23
- [7.4~]
- ext/opcache で、Preloading での `$_GLOBALS` の扱いを修正

## nikic: Handle bailouts during preload linking
- https://github.com/php/php-src/commit/92fae00ee0674c7fef830b01aa474d8bc684bf74
- ext/opcache で、Preloading のリンク処理でのエラー処理に対応

## nikic: Set filename & lineno information for preload inheritance error
- https://github.com/php/php-src/commit/1b31b45f6f731fda7586cbcfd710477f21d85b8c
- ext/opcache で、Preloading のリンク処理中に継承エラーが起きた際にエラー発生箇所のファイル名/行番号をエラー情報へ載せられるよう修正

## nikic: Don't assume that all includes have been executed
- https://github.com/php/php-src/commit/970dcd240f4ecd3e19a12f940aa85bbc29c3f146
- [7.4~]
- ext/opcache で、Preloading の際に実行されない include を考慮するよう処理を修正

## nikic: Link anonymous classes during preloading
- https://github.com/php/php-src/commit/e15d657c1a8a4861a6b617398c7d34a6b3983480
- [7.4~]
- ext/opcache で、無名クラスのリンク処理を Preloading の最中に行えるよう修正

## cmb69: Fix [#77626](https://bugs.php.net/bug.php?id=77626): Persistence confusion in php_com_import_typelib()
- https://github.com/php/php-src/commit/767fa3dc02f39b64015539d9948874947cf20d5d
- [7.3~]
- ext/com_dotnet で、typelib インポート経由で定義される定数が persistent な値として扱われていなかった問題の修正

## hikari-no-yume: run-tests.php: move all top-level code into a function
- https://github.com/php/php-src/commit/41fbeb6c5655ab40df409a46c64664881ceffaab
- [7.4~]
- テストを並列実行するための準備としてトップレベルのコードを関数内へ移動

## hikari-no-yume: run-tests.php: fix all tab-space indentation inconsistency
- https://github.com/php/php-src/commit/6662fb5c8fabb1611baf852d1b62a956103bd56d
- [7.4~]
- インデントのタブ / スペースを揃えた
UWSCで環境変数を読み書き、永続変数的な使い道も

#コード

```uwsc:envval.uws
print GetEnv("SystemRoot")      //環境変数"SystemRoot"を取得、多分"C:\WINDOWS"
print GetEnv("CUSTOM1")         //環境変数"CUSTOM1"値を取得、
                                // 実行1回目は存在しないので空、二回目は前回保持されたGETTIME値
SetEnv("CUSTOM1", GETTIME() )   //GETTIME値を環境変数"CUSTOM1"にセットする
doscmd("cmd /k echo !%CUSTOM1%!",false,true) //子プロセスに引き継がれる

//環境変数を取得
function GetEnv(name)
	DEF_DLL GetEnvironmentVariableA(string, var string, long ): long: Kernel32.dll

	result = empty
	len = GetEnvironmentVariableA(""+name,int(0),0) //必要バッファ長さ
	if len > 0
		buf = "                                                                 "//64文字
		for i=0 to int(power(len,-2))-6
			buf = buf + buf
		next
		len = GetEnvironmentVariableA(""+name,buf,len)
		result = COPY(buf,0,len)
	endif
fend

//環境変数をセット
function SetEnv(name,value)
	DEF_DLL SetEnvironmentVariableA(string, string): long: Kernel32.dll
	result = SetEnvironmentVariableA(""+name,""+value)
fend


```

#応用
SETした場合、**UWSCのプロセスが終了しない限り**環境変数が保持されるはず。
このため、ランチメニューからスクリプトを起動するのであればPHPの$_SESSION変数のような感覚で利用できるかも。
スクリプトが終了しても消えない変数としての利用や、スクリプト間で環境変数を共有するなどの使いみちが考えられる。

#補足
- 環境変数セットの影響があるのはスクリプトを動かしたUWSCのプロセス、またはこれから起動されたサブプロセスのみ。システム環境変数はこの方法で変えることは出来ない。
多項式オーダーと指数オーダーの間のオーダーは存在するか？

# 要約
存在する。たとえば、$x^{\log{x}}$がその例である。

# 概要
$x \to \infty$において、どんな多項式よりも爆発性が強く、どんな指数関数よりも爆発性が弱いような関数は存在するのか疑問に思った。
google検索してもすぐにはヒットしなかったので、メモしておく。

# 証明
$x \to \infty$において、
$$\forall a, a\log x \ll (\log x)(\log x) \ll (\log a)x$$
という関係が成立していて、これらを$\rm e$の肩に乗せれば、次が成立する。
$$\forall a,   x^a \ll x^{\log x} \ll a^x$$
よって、$x^{\log x}$はどんな多項式よりも爆発性が強く、どんな指数関数よりも爆発性が弱い。
(Q.E.D.)
CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'. への対処法

とあるパッケージをインストールしようとGitHubのREADME.mdのとおりに実行したところ、
以下のエラーに遭遇しました。

```sh
$ ./install.sh

CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
To initialize your shell, run

    $ conda init <SHELL_NAME>

Currently supported shells are:
  - bash
  - fish
  - tcsh
  - xonsh
  - zsh
  - powershell

See 'conda init --help' for more information and options.

IMPORTANT: You may need to close and restart your shell after running 'conda init'.
```

中身を見てみると、

```sh:install.sh
# ~~~~~~~~~~~~
conda create --name XXXXXX python=3.6 -y
conda activate XXXXXX 
# ~~~~~~~~~~~~
```
の`conda activate`でエラーが出ているようです。

エラーメッセージによれば`conda init`をすれば良い、とのなので、
Anacondaをインストールするときに~/.bashrcに書き込まれる
以下のコードを`install.sh`に挿入するとうまく動くようになりました。

```sh:install_modified.sh
# ~~~~~~~~~~~~
# >>> conda init >>>
__conda_setup="$(CONDA_REPORT_ERRORS=false '$HOME/anaconda3/bin/conda' shell.bash hook 2> /dev/null)"
if [ $? -eq 0 ]; then
    \eval "$__conda_setup"
else
    if [ -f "$HOME/anaconda3/etc/profile.d/conda.sh" ]; then
        . "$HOME/anaconda3/etc/profile.d/conda.sh"
        CONDA_CHANGEPS1=false conda activate base
    else
        \export PATH="$PATH:$HOME/anaconda3/bin"
    fi
fi
unset __conda_setup
# <<< conda init <<<

# ~~~~~~~~~~~~
conda create --name XXXXXX python=3.6 -y
conda activate XXXXXX 
# ~~~~~~~~~~~~

```

もし同じエラーが起きたときにご参考になれば幸いです。
batメモ自分用

```replaceOneWord.bat
@echo off
cd /d %~dp0

:INIT
if "%4"=="" (
 goto ERROR
)

set src_filename=%1
set dst_filename=%2
set before_str=%3
set after_str=%4

:MAIN
setlocal enabledelayedexpansion
type nul>%dst_filename%
for /f "tokens=1* delims=: eol=" %%a in ('findstr /n "^" %src_filename%') do (
 set line=%%b
 if not "!line!" == "" (
  set line=!line:%before_str%=%after_str%!
 )
 (echo.!line!)>>%dst_filename%
)
endlocal

:END
exit /b 0

:ERROR
echo usage: %~n0%~x0 src_filename dst_filename before_str after_str
goto END
```
```replaceWords.bat
@echo off
cd /d %~dp0

:INIT
if "%2"=="" (
 goto ERROR
)

if exist settings.ini (
 set set_filename=settings.ini
) else (
 goto ERROR
)

set src_filename=%1
set dst_filename=%2
set tmp_filename=tmpfile
:MAIN
type nul>%tmp_filename%
copy %src_filename% %dst_filename% > nul
setlocal enabledelayedexpansion
for /f "tokens=1,* delims==" %%a in (%set_filename%) do (
 set src_str=%%a
 set dst_str=%%b
 copy %dst_filename% %tmp_filename% > nul
 call replaceOneWord.bat %tmp_filename% %dst_filename% !src_str! !dst_str!
)
endlocal
:END
del /Q %tmp_filename%
exit /b 0

:ERROR
echo 使用方法: %~n0%~x0 src_filename dst_filename
echo 注意: settings.iniをbatと同じディレクトリに配置してください
goto END
```
Gulp4 コピペで使えるコード

Gulp使おうかと思った時には、いつもテンプレ使うのでいつまでたっても覚えられません。
ということでテンプレ置いておきます。

## 仕様
- 生成されたURLは、セーブした瞬間自動で(少しだけ遅れて)反映されます。
- 当然SASSやSCSSは全部セーブした瞬間コンパイルです。(sassの場合はgulpfile.jsのscssのディレクトリを変更してください。)
- またcssのディレクトリは自分で作らなくても自動で作成されます。
- scssのファイルを増やしてしまうと、一度コマンドを停止してもう一度実行する必要があるかも

## テンプレート
```js:gulpfile.js
const gulp = require('gulp');
const sass = require('gulp-sass');
const plumber = require('gulp-plumber');
const autoprefixer = require('gulp-autoprefixer');
const webserver = require('gulp-webserver');

gulp.task('scss', () => {
  return gulp.watch('./scss/*.scss', () => {
    return gulp.src('./scss/*.scss')
      .pipe(plumber())
      .pipe(sass({ outputStyle: 'compressed' })) // 通常:expanded, 圧縮:compressed
      .pipe(autoprefixer())
      .pipe(gulp.dest('./css'));
  });
});

gulp.task('webserver', () => {
  return gulp.src('./')
    .pipe(webserver({
      host: 'localhost',
      port: 8080,
      livereload: true
    }))
});

gulp.task('default',
  gulp.series(
    gulp.parallel('scss', 'webserver'),
  )
);
```

## How To Use
```bash:bash
$ mkdir myproject && cd myproject
$ touch gulpfile.js
$ yarn add -D gulp gulp-sass gulp-plumber gulp-autoprefixer gulp-webserver
$ npx gulp
```

## 感想
興味ある人は、やってみるとどうでしょうか。
scssのファイルにindex.scssを置いてその下にmoduleやcomponentsって名前のディレクトリを用意してimportして使ってます。

必要なモジュールやコンポーネントだけをindex.scssに入れることでcommonなどのディレクトリをつくってわざわざ共有するよりいいと思います。

より便利な環境でハッピーなプログラミングライフを‪(๑˃̵ᴗ˂̵)‬♪
opencv.jsの作法

# 概要

opencv.jsの作法を調べてみた。

# 実行環境

sandboxを用意した。以下のコードは動く。
https://s.codepen.io/ohisama/debug/VgVgQV/bYAdyeDvYGYk


# 画像を読み込む

canvasタグとimgタグを読み込む。
cv.Matクラスで読み込む。
プロパティは、rows,cols,matSize,step,dataを持つ。

```javascript
	let src = cv.imread('canvasInput');
	let dst = new cv.Mat();
	cv.cvtColor(src, dst, cv.COLOR_RGBA2RGB);
	alert(dst.rows);
	alert(dst.cols);
	alert(dst.matSize);
	alert(dst.step);
	cv.imshow('canvasOutput', dst);
	src.delete();
	dst.delete();
```

# 画像を表示
canvasタグに、書き込む。

```javascript
    cv.imshow('canvasOutput', dst);
```

# 画像を生成する。

```javascript
 	let color = new cv.Scalar(0, 0, 255);
	let dst = new cv.Mat(256, 256, cv.CV_8UC3, color);
	cv.imshow('canvasOutput', dst);
	dst.delete();

```

# 線を引く

```javascript
	let color = new cv.Scalar(255, 255, 255);
	let lcolor = new cv.Scalar(0, 0, 255);
	let start = new cv.Point(0, 0);
	let end = new cv.Point(200, 200);
	let dst = new cv.Mat(256, 256, cv.CV_8UC3, color);
	cv.line(dst, start, end, lcolor, 2, cv.LINE_AA, 0);
	cv.imshow('canvasOutput', dst);
	dst.delete();
```

# 四角で塗りつぶす

```javascript
	let color = new cv.Scalar(255, 255, 255);
	let lcolor = new cv.Scalar(0, 0, 255);
	let p1 = new cv.Point(10, 10);
	let p2 = new cv.Point(200, 200);
	let dst = new cv.Mat(256, 256, cv.CV_8UC3, color);
	cv.rectangle(dst, p1, p2, lcolor, cv.FILLED);
	cv.imshow('canvasOutput', dst);
	dst.delete();
```

# 円を塗る

```javascript
	let color = new cv.Scalar(255, 255, 255);
	let lcolor = new cv.Scalar(255, 0, 0);
	let p1 = new cv.Point(128, 128);
	let dst = new cv.Mat(256, 256, cv.CV_8UC3, color);
	cv.circle(dst, p1, 80, lcolor, cv.FILLED);
	cv.imshow('canvasOutput', dst);
	dst.delete();
```


以上
DynamoDBのオートスケーリングを実験してみた

ちょうど5分ごとにスケールアップしていった。
負荷が止まって20分後にスケールダウンした。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/79394/92474055-bcfd-c934-1409-74abfae00bb7.png)


```
5
37
53
76
109
156
225
```

と上がっていった。


# 実験方法

テーブルの設定は初期設定のまま。最小キャパシティ5で、70%でスケールアップする設定。

https://github.com/aoyama-val/dynamo_sample/tree/master/ldjson2dynamodb

をつかって

```
# データを無限に生成してインポートし続ける
ruby generate_ldjson.rb | ruby ldjson2dynamodb.rb aoyama4 /dev/stdin
```

という感じで動かしてみた。
RailsのScaffoldを使わないでアプリケーションを作成してみた。No.2

<h1>はじめに</h1>

自分用備忘録
Scaffoldを使わずにアプリケーションを作成してみる　No.2
[RailsのScaffoldを使わないでアプリケーションを作成してみた。No.1](https://qiita.com/sayu33/items/ff54f3d1239113cf920e)
No.1で作成した記事に続き、掲示板を作成します


<h3>モデルクラスの作成</h3>
掲示板を作成するためにモデルクラスを作成

```:
$ rails generate model message name:string email:string title:string body:text image:string password:string
```
マイグレーションファイルの実行

```:
$ rake db:migrate
```

<h4>テストデータの準備</h4>

test/fixtures/テーブル名
新しくフォルダとフォルダ内にmessages.ymlを作成

```test/fixtures/messages.yml
yml:
no.1:
  name: 佐藤
  email: sato@test.com
  title: おはようございます！
  body: 本日もよろしくお願いします。
  image: test/imges1.gif
  password: sato
no.2:
  name: 鈴木
  email: suzuki@test.com
  title: こんにちは！
  body: 進捗はどうですか？
  image: test/images2.gif
  password: suzuki
```
作成後、以下のコマンドを実行するとmessages（テーブル名）にデータが展開されます

```:
$ rake db:fixtures:load FIXTURES=messages
```

データベースクライアントを起動して、データが反映されたか確認

```:
$ rails dbconsole
```

```:
=# \d messages
```
messages　テーブルの一覧が確認出来たら、データベースクライアントを閉じる

```:
=# \q
```


<h4>indexファイルを書き換え</h4>

message(テーブル名)の内容を表示するために書き換える

app/controllers/messages_controller.rb

```app/controllers/messages_controller.rb:
class MessagesController < ApplicationController
  def index
    @messages = Message.all 
  end
end
```
app/views/messages/index.html.erb

```erb:app/views/messages/index.html.erb
<table>

<h1>index</h1>
<tr>
<th>NAME</th><th>MAIL</th><th>タイトル</th>       <th>TEXT</th><th>IMAGE</th><th>編集/削除キー</th>
</tr>


<% @messages.each do |message| %>

<tr>
<td><%= message.name %></td>
<td><%= message.email %></td>
<td><%= message.title %></td>
<td><%= message.body %></td>
<td><%= message.image %></td>
<td><%= message.password %></td>
</tr>
<% end %>
</table>
```


ブラウザで確認
http://IPアドレス:3000/messages
にアクセスして、テーブルの内容が表示されたら完成

<h2>まとめ</h2>

実際にScaffoldなしで作ってみると動きが把握できて勉強になりました
RailsのScaffoldを使わないでアプリケーションを作成してみた。No.1


<h1>はじめに</h1>

Ruby on Railsを学び始めた時、自動で色々作成してくれるScaffoldの便利さに感動したけれど、
どういう動作をしているのか分からないので、Scaffoldを使わずにアプリケーションを作成してみる
自分用備忘録

初学者なので、気になる点がありましたらご指摘いただけますと嬉しいです

<h2>環境</h2>
 Linux(Ubuntu)
 Ruby 2.5.1p57
 Rails 5.2.2
 PostgreSQL

<h3>アプリケーションの土台を作る</h3>

ディレクトリ名はgreetingで作成

```:
$ rails new greeting -d postgresql
```

```:
$ cd greeting
```

<h4>データベースの設定</h4>

postgresqlを起動を起動

```:
$  sudo service postgresql start
```

```:
$ rake db:create
```


<h4>動作確認</h4>

http://IPアドレス:3000 にアクセス

```:
$ rails s
```



<h4>コントローラークラスの作成</h4>

コントローラー名はmessagesで作成

```:
$ rails generate controller Messages
```
app/controllers/messages_controller.rbを編集

```app/controllers/messages_controller.rb
class MessagesController < ApplicationController
  def index
    @msg = 'こんにちは！'
  end
end
```

<h4>テンプレートファイルの作成</h4>

app/views/messages/の中にindex.html.erb　ファイルを作成

```app/views/messages/index.html.erb:
<%= @msg %>
```
<h4>ルーティングの設定</h4>

config/routes.rb

```config/routes.rb:
  resources :messages
```


ブラウザで確認

http://IPアドレス:3000/messages

にアクセスして、「こんにちは！」と表示されたら成功


<h2>まとめ</h2>

No.2で、モデルを作成してindexファイルを書き換えて掲示板を作成します。

[RailsのScaffoldを使わないでアプリケーションを作成してみた。No.2](https://qiita.com/sayu33/items/e291dc601ac25708aad9)
Rails Vue POST: 422 Unprocessable Entity 

🐱:メモ

```diff
import Vue from 'vue'
import axios from 'axios'
+ axios.defaults.headers.common = {
+     'X-Requested-With': 'XMLHttpRequest',
+     'X-CSRF-TOKEN' : document.querySelector('meta[name="csrf-token"]').getAttribute('content')
+ };
```
Travis CI で docker-compose を動かす

### 前提条件

・動作させるdocker-compose.ymlを作成済み（versionは2までしか対応してない?）  



###  .travis.yml の作成



Travis CI で docker-compose（追加パッケージも）を動作させる場合、[公式が公開している方法](https://docs.travis-ci.com/user/docker/#using-docker-compose)に従い、before_install セクションを用意してインストール、権限付与等を行う。

```yaml

services:
  - docker

env:
  - DOCKER_COMPOSE_VERSION: 1.8.0

before_install:
  - sudo rm /usr/local/bin/docker-compose
  - curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > docker-compose
  - chmod +x docker-compose
  - sudo mv docker-compose /usr/local/bin
  - docker-compose up -d
```



Travis CIでビルドが正常に完了するかを確認する場合は、上記の設定のみでOK。
複数のdockerを使用した結合テストを実行する場合、scriptセクションを使用することでテストできる。

```yaml
# 例
script:
  - docker-compose exec {コンテナ名} ./test/run-test.sh
```



全体をまとめると、以下のようになる。scriptセクションは適宜変更する。

```yaml

services:
  - docker

env:
  - DOCKER_COMPOSE_VERSION: 1.8.0

before_install:
  - sudo rm /usr/local/bin/docker-compose
  - curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > docker-compose
  - chmod +x docker-compose
  - sudo mv docker-compose /usr/local/bin
  - docker-compose up -d

script:
  - docker-compose exec {コンテナ名} ./test/run-test.sh

```
cx_OracleでOracleのXMLTYPEを操作する

# cx_OracleでOracleのXMLTYPEを操作する

## 環境
* python：3.7.1
* cx_Oracle：7.0.0

## XMLデータ
今回利用するXMLは郵便番号のデータとしました。
日本郵便のサイトからダウンロードできるデータはcsvのみでしたので、
http://blog.majide.com/2009/03/jp-post-zipcode-xml/
のサイトのデータを利用しました。

```
<JapanAreaData>
  <Prefecture>
    <City>
      <Area>
        <AreaKana>コウキョガイエン</AreaKana>
        <AreaName>皇居外苑</AreaName>
        <ZipCode>1000002</ZipCode>
      </Area>
      <Area>
      ・・・
      </Area>
      <CityName>千代田区</CityName>
      <CityNameKana>チヨダク</CityNameKana>
    </City>
    <City>
    ・・・
    </City>
    <PrefectureKana>トウキョウト</PrefectureKana>
    <PrefectureName>東京都</PrefectureName>
  </Prefecture>
</JapanAreaData>
```

## OracleのXMLTYPEについて

XMLTYPEはその名の通り、XMLデータを保持する型となります。
XMLのみを保持するCLOB型と考えればわかりやすいでしょうか。
また、XPath式を使用してXMLデータを操作できるため、XMLと非常に相性の良いという特徴を持ちます。



## cx_OracleでのXMLTYPEについて

今回扱うデータはXMLと非常にサイズが大きいため、Insertする際はバインド変数を使用する必要があります。
cx_Oracleでバインド変数を使用する際は、カーソルのCursor.setinputsizesでサイズを指定（拡張）する必要があります。
これを指定しない場合、「cx_Oracle.DatabaseError: ORA-01461: LONG値はLONG列にのみバインドできます。」が発生します。
今回はXMLTYPEですので、サイズはcx_Oracle.CLOBを指定します。

```
cur.setinputsizes(<バインド変数の変数名>=cx_Oracle.CLOB)
```


## ソース

```
import cx_Oracle

if __name__ == '__main__':

    zip_xml = ""
    # 郵便番号のxmlファイル
    with open('/path/to/jp_zipcode.xml', 'r', encoding='utf-8') as f:
        for s_line in f:
            zip_xml += s_line

    # Oracle接続
    conn = cx_Oracle.connect("test_user", "P@ssW0rd", "localhost:1521/xe")
    cur = conn.cursor()

    # XMLTYPEをバインドするため、cx_Oracle.CLOBを指定する
    cur.setinputsizes(zip=cx_Oracle.CLOB)
    param = {'zip': zip_xml}
    cur.prepare("insert into zip_xml values(xmltype(:zip))")
    cur.execute(None, param)
    conn.commit()
    cur.execute("select extract(zip, '/JapanAreaData/Prefecture/City/Area[ZipCode=1000002]').getClobVal() from zip_xml")
    res = cur.fetchone()
    print("郵便番号「1000002」のデータ確認")
    print(res[0])
    conn.close()
```

## 実行結果

```
$ python test_xmltype.py 
郵便番号「1000002」のデータ確認
<Area>
  <AreaKana>コウキョガイエン</AreaKana>
  <AreaName>皇居外苑</AreaName>
  <ZipCode>1000002</ZipCode>
</Area>

```
PowerShell : PSObject を ConvertTo-Json した際の Object 順を制御する。

psobject を ConvertTo-Json で JSON 化した際に object の並びを書いた通りに出来るかという話。

```PowerShell:Sample1.ps1
$ob = New-Object -TypeName psobject -Property @{
  FOO = 0
  BAR = 0
  BAZ = 0
  PIYO = 0
}
ConvertTo-Json $ob


{
 "BAZ":  0,
 "BAR":  0,
 "FOO":  0,
 "PIYO":  0
}
-> 順序が変わっている。
```


```PowerShell:Sample2.ps1
$ob = New-Object -TypeName psobject -Property @{}
@('FOO', 'BAR', 'BAZ', 'PIYO') | % {
  $ob | Add-Member -MemberType NoteProperty -Name $_ -Value 0
} 
ConvertTo-Json $ob

{
    "FOO":  0,
    "BAR":  0,
    "BAZ":  0,
    "PIYO":  0
}
-> 指定した順序になっている。
```