OmniAICreator/Qiita-1.07M huggingface dataset:
【Tex】コピペで使える図・表・箇条書き【初心者向け】

## 1. はじめに
- 本記事は『texを初めて書く人』が、コピペですぐ使えるように書いてます
- したがって詳解は抑え、必要最低限のことを書いております

## 2. おすすめの設定 (任意)
- Texの環境設定(Sublime)
    - Mac  ：　[SublimeText3でUTF-8のLaTeX環境を構築する（Mac）](http://qiita.com/DaiHasegawa/items/22732ca7a84bd34de923)
    - Windows ： [SublimeText3でUTF-8のLaTeX環境を構築する（Windows）](http://qiita.com/DaiHasegawa/items/d5729edab7ce4600264e)
- Sublimeの設定
 - [初心者のためのエディタ入門【Sublime Text 3編】](https://qiita.com/banaoh/items/c2e2e2ef857d1dbfaac7#3-tex%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89)

## 3. 本題
### 1. 図

```tex
% 上端に表示 : t, 下端に表示 : b, 記述の位置に表示 : h
% 文中で引用 : ref{fig1}
\begin{figure}[t]
  \centering
    \includegraphics[width=7cm]{ ./図.png }
  \caption{ 図のタイトル }
  \label{fig1}
\end{figure}
```

### 2. 表
<img width="150" alt="スクリーンショット 2018-01-09 18.52.47.png" src="https://qiita-image-store.s3.amazonaws.com/0/136499/45e03f4f-9699-810f-ca3f-7731b5e51e51.png">

```tex
% 上端に表示 : t, 下端に表示 : b, 記述の位置に表示 : h
% 文中で引用 : ref{table1}
% 罫線(縦)を引く : |
% 罫線(横)を引く : \hline
% 左寄せ : tabler{r}, 右寄せ:tabler{r}, 中央寄せ : tabler{c} ... 下記参照
% 二段組 : begin{table*} のようにアスタリスクをつける ... 例.2 参照

\begin{table}[ h ]
  \centering
  \caption{ 表タイトル }
  \label{table1}
  \begin{tabular}{ r | r r } \hline
    a & b & c \\ \hline
    d & e & f \\
    g & h & i \\ \hline
  \end{tabular}
\end{table}
```


### 例.1 罫線、右寄せなど

<img width="150" alt="スクリーンショット 2018-01-09 18.58.56.png" src="https://qiita-image-store.s3.amazonaws.com/0/136499/a2db12a2-347f-c1e9-2afe-cc912bec7c26.png">

``` tex
\begin{table}[h]
  \centering
  \caption{ 表タイトル }
  \label{table1}
  \begin{tabular}{ c | r | r }
        & one & two \\ \hline
    one & 1.001 & 1.002 \\
    two & 2.001 & 2.002 \\
  \end{tabular}
\end{table}
```

### 例.2 表の二段組

<img width="600" alt="スクリーンショット 2018-01-10 12.09.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/136499/b57dc34a-2050-32ea-008b-42f6d3f190e7.png">


```tex

\begin{table*}[]
  \centering
  \caption{ 表タイトル }
  \label{table1}
  \begin{tabular}{ c | r  r  r  r  r }
        & one   & two   & three &  four & five \\ \hline
    one & 1.001 & 1.002 & 1.003 & 1.004 & 1.005 \\
    two & 2.001 & 2.002 & 1.003 & 2.004 & 2.005 \\
  \end{tabular}
\end{table*}
```


### 3. 箇条書き
<img width="150" alt="スクリーンショット 2018-01-09 19.05.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/136499/3e1e7882-5fa8-91f4-da1c-f59449ab8c68.png">

``` tex
\begin{description}
  \item 1． 内容.1
  \item 2． 内容.2
  \item 3． 内容.3
  \item 4． 内容.4
\end{description}
```
MakerBot Replicator 5th Generation PLAフィラメント射出不良のアナログ的な原因と対策について

3Dプリンタ（MakerBot Replicator 5th Generation）の書き出し失敗に関する割と<font color="#00cc00">アナログ</font>な要因について書き留めます。

#1-1.フィラメントを引っ張る力の不足
フィラメントの残量が少なくなればなるほど、リールに回転が求められ、フィラメントを引っ張る力がより強く必要とされます。
私は純正のPLAフィラメントを使用していますが、決まってフィラメント残量が３分の１くらいになるたびにリールの抵抗力に負け、書き出しに失敗してしまいます。

フィラメントを引っ張る力が不足し始めた時には「カッカッ」という独特な音が鳴るのでわかりやすいです。

##1-2.解決方法
1. プリント中に少しずつリールを手で回し、フィラメントを緩める。
2. 新しいフィラメントに取り替える

1については緩めすぎても絡まってしまうため注意するほか、プリント中は常に見守らなければならないため、数時間かけてプリントするモデルの場合は困難です。
夜にプリントをスタートして安心して朝を迎えたい場合は、あらかじめ新品に交換しておいたほうが無難です。

![Image uploaded from iOS (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/178561/5c79a1de-2f8b-760c-e3ad-1e5e3f43c203.jpeg)
↑フィラメントを取り出して、手動で緩めます。外にむき出しにしておいたほうが、リールがちゃんと回転している気がする…
*（※出しっぱなしは推奨しません）*

グリップ力による送り出し不良については[こちら](http://www.weekend-makers-lab.com/3d%E3%83%97%E3%83%AA%E3%83%B3%E3%82%BF%E3%83%BC/1802)のページでも細かく触れられていましたのでご参照ください。


#2-1.プラットフォームシートに接したフィラメントの短時間湾曲
モデルが地面に対して接し面が広く、特に大きめのモデルを書き出している際に発生しました。
土台のフィラメントが冷えて収縮する際、<font color="#cc0000">フィラメントの射出方向に沿って反りあがりやすくなる</font>ようです。
反り上がった部分はノズルを押し上げてぶつかるようになり、ゴリゴリと音を立てて物理的な衝突を繰り返したのち、フィラメントがうまく射出できなくなって停止→失敗となります。
![Image uploaded from iOS (2).jpg](https://qiita-image-store.s3.amazonaws.com/0/178561/9cc726a3-6e96-0536-cb5e-9b7f64829b0a.jpeg)
↑シートから剥がす前にすでに湾曲していました

プリントが終わったあと本体を引き剥がすと、プラットフォームシートに、プリント前にはなかった気泡ができていることが偶にあります。
綺麗に貼ったはずなのに何故？と思っていたのですが、食いついたフィラメントごと引き剥がされシートが浮いたため生じているようです。

何度やっても同じようなタイミングで書き出し不良が生じるため、初めはモデルデータに問題があるのではと考えていたのですが、3Dプリンタにかじりついて観察していたところ、プリント中に土台のフィラメントがだんだんと湾曲していることに気が付きました。
<font color="#0000cc">面が広ければ広いほどフィラメントが冷えて収縮するタイミングに差が生じ、厚みがないため歪みやすい</font>と考えられます。
ABSフィラメントや非純正フィラメントで反りが起こりやすいとは聞いていましたが、純正PLAでも起こりうることが分かりました。

##2-2.解決方法
1. 土台の浮き上がってくる箇所を固定する
![DEA6EC79-B9C4-49D6-87EB-612141B39023.jpg](https://qiita-image-store.s3.amazonaws.com/0/178561/00854586-1004-edc0-9911-731959e8205a.jpeg)
2. 土台（Raft、ラフト）を広めに設定する
3. 土台（Raft、ラフト）なしの設定で書き出しする

1は土台が浮き上がってくることに気付いたタイミングで行った突貫工事でしたが、気休めでも固定したおかげでプリントがここで止まらず無事に先に進んでくれました。
３はあまり推奨されていないため剥がす際に難しいかもしれず、対策としては反っても本体に支障が及ばないように２が安全かと思われます。
時間を短くすればいいじゃん、とも一瞬考えたのですが造形時間を短く速くするとノズル内の圧力が高まり、射出不良になりやすいとのことです。
参照ページは[こちら](http://bs01.3dprinterwiki.com/index.php?title=%E7%B6%BA%E9%BA%97%E3%81%AB%E9%80%A0%E5%BD%A2%E3%81%99%E3%82%8B%E3%82%B3%E3%83%84)

#3.終わりに
書き出し失敗でよくあるフィラメント詰まりは、事前にフィラメントをloadしてしっかり溶かしてあげることで回避できます。
他にも、プリンタとフィラメントによってそれぞれ相性があるようなので、温度設定なども適正か確認してください。

つきっきりで3Dプリンタのそばにいる場合は、しっかり換気しましょう。
言語処理100本ノック00

#はじめに
　今後使うであろうpythonを一からやるため言語処理100本ノック2015を理解したい。途中からわけのわからない内容が書いてるので、あきらめそうだけどできるところまで頑張りたい！
　プログラミング初心者のため、ほかの人の記事や色々なものを参考にしながらとりあえず動かすことを目指します

ひとまず参考になるサイトを見つけました～
[素人の言語処理100本ノック:まとめ](https://qiita.com/segavvy/items/fb50ba8097d59475f760) @segavvy

@segavvyさんの書いたことを理解したい！

言語処理100本ノックの元サイトのリンク
http://www.cl.ecei.tohoku.ac.jp/nlp100/#data

#環境
windows10(version:1709) 2017/01/09
python3.6.2

#開始！
###00.文字列の逆順
　文字列"stressed"の文字を逆に並べた文字列を得よ

```python:00knock.py
s="stressed"
print(s[::-1])
```
すぐにわからないものが出てきました[スライス]
こういう時はいろいろ書いてみるもの

```python:00knock.py
s="stressed"
print(s[::-1])
print(s[2::-1])
print(s[::-2])
print(s[3:2:-2])
print(s[4:1:-2])
print(s[5:1:-2])
```
出力結果

```python:00knock.py
desserts
rts
dset
e
sr
se
```
やっとわかってきました。print(::)はprint(はじまり:終了:増分)を表していて始まりは0から！終了の番号の文字は出力されないってことみたいです
flow 0.63でsetTimeoutとsetIntervalでエラーが起きる場合

型定義が更新されて戻り値をnumberにしている場合型エラー起きます。

```js
const hoge: number = setTimeout(() => {}, 300)
```

[Try Flow | Flow](https://flow.org/try/#0PQKgBAAgZgNg9gdzCYAoVBjOA7AzgFzAAs4BzAUwC4xsBXAWwCNyAnMAXjF3PwBUBLeuTi18ACjEBKDgD4wAbwC+AGjABmAAwbJmHATBQ4cagKEj8ASQAiHLj1PDRE6ezlLVm7QG5deQowBDFmoLbHxWADcAmGtbbkswyOjnWQUVdS1JLyA)

`TimeoutID`や`IntervalID`がGlobalで定義されているのでそれを使うように更新します

```js
const foo: TimeoutID = setTimeout(() => {}, 300);
const bar: IntervalID = setInterval(() => {}, 300);
```

まあ、普通に推論でいいと思います。自分の場合は`Map`のキーとして使っていたので`number`からの変更が必要でした。

```js
const foo = setTimeout(() => {}, 300);
```

## 雑記

この変更のおかげで、`clearInterval`を`clearTimeout`と間違えて使っているのに型レベルで気づけました。`opaque type`便利です。

## 参照

[0.63.x regression: setTimeout() & setInterval() return types broken · Issue #5627 · facebook/flow](https://github.com/facebook/flow/issues/5627)
intra-mart実践入門の作成記録  #001 執筆環境作成開始

# 執筆環境作成開始
## 前提
　[前回の記事](https://qiita.com/hiroaki-kushida/items/9d0bcf25aefe73b8313e)で「[Re:VIEW](http://reviewml.org/ja/)を使って執筆する」と書いたのですが、実際に触ったことがありませんのでまずは執筆環境を作成するところから始める必要がありました。調べてみたところ、[PDF](https://ja.wikipedia.org/wiki/Portable_Document_Format)への変換をするためには[LaTeX](https://ja.wikipedia.org/wiki/LaTeX)も必要になるとのことです。

## Hello World!
　下記の記事を参考に[CentOS 7 minimal](http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1708.iso)で導入手順を確認してみました。

* [Rubyを最新ソースからインストール](https://centos.bungu-do.jp/archives/34)
* [参考メモ/CentOS7に TeX Live 2016 をインストールして簡単な動作確認をする](https://qiita.com/msakamoto_sf/items/78c322cb8656615ce134)
* [Re:VIEWクイックスタートガイド](https://github.com/kmuto/review/blob/master/doc/quickstart.ja.md)

　導入から[PDF](https://ja.wikipedia.org/wiki/Portable_Document_Format)変換までの流れをシェルスクリプト風[^1]に書くと以下のようになります。

```shell:review.sh
# 最低限のセキュリティアップデート
yum -y update
# 最低限のユーティリティ
yum -y install wget zip unzip

# rubyインストール
# 最新は2.5だが過去スクリプトを流用
cd /usrocal/src
wget http://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.gz
yum -y install openssl zlib gcc make zlib-devel openssl-devel
tar zxvf ruby-2.4.1.tar.gz
cd ruby-2.4.1
./configure --prefix=/usr/local/ruby
make
make install
echo "export PATH=/usr/local/ruby/bin:$PATH" >> /etc/profile
source /etc/profile

# Re:VIEWのインストール
cd ~/
gem install review

# perlのインストール
yum -y install perl-Digest-MD5

# TeX Live 2017のインストール
# ものすごく時間がかかるので何か工夫が必要
cd ~/
wget http://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz
tar xvf install-tl-unx.tar.gz
cd install-tl-20180108/
perl install-tl
echo "export INFOPATH=/usr/local/texlive/2017/texmf-dist/doc/info:$INFOPATH" >> /etc/profile
echo "export MANPATH=/usr/local/texlive/2017/texmf-dist/doc/man:$MANPATH" >> /etc/profile
echo "export PATH=/usr/local/texlive/2017/bin/x86_64-linux:$PATH" >> /etc/profile
source /etc/profile

# TeX Liveの更新
tlmgr update --self
tlmgr update --all

# サンプルプロジェクトの作成とPDF変換
cd ~
review-init hello
cd hello/
rake pdf
```

## 雑感
　[TeX Live 2017](https://www.tug.org/texlive/)のインストールに非常に時間がかかるため、このままでは気軽に試せるとは言えません。[AlpineでLaTeXのコンテナイメージを作成している人](http://3846masa.hatenablog.jp/entry/2017/02/08/215920 "日本語が扱える alpine の LaTeX イメージを作った話")を見つけたので、これをヒントにして改良してみようと思います。

[^1]: このまま実行しても「perl install-tl」で入力待ちになるので使えません。
knitr to PDFでの複雑なテーブル（書体を変更する）

Rstudio Cloudのリンクは[こちら](https://rstudio.cloud/project/9036)です。

rmakrdownとkableを使ってテーブルをかいてたところ、複雑なテーブルを書く際にkableExtraというパッケージがとても有用だということがわかったのでメモ。

書体を変更できるようにした。

```
library(knitr)
library(kableExtra)

#Motor Trend Car Road Tests in datasets package is loaded.
dt <- mtcars[1:5, 1:4]

# LaTeX Table
kable(dt, format = "latex", booktabs = T, caption = "Demo Table") %>%
  kable_styling(latex_options = c("striped", "hold_position"),
                full_width = F) %>%
  add_header_above(c(" ", "Group 1" = 2, "Group 2[note]" = 2)) %>%
  add_footnote(c("table footnote"))
```

<img width="307" alt="Untitled.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/224794/0ac5f31f-09fc-698f-1217-646fa187120f.jpeg">

タイトルとフッターの書体を変更

```

 # LaTeX Table
kable(dt, format = "latex", booktabs = T, caption = "\\em{Demo} \\textnormal{Table}", escape =FALSE) %>%
  kable_styling(latex_options = c("striped", "hold_position"),
                full_width = F) %>%
  add_header_above(c(" ", "Group 1" = 2, "Group 2[note]" = 2)) %>%
  add_footnote(c("\\textsc{table} \\textbf{footnote}"), escape=FALSE)

```

<img width="287" alt="Untitled.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/224794/fe4d9376-e239-9f7b-01f5-6d84fda4b560.jpeg">


行・列名の書体を変更

```
# LaTeX Table
colnames(dt)[1] <- "\\textit{mpg}"
colnames(dt)[2] <- "\\textbf{cyl}"
colnames(dt)[3] <- "\\texttt{disp}"
colnames(dt)[4] <- "\\textrm{hp}"

rownames(dt)[1] <- "\\textit{Mazda RX4}"
rownames(dt)[2] <- "\\textbf{Mazda RX4 Wag}"
rownames(dt)[3] <- "\\texttt{Datsun 710}"
rownames(dt)[4] <- "\\textrm{Hornet 4 Drive}"
rownames(dt)[5] <- "\\textsc{Hornet Sportabout}"


kable(dt, format = "latex", booktabs = T, caption = "\\em{Demo} \\textnormal{Table}", escape =FALSE) %>%
  kable_styling(latex_options = c("striped", "hold_position"),
                full_width = F) %>%
  add_header_above(c(" ", "Group 1" = 2, "Group 2[note]" = 2)) %>%
  add_footnote(c("\\textsc{table} \\textbf{footnote}"), escape=FALSE)

```
<img width="324" alt="Untitled.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/224794/9f073e89-63f9-fa5b-ccc3-16a3de8005d3.jpeg">
MySQLでロックされた行をスキップする

# 実現したいこと

`SELECT` する時に他のトランザクションでロックされている行をスキップしたい。

つまり、あるスレッドのトランザクション中にテーブル内の複数行をロックしたら、他のスレッドのトランザクションではロックの終了を待たずに、その行を除いた範囲から `SELECT` したい。

# データベースの機能

## Oracle

Oracle は `SKIP LOCKED` でロックされた行をスキップする。
[SELECT FOR UPDATE - オラクル・Oracle SQL 入門](https://www.shift-the-oracle.com/sql/select-for-update.html)

## PostgreSQL

PostgreSQL は `SKIP LOCKED` でロックされた行をスキップする。2016年1月リリースの PostgreSQL 9.5 から利用可能。
[PostgreSQLのSKIP LOCKEDを使ってテーブルをキューとして使用する - Enjoy*Study](http://blog.enjoyxstudy.com/entry/2017/09/10/000000)

## SQL Server

SQL Server は `READPAST` でロックされた行をスキップする。
[排他制御メカニズムから“待ち”原因を究明する：Dr. K’s SQL Serverチューニング研修（4） - ＠IT](http://www.atmarkit.co.jp/ait/articles/0605/30/news091_2.html)

## DB2

DB2 は `SKIP LOCKED DATA` でロックされた行をスキップする。
[不完全な結果を許容するアプリケーションの並行性の改善 IBM Knowledge Center](https://www.ibm.com/support/knowledgecenter/ja/SSEPEK_10.0.0/perf/src/tpc/db2z_useskiplockeddata.html)

## MySQL

さて、MySQLは・・・、おや・・・無い。
`SELECT FOR UPDATE` も、`SELECT LOCK IN SHARE MODE` も、どのレベルのロックを掛けるかの制御であって、「ロックされた行をスキップする」という機能は無い。

ロック用のカラム作って検索で頑張る方向らしい。
[FOR UPDATE SKIP LOCKED - Oracle to MySQL Migration - SQLines Open Source Tools](http://www.sqlines.com/oracle-to-mysql/skip_locked)

MySQL8.0.1 から、`SKIP LOCKED` が使えるようになる。
[MySQL 8.0.1: Using SKIP LOCKED and NOWAIT to handle hot rows | MySQL Server Blog](https://mysqlserverteam.com/mysql-8-0-1-using-skip-locked-and-nowait-to-handle-hot-rows/)

以上。
aws kms コマンドでの暗号化文字列の作り方

# TL;DR

LambdaからS3へアクセスする場合 CredentialをLambdaに持たせる必要があるわけですが、CloudFormation でLambdaを作ってCodePipelineでリリースしている場合 CredentialをConsoleにて登録することができません。

他の方法としては CredentialをLambdaのコードないし設定ファイルに直接記載することが出来ます。しかしそんな機密情報をバージョン管理システムにそのまま入れたくありません。Lambdaには暗号化した文字列を環境変数経由で復号して渡す仕組みがありますのでこれに乗ろうと思います。そのためには、Credentialを暗号化してSAMファイルに保存する必要があります。

そこで、AWS CLIで暗号化文字列を作る手順を書いてみました。確認の便宜のため暗号化して復号する手順にしてみました。

# 手順

例として、　`plaintextabcd1234` という文字列を暗号化したいとします。
環境はWindows7とします。


```
>aws kms encrypt --key-id ＜＜あなたのアカウントで使える暗号化キーのid＞＞ --plaintext plaintextabcd1234 --query CiphertextBlob --output text  > cipherbase64

>certUtil -f -decode cipherbase64 cipherbin
入力長 = 206
出力長 = 152
CertUtil: -decode コマンドは正常に完了しました。

>aws kms decrypt --ciphertext-blob fileb://cipherbin --query Plaintext --output text > plainbase64

>certUtil -f -decode plainbase64 plain
入力長 = 26
出力長 = 17
CertUtil: -decode コマンドは正常に完了しました。

>type plain
plaintextabcd1234
```
コマンド実行毎の解説

1. 暗号化してBASE64エンコーディングされた文字列を`cipherbase64`というファイルに出力
2. `cipherbase64`をデコードし、`cipherbin`　に出力。中身はバイナリファイル。
3. `cipherbin`　を復号し、BASE64エンコーディングされた文字列を　`plainbase64`　というファイルに出力
4. `plainbase64`をデコードし、`plain` というファイルに出力
5. `plain`を出力し内容を確認できる。　内容は　`plaintextabcd1234`　である。

SAMファイルでの環境変数の設定には、`cipherbase64`の中身を設定すれば良い。


# 感想

暗号化するときはキーを指定するのですが、復号のときは不要です。この仕組みは追って調べたいかなと。（使えるキーを総当りしているのか、暗号化文字列から暗号化したキーのIDを割り出せるようになっているのか。）

この手順では中間的なファイルが４個もあるので試しに内容確認してみると良いと思います。
Monaca~概要（メモ）~

個人用メモ

# Monacaとは
【HTML＋CSS＋JavaScript】を使用してモバイルアプリ（ハイブリッドモバイルアプリ）を作成できるクラウド上での開発環境のことである。

##仕組み
Monacaで作成したアプリはiOSやAndroidでWebアプリとして動作する。
iOSやAndroidにはアプリ上にWebページを表示する機能（WebView）があり、それを利用して動作している。

##メリット
1. 面倒な開発環境のインストールや設定等の手間がいらない
2. iOSとAndroid用に作り分ける必要ない

##デメリット
1. Webアプリのため動作スピードが遅い
2. デバイス（ハード）側の機能にフレームワークが対応しているかどうか確認する必要がある
3. バグが発生した際に、原因の追究が突き止めづらい

##フレームワーク
####[Onsen UI](https://ja.onsen.io/)
モバイルアプリの開発に特化したオープンソースのUIコンポーネント
iOSとAndroidのデザインガイドに準拠したデザインと機能を要している
####[Cordovaフレームワーク](https://cordova.apache.org/)
HTML5でiOSとAndroid向けのモバイルアプリを作成できるオープンソースのフレームワーク
####[AngularJS](https://angularjs.org/)
グーグルが提供しているJavaScriptフレームワーク

##まとめ
Onsen UIやAngularJSを利用して簡単にWebアプリを作成する事が出来る。
Cordovaを利用してネイティブアプリとしてコンパイルをするとでハイブリットアプリ（なんちゃってアプリ）が完成する。
そんなことができるのが・・・Monacaってこと。

##参考にしたサイト
[Onsen UI＋AngularJSで効率的にモバイルアプリが作れるMonaca](http://www.buildinsider.net/mobile/monaca/01)
[Monacaについての事前学習](https://qiita.com/matsui-a/items/9faa4b9e3a418ddfc06e)
[HTML5ハイブリッドアプリ開発を支えるOSS「Cordova」はなぜアツいのか？PhoneGapとの違いは何か？](http://furoshiki.hatenadiary.jp/entry/2014/07/23/084643)
Vmware ESXi 製品パッチをあてる手順

[VMWare ESXi を 5.5 から 6.5 にCDを使わずアップデートする - Qiita](https://qiita.com/metalels/items/ae425053c459c4516d87)

など、ESXiのメジャー or マイナーバージョンアップはいろんな所で見かけるけど、細かいパッチをあてる手順が埋もれていて見つかりづらかったのでメモ

## 現在のバージョン情報の確認

`esxcli software profile get`を実行してName部分を確認する。

```bash
[root@localhost:~] esxcli software profile get                                                                                                                                                                                                                                  (Updated) ESXi-6.5.0-20170702001-standard
   Name: (Updated) ESXi-6.5.0-20170702001-standard
   Vendor: VMware, Inc.
   Creation Time: 2017-10-06T06:56:42
   Modification Time: 2017-10-06T06:56:42
   Stateless Ready: True
   Description:

      2017-10-06T06:56:42.495208+00:00: The following VIBs are
      installed:
        net-ixgbe     4.5.2-1OEM.600.0.0.2494585
      ----------
      For more information, see http://kb.vmware.com/kb/2149931.

   VIBs: ata-libata-92 3.00.9.2-16vmw.650.0.0.4564106,

```

## 最新のパッチ情報を確認

公式サイトを見て、同じメジャー・マイナーバージョンでより大きなBuild　Numberが存在しないか確認。（バージョンアップは手順が違うので）

https://my.vmware.com/group/vmware/patch#search

## ダウンロード

上記サイトからダウンロードし、それをESXiのデータストア上に配置する。
私は`/datastore1`に`update`フォルダを作成しその中に突っ込みました。

## プロファイル（あてるパッチの集まり）の確認

細かくはわからないのですが、実際のパッチをあてる時に細かくプロファイルを指定してあげる必要があるため、ダウンロードしたファイル中にあるプロファイルを`excli software sources profile list -d ダウンロードしたファイル`で拾ってきます

```bash
[root@localhost:~] esxcli software sources profile list -d /vmfs/volumes/datastore1/update/ESXi650-201712001.zip
Name                              Vendor        Acceptance Level  Creation Time        Modification Time
--------------------------------  ------------  ----------------  -------------------  -------------------
ESXi-6.5.0-20171204001-no-tools   VMware, Inc.  PartnerSupported  2017-12-18T11:40:25  2017-12-18T11:40:25
ESXi-6.5.0-20171204001-standard   VMware, Inc.  PartnerSupported  2017-12-18T11:40:25  2017-12-18T11:40:25
ESXi-6.5.0-20171201001s-standard  VMware, Inc.  PartnerSupported  2017-12-18T11:40:25  2017-12-18T11:40:25
ESXi-6.5.0-20171201001s-no-tools  VMware, Inc.  PartnerSupported  2017-12-18T11:40:25  2017-12-18T11:40:25
```

## パッチをあてる

以下の通り`esxcli software profile update -d ダウンロードしたファイルの場所 -p 上記で調べたプロファイルのどれか`を実行します

```bash
[root@localhost:~] esxcli software profile update -d /vmfs/volumes/datastore1/update/ESXi650-201712001.zip -p ESXi-6.5.0-20171204001-standard
Update Result
   Message: The update completed successfully, but the system needs to be rebooted for the changes to be effective.
   Reboot Required: true
   VIBs Installed: VMW_bootbank_igbn_0.1.0.0-15vmw.650.1.36.7388607, VMW_bootbank_misc-drivers_6.5.0-1.36.7388607, VMW_bootbank_ntg3_4.1.3.0-1vmw.650.1.36.7388607, VMW_bootbank_nvme_1.2.0.32-5vmw.650.1.36.7388607, VMW_bootbank_nvmxnet3_2.0.0.23-1vmw.650.1.36.7388607, VMW_
bootbank_vmkata_0.1- 以下省略
```

終わったらリブートしてねってメッセージがでるので、後はリブートして完了です
CSSで縦の棒グラフ（罫線付き）をつくる


罫線付きのグラフをCSSだけで作ってみた。

![Screen Shot 2018-01-09 at 18.15.05.png](https://qiita-image-store.s3.amazonaws.com/0/109241/629baf31-1664-2fab-6c98-8ff2f84b1f28.png "Screen Shot 2018-01-09 at 18.15.05.png")

# HTML

```html
<div class="container">
  <div class="label-vertical">
    <div class="label">（人数）</div>
    <div class="label">1000</div>
    <div class="label">900</div>
    <div class="label">800</div>
    <div class="label">700</div>
    <div class="label">600</div>
    <div class="label">500</div>
    <div class="label">400</div>
    <div class="label">300</div>
    <div class="label">200</div>
    <div class="label">100</div>
    <div class="label">0</div>  
  </div>
  <div class="inner">
    <div class="graph">
      <hr style="top: 26px;">
      <hr style="top: 52px;">
      <hr style="top: 78px;">
      <hr style="top: 104px;">
      <hr style="top: 130px;">
      <hr style="top: 156px;">
      <hr style="top: 182px;">
      <hr style="top: 208px;">
      <hr style="top: 234px;">
      <hr style="top: 260px;">
      <hr style="top: 286px;">
      <div class="bar" style="height: 165px; margin-top: 122px;"></div>
      <div class="bar" style="height: 82px; margin-top: 203px;"></div>
      <div class="bar" style="height: 200px; margin-top: 87px;"></div>
      <div class="bar" style="height: 166px; margin-top: 121px;"></div>
    </div>
    <div class="label-horizontal">
      <div class="label">10代</div>
      <div class="label">20代</div>
      <div class="label">30代</div>
      <div class="label">40代</div>
      <div class="label">50代</div>
      <div class="label">60代</div>
      <div class="label">70代</div>
      <div class="label">80代</div>
    </div>
  </div>
  
</div>
```

# CSS

```css
.container {
  display: flex;
}
.label-vertical .label{
  font-size: 12px;
  line-height: 26px;
  text-align: right;
  padding-right: 10px;
}
.graph {
  height: 287px;
  width: 678px;
  border: 1px solid #F0F0F0;
  position: relative;
  margin-top: 13px;
}
.graph .bar:first-of-type {
  margin-left: 29px;
}
.bar {
  float: left;
  text-align: center;
  position: relative;
  margin-left: 60px;
  width: 25px;
  background-color: #006400;
}
hr {
  border: none;
  position: absolute;
  width: 100%;
  height: 1px;
  margin: 0 auto;
  background: #F0F0F0;
}
.label-horizontal {
  display: flex;
}
.label-horizontal .label{
  font-size: 12px;
  margin-left: 60px;  
  width: 25px;
  text-align: center;
  padding-top: 6px;
}
.label-horizontal .label:first-of-type{
  margin-left: 29px;  
}

```

## CodePen

<p data-height="500" data-theme-id="light" data-slug-hash="QaQNby" data-default-tab="html,result" data-user="sshono1210" data-embed-version="2" data-pen-title="棒グラフ - 縦" data-preview="true" class="codepen">See the Pen <a href="https://codepen.io/sshono1210/pen/QaQNby/">棒グラフ - 縦</a> by Shiori SHONO (<a href="https://codepen.io/sshono1210">@sshono1210</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://production-assets.codepen.io/assets/embed/ei.js"></script>

# 修正したい点

- floatを使ってるところ
- 直接styleタグを使ってるところ

をやめたい

# 参考

http://shinji.ti-da.net/e7474584.html
gccのコマンドラインオプションに対するエラーメッセージが親切になっていて驚いた

Tweetしたら意外にうけたので、ここにも書いておこう。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">今までgcc 4.9 を使っていたのだけど、最新のgcc 7.2 をちょっと触ってみたら、コンパイルエラーのメッセージがあまりに親切になっていて驚いた！まるで別人のようだ。</p>&mdash; 組み込みの人。 (@tetsu_koba) <a href="https://twitter.com/tetsu_koba/status/950613331022290944?ref_src=twsrc%5Etfw">2018年1月9日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">-mfpu=vfp4-sp-d16とFPU名をタイプミスしたら、設定可能なFPU名が全て表示されただけでなくて、さらに did you mean ‘fpv4-sp-d16’? と出た。素晴らしすぎる。</p>&mdash; 組み込みの人。 (@tetsu_koba) <a href="https://twitter.com/tetsu_koba/status/950613982779289600?ref_src=twsrc%5Etfw">2018年1月9日</a></blockquote>

<blockquote class="twitter-tweet" data-conversation="none" data-lang="ja"><p lang="ja" dir="ltr">gccのエラーメッセージが親切になっていることは知っていたが、コマンドラインオプションの誤りにもこんなに親切にしてくれるとは。</p>&mdash; 組み込みの人。 (@tetsu_koba) <a href="https://twitter.com/tetsu_koba/status/950614616110804992?ref_src=twsrc%5Etfw">2018年1月9日</a></blockquote>

実際に出るのはこんな感じ。

> arm-eabi-gcc -c -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=vfpv4-sp-d16 f2.c
arm-eabi-gcc: error: unrecognized argument in option ‘-mfpu=vfpv4-sp-d16’
arm-eabi-gcc: note: valid arguments to ‘-mfpu=’ are: auto crypto-neon-fp-armv8 fp-armv8 fpv4-sp-d16 fpv5-d16 fpv5-sp-d16 neon neon-fp-armv8 neon-fp16 neon-vfpv3 neon-vfpv4 vfp vfp3 vfpv2 vfpv3 vfpv3-d16 vfpv3-d16-fp16 vfpv3-fp16 vfpv3xd vfpv3xd-fp16 vfpv4 vfpv4-d16; did you mean ‘fpv4-sp-d16’?

#参考

[gcc 7.2.0 をソースからビルドする](https://qiita.com/tetsu_koba/items/efd62c24406a89addba9)
勉強会に参加する時の心得

# 勉強会に参加するエンジニアとして
私も何度かLTやって、マサカリを投げたり（すみませんでした…）投げられたリしたものです。
そのたびに、そうでなくても勉強会やコミュニティ自体の勉強会について議論をしていたものですが、運営者がどれだけ頑張っても参加者については運もありますから、改善するべきは参加側ではないのか？というのが私の意見です。

そもそも登録はするけど参加率が1/3ぐらいしかないとか、本命のイベントの滑り止めのためにとりあえずいれておく、とかいうイベントジャンキーがいた時期もありまして。
昨今は当日補充ができないようなシステムになってしまったので結構窮屈に感じています…。

## 筆者プロフィール
- フロントエンド・アプリサーバーエンジニア、だった。最近はインフラばっかり
- 勉強会は気付いたらいっぱい参加してました。土日含めすべて勉強会に突っ込むことも
- adiaryで勉強会の記事をシェアしましょう！ってコミュニティやってます。
- WebAPIの話ばっかりしてますが、最近はいち鯖缶に。
- エンジニアだけど非エンジニアのための話ばかりしてます。

こういう人間が考えていることで、全てが正しいことだと思ってませんが、ある程度「参加者」としてこうして欲しいなぁ、というお願いみたいなのを書き並べる事にしました。

# 資料
この資料は、私も敬愛するナイスミドルが真面目に提唱されていた内容です。

[Ssmjp170127 kawakita](https://www.slideshare.net/woyadi28mamedeka/slideshelf)

会場でしか話せないネタもいっぱいあったので、私もなるべく話せるように噛み砕きつつ、やっぱ全部は話せないので、ぜひ勉強会に参加して、肌で感じてほしいなぁ、と思います。

# 質問へのお願い
**マサカリ禁止**

- LTで話してるのはエラい人ではなくて、触ってみた感じの話を昨日今日でちょっとまとめただけの人もいるんです。私とか。
- LTやるよ！と言ってくれる人はコミュニティでも結構稀少なので、どんな内容でも発表した、という姿勢を評価していくべきです。
- LTやる人はメンタルが強いわけでは**ありません。**

# 参加でのお願い
別に手を上げさせたり、何かを答えさせたりとかはしないんで、前の方の席が空いてるなら詰めてほしいです。
これは到着が遅くなった人がスムーズに着席するためでもあります。
特に開会後に参加する人にとってはホントにつらいです。
居たたまれないし、そりゃー当日ドタキャンしたくもなりますよ。なるべくしないように心がけてはいますが、業務都合で退勤が遅くなっちゃう、なんてやむを得ない事情だってあるんです。
そういう人たちに割を食わせるのはどうなのかな、と私は思ってます。

# フィードバックのお願い
あなたが今回、つまらないとか物足りないとか難しすぎるとか何言ってるか分からない、とかもっと聞きたい、話したいなど感じたのであれば、そのまま伝えてくれるとコミュニティがより良くなります。
**出来ればぶっちゃけトークで、言いにくい内容の方がありがたいです。**
成熟したコミュニティなら誰が言ったとか、気にするかもですが多くのコミュニティの場合、誰の意見だからとか気にしてないです。そういう声があった、という事実だけを意識してます。

# 主催の方に、お願いとか提案とか
**質問は直接言ってこない**事が多いです。
質問タイムを設けたとして、自分の質問のレベルが発表内容にそぐわないのでは？とかそもそも個人を特定される方法で質問しにくい、あるいは思ったことをタイムリーに言えないからですね。
これを解決するためにTwitterなりにハッシュタグをつけてもらって意見交換をしてもらうようにするのは大事です。
そのうえで、ハッシュタグをしっかりと機能させることが大事です。
イベントの前日や可能であれば募集の段階で活用していく取り組みを考えていくのも手かと思います。

これをやってもらうと、後でブログを書く時の振り返りになるので、記事を書きやすくなります。
書記（ブログ枠）を設定するなら、こういう面もあるのでぜひ積極的に活用しやすい環境を作ってもらえればと思います。
サーバーを再起動する前に確認すべきこと（備忘録）

本番でアレがない！これが出来ない！という前に、転ばぬ先の杖。
とりあえず私が認識している範囲で書いているが、漏れてる事がいっぱいありそうだな…と思いつつ。
これからサーバーをさわる人の一助になれば幸い。

Linuxベースでまとめたが、WindowsでもMacでもサーバーはサーバー。適宜読み替えと対応が必要な場合がある。

# su,sudo権限の有無
何も考えずにsu -、あるいはsudo su -。
これが出来ないとshutdown系のコマンド自体が成功しないので絶対に確認しておくこと。

# sshなど
ログイン自体が出来るかどうか。
パスワードが間違っている場合もある。

# システムを起動する順番、終了する順番
裏側でどんなものが動いてるか知る事はとても重要。
上記sshなどに関係するが、どこから接続されているのかはきちんと把握すること。
最近はインフラ側を気にしなくて良い事も増えたけど、アプリ側を吸収している場合はこの限りではない。

# 事前に手順書をもらっている場合
本番実施時に手順書を見る場合が普通なのでネットワークが試験・検証環境用のものだったりすると読み替えが発生して混乱を招く。
ファイルを分けるか項目で管理するなど、工夫をした方が良い。

なお、手順書は当時の時点で正しいのであって、現状保守されているとは限らないので、一度だけでもシステムを落とす前のギリギリまで手順通り実施することが大事。

# ファイルを変更する可能性のあるディレクトリ以下でtouch
sudoが使えるならchownなりchmodなりで押し通せる。
が、ユーザーにsudo権限があるのか、あるいは手順でsudoを実施してよいのか、その辺りはキッチリ確認すべき。
sudo初回実行時のありがたいお言葉を添えておく。

``` sudo
あなたはシステム管理者から通常の講習を受けたはずです。
これは通常、以下の3点に要約されます：

    #1) 他人のプライバシーを尊重すること。
    #2) タイプする前には考える事。
    #3) 大いなる力には大いなる責任が伴うこと。
```

# /etc.init.d/xxx status
あるいは、server xxx statusなど。この辺りのコマンドが使えない！なんて事も結構ある。
特にsudo権限やユーザー権限など細かい注文があることも。

# which xxx
手順書には書いてるけどコマンドを叩いてみると失敗する場合は大体パスが通ってない。
あるいは、コマンドのバージョンが一致しないという事もあるので、この辺りは要注意。
（ほとんどの手順書でコマンドのバージョンが書いてない。たとえばruby,pythonなど）

# プリインストールされていないコマンドが手順書に書いてある
teeとかsortとかrevとか、便利だけど環境によってはインストールできないコマンドもあるので、検証・試験環境と本番環境が違う場合は特に注意すること。
実行が出来ない分、上記の読み替えれば何とかなる系のコマンドより質が悪い。

# 再起動をすると環境が変わるもの
ipconfigとか/tmp以下など、またこれらに類するもの。
変な話だが、/tmpですらバックアップをどこかに持っておいたほうが良いかもしれない。
（本来は当然、そういう使い方をしないで下さいとお願いするか、消えても文句を言わないような運用を心掛けたい）
筆者はmapr環境構築時にこれがあって大変な事になった。

# 最終手段
内容を正しく把握している方の緊急連絡先や体制図を把握しておこう。
何かあったら即電話した方が結果的に被害が少ない事が多い。
macOS High Sierra で "__NSPlaceholderDictionary initialize" エラー

# 概要

[`rugged`](https://github.com/libgit2/rugged) という gem を使っていたところ、次のようなエラーに出くわしました。

```
objc[81924]: +[__NSPlaceholderDictionary initialize] may have been in progress in another thread when fork() was called. We cannot safely call it or ignore it in the fork() child process. Crashing instead. Set a breakpoint on objc_initializeAfterForkError to debug.
```

原因は `rugged` ではなく、 macOS High Sierra での `fork(2)` システムコールにありました。

# 環境

- Ruby 2.4.3
 
```shell-session
$ ruby -v
ruby 2.4.3p205 (2017-12-14 revision 61247) [x86_64-darwin17]
```

- macOS High Sierra 10.13.2

```shell-session
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.13.2
BuildVersion:	17C205
```

# ワークアラウンド

とりあえず、環境変数 `OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES` を指定すると、回避できました。

```sh
OBJC_DISABLE_INITIALIZE_FORK_SAFETY=YES bin/rails s
```

Ruby trunk にはパッチが取り込まれているようです。

*Bug #14009: macOS High Sierra and “fork” compatibility - Ruby trunk - Ruby Issue Tracking System*
https://bugs.ruby-lang.org/issues/14009

# 参考サイト

*Why Ruby app servers break on macOS High Sierra and what can be done about it*
https://blog.phusion.nl/2017/10/13/why-ruby-app-servers-break-on-macos-high-sierra-and-what-can-be-done-about-it/

*macOS High Sierra で ruby-ldap を使った Rails アプリがコケるようになった（解決） - Qiita*
https://qiita.com/bsdmad/items/6197583febb078869a49

*MacOS High Sierra Apache, Case-insensitive FS causes fork() sanitizer crash. · Issue #1986 · phusion/passenger*
https://github.com/phusion/passenger/issues/1986

*Interoperability issues with dependencies using Objective-C in Cluster Mode on macOS 10.13 High Sierra · Issue #1421 · puma/puma*
https://github.com/puma/puma/issues/1421
After Effects の 3D レイヤーと OpenGL 

#パースペクティブ、射影変換のはなし

なぜか GLU が使えなかったので glFrustum 関数を使うことに。

AE のデフォルトカメラでは幅 1920 の場合、画角が 39.5980 度らしい。
これを踏まえると、カメラからスクリーンまでは2666ぐらいらしい。
※単位は不明だが気にしないことにする。

glFrustum 関数 は以下の引数がある

```c
void glFrustum(
	GLdouble left , GLdouble right ,
	GLdouble bottom , GLdouble top ,
	GLdouble znear , GLdouble zfar     
);
```
zfar は何でもいいけど、大きすぎると荒くなりそうなので 10000 ぐらいにした。

left, right, bottom, top は znear における指定らしいので、
znear を自分で決めた上で計算する必要がある。0 はだめ。なにも出ない。

AE のデフォルトカメラは中心にあるので 幅、高さの半分で
left と bottom がマイナスにした値、right と top はそのままの値になる。

先出の条件の場合、幅 1920 で、2666 ぐらいらしいので znear を26 としたらそれぞれ 100 で
割ればそれっぽい表示になる。たぶん
タンジェントとアスペクト比を計算した方が正確なのかな。それをしてくれるのが GLU のgluPerspective 関数だと思う。

#おまけ
回転は Xをマイナスにして、XYZ の順でした。見た目あわせなので根拠はありません。環境によると思います。
ppa:ondrej/php でインストールしたPHPの設定を変更するメモ書き

ローカルホストで立ち上げている Ubuntu で「最大許容サイズ2MBを超えるため...」エラーが出たので、 `php.ini` を変更したかったのだけど、変更方法が　[Wiki -- oerdnj/deb.sury.org](https://github.com/oerdnj/deb.sury.org/wiki) を読んでもわからなかったのでメモ書き。

標準の `upload_max_filesize` が 2M なんだよ…orz

使用PHPは `7.1`, memory周りの設定だけを変更する。

## 1. 設定ファイルを設置

```/etc/php/7.1/mods-available/memory.ini
post_max_size = 80M
upload_max_filesize = 30M
```

## 2. 設定を反映

```
$ sudo phpenmod memory
```

Cli の PHP と PHP-FPM の設定が別れているので、このコマンドを使わないといけない。

## 3. PHP-FPM の再起動

`$ sudo service php7.1-fpm restart`

## 4. 設定を無効化

読み込ませた設定を無効化するには下記のコマンド。

```
$ sudo phpdismod memory
```
もっと簡単で高速に一意なデータの判別がしたい

結構簡単に出来るみたいです。
当初は素直にlist作ってその中にtargetが存在するかチェックするループを使って…としていたんですが、数によってはめちゃくちゃ重くなるforを実行してしまいます。
これがイケてないなぁ、と思った時はこういう書き方にすると速くなるようです。

``` 重複除外.py 
def uniq(target):
    if cache.has_key(target) == False:
        cache[target] = target
        return False
    else:
        return True

cache = {}
for target in (hoge, fuga...):
   if uniq(target) == True:
       print '登録済み'
   else:
       print '登録しました'
```

私の環境では改善されたんですが、ケースバイケースの面はあるかも知れません。

# 2018/02/10 追記
<a href="https://qiita.com/nomurasan/items/a53faad2d3ad566f9b69#comment-280a52d8e401369f0d30">とてもステキなコメント</a>をいただきました！
私がまだ検証出来ていないので記事にうまく反映させられないため、ご紹介に留めます。
AngularでWAI-ARIA対応のタブ型UIを実装する方法

この記事は、大幅に加筆して「[WAI\-ARIA対応のタブ型UIの作り方（Angular編） \- ICS MEDIA](https://ics.media/entry/17108/)」に引っ越しました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/2544/017bf079-6472-3ec4-5087-077bcf351c7e.png)


※検索でたどってきた方がリンク切れでは申し訳ないので、Qiitaでも残しておきます。
MyBatis備忘録

MyBatisの備忘録を記載していく。

##### IF文

```xml
<if test="(author != null and author.name != '') or authorList.size() > 0">
</if>
```

##### IN句

```xml
column in
<foreach item="sample" open="(" close=")" collection="sampleList" separator=",">
  #{sample}
</foreach>
```

##### 不等号記号「＜」を使う場合

```xml
<![CDATA[
  column <= #{parameter}
]]>
```

##### パラメータをDATE型としてバインドする場合

```xml
column = #{parameter,jdbcType=DATE}
```

##### include

```xml
<sql id="sample">
  column = True
<sql>

<select id="xxxxx" resultType="string">
  select column from table where <include refid="sample" />
</select>
```

##### resultType

結果がListの場合、resultTypeはListの中身の型を指定する。
List\<String>型で取得したい場合は、resultType="string"と記述する。

##### Bulk Insert

```xml
<insert id="xxxxx" parameterType="java.util.List">
  insert into table(column, ・・・) values
  <foreach collection="list" item="item" separator=",">
  ( #{item.propertyName}, #{item.propertyName}, ・・・ )
  </foreach>
</insert> 
```

##### Bulk Update

```xml
<update id="xxxxx" parameterType="java.util.List">
  <foreach collection="list" item="item" separator=";">
  update table set column = #{item.propertyName} where column = #{item.propertyName}
  </foreach>
</update> 
```

##### jdbcType

|jdbcType  |java       |
|:---------|:----------|
|VARCHAR   |String     |
|INTEGER   |int        |
|NUMERIC   |BigDecimal |
|BIT       |boolean    |
|DATE      |Date       |
|TIMESTAMP |Date       |

##### エイリアス

"java.lang.String"を"string"と表記できる。
http://www.mybatis.org/mybatis-3/ja/configuration.html#typeAliases

##### javaのMapperインタフェースのパラメータの指定の仕方

```java
void select(
        @Param("param1") String param1,
        @Param("param2") List<String> param2);
```

Mapper XMLの方は、parameterType="map"と記述する。

##### 検索条件(Criteria)の作り方

```java
TableExample example = new TableExample();
example.createCriteria()
        .andColumnEqualTo(value)
        .andColumnEqualTo(value);

example.setOrderByClause("column DESC, column ASC");
```
スマートコントラクト開発で知っておくべきことのメモ（ethereum7）


前回はこちら。[スマートコントラクト開発でHello Worldをする](http://qiita.com/joji/items/844fa6168f7780ebfebd "スマートコントラクト開発でHello Worldをする")

###開発環境について

Browser-Solidityを使う

URLはこちら

https://github.com/ethereum/browser-solidity
branchはgh-pages

![スクリーンショット 2018-01-09 19.01.17.png](https://qiita-image-store.s3.amazonaws.com/0/39073/9ec08602-366e-fa52-0803-86b6a7d272d1.png "スクリーンショット 2018-01-09 19.01.17.png")

Zipファイルをダウンロードする

![スクリーンショット 2018-01-09 19.01.32.png](https://qiita-image-store.s3.amazonaws.com/0/39073/f3f088e8-2b59-c661-63f5-fb141cd6d500.png "スクリーンショット 2018-01-09 19.01.32.png")

解凍してindex.htmlをクリックします

![スクリーンショット 2018-01-09 19.06.18.png](https://qiita-image-store.s3.amazonaws.com/0/39073/1d539d53-62a9-56cf-0529-6174e41576dd.png "スクリーンショット 2018-01-09 19.06.18.png")

この画面がbrowserでオープンします。

![スクリーンショット 2018-01-09 19.07.37.png](https://qiita-image-store.s3.amazonaws.com/0/39073/57d505de-728c-0b6b-b911-d240aeb02d2b.png "スクリーンショット 2018-01-09 19.07.37.png")

Web3 Providerを選択。

![スクリーンショット 2018-01-09 19.09.37.png](https://qiita-image-store.s3.amazonaws.com/0/39073/357c52a6-cef7-ae42-1ece-b6ef036834c8.png "スクリーンショット 2018-01-09 19.09.37.png")

VagrantのIPアドレスを確認して、その値を入力します。

![スクリーンショット 2018-01-09 19.14.15.png](https://qiita-image-store.s3.amazonaws.com/0/39073/dd67a37b-c91c-5bbc-8aba-4c28b41f274c.png "スクリーンショット 2018-01-09 19.14.15.png")

これで、開発マシンと接続しました。

###Etherの単位

|単位|Wei Value|Wei|
|:-----------|:------------|:------------|
|wei|1 wei|1|
|szabo|10^12 wei|1,000,000,000,000|
|finney|10^15 wei|1,000,000,000,000,000|
|ether|10^18 wei|1,000,000,000,000,000,000|

###時間の単位

|単位|Seconds|units|
|:-----------|:------------|:------------|
|seconds|1|1|
|minutes|60|60 seconds|
|hours|3600|60 minutes|
|days|86400|24 hours|
|weeks|604800|7 days|
|years|31536000|365 days|

###ブロックのプロパティ

|グローバル変数|データ型|説明|
|:-----------|:------------|:------------|
|block.blockhash(uint blockNumber)|bytes32|指定したブロックのハッシュ|
|block.coinbase|address|カレントブロックのマイナーのアドレス|
|block.number|uint|カレントブロックの番号|
|block.timestamp| uint |カレントブロックのタイムスタンプ|
|msg.sender|address|送信者アドレス(現在の呼び出し)|
|msg.value| uint |送金額|
|now| uint |block.timestamp のエイリアス|
centos7インストールのメモ

##### ダウンロード
 https://www.centos.org/download/ のDVD ISO」をクリック

##### ハッシュのチェック

```
shasum -a 256 [ファイル名]
```


https://wiki.centos.org/Manuals/ReleaseNotes/CentOS7/Japanese#head-2989d20981309ae4c895c6fd2869a043bf2eebfe
と一致すればOK
iOSアプリを受託開発する前に検討すること

## iOSアプリの受託開発の誘惑
- 最近はハイブリッドアプリを開発するための様々な仕組みが整理されてきたようだ
- ネイティブに近い開発手法も出てきており、既存のWeb系のスキルで開発できるらしい
- 今のお客様のスマホアプリを受託していきたい

---
# iOSアプリを受託開発する前に考えること

---
## iOSアプリは複数言語で開発可能
**Swift** : ネイティブアプリ開発
**JavaScript** : Cordovaを使用したハイブリッドアプリ開発
**JavaScript** : React Nativeを使用したよりネイティブに近いハイブリッドアプリ開発
**C#** : Xamarinを使用したハイブリッドアプリ開発

---
## ハイブリッドアプリの特徴
- クロスプラットフォーム
- Web技術でアプリ開発が可能
- HTMLを使用したUI構築が可能
- ネイティブなコントロールもおおよそ利用可能

---
## ネイティブアプリの特徴
- 実行速度が早い
- マイナーな機能も実現が可能
- Xcode9.0の生産性向上
- 開発環境ではまるところが少ない

---
## 開発手法選択の基準は？
- コスト？
- 仕様の複雑さ？
- チームのスキルレベル？
- 性能？
- B2c or B2B ?

**⇛全てを考慮する必要がある**

---
## 一般的な開発手法選択基準
- コスト重視かつAndroid/iOS両対応が必要。さらに、アプリの機能がシンプルである場合。
**→ハイブリッドアプリを推奨**
- アプリの仕様が複雑かつ、高いレイテンシーが求められる
**→React NativeやSwiftを使用したネイティブ開発**
- iOS(iPhone/iPad)向けのみのアプリケーション
**→Swiftを使用したネイティブ開発か、シンプルな機能であればハイブリッドアプリ**

---
## 後で「しまった!」を防ぐ為に
- SIでは決めた要件をあとでできないとは言えない
  - **ハイブリッドアプリで実現可能か？**
- SIで開発したアプリは長い間使われつづける
  - **JavaScriptは進化が早いのに加え、動的型付言語で保守が可能か？**
  - **iOSのアップデート後も使える？**
- 性能が出ないと、受託は検収はもらえない
  - **ハイブリッドアプリは自分で性能を改善できる範囲に限界がある**

---
## できるだけSwiftを使う
- 自社サービスとして提供するような企業の開発と請負のSI開発を同一に考えると、痛い目に合う可能性がある。請負では作れないとわかってから、**バックログを落とすとか簡単にできない**
- iOSアプリの開発は画面/機能開発の工数以上に細部のデザイン/UXに時間を取られる。**Swiftを使用して実現のためにはまるリスクを下げた開発がおすすめ**である。

---

## 開発手法以外の考慮事項

1. 対応するiOSのバージョンを決める
1. 対応デバイスを決める（iPhone/iPad/watch）
2. アプリのデザイン・コンポーネントは縛る
3. アプリ以外のサーバ開発の有無を明確に
4. Appleストアへの申請作業の線引き
6. アプリリリース後のサポート方針を決める
7. iOSバージョンアップ時の対応内容を決める
yumでremiリポジトリが落ちたときのミラーサイトによる対応

# 概要
remiリポジトリが落ちた際にリポジトリについて意識していなかった自分はあせったので、対処した際の手順についてメモします。

# remiリポジトリについて
解説サイトが多々あるので参照してください
[yumとかリポジトリとかとりまとめ](http://zudoh.com/archives/144)

リポジトリ公式のTwitterBotはおそらく下記
[RemiRepository](https://twitter.com/RemiRepository)

# 参照先をミラーサイトに置き換える
Dockerfileなどに下記のように記載されていた

``` rpmコマンド（対処前）
$ rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
```

リポジトリサーバが落ちているので、当然接続できない。なのでミラーサイトに置き換える
[ミラーサイト一覧](https://paste.fedoraproject.org/paste/kDlMb0ou9OUC80ma0PrO-g)

``` rpmコマンド（対処後）
$ rpm -Uvh http://remi.conetix.com.au/enterprise/remi-release-6.rpm
```

すると、無事remi-release-6.rpmをとってきてくれる。
ただ、これだけだと続くyumがうまくいかない

``` コマンド
$ yum install -y --enablerepo=remi-php56 php

Error: Cannot find a valid baseurl for repo: remi-safe
Could not retrieve mirrorlist http://rpms.remirepo.net/enterprise/6/safe/mirror error was
14: PYCURL ERROR 7 - "Failed to connect to 2001:bc8:33a1:100::1: Cannot assign requested address"
```

repoファイルの設定が元サーバのアドレスのままらしい。なので、そこも置き換える

``` 対応コマンド
$ sed -e "s/rpms\.remirepo\.net/remi.conetix.com.au/g" /etc/yum.repos.d/remi-safe.repo > tmp.txt
$ cp tmp.txt /etc/yum.repos.d/remi-safe.repo
$ sed -e "s/rpms\.remirepo\.net/remi.conetix.com.au/g" /etc/yum.repos.d/remi.repo > tmp.txt
$ cp tmp.txt /etc/yum.repos.d/remi.repo
```

これでひとまず対処できた
WindowsでHHKB(US配列)を使ってMac風のキー操作を行う

## 背景
仕事で使用するPCがMacからWindowsに変わった際に設定を変更してMacの使用感に近付けたので、行ったことをメモに残しておく。

## 環境
- Windows 10
- Happy Hacking Keyboard (HHKB) US配列

## 設定
最終的なゴールは以下。

- ◇にCtrlを割り当てる
- 左右の◇空打ちでIMEのON/OFFを切り替える
- `◇+Tab`でアプリケーションを切り替える（`Alt+Tab`の代わり）
- `Ctrl + Shift + z`でWindowsの`Ctrl + y`（Redo）が動くようにする

### レジストリ
支給されているラップトップPCがJIS配列のため、PC自体のキーボードはJIS配列のまま、外付けキーボードのみUS配列と認識させる。

- `win + r`で「ファイル名を指定して実行」を開く
- `regedit`を入力しOK
- `LayerDriver JPN`を検索し、値を`kbd106.dll`から`kbd101.dll`に変更
- `OverrideKeyboardIdentifier`を検索し、値を`PCAT_106KEY`から`PCAT_101KEY`に変更
- 設定を反映するためPCを再起動

### HHKB背面スイッチ
Windows用にHHKBの背面スイッチを変更する。最終的な状態としては以下の通り。

|SW|状態|
|:--|:--|
|1|ON|
|2|OFF|
|3|ON|
|4|OFF|
|5|ON|
|6|OFF|

- `SW1:ON`,`SW2:OFF`にしてLite拡張モードにする ※Winを使うため
- `SW3:ON`にしてDeleteをBSとして使う
- `SW5:ON`にしてAltと◇（Win）を入れ替える

### キーアサイン
MacのcmdとWindowsのCtrlを同等のキーとしたいので、ツールを使ってキーアサインを変更する。
キーアサインの変更には[KeySwap](http://www.vector.co.jp/soft/winnt/util/se228667.html)を使用する。設定内容としては以下の通り。

|キー|割当|
|:--|:--|
|左Alt|左Ctrl|
|左Win|左Alt|
|右Alt|右Ctrl|

- Macのcmdの位置にCtrlを割り当て
- 溢れた左Altを左Winに割り当て ※Winは右のみで頑張る

設定したら反映させるため再ログインする。

### ホットキー
Macの使用感により近付けるため、[AutoHotkey](https://autohotkey.com/)を使ってホットキーを設定する。
~~※TODO：別途設定をアップする~~ AutoHotkeyの設定ファイルは[github](https://github.com/Rozsa777/AutoHotkeySettings)に置いた。

## 参考サイト
[WindowsでHHKB Professional2をMac風に使うための設定 | karakaram-blog](http://www.karakaram.com/hhkb-pro2-windows-customize)
[Windows環境でのHHKB Professional2設定(IME設定 + AutoHotkey + Vim)  - てんてんのぶろぐ](http://tenten0213.hatenablog.com/entry/2013/12/03/071342)
[Mac使いの僕がWindowsのHHKB pro2で設定しているキー配列 - codaMac.jp](https://www.codamac.jp/blog/hhkb-customize/)
[WindowsのAlt空打ちで日本語入力(IME)を切り替えるツールを作った](http://www.karakaram.com/alt-ime-on-off)
[ホットキー - AutoHotkey Wiki](http://ahkwiki.net/Hotkeys)
gccでCortex-M4のsqrtf()の呼び出しの代わりにFPU命令一発のコードを出力をさせる方法

先日, twitterでgccでCortex-M4のsqrtf()の呼び出しの代わりにFPU命令一発のコードを出力をさせる方法のことが話題に上っていて、少し調べたのですが、せっかくなのでブログにまとめておくことにしました。
なお, 私にとって初のQiita投稿です。

# 最初に結論
```test_sqrtf.c
#include <math.h>

float a(float x) 
{
	return sqrtf(x);
}
```
これを以下のようにコンパイルして生成されたコードを見ると

```
arm-eabi-gcc -c -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Ofast test_sqrtf.c 
arm-eabi-objdump -d test_sqrtf.o
```

```
00000000 <a>:
   0:	eeb1 0ac0 	vsqrt.f32	s0, s0
   4:	4770      	bx	lr
   6:   bf00     	nop
```

このように、sqrtf()の呼び出しの代わりにvsqrt.f32のFPU命令をひとつ実行するだけになります。
以降は試行錯誤した経緯や、詳細など。

# Cortex-M4向けのコンパイルオプション

```
-mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16
```
Cortex-M4のFPUはARMの他のものと違って、単精度の浮動小数点数しか扱えません。-mfpu=fpv4-sp-d16 を忘れずに。

```
arm-eabi-gcc -c -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 test_sqrtf.c
```

これでコンパイルするとこうなりました。

```
00000000 <a>:
   0:	b580      	push	{r7, lr}
   2:	b082      	sub	sp, #8
   4:	af00      	add	r7, sp, #0
   6:	ed87 0a01 	vstr	s0, [r7, #4]
   a:	ed97 0a01 	vldr	s0, [r7, #4]
   e:	f7ff fffe 	bl	0 <sqrtf>
  12:	eef0 7a40 	vmov.f32	s15, s0
  16:	eeb0 0a67 	vmov.f32	s0, s15
  1a:	3708      	adds	r7, #8
  1c:	46bd      	mov	sp, r7
  1e:	bd80 		pop {r7, pc}
```

sqrtf()はそのまま関数呼び出しとして残っています。

# 最適化オプション -O をつけてみる

```
arm-eabi-gcc -c -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -O test_sqrtf.c 
```

```
00000000 <a>:
   0:	b508      	push	{r3, lr}
   2:	ed2d 8b02 	vpush	{d8}
   6:	eeb1 8ac0 	vsqrt.f32	s16, s0
   a:	eeb5 0a40 	vcmp.f32	s0, #0.0
   e:	eef1 fa10 	vmrs	APSR_nzcv, fpscr
  12:	d404      	bmi.n	1e <a+0x1e>
  14:	eeb0 0a48 	vmov.f32	s0, s16
  18:	ecbd 8b02 	vpop	{d8}
  1c:	bd08      	pop	{r3, pc}
  1e:	f7ff fffe 	bl	0 <sqrtf>
  22:  	e7f7  	 	b.n 14  	<a+0x14>
```

おお、FPU命令のvsqrt.f32が出ました！
でもなんかコードが長いし、sqrtf()の関数呼び出しも残ってる。
よくコードを見てみると、sqrtfの引数が負のときにsqrtf()を呼ぶようになっています。
これは、sqrtfの引数が負の場合にはエラーになり、変数errnoにエラーコードをセットするなどのエラー処理をする必要があります。そのためにライブラリ関数のsqrtf()を呼ぶのです。

しかし、マイコンのプログラミングの場合には変数errnoのセットはいらないから、少しでも速く短いほうがいいということも多いと思います。このように浮動小数点演算の厳密さよりも速さを優先したい場合にうってつけのコンパイルオプションが -ffast-math です。
そして、 -Ofast というのは -O3 -ffast-math と同じ意味です。

# 最適化オプション -Ofast をつけてみる

```
arm-eabi-gcc -c -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -Ofast test_sqrtf.c 
```
これで冒頭のようなすっきりしたコードになります。

# 続き
[Cortex-M4でFPU演算をするときにつけておきたいgccの警告オプション](https://qiita.com/tetsu_koba/items/2d53c1d437fdeb4f2f57)

# 参考

使用したgccはgcc-linaro-7.2.1-2017.11-x86_64_arm-eabi で以下のサイトからダウンロードしました。
https://releases.linaro.org/components/toolchain/binaries/latest/arm-eabi/
この記事で使ったコードはgistにも貼っておきました。
https://gist.github.com/tetsu-koba/5a174de0b146cb76b50e459d69800928
gccの最適化オプションについてはこちらを参照してください。
https://gcc.gnu.org/onlinedocs/gcc-7.2.0/gcc/Optimize-Options.html#Optimize-Options
flatpickrがエラー吐いて使えなくなった時のメモ

flatpickrのバージョンが変わってtypescript内で使うときに最新バージョンでは@typesが必要なくなったらしい...
以前は4.1.4と@types/flatpickrの3.1.2を使っていて正常に動作していた
他部分で修正する箇所があって修正してデプロイしたらflatpickrで`Uncaught TypeError: i is not a function`とエラー吐いて使えなくなった
package.json内で

```
"flatpickr": "^4.1.4"
```
でバージョン指定していたため自動で最新の4.2.3がインストールされてしまっていた

```
"flatpickr": "4.1.4"
```
とバージョンを固定することで対応
4.1系から4.2系までにコミット数が多く4.2系のリリースが頻繁に行われていることからしばらくは決め打ちで4.1系を使った方がよさそう...
KivyのGUIアプリをNuitkaで簡単に小サイズの実行ファイル(exe)にする(Windows10)

# 環境
OS: Windows 10
Pythonのバージョン: 3.6.3
# Kivyを使ったGUIアプリを実行ファイルにする手段
以下のツール・パッケージを使ってPythonスクリプトを実行ファイルにすることができます。

- PyInstaller(Kivyが推奨している)
- Cx_Freeze
- Nuitka(Pythonコンパイラ)
- その他

今回はNuitkaを使います。

参考:

- https://github.com/kivy/kivy/wiki/Packaging-Kivy-apps-written-in-Python-3,-targeting-Windows-using-Nuitka
- http://nuitka.net/doc/user-manual.html
- https://qiita.com/mm_sys/items/1fd3a50a930dac3db299

# なぜNuitka?
## 小サイズ
PyInstallerで生成されたexeファイルとNuitkaで生成されたexeファイルのファイルサイズを比べると、
その差は歴然です。

|   | PyInstaller | Nuitka |
|:-:|:-:|:-:|
| ファイルサイズ | 18355KB | 256KB |

PyInstallerだとちょっとしたスクリプトだけでもMB単位になってしまいますが、
Nuitkaなら気にする必要がなさそうです。

## 高速
PythonスクリプトをCに変換してから実行ファイルにしているので高速に動きます。

# やってみよう
## Nuitkaをインストールする
http://nuitka.net/pages/download.html
↑のリンクからダウンロードできますが、
今回はpipでインストールします。
`pip install nuitka` または `python -m pip install nuitka`

## Cコンパイラをインストールする
C11をサポートするコンパイラ、またはC++03をサポートするコンパイラが必要です。
- gcc
- clang
- MinGW64
- Visual Studio 2017
のどれか1つをインストールしてください。
http://nuitka.net/doc/user-manual.html#requirements
今回は Visual Studio 2017を使用しました。

## Kivyアプリを実行ファイル化する
例として以下のスクリプト(main.py)を実行ファイルにします。

``` python:main.py
from kivy.app import App
from kivy.uix.label import Label


class MyApp(App):
    def build(self):
        return Label(text="Hello world")


if __name__ == "__main__":
    MyApp().run()
```
nuitkaでは以下のコマンドを使って実行ファイルにできます。
`nuitka --recurse-none 実行ファイルにしたいスクリプトの場所`
この例ではmain.pyを実行ファイルにしたいので、このようにします
`nuitka --recurse-none main.py`
実行すると、pythonxx.dll(xxはpythonのバージョン)と実行ファイルが生成されるはずです。

## コンソール(コマンドプロンプト)を非表示にする
実行ファイルはできましたが、このまま起動するとコンソールも表示されてしまいます。
コンソールを表示しないようにするには
`--windows-disable-console`オプションをつければ非表示にできます。
例:`nuitka --recurse-none --windows-disable-console main.py`
上記のコマンドで生成された実行ファイルを起動してみます。
すると…

…

何も起こりませんね。

nuitkaでコンソールを非表示にして起動するには、コンソールに何も出力しないようにする(kivyはログをコンソールに出力する)必要があります。


これを解決するには、stdin, stdout, stderrをコンソールで出力しないようにリダイレクトします。
このようにコードに記述します。

``` python:main.py
# --↓のコードを追加する--
import os
import sys

f = open(os.devnull, 'w')
sys.stderr = f
sys.stdout = f
sys.stdin = f
# ------------------------

from kivy.app import App
from kivy.uix.label import Label


class MyApp(App):
    def build(self):
        return Label(text="Hello world")


if __name__ == "__main__":
    MyApp().run()
```
そしてもう一度`nuitka --recurse-none --windows-disable-console main.py`で実行ファイルを生成します。
起動すると、コンソールが非表示でウィンドウが表示されるはずです。

#配布時の注意(Windowsの場合)

Pythonがインストールされていない環境(*要検証)で
生成された実行ファイルを動かす際、

- pythonxx.dll(xxはpythonのバージョン)
- vcruntime140.dll
- pythonxx.zip

※(Pythonをインストールしてあるディレクトリや、Python公式の埋め込み用PythonのZipファイルに含まれているので、そこから入手できますhttps://www.python.org/ftp/python/3.7.1/python-3.7.1rc1-embed-amd64.zip リンク先は64bit版のファイルです)

を参照します。同じディレクトリに置いておきましょう。
angularのテストで特定のテストだけを実行する

`it` の代わりに `fit` もしくは　`describe` の代わりに `fdescribe` を使うと、そのテストだけを実行してくれる

### 使い方

```
describe('Something', () => {
  beforeEach(() => {
    // ... preparation
  });

  it('should ...', async(() => {
    // ... test 1 logic here
  }));

  // ... more tests and/or nested `describe()` calls
});
```
の `it` を `fit` に変えるだけ。


```
describe('Something', () => {
  beforeEach(() => {
    // ... preparation
  });

  fit('should ...', async(() => {
    // ... test 1 logic here
  }));

  // ... more tests and/or nested `describe()` calls
});
```

例えば 31 個あるテストのうち一つを `fit` にすると、、、
```
Chrome 63.0.3239 (Mac OS X 10.11.6): Executed 31 of 31 SUCCESS (16.162 secs / 16.127 secs)
```
これが
こうなる↓
```
Chrome 63.0.3239 (Mac OS X 10.11.6): Executed 1 of 31 (skipped 30) SUCCESS (0.13 secs / 0.087 secs)
```

これは Angular のテストを作っていく上では必須の知識なので要チェック！


参考
https://github.com/angular/angular-cli/issues/3005
マイクロソフト系のメールへの送信がブロックされたときの対応方法

SPFレコードだったり、DNSの逆引き設定だったりが、ちゃんと設定されてることを確認したら、申請フォームからブロック解除の申請を出しましょう。

■解除依頼フォーム
http://go.microsoft.com/fwlink/?LinkID=614866
検索フォームの虫眼鏡アイコンをcssのみで作成

このようなよくある虫眼鏡の検索フォームをcssだけで再現しました。
![searchForm.png](https://qiita-image-store.s3.amazonaws.com/0/171960/5d885aad-7d7a-cf3a-2dc3-cf7ca1e0573b.png)

擬似要素のbeforeで虫眼鏡の円を、afterで右下の線を書いています。
beforeとafterを使うことでこれぐらいならそれほどのコード量にもならずに描けます。

```html
<div class="searchForm">
 <input class="searchForm-input" type="text">
 <button class="searchForm-submit" type="submit"></button>
</div>
```

```css
input {
  -webkit-appearance: none;
  -moz-appearance: none;
  appearance: none;
  padding: 10px;
  margin: 5px 0;
  border: 1px solid #999;
  border-radius: 5px;
}
.searchForm {
  position: relative;
}
.searchForm-input {
  width: 100%;
}
.searchForm-submit {
  position: absolute;
  width: 38px;
  height: 38px;
  top: calc(50% - 19px);
  right: 0;
  border-radius: 0 4px 4px 0;
  background: #999;
}
.searchForm-submit::before {
  position: absolute;
  content: '';
  width: 15px;
  height: 15px;
  top: calc(50% - 9px);
  left: calc(50% - 9px);
  border-radius: 50%;
  box-shadow: 0 0 0 2px #fff;
}
.searchForm-submit::after {
  position: absolute;
  content: '';
  width: 8px;
  height: 6px;
  top: calc(50% + 6px);
  left: calc(50% + 2px);
  border-top: solid 2px #fff;
  transform: rotate(45deg);
}

```