OmniAICreator/Qiita-1.07M huggingface dataset:
Rails::ViewをDRYにしたい人へ

# ViewをもっとDRYにするために

この間開発しているサービスのリファクタリングを始めていた、
Best practiceもいろいろさがしたが、おもにhelperをつかってViewの再利用性を高めろてことだった

> まあー、実際にためしてみようか

## 構成

`Rails::View + Slim + Rails::Helpers + Rails::Partial`とくにほかのフレームワークはいれたくない最低限の状態からどれぐらいできるかの検証である

主に、三つもパターンが思いついたので検証と実用性を見てみる

> 主に再利用される部分の整理を着目する

* Helperに全部よせる
* Partialに全部よせる
* HelperとPartialを合わせて利用する

### ViewHelper

```ruby
# Helper.rb
module Test
    def  form message
        content_tag :div, class: 'body' do
            concat message
        end
    end
end
```

```slim
// View.slim
.html
    = form @message
```

見た目的には問題ないようだが、問題ありありだった

```ruby
# NG
def Test messages
    Content_tag :div do
        concat 'hi'
        mesages.each do |m|
            concat li_tag m
        end
    end
end
```

ループで、親のタグに着くと思われると思うが期待通りの動きはしない
`each`に`return`するだけで親には`return`してない問題点があると思ってreturn追加して見てもタメ

解決はloopを外に持ち出して、変数に割り当てる

#### 実用性

HelperでDRYにはなるが、このコード見てrenderされてタグがイメージできる？

実用性ほぼ皆無

### Partial

```slim

// View.slim
.html
    - @params.each do |param|
        = render partial: 'view/test', locals { param: param}
    
```

```slim

// view/_test.slim
.body
    = param.message
    
```

なかなか、部分的に分けられて見た目もよくなったな
部分的にする事で、親のファイルが膨大に慣れない

でも、`@value`とかが散らばっているな
どこでどれが宣言されているかもわかりずらいしな

#### 検証

なかなかいいやり方だし、部分的にすることでファイル構成も綺麗に階層にできる。でも、変数の宣言と使い道が直感的じゃない。チーム開発に障害与えそうな気がする

### HelperとPartialの併用

ViewはViewで、RubyはRubyコードで管理して欲しいな
実現すると、単体的に分解できるようになりどれを置き換えてもそこまで問題になれない
Component化だな...

```ruby
# helper.rb
module Test
    def forms
        @params.each do |param|
            form param
        end
    end

    def form param
       render partial: 'view/test', locals: {
            param: param
            message: param.message
        }
    end
end
```

```slim
// View.slim

.html
    .body
        = forms
```

```slim
// view/_test.slim
.form
    = message
```

ControllerがViewを呼び出したときに、実はView::Helperも一緒に呼び出している。 なので、インスタンス変数も参照可能な状態になっている

#### 検証

Viewは、必要なパラメータを表示するだけでいいし
Helperは、parseの役目を果たしている

もし、フレームワークが変わったとしてもファイルじたいは違う形で変数を受け取ればよくなるし、変数の処理もrbファイルの中で済ませるもで、リファクタリングがしやすくなる。

Controllerで、パラメータの処理を一箇所でやる必要もなくなる。Modelでやればいいじゃんと思ってる人も多いと思うが、現実は厳しいなのだ

ただし、全部言い訳ではない。ファイルが増えることと、対応関係の問題が多く発生する。ちゃんとしたドキュメントがないとかなり厳しい

## 結果

個人的には、3番が一番すぎなのだが、チーム開発になるとかなり諸刃の剣になる。
ModelからViewまで、全部一人でやりますと言った場合は進めします、ドキュメントもファイルこと書けばすぐ書けそうだし

> 2番は無難に使いやすいかな、1番はないな


> まあー、まだ探検中なので、まだいいのあれば書きます☺️
LoadPicture関数が返すオブジェクトは？

VBScriptで次のように画像のオブジェクトを読み込むことができます。

```VisualBasic

Dim obj
Set obj = LoadPicture("sample.jpg")

MsgBox CStr(obj.Width)
MsgBox CStr(obj.Height)
MsgBox CStr(obj.Type)

```

