OmniAICreator/Qiita-1.07M huggingface dataset:
【RSpec】複数の要素から絞り込む/ 「Ambiguous match, found 2 elements matching」の解消

## 概要
* 複数の要素から一つの要素を絞り込む方法です
* `Ambiguous match, found 2 elements matching...`の解消

## 該当のHTMLコード
```html
<div class="actions">
  <input type="submit" name="back" value="修正" class="c-button-secondary col-4 offset-1" data-disable-with="送信中...">
  <input type="submit" name="commit" value="送信" class="c-button-primary col-4 offset-2" data-disable-with="送信中...">
</div>
```

## RSpecコード

### Before
```ruby
find('input[type="submit"]').click
```

#### エラー文
```ruby
Capybara::Ambiguous: Ambiguous match, found 2 elements matching visible css "input[type=\"submit\"]"

  0) Contact 問い合わせ完了の確認 未ログインの時 遷移及びメール通知が完了すること
     Failure/Error:[0mfind([31m[1;31m'[0m[31minput[type="submit"][1;31m'[0m[31m[0m)[[1;34m1[0m].click

     Capybara::Ambiguous:
       Ambiguous match, found 2 elements matching visible css "input[type=\"submit\"]"



     # ./spec/system/contacts_spec.rb:22:in `block (4 levels) in <top (required)>'
     # -e:1:in `<main>'
```

### After
```ruby
find('input.offset-2').click
```

## まとめ
* 結局、固有のCSSクラス名を指定して解決した。
* もし、複数の要素の中から最初の要素を指定する場合は、下記のようにすれば解決する

```ruby
click_on 'hogehoge', match: :first
```




## 参考記事
* [画面上に複数現れる要素を絞り込む](https://qiita.com/jnchito/items/607f956263c38a5fec24#%E7%94%BB%E9%9D%A2%E4%B8%8A%E3%81%AB%E8%A4%87%E6%95%B0%E7%8F%BE%E3%82%8C%E3%82%8B%E8%A6%81%E7%B4%A0%E3%82%92%E7%B5%9E%E3%82%8A%E8%BE%BC%E3%82%80)
* [capyabaraで要素が重なった時に、最初のものをクリックする方法](http://mikamisan.hatenablog.com/entry/2016/03/02/221103)
* [GitHub - willnet/capybara-readme-ja: Capybara の README 和訳 #strategy](https://github.com/willnet/capybara-readme-ja#strategy)
Pythonのimportをお手軽にカスタマイズする方法

何か特殊な事情があって動的にimportしたい時に使えます。

https://docs.python.org/ja/3/library/importlib.html

全てはドキュメントに書いてあったりするのですが、ちょっと分かりづらいので、手っ取り早く使いたい人は以下のコードを最初の方に仕込んでおくと良いと思います。

```py
import importlib.machinery
import sys


class PackageFinder(importlib.machinery.PathFinder):

    @classmethod
    def find_spec(cls, fullname, path=None, target=None):
        if not path:
            path = [] 
        # pathに探してほしいディレクトリのリストを指定する
        path.append("/path/to/package/root")
        return importlib.machinery.PathFinder.find_spec(fullname, path, target)

sys.meta_path.append(PackageFinder)
```

上記コードのpathを動的に切り替えるなりなんなりする事で、特定のディレクトリを同期して読み込んだり、リモートのディレクトリをダウンロードして読み込んだり、といったアクロバティックなこともできるようになります（推奨しているわけではないです）。

尚、sys.path_hooksというのもあって、こちらはパスを追加するのではなく、パスを引数にとって、それに対応するモジュールimportの挙動をカスタマイズしたい時に使うみたいです。
Python3のloggingで、一回loggingを実行してしまうと警告レベルの設定を変更できない件

Python3では、一度loggingを実行してしまうと警告レベルの設定を変更できません。
以下に示す通り。

```
$ python3
Python 3.8.0 (v3.8.0:fa919fdf25, Oct 14 2019, 10:23:27) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import logging
>>> logging.debug("log for debug")
>>> logging.info("log for info")
>>> import logging
>>> logging.basicConfig(level=logging.DEBUG)
>>> logging.debug("log for debug")
>>> 
```

なので、ロギングレベルを変更するには、インタプリタから抜ける必要があります。

```
>>> logging.basicConfig(level=logging.DEBUG)
>>> logging.debug("log for debug")
>>> quit()
$ python3
Python 3.8.0 (v3.8.0:fa919fdf25, Oct 14 2019, 10:23:27) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import logging
>>> logging.basicConfig(level=logging.DEBUG)
>>> logging.debug("log for debug")
DEBUG:root:log for debug
>>> 
```

これで表示できました。
これはインタプリタの挙動ですが、実際に実行した時にこういう挙動になるのか調べてみました。

```loggingtest.py
import logging
logging.debug("log for debug")
logging.info("log for info")
logging.error("log for error")
logging.basicConfig(level=logging.DEBUG)
logging.debug("log for debug")
logging.error("log for error")
```

実行結果は以下の通り

```
$ python3 loggingtest.py 
ERROR:root:log for error
ERROR:root:log for error
```

なので、結論としては、コードの途中で、警告レベルの変更をしないようにしましょう。反映されません。ということです。

追記：
一応、

```
logging.basicConfig(level=logging.DEBUG, force=True)
```
で変更できるようです。

@tenmyo
さんありがとうございます。
image画像を一覧表示させる

#  画像の一覧表示の実装について実装

現在、プログラミングスクールにてフリマアプリを5名で実装中
少し手間取ったホーム画面の一覧表示の実装手順を載せます。
フロント実装は完了済みとします。

開発環境
rails 5.2.4.1
ruby  2.5.1

マークアップはhamlで行いました。

※アウトプットの為記述
※初学者向けに記述します

完成イメージ
--
<img width="1260" alt="home-index.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557710/28333ecf-8017-7ecd-7bc4-f358272c7d1c.png">

※載せている写真は動物ですがあくまでテスト画像として載せているだけです。
　予めご了承ください。

まずはコントローラの記述から
今回は一覧の表示をしたいので対象のapp/controllers/home_controller.rbを編集
home_controller.rb
--------------
     class HomeController < ApplicationController
       def index
         @images = Image.all
         @items = Item.all
       end
     end
------
今回はフリマのitemテーブルとimageテーブルのデータを取得できるように一旦記述
これでアイテムテーブルとimegeテーブルのデータをホーム画面に持ってきます。
roteはすでにできている為、今回は追記はありませんでしたが、一応載せております

routes.rb
----
     Rails.application.routes.draw do
       devise_for :users
       root "home#index"
       resources :items, only: [:new, :create, :show, :edit, :destroy]
       resources :sendings, only: [:new, :create]
       resources :users, only: [:edit]
       resources :cards, only: [:new, :create, :index, :destroy]
       resources :orders, only: [:index, :new, :create] do  
         collection do
           get 'index', to: 'orders#index'
           post 'pay', to: 'orders#pay'
           get 'done', to: 'orders#done'
         end
       end
     end
次にhamlに追記

-----
      .main__item__category
        %h2.main__item__category__title
          ピックアップカテゴリー
        .main__item__category__item_box
          = link_to "#", class: "main__item__category__item_box__title" do
            新規投稿商品
          %ul.main__item__brand__item_box__lists
            %li
           👉- @items.each do |item| 
           👉  = link_to item_path(id: item.id) ,class: 
    "main__item__brand__item_box__lists--list, item_list" do
                - ft_image = item.images.first
                = image_tag ft_image.photo.url, class: 
    "item_list__picture"
                .item_list__body
                  %h3.item_list__body__name
                    = item.name
                  %ul
                    %li.item_list__body__price 
                      = item.price 
                      = "円"
                    %li.item_list__body__likes
                      = icon 'fas', 'star'
                      0
                  %p (税込)     

今回はitemテーブルに紐づいているimageの最初のデータを取得したかった為、上記の👉のように追記いたしました。
この記述でデータを取得し表示まではできました。
あとはスクロールで画像がうまくスクロールするようにいたしました。
長くなりますのでスクロールは別の記事に載せたいと思います。
デコレータを評価するためのテストコード

Pythonのデコレータを評価するためのテストコードの書き方です.
もっといい方法あったら教えて下さい.

# デコレータ自体のテスト

hoge デコレータをつけると, 戻り値に 1 を加算します.

```python
def hoge(func):
    @functools.wraps(func)
    def wrapper(n):
        return func(n) + 1
    return wrapper

@hoge
def sample(n):
    return n * 2

if __name__ == '__main__':
    assert sample(3) == 7
