OmniAICreator/Qiita-1.07M huggingface dataset:
constexprラムダ式に関するコンパイル結果のメモ

## 概要
関数の引数の型について、参照の有無によってg++とclang++のコンパイル結果が異なる。

## コンパイラ
g++ 7.3.1
clang++ 6.0.0

## コード1
```c++
#include <iostream>

template <typename T>
void func(T obj)
{
	constexpr char const* x = obj();
	std::cout << x << std::endl;
}

int main()
{
	func( []{ return "test"; } );
}
```
| | |
|-----|-----|
| g++ | OK |
| clang++ | OK |

## コード2
```c++
#include <iostream>

template <typename T>
void func(T const& obj)
{
	constexpr char const* x = obj();
	std::cout << x << std::endl;
}

int main()
{
	func( []{ return "test"; } );
}
```
| | |
|-----|-----|
| g++ | OK |
| clang++ | `error: constexpr variable 'x' must be initialized by a constant expression` |

## コード3
```c++
#include <iostream>

template <typename T>
void func(T&& obj)
{
	constexpr char const* x = obj();
	std::cout << x << std::endl;
}

int main()
{
	func( []{ return "test"; } );
}
```
| | |
|-----|-----|
| g++ | OK |
| clang++ | `error: constexpr variable 'x' must be initialized by a constant expression` |
N4606 Working Draft 2016, ISO/IEC 14882, C++ standard(23)3.6.2 Static initialization [basic.start.static] p65

# はじめに
N4606 Working Draft, Standard for Programming Language C++
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/#mailing2016-11
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf

n4606は、ISO/IEC JTC1 SC22 WG21の作業原案(Working Draft)です。
公式のISO/IEC 14882原本ではありません。
ISO/IEC JTC1 SC22 WG21では、可能な限り作業文書を公開し、幅広い意見を求めています。
一連の記事はコード断片をコンパイルできる形にする方法を検討してコンパイル、リンク、実行して、規格案の原文と処理系(g++, Clang++)との違いを確認し、技術内容を検討し、ISO/IEC JTC1 SC22 WG21にフィードバックするために用います。
また、CERT C++, MISRA C++等のコーディング標準のコード断片をコンパイルする際の参考にさせていただこうと考えています。CERT C++, MISRA C++が標準化の動きとの時間的な擦れの確認が結果としてできれば幸いです。

## list
N4606 Working Draft 2016, ISO/IEC 14882, C++ standard(1) coding list
https://qiita.com/kaizen_nagoya/items/df5d62c35bd6ed1c3d43/

## Compiler
### clang++ --version
clang version 6.0.0 (tags/RELEASE_600/final)

### g++-7 --version
g++-7 (Homebrew GCC 7.3.0_1) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.

# (23)3.6.2 Static initialization [basic.start.static]
p65


```c++:p65.cpp
// N4606 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf 
#define msg "p65.cpp (23)3.6.2 Static initialization [basic.start.static]"

#include <iostream>
inline double fd() { return 1.0; }
extern double d1;
double d2 = d1; // unspecified:
// may be statically initialized to 0.0 or
// dynamically initialized to 0.0 if d1 is
// dynamically initialized, or 1.0 otherwise
double d1 = fd(); // may be initialized statically or dynamically to 1.0

int main(int argc, char *argv[], char *envp[]){
  std::cout << "d2="<<d2<<" d1= "<<d1 << std::endl;
  std::cout << msg << std::endl;
  return EXIT_SUCCESS;
}
```

```shell_session
$ ./cppgl.sh p65
$ clang++ p65.cpp
d2=0 d1=1
p65.cpp (23)3.6.2 Static initialization [basic.start.static]

$ g++-7 p65.cpp
d2=0 d1=1
p65.cpp (23)3.6.2 Static initialization [basic.start.static]
```

# 検討事項
　なぜその値になったかの仕組みの説明

# 参考資料

コンパイル用shell script C版(clangとgcc)とC++版(clang++とg++)
https://qiita.com/kaizen_nagoya/items/74220c0577a512c2d7da
Qiitaに投稿するCのStyle例(暫定)
https://qiita.com/kaizen_nagoya/items/946df1528a6a1ef2bc0d
# 文書履歴
ver. 0.10 初稿 2080415
ver. 0.11 URL追記　20230215
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
php : Basic Level

<?php
// 制御構文
// for文、if文、while文
for($i=0;$i<=100;$i++){
	echo $i.",";
}
?>

=>0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,


<?php
// 制御構文
// for文、if文、while文
for($i=0;$i<=100;$i++){
	if($i % 2 == 0){
	echo $i.",";
	}
}
?>

=>0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,
githubの初期設定


```
git config --global user.name githubで登録したユーザー名
```

```
git config --global user.email gitubuで登録したメルアド
```

```
git config --global core.editor "atom --wait"     #ATOMの場合
```

```
git config user.name         #ユーザー名の確認
```

```
git config user.email　　　　　　　　　　　　　　　　#メールアドレスの確認
```

```
git config core.editor      #エディタの確認
```

```
git config --list          　#設定をまとめて確認 
```

```
$ cat ~/.gitconfig          #設定ファイルの確認
```

参照リンク：gitconfig の基本を理解する
https://qiita.com/shionit/items/fb4a1a30538f8d335b35
N4606 Working Draft 2016, ISO/IEC 14882, C++ standard(21)3.4.5 Class member access [basic.lookup.classref] p60

# はじめに
N4606 Working Draft, Standard for Programming Language C++
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/#mailing2016-11
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf

n4606は、ISO/IEC JTC1 SC22 WG21の作業原案(Working Draft)です。
公式のISO/IEC 14882原本ではありません。
ISO/IEC JTC1 SC22 WG21では、可能な限り作業文書を公開し、幅広い意見を求めています。
一連の記事はコード断片をコンパイルできる形にする方法を検討してコンパイル、リンク、実行して、規格案の原文と処理系(g++, Clang++)との違いを確認し、技術内容を検討し、ISO/IEC JTC1 SC22 WG21にフィードバックするために用います。
また、CERT C++, MISRA C++等のコーディング標準のコード断片をコンパイルする際の参考にさせていただこうと考えています。CERT C++, MISRA C++が標準化の動きとの時間的な擦れの確認が結果としてできれば幸いです。

## list
N4606 Working Draft 2016, ISO/IEC 14882, C++ standard(1) coding list
https://qiita.com/kaizen_nagoya/items/df5d62c35bd6ed1c3d43/


## Compiler
### clang++ --version
clang version 6.0.0 (tags/RELEASE_600/final)

### g++-7 --version
g++-7 (Homebrew GCC 7.3.0_1) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.


#(21)3.4.5 Class member access [basic.lookup.classref]
p60

```c++:p60.cpp
// N4606 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf 
#define msg "p60.cpp (21)3.4.5 Class member access [basic.lookup.classref]"

#include <iostream>
struct A { };
struct B {
  struct A { };
  void f(::A* a);
};
void B::f(::A* a) {
  a->~A(); // OK: lookup in *a finds the injected-class-name
}
struct A2 { };
namespace N {
  struct A2 {
    void g() { }
    template <class T> operator T();
  };
}
int main() {
  N::A2 a;
  a.operator A2(); // calls N::A2::operator N::A2
  std::cout << msg << std::endl;
  return EXIT_SUCCESS;
}
```

```shell_session
$ ./cppgl.sh p60
$ clang++ p60.cpp
Undefined symbols for architecture x86_64:
  "N::A2::operator A2<A2>()", referenced from:
      _main in p60-84e14d.o
ld: symbol(s) not found for architecture x86_64
clang-6.0: error: linker command failed with exit code 1 (use -v to see invocation)

$ g++-7 p60.cpp
Undefined symbols for architecture x86_64:
  "N::A2::operator N::A2<N::A2>()", referenced from:
      _main in cct2nOqH.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status
```

# 検討事項
　リンクエラーにならない追記。
　内容の出力。

# 参考資料

コンパイル用shell script C版(clangとgcc)とC++版(clang++とg++)
https://qiita.com/kaizen_nagoya/items/74220c0577a512c2d7da
Qiitaに投稿するCのStyle例(暫定)
https://qiita.com/kaizen_nagoya/items/946df1528a6a1ef2bc0d
# 文書履歴
ver. 0.10 初稿 2080415
ver. 0.11 URL追記　20230215
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
JavaFX - ノードの表示と領域の占有を同期させる

# やりたいこと
例えば、あるノードの表示・非表示を動的に切り替えるときに、何も考えずに次のように実装したとする。

