OmniAICreator/Qiita-1.07M huggingface dataset:
2019年のreset css

Normalizeじゃなくて、Reset。変なマージンとか消してとにかく自分の当てたStyleだけが当たって欲しい人向け。

```css
  /* 
  html5doctor.com Reset Stylesheet
  v1.6.1
  Last Updated: 2010-09-17
  Author: Richard Clark - http://richclarkdesign.com 
  Twitter: @rich_clark
  */

  html, body, div, span, object, iframe,
  h1, h2, h3, h4, h5, h6, p, blockquote, pre,
  abbr, address, cite, code,
  del, dfn, em, img, ins, kbd, q, samp,
  small, strong, sub, sup, var,
  b, i,
  dl, dt, dd, ol, ul, li,
  fieldset, form, label, legend,
  table, caption, tbody, tfoot, thead, tr, th, td,
  article, aside, canvas, details, figcaption, figure, 
  footer, header, hgroup, menu, nav, section, summary,
  time, mark, audio, video {
    margin:0;
    padding:0;
    border:0;
    outline:0;
    font-size:100%;
    vertical-align:baseline;
    background:transparent;
  }

  body {
    line-height:1;
  }

  article,aside,details,figcaption,figure,
  footer,header,hgroup,menu,nav,section { 
    display:block;
  }

  nav ul {
    list-style:none;
  }

  blockquote, q {
    quotes:none;
  }

  blockquote:before, blockquote:after,
  q:before, q:after {
    content:'';
    content:none;
  }

  a {
    margin:0;
    padding:0;
    font-size:100%;
    vertical-align:baseline;
    background:transparent;
  }

  /* change colours to suit your needs */
  ins {
    background-color:#ff9;
    color:#000;
    text-decoration:none;
  }

  /* change colours to suit your needs */
  mark {
    background-color:#ff9;
    color:#000; 
    font-style:italic;
    font-weight:bold;
  }

  del {
    text-decoration: line-through;
  }

  abbr[title], dfn[title] {
    border-bottom:1px dotted;
    cursor:help;
  }

  table {
    border-collapse:collapse;
    border-spacing:0;
  }

  /* change border colour to suit your needs */
  hr {
    display:block;
    height:1px;
    border:0;   
    border-top:1px solid #cccccc;
    margin:1em 0;
    padding:0;
  }

  input, select {
    vertical-align:middle;
  }

  /* our custom styles */
  *,
  *::before,
  *::after {
    box-sizing: border-box;
  }
```
OSMnxを用いて，オープンストリートマップから道路ネットワークデータを取得しよう．



![express_road.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274029/8bfe229c-a8a4-bdb6-ce69-814589eb54c5.jpeg)

##道路ネットワークデータについて
道路ネットワークデータは、node（点）部分とそのnodeとnodeを結んだedge(線)で構成されています。
いわゆる「グラフ理論」と呼ばれる分野です。

GPSの走行データについては、専門用語で「プローブデータ」と呼ばれています。なのでこのあたりの領域を調べる際には、
"道路ネットワーク" "プローブデータ"　"GPS"　などを組み合せて探してみましょう。 



##OSMnxについて
南カリフォルニア大学の都市計画学部の教授である Geoff Boeingさんが提供してくれているパッケージです．
![geoff-boeing-headshot-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274029/2d13993b-79cb-09b6-5055-aa8bdbc84968.jpeg)