```

デコレータ自体は, 次のように評価できます (`ANY_VALUE` はなんでもよい).

```python
assert hoge(lambda n: 6)(ANY_VALUE) == 7
```


# 引数があるデコレータのテスト

つぎの hoge デコレータを使うと, デコレータの引数に指定した値を戻り値に加算します.

```python
def hoge(m):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(n):
            return func(n) + m
        return wrapper
    return decorator

@hoge(2)
def sample(n):
    return n * 2

if __name__ == '__main__':
    assert sample(2) == 6
```

デコレータ自体は, 次のように評価できます.

```python
assert hoge(2)(lambda n: 4)(ANY_VALUE) == 6
```
いまどきのグレー

最近、グレー(灰色)は《青寄り》がかっこいい気がする。
グレースケール0〜100%のカラーコードがなんだか古く感じるのです。

例えばこんな感じ。うちのサービスのUI考えていた時の例。

<img width="782" alt="スクリーンショット 2020-02-26 16.48.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162913/263bd194-805c-007f-189e-b45aee8622ea.png">

同じグレーでもこうして並べてみると結構雰囲気が変わってくる。
サイトのトンマナにも寄るが、左のグレーより、右の青寄りのグレーをベースにした方がスタイリッシュに見えるのでデザインする時に意識している。
XenServer仮想コンソールにてキーボードマウスが効かない時の対処

XenServer 6.1上に無理やりWindowsServer2016を立てたところ、インストール画面では動いたもののインストール後のパスワード設定画面でキーボードマウスが効かず途方に暮れました。
ですが、ダメ元でやってみた操作でうまくいくようになったのでその手順を残しておきます。
当たり前ですが動作保証は誰もしてくれない操作なので、作業は自己責任で。

## 事前準備
### WindowsPEのISOファイルを作成する
以下の手順に沿ってWindowsPEイメージを作っておきます。
https://qiita.com/SkyLaptor/items/204245cf6bb4fee5b19d

### XenToolsドライバをファイル共有に上げておく

1.WinSCPを使いXenServerへSCP接続する

2.`/opt/xensource/packages/iso`に潜ると`xs-tools-XXXX.iso`というファイルがあるので、タイムスタンプが新しい方を取り出す

3.ISOをマウントすると中に`citrixxendriversx64.msi`というファイルがあるので解凍する

```:解凍コマンド
msiexec /a citrixxendriversx64.msi targetdir="<解凍先フォルダフルパス>" /qn

【例】
msiexec /a citrixxendriversx64.msi targetdir="D:\citrixxendriversx64" /qn
```

4.解凍先フォルダに`Citrix`というフォルダが作成され、中に`Xen***`というフォルダ配下に`.inf`などがあることを確認する

解凍したドライバファイルをフォルダごと適当なWindows共有に上げておく

### WindowsServer2016を立てる
1.XenCenter上からテンプレートをWindowsServer2012に設定して仮想マシンを作成する

2.OSを普通にインストールする。（この時点ではマウスキーボードが効く）

インストール後はなるべく再起動せずシャットダウンさせておくこと。


## XenドライバをOSに読み込ませる
1.WindowsServer2016仮想マシンにてWindowsPEを起動する

2.IPアドレスを割り当てる
DHCPが流れていないネットワークであれば、以下のコマンドで静的IPを設定する。

```:静的IP設定
netsh inetface ip set address "<NIC名>" static <IPアドレス> <ネットマスク>

【例】
netsh inetface ip set address "イーサネット" static 192.168.1.10 255.255.255.0
```
### 備考:NIC名が日本語の場合の入力
日本語WindowsPEだとNIC名に「イーサネット」とわざわざ日本語表示されてしまい、IMEが動いていないWindowsPEでは打てない。
どうするかというと、`ipconfig`コマンドでNIC一覧を表示させるとNIC名が表示されるのでそれをコピペすると良い。

3.Xenドライバファイルを置いた共有をマウントする

```:マウントコマンド
net use n: <Xenドライバ置き場所パス>

【例】
net use n: \\192.168.1.50\xsdrv\Citrix\XenTools
```

4.適用先ボリュームレターの確認

```:
diskpart
diskpart> list volume
```

5.ドライバをOSイメージに適用する
ドライバファイル名から言って多分XenIfaceがキーボードマウスドライバっぽいですが、面倒なので片端から入れていきます。

```:ドライバ適用
Dism /Image:<OSイメージボリュームレター> /Add-Driver /Driver:XenBus /Recurse
Dism /Image:<OSイメージボリュームレター> /Add-Driver /Driver:XenIface /Recurse
Dism /Image:<OSイメージボリュームレター> /Add-Driver /Driver:XenNet /Recurse
Dism /Image:<OSイメージボリュームレター> /Add-Driver /Driver:XenVdb /Recurse
Dism /Image:<OSイメージボリュームレター> /Add-Driver /Driver:XenVif /Recurse

【例】
Dism /Image:E:\ /Add-Driver /Driver:XenBus /Recurse
Dism /Image:E:\ /Add-Driver /Driver:XenIface /Recurse ...
```

5.WindowsPEを終了し、WindowsServer2016を起動する

`exit` もしくは `wpeutil reboot`


以上で無事キーボードとマウスが利用でき、セットアップを進めることができました。
ログインが出来ましたら、あらためてしっかりとXenToolsをインストールしておきました。
OMCでOracle Databaseを監視する②

多数のリソースをまとめて監視する場合にはOracle Management CloudのIT Analyticsのサービスを活用することが効果的です。IT Anayticsを使用するには監視対象のリソース(エンティティ)にEnterpriseのライセンス付与する必要があります。エンティティには以下の画面から設定することができます。

Starndard --> Application Performance Monitoring, Infrastructure Monitoringが使用可能
Enterprise -> 上記 +  IT Analyticsが使用可能

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/fd4c7648-b86d-6cb4-1a8b-e796ce7ad7b3.png)

では実際にIT Analyticsを使ってみましょう

- ITアナリティクス -> データベース・リソース・アナリティクスをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/a390ba9d-8154-8c2d-f62f-c374cd4ce9cc.png)

- OMCに登録されているすべてのデータベースのリソースが集約して分析表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/a0fb0235-6bb0-3e4f-42c7-e18c41838ec3.png)

- CPU使用率の高いデータベースの特定や今後のリソース予測など俯瞰的な視野でリソースの使用状況を監視します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/64721bbf-6345-33ff-f7b0-efbc858bd342.png)

- 次はデータベース・パフォーマンス・アナリティクスをクリックしてみます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/05db5a45-b648-46a7-bd2c-3ea6c16cb88d.png)

- ここでは、パフォーマンスが低下しているデータベースや変動率が大きいSQL文を検出します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/d686001e-63a0-282e-f840-3173356c31da.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/8d0f1839-ec7f-3d74-cb4f-181f89e8331b.png)

- 特にパフォーマンスの変動が大きいSQL
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/a40f98dc-f628-d179-18c6-40e7320a36b3.png)

- 実際にレスポンスが遅くなったSQLの詳細情報
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/b5bd6149-a619-3cd8-1bb3-f471fd905ac4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/af88410a-2663-252b-ea54-327d23cec37a.png)

- その他のSQLパフォーマンス分析画面
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/73e06225-037d-9cd9-c63e-2782c5e018dc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562423/b4ef489d-2724-aa2a-b38e-1125908d6c98.png)

※詳細なSQLのパフォーマンス分析は監視対象のOracle DBがEnterprise EditionかつOracle Diagnostic Packが有効になっている必要があります。


IT Anayticsは、過去365日間を保持しており遡って分析可能です。また、これ以外にもOS、ミドルウェアやWEBアプリケーション用の分析画面が用意されています。
分析画面はコアなインフラ・エンジニア向けというより、どちらかというと全体把握をしたいIT部門向けを想定して作成されています。

Oracle Management Cloud関連の情報は[こちら](https://qiita.com/western24/items/1e44bfcaa77f3251a263)
cake php　サーバーサイドからのデータの受け取りと振る舞い

フロントサイドの経験があまりなく
初歩的なことに躓くこともあり、備忘録として記載

## サーバー → フロント
ajaxの場合は

```
$this->response->data
```
レスポンスにいれた値が返せます

ajaxでない場合

```
$this->request->data
```
しかもcakeの機能を使用してフォームを作成している場合

```
$this->request->data['search']['item1']
$('data[search][item1]')
```
みたいに連想配列の形にしておけば、そのまま値が反映される

便利ですね。

また、フロントからの情報も機会があれば書きたいと思います。
【RSpec】CSSのクラスではなくtypeからinput要素を操作する方法

## 概要
* RSpecで`click_on '文字列'`の文字列を今後変更しても対応できるようにRSpecを書く場合に調べたことのメモ
* findでCSSのクラス名を使わずにtypeから要素を選択する方法

## 該当のHTML

```html
<div class="auth-form__submit">
  <input type="submit" name="commit" value="確認" data-disable-with="送信中...">
