OmniAICreator/Qiita-1.07M huggingface dataset:
WordPress:前後記事へのリンクは同じカテゴリだけにしたい

#なにがしたいか
##よくあるやつ
「お知らせ」の記事詳細ページの"前の記事へ"、"次の記事へ"をクリックすると、
「お知らせ」カテゴリの前の記事、次の記事が出てくる
##違う、そうじゃない
「お知らせ」一覧から見たときにそうなってるのは分かるけど、
「すべての記事」一覧から見たときにもそうなることがある

#やること
- カテゴリー一覧開いたら「今どのカテゴリ一覧から遷移しているか」をセッションに追加

すでにセッションで「今どのカテゴリ一覧から遷移しているか」を持っていても
カテゴリー一覧にいる限りは常に更新

- 記事詳細ページ開いたときに「カテゴリ一覧から遷移してきたか」を確認
 
カテゴリ一覧からじゃなかったら公開されてる前後の記事出せばいいだけ

- カテゴリ一覧から遷移してきていたら見ていたカテゴリの記事を表示
 
これがやりたい

なので、複数カテゴリーが登録されている記事でも特定のカテゴリに絞れるよ！

#サンプルコード

```header.php
disp_category();
// HTMLタグの前（最初のPHPタグの中）に記述すること
```

```functions.php
function disp_category() {
	session_start();
	if (is_category()) {
		$_SESSION['cat'] = get_queried_object()->term_id;
	} elseif (!is_single()) {
		session_destroy();
	} 
}
```

```single.php
// 記事のタイトル部とか本文部とか省略

// カテゴリによって前後の取得記事を変える
$args = array(
	'posts_per_page'   => -1,
	'offset'           => 0,
	'orderby'          => 'date',
	'order'            => 'DESC',
	'post_type'        => 'post',
	'post_status'      => 'publish',
	'suppress_filters' => false,
);
// セッションにカテゴリがある場合、そのカテゴリの記事を取得
if ($_SESSION['cat'] !== null) {
	$args['cat'] = $_SESSION['cat'];
}
$posts_array = get_posts( $args );
$plural_flg = (count($posts_array) > 1) ? true : false;
$post_detail = array();

foreach ($posts_array as $key => $value) {
	//配列から現在の記事情報を参照
	if (get_the_ID() == $value->ID && $plural_flg) {
		if ($key == 0) {
			//最初の記事
			$post_detail['pre']['id'] = $posts_array[$key+1]->ID;
		} else if($key + 1 >= count($posts_array)){
			//最後の記事
			$post_detail['next']['id'] = $posts_array[$key-1]->ID;
		} else {
			//通常の記事
			$post_detail['pre']['id'] = $posts_array[$key+1]->ID;
			$post_detail['next']['id'] = $posts_array[$key-1]->ID;
		}
		break;
	}
}
?>
<!-- 前後の記事へ -->
<?php if (count($post_detail) > 0) { ?>
				<div>
<?php     if (isset($post_detail['pre'])) { ?>
					<a href="<?php the_permalink($post_detail['pre']['id']); ?>" rel="prev"><p>前の記事へ</p></a>
<?php     } ?>
<?php     if (isset($post_detail['next'])) { ?>
					<a href="<?php the_permalink($post_detail['next']['id']); ?>" rel="next"><p>次の記事へ</p></a>
<?php     } ?>
				</div>
<?php } ?>
```
`<!-- 前後の記事へ -->`のところはdivタグで囲ってたりpタグ使ってたりしますがそのへんはご自由に
#いろいろ
##利点
- カテゴリーを取得してくるので、パンくずにどのカテゴリー一覧から来たか出したいときにそのまま出せる

##問題点
- 前後の記事を探すのに```'posts_per_page'   => -1,```を使っているので、記事数が多くなるとブラウザがお亡くなりになる。
Starter から Community Edition に変更する手順

