OmniAICreator/Qiita-1.07M huggingface dataset:
~簡易版~ Mac Visual Studio Code に Remote Development を 導入 しよう

# 目的

- Remote Development の導入方法の簡易版を作成しより楽にリモートマシンに接続する方法を書く。
- リモート環境にあるUbuntu18.04に接続する方法を記載する。
- MacからUbuntu18.04に接続する方法を記載する。

# 実施環境

1. OS: macOS High Sierra 10.13.6
1. 機種: MacBook Pro (15-inch, Early 2011)
1. CPU: Intel(R) Core(TM) i7-2675QM CPU @ 2.20GHz

# 実施概要

1. Visual Studio Code導入
1. Remote Developmentを導入
1. sshの設定
1. 接続テスト

# 実施詳細

1. Visual Studio Code導入
    1. 下記記事を参考にVisual Studio Codeを導入する。Macの方はインストールする際にMac用のファイルをインストールする。  
    [Mac Visual Studio Code 導入方法 VSCode ダウンロードから日本語化対応まで～画像付き導入解説～]()←リンク先準備中です。
1. Remote Developmentを導入
    1. 下記リンク先に飛びInstallをクリックする。  
    [Remote Development](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack)
    1. Visual Studio Codeが起動しプラグインがインストールされる。
1. sshの設定
    1. ターミナルを開き下記コマンドを実行して`~/.ssh`に`config`ファイルを作成する。
    
        ```
        # viでconfigファイルを開きたい方
        $ vi ~/.ssh/config

        # nanoでconfigファイルを開きたい方
        $ nano ~/.ssh/config
        ```

    1. 前述のコマンド実行後にターミナル上でエディタが起動したら下記記載を最終行に追記する。  
    ※記載内容は接続先のPC(Ubuntuマシン)情報に合わせて修正してください。

        ```
        Host 任意のわかりやすい接続先名
          HostName IPアドレス
          User 接続先ユーザ名

        # 筆者の環境の例
        Host extUbuntu
          HostName XXX.XXX.XXX.XXX
          User miriwo
        ```

    1. 保存してエディタを閉じる。
1. 接続テスト
    1. Visual Studio Codeを起動する。
    1. 正しくsshファイルに設定がなされていると、サイドバーにあるプラグインインストールアイコンのしたのRemote Developmentのアイコンをクリックした時に「SSH TERGET」直下にSSHのHostに記載した接続先名が記載される。(画像のextUbuntuと表示されている部分)  
    ![スクリーンショット 2019-10-24 23.45.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a98f6aca-e2cc-4377-8a97-72e10f338de0.png)
    1. サイドバーの「SSH TERGET」直下にSSHのHostに記載した接続先名を右クリック。(画像のextUbuntuと表示されている部分)する。
    1. 「Conect to Host in New Window」をクリックする。
    1. 新しくVisual Studio Codeが起動して下記の画面になるのでパスワードを入力してEnterを押す。(画面上部にパスワード入力窓が出ている)
    ![スクリーンショット 2019-10-25 0.02.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/3dce533e-60f5-9c25-2b32-806288a49147.png)
    1. 少し待ってサイドバーを開いた時に下記画像のように「SSH:SSHで設定した接続名に接続済み」と出れば接続完了である。
    ![スクリーンショット 2019-10-25 0.07.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/924f558b-0ca3-d6a3-ae8f-82bf4d61d53f.png)
意識の高いサイトに対して意識の低いスクレイピングをする

#意識低いけどスクレイピングがしたい！

久しぶりにやる気がでてきて、ちょっと情報サイトでも作って遊ぼうと思ってるんですね

ほんでデータ集めるためにスクレイピングしよっかなって

## 意識高いサイトはスクレイピング対策してて困る！
意識が低いので基本 file_get_contents とか curl とかで雑にやっちゃうけど
なんかヘッダいじったりしてもうまいこといかないとかある

## 意識高いことはしたくない！
しょうがないので別の方法でやるかーってなったんですけど
seleniumみたいな大がかりなことしたくないわけ

## 意識低民の味方 tampermonkey
そこで chrome版 greasemonkey こと tampermonkey の出番だぜ！（意識が低いので今日知った）

くわしくはこのへんみてね
https://www.lisz-works.com/entry/chrome-tampermonkey

あとダウンロードの自動化については以下を参考にしました　ありがとうございます
https://tks-kan.com/2016/08/25/154/

```js
// ==UserScript==
// @name         download
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @match        https://動かしたいサイト.com/*
// @grant        none
// @require      https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js
// ==/UserScript==

(function() {
    'use strict';

    // どん詰まりになったらとめる
    if ($('.hosiikontentu').length == 0) {
        return false;
    }

    var sspage = new XMLSerializer().serializeToString(document);
    var blob = new Blob([sspage], { "type" : "text/html" });
    var url = window.URL;
    var bloburl = url.createObjectURL(blob);

    // わにゃわにゃしてダウンロードファイル名をつくる
    var filename = hogefuga();

    // 新たにaタグを作成してダウンロード
    var a = document.createElement('a');
    a.download = filename;
    a.href = bloburl;
    a.click();

    // サーバにやさしく
    setTimeout(next, 5000);

})();

function next () {
    // なんだか次のURLを作る
    var newUrl = higehage();
    window.location = newUrl;
}
```

ちなみに chrome は最近はダウンロード時にダウンロード場所を選ぶダイアログが出るのがデフォなんで設定でオフにできるよ！
SQL

```sql:sql
-- 【DB】
-- データを保存するソフト。
-- Excelのイメージ。
-- データベースがExcelファイル、
-- テーブルがExcelのワークシート、
-- カラムがExcelの列、
-- レコードはExcelの行。
-- SQLという言語で登録、取得、更新、削除ができる。

C:\xampp\mysql\bin\mysql -u root -p

DROP DATABASE IF EXISTS test;

CREATE DATABASE test CHARACTER SET utf8;

USE test;

DROP TABLE IF EXISTS users;

CREATE TABLE users (
    id int NOT NULL AUTO_INCREMENT,
    name varchar(255), -- 255文字まで登録できる
    gender_id INT NOT NULL,
    created_at datetime  NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id)
);

INSERT INTO users (name, gender_id) VALUES ('りんご', 1);
INSERT INTO users (name, gender_id) VALUES ('みかん', 2);

SELECT * FROM users;

UPDATE users SET name='ばなな' WHERE id = 1;

SELECT * FROM users WHERE id = 1;
SELECT id,name,created_at FROM users WHERE id = 1;

DELETE FROM users WHERE id = 1;
```
# INNER JOIN
```sql:sql
DROP TABLE IF EXISTS gender;

CREATE TABLE gender (
    id int NOT NULL,
    name varchar(255),
    PRIMARY KEY (id)
);

INSERT INTO gender (id, name) VALUES (1, '男');
INSERT INTO gender (id, name) VALUES (2, '女');

SELECT A.id,A.name,B.name FROM users A INNER JOIN gender B ON A.gender_id = B.id;


```
# PHPで接続
```php:php
<?php

$mysqli = new mysqli('localhost', 'root', null, 'test');
if ($mysqli->connect_errno) {
  exit();
}

// $query = 'SELECT * FROM users;';
$query = 'SELECT A.id, A.name, B.name AS gender FROM users A INNER JOIN gender B ON A.gender_id = B.id;';
if ($items = $mysqli->query($query, MYSQLI_USE_RESULT)) {
  foreach ($items as $item) {
    echo $item['id'] . ' : ' . $item['name'] . ' : ' . $item['gender'] . '<br />';
  }
}
$mysqli->close();
?>
Next.js+TypeScript+ESLint(+Prettierいれたかった)で開発環境構築

# ぼうびろく

一旦ざーーーっとかいちゃいます！
必要なファイルの中身は下にいけばあるはず〜🌸
これで最低限動くはず。。
自動でlintしてはくれないのでそこも導入したいきもち。。

```shell
# フォルダ作成
mkdir myapp
cd myapp

# npmのはじまり
npm init -y

# ワイの環境は6.7.0だったよ
npm -v

# reactさんこんにちわ🙇‍♀️
npm install react react-dom next

# TypeScriptさんこんにちわ🙇‍♀️
npm install @zeit/next-typescript && npm i -D @types/next @types/react @types/react-dom

# ESLintさんこんにちわ🙇‍♀️
npm install --save-dev eslint @typescript-eslint/eslint-plugin @typescript-eslint/parser prettier eslint-config-prettier eslint-plugin-prettier

# package.jsonに書きたそう　中身は下記参照
vim package.json

# tsconfig.jsonに書きたそう
vim tsconfig.json

# eslintrc.json
vim eslintrc.json

# ここにindexとかかちこんでいきましょ😏
mkdir pages
cd pages
vim index.tsx

