OmniAICreator/Qiita-1.07M huggingface dataset:
An error occurred while installing mysql2 (0.5.2), and Bundler cannot continue. Make sure that `gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'` succeeds before bundling.

git clone して来て`bundle`
しようとしても、

```
Fetching mysql2 0.5.2
Installing mysql2 0.5.2 with native extensions
```

や

```
An error occurred while installing mysql2 (0.5.2), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'` succeeds before bundling.
```
でつまずいて進まない、、、


##ボクの場合の解決方法

rubyのバージョンを-v 2.5.3に変更して`Gemfile.lock`を削除

```
$ rbenv local 2.5.3
$ sudo rm -rf Gemfile.lock
```

# 解決コマンド

```
$ brew install openssl
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"
```

```
$ bundle install
```

##参考サイト
https://qiita.com/Yutazon/items/8d1e538b8c89fc7bda3c
C言語ポインタを忘れるな！自分！の巻

#ポインタの仕組みを見ていこう

最近数年前に勉強したC言語を使ってコーディングする機会があったのですが、、ポインタの知識のあたりは使わないと忘却の彼方へ。。。
初投稿といえば！やっぱりポインタでしょ！笑
アウトプットの大切さに最近気付いたので、大切なのに忘れがちな知識をまとめておこうと思います。

##アドレスについて

C言語において、メモリの場所を直接表すために使われる「アドレス」というものがある。
その名の通り、コンピュータ内の住所のようなもので、16進数で表されている。
変数のアドレスを知るには、変数名にアドレス演算子である「&」をつける。
変数のアドレスを出力する際には変換仕様として、「%p」を使う。

```
printf("変数aのアドレスは%pです。\n",&a);
```

アドレス？PCとか実行状況によって変化するし、そんなもの知ってどうするの？
って感じるかも。
アドレスを使うと、__実際の値ではなく、メモリ上の位置がわかる__
これの利便性は、後々使用例を挙げるので、そこで実感できる。

##ポインタ変数について
ポインタ変数とは、__アドレスを格納する特殊な変数__である！！
実際に使い方を見てみよう
ポインタ変数の宣言は、普通の変数同様に、型とポインタ変数名の宣言が必要である。

```
型名　*ポインタ変数名;
int *pA;
```
ここで、ポインタ変数の宣言には変数名の前に必ず`*`という記号をつけることに注意！
逆に、このマークが無ければ自分でもただの変数と見分けがつかなくなりそう^^
また、このポインタ変数に、例えば変数aのアドレスを格納しようと思ったら、以下のようにする。

```
pA = &a;                   /*変数aのアドレスをpAに格納、つまり指定する変数の前に&をつける。*/
```

ポインタ変数pAに格納されたアドレス値を出力する際には、`%p`で指定。

```
printf("変数aの値は%dです。¥n",a);
printf("ポインタ変数pAの値は%pです。¥n",pA);
printf("*pAの値は%dです¥n",*pA);
```

先ほど同様に宣言すれば、ポインタ変数に別のアドレスを代入することも可能。

##ポインタ変数を使って変数の値を変更する
Cのプログラムの一部を抜粋します。

```
int a;
int *pA;

a = 5;
pA = &a;

printf("変数aの値は%dです。¥n",a);
*pA = 50;

printf("*pAに50を代入しました。¥n");
printf("変数aの値は%dです。¥n",a);

return 0;
```
実行結果は、、

```
変数aの値は5です。
*pAに50を代入しました。
変数aの値は50です。
```
つまり、この結果から何が分かったかというと、__*pAとaが同じものを指している__ということ。
それでは何が違うかを軽く解釈していく。
変数aの値に数値を代入して値を設定する、というのはプログラミングを学び始めた時に習うやつ。
ポインタ変数に関しては、__*pAに値を代入するということは、ポインタ変数pAが指している変数aに値を代入する__という解釈であることを覚えておきたい。
このように、ポインタ変数を使うと変数aそのものをいじらなくても、中身が変更できることが分かった。

##引数にポインタ変数を使ってみる

swap関数を使ってみる。

```
void swap(int x, int y){
 int tmp;           /*一時保管場所としての変数tmpを設定*/
 tmp=x;
 x=y;
 y=tmp;
}
```
以上のような、引数x,yを交換するswap関数を作り、main関数のなかで使う。

```
/*main関数の中身を抜粋*/
int num1=1;
int num2=2;

swap(num1,num2);
printf("変数num1の値は%d,変数num2の値は%dです。¥n",num1,num2);
```
このようにして、「変数num1の値は2,変数num2の値は1です。」と表示されることを期待して実行する。

(・・；)
「変数num1の値は2,変数num2の値は1です。」って出てくる。

swap関数では、仮引数であるxとyが交換されただけであった。1や2といった、実際の数値は、変数num1,num2の中身であり、その中身にまではいじれなかったのである。数値が変数num1,num2の箱の中にある、というイメージを持てば理解できるのではないか。
今回この関数では、箱の外見ごと交換されただけなのである。

じゃあ、どうしたらいいか。
__swap関数の仮引数にポインタ変数を使おう!__

```
void swap(int *px, int *py){           /*swap関数の仮引数にポインタ変数を使用する*/
 int tmp;           /*一時保管場所としての変数tmpを設定*/
 tmp=*px;
 *px=*py;
 *py=tmp;
}
```
関数内では*を使って、ポインタ変数が指し示しているもの同士を交換しているので、swap関数の内容は先ほどと同じ。
何が違っているかというと、関数を呼び出す際に変数のアドレスが引数として渡されるということである。

```
swap(&num1,&num2);          /*変数num1とnum2のアドレスを渡して関数呼び出しをする*/
```
このように、__仮引数に、変数の値が格納されているアドレスを指すポインタ変数を指定することで、実引数を変更することができる。__
(豆知識)
ポインタ変数を引数に使用するからといって、__必ずしも実引数を変更する必要はない__
関数宣言の際に、仮引数の前に__const__をつけるだけで、関数内で実引数の変更ができなくなる。

```
void func(const int *px){              /*func関数の中身*/
}
```
##(余談)実引数と仮引数
関数の本体で定義されている引数(変数)が__仮引数__
関数を呼び出す際に渡す値が__実引数__

```
void buy(int x){           /*このときのxが仮引数*/
...}
```

```
int main(void){
    buy(20);              /*この20が実引数*/
}
```

以上です。次は配列とポインタについてまとめていこうかな
記法やコンテンツに関して何かアドバイスや意見がありましたら、教えてください:)
精進します:)

参考:やさしいC (出版社 Softbank Creative)
nest.jsのGraphQLで楽にキャッシュする

おそらくGraphQLにおいてキャッシュの仕組みを導入するなら**DataLoader**が最適解だとは思うのですが、nest.jsでDalaloaderを使用する方法が確立されていません。

※ 2020/01/20 追記
[@nestjs/graphql でdataloaderを使う](https://qiita.com/kyusyukeigo/items/b0c97c8e9ca6d84bf4f9)方法を書きました

参考issue:
https://github.com/nestjs/graphql/issues/20
https://github.com/nestjs/graphql/issues/2

DataLoaderの他に、nest.jsでは cache-managerを使用したCacheModuleも提供されています。ですがGraphQLで使用するサンプルはないし、私の環境でもエラーで動かなかったのでサポートしてなさそうです。
https://docs.nestjs.com/techniques/caching


という感じで、nest.jsにおけるキャッシュの仕組みはまだ確立されてなく、今後大きく変わりそうな気がしているのでDataLoaderやcache-managerを使用せず自前でキャッシュの仕組みを実装します。


## CacheMap

Custom Decoratorの機能を使って、contextにmapを保持するようにします。contextにデータを保持するので、データは1リクエストの間だけ保持されます。DataLoaderのようなものですね。
https://docs.nestjs.com/graphql/tooling#custom-decorators

```ts
export const CacheMap = createParamDecorator(
  (key: string = 'default', [root, args, ctx, info]) => {

    if (!ctx.cacheMap) {
      ctx.cacheMap = {} as { [key: string]: Map<string, any> };
    }

    if (!ctx.cacheMap[key]) {
      ctx.cacheMap[key] = new Map<string, any>();
    }
    return ctx.cacheMap[key];
  },
);
```

### 使い方

使い方はシンプルで簡単です。これでシンプルなキャッシュの仕組みができました。

```ts
@Resolver('Query')
export class QueryResolver {
  constructor(private readonly service: Service) {}

  @ResolveProperty()
  public async users(@CacheMap() cache: Map<string, User[]>): Promise<User[]> {

    const cacheKey = `users`;
    
    const users = cache.has(cacheKey)
      ? cache.get(cacheKey)!
      : await this.service.find();

    cache.set(cacheKey, users);

    return users;
  }
}
```

## 余談1

CacheModuleのようにInterceptorを使ったキャッシュもできますが、GraphQLだとrelay、filter、orderByなどのクエリで加工することが多いので戻り値をキャッシュするのは無駄になると判断しました。

```ts
@Resolver('Query')
export class QueryResolver {
  constructor(private readonly service: Service) {}

