OmniAICreator/Qiita-1.07M huggingface dataset:
Railsでtwitterの簡易版cloneを作成する

<h1>はじめに</h1>
今回やるのは、reails newでアプリを作るところから、
Bootstrapを導入してデザインできるようにするところまで。

初心者なのでおかしい点があったらビシバシお願いしますm(_ _)m

実装する機能は下記の通り。
　　・tweetの投稿・投稿確認・編集・一覧表示・削除機能
　　・確認画面から投稿画面に戻った時、打ち込んだ内容が保持されるようにする
　　・1文字以上140文字以下の字数制限とエラーメッセージの表示


<h1>新しくアプリを作成</h1>
まずは新しくフォルダを作り、そこにrails newコマンドで新規アプリを作成していきます！
アプリ名は安直ですがrubyでtwitterを作るのでrubitterにしておきます（笑）

```ruby
$ rails new rubitter -d postgresql
```

```
rails db:create
```

```
rails s
```
railsが表示させれるか確認

<h1>scaffold</h1>
scaffoldとは、Railsに備わっているコマンドの１つで、ルーティングやコントローラー、ビュー、モデルとテーブル（データベース）の記述やファイルなどを自動で作成してくれるコマンド


```
rails g scaffold murmur content:string
```
rails g scaffold モデル名　カラム名:データ型


```
rails db:migrate
```
DBをいじったら、これを忘れずに！！

ブラウザを開き、
localhost:3000/モデル名+s/new
にアクセスしてアプリを確認。
いじってみて正常に動くか確認。

ここで作られたのは新規作成(new)ページと一覧(index)ページ。

<h1>バリデーション機能の追加</h1>
バリデーションはモデルに記述。


```app/models/murmur.rb
class Murmur < ApplicationRecord
  validates :content, presence: true
end
```
上記のようにすると、contentという値を確認し、空だったら保存を中止してくれる。

ここでは、１文字以上１４０以下という字数制限をつけたいので、以下のように書き換える。

```app/models/murmur.rb
class Murmur < ApplicationRecord
  validates :content,  length: { in: 1..140 } 
end
```

バリデーションがその値を許したか許さなかったかによって、処理を分岐させる。
ここでは、
__成功__ => 一覧画面に移動し、”つぶやきを投稿しました！”と表示する
__失敗__ => 値を保持したまま入力画面に戻り、エラーメッセージを表示する

この内容をcontrollerに記述していく。
と思ったら、scaffoldで既に記述されていた！
viewにもメッセージ表示のcodeが書かれていた！！ありがてぇよぉ(´；ω；｀)

てことで機能の部分はオッケーなんでフロント部分に移りましょう♪


<h1>Bootstrapでデザインしていく</h1>
<h5>Yarnのインストール</h5>
jQueryの導入には、Yarn（JavaScriptパッケージマネージャー）が必要。

```
$ brew install yarn
```

実行したところ、already installedと怒られたので、2回目以降はしなくていいらしい。
なのでインストール方法は割愛。

<h5>jQueryの導入</h5>

```
$ yarn add jquery
```

node_modulesというフォルダが作成され、中にjQueryが格納されているか確認。

ちなみにGemfileのような管理ファイルとして、packege.jsonというファイルにもjQueryの記載が増えている。

<h6>jQueryを読み込むための設定</h6>
確認できたら、node_mojulesというフォルダの中に入ったjqueryを、Rails側で読み込む設定を行う。
Railsの場合は、マニフェストファイルに読み込むものを設定。
JavaScriptのマニフェストファイルは
app/assets/javascript/application.js
ここに、jquery.jsの居場所のパスを記述。

```application.js
// 一部省略
// Read Sprockets README (https://github.com/rails/XXXXXXXXXXXXXXXXXXXXXX) for details
// about supported directives.
//
//= require rails-ujs
//= require turbolinks
//= require jquery/dist/jquery.js
//= require_tree .
```

※　　　//=require_tree .　よりも上に記述

これでjQueryが使えるようになった！

<h5>Bootstrapの導入（やっと）</h5>

```
$ yarn add bootstrap@4
```

これでBootstrapの4系をインストールできました。
こちらはCSSとJSのマニフェストファイルに記述していく。

```application.css
 *= require bootstrap/dist/css/bootstrap.min.css
```

```application.js
//= require bootstrap/dist/js/bootstrap.min.js
```

これで読み込みは完了！

<h5>いざ、coding！</h5>
スマホのような小さなものにもきちんとデザインが反映されるようにapplication.html.erbのheadの中に下記を追加。

```app/views/layouts/application.html.erb
<meta name="viewport" content="width=device-width">
```

あとはCSSとかで好きにデザインしていくだけ！！
ああ！やっとだ！
おつかれサマンサ〜
Androidのテーマの変更

Androidアプリのテーマ（アクションバーやステータスバーの色など）の変更方法を調べていたらわかりやすいサイトがあったので、ストックしておきます。

Programming Style
　[Android] マテリアルテーマを使う
　　http://www.programing-style.com/android/android-lesson/android-using-material-theme/
3 step wallet を作成した話　設計図編（製作者の思い）

#エンジニアじゃないけどアプリが作りたかった

こんにちは。まつもとかづまさと申します
僕はこの記事を書いている現在は障害者支援施設で支援員として働いています。

今回は３ step wallet　という知的障がいの方でも「暗号通貨決済をできるようにする」という目的で作成したアプリの話です

