OmniAICreator/Qiita-1.07M huggingface dataset:
[swift5]iOSアプリでApp Groupsを実装

アプリ間でのデータ共有を実装する方法を紹介します！
本ページでは、App Groups を利用します。

## 動作環境

| 対象 | バージョン |
|---|---|
| iOS | 13.3 |
| macOS | Catalina 10.15.2 |
| Xcode | 11.3.1 |
| Swift | 5.1.3 |

## データ共有機能（App Groups）の実装

アプリ間でデータを共有するため、アプリは2つ作成します。

1. データを表示・変更するアプリ
2. データを表示のみするアプリ

1, 2 で同じデータを表示します。

## アプリの設定（2つのアプリ共通）

2つのアプリで設定してください。

1. 「Signing & Capabilities」から「App Groups」を追加する
2. グループ名を追加する

### ファイル作成（2つのアプリ共通）

- Storyboard
    - ここでは、"AppGroups.storyboard" とします
- ViewController.swift
    - ここでは、"AppGroupsViewController.swift" とします

### 画面を作成（データを表示・変更するアプリ）

Storyboard に、以下を載っけます。

1. 共有データを表示するラベル
2. 共有データを変更するテキストフィールド
3. 共有データを変更するボタン

### 画面とソースの紐付け（データを表示・変更するアプリ）

ソースコード上に紐付けします。

```swift
/// 共有データを表示するラベル
@IBOutlet weak var valueLabel: UILabel!
/// 共有データを変更するテキストフィールド
@IBOutlet weak var updateValueTextField: UITextField!
/// 変更ボタンを押下した際の処理
/// - Parameter sender: 変更ボタン
@IBAction func updateValueButton(_ sender: Any) {
    valueLabel.text = updateValueTextField.text

    let userDefaults = UserDefaults(suiteName: groupID)
    userDefaults?.set(valueLabel.text, forKey: "DataStore")
}
```

## ソースコード（データを表示・変更するアプリ）

```swift
import UIKit

class AppGroupsViewController: UIViewController {

    let groupID = "（グループ名を記入してください）"
    /// 共有データを表示するラベル
    @IBOutlet weak var valueLabel: UILabel!
    /// 共有データを変更するテキストフィールド
    @IBOutlet weak var updateValueTextField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        let userDefaults = UserDefaults(suiteName: groupID)
        userDefaults?.register(defaults: ["DataStore": "default"])
        valueLabel.text = userDefaults?.object(forKey: "DataStore") as? String
    }

    /// 変更ボタンを押下した際の処理
    /// - Parameter sender: 変更ボタン
    @IBAction func updateValueButton(_ sender: Any) {
        valueLabel.text = updateValueTextField.text

        let userDefaults = UserDefaults(suiteName: groupID)
        userDefaults?.set(valueLabel.text, forKey: "DataStore")
    }
}
```

### 画面を作成（データを表示のみするアプリ）

Storyboard に、以下を載っけます。

1. 共有データを表示するラベル

### 画面とソースの紐付け（データを表示のみするアプリ）

ソースコード上に紐付けします。

## ソースコード（データを表示のみアプリ）

```swift
import UIKit

class AppGroupsViewController: UIViewController {

    let userDefaults = UserDefaults.standard
    let groupId = "（グループ名を記入してください）"

    /// 共有データを表示するラベル
    @IBOutlet weak var valueLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        let userDefaults = UserDefaults(suiteName: groupId)
        userDefaults?.register(defaults: ["DataStore": "default"])
        valueLabel.text = userDefaults?.object(forKey: "DataStore") as? String
    }
}
```
Pytestのjunitxmlオプションを付けると警告がでた

# 現象
pytestの勉強中に、テスト結果をJUnit形式で出力してJenkinsに食わせようと思い、--jnuixmlオプションを付けたら下記の警告メッセージが表示された

```
============================================================== warnings summary ==============================================================
/usr/local/lib/python3.7/site-packages/_pytest/junitxml.py:436
  /usr/local/lib/python3.7/site-packages/_pytest/junitxml.py:436: PytestDeprecationWarning: The 'junit_family' default value will change to 'xunit2' in pytest 6.0.
  Add 'junit_family=xunit1' to your pytest.ini file to keep the current format in future versions of pytest and silence this warning.
    _issue_warning_captured(deprecated.JUNIT_XML_DEFAULT_FAMILY, config.hook, 2)

-- Docs: https://docs.pytest.org/en/latest/warnings.html
----------------------------------- generated xml file: /Users/hoge/hoge/sandbox/python/pytest/path ------------------------------------
```

# 解決策

公式ドキュメント[link-1]を見ると、pytest.iniにjunit_familyを明示すれば良いと書いてあったので、同じディレクトリ内に保存して実行すれば無事に警告が消えた。

```
#pytest.ini
[pytest]
junit_family=legacy
```



# 参考URL
[Deprecations and Removals][link-1]

[link-1]:https://docs.pytest.org/en/latest/deprecations.html#junit-family-default-value-change-to-xunit2
シンボリックリンクを貼る方法

シンボリックリンクを貼ることで、設定ファイル等を1つのディレクトリで管理することができるようになります。以下、コマンドです。

```terminal
$ ln -sf <参照したいファイルのpath> <作成するシンボリックリンクのpath>
```
(使用例)

```terminal
$ ln -sf ~/dotfiles/.zshrc ~/.zshrc
```

##注意
シンボリックリンクを貼りたい場所に、すでに同名のディレクトリがある場合、そのディレクトリ以下にシンボリックリンクが作られてしまうみたいです。
JavaScript map()で上手く新しい配列が作れなかった話

JSに慣れていなくて、配列に対して処理を行う``map()``で上手く配列が作成できなかった話。


# mapでの配列新規作成
numを要素に持つ```objArray1```配列を定義し、mapを使ってnumを２倍にした```objArray２```を新しく作成しようとした。

```JS
const objArray1 = [{num:1}, {num:3}, {num:5}];

const objArray2 = objArray1.map(obj => {
    obj.num = obj.num *2;
    return obj;
});

console.log(objArray1); // {num:2}, {num:6}, {num:10}
console.log(objArray2); // {num:2}, {num:6}, {num:10}
```

すると``objArray1``と``objArray2``が同じになってしまった。

``map()``は新しく配列を生成するメソッドと聞いていたが、各要素に対しては参照渡しするだけなのねーと思い、以下の通りにソースコードを修正した。

```JS
const objArray1 = [{num:1}, {num:3}, {num:5}];
const objArray2 = objArray1.map(obj => {
        const newObj = {num: obj.num * 2};
        return newObj;
    });
console.log(objArray1); // {num:1}, {num:3}, {num:5}
console.log(objArray2); // {num:2}, {num:6}, {num:10}
```
これで思う通りに配列が作成できた。

# 数値型の配列の場合
多分数値はプリミティブ型（？！）なのかと思い、数値の配列で同様のことを試してみた。

```JS
const numArray1 = [1, 3, 5];
const numArray2 = numArray1.map(num => {
    return num * 2;
});
console.log(numArray1); // [1, 3, 5]
console.log(numArray2); // [2, 6, 10]
```
これは上手くいった。

#Javascriptにおけるプリミティブ型とオブジェクト
数値型以外に何がプリミティブ型なのかなー、と思い調べたところ。
``数値, 文字列, Bool, undefined, null``がプリミティブ型。
それ以外はすべてオブジェクト型、だそうである。

Javaとは違って文字列もプリミティブ型なのかー、と思った。
OpenFOAMリリース日

OpenFOAM 関連ソースコードのリリース日を整理します。

| date       | Foundation | OpenCFD－ESI | Extend |
|:-----------|:----------:|:------------:|:-------|
| 2021/07/20 |  9       |              |        |
| 2021/06/28 |          | v2106        |        |
| 2020/12/23 |          | v2012        |        |
| 2020/07/22 |  8       |              |        |
| 2020/06/30 |          | v2006        |        |
| 2019/12/23 |          | v1912        |        |
| 2019/09/26 |          |              | foam-extend-4.1 |
| 2019/07/08 |  7       |              |        |
| 2019/06/27 |          | v1906        |        |
| 2018/12/20 |          | v1812        |        |
| 2018/07/10 |  6       |              |        |
| 2018/06/29 | 	        | v1806        |        |
| 2017/12/31 |          | v1712        |        |
| 2017/07/25 |  5.0     |              |        |
| 2017/06/30 |          | v1706<br/> Foundation code 2017/04/26 |        |
| 2016/12/23 | 	        | v1612+<br/> Foundation code 2016/12/09 |        |
| 2016/12/22 |          |              | foam-extend-4.0 |
| 2016/06/30 |          | v1606+<br/> Foundation code 2016/04/21 |        |
| 2016/06/28 |  4.0     |              |        |
| 2016/01/13 |          | v3.0+<br/> Foundation code 2016/04/21|        |
| 2015/11/04 |  3.0.0   |              |        |
| 2015/08    |          |              | foam-extend-3.2 |
| 2015/05/22 |  2.4.0   |              |        |
| 2014/12/10 |  2.3.1   |              |        |
| 2014/06/08 |          |              | foam-extend-3.1 |
| 2013/12/18 |          |              | foam-extend-3.0 |