  @ResolveProperty()
  public async users(
    @ConnectionArgs() connectionArgs: ConnectionArguments,
    @CacheMap() cache: Map<string, User[]>): Promise<User[]> {

    const cacheKey = `users`;
    
    const users = cache.has(cacheKey)
      ? cache.get(cacheKey)!
      : await this.service.find();

    cache.set(cacheKey, users);
    // 実際はここで更に加工
    // https://www.npmjs.com/package/graphql-relay の connectionFromArray を使ったりしてる
    return connectionFromArray(users, connectionArgs);
  }
}
```

## 余談2

エイリアスを使った同じクエリに対してキャッシュは有効でないのでやっぱりDataLoaderほしい...

```graphql
query getUsers {
  admins: users(role: admin) {
    id
    firstName
    lastName
    phone
    username
  }
  accountants: users(role: accountant) {
    id
    firstName
    lastName
    phone
    username
  }
}
```
Magic Leap MagicScript Landscape Application. LineNode

Prepare
Magic Leap One
https://www.magicleap.com/magic-leap-one

mlsdk v.0.20.0
https://creator.magicleap.com/downloads/lumin-sdk/overview

magic-script-cli v2.0.1
https://www.npmjs.com/package/magic-script-cli

magic-script-polyfills v2.2.0
https://www.npmjs.com/package/magic-script-polyfills

**Create Project**

```sh
magic-script init my-line org.magicscript.line "Line"
cd my-line
```

**Code**

Change app.js

```jsx
import { LandscapeApp } from 'lumin';

export class App extends LandscapeApp {
  onAppStart () {
    let prism = this.requestNewPrism([1.0, 1.0, 1.0]);

    const line = prism.createLineNode();
    
    line.setColor([1.0, 1.0, 0.0, 1.0]);
    line.addPoints([0.0, 0.0, 0.0]);
    line.addPoints([-1.0, 0.5, 0.2]);
    
    line.addLineBreak();
    line.addPoints([1.0, 1.0, 0.0]);
    line.addPoints([0.0, -1.0, -0.3]);
    
    prism.getRootNode().addChild(line);
  }
}
```
**Build**

```sh
magic-script build -i
```

**Run**

```sh
magic-script run --port=10000
```

**Reference**
LineNode(Magic Script API Doc)
https://docs.magicscript.org/lumin.LineNode.html

Line Nodes (LineNode)(Guide C++) 
https://creator.magicleap.com/learn/guides/lrt-linenode

magicscript
https://www.magicscript.org/

Thanks!
Serverspecで正規表現が使えない場合のor条件テスト

# 概要
Ansible Playbookの動作確認にServerspecを利用しています。
設定量が多いためServerspecでサーバの状態を可視化しています。

Ansibleでディレクトリの作成を行うのですが、roleによって
ディレクトリの権限がuidである状態と、ユーザ名である状態に分かれてしまいます。


一つのServerspecのroleで上記の差分を吸収したいのですが、[Specinfraの仕様上、ファイル等の権限確認に正規表現が使えません。](https://github.com/mizzy/specinfra/blob/30332e895d57d6d8b79661305c327fc42b94c1c8/lib/specinfra/command/base/file.rb)

```specinfra/lib/specinfra/command/base/file.rb 

    def check_is_owned_by(file, owner)
      regexp = "^#{owner}$"
      if owner.is_a?(Numeric) || (owner =~ /\A\d+\z/ ? true : false)
        "stat -c %u #{escape(file)} | grep -- #{escape(regexp)}"
      else
        "stat -c %U #{escape(file)} | grep -- #{escape(regexp)}"
      end
    end
```

なので、無理やりSpecinfraを使うことで対応しました。 
ほかに方法あったらご教授お願いします。

# 対応策

- パラメータを初期化

```spec/spec_helper.rb
require 'net/ssh'
require 'serverspec'
require 'specinfra'

include Specinfra::Command

set :host, ENV['TARGET_HOST']

# :ssh | :exec
set :backend, :exec

# backendにsshを利用する場合
set :ssh_options, Net::SSH::Config.for(ENV['TARGET_HOST']).update({
    :user => 'user'
    :keys => '/home/user/.ssh/id_ecdsa'
})

# sudoユーザの場合
set :sudo_password, 'password' # 複合化処理等は省略
set :require_pty, true
```

- Specinfraでのコマンド実行結果で条件分岐を行う

```spec.rb
require 'spec_helper'

describe file('/tmp/testuser/') do
    username = 'testuser'
    uid = 9999

    # コマンドを取得
    cmd = Command::Base::File.check_is_owned_by('/tmp/testuser/', username)
    # 終了ステータスコードを取得
    rc = Specinfra::Runner.run_command(cmd).exit_status
    param = rc === 0 ? username : uid

    it { should be_owned_by param }
end
```

# 実践

- Rakefileを準備

```ruby:Rakefile
require 'rake'
require 'rspec/core/rake_task'

task :defeult => :spec

RSpec::Core::RakeTask.new(:spec) do |task|
    ENV['TARGET_HOST'] = 'example'
    task.pattern = 'spec.rb'
end
```

- 構成

```
./Rakefile
./spec/spec_helper.rb
./spec.rb
```

- ディレクトリを作成、ユーザ権限をuidで設定

```bash
mkdir /tmp/testuser && chown 9999 $_
```

- テスト実行

```bash
rake
```

- uidマッピング

```bash
useradd -u 9999 testuser
```

- テスト実行

```bash
rake
```

上記の2通りのテストが通るはずです。

# バージョン情報
- chefdk-0.6.2-1
- serverspec-2.18.0
- specinfra-2.35.1
Dockerで"A server is already running"でコンテナから抜けてしまうが、server.pidが見つからない場合

#環境
macOS High Sierra 10.13.6
Docker Version: 18.09.2
rails 5.2.1

#問題
docker-compose upでコンテナを立ち上げたところ、途中までうまくいくが、最後以下のようになりコンテナを抜けてしまう。
しかしtmp/pids/server.pidが見つからない。

```
=> Booting Puma
=> Rails 5.2.1 application starting in development
=> Run `rails server -h` for more startup options
A server is already running. Check /[rootディレクトリ]/tmp/pids/server.pid.
[rootディレクトリ]_1  | Exiting

```
#解決法
Ctrl-cのあとdocker-compose stopでコンテナを停止させた後、もう一度docker-compose upで立ち上げる。
立ち上げ〜コンテナから抜けてしまう間に、別ウィンドウで素早く以下コマンドを入力。

```
$ docker-compose exec [rootディレクトリ] /bin/bash
~@~:/[rootディレクトリ]# rm tmp/pids/server.pid
```
1行目でコンテナ内のbashに入り、2行目でファイルを削除。

#考察
自分の場合、ローカルにはtmp/pids/server.pidが見つからなかったが、コンテナ内には存在していた。
コンテナを停止している間はコンテナ内のbashに入れなかったのでこうしたアホなやり方になってしまった。
しかしこれで立ち上げることはできました。
Amazon Athena ( Presto 0.172 ) で日付の比較をして先月以降のデータを取得する

# やりたいこと
- Athenaを使うにあたり、SQLで日付の比較をしたい
- 「先月以降のデータが欲しい」みたいなことをしたい

# 説明

※ 文中 base_date  は date型

MySQLなどのノリで、日付をtimestamp型にして

```
 base_date >='2019-05-01' 
```
と言う感じにしても
>  '>=' cannot be applied to timestamp

と怒られます。

```
 base_date>= CAST('2019-05-01' AS TIMESTAMP)
```
とかにすれば出来ます。

また、同じPrestoでもTreasure Dataの場合は日付の独自関数がありますが、Amazon Athenaには勿論そういったものは無いので、Presto 0.172 に沿って何とかして行く必要があります。

https://docs.aws.amazon.com/ja_jp/athena/latest/ug/functions-operators-reference-section.html
https://prestodb.github.io/docs/0.172/functions/datetime.html

# 先月以降のデータを取得

## date型のカラムに対して、先月以降のデータを取得

```
select
base_date -- ★date型で持ってる
from tablename
where base_date  >= date_trunc('month', current_timestamp)- interval '1' month
order by base_date
limit 10;
```


## string型の日付(?)に対して、先月以降のデータを取得

```
select
base_date_string -- ★string型で持ってる
from tablename
where CAST(base_date_string AS TIMESTAMP) >=  date_trunc('month', CAST(current_timestamp AS TIMESTAMP)- interval '1' month)
order by base_date_string
limit 10;
```

## 色々試したクエリ
文字列の日付を月に変換したり、今月先月を取得したり、それを文字列に戻したり。

```
select
base_date_string ,-- ★string型で持ってる
date_trunc('month', CAST(base_date_string AS TIMESTAMP)) as trunc_month,
date_trunc('month', current_timestamp) as thismonth,
date_trunc('month', current_timestamp)- interval '1' month as lastmonth, 
substr( cast( date_trunc('month', CAST(current_timestamp AS TIMESTAMP)- interval '1' month ) as varchar) ,1,10) as "yyyy-mm-dd-string"
from tablename
order by base_date_string 
limit 10
```

↓結果↓

![qiita_20190522.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68734/fccd6819-cbbd-86a5-69e2-1673f2146c61.png)


## ハマった点（追記）
応用的に「昨日までのデータ」が欲しいようなクエリを書いていて、何回「動作検証は上手く行くが、朝のバッチ処理経由で実行すると上手くデータが取れない」という事が起きていた。

ふと

> select current_timezone() 


```
  	_col0
