OmniAICreator/Qiita-1.07M huggingface dataset:
文字コード・フォント・画像

##文字コード
* コンピュータが文字を表すのに使用する数値のこと。
* コンピュータで利用できる文字の集合体を**「文字集合」**といい、複数の「文字集合」を組み合わせたものを**「符号化文字集合（Character Codeset）」**といい、基本これを文字コードを呼ぶ。
* 世界中の文字を１つのコードセットで利用できるようにしたいという試みを**「Unicode」**という。


<br>

|       文字コード        | 説明                                                         |
| :---------------------: | ------------------------------------------------------------ |
| ASCIIコード　ANSIコード | もっとも基本となる文字集合。ISO-646で国際基準となる。        |
|        Shift_JIS        | JISコードをベースとしたコードセット。ASCIIコードと漢字などの2バイト文字を共存させるために制定された。 |
|           EUC           | UNIX上で日本語を扱うために利用される。多言語対応             |
|          UTF-8          | Unicodeで使われるコードセットの一つ。LinuxやMacOSなどで標準文字コードとして利用される。 |


<br>
##フォントとwebページ
* フォントとはある書体でデザインされた文字の集合体
* 文字コードから文字を特定し、次にこの文字集合に対応するフォントを指定された物の中から探し出して描画するという流れになる。


###代表的なフォント
* **TrueTypeフォント**
    * MicrosoftとApple共同開発のフォント。Linuxでも利用可能。
* **PostScriptフォント**
    * AdobeSystemsによって開発されたフォント。Macintoshで多く普及。
* **OpenTypeフォント**
    * AdobeSystemsとMicrosoftが共同開発、のちにAppleの参画。WindowsとMacで違いなく表示可能。



###代表的な書体
* **欧文書体**
    * セリフ・・・セリフは「飾り」という意味。装飾的要素を用いたフォント。
    * サンセリフ・・・「サン」は付いていないという意味。ArialやHelveticaなど
* **和文書体**
    * 明朝体・・・「はね」や「はらい」が表現されているフォント。
    * ゴシック体・・・文字の横幅が均等なフォントの総称。




##画像
PCのディスプレイは数多くの画素（ピクセル）と呼ばれる点で構成されており、画素はRGBの３つのサブ画素の輝度を調整することで色を表現している。


###解像度とは
画面を縦横、どれくらいの画素で構成するかを決めること。

###画像の解像度
* **ビットマップ**
    * 画素一つ一つに色を決めて画像を作っていく方式のこと。
    * 解像度はdpiで表し、１インチあたりどれだけの画素を並べるかで決まる
    * PCの場合、72dpiで画像を作成する場合が多い。
    * 印刷物では250~300dpiほどになる。
* **ベクターイメージ**
    * 図形情報を点で結ばれた線で表すため、解像度という概念がない。


###フォーマットの違い

* **JPEG**
    * 1000万色以上のフルカラー表示が可能のため、色数の多い画像や写真などの自然階調の画像の圧縮が向いている。
    * 画像圧縮時、人間に伝わりにくい箇所の情報を削除し圧縮する。
    * 一度圧縮すると元に戻せないので必ずオリジンを別に保存しておく。
    * グラデーションに強いため写真などで利用する反面、輪郭がはっきりしないためアイコンなどでは不向き。

* **GIF**
    * 最大256色から最小2色で表現される。色数の少ないボタンやロゴ画像の圧縮に向いている。グラデーションなどは濃淡の差が出てしまうため不向き。
    * 繰り返し加工、編集しても画像が劣化することはない。
    * 複数の画像を１つのGIFファイルにし、アニメーションさせることができる。

* PNG
    * 最大280兆色()から、ファイルサイズ削減のため256色（png-8）まで対応可能。
    * RGB以外にA透過情報の指定が可能で、背景を綺麗に透過させることができる。
    * GIFと比べても圧縮率が高く、またフルカラーの自然画を劣化なしで圧縮可能。
    * イラストやアイコンなどで利用。
docker超初歩　インストールからコンテナpullまでのやり方

# 初めに
続きもできたら追記するつもり

# 環境
docker for Macを使用

# 手順
## docker for Macをダウンロード
https://docs.docker.com/docker-for-mac/install/
よりdocker for Macをダウンロード
dockerHubのアカウント登録をしていないとダウンロードできないので
アカウント登録をする

## docker for Macをインストール
ダウンロードしたDocker.appを実行

## terminalでdockerを使ってみる
terminalを起動し、PJファイルを作成し移動する
mkdir projectfolder
cd projectfolder

DockerHubにログインする
docker login
User,PWを入力

pullする
(例)pull ruby:2.3.0
CentOS7でnmcliによるスタティックルート追加

とある古株サーバでスタティックルート(静的経路)を追加しようとしたところ、/etc/sysconfig/network-scriptsが従来の見慣れた形ではなく、nmcliによる設定が行われていたためやり方を調べたのでメモです。
私には慣れないコマンドでしたがtabキー補間が効くので直感的に作業を行うことができました。（サービスしている本番機ではないことも大きかった）

なお静的変更しかしませんので、即時反映は従来の `ip route add` で反映する必要があります。

# 1. インタフェース名を確認

```
nmcli c s
```

# 2. 該当インターフェースの編集モードへ

```
nmcli c e <インタフェース名>
```

# 3. 現状設定確認

```
print ipv4.routes
```

# 4. ルーティング追加
追加したいルートが複数ある場合は以下を繰り返し

```
set ipv4.routes <ネットワークアドレス/prefix> <GWアドレス>
```

# 5. 現状設定確認

```
print ipv4.routes
```

# 6. 設定保存

```
save persistent
```

保存により、以下のファイルが更新されました。
/etc/sysconfig/network-scripts/route-<インターフェース名>

```
ADDRESS0=192.168.10.0
NETMASK0=255.255.255.0
GATEWAY0=192.168.200.127
ADDRESS1=192.168.11.0
NETMASK1=255.255.255.0
GATEWAY1=192.168.200.100
...
(以後 ADDRESSn,NETMASKn,GATEAYnの3行がセットで追加されていきます)
```


# 参考ログ

```console
[root@hoge-server ~]# nmcli connection edit enp0s3

===| nmcli インテラクティブ接続エディター |===

既存の '802-3-ethernet' 接続を編集中: 'enp0s3'

使用できるコマンドを表示するには 'help' または '?' を入力します。
プロパティ詳細を表示するには 'describe [<setting>.<prop>]' を入力します。

次の設定を変更することができます: connection, 802-3-ethernet (ethernet), 802-1x, ipv4, ipv6, dcb
nmcli>
nmcli> print ipv4.routes
ipv4.routes: { ip = 192.168.13.0/24, nh = 192.168.200.254 }
nmcli> set ipv4.routes 192.168.10.0/24 192.168.200.100
nmcli> set ipv4.routes 192.168.11.0/24 192.168.200.100
nmcli> set ipv4.routes 192.168.13.0/24 192.168.200.100
nmcli> set ipv4.routes 192.168.14.0/24 192.168.200.100
nmcli>
nmcli> print ipv4.routes
ipv4.routes: { ip = 192.168.13.0/24, nh = 192.168.200.254 }; { ip = 192.168.10.0/24, nh = 192.168.200.100 }; { ip = 192.168.11.0/24, nh = 192
.168.147.100 }; { ip = 192.168.13.0/24, nh = 192.168.200.100 }; { ip = 192.168.14.0/24, nh = 192.168.200.100 }
nmcli>
nmcli> save persistent
Connection 'enp0s3' (hogehoge-1234-4567-b47c-fugafugafugaf) successfully updated.
nmcli>
nmcli> quit
[root@hoge-server ~]#
```

（注)IPやインターフェース名は適当にマスクしています

# 参考サイト