</div>
```

## RSpecのコード

### Before
```ruby
click_on '送信'
```

### After
```ruby
find('input[type="submit"]').click
```

## まとめ
これでHTML側で文言が変更されても対応できるようにRSpecを改修することができました。

## 参考記事
[RSpec Capybara name / id のない input の fill_in にハマる](https://chaika.hatenablog.com/entry/2020/02/25/150000)
[ES5]多くのWebエンジニアができていないクライアントサイドの書き方(JavaScriptのアンチパターン等) ES5

フリーのエンジニアです。
出向先でクライアントサイドについて話す事がありましたので、記事にしました。
ES5に関する記事なので、古いブラウザ(ie11など)に対応することを想定してください。
メモした内容をそのまま貼り付けてます。わかりにくいかも。
#厳密等値演算子を使おう
　==,!= はアンチパターン
#Promiseを使おう
　ES5でもpolyfillを利用すれば、Promiseは使える
　積極的に使う事
#クラスの書き方
　コンストラクタはこう書く　var MyClass = function() { ... };
　メソッドはこう書く　#MyClass.prototype.methodA = function() { ... };
#組み込みオブジェクト(Mathのようなオブジェクトを作りたい時)の書き方
　モジュールパターンを使うとよい
#varをいくつも書かない
   カンマで区切ろう
#varのスコープは関数スコープ
　ブロックスコープはES5には無いよ。
　なるべく、関数の先頭にvarを書く
#配列の初期化は[]
　new Array()と書いてはいけない。オブジェクトの初期化は{}。new Object() と書いてはいけない。
#配列のループ処理は、foreach,reduce等を使う　
　for文は仕方なく使う感じ
#call,applyを使いこなすと便利 thisを固定できる
　thisは動的に決まる
　thisを正しく理解する事
#1モジュール1ファイルという決まりは無い
　クラスのメソッドがたくさんある場合、機能別に別ファイルにしても構わない
#プログラムのエントリポイントは意識せよ
　エントリポイントは1箇所にすべき
　jQueryを使っているなら、
　$(function() { });
  これの呼び出しは1箇所にして、ここで全部初期化しましょう。
#グローバル変数はなるべく少なくしよう
　サーバーが生成する変数は1つのオブジェクトで受け取ろう
#クライアントサイドMVCを意識してプログラミングしよう。
　見通しが良くなります
　悪い例　ビューに変数を埋め込む事
#同じ処理を2回以上書かない
　当たり前の事ですが、できていない人が多すぎる。関数にしましょう。
#$(selector)の戻り値は配列ではない
　配列ではありません。オブジェクトのような配列です。(object-like array)
#ES5でもデフォルト引数のようなことできる
　function test(a) { a = a || 10 }   // 引数が正の整数を期待している場合のサンプル
Vue.jsでマークダウン入力＆表示を実装する (mavon-editor)

# Vue.jsでマークダウン入力＆表示ができるページを作る
![screenshot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/416295/ac3597f5-d242-2632-558b-bd5f4f55a326.png)

こんなページを作ります。mavon-editorを使うと簡単にできました。
編集完了後に編集画面ではなく普通のページを表示する方法が意外と見つからなくて苦戦しました。

※追記
以前 `marked` を使ったページ表示方法を記載していましたが、 `marked` だと対応していないマークダウン記述が多かったので修正しました。

# インストール

```bash
npm install mavon-editor
```

# 実装

```javascript
import mavonEditor from 'mavon-editor'
import 'mavon-editor/dist/css/index.css'
import 'mavon-editor/dist/markdown/github-markdown.min.css'
import 'mavon-editor/dist/highlightjs/highlight.min.js'
import 'mavon-editor/dist/katex/katex.min.css'
import 'mavon-editor/dist/katex/katex.min.js'
Vue.use(mavonEditor)
export default {
  // 以下略
```

こんな感じで埋め込み対象のページで `import` しつつ、

```javascript
data: () => ({
  mavonEditor: {
    externalLink: {
      markdown_css: function() {
        return '/static/css/markdown/github-markdown.min.css'
      },
      hljs_js: function() {
        return '/static/js/highlightjs/highlight.min.js'
      },
      katex_css: function() {
        return '/static/css/katex/katex.min.css'
      },
      katex_js: function() {
        return '/static/js/katex/katex.min.js'
      },
    },
    // ツールバーにどのボタンを追加するか
    toolbars: {
      bold: true,
      italic: true,
      header: true,
      underline: true,
      strikethrough: true,
      mark: true,
      superscript: true,
      subscript: true,
      quote: true,
      ol: true,
      ul: true,
      link: true,
      code: true,
      table: true,
      fullscreen: true,
      readmodel: true,
      htmlcode: true,
      help: true,
      undo: true,
      redo: true,
      navigation: true,
      alignleft: true,
      aligncenter: true,
      alignright: true,
      subfield: true,
      preview: true,
    },
  },

  // マークダウンの内容を格納する変数
  body: '',

  // 以下、他の変数など
}),
```
でエディターの設定。

あとは、

```html
<mavon-editor
  language="ja"
  v-model="body"
  :counter="65535"
  :externalLink="mavonEditor.externalLink"
  :toolbars="mavonEditor.toolbars"
></mavon-editor>
```

でエディターの表示、

```html
<mavon-editor
  language="ja"
  v-model="body"
  :externalLink="mavonEditor.externalLink"
  :subfield="false"
  :editable="false"
  :toolbarsFlag="false"
  :boxShadow="false"
  defaultOpen="preview"
  previewBackground="#fff"
></mavon-editor>
```

でエディターで入力された内容の表示を行うことができました。
(外側にborderが表示されてしまうので、気になる方はborderを表示しないCSSを追加)
【やってみた】未経験エンジニアのPay.jp導入（Ruby on Rails）

###まずはじめに

**Pay.jpとは**
シンプルなAPIと豊富なライブラリで簡単にクレジットカード決済を導入できます。
ApplePayに対応していたり定期課金を組むことができます。
今回は開発環境での実装をイメージしているので後ほど出てくる各鍵はテストキーを使用しています。

##導入
**Pay.jpの登録**
まずは[アカウントを取得](https://pay.jp/)をします。
登録完了しログインすると下記のようになります。


<img width="1674" alt="pay.jp root_view.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498194/92360e07-d13a-35ed-d11f-29febe9a4008.png">

**gemのインストール**

```ruby:Gemfile
gem 'payjp'
```:fist_tone1::point_up:
**インストール**

```
bundle install
```


##環境変数の設定
まず、プロジェクト直下に.envファイルを新たに作成し、以下のように編集しましょう。

```
PAYJP_PUBLIC_KEY='自身のアカウントのテスト公開鍵'
PAYJP_SECRET_KEY='自身のアカウントのテスト秘密鍵'
```
各キーはPay.jpマイページのAPIより確認ができます。
<img width="1664" alt="Pay.jp api_view.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498194/b3b84802-e932-c8a2-8f62-5c9e82c5ab83.png">

そしてこの.envファイルをGithubにあげないよう .gitignoreに下記追記をします。

```ruby:.gitignore
/.env
```

##controller

支払い機能を管理するコントローラーを作成しpayアクションを定義します。
私の場合はPurchasesControllerを作成し記載しております。

```ruby:app/controllers/purchases_controller.rb

  def index
  end

  def pay
    Payjp.api_key = ENV["PAYJP_SECRET_KEY"]
    Payjp::Charge.create(
      amount: params[:amount],
      card: params['payjp-token'],
      currency: 'jpy'
    )
  end
```

Charge.createで売り上げ作成処理をしているのかと思います。
`amountは売り上げ金額`（ここではviewから取得したparams[:amount]を売上高とします。）、
`cardはクレジットカードのトークンを使っての決済`を表し、
`currencyは 'jpy'とすることで日本円での決済`としています。

また、indexに「カードで支払う」ボタンを設置します。

##ルーティング

payアクションのルートを追記します。

```ruby:route.rb

resources :purchases
post 'purchases/pay' => 'purchases#pay'
```


##view

ここまできたらあとはビューに支払い用のモーダルを設置する処理をするだけですね。

```ruby:app/views/purchases/index.html.haml

= form_with local: true, url: purchases_pay_path do |form|
  = form.number_field :amount
  %script.payjp-button{"data-key" => "自身のアカウントのテスト公開鍵", src: "https://checkout.pay.jp", type: "text/javascript"}

```

なんとこれだけでindex.html.hamlに表示される「カードで支払う」ボタンを押すだけで下記のようなモーダルが出てくるんです。
<img width="1170" alt="Pay.jp modalview.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498194/11a32c79-8b37-00ed-95cb-61e6d2f5bcc5.png">


忘れずに支払い完了後のviewも用意します。

 ```ruby:app/views/purchases/pay.html.haml

支払いが完了しました

= link_to 'Topへ', root_path
```

ここまで完了したら実際に試してみましょう！
index.html.hamlに記載した「カードで支払う」ボタンを押して、モーダルを開き必要な情報を入力します。
カード番号はあらかじめPay.jpで用意しているテスト用の共通カード番号'4242 4242 4242 4242'、
有効期限は現在から未来の日付、CVC番号は3桁の適当な数字、名前も適当な名前を入力して「カードで支払う」ボタンをクリック。

すると下記のようにpay.html.hamlの画面になれば完了です。
※CSSを当ててないのでシンプルですがご了承ください。

<img width="818" alt="pay.jp paied_view.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498194/8486b4f9-e0d2-d714-ec37-f1a2d67dcd15.png">

実際にPay.jpにアクセスし売り上げの画面を見て、支払い済みとなっていれば問題ないです。


##さいごに

今回は開発環境についてですが、本番環境の際はもう少し考慮する点はあるかと思います。
が、皆さんならやってくれると信じてます。

ここから発展して定期課金などはまたの機会でご紹介できればなんて思ってます。

ありがとうございました。
SwiftUIのButtonに角丸の枠線をつける

# はじめに
SwiftUIで角丸の枠線がついたButtonを表示します。
<img width="300" alt="スクリーンショット 2020-02-26 15.23.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221224/b5f1a997-d46c-e87c-9739-61758c57cc1b.png">


# 環境
Xcode 11.3.1
Swift 5


# やり方
テキストの上に角丸の長方形を描画します。

```swift

Button(action: {
        print("Button tapped.")
    }) {
        Text("Hello!")
            .font(.title)
            // テキストのサイズを指定
            .frame(width: 160, height: 40, alignment: .center)
            // 枠線を描画
            .overlay(
                RoundedRectangle(cornerRadius: 20)
                    .stroke(Color.yellow, lineWidth: 2)
            )
    }
    // 文字色を指定(わかりやすいように枠線と違う色にしています)
    .foregroundColor(.pink)
```


# 余談(失敗例)
Xcode11 beta6では下記のように`.border()`だけで実装できたようですが、
現在は引数からcornerRadiusが廃止されています。 

``` swift
.border(Color.yellow, width: 2, cornerRadius: 20)
```

`.cornerRadius()`を別で追加する方法も試してみましたが
丸めた角の部分が上手く表示されないようでした。

```swift

Button(action: {
        print("Button tapped.")
    }) {
        Text("Hello!")
            .font(.title)
            .frame(width: 160, height: 40, alignment: .center)
            // 角丸枠線を描画したかった…
            .border(Color.yellow, width: 2)
            .cornerRadius(20)
    }
    .foregroundColor(.pink)
```
<img width="290" alt="スクリーンショット 2020-02-26 15.25.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221224/30afa39d-9740-a10c-2015-905e4e3c1b55.png">
JavaScriptのメモ

# これは何？
個人的なメモです。


# 書き換え？

## boolean

```javascript
!0 === true // true 
!1 === false // true
```

## if

```javascript
let a = 100
let b = false
if( b === false ) {
  a += 100
}
console.log(a) // a = 200
```
↑↑↑同義↓↓↓

```javascript
let a = 100
let b = false
b === false && ( a += 100 )
console.log(a) // a = 200
```

# 置換
## repelace （非破壊）

```javascript
let some_word = '123456789'
some_word.replace(/4567/, '')
> "12389"

console.log('some_word=[%s]', some_word)
> some_word=[123456789]
```

# Array

## 破壊を非破壊処理にする

```javascript
let some_array = [1, 2, 3, 4, 5, 6, 7, 8]

some_array.pop() // 破壊
some_array.slice().pop() // 非破壊
```

## サイズ指定＆同じ数値で初期化

```javascript
let N = 10
let init_num = 0
let some_array = new Array(N).fill(0)
```

## Math.sum()

```javascript
let some_array = [1, 2, 3, 4, 5, 6, 7, 8]
some_array.reduce((a, b) => a + b, 0)
```

## Math.max()

```javascript
let some_array = [1, 2, 3, 4, 5, 6, 7, 8]
let max_num = Math.max(...some_array)
```
## 数値としてsort() [破壊]

```javascript
let some_array = [9, 1, 12, 13, 4, 15, 6, 7, 8]
// 破壊
some_array.sort( (a, b) => { return a - b })　// 昇順
some_array.sort( (a, b) => { return b - a })　// 降順
```

## forEachでkey,value

```javascript
let some_array = [9, 1, 12, 13, 4, 15, 6, 7, 8]
some_array.forEach( (val, key) => {
  console.log('key=[%s] val=[%i]', key, val)
})
```

## 要素分割
```javascript
let some_array = [9, 1, 12, 13, 4, 15, 6, 7, 8]

some_array.slice().splice(3, 5) // index=3 から 5 要素 
> (3) [13, 7, 8]

some_array.slice().slice(5) // index=6 から最後までの要素
> (4) [15, 6, 7, 8]
```
## 重複要素の削除(distinct)

```javascript
const unique = (value, index, self) => {
  return self.indexOf(value) === index
}

const ages = [26, 27, 26, 26, 28, 28, 29, 29, 30]
const uniqueAges = ages.filter(unique)

console.log(uniqueAges)
> (5) [26, 27, 28, 29, 30]
```



# Object
## ObjectのキーをArrayで取得

```javascript
let some_obj = {
  a: 0,
  b: 1,
  c: 2
}
let keys = Object.keys(some_obj)
```

## ObectをforEach
```javascript
let some_obj = {
  a: 0,
  b: 1,
  c: 2
}
Object.keys(some_obj).forEach( key => {
  let val = some_obj[key]
  console.log('key=[%s] val=[%i]', key, val)
})
```
## ObjectのValue最大

`arr_idx` は `arr` のindex。

```javascript
arr_idx = []
let arr = Object.keys( obj ).map( ( key ) => {
  arr_idx.push(key)
  return obj[key]
})
let min = Math.min.apply( null, arr );
let max = Math.max.apply( null, arr );
```



# console
```
%s : String
%d or %i : Number
%f : Floating points
%o : an Object
%j : JSON
```


# Reference
- [JavaScriptの配列の使い方まとめ。要素の追加,結合,取得,削除。 - Qiita](https://qiita.com/takeharu/items/d75f96f81ff83680013f)
Vue.jsで環境変数を設定する

## やりたいこと
Vue.jsでお天気アプリを作成したのでgithubにあげたらAPIKeyも一緒にあがってしまったので隠したい

## 手順
#### プロジェクト直下にenvファイルをつくる
![スクリーンショット 2020-02-26 15.22.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447438/13a1925a-be71-7d5c-49ca-777263dedc86.png)
#### 変数を定義する

```:.env
# openweathermap
VUE_APP_API_URL_WEATHER = https://cors-anywhere.herokuapp.com/http://api.openweathermap.org/data/2.5/weather?id=1850147&units=metric&appid=APIキー

# forecast
VUE_APP_API_URL_FORECAST = https://cors-anywhere.herokuapp.com/https://api.darksky.net/forecast/APIキー/35.6895,139.6917?lang=ja&units=si
```

#### 呼ぶ
`process.env.変数名` で呼び出せる

```javascript
getWeather() {
    this.$axios
        .get(process.env.VUE_APP_API_URL_WEATHER, {})
        .then(result => {
          this.weather = Weather.create(result);
        })
        .catch(error => {
          console.log(error);
        });
    },
```

#### 確認
<img width="272" alt="スクリーンショット 2020-02-26 15.41.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/447438/28c479da-40b6-8944-3f4b-7fe3cf5bbf45.png">

ちゃんと表示されました🐰
[C#]例外処理を理解しよう

#1. 例外処理とは？
・ざっくり言うと想定内のエラーが発生した際にやる処理の事
#2. 例外処理のメリット
・実行時に発生する問題に対応
・プログラムを安定して動作させる
・エラーメッセージを読み取れる

#3. 例外処理(Exception)の機能
|コマンド名 |内容 |
|---|---|
|**・try**|あらかじめコードを指定して、プログラム実行時に処理の問題を検出
|**・catch**|問題を検出した時、どのように対応するか記述しておく
|**・throw**|プログラム実行中に、例外が発生した事を知らせる

#4. 例外が発生する例
・ゼロで割り算
・数値変換で、数字でない文字を指定
・配列の範囲外にアクセス
・ファイルが存在しない

#5. 実例

###・簡単な例外処理をしてみよう

```csharp:Lesson1.cs
// 簡単な例外処理をしてみよう
using System;

class Lesson1
{
    public static void Main()
    {
        // 例外が投げられる可能性のあるコード
        try
        {
            Console.WriteLine("Hello World");
            
            int number = 0;
            // 0で割り算できないためエラーが起きる
            // ここで処理が中断され、catchブロックに飛ぶ
            int answer = 100 / number;
            Console.WriteLine(answer);
        }
        // 例外が起きた場合の処理
        // Exception e の中に例外の詳細情報が格納されている
        catch(Exception e)
        {
            Console.WriteLine(e.Message);
        }
        // 例外発生の有無にかかわらず実行したいコード
        finally
        {
            Console.WriteLine("Hello C#");
        }
    }
}

```

###・throwで意図的に例外を投げよう

```csharp:Lesson2.cs

// throwで意図的に例外を投げよう
using System;

class Lesson2
{
    public static void Main()
    {
        Console.WriteLine("Hello World");

        try
        {
            int number = 2;
            int answer = 100 / number;
            Console.WriteLine(answer);
            // 意図的に例外を投げる
            throw new Exception();
        }
        catch (DivideByZeroException e)
        {
            Console.WriteLine("0では割り算できません");
            Console.Error.WriteLine(e);
        }
        // throw で呼ばれる
        catch (Exception e)
        {
            Console.WriteLine("例外が発生しました。");
            Console.Error.WriteLine(e);
        }
        finally
        {
            Console.WriteLine("Hello C#");
        }
    }
}
```
よく使うffmpeg設定

個人的によく使うffmpeg設定のメモ（随時更新予定）

* 入出力ファイル設定

```bash:bash

IVIDEO="Input.MP4"
ODIR="output"
OVIDEO="Output.MP4"

mkdir $ODIR
```

* ビデオの変換(-intra:Iフレームのみ、-an:音無し、-pix_fmt yuv420p: MacのQuickTimeでも再生できるもの, -crf 1: 固定品質(数値が小さいと高品質))
`ffmpeg -i $IVIDEO -an -intra -crf 1 -pix_fmt yuv420p $ODIR/$OVIDEO`

* 高品質動画
`ffmpeg -i $IVIDEO -an -vsync 0 -qscale:v 1 -qmin 1 -qmax 1 $ODIR/$OVIDEO`

* １秒間に3フレームの静止画("出力フォルダ/frame000001.jpg"など)を出力
`ffmpeg -i $IVIDEO -r 3 $ODIR/frame%06d.jpg`

* 10フレーム毎にフレームを静止画("出力フォルダ/frame000001.png"など)として取得
`ffmpeg -i $IVIDEO -vf framestep=10 -vsync 0 $ODIR/frame%06d.png`

* 特定の１フレームを出力(時刻0:0:0 `hh:mm:ss[.xxx]`の形式で指定)
`ffmpeg -i $IVIDEO -ss 0:0:0  -vframes 1 -qmin 1 -q 1 $ODIR/frame01.jpg`

* 特定のフレームを出力（フレーム番号299-600）
`ffmpeg -i $IVIDEO -vf trim=start_frame=299:end_frame=600,setpts=PTS-STARTPTS -vsync 0 $ODIR/frame%06d.png`

* 高品質な静止画("出力フォルダ/frame000001.jpg"など)として10フレーム毎に出力
`ffmpeg -i $IVIDEO -vf framestep=10 -vsync 0 -qmin 1 -q 1 $ODIR/frame%06d.jpg`

* 解像度変更(8K出力)
`ffmpeg -i $IVIDEO -vf scale=8192:-1 $ODIR/$OVIDEO`
Pythonではじめる機械学習 個人的備忘録 Part1

# はじめに
Pythonで機械学習を学ぼうと思い立ち、
まず手に取った本「Pythonではじめる機械学習」を読んでいくときの個人的備忘録として書いています。

IT企業には所属しておりませんが、これからいろいろと学んで仕事をしていけるよう精進してまいります。
初学者の方に少しでも力になればと思い、ログを残しています。

# scikit-learnのインストール
scikit-learn(サイキット・ラーン)と読みます。
下のリンクに取扱い説明書があります。
一部の人だけかもしれませんが、リンク先の図を見ているとgnuplotを思い出しますね。
・[scikit-learnのドキュメント](https://scikit-learn.org/stable/index.html)
・[scikit-learnのユーザーガイド](https://scikit-learn.org/stable/user_guide.html)

Jupyter Notebookをインストールするかどうか悩んだのですが、最初なので本に従うことにしました。
使ってみれば便利かもしれないですしね。
Jupyter NotebookをインストールするためにはAnacondaをインストールします。
・[Anaconda公式サイトのダウンロードページ](https://www.anaconda.com/distribution/)

Anacondaをインストールするとこの本で用いるパッケージはすべて使うことができます。
既にPythonを使っている人はターミナルで

~~~
pip install numpy scipy matplotlib ipython scikit-learn pandas pillow
~~~

と打てばこの本で利用するライブラリをインストールすることができます。

Jupyter Notebookの使い方は下のリンク先に書いてあります。
[【Jupyter Notebook】効果的な使い方を知ろう[Python/機械学習]](https://qiita.com/takuyanin/items/8bf396e7b6b051670147)

### NumpyとSciPyの違い
NumPy(ナンパイorナムパイ)とSciPy(サイパイ)です。
SciPyは各種ソフトの集合のことで、NumPyの機能はSciPyで全部使えます。
・[SciPyとその仲間たち（NumPy, IPython など）の違いと関係](https://over80.hatenadiary.jp/entry/20160221/scipy)
・[NumpyとScipy](https://www.eidos.ic.i.u-tokyo.ac.jp/~tau/lecture/computational_physics/slide/numpy.pdf)
私のような初学者からすると、大した違いもまだ分からないので気にせずいきます。

###　CSR
CSRはCompressed Sparse Rowの略で疎行列を圧縮した形になっています。
行列計算ってだいたいの成分が0の行列を扱うことが多いので、
無駄にデータが増えないような便利な形にしているんだと思います。

COO形式はCoordinate Formatの略で普通に行列の番号を指定してあげるやり方です。

### pandas
本には

~~~
from IPython import display
~~~

と書かれているのですが、その後

~~~
display(data_pandas) 
~~~
の箇所で

~~~
TypeError: 'module' object is not callable
~~~
とエラーが出てしまいます。
僕の環境では、

~~~
from IPython.display import display 
~~~
とするとうまくいきました。
多分バージョンが違うからだと思います。

# アイリスのクラス分類
![Iris_virginica.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589858/07061b8c-0631-7c96-53ee-8d7264cb1f0e.jpeg)

scatter_matrix関数を使うときに本では

~~~
grr = pd.scatter_matrix(iris_dataframe, c=y_train, figsize=(15,15), marker='o', hist_kwds={'bins': 20}, s=60, alpha=.8, cmap=mglearn.cm3)
~~~
と記述があるが、僕のバージョンだと

```
grr = pd.plotting.scatter_matrix(iris_dataframe, c=y_train, figsize=(15,15), marker='o', hist_kwds={'bins': 20}, s=60, alpha=.8, cmap=mglearn.cm3)
```

で動いた。

# 感想
今回は第１章はじめにを読んでわからなかったところを書いた。
環境の整備がほとんどであったが、最後に少しだけ機械学習についても触れた。
k-最近接法でアイリスの分類を行ったがモデルの詳しい部分は触れられていない。
パラメータがいろいろとあるが変更するパラメータはこの後の章で紹介していくと記述があった。
いまのところ、パラメータいっぱいでわけわからん状態ですがこつこつ続けていきたいと思っております。

次回からは本格的に機械学習の内容、教師あり学習について学んでいく。
UICorectionViewで指定したCellへ移動する処理

 当日cellへ移動処理表示後のUIViewControllerのライフサイクルのviewDidAppear
 にてscrollToItemを利用してスクロールとanimated: false指定で処理。

```swift
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        print("aaaaaaaaaaaaaaaaa")
        let indexPath = IndexPath(item: elapsedDays + 5, section: 0)
        myCollectView.scrollToItem(at: indexPath, at: .centeredVertically, animated: false)
　　　　　//tableViewではitemがrowで指定する。
        //myCollectView.scrollToItem(at: IndexPath(row: 100, section: 0), at: .left, animated: false)
        //myCollectView.reloadData()
    }