1	UTC
```


:innocent:


## 解決
ようは日中検証をすると判定されるが、朝だとまだUTCで日が変わっていないので必ず1日ズレると・・・。

タイムゾーンの指定が出来るようなので

**current_timestamp  AT TIME ZONE 'Asia/Tokyo'**
や
**now() AT TIME ZONE 'Asia/Tokyo'**
とすることで解決。
モデルに書いた定数を参照する

##environment.rb

`config/environments/`は環境単位の設定ファイルを格納するディレクトリ(Railsドキュメント参照)
で簡単にまとめると、よく使う定数を置いて置ける場所という認識


でも共通でこの定数は使わないよって場合はモデルに書いた方が見やすいのでモデルに定数を書く




##モデル
モデルに書くときも書き方は変わらないが、呼び出し方が違う





```expert_collection_achieved.rb

  COMPLETE_STATUS = {
    :not_achieved => 0,
    :achieved => 1
  }
```

書き方としてはこんな感じで

`environment.rb`に書いたものを呼び出すときは`COMPLETE_STATUS[:achieved]`で`1`が表示される

`モデル`に書いたものだと、`モデル名::COMPLETE_STATUS[:achieved]`で呼び出す

ex) `ExpertCollectionAchieved::COMPLETE_STATUS[:achieved]`
Flutter Webでクエリパラメータやパスパラメータを使う方法

## クエリパラメータやパスパラメータは[onGenerateRoute](https://api.flutter.dev/flutter/material/MaterialApp/onGenerateRoute.html)を使えば取得可能な模様

雑ですが、下記のような形で実装すればFlutter Webでもクエリパラメータは取得できます。
settingsにパスが入るので、それをクエリパラメータの部分と純粋なパス部分に分割して処理すればいけます。
RouteSettingsを使用すれば、URLもそれに応じて変わるようなので、URL共有して同じページが見れるようになります。
パスパラメータも同様の方法で可能だと思います。

```dart
return MaterialApp(
      onGenerateRoute: (settings) {
        var paths = settings.name.split('?');
        var path = paths[0];
        var queryParameters = Uri.splitQueryString(paths[1]);

        if (path == PassArgumentsScreen.routeName) {
          return MaterialPageRoute(
            settings: RouteSettings(name: settings.name), // これによりURLが変わる
            builder: (context) {
              return PassArgumentsScreen(
                title: queryParameters['title'],
                message: queryParameters['message'],
              );
            },
          );
        }
      },
      title: 'Navigation with Arguments',
      home: HomeScreen(),
);
```

Flutter WebでWeb固有のものはどうなっていくんだろう？🤔
テキストファイルをいい感じにwekaで使えるarffに変換したい

#はじめに
みなさんご存知、機械学習のソフトwekaはarffファイルというweka独自のファイルを使います。
なので、テキストファイルからarffに自動で変換するやつを作りました。
#arffファイルを作る
```python
import os

#実行中のディレクトリの場所
path = os.path.dirname(__file__)+'作りたいarffの名前.arff'

#実行中のディレクトリの場所にarffファイルを新規作成
with open(path, 'w') as f1:
    f1.write('@reration accepted\n\n@attribute 属性の名前1 属性の型\n@attribute 属性の名前2 {属性の要素1,属性の要素2}\n\n@data\n')

#テキストファイルを読み込んで
fp = open('読みたいテキストファイル', 'r')
#for文でテキストファイルを一行ずつ処理
for line in fp.readlines():
    #さっき作ったarffに追記
    with open(os.path.join(path,filename + '.arff'), 'a') as f1:
        f1.write('\''+line[:-1]+'\',accepted\n')
    line = fp.readlines()
fp.close()
swift バーション確認について

##バージョン調査(xcode)

xcode場合は、xcodeを開くと書いてあります

<img width="804" alt="スクリーンショット 2019-05-22 11.21.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167576/dd3ab5c5-5430-193a-d35e-1e5bd923688c.png">


#バージョン調査

ターミナルにswift -vと打ち込みます。

```ruby:
$ swift -v
```

たくさん出るが最後の方にswiftのバージョンが出ます

<img width="733" alt="スクリーンショット 2019-05-22 11.31.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/167576/92425c74-f79a-fd7b-bd15-71a57bd70fb2.png">


参考サイト
バージョン確認

https://pippi-pro.com/xcode-version-confirmation#Xcode-2
https://qiita.com/t_punch/items/21b745054356e7828c35
いつの間にかArduino公式から扱いやすいJSONライブラリがリリースされてた

Arduino で JSON を扱う時、サードパーティライブラリを使うケースが殆どだと思います。

しかし、オブジェクトインスタンスを作る`.createObject()`が必要だとか`char*`に変換する`.print()`とソレを格納する配列が必要だとか、何かと C++ のお作法がまとわりついて面倒臭さが否めませんでした。

ところが、いつの間にか扱いやすいライブラリがArduino公式からリリースされているではないですか。

# Arduino_JSON