[redhat custormer portal: 第2章 IP ネットワークの設定](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/networking_guide/ch-configure_ip_networking#sec-Configuring_Static_Routes_Using_nmcli)
hostsとタブの落とし穴！[Squid]

## 追記 [ 2018-09-13 ] 
# 結論
**squid使用時にhostsの行頭にブランク入れるな**

**(@n-soda さん調べ)**
>一応念のためと思って squid のソースを読んでみたら、
なんと squid は libc を使わず独自に /etc/hosts を parse していて、
そこでは行頭にスペースやタブがあると、アドレスが書いてないものとみなされてしまうコードになっていました。
この辺です:
https://github.com/squid-cache/squid/blob/d429cbd0e4d86d4af54ed50e499da14039ff7429/src/tools.cc#L954
これはビックリ。
というわけで、行頭のスペースないしTABが squid 限定で犯人でした。

### 環境
- Vagrant for Windows
- Virtual Box
- CentOS 7.2 [https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box]
- squid
 
### 追加調査
- スペース・タブ -> NG
- 改行コードCRLF -> OK

# hostsファイル設定していたら詰まった話
　この前かかわった案件で、大量のhostsを設定する必要があってhostsファイルの内容を修正してローカル環境にアクセスしていた時に起きました。

## 落とし穴「その①」Windowsのhostsファイルはこう書きました。
```hosts:hosts
    127.0.0.1  example.com
    127.0.0.1  hoge.example.com
```
上記で当然動きますよね。
よっしゃ、じゃあWindowsにプロキシ立ててローカル環境にアクセスしたろ！
ってことでCentOS7にてプロキシサーバーを設定。接続してみると・・・**つながらない！！**

## 落とし穴「その②」CentOS7のhostsファイルもこう書きました。
```hosts:hosts
    127.0.0.1  example.com
    127.0.0.1  hoge.example.com
```
iPadで何度もローカル環境に接続してもつながらない！！
なんで！？こんな簡単な構築なのに！！ってパニックに陥ってました。
**色々調べてもプロキシサーバーの設定に間違いはない**（完全にここばかり調べていました。）

ログやらなんやら見ていると・・・名前解決できていないのかとなりまして、**hostsか！！**
とりあえずいろいろな書き方を試していたら解決しました。

## 正解
```hosts:hosts
127.0.0.1  example.com
127.0.0.1  hoge.example.com
```
**タブだめなのか**
Windowsのhostsファイルをコピペで流用していたものですから名前解決できずにずっと怒られていました。

## 結局
ぶっちゃけタブの何がダメなのかわからない。
Linuxの設定は左詰めが基本的なことは設定ファイルを見まくった結果雰囲気でわかりましたが、そういう規約でもあるのですかね？
Windowsで正常動作しているのに・・・
調べてはいるのですが、なかなか出てこないです。
**（知っている方ご教示ください！）**
もしかしたら他に原因があったのかもしれませんが、同じようなことで詰まっている方は参考にしてみては？

コピペマン、ダメ。絶対。

## 一言
完全にプロキシサーバーに注目しすぎて名前解決に注目できなかったところに猛省。
そもそもエラーに書いてあったし・・・
【超初心者向け・Git＆GitHub入門】誰もが最初にぶつかるGitとGitHubの初期設定からワークフローまでの流れ

初心者の人が誰でもぶつかるであろう(全くの初心者だった自分がたくさんの時間を使ったため)、GitとGitHubの初期設定からワークフローの流れをメモ的に共有しておきます。


【参考URL】
・GitHubでSSH接続する手順(https://qiita.com/shizuma/items/2b2f873a0034839e47ce)
・GitHubの初期設定(https://qiita.com/drapon/items/441e18452b25060d61f1)
・【Mac】Gitの環境構築(https://proggit -8.com/blogs/git-preparation-mac)
・初めてのGitとGitHub(https://www.udemy.com/intro_git/learn/v4/content)
・Githubのプライベートリポジトリに他のユーザーを招待する方法(https://code-schools.com/github-invite/)
※上のURL内容を勉強するだけで、GitとGitHubの初期設定からワークフローに移るまでの流れは
できると思います。

【全体の流れ】
Gitの初期設定→GitHubの初期設定→ワークフローという流れ


【以下メモ】
Gitとは？
Git=バージョン管理ソフト
　→なぜファイルのバージョン管理をするのか
　　→「どのファイルの何を」「誰が」「いつ」「何のために」変更したかわかる
　　Ex. 最新のファイルがどれかわかる、複数人での作業が楽に、元の状態に戻せる


Gitの仕組み
変更履歴を時系列順に記録できる＋記録する際にはメッセージがつける
→「どのファイルの何を」「誰が」「いつ」「何のために」変更したかわかる
Ex. 記録1：A機能追加→記録2：文言追加→記録3：速度向上
※記録を過去に遡れる


開発の流れ：個人
①ファイルを変更、その履歴を→個人リポジトリへ：ファイルとファイルの変更状態を保存
※この過程がcommit
②個人リポジトリ→共有リポジトリへ変更を共有
※この過程がpush


開発の流れ：複数人
①共有リポジトリの情報を同期
※この過程がpull：情報を取得
②ファイルを変更、その履歴を→個人リポジトリへ：ファイルとファイルの変更状態を保存
※この過程がcommit
③個人リポジトリ→共有リポジトリへ変更を共有
※この過程がpush
この流れを複数人で行う


Githubとは？
→Gitリポジトリ(コード)のホスティングサービス
　→Gitで行なった変更履歴などをオンライン上で扱ってくれるサービス
＝ソーシャルコーディングの場
Ex. Git：コード預かって〜→GItHub：了解


GitHubの特徴
・プルリクエストによるコラボレーション
→自分が書いた、変更したコードについて取り込んでもらえるようにリクエストする機能
・他チームのソフトウェアがみれる
→世界中のチームがGitHubで開発：参加も閲覧もできる


Gitリポジトリ(コード)のホスティングサービス
GitHubの他にも、Bitbucketもある
→特徴：非公開リポジトリ作成無料(個人、2〜3人可能)
　→公開不可のプロジェクト向き


ローカルリポジトリの新規作成
バージョン管理をするためには、まず、Gitリポジトリが必要
リポジトリ：ファイルやディレクトリの状態、変更履歴を記録する場所
→”git init”コマンドで新規リポジトリを作成する
init：initializeの略
　→git.ディレクトリ(ファイル管理してくれる場所)が作成される


基本的なワークフロー
①ファイルの変更をステージエリアへ追加する
＝ファイル git add → ステージングエリア(控え室みたいなもの)へ
②ローカルリポジトリにコミットする
＝ステージングエリア git commit → ローカルリポジトリへ
　→vimエディター：i→入力→escボタン
③リモートリポジトリにプッシュする
＝ローカルリポジトリ git push →リモートリポジトリへ


変更をコミットする流れ
→ファイル変更
　→git add：ステージングエリアへ追加
　　→git commit：ローカルリポジトリにメッセージをつけてcommit


ステージングエリアに変更を追加
ステージングエリア：複数ファイルを変更にした時に、コミットするファイルを選択するためにある
→commit準備の控え室
原則：1作業、1commit
・コマンド：git add (ファイル名)→ステージングエリアに追加すること
　　　　　※git add. ：今ステージングエリアにある全てのファイルを追加する場合


コミットして変更を記録
commit＝変更にメッセージをつけてリポジトリに記録すること
→変更がリポジトリ内に時系列順に記録される
・コマンド：git commit -m”メッセージ付きで記録する”
原則：1作業、1commit：どの作業を何のためにしたのかすぐ振り返れるように
・コマンド：git commit -v = 今回どんな変更をしたか？見れる
わかりやすいコミットメッセージとは？
→他のメンバーに「何がどうして変更したのか」がわかることが必要
1行目：変更内容の要約(タイトル、概要) ※端的にわかりやすいように
2行目：空行
3行目：変更した理由
processingのsizeの書き方【メモ】

sizeの書き方が更新されたので、下記参照しながらコーディングする。

//----+----+----+----+----+----+----+
int sizeW = 600;
int sizeH = 400;
 
void settings() {
  size(sizeW, sizeH);
}
//----+----+----+----+----+----+----+
JavaScriptでクラス名からクラスを動的に生成する方法

クラスオブジェクトからクラス名文字列を取得するのは簡単だが、どうにかしてクラス名文字列からクラスオブジェクトを動的に生成できないだろうかと探し回ってたら意外な方法があった。ずっと見つけられなかったので感動記念に小ネタ投稿する。

## とりあえずクラスオブジェクト　-> クラス名
主題ではないが、とりあえずご存知のコード。

``` javascript:class->classname
class SampleClass{};

// クラス名（文字列）を取得する方法　その1
let classname1 = SampleClass.name();

//クラス名（文字列）を取得する方法　その2
let obj = new SampleClass();
let classname2 = obj.constructor.name;
```

## クラス名->クラスオブジェクト　その１：　evalを使う方法（非推奨）
当たり前と言えば当たり前だが、evalを使えばもちろんできる。ただし、evalの利用はそもそも推奨されていないだけではなく、コード実行速度が遅くすることもあるのでオススメはできない。

``` javascript:classname->class(eval)
//クラス名をevalする
let class1 = eval("SampleClass");

//evalを利用して目的が達成できることを確認
let classobj1 = new class1();
classobj1 instanceof SampleClass
> true
```

## クラス名->クラスオブジェクト　その2：　Functionを使う方法（推奨）
こちらの方法が大本命。[MDNのeval解説ページ](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/eval#Don't_use_eval_needlessly!)に載っていたのを思い出して、やってみたら大正解。

``` javascript:classname->class(Function)
//Functionを利用してコード評価を実施する関数を作成する
function getClass(classname){return Function('return (' + classname + ')')();}

//作成したgetClassNameにクラス名を渡す
let class2 = getClass("SampleClass");

//Functionを利用して目的が達成できることを確認
let classobj2 = new class2();
classobj2 instanceof SampleClass
> true
```

## まとめ（この小ネタの用途）
オブジェクトのJSON文字列変換時にクラス名を覚えておけば、逆にオブジェクトに戻すときに正しいクラスに戻せそうかな、と思っている。
【Rails5】NoMethodError in RailsAdmin::MainControllerというエラー

何番煎じ感があるみたいですが、タイトルのメッセでググっても日本語が出なかったんで備忘録として残しておきます。

#結論

config/initializersにkaminari.rbというファイルを作成し

```ruby:config/initializers/kaminari.rb
Kaminari.configure do |config|
config.page_method_name = :per_page_kaminari
end
```
を追加する。
これで管理画面の各indexに行けるようになります。

#エラー状態時の画面
![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/280139/106da11f-5342-a503-1ba3-8f93fd3f164c.jpeg)
管理画面トップは表示はされる
![WS000008.JPG](https://qiita-image-store.s3.amazonaws.com/0/280139/cf5e367f-dfa3-29e0-2d33-084e625ef66e.jpeg)
newもできる
![WS00000999.JPG](https://qiita-image-store.s3.amazonaws.com/0/280139/89fd0862-d491-ae07-9798-1f185ef5a38d.jpeg)
管理画面のindexに行けない…！

*wantとwentにすると空目・勘違いしそうなんでhopeとしたものの公開するとなるとなんか恥ずかしいですね*

#原因など
will_paginateとkaminariが競合する事によって起こる。

undefined method `per' for ActiveRecord～ではなく、
NoMethodError in RailsAdmin::MainControllerでググると英語力に自信がない場合余計に時間を食ってしまう

#参考
[rails_adminを使っていて、undefined method `per' for #<ActiveRecord::...>とエラーが出たら](https://qiita.com/fkagami/items/502f126ce3b7ba2fb0ea)
[NoMethodError in RailsAdmin::MainController#index](https://github.com/sferik/rails_admin/issues/2710)
[Troubleshoot](https://github.com/sferik/rails_admin/wiki/Troubleshoot#conflict-between-will_paginate-and-kaminari)
bashでwebスクレイピング

# bashでwebスクレイピング

## スクリプト

```bash:scraping.sh
#! /bin/bash

SCRAPING_URL="http://"
SEARCH_WORD=""

# webページを取得
curl  --url ${SCRAPING_URL} -X GET |
  # 取得したhtmlを対象ワードでgrep
  grep $SEARCH_WORD |
  # 正規表現にマッチする行だけを抽出(ここでは<td align="right"で始まる行だけを抽出)
  sed -ne '/<td align="right"/,/<¥/td>/p' |
  # htmlタグを削除
  sed 's/<[^>]*>//g'
```

### 使いかた

`SCRAPING_URL`に対象URL
`SEARCH_WORD`に検索したいワードを指定
2-1、初めてのPythonプログラム

## コメンドプロンプトとPythonの対話モードを復習しましょう。
　「Win」キー＋「R」キーを押し、名前欄に「cmd」を入力し、「OK」ボタンを押すと、コメンドプロンプトが開きます。「C:\>」 見たいのものの所にpythonを入力すると、Pythonのインタプリータが起動します。「>>>」というプロンプトが表示されたら、Pythonの対話モードができます。（できない方[ここ](https://qiita.com/ousrok/items/ec10aee5dc9810831cba)をクリックしてください。）そこに、[exit()]を入力して、「Enter」キーを押すと、対話モードを閉じます。
![cmd.JPG](https://qiita-image-store.s3.amazonaws.com/0/263439/e031e503-e21b-0d8c-c01a-90bbc4edac1d.jpeg)

## 初めてのPythonプログラム
初心者へ：**こぴぺはやめてください。**単語のスペル、大文字小文字、スペースとTabなどよく間違う箇所は、アルファベットを一個一個キーボードで入力しないとが気付かないです。最初は慎重にチェックしながら、勉強したほうが良いと思います。

対話モードの「>>>」の後ろにコマンドを入力し、「Enter」キーで実行できます。

```python
>>>100+200
300
```

こういう感じで、普通の電卓機能ができます。
何か言葉をPythonに出力したい場合は、コマンド[print()]を使えます。出力したい文章を「""」あるいは「’’」の中に書いて出力ができます。「”’」あるいは「’”」はだめです。

```
>>>print('hello,python')
hello,python
```

「””」或いは「’’」の中の文章は「文字列」といいます。今後はよく使います。
最後は、「exit()」でPythonを閉じて、初めてのPythonプログラムができました。残念のは保存ができなくで、次回にもう一度入力する必要があります。


## まとめ
Pythonの対話モードで、直接コマンドを入力したら、すぐ実行が出来て、結果まで表示されます。

前章　[1-2、Pythonのインタプリタ](https://qiita.com/ousrok/items/0edacb92b0c7054ba81a)
次章　[2-2、Python開発のエディタ](https://qiita.com/ousrok/items/baff667324fbc1ca01d5)
目次　[python 勉強完全まとめ(素人向き)](https://qiita.com/ousrok/items/135734b5f66afb497253)
1-2、Pythonのインタプリタ

　我々Pythonで書いたプログラミングは「.py」の拡張子でのファイルとなります。このファイルを実行するために、インタプリタが必要となります。Pythonは文法からインタプリタまで全部オープンソースなので、理論上では、技術があれば誰だもインタプリタを作ることができます（難しいはもちろん）。python.orgが公開している「Python」のインストールを前章で紹介したが、これ以外にもPython言語で書かれたプログラムを動かすインタプリタは幾つか存在しています。
## CPython
 [Pythonの公式サイト](https://www.python.org/)でダウンロード＆インストールしたPython3.xはCpythonといいます。C言語で実装されているため、他実装との比較時に「CPython」と呼ばれます。コマンドプロンプトにpythonで起動されているのはCPythonのインタプリタです。これは一番使われているので、これからの記事はCPythonのベースで進みたいと思います。
## PyPy
 [PyPy](http://pypy.org/)は[JIT(Just-in-Time)](https://en.wikipedia.org/wiki/Just-in-time_compilation)コンパイラにより、高速に動作するためのインタプリタです。CPythonで書かれたプログラミングはPyPyでほとんど実行できますが、違い箇所もあります。同じいププログラムでも二つのインタプリタでやると異なる結果が出る可能性もある。本気にPyPyで実行したいであれば、[PyPyとCPythonの違い](https://pypy.readthedocs.io/en/latest/cpython_differences.html)を勉強したほうが良い。
## Jython
[Jython](http://www.jython.org/)はJavaで実装されています。Javaクラスライブラリ(JCL)が利用できる。

## IronPython
[IronPython](https://github.com/IronLanguages/ironpython2)はJythonと同じ、C#で実装されています、マイクロソフトの.NETの基本クラスライブラリ（BCL）が利用できる。


##　まとめ
Pythonのインタプリタは沢山あります、この中に一番使われているのはCPythonです。これからの記事はCPython3.x系で実行する前提です。

前章　[1-1、Pythonのインストール（Windows編）](https://qiita.com/ousrok/items/ec10aee5dc9810831cba)
次章　[2-1、初めてのPythonプログラム](https://qiita.com/ousrok/items/bf1aa75bc53d8b6e591a)
目次　[python 勉強完全まとめ(素人向き)](https://qiita.com/ousrok/items/135734b5f66afb497253)
オフホワイトiPhoneX/Xs/9ケース おしゃれoff-white ブランド iPhone8/7/6s/6 Plusカバー

<p>皆様、こんにちは～！</p>
<p>オフホワイト（ OFF-WHITE）はアメリカのファションブランドだけではなく、既に世界的なブランドになりました。</p>
<p>彼らは服だけではなく、スマホケースも結構人気があります。</p>
<p>潮流感がいっぱいで、若者に向けのオフホワイト iPhoneX/8/9 Plusケース、私が購入しました、ここでみんなにおすすめ！</p>
<h2><a href="http://upkaba.com/off-white-stussy-iphone-x-9-plus-case-0101.html">ブランドIPhoneX/Xs/9ケース オフホワイトパロディー 男女向け ステューシーアイフォンX/8/8Plusケース おしゃれ Off-White Iphone7/6s/6 Plusカバー 激安</a></h2>
<p>	<img src="http://upkaba.com/image/catalog/demo/product/axz0101/2.jpg" alt="オフホワイトiPhoneX/8/9 Plusカバー" width="400"/></p>
<p>欧米大人気のブランドOFF-WHITE新作 アイフォンX/8/9Plusケース、</p>
<p>ファッションさや注目度は大人気のOff White新作iPhoneケース、キズや汚れ、指紋などを防止、</p>
<p>高品質な<em><strong><a href="http://upkaba.com/brand-iphone-x-8-plus-case">ブランドiPhoneX/Xs/9Plusケース</a></strong></em>である。</p>
<p>メンズやレディース兼用、ブラック、ホワイト2色が揃い、彼氏Or彼女にプレゼントするにもOKですよ！</p>
<h2> <em><a href="http://upkaba.com/off-white-iphone-case-0072.html"><strong>フホワイトOFF-WHITE IPhoneXs/Xs Plus ケース 背面ガラスケース メンズ レディース アイフォンX/8/9プラスケース おしゃれブランド オフホワイトIPhone8/8 Plusケースレディース用 IPhone7/7Plusケース カップル用</strong></a></em></h2>
<p><img src="http://upkaba.com/image/catalog/demo/product/axz0072/1.jpg" alt="off-whiteブランドiPhoneX/8/9Plusケース" width="400"/></p>
<p>カプル用 アイフォンX/X Plusプラスケース <strong><a href="http://upkaba.com/brand-iphone-x-8-plus-case/off-white-brand-case"><em>Off WhiteiPhone8/8Plusケース</em></a></strong>、ファションなデザイン、</p>
<p>大胆で目新しいブルーレイデザインーを採用したオフホワイトiPhoneXケースには、若々しいスタイルが表現されています。</p>
<p>芸術的な見た目で、メンズ、レディース用のoff whiteアイホン7/7プラスケースです。</p>
<p>まだいろんなブランドiPhoneX/Xプラスケース<em><strong><a href="http://upkaba.com/off-fwhite-iphone-x-case-0056.html">オフホワイト iPhone8/8Plusカバー</a></strong></em>グッチブランド＆シャネル・ルイ・ヴィトンなどブランド カプル用ケースが見たい方は是非弊店upkabaへ足を運んでくださいませ！</p>
<p><img src="http://upkaba.com/image/catalog/demo/product/axz0056/1.jpg" alt="iPhoneX/X Plusカバー" width="400"/></p>
<p>もっと詳しい内容を知りたければ、弊店のLINEとご連絡をお願いいたします。</p>
<p>LINE　ID：suprecase2</p>
<p>下記LINEのQRコートをお読み取ってください</p>
<p><a href="http://upkaba.com"><img src="http://upkaba.com/image/catalog/demo/product/line/image-top2.jpg" alt="ブランドiPhoneX/XPlus/9/9Plus/8/8Plus/7/7Plus/6s/6sPlus/6/6Plusケース"/></a></p>
<p>もし何か問題がありましたら、お気軽にご連絡ください。</p>
エラー CS8357 指定されたバージョン文字列にワイルドカードが含まれていますが、これは決定性と相容れません。バージョン文字列からワイルドカードを削除するか、このコンパイルで決定性を無効にします

#はじめに
Visual Studio をバージョン15.8.1あたりに上げてから、タイトルのようなエラーが発生してしまうようになり、困っていたところ、解決策が見つかりましたのでシェアします。
ちなみに、英語でのエラーメッセージは "The specified version string contains wildcards, which are not compatible with determinism. Either remove wildcards from the version string, or disable determinism for this compilation" です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/100206/ab73599b-e6a7-aa4e-b4b1-e56ceec47489.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/100206/bec8ae46-efc9-d974-83e5-323f074eb8c6.png)
#原因
アセンブリのバージョン指定にワイルドカード（ビルドごとに自動採番させる）を使用していると発生します（私はとても重宝していたのですが...）

「『決定論的』なビルド」なるものが既定で有効化されたためのようで、「決定論的」とするとテスト実行が高速化されたりする利点があったりするようです。しかし、反面今回のような影響もでてしまいます。

「.NET Core を使っていると決定論的ビルドが既定で有効化される」との情報も見つかりますが、.NET Framework でプロジェクトを生成してもこの現象は発生します。内部で.NET Coreを使用しているのかな...

#対処法
（以下は、C# Windowsフォームアプリケーション(.NET Framework）のプロジェクトを作成して試しています）

<!--
ファイル "<プロジェクト名>.csproj" を直接開いて編集します。そのために、まずプロジェクトをアンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100206/70657386-6cbc-fcca-ec57-c87e16d0fb2c.png)
-->

ファイル "<プロジェクト名>.csproj" を直接開き、&lt;PropertyGroup&gt;要素内にある&lt;Deterministic&gt;要素の値がtrueになっているので、これをfalseに書き換えて保存します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/100206/aea58d0e-f864-3747-0df8-5e98add11a34.png)

csprojファイル更新後、プロジェクトエクスプローラーで「（利用不可）」と表示されているので、プロジェクト項目を右クリックして「プロジェクトの再読み込み」を選択すると、通常どおりに読み込まれて開発作業ができるようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/100206/a7f5fcc0-84f8-df6a-abfa-44f6eb571619.png)

ちなみに、csc や msbuild のコンパイルオプションでも、決定論的ビルドを使用するか否かを指定できるようです（Visual Studio でビルドする際、csproj ファイルで結局はコンパイルオプションを指定しているのでしょう）

#おわりに
Visual Studio の進化が最近著しくて嬉しい一方、アップデートしてから不明なコンパイルエラーになったりすることもあります。当たり前ですが、納期が近い時にツール類のアップデートは控えることが賢明ですね。

#参考情報
- [Auto Versioning in Visual Studio 2017 (.NET Core)](https://stackoverflow.com/questions/43019832/auto-versioning-in-visual-studio-2017-net-core/46985624#46985624) --- Stack Overflow
- [Determinism end-user experience is poor](https://github.com/dotnet/roslyn/issues/26231) -- GitHub
- [ピックアップ Roslyn 2/10](https://ufcpp.net/blog/2017/2/pickuproslyn0110/) --- [++C++; // 未確認飛行 C](https://ufcpp.net/) さん
- [-deterministic (C# Compiler Options)](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/deterministic-compiler-option) --- [Microsoft Docs](https://docs.microsoft.com/ja-jp/)
Seleniumを使ってIE11画面をスクロールさせる

初めてのケースだったので備忘録として。

# 基本情報

* 執筆：2018/09/12
* OS:Windows10
* ブラウザ：IE11
* Selenium-java:3.13.0
* IEDriverServer:3.14.0

# tl;dr

frameではなくdisplay:blockで分割された↓のような画面で上下のスクロールバーをそれぞれ制御したかった。
<img src=https://qiita-image-store.s3.amazonaws.com/0/237065/4ffe26cf-f3b6-d581-0b8e-195aa9ef2e22.png height=20%>
以下の方法で可能。指定する項目が見えるところまでスクロールするjavascriptの機能を利用。（以下の例は"target"要素が見えるところまでスクロールする。）

```
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView(true);", driver.findElement(By.id("target")));
```

以下、試行の記録。

# #1
javascriptのscrollToを利用するがNG。画面の項目にフォーカスを当てても効かず。

```
((JavascriptExecutor) driver).executeScript("window.scrollTo(0, 100)", "");
```

# #2
PageDown押下作戦、効かず。これはそもそも制御エリア内にフォーカスを当てられていなかったのが原因かも。入力フィールドにフォーカスを当てると入力フィールド内で入力されている文字列の末尾にジャンプしてしまう。(Endキーの動作と同じ。)

```
driver.findElement(By.id("target")).sendKeys(Keys.PAGE_DOWN);
```

# #3
解決策と同じ手法のSelenium版。1mmも動かず。

```
WebElement elem = driver.findElement(By.id("target"));
Actions action = new Actions(driver);
Actions action2 = action.moveToElement(elem);
action2.perform();
```

※ブラウザ種類により動作が異なることはあると思うので、他ブラウザでは試行錯誤１～３の方法でももしかしたらできるのかもしれません。

弊社ではエンジニアを募集中です。こちらも見て頂けると嬉しいです。
https://www.nittsu-infosys.com/recruit/2019/index.html
文字列として変数に格納されている列名をggplotのaes()に入れたい

文字列（シングルクウォート または　ダブルクウォートで囲まれている）で格納されている変数をggplotのaes()内の列名に指定して作図をしたかったときに躓いたのでメモ。

## 失敗パターン

```.r
> target <- "id_col"  
> ggplot(tmp, aes_(x = target_col, y = ctr)) + #列名が""に囲われている状態で指定
    geom_col() +
    facet_wrap(~group_name) 
    
Error in aes_(x = target_col, y = ctr) : object 'ctr' not found
```

## 以下で解決
as.name()で囲うと""がなくなる。
※aes_ を使用することと、列名をそのまま指定している列も同様の形式（as.name("列名")）にしておくこと

```.r
ggplot(tmp, aes_(x = as.name(target_col), y = as.name("ctr"))) +
    geom_col() +
    facet_wrap(~group_name) 
```

## その他の失敗パターン

・aesではなくaes_を使用する必要がある

```.r
> ggplot(tmp, aes(x = as.names(target_col), y = ctr)) + 
    geom_col() +
    facet_wrap(~group_name) 
Error in as.names(target_col) : could not find function "as.names"
```
</br>

・```print(target_col, quote=F)``` でも文字列の横の""は削除できるが、ｘに"print(target_col, quote=F)"という1列を指定したと認識されてしまう


```.r
> ggplot(tmp, aes(x = print(target_col, quote=F), y = ctr)) + 
    geom_col() +
    facet_wrap(~group_name) 
```
webのアクセシビリティ

##Webアクセシビリティとは
年齢や障害、不自由の有無、利用環境などに関係なくWebを利用するすべての人がWebで提供されている情報にアクセス可能であり、コンテンツを理解できたり機能を利用できたりすることである。

##支援技術
* 視覚障害者には音声ブラウザやスクリーンリーダーを利用してwebコンテンツにアクセス。また点字ディスプレイを利用するなどがある。
* 弱視のユーザーには文字サイズの変更、モニタのコントラスト、音声読み上げ技術など。
* 聴覚障害者には動画につけられた字幕（キャプション）を利用してもらう。
* 肢体不自由者にはマウス以外のデバイスキーを補助する器具などを利用してもらう。


##アクセシブルなwebの実装

| 方法 | 知覚可能                                                     | 操作可能                                                     | 理解可能                                                     | ロバスト性                                     |
| :--: | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | ---------------------------------------------- |
|  1   | 代替テキストを提供し、画像などの非テキストを点字、音声、シンボルなどのユーザーが必要とする形式に変換できるようにする | 全ての機能をキーボードから利用できるようにする               | テキストのコンテンツを読みやすく理解可能にする               | 全ての機能をキーボードから利用できるようにする |
|  2   | 時間に伴って変化するメディア（カルーセルなど）には代替コンテンツを提供 | ユーザーコンテンツを利用するのに十分な時間を提供する         | webページの表示や動作を予測可能にする                        |                                                |
|  3   | 様々な方法で提供できるようにコンテンツを制作する             | 光過敏性発作を起こさないようにする                           | ユーザーが間違えないようにしたり、間違いを修正したりするのを助ける |                                                |
|  4   | ユーザーがコンテンツを見やすく、聞きやすくする。             | ユーザーがコンテンツを探し出したり、現在位置を確認するのに手助けする手段を提供する |                                                              |                                                |
R 列名 操作


・対象の列名がデータフレームの何番目の列なのかを調べる

```.r
# id という列名の列は何番目かを調べる
col_num <- which(names(df)=="id")

```

・列名の一部変更

```.r
#2番目の列名のみ変更
names(df)[2] <- "id_new"

```

・列名全部変更

```.r
colnames(df) <- c("aa", "bb", "cc")
```
Golang+MySQLでPolygonを取得する

# 概要
MySQLに入れたポリゴンデータを取得するのに、どんな型を使えば良いのか分からなかったのでメモ
```orb.Polygon```の他に```orb.Point```や```orb.LineString```なんかも使えるので、空間系のデータを扱うのに便利そう
問題はgormや他のormでどうやって使えばいいのか分からない・・・

# コード
```query.go
import (
    "github.com/paulmach/orb"
    "github.com/paulmach/orb/encoding/wkb"
)
func Do() {
    var polygon orb.Polygon
    query := "SELECT ST_AsBinary(polygon) FROM areas WHERE MBRIntersects(GeomFromText('POLYGON((135.4949573  34.700436, 135.498854 34.697071))'), polygon)"
    row := DB.QueryRow(query)
    err := row.Scan(wkb.Scanner(&polygon))
}

```
Rails deviseに新しいカラムを作成

##deviseに新規カラムを追加

```erb
<!-- views/registrations/new.html.erb -->
<div class="field">
    <%= f.label :username %><br />
    <%= f.text_field :username %>
  </div>
```
サインアップ時に追加したい要素をformに追加し

```app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected
    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
      devise_parameter_sanitizer.permit(:account_update, keys: [:username])
    end
end
```
controllerに必要な`permit`の記述を加えた後で


```terminal
rails g migration add_任意カラム名_to_任意モデル名 username:string
```
こちら・・・。
基本的なDBカラムの項目追加と同じコマンドなので、なんだそれだけかとお思いになるかと・・。

##そもそも詰まった理由
[[*Rails*] deviseの使い方（rails5版）](https://qiita.com/cigalecigales/items/f4274088f20832252374#2-%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97%E3%81%99%E3%82%8B%E9%9A%9B%E3%81%AB%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%92%E5%A2%97%E3%82%84%E3%81%99)を参考にカラムを追加しようと見よう見まねで実行した結果が

```terminal
NoMethodError in Devise::Registrations#new
ActionView::Template::Error (undefined method `username' for #<Youser id: nil, email: "", created_at: nil, updated_at: nil>):
```
`undefined method error`が出た為、そもそも上の記述でカラムに内容が登録されているのかを確認するために `app/db/schema.rb`の中身をチェック

```schema.rb
create_table "yousers", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    # t.string "username"　ここが抜けていた。ちなみに直接記述するだけでは弾かれる。
    t.index ["email"], name: "index_yousers_on_email", unique: true
    t.index ["reset_password_token"], name: "index_yousers_on_reset_password_token", unique: true
  end
```

`t.srting "username"`の要素が案の定入っていなかった。
というわけで冒頭の ` rails g migration`を実行することで追加。

エラーコードだけでググるとルーティングの設定が〜〜関連の記事がヒットしたので少し困惑。
備忘録程度に残します。
redashのPythonを触ってみた

#目的
エンジニア？アナリスト？歴2ヶ月目の新卒社員が業務をやっていく中で最近学んだこと、これよく使うなあということを簡単にまとめたもの（今回はredash内でPythonを使ってみた編）。備忘録。実は第2弾。
→前回の記事は[こちら](https://qiita.com/icchy_sh33p/items/4730352c6b14ad0439e5#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E3%81%B2%E3%81%A8%E3%81%A4%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E8%A1%A8%E7%A4%BA%E3%81%97%E3%81%9F%E3%81%84)

##そもそもとして
考えたら、いつPython使うんだろうと思い返してみる。
すると、~~お世話になっているチームのリーダーさんに今回はPythonを使ってっていわれて~~
もともとSQLでまとめている複数のデータを一元化したうえでひとつの結果として出力したいときに使っているなあと再認識。なので、今回はそこも関連させて学んだことをのっけられるといいなぁなんて超初心者ながらに思っています（忘れてたらゴメンネ）。とはいえ、やっぱりあくまで備忘録要素が強い投稿になると思うんで、なんだかんだ無秩序な書き方をして忘れてしまうのがオチかも。そこは暖かい目で見過ごしてください。

#取得するデータの時期を調整したい
営業をしている人が依頼しにくると、意外と多いのが、前月の控除とか売り上げが〜とか、現時点でのこれが〜とか時期を指定したデータの出力を求められることが多く、実はこれ、Pythonだと意外と面倒。調べて方法をわかりやすく書いているページが見つかっても、使っているバージョンが古かったりすると使えなかったりした。自分の場合は、こんな感じで解決。

##『今月』を指定
```
import datetime
month = datetime.date(datetime.date.today().year,datetime.date.today().month,1).strftime('%Y-%m-%d')
```

今回は年月のみを指定。年月日までの指定になるともう少し簡単にできそう（時間があるときにやり方をもう一度思い出したら追記予定）。

##『前月』を指定
```
import datetime
month = datetime.date((datetime.date.today() - datetime.timedelta(days=31)).year,(datetime.date.today() - datetime.timedelta(days=31)).month,1).strftime('%Y-%m-%d')
```

ただ、これは今思い返すとあんまりよくない書き方なのかも。
理由は、ひと月当たりの日数はまちまちで、とくに2月周辺になると、2月は28日しかないので『前月』の結果を正しく出力されない可能性があるから。作ったのが先月（8月）なので、これから問題が出てきたらクエリーとこのページを書き直す予定。

##『翌月の日数』を指定
```
import datetime
month = datetime.date.today().month + 2
if month == 13 : 
    month = 1
elif month == 14 : 
    month = 2

add_month = month

date = datetime.date(datetime.date.today().year,add_month,1) - datetime.timedelta(days=1)
```

これを応用すると、『翌月』を指定／さっきの『前月』を指定もできるのでは

#数字のトラブル解決法
##割る数が0のときの割り算の商を0にしたい
数字をいじっていると出力する頻度が必然的に高くなるのが、割合（率）。しかし、Pythonでは割り算をするときにいわゆる『割る数』が０のときはエラーになってしまい、出力されない（ZeroDivisionError）。
こういうときは、割り算の関数を設定してしまう。

```
def devide(x, y) : 
    try:
        return x / y 
    except ZeroDivisionError: 
        return 0
```

##出力結果が小数点以下が表示されない
- 割られる数をfloat型に指定

#実行する前に確認すること
- SQLのカラム名が日本語のとき、UTF-8形式で正しくデータを得られるようにカラム名をu'カラム名'に書き直したかどうか
- くっつけたいデータ同士を共通する項目で紐づけしているか

↓具体的にはこういうこと。

```
for リスト／辞書名1 in 要素名1 : 
    for リスト／辞書名2 in 要素名2:
        if リスト／辞書名1['共通する項目'] == リスト／辞書名2['共通する項目']:
```


・・・意外となかった。悔しい。

#感想
今日試しに2件書いたので、片方は完全に人に見せる気のない書き方で、こっちはこれから読む人がいるかもしれないと思って、少し語りかけるかのような書き方をしてみた~~（相手に擦り寄っていくスタイル大事）~~。
自分自身、Pythonに対して、未だに苦手意識があるので少しずつこれをなくしてうまく付き合っていけたらいいなぁ。

またいつか投稿ができるように、少しずつ知識を吸収していこう。おーしまい
vscode-ruby-ctagsがうまく設定できない時

>VSCodeのctagsでRubyソースをコードジャンプする
https://qiita.com/shouta-dev/items/e180097a050dab25cfd6

基本的にはこちらの記事の方法で動くのですが、VSCode側でいくつかバグが有るため、
動かないと勘違いしたのでメモとして書きます。

#user_settings.jsonが読み込まれてないように見える
<img width="1049" alt="Screen Shot 2018-09-12 at 11.10.45 AM.png" src="https://qiita-image-store.s3.amazonaws.com/0/63920/8edaa51c-efa8-5d0f-f5e1-f04320bb384e.png">


記事通りに記述すると、画像のように'Unknown configuration setting'が出るのですが、
これはメッセージだけで、実際は設定されています。この内容はgithubのissueにも書かれていて、
まだ修正されていないようです。
>https://github.com/otoniel-isidoro/vscode-ruby-ctags/issues/3

#Generate ctagsでctrl+alt+g (cmd+option+g on mac)を押しても動かない事がある。
ドキュメントでは上記のショートカットで.ctagファイルがGenerateされるはずなのですが、
これが作成されない場合があります。
その場合はF1キーから'CTAGS:Generate Ruby tags' コマンドを打つと作成されます。

#最後に
.ctagファイルは再作成する際は一度削除して再作成が必要なようです。
とはいえ、vscode-ruby-ctagsは最近は特に修正などもされてないようなので、しばらくは変更することはなさそうですね。。。
VoltDB 8.2.1リリース（kubernetesサポート他）

# VoltDB 8.2.1リリース

2018年9月6日にVotDB 8.2.1がリリースされました。

リリースノートは以下を参照してください。

Release Notes
https://docs.voltdb.com/ReleaseNotes/

今回のリリースの目玉は「kubernetesサポート」で詳細は以下に記載されています。
kubernetesはまだ手を出していないのですが、触ってみたくなりました・・・

Deploying and Managing VoltDB Databases With Kubernetes
https://docs.voltdb.com/kubernetes/
JenkinsのGitlabプラグインでGitlabからJenkinsへの通知とビルドをやる

# GitLab Plugin + Jenkins

意外に通知設定を作るのに苦戦したのでメモ

## ツールのバージョン・状況など

- [Gitlab Plugin 1.5.9](https://wiki.jenkins.io/display/JENKINS/GitLab+Plugin)
- Bitnami版 Jenkins
- JenkinsのURLはRoute53とELBでサブドメインを付加

## Jenkinsのジョブ側設定

- Gitlab Pluginをインストールすると、設定が出るのでwebhook URLをコピーする

![image.png](https://qiita-image-store.s3.amazonaws.com/0/20634/c4e4ca57-ba34-0ba5-01d7-4e27f32d1fed.png)

## Gitlabのweb-hook設定

- 先ほどコピーしたURLを張り付ける
- 認証設定をしているばあいは、ホスト名の前に `http://id:pass@hostname/...` と設定する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/20634/49b38c31-34d4-dccb-04bc-aee6ed8fc0cd.png)

## 疎通テスト

あとはGitLab側でTestボタンを押せば疎通確認ができる。
vimがdyld: Library not loadedで起動できなくなった [mac]

## 現象

bashrcでも修正しようとターミナルからvimを起動しようとすると、以下のエラーが出て起動しない

```
$ vim .bashrc
dyld: Library not loaded: /usr/local/opt/python/Frameworks/Python.framework/Versions/3.6/Python
  Referenced from: /usr/local/bin/vim
  Reason: image not found
Abort trap: 6
```

python？ 最近pythonなんか使ったっけ... いや使ってない
というかvim関係ある？

原因がよく分からない

## 解決方法

ググったら`brew upgrade`しろとある
vimが「dyld: Library not loaded」エラーが出て起動できない(MacOS High Sierra) - Qiita https://qiita.com/tomo62/items/9192477a4109f6a71eb8

よく分からんので、とりあえず`brew upgrade`しよう

```
$ brew upgrade
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Deleted Formulae
mediatomb

==> Upgrading...略
```

upgrade終わって、vimを起動させてみると

お、起動した

<img width="440" alt="スクリーンショット 2018-09-12 17.52.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/52227/36c2da53-f742-016c-6c49-3aa4c550378c.png" >

解決した、なんだったんだろうか
Trailhead　属性と式　Attributes and Expressions

```campingListItem.cmp
<aura:component >
    <aura:attribute name="item" type="Camping_Item__c" required="true"/>
    <p>Name: <ui:outputText value="{!v.item.Name}"/></p>
    <p>Price: <lightning:formattedNumber value="{!v.item.Price__c}" style="currency"/></p>
    <p>Quantity: <lightning:formattedNumber value="{!v.item.Quantity__c}"/></p>
    <p>Packed:  <lightning:input checked="{!v.item.Packed__c}" type="toggle"/></p>
</aura:component>
```

「Name:」とかはなくても通る。
「v.」を使えばいいこと、Quantityには要らないStyleがPriceには必要だったこと（通貨だから当たり前なんだけど）を自力で考えなければならない。
dtに自動的にcounter（番号）をつける

HTML

```html:test.php
<div class="event_prize">
	<ul class="event_prize-list list-number">
		<li>
			<dl>
				<dt>テスト１</dt>
				<dd>菅義偉官房長官は１２日の記者会見で、ロシアのプーチン大統領が前提条件をつけずに年内の平和条約締結を提案したことに対し、</dd>
			</dl>
		</li>
		<li>
			<dl>
				<dt>テスト２</dt>
				<dd>「政府としては北方四島の帰属の問題を解決して平和条約を締結する基本方針に変わりはない」と述べ、否定的な考えを示した。</dd>
			</dl>
		</li>
		<li>
			<dl>
				<dt>テスト３</dt>
				<dd>菅氏は１０日の安倍晋三首相とプーチン氏の首脳会談について「両首脳間で、ご指摘のような発言があったということは承知していない」と強調した。</dd>
			</dl>
		</li>
	</ul>
</div>

```


SCSS

```scss:_test.scss

.event_prize {
	.event_prize-list {
		> li {
			&:not(:last-child) {
				margin-bottom: 15px;
			}

			dl {
				margin-top: 5px;

				dt {
					position: relative;
					padding: 0 0 0 1em;
					font-family: FOT-ロダンNTLG Pro EB;
					font-size: 0.75rem;
					line-height: (20/13);

					&::before {
						content: "\2022";
						position: absolute;
						top: 0;
						left: 0;
					}
				}

				dd {
					margin-top: 8px;
					margin-left: 15px;
					font-size: 0.75rem;
					line-height: (20/13);

					a {
						color: #fff100;
						text-decoration: underline;
					}
				}
			}
		}
	}

	.list-number {
		counter-reset: count;

		> li {
			dl {
				dt {
					padding: 0 0 0 1.5em;
				}

				dt::before {
					content: counter(count) ".";
					counter-increment: count;
				}
			}
		}
	}
}


@media only screen and (min-width: 768px) {
  .event_prize {
		.event_prize-list {
			> li {
				dl {
					margin-top: 0;
					overflow: auto;

					dt {
						font-size: 1rem;
						line-height: (22/15);
					}

					dd {
						font-size: 0.875rem;
						line-height: (20/14);
					}
				}
			}
		}
  }
}
```
KeycloakのLogout Endpointでログアウトする

ユーザーがアプリケーションからKeycloakにSingle Sign-Onしたあと、アプリケーションだけでなくKeycloakからもログアウトしたい場合。

[公式ドキュメント](https://www.keycloak.org/docs/latest/securing_apps/index.html#logout)によると、下記のURLにアクセスすればいいと書かれています。

```
http://サーバー名:ポート/auth/realms/レルム名/protocol/openid-connect/logout
```

しかしドキュメントには、GETなのかPOSTなのか、必要なパラメーターは何なのか、パラメーターはヘッダーで送るのかクエリパラメーターなのか何なのか、何も書かれていない・・・。

色々試した結果、分かりました。

メソッドはPOST、そしてリクエストパラメーターとして `refresh_token` 、 `client_id` 、 `client_secret` を送信すればログアウトできます。

curlコマンドだとこんな感じです。

```bash
curl -v -X POST -H "Content-Type: x-www-form-urlencoded" -d "refresh_token=リフレッシュトークン" -d "client_id=クライアントID" -d "client_secret=クライアントシークレット" http://サーバー名:ポート/auth/realms/レルム名/protocol/openid-connect/logout
```
Rubyでダックタイピングに入門する

![image.png](https://qiita-image-store.s3.amazonaws.com/0/202653/a3a891ed-be98-ce9e-d357-7236e55d312c.png)


[オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方](//af.moshimo.com/af/c/click?a_id=1022937&p_id=170&pc_id=185&pl_id=4062&s_v=b5Rz2P0601xu&url=http%3A%2F%2Fwww.amazon.co.jp%2Fexec%2Fobidos%2FASIN%2F477418361X)という本を読んでダックタイピングについて学んだことをまとめます

## ダックタイピングとは？

![joshua-coleman-655076-unsplash.jpg](https://qiita-image-store.s3.amazonaws.com/0/202653/0825fbb1-d79c-cf27-a1f4-91b857061fc6.jpeg)


>"If it walks like a duck and quacks like a duck, it must be a duck"

>（もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである）

という言葉をRubyをやっているなら一度は聞いたことがあるかもしれません。私はこの言葉を聞いても正直何を言っているのか全くわかりませんでした。

実際Wikipediaなどで解説を読んでも全くピンときませんでした。

### 実例

理屈から入ってもわかりにくいので、まずはダックタイピングがRubyのどこで使われているのかを実際に見ていきましょう。これによってダックタイピングのなんとなくの雰囲気がつかめて理解の助けになるはずです。

#### 実例1

http://obelisk.hatenablog.com/entry/2015/07/20/205620

この記事が説明は少ないですが、コードが短くて手っ取り早く雰囲気を掴みやすいかと思います。

#### 実例2


[別の方のQiita記事](https://qiita.com/shinya_131/items/901b9c70642b1e1f9227)を参考にします。

Railsの```ActiveSupport```クラスには```blank?```メソッドが存在します。メソッド名から容易に想像できるように、オブジェクトが存在するかどうかを確認するためのメソッドです。
(実際には空っぽいかどうかで判定しています）

```ruby
[].blank?     #=> true # 空っぽい
{}.blank?     #=> true # 空っぽい

[1].blank?    #=> false
{a: 1}.blank? #=> false

''.blank?     #=> true # 空っぽい
'1'.blank?    #=> false

nil.blank?    #=> true # 空っぽい
true.blank?   #=> false
false.blank?  #=> true # 空っぽい
```

このように```blank?```メソッドは```Array```であれ```String```であれ応答できるようになっています。
次に実際に```blank?```の中身を見て見ましょう。

```ruby:blank.rb
# 実際にはもっとありますが、説明のためかなり省略しています。

class Object
  def blank?
  　# ここが重要
    # resopond_to?メソッドを使うことによって
    # empty?メソッドを知っているオブジェクトに対してはempty?を使い、その結果を返す
    # 知らないオブジェクトに対しては処理を変えている。この場合emptyを知らなかったらfalseが返る。
    respond_to?(:empty?) ? !!empty? : !self
  end
end

class Array
  alias_method :blank?, :empty?
end

class Hash
  alias_method :blank?, :empty?
end

class Numeric
  # どんなNumberもblankではない
  def blank?
    false
  end
end

```

実際にはもっとありますが、説明のためかなり省略しています。全部見たい方は[こちらから](https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/object/blank.rb)

このような記述によって```blank?```メソッドは全く知らないクラスに対しても、```empty?```に応答できる場合はそれを使うという動きが実現できます。

このことが

>"If it walks like a duck and quacks like a duck, it must be a duck"

>（もしもそれがアヒルのように歩き、アヒルのように鳴くのなら、それはアヒルである）

という一見何を言っているのかわかりづらい、言葉の意味になります。

## ダックタイピングのメリットとは？

ここまで説明してきたダックタイピングですが、どのようなメリットがあるのでしょうか？
この質問に対しては
[【OOP入門】Rubyでダックタイピングを理解する](https://qiita.com/yu-croco/items/22c8a066475172b6e673)
この方の記事を参考にされるのがいいです。

上の例でいうと私もまだはっきりとは理解できていないのですが、、、

- メンテナンスコストが下がる
- case文の肥大化が抑えられる
- コードの見通しが良くなる
- case文の条件をtypoしてもすぐにエラー個所がわからないが、ダックタイプにしておくと```no method error```ですぐに発見できる


## もっと知りたい人は？

[オブジェクト指向設計実践ガイド ~Rubyでわかる 進化しつづける柔軟なアプリケーションの育て方](//af.moshimo.com/af/c/click?a_id=1022937&p_id=170&pc_id=185&pl_id=4062&s_v=b5Rz2P0601xu&url=http%3A%2F%2Fwww.amazon.co.jp%2Fexec%2Fobidos%2FASIN%2F477418361X)

この本を読むことをお勧めします。
最初問題のあるプログラムからスタートして、それをダックタイプを用いてどうやってメンテナンス性が高いコードに改善していくかというストーリで学習できるのより理解が深まるかと思います。
PostgreSQLのJDBCドライバをアップデートしたら少しハマった話

## 背景
- Spring Boot 1.5 アプリケーション
- PostgreSQL 9.6
- DBアクセスはJDBC

PostgreSQLのJDBCドライバは、`batchUpdate()`で複数行をINSERTしてもレコード数分のINSERT文を作成します。
これでは遅いので高速化のためにBULK INSERTしたい。

ドライバ`9.4.1209`から`reWriteBatchedInserts`というオプションが追加されており、これを設定することでBULK INSERTになるのですが、`INSERT ON CONFLICT`使用時に不正なSQLを生成してしまう不具合があり、これが解消されているのが`42.2.2`。
ところが、Spring Boot 1.5系で導入されるのは`9.4.1212`。。。

ということで、ドライバのバージョンを上げることにしました。

## バージョンアップしてみた
`pom.xml`に以下を追加し、最新の`42.2.4`を導入します。

```xml:pom.xml
  <properties>
    ...
    <postgresql.version>42.2.4</postgresql.version>
    ...
  </properties>
```

これだけです。簡単ですね。

ところが。

ビルドするとテストがエラーを吐きました。

```shell
Expected :2015-12-15 23:30:59.999999
Actual   :2015-12-15 23:31:00.0
```

ドライバのバージョンを戻すとエラーは消えるので、バージョンアップの影響であることは確実です。

## 調査
テストが落ちる原因はタイムスタンプが繰り上がってしまっているためです。
Read/Writeどちらで問題が発生しているのか確認するために、このドライバを経由せずにDBのデータを覗いてみたところ、繰り上がったレコードが登録されているので、どうやら書き込む際に既に不正なデータになっているようです。

何故だ。

あれこれググってみると、ある[Issue](https://github.com/pgjdbc/pgjdbc/issues/1211)を見つけました。
これによると、バージョン`42.1.1`以降で発生する問題で、`42.2.3`では修正されている。
あれ？じゃあ問題は修正されている・・・？

## 解決
このIssueがキッカケで、バージョン`42.1.1`以降では`java.sql.Timestamp`のnano秒を、micro秒までの精度であるDBのTimestampに変換する際に、四捨五入していることと、これより前のバージョンではnano秒を無視していたことが分かりました。

で、テスト用のConfigurationを確認してみると・・・。

```java
public Clock clock() {
    return Clock.fixed(ZonedDateTime.of(2015, 12, 15, 23, 30, 59, 999999999, ZoneId.systemDefault()).toInstant(), ZoneId.systemDefault());
}
```

nano秒まで埋めてた！

ということで、`999999999`を`999999000`にして解決しました。
はじめてのログローテート


# 想定読者
ログローテートを知らない人。
ログローテートの概要を知っているが、どのように設定するかの詳細を知らない人。

# システム構成
* OS:CentOS 6.7
* 言語:php5.6
* RDB:Mysql

# ログローテートとは何か
Log： (実験・業務などの)記録
Rotate：回転する、循環する、自転する、交替する
→記録を循環させるソフトウエア。

# ログローテートの目的
ログを定期的に削除することで、ログの肥大化を防ぐことです。

#ログローテートの種類
* アプリケーション側でのローテーション設定
* OS側のローテション  
大まかに上記の2種類あります。  
今回は、後者を解説していきます。

# ログの種類
サーバで稼動している各種ソフトウエアは、各種ログを出力しています。    

* Linuxシステムログ(syslog) 
* ミドルウエアログ(access.log, mysqld.log 等) 
* ソフトウエアログ(access.log, error.log 等)

--- 

## ログ出力の注意点
MW全部のログを１つにまとめるのはやめましょう。
Elasticsearchなどでログ解析しようとしたとき、構文解析やデータ加工のための手間が必要なります。  

# ログローテションされないとどうなる？
→サーバのディスク領域を使いきり、ログが書き込めないことでサーバが機能停止する恐れがあります。

# ログローテートするには
ログローテートソフトウエア「logrotate」 を使おう！
最近のLinuxではデフォルトで導入されている非常にメジャーなソフトウエア。
もし、ない場合はyumやaptなどのツールで導入しましょう。

# 設定してみよう
`/etc/logrotate.d/ ` 配下に、ソフトウエアや機能単位で設定ファイルを配置する形式がメジャーです。

## ファイル名例
```
/etc/logrotate.d/apache
/etc/logrotate.d/nginx
/etc/logrotate.d/php-web
/etc/logrotate.d/php-api
```
## apacheの記載例
```
cat /etc/logrotate.d/httpd
/var/log/httpd/*log {
    missingok
    notifempty
    sharedscripts
    delaycompress
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
}
```
## 設定できる項目
| 項目名 | 内容詳細 |
|:------|:--------|
|missingok |指定のログファイルがなくても処理続行 |
|notifempty | ログファイルが空ならスキップ |
|delaycompress| ローテーション1世代目は圧縮しない| 
|daily or weekly or monthly or yearly　|指定した周期で実行|
|rotate [回数]|ローテーションする回数を指定|
|size [ファイルサイズ]|ログファイルが指定したファイルサイズ以上になったらローテーションする|
|postrotate～endscript|記述されたコマンドをログローテーション後に実行|
|compress|ローテーションしたログをgzipで圧縮|

# 注意点
## 実行権限
logrotateは、root権限で実行することがあります。
そのため、postrotate等でファイル削除コマンドやscriptを実行する場合には必ず検証環境で動作確認してください。
不適切なスクリプトがroot権限で実行された場合、最悪システムファイルが破損し、サーバがダウンします

## ログ保管
ローテーションの性質上、古いログファイルは削除されていきます。
長期的に保管して、分析したい要件がある場合は、保管方式や転送方式を検討、設計しましょう
cssスプライトを使って表示してきたような背景を、ふわっと変化させる工夫

# CSSスプライトを使ってきたような箇所
自分の場合、CSSスプライトを用いるのはマウスオーバーして、
パチっと一瞬読み込みが入ってはまずい箇所だけである。

## (まずい例)
![imghover2.gif](https://qiita-image-store.s3.amazonaws.com/0/25349/9ea4c59d-fede-7aa4-d052-69e6f58f3b5a.gif)

ただ、CSSスプライトを使うとゆっくり変化できないと思ってた。

##こんな感じ
![imghover3.gif](https://qiita-image-store.s3.amazonaws.com/0/25349/3dbe77e5-8f8e-9bc4-3f69-1c33c4f8c2bd.gif)

こんな感じにゆっくり変化されてもなあ・・という感じ。
ただゆっくり変化が実現できたので書き留めておく。

# 完成図
![imghover.gif](https://qiita-image-store.s3.amazonaws.com/0/25349/dc8e0e01-c865-66ec-7efd-06d44e1b3772.gif)
（moreボタンは別途transitionでやってます、見てほしいのは丸画像の部分）

## 必要なもの
変化前と変化後の画像を2枚。（例の場合は、くっきり画像とぼかし画像の2枚）
CSSスプライト用の連結画像は使いません。

```css:
.bgsp {
    display:block;
    width:100px;
    height:50px;
    position:relative;
    background: url(bg01.png) left top no-repeat;
}
.bgsp:hover:after {
    content:"";
    width:100px;
    height:50px;
    position:absolute;
    top:0;
    left:0;
    opacity:1;
    background: url(bg01_blur.png) left top no-repeat;
    animation:fadein .3s;
}
@keyframes fadein {
    0% { opacity: 0; }
    25% { opacity: 0.25; }
    50% { opacity: 0.5; }
    75% { opacity: 0.75; }
    100% { opacity: 1; }
}
```

元画像に疑似要素で変化後画像を重ねて透過しつつ表示するだけ。その際にanimationを付けています。
疑似要素使うと、パチッと一瞬読み込みが入らないようで一安心。

ただ、ちょっと調べただけだとマウスを外した際にもふわっと変化させるのはうまくいかなかった。
逆のanimation指定を作って親要素に指定するだけらしいんですが、、

# CSSスプライトでも、animationでstepプロパティを使うと出来るかも
調べてたらCSSスプライト用の連結画像でも、stepというのを使うと変化を刻むことができるそう。
ただそれ用の画像用意するのもメンテするのも面倒極まりないと思うんで。。

CSSも工夫次第でかなり色々実現できるようになってきたので、他にもうまいやり方・書き方あると思います。
【403 forbidden】javascriptが読み込めない時はSElinuxを疑おう[centos7編]

javascriptがを読み込もうとすると403 forbiddenの文字が・・・

小一時間トラブルシューティングした結果、SElinuxが原因でした。

簡単メモ程度ですがシェアしたいと思います。

僕は下記の手順で解決しました。
前提：Centos7 (さくらインターネットVPS)

>0. script読み込みの文法をちゃんと見直す
1. パーミッションを見直そう。chmodコマンドでちゃんとotherが r になっているか確認しましょう。
2. パーミッションの権限を見直そう

これでもダメならSElinuxを疑いましょう。


```ruby:初期設定
sudo setsebool -P httpd_can_network_connect_db 1
sudo setsebool -P httpd_tty_comm 1
sudo setsebool -P httpd_unified 1
sudo setsebool -P httpd_dbus_avahi 1

※selinuxの許可
```
```ruby:対象のディレクトリを指定
sudo semanage fcontext -a -t httpd_sys_content_t "var/www/html/blog"
sudo semanage fcontext -a -t httpd_sys_rw_content_t "var/www/html/blog/wp-content(/.*)?"

※ディレクトリの指定。 この例ではhtml/blogにWPをインストールしている例です。
たとえばWPではなく、自作HPの場合は上記２コマンドとも"var/www/html/任意のディレクトリ" のようにすれば良いです
```

```ruby:※再起動
sudo restorecon -R -v /var/www/html/blog
```
Git と GitHub の違い

GitHubの挙動が難しい。
GitHubのコマンド一覧が欲しい。


そう呟いてた自分に鋭い指摘が入りました。
「GitHubじゃなくて、それ、Gitなんだよなぁ。」


なるほど。
今日何度も見たGitHubのページの他に、「Git」というものがこの世に存在しているらしい。


言われてみれば、Terminalに今日はやけにgit 〜〜と始まるコードを言われるままに打ってました。
・・・Gitって何？　　GitHubとどう違うの？



◯GitとGitHubの違い

- Git　　　　　＝　　誰が何をしたのか勝手に管理してくれるナイスガイ（バージョン管理ツール）
- GitHub　　　 ＝　　Gitと連携していて、Gitの作業をみんなとやりとりできるWebサービス







厳密な定義はたくさん記事があがっていますが、正確な表現ではイメージが掴めなかったので、
備忘録も兼ねて自分の解釈を残しておくことにします。


- Gitとは
-
Gitさんに
１、何を足したのか
２、どこを削除したのか
３、つまるところ、どんな手を加えたのか
見ていてもらいたいリポジトリ（これから作業する今自分のいる場所）で、

```qiita:terminal
git　init
```
をすると、Gitさんが呼び出せてGitコマンドが使えるようになります。
これを忘れてしまうと、後で大変な目にあいます。


- GitHubとは
-



Webサイトです。
![スクリーンショット 2018-09-12 16.38.06.png](https://qiita-image-store.s3.amazonaws.com/0/148137/cc771bcf-0267-4c3b-5e29-69125b8d2546.png)

共有したい変更箇所をあげて、その内容で大丈夫か他の人に確認をもらったり、本番環境に組み込んだりすることができます。


気になったワードを整理してみました。
今日はこのあたりで失礼します。
AWS Lambda で CloudWatch Logsのイベントを期間指定&フィルターして処理する方法

#AWS Lambda で CloudWatch Logsのイベントを期間指定&フィルターして処理する方法
CloudWatch Eventsで、定期的にCloudWatch Logsのイベントをゴニョゴニョする場合に有効。
他にもやる人がいそうなのでその人の助けになれば。

## コード例

```py
import boto3
from datetime import datetime

#ロググループ名を指定
CLOUDWATCH_LOG_GROUP = "XXXX"

#フィルターパターンを指定
CLOUDWATCH_LOF_FILTER = "XXXX"
        

def lambda_handler(event, context):
    #期間を指定する タイムゾーンに注意
    from_datetime = datetime(2018, 9, 1, 0, 0, 0)
    to_datetime = datetime(2018, 9, 11, 23, 59, 59)
    
    #filter_log_eventsの期間指定はミリ秒なので1000倍する必要がある
    from_timestamp = int(from_datetime.timestamp()) * 1000
    to_timestamp = int(to_datetime.timestamp()) * 1000

    client = boto3.client("logs")
    
    next_token = ''
    
    while True:
        if next_token:
            #トークンが得られている場合でも他のリクエストは設定しないといけない。
            response = client.filter_log_events(
                logGroupName=CLOUDWATCH_LOG_GROUP,
                filterPattern=CLOUDWATCH_LOF_FILTER,
                startTime=from_timestamp,
                endTime=to_timestamp,
                nextToken=next_token #次の結果セットを取得するためのトークン
            )
        else:
            response = client.filter_log_events(
                logGroupName=CLOUDWATCH_LOG_GROUP,
                filterPattern=CLOUDWATCH_LOF_FILTER,
                startTime=from_timestamp,
                endTime=to_timestamp
            )

        for event in response['events']:
            #イベントのタイムスタンプ
            print(event.get("timestamp"))
            #イベントのメッセージをここで取得
            print(event.get("message"))
        
        if response.get("nextToken"):
            next_token = response["nextToken"]
        else:
            break
    
    return
```

## filter_log_events リクエストの仕様

```
response = client.filter_log_events(
    logGroupName='string',          #ロググループ名
    logStreamNames=[                #ログストリーム名（複数指定可能)
        'string',
    ],
    logStreamNamePrefix='string',   #ログストリーム名のプレフィックス
    startTime=123,                  #対象期間　開始タイムスタンプ(ミリ秒)
    endTime=123,                    #対象期間　終了タイムスタンプ(ミリ秒)
    filterPattern='string',         #フィルターパターン
    nextToken='string',             #次のデータセットのトークン
    limit=123,                      #取得件数　デフォルトは10000
    interleaved=True|False          #Trueにすると一度のレスポンスで複数のログストリームにまたがってイベントを返す努力をするらしい。デフォルトはFalse
)
```

## filter_log_events レスポンスの仕様

```
{
    'events': [
        {
            'logStreamName': 'string',  #ログストリーム名
            'timestamp': 123,           #イベントが出力されたタイムスタンプ
            'message': 'string',        #イベントの本文
            'ingestionTime': 123,       #取り込み時刻
            'eventId': 'string'         #イベントのID
        },
    ],
    'searchedLogStreams': [                     #検索対象となったログストリームについて
        {
            'logStreamName': 'string',          #ログストリーム名
            'searchedCompletely': True|False    #全てのログを検索したか
        },
    ],
    'nextToken': 'string'               #次のデータセットのトークン
}
```

## 注意事項
　IAMロールの権限設定を忘れずに

## 参考
boto3公式ドキュメントのfilter_log_eventsの部分
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/logs.html#CloudWatchLogs.Client.filter_log_events
SQLで取得したデータがリスト型になってしまう問題（Python）

| id       |    data    |
|:-----------------|:------------------:|
| 1             |        cat        |
| 2           |       dog       |
| 3             |        bird        |

PythonでSQLを使ってデータを取得し、データをプログラムで使う時の注意点です。
今回はidを入力し、対応するdataを一つだけ取得します。その場合

```python:animal.py
sql = "SELECT animal FROM animal WHERE id = 1;"
animal = fetch_db(sql)  # オリジナル関数（sqlを実行してデータを取得する）

if animal == "cat":
    print("にゃー")
```

とすれば取得できそうです。
しかし、これではanimalの中身が　**[('cat',)]**　というリストになってしまいます。

文字列にするには、以下のようにデータを加工します。

```python:animal.py
animal_list = fetch_db(sql)
animal_str = animal_list[0][0]
```
うしろに2つ[0]をつけます。
animal_list[0]　だと、中身は ('cat',) というタプルになります。
animal_list[0][0]　とすることで、中身が cat という文字列になります。

ちなみに、もし取得したデータが数値だった場合、中身は数値型になるので注意しましょう。
[Swift4.x] loading中やAPI返答待ち時のoverlay表示はどうしたらいいのか

Swift初心者、本業はWEBのフロントエンドです。

イベントの完了を待つ場合、画面を黒い半透明で覆う事よくあります。オーバーレイ表示ですね。
アラートやスピナーを表示する土台となる部分です。

```Swift

class viewController: UIViewController {
    //使い回すのでプライベートなグローバル変数としてUIViewを作成
    private var overlay : UIView?
    //初期読み込み
    override func viewDidLoad() {
        //ボタンのインスタンスを作成
        let custombBtn = UIButton(type: UIButtonType.system)
        //ボタンの文字(ノーマル時)
        custombBtn.setTitle("ボタン", for: .normal)
        //ボタンのアクション(@IBActionの代わり)
        custombBtn.addTarget(self, action: #selector(viewController.onCustomBtn(sender: )), for: .touchUpInside)
        //ボタンをViewに追加
        self.view.addSubview(createUserBtn)
    }
    //ボタンアクションの定義
    @objc func onCustomBtn(sender: UIButton){
        //インスタンスを作成
        overlay = UIView()
        //フレームをvieｗと同じサイズに
        overlay!.frame = self.view.frame
        //背景色をUIcolorの透過ブラックに
        overlay!.backgroundColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.8)
        //OverlayをViewに追加
        self.view.addSubview(overlay!)
    }
    //処理が終わったら(コピペだとcloseの処理がないので、永久に黒い画面が出っぱなし)
    func closeOverlay(sender: UIButton){
        //overlayをSuperviewから削除
        self.overlay?.removeFromSuperview()
    }

}

```
これでどうだろうか？