OmniAICreator/Qiita-1.07M huggingface dataset:
SharePoint REST APIでフィールドを作成する際の自分メモ

# やりたいこと・やったこと
PowerAppsで頻繁にSharePointオンラインのカスタムリストを使うので、リストの作成や列追加もいっそPowerApps→Flowで完結させたい！
そのためにSharePoint REST APIをFlowから実行！だけどBodyに何かいていいかわからない
今回はSharePoint REST APIを利用してフィールドを作成する際に、どういうBodyを入れるかの備忘録を記載します。

# FlowでSharePoint REST APIを実行
Microsoft Flowで「SharePoint」と検索すると表示されるアクションに、「Send an HTTP request to SharePoint」というのがあります。これをつかっていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/34baffd3-664b-9089-8c60-555c4dfd1522.png)

今回はフィールドの追加をしますので、以下のようにアクションのパラメータをセットします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/cf65ac38-33b7-f0b5-8fbf-3cc2e260aa58.png)

ここでUriは ```_api/web/lists/getbytitle('リストのタイトル')/fields``` で、MethodをGETにすれば対象リストに含まれるフィールドの一覧（プロパティ含む）が得られますし、POSTにすればフィールドの追加ができます。
Lookup列のみ、addfield methodを使いなさいと怒られます。
追加する際にはBodyにフィールドの設定をJson形式で記載する必要があります。（名前、フィールドのタイプ、ユニークにするか、デフォルト値は など）

# Bodyの中身
基本は下記のような構成でBodyを構成します。
DefaultValueやDescription,Requiredは省略可能でした。


```Body.json
 {
    "__metadata": {
      "type": "SP.Field" //追加するフィールドの種別
    },
    "DefaultValue": "1", //デフォルト値
    "Description": "", //フィールドの記述
    "EnforceUniqueValues": false, //ユニークな値を強制するか
    "Required": false, //必須か
    "Title": "bool", //列名
    "FieldTypeKind": 8, //フィールドの種類
    +フィールド種別に応じたプロパティ
 }
```
送るBodyの詳細は[こちら](https://docs.microsoft.com/en-us/previous-versions/office/developer/sharepoint-rest-reference/dn600182(v=office.15)) にまとめられています。これだけ見ればきっとわかるはず。Exampleもあるので。

#実際つくったFlow
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/a3fed9ff-38db-9239-d39c-e9799cefab6e.png)

PowerAppsではリストのGUIDやサイトアドレスをCollectionとして持っています。
Bodyの中身ですが、これはPowerAppsからおくったJsonをちょっと加工して挿入しています。
```replace(replace(replace(triggerBody()['SendanHTTPrequesttoSharePoint_Body'],'"[','['),']"',']'),'"','''')```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202779/c72103ad-4e56-daf9-fa26-ef83ccc09b8b.png)


ということで自分用メモでした。
RubyでAPIを簡単に取得する(クライアント側)

Qiitaに載っているAPIの取得方法がどれも初めて利用するにはわかりずらい気がするので，必要不可欠なコードだけで叩く．

```sample.rb
require 'net/http'
require 'uri'
require 'json' #jsonで返って来ないなら必要ない

uri = URI.parse("URL")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true #http通信だったらいらない
req = Net::HTTP::Post.new(uri.path)
res = http.request(req)
item = res.body #これ忘れること多いです
hash = JSON.parse(item) #jsonで返って来ないなら消してください．
```

これをコピペすれば動きます．
[備忘録] FuelPHPのEmailクラスでMailHogを使いたい

ローカル開発環境でMailHogを導入したところ、PHPのmailやmb_send_mailは正常に動作するのにFuelPHPのEmailクラスでのメール送信が動かなかった。

原因はMailHog/mhsendmailに指定できない引数がFuel内で使われているため。それらを無理やり削除したら動作したので備忘録的に残しておく。

# 手順

fuel/packages/email/config/email.php
を自分の環境のconfigにコピーし、sendmailのパスをmhsendmailに修正。

```php:fuel/app/config/*****/email.php
//'sendmail_path' => '/usr/sbin/sendmail',
'sendmail_path' => '/usr/local/bin/mhsendmail', // 各自インストール先
```
※driverがmailでない場合はmailにする。
続いて、mhsendmailで使用できない引数の指定を削除する。

```php:fuel/packages/email/classes/email/driver/mail.php

// if ( ! @mail(static::format_addresses($this->to), $this->subject, $message['body'], $message['header'], '-oi -f '.$return_path))
if ( ! @mail(static::format_addresses($this->to), $this->subject, $message['body'], $message['header']))
```
当然だが、上記修正はローカルのファイルだけにするようにする。

FuelのEmailパッケージのファイルを直接いじるため、あまり望ましい対応でないです。
Git LFSのファイルDLをスキップする

# 概要

Git LFSで巨大ファイルを管理していて、LFS管理外のファイルだけ追いたいのに更新する度LFSのファイルDLが走ってしまうのでスキップしたい。

# 設定

以下のコマンドを打つ。
`--local`オプションを無くすとグローバル設定になる。

```sh
git lfs install --skip-smudge --local
```

もしくはconfigを直接弄り、`[filter "lfs"]`の所を以下のように書き換える。

```
[filter "lfs"]
	clean = git-lfs clean -- %f
	smudge = git-lfs smudge --skip -- %f
	process = git-lfs filter-process --skip
	required = true
```

これで未DLのLFS管理ファイルについてはポインタファイルのままになり、置き換え処理が走らないようになる。

## 設定後に手動でDLを行う方法

以下のコマンドを打つ。

```sh
git lfs pull
```

## 設定を戻す方法

`--skip-smudge`オプションを無くして再び`git lfs install`すればOK。

```sh
git lfs install --local
```

# 参考