```
TeraTerm自動ログインマクロ

ダイアログで選択したサーバに自動ログインするTeraTermマクロをメモ書きします。

![サーバ選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/592679/6c80df41-550c-698b-741e-18b99f85ef6f.png)


```
;===============================================
;; [[初期値設定]]

;; 接続先定義数
DEFINE_NUM = 2

;; 接続先種類定義
strdim TYPE_NAME DEFINE_NUM
TYPE_NAME[0] = '開発環境サーバ'
TYPE_NAME[1] = '検証環境サーバ'

;; サーバアドレス定義
strdim HOST_ADDRESS DEFINE_NUM
HOST_ADDRESS[0] = '192.168.1.X'
HOST_ADDRESS[1] = '192.168.1.Y'

;; ユーザ名定義
strdim USER_ID DEFINE_NUM
USER_ID[0] = 'userId1'
USER_ID[1] = 'userId2'

;; パスワード定義
strdim PASSWD DEFINE_NUM
PASSWD[0] = 'password1'
PASSWD[1] = 'password2'

;; 秘密鍵ファイルパス定義(フルパス)
strdim KEY_FILE DEFINE_NUM
KEY_FILE[0] = ''
KEY_FILE[1] = 'C:\Users\userId2\.ssh\id_rsa'

;; 選択接続先インデクス
SELECTED_INDEX = -1
;===============================================