https://openfoamwiki.net/index.php/Main_Page

Foundation版の 2.0以前のバージョンは，OpenCFDによりリリースされている。2011年8月に，OpenCFDからOpenFOAM Foundationにownershipが移転された。

http://openfoam.org/release/9/
http://openfoam.org/release/8/
http://openfoam.org/release/7/
http://openfoam.org/release/6/
http://openfoam.org/release/5-0/
http://openfoam.org/release/4-0/
http://openfoam.org/release/3-0-0/
https://openfoam.org/release/2-4-0/
https://openfoam.org/release/2-3-1/
･･･ 
https://openfoam.org/release/1-4/
https://openfoam.org/release/1-3/
https://openfoam.org/release/1-2/

https://www.openfoam.com/download/release-history
https://www.openfoam.com/news/main-news/openfoam-v20-12
https://www.openfoam.com/news/main-news/openfoam-v20-06
https://www.openfoam.com/releases/openfoam-v1912/
https://www.openfoam.com/releases/openfoam-v1906/
https://www.openfoam.com/releases/openfoam-v1812/
https://www.openfoam.com/releases/openfoam-v1806/
http://www.openfoam.com/releases/openfoam-v1712/
http://www.openfoam.com/releases/openfoam-v1706/
https://www.openfoam.com/releases/openfoam-v1606+/

https://sourceforge.net/p/foam-extend/foam-extend-4.1/ci/v4.1/tree/
https://sourceforge.net/p/foam-extend/foam-extend-4.0/ci/master/tree/ReleaseNotes.txt
【Rails】 DataTables 検索結果の保持方法

# はじめに
これまでに Rails + DataTable 関連の記事を書いてきましたが、別のページから戻ってきた時に検索結果を保持していて欲しいなどのユーザーの要望があるかと思いますので、そのような細かい設定の変更方法について今回はまとめさせていただきます。


#### 関連リンク
関連リンクを下記に載せておくので、必要であれば参考にしてください。。

* 【Rails】 DataTables 実装方法
    * https://qiita.com/syukan3/items/5ac9f0d1b43334b5eb13
* 【Rails】 DataTables 動的にカラムを変更する方法
    * https://qiita.com/syukan3/items/83c4ecd351db57911943


# 検索結果の保持方法
次の２つを設定するだけで、検索結果を保持してくれるようになります。

* stateSave
* stateDuration


```coffeescript:app/assets/javascripts/concern/datatables.coffee
class @DataTables
  # *** 省略 ***
  drawTable: ->
    # *** 省略 ***

    # stateSave : 別のページから戻ってきた時に検索結果を保持するかどうかを設定可能（trueが保持）
    stateSave: true,

    # stateDuration : stateSave の検索結果の保持する時間を設定可能（1秒単位で設定可能）
    stateDuration: 60 * 15,   # sec * min

  # *** 省略 ***
```

# まとめ
英語のドキュメントさえ読んで使いこなすことができれば、DataTablesはユーザーのニーズを柔軟に反映した高機能なテーブルを短時間で実装することができます。
Rails と組み合わせると爆速で開発が捗ると思っているので、ぜひ活用してみてください。

---
### 会社紹介

**株式会社 Mosaica**  
最先端テクノロジーで社会課題を解決し、持続可能な未来を創造する IT カンパニー。
AI ソリューション、クラウド統合、DX 推進、経営コンサルティングなど包括的なサービスでビジネス変革を支援しています。  