- [Installation · git\-lfs/git\-lfs Wiki](https://github.com/git-lfs/git-lfs/wiki/Installation)
- [Git LFS でうまく clone や pull ができないときにバイナリファイルのダウンロードをスキップする](https://mseeeen.msen.jp/skip-download-binary-files-with-git-lfs/)
SQLが速く動くようになった話

かっこ株式会社インターン生のK.T.です。
かっこ株式会社ではデータ分析だったりRPA構築等の業務のためだったりにSQLを多用します。

その中で、
「単に正しい結果を出せばいい」
だけではなく、
「少しでも早く正しい結果を返すことで業務効率をアップさせる」
「SQLは書き方次第で、早くも遅くもなったりする」
ことを実感したことがあったので、Qiitaに残します。

### 環境
AWSのRDS
PostgreSQL 10.6
東京リージョンのインスタンスクラスはdb.t2.large で実施

### 要件
hogeが全体のデータで、fugaが一部のデータだとして、
「hogeからfugaとのidが一致していないものを抽出したい」という要件。
結構よくある話だと思います。
※ここでは例としてidのみSELECTするSQLにしました。

### コード

まず、WHERE句でidが一致していないという条件を指定すると、、、、

```
SELECT
    hoge.id
FROM
    hoge
WHERE
    id NOT IN (SELECT id FROM fuga);
```
fugaのレコード数が数百万レベルになると処理に数時間以上かかりました。


これと出力内容を変えず、文法を以下に変えると、、、

```
SELECT
    hoge.id
FROM
    hoge
LEFT JOIN
    (SELECT id FROM fuga) fuga ON hoge.id = fuga.id
WHERE
    fuga.id IS NULL;
```

数十秒で結果が返ってきました。

どうやらWHERE句で毎回fugaを呼び出していたのが問題だった模様で、
fugaのレコード数が1000件程度では処理時間に差がつかなかったが、
レコード数が膨大になると処理時間に大きく差がつくようでした。

ちなみに、hogeからfugaとidが一致しているものを抽出するなら、

```
SELECT
    hoge.id
FROM
    hoge
RIGHT　JOIN
    (SELECT id FROM fuga) fuga ON hoge.id = fuga.id
```

となると思います。INNER JOINを使っても同じ結果になるはず。

### 後記
文法によって処理速度が激変することを再認識できた。

### 参考
[EXISTSとSQLの高速化について - 猫好きモバイルアプリケーション開発者記録](http://kkoudev.github.io/blog/2013/09/14/sql/)
Windowsファイル名に日時をつけてリネームする

ファイルをバックアップするとき、新しい名前がほしいですね。特に同じフォルダにね。

###現在日時をつけてバックアップする

１．下記 bat ファイルをデスクトップに作成します。

```bash:cdtren.bat
@echo off
set _DATE_=%date:/=%
set _TIME_=%time::=%
set _TIME_=%_TIME_: =0%
set _TIME_=%_TIME_:~0,6%

:WORK
if "%~1"=="" goto :EOF

rem ######## set to current DATETIME
ren "%~1" "%~n1_%_DATE_%_%_TIME_%%~x1"
rem #実行結果 test.txt ⇒ test_20190722_110523.txt

rem ######## goto NEXT 複数ファイル対応
shift
goto WORK
```

２．リネームしようとするファイルを cdtren.bat アイコンにドラッグ＆ドロップします。
:notes:

###ファイルの更新日時をつけてバックアップする

１．下記 bat ファイルをデスクトップに作成します。

```bash:fdtren.bat
@echo off

:WORK
if "%~1"=="" goto :EOF

rem ######## set to file updated DATETIME
set _DT_=%~t1
set _DT_=%_DT_:/=%
set _DT_=%_DT_::=%
set _DT_=%_DT_: =_%
ren "%~1" "%~n1_%_DT_%%~x1"
rem #実行結果 test.txt ⇒ test_20190722_1105.txt

rem ######## goto NEXT 複数ファイル対応
shift
goto WORK
```

２．リネームしようとするファイルを fdtren.bat アイコンにドラッグ＆ドロップします。

:notes:
Introduction to AWS CodePipeline 和訳してみた

##はじめに
AWS Training and Certification にて紹介されている AWS CodePipeline についての動画を和訳してみました。

このコンテンツへのアクセス方法については、[こちらに](https://qiita.com/Yoshiyuki03/items/bfbf416ab47ef5121927)記載しております。

##Introduction to AWS CodePipeline
###AWS CodePipeline について
それでは、AWS CodePipeline について説明して参ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/f442fb6a-a996-f86c-88b6-b5ed667c3c39.png)
AWS CodePipeline は、ユーザがコードを修正する度に、コードの構築・テスト・デプロイを自動的に調整する継続的なデリバリーサービスです。ソフトウェアの、迅速な、そして正確な開発が求められる昨今においてとても重要なサービスです。

###サービスのメリット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/d5e80fd8-6fe3-6fed-4c19-2a50416d5a30.png)
CodePipeline は以下のような特徴があります。

- 直ぐにデリバリー可能
 - 開発・テスト・デプロイまでの一連の流れを自動化 
- 高品質
 - デプロイまでの流れをすばやく自動的に行うことが可能
- 直ぐに開始可能
 - サーバレスなので、サーバを立てることなく利用可能 
- ワークフローの設定可能
 - 開発・テスト・デプロイの段階毎に設定を設けることが可能 
- 他の AWS サービスと統合可能
 - CodeCommit など他の AWS サービスや、第三者デベロッパーツールとの統合利用が可能 

###AWS Code Pipelie の仕組み
AWS CodePipeline の動作環境については、以下となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/62c5ad45-8e2e-0250-2bb5-137361fa49c0.png)

1 リリースプロセスモデルを判別

- リリースワークフローを定義
- コードが無事に通過しているかを Source、Build、Test、Prod、の段階毎に判別
- それぞれの段階で実行されるアクションを判別

2 次回以降、ソースリポジトリに変更内容が反映される

- 定義されたアクションとして、ワークフローが実行される
- 変更内容が承認され無い限り Pipeline のワークフローは動かない

###ベストプラクティス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/4c0e5e58-a20a-d856-240a-084a4393a129.png)
CodePipeline は、他の AWS サービスとの統合や、テンプレートの作成が可能といった特徴があります。

- CodePipeline はCodeCommit やCodeBuilt など、他の AWS サービスとの統合した利用が可能
- CodeDeploy を利用することで、テンプレートの内容を変更することも可能
- Lambda を使用することで、パイプラインに Lambda 関数を呼び出すことが可能


###ユースケース
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/5bc00943-1ed3-5c8a-e5ae-8bfc24407e42.png)
AWS CodePipeline は、Source、Build、Test、Production で構成されており、それぞれに対して有効なアクションプロバイダが決まっております。

| アクションカテゴリ | 有効なアクションプロバイダ |
|:---------------:|:------------------------:|
| ソース | AWS CodeCommit、GitHub など |
| ビルド | AWS CodeBuild、Jenkins など |
| テスト | AWS CodeBuild、GhostInspector など |
|プロダクト | AWS CodeDeploy、 AWS CloudFormation など |

##おわりに
AWS CodePipeline については以上となります。CodePipelne を利用することで製品を作成する際の一連の流れを、管理するだけでなく自動化まで行うことができます。個別で取り組んでいた1つひとつのサービスをまとめることができるので、開発をする際は、ぜひ利用してみて下さい。
Introduction to AWS CodeCommit 和訳してみた

##はじめに
AWS Training and Certification にて紹介されている AWS CodeCommit についての動画を和訳してみました。

このコンテンツへのアクセス方法については、[こちらに](https://qiita.com/Yoshiyuki03/items/bfbf416ab47ef5121927)記載しております。

##AWS CodeCommit について
AWS CodeCommit は以下の様な特徴があります

- 非常にスケーラブルでセキュアなソース管理サービス
- Git リポジトリを作成してソースコードの管理や保存が可能
- 様々な AWS サービスと結合することが可能

##Hands On
###事前準備
リポジトリ作成前に、以下の2点の準備をしておきましょう。

- IAM アカウントの用意
- Git クライアントの用意

 IAM ユーザは先に作成しておきましょう。IAM ユーザではなく、root アカウントでログインした状態でリポジトリの作成を行うと、画面に警告が出ます。リポジトリを作成する際は、IAM ユーザでログインしてから作成しましょう。
Git クライアントを使う場合は、事前にダウンロードしておく必要があります。こちらも先に用意しておきましょう。

###IAMユーザの作成
AWS のコンソール画面から、IAM ユーザを作成します。
作成するIAM ユーザが CodeCommit を利用できるよう、アクセス許可の付与設定で、「既存のポリシーから直接アタッチ」を選択し、「AWSCodeCommitFullAccess」というポリシーをアタッチさせておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/93e12baf-705d-2f4e-f3e4-ad65abda9f5b.png)
これで、IAM ユーザの作成は完了です。

###リポジトリの作成

次は、リポジトリを作成します。リポジトリとは、CodeCommit の基本的なバージョン管理オブジェクトのことです。リポジトリを用意することで、プロジェクトごとにコードやファイルの保存、管理をすることができます。また、リポジトリは他のユーザと共有することも可能です。
先程作成した IAM ユーザから AWS アカウントにログインし直して、リポジトリの作成を開始しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/64a5347b-aab2-6887-9c10-931ee24487a3.png)
AWS にログインしたら、コンソール画面より「 CodeCommit 」と入力します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/74797526-3940-529c-64c7-1e5851bf4551.png)
CodeCommit の画面に移動したら、リポジトリの作成を開始します。
画面右上の「リポジトリの作成」を選択します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/295417ab-b6b3-643d-78e6-624304a320c1.png)
以下の内容を入力したら、右下の「作成」をクリック。これで、リポジトリの作成は完了です。

- リポジトリ名（名前は任意）
- 作成・オプショナル（内容は任意）

##その他の機能
###Code
上記で作成したリポジトリに、コードをファイル毎に保存することができます。
プロジェクトごとに個々にファイルを作成して、コードを保管することも可能です。コードファイルは「作成」か「アップロード」の2択を選ぶことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/5de3c815-dcc3-7dbc-3bd0-d6080224b951.png)

###Commit
Commit は、コードに対する内容を更新情報ごとに保存することができるサービスです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/fb2ffe77-0865-ff0b-4481-49dbae71c49d.png)
以下の情報が記録されるので、コードに変更があった際には直ぐに確認することが可能です。

- メッセージのコミット（つまり変更内容）
- コミット日（更新が行われた日）
- 作成者

###Commit Visualizer
こちらは、commit で更新された情報を視覚化したものです。「コミットビジュアライザー」を選択することで利用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321349/70aa0fe3-37c4-0889-fb46-d92bd1ef321d.png)
最新バージョンのコードが１番上に表示されており、変更内容と日時を視覚的に把握することができます。そのため、確認したいタイミングのファイルコードや、どこで変更が行われたのか等もひと目で分かるようになっております。

##おわりに
AWS CodeCommit の紹介は以上となります。本サービスを利用することでプロジェクトごとに、コードファイルを分けて管理したり、コードファイルの変更内容を直ぐに確認したりできます。
複数のプロジェクトを並行して行う際の管理ツールとして非常に便利なサービスなので、ぜひ、利用してみて下さい。
#VsCode で複数行に連番を与えん

Numbering multiple lines in #VsCode


# Insert Numbers プラグインを入れる