- [Arduino_JSON - GitHub](https://github.com/arduino-libraries/Arduino_JSON)

そのまんまですね。

```c++
#include "Arduino_JSON.h"

const char* json = "{\"foo\": \"bar\"}";

JSONVal obj1;
JSONVal obj2 = JSON.parse(json);

obj1["abc"] = 123;

JSON.typeof(obj1);
// > object

if(obj2.hasOwnProperty("foo")){
    (const char*)obj2["foo"]
    // > "bar"
}

JSONVal keys = obj1.keys();

for(uint8_t i = 0; i < keys.length(); i++){
    JSONVal val = obj1[keys[i]];

    keys[i];
    val;
}

String result = JSON.stringify(obj2);
```

構文も JavaScript のソレにだいぶ近いです。
やったー！😊
pythonでcsvの列を別のcsvのリストから検索したい

#はじめに
「この列にある文字列を別のファイルの文字列のリストから検索してぇなぁ...」ってときに使うやつです。
#Pandasをインストール
いつもどおりインストールしましょう。
```pip install pandas
```
#csv読み込み
```python
import pandas as pd

df = pd.read_csv('読みたいcsv.csv')
df1 = pd.read_csv('読みたいcsv2.csv')
```
変数dfとdf1にcsv入ってるんでdf.関数でcsvいろいろいじれます。
#文字列検索
```python
for index, row in df.iterrows():
    #dfを1行ごと最後の行までfor文回します
    for index1, row1 in df1.iterrows():
        if row[0]==row1[0]:
            #dfとdf1の0列の値が同じだったら行う処理
        else:
            #同じじゃなければ。省略可
```
2重for文というかなりアナログな方法使いました。
もっと簡単な関数あるよーって方は教えろください。
ぼくは今回、「ある文字列が一致したらその隣の値を足す」ってのをやりたかったので、
もし、そういうのやりたかったらrow[1]に1列目の値入ってるので使ってください。
#出力
検索してなんやかんやした結果を出力したいときはwith open()なりprint()などを使ってください。
Windowsで特定の接続先のみVPN接続をする備忘録

###1.デフォルトでVPNを使う設定を外す
①コントロール パネル＞ネットワークとインターネット＞ネットワーク接続で、
　該当のVPNを右クリック⇒プロパティをクリック

②ネットワークタブでTCP/IPv4を選択⇒プロパティをクリック⇒詳細設定をクリック

③IP設定タブで「リモートネットワークでデフォルトゲートウェイを使う」のチェックを外す

###2.VPNの番号を確認
以下をcmdで実行してインターフェイス一覧からルーティングしたいVPN番号メモ

```cmd:
route print
```

###3.接続したいIPアドレスを設定
以下をcmdで実行してVPNを使用して接続したいIPアドレスを設定

```cmd:
route -p add 接続先IPアドレス mask 255.255.255.255 VPNサーバIPアドレス metric 1 if メモしたVPNの番号
```
Vue.jsでインスタンス外からの変更を管理下に入れる

Vue.js外から取得した値を管理下に入れる方法です
例えば単純にjQueryなどで値を取得した際も使えますし
ECCUBEでcontrollerから受け取った値なんかも(jQueryを介して)管理下に入れることできます



```index.html
<div id="app" class="baz">
  <p>{{ foo }}</p>
  <p>{{ bar }}</p>
</div>
```

```app.js
var app = new Vue({
  el: '#app',
  data: {
    foo: 'ふー',
    bar: ''
  },
  mounted: function () {
    this.bar =  $('#app').attr('class');
  },
})
```
dataに登録して初期値を空にしておきます。
実際のサンプルは[こちら](https://codepen.io/tttela/pen/VOrqaW)

## 他の言語やサービスに依存しないといけない場合こそ使える

上記コードだと`:class`使えば管理下に入るじゃねーかという話なんですが、それが使えない場面ってCMSやEC系のサービスだと結構あるんですよね
僕の場合はECCUBEで役に立ちました。

```detail.twig
.
.
<!--▼商品タグ-->
<div id="product_tag_box" class="product_tag">
    {% for ProductTag in Product.ProductTag %}
        <span id="product_tag_box__product_tag--{{ ProductTag.Tag.id }}" class="product_tag_list">{{ ProductTag.Tag }}</span>
    {% endfor %}
</div>
<hr>
<!--▲商品タグ-->
.
.
```
実際に利用した場面ではないですが。。。
例えば商品についているタグのidをとってくるコード`{{ ProductTag.Tag.id }}`を含んだidを管理下に入れたいなってときに上記方法が利用できます。

やってることはシンプルなので知ってて当然なことかもしれませんが、jQueryを切り離せない、でもVue.jsも使っていきたいという人にとっては使えるかなと思います

ただ試行錯誤の末にたどり着いた力技だったので正攻法ではない気がしますw
欠点はdataが膨らんでくるので量が多いとなかなか悲惨です

こうやればもっとスマートだよっていうのがあればぜひ教えてください！
今日Excelを使っていてAppleから出た警告を記録

macOS10.13.6で、Microsoft Excel for Mac 2011 ver. 14.7.3(170325)
Excelの「ファイル形式に関するヘルプ」を見ようと思って、ファイル保存の前にURLをクリックした。

<img width="600" alt="excelhelp.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/2e74dfc2-49db-6258-f4c3-082950b505e4.png">

microsoftの警告ではなく、Appleから警告が来た。

<img width="549" alt="macヘルプ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51423/03b75de3-5e45-945d-1430-16d984cb2ea9.png">



###1. サーバが接続可能ではない

###2. 停電が発生している
>あなたの学校、会社、またはインターネット・サービス・プロバイダ(ISP)で停電が発生している。


###3. コンテンツが存在しない


２は、１の原因の一つかもしれない。
まして、停電だけでなく、ケーブルが抜けていたり、誰かが電源を切ったり、停電だけじゃないだろというのがこの記事。

他になにがあるだろうか。

###4. PCがインタネットに接続していない。

サーバは接続可能だが、自分が繋ごうとしていない。
ある意味、サーバが接続可能ではない。
１に含めることができるかもしれない。

###5. URLが間違っている。
最初から間違っているか、後から別のとこになったか。
ある意味、コンテンツが存在しないの一種。
別の場所にはコンテンツが存在している場合には、誰がそこへ飛ばすようにする責任があるかが明確になっているとよい。


再分類すると、

###1. サーバが接続可能ではない
####1.1 停電が発生している
####1.2 PCがインタネットに接続していない。
###2. コンテンツが存在しない
####2.1 URLが間違っている

他になにかありますでしょうか。

>もう一度試してみてもまだヘルプコンテンツを表示できない場合は、

試したら出てしまった。残園ながら、wiresharkは起動しておらず、パケットは解析できていません。ごめんなさい。

Excelへの５つの誤解
https://qiita.com/kaizen_nagoya/items/bc9cf557199594c8e1b3

の記事を書こうとして操作していた時のことでした。 

#文書履歴(document history)
ver. 0.01 初稿 20190522 朝
ver. 0.02 版記載　20190522昼
自己紹介

初めまして！
今回は初めてなので自己紹介をしようと思います。
　

▼プロフィール
・2019年から都内で働く未経験エンジニア（インフラ系の予定）
・趣味で雑記ブログをしているので、アウトプットは好き（得意ではない、、、）
・将来的には地元の広島県で何かやってみたい
・山登り、じゃがりこ、千葉ロッテが好き
　
　
▼プログラミングを始めた理由
・人のやりたいことを叶えるため
→やりたいこと（夢）があるのに、それを達成できない理由は”環境面”が大きいと感じた。ITがあれば誰でもどこでも使うことができるので、そのようなやりたいことがやれる環境を作れる（夢を応援できる）と思ったから。
・自分のやりたいことができたときに、そのことをやれる可能性を高めるため
　

　
▼今後の目標
・2019年度中に資格を取りたい
→業務で利用するLinuxもしくは情報技術者？
→早めに目標を立てて計画的に
・ホームページを作りたい
　

▼現状
・Javaの研修中（ほとんど理解できていない）
・Macにキングソフトの入れ方が分からなくrて困ってます、、、
　
　
　
読んでいただきありがとうございました。
Macをスリープ解除で共有フォルダを自動マウント

朝会社に来たらまずはメールの確認ですが、その次にはプロジェクトフォルダを弄りたいんです。
が！！！
プロジェクトフォルダが共有フォルダにある場合はマウントしないと弄れないんです。

#### mountコマンドを起動時に走らせればいい

一時はこれで解決したかと思ったのですが、スリープ解除後にアンマウントされていることがよくあるんですよね。
今回はこれを解決したいです。

# 使うプログラム
- Launchd
- SleepWatcher
- AppleScript

**SleepWatcherでスリープ解除を検知し、マウントスクリプトを走らせる**
簡単なお仕事です。

# まずはSleepWatcherをインストール
とその前に、SleepWatcherとはなんぞやということですが、
**「Macのスリープ/スリープ解除イベントを検知してプログラムを呼び出す」**
というものです。

ここからしばらく以下のサイトをほぼ丸パクリしています。
https://blog.ishkawa.org/2018/11/09/1541697110/

インストールは簡単にbrew

```sh

brew install sleepwatcher
```

# SleepWatcherを常駐させる
LaunchAgentに登録することで常に実行できるようです。
ということで下記コマンドを実行してファイルとディレクトリを用意します。

```sh
mkdir -p ~/Library/LaunchAgents
cp /usr/local/opt/sleepwatcher/de.bernhard-baehr.sleepwatcher-20compatibility-localuser.plist ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher.plist
```

設定ファイルを見てみましょう。

```sh
cat ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher.plist
```
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Label</key>
	<string>de.bernhard-baehr.sleepwatcher</string>
	<key>ProgramArguments</key>
	<array>
		<string>/usr/local/sbin/sleepwatcher</string>
		<string>-V</string>
		<string>-s ~/.sleep</string>
		<string>-w ~/.wakeup</string>
	</array>
	<key>RunAtLoad</key>
	<true/>
	<key>KeepAlive</key>
	<true/>
</dict>
</plist>
```

一言で言うと、スリープするときに「~/.sleep」が、スリープ解除するときに「~/.wakeup」が実行されます。
なので上記2つのファイルを作って実行権を与えておきましょう。

```sh
touch ~/.sleep ~/.wakeup
chmod +x ~/.sleep ~/.wakeup
```

これでファイル構成の準備は整いました。

ここまで以下のサイトをほぼ丸パクリしています。
https://blog.ishkawa.org/2018/11/09/1541697110/

あとはLaunchAgentが読み込めるように登録します。

```shell
launchctl load ~/Library/LaunchAgents/de.bernhard-baehr.sleepwatcher.plist
```

# マウント用のスクリプトを書く
ここまででスリープ/スリープ解除時に自動的にスクリプトを実行する環境が整いました。
続いてはスリープ解除時にマウントするスクリプトを書きます。
シェルスクリプトが極めて苦手なので、AppleScriptを使っています。

```sh
vim ~/automount.scpt
```
```applescript
on run argv
	if (count of argv) > 0 then
		delay (item 1 of argv) as integer
	end if
	try
		mount volume "smb://マウントしたいパス1"
		delay 1
		mount volume "smb://マウントしたいパス2"
		delay 1
	end try
end run
```

このスクリプトはコマンドライン引数で数値を与えると、その秒数後にマウント処理を実行します。後ほど使い道を解説します。
マウントしたいパスは必要に応じて増減できます。
マウントの間のdelayはいわゆるsleep命令なのですが、念の為入れているのだけなので不要かもしれないです。

最後にこいつを.wakeupから呼び出せるようにします。

```sh
vim ~/.wakeup
```
```sh
osascript ~/automount.scpt 120
```

これでスリープ解除して120秒後にマウント処理を開始します。
やりましたね！

なぜ120秒後かと言うと、スリープ解除直後ってWi-Fiを掴んでいないことが多いんですね。
なので掴むまでの時間としてを120秒待つようにしています。
環境に応じて変更してください。

# おまけ
```sh
osascript ~/automount.scpt
```

このようにコマンドライン引数をつけずに実行すると即座にマウントを開始します。
たまにスリープ解除後にWi-fiを掴めなかったり、なぜかアンマウントされてしまったときにすぐ実行できると便利です。
でもいちいちこのコマンド打つのは面倒なので、私はパスの通ったディレクトリにこんなスクリプトファイルを置いています。

```sh
vim ~/bin/allmaunt # ~/bin/はパスが通っている前提です
```
```sh
#!/bin/sh
osascript ~/automount.scpt
```

これでパスを覚えることなく、以下コマンドですぐにマウントできるようになります。

```sh
allmount
```

ならスリープ解除後に自動マウントいらなくね？
と思うかもしれませんが、何事も自動化できることは自動化したほうがいいのです。
Slack のプライベートチャンネルをパブリックチャンネルに転換していく

# 背景

複雑な歴史的経緯から、プライベートチャンネルで作ってしまったが、組織内の情報流通の観点から、パブリックチャンネルにしていきたい。が、Slackはプライベートをパブリックにすることができない。

また、様々な通知をチャンネル名でハードコードしていることも大変に多く、パブリックにするにしても、同名のまま転換していきたい。

# 制約

プライベートでのログを、パブリックに引き継ぐことはできません。

# プライベートチャンネルがあります

とりあえず無いので作ります。「hogehoge」です。

<img width="675" alt="スクリーンショット 2019-05-22 9.52.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22947/b7003035-eb33-fc44-0024-864fe8bc4ff7.png">

# プライベートチャンネルをリネームします

あとで過去ログ参照のため、無茶なリネームは避けたほうがよいです。今回は末尾に「-priv」を付けるリネームとしました。

チャンネルの歯車、その他のオプション。

<img width="659" alt="スクリーンショット 2019-05-22 9.53.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22947/b91c9ae6-08b7-6d64-b06e-a1e193e9bb4c.png">
↓
<img width="623" alt="スクリーンショット 2019-05-22 9.53.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22947/566576db-a54d-03b4-10e3-4a84042c20d9.png">
↓
<img width="645" alt="スクリーンショット 2019-05-22 9.54.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22947/15238bad-0109-651f-b64a-1e1173bff03a.png">

# 元々と同名のパブリックちゃんねるを作ります

元々の名前「hogehoge」としてパブリックチャンネルを作ります。作ったら、通知が機能するかテストしてください。なんか上手くいかないかも。

<img width="669" alt="スクリーンショット 2019-05-22 9.54.34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/22947/eabcef2b-b18d-ab5d-459b-2c347e25c302.png">

# 通知の移植

* チャンネル「名」で通知先を設定していれば、たぶん何も変更しなくて大丈夫です。
* チャンネル「ID」で設定していると、新たに作成したパブリックチャンネルのIDに変更が必要です。
* プライベート、パブリックで異なる記述が必要であれば、移植が必要です。
* Slackbot、Slackにデフォで付いてるSlackbotで設定しているものがあれば、移植が必要です。

# 人々をinviteします

シングル/マルチチャンネルゲストは、フルメンバーがinviteしなければ入れません。忘れずinviteしましょう。
医療システムをHAZOPで分析する。安全（１９）

医療分野での安全分析でHAZOPの利用が増えてきている。

新たなリスク分析手法(Hazard and Operability Analysis:HAZOP)を活用した転倒・転落原因構造関連図の作成, 小松佳子. 角田由美子. 大川 淳,日本医療マネジメント学会雑誌,日本医療マネジメント学会, 10(4) 2010.3,ページ	593～599,ISSN	1881-2503

HAZOP 誤嚥・嚥下障害のリスクマネジメント,山脇正永, 大川淳, 清水充子, 戸原玄, 千葉由美, 野村 徹, 医歯薬出版株式会社, 2009, ISBN 978-4263731215

手術合併症に対する危険源分析 Hazard and Operability Study (HAZOP Study)の経験:人工股関節置換術における神経合併症を対象として, 大川 淳. 野村 徹. 高橋 誠.,医療の質・安全学会誌, 医療の質・安全学会, 7(3):2012,ページ235-238, ISSN 1881-3658

医療HAZOPを用いた脊椎脊髄外科領域の初期研修者に対する医療安全教育,大川淳,臨床整形外科 2006年4月号

誤嚥・嚥下、手術、外科教育など分野がかぎられており、医療全般に広がっていない。
HAZOPが医療全般に適用可能であることを示す。具体的には、医療システムの人による運用、計算機による運用をはじめ、医療全分野での適用例を示し、効率的で安全な医療システムの構築に勤めたい。

# 想定外
想定外を洗い出す手法であり、誘導語による自由発想(guided brainstorming)法である。
自由発想法は、司会者による強引な誘導が問題となるが、あらかじめ標準で指定している方向性を必ず洗い出すことにより、利益誘導や、結論誘導などの危険性を防ぐことができる。

## 空間・時間

## 上限・下限

## 質・量

# 医療系分類

## 検査機器

## 治療機器

## 入院機器
電動ベッド
電動車椅子

## 病院管理系
### 電子カルテ
医療票(Karten): 難病患者（工学博士）による医療学生・医療従事者へ第3講 医療情報交換系 
https://qiita.com/kaizen_nagoya/items/9c91fc6e7bfcbb58c768

医療カルテ設計方針 
https://qiita.com/kaizen_nagoya/items/5d8406095375199bbf75

# Reference
Ethernet 記事一覧　Ethernet(0)
https://qiita.com/kaizen_nagoya/items/88d35e99f74aefc98794

Wireshark 一覧 wireshark(0)、Ethernet(48) 
https://qiita.com/kaizen_nagoya/items/fbed841f61875c4731d0

線網（Wi-Fi）空中線(antenna)(0) 記事一覧(118/300目標)
https://qiita.com/kaizen_nagoya/items/5e5464ac2b24bd4cd001

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

小川清最終講義、小川清最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.
### 文書履歴(document history)
ver. 0.01 初稿 　 20190522
ver. 0.02 ありがとう追記 20230604
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
データベースの主キー連番について

データベースの作成についての質問です。

データベースの作成して、テーブルを作るときに
列の型をINT８かつ主キーかつ自動連番にしたいのですが、

CREATE TABLE dog(
dog_id SERIAL PRIMARY KEY
dog_name TEXT
);

上記のように作ると型がintegerになってしまい、
dog_id INT8 SERIAL PRIMARY KEY
にするとエラーになってしまうのですが、
どのように表記すればいいですか？

宜しくお願い致します。
ソケット通信の実装

# ソケット作成
まず、通信プロセスのためのソケットを作成します。このとき使うのはsocketシステムコールです。

```C
#include <sys/types.h>
#include <sys/socket.h>

int socket(int domain, int type, int protocol);
```

戻り値はソケットディスクリプタです。domainは通信範囲を表し、sys/socket.hで定義されている値を使用します。

ソケットタイプtypeは接続の種類を表します。これもsys/socket.hで定義されており、protocolは使用するプロトコルを指定します。

# ソケット命名
作成したソケットに対して名前を付けます。この名前がクライアントが接続要求の際に指定する名前となります。このとき使われるのがbindシステムコールです。

```c
#include <sys/types.h>
#include <sys/socket.h>

int bind(int sockfd, const struct sockaddr *name, int namelen);
```

sockfdには、socket()の戻り値、すなわちソケットディスクリプタを代入します。

nameはsys/socket.hで定義されているsockaddr構造体へのポインタです。この部分はソケット作成時にどのドメインを選択したかで内容が異なります。

namelenは第2引数の長さであり、sizeofでもいい。

# 接続準備
### サーバ側
サーバは接続のための準備を行います。このとき使うのがlistenシステムコールです。

```c
#include <sys/socket.h>

int listen(int sockfd, int backlog);
```

sockfdにはソケットディスクリプタを代入します。

backlogには接続要求をいくつ受け付けるかを指定できます。最大値は通常５。

### クライアント側
クライアントがサーバに接続要求を出し、サーバは接続を受け入れます。

```c
#include <sys/types.h>
#include <sys/socket.h>

int connect(int sockfd, const struct sockaddr *name, int namelen);
```

# 接続受入（サーバ側）

```c
#include <sys/types.h>
#include <sys/socket.h>

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
```

戻り値は、クライアントと接続された新しいソケットディスクリプタです。以後、通信には新しいソケットディスクリプタを使用し、socketコール時の古いディスクリプタは破棄します。

# 通信
接続完了後は通信を行います。ストリーム型の場合、受信にreadあるいはrecv、送信にはwriteあるいはsendシステムコールを使います。

```c
#include <sys/types.h>
#include <sys/socket.h>

int read(int sockfd, char *buf, int nbytes);
int recv(int sockfd, char *buf, int nbytes, int flags);
int write(int sockfd, char *buf, int nbytes);
int send(int sockfd, char *buf, int nbytes, int flags);
```

# ソケットの破棄
使用しなくなったソケットを閉じるためにはcloseシステムコールを用います。
「mistake」タグについて

### 対象

https://qiita.com/tags/mistake

### 説明

「あちゃー、失敗」
小さくない失敗。
繰返したくない失敗。

それらを検索しやすくするためのタグ。

「このミスは二度と繰り返さないぞ」という意識のもと、付加する。

This will never happen again!

失敗から学び続けることで、より良きものを作り出す。
Qiitaからデータ移行したりURLだけある記事よりは、内容があって、最新版はこちらの方が嬉しい件

個人的な感想です。Qiitaの利用方法はいろいろです。
こう書くと読まない読者がいるという参考とし記録させてください。

#URL１行だけまたは表題にURLを埋め込んでいるのが１行の記事

Qiitaの記事で、URLを１つだけ示していたり表題にURLを埋め込んでいる資料を時々お見受けします。

例えば、「データ移行しました」とか。

「いい」のかどうかの判断がつかないため、読み飛ばします。

表題にURLをタグに埋め込んでいる場合は、どこへ飛ぶかわからないのでクリックしないようにしています。

そのURLは、別の検索でひっかかって読むことがあるかもしれません。
その時はQiitaの中身を確認しているからです。

他のサイトを探すのは、Qiitaの中身を読む時以外に、そのURLをアクセスしてもいいかどうかの判断をしながら読みます。



#URLと表題の２行の記事

どこへ飛ぶかはわかりますが、なんでそこに飛ばせたいかの説明がない場合は、飛びません。

こちらにデータ移行しましたってあると、
なんで古い版は残しておいて、
最新はこちら
としないのだろうと疑問を感じます。

そこで、飛ぶのをやめます。

古い記事があり、読んで興味がわけば、最新はこちらというので飛ぶかもしれません。

２つを保守するのは大変だから、という気持ちはわかります。
だから、古い方を記録として残しておいて、
最新はこちら
にすると読む気になるかもと感じます。
Proxy下のWindows10でOpenSSHする

## 経緯
Visual Studio Code Preview版に、Remoteの拡張機能が2019/5/2にリリースされた。

インテリセンスやシンタックスハイライトなど使えて便利そう。
AWSサーバにSSHしてみよう...
あれつながらない。

## 要約
* ~/.ssh/configのProxyCommandはフルパスで書く
* キーファイルの配置場所は~/以下にする

## 設定
以下の設定を追加。

```~/.ssh/config
Host AWSServer
  User ec2-user
  HostName {hostName}
  Port {PortNumber}
  IdentityFile "C:\work\ssh-key\{keyFileName.pem}"
  ProxyCommand connect.exe -H {proxyServer}:{port} %h %p
```

VSCodeより接続すると、以下のエラーが発生。

```
> posix_spawn:No such file or directory
```

ProxyCommandはフルパス使って書きましょう。
[StackOverflow](https://serverfault.com/questions/956613/windows-10-ssh-proxycommand-posix-spawn-no-such-file-or-directory)

```~/.ssh/config
  ProxyCommand C:\Program Files\Git\mingw64\bin\connect.exe -H {proxyServer}:{port} %h %p
```

上記エラーは解消するも、以下のエラーが発生。

```
> @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
> @         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
> @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
> Permissions for 'C:\\work\\ssh-key\\{keyFileName.pem}' are too open.
> ...
```

linuxやmacでは、"chmod 600 {keyFileName.pem}"でパーミッション変えればいけるのだが、
Windowsでは配置先をユーザーフォルダ以下に置かなければならない。

なので、keyファイルの場所とconfigを変更。

```~/.ssh/config
  IdentityFile "C:\Users\{userName}\ssh-key\{keyFileName.pem}"
```

ぶじつながった。
「.NETFramework」タグについて (タグシノニム:「.NET」「DotNetFramework」 | バージョン違い「.netframework3.5」「.netframework4.6」「.netframework4.6.1」「.netframework4.6.2」)

### 対象

https://qiita.com/tags/.NETFramework

### 説明

- [タグまとめ > .NET Framework関連 (2017/05/11)](https://qiita.com/7of9/items/61c86831484382b7a5ce)

https://ja.wikipedia.org/wiki/.NET_Framework
> Microsoft .NET Framework（マイクロソフト ドットネット フレームワーク）は、マイクロソフトが開発したアプリケーション開発・実行環境である。 

### タグシノニム

https://qiita.com/tags/.NET
https://qiita.com/tags/DotNetFramework

https://ja.wikipedia.org/wiki/.NET_Framework
> 一般に.NETという場合、.NET全体の環境を指す。 

所感
.NETは厳密に.NETFrameworkと同じ意味で使われていない場合もある、と思われる一方、同じ意味として使う人もいる。


### バージョン違い

2019-05-22時点:
https://qiita.com/tags/.netframework3.5
https://qiita.com/tags/.netframework4.6
https://qiita.com/tags/.netframework4.6.1
https://qiita.com/tags/.netframework4.6.2
Azure DevOpsのリポジトリをSSHでCloneする

業務でSSHを使ってAzureのDevOpsのリポジトリに接続する機会があったので方法をまとめます。
GitクライアントはSourceTree、TortoiseGitで確認済みです。

## 1. SSHキーを作成する

1. 以下のコマンドを実行する

```
ssh-keygen -C "{リポジトリに登録しているメールアドレス}"
```

1. パスフレーズが求められるが、今回は設定しない

```
C:\Users\user>ssh-keygen -C "{リポジトリに登録しているメールアドレス}"
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\user/.ssh/id_rsa):
Created directory 'C:\Users\user/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in C:\Users\user/.ssh/id_rsa.
Your public key has been saved in C:\Users\user/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:QyvGK*****Y7C5n*****sZ5c7*****a6p2B*****Dqk {リポジトリに登録しているメールアドレス}
The key's randomart image is:
+---[RSA 2048]----+
|   ***           |
|    ***          |
|*****+ o.        |
|....+***o.       |
|.E+..B+=S        |
|o***+.B. .       |
|**** = .         |
|B*= +*****       |
|=O=. o ***       |
+----[SHA256]-----+
```

これで、`C:Users/{ユーザー名}/.ssh`に公開キーと秘密キーが生成される

## 2. DevOpsのリポジトリに生成したSSHキーを登録する

1. 下記画像の通り、セキュリティページにアクセス

![Azure DevOpsサービスでのユーザプロファイルへのアクセス](https://docs.microsoft.com/en-us/azure/devops/repos/git/_img/use-ssh-authentication/ssh_profile_access.png?view=vsts)

1. `SSH public keys`を選択し、`Add`を選択する

![Accessing Security Configuration in Azure DevOps Services](https://docs.microsoft.com/en-us/azure/devops/repos/git/_img/use-ssh-authentication/ssh_accessing_security_key.png?view=vsts)

1. 生成した公開キー(`id_rsa.pub`)の中身のテキストを貼り付ける。

   ![Configuring Public Key in Azure DevOps Services](https://docs.microsoft.com/en-us/azure/devops/repos/git/_img/use-ssh-authentication/ssh_key_input.png?view=vsts)

   この時、空白行が入らないようにすること

   `Discription`には、任意のわかりやすい名前を付ける(例：会社のPC)

1. `Save`を押し、保存する。

## 3. Cloneする

Clone画面で`SSH`タブを選択し、SSH用のURLをコピーし、SourceTreeやGitコマンドでcloneする

![Azure Repos SSH Clone URL](https://docs.microsoft.com/en-us/azure/devops/repos/git/_img/use-ssh-authentication/ssh_clone_url.png?view=vsts)

### Pageantに秘密鍵を登録しておく

Cloneする前に、SSHの認証エージェントであるPagent(Putty等に同梱されている)に[1](#1. SSHキーを作成する)で生成した秘密鍵(id_rsa)ファイルを読み込む。読み込む際、ppk形式に変換する。
![Pageant Key List 2019-05-22 09.12.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/256853/2b33a9d8-1dad-e32d-a852-87e185854798.png)

変換方法は以下を参照

> [SSH秘密鍵をPutty形式に変換する方法](https://mseeeen.msen.jp/convert-ssh-secret-key-from-rsa-to-putty/)


## 参照・引用

> <https://docs.microsoft.com/en-us/azure/devops/repos/git/use-ssh-keys-to-authenticate?view=vsts>
PlayCanvasで作ったプロジェクトをWeb上で独自ドメインを振り公開する方法

　この記事ではPlayCanvas v1.18時の環境をして擁しております。
PlayCanvasのチュートリアルにプロジェクトをセルフホスティングする方法が書かれていなかったので書かせていただきました。

[チュートリアル　-2Dアクションゲーム- 8/8](https://support.playcanvas.jp/hc/ja/articles/360001806608-%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB-2D%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%B2%E3%83%BC%E3%83%A0-8-8)

## プロジェクトをエクスポート
1. 左側のタブからをPublish/Downloadの選択
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257048/9474bc4d-a94d-10af-e657-e0e1afda4822.png)

1. DOWNLOAD.zipをクリック
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257048/6c9a20fd-08fd-2de3-29c6-24a09eff2db3.png)




## 独自ドメインを振ったウェブページを公開する 

PlayCanvasからDONWLOAD.zipを押して、出来上がったzipファイルについてはindex.htmlの存在するフォルダが作成されます。
今回はFirebase Hostingを使用してデプロイを使用と思います。Firebase Hostingの使い方はこちらを閲覧していただくのが確実です。

[Firebase Hosting を使ってみる](https://firebase.google.com/docs/hosting/quickstart?hl=ja)


![in.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257048/f4491f75-f081-d57b-4ce7-f6a0de859a32.png)


## Firebase へデプロイをする

 1.Firebaseの公式サイトを参考にしてデプロイをする。

```bash
npm install -g firebase-tools
```
 2.Firebaseへログインをする

```bash
firebase login
```

 3.Firebaseの初期化をします

ここで公開するフォルダなどを指定します、デフォルトではカレントディレクトリにあるPublicというフォルダがデプロイ対象になります。今回はエクスポートをしたPlayCanvasのプロジェクト名にしておくと楽かもしれません。

```bash
firebase init
```

 4.Firebaseのdeployをする.


```bash
firebase deploy
```

## Firebase Hostingでドメインの設定をします。
![hagaTest.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257048/c1fb174f-2846-fb63-1961-8e872ba16565.png)


上記の設定を行うと独自ドメインを振ることでアクセスできるようになります。
https表示が出来なくなっても、httpで表示する方法

前提として、URLは http: でアクセスしてもらう。
(https:でアクセスした時、フェイルオーバーでhttp:にアクセスするように指定しておくのも良い。)

* `https://〜/func.js` を読むように記述。
* `http:`でアクセスしている場合、`https:`にリダイレクトする処理を`func.js`に書く。ここで`https:`にアクセスするときに警告が出る場合は、`https://〜/func.js`を読めないため`http:`にとどまる。
「$_」タグについて

### 対象

[$_](https://qiita.com/tags/$_)

### 説明

Bash の特殊パラメーター `$_`

記事「[mkdir と同時に cd でディレクトリ移動させるには（空白入りディレクトリ名の場合）](https://qiita.com/KEINOS/items/1da5ca6443bd7f254119)」にて最初のタグが付けられました。
上記リンク先に詳しい説明書きがされています。

Googleなどの検索で難しい「`$_`」(そもそも、検索キーワード「`$_`」を思いつかない。すぐに忘れる）。

その使い方についての記事が見つかりやすいように付けられた「`$_`」タグです。
「AnyPointSystem」タグについて

### 対象

[AnyPointSystem](https://qiita.com/tags/anypointsystem)

### 説明

Qiitadonをデータベースとしたポイント加算システム。

1. QiitadonでToot
2. Tootを集約してチャートや図として表示

目的: 良き習慣を加速するシステム (「あ、勉強しよ」）

さらに詳しくは以下を参照。

- [AnyPointSystem (powered by Qiitadon) > 2019-04-27 システム設計](https://qiita.com/7of9/items/45aba268f6358541080c#_reference-cad0c49f68f6e26ad5c3)

2019年5月現在の成果物:

- [Bullet Journal (Habitat Tracker) ](https://qiita.com/7of9/items/0d415946c05a0ac2e985#_reference-7623253d8d336dccb14b)
- [Radar Chart](https://qiita.com/7of9/items/02fa01cd5300512b2438#_reference-02002cad4a455a8b6d07)
Go+Postgres環境をDockerComposeで作ってみる

[前回](https://qiita.com/teracy55/items/14d92d1cef3d85df48f0)、Goの環境を作りました。
Webサーバーらしく、DBアクセスとかをする前に、DockerComposeで環境を整えようかと思います。

# 環境
- ホストOS：Windows + VirtualBOX + Vagrant
- ゲストOS：CentOS7＋Docker

## ディレクトリ構成
ゲストOSのディレクトリ構成は以下の通り

- ~/docker/
    - docker-compose.yml
    - Dockerfile      
    - main.go　→　前回作成したもの

## 各種ファイル

```docker-compose.yml
version: '2'
services:
  go-web:
    build: .
    ports:
      - "8080:8080"
    links:
      - go-db
    working_dir: /develop/go
    environment:
      - "DB_NAME=postgres"
      - "DB_USER=postgres"
      - "DB_PASSWORD=postgres"
    volumes:
      - "./:/develop/go:z"

  go-db:
    image: postgres:latest
    ports:
      - "5432:5432"
    environment:
      - "POSTGRES_USER=postgres"
      - "POSTGRES_PASSWORD=postgres"
    volumes:
      - "/data/db:/var/lib/postgresql/data:z"
```

```Dockerfile
FROM golang:latest

RUN go get github.com/gin-gonic/gin

EXPOSE 8080

CMD ["go", "run", "main.go"]
```

# 立ち上げてみる

- 前回作成したmain.goを上記の2ファイルと同じ場所に格納
- `docker-compose up`を実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325108/7afbc525-0546-161d-31db-31e72e08cd01.png)
→立ち上がったので、ブラウザでアクセス

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325108/27176c58-9b3d-8018-fb7a-cb050fc83458.png)
→アクセスできました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325108/7641ed83-154f-ff28-82ad-f5107502557c.png)
→サーバー側のログも出ています


# 最後に
今回、Postgresコンテナを立ち上げてはいるが、使っていないため今後はWebサーバーらしくDBアクセス等のコードも書いてみようと思う。
構成の考え方

はいさい！
では、今回は自作PCの用途別、価格別の構成の考え方をお教えします

では用途としてオフィス、動画閲覧用途として構成を考えるならば　予算を5万とすると、
CPUがまず、オフィス用途ということで、IntelでいうとPentium、AMDでいうとAthlonという選択肢があります
今回はすべての構成でIntelで考えていきます。今回はケースファンは加味しません
では実際にAmazon価格で出してみましょう

# オフィス用途 
CPU　Pentium Gold G5400  　9200円
MB   ASUS H310M PRIME  　7041円
RAM  PATRIOT DDR4 4GBx2 Viper Elite  　4699円（記事投稿時）
SSD  Crucial 500GB  　6970円（記事投稿時）
PSU  Antec 550W Bronze 　4970円
Case Thermaltake H18  　3027円
CPUクーラー サイズ「白虎」  　3156円
OS   Windows10 home  　14956円（パッケージ版）

***計　54019円***

少し誤差が出てしまいましたが、最近はSSDが積んでないと「人権がない」って感じですよねｗ
これに低グレードのグラフィックボードを追加すれば軽いゲームならできる感じになります
まぁオフィス用途ですけどねｗ

# ゲーミンググレード（コスパ） 
では次にコスパ重視のゲーミンググレードです。予算は10万円前後という設定で行きます
ゲーミングといいますと、ゲーム用途になります。
ゲーム用PCには性能の高いCPUと追加でグラフィックボードというものが必要です
CPUはi5 i7がおすすめです！

CPU i5 9400F 　19958円
MB  ASROCK H370 Pro4　　11127円
RAM CORSAIR DDR4 Vengence 2666 8GBx2 　9878円
GPU 玄人志向 GTX1660 　27356円
SSD Crucial M.2SSD 500GB PcIEx4 　8404円
HDD WD 2TB 　6890円
PSU オウルテックFSP Raiderシリーズ 750W Silver  　7150円
Case Thermaltake H26  　4163円
CPUクーラー  サイズ虎徹MarkⅡ　　3130円
OS Windows10 home 　14956円

***計　113012円***

今激アツのi5 9400F入れてみました！こいつは内蔵グラフィック非搭載でグラフィックボードがないと画面出力ができないのですが、この値段で6コア！これでまぁまぁゲームはできると思います！画質設定は低めですがね

# ミドルハイ
では最後に行く前に、ミドルハイな構成を考えていきましょう
CPU i7 8700k  　50000円
MB ASUS Z370-P 　14359円
RAM CORSAIR DDR4 Vengence 2666 8GBx2 　9878円
GPU ASUS RTX2060 Dual 　52772円
SSD SSD Crucial M.2SSD 500GB PcIEx4 　8404円
HDD WD 2TB 　6890円
PSU Thermaltake 850W RGB 　12000円
Case Thermaltake H26 　4163円
CPUクーラー Corsair H110i Pro RGB 　14600円
OS Windows10 Home 　14956円

***計　188022円***

CPUはkの付いてるオーバークロック可能モデルです！こちらは発熱がすごいので、CPUクーラーに簡易水冷を導入していますｗ

# ロマンの高スペック
では最後にロマンのハイスペックな構成を考えていきましょう！

CPU i9 9900k 　61955円
MB ASUS ROG Z390-F  　22433円
RAM CORSAIR DDR4 Vengence 2666 8GBx2 　9878円
GPU ASUS ROG RTX2080  　108980円
SSD SSD Crucial M.2SSD 500GB PcIEx4 　8404円
HDD WD 2TB 　6890円
PSU Corsair 1000W Gold  　18827円
Case Thermaltake H26 　4163円
CPUクーラー Corsair H110i Pro RGB 　14600円
OS Windows10 Home 　14956円

***計　271086円***



**ひえええ　これ本体だけでですよ。。。いつか組んでみたいですね～ｗ**



こんな感じで、自作PCは目的別に構成を自分で考えて好きなパーツを使って自分のパソコンを組み立てることができます！
**事実私もMSIというメーカーの縛りをしていますｗ**
私のPCはミドルハイの位置ですかね～
ミドルハイでも全然ゲームはヌルッヌルですけど、さらに求めるならハイスペックな構成をお考えください！
「#migratedタグ」について

### 対象

[#migratedタグ](https://qiita.com/tags/%23migrated)

### 説明

- 2017/5/8 [Qiitaコミュニティガイドラインについて](https://blog.qiita.com/160423117339-2)

上記のガイドライン変更にともない、それまでしてきた情報の集約ができなくなったと判断をした。
そのため、別のサービスへ記事を移行することを当時決めた。
記事移行作業は時間がかかるため、「どこまで作業をしたか」を記録するために独自タグ`#migrated`を付加。

完全移行後には全記事(3800記事?)を削除する予定であったが、Qiita上の他の人とのつながりや「公開記事の共有しやすさ」を考慮して、Qiitaを続けるように考えを変えました。

結果、記事も残して、タグも残っている状態です。

「いいね」をあたらしく付加された記事に関しては、適宜、タグを削除していますが、他の多くの記事についてはそのままです。
変更した時点で最終日時が書き換えられるというのが一つの理由です。

今後整理するかもしれませんが、2019年5月現在はこのとおりです。

### 関連

- `#migrated`タグについてのコメント
    - https://qiita.com/j5c8k6m8/items/b184ca0f43517ad5fcf3#comment-5c84f489efee9af5194d
    - @ Qiitaタグの記事数とフォロワー数を比較してみた
XAMPPでPHP開発環境構築(XAMPPインストール〜複数サイトの運用を考慮した設定まで)

# 概要
- 案件で**PHP開発環境**を構築する必要があった
- 本番環境と同じ(HTML等はもちろんこと､JS､PHP)ソースが動作する環境を作るための手順書
- また､ざっくりとしたXAMPP周りの知識を収集したメモあり｡
- **基本的には､XAMPPインストールでソースを配置し､表示が確認できれば完了｡今回は､今後のことも考慮し､複数サイトの開発にも耐えられる環境の構築まで行い完了｡**

# 事前準備
- 事前準備は､不要｡
- **OSは､Windows**で進行｡


# 事前知識
## XAMPPとは

参考：https://ja.wikipedia.org/wiki/XAMPP


- 最も人気のあるPHP開発環境(オープンソースパッケージ)
- 開発用・学習用として優れている｡
- **XAMPPは､下記主要ソフトウェアを一括してインストールして､すぐに開発や運用が開始**できる｡
    - Apache(Webサーバソフトウェア)
    - MariaDB(リレーショナルデータベースマネジメントシステム)
    - Perl(プログラミング言語)
    - phpMyAdmin(データベース接続クライアント)
    - SQLite(軽量なリレーショナルデータベースマネジメントシステム)
- つまり､**Webサーバ + RDB(データベース) + phpMyAdmin(データベースにブラウザ接続)を一括インストールして､すぐに開発できる環境を構築してくれる｡**


## XAMPPの名前の由来
- X・・・**Windows､Linux､macOS､Solarisのクロスプラットフォーム**
- A・・・**Apeche**のA
- M・・・**MariaDB**(旧バージョンはMySQL)のM
- P・・・**PHP**のP
- P・・・**Perl**のP

# 作業内容
## XAMPPのインストール
- 公式サイト( https://www.apachefriends.org/jp/index.html )よりインストール
- 特に､デフォルトのままNextで進みインストールまで終わらせる｡

**XAMPPインストール時にインストールされるソフトウェア群**

- チェックマークをつけたソフトウェアがインストールされます｡
![image_preview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/163887/c664ef6b-41f4-8de7-e0d8-657c135e91cc.png)


- なんと､Tomcatも同梱されている｡
- **インストール先 =>** `C:\xampp`


## XAMPPインストール直後､主要ソフトウェアのバージョン確認
- `C:\xampp`直下の`readme_en.txt`を読むと､そこに全てのバージョンが書いてあった｡

`readme_en.txt` 一部抜粋(参考程度に)

    XAMPP：7.3.5
    Apache：2.4.39
    MariaDB：10.1.40
    PHP：7.3.5
    phpMyAdmin：4.8.5
    Strawberry Perl(MS Windows用のperl環境)：5.16.3.1


- 念の為､`readme_en.txt`が最新なのかどうか不安なのでコマンドを叩いて確認｡
- 直接コマンドプロンプトから､バージョン確認コマンドを叩いても認識されないので`XAMPPのShell`からコマンドを叩く必要があります｡
    - `XAMPPのShell`は､XAMPP Control PanelのShellボタンから開けます｡

`XAMPPのShell` からコマンドで確認｡一部抜粋(参考程度に)

    XAMPP：コマンドはなさそう??
    Apache：2.4.39
    MariaDB：10.1.40
    PHP：7.3.5
    phpMyAdmin：コマンドはなさそう??
    Strawberry Perl(MS Windows用のperl環境)：5.16.3


- 結果､`readme_en.txt`のバージョンと相違がなく､`readme_en.txt`のバージョンを正として進めても良さそう｡


## Apacheを起動し､http://localhost/ にアクセス
- ローカルサーバを起動する｡
    - XAMPP Control Panel > Apache > Start
- http://localhost/ にアクセス
    - デフォルトは､http://localhost/dashboard/ にリダイレクトされる｡


## 複数サイトの運用を考慮した設定
- 基本は､`C:\xampp\htdocs`にフォルダ(例：プロジェクトA)を配置すれば､http://localhost/プロジェクトA にアクセスすることで､サイトが表示される｡

ただし､このままだと

- **ドキュメントルートが､デフォルトだと`C:/xampp/htdocs`のため､ソースに`/img/aaa.jpg`や`/info/form/index.html`などと記述されていると､画像切れやリンクが正しく飛ばない｡**
- **複数サイト毎にプロジェクトのディレクトリを作成し､プロジェクト毎にドキュメントルートを設定したいときに困る**

ので､

[XAMPPで複数のサイトのテストサーバーを作ってみました（バーチャルホスト）](http://mypcmemo.com/xampp-vertualhosts)を参考に設定しました｡

参考サイトでは､3つのプロジェクト(サイト)運用時の例だったので､私は1つのプロジェクトだけ同じように設定をしました｡


# 事後確認&作業
## Apacheを再起動し､http://localhost/プロジェクト名 にアクセス
- ローカルサーバを再起動する｡
    - XAMPP Control Panel > Apache > Stop → Start
- http://localhost/プロジェクト名 にアクセス

これで､画像・リンク切れ等がなければ完了です｡

**ルート相対パスで記述されていた箇所も正しいドキュメントルートを基準に読み込むため､画像切れやリンク切れの問題が解決しました**｡


# まとめ
- ほぼ､XAMPPをインストールしてしまえば､簡単にPHP開発環境が作れたので､やはり有名なだけあるなと思いました｡
- 複数サイトを考慮した構築は､初めてでしたが設定ファイルを書き換えれしまえばすぐに反映&いろんな設定ができるので良いですね｡特に､バーチャルホスト機能は良い！
- JSPを動かすTomcat(Webコンテナ)が入っていたのは驚き(笑)
- 多分､本番のソースによっては､JSがエラーや正しい挙動をしてくれず､完了と言えない人(私です・・・)はいると思いますが､ひとまず汎用的な設定はここまでです｡
通信データの誤り検出 

# 誤り検出の必要性
　工場内でIoTを実現するためには、色々なデバイスと通信する必要がありますが、
　無線、有線にかかわらずノイズやコリジョンで送信側と受信側では異なったデータ認識になることがあります。
　データの欠測ではすぐにおかしいと気づきますが、数メガバイトのデータからビットエラーを気づくことは難し
　くのまま採用し保存してしまいます。


# ビットのエラーを見つける方法

　**◆パリティチェック**
　　データを一定のビット長さに区切り、区切られたビットの「1」の個数を数えて、その数が偶数か奇数か判断
　　できるビットを区切られた最後に追加して送信します。
　　奇数か偶数の判断だけだので、1ビット以上の誤りは検出できない可能性があり、この方法だけだと信用性は
　　高くありません。
　　シリアル通信やメモリの読み書きに使われています。


　**◆サムチェック（チェックサム）**
　　データのバイト単位を数字にして、その数字をすべて足していき、データの最後にチェック用として合計値を
　　追加して送ります。
　　合計値は最下位のバイトだけにして１バイトや２バイトにして追加します。
　　処理が単純で簡単なエラーチェックに使用されているが、足し算なのでバイト単位で順番が入れ替わっていると
　　検出できない。
　　
　　＊MD5やSHA1ハッシュ値なども、チェックサムと扱われることがあります。


　**◆CRC（Cyclic Redundancy Code）**
　　データを定数（生成多項式）で割り算して、その乗数を検査用の数値として用います。
　　パリティや単純な加算によるチェックサムよりも検出精度が高く、Ethernetや圧縮データの誤り検知に使われていて、
　　パラメータにより計算方法が異なります。

　**●ビットの幅**
　　多項式の次数
　　・CRC16 17ビットの定数を用いて16ビットの数値を求める。
　　・CRC32 33ビットの定数を用いて32ビットの数値を求める。

　**●生成多項式**
　　CRC16の場合、下記の種類がよく使用されています。
　　カッコ内の左は標準、右は右送りの場合。
　　・CRC-16-IBM x16+x15+x2+1（0x8005,0xA001）
　　・CRC-16-ANSI x16+x15+x5+1（0x8021,0x8401）
　　・CRC-16-CCITT x16+x12+x5+1（0x1021,0x8408）
　　・CRC-16-XMODEM x16+x15+x10+x3（0x8408,0x1021）　

　**●初期値、出力XOR**
　　割る前の初期値や出力（余り）した値とのXOR値を設定します。
　　CRC16の一般的な場合、0xFFFF（ビット反転と同じ）か0x0000（XORしないのと同じ）が入ります。

　**●比較方向**
　　定数で割る時に、割られる数字を左右どちらかにビットをシフトします。


## PLCのシリアル通信例
　　パリティ、サムチェックはPLCのシリアルポートのパラメータで設定できるので、特に意識しないで大丈夫ですが
　　CRCの通信仕様を持ったデバイスと通信するときは、計算が必要になります。

　◆三菱FX5Uのサンプル
![CRC-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/418330/41eb34be-f0cc-f39e-145e-39c82ebe920e.png)
git commitの時間を修正する

たまにgitのコミット日時を変更したくなるときがあります。

# git rebase -i
をしたらいけるかと思っていたのですが、いけませんでした。

# どうやるか

```
git commit --amend --date=now
```
これをやると、直前のコミットの時間を修正して、今の時間にコミットしたことにしてくれます。
python scheduleライブラリでimport errorになる時に確認すること

## schedule ライブラリでimport errorになる時に確認すること

scheduleはpythonで関数を定期実行する際に活躍する便利なライブラリです。

しかし、下のようなエラーが発生することがあります。

```
AttributeError: module 'schedule' has no attribute 'every'
```

## 確認すること

### scheduleがインストールできている確認する。

```
pip freeze
```

### pythonファイルが`schedule.py`になっていない事を確認する。

<img width="233" alt="Screen Shot 2019-05-22 at 08.13.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203954/ae1abda2-edfc-0f60-7c4f-c322040a6096.png">

python ファイルが`schedule.py`になっているとimoprtエラーが起こるみたい。
参考：https://github.com/dbader/schedule/issues/37