```


---

# 書きたそう

## package.json

```json
{
  "scripts": {
    "dev": "next",
    "build": "next build",
    "start": "next start",
    "lint": "eslint src/index.ts",
    "lint:fix": "eslint --fix src/index.ts" 
  }
}
```

## tsconfig.json

```json
{
  "compilerOptions": {
    "allowJs": true,
    "allowSyntheticDefaultImports": true,
    "jsx": "preserve",
    "lib": ["dom", "es2017"],
    "module": "esnext",
    "moduleResolution": "node",
    "noEmit": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "preserveConstEnums": true,
    "removeComments": false,
    "skipLibCheck": true,
    "sourceMap": true,
    "strict": true,
    "target": "esnext"
  }
}
```

## eslintrc.json

```json
{
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/eslint-recommended",
    "plugin:@typescript-eslint/recommended",
    "plugin:prettier/recommended",
    "prettier/@typescript-eslint"
  ],
  "plugins": [
    "@typescript-eslint"
  ],
  "env": { "node": true, "es6": true },
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "sourceType": "module",
    "project": "./tsconfig.json"
  },
  "rules": {
  }
}
```

## index.tsx
```tsx
import * as React from "react";

const Index = () => {
  return (
    <div>
      <span>hello</span>
    </div>
  );
};

export default Index;
```

---

# 参考

ほぼコピペしてすみません。。

[Next.jsチュートリアル翻訳](https://qiita.com/tetsutaroendo/items/31300a5e475688a2f4ec)
[Next.js + TypeScript 環境を爆速で作る](https://qiita.com/otsukayuhi/items/c7a907702d58bfc729b1)
[脱TSLintして、ESLint TypeScript Plugin に移行する](https://qiita.com/suzuki_sh/items/fe9b60c4f9e1dbc5d903)
疑似的な本貸出の仕組みを作る(Ruby経由でPostgresqlで接続)

勉強メモ。

#1.目標
　Windowsバッチに対して入力した内容を元に、RubyでPostgresqlに接続し、
疑似的に本の検索と貸出ができる仕組みを作ること

#2.目的
①情報を管理のための各概念を関連付けることのイメージを何か一つ持ちたい
②プログラムからDBMSにつなぐ方法を知りたい
③Windowsバッチを実際に書いて学びたい
④Rubyを実際に書いて学びたい

#3.やったこと
##3-1.前提条件
・Windowsバッチを、本の検索・貸出システムの入力画面に見立てる
・WindowsバッチがRubyを実行する
・RubyがPostgresqlに接続し、SQLを実行する

##3-2.概要
①概念の関係を整理する
②Postgresqlをインストールする
③必要なテーブルを作る
④メニューもどきを用意する
⑤SQLを実行する文をRubyで書く

##3-3.各論
###①概念の関係を整理する
▼やったこと
・『UMLモデリングの本質』を参考に、型図を書いた。
　![画像1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159895/6496f07f-20e7-91ea-c787-a45146b71c3c.png)


▼学んだこと
・管理するのは呼称と実体だったりする(「書名」と「蔵書」(人事システムなら、社員IDと社員番号みたいなものか))
・アクションを指す概念(ex.貸出、返却)は汎化して、個々の概念を下位の概念とすることができる。
　(人事システムなら、上位:発令、下位:退職発令、雇用発令など)
・汎化したら実際の管理方法としては区分管理になるはず。アクションを指す概念は、
　処理区分は必須で持つだろうし、アクションによって変更されるところの対象の
　コードや区分を持つのだろう。

###②Postgresqlをインストールする
▼やったこと
・以下のサイトを見てインストール

　PostgreSQLのダウンロード及びインストール
　https://www.dbonline.jp/postgresql/install/index1.html

▼学んだこと
・パスワード忘れて困った。

###③必要なテーブルを作る
▼やったこと
・以下のテーブルを作った(名前は適当)

　・book (book_no,book_name,author 等)
　・collection (collection_no,book_no(FK),rental_flag,rental_user_no,return_plan_date 等)
　・member (menber_no,member_name, member_password 等)
　など

▼学んだこと
・返却予定日って、貸出履歴側に持っておいて、抽出時に基準日指定の開始日で取れると
　思うけれど、検索の頻度の方が高そうだから、蔵書側に持っていた方がいいのだろうな
　と思った。

###④メニューもどきを用意する
▼やったこと
・Windowsバッチで



#4.学んだことまとめ

#99.参考
▼図書館システム
①https://ksuap.github.io/2016spring/library/index.html
自分用

終了タグがない＝空要素
input＝属性 半角空白で区切る
type属性で見た目や機能を変える
name属性は見分けをつける為に名前を付ける
行番号クリックでコピー
Command Sで保存
Command Cでコピー
Command Vで貼り付け

<P><button type＝"submit">登録する</P>
submit＝送信
登録ボタンを作ることが出来る

最初に<!DOCTYPE html>
 <html>
 
 <head>
      <meta charaset="utf-8">
      <meta name="viewport"
     content="width=device-width">
     <title></title>
 <head>
基本の形
h1やpで書いた文字やコードはbodyタグの中に書く
headタグの中にはmetaタグやtitleタグを入れる
charasetは文字コード(utf-8)を指定する物
name="viewport"はスマホのブラウザでどこからどこまで見るかを指定する物
基本はcontent="width=device-width"
titleタグはウェプページのタイトルを指定する物(重要)
PlantUMLでドメインモデルを表現するための文法

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/315083/2e74cb2d-7324-09b3-3199-bbe7aa85eb30.png" width=450px>

```
@startuml
left to right direction

hide circle
hide methods
hide members

mix_actor 顧客

class ショッピングカート
class 取扱品目
class 注文

顧客 o-- ショッピングカート
取扱品目 --o ショッピングカート
ショッピングカート o-- 注文

