OmniAICreator/Qiita-1.07M huggingface dataset:
jQueryモーダルウィンドウをリファクタリング

半年前の自分が書いたjQueryで動くモーダルウィンドウをリファクタリングしてみました。

リファクタリングにあたっては以下のポイントを意識しました。

1. 機能とデザインの分離 : スタイルに関することは達成可能な限りJSではなくCSSにやらせる
2. パフォーマンスを意識 : JSによるDOM操作、アニメーション系メソッドなど重い実装を排除する
3. アクセシビリティを意識 : マウスだけでなくキーボード操作を可能にする
4. アンチパターンを排除 : 3.のキーボード操作実装にあたって、同じ記述の繰り返しを避ける（DRY原則）

というわけで完成したモーダルはこちらです。

<p data-height="560" data-theme-id="0" data-slug-hash="PROpLV" data-default-tab="css,result" data-user="h_kudo" data-embed-version="2" data-pen-title="jQuery Modal" class="codepen">See the Pen <a href="https://codepen.io/h_kudo/pen/PROpLV/">jQuery Modal</a> by Hibiki Kudo (<a href="https://codepen.io/h_kudo">@h_kudo</a>) on <a href="https://codepen.io">CodePen</a>.</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

動きも軽快でキーボードでも操作できる。いい感じです。
以下簡単に説明です。

### 機能とデザインの分離 : スタイルに関することは達成可能な限りJSではなくCSSにやらせる
従来モーダルの中央寄せはJSで計算して描画していましたが、中央寄せはCSSだけで実装できます。またその他のスタイル実装においても`.css`メソッドを使わず、なるべく`.addClass`, `.removeClass`メソッドを用いてCSSクラスを変更する形にします。

```javascript:before.js
$(window).resize(centeringModal);
function centeringModal() {
  var width = $(window).width();
  var height = $(window).height();
  var cWidth = $("#modal-content").outerWidth();
  var cHeight = $("#modal-content").outerHeight();

  $("#modal-content").css({
    left: (width - cWidth) / 2 + "px",
    top: (height - cHeight) / 2 + "px"
  });
}
```
↓

```CSS:after.css
.modal__content{
  width: 500px;
  min-height: 220px;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
```

### パフォーマンスを意識 : JSによるDOM操作、アニメーション系メソッドなど重い実装を排除する
従来は`.append`, `.remove`メソッドを使ってモーダル背景を直接DOM操作していましたが、これはパフォーマンス的に重いので思い切ってHTMLにモーダル背景を置きっぱなしにし、この表示・非表示を切り替えるのみにする形にしました。
また、処理の重い`.fadeIn`, `.fadeOut`などのアニメーション系メソッドを非使用とし、アニメーションはもっぱらCSSの`transition`プロパティにやらせます。

```javascript:before.js
$( "#modal-content" ).fadeIn();
```
↓

```javascript:after.js
$( "#modal-content" ).addClass(".is-visible");
```
```CSS:after.css
.modal__content.is-visible{
    opacity: 1;
    visibility: visible;
    transition:visibility .3s ease, opacity .3s ease;
    z-index: 1002;
}
```
### アクセシビリティを意識 : マウスだけでなくキーボード操作を可能にする
基本的には`.on`イベントに`.click`だけでなく`.keydown`を追加するだけなので意外と簡単。
他には`tabindex`属性をこねこねしたり`.focus`,`.blur`メソッドを使って、キーボードユーザーのユーザビリティを高めています。
モーダル・オーバーレイは置きっ放しにするためスクリーンリーダー・ユーザーなどにとって邪魔な要素となりますが、`role="presentation"`、`aria-hidden="true"`を追記することでアクセシビリティを担保させています。

```javascript:afterVer1.js
const $modalOpen = $(".js-modal-open");

$modalOpen.on("click", function(e) {
  /* 処理 */
});

$modalOpen.on("keydown", function(e) {
  if (e.keyCode === 13) {
    $(this).trigger("click");
  }
});
```
### アンチパターンを排除 : 3.のキーボード操作実装にあたって、同じ記述の繰り返しを避ける
キーボード操作を追加するだけなら確かに簡単でしたが、上記のafterVer1.jsでは`.on`メソッドを繰り返し書いてしまっています。連想配列を使ってよりすっきりと記述することができました。

```javascript:afterVer2.js
const $modalOpen = $(".js-modal-open");

$modalOpen.on({
  click: function() {
    /* 処理 */
  },
  keydown: function(e) {
    if (e.keyCode === 13) {
      this.trigger("click");
    }
  }
});
```

## 所感

- パフォーマンスは体感的に向上してるんですが、今回ちゃんと計測してません（次こそは）。
- CodePen埋め込み良い。
- 我々がその気になればjQueryもモダンを意識して書くことは可能…ということ！

精進します。
Linuxでマルチプロセスなスクリプトをサクッと作る！

## 背景
数万件のバッチ処理を回したいのだけど、シーケンシャルにしか処理されず時間がかかってしょうがないってことありますよね。
自分はこの前そうでした。
手っ取り早くマルチプロセスにするためのバッチを書いたら思いのほか使い勝手が良かったのでこちらにメモって置くことにします。

## 環境
Centos7
Perl5.x

## やりたいこと
- 数万件のデータ処理
- 1件の処理自体はコマンド一発
- 入力データは1ファイルに纏めて、各プロセスが参照されるようにしたい
- 非エンジニアでも簡単にプロセス数を調整したい
- 個人的な趣味によりPerlで実装したけどなんでも良い

## アプローチ
`bash`でマルチプロセス処理をさせる簡単な方法は`&`を使ってバックグラウンド処理させたり、`xargs -P`を使う方法があるけど、今回は入力データは1ファイルにまとめておきたく、ロック処理が必要なため手組みで実装することにした。

処理としてはシンプルで
1. ロックフォルダを作成する
2. インプットファイルからデータを読み込む
3. 読み込んだデータをインプットファイルから削除する
4. ロックフォルダを削除する
5. 読み込んだデータを処理する

という流れ


## で、作った雛形がこれ
Perlで書いてるけどなんでも良いと思う。

``` process.pl
#!/usr/bin/perl
use strict;
use Time::HiRes qw/sleep/;
use feature 'say';

my $lock="lock";
my $input="input.txt";
my $n=10;
my $waitTime=0.2;

while(1){
    # create lock folder
    if( system("mkdir $lock &> /dev/null") ){
        say "wait...";
        sleep $waitTime;
        next;
    }

    # read the first $n rows.
    my @list= split("\n", `head -n $n $input`);

    # remove the read line
    `sed -i -e '1,${n}d' $input`;

    # unlock
    `rmdir $lock`;

    # program exit if the read rows is empty
    if( int @list == 0 ){ last; }

    # process the read rows
    foreach my $line (@list){
        unless( $line =~ /\S/ ){ next; }
        chomp $line;
        $line =~ s/(^")|("$)//g;

        my @cmd_parts = ();
        push( @cmd_parts, 'curl -s' );
        push( @cmd_parts, '-X DELETE' );
        push( @cmd_parts, "'http://xxx.xxx.xxx.xxx/$line'" );

        my $cmd = join( " ", @cmd_parts);
        my $result = `$cmd`;
        say $cmd;

    }

sleep 5;
}
```


## 使い方
`input.txt`に処理するデータを改行区切りで格納しておく。
あとは `perl process.pl >> app1.log &`って感じでバックグラウンド実行する。多重度を上げたかったらログ出力先を`app2.log`、`app3.log`と変えて同じコマンドを実行していく。
ログ出力先が同じでも動作するけど、複数のプロセスが1つのファイルとIOするとIO競合が発生してログの欠損などがでるので別にするのが安全。
fishshellのインストール

## はじめに
やっぱりshellといったらfish!!!

## fishのインストール
- `brew install fish`
    - fishシェルのインストール

## ログインシェルの変更
- `sudo vi /etc/shells`
    - ログインシェルの変更
- `/usr/local/bin/fish`
    -  最後の行に追加
-  `chsh -s /usr/local/bin/fish`
    -  変更

## Fishermanのインストール
- `curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs https://git.io/fisher`
    - インストール

## テーマのインストール
- `fisher omf/theme-bobthefish`
    - bobthefishのインストール

## Powerlineフォントのインストール
- `git clone https://github.com/powerline/fonts.git`
- `cd fonts`
- `./install.sh`
- `cd ../`
- `rm -rf fonts`

## Draculaのインストール
- `git clone https://github.com/dracula/iterm.git`
    - インストール
- `cd iterm`
- `open ./Dracula.itermcolors`

## オートコンプリートの設定
- `fish_update_completions`
    - manをもとに
スクリプト テンプレート 

FileMaker Pro16 Advancedのスクリプトワークスペースの使い勝手は改善されてきたとはいえ、まだまだ他の言語のIDEに比べると、まだまだ大変・・・


##スクリプトのテンプレート例
スクリプトのテンプレート例です。
これをコピーして、新しいスクリプトを作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/132059/8214d8fd-3ea9-d72e-403f-24249bfe708d.png)

Created : 作成日・作成者
Updated : 更新日・更新者
Summary	: 概要
Params : Parameters。パラメータや引数について
Return : 返値について
Global : Global Variables。グローバル変数
Caller : 呼び出し元のスクリプト、ボタンなど
Comments : コメント
History : 更新履歴