Support の記事として [Community Edition から 製品版 (Professional / Enterprise / Architect) に変更する手順](http://support.embarcadero.com/jp/article/44785) を書いた
こちらは Starter から Community Edition に変更する手順にするよ

Community Edition のインストーラの入手は、[Delphi 10.2.3 Community Edition をインストール](https://qiita.com/CYonezawa/items/3670d6e75fdfa628be6f) の記事で書いているので、そちらを見てね

## 1. ダウンロードした Community Edition のインストーラを実行します
## 2. お使いのシステムに RAD Studio 10.2 の前バージョンが見つかりました。」のダイアログが表示されます
![uninst_01.png](https://qiita-image-store.s3.amazonaws.com/0/164551/6b7590e9-6991-7486-23a3-bc1da9929b96.png)

## 3. 「はい」を選択して [アンインストール] のボタンをクリックします
## 4. 「RAD Studio 10.2 とその関連コンポーネントをすべて削除します。よろしいですか？」のダイアログが表示されるので [はい] をクリックします
![uninst_03.png](https://qiita-image-store.s3.amazonaws.com/0/164551/098cf422-26b8-a8ed-d11b-2a002e1324e2.png)

## 5. アンインストールが始まります
![uninst_04.png](https://qiita-image-store.s3.amazonaws.com/0/164551/ac12e8de-dadb-7967-78bc-50b73a3d4ea7.png)

## 6. 「RAD Studio 10.2 はご使用のコンピュータから正常に削除されました」のダイアログが表示されます。[OK]ボタンをクリックします。
![uninst_05.png](https://qiita-image-store.s3.amazonaws.com/0/164551/6e9e88e9-46d2-2247-9819-37ab5afb5971.png)

## 7. セットアップ画面が表示されます。使用許諾契約書をご覧頂き、同意してインストールを行われる場合は「RAD Studio使用許諾契約およびプライバシーポリシーに同意する」にチェックを付けて、[次へ]をクリックします。
![uninst_06.png](https://qiita-image-store.s3.amazonaws.com/0/164551/2717adf9-c063-9a5c-7cf7-e597edc45003.png)

## 8. 「既存のライセンスが見つかりました」の画面が表示されます。「新規ライセンスの入力」を選択して[インストール]をクリックします。
![uninst_07.png](https://qiita-image-store.s3.amazonaws.com/0/164551/ad9dcba1-fb4b-d510-e55a-015a9a9a1914.png)

## 9. ライセンスのオプションを選択する画面が表示されます。「製品の Serial Numberを既に入手している」を選択して[インストール] をクリックします
![uninst_08.png](https://qiita-image-store.s3.amazonaws.com/0/164551/7faa0f4c-cab4-25da-6d03-234e53cd5546.png)

## 10. しばらくすると「Embarcadero 製品登録」が表示されます。製品版のインストール番号(Serial Number)と、EDNアカウントのログイン名と、パスワードを入力して [登録]ボタンをクリックしてライセンスの認証を行ないます
![uninst_09.png](https://qiita-image-store.s3.amazonaws.com/0/164551/56aa7a75-d730-4149-6781-550df8445a7d.png)

## 11. ライセンスの認証が完了し、しばらくすると「プラットフォーム選択」の画面が表示されます。
![inst07.png](https://qiita-image-store.s3.amazonaws.com/0/164551/8dfba301-cf2b-2509-5030-549ee8a9801d.png)

## 12. 後は、インストールするプラットフォームや、追加オプションを選択して [インストール] をクリックし、インストールを行います。


## 参考
[Delphi 10.2.3 Community Edition をインストール](https://qiita.com/CYonezawa/items/3670d6e75fdfa628be6f)
FontAwesome Pro、購入後にライセンス切れになったらPro用アイコンはどうなるのか。顧客への納品物にProバージョンを使った場合、ライセンスはどうなるの？

この記事は以下のサイトへ移動しました

[FontAwesome Pro、購入後にライセンス切れになったらPro用アイコンはどうなるのか。顧客への納品物にProバージョンを使った場合、ライセンスはどうなるの？](http://www.art-side.com/archives/133)
Vue CLI 3: Bootstrap 4が加えられたプロジェクトを簡単につくる


[Vue CLI](https://cli.vuejs.org/)は、Vue.jsによるアプリケーションをつくるための、コマンドラインインタフェース(CLI)にもとづく開発ツールです(「[Vue CLI 3入門 01: Vue CLIとは](http://www.fumiononaka.com/Business/html5/FN1807001.html)」参照)。2018年7月16日にv3.0.0-rc.5が公開されました。さらに、[Bootstrap-Vue](https://bootstrap-vue.js.org/)を使うと、Bootstrap 4が加えられたプロジェクトのひな形を簡単につくれます(図001)。

#### 図001■Bootstrap-Vueサイト
![qiita_07_001_001.png](https://qiita-image-store.s3.amazonaws.com/0/128949/265c7156-1097-8e55-9113-c65457698802.png)

# Vue CLI 3をインストールする
まず、Vue CLI 3をグローバルにインストールします(「[Vue CLI 3入門 02: インストールする](http://www.fumiononaka.com/Business/html5/FN1807002.html)」参照)。v3.0.0-rc.5はリリース前(Release Candidate)の最終段階です。けれども、すでに[前のバージョン(`vue-cli`)は使用が推奨されません](https://github.com/vuejs/vue-cli/tree/v2#vue-cli--)(deprecated)。パッケージ名が`@vue/cli`に変わりましたので、ご注意ください。

```terminal
npm install -g @vue/cli
```

macOSで管理者権限が求められたときは、つぎのように[`sudo`コマンド](https://ja.wikipedia.org/wiki/Sudo)を添えてインストールし直してください。

```terminal
sudo npm install -g @vue/cli
```


# Bootstrap-Vueでプロジェクトをつくる
Bootstrap-Vueにはふたつのテンプレートがあります。

- [`webpack-simple`](https://github.com/bootstrap-vue/webpack-simple): 簡易なひな形でテストや小さなアプリケーションをつくる
- [`webpack`](https://github.com/bootstrap-vue/webpack): 多くのオプションが備わった製品用のテンプレートでひな形をつくる

コマンドラインツールでつぎのように打ち込むと、簡易テンプレート(`webpack-simple`)でプロジェクト(`my-project `)がつくられます。テンプレートを製品用(`webpack`)に差し替えれば、製品用のひな形になります。

```terminal
vue init bootstrap-vue/webpack-simple my-project

? Project name my-project
? Project description A Vue.js project
? Author fumio nonaka
? Use sass? Yes

   vue-cli · Generated "my-project".

   To get started:
   
     cd my-project
     npm install
     npm run dev.
```

メッセージに示されたとおり、ディレクトリを切り替えてインストールし、`npm run dev`と入力すればアプリケーションがローカルサーバーで開かれます。

```terminal
cd my-project
npm install
npm run dev.
```

これで、プロジェクト(`App.vue`)のテンプレートにはBootstrap 4のスタイルが使えるようになりました。たとえば「[Buttons](https://getbootstrap.com/docs/4.1/components/buttons/)」のクラスでリンクをボタンに変えられます(図002)。

```html
<ul>
  <li><a href="https://vuejs.org" target="_blank"
    class="btn btn-primary">Core Docs</a></li>
  <li><a href="https://forum.vuejs.org" target="_blank"
    class="btn btn-success">Forum</a></li>
  <li><a href="https://gitter.im/vuejs/vue" target="_blank"
    class="btn btn-danger">Gitter Chat</a></li>
  <li><a href="https://twitter.com/vuejs" target="_blank"
    class="btn btn-dark">Twitter</a></li>
</ul>
```

#### 図002■BootstrapのButtonsのスタイルが使える
![qiita_07_001_002.png](https://qiita-image-store.s3.amazonaws.com/0/128949/53c61e26-a2ab-802a-7a21-bc292e6e91a5.png)
ctypesで文字列を扱う

# 文字列のラップ
Pythonで文字列を引数にとる関数のラッピングをします．

```c:c
#include <stdio.h>

void print_string(char* string)
{
  printf("%s\n", string);
}

int main(void)
{
  char string[] = "Hello World!";
  print_string(string);


  return 0;
}
```

以上のプログラムでprint_string関数は文字列を引数にとり，そのまま出力しています．

これをラップするPythonプログラムは以下のとおりです．

```Python:Python
import ctypes

libc = ctypes.cdll.LoadLibrary('./libstring.so')
str = 'Hello World!'
enc_str = str.encode('utf-8')
str = ctypes.create_string_buffer(enc_str)

libc.print_string(str)
```

他のラップツールはどうか知りませんが，ctypesで文字列を扱うときにはPython側で文字列の型付けをきちんとしなければなりません．

encode, create_string_bufferをしている2行を消すと，以下のように1文字しか出力されません．

```
H
```

# 文字列配列のラップ

```c:c
#include <stdio.h>

void print_str_ary(int n, char** str_ary)
{
  int i;
  for(i = 0; i < n; i++){
    printf("%s\n", str_ary[i]);
  }
}

int main(void)
{
  int n = 3;
  char* str_ary[] = {"Hello", "World", "!"};
  print_str_ary(n, str_ary);

  return 0;
}
```

以上の文字列配列を受け取り出力する関数をラップします．

```python:Python
import ctypes

libc = ctypes.cdll.LoadLibrary('./libstring_array.so')
hello = ['Hello', 'World', '!']
str_ary = (ctypes.POINTER(ctypes.c_char) * len(hello))()

for i, str in enumerate(hello):
    enc_str = str.encode('utf-8')
    str_ary[i] = ctypes.create_string_buffer(enc_str)

libc.print_str_ary(len(str_ary), str_ary)
```

char型のポインターが3つ有ることをあらかじめ示しています．この方法と別に，引数の方を予め宣言する方法があるみたいなのですが，調べきれていません．
laravel5.5のバリデータルールでカンマがエスケープされない件

バリデータで電話番号をバリデートしたい

```php
    public function rules()
    {
        return [
			'fax' => 'required | regex:/^0[0-9]{9,14}$/',
			'file' => 'required | file',
        ];
    }
```
このように設定したが

> preg_match(): No ending delimiter '/' found

このようなエラーが発生した。
どうやらバリデータルール内にカンマが存在すると別の引数に扱われるらしい。

https://readouble.com/laravel/5.5/ja/validation.html
>注目： regexパターンを使用する場合はルールをパイプ（縦棒）で区切らず、配列で指定する必要があります。特に正規表現に縦棒を含んでいる場合に該当します。

だそうなので

```php
    public function rules()
    {
        return [
			'fax' => ['required , regex:/^0[0-9]{9,14}$/'],
			'file' => ['required , file'],
        ];
    }
```

これでバリデートできる。
Cyberduck で IBM Cloud Object Stoage にファイル転送する

CyberduckはFTP, SFTP, WebDAV, Amazon S3等に対応したファイル転送用のクライアントソフトウェアです。IBM Cloud Object Storage(ICOS) は S3 APIに対応しているため、Cyberduckでファイル転送が可能です。この記事では Mac にCyberduckをインストールしてICOSにファイル転送する手順を記載します。

# インストール
以下のサイトからダウンロードしてインストールします。
https://cyberduck.io/

# ICOSの準備
IBM CloudでICOSのインスタンスを作成します。

## Credential の作成
新規視覚情報追加で、構成パラメーターに {"HMAC":true} を指定します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/fa9fe3d6-41b4-8225-0365-4f396363c113.png)

追加すると "cos_hmac_keys" 下に、"access_key_id", "secret_access_key"が生成されているので、保存しておきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/654c83ef-082a-5223-f1ef-023b0e5fbe84.png)

また、エンドポイント画面でサービス・エンドポイントを確認しておきます。ここでは us-geo
 のエンドポイントを使用します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/0d2b936c-5eb4-e970-b475-0059b819f791.png)

# Cyberduckの設定
Cyberduckを起動して、左下の「＋」をクリックします。
ダイアログボックスで「Amazon S3」を選択し、適当なニックネーム、先ほど確認したエンドポイント、"access_key_id"を入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/335469f5-5501-16f8-2e60-e4c6c93df88b.png)

ダイアログボックスを閉じて、作成した接続先をダブルクリックし、"secret_access_key"を入力します。ログインが成功するとバケットの一覧が参照可能です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/cfb5f9d9-1c8c-df8d-18d3-d5fb77defe01.png)


# ファイル転送
アクションメニューから「新規フォルダ」を選択し、名前を入力すると新規バケットが作成可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/9527da60-5841-081e-55bb-a457445aafd3.png)

作成されたバケット名をダブルクリックするとバケットの中が参照可能です。（作成直後なので空）
ここにFinderからフォルダをドラッグ&ドロップすると、フォルダ配下のファイルをバケットに転送することができます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/235649/d315b38a-04a3-2875-f312-792845243ead.png)
Live2Dの動画チュートリアルを見ながら①

http://docs.live2d.com/cubism-editor-tutorials/psd/

1.イラストの加工


まず大きく、髪・顔・体に分ける


さらに細かく分ける
●髪の分割
　前髪
　横髪
　後ろ髪


●顔の分割
　目(まつ毛・目玉・白目)
　鼻
　口(上くちびる・下唇・口内)
　輪郭
　耳

眉
鼻
は単体で大丈夫


●体は
　首(口の高さまで伸ばしておく)
　胴体
　腕
　足
MySQL ストアドプログラム内での動的SQL

MySQLで動的SQLを勉強した際、かなりてこずったのでまとめておきます。

# 動的SQLの必要性
静的SQL(通常のSQL)ではSQL文を書いたときに呼び出す内容が確定しているが、
動的SQLを使えばクエリの内容を可変にできる。

たとえば、t1というテーブルにおいて
変数 <span>@</span>var_in が1のとき var_1 のカラムを参照、
変数 <span>@</span>var_in が2のとき var_2 のカラムを参照、
：
：
変数 <span>@</span>var_in がNのとき var_N のカラムを参照、
というようなプログラムを書きたいとする。

Nが3であれば静的SQLだけでも下のように書くこともできる。

```sql:静的SQL
SET @var_in := 1;
SELECT
  (CASE 
   WHEN @var_in=1 THEN var_1
   WHEN @var_in=2 THEN var_2
   WHEN @var_in=3 THEN var_3
	ELSE  null 
	END)
	FROM t1;
```

しかしこのNが10、100、1000と増えていった時にすべて条件分岐を書き出すのはかなり大変になり、
動的SQLを使うメリットが大きくなる。

# MySQLでの動的SQL
動的SQLは定義された文字列をクエリとして認識させることができ、
クエリ自体を可変にできる。
以下が先の課題をクリアできるプログラムとなる。

```sql:動的SQL
SET @q := CONCAT("SELECT var_",@var_in,"FROM t1");
-- @var_in = 1  ->  "SELECT var_1 FROM t1"
PREPARE stmt FROM @q;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
```

1行目：クエリとしたい文字列を定義する。
2行目：stmtをEXECUTEしたときにこの文字列をクエリとして認識するよう命令する。
3行目：実際にEXECUTEして可変なクエリを実行する。
4行目：stmtを開放する。

# ストアドプログラム内での動的SQL
ただし、ストアドプログラム内では、動的SQLに用いる変数について注意が必要である。
通常、

```sql 
DECLARE var_name INT;
```

のように定義されている変数については、

```sql
SELECT COUNT(*) INTO var_name;
```

のようにして、変数に値を代入したり、

```sql
INSERT INTO t1 VALUES (var_name);
```

のようにテーブルに挿入することが可能だが、ストアドプログラム内の動的SQLでは不可能で、
クエリ内で扱える変数は頭に@を付けたユーザー定義変数のみである。

たとえば、先のプログラムから少し変更して、
変数 <span>@</span>var_in がNのとき var_N のカラムの平均値を、<span>@</span>v_out_Nに出力するプログラムを書きたいとする。
この時は以下のように書かなくてはならない。

```sql
SET @q := CONCAT("SELECT AVG(var_",@var_in,") INTO @var_out_",@var_in," FROM t1");
-- @var_in＝1  ->  "SELECT AVG(var_1) INTO @var_out_1 FROM t1"
PREPARE stmt FROM @q;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
```

また、このとき<span>@</span>var_inや<span>@</span>var_out_NをDECLAREで定義する必要はない。

# まとめ
私はwebサービスの開発などの経験はなく、例にあったような場面に遭遇したわけではないのですが、機械学習用のデータセットを作成する際にpythonのpandasなどでいうapply関数のような動作を動的SQLで実装しました。
同じような操作を行ごとに行うのはカーソルで十分ですが、列ごとに同じ操作を繰り返すには動的SQLを使う必要がありそうです。
個人学習メモ#6 HTML・CSSのルールを少し振り返る

web制作会社Style様からの引用です。
http://www.hp-stylelink.com/news/2013/10/20131001.php

プロトコル
-
埋め込みリソースからhttp,httpsを省略する

.sample{
background: url(//www.google.com/images/example);
}


フォーマットに関するルール
-

インデントは半角スペース２文字とし、タブや半角スペースを混合して使用しない

.sample{
---color:blue;
--color:blue;（推奨）
}

プロパティの終端
-
プロパティ名のコロンの後にスペースを挿入する

font-weight:□bold;

CSSの引用符
-
URLの指定には引用符を使用しない。
セレクタとプロパティの値には二重引用符ではなく単一引用符を使用する。

@import url(//www〜);
font-family: 'open sans';
Vue.jsでコンポーネントフレームワークのElement導入3分クッキング

## はじめに

まずエレメント導入前に
[Vue.jsとMaterializeを組み合わせてはイケない理由](https://qiita.com/neuwell/items/8ed63e240098e8ca8c1c)
こんな事をしてしまってElement UIを使う形になりました。

http://element.eleme.io/#/en-US



## 導入ステップ

npm で導入

```
npm i element-ui -S
```


main.jsで必要なモジュールを読み込み
プラグインに登録して、すべてのコンポーネントでElement UIのコンポーネントが利用できるように設定

```javascript:main.js

import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'

Vue.use(ElementUI)
```


## コンポーネントを配置
各コンポーネントでは予め定義されたコンポーネントを呼び出します。
単純に確認するだけなら、ボタン系のコンポーネントを配置してみるのが良いかなと思います。

```vuejs:Sample.vue
<el-button>Default</el-button>
```


## 展望
次回はFormコンポーネントを使った便利なバリデーションの実装を予定しています。
小生の知見で良ければ見てみてください～
Pythonでプログラミングを始めよう!　〜print文の使い方〜

#前提
 Python v3.6

#print文とは
今回は、print文のいろいろな使い方を説明していきたいと思います。
printとはPythonでコンソールや画面に文字列を出力する際に使用するもので、
基本中の基本になりますのでしっかりと覚えましょう。

#基本的なprintの構文
print関数の引数に出力したい文字列を入力します。

```python
print('出力したい文字列')

print('出力したい', end='') #改行をいれたくない場合は第２引数を左記のようにします。
print('文字列')
```

<出力結果>

```
出力したい文字列
出力したい文字列
```

#変数に格納した内容を出力
```python
apple  = 'りんご'
orange = 'みかん'

print(apple)
print(orange)
```
<出力結果>

```
りんご
みかん
```
変数の値が数値の場合でも基本的に出力の仕方は同じです。

```python
digit  = 10

print(digit)
```
<出力結果>

```
10
```

#format関数を使ってみよう
print関数で変数を任意の文字列とともに出力したいときに使用します。
基本的な構文は以下のようになります。

```python
'文字列{}文字列'.format(変数)
```

複数の引数を与える場合には下記のようにします。

```python
'{0}, {1}, {2}...'.format(変数1, 変数2, 変数3….) 
'{foo1}, {foo2},{foo3}..'.format(foo1=変数1, foo2=変数2, foo3=変数…)
```

出力時の書式を指定することも出来ますが今回は割愛します。
興味がある方は[こちら](https://docs.python.jp/3.6/library/string.html#format-specification-mini-language)を参照していろいろ試してみてください。

例)ある数値を２進数、8進数、１０進数、１６進数で表示する

```python
foo = 125
print('2進数：{:b}'.format(foo))
print('8進数：{:o}'.format(foo))
print('10進数：{:d}'.format(foo))
print('16進数：{:x}'.format(foo))
```
<出力結果>

```
2進数：1111101
8進数：175
10進数：125
16進数：7d
```
#f記法を使ってみよう。
Python3.6からformat関数を使わなくても、fで始まる文字列リテラルf"" で簡単に文字列埋め込みができるようになりました。

```python
foo = 'Hello'
bar = 'World!'
print(f"{foo} {bar}")
```
<出力結果>

```
Hello World!
```


#まとめ
print文の使用方法と併せて、format関数、f記法についても説明させて頂きました。
これらについては、非常に使う場面が多いと思うのでしっかりと理解して覚えておくと、
良いと思います。

次回はif文についてに説明していきたいとおもいます！
WordPress:オリジナルページャーの作り方

#ページャー is 何
アーカイブページでよくある
```<< 1 2 3 4 5 >>```
とかよくあるそんなやつ

#プラグインでいいのでは？
公式テーマとかだとそれでいいんだろうけども
スタイル上自動で吐き出すHTMLじゃスタイルいじるのメンドかったりするし

ページャーのスタイルサンプルをサイト上でいくつか公開してくださってる方もいるけど、
みんな同じHTMLタグなわけじゃないから柔軟にこっちで変えたい人向け

#コード

```functions.php
function this_pagination($pages = '', $paged) {
    // ページネーション
    if ($pages != 1) { ?>
<?php
        // ページャーは5つまでなので表示させるページ番号を設定
        if ($pages < 6 || $paged <= 3) {
            $view_array = array(1, 2, 3, 4, 5);
        } elseif (($pages - $paged) <= 2) {
            $view_array = array($pages - 4, $pages - 3, $pages - 2, $pages - 1, $pages);
        } else {
            $view_array = array($paged - 2, $paged - 1, $paged, $paged + 1, $paged + 2);
        }
?>
					<!--#pager-->
					<div id="pager">
						<ul>
<?php   if ($paged != 1) { ?>
<?php       /* 最初のページ以外は"前へ"のリンクを生成*/ ?>
        					<li class="first"><a href="<?php echo get_pagenum_link(1); ?>"><img src="/img/left_arrow1.png" alt="最前"></a></li>
        					<li class="prev"><a href="<?php echo get_pagenum_link($paged - 1); ?>"><img src="/img/left_arrow2.png" alt="前"></a></li>
<?php   } else { ?>
        					<li class="first"><img src="/img/left_arrow1.png" alt="最前"></li>
							<li class="prev"><img src="/img/left_arrow2.png" alt="前"></li>
<?php
        }
    //番号つきページ送りボタン
        for ($i=1; $i <= $pages; $i++) {
                if ($paged == $i) {
                    // 自ページ
?>
							<li class="no current"><a href="<?php echo get_pagenum_link($i); ?>"><?php echo $i; ?></a></li>
<?php
                } elseif (in_array($i, $view_array)) {
?>
							<li class="no"><a href="<?php echo get_pagenum_link($i); ?>"><?php echo $i; ?></a></li>
<?php           }
        }
        if ($paged < $pages) {
            // 最終ページ以外は"次へ"のリンクを生成
?>
							<li class="next"><a href="<?php echo get_pagenum_link($paged + 1); ?>"><img src="/img/right_arrow1.png" alt="次"></a></li>
							<li class="last"><a href="<?php echo get_pagenum_link($pages); ?>"><img src="/img/right_arrow2.png" alt="最後"></a></li>
<?php   } else { ?>
							<li class="next"><img src="/img/right_arrow1.png" alt="次"></li>
        					<li class="last"><img src="/img/right_arrow2.png" alt="最後"></li>
<?php   } ?>
						</ul>
					</div>
					<!--#pager-->
<?php }
}
```
ページャ箇所のHTMLはfunctions.phpに書いちゃいます。
クラス名なんかも自分なりのものに変更しちゃいましょう。

他にimgタグ箇所は画像を用意しなくてもテキストで
```&lt;```
とか
```前へ```
とか書いちゃっても可

```サブクエリなしの場合|archive.php
global $wp_query;

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$max_page = $wp_query->max_num_pages;

  //記事一覧表示させる記述をここに
  //一覧表示の記述は省略

this_pagination($max_page, $paged);

```

```WP_Queryを使ったサブクエリを使っている場合|archive.php
$paged = get_query_var('paged') ? get_query_var('paged') : 1;
$args = array(
// ここに記事取得条件を記載
);
$the_query = new WP_Query($args);

if ( $the_query->have_posts() ) {

    //記事一覧表示させる記述をここに
    //一覧表示の記述は省略

    this_pagination($the_query->max_num_pages, $paged);
}
 
```

archive.phpはサブクエリ使うかどうかでも少し変わりますが、
大きく変わるのはmax_num_pagesをどこから呼び出すかなので、
用途によって変えましょう。

#2018.08.03. 追記
「ページャ」と「ページャー」どっちでみんな調べるんやろと思ってGoogle先生に聞いてみたら
「ページャ」：約 102,000 件
「ページャー」：約 148,000 件
だったので長いものに巻かれるように表記変更をしました。
gitのsshの設定

# この記事を書いた経緯

研究室内でgitlabを使ってソースコードを管理しているが, HTTPで接続するといちいちログインパスを聞かれるので, ssh接続にして公開鍵認証でログインするようにした。

# 設定方法

## 計算機サーバーでの設定

```
# 公開鍵生成
ssh-keygen
# パスとパスフレーズ設定(デフォルトでもよい。セキュリティ的に良くないが)

# 公開鍵をコピーする
cat  ~/.ssh/id_rsa

# gitlabサーバーを公開鍵で接続するように設定
vim ~/.ssh/config
```

```config:config
Host 10.228.155.190
User tsawa
IdentityFile ~/.ssh/id_rsa
```


## gitlabでの設定

1. ブラウザを使ってgitlabにアクセスする
2. 任意のプロジェクトの設定をsshにする
3. SetttingsのSSH Keysを開く
4. Keyに公開鍵をペースト, Titleを入れてAdd Key

# まとめ
これをすればクーロンしたときなんかもパスを聞かれないはず
Railsでajaxリクエストが２回行われる問題と対策

## 問題
Rails5でAjaxを使って部分テンプレートの更新を行った際、ちょっと動作がもっさりしてるなーと思ったら、Ajaxによるリクエストが２回行われていた。

## 原因
```javascript:application.js
//= require jquery
//= require jquery_ujs
//= require jquery.slick
//= require rails-ujs
//= require activestorage
//= require turbolinks
//= require_tree .
```

↑で読み込んでいる`jquery_ujs`と`rails-ujs`はどちらもajax処理を担うライブラリ。
２つとも読み込んでいるため、それぞれがajaxリクエストを行った結果、２回リクエストが発生していた。

## 対策

+ `//= require jquery_ujs`を削除。

調べてみたところ、Rails5.0以前では`remote:true`なformの動作に`jquery_ujs`が使用されていたが、5.1以降は脱jQueryを図るため`rails-ujs`に移行したのだとか。

## 参考
https://rails-school.net/rails51-jquery/
https://stackoverflow.com/questions/7411271/form-submitted-twice-due-to-remote-true
std::tupleに関数を格納して回してみた

#はじめに

templateを使って、std::tupleに関数を格納して回してみた(タイトルママ)

#やったこと

[C++ の std::tuple で動的にループする](http://secret-garden.hatenablog.com/entry/2018/02/17/130750)
と
[静的ポリモーフィズムの安全で簡単な実装 -動的から静的にしてパフォーマンス向上-のこのコメント](https://qiita.com/Riyaaaa_a/items/887f6190e710c6410994#comment-d9200bc3279c260fa395)

を参考に書いてみた

```cpp:C++
#include <iostream>
#include <vector>
#include <functional>
#include <tuple>

template <typename Func, typename ...Args>
void func_each(std::tuple<Args...> const& args, Func func){
    std::apply([&](auto... arg) constexpr{(func(arg), ...);}, args);
}

void func1(){
    std::cout << "func1" << std::endl;
}

void func2(){
    std::cout << "func2" << std::endl;
}

int main(){

    auto var = std::tuple(&func1, &func2);

    func_each(var, [&](auto it){it();});
    
    return 0;   
}

```


[実際のコード](https://wandbox.org/permlink/ltQklD6juHyUOFa3)

#参考
[C++ の std::tuple で動的にループする](http://secret-garden.hatenablog.com/entry/2018/02/17/130750)

[静的ポリモーフィズムの安全で簡単な実装 -動的から静的にしてパフォーマンス向上-のこのコメント](https://qiita.com/Riyaaaa_a/items/887f6190e710c6410994#comment-d9200bc3279c260fa395)

[C++のパラメータパック基礎&パック展開テクニック](https://qiita.com/_EnumHack/items/677363eec054d70b298d)
fastlane match で、急に Certificate 'XXXXXXXX'   (stored in your git repo) is not available on the Developer Portal とかいわれたら？

fastlane match 急に次のようなエラーが発生して動作しない時があります。

```
Certificate 'YourTeamID' (stored in your git repo) is not available on the Developer Portal
for the user hoge@example.com
Make sure to use the same user and team every time you run 'match' for this
Git repository. This might be caused by revoking the certificate on the Dev Portal
```

このエラーがでたら、まずiTunesConnect を確認しましょう。
iTunesConnect の規約がかわって、新しい規約に Agree しなければならないという状況の時があります。

たまにしなく結構忘れがちなので自戒をこめてメモメモ。
html-pipeline で HTML タグのエスケープ処理をしない

html-pipeline を使ってマークダウンを変換したり、任意のテキスト処理をしたりしますが、デフォルトで組み込まれている `HTML::Pipeline::MarkdownFilter` は `<script>` や `<iframe>` などのタグをエスケープ処理するようになっています。

より正確に言うと `HTML::Pipeline::MarkdownFilter` の内部で使っている `CommonMarker` の `tagfilter` オプションで処理されています。

html-pipeline version 2.7 未満はデフォルトで指定されていましたが、それ以降はオプションを上書きできるようになりました。

- 参考のコミット https://github.com/jch/html-pipeline/commit/dc0f98a67e55af2742a52ebff7726c034966d0fd#diff-ac300151d13e7ca24cea951a5cb28cf1

こんな感じで `tagfilter` 以外のオプションを指定してあげると、 `<script>` や `<iframe>` を使うことができます。当然、悪意のあるコードが実行されてしまうので気をつけてください。

```ruby
module Markdown
  class Processor
    def call(input)
      filters = [
        HTML::Pipeline::MarkdownFilter
      ]
      context = {
        commonmarker_extensions: %i[table strikethrough autolink]
      }
      HTML::Pipeline.new(filters, context).call(input)
    end
  end
end
```
試験 Azure 70-533 を1週間で取得 Day0

1週間くらいで試験70-533のためにやった対策を備忘として書いておきます。
試験受けられる方は参考にしてください。なるべく手を動かして本記事を書いていきます。

Azure関連の試験は常に更新されているので情報が一番新しい（自身の試験日と近い）情報を収集しておくとよいです。

#環境設定
Day1に行った資格取得の勉強のための環境設定です

##パソコン周り
- Macbook-Pro, Internet, Azure触るときのブラウザはChrome versionは下記
 - バージョン: 67.0.3396.99（Official Build） （64 ビット）
- Microsoft accountとAzure accountを作成します
 - 携帯電話に認証コード送ったり同じ情報何度も入れたり面倒くさい...

##教材周り
- Skillpipeで教材を電子書籍的なもので入手(研修で配布)
- 他の方も利用している基本教材を購入しチラチラ読む


![513Xf44iGHL._SX260_.jpg](https://qiita-image-store.s3.amazonaws.com/0/187331/2016e17a-9190-17fc-b0cf-002f4fc7b3dd.jpeg)

この教材を読みつつ、実環境触りつつ、テキストを読みつつという基本的なスタイル
   
##研修と模擬試験周り
- 1週間のAzure IT infrastructure solution の研修を申し込み
- CramMedia(模擬試験)は6000円もする…のでお金に余裕がある人だけ!
<https://www.crammedia.com/70-533-Implementing-Microsoft-Azure-Infrastructure-Solutions/p/416/240>
- Braindump2go は英語だけどPDFで貰えるし、最新で問題量も多い 価格は10000円!!!
<https://www.braindump2go.com>

※模擬試験は「答えを信用せず、調査して裏付けを取っておくこと」が重要
Azure試験は新しく問題も難しいので上記の作業をやっておかないと本番、泣くそうです

次のDay1より内容に入っていきます

※この記事は2018年7月に書かれたものです
windows7にnode.jsとnpm環境を構築する。

#**記事概要**
windows7(64bit版)上にnode.jsとnpm(node.jsのパッケージ管理ツール)が動作する環境を作成する手順を共有させていただきます！

*本記事の平均読了時間は5分です。*

#**目次**
- 構築手順

#**構築手順**
##Node.js(+npm)のインストール
以下の[公式サイト](https://nodejs.org/ja/)からwindows(x64)用のインストーラをダウンロードします。
https://nodejs.org/ja/

＊推奨版と最新版がありますが本記事では推奨版をインストールしていきます。
![node_js_install.png](https://qiita-image-store.s3.amazonaws.com/0/242105/6dcf3f8e-6890-9de0-7239-895c84a2cd6e.png)

インストーラはデフォルト設定で進めていきます。
ひたすら Next... Install...

インストールが完了したらnode.jsとnpmのバージョンを確認して正常にインストールがされていることを確認します。


```bash:Node.jsのバージョン確認
node -v
> vX.X.X     *インストールしたnode.jsのバージョンが表示
```

```bash:npmのバージョン確認
npm -v
> X.X.X      *インストールしたnpmのバージョンが表示
```


##パス設定
npmでパッケージをインストールする場合はパスを設定しておくと後で悲しい思いをしなくてすみます。
npmなんざつかわねぇ、俺がパッケージ管理ツールだ。
という方は設定しなくても大丈夫です！

```bash:npmのグローバルパスを確認
npm bin -g
> C:\Users\UserName\AppData\Roaming\npm
```

取得したパスに \node_modules を追加してパスを設定します。

```bash:パス設定
set NODE_PATH=C:\Users\UserName\AppData\Roaming\npm\node_modules
```

お疲れ様でした。環境構築は以上で終了です！
Spring Bootで設定値の取得初歩 [Kotlin]

Sping Bootで設定値を取得する初歩的な方法をお伝えします。
リクエスト内容に対応する設定値を返却する簡素なREST APIを題材にします。
なお、本投稿のソースコードはKotlinで記述しております。

## 準備
Spring Bootにおいて設定値は基本的にapplication.propertiesまたはapplication.ymlに記述します。
今回は以下のように設定値を記述します。

```yml:application.yml
colors:
  red: あか
  blue: あお

fruits:
  prices:
    apple: 150
    orange: 100
```

この設定値をソースコードから取得したいと思います。

## Propertiesクラス
各設定値を格納するBeanクラスを作成します。
私はこのクラス作成するときに***Properties.ktと名前をつけています。
例えば前述のapplication.ymlのcolors項であれば以下のように作成します。

```kotlin:ColorProperties.kt
@Component // 1
@ConfigurationProperties(prefix = "colors") // 2
class PlatformProperties {
    lateinit var red: String // 3
    lateinit var blue: String // 3
}
```
1. BeanクラスとしてDIコンテナにのせるため記述しています。
2. こちらのアノテーションを付与することで、クラスのプロパティに設定ファイル(application.yml)から自動的に値を挿入します。またprefixパラメータを渡すことで、今回であればcolors項のみを取得します。なお、現状ではプロパティをvalで定義できず、lateinit varで定義する必要があります。([参考](https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-kotlin.html#boot-features-kotlin-configuration-properties))
3. 2のアノテーションにより自動的に設定値が挿入されます。ただし、プロパティと設定ファイル間での名前や型が一致している必要があります。

同様にfruits項も以下のようにPropertiesクラスを作成します。

```kotlin:FruitProperties.kt
@Component
@ConfigurationProperties(prefix = "fruits")
class FruitProperties {
    lateinit var prices: Map<String, Int>
}
```
こちらは設定ファイルのfruits項がcolors項よりネストが1段深くなっているため、Mapでプロパティを定義しています。

## 取得
ここまでで準備は整いました。あとは作成したPropertiesクラスから設定値を取得するだけです。
試しに以下のようなControllerクラスを作成します。

```kotlin:Controller.kt
@RestController
class Controller(
        val colorProperties: PlatformProperties,
        val fruitProperties: FruitProperties      // 1
) {
    @GetMapping("colors/red")
    fun translateColorToJapanese(): String {
        return colorProperties.red // 2
    }

    @GetMapping("fruits/price/{fruit}")
    fun getFruitPrice(@PathVariable fruit: String): String {
        return "${fruitProperties.prices.get(fruit)}円です" // 3
    }
}
```

1. 作成したPropertiesクラスをコンストラクタインジェクションして使えるようにします。
2. 設定ファイルのcolors項よりredを呼び出し
3. 設定ファイルのfruits項よりリクエストに応じたpriceを呼び出し

このアプリケーションを実行すると以下のように結果を得ることができます。

```bash
$ curl http://localhost:8080/colors/red
あか

$ curl http://localhost:8080/fruits/price/orange
100円です
```

## まとめ
今回はSping Bootで設定値を取得する初歩的な方法をお伝えしました。
application.yml以外の設定ファイルから取得する方法や、プロファイル(環境変数)により取得する設定ファイルを変更する方法はまた別の機会にご紹介できればと思います。
DBeaver で Db2 に接続

[DBeaver](https://dbeaver.io/download/) 5.1.3 Community Edition で [IBM Db2 Developer-C for Non-Production](https://www-01.ibm.com/marketing/iwm/iwm/web/download.do?source=mrs-db2devcdbsrv&pageType=urx&S_PKG=ov59318) に接続してみました。

# driver がインストールされていない状態で接続テスト

JDBC 4.0 driver がインストールされてない状態で Test Connection を押下すると、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/63ee591d-ea1a-0927-333f-29a36fb79c8a.png)

driver設定ウインドウが表示されます。Open Download Page を押下すると、IBMのダウンロードページが開かれます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/e0607e41-0b96-32fb-b478-b351bac74491.png)

[DB2 JDBC Driver Versions and Downloads](https://www-01.ibm.com/support/docview.wss?uid=swg21385217)

# JDBC driver をダウンロード、インストール

IBM Data Server Driver for JDBC and SQLJ (JCC Driver)
Version 11.1(db2_db2driver_for_jdbc_sqlj_v11.1.zip)をダウンロード、zipファイルを適当なディレクトリに展開しておきます。

DBeaver の Driver settings ウインドウの Add JARs を押下、

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/b92503e1-673e-b683-2533-94e2c300b95c.png)

db2jcc4.jar を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/122952/f8e54ba4-3f81-05d0-17f3-d8e693a138c3.png)

再度 Test connection で接続テストを行い、以下の表示となれば正常に JDBC Driver がインストールされていることが確認できます。
java.lang.SecurityException: Permission Denial:starting Intentの解決方法【ReactNative, Android】

React Native開発時、`react-native run-android`を実行すると`java.lang.SecurityException: Permission Denial:starting Intent...`のようなエラーが発生することがあります。

その際は、`AndroidManifest.xml`の`activity`内に`android:exported="true"`を追記すると解決します。

```AndroidManifest.xml
<activity
    android:name="com.example.lib.MainActivity"
    android:label="LibMain" 
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" >
        </action>
    </intent-filter>
</activity>
```

`android:exported="true"`は他のアプリに対してこのAndroidコンポーネントを公開するかどうかを決定するプロパティです。
concrete5 のブロックで ajax を実装してみた

concrete5(ホームページ作成・運用ソフト、CMS)のカスタマイズ方法です。今回はブロック(concrete5でのコンテンツの単位)で ajax 処理を行ってみました。

今回は、[QUICKNEM](https://quicknem.com/news) で使っている、NEM(XEM)と日本円の為替レートをajaxで表示するブロックを例に取り上げます。

![nem価格を表示する](https://qiita-image-store.s3.amazonaws.com/0/31643/a970cc2b-2e38-3bba-a9c0-284b5abad7ad.png)

※今回は、ブロックを作るorカスタマイズしたことがある人向けの記事です。

## ブロックの controller.php で ajax 用のエンドポイントを作る

以下のようにします。

```php
// action_XXXで、リクエストを受けるURLを設定する。
public function action_getprice(){
    $data = $this->getPrice();
    // jsonデータを返す
    $this->app->make('helper/ajax')->sendResult($data);
}

// データベースからデータを取ってくる処理
// データは連想配列で返す
protected function getPrice() {
    $db = Database::getActiveConnection();
    $price = $db->fetchAssoc("SELECT vwap, inserted FROM ounziwCryptoPrice ORDER BY inserted DESC", array());
    return $price;
}
```

## ブロックの view.js で ajax を実行する

concrete5では jQuery が同梱されているので、jQueryでデータ取得します。(vue.js等を使う場合は、js読み込みの設定が必要になります。)

```javascript
$(document).ready(function(){
    jQuery.ajax({
        url: $('span.xemratio').data('url'),
        dataType: 'json',
        type: 'post',
        success: function(response) {
            $('span.xemratio').text(response.vwap);
            $('span.xemdate').text(response.inserted);
        }
    });
    return false;
});
```

ちなみに view.phpは下記のようにしています。

```php
<?php defined('C5_EXECUTE') or die("Access Denied.");?>
<p>
    1XEM = <span data-url="<?php echo $view->action('getprice')?>" class="xemratio"></span> 円(レート取得日時: <span class="xemdate"></span>)
</p>
```

こうすることで、ajaxでデータを取得することができました。
Pythonでプログラミングを始めよう! 〜環境構築編(Windows)〜

#前提
・特にありません！


#そもそもAnacondaって？
pythonと数値計算系等を中心とした、頻繁に利用されるをモジュールやツールを一度にインストールできる優れものです。
一つのパソコン上で、複数のPythonの仮想実行環境を構築し、自由にバージョン切り替えをすることもできます。


#Anacondaのインストール
[こちらの公式ページ](https://www.anaconda.com/download/) からインストーラーをダウンロードします。
ダウンロードが完了したら、インストーラーを実行しましょう。

![001.png](https://qiita-image-store.s3.amazonaws.com/0/259835/e948c8ae-8a53-2305-3fba-238e08b14d92.png)
インストーラーが開いたら **「Next」** ボタンを押します。

![002.png](https://qiita-image-store.s3.amazonaws.com/0/259835/bb5f3554-25d5-7b01-10fe-13a7dd372467.png)
ライセンスの同意を聞かれるので **「I Agree」** ボタンを押します。

![003.png](https://qiita-image-store.s3.amazonaws.com/0/259835/512b79b5-b602-b0ef-8385-51a663b8b7d4.png)
インストールの範囲を聞かれますが今回は自分のアカウントのみの **「Just Me」** を選択して、 **「Next」** ボタンを押します。

![004.png](https://qiita-image-store.s3.amazonaws.com/0/259835/b64c39a3-fcf7-c434-2b20-24b554139926.png)
インストール先のディレクトリパスを変更したい場合は **「Browser」** ボタンを押して選択します。
特にこだわりが無い場合は初期値のままで **「Next」** ボタンを押します。

![005.png](https://qiita-image-store.s3.amazonaws.com/0/259835/1208ecea-2e9a-5581-c9c2-e90541c50a2e.png)
「Register Anaconda as my default Python 3.6」にチェックが入っていることを確認して **「Install」** ボタンを押すと、インストールが開始されます。（わりと時間がかかるので気長に待ちましょう。）

![005.png](https://qiita-image-store.s3.amazonaws.com/0/259835/8d15a346-a4b2-36dc-5e9e-71166a7bc272.png)
インストールが完了したら **「Next」** ボタンを押します。

![006.png](https://qiita-image-store.s3.amazonaws.com/0/259835/5ea65115-9034-2d87-ee08-c499cef24fa2.png)
Anacondaではエディタに [Visual Studio Code](https://code.visualstudio.com/) を推奨しています。
必要であればここでインストールできますが、今回は **「Skip」** ボタンを押して先に進みます。

![007.png](https://qiita-image-store.s3.amazonaws.com/0/259835/0e1e93b4-d952-1fdd-28c2-8d55463231b2.png)
以上でAnacondaのインストールは完了です！
**「Finish」** ボタンを押して終了しましょう。


#Python3の動作確認
Anacondaをインストールしたので次にPythonの動作確認をしてみましょう。
![008.png](https://qiita-image-store.s3.amazonaws.com/0/259835/adc5c809-9572-adff-4b7b-931f2fb3ff6c.png)
**「スタートメニュー」** > **「Anaconda (64-bit)」** > **「Anaconda Prompt」** を選択します。

コンソールが開いたら

```
python -V
```
と入力して **「Enter」** キーを押します。

```
Python 3.6.5 :: Anaconda, Inc.
```
と表示されればPythonは正常に動作しています。


#バージョンを切り替えてみよう。

```
conda create -n py36 python=3.6
```
途中で新たなパッケージがインストールされることを確認されたら **「y」** を入力して進みます。
処理が完了したら、次のコマンドを実行してください。

```
conda info -e
```
すると現在作成されている仮想環境の一覧が表示されます。
一覧の中に先ほど作成した **py36** があると思います。
この仮想環境を有効化する為、以下のコマンドを実行してください。

```
conda activate py36
```
もう一度、仮想環境の一覧を表示すると**py36**に切り替わっていることが確認できます。


以上でWindows版の環境構築は完了です！
nginxで現在の時間をレスポンスするlocationディレクティブ

## これはなに
SPAやネイティブアプリなど、クライアントがサーバから独立している場合、時間情報はクライアントの情報を使うことになりがちです。
しかし、要件によってはサーバが指定する時間（あるいは運営者がコントロールしている時間情報）を指定したい場合があります。
その場合、Nginxでレスポンスすることでアプリケーションの負荷を下げることができます。

## locationディレクティブ
```nginx
location = /now.json {
    if ($msec ~ "(\d+)\.(\d+)") {
        set $unix_ts $1;
    }

    default_type  application/json;
    add_header Cache-Control "private, no-store";
    add_header Date $date_gmt;
    return 200 '{"unix": $unix_ts, "unix_msec": $msec, "iso8601": "$time_iso8601"}';
}
```

## レスポンス
```console
$ curl localhost/now.json -v
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 80 (#0)
> GET /now.json HTTP/1.1
> Host: localhost
> User-Agent: curl/7.47.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Server: nginx/1.10.3 (Ubuntu)
< Date: Mon, 23 Jul 2018 02:50:13 GMT
< Content-Type: application/json
< Content-Length: 89
< Connection: keep-alive
< Cache-Control: private, no-store
< Date: Monday, 23-Jul-2018 02:50:13 GMT
<
* Connection #0 to host localhost left intact
{"unix": 1532314213, "unix_msec": 1532314213.183, "iso8601": "2018-07-23T02:50:13+00:00"}%
```

## 解説

- JSONの時間データ
    - unixには秒単位のUnix Timestamp
    - unix_msecにはミリ秒単位のUnix Timestamp
    - iso8601にはISO 8601もしくはRFC 3339で定められた時間形式
- DateヘッダにはRFC 850の時間が入る
- Cache-controlでキャッシュの無効化
    - 要件とリクエスト数とCDNの有無よっては1秒程度のキャッシュは有効かも？
Retrofit2のerrorBodyから値を利用する時の注意

#概要
APIでErrorで返された時に、errorBodyの中の情報を用いて挙動を変える必要があった時の備忘録

##環境
Kotlin
Retrofit2
Rxjava2
okhttp3
Gson
CompositeDisposable
を利用

##注意点
###・ResponseのオブジェクトをResponseで囲む

```ApiService.kt
    @Get("/hoge")
    fun getHoge(): Single<HogeResponse>
```

```HogeActivity.kt
ompositeDisposable.add(hogeViewModel.getHogeData()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({ //it:HogeResponse
                    
                }, {//it:Throwable!
                    
                }))
```
okHttp3のIntercepterを利用したりすればどうにかできるかもしれないけど、これだとerrorBodyが得られなかったので以下のようにした

```ApiService.kt
    @Get("/hoge")
    fun getHoge(): Single<Response<HogeResponse>>
```

```HogeActivity.kt
ompositeDisposable.add(hogeViewModel.getHogeData()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({ //it:Response<HogeResponse>
                   if (it.isSuccessful) {
                   } else {
                       val errorResponse = Gson().fromJson<ErrorResponse>(it.errorBoey()?.toString(), ErrorResponse::class.java) 
                   }
                }, {//it:Throwable!
                    
                }))
```
errorBodyは取得できたが、jsonをパースするのに失敗
###・errorBody?.toString　→ errorBody?.string()

jsonのStringを得るにはtoStringじゃなくてstring()だったというだけの話
errorBody?.toString() =>"okhttp3.ResponseBody$1@f0875b5"
errorBody?.string() => {"error":{"message":"Not Found", "error":{"status":404}}}

```HogeActivity.kt
ompositeDisposable.add(hogeViewModel.getHogeData()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe({ //it:Response<HogeResponse>
                   if (it.isSuccessful) {
                       
                   } else {
                     val errorResponse = Gson().fromJson<ErrorResponse>(it.errorBody()?.string(), ErrorResponse::class.java) 
                   }
                }, {//it:Throwable!
                    
                }))
```

```ErrorResponse.kt
data class ErrorResponse(
    @SerializedName("message")
    var message: String,

    @SerializedName("error")
    var error: Error
)
```

API関連はライブラリに頼りっぱなしになっていたので、いま一度詳細を確認しておきたいと思ってから時間ばかりがすぎる今日この頃...orz
WordPressメモ

WordPressいろいろメモ

##パーマリンクからcategory表示を削除する方法

https://digipress.digi-state.com/wordpress/tips/4-tips-to-remove-category-base-from-parmalink-on-wordpress/

https://moooii.com/web/wordpress/674

##category.phpが表示されない時に確認したい事

http://dear.babymilk.jp/yuablog/making/wordpress-term404

##tag.phpが表示されない時に確認したい事

http://pedal-blog.2-d.jp/tag-php/

##「表示する」と「取得する」は同じではない事に気をつける

https://elearn.jp/wpman/function/single_term_title.html

##カスタム投稿のタームをSQLで取得する場合に気をつけたい事
post_typeではタクソノミーまでしか取得できない

```
$wpdb->posts.post_type = 'post'
```

term_taxonomyのterm_taxonomy_idを使って取得する

```
$wpdb->term_taxonomy.term_taxonomy_id = $get_post_taxonomy
```
スウェーデンの労働許可 / Work Permit


# 申請はどのように？
オファーをもらった雇用主が契約しているエージェント経由で行いました。
申込書にもろもろ記入し、各種証明書（パスポート、マイナンバー、結婚証明書など）をメールで送付しただけです。
Skypeで面談するなども特にありませんでした。

# 許可されるまでの期間
申し込み後、__約3週間__ほどで許可が無事おりました。
ただ、昨今EUの難民問題やらでエージェントを通さないと、
半年から一年ほどかかるとのこと。

# 許可の内容
期間: 24ヶ月
条件: 申請時と同じ雇用主と職種

# 大使館で生体認証の提出
発行された受付ナンバーとパスポートを持って、
スウェーデン大使館に指紋や顔写真を提出しにいきます。
かっこいい機械で、写真や指紋をとってくれるので、
予め写真を用意する必要はありません。
すごく効率的でした！
その後、Residence Cardが発行され自宅まで送付されます。

私の場合は、妻がスウェーデンへVisaなしで入国することが不可だったため、大使館へ行きましたが、
日本人の場合は、大使館から届く書類を持ってスウェーデンへ入国後、移民管理局にて提出することも可能みたいです。

# 家族の滞在許可は？
私の場合は、外国籍の妻と一緒に労働許可の申請を行いました。
妻に関しては、私の労働許可と一緒に、スウェーデンでの滞在と、労働が許可されます。
これに関しては、子供も同様に申請者の労働許可についてきます。

# 転職はOKなの？
最初の24ヶ月は、労働許可発行時と同じ雇用主、同じ職種で働く必要がある。
もし、転職する場合は、新たに労働許可を貰う必要あり。

24ヶ月を超えた場合は、労働許可の延長が許可された場合、別の雇用主で働くことが可能となる。

# 永住権
48ヶ月間、同じ職種で働き続けた場合、永住権を申し込むことが可能。
条件としては、42ヶ月間はスウェーデンに滞在している必要があります。
また、もちろんですが、スウェーデンに永住する意思がある場合に限ります。

# 詳細

[ここ]が参考になりました(https://www.migrationsverket.se/English/Private-individuals/Working-in-Sweden.html)
C# > enumに文字列を割り当てる。 



[文字列をEnumっぽく使う - Qiita](https://qiita.com/sugasaki/items/4dfb911d5928063a69b4)の続き
Enum数字に文字列を割り当てます。

エラーコードに文字列を割り当てたいときに使いました。

## カスタムAttributeの作成

EnumNameAttribute.csをプロジェクト中のお好きな場所に作成
内容は以下

```csharp:EnumNameAttribute.cs

using System;

namespace Hoge
{

    /// <summary>
    /// Enumに文字列を付加するためのAttributeクラス
    /// </summary>
    public class StringValueAttribute : Attribute
    {
        /// <summary>
        /// Holds the stringvalue for a value in an enum.
        /// </summary>
        public string StringValue { get; protected set; }

        /// <summary>
        /// Constructor used to init a StringValue Attribute
        /// </summary>
        /// <param name="value"></param>
        public StringValueAttribute(string value)
        {
            this.StringValue = value;
        }
    }



    public static class CommonAttribute
    {

        /// <summary>
        /// Will get the string value for a given enums value, this will
        /// only work if you assign the StringValue attribute to
        /// the items in your enum.
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static string GetStringValue(this Enum value)
        {
            // Get the type
            Type type = value.GetType();

            // Get fieldinfo for this type
            System.Reflection.FieldInfo fieldInfo = type.GetField(value.ToString());

            //範囲外の値チェック
            if (fieldInfo == null) return null;

            StringValueAttribute[] attribs = fieldInfo.GetCustomAttributes(typeof(StringValueAttribute), false) as StringValueAttribute[];

            // Return the first if there was a match.
            return attribs.Length > 0 ? attribs[0].StringValue : null;

        }
    }
}

```


## enum定義

以下な感じでenumにStringValueアトリビュートを追加します。

```csharp
    public enum RESULT_CODE
    {
        [StringValue("正常終了")]
        OK = 0,　//正常終了－

        [StringValue("エラー1")]
        ERROR1 = 1, //エラー 1
        
        [StringValue("エラー2")]
        ERROR2 = 2, //エラー 2
    }

```


## 使う

```csharp
    int response = 1;
    var result = (RESULT_CODE) response;
    var resultString = result.GetStringValue();
```
【python3】大量のデータ一括取り込みで、データベース上の外部キーと紐付けるにはdictionaryを使うと速い


# こんなケースに

例えば、

下記のようなemployee情報が含まれたCSVをDBに取り込む

```text:employee.csv
従業員氏名,生年月日,会社コード,会社名
tanaka tarou,2000-12-20,aaa,aaa会社
tanaka jirou,1970-08-05,bbb,bbb会社
suzuki tarou,1987-10-15,aaa,aaa会社
suzuki jirou,1975-01-31,ccc,ccc会社
///以下一万行以上
```

DBには
下記のようなサロゲートキーを外部キーとしたリレーションを持つemployees,companiesテーブルが存在する。

## employeesテーブル
従業員情報を格納するテーブル

|列名| 型 | 備考|
|:--|:--|:--|
|id | int | オートインクリメントID|
|name|string|従業員氏名|
|birth_date|date|生年月日
|company_id|int|会社ID 外部キーとしてcopaniesテーブルのidを参照
## companiesテーブル

会社情報のマスター
元々1万件のデータが存在する

|列名| 型 | 備考|
|:--|:--|:--|
id | int |オートインクリメントID|
code|string|会社コード　一意キー制約|
name|string|会社名|


データベースの整合性を保つために、

会社コードで会社IDを引き当てて、

employeesテーブルに保存しないといけない。


# 元々こうやっていた

- 一回一回DBにアクセスして取ってくる
当然一回一回SQL文発行するのでその分大幅に時間がかかります。
サーバーがIDCFクラウドの一番安い構成の貧弱スペックのため、
数万行のデータに一回一回やっていたら2日かかるんじゃないかってぐらい遅かったので
次の方法に。

- キャッシュに取得しておいて、都度全要素を比較

```python
company = [company for company in companies if company['code']=='aaa'][0]
```

DBから取得したデータをリストで持っておき、for文で全要素を回して取得。
companyが一万行ぐらいだと一行一行SQL文発行するのと同じくらい時間がかかった。
最終的にcsvのデータをuniquekeyで昇順に並べ替えて、DBからuniquekeyを昇順で200ずつ取ってきて、比較、200件比較し終えたら次の200件・・・・みたいにしていた。
それでも5分以上かかっている。

なんて無駄なことをしていたんだろう。

# dictionaryを使う

## 一意キーをkeyにしたdictionaryに変換して値を取得する


```python

from operator import itemgetter
import csv
import dataset

def get_last_id(dic):
    # companiesをid降順に並び変えて一番目の要素のidを返す
    last_item = sorted(dic.values(),key=itemgetter('id'),reverse=True)[0]
    return last_item['id']

# DBからcompanyテーブル全データをdict型で取得する
# dataset等を使うとテーブルデータを辞書型で取得できる
db = dataset.Database('connectionurl')
companies_tbl = db['companies']
companies = companies_tbl.all()

# 一意キーであるcodeをkeyとしてdictionaryを作成
companies_dict = dict(map(lambda company:(company['code'],company),companies))

# emploee.csvを読み込む
csv_file = open('emploee.csv','r',encoding='utf8',newline='')
reader = csv.reader(csv_file , delimiter=',',lineterminator="\r\n",skipinitialspace=True)

employees=[]
for field in reader:
    # companyを比較する
    company = companies_dict.setdefault(field[2],{'code':field[2],'name':field[3],'id':(get_last_id(companies_dict)+1)})
    print(company)
    employees.append({'name':field[0],'birth_date':field[1],'company_id':company['id']})

# companiesへ登録
for company in companies_dict.values():
    companies_tbl.upsert(company,['id','code'])

# employeesへ登録
employees_tbl = db['employees']
for employee in employees:
    employees_tbl.insert(employee)

```

これだけ。
3万件弱取り込むのに5分くらいかかっていたのが~~5秒~~20秒くらいで終わった。
※setdefaultの場合は20秒ぐらい、5秒になったのは下記にちょろっと書いたKeyErrorを使用した時
実際に使うときはmax_idのインクリメントを考慮に入れて、
追加する都度dictionary中の最大のIDを取ってくるようにする必要があります。

※安全性を考慮すれば上記のようにdict.setdefault関数を使うべき。
　しかしあえてKeyErrorを発生させて例外処理ステートメントで新しく要素を追加する方法だと自分の環境ではさらに速くなった。また別記事で書く。

※DBプロバイダーがmysqlの場合、デフォルトで大文字小文字を区別しないので、例えば
　`AAA`,`aaa`のような会社コードがあった場合、dicitionaryでは別のキーとして登録されるが、
　mysqlでは同じものとして認識するため、DB登録時に不整合が発生する。
　DB側の定義を変えるか、[大文字小文字を区別しないdictionaryを使う](https://qiita.com/seizans/items/d50b5d08f20777deff03)


#まとめ
比較する側に一意キーがないといけないので
あまり使用する場面はないかもしれないけど、データを大量にとってきて比較したい場合に役に立ちそうだと思ったのでシェアです。

取り込みだけじゃなく、手動でのデータ入力で新規登録する時に整合性を保つためにも使えるかもしれません。

この方法を発見したことで、
今までわかってなかったKVSの考え方をなんとなくつかめた気がします。
go testやgoapp test時に相対パスのズレを解消する方法

# 概要
goapp test や go testでの相対パスと、httpサーバ立ち上げるgoapp serveでの相対パスがズレてテストが失敗する場合はテストの初期化処理で相対パスを再設定すると解決する。

```
# 相対パスを再設定する
apath, _ := filepath.Abs("../../../")
os.Chdir(apath)
```

# 背景

GAE GO 便利ですね。 `google.golang.org/appengine/aetest` 使ってテスト書いていくのですがaetestがとにかく遅い。request作成毎に裏でpythonでhttpサーバ立ち上げているせいで1回2秒くらいかかります。そのため2018年7月現在のベストプラクティスはgoapp testでaetest利用を最低限にして、個別にgo testで単体テストを書いていくことになります。

結果次のようなコードを書くことになります  `goapp test -v ./src/api/handler/` 結果として相対パスが `goapp serve` 3つズレます。これは `os.Chdir(apath)` で解消することができます。aetest早くなるといいですね。


# 参考
aetest遅い話題はこの資料が参考になりました
- [メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法](https://www.slideshare.net/takuyaueda967/gaego)
イベント ID ： 4227 

https://arcserve.zendesk.com/hc/ja/articles/202912975-DEVICE-SUPPORT-UPDATE-%E9%81%A9%E7%94%A8%E6%99%82%E3%81%AB%E8%AD%A6%E5%91%8A%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0-%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%8C%E8%A8%98%E9%8C%B2%E3%81%95%E3%82%8C%E3%82%8B

本警告は、パッチ適用に伴うファイルの置き換えと Arcserve Backup 関連サービスの停止 / 開始のタイミングにより記録されます。警告が記録された場合もパッチ適用は正常に完了し、その後の動作に問題はありませんので警告は無視して下さい。

との事

見慣れない警告が出ていたので
調査した所　警告は無視してとの事
コマンドラインからEmojiを探す

[Gitのコミットメッセージを絵文字から始める
](https://qiita.com/pocotan001/items/775cc77087be5562cc56)
の記事をみてコマンドライン上からemojiを探せないと不便なので作ってみました

##install

```
$ go get github.com/urfave/cli
$ go install github.com/fukumone/eji
```


## 使い方

キーワードから絵文字を探す

```
$ eji :smile:
# output 😄
```

絵文字からキーワードを探す

```
$ eji 😄
# output :smile:
```

絵文字の一覧

```
$ eji index
# あるいは eji i
```

出力される絵文字は以下から参照しています

https://www.webpagefx.com/tools/emoji-cheat-sheet/

ライブラリURL：https://github.com/fukumone/eji
Pandasでデータを読み込む

Qiita初投稿です。
書き方がまだイマイチですが、何か書き方などアドバイスがあれば教えていただければと思います。

* CSVファイルをDataFrameとして表示

```python
import pandas as pd
data = pd.read_csv("sample_dataset.csv", index_col=0)
# data
frame = pd.DataFrame(data)
print(frame)
```
Windows PowerShellで文字化け

お世話になります
今Windowsを使ってkotlincで条件分岐の勉強をしております
コマンドプロンプトで文字化けを直したいのですがご指導ください

"""
>>> val score = 50
>>> if (score >= 60) {
if (score >= 60)... println("合格！")
println("濠?")... } else {
}... println("不合格")
println("附?")... }
}附?
>>>

"""
もちろんchcp 65001でutf-8へ変更済です
よろしくお願いいたします
エンジニアの評価に関する一考察

タイトルは某ヤン提督のあれのパクリです。
卒論で一考察ってつけたら、1じゃなくてちゃんと考察しろって怒られた苦い思い出があります。
今回は、CTOになってからずっと悩んでいるエンジニアの評価について考えて見ます。というか2Qに向けて評価制度を変更したので、その時の頭の中の整理になります。

# エンジニアの評価を考える
エンジニアの部下というものができて何年も経ちますが、どう評価するかが固まっていないままきています（経営陣に対して適切な提案ができない）ので、彼らに何をFBしたら正しいかも未だによくわからないですし、それがゆえにメンバーの成長は本人の努力次第という、組織的な何かがない状態なので早急に改善したい部分です。

弊社が取り入れているマネジメント手法に識学というものがありますが、そこでも、本人がどの立ち位置で物事を見て、フォーカスすべきことが何なのかをきっちり定義してあることが重要とあります。適切なFBのための適切な評価手法というものをいい加減考える必要があるなと思っています。

# 今までの問題点
MBOなどで評価はしてきましたが、セールス系の評価の仕方を参考にアウトプットのみを評価していくことへの不満は多いです。どうしても数値化することが必要なので、最新技術のキャッチアップ　みたいな尺度になると評価がぶれます。

他方、「会社の利益達成」みたいな目標は、数値化できていてo xつけやすく、バックヤードとして幅広く物事を見て会社全体をサポートしてほしいという意味合いで入れることが多いですが、それに対する責任がはまっていないことが多く（打ち手を思いついても権限が足らない、直接的な売上向上アクションができないことが多いなど）、会社の状況に対するアンテナを立てていこう、くらいの受け取られ方をしている気がします。（上司の伝え方の問題もあります）


# 評価軸を考える
- もちろん組織への貢献
	- 組織の貢献 == 「会社の競争力の源泉となる仕組み = プロダクト を通して組織に貢献する」と定義
		- 作ったプロダクトが創出する価値を最大化させる
- 新しいテクノロジーに対するアプローチは評価に必要か？
	- 新しい技術はある程度自分で勉強してもらわないといけない
	- でもそこにもエンジニアの価値があると思っているし評価の対象にするべき

弊社はテックファーストではなくプロダクトファーストということもあり、定量的にジャッジするのはプロダクトの良し悪しだけでいいのではないか。

他方、プロダクトのみ評価していると、新しいサービス作ろうという時に既存の知識で戦うしか無くなるため、やはり新しいテクノロジーに対するアプローチそのものを評価しないと、未来が見えない組織になる（機能Aがほしい時のその機能が作れるかどうかは、運（たまたまそれをかじっていてくれたとか）が絡んでしまう）。そういう意味で未来への投資も評価する必要があるのではないか。
こちらは定量的な評価は経験上難しいが、評価の際にはあらかじめきちんとexpectationsを作っておいて（期待値調整）、それで評価することで、ある程度カバーできないか？


# どうしたいか
- 適切なFBを与えたい
	- 正しく評価することで、本人に適切なFBを行える
		- 良いFBがあると、成長が早い
		- 本人自身のメンタルにも影響（心理的安全性）
- 目標に対する本人の納得感
	- ある程度一緒に決める
- アウトプットだけでなくインプットも評価したい
	- 未来への投資も評価
- 組織の連続的な成長と非連続的な成長の両方に影響を与えたい
- 複雑なことはしたくない
- 胸を張って、エンジニアをマネジメント（評価とFB）ができていると言いたい
	- リクルーティングへの影響
		- いいマネジメントできていればうちのような小さい会社にも入ってくれる人がいるんじゃないか・・？
	- 離職率への影響
		- FBがないと成長が鈍化するという話もある

だいぶ都合のいいこといってますが、今クォーターで上記を元に作ったテンプレートはこんな感じです。
※重要なのは、この過程をある程度一緒に考えること（出来ればメンバーから案を出させるなど）
無論全部100%盛り込めたとは思っていません。


### 定量目標
プロダクト：回収的視点

- アウトプットの評価
- 組織の今の利益のために動く
- 数値で評価
- 連続的な成長に影響

こっちはある程度上司の側でほしいものを定義してそれをブレイクダウンしていきました。


### コンピテンシー目標
テクノロジー：投資的視点

- インプットの評価
- 組織の将来のために動く
- 非連続的な成長に影響
- やったやってないで評価


叩きをメンバーに作ってもらい、それを練って、expectationsを作っていくというのが今クォーターで試した1つ流れになります。



# 実際に作ったMBOのイメージ
## 定量目標1
Aシステムに機能1と機能2と機能3の追加

- Expectations.
	- どれも実装できず：評価最低
	- 機能1のみ実装：評価C
	- 機能1と2を実装：評価B
	- 全部実装：評価A

## 定量目標2
課題Aへの回答のためのAIモデルの構築
モデルの精度はデータ集団Aからランダムにピックした100個のデータを使用する

- Expectations.
	- 回答精度50%以下：評価最低
	- 60%以下：評価C
	- 70%以下：評価B
	- 80%以下：評価A


## コンピテンシー目標
言語N の習得

- Expectations.
	- FIZZBUZZ実装レベル
	- APIの実装レベル
	- 本番プロダクトでの実装
	- 本家にプルリク


こんな感じです。
一人一人作っていくのでめちゃくちゃ大変でしたが、とりあえず労力はすごかったので、やった感はすごいです・・。評価自体はシンプルなので、クォーターの最後の評価の際もめたりめんどくさいことは起こりにくいのではないかなと思っています。


## まとめ
2018年の第2クォーターに弊社で作ったエンジニア評価の考え方をまとめてみました。

プロダクトに対する評価のみに絞ってしまうと、弊社のようにプロダクト単体で食べているわけじゃないエンジニアチームにはつらい（それこそクォーターの途中で既存プロダクトを捨てるようなジャッジもままありますので）ので、どうにか未来への投資も評価に入れたいというところから端を発しています。

無論改良の余地というか考え方をどんどん変えていく必要はあるとは思っています。チームの規模やその時々の会社の状況に合わせて柔軟に動ける評価作りは今後も続けていきたいと思います。