;; 接続先種類選択
listbox '接続先を選択して下さい' '接続先選択' TYPE_NAME
if 0 <= result then
	SELECTED_INDEX = result
    ;;messagebox TYPE_NAME[SELECTED_INDEX] '選択された接続先'
else
    end
endif

;; 接続用コマンド組立て
COMMAND = HOST_ADDRESS[SELECTED_INDEX]
strconcat COMMAND ':22 /ssh /2'
strlen KEY_FILE[SELECTED_INDEX]
if 0 < result then
	strconcat COMMAND ' /auth=publickey'
	strconcat COMMAND ' /keyfile='
	strconcat COMMAND KEY_FILE[SELECTED_INDEX]
else
	strconcat COMMAND ' /auth=password'
endif
strconcat COMMAND ' /user='
strconcat COMMAND USER_ID[SELECTED_INDEX]
strconcat COMMAND ' /passwd='
strconcat COMMAND PASSWD[SELECTED_INDEX]
 
;; 接続コマンド実行
connect COMMAND
 
;; マクロ終了
end
```
PHPでMySQLからデータを取得したときにinteger型が文字列になる問題

# 問題の始まり
とあるSPAな案件をやっていて、慣れているPHPでAPIサーバ作ってやろう！
と初めてのAPIを構築していたところ、データベースからのレスポンスが**全部文字列で帰ってくる。**

調べてみると、PDOでの解決方法はあれどmysqliはなかなか見つからずどうしたらいいんだ・・・
となったので備忘録がてらメモしておきます。

# PDOの場合
`PDO::ATTR_EMULATE_PREPARES`を`FALSE`にしましょう。
これは**プリペアドステートメントをエミュレートモードで使用する**というオプションで、デフォルトでは`TRUE`になっています。

この場合、MySQLではなくドライバ側でエスケープ処理などが行われるのですが、
副作用で**レスポンスがすべてStringで戻ってくる**ようになります。（型情報が失われる）

ただし、**エミュレーションのほうが早い**[^1]ので、オフにする場合は計画的に。

# mysqliの場合
`MYSQLI_OPT_INT_AND_FLOAT_NATIVE`を`TRUE`にしましょう。

というより[マニュアル](https://www.php.net/manual/ja/mysqli.options.php)にめっちゃ書いてあります。
コードを書くときはちゃんと公式マニュアルを読むようにしましょう・・・（します）

### 注意点
こちらもPDOもそうですが、**サーバ側がmysqlndに対応**していないといけません。
おそらくその辺りの兼ね合いでデフォルトでは無効になっているんでしょうね。


[^1]: [ここ](https://qiita.com/mpyw/items/b00b72c5c95aac573b71#pdoattr_emulate_prepares)や[ここ](https://qiita.com/a4_nghm/items/63b03c4248c69c5472b0)を参照
Android Studio 3.6でオフラインモードを設定する方法

Android Studio 3.6の安定版がリリースされましたね。
https://android-developers.googleblog.com/2020/02/android-studio-36.html

色々と新機能も追加され、アップデートした方も多いかと思います。

そんなAndroid Studio 3.6ですが、オフラインモードの設定箇所が変わっており、初見だとどこで設定すればいいのかわからなかったのでメモがてら投稿します。

# 今までのところにない
今までは `Preferences` の `Gradle` に **Offline work** のチェックボックスがあり、そこをチェックすることでオフラインモードを有効にしていたかと思います。
しかしながら、3.6ではそのチェックボックスが消えてしまいました。


## 3.5
<img width="1139" alt="スクリーンショット_2020-02-26_15_13_46-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/34481b55-5aff-438f-28c8-75ea7ef0e866.png">


## 3.6
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/cd9ed95a-ab4f-3d04-180d-131c88dc872f.png" />


# サイドバーのGradleにあった
探した結果、公式ページにきちんと載っていました :innocent: 
https://developer.android.com/studio/preview/features#gradle-offline-ui

サイドバーの **Gradle** 右から2番目のアイコンがオフラインモードの設定でした。（ちょっとわかりにくい…？）

![スクリーンショット_2020-02-26_15_23_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/b3d150ce-81d8-0b96-b588-f94d7951a726.png)

このアイコンをクリックすることで設定が切り替わるのですが、有効・無効がわかりにくかったのでスクショを貼っておきます。

## オフラインモード有効
![スクリーンショット 2020-02-26 15.31.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/ff4689c4-724f-b518-5228-51a6813111fb.png)

## オフラインモード無効
![スクリーンショット 2020-02-26 15.31.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/636e5a13-c0f4-0ebc-133e-480aa29d6f2e.png)
MacでVSCode+PlantUMLを用意する

## 概要

MacでPlantUMLが書ける環境を用意したい時があるので手順をメモ

## 前提

- MacのバージョンはMojave Ver10.14.6
- Homebrewのバージョンは2.2.6
- VSCodeのバージョンは1.42.0
- HomebrewとVSCodeは既にインストールされている前提です


## 導入手順

### PlantUMLを導入



[公式ドキュメント](https://plantuml.com/ja/starting)に

> 自分の環境に Java をインストールしておいてください。 また、シーケンス図とアクティビティ図 以外 のダイアグラムを使いたい場合は、Graphviz software もインストールしてください。

と書いてあり、私はよくクラス図を書くのでGraphvizもインストールします。

Macなのでbrewを使ってインストールします。

```sh:console
# graphvizとplantumlをインストール
brew install graphviz
brew install plantuml
```

### VSCodeにPlantUMLプラグインを導入

VSCode左袖のExtensionsタブで`plantuml`と検索します。  

<img width="964" alt="スクリーンショット 2020-02-26 15.18.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187231/f7f74b8e-eb63-54db-b5ff-2edf828eba91.png">

すると画像のプラグインが表示されるのでインストールします。

## 動作確認

では動作を確認します。
VSCodeで新規ファイル(拡張子は.pu)を作成し、以下のクラス図を貼り付けます。

```
@startuml
package Logger {
    class Logger {
        void __construct(Driver driver)
        string log(string comment)
    }
    class Driver {
        string output()
    }
}