----------Initialize----------
初期化。
スクリプトに共通する処理

----------Parameters----------
パラメータ・引数の処理。

----------Valid----------
引数の整合性のチェックなど
実行前に条件が整っていなければ終了など

----------Action----------
実行

##その他
- テンプレートの最初のコメント部分の用語には、分かりやすくて短いものが認識しやすいという考えです。例えば、項目名を、Global Variablesとせずに、Globalとしているのは、Globalだけで分かるからです。

- スクリプトの、UI Browse-NoRecords-Commit はブラウズモードでなければ終了。レコードがなければ終了。レコードがコミットできなければ終了。
参考
http://notonlyfilemaker.com/2015/05/filemaker-scripting-best-practices-and-conventions/
[WordPress] WP Simple Related Posts で関連記事にアイキャッチ画像や抜粋をつけたい

# WP Simple Related Posts
https://ja.wordpress.org/plugins/wp-simple-related-posts/

* カテゴリやタグをベースとした関連記事を出すプラグイン。
* 投稿編集時に任意の記事に置き換えることもできる。
* 自動で本文の最後に表示される（表示項目は記事のタイトルとリンク）

かつアイキャッチ画像や抜粋をよしなに表示したい場合のカスタマイズ

# 関連記事のID取得
[GitHub](https://github.com/horike37/Simple-Related-Posts)に説明ある通り。パラメーターはよしなに。

```php
<?php
$ids = sirp_get_related_posts_id();
```

戻り値が連想配列なので注意

```
array(3) {
    [0]=> array(1) {
        ["ID"]=> string(4) "7763"
    }
    [1]=> array(1) {
        ["ID"]=> string(4) "7757"
    }
    [2]=> array(1) {
        ["ID"]=> string(4) "7753"
    }
}
```

# アイキャッチ画像や抜粋の表示
アイキャッチ画像は投稿IDを渡して取得できるが、抜粋（ `the_excerpt()`, `get_the_excerpt()` ）はループ外で使えない＝投稿IDを渡してもグローバル変数の　`$post`　を参考にしてしまうので、関連記事のIDで forearch するのではなく、`WP Query`クラス（または `get_posts()` ） で処理しましょう。

htmlタグとかはよしなに変更してください。

```php:my_simple_related_posts.php
<?php
function my_simple_related_posts() {

	// プラグインが有効化されてなかったら関数がないってことなので終了
	if ( ! function_exists( 'sirp_get_related_posts_id' ) )
		return;

	$related_posts_ids = sirp_get_related_posts_id();

	// 関連記事IDがなかったら終了
	if ( empty ( $related_posts_ids ) )
		return;

	// WP_Query クラスに渡す為にsirp_get_related_posts_id()の戻り値をよしなに変更
	$ids = array();
	foreach ( $related_posts_ids as $related_posts_id ) {
		$ids[] = $related_posts_id['ID'];
	}

	if ( empty ( $ids ) )
		return;

	// 配列を整形した投稿IDを元に投稿を取得
	$related_posts = new WP_Query( array(
		'posts_per_page' => -1,
		'post__in'       => $ids,
		'order'          => 'ASC',
		'orderby'        => 'post__in'
	) );
	if ( $related_posts->have_posts() ) {
		echo '<h3>関連記事</h3>';
		echo '<ul>';
		// ループ開始
		while ( $related_posts->have_posts() ) {
			$related_posts->the_post();
			echo '<li>';
			echo '<a href="' . get_the_permalink() . '">';
			if ( has_post_thumbnail() ) {
				the_post_thumbnail( 'thumbnail' );
			}
			the_title( '<h4>', '</h4>' );
			echo '<div class="excerpt">';
			the_excerpt();
			echo '</div>';
			echo '</li>';
		} // ループ終わり
		echo '</ul>';
	}
	wp_reset_postdata();
}
```

現場からは以上です。
UE4でグローバル変数の設定方法

UE4でグローバル変数を扱うための設定方法を備忘録として残します。
グローバルで値を保持できるメリットは以下の通り

- レベル間の値保持
- プレイヤーのステータス管理とか

# 設定方法

1. ブループリントを```Game Instance```クラスで作成する。
![step1.jpg](https://qiita-image-store.s3.amazonaws.com/0/231897/02aba296-4d98-738d-2d34-d65923dbe310.jpeg)

2. メニューバーの```編集```→```プロジェクト設定```を選択、```マップ&モード```の```Game Instance```に作成したブループリントを設定する。
![step2.jpg](https://qiita-image-store.s3.amazonaws.com/0/231897/0703430b-19ab-577d-57b3-049c0a1c4637.jpeg)

3. 作成したブループリントを開いて、グローバルにしたい関数や変数とかを好きに定義する。
![step3.jpg](https://qiita-image-store.s3.amazonaws.com/0/231897/06c6f588-4f26-4097-faad-e53064698d42.jpeg)

4. 呼び出したいときは、以下のように呼び出す。
![step4.jpg](https://qiita-image-store.s3.amazonaws.com/0/231897/979d6d0c-e6d8-0b40-c589-43b4c71592a2.jpeg)

以上、キャストしないと使えないけど、まぁ使いどころを考えれば便利かと思われる。
auひかりでAsteriskを利用する

#はじめに
##auひかりではAsteriskを使えない？
私はauひかりを契約しています。貸与されたRouterを設定していてびっくりしました。裏設定で 5060/udp (sip) が内部電話ポートに固定され、LAN に出すことができないのです。これでは Asterisk (PBX) を使って IP-Phone網 を構築することができません。
##抜け道はある
しかし[Express Talk](http://www.nch.com.au/talk/jp/index.html)を一度 install するとその後 Router を工場出荷時に戻さない限り、Asterisk が使えるようになることに偶然気付きました。なにがしかの設定をuPnPで行っている模様です。「一縷の光」を求めて何を設定したのか調べたのですが何も見えません。[Express Talk](http://www.nch.com.au/talk/jp/index.html)を作った[NCH Software](https://www.nchsoftware.com/jp/index.html)に聞いても「教えられません。」と冷たい返事でした。
#auひかりでAsteriskを使った記事を発見
やればできるという事は分かったので慎重に検索を繰り返しました。すると[「CuBox-i2」にArchLinuxをインストールしてAsteriskを稼働する](http://blog.jikoman.jp/2014/09/cubox-i2-archlinux-asterisk.html)というページを見つけました。私と動作環境は全く異なりますが、やってみると繋がるではないですか！
#動作確認環境
私の動作環境は秋の通りです。

* Raspbian 4.9.80-v7+
* Asterisk 13.14.1~dfsg-2+deb9u3
* Raspberry Pi 3 model B
* Fusion IP Phone smart

の環境下です。
#設定
設定はとても簡単です。
sip.confの\[general\]に以下の設定を追加します。

```/etc/asterisk/sip.conf
bindport=5062 # default 5060
nat=yes
```

ルーターの設定変更はありません。
設定を変更したらAsteriskをrestartします。
# 結論

* auひかりでもasteriskは使え、呼にも対応可能
* 5060/udpがふさがっている場合は重ならない代替Portを使えばよい。
* Fusion IP Phone Smart はAsteriskが登録に行った時のip_adderss:portで呼び出す。
MacでVB.NET

たまに見てくれる人がいるようなので更新してみましたが、エラーが出なくなったので記事の価値が無くなってしまいました:innocent:

# Install

* [Visual Studio for Mac](https://www.visualstudio.com/ja/downloads/)をインストール。
 * Visual Studio Community 2019 for Mac Version 8.7.4 (build 38)
 * .NET Core SDK 3.1.401
 * macOS Catalina (10.15.6)

# Build & Execute

* 新しいプロジェクトで、.NETのコンソールプロジェクト(VBNet)を作成。
 * プロジェクト名は`VBNetOnMac` 
* ビルド
 
```
ソリューション VBNetOnMac をビルドしています (Debug|anycpu)
2020/08/28 10:33:44 にビルドを開始しました。
__________________________________________________
プロジェクト "/Users/*****/projects/VBNetOnMac/VBNetOnMac/VBNetOnMac.vbproj" (Build ターゲット):
（中略）
========== ビルド: 成功 1、失敗 0、最新の状態 0、スキップ 0 ==========

ビルドに成功しました。
```

* 実行
 
```text
Hello world!
```

* Gtk# 2.0

![gtk.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18828/6cae4afd-5ee2-4549-151b-ab6344854f2e.png)
javascript : on()でのアクションの指定は必要なのか

とある教材では
下記のようなアクションの指定を推奨している

```
$(function() {
  $("#title").on("click", function() {
    console.log("クリックされました");
  });
});

```
on()をしようしてわざわざアクションを指定している


しかし、私は下記のように書いてしまうが、どちらが正しいのか

```
$(function(){
$("#title").click(function(){
 alert("クリックされました");
  });
});
```

on()を使用してアクションを指定するのと指定しないで
アクションをそのまま記載するのはどちらが有効なのか
Surface Pro 4にUbuntu 16.04 LTSを導入する

この手の環境構築チュートリアルは検索すればたくさん出てくるのですが、
情報が新しいほうが良いだろうということで、全く気にせずに投稿します。

# 用意するもの
Surface Pro 4
USBメモリ(4GB↑がベター)
Microsoftのアカウント + Bitblockerの解除パス

# 環境
- Surface Pro 4
  - 春のキャンペーンで購入
  - Core i7, 8GB RAM, SSD 256GB 
  - Signature Type Coverをセットで購入
  - ペンは買いませんでした(そのうち。)

- Ubuntu
  <code>
  $ cat /etc/os-release
  </code>

```txt:/etc/os-release
  ME="Ubuntu"
  VERSION="16.04.4 LTS (Xenial Xerus)"
  ID=ubuntu
  ID_LIKE=debian
  PRETTY_NAME="Ubuntu 16.04.4 LTS"
  VERSION_ID="16.04"
  HOME_URL="http://www.ubuntu.com/"
  SUPPORT_URL="http://help.ubuntu.com/"
  BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
  VERSION_CODENAME=xenial
  UBUNTU_CODENAME=xenial
```

# 手順
1. ROMを入手する
https://www.ubuntu.com/download/desktop
日本語公式サイトから入手することができますが、 Kernelが古いのか **TypeCoverキーボードが動かない** ので、英語版の公式サイトからisoを落とすことをおすすめします。

2. USBに.isoファイルを書き込む
自分は [UNetbootin](https://osdn.jp/projects/sfnet_unetbootin/) を使いました。.isoを書き込めるアプリケーションであればどれでもいいような気がします。
USBはFAT32でフォーマットしましょう(UNetbootinを使う場合)。

3. パーティションを確保する
左下のWindowsアイコンを右クリックし、「デバイスの管理」→ Cドライブを選択し、「パーティションを分割する」
適当な大きさを確保しましょう。25GB以上を確保することを推奨されています。
>Recommended system requirements:<br/>
 ☑ 2 GHz dual core processor or better
 ☑ 2 GB system memory
 ☑ 25 GB of free hard drive space
 ☑ Either a DVD drive or a USB port for the installer media
 ☑ Internet access is helpful<br>
 https://www.ubuntu.com/download/desktop

4. Bitblockerを解除する
BitblockerはUEFIブートにおいて、悪意のある第三者にCドライブの中身を取り出されないようにする機能ですが、これを有効にするとUbuntu→Windowsと切り替える際に常にBitblockerが働いてWindowsにログインできないため切ってしまいましょう。
スタートメニューを開いて「control」と入力しコントロールパネルを開く。
表示形式をアイコンに変更して、先頭のBitblockerの設定を選択することで解除できます。
Cドライブに色々入っていると解除に時間がかかるようなので、なるべく早めにやっておくと○
- - -
外出先でセキュアブートにしたい場合は下記のURLが参考になりそうです。
https://www.abten.net/2017/02/925/

5. セキュリティブートの設定を変える
設定→更新とセキュリティ→回復ブートを変更するを選択するか、
再起動 or 起動時のWindowsロゴが出てる画面で本体ボリュームキーの＋を押すことでUEFIブートに入れます。
セキュリティブートをMicrosoft OnlyからMicrosoft & 3rd Party CAに変更する。
(Surface Pro 3でNoneを選択させるページがありますが、4だとUbuntuを入れるなら3rd Party CAでも大丈夫です)

6. Boot ConfigurationをUSB Storageに優先させる
UEFIブートの左側のタブにある「Boot Configuration」を選択すると起動ブートを選択できる項目があるため、
"USB Storage"のみにチェックを入れるか、USB Storageをタップしてスワイプし、一番上に移動させることでUSBからのBootができるようになります。
Advance optionsに"Enable Boot from USB devices"がOnになっていることを確認する(通常はOnになっているはずです)。

7. Ubuntuを起動・インストールする
USBを装着し、Ubuntuを起動。
"Using Ubuntu without Setup" か "Installing Ubuntu"を選択。
どちらの選択肢でもType Coverキーボードが適切に動いているはずなので、あとはインストーラに沿ってインストールを進めていけば問題ないです。
インストールの種類は
『Ubuntu を Windows Boot Manager とは別にインストール』を選択。
『グラフィックス、Wifi機器、Flash...』にチェックを入れる。
で問題ありませんでした。


あとは自分のやりたい言語などのインストールを行いましょう！

# 補足
+ Ubuntuインストール後、Windows側の内部時計が9時間ズレてしまう<br>
WindowsがJST時刻で設定されているのに対して、UbuntuがUTC時刻で設定されているため。<br>
下記コマンドを実行し、再起動することで正しく時計が設定されるようになります。<br>
　　`sudo timedatectl set-local-rtc 1`<br>
参考：http://yukihane.hatenablog.com/entry/201605/ubuntu16.04-datetime
No such module"Alamofire"の対処記録


CocoaPodsでAlamofireをインストールしたら`No such module"Alamofire"`のエラーが出たので、その時の対処記録を残しておく。

###Xcodeのバージョンが7.2以上か確認する

http://noob-programmer.hatenablog.com/entry/2016/04/08/135507

###frameworkが追加されているか確認する
flameworkをcocoapodsが自動で読み込んでない場合があるので、設定のGeneralで手動設定する
http://vdeep.net/xcode63-cocoapods-alamofire-swiftyjson#AlamofireNo_such_module8221Alamofire8221


###クリーンビルドする
Cmd+Shift+K、もしくはメニューからProduct>Clean Build Folder

###DerivedDataを消す
Xcode>Preference>Locations>Derived Dataのパスの「→」ボタンから該当のディレクトリを開けるので「DerivedData」ごと消す（ビルドしなおすと復活します。Xcodeのトラブル対処の定番です）。
https://teratail.com/questions/30441

###xcworkspaceで開いているか確認する
https://www.reddit.com/r/swift/comments/7snw8f/alamofire_issue_no_such_module_alamofire/

##Buildは成功するが、エラーが消えない場合
Cannot load underlying module for "Alamofire"と出たりする。
ビルドしたら治る場合もあるらしいが、消えない場合は、ビルドしてからXcodeを再起動すると治りました。
https://qiita.com/s_emoto/items/f5c83f4e3d8809ddf6b9
Cloud9で環境構築後にCost-saving settingを変更する方法

Cloud9で環境を作成後に処理を停止しないようにCost-saving settingを変更したくなったことがあったので、変更方法をメモします。
Cloud9を開きっぱなしにしていると止まってしまうという方で、やり方がわからない方はここの設定を変更すると幸せになれるかもしれません。（AWS費用はかかるかもしれませんが・・・）

#1.変更したい環境のIDEを開く
IDEを開きましょう。
![スクリーンショット 2018-03-27 12.25.59.png](https://qiita-image-store.s3.amazonaws.com/0/227408/99b27930-3e60-d913-e144-be1737f9a0cc.png)

#2.画面右上の設定ボタン（歯車）を押しましょう
![スクリーンショット 2018-03-27 12.27.14.png](https://qiita-image-store.s3.amazonaws.com/0/227408/78066c6c-b341-63eb-1fe9-8158bf65c51a.png)

#3.Stop my environmentの設定を変更しましょう
EC2 InstanceにStop my environmentという設定があります。
環境を作成するときにはCost-saving settingでしたが、作成後はこちらのパラメータに変更されているようです。
お好みの設定に変更してください。

![スクリーンショット 2018-03-27 12.28.17.png](https://qiita-image-store.s3.amazonaws.com/0/227408/60773eec-b5c0-1dd8-5867-321591f49a14.png)
Selenium::WebDriver::Error::UnknownError: unknown error: unknown sessionId への対応

Capybara + Selenium WebDriver + Chrome で E2E テストをしていて、下記のエラーが発生したので対応した。

```
Selenium::WebDriver::Error::UnknownError:
  unknown error: unknown sessionId
    (Session info: headless chrome=65.0.3325.162)
    (Driver info: chromedriver=2.36.540469 (1881fd7f8641508feb5166b7cae561d87723cfa8),platform=Mac OS X 10.12.6 x86_64)
```

## 環境

* macOS Sierra（Mac OS X 10.12.6）
* Ruby 2.2.8（あっ...）
* capybara 2.6.2
* selenium-webdriver 3.10.0
* Google Chrome 65.0.3325.162
* ChromeDriver 2.36.540469
* Java 1.6.0_65

## 結論ファースト

ChromeDriver のバージョンを 2.35 にダウングレードさせたらエラーが解消した。ダウングレードの方法は下記。

* [Homebrew で旧バージョンのパッケージをインストールしたい - Qiita](https://qiita.com/KyoheiG3/items/912bcc27462871487845)

## 試してみたバージョン

公式情報 https://chromedriver.storage.googleapis.com/2.37/notes.txt によると、ChromeDriver が対応する Chrome のバージョンは下記。

ChromeDriver | Chrome
---- | ----
2.37 | v64-66
2.36 | v63-65
2.35 | v62-64
2.34 | v61-63

なのだけれど、手元で試した限りでは下記の結果となった。同じテスト（ログインフォームに値を入れてサブミットする）なのだけれど、発生したエラーが異なった。

ChromeDriver | Chrome v65
---- | ----
2.37 | NG（unknown error: unknown sessionId）
2.36 | NG（unknown error: unknown sessionId）
2.35 | OK
2.34 | NG（unknown error: call function result missing 'value'）

## 参考

不具合の内容は下記のバグレポート参照。

* [2333 - WebDriverException: unknown error: cannot determine loading status from unknown error: unknown sessionId - chromedriver - Monorail](https://bugs.chromium.org/p/chromedriver/issues/detail?id=2333)
* [WebDriverException: unknown error: cannot determine loading status from unknown error: unknown sessionId ・ Issue #5609 ・ SeleniumHQ/selenium](https://github.com/SeleniumHQ/selenium/issues/5609)

下記でも同じような不具合が報告されていて、みんな ChromeDriver と Chrome のバージョンの組み合わせには苦労しているんだなあという印象。

* [WebDriver Not Compatible with Chrome/65.0.3325.146 on LINUX ・ Issue #5576 ・ SeleniumHQ/selenium](https://github.com/SeleniumHQ/selenium/issues/5576)
php: class内の変数に外からアクセスするとき

教育用のメモ

# static 
> https://www.sejuku.net/blog/23753
> しかし、クラスのインスタンスを生成しなくても、クラスのメンバにアクセス可能なメンバのことを静的（static）メンバと呼びます。

##### class直なら
> 言語によってはクラスメンバと言う場合もあります。その際、メソッドの場合はクラスメソッド、プロパティをクラス変数などと呼びます。

##### instanceで作ったら
> その場合、逆に**普通のメソッドやプロパティ**のことを、インスタンスメソッド、インスタンス変数などとも言います。

`classはインスタンス化して使うのが基本` なので、 `普通＝インスタンスでアクセス` という考え方がベースのベース

> 逆に静的なメンバは、クラスのインスタンスから参照するときに使用する矢印演算子->によるアクセスはできません。

static変数はclass/インスタンスから `::` でアクセスできるが、非staticはclass/インスタンスともにアクセスできない。

### staticを呼ぶ例
```php
<?php

class SampleClass
{
    //プロパティの宣言
    //class/インスタンスから :: で参照ok
    public static $var = 'This is Sample Class.';
    //　インスタンス必須
    public $var2 = 'This is Sample Class.';
}

//インスタンスの生成
$ins= new SampleClass();

echo "class direct\n";
echo SampleClass::$var;

echo "instanceから\n";
echo $ins::$var;

echo "\n--------------\n";


echo "staticはinstance変数ではとれない\n";
echo $ins->var;                  // error
echo $ins->var2;                  // staticじゃないのはとれる
```

インスタンスで使ってる時にstatic変数が必要になったら、`::` を使う。 `->` はエラーになる。

# constはclass内でしか宣言できない

> なお、変数や配列などをクラス内で定数化したい場合はconstを使用します。

> https://www.sejuku.net/blog/27679

```php
<?php
 
class ConstClass
{
  //定数を定義する
  const FRUITS1 = 'apple';
 
}
 
echo ConstClass::FRUITS1;
```

インスタンスからは `::` で使う

```php
<?php

class ConstClass
{
    //定数を定義する
  const CONSTSTR1 = 'Samurai';
}

echo ConstClass::CONSTSTR1;   // Samurai

$ins= new ConstClass();
echo $ins::CONSTSTR1;    // Samurai
echo $ins->CONSTSTR1;    // これはエラー
```

constにはstaticが不要。

あとpropertyの話かな
Android Studio 3.0から3.1へのマイグレーション

他にこうしたほうがいいとか、この設定も必要だったとか、この設定はいらないとかあればコメントかTwitterなどどこでもいいので教えていただけると嬉しいです。

# Gradle Pluginのアップデート

```diff:build.gradle
-        classpath 'com.android.tools.build:gradle:3.0.1'
+        classpath 'com.android.tools.build:gradle:3.1.0'
```

# Gradle WrapperとbuildToolsVersionを必要に応じてアップデート

Android Gradle Plugin 3.1にともなう環境のアップデートです(コメントありがとうございました)

```:gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip
```

```groovy:build.gradle
 android {
    buildToolsVersion '27.0.3'
```

# 最新のビルド環境にする

```diff:gradle.properties
+android.enableD8.desugaring=true
+android.databinding.enableV2=true
```

新しいD8コンパイラを使いたい場合、android.enableD8フラグはデフォルトで有効であるため、必要ありません。

https://android-developers.googleblog.com/2018/03/android-studio-3-1.html

> no android.enableD8 flag, or if it does ensure that it is set to true.


コメントいただいたのですがandroid.databinding.enableV2とandroid.enableD8.desugaringはまだpreviewとも取れる記載があるので、利用する場合は注意してください。 (コメントありがとうございました)

https://developer.android.com/studio/releases/index.html

> You can preview a new incremental compiler for your data binding classes

> In-process desugaring in D8 (preview)


# DataBindingを使っているプロジェクト
`databinding.enableV2`でincludeタグで使っているDataBindingがNullableじゃなくなるので!!を消します。(ビルドのログの中で警告が出るので、それで場所がわかります)
ほかNullableになっているところを!!を追加を行ったりします。

またObservableFieldを使っているプロジェクトでは以下のように初期化しているとクラッシュするので気をつけましょう。ObservableFieldに別の引数ありの別のコンストラクタが生えていて、そちらが使われるため、クラッシュします。

×

```kotlin
val value:ObservableField<Type?> = ObservableField(null)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/27388/60690105-87df-2776-2d7c-b329b00600d7.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/27388/eb56e3fd-24d2-15b4-72b5-03b49c8e03e1.png)


普通にコンストラクタの引数をなくせば大丈夫です。
○

```kotlin
val value:ObservableField<Type?> = ObservableField()
```


# `.idea/codeStyleSettings.xml`があるプロジェクトのマイグレーション
Android Studio 3.0.1まではコードスタイルの設定の置き場所が`.idea/codeStyleSettings.xml`になっていましたが、3.1からは`.idea/codeStyles/codeStyleConfig.xml`と`.idea/codeStyles/Project.xml`に分かれました。

マイグレーション方法としては3.0のプロジェクトを3.1のAndroid Studioで開くことで自動的に2つのファイルが作られます。
どうやら`.idea/codeStyles/codeStyleConfig.xml`がどのコードスタイルを使うかの設定が書かれており

```xml
<component name="ProjectCodeStyleConfiguration">
  <state>
    <option name="USE_PER_PROJECT_SETTINGS" value="true" />
  </state>
</component>
```

`.idea/codeStyles/Project.xml`にはプロジェクトのコードスタイルが入るようになっています。

```xml
<component name="ProjectCodeStyleConfiguration">
  <code_scheme name="Project" version="173">
    <option name="USE_SAME_INDENTS" value="true" />
```

.gitignoreを以下のようにしました

```diff
-!.idea/codeStyleSettings.xml
+!.idea/codeStyles/*
```
SitePrismを使ったページオブジェクトデザインパターンによるテストのサンプルを作りました

# ページオブジェクトデザインパターンとは
ページオブジェクトデザインパターンとはWebアプリケーションのUIのテスト手法の１つです。

テスト対象システムの画面情報をページオブジェクトクラスと呼ばれる共通化クラスに集約し、
画面の変更に伴うスクリプトの修正コストを減らすテストスクリプトのデザインパターンです。
テストスクリプトの中でページを操作または情報の取得する際は、ページオブジェクトを介して行います。

これにより冗長なテストコードを減らしたり、変更に強いテストコードにすることが可能です。

# ページオブジェクトパターンのメソッドの戻り値に関する作法のバリエーション

今回作成したサンプルコードは **メソッドが他のPageObjectを返さない** を採用しています。

- メソッドが他のPageObjectを返さない
  - 同じアクションを単一メソッドにできるが、ページ遷移の結果を呼び出し元に書く必要がある
- メソッドが他のPageObjectを返す
  - ページ遷移を伴わない場合は自身のPageObjectを返す ([SeleniumHQ公式Wiki](https://github.com/SeleniumHQ/selenium/wiki/PageObjects)の場合)
      - 一貫してアクションをメソッドチェーンで書くことができる
  - ページ遷移を伴わず、文字列等を返さない場合はvoidを返す ([Selenium実践入門](https://www.amazon.co.jp/dp/4774178942)の場合)
      - ページ遷移を伴うアクションをメソッドチェーンで書くことができる


# SitePrismを使ったページオブジェクトデザインパターンによるテスト

## テスト用サイト

日本Seleniumユーザーコミュニティのテスト用サイトを使用します。

- ホテル宿泊予約サイト : http://example.selenium.jp/reserveApp_Renewal/
- 詳細は[こちら](https://sites.google.com/site/seleniumjp/test-site)

## テストで使用するライブラリ

ライブラリ|概要|ドキュメント
---|---|---
[RSpec](http://rspec.info/)|Rubyのテストフレームワーク|http://rspec.info/documentation/ https://relishapp.com/rspec
[Selenium WebDriver](https://www.seleniumhq.org/projects/webdriver/)|Webアプリケーションのテスト自動化をサポートするツール|https://github.com/SeleniumHQ/selenium/wiki/Ruby-Bindings http://seleniumhq.github.io/selenium/docs/api/rb/index.html
[Capybara](http://teamcapybara.github.io/capybara/)|WebアプリケーションのE2Eテストフレームワーク|http://www.rubydoc.info/github/teamcapybara/capybara/master
[SitePrism](https://github.com/natritmeyer/site_prism)|ページオブジェクトデザインパターンのテストの作成をサポートする|http://www.rubydoc.info/gems/site_prism/frames

## サンプルコード
https://github.com/RustyNail/page_object_pattern_demo  (Created by @oh_rusty_nail , @kou029w )

- Dockerを使用しているため、ローカルにブラウザやドライバを自前でインストールする必要がありません
- Docker / Docker Composeのインストール方法はREADMEに記載しています
  - テストを実行する上で必要なため、インストールをお願いします

## テストで使用するブラウザ

ブラウザはHeadless Chromeを使用します。

## テストの実行方法

Docker環境でテストを実行します。

- ビルド
  - `docker-compose build`
- テスト実行
  - `docker-compose run --rm test`
蟹さんのmrubyでThingSpeak

せっかくネットワークが使えるようになったので、IoTらしく[ThingSpeak](https://thingspeak.com/)にアクセスしてみました。

ThingSpeakは時系列のデータを保存してグラフ化などの解析をしてくれるサービスです。

とりあえずfreeなアカウントを作って試してみました。アカウントの作り方などは検索すると日本語の説明のページがいくつかありました。

```ruby
APIKEY = "naisyo"

begin

rtl = YABM.new

addr = "10.10.10.2"
mask = "255.255.255.0"
gw = "10.10.10.1"
dns = "10.10.10.1"

rtl.netstart(addr, mask, gw, dns)

# sync date by ntp use https X.509
ntpaddr = rtl.lookup("ntp.nict.jp")
rtl.sntp(ntpaddr)

hcount = 0
count = 0

while 1 do
  rtl.print "." 
  start = rtl.count() 
  while rtl.count() < start + 100 do 
  end 
  count = count + 1 
  if count % 20 == 0 then 
    hcount = hcount + 1
    rtl.print " " + hcount.to_s + "¥r¥n"
    res = SimpleHttp.new("https", "api.thingspeak.com", 443).get("/update?api_key=" + APIKEY + "&field1=0", {'User-Agent' => "test-agent"})          
  end 
end                                                

rescue => e
  rtl.print e.to_s
end
```

以前はhttpでもアクセスできたようですが、現在はSSLが必須になっているようなので[BearSSLを使った](https://qiita.com/yamori813/items/08f6dfdf0d7e23c6a184)アクセスになります。

mruby-simplehttpを改造してRTL8196Cを使うようにしてみました。

BearSSLのTAはcurlにあったCAをダンプしてincludeしました。

これでチャンネルのupdateできました。この処理を実装していて気がついたのですが、rescueが結構便利です。

![スクリーンショット（2018-03-27 16.07.32）.png](https://qiita-image-store.s3.amazonaws.com/0/104066/17aa5469-b34a-46cc-ef50-d1508cd99c49.png)


我が家ではスマートメーターのBルートのデータやNTP ST1のデータをロギングしていますが、深夜帯は電気節約のためルータなどの電源を落としていてインターネットへの経路がなくなるので、これらの用途にThingSpeakは使えません。

時間情報が入ったCSVのファイルをアップロードする事はできるようですが、APIは用意されていないようです。

ThingSpeakはそれ自体がサービスというよりも、サービスを作るための研究目的で使うのが良いのかなとか思いました。

おまけ

MATLAB Analysisで直近10分のアクセスのインターバルの最小値、最大値、平均を確認してみました。MATLABという言語を使うようです。

```MATLAB
readChannelID = 0000;
readAPIKey = 'naisyo';

data = thingSpeakRead(readChannelID, 'ReadKey', readAPIKey, 'NumMinutes',10, 'OutputFormat','table');

[m,n] = size(data);
for c = 1:m-1
    t(c) = seconds(data.Timestamps(c+1) - data.Timestamps(c));
end

disp(max(t));

disp(min(t));

disp(mean(t));
```

Output

```
 24

 21

 22.2308
```

freeアカウントのためかもしれませんがMATLAB Analysisは重い処理をするとTimeoutしてしまうようです。また全データー出力みたいな事も出来ないようです。MATLAB Analysis直近のデータの確認に使い、全データの確認はデータをダウンロードしてローカルでやるのが良さそうです。

```
MATLAB code has not completed execution within the allocated time.
Consider optimizing your MATLAB code to execute within the available time limit.
```

MATLAB Visualizationも試してみました。直近の3000アクセスの時間別集計です。

```MATLAB
readChannelID = 0000;

readAPIKey = 'naisyo';

t1 = thingSpeakRead(readChannelID, 'ReadKey', readAPIKey, 'NumPoints',3000, 'OutputFormat','table');

for c = 1:24
    l(c) = c-1;
    s(c) = 0;
end

[m,n] = size(t1);
for c = 1:m
    s(hour(t1.Timestamps(c))+1) = s(hour(t1.Timestamps(c))+1) + 1;
end

scatter(l, s);
```

![スクリーンショット 2019-09-22 23.09.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/5ac55443-1f32-5b3c-a21d-8634004616cb.png)


MATLABで直近一日分のデータを取得する方法

```MATLAB
t1 = datetime('now');

t2 = t1 - days(1);

data = thingSpeakRead(readChannelID, 'ReadKey', readAPIKey, 'DateRange',[t2,t1], 'OutputFormat','table');
```

dataは古い方から入っています。

ThingSpeakは最初は問題なかったのですが、MATLABのコピペでブラウザやペーストされたアプリがハングアップするようになってしまいました。。。
Power BI カスタムビジュアル開発 その６: カスタムビジュアルのデバッグとパッケージ化

※ 2019/07/15 ツールが 3.0 になりいくつか内容が変わったため記事を編集します。

[前回](https://qiita.com/kenakamu/items/e20f8adac01976c03b5c)までカスタムビジュアルを作成してきました。今回はデバッグの方法とパッケージ化して配布する手順を見ていきます。

# デバッグ
カスタムビジュアルはデータが読み込まれる度に JavaScript も再ロードされるので、一度設定したブレークポイントが効きません。そこで ```debugger``` コードを使います。

1\. 任意の場所に ```debugger``` コードを入れます。

<img width="466" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/26a40c46-af05-0392-93e1-5ed633b022c6.png">

2\. カスタムビジュアルを読み込んでいるブラウザで F12 を押下して開発者ツールを起動します。

3\. カスタムビジュアルを再読み込みします。ブレークポイントが自動的にヒットします。

<img width="496" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/bcd8c51c-8fe5-c48e-b857-2e7396361f51.png">

# パッケージの作成
パッケージは pbiviz ツールで行います。

1\. 現在 pbiviz start でサーバー実行している場合は、一旦 Ctrl ＋ C で停止。

2\. pbiviz.json ファイルで作成者や詳細など情報を入力。

3\. 以下コマンドでパッケージ化

```shell
pbiviz package
```
4.\ dist フォルダ内に、<カスタムビジュアル名>.pbiviz ファイルが作成される。

このファイルの中身は最適化された JavaScript コードです。

# カスタムビジュアルのインポート

Power BI デスクトップでも Power BI サービスでも手順は同じです。

1\. 「視覚化」のビジュアル一覧最後にある「…」をクリックし、「ファイルからインポートする」を選択。

<img width="500" alt="Capture.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/27261269-c6b9-7709-a914-e4a9d9692e18.png">

2\. 警告が出るので、読んで「インポート」をクリック。
<img width="395" alt="Capture.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/214116/c6b43500-f008-1ee8-724a-fd16b90fdfd7.png">

3\. 作成された .pbiviz ファイルを選択。インポートが完了。
<img width="295" alt="Capture.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/81366e06-0705-b0cd-c9e2-1786962bfc86.png">

4\. インポートされたビジュアルを選択して検証。

5\. カスタムビジュアルを使って作成したレポートやダッシュボードが、他のユーザーからも別途カスタムビジュアルのインポートなしで見えることを確認。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214116/6306d902-f203-3a45-f277-9fe225e4fefd.png)

# まとめ
６回にわたって Power BI カスタムビジュアル開発の流れを紹介しました。D3 の知識は必要ですが、自由にビジュアルを作れるのは楽しいです。

次回からは、Capabilities の中身を詳しく見ていきます。

[次の記事へ](https://qiita.com/kenakamu/private/46ae6e419c49284c75ed)
[目次へ戻る](https://qiita.com/kenakamu/items/f57ab7f73d6ea10bc9d9)

# 参考情報
[PowerBI Visual Tools (pbiviz) - Debugging](https://github.com/Microsoft/PowerBI-visuals/blob/master/tools/debugging.md)
[PowerBI Visual Tools (pbiviz) - Usage Guide](https://github.com/Microsoft/PowerBI-visuals/blob/master/tools/usage.md#packaging-your-visual-for-distribution)
コマンドの結果をログに出力するcron

超基本だけど調べても案外出てこなかったからメモ

```Linux
# 5分おきにコマンドを実行しその結果をログファイルに出力
*/5 * * * * [コマンド] >> /var/log/connection.log 2>&1
```

定期的にコマンドの結果を出力したいときあるよね。
思い出すためのtmuxコマンド集

そこまで使う頻度高くないので、使うときには忘れている。
すぐコピペ or ショートカットの思い出しできるように最低限まとめておく。

# 超基本

インストール(ubuntu)

```
sudo apt-get install tmux
```

起動

```
tmux
```

デタッチセッション

```
tmux detatch-client
```

アタッチセッション

```
tmux attach-session
```

# ショートカット + コマンド

注) キーの前にプレフィックス = `Ctrl-b` が必要、サブコマンドの前に `tmux` が必要

### ウィンドウ操作

| キー | サブコマンド | 操作 |
|:-:|:-:|:-:|
| c | new-window | ウィンドウを作成  |
| n | next-window | 次のウィンドウに移動  |
| p | previous-window | 一つ前のウィンドウに移動 |
| , | rename-window | ウィンドウの名前変更 |
| 0~9 | select-window | 0~9の指定した番号のウィンドウに移動  |
| l | last-window | 直前のウィンドウに移動 |
| w | choose-window | ウィンドウの一覧表示、選択  |
| & | kill-window | 現在のウィンドウを削除 |


### ペイン操作
| キー | サブコマンド | 操作 |
|:-:|:-:|:-:|
| " | split-window | 画面を上下に分割  |
| % | split-windo-h | 画面を左右に分割  |
| x | kill-pane | 現在のペインを削除 |
| q | display-panes | ペイン番号を表示, 表示中に番号を指定すると指定したペインに移動 |
| o | select-pane -t :.+ | 次のペインに移動 |
| ; | last-pan | 直前にいたペインに移動 |
| カーソルキー | select-pane -D  | 上下左右のペインに移動  |
| { | swap-pane -U  | ペインの入れ替え |
| } | swap-pane -D  | ペインの入れ替え |
|Ctrl-カーソルキー|resize-pane -U | ペインのサイズを上下左右に変更 |


### セッション

| キー | サブコマンド | 操作 |
|:-:|:-:|:-:|
| $ | rename-session | セッションの名前変更 |
| s | choose-tree | セッションの一覧を表示, セッションの選択可能  |
| ( | switch-client -p | 前のセッションに移動 |
| ) | switch-client -n | 次のセッションに移動 |
| L | switch-client -l | 直前のセッションに移動 |
| d | detach-client | デタッチ |


これだけあれば多分大丈夫
Project Euler 61「巡回図形数」

再帰関数苦手です。混乱してしまいます。
もっとキレイにできると思うけど脳味噌が悲鳴をあげているので早々にギブアップ。

# Problem 61 「巡回図形数」
三角数, 四角数, 五角数, 六角数, 七角数, 八角数は多角数であり, それぞれ以下の式で生成される.

$三角数 \quad P_{3,n}=n(n+1)/2 \hspace{30pt} 1, 3, 6, 10, 15, ...$
$四角数 \quad P_{4,n}=n^2 \hspace{67pt} 1, 4, 9, 16, 25, ...$
$五角数 \quad P_{5,n}=n(3n-1)/2 \hspace{25pt} 1, 5, 12, 22, 35, ...$
$六角数 \quad P_{6,n}=n(2n-1) \hspace{35pt} 1, 6, 15, 28, 45, ...$
$七角数 \quad P_{7,n}=n(5n-3)/2 \hspace{25pt} 1, 7, 18, 34, 55, ...$
$八角数 \quad P_{8,n}=n(3n-2) \hspace{35pt} 1, 8, 21, 40, 65, ...$

3つの4桁の数の順番付きの集合 (8128, 2882, 8281) は以下の面白い性質を持つ.
この集合は巡回的である. 最後の数も含めて, 各数の後半2桁は次の数の前半2桁と一致する
それぞれ多角数である: 三角数 ($P_{3,127}=8128$), 四角数 ($P_{4,91}=8281$), 五角数 ($P_{5,44}=2882$) がそれぞれ別の数字で集合に含まれている
4桁の数の組で上の2つの性質をもつはこの組だけである.
三角数, 四角数, 五角数, 六角数, 七角数, 八角数が全て表れる6つの巡回する4桁の数からなる唯一の順序集合の和を求めよ.

```python
from itertools import count, permutations

def hoge():
    def find_chain(chain, i):
        for x in p[perm[i]]:
            if len(chain) == 6: return
            if len(chain) != i+1: chain.pop() # 繋がらなかったとき
            if x.startswith(chain[-1][-2:]):
                chain.append(x)
                if len(chain) < 6: find_chain(chain, i+1)
#
    p = { n: P(n) for n in range(3, 9) }
    for n in p[8]: # 個数の少ない8画数を起点に
        for perm in permutations(range(3,8)): # 3～7角数の登場順
            chain = [n]
            find_chain(chain, 0)
            if len(chain) == 6 and chain[0][:2] == chain[-1][-2:]:
                #print(chain)
                return sum(map(int, chain))

def P(n):
    if   n == 3: f = lambda n: (n * (n + 1)) // 2
    elif n == 4: f = lambda n: n * n
    elif n == 5: f = lambda n: (n * (3 * n - 1)) // 2
    elif n == 6: f = lambda n: n * (2 * n - 1)
    elif n == 7: f = lambda n: (n * (5 * n - 3)) // 2
    elif n == 8: f = lambda n: n * (3 * n - 2)
    l = []
    for m in count(1):
        x = f(m)
        if 1000 <= x < 10000:
            l.append(str(x))
        elif x >= 10000:
            return l

print(hoge())
```
Xcodeで背景色を設定する 【Xcode / Swift4】

はじめまして、ますみです！

[![自己紹介.png](https://www.umi-mori.jp/wp-content/uploads/2023/02/introduction_banner_2-2048x533.png)](https://bit.ly/banner_intro_masumi_creator_qiita)


#コード
`swift:backgroundColor.swift
view.backgroundColor = UIColor.red
`
上記のコードは、背景色を<font color="red">赤色</font>にするコードである。

#使い方
具体的には、`ViewController.swift`のファイルに、以下のようなコードを記入する。

```swift:ViewController.swift
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.red // Write the code here
    }
}
```

このコードをシミュレータで実行すると、以下のように背景色が赤色になる。

<img width="200" alt="Test.png" src="https://qiita-image-store.s3.amazonaws.com/0/240280/c120b9fe-5650-a609-4c8f-dd81cb72989e.png">

#補足
赤以外の色を自由に設定したい場合は、以下の記事に<b>RBGで色を設定する</b>方法が記されている。
リンク：<a href="https://qiita.com/umi_mori/items/33b31528f096749f1f44">UIColorをRGBで調整する [Xcode / Swift4]</a>

# 最後に
最後まで読んでくださり、ありがとうございました！
いかがだったでしょうか？

この記事を通して、少しでもあなたの学びに役立てば幸いです！

:::note info
【仕事の相談はこちら】
お仕事の相談のある方は、下記のフォームよりお気軽にご相談ください。

[問い合わせフォームはこちら](https://forms.gle/G5g1SJ7BBZw7oXYA7)

もしもメールでの問い合わせの方がよろしければ、下記のメールアドレスへご連絡ください。

info*galirage.com（*を@に変えてご送付ください）

🎁 「生成AI活用の無料相談券」もしくは「生成AIの社内ガイドライン（無料PDF）」を『公式LINE』で配布中 🎁
『生成AIを業務に活用したいけど、どうしたらいいかわからない』といった声を多くいただきます。

Galirageでは公式LINEにて、チャットやオンライン会議で「完全個別の生成AI活用無料相談会」を実施しております！
（期間限定で実施しているため、ご興味ある方はお早めに以下のLINE公式アカウントをご登録ください^^）
https://lin.ee/rvz6lMN

※ 予告なく、キャンペーンを終了する可能性がございますが、ご了承ください。

【業務内容】
具体的には、以下のお仕事を中心に受け付けております！（[詳しくはこちら](https://galirage.notion.site/Galirage-AI-c2f3945fafb0433d8d2fd03e56927fd8)）
1. 受託開発（例：生成AIを使った社内システムの開発）
2. コンサルティング（例：技術戦略のアドバイス）
3. 講演（例：社内研修、イベント登壇）

※ 特に「生成AIを使ったシステム開発のご依頼」が多く、ご好評いただいております。

【これまでの相談事例】
以下のようなご相談が多くあります。

🔑 機密情報を漏洩させないための、生成AIのシステム構築をお願いしたい。
🤖 自社データを用いたFAQチャットボットの作り方を知りたい。
💡 ChatGPTを、自分たちの事業にどのように活かせるか、アドバイスやアイデアが欲しい。
:::
# おまけ
エンジニアの仲間（データサイエンティストも含む）を増やしたいため、公式LINEを始めました🎉

「**一緒に仕事をしてくれる方**」「**友だちとして仲良くしてくれる方**」は、友だち追加をしていただけますと嬉しいです！（仲良くなった人たちを集めて、「ボードゲーム会」や「ハッカソン」や「もくもく会」もやりたいなと考えています😆）

とはいえ、みなさんにもメリットがないと申し訳ないので、特典を用意しました！

友だち追加後に、アンケートに回答してくれた方へ「**エンジニア図鑑（職種20選）**」のPDFをお送りします◎

https://lin.ee/hFUN4TL

[![](https://www.umi-mori.jp/wp-content/uploads/2023/10/line_banner_v2.png)](https://lin.ee/hFUN4TL)
# 参考文献

https://qiita.com/nitaking/items/a9dc07008ef2b3fad94d
「作り直した方が早い」の光と闇

## はじめに
特定のプロジェクトの話とかではなく、十年以上開発に関わってきて個人的に感じていることです。
いくつかのプロジェクトで、古いシステムや負債の多いシステムに遭遇した際に「作り直した方が早いんじゃないか」と感じた経験は少なからずあると思います。

## 本当に作り直した方が早いのか
これはあくまで個人的な経験に基づく話しですが、作り直しの目的が単純に生産性改善や品質改善になっている場合は要注意です。
なぜなら、

**Velocity comes from Process, not Architecture**

だからです。

生産性あるいは品質の改善を行う際に最初にやるべきことは開発プロセスのチェックなはずです。
たとえば以下のように行っている(行うべき)プロセスを並べてAS-IS(現在), To-Be(あるべき)を列挙してTo-Beになっていないところを取り組むことでも多くの場合かなりの改善が見込めると思います。

| プロセス | As-Is | To-Be |
|:-----------|:------------|:------------|
| 要件定義        |    hogehoge   |    foobar     |
| 実現方式レビュー |         |            |
| 設計           |         |             |
| 実装　　　       |          |             |
| 単体テスト      |  すべて手作業      |    リファクタのうえ　BEはカバレッジxx%を目指す         |
| ソースレビュー   |         |             |
| 結合テスト      |         |              |
| 性能試験        |         |             |
| 強化テスト      |        |               |
| リリース運用     |        |               |

結局のところ、同じような体制/プロセスで作り直しても、同じような問題を引き連れてきてしまいます。

## 先の見えない「翻訳作業」
「Aという言語だと人が集まらないので、Bという言語にしたい」が作り直しの主な動機になっている場合も要注意です。
そもそも言語を置き換える場合、両方の言語を理解できる人が一定数必要なはずで、その人たちがリファクタリングするのではなぜだめなのか、がシャープになっていないとただの翻訳作業になってしまいます。
(置き換えた言語の人材トレンドが過ぎたらまた作り直すのでしょうか。)



## それでも作り直した方がいいとき
考察すると、作り直しが成功するためには コーディングや設計ができる人だけでなく、開発体制の見直し/各開発プロセス(テストも含めて)のあるべき姿を提言できる人材が不可欠ということになります。

そのうえで組織・体制ごと変革せざるをえない場合が作り直しを選択する一つの大きな機会ではないかと思います。たとえば、以下のようなケース

- 外注化していたシステムを内製化する
    - リファクタしようにも既存システムの知識をもった人の協力がどこまで得られるか不明

- オンプレのシステムをクラウドに持っていく
    - インフラチームのあり方、インフラエンジニア人材の要件から変えざるをえない


## まとめ
- まずは、開発プロセスの見直し
- アーキテクトだけでは作り直しプロジェクトは成功しない
- 作り直しは「選択する」というよりも、「選択せざるを得ない」場合に取りうる手段
SpringBoot × doma2でimplが作成されない

# 環境
SpringBoot 2.0.0
kotlin 1.2.20
doma 2.16.1
doma-spring-boot-starter 1.1.1

## implが作成されない
IntelliJを使ってチュートリアルを参考に進めていたがコンパイル時にImplが自動作成されずDIに失敗、tomcatが立ち上がらない
以下エラー内容

```
Parameter 0 of constructor in xxx.xxx.xxxService required a bean of type 'xxx.xxx.xxxRepository' that could not be found.
```

## 解決
IntelliJの注釈処理設定をONにする
Settngs＞Build、Execution、Deployment＞Compiler＞Annotation Processors


![無題.png](https://qiita-image-store.s3.amazonaws.com/0/145645/4b08763e-dbea-cf6c-26a6-09aa28f379d2.png)

ビルドした後、generatedディレクトリが作成されるので
generatedディレクトリをSource Foldersとして認識させる

プロジェクト右クリック＞Open Module Settings＞Modules

![setting.png](https://qiita-image-store.s3.amazonaws.com/0/145645/d2fa8944-91d1-6846-383c-7e4ac56e8f33.png)



完了
jQueryあれこれ

何度も調べていて、馬鹿らしいのでまとめた

###要素の取得方法

```javascript::
// id
$('#hoge').val()

//class
$('.hoge').val()

// name
$('[name=hoge]').val()

// data属性
$('[data-***=hoge]').val()

```

### ループ

```javascript::

var array = [];
$.each(array, function(index, value)) {
    // ループを抜け出す時(break)
    return false;

    // 処理をスキップする時(continue)
    return true;
};

//targetContent: .Class #id [data-***=hoge] etc...
targetContent.each( function( index, element ) {
    // ループを抜け出す時(break)
    return false;
    
    // 処理をスキップする時(continue)
    return true;
});

```

### イベントバインド

```javascript::

//event : click,change etc...
//targetContent: .Class #id [data-***=hoge] etc...

// 動的に追加された項目のイベントも検知可能
$(document).on('event', 'targetContent', function () {
    // あれこれ
});

// 動的に追加された項目のイベントは「検知不可」
$('targetContent').on('event' , function () {
    // あれこれ
});


```
tmux で ssh した時に新規ウィンドウで起動してウィンドウをホスト名に変更する方法

色んな人が似たような記事を書いているが、自分はこれで事足りる。

tmux を起動している状態で、このシェルスクリプトで対象ホストを引数として指定して ssh する。

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

tmux new-window -n $1
tmux send-keys -t:$1 "ssh $1" C-m
```

例えば、このスクリプトを `s.sh` という名前で保存して実行権限を付ける。

```
$ chmod +x s.sh
```

ssh したいホスト名を引数に指定して実行すると、新規ウィンドウが開いて ssh する。すると、ウィンドウ名が対象ホスト名になる。

```
$ ./s.sh target-server
```
javascript class構文でstaticプロパティ

#javascript の class構文 確かに便利だが…

~~~javascript
class Foo {
    static message : "hello foo!"
}
~~~

と書けないですね。

~~~javascript
let Foo = Object.assign(class {
    get message () {
        return this.constructor.message === undefined ?
            super.message : this.constructor.message;
    }

    set message (v) {
        this.constructor.message = v;
        return true;
    }
},{message: "hello foo!"})

let Bar = class extends Foo {}

//テスト 出力は hello foo!
console.log(Bar.message);

Bar.message = "hello bar!";// Object.assign(Bar, {message: "hello bar!"})と挙動は同じ
console.log(Foo.message);
console.log(new Foo().message);
console.log(Bar.message);
console.log(new Bar().message);

new Bar().message = undefined;
console.log(Foo.message);
console.log(new Foo().message);
console.log(Bar.message);
console.log(new Bar().message);

// staticかどうかチェック
new Foo().message = "bye foo!";
console.log(Foo.message);
console.log(new Foo().message);

Foo.message = undefined;
console.log(Foo.message);
console.log(Bar.message);

~~~

と書くことで、staticなプロパティになります。 参考までにどうぞ。
Ionic3に入門してみる～その1 環境構築～

# Ionicとは？
公式HPより引用 
https://ionicframework.com/framework

>The top open source framework for building amazing mobile apps. 
>Ionic is the beautiful, free and open source mobile SDK for developing native and progressive web apps with ease. 

グーグル先生の日本語訳
>驚くべきモバイルアプリケーションを構築するためのオープンソースのフレームワークです。 
>Ionicは、ネイティブでプログレッシブなWebアプリを簡単に開発するための、美しくフリーでオープンソースのモバイルSDKです。 

ざっくり言うとcordova + αのフレームワークでしょうか。
具体的にはAngular4が使えます。ほかにもいろいろあるようですが、それは別途。

# Ionic Proってなんぞや？
monacaみたいな月額・年額いくらのクラウドIDEらしいです。

proのHP 
https://ionicframework.com/pro

価格帯
https://ionicframework.com/pro/pricing

proでないほうのIonicは無料です。
proもフリープランでは無料ですが私は面倒なので使いません。

# 環境構築
大体は下記ページの通りです。
https://webbibouroku.com/Blog/Article/ionic3-env

英語で大丈夫なら、公式ページでどうぞ。
https://ionicframework.com/docs/intro/installation/
公式もだいたい同じですが、platformのコマンドなどは書いてないので成果物が若干異なります。
serveするだけなら同じですが。
なおしばらくチュートリアルを進めると結局Androidビルドもします。

ただし、プロジェクト作成時にProとリンクしますか？みたいなことを聞かれましたので、
使わない場合はNoを選択して下さい。 

サンプルプロジェクトの動作イメージ
![test.gif](https://qiita-image-store.s3.amazonaws.com/0/196422/b020dd02-e2f2-1d3e-7bd5-c649773664f9.gif)
mysqlのパスワードにビックリマーク!入れたらいろいろハマった話

# この記事について
開発環境つくるのにmysqlのパスワードなんて適当なもので良いのだが、特殊文字を含んだパスワードしか使えない制約入れて、実際にビックリマーク含むパスワードにしてたらハマった :cry: 結局ビックリマークやめて他の特殊文字を使うようにして回避した話。

## 結論
- パスワードにビックリマークはやめよう
- URLエスケープしやすい文字が良いっぽい

# 現象
↓の感じでsequelでマイグレーションさせようとしたら

```
$ bundle exec sequel -m migrations "mysql2://user_name:password!@127.0.0.1/db_name"
-bash: !@127.0.0.1: event not found
```

みたいになる。なんで？と思ったらビックリマークはbashシェルで特殊扱いされる奴だったとか。

# 回避方法
mysqlのパスワードをビックリマークじゃなくてシャープに変更

```
mysql> set password for 'user_name'@'localhost' = PASSWORD('password#');
```

`#` は `%23` にエスケープして実行

```
$ bundle exec sequel -m migrations "mysql2://user_name:password%23@127.0.0.1/db_name"
```

# 原因
## bashシェルでビックリマークの使い方
### 一つ前のコマンドを再度実行する

```bash
!!
```

### コマンドの履歴の1番を実行する

```
!1
```

### クォーテーションの中も優先的に置き換えちゃう
直接的な原因は↓みたいな動作になることだったから

```bash
$ ls -al
$ echo "!!"
echo "ls -al"
ls -al
```

# 参考
* https://unix.stackexchange.com/questions/3747/understanding-the-exclamation-mark-in-bash
[Review] Neural Machine Translation (seq2seq) Tutorial

Link: https://www.tensorflow.org/tutorials/seq2seq

Authors: Thang Luong, Eugene Brevdo, Rui Zhao

This version of the tutorial requires TensorFlow Nightly. For using the stable TensorFlow versions, please consider other branches such as tf-1.4.

## Sequence to Sequence Learning with Neural Networks
Check this post.
https://qiita.com/Rowing0914/items/73d6882cf2ba35c78443

## Tutorial
In this tutorial, we consider as examples a deep multi-layer RNN which is unidirectional and uses LSTM as a recurrent unit. And the content hugely rely on the thesis of [Thang Luong](https://github.com/lmthang/thesis/blob/master/thesis.pdf).
VSCodeをUnity5開発用に設定する

#はじめに
Unity5を使用していて、VisualStudioからVSCodeに移行したい方や、VSCodeで開発してみたい方向けの内容になります。

#VSCodeの導入について
詳しい説明は省きます。（導入手順は公式のドキュメントを参照）
https://code.visualstudio.com/

#拡張機能について
VSCodeが導入できたら拡張機能から以下をインストールします。

1. [C#](https://marketplace.visualstudio.com/items?itemName=ms-vscode.csharp)
2. [C# XML Documentation Comments](https://marketplace.visualstudio.com/items?itemName=k--kato.docomment)
3. [Debugger for Unity](https://marketplace.visualstudio.com/items?itemName=Unity.unity-debug)
4. [Unity Tools](https://marketplace.visualstudio.com/items?itemName=Tobiah.unity-tools)
5. [Unity Snippets](https://marketplace.visualstudio.com/items?itemName=YclepticStudios.unity-snippets) 

※Unity Snippetsはコメントの自動挿入なし版もあります

#VSCodeのユーザー（またはワークスペース）の設定
ファイル検索時に邪魔なファイルを除外しておきましょう。

```
"files.exclude": {
        "**/.git": true,
        "**/.DS_Store": true,
        "**/*.meta": true,
        "**/*.*.meta": true,
        "**/*.unity": true,
        "**/*.unityproj": true,
        "**/*.mat": true,
        "**/*.fbx": true,
        "**/*.FBX": true,
        "**/*.tga": true,
        "**/*.cubemap": true,
        "**/*.prefab": true,
        "**/Library": true,
        "**/ProjectSettings": true,
        "**/Temp": true
    }
```

コードの書式を入力時に設定する場合（体裁を整えてくれます）

```

"editor.formatOnType": true

```

#参考
[Unity Development with VS Code](https://code.visualstudio.com/docs/other/unity)
【tvOS】UITextFieldからUIButtonへのFocus

![Screen Shot 2018-03-27 at 10.07.31.png](https://qiita-image-store.s3.amazonaws.com/0/242761/6933c114-1e7c-afd8-5b21-0f28d6a0b8e1.png)

#問題
UITextFieldでテキストを入力し、キーボード「完了」ボタンを押すと、
元の画面に戻りますが、入力したUITextFieldをFocusしています。
望み動きは元の画面に戻った際、UIButtonをFocusすること。

#解決
```swift:input.swift
  ...
  @IBOutlet weak var finishBtn: UIButton!
  @IBOutlet weak var descriptionTxt: UITextField!
  ...

  var isfinished = false
    
  override var preferredFocusEnvironments: [UIFocusEnvironment] {
        if (self.isfinished){
            self.isfinished = false
            return [self.finishBtn]
        }else{
            return [self.descriptionTxt]
        }
        
  }

  override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {
        if context.previouslyFocusedView == nil && context.nextFocusedView == self.descriptionTxt{
            //キーワード画面から戻る
            self.isfinished = true
            self.setNeedsFocusUpdate()
            self.updateFocusIfNeeded()

        }
        
   }
```
C++ Builder 10.2 Tokyo > Update 3適用 > 作業時間:1時間 | クリアされた設定の再設定 | 不具合の対応状況

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1709
RAD Studio 10.2 Tokyo Update 2
```

Tokyo Update 3を適用してみた。

いったんアンインストールしてから10.2.3をインストールする形で実施。

作業時間として60分かかった。

```txt:動作環境
Windows 10 Pro (64bit) バージョン 1709
RAD Studio 10.2 Tokyo Update 3
```

### 再設定

下記の設定はクリアされるようなので、再度実施する必要がある。

- [C++ Builder 10.2 Tokyo > IDEの色をDarkから変更する](https://qiita.com/7of9/items/c697a2668b49c25d983a)
    - セットアップ時にDark指定時
- [C++ Builder 10.2 Tokyo > IDE > エディタに表示される狼煙（のろし）マーク > 消し方](https://qiita.com/7of9/items/a2fa9d107c5b36cc0798)
- [C++ Builder 10.2 Tokyo > IDE > 構造強調表示の解除](https://qiita.com/7of9/items/da013a088fb8fbac7cd5)

### 不具合の対応状況

- [C++ Builder > difference > XE4と10.2 Tokyo (2018-01-09新規, 2018-01-10更新)](https://qiita.com/7of9/items/9572a782fedc87e25ff3)

上記に記載した不具合に関してはUpdate 3でも同じ。
Azure IaaS 運用管理

<p>この投稿は 東京渋谷ヒカリエ 8 階にある <a href="http://aka.ms/aajp" target="_blank">Azure Antenna</a> で実施された「こわくない！Azure IaaS 運用管理 」で使われた資料のご案内です。</p>

- <strong>Azure IaaS 運用管理</strong><br />
https://www.slideshare.net/mihochannel1/azure-iaas-91938536

<p>:satellite:&nbsp;&nbsp;新しいイベントの情報は、Connpass の <a href="http://aka.ms/aajp" target="_blank">Azure Antenna サイト</a>よりご確認いただけます。</p>

<p>:arrow_backward:&nbsp;<a href="https://qiita.com/AzureAntenna/items/71f394c100fbfa8ddcc8">「Azure Antenna 実施イベント資料（カテゴリ別）」に戻る</a></p>
【C#】自作クラスのListのソート

自作クラスのListをSortさせる処理のメモ

```C#
public class Person
{
  // 名前
  public string Name { get; set; }
  // 年齢
  public int Age { get; set; }
}

public class Main
{
  List<Person> people = new List<Person>()
  {
    new Person(){ Name = "a", Age = 10 },
    new Person(){ Name = "b", Age = 11 },
    new Person(){ Name = "c", Age = 12 }
  };

  public Main()
  {
    // 年齢昇順
    people.Sort((a, b) => a.Age - b.Age);
    // 年齢降順
    people.Sort((a, b) => b.Age - a.Age);
    // 名前昇順
    people.Sort((a, b) => string.Compare(a.Name, b.Name));
  }
}
```

###まとめ
`a - b` で昇順
`b - a` で降順
Microsoft Teams > UI > 保存したメッセージの表示 > 会話にはタイトルをつけるといい

```txt:動作環境
Windows 10 Pro (64bit) Anniversary Update適用済
Google Chrome バージョン: 65.0.3325.181（Official Build） （64 ビット）
```

Microsoft Teamsでは「このメッセージを保存します」という機能がある。
保存したメッセージ表示の方法が分かりにくい。

[公式サイト](https://support.office.com/ja-jp/article/%E3%83%81%E3%83%BC%E3%83%A0%E3%81%A7%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92%E4%BF%9D%E5%AD%98%E3%81%97%E3%81%BE%E3%81%99%E3%80%82-ef167e6b-987c-4d9d-9a53-5231514645bd)
にはFeedback(ご意見)の下にあるメニューからたどるようであるが、実際にはそこにはメニューはない (2018/03/27現在)。

同じメニューは右上にあるので、そこから「保存済み」を選択する。
左側のペインに「保存済み」のタイトルリストが表示される。
(右側のペインの会話はそのままで、この点はわかりにくいUIになっている)

### 備考

「保存済み」に表示されるのは会話の先頭文字列のため、会話の先頭文字列として「タイトル」を入れた方が会話の相手(保存者)にとって親切である。

この点を考慮していない会話の場合、保存一覧のリストには中身の分からない文字列が並ぶだけになる。

メールの件名と同じ。

検索性を考慮しない本当の「会話」であれば、タイトルを残さないという考えもあるかもしれない。