OmniAICreator/Qiita-1.07M huggingface dataset:
Emacs のコピー操作をちょっとだけ楽にする

コードの一部をコピーしたり、ある単語をコピーしたりって、1日に何十回としますよね。
その度に、範囲選択（`set-mark`）してコピー(`kill-ring-save`)して....とするのは面倒です。

そこで、コピー操作の手順をちょっとだけ減らせる pakcage を作ってみました。
本体は [GitHub/cool-copy](https://github.com/blue0513/cool-copy.el) に置いておきます。

## これは何？

この package を導入することで、以下のことができます

### 範囲選択をしていない場合

+ カーソル下の `symbol` をクリップボードにコピーします
+ コピーした内容を、 `posframe` か `minibuffer` に表示します

<img width="425" alt="68747470733a2f2f692e6779617a6f2e636f6d2f30333730373036663936353231623864646336343664653331353936346161612e706e67.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144707/c8fd60d8-8a9f-ee81-33d1-55265695cbb9.png">

### 範囲選択をしている場合

+ 通常と同じく、選択範囲をクリップボードにコピーします
+ 「region copied!」と `posframe` か `minibuffer` に表示します

## 何が嬉しいの？

従来、ある単語をコピーする際には「選択」して「コピー」するという2手順必要でした。
この package により、単語をコピーする際には「選択」の手順が省けます。

省略できる手順は少ないですが、このような操作は1日に何十回と行うので、実際にはかなりの手間を節約できると思います。

## セットアップ

git clone 後に `init.el` に以下を記載してください

```elisp
(add-to-list 'load-path "YOUR PATH")
(require 'cool-copy)

;; キーバインドの設定をおすすめします
(global-set-key [YOUR KEY] 'cool-copy)
```
## 使い方

+ コピーしたい symbole の上で `M-x cool-copy` か設定したキーバインドで実行
+ 範囲選択をして `M-x cool-copy` か設定したキーバインドで実行

## カスタマイズ

コピー時のメッセージ表示方式を以下の3つから選択できます。

```elisp
;; メッセージを minibuffer に表示します（デフォルト）
(setq cool-copy-show 'minibuffer)
;; メッセージを posframe で表示します
(setq cool-copy-show 'posframe)
;; メッセージを表示しません
(setq cool-copy-show nil)
```
Bitriseで定期ジョブを設定する方法

一度やってしまえば簡単なのですが、初めて設定する際に少しわかりずらいと感じたので:raised_hands:

# 手順
## 1. Workflowの作成
定期ジョブに設定したいWorkflowをいつも通りに作ります。
<img width="1102" alt="スクリーンショット 2019-08-31 18.54.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/15e8a6b1-4c61-462d-4a52-0ef258520cd8.png">

## 2. `Start/Schedule a Build`ボタンをクリック
ビルド一覧ページに戻り、画面右上のボタンをクリックします。
<img width="1612" alt="スクリーンショット 2019-08-31 19.03.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/6fd8839c-9599-d7a6-3481-fbc0d040e05d.png">

## 3. スケジューリング
`Build configuration`のポップアップが表示されるので、
一番上の`Schedule this build`欄のスイッチをONにします。
※`Schedule this build`は2015年くらいにリリースされてからずっとBetaなのだそう。
<img width="619" alt="スクリーンショット 2019-08-31 19.08.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/d6fc5af8-228d-ddfa-965a-04ef93b41c00.png">

定期ジョブを回したい時間、曜日、Branchをぽちぽちし、先ほど作ったWorkflowを選択したら設定完了！
<img width="617" alt="スクリーンショット 2019-08-31 19.10.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/efe2cb58-717f-e1ca-06f0-ee08ff0344e6.png">

ビルド一覧ページの一番上に定期ジョブが作られているはずです。
<img width="1621" alt="スクリーンショット 2019-08-31 19.20.06.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112818/e9f492fb-f109-c5b2-4855-3864a1ef59e1.png">

以上、定期ジョブを設定する方法でした！楽しいBitrise生活を:wave:
ESP-WROOM-02の開発用自作基盤を作る

#目的
ESP-WROOM-02を動かすには様々な周辺部品が必要だ．一番手っ取り早いのは開発用の基盤を購入するという手段だろう．しかし，市販のものではカスタマイズ性に欠ける．そのため，開発用の自作基盤を作成する．

#開発環境
- ESP-WROOM-02
- FT232RL
- 電源 5V 12A
- ケーブル
- パソコン(ubuntu 18.04 LTS)
- Eagle 9.3.0
- Arduino IDE 1.8.9

#手順
1.開発用の基盤を設計する．
2.ユニバーサル基板で試作品を作成する．
3.動作確認をする．
4.基盤を発注する．

#結果
以下の図のような回路を作成した．なお，ESP-WROOM-02に3.3Vを供給するためのDC-DCコンバータは回路図ではLM1117となっているが，実際にはADP3338を使用した．
![esp8266回路図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192626/6fcd25bc-f1e4-087d-588e-eaa800e1837a.png)

作成した試作品を以下の図に示す．
![IMG_20190831_175444_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192626/daca4850-f43e-479f-0cd6-f73b074a0fa0.jpeg)

115200bpsで通信を行った結果，ATコマンドに対し以下のように表示され，正常に通信出来ていることが分かった．
![esp8266通信.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192626/a16a2c63-49ce-af88-5001-52c842570b87.png)

開発中のガーバーデータについて以下に示す．
![esp8266回路図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192626/c570bcf2-0b19-abe6-471d-3647ec25d509.png)

#考察
ESP-WROOM-02の開発用自作基盤のデータを作成した．これにより，シリアル変換器をプログラム実行用の基盤と分けることができ，コストダウンを図れた．また，今後ESP-WROOM-02とその他モジュールを搭載した一体型の基盤を作成するのが容易になった．

#結論
ESP-WROOM-02の開発用自作基盤のデータを作成出来た．

#参考文献
- 柳田 雅治,「ESP8266」でつくるデータロガー，工学社，2018年5月20日
TypeScriptを対話形式で実行する方法

## 環境作成
実行に必要なパッケージがない場合は以下を実行する。

```
$ npm i -g typescript ts-node
```


## 対話形式で実行

```
$ npx ts-node
>
```

あとは、対話形式で実行できる。
以下実行例。

```
> let n: number = 3;
'use strict'
> console.log(n)
3
undefined
> n = null
[eval].ts:3:1 - error TS2322: Type 'null' is not assignable to type 'number'.
```
tsconfig.jsonの`strictNullCheck`を`true`にしていたので怒られた。

### 終了
`.exit`で終了できる。

```
>.exit
```


### 補足

npxコマンドとは、node_modulesフォルダ内のバイナリをパス指定無しで直接実行出来るコマンド。
また、.tsファイルを直接指定する場合は

```
$ npx ts-node <ファイルのパス>
```
でいけます。
Macでadb コマンドを使えるようにする

#はじめに
Android開発をmacでやっている人なら誰でも一度は通る道のadbコマンドのPATHをMacで通す方法を備忘録的に記載します。

#1. platform-toolsのパスを調べる
そもそもadbコマンドがどこあるのかということを調べます。

AndroidStudioを使っている人なら、AndroidStudioの[File]→[Other Settings]→[Default Project Structure]からこんな画面が立ち上がって、sdkの場所が確認できます。

Android SDK locationに表示されているPathからファインダーなどで実際にplatform-toolsがあるpathを確認して、どっかにメモしておいてください。
（大体は、Android SDK locationのPATHに「/platform-tools」をつければ、platform-toolsのPATHになるかと思います。）

AndroidStudioを使わずに、platform-toolsだけ別でインストールしてるとかの方は、platform-toolsのPATHをどっかにメモしておいてください。

#2. .bash_profileにPATHを設定する
##2.1 .bash_profileとは？
ざっくりいってしまうと、ターミナルが立ち上がった時に一度だけ読み込まれる設定ファイルです。
自分で作ってないと、もちろん作成はされていません。つまり、新品のmacには存在しないファイルです。

##2.2 ターミナルで .bash_profileに書き込もう
コマンドで.bash_profileを立ち上げます。

```ruby:qiita.rb
vi ~/.bash_profile
```

そうすると、.bash_profileが立ち上がります。

そこで先ほどメモしておいたplatform-toolsのPathをexportしてください。
多分こんな状態になるかと思います。


```ruby:qiita.rb
export PATH=$PATH:/platform-toolsのPath
```

![スクリーンショット 2019-08-31 16.27.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433507/2f378da2-73e1-f1a3-abad-fd0900fbac8b.png)

そして、保存して閉じましょう。

```ruby:qiita.rb
:wq
```

![スクリーンショット 2019-08-31 16.30.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/433507/bb185f1a-dc10-3425-e46a-afb6d6ff0930.png)


「:wq」を入力したら、.bash_profileが勝手に閉じてくれます。

そこですかさずターミナルで.bash_profileを反映させましょう。


```ruby:qiita.rb
source ~/.bash_profile
```

これで、platform-toolsのPathが通り、adbコマンドが使えるようになるかと思います。


#3.PATHが通ったか確認する方法
ターミナルでPATHを表示するコマンドを入力すると

```ruby:qiita.rb
echo $PATH
```

ターミナルに先ほど設定したplatform-toolsのPathが表示されていれば、完了です！
有用なtweetだけ見れるようにした

# はじめに
twitterのつよつよエンジニアたちにありがちなのが、真面目な(有用な)tweetは10%程度で、
残りの90%はMatrixFlowやスタバなうという文字と共に呟かれるご飯の画像、、、、

そーゆーのも含めてtwitterだが、流れ行く有用情報を逃しては本末転倒ということで
自分が知りたい情報が乗っていそうなtweetのみをタイムラインから抽出してみた

使用言語はpythonです

# コード
調べ始めるとtweepyという便利ライブラリがあり、簡単にコードが書けた。

```
auth = tweepy.OAuthHandler(keys[0],keys[1])
auth.set_access_token(keys[2],keys[3])
api = tweepy.API(auth)
```
のように書くとapiという変数で自分のtwitterアカウントを用いて色々できるようになる。[^1]
<br>

```
timeline = api.home_timeline(count=N_read)
```

で自分のタイムライン上のtweetをN_read個読み取れる

あとはそれを正規表現で取捨選択して
コンソール状に表示なり、テキスト形式で保存すれば終わりです。

# 終わり
という感じでめちゃめちゃ簡単に自分なりのお粗末なtwitterクライアントが作れました。
コード全文は[github](https://github.com/okura0105/twipick)で公開してるのでぜひ見てください



[^1]: 引数として渡しているkeysは中身はtwitterのAPI-keyです。
IFTTT活用例　スマホのボリュームコントロール

#１．時間、曜日指定でミュート
![20190831-01.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145508/5df5b72f-602a-10bb-eb15-79f33b412e55.png)


#２．自宅WIFi接続でボリュームを70%
![20190831-02.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/145508/5f35054b-3a24-adc9-5d91-3f7afc5de31d.png)
強化学習ゼミ記録【森村哲郎】Chapter1

# はじめに
2019年から強化学習ゼミを実施しています。ゼミで議論になった部分について記録します。

- [強化学習ゼミ記録【森村哲郎】Chapter2](https://qiita.com/ground0state/items/aa2ee07922624fd99d09)
- 強化学習ゼミ記録【森村哲郎】Chapter3(欠番)
- [強化学習ゼミ記録【森村哲郎】Chapter4](https://qiita.com/ground0state/items/8400b98bdd7f6d89900a)


# 使用している教科書
- [強化学習 著：森村哲郎](http://bookclub.kodansha.co.jp/product?item=0000275420)

# ディスカッション
## 方策のサイズの数え方
表1.2の方策サイズを考える。方策は$|\pi(a|s)| = |\mathcal{A}|^{|\mathcal{S}|}$と数えられ
具体的に$|\mathcal{A}|=2, |\mathcal{S}|=2$とする。


決定的マルコフ方策の系列の集合$\Pi^d$では方策が現在の状態にのみ依存するので、ステップで方策の数は変化しない。

```math
|\pi(a_t | s_t)| = |\mathcal{A}|^{|\mathcal{S}|} = 2^2 = 4
```

非定常な決定的マルコフ方策系列の集合$\boldsymbol{\Pi}^{MD}_{0:T}$では方策が時間に依存するので、各時間ごとに異なる方策が存在する。

```math
\begin{align}
&|\pi(a_T | s_T)|\times|\pi(a_{T-1} | s_{T-1})|\times...\times|\pi(a_{0} | s_{0})| \\
& = |\mathcal{A}|^{|\mathcal{S}|} \times |\mathcal{A}|^{|\mathcal{S}|} \times...\times |\mathcal{A}|^{|\mathcal{S}|}\\
& = (|\mathcal{A}|^{|\mathcal{S}|})^{T+1}\\
& = (2^2)^{T+1}
\end{align}
```

履歴依存な決定的マルコフ方策系列の集合$\boldsymbol{\Pi}^{HD}_{0:T}$では方策が過去の履歴全てに依存するので、各時間ごとに過去の状態、行動全てを数える必要がある。

```math
\begin{align}
& |\pi(a_T | s_T, a_{T-1},...,s_{0})|\times...\times|\pi(a_{1} | s_{1}, a_{0}, s_{0})|\times|\pi(a_{0} | s_{0})| \\
& = |\mathcal{A}|^{|\mathcal{S}|^{T+1}|\mathcal{A}|^{T}}\times... \times |\mathcal{A}|^{|\mathcal{S}|^{2}|\mathcal{A}|^{1}} \times |\mathcal{A}|^{|\mathcal{S}|} \\
& =  \prod_{t=0}^{T} |\mathcal{A}|^{|\mathcal{S}|^{t+1}|\mathcal{A}|^{t}}\\
& = \prod_{t=0}^{T} 2^{2^{2t+1}}
\end{align}
```

## エルゴード性
マルコフ過程がエルゴードならば定常分布を持つ。

- 既約が必要なのはなぜ？
遷移行列を作用させていって収束する先が非連結なので、どちらの空間にいくか初期値に依存する。したがって初期値に依存して収束する分布が変わってしまうので、定常ではない（で、いいのか？）。

- 非周期が必要なのはなぜ？
周期性を持つと、例えばある状態Sに到達できるのは周期Nのときのみ、となり値が振動する（かつ既約性よりゼロには収束しない）ので、$t\rightarrow \infty$で$|p_t(S)- p_{t-1}(S)| < \varepsilon $なる十分小さい$\varepsilon$が存在しない。したがって非周期の必要がある。

## 分位点の求め方

表1.6の遷移について0.05分位点を求める。pが遷移確率、Rは累積報酬。

$\pi^2_A$: ACDの遷移。分位点0.05、つまりRが小さい方から累積確率が0.05になるのはA-C_jam-Dの遷移でRは-50。

```
A
├ C_normal
│ └ D  (p=0.8, R=-35)
└ C_jam
  ├ D  (p=0.16, R=-50)
  └ C_accident  
    └ D  (p=0.04, R=-100)
```

$\pi^4_A$: ACDの遷移。分位点0.05はA-C_jam-B_jam-Dの遷移でRは-85。

```
A
├ C_normal
│ └ D  (p=0.8, R=-35)
└ C_jam
  └ B_jam
    └ D  (p=0.2, R=-85)
```

$\pi^2_{C_{jam}}$: Bも経由する遷移。分位点0.05はC_jam-B_jam-Dの遷移でRは-75。

```
C_jam
└ B_jam
    └ D  (p=1.0, R=-75)
```

他も同様にして求められる。


# おわりに
数学的な部分が色々省略されがちな強化学習ですが、この教科書はかなり厳密な議論がされているのでワクワクです。
名前空間 'xxx' は既に 'yyy' の定義を含んでいます。が発生した時の回避策

# 名前空間 'xxx' は既に 'yyy' の定義を含んでいます。が発生した時の回避策

ひさしぶりに開いたプロジェクトをビルドすると次のエラーが発生した。
この問題は、現象、回避策ともに今回のケースだけではないと思うが、回避した方法を記録しておく。

## エラーメッセージ

```
エラー	CS0101	名前空間 'Tamon.CameraMonitor' は既に 'Camera' の定義を含んでいます。 
C:\Users\...\TamCameraMonitor\Camera\Camera.cs	10	アクティブ
```

## 対象ソース

エラーは Camera.cs のクラス定義 (10行目) で発生していた。

```csharp
namespace Tamon.CameraMonitor
{
    public class Camera : IDisposable
    {
```
今回の場合は、同じプロジェクトの他ファイルに次のような名前空間が定義されていた。

```csharp
namespace Tamon.CameraMonitor.Camera
{
```

## 回避策

先の名前空間は記憶にも、そう定義する意味も見つからなかったので以下のように修正した。

```csharp
namespace Tamon.CameraMonitor
{
```

## 確認した環境

OS: 日本語 Windows 10 Home 64 ビット
コンパイラ: Microsoft Visual Studio Community 2019 Version 16.2.2
ターゲットフレームワーク: .NET Framework 4.6.1
閉包テーブル (Closure Table) に順序を持たせソートした結果を取得する ~ MariaDB

[閉包テーブル (Closure Table) に順序を持たせソートした結果を取得する][closure_table]

MariaDB のバージョンです。
GROUP_CONCATはデフォルトで1,024文字なので group_concat_max_len を拡張します。

```sql
SET SESSION group_concat_max_len = 1000000;
SELECT
  s.id
  , s.description
  , t.path 
FROM
  ( 
    SELECT
      t1.descendant
      , GROUP_CONCAT( 
        LPAD(ss.nth_child, 2, '0')
        ORDER BY
          t2.path_length DESC SEPARATOR '-'
      ) path 
    FROM
      tree_paths AS t1 
      INNER JOIN tree_paths AS t2 
        ON t2.recipe_id = t1.recipe_id 
        AND t2.descendant = t1.descendant 
      INNER JOIN steps AS ss 
        ON ss.recipe_id = t2.recipe_id 
        AND ss.id = t2.ancestor 
    WHERE
      t1.recipe_id = 1 
      AND t1.ancestor = 1 
    GROUP BY
      t1.descendant
  ) AS t 
  INNER JOIN steps AS s 
    ON s.recipe_id = 1 
    AND s.id = t.descendant 
ORDER BY
  path ASC
```

[closure_table]:https://qiita.com/nkenbou/items/6a7098f20f543e1ad800
ESLint v6.3.0

前 [v6.2.0](https://qiita.com/mysticatea/items/a66dd2d11b01aa5ce080) | 次 [v6.4.0](https://qiita.com/mysticatea/items/4164b162fb37dcc443a1)

<blockquote class="twitter-tweet"><p lang="en" dir="ltr">ESLint v6.3.0 has been released:<a href="https://t.co/eDgW2Hm7xv">https://t.co/eDgW2Hm7xv</a></p>&mdash; ESLint (@geteslint) <a href="https://twitter.com/geteslint/status/1167529278822596609?ref_src=twsrc%5Etfw">August 30, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

ESLint `6.3.0` がリリースされました。
小さな機能追加とバグ修正が行われています。

質問やバグ報告等ありましたら、お気軽にこちらまでお寄せください。

> 🏢 [日本語 Issue 管理リポジトリ](https://github.com/eslint/eslint-jp)
> 👫 [日本語サポート チャット](https://gitter.im/eslint/eslint-jp)
> 🏢 [本家リポジトリ](https://github.com/eslint/eslint)
> 👫 [本家サポート チャット](https://gitter.im/eslint/eslint)

# 🚀 本体への機能追加

## 設定ファイルに `reportUnusedDisableDirectives` プロパティが追加されました。

🔖 [RFC 22](https://github.com/eslint/rfcs/tree/master/designs/2019-core-options), [#12151](https://github.com/eslint/eslint/pull/12151)

```json:.eslintrc.json
{
    "reportUnusedDisableDirectives": true
}
```

この設定は [`--report-unused-disable-directives` CLI オプション](https://eslint.org/docs/user-guide/command-line-interface#--report-unused-disable-directives)とほぼ同等です。今まで CLI でしか指定できなかったものが設定ファイルでも指定できるようになりました。

## `eslint --init` が TypeScript をサポートしました。

🔖 [#12172](https://github.com/eslint/eslint/pull/12172)

`eslint --init` コマンドが TypeScript を利用するかどうかを質問するようになりました。Yes とした場合、`@typescript-eslint/parser` と `@typescript-eslint/eslint-plugin` がセットアップされます。

# 💡 新しいルール

特になし。

# 🔧 オプションが追加されたルール

## [no-extra-parens](https://eslint.org/docs/rules/no-extra-parens) `enforceForSequenceExpressions`

🔖 [#12142](https://github.com/eslint/eslint/pull/12142)

カンマ演算子の多項式 (例: `(a, b, c)`) を囲む括弧を報告しないようにするオプションが追加されました。
(不思議ですが、オプションのデフォルト値は`true`です)

```js
/*eslint no-extra-parens: [error, all, { enforceForSequenceExpressions: false }] */

//✔ GOOD
if ((a, b)) {}
```

> [Online demo](https://eslint.org/demo#eyJ0ZXh0IjoiLyplc2xpbnQgbm8tZXh0cmEtcGFyZW5zOiBbZXJyb3IsIGFsbCwgeyBlbmZvcmNlRm9yU2VxdWVuY2VFeHByZXNzaW9uczogZmFsc2UgfV0gKi9cblxuLy/inJQgR09PRFxuaWYgKChhLCBiKSkge31cbiIsIm9wdGlvbnMiOnsicGFyc2VyT3B0aW9ucyI6eyJlY21hVmVyc2lvbiI6OCwic291cmNlVHlwZSI6Im1vZHVsZSIsImVjbWFGZWF0dXJlcyI6e319LCJydWxlcyI6e30sImVudiI6e319fQ==)

# ✒️ `eslint --fix` をサポートしたルール

特になし。

# ⚠️ 非推奨になったルール

特になし。
git push時の403エラーでハマった

# 状況
git push する際に403で以下のようなエラーが出ました
`remote: Permission to okura0105/twipick.git denied to okura0105.`

git push 403でググるとほとんどの回答は権限なしによるエラーと出ます。
しかし上のエラーをみてわかるようにリポジトリのオーナーとpushする側は一致しています。

なので`set-url`をしようが何しようがエラーがで続けました。

# 解決法
githubの認証を2段階認証にしていたことが原因でした。
2段階認証に設定するとgitコマンドのパスワードはPersonal access tokensになります。
このPersonal access tokenの発行時にscopeを設定してなかったので弾かれていたようです。

scopeでrepoにチェックを入れれば、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/438362/bc17215a-534e-494a-2db0-0f4d78a358b7.png)

通るようになるはずです。



普通はありえないミスだと思いますが、ハマっている人は確認してみるといいかもしれません。
Zazzleの各国でのURLとRSS

Zazzleという作品を気軽に作成して販売できるサイトのRSS。
多言語対応のサイトでZazzleの商品を販売する場合、関税の関係で国ごとのサイトから取得すべきなので、各国のRSSを一覧にしてみました。

## 各国のRSS一覧
ストアのRSSの "storename" という部分は実在するストアのものに置き換えてください。

| 国名 | 国名（英語） | トップページ | マーケットプレイスのRSS | ストアのRSS |
|:--|:--|:--|:--|:--|
| オーストラリア | Australia | https\://www\.zazzle.com.au/ | https\://www\.zazzle.com.au/feed | https\://www\.zazzle.com.au/storename/feed |
| オーストリア | Austria | https\://www\.zazzle.at/ | https\://www\.zazzle.at/feed | https\://www\.zazzle.at/storename/feed |
| ベルギー | Belgium | https\://www\.zazzle.be/ | https\://www\.zazzle.be/feed | https\://www\.zazzle.be/storename/feed |
| ブラジル | Brazil | https\://www\.zazzle.com.br/ | https\://www\.zazzle.com.br/feed | https\://www\.zazzle.com.br/storename/feed |
| カナダ | Canada | https\://www\.zazzle.ca/ | https\://www\.zazzle.ca/feed | https\://www\.zazzle.ca/storename/feed |
| イギリス | England | https\://www\.zazzle.co.uk/ | https\://www\.zazzle.co.uk/feed | https\://www\.zazzle.co.uk/storename/feed |
| フランス | France | https\://www\.zazzle.fr/ | https\://www\.zazzle.fr/feed | https\://www\.zazzle.fr/storename/feed |
| ドイツ | Germany | https\://www\.zazzle.de/ | https\://www\.zazzle.de/feed | https\://www\.zazzle.de/storename/feed |
| 日本 | Japan | https\://www\.zazzle.co.jp/ | https\://www\.zazzle.co.jp/feed | https\://www\.zazzle.co.jp/storename/feed |
| オランダ | Netherlands | https\://www\.zazzle.nl/ | https\://www\.zazzle.nl/feed | https\://www\.zazzle.nl/storename/feed |
| ニュージーランド | New Zealand | https\://www\.zazzle.co.nz/ | https\://www\.zazzle.co.nz/feed | https\://www\.zazzle.co.nz/storename/feed |
| ポルトガル | Portugal | https\://www\.zazzle.pt/ | https\://www\.zazzle.pt/feed | https\://www\.zazzle.pt/storename/feed |
| その他ヨーロッパ | Rest of Europa | https\://www\.zazzle.co.uk/ | https\://www\.zazzle.co.uk/feed | https\://www\.zazzle.co.uk/storename/feed |
| スペイン | Spain | https\://www\.zazzle.es/ | https\://www\.zazzle.es/feed | https\://www\.zazzle.es/storename/feed |
| スウェーデン | Sweden | https\://www\.zazzle.se/ | https\://www\.zazzle.se/feed | https\://www\.zazzle.se/storename/feed |
| スイス | Switzerland | https\://www\.zazzle.ch/ | https\://www\.zazzle.ch/feed | https\://www\.zazzle.ch/storename/feed |
| アメリカ | United States | https\://www\.zazzle.com/ | https\://www\.zazzle.com/feed | https\://www\.zazzle.com/storename/feed |

## これを利用する
ZazzleのRSSをPHPで出力する方法は以下
https://sayoko-ct.com/blog/develop/zazzle-rss#editPHP

具体的には以下のWordPressプラグイン作成でこの機能を使いました。
https://sayoko-ct.com/sc-simple-zazzle/
PQ小ネタ：微小なDurationのロード

秒未満の値があるなら、秒に変換して使おうというだけの話。

###データ型Anyのままだと
####エディタにて
ログファイルをパースした様子。その名も「Duration」なるフィールドに各プロセスの実行所要時間が入っているようです。
細かい･･･。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/a229b38f-60f4-ccc5-15bb-30d1e9f04e64.png)

この状態はテキスト扱いされています。変換タブの「期間」ボタンを見てみると、グレーアウトされてることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/896efce6-0ada-9bad-a62e-48976fd38cce.png)

※タイプを直接、調べることもできます。（Custom3はただの前ステップ名）

```
= Value.Type(Custom3[Duration]{0})
```

####Excelロード後
結果は同じく、テキストなので、合計してくれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/c2427ca7-b457-32c8-72b1-237148b311d9.png)

###データ型をDurationに変えると
####エディタにて
それならば、とデータ型をDurationに変えてみる。これはUIで簡単にできる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/6551b28d-7d51-2176-b2c6-2e27e14d61d9.png)

さきほどの変換タブの「期間」ボタンも押せる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/46143152-601f-0493-2ad7-877b53d62fa4.png)

ちなみに、合計は普通に機能するようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/7d6227c7-4291-332f-bc7c-0dfd5ecf1152.png)

####Excelロード後
時刻扱いでは秒未満がつぶれちゃう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/5bd3992b-d26a-eed1-f38f-1614f3eed7a1.png)

で、数値に変えて扱ってみると、合計は出来るけど、単位は1日なので、扱いづらい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/7f425f46-e2ed-5aac-85f4-db17c3ad5783.png)

###さらに秒に変換する
####エディタにて
UI操作で変換タブ―期間―合計秒数をかける。(秒ではない)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/3f5c95d6-9e39-4ffb-b42e-02d15ba7f568.png)

※「合計秒数」と「秒」の違い

```pq:例
//「合計秒数」
Duration.TotalSeconds(#duration(0,0,1,30))　//90が返る
//「秒」
Duration.Seconds(#duration(0,0,1,30))　//30が返る
```

####Excelロード後
分かりやすくなった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/370992/b7926f05-90cb-8ff1-88e2-880695bb52a6.png)

###おまけ:最初からコードだと

```
 = Table.TransformColumns(Custom3,{{"Duration",each
                    Duration.TotalSeconds(
                        Duration.FromText(_)
                    )
                    }}
    )
```
Railsのdeviseでマイページの作成

#はじめに
こちらの記事は、Railsのgemであるdeviseを使ってログインした後に、マイページを表示する方法をご紹介します！

**前提：Rails環境構築済み, devise導入済み**

# routeを設定する
マイページを作成するために、showアクションを作成していきます。
ここでは、deviseを使ってuserモデルを生成したとして話を進めていきます！

```
### routes.rb
resources :users, :only => [:show]
```

# controllerを作成
こちらはいつものコントローラーを作成している要領で下記のコマンドを入力してください。

```
$ rails g controller users show
```

# controllerを編集
user_controllerでは、DBにあるユーザーを取得しています。
application_controllerでは、ログイン後のリダイレクト先を設定しています。

```
# /app/controllers/user_controller.rb
# マイページ
def show
  @user = User.find(params[:id])
end
```

```
# /app/controllers/application_controller.rb
# ログイン後のリダイレクト先
  def after_sign_in_path_for(resource)
    user_path(resource.id)
  end
```

# viewを編集
こちらがマイページ部分になります！
なんでも良いのですが、ここでは共通であろうユーザーのidを表示するようにしています。

```
<!-- /app/views/user/usershow.html.erb -->
<p>MyPage <%= @user.id %></p>
```

# 終わりに
簡単にでしたが、Railsのdeviseでマイページの作成をご紹介させていただきました！
記事で少しずつ自分の知識をアウトプットしていければと思います。
何かリクエストがあればTwitterのDMにてご連絡ください^^
gotests で go-cmp 使えるようにする

## このページについて

vscode の unit test 生成に使われている gotests で go-cmp 使えるようにしてみました(2019-08)

**ただし、上記機能のPRは出ているのでそのうちoptionから使えるようになると思います**

## 手順

gotests は カスタムテンプレートを読み込ませる機能があるので
それを使っていきます

```json:.vscode/settings.json
{
    "go.toolsEnvVars": {
        "GO111MODULE": "on"
    },
    "go.generateTestsFlags": [
        "-template_dir",
        "/path/to/gotest-template/tmpl"
    ]
}
```

gotest-template はカスタムテンプレートが入った[リポジトリ](https://github.com/smith-30/gotest-template)です。よかったら試してみてください。

そうしたあとに 単体テスト生成するとこんな感じになります

```go
package helper

type Human struct {
	ID   int64
	Name string
}

func NewHuman(name string) Human {
	return Human{
		Name: name,
	}
}
```

```go
package helper

import (
	"testing"

	"github.com/google/go-cmp/cmp"
)

func TestNewHuman(t *testing.T) {
	type args struct {
		name string
	}
	tests := []struct {
		name string
		args args
		want Human
	}{
		{
			args: args{
				name: "hoge",
			},
			want: Human{
				Name: "fuga",
			},
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := NewHuman(tt.args.name); !cmp.Equal(got, tt.want) {
				t.Errorf("NewHuman() = %v, want %v\ndiff=%v", got, tt.want, cmp.Diff(got, tt.want))
			}
		})
	}
}

```

わざと失敗するように書いていますが、これを実行すると

```bash
=== RUN   TestNewHuman
=== RUN   TestNewHuman/#00
--- FAIL: TestNewHuman (0.00s)
    --- FAIL: TestNewHuman/#00 (0.00s)
        /go/src/github.com/smith-30/ootd/helper/struct_test.go:30: NewHuman() = {0 hoge}, want {0 fuga}
            diff=  helper.Human{
              	ID:   0,
            - 	Name: "hoge",
            + 	Name: "fuga",
              }
FAIL
```

こんな感じでどこが正しくないか開発者にやさしく表示してくれるようになります。  

## 参考
【JavaScript】全角／半角変換メモ

# 前おき
某プログラミングスクールで、某フリーマケットWebアプリのコピーを作っていました。
その時の話です。

＜成果物レビュー＞
レビューア：入力フォームのラベルに（全角）って書いてあるのに、半角入力できるね〜
私：ふぁ！？！？？
レビューア：ユーザフレンドリーに作るなら、バリデーションかけてあげるべきですよ〜
私：（言われてみればそうだけど、本家も入力できたよ？！なんでよ？！？？！？

・
・
・
・

その後、すぐさま確認しました。
本家さまは半角を全角に自動変換すると言う素晴らしい配慮をされていました。
私のこの配慮のなさよ。私も住所入力で全角強要されたら直ぐさま買うの辞めちゃうでしょ？！

と、反省をしつつ、実現方法について考え、JSで実装することにしました。
その結果をメモります。（前置き長い。よく言われます

# JavaScriptの表記めも
とりあえず、今回は全角／半角変換。
郵便番号に自動的に-入れるとかもやってみたので、そちらは今度のめも。

##①半角→全角変換
全角文字はそのまま捨て置かれます。
※カタカナは含まれません

```sample.js
$(function(){
  //半角→全角メソッド
  function toFullWidth(input) {
    return input.replace(/[!-~]/g,
        function(input){
        return String.fromCharCode(input.charCodeAt(0)+0xFEE0);
        }
    );
  };

  //イベント指定（対象のフォームIDごとに仕込み。
  $('#user_lastname').on('blur',function(e){
    $(this).val(toFullWidth($(this).val()));
  });

  $('#user_firstname').on('blur',function(e){
    $(this).val(toFullWidth($(this).val()));
  });
}
```

##②全角→半角変換
半角はそのまま捨て置かれます。
※カタカナは含まれません

```sample.js
$(function(){
  //全角→半角メソッド
  function toHalfWidth(input) {
    return input.replace(/[！-～]/g,
      function(input){
        return String.fromCharCode(input.charCodeAt(0)-0xFEE0);
      }
    );
  };

  //半角指定の項目は自動で半角変換
  $('#user_tel').on('blur',function(e){
    $(this).val(toHalfWidth($(this).val()));
  });
}
```

Railsのform_forやform_withを使っているとモデルを指定しているはずなので、基本的に同一のIDがhtmlに振られます。
なので、あまり意識せずとも全てにjsが掛かる！素晴らしい！

イベント発火対象のJQueryオブジェクトを複数指定できそうだけど、そこまでは踏み込みませんでした。

以上です。

#参考
[JavaScriptでよく使う全角・半角を変換するスクリプト（メモ）]
https://minory.org/js-full-half-width.html
→カタカナ変換なんかも載ってました。
コードを抜き出してwinmergeにかける作業の時短

#概要
　コードを読んでいて「これさっき似たようなのあったなぁ」と既視感を覚え、差分を調べることがあります。
その際私がよくやるのが、「a.txt」と「b.txt」二つファイルを用意し、そこにそれぞれ抜き出したコードを張り付けてWinMergeにかけることです。

　そういうことは頻度は高くはないのですが、たまにやる際に「a.txt」、「b.txt」それぞれファイルを開き、WinMerge起動するのが面倒だったのでバッチにしました。
以下に上げました。ご自由のご使用ください。

[WinMergeでファイル比較起動バッチ](https://github.com/hidetaka0/tools/tree/master/winmergeShortcut)

基本的に自分用ですので、勝手に改変することがあります。

#内容
バッチの内容は以下です。（記事執筆時点）

```bat:diff.bat

rem winmerge path
set WINMERGE="C:\Program Files\WinMerge\WinMergeU.exe"


rem Working dirctory
set WORKDIR=diff
: filename
set FILE_A=%WORKDIR%\a.txt
set FILE_B=%WORKDIR%\%b.txt

rem Make working directory
mkdir %WORKDIR%

rem Open text files with the default app
start %FILE_A%
start %FILE_B%

start "" %WINMERGE% %FILE_A% %FILE_B%
```

変数`WORKDIR`のフォルダに比較するための2ファイルを格納します。
変数`FILE_A`と変数`FILE_B`がその比較対象のファイルで、それらをWinMergeで比較します。

`start %FILE_A%`、`start %FILE_B%`はテキストファイルを起動しています。
拡張子「.txt」に設定しているテキストエディタによってファイルが開かれます。

`start "" %WINMERGE% %FILE_A% %FILE_B%`でWinMergeを起動して2つのファイルの比較をします。
ちなみに、`start ""`の`""`は新しく起動するプロンプトのタイトル名です。これを付けないと` %WINMERGE%`を誤ってタイトルとして受け取ってしまいWinMergeが起動しません。

実行すると、変数`FILE_A`と変数`FILE_B`の2ファイルがテキストエディタで起動し、同時にWinMergeでの比較も起動します。
後は、テキストファイルにコードを張り付ければOKです。WinMerge上で直接貼り付けても良いです。


変数`WINMERGE`はWinMergeインストールパスに合わせて適宜変更してください。
RubyでPDFをCSVライクにパースする

Rubyを使ってPDFをCSVっぽくパースする方法を整理します。

# pdf-reader

利用するgemは **[pdf-reader](https://github.com/yob/pdf-reader)** です。

以下のコマンドでインストールします。

```
gem install pdf-reader
```

pdf-reader の使い方は、Github上の [README.md](https://github.com/yob/pdf-reader) を参照してください。

# 実装例

実装例のソースコードは次のとおりです。（Githubは[こちら](https://github.com/kei178/ruby-pdf-parser)）

```ruby:parser.rb
require 'pdf-reader'

File.open('example.pdf', 'rb') do |io|
  reader = PDF::Reader.new(io)
  pages = []

  # Parsing PDF
  reader.pages.each do |page|
    rows = []
    # Separating a whole text
    t = page.text.split("\n")

    t.each do |s|
      # Formatting
      ary = s.split("\s\s")
      ary.delete_if { |str| str.nil? || str.empty? }
      ary.each(&:strip!)
      next if ary.empty?

      rows << ary
    end
    pages << rows
  end

  # Showing parsed data
  pages.each do |page|
    page.each { |rows| p rows }
  end
end
```

## ポイント

*  `pdf-reader` の `page.text` メソッドにより、「PDF→テキスト(塊)」に変換できます。
*  「改行」で `split` して「テキスト(塊)→１行ごと」に切り分けます。
*   さらに「空白２文字」で `split` して「１行ごと→項目ごと」に切り分けます。

## パース結果

パースした結果をコンソールに出力してみます。

```
ruby parser.rb
```

```ruby
["Invoice"]
["DATE: [Enter date]"]
["INVOICE Invoice Number"]
["FROM:", "[Company Name]", "TO:", "[Client Name]"]
["[Email]", "[Client Email Address"]
["[Address 1]il Address", "[Address 1]"]
["[Address 2]", "[Address 2]ress 1"]
["[Phone]s 2", "[Phone] Address 2"]
["TERMS: T[Payment Terms]"]
["DUE:", "Due Datet Due Date]"]
["Item Description", "Quantity", "Price", "Amount"]
["Item1", "1.00"]
["$ 10.00", "$ 10.00"]
["Item2", "2.00"]
["$ 10.00", "$ 20.00"]
["Item3"]
["1.00", "$ 20.00", "$ 20.00"]
["Item4", "5.00"]
["$ 5.00", "$ 25.00"]
["Item5", "1.00"]
["$ 8.00", "$ 8.00"]
["$ 0.00"]
["$ 0.00"]
["$ 0.00"]
["$ 0.00"]
["$ 0.00"]
["Subtotal", "$ 83.00"]
["Tax"]
["BALANCE DUE", "$ 83.00"]
["Notes"]
["EClick here to add notes or terms of service.here"]
```
所どころ、行落ちしてしまっている部分がありますが、概ねCSVライクにパースできています。
【Rails】URLを取得したり操作する方法まとめ


こんにちは！
ねこじょーかー（[@nekojoker1234](https://twitter.com/nekojoker1234)）と申します。

Railsの開発をしていると、URLを取得したり、どこから来たかを判断したりしますよね。
そんな人のために、使い方をまとめておきました。

この記事のことを覚えておけば、だいたい何とかなると思います。

##表示中のURLを取得する

```ruby
request.url
```

##遷移元のURLを取得する（どこから来たか）

```ruby
request.referer
```

##遷移元のURLに指定したパスが含まれているかどうか
`/users/edit`が含まれていれば、`true`になります。
また、ボッチ演算子「&」を使用しているのは、`referer`が`nil`になる場合があるためです。
（`nil`に対してメソッドを呼び出すとエラーになる）

```ruby
request.referer&.include?('/users/edit')
```

余談ですが、「&」がボッチ演算子と呼ばれているのは、「&」が1人で体育座りをしているように見えることから、そのように名前がついたそうです。

##ルートパスかどうか

```ruby
request.path == "/"
```
ちなみに、ユーザー一覧のパスかどうかは以下で判断できるので、ルートパス以外にも応用できます。

```ruby
request.path == "/users"
```

##オブジェクトのURLを取得する

```ruby
post = Post.find(1)
url = polymorphic_url(post)
```

これで取得できるのは、「https://〇〇.com/posts/1」です。
オブジェクトを渡すと、そのオブジェクトが表示されるときに使用されるURLが返却されます。

以上です！

## あわせて読みたい

[HTMLもわからない初心者が、独学で「投稿型SNSサービス」を作ったって本当？【193日間の死闘】](https://qiita.com/nekojoker/items/2497b4f81ffd1cd7025c)

運営している PlayFab 専用ブログ
https://playfab-master.com
redash5.0.1からOracleに接続できるDockerコンテナを作る

# このページの通りにやってみました
 * https://gist.github.com/linhmtran168/ec0757a487a83a1fc5c5d3188af81874
* 2019/08/31時点で再現するための、Dockerfileなどの変更点をまとめておきます

# pip自体のアップデート処理を追加する

* Dockerfileに次の1行を追加します

```
RUN pip install --upgrade pip
```

# requiments.txt中の OAuthLibのバージョンを上げる

* そのままbuildすると「docker-compose run --rm server create_db」したときにエラーが出てコンテナが起動しません
* https://github.com/getredash/redash/pull/3262

~~Flask-OAuthLib==0.9.3~~
Flask-OAuthLib==0.9.5

# instant-clientのバージョンを合わせる

* https://www.oracle.com/database/technologies/instant-client/linux-x86-64-downloads.html
* もとのDockerfileで指定していたVersion 18系は、今現在18.3ではなく18.5が最新のようなのでそれをダウンロードします
* Dockerfile中で18.3を指定している箇所も18.5に直しておきます

~~18_3~~
18_5

# 実際のDockerfileは下記のようになりました

```docker
FROM redash/base:latest

RUN apt-get update  -y
RUN apt-get install -y unzip
RUN apt-get install -y libaio-dev  # depends on Oracle
RUN apt-get clean -y

# -- Start setup Oracle
# Add instantclient
ADD oracle/instantclient-basic-linux.x64-18.5.0.0.0dbru.zip /tmp/instantclient-basic-linux.x64-18.5.0.0.0dbru.zip
ADD oracle/instantclient-sdk-linux.x64-18.5.0.0.0dbru.zip /tmp/instantclient-sdk-linux.x64-18.5.0.0.0dbru.zip
ADD oracle/instantclient-sqlplus-linux.x64-18.5.0.0.0dbru.zip /tmp/instantclient-sqlplus-linux.x64-18.5.0.0.0dbru.zip
ADD oracle/instantclient-odbc-linux.x64-18.5.0.0.0dbru.zip /tmp/instantclient-odbc-linux.x64-18.5.0.0.0dbru.zip
ADD oracle/instantclient-jdbc-linux.x64-18.5.0.0.0dbru.zip /tmp/instantclient-jdbc-linux.x64-18.5.0.0.0dbru.zip

RUN mkdir -p /opt/oracle/
RUN unzip /tmp/instantclient-basic-linux.x64-18.5.0.0.0dbru.zip -d /opt/oracle/
RUN unzip /tmp/instantclient-sdk-linux.x64-18.5.0.0.0dbru.zip -d /opt/oracle/
RUN unzip /tmp/instantclient-sqlplus-linux.x64-18.5.0.0.0dbru.zip -d /opt/oracle/
RUN unzip /tmp/instantclient-odbc-linux.x64-18.5.0.0.0dbru.zip -d /opt/oracle/
RUN unzip /tmp/instantclient-jdbc-linux.x64-18.5.0.0.0dbru.zip -d /opt/oracle/

ENV ORACLE_HOME=/opt/oracle/instantclient_18_5
ENV LD_LIBRARY_PATH=/opt/oracle/instantclient_18_5:$LD_LIBRARY_PATH
ENV PATH=/opt/oracle/instantclient_18_5:$PATH

# Add REDASH ENV to add Oracle Query Runner
ENV REDASH_ADDITIONAL_QUERY_RUNNERS=redash.query_runner.oracle
# -- End setup Oracle

# We first copy only the requirements file, to avoid rebuilding on every file
# change.
COPY requirements.txt requirements_dev.txt requirements_all_ds.txt requirements_oracle_ds.txt ./
RUN pip install --upgrade pip
RUN pip install -r requirements.txt -r requirements_dev.txt -r requirements_all_ds.txt -r requirements_oracle_ds.txt

COPY . ./
RUN npm install && npm run build && rm -rf node_modules
RUN chown -R redash /app
USER redash

ENTRYPOINT ["/app/bin/docker-entrypoint"]
CMD ["server"]

```

# 参考

* https://qiita.com/nyamada/items/98749dc59bb3e9c50c65
* https://blog.bulkus.net/post/redash_oracle/
reverse-i-search : コマンドの履歴を検索

ターミナルで Ctrl+R(Control と r の同時押し) を入力するとコマンドの履歴を検索できます。

```terminal
$ (Ctrl+R を入力)
(reverse-i-search)`':
```

例えば `git pull` コマンドを実行したい時に Ctrl+R を入力後、p を入力すると `git pull` が候補として出てきました。この例から分かるように、実行したいコマンドの任意の文字を検索してくれます。

```terminal
(reverse-i-search)`': (p を入力)
(reverse-i-search)`p': git pull (Return を入力して実行)
```

ちなみに Ctrl+R を入力後、l を入力しても `git pull` が候補として出てきました。(コマンドの使用履歴に依ります)

```terminal
(reverse-i-search)`': (l を入力)
(reverse-i-search)`l': git pull (Return を入力して実行)
```

もし検索したい文字を入力しても実行したいコマンドが出てこなかった場合は、再度 Ctrl+R を入力すると 次の候補が出てきてくれます。

```terminal
(reverse-i-search)`': (p を入力)
(reverse-i-search)`p': git pull (Ctrl+R を入力)
(reverse-i-search)`p': git push (Return を入力して実行)
```

reverse-i-search を使いこなして爆速で開発をしましょう！
DockerfileのRUNにcurl記述する際の注意点

# 概要
- Dockerfileに基づいてイメージを作成する時に気づいたので、メモしておく。
- ファイルをダウンロードすることを重視。同じcurlコマンドを違うところ（コンテナ内部とDockerfileのRUN）で実行すると結果が異なる

# 前提
## やりたいこと
- Dockerfile の RUN にて yarn のリポジトリファイルを /etc/yum.repos.d に入れる

## 環境
- OS
    - MacOS Mojave 10.14.6
- docker version
    - Docker version 19.03.1, build 74b1e89
- image
    - centos:latest (CentOS 7)


# 検証
## 失敗バージョン
```
RUN curl -LO https://dl.yarnpkg.com/rpm/yarn.repo -o /etc/yum.repos.d/yarn.repo
```
- 結果
    - 指定したファイルダウンロードされていない
    - シェルでコンテナに接続して、同じコマンドでダウンロードできたのに、、、

## 成功（欠点あり）
```
WORKDIR=/etc/yum.repos.d
RUN curl -LO https://dl.yarnpkg.com/rpm/yarn.repo
```
- 結果
    - ダウンロードできた
    - シェルでコンテンに接続すると、最初のディレクトリが /etc/yum.repos.d になってしまう

## 成功（最適？）
```
RUN curl -o /etc/yum.repos.d/yarn.repo -LO https://dl.yarnpkg.com/rpm/yarn.repo
```
- 結果
    - 問題なくダウンロードできた
    - シェルでコンテンに接続して、ディレクトリはホームディレクトリのまま

# 結論
- まだ原因について調べていないが、RUN に curl を実行するとき気をつけないと！
PumaでWARNING: Detected 1 Thread(s) started in app boot がでたときの対処法

## 結論

（大半の場合は）無視してOK。

preloadを指定し、かつ、workersに1より大きい値を指定しているとこの警告が表示される。しかし、ただの警告でしかなく、何もしなくても問題はない。

## この警告がでる理由

Pumaの再起動時に既に存在するスレッドが見つかるとこの警告が表示されるが、そのスレッドがmasterプロセス内のスレッドなのかforkされたプロセス内のスレッドなのかPumaには分からない。

そのため、この警告は「スレッドが見つかった」という文字通りの意味でしかなく、`preload_app!`の指定とworkersに1より大きい数の指定を同時にしていると、必ず表示される無視してもよい警告ということになる。

## 情報元

[! WARNING: Detected 2 Thread(s) started in app boot: - github.com/puma/puma](https://github.com/puma/puma/issues/614#issuecomment-127857639)

["Detected 1 Thread(s) started in app boot" on puma 3.4.0 - github.com/schneems/puma_worker_killer](https://github.com/schneems/puma_worker_killer/issues/35#issuecomment-218302020)
Pythonの仮想環境(py3env)の初期設定について(機械学習用)

今までanacondaを使っていましたが，RStudio等と干渉するためPythonを仮想環境で使用することにしました．
調べながら環境構築を行ったので，備忘録として書いておきます．コマンドシェルはzshを使用しています．

## 使用しているPCのスペック
MacBookAir(2017モデル）
OS：macOS Mojave
プロセッサ：Intel Corei7(2.2GHz)
メモリ：　８GB(DDR3 1600MHz)
グラフィックス：Intel HD Graphics 6000(1536MB)

# Py3envによる仮想環境の作成
最初の仮想環境を作成します．適当なディレクトリで，次のコマンドを実行します．
```Hoge% python3 -m venv ./py3env
```

# 仮想環境の切り替え
作成した仮想環境の bin/activate を実行します
```Hoge% . ./py3env/bin/activate
(py3env) Hoge$
```

仮想環境に切り替えると，環境変数__PATH__が設定され，__python__コマンドや__python3__コマンドで仮想環境のbinディレクトリから実行されます．

仮想環境中では__python__コマンドでも__python3__コマンドでも仮想環境を作成したPythonを起動します.

# パッケージのインストール
機械学習に使用するものをメインにインストールします．

行列・線形代数
__numpy__
```(py3env) Hoge% pip install numpy```

数式処理
__scipy__
```(py3env) Hoge% pip install scipy```

機械学習
__scikit-learn__
```(py3env) Hoge% pip install scikit-learn```

データ操作
__Pandas__
```(py3env) Hoge% pip install pandas```

グラフなどの描画
__matplotlib__
```(py3env) Hoge% pip install matplotlib```

データ解析・機械学習に最適な統合開発環境
__JupyterLab__
```(py3env) Hoge% pip install jupyterlab```

# 仮想環境の終了
仮想環境の使用を終え,通常の状態に復帰するときは,__deactivate__コマンドを実行します
```(py3env) Hoge% deactivate
Hoge%```

# 参考URL
[仮想環境 - python.jp](https://www.python.jp/install/macos/virtualenv.html)
Azure Portal のグループ表示の通信を Fiddler で確認してみた

<b>[Azure Portal > Azure Active Directory > グループ - すべてのグループ]</b> でユーザー一覧を確認することができますが、実際にどのような通信が発生しているのか Fiddler を使って確認してみました。

// すべてのグループの画面 ("business" に該当するグループを検索)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475866/2066eeae-a148-0fef-89e1-a23cf3c46bae.png)

// Fiddler を確認すると、このような通信が確認できました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475866/eb97b135-1b44-6221-6f65-e2dfcb1ed5c8.png)

見づらいですが、右上に select 文で表示する属性値、表示数、検索条件が確認できます。
また、右下では Microsoft Graph (graph.microsoft.com/beta/...) 要求の結果が確認できます。

どのようなクエリが投げられて、どのような検索結果が返されているかが確認できますね。
どんなグループが存在するか通信ログからも確認できる
Macで定期的にジョブを実行する

MacOSでもcronジョブは実行できるようですが、`launchd`の使用が推奨されているようです。
簡単に方法のみまとめておきます。
[こちらの記事](https://qiita.com/rsahara/items/7d37a4cb6c73329d4683)を参考にさせていただきました。

# plistファイルを用意する
エディタで下記の内容を記載して適当に保存します。
毎週日曜日の朝8時にTimeMachineバックアップを作成するという内容です。
plistファイルの配置場所は幾つかあるようです。
適当に選択して適切な所有者・パーミッションを設定します。

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
     <key>Label</key>
     <string>Weekly Backup</string>
     <key>ProgramArguments</key>
     <array>
          <string>/usr/bin/tmutil</string>
          <string>startbackup</string>
     </array>
     <key>StartCalendarInterval</key>
     <dict>
          <key>Weekday</key>
          <integer>0</integer>
          <key>Hour</key>
          <integer>8</integer>
	  <key>Minute</key>
          <integer>0</integer>
     </dict>
</dict>
</plist>
```

# plistを登録する
下記のコマンドでplistを登録します。

```
sudo launchctl load /Library/LaunchDaemons/timemachine.weekly.plist
```

登録されているかは`sudo launchctl list`コマンドで確認します。
本稿の内容で設定した場合、実行結果に「Weekly Backup」の行が出力されれば登録済みとなります。

以上で設定は完了です。
[Golang] 英文を渡すと、単語数とその個数を返す関数をつくってみた

# はじめに
おなじみ、[A Tour of Go/Exercise: Maps](https://go-tour-jp.appspot.com/moretypes/23)の例題をしていて、組んだコードです。
Goの書き方として、セオリーを破ってしまっているかもしれませんが、その場合ご助言頂けると嬉しいです。

なお、この関数の仕様としては、

- 英文限定
- スペースなしで「!」や「.」などの記号が付いていた場合は、別の単語としてカウントされる

という感じですので、ご注意を。

# 今日のコード

```golang:英文から単語数と種類をマップで返す関数
func WordCount(s string) map[string]int {

	words := strings.Fields(s)
	m := map[string]int{}
	count := 0
	
	for _, v1 := range words {
		
		for _, v2 := range words {
		
			if v1 == v2 {
				count++
			}
			
		}
		m[v1] = count
		count = 0
		
	}
	return m
}
```

# 解説

## strings.Fields関数について
いきなり登場する`strings.Fields`関数の解説については、[参考サイト](http://golang.jp/pkg/strings)から引用します。
>Fieldsは、文字列sをひとつ以上の連続したホワイトスペースで分割し、sの部分文字列の配列を返します。sにホワイトスペースしか含まれていないときは空リストを返します。

簡単に言うと、この関数では内部的に`split(" ")`的なことをして、配列化しているんですね。
たったこの1行で、単語ごとに切り分けて配列等に格納する作業は完結します。

便利！

## 2重ループで回す
見ての通り、この関数は2重ループが仕込まれています。
１つ目のループでは、先ほど`srings.Fields`関数で単語単位に切り分けられて、配列格納された`words`変数の値を１つずつ呼び出します。
2つ目のループで、単語1つ1つをお互いに比較させます。
2つ目のループが一巡するたびに、`count`変数は初期化されるため、「数えすぎ問題」に対策してます。

## return m
最後に、単語と数をまとめたものを、マップとして返しています。

## 実行の一例

```golang:実行例
package main
import (
    "fmt"
    "strings"
)

func WordCount(s string) map[string]int {

	words := strings.Fields(s)
	m := map[string]int{}
	count := 0
	
	for _, v1 := range words {
		
		for _, v2 := range words {
		
			if v1 == v2 {
				count++
			}
			
		}
		m[v1] = count
		count = 0
		
	}
	return m
}

func main(){
    fmt.Println(WordCount("I have a pen"))
}
```

```console:出力結果
map[I:1 a:1 have:1 pen:1]
```

# 最後に
あまり複雑な流れではなかったので、サクッとした解説になってしまいました。
また、間違えているところ等ありましたら、ツッコミもらえると嬉しいです。
最後まで、ありがとうございました。
Go - メソッドとレシーバ

# 目的
メソッドについて理解する
値レシーバとポインタレシーバについても理解する

# メソッドとは
レシーバを持つ関数のこと
下のコードでは (s Square)がレシーバ
Square型の構造体sのレシーバを使って、メソッドを定義している

```go:レシーバを作る
// 四角形の構造体とそれの面積を求めるメソッド

type Square struct {
  width  float64
  height float64
}

func (s Square) Area() float64 {
  return s.width * s.height
}
```

#メソッドを使う
メソッドはレシーバで登録した構造体の変数から呼ぶことができる
下の例ではSquare型の変数が呼んでいる

```go:メソッドを使う
package main

import (
  "fmt"
)

type Square struct {
  width  float64
  height float64
}

func (s Square) Area() float64 {
  return s.width * s.height
}

func main() {
  square := Square{3.0, 4.0}
  fmt.Println(square.Area())
  // output: 12
}

```

# ポインタレシーバとは
今まで見てきたコード内で登場したレシーバは値レシーバという
ポインタレシーバはその名の通りレシーバの引数にポインタを持つ

##二つの違い
ポインタレシーバ：ポインタとして引数で渡すので、関数内でオブジェクトの値を変更できる
値レシーバ：元の値とは別のコピーした値が関数に渡されるので元の値は変更はできない

以下のコードでは四角形の形を長方形の性質を保ったまま変形させるメソッドを作っている
下の例のmain関数では、Square型の変数をポインタに変えて、その後ポインタレシーバのメソッドを呼び出している

```go:ポインタレシーバを使う
package main

import (
  "fmt"
)

type Square struct {
  width  float64
  height float64
}

func (s *Square) Reshape(w float64, h float64) {
  s.width = w
  s.height = h
}

func main() {
  square := Square{3.0, 4.0}
  fmt.Println(square)
  // output: {3 4}

  (&square).Reshape(5.0, 6.0)
  fmt.Println(square)
  // output: {5 6}
}

```

#補足
上のソースコードでは、ポインタレシーバで定義されたメソッドを使うために、Square型の変数をわざわざポインタに変換していた
実はそんなことしなくても、square.Reshape(5.0, 6.0)でよい



#いつポインタレシーバを使うか
もう一度二つの違いを確認しておく
ポインタレシーバ：ポインタとして引数で渡すので、関数内でオブジェクトの値を変更できる
値レシーバ：元の値とは別のコピーした値が関数に渡されるので元の値は変更はできない

**つまりその構造体型のデータの値を変えたい時にポインタレシーバを使う**

あともう一点は
**レシーバに渡す構造体がメモリ上で大きい領域を占めている場合にポインタレシーバを使う**
値レシーバでコピーを渡す場合、その大きなものをメモリ上の別の領域にコピーしてから、そのコピーしたものを渡す必要がある
一方ポインタレシーバではコピーなどせず、そのデータのメモリ上でのアドレスを渡すだけでいいのでメモリにやさしい

#参考文献
[A Tour of Go](https://tour.golang.org/methods/1)
MongoDB⇒ElasticSearchへの自動連携

#はじめに
全文検索といえば、ElasticSearchはよいですね。
MongoDBとElasticSearchは似ている部分があります。特にドキュメント形式でMongoDB⇒ElasticSearchに自動同期もしやすいです。
mongo-connector、monstacheなどの自動同期のツールがあります。

#MongoDBとElasticSearchの比較

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/e5cf91ba-451c-d283-682d-442ef4399adf.png)


図はdb-enginesからのものです。
https://db-engines.com/en/system/Elasticsearch%3BMongoDB

#自動連携ツール
## 1. mongo-connector
URL: https://github.com/yougov/mongo-connector
言語： Python 3.4+ 
MongoDBバージョン：3.4、3.6.

MongoDB向けの説明：
https://github.com/yougov/mongo-connector/wiki/Usage%20with%20MongoDB

## 2. monstache
リアルタイムで同期できるツールです。

URL： https://rwynn.github.io/monstache-site/
GitHub URL:　https://github.com/rwynn/monstache
言語：　Go
MongoDBバージョン： 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/b3f770ee-84fe-2004-7123-dedee706bfbc.png)

細かいパラメータは下記のページにあります。
https://rwynn.github.io/monstache-site/config/

とくにドキュメントのサイズは、elasticsearch-max-bytesパラメータで制御され、デフォルトは8MBです。ドキュメントのサイズを8MB超えると同期されないので要注意です。

## 3. node-mongodb-es-connector
URL: https://github.com/zhr85210078/node-mongodb-es-connector

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/346425/56c0c4c7-20ff-a6fd-8d23-cc7c13a0918c.png)

図は下記にあります。
https://github.com/zhr85210078/node-mongodb-es-connector/blob/master/test/img/structure.jpg

いま時点の対応バージョン：
elasticsearch: v6.1.2
mongodb: v3.6.2
Nodejs: v8.9.3

## 4. Logstash
参考記事：Logstash Plugin and Logstash configuration to sync MongoDB data Into elastic-search
https://medium.com/@shukla.devbrat1993/logstash-plug-in-and-logstash-configuration-to-sync-mongodb-data-into-elastic-search-400d88e6a180

## 5. そのた
必要なデータのみElasticSearchに投入したい場合、またはIndexの中身を加工したい場合は、データ新規、更新、削除のとき、ElasticSearch　Clientを利用してElasticSearchに投入してもよいです。

以上
WordPress Contact Form 7でフォーム送信時、Ajaxで非同期送信できない時の解決法

# 背景
- WordPressで記事LPを実装するために、フォーム送信をトリガーに、広告発火タグを仕込みたい

# 課題

- Contact Form 7でフォームを送信時、一般的にはAJAXで非同期でフォームが送信される
- 送信後、コンタクトフォームが #wpcf7-f123-o1 のような見慣れないコードが後ろについた URL にリダイレクトされる
- なぜか非同期ではなく、毎回リロードされるようになってしまった
- シークレットモードで実行すると、問題なく非同期で送信可能

# 原因

- フォームの送信の際、refillが行われる。その際キャッシュが残ってしまうことで、AJAX送信にエラーがでる。
- Contact Form 7 でキャッシュを持たないようにしてあげる必要がある

# 解決策

- 以下のソースコードを、footer部分に実装することで解決した

```HTML
<script type="text/javascript">wpcf7.cached = 0; </script>
```

# 参考

- https://www.sertmedia.com/how-to-disable-contact-form-7-refill/
- https://contactform7.com/ja/faq/after-submission-my-contact-form-redirects/
CSS after,before要素が親要素からはみ出すときの対処法

CSSにおいてレスポンシブデザインにするときにafter,before要素を使用するときにブラウザ幅を変更したときに要素が親要素を飛び出してしますことがある。


例えば
~~{position:absolute;
   top:10px;
   left:10px;}
にしたときは子要素から親要素がはみ出すことがあるが、

これに対する対処法としては
~~{position:absolute;
   top:10px;
   left:100%;}
にすると親要素から飛び出すことがなくなり、しっかりとおさまるようになる。

レスポンシブデザインを意識せずにコーディングしているときは気づかなかったが、positionプロパティをレスポンシブデザインで使用するときは意識していきたい。
Thunderbird リモートコンテンツを常に許可させる。

## ①about:configを開く
**オプション**→**詳細**→**設定ディタ**
![スクリーンショット 2019-08-31 16.48.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112460/1d227389-f54b-c464-1f47-0ad3880caee9.png)
## ②設定リモートコンテンツを常に許可させる
**mailnews.message_display.disable_remote_image**の値を**false**に変更。
![スクリーンショット 2019-08-31 16.56.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112460/ccdc90f2-b05c-1db7-7f88-aa79b64df54d.png)
カウントダウンタイマーを表示する

資格試験まであと何日・・・のように表示させたくて、カウントダウンのメモ。

> jQuery Countdown
> http://keith-wood.name/countdown.html

参考：
- [jQuery Countdown を使ってカウントダウンタイマーを表示する]
(http://bashalog.c-brains.jp/10/09/22-145004.php)
- [カウントダウン]
(https://qiita.com/mczkzk/items/4a62a07e4f15310cf938)

ほかのはどうかな？：
- [Moment.js]
(https://momentjs.com/)
wget でnode/ npm のインストール

# やりたいこと
- node/ npm 最新版or安定版のインストール

私のサーバ環境だと、```npm install -g n```でnpm をアップデート出来ずに削除だけがされてしまい、npm が更新できなかった。

無理やり、CentOS7 へ入れてしまおう！

# ダウンロード
[node.js公式](https://nodejs.org/ja/download)にて、URLはご確認ください。
現時点20190831では以下が最新バージョンとなります

```
# wget https://nodejs.org/dist/v12.9.1/node-v12.9.1-linux-x64.tar.xz
# tar -xvf node-v12.9.1-linux-x64.tar.xz
```

ダウンロードと解凍が終了

# インストール
- nodeファイルを移動させる
- その後(必要かわからないのですが、恐らく)configure を動かす

```
# cp node-v12.9.1-linux-x64/bin/node /bin/node
```

# バージョン確認

```
# node -v
v12.9.1
# npm -v
6.9.0
```

# 最後に削除！
- ダウンロードしたファイル・解凍したフォルダを削除

```
# rm -R node-v12.9.1-linux-x64
# rm node-v12.9.1-linux-x64.tar.xz
```

# 終わり
ちょっと無理やりやったのでは、と不安です。
でも、node も npm も動くようになったので、私はこれで良しとします。
オンプレAD のアカウント無効化がどのように Azure AD に連携されるのかを確認してみる

オンプレAD でユーザーアカウントがロックアウトされたり、ユーザーアカウントを無効化とすると、Azure AD 上の同期ユーザーも認証が行われなくなります。

その具体的な動作をまとめました。

#####1. オンプレ AD でユーザー アカウントがロック アウト or 無効化される
<img width="400" alt="pic14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475866/9234ed65-f62e-80f7-27dc-38c782640829.png">


#####2. AADC の同期によって、無効化状態が Azure AD に連携されます。
Synchronization Service Manager で同期処理されるユーザーを確認すると、<b>userAccountControl</b> が <b>”514”</b> として連携されていることが確認できます。
<b>512 (NORMAL_ACCOUNT) + 2 (ACCOUNTDISABLE) = 514</b> ということ。
<img width="400" alt="pic15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475866/0f2fbd0a-3079-1c64-f582-5b22be3e568e.png">


https://support.microsoft.com/ja-jp/help/305144/how-to-use-useraccountcontrol-to-manipulate-user-account-properties
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475866/d5970048-fad6-4419-740f-179c6bf3987b.png)

#####3. Azure AD 上の同期ユーザーの accountEnabled 属性が “False“ に設定される
上記の AADC の同期処理によって、Azure AD 上の同期ユーザーの属性 <b>"accountEnabled"</b> が <b>True -> False</b> に変更されます。
Azure ポータル上で対象のユーザー アカウントを確認すると、<b>“サインインのブロック”  - “はい”</b> に変更されていることが確認できます。
<img width="300" alt="pic16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475866/c9d6332c-3378-4e27-edb5-f4d23d8112d9.png">
Spacemacsの「(Spacemacs) Warning: tern binary not found!」に対応する

なんだか最近，

```lisp:*message*
(Spacemacs) Warning: tern binary not found!
```

こんな警告がでる。
もしかしてJavaScriptモード使ってませんか？
内部でternというモジュールを使っているようです。

もしTerminalで

```bash:bash
which tern
```
をして何も表示されなければパターン1かな？
ternをインストールしないとなのでTerminalで，

```bash:bash
npm install --global tern
```

をする。パターン1はそれで終わりだとおもう。


パターン2として，which ternで，パスが帰ってきたら環境変数引き次がうまく言っていないので

```
dotspacemacs-additional-packages
```

に

```
exec-path-from-shell
```
を追加して，

```
dotspacemacs/user-init ()
```

に

```
(when (memq window-system '(mac ns))
  (require 'exec-path-from-shell)
  (exec-path-from-shell-initialize))
```

を書きましょう。たぶんそれでいける。
melpaなのでrequireいらないかもしれない。
Spacemacsの起動時エラー「Failed to download ‘gnu’ archive.」を解決する

最近なんかSpacemacsの起動が遅く感じるようになったので起動時のメッセージをみてみた。
そしたら，いつからかわからないけどSpacemacsが起動時にこんなエラーをはくようになった。

```
Failed to download ‘gnu’ archive.
```

どうやらgnuアーカイブスがTLS1.3になって，そのままでは繋がらなくなったみたい。

user-initに書きを一行かいて再起動しよう。

```
(setq gnutls-algorithm-priority "NORMAL:-VERS-TLS1.3")
```

emacsも時々メッセージをみてメンテしてあげないとだめね。
netstat に関する最低限の知識

自分用メモ。

# netstat とは

netstat はネットワークの接続状況などを表示するコマンドで、
LISTEN してる port を調べたりするときに使う。

# 最低限抑えておきたいのオプション

| オプション | 説明 |
|:---|:---|
|-a|現在のすべてのソケット状態を表示|
|-n|ネットワークアドレスを名前解決せず、数字で表示|
|-p|表示するプロトコルを指定する|
|-r|ルーティング・テーブルを表示|

# 使ってみる

grep と組み合わせて特定の port の状態を調べる。
今回は、9000番 port の状態を確認。

```sh
$ netstat -an -p tcp | grep 9000
tcp46      0      0  *.9000                 *.*                    LISTEN
```

これにより、 9000番 port が LISTEN していることが確認できる。

# 参考

- [netstat - ネットワークの接続状況を表示 - Linuxコマンド](https://webkaru.net/linux/netstat-command/)
- [Linuxのポート状況を確認する(netstat)](https://www.linuxmaster.jp/linux_skill/2009/02/linux-4.html)
- [特定のポート番号をLISTENしているプロセスが知りたい](https://qiita.com/cubicdaiya/items/003e36e17519ef32ac8a)

# おしまい