Logger ..> Driver
@enduml
```

### プレビュー

貼り付けたら`option+d`を押してUML図を描画します。

<img width="1029" alt="スクリーンショット 2020-02-26 15.30.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187231/6c08ec04-675c-f321-1899-c006ee92a2aa.png">

このようなプレビューが出たら成功です。

### 画像生成

プレビューの画像はダウンロードもできます。  
関係各所への共有に便利です。

`command+shift+p`でVSCodeのコマンドモードに移行します。  

入力画面に`plantuml`と入力するといくつかサジェストされるので、  
`PlantUML: Export current diagram`を選択してください。

<img width="492" alt="スクリーンショット 2020-02-26 15.33.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187231/a3b72015-a858-9941-5425-8808f4f6469c.png">

するとファイル形式の一覧が出るので選択してください。  
選択後しばらくすると以下の通知が出るので、ダウンロードフォルダを探してみてください。  

<img width="481" alt="スクリーンショット 2020-02-26 15.35.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187231/ce430b8e-ad42-d3a8-821f-b8364c6c5ed6.png">

UML図の画像が出来上がっているはずです。

## 参考

- [PlantUMLのドキュメント](https://plantuml.com/ja/sitemap-language-specification)
    - PlantUML自体の記法や使い方は上記ページを確認してください。(一番正確なので！)

- [PlantUMLをMac OS Xで使う](https://qiita.com/kohashi/items/1d2c6e859eeac72ed926)
    - 普段大変お世話になっています。今回は自分の必要な部分だけ切り抜いて加筆しました。
iOSアプリ申請リジェクト　Apple Developer Program account under investigation

#下記の理由でアプリ申請がリジェクトされる

###We are unable to continue this app’s review because your Apple Developer Program account is currently under investigation for not following the App Store Review Guidelines’ Developer Code of Conduct.

###googleで翻訳すると、
お使いのApple Developer Programアカウントは、App Storeレビューガイドラインのデベロッパー行動規範に従っていないため、現在調査中のため、このアプリのレビューを続行できません。

###ネットで解決方法を調べると

- 2019年初期から同様の事象が多発している。
- 個人開発者によく起きる
- かつ、１つ目のアプリ申請で起きやすい
- ゲームアプリに起こりやすい
- Appleの調査中は、開発者は何も出来ない（別のアプリのアップデートもできなくなる）
- 調査期間は、半年以上と言う人もいる
- 2020年1月時点では、調査期間が１週間から１ヶ月で推移していらしい

参考１
https://forums.developer.apple.com/thread/116331

参考２
https://qiita.com/gureta/items/b21b264dfa95051e67bb

#　試したこと

### 1. 申請したアプリをapp store connectから削除して、新しいappとして再申請（開発者アカウントは同じ）

### 2. ４週間待つ

### 3. 法人のディベロッパーアカウントを新規作成

# 結果

###法人のディベロッパーアカウントを作成し、申請すると審査してもらえた。

#　開発環境
- 個人の開発者アカウント
- 初めてのアプリ申請
- firebaseを使ったSNSアプリ
- ホームページあり

#経緯

##### 2月21日　
- 15:49　　アプリ申請提出
- 18:41　　ステータスが In Reviewに更新
- 20:51　　申請のリジェクト通知

##### 2月22日　
ネットでリサーチした結果、リジェクトされたアプリを削除

##### 2月24日
申請内容を見直してみて、再度新規のアプリとして申請し直す。

- 20:07 　申請提出

##### 2月25日

- 4:32 　ステータス　In Review

##### 2月26日

- 2:30 　2回目のリジェクト（理由は、1回目と同じApple Developer Program account is currently under investigation）

##### 3月23日

１ヶ月間もappleに放置されたので、再度削除する。。
この間にいろいろ調べたので、いくつか修正して再々トライ予定。

##### 3月31日

- 18:03 　ステータス　Waiting for Review

##### 4月1日

- 9:30 　ステータス　In Review
- 9:32 　なんとたった2分のレビューでリジェクト。もはや絶望的。（理由は、1回目と同じApple Developer Program account is currently under investigation）

##### 4月6日

- 法人で新たにディベロッパーアカウントを作成

##### 4月7日

- 法人アカウントで申請を提出すると問題なく審査してもらえた。
apacheを使う

##apacheを使ってみる
サーバーのことについて勉強をしてみたいと思ったので、apacheを使ってみました。
https://qiita.com/kid_drill/items/5c85917068490177b6ab
の@kid_drill さんの記事を殆ど参照しました。
備忘録として。


##詳細
殆ど記事通り
セクション3のユーザディレクトリの有効化について補足
/etc/apache2/httpd.con　や/etc/apache2/extra/httpd-userdir.conf　内から特定のファイルを検索するのに、コマンドモードで`/検索したい文字列`を使って検索すること。
検索したいキーワードがハイライトされている状態で`n`を使うと次の検索項目にジャンプできること。

最終的に自分は`index.html`の内容をhttp://mh.rgr.jp/memo/mh0025.htm の内容をお借りして表示しました。
![スクリーンショット 2020-02-26 15.30.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402798/128d6cba-5097-ae62-3b17-5e2383a9ebc6.png)

文字化けはしてるけど、`index.html`　を変更できたからよし笑

##感想
文字化けはなんでなんだろ。
次は文字化け直して、cssファイルもつけます。

##参照
・MacでApacheを立ち上げてみる
https://qiita.com/kid_drill/items/5c85917068490177b6ab
・viの基本的な使い方
https://rat.cis.k.hosei.ac.jp/article/rat/serverliteracy/2004/vi.html
・【初心者向け】viでの文字列の検索方法を一通り
https://eng-entrance.com/linux-vi-search
・HTML文書の例
http://mh.rgr.jp/memo/mh0025.htm
ヘビーすぎて動画に出来ないAE

#アイディアを膨らませる為にデザイン探ってたら・・・
いろいろアイディアを膨らませる為に、いろんなデザイン見ていたらこれAEでやってみよう！！
とかって良くあるんですが、実際にAEでやるとヘビー（処理が重い）になる事が多々。。。
でも考え方とかは幅が広がるから面白くてついつい時間を使っちゃいます・・・
そして今回もその時間が・・・
作品としては面白いけど、処理が重いので、皆さんに紹介するのはどうかなと・・・
ただここなら、参考までにこうゆうの出来るよ！！って事で、軽く説明とキャプチャを貼る

#出来たのはこんなもの
![コメント 2020-02-26 151858.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178061/9a0f0aa4-b062-f644-d9fa-c63cfa2465e8.jpeg)

#作り方を簡単に説明
今回はpointOnPath()のメソッドを使ってます。
①まずはテキストレイヤーでテキストを作成して、テキストレイヤーをシェイプに変換
②平面レイヤーを作って適当にマスクを作成、
③テキストシェイプのグループ内のトランスフォーム位置とスケールにエクスプレッションを書く

```jsx
//位置にはこのエクスプレッション
rank = thisProperty.propertyGroup(2).propertyIndex;
numPropObj = thisProperty.propertyGroup(3).numProperties;