![javafx.jpg](https://qiita-image-store.s3.amazonaws.com/0/28302/ebb8c037-b232-be5e-3cff-19cf7422aa48.jpeg)

```java
package sample.javafx;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;

import java.net.URL;
import java.util.ResourceBundle;

public class MainController implements Initializable {
    @FXML
    private CheckBox checkbox;
    @FXML
    private Label hogeLabel;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        hogeLabel.visibleProperty().bind(checkbox.selectedProperty());
    }
}
```

チェックボックスの選択と、 `Hoge` ラベルの表示を連動させている。

**実行結果**

![javafx.gif](https://qiita-image-store.s3.amazonaws.com/0/28302/4241fce7-3d21-c2d0-b0a4-70e088095e7a.gif)

`Hoge` ラベルが非表示になっても、 `Fuga` ラベルの位置はそのままになっている。
`Hoge` ラベルは見えなくなっているだけで、その領域を依然として占有した状態になっている。

これを、 `Hoge` ラベルが消えたら `Fuga` ラベルが上に詰まるようにしたい。

# やり方
```java
package sample.javafx;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Label;

import java.net.URL;
import java.util.ResourceBundle;

public class MainController implements Initializable {
    @FXML
    private CheckBox checkbox;
    @FXML
    private Label hogeLabel;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        hogeLabel.visibleProperty().bind(checkbox.selectedProperty());
        hogeLabel.managedProperty().bind(hogeLabel.visibleProperty());
    }
}
```

**実行結果**

![javafx.gif](https://qiita-image-store.s3.amazonaws.com/0/28302/67188717-346b-5952-da87-aff170169af8.gif)

**説明**

```java
hogeLabel.managedProperty().bind(hogeLabel.visibleProperty());
```

`managed` プロパティを `false` にすれば、レイアウトの管理対象から外れ、領域の占有がなくなる。
なので、 `managed` プロパティと自身の `visible` プロパティを連動させれば、目的の動作を実現できる。

# 参考
- [java - JavaFX - setVisible doesn't "hide" the element - Stack Overflow](https://stackoverflow.com/questions/28558165/javafx-setvisible-doesnt-hide-the-element)
zshスクリプトのファイル内での行数を取得するには${(%):-%I}

# はじめに

[5chのシェルスクリプト総合 その26](https://mevius.5ch.net/test/read.cgi/unix/1489979246/)でzshの`$LINENO`は関数内だと関数の最初からかぞえた行数になるのでファイル内での行数はどうやれば取れるかという話題があって、回答の一つは`${(%):-%I}`なのだけど、これはどういうことなのか?


# `${(%)...}`

最初の`(%)`はパラメタ展開のフラグ指定で、`%`は得られた文字列にプロンプトの%エスケープ展開を行うフラグです。

# `${:-word}`

`${name:-word}`という形はよく見かけて、$nameが定義されていないときのデフォルト値をwordにする奴ですが、nameを省略することができてその場合は必ずwordに展開されるということでした。これ単独だと文字列そのまま書くのと変わらないですが、パラメタ展開のフラグを組み合わせることでさらに加工できるので使い道があるわけですね。

# `%I`

プロンプト展開でファイルの中での行番号に展開されます。

# まとめ

`${(フラグ):-文字列}`はイディオムとして憶えておくと他でも何かで使えるかも。勉強になった。このくらいぱっと出てくるぐらいのzsh力が欲しい。
貧弱な設計の兆候

# 貧弱な設計の兆候
[1. 硬さ](#1-硬さ)
[2. 脆さ](#2-脆さ)
[3. 移植性のなさ](#3-移植性のなさ)
[4. 扱いにくさ](#4-扱いにくさ)
[5. 不必要な複雑さ](#5-不必要な複雑さ)
[6. 不必要な繰り返し](#6-不必要な繰り返し)
[7. 不透明さ](#7-不透明さ)

# 1. 硬さ
ソフトウェアのちょっとした変更でさえもとても難しいということ。一つの変更で、それと依存関係のあるモジュールを芋づる式に変更しなければならないような場合、設計が「硬い」という。変更を余儀なくされるモジュールが多いほど、より「硬い」設計であるという。

# 2. 脆さ
一つの変更によって他の多くの部分が壊れてしまうような傾向があるということ。変更した部分とは概念的に関連のない箇所まで壊れてしまうことまである。いつまでもバグリストから消えないモジュール、再設計の必要を感じているモジュール(とはいえ、できれば自分ではやりたくない)、修復すればするほどひどくなるモジュールなどが対象。

# 3. 移植性のなさ
他のモジュールで役に立つ部分を含んでいながら、オリジナルのモジュールからその部分を切り離すのが困難でリスクを伴う場合(数多くの単体テストを要してしまうなど)のこと。

# 4. 扱いにくさ
- ソフトウェアの扱いにくさ
設計構造を無視して変更が行われているソフトウェア

- 開発環境の扱いにくさ
開発環境がのろくて非効率

# 5. 不必要な複雑さ
設計時点で不必要な要素を含んだ設計。将来の仕様変更を見越した設計にした際に発生しやすいが、だいたいは不必要に終わってしまい、逆に設計を複雑にしてしまうという。

# 6. 不必要な繰り返し
似たようなコードが、ほんの少し違う形で繰り返し現れるようなソフトウェア。繰り返し箇所を見つけ、適切に抽象化することで削除することができる。システム内に重複したコードがあると、仮に重複した箇所でバグが見つかった場合、全ての重複箇所を修正しなければならなくなる。

# 7. 不透明さ
わかりにくいモジュール。コードは明快で表現豊かであるかもしれないが、不透明で入り組んだ表現で記述される場合もある。開発者は読み手の立場に立って考え、読み手が理解できるように皆が協力してコードをリファクタリングする必要がある。
ROS_Lesson2

#今回の課題
今回はロボットの動作に関する課題です。

- 課題1　座標変換tf
- 課題２　URDF　
以上の課題を行います。　

#課題１-tf
http://wiki.ros.org/tf/Tutorials
公式のwikiを参考に問題を解きます。
自律ロボットでは座標変換が重要な役割を担います。
ロボットの中心とセンサの位置関係であったり、点群情報を用いて環境地図を作ったりするときに必要なものです。
ROSではtfというパッケージが利用可能で、tfに苦しむ開発者も多いので丁寧に学習しましょう。

- まず公式のチュートリアルをコピーアンドペーストで実行してみる(C++のみ)
- rosrun rqt_tf_tree rqt_tf_tree　を実行してtfの木構造を見る
- rosbag recordというコマンドを使い特定のトピックを保存する
- 保存したrosbagを実行する


#課題２-URDF
http://wiki.ros.org/urdf/Tutorials
https://qiita.com/RyodoTanaka/items/174e82f06b10f9885265
上記を参考にすればロボットを作れると思います。本やネットを参考にしながら学習すると良いでしょう。

- URDFファイルを自分で作る（コピペ可）
- URDFファイルを作った際にはcheck_urdfコマンドとurdf_to_graphizコマンドを使い確認する
- gazeboで実行してみる。
1列に並んだ文字を任意の列数に改行するバッチ

#バッチファイルで改行をしなければなくなった
必要に迫られてテキストファイル内で1列に並んだテキストをバッチファイルを改行処理する必要があったのでそのバッチを書きます。

私の個人ブログでも詳細説明や様々なバッチを紹介しております。
[こりんずネット](https://mrcollins.net/bat-convert/)

##処理前のテキストファイルの中身
test.txt

```
testuser1
group1
group2
testuser2
group1
group2
testuser3
group1
group2
```

このtext.txtの中身を以下のように変換したい。

```
user1,group1,group2
user2,group1,group2
user3,group1,group2
```

##バッチファイルの内容

```
setlocal enabledelayedexpansion

set /a count=1
for /f "tokens=1" %%A in (kaigyou.txt) do (
if !count! lss 3 (
set /p<nul="%%A," >> output.txt
set /a count=!count!+1
) else if !count! geq 3 (
echo %%A >> output.txt
set count=
set /a count=1
)
)

endlocal
```

#行数を指定する場所
count変数の中の数値を見てifで改行するかどうかを判断しています。

```
if !count! lss 3 (
```
lssの後ろの数字を任意の数字に変更すれば任意の数に変更できます。
今回は3行のため3にしています。

```
) else if !count! geq 3 (
```
elseも3に合わせます。


詳しい説明は私の個人ブログで紹介しております。
[こりんずネット](https://mrcollins.net/bat-convert/)

以上でした。
N4606 Working Draft 2016, ISO/IEC 14882, C++ standard(18)3.4.3.1 Class members [class.qual]p.54

# はじめに
N4606 Working Draft, Standard for Programming Language C++
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/#mailing2016-11
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf

n4606は、ISO/IEC JTC1 SC22 WG21の作業原案(Working Draft)です。
公式のISO/IEC 14882原本ではありません。
ISO/IEC JTC1 SC22 WG21では、可能な限り作業文書を公開し、幅広い意見を求めています。
一連の記事はコード断片をコンパイルできる形にする方法を検討してコンパイル、リンク、実行して、規格案の原文と処理系(g++, Clang++)との違いを確認し、技術内容を検討し、ISO/IEC JTC1 SC22 WG21にフィードバックするために用います。
また、CERT C++, MISRA C++等のコーディング標準のコード断片をコンパイルする際の参考にさせていただこうと考えています。CERT C++, MISRA C++が標準化の動きとの時間的な擦れの確認が結果としてできれば幸いです。

## list
N4606 Working Draft 2016, ISO/IEC 14882, C++ standard(1) coding list
https://qiita.com/kaizen_nagoya/items/df5d62c35bd6ed1c3d43/


## Compiler
### clang++ --version
clang version 6.0.0 (tags/RELEASE_600/final)

### g++-7 --version
g++-7 (Homebrew GCC 7.3.0_1) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.


#(18)3.4.3.1 Class members[class.qual]
p.54

```c++:p54.cpp
// N4606 Committee Draft, Standard for Programming Language C++
// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4606.pdf 
#define msg "p54.cpp (18)3.4.3.1 Class members[class.qual]"

#include <iostream>

struct A { A(); };
struct B: public A { B(); };
A::A() { }
B::B() { }
B::A ba; // object of type A
A::A a; // error, A::A is not a type name
struct A::A a2; // object of type A

int main(int argc, char *argv[], char *envp[]){
  std::cout << msg << std::endl;
  return EXIT_SUCCESS;
}
```

```shell_session
i$ ./cppgl.sh p54
$ clang++ p54.cpp
p54.cpp:12:4: error: qualified reference to 'A' is a constructor name rather than a type in this context
A::A a; // error, A::A is not a type name
   ^
1 error generated.

$ g++-7 p54.cpp
p54.cpp:12:1: error: 'A::A' names the constructor, not the type
 A::A a; // error, A::A is not a type name
 ^
```

# 課題
内容の出力の例。

# 検討事項
コンパイルエラーが出るのがExampleの意図通りか。

# 参考資料

コンパイル用shell script C版(clangとgcc)とC++版(clang++とg++)
https://qiita.com/kaizen_nagoya/items/74220c0577a512c2d7da
Qiitaに投稿するCのStyle例(暫定)
https://qiita.com/kaizen_nagoya/items/946df1528a6a1ef2bc0d
# 文書履歴
ver. 0.10 初稿 2080415
ver. 0.12 URL追記　20230215
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
geometry > star shaped (星形) > Voronoi diagram

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
```

[geometry > numpy > star shaped (星形) の座標を得る | Matplotlibでの描画 > v0.3:座標は得られた | v0.4: モジュール化](https://qiita.com/7of9/items/e23c81db584ffae7edd3)
で作成したstar shapedに対してVoronoi diagramを作成してみた。

### 参考

- [geometry > Voronoi を試してみた (2D, 3D)](https://qiita.com/7of9/items/987dad79a429266013d7)

### code

モジュールgeometry_starShaped_180415は以下に掲載。
[geometry > numpy > star shaped (星形) の座標を得る | Matplotlibでの描画 > v0.3:座標は得られた | v0.4: モジュール化](https://qiita.com/7of9/items/e23c81db584ffae7edd3)

```py:Voronoi_starShaped_180415.ipynb
%matplotlib inline

import numpy as np
import matplotlib.pyplot as plt
from scipy.spatial import Voronoi, voronoi_plot_2d
from pylab import rcParams
import geometry_starShaped_180415 as GSS

'''
v0.1 Apr. 15, 2018
  - show Voronoi diagram
'''

rcParams['figure.figsize'] = 7, 7
rcParams['figure.dpi'] = 70

RAD_INNER = 5
RAD_OUTER = 10
xs, ys = GSS.get_starShaped(RAD_INNER, RAD_OUTER)

fig = plt.figure()

# star shaped
ax1 = fig.add_subplot(1, 1, 1)
ax1.scatter(xs, ys)
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.grid(True)

# Voronoi
wrk = [[ax, ay] for ax, ay in zip(xs, ys)]
vor = Voronoi(wrk)
voronoi_plot_2d(vor)

fig.tight_layout()

```

下図がVoronoi diagram。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9467c6d9-a7ea-c80c-f706-9446d6887fb0.png)
Javaカバレッジ計測ライブラリ

Javaのテストカバレッジを計測できるオープンソースライブラリの現状を調査してみました。

#### 要約

[Cobertura](http://cobertura.github.io/cobertura/)は開発が停止しているため、今後は[JaCoCo](http://www.jacoco.org/jacoco/index.html)もしくは[Clover](https://confluence.atlassian.com/clover/)が主流となりそう。ただし[Clover](https://confluence.atlassian.com/clover/)は最近オープンソース化されたため、今後の継続開発（＝コミュニティの活発度）はあまり見えていない。

#### 主要な3ライブラリの概要

[JaCoCo](http://www.jacoco.org/jacoco/index.html)

- 最新版は2018年1月リリースのバージョン0.8.0（2018年3月時点）。
- 実行時に計測（on-the-fly instrumentation）できないクラスに対して、クラスファイルに計測処理を事前に追加する（offline instrumentation）ことができる。

[Cobertura](http://cobertura.github.io/cobertura/)

- 開発は2015年2月で止まっている。
- Java 8に未対応でLambda式などの記法があるとその部分の計測ができない。
- 他のライブラリでは対応していない複数のモジュールから構成されるプロジェクトに対する計測レポートの集約に対応している。

[Clover](https://confluence.atlassian.com/clover/)

- 元々は商用ソフトであったが2017年4月にオープンソース化された。
- 他のライブラリと異なり、クラスファイルではなくソースコードに対して計測コードを追加してカバレッジを計測する。
- 複雑度（cyclomatic complexity）だけではなく[20以上のメトリクス](https://confluence.atlassian.com/clover/columns-element-588582415.html)に対応する。

#### その他のライブラリなど

[EclEmma](http://www.eclemma.org/)

- JaCoCoでのカバレッジ計測をEclipse上で行うためのEclipseプラグイン。
- かつてはカバレッジ計測ライブラリに[EMMA](http://emma.sourceforge.net/)を利用していたが、EMMAの開発が2005年に止まったため、独自にカバレッジ計測ライブラリJaCoCoを開発して、こちらに移行した。

[JMockit](http://jmockit.github.io/index.html)

* テスト用のモックツールであるが、[カバレッジの計測](http://jmockit.github.io/tutorial/CodeCoverage.html)にも対応している。

#### 参考

- https://confluence.atlassian.com/clover/comparison-of-code-coverage-tools-681706101.html
- https://tesshu.com/java/comparison-between-jacoco-and-cobertura
Python > array > [3, 1, 4, 1, 5], [2, 7, 1, 8, 2] から[[3, 2], [1, 7], [4, 1], [1, 8], [5, 2]]を作る

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04.4 LTS desktop amd64
TensorFlow v1.7.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
PyMieScatt v1.7.0
```

### code v0.1

```numpy_array_x_y_to_xy_180415.py
import numpy as np

# on Python 3.5.2

xs = [3, 1, 4, 1, 5]
ys = [2, 7, 1, 8, 2]

res = [[ax, ay] for ax, ay in zip(xs, ys)]
print(res)

```

```txt:run
$ python3 numpy_array_x_y_to_xy_180415.py 
[[3, 2], [1, 7], [4, 1], [1, 8], [5, 2]]
```

### code v0.2

@LouiS0616 さんのコメントのとおりNumpyのインポートは不要でした。

コメントありがとうございます。

- ファイル名変更 (numpy除去)
- 記事タイトル変更 (Numpy -> Python)
- タグ変更 (Numpy -> Python)

```array_x_y_to_xy_180415.py
# on Python 3.5.2

xs = [3, 1, 4, 1, 5]
ys = [2, 7, 1, 8, 2]

res = [[ax, ay] for ax, ay in zip(xs, ys)]
print(res)

```

```shell-session
$ python3 array_x_y_to_xy_180415.py 
[[3, 2], [1, 7], [4, 1], [1, 8], [5, 2]]
```
convnet.jsの作法 その4

#概要

convnet.jsの作法を調べる。

#convnetjs.Net()には、toJSON（）とfromJSON（）がある。

ネットを保存できる。tensorflow.js,deeplearn.js,keras.jsには、無い。
しかも、1ファイルで、モデルとweightを扱える。
convnet.jsのアドバンテージ。

#サンプルコード

保存

```
var json = net.toJSON();
var str = JSON.stringify(json);
```

読み込み

```
var json = JSON.parse(str);
var net = new convnetjs.Net();
net.fromJSON(json);
```

#成果物

ネットをパースして、表示。

http://jsdo.it/ohisama1/08zx

以上。
rspec で header 指定できないときに確認すること

参考: https://github.com/rspec/rspec-rails/issues/1655

header を含むテストは spec/controllers/ ではなく **spec/requests/ (type: :request)** で書く。

例

```rb
require 'rails_helper'

RSpec.describe "Tags", type: :request do
  it "returns a success response" do
    get "/tags/#{@tag.id}", headers: headers
  end
end
```

rspec-rails (3.7.1)
Flask実行時にPYTHONPATHが見つからない

`flask run --host=0.0.0.0`をしたらエラーが出た。

```
NoAppException: The file/path provided (app.py) does not appear to exist.  Please verify the path is correct.  If app is not on PYTHONPATH, ensure the extension is .py
```

flaskコマンドではなくpythonから呼び出したら普通に動いた...
flaskのpythonが2.7系で、python3.5系だったのが問題だと思う。

```
python app.py
```
データベース比較

RDBMSの選定基準をプロジェクトのたびに作るのが嫌なので、簡単な比較表を作ってみました。
https://docs.google.com/spreadsheets/d/1Y1Kr1CN19Xe7jQ7rlNwqXdb9QIzoEcGPhzsb9Op7L6c/edit?usp=sharing

間違っている部分については適宜修正したいので、ご指摘大歓迎です。
自分も気になったことがあったら項目追加したり修正します。
RのデータフレームをPythonのpandasデータフレームにする方法

RのダータフレームをPythonで使いたい

備忘録
RのデータフレームをPythonのpandasのデータフレームにする方法
rpy2を使う場合

python 3.6.4
pandas 0.22.0
rpy2   2.9.1 

```python:qiita.rb
import pandas as pd
from rpy2.robjects import pandas2ri
pandas2ri.activate()
from rpy2.robjects import r

# RDataを読込む
r['load']("hoge.RData")
# RDataの中にあるオブジェクトを読込む
df = pd.DataFrame(r["hogehoge"]) 

```
Python3 ユーザー入力を受け取る(input)

# Python3 でユーザー入力を受け取るには、input関数を利用します。
input関数の引数に文字列を入力することで、ユーザに入力する値を知らせることが出来ます。

```python
>>> i = input('値を入力してください:')
値を入力してください:

```

第一引数はなくても構いません

```python
>>> i = input()
3.14  # 3.14と　入力する
>>> i
'3.14'
>>> type(i)
<class 'str'> 
```

上を見るとわかるように、input関数で入力された値は文字列として保持されるようです。

この値を数値として扱うには、適宜変換する必要があります。

```python
>>> float(i)
3.14
```
この値をint型に変換しようとすると、以下のようなエラー(ValueError)になってしまいます。

```python
>>> int(i)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: invalid literal for int() with base 10: '3.14'
# 底が10のintに不当なリテラル
```

ちなみに、pythonでは浮動小数点が整数かチェックする関数も準備されています。

```python
>>> 3.14.is_integer()
False

>>> 3.00.is_integer()
True

>>> pi = 3.14
>>> pi.is_integer()
False

```
CSSのセレクタと論理演算

暇つぶしに考えてたらちょっと面白かったので書いてみた

### OR (`A` または `B`)

<img src="https://qiita-image-store.s3.amazonaws.com/0/99270/aa2c63d0-977e-b8f2-9108-19ed1b33b375.png" width="200">


```css
A, B {}
```

### AND (`A` かつ `B`)

<img src="https://qiita-image-store.s3.amazonaws.com/0/99270/093fb92b-6ade-4de3-ed7a-37f3607a56d0.png" width="200">

```css
AB {}
```

### NOT (`A` ではない)

<img src="https://qiita-image-store.s3.amazonaws.com/0/99270/9a2ec2b9-954b-a253-fd65-98ed28f12bc5.png" width="120">

```css
:not(A) {}
```

### NOR (「`A` または `B`」ではない: ORの否定)

<img src="https://qiita-image-store.s3.amazonaws.com/0/99270/f770b801-30a4-ba31-e59c-aa3b5017c7a4.png" width="200">

```css:この書き方はまだできない
:not(A, B) {}
```

単純に考えると以上の書き方だが，今はできない．現在WDの[Selectors Level 4](https://www.w3.org/TR/selectors-4/)で定義されているようだった．

こういう時は[ド・モルガンの法則](https://ja.wikipedia.org/wiki/%E3%83%89%E3%83%BB%E3%83%A2%E3%83%AB%E3%82%AC%E3%83%B3%E3%81%AE%E6%B3%95%E5%89%87)が便利で 

```math
\overline{A \cup B} = \overline{A} \cap \overline{B}
```

以上からNORは`A`のNOTと`B`のNOTのANDとできるので，以下で書ける．

```css
:not(A):not(B) {}
```

3つ以上セレクタがある場合などは結構セレクタが汚くなる．Selectors Level 4の実装を待つことにしたい．

### NAND (「`A` かつ `B`」ではない: ANDの否定)

<img src="https://qiita-image-store.s3.amazonaws.com/0/99270/817bb4ec-f242-853e-2d4a-d5caaaf778ad.png" width="200">

NORより素直で以下の書き方で大丈夫．

```css
:not(AB) {}
```

NORの場合と同じように，ド・モルガンの法則

```math
\overline{A \cap B} = \overline{A} \cup \overline{B}
```

から，NANDは`A`のNOTと`B`のNOTのORとできるので，以下でも書ける．

```css
:not(A), :not(B) {}
```

### XOR (排他的論理和)

<img src="https://qiita-image-store.s3.amazonaws.com/0/99270/848af736-b41c-6814-77d7-f05aa897d7a3.png" width="200">

排他的論理和は **「`A`と`B`のNOTのAND」と「`A`のNOTと`B`のAND」のOR** で表せるので，以下のように書ける．

```css
A:not(B), :not(A)B {}
```

(`A:not(B), B:not(A)` のほうが素直で読みやすいかもしれない)


### 雑感

実はNORなことをしようとしてて困ったのがきっかけでこんなことを考え始めた．
込み入ったことをするときは集合論理を思い出してこういうことをすると対処しやすそう．
とはいえUIデザイナーになって数学がこんな役の立ち方するとは思わなかったである．
初代🍓 IchigoJam💝 に出会いました。

　自分で作れる　マイコン　
　（手のひらに乗る　トランプタイプの緑の基盤IchigoJamに）

　　食べられない🍓イチゴジャム🍓　IchigoJam 

　初代🍓 IchigoJam💝 　に　会いました！
　　　　　（今日のアルもくもく会で　持っていたHさんから見せてもらった）
　　初代と、今の　
　　　　　🍓IchigoJam ツーショットしてみました。
　　
　　　可愛い　LOVE  💝　
[初代IchigoJam.jpg](https://qiita-image-store.s3.amazonaws.com/0/248242/d13b90a1-6537-3671-a03c-af396ec54772.jpeg)

　🍓IchigoJam　　歴史　　
　　　　４月１日で、4周年のお誕生日　
　　　　　　　（電子工作の歴史を探るのも面白いですね）
あまり使わないが一ヶ月に1回ぐらい使いそうなGitコマンド

随時追加していきます。


よく使うコマンドは下記に書いています。
[これだけ知っていれば何とかなるGitコマンド](https://qiita.com/naka46/items/8b1c3b9825f64b69db37)

```
git remote -v
git remote set-url origin {new url}
```
originのURLを確認し、変更する。
確認はたまにするかもですが、変更するのはめったにないです。
WindowsでHDDからSSDの移行方法 with Linux

###目的：
ノートPCなど，既にWindowsの入ったHDDを，高速化の為にSSDに移行したい

---

###課題：
ddでHDDのMBRやCドラ，Dドラを一括コピーすると，パーティション情報がSSDもHDDと同じアライメントになってしまい，SSDの性能が活かせない

---

###解決方法：
MBRからパーティション情報以外をddでコピー，その後ntfscloneでパーティションごとにコピー

####使う物
・Windowsの入ったPCのHDD(HDD1とする)(SSDに換装したいPC)
・Linuxの入ったPC(自分はarchlinuxを使用)
・HDDから入れ替えたいSSD
・SATA接続のお立ち台(2枚刺さるやつ)
・容量デカめの適当なHDD(HDD2とする)(ntfscloneの出力先として使用)

--
例として，

sdb:HDD1(コピー元)
　sdb1:システム領域(MBR含む)，sdb2:Cドライブ，sdb3:Dドライブ

sdd:HDD2(一時バックアップ先)
　sdc1:バックアップ領域

sdd:SSD(コピー先)
　sdd1::システム領域(MBR含む)，sdd2:Cドライブ，sdd3:Dドライブ

とする．

--
###手順1(吸い出し)
まずお立ち台に，HDD1とHDD2をドッキング

--
HDD2を適当にマウント(HDD1はマウントしなくてよい)

```
sudo mount /dev/sdd1 /mnt/disk0  #適当に
```

--
HDD1のパーティションの確認

```
sudo fdisk -d /dev/sdb
```

--
先頭のほうのセクタをddで吸い出す

```
sudo dd if=/dev/sdb of=/mnt/disk0/sdb.mbr bs=446 count=1  #bs=446がキモ．パーティション情報はコピーしていない．
```

--
sdb1(Cドラ)とsdb2(Dドラ)をntfscloneで吸い出す

```
#ntfsclone --save-image --output 出力先 出力元
sudo ntfsclone --save-image --output /mnt/disk0/sdb1.ntfsclone /dev/sdb1   
```

```
sudo ntfsclone --save-image --output /mnt/disk0/sdb2.ntfsclone /dev/sdb2 
```

###手順2(書き戻し)
お立ち台からHDD1(コピー元)を抜く

お立ち台にSSD(コピー先)を刺す(SSDはマウントしなくてよい)

接続したSSDは前述の通りsddと仮定

--
SSDのパーティションを作る

```
sudo fdisk /dev/sdd

sdd1，sdd2を作成
(以下略)　適宜アライメントしてください 
```

--
作ったパーティションをNTFSにフォーマット

```
sudo mkfs.ntfs -Q -v /dev/sdd1    #-Qはクイックフォーマット，-vは進捗と詳細を表示
sudo mkfs.ntfs -Q -v /dev/sdd2
```

--
先頭のほうのセクタをddでHDD2からSSDに書き戻す

```
sudo dd if=/mnt/disk0/sdb.mbr of=/dev/sdd
```

--
SSDにパーティションテーブルができたことを確認する

```
sudo fdisk -l /dev/sdd
```

--
sdb1とsdb2を書き戻す

```
#ntfsclone --restore-image --overwrite 出力先 出力元
sudo ntfsclone --restore-image --overwrite /dev/sdd1 /mnt/disk0/sdb1.ntfsclone  
sudo ntfsclone --restore-image --overwrite /dev/sdd2 /mnt/disk0/sdb2.ntfsclone
```


###手順3(最後に)
お立ち台からSSDとHDD2を取り外し，SSDをノートPCに換装
openFrameworks で glm を利用する

本記事では、openFrameworksでglmで利用するにあたっての気づきと注意をまとめます。現在の[リリース候補版 (0.10.0)](https://forum.openframeworks.cc/t/0-10-0-release-candidate-1/29296) でようやくglmのデフォルトの組み込みが実装されましたが、2016年の中頃にはすでに[githubのMaster branch](https://github.com/openframeworks/openFrameworks/tree/master)で利用されはじめ、リファレンスの中に[migration guide](http://openframeworks.cc/learning/02_graphics/how_to_use_glm/)も存在していました。

これまでも、oFにおいてglmを扱うための[addon](https://github.com/atduskgreg/ofxGLM)がありましたし、そもそも、外部依存のないC++ライブラリなので、インクルードは容易です。それでも、oFのコミッタ達がglmをコアに組み込む決断をしたということは色々な意味があるように思います。

glm自体の説明については、[こちら](https://qiita.com/usagi/items/f34976a3d3011506ff7d)が詳しいです。

##glm を使うモチベーション
**OpenGLにおける3DCGプログラミングを支援するため**に開発されているために、3DCGに関する便利な機能が多くあるほか、GLSLと記法が同じようになるためにプログラミングの際の心理的な障壁が少なくなります。
###GLSLと記法が同じようになる
根本の違いは、GLM・GLSL → 列ベクトル、oFのMathクラス群 → 行ベクトルを採用しているために掛ける順番が異なることです。

```C++
using namespace glm;

// glslっぽい書き方
vec3 vertex(1.0f); // 全要素1.0のベクトル
vec3 n = normalize(vertex); // 正規化
float len = length(vertex); // 長さ
vec4 pos = vec4(vertex, 1.f); // コンストラクタが柔軟
vec2 seed = pos.ga; //swizzle演算子が使える

// oFのMathライブラリは変換行列は後ろから掛ける。3次元ベクトルと4次元正方行列の掛け算ができる
ofVec3f v = ofVec3f(1.f,1.f,1.f) * ofMatrix4x4();

// glmは前から掛ける。4次元ベクトルにしないと4次元正方行列と積算できない
vec4 v = camera.getModelViewMatrix() * vec4(node.getPosition(), 1.f);
```
ただし、oFのMathライブラリで実現できていた、3次元ベクトルと4次元正方行列の積算ができなくなります。本来、数学的には間違っているのでより正しい仕様ですが、あると便利ではあったかもしれません。（頻繁に使ってました…）

###便利な記法がたくさんある
特に行列の座標変換系の関数が多く用意されています。一覧は[こちら](https://glm.g-truc.net/0.9.2/api/a00245.html)。

```C++
// 単位行列
glm::mat4 m(1.0f);

// 座標変換
glm::mat4 s = glm::scale(glm::vec3(1.f, 1.f, 2.f));
glm::mat4 r = glm::rotate(PI, glm::vec3(1.f, 0.f, 0.f));
glm::mat4 t = glm::translate(glm::vec3(100.f, 200.f, 0.f));
glm::mat4 transform = t * r * s;

// 透視投影変換行列
glm::mat4 projection = glm::perspective(fovy, width, height, near, far);

// 平行投影変換行列
projection = glm::ortho(left, right, top, bottom, near, far);

// 法線の変換行列
glm::mat4 normalMatrix = glm::inverse(glm::transpose(modelViewMatrix));
```
平行投影の行列が一発で出せたり、逆行列や転置行列も素直な感じに書けます。

##互換性
###glmのクラスからoFのクラスの作成
基本的に、oFが用意されるクラス群には、glmとの互換機能が実装されています。そのため、glmで計算した結果をoFのMathライブラリに渡して計算したりもできます。

```C++
// glmクラスのインスタンスを渡しての初期化ができる
ofVec3f v(glm::vec3(1.f));
ofMatrix4x4 mat(glm::mat3(1.f));

// 代入ができる
v = glm::vec3(1.f);
mat = glm::mat4(1.f);
```

###座標や行列のgetter系は全てglmのクラスで返却される

``ofNode::getPosition()``や``ofMesh::getVertex()``、``ofCamera::getModelViewMatrix()``といった座標や行列を得る関数群は、全て、glmの型で返却されるように0.10.0では変わっています。

基本的には上記の互換機能があるので、以外とコンパイルできてしまいますが、計算の順序や次元あわせの厳格さからくるコンパイルエラー等に注意が必要です。以下に例を示します。

```C++
// ノードの場所を取得して、x軸45度回転した座標を得たい

ofMatrix4x4 mat;
mat.glRotate(45, 1,0,0); // x軸に45度の回転行列
ofVec3f v = node.getPosition() * mat;

// 0.9.8ではコンパイルでき、計算もそれらしくおこなわれるが、0.10.0ではコンパイルできない
// node.getPosition()の返却値はglm::vec3型であり、ofMatrix4x4型との"*"演算子が定義されていない
// 後ろからかけるのマズイ。
```

これを以下のように書き換える必要があります。

```C++
using namespace glm;

mat4 mat = rotate(ofDegToRad(45), vec3(1.f, 0.f, 0.f));
vec3 v = (mat * vec4(node.getPosition(), 1.f)).xyz;
```
以上です。
SP Flash Tool

SP Flash Tool is an application that allows you flash firmware, custom recovery or features on Android Devices. <a href="https://spflashtooldownload.co">Download Flashtool</a> is a powerful tool for all Android devices. But you can use this tool when your phone USB driver is installed on your PC.<a href="https://spflashtooldownload.co">Flash Tool</a> is working with MediaTek Android smartphones You can Download Download Flashtool from our downloading section. Download Flashtool is an applications make bridge or connection between your <a href="https://en.wikipedia.org/wiki/Android_(operating_system)">Android</a> phone and PC and bu this connection, you can easily flash Android Stock ROM, Pre-Resources files like custom recovery, configure control and other features.By this option you can Format and Hard reset your devices, Load scatter file and connect your devices then simply click on format button.Know more for <a href="https://spflashtooldownload.co">Read More</a>
【教育】プログラミング必修化、子供たちにどう教える？

# まえがき
どうも、デブです。
2020年から小学校でのプログラミングが必修化されるようですね。
子供たちにどうやってプログラミングを教えていくのがいいのか僕も考えていきたいと思います。

# まずは何から始めるべき？

プログラミング必修化、具体的にどうしよう。。。

僕なら、まずはシンプルに
パソコンに<font color="red">**興味を持ってもらう**</font>
次に<font color="red">**考える力(論理的思考・発想力など)**</font>を強化していく

という事に注力していくのがいいかなと思います。

プログラミング必修化なのにプログラミングやらないの？
って思うかもしれませんが
プログラミングの大半は<font color="red">**考えること**</font>です。

# まずはパソコンに慣れよう。(１年生〜)

## 目的
パソコンに慣れてもらう、興味をもってもらう。

## 施策

- ゲームをやってみる
- 絵を書いてみる
- ネットで何かを調べてみる

なんでもいいのでまず自由にパソコンを使って遊ぶ。
退屈な授業の中で、自由に遊んでいいよという授業があるとしたら
僕なら嬉しいです。

その中で

- マウス操作とか
- フォルダ移動とか
- ファイル開くとか
- ファイルコピーとか移動とか

基本的な操作になれていけたらいいね

# 論理的思考を強化しよう(１年生〜)

## 目的
なんとなくやっている事を論理的に考えて手順化する力を強化しよう。

## 施策
例えば5人くらいで班を作って一列に並ばせる。

「それでは今から背の順に並び直してくださいー
　ただし一度に動いていいのは一人だけですよー」

![背の順.001.png](https://qiita-image-store.s3.amazonaws.com/0/57524/653250be-83d6-b82b-4efe-b61505d94f79.png)

![背の順.002.png](https://qiita-image-store.s3.amazonaws.com/0/57524/485fd4bd-8aa4-30d4-e379-f5f84f04d50e.png)

![背の順.003.png](https://qiita-image-store.s3.amazonaws.com/0/57524/3e2baa14-0ea0-b974-356c-32f4e7ef9282.png)

![背の順.004.png](https://qiita-image-store.s3.amazonaws.com/0/57524/ebe4b1da-46ab-0653-b7cb-e4565aaa25b4.png)

こんな感じで一度に動くのは一人だけっていうルールの中で
試行錯誤しながら背の順を作ってもらう。

これはいわゆる**ソートアルゴリズム**です。

最初から最適な方法じゃなくてもよくて、みんなでわいわいしながら
何を考えて、どう動けば背の順を作れるんだろう？
って考えることで論理的思考を強化する取り組み。

他にもいろんなアルゴリズムがあるので
それを日々の生活に結びつけて、実践しながら感覚を身につけられるといいね。


# タイピングを覚える(1年生〜)

## 目的
なんだかんだいってもタイピングはできないとね。
タイピングスキルを身につける。

## 施策
いろんなタイピングゲームがあるので、スコアを競ったりしながらタイピングを覚えていく。

1. とりあえず最初はアルファベットだけとか
2. ローマ字覚えたら日本語入力とか
3. 慣れてきたら数字や記号も含めるとか

その中で記号の読み方とかも学んでいけるといいね。

# コマンド操作を覚える

これは小学校でやる必要あるかな？と思いつつ
やれたらいいなって思うこと

## 目的
- ちょっとプログラマーっぽいぞっていう感覚を味わってみる
- パス(相対パス、絶対パスとか)という考え方を身につける

## 施策
コマンドラインでフォルダ移動したりフォルダの中身を見たりとか
普段やる基本的な操作をコマンドでやる

その仕組みとかはどうでもよくて
パソコンってこんな風に操作できるんだ〜とか
<font color="red">パス(相対パス、絶対パス)</font>という考え方を身につけたい。

大人であってもITにうとい人たちはこのパスというものがよくわかっていない人が多い。
正直子供でも理解できるような単純な話なので、子供のうちから感覚を身につけれるといいね。

# 0と1を使った脳トレーニング

## 目的
限られた環境の中で新しいものを生み出す力の強化。
ついでにパソコンの基礎部分をこっそりと植え付ける。

## 施策

いろんなものを 「0」と「１」で表現してみるゲーム

**ルール**

- ０と1しか使っちゃだめ、使い方は自由
- 自由にルールを決めていい

### <font color="#009F8C">「はい」と「いいえ」を表現するなら？</font>

- 1 なら 「はい」 って意味にする
- 0 なら 「いいえ」 って意味にする


<font color="red">**新しくルールを作れば**</font>
0と1で「はい」、「いいえ」を表現できるよってお手本を見せる。


こんな感じで
いろんなものを0と1で表現してみる。

- 「ON」、「OFF」とか
- 「男の子」、「女の子」とか

２パターンのものなら表現できるって感覚を身につける。

### <font color="#009F8C">「りんご」、「ばなな」、「ぶどう」の３つの果物を表現するには？</font>

慣れてきたら２パターン以上なら
どんなルールを作ればいいんだろうって事を考えさせてみる。


- 00 なら「りんご」
- 01 なら「ばなな」
- 10 なら「ぶどう」

とか

- 001 なら「りんご」
- 010 なら「ばなな」
- 100 なら「ぶどう」

<font color="red">**０と1をたくさん使えば**</font>もっといろいろ表現できる。


### <font color="#009F8C">「あ」っていう文字を表現するには？</font>


- 0なら「あ」っていうルールにしてもいいし
- 0と１を並べて「あ」っていう形を作るのもありだね


他にも

- 「色」を表現するには
- 「数字」を表現するには？
- オルゴールの楽譜を表現するには？

みたいにいろんな情報を0と1で表現してみる。
<font color="red">**新しいルールを決める事で新しいものを作る感覚、力**</font>を養っていけるといいね。


# まとめ

まだまだいろんなアイデアがありますが、今回はこんな感じで考えて見ました。
他にこんなのいいんじゃない？とかいろんな人のアイデアも聞いてみたいですね。
BPMCHAT 業務改善を本当に出来るかどうか

業務改善を本当に出来るかどうか

https://chat.bpmboxes.com/blog/

一番きつい問題で
出来なければ嘘つきになる。

QIITAで日々今の技術もみていかないといけない
　
システムが問題があれば、BPMSだからとなる。
　
１００％は無理だな。　
　
一年、二年、
業務というのは　日々話し合って改善されるもので。
　
システム化すれば改善されるものでなく。
　
それを元に日々改善をはなしあっていく。
　
RPA(ロボット）が。。。というものでない。
　
それを使うのは人間であるのだから。
　
１、BPMS
　　人が考える物（日々の業務）
２、RPA
　　自動化するもの
　　　＊）一定の作業
　
１，２を理解して　初めてPDCA(改善）を割り出す
　
ただ　その為には、自動でシステムが作れることが必要
Go言語におけるポインタのアンパサンド(&)とアスタリスク(*)の違い

## はじめに

最近業務でgo言語を触り始めそうな予感がしている今日この頃です。
それまでrubyやjavaしか触ってきておらず、ポインタを意識せずに人生を送ってきました。
なんとなくポインタに付いては理解できているのですが、`*`や`&`の使い分けが混乱しそうなので備忘録として書き留めておきます。

## アンパサンド(&)は変数toポインタを行う

アンパサンドは、変数からそのポインタを抽出するのに使用します。
ポインタなので出力結果に`&`が付いていることがわかります。

```go
type Hoge struct {
  x, y int
}

func main() {
	v := Hoge{1,2}
	p := &v
	fmt.Println(p)

	pp := &Hoge{3,4}
	fmt.Println(pp)
}
```
出力結果

```go
&{1 2}
&{3 4}
```

## アスタリスク(*)はポインタto変数を行う

アスタリスクはポインタが指し示す変数の実体を抽出します。

```go
func main() {
	p := &Hoge{1,2}
	v := *p
	fmt.Println(v)
}
```
出力結果

```go
{1 2}
```

## アスタリスク(*)はポインタ型の宣言をするときに使用する

&と役割が似ていて紛らわしいのですが、
**&は既に宣言されている変数のポインタを抽出する**のに対し、
**\*はポインタ型を示します。**  


```go
func main() {
	p := &Hoge{1,2}
	// ↑は var p *Hoge = &Hoge{1,2} を行っている

	v := Hoge{1,2}
	pp := &v

	fmt.Println(p, pp)
}
```

出力結果

```go
&{1 2} &{1 2}
```

なので、メソッドの引数に`*`が付与されている場合は、**ポインタ型の変数を引数として受け取る**ということを示しています。

```go
func change_func(h *Hoge) {
	h.x = 3
	h.y = 3
}

func main() {
	v := Hoge{1,2}
	change_func(&v)

	fmt.Println(v)
}
```

出力結果

```go
{3 3}
```

## ポインタを引数に渡す関数での使用例
```go
func change_func(i *int) {
	*i = 10
}

func main() {
	i := 1
	change_func(&i)

	fmt.Println(i)
}
```
出力結果

```go
10
```

↑の例ではint型のポインタをメソッドに渡し、
メソッド内で変数に変換し、値を代入することで、呼び出し元の変数の値も変更しています。

```go
func change_func(v *Hoge) {
	v.x = 3
	v.y = 4
}

func main() {
	v := Hoge{1,2}
	change_func(&v)

	fmt.Println(v)
}
```
出力結果

```go
{3,4}
```

↑の例ではHoge型のポインタをメソッドに渡し、呼び出し元の変数の値も変更しています。
structはメソッド側で`*`を付与しなくても、直接各フィールドに値を代入できます。
Slackに移行したハズなのにChatworkが恋しくて拡張を書いている

# Slackに移行
Chatworkとは4年の付き合いで [ダメなところがあっても直しながら](https://qiita.com/wamei/items/4ef34100c0b79f443e1f) 共に過ごしてきましたが、全社的なお達しでSlackへ移行することとなりました
Slack君はドジっ子なChatWorkちゃんと違ってとにかく応答速度、メッセージの同期速度が早い！
BOT連携もサクサクだし、デフォルトでいろんなサービスと連携出来るし、至れり尽くせりなのでした

### が！
しばらく使ってると何かが物足りない
Slackはちょっと冷たい、事務的な感じがする
俺にはやっぱりChatWorkが必要なんじゃないか
ChatWorkが恋しい！！

# というわけで拡張を書きました
UserScriptで書いたので[Tampermonkey](https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo?hl=ja)とか使うといいと思う

## mentionをChatWork風にハイライト表示する
物足りない一番の原因はやっぱこれ
ChatWorkちゃんは振り向いてほしくて必死にアピールするかわいいこ
https://wamei.github.io/slack-plugins/loaders/mention.user.js
![mention](https://user-images.githubusercontent.com/2811188/38767201-4ea94346-4018-11e8-8a3d-c57035311a2e.png)

## 打鍵中のステータスを表示させない
標準オプションのものとは違って他人に自分の打鍵中ステータスが表示されなくなる
ChatWorkちゃんはいざ振り向かれると恥ずかしくて顔も見れなくなっちゃうかわいいこ
https://wamei.github.io/slack-plugins/loaders/suspend-typing-status.user.js

## ChatWork風に返信する
音楽性の違い的なところがあるからSlackのスレッドとどっちが良いとかは言えないけど
範囲選択した部分を引用してメッセージ欄へどーん！は直感的でわかりやすい
ChatWorkちゃんはあんまり難しいことわかんないから！
https://wamei.github.io/slack-plugins/loaders/reply.user.js
![reply](https://user-images.githubusercontent.com/2811188/38855966-09474484-4260-11e8-9c0f-733446ae075b.PNG)

- 返信ボタン
mentionを挿入、範囲選択しながら押すと引用も挿入する

- 引用ボタン
メッセージの引用を挿入、範囲選択しながら押すと該当部分のみを引用する

## SlackのProxyを通して表示できない画像を直接インライン展開する
ChatWorkとは関係ないというかChatWorkにはついてない機能の画像のインライン展開ですが
社内アクセス限定の画像とか貼っちゃうと展開されなくてイライラするので改修
ChatWorkちゃんは出来ないことは人にお願いする（ためにグローバルにアプリケーションのオブジェクトを置きまくってる）んだ！
https://wamei.github.io/slack-plugins/loaders/inline-image.user.js
![inline-image](https://user-images.githubusercontent.com/2811188/38767762-7e2d0fee-4022-11e8-8693-2be3c1d38d36.png)
#### クリックすればきちんとモーダル表示
![modal-image](https://user-images.githubusercontent.com/2811188/38856326-13c046bc-4261-11e8-94bf-da6e54d5dff3.PNG)

## チャンネル内検索をやりやすくする
チャンネル内検索ボタン押すと「in:hogehoge」みたいなやつを自動で入力する
https://wamei.github.io/slack-plugins/loaders/search-in-channel.user.js
![search-in-channel](https://user-images.githubusercontent.com/2811188/39082895-7d1c03bc-4595-11e8-9a88-64a4777437b2.png)

## 全部入れたい人用
こっちなら機能が増えても安心
https://wamei.github.io/slack-plugins/loaders/plugins.user.js

# 君のことは忘れない・・・ありがとうChatWork
これからはSlackと共に歩んでいきます
でもChatWorkに比べてコードを読むのが難しいのでコアな部分を置き換えるような拡張を書くには時間がかかりそう
グループ管理とかルームアイコンとか取り入れたいChatWorkなところはまだまだたくさん！

### github
https://github.com/wamei/slack-plugins
SlackBotで電車の運行情報をスラッシュコマンドで通知してもらう

前回、[SlackBotで電車の運行情報を通知してもらう](https://qiita.com/yuina_i/items/014a5dd6f46eb4767a7e)にて実装したbotを改修していきます

# 概要
スラッシュコマンドを使用し、コマンドを打ったタイミングの運行情報を通知してもらう。

# 手順
## １.とりあえず実装

```JavaScript:TrainInfo.gs
var slackAccessToken = PropertiesService.getScriptProperties().getProperty('SlackAccessToken');

function doPost(e) {
  var slackApp = SlackApp.create(slackAccessToken);
  // 対象チャンネル
  var channelId = "#_info_train";
  var options = {
    // 投稿するユーザーの名前
    username: "TrainInfo",
    icon_emoji: "：train：",
  }
  
  //電車遅延情報をJSON形式で取得
  var json = JSON.parse(UrlFetchApp.fetch("https://rti-giken.jp/fhc/api/train_tetsudo/delay.json").getContentText());
 
  var name="名古屋本線";
  var company="名古屋鉄道";
  
  // 投稿するメッセージ
  var currentDate = new Date();
  var date = Utilities.formatDate( currentDate, 'Asia/Tokyo', 'M月d日 HH時mm分');
  var message = "◆電車遅延情報 (" + date + "現在)\n 電車遅延情報はありません。";
  
  for each(var obj in json){
 
    if(obj.name === name && obj.company === company){ 
      
      message ="<@U8U7H4KE0|yuina> \n ◆電車遅延情報 (" + date + "現在)\n" + company + name + "が遅延しています。\n詳細はこちら→ http://top.meitetsu.co.jp/em/";

    }
  }
  
  var res = {"text": message};
  return ContentService.createTextOutput(JSON.stringify(res)).setMimeType(ContentService.MimeType.JSON);
}
```

前回と同じソースをベースとして、トークン関連とreturnを変更しています。  
後はPOSTを受け取って処理するために関数を`doPost`に変更しています。

## ２.GASの公開設定

![スクリーンショット 2018-04-15 1.56.46.png](https://qiita-image-store.s3.amazonaws.com/0/92194/abe65223-aa4c-faf5-bbb2-f31f2e2f12c4.png)


公開→ウェブアプリケーションとして導入

![スクリーンショット 2018-04-15 1.58.30.png](https://qiita-image-store.s3.amazonaws.com/0/92194/2e4987fe-bd95-6b5a-d0ac-4da8ed33ff1b.png)

ウェブアプリケーションとして公開し、URLをコピーしておきます。  
この後のslackAppの設定で使います。


## ３.SlackAppの設定
前回作成したslackappでスラッシュコマンドを使用できるよう設定します。

![スクリーンショット 2018-04-15 1.26.19.png](https://qiita-image-store.s3.amazonaws.com/0/92194/7ab38b0f-8c6f-0073-3a70-bb1ca2087810.png)

Slash Commands から `Create New Command`をクリック。

![スクリーンショット 2018-04-15 1.39.56.png](https://qiita-image-store.s3.amazonaws.com/0/92194/2fa56faf-d89f-9c58-e1d5-46cad6402f60.png)


CommandとRequestURLを入力。
RequestURLは先程コピーしたURLを入力。

# 完成物

`/traininfo_now`を送信すると…

![スクリーンショット 2018-04-15 2.13.04.png](https://qiita-image-store.s3.amazonaws.com/0/92194/fa653224-f5fa-3a2d-1b0d-5bb51213100a.png)

という感じで出してくれるようになりました。
Azure Active Directory B2Cでマルチテナントサンプルを動かしてみた(3)

TL;DR
[Azure Active Directory B2Cでマルチテナントサンプルを動かしてみた(2) ](https://qiita.com/hydrangeas/items/81795113e255a3716e0b)続き。

少し罠に陥ったのでちゃんと修正する。

# 整理

`web.config`の設定項目の意味は次の通り。

| key | value |
|:-:|:-:|
|ida:ClientId|B2CのクライアントID|
|ida:Tenant|B2Cのドメイン|
|ida:RedirectUri|ローカルで動かすなら`https://localhost:44393/`とか|
|ida:PostLogoutRedirectUri|とりあえず`ida:RedirectUri`と同じでよい|
|aad:Tenant|サブスクリプション側のADドメイン|
|aad:ClientId|ADのクライアントID|
|aad:ClientSecret|ADのキー|

#### ida:ClientId
![image.png](https://qiita-image-store.s3.amazonaws.com/0/7886/ad206c54-7928-9d95-31b7-00fe5a7a502b.png)

#### ida:Tenant
![image.png](https://qiita-image-store.s3.amazonaws.com/0/7886/a536cd20-f357-c71c-f4f4-f1d560913519.png)

#### ida:RedirectUri/ida:PostLogoutRedirectUri
`https://localhost:44393/`にしておいた。
AAD/AAD B2C/プロジェクト側の起動設定も44393ポートにしておかないと、どこかでこける。

#### aad:Tenant
![image.png](https://qiita-image-store.s3.amazonaws.com/0/7886/42a8f0f6-b308-8019-53c1-d488f1ec59de.png)

#### aad:ClientId
![image.png](https://qiita-image-store.s3.amazonaws.com/0/7886/109424b8-088b-55df-84a3-9076457a2dd2.png)

#### aad:ClientSecret
![image.png](https://qiita-image-store.s3.amazonaws.com/0/7886/66c864ea-018c-7daa-637c-81bbdafefc2b.png)

# 変えちゃだめなとこ

`B2CMultiTenant.Utilities.Constants`は何があっても書き換えちゃだめ。
だめだよ！

ローカルDBで使ってるので、安易に書き換えると痛い目を見る。

# DBのデータソース

`web.config`の`Data Source=`の部分は、環境によって書き換える。

```xml
    <add name="DefaultConnection" connectionString="Data Source=(LocalDb)\ProjectsV13;AttachDbFileName=|DataDirectory|\DB2CMultiTenant.mdf;Initial Catalog=B2CMultiTenant;Integrated Security=SSPI;" providerName="System.Data.SqlClient"/>
```
私の環境では`MSSQLLocalDB`となっていた。
確認方法は、コマンドプロンプトで`sqllocaldb info`と打てばよい。
それすらダメならLocal DBが入っていないかも・・？

----

これで、デモと同じようにそれとなく動き始めた、はず。
ユーザー一覧とか動かないところについては別途検証する。
というか、デモでも動いてませんし。

以上。
npm install web3 がこける

Error: Error: Command failed: ./configure
でこけていたのだが
brew doctorでエラー見て、
alias brew="PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin brew"
でエイリアスを通してもまだエラーが出るので、
sudo xcode-select --resetしたら、fixできた。
developer's pathがおかしかったようだ。
ミニチュア・カー・キットとChromebook（JavaScript）でBLEのお勉強

# 概要
- ミニチュア・カー・キットとブラウザ（JavaScript）でBLEのお勉強した。
- Web Bluetooth APIのラッパーbluejellyを使ってデータをリードした。
- UUIDは真面目に仕様書読んで確認必要。
- Readするデータのバイト数、符号、エンディアンに注意。
- 手軽にデータ見れてハッピー。しかもChromebookで。

# 経緯
- シリラボのミニチュア・カー・キットってBLE評価基板＋αで遊んでた。以下参照。
[ミニチュア・カー・キットとラズパイでBLEのお勉強 - Qiita](https://qiita.com/iton/items/a0db46ebbe976494222a)
- クラゲのIoTテクノロジーって読んでて、bluejellyってのを知った。
[ハードウェアのプロが教えるWebエンジニアのためのIoT講座 | アナログ・デバイセズ](http://www.analog.com/jp/education/landing-pages/003/iot_lectureship/iot_lectureship_home.html?ADICID=AF_jp_p1645_other-IoT_lecture_4)
[クラゲのIoTテクノロジー](http://jellyware.jp/kurage/bluejelly/read.html)
- 試してみた。

# 用意したもの
- ミニチュア・カー・キット [Thunderboard React Derby ミニチュア・カー・キット|Silicon Labs](https://jp.silabs.com/products/development-tools/thunderboard/thunderboard-react-derby-car-kit)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/184221/fa22efd1-84d7-4daf-2b8a-e8676c54999b.png)

- Chromebook
- Chromeブラウザ
- bluejellyのコード一式 [GitHub - electricbaka/bluejelly: BlueJelly is a wrapper library that can handle WebBluetoothAPI easily !](https://github.com/electricbaka/bluejelly)

# 試したコード
## scan.html
普通に動いた。
![Screenshot 2018 04 15 at 00 33 01.png](https://qiita-image-store.s3.amazonaws.com/0/184221/5ef2e7e6-1164-433d-6e2b-8c7a3b7c161f.png)

## read.html
そのままじゃ動かない。
以下の修正したら動いた。
![Desktop screenshot  7 .png](https://qiita-image-store.s3.amazonaws.com/0/184221/a5f4a98c-8fbb-061e-ddbc-490378fcbf92.png)

# 変更点
## UUID
ここのUUIDを変更

```javascript
window.onload = function () {
  //UUIDの設定
  ble.setUUID("UUID1", "0000181a-0000-1000-8000-00805f9b34fb", "00002a6e-0000-1000-8000-00805f9b34fb");
}
```

ユーザーガイドを真面目に読んだ。ここ。
![Screenshot 2018-04-15 at 00.58.29.png](https://qiita-image-store.s3.amazonaws.com/0/184221/45a455e3-2abc-668e-f8de-27e5d85cadc7.png)
[ug164-thunderboard-react.pdf](https://www.silabs.com/documents/public/user-guides/ug164-thunderboard-react.pdf)

## 読み取りデータのフォーマット
普通に読み取ったら、変な値が帰ってきたので、確認したらEndianが違った。
もともとBig Endianだったので、Little Endianに変更。
ちゃんとバイト数、Signed/Unsigned, Endianに気をつける。

```javascript
ble.onRead = function (data, uuid){
  //フォーマットに従って値を取得
//  value = data.getUint16(0);//2Byteの場合のフォーマット
  value = data.getInt16(0, true);//2Byteの場合のフォーマット littleEndian

  //コンソールに値を表示
  console.log(value);

  //HTMLに値を表示
  document.getElementById('data_text').innerHTML = value/100.0;

  document.getElementById('uuid_name').innerHTML = uuid;
  document.getElementById('status').innerHTML = "read data"
}
```

引数はここを確認した。
[DataView.prototype.getInt16() - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/DataView/getInt16)
[ECMAScript® 2019 Language Specification](https://tc39.github.io/ecma262/#sec-dataview.prototype.getint16)

## まとめ
- 楽しかった。
- Service, CharacteristicのUUID両方使って理解が進んだ。
- バイナリデータからデコードするときの注意点がわかってきた。
- Chromebookだけで遊べるのでとても手軽。
とにかくLinuxの操作をはやくしたい

Linuxの操作が仕事の大半Linuxを占めてしまう方にとって、
「Linuxでの操作が早くできること≒仕事がはやくできること」だと思っています。

いままで知らなくても仕事できてたけど、「これ覚えたらもっと速く作業できてたじゃん！！」というものに絞ってまとめました。

## キーボード操作

#### Ctrl+R：コマンド履歴の検索
・Ctrl+Rを押した後、検索したいワードを入れると、前に出たコマンドが表示される。
・そのままEnterで実行できる。
・←→などカーソル移動して修正してEnter実行もできる。

#### Ctrl+A：行の先頭に移動
・コマンド入力中に、先頭に移動してワードを修正したいときに使える。
・後に出るCtrl+Kと組み合わせると入力したコマンドを速攻で消せる。

#### Ctrl+K：カーソルの位置から行末まで削除
・Ctrl+A入力後、Ctrl+Kで入力中のコマンド全て削除できる。（BackSpace連打からおさらば）

#### Ctrl+W：カーソル位置の単語を削除（カーソルの前部分）
・カーソル前部分の単語単位で削除。
・後に出るCtrl+Yとの組み合わせをmvコマンドあたりで結構使う。

#### Ctrl+Y：直前に削除した文字列を貼り付け
・直前に削除した文字列を貼り付ける。
・mvコマンド、tarコマンドを打ってるとき、「文字列、前後逆で書いてた！！」と最後気付いたときに、Ctrl+WとCtrl+Yの組み合わせで楽になります。

## Windows版Teraterm

#### Alt+v：teratermへコピーした文字列ペースト
・ペースト（マウス操作での右クリック）
・テキストで書いたものをCtrl+Cでコピーして、Alt＋Tabでteratermへウィンドウを切り替えて、Alt+vでペーストというのがよく使う。
小説家のためのVisual Studio Code 拡張機能を作成しました

Visual Studio Code で小説を執筆して[GitHubで公開している](https://github.com/8novels)8amjpです。

Visual Studio Code、いいですよねー。私は開発にも執筆にもこのエディタを愛用しております。
LinuxでもMacでもWindowsでも動作し、GitHubとの連携もスムーズで、万人にオススメしたい快適なエディタですよ。

ただ、元々プログラム開発のためのエディタなので、小説、特に日本語での小説の執筆に便利な機能は、標準では搭載されていません(そりゃそうだ)。
というわけで、執筆をもっと快適にする拡張機能、自分で作成してみました。

## FormatNovel
小説のルールに基づき文書を整形する、Visual Studio Codeの機能拡張です。
https://github.com/8amjp/vsce-formatnovel

### 使い方

`Format Novel` コマンドを実行すると、下記のルールに基づき文書をフォーマットします。

(1) 行頭に全角スペースを挿入します。
ただし、下記と一致する行を除きます。

* 鉤括弧(「、『)で始まる行
* Markdownの見出し記号(#)で始まる行
* 既に全角スペースが挿入されている行
* 空行

(2) 全角の感嘆符(！)、疑問符(？)のあとに全角スペースを挿入します。
ただし、下記と一致する場合を除きます。

* 直後が感嘆符(！)、疑問符(？)、鉤括弧(」、』)の場合
* 既に全角スペースが挿入されている場合

コマンドは、コマンドパレットを開いて(<kbd><kbd>Ctrl</kbd>+<kbd>Shift</kbd>+<kbd>P</kbd></kbd>)入力する他に、
エディタ内で右クリックして表示されるコンテクストメニューから実行することもできます。  
また、コマンドが有効になるのは、言語モードがMarkdown形式またはプレーンテキスト形式の場合のみです。

### 使用例
Before

>「ちょっとレヴィ！何やってんの！？」
>紅子が叫ぶ。

After

>「ちょっとレヴィ！　何やってんの！？」
>　紅子が叫ぶ。

全角スペースの挿入って、けっこう面倒だったりするんですけど、今後はコマンド一発で解決です。

## CharacterCount
文字数をリアルタイムでカウントする、Visual Studio Codeの拡張機能です。
https://github.com/8amjp/vsce-charactercount

### 使い方

下記の文字を除外した文字数をカウントし、ステータスバーに表示します。

* すべての空白文字(全角/半角スペース、改行、タブ)
* ルビ範囲指定記号(《》)とその中の文字
* ルビ開始記号(「|」、「｜」) 

マイクロソフトが公開している[サンプル](https://github.com/Microsoft/vscode-wordcount)をベースにして、改良を加えております。
また、文字数カウント機能が有効になるのは、Markdown形式またはプレーンテキスト形式のファイルを開いた時のみです。

### 使用例

>｜瀬尾絵子《せのおえこ》

ルビ開始記号とルビ文字が除外され、「4文字」とカウントされます。

## ConvertWidth
半角文字と全角文字を相互に変換する、Visual Studio Codeの機能拡張です。
https://github.com/8amjp/vsce-convertwidth

### 使い方

次の文字を相互に変換します。

* 半角英字(A-Z)、アンド(&)、カンマ(,)、ピリオド(.) <-> 全角英字(Ａ-Ｚ)、アンド(＆)、カンマ(，)、ピリオド(．)
* 半角数字(0-9) <-> 全角数字(０-９)
* 半角の感嘆符(!)、疑問符(?) <-> 全角の感嘆符(！)、疑問符(？)

## 拡張機能のインストール方法

Marketplaceで公開されています。
「拡張機能」サイドバーを表示し、'8amjp'などと検索してインストールしてください。

FormatNovel
https://marketplace.visualstudio.com/items?itemName=8amjp.formatnovel

CharacterCount
https://marketplace.visualstudio.com/items?itemName=8amjp.charactercount

ConvertWidth
https://marketplace.visualstudio.com/items?itemName=8amjp.convertwidth

いかがでしょうか？
あなたもVisual Studio Codeで、快適な執筆ライフを。
Laravelで処理速度とメモリ使用量をチェックするためのスニペット

# 計測用構文 

すでに同様の内容に関して、たくさんの記事が書かれていますが、自分の備忘録のために残しておきます。

``` performance.php
$startTime = microtime(true);
$initialMemory = memory_get_usage();

// 何かの処理

$runningTime =  microtime(true) - $startTime;
$usedMemory = (memory_get_peak_usage() - $initialMemory) / (1024 * 1024);

dump('running time: ' . $runningTime . ' [s]'); // or var_dump()
dump('used memory: ' . $usedMemory . ' [MB]'); // or var_dump()
```

この構文を計測対象のメソッド処理に書き足す。

# 注意事項
計測対象にデバッグ用の`dump`処理など、画面への出力処理を加えている場合は計測時にコメントアウトしておきましょう。ファイルのI/Oを計測対象としている場合は別の話ですが、`foreach`など純粋に処理時間のパフォーマンスを計測したい場合、計測対象に比べて入出力のコストが高いと上手く計測できているとは言えません。プロダクション用のコードまで削ぎ落とした状態で計測することをオススメします。