OmniAICreator/Qiita-1.07M huggingface dataset:
Windows10 で screen resolution を強制変更

#はじめに
Windows10 (Windows10 IoT Enterprise)だと、マルチディスプレイで画面を複製モード( = ミラーモード / Clone Mode)にすると、全部が低い解像度のディスプレイと同じ解像度になってしまいとっても迷惑。

なので、強制的に解像度を再設定するコマンドを書いた。デフォルトは1920×1080。


- projectはGitHub
https://github.com/fknaopen/ForceSetScrResolution


- 抜粋

```
/*
    ForceSetScrResolution
    Usage: command [resolution-id]
	Note: dafault-resolution=1920x1080
*/

#include <windows.h>

long SetResolution(int width, int height, int monitor)
{
	// get device
	DISPLAY_DEVICE disp = { 0 };
	disp.cb = sizeof(disp);
	EnumDisplayDevices(NULL, monitor, &disp, NULL);

	// set resolution
	DEVMODE mode = { 0 };
	mode.dmSize = sizeof(mode);
	mode.dmPelsWidth = width;
	mode.dmPelsHeight = height;
	mode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;

	return(ChangeDisplaySettingsEx(disp.DeviceName, &mode, NULL, 0, NULL));
}

int main(int argc, char *argv[], char *envp[])
{
	int w = 1920; int h = 1080;

	if (argc == 2) {
		switch (atoi(argv[1]) /* resolution-id */)
		{
		case 768:
			w = 1024; h = 768;
			break;
		case 720:
			w = 1280; h = 720;
			break;
		default:
			break;
		}
	}
	return(SetResolution(w, h, 0));
}
```
C:リングバッファを逆向きに読み出す

リングバッファを逆向きに読みたい時のcode

主にログファイル用リングバッファを新しい順に読むときに使うかな・・・

(「index = (rbuf.head + MAX_BUF - i) % MAX_BUF;」が書きたいことの全てですが。)

```
/*
 * read reverse ring-buffer
 */
#include <stdio.h>
#include <string.h>

#define MAX_BUF (16)

struct ring_t {
    int  head;          // now data
    int  tail;          // next target data
    char data[MAX_BUF];
};

void p_data(char *data){
    int i;
    for (i=0; i<MAX_BUF; i++){
        printf("%c ", data[i]);
    }
    printf("\n");
}

main(){
    struct ring_t rbuf;
    char data[MAX_BUF];

    int i, index;

    // set ring-buffer
    memset(&rbuf, 0, sizeof(rbuf));
    memset(rbuf.data, '-', sizeof(rbuf.data));
    for (i=0; i<20; i++){
        rbuf.data[rbuf.tail]='A'+i;  // set test data
        rbuf.head=rbuf.tail;
        rbuf.tail=(i+1) % MAX_BUF;
    }
    printf("rbuf.head=%d\n   ", rbuf.head);
    p_data(rbuf.data);               // test

    // data copy (read ring-buffer)
    memset(data, 0, sizeof(data));
    for (i=0; i<MAX_BUF; i++){
        index = (rbuf.head + i) % MAX_BUF;
        data[i] = rbuf.data[index];
    }
    printf("f: ");
    p_data(data);                    // test

    // data copy (read reverse ring-buffer)
    memset(data, 0, sizeof(data));
    for (i=0; i<MAX_BUF; i++){
        index = (rbuf.head + MAX_BUF - i) % MAX_BUF;
        data[i] = rbuf.data[index];
    }
    printf("r: ");
    p_data(data);                    // test
}
```
実行結果

```
$ a.out
rbuf.head=3
   Q R S T E F G H I J K L M N O P
f: T E F G H I J K L M N O P Q R S
r: T S R Q P O N M L K J I H G F E
```
Linux:gitリポジトリを一時的にweb公開するscript

gitは "git instaweb" でカレントのリポジトリをweb公開できて、webブラウザからlogやdiffがとれる。
特に複数のbranchを持っている状態のときにあちこちのbranchに移動しつつ参照できて便利だなと思う。
便利だけど、数十人のproject等でサーバマシンを共有している場合にportがかぶるとやだなって思ったので、開いているportを自動で割り当ててinstawebするshell-scriptを書いた。

"webgit.sh start"   で開始して
"webgit.sh stop"  で停止する