3 step walletは[こちら](https://3step.app/#/)

##今日の記事の流れ
<img width="1010" alt="スクリーンショット 2018-10-02 21.18.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/253981/f56ccef6-8258-2158-78bd-65eab833d921.png">


##３step walletの作成のテーマがあります
まずその１
<img width="989" alt="スクリーンショット 2018-10-02 21.20.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/253981/6b17656d-7b70-03fe-8537-4d8f1aa3e6a3.png">

これは知的障がいの人を支援してきた経験から思いついたのですが、みんながみんな文字を読めて、理解できるという世界にいなかったからこそ、この発想になったんだと思います。

逆に言い換えるならば文字を使わない直感的な操作のみで決済を済ませるという買い物ってそういうものだったよね。という観点で作っています。

その２
<img width="1003" alt="スクリーンショット 2018-10-02 21.23.34.png" src="https://qiita-image-store.s3.amazonaws.com/0/253981/46b28eff-63b1-f1de-a0a5-1ff715e3ee24.png">

自閉スペクトラム症を持っている方でよく聞くそして支援中に体験する話として、「こだわりが強い」ということがあります。話や経験談から一つのことに固執するや様々な表現方法がありますが、僕が支援中に自閉スペクトラム症の方で服薬の方法を一から全て変えることができたことがあったんです。

「始まりから終わりまで全て提示してあげるとその方法を変化させることができる」

この経験を元にこだわりが強いのではなく、条件分岐がとても苦手ではないのだろうか？その式をif文を使わずに最初から最後まで提示してあげると新しいことでも達成できるのでは？という仮説のもと作成しています。

なのでエンジニアのみなさん様々な選択肢を提供できるアプリもいいですが、こういった選択肢の極力ないアプリもユーザー数が低いかもしれませんが開発していただけるとありがたいです。

その３
<img width="1008" alt="スクリーンショット 2018-10-02 21.29.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/253981/558fa850-7495-7f39-507f-558b64813a00.png">
障がいを抱えると後見人をつける方も多いです。
そういった方は大きな買い物をする際は後見人の許可を得る必要があります。
（本人のみの購入は可能であるが、後見人が契約自体をなかったことにできるので店側はとても不利になります）

そこでマルチシグを用いた決済という方式をとっています。

その４
<img width="1001" alt="スクリーンショット 2018-10-02 21.33.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/253981/31ca2bb8-b45e-578e-d1cb-11ec2a910e94.png">
複雑すぎるという言葉はその人の処理能力によって変わります。僕が目指したのは比較的操作工程が短く、決済ができるというアプリを目指しました。
ぜひ一度体験していただいて欲しいと思います。
3 step walletは[こちら](https://3step.app/#/)
[github](
https://github.com/kazumasamatsumoto/3-step-wallet)はこちらです。
RustでLinuxのinput eventをダンプする (bindgen使用)

bindgenを使ってみた。

# Linuxのinput event

input event はキーボードやマウス、タッチスクリーンなどのイベントです。
このページがわかりやすい。
[Linux Input Subsystemの使い方](http://www.tatapa.org/~takuo/input_subsystem/input_subsystem.html)
このページの最初のサンプルの「音量調整プログラム」と似たものをRustで書いてみました。

# bindgen

bindgenはCのヘッダファイルを読んで、そのストラクチャや定数、関数の宣言をRustの形式に変換してくれます。
[bindgen users guide](https://rust-lang-nursery.github.io/rust-bindgen/)

# bindgenの準備

```
sudo apt install clang
cargo install bindgen
```

# ヘッダファイルを変換する

[bindgen users guide](https://rust-lang-nursery.github.io/rust-bindgen/)　のチュートリアルでは、build.rsを作ってcargoでビルドするときにヘッダファイルの変換をするようにしていますが、ここでは手っ取り早く`bindgen`コマンドを手で実行してみます。

```
$ bindgen /usr/include/linux/input.h -o src/input.rs
Custom { kind: Other, error: StringError("Internal rustfmt error") }
```

むむ、何かエラーになった。
でもファイルはできているようなので深入りせずにこのまま進みます。(rustc は1.29.1 を使用)

# サンプルプログラム

gistに貼りました。[ここ](https://gist.github.com/tetsu-koba/0f9e27cb9f95eb00430f986b07347a6e#file-main-rs)

デバイスファイルからストラクチャのサイズ分を読んで、キャストする部分は以下の通り。

```
fn read_input_event(f: &mut File) -> io::Result<(input_event)> {
    const sz: usize = std::mem::size_of::<input_event>();
    let mut buf = [0; sz];
    f.read_exact(&mut buf)?;
    let ie: input_event = unsafe { std::mem::transmute(buf) };
    Ok(ie)
}
```

# つまずいたところ

最初にclangをインストールするのを忘れていた。`bindgen`は実行できるけど、`stddef.h`が見つからないという不思議な挙動になった。

`input_event` のストラクチャには`type` という名のメンバがあった。これはRustの予約語と重なるので、変換して出力されたファイルでは `type_` に変更されていた。

定数のdefine値は全て`u32`として生成される。ストラクチャのメンバが`u16`で、Rustは型に厳しいので明示的なキャストが必要だった。
シェルスクリプトでコマンド標準出力結果をタブ区切りでcsvにする

あまり探せなかったのでメモ
ついでに`sed -e "s/^/text /"`でコマンドの行頭に文字を追加したいパターンも入れている。

```
ファイルを経由する場合
$ ls -l > test.txt 
$ sed -e "s/^/text /" test.txt | tr -s ' ' '\t'

コマンドから直接
$ ls -l | sed -e "s/^/text /" | tr -s ' ' '\t'
```



参考
https://linux.just4fun.biz/?%E9%80%86%E5%BC%95%E3%81%8DUNIX%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89/%E8%A4%87%E6%95%B0%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%8C%E5%8C%BA%E5%88%87%E3%82%8A%E3%81%A8%E3%81%AA%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92CSV%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B
初心者向け、スマートコントラクトを書いてみたい人が揃える最初の道具達

初心者の方がスマートコントラクトを書いてDapps開発をはじめたいなって時にどんなツールがあるのかを簡単にまとめたものです。

- スマートコントラクト用言語
    - [Solidity](https://solidity.readthedocs.io/en/latest/)
        - https://github.com/ethereum/solidity
    - [Vyper](https://vyper.readthedocs.io/en/latest/)
        - https://github.com/ethereum/vyper
- 統合開発環境（IDE）
    - [Visual Studio Code](https://code.visualstudio.com/)
        - エクステンション
            - [Solidity support for Visual Studio code](https://marketplace.visualstudio.com/items?itemName=JuanBlanco.solidity)（solidity用のエクステンションです。）
    - [Remix](https://remix.ethereum.org/)
        - https://github.com/ethereum/remix-ide
    - [ethfiddle](https://ethfiddle.com)
    - [superblocks](https://studio.superblocks.com/)
        - https://github.com/SuperblocksHQ/superblocks-lab
- フレームワーク
    - [truffle](https://truffleframework.com/truffle)
        - https://github.com/trufflesuite/truffle
- フロントエンド
    - [Web3.js](https://web3js.readthedocs.io/en/1.0/)
        - https://github.com/ethereum/web3.js/
- バックエンド
    - [Web3.py](https://github.com/ethereum/web3.py)
    - [Web3.php](https://github.com/sc0Vu/web3.php)
    - [Ethereum-php](https://github.com/digitaldonkey/ethereum-php)
    - [Web3j](https://github.com/web3j/web3j)
    - [Ethereum.rb](https://github.com/EthWorks/ethereum.rb)
- テスト
    - [ganache](https://truffleframework.com/ganache)
        - https://github.com/trufflesuite/ganache
- テストイーサの獲得（Faucet）
    - [MetaMask Ether Faucet](https://faucet.metamask.io/)
- ウォレット
    - [Metamask](https://github.com/MetaMask/metamask-extension)
        - https://metamask.io/
    - [Trust Wallet](https://jp.trustwalletapp.com/)
        - https://github.com/TrustWallet
- イーサリアムクライアント
    - [geth](https://github.com/ethereum/go-ethereum/wiki/geth)
- サンプル
    - [truffle boxes](https://truffleframework.com/boxes)
    - [dapphub](https://github.com/dapphub/dappsys)
    - [openzeppelin](https://openzeppelin.org/)
        - https://github.com/OpenZeppelin/openzeppelin-solidity
- ERC規格
    - [EIPs](https://eips.ethereum.org/erc)
- More Information
    - 日本語: https://qiita.com/sot528/items/6ff13ebfc846aa313307
    - English: https://github.com/ConsenSys/ethereum-developer-tools-list
- その他
    - [etherscan](https://etherscan.io/)
CSS設計

# レスポンシブCSS設計 
レスポンシブデザインのサイトをマークアップする場合に、メディアクエリを記述する。
一般的にはベースのCSSを書いて、その後に@media でデバイス別のスタイルを上書きすることが多い。

## CSSの記法3種
1. CSS自体を分ける
2. @media規則で1ファイル内にメディア特性単位に書く方法
3. @media規則で1ファイル内にパーツ単位で書く方法


* CSS自体を分ける


```css:css
<link rel="stylesheet" href="desktop.css" media="(min-width:769px)">
<link rel="stylesheet" href="tablet.css" media="(max-width:768px) and (min-width: 321px)">
<link rel="stylesheet" href="mobile.css" media="(max-width:320px)">
```


この方法ではスタイルの修正などにそれぞれのファイルを探す必要があり、可読性が低くなる。
* @media規則で1ファイル内にメディア特性単位に書く方法

```css:css

@media(min-width:769px){
    .pageHeader{/*...略...*/}
    .pageMain{/*...略...*/}
    .pageSub{/*...略...*/}
    .pageFooter{/*...略...*/}
}
@media(max-width:768px) and (min-width: 321px){
    .pageHeader{/*...略...*/}
    .pageMain{/*...略...*/}
    .pageSub{/*...略...*/}
    .pageFooter{/*...略...*/}
}
```

この方法も同様に、スタイルの修正などにそれぞれ対応する箇所を探す必要があり、可読性が低くなる。


* @media規則で1ファイル内にパーツ単位で書く方法


```css:css
.pageHeader{/*...略...*/}
@media(max-width:768px){
    .pageHeader{/*...略...*/}
}
```

同じ箇所にスタイルの記述があるので可読性が高い。
結果この方法で記述することが多い。
PCのスタイルを書き、その後ろにSP用のスタイルをmediaqueryで記述する。

ではどちらをベースとして設計するのが良いのか？



## ベースをPCとして設計した場合

```css:css
.entry-header {
  margin-bottom: 25px;
}
.entry-title {
  min-height: 76px;
  padding: 7px 92px 40px;
  background: url("../img/bg_heading.svg") no-repeat left bottom;
  background-size: 100% auto;
  font-size: 2.5rem;
  font-weight: bold;
}
/* ベースCSSを上書きするためのデバイス個別のメディアクエリCSS （スマホ向け）*/
@media (max-width: 767px) {
  .entry-header {
    margin-bottom: 20px;
  }
  .entry-title {
    min-height: auto;
    padding: 0 10.53333% 5.33333% 11.86667%;
    background-image: url("../img/bg_heading_sm.svg");
    font-size: 1.7rem;
  }
```


PCのスタイルを打ち消すCSSを必要があり、記述が冗長になる。

## 一方でSP画面をベースとしてCSSを設計した場合

```css:css
.btn {
  text-decoration: underline;
}
.btn:hover {
  text-decoration: none;
  opacity: .7;
}
/* ベースCSSを上書きするためのデバイス個別のメディアクエリCSS （スマホ向け） */
@media (max-width: 767px) {
  /* スマホでは:hoverでボタンクリック（タップ）が遮られることがある */
  .btn:hover {
    opacity: 1;
  }
}
```



コード量がシンプルになる。
スマホをベースに考えたほうがパーツ単体を作ることに長けている。

つまりレスポンシブでCSS設計を行う場合、モバイルファーストの考えでいたほうがいい。
Rundeck3でのノード追加方法

Rundeck3をインストールし、Rundeck2のノリで設定したらノードの追加でハマったのでメモ。

# 環境

- CentOS7.5
- Rundeck3
- MariaDB10.2
- Nginx1.12
- Java1.8

とりあえずお試しなのでSELinuxとFirewallは無効。

# ノードの登録

### 説明

2系3系関係なく、デフォルトの状態ではlocalhostしかノードが登録されていないので、
実行したいホストを追加する際には設定ファイルに対象ホストを追加する必要があります。

### 設定が必要なファイル

- /var/rundeck/projects/${PROJECT_NAME}/etc/resources.xml
- /var/rundeck/projects/${PROJECT_NAME}/etc/project.properties

上記の２つが必要だが、Rundeck3の場合プロジェクトを作成した段階でresources.xmlが作成されていなかった。
2系の時は/var/rundeck/projects/${PROJECT_NAME}/etc/の下にresources.xmlが存在していたと思う。

ないなら作るしか無い。

```config:/var/rundeck/projects/${PROJECT_NAME}/etc/resources.xml

<?xml version="1.0" encoding="UTF-8"?>
<project>
  <node name="test"
        description="test node."
        tags="" 
        hostname="${HOST}"
        username="root" 
        osFamily="unix"
        osName="Linux"
        osVersion="7.5"
  />
</project>
```

しかし、なぜか追加してもWeb画面から確認したときにnodeに表示されない…(´・ω・`)(2系のときはresources.xmlに追加したらいけたはず)

公式のドキュメントを確認したところproject.propertiesに設定が必要とのこと。
ちなみに2系は最初からresources.xmlを参照するように記載されていました。

記載がないので追記する。

```config:/var/rundeck/projects/${PROJECT_NAME}/etc/project.properties

resources.source.2.config.file=/var/rundeck/projects/${PROJECT_NAME}/etc/resources.xml
resources.source.2.type=file
```

これでWeb画面から追加したいノードを確認することができました！

※コマンドを実行する際にはRundeckの公開鍵を実行するホストに登録することをお忘れなく。

今後のバージョンアップでどうにかなってほしいなぁ…
~~画面からノード追加したい(´・ω・`)~~

# 参考

[Declare node definitions](https://rundeck.org/docs/tutorials/project-setup.html)
Unity初めてのテスト

ユニットテストとは、プログラム（小規模、関数とか）が正しく動くかをチェックするものです。
これまでユニットテストは勝手に敬遠していましたが、全然難しくありませんでした（多分）。
私自身テストを始めたばかりですが、テストのおかげですぐに原因特定が出来たバグもありました。
深く考えず、すぐに使えるやつで始めてみましょう!

環境：
Version:Unity 2017.4of1
（2018.1以降は方法が少し変わっているみたいです。
参考:[Unity 2018.1でTest Runnerの使い方が変わっていた話](http://ntgame.wpblog.jp/2018/05/22/post-1679/)）
## ファイル作成
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/190721/1ec43fbe-21a1-f5bd-d0a2-e074d41486a8.png)
Create/Testing/EditMode Test C# Scriptから作成します。
この時、Editorフォルダに作られますが、勝手に動かすとUnityが認識してくれなくなるのでそっとしておきましょう。(Assets直下でなくてもフォルダの名前がEditorならScripts/Editorとかでも良い)
## スクリプト作成
今回は、以下のLineByNumberクラスのテストを作成します。

```C#:LineByNumber
using System;

public class LineByNumber : IEquatable<LineByNumber>
{
    public int x1 { get; private set; }
    public int x2 { get; private set; }
    public LineByNumber(int x1_, int x2_)
    {
        x1 = x1_;
        x2 = x2_;
    }

    public bool Equals(LineByNumber other)
    {
        if ((x1 == other.x1 | x1 == other.x2)&(x2 == other.x1 | x2 == other.x2))
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    public override int GetHashCode()
    {
        return  x1.GetHashCode() ^ x2.GetHashCode();
    }
}

```
デフォルトで作られるファイルが以下になります。

```C#:NewEditModeTest
using UnityEngine;
using UnityEditor;
using UnityEngine.TestTools;
using NUnit.Framework;
using System.Collections;

public class NewEditModeTest {

	[Test]
	public void NewEditModeTestSimplePasses() {
		// Use the Assert class to test conditions.
	}

	// A UnityTest behaves like a coroutine in PlayMode
	// and allows you to yield null to skip a frame in EditMode
	[UnityTest]
	public IEnumerator NewEditModeTestWithEnumeratorPasses() {
		// Use the Assert class to test conditions.
		// yield to skip a frame
		yield return null;
	}
}
```

[Test]はUnityが無くても意味があるメソッドに付けます。
[UnityTest]は使ったことがないので分かりません。

これをこう書き換えます。

```C#:LineByNumberTest
using NUnit.Framework;

public class LineTest {

	[Test]
	public void LineConstructerTest() {
        Assert.That(2, Is.EqualTo(new LineByNumber(2, 3).x1));
        Assert.That(3, Is.EqualTo(new LineByNumber(2, 3).x2));
    }

    [Test]
    public void LineEqualsTest()
    {
        Assert.That(new LineByNumber(2, 3).Equals(new LineByNumber(3, 2)), Is.True);
        Assert.That(new LineByNumber(3, 2).Equals(new LineByNumber(2, 3)), Is.True);
    }
}
```
メソッド名はUnity側からテスト実行時に見えるので、失敗した時のためにも分かりやすい名前を付けた方が良いんじゃないでしょうか。
テスト用のメソッドはpublic void を付けます。
テストには、Assertメソッドを使います。
Assert.That(値, 条件)という書式が推奨されているようなのでこれで統一していきます。
条件の部分にはたくさんメソッドが用意されているので最適なものを探してみてください。
参考:[NUnitのAssert.ThatメソッドにIsとかHasとかを入れて柔軟なテストコードを書こう](https://qiita.com/tokishirazu/items/139e5b51936a1f1e9af0)

##実行
Window/Test Runnerを開きます。
![キャプチャ2.PNG](https://qiita-image-store.s3.amazonaws.com/0/190721/73784ab8-842a-e61c-0888-55cec52cbc26.png)
下のようなウィンドウが開くのでRunAllを選択しましょう。
![キャプチャ3.PNG](https://qiita-image-store.s3.amazonaws.com/0/190721/b78cddc8-8a2e-8d3d-88b9-53b6ee270d15.png)
成功しました!
![キャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/190721/aa079068-2c92-bd18-ed5c-470abe92d77a.png)
##まとめ
単体テストはプログラマの相棒といわれる事もあるそうなので、敬遠せずに積極的に使えるようになりたいですね。
MacのTerminalでforward deleteを有効にする

fn+deleteキーを押した場合や、外付けのWindows用キーボードからDeleteキーを押した場合に（Back Spaceではない)通常のDeleteの動作をしてほしい場合。
（デフォルト設定だとチルダが出力されてしまう）

Terminalの環境設定->プロファイル->キーボードからforward deleteに対して\004のアクションを設定する。
<img width="110" alt="スクリーンショット 2018-10-02 20.08.27.png" src="https://qiita-image-store.s3.amazonaws.com/0/16060/2f4a18e9-5531-0f03-8ad4-cf588ee0fa4f.png">

### 追記

これでも直るらしい。

```sh:.inputrc
"\e[3~": delete-char
```
RubyMine の Prettier プラグインで自動フォーマットする

![image.png](https://qiita-image-store.s3.amazonaws.com/0/13842/a92fa979-7b0a-9d62-f0d9-a60773c2146f.png)

## 環境
- RubyMine 2018.3 EAP

## 目標
`*.vue` ファイルが保存されたら、[Prettier](https://prettier.io/) で自動フォーマットされること。
※他のファイルタイプも同様の手順で設定できます

## 手順
- [**File Watchers**](https://plugins.jetbrains.com/plugin/7177-file-watchers) をインストール
- [**Prettier**](https://plugins.jetbrains.com/plugin/10456-prettier) をインストール
- File Watchers を設定する

## File Watchers と Prettier のインストール

- `Preferences` > `Plugins`
    - `File Watchers` で検索すると、`Search Results` に２つとも出てくるのでインストールしましょう。

> ![image.png](https://qiita-image-store.s3.amazonaws.com/0/13842/145c0c07-db2e-619e-c83f-8eebc80c49f4.png)

## File Watchers の設定
- `Preferences` > `Tools` > `File Watchers`
    - `+` ボタンで設定を追加しましょう（未作成の場合）

> ![image.png](https://qiita-image-store.s3.amazonaws.com/0/13842/922776af-3021-fa9a-e2fb-81b3d12a8844.png)

- Edit Watcher
    - 設定を下記の通り設定します（ファイルタイプが Vue.js Template の場合）

    | 項目 | 設定値 |
    |:--------:|:-------|
    | **File type** | `Vue.js Template` |
    | **Scope** | `Current File` |
    | **Program** | `$ProjectFileDir$/node_modules/.bin/prettier` |
    | **Arguments** | `--write $FilePathRelativeToProjectRoot$` |
    | **Output paths to refresh** | `$FilePathRelativeToProjectRoot$` |
    | **Working directory** | `$ProjectFileDir$` |

    - **Advanced Options** の **Auto-save edited files to trigger the watcher** はオフにします。
    - ※プロジェクトルートの `node_modules/.bin` 配下に `prettier` が存在する前提です。
        - 無ければ `npm install prettier --save-dev` でインストールしましょう。

> ![image.png](https://qiita-image-store.s3.amazonaws.com/0/13842/888447d6-79ff-fea3-af86-20021687bfbe.png)

以上
TypeScript3.1 で ReduxAction型定義は不要になりました

# MappedTypes で Unpacked が可能に

従来 Tuple や Promise に利用できた ConditionalTypes による [Unpacked](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-8.html) が MappedTypes でも可能になりました。まずは公式に掲載されている Unpacked型 を見てみます。戻り型を抽出している件は謎ですが、要するに Unwrapper と解釈して問題ないでしょう。

```typescript
type Unpacked<T> =
    T extends (infer U)[] ? U :
    T extends (...args: any[]) => infer U ? U :
    T extends Promise<infer U> ? U :
    T;
```

これが v3.1 から次の様に MappedTypes でも可能になりました。個人的にかなり大きい変更点だと思っていますが、公式ではまだアナウンスされていません。ChildNode の UnionTypes を得ることができます。これが、本題の件に影響を与えています。

```typescript
type Unwrap<T> = T extends {[K in keyof T]: infer U} ? U : never
```

# 本題

タイトルで言及している「不要」とは、型定義のハードコーディングを指します。ObjectMap から UnionTypes を得ることができるので、ActionCreators ファイルから直接 Actions型を推論することができます。こんな感じの ActionCreators ファイルがあるとします。いたって普通ですが、ActionType は StringLiteralTypes でないとマズイので、Assertion をつけておきます。戻り型の Annotation は付与しません。

```creators.ts
export function increment() {
  return { type: 'INCREMENT' as 'INCREMENT' }
}
export function decrement() {
  return { type: 'DECREMENT' as 'DECREMENT' }
}
export function setCount(amount: number) {
  return { type: 'SET_COUNT' as 'SET_COUNT', payload: amount }
}
export function setName(value: string) {
  return { type: 'SET_NAME' as 'SET_NAME', payload: value }
}
```

少し加工を加えないと期待する UnionTypes にはならないので、組み込み UtilityType の `ReturnType` で戻り型の推論導出をしておきます。これに、上記の Unwrapper を併せると次の様になります。CreatorsToActions 型 と称して再利用できる様に書き出しておきます。

```definition.ts
type Unwrap<T> = T extends {[K in keyof T]: infer U} ? U : never
type ReturnTypes<T> = {
  [K in keyof T]: T[K] extends (...args: any[]) => any ?
                  ReturnType<T[K]> :
                  never
}
export type CreatorsToActions<T> = Unwrap<ReturnTypes<T>>
```

# 定常開発での利用例

import した ActionCreators ファイルを、CreatorsToActions型で変換します。あとは reducer の引数にキャストすればOK。下段は Actions型の内訳です。

```reducer.ts
import * as creators from './creators'
import { CreatorsToActions } from 'path/to/definition'
type Actions = CreatorsToActions<typeof creators>
function reducer(state: State, action: Actions) {
  // ...
}
```
```typescript
type Actions = {
  type: 'INCREMENT';
} | {
  type: 'DECREMENT';
} | {
  type: 'SET_COUNT';
  payload: number;
} | {
  type: 'SET_NAME';
  payload: string;
}
```

大袈裟なヘルパーモジュールを利用せずに、この定義が自動で推論出来る時代。幸せですね。

# 宣伝

この変更で可能になった様々な型変換について書いた同人誌を、技術書典5で頒布します。技術書典にお越しの方はお立ち寄り頂けると嬉しいです。サークルは [【か73】潜推艦](https://techbookfest.org/event/tbf05/circle/49200001) です。
関数の引数で分割代入ができる

# 概要
分割代入は ES6 で追加された大変便利な構文です。
今更ながら、引数内で分割代入ができることを知って感動したので共有します。

# 分割代入について
分割代入 (Destructuring assignment) 構文は、配列から値を取り出して、あるいはオブジェクトからプロパティを取り出して別個の変数に代入することを可能にする JavaScript の式です[^1]。

```javascript:配列の分割代入
const arr = ['Japan', 'Tokyo', 'Shinjuku'];
const [country, state, city] = arr;

console.log(`country: ${country}, state: ${state}, city: ${city}`);
// -> 'country: Japan, state: Tokyo, city: Shinjuku'
```
```javascript:オブジェクトの分割代入
const obj = {country: 'Japan', state: 'Tokyo', city: 'Shinjuku'};
const {country, state, city} = obj;

console.log(`country: ${country}, state: ${state}, city: ${city}`);
// -> 'country: Japan, state: Tokyo, city: Shinjuku'
```
このようにして、配列から値を取り出したり、オブジェクトからプロパティを取り出して変数に代入できます。
他にもできることがあるのですが、本稿の内容から逸れてしまうので割愛します。

# 引数で分割代入を使う
それでは、引数内で分割代入をします。

```js:引数で分割代入
const arr = ['Japan', 'Tokyo', 'Shinjuku'];
const obj = { country: 'Japan', state: 'Tokyo', city: 'Shinjuku' };

const fnArr = ([country, state, city]) => (
  `country: ${country}, state: ${state}, city: ${city} from fnArr`
);
const fnObj = ({ country, state, city }) => (
  `country: ${country}, state: ${state}, city: ${city} from fnObj`
);

console.log(fnArr(arr));
// -> 'country: Japan, state: Tokyo, city: Shinjuku from fnArr'

console.log(fnObj(obj));
// -> 'country: Japan, state: Tokyo, city: Shinjuku from fnObj' 
```

このようにして、配列やオブジェクトが展開できます。

2018/10/02 追記
@yuta0801 さんにコメントをいただきました。
下記のようにすることで、デフォルトの引数を与え、 `TypeError` を引き起こさないようにできます。

```js:デフォルト引数
const fnArr = ([country, state, city] = []) => (
  `country: ${country}, state: ${state}, city: ${city} from fnArr`
);
const fnObj = ({ country, state, city } = {}) => (
  `country: ${country}, state: ${state}, city: ${city} from fnObj`
);

console.log(fnArr());
// -> 'country: undefined, state: undefined, city: undefined from fnArr'

console.log(fnObj());
// -> 'country: undefined, state: undefined, city: undefined from fnObj' 
```

さらに、 `undefined` ではなくデフォルトの値を代入する場合は下記のようにします。 

```js:デフォルト引数
// このようにデフォルト引数を書いても同様の結果を得られます
// ([country = 'USA', state = 'DC', city = 'Washington'] = [])
const fnArr = ([country, state, city] = ['USA', 'DC', 'Washington']) => (
  `country: ${country}, state: ${state}, city: ${city} from fnArr`
);

// このようにデフォルト引数を書いても同様の結果を得られます
// ({ country = 'USA', state = 'DC', city = 'Washington'} = {})
const fnObj = ({ country, state, city } = {country: 'USA', state: 'DC', city: 'Washington'}) => (
  `country: ${country}, state: ${state}, city: ${city} from fnObj`
);

console.log(fnArr());
// -> 'country: USA, state: DC, city: Washington from fnArr'

console.log(fnObj());
// -> 'country: USA, state: DC, city: Washington from fnObj' 
```


# まとめ
今までは、配列やオブジェクトを関数内で分割代入していました…。
分割代入を初めて使ったときに、その便利さに感動しましたが、2度目の感動がありました。



# 参考
[分割代入 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment)

[^1]: [分割代入 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment) より引用
SQL Server Management Studio 2017が起動しなくなった

## 現象
- アイコンを起動すると、起動中のスプラッシュ画像が出てくる。
- メインウィンドウが応答なしの状態で表示される。
    - 早いときはメインウィンドウも出ない。
- サーバ選択のダイアログが出る前に、メインウィンドウごと消える。
- **エラーが何も出ない。**
- VS2017のアップデートをかけたタイミング（おそらく）でダメになった
- ローカルのSQL Server自体は生きてる

## 環境
- Windows 10 Pro 64bit
- Visual Studio 2017 15.8.5
- SQL Server 2016 Enterprise
- SQL Server Management Studio 17.8.1 & 16.5.3

## 試したこと
PCの再起動はしまくってます。

#### 1. SSMS2017の修復
VS2017のアップデートをかけたタイミング（おそらく）でダメになったので、修復をかけてみたものの、直らない。

#### 2. SSMS2017の簡易再インストール
普通にアンインストール→再度インストールをするだけ。
これで直ったら記事に起こさない。

#### 3. VS2017の修復
[VS2015のクリーンインストールで直ったという記事](https://social.msdn.microsoft.com/Forums/ja-JP/891247cd-2550-4f1b-bede-d9a141babc95/sql-server-management-studio?forum=sqlserverja)を見つけたので試した
(VS2015は入ってないが)
が、ダメ

#### 4. SSMS2016の追加インストール
[共存できる](https://docs.microsoft.com/ja-jp/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-2017)ので、バージョン変えれば行けるのでは！？と思ったが、これもダメ
というかむしろ**SSMS 2016でも同じ現象が起こるんですけど？**

#### 5. レジストリの削除
HKEY_CURRENT_USER\Software\Microsoft\SQL Server Management Studio\14.0_Config を消せば直ったという記事(記事は11.0だったけど)を見つけたので試したがダメ

#### 6. SQL Server 2016の修復
<<共有機能のみを修復>>のオプションを選択して修復。
したけど、現象は治まらず。

#### 7. Visual Studio 2015 IsoShell の修復
[ダウンロードページの再インストールセクション](https://docs.microsoft.com/ja-jp/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-2017#uninstall-and-reinstall-ssms)に、「最初に Visual Studio 2015 IsoShell の修復をお試しください。」とあったので、修復。
修復時に問題が発生して正しく完了できなかったらしい。
そのあと一応起動を試してみたものの、案の定ダメ。

#### 8. SSMS 2017の再インストール
1. SSMS2017とSSMS2016を普通にアンインストール。
2. 「管理者特権でのコマンド プロンプトから Visual Studio 2015 IsoShell をアンインストールします。」とあったので、このコマンドを実行。 → `PUSHD "C:\ProgramData\Package Cache\{1eda7dec-78f4-4bb7-97c2-14d1fec1d94c}"` `vs_isoshell.exe /Uninstall /Force /PromptRestart` 載ってるコマンドと違ったけど、私の環境(SSMS2017をインストールした環境？)ではこのPATHに`vs_isoshell.exe`が入っていたので。
ただ、**実行したらvs_isoshell.exeが消えたんだけど？その後の手順の再インストールができないんだけど？？？**ってなってしまったので、内心あきらめて(そもそもSSMS2017入れる前にこんなexe入れてないので)、続行。
3. SSMS2017を再インストール。この時に`vs_isoshell.exe`が戻ってきました。めでたしめでたし。

・
・
・

復活した！！！！！！！！！！！！

最初からこれでよかったんだろうとはいえ、こんな手の込んだアンインストールをする羽目になるとは思わなかった。

---

エラーが出ないんじゃ検索のしようもない。
SSMSのログらしきファイルも見当たらない。
つかれました。(業務の半日が飛んだ。)
殴り書きですいません。
pillow で画像に余白を追加

次のページを参考にしました。
[Python, Pillowで画像の上下左右に余白を追加しサイズ変更](https://note.nkmk.me/python-pillow-add-margin-expand-canvas/)

入力データ
![in01.jpg](https://qiita-image-store.s3.amazonaws.com/0/179446/5619bdc4-b875-6ca5-40c8-166932304316.jpeg)

出力データ
![out01.png](https://qiita-image-store.s3.amazonaws.com/0/179446/4caf272c-b321-72d1-3bef-4f0e44c83800.png)

```py:add_mergin.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	add_mergin.py
#
#						Oct/02/2018
#
# --------------------------------------------------------------------
import sys
from PIL import Image
# --------------------------------------------------------------------
def add_margin(pil_img, top, right, bottom, left, color):
	width, height = pil_img.size
	new_width = width + right + left
	new_height = height + top + bottom
	result = Image.new(pil_img.mode, (new_width, new_height), color)
	result.paste(pil_img, (left, top))
	return result
# --------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
#
file_in = sys.argv[1]
file_out = sys.argv[2]
sys.stderr.write(file_in + "\n")
sys.stderr.write(file_out + "\n")
#
img = Image.open(file_in)
img = img.convert("RGBA")
width, height = img.size
sys.stderr.write("%d\t%d\n" % (width,height))
#
top = 60
right = 40
left = 40
bottom = 0
img = add_margin(img, top, right, bottom, left, (0, 0, 255))
#
width, height = img.size
sys.stderr.write("%d\t%d\n" % (width,height))
#
img.save(file_out)
#
sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------
```

実行方法

```bash
./add_mergin.py in01.jpg out01.png
```
JavaのGoogleHttpClientを使ってみた


```java
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpRequestFactory;
import com.google.api.client.http.UrlEncodedContent;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.JsonObjectParser;
import com.google.api.client.json.jackson2.JacksonFactory;
import lombok.Data;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class Main {

    static JsonFactory JSON_FACTORY = new JacksonFactory();
    static HttpRequestFactory httpRequestFactory = (new NetHttpTransport()).createRequestFactory();

    public static void main(String[] args) throws IOException {
        Map<String, Object> params = new HashMap<>();
        params.put("id", 1234);

        String url = "http://127.0.0.1:8080/user";
        User map = postHttpRequest(url, params, User.class);
        System.out.println(map);
    }

    private static <T> T postHttpRequest(String url, Map<String, Object> params, Class<T> clazz) throws IOException {
        HttpRequest req = httpRequestFactory.buildPostRequest(
                new GenericUrl(url),
                new UrlEncodedContent(params));
        req.setParser(new JsonObjectParser(JSON_FACTORY));

        String json = req.execute().parseAsString();
        return new ObjectMapper().readValue(json, clazz);
    }

    @Data
    public static class User {
        private String id;
    }
}
```

書いてみました。Googleのやつはシンプルだが、Postのサンプルが少なく感じました。

`req.execute().parseAs(Map.class)`

的なことが出来るので、クラス渡せばうまく行くかと思ったら、Mapは出来たが普通のvoとかは出来なかった。。

なので、jacksonを使った。
RPAの使い道と価値

# RPAの価値
直近でRPAソフトウェアの研修受けてきたので考えの整理の記事です

# 会社のとっての価値
ロボットにより業務コストの削減、と言うのがお題目。
それはそれで価値になるのですが、一番価値がでる場所としては
業務の見直しと人員変動を合法的に行えるところじゃないかと思います。

あと、システム開発を設備投資(CAPEX)としておいている会社さんにとっては
資本支出(OPEX)として処理できそうなのもメリットあるかもしれないです。

ちなみにちょっと困った点としては、中小企業が市販RPAのソフトウェア導入すると
比較対象になりそうな業務委託よりコスト増える可能性もありそうです。
保守含めると結構お値段高い。


# システム系の方々以外にとっての価値
**優先度の低いシステム化されそうにない分野**が
自分たちで対応できそう、と言うのが大きな価値になるかと。
![screen2.png](https://qiita-image-store.s3.amazonaws.com/0/280550/e03515cb-7a14-256c-f917-4936fe8351ac.png)

別にシステム屋さんがあんまり仕事しないから運用側が対応する！とか言う話ではなく
昔からWeb運用がCMSになったり、マーケティングがMAツールになったりと
システム領域がどんどんその他の領域の方々にフレンドリーになっていく過程の一つだと思ってます。

# システム系の方々にとっての価値
大きな価値としては**３つ(＋2)**だと思ってます。
![screen.png](https://qiita-image-store.s3.amazonaws.com/0/280550/d905ac01-359e-89d7-6efc-f5dbc7c1bc96.png)
価値としては
**1.種々様々な他のデータソースからの情報の取得
2.取得したデータの変換
3.データの他のシステムへの投入**
がメインどころ。
こんなの作れば簡単に作れるじゃん、ってのがエンジニアとしての感覚かもですが、
連携作るのにAPI開発したり調べたり試験したりを考えると結構ヘヴィだったり
パッケージソフトみたいにI/Fが足りないシステムからのデータ取得も
PC上のオペレーション経由でなんとかやってくれるので
適材適所で使えば開発工数がぐっと下がりそうな気がしています。

その他の価値として
**4.RPA実行マシン上での処理のキューイング
5.機械学習に必要な教師データと正解データが集まりやすい**
ってのがある気がしています。

特に5は今後有効活用したい分野ではあります。

# とはいえ
結局道具のうちの一つであります。
ツール使うのが目的になってはいけないです。本末転倒。
これは別にRPAだけでなく、CMSとかMAツールも同じことですけどね。

ロボもスクリプトも使い捨てであれば、コストが安い方が正義です。
I2C の初歩的な質問

とあるデバイスの LED を変更するプログラムを書こうとしています。


I2C アドレス: 0x93

Read Data Format:
Send 0xA0 ' Read 32 Byte Array[byArray[32]]
byArray[0]'LED Mode[Mode0'Mode1'Mode2'Mode3'Mode4]
byArray[1]'Red
byArray[2]'Green
byArray[3]'Blue
byArray[12]'LED'on/off

Write Data Format:
8 Byte Data[byData[8]]
Default'Switch'LED mode'Red'Green'Blue'Default'Default
Example: 0xA0 0x00 0x00 0xFF 0x00 0x00 0x00 0x04 (=Mode0 Red)

1stbyte header: 0xA0
2ndbyte: Switch(0x00 = LED MODE, 0xFC = ON/OFF MODE)
3rdbyte: If 2nd byte = 0x00, select LED MODE[MODE0(0x00)'MODE1(0x01)'MODE2(0x02)'MODE3(0x03)'MODE4(0x04)]
         Else if 2nd byte = 0xFC, select ON/OFF(0x01 ON/0x00 OFF)\
4th-6th: RGB value
7th-8th: reserved, keep 0x00 and 0x04


与えられた情報はこれだけですがこれだけでプログラムを書けるものでしょうか？
やりたいことは、Windows で C言語でデバイスの LED を変更することです。
これでプログラムが書けるのであればサンプルコードを教えていただけないでしょうか？
デバイスは、PCI Express 上にあります。
学習日誌　第三項　前編

classとか関数とかの学習が面倒でpythonを途中で投げ出したやつがおるらしいっすよ。

（　＾ω＾）・・・　はい、私です。

いやだって別にプログラムを作るだけならif,for,入出力さえできればいけるじゃーん　(言い訳)

といい加減逃げられなくなってきたので、本腰を入れて勉強することにします……Fortran90を

Fortran90入門を参考に練習問題6.7を解きたいと思います。

#問題について

```問題.f90
m行k列のA及びk行n列のBを設定し、三つのサブルーチン副プログラムを含んだプログラムを作りなさい。
```
大分端折って書いているけど、要約するとこんな感じです。

そのまま書いちゃうと色々問題になりそう…なりそうじゃない？

そもそも本が手元にある人はわかると思うけれど、問題の通りに解こうとすると破綻しているというね！

行列Cは行列Aの転置行列なのかAとBの積なのかとか、Aの転置行列がBならk行"n"列を設定する意味とか……

（　＾ω＾）・・・　(触れちゃいけないのか、私の理解力が足らないのか、これ分かんねぇな)

なので、好き勝手に改変して解いていきます。

#チャート
まず、プログラムのチャートを考えます。

1. m行k列のAとk行nのBを設定するプログラムを書く

2. 今回は行列Cを行列Aの転置行列として扱います。よって変換用のプログラムを書く

3. 行列Bの転置行列Dを求めるプログラムを書く

以上三つのサブルーチン副プログラムを軸に臨機応変に計算プログラムを書きます。

#各個撃破のスタイル
全部一気に書ければ良いのですが、ヘタレにそんな高尚なことはできません。

なので、それぞれをまず別プログラムとして書いていき、最終的に連結します。

（　＾ω＾）・・・　(呼び出せばよくね？は禁句)

####1.のプログラム
```matrix.f90
program matrix
allocatable A(:,:),B(:,:) !A及びBは何某かの二次配列だよ、という意味。
integer k,m,n
read(*,*) k,m,n
allocate (A(m,k)) !Aの配列を確定しました、という意味。allocatableとallocateはセットの関係
do i = 1,m
   read(*,*) (A(i,j),j=1,k)
end do
allocate (B(k,n))
do i = 1,k
   read(*,*) (B(i,j),j=1,n)
end do
write(*,*)'A='
do i = 1,m
   write(*,*) (A(i,j),j=1,n)
end do
write(*,*)'B='
do i = 1,k
   write(*,*) (B(i,j),j=1,n)
end do
end
```
writeに関しては完全に蛇足です。確認のために組み込んだだけです。

!マーク以下の文章はおさらい用のコメントです。これも確認用に入れただけです。

allocatableを書かずに作るとエラー吐かれるよ！と教訓を得ました。

配列に関して勉強不足なのが一発で分かる…なくてもだいじょーぶだと私は思っていました。

####2.のプログラム
```trans1.f90
program trans
allocatable A(:,:),C(:,:)
integer k,m
read(*,*) k,m
allocate (A(m,k))
do i = 1,m
   read(*,*) (A(i,j),j=1,k)
end do
allocate (C(k,m))
C=transpose(A) !お手軽transpose
write(*,*)'A='
do i = 1,m
   write(*,*) (A(i,j),j=1,k)
end do
write(*,*)'C='!,C にすると行列では返ってこないのできっちり書く
do i = 1,k
   write(*,*) (C(i,j),j=1,m)
end do
end
```
プログラム名を最初transposeにしているとコンパイルエラーが出た。

どうやらモジュール名とプログラム名が一緒だとダメみたいですね。

書いてて思ったことは、自力で転置に直すプログラムを書くべきかどうかということ。

なお15分ほど粘って思い浮かばなかったのであきらめた模様。

次の課題にしてもいいかもしれない。

####3.のプログラム
```trans2.f90
program trans
allocatable B(:,:),D(:,:)
integer k,n
read(*,*) k,n
allocate (B(k,n))
do i = 1,k
   read(*,*) (B(i,j),j=1,n)
end do
allocate (D(n,k))
D=transpose(B)
write(*,*)'A='
do i = 1,k
   write(*,*) (B(i,j),j=1,n)
end do
write(*,*)'D='
do i = 1,n
   write(*,*) (D(i,j),j=1,k)
end do
end
```
コ　ピ　ペ

それ以外に言う言葉がないですね…

今日はよく頑張ったので、しゅーりょー。

以上！
macOS 10.4 Mojave環境でbundle install mysql2が通らない

パスを指定してあげることで通るようになる模様。

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

### 参考

Gem native extension build fails after upgrade to MacOS 10.4 Mojave
https://github.com/brianmario/mysql2/issues/1005
RSpec has_attributesマッチャが使えない時

オブジェクトの比較がしたい！
でも、Rspecのバージョンが古くて`has_attributes`マッチャが使えない時

```ruby

expect(User.new(:name => "hoge")).to have_attributes User.new(:name => "hoge")
---
undefined method `has_attributes?' 
```

attributesで比較すればできる。

```ruby

expect(User.new(:name => "hoge").attributes).to eq User.new(:name => "hoge").attributes
```

長くなるが、古い環境だとしかたないので一旦これで解決。

参考

[Ruby on Rails | ActiveRecord で オブジェクト同士を==で比較した場合、全属性が同値かどうかは検証しない](https://qiita.com/YumaInaura/items/f8b946127f6ec888bbaf)
MacBook4,1 (Late 2008, Early 2009)とMacBook2,1 (Mid 2007)などにPure EFIでUbuntuなどをインストールする方法

# 概要
サードパーティのソフトを使用せずmacOSとUbuntuのマルチブートを実現させる方法です。
完成イメージはこんな感じです。
![ubuntu_pureefi.jpg](https://qiita-image-store.s3.amazonaws.com/0/68213/381b4e24-114b-4b9c-e59a-afe565ce99e0.jpeg)

# MacBook4,1とMacBook2,1共通
- リカバリ領域削除してパーティション分け
https://allabout.co.jp/gm/gc/385788/3/

- ブートUSB作る https://qiita.com/kpkpkp/items/6664a1dba97198b984ec

- EFI用USBを作る https://astrofloyd.wordpress.com/2014/01/14/boot-linux-from-usb-flash-drive-on-macbook/
文中の `/efi/boot/boot.efi` を `/efi/boot/bootx64.efi` とする。

参考
https://unix.stackexchange.com/questions/57964/booting-ubuntu-from-usb-on-a-mac
http://d.hatena.ne.jp/ichelm/20141209

インストールプロセス
http://blog.goo.ne.jp/impreza98/e/e836ca4f5de79a6bda53e9f6e0a05d27

1st way
http://heeris.id.au/2014/ubuntu-plus-mac-pure-efi-boot/
 ls -l (hd2,gpt2)でUUIDわからんので、USB起動（1度shud downしてから再起動）でgpartedからLinuxのUUIDを確認
 mount /boot/efi の前に mkdir /boot/efi を追加
日本語版記事
http://okilt-memo.seesaa.net/s/article/414547001.html
https://glandium.org/blog/?p=2830
https://ubuntuforums.org/showthread.php?t=2306161


# MacBook2,1 (32bit UEFI)のみ
https://unix.stackexchange.com/questions/206274/how-do-i-repair-grub2-not-booting-32-bit-efi-on-a-64-bit-machine
After this, run below command
sudo grub-install --target i386-efi --boot-directory=/boot --efi-directory=/boot/efi --bootloader-id="$(lsb_release -ds)"

additional info for this
https://wiki.archlinux.org/index.php/GRUB/EFI_examples



# オプション
sudo update-grub works?
https://askubuntu.com/questions/616811/gnu-grub-terminal-instead-of-ubuntu-login-screen

for Wi-Fi
https://askubuntu.com/questions/55868/installing-broadcom-wireless-drivers

check network driver
https://askubuntu.com/questions/333424/how-can-i-check-the-information-of-currently-installed-wifi-drivers



# 以下参考
2nd way (no confirmation for working)
https://askubuntu.com/questions/340194/how-to-convert-a-mac-bios-boot-to-efi-boot

grubx64 download
https://askubuntu.com/questions/597376/where-to-download-grubx64-efi-file

for pure EFI
https://medium.com/@mmiglier/ubuntu-installation-on-usb-stick-with-pure-efi-boot-mac-compatible-469ad33645c9

mount EFI
http://themacadmin.com/mounting-the-efi-boot-partition-on-mac-os-x/

get UUID
https://apple.stackexchange.com/questions/232081/command-line-equivalent-of-disk-utility-which-is-not-diskutil-to-obtain-uuid
$ ioreg -c IOMedia -r

インストール中のバグ対応
https://bugs.launchpad.net/ubuntu/+source/ubiquity/+bug/645449/comments/11

chroot 環境で `/dev/null’ が使えなくて困る
http://matoken.org/blog/blog/2014/09/02/chroot-dev_null-permission-denied/

LiveUsbPendrivePersistent
https://wiki.ubuntu.com/LiveUsbPendrivePersistent

これはうまくいかず
http://shinsuke789.hatenablog.jp/entry/2014/07/19/204909

http://blog.goo.ne.jp/impreza98/e/e836ca4f5de79a6bda53e9f6e0a05d27
AWS ワークスタイル


**■いつでも、どこでも、どのデバイスでも**
いつでも、どこでも、どのデバイスでも利用できるという点がポイントです。

| ３A       | 何が必要？|    AWSサービスでは？  |
|:-----------------|:-----------------|:-----------------|
|いつでも|　アプリケーション|[WorkSpaces](https://qiita.com/leomaro7/items/a4caaa0910a079dd3c7b)→仮想デスクトップ<br>[Appstream2.0](https://qiita.com/leomaro7/items/59e778821ffcb473f0aa)→アプリケーションストリーミングサービス|
|どこでも|　データ|[WorkDocs](https://qiita.com/leomaro7/items/6e19b36aa0db3839b851)→ドキュメント共有コラボレーション|
|どのデバイスでも|コミュニケーションツール|Chime→オンライン会議チャット|

---
**■なぜ、クラウド型デスクトップ　AWS？**
・変革を確かめ実績を積み上げながら、拡大していくことが重要です。この変革（PDCA）には時間を要する場合があり、クラウド型デスクトップではいつでも、すぐに始められるという点がポイントです。
・上記のような利便性に加えてセキュリティとの両立に優れている。
・フルマネージド型サービスで運用性に優れている。
・既存のオンプレミスツール（ADやRADIUS）と容易に連携が可能です。
inputのnameとvalueを取得してObjectのkeyとvalueにする

表題のとおり、下記のHTMLのソースから

``` html
<div id="hoge" style="display:none;">
  <input type="hidden" name="fuga1" value="piyo1">
  <input type="hidden" name="fuga2" value="piyo2">
  <input type="hidden" name="fuga1" value="piyo3">
</div>
```

このように「name」を「key」に「value」を「value」にする書き方です。

``` javascript
obj {
  fuga1: piyo1,
  fuga2: piyo2,
  fuga3: piyo3
}
```

## 書き方

``` javascript
const inputTags = document.querySelectorAll('#hoge input');
const list = Array.from(inputTags).map(obj => ({[obj.name]: obj.value}))
const obj = Object.assign({}, ...list);
console.log(obj)
```

ちなみにBabelで変換しないと```Array.from```はIEサポートしてないです。
Atomで正規表現入門

## はじめに 
* Atomエディタで正規表現を勉強したのでメモ残しといた。
* 文字列の検索、 「.*」「Aa」 で正規表現を有効にして、小文字と大文字を区別も有効にする
* 文字列で検索するときその文字列をリテラルという

##数字. ~~~ で「数字. 」を削除
* ^\d+\.\s ：数字＋ピリオド＋空白　を選択できる
* あとはから文字とかで置き換えればおけ

##メタ文字
* ドット「.」：改行を除く任意の１文字
* バックスラッシュ「\」：メタ文字を文字として検索できる。エスケープする
* 「\d」：0-9 数字１文字。大文字「\D」だと\d以外を選択
* 「\w」：a-z A-Z 0-9 １文字を表す。大文字「\S」だと\s以外を選択
* 「\s」：スペース、タブ、改行とか。大文字「\W」だと\w以外を選択

##量指定子：直前の繰り返しを回数で指定できる
* {n}：n個繰り返し
* {min,max}：min以上、max以下。電話番号03-~と080~を同時に指定とかできる
* {min,}：min以上
* ?：0以上1以下
* +：１以上
* *：０以上
* 量指定子はデフォルトで一番長いものをとってくる。それを防ぐには量指定子のあとに「?」をつけてあげれば一番短いものをもってくるのでおけ。

##アンカー
* ハット「^」：行の先頭。キャレットていうみたい
* ダラー「$」：行の最後
* 「\b」：単語の境界。前後が空白のものを選択する

##選択子
* 「|」：複数選択ができる。例 123 | abc 123かabcが選択できる。　abc.(com|cool) abc.comかabc.coolを選択できる

##文字クラス
* 大括弧[]：大括弧ないのどれか１文字をさす。例 [abc] abcのどれか１文字ではじまる
* 「[^]」：大括弧のなかの直後のみ否定のいみ
* 「[-]」：大括弧のなかで文字コード表にしたがって、範囲を意味する
* 大括弧のなかではエスケープする文字列がちがう

##改行とタブ
* \t：タブ
* \r\n：windows
* \r：v9までのmac
* \t：v9以降のmac
* \r\n|\t|\r：全てのOS

##キャプチャ
* ()でかこった範囲を記憶する
例
google,http://google.com
dotinstall, http://dotinstall.com
yahoo,http://yahoo.co.jp

(.+),\s?(.+)$    これで検索
<a href="$2">$1</a>    これで置き換え

<a href="http://google.com">google</a>
<a href="http://dotinstall.com">dotinstall</a>
<a href="http://yahoo.co.jp">yahoo</a>

##後方参照
* (\d),\1：後方から参照できる

##まとめ
以上
Amazon WorkDocs

**■Amazon WorkDocsとは？**
ファイル共有やドキュメントを通じて、コラボレーションするサービスです。

---
**■特徴**
・ドキュメントを社内以外の人と権限管理をしながら共有したり、コメント機能やバージョン管理機能を備えています。
・インターネット接続と適切な認証の仕組みを通じて、いつでもどこでもファイル参照が可能ですと、ファイルコラボレーション環境を作ることが可能です。
・ファイルストレージとして利用することも可能です。
AWS Appstream2.0

**■Appstream2.0とは？**
いわゆるアプリケーション配信サービスです。

---
**■特徴**
・画面転送する点は、[Amazon WorkSpaces](https://qiita.com/leomaro7/items/a4caaa0910a079dd3c7b) と似ていますが、アプリケーションの画面だけが飛んでくるところが違います。
・インターネット接続があれば、いつでも、どこでもアクセスして、必要なアプリケーションを使えます。
・端末のスペックやOSに関係なく、HTML5準拠のブラウザがあれば、アクセス可能です。
・マネージド型として提供されております。
![スクリーンショット 2018-10-02 18.51.39.png](https://qiita-image-store.s3.amazonaws.com/0/280929/7bf0e458-63ad-da69-afd3-97ea8d2acfdb.png)

管理者（左）：Appstream2.0 Image Builderをインストールし、アプリケーションを取り込むだけです。
利用者（右）：ブラウザを起動し、利用したいアプリケーションを選択し、画面配信を受けるだけです。
![スクリーンショット 2018-10-02 18.52.49.png](https://qiita-image-store.s3.amazonaws.com/0/280929/fc4032a4-5317-520f-90fd-4d696856b9f1.png)
Amazon WorkSpaces

#■Amazon WorkSpacesとは？#
いわゆる仮想デスクトップサービスです。


#■特徴#
・インターネット接続があれば、いつでも、どこでもアクセスして、必要なアプリケーションを使えます。
・ユーザは端末にクライアントのアプリケーションをインストールするか、WEBブラウザを使って、マルチ環境に対応することもできます。
・マネージド型として提供されております。
![スクリーンショット 2018-10-02 18.47.33.png](https://qiita-image-store.s3.amazonaws.com/0/280929/c2eaa44f-c76a-d4b9-4d8c-9d9a97b8a0c1.png)

WorkSpacesのクライアントやWEBブラウザからADの認証情報や多要素認証で認証されると、デスクトップがネットワーク越しに利用できるようになります。
![スクリーンショット 2018-10-02 18.56.41.png](https://qiita-image-store.s3.amazonaws.com/0/280929/09b509d0-da74-fe21-179f-287914fd4ce0.png)


#■体験してみた#

AWSで実現できる働き方改革
https://d1.awsstatic.com/events/jp/2017/crs/osaka/T3.pdf

##ステップ 1: WorkSpace の起動##
[高速セットアップ]で起動する。

- IAM ロールを作成して、WorkSpaces が ENI を作成し、WorkSpaces ディレクトリの一覧を表示できるようにします。
- VPC を作成します｡
- ユーザーおよび WorkSpace 情報を格納するために使用される VPC の Simple AD ディレクトリをセットアップします。
- 指定したユーザーアカウントを作成し、ディレクトリに追加します。
- WorkSpace インスタンスを作成します。
- 各 WorkSpace には、インターネットアクセスを提供するためのパブリック IP アドレスが割り当てられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/52886faa-3783-49ad-9db1-cf0ceca34f40.png)

今回は[Standard with Windows 10]を選択しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/ce5375dd-6ccc-23e3-e08f-b71976677bf7.png)

ちなみに

`VPC limit reached. Please delete a VPC to use Amazon WorkSpaces. for activityId="1" of activityType={Name: validateCustomerLimits,Version: 9}`

とでたので、東京リージョンでVPCを限度の5まで作成していたので、1つ削除して作成しなおした。

PENDING → AVAILABLE になると、ユーザーに指定した E メールアドレスに招待状が送信されます。

##ステップ 2: Web Accessの有効化##
今回は、WEBブラウザからアクセスしたいので、[Web Access](https://docs.aws.amazon.com/workspaces/latest/userguide/amazon-workspaces-web-access.html)を有効化にしたいと思います。（デフォルトでは無効です。）

[ディレクトリ]から、[アクション]-[詳細の更新]を開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/2b74ceea-b260-25d0-af03-9a60b79c4942.png)

[Web Access]をチェック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/6a935a29-324b-eaa8-eb6b-5eeaeb2d7afd.png)


##ステップ 3: WorkSpace に接続する##

届いたメールに記載のリンクをクリックし、パスワードを設定します。

メールに記載の[登録コード]を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/d12f84a6-f680-a151-8b67-807e0f615013.png)

ログインすれば完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/9e2ea58f-7c9e-5a31-2450-8523ced79744.png)
Cloudant NoSQL DBを別アカウントにReplicationする

IBM Cloudantに保存していた画像データを、まるっと別アカウントのIBM CloudantにReplicationしてみた。documentが英語で分かりづらかったので手順を公開します。
ちなみに1GBまで無料で使えるみたいです。

[参考：IBM Cloudant](https://www.ibm.com/analytics/jp/ja/technology/cloud-data-services/cloudant/)

#はじめに

MySQLなどのRDBでは通常、移行元のDB定義情報、データ情報をdumpして移行先にimport〜〜というのが一般的な方法かと思います。今回はNoSQL DBである**IBM Cloudant**を使用していたので、備え付けの機能であるReplicationという方法を用いてデータ移行します。



#Replication手順
大きく分けて以下3つの情報を指定する必要があります。

1.Replicationするデータベースの選択
2.移行先のデータベースの選択
3.認証手段の設定

順を追って説明していきます。

###移行するデータベースの選択

まずはReplication画面へ遷移します。

- 移行元のDBがあるIBM Cloudにログインし、ダッシュボードからCloudantサービスを選択、「LAUNCH CLOUDANT DASHBOARD」を押下

![image.png](https://qiita-image-store.s3.amazonaws.com/0/297265/fc12bfd1-b741-9aa0-89b5-a49ead93c4b0.png)

- 画面左のメニューアイコンから「Replication」アイコンを押下

![image.png](https://qiita-image-store.s3.amazonaws.com/0/297265/0eb39b7f-502a-2846-22a4-dd60d1b94bd1.png)

- 「Start Replication」押下で、以下の画面に遷移します。ここで、移行元/先のDB情報の指定、Replicationのオプション（一回きりなのか、定期的に実行するか）を設定します。


![image.png](https://qiita-image-store.s3.amazonaws.com/0/297265/31a7a8c0-fac6-828c-9f12-33ef33e93b2c.png)

- Source
    1. Type 「local Database」「remote Database」の二種類から選択
        - 移行元のDBコンソールを開いているので、「Local Database」   を選択
    - Name：　DBのリストから、ReplicateしたいDBを選択
    3. Authentification：「None」「Cloudant Username or API Key」「IAM Authentification」の三種類から選択
        - 今回は「Cloudant Username or API Key」を選択

＊username/passwordはCloudantサービスの資格情報から取得できます。

- Target
 1. Type :「local Database」「remote Database」の4種類から選択
        - 今回は別アカウントに新しくDBを作成するため、「New Remote Database」   を選択
    - New database:：　移行先のCloudantサービスのURL/[作成するDB名]
    3. Authentification：「None」「Cloudant Username or API Key」「IAM Authentification」の三種類から選択
        - 今回は「Cloudant Username or API Key」を選択


- Options
 1. Replication Type :「One time」「Continuous」の2種類から選択
        - 今回は「One time」を選択
        - 「Continuous」を選択すると定期的にReplicationが可能
    - Replication Document:実行時に保存されるログにdocument名をつけれます。特に必要なければ空欄で大丈夫です
   

- 「Start Repllication」を押下


問題なければReplicationが実行されます。
もしうまくいかないときは、API keyに誤りがないか、移行先のCloudant urlが正しいかを確認してください。
cwebpコマンドには目標PSNRから品質を決めてくれる-psnrオプションがある

`cwebp`コマンドはGoogleが提供するWebP変換のためのコマンドで、JpegやPNGなど従来のフォーマットからWebPに変換する手段として標準的な方法と言えます。

非可逆圧縮時は、Jpegと同様に0〜100の品質を`-q`オプションで指定するのですが、よく見ると`-psnr`というオプションがありました。

```bash
  -psnr <float> .......... target PSNR (in dB. typically: 42)
```

この`-psnr`オプションを使うと、**最終的な画質(PSNRによる元画像との差分量)の目標値から品質を決めてくれる**ようです。すごい！

Jpegも、品質と言いつつ最終的な画質は画像の性質によってまちまちです。

[Jpegの品質はどのくらいあてになるのか](https://qiita.com/miyanaga/items/a616261de490cc342d08)

上のエントリーと同じ、様々なエントロピーのサンプル画像で品質とPSNRの関係をグラフにしたところ、以下のようになりました。
やはりJpegと同じように**品質=データの圧縮度合い**であって、**どのくらい画質が劣化するかはやってみないとわからない**ようです。

<img width="1042" alt="chart03.png" src="https://qiita-image-store.s3.amazonaws.com/0/35178/7d7e205c-2a09-0919-da76-14f0454e6e2b.png">

※ このWebPのPSNR値は`cwebp`コマンドの出力に含まれる数値ですが、ImageMagickなどで計算するPSNRと相関性がありません。おそらくYUVとRGBの違いかと予想していますが、WebPの特徴についてはまたじっくりまとめてみたいと思っています。

# でも遅いんでしょう？

変換結果のPSNRから品質を数式で逆算することは無理っぽいので、内部的に何度か変換を試行しているものと予想されます。

あるJpeg画像(3024×4032px)を`-psnr`を指定して変換すると、**6.05秒**かかりました。PSNRは`41.98 dB`でほぼ42です(`Output:`の行にあります)。

```bash
$ time cwebp tmp/sample.jpg -psnr 42 -o tmp/sample.webp  
Saving file 'tmp/sample.webp'
File:      tmp/sample.jpg
Dimension: 3024 x 4032
Output:    1345066 bytes Y-U-V-All-PSNR 40.55 48.55 48.61   41.98 dB
           (0.88 bpp)
block count:  intra4:      39077  (82.05%)
              intra16:      8551  (17.95%)
              skipped:       109  (0.23%)
bytes used:  header:            439  (0.0%)
             mode-partition: 183811  (13.7%)
 Residuals bytes  |segment 1|segment 2|segment 3|segment 4|  total
    macroblocks:  |       3%|      12%|      30%|      55%|   47628
      quantizer:  |      25 |      24 |      19 |      15 |
   filter level:  |       8 |       5 |       8 |      21 |
cwebp tmp/sample.jpg -psnr 42 -o tmp/sample.webp  6.05s user 0.15s system 89% cpu 6.954 total
```

今度は`-q`を直接指定します。いくつか値を変えて試したところ、`-q 81.2`でだいだい同じ値になりました。
`-q`パラメータの指定時は**1.82秒**で処理が完了しました。`-psnr`を指定した実行では、**約3倍強の時間**がかかったことになります。

```bash
$ time cwebp tmp/sample.jpg -q 81.2 -o tmp/sample.webp
Saving file 'tmp/sample.webp'
File:      tmp/sample.jpg
Dimension: 3024 x 4032
Output:    1346364 bytes Y-U-V-All-PSNR 40.55 48.56 48.63   41.98 dB
           (0.88 bpp)
block count:  intra4:      39695  (83.34%)
              intra16:      7933  (16.66%)
              skipped:       114  (0.24%)
bytes used:  header:            439  (0.0%)
             mode-partition: 186205  (13.8%)
 Residuals bytes  |segment 1|segment 2|segment 3|segment 4|  total
    macroblocks:  |       3%|      12%|      30%|      55%|   47628
      quantizer:  |      25 |      24 |      19 |      15 |
   filter level:  |       8 |       5 |       8 |      21 |
cwebp tmp/sample.jpg -q 81.2 -o tmp/sample.webp  1.82s user 0.10s system 94% cpu 2.029 total
```

ユーザーリクエストに対しオンデマンドで変換する場合は不向きですが、バッチ処理など時間の余裕があるときは最終的な画質が安定するのでよさげです。