[OSMnx: Python for Street Networks](https://geoffboeing.com/2016/11/osmnx-python-street-networks/)

以下の記事でOSMnxを用いた道路ネットワークの可視化が取り上げられています．

[Gigazin:世界各都市の道路が向いている方角が可視化されたグラフを比べてみると何がわかるのか？](https://gigazine.net/news/20180714-city-street-orientations/)

##API経由で道路ネットワークデータを取得しよう。

事前にパッケージをインストールしておきます。

```
brew install spatialindex
pip3 install osmnx 
pip3 install pandas
pip3 install csv
```


```python3:makeData.py
import pandas as pd
import osmnx as ox
import csv

def DriveWay(PREFECTURE):
        # 道路ネットワークデータを取得。
        G = ox.graph_from_place(f'{PREFECTURE}, Japan', network_type='drive')

        # グラフデータからDataFrame形式に変更。
        # nodeの情報
        node=pd.DataFrame(ox.save_load.graph_to_gdfs(G, nodes=True, edges=True, node_geometry=True, fill_edge_geometry=True)[0])
        # edgeの情報
        edge=pd.DataFrame(ox.save_load.graph_to_gdfs(G, nodes=True, edges=True, node_geometry=True, fill_edge_geometry=True)[1])
        # csv形式で出力。
        node.to_csv(f'out/DriveWay_Node_{PREFECTURE}.csv')
        edge.to_csv(f'out/DriveWay_Edge_{PREFECTURE}.csv')

        # 道路ネットワークを可視化
        ox.plot_graph(G)

def main():
        PRE_LIST=["TOKYO","CHIBA","KANAGAWA"]
        for PREFECTURE in PRE_LIST:
                print(f'{PREFECTURE} IN PROGRESS')
                DriveWay(PREFECTURE)

if __name__ == "__main__":
  main()

```
##出力結果（横浜市）

<img width="1050" alt="yokohama.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274029/911a3d79-f753-38d9-2755-a4da63056cf9.png">

<img width="821" alt="yamashita.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274029/49b93de5-b227-0636-2be8-adad25bdd2d5.png">

いい感じに横浜港エリアの道路ネットワークが見えてきました。
これが無料ってすごいですね。

ぜひOSMnx使ってみてください。

今回の記事に興味を持ってくれたかたは↓↓↓もチェックしてみてください！
[OSMnxで取得した道路ネットワークデータから極座標グラフを作ろう！](https://qiita.com/keijipoon/items/2c8569f213df57c0ca26)
RailsでPresenterを有効活用する

## 記事の目的
* Presenterというロジックを自分なりに使い方をまとめて行く。
* Presenterを以下のように定義する。

> **特定のビューを表示するのに必要なデータ**をパラメーターにした、**巨大なJSONオブジェクト**のようなもの

* これがあると、Presenterに引数を渡すだけで
    * **「そのビュー内でどの情報が呼び出されているのか」**が一目でわかり、
    * **「ビューが正常に表示されること」を保証しやすくなる**
* なおDecoratorとの違いは、**PresenterはDecoratorの上位レベル**に属し、必要に応じて**PresenterからDecoratorに処理をdelegateする**ことがある。（サンプル参照）
* 基本的にはPresenterだけ作り、複数箇所で使いまわしたい処理をDecoratorに記載する。

## Presenterの原則
* **「情報」を返すメソッドしか生やさない**。（タグやActionViewヘルパーを返すメソッドは生やさない）
* **delegate**で極力賄い、データの加工が必要な場合だけメソッドを生やす。
* **情報によって見た目を変える**ことを実現したい場合は、クラス名を返すメソッドを生やして、HTMLのclass属性内で呼び出す。

## サンプル
* 「飼い犬の詳細ページ」をレンダーする場合を考える。

```rb
class DogShowPresenter
  attr_reader :dog

  delegate :name,
           to: :dog

  def initialize(current_user:, dog:)
    @dog = dog
    # もしデコレーターを使うならここでデコレーターを呼び出す
    # @dog = ActiveDecorator::Decorator.instance.decorate(dog)
  end

  def something
    # このPresenterでしか使わない処理を書く
  end
end
```

## 参考URL
https://tech.kitchhike.com/entry/2018/02/28/221159
https://www.oiax.jp/rails/tips/decorators_and_presenters.html
Reactのイベントハンドラにおいて「Cannot read property '〇〇' of undefined」と出る

ES6記法でReactのコードを書いていた時、イベントハンドラ内で `this` が使えなくなっていたので、その原因を共有します。
# 問題のコード

```App.jsx
class App extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            status: "No"
        };
    }
    changeState() {
        this.setState({ status: "Yes" });
    }
    render() {
        return (
            <div>
                <button onClick={ this.changeState }>Change!</button>
                <div>{this.state.status}</div>
            </div>
        );
    }
}
```

この場合、ブラウザで実行してみると以下のように表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381785/eba2940e-e681-53f0-7eab-ba1ab683283c.png)
このボタンを押すと表示される文字が「Yes」に変わるはずなのですが、変わることはなく、下のようなエラーが発生しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381785/4bfcd2f9-db68-cc79-0c09-34a7163d3c4e.png)

# 解決策
`render()` 関数の `onClick` において、以下のように変更します。

```App.jsx
<button onClick={ this.changeState.bind(this) }>Change!</button>
```

#原因
ES5の `React.createClass` を使った場合はイベントハンドラが自動でbindされるのですが、ES6で `React.Component` を作成した場合、イベントハンドラは自動でbindされないようです。
【Automation Anywhere】Windowsのユーザ切り替え時にclientへログインできない場合の対処

#遭遇した事象
Windows10へ管理者権限でAutomation Anywhere Enterprise(以下AA)インストール後、ユーザー権限アカウントでClientへログインしようとしたらログインに失敗してしまう

#経緯
研修環境構築のため、Windows10環境へAAをインストールしていた。
研修ということで不特定多数の方が端末に触れるため、以下の通りインストール端末の権限を分けることにした。

| 権限 | 利用想定 | 具体的な作業、操作シーン |
|:-:|:-:|:-:|
| 管理者権限 | 管理者 | AAインストール |
| ユーザー権限 | 研修受講者 | AA操作 |

管理者権限でのAAインストールが完了したため、ユーザー権限でAAClient(開発用画面)へログインしようとしたところ、上記事象が発生した。

#対処法
ユーザー権限でAAのControl Room(集中管理室、端末やジョブの進捗やユーザーの権限設定を行う)へログインし、以下のいずれかの処理を行う
・ユーザー権限で使用するアカウントを作成する
・使用したいアカウントから一度デバイスライセンスを外し、再度付与する

#まとめ
「デバイスライセンス」というだけあって、ライセンスの情報にデバイスが紐づいているのか、作成した権限と使用したい権限が異なる場合ログインができなくなるようです。
研修環境を構築するための対応だったので、実際に構築する場合には遭遇しない可能性が高いですが、備忘録までに記載しておきます。
iOS Beta版 実機確認で気をつけること

## 概要
いつものように実行しようとしたら、なんか怒られた。
<img width="417" alt="message.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418332/dbd3f02c-c6ac-6cbf-f36a-400bc1a969b9.png">

## 原因
内容を読むと、対象の端末はiOS13.1だけど、XcodeがiOS13.1に対応してないよってことらしいです。

今回は対象のiPadにBeta版のiOS13.1を入れており、XcodeはBeta版を入れてなかったら起きたってことですね。

## 解決法

1. 下記からサポートファイルをダウンロードします。
[GitHub - filsv/iPhoneOSDeviceSupport: Xcode iPhoneOS DeviceSupport files (6.0 - 13.1 (17A5821e))](https://github.com/filsv/iPhoneOSDeviceSupport)

2. ダウンロードしたファイル(今回は13.1(17A5821e).zip)を解凍して下記に配置します。
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/

3. Xcodeを再起動する。

### 参考元
[Xcodeで「Couldn&#39;t load project」と「Could not locate device support files」[Swift][iOS13] - Qiita](https://qiita.com/jbnkk40/items/2eb703aa656c392b5957)
[iOSをアップデートしたために実機でビルドができない - Qiita](https://qiita.com/yamataku29/items/6fdc9e512b42d7f66386)
Herokuに画像が表示されないときの対処法(Ruby on rails)

##はじめに
先日、Railsで作っていたアプリの画像がHerokuにあげると表示されないということが起きました。
今回は、そのときの対処法について書きたいと思います。
<br>
##対処法
###configファイルの書き換え

作成中のアプリのフォルダ内にある、
config/environments/production.rbを開くと、

```
config.assets.compile = false
```

という記述があります。
これを

```
config.assets.compile = true
```

と書き直すとうまくいきました。

#最後に
今回変更したファイルはアプリの製作中はあまり扱わないファイルなので、皆さんも注意してくださいね。
[Java] カプセル化でひっかかったこと

# 4つの メンバに対する アクセス制御
| 名前 | プログラム中の操作 | アクセスを許可する範囲 |
|:-:|:-:|:-:|:-:|
| private  |  private | 自分自身のクラスのみ  |  
| pakckage private  | (何も書かない)  | 自分と同じパッケージに属するクラス  |
| protected  | protected  | 自分と同じパッケージに属するか、自分を継承した子クラス  |
| public  | public  | すべてのクラス  |

# getter, setter の 定石
* getter: `public フィールドの型 getフィールド名() {
return this.フィールド名;
}`
* setter: `public void setフィールド名(フィールドの型 任意の変数名) {
  this.フィールド = 任意の変数名;
}`

# フィールドへのアクセスを検査
setter メソッドの中で値の妥当性をチェックしよう。(妥当処理)
`public void setVariable(String name){
if (name.length() <= 1){
throw new IllegalArgumentException("The name is too short.");
}
}`
PhpStormで自動補完が出なくなった時の対処法

# 現象

コーディング中の自動補完が効かない。
Ctrl+スペースを押すと補完候補が表示されるが、
押さなくても自動的に出てほしい。


# 対策

ファイル＞設定＞エディタ＞一般＞コード補完
で「入力時に候補を表示する」にチェックが入っているか調べる。
それでも補完が効かない場合は、
ファイル＞省電力モード
にチェックが入っていないことを確認する。
省電力モードが有効だと、自動補完が効かない仕様になったらしい。
2019年夏ごろのアップデートで、
デフォルトで「省電力モード」にチェックが入ってしまっていることが
原因と考えられる。
Pythonでクラスター係数を算出

Pythonのnetworkxというパッケージを用いて，クラスター係数を出していきます．

もとのデータは，2015.csv から 2018.csv という名前であり，Nodeは「引用者」「被引用者」とします．

事前に，pandas と networkx を install しておきましょう．

```Python:cluster.py

import pandas as pd
import networkx as nx

def CENTRALITY(y):
  #pandas の read_csv('',dtype={})
  data=pd.read_csv(f'{y}.csv',dtype={'引用者ID':'str','被引用者ID':'str'})

  print(f'readed file {y}')

  #dataのサイズを確認
  print(len(data))

  #networkx を用いて,dataをグラフとして割り当て(data,edge名,edge名)
  G=nx.from_pandas_edgelist(data2,'引用者ID','被引用者ID')
  print(f'generated graph {y}')

  #クラスター係数と次数の計算　pandas.DataFrame  dict = dictionaly型
  out=pd.DataFrame(dict(
    CLUSTER=nx.clustering(G),
    degree=dict(nx.degree(G))
  ))
  print(f'calculated centralities {y}')

  #ファイルへ出力 pd.DataFrame.to_csv('',)
  out.index.name='ID'
  out.to_csv(f'out/cluster_{y}_v2.csv',float_format='%.10f')
  print(f'generated file {y}')

  pbar.update(1)

def main():

       for i in range(2015, 2018):
                CENTRALITY(i)

if __name__ == "__main__":
  main()

```


うまくいきましたら，「いいね」お願いしまーす．
外部キー制約がついているカラムのコメントだけ編集してみた

MySQLWorkbenchが表示したSQLが下記

```sql

ALTER TABLE `demo`.`group_users` 
DROP FOREIGN KEY `fk_group_users_division_id_divisions_id`;
ALTER TABLE `demo`.`group_users` 
CHANGE COLUMN `division_id` `division_id` INT(11) UNSIGNED NULL DEFAULT NULL COMMENT '[区分id]' ;
ALTER TABLE `demo`.`group_users` 
ADD CONSTRAINT `fk_group_users_division_id_divisions_id`
  FOREIGN KEY (`division_id`)
  REFERENCES `demo`.`divisions` (`id`);
```
ファンコミュニティサービスでビデオ通話の実装

#ファンコミュニティサービスでビデオ通話の実装
オンライン上でアーティスト(歌手やアイドル）とファンがビデオ通話できるサービスが増えてきています。

#登場人物
・ファン
・アーティスト
・マネージャー
マネージャーはアーティストのファンサービスを監視する役割があります。
実際のビデオ通話で映像/音声を配信する事はありません。ファンとアーティストのやり取りを傍聴する機能が必要になります。


#必要な要素
<img width="548" alt="function.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/d7d7b14e-c80e-9e3e-d3ef-d6e88bbf3ab0.jpeg">
チャットについてはマネージャーからアーティストへ対して指示等を出す為に実装します。
又、マネージャーは映像/音声を送信しません。
運営にあたって、悪質なユーザーに対する追い出し機能も必要になりかもしれません。

#画面イメージ
###ファン
![ファン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/165a6cd2-c852-c01b-54e2-a3d30faa5b81.png)

###アーティスト
![アーティスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/22eff798-e54b-60a7-b42a-503f5b11c9f6.png)

###マネージャー
![マネージャー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/b12818e7-1dbd-00fd-d20a-b4b20592c20e.png)

#必要な技術
・低遅延での映像/音声の送受信
=>RTMP/HLS/WebRTC/etc...
・テキストデータの送受信/悪質なユーザーの追い出し
=>WebSocket

#直面する問題点
サービスの特性から以下の問題が必ず浮上し、ファン側から問い合わせが発生します。
・不特定多数のネットワーク/デバイスでの利用
・ITリテラシーの低い人の利用
構築したシステム側の不具合でない事を説明する必要がでてきます。

#技術面・問題点の考察
低遅延での配信については各社提供しているSDK/PaaSを利用するのが多くなってきていると思います。
独自でWebRTCを実装する事も可能ですが、ブラウザ側実装の問題に対する対応やサーバーの準備に時間を割きます。
問題点については、「システム不具合ではない」という事を証明するデータが必要になってきます。

#agora.ioでの解決方法
[agora.io SDK](https://hubs.ly/H0kB1_n0)ではソフトウェア面、ネットワーク面の両軸で低遅延での映像/音声送受信を実現しています。ブラウザ毎の問題点もSDK側で吸収している為、実装工数や不具合対応が短縮できます。サーバーについてもPaaSで提供している為準備をする必要はありません。当然冗長構成になっております。

問題発生時の調査も可能です。ログアップロード機能による調査(agora社側)、配信帯域/フレームレート/パケットロスの可視化（ダッシュボードで確認が可能）等から総合的に環境が原因で問題があったと説明する事が可能です。
又、録画SDKを利用して録画をしておくことで、カメラ映像がサーバーに送られてきていなかった、ファン側のあいまいな申告の詳細確認が可能になります。

#サンプルコード
冒頭に記載した画面イメージを実現するコードを公開しています。
[サンプルコード](https://github.com/fu-jimoto/AgoraIO-OnlineAkushukai)
こちらのサンプルはV-Tuberの配信も可能にする為、アーティスト側が画面共有で映像を送れるようにもしています。

#最後に
カスタマ〜サポートの観点からも[agora.io SDK](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=608dd5d1f85f68823afd)は工数短縮が可能となりますので一度お試しください。

---
[**agora.ioに関するお問い合わせはこちらから**](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=608dd5d1f85f68823afd)
[<img width="912" alt="スクリーンショット 0001-08-15 13.41.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/300377/5d815376-9b89-08fa-9434-6fa7e8e67bcf.png">](https://jp.vcube.com/lp/agora?utm_campaign=Agora&utm_source=Qiita&arc_id=608dd5d1f85f68823afd)
PythonでWeb APIを叩いてJSONをパースする

#目的
JSONファイルをパースする記事は多いんだけど、WebAPIとかを叩いてレスポンスからパースするシンプルな記事が見当たらなかったので。

#コード
コード上で叩いているAPIのURLはダミーですが、動作確認にはrti技研さんの遅延情報をJSONで返してくれるサービス（<a href="https://tetsudo.rti-giken.jp/free/delay.json">こちら</a>）を使っています。

```python
import requests
import json

#とりあえず例として、どこかのWeb APIを叩くことにする
url = "https://dummy-URL.com"

#requests.getを使うと、レスポンス内容を取得できるのでとりあえず変数へ保存
response = requests.get(url)

#response.json()でJSONデータに変換して変数へ保存
jsonData = response.json()

#このJSONオブジェクトは、連想配列（Dict）っぽい感じのようなので
#JSONでの名前を指定することで情報がとってこれる
print(jsonData["JSONのキー"])

#responseから取得したJSONデータが単一のJSONオブジェクトではなく
#配列みたいになっているときはfor文と組み合わせてやるとよし。
for jsonObj in jsonData:
    print(jsonObj["name"])

```
cococapodsの使い分けとGemとBundler

開発をしているとプロジェクトごとにcocoapodsの使ってるバージョンが違いました
cocoapodsって複数バージョン使えるんだっけと思って調べていたところ
> CocoaPodsは、同一のマシン内に複数のバージョンを入れることができるようですが、「pod」コマンドで使われるバージョンは、最上位のバージョンのようです。

という一文をみつけましたが

他にも調べているとどうやらBundlerを使うとできるっぽい

でもbundlerとか雰囲気で使ってたしということで
CococaPodsのバージョンの使い分けとそれに関連してくるgem、Bundlerについて調べてみました

# gemとは

> 多くのプログラミング言語と同様に、Ruby にも幅広いサードパーティのライブラリが提供されています。
> それらのほとんどは “gem” という形式で公開されています。


qiitaも漁りました
> 今回はgemです。ローカルのRailsのアップデート時にGemfileとかいじってた時に、そういえばgemってなんだろ...、Railsのライブラリ管理だよな...?となって色々誤解していることが顕になったので調べてみました。

> gemとは
> gemとはrubyのライブラリのことです。まあだから結局railsのライブラリにもなるのだけれど、正しい認識は重要。というか「gemはrailsのライブラリ」とか言ってるとruby力がないのがバレる.....


gemとはrubyのライブラリのことらしいです

`gem list`を叩いてみました
このコマンドでローカルにインストールされているgemをみることができます

```
activesupport (4.2.10)
addressable (2.5.2)
atomos (0.1.2)
babosa (1.0.2)
badge (0.9.1)
bigdecimal (1.2.8)
bundler (1.16.4)
CFPropertyList (3.0.0, 2.2.8)
claide (1.0.2)
cocoapods (1.5.3, 1.5.0)
cocoapods-core (1.5.3, 1.5.0)
cocoapods-deintegrate (1.0.2)
cocoapods-downloader (1.2.1, 1.2.0)
cocoapods-plugins (1.0.0)
cocoapods-search (1.0.0)
cocoapods-stats (1.0.0)
cocoapods-trunk (1.3.0)
cocoapods-try (1.1.0)
colored (1.2)

```

`bundler`も`cocoapods`もありました

ということはcocoapodsもbundlerもライブラリのようですね

しかしgem listででてくるからgemはライブラリ管理という記述もいろんなところで見かけるっぽい

# bundlerとは
bundlerはそれ自体もgem(= ライブラリ)で
"gemfile"と"gemfile.lock"に従って、gemを管理をするライブラリです。
(さっきのgem listコマンド叩いたときに出てきました)


# cocoapodsのバージョンを使い分ける
bundlerでインストールすることでそのプロジェクト用のcocoapodsをインストールできるっぽい

1, `gem install bundler`でbundler自体をインストール
2, プロジェクトファイル(.xcodeproj)と同じディレクトリに移動
2, `bundle init`で`gemfile`を作成
3, 作成されたファイル内に`gem "cocoapods", "1.7.5"`を書く

```
# frozen_string_literal: true

source "https://rubygems.org"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

# gem "rails"
gem "cocoapods", "1.7.5"
```
4, `bundle install --path vendor/bundl`でgemfileの設定をもとにgemをインストールします
* 「--path vendor/bundl」の指定がないと、プロジェクトと関係ない場所にインストールされてしまうので注意らしいです



# podfile作成してpod installするまで
ちなみにこの後にpod installで指定ライブラリをインストールするけど
その際CocoaPodsのコマンドを使用するときは、先頭に「bundle exec」をつけてコマンドを叩く必要があるらしい
これはBundlerを使ってCocoaPodsをインストールしているかららしい
* bundle install --path vendor/bundlでpodfileも一緒に作成されるっぽい

# 参考
https://www.ruby-lang.org/ja/libraries/
https://qiita.com/kamohicokamo/items/ded4cad5be1778547640
https://qiita.com/3no3_tw/items/8c1e3e95c75edae1036d
https://qiita.com/BearsSoft/items/3ad8eebf04c80152bace
UITextViewで検索した文字列を選択


# やりたいこと

自作のエディタアプリに検索機能を組み込みたいと思った。
それで、UITextView内で文字列を検索して、検索結果を選択状態にしたいと考えた。
なんか簡単そうだと思ってたけど、すごい大変だったわ！


# 検索してRange\<String.Index\>を取得

UITextViewの文中を検索して結果がUITextRageあたりで返ってくるメソッドを探したが、そんなものは無さそう。Stringの方ではどうだろうと思って調べてみると、`range(of:options:range:locale:)`とかいうメソッドがあるみたいだった。検索文字列が最初に現れるレンジを返してくれそうなメソッドだが返り値はRange\<String.Index\>という見慣れないやつで、ややこしそうな臭いがプンプンする。

文字列の検索結果は複数現れる場合も当然あるので、最初に現れるレンジだけ取得しても意味がない。`range(of:options:range:locale:)`メソッドの第３引数が検索対象となる文字列の範囲になるので、これを変化させながら全ての結果を取得するのが良さそう。

>[文字列に指定のワードが何個含まれるかカウントしたい](https://ja.stackoverflow.com/questions/29675/文字列に指定のワードが何個含まれるかカウントしたい)

このスタック・オーバーフローの記事を参考にして、まずは検索結果をRange\<String.Index\>の配列で取得してみた。

```swift
var resultRangeArray = [Range<String.Index>]()

let str = textView.text //本文
let word = "検索文字列"

var nextRange = str.startIndex..<str.endIndex //文字列全体をRange<String.Index>として検索対象に設定
while let range = str.range(of: word, options: [.caseInsensitive], range: nextRange, locale: Locale.current) {
    resultRangeArray.append(range) //検索結果を配列に格納
    nextRange = range.upperBound..<str.endIndex //見つかった文字列の後から本文の最後までで検索対象を設定
}
```
これで、検索結果が取得できたわけだが、`print(range)`で出力してみると、

```
Index(_rawBits: 1178992640)..<Index(_rawBits: 1179123712)
```

こんなのが出て来て、扱いに困る。

# UITextRangeに変換



こっちは検索結果をUITextViewの範囲選択で表示したいだけなので、UITextRangeが欲しいのである。UITextViewでコードから選択範囲を指定するには、`textView.selectedTextRange`プロパティにUITextRangeをセットしてやるだけで良いのだが、Range\<String.Index\>からどうやってUITextRangeを作れば良いのか？

```swift
let index = 0
let range = resultRangeArray[index]

/* range:Range<String.Index>からオフセットと長さを整数で取得 */
let offset = range.lowerBound.utf16Offset(in: textView.text)
let length = str[range].count

/* offsetとlengthからUITextPositionを作成 */
let startPosition = textView.position(from: textView.beginningOfDocument, offset: offset)
let endPosition = textView.position(from: textView.beginningOfDocument, offset: (offset + length))

/* UITextPositionからUITextRangeを作成 */
textRange = textView.textRange(from: startPosition!, to: endPosition!)
```

分からないながらこねくり回した結果、こんな風にしてUITextRangeを取得することができました。あとはUITextViewのselectedRangeを設定するばかり。

```swift
textView.selectedTextRange = textRange
textView.becomeFirstResponder()
textView.scrollRangeToVisible(NSMakeRange(offset, length))
```


# できあがり！

![ezgif.com-crop.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3817/56805c80-6e76-d75d-1699-76f4308765e7.gif)

`range(of:options:range:locale:)`がどういうメソッドなのかとか（Stringクラスのメソッドじゃない？）、いろいろ分からないことはあるけど、とにかくやりたいことは実現できました。
AWS認定プラクティショナー試験を受けた結果…不合格でした

こんにちは。
本日(2019/09/11)、ある事情でAWS認定プラクティショナー試験を受けてきましたので、その感想をば書かせて頂ければと思います。

結論として試験結果は不合格でした…。
現在の自分の状態としては、AWSを使用した業務をして半年ほど…といった所ですかね。

勉強方法はAWSのホワイトペーパーと模擬試験のみです。
AWS初歩の初歩の試験か…と油断しましたが、これが大きな間違いでした。

###スコア###
---
試験の詳細な結果は５営業日以内にメールにて届くらしいです。
出たら更新します。

2019/09/13
スコアシートが届きました。
スコアは680点であり、合格点である700点まであと少しといったところでした。

分野 1: クラウドの概念 28%　…　十分な知識を有する
分野 2: セキュリティ 24%　…　十分な知識を有する
分野 3: テクノロジー 36%　…　再学習の必要あり
分野 4: 請求と料金 12%　…　再学習の必要あり

これもしかしたら問題のガチャガチャ要素があるんじゃ…

###問題について###
---
箇条書きにしていきます。

・プラクティショナー(実践的)という意味の通り、まさにAWSを業務で“フル“に活用している人間用の問題。
・ちょっと齧っただけでは受からない、舐めたら即死です(私も問題を見た瞬間に「あ、これは駄目だな」と思いました)。
・問題はAWSの基本的な語句・サービスの説明…などではなく、実際には「個々のサービスの細かな概要」や「ベストプラクティス(最適な使い方)」を問題として出題する傾向にある。
・選択問題ではあるが、どれも問題の機能にあてはまるような説明ばかりで混乱させてくる。
・だいたいの場合「こういう事情を解決したい、どうしたらいい？」と問われるので、AWS機能の知識と、それに合わせる柔軟性が重要になる(これが難しい)。
・「どれがふさわしいか」という問題が出てくるが、選択肢の中にAWSのサービス名が出てくるというわけではない…だいたい“〜というようなサービス“と曖昧な選択肢が用意されている。
・解いた問題にはフラグを立てることができ、全問回答時に振り返ることが可能。
・ただ、110分という試験時間はめちゃくちゃ短いです(全問回答＆見直しまでギリギリでした)。

###出題された問題###
---
覚えている限りを絞り出しますと

単語

```
RI(リザーブドインスタンス)
Amazon Glacer
Amazon Aurora
Amazon EBS
Amazon S3
Amazon Shild
Amazon DynamoDB
```

問題

```
Amazonが負う責任は何か・ユーザーが負う責任は何か
どこまでがAmazonが管理するセキュリティ範囲か
RI(リザーブドインスタンス)を複製できる場合、どんな種類のRIがふさわしいか
アベイラビリティゾーンを設定する場合、幾つがふさわしいか(!?)
AWSの「弾力性」とは何か
```

###対策###
---
・模擬問題は“絶対に“信用しないこと。
・名称でパッと思い浮かばないサービスは軒並み使い方を調べたほうが良い。
・ホワイトぺーパーだけの知識では絶対に苦しむので、実際に使用してみるのが吉。
・中間あたりの問題は比較的易しい問題であることを確認したので、解くならそっちからのほうがいい。

###感想###
---
・はっきり言って模擬試験の問題は絶対に頼りにならない(問題を覚えても無駄)。
・模擬試験はAWSを触った人間なら誰でも解けるような、問題から読み取れるものばかり…。
・一見すると問題の意味がよくわからないものが幾つか見受けられた…適当に日本語翻訳(まさかgoogle翻訳？)しているからだと思う。
・もちろん英文で表示もできるけれど、英文が分からないと意味がない。

###まとめ###
---
めちゃめちゃ難しいです。
難易度がソリューションアーキテクトばりなんだけど…AWSさん、これは一体…？

よく「合格しました〜」という軽い報告を聞きますが、騙されないようにして下さい。
あっけらかんと死にます。
C++ Builder 10.2 Tokyo + TeeChart > bug? > FastLineシリーズの線が描画されないことがある

```txt:動作環境
RAD Studio 10.2 Tokyo Update 3
TeeChart Standard v2016.17.160129 32bit VCL
```

### 概要

- ある特定の線が描画されない

### 実装

```Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
#include <VCLTee.Chart.hpp>
#include <VCLTee.Series.hpp>
#include <VclTee.TeeGDIPlus.hpp>
#include <VCLTee.TeEngine.hpp>
#include <VCLTee.TeeProcs.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TChart *Chart1;
	TFastLineSeries *Series1;
	TButton *Button1;
	void __fastcall Button1Click(TObject *Sender);
private:	// ユーザー宣言
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
```

```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)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	Series1->AddXY(2.5, 2.0);
	Series1->AddXY(3.5, 3.5);
	Series1->AddXY(3.5, 2.0);
	Series1->AddXY(2.5, 2.0);

	Chart1->LeftAxis->SetMinMax(0, 5.0);
	Chart1->BottomAxis->SetMinMax(0, 5.0);
}
//---------------------------------------------------------------------------
```


### 結果

![2019-09-11_13h09_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/a0cf0602-5d86-c071-33fe-aa6318f05bbc.png)

(3.5, 2.0)から(2.5, 2.0)への線が描画されない。
Microk8sでPrivateRegistryからpullしようとすると「http: server gave HTTP response to HTTPS client」とでる

## 展開しているPrivateRegistryの内容で書き換える

```
vim /var/snap/microk8s/current/args/containerd-template.toml
```

```
        [plugins.cri.registry.mirrors."local.insecure-registry.io"]
          endpoint = ["http://127.0.0.1:30500"]
```

## 再起動

```
sudo snap restart microk8s
```

## Pullしてくるサーバを`local.insecure-registry.io`に置き換える

```nginx-deployment.ymal
      containers:
      - image: local.insecure-registry.io/test/nginx
        name: nginx
```
【WordPress】カスタム投稿タイプの作成

# 1.fuction.php

「外観 > テーマの編集」内の「function.php」に以下のコードを追加する。投稿名や識別名は自分の好みで設定。


~~~php
// カスタム投稿タイプ
add_action( 'init', 'create_post_type' );
function create_post_type() {
	register_post_type( 'aaa', // 投稿タイプ名の定義
		array(
			'labels' => array(
				'name' => __( '投稿' ), // 表示する投稿タイプ名
				'singular_name' => __( 'Aaa' )//カスタム投稿の識別名
			),
			'public' => true,
			'menu_position' => 5,//管理画面上の上から何番目に置きたいか
			'supports' => array('title','editor','thumbnail','custom-fields'
			), //編集画面で使用するフィールド
		)
	);
}
~~~

また、カテゴリーを追加したい場合には、下記も追加する。

~~~php
// カテゴリ
add_action( 'init', function () {
	register_taxonomy( 'category',//カテゴリ名
		'aaa',//追加したいカスタム投稿名
		array(
			'label' => __( 'カテゴリー' ),//表示されるカテゴリ名
			'hierarchical' => true,
			'update_count_callback' => '_update_post_term_count',
			'public' => true,
			'show_ui' => true
		)
	);
} );
~~~

# 2.パーマリンクについて
1でコードを追加後に記事を投稿すると、おそらく「ページが見つかりません」といった404エラーになる。これを解消するには、「設定 > パーマリンク設定」内のカスタム構造におけるURLを変更して保存すればよい。
クラウド上のVMでselinuxの設定を変える際は要注意

# 背景
- 会社でLinux基礎講習（ハンズオン）が開催され、それに参加していたときのことでした。

# 起こったこと
- AWS上でLinuxの検証環境を立てた
- selinuxの無効化をする工程があった
- 講習で示された手順に沿って無効化し再起動をかけたところ、VMが再起動しなくなった

# 原因
- [これ](https://qiita.com/murabiton/items/d44fc01b9e1ac2fdcfab)でした。
- 手順書が`SELINUXTYPE=disabled`となっていた、、、（泣）

# 原因に思い至ったいきさつ
- 最初、AWSのVMで発生
- あれ、と思ってGCPのVMで同じことしたところ、再現したので手順の問題と思って事象をキーワードのググった
- ↑の記事見つけて無事解決

# 思ったこと
- 手順は作ったら自分で試さないといかんと心に染みた
- 物理サーバーだったらコンソールで何が起こってるかわかるが、クラウドVMだとそれがわからない
    - こういったときのために、複数のクラウドで再現試験するのが吉と思った。
[速報] 2020年4月の審査から、iOS 13 SDK（Xcode 11.xでのビルド）が必須になる（追記あり）

掲題の通りです。

Apple Developer News and Updates
https://developer.apple.com/news/?id=09102019a&1568158483

>Starting April 2020, all new apps and app updates will need to be built with the iOS 13 SDK and support the all-screen design of iPhone XS Max or later.

**2020/4/1 追記**

Appleより2020/6/30まで延期になる旨のアナウンスがありました。
[Apple Developer - ニュースとアップデート](https://developer.apple.com/jp/news/?id=03262020b)
Nuxt.js で title に fetch で取得した値を設定する

やりたいこと
----
ユーザー情報のページのタイトルにユーザー名を表示したい。ページ読み込み時にユーザー情報をバックエンドから取得して、head の title に設定する。


結果
----


```動いた.ts
  head: function() {
    return {
      title:`${this.$store.state.user.nickname}さんのプロフィール`
    }
  },
  async fetch({ store }) {
    // User を取得する
    await store.dispatch('user/getUser')
  }
```

ポイント
----
**head は関数にする**

以下のように関数にしないと store を参照できない様子。 Cannot read property '$store' of undefined というエラーが出ます。


```ダメな実装例.ts

  head: {
    title:`${this.$store.state.user.nickname}さんのプロフィール`
  },
```

**アロー関数を使わない**

アロー関数を使うと Nuxt の this を参照できないので function() {} を使う

```ダメな実装例.ts

  head: () => ({
    title:`${this.$store.state.user.nickname}さんのプロフィール`
  }),
```

^ の this は参照できません。

参考
----
https://github.com/nuxt/nuxt.js/issues/1086
https://github.com/nuxt/nuxt.js/issues/2536#issuecomment-356259396
https://qiita.com/_Keitaro_/items/d48733a19c10889e2365
【Firebase】FCMを用いたプッシュ通知の動作確認用スクリプト

# 背景
FCMを用いたプッシュ通知の動作確認をサクッと行いたいと思ったので、スクリプトを作って手元で実行できるようにしました。
下記のコードでiOS/Androidどちらの動作確認も行えます。

# コード
```sh:sendNotification.sh
#!/bin/sh

# 事前入力項目
SERVER_KEY_DEVELOP=''
SERVER_KEY_PRODUCTION=''

# 使い方
usage_exit() {
  echo ""
  echo "Usage: $0 [options]"
  echo ""
  echo "required:"
  echo "シェルスクリプト内に定義されている SERVER_KEY_DEVELOP, SERVER_KEY_PRODUCTIONに、あらかじめ該当するFirebaseプロジェクトのサーバーキーを記載してください。"
  echo "  SERVER_KEY_DEVELOP:     開発用Firebaseプロジェクトのサーバーキーを記載してください。"
  echo "  SERVER_KEY_PRODUCTION:  本番用Firebaseプロジェクトのサーバーキーを記載してください。"
  echo ""
  echo "options:"
  echo "  -D                開発向きにプッシュ通知を送信します。"
  echo "  -P                本番向きにプッシュ通知を送信します。"
  echo "  -T                配信対象の端末のFCMトークンを設定します。"
  echo "  -t                プッシュ通知のタイトルを設定します。"
  echo "  -b                プッシュ通知のボディを設定します。"
  echo "  -h                このスクリプトの使い方を表示します。"
  echo ""

  exit 1
}

# 事前入力項目のチェック
if [ -z "$SERVER_KEY_DEVELOP" -o -z "$SERVER_KEY_PRODUCTION" ]; then
  usage_exit
fi

# オプションの解析
while getopts DPT:t:b:h OPT
do
  case $OPT in
    D) TARGET="develop";;
    P) TARGET="production";;
    T) TOKEN="$OPTARG";;
    t) TITLE="$OPTARG";;
    b) BODY="$OPTARG";;
    h) usage_exit;;
  esac
done

# パラメータの表示
echo ""
echo "**********************************************"
echo "TARGET:   $TARGET"
echo "TOKEN:    $TOKEN"
echo "TITLE:    $TITLE"
echo "BODY:     $BODY"
echo "**********************************************"
echo ""

# オプションのチェック
if [ -z "$TARGET" -o -z "$TOKEN" ]; then
  usage_exit
fi

# 配信データ
DATA="{
  \"notification\": {
    \"body\": \"$BODY\",
    \"title\": \"$TITLE\"
  },
  \"data\": {
    \"click_action\": \"FLUTTER_NOTIFICATION_CLICK\"
    \"body\": \"$BODY\",
    \"title\": \"$TITLE\"
  }
  \"to\": \"$TOKEN\"
}"

# 送信データの表示
echo ""
echo "**********************************************"
echo "DATA: ${DATA//\/}"
echo "**********************************************"
echo ""

# 送信処理
if [ $TARGET = "develop" ]; then
  curl https://fcm.googleapis.com/fcm/send -H "Content-Type:application/json" -X POST -d "$DATA" -H "Authorization: key=$SERVER_KEY_DEVELOP"
elif [ $TARGET = "production" ]; then
  curl https://fcm.googleapis.com/fcm/send -H "Content-Type:application/json" -X POST -d "$DATA" -H "Authorization: key=$SERVER_KEY_PRODUCTION"
else
  usage_exit
fi

```

```shell:呼び出し側
# 開発向き
./sendNotification.sh -D -T <トークン> -t <タイトル> -b <ボディ>

# 本番向き
./sendNotification.sh -P -T <トークン> -t <タイトル> -b <ボディ>
```

```shell:実行結果
**********************************************
TARGET:   develop
TOKEN:    <トークン>
TITLE:    <タイトル>
BODY:     <ボディ>
**********************************************


**********************************************
DATA: {
  "notification": {
    "body": "<ボディ>",
    "title": "<タイトル>"
  },
  "data": {
    "click_action": "FLUTTER_NOTIFICATION_CLICK"
    "body": "<ボディ>",
    "title": "<タイトル>"
  }
  "to": "<トークン>"
}
**********************************************

{"multicast_id":123,"success":1,"failure":0,"canonical_ids":0,"results":[{"message_id":"123"}]}
```

Firebaseプロジェクトのサーバーキーは、頻繁に変えるものではないためシェルスクリプト内にベタがきさせるようにしています。
トークンは開発/本番で変わるため、タイトル・ボディは柔軟に設定できた方が使い勝手が良さそうなため、オプションで指定できるようにしました。
Addressable Assetsで全てのラベルとエントリーを表示する。(備忘録)

Addressable Assetsに登録したファイルが膨大な量になった際、AssetReferenceを属性でフィルタしても限界ありそうだな～と思って、とりあえず全部出力したくなる気がしたのでコード読んでました。


## 環境
Unity 2019.1.9f1
Addressable Assets 1.1.10

## 本題
今回はそのままAddressableAssetsWindow.csに書きましたが、別のエディタ拡張クラスを使ったほうが実用的だと思います。

```csharp:AddressableAssetsWindow.cs
[MenuItem ("Window/Asset Management/Show Entries")]
static void ShowEntries () {
    var window = GetWindow<AddressableAssetsWindow> ();
    if (AddressableAssetSettingsDefaultObject.Settings == null) {
        Debug.LogWarning ("先にSettingsを作成してください。");
        return;
    }
    if (window.m_GroupEditor == null) {
        window.m_GroupEditor = new AddressableAssetsSettingsGroupEditor (window);
    }
    // ラベルテーブルにあるラベルすべて表示
    foreach (var label in window.m_GroupEditor.settings.labelTable.labelNames) {
        Debug.Log (label);
    }
    // すべてのグループと、それに属するエントリーを取得
    foreach (var group in window.m_GroupEditor.settings.groups) {
        Debug.Log (group.Name);
        foreach (var entry in group.entries) {
            Debug.Log (entry.address);
        }
    }
}
```

AddressableAssetsSettingsGroupEditorが設定のもろもろを持っているので、その中身を見ているだけです。

## 結果
![debuglog.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45094/6d84ee85-cbdd-8b48-fbc2-6753365cc237.png)
iOS開発における.gitignoreの設定

# iOS開発における**.gitignore**の中身

```
 # Xcode 
:--
# 
 # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore 
 ## User settings 
 xcuserdata/ 

## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) 
 *.xcscmblueprint 
 *.xccheckout  
 
## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) 
 build/ 
 DerivedData/ 
 *.moved-aside 
 *.pbxuser 
 !default.pbxuser 
 *.mode1v3 
 !default.mode1v3 
 *.mode2v3 
 !default.mode2v3 
 *.perspectivev3
 !default.perspectivev3 

 ## Gcc Patch 
 /*.gcno 

*~
*.swp

*.DS_Store
```
PhpStormで、キャレットを行頭や行末に一気に移動させるショートカット


#はじめに
Macとwindowsのショートカットの差異に苦しめられている人の一助になれれば、、、
ちなみに僕は今回のショートカットを**「ザ・ハンド」**と名付けています。
情報は2019/09/13現在のものになります。PhpStormのバージョンは追って修正します。


##ショートカット(WIndows)
**★行頭（ラインの一番左）に移動**
1. Fn + ←
2. Homeボタン（Fnキーが無い場合）


**★行末（ラインの一番右）に移動**
1. Fn + →
2. Endボタン（Fnキーが無い場合）


##ショートカット（Mac）
**行頭（ラインの一番左）に移動**
1. Fn + ←
2.control + a

**行末（ラインの一番右）に移動**
1. Fn + →
2.control + e




間違いがあれば、お手数ですが教えていただけると助かります！
以上です！
FireFoxでSeleniumのテストを行うためのWebDriverの準備

前回の続き。
Seleniumのテストを行うことを目標にWebDriverを準備する。

##環境

- macOS Majove (ver 10.14.6)
- Python 2.7.10
- FireFox Quantum 69.0 (64bit)
- geckodriver 0.24.0 for macOS


##pipでSeleniumをインストールする

前回入れた`pip`を用いてSeleniumをインストールする。


```terminal:terminal
$ sudo pip3 install selenium
Password:************
DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support
WARNING: The directory '/Users/sf213471118/Library/Caches/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
WARNING: The directory '/Users/sf213471118/Library/Caches/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Requirement already satisfied: selenium in /Library/Python/2.7/site-packages/selenium-4.0.0a1-py2.7.egg (4.0.0a1)
Collecting urllib3 (from selenium)
  Downloading https://files.pythonhosted.org/packages/e6/60/247f23a7121ae632d62811ba7f273d0e58972d75e58a94d329d51550a47d/urllib3-1.25.3-py2.py3-none-any.whl (150kB)
     |████████████████████████████████| 153kB 263kB/s 
Installing collected packages: urllib3
Successfully installed urllib3-1.25.3
```

しっかり入ったことが確認できた。

バージョンは **Selenium 4.0.0 alpha-1** 



##geckodriverを配置

以下で最新のgeckodriverを入手。

https://github.com/mozilla/geckodriver/releases

本機はmacなので`geckodriver-v0.24.0-macos.tar.gz`をダウンロード。

解凍したものをpipと同じ階層に配置。今回用いたpip3は

```terminal
/usr/local/bin/
```

にあるので、こちらでOK。



##.pyファイルを書いて立ち上がるか確認

適当にpythonファイルを一つ作る。
今回は起動の確認なので中身は簡単にささっと。


Seleniumモジュールを呼んでFirefoxを指定する

```Python:OpenByFirefox.py
from selenium import webdriver

driver = webdriver.Firefox()
driver.get('https://www.google.co.jp')
```

これをそのまま実行でGoogleの検索画面が開けばOK。


これでやっとSeleniumが使えそう（・ω・）
iOS13バグ：UISearchBarをNavigation BarのtitleViewに表示させているときに高さが変わって画面遷移時に隙間があく問題

# 現象
画面遷移後にこんな隙間が出来てしまう。
![](https://i.stack.imgur.com/ec5fQ.png)

# 対処法
UISearchBarの中身の高さがなぜが56になってしまってどうにもコントロールができなかった。
stackoverflowに書いてあった遷移時に高さを調整する方法で解決

```swift
    // iOS13でuisearchbarをnavigationItem.titleViewに置き換えるとheightが56になってしまう課題の対処
    // https://stackoverflow.com/a/47976999/4652214
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        navigationController?.view.setNeedsLayout() // force update layout
        navigationController?.view.layoutIfNeeded() // to fix height of the navigation bar
    }
```

# おまけ関連のコード全体

```swift
    func setupSearchBar() {
        self.extendedLayoutIncludesOpaqueBars = true
        if let navigationBarFrame = navigationController?.navigationBar.bounds {
            let searchBar: UISearchBar = UISearchBar(frame: navigationBarFrame)
            // iphone xでUISearchBarのheightが大きくなってしまう対策 参考 : https://stackoverflow.com/questions/46318022/uisearchbar-increases-navigation-bar-height-in-ios-11
            if #available(iOS 11.0, *) {
                searchBar.heightAnchor.constraint(equalToConstant: 44).isActive = true
            }
            
            searchBar.delegate = self
            searchBar.placeholder = "キーワードでさがす"
            searchBar.keyboardType = UIKeyboardType.default
            navigationItem.titleView = searchBar
            navigationItem.titleView?.frame = searchBar.frame
            self.searchBar = searchBar
        }
    }

    // iOS13でuisearchbarをnavigationItem.titleViewに置き換えるとheightが56になってしまう課題の対処法
    // https://stackoverflow.com/a/47976999/4652214
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        navigationController?.view.setNeedsLayout() // force update layout
        navigationController?.view.layoutIfNeeded() // to fix height of the navigation bar
    }
```
クソレビューを防ごう（レビューのアンチパターン集・社内勉強会向け）

## はじめに

電子レビューや静的レビューが主流の昨今ですが、我々の案件では毎日1時間集まって発表者のコードや成果物をモニターに映して会議レビューしています。なんとなくですが集合レビューと呼ばれています。

目的：ノウハウの共有、品質の保証、その場で質問、など

---
## はじめに
今回は、集合レビューを1年間行ってきて感じた
**レビューのアンチパターン**
を紹介します。

なお、ネットの参考記事をベースにした私の主観です。

---
# Let's start!

---
## 1. 審査員形式

おそらく最悪の例

* 複数のレビュアーが辛口審査員のように振る舞う
* 発表者のコードを攻撃的に批判する

→発表者のメンタルを壊し、鬱憤とやる気の低下が残る

---
## 2. 持久戦

1番より若干マシだが悪い例

* やたらと長い、予定を超過する
* 最初はやる気があっても、時間が経つと疲れる
* 発表者もレビュアーも、時間が経つにつれ不注意になる
* でも決めた予定だから、と最後までやる

→体力を吸われ、レビューの精度も低くなる
→充実感を伴って終わり、本質的な問題に気づかない

---
## 3. 行き当たりばったり

人数が増えれば起こりがち

* レビュアーの評価に一貫性がない
  * グローバル変数を、ある日は禁止し、別の日は許可する
* レビュアーが誰かによって大きな差がある
* 同じ指摘が2度と行われない
  * 同じ問題が見つかったとしても…

→発表者が理不尽さを感じ、鬱憤とやる気の低下が残る
→チェック漏れが多発する
→とはいえ完璧な一貫性なんて実現不可能なので、Tryと改善が必要

---
## 4. 試験である

知識が浅い人やニューフェイスがいると起こりがち

* レビューの最後に「合格」「不合格」みたいな用語が飛び交う
* タイプミスや改善点を見つけて指摘することを、失敗の通達と捉えている

→何かを書いて校正を頼むのは、本来試験ではない
→試験形式になると、発表者のやる気を損ない、メンバーの協調的な和を乱す
→試験に合格したり、コードを良く見せることが発表者の目的となる
→「ユーザー満足度の高いソフトウェアにしたい」みたいな開発の本質からかけ離れる

---
## 5. 意識高い系レビュアー

4番に似ている

* 指摘に具体的な修正指示が含まれていない
  * 「もっとドメインを意識して書き直して下さい」
  * 「これはサービスクラスでやる仕事じゃないです」
  * 「この（クラス名|関数名|変数名）の責務がわかりません」

→発表者なりの考えがあったり、頑張って書いた成果物なので、突き放すのは良くない
→具体的な修正指示や例を出したほうがよい
→でも、答えをそのまま教えれば良いとも限らない。あくまで「例」を示す
→自分で考えたり、答えをネットや本で見つけるほうが、スキルアップやモチベーションに繋がる（と私は思っている）

---
## 6. 独裁の場である

知識が深すぎる人、大ベテラン、悪意ある人などがいると起こりがち

* 誰か1人が絶対的な権力者となり、レビューを支配している
* レビューは、権力者のご機嫌取りと~~カス~~化す

→権力者なしで意思決定できないチームになっていく
→開発者のキャリアアップを妨げ、成果も上がらない

---
## 7. 論点がズレている

几帳面な性格の人がいると起こりがち

* ソフトウェアの出荷には重要でない、コーディングの細かい部分ばかり言及される
  * 命名規則とか。ある程度大事だけどそこばかり見ちゃダメ
* 自動レビューで賄える箇所を、手動で頑張ってチェックしてる

→重要なものを見逃すか、時間を浪費し持久戦と化してしまう
→人の目で見て考えるからこそ意味のあることに集中しよう（ソフトウェアの品質に満足しているか？改善の優先順位は？みたいな）

---
## 8. 一方通行

レビュアーのコードを誰もレビューしないパターン

* 上下関係があり、若手が先輩のコードをレビューしない
* 一番上の人が自分のコードをアンレビューでマージする

→経験が浅い人だからこそ、他の人に無い観点で問題に気づくことがある
→意外と、レビュアーのコードがクソなこともある
→互いの立場を理解するほうが、チーム内の雰囲気が良くなる
→若手が予期しない不具合を見つけてくれることも多く、有益である

---
## 最後に

コードレビューは試験や戦闘の場ではなく、「ソフトウェアをより良くしたい」という、同じ目的を持つ仲間たちによる、協力的かつ自発的なセッションです。

経験の差、役職の差が多少あるとしても、全員の意見が重要で、相互Respectがあり、発表者が積極的に助言を求めに行くような環境作りが大事です。

---
## 参考
https://dzone.com/articles/manual-code-review-anti-patterns
https://medium.com/@laqiiz/%E3%82%B3%E3%83%BC%E3%83%89%E3%83%AC%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%AC%E3%83%93%E3%83%A5%E3%82%A2%E3%83%BC%E5%81%B4%E3%81%AE%E3%82%A2%E3%83%B3%E3%83%81%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3-effdcc39da52
https://smartbear.com/blog/collaborate/do-code-review-meetings-still-make-sense-in-2019/
WWW2019 論文読み会 2019/9/2 聴講 ざっくりメモ

# WWW2019 論文読み会 聴講 ざっくりメモ

※ メモ書きのためヌケモレ、タイポ、勘違いが含まれます 


## 概要

* 2019年9月2日（月）18：30受付開始　19：00スタート
* <https://cyberagent.connpass.com/event/142221/>
* WWW2019 論文読み会
	* 英文論文を翻訳して紹介する会
* CA 秋葉原ラボ
* <https://twitter.com/hashtag/WWW2019>
* 株式会社サイバーエージェント AbemaTowers 10F セミナールームD


## スライド

<https://cyberagent.connpass.com/event/142221/presentation/>


## コンテンツ

* 19:05 - 19:20	Webと経済学	數見拓朗
* 19:20 - 19:35	Webとニュース	高野雅典
* 19:35 - 19:50	WebにおけるHuman Dynamics 武内慎
* 19:50 - 20:05	Web フィルタリング最前線: 「「検閲回避」回避」 角田孝昭
* 20:05 - 20:20	WWW2019で見るモバイルコンピューティングの技術と動向 山本悠ニ
* 20:20 - 20:30	WWW2019 ダイジェスト	井手絢絵（LINE株式会社）


## Webと経済学

* レコメンドや広告システムの分析、最適化に関する考察
* 分析したい事象の各要素を「ゲーム理論」における情報提供者、意思決定者、シグナルのモデルに当てはめて分析
* データ分析によりユーザータイプごとの最適なレコメンドや広告内容を割り出すことができる
* ゲーム理論の視点は理論的解析において有用な場合がある


## Webとニュース

* ネットの情報品質についてニュースを題材に考察
* フェイク度判定ロジックによる分析
	* 2016米大統領戦 ： クリントンに対する共和党支持者の言及のみフェイク度が高ポイント
* ニュース品質による読者の行動差の分析
* 科学、医療、健康ニュースの信頼度分析方法
* ヘイトスピーチの検出における機械学習の活用


## WebにおけるHuman Dynamics

* 物理空間とWebにおける人間の行動の類似性に関する考察
* 人は Explorer（探索する人）と Returner（繰り返す人） の2タイプに分けられる
	* リアル空間にもWeb空間にも存在する
	* Explorer と Returner を判定し、レコメンドを分岐できる
* Returner への最適化手法
	* 出現頻度の制御（時間的ダイナミクス）
		* スマホを購入した翌日にスマホは買わない
* 反復消費の分析
	* 反復消費行動をHawkes過程によってモデリングしニーズ出現タイミングを予測
* Human Dynamics（人間行動）分析によりコンテンツ精度が向上できる



## Web フィルタリング最前線: 「「検閲回避」回避」

* Web フィルタリング（有害判定など）に関する考察
* 有害コンテンツ検出手法
	* 意図的なtypo、難読化への対策
	* テンプレートマッチング（画像分析）による検出


## WWW2019で見るモバイルコンピューティングの技術と動向

* ディープラーニングの現状分析
* ディープラーニング機能を内包するアプリのシェア（Google Play 人気アプリにおいて）
	* アプリ数において 1%
	* ダウンロード数において 10%
		* （鶏卵だが）人気アプリはディープラーニングを活用している
* 用途の大半は、写真加工、顔検出
* 学習データの保護（セキュリティ）が甘い
* 自社のアーキテクト戦略において市場（競合）分析は重要
古いXcodeで動かせないOSを実機デバッグする方法

Xcodeは常に新しいものを使うことが正義だとおもっていますが、Xcodeには動かせる端末の制限があったりして困るときがあります。

だからといって、Xcodeを新しいものにすると、思いがけないトラップにひっかかり時間を浪費したり…

#### トラップ例
- Swiftバージョン違いによるごにょごにょ
- OSSライブラリのバージョン違いによるごにょごにょ

なので、古いXcodeで、新しいXcodeでしか動かせない端末を動かそう ＋ 実機のデバッグもしよう！という話です。

## 用意するもの
- 動かしたいXcodeアプリ
- 新しいXcodeアプリ（β版など）
- 新しいOSの入ったiOS実機（新しいXcodeでしか動かせないバージョン）

各Xcodeは[ここ](https://developer.apple.com/download/more/)から持ってきましょう。

※ なお標準環境のXcodeは残しておくのが良いとおもいます:thumbsup:

## 手順（Xcode用意編）
古いXcodeを`Xcode-custom.app`、新しいXcodeを`Xcode-new.app`として記載。

1. Xcodeの用意
2. `Finder`で両Xcodeの`パッケージの内容を表示`を選ぶ。（タブで並べると便利）
3. `各Xcode.app⁩ ▸ ⁨Contents⁩ ▸ ⁨Developer⁩ ▸ ⁨Platforms⁩ ▸ ⁨iPhoneOS.platform⁩ ▸ ⁨DeviceSupport⁩`を開く
4. 新しいXcodeの`DeviceSupport`に動かしたい実機のOSバージョンフォルダが**有る**ことをチェック:exclamation:
5. 古いXcodeの`DeviceSupport`に動かしたい実機のOSバージョンフォルダが**無い**ことをチェック:exclamation:
6. 新しいXcodeから古いXcodeにiOSバージョンフォルダをコピー （iOS13など）

## 手順（Xcode実行編）
1. `Xcode-custom.app`を実行
2. 動かしたい実機を接続して`Run`
    - 動いた場合:satisfied:
        - 作業完了です
    - 動かなかった場合:scream:
        - Xcode の `Product ▸ Scheme ▸ Edit Scheme` を選択し、`Debug executable`のチェックを外す:white_large_square:
            ※ このチェックはデバッグ実行をするかどうかの設定です。
        - 再度`Run`を試す
        - 起動できたら`Debug executable`をつけ直して:white_check_mark:、`Run`することで実機デバッグ出来るかと。

## 最後に
- 実機や環境によってできないケースも有るかもですが、`Xcode`に実機デバイスを増やす手順でした。

これからも、良いアプリ開発を目指して:dancers:
Red Hat Enterprise Linux 8 に日本語ロケールを入れる

# 前提

Red Hat Enterprise Linux 8 には日本語ロケールがなかったので、日本語ロケールを入れる

```
[root@ip-x-x-x-x ~]# locale -a   
C
C.utf8
POSIX
en_AG
en_AU
en_AU.utf8
en_BW
en_BW.utf8
en_CA
en_CA.utf8
en_DK
en_DK.utf8
en_GB
en_GB.iso885915
en_GB.utf8
en_HK
en_HK.utf8
en_IE
en_IE.utf8
en_IE@euro
en_IL
en_IN
en_NG
en_NZ
en_NZ.utf8
en_PH
en_PH.utf8
en_SC.utf8
en_SG
en_SG.utf8
en_US
en_US.iso885915
en_US.utf8
en_ZA
en_ZA.utf8
en_ZM
en_ZW
en_ZW.utf8
```

# 探す

```
[root@ip-x-x-x-x ~]# yum search locale ja
Failed to set locale, defaulting to C
Last metadata expiration check: 0:36:09 ago on Wed Sep 11 11:36:11 2019.
======================================== Summary & Name Matched: ja, locale =========================================
glibc-langpack-ja.x86_64 : Locale data for ja
```
あった

# 入れる

```
yum install glibc-langpack-ja
```

# 結果

```
[root@ip-x-x-x-x ~]# locale -a
C
C.utf8
POSIX
en_AG
en_AU
en_AU.utf8
en_BW
en_BW.utf8
en_CA
en_CA.utf8
en_DK
en_DK.utf8
en_GB
en_GB.iso885915
en_GB.utf8
en_HK
en_HK.utf8
en_IE
en_IE.utf8
en_IE@euro
en_IL
en_IN
en_NG
en_NZ
en_NZ.utf8
en_PH
en_PH.utf8
en_SC.utf8
en_SG
en_SG.utf8
en_US
en_US.iso885915
en_US.utf8
en_ZA
en_ZA.utf8
en_ZM
en_ZW
en_ZW.utf8
ja_JP.eucjp
ja_JP.utf8
```

増えた

# ついでに設定も変える

```
[root@ip-10-0-0-9 ~]# localectl set-locale LANG=ja_JP.utf8
[root@ip-10-0-0-9 ~]# localectl set-keymap jp106
[root@ip-10-0-0-9 ~]# localectl status
   System Locale: LANG=ja_JP.utf8
       VC Keymap: jp106
      X11 Layout: jp
       X11 Model: jp106
     X11 Options: terminate:ctrl_alt_bksp
```

# 結論

無事に変更できた
なかなか情報がなく大変だった
Array.lengthやnew Array()で作られた配列の空要素はundefinedではない

ちょっと嵌ったので。

# 起こったこと
配列の要素が一定数以下だった場合に空の時用の要素で補充しようとして以下のようなコードを書きました。

``` javascript
if(someArray.length < THRESHOLD){
  someArray.length = THRESHOLD;
  someArray.map((element) => {
    if(element){
       return element;
    }
    return forEmpty;
  })
}
```
普通のwhileやforが使いたくなかったのでこう書いたわけですが、実はこのコードは正しく動きません。
Array.lengthに追加された分の要素については、mapによる変換が行われず`空`のままです。

# 配列の空要素には何が入っている？
Array.lengthで拡張した配列や、new Array(数値)で作成した配列、宣言時に[,,]というような形で値を指定しなかったような配列。
これらの空いている要素に入っている値は何でしょうか。
実際にIndexを指定してアクセスしてみるとundefinedが返ってくるので、undefinedだと私は思っていました。
が、実際は「何も入っていない」が正解です。

実際、コンソール等で表示させてみると、エンジンによって若干表示は異なりますがemptyとかそういう形の表示がされます。

# 何も入っていないものを高階関数は無視する
とはいえ、「何も入っていない」ものに対してアクセスするとほぼすべてのケースでundefinedが返るので、ほとんどの場合はundefinedと同一視して問題ありません。
(for of,[Symbol.iterator],スプレッド構文による展開辺りもundefinedとして扱われる)。
ただし、Arrayの標準組み込みの高階関数群(forEach,map,reduceなど)に関してはこの「何も入っていない」ものを無視して処理する仕様になっています。
(ただし、indexが詰まることなどはなく、コールバック関数に渡る第二引数の値は「何も入っていない」ものも存在する前提でのindexになります)

正直、意義がよく分からない仕様です。
# undefinedとして扱いたい場合は？
* 素直にforループやiteratorを使う
* [...array].map など一度スプレッド構文で空要素をundefinedに変換してから使う
* 使う前にfillなどで要素を詰める(どこが空いているのか明らかな場合)
JavaScriptで拡張ユークリッドの互除法

JavaScriptで拡張ユークリッドの互除法をスッキリ書けないのかと試行錯誤した結果。

```.js
const exGcd = (n, m) => m === 0 ? [1, 0, n] : _exGcd(div(n, m), exGcd(m, mod(n, m)));

const _exGcd = (q, [y, x, d] = []) => [x, y - x * q, d];

const div = (n, m) => (n - mod(n, m)) / m;

const mod = (n, m) => (Math.abs(m) + (n % m)) % m;
```

アルゴリズムの詳細は[拡張ユークリッドの互除法 〜 一次不定方程式 ax + by = c の解き方 〜](https://qiita.com/drken/items/b97ff231e43bce50199a)に詳しいです。


### 雑なテスト

```.js
const gcd = (n, m) => m === 0 ? n : gcd(m, mod(n, m));

const randInt = (min, max) => Math.floor(Math.random() * max - min + 1) + min;

const n = randInt(-100, 100);
const m = randInt(-100, 100);
const [x, y, d] = exGcd(n, m);

console.log([n, x, m, y, d]);
console.log(n * x + m * y === d);
console.log(gcd(n, m) === d);
```
特定の端末でdisplay: flex; が効かないときの解決策


なぜか特定の端末（今回はiPad）でのみflex（中央寄せ）が効かなかった時の解決策。

中央寄せが効かない要素に対して以下のCSSを指定すると、うまく中央寄せになった。

```css:CSS
display: -webkit-box;
```

flexがすでに効いている要素にも上記を指定してしまうとそっちが崩れるので注意。
`id`と`class`の使い分けについて

## 結論
`id`はページ内アンカーやJavaScriptで使用するセレクタ名として利用したい時のみ使用し、それ以外は`class`という感じです。
単にCSSのスタイルを付けたいときには、`id`は、一切使いません。

## 基本的に`id`を積極的に使わない理由
`id`を無闇に使うと、`class`で指定したスタイルを上書きしていまいます。
逆にこの特性を利用してCSSを設計することも可能ですが、たくさんの設計の手法がある中で、私はオススメできません。

> 詳細度 - CSS: カスケーディングスタイルシート | MDN
> https://developer.mozilla.org/ja/docs/Web/CSS/Specificity

## JavaScriptで使用する`class`や`id`
一方で、**JavaScriptで使用するセレクタ名**にも、`class`を利用する時があります。
例えば、同一ページ内で頻出するモーダルウィンドウやアコーディオン等です。
`id`は同一ページ内で1つしか設定できないので、多くの場面で利用するJavaScriptには使いにくいのです。

逆に、同一ページ内で必ず1回しか使用しない機能に関しては、`id`で指定すると良いでしょう。
例えば、メガメニューやハンバーガーメニュー、キービジュアルで使用するスライダー等です。

また、"JavaScriptで使用するセレクタ名"として、`id`を積極的に利用した方が良い理由があります。
それは、JavaScriptの実行速度です。
特にjQueryを使用することの多いWebサイト制作では、状況により3倍近くの処理速度の違いが出ることもあるそうです。

さらに、"`id`をセレクタ名としてJavaScriptを記述する"ことで、明示的に"その機能はページにひとつしか存在し得ない" ということを表しますので、読みやすいコードになります。

ちなみに、JavaScriptで使用する際のセレクタ名は、接頭辞として`js-`と付けることにより、読みやすいコードになります。
例えば、`<div class="js-modal">`と記述します。
スタイル調整用ではなくJavaScriptで使用するための`class`だということが、ひと目で分かりますよね。

## まとめ
いかがだったでしょうか。
途中からJavaScriptの話が多くなってしまいましたが、概ねこのように使い分けをします。


## さいごに
Twitterのフォロワーを募集しております！
すでにWeb業界にいらっしゃる方や、業界未経験の方、どんな方でも募集しておりますので、どうぞよろしくお願いいたします(^^)
【JavaScript】配列の要素を一行で入れ替える

配列の要素を一行で入れ替える方法

```js
const swap = (arr, bef, af) => { 
    arr[bef] = [arr[af], arr[af] = arr[bef]][0];
}
```

参考というより引用：http://beatdjam.hatenablog.com/entry/2017/09/24/025854
Bootstrap 4 の breakpoint の変更と作業環境の breakpoint を連動させる

Bootstrap 4 の breakpoint と、作業環境の breakpoint を連動させます。

Bootstrap の breakpoint 変更ファイル
bootstrap-4.3.1/scss/_variables.scss

該当箇所（変更が必要であれば下記の値を変更）

```
$grid-breakpoints: (
  xs: 0,
  sm: 576px,
  md: 768px,
  lg: 992px,
  xl: 1200px
) !default;
```

```
$container-max-widths: (
  sm: 540px,
  md: 720px,
  lg: 960px,
  xl: 1140px
) !default;
```

変更例）

```
$grid-breakpoints: (
  xs: 0,
  sm: 480px,
  md: 640px,
  lg: 800px,
  xl: 960px
) !default;
```

```
$container-max-widths: (
  sm: 480px,
  md: 640px,
  lg: 800px,
  xl: 960px
) !default;
```

作業環境の breakpoint（変更が必要であれば下記の値を変更）

```
$w-576: 576px;
$w-768: 768px;
$w-992: 992px;
$w-1200: 1200px;

$-lt-w-576: 'only screen and (max-width: #{$w-576 - 1})'; // 576px 未満
$-lt-w-768: 'only screen and (max-width: #{$w-768 - 1})'; // 768px 未満
$-lt-w-992: 'only screen and (max-width: #{$w-992 - 1})'; // 992px 未満
$-lt-w-1200: 'only screen and (max-width: #{$w-1200 - 1})'; // 1200px 未満

$-mt-w-576: 'only screen and (min-width: #{$w-576})'; // 576px 以上
$-mt-w-768: 'only screen and (min-width: #{$w-768})'; // 768px 以上
$-mt-w-992: 'only screen and (min-width: #{$w-992})'; // 992px 以上
$-mt-w-1200: 'only screen and (min-width: #{$w-1200})'; // 1200px 以上


```

変更例）

```
$w-480: 480px;
$w-640: 640px;
$w-800: 800px;
$w-960: 960px;

$-lt-w-480: 'only screen and (max-width: #{$w-480 - 1})'; // 480px 未満
$-lt-w-640: 'only screen and (max-width: #{$w-640 - 1})'; // 640px 未満
$-lt-w-800: 'only screen and (max-width: #{$w-800 - 1})'; // 800px 未満
$-lt-w-960: 'only screen and (max-width: #{$w-960 - 1})'; // 960px 未満

$-mt-w-576: 'only screen and (min-width: #{$w-576})'; // 576px 以上
$-mt-w-640: 'only screen and (min-width: #{$w-640})'; // 640px 以上
$-mt-w-800: 'only screen and (min-width: #{$w-800})'; // 800px 以上
$-mt-w-960: 'only screen and (min-width: #{$w-960})'; // 960px 以上

@media #{$-lt-w-480} /* 480px 未満 */
{
  padding: 20px;
}
```