- 表示イメージ
![18333fig0401-tn1 (1).png](https://qiita-image-store.s3.amazonaws.com/0/6824/6948248e-4776-cd27-8ded-7cf01dcaed45.png)


```
#!/bin/sh
#===============================================================================
# [webgit.sh]
# git-repoを一時的にwebに公開するscript
#
# git-repoの存在するサーバマシン上で実行できます
# ※ git-repoのweb参照が不要になったら必ず終了させてください
#
# 起動: git管理下にあるディレクトリ上で webgit.sh start
#                                       --> 表示されたURLにて参照できます
#
# 終了: git管理下にあるディレクトリ上で webgit.sh stop
#
#===============================================================================
# 2012.05.15 nfukuoka 新規作成

servername=`hostname`

f_getport()
{
    perl - <<'EOT'
    use IO;
    my $port_no = do {
        my $l = IO::Socket::INET->new(
            Listen => 5,
            LocalHost => '127.0.0.1',
            LocalPort => 0,
            Proto => 'tcp',
            ReuseAddr => 1,
        ) or die $!;
        print $l->sockport;
    };
EOT
}

cmd=$1
if [ "x$cmd" = "x" ];then
    echo "Usage: `basename $0` start|stop" >&2
    exit 1
fi


ret=9
if [ "x$cmd" = "xstart" ];then

    l_port=`f_getport`

    # (まずは apache2 instaweb 終了)
    git instaweb  --stop
    sleep 1

    # apache2 instaweb 開始
    git instaweb  --httpd=apache2 --port=$l_port --browser='none'

    # print access URL
    echo "\n"
    echo "-----"
    printf "Access URL -->   http://%s:%s/\n" "$servername" "$l_port"
    echo "-----"
    ret=0

elif [ "x$cmd" = "xstop" ];then

    # apache2 instaweb 終了
    git instaweb  --stop
    ret=0
fi

exit $ret
```
Webpackのresolve.aliasとVSCodeのjsconfig.jsonを使ってimportを快適にする

# はじめに

jsでimportをしていてこういうのをコードを書いたこと無いでしょうか？

```js
import { someConstant } from './../../config/constants'
import MyComponent from './../../../components/MyComponent'
import { myActionCreator } from './../../../ducks/someReducer'
```

いちいちターゲットのファイルとインポート先のファイルの相対パスを確認する必要があってめちゃくちゃ面倒ですよね。そこで今回はwebpackのresolve.aliasとjsconfig.jsonを使って↑のコードを

```js
import { someConstant } from '@config/constants'
import MyComponent from '@components/MyComponent'
import { myActionCreator } from '@ducks/someReducer'
```

のように書くことが出来、なおかつVSCodeの自動補完も有効にする方法をご紹介します。

# webpackのresolve.aliasを設定する

まず今回の説明のために以下のようなディレクトリ構造のプロジェクトを作成しました。

```
.
├── dist
│   ├── index.html
│   └── main.js
├── src
│   ├── foo
│   │   └── bar
│   │       └── hoge.js
│   └── index.js
└── webpack.config.js
```

ここでindex.jsからhoge.jsをimportしたいとして特に何も設定しなければ

```js:index.js
import hoge from './src/foo/bar/hoge'
```

このように書く必要があります。ファイルが1つならいいですがファイルが複数になったりいろんなディレクトリからimportしようとするとどんどん面倒になっていきます。

そこでhogeをもっと簡単にimport出来るようにwebpack.config.jsに[resolve.alias](https://webpack.js.org/configuration/resolve/#resolve-alias)を設定します。

```js:webpack.config.js
const path = require('path');

module.exports = {
  ...
  resolve: {
    alias: {
      '@bar': path.resolve(__dirname, 'src/foo/bar')
    }
  }
};
```

書き方として

```js
resolve: {
  alias: {
    'aliasの名前': 'ターゲットのディレクトリまでの絶対パス'
  }
}
```
のように書くことでaliasを設定できます。
ここではnodeの[path.resolve](https://nodejs.org/docs/latest/api/path.html#path_path_resolve_paths)と[__dirname](https://nodejs.org/docs/latest/api/globals.html#globals_dirname)使って取得しています。


これで先程のhogeは以下のように読み込む事ができます。

```js
import hoge from '@bar/hoge'
```

# VSCodeの自動補完に対応する

aliasを設定するだけでもそれなりに便利ではあるのですが、例えばhoge.jsで以下のような定数をexportした場合

```js:hoge.js
export const AWSOME = 'AWSOME!'
```

index.jsからAWSOMEを読み込もうとしても自動補完が出てきません。
![index_js_—_webpack_vs_code_resolve_path_sample.png](https://qiita-image-store.s3.amazonaws.com/0/71154/232a3060-588d-6922-f7e9-5b76682bb88f.png)

そこで[VSCodeのjsconfig.json](https://code.visualstudio.com/docs/languages/jsconfig)を設定します。

まず、jsconfig.jsというファイルをプロジェクトルートのディレクトリに作成し

```
├── dist
│   ├── index.html
│   └── main.js
├── src
│   ├── foo
│   │   └── bar
│   │       └── hoge.js
│   └── index.js
├── jsconfig.json // 作成
└── webpack.config.js
```

以下のようにpathsに@barを追加します

```json:jsconfig.json
{
  "compilerOptions": {
    "target": "es2017",
    "allowSyntheticDefaultImports": false,
    "baseUrl": "./",
    "paths": {
      "@bar/*": ["src/foo/bar/*"]
    }
  },
  "exclude": ["node_modules", "dist"]
}
```

pathsには

```json
"paths": {
  "コードで指定されるパス" : ["baseURLを基準にしたマッピング先のディレクトリへの相対パス"]
}
```

を書くことでVSCodeはマッピング先を見てくれるようになります。

今回の場合は「@bar と書いたら src/foo/bar」を見てねという意味ですね。

これでもう一度hoge.jsからAWSOMEをインポートしようとすると自動補完が入るようになります!

![index_js_—_webpack_vs_code_resolve_path_sample.png](https://qiita-image-store.s3.amazonaws.com/0/71154/44e56eea-3546-1175-6b49-263f8677d511.png)

これを使うとimport先のファイルや変数を探す時間が大幅に短縮できます。
お試しあれ！

[参考](https://medium.com/@justintulk/solve-module-import-aliasing-for-webpack-jest-and-vscode-74007ce4adc9)
サーバーサイドエンジニアになってわからなかったこと(3週間目)

# お勉強の経緯
- 最近転職しました。
- 転職前はSESでミドルソフトを作ってました。
- Webに関わる仕事はやったことはない。
- PHPとPythonとJavaScript、C・C++がﾁｮｯﾄﾜｶﾙ。


# 勉強したこと
- AWS
- shellスクリプト

## AWSのこととか
わけわかんない言葉が飛び交ってたんですが、まとめて勉強してみました。

- EC2
- S3
- ElastiCache
- RDS
- Cloud Front

### EC2

感覚はLinuxのサーバ。好きな環境をLinuxで作れる場所。
EC2とかいう名前でショッピングサイトとか思っちゃいけない ~~(ECに引っ張られた)~~

このEC2のサーバをいっぱい立てて、大規模なトラフィックを捌くみたいですが、そこで使うのがロードバランサとかいうやつ。AWSのロードバランサはいくつか種類があるらしい。(L3とL7で分けるらしいですが、詳しくはしらなーい)

ロードバランサはサーバになんかいい感じに分散しているやつです。なんかうまく処理してくれるらしい。AWSはEC2の中の機能？みたいになってる。

### S3

感覚はOneDriveとかDropBox。基本はWebのストレージ。静的コンテンツ(HTML・CSS・画像・動画)とかなら配信してくれる。
あとなんかすごいいっぱいバックアップしてくれるらしいので、安全なんだって

### ElastiCache

謎物体その1
超ざっくりいうとメモリにあるDB。高速アクセスできるDB。
RDSはストレージにアクセスしてデータを取得しますが、ElastiCacheはメモリにデータを保持しているので、高速にデータを取得できるんだって。
変わらないデータ(マスタデータ)とかの取得の高速化が見込めるらしい。
RedisとMemcachedというのがあるらしい

### RDS

データベース。なんかMySQLと互換性のあるAuroraとかいうのが使えるらしい。早いらしい。

### Cloud Front 

謎物体その2
思想はElastiCacheと同じ。S3とかにある静的コンテンツをキャッシュしておけば、静的コンテンツも高速取得できるってやつ。

## shellスクリプト

シェルスクリプトというかあの黒い画面と仲良くなろうの会が発足しました。

AWSくんはGUIだけじゃ出してくれない情報があるみたいなのでCLIで取得しないとです。
あとsshとかrsyncとか、docker関連でもコマンドを叩かないといけないので必死に練習。Aliasを使ってちょっとだけ効率化を目指しましょう。
叩かないといけないコマンドが増えるので私は↓のAliasを登録してたりします。

```bash:.zshrc
Alias setting="vi ~/.zshrc"
Alias reload="source ~/.zshrc"
```

# まとめ
まだ勉強することはいっぱいありそうなので少しずつ書いていこうかなと。
ログ系のこととか、サーバ動作の監視とか
BeagleBoardとmacbookをUSBシリアルで接続する

USBシリアル変換ケーブルは秋月のを使う

http://akizukidenshi.com/catalog/g/gM-00720/

そのままMacにつないでも認識しないので、以下のサイトからドライバをdownload してインストール

(要リブート)

http://www.prolific.com.tw/eng/downloads.asp?ID=31

-->  md_PL2303_MacOSX10.6_dmg_v1.4.0.zip

ケーブルをmacに接続して認識していることを(dmesg, /devで)確認する

```
$ sudo dmesg
    :
PL-2303/X V1.3.0 start, Prolific
```

```
$ ls -l /dev/tty.usb*
crw-rw-rw-  1 root     wheel   18,  14  5  6 20:53 /dev/tty.usbserial
```

ケーブルでbeagleboardとmacを接続してシリアルコンソールを起動

( screenを使う, 終了するにはctrl-A-\ )

```
$ screen  /dev/tty.usbserial  115200
```
SORACOM Buttonから渡されるイベントを確認してみた

どうも若松です。

SORACOM LTE-M Button がリリースされたので、買ってみました。
https://soracom.jp/products/gadgets/aws_button/

どこでもLambda叩けるのは便利ですよねー
いろいろ可能性を感じます。

# セットアップ
AWS IoT 自体が触るの初めてだったので、いろいろと仕様を確認しながら触ってみました。
セットアップはこの辺りを見ながらやりました。(割愛)
https://dev.soracom.io/jp/start/aws_button_slack/

# イベント確認用Lambda
とりあえず、Lambdaに渡されるイベントの内容を確認しないとコードが書けないので、確認用のLambdaを用意しました。
CloudwatchLogsに吐かれたイベントのJSONを確認するだけなので、超シンプルです。
言語はPython3.6です(一応)

```python:get-event
import json

def lambda_handler(event, context):
    
    print(event)
    
    return
```
# 確認結果
以下のJSONがイベントとしてLambdaに渡されます。

```json:event
{
  "deviceInfo": {
    "deviceId": "XXXXXXXXXXXXXXXX",
    "type": "button",
    "remainingLife": 99.49749,
    "attributes": {
      "projectRegion": "ap-northeast-1",
      "projectName": "soracom",
      "placementName": "soracom-button",
      "deviceTemplateName": "get-event"
    }
  },
  "deviceEvent": {
    "buttonClicked": {
      "clickType": "SINGLE",
      "reportedTime": "yyyy-mm-ddThh:mm:ss.xxxZ"
    }
  },
  "placementInfo": {
    "projectName": "soracom",
    "placementName": "soracom-button",
    "attributes": {},
    "devices": {
      "get-event": "XXXXXXXXXXXXXXXX"
    }
  }
}
```
`clickType`の値はボタンの押し方で以下のように変わります。

|押し方|値|
|---|---|
|シングルクリック|SINGLE|
|ダブルクリック|DOUBLE|
|長押し|LONG|
押し方で機能変えたいときは、この値で判別すればよいようです。

# 気になること
~~以下のドキュメントを見ると、実際にイベントとしてLambdaに渡されたJSONと異なる形式のJSONの記載がありました。~~
<font color="red">しれっと修正されてました。(11/8追記)</font>
https://dev.soracom.io/jp/aws_button/how-it-works/

SORACOMコンソールで確認できるJSONと同じ形式のようなので、AWS IoTに送られる生のJSONがこの形式なのかもしれません。

# まとめ
簡単にセットアップできてサクサク試せるので、とても楽しいです。
ボタン自体の機能はシンプルですが、Lambdaにつながるのでアイディア次第ではいろいろできそうですね。
ruby select mapの違い



```ruby:select

numbers = [1, 2, 3, 4, 5, 6, 7, 8]
p numbers.select {|item| item % 2 == 0 }

出力

[2, 4, 6, 8]
```

```ruby:select_hash

バリュー軸

scores = { 'Alice' => 50, 'Bob' => 60, 'Carol' => 90, 'David' => 40 }
p scores.select {|k, v| v >= 60 }

出力

[["Bob", 60], ["Carol", 90]]   (Ruby 1.8の場合）

キー軸

p scores.select {|k, v| k == 'Alice' }

出力
{"Alice"=>50}

```

```ruby:map
numbers = ["68", "65", "6C", "6C", "6F"]
p numbers.map {|item| item.to_i(16) }

出力
[104, 101, 108, 108, 111]


```

## selectとmapの掛け算

```ruby:select&map

scores = { 'Alice' => 50, 'Bob' => 60, 'Carol' => 90, 'David' => 40 , 'joy' => 80}
p scores.select {|k, v| v >= 60 }.map{|m| m[1]}


出力

[60, 90, 80]

```
Linux: od でちょっと見慣れた感じに表示

od、デフォルト表示だとちょっと見辛いので、hex とasciiをどこかで見た風に表示するよう指定する

```
od -v -t x1z -Ax
```
- 表示例

```
$ od -v -t x1z -Ax b.out
000000 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00  >.ELF............<
000010 02 00 03 00 01 00 00 00 60 83 04 08 34 00 00 00  >........`...4...<
000020
```
暇なので周波数解析ウェブアプリを作った

p5.js の　Examples ほとんどそのままです。。。
簡単すぎてビックリ

![スクリーンショット 2018-11-04 19.49.11.png](https://qiita-image-store.s3.amazonaws.com/0/22001/8d63c4ca-2b82-691b-4cc9-75b54e09c491.png)


https://editor.p5js.org/wittyfool/sketches/r16iRli37
倍音成分を利用して色づけをしています

（マイクへのアクセスを許可する必要があります）

追記 
初出時に「声紋分析」と書きましたが単なる周波数解析でした
声紋分析に使えるとは思いますが　そこは人力になります・・・
android: Activityをpopup表示するときのスタイル設定

初稿2010/11
#はじめに
Activityをpopup表示するとき、AndroidManifest.xmlに<activity  android:theme="@style/Theme.Dialog">とやると、大体欲しいスタイルになるんですがやはり微調整する。

androidソースツリーのDialogテーマの定義を調べてめぼしい設定を見つけた→ http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob;f=core/res/res/values/themes.xml

下記のような設定を res/values/themes.xmlに書いておき、AndroidManifest.xmlのactivity設定で使う。

- 設定その１＊白枠なしのDialogテーマ

```
<style name="Theme.NolineDialog" parent = "@android:style/Theme.Dialog">

<item name="android:windowNoTitle">true</item>

<item name="android:windowBackground">@android:color/transparent</item>

</style>
```
- 設定その２＊背景のディマーありのPanelテーマ

```
<style name="Theme.DimPanel" parent = "@android:style/Theme.Panel">

<item name="android:windowBackground">@android:color/transparent</item>

<item name="android:backgroundDimEnabled">true</item>

<item name="android:backgroundDimAmount">0.5</item>

</style>
```

AndroidManifest.xml

```
<activity android:name=".popup_test"

android:label="@string/app_name"

android:theme="@style/Theme.NolineDialog">
```

#参考
http://www.techdoctranslator.com/android/guide/ui/themes
Apache Beamを始めるときに読む資料



これからApache Beamを始めようと思った時に、何を読めばいいか。

まずはコンセプトを理解する。（streaming, bounded/unbounded data, windowing, Triggersなど） これらはQiitaに翻訳を載せている方もいた。

* [The world beyond batch: Streaming 101
](https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-101)
* [The world beyond batch: Streaming 102
](https://www.oreilly.com/ideas/the-world-beyond-batch-streaming-102)


そうすると、Apache Beamのドキュメントを読んでも理解できる。

* [Apache Beam Documentation](https://beam.apache.org/documentation/)

具体例を知りたいなら、これ。

* [Apache Beam WordCount Examples](https://beam.apache.org/get-started/wordcount-example/)

---
適当に追加する。
JavaScriptのキーイベント系とjQueryのキーイベント系のクロスブラウザ対応

# 概要
クロスブラウザ対応について調べていたところ、JavaScriptの面倒なところをjQueryが吸収してるんだなーとしみじみと思ったので本記事を書きました
キーコードの取得方法周辺のお話を書いています
※ あまりJavaScriptに詳しくないので、なにかご指摘あれば教えていただければと思います

# （通常の）JavaScript
## Eventオブジェクトの取得方法
IE8以下ではwindow.eventにイベント情報が含まれているため、以下取得が主流？

```Javascript
 var e = e || window.event;
```

## イベント発生要素
イベントが発生したElementを返す
微妙に全ブラウザ対応のプロパティが無い・・・

| プロパティ | 説明 |
|:--|:--|
|e.target|イベント発生要素を返す（IE8以下非対応）|
|e.srcElement|イベント発生要素を返す（FireFoxは61以下非対応）|

## キーイベントと関連プロパティ

- イベント

| イベント | 説明　| 取得対象キー |
|:--|:--|:--|
| onkeypress| pressing = キーボードの押下中 | 画面上表示可能なキー
| onkeydown | presses = キーを押下した時| 機能キー（F5, enter等）
| onkeyup | releases = キーを離した時 | 機能キー（F5, enter等）


- 関連プロパティ

| プロパティ | 説明 | onkeypress | URL |
|:--|:--|:--|:--|
| e.key | 入力値そのものを取得（IE8以下非対応） | 対応 | [KeyboardEvent key Property](https://www.w3schools.com/jsref/event_key_key.asp) |
| e.code| unicode値を返す（ブラウザ依存 ※ IE非対応、キーボード依存）| 対応 | [KeyboardEvent code Property](https://www.w3schools.com/jsref/event_key_code.asp) |
| e.charCode | unicode値を返す（ブラウザ依存）| onkeypress時のみ | [KeyboardEvent charCode Property](https://www.w3schools.com/jsref/event_key_charcode.asp) |
| e.keyCode | ASCII値（onkeypress時）、unicode値を返す（FireFox非対応） | 対応 | [KeyboardEvent keyCode Property](https://www.w3schools.com/jsref/event_key_keycode.asp) |
| e.which | ASCII値（onkeypress時）、unicode値を返す（IE8以下非対応） | 対応 | [KeyboardEvent which Property](https://www.w3schools.com/jsref/event_key_which.asp) |

# jQuery
上のJavaScript仕様をJQueryのイベントオブジェクトがまとめてくれています笑
マルチブラウザのことしっかり書いていますね

jQuery(https://jquery.com/) より以下抜粋
> It makes things like HTML document traversal and manipulation,
> event handling, animation, and Ajax much simpler with an easy-to-use API that works across a multitude of browsers.

## Eventオブジェクトの取得方法
全く気にしなくて大丈夫です
通常のJavaScriptとObjectが違いますので、そこだけ注意かと思います
[Event Object \| jQuery API Documentation](https://api.jquery.com/category/events/event-object/)

```javascript

$("document").on("keydown", function(e) {
    // e自体がjQueryのEventオブジェクト
});
```


## イベント発生要素
イベントが発生したElementを返す
srcElementの考慮が不要になっています
表にしていますが、JavaScriptと比べるためです
[event.target \| jQuery API Documentation](https://api.jquery.com/event.target/)

| プロパティ | 説明 |
|:--|:--|
|e.target|イベント発生要素を返す（全ブラウザ対応）|


## キーイベントと関連プロパティ
- イベント

このあたりはあまり変わらない
[Keyboard Events \| jQuery APIDocumentation](http://api.jquery.com/category/events/keyboard-events/)

|イベント|説明|
|:--|:--|
|keypress|JavaScriptのonkeypress|
|keydown|JavaScriptのonkeydown|
|keyup|JavaScriptのonkeyup|

- 関連プロパティ

いろいろまとめてくれています
表にしていますが、JavaScriptと比べるためです

|プロパティ|説明|URL|
|:--|:--|:--|
|e.which | JavaScriptのkeyCode、charCodeを標準化したもので、unicode値を返す| [event.which jQuery API Documentation](https://api.jquery.com/event.which/) |

- 使い方

結局jQueryでやるとすごい簡単にできるという

```javascript
$("document").on("keydown", function(e) {
    var keyCode = e.which;
})
```

## 付録：同時押しキー
ShiftやCtrlと他キーの同時押し等の判定は以下のようなプロパティもあるので、チャットのメッセージ入力欄等でも使えそうです（通常のJavaScriptも）

|プロパティ|説明|
|:--|:--|
|e.shiftKey|Shiftキーを押した状態か|
|e.ctrlKey|Ctrlキーを押した状態か|

# 結論
クロスブラウザ対応はjQuery等のライブラリにお任せしましょう
JavaScriptの記事がありすぎて、混乱してました・・・
[js]リズムゲームで連打したとき音を重ねて出したい

#javascriptで音を連続して再生させる
リズムゲームをHTML+jsで作ろうと思ったときに一番解決に時間のかかった部分です。かなり初歩的な問題だったなぁと思いながら、いざ調べると解決に至る記事が見つからなかったんですよね…。

HTMLやjsでの操作をトリガーに、音を「再生終了を待たずに再生させる方法」です。
一回押した後音が鳴り終わるまで再生を止める方法や連打を防止する記事は多かったんですが反対の方法はなかったのでメモ用に書きます。

##javascript
音を呼びだす部分となる関数に、ローカル変数と.play()を書くだけでやってます。メモリの問題などは考慮していないので本当に連打は制御しなければならないかもしれないですが…。



```

function AudioTest(){
  var audio = new Audio("音ファイルのパス");
  audio.play();//音を鳴らす
}

//jQuery
$(function(){
      $('.トリガーにする要素のclass名').on("touchstart",function(){
          AudioTest();
      });
    });
```
やってることはこれをonclickなどで呼び出すだけです。こんだけ書くだけに3週間くらい悩んでいたので柔軟な発想が欲しいです。引数でファイルのパスなどを変えてもいいかと思います!(^^)!

リズムゲームで連打譜面や太〇の達人で言うお芋の処理なんかでこれが有効活用できたら譜面のバリエーションに困らなくなるかなぁと。

audioタグなどを数用意してjsで個別に呼び出しという方法もあるようですが、見通しが良くないかなって思うので個人的にはやりったくないです。
初心者なりに至った考えなので同じように悩んだ方には、また改良などでゲーム制作などに役立てたらと思います。

#余談注意
情報を求めいていた時に目にしたのですが、ブラウザゲームを作るときにモノによっては初回再生をユーザーにさせないといけないみたいなので、スタート画面で無音再生をさせたりする必要があるみたいです。
こちらも参考にさせていただきました。[phina.jsで音ゲーを作ってみる](https://qiita.com/pentamania/items/399d133e5440c9424bde)
Trelloを使ったタスク管理の運用方法についてまとめる

# はじめに

私がTrelloを使うときに工夫していることを紹介します。
プライベートで利用する際の例を中心に紹介しますが、業務でもおおまかには同じような方法で進めています。

独立した記事内容ですが、[データドリブン業務におけるスクラム実践で感じたこと](https://qiita.com/calderarie/items/b552621733311b5dbd46)にも関連しているので、ご興味があれば併せてどうぞ。

# 使用環境

アプリも提供されていますが、正直機能が不十分です。
有志が公開している拡張機能を利用するため、Chromeで利用しています。

## Chrome拡張機能

- Agile SCRUM for Trello boards
 - 主にストーリーポイントによる進捗管理に使用
 - 他にもカテゴリ機能やヘッドセパレーター機能など

- Card Color Titles for Trello
 - タスクのラベル名を表示してくれる

- Trello Birds-eye
 - リスト内のタスクをタスク名だけ表示するようにし、タスク全体を俯瞰できるようにする

- (導入してないけど試してみたい) Plus for Trello
 - タスク工数の予実管理

## Power-Up

無料版だと1機能しか使えないみたいなので悩みどころです。
ひとまずプライベートではCard Agingを、業務ではCalendarを使っています。

- Card Aging
 - 一定期間更新していないタスクの表示を変化させる
 - 埋もれているタスクを確認するために使用する
- Calendar
 - 期日のついたタスクをカレンダー上に表示する
 - 直近済ませなければならないタスクを把握するために使用する
 - Chrome拡張のNext Up Trelloでもいいが、自分の環境では使えなかったので

# 運用方法

業務ではスクラムな動き方をしているので、それに沿った管理を実施しています。

## リスト

- FutureWork
 - 必要な全Todoのリスト
 - 要するにProduct Backlog
- Standby
 - 時期を待って実施するタスクリスト
 - Product Backlogの中でも厳密な期限付きのものは別で把握したいので作成
 - ~~いい感じのリスト名が思いつかなかったから「Standby」にしてるけどセンスが足りない~~
- ToDo
 - スプリントのToDo
 - Sprint Backlog
- Doing
 - 実施中
- Done
 - スプリントの完了 
 - リスト名には期間を明記して、期間が過ぎたらアーカイブする

- Pending
 - 保留になったタスク

## タスク

- タスク名は簡潔に
 - 一目で何をやるか分からないタスクはダメ
 - 自分だけのボードならいいが、ほかの人と共用の場合は注意する

- 業務では、タスクの詳細説明に必ず「目的」「実施内容」「終了条件」を明確に記述する
 - Trelloの運用から少し離れるが、上記の内容は計画会議で合意を取る

- 実施内容が多い場合、必要に応じてチェックリストを使う
 - チェックリストを使う=タスク量が多いことが多いので、複数タスクへの分解も考慮する

- タスクはラベルとカテゴリで分類する
 - ラベルはTrello標準の機能
 - カテゴリは、Agile SCRUM for Trello boardsの機能で、タスク名の先頭で大括弧を囲うと色で可視化できる

- ラベルで業務の種類を割り当てる
 - 「分析実施」「資料作成」「業務調整」とか

- カテゴリで、タスクの優先順位(重要度)を割り当てる
 - MoSCoW法に応じて、上から順に「Must」「Should」「Could」「Would」で分類
 - タスク名でソートできるようにしたいので、「01_MUST」「02_SHOULD」などといった感じで連番をつけてやる
 - カテゴリの粒度は、3段階では荒すぎるので、4~5くらいがベストかなという印象

- タスクはストーリーポイントを記入する
　- Agile SCRUM for Trello boardsの機能で進捗が見える化される
　- タスクの進捗が進んでいくのを見ると、何となく気持ちいい
 
- 期限をつける
 - リスト内の「Standby」は仕様上、必ず期限が付いている
 - 「FutureWork」内のタスクには、達成目標の期限がつく

- ToDo以降のリストに移動する際に、必ずメンバーをアサインする

## 現状の課題

- ラベルや期限、メンバー、詳細説明など記入項目が多く、GUI操作が多くタスク追加が面倒
- ボード上で主担当と副担当の区別がつかないが、メンバーのアサインで主担当がわかるようにしたい
 - 少人数チームでメンバー自身が認識しているので、関係するメンバーは全員アサインする運用にしている
- 細かい不満はあるが、無料なので、ある程度満足

## 私のプライベートTrelloボードの例

見せられないやつはアーカイブしてるので、ここに載せているタスク量は少ないですが、がっつり使っています！

右に見切れていますが、運用ルールをリストでまとめています。
こちらも、Agile SCRUM for Trello boardsのヘッドセパレーター機能を活用しています。

![trello.png](https://qiita-image-store.s3.amazonaws.com/0/221698/5931541f-5a80-8d87-c0b5-e8a7b6ec2777.png)


# 参考
 - [Trelloで運用する際のルールとかのメモ](https://qiita.com/gdgd/items/3b2979c5fbab538ea01a)
 - [Trelloでプロジェクト管理はこれで完璧！なAgile Scrum Trello Extension
](https://qiita.com/kohashi/items/340b68890ffc06e52857)
 - [2018年 Trelloを使う時にデフォルトで入れるべきChrome拡張機能【随時更新】](https://qiita.com/webazarashi/items/1099cd39d31a1474226a)
 - [Trello の Chrome 拡張機能導入メモ](https://negimochi.work/trello_memo/)
 - [タスク管理サービス「Trello」の、ちょっと便利な使い方4選](https://www.indetail.co.jp/blog/6671/)
 - [プロダクトバックログ項目の優先順位の付け方](https://www.ryuzee.com/contents/blog/3301)
tf.batch_gatherの使い方メモ

#```tf.gather```と仲間たち

まず、gatheの処理をしてくれる仲間たちを紹介する。
- ```tf.gather``` 指定したaxisに沿ってスライスしたものをgatherする。
- ```tf.gather_nd``` 自由度が高く、任意の要素からgatherされる。
- ```tf.batch_gather``` batchに沿って処理される。indicesでスライスされる。
今回はバッチごとにgather処理をしてくれる```tf.batch_gather```を使ってみた。

#```tf.batch_gather```の使い方

##```tf.batch_gather```の解説


```
tf.batch_gather(
    params,
    indices,
    name=None
)
```

prams(Tensor):   ```[A1, ..., AN-1, AN, B1, ..., BM]```
indices(Tensor): ```[A1, ..., AN-1, C]```
result(Tensor):  ```[A1, ..., AN-1, C, B1, ..., BM]```

- ANでスライスされ、A1〜AN-1の構造はそのまま維持される。
- CにANからgatherされる値が入る。
- Cの各値はANの大きさ以下でなければいけない。

詳しくは[TensorFlowの公式ドキュメント](https://www.tensorflow.org/api_docs/python/tf/batch_gather)を参考にしてもらいたい。

##今回の処理
点群屋さんなので、点群を例に説明します。
8点から成る3次元点群を用意した。ここから4点を選びgatherするような処理を行う。
Bはバッチ、Nは点群の点、Cはチャンネル（３次元点群なのでxyz）

![gather.jpg](https://qiita-image-store.s3.amazonaws.com/0/296023/d302f0cc-556f-6da2-58bf-f0a7d69c40a7.jpeg)



##サンプルコード

```batch_gather.py
import tensorflow as tf

#元の点群(2batch x 8点 x 3次元)
param = tf.constant([[[0.,0.,9.],[0.,1.,9.], [0.,2.,9.], [0.,3.,9.], [0.,4.,9.], [0.,5.,9.], [0.,6.,9.], [0.,7.,9.]],
                     [[1.,0.,9.],[1.,1.,9.], [1.,2.,9.], [1.,3.,9.], [1.,4.,9.], [1.,5.,9.], [1.,6.,9.], [1.,7.,9.]]]) # B x N x C(2 x 8 x 3)
print("param shape:     ",param.shape)

#gather元を選ぶテンソル(2batch x 4点)
indices = tf.constant([[1,0,0,4],
                       [1,3,4,6]])    # B x N
print("indices shape:   ",indices.shape)

#gatherする
result = tf.batch_gather(param, indices)
print("result shape:    ",result.shape)

sess = tf.Session()
sess.run(tf.global_variables_initializer())
print("param\n",sess.run(param))     #入力の確認
print("indices\n",sess.run(indices)) #indiciesの確認
print("result\n",sess.run(result))   #gatherの結果
```
実行結果

```
param shape:      (2, 8, 3)
indices shape:    (2, 4)
result shape:     (2, 4, 3)

param
 [[[0. 0. 9.]
  [0. 1. 9.]
  [0. 2. 9.]
  [0. 3. 9.]
  [0. 4. 9.]
  [0. 5. 9.]
  [0. 6. 9.]
  [0. 7. 9.]]

 [[1. 0. 9.]
  [1. 1. 9.]
  [1. 2. 9.]
  [1. 3. 9.]
  [1. 4. 9.]
  [1. 5. 9.]
  [1. 6. 9.]
  [1. 7. 9.]]]

indices
 [[1 0 0 4]
 [1 3 4 6]]

result
 [[[0. 1. 9.]
  [0. 0. 9.]
  [0. 0. 9.]
  [0. 4. 9.]]

 [[1. 1. 9.]
  [1. 3. 9.]
  [1. 4. 9.]
  [1. 6. 9.]]]
```
サーバーサイドエンジニアになってわからなかったこと(2週間目)

#やったこと・わからなかったこと
- bash→zshに変えた
- gitのコマンド
- phpフレームワークのroutingのお勉強


## bash→zsh
なんかzshのほうが良いよといっぱい言われたのでzshにしました。
後、macに最初からついているターミナルﾔﾒﾛ言われたので、iTerm2に変えました。

brewのインストールをやって、**brew zsh**して **which zsh**して**/etc/shells**変えたりしました。
ググればいろいろ出てくるのでやってみましょう。


## gitのコマンド
git をCUIで少しできるようにということで練習。

- git clone
- git pull
- git branch
- git checkout
- git add
- git commit
- git push 
- git status
- git logs

とりあえずこの辺を覚えなさいーって

## dockerの操作
動かしてるdockerのコンテナに入って作業することがちょくちょくあったので
「 **docker exec \-it \<コンテナ名\> \<コマンド\>** 」とかいうのをやりました。
よくやるのが「docker exec -it webサーバコンテナ /bin/bash」とかいうのをよくやります。

##phpのフレームワークのrouting
localhost:8080/index.php/test/login とかでなんで./test/login.phpのページが表示されるかというところのお勉強。
単純にindex.phpでURLを元に./test/login.phpにルーティングしているだけですね。これにいろいろ機能を付け加えてframeworkにしているみたいですね。
~~すごい疑問だったのにわかれば何も難しくないやん？？~~

# 最後に
まだいろいろやったんだけど3週間目のやつに書きます
[Tips] treeコマンドを使ってディレクトリ構造を出力する


# やり方

１. treeコマンドをインストール

  ```
  brew install tree
  ```

２. あとは叩くだけ！簡単

```shell-session
tree 
$ tree .
.
├── dist
│   ├── index.html
│   └── main.js
├── node_modules
│   ├── @webassemblyjs
│   │   ├── ast
│   │   │   ├── LICENSE
│   │   │   ├── README.md
│   │   │   ├── esm
│   │   │   │   ├── clone.js
│   │   │   │   ├── definitions.js
│   │   │   │   ├── index.js
...
```

# (補足) 主なオプション

| オプション | 説明 |
|:-----------|------------:|
| -a       | 不可視ファイルも含めて出力 | 
| -d     | ディレクトリのみ出力      |
| -f       | フルパスで出力        | 
| -i         | ツリーの枝を表示しない。-fと一緒に使うと便利          |
| -l       | シンボリックリンクを追跡する       |
| -p    | ファイルタイプとパーｓミッションを付与  |
| -s | ファイルサイズを出力する |
| -h | わかりやすくファイルサイズを出力する |

もっと知りたい方は[ドキュメント](https://linux.die.net/man/1/tree)へ
Angular環境構築

# はじめに
ひっそりと大改修...

# 参考サイト
◆Angular 日本語ドキュメンテーション
　https://angular.jp/docs

◆Angularをバージョン指定でインストールし、開発環境構築
　https://qiita.com/tsutsumi32233/items/5175d3a8c6e21654aff4

◆Angular の環境構築方法入門
　https://webbibouroku.com/Blog/Article/angular-env
　　※これはちょっと古い
　
# 導入
## Node.js：v10.16.3
　https://nodejs.org/download/release/
　　node --version
　　npm：v6.9.0

※バージョンアップ時は下記等を参考に
◆Node.js 12正式版が登場、1年ぶりのLTS対象バージョン。起動高速化、TLS1.3対応、ES6モジュールの実験的サポートなど
　https://www.publickey1.jp/blog/19/nodejs_121ltstls13es6.html

◆The Difference Between Node.js 10 LTS and Node.js 12 LTS
　https://nodejs.org/tr/blog/uncategorized/10-lts-to-12-lts/

## VSCode ：v1.41.1
　https://code.visualstudio.com/updates/v1_41
## Angular：v8.2.4!?(github見る限りv8.2.2、ngコマンドだとv.8.2.14)
　https://github.com/angular/angular-cli
　　下記フォルダー削除
　　　%USERPROFILE%\AppData\Roaming\npm-cache
　　　%USERPROFILE%\AppData\Roaming\npm
　　　C:\Program Files\nodejs
　　npm install -g @angular/cli@8.2
　　ng version
　　
　　cd D:\Angular
　　ng new my-app4 --style=scss

# チューニング
## 配置(deploy)先をDocument Root以外にする際の注意
◆Angular CLIでサブディレクトリにビルドする方法
　http://apoc.jp/angular-cli-subdir/
　　※オプション(--output-path／--base-href)
◆angular5で画像表示
　https://teratail.com/questions/148265
　　※assetsの画像表示パターン
.NET: WindowsとmacOSの両方で動くNUnitテストプロジェクトを作る

日本語の情報が少ないので書きました．

クロスプラットフォームでアプリを**動かす**のではなく，クロスプラットフォームで**開発する**際の話です．

**検証環境**

- Visual Studio Community 2017 / Windows 10 1803 (April 2018 Update)
- Visual Studio Community 2017 for Mac / macOS High Sierra

## 2行でまとめると

- 「単体テストプロジェクト」はVisual Studio for Macでは扱えない．
- クラスライブラリプロジェクトを作成し，パッケージとしてNUnit 3系とNUnit3TestAdapterを追加すると動く．

## "単体テストプロジェクト"はMac未サポート

Visual Studio (Windows)で作成したソリューションを開くと，単体テストプロジェクトとして作成したものが「このプロジェクトの種類は、Visual Studio Community 2017 for Mac によってサポートされていません。」との表示．

厳密には，ファイルの読み書きは出来ますが，ビルドやテスト実行はできません．

<img width="364" alt="このプロジェクトの種類は、Visual Studio Community 2017 for Mac によってサポートされていません。" src="https://qiita-image-store.s3.amazonaws.com/0/1045/f457eb7a-d84c-6f74-7af8-d7a98dc6b297.png">

## 解決法: クラスライブラリプロジェクトにNUnit 3を足す

解決方法は割と簡単です．クラスライブラリプロジェクトを作成し，NuGet パッケージとしてNUnit (3系)とNUnit3TestAdapterを追加します．Windowsから，Macから，どちらでも構いません．

<img width="652" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/1045/018ac10e-0c47-7c21-00d1-9b17ce365fcb.png">

<img width="193" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/1045/8338832d-f068-915f-cf3d-441dfdfa02d6.png">

### Visual Studio for Mac

プロジェクトを実行すると，テストが走ります．

<img width="757" alt="" src="https://qiita-image-store.s3.amazonaws.com/0/1045/ed961c8f-040f-f93e-6479-e923f1b05140.png">

### Visual Studio (Windows)

残念ながらアイコンは通常のプロジェクトと同じになってしまいますが，テストエクスプローラーからテストを実行できます．

![windows_project.PNG](https://qiita-image-store.s3.amazonaws.com/0/1045/be1063a6-15f2-a59e-b74d-3394d2cd12f1.png)

![windows_test.png](https://qiita-image-store.s3.amazonaws.com/0/1045/001233a2-acaa-269c-0b19-4de4bd44746b.png)

## 参考

- [this project type is not supported by visual studio community 2017 for mac - Developer Community](https://developercommunity.visualstudio.com/content/problem/159067/this-project-type-is-not-supported-by-visual-studi.html)
Gitのコミットメッセージを後から修正する


## 概要

Gitのコミットメッセージ間違えてしまった場合の修正方法をまとめました。

## 環境

- macOS High Sierra
- ターミナル

## 直前のコミットメッセージを修正する

以下の例のように、直前のコミットメッセージを間違えてしまった場合。

```:直前のコミットでissueとの紐付けを忘れている
$ git log --oneline
503fd63 test: テストコードの修正
...
```

### 解決策

`$ git commit --amend`コマンドを利用します。

#### 手順

1. ターミナルで`$ git commit --amend`を実行する。
2. viエディタが起動する。
3. `i` で編集モードに切り替える。
4. コメントを修正する。
5. `Esc`キーで編集モードを終了し、`wq`で保存する。

```$&nbsp;git&nbsp;commit&nbsp;--amendの実行結果
$ git commit --amend
hint: Waiting for your editor to close the file... 
fix: xxxxのバグを修正

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Sun Nov 4 16:56:53 2018 +0900
#
# On branch master
# Your branch is up to date with 'origin/master'.
#
# Changes to be committed:
#       modified:   test/widget_test.dart
```

#### 修正確認
```
$ git log --oneline
503fd63 test: #78 テストコードの修正
...
```

## 2つ以上前のコミットメッセージを修正する

以下の例のように、2つ前のコミットメッセージを間違えてしまった場合。

```:2つ前のコミットで`機能`と`昨日`をtypoしている
$ git log --oneline
33d7b8d fix: #91 ○○が重複登録できてしまうバグを修正
9a60887 feat: #89 ○○を変更する昨日を追加
86abff0 style: #12 インデントを修正
...
```

### 解決策

`$ git rebase -i`を利用します。

#### 手順

1. 修正対象のコミットを指定する
2. コミットメッセージを修正する。
3. `rebase`を終了する

##### 修正対象のコミットを指定する
1. ターミナルで`$ git rebase -i HEAD~2`を実行する  
_※`HEAD~`のあとの数字は修正したいコミットまでの数字_
2. viエディタが起動する。
3. `i` で編集モードに切り替える。
4. 修正したいコミットメッセージの先頭にある`pick`の文字列を`edit`に書き替える。
5. `Esc`キーで編集モードを終了し、`wq` で保存する。


```:$&nbsp;git&nbsp;rebase&nbsp;-i&nbsp;の実行結果
pick 9a60887 feat: #89 ○○を変更する昨日を追加
pick 33d7b8d fix: #91 ○○が重複登録できてしまうバグを修正

# Rebase 86abff0..33d7b8d onto 86abff0 (2 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
#       However, if you remove everything, the rebase will be aborted.
#
#
# Note that empty commits are commented out
```

##### コミットメッセージを修正する。
1. `$ git commit --amend`を実行する。
2. viエディタが起動する。
3. `i` で編集モードに切り替える。
4. コメントを修正する。
5. `Esc`キーで編集モードを終了し、`wq`で保存する。

##### `rebase`を終了する

`$ git rebase --continue` を実行すると、`rebase` が終了します。
_※今回は`edit`に変更したコミットが1つなので終了しますが、2つ以上変更している場合は次のコミット移動します_

```
$ git rebase --continue
Successfully rebased and updated refs/heads/master.
```

#### 修正確認
```
$ git log --oneline
33d7b8d fix: #91 ○○が重複登録できてしまうバグを修正
9a60887 feat: #89 ○○を変更する機能を追加
86abff0 style: #12 インデントを修正
```
【Rails】[rails new ]で、エラーが発生したときの解決メモ

##環境
Ubuntu 16.04.2 32bit
ruby 2.3.1-p112

##エラーの内容

- rails new HelloWorld を実行したら、以下のエラーメッセージが出力された。

```
（中略）
Fetching sqlite3 1.3.13
Installing sqlite3 1.3.13 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
current directory:
/tmp/bundler20180925-5349-mge994sqlite3-1.3.13/gems/sqlite3-1.3.13/ext/sqlite3
/usr/bin/ruby2.3 -r ./siteconf20180925-5349-1r28bni.rb extconf.rb
checking for sqlite3.h... no
sqlite3.h is missing. Try 'brew install sqlite3',
'yum install sqlite-devel' or 'apt-get install libsqlite3-dev'
and check your shared library search path (the
location where your sqlite3 shared library is located).
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/usr/bin/$(RUBY_BASE_NAME)2.3
	--with-sqlite3-config
	--without-sqlite3-config
	--with-pkg-config
	--without-pkg-config
	--with-sqlite3-dir
	--without-sqlite3-dir
	--with-sqlite3-include
	--without-sqlite3-include=${sqlite3-dir}/include
	--with-sqlite3-lib
	--without-sqlite3-lib=${sqlite3-dir}/lib

To see why this extension failed to compile, please check the mkmf.log which can
be found here:

/tmp/bundler20180925-5349-mge994sqlite3-1.3.13/extensions/x86_64-linux/2.3.0/sqlite3-1.3.13/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in
/tmp/bundler20180925-5349-mge994sqlite3-1.3.13/gems/sqlite3-1.3.13 for
inspection.
Results logged to
/tmp/bundler20180925-5349-mge994sqlite3-1.3.13/extensions/x86_64-linux/2.3.0/sqlite3-1.3.13/gem_make.out

An error occurred while installing sqlite3 (1.3.13), and Bundler cannot
continue.
Make sure that `gem install sqlite3 -v '1.3.13' --source
'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  sqlite3
         run  bundle exec spring binstub --all
Could not find gem 'sqlite3' in any of the gem sources listed in your Gemfile.
Run `bundle install` to install missing gems.
```

- 以下のコマンドを実行して、sqlite3をインストールする

```
apt-get install libsqlite3-dev
```

- プロジェクトディレクトリが作成されるので、そこに移動して、プロジェクトを起動します。

```
cd HelloWorld
rails s
```

- エラーが発生せずに、起動できたようです。

```
=> Booting Puma
=> Rails 5.2.1 application starting in development 
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.0 (ruby 2.3.1-p112), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
```
テンプレートエンジンを擁護する


[Architecture no one needs is server side templating](https://itnext.io/architecture-no-one-needs-is-server-side-templating-78331391274) ([HN](https://news.ycombinator.com/item?id=18361129))を読んで。

昨今では猫も杓子もJavaScriptが大好きなようで、「Reactを使っていない」などと言おうものならバッシングを受ける時代ではありますが、そんな2018年も終わろうとしている今、どうしてテンプレートエンジン(笑)などというダサいソリューションを使わなければならないのでしょうか?



## テンプレートエンジンは遅い

> Templating language is basically string interpolation which builds the presentational layer at load time.

"load time"とはいつを指すのでしょうか? どうやら元記事の著者は、テンプレートエンジンが「ユーザーがリクエストを読み込むとき」、文字列を連結していると考えているようです。これは明らかに、大抵のテンプレートエンジンの動作ではありません。

* テンプレートエンジンはテンプレート文字列を読み込み、コンパイルする
* 入力されたモデルを使い、コンパイルされたテンプレートがストリームに対して出力を行う
* 必要なら出力をキャッシュする

第一に、テンプレートはコンパイルされるので単なる文字列の結合より高速です。第二に、出力は結合された文字列として生成されるのではなく、出力ストリームに直接出力を行います。その場合、文字列結合にかかわるオーバーヘッドはありません。

一般的に言って、SPAよりもテンプレートエンジンのほうがずっと高速です。

時々、「SPAはリンク先をプリフェッチするから速い」などという人がいますが、これはユーザーの観点からすれば最低最悪なので絶対にすべきではないです。




## SSR

サーバーサイドレンダリングは本当にいいところが何一つないソリューションで、遅く、複雑で、必要性のない依存関係と必要のないレイヤーをシステムに持ち込む、何故使われているのか理解に苦しむものです。




## テンプレートエンジンの学習コストが高い

テンプレートエンジンの学習コストがJavaScriptの学習コストより高いというのは相当無理のある主張ではないでしょうか? それともJavaScriptはできて当然ということなのでしょうか? テンプレートエンジンの構文は大抵どれも似通っていて、それほど負担になるとは思えません。必要な時にリファレンスを見れば十分ではないでしょうか。


## エラーハンドリング

元記事の著者はなぜか、テンプレートエンジンはエラー発生時に500を返すことしかできないと思い込んでいるようですが、全くそんなことはありません。




## クライアントサイドのコードが別々になってしまう

これは確かに問題であり、テンプレートエンジンにうまい解決策はありません。ただ言えることがあるとすれば、テンプレートエンジンを使うときは「その流儀」に合わせて設計を行うべきであり、例えばAJAXリクエストを極力減らして作るべきです。



## コンポーネント志向

多くのテンプレートエンジンがコンポーネント志向でないというのは本当に問題なのですが、これは単に多くのテンプレートエンジンがそういう設計になっているということであり、コンポーネント志向のテンプレートエンジンがないわけではありません。



## SPA: Good parts

SPAは動的なWebアプリケーションを作るのに適した唯一のソリューションで、テンプレートエンジンにはできないことです。




## まとめ

> Summary of the article: "Why do we need screwdrivers? I have a hammer, and everything looks like a nail to me!"

[HNのこのコメント](https://news.ycombinator.com/item?id=18361392)が、完璧な要約です。SPAが必要ならSPAを使えばいいし、テンプレートエンジンが上手いソリューションならテンプレートエンジンを使えばいいのです。
RISC-Vのアセンブリ記述

RISC-Vのアセンブリ記述について

ちょこっとRISC-Vのアセンブリ記述を調べたメモです。

まだ、中途半端ですが…

# ドキュメント
* RISC-V User-Level ISA Specification
* [RISC-V Assembly Programmer's Manual
](https://github.com/riscv/riscv-asm-manual/blob/master/riscv-asm.md)
 * 役に立つが、情報が十分でない。

いまのところ、網羅的な情報はみつからないので、必要になったらgccで生成したアセンブリ記述を調べています。

# 演算

a5レジスタに即値12を加算

```
  addi a5, a5, 12
```

a4 = a4 + a3

```
  add a4, a4, a3
```

a4 = a4 * a3

```
  mul a4, a4, a3
```

# 代入

a0 = a4

```
  mv a0, a4
```

# メモリ操作

レジスタraの値をsp+8番地のメモリにストア

```
  sd ra,8(sp)
```

sp+8番地のメモリの値をレジスタraにロード

```
  ld ra,8(sp)
```


# 擬似命令

L1にジャンプ

```
  j L1
L1:
  ret
```

リターン

```
  ret
```

即値ロード

```
  li a0 4
```
即値ロードはアセンブラでaddiに変換される。

```
  addi a0, zero, 4
```

# 呼び出し規約

* 関数の引数はa0, a1, a2, a3, a4, a5 にセット
* 関数の戻り値はa0にセット
【RubyOnRails】Railsサーバー起動時にエラーが発生したときのメモ

#環境
Amazon Linux2

#現象
- rails serverコマンド実行で、以下のエラーが発生

```
(略)
         3: from /usr/local/rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:21:in `require'
         2: from /usr/local/rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/execjs-2.7.0/lib/execjs.rb:4:in `<main>'
         1: from /usr/local/rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/execjs-2.7.0/lib/execjs.rb:5:in `<module:ExecJS>'
/usr/local/rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/execjs-2.7.0/lib/execjs/runtimes.rb:58:in `autodetect': Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
```

#参考にさせていただいたサイト
https://qiita.com/azusanakano/items/771dc9919f347de061d7

#解決策

- ランタイムが利用できないと言っているので、ランタイムを追加してあげれば良い模様
- 追加してあげるランタイムとしては、node.jsでも、therubyracerでも良いが、昨今は、mini_racer が主流となってきているようなので、こちらを追記する。
- gemファイルはプロジェクトディレクトリ下にあります。その中に、以下コメントの記載が有るので、コメントアウトをはずす。

```
# gem 'mini_racer', platforms: :ruby
↓
gem 'mini_racer', platforms: :ruby
```

- その後、以下コマンドを実行し、mini_racerをインストールする

```
bundle install
```

- 改めて、rails serverコマンド実行すると、起動できました。
【Ruby】コーディングメモ（モジュール）

##環境
ruby 2.4.1p111

##モジュールとは

- クラスとは異なり、オブジェクトの生成、継承が行えない。
- しかしながら、1つのクラスからは1つのスーパークラスしか継承できない為、複数クラスにまたがるような共通メソッドを定義する場合、モジュールクラスに定義することで、効率的に共通メソッドを定義できる利点がモジュールに有る。
- 書き方は以下

```rb
module モジュール名
 処理
end
```

- 例として、以下サンプルを書きました。CommonFuncの名のモジュール、Employeeというスーパークラス、Tanakaという派生クラスを定義し、main.rbから呼び出しています。
- 拙記事「【Ruby】コーディングメモ（モジュール）」のサンプル（employee.rb、tanaka.rb、main.rb）を一部修正して流用しています。

```commonFunc.rb
module CommonFunc
  def sayYes
    puts "Yes"
  end
end
```

```employee.rb
class Employee
  include CommonFunc
  attr_accessor :name
  def initialize(name)
    @name = name
  end

  def sayName
    puts "My Name is " + @name
  end
end
```

```tanaka.rb
class Tanaka < Employee
  def doing
    puts "I'm working."
  end
end
```

```main.rb
load "commonFunc.rb"
load "employee.rb"
load "tanaka.rb"

tanaka = Tanaka.new("Ichiro Tanaka");
tanaka.sayYes
```

- 結果は以下です。

```
Yes
```
【Ruby】コーディングメモ（クラス）

##環境
ruby 2.4.1p111

##クラスファイルを作成

```hello.rb
class Hello
    # 初期処理
    def initialize(msg)
        #@msgはクラス内で参照可能なインスタンス変数です
        @msg= msg
    end

    # インスタンス変数に値を設定できるメソッドを用意
    def msg=(value)
        @msg= value
    end

    # メッセージ出力メソッド
    def outputMsg
        puts "Hello " + @msg
    end
end
```

##HelloクラスのHelloクラスのメソッドを呼び出す

```main.rb
load "hello.rb"
hello = Hello.new("Initialized Msg.")
hello.outputMsg

hello.msg = "Overwrited Msg."
hello.outputMsg
```

##結果
```
Hello Initialized Msg.
Hello Overwrited Msg.
```

##インスタンス変数に関して補足
- hello.rbでインスタンス変数@msgに値設定用のメソッドを用意しましたが、attr_accessor メソッドを用意しておけば、以下のメソッドは不要となります。また、attr_accessor メソッドを用意しておく事で、値設定のみでなく、クラス呼び出し元にて、インスタンス変数値の取得も可能となります。

``` hello.rb
    def msg=(value)
        @msg= value
    end
```

- 修正版は以下となります。

``` hello.rb
class Hello
    attr_accessor :msg
    # 初期処理
    def initialize(msg)
        #@msgはクラス内で参照可能なインスタンス変数です
        @msg= msg
    end

    # メッセージ出力メソッド
    def outputMsg
        puts "Hello " + @msg
    end
end
```

##クラスの継承
- 継承の記載方法は以下です。

```rb

class クラス < スーパークラス
  ...
end
```

- 実際には以下の様に書きます。
- Employee(employee.rb) がスーパークラスで、Tanaka(tanaka.rb)が継承します。
- main.rb で呼び出しています。

```employee.rb
class Employee
  attr_accessor :name
  def initialize(name)
    @name = name
  end

  def sayName
    puts "My Name is " + @name
  end
end
```

```tanaka.rb
class Tanaka < Employee
  def doing
    puts "I'm working."
  end
end
```

```main.rb
load "employee.rb"
load "tanaka.rb"

tanaka = Tanaka.new("Ichiro Tanaka");
tanaka.doing
tanaka.sayName
```

- 結果は以下となります。

```
I'm working.
My Name is Ichiro Tanaka
```
【Ruby】コーディングメモ（連想配列）

##環境
ruby 2.4.1p111

## 連想配列

```sample.rb
#連想配列の宣言
colors = { Black: "#000000", Navy: "#000080", DarkBlue: "#00008B", MediumBlue: "#0000CD"}

#キーを渡して、配列値を取得するには以下のように取得する
puts colors[:Black]

#キーを追加する場合
colors["Blue"] = "#0000FF"

#配列の数を求める場合
puts colors.length

#空か判定する場合
puts colors.empty?

#キーが含まれるか：
colors.has_key?(:Black)

#繰り返し処理(each)
# （ブロック引数を省略すると、Enumeratorオブジェクトが返ってくる）
colors.each
#(結果)
 => #<Enumerator: {:Black=>"#000000", :Navy=>"#000080", :DarkBlue=>"#00008B", :MediumBlue=>"#0000CD", "Blue"=>"#0000FF"}:each> 

# 以下のようにブロックを指定して繰り返し処理を行える
colors.each {|color_name, color_val| puts "#{color_name}\t#{color_val}" }
#(結果)
Black   #000000
Navy    #000080
DarkBlue        #00008B
MediumBlue      #0000CD
Blue    #0000FF

#連想配列のキーのみ繰り返し(each_key)
colors.each_key {|color_name| puts "#{color_name}" } 
#(結果)
Black
Navy
DarkBlue
MediumBlue
Blue

#連想配列の値のみ繰り返し(each_value)
colors.each_value{|color_val| puts "#{color_val}" } 
#(結果)
#000000
#000080
#00008B
#0000CD
#0000FF

#連想配列を検索
colors.select {|color_key, color_val| color_val == "#000080"}
#(結果)
 => {:Navy=>"#000080"} 

#繰り返し処理を実行して、結果を配列にして返す
plices = { Apple: 120, Orange: 150, Grape: 360}
tax_inc_plicess = plices.collect{|k, v| (v * 1.08).to_i}

puts tax_inc_plicess 
#(結果)
129
162
388

#連想配列をマージする
# 果物
fluets = { Apple: 120, Orange: 150, Grape: 360}
# 野菜
vegetables= { carrot: 300, potato: 180, onion: 200}
# 果物と野菜をマージして、結果を出力
flts_and_vegets = fluets .merge(vegetables)
puts flts_and_vegets

#(結果)
{:Apple=>120, :Orange=>150, :Grape=>360, :carrot=>300, :potato=>180, :onion=>200}
```
Eclipse Cheを学ぶ。

Eclipse Che
https://www.eclipse.org/che/
を使おうといろいろ試している。

ソースは
https://github.com/eclipse/che

CheConf 2018 が動画で見られることを最近知った。
https://www.eclipse.org/che/checonf18/index.html

視聴回数が200回程度。goodがついていないものもある。

一番関係の深い２つを拝見した。
また、関係の深い技術、Container, Languagesを整理しました。
知見をwikiに追記しました。

#1) Case Study
 Silexica: Developing a C/C++ Multicore IDE on Eclipse Che
Hanno Kolvenbach, Product Manager, Silexica https://www.silexica.com/
CheConf 2018 (2) Silexica Developing a C/C++ Multicore IDE Che
https://www.youtube.com/watch?v=PR1d_chdJFU&list=PLWpdeL3mennY0UJVZ3lqExE_SdLXwiVdI&index=2


説明の途中で、ノイズが多いとか、画面をもっと見やすくという司会からのつっこみは参考になる。英語でどういえばいいかを含め。質疑応答の時間があると司会がちゃんと質問している。質疑応答を録画しているのも嬉しい。

終わってから25秒くらい余分がある。動画の編集って切りはり大変だからしょうがないと思う。自分の経験上からも。

#2)How-To
 Creating a Language Server for Eclipse Che
Thomas Maeder, Senior Developer, Red Hat http://www.redhat.com/
CheConf 2018 (6) Creating a Language Server for Eclipse Che
https://www.youtube.com/watch?v=UvNs03baIrQ&index=6&list=PLWpdeL3mennY0UJVZ3lqExE_SdLXwiVdI


# 3) Container
Docker, OpenShift, Kubernetes対応確認中。

Docker
https://hub.docker.com/r/eclipse/che/

OpenShift
https://openshift.io/features.html


Kubernetes
https://kubernetes.io/blog/2018/05/01/developing-on-kubernetes/

#4) Languages
LSP
https://github.com/Microsoft/language-server-protocol

JSON
PHP
Python
C#
TypeScript

p.s.
導入しながら、順次、記録します。

# 5) wiki 
##Eclipse che
https://en.wikipedia.org/wiki/Eclipse_Che
Further ReadingにEclipse conference 2018を追記しました。
Languages にC#, F#, GO, TypeScriptを追記しました。
FrameworksにKubernetesを追記しました。
出典に https://microsoft.github.io/language-server-protocol/specification Language Server Protocol(LSP)を追記しました。

## Container
https://en.wikipedia.org/wiki/Container
Add Software container, include  Docker Kubernetes and Openshift.


#文書履歴(document history)
ver. 0.10 初稿 20181104夕
ver. 0.11 wiki追記報告追記 20181104夜
アンケート（複数回答形式・MA形式）の回答を集計可能なデータに変換する方法

### 概要
- アンケート集計を行なっていると、複数回答形式の回答の処理が面倒な場面があります
- アンケート回答システムによっては、複数回答項目をカンマ区切りで一つのセルに入った状態で渡されます
- このままでは集計できないので、ダミー変数のテーブルに変換する必要があるのですが、標準パッケージにはない為、独自に処理ロジックを作成する必要があります
- 同じ場面に遭遇した方の為に参考までの共有です

##### 受領したデータ
| 回答者 | 回答（複数選択） |
|:-----------|:------------:|
| 回答_0 | a,b,c |
| 回答_1 | b,c,d,e,f |
| 回答_2 | d,e,f |
| 回答_3 | a,b,c,d |
| 回答_4 | c,d,e,f |
| 回答_5 | e,f |


##### 集計で欲しいデータ
| 回答者 | 回答_a | 回答_b | 回答_c | 回答_d | 回答_e | 回答_f |
|:-----------|:------------:|:------------:|:------------:|:------------:|:------------:|:------------:|
| 回答_0 | 1 | 1 | 1 | 0 | 0 | 0 |
| 回答_1 | 0 | 1 | 1 | 1 | 1 | 1 |
| 回答_2 | 0 | 0 | 0 | 1 | 1 | 1 |
| 回答_3 | 1 | 1 | 1 | 1 | 0 | 0 |
| 回答_4 | 0 | 0 | 1 | 1 | 1 | 1 |
| 回答_5 | 0 | 0 | 0 | 0 | 1 | 1 |


### アプローチ
1. 複数回答選択肢をユニークで取得（集計で欲しいデータのヘッダー）
2. 回答を一つづつ確認していき、回答選択肢を含んでいたらTrue、含んでいなかったらFalseを返す
3. Bool(True or False)型をint(1 or 0)に変換し元のデータフレームへ結合

### コード
- 複数回答形式のサンプルデータの作成

```python
sample = pd.DataFrame(['a,b,c','b,c,d,e,f','d,e,f','a,b,c,d','c,d,e,f','e,f'], columns=['複数回答'])
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/76983/07fdfbfa-7596-85e1-5717-ab1d461aa95e.png)

- 複数回答選択肢をユニークで取得（集計で欲しいデータのヘッダー）

```python
# 複数回答データを','で分割して、１つのリストにまとめる
ans = [sample['複数回答'][i].split(',') for i in range(len(sample))]

# リストのflattening
ans_ = []
for s in ans:
    ans_.extend(s)

# 重複を除きユニークな回答選択肢を取得
ans_ = np.unique(ans_)
```
- 回答を一つづつ確認していき、回答選択肢を含んでいたらTrue、含んでいなかったらFalseを返す
- まずは回答を固定して動作確認
- ans_[0](回答'a')が含まれているかを a in bで検証して、True / Falseを返している

```python
[ans_[0] in sample['複数回答'][i] for i in range(sample.shape[0])]
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/76983/ba63337c-3f58-c2bf-3880-30c8d4030e20.png)

- 回答をfor文で一つづつ動かして、True/Flseの行列を作成
- 作成した行列をPandas.Dataframeへ変換（回答選択肢ごとにTrue/Falseを判定しているため、Transpose（転置）する
- dummy*1をすることで、True/Falseを1/0へ変換して、元のデータフレームを結合

```python
dummy = []
for j in range(len(ans_)):
    dummy.append([ans_[j] in sample['複数回答'][i] for i in range(sample.shape[0])])

dummy = pd.DataFrame(dummy, index=ans_).T

pd.concat([sample, dummy*1], axis=1)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/76983/13becbfd-8a8c-6296-9b5a-5b146906b3f1.png)
[Git]「fatal: destination path '.' already exists and is not an empty directory.」というエラーが出て悩んだ話

## はじめに
稀に、githubからcloneするときに「リポジトリファイル内だけをcloneしたい」と思う事があります。
そんな時、皆さんどのようにされているでしょうか。

私は今まで以下コマンドを使って（ネットで調べたコマンドを使って）cloneしていました。

```
$git clone [url] .
```

しかし、先日上記コマンドを使ってcloneしようとしたら、以下エラーメッセージが表示されました。

```
fatal: destination path '.' already exists and is not an empty directory.
```

うーん、エラーメッセージの意味もよくわからない・・・
（そもそも「.」はカレントディレクトリを指すので、既に存在するとか言われても・・・）

そもそも、上記コマンドは正しいのか？
今思えば、普段ディレクトリ名を書くところに「.」を書く事で「リポジトリファイル内だけをcloneできる」事にも違和感を感じました。

そこで改めて「リポジトリファイル内だけをcloneしたい」を考える事にしました。

## 解決方法
これで「リポジトリファイル内だけをcloneしたい」を実現する事ができます。

```
$git init ・・・ gitのローカルリポジトリを作成する。

$git remote add origin [url] ・・・ リモートリポジトリの追加

$git fetch　・・・　リモート追跡ブランチを最新化

$git pull origin master ・・・ ローカルブランチを最新化
```

普段、何気なく使っているコマンドでも、ちゃんと理解しておかないと駄目だなぁと改めて思いました。
仕様書と設計書の違い

# 背景
- 今まで携わったプロジェクト、人によって、「仕様書」、「設計書」と意味合いが違った呼び方されている。自分の見解を示す

# 辞書（weblio）を引いて比べてみましょう

## 仕様書とは
> ①  やり方や、その順序を記した文書。 「作業の－」
> ②  建築・機械などで、注文品の内容や図などを書いた書類。

https://www.weblio.jp/content/%E4%BB%95%E6%A7%98%E6%9B%B8

## 設計書とは

> 建築物やシステムに関する構造、形、機能などを定義したもの。図面で表したものを設計図という。

https://www.weblio.jp/content/%E8%A8%AD%E8%A8%88%E6%9B%B8

## 自分の見解
- 辞書を引いて読むと違いは明確になりますね
- 仕様書は、こう有るべきという仕様（決め事）を記載する書類です
- 設計書は、その仕様を実現する為に、「どのようなシステム構成にするか？」、「どうやって作るか？」という実現方法を記載した書類です

### 例（ユーザーがWEB掲示板の製造をシステム開発会社に発注した場合）

- 以下の様な決め事を記載した書類が**仕様書**です
	- WEB掲示板にアクセスするときには、ログインが必須であること
	- ログインするときに、ユーザー名とパスワードを入力すること
	- ユーザー名、パスワードが間違っていたら、「ユーザ名、またはパスワードが間違っています」とエラーメッセージを表示すること
	- ユーザー名、パスワードが正しかったら、WEB掲示板のページを表示すること
	- etc

- 上記の仕様を実現する為に、どうやったら実現できるかその実現方法を記載した書類が、**設計書**です
	- WEB掲示板画面表示時に、ログイン状態で無い場合、ログイン画面にXXで画面遷移する
	- ユーザー名、パスワードのチェックはXXを使用してValidateチェックする
	- etc

## まとめ
- 厳密に言うと、「仕様書に、設計が記載されていたり」、「設計書に、細かすぎる仕様が記載されている」のはおかしい
- でもまあ、小さい案件や、客先に見せないドキュメントであれば、仕様と設計が混在したドキュメントだろうと良いとは思います
- が、大きいプロジェクトであれば、用途毎に使い分けた方が良いんじゃないかなと思っています
- 話がそれますが、客先に見せる情報、客先に見せない情報など混在した書類だったら、客先から書類を要求されたとき、その都度体裁を整えて、書類を作成しなくてはならないですよね
- 自戒も含めてですが、「この書類は、誰を読者として、何を書かなくてはならないのか」を意識しなくてはいけないなと思います。「仕様書」、「設計書」も同様に