OmniAICreator/Qiita-1.07M huggingface dataset:
Chromebookのコンソールでフォントを変更する


**普通、**ターミナル([Crostini](https://chromium.googlesource.com/chromiumos/docs/+/master/containers_and_vms.md), [Crosh](https://github.com/petejkim/hterm/blob/master/doc/chromeos-crosh.txt), [Secure Shell](https://chrome.google.com/webstore/detail/secure-shell/pnhechapfaindjhompbnflcldabbghjo)など)では自分好みのフォントを使いたいところですが、Chromebookは書き込み制限がされていて変更しにくいので、Webフォントを読み込んで表示させてます(デベロッパーモードにする必要はありません)

- 適用前
![Screenshot 2018-12-10 at 11.16.01.png](https://qiita-image-store.s3.amazonaws.com/0/90678/d4e85858-6df6-2ec9-0943-e31841fbb8f2.png)

- 適用後(M+)
![Screenshot 2018-12-10 at 11.14.18.png](https://qiita-image-store.s3.amazonaws.com/0/90678/3cf6dbf2-a5f7-3c67-f913-035d5a8961f1.png)

## 設定方法

1. お好みの日本語の等幅フォントを[ここ](/hamaguchitm/items/546d40b7777bd9242e78)とかから探し、Webフォントとして配布されていないか確認
   (ない場合はライセンスに気をつけながら自己責任で[変換](https://transfonter.org/)してどこかの外部サーバに置いて読み込む)
2. 今回は[M+ webfonts](https://mplus-fonts.osdn.jp/about.html#webfonts-2)のURLを参考にターミナルの設定画面(Ctrl-Shift+P)で下記のように設定すればすぐ反映されます。

```css
font-family: "M+ Type-1 (general-j) Regular", "Noto Sans Mono"...
user-css-text: @import url(http://mplus-fonts.sourceforge.jp/webfonts/general-j/mplus_webfonts.css);
```

![Screenshot 2018-12-10 at 11.17.08-red.png](https://qiita-image-store.s3.amazonaws.com/0/90678/07575ba0-c842-2779-1135-30819f791fa9.png)

見栄えをCSSでカスタマイズ、さすがはブラウザOSです :sparkles::sparkles::sparkles:
以上です。

[:christmas_tree: FORK Advent Calendar 2018](/advent-calendar/2018/fork)
:arrow_left: 10日目 [画面キャプチャーをPuppeteerで取ってみる。](https://qiita.com/karaage7/items/6febc5de8872f86590e9) @karaage7
:arrow_right: 12日目 [単層ニューラルネットワークをPythonで実装する](https://qiita.com/fork_fujisawa/items/94d3d2b0e5362510e042) @fork_fujisawa
Redmine4.0でプラグインの動作確認をした


[Redmine Advent Calendar 2018](https://adventar.org/calendars/3352)の 11日目用の書き込みです。



Redmine 4.0がリリースされたので、普段、Redmine3.4で使用しているプラグインが動作するか確認してみた。

確認した環境は以下の通り
![redmine_4.0.1.png](https://qiita-image-store.s3.amazonaws.com/0/63464/93fd3bb6-e50c-a154-0be8-c924cf5da244.png)

構築は
https://github.com/ryouma-nagare/redmine-am2-ansible

```yaml:group_vars/redmine-aws
redmine:
  install_dir: /opt/redmine
  owner: apache
  group: apache
  repo_url: http://svn.redmine.org/redmine/branches/4.0-stable/
```
として、AmazonLinux2で動かしています。



|プラグイン|バージョン|4.0対応|備考|
|:----------------|:----------------:|:-----:|:-----|
|[redmine_absolute_dates](https://github.com/suer/redmine_absolute_dates)|0.0.4|○||
|[redmine_add_subversion_links](https://github.com/masamitsu-murase/redmine_add_subversion_links)|0.3.0|×||
|[redmine_banner](https://github.com/akiko-pusu/redmine_banner)|0.2.0|○|0.1.2→0.2.0で対応しました(2019/02/17)<br>redmine3.xは'v0.1.x-support-Redmine3'ブランチを使用すること|
|[redmine_code_review](https://github.com/haru/redmine_code_review)|1.0.0|○|0.9.0→1.0.0で対応しました(2019/01/21)<br>redmine3.xは0.9.0を使用すること|
|[redmine_github_hook](https://github.com/koppen/redmine_github_hook)|2.2.0|×||
|[redmine_group_watchers](https://github.com/wenzhixin/redmine_group_watchers)|0.0.1|○||
|[redmine_importer](https://github.com/zh/redmine_importer)|1.2.2|×||
|[redmine_issue_templates](https://github.com/akiko-pusu/redmine_issue_templates)|0.3.0|○|0.2.1→0.3.0で対応しました(2019/01/16)<br>redmine3.xは'v0.2.x-support-Redmine3'ブランチを使用すること|
|[redmine_jstoolbar_ext](https://github.com/tleish/redmine_jstoolbar_ext)|0.2.1|○||
|[redmine_jstoolbar_ext_buttons](https://github.com/tleish/redmine_jstoolbar_ext_buttons)|0.2.1|○||
|[redmine_jstoolbar_ext_coderay](https://github.com/tleish/redmine_jstoolbar_ext_coderay)|0.2.0|△|エラーにはならないが反応なかった… CodeRayボタンは標準であるので不要と判断|
|[redmine_knowledge_base](https://github.com/alexbevi/redmine_knowledgebase)|3.2.1|×||
|[redmine_local_avatars](https://github.com/ncoders/redmine_local_avatars)|1.0.3|×||
|[redmine_persist_wfmt](https://github.com/pinzolo/redmine_persist_wfmt)|2.0.0|○|1.1.0→2.0.0で対応しました(2019/05/4)|
|[redmine_vividtone_my_page_blocks](https://github.com/vividtone/redmine_vividtone_my_page_blocks)|2017/07/05|○||
|[redmine_wiki_extensions](https://github.com/haru/redmine_wiki_extensions)|0.9.0|○|0.8.2→0.9.0で対応しました(2019/02/23)<br>redmine3.xは 0.8.2 を使用すること|
|[redmine_wiki_index_tree_view](https://github.com/basyura/redmine_wiki_index_tree_view)|0.0.1|○||
|[redmine_wiki_lists](https://github.com/tkusukawa/redmine_wiki_lists)|0.0.9|○||
|[redmine_wiki_page_tree](https://github.com/ledsun/redmine_wiki_page_tree)|0.0.1|○||
|[redmine_work_time](https://github.com/tkusukawa/redmine_work_time)|0.4.0|○|0.3.4→0.4.0で対応しました(2018/12/11)|
|[redmine_xls_export](https://github.com/two-pack/redmine_xls_export)|0.2.1.t11|○||
|[view_customize](https://github.com/onozaty/redmine-view-customize)|2.0.0|○|1.2.2→2.0.0で対応しました(2018/12/11)|

プラグイン作者のみなさまが大変なのは重々承知していますが、対応を心待ちにしています。
[Swift] EnumのAssociated Valueの定義を変更したらデグレった話

# はじめに
非常に便利なEnumのAssociatedValueですが、定義を変更する際には注意が必要です。
誰かが同じ過ちを繰り返さないよう、私が実際に起こしたデグレを紹介します。

# 変更前
例えば、以下のようなEnumがあったとします。

```
enum Hoge {
    case foo(value: Int)
    case bar(value: Int)
}
```
このEnumを、こんな感じで使っていたとすると、

```
let hoge = Hoge.bar(value: 10)
```
```
if case .bar(let value) = hoge {
    self.label.text = "Value = \(value)"
}
```
画面には以下のように表示されます。
![修正前.png](https://qiita-image-store.s3.amazonaws.com/0/315465/968b43dc-7e82-8af2-7960-db2d0364a146.png)

# 変更後
ここで、barに対して何かしらの定義を追加したくなりました。

```
enum Hoge {
    case foo(value: Int)
    case bar(value: Int, value2: Int)
}
```
定義が追加されたことで、変数`hoge`を定義している箇所では、`Missing argument for parameter 'value2' in call`というコンパイルエラーが発生する為、以下のように変更を行います。

```
let hoge = Hoge.bar(value: 10, value2: 20)
```
しかし、実際に`hoge`が使われている箇所では、コンパイルエラーは発生しません。
Enumの変更前に記述したまま（以下の内容）でも何も怒られないのです。

```
if case .bar(let value) = hoge {
    self.label.text = "Value = \(value)"
}
```
実際に上記の状態で動かしてみると、画面には以下のように表示されます。
![修正後.png](https://qiita-image-store.s3.amazonaws.com/0/315465/82b3769b-42f3-5659-7867-126afad82c3e.png)
そうです。
`case .bar(let value)`の`value`には、`(value: Int, value2: Int)`のタプルが代入されてしまったのです。

# まとめ
EnumのAssociatedValueの定義を変更した場合、それを使っている箇所ではエラーにならない為、注意が必要という内容でした。
※定義を減らす場合には、使っている箇所でもエラーになります。
例えば、`bar(value: Int, value2: Int)`から`bar(value: Int)`へ変更した場合、`Tuple pattern has the wrong length for tuple type '(value: Int)'`というエラーになります。


この件は『プログラムの修正を行う場合は、影響範囲を調査し、全ての箇所で動作を確認する。』という基本を改めて思い出させてくれる出来事でした。
デモに最適！５分でデータ取得からグラフ表示する方法

普通に仕事していると、分かりやすく短時間にリスクなくスマートに、データを上げて可視化するIoTデモをやらないといけない場面ってよくありますよね。知らんけど。そんな時に使える、ITが全然わからない人が聴講者でも理解しやすいデモのやり方の記事です。

# 自己紹介
自己紹介と今年の振り返りを書こうと思ったけど、長くなったので別記事にしました。
https://qiita.com/masashiokawa/items/a6298d5a71514df1f4b1


#構成と手順
一行で言うと「[Webiot](https://webiot.io/)でデータを上げて[Ambient](https://ambidata.io/)でグラフにする」です。

図にするとこんな感じ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178685/7b9637ff-3e96-d5c9-b585-ef531b9c2ff6.png)

#手順
手順はざっくりこんな感じ
1. Webiotから勝手にデータが上がっている
2. Ambientでチャネルを作る
3. WebiotクラウドからAmbientにデータを送る
4. Ambientでグラフを見る

実はAmbientのブログに詳細手順が書いてあるのでそれを参照してもらったら良いと思います。
https://ambidata.io/blog/2017/12/18/webiot/
ここでは、上記ブログの補足とかを書いていきます。

#Wbiotを入手→データが上がる
[Webiot](https://webiot.io/)のサイトから使いたいセンサーを選んで注文します。コンソールからも注文できます。
Googleアカウントが必要です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178685/7572710b-3b68-f99f-61a7-bb4c796f6913.png)

「ログインして注文する」「コンソール」を押すとダッシュボードが出てくるので「センサー／ゲートウェイの注文」を押します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178685/26766903-1d90-2265-3dd9-ec97a3235440.png)

申込フォームが出てくるので、必要事項を記入します。
LoRaWANタイプとBLEタイプがありますが、地方や屋内でデモする時にはLoRaWANだと不安なのでBLEタイプを選びましょう。
BLEだけだとインターネットに繋がらないのでゲートウェイが必要です。「BLE-3Gゲートウェイ」も選びましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/178685/cd88c331-d0f5-bfda-10fa-d49ab5d5cac6.png)

数日すると現物がやってきます。（画像は温度/湿度/気圧センサーBLEタイプとBLE-3Gゲートウェイ）
![クリップボード06.jpg](https://qiita-image-store.s3.amazonaws.com/0/178685/60dde231-23e8-51c5-15cc-8f5f9aa7b904.jpeg)

そのままおもむろにBLE-3Gゲートウェイの電源を入れるとデータが上がり始めます！
![クリップボード07.jpg](https://qiita-image-store.s3.amazonaws.com/0/178685/36c2632a-1500-fc75-da78-e27f4ca2b364.jpeg)

#これ以降の手順
あとはAmbientのブログを参照くださいw
慣れてくると５分で終わります。
https://ambidata.io/blog/2017/12/18/webiot/

**デモの時に困るのは、設定完了後のデータからしかグラフ化しないので、デモ終了直後は何も表示されません。**
**講演などをしばらく行った後に、確認するとグラフが自動的に作られているので、注意しましょう。**

【追記】
Weboitはハンズオンセミナーやることもあるので要チェック！
https://webiot.connpass.com/

それでは、良きIoTデモライフを！
Python使わずのWebスクレイピング【超初心者向け】

データ業界で長年働いてきた[Octoparseチーム](https://www.octoparse.jp/)は、データをより使いやすく、誰でも利用できるようにずっと努力しています。ですから、Python使わず、パラメータを入力だけで、データを簡単に抽出できるテンプレートモードという機能ををリリースしました。
 [ダウンロードはこちら](https://www.octoparse.jp/Download)

#テンプレートモードとは？

具体的には、Octoparseのソフトには数十種類のあらかじめ作成されたテンプレートがあり、瞬時にデータを取得できて、スクレイピングタスクを設定する必要はありません。Octoparseの新しいタスクテンプレートは、誰でも簡単にWebスクレイピングを利用できるように設計されています。テンプレートを使用すると、タスクの作る学習時間を短縮し、すぐにデータを取得できます。
この時点でテンプレートはAmazon、Instagram、Twitter、YouTube、Googleなど多くの人気サイトがカバーされています。それに、日本のサイトもたくさん用意しております。

**Yahooショッピング、ヤフオク、メルカリ、ZOZOTOWN、楽天市場、食べログ、ｉタウンページ、Googleマップ、マイナビ転職、リクナビnext、SUUMO**

また、皆さんがほかのWebサイトを追加したいなら、私たちに教えてください。テンプレートの作成を検討します。
![タスクテンプレート.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262932/21745a54-cd57-4252-870e-c0ccd2f4cb57.gif)

 

#ウィザードモードとの違いは？

ずっとOctoparseを使っている方は、すでにウィザードモードを試したかもしれません。実際には、新しいテンプレートモードとウィザードモードはまったく違います。ウィザードモードは特定のページ構造だけで機能し、ユーザーがWebページの構造を正しく把握する上に、どのデータフィールドを抽出したいかをOctoparseに伝える必要があります。テンプレートモードはあらかじめ構築されたスクレイパーで、Octoparseに検索条件を伝えるだけで、特定のWebサイトから事前に定義されたデータフィールドを抽出できます。

 


#使い方は？

ステップ1.ホーム画面から「Task Templates」の下にある「 +Task」を選択する

ステップ2.テンプレートを選択する

ステップ3.事前に定義されたデータフィールドとパラメータを確認する

ステップ4.「Use Template」を選択する

ステップ5.検索キーワードなど、パラメータの変数を入力する

ステップ6.テンプレートを保存して実行する
![3-gif-task-template.gif](https://qiita-image-store.s3.amazonaws.com/0/262932/2124aa2c-4a70-630c-033b-cbcaa43bab4a.gif)

 


いかがでしょうか？簡単でしょう！タスクテンプレートを使うと、プログラミング知識の少ない/ない人でも簡単にWebスクレイピングを達成できます。パラメータ（ターゲットページのURL、検索キーワードなど）を入力するだけで、データがどんどん抽出されてきます。皆さんも試してみてください。
rsync コマンドを使用して、差分・完全バックアップを採る話


こんにちは、 株式会社 日立製作所 OSSソリューションセンタ の 神山直也(hi-naoya) です。
日立グループ OSS Advent Calendar 2018 の11日目、書かせて頂きたく。

私は社内システムの設計、構築、運用、etc …ゆりかごから墓場まで面倒を見ています。
今回は運用には欠かせないバックアップについて、「rsyncコマンド（とcron）だけで、差分・完全バックアップを取得する」方法をご紹介します。

## はじめに

**前提条件：**

* 本番環境１、２台の小規模環境
* ミッションクリティカルではない
* CentOS 7.x で動作するシステム
* バックアップ対象は数百G〜数T程度のファイル
* 1週間に１回完全バックアップ、毎日差分バックアップしたい

商用の製品から、バックアップを目的としたOSSなど、バックアップを行うソフトウェアはたくさんあります。
今回は rsync を利用していきます。(今回は、2018/12/11 時点の CentOS 7.5 でインストール可能な、*rsync version 3.1.2 protocol version 31* を利用しています。)

## rsync

rsync は古くから存在する遠隔地間のファイル・ディレクトリを同期するツールです。
専用プロトコルにより高速な同期が可能であり、SSH経由で同期できるなど、同期に関してはかなりツボを押さえたツールとなっています。

**参考:**

* https://linux.die.net/man/1/rsync
* https://tech.nikkeibp.co.jp/it/article/COLUMN/20070822/280151/

同期元・先のディレクトリを指定して、ファイルの数や内容が一致するようにコピーする、といった用法が一般的ですが、ハードリンクを利用した差分バックアップ機能も持っており、それを利用すれば高度な完全バックアップ・差分バックアップの運用が可能になります。

### 完全バックアップ

```bash
rsync -a --delete src/ dest/
```

-a オプションは、「アーカイブ・モード」でコピーするオプションで、ディレクトリやファイルを、そのメタ情報込みで同期するオプションです。
--delete は、削除されたファイルがあった場合に、同期先からファイルを削除するオプションです。

**注意:**
rsync はパスを指定する際に、/path/to/ と指定するか、/path/to と指定するかで動作が変わります。前者は、/path/to ディレクトリの中身全てを対象としますが、後者は /path/to ディレクトリを対象とします。この指定を間違えると、差分バックアップを採る際に、ディレクトリ構造が一致せず、問題となってしまいます（実際にハマりました）。

### 差分バックアップ

```bash
rsync -a --delete --link-dest=/path/link_dest/ /path/src/ /path/dest/
```

ほとんど、完全バックアップと同じですが、`--link-dest`オプションが増えています。
このオプションをつけると、変更のないファイルは、*/path/link_dest/* と */path/dest/* で共有されます（ハードリンクによりファイルがコピーされる）。
ディスクの消費は、*/path/link_dest* にバックアップを採った時点〜コマンド実行時点の間で変更のあったファイルのみとなります。

![image_inc_backup.png](https://qiita-image-store.s3.amazonaws.com/0/316550/ef0e2ef5-1faf-0a5e-722a-56549cfd928e.png)


一般的に差分バックアップを復元する際は、復元操作が必要なことがありますが、
この方法で差分バックアップを採った場合は、ファイルシステム上 /path/src/ も /path/dest/ も完全なディレクトリ構造を保持しているので、差分バックアップを参照する際に特別な操作が不要であり、単純なファイル操作で参照できます。

## バックアップの運用

cron にて定期実行することで、自動的にバックアップを取得しています。

* 1週間に1回
    * 完全バックアップ
* 毎日(完全バックアップ以外の日)
    * 完全バックアップからの差分バックアップを取得

crontab および各スクリプトのイメージは次のようになります。
実際のスクリプトは古いバックアップの削除や通知など、運用のためにもう少し複雑な内容となっておりますが、ここでは今回の説明に絞って掲載します。

**crontab(イメージ)**

```bash:/etc/crontab
# 完全バックアップ
30	4	*	*	6	root	COMMAND=/commands/full_backup.sh
# 差分バックアップ
30	4	*	*	1-5	root	COMMAND=/commands/incremental_backup.sh
```

**/commands/full_backup.sh(イメージ)**

```/commands/full_backup.sh
#!/bin/bash

SRC=/var/my-system/

SSH_TO=user@hostname
DEST=/backup/full/$(date "+%Y%m%d-%H%M%S")

rsync -a --delete -e ssh $SRC $SSH_TO:$DEST
```

**/commands/incremental_backup.sh(イメージ)**

```/commands/incremental_backup.sh
#!/bin/bash

SRC=/var/my-system/

SSH_TO=user@hostname
DEST=/backup/incremental/$(date "+%Y%m%d-%H%M%S")

BASE=`ssh $SSH_TO "ls /backup/full/ | tail -n 1"`

rsync -a --delete -e ssh --link-dest=$BASE $SRC $SSH_TO:$DEST
```

`-e ssh` を指定することでSSH経由で同期できます。なお、自動実行する場合はパスワード認証が使えないので、予め鍵登録を行う必要があります。

## まとめ

本格的なバックアップソリューションを入れるまでもないけど、頻繁にバックアップをとりたい。とはいえ、ディスク容量は節約したい・・・。
そんなケースで便利な、 rsync を使ったバックアップ手法をご紹介しました。皆様のお役に立てれば幸いです。
2018年下半期でdigdagに追加された機能

# はじめに
この記事は[MicroAd Advent Calendar 2018](https://qiita.com/advent-calendar/2018/microad)の10日目の記事です。
アドベントカレンダーも中盤戦に入って来ました。このあたりでちょっと軽めの記事を入れておきます。(決してさぼっているわけではありません)
ちなみにdigdagに関しては以下のような記事を過去に書いたので使ったことない方は参考にしていただければ( ◠‿◠ )

[Digdagを使ったジョブ管理](https://developers.microad.co.jp/entry/2018/10/03/172257)


# ここ半年で追加された激アツ機能TOP3
v0.9.26からv0.9.31が対象です。
※アツさの基準は個人によるものです。

## 3位 タスクごとにログを表示
v0.9.28で導入されました。
Experimentalなので今後どうなるかわかりませんが、個人的にはとても見やすいです。

## 2位 param_set・param_getオペレータ
v0.9.31で導入されました。
パラメータを外部のデータストアに保存することの出来る機能です。
project間で共有しているデータを扱う際に便利そうです。
また`s3-wait`を使わないでprojectを跨いだ依存の解決にも使えそうです。(使ったことはありません)  
簡単に動かしてみた例↓

redis-serevrを起動

```bash
redis-server
```

workflowと設定ファイルを準備

```yml:task.dig
+task:
  param_set>:
  key1: hoge
  key2: fuga

+task2:
  param_get>:
  key1: key_of_1
  key2: key_of_2

+task3:
  sh>: echo '${key_of_1} ${key_of_2}'
```

```config:sample.config
param_server.type=redis
param_server.host=localhost
```

実行

```bash
digdag run task.dig -c ./sample.config --session "2018-12-09 21:00:00"
# hoge fuga
```


## 1位 Retry Interval
v0.9.28で導入されました。
インターバルの種類が`constant`と`exponential`から選ぶことが出来ます。
これまでリトライ回数の指定は可能でしたがインターバルが指定できませんでした。この機能の追加によってリトライ時の実行時間の間隔を指定できるようになりました。
おそらくリトライの設定はだいたいどのワークフローでも同じようなものなので、以下のように別ファイルに記述して、includeするのがスッキリ書けて良いのではないかと思っています。

```yml:retry.dig
_retry:
  limit: 3 # number of retry
  interval: 1800 # interval seconds
  interval_type: exponential
```

```yml:task.dig
_export:
  !include: 'retry.dig'

+task:
  echo>: hoge
```

# 最後に
リトライのインターバルは本当に便利なので、最近バージョンあげてないな、と思ったらすぐに最新にアップデートすることをおすすめします。
この他にも様々な機能追加など活発に開発が行われていて今後の動向からも目がはなせません。


ちなみに最近PRを送ってみました。
もしマージされたらsession viewがstatusごとに閲覧可能になります。
こんな感じです↓

![StatusFilter.gif](https://qiita-image-store.s3.amazonaws.com/0/167964/8ee04c55-0ca7-c210-b83a-c24c8190ef16.gif)


簡単でしたが以上です！ありがとうございました！
Ubuntuのデスクトップ環境変えたら日本語入力できなくなった

## 日本語入力が切り替わらない
Ubuntu Linux 18.04 をインストールしてデフォルトの環境(GNOME?)がいい具合で満足していたものの。他の環境も試したくなってMATEやらCinnamonやらBudgieやらxubuntuやらをインストールしたまでは良かった。ところが日本語入力に切り替わらない。なぜだ。IBus？Mozc？何がどう違う？切り替えのアイコンも出てこなければ、半角全角キーも無効、Super+Spaceで切り替わるよと言われても切り替わらない。なぜだ。デフォルトのGNOMEがいい感じでできるんだったら他のもええ感じにならんといかんのじゃないか？なぜだ。設定するところを探し出そうにも設定がいっぱいありすぎてわからん。怪しそうなところを片っ端から開けて設定を変えてはみたものの変わらん。わからん。いじっていじってたまたまおなじみのオレンジ色の○に「あ」が出てきたときは成功したかに思われた。が、一瞬で消える。なぜだ。世界中がオレの敵に思えて心折れて諦めかけていたそのときに救われたのは。

[自動的に ibus をスタートする](https://linux.keicode.com/linux/japanese-ibus.php)
https://linux.keicode.com/linux/japanese-ibus.php

そう言えばIBusの設定を開けるとき、Ibusが起動できてないんだよ、起動してくれよと何度も言われていた。もしやと思って自動起動するアプリケーションに登録したら…成功した。これだわ。

**初心者は日本語入力切り替えに2日かけた**

## 対処法
1. 自動起動するアプリケーションの設定を開く
1. 追加ボタンを押す
1. 名前には ibus daemon (おそらくどんな名前でもいいと思われる）
1. コマンドには /usr/bin/ibus-daemon -d を入力して保存
1. ログアウトして入り直すかreboot

![ibusdaemon.png](https://qiita-image-store.s3.amazonaws.com/0/321085/c3fd306d-d007-773d-718b-e181a3eed9ad.png)

この2日の苦労を無駄にしないためにもwebで調べたことを簡単にまとめておく。もう用語がわからなくてわからなくて何がどう違うのか仕組みがどうなっているのか。いつかしっかり勉強し直そう。そういつか。

* IBus : Unix系OSにおけるインプットメソッドフレームワーク
* Mozc : Mozcは日本語変換エンジンでGoogle 日本語入力のオープンソース版
* IME : インプットメソッドエディタ IBusはこの一種？

自分のイメージとしてIBusが入り口でMozcは日本語に加工してる工場って感じ？たぶん間違っている。追求し始めたらキリがないのでこれでいいや。どうやらIBus以外にもいろんなインプットメソッドがあるらしい。便利に使えさせすればどれでもいいかな。

Mozcのキー設定も整理しておく

1. 変換前入力中：変換キーを押す前の候補入力状態
1. 変換中：変換キーを押したあとの候補選択状態
1. 直接入力：IME OFF の状態
1. 入力文字なし：IME ON の状態

ここでも混乱したのは用語で、何がどう違うんだよということだ。ひとまず3の直接入力をIME有効化、4の入力文字なし設定をIME無効化に割り当てると、半角/全角キーを押したときの挙動が以前と同じになる。さらに自分は無変換キーをIME無効化、変換キーをIME有効化に割り当てた。あとリアルタイム変換は「ほらこれでしょ？これでしょ？ほら」みたいに鬱陶しかったのでチェックを外して無効。

ほんとひと苦労。でもこれで怖いものはないぜ、いろんな環境試しちゃうぜ、オレのパラダイスはどこじゃ！と意気込んでいたら…

**今度はxubuntuが起動しなくなった**
HTML5&CSS3で学んだことまとめ

#ProgateのHTML中級編で学んだこと
プログラミングを再度学習し始めて、二週間が経ちました。
昔取った杵柄ということもあってか、理解が自分で思ったよりも早くできたので、この調子で進みたい思いです。
それでは、以下に自分が学習してきたことをアウトプットしたいと思います。

##HTML中級編
・ウェブページ全体のレイアウトや構造
＊　作成したもの
・ヘッダー
・フッター
・アイコン
・背景
・ボタン
・ログインリンク

##よくあった間違い、注意点
・CSSで「header」「footer」を指定するとき、頭に.（ドット）をつけない。

```
.header{
  height: 65px;
  width: 100%;
  background-color: rgba(34, 49, 52, 0.9);
}
```

↑これはダメな例


・;のつけ忘れ（Progateの場合、自動で付けてくれるが注意）
・入れ子構造の把握
・imgの基本構造を忘れることがあった。

```
<img　src="画像のURL">
```


##トレンド
・2019年トレンドカラーは「Living Coral」
HTMLコードは「#FF6F61」
Ransackでsearchメソッドは非推奨な件について

検索機能のgem ransackでこんなことが起きたのでメモとして残しておきます。

```
$ rails s
.
.
.
DEPRECATION WARNING: #search is deprecated and will be removed in 2.3 
.
.
.
```
なんかDEPRECATION WARNING（非推奨的なエラー）がおきてました。。。capybaraなどでテスト通すとめちゃくちゃwarning出てきてうざいです🤔
公式の文言にもありますが以下の通りです。[ransack](https://github.com/activerecord-hackery/ransack#ransack-search-method)

>Ransack #search method
Ransack will try to make the class method #search available in your models, but if #search has already been defined elsewhere, you can always use the default #ransack class method. So the following are equivalent:
Article.ransack(params[:q])
Article.search(params[:q])
Users have reported issues of #search name conflicts with other gems, so the #search method alias will be deprecated in the next major version of Ransack (2.0). It's advisable to use the default #ransack instead.

*search*メソッドは廃止予定なんですね、やらかしてました。代わりに*ransack*メソッド使えとのことなので対応したら警告でなくなりました。よかったです。
slideshare埋め込みのテスト

<iframe src="//www.slideshare.net/slideshow/embed_code/key/34LAAGV8Nj068s" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/takumahatano18/pws-cup-125364378" title="匿名化・再識別コンテスト PWS Cupの紹介" target="_blank">匿名化・再識別コンテスト PWS Cupの紹介</a> </strong> from <strong><a href="https://www.slideshare.net/takumahatano18" target="_blank">Takuma Hatano</a></strong> </div>
C++ Builder XE4 > TEdit > UI > TEditが沈んでいない状態にする設定 > [BorderStyle]を[bsSingle]から[bsNone]に変更

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

TEditはデフォルトでは沈んだような見え方になる。
これを沈んでいない状態に変更する設定は以下の通り。

- [BorderStyle]を[bsSingle]から[bsNone]に変更


下記はデフォルトの設定と上記の設定の比較。

![2018-12-10_10h41_24.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f806ce62-4338-a635-5a01-27070029ead3.png)


### 公式ドキュメント

TEditはTCustomEditから継承しているようだ

- http://docwiki.embarcadero.com/Libraries/Tokyo/ja/Vcl.StdCtrls.TEdit

TCustomEditでBorderStyleの定義がある

- http://docwiki.embarcadero.com/Libraries/Tokyo/en/Vcl.StdCtrls.TCustomEdit.BorderStyle
[UiPath]Excelのセル内容を数式の形で読み込む方法

#Excelのセル内容を数式の形で読み込みたい
普通に「範囲を読み込む（ReadRange）」で読むと、計算結果の値で読み込まれてしまいます。

##Excelでセルに数式を表示する方法
[数式]リボンの中にある[数式の表示]をクリック。
ショートカットは　ctrl+shift+@
##UiPathからショートカットキーを押す方法
SendHotKeyを使います。
##Excelで表示されているとおりにDataTableに読み込む
ReadRangeのプロパティで[表示形式を維持（低速）]にチェックを入れます。
![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/142092/aad44507-2dad-c210-98e5-14d037dd8aba.png)


##これを踏まえて作ったシーケンス
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/142092/db0633a9-73c6-682d-aaef-ed505c4d6177.png)

私のおつむではこの方法しか思いつきませんでした。
もっとスマートな方法があったら教えてください。
Prawn(PDF)でgruffを使ってグラフを表示する方法

##PDFでグラフを表示する
prawn-graph?があるらしいがしょぼいのでgruffを採用

``
$gem install gruff
```
失敗、、

gruffをインストールするにはrmagickが必要らしい、、、
そしてrmagickをインストールするにはimagemagickとpkg-configが必要、、

＊imagemagickとpkg-configは gem install ではなく homebrew　を使ってインストール、

*注意
imagemagickはバージョンが６系じゃないとうまく動かないみたい、最新バージョンは7らしい
ちなみに自分のバージョンは

```console


$ cd /usr/local
$  brew info imagemagick
imagemagick: stable 7.0.8-15 (bottled), HEAD
Tools and libraries to manipulate images in many formats
https://www.imagemagick.org/
/usr/local/Cellar/imagemagick/7.0.8-13 (1,517 files, 23.4MB)
  Poured from bottle on 2018-11-19 at 13:11:25
/usr/local/Cellar/imagemagick/7.0.8-15 (1,519 files, 23.3MB) *
  Poured from bottle on 2018-12-10 at 09:46:24
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/imagemagick.rb

```
バージョンが7.0.8-15だったので６系にダウングレードします。

#imagemagickを6系にする

```console


$brew unlink imagemagick
$brew uninstall imagemagick
$brew install imagemagick@6
#@6というのは6系とのことらしいです
==> Downloading https://homebrew.bintray.com/bottles/imagemagick@6-6.9.10-14.high_sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring imagemagick@6-6.9.10-14.high_sierra.bottle.tar.gz
==> Caveats
imagemagick@6 is keg-only, which means it was not symlinked into /usr/local,
because this is an alternate version of another formula.

If you need to have imagemagick@6 first in your PATH run:
  echo 'export PATH="/usr/local/opt/imagemagick@6/bin:$PATH"' >> ~/.bash_profile

For compilers to find imagemagick@6 you may need to set:
  export LDFLAGS="-L/usr/local/opt/imagemagick@6/lib"
  export CPPFLAGS="-I/usr/local/opt/imagemagick@6/include"

For pkg-config to find imagemagick@6 you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/imagemagick@6/lib/pkgconfig"

==> Summary
🍺  /usr/local/Cellar/imagemagick@6/6.9.10-14: 1,525 files, 24.4MB

```

インストールに成功しました、
パスを設定しなさいって言われてますね

```console
$ echo 'export PATH="/usr/local/opt/imagemagick@6/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile 
$ convert --version

```

でパスを設定できました！

パスがあんまりわかってなくて不安なので確認

```console

$ vim ~/.bash_profile
....
export PATH="/usr/local/opt/imagemagick@6/bin:$PATH"

```

ありました！！

ここでやっとこさrmagickをインストール
```gem install rmagick```
=>成功！！
```gem install gruff```
=>成功！！

＃ポイント
imagemagickの６系をインストールすること、rmagickをインストールすること

brew update
はもう使っちゃダメですね、、、
Android ログイン後にログイン画面に戻れないようにしたい

ログイン後にメイン画面に遷移するアプリを実装するとき、メイン画面から戻るボタンでログイン画面に戻れないようにしたい。

そんなときはIntentに以下のようなフラグを設定してActivityを起動する。

```kotlin
loginButton.setOnClickListener {
    val intent = Intent(this@LoginActivity, MainActivity::class.java)
            .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK)
    startActivity(intent)
}
```

### フラグの意味
- **FLAG_ACTIVITY_NEW_TASK**: 新しいタスクを作成し、起動するActivityをそのタスクのスタックに追加する
- **FLAG_ACTIVITY_CLEAR_TASK**: Activityを起動する前に、既存のタスクを破棄する。このフラグは**FLAG_ACTIVITY_NEW_TASK**と組み合わせてのみ使用できる。

## 参考
- [
タスクとバックスタック](https://developer.android.com/guide/components/tasks-and-back-stack?hl=ja)
- [Clear the entire history stack and start a new activity on Android](https://stackoverflow.com/questions/3473168/clear-the-entire-history-stack-and-start-a-new-activity-on-android/3473377)
- [FLAG_ACTIVITY_NEW_TASK](https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NEW_TASK)
- [FLAG_ACTIVITY_CLEAR_TASK](https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TASK)
ScrapBox で1行選択した時と複数行選択した時のアクションが違ってUI/UXデザイン的にやばい

# 1行だけ選択して「あれ、NewPageがない？」と思った

そして分かった。

#1行選択した時はデコレーション

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/63c5e7ff-c302-859e-2ed8-664fd45b635e.png)

#2行以上選択した時はページ分離のNewPage/Copy

![image.png](https://qiita-image-store.s3.amazonaws.com/0/89618/504119dc-262b-89f2-2457-b3022be39253.png)

#ユーザー意図を反映させようとする姿勢がやばい

やばい。

僕みたいな「あれ、ない？」が無くせればなお最高。

[yumainaura scrapbox - Google Search](https://www.google.co.jp/search?q=yumainaura+scrapbox&oq=yumainaura+scrapbox&aqs=chrome..69i57j69i60l3.5196j1j7&sourceid=chrome&ie=UTF-8)








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
どのswiftバージョンで書かれているのか確認する

ググってもなかなか見つからなかったので :innocent:

プロジェクト > Build Settings > Swift Language Version に表示されてます。
「swift」で検索するとすぐ出てきます :point_down:

<img width="857" alt="スクリーンショット_2018-12-10_10_16_49.png" src="https://qiita-image-store.s3.amazonaws.com/0/611/ef3eacf0-3174-b51f-e306-a336874cd3c0.png">

よく引っかかるやつ
---

Macにインストールされてるswiftバージョンを知る

```sh
❯ swift --version
Apple Swift version 4.2.1 (swiftlang-1000.11.42 clang-1000.11.45.1)
Target: x86_64-apple-darwin17.7.0
```

```sh
❯ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -version
Apple Swift version 4.2.1 (swiftlang-1000.11.42 clang-1000.11.45.1)
Target: x86_64-apple-darwin17.7.0
```

うーん、こういうことを知りたいんじゃないんですよね :rolling_eyes:
Azure Translator Textで翻訳する

Azure Cognitive ServiceのTranslator Text APIを利用して翻訳するサンプルコードです。
ほぼドキュメントのままです。
Azure側では、Translator Textリソースを作成して、Keysをコピーしておきます。

langには、翻訳後の言語を指定します。
翻訳前の言語は自動判定されます（クエリーで指定することもできます）。
どの言語がサポートされているかは以下のAPIで確認します。
https://docs.microsoft.com/ja-jp/azure/cognitive-services/translator/reference/v3-0-languages?tabs=curl

```
        static string host = "https://api.cognitive.microsofttranslator.com";
        static string subscriptionKey = "Keysの値";

        public static async Task<string> Translate(string text, string lang)
        {
                string route = "/translate?api-version=3.0&to=" + lang;
                System.Object[] body = new System.Object[] { new { Text = text } };
                var requestBody = JsonConvert.SerializeObject(body);

                using (var client = new HttpClient())
                using (var request = new HttpRequestMessage())
                {
                    // In the next few sections you'll add code to construct the request.
                    // Set the method to POST
                    request.Method = HttpMethod.Post;

                    // Construct the full URI
                    request.RequestUri = new Uri(host + route);

                    // Add the serialized JSON object to your request
                    request.Content = new StringContent(requestBody, Encoding.UTF8, "application/json");

                    // Add the authorization header
                    request.Headers.Add("Ocp-Apim-Subscription-Key", subscriptionKey);

                    // Send request, get response
                    var response = client.SendAsync(request).Result;
                    var jsonResponse = response.Content.ReadAsStringAsync().Result;

                    dynamic jarray = JsonConvert.DeserializeObject(jsonResponse);
                    foreach (var item in jarray[0]["translations"])
                    {
                        if (item["to"] == lang)
                        {
                            // Found
                            return item["text"];
                        }
                    }
                    // Not found
                    return text;
                }
        }
```
Civic Tech #2 Advent Calendar 2018 に対する想い

2018年も終わろうとしています。今年もCIVIC TECH FORUM、Code for Janan Summitなど幾つか全国規模のCivicTechイベントが開催され盛況を博したことは、日本におけるシビックテックへの関心の高さとその重要性を表すに十分であると思います。

- [CIVIC TECH FORUM 2018](http://2018.civictechforum.jp/)
- [Code for Japan SUMMIT 2018 SALVAGE](https://summit2018.code4japan.org/)



ところで、CivicTech界隈でよく耳にする会話に以下のようなものがあります

- 全国各地のみんなと会う機会は本当に重要だね
- 全国各地の事例の話を聞く機会は本当に重要

同時に以下のような話もよく聞かれます

- 全国各地の事例が存在しているのでなにかポータルサイトのようなものがあると良いね
    - とはいえ多くの課題は各地域ならではの問題に根付いているので難しいね
- ツールや知見はもっと共有されて積極的に利活用されるべきだね
    - そういうポータルサイト的なものがないね


なるほど確かに、Civic Tech Advent Calendar も今年で6回目となりますが、前述のような話は当初からずっとある話です。これは一方でその課題を解消することの大変さの証明でもあると思います。イベントなどで直接会って話をする機会は重要ですが、その為にはイベント開催の為の決して簡単ではない対応が必要となります。参加者にとっては移動コストなどの負担も発生します。

アドベントカレンダーは毎年12月に開催されますし、オンラインでの知見の共有を集約する為の場として良く機能すると思います。年末ならではの妙なテンションや忘年会のノリのまま投稿することもあるでしょう、いずれも知見の共有を後押ししてくれるものであると思います。

[Civic Tech \#2 Advent Calendar 2018 \- Qiita](https://qiita.com/advent-calendar/2018/civictech2) にも記載しましたが、アドベントカレンダーの空き枠がない事がアウトプットを制限することはナンセンスです。

ということで、異例ではありますが、2つめのアドベントカレンダーを用意した想いとしては以上となります。
運営支配型QA

##はじめに
**ゲームのQA**
の役務といえば、もちろんゲームの品質を保つために、バグを見つけたり動作確認をしたりすることが
主な役務です。
その為、プロデューサーやディレクターの次にゲーム全体の仕様を把握していると言っても
過言ではありません。
また、業務はQAのみで完結せず、必ず様々な部署との関わりが発生します。

今回は弊社で運営しているゲームにおいて、
QAが他部署とどのように関わっているか、紹介したいと思います。

**ところで**
あなたの部署の執務室（仕事場）は、他部署と同じ空間にありますでしょうか？
部屋が違う？
　または、階が違う？
　　もしかして、ビルが違う？

社内の環境はそれぞれ違うとは思いますが、
弊社の場合はオープンオフィスとなっており、今から紹介する部署についてもQAと同じ空間で働いています。
ですので、以下の内容はオープンオフィスをイメージしながら読んで頂ければと思います。

それでは、QAが各部署に対してどのようなコミュニケーションをしているのか、紹介致します。

##プランナー
ざっくり言うと、ゲームのイベント内容やキャラクター、ステージ、を考える企画職です。
QAと一番関わりが深いのがプランナーです。
毎日のように施策やスケジュールなどの情報を共有してもらい、QAからもテスト結果の報告や懸念事項を伝えたりしています。

**例えば、**
・この施策はいつリリースするのか？情報の公開はいつか？
・いつからQA開始可能か、いつまでにQA完了すべきか？
・キャラクターの特徴は？ウリは何か？
・ステージの特徴は？注意点はあるか？
・そもそもこれはどうやってユーザーが楽しむのか、どんな意味があるのか？

といった質問を投げかけ、リリース時の状況を想定し、テスト内容に反映させます。
スケジュールが過密であることが多いので、要件を捉え、場合によってはスケジュールを調整・変更してもらうこともあります。

**プランナーが**
データを作るため、バグ票の確認、その修正もするのもプランナーです。
プランナーも各部署と関わりが多い部署のため。負荷がかかりやすいです。
プランナーが判断しやすいように、情報を整理することを心掛けています。



##デザイナー

ゲーム内のキャラクターやUI、エフェクトの面でのQAについて会話します。
QAとしてはデザインを見たり触ったりした感想を話すこともありますが、
主には懸念事項を伝えることが多いです。

**例えば、**
・FIXした画像データはいつ完成するか？（スケジュール確認）
・使われているデザイン、意匠は法的に問題ないか？
・実機上のデザインは意図通りになっているか？（未完成版が誤って納品されていないか？）
・〇〇について分かりづらく感じるが問題はないか？

ユーザーが一番最初に目に入るのが各デザインについて、
QAとしても一ユーザーとしてゲームを触り、違和感を感じたり、よく見るとこれって変じゃない？
といった箇所がないかチェックします。
コアなユーザーなほど、じっくりデザインを見るので、第一印象だけでなく細かいところまで注意が必要です。


##エンジニア・プログラマー
プランナーが考え、デザイナーが描いたものをまとめ作り上げるのが、エンジニア・プログラマーです。
動作検証中に未知のエラーがあれば、サーバまたはクライアントの担当と会話して問題を解決します。
主に新機能開発（バージョンアップ）で、密にやり取りします。

**例えば、**
・新機能について、どのような判定・処理を行っているか？（QAにも分かる範囲での説明をもらいます）
・どんなデータによって制御できるのか？
・既存の機能への影響はあるか？

また、
弊社では週１回、流出不具合の再発防止を目的とした会議を開いています。
そこでは業務フローの改善だけでなく、機械的にミスに気付ける仕組みや、
デバッグコマンドも必要に応じて追加実装してもらうこともあります。

##カスタマーサポート
カスタマーサポートの負担を減らすため、
ユーザーから問い合わせが来るであろう仕様について、事前に共有したり
ユーザーからの不具合報告の検証についてやり取りを行います。

**例えば、**
・〇〇について、△△のパターンでは◇◇となってしまうのは仕様である。
・✖✖のバグについて、再現が取れないので〇〇について詳細な情報がもらえないか？
・Twitterでこんなバグ報告を見つけたが、問い合わせは何件来ているか？


カスタマーサポートでは、ユーザーの要望についてレポートとしてまとめてくれています。
ユーザーが今感じていることを把握することも、QAの大切な業務です。


##宣伝
ゲーム内お知らせ・公式サイト・Twitter・動画といった各媒体で
ゲームの情報を発信するのが宣伝です。

ゲーム外についてはQAを通さず、その媒体をつくる部署とプランナーの間でやり取りが完結し、リリースすることが多いです。
しかし、"目"を増やすためにQAもフォローとしてチェックを行います。
宣伝に対してはバグ報告が多い印象です。

**例えば、**
・〇〇について、仕様と異なる記述になっている
・〇〇について、ユーザーの環境ではあり得ない状態の画像が使用されている。

##ところで運営支配型QAとは・・？
QAは工程としては下流であり、最終関門です。QAを無事突破しない限り、ゲームはリリースされません。
QAは全体を見渡し、部署と部署と間に立ってやり取りすることも多く、潤滑油のような存在でもあります。
広い意味では全体を支配・掌握できる立場でもある、といっても過言ではありません。

弊社では幸い、QAの地位が不当に低いことはありません。
ただ、会社によってはパワーバランスが異なり、スケジュール優先になりQAがおざなりになったり、
はたまたバグが市場に流出しても、QAにばかり責任や負担が押し付けられることもあるかもしれません。
でも、本当は部署に上も下もありません。対等です。
バグが市場に流出しても、QAだけの責任ではありません。

個人的な意見となりますが、QAはさまざまな部署と関わりあうため、
関わる人全員が気持ちよく働けるように、フォローできるところは惜しみなくしたいと考えています。

QAはテストを行う、という当たり前の役務ですが、テストだけに捉われず、
品質を下げずむしろ上げるための提案は、
どの工程、どの部署に対しても、いつでも出来るのがQAだと思います。


##あとがき
本エントリーを閲覧くださり、ありがとうございました！

最近読む本はソフトウェアテスト関連のものより
コミュニケーション術などのビジネス書を読む時間の方が多いです。

これからも上流工程からQAとして介入することで
当初の想定よりも品質を上げてリリースできることを目指していきたいと思っています。
演算子の実行順

[JavaScript Advent Calendar 2018](https://qiita.com/advent-calendar/2018/javascript)の10日目の記事です。

なんか今朝カレンダー見たら、空いてるじゃん！~~ラッk...~~
短めですが、結構悩んだので。

```javascript
$(function () {
  var e;
  $(".show-hide").eq(0).show(), e = 1, setInterval(function () {
    var t;
    t = e - 1, 0 > t && (t = $(".show-hide").length - 1), $(".show-hide").eq(t).hide(), $(".show-hide").eq(e).show(), e++, $(".show-hide").length <= e && (e = 0)
  }, 1000)
})
```

https://jsfiddle.net/wonton0118/xpvt214o/987508/

今時jqueryかよとか言わずにお付き合い頂けますと...
まだ結構保守の現場だと普通なんですよね。

内容は `show-hide`クラスのついた要素を1000ms間隔で順番にshow/hideしていくというもの。  
何が困ったかって、そう**読めなかった**のである。  

問題部分は長ったらしいので置き換えて

`A, B && C, D, E, F, G && H`

とする。

ことの詳細は `演算子の優先順位` であり、

[演算子の優先順位 (JavaScript)](https://msdn.microsoft.com/ja-jp/library/z3ks45k7(v=vs.94).aspx)

こちらを見ていただければと思うが、`,`よりも`&&`が優先なのである。
~~決して頭から読んじゃいけない~~

つまり、
`B && C` 部分と `G && H` 部分が先に評価される。
なので例えば、 B = false, G = trueならば、

B && C → Bが返る
G && H → Hが返る

(&&演算子は左辺falseなら左辺をそうでないなら右辺を返すくらいの適当な説明にしておく)

よって、

`A, B(=false), D, E, F, H`

となり、この順で実行され(カンマ演算子は式をカンマで続けれるというだけ(全部実行される))、Hが評価された値が返る。

僕が読めるような形だとこんな感じ？

```javascript
$(function () {
  var e;
  $(".show-hide").eq(0).show(), e = 1, setInterval(function () {
    var t;
    t = e - 1
    if (0 > t)
      (t = $(".show-hide").length - 1)
    $(".show-hide").eq(t).hide()
    $(".show-hide").eq(e).show()
    e++
    if ($(".show-hide").length <= e)
      (e = 0)
  }, 1000)
})
```
https://jsfiddle.net/wonton0118/xpvt214o/987512/

# The End

読めるようになるとそうでもないけど、突然出るとしぬ...

四則演算では優先順位ちゃんとわかってるのに、なぜこうなるとわからなくなるのか...

何が大変だったって、(読めないって言う)後輩の前なのでいい格好しなきゃいけなかったこと。

※理解あってると信じたいですが、間違ってたら、そっと優しく編集リプください()
LaTeX文書の変更点を比べたい

12月といえば卒業論文なり修士論文なり博士論文なりの時期ですね。
LaTeXで文書を書いて、それを指導教員なりに直していただいて、いったいどこが直ったのか？みたいなことはあると思います。
そんな時にはlatexdiffが便利です。

参考URL:
http://d.hatena.ne.jp/hgshrs/20110824/1314204027

# インストール
Macなら、brewを入れておけば

```
brew install latexdiff
```
で入ります。

# 使い方

使い方は、違いを見たい二つのtexファイルを用意して、

```
latexdiff input1.tex input2.tex > output.tex
```

とすればよいです。
出来上がったoutput.texをご自分の好きなエディターなりなんなりでコンパイルすれば、赤字と青字でいい感じに変更点がわかるPDFを作成できると思います。

注意点としては、コンパイルにエラーが出る時には、```}```の前に空白行があることが原因の場合があるので、その一行を削除

```latex
何か

}
```
となっているものを

```latex
何か
}
```
とすれば動くかもしれません。
[React Native] styleのPropType

React Nativeのプロジェクトにeslintを導入しました。

コンポネントのコンストラクタでこんなふうにstyleを参照していたところ、

```javascript
this.props.style.width
```

こんなメッセージで怒られてしまいました。

```
ESLint: 'style.width' is missing in props validation (react/prop-types)
```

propsのバリデートでstyleが定義されていないよってことですね。
これを解決するにはreact-nativeから`ViewPropTypes`をインポートして、

```
import { ViewPropTypes } from 'react-native'
```

propTypesの定義に`ViewPropTypes.style`を追加すればOKです。

```
YourComponent.propTypes = {
  style: ViewPropTypes.style
}
```
Expo SnackでReact Native入門(とりあえず試したい人向け)

この記事は [ウェブクルー Advent Calendar 2018](https://qiita.com/advent-calendar/2018/webcrew) 10日目の記事です。
昨日は [@wc-takahara](https://qiita.com/wc-takahara) さんの「 [GoogleAPIを初心者が使ってみて～ランニングコース生成編～](https://qiita.com/wc-takahara/items/c933e99cb4e0621d50bd) 」でした。

# はじめに
最近、社内でReact Nativeの勉強会が始まりました！
とりあえず何かしらコードを書いてみたいけど、とてつもなく面倒くさがりな私は(フロントエンドとしてどうなの…)
環境構築めんどくさいな〜HelloWorldまでが長いんだよな〜億劫だな〜と思いながら色々調べていて、見つけました。
こんな私にピッタリのサービスを！  

[Expo Snack](https://snack.expo.io/)

本記事では主に登録方法や使い方についてお伝えしたいと思います。

＜対象者＞

* ~~環境構築めんどくさいと思いながら~~とりあえず簡単なものをサクッと試したい方
* npm とかちょっとよく分からないけどReactNativeやってみたい方
* 次やる案件がReact Nativeだからアサイン前に軽く触れたい方

# そもそもExpoとは
React NativeでiOSやAndroindのビルドを支援するサービスです。
# Expo Snack とは
ブラウザ上でコードの動作を確認できるサービスです。
[codepen]() や [CodeSandbox](https://codesandbox.io/) ような感じ  

# Expo Snackに登録する
[expo公式のトップ](https://expo.io/) にアクセス！
右上の**create an account**にてアカウント登録を行います。
登録が完了したらログインして**Get Started**を押下し、
[こちら](https://expo.io/learn) に遷移するので、スクロールしてちょっと下の方にあるTry Expo in the browserの**Open Snack**を押下。
すると [Expo Snack](https://snack.expo.io/)  の画面になります！

# 試してみる
Snackは開くたびに新規でランダムでサンプルコードが出てくるっぽいです。
とりあえずお決まりのHello World 書いてみましょう！
下記の部分を変えるだけです。Change〜の英文を変えてみてください。

```react
<Text style={styles.paragraph}>
    Change code in the editor and watch it change on your phone! Save to get a shareable url.
</Text>
```
　↓↓↓

```react

<Text style={styles.paragraph}>
    Hello World
</Text>
```

# 実機で見てみる
実機で見るにはiOSまたはAndroidにExpoのアプリをインストールします。

* [iOS](https://itunes.apple.com/app/apple-store/id982107779?mt=8)
* [Android](https://play.google.com/store/apps/details?id=host.exp.exponent)

右上の**Run**を押下し、出てきたモーダルのQR Codeを選択していただければQRが出てきます。
QRをスキャンしてアプリで開くと、リアルタイムでSnackのコードを実機で確認できます！すごい！

# 簡単なコードの説明
App.js

```react

// 使いたい機能を取得
// reactからReactとComponentをインポートする
import React, { Component } from 'react';
// react-nativeから使いたい標準コンポーネントをインポートする
import { View, Text, StyleSheet } from 'react-native';

// クラス作成
export default class App extends Component {
// 画面描画
  render() {
    return (
      // div的な。注意としては中にテキストを書くことはできず、本当にただの入れ物
      // style={styles.hogehoge} クラス名的な
      <View style={styles.container}>
         // span的な。テキスト描画には必ずTextで囲う。
         <Text style={styles.text}>Hello world!</Text>
      <View>
    );
  }
}
// スタイル定義
const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  text: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  },
});
```

その他は [ドキュメント](https://facebook.github.io/react-native/docs/getting-started.html) を読んでみて試してみてください！

# まとめ
いかがでしたか？短時間で、簡単にReact Nativeに触れることができました。
どんどんSnackでサンプルを作成して、素敵なアプリを作っていきましょう！
快適開発ライフを〜

# 最後に
明日は [wc-kobayashiT](https://qiita.com/wc-kobayashiT) さんです。よろしくお願いいたします！

ウェブクルーでは一緒に働いていただける方を随時募集しております。
お気軽にエントリーくださいませ。

[開発エンジニアの募集](https://hrmos.co/pages/1004681658307198976/jobs/0000005)
[フロントエンドエンジニアの募集](https://hrmos.co/pages/1004681658307198976/jobs/0000001)
BigQueryMLとScheduled Queryで機械学習モデル運用を自動化しよう


こんにちは、この記事はGCPアドベントカレンダー10日目です。

## はじめに
今年はBigQueryGIS、BigQueryMLという大きいリリースがあり、どんどんBigQueryが便利になっていきますね。
中でも**BigQueryML**は、SQLのように一連の機械学習プロセスを実行できるということで、かなり注目が集まっていると思います。

今回はBigQueryMLで構築した機械学習モデルについて、同じく今年リリースされた**Scheduled Query**というBigQueryの新しい機能を用いて、その後のモデル運用プロセスの一部を自動化できるのでは？というお話です。

> 公式Docs：
・ **[すべての BigQuery ML ドキュメント](https://cloud.google.com/bigquery/docs/bigqueryml)**
・ **[クエリのスケジューリング](https://cloud.google.com/bigquery/docs/scheduling-queries?hl=ja#top_of_page)**

## 機械学習モデルを構築し終わった後、することって何？
一般的な機械学習プロセスは、以下の図のようになります。
データの下処理、モデルの構築、そしてそれが未知のデータについても適合することの検証という流れを数回繰り返し、実際に予測モデルをデプロイし予測をしていくというプロセスになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/221497/20400856-9140-74ea-7181-a1baf6e4921c.png)

しかし、デプロイして終わりではありません。
その後モデルを運用していくためには、性能をモニタリングし続けることが必要です。
それは、デプロイした時には性能が十分だったモデルでも、時間の経過と共にデータの特性が変化し、新しいデータに対しての性能が不十分になってしまう可能性があるからです。

これって毎回そんなに時間は取られないけれども定期的にやってくるルーティンワークで、手動でやろうとするとすごく面倒くさそうですよね。

そこで、そんなところに時間をかけず、Scheduled Queryを使って自動化してしまいましょう！

## Scheduled Queryによる自動化
今回は、BigQueryMLでモデルを構築済みの状況を想定します。
モデルの作成方法など、気になる方は公式ドキュメントを読んでみて下さい。（最初の方にリンクあります）

**Scheduled Query**は、その名の通り、特定のクエリを定期的に実行し、その結果をテーブルに保存したりできるものです。
詳しい仕様などここでは述べませんので気になる方はドキュメントを読んでみて下さい。書き込み先のテーブル名の指定や、実行間隔など、設定は簡単です。

また、テーブルへの書き込み形式も設定でき、全て置き換える場合と既存のテーブルに追加する場合を選択できます。（今回は後者）

それでは、具体的に仕込むクエリを描いてみます。
例えば、こんな風にBigQueryMLの**ML.EVALUEATE関数**を使ったコードをScheduled Queryで設定します。（下の例は3ヶ月毎の実行を想定してます。）

``` SQL:
SELECT
  CURRENT_DATE() AS run_date,
  mean_squared_error,
  r2_score,
  ...
FROM
  ML.EVALUATE(MODEL `モデル名`,
    (
    SELECT
      ...
    FROM
      `テーブル名`
    WHERE timestamp BETWEEN CURRENT_DATE() AND DATE_ADD(CURRENT_DATE(), INTERVAL 3 MONTH)))
```

すると、このようなイメージで新しい検証結果がどんどん追加されていきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/221497/5c8364d5-9eda-efe7-f411-22459d13df7d.png)


そんな頻繁にデータの特性が変わることは考えづらいので、実行は１ヶ月置き、３ヶ月置きなどで大丈夫だと思います。

この時点で、定期的にモデルの精度を検証するクエリが走るように設定できましたが、ついでに**DataStudio**でモニタリング用のダッシュボードも作成してみましょう！

##DataStudioでのモニタリング
[Google DataStudio](https://datastudio.google.com/overview) （Data Portal）

生データでも良いと思いますが、

* データが増えてきた場合に比較しづらい
* 指標の変化を一覧化できない

など課題があるため、個人的にはDataStudioなどの可視化ツールで折れ線プロットを作成してモニタリングするのが良いと思います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/221497/d4da9a30-00b3-6962-6780-802d100bf7e9.png)

DataStudioを使えばこのように指標の変化を一覧化し一目で把握できます。
また、ページネーションも効くので、複数のモデルも１つのURLにアクセスするだけで性能のモニタリングができます。

##終わりに
ここまでご覧いただきありがとうございました。
BigQueryML, Scheduled Query共にとても便利な機能なので、今後のアップデートが楽しみです。
BigQueryMLについて、前に弊社で勉強会をやった際の資料もあるのでもしご興味あればご参照下さい:bow_tone1:

> [BigQueryMLハンズオン勉強会@麹町](https://speakerdeck.com/shyaginuma/bigquerymlhanzuonmian-qiang-hui)

また、先日行われたbq_sushiでのwantedlyの方の発表では実例が豊富に紹介されており、とても参考になるのでぜひ合わせてご覧ください！

> [BigQueryML を使ってみた話](https://speakerdeck.com/yuya4/bigquery-ml-woshi-tutemitahua-54ad0d4e-4c98-46c2-a4ca-769c5a7c420c)
iPad ProでコーディングするならVimmerならBuffer Editorがええんやないかな？

# 概要
新しいiPad Proを購入しました
専用キーボードの使い心地もそこそこで、ブラウジングもお絵かきも動画視聴も快適です。
そんな便利なiPad Proでコーディングも解決しちゃいたいなぁ。
そう思った私はVim操作で使用できるエディターを探しました
以下で今回調査したエディターを紹介します。

# Vim
[![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/185747/690a5081-cf7a-fc89-a3ae-8248511b7932.png)](https://itunes.apple.com/jp/app/vim/id492668168?mt=8)
最終更新日: 2018年12月7日(18/12/9時点)
[リポジトリ](https://github.com/applidium/Vim)

## ポイント
- VimテキストエディタのiOSへの移植版
- Version 8.1.42
- 専用キーボードにはエスケープなどがないので代わりに Ctrl + [ などでキーボードにないキーの変わりとして使用してください
- 日本語入力に対応していない
- .vimrcに対応


# iVim
[![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/185747/0d0bee4d-b4bf-b477-69f0-a4158634200d.png)](https://itunes.apple.com/jp/app/ivim/id1266544660?mt=8)
最終更新日: 2018年9月26日(18/12/9時点)
[リポジトリ](https://github.com/terrychou/iVim)

## ポイント
- Version 7.4
- 日本語入力に対応
- .vimrcに対応
- 上記のVimアプリからインスパイア
- [こちらの記事](https://qiita.com/naru-frank/items/f96150fd0e0bf5e02aef)で使い方がまとまっています

# Buffer Editor 
[![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/185747/6bf239cb-64dc-3a96-06b5-ad646442b240.png)](https://itunes.apple.com/app/id502633252)
最終更新日: 2018年9月26日(18/12/9時点)
[公式サイト](http://buffereditor.com/)
[twitter](https://twitter.com/buffereditor)

**結局私はこちらのエディターを使用することにしました。**

## 選んだポイント
### iPadで開発する難点
iPadでコーディングするにはちょっと面倒なポイントが多い。
ファイルの操作や保存場所などが管理しづらく扱いにくい。
シェルがつかえない。
リモート接続して作業もしたい。
そういった中で多機能なエディターを選択して面倒な部分を担当してもらえるのは非常に助かった。

### Vimキーバインディングに対応
iPad Proを買ってからどのエディターを使用することがベストかを探していたところ
- Coda
- Textastic
- GoCoEdit
- Buffer Editor
こちらの四点が候補としてあがりました

そういった中でも普段の開発でVimを使用している私は**Vimのキーバインディングに対応していることがエディターの機能としてマスト**でした。
調査した中でVimのキーバインディングに対応しているエディターはこちらのみだったように思えます。
間違っていたらご指摘していただけるとありがたいです。

### リモート接続
GithubやGooGleドライブなどに接続して作業を行うことができます。
![キャプチャ.PNG](http://buffereditor.com/wp-content/uploads/2018/07/buffer_editor_menu.png)
接続情報を入力してそれぞれのファイルへとアクセスすることができます。
Gitで管理している場合は内容をcommitしてpushすることももちろん可能です。

### アプデがまめ
このアプリ一年間で２０回以上もアップデートを繰り返していて機能改善に意欲的です。
今後よりよい操作性と痒いところに手が届くようになっていくでしょう。

### 何よりVimのサポートを機能の目玉としてアピール
他のエディターでは言及すらほとんどないVimのサポートを猛烈にアピールしています。
Vimに対しての熱い心持を感じますね。

### その他の特徴は以下を
[Features](http://buffereditor.com/features/)




# まとめ
なんだかんだ書きましたが、
はっきり言ってiPad Proでコーディングするのはお勧めしません。
iPad Proで腰据えてコーディングするのはやっぱりしんどいです。
外出たときにちょっと修正しようかなとかそれぐらいならいいですけど、
ローカルの開発環境としてiPad Proを使用するのはお勧めしません。
結局[Prompt2](https://itunes.apple.com/jp/app/prompt-2/id917437289?mt=8)でサーバに接続してごちゃごちゃやるのが一番いい方法なのかもしれません。
デザイナーがScalaでFizzBuzzテストコードを書いてみる

## はじめに
JavaScriptは怪しいながら書けるといった程度の私が、
必要に迫られScalaでテストコードを書いてみようと思い書いてみました。
※そもそもScalaって何！？というレベルですが一旦そこはおいてきます…

## プロジェクト作成
なにはともあれ、まずは「Create New Project」でプロジェクト作成をしてみます（IntelliJ）。

[こちら](http://www.scalatest.org/install)を見ながら
ScalaTestのインストール
（IntelliJのScalaプラグインはすでに入っています）
`build.sbt` に下記を追加

```build.sbt
libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.5" % "test"
```

## ScalaTestとは？
様々なスタイルのテストを書くことができるフレームワークだそうです。
`FlatSpec` でテスト書けるようにしてねーとチームメンバーからお達しが。

ちょっと調べてみました
> 仕様テキストとテストがネストを必要とせずに左のインデントレベルに対してフラットに並んでいるため、その名前が付けられています。
FlatSpec は Spec や WordSpec のようなブロックのネストを避けた記述の BDD スタイルです。

とりあえずコレ使っとけみたいな話もあり、よくわかりません…

## FizzBuzz
さて、私の認識しているFizzBuzzなのですが

- 3の倍数の場合は、「Fizz」と表示。
- 5の倍数の場合は、「Buzz」と表示。
- 15の倍数の場合は、「FizzBuzz」と表示。

早速ですがこちらを書いてみました。

```FizzBuzzSpec.scala
import org.scalatest.FlatSpec
import foo.FizzBuzz

class FizzBuzzSpec extends FlatSpec {

  "FizzBuzz" should "3の倍数の場合は、「Fizz」を返す" in {
    assert(FizzBuzz.result(3) == "Fizz")
    assert(FizzBuzz.result(6) == "Fizz")
  }

  it should "5の倍数の場合は、「Buzz」を返す" in {
    assert(FizzBuzz.result(5)  == "Buzz")
    assert(FizzBuzz.result(10) == "Buzz")
  }

  it should "15の倍数の場合は、「FizzBuzz」を返す" in {
    assert(FizzBuzz.result(15) == "FizzBuzz")
    assert(FizzBuzz.result(30) == "FizzBuzz")
  }
}
```

```FizzBuzz.scala
package foo

object FizzBuzz {

  def result(n: Int): String = {
    if(n % 15 == 0) {
      "FizzBuzz"
    }
    else if(n % 5 == 0) {
      "Buzz"
    }
    else {
      "Fizz"
    }
  }
}
```

`"FizzBuzz" should "3の倍数の場合は、「Fizz」を返す" in`
というように書く。

途中の過程を色々飛ばしてしまいましたが、まずはこんな感じ。

## おわりに
色々と怪しいところ（ツッコミどころ）足りない部分等あるのですが
とりあえず触ってみれたということが大きいかなと個人的には思っています。
CSSアニメーションで動きのあるサイトに

この記事は[ウェブクルー Advent Calendar 2018](https://qiita.com/advent-calendar/2018/webcrew)の11日目の記事です。
昨日は@piwiさんの「[Expo SnackでReact Native入門(とりあえず試したい人向け)](https://qiita.com/piwi/items/aeff56bc4ea16ac6f18e)」でした。

# はじめに
サイトのUI改善としてアニメーションが用いられることがあります。
昨今、CSSアニメーションで色々な表現ができるようになりました。
ここではCSSだけで実装できる色々なアニメーションをご紹介したいと思います。

# アニメーションの基礎
CSSアニメーションを実装するにはtransition（トランジション）とanimation（アニメーション）の2つの方法があります。

### ■transition
transitionプロパティは、トランジション効果（時間的変化）をまとめて指定する際に使用し、ホバーなどをきっかけにアニメーションが開始されます。

``` css
/* 変化対象のCSS */
transition-property:all;

/* 変化の時間 */
transition-duration:0s;

/* 変化の速度 */
transition-timing-function:ease;

/* 変化開始までの時間 */
transition-delay:0s;

/* ショートハンド */
transition:変化対象のCSS 時間 速度 開始時間;

/* 例：画像をホバーしたら0.2秒待って0.5秒かけてふわっとしたスピード（ease）で透過する */
img {
	transition: all 0.5s ease 0.2s;
}
img:hover {
	opacity:0.7;
}
```

### ■animation
animationプロパティは、キーフレームを用いたアニメーションをまとめて指定する際に使用し、細かいアニメーションが実装できます。

``` css
/* アニメーションの名前（任意） */
animation-name:none;

/* アニメーションの時間 */
animation-duration:0;

/* アニメーションの速度 */
animation-timing-function:ease;

/* アニメーションの実行回数 */
animation-iteration-count:1;

/* アニメーションの開始時間 */
animation-delay:0;

/* ショートハンド */
animation:アニメーションの名前（任意） 時間 速度 実行回数 開始時間;

/* 例：fadeInという名前のキーフレーム（動き）をページを読み込んでから1秒待って2秒かけてふわっとしたスピード（ease）で永遠にアニメーションし続ける */
img {
	animation:fadeIn 2s ease infinite 1s;
}

/* fadeInという名前のキーフレームをつくる（動きの設定） */
@keyframes fadeIn {
	0% {opacity:0;}
	100% {opacity:1;}
}
```

# 便利なアニメーション集
### いろいろな動き
いろいろな細かな動きを選べます。マウスホバーやクリック時におすすめです。

- http://vivify.mkcreative.cz/
- http://ianlunn.github.io/Hover/
- https://daneden.github.io/animate.css/

### ローディング
ページなどの読み込み中に表示されるアニメーションです。

- http://tobiasahlin.com/spinkit/
- https://connoratherton.com/loaders

### カスタムできるアニメーション
自分で一から動きをつくることができます。

- http://cssanimate.com/
- http://animista.net/

### ハンバーガー
よくスマホなどで用いられるハンバーガーメニューが実装できます。

- http://mac81.github.io/pure-drawer/index.html
- https://liginc.co.jp/180293

### eagingを選択
動きの種類がわかりやすく、最適な種類が選べます。

- https://easings.net/ja

# 注意点
ブラウザによってはまだまだ使用できないCSSプロパティがあります。
制作するサイトの対応ブラウザを考え、下記のサイトで確認しましょう。
https://caniuse.com/

# おまけ
CSSアニメーションだけで即席脳トレ・アハ体験をつくってみました。１箇所徐々に変わっていくところがあるので見つけてみてください。

<p data-height="265" data-theme-id="0" data-slug-hash="xQXzeb" data-default-tab="css,result" data-user="wc-tk" data-pen-title="xQXzeb" class="codepen">See the Pen <a href="https://codepen.io/wc-tk/pen/xQXzeb/">xQXzeb</a> by wc-tk (<a href="https://codepen.io/wc-tk">@wc-tk</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

# さいごに
UI改善でアニメーションを取り入れる際に考えなければならないのは、サイトの特徴に合っていることとユーザビリティの向上です。自己満足のアニメーションで使いづらかったら意味がありません。この部分をしっかりと意識して実装できるとページの遷移率、コンバージョン率などの数字も上がっていくと思います。皆さんもぜひ意味のあるアニメーションを実装してみてください。



明日の記事は@wc_tanaka_rinさんです。
よろしくお願いします。


ウェブクルーでは一緒に働いていただける方を随時募集しております。
お気軽にエントリーくださいませ。

[開発エンジニアの募集](https://hrmos.co/pages/1004681658307198976/jobs/0000005)

[フロントエンドエンジニアの募集](https://hrmos.co/pages/1004681658307198976/jobs/0000001)
php-master-changes 2018-12-09

今日は curl_getinfo() のバグ修正、ext/oci8 の若干のリファクタリングと oci_set_db_operation()、oci_set_call_timeout() の実装、バージョン表記の修正があった！

# 2018-12-09
## adoy: Fix [77264](https://bugs.php.net/bug.php?id=77264): curl_getinfo returning microseconds, not seconds
- https://github.com/php/php-src/commit/b3a6ca90af54482e88f714ef1062c84d36322167
- [7.3~]
- ext/curl で、[curl_getinfo()](http://php.net/manual/ja/function.curl-getinfo.php) が幾つかの項目で float で秒を返すのでなく int で マイクロ秒を返すようになっていた問題の修正
- 7.55.0 以降での追加定数の対応で起きた

## cjbj: Convert some parameter parsing to the Fast Parameter Parsing API
- https://github.com/php/php-src/commit/216d6592e1f571a2753d35278ce12c3e84c7d091
- ext/oci8 で、引数の処理をいくらか [Fast Parameter Parsing API](https://wiki.php.net/rfc/fast_zpp) に置き換え

## cjbj: Update OCI8 README
- https://github.com/php/php-src/commit/465c149cd3ba61e13817621931f2af748fe19d28
- [7.2~]
- ext/oci8 で、README の修正
- Oracle 18 への対応の追記とか古くなったリンクの書き換えとか誤字の修正とか

## cjbj: Enable Oracle Database DBOP tracing attribute
- https://github.com/php/php-src/commit/4246702406cb2dbbdb66bd84985ebfc72976569f
- [7.2~]
- ext/oci8 で、新たな関数 oci_set_db_operation() の追加
- Oracle の [DBOP](https://docs.oracle.com/database/121/NEWFT/chapter12101.htm#sthref7) というのがあり、バグのため実装を潰していたのを有効化した形
- Oracle bug 16695981 というのが何者かは分からず

## cjbj: Upgrade internal OCI call
- https://github.com/php/php-src/commit/e2ecd60f2f080d10d38337912b793a7a6b5609e0
- [7.2~]
- ext/oci8 で、Oracle 10.2 以降では PHP_OCI_CALL_RETURN() に渡すコールバックを [OCIStmtFetch2()](https://docs.oracle.com/cd/E16338_01/appdev.112/e50264/oci17msc001.htm#i575019) にするよう修正

## cjbj: Add oci_set_call_timeout() and bump version to 2.10.0
- https://github.com/php/php-src/commit/99f1f3dedfdd9c2c10962bf83c0e52fd60366928
- [7.2~]
- ext/oci8 で、oci_set_call_timeout() の追加、バージョンを 2.10.0 へ引き上げ

## cjbj: Add OCI8 changes
- https://github.com/php/php-src/commit/8c37d5f451c65d06c5bece12e6551eda6cad40ed
- [7.3~]
- NEWS へ ext/oci8 の oci_set_db_operation() と oci_set_call_timeout() の追加について追記