このコードで得られるobjオブジェクトの型は、[IPicture](https://msdn.microsoft.com/ja-jp/library/windows/desktop/ms680761.aspx) インターフェイスをインプリメントしたもののようです。

[Eternal Windows](http://eternalwindows.jp/ole/oledraw/oledraw03.html)に、少々情報があります。
左右のボタンを押すと画像がフェードインで切り替わるjquery

# 左右のボタンを押すと画像がフェードインで切り替わるjquery

- 非エンジニアのデザイナーが使うので、CSS側と絡んで調整できるように

```html:HTML
<div class="charaContainer">
  <!-- 矢印 -->
  <div class="btnBox">
    <p class="_prev">ボタン左</p>
    <p class="_next">ボタン右</p>
  </div>
  <!-- 切り替える画像 -->
  <div class="charaBox">
    <ul>
      <li class="hoge on"><img src="" width="" height="" alt=""></li>
      <li class="hoge"><img src="" width="" height="" alt=""></li>
      <li class="hoge"><img src="" width="" height="" alt=""></li>
    </ul>
  </div>
</div><!-- /charaContainer -->
```

```js:jquery
  jQuery(function($){
  });
  $(function(){
   $('.hoge').on('click', function(){
    if ($(this).hasClass('on')) return;
    var idx = $(this).index();
    $('.hoge').removeClass('on');
    $('.hoge').eq(idx).addClass('on');
  });

   $('._prev, ._next').on('click', function(){
    var curr  = $('.hoge').filter('.on').index();
    var to = $(this).hasClass('_prev') ? curr - 1 : curr + 1;
    var elem;
    if (to < 0) {
      elem = $('.hoge:last');
    } else if ($('.hoge').length <= to) {
      elem = $('.hoge:first');
    } else {
      elem = $('.hoge').eq(to);
    }
    elem.trigger('click')
  });
 });
```

```css:css
.charaBox ul li{
  opacity: 0;
  duration: 1s;
}
.charaBox ul li.on{
  opacity: 1;
}

/* 画像とかボタンの見た目CSSはイイカンジに！ */
```

liにonが付くので、opacityなりで切り替わりエフェクトを使いましょう。
一列に並べてスライドさせるもよし、フェードインさせるもよし。
(ここではフェードイン。)
Asp.net WebformsでPostBack時に画面の表示位置を元に戻す

PostBackすると、スクロール位置が一番上に戻るので、下にスクロールしていた場合は、ユーザビリティが悪くなります。

（ドロップダウンメニューをポストバックで動的に生成する場合など）

PageディレクティブのMaintainScrollPositionOnPostback属性で、ポストバックで元の位置に戻すかどうかを指定できます。

```csharp
<%@ Page Language="C#"  MaintainScrollPositionOnPostback="true" %>
namelistをなかなか読み込まないときの裏技

fortranにはnamelistという、設定値を外部ファイルから読み込む機能がある。しかしなぜかコンパイラによって読み込み方に癖があり、なかなか読み込んでくれずに困ることがある。そんなときの対処法。

##別のコードを作って書きだす
namelistは読み込むだけでなく、書きだすこともできる。なので「namelistを作るためのプログラム」を組んで書き出せば、機械的に確実な方法で書き出してくれるので読める。

```fortran:gen_nml.f90
program main
   implicit none
   double precision :: xx = 1d0
   double precision :: yy = 2d0
   double precision :: zz = 3d0
   namelist/mylist/  xx,yy,zz

   open(221,file = 'mylist.in')
   write(221,nml=mylist)
   close(221)
end program main
```
ただし、この方法では既存の大規模コードに投入するnamelistを作るとき、いちいち既存のコードを読んで、設定値を書かないといけないという面倒くさいところがある。しかもfortranなので当然コンパイルしてから実行しないといけない。

## pythonのライブラリ「f90nml」で変換する
「すでにmylist.inというファイルを作っていてそれを読ませたいけど読んでくれない」ということはよくある。このときいちいち別のfortranコードを書くのはあまりに面倒くさすぎる。

そこで裏技だが、pythonのnamalistを読むライブラリ「f90nml」を使う。pipでもインストールできるライブラリで、fortranのnamelist形式のファイルを読んでdict型変数に格納する機能、書き出す機能がある。f90nmlの読み込み機能は結構優秀で、素直に読んでくれる。

なので、f90nmlを使って読み込んで書き出せば、大体fortranでも読んでくれる形のファイルが出てくる。

```python:arrange.py
import f90nml

mylist = f90nml.read('mylist.in')
mylist.write('new_mylist.in')
```

##それでも読めない場合
それでも読めない場合、値が間違っていることがある。
例えば型の誤り（integer型にlogical型を代入している[^1]）が起こっている場合でもnamelistエラーが出るので、値をよくよく確認してみる。


[^1]: 信じられないことだが、職業プログラマですら「C言語でできるから」とlogical型に0を代入していたりすることがある。
'nvm is not compatible with the npm config "prefix" option' と言われた


## 原因

NVM_DIRが参照しているパスがシンボリックリンクだと上記のようなエラーが出てしまうらしい。
今回、nvmをインストールしたユーザの$HOMEが通常と異なるディスクに設定されていてシンボリックリンクとなっていたために発生していた。

参考: https://github.com/creationix/nvm/issues/1385

## 対応

とりあえず、NVM_DIRにシンボリックリンクが参照しているオリジナルのパスを設定してあげれば良いらしい。

なので、通常 nvm をインストールした際に追加される `.bashrc`（環境によってファイルは異なる）の `NVM_DIR` 環境変数を設定している箇所を以下のように修正

```diff:~/.bashrc
- export NVM_DIR="$HOME/.nvm"
+ export NVM_DIR="$(readlink -f $HOME)/.nvm"
```

## 参考リンク

* [Adding descriptions about symlinks in the 'nvm is not compatible with the npm config "prefix" option' error · Issue #1385 · creationix/nvm · GitHub](https://github.com/creationix/nvm/issues/1385)
* [readlink コマンド | コマンドの使い方(Linux) | hydroculのメモ](https://hydrocul.github.io/wiki/commands/readlink.html)
Fetch API 実用例

fetchは他ライブラリの様にエラー処理・レスポンス処理が簡素化されてないので、ちょっとしたラッパーを作ると以後、他ライブラリを使うのと同じようなレベルで扱える。

```js

function fetchWrapper(urlString, options) {

    return fetch(urlString, options)
    .catch(err => {
      // corsエラー、networkエラー等、そもそもサーバへ本リクエストする以前のエラー
    　　　　console.log("CLIENT-ERR :", err)
      throw new Error("アクセスできません、時間を置いてお試しください")
    })
    .then(response => {
      // レスポンスのヘッダを処理したい場合はここで
      for (const pair of response.headers.entries()) {
        // console.log(" RES-HEADER: ", pair[0]+ ': '+ pair[1])
      }
      // 返り値はpromiseになってるので展開する
      const responseBodyPromise = response.json()
      return responseBodyPromise.then(body => ({ body: body, responseOk: response.ok }))
    })
    .then(({ body, responseOk }) => {
      // ここで正常なリクエスト完了だと判定
      if (responseOk) {
        return body
      }
      // サーバとのやりとりが出来ている40x系、50x系はここ
      console.log("SERVER-ERR :", body)
      throw new Error(body || "リクエストに失敗しました")
    })
}

```


## 使う

```js
// Headers
const headers = new Headers()
headers.append("Content-Type", 'application/json')

// CORS（クロスドメイン通信）を使う場合かつCookie等をリクエストに含める場合
const corsOptions = { mode:'cors', credentials:'include' }

// Fetch API Options
let options = { headers }
// GET
options = { ...corsOptions, method:'get' }
// or POST
options = { ...corsOptions, method:'post', body:JSON.stringify(someObj) }

// Request
fetchWrapper('https://some/json', options)
.then(body => {
  // リクエスト完了
  console.log("REQUEST-SUCCESS: ", body)
  // 処理続く...
})
.catch(err => {
  // 何らかのエラーが起きた
  console.log("REQUEST-FAILED: ", err)
  alert(err.message)
})

```


## 前提

* jsonのやりとり
* たぶんes2015くらい
* polyfillで未対応ブラウザへ対応する(FetchだけでなくてHeadersで必要になる場合あり)

  ```
  $ npm -i -S whatwg-fetch
  // or
  $ yarn add whatwg-fetch
  ```
翻訳されたページとしてのURL

#はじめに

外国のサイトが翻訳された状態でURLを誰かに共有したい！
という事がありましたので、そういう方が他にもいればと思い、
筆をとりました。

最近は英語のページを丸ごと翻訳してくれて便利ですよね。
昔は（ノスタ中ではないです）Excite翻訳とかでチマチマ翻訳して活用してました。
さらに多言語対応しているサイトとかは凄いなと思います。


#手順

手順は簡単で、お目当てのURLの前に、
以下テキストをくっつけます。


```
http://translate.google.com/translate?langpair=en%7Cja&hl=en&u=お目当てのサイトURL

```

パラメーター的には

```
langpair=en%7Cja
```

英語から日本語へ！

```
hl=en
```

英語サイトという所でしょうか。



英語ページを翻訳したwikiです。（ややこしい）


http://translate.google.com/translate?langpair=en%7Cja&hl=en&u=https://en.wikipedia.org/wiki/Main_Page

Yahoo の日本ページも英語で読めます。

http://translate.google.com/translate?langpair=ja%7Cen&hl=ja&u=https://yahoo.co.jp/

#終わりに

ただ、リンク先は遷移出来たりできなかったりで、
うまくいかないサイトもありますので、知っている方がいらっしゃったら
ぜひご教示いただけると嬉しいです！
WorkMailをケータイ(というか他のメーラー)で受信出来るようにする方法

独自ドメインのメール設定を手軽にWorkMailで行ったものの、WorkMaikをいちいち起動しないと利用出来ないのはつらいので、スマホで受信して利用したい！
と思った調べてみたときのメモ。

参考：
[[新機能]Amazon WorkMailがSMTPプロトコルをサポート](https://dev.classmethod.jp/cloud/aws/amazon-workmail-smtp-support/)

※最近までは出来なかったっぽい

ポイントは、自分のリージョンのIMAPとSMTPのサーバ情報を調べるところ。
[Connect to your IMAP Client Application](http://docs.aws.amazon.com/ja_jp/workmail/latest/userguide/using_IMAP_client.html)

調べると言っても

IMAPサーバ
**imap.mail.リージョン.awsapps.com**

SMTPサーバ
**smtp.mail.リージョン.awsapps.com**

そして、WorkMail自体が
**us-west-2**(オレゴン)
**us-east-1**(バージニア北部)
**eu-west-1**(アイルランド)
しか無いからそこまで大変ではない。

あとiOSのメーラーだとSMTPのSSL利用のポートは465じゃないと送信出来なかった。
どこかのサイトに理由が書いてた気がするけどめんどくさくて読むのをやめた(爆
IMAPのSSL利用のポートは993。

おそらくどのメーラーもこれで設定出来るはず。
【備忘録】NewRelic Infrastructure 各OSデーモンの 起動、停止、再起動、ステータス確認方法




### SystemD (CentOS 7、Debian 8、RHEL 7、Ubuntu 15.04 以上):

```
sudo systemctl <start|stop|restart|status> newrelic-infra
```

### System V (Debian 7):
```
sudo /etc/init.d/newrelic-infra <start|stop|restart|status>
```

### Upstart (Amazon Linux, CentOS 6、RHEL 6、Ubuntu 14.10 以上)
```
sudo initctl <start|stop|restart|status> newrelic-infra
```
  
  
  
    
  

[本家サポートサイト（英語）](
https://docs.newrelic.com/docs/infrastructure/new-relic-infrastructure/configuration/start-stop-restart-check-infrastructure-agent-status)  

 
[日本語 代理店サイト](
https://newrelic.degica.com/docs/infrastructure/new-relic-infrastructure/configuration/start-stop-restart-check-infrastructure-agent-status)
Slideshare > UI > 全シートを一覧できない?

https://www.slideshare.net/NVIDIA/top-5-deep-learning-and-ai-stories-october-6-2017-80543540


自分がSlideshareをたまにしか見ない理由の一つは「全スライドを一覧できない」という点。
どこかにUIとして用意されているのかもしれないが、見つからなかった。
(タイムラインの上を左右に動かすことで表示されるUIは使いにくい)。

https://www.clearnotebooks.com/ja/notebooks/554052
のようにスライドを一覧できる機能があれば、探したい図を見つけやすくなるのに、と思う。

そうなった場合でも、「あの図」という思いつきで該当の図を1分以内で見つけられない。
キーワード検索にてひっかかるような仕組みがやはり必要だろうか。

Youtubeの動画もそうで、一度見た動画で「あの図、あの式」という思いつきからそのタイムスタンプへ到達するには、テキストリンクなどのワンステップが必要となる。

Youtubeで式の証明を説明するよりも、PDFで配布した方が学習者にとっては役に立つかもしれないとも最近は思う。
WindowsAnimationManagerの利用

暇時間に学習しました。WindowsAnimationManagerの機能として、変数の時間変化を定義してやって、時間を入力とし、そのときの変数値を出力する、があります。

Win32APIのプログラミングだと、メッセージループにいわゆるゲームループを追加して、一定時間ごとの処理を並行処理するのが定石、みたいなところがありますので、時間離散な処理の実装方法として役に立つかもしれません。

以下、MSDNによるところのAppDrivenの実装形式の要点を抜き出しました。

### WindowsAnimationManagerの初期化
COMとして実装されてます。

```
  HRESULT hr;
  hr=CoCreateInstance(CLSID_UIAnimationManager, NULL, CLSCTX_INPROC_SERVER,
                      IID_PPV_ARGS(&m_pAnimationManager));
  hr=CoCreateInstance(CLSID_UIAnimationTimer, NULL, CLSCTX_INPROC_SERVER,
                      IID_PPV_ARGS(&m_pAnimationTimer));
  hr=CoCreateInstance(CLSID_UIAnimationTransitionLibrary, NULL, CLSCTX_INPROC_SERVER,
                      IID_PPV_ARGS(&m_pTransitionLibrary));
```

### 変数の"宣言"
m_pAnimationVariableという名の変数を初期値=0.0, 最小値=0.0, 最大値=1.0で設定します。

```
  IUIAnimationVariable *m_pAnimationVariable;
  hr=m_pAnimationManager->CreateAnimationVariable(0.0, &m_pAnimationVariable);
  hr=m_pAnimationVariable->SetLowerBound(0.0);
  hr=m_pAnimationVariable->SetUpperBound(1.0);
```

### 値の"代入"

Storyboardというのを作ってやり、それに値の変化を設定します。
変化を定義する関数は色々あるのですが、ここではAccelerateDecelerateTransitionを使用しています。
各種遷移のライブラリは、後掲します。
最後に、Schedule()を使ってStoryboardに開始時刻(=現在時刻)を設定して"代入"の完了です。
UI_ANIMATION_SECONDSは、typedef doubleで、単位は秒です。

```
  const UI_ANIMATION_SECONDS DURATION=0.5;
  const double ACCELERATION_RATIO    =0.5;
  const double DECELERATION_RATIO    =0.5;
  
  IUIAnimationStoryboard *pStoryboard;
  m_pAnimationManager->CreateStoryboard(&pStoryboard);
  
  IUIAnimationTransition *pTransition;
  m_pTransitionLibrary->CreateAccelerateDecelerateTransition(DURATION, value/100.0, ACCELERATION_RATIO, DECELERATION_RATIO, &pTransition);
  
  pStoryboard->AddTransition(m_pAnimationVariable, pTransition);
  pTransition->Release();
  
  UI_ANIMATION_SECONDS secondsNow;
  m_pAnimationTimer->GetTime(&secondsNow);
  pStoryboard->Schedule(secondsNow);
  pStoryboard->Release();

```

### 値の"参照"

時間経過の設定は、初期化時に作成したAnimationManager側におこないます。
AnimationManagerのステータスがBUSYでなくなったら、設定されたStoryboardの動作が完了してます。
宣言した変数m_pAnimationVariableの経時変化値は、GetValueで取り出せます。

```
  UI_ANIMATION_SECONDS secondsNow;
  m_pAnimationTimer->GetTime(&secondsNow);
  m_pAnimationManager->Update(secondsNow);
  
  m_pAnimationVariable->GetValue(val);

  UI_ANIMATION_MANAGER_STATUS status;
  m_pAnimationManager->GetStatus(&status);
  if(status!=UI_ANIMATION_MANAGER_BUSY){
    ...
  }
```

###遷移ライブラリ
代入即完了
![](https://i-msdn.sec.s-msft.com/dynimg/IC276890.png)
変化なし
![](https://i-msdn.sec.s-msft.com/dynimg/IC276887.png)
遷移パターン
![](https://i-msdn.sec.s-msft.com/dynimg/IC276889.png)
![](https://i-msdn.sec.s-msft.com/dynimg/IC276891.png)
![](https://i-msdn.sec.s-msft.com/dynimg/IC276892.png)
![](https://i-msdn.sec.s-msft.com/dynimg/IC276897.png)
![](https://i-msdn.sec.s-msft.com/dynimg/IC303104.png)
![](https://i-msdn.sec.s-msft.com/dynimg/IC276886.png)
![](https://i-msdn.sec.s-msft.com/dynimg/IC276895.png)
![](https://i-msdn.sec.s-msft.com/dynimg/IC276888.png)
![](https://i-msdn.sec.s-msft.com/dynimg/IC276893.png)
![](https://i-msdn.sec.s-msft.com/dynimg/IC276894.png)
Angular2で各ページにgtagを埋め込んで動かす方法

Angular2でGoogle Analyticsにデータ送信しようと思ったところ、いろいろ躓いたのでメモ。

まずAnalyticsで表示されるトラッキングコードがgtagになっててびっくり。(2017年10月)
```
<!-- Global Site Tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-XXXXXXXXX-1"></script>
<script>
    window.dataLayer = window.dataLayer || [];
    function gtag(){dataLayer.push(arguments)};
    gtag('js', new Date());
    gtag('config', 'UA-XXXXXXXXX-1');
</script>
```

今までga関数だったのが最近変更になった模様。
[Web制作者がgtag.jsで知っておきたいGoogleアナリティクスの今](http://www.kagua.biz/help/config/gtagjs.html)

(知らなかったけど)今までもGoogle タグマネージャでAnalyticsのタグを設定し、サイト側でタグマネージャ経由でコードを読み込ませるような設定は出来てた模様。
トラッキングコードの中で読み込んでるscriptを見るに、トラッキングIDを渡してあげるとそれ用のscriptを返してくれるように、今まで自分たちで設定してた部分をタグマネージャさんが用意してくれてるっぽい。
(実際にhttps://www.googletagmanager.com/gtag/js?id=UA-XXXXXXXXX-1をブラウザから見てみるとトラッキングIDが設定されてるスクリプトが返ってきた)

ここまではいろいろと情報出てるしなんとかなったものの、いざAngular2にgtag埋め込んでやるぞという段階で2つ問題が発生した。

※トラッキングコードは今までどおり、headの先頭に埋め込みでOKでした

##1.Component内でgtagが認識されない
これは単純に私のTypeScript力が無かったせいなのだが、アンビエント宣言というものをしないといけない模様。
こんなやつ
```
declare var gtag:any;
```
参考：
[Angular2のようなシングルページアプリケーションでGoogleアナリティクスを使う方法](https://shinichi-ito.com/spa/)

##2.Analyticsに/の情報しか送られない(ページビューの送信の仕方が分からない)
Analyticsにページの情報送ってるやつ、あれ何て言うの！
状態だったので知らなかったけど、「仮想ページビュー」というらしい。
こんな感じで設定出来るとのこと
```
gtag('config', 'UA-XXXXXXXXX-1',{
    'page_title': 'ページタイトル',
    'page_path': 'パス'
});
```

参考：
[新タグ「gtag.js」での仮想ページビュー設定について](https://www.ja.advertisercommunity.com/t5/%E3%82%A2%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9%E8%A8%AD%E5%AE%9A/%E6%96%B0%E3%82%BF%E3%82%B0-gtag-js-%E3%81%A7%E3%81%AE%E4%BB%AE%E6%83%B3%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%93%E3%83%A5%E3%83%BC%E8%A8%AD%E5%AE%9A%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/td-p/50995#)


#完成サンプル
出来てしまえばなんの事はないけど結構時間かかった…

```
import { Component } from "@angular/core";

declare var gtag:any; // ← これ重要
@Component({
    selector: "hoge",
    templateUrl: './html/hoge.component.html',
    styleUrls: [ './css/hoge.component.css' ]
})
export class HogeComponent {
    constructor() {
        gtag('config', 'トラッキングID',{
            'page_title': 'ページタイトル',
            'page_path': 'パス'
        });
    }
}
```
moment.js　5分刻みで分を表示する

```js
    function setLastUpdateTime() {
        // 日本語を指定
        moment.locale("ja",
            {
                weekdays: ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"],
                weekdaysShort: ["日", "月", "火", "水", "木", "金", "土"]
            });
        var minutes = moment().minutes();
        //5で割って小数点を削除したものに５を掛け算の後、string型に変換
        var usedMinutes = String(Math.floor((minutes / 5)) * 5);
        //1桁だったら10の位に0を引っ付ける
        if (usedMinutes.length === 1) {
            usedMinutes = "0" + usedMinutes;
        }
        return moment().format('YYYY年MM月DD日(ddd) HH時' + usedMinutes + '分現在');
    }
```

このように表示される
`2017年11月07日(火) 12時25分現在`
Ionicのwebpack.config.jsを拡張する

# Ionicでwebpack.config.jsを拡張する手順

1 ルート層にconfigフォルダを作り、その中にwebpack.config.jsを作成
2  webpack.config.jsを以下のように書き換える

```config/webpack.config.js
const webpackConfig = require('../node_modules/@ionic/app-scripts/config/webpack.config');
// ここから拡張したい内容を追加
```
3 package.jsonに以下を追加

```package.json
"config": {
    "ionic_webpack": "./config/webpack.config.js"
}
```

## 例えばaliasを追加してimportを便利にしたり出来ます。

``` config/webpack.config.js
const webpackConfig = require('../node_modules/@ionic/app-scripts/config/webpack.config');
webpackConfig.resolve = {
    extensions: ['.ts', '.js'],
    alias: {
        '@component': path.join(__dirname, '../src/components'),
        '@page': path.join(__dirname, '../src/pages'),
    }
}
```

```sample.ts
import { CardPage } from '@page/hoge';
/* src/pages/hoge.ts */

import { CardPage } from '@component/hoge';
/* src/components/hoge.ts */
```
php.iniの場所をパッと探せるコマンド

`php.ini`の場所を探すだけなら、以下の2つが探しやすそう。

```
$ php -i | grep php.ini

Configuration File (php.ini) Path => /etc/php/7.1/cli
Loaded Configuration File => /etc/php/7.1/cli/php.ini
```


```
$locate php.ini

/etc/php/7.1/cli/php.ini
/etc/php/7.1/fpm/php.ini
/usr/lib/php/7.1/php.ini-development
/usr/lib/php/7.1/php.ini-production
/usr/lib/php/7.1/php.ini-production.cli
```

(参考)
http://tweeeety.hateblo.jp/entry/20121218/1355802787
brewで依存されてる側のformulaeだけ更新する

## 前提

brewで、自分でインストールしたformulae **以外** = 依存関係として入ったformulae のみを更新しようと思ったのだけど、
自分でインストールしたかどうかは、情報として保持してないっぽい？

ので、近似解として、依存されてる側のformulaeだけ更新しようと思った。
のでメモ書き。
ちゃんと制御するなら`brew pin`とかを使うべきなんだと思う。

誰か/何かの役に立てば。

## コマンド

```shell-session
$ brew update
$ comm -23 <(brew outdated --quiet) <(brew leaves) | column # 確認
$ comm -23 <(brew outdated --quiet) <(brew leaves) | xargs brew upgrade # 実行
```

って感じ。

## 解説

- `brew leaves`
    - 依存関係を持たない formulae が取得できる
- `brew outdated`
    - 更新がある formulae が取得できる。`--quiet`でformulae 名のみ出力
- `comm`
    - ファイルを2つ引数にとり、ファイル１にのみ含まれる行、ファイル2にのみ含まれる行、両方に含まれる行、の3カラムを出力する。
    - オプションで出力するカラムを制限できる。`-23`によって、カラム1 = ファイル1にのみ含まれる行を出力させている
    - つまり、行を集合と見立てた時に、集合積(`comm -12`)、集合差(`comm -23`)を取れるコマンド。
- `<(...)`
    - サブシェルのstdoutをファイルとして渡せる
mosquitt_pub で retain を消す

Mosquitto の retain 機能を使っていたんですが削除につまづいたのでメモを残しておきます。

mosquitto の CLI として `mosquitto_pub` `mosquitto_sub` があり、こちらを使って説明します。


## 用意
例用 retain 作成

```shell-session
$ mosquitto_pub -t "chat/alice" -m "Hello there." -r
$ mosquitto_pub -t "chat/bob" -m "Hello" -r
$ mosquitto_pub -t "chat/chris" -m "Yo" -r
```

> -t トピック名
-h ホスト
-m メッセージ
-p ポート
-r retain する


この状態で subscribe をすると retain 機能により以下のようにメッセージが同期されます。

```shell-session
$ mosquitto_sub -t "chat/#" -v
chat/alice Hello there.
chat/bob Hello
chat/chris Yo
```

> -v 詳細(メッセージだけでなくトピック名も表示)

retain の削除には -n を使います。


> -n, --null-message
Send a null (zero length) message.


## 削除してみる(失敗)

retain 全体を消そうとしてみます。

```shell-session
# try
$ mosquitto_pub -t "chat" -r -n
$ mosquitto_pub -t "chat/#" -r -n
Error: Invalid publish topic 'hello/#', does it contain '+' or '#'?

Use 'mosquitto_pub --help' to see usage.

# check
$ mosquitto_sub -t "chat/#" -v
chat/alice Hello there.
chat/bob Hello
chat/chris Yo
```

#

## 削除してみる(成功)
topic 名を明示して、Bob を消そうとしてみます。

```
$ mosquitto_pub -t "chat/bob" -r -n
$ mosquitto_sub -t "chat/#" -v
chat/alice Hello there.
chat/chris Yo
```

Bob を**消せました**。

## おわり

MQTT の topic をしっかり理解できてませんでした。`/` 区切りにしたからといって WebSocket における namespace や room のような集約関係ができるわけではないようです。だからこそ柔軟な topic 指定や管理が出きるのかなと思います。


https://stackoverflow.com/questions/16136943/how-to-get-the-second-column-from-command-output

一括削除のスクリプトがありました。

```shell-session
mosquitto_sub -t "hello/#" -v |while read line _;do mosquitto_pub -t "$line" -r -n;done
```
HubotでGithubのWebhook URLを使う際に指定するPayload URLの設定方法

# 参考
HubotにGitHubのプルリクエストを自動でアサインさせる - Qiita
https://qiita.com/s-kiriki/items/4b38af4ebd05bad70eb7

# 本題

上記を参考にして実装しようとしたらPayload URLではまったのでメモ。


## Webhookの登録

基本的には参考のとおりなのですが、Payload URL について解説します。
Payload URL　には自分のサーバーのhubotへのURLを記述します。
例:http://999.999.999.999:9999/github/pullreq-auto-assign-webhook

そして、このパスが何で決まるかというと
### 999.999.999.999
自分のサーバーのIPに書き換えて下さい

### :9999
hubotのportに書き換えてください。
hubotにはExpressが入っていて、そいつが基本は8080ポートで動くので基本は8080です。
ただし、**8080が他のportで使用されている場合は別のportを使用しないといけません**
その場合は,hubotRoot/bin/hubot　を下記のように書き換えます。

```bin/hubot
#!/bin/sh

set -e

npm install
export PATH="node_modules/.bin:node_modules/hubot/node_modules/.bin:$PATH"

exec node_modules/.bin/hubot --name "myhubot" "$@"
```

↓

```bin/hubot
#!/bin/sh

set -e

npm install
export PATH="node_modules/.bin:node_modules/hubot/node_modules/.bin:$PATH"

PORT=9999 \
exec node_modules/.bin/hubot --name "myhubot" "$@"
```
※PORT＝の行の最後の\は必要なのでそのまま記述して下さい。あとPORT=の行と次の行は空けないでください。

### /github/pullreq-auto-assign-webhook
この部分はまじでなんでもいいです。
以下みたいに、scriptを記述していくのですが、その際にscript内で指定した文字列と同じものを記載すればOKです。
```scripts/pullreq-auto-assign-webhook.coffee
module.exports = (robot) ->
  ...
  robot.router.post "/github/pullreq-review-comment", (req, res) ->
```

### サンプル
今見たら bin/hubotに色々設定していたので一応記述しておきます。

```bin/hubot
#!/bin/sh

set -e

npm install
export PATH="node_modules/.bin:node_modules/hubot/node_modules/.bin:$PATH"

HUBOT_GITHUB_TOKEN="********************************************" \
HUBOT_GITHUB_ORG="********" \
HUBOT_GITHUB_REVIEWER_TEAM="00000000" \
HUBOT_GITHUB_WITH_AVATAR="0" \
PORT=9999 \
HUBOT_SLACK_TOKEN="xoxb-***********************************" \
exec node_modules/.bin/hubot --name "name" "$@"     
```
Cakephp3.xで既存DBデータを使ってFixtureクラスを自動生成

Dbデータを使ったテストをしたい場合にテストデータこつこつ作るの面倒なので、dev-serverとかにあるデータをとってきてFixtureクラスを自動生成したい。

## Shellクラス

https://gist.github.com/geerpm/b60eb36e745cba8f2d64a41072ee6627

## 使う

```
$ bin/cake gen_fixture_from_db users   --> usersの全データ
$ bin/cake gen_fixture_from_db users 1,3,8 --> id（カラム名固定）の値指定
$ bin/cake gen_fixture_from_db users 1..4 --> 範囲指定
$ bin/cake gen_fixture_from_db users 1..4,8,9..13 true --> 3番目の引数使うと上書き
```

細かいところは未デバッグ。
Amazon WorkSpaces の Windows10 に AWS CLIをインストールする

# Amazon WorkSpaces Windows10にPythonをインストール

まず、Amazon WorkSpacesはWindows Serverで稼働しているため、AWS CLIのMSIではインストールが出来ません。
そこで、[Windows で Python、pip、AWS CLI をインストールする](http://docs.aws.amazon.com/ja_jp/cli/latest/userguide/awscli-install-windows.html#awscli-install-windows-pip) のプロセスでインストールを行います。

当該ページの案内に従いイントールを行っていくと、

0x80070659 - このインストールはシステムポリシーで許可されていません。システム管理者にお問い合わせください。

というエラーが発生しインストールに失敗する

# Pythonをインストールする方法

AWSサポートに問い合わせたところ、

```
Windows 10 環境では権限の問題によって .msi ファイルからのソフトウェアインストール時に
エラーが発生するケースがあることが確認出来ております。
```

とのことでした。

処理として下記の手順で進める

1. WorkSpaces にログインする
2. スタートメニューの検索欄に cmd と入力する
3. 表示されたコマンドプロンプト(cmd)を右クリックし、「管理者として実行」を選択する
4. 起動したコマンドプロンプト画面でインストーラファイルを指定し、実行する
5. インストールウィザードを進め処理を完了する

上記の通り実行すると無事インストールが完了

※本件についての記事が見当たらなかったので投稿しました。
VS2017でOpenSSL1.0.2m x64をビルドする

初投稿、お試しで簡単に記載

Active-PerlをDL/インストールする
(デフォルトのままインストールするだけ)

VS2017 CommunityをDL/インストールする
インストール時にC++によるデスクトップ開発を選択する(5GBのDLが開始されるので注意)

OpenSSL1.0.2mのソースコード(tar.gz)をダウンロードし、任意のフォルダ(今回はC:\tmp)に展開/解凍する

スタートメニューから以下を起動する
VS 2017 用 x86_x64 Cross Tools コマンド プロンプト

以下コマンドを実行する
c:> cd c:\tmp\openssl-1.0.2m
c:\tmp\openssl-1.0.2m> perl Configure VC-WIN64A --prefix=c:\tmp\openssl-1.0.2m\x64
c:\tmp\openssl-1.0.2m> ms\do_win64a
c:\tmp\openssl-1.0.2m> nmake -f ms\ntdll.mak 
c:\tmp\openssl-1.0.2m> cd out32dll
c:\tmp\openssl-1.0.2m\out32dll>  ..\ms\test
※passed all tests と出力されればOK
c:\tmp\openssl-1.0.2m\out32dll> cd ..
c:\tmp\openssl-1.0.2m> nmake -f ms\ntdll.mak install

C:\tmp\openssl-1.0.2m\x64\bin 配下に出力される以下を利用する
libeay32.dll
openssl.exe
ssleay32.dll
C++ Builder > Indy > IdGlobal > IsAlphaNumeric() | IsASCII() | IsOctal() など

```txt:動作環境
C++ Builder XE4
```

IndyのIdGlobalにて実装されている文字のチェック機構。

https://github.com/fabioxgn/IRC/blob/master/Indy10/System/IdGlobal.pas
(バージョンはXE4と微妙に異なるかもしれないが、参考として)

```delphi
function IsAlpha(const AChar: Char): Boolean; overload;
function IsAlpha(const AString: String; const ALength: Integer = -1; const AIndex: Integer = 1): Boolean; overload;
function IsAlphaNumeric(const AChar: Char): Boolean; overload;
function IsAlphaNumeric(const AString: String; const ALength: Integer = -1; const AIndex: Integer = 1): Boolean; overload;
function IsASCII(const AByte: Byte): Boolean; overload;
function IsASCII(const ABytes: TIdBytes): Boolean; overload;
function IsASCIILDH(const AByte: Byte): Boolean; overload;
function IsASCIILDH(const ABytes: TIdBytes): Boolean; overload;
function IsHexidecimal(const AChar: Char): Boolean; overload;
function IsHexidecimal(const AString: string; const ALength: Integer = -1; const AIndex: Integer = 1): Boolean; overload;
function IsNumeric(const AChar: Char): Boolean; overload;
function IsNumeric(const AString: string): Boolean; overload;
function IsNumeric(const AString: string; const ALength: Integer; const AIndex: Integer = 1): Boolean; overload;
function IsOctal(const AChar: Char): Boolean; overload;
function IsOctal(const AString: string; const ALength: Integer = -1; const AIndex: Integer = 1): Boolean; overload;
{$IFNDEF DOTNET}
```

- IsASCII(): 特殊文字も含む
    - +や=や/など 
- IsOctal(): 8進数
- など

詳細は実装を見ることで分かる。
Xcode9.1で'characters' is deprecated: Please use String or Substring directlyのワーニングが出るようになった

# 概要

Xcode9.1に上げた際に以下のワーニングが出た

`'characters' is deprecated: Please use String or Substring directly`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/56178/03656f1a-d592-6895-49ed-9c8dbb69215a.png)

# 結論

警告通り、charactersでなく直接Stringのメソッドを利用

```diff
-            .map { _ in self.nameField.text!.characters.count != 0 }
+            .map { _ in self.nameField.text!.count != 0 }
```

# 補足

ずっと言われていたけど対応してなくて、Xcode9.1で警告が出るようになってSwiftLintに怒られて対応しました:innocent:
C++ Builder XE4, 10.2 Tokyo > TEdit > {数値|アルファベット}だけを許可する > Indy使用

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)

Indy使用
```

テキストボックスにおいて、{数値|アルファベット]のみの入力を許可する。

http://www.tek-tips.com/viewthread.cfm?qid=1561967
はDelphiコードであるが、inはC++ Builderでは使えない?

Indyの関数を使う処理にしてみた。

### code

バックスペースキーは使える方がUIとして良いので許可した。
デリートキーは使えるようだ。

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------

#include <IdGlobal.hpp> // IsAlphaNumeric()

__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{

}
//---------------------------------------------------------------------------

static const int kCode_BackSpace = 0x08;

void __fastcall TForm1::Edit1KeyPress(TObject *Sender, System::WideChar &Key)
{
	if (Key == kCode_BackSpace) {
		return;
	}
	if (IsAlphaNumeric(Key) == false) {
		Key = 0x00;  // discard the key
		return;
	}
}
//---------------------------------------------------------------------------
```

`NCC-74656`と入力したところ。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9152adf4-8390-e3c1-b74f-7ec477295a1c.png)

マイナスや下線など、ファイル名として使う文字については許可してもいいかもしれない。

### 関連

https://qiita.com/7of9/items/392bd3a5530bfb301d5c

[WinAppDev > 不正なフォルダ名 > フォルダ名変更時に"/"入力すると(ファイル名に対する)不正文字を表示することができる](https://qiita.com/7of9/items/9aa82ce970c2898da5d0)
javascriptパターン：5.7　オブジェクトの定数

[javascriptパターン　優れたアプリケーションのための作法](https://www.oreilly.co.jp/books/9784873114880/)
`5.7　オブジェクトの定数` を試しました。

本を読んでいるだけだと、どんな動きをしているのかイメージが正しく持てなかったので自分なりにコメントをつけながら検証。

```js

    var constant = (function () {
        var constants = {};
        var ownProp = Object.prototype.hasOwnProperty,
            allowd = {
                string: 1,
                number: 1,
                boolean: 1
            },
            prefix = (Math.random() + "_").slice(2);
        return {
            set: function (name, value) {
                if (this.isDefined(name)) {
                    return false;//存在していたら終り
                }
                if (!ownProp.call(allowd, typeof value)) {
                    return false;//すでに値がはいっていたら終り(上書き禁止)
                }
                constants[prefix + name] = value;//プロパティの追加
                return true;
            },
            isDefined: function (name) {
                return ownProp.call(constants, prefix + name) //存在のチェック
            },
            get: function (name) {
                if (this.isDefined(name)) {//存在していたらその値を表示
                    return constants[prefix + name]
                }
                return null
            },
            check: function () {//今まで登録したconstantsのプロパティを全部表示
                for (var prop in constants) {
                    console.log(prop + " = " + constants[prop] + ', ' + typeof constants[prop]);
                }
            }
        };

    }())

    console.log(constant.isDefined("maxwidth"));//maxwidthは定義されていますか？            false
    console.log(constant.set("maxwidth", 480));//maxwidthを定義します                      true
    console.log(constant.set("hello", 'こんにちわ'));//helloを定義します                    true
    console.log(constant.set("canYouEatCarrots", false));//canYouEatCarrotsを定義します    true
    console.log(constant.isDefined("maxwidth"));//maxwidthは定義されていますか？            true
    console.log(constant.set("maxwidth", 320));//maxwidthを再定義します。でもすでにあるので  false
    console.log(constant.get("maxwidth"));//再定義したmaxwidthの値はどうなったか？           480

    console.log(constant.check());//検証用に追加したメソッド：現在定義した全てを、型と共に出力。
                                  //30403848452875515_maxwidth = 480, number
                                  //30403848452875515_hello = こんにちわ, string
                                  //30403848452875515_canYouEatCarrots = false, boolean

```

定数を、javascriptで設定することが出来ました。
Babelをコマンドラインから実行したい時

babel-cliから単体でes6 -> es5　に落とす時に若干ハマったのでメモ。

`$ npm install --save-dev babel-cli babel-preset-es2015`
でインストール

#### 注意
⚠️*グローバルにインストールはしない*⚠️
参照: http://babeljs.io/docs/usage/cli/

`$ echo '{ "presets": ["es2015"] }' > .babelrc`
で.babelrcができていることを確認

```json:.babelrc
{ "presets": ["es2015"] }
```

適当にes6のコードを作成。

```js:arrow-test.js
const x3 = (n) => n * 3
```

実行。

```
$ node_modules/.bin/babel arrow-test.js --presets es2015

"use strict";

var x3 = function x3(n) {
  return n * 3;
};
```
node.js passport-google-oauth2でのパラメタ追加方法


node.jsでoauth認証を実装する場合、passport（＋使いたいサービスのoauth module）でやることが多いと思います。

googleのoauthでやりたい場合は、passport-google-oauth2になりますが、その時に、デフォルト以外の[google oauthのパラメタ](https://developers.google.com/identity/protocols/OpenIDConnect#authenticationuriparameters)を付けたい場合は、[passport.authenticate](http://knimon-software.github.io/www.passportjs.org/guide/authenticate/)のoptionsに追加します。

以下はgoogle oauth認証時に必ずアカウント選択を出したいので、promptパラメタを追加です。
指定しないと、ブラウザでgoogleアカウントを１つだけ認証済みの場合はアカウント選択なしで認証完了してしまいます。

```:typescript
app.post('/login',
  passport.authenticate('google', {
    successRedirect: '/',
    failureRedirect: '/login'
    prompt: 'select_account'	  // select_accountはアカウント選択を出す
  }
);
```

ちなみに、各サービスの認証の追加パラメタはauhenticateのoptionsのtypescriptの定義（[interface AuthenticateOptions](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/passport/index.d.ts)）に含まれていないので、typescriptのエラーになります。  
これ回避する方法ないかな…
macOS Sierra で `pip install` したときに `Permisson denied` になった

Homebrew で python を入れたあとに発生。パッケージのインストール時に`/Library`配下にファイルを作りに行って落ちる。
原因は`pip`が元々入っていた python の環境の物が使われていたため。多分`easy_install`で`pip`を入れたのがよくなかった。


```zsh
~ python -m pip --version
pip 9.0.1 from /usr/local/lib/python2.7/site-packages (python 2.7)
~ pip --version
pip 9.0.1 from /Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg (python 2.7)
```

という感じになっている。

Homebrew で入れた python に`pip`は入っているが、`pip2`という名前になっているので`pip`で呼べるようにする。

```zsh
cd /usr/local/bin
ln -s pip2 pip
```
電話番号の入力チェック

です。

5桁の市外局番があったり、4桁-3桁-3桁の電話番号があったりなど、
電話番号の入力チェックを自前で本気でやろうとすると面倒ですよね。

ライブラリに任せてしまいましょう。

```pom.xml
<!-- https://mvnrepository.com/artifact/com.googlecode.libphonenumber/libphonenumber -->
<dependency>
    <groupId>com.googlecode.libphonenumber</groupId>
    <artifactId>libphonenumber</artifactId>
    <version>8.8.5</version>
</dependency>
```

```java
final PhoneNumberUtil PHONE_NUMBER_UTIL = PhoneNumberUtil.getInstance();

String tel = "045-1230-4567";//true
//String tel = "04505-2-4567";//true
//String tel = "0454-130-467";//true
//String tel = "0454-130-499967";//false
//第２引数はtel変数がどこの国の電話番号であるかを指定。com.google.i18n.phonenumbers.CountryCodeToRegionCodeMapに書いてあるものを選ぶ。
PhoneNumber phoneNumber = PHONE_NUMBER_UTIL.parse(tel, "JP");
boolean result= PHONE_NUMBER_UTIL.isValidNumber(phoneNumber);
System.out.println(result);
```
❄️Rails5　問い合わせ（コンタクトフォーム）の作成方法

このような、問い合わせ（コンタクトフォーム）です。



<img width="976" alt="スクリーンショット 2017-11-07 12.44.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/209256/a93e7977-a503-a8a7-a3bb-b3cef85105a2.png">



スタイルはBootstrap4を使っているので、必要なければ不要そうな所消して下さい！


このリンクより
https://developers.google.com/maps/documentation/embed/
右上の”キーの取得”をクリックして、適当にproject名を入力。しばらく待つと、キーが表示されるので、コピーしてメモ帳などに保存。

<img width="1236" alt="スクリーンショット 2017-11-07 11.56.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/209256/54dc4c22-5fff-203c-10ad-23d12ddefec4.png">

viewを自分で作り、下記を入力。

```view/static_pages/contact.html.erb
<section class="fdb-block">
    <div class="container">
      <div class="row text-center justify-content-center">
        <div class="col-12 col-md-8 col-lg-7">
          <h1>Contact Us</h1>
        </div>
      </div>
     <div class="row pt-4">
        <div class="col-12 col-md-6">
          <iframe class="map"  src="https://www.google.com/maps/embed/v1/place?key=★ここは自分のAPIkeyです&q=★kyoto"width="100%" height="300" frameborder="0" style="border:0" allowfullscreen>

<!--q=の後は、googleで示したい住所を入力すればokです!googleで住所を検索して、”q=”を見つけて入力-->

                
          </iframe>
       </div>
    <form action="https://formspree.io/★自分のemailアドレス@gmail.com" method="POST">
                <div class="form-group">
                 <!--  <label for="name">Name</label> -->
                  <input type="text" class="form-control" name="name" id="name" placeholder="Name">
                </div>
                <div class="form-group">
                 <!--  <label for="email">Email Address</label> -->
                  <input type="email" class="form-control" name="email" id="email" placeholder="Email Address">
                </div>
                <div class="form-group">
               <!--    <label for="message">Message</label> -->
                  <textarea name="message" cols="40" rows="10" class="form-control" id="message" placeholder="Message"></textarea>
                </div>
                <button type="submit" class="btn btn-primary">Send Message</button>
              </form>
     </div>
    </div>
  </section>
```

コンタクトへリンクするボタンを置きたいページ（navbarの中など）に下を記入

```layouts/application.html.erb
<%= link_to'Contact',contact_path %>
```
ルートを設定します。

```config/routes.rb
get 'contact' => 'static_pages#contact'
```

コントローラーを自分で作り、下のように入力します。

```static_pages_controller.rb
class StaticPagesController < ApplicationController
    def contact
      
   end
end
```


コンタクトフォームを入力するとメールが届くので、届いたメールのcomfirmをクリック。

<img width="821" alt="スクリーンショット 2017-11-07 12.57.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/209256/cd72593f-57e0-df78-edcb-a23df29d52b2.png">


ブラウザに戻って、comfirm（紙飛行機のマーク！）をクリックするとメールが届きます。

完成です！！！
Bitrise.ioでブランチ名を指定してcheckoutする

Bitrise.ioのgit-cloneモジュールを使用する際

```
git checkout [HASH値]
```

ではなく

```
git checkout [ブランチ名]
```

でチェックアウトしたい。

### ハッシュ値を使用してcheckoutした場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/25428/8ab2e87a-4874-45e8-773f-301114cba13d.png)

### ブランチ名を使用してcheckoutした場合
![image.png](https://qiita-image-store.s3.amazonaws.com/0/25428/3e0c55a2-680d-9614-7ee3-1f6ed015f1e0.png)

## 方法
コミットのハッシュ値が設定されていると、ブランチ名よりもハッシュ値が優先して使用されるため。
`Clone Config`の`Git Commit to clone`を空にする。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/25428/07594c8b-e317-c914-0093-8bbfebb9eea8.png)


## 参考
> Clones a repository based on the provided inputs.

> If pull_request_id is provided then all other git checkout parameters will be ignored. If a git commit is provided it will ignore the tag and branch parameters. If no git commit but a tag is provided then it will ignore the branch parameter. If no branch parameter is provided then it'll skip git checkout.

https://github.com/bitrise-io/steps-git-clone/blob/690894a3272f8b9e84c2afe99fb90cae7f9b16d1/step.yml#L3-L9
winAppDev > TEdit > 数値入力だけを許可する > SetWindowLong() + ES_NUMBER (ES_NUMERICではない) > 「数値 + アルファベット」のみの入力許可はできないようだ

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)
```

TEditに対して、数値入力だけを許可するようにするには。

http://bcbjournal.org/forums/viewtopic.php?f=10&t=1113
においてrlebeauさんによる下記のコード例がある。

```cpp
SetWindowLong(Edit1->Handle, GWL_STYLE, GetWindowLong(Edit1->Handle, GWL_STYLE) | ES_NUMERIC);
```

使ってみたが、`ES_NUMERIC`がundefinedとなる。

https://msdn.microsoft.com/en-us/library/windows/desktop/bb775464(v=vs.85).aspx
を参考に`ES_NUMERIC`でなく`ES_NUMBER`にするとビルドできた。

### code

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{

	SetWindowLong(Edit1->Handle, GWL_STYLE, GetWindowLong(Edit1->Handle, GWL_STYLE) | ES_NUMBER);

}
//---------------------------------------------------------------------------
```

### 実行例

数値以外を入力したときにエラーメッセージが表示される。
小数点も入力できない。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/caa23798-9745-37c1-678d-c2f4c8569132.png)

### 備考

この方法では「数値 + アルファベット」のみの入力許可はできないようだ。

https://qiita.com/7of9/items/1e51968f967b8ed70cfc
に記載のようなコードで入力後の内容から特殊文字を削除する方法を使うことになるだろうか。
「GASメモ」Utilities Service＆カレンダーイベントへのリンク（URL）を取得する


##Utilities
/* 時刻の表記をyyyy-MM-ddに変更 */
`Utilities.formatDate(new Date(), "GMT", "yyyy-MM-dd");`

/* 時刻の表記をHH:mmに変更 */
`Utilities.formatDate(new Date(), "GMT", "HH:mm");`

/* 文字列をBase64でエンコードする */
`Utilities.base64Encode("string");`

##カレンダーイベントへのリンク
```
  var splitEventId = event.getId().split('@');
  var calendarId = "example@gmail.com";
  var eventURL = "https://www.google.com/calendar/event?eid=" + Utilities.base64Encode(splitEventId[0] + " " + calendarId);
```
参考文献
[Get link (url) to an calendar event in google apps script](https://stackoverflow.com/questions/10553846/get-link-url-to-an-calendar-event-in-google-apps-script)
PandasのデータフレームをCSVに書き込む

PandasのデータフレームからCSVへの追記の方法があまり見つからなかったので、備忘録を兼ねて書いてみる。

参考
[Pandas のデータフレームを CSV ファイルやテキストファイルに出力する](http://pythondatascience.plavox.info/pandas/%E3%83%87%E3%83%BC%E3%82%BF%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%82%92%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B)

環境
OS : macOS Sierra(10.12.3)
Python : 3.5.1
Pandas : 0.21.0

まず、pipでpandasを導入する。

    $pip pandas

基本的な書き込み

```python:employee.py
import pandas as pd
 
# データフレームを作成
df = pd.DataFrame([
  ["0001", "John", "Engineer"],
  ["0002", "Lily", "Sales"]],
  columns=['id', 'name', 'job'])
 
# CSV ファイル (employee.csv) として出力
df.to_csv("employee.csv")

```


    ,id,name,job
    0,0001,John,Engineer
    1,0002,Lily,Sales

index部分がいらない場合はオプションを追加します。

```python:employee.py
import pandas as pd
 
# データフレームを作成
df = pd.DataFrame([
  ["0001", "John", "Engineer"],
  ["0002", "Lily", "Sales"]],
  columns=['id', 'name', 'job'])
 
# CSV ファイル (employee.csv) として出力
df.to_csv("employee.csv", index=False)

```
    id,name,job
    0001,John,Engineer
    0002,Lily,Sales

日本語を含む場合はオプションでエンコードを指定します。しなかった場合文字化けする可能性があります。


```python:employee.py
import pandas as pd
 
# データフレームを作成
df = pd.DataFrame([
  ["0001", "ジョン", "Engineer"],
  ["0002", "リリィ", "Sales"]],
  columns=['id', 'name', 'job'])
 
# CSV ファイル (employee.csv) として出力
df.to_csv("employee.csv", index=False, encoding="utf-8")

```

    id,name,job
    0001,ジョン,Engineer
    0002,リリィ,Sales


既に存在するCSVファイルに対して追記する場合はオプションでmodeとヘッダーの設定を変更します。

```python:employee.py
import pandas as pd
 
# データフレームを作成
df = pd.DataFrame([
  ["0001", "ジョン", "Engineer"],
  ["0002", "リリィ", "Sales"]],
  columns=['id', 'name', 'job'])
w = pd.DataFrame([["0003", "ジョー", "Teacher"]])

# CSV ファイル (employee.csv) として出力
# df.to_csv("employee.csv", index=False, encoding="utf-8", mode='a')

# CSV ファイル (employee.csv) に追記
w.to_csv("employee.csv", index=False, encoding="utf-8", mode='a', header=False)
```

    id,name,job
    0001,ジョン,Engineer
    0002,リリィ,Sales
    0003,ジョー,Teacher

以上です。
要するに.to_csvのオプションを変更すれば色々出来るという話でした。

今回紹介した以外のオプションは以下を参照してください。
[pandas.DataFrame.to_csv](http://pandas.pydata.org/pandas-docs/version/0.18.1/generated/pandas.DataFrame.to_csv.html)
JPA、Hibernateで困ったらググらずにまずここを見るべし

### Hibernateいろいろ難しい。。

そう思ったら、[Hibernate公式ドキュメント](http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html)を見ましょう。

・・・なにを当たり前な！というところですかね？笑

まずは公式のドキュメント！というのが習慣づいている方には当たり前のことかもしれませんが、ついつい詰まった時は「hibernate join」とか「jpa 小テーブル」などと検索しがちです。

しかし、***なぜか公式のGoogle評価が著しく低い***ため、そういったワードで検索しても驚く程公式情報が出てきません。笑

検索結果では大概個人ブログとかstackoverflowとかがでてくるのですが、やはり場当たり的な回答が多く正式な使い方を理解しないままとりあえず動かして、ちょっとしたらまた詰まる、みたいなことがありがちです。

#### 公式は以外と分かりやすい
一方、仕様が謎すぎると評判のhibernateですが、ドキュメントは意外としっかり書いてあり、わかりやすいです。

[User Guideのdomain modelの章](http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#domain-model)から入ると、普段よく見るentityの説明があるのでよいでしょう。まずはこれを読んで動作の基本を理解しましょう。

まぁ、それでも謎挙動辛い時辛いのはやっぱりありますがね…笑


#### 英語辛い時
 …え、英語辛い？<br>[便利な英訳chrome拡張](http://little-hands.hatenablog.com/entry/2017/11/03/google-translator)があるのでそれを使って頑張って読みましょう！

日本語のふわっとした情報を読んで試行錯誤するより、結果としては確実に早いはずです。頑張りましょう！笑
WKWebViewにおけるSwiftとJavaScriptにおける双方向通信

最近、業務でWKWebViewを用いてWebアプリの一部をiOSアプリにのせ、音声認識部分をnative側で実装するハイブリッドアプリを開発していたのでその時のメモ。

## NativeからWebアプリを操作
```swift
let script = String(format: "document.getElementById('iPadVolumeData').value = \"%@\";", str)
webView.evaluateJavaScript(script, completionHandler: nil)
```
このようにSwift経由でDOM操作が可能。
ちなみに`completionHandler`の中身はscript実行の結果が戻る。このハンドラーはmain threadで実行されるらしい。
> [Appleの公式ドキュメント](https://developer.apple.com/documentation/webkit/wkwebview/1415017-evaluatejavascript?language=objc)
>> The method sends the result of the script evaluation (or an error) to the completion handler. The completion handler always runs on the main thread.

## JS側からNativeを操作
1.WKWebViewConfigurationをインスタンス化

```swift
let webConfiguration = WKWebConfiguration()
```
2.WKUserContentControllerをインスタンス化

```swift
let userController = WKUserContentController()
```
3.`userController`に**JavaScript**側から呼び出すhandlerを登録。そして、**WKScriptMessageHandler**プロトコルを実装するdelegateを設定。

```swift
userController.add(self, name: "startRecording")
userController.add(self, name: "toggleMicInput")
userController.add(self, name: "youtubeStart")
userController.add(self, name: "youtubeEnd")
```
4.configurationにuserControllerを登録

```swift
webConfiguration.userContentController = userController
```
5.webViewにconfigurationを登録

```swift
let webView = WKWebView(frame: .zero, configuration: webConfiguration)
```

6.**WKScriptMessageHandler**プロトコルの実装
JavaScript側でmessageをnative側に送信するとデリゲートメソッドの`func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)`が呼び出される。JSONを送信することも可能。

```handler.js
let data = JSON.stringify({
       usingMic: this.$store.state.chat.mic.using
})
window.webkit.messageHandlers.toggleMicInput.postMessage(data)
```

```ChatbotViewController+WKScriptMessageHandler.swift
import Foundation
import WebKit

extension ChatbotViewController: WKScriptMessageHandler {
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        switch message.name {
        case "startRecording":
            print("startRecordingが呼ばれる")
        case "toggleMicInput":
            print("toggleMicInputが呼ばれる") //<--が呼ばれる
            guard let contentBody = message.body as? String,
                let data = contentBody.data(using: String.Encoding.utf8) else { return }
                if let json = try! JSONSerialization.jsonObject(with: data, options:JSONSerialization.ReadingOptions.allowFragments) as? Dictionary<String, Bool>, let isUsingMic = json["usingMic"] {
                if isUsingMic {
                    print("micを使っている")
                } else {
                    print("micを使っていない")
                }
            }
        case "youtubeStart":
            print("youtubeStartが呼ばれる")
        case "youtubeEnd":
            print("youtubeStoppedが呼ばれる")
        default:
            print("default")
        }
    }
```
ubuntuでのpecoのインストール

# 最新版の確認

このサイトで確認する。

https://github.com/peco/peco/releases

# バイナリファイルをダウンロードする

```shell-session
# ホームディレクトリ
cd ~/
# tarファイルをダウンロード
sudo wget "https://github.com/peco/peco/releases/download/v0.5.1/peco_linux_386.tar.gz"
# 解凍
sudo tar xzvf peco_linux_386.tar.gz
cd peco_linux_386
# 実行権限変更
sudo chmod +x peco
# PATHの通っている所にpecoを配置
sudo cp peco /usr/local/bin
# バージョン確認
peco --version
```

OK!!

# 参考資料

https://qiita.com/pandora2000/items/50e3f8fe6e9e50a3e6cb

http://ssh0.hatenablog.com/entry/2015/08/31/%E3%80%90%E5%82%99%E5%BF%98%E9%8C%B2%E3%80%91Ubuntu%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%9F%E3%81%82%E3%81%A8%E3%81%AB%E3%82%84%E3%81%A3%E3%81%9F%E3%81%93%E3%81%A8
【ディレクター向け】コーディングをお願いする前に共有・確認しておくこと一覧

筆者が以前の会社でテクニカルディレクターをしていた際に、**非テクニカル**なディレクター用にまとめたものです。
会社によって内容は異なるかと思いますので、参考程度に見ていただければと思います。

## ドキュメント（共有）
- 開発仕様書
- ファイルリスト
- テスト仕様書
- 画面設計書
- デザイン
- WBS
- コーディングガイドライン
- Gitのフロー
- JS仕様書
- 開発サーバ情報

## 開発手法（確認）
- CSSフレームワークの使用（クライアントからの要求が無い限り使用しない）
- CSSプリプロセッサの使用
- テンプレートエンジンの使用
- タスクランナーの使用

ここで確認したいのは、その後の運用時に**どのようになっているのがベストか**がポイント。

よくある事例として、
クライアント側で運用を行う場合は、SassやGulpなどは触れないことが多いので、コンパイル後のファイルが編集可能な状態になっていると良い。

## ファイル管理（共有）
デザインや画面設計書のファイル管理ルールを決めておく。
開発者目線としては、どのファイルが正しくて且つ最新であるかが**パッと分かる**ようになっていると良い。

## やり取り（共有）
基本的なやり取りをどこで行うのか決めておく。
また、ちょっとしたやり取りまではSlack、エビデンスを残しておきたいものはBacklog、
といったルールも予め決めておいた方が良い。

## アクセス解析タグ（共有）
何を入れるかが分かっているのであれば、事前に共有しておく。
開発者目線としては、予め空のインクルードファイルを入れておく等の対応が出来る。

## まとめ
事前の共有が不十分だと、開発の進行がスムーズに行かなかったり、上がってきたものに認識の齟齬があったりと、思わぬインシデントに繋がることがあります。

認識の齟齬を出来る限り無くして、リスク回避していきましょう！

今回は、**着手前**に確認する内容を書いてきましたが、
次回は、**成果物**に対して非エンジニアのディレクターさんでも確認出来る項目を書いていこうと思います。
（もしかしたら、結果的に事前に確認しておくことに入ってくる項目があるかもですが…）