@enduml
```



### left to right direction
図が描写されるデフォルトの動作は、上から下だが、 `left to right direction` を使用することで、左から右に変更できる。

http://plantuml.com/use-case-diagram

### mix_actor
`mix_actor` を使用することで、クラス図にアクターを描写できる
https://forum.plantuml.net/2335/use-of-actor-inside-class-diagrams

### hide circle, hide methods, hide members

各項目を非表示にしている。
非表示にできる項目は以下の通り。

`fields`
フィールドを非表示にする
`attributes`
属性(アトリビュート)を非表示にする
`methods`
メソッドを非表示にする
`members`
メンバを非表示にする
`circle`
クラス名の前の丸で囲まれた文字`(c)`を非表示にする
`stereotype`
ステレオタイプを非表示にする
`empty fields`
クラスのフィールドが空の場合、メソッドを非表示にする
`attributes`
クラスの属性が空の場合、メソッドを非表示にする
`empty methods`
クラスのメソッドが空の場合、メソッドを非表示にする
http://plantuml.com/class-diagram

### `-`の数
`-`矢印のダッシュが多いほど、矢印は長くなる。
矢印の定義に `:` を追加することにより、矢印にラベルを追加できる。
http://plantuml.com/use-case-diagram
[漏洞预警]泛微ecology OA系统某接口存在数据库配置信息泄露漏洞

### 漏洞描述
泛微`e-cology OA`系统某接口存在数据库配置信息泄露漏洞.攻击者可通过存在漏洞的页面并解密以后可获取到数据库配置信息.如果攻击者可直接访问数据库,则可直接获取用户数据,由于泛微e-cology默认数据库大多为MSSQL数据库,结合XPCMDSHELL将可直接控制数据库服务器.
### 漏洞威胁等级
根据亚信安全网络攻防实验室评估为中危
### 利用难度
高
### 影响范围
目前已知为`8.100.0531`,不排除其他版本
### 漏洞复现
使用payload进行验证

直接访问该页面将为DES加密以后的乱码

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/79dfdaac-0b63-6319-c0bb-e7ea19b645e7.png)

需要使用DES算法结合硬编码的key进行解密

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/491410/4a0c53d7-3f21-79f2-ddf4-982e373ccce0.png)

### 修复建议
等待泛微官方进行修复
https://www.weaver.com.cn/
### 鸣谢
Lufei
Jupyter Notebook で "NameError: name '__file__' is not defined" となる

## 疑問

Jupyter Notebookで以下のコードを実行してみると...

```python
print(os.path.dirname(__file__))
```
エラーがでる。

```python
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-8-755a91d3a9c3> in <module>()
      3 > NameError: name '__file__' is not defined
      4 '''
----> 5 print(os.path.dirname(__file__))

NameError: name '__file__' is not defined
```

どうしてだ...？

## 原因
JupyterではIPython(REPL)からコードを実行しているが、この環境下だと特殊グローバル変数 `__file__`は設定されないらしい。

## 解決
代わりに以下のコードで現在のipynbの絶対パスを取得する。

```python
os.path.abspath('')
```

## 参考
[stack overflowの投稿](https://stackoverflow.com/questions/39125532/file-does-not-exisit-in-jupyter-notebook)
picoCTF 2019 The Factory's Secret - Points: 1

#問題

https://2019game.picoctf.com/problems

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/5d0e4e5a-408a-7492-e244-803363c996d9.png)

#解いてみた

2019始まってたので、これからはこれを。

最初の1点の問題なんですが、謎すぎる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/4b40be20-3a4a-b55d-2321-17b67d8a9595.png)

なにこれ？
とりあえずリンククリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/e5fb6570-0b14-daf9-9686-4de1cf15533c.png)

なにこれ？
とりあえずこれやるしかないのか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/a02cf8d8-155e-ab79-4d2f-37b4201ff468.png)

なにこれ？
なぞの50点問題みたいなの出てきた。
1点問題解きたいんだが。

0x70をアスキーコードに直して回答する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/77f60d66-cbc7-0b39-084b-2b273e10cddd.png)

そのあと延々と英語が続いて全く意味が分からない。
やる気0。

普通の方を見たらさっきの問題があったみたいで、回答済みになってた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/ecdc5e3f-e8c7-685d-fd09-e8b23c0aaa17.png)

連動しているのか。
とりあえず無視して、普通に解いていけばよいんじゃないかと思う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/cf6d4b60-ae59-1870-a1fc-503d127c0bab.png)

ファイルがやたらと大きかったので、テキストで開いて、「pico」で検索。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/c0ee5666-61b7-9913-500e-c3bb5ca6d165.png)

次。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/01488f09-c82c-c800-d827-6c1938473347.png)

リンクをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/4086258c-28d4-25f9-b49f-6befa82fecac.png)

ソースコードを表示してみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/02405554-29b9-a56a-ad2d-67569d693e1e.png)

1/3しか表示されてない。
読み込まれているmycss.cssの中身を見てみる。

2/3見つけた。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/59c3e576-89ed-2b62-213f-db6a51d3f2f5.png)

myjs.jsの中身を見てみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/3fae94e1-745c-9f82-14df-3690408076ce.png)

全部繋げると答え。

結局1点問題が分からない。
一番難しい。。。
意味不明すぎなので、この問題はあきらめて50点問題をここで一気に解くことにする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/643170c4-fb5d-0b01-64dc-a7d5a1c3d442.png)

問題のファイルを見ると数字の羅列でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/9c0f060d-9a63-118a-fe8f-24a4ca463e63.png)

picoCTF{XXXXXXXXXXXX}
を数字で表しているようなので対応表を作る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/677fe049-930f-3ba3-9681-1a7d673aaa44.png)

このまま一つずつ変換したら答え。
と思ったら違った。
ヒント。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/1077aa61-3738-41dc-ec25-b30f6d3be764.png)

いきなり回答のフォーマットを変えられていました。
ヒントというかこれは問題では？
これないと答えられないし。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/d1ad3b83-64c0-445b-40dc-aa5098fcb927.png)

16進数を10進数に変換する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17681/d946cc47-f967-f4bd-daa8-d802625acd95.png)

この次の問題はshellcodeの問題で50点のわりにちょっと時間かかりそうだったので、ひとまずここまでとします。
MySQLでDBのコピーを作成する

MySQLで検証用に現行のDBのコピーを作りたい場合など、
サーバー内のDBのコピーを作成したい場合、以下コマンドでDBのコピーが可能。

```
$ mysqldump -u ＜ユーザー名＞ -p ＜コピー元DB名＞ > ＜コピー元DB名＞.sql
$ mysqladmin -u ＜ユーザー名＞ -p create ＜コピー先DB名＞
$ mysql -u ＜ユーザー名＞ -p ＜コピー先DB名＞ < ＜コピー元DB名＞.sql
```

1行目の`mysqldump`コマンドでコピー元DBのデータを出力させて
2行目のMySQLを操作するコマンド`mysqladmin`にcreateオプションを付けてコピー先のDBを作成する。
その後3行目のコマンドで、コピー先DBに対してmysqldumpで作成したファイルのデータを投入する。


## 実行例

```
▼コピー元DB(FromDB)の内容をFromDB.sqlというファイル名で出力。
mysqldump -u UserName -p FromDB > FromDB.sql

▼MySQLにコピー先となるDB(ToDB)を作成。
mysqladmin -u UserName -p create ToDB

▼コピー元DBのデータが書かれているFromDB.sqlをコピー先DB(ToDB)に対して実行。
mysql -u UserName -p ToDB < FromDB.sql
```

出力させたFromDB.sqlは他のMySQLにも使用できるので、
DBの複製やバックアップの取得はめっちゃ楽。
OracleにもDataPumpよりもこういう機能が欲しい…。
コールバック関数

よく聞くコールバック関数とは何か。どの様に使うのか。
自身の学習用メモとしてまとめます。
ご指摘あればお願いいたします。

##コールバック関数とは
関数には引数を渡すことができますが、コールバック関数はその引数に、「別で作った関数」を渡すことができます。

まず引数とは、例えば下記の様に関数にあらかじめ仮引数を設定しておき、引数として値を渡せば関数で処理された結果が帰ってきます。

```php
<?php
function getSum($num1, $num2){
  return $num1 + $num2;
}

$sum = getSum(2, 4);
echo $sum;　// 6
?>
```
この引数に「関数」の処理を丸ごと渡してしまうのがコールバック関数。

##用途
関数が実行された後に続けて、引数で渡した関数を実行することにより、処理のフローを制御できる。Aを実行したら続けてBを実行するということができる。非同期処理の際などによく使うらしい。


例
"I say"に続けて何か言葉を続けさせる処理を書いてみます。

PHPファイル

```php
<?php

//コールバック関数を作る
function callback_func(){
  return "hello";
}

//コールバック関数を実行する関数を作る
function func($callback){
  echo "I say :".$callback();
}

コールバック関数の実行
func("callback_func");　//I say hello

?>
```

###１、まず、コールバック関数を作ります。
今回コールバック関数としてcallback_funcと名付けた関数の処理内容は、helloと表示することとします。

```php
function callback_func(){
  return "hello";
}
```
###２、コールバック関数を実行する関数を作ります。
今回用意したfuncという関数の処理内容として、I sayと表示させます。
また、仮引数として$callbackを用意します。
これで以下の様に書けば、まずfuncの処理つまり"I say"を表示し、続けて引数として渡された関数が続けて実行されます。

```php
function func($callback){
  echo "I say :".$callback();
}
```
###3、コールバック関数を実行しよう
では、"I say"と表示し、その後続けて実行する関数は何か。
１で用意した、callback_func関数を引数として渡してみます。
callback_func関数は"hello"と表示する関数でした。
つまり、"I say"の後に"hello"が表示されます。
（phpではドットで文字列を結合できます）

```php
func("callback_func");　//I say hello
```

まだまだ、コールバック関数は奥が深そうなので、引き続き色々調べてみます。
電話番号をハイフン区切りに変換する

# ハイフン無しの電話番号をハイフン付の形式に変換する


- ハイフン付き電話番号に分割
- ハイフン無しの電話番号をハイフン付の形式に変換

## Installation
You can install this plugin with Composer.

```sh
$ composer require rebib/phonenumbersplitter
```

## 例

```php
 $provider = (new Rebib\Phonenumber\Splitter())->parse("031-234-5678");
 ```

### ハイフン無し
 ```php
 echo $provider->getNumberWithoutHyphen(); 
```

```
0312345678 
```    

###  ハイフン付
```php
 echo $provider->getNumberWithHyphen(); 
```

```
03-1234-5678
```    

###  array
```php
 print_r($provider->toArray());
```
 
```
Array
(
    [0] => 03
    [1] => 1234
    [2] => 5678
)
```
CSSが反映されない理由 ～背景の色は白じゃない、透明なんだ～

#CSSで方眼を作るぞ！⇒縦横どちらかしか反映されない…#
「HTMLページの背景を方眼紙みたいにしたいなあ」と思い、コードを書きました。
＜理想＞
<img width="600" alt="方眼_risou.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/d2a9d56a-1760-b36f-04f7-0f2d59261292.png">
＜最初に書いたコード　※これでは「理想」にならない＞
・HTML(関連部分のみ抜粋)

```hougan.html
<div id="page" style="width:100%; height:100%;"></div>
```
・CSS

```hougan.css
#page
{background: linear-gradient(to right, #ffffff 49px, #b0c4de 1px),
             linear-gradient(to bottom, #ffffff 49px, #b0c4de 1px);
 background-size: 50px 50px;}

```



`コードの説明をします。「わかるよ！」という方はお読み飛ばしください`
linear-gradientというのは、
・まず色の変化の方向をきめて（to top, to bottom, to right, to leftなど）
・その方向に向かって〇px（あるいは〇%）までの部分を何色にする！
という指定ができるものです。

上のコードではまず**１個目**のlinear-gradientで、
「**左から右**に向かう方向で考えてね。一番左から49pxまでを#ffffff（白）で、そこから1pxを#b0c4de（青っぽい色）にしてね！」と指定をしています。
↓こんな感じ↓
<img width="400" alt="リニア.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/48892be5-145d-ce71-145c-d90b25936cf1.png">


それから**２個目**のlinear-gradientで、
「**上から下**に向かう方向で考えてね。一番上から49pxまでを#ffffff（白）で、そこから1pxを#b0c4de（青っぽい色）にしてね！」と指定をしています。
↓こんな感じ↓
<img width="400" alt="リニア.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/f2b803e4-609d-db8e-7b20-debc87378c25.png">

指定された２つのlinear-gradientは重なりあうので、縦線と横線が交わった方眼のような見た目になるのです。


そして最後のbackground-sizeで、「49pxの白色部分と1pxの青色部分でできた合計50pxの模様を、divの範囲のなかで繰り返してね！」と指定しています。
`・・・コードの説明おわり・・・`



☟さて、先ほどのコードの実行結果は…
<img width="600" alt="方眼_risou.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/ec40e0af-174a-3f69-143c-41a22c6a4836.png">
縦線しか反映されてない！！なんで？？？？

#上のレイヤーを透明にしないと、下のレイヤーに書いてあるものは見えない#
失敗の原因はタイトル通り、線と線の間の余白部分を#ffffff（白）で指定していたためでした。反映されなかった横線は、**正しく実装されていたのに、上のレイヤーの白色で塗りつぶされてしまっていた**のです。
<img width="600" alt="おおいかくす.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/317ed50f-1b71-125d-b431-2fec7ad6c8e2.png">
そこで、今まで#ffffffで指定していた49pxの部分を、透明（**transparent**）で指定すると、下に隠れていた横線がちゃんと見えるようになり方眼模様を実装できました。
<img width="461" alt="おおいかくす.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/da4cb110-7c31-dff1-dd82-617b06d6fb88.png">

＜正しいコード＞
・CSS

```hougan.css
#page
{background: linear-gradient(to right, transparent 49px, #b0c4de 1px),
             linear-gradient(to bottom, transparent 49px, #b0c4de 1px);
  background-size: 50px 50px;}
```
最初のコードで「#ffffff」だった部分を「transparent」に変更！

実行結果は
<img width="600" alt="おおいかくす.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513594/f764fced-ff96-d54b-2965-7591f83ddba1.png">
理想通りになりました！

以上です。
この記事がもし誰かの助けになれたら幸いです。
cordova-plugin-purchase を使ってアプリ内課金を実装したが xcode の simulator で上手く動かない

cordova のプラグイン、cordova-plugin-purchase を使って課金ロジックを実装した場合、xcode の simulator では動作確認ができない。

[ここにこっそり書いてあった](https://github.com/j3k0/cordova-plugin-purchase/issues/239#issuecomment-432642355-permalink)

他にどこにも書いてなさそうだったので。
もっと早く知りたかった。。
スマホをBluetoothで Raspberry Pi 3B+ に接続、ラズパイに繋いだスピーカーから音を出す

## 環境

* OS: Ubuntu 18.04.3 LTS (Bionic Beaver)
* Hardware: Raspberry Pi 3B+
* Android端末: Essential Phone PH-1, HUAWEI nova

```
Android端末 --Bluetooth--> Raspberry Pi --USB--> スピーカー
```

## PulseAudio経由で音を出す

皆さんPulseAudio経由でA2DP環境を構築しているようです。
http://temama.hatenablog.com/entry/2019/06/21/114751
上の記事が大変参考になります。
しかし、私の環境では以下のようにBluetooth接続後すぐ切断する症状がでてしまいました。

```
$ sudo bluetoothctl
[bluetooth]# discoverable on
...
[CHG] Device XX:XX:XX:XX:XX:XX Connected: yes
[CHG] Device XX:XX:XX:XX:XX:XX Connected: no
[bluetooth]# 
```

`bluetooth disconnect immediately`的なキーワードで調べても、Ubuntu起因なのかラズパイ起因なのかすらわからず、結局諦めました。bluezをダウングレードしろだとかいろいろ意見が飛び交っていましたが、どれも解決には至りませんでした。

## オススメの方法
そこでオススメなのが、以下のプロジェクトを使う方法です。
https://github.com/nicokaiser/rpi-audio-receiver

```sh
sudo apt update -y
sudo apt upgrade -y
sudo apt install -y --no-install-recommends git

git clone https://github.com/nicokaiser/rpi-audio-receiver.git
cd rpi-audio-receiver
./install.sh
...
Do you want to install Bluetooth Audio (BlueALSA)? [y/N] y
...
```

上のようにインストールしてください。`BlueALSA`以外は不要なのでお好みで。
サービスが作成されているので、以下のように起動します。

```sh
sudo systemctl start bluetooth-agent.service
```

あとは、普通に`bluetoothctl`を使って接続するだけ。

```
$ sudo bluetoothctl
[bluetooth]# discoverable on
[bluetooth]# trust XX:XX:XX:XX:XX:XX
```

## Ubuntuの場合

以下の手順が必要になると思います。

https://github.com/Arkq/bluez-alsa
上記プロジェクトを`make install`

`raspi-config`なるコマンドはUbuntuになかったので、コメントアウト。
https://github.com/nicokaiser/rpi-audio-receiver/blob/2647fa3bea333d0be65f49796bc3c712d0bf5455/install.sh#L4

`bluealsa`なるパッケージがなかったので、上で手動インストールしました。そのため、`bluealsa`だけ削除。
https://github.com/nicokaiser/rpi-audio-receiver/blob/2647fa3bea333d0be65f49796bc3c712d0bf5455/install-bluetooth.sh#L7
また、`hci0`を`hci1`に一括置換。

`/usr/bin/hciconfig`を`/bin/hciconfig`に変更。
https://github.com/nicokaiser/rpi-audio-receiver/blob/2647fa3bea333d0be65f49796bc3c712d0bf5455/install-bluetooth.sh#L148
https://github.com/nicokaiser/rpi-audio-receiver/blob/2647fa3bea333d0be65f49796bc3c712d0bf5455/install-bluetooth.sh#L149

以上です。
Railsのテストについて

##テストの種類
全体的なテスト
・システムテスト:ブラウザを通してアプリケーションの挙動を外部的に確認できるテスト
・結合テスト:いろいろな機能の連続を確認するテスト
・機能テスト:コントローラ単位のテスト

個々の部品のテスト(モデル・ルーティング・ビュー・ヘルパー・メーラー・ジョブ)

##テストの頻度
モデルのテスト(高頻度)

結合テスト(高頻度)

ルーティング・メーラー・ジョブのテスト(モデルよりは頻度が高くない)

##テストを行うために必要なもの
・データベース(自分で準備する)
・テストデータ(自動的に作られる)

RSpecとCapybaraを使ってテストを行う

##Unitテスト(ユニットテスト・単体テスト)

``` ruby
class 〇〇Test < ActiveSupport::TestCase
 test  "test name" do
    #実行するコード
   assertion #ここにassertionメソッドを #結果の確認 #testブロックの中に最低一つは必要
 end
end
```

testは

test name do
実行するコード
確認用のassertionメソッド
end

で行う

##Integrationテスト(統合テスト)
複数のコントローラーに跨って、ユーザーの実際の操作を追跡するような用途で利用する。
→多段階のプロセスの追跡が可能


作り方(Integrationテストは自分で作る必要がある)

```
rails generate integration_test testname
```


##テストの準備と後始末(テストスクリプトでの予約メソッド)
setup　(使用するリソースの初期化)
teardown(使用したリソースの後始末)
これらは基底クラスで定義されているので、個別にオーバーライドして使用する
GLSLでsmoothstepみたいな線形補間

小ネタです。

---

GLSLには`smoothstep`という引数に渡した値から滑らかに補間した値を返してくれる関数があります。
[smoothstep \- OpenGL 4 Reference Pages](https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/smoothstep.xhtml)

```glsl
float x;
float v = smoothstep(0.2, 0.8, x);
```

例えば上のコードでは、`x <= 0.2`のとき0、`x >= 0.8`のとき1、`0.2 < x < 0.8`のときは[0, 1]の範囲の単調増加する滑らかな値を返します。グラフにすると以下のようになります。
![smoothstep.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/6cd2f649-9778-6846-f656-d34b6532358a.png)

---

`smoothstep`と同じ引数を取り同じような値を返し、かつ滑らかには補間しない線形バージョンの`linearstep`は以下のようになります。

```glsl
#define linearstep(edge0, edge1, x) min(max(((x) - (edge0)) / ((edge1) - (edge0)), 0.0), 1.0)
```

`smoothstep`と同じように使うことができ、`x <= 0.2`のときは0、`x >= 0.8`のときは1、`0.2 < x < 0.8`では[0, 1]の範囲の単調増加する値を返します。

```glsl
float x;
float v = linearstep(0.2, 0.8, x);
```

グラフにすると以下のようになります。
![linearstep.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/d4ae3abb-4632-4639-df8e-1abe10a81157.png)

関数ではなく関数マクロを利用することで`linearstep(vec3(0.0), vec3(1.0), x)`というように引数に`float`以外の値も利用できるようになります。

---

`linearstep`を使用することで以下のように任意のイージング関数を`smoothstep`と同じような感じで使えるようになります。

```glsl
float circularIn(float t) {
  return 1.0 - sqrt(1.0 - t * t);
}

float v = circularIn(linearstep(0.2, 0.8, st.x));
```

![circularin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61569/13992311-3789-2480-736e-d8cc32d024d2.png)

--- 

サンプルコードをglslsandboxに置いておきます。
http://glslsandbox.com/e#58184.0
備忘録まとめ

EC2 ... 課金が1時間単位または秒単位であり、EC2で提供されるOSによって異なる。
↓↓↓
Amazon Linux 秒単位
Windowsや他のLinux系　時間単位課金

EC2の再起動は、Running状態のままOSが再起動するだけ。

EC2インスタンスはデフォルトの設定で、どのホストコンピュータに配置されているかをユーザーが指定することはできない。
さらに自分のAWSアカウントに専用のホストコンピュータが割り当てられるわけでもありません。
これを**マルチテナンシー**と呼ぶ。

EC2インスタンスが配置されるホストコンピュータに内蔵されたディスクを
**インスタンスストア**と呼ぶ。

EC2は再起動と同時に別のホストコンピュータに移る。

EC2には、EBSとインスタンスストアの2種類のストレージがある。
EBSは仮想ネットワークディスクであり、EC2インスタンスが配置されるホストコンピュータには配置されない。また、EBSはEC2インスタンスから独立しており、データに永続性がある。

先ほど記載したテナンシーとは別にAWSアカウント専用のホストコンピュータを利用するオプションも選択できる。
「共有」、「専用」」、「占有ホスト」のいずれかを選択できる。それぞれを
**マルチテナンシー、ハードウェア占有インスタンス、Dedicated Hosts**に該当する。

ハードウェア占有インスタンスとDedicated Hostsの違いとしては
・配置するホストコンピュータのコントロールが出来るかできないかである。

ハードウェア占有インスタンスはコントロールできず、
Dedicated Hosts はコントロールできる。

Dedicated Hostsはユーザー自らインスタンスを配置するホストコンピュータを選択することが出来る。また、そのホストコンピュータを**DedicatedHosts**と呼ぶ。

EIPは利用していない間に課金が行われる。課金起きる例↓↓↓
・どのインスタンスにも割り当てられていないとき。
・割り当てたインスタンスがStopped状態のとき。
・1つのインスタンスに対して2つ目のIPアドレスが割り振られているとき。(EC2稼働していても)

EC2購入オプションまとめ
オンデマンドが標準。リザーブドが1年か3年選んで割引購入

**・スポットインスタンス**
時価購入。ユーザーの設定した金額がAWSの提示した金額よりも高い場合、ユーザーが利用可能。
AWSの提示より低くなってしまった場合、利用不可となってしまう。

**・ハードウェア占有インスタンス**
ユーザ専用のホストコンピュータに配置されるが、どのホストコンピュータに配置されるかは分からない。支払いはインスタンス単位で、リザーブドやスポットもある。

**・Dedicated Hosts**
ユーザー専用のホストコンピュータにインスタンスが配置される。
インスタンスが配置されるホストコンピュータ単位での支払いが起こる。
Heroku + Python で GoogleAPIを使うときにシークレットをソースに入れない話

Googleのサービスは無料な上に大変便利ですね。そんなサービスをPythonからでもかんたんに使うことができますが、認証に関連するファイルはgitに含めないようにするのはお約束。そんな話です。
# 状況
* Herokuで動いているアプリケーションでGoogleのAPIを使う
* Google DriveやCalendarの`QuickStart.py`はGoogleから提供されるクライアント情報を`client_secret.json`をというファイルに保存して使っている
* Herokuはgit連携で使っている

# やりたいこと
* ソースを公開できるように`client_secret.json`をgitの管理対象にしたくない
* その上でGoogleのサービスを使えるようにしたい

# やったこと
## 環境変数に書き込む
Herokuの環境変数に`client_secret.json`の内容をそのまま入れてしまうことにしました。というかそのまま変数に入るのが驚きです。

* CUI

```bash
$ heroku config:set {お好みのKEY}=$(cat client_secret.json)
```
* Web
    1. DashBoard → 対象のApp → Setting → ConfigVars を開く
    2. Reveal Config Varsを開く
    3. 左側にKEY,右側に`client_secret.json`の中身を全部コピペしてAddをクリック

環境変数に追加したら、`os.environ[KEY]`でpythonからアクセスできるようになります。

## 認証オブジェクト作成につかうメソッドを変更する
`Quickstart.py`では

```python
 flow = InstalledAppFlow.from_client_secrets_file(CLIENT_SECRET_FILE, SCOPES)
```
のように`InstalledAppFlow.from_client_secrets_file`を使っていますが、名前が_~_file_ということは当然ファイル以外から読み出す方法があるはずと考えました。

ありました。
`InstalledAppFlow.from_client_config`を使えばファイルではなくjsonオブジェクトから認証オブジェクトを作れるようです。なのでオブジェクト作成部分を以下のように変更しました。

```python
import os
import json

from google_auth_oauthlib.flow import InstalledAppFlow

SCOPES = [
    # 利用するスコープ
    "https://www.googleapis.com/auth/drive.file"
]

# 環境変数の中身をjsonにパースしてから利用する
secret = json.loads(os.environ[{さっき指定したKEY}])
oath_obj = InstalledAppFlow.from_client_config(secret,SCOPE)
```

# おわり
こうすることで見せたくないものを公開せずにHerokuに今までどおりデプロイできるようになりました。せっかく作ったものはgithubでpublicにしておきたいので、うまくいってよかった。

# 参考
* google_auth_oauthlib.flow module — google-auth-oauthlib 0.4.1 documentation<br>
    https://google-auth-oauthlib.readthedocs.io/en/latest/reference/google_auth_oauthlib.flow.html
発達障害者がテスト文化のない会社のテスター業務に就いて

#障がい者テスター
発達障害だといろいろな特性を持っておりそれぞれ得意不得意がある。
変な視点を持っている者もいれば、テスト項目を忠実にこなすものもいる。
実際、テスト項目だけではカバーしきれない欠陥を見つける人もいる。
興味があることにとことん集中し探求し続ける人もいる。
どれもテスト実施には必要な特性だと思う。

##テスト文化がないということ
テスト文化がないということは、試験項目のフォーマットやレビューしてくれる人がいない。
そもそも障害者テスターにテスト設計ができるものがほとんどいない。
サービスによっては丁寧に試験項目を提供してくれる場所もある。
とりあえず補填対応に発展しなくてもいいレベルで新機能のテストをしてほしいと依頼もある。
開発環境のデータは本番とは比べてもあり得ないデータが多く本当にテストしているのか不安になる。
そもそもテスト文化がなかったのはリリース頻度が早すぎたためでどこにも依頼できなかったらしい。。。

##リリース頻度が早い
金融系SEで基本ウォーターフォールでの環境にいたため、スクラム開発によるリリース頻度がとても早く感じる。
週に4案件のリリース頻度でまともな仕様書がない状態で開発が進められていく。
この中で、どういった機能実装するかの口頭説明だけで試験項目を作成しリリースまでに試験を実施する。

##仕様書がない、作ってもメンテが間に合わない。
週に4案件以上ぶん回しているため、日々画面が構成が変化していく。
一度画面構成図を作ったがリリース頻度に合わせた試験実施等で、メンテする暇もなく・・・
現状リリースされているバージョンが仕様という認識でみんなが動いている。

##特性を生かした試験
基本私は新しいもの好きである。
日々変化するサービスをユーザーが触れる前に試験できるのがとても楽しい。
楽しいものは勝手に覚えるし苦痛にもならない。
子供がゲームに夢中になるのと同じような感じたと思う・・・・
サービス担当者さえあまり把握していない仕様すら覚えてしまっている。
気が付けば開発環境にどんなデータがどんな条件で出てくるかも勝手に覚えてしまっている。
どこの画面に変更が入ったらどこが危ないなど経験から予測して欠陥を見つけ出せるようになっていた。

##テスターとしてどうなの？
ある日テスターとしてどうなんだろうと思う日が来た。
簡単な機能を試す試験項目だけ作って、あとは経験ベースの探索的テスト中心。
後輩や新しい人が入ってきたときに対応できない状態、俗人化したテストになっていた。
とりあえず、テスト設計とテスト技法を学ぶことにした。

##今後
テスト技法や現場で学んだ知識や観点などの備忘録
障がい者エンジニア？？的な内容を書いていこうと思う。
Hidennotareの使い方(2) CSVReaderクラス

Hidennotare の紹介
https://qiita.com/RelaxTools/items/573b8ea1c1745bb73240

Hidennotare
https://github.com/RelaxTools/Hidennotare

Hidennotare Wiki
https://github.com/RelaxTools/Hidennotare/wiki

#CSVReaderの使い方

CSVファイルを読む「CSVReader」について解説します。
CSVファイルを読むときに使用します。
https://github.com/RelaxTools/Hidennotare/wiki/CSVReader

###Test.csvの内容(UTF8,LF)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69810/6a71e59d-1b91-15b6-0a61-27da04783e07.png)

##ソースコード

```vb

    Dim IC As ICursor
    Set IC = CSVReader.CreateObject("E:\Test.csv", NewLineCodeLF, EncodeUTF8)
    
    Do Until IC.Eof
    
        Debug.Print IC(1)
        Debug.Print IC(2)
        Debug.Print IC(3)
    
        IC.MoveNext
    Loop
```

##結果(イミディエイト)

```
001
利根太郎
東京都
002
筑後次郎
福岡県
```
##解説

###コンストラクタ

コンストラクタの内容は以下のとおり。

* E:\Test.csvを読む。
* 改行コードはLF
* エンコードはUTF8

※ CSVの項目内にカンマや改行コードが入っていても読むことができます。（コーテーションあり)
　くわしくは以下リンクへ。
https://github.com/RelaxTools/Hidennotare/wiki/CSVReader

```vb
    Set IC = CSVReader.CreateObject("E:\Test.csv", NewLineCodeLF, EncodeUTF8)
```

###EOFプロパティ

CSVの行が終了した時に True になります。

```vb
    Do Until IC.Eof
```

###Itemプロパティ

Itemは省略可能です。現在の行の１列の値をVariant型で返却します。列の値は定数ですが、Enum で指定することが多いようです。

```vb
    Debug.Print IC(1)
    Debug.Print IC.Item(1)
```
###MoveNextメソッド

現在の行を次に移動します。

```vb
    IC.MoveNext
```

１回目のSheetCursorを比べてことなる部分は、コンストラクタ、Itemプロパティの返却値。
Sheet と CSV 読むものが異なりますが、ICursor I/F を使うとほぼ同じ使い方が可能です。

Hidennotareの使い方(1) SheetCursorクラス
https://qiita.com/RelaxTools/items/f0395ff268a6288570c0
Ubuntu再セットアップ手順

作成しながら記事作成(中)。
※バージョンは作成現在


# マシンスペック
- M/B: ASUS PRIME Z270-A
- CPU: i7-7700K
- Memory: BLS16G4D240FSB.16FBR * 4
- GPU: GeForce GTX 1070
- Storage: PLEXTOR PX-512M8PeY(nvma)


# 前準備
- ホームディレクトリの英語化
    - `LANG=C xdg-user-dirs-gtk-update`
- sudoers調整
    - `sudo apt install -y vim`
    - `sudo update-alternatives --set editor /usr/bin/vim.basic`
    - `sudo visudo`で`ALL     {設定したユーザ名}=NOPASSWD: /usr/bin/apt`追加
- なんだかんだで必要な色々
    - `sudo apt install -y wine winetricks`
    - `winetricks allfonts`
    - `sudo sh -c "echo $NAS_IP:$NAS_PATH ~/mnt/storage nfs >> /etc/fstab"`


# 開発環境
- 仮想環境(KVM)  
    - 参考:http://engetu21.hatenablog.com/entry/2018/12/10/010320  
        - PCIデバイスが違うので下記部分を修正(今回の場合)
            - `10de:1c03`→`10de:1b81`
            - `10de:10f1`→`10de:10f0`
    - `sudo add-apt-repository -y -n ppa:jacob/virtualisation && sudo apt update`
    - `sudo apt install -y qemu-kvm qemu-utils qemu-efi ovmf libvirt-dev libvirt0 virt-manager`
    - `sudo systemctl start libvirtd`
    - `sudo systemctl enable libvirtd`
    - `sudo systemctl start virtlogd`
    - `sudo systemctl enable virtlogd`
    - `wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso`
    - `sudo sh -c "echo 'options vfio-pci ids=10de:1b81,10de:10f0,1b21:1242,1033:0194' >> /etc/modprobe.d/vfio.conf"`
- プログラミング
    - `sudo apt install -y git hub`
    - `wget -O - "https://download.jetbrains.com/toolbox/jetbrains-toolbox-1.16.6016.tar.gz" | tar xzf - && ./jetbrains-toolbox-1.16.6016/jetbrains-toolbox && rm -fr jetbrains-toolbox-1.16.6016`


# その他インストール
- シェル関係
    - `sudo apt install -y zsh tmux`
- ネットワークドライブ
    - `cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf - && ~/.dropbox-dist/dropboxd &`
- ターミナル
    - `sudo add-apt-repository ppa:mmstick76/alacritty && sudo apt install -y alacritty`
- 解凍
    - `sudo apt install -y unar`
- 動画再生
    - `sudo apt install -y vlc`
- 画像ビューア
    - `wget https://www.dropbox.com/s/vhd2xni16qfcder/MassiGra045.zip && unar MassiGra045.zip && sudo mv MassiGra045 /usr/local/bin/Massigra`
        - `echo 'massigra() { wine /usr/local/bin/Massigra/MassiGra.exe $1 & }'>>~/.zshrc`
- ディレクトリ検索
    - `sudo add-apt-repository -y ppa:christian-boxdoerfer/fsearch-daily && sudo apt update && sudo apt install fsearch-trunk`
- チャット
    - `wget "https://downloads.slack-edge.com/linux_releases/slack-desktop-4.1.1-amd64.deb" && sudo apt install ./slack-desktop-*.deb && rm ./slack-desktop-*.deb`
- steam
    - `sudo apt install -y steam`
COMオブジェクトの解放のお作法 - C#(というか.NET)

# 経緯

COM Objectといえば「`ReleaseComObject`で解放だー」みたいな印象があるが、.NETからExcelとか操作してると、いろんなオブジェクトが参照カウント増やしてくれ<strike>やが</strike>るので、管理できなくなるし`try{...}finally{解放処理}`のネストがエグくなる。

そんななか

[`Marshal.ReleaseComObject`は危険な場合がある]
(https://www.infoq.com/jp/news/2010/03/ReleaseComObject-Dangerous/)

というのを目にして、どうやればよいのか、
COMオブジェクト×.NETに関するKindle書籍(下記「参考書籍」参照)を持ってたので少し調べてみた。

# 参考書籍

<b>.NET and COM: The Complete Interoperability Guide</b> - Adam Nathan著

著者はMicrosoftの中の人のよう。

読破できる気がしないので、書籍内検索する形で活用。

# GCに任せる方法

6章<b>Advanced Topics for Using COM Components</b> の  Listing 6.5 とその前のあたりの記載より。

GCに任せるという手法が紹介されている。（推奨なのかどうかは読解できず。）

(まんま載せると著作権的によくなさそうなので雰囲気だけ。)

```csharp
using System.Runtime.CompilerServices;

[MethodImpl(MethodImplOptions.NoInlining)]
static void WorkWithMsOfficeComponent()
{
    XXX(Excelとか).Application app = new XXX.Application();
    ...
    app.Quit();
}

static void Main()
{
    WorkWithMsOfficeComponent();
    GC.Collect();
    GC.WaitForPendingFinalizers();
}
```

スコープ（変数の生存区間）の短いauto変数に押し込めることができるなら、上記のやりかたが楽っぽい。

属性 `[MethodImpl(MethodImplOptions.NoInlining)]` を指定しているのは、JIT[^1]によるインライン展開を防止してGCを意図通りに機能させるため。

# 参考サイト

計測方法とかが参考になりそう。（時間なくてまだ試せていないです。）
[.NETを使ったOfficeの自動化が面倒なはずがない―そう考えていた時期が俺にもありました。](https://qiita.com/mima_ita/items/aa811423d8c4410eca71)

[^1]: JIT(Just in time)コンパイラ(実行時にNativeな実行プログラムにコンパイルされる)によってインライン展開されると、変数の生存区間がプログラマの意図通りにならず、結果としてGCがプログラマの意図通りに動作しない。
Gitの初回コミットを取り消す

gitで一番最初のコミットを取り消そうとして
`git reset HEAD~`
を実行しても、

```
$ git reset HEAD~
fatal: ambiguous argument 'HEAD~': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
```

となり取り消すことができません。
この場合は以下のコマンドで取り消すことができます。

```
$ git update-ref -d HEAD
```
Windowsのsysteminfoコマンド

# 目的

今の受入れ先ではユーザの権限がかなり制限されており、ちょっとしたことができなかったりする。
PCアイコン右クリックが効かずメモリどれくらい積んでるのかもわからないという。

## systeminfoコマンド

そういう時はsysteminfoコマンドを使ってみる。
管理者権限が無くても使える。
モデル名も確認できる。

以下は実行例。環境はWindows10。


```powershell
systeminfo

ホスト名:               XXXXXXXX
OS 名:                  Microsoft Windows 10 Pro
OS バージョン:          10.0.18362 N/A ビルド 18362
OS 製造元:              Microsoft Corporation
OS 構成:                スタンドアロン ワークステーション
OS ビルドの種類:        Multiprocessor Free
登録されている所有者:   XXXXX
登録されている組織:     Microsoft
プロダクト ID:          XXXXX-XXXXX-XXXXX-XXXXX
最初のインストール日付: 2019/07/28, 14:11:35
システム起動時間:       2019/10/24, 19:02:31
システム製造元:         XXXXX Inc.
システム モデル:        XXXXXXXX
システムの種類:         x64-based PC
プロセッサ:             1 プロセッサインストール済みです。
                        [01]: Intel64 Family 6 Model 42 Stepping 7 GenuineIntel ~3401 Mhz
BIOS バージョン:        XXXXX Inc. XXX, 2011/10/17
Windows ディレクトリ:   C:\WINDOWS
システム ディレクトリ:  C:\WINDOWS\system32
起動デバイス:           \Device\XXXXXXXXXXX
システム ロケール:      ja;日本語
入力ロケール:           ja;日本語
タイム ゾーン:          (UTC+09:00) 大阪、札幌、東京
物理メモリの合計:       16,366 MB
利用できる物理メモリ:   11,945 MB
仮想メモリ: 最大サイズ: 32,750 MB
仮想メモリ: 利用可能:   25,628 MB
仮想メモリ: 使用中:     7,122 MB
ページ ファイルの場所:  C:\pagefile.sys
ドメイン:               WORKGROUP
ログオン サーバー:      \\SHIGE3
ホットフィックス:       8 ホットフィックスがインストールされています。
                        [01]: KB4515871
                        [02]: KB4503308
                        [03]: KB4508433
                        [04]: KB4515383
                        [05]: KB4516115
                        [06]: KB4520390
                        [07]: KB4521863
                        [08]: KB4517389
ネットワーク カード:    2 NIC(s) インストール済みです。
                        [01]: Broadcom NetLink (TM) Gigabit Ethernet
                              接続名:           ローカル エリア接続
                              DHCP が有効:      はい
                              DHCP サーバー:    XXX.XXX.XXX.XXX
                              IP アドレス
                              [01]: XXX.XXX.XXX.XXX
                        [02]: VirtualBox Host-Only Ethernet Adapter
                              接続名:           VirtualBox Host-Only Network #4
                              DHCP が有効:      いいえ
                              IP アドレス
                              [01]: XXX.XXX.XXX.XXX
Hyper-V の要件:         VM モニター モード拡張機能: はい
                        ファームウェアで仮想化が有効になっています: はい
                        第 2 レベルのアドレス変換: はい
                        データ実行防止が使用できます: はい

```
【Kotlin】NotNull(NonNull)/NullableアノテーションでJavaのフィールドをKotlinからNull安全に扱う【Java】

# お詫びと訂正
この記事の公開時点では`org.springframework.lang`内の`NonNull`/`Nullable`アノテーションも機能すると記載していましたが、これは誤りでした。
これらのアノテーションを用いた場合、IDE上の補完表記は変化するものの、コンパイル時には警告しか出ない状態でした。

お詫びして訂正します。

# 前書き
`org.jetbrains.annotations`内の`NotNull`/`Nullable`といったアノテーションを用いることで、`Java`のフィールドを`Kotlin`から`Kotlin`っぽく扱えるようになります。

同様に利用可能なアノテーションは他にも有りますので、以下をご覧下さい。

- [Calling Java from Kotlin \- Kotlin Programming Language](https://kotlinlang.org/docs/reference/java-interop.html#nullability-annotations)
- [kotlin/JvmAnnotationNames\.kt at master · JetBrains/kotlin](https://github.com/JetBrains/kotlin/blob/master/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/JvmAnnotationNames.kt)

# やり方
以下のように付与するだけで大丈夫です。

```java
import org.jetbrains.annotations.NotNull;

public class Sample {
    private String field;

    @NotNull
    public String getField() {
        return field;
    }

    public void setField(String field) {
        this.field = field;
    }
}
```

## 付与するとどうなるか
付与前は以下の画像のように、`Kotlin`上では`String!`型（Platform型）で扱われています。
![スクリーンショット 2019-10-24 21.30.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/43857e12-3bfe-d352-90d4-a8b49958d34e.png)

付与後は`String`型で扱われていることが分かります。
![スクリーンショット 2019-10-24 21.31.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/db1432bb-8bdf-0121-926a-d44709be7508.png)

以下のように、アノテーションを`Nullable`に変更するとことで、`String?`型として扱うこともできます。

```diff:Nullableへの変更
- import org.jetbrains.annotations.NotNull;
+ import org.jetbrains.annotations.Nullable;
- @NotNull
+ @Nullable
public String getField() {
```

![スクリーンショット 2019-10-24 21.35.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/4a394d25-3d63-9b6e-8060-17a941542167.png)

## 補足
POJO的なオブジェクトに対してアノテーションを振る場合は、ゲッターに振った方が良いです。
画像の通り、フィールドに振ってしまうと「初期化しろ」と怒られるためです。
![スクリーンショット 2019-10-24 22.00.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/cc215abd-4316-e6d5-efba-5fa50eeb0101.png)

# 意義
`Java`プロジェクトに`Kotlin`を導入したり、`Kotlin`から`Java`のフレームワークを使う場合、しばしば「値無しコンストラクタでオブジェクト初期化 -> セッターで各値を注入」的な挙動をされる場合が有ります。

このような場合、対象オブジェクトを`Kotlin`で書こうとすると結構な工夫をする必要があり、「これ`Kotlin`で書く意味有るんだっけ」となれます。
既存の`Java`オブジェクトがあり、それを一々全て書き換える必要があるなら、労力もバカになりません。
初めから`Data`クラスにマッピングできるようにユーティリティを作るというのも手ですが、書き換え以上に初期コストは掛かるでしょう。

そんなことをする位なら、ゲッターにアノテーションを振るだけで済ませた方がスマートなんじゃないかなと思います（無論何が何でもフル`Kotlin`にしたいという場合は別ですが、実現できる挙動が同等であれば別に`Java`で書いていいんじゃないかとは思います）。
FontAwesomeをCSS疑似要素で表示しようとすると豆腐（四角）になる。

# 経緯
2019/10/24現在、fontawesome ver.5.11.2のアイコンをCSS疑似要素で表示しようとしても豆腐になってしまいます。HTMLでは表示できるのですが、CSS疑似要素ではどうしても表示できません。font-weight,font-family,文字コードの再確認、[ドキュメント](https://fontawesome.com/how-to-use/on-the-web/advanced/css-pseudo-elements)の内容を1通り試すも豆腐でした。

# 解決
font-familyを```"Font Awesome 5 Pro"```にすることで表示することができました。
DeepChemでCross-Validationをやってみる

#はじめに
DeepChemのサンプルでは、Hold-Outの事例がほとんどで、Cross-Validationの事例が少ない。(DeepChemを用いたベンチマークであるMoleculeNetもHold-Outによる評価となっている）。しかし、Cross-Validationの方が、検証に多くのデータが使えることもあり、高々1000件程度のデータであれば、迷わずCross-Valdationを使いたい。今回、DeepChemでCross-Validationをする方法を調べたのでメモっておく

#環境
- python 3.6
- deepchem  2.2.1.dev54
- rdkit 2019.03.3.0  

#ソースコード
以下がソースコードだ。Splitterクラスのk_fold_splitメソッドにより分割が得られるので、後はscikit-learnのKFoldと同じようにすればよい。

```DeelChemCrossValExample.py
import argparse
import numpy as np
import deepchem as dc
from sklearn.ensemble import RandomForestRegressor

def get_model():
    estimator = RandomForestRegressor()
    return dc.models.SklearnModel(estimator, None)

def main():

    parser = argparse.ArgumentParser()
    parser.add_argument("-train", type=str, required=True, help="trainig data file(csv)")
    parser.add_argument("-target_col", type=str, required=True)
    parser.add_argument("-smiles_col", type=str, default="smiles")
    parser.add_argument("-id_col", type=str, default="id")
    parser.add_argument("-cv", type=int, default=5)

    args = parser.parse_args()

    featurizer = dc.feat.RDKitDescriptors()

    # 学習データの読み込み
    loader = dc.data.CSVLoader(tasks=[args.target_col],
                               id_field=args.id_col,
                               smiles_field=args.smiles_col,
                               featurizer=featurizer)

    dataset = loader.featurize(args.train)
    splitter = dc.splits.RandomSplitter(dataset)

    transformers = [dc.trans.NormalizationTransformer(transform_y=True, dataset=dataset)]

    split_datas = splitter.k_fold_split(dataset, args.cv)
    metric = dc.metrics.Metric(dc.metrics.r2_score, np.mean)
    train_scores = []
    validation_scores = []

    # Cross-Validationの実行
    for train_set, validation_set in split_datas:
        model = get_model()
        model.fit(train_set)
        train_score = model.evaluate(train_set, [metric], transformers)
        train_scores.append(train_score)
        validation_score = model.evaluate(validation_set, [metric], transformers)
        validation_scores.append(validation_score)
        print("score train:{0}, val:{1}".format(train_score, validation_score))


if __name__ == "__main__":
    main()

```

#おわりに
手元のscikit-learn版のプログラムと同じデータ、同じアルゴリズムで比較したところほぼ同程度の精度となった。
今回はscikit-learnのRandomForestRegressorをラップしたモデルでやってみたが、DeepChemのアルゴリズムでも同様にできるはずだ。
今後はCross-Validationによるハイパーパラメータ探索なども試してみる予定である。
さて今回でDeepChemを使う準備は概ね整った。次回からは、本格的にDeepChemならではのアルゴリズムを使っていきたい。

#参考
-[How to implement cross-validation for training set in deepchem? #736](https://github.com/deepchem/deepchem/issues/736)
Zendeskのチケット検索で楽するためのツール simple-zendesk-searcher（仮称）を作った

# 結論

Zendeskのチケットを検索するための簡易的なCLI "simple-zendesk-searcher(仮称)" を作りました。ソースは以下。

https://github.com/hassaku63/simple_zendesk_searcher

今のところはGitHubオンリーでの公開です。現時点でちゃんとしたテストも書けてないし、機能的にもまだまだpypiに登録するほどのツールではないかなと思ったので。

日付検索、タグ検索、リクエスタ検索あたりの機能と、あといい感じのパッケージ名が欲しい。。あと `./output.csv` に出力する仕様、これデフォルトはstdoutが良さそうなので近々改変しようと思います。

# なぜ作ったのか

自社のビジネスでサービスデスク的なサービスを提供しており、サポートデスクとしてZendeskを採用しています。

AWSのメンテナンス系通知とか、多数のアカウントに一様にばらまかれるタイプの通知が来たとき、とりあえずチケット管理システムには起票されるような実装をすると思います。

で、サポートサービスとしては、その通知に対する「当社見解」的なものを添えて顧客にアナウンスしたかったりします。通知のやり方としては、生成済みチケットに対するリプライの形式がベストでしょう。となると、Zendesk的には複数のチケットに対して一斉に「コメントを送付」するような処理が必要になります。

一斉起票の仕組み自体は自社で既に持っているのですが、対象チケットの抽出部分はZendeskのWeb-UIしか方法がなく、大量のチケットリストを抽出するには些か非効率でした。

で、それならCLIツールとして簡単にでも検索できる仕組みを作ればいいじゃないかと思い、simple-zendesk-searcherを製作しました。

※性質上、ZendeskのAPI-KEYを所持していることがツール利用の必要条件ですが、実際にはAPI-KEY持ってないし持ちたくもない、という立場の方もいるので業務にどう組み込むかの課題は残ってます。そのへんはまた別途考えたい。

# 使い方 & ソース

GitHubに公開してるので、そちらをご覧ください。

https://github.com/hassaku63/simple_zendesk_searcher

今はキーワード検索のみ対応してます。また、**Zendeskの仕様上、スペースを含む文字列で検索したい場合はダブルクォートで囲った文字列を投げる必要があります。**お気をつけください。シェルから実行する場合はシングルクォートで外を囲うなりエスケープするなりして、然るべき措置が必要です。

出力するカラムも、なんかこう、カスタマイズの余地を残せる仕様にしたいなぁとは思います。もしくは可能な限りのカラムを出力するような仕様にするか。

# まとめ

とりあえずの最低要件を満たすツールは作れたので、あとは現場で使ってもらえるようにAPI-KEY所持してる人に共有していこうかと。とりあえず、日付の条件指定くらいはさくっと実装しよう...

あとこれ、記事の主題とは無関係なんですが。業務遂行の直接的な手段としてのツールを作ることと、それを業務フローに組み込むこと、この2つの間にはかなりの隔たりがあるんですよね。なので、個々のツールも大事とは思いつつも「業務フローに組み込む」ことに対する汎用的な回答をいい感じに作れないかなぁと感じました。

BPM(Business Process Management)システムとの統合を意識するならAPI Gatewayにロジック部分を載せて、実行権限の認可はBPM側に任せるとかが良さそうです。あとは、ツールの実装を変えずに無理なくAPI Gatewayにインテグレーションできるような設計とかできたら幸せになれそうだなと思います。
日本語プログラミング言語「プロデル」で行列演算をする

## できるようになってほしいこと

どんな演算があると便利か考えました（NumPy等を参考にするのではなくて）。

- 行列の四則演算
- 行列の成分の四則演算
- 和とか最大値

このくらいあればひとまず動かせるのではないでしょうか（何を？）。

## 実装
### 行列のクラスを作る

```プロデル:行列.rdr
行列とは
	＋中身：配列＝｛｝
	＋大きさは，｛0，0｝。
	はじめ（行，列）の手順
		行回，【現在行】にカウントして繰り返す
			【一行】は，｛｝。
			列回，【現在列】にカウントして繰り返す
				一行（現在列）は，0.0。
			繰り返し終わり
			中身（現在行）は，一行。
		繰り返し終わり
		大きさは，｛行，列｝。
	終わり
終わり
```

プロデルでは，クラスのことを「種類」と呼びます。種類は，「○○とは」で始まり「終わり」で終わるブロック（？）によって記述されます。

行列種類内1行目と2行目では，配列を宣言しています。＋というのは，外部からアクセスできることを示します。：で型を指定します。大きさについては｛0，0｝で初期化しています。

はじめの手順というのは，コンストラクタです。引数に，行列の大きさとして，行と列の2変数をとっています。今回は，指定された大きさの2次元配列を作り，中身を全て0.0で初期化しておくことにします。これをしないと，どうもうまく動いてくれないからです。

この後，いくつも種類手順を作っていくのですが，所謂getとsetに相当するものがプロデルにありまして，

```
○○を取得する手順

終わり

○○を設定する手順

終わり
```
というもので，これらは呼び出し方が他の手順とは異なり，

```
種類の○○
```

と書くだけで値が取得できるっぽいので，流暢な日本語を作るためには必須なのですが，どうもインタプリタでは動作するもののコンパイルするとエラーが発生するようです。

### 行列の演算を作る

まず，極めて重要なことには，プロデルでは演算子のオーバーライドができません。よって，

```
行列A×行列B
```

といったことは定義できないのです。しかし，これはメリットでもあると思っています。なぜなら，中身の要素について計算したい場合と，そうでない場合で表記が混乱するからです。好き好きではあると思うのですが，行列にスカラー値を足すと全ての要素にかかるという動作は便利なのですが僕は混乱するので嫌いです。明示的に`{for all x_{ij} += 1`みたいなコードを書きたい。

#### かけ算

行列のかけ算には，$O(n^3)$というひっくり返るくらい大きな計算量がかかりますが，なんとかアルゴリズムで$O(n^{log_27})$にできるものの，再帰のオーバーヘッドで結局遅くなるらしいので，今回は愚直に3重ループを回します。

```プロデル:行列.rdr
自分を［他の行列：行列］に左からかける手順
	もし大きさ（2）が，他の行列の大きさ（1）でないなら
		「かける相手の大きさ（1）が［他の行列の大きさ（2）］なので乗算できません。」というエラーを発生させる。
	もし終わり
	【計算後】という行列（大きさ（1），他の行列の大きさ（2））を作る。
	大きさ（1）回，【現在行】にカウントしながら繰り返す
		他の行列の大きさ（2）回，【現在列】にカウントしながら繰り返す
			大きさ（2）回，【現在要素】にカウントしながら繰り返す
				計算後の中身（現在行，現在列）は，計算後の中身（現在行，現在列）＋（中身（現在行，現在要素）×他の行列の中身（現在要素，現在列））。
			繰り返し終わり
		繰り返し終わり
	繰り返し終わり
	計算後を返す。
終わり
```

【】によって局所変数を宣言できます。

次に，同じ大きさの行列を2つ用意して，同じ添字の値同士をかけ算する手順を作ります。

```プロデル:行列.rdr
自分に［他の行列：行列］をかける手順
	もし（大きさ（1）が他の行列の大きさ（1）でない）または（大きさ（2）が他の行列の大きさ（2）でない）なら
		「行列の大きさがおかしいのでかけられません。」というエラーを発生させる。
	もし終わり
	【計算後】という行列（大きさ（1），大きさ（2））を作る。
	大きさ（1）回，【現在行】にカウントしながら繰り返す
		大きさ（2）回，【現在列】にカウントしながら繰り返す
			計算後の中身（現在行）（現在列）は，中身（現在行）（現在列）×他の行列の中身（現在行）（現在列）。
		繰り返し終わり
	繰り返し終わり
	計算後を返す。
終わり
```

プロデルでは，乗算の演算子として「×」が使えます。「*」は非文にしか見えませんからね。

同じ要領で，四則演算につき手順を作ります。また，$M \times N$の行列に，大きさ$M$の縦ベクトルや，大きさ$N$の横ベクトルを使って，全体に足したり引いたりしたいこともあるので，その手順も作ります。これらは，明示的に分かるように動詞を変えています。引数の型によるオーバーロードはできるので，それも利用しています。

それから，行ごとや列ごとの和や最大値，そしてargmaxも作ります。

## 使用例

```
「行列.rdr」を参照する。
Aという行列（2，2）を作る。
Bという行列（2，2）を作る。
Aの中身は，｛｛1，2｝，｛3，4｝｝。
Bの中身は，｛｛1，0｝，｛0，1｝｝。
Aを左からBにかけたものを表示。
```

ちなみに，語尾は自由に変えられるので，

```
「行列.rdr」を参照してほしい。
Aという行列（2，2）を作ってほしい。
Bという行列（2，2）を作ってほしい。
Aの中身は，｛｛1，2｝，｛3，4｝｝。
Bの中身は，｛｛1，0｝，｛0，1｝｝。
AをBに左からかけたものを表示してほしい。
```

としても動くし，

```
「行列.rdr」を参照するぽよ。
Aという行列（2，2）を作ぽよ。
Bという行列（2，2）を作ったぽよ。
Aの中身は，｛｛1，2｝，｛3，4｝｝。
Bの中身は，｛｛1，0｝，｛0，1｝｝。
左からAをBにかけたものを表示するんだ。
```
としても動きます。
アドバイス・アンチパターン

相手にアドバイスを与える立場の人が、やってはいけないことを考えてみた。

それは、「**相手の立場に立ってみると分かると思うんですけど～」と前置きを言う**ことだ。

なぜなら、**アドバイスを訊いてもらえなくなるから**である。

たとえば、就活生がアドバイザーにレジュメの添削をしてもらっている。上記のことを言われてどう感じるか。「あなたはそんなことも知らないのですか？」とアドバイザーに非難されたように感じる。

そもそも、知らないからアドバイスを求めているのである。相手の立場に立つのは簡単なことではない。だから、ノウハウの蓄積がある所で情報を収集したいのである。

よって、淡々と「ここはこう書くべきです」「この場合はこういうべきです」とノウハウを言えばよい。できれば、「わざわざ意見を訊きに来てくださって、ありがとうございます」といったように、まず相手を受け容れる。そうすると信頼関係を築きやすくなる。アドバイスも訊いてもらいやすくなる。

とはいえ、**相手の立場に立って考えること自体は本当に大事なことだと思う**。なるべく情報を集め、具体的な状況を思い浮かべて、適宜判断できるようにしてゆきたい。

## 参考情報

- [『マイクロカウンセリング技法―事例場面から学ぶ』](https://www.kinokuniya.co.jp/f/dsg-01-9784759916379)
- [一段上の判断力を育てるかもしれない方法、それは「知的謙遜」](https://yuchrszk.blogspot.com/2017/12/blog-post_6.html)
WinSCPが異常に遅いときの対処

接続バッファサイズを最適化する からチェックを外す。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519443/c29e5042-a445-d3ea-18f3-a9668cb1996a.png)