pos = rank / numPropObj;

thisComp.layer("明るいグレー 平面 1").mask("マスク 1").maskPath.pointOnPath(pos,time);

//スケールにはこのエクスプレッション
rank = thisProperty.propertyGroup(2).propertyIndex;
controler = effect("controler")("スライダー");
seed = effect("seed")("スライダー");
result = value[0]+(seed+Math.cos(rank/10)*controler);
[result,result]

//controlerとseedはスライダー制御です。
```

これであとはシェイプレイヤーグループを大量に作成するだけ、今回は300ぐらいグループを複製してます。

重いけど興味ある方はぜひチャレンジを！！
go get でプライベートリポジトリをダウンロードできない時

公開リポジトリはダウンロード出来るけど・・・

```
go get github.com/motemen/gore
```
プライベートリポジトリはダウンロードできない！

```
pi@raspberrypi:~ $ go get github.com/CreatorsLab/test-repository
# cd .; git clone -- https://github.com/CreatorsLab/test-repository /home/pi/go/src/github.com/CreatorsLab/test-repository
Cloning into '/home/pi/go/src/github.com/CreatorsLab/test-repository'...
remote: Invalid username or password.
fatal: Authentication failed for 'https://c61axxxxxxxxxxxxxxxxxxxxxxxxx:x-oauth-basic@github.com/CreatorsLab/test-repository/'
package github.com/CreatorsLab/test-repository: exit status 128
```
## 結論 c61aいらないわ

以下URLには
https://github.com/k8sp/sextant/issues/29

```
git config --global url."https://c61axxxxxxxxxxxxxxx:x-oauth-basic@github.com/".insteadOf "https://github.com/"
```
こうしろって書いてあるけど、これだと動かなかった。
でも、

```
git config --global url."https://xxxxxxxxxxxxxxx:x-oauth-basic@github.com/".insteadOf "https://github.com/"しろ
```
こうしたら動いた
COTOHA でキーワードの抽出 (PHP)

[COTOHA API Portal](https://api.ce-cotoha.com/contents/index.html) の使用例です。

```php:key_word.php
#! /usr/bin/php
<?php
// ------------------------------------------------------------------
//	key_word.php
//
//						Feb/26/2020
//
// ------------------------------------------------------------------
include('Requests/library/Requests.php');
require_once './vendor/autoload.php';

// ------------------------------------------------------------------
include "get_config.php";
include "get_token.php";

// ------------------------------------------------------------------
fputs (STDERR,"*** 開始 ***\n");

Requests::register_autoloader();

$file_in = $argv[1];
echo	$file_in . "\n";

$doc = file_get_contents ($file_in);

