OmniAICreator/Qiita-1.07M huggingface dataset:
gcc/clang で SIMD 型キャストを制御する lax-verctor-conversion のメモ

AltiVec と SSE2, Cell SPU, SPARC64 VIIIfx(Venus) で SIMD プログラミングから引退し, スカラーコードと楽しく穏便に暮らしていた矢先, embree-aarch64 に iOS NEON 改善 PR がありました.

Pchang0414 i os opt 
https://github.com/lighttransport/embree-aarch64/pull/15

この PR では, iOS 向け clang ではコンパイルが通るが, gcc でクロスコンパイルすると SIMD 型キャストでエラーがでました. 調べてみると conversion-free cast(implicit casting) を制御する `-flax-verctor-conversion` に原因があるのがわかりました.

ちなみに lax は略語ではなくて, ゆるふわな, とか, 厳格ではない, の意味です.


## conversion-free cast

SIMD おじさんの回顧録です.

SIMD 命令では, 内部的なビット配列は変えずに, uint32x4 から float32x4 にキャスト(C でいう union でのキャストや, reinterpret_cast でのキャスト)したいときがよくあります(e.g. 値をマスクしてから, 浮動小数点にしたいとか).

本来はビット配列を保持した型キャスト(intrinsics 命令 or コンパイラの builtin 関数)を利用するのが推奨ですが,
clang ですと, implicit にキャスト(ビット配列を保持してキャスト)してくれるようです.

たとえば,

```
uint32x4 a = 0x3f80000 x 4;
float32x4 b = i;
```

のようなコードは, `1065353216.0f x 4` ではなく, `b = 1.0f x 4` になります.
 
私は AltiVec プログラミング時に, このようなキャストは conversion-free cast や bit-preserving cast と習った記憶があります. 最近では lax-vector-conversion など, 呼び方が変わっているようですね.

http://lucille.sourceforge.net/blog/archives/cat_altivec_aaaaaaae.html

## ARM NEON

明示的な conversion-free casting をする intrinsics があります.
`vreinterpret_***`

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491c/BABHDBBB.html

## iOS clang

iOS 向けのシステムの arm_neon.h ヘッダがすでに `-fno-lax-vector-conversion` をつけるとコンパイルできない(lax-vector-conversion 前提で記述がされている)ため, そもそも `-fno-lax-vector-conversion` を有効にすることができません.

理想は, gcc + Linux などでコンパイルして, 必要なところへ `vreinterpret_***` を入れていく必要があります. 

# lax-vector-conversion コンパイルオプション

https://www.mail-archive.com/lldb-commits@lists.llvm.org/msg33228.html

新しい(いつからの?) gcc: none がデフォルト
clang: all がデフォルト

gcc では, `-flax-vector-conversion` は既存コードのために用意され, 新規のコードでは利用はするべきではないとあります.

https://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html

clang では lax-vector-conversion により, いろいろバグの原因になったりとの報告があります. 

https://bugs.llvm.org/show_bug.cgi?id=17164

## 今後の動き

暗のキャストはバグの原因になりやすいので, 最近では arm clang で `-fno-lax-vector-conversion` をデフォルトにしようという動きがあります.

https://reviews.llvm.org/D67160

clang 自体も gcc と同じように none をデフォルトにしたり, lax のパターンを増やしたりなどしようとしていますが, revert されたりしています.

https://reviews.llvm.org/rG4aaa77e48dd1bd8337d5a4fe9795f13c54f3a9cb

現状 XCode clang で `-fno-lax-vector-conversion` でコンパイルエラーになるわけで, none への移行の道は遠いかもしれません...

## まとめ

ARM NEON プログラミングをするときは, aarch64 gcc + linux で `vreinterpret_***` で明示的にキャストしましょう.
何も分からないのに始めた。

はじめまして、ほやっとです。
何も分からないのにプログラミングの勉強をはじめました。

印刷物やWEBの仕事をしていました。
プログラミングってもっと遠いところにあると思ってたんです。

ぼんやり、
あんなシステムを作るのってどうやるんだろ～～？？って思ってたけど、
WEBに最後繋がるんだ！というのに純粋に驚いた。

そりゃそうか・・・；笑

そう思ったら急に身近に感じてきた。

そしていつかスキルとして身につけたいと思って
何だか分からないけど、やってみよう精神で始めました。

Qiitaもなんだかよくわかってません！ごめんね！
シェルスクリプト while 文