![image](https://user-images.githubusercontent.com/13635059/61599373-399f6d00-ac63-11e9-9cef-b7bc412751c2.png)

# 複数行選択モードにしておく

[Mac] Option+Command+上下キー
 [Win]  Ctrl+Alt+上下キー


![image](https://user-images.githubusercontent.com/13635059/61599363-2b515100-ac63-11e9-8f43-1bd1503f3b09.png)

# Insert Numbers コマンドを実行

![image](https://user-images.githubusercontent.com/13635059/61599411-9733b980-ac63-11e9-855a-cb4cea966823.png)

![image](https://user-images.githubusercontent.com/13635059/61599387-5340b480-ac63-11e9-89f9-52af8d49b371.png)





# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
#VsCode で SublimeText みたいなマルチ行選択モードを使うには  [Mac] Option+Command+上下キー [Win]  Shift+Alt+上下キー

To use multi-line selection mode like SublimeText with #VsCode [Mac] Option + Command + Up and down keys [Win] Shift + Alt + Up and down keys


Sublimetext で範囲選択してから Command+Shift+L で出来てたことを、VSCodeでもやりたい。

![image](https://user-images.githubusercontent.com/13635059/61599257-1fb15a80-ac62-11e9-9944-4620c31e9833.png)


[Multiline editing in Visual Studio Code - Stack Overflow](https://stackoverflow.com/questions/30037808/multiline-editing-in-visual-studio-code)


# Original by Github issue

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








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
gazeboをlaunchした時に<legacyModeNS>がないとエラーが出る


```
GazeboRosControlPlugin missing <legacyModeNS> while using DefaultRobotHWSim, defaults to true.
This setting assumes you have an old package with an old implementation of DefaultRobotHWSim, where the robotNamespace is disregarded and absolute paths are used instead.
If you do not want to fix this issue in an old package just set <legacyModeNS> to true.
```
##解決法
```hoge.xacro
<gazebo>
  <plugin name="control" filename="libgazebo_ros_control.so">
    <legacyModeNS>true</legacyModeNS>
  </plugin>
</gazebo>
```
このようにurdfファイルかxacroファイルの中にあるgazeboのタグの中で<legacyModeNS>true</legacyModeNS>タグをtrueにすることで解決ができる。

##参考
https://answers.ros.org/question/292444/gazebo_ros_control-plugin-gazeboroscontrolplugin-missing-legacymodens-defaultrobothwsim/
VuePress で Vuetify を使う

## やりたいこと

VuePress で Vuetify を使いたい。ただし、全体にテーマを適用するのではなく、部分的に使いたい。

## ぶつかった症状
`yarn vuepress dev` なら問題なく動作するのですが `yarn vuepress build` をした時に、上のポイントを抑えていないとうまく動きませんでした。

まだキッチリ原因を切り分けられていないので **自分固有の症状かもしれません**。また、症状を完全に回復させておらず `a` タグのスタイルが漏れてしまっています。ただ、同じ内容で引っかかっている方がいらっしゃればと思い記載いたします。

## バージョン
* `vuepress@0.14.11`
* `vuetify@1.5.16`

## 参考にしたサイト
以下のサイトを参考にさせていただきました。ただ、それでもいくらかハマったところがありました。

* [VuePressにVuetifyを導入](https://codekneading.com/blog/2018/10/vuetify-introduction.html)

## 対策
SFC, シングルファイルコンポーネントを書く時に以下の３点に留意します。

1. scoped ではなくクラスを使う
2. less を使う
3. 相対 import を使う

```vuejs
<template>
  <!-- 1. scoped は使わずクラスを使う -->
  <v-app class="vuetify-styles">
    ...
  </v-app>
</template>


<style lang="less">
  /* 2. less を使う */
  .vuetify-styles{
    /* 
       3. 絶対 import ではなく 相対 import を使う
       @import (less) '/node_modules/vuetify/dist/vuetify.min.css';
     */
    @import (less) '../../../node_modules/vuetify/dist/vuetify.min.css';
  }
</style>
```



## 原因
詳しいことが、全くわかっていません。原因があるなら `yarn vuepress build` でも問題が起こっていいはずですが、なぜか `yarn vuepress dev` では安定して動作してくれます。バグが起こっている背景はリンク先のコメントからなんとなく雰囲気だけ。


### その１
そもそも Vuetify が global にスタイルを適用してしまう様子。
> [dearaw - Css conflict](https://github.com/vuejs/vuepress/issues/854#issuecomment-467541710)
> @mgh87 Yes that's normal, Vuetify has global styles in it and will register them in `<head>` I'll try to create a Vuepress + Vuetify theme
> []()

* [How to isolate Vuetify global styles - Stackoverflow](https://stackoverflow.com/questions/54201469/how-to-isolate-vuetify-global-styles)

scoped を外すと動作するのは自力で気づきました... orz

### その２
Webpack もなんか問題を抱えている様子。
> It would seem the problems comes from webpack rather than stylus itself or vuetify itself.
> [[Bug Report] stylus block level import not working - GitHub](https://github.com/vuetifyjs/vuetify/issues/4864#issuecomment-437010054)

less を使えばなんとか動作するよ、というのは以下のコメントで知りました。
> I've used `less` here and it works for me.
> [[Bug Report] stylus block level import not working - GitHub](https://github.com/vuetifyjs/vuetify/issues/4864#issuecomment-456054957)



## less の追加

```
yarn add -D less less-loader
```

* [How to use stylus block level import with Vuetify styles - Stackoverflow](https://stackoverflow.com/questions/54233658/how-to-use-stylus-block-level-import-with-vuetify-styles/54289804#54289804)


<!--
```
npm install --save-dev sass-loader 
npm install --save-dev node-sass
```
* [Module not found: Error: Cannot resolve module 'sass-loader - GitHub](https://github.com/vuejs-templates/webpack/issues/121)
 -->

## scoped のつけ忘れ
`.vuepress/components` 配下で定義していた SFC が複数あったのですが、そのうちの１つに style に `scoped` をつけ忘れていたものがあって、それともこんがらがって、混沌に拍車が掛かっていました... orz
%AppProfile%変更後にnpmに失敗した時のメモ

# 概要

Windows Updateで何故か%AppProfile%が`C:\Users\XXX`から`C:\Users\XXX.000`に変わってしまい、その後npmでエラーが発生するようになった場合の解決方法の備忘録。

# 起きたこと

Windows Updateをしたら、%UserProfile%が`C:\Users\XXX`ではなく`C:\Users\XXX.000`になっており、中身はすべて移動されていました。
使用上問題が無かったので使い続けていたところ、`npm`を使おうとした時に問題が発生。

```
npm init
```

とやったら、

```
Error: EPERM: operation not permitted, mkdir 'C:\Users\XXX\AppData\Roaming'
```

と出てきました。
`C:\Users\XXX`って古いUserProfileなので当然AppDataなんて残っていないわけで……。

# 解決方法

`%AppData%\npm\node_modules\npm\npmrc`を開き、

```
prefix=C:\Users\XXX\AppData\Roaming\npm
```

とあるのを

```
prefix=C:\Users\XXX.000\AppData\Roaming\npm
```

に変更することで、解決。
~~最初は`XXX`を`XXX.000`に変更していましたが、環境変数を利用できるようです。~~ 残念ながら、環境変数は使えません。

まぁ、Windows Updateがこんなことしなければほとんど要らない知識ですが……。
一応、%UserProfile%はユーザーが変更できるため、なんらかの理由で変更した場合にはこの知識が役に立つかも。
【Angular】環境変数にサブスクリプションキーを設定する

## 前書き

サブスクリプションキーをコード中に書くのはダメ。  

環境変数に設定しましょう！  

てことで設定してみたのでまとめます。  

## environment.ts

environment：訳 環境  
Angula-CLIでng newしたら作成されるファイルだと思います。  
何に使うファイルか気になっていました。  
このファイルを使用して環境変数を設定するみたいですね。  
2種類あると思いますが、prodは実行環境用です。  

## 環境変数を設定する

environment.ts

``` typescript
export const APIKEY = '設定したいサブスクリプションキー';
```

## 環境変数を使用する

設定した環境ファイルをimportしましょう。  

app.component.ts  

``` typescript
import { APIKEY } from '../environments/environment';
/*
......
*/
onClick(){
    console.log(key1 = `${APIKEY}`);
}
```

実行するとenvironment.tsで設定したAPIKEYが出力されます。  

以上。
Excelファイルを非バイナリ形式で保存してgitで版管理

Excelの保存形式に2003XMLを選ぶ。
スプレッドシートの内容をXML形式で保存できる。このxmlをテキストエディタで開けば非バイナリであることがわかる。

gitで版管理するときは、シート上の変更箇所のみが記録される
。
どうも、一行だけ変更のあるファイルでも、ファイル全体が.gitフォルダ配下のどこかに記録されるような挙動にみえる。

↓TortoiseGitで差分表示したもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/34549/1cb85094-76b2-fc35-54d2-30ed765438f2.png)


ただし、2003XMLではグラフ・画像・カスタムビュー・グループなどの情報は保持されない。
条件付き書式は単純なものは保持される。一方で、データバーやカラーグラデーションは保持されない。



#メリットデメリット再考
xlsx形式でgitにコミットする場合。
・TortoiseGitなどではxlsx形式のファイルの差分を表示する機能があるので、このままでも差分を確認できる。
・細かい書式設定変更の差分までは確認できない。
・xlsxは圧縮されたファイルなので、2003xmlよりも小さくなりそう。コミットごとのリポジトリ増加量はxlsxの方が小さいかもしれない。

2003xml形式でgitにコミットする場合。
・細かい書式設定変更まで含めて、差分を確認できる。
・どうも、xmlの差分の行数分だけリポジトリが増加するということではない。xmlの全体量に応じてコミットごとにリポジトリが増量するように見える。
・2003xmlだとグラフや画像などをスプレッドシートに含めることができない。





# 他
PowerPoint XML形式も非バイナリ。こちらは図形と画像も保持できる。
Xfce4でパネルのデジタル時計に曜日を表示させる。

Oracle VirtualBox6.0.10のUbuntu Studio 18.04.2 (64bit)で動作を確認しました。
Ubuntu Studio 20.04.2 (64bit)で動作を確認しました。

Xubuhntu UbuntuStudio LinuxMintXfce などで採用されている、
使い易く軽量で安定したデスクトップ環境のXfce4で、
パネルの右側に時計が表示されています。
これをカスタマイズします。
![o0328024114508766628.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199671/2b93acc4-0f3b-b8fe-2785-25869bb75c44.png)
![o0377057814508769281.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199671/e9c156ad-7dc8-01ac-a1d9-1aca3d8cb30b.png)


- YYYY年MM月DD日AAAA HH時MM分SS秒

```
%x%A %r
```


- YYYY/MM/DDAAA HH:MM:SS

```
%Y/%m/%d%a %R:%S
```

- 外観（デフォルト）

```
%A %d %B %Y
```

- 時計のオプション（デフォルト）

```
%d %b, %H:%M
```
MySQLのLOCK TABLESとは？何をしているのか

SQLクライアントツールなどでdumpを取得した場合、
テーブルに対してlock tableという指定がされます。
ロックが何をしているかの調査結果メモです。

## LOCK TABLESとは

MySQLのクライアントセッションは、他のセッションと連携してテーブルアクセスする際に、
排他的制御をする場合、他のセッションにテーブルを更新されないように明示的にロックをかけることができます。
これがlock tablesの指定になります。
select for updateの指定と類似ですね。
dump時は他のセッションとデータの不整合を発生させないために明示的にロックを指定されているようです。

コマンドはこちらです。

```
LOCK TABLES {tbl_name}
    READ | WRITE
```

## ロックの種類は

### READロック

- このロックを保持しているセッションは、テーブルを読み取ることができます 
(書き込みはできません)

- 複数のセッションが同時にテーブルに対する READ ロックを取得できます

- ほかのセッションは、READ ロックを明示的に取得することなく、テーブルを読み取ることができます

ちなみにロックが必要なセッションは１つのステートメントで全て指定することが必要です。
なので、例えば

~~~
1). > LOCK TABLES test1 READ;
2). > SELECT * FROM test1;
3). > SELECT * FROM test2;
~~~

2はロックを指定しているのでtest1にアクセスできますが
3はtest2へのロックを取得していないのでアクセスできません。
この場合、test2へのロックを指定するか一度unlockする必要があります。

※他のセッションからはアクセスできます。
※INFORMATION_SCHEMAへのアクセスは例外です。ロック関係なくアクセス可能です。

### WRITEロック

- このロックを保持しているセッションは、テーブルの読み取りおよび書き込みが可能です

- このロックを保持しているセッションだけがテーブルにアクセスできます。ロックが解放されるまで、ほかのどのセッションもアクセスできません

- WRITE ロックが保持されている間、テーブルに対するほかのセッションからのロック要求はブロックされます

## セッション解放
ロックのセッションを解放する場合は

`UNLOCK TABLES`

を使用します。テーブル名指定不要。

参照：https://dev.mysql.com/doc/refman/5.6/ja/lock-tables.html
GoでCipher Feedback暗号化と復号化

#CFB is
![fig34.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69868/2eef48e4-1dc7-3d40-e142-2f649daae04b.gif)
footnote[^1]

![601px-CFB_encryption.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69868/ff321c55-f73c-8570-7e71-29ade519f82d.png)
![601px-CFB_decryption.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69868/4030c274-4c4e-56d8-1e16-196e8d911912.png)

footnote[^2]

#標準Packageのみでやりたい

##ライブラリならこう

```Go
package crypto

import (
	"crypto/aes"
	"crypto/cipher"
	"crypto/rand"
	"encoding/base64"
	"errors"
	"io"
)

func encodeBase64(b []byte) string {
	return base64.StdEncoding.EncodeToString(b)
}

func decodeBase64(s string) []byte {
	data, err := base64.StdEncoding.DecodeString(s)
	if err != nil {
		panic(err)
	}
	return data
}

func Encrypt(key, text []byte) (string, error) {
	block, err := aes.NewCipher(key)
	if err != nil {
		return "", err
	}
	b := base64.StdEncoding.EncodeToString(text)
	cipt := make([]byte, aes.BlockSize+len(b))
	iv := cipt[:aes.BlockSize]
	if _, err := io.ReadFull(rand.Reader, iv); err != nil {
		return "", err
	}
	cfb := cipher.NewCFBEncrypter(block, iv)
	cfb.XORKeyStream(cipt[aes.BlockSize:], []byte(b))
	return encodeBase64(cipt), nil
}

func Decrypt(key []byte, t string) ([]byte, error) {
	block, err := aes.NewCipher(key)
	if err != nil {
		return nil, err
	}
	text := decodeBase64(t)
	if len(text) < aes.BlockSize {
		return nil, errors.New("too short")
	}
	iv := text[:aes.BlockSize]
	text = text[aes.BlockSize:]
	cfb := cipher.NewCFBDecrypter(block, iv)
	cfb.XORKeyStream(text, text)
	data, err := base64.StdEncoding.DecodeString(string(text))
	if err != nil {
		return nil, err
	}
	return data, nil
}
```

#ライブラリを使うにはこう

##encrypt
```Go
// keyは復号化用キーでもある。
enc, err := crypto.Encrypt([]byte(key), []byte(str))
	if err != nil {
		log.Fatalf("%+v", err)
	}
fmt.Println(enc)
```
##decrypt
```Go
dec, err := crypto.Decrypt([]byte(key), enc)
	if err != nil {
		log.Fatalf("%+v", err)
	}
fmt.Println(string(dec))
```

>CFBモードを任意のxの整数倍の欠落に対しても同期を維持することが可能な自己同期型のストリーム暗号として利用するためには、ブロックサイズと初期化ベクトルのサイズでシフトレジスタを初期化する必要がある。これはブロック暗号によって暗号化され、暗号化結果の上位xビットは平文のxビットとのXORを取られ、これがxビットの暗号文となる。これらxビットの出力はシフトレジスタにシフトされ、次のxビットの平文の処理に用いられる。復号も同様であり、初期化ベクトルから始まり、復号、復号結果の上位xビットと暗号文のxビットのXORによりxビットの平文となり、これが次のxビットの暗号文の処理に用いられる。このような処理はCFB-8あるいはCFB-1として知られている（シフト量の大きさによる）

ブロック暗号を暗号化処理にのみ用いることと、ブロックサイズの整数倍にメッセージのパディングを行う必要がないことがメリットですね

[^1]: http://www.cs.shinshu-u.ac.jp/~okazaki/TECCRYP/SEC2/e3/e34.html
[^2]: https://ja.wikipedia.org/wiki/%E6%9A%97%E5%8F%B7%E5%88%A9%E7%94%A8%E3%83%A2%E3%83%BC%E3%83%89
WindowsでOpenSCを使う（3.MIFARE Classicブロックデータ読み出し編①）

# はじめに
[WindowsでOpenSCを使う（2.カードのIDm確認編）](https://qiita.com/erik_tnk/items/a8e36323a44bab92640d)の続きです。
カードのIDm確認を確認したら、次はブロックデータを読んでみましょう。
FelicaよりもMIFAREのほうが情報量少なめな気がするのでこちらを先にしました。

# 使用するツール
- コマンドプロンプト
- opensc-tool.exe（[WindowsでOpenSCを使う（1.準備編）](https://qiita.com/erik_tnk/items/7d40b02be3bb13f2c3af)参照）
- カードリーダー：PaSoRi RC-S380
- ICカード=MIFARE Classic 1K

# MIFAREのブロックデータ読み取り3ステップ
① プロテクトを解除するためのキー情報をメモリにロードする(Load Authentication Keys)
　　コマンド：`FF:82:00:00:06:FF:FF:FF:FF:FF:FF`
② セクタに対して認証を実施し、プロテクトを解除する(Authentication)
　　コマンド：`FF:86:00:00:05:01:00:00:60:00`
③ プロテクトが解除されたセクタのブロックデータを読み出す(Read Block Data)
　　コマンド：`FF:B0:00:01:10`

[WindowsでOpenSCを使ってMIFARE Standard(Classic)カードデータを読み出す方法](https://qiita.com/gebo/items/19f4fe7c24e12bb099eb)では、①～③を別々に実行されているように見えたので、最初倣っていたのですが、私の環境だとエラーになるので、[ここ](https://stackoverflow.com/questions/31635030/weird-behavior-of-smart-card-reader?rq=1)を見て下記の画像のように実行しました。
![3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409907/bb2ef78a-69a5-59d4-4da3-055001cfada7.png)
青色部分はカードに設定されたKey Aです。なので内緒です。[次の記事](https://qiita.com/erik_t/items/835f761792265206ac3f)の解説では`FF:FF:FF:FF:FF:FF`としましょう。ちなみに何も設定されていないMIFAREカードでは、Key Aはデフォルトで`FF:FF:FF:FF:FF:FF`になっています。
緑色部分は読み出された16byteのブロックデータ。ピンク部分は読み出されたブロックデータを文字列に直したものです。ブロックデータも内緒なので[次の記事](https://qiita.com/erik_t/items/835f761792265206ac3f)では`FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF`でいきましょう。

# コマンドについて
`opensc-tool.exe -s FF82000006FFFFFFFFFFFF -s FF860000050100006000 -s FFB0000110`で実行しましたが、なんか読みづらいので
`opensc-tool.exe -s FF:82:00:00:06:FF:FF:FF:FF:FF:FF -s FF:86:00:00:05:01:00:00:60:00 -s FF:B0:00:01:10`と書くようにします。
こちらで実行しても同じ結果が得られます。

[次の記事](https://qiita.com/erik_t/items/835f761792265206ac3f)ではコマンドを一つずつ解説します。
# メモ
- [WindowsでOpenSCを使ってMIFARE Standard(Classic)カードデータを読み出す方法](https://qiita.com/gebo/items/19f4fe7c24e12bb099eb)では、PaSoRi RC-S380を使用する場合、NFC Port Software（NFCPortWithDriver.exe）をアンインストールしないとエラーになるとありましたが、私の環境では起こりませんでした。何かアップデートがあったのかもしれません。

# 参考サイト
[WindowsでOpenSCを使ってMIFARE Standard(Classic)カードデータを読み出す方法](https://qiita.com/gebo/items/19f4fe7c24e12bb099eb)

# 関連ページ
[WindowsでOpenSCを使う（1.準備編）](https://qiita.com/erik_tnk/items/7d40b02be3bb13f2c3af)
[WindowsでOpenSCを使う（2.カードのIDm確認編）](https://qiita.com/erik_tnk/items/a8e36323a44bab92640d)
[WindowsでOpenSCを使う（3.MIFARE Classicブロックデータ読み出し編②）](https://qiita.com/erik_t/items/835f761792265206ac3f)
オンプレgitlabからgithubに引っ越してみました

リポジトリの移管って

```bash
git clone --mirror 旧リポジトリ
git remote add --mirror 新リポジトリ
git push --mirror 新リポジトリ
```
で移せます。
ただ、リポジトリを移すだけでは終わらなくて、移管以外でやったことを書きます。

プロジェクトの規模はこんな感じ

+ webサービス(PHP&javaScript)&スマホネイティブ
+ プログラマー10人以上
+ 対象となるリポジトリは5つ
+ 非エンジニアも同数以上いる
  + SourceTreeを使用しているがclone,pull,commit,pushなど最低限の使い方
+ jenkinsからのcommitを行う
  + 画像の予測不能な名前に変更
  + スクリプトの小型化
+ 自作ライブラリをcomposerで使用(ライブラリ自身も移管対象)

# 大雑把な手順

1. 旧リポジトリをcloneした新リポジトリを作成
1. 旧リポジトリへのコミットを新リポジトリへpush、同じ状態となるようにする
1. デプロイ側の設定変更(旧リポジトリを参照する箇所を新リポジトリへ)
1. 各メンバーがコミットするリポジトリを変更する
2. composer.json修正
3. 旧リポジトリの停止

この順番で進めていき大きなトラブルもなく移管できました。

# 旧リポジトリをcloneした新リポジトリを作成

実作業としてはリポジトリを作るだけですが、チェックポイントを列挙するとこんな感じです

+ バッチ処理用のアカウントの準備
+ 公開範囲のチェック

# 旧リポジトリへのコミットを新リポジトリへpush、同じ状態となるようにする

今回はfetchしてからpushするshellを用意し、5分ごとに実行しました。ポーリングのため最大で5分程度のラグが発生しますがこの点は目をつぶっています。gitlabには`Mirroring repositories`という設定があるのでこちらを使ってみるの良いでしょう

# デプロイ側の設定変更(旧リポジトリを参照する箇所を新リポジトリへ)

一つの環境ごとにマシンを占有させてもらって変更していきます。

## シェルの場合

+ 秘密鍵の配置
+ .ssh/configの修正
+ 疎通確認

## jenkinsの場合

+ 認証情報の追加
+ 各ジョブで参照するリポジトリ&認証情報の追加
    + この時点ではスタッフは旧を使用しているため、新/旧の両方にpushする必要がある
+ テストラン


# 各メンバーがコミットするリポジトリを変更する

+ 新しいリポジトリのアカウントの用意
+ 移行手順の作成

# composer.json修正

内製のライブラリをcomposerでインストールしていたので、参照先を切り替えるためにcomposer.jsonを書き換えます。masterブランチだけ適用して、各機能ブランチは担当者にマージしてもらった

# 旧リポジトリの停止

ここまでの作業で旧リポジトリへのアクセスはなくなっているはず。

# 番外編:最大の罠

旧リポジトリではLFSを使用せず、履歴の中に100Mを超えるサイズのファイルがあったためgithubに移せなかった。
幸い、現在では削除されたファイルのためorphanブランチを作り履歴を捨ることになりました。

# まとめ

長々と書いていますがポイントをまとめると

+ 新旧並行運用で作業やデプロイが止まらないようにする
+ 細かい単位で作業を進めていき、問題があった際の影響範囲を小さくする
+ 1ステップごとに問題が出ないようにチェックしながら進める

文章にしてしまうと当たり前なのですが、手探りの状態だと漏れがあったりします。
Go言語でエクセルデータから情報を読み取る

自分が過去に書いたテックブログの中で記載している内容なのですが、もう少し詳しい内容を記述できたらと思い記事にしました。 エクセルを読み込んでからセルを参照するまでの流れを説明していきます。

前回の記事 : [Go言語で日本語フォーマットをpdf出力](https://qiita.com/ikeponsu/items/bb2fc22a2a7969cb622c)

テックブログ : [Go言語でケアラベル発行の自動化](https://techblog.zozo.com/entry/2019/01/24/100305)

# エクセルから情報を読み込む

[xlsx](https://github.com/tealeg/xlsx)パッケージを使用しています。 実際に実装した内容を、以下に記載していきます。

## ファイルパスの作成

今回作成したCLIツールでは開発環境がMac、実行環境がWindowsだった為、filepathパッケージを使ってパスを設定しています。

```go
path := filepath.Join(ディレクトリ名, ファイル名)
```


標準パッケージでこういうものがあるのは便利ですね。

## エクセルファイルの読み込み

まずはエクセルファイル全体を読込みます。

```go
// xlsx読み込み
excel, err := xlsx.OpenFile(エクセルファイルのパス)

// エクセルが読み込めない場合
if err != nil {
log.Fatal(err)
}

```


## エクセルのシートを読み込む
シート名を元に検索します。 

```go
// シートを読み込み
sheet := excel.Sheet[シート名]

// シートが見つからない
if sheet == nil {
log.Fatal(failur open sheet., シート名)
}

```

## シート内のセルを参照

1行ごとに読み込む場合。

``` go
// 行の一番下までループ
for key, value := range sheet.Rows {
    // このループではエクセルの１行ごとに処理ができる
    // 左から0番目のセルを参照できる
    cell := value.Cells[0].Value
}
```


読み込む列を指定した上で、1行ずつ読み込む場合。

``` go
// 1、5列を読込みたい場合
// 読み込むセルの列を初期化
var readCols = []int{1, 5}

// 1、5列の順でセルを読み込む
for _, cellCol := range readCols {
    // 行の一番下までループ
    for rowKey, rowVal := range formSheet.Rows {
        // やりたい処理を書く

        // 各列で読込みたい値がある場合
        if cellCol == 1 {
            // 1行目に読込みたい値があれば
        } if cellCol == 5 {
            // 5行目に読込みたい値があれば
        }
}
```

自分が作成したシステムで文字列を読み込む場合、列指定で一行ずつ処理しています。
そして、もともと定義しておいたキーワードを見つけ、動的に変化する文章を読み取っています。

# 最後に

エクセルの読み込みに関しては、リファレンスやWeb上の情報で簡単にできました。

C#とかでも同じ様なライブラリがあり、使い方も似たような部分が多かったので、エクセル読み込まなければいけない場面に出くわしたら参考にしてみてください。
Movable Type for AWS（AMI）初期構築の記事

こんにちは、[Mylops](https://mylops.jp/?utm_source=qiita&utm_medium=social&utm_campaign=190722&utm_content=q_tr)のエンジニアをしてます後河内です。

弊社では、CMSとしてMovable Typeを使用することがあるのですが、その際にMovable Type for AWSで構築することがあります。
Movable Type for AWSとはAWSでのマーケットプレースで公開されているMovable Typeが既にインストールされている[AMI](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/AMIs.html)となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99689/e70c72e6-387a-cd8d-124d-f7f3f8be7fe6.png)

基本的にはこちらを使用すればすぐにMovable Typeを利用できることになります。

なおAWS上でのインストールについては下記の記事が参考になると思います。
https://www.sixapart.jp/movabletype/aws/how-to-use.html

弊社ではプラグインを使うために上記以外に標準で実施している設定もありますので、備忘録をかねてまとめたいと思います。


# 1.timezoneの設定
サーバ内の時刻を日本に合わせます。
これをしないと、スケジューラー機能等が予期しない時間（9時間遅れ）に動くことの原因になってしまいます。

-  /etc/sysconfig/clock　を以下の内容に変更

```
ZONE="Asia/Tokyo"
UTC=false
```

- 以下のコマンドを実行しタイムゾーンファイルの変更

```
$ sudo ln -sf  /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```


# 2.Swap領域の設定

Swap領域 とは、メモリ使用量が実メモリの量を超えると、使われていない部分が一時的に書き出される場所になります。
基本的にSwapを使用されるのは良くない状況ですので、あくまでも保険として設定するものになります。
もしSwap領域が普段から使われる場合は、サーバのスペックアップを考えた方がいいです。

## 設定方法（下記を参考にしてください。）
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ec2-memory-swap-file/

＊上記記事では4GBですが弊社ではインスタンスサイズが小さい場合1GBで作ったりします

```
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
```

# 3.MTの日本語・日本時間設定

/data/conf/mt-config.cgiに以下の設定を行います。

変更

```
DefaultLanguage      en_us
```

→

```
DefaultLanguage      ja
```

追記

```
DefaultTimezone         9
```

# 4.その他に実施していること

上記が構築時に実施していることですが、ウェブサイトをサービスとして公開するまでに以下の作業も実施してます。

### DNSの設定とSSL証明書の発行
ドメインの取得を行い、SSL証明書を発行しHTTPSで接続をできるように設定します。

### SPFレコードとDKIMの設定
迷惑メールを飛ばなくする設定をしてます。
弊社ではSESを利用することが多いです。

### バックアップの設定
弊社ではLamdaでバックアップをとるコマンドを実行してます。
インスタンスにバックアップ対象のタグと世代を設定することで自動的に毎日バックアップを取っております。

### 監視の設定
Amazon CloudWatchとZabbixを使い死活監視などもしております。


上記が弊社でMovable Type for AWSを使用する場合に標準的に実施している内容になります。


なお今回の設定についてはこちらのスライドも参考にしてます。
https://www.slideshare.net/mtajima/movable-type-for-aws
[Python] 排他的論理和についてまとめてみる

# はじめに
AtCoderのコンテストに参加したところ、[排他的論理和の問題](https://atcoder.jp/contests/agc035/tasks/agc035_a)が出てきました。
基本的なことは知っていましたが、知らない性質もあったので、
今回は排他的論理和について書きたいと思います。

# 排他的論理和とは
ビット演算などにおいて、2つの入力のどちらかが真でもう片方が偽の時に結果が真になり、
両方とも真、あるいは偽の時に結果が偽になる演算です。演算子は⊻や⊕で表示されます。
真理値表を見ると分かりやすいのですね。真が1、偽が0です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/443032/02e1aae3-ec7d-89d1-ddd4-26585dc31e44.png)

pythonでも動かしてみましょう。
pythonでの演算子は"^"です。

```python:test.py
print(1 ^ 1)
print(1 ^ 0)
print(0 ^ 1)
print(0 ^ 0)
```

```console:実行
$ python test.py
0
1
1
0
```

# 排他的論理和の性質
排他的論理和には、いくつか性質があります。

```
x ^ y == y ^ x
(x ^ y) ^ z == x ^ (y ^ z)
```
交換則、結合則が成立します。また、

```
x ^ x == 0
x ^ 0 == x
x ^ y ^ y == x
```
なども成立します。
自分自身でXORすると0になる法則は、多くのプロセッサでレジスタをゼロクリアするときに使われるそうです。
どうやら直接0を書き込むよりも早いらしい。

同じビットで2回XORすると元に戻る法則は様々な応用があり、単純なものでは、「XOR交換アルゴリズム」や「XOR連結リスト」、ｙを鍵として暗号化などが出来るそうです。

実際に「XOR交換アルゴリズム」をpythonで書いてみると、

```python:test.py
x = 3
y = 7
print(x, y)

x = x ^ y
y = x ^ y
x = x ^ y

print(x, y)
```

```console:実行
$ python test.py
3 7
7 3
```
うまく出来ていますね。

# まとめ
同じビットで2回XORすると元に戻る法則は重要そうですね。
覚えておきたいです。
plunkerでvue その5

#概要

plunkerでvueやってみた。
Vue2Leaflet使ってみた。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/63163982-c95d-f293-7de0-17275f002aef.png)


#成果物

https://embed.plnkr.co/skkNb0DmgtqGYjsdsOi3/


以上。
PWAなゲームへ広告を貼ってみた

今日もキュービィロックをボリボリ噛み砕いている「くぼひさ」です

#あいさつ

最近、html5で

TRY-UN
https://pdbg.work/

なる、あまり脳みそを使わない運ゲーな脳力パズルゲームを作っているのですが

調べ物をしている時に[ParcelでPWA化する最速の方法](https://qiita.com/sKawashima/items/51682b9dad8bdc5bb17f)を見つけたので、使ってみたら、html5のゲームがPWA対応して、しかも、pixi.jsの画像データまでキャッシュしているので、突然、html5のゲームを作っているつもりが、いつの間にかPWAのゲームを作っていた…　もしかして、スタンド！？（To be continued...）

で、PWAはアプリ的な使い方も出来るので広告バーナーを貼ろうと思ったけど、現在、PWA広告配信サービスがほとんど無いので、普通のバーナーを貼るため、TypeScriptでプログラムしてみました

#実装

簡単にCSSでボックスを作って、JavaScriptから表示、非表示を操作しています

index.htmlのBODYへ、

```html:index.html
<div id="ads"></div>
```

を足し、index.htmlのCSSで、

```css:index.html
#ads {
	margin:0 auto; padding:0; background-color: rgba(0, 0, 0, 0); position: absolute;
	width:100%; height:60px; bottom:0px; left:0px; z-index: 100;
	visibility: hidden;
}
```

と、表示場所を移動させ、優先順位を全面へ移動させます

そして、それを操作するのは、

```typescript:adsLib.ts
export namespace adsLib {
	export function visible() :void {
		// モバイルでなければ実行するな
		var ua = navigator.userAgent;
		var flag = 0;
		if (ua.indexOf('iPhone') > 0 || ua.indexOf('iPod') > 0 || ua.indexOf('Android') > 0 && ua.indexOf('Mobile') > 0) {
			flag = 1;
		} else if(ua.indexOf('iPad') > 0 || ua.indexOf('Android') > 0){
			flag = 1;
		}
		if (flag == 0) {
			return;
		}
		
		document.getElementById('ads').innerHTML = '（バーナーのhtml）';
		document.getElementById("ads").style.visibility="visible";
	}
	
	export function hidden() :void {
		document.getElementById('ads').innerHTML = '';
		document.getElementById("ads").style.visibility="hidden";
	}
}
```

と、個人的趣味でNameSpaceを使ったデータ指向プログラミングでゲームを作っているので、そうライブラリを作ってますが、普通にJavaScriptを使って、divでDOM操作をしているプログラムになるので、JavaScriptへ移植する等は簡単だと思います。index.htmlのadsボックスの大きさはバーナーへ合わせます

使い方は、

import {adsLib} from './adsLib';

でインポートして、adsLib.visible()でDOMへバーナーのHTMLを流し込み、CSSを表示。adsLib.hidden()でCSSを非表示してます

UserAgentでモバイル判定しているのは、バーナーがスマホ向けのバーナーなので、スマホとタブレットしかバーナーを表示してない為です

#まとめ

PWAならずとも、HTML5のゲームでもバーナーを貼って収益化できる（かも知れない）状態にできました

これを公開すると、JavaScriptでAndroidのゲームを作ってGooglePlayストアで無料のゲームへバーナーを貼っている人や、JavaScriptでゲームを作ったけどMacを持ってないのでAppleAppストアへ出れない人がPWAのゲームを作って、５００円程度の安いさくらインターネットのサーバーでゲームを無料で公開して収益化を狙うかも知れないと公開を４分程度、躊躇（ちゅうちょ）してましたが、公開しました

HTML5やPWAは、まだまだ、ネイティブアプリには負けるし、不確定な部分も多いとは思いますが、お手軽にゲームが作れるので、そうなるかどうかは判らない変な夢を見ながらゲームを作ってみてはどうでしょう？

#おまけ
####広告バーナーのセンター表示

```html:index.html
body {
  text-align: center;
}
```

と、htmlのbodyのCSSへ足すと、お手軽にバーナーを中央寄せできますよ

####追記：nendのバーナーを取得してみた

モバイル専門広告配信サービス「nend」
https://nend.net/

のバーナーを取得して表示してみました

まず、html5やPWAのゲームの場合、「ゲームのウェブ」扱いになるので、アプリではなく、ウェブで申請すると審査が通ります

取得したバーナーはスマホとタブレット両方で表示するので、「インラインの320x50」を取得しました

nendのバーナーのhtmlはJavascriptになるので、DOM追加機能での実行はできません。なので、

```html:index.html
<body><div id="ads">（nendのバーナーhtml）</div>
```

bodyタグの直後で広告表示の為のdivを追記し、ゲームのJavascriptよりも速く実行する為、ゲームのスクリプトよりも上へ置き、

```typescript:adsLib.ts
//		document.getElementById('ads').innerHTML = '（バーナーのhtml）';
```

```typescript:adsLib.ts
//		document.getElementById('ads').innerHTML = '';
```

DOMへの広告追加、削除する部分をコメントアウトします。あと、nendのバーナーはスマホとタブレットしか表示しませんので、機種判別の部分もコメントアウトする方が良いです

（パソコンでデバッグしていて、バーナーが表示されなくて、あわててたのは内緒…）

本当なら、JavascriptではないHTMLバーナーで、他の配信サービスとローテーション表示出来たら良かったのですけど、今回はそうはいかなかったのが残念です。でも、有名所のスマホゲームのバーナーが表示しているので、結構、上がります

追記は以上です
WindowsでRuby on Railsの環境構築してみる

お仕事でRubyを使う機会ができたので環境構築してみる

# まずはRubyのインストール
[公式](https://www.ruby-lang.org/ja/)見てみると
「WindowsでRubyやるならこちら」的なのがあるからそっからどれか選ぶ
僕はRubyInstallerを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195499/cb39b69d-7b07-1252-6b52-842da2aaeff9.png)

次に[RubyInstaller](https://rubyinstaller.org/downloads/)から安定板っぽいヤツを選ぶ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195499/293caa73-b0b4-523f-0525-8189d26c3126.png)

後はセットアップの画面に従って次へ次へと進むだけ
~~スクショ取り忘れたけど~~かっこよいインストール画面が終わるとRubyのインストール終了です

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195499/691ac170-6085-b6e9-1e14-dc313c243e64.png)


コマンドプロンプトでいつもの

```bash
> ruby --version
```
RubyのバージョンはRubyInstallerから選んだ時のヤツってことねー

`irb`ってヤツでRubyが使えるようになるらしい
コピったHello Worldを出力してみた
終わるときは`quit`

# 次はRuby on Railsのインストール
Ruby入れたら`gem`ってコマンドが使えるようになった

```bash
> gem --version
```
Ruby on Railsはgem使ってインストールするっぽい

```bash
> gem install rails
```
お仕事で使うことになるからバージョン指定方法も調べとこう

```bash
gem install rails --version="3.2.17"
```
こんな感じらしい

そんでまたバージョン見てみる

```bash
> rails --version
Rails 5.2.3
```
おっけーおっけー


# プロジェクト作ってみる
`rails new うんたら`で作れるっぽいから早速やってみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195499/7bf6add5-82fd-cb9a-79e3-7d51f9c231ad.png)
くそう・・・sqlite3入れろ言われた
ってことで`gem install sqlite3`
これもまたバージョン指定できるかな
にしても何に使うのやら

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195499/556bd3d7-f735-6124-23f4-f7b18e197136.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195499/23207cdf-e2d8-3140-372d-ed90c28bc48c.png)
うまくいったっぽいので、改めて`rails new うんたら`

・・・

うまくいったっぽい！

# 動かしてみる

```bash
rails server
```
もう動かせるっぽいぞー！

localhost:3000にアクセスして・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/195499/9b66058c-8816-66f9-c091-75f65e7822bc.png)
いえーい！
レポート（深層学習ー１）

＜前編１＞
Section1：入力層～中間層
・入力層は、深層学習における情報（数値データ）の入り口あたる。この入力層の数値データに、それぞれに重みづけとして、バイアスを加えてから中間層に情報（数値データ）を伝達させる。

Section2：活性化関数
・入力層（もしくは１つ前の中間層）からわたされた数値データに対して、次の層への出力の大きさの判定を行う非線形関数が活性化関数である。中間層における活性化関数には、ReLU関数、シグモイド関数、ステップ関数が主に使われている。出力層の活性化関数には、ソフトマックス関数、恒等写像、シグモイド関数が主に使われる。

Section3：出力層
・出力層では、ニューラルネットワークから出力された値と実際の値（正解）との誤差（誤算関数）を求め、誤差を小さくする重み、バイアスを計算していく。（誤差逆伝播法）
・出力層の活性化関数は、回帰問題には恒等写像、二値分類にはシグモイド関数、多値分類にはソフトマックス関数が用いられる。また、誤算関数は、回帰問題には二乗誤差、分類問題には、交差エントロピーが用いられる。

Section4：勾配降下法
・勾配降下法とは、出力値と正解値との誤差を最小化する重みを見つけることが目的である。誤差関数の微分をとり、正負が変化した値での微分と学習率から次のｘの値を求める。またその値ｘでの微分（傾き）を求めていく。これを繰り返して、誤差関数の最小値を求めていく。この場合、学習率の値がポイントとなり、学習率が小さいと、計算回数が増大し、最小値を見つけるまでに時間がかかる。逆に大きいと、最小値となるｘの値に辿りつけず、発散してしまう問題がある。
・全データの平均誤差を最小にしていく方法が勾配降下法。ランダムに抽出したデータのの誤差を小さくしていくことを確率的勾配降下法。ランダムな集合体にデータをまとめて、その集合体のデータの平均誤差を小さくしていくことをミニバッチ勾配降下法という。

Section5：誤差逆伝播法
・出力層側での誤差を微分して、入力層側に重みを伝播させる方法。この手法を、全出力層、隠れ層に対して繰り返し行うことによって、ニューラルネットワーク内の全ての重みを、誤差関数が最小となるように変化させる。


＜前編２＞
Section1：勾配消失問題
・誤差逆伝播法において、下位層に近づくにしたがって、傾きが緩やかになり、勾配降下法では、収束しにくくなる。このことを勾配消失問題という。
・この問題に対する対策として、３つの方法が挙げられる。
①活性化関数をシグモイド関数からＲｅＬＵ関数にする。シグモイド関数では、０～１への変化が緩やかであるが、ＲｅＬＵ関数では、ｘ＝０を境に、負の場合は（ほぼ）０、正の場合はｘの値を返すため、収束がしやすくなる。
②重みの初期値の設定方法を、重みの要素を前の層のノード数の平方根で除算した値、もしくは平方根で除算した値に√２を掛けた値とする。これは、重みの初期値を０にすると、全てのデータが同じ値で次の層に渡されるため、収束しにくくなることを防ぐためである。
③バッチの正規化
ミニバッチ単位でデータの偏りを抑制する方法で、活性化関数に渡す前後に処理を加える。

Section2：学習率最適化手法
・学習率は、勾配降下法の際に述べたとおり、大きくすると収束しなくなり、小さくすると収束に時間がかかる。よって、計算初期の学習率を大きくし、徐々に小さくしていくと、局所最適値に辿りつきやすい。その手法を学習率最適化手法という。
①モメンタム：誤差をパラメータで微分したものと学習率の積を減算した後、現在の重みに前回の重みを減算した値と慣性の積を加算する。
②ＡｄａＧｒａｄ：誤差をパラメータで微分したものと再定義した学習率の積を減算する。
③ＲＭＳＰｒｏｐ：誤差をパラメータで微分したものと再定義した学習率の積を減算する。
④Ａｄａｍ：モメンタムとＲＭＳＰｒｏｐの両方を含んだ手法で、一般的によく使われる。

Section3：過学習
・訓練誤差と検証誤差の学習曲線が乖離する状態を過学習という。訓練データでの学習時に、パラメータの数を多い場合やノードが多い場合、訓練データに合わし込み過ぎて、訓練データに特化した構成となっている。そのため、検証データでの誤差が、訓練データでの誤差より大きくかい離する形となる。

Section4：畳み込みニューラルネットワークの概念
・畳み込みニューラルネットワーク（以下ＣＮＮ）の構造は、例として、入力画像→畳み込み層→畳み込み層→プーリング層→畳み込み層→畳み込み層→プーリング層→全結合層→出力層、となる。
・畳み込み層では、切り出した入力画像に対しフィルターを使って画像の特徴量を出力値とし、バイアスを加えて活性化関数を使って出力画像を求める。その画像を切り出す際、入力画像の最外層にパディングの値分だけ画素数を増やし、フィルターをストライドの値に合わせてずらして切り出していく。そうやって切り出した画像の特徴量を出力していく。
・プーリング層では、入力画像から取り出した対象領域を、ＭＡＸプーリングなら値の最大値を、平均プーリングなら平均値を出力値とする。

Section5：最新のＣＮＮ
・2012年に開催された画像認識コンペティション(ILSVRC)で、AlexNetが１位となった。この画像認識ソフトが、ディープラーニングを使っていたことで、注目が集まった。その時のAlexNetのモデルは、５層の畳み込み層とプーリング層、３層の全結合層から構成されていた。
・その後も画像認識ソフトの精度は飛躍的に伸び、2014年に公開されたVGGNetは、16層や19層もの深い層構造であって学習を収束させ、認識精度が向上することが確認された。また、2015年のResNetでは、出力ターゲットを入力との残差で表すResidual Blockを使用し、100層を超える深さのネットワークを実現した。
SQLCMDコマンドの実行結果をログファイルに出力しよう

# はじめに
　さて、[前回の記事](https://qiita.com/erik_tnk/items/e634c9d549e93e5badd5)でSELECT結果をCSV出力することが可能になりました。
しかし、SQLCMDコマンドでエラーが起きたらどうしましょう？

　そのバッチファイルの処理を1回だけ実行するだけなら、CSVファイルにエラー内容が出力されます。
しかし、タイムスケジューラーで何度も実行するとしたら？
CSVファイルがどんどん上書きされてしまうから
いつどんなエラーが起きてるかわからなくなってしまいますよね。
（ここではCSVファイルのファイル名に日時を出力していくつもファイルを作ることをしないことにします。）

　そこで、[前回の記事](https://qiita.com/erik_tnk/items/e634c9d549e93e5badd5)で作成したバッチファイルに追記して、
SQLCMDコマンドの実行結果をログファイルに出力してみましょう。

# どうやってSQLCMDコマンドのエラーを検知するの？
`%ERRORLEVEL%`を使います。
[前回の記事](https://qiita.com/erik_tnk/items/e634c9d549e93e5badd5)で作成したバッチファイルに以下を追記しましょう。

```test.bat

set d=%date%
set t=%time: =0%

sqlcmd -S svname1 -d dbname1 -U user1 -P test1 -i test.sql -v param='9999' -b -s, -W -o test.csv

if %errorlevel% equ 0 (
  echo %d% %t% test.sql It ended normally. >> log.txt
) else (
  echo %d% %t% test.sql It ended abnormally. >> log.txt
)
```

追記したtest.batをダブルクリックして実行してみましょう。
test.batと同じディレクトリに、test.csvとlog.txtが生成されたはずです。

test.csvにはSELECT結果、log.txtには実行結果が出力されています。

# 解説
```
set d=%date%　...日付をyyyy/mm/dd形式で取得する
set t=%time: =0%　...時間をhh:mn:ss形式で取得する。
　　　　　　　　　　　timeコマンドのみだと、hh:mn:ss形式で取得できない。

```
ログファイルに出力するための現在日時を取得します。


```
sqlcmd -S svname1 -d dbname1 -U user1 -P test1 -i test.sql -v param='9999' -b -s, -W -o test.csv
```
[前回の記事](https://qiita.com/erik_tnk/items/e634c9d549e93e5badd5)参照。

```
if %errorlevel% equ 0 (
  echo %d% %t% test.sql It ended normally. >> log.txt
) else (
  echo %d% %t% test.sql It ended abnormally. >> log.txt
)
```

`%ERRORLEVEL%`が0の時は正常終了なので、「`yyyy/mm/dd hh:mn:ss`(現在日時) test.sql It ended normally.」とlog.txtに出力し、そうでない場合は異常終了なので、「`yyyy/mm/dd hh:mn:ss`(現在日時) test.sql It ended abnormally.」と出力します。

# そのうち調べたいこと
`%ERRORLEVEL%`の値によって、どういうエラーを表すかとかそういうことがわかると便利そうですよね。知りたい。

# 参考
[バッチファイルで現在時刻をyyyy/mm/dd hh: mm:ss形式で取得するための備忘録](http://hiroto1979.hatenablog.jp/entry/2017/10/14/003418)
[sqlcmdを実行するWindowsバッチ](https://qiita.com/Amebayashi/items/571fb7ad2d4029b8320e)

# 関連ページ
[SQLServerのデータをCSVに出力するバッチファイルを作ろう](https://qiita.com/erik_tnk/items/e634c9d549e93e5badd5)
SQLServerのデータをCSVに出力するバッチファイルを作ろう

バッチでSQLServerのSELECTの結果をCSVで出力する必要があったのでメモ。

# 使用ツール
・テキストエディタ
・SQLServer環境

# 手順
1. バッチファイルを作成する。
2. SQLファイルを作成する
3. 実行！

# 1. バッチファイルを作成する。
テキストエディタで下記のように記述しましょう。ファイル名はtest.batにしました。

サーバー認証方法がSQLServer認証の場合

```test.bat
sqlcmd -S svname1 -d dbname1 -U user1 -P test1 -i test.sql -v param='9999' -b -s, -W -o test.csv
```

サーバー認証方法がWindows認証の場合

```test.bat
sqlcmd -S localhost -E -i test.sql -v param='9999' -b -s, -W -o test.csv
```

## パラメータの意味
<table border="1">
    <tr>
        <th>オプション<br>(パラメータ)</th><th>説明</th><th>指定値</th>
    </tr>
    <tr>
        <td>-S</td><td>サーバ名</td><td>svname1</td>
    </tr>
    <tr>
        <td>-E</td><td>ユーザー名とパスワードを使用せずに<br>セキュリティ接続を使用して<br>SQL Server にサインイン</td><td>-</td>
    </tr>
    <tr>
        <td>-d</td><td>DB名</td><td>dbname1</td>
    </tr>
    <tr>
        <td>-U</td><td>ユーザ名</td><td>user1</td>
    </tr>
    <tr>
        <td>-P</td><td>パスワード</td><td>test1</td>
    </tr>
    <tr>
        <td>-i</td><td>SQLファイル名</td><td>test.sql</td>
    </tr>
<tr>
        <td>-v</td><td>変数</td><td>param='9999'</td>
    </tr>
    <tr>
        <td>-b</td><td>エラーが発生したときに、sqlcmd を終了し、<br>DOS ERRORLEVEL 値を返すようにする。</td><td>-</td>
    </tr>
    <tr>
        <td>-s</td><td>区切り文字を指定する。<br>アンパサンド (&)、セミコロン (;) など、<br>特別な意味を持つ文字を使用する場合は、<br>ダブルクォーテーション (") で囲む。</td><td>-</td>
    </tr>
    <tr>
        <td>-W</td><td>後続の空白を削除する。</td><td>-</td>
    </tr>
    <tr>
        <td>-o</td><td>出力するファイルを指定する。</td><td>-</td>
    </tr>
</table>

## 注意点
バッチファイルをダブルクリックして実行する場合は、test.sqlやtest.csvがバッチファイルが置いてあるディレクトリにあると判断されますが、タスクスケジューラーを用いて定時に実行するなどするときは、ファイル名は絶対パスで書いてないと実行されません。

# 2. SQLファイルを作成する
テキストエディタで下記のように記述しましょう。ファイル名はtest.sqlにしました。

```test.sql
set nocount on

select
    *
from
    testtable
where
    id = $(param)

set nocount off
```

## 解説

```
set nocount on
set nocount off
```

この記述がないと、出力したCSVファイルに「n件処理されました。」と出力されてしまいます。
逆に必要ならこの記述は省きましょう。


```
where
    id = $(param)
```

1. バッチファイルを作成する。で作成したバッチファイルに記載した、`param='9999'`をwhere句に指定しています。
ちなみにバッチファイルに、`param='9998', '9999'`と記載して、where句を以下のように記載すると、複数のidを検索することもできます。

```
where
    id in ( $(param) )
```
ただ、paramが長すぎると実行時にエラーになってしまうのでそういう時は違うSQLを考えましょう。

sqlに条件句がいらないときはバッチファイルから-v param='9999'を省いてください。

## よくわからなかった点
[ここ](http://chintongame.hatenablog.com/entry/2014/11/27/175254)に「※実行結果を返したいときはSQLをEXITで囲むといい」と記載があり、やってみたところエラーになってしまいました...なぜ。。。よくわからないのでまた別途調べます。

```
EXIT(
set nocount on

select
    *
from
    testtable
where
    id = $(param)

set nocount off
)
```
# 3. 実行！
作成したバッチファイルをダブルクリックしてみましょう。test.csvにSELECT結果が出力されています。

# ちなみに
-oオプションではなく、2>&1を使用しても、同じように結果が出力されます。

```test.bat
sqlcmd -S localhost -E -i test.sql -v param='9999' -b -s, -W > test.csv 2>&1
```


# 参考サイト
[SQLServerでselectの結果をCSVで出力する方法。](http://note.mokuzine.net/sqlserver-csv-out/)
[SQLServerのDBをバッチファイルでバックアップ-パート２](https://ameblo.jp/hamuhamleta/entry-10990972881.html)
[batファイルでSQLServerのSelect結果をCSV形式で出力する。](http://chintongame.hatenablog.com/entry/2014/11/27/175254)
[バッチファイルからsqlcmd(SQLServer)の戻り値を取得！なんちゃって](http://nobuit.blog56.fc2.com/blog-entry-221.html)

# 関連ページ
[SQLCMDコマンドの実行結果をログファイルに出力しよう](https://qiita.com/erik_tnk/items/9f4a123dfa2ecb3e1129)
WinSCPを使用してLinuxサーバーとWindowsPC間でバッチで自動的にファイルをやり取りする

# はじめに
　LinuxサーバーからWindowsPC、
またはWindowsPCからLinuxサーバーにファイルを毎日自動的にアップロード、
ダウンロードできたらいいなと誰しも一度は考えたことがあると思います。
そんな夢をバッチファイルとWindowsのタスクスケジューラで簡単に叶えることができます。

そう、WinSCPならね。
# 使用ツール
・WinSCP
・テキストエディタ
・タスク スケジューラー
# 手順
1. バッチファイルを作る
2. WinSCPのコマンドモードでの処理を記述したファイルを作る
3. タスクスケジューラーに登録する

# 1. バッチファイルを作る
シンプルに、Linuxサーバー上にあるファイルをダウンロードするバッチファイルを作ります。
バッチファイルの名前は何でもいいですが、ここではgetFile.batにします。
テキストエディタを開いて以下のように記述しましょう。

```getFile.bat
"C:\Program Files (x86)\WinSCP\WinSCP.exe" /console /script="C:\batch\getFileByWinSCP.txt"
cd C:\batch\file
```

## バッチファイルの中身解説

```
"C:\Program Files (x86)\WinSCP\WinSCP.exe" /console /script="C:\batch\getFileByWinSCP.txt"
```
WinSCPをコマンドモードで起動して、C:\batch\getFileByWinSCP.txt（後述）に書いてある処理を呼び出しています。Pathはデフォルトでこれだと思いますが、各自環境に合わせて変更してください。

```
cd C:\batch\file
```
バッチのカレントディレクトリをC:\batch\fileに移動しています。ダウンロードしたファイルがこのパスに配置されます。
# 2. WinSCPのコマンドモードでの処理を記述したファイルを作る
上記で作成したバッチファイルから呼び出すための、WinSCPのコマンドモードでの処理を記述したファイルを作ります。
ファイル名もこれまた何でもいいのですが、ここではgetFileByWinSCP.txtにしましょう。なんと拡張子も何でもいいです。
テキストエディタを開いて以下のように記述しましょう。

```getFileByWinSCP.txt
option batch on
open sftp://username:password@123.456.789.012:22
cd /backup
lcd "C:\batch\file"
get file.txt
exit
```

## WinSCPのコマンドモードでの処理解説

```
option batch on
```
バッチモードで実行するので、～しますか？のような確認をしないようにします。

```
open sftp://username:password@123.456.789.012:22
```
SFTPのログイン。username:passwordは文字通りユーザー名とパスワード。
123.456.789.012:22は各自環境に合わせてIPアドレスとポート番号を入力してください。

```
cd /backup
```

サーバー側のカレントディレクトリを、ダウンロードしたいファイルのある所に移動しています。
環境に合わせて変えてください。

```
lcd "C:\batch\file"
```

ローカル側のカレントディレクトリを、ダウンロードしたいファイルを置く場所へ移動します。

```
get file.txt
```

file.txtというファイルをダウンロードします。ファイル名は各自変更してください。

```
exit
```

WinSCPを終了します。

# 3. タスクスケジューラーに登録する
Windowsのタスクスケジューラーを起動して、作成したバッチファイルをお好きな時間に実行するよう登録しましょう。

# 所感
これすごく便利だなーと思ったのが、サーバー側の処理とWindows側の処理が、一つのバッチファイルで完結するところですね。
コマンドモードでSFTPのログインしてしまえば↓みたいにmysqlの処理とかも呼べるので、
定時でサーバーに乗ってるMySqlのDBからCSVにデータを出力して、そのCSVをダウンロードするとかもできます。

```
call mysql -u username --password=password -e "`cat mysql_SQL.sql`" -s -N > sqlResult.csv

```
すごい。可能性しか感じない。
# 参考
[毎日、SFTPで自動的にWINDOWSPCにファイルをダウンロードする](http://altenergy-system.com/archives/3242)
[winSCPのコマンドリファレンス](https://ja.osdn.net/projects/winscp/wiki/script_commands)
リーダブルコード チートシート

# はじめに
リーダブルコードを読み、
可読性の高いコーディングをするために
気をつけるべきポイントをメモしておきます

## 全体
- 他人が最短で理解できるコードを書く

## 変数名
- 他人が誤解せずに理解できる名前をつける
    - 明確な単語
    - 具体性
- 名前に情報を詰め込む
    - フォーマット

## コメント
- 簡潔に
- 当たり前、コードを読めばわかることはコメントしない
- 自分の考え、理想をコメントする
    - 挙動が一致していないときに指摘できる
    - TODOなど、改善案件をコメントするのも良い
- 読み手にとって何が必要かを考える
    - 定数にコメントをつける
    - ハマりそうなところを告知

## 定義

## ロジック

### 条件式


### ループ
【複合機：無線設定不具合対応】brother DCP-L2540DW の無線経由でのスキャナーが認識しない


# 現象

　複合機の無線設定はできているのに、Windows10Pro上のControl Centerなどスキャナ専用ソフトから認識されない。

# 確認

- 複合機の通信状態でIPアドレスを確認
- IPアドレスにPingをおくり疎通を確認（応答あり）

# 対処

- フルパッケージを再ダウンロード後、再インストール
- 再インストール時に、複合機を起動し、無線LANに接続しておく。
- インストール時に、無線経由で複合機を探索するよう設定する。


[ ▶ パッケージダウンロード ](https://support.brother.co.jp/j/b/downloadhowto.aspx?c=jp&lang=ja&prod=dcpl2540dw&os=10013&dlid=dlf101651_000&flang=1001&type3=11)

# 原因推定

- 最初にパッケージソフトをインストールしたとき、有線LANで接続していた。
- 途中から無線設定をした。このときに、無線の認識ができていなかった。