詳しくは [公式サイト](https://mosaica.co.jp/) までお気軽にご相談ください。
公式サイト： https://mosaica.co.jp/
CD コマンドについて、調べました。

# 概要

業務で【cd】や【ls】など色んなコマンドを使っていると思います。
それぞれのコマンドにOPTIONがあるので、
OPTIONと一緒に使うともっと楽に仕事ができると思います。
今回は、基本的なコマンド【cd】ついて、調べました。

---

# cd

cd(change directory)とは、
現在のワーキングディレクトリを変更するコマンド。
UNIX, Windows, dosで、使います。
【chdir】もできます。

```
C:\Users\wun916>dir
2020-01-21  11:12    <DIR>          Desktop
2020-01-22  12:04    <DIR>          Documents
2020-01-21  11:30    <DIR>          Downloads
2019-11-14  10:46    <DIR>          Favorites
2019-11-14  10:46    <DIR>          Links
2019-11-14  10:46    <DIR>          Music

C:\Users\wun916>cd Music   //Music directoryに移動
C:\Users\wun916\Music>
```

---

# cd option

- cd : 自分のホームディレクトリに移動。cd ~ , cd $HOME 

```
mac46:react j-lee$ pwd
/Users/j-lee/react
mac46:react j-lee$ cd
mac46:~ j-lee$ pwd
/Users/j-lee

mac46:react j-lee$ cd ~
mac46:~ j-lee$ pwd
/Users/j-lee

mac46:react j-lee$ cd $HOME
mac46:~ j-lee$ pwd
/Users/j-lee
``` 

---

# cd option

- cd . : 現在のディレクトリに移動。

``` 
mac46:react j-lee$ cd .
mac46:react j-lee$ pwd
/Users/j-lee/react
``` 

- cd .. : 現在のディレクトリから1つ上のディレクトリに移動

``` 
mac46:react j-lee$ pwd
/Users/j-lee/react
mac46:react j-lee$ cd ..
mac46:~ j-lee$ pwd
/Users/j-lee
``` 
---

# cd option

- cd / : 最上位のディレクトリに移動

``` 
mac46:app-server-side j-lee$ pwd
/Users/j-lee/react/app-server-side
mac46:app-server-side j-lee$ cd /
mac46:/ j-lee$ pwd
/
``` 

- cd - : 前のパスに移動し

``` 
mac46:/ j-lee$ pwd
/
mac46:/ j-lee$ cd -
/Users/j-lee/react
``` 

---

# cd option

- cd directroyのpath : directroyに移動

``` 
// 絶対pathを使う（ルートディレクトリ）
mac46:/ j-lee$ pwd
/
mac46:/ j-lee$ cd /Users/j-lee/react/app-server-side/
mac46:app-server-side j-lee$ pwd
/Users/j-lee/react/app-server-side

//　相対pathを使う（現在のdirectroy）
mac46:~ j-lee$ cd react/app-server-side
mac46:app-server-side j-lee$ pwd
/Users/j-lee/react/app-server-side
mac46:app-server-side j-lee$ 

mac46:~ j-lee$ cd ./react
mac46:react j-lee$ pwd
/Users/j-lee/react
```
Ruby ぼっち演算子について

# ぼっち演算子とは

早速本題に入っていきます。
ボッチ演算子とはRuby2.3から実装された機能です。正式には `safe navigation operator` と言います。
主に`&.`のことを示します。
##ぼっち演算子の意義
ぼっち演算子が意義を持つのは，レシーバーが
・`あるクラスのインスタンス`
・`nil`
のいずれか，といった場合です。
Rubyにはメソッドの返り値が`「配列またはnil」`、`「文字列またはnil」`などを返すものが多いのでそのようなときにnilになったレシーバにnilに対応していないメソッドを使ってしまうと`NoMethodError(そんなメソッドないよ！)`というふうに返してしまいエラーが出てしまいます。
だからといって場合分けするとコードが複雑になるしコード量が増えてしまう。

そこで導入されたのが `&.` です。これはメソッド呼び出しの` .` と同じ使い方だけれど，レシーバーが nil のときだけはメソッドが呼び出されないで nil を返す、というものです。
## ぼっち演算子使い方
基本的な使い方は下記のような記述方法です


```ruby
オブジェクト&.メソッド
```

レシーバーとしての役割を持つオブジェクトに対してメソッドを実行した場合にそのレシーバーとしての役割を持つオブジェクトがnilだった場合にエラーが出てしまう可能性があるのですが、そのレシーバーが空のまま実装したいという時もあると思います。

```ruby

@nickname = current_user.nickname
```

このような時です。このcurrent_userはログインしていない時はnilになってしまうのでログインしていないときにこのメソッドが実行されてしまうとエラーになってしまうのですがここでボッチ演算子を使うことでこの`nil`のcurrent_userを`nil`という表記で出力することができます。`nil`で返すことでエラーが消え、current_userに何も入っていない時でもページを表示することができます。

```ruby
@nickname = current_user&.nickname
```
書き方はこの通りです。メソッドの前に`&`をつけるだけです。こうすることでcurrent_userはnilを返すことができるようになります。

少しわかりづらいかもしれないですが、オブジェクトがnilだった場合にnilに対応していないメソッド(NilClassに定義されていないメソッド)を呼び出すので、エラーが出る状況だったのを、オブジェクトがnilだった場合に戻り値にnilを返すメソッドに一時的に変えてしまうことでエラーを回避するという感じですかね。（実際の仕組みは分からない）

`※nilに対応したメソッドの場合はボッチ演算子がなくてもエラーは出ない`
Nilclassのメソッドの例：
&, =~, ^, nil?, rationalize, to_a, to_c, to_f, to_h, to_i, to_r, to_s, |

# ボッチ演算子を使うにあたっての注意点
なおぼっち演算子を使ってもエラーが出ることがあります。それは
**NoMethodError(そんなメソッドないよ！)**
というようなエラーです。この場合はメソッドが間違っている場合があり、メソッド名を見直す必要ががありそうです。
また、レシーバとしての役割を持つオブジェクトがnilの場合はどんな間違ったメソッドを使ってもエラーが出ないので注意です。

#ぼっち演算子の名前の由来
おそらく気になった方も多いと思いますが、ぼっち演算子のぼっちの部分は`&.`がひとりぼっちで座っている姿に見えることから名付けられたそうです。遊び心があって面白いですね。

##参考
https://techacademy.jp/magazine/20567

---
AX203 for FreeBSD 調査編

Hardoffで128x128のチープなデジタルフォトフレームが110円であったので購入してみました。未開封品でしたがLiPoは使えなくなっていました。

![写真（2020-01-22 10.43）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/4dfdb53c-dfb5-94e5-d9d4-2934d9e47cea.jpeg)

いろいろ調べてみたところこのモジュールはAppoTechのAX203というチップを使っているようです。AX203のCPUは8051のようです。

![AX203.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/b3f1714e-534a-0cca-1f4d-73504fe4468c.png)

同様のモジュールで使われるチップにはST2205というもあるようです。AX203の後継のAX206というチップもあるようです。

MENUボタンを押してUSB接続にすると、USBのインターフェースは、umassのCDとして認識されます。VIDが0x1908でPIDが0x1320です。

```
ugen0.2: <BUILDWIN Photo Frame> at usbus0
umass0 on uhub4
umass0: <DPF Mate> on usbus0
umass0:  SCSI over Bulk-Only; quirks = 0x0100
umass0:6:0: Attached to scbus6
cd0 at umass-sim0 bus 0 scbus6 target 0 lun 0
cd0: <buildwin Photo Frame 1.01> Removable CD-ROM SCSI-2 device
cd0: 1.000MB/s transfers
cd0: 0MB (1 0 byte sectors)
cd0: quirks=0x10<10_BYTE_ONLY>
```

Linux方面ではgphoto2や[dpf-ax](https://sourceforge.net/projects/dpf-ax/)などでサポートがありました。

gphoto2はWindowsやMacのアプリケーションのように画像ファイルのコピーができるようです。実際のコードはlibgphoto2の中にあります。SCSIコマンドでオペレーションができてSCSI GENERIC(SG)というAPIを使ってlibgphoto2_port/usbscsi/linux.cでプログラムされているようです。FreeBSDのpkgのgphoto2では認識できませんでした。

dpf-axは8051のfirmwareを書き換えるプロジェクトで[LCD4Linux](https://lcd4linux.bulix.org)でディスプレイとして使えるようにしているようです。こちらはfirmwareを焼き変えるための処理はSCSIコマンドですが、焼き変えた後は専用のUSBインターフェースになるようです。

SGはFreeBSDでも用意されているので、おそらくポートは可能だと思います。

/usr/include/cam/scsi/scsi_sg.h

これを調べていてLCD4linuxを知ったのですが自分もいろいろ[LCDをいじっています](https://qiita.com/yamori813/items/07e95a51baffc36884d4)が、実装のアプローチが全く違っています。アプリケーションなので同じである必要もないと考えています。
バッチファイル入門（for文、配列、遅延環境変数）

# 動機
「○○系の機能の呼び出し元を知りたいから、一覧化して」
と言われて数えてみたら

* ○○系の機能は150弱
* Javaファイルは15000個

あったので、IDE使って150回検索するのも辛そうだったのでバッチファイルで何とかしてみた。
何故bashじゃないのかとか何故そんなことしないといけないのかは聞かないでほしい。

# 作った `bat` ファイルと実行結果

```grepCallHierarchy.bat
@echo off

setlocal enabledelayedexpansion
set i=0
for /f %%a in (targetList.txt) do (
  set /a i+=1
  echo !i! %%a
  call set Arr[!i!]=%%a
)

pause

for /r %%a in (*.java) do (
  for /f "tokens=1,2,3 delims= " %%b in (%%a) do (
    for /l %%j in (1,1,%i%) do (
      if !Arr[%%j]!==%%c (
        echo %%a %%b %%c %%d
      )
    )
  )
)

```
```targetList.txt
NantokaComponent
KantokaComponent
```
出力

```
C:\path\to\file1.java private NantokaComponent nantokaComponent;
C:\path\to\file2.java private KantokaComponent kantokaComponent;
```
# 感想（学んだこと）
## for文
色んなfor文の練習になった。

* 拡張子でディレクトリ内を再帰でファイル検索
    * `for /r %%a in (*.java) do`
* ファイルを1行ごとに読み出し（delimiter(デリミタ)を使う練習も兼ねて）
    * `for /f "tokens=1,2,3 delims= " %%b in (%%a) do`
* jをインクリメントしながらループ
    * `for /l %%j in (1,1,148) do`

## 配列
> call set Arr[!i!]=%%a

初めて知ったんですが、バッチファイルは配列がないんですね。
`Arr[1]` `Arr[2]` ... という変数をただひたすら作ってるだけらしい。

## 遅延環境変数
> setlocal enabledelayedexpansion

配列を添え字でループさせたいとき、遅延評価させないとずっと `Arr[1]` (初期値)になってしまうらしい。
むずかしい。。

遅延評価したい部分は、 `Arr[%i%]` ではなく `Arr[!i!]` のようにびっくりマークで囲うんだそう。
びっくり。

## 総評
楽しかった。（小並感）
作ってる途中で、そういえばPowerShellもあったな、と思った。
次はPowerShellで遊びたいと思う。
Microsoft Application Inspector によるソースコード解析手順

※2020/01/27 tagdiff も追加

# 概要
- **Microsoft Application Inspector** を使ってソースコード解析する手順、使い方をメモする。
- tagdiff はバージョンアップ時の比較で使えそう。
  - バージョン1 と バージョン2 を比較して、想定外の(ネットワーク|ファイル)アクセスなどが無いか?を検知できる。

# 対象環境
- Windows を想定

# セットアップ手順

## ApplicationInspector のダウンロード
1. https://github.com/microsoft/ApplicationInspector/releases に移動
2. 一番上にある最新の `ApplicationInspector_windows_<バージョン>.zip` をダウンロード

## 展開と PATH 設定
1. ダウンロードした zip を展開
2. 必要に応じて `AppInspector.exe` が存在するディレクトリを PATH に含める

# 解析実行(analyze)
PowerShell やコマンドプロンプトを開いて以下コマンドを実行する

```powershell
> AppInspector.exe analyze -s <ソースコードのディレクトリ>
```

```powershell:解凍場所で実行した例
c:\download\ApplicationInspector_windows_1.0.21\ApplicationInspector_1.0.21> .\AppInspector.exe analyze -s C:\workspace\java\sample_application
```

## レポート確認
1. AppInspector.exe を実行した場所に `output.html` が出力されているのでブラウザで開く
2. 青い View Report ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/c9783c67-a03a-2a9a-baf4-4be90550f58d.png)

# 比較実行(tagdiff)
PowerShell やコマンドプロンプトを開いて以下コマンドを実行する

```powershell
> AppInspector.exe tagdiff --src1 <ソースコードのディレクトリ> --src2 <別のソースコードのディレクトリ> -o output.txt
```

## レポート確認
1. 処理結果がコンソールに出力される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517184/702fa20d-0798-0b13-18c7-527ed7bc4d48.png)
2. AppInspector.exe を実行した場所に -o で指定した `output.txt` が出力されているのでテキストエディタで開く

# 備考
- バージョンアップの頻度が高いのでうまく動かない場合は最新版で動かしてみるとうまくいくかも
- 手元にあった Nuxt.js のプロジェクトはエラーになった
- 手元にあった Java の Gradle プロジェクトは解析できた

# 関連リンク
- https://github.com/Microsoft/ApplicationInspector
  - 公式サイト
  - オプションとかもいろいろ
- https://www.microsoft.com/security/blog/2020/01/16/introducing-microsoft-application-inspector/
- https://codezine.jp/article/detail/11923
PostgreSQLで件数を指定してDeleteしようとするとハマった話

## PostgreSQLで件数を指定してDeleteしようとするとハマった話

100000件入ったテーブルから任意のN件を削除する時のレスポンスを計測したかった。

Limit句で件数指定できるしいけるだろーと思って軽率に試したら、意外とハマったのでメモをしておく。



環境：Windows10 1909， PostgreSQL10.0

テーブルレイアウトはコレ

```sql
CREATE TABLE shohin_table (
    id numeric NOT NULL,
    code character varying(2) NOT NULL,
    name character varying(10),
    toroku_time timestamp without time zone
);
ALTER TABLE ONLY shohin_table
    ADD CONSTRAINT shohin_table_pkey PRIMARY KEY (id, code);
```

そして最初に書いたのがコレ

```sql
--１
delete from shohin_table
where 
	(select id,code,name,toroku_time
	from shohin_table
	order by toroku_time
	limit 1000)
```
```
ERROR:  副問い合わせは1列のみを返さなければなりません
LINE 3: (select id,code,name,toroku_time
```
実行するとエラーが出る...なぜダメなんだ




追加で調べると、where句の指定では項目を指定しなければいけないらしいことがわかったのでもう一回

```sql
--２
delete from shohin_table
where toroku_time in
	(select id,code,name,toroku_time
	from shohin_table
	order by toroku_time
	limit 1000)
```
```
ERROR:  副問い合わせの列が多すぎます
LINE 2: where toroku_time in
```
実行するとエラーが出る...なぜだ


もう一度サンプルを見直してダメポイントを発見！ここだ。

```sql
--２
 --中略--
	(select id,code,name,toroku_time
 --中略--
```

どうやらwhere句で指定した項目のみをSelectしないといけないらしい。
（ＳＱＬを理解しないまま使った結果。。）

よって最終版ができました。コレ

```sql
--３
delete from shohin_table
where toroku_time in
	(select toroku_time
	from shohin_table
	order by toroku_time
	limit 1000)
```

これで指定したカラムで並び替えた結果をN件削除することができた。:relaxed:



気になってるのは並び替えずにInsert順でそのまま削除する時はどーするんだろうという話（調べてない）
Dockerを使って簡単にローカルtomcat環境を作る

## はじめに

### 対象者

- eclipseを使ったJavaの開発はしたことはある
- あまりサーバーサイド知らない
- Docker使ったことない or なんとなく手順で使い方は見た。

### やること

あまり手間をかけずにローカルにtomcatのサーバー環境を構築する。

tomcatをそのままローカルにインストールしてもいいのですが、
サーバーはLinux環境であることが多く、環境差異による問題も多いです。

全く同じとは言えませんが、なるべく本番に近い環境を構築したいと思います。

### Dockerとは

この記事を参考にしてください。
https://qiita.com/hikaruright/items/0908df7d1101498e4a58

### 前提条件

Windows10 ProまたはMacを使っている

## How To Setup

今回は、Dockerを使って環境を構築してみましょう。

### Dockerのインストール

以下のサイトにアクセスし、Dockerをインストールします。
既にインストール済みの場合にはスキップしてください。

https://hub.docker.com/?overlay=onboarding

なお、Windowsをお使いの場合にはHyper-Vの有効化が必要ですのでご注意ください。
以下の公式ドキュメントを参考に有効化を行います。

[Hyper-Vの有効化](https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v)

## Docker Composeによる起動

Dockerを使っていると、コンテナの管理が若干面倒です。

特に、一つのアプリケーションを作成するために複数のコンテナを起動する必要がある場合には
Docker Composeという機能を利用します。

簡単に説明すると、dockerのコンテナを起動させるための設定をひとまとめにした設定ファイルを作成します。

その設定ファイルがdocker-compose.ymlです。

今回はtomcatが起動する単一のコンテナを実行するための設定ファイルを作成します。

### ファイルの作成

任意のフォルダを作成し、以下のファイルを作成します。

```shell:docker-compose.yml
version: '3'

services:
  app:
    container_name: tomcat
    image: tomcat:8.5-jdk8-adoptopenjdk-openj9
    ports:
      - 8080:8080
    volumes:
      - ./webapps:/usr/local/tomcat/webapps
```

これで、containerという名前のコンテナが起動されます。
それぞれの設定内容を解説していきましょう。

#### container_name

起動するコンテナ名です。
docker上で一意となるように指定します。

#### image

イメージ名を指定します。

#### ports

ポートフォワーディングを指定します。
この例では8080のアクセスをコンテナの8080ポートに転送しています。

例えば、ホストOSの8080が既に使用されている場合には、

```
- 8090:8080
```

とすることで、ホストOSの8090をコンテナの8080ポートに転送することができます。

#### volumes

ホストOSのフォルダまたはファイルをdockerコンテナのOSにマウントします。
この例の場合には、webappsフォルダをコンテナの/usr/local/tomcat/webappsにマウントしています。

### Webappsフォルダの作成

作成したdocker-compose.ymlと同じフォルダに、「webapps」というフォルダを作成し、
作成したフォルダに配備したいwarファイルを置きます。

最終的に、以下のようなフォルダ構成になります。

```shell
 /tomcat
   ┣ docker-compose.yml
   ┗ /webapps
      ┗ warファイル
```

### 実行

ターミナル、またはコマンドプロンプトを開き、
docker-compose.ymlのあるフォルダに移動します。

移動したら、以下のコマンドを実行します。

```shell
$ docker-compose up -d
```

これで、ローカルでtomcatが実行されました。

### ログの確認

tomcatの起動ログをみたい場合には、以下のコマンドを実行します。

```shell
$ docker logs tomcat
```

以下のコマンドを実行することで、追従したログを表示できます。

```shell
$ docker logs -f tomcat
```

## 動作確認

ブラウザを開き

http://localhost:8080/xxx (xxxはwarのファイル)

にアクセスします。


特に問題なくデプロイされていればページが表示されます。
Mac→Windows-(VPN)→拠点に無条件に流す

#これは何？
例えば、Windowsからしか接続できない拠点があるとします。そのときに、Macからのネットワーク接続のすべてをそのWindowsに対して送信する方法のメモです。（未完成）

#必須なインストール物と設定
- Windows Subsystem for Linux(WSL)
- SSH Server (WSLにインストール)
- WindowsのFirewall
- [sshuttle](https://github.com/sshuttle/sshuttle) (Macにインストール)

#Reference
- [SSH VPN on OSX with SSHuttle in 3 minutes - Wojciech Adam Koszek](https://www.koszek.com/blog/2017/04/09/ssh-vpn-with-sshuttle-in-3-minutes/)
- [Windows Defender Firewall with Advanced Security: What is it? How to open it? What can you do with it? | Digital Citizen](https://www.digitalcitizen.life/manage-rules-windows-firewall-advanced-security)
- [Windows Subsystem for Linuxにssh接続する - Qiita](https://qiita.com/ezmscrap/items/30eaf9531e240c992cf1)
Flutter: ModalBottomSheetをドラッグ可能＋丸角にする

Flutterアプリを研究開発しながら得た知識をメモしていく。

## 普通のModalBottomSheetを表示する

まずシンプルな表示だけなら`showModalBottomSheet`メソッドのbuilderに表示したいWidgetを渡すだけ。

```dart
    showModalBottomSheet(
      context: context,
      builder: (context) => Text("hello world"),
    );
```

<img width=400 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/622c3b7d-4005-8dc3-8810-b81c3e78ff62.png">

## スクロール可能にする

今回はスクロール可能なModalBottomSheetにする必要があったので、`DraggableScrollableSheet`を使う。

```dart
    showModalBottomSheet(
      context: context,
      builder: (context) => DraggableScrollableSheet( // <= 追加
        builder: (context, scrollController) => Text("hello world"),
      ),
    );
```

表示領域が画面半分まで広がってくれる

<img width=300 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/2a863a0f-66cd-cea9-882e-83acf3e91ae4.png">

## 丸角にする

`RoundedRectangleBorder`で丸角にすることができる。

`top`を指定しないと四隅が丸角になるので注意

```dart
    showModalBottomSheet(
      context: context,
      shape: RoundedRectangleBorder( // <= 追加
        borderRadius: BorderRadius.vertical(top: Radius.circular(16)),
      ),
      builder: (context) => DraggableScrollableSheet(
        builder: (context, scrollController) => Text("hello world"),
      ),
    );
```

<img width=300 src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52227/29611827-92e2-b8b1-c959-2220701b195a.png">


## 実装したコード

https://github.com/ikemura23/flutter_lab/tree/modal_bottom_sheet
【ふくだ学習録】CakePHP3入門 part5【14日目】

# ふくだ学習録とは？
ふくだが学習したことの備忘録。
目に見える形で残すことによってやる気を出す個人的な作戦です。
他人に見せるように書いているわけではないので、すごく読みにくいです。

### 読了した本
[データベースエンジニア養成読本 [DBを自由自在に活用するための知識とノウハウ満載!]](https://www.amazon.co.jp/dp/4774158062/ref=cm_sw_r_tw_dp_U_x_FPphEbQFPPQRM )
[ゼロから作るDeepLearning](https://www.amazon.co.jp/dp/4873117585/ref=cm_sw_r_tw_dp_U_x_y3UiEbF3P6EG7)

### 今読んでいる本

[PHPフレームワーク CakePHP 3入門](https://www.amazon.co.jp/dp/4798048577/ref=cm_sw_r_tw_dp_U_x_.YIjEbS1K4JY2)

# CakePHP3入門を読んで

### ユニットテストを行うPHPUnit
ユニットテストにはPHPUnitが使われる（外部ライブラリ）

### アプリケーション拡張をするプログラム
**ヘルパー**
ビューに追加されるプログラム。
HtmlヘルパーやFormヘルパーなど、テンプレートのコード生成を行ってくれるもの。

**コンポーネント**
コントローラに追加されるプログラム。Paginatorコンポーネントなどがある。

**ビヘイビア**
モデル関係に追加されるプログラム。

**プラグイン**
MVCアプリケーションとして機能するプログラムを外部から組み込んで利用できるようにするもの。

**シェルプログラム**
cakeコマンドを拡張して、独自機能を追加できるようにする。

### ヘルパーの種類

#### RSSヘルパー
RSSとは、XMLを使用して決まった形で更新された情報をフォーマットしたもの。RSSリーダーなどで読み込むことによって、サイトの更新情報を取得することができる。
CakePHPでは、RSSを生成するヘルパーが標準で備え付けられている。

#### RSSヘルパー　①RSS拡張子を登録する
まず`.rss`という拡張子ファイルを使用できるようにする必要がある。

```php:config/app.php
Router::scope('/', function(RouteBuilder $routes) {
  # ...
  # 諸々設定が記載されている。
  $routes->extensions(['rss']);
});
```
上記の設定を行うことにより、rssという拡張子が認識されるようになる。
例えば`/index`にアクセスする際に、`/index.rss`とアクセスすると、対象ディレクトリ内にあるrssファイルへアクセスしていると見なされる。

#### RSSヘルパー　②AppViewでRSSヘルパーをロードする
ビューを利用する際にRSSヘルパーをロードするようにする。

```php:View/AppView.php
public function initialize() {
  # ...
  # 諸々設定が記載されている。
  $this->loadHelper('Rss'); 
}
```
この記載をAppView内で行うことで、テンプレート内でRSSヘルパーが使用できるようになる。

#### RSSヘルパー　③コントローラの修正
RSS対応したいコントローラ（アクション）内に下記の記載を追加する。

```php
public function index() {
  if($this->RequestHandler->isRss()) {
    # RSSフィードが要求された場合の処理
  } else {
    # 通常の処理
  }
}
```

#### RSSヘルパー　④RSS用レイアウト、ビューを用意する
レイアウトに関しては、`Template/Layout/rss`というフォルダが用意されており、その中のdefault.ctpがデフォルトで使用されるレイアウトになっている、
その後、表示したいディレクトリ内に`rss`フォルダを作成し、その中に`アクション名.ctp`という名前でファイルを作成する。


#### Textヘルパー
テキストの利用を支援する機能を提供してくれるヘルパー。
リンクの生成や、ハイライト表示、リスト化、リンクの除去などといった機能を提供してくれる。

使用するには、

```php:View/AppView.php
public function initialize() {
  # ...
  # 諸々設定が記載されている。
  $this->loadHelper('Text'); 
}
```
という記載をする。

#### Numberヘルパー
数値に関する機能を提供してくれる。使用するには、下記のように記載しておく。

```php:View/AppView.php
public function initialize() {
  # ...
  # 諸々設定が記載されている。
  $this->loadHelper('Number'); 
}
```

#### Timeヘルパー
日時に関する機能を提供してくれる。使用するには、下記のように記載しておく。

```php:View/AppView.php
public function initialize() {
  # ...
  # 諸々設定が記載されている。
  $this->loadHelper('Time'); 
}
```



# 今日の一言
今日読んでたところは、プラグイン関連の記述が多いとこで、あまり汎用性高くなさそうだったので、メモ少なめ。
勉強してて「次のアプリはCakePHP使って作ろ！」と思ってたけど、やっぱりLaravel使用しようかな？と思い始めた。

理由は
・CakePHPは業務で触れるから、触れないLaravelを触っておきたい。
・フロント側の実装をReact×TypeScriptで実装してみるから、バックエンドはAPIサーバとして動きそう（SPA化したらCakeのテンプレート機能とか、ほぼ使わなくなりそう）
って感じやけど、判断として正しいんだろうか。。？

とりあえず来月中盤ぐらいからはアプリ制作入りたい！
WPF コードによる UIControlとのバインディング

#はじめに
「WPFで、XAMLでないところでユーザーコントロールをnewして、データとバインディングしておいて、
そのnewしてあるユーザーコントロールを、公開したい」
という都合がありまして、そのためのテストプログラムを書きました。
まずは、テストプログラムなので、UIのコントロールはxaml側に書いています。

ググると、いくつもサンプルは見つかるのですが、自分のイメージに近いものを書きました。

2020/1/27追記：
続きの記事を書きました。
[「C#製コンポーネントで、WPF UserControlを公開したい」のサンプルコード]
(https://qiita.com/azuki8/items/8a505090354a722c6127)
です。

#テストプログラムの内容
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197297/7e207d85-5a0e-06b0-38f3-0ac538b272e2.png)

ラベル一つと、ボタン一つ
ボタンを押すと、ラベルの数値が1ずつ増えます

#コード

```csharp:MainWindow.xaml.cs
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace WpfApp14
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        // バインディングさせたいデータソース
        Class1 obj = new Class1(1);

        public MainWindow()
        {
            InitializeComponent();

            // 実質的なバインディングのコードは、ここの2行
            label1.DataContext = (object)obj;
            //label1.SetBinding(Label.ContentProperty, new Binding("val1")); // どちらでもできた
            label1.SetBinding(Label.ContentProperty, nameof(Class1.val1)); // どちらでもできた
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            // バインディングさせたデータソース内のプロパティを更新
            obj.val1 += 1;
        }
    }

    class Class1 : INotifyPropertyChanged  // バインディングさせるソースは、INotifyPropertyChangedが必要
    {
        private int _val1;
        public int val1
        {
            get { return _val1; }
            set
            {
                _val1 = value;
                OnPropertyChanged(nameof(val1));
            }
        }
        public event PropertyChangedEventHandler PropertyChanged;

        private void OnPropertyChanged(string name)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(name));
            }
        }
        public Class1(int x)
        {
            val1 = x;
        }
    }
}
```

```xml:MainWindow.xaml
<Window x:Class="WpfApp14.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp14"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel>
        <Label x:Name="label1" Height="40" />
        <Button Click="Button_Click" Content="Push" />
    </StackPanel>
</Window>
```

#参考にした記事
方法 : コードでバインディングを作成する
https://docs.microsoft.com/ja-jp/dotnet/framework/wpf/data/how-to-create-a-binding-in-code
WPFでコードだけどバインドするときの例
https://mohmongar.net/?p=951
C#（MVVM）：ソースコードにてバインディング設定する方法
https://www.kakistamp.com/entry/2018/06/22/204440
Go log

logを学んだのでまとめておきます。

logのパッケージを使って出力すると

生年月日や時間が出力されます。

```main.go
package main

import "log"

func main(){
   //logを出力
   log.Println("hello")

   //型や値を出力
   log.Printf("%T %v", "hello", "hello")

   //コードが終了する
   log.Fatalln("hello")
}
```

現時点で学んだ内容をまとめました。

随時更新していきます。
[TypeScript]getElementId使用して気になったこと

AngularフレームワークでTypeScript を使用してたときにビルドエラーになってとりあえず調べた結果をまとめる。

## エラー内容

以下のコードを書いていた。

```HTML
<!-- HTML -->
<input type="file"　id="recorder">
<audio id="player" controls></audio>
```

```TypeScript
// TypeScript
const recorder = document.getElementById("recorder");
const player = document.getElementById("voice-player");

recorder.addEventListener("change", function(e: Event) {
    const file = e.target.files[0];
    player.src = URL.createObjectURL(file);
});
```

player.srcでsrcは存在しないというエラー。  

## 原因

playerの型がHTMLElement型になっていた。audioタグだしHTMLAudioElementが返ってくると勝手に思ってしまっていた。  
.getElementById()はHTMLElement型で返ってくるので自分でキャストする必要があった。  
以下のようにキャストした。

```TypeScript
const player = <HTMLAudioElement>document.getElementById("voice-player");
```

これでビルド通ったけど、キャストする以外に方法はないのだろうか。

2020/02/03　追記

コメントにてキャストする以外の方法で
以下URLを参考にすればできました。
https://qiita.com/simochee/items/b3d4dc15f474f805573c
PostgreSQLで複数のレコードを一括で更新（UPDATE）・追加（INSERT）する方法

#経緯
ワーク（一時）テーブルのデータを本テーブルに登録する時の、複数のレコードを一括更新する方法を試してみましたので、
一応メモします。

##本テーブル（tbl01）の例

|年月（year_mon）|名前（name）|指数（index）|
|:--|:--|:--|
|202001|name1|123.45|
|202001|name2|234.56|
|202001|name3|345.67|

##ワークテーブル（tbl01_wk）の例

|年月（year_mon）|名前（name）|指数（index）|
|:--|:--|:--|
|202001|name1|456.78|
|202001|name2|567.89|
|202001|name4|678.90|
|202001|name5|789.01

#目標１：更新
年月と名前を検索のキーとして、ワークテーブルのデータを本テーブルのデータと比較して、異なる場合本テーブルの指数を更新

```sql
update
	tbl01 as t1
set
	index = t2.index
from
	tbl01_wk as t2
where
	t1.year_mon = t2.year_mon
	and t1.name = t2.name
	and t1.index <> t2.index
```

#目標２：追加
年月と名前を検索のキーとして、ワークテーブルのデータは本テーブルに存在するかを確認して、存在しない場合本テーブルに追加

```sql
insert into
	tbl01
select
	t1.year_mon,
	t1.name,
	t1.index
from
	tbl01_wk as t1 
left join
	tbl01 as t2
on
	t1.year_mon = t2.year_mon
	and t1.name = t2.name
where
	t2.year_mon is null
```

#目標３：order byを使用
order byを使用してワークからデータを抽出して本テーブルに更新
※一時ファイルをワークに登録し、「最新の数行だけ」を更新する場合に役立つ

```sql:ワークの「最新の5行」を本テーブルに更新
update
	tbl01 as t1
set
	index = t2.index
from
(
	select
		* 
	from
		tbl01_wk
	order by
		year_mon desc
	limit 5
) as t2 
where
	t1.year_mon = t2.year_mon
	and t1.name = t2.name
```
Chart.js【javascriptで簡単にグラフが描ける！】

#1.Chart.jsを読み込む

CDNサーバからスクリプト「Chart.js」を読み込みます。
具体的には、グラフを描きたいWebページのHTMLソース中に以下の1行を加えるだけです。

```html
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.bundle.min.js"></script>
```

#2.canvas要素を記述

グラフを掲載したい場所に、canvas要素を使って下記のように1行を記述するだけです。
idは他と重複しない名前をつけます。

```html
<canvas id="ChartDemo" height="450" width="600"></canvas>
```



#3.グラフの描画内容をscript要素内に記述

```html
<script>
   描画内容の指示（下記に記述例があります）
</script>
```
描画内容の指示（以下のようなグラフの例）
・折れ線グラフです。
・X軸には、Item1～Item7の項目があります。
・値は、Item1から順に10, 11, 12, 13, 14, 15, 16です。
・オプションで、Y軸を0～100に固定しています。

```javascript

var ctx = document.getElementById("ChartDemo").getContext('2d');
var ChartDemo = new Chart(ctx, {
　　// 作成するグラフの種類
　　type: 'line',
　　data: {
　　// ラベルとデータセットを設定
　　　　labels: ["Item1", "Item2", "Item3", "Item4", "Item5", "Item6", "Item7"],
　　　　datasets: [
　　　　　　{
　　　　　　　　label: "Chart-1",
　　　　　　　　borderColor: 'rgb(255, 0, 0)',
　　　　　　　　data: [10, 11, 12, 13, 14, 15, 16],
　　　　　　},
　　　　]
　　},
　　// オプション設定
　　options: {
　　　　scales: {
　　　　　　yAxes: [
　　　　　　　　{
　　　　　　　　　　ticks: {
　　　　　　　　　　　　beginAtZero: true,
　　　　　　　　　　　　min: 0,
　　　　　　　　　　　　max: 100
　　　　　　　　　　}
　　　　　　　　}
　　　　　　]
　　　　}
　　}
});
```

#感想
簡単ですね、すごい！
オプション指定で色々できそうです。
今は便利なライブラリが色々あるんですねー。

#自己紹介
プログラマー歴7年、ブランク10年のアラフォー主婦です。
記事中に間違っていることがあったら、どんどんつっこんで頂けると嬉しいです。
go ファイルの読み取り

Goでファイルの読み取り方法を学んだのでまとめておきます。

```main.go
package main

import(
    "fmt"
    "os"
)

func main() {

//file変数にファイルのデータを代入
//ここではエラーは空白に
file, _:= os.Open("ファイル名")

//ファイルのクローズを最後に行うためのdefer
defer file.Close()

//バイト配列を作成
data := make([]byte, 100)

//バイト配列にファイルのデータを読み込む
file.Read(data)

//バイト配列に格納されたデータを出力
//バイト型になっているので、string()で文字列に型変換を行う
fmt.Println(string(data))
}
```
cでatcoder その11

#概要

cでatcoderの練習問題やってみる。

#練習問題

N個の整数値を受け取り、一度の操作ですべての数を2で割る。割り切れなくなるまで割っていった時、何回割ることが出来るか？

#成果物

https://paiza.io/projects/jGToDXahlATUAWNDT4Vjnw

以上。
Amazon Web Services (AWS)サービスの正式名称・略称・読み方まとめ #23 (AR とバーチャルリアリティ)

Amazon Web Services (AWS)のサービスで正式名称や略称はともかく、読み方がわからずに困ることがよくあるのでまとめてみました。

Amazon Web Services (AWS) - Cloud Computing Services
https://aws.amazon.com/

全サービスを並べたチートシートもあるよ！

Amazon Web Services (AWS)サービスの正式名称・略称・読み方チートシート - Qiita
https://qiita.com/kai_kou/items/cb29d261c8acc49fd22a


まとめルールについては下記を参考ください。

Amazon Web Services (AWS)サービスの正式名称・略称・読み方まとめ #1 (コンピューティング) - Qiita
https://qiita.com/kai_kou/items/a6795dbab7e707b0d1a6


間違いや、こんな呼び方あるよーなどありましたらコメントお願いします！


## AR & VR - AR とバーチャルリアリティ


### Amazon Sumerian

- 正式名称: Amazon Sumerian
- https://docs.aws.amazon.com/sumerian/?id=docs_gateway
- 読み方: シュメール
- 略称: なし
- 俗称: なし


## 他のまとめ

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#1 \(コンピューティング\) \- Qiita](https://qiita.com/kai_kou/items/a6795dbab7e707b0d1a6)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#2 \(ストレージ\) \- Qiita](https://qiita.com/kai_kou/items/a8ba7a17dd88e9763fbf)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#3 \(データベース\) \- Qiita](https://qiita.com/kai_kou/items/26dcbd7846205efbe48f)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#4 \(開発者用ツール\) \- Qiita](https://qiita.com/kai_kou/items/e459647883dd00cda939)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#5 \(セキュリティ、アイデンティティ、コンプライアンス\) \- Qiita](https://qiita.com/kai_kou/items/5c5d4d9c543fc19a88c4)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#6 \(暗号化と PKI\) \- Qiita](https://qiita.com/kai_kou/items/e81c55a33f4e3ee7b4c7)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#7 \(機械学習\) \- Qiita](https://qiita.com/kai_kou/items/80c9759b6849ad7898f4)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#8 \(マネジメントとガバナンス\) \- Qiita](https://qiita.com/kai_kou/items/145fa47d56bb9aa57134)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#9 \(移行と転送\) \- Qiita](https://qiita.com/kai_kou/items/965cf87628fb12e23164)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#10 \(モバイル\) \- Qiita](https://qiita.com/kai_kou/items/36cc134277e3e3e6cac4)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#11 \(ネットワーキングとコンテンツ配信\) \- Qiita](https://qiita.com/kai_kou/items/1e1855248bd2ebe90f26)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#12 \(メディアサービス\) \- Qiita](https://qiita.com/kai_kou/items/7653a09c8418ff46c2e2)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#13 \(エンドユーザーコンピューティング\) \- Qiita](https://qiita.com/kai_kou/items/ae0aaad7f5019841df40)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#14 \(分析\) \- Qiita](https://qiita.com/kai_kou/items/3f31ce445cbf597d1e7f)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#15 \(アプリケーション統合\) \- Qiita](https://qiita.com/kai_kou/items/97af297a11fa16a1df3c)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#16 \(ビジネスアプリケーション\) \- Qiita](https://qiita.com/kai_kou/items/da941eec64dba4f50d12)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#17 \(サテライト\) \- Qiita](https://qiita.com/kai_kou/items/58434ec361f85cfc2c02)

[Amazon Web Services \(AWS\)サービスの正式名称・略称・読み方まとめ \#18 \(ロボット工学\) \- Qiita](https://qiita.com/kai_kou/items/af28c78d10ad4eb42cce)
cでatcoder その9

#概要

cでatcoderの練習問題やってみる。

#練習問題

2つの整数値を受け取り、その積が2の倍数かを判定する問題です。

#成果物

https://paiza.io/projects/5-ZzgmOX0G55vylxwxTz0A

以上。
cでatcoder その8

#概要

cでatcoderの練習問題やってみる。

#練習問題

500円玉をA枚、100円玉をB枚、50円玉をC枚持っているとき、これらの硬貨の中から何枚かを選び、合計金額をちょうどX円にする組み合わせを求める問題です。

#投入するデータ

```
3
5
10
2000
```

#期待値

```
7
```

#サンプルコード

```
#include <stdio.h>

int main(void) {
    int a,
        b,
        c,
        x,
        i,
        j,
        k,
        r = 0;
    scanf("%d%d%d%d", &a, &b, &c, &x);
    for (i = 0; i <= x / 500; i++)
    {
        for (j = 0; j <= (x - 500 * i) / 100; j++)
        {
            k = x - 500 * i - 100 * j;
            r += k % 50 == 0 && c >= k / 50 && a >= i && b >= j;
        }
    }
    printf("%d\n", r);
    return 0;
}

```

#成果物

https://paiza.io/projects/UsLVOYkPGkP0Krzx1EAr_Q

以上。
cでatcoder その7

#概要

cでatcoderの練習問題やってみる。

#練習問題

1以上N以下の整数のうち、10進法での各桁の和がA以上B以下であるものの総和を求める問題です。

#投入するデータ

```
20
2
5
```

#期待値

```
84
```

#サンプルコード

```
#include <stdio.h>

int main(void) {
    int n,
        a,
        b,
        r = 0,
        i,
        j;
    scanf("%d%d%d", &n, &a, &b);
    for (i = 1; i <= n; i++)
    {
        int s = 0;
        j = i;
        for ( ; j; j /= 10)
        {
            s += j % 10;
        }
        if (a <= s && s <= b)
        {
            r += i;
        }
    }
    printf("%d\n", r);
    return 0;
}


```

#成果物

https://paiza.io/projects/qWLZ5nlTKPvoZXIZfcEaSQ

以上。
cでatcoder その6

#概要

cでatcoderの練習問題やってみる。

#練習問題

N枚のカードを二人で交互に取っていき、カードに書かれている数字の和の差を求める問題。

#投入するデータ

```
4
10
9
12
5
```

#期待値

```
6
```

#サンプルコード

```
#include <stdio.h>

int compare(const void * a, const void * b) {
    return * (int * ) b - * (int *) a;
}

int main(void) {
    int n,
        i,
        r = 0,
        t = 1;
    int arr[999];
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &arr[i]);
    }
    qsort(arr, n, 4, compare);
    for (i = 0; i < n; i++)
    {
        r += t * arr[i];
        t = -t;
    }
    printf("%d\n", r);
    return 0;
}




```

#成果物

https://paiza.io/projects/2wk6MPXJOWD80mKRt4nVEg

以上。
cでatcoder その5

#概要

cでatcoderの練習問題やってみる。

#練習問題

N枚の整数値が与えられ、それらの重複しない要素の数を数える問題です。

#投入するデータ

```
3
12
10
10
```

#期待値

```
2
```

#サンプルコード

```
#include <stdio.h>

int compare(const void * a, const void * b) {
    return * (int *) a - * (int *) b;
}

int main(void) {
    int n,
        i,
        r = 1,
        t;
    int arr[999];
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%d", arr + i);
    }
    qsort(arr, n, 4, compare);
    t = arr[0];
    for (i = 1; i < n; i++)
    {
        if (t != arr[i])
        {
            t = arr[i];
            r++;
        }
    }
    printf("%d\n", r);
    return 0;
}



```

#成果物

https://paiza.io/projects/4CuSDuMzfM087VLpDMMtcw

以上。
cでatcoder その4

#概要

cでatcoderの練習問題やってみる。

#練習問題

10000円札と、5000円札と、1000円札が合計でN枚あって、合計金額がY円であった。このような条件を満たす各金額の札の枚数の組を1つ求める問題です。

#投入するデータ

```
7
20000
```

#期待値

```
1 1 5
```

#サンプルコード

```
#include <stdio.h>

int main(void) {
    int n,
        y,
        i,
        j,
        k;
    scanf("%d%d", &n, &y);
    for (i = 0; i <= n; i++)
    {
        for (j = 0; j <= n - i; j++)
        {
            k = n - i - j;
            if (i * 1000 + j * 5000  + k * 10000 == y)
            {
                printf("%d %d %d\n", k, j, i);
                return 0;
            }
        }
    }
    puts("-1 -1 -1");
    return 0;
}

```

#成果物

https://paiza.io/projects/uvaarYBJt1JlDCPPmDa-vg

以上。
cでatcoder その3

#概要

cでatcoderの練習問題やってみる。

#練習問題

文字列Sが与えられ、始め空の文字列Tの末尾に "dream", "dreamer", "erase", "eraser"を追加する処理を行って、S=Tにできるか判定する問題です。

#投入するデータ

```
dream
```

#期待値

```
Yes
```

#サンプルコード

```
#include <stdio.h>
#include <string.h>

void rev(char * s) {
    int l = strlen(s), 
        i;
    for (i = 0; i < l / 2; i++)
    {
        char t = s[i];
        s[i] = s[l - 1 - i];
        s[l - 1 - i] = t;
    }
}
char T[4][8] = {
    "dream",
    "dreamer",
    "erase",
    "eraser"
};

int main(void) {
    int i = 0,
        c,
        l;
    char s[100001];
    for (i = 0; i < 4; i++)
    {
        rev(T[i]);
    }
    scanf("%s", s);
    l = strlen(s);
    rev(s);
    for ( ; c < l; )
    {
        int k = -1;
        for (i = 0; i < 4; i++)
        {
            if (!strncmp(s + c, T[i], strlen(T[i])))
            {
                k = strlen(T[i]);
                break;
            }
        }
        if (k < 0)
        {
            puts("NO");
            return 0;
        }
        c += k;
    }
    puts("YES");
    return 0;
}



```
#成果物

https://paiza.io/projects/sDu7oJByeY9dV9yJkH3gKw

以上。
cでatcoder その２

#概要

cでatcoderの練習問題やってみる。

#練習問題

時刻0のとき、平面上の(0, 0)にいます。平面上のN箇所の点を、ある時刻に移動できるかという問題です。

#投入するデータ

```
3
4
2
2
8
4
4
12
5
5
```

#期待値

```
Yes
```

#サンプルコード

```
#include <stdio.h>

int main(void) {
    int n,
        t = 0,
        x = 0,
        y = 0;
    for (scanf("%d", &n); n--; )
    {
        int t0,
            x0,
            y0;
        scanf("%d%d%d", &t0, &x0, &y0);
        int dt = t0 - t,
            dx = x0 - x,
            dy = y0 - y;
        if (dx + dy > dt || (dt - dx - dy) % 2)
        {
            puts("No");
            return 0;
        }
        t = t0;
        x = x0;
        y = y0;
    }
    puts("Yes");
    return 0;
}

```
#成果物

https://paiza.io/projects/prX2Y9xgFITjYekbVr3GiA

以上。
cでatcoder

#概要

cでatcoderの練習問題やってみる。

#参考にしたページ

https://qiita.com/cielavenir/items/ee1e47b844d05dcfc66e

#練習問題

3つの整数値と文字列を1つ受け取り、整数値の和と文字列を一行に出力する問題です。

#投入するデータ

```
1
2
3
hello
```

#期待値

```
6 hello
```

#サンプルコード

```
#include <stdio.h>

int main(void) {
    int a,
        b,
        c;
    char s[999];
    scanf("%d%d%d%s", &a, &b, &c, s);
    printf("%d %s\n", a + b + c, s);
    return 0;
}

```

#成果物

https://paiza.io/projects/0bgmtFXOYgNtPmx4IYYLeA

以上。
[JavaScript] if文の条件で代入をしてはいけない

JavaScriptのif文条件には **truthy** または **falsy** と認識される式が書けます。[^1]
そして条件の中で変数に値を代入することもできます。

[^1]: [if...else - JavaScript \| MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/if...else)

```js:代入の例
if (a = 'a') { // 結果、'a'(truthy)が評価される
  console.log(a); // a
}

if (a = '') { // 結果、空文字(falsy)が評価される
} else {
  console.log(a); // ''
}
```

さらに、カンマ演算子を使用してこんなこともできます。

```js:複数代入の例
if (a = 'a', b = 'b', a === 'b') {
  console.log('true');
} else {
  console.log('false'); // こっちに入る 
}

// 複数の代入もできている
console.log(a); // a
console.log(b); // b
```
`a`と`b`に代入を行なった上で、`a === 'b'`の評価をしています。

## これはいつ使うの？
基本的に使いません。
この書き方は悪い習慣とされています。

## 理由

### その１
比較演算子のタイプミスかどうかがわかりにくい。
もし、代入を行う際は以下のように括弧を記述することを推奨されています。

```js
if ((a = 'a')) {}
```

### その２
ほとんどの場合においてわかりにくい。

```js
if ((res = myFunc())) {
  console.log(res);
}

// あえてif文で代入する必要がない
res = myFunc();
if (res) {
  console.log(res);
}
```

### その３
スコープがわかりにくい。

```js
if ((a = 'a')) {
  console.log(a); // a
}
console.log(a); // a
```


## 便利な場面を ~~無理やり~~ 見出してみた

### 案
特定の処理だけをスキップする時に使う。

```js
let res = null;
let err = null;
if (({res, err} = myService()), err != null) {
  throw err;
}

function myService() {
  // 何かの処理の結果
  return { res: {}, err: {name: 'hogeErr'}}
}
```

うーん、、Goっぽくもない気がしますが、、
やっぱり嬉しい場面がないですね、、
ログインシェル／インタラクティブシェルの分類と zsh の dotfiles 呼び出し順序の話

# はじめに
zsh の `~/.zshenv`，`~/.zprofile` などの **dotfiles** が呼び出される順序について整理した．ついでにシェルの呼び出され方の分類についても調べた．zsh についての話だが概ね他のシェルにも当てはまる気がする．

# シェルの起動方法の分類と設定ファイルごとの実行有無
**(login or non-login)** × **(interactive or non-interactive)** の 4 パターンある．
いずれのパターンでも，その環境で有効なシェルの実行ファイル（`/bin/zsh` など）が実行される（実行ファイルがそれぞれあるわけではない）．
起動時の操作に応じてシェルに課せられる処理は異なる（ターミナル起動時はカッコいいプロンプトを設定する必要がある一方で，シェルスクリプト実行時はその必要がない）が，各 **dotfiles** ではこれらの処理を，起動の仕方に応じて個別に定義する．

パターンと dotfiles 呼び出し順序を整理すると次の通り：

| \- | login | non-login |
| --: | :-: | :-: |
| **interactive** | `~/.zshenv` > `~/.zprofile` > `~/.zshrc` > `~/.zlogin` | `~/.zshenv` > `~/.zshrc` |
| **non-interactive** | `~/.zshenv` > `~/.zprofile` > `~/.zlogin` | `~/.zshenv` |

login shell か interactive shell かの 2 つに 1 つ，というわけではなさそう．

*- [The Z Shell Manual](http://zsh.sourceforge.net/Doc/zsh_a4.pdf)*

# 起動の操作と設定ファイルごとの実行有無
各 dotfiles に `echo '$ファイル名'` を追記し起動の操作をいろいろ試した．
`~/.zshenv` 以降，表の左から順に呼び出される：

| 操作      | login shell | interective <br>shell | `~/.zshenv` | `~/.zprofile` | `~/.zshrc` | `~/.zlogin` |
| --- | :-: | :-: | :-: | :-: | :-: | :-: |
| **ターミナルソフトの起動** |         ○ |      ○         | 🙆‍♂️ | 🙆‍♂️ | 🙆‍♂️ | 🙆‍♂️ |
| **`tmux new`**     |         ○ |      ○         | 🙆‍♂️ | 🙆‍♂️ | 🙆‍♂️ | 🙆‍♂️ |
| **`zsh`**          |       ×  |      ○         | 🙆‍♂️ | - | 🙆‍♂️ | - |
| **`su`**           |       × |      ○          | 🙆‍♂️ | - | 🙆‍♂️ | - |
| **shell script 実行** | × |      ×         | 🙆‍♂️ | - | - | - |
| **`source activate` による Python 仮想環境切替** | × | × | - | - | - | - |

`source activate` についてはそもそもシェルは起動すらしない模様．
`/etc/...` 以下のファイルはそれぞれ，対応する `~` 以下のファイルの直前に呼び出されるとのこと．
login shell だが interactive shell ではない例は思いつかなかった．

## 参考
- [The Z Shell Manual](http://zsh.sourceforge.net/Doc/zsh_a4.pdf)
- [zshの設定ファイルの読み込み順序と使い方Tipsまとめ](https://qiita.com/muran001/items/7b104d33f5ea3f75353f)
非機能要件のときに参考にしたもの

直近で非機能要件の資料を書く手伝いをしたので、そのときに自分で見つけ良さそうだなと思った資料をまとめていきます。

# 非機能要件定義サンプル
[平成29年度新エネルギー等の保安規制高度化事業](https://www.meti.go.jp/information_2/downloadfiles/kokuji20180320c8.pdf)
アクセンチュアが原案を描き、経済産業省がまとめた要件定義書。
非常に見やすくまとまっていて、細かい数字ベースで語られているのでお客様にも説明しやすいと思われる。また、後述するが非機能要求グレード（IPA）だけ扱えばいいと勘違いしていた自分に、それだけでは足りないと知見を広げてくれた資料。（ユーザビリティ・アクセシビリティの項目とか）
すごくわかりやすく、すぐ読めるので一読をおすすめ。（さすが、頭のいい人たちの書く資料は全然違う。）

# 非機能要件元ネタ
[非機能要求グレード](https://www.ipa.go.jp/sec/softwareengineering/std/ent03-b.html)
IPAがまとめた非機能要件で定めるべき内容の説明書。
非機能要件でこれを参考にしないのは、まずいレベルで網羅性が高い。
これを読めば８割は必要な内容が抽出できる。特に、エクセルの一覧は今回の方針だけ記載して、そのまま顧客に提出してもいいレベルですごい。辛辣な言い方かもしれないが、SEが少しの時間しか調べずにまとめた要件定義書よりも、遥かにお客様を安心させるような代物だと個人的に思ってます。
ただし、端末とか最新セキュリティなどは盛り込まれていないので、いくつか補完の必要が場合によっては必要。

[Webシステム／Webアプリケーションセキュリティ要件書 3.0](https://github.com/ueno1000/secreq/blob/master/OWASP_WebApplicationSecurityRequirements3.0.pdf)
OWSAPという世界的な団体がアプリケーションのセキュリティ向上を目指してまとめた文章。
セキュリティ要件定義をする場合、アプリのセキュリティ項目に使える内容が多い。
ほぼほぼ基礎的な内容だが、基礎的な要素の網羅がすごくと個人的に思う。これをベースに最新動向を入れれば要件定義段階でセキュアコーティング規約書と同じ価値のものが作れて、後工程で役立つドキュメントを作れそう。

[NIST関連文章](https://www.ipa.go.jp/security/publications/nist/)
米国国立標準技術研究所のセキュリティ関連の和訳資料。
影響力大でここがこうしろと言ったものには、素直に従った方がいいレベル。読むの難しいけど時間をかけて読んだ方がいいです。ここの文章に反論できる優秀な人は日本には数える人数しかいないので、凡人の私は素直に従います。

[クラウドサービス利用のための情報セキュリティマネジメントガイドライン](https://www.meti.go.jp/policy/netsecurity/downloadfiles/cloudsec2013fy.pdf)
クラウド関連のセキュリティガイドライン。
クラウドを使用する場合は、読むとお客様説明の際に理論的になるかもしれないと思っている。

# まとめ
大体、大きな会社だと、これを描きなさいみたいなの決まってるから、いいんですけど、セキュリティ系とか足りない項目ないかなとか経験上、要件定義に盛り込みたい内容とか上記から引用して追加しましたとか言うと説得力があっていいかなと思っています。
Unity 向けの vscode プラグインメモ

## C# for Visual Studio Code

- シンタックスハイライト
- コード補完
- デバッグ

## C# Extensions

- 定義もとへのジャンプ

## C# FixFormat

- コードをフォーマットしてくれる
- "editor.formatOnSave": true とすると、セーブ時に勝手にやってくれる

## Unity Code Snippets

- Unity 向けのスニペットが使用可能になる

## Debugger for Unity

- デバッグ実行用

## Code Spell Checker

- スペルチェックをしてくれる
- 辞書登録もできて便利

## Bracket Pair Colorizer

- カッコを色付けしてくれる
- 視認性が高くなる
Qiita 使い方

##Qiitaとは
一言でいうと、プログラミンなどの勉強をする時に、メモ帳の代わりに使えるものです。

##Qiitaができること
1.タイトルが作れます
2.写真が貼れます
3.コードをきれいに書けます
4.リンクが貼れます

##勉強した内容をメモ帳に落とすメリット
1.備忘録になります。
2.一度は皆さんが聞いたことがあるかもしれませんが、人に教えるつもりで勉強することでものすごく良い学習になります。なんでかというと、人に教えるために勉強した内容を自分なりに整理しないといけないため、理解が深くなり、忘れにくくなります。
Webでよく聞くRESTとは

## RESTとはWebのアーキテクチャスタイル
### アーキテクチャスタイルとは
複数のアーキテクチャに共通する性質、様式、作法あるいは流儀を指す言葉である。
MVC(Model-View-Controller)もその一つである。
デザインパターンとは異なり、こちらは別名「マイクロアーキテクチャパターン」と呼ばれ、アーキテクチャスタイルより細かい設計になっている。
## RESTとHTTPメソッド
GETやPOSTなどを使って決まったルールに従ったアドレスにアクセスすることで、必要な情報を保存したりできるようにすることができる。
HTTPということもあって、他のサーバーからアクセスして情報を取り出したりもできる。
## RESTful
RESTに基づいて設計されているプログラムは `RESTful`と呼ばれている。
`RESTful`なサービスは、情報の取得や送信など基本的な操作の方法が統一されているため、他のプログラムから簡単にアクセスしてサービスを利用することができる。

（こんなイメージ・・・わかりにくかったらごめんなさい）
![スクリーンショット 2020-01-22 6.42.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282722/0e31c2bd-8b6c-2b28-5810-2bd1f271820c.png)

## 個人的に
RESTfulで設計されるプロジェクトを見るとほっとします。
見やすくて着手しやすくて初見殺し感がないのでテンション上がってしまいます。
まだRESTfulに関してそこまで理解が深まっているわけではないのでなんとも言えませんが、自分で開発する際は簡単なプロジェクトではない限りRESTfulを意識したいです。