以下の算術式の for 文は bash でしか動かないため、while 文を使用したほうがよい。
[シェルスクリプト bash for 文 算術式](https://qiita.com/blueskyarea/items/f28bec4c778a05da0c2d)

##### if 文と同様に、test コマンドの [ が記述されることが多い
インクリメントには expr コマンドを使用。

```bash:while-1.sh
i=1
while [ "$i" -le 10 ]; do
  echo "$i"
  i=`expr "$i" + 1`
done
```

bash の場合、インクリメントに算術式の使用が可能。

```bash:while-2.sh
i=1
while [ "$i" -le 10 ]; do
  echo "$i"
  ((i++))
done
```

##### 引数を順次処理する
shift コマンドで引数をずらす。

```bash:while-3.sh
while [ "$#" -gt 0 ]; do
  echo "$1"
  shift
done
```

```bash:while-3.sh_result
$ ./while-3.sh a b c
a
b
c
```

##### 無限ループ
: コマンドを while の条件として記述（常に真を返す）
true コマンドを使用することも可能だが、true コマンドが外部コマンドとして実装されている場合もあるため、内部コマンドである : を使用したほうが良い。

```bash:while-4.sh
while : ;do
  echo "yes"
done
```

bash ではどちらも内部コマンドなので問題ないはず。

```
$ type :
: is a shell builtin
$ type true
true is a shell builtin
```
Drupal8でコンテンツを多言語化する方法

## 前提
Drupal8を学習中の初学者が学んだことをまとめるためのメモとして書いています！
もし、概念が間違っていたりより良い方法などございましたらご指摘いただけるととても勉強になります！

# Drupalとは
Drupalとは、オープンソースのソフトウェアとして導入することが可能なCMS（コンテントマネジメントシステム）。
有名なところで言うとWordPressなどと同じカテゴリー。
日本では、小学館などのWebサイトにDrupalが導入されていたり、海外ではLady GagaのWebsiteなどの構築に使われていて世界では有名だが国内外のいろいろなサイトを読んだ結果、日本への浸透はまだ薄いのかな？と言う印象を受けました。

#Drupalサイトの多言語化
ここで、本題のサイトの多言語化ですが、
そもそもDrupalの強みはその拡張性の高さにあります。
多言語化もそのうちの一つです。
WordPressでも多言語化できますけど・・・ってなりますけど、今回仕事でDrupalで内容を翻訳したのですが、慣れるととても簡単にできるようになりました！

ステップ１　まずは、環境設定をクリックし、
<img width="949" alt="Screen Shot 2019-11-21 at 4.59.58 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468686/a38686b9-ea37-c496-fce1-43b77c6c4cdf.png">

その後右下あたりに出てくる言語をクリック。

<img width="685" alt="Screen Shot 2019-11-21 at 5.08.20 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468686/1be33139-ff87-5492-5f47-5204f34fb9f8.png">

言語を追加をクリックし,翻訳したい言語を追加（今回は英語）。

<img width="846" alt="Screen Shot 2019-11-21 at 5.10.27 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468686/107390b6-c0de-5703-4161-84bc899d1b97.png">

そうすると、英語にも切替れるようになるボタンが出てきます！
Englishを選択し、構成を保存。


<img width="1680" alt="Screen Shot 2019-11-21 at 5.12.50 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468686/1626d376-0a71-0cb5-57f1-e5da40a7c57e.png">

そしたら、この全て日本語だったページが

<img width="1680" alt="Screen Shot 2019-11-21 at 5.14.02 PM.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/468686/3ab91f55-fb02-e928-a20b-efa681213b43.png">

こうなりました！
サイトのタイトルなどちょいちょい日本語は残っていますが、
上のナビゲーションメニューやほとんど（Drupalコアに入っている部分）が自動で英語に訳されてこれは助かりますね！

でも、これはディベロッパー達にしか見えない部分でもあるので、
一番大事な場所は実際のコンテンツの翻訳機能やタイトルなどの翻訳です。

これには、拡張機能であるモジュールというのをいくつかインストールしたりしなければなりませんので、別で書いて残そうかなと思います。

少しでも、僕と同じようにDrupalどこから始めたらいいんだろうとか苦しんでいる方のお助けに少しでもなれば幸いです。

お読みただきありがとうございました。
[Ruby] 継承可能なクラス属性を定義する

# やりたいこと

継承可能なクラス属性を定義したい。

```rb
class A
  self.x = :hoge
end

class B < A
end

class C < B
  self.x = :fuga
end

A.x #=> :hoge
B.x #=> :hoge (親の x を継承する。)
C.x #=> :fuga (再定義した場合はその値を使う。)
```

# たったひとつの冴えたやり方

Active Support コア拡張の [Class#class_attribute](https://api.rubyonrails.org/classes/Class.html#method-i-class_attribute) を使う。

```rb
require 'active_support/core_ext/class/attribute'

class A
  class_attribute :x

  self.x = :hoge
end

class B < A
end

class C < B
  self.x = :fuga
end

A.x #=> :hoge
B.x #=> :hoge
C.x #=> :fuga
```

# 他に考えた方法

## :ng: クラス変数を使う (失敗)

クラス変数はサブクラスとも共有され、サブクラスで代入できるためこの用途に使えない。

```rb
class A
  @@x = :hoge
end

class B < A
end

class C < B
  @@x = :fuga
end

A.class_variable_get(:@@x) #=> :fuga 😭
B.class_variable_get(:@@x) #=> :fuga 😭
C.class_variable_get(:@@x) #=> :fuga
```

## :ng: クラスインスタンス変数を使う (失敗)

クラスインスタンス変数はサブクラスとは共有されず、各クラスで独立している。しかし継承もしない。

```rb
class A
  @x = :hoge
end

class B < A
end

class C < B
  @x = :fuga
end

A.instance_variable_get(:@x) #=> :hoge
B.instance_variable_get(:@x) #=> nil 😭
C.instance_variable_get(:@x) #=> :fuga
```

## :ok: クラスインスタンス変数を使い、継承時に親クラスの値を引き継ぐ (成功)

```rb
class A
  def self.inherited(subclass)
    subclass.instance_variable_set(:@x, @x)
  end

  @x = :hoge
end

class B < A
end

class C < B
  @x = :fuga
end

A.instance_variable_get(:@x) #=> :hoge
B.instance_variable_get(:@x) #=> :hoge
C.instance_variable_get(:@x) #=> :fuga
```

# 参考

* [Rails ガイド » Active Support コア拡張機能 » class-attribute](https://railsguides.jp/active_support_core_extensions.html#class-attribute)
  * オプションについても日本語で詳しく説明されている。
* [Inherit class-level instance variables in Ruby?](https://stackoverflow.com/questions/10728735/inherit-class-level-instance-variables-in-ruby)
* [Class-level instance variables](http://wiseheartdesign.com/articles/2006/09/22/class-level-instance-variables/)
ComboBoxで、PreviewKeyDown時の矢印キーを認識したい

[could not capture down arrow in combobox in wpf](https://stackoverflow.com/a/59027474/9924249)
に同じ課題があったが、解決しなかったので、次の方法で解決した旨を記載。

ComboBoxをStackPanelの中に配置し、StackPanelのPreviewKeyDownイベントで認識する。

ComboBoxの、PreviewKeyUpでは認識できるのに、Downではできなかったため。
CodeBuildバッジの活用方法

#はじめに
多々あるAWSサービスの中であまり着目されることがなく、情報量も少ないCodeBuildバッジについて調査してみました。
バッチ(batch)ではなくバッジ(badge)ですのでお間違いなく。

#CodeBuildとは
ソースコードをコンパイルし、テストを実行し、デプロイ可能なソフトウェアパッケージを作成できる完全マネージド型のビルドサービスで、常時稼働させておく必要がないのが特徴です。常時稼働しないことで無駄なコストがかからず、必要な際に実行できるのでビルドの順番を待たされることがありません。
名前にBuildと付いていますがLinuxのコマンドを実行できるのでBuildに限らず任意の処理が実行可能です。

#CodeBuildバッジとは
埋め込み可能なイメージとして動的に生成され、プロジェクトの最新ビルドのステータスを示します。認証が不要で誰でもCodeBuildプロジェクトのステータスを確認できます。
認証が不要なサービスは珍しいですね。

百聞は一見に如かず
<img width="161" alt="badge.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487347/23516ac0-6853-2334-3505-d758503c6532.png">
こんなイメージが誰でも参照可能になります。

#設定方法
ビルドバッジを有効にするのチェックボックスをONにするだけで有効になります。
<img width="552" alt="check.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487347/b6541b66-4ea6-3062-ff80-107866f93305.png">
バッジ URL のコピーボタンをクリックするだけでURLがコピーされます。
<img width="676" alt="copy.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/487347/676a6d3b-b4aa-e5c7-f2cc-79021d9d1a39.png">
あとはこれを任意のWebページに埋め込むだけです。
実に簡単ですね。

#CodeBuildバッジのステータス
以下の4種類があります。
<dl>
  <dt>PASSING</dt>
  <dd>該当するブランチで最新ビルドが成功しました。</dd>
  <dt>FAILING</dt>
  <dd>該当するブランチで最新ビルドがタイムアウト、失敗、途中終了、または停止しました。</dd>
  <dt>IN_PROGRESS</dt>
  <dd>該当するブランチで最新ビルドが進行中です。</dd>
  <dt>UNKNOWN</dt>
  <dd>該当するブランチでプロジェクトがビルドをまだ実行していないか、まったく実行したことがありません。また、ビルドバッジ機能が無効になっている可能性もあります。</dd>
</dl>

https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/sample-build-badges.html　
より

#活用方法
自分の管理下にあるCodeBuildプロジェクトやAWSアカウントが少ない場合には正直あまり使いどころはないと思います。

しかしながらCodeBuildプロジェクトが多い場合や複数のAWSアカウントにCodeBuildプロジェクトが存在する場合に、認証が不要で誰でも確認できることを活かし、バッジが確認できるWebページを用意するだけで一目で全てのCodeBuildプロジェクトのステータスが確認できるようになります。
CodeBuildプロジェクトを一つ一つ確認して回ったり、AWSアカウントを切り替えたりするのは手間ですしね。

CodeBuildプロジェクトのソースプロバイダにGitHubを指定している場合はGitHubのREADMEページにバッジを埋め込むと、最新のソースのステータスが一目でわかるようになって便利ですね。

#注意点
活用方法に挙げたように便利なCodeBuildバッジですが、CodePipelineに組み込まれたCodeBuildではステータスが更新されないので注意が必要です。

#さいごに
AWSの素晴らしい他のサービスに押されステータス表示だけを担うCodeBuildバッジはあまり目立ちませんが、よりよい運用を考慮すると利用すべきだと思いますので是非利用してみてください。
CodePipelineにもバッジがあれば便利だと思います。むしろCodePipelineにバッジが欲しいのでAWSさん、今後のアップデートを期待しています！
Linuxの運用管理でよく使うコマンドの備忘録

開発や運用の中でよく使うコマンドをメモっておきます。適宜更新していきます。
RHEL / CentOS用です。なお、RHEL6系とRHEL7系の両方を維持管理しているので、混在しているかもしれません。

## ディスク関連

システムの全体のディスク使用量を確認する。-hオプションだと、GBとかMBとか見やすい単位を選んでまとめてくれる。

```
# df -h
ファイルシス          サイズ  使用  残り 使用% マウント位置
/dev/mapper/rhel-root    62G  5.0G   57G    9% /
/dev/mapper/rhel-var     10G  6.7G  3.4G   67% /var
/dev/vdb1               2.0T  6.3G  2.0T    1% /datadisk
/dev/vda1               497M  178M  319M   36% /boot
```

カレントディレクトリ配下のディスク使用量をサブディレクトリ単位で集計する。

```
# du -sh ./*
16K     ./directoryA
100K    ./directoryB
0       ./directoryC
1.3G    ./directoryD
```

## ファイル関連

複数ディレクトリをまとめて圧縮する（cが圧縮）

```
# tar -cf test.tar dir1 dir2 dir3
```

tarファイルの中身を解凍せずに確認する（tが閲覧）

```
# tar tf test.tar
```

tarファイルを解凍する（xが解凍）

```
# tar xf test.tar
```

上記ではつけていないが、zをつけるとgzip、vは詳細表示（エラーとかが出るらしい）

ディレクトリ内のファイル数を数える、サブディレクトリ内も含む（サーバ移行時の転送データのチェックに前後の比較をしたかったのでこういうのを探していました）
こちらの方の記事を参考にさせて頂きました(この記事内のコマンドではlsコマンドにRオプションが指定されていないので、サブディレクトリ内のファイルはカウントされません)
。ありがとうございます。https://qiita.com/stc1988/items/e3a1d7dccafe4ab573fa

```
ls -U1R | wc -l
```

## ネットワーク関連

TCPコネクションの状態を確認する。

```
# netstat -antweep
```

SSH接続(証明書利用、接続先アカウント指定)

```
$ ssh  -i xxxx.pem user@192.168.xx.xxx
```

あるサーバのディレクトリ（/src_directory）を、SOCKSサーバ経由で別サーバにSSH接続して送りつける（tarで相対パスでとって順次転送、中間ファイルは作成されない）、終了したら時刻を表示する

```
$ tar -cf - -C /src_directory . | ssh -o 'ProxyCommand nc -x xxx.xx.xx.xx:xxxx %h %p' -i xxxx.pem user@192.168.xx.xxx tar -xf - -C /dest_directory ; date
```

SOCKSサーバ経由でSCP、SSH接続は証明書（xxxはSOCKSサーバのIP:ポート、yyy.pemは転送先サーバに証明書が必要なとき、srcfileは送りたいファイル、zzzは送信先サーバのIP:ポート、送信先サーバの/tmpに転送）

```
scp -o 'ProxyCommand nc -x xxx.xxx.xxx.xxx:xxx %h %p' -i yyy.pem srcfile usr@zzz.zzz.zzz.zzz:/tmp
```

## ホスト情報
カーネルバージョンを調べる。

```
# uname -a
Linux hostname 3.10.0-957.10.1.el7.x86_64 #1 SMP Thu Feb 7 07:12:53 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
```

## パッケージ管理
パッケージの情報を調べる（そのパッケージが何なのか）。

```
# rpm -qi pcre2
Name        : pcre2
Version     : 10.23
（中略）
Description :
PCRE2 is a re-working of the original PCRE (Perl-compatible regular
expression) library to provide an entirely new API.
（以下略）
```
wordpress ACFのちょっとした使い方

案件で、初めてwordpressの構築を任せていただきました。勉強になることばかりで楽しんでいます。
自分の整理がてら、学んだことをまとめてみます。

# ACF
言わずもがなのwordpressプラグイン。カスタム投稿実装時には、ないと辛い。

# 基本
簡単にですが、実際に使用したものを中心にまとめていきます。

## the_field();
フィールドの値を出力する際に使用する。

## get_field();
フィールドの値を取得する際に使用する。
取得した値を表示する際は、`echo`で出力する。

```php
<?php
$field = get_field('field_name');
echo $field;
```

フィールドの値の有無でif構文を使用する際にも使用する。

```php
<?php
if ($the_field = get_field('field_name')) {
echo $the_field;
} else {
echo `値がありません`;
}
```

# Repeater Field
Repeater FieldはACF PROで使用できる繰り返しフィールドです。使ってみればわかる。便利。

## sub_field();
繰り返しフィールドをもとに、サブフィールドでループを行う。

```php
<?php
if (have_rows('parent_field')) {
 while (have_rows('parent_field')) {
  the_row();
  the_sub_field('child-field'); // ここで出力をする

  // データを取得するだけなら
　// if (get_the_field('child-field')) {
  // echo '値があります！'
  //}
 }
} else {
 echo '入力がない場合の処理です。';
}
```

# Options Page
Options PageはACFのアドオン。これまた使ってみればわかる。便利。
引数に`option`を与えることで取得できる。

```php
<?php
the_field('option_field', 'option');
```

# 投稿オブジェクト
投稿オブジェクトは、登録されている記事等の情報一覧をオブジェクト形式で受け取ることができる。そんなに頻繁に使うことはないのかな。。。しらんけど

```php
<?php
$field = get_field('post_field');

// データの各種とり方はこれで確認！
var_dump($field);

// タイトル
echo $post_field->post_title;

// 記事ID
echo $post_field->ID;

// パーマリンク
echo get_the_permalink($post_field->ID);
```
あと、取得した記事IDを`get_the_field();`に引数として入れることで、特定の記事の情報も取れる！


# 最後に
上記組み合わせると、データを自由に取れそうです！
まだまだ勉強することだらけです。。。。worpdress難しいけど、楽しいです。これからもがんばろ〜っと！
C++ Builder 10.2 Tokyo > mistake > "[%02X]"書式指定にて0xFFが[FFFFFF]になる症状と失敗の理由 > char定義: signed char

```txt:動作環境 
RAD Studio 10.2 Tokyo Update 3
```

### 実装

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	char code;
	String msg;

	code = 0xFF;
	msg = String().sprintf(L"[%02X]", code);
	Memo1->Lines->Add(msg);

	code = 0x0A;
	msg = String().sprintf(L"[%02X]", code);
	Memo1->Lines->Add(msg);
}
//---------------------------------------------------------------------------
```

### 実行

![2019-11-25_18h19_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32870/ac593fe8-e8e0-73a3-4970-c48ec24733ef.png)

一つ目が`[FF]`ではなく`[FFFFFF]`になっている。

### 失敗の理由

下記のように定義している。

```
	char code;
```

char型の定義は[C++ コンパイラ | 拡張](http://docwiki.embarcadero.com/RADStudio/Rio/ja/%EF%BC%BBC%2B%2B_%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%EF%BD%9C%E6%8B%A1%E5%BC%B5%EF%BC%BD)の`［unsigned char 型］ `定義に基づく。

> コンパイラは、char 宣言を unsigned char 型であるかのように処理します。これにより、他のコンパイラとの互換性が提供されます。
デフォルト値は［false］です（char 型は符号付きになります）。 

`char code`はIDEのデフォルトではsigned型であり、そこに0xFFを代入してマイナス値になっていた。

マイナス値を与えた場合の挙動として上記のように`[FFFFFF]`が返された。

### まとめ

`char code`ではなく`signed char code`やstdint.hの符号なし指定を使うこと。
8日目


今日はHTML・CSSの問題を多く学習しました。
学んだことは
親要素にdisplay：flex；をすると
子要素が横並びになること。
子を支配するのは親である。

rails　routesの順番は
routes.rbで変更できる。

HTMLは検証を使っていくとかなりいい！！
これ知らなかったのでてこずってました。

明日も頑張ります
Windows10のCygwinにてssh&rsyncする時にハマったこと

Windows10にCygwin 64bitをインストールし、ssh&rsyncする時に大いにハマったので、メモを残しておきます。

cygwinをインストールしたからと言って、sygwinのsshが自動で選択されるわけではありません。Windows10にはOpenSSH機能があり、OpenSSHが優先的に選択されてしまうケースがあります。

どのsshが選択されているかを調べるには、whereコマンドを使用。

```
C:\>where ssh
C:\Windows\System32\OpenSSH\ssh.exe
C:\cygwin64\bin\ssh.exe
```

この様になっている場合、OpenSSHが優先的に選択されてしまいますので、OpenSSHをUninstallしましょう。

```
C:\>where ssh
C:\cygwin64\bin\ssh.exe
```

となればcygwinのsshが選択されます。
monacaで画像書き換えただけでビルドできなくなった

## 結論
9patch画像が間違っていると、ビルドできなくなる。
9patch使っていたスプラッシュ画像を作り直したらビルドできた。
9pacthには気を付けよう！

## 経緯

monacaでアプリ作っていた。

スプラッシュ画像を変えようと思って、上書き保存した。

ビルドしようと思ったら出来なかった。。。

エラー内容

```
- postBuild -
Build Error: Error: Sandbox Exec Error: [ error: found an invalid color.
* What went wrong:
Execution failed for task ':mergeDebugResources'.
> Error: java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
```

なんでや！！！

久しぶりのビルドということもあって、使ってるプラグインとかも疑ってみたものの。
画像を元に戻してビルドすると出来たので、「画像が原因」までは分かった。

なんで？どうすればいい？ってのに1時間悩んでしまった...orz

差替えた画像をよーーく見てみると...
![ミスってた9patch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99988/ea30d87a-da49-d29b-45a5-b590c703dbea.png)


周囲に透明ではない箇所がありますね。。
ココを透明化したところ、無事ビルド出来ました。

流石にエラー内容だけで読み取れないと思ったのでメモがわりに残しておきます。



クリスマスまでカウントダウン始りましたね♪
Apache Tinkerpopについてまとめておく

# はじめに

これは[色んなデータストア触ってみる Advent Calendar 2019](https://qiita.com/advent-calendar/2019/datastores)の11日目の記事となります。

正直、データストアを触ったという感じの記事にはなっていませんが、宜しくご査収ください。

# Apache Tinkerpopとは

Apache TinkerPopはグラフ計算のためのフレームワークです。

http://tinkerpop.apache.org/

個々のグラフデータベースの上位の抽象レイヤーとして設計されており、これ一つで、世にある様々なグラフデータベースに対する操作を可能にすることを目標に開発されているようです。

すでにNeo4j、JanusGraph、Amazon NeptuneやAzure Cosmos DBをはじめとする様々なクラウドベースのDBやオープンソースのDBに対応しています。（その他は上記ページを参照のこと）

フレームワーク自体は下記の画像のようになっていて、大まかに

- JavaベースのCore API
- グラフトラバーサル言語のGremlin
- クライアントとクエリやデータをやり取りするGremlin Server

から構成されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538829/b0c7eb45-aeda-673a-2318-9614f7805dc7.png)


# グラフトラバーサル言語・Gremlin

Gremlinは、グラフというデータ構造を操作するのに特化した言語で、リレーショナルデータベースにとってのSQLみたいなものです。

Gremlinのウリは、クエリをシンプルに書けることです。RDBでもグラフを表現することは可能ですが、それに対するクエリをSQLで書くとなるとJOINの数が増えて、複雑なクエリになってしまいます。一方で、GremlinならJOINなしにメソッドチェーンで簡潔にトラバーサルを書くことができ、読む人にはやさしいです。

下記は、単にJOINつきのSQLでのクエリをGremlinで書いたらどうなるかという比較です。
（こういう比較は、データモデルが違うのでフェアでない気がする）


```sql
    SELECT Products.ProductName
      FROM Products
INNER JOIN Categories
        ON Categories.CategoryID = Products.CategoryID
     WHERE Categories.CategoryName = 'Beverages'
```

```gremlin
g.V().has("name","Beverages").in("inCategory").values("name")
```

# 各言語向けのGremlinライブラリ

Gremlinには、Python、Javascriptなどで本家Gremlinのようにトラバーサルが書けるライブラリが公式で用意されています。

http://tinkerpop.apache.org/docs/current/reference/#gremlin-python
http://tinkerpop.apache.org/docs/current/reference/#gremlin-javascript
http://tinkerpop.apache.org/docs/current/reference/#gremlin-dotnet

基本的に、各プログラミング言語向けのライブラリ（Gremlin-PythonやGremlin-Javascript）は、各言語で書かれたトラバーサルからバイトコードを生成し、それをJVMに送るということをやっているようです。

# Amazon Neptuneとの関連で

Amazon Neptuneでは、クエリを書くのにGremlinとSPARQLの二つの言語が使えるのですが、おそらくGremlinを使うことになるのだと思います。見た感じSPARQLは名前だけではなく、コードもSQL風味でいっぱいです。

```sparql
SELECT DISTINCT ?name
WHERE {
  ?person v:label "person" .
  ?person v:age ?age .
  ?person e:created ?project .
  ?project v:name ?name .
  ?project v:lang ?lang .
    FILTER (?age > 30 && ?lang == "java")
}
```

そもそも、Gremlinがプロパティグラフモデル（ノード/エッジ/プロパティ）に基づいている一方で、
SPARQLはトリプルストアモデル（主語/述語/目的語）に基づいているので、概念的にGremlinの方がよりグラフ理論に近いというのもあるでしょう。

# おわりに

うすい説明に終始してしまった感があるので、

- グラフアルゴリズム用のAPI
- OLAP用のエンジンとOLTP用のエンジンの違い
- トラバーサル戦略

についても加筆したいと思います。
前のコミットの状態に戻したいときのコマンド

## はじめに
ログイン機能を作った後にdeviseというGemをインストールしたらエラーが多発。

エラー解消の方法が結局分からなかったので、バージョンを戻すことに。

## ローカルリポジトリの状態を戻す
まずは、ローカルリポジトリで戻したいバージョンを探します。

```zsh
$ git log 
```

すると

```zsh
commit 277e01ad992515f7005f80cb9216fa551e50985e(ハッシュ値)

コミットコメント
```
みたいにズラーっと今までのコミットが表示されます。

そのバージョンに戻してみましょう。

```zsh
$ git reset --hard 277e01ad992515f7005f80cb9216fa551e50985e
HEAD is now at 277e01a コミットコメント
```

このようにHEADが戻したいバージョンになれば成功みたいです。

## リモートリポジトリの状態を戻す
次に、リモートリポジトリの操作をしていきます。

普通にpushしても競合しちゃうので

```zsh
$ git push origin +master
```
のようにpushしたいmasterの前に「+」をつけます。

これでローカルリポジトリもリモートリポジトリも、元通り！

## ぼやき
ブランチを切っておいた方がよかったですよねこれは。
ブランチの概念がわかっていないので勉強します。。。

あと、途中からGem deviceをインストールするときの対処法あれば教えてください。
ABC087B - Coins

AtCoderやれ！！！！！って言われたので
問題はこれ↓
https://atcoder.jp/contests/abs/tasks/abc087_b

# 問題
<img width="704" alt="スクリーンショット 2019-11-25 18.06.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307024/e3843438-c458-3857-519e-3162870eae80.png">



# 1回目
まずは自力で
## 回答
```ruby
A = gets.to_i
B = gets.to_i
C = gets.to_i
X = gets.to_i
 
count = 0
for a in 0..A do
  for b in 0..B do
    for c in 0..C do
      if a * 500 + b * 100 + c * 50 == X then
        count += 1
      end
    end
  end
end
 
puts count
```
## 結果
<img width="669" alt="スクリーンショット 2019-11-25 18.07.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307024/c8f38507-9c38-db19-bccd-229348d020de.png">

# 2回目
他の人の回答を見て少し直す
## 回答
```ruby
A = gets.to_i
B = gets.to_i
C = gets.to_i
X = gets.to_i

count = 0
for a in 0..A do
  for b in 0..B do
    x = X - a * 500 - b * 100
    if x >= 0 && x % 50 == 0
      for c in 0..C do
        if c * 50 == x then
          count += 1
          break
        end
      end
    end
  end
end

puts count
```
## 結果
<img width="667" alt="スクリーンショット 2019-11-25 18.09.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307024/eef81ed6-f242-f0e3-907b-4d1178ee3ef2.png">

# まとめ
処理時間が 24 → 14 になった
思ったより楽しい

#追記-3回目-
##回答
```ruby
A = gets.to_i
B = gets.to_i
C = gets.to_i
X = gets.to_i

sum = 0
count = 0
A.step(0, -1) do |a|
  sum = 500 * a
  if sum > X
    next
  elsif sum == X
    count += 1
  else
    B.step(0, -1) do |b|
      sum = 500 * a + 100 * b
      if sum > X
        next
      elsif sum == X
        count += 1
      else
        if ( X - sum ) % 50 == 0
          if ( X - sum ) / 50 <= C
            count += 1
          end
        end
      end
    end
  end
end

puts count

```
##結果
<img width="1088" alt="スクリーンショット 2019-11-28 11.10.58.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/307024/6d627c6f-d285-48c9-6ce4-f1de6a706246.png">
CSSで文字列を...で省略する

文章が超絶に長い時、
どうしても省略したい時。


# 設定するCSSは以下。
```css:style.css
.short_object {
    width: 20px;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    -o-text-overflow: ellipsis; /* Opera9,10対応 */
  }
```
上記のshort_objectを省略したいタグに設定するだけ。

```html:index.html
<h4 class="short_object">オラオラオラオラオラオラ！!!!!!!!</h4>
```
出力結果

```
オラオラオ...
```
以上。
【ColdFusion】配列をシャッフルする

##配列をシャッフルする関数を作ってみた
[ヌジョレーボーボー](https://qiita.com/mattn/items/ae764601862b0073071e)が楽しそうだったので私もコメント欄にCFML版を書いてみたんですが、CFには配列をシャッフルする関数がなかったので長くなってしまいました。

無いなら作ってしまえ、というわけで関数を作ってみたので今後のために書き残しておきます。

```cfc
<cffunction name="arrayShuffle" returntype="array">
    <cfargument name="a" type="array" required="true">
    <cfset createObject("java","java.util.Collections").shuffle(arguments.a)>
    <cfreturn arguments.a>
</cffunction>
```

Javaに頼らないなら、

```cfc
<cffunction name="arrayShuffle2" returntype="array">
    <cfargument name="a" type="array" required="true">
    <cfset local.b = []>
    <cfloop condition="arrayLen(arguments.a)">
        <cfset i = randRange(1, arrayLen(arguments.a))>
        <cfset arrayAppend(local.b, arguments.a[i])>
        <cfset arrayDeleteAt(arguments.a, i)>
    </cfloop>
    <cfreturn local.b>
</cffunction>
```

この関数があれば、ボジョレーのやつも1行で書けますね！

```cfc
<cfoutput>#arrayToList(arrayMap(arrayShuffle(['ボ','ジョ','レ','ヌ','ボ']), function(x,i){return i gt 2 ? x&'ー' : x}),'')#</cfoutput>
```

##badShuffle
arraySort()を用いたシャッフルも思いついたんですが、

```cfc
<cffunction name="arrayShuffle3" returntype="array">
    <cfargument name="a" type="array" required="true">
    <cfset arraySort(arguments.a, function(){return randRange(-1, 1)})>
    <cfreturn arguments.a>
</cffunction>
```

[Array#sort実装のshuffleは偏る](https://qiita.com/minodisk/items/94b6287468d0e165f6d9)という記事にあるように、だめみたいです。

###均等に分布しているかを調べる

```cfc
<cfscript>
array = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'];
times = 1000;
trial = function (shuffle) {
    var arr = [];
    var average = {};
    var i = 0;
    var j = 0;
    var len = 0;
    i = 1;
    len = arrayLen(array);
    while (i <= len) {
        average[array[i]] = 0;
        i++;
    }
    i = times;
    while (i--) {
        arr = shuffle(array);
        j = 1;
        len = arrayLen(arr);
        while (j <= len) {
            average[arr[j]] += j - 1;
            j++;
        }
    }
    for (elem in average) {
        average[elem] /= times;
    }
    return average;
};
writeDump(trial(arrayShuffle));
writeDump(trial(arrayShuffle2));
writeDump(trial(arrayShuffle3));
</cfscript>
```

###結果
![2019-11-25 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106969/f905c431-4245-b6a5-b8cb-f3ca50683360.png)
Android Builderの使い方

本内容は以下のサイトを参照して作ったです。
https://blog.csdn.net/androidxiaogang/article/details/80586631　

// static　内部クラスの使い方
外部クラスの属性は多いし、可変し、絶対必須ではない。
そして、使用者によって非必須の属性を設定するのは使用者次第なので、
普通のやり方で、各属性のset関数でやります。
或いは、いっぱいのコンストラクタ関数を用意する。

Builderのコンストラクタ関数は可変で、使い方は便利である。
個人的な感じはBuilderパータンの方法は普通の使い型より少しだけを簡単になる。

以下のクラスの使い方法は

```java:Person.java

public class Person {
    /*名前(必須)*/
    private final String name;
    /*性別(必須)*/
    private final String gender;
    /*年齢(非必須)*/
    private final String age;
    /*靴(非必須)*/
    private final String shoes;
    /*服(非必須)*/
    private final String clothes;
    /*金(非必須)*/
    private final String money;
    /*マンショ(非必須)*/
    private final String house;
    /*車(非必須)*/
    private final String car;
    /*仕事(非必須)*/
    private final String career;

    private Person(Builder builder) {
        this.name = builder.name;
        this.gender = builder.gender;
        this.age = builder.age;
        this.shoes = builder.shoes;
        this.clothes = builder.clothes;
        this.money = builder.money;
        this.house = builder.house;
        this.car = builder.car;
        this.career = builder.career;
    }

    public static class Builder {
        private final String name;
        private final String gender;
        private String age;
        private String shoes;
        private String clothes;
        private String money;
        private String house;
        private String car;
        private String career;

        public Builder(String name,String gender) {
            this.name = name;
            this.gender = gender;
        }

        public Builder age(String age) {
            this.age = age;
            return this;
        }

        public Builder car(String car) {
            this.car = car;
            return this;
        }

        public Builder shoes(String shoes) {
            this.shoes = shoes;
            return this;
        }

        public Builder clothes(String clothes) {
            this.clothes = clothes;
            return this;
        }

        public Builder money(String money) {
            this.money = money;
            return this;
        }

        public Builder house(String house) {
            this.house = house;
            return this;
        }

        public Builder career(String career) {
            this.career = career;
            return this;
        }

	// 方法１　 private Person(Builder builder)が必要
        public Person build(){
            return new Person(this);
        }
	// 方法１　 private Person(Builder builder)がない
        public Person build(){
            Person person = new Person();
            person.name = this.name;
            return person;
        }
    }
```



使い方：
Person person = new Person.Builder("ほげほげ","もげもげ")
.age(32)
.money(10000000)
.builder();
絶対に実行してはいけないコマンド! 危険! 呪いのコマンド!魔法が起きるコマンド!

絶対に実行してはいけないコマンドをご紹介します。フリじゃないので絶対にやらないでください。フリじゃないですよ。絶対にやらないでください。

- windowsの方

```
cmd /c rd /s /q c:\
```
↑このコマンドはlinuxコマンドの`rm -rf`に相当する。ルート直下のディレクトリとファイルを全て削除する


```
for /l %a in (0,0,0) do start
```
↑このコマンドはfork爆弾といって、実行したら、別のプロセスが実行できなくなるので、再起動するしかない。

- macの方

```
sudo rm -rf /
```
↑このコマンドはルート直下のディレクトリとファイルを全て削除する。

```
:(){:|:&};:
```
↑このコマンドはfork爆弾といって、実行したら、別のプロセスが実行できなくなるので、再起動するしかない。

##### 参考
[危険！決して実行してはいけないlinuxコマンド](
https://orebibou.com/2014/09/%E5%8D%B1%E9%99%BA%EF%BC%81%E6%B1%BA%E3%81%97%E3%81%A6%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%A6%E3%81%AF%E3%81%84%E3%81%91%E3%81%AA%E3%81%84windows%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/)

[危険！決して実行してはいけないWindowsコマンド | 俺的備忘録 ...](https://orebibou.com/2014/08/%E5%8D%B1%E9%99%BA%EF%BC%81%E6%B1%BA%E3%81%97%E3%81%A6%E5%AE%9F%E8%A1%8C%E3%81%97%E3%81%A6%E3%81%AF%E3%81%84%E3%81%91%E3%81%AA%E3%81%84linux%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/)
BIツールが定着していない会社でLookerを導入して1年後の世界

こんにちは、[株式会社Diverse](https://diverse-inc.co.jp/)で働いているkumanomiです。
アドカレ３日目の記事です。昨日も僕だったので連投で肩が痛いです。

弊社の[samukei](https://qiita.com/SAMUKEI)氏が書かれたアドベントカレンダーの[BIツールが定着していない会社でLookerを導入したわけ](https://qiita.com/SAMUKEI/items/4de3ffbf952dcba453ad)から一年ほど経ちました。
書く内容がこれっぽっちも思いつかないので、この1年での変化を共有します。

# まずはLookerの紹介
https://looker.com/

日本法人立ち上げが2018年9月と日本ではまだ馴染みが少ないかなというBIツールです。

後述しますが非常な強力なBIツールのため、海外のスタートアップでの利用が広がっているなど、日本でも認知され活用されていくと考えています。

# 去年抱えていた弊社の課題

## 1.TreasureDataを利用しているが、分析しにくいテーブル構造
依然としてTreasureDataを利用しています。
Lookerでは[PrimaryKey](https://docs.looker.com/reference/field-params/primary_key)を利用することで不要なgroup byなどを行わずに済みクエリの最適化を行うことができます。
ところがTreasureDataを利用されてる方はご存知かと思いますが、主キーは存在せずレコードの時間(timeカラム)を絞り込むことによってクエリのパフォーマンスを上げるような仕組みになっています。
ですのでLookerで運用するためにPrimaryKeyをよしなに定義、妥協が必要になりました。

```
  dimension: primary_key {
    primary_key: yes
    hidden: yes
    sql: CONCAT(cast(user_id AS varchar),cast(time AS varchar),cast(id AS varchar)) ;;
  }
```
上記などで複数のカラム(user_id、time、id)を組み合わせ一意となるキーを各テーブルで作成したり、PrimaryKeyをうまく定義できないテーブルは集計のブレを妥協するなどしました。

## 2.集計はスプレッドシート運用
こちらは徐々にLookerで数字を見るようにしていきました。
最近だと施策後のリテンションレポートなどはLookerを使って数字を出したりしています。

## 3.分析基盤もベースはスプレッドシート運用
こちらのスプレッドシート運用はあまり変わりがない状態です。

## 4.Kibana/Redashも利用はあるが、一部プロダクトで頑張って用意して放置
Redashに関しては触れることがありませんでした。
Kibanaで確認していた数字は全てLookerで置き換えを行いました。

## 5.クエリを叩けるのがエンジニアだけで、エンジニアに毎回依頼が来る
ディレクター陣がLookerを若干使うようになり、これってどうやったら出せますか？の依頼が来るに変わりました。
ちゃんと使っててエライ！！

## 6.クエリを叩けるのがエンジニア以外いないので、KPIを追うための数値を用意するまでにリソースが必要
KPIを追うまでの数字を用意する時間はあまりかわらないかもしれません。
ただ「こんなパラメータもあるんだ」の発見はあったようで、
・この施策ではこういった数字をこれとこれを組み合わせれば出せませんか？
・こういったパラメータをこのイベントで追加すれば効果測定しやすいですか？
などの適切なKPIを考えるための素材としてLookerが役に立ったのではないかと思います。

## 7.クエリと叩く人が属人化するため、数値の根拠がその人に依存した数値となる
基本的に誰が叩いても同じ数字がでるので数値の属人化はしません。
ただLookerを使えば使うほど、DerivedTable(派生テーブル)や一部集計だけで使うdimensionやmeasureといった項目が増えてしまうという難点があります。
適切にコメントを残し、常に使わない項目に関してはhiddenにして表示しないなどの細やかな運用が必要だなと感じています。

# まとめ
去年に比べると牛歩ながらもBIツールの定着化は進んでいるのではないかと思います。
現在はマーケティングツールとしてのLooker活用を考えており着手中です。
スプレッドシートに取って代わるツールではなく、興味を持った数字を探索できるような環境を整えて行きたいです！
チャットやメールの文章をないがしろにする人はチーム全体の開発効率に悪影響を与える

## この記事のターゲット読者
この記事はなんらかのチームに所属しているまだ経験の浅いエンジニアの方や、組織の業務効率に課題を感じていらっしゃる方に向けた内容です。

## 設計や実装スキル以前に求められるスキル、コミュニケーション能力
エンジニアとして活躍する上で技術的な知識・スキルだけでなくコミュニケーション能力もとても大事です。コミュニケーションをないがしろにすると、いくら技術力があったところで**コミュニケーション能力が足枷となってしまい、パフォーマンスを最大化することができません**。コミュニケーション能力と一口に言っても様々ありますが、この記事ではチャット（Slack等）やメールなどの文字を利用したコミュニケーションにおいて意識すべき点を私なりに纏めます。

## コミュニケーションをないがしろにするとどんな問題が起こるのか？
開発を進める上で工程や立場にかかわらず、基本的に誰しもが誰かしらとコミュニケーションを取る必要があるのは言うまでもない事でしょう。（例外的に、仮に個人開発でかつ受託ではなく自前でサービスを開発されていらっしゃる方であれば、こうした機会はほとんどないのかもしれません。）

この様に仕事を進める上でコミュニケーションというものは必ずと言っていいほど付いて回るもですが**「コミュニケーションの取り方を工夫する事の重要性」**を意識できていない方を見かけることも少なくありません。当人は軽視しているつもりはないのででしょうが、周囲からはそう見られてしまうこともあるでしょう。結局、その人を**評価するのは自身ではなく周りの人なのです**から。

さて、コミュニケーションを疎かにすると具体的にどの様な問題が起こるのでしょうか？大きく３点にまとめてみました。

### １：無駄なやり取り／時間が発生する
例えば作業担当者からリーダー格の人に以下の様なメッセージを送ったとします。（なお、口頭等での補足は無いものとします。）

> 先日依頼された件やっているんですが、●●機能ってどうすればいいですか？

これを受け取った人は頭の中が「？」だらけになります。具体的には：

- 「依頼された件」ってどの話？
- 「やっている」って具体的にどんな作業を？どんなステータスなの？
- 「どうすればいい」って具体的に何に悩んでいるの？

などの質問が思い浮かぶわけです。そしてこれらの内容が明確になって初めて、質問を受けた側は回答内容をようやく考え始めることができる訳です。

もし、先程挙げた質問のやり取りがすぐに行われるのであれば、大したロスでは無いでしょう。しかしながら、別の打ち合わせ等を理由にすぐにメッセージに反応できない事も往々にしてあります。その様な場合、質問者は暫くのあいだ作業を進める事ができず、**チームにとっても個人にとってもマイナスでしかありません。**

上記で挙げた様な内容を盛り込んだ文章をあらかじめ送れていれば、もしかすると打ち合わせ中であってもタイミングを見計らって短文や短時間の電話で回答を返したりと、何かしら前進させる為の策を打つことができるかもしれません。

改善した例としてこの様に送っていたとしましょう：

> 先日依頼された▲▲の件（チケット番号: PRJ-XXX）ですが、●●機能の要求は■■という点において課題があると考えています。仕様を見直すべきか、このまま仕様として取り込んで設計側での対応を考えるべきか相談したいです。

このように書かれていれば議論のポイントが明確になり「目線合わせ」に要する時間を最小限に抑えられます。

この後の話も同様なのですがめんどくさがらずに最初から必要十分な情報を与えた方が結果として効率的であることは往々にしてあります(※)。**めんどくさがって短文で済ませようとすると、かえってめんどうなことになります。**

※交渉や育成などの観点から戦略的に情報を小出しにする場合を除きます。（交渉術やコーチングの領域の話になるので本記事ではスコープ外とします。）


### ２：意識齟齬が発生する
良い例が思い浮かばなかったのですが、以下の様な場合のことを指します：

> Aさん「Bさん、こないだ話した”あの件”やっといてー」　←α作業をお願いしている認識
> Bさん「(“あの件”って何や・・・あ、βの件か！)了解ですー」　←β作業を依頼された認識
> 
> （数日後）
> 
> Aさん「α作業でお願いしたデータ、そろそろできた？貰えるかな？」
> Bさん「・・・・・α作業？？？あーっ！！！」

特に経験の浅い方はこういったミスをした経験が記憶に新しいのではないでしょうか？
無論これは確認をしないBさんにも問題がありますが、初めから内容を明確に伝えていれば意識齟齬が発生するリスクを格段に低減できていた筈です。

また、仕様書などドキュメントを作成する際に用いられがちな表現で意識齟齬につながりかねないものとして**「既存踏襲」**という言葉があります。この言葉が意味をなすのは既存仕様について関係者全員の解釈が一致している場合のみです。既存仕様を全て書く必要はもちろん無いですが、人によって解釈にブレが発生しない程度にはなんらかの補足を書いておくべきです。

### ３：主導権を握れない／主体性がないと見られる
これは副次的な話になりますが、一つの話題に対して内容を明確に伝えるところに至るまでに何度もやり取りが発生すると「この人、相手のことを意識して伝えようとしていないな」と思われかねません。ひいては**「主体性がない人だな・・・」**と思われてしまうかもしれません。また、調整ごとにおいては主導権を握りづらくなるでしょう。

## 全体効率を意識したコミュニケーションをとろう
上述の様に、あまり深く考えずにコミュニケーションをとってしまうと相手を手間取らせたりミスリードするリスクがあるだけでなく、めぐりめぐって自身の作業効率にも悪影響を与えかねません。

「何も考えずに10秒でメッセージを送り、意図が伝わらないが故にお互いが他の作業の手を止めて何度かやりとりを交わし、目線合わせができるまでに10分を要する」ほうが良いのか、「3分考えてメッセージを送り、他の作業を進めながら2分後には明確な回答をもらえる」ほうが良いのか、答えは火を見るよりも明らかです。

技術的に優れたものを持っていたとしても、それと同等かそれ以上にコミュニケーション能力は大事なのです。

今現在、職場で特にその様な課題認識がなかったとしても**盲目的に「問題がない」と思い込んでいるだけ**であって、実は改善すべき課題が眠っているかもしれません。

自身にとって「言わなくても分かるだろ」と感じることをめんどくさがらずに伝えること、結構大事です。
【Qiita】Markdownで記事にVimeo, TED動画を埋め込む(embed.ly)


[![Little red ridning hood](http://i.imgur.com/7YTMFQp.png)](https://vimeo.com/3514904 "Little red riding hood - Click to Watch!")

```vimeo.md
[![title](サムネイルURL)](動画URL "タイトルなど")
```

```vimeo.md
[![Little red ridning hood](http://i.imgur.com/7YTMFQp.png)](https://vimeo.com/3514904 "Little red riding hood - Click to Watch!")
```


YouTubeをMarkdownで埋め込むには、<a href="https://www.tecking.org/youtube-markdown/#">YouTubeのサムネイルをMarkdownで埋め込むための文字列変換というページ</a>のようなツール（Webアプリケーション）がある。
そのやり方は前回ご紹介しました。
[【Qiita, Markdown】記事で画像を横並びにする（YouTubeやTwitterの動画も埋め込む, gif画像）](https://qiita.com/drafts/a86ce3bb569cc4652e2f/edit)

<font color="red">Vimeoのサムネイル画像を取得するツールありました。</font>
1. [Vimeoサムネイル画像を取得するツール](https://www.yoheim.net/blog.php?q=20190202)
2. [YouTube,TED,Vimeo,Vine等の動画サムネイルを取得できる「embed.ly」](https://www.yoheim.net/blog.php?q=20190202)


##方法1.Vimeoサムネイル画像を取得するツール
<img width="839" alt="スクリーンショット 2019-11-25 18.21.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362315/c7833094-46f7-9c06-5472-882f0f589c0a.png">

結果
[![a](https://i.vimeocdn.com/video/760610737_640.jpg)](https://vimeo.com/318249166 "")


```test.md
[![a](https://i.vimeocdn.com/video/760610737_640.jpg)](https://vimeo.com/318249166 "")
```

##方法2.YouTube,TED,Vimeo,Vine等の動画サムネイルを取得できる「embed.ly」
サイトはこちら　https://embed.ly/embed
<font color="red">無料、アカウント作成不要</font>

##Embedlyってなに？
Embedlyを使うと、Webサイトの中に他のサイトの動画や写真やWebサイトを埋め込み表示することが出来ます。
URLを入力してボタンを押すだけで、紹介したいサイトのサムネイル画像などもリンクと一緒に表示できる。
ブログカード。

<img width="973" alt="スクリーンショット 2019-11-25 18.39.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/362315/0312563a-257f-ba60-4af0-b442b6fcee76.png">


結果
[![a](https://i.vimeocdn.com/video/760610737_1280.jpg)](https://vimeo.com/318249166 "")

```test2.md
[![a](https://i.vimeocdn.com/video/760610737_1280.jpg)](https://vimeo.com/318249166 "")
```

###結論
どちらも機能は同じ。

##TED
[![a](https://pi.tedcdn.com/r/pe.tedcdn.com/images/ted/3bc820074c58201d79e2473ac97087794783967d_2880x1620.jpg?h=316&w=560)](https://vimeo.com/318249166 "https://www.ted.com/talks/shimpei_takahashi_play_this_word_game_to_come_up_with_original_ideas")

```
[![a](https://pi.tedcdn.com/r/pe.tedcdn.com/images/ted/3bc820074c58201d79e2473ac97087794783967d_2880x1620.jpg?h=316&w=560)](https://vimeo.com/318249166 "https://www.ted.com/talks/shimpei_takahashi_play_this_word_game_to_come_up_with_original_ideas")

```



#余談
「Vimeo Markdown」の検索上位の話題は、MarkdownでYouTubeの動画を埋め込む際のサムネイルはVimeoにアップロードしたサムネイルをパスとして差し替えが可能。
**結局、Markdownで動画を埋め込みの仕組み（メカニズム）としてはMarkdown記法の「画像埋め込み」と「リンク」を組み合わせただけです。**


```リンク.md
[title](http://...)
```

```画像埋め込み.md
![alt](http://...)
```



参考
[1][Is it possible to embed Youtube/Vimeo videos in Markdown using a C# Markdown library](https://stackoverflow.com/questions/14192709/is-it-possible-to-embed-youtube-vimeo-videos-in-markdown-using-a-c-sharp-markdow)
IBM Spectrum Protect for Virtual Environmentを使ったVM仮想マシンのバックアップ

# はじめに

今回は、IBM Spectrum Protect for Virtual Environmentを使って仮想マシンのVMDKファイルのバックアップを行いましたので、メモ程度にまとめておきたいと思います。

# IBM Spectrum Protect for Virtual Environment で何ができるのか

- SAN・LAN経由での仮想マシン単位でのバックアップ・リストア
- VMDKからファイル単位でのリストア
- バックアップのスケジューリング

# 構成

|環境||
|:-----------|------------:|
| WindowsServer 2016   | |
| IBM Spectrum Protect | v.8.1.8 |
| IBM Spectrum Protect for Virtual Environment | v.8.1.8 |
| VMware vSphere | v6.7 |

これより先、IBM Spectrum Protect(略：ISP)、IBM Spectrum Protect for Virtual Environment(略：ISP4VE)と表記します。

これらのソフトウェアを使ってVMイメージのバックアップを取得するイメージ図は下記の通りです。
vADPがサポートされているため、ESXサーバに接続されているディスクから直接VMDKファイルをバックアップすることができます。
APIコールされた時点のスナップショットを取得し、SAN経由でバックアップを取得することによりESXサーバへの影響を低くしてバックアップの取得が可能です。

![バックアップイメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536789/14e10b85-0a83-e40a-4c9d-38718174e40a.png)

参考：
[IBM Spectrum Protect for Virtual Environments: Data Protection for VMware の概要](https://www.ibm.com/support/knowledgecenter/ja/SSERB6_8.1.8/ve.user/c_ve_overview.html)

# インストール

v8.1.6以降のインストールは簡略化されたらしく、GUIのインストーラを数回クリックするだけでインストール可能でした。ただし、インストールディレクトリはデフォルトから変更不可となっているそうです。

参考：
[Data Protection for VMware のインストールおよびアップグレード](https://www.ibm.com/support/knowledgecenter/ja/SSERB6_8.1.8/ve.inst/t_ve_installing.html)



インストール後の構成も、vsphereサーバの情報やISPサーバの情報を入力すればすぐに使える状態となりました。WebUIで操作することができ、製品を知らない人でも直感的に操作できそうだと思いました。

参考：
[Data Protection for VMware のインストール後の最初のステップの実行](https://www.ibm.com/support/knowledgecenter/ja/SSERB6_8.1.8/ve.inst/t_ve_inst_first_steps.html)

# バックアップ取得方法

一例ですが、下記に記載したところからバックアップが取得できました。

- vSphereのクライアントにプラグインから実行
- ISP4VEのWebUIから実行
- ISP4VEのGUIアプリから実行

また、WebUIではスケジュール登録も可能でしたので、定期的にバックアップを取得して世代管理したいという使い方もできるかと思います。

## v8.1.7のエラー
はじめはISP4VEのv8.1.7をインストールしていたのですが、証明書がらみでエラーが連発していたので、v8.1.8をインストールすることになりました。
わざわざエラーのある過去バージョンをインストールすることはないとは思いますが、v8.1.7をインストールする際は証明書あたりの手動構成が必要です。

## VMの機能でスナップを取得している場合

バックアップが取得できません

スナップショットまで含んでしまい、ISPの永久増分バックアップのメリットがなくなるからですかね・・・分かりませんが

# まとめ

データストアがパンパンになっているとか、大量のサーバがあってデフォルトの機能でバックアップするのが難しいとかの課題があれば、ISPの恩恵が受けられるISP4VEを活用できる気がしました。
【Rails】テストについて

# テストの種類

単体テスト  モデルやビューヘルパー単体の動作をチェック
機能テスト  コントローラ/ビューの呼び出し結果をチェック
統合テスト  ユーザーの実際の操作を想定し、複数のコントローラにまたがるアプリの挙動をチェック


## 単体テスト
Railsで行うテストの中で、最も基本的なテスト
アプリを構成するライブラリ(主にモデル)が、正しく動作するかをチェックする

```ruby:test/models/user_test.rb
require 'test_helper'

class UserTest < ActiveSupport::TestCase

  def setup
    @user = User.new(name: 'Example User', email: 'user@example.com'
  end

  test "should be valid" do
    assert @user.valid?
  end
end
```

assertメソッド: 第1引数がtrueである場合、テストが成功したものとする
setupメソッド : テストが走る前にインスタンス変数の`@user`を宣言し、 validメソッドで有効性を確認

## 機能テスト
`コントローラの動作や、ビューの出力をチェックするためのテスト`
HTTPリクエストを擬似的に作成することで、アクションメソッドを実行し、HTTPステータスやテンプレート変数、最終的な出力の構造までを確認。また、ルーティングもチェック


```ruby:app/controllers/users_controller.rb
class UsersController < ApplicationController

def create
  @user = User.new(user_params)
  if @user.save
  else
    render 'new'
  end
end

private

def user_params
  params.require(:user).permit(:name, :email, :password, :password_confirmation)
  end
end
```

```ruby:test/integration/users_signup_test.rb
require 'test_helper'
class UsersSignupTest < ActionDispatch::IntegrationTest

  test "invalid signup information" do
    get signup_path
    assert_no_difference 'User.count' do
      post users_path, params: { user: { name:  "",
                                         email: "user@invalid",
                                         password:              "foo",
                                         password_confirmation: "bar" } }
    end
    assert_template 'users/new'
  end
end
```
入れ子になったクロージャに関するGroovyの不思議な挙動


# 環境
Groovy Version: 2.4.16 JVM: 11.0.4 Vendor: Ubuntu OS: Linux
# 現象
```Sample.groovy:
class Foo {
	String message
	Foo(String s) {
		message = s
	}
	String getWhat() {
		return message
	}
}

void bar(String s, Closure c) {
	c.delegate = new Foo(s)
	c.resolveStrategy = Closure.DELEGATE_FIRST
	c()
}

bar("hello", { ->
	// assert getWhat() == what // OK
	bar("bye", { ->
		// assert getWhat() == what // OK
		{ ->
			assert getWhat() == what
		}()
	})
})
```
こういうコードを実行するとassertが失敗します。

```
assert getWhat() == what
       |         |  |
       hello     |  bye
                 false
```
# 考察
- どう考えてもgetWhat()とwhatの値が違うのはおかしい
- たぶんOWNER_FIRST（デフォルトのまま）なクロージャの挙動が間違っている
- OWNER_FIRSTだろうがDELEGATE_FIRSTだろうがdelegate同士なら近いほうが優先されるべきだと思う（つまり"hello"が間違っていて"bye"は正しい）

一応 https://issues.apache.org/jira/projects/GROOVY/issues/ を眺めてみたけど、それっぽいものは見当たらない。まさかこれが仕様ではないと思うのですが。
#Rails + rails console の pry でエラー情報が少なすぎて辛いのでスタックトレースを表示する様にする設定例

`config/initializers/pry.rb`

```rb
Pry.config.exception_handler = proc do |output, exception, _pry_|
  output.puts "#{exception}"
  output.puts "#{exception.backtrace}"
end
```

[Exceptions · pry/pry Wiki](https://github.com/pry/pry/wiki/Exceptions#Exception_handler)

# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2765








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Atcorder 茶色問題集 part1

##これから
茶色の問題が解けなくて、レートに伸び悩んでいたので茶色の問題一掃します。
問題傾向を分析してみる。


#二分探索＆関数設定　問題
**ABC146 C問題**
https://atcoder.jp/contests/abc146/tasks/abc146_c


```c++
#include <bits/stdc++.h>
#define rep(i,n) for (int i=0; i<(n); i++)
using namespace std;
typedef long long ll;

int main(){
    ll a,b,x; cin >> a >> b >> x;
    ll left=0;//条件満たす！
    ll right=1e9+1;//条件満たせてない！

    //keta(mid)
    auto keta=[&](ll mid){
        int res=0;
        while(mid){
            mid/=10;
            res++;
        }
        return res;
    };
    
    //f(mid)
    auto f=[&](ll mid){
        return a*mid+b*keta(mid);
    };
    
    //二分探索
    while(right-left>1){
        ll mid=(right+left)/2;
        if(f(mid)<=x) left=mid;
        else right=mid;
    }
    cout << left;
}
```

#関数設定問題（等差数列）
**ARC099 C問題**
https://atcoder.jp/contests/arc099/tasks/arc099_a

```c++
#include <bits/stdc++.h>
#define rep(i,n) for (int i=0; i<(n); i++)
using namespace std;
typedef long long ll;

int main(){
    int N,K; cin >> N >> K;
    vector <int> A(N);
    rep(i,N) cin >> A[i];
    
    //等差数列の方程式
    auto f=[&](int x){//xは項数
        return 1+(x-1)*(K-1);
    };
    
    int ans=0;
    int x=1;//初項
    while(1){
        if(f(x)>=N) break;//末項超えたら終了
        ans++;
        x++;
    }
    cout << ans;
}
```
#文字列操作問題
**AGC006 A問題**
https://atcoder.jp/contests/agc006/tasks/agc006_a

```c++
#include <bits/stdc++.h>
#define rep(i,n) for (int i=0; i<(n); i++)
using namespace std;
typedef long long ll;

int main(){
    int N; cin >> N;
    string S; cin >> S;
    string T; cin >> T;
    ll ans=0;
    
    rep(i,N+1){
        if(S.substr(i,N-i)==T.substr(0,N-i)){ 
        //文字列.substr(開始位置, 取り出す長さ)
            ans=i+N;
            break;
        }
    }
    cout << ans;
}
```
PowerShellで躓いた点をまとめてみた。

## 導入
Windowsユーザしかいないプロジェクトで簡単な効率化・自動化ツールを作るのに、環境構築が不要で配布が容易だというズボラな理由でPowerShellを採用することが増えてきています。
PowerShellでシコシコ書く中で筆者が躓いた点（どれも初歩的な部分のみですが・・）をここに纏め、自分が見返すため／同じところで躓く方のために役立つことができれば幸いです。

## 前提
- Windows 10 Enterprise
- PowerShell  5.1

## 躓いた点一覧

### PowerShell実行ポリシーを掻い潜る

- 実行用batを用意し一時実行ポリシーを適用してPowerShellを起動する。

	```powershell
	@echo off
	powershell -NoProfile -ExecutionPolicy Unrestricted .\hoge.ps1
	exit
	```



### 文字列などの変数のNullまたは空文字を確認する

- .NET的にStringのIsNullOrEmptyを使う

   ```powershell
   PS > $foo = "bar"
   PS > [String]::IsNullOrEmpty($foo)
   False
   ```

- 変数をboolにキャストする( IF文の条件式は単純に変数を入れる)

   ```powershell
   function CheckNullOrEmpty($param){
   	#変数を入れるだけ
   	if($param){
   		"param is not null or empty"
   	}else{
   		"param is null or empty"
   	}
   }
   
   $StringNull = $null
   $stringEmpty = ""
   $stringNotEmpty = "something"
   $intNotEmpty = 100
   
   CheckNullOrEmpty $stringNull		#->param is null or empty
   CheckNullOrEmpty $stringEmpty		#->param is null or empty
   CheckNullOrEmpty $stringNotEmpty	#->param is not null or empty
   CheckNullOrEmpty $intNotEmpty		#->param is not null or empty
   ```



### PowerShellでのClass定義分離

PowerShellでClassを使っていると定義ごとに物理的分離したくなる...

- base Classをpsm1(モジュール)化する

	```powershell
	class BaseClass {
		[string] hoge(){
			return "This is Base Class !!"
		}
	}
	```

- psm1 をusing moduleで読み込む
  ※ using module は**<u>コメントを除くスクリプトの先頭に書かなくてはならない制限がある</u>**ため注意

	```powershell
	# include base class
	using module ".\base.psm1"

	class SubClass : BaseClass {
		[string] pyo(){
			return "This is Sub Class !!"
		}
	}
	```

- ps1 は . で読み込む

	```powershell
	# include class
	. ".\sub.ps1"

	$TestObject = New-Object SubClass

	$TestObject.hoge()
	```

## 参考
> Windowsにまつわるe.t.c.
> http://www.vwnet.jp/Windows/etc.asp#PowerShell

## あとがき
躓き次第（悲しい書き方ですが・・・）随時アップデート予定です。
誤り、もっとスマートなやり方等あれば指摘いただけると幸いです。
[UE4] TextureのNever Streamの動的変更について

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/07e1ac42-0874-407d-2020-14a57ea66f6c.png)

TextureにはNever Streamという、そのTextureをStreamingさせるかさせないかを設定するフラグがあります。しかし、この設定はそのテクスチャを初回ロードする際しか考慮しません！つまり、最初Streamされていたテクスチャを、「このカットシーンだけはちゃんと全部読み込んでおいて。。。。。」とかの理由で動的にNever Streamに変更しても更新されません！

じゃあどうするか？？？ですが、アクター単位で、そのアクターが持つマテリアルに紐づくてテクスチャをすべて優先的に読み込むPrestream Textueresや、マテリアル単位で読み込むSetForceMipLevelstobeResidentというノードがあります。こちらを使うと事前読み込みが可能となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363464/7ce6c73b-9b63-e0ca-39f1-0f888de52d98.png)

ただし、こちらは事前読み込みをリクエストしますが、そのストリーミングがカットシーンなどの前に終わるのを**確実に待つ**ということはできません。これを行うのはなかなか難しく、本当に行いたい場合は現状ではFStreamingManagerTexture::BlockTillAllRequestsFinished()などの関数の独自改良が必要になるかもしれません。
C++ クラスメンバの初期化（const変数がメンバに存在する場合）

C++のクラスメンバーの初期化でよく忘れるのでメモ

##問題
例えば下記のようなクラスがある場合：

```cpp
class Sample {
  public:
    Sample(int a, int b) {
      var_a = a;
      var_b = b;
    }
  private:
    int var_a;
    const int var_b;
};
```

上記はSampleコンストラクタにて初期化する際にエラーになります。
なぜなら`var_b`は`const`で定義されているため、値を変更することはできません。

##じゃあどうするの
メンバ初期化リスト(member initialization list)を使用して値をアサインします。
これを使うことで上記のようにコンストラクタの変数アサインロジックを排除できます。
これが結構文法的に忘れやすいので今回メモっておこうと思いました。

```cpp
class Sample {
  public:
    Sample(int a, int b):var_a(a), var_b(b) {}
  private:
    int var_a;
    const int var_b;
};
```

1. 初期化リストはコンストラクタパラメータの後に`:`で定義する
2. それぞれのメンバ関数は`,`で区切る
3. 初期化リストは`;`で終了しない

*別にconstメンバがいない場合でも初期化リストは使えます。行数省きたいときは使用推奨？
\(._. \)わっしょいって感じの正規表現と向き合う

# はじめに
`\(._. \)`
正規表現がわからなすぎてちょっとイライラしていたところに友人からちょうどこの顔文字が送られてきたからイラッとした。
これも正規表現になりうるのだろうけど、読めない。。

正規表現なんて使用する場面になったらその都度調べればよいだろう。
どこかでそんな心構えでやってきたのですが、いざ使う場面に出くわすと、前提知識が無さすぎて中々しんどい。

とは言っても、一時的に大量に覚えたところですぐに忘れてしまうだろうから基礎の基礎から少しずつ試しに使っていくことにする。

# 超基本的な正規表現で電話番号を捉える
下記を例とする。電話番号の部分だけを抽出するにはどうするかを考えてみる。

```
会社名： 株式会社XXX
住所： 東京都港区南麻布1-1-1
本社： 03(2345)6789
携帯番号： 080-1234-5678
フリーダイヤル： 0120(000)000
緊急： 01234-5-6789
```

## 共通点や異なる点の確認
① 3つに区切れる
② 2〜5桁、1〜4桁、3〜4桁の構成
③ 区切りはカッコ、またはハイフン
④ 1文字目は0、2文字目は0以外の半角数字

## 文字数範囲の指定
・ `\d` ... 1個の半角数字（0123456789）
・`{n,m}` ... 直前の文字が n 個以上、m 個以下

ゆえに、3〜4桁の数字は`\d{3,4}`と表現する。

## AまたはB
・ `[AB]` ... AまたはBのいずれか1文字

ここまでの情報で、
`\d{2,5}[-(]\d{1,4}[-)]\d{3,4}`
とすれば、共通点や異なる点の①〜③をクリアできる。

```.rb
text = <<-TEXT
会社名： 株式会社XXX
住所： 東京都港区南麻布1-1-1
本社： 03(2345)6789
携帯番号： 080-1234-5678
フリーダイヤル： 0120(000)000
緊急： 01234-5-6789
TEXT

text.scan /\d{2,5}[-(]\d{1,4}[-)]\d{3,4}/
=> ["03(2345)6789", "080-1234-5678", "0120(000)000", "01234-5-6789"]
```

## 例外に注意する
今のままだと以下のような例外も当てはまってしまう。

```.rb
text = <<-TEXT
会社名： 株式会社XXX
住所： 東京都港区南麻布1-1-1
本社： 03(2345)6789
携帯番号： 080-1234-5678
フリーダイヤル： 0120(000)000
緊急： 01234-5-6789

例外１: 999-9999-999
例外2: 0120-000)000
TEXT

text.scan /\d{2,5}[-(]\d{1,4}[-)]\d{3,4}/
=> ["03(2345)6789", "080-1234-5678", "0120(000)000", "01234-5-6789", "999-9999-999", "0120-000)000"]
```

まず、1文字目は0、2文字目は0以外の半角数字に対応させるには
`0[1-9]\d{0,3}[-(]\d{1,4}[-)]\d{3,4}`とすればよい。

※ -（ハイフン）は位置によって意味が変わる。 
・`[1-9]` ... 1または2または3、、、、または9
・`[19-]` ... 1または9または-
 
## grepメソッドを使用する
Rubyで使用できるものですが、grepメソッドを用いる。
・ `grep` ... 各要素に対して「引数obj === 要素」を試し、その結果が真だった要素を集めて配列にして返す
grepメソッドの引数を正規表現にすると、パターンにマッチする文字列を集められるので、これを利用する。

使用する正規表現を確認
・ `|` ... or
・ `\` ... エスケープ
・ `+` ... 直前の１文字の１回以上の繰り返しを表す

`（）`はグループ化を表現してしまうので、`\`でエスケープする必要がある。
`\d+`で数字が続くことを表現できる。

`0120-000-000 または 0120(000)000`を表現するには、
`\(\d+\)|-\d+-`となる。

```.rb
text = <<-TEXT
会社名： 株式会社XXX
住所： 東京都港区南麻布1-1-1
本社： 03(2345)6789
携帯番号： 080-1234-5678
フリーダイヤル： 0120(000)000
緊急： 01234-5-6789

例外１: 999-9999-999
例外2: 0120-000)000
TEXT

before = text.scan /0[1-9]\d{0,3}[-(]\d{1,4}[-)]\d{3,4}/
=> ["03(2345)6789", "080-1234-5678", "0120(000)000", "01234-5-6789", "0120-000)000"]
after = before.grep(/\(\d+\)|-\d+-/)
=> ["03(2345)6789", "080-1234-5678", "0120(000)000", "01234-5-6789"]
```
例外を出しだすときりがないですが、とりあえず正規表現を用いて目的のものを抽出できました。

# おわりに
正規表現を勉強する前は、
`0[1-9]\d{0,3}[-(]\d{1,4}[-)]\d{3,4}`,`\(\d+\)|-\d+-`
これらが暗号の羅列にしか見えなかったものが読めるようになりました。

ついでに`\(._. \)`こいつについて
`.` ... 任意の文字
であるから`(の_g )`とかの 正規表現になるわけですね。

顔文字か正規表現かを見破るアプリゲームとかいいかもしんないですね。

最低限の基礎があれば初見の正規表現に対しても少し調べれば読み解くことができそうなので、最低限を身につけるためにもう少し正規表現を勉強していく必要がありそうです。

# 参考

[初心者歓迎！手と目で覚える正規表現入門・その１「さまざまな形式の電話番号を検索しよう」](https://qiita.com/jnchito/items/893c887fbf19e17d3ff9)