$config = get_config_proc();
$access_token = get_token_proc($config);


$headers = array();
$headers['Content-Type'] = 'application/json';
$headers['Authorization'] = 'Bearer ' . $access_token;

$data = array();
$data['document'] = $doc;
$data['type'] = 'default';

$str_json = json_encode ($data);

$url_target = $config['url_base'] . 'v1/keyword';
$request = Requests::post($url_target, $headers, $str_json);

var_dump($request->status_code);

$json_string = $request->body;
$dict_aa = json_decode ($json_string,true);

foreach ($dict_aa['result'] as $key => $unit_aa)
	{
	$str_out = $unit_aa['form'] . "\t" . $unit_aa['score'];
	print($str_out . "\n");
	}

fputs (STDERR,"*** 終了 ***\n");

// ------------------------------------------------------------------
?>
```

get_config.php get_token.php はこちら
[COTOHA API で構文解析 (PHP)](https://qiita.com/ekzemplaro/items/7afc653777e3785c6a02)

実行結果

```text
$ ./key_word.php akai_rousoku.txt
*** 開始 ***
akai_rousoku.txt
int(200)
猿	135.52966
蝋燭	83.9601
花火	78.08584
亀	43.078
火	42.81965
*** 終了 ***
```
Railsチュートリアルメモ - 第8章

[メモの目次記事はこちら](https://qiita.com/yokohama4580/items/dedfd5510080273dc2a0)

[Railsチュートリアル8章へのリンク](https://railstutorial.jp/chapters/basic_login?version=5.1#cha-basic_login)

第7章からだいぶ日にちが空いてしまった。。。
気を取り直して最後まで完走していく

## サマリ
- パスワード認証機能の追加
- cookieを利用したセッション管理

## ポイント
- flash変数の設定後の画面表示をrenderにするとflashメッセージが消えずに残り続けてしまうが、flash.nowにすると次のリクエストでメッセージが消える
- Railsで事前定義済みのsessionメソッドが利用できる
    - `session[:user_id] = user.id`
- `User.find(session[:user_id])`を使うと、userが存在しないときに例外が発生するので、`User.find_by(id: session[:user_id])`を使用する
- `app/helpers/`配下に追加したヘルパーモジュールは全てのコントローラーで使用できる。今回はsession_helper.rbを追加して、ログイン・ログアウト用の処理を全てのコントローラーから利用できるようにする。
- 余計なDBアクセスを避けるため、`||=`を使用して、非ログインのときのみDBアクセスが発生するようにする
- `test/fixtures/`の中のymlに定義することで、都度DBに登録しなくても、DB登録ユーザーのようにユーザー情報のテストを行うことができる
- ヘルパーメソッドはテストから呼び出せない
- ログアウトでやることは①sessionから:user_idを消す②@current_userインスタンス変数を消す（nilで上書く）の2つ

```ruby
  def log_out
    session.delete(:user_id)
    @current_user = nil
  end
```
ActiveRecord以外で型キャストを使う

ActiveRecordのカラムのように、"0" を false に変換したり、"2020/02/26 12:30" をTimeオブジェクトに変換したりする方法です。フォームから受け取った値をActiveRecord以外のクラスで処理するときに使えます。

環境: Rails 5.1, 5.2, 6.0

型キャストを使うには、ActiveModel::Type::Valueのサブクラスをnewしてcastメソッドを呼び出します。true/falseにしたければ、ActiveModel::Type::Boolean です。`[false, 0, "0", "f", "F", "false", "FALSE", "off", "OFF"]` はfalse、それ以外はtrueになります。

ただし、nil と "" は nil になります。また、Rails 5.2.4 と 6.0.0 以降では、`[:"0", :f, :F, :false, :FALSE, :off, :OFF]` も falseになるよう修正が入っています。


```Ruby
attr_reader :draft

def draft=(val)
  @draft = ActiveModel::Type::Boolean.new.cast(val)
end
```

日付型（Dateクラス）や日付時刻型（Timeクラス）にしたいときは、ActiveModel::Type::Date、ActiveModel::Type::DateTime を使います。

`Date.parse(val)` や `Time.parse(val)` とすると書式が不正なときに例外が発生しますが、Railsの型キャストではnilになります。

```Ruby
attr_reader :published_at

def published_at=(val)
  @published_at = ActiveModel::Type::Date.new.cast(val)
end
```

ほかにどんな型が使えるのかは、Railsのソースの activemodel/lib/active_model/type 下を参照してください。

https://github.com/rails/rails/tree/master/activemodel/lib/active_model/type

関連記事: [ActiveModel::Attributesを使う](https://qiita.com/kazutosato/items/91c5c989f98981d06cd4)
Raspberry Pi で、OpenModelZooのデモをインストールする

# OpenModelZooとは
オープン・モデルの動物園だ
https://github.com/opencv/open_model_zoo

# Raspberry Pi でOpenVINOをインストールする
https://docs.openvinotoolkit.org/latest/_docs_install_guides_installing_openvino_raspbian.html

# インストール方法
```bash
git clone https://github.com/opencv/open_model_zoo.git --branch 2019
cd open_model_zoo/demos
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-march=armv7-a" ../.
```

すべてのデモをビルドする

```bash
make all
```
あるいは 好きなデモをmakeする

```bash
make -j2 super_resolution_demo/
```

# super_resolution_demoを使う


```bash

#まずはmodelをダウンロードする
wget https://download.01.org/opencv/2019/open_model_zoo/R3/20190905_163000_models_bin/single-image-super-resolution-1033/FP16/single-image-super-resolution-1033.xml

wget https://download.01.org/opencv/2019/open_model_zoo/R3/20190905_163000_models_bin/single-image-super-resolution-1033/FP16/single-image-super-resolution-1033.bin

/home/pi/build2/armv7l/Release/super_resolution_demo -m /home/pi/models/single-image-super-resolution-1033.xml -i small_size_picture.png -d MYRIAD

```
javascriptでenvファイルを使う

javascriptでenvファイルを使う実装をまとめます。

# 前提条件
- npmがインストールされていること

# インストール
`npm`コマンドでモジュールをインストール

```shell
$ npm i --save dotenv
```

# 使い方
## ファイルの作成
`touch`コマンドで`test.js`ファイル、`.env`ファイルを作成

```shell
$ touch test.js .env
```

```javascript:test.js
require('dotenv').config()
const { BASE_URL } = process.env

console.log(BASE_URL)
```

```shell:.env
BASE_URL="http://localhost:8000/"
```

## 実行
`node`コマンドで`test.js`を実行する

```shell
$ node test
```

## 出力結果

```console
http://localhost:8000/
```

# Nuxt.jsで使う場合
`npm`コマンドでモジュールをインストール

```shell
$ npm i --save @nuxtjs/dotenv
```

```javascript:nuxt.config.js
module.exports = {
  modules: [
    '@nuxtjs/dotenv', // 追記
  ]
}
```

# 参考文献
この記事は以下の情報を参考にして執筆しました。

- [dotenv - npm](https://www.npmjs.com/package/dotenv)
- [@nuxtjs/dotenv - npm](https://www.npmjs.com/package/@nuxtjs/dotenv)
GETとPOST

#GET
普通にwebサイトにアクセスするとき、Webブラウザは「GET」という方式でアクセスをしています。
GETはアクセスの基本と考えていいでしょう。

GETは「いつ、どこからどうアクセスしても同じ結果が返されされる」というようなものに使います。
#POST
「POST」といのは、フォームなどを送信するときの基本となる送信方式です。

POSTは「その時、その状況でその表示」を行うような場合に使われます。

#参考
node.js超入門 p130
プライベートリポジトリをgo getする方法。

#結論
①トークンを発行してね。
参考サイト
https://qiita.com/kz800/items/497ec70bff3e555dacd0

②トークンを.gitconfigに書き込んでね

```
$ nano ~/.gitconfig
```

```~/.gitconfig
[url "https://xxxxxxxxxxxxxxx:x-oauth-basic@github.com/"]
insteadOf = https://github.com/
```

####以下エラーが発生した場合トークンが間違ってるかも
```
# cd .; git clone -- https://github.com/CreatorsLab/test_repo /home/pi/go/src/github.com/CreatorsLab/test_repo
Cloning into '/home/pi/go/src/github.com/CreatorsLab/test_repo'...
remote: Invalid username or password.
fatal: Authentication failed for 'https://c61adxxxxxxxxxxxxxxxxxxxxxxxx:x-oauth-basic@github.com/CreatorsLab/test_repo/'
package github.com/CreatorsLab/test_repo: exit status 128
```

####参考サイト
https://github.com/k8sp/sextant/issues/29