OmniAICreator/Qiita-1.07M huggingface dataset:
Juliaでフローサイトメトリーのファイル(fcs)を触ってみた

さわってみた系の記事です。
先日、偶然フローサイトメトリーのファイル(fcs)をさわる機会がありました。

これをJulia言語のFCSFilesというライブラリで開いてみようと思ったので一応記録。

## FCSFiles
Add FileIO.jl integration for FCS files
https://github.com/tlnagy/FCSFiles.jl

## フローサイトメトリーとは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/a01eec92-cdef-4008-f97c-5a5edb58788a.png)
https://en.wikipedia.org/wiki/Flow_cytometry#/media/File:Cytometer.svg

細胞のはいった液体を細く流して、個々の粒子を光学的に分析する測定手法だそうです。
レーザー光を当てて、

* FSC(Forward Scatter) 前方散乱
* SCC(Side Scatter) 側方散乱

やレーザー光によって生じた蛍光を検出する蛍光検出器がついているそうです。

[Wikipedia: フローサイトメトリー](https://ja.wikipedia.org/wiki/%E3%83%95%E3%83%AD%E3%83%BC%E3%82%B5%E3%82%A4%E3%83%88%E3%83%A1%E3%83%88%E3%83%AA%E3%83%BC)

## Juliaとは
コードをプリコンパイルすることによって、スクリプト言語でありながらC言語のような速度を実現するとされる新しい言語です。（ただし、作業中にプリコンパイルが入ってしまうことが多く、体感的にはそれほどの速さを感じません。）

## Flow Cytometry Standard (FCS) files 
[英語版Wikipedia](https://en.wikipedia.org/wiki/Flow_Cytometry_Standard)の説明をご覧ください。テキストではなくバイナリっぽいので、非エンジニア勢は自分でいじろうとせず、ライブラリを使った方が無難そうです。

## 使ってみる
Readmeのとおりです。
https://flowrepository.org/id/FR-FCM-ZZZ4
に、フローサイトメトリーのテスト用ファイルが置いてあるので適当にダウンロードします。

```sh
wget https://flowrepository.org/experiments/4/fcs_files/315/download
```

読み込み

```julia
using FileIO
flowrun = load("378103.fcs")
```

> FCSFiles.FlowSample{Float32}
>     Begin Time: 17:46:30
>     End Time: 17:47:10
>     Date: 26-JUN-2019
>     File: 378103.fcs
>     Axes:
>         Time
>         FSC-A
>         FSC-H
>         FSC-W
>         SSC-A
>         SSC-H
>         SSC-W
>         FITC-A (FITC-A)
>         PE-A
>         APC-A
>         PerCP-Cy5-5-A

グラフの作成はGadfly.jlを使用します

```julia
using Gadfly
plot(x=flowrun["FSC-A"], y=flowrun["SSC-A"], Geom.histogram2d,
Guide.xlabel("FSC-A"), Guide.ylabel("SSC-A"), Coord.cartesian(xmin=0, ymin=0))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/a746940a-bac3-28a2-c7fe-34af4bdf1cfa.png)

こう書けば

```julia
plot(x=flowrun["FSC-A"], y=flowrun["SSC-A"], Geom.density2d,
Guide.xlabel("FSC-A"), Guide.ylabel("SSC-A"), Coord.cartesian(xmin=0, ymin=0))
```
こうなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/e4af90b6-4a3f-87c0-cee6-8cc75d100840.png)

こう書けば

```julia
plot(x=flowrun["FSC-A"], y=flowrun["SSC-A"], Geom.histogram2d, Scale.x_asinh, Scale.y_asinh,
Guide.xlabel("FSC-A"), Guide.ylabel("SSC-A"), Coord.cartesian(xmin=0, ymin=0))
```
こうなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144608/1bb38b8f-fbcf-1a33-9c41-54a115caa186.png)

Julia言語は、Makieなど、面白い可視化ライブラリが多いですね。

なんというか、言葉で表現しづらいですが、Julia言語は地球上でもっとも才能のある若者が集まっていて、人々の活発な才気の燦めきを感じることができるような、そんな雰囲気があります。もちろんそれは傲慢であり幻想かもしれないのですが。そういう意味で面白い言語だな〜と思いました。
CPLEX Optimization Studio文字化けの回避

Windows 10 でCPLEXを使用してみたが、`nl`オプションで言語を英語に変更しても、
エラーメッセージが文字化けする。

```
IBM ILOG CPLEX Optimization Studio
Version: 12.9.0.0
Build id: Community Edition
```

`Xlocale`オプションを追加することで回避できた。

```
oplide.exe -nl en -Xlocale .932
```

#参考資料

- https://www-01.ibm.com/support/docview.wss?uid=swg21573032
- https://www.ibm.com/developerworks/community/forums/html/topic?id=5dc8d484-da67-4a24-83c4-65edb691138e
Laravelで暗号化したログをコマンドで復号してみた

##暗号化
フォームの入力値を暗号化してログに出力している。

```php
use Log;

$params = フォームで入力された値
$encryptParams = encrypt($params);
Log::info($encryptParams);
```

Logでてくるか処理を流して確かめてみる。
storage/logs/laravel-××××-××-××.log
（Laravelデフォルトだとログファイル名が違う。詳しくは下記のおまけ見てください。）

```php
[2019-08-01 17:29:52] local.INFO: eyJpdiI6InFGbkpudVRpVjlMUjlhbnRFdTRRRGc9PSIs・・・　以下省略  
```

##コマンドクラス作成

```
php artisan make:command decryptCommand
```

app/Console/Commands/decryptCommand.phpが生成される。

```php
protected $signature = 'Log:decrypt';//artisanコマンド名
protected $description = 'ログの復号コマンド';//コマンドの説明
public function __construct()
    {
        parent::__construct();
    }
public function handle()
    {
        $params = $this->ask('Please enter a log command');//コマンド実行時の問いかけをask（）に書く
        $decryptParams = decrypt($params);//入力値を復号処理
        print_r($decryptParams);//ターミナル画面に復号したデータを出力
    }
```

##artisanコマンドを追加登録

app/Console/kernel.php

```php
protected $commands = [
        decryptCommand::class,
    ];
```
追加したらコマンド一覧に「Log:decrypt」が追加されていることを確認する

```
php artisan 
```



####複合方法

```
php artisan Log:decrypt
```

すると

```
 Please enter a log command:
 > eyJpdiI6InFGbkpudVRpVjlMUjlhbnRFdTRRRGc9PSIs・・・　以下省略
```

Please enter a log command: と言われるのでログに吐かれてる暗号化コードをコピペ

複合される。


##おまけ

####ログファイルを保存する日数を変更する

ログファイル出力設定のデフォルトは以下のようになっている

```php

    'channels' => [
        'stack' => [
            'driver' => 'stack',
            'channels' => ['daily'],
            'ignore_exceptions' => false,
        ],

        'single' => [
            'driver' => 'single',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
        ],

        'daily' => [
            'driver' => 'daily',
            'path' => storage_path('logs/laravel.log'),
            'level' => 'debug',
            'days' => 14,//保存する日数
        ],
　　　　　以下省略

```

'daily' の 'days' を変更すればOK
node.jsのバージョンを変えた時にionic: command not foundになった時の対処法

##なんでnode.jsのバージョン変えたか
今までnode v8.12.0を使っていたんですが最近Angularとionicのアップグレードに伴って使ってたバージョンが使えなくなったんですよねー。
それで安定版のv 10.16.0にnvmを使って更新したんですけど既存のionicプロジェクトに着手しようとしたらここで背筋がヒヤッとする問題が！！！

##-bash: ionic: command not found
エッ
ナンデ
ionicプロジェクトなのにionicコマンドなくなってもうた…
まぁ真っ先にnode.jsのあれだろうなと思いましたんでググりましたさ

##解決方法
[参考サイト](https://github.com/ionic-team/ionic-cli/issues/3445)
色々調べてたらここにたどり着きましてターミナルで下記のコマンド叩いたら一発でした


```
$ npm uninstall -g ionic
$ npm install -g ionic
```

めっちゃ単純ww
消して入れるだけでした。
ionic: command not foundに陥ったら試してみてください
【Sinatra】立ち上げ手順

Railsを勉強していますが、自動でやってくれることが多すぎて違和感があるので、Sinatraを勉強してみます！

#立ち上げ手順
Sinatraの立ち上げ手順を示していきます。
HelloWorldを表示するところまでやっていきます。

まずは一緒に立ち上げてみましょう！

※参考
http://sinatrarb.com/intro-ja.html(日本語)
日本語版は少し古い可能性がらるようです。
http://sinatrarb.com/intro.html(英語)
せっかくなので、英語の勉強がてら、私は英語版を見て挑戦してみます。

https://qiita.com/kimioka0/items/751e460cbb59c70379c6
https://qiita.com/k-ta-yamada/items/9e35c5f8b31862267e01

Sinatraのチュートリアルに忠実に実施していきます。

#フォルダとファイルの作成

適当な名前のフォルダを作成します。
フォルダを作成したら、myapp.rbというルビーのファイルを作成しましょう。

```myapp.rb
# myapp.rb
require 'sinatra'

get '/' do
  'Hello world!'
end
```

require 'sinatra'でルーティングを呼び出しているのでしょうか。。
get '/' doで基本ページの呼び出しが出来るっぽいです。
(憶測にすぎません。)

myapp.rbの中身のコードはこんな感じです。

```
$ gem install sinatra
```

を実行してください。

```
Fetching: mustermann-1.0.3.gem (100%)
Successfully installed mustermann-1.0.3
Fetching: rack-protection-2.0.5.gem (100%)
Successfully installed rack-protection-2.0.5
Fetching: sinatra-2.0.5.gem (100%)
Successfully installed sinatra-2.0.5
Parsing documentation for mustermann-1.0.3
Installing ri documentation for mustermann-1.0.3
Parsing documentation for rack-protection-2.0.5
Installing ri documentation for rack-protection-2.0.5
Parsing documentation for sinatra-2.0.5
Installing ri documentation for sinatra-2.0.5
Done installing documentation for mustermann, rack-protection, sinatra after 268 seconds
3 gems installed
```

gemファイルが3つインストールされています。

http://localhost:4567

に接続すると、HelloWorldが出てますね！

It is recommended to also run gem install thin, which Sinatra will pick up if available.

```
gem install thin
```
を実行した方が良いと書かれてます。
thinとはWebサーバのことっぽいですね。早くてお手軽のようです。

```
Fetching: daemons-1.3.1.gem (100%)
Successfully installed daemons-1.3.1
Fetching: eventmachine-1.2.7-x64-mingw32.gem (100%)
Successfully installed eventmachine-1.2.7-x64-mingw32
Fetching: thin-1.7.2.gem (100%)
Temporarily enhancing PATH for MSYS/MINGW...
Building native extensions. This could take a while...
Successfully installed thin-1.7.2
Parsing documentation for daemons-1.3.1
Installing ri documentation for daemons-1.3.1
Parsing documentation for eventmachine-1.2.7-x64-mingw32
Installing ri documentation for eventmachine-1.2.7-x64-mingw32
Parsing documentation for thin-1.7.2
Installing ri documentation for thin-1.7.2
Done installing documentation for daemons, eventmachine, thin after 11 seconds
3 gems installed
```
インストール出来ました！

#まとめ
HelloWorldを表示させるだけっだたので簡単でしたね。
次回はルーティングを見ていきます！
wgetやyumがタイムアウトするときに確認すること

検証時などに余計な時間をつかわないように自戒をこめて備忘録を。。

原因がわかったら大体即座に解決できる前提で対処法はあんまり書いてないです。
正しい設定するとか間違った設定をやめるとか原因がわかればできるのでは。

前にも似たのを書いたような気はするけどまあそれはそれ。
https://blog.isao.co.jp/backend_server_setting/


パブリックIPがない、NATで通信できる範囲にいない

→クラウドによって違うけど
　パブリックIPがついてない、パブリックなセグメントに居ないがNATの設定ができてない通信できないとこにいる
　などを疑ってコンソール確認する

名前解決ができない、

dig yahoo.co.jp
cat /etc/resolv.conf
cat /etc/hosts
cat /etc/nsswitch.conf

経路がない、GWやルーティングが間違っている、VPNなどの設定の問題や経路障害

netstat -rn
ping gw-ipaddress
ping yahoo.co.jp

なにかで遮断されている、フィルタリング設定がただしくない

→ネットワークアクセスコントロールリストやセキュリティグループなど外側からみる。
送信元や宛先のアドレスやポートに間違いがないかなど。
そのあとサーバ毎のSELinux、Firewalld、Apparmor、iptablesなどをみる
そもそもポートがListenしているのかみる
ApacheやNginxならIP制限など認証設定の部分を確認する

iptables -L
iptables -t nat -n -L
getenforce
netstat -lnpt
docker inspect conteiner-id


経由しているプロキシがまちがっている
Nginx、Haproxy、Squidなどの場合はその設定をみる。

パッケージ入れる際ならyum.confなどを確認（excludeで依存関係がアレだったこともあった）
Ansibleの場合yumモジュールのlock_timeoutの設定秒数を増やすことで解決する
（デフォが2.8からなぜか0秒で）

あとwgetやyumと何の関係もなくて内部からの通信でもないですがピンポイントな珍しいエンカウントとしては以下のようなのも。

- fluentdの構成をLB介すようにしたらロードバランサのキューが頭打ちで握りつぶされていた

- TCPのrecycle設定などをウッカリ有効にしていて同じIPから同時にきたwifi経由モバイル通信などが片方遮断されてる

- アクセスする先のDBスキーマとアカウントがリセットされてた（つくりなおしで解決）またはサービスが無限ループで起動してないなど前提から疑う必要がある場合も。なにかポートListenしてるサービスならnetstatなどでわかる。

- WindowsFireWall
これが原因でwin上のapacheのログの切り回しがうまくいかなかったとか聞いたので追記。WindowsだとVirusチェックソフトとかFW制限とかよくありそうかな。

個人的に最短ルートかなと思うのは、
わかる人に聞く、ログなどに出力されたエラーメッセージから状況判断か固有情報を除いたエラーメッセージでググる。前もって設定しておいた監視モニタで状況確認、状況を的確に表すキーワードやマニュアルがヒットしそうなマニアックなワードで気軽な気持ちで軽率にググる。

ちょっと長いルートで、その作業が繰り返しであるなら二度とやらかしようがないオートメーション組んでおく。（学習コストと対効果がどうかはものによるけど）

以上
さっさとHDDを初期化

個人的なメモです。

# 前提

* 内蔵HDDを初期化したい
* 廃棄または再利用するので0埋めしたい
    * 今回はランダム書き込みまでは求めない
* HDDは接続した

# 手順

## 1. OSを準備

* mfsBSD
    * UNIX系の軽量OS
    * 12.0-RELEASE-amd64 (67MB)
    * https://mfsbsd.vx.sk/
* ISOイメージからメディアを作成
    * CD、フラッシュメモリなどお好みで
 
## 2. mfsBSDを起動

* 作成したメディアを使用してmfsBSDを起動
* ログイン
    * ID: root
    * PWD: mfsroot

## 3. デバイス名を確認

```
root@mfsbsd:~ # gpart show
```

## 4. SMART情報を確認

必要に応じてHDDの状態を見ておく。

```
root@mfsbsd:~ # smartctl -a /dev/DEVICE
```

CUI上に結果がダーッっと出てくるので、取り急ぎ見たい情報だけ。
例えば、通電の積算時間だけ見たいとき。

```
root@mfsbsd:~ # smartctl -a /dev/DEVICE | grep Power_On_Hours
```

## 5. 初期化

```
root@mfsbsd:~ # dd if=/dev/zero of=/dev/DEVICE bs=256M status=progress
```

* ブロックサイズ（``bs``）を適切に指定すると、より高速に書き込み可能。
    * デフォルトは512B
    * 最近のHDDだと512Bでは良いパフォーマンスが出ない
    * 32MB～512MBあたりを試すとよいかも
* ``status=progress``で進捗状況を表示（安心感。。）
    * GNU coreutils 8.24 で追加された``dd``オプションとのこと

## 6. 終了

```
root@mfsbsd:~ # shutdown -h now
```

初期化済みのHDDを取り外したらシールを貼っておくなどして、
すぐに見分けがつくようにしておいたらよいかも。
Docker Hubにあるイメージのバージョンタグの一覧をみる

Dockerfileを書いているときなどに、バージョンタグって何があるか知りたいことありませんか？
僕はよくあります。

Docker Hubのページを開けばtagのタブで確認出来ますが、ページをめくっていかなければならず探しにくいです。

ではどうするかというと、Docker Hubにはjson返してくれるapiがあるので、それを叩けば簡単に一覧化できるという寸法です。

## 例 rubyの場合 

```bash
$ curl -s https://registry.hub.docker.com/v1/repositories/ruby/tags  | jq .[].name

"latest"
"1"
"1-onbuild"
"1-slim"
"1-wheezy"
<略>
```

※ curlやjqコマンドがない場合は、brewなりaptなりでインストールしておいてください。

## まとめ(?)
シェル芸できる人はこれを応用してガシガシ使っていけると思います。
docker上でjenkinsを動かすのに、proxyにハマったのでメモ

# はじめに
dockerは使ったことが無く、今回が初めて。
proxy配下でdocker動かす際に、dockerとコンテナのproxy設定にハマり、最後はproxyの名前解決にハマったのでメモ。

# ゴール目標
- Linux上にdockerをインストールする
- docker上でjenkinsが動く

# 環境
- ubuntu
- 会社内での使用なので、proxy配下

# やったこと
## Linuxにdockerをインストールする

まずはdockerのインストール
この説明は省略


## docker使ってjenkinsを起動

dockerからjenkinsを起動してみる。

```shell
docker run -p 8080:8080 jenkins
```

しかし、Proxy配下のため、インターネット環境に接続できず、jenkinsをダウンロード出来ない。。。

### proxyを越える

linuxにインストール済みのfirefoxとかで、proxyを超えてインターネットアクセス出来ていたとしても、別途dockerの設定でproxyを指定してあげないとダメらしい。

その設定はここ（あれ、なんだっけ？後で記載）

```shell

```

再度、以下を実行。

```shell
docker run -p 8080:8080 jenkins
```

無事、jenkinsのダウンロードが開始しました。
他のPCから、このlinuxのIPアドレス:8080にアクセスすると、jenkinsのいつもの画面が見れました。
早速、jenkinsを使おうとして、jenkinsの初期設定でまたproxyの問題が。。。
どうやら、コンテナのproxy設定が必要らしい・・・

### コンテナ側のproxy
コンテナのproxyを指定してやってみても繋がらない。
proxyの名前解決ができてないようだ。


### コンテナ側のdns
名前解決のためにDNSとか調べようと試みたが分からず。
とりあえず、以下を入力して、proxyのIPアドレスを調べた。

```
lookup proxy名
```

このIPアドレスでコンテナのproxy設定をしてみた。
すると、無事にproxyを越えることが出来た。
が、DNSの解決方法は分からないまま・・・
【Rails】POROにバリデーションを追加する（ActiveModel::Model使用編）

# 環境

- Rails 5.2.3

# やりたいこと

`ActiveRecord::Base`を継承していないPORO（Plain Old Ruby Object）に、バリデーションを追加したい。

# 前提

- `ActiveModel::Model`を利用する（他にもやり方は色々ある）。

# バリデーションのトリガー

- `valid?`メソッドを実行するとバリデーションが実行される。戻り値は`boolean`。
- `invalid?`メソッドでは戻り値が`valid?`とは逆になる。

# コード例

```ruby
class Charge
  include ActiveModel::Model

  attr_accessor :amount

  MINIMUM_AMOUNT = 100
  validates :amount, numericality: { greater_than_or_equal_to: MINIMUM_AMOUNT }

  def initialize(amount:)
    @amount = amount
  end
end
```

# 実行例

```ruby
> c = Charge.new(amount: 99)
> c.valid?
=> false
> c.errors.messages
=> {
    :amount => [
        [0] "translation missing: ja.activemodel.errors.models.charge_payment.attributes.amount.greater_than_or_equal_to"
    ]
```

翻訳エラーは別途要対応。
[ここらへん](https://qiita.com/moperon/items/da8cd6e674dba2552c42)が参考になるはず。
話題のMonacaでネイティブアプリつくってみた！

Monacaというモバイルアプリ開発環境をご存知ですか？

Webアプリあがりのエンジニアの方は気持ちが分かるかもしれませんが、

- ネイティブアプリってなんかハードル高いな〜
- AndroidStudioとXcode使ってjavaもObjective-CもSwiftもだし勉強することが多いな…
- AndroidはkeystoreとかiOSはプロビジョニングとか色々よく分からない

という方は実際のところ多いのではないでしょうか？

かくいう私もそんな一人でした。
そんな時に見つけたのがこれ

「Monaca」
https://ja.monaca.io/

HTML5とJavaScriptメインでモバイルアプリ開発が簡単にできちゃうのです。

実際に使ってみてこんなにオススメかなと思います。

- Webサービスを仕事や趣味でずっと作ってきたけどアプリ開発はしたことない
- iOS/Android特有のPlatform側のリリースの手順を知りたい
- アプリをStoreに出してみたい
- iOS/Androidのそれぞれの開発コストを下げたいのでワンコードで実装したい

そして、作ってみたのがこちら

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452135/19ceb6ec-be39-5dff-b344-47f0d8c7e977.jpeg" width=80px>

https://play.google.com/store/apps/details?id=com.aaa.feeling&hl=ja

合コンや相席屋でぜひ使って盛り上げてください。
使い方・盛り上げ方は要望があれば別途記事にまとめたいと思います。

トータルコストは２人で１日程度。
Storeの申請周りなどの勉強にもなるので興味のある方はぜひ使ってみてください。


ブログも書いてますのでご覧ください。
https://www.wow-creators.com/2019/04/26/monacaでネイティブアプリつくってみた！/
PowerShellでログファイルの圧縮+ローテート

IISとかのログをただローテートするだけだと結構な容量を食うので、ZIP圧縮した上でローテートする。
バッチでやるとzipコマンドのライブラリを入れなければいけないので、やはりPowerShell。


```ログ圧縮ローテート.ps1
#ログのパス
$Path = "D:\Logs\IIS\W3SVC1"

#zip圧縮する閾値(日)
$zipCompressTerm = 5

#zipを削除する閾値(日)
$zipDeleteTerm = 180

#zip圧縮対象のログを取得
$Items = Get-ChildItem -Path $Path | ?{$_.LastWriteTime -le (Get-Date).AddDays(-$zipCompressTerm) -and $_.Name -like "*.log"}

#対象のアイテムをZIP圧縮
$Items | %{Compress-Archive -Path $_.FullName -DestinationPath "$($Path)\$($_.Name).zip"}

#ログを削除
$Items | Remove-Item

#zip削除対象を削除
Get-ChildItem -Path $Path | ?{$_.LastWriteTime -le (Get-Date).AddDays(-$zipDeleteTerm) -and $_.Name -like "*.zip"} | Remove-Item
```
MVCを考える

ポートフォリオを作成するにあたってまずMVCを考えました。

しかし、MVCって何？
という状態だったので自分なりに調べたのでメモ。

# MVC とは
プログラミングにおける **設計概念**。
以下の頭文字を取ったもの。

- **M** odel
- **V** iew
- **C** ontroller

この設計概念を正しく使うことができれば、システムの開発・運用コストを減らすことができます

## Model
アプリケーションの状態を表す&ビジネスロジック部分

- どのような順番で処理するのか。
- どこからどのようなデータを取得するか。
- データをどのように処理するか。
- 正常処理の条件はどうするか。
- 正常処理したあとはどうするか。
- エラーの条件はどうするか。
- エラーになったときはどうするか。

## View
- Modelの状態を参照し視覚表現するもの
- ユーザーに見える画面部分
- 入出力等、ユーザーと直接やり取りする

## controller
- Viewから受け取った入力情報をModelへ通知
- レスポンスとして処理後の画面をViewに返す
- ユーザーの処理に基づいてモデルをコントロールする

## 図解

![Untitled Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/475077/3932e5bc-f68e-d2a6-db0f-a6c785e9609c.png)

## 後書き
色々参考にしつつ整理しました。
[@gcyata](https://qiita.com/gcyata/items/772b6989f4cdab0bd047)
[MVCの勘違について、もう一度考えてみる](http://at-grandpa.hatenablog.jp/entry/2013/11/01/072636)
[MVCモデルとは](https://developer.nature-engineer.com/entry/2018/10/20/145837)
お気づき、ご指摘がありましたら
とても助かります。
よろしくお願いします。
MacでVisual Studio CodeのEnable zenkakuをデフォルトでONにする。

## Enable zenkakuが保存されない問題

全角スペースをハイライトしてくれるzenkakuですが、Enable zenkakuだけではVisual Studio Codeを閉じるとオフになってしまうのでデフォルトでONになるよう弄ります。

## zenkakuのextension.jsを開く。

### ◆finderから開く場合

ホームディレクトリから次のように辿ります。
※**「Command + Shift + .」**で隠しフォルダを表示できます。

<img width="820" alt="enablezenkaku.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421175/58208825-4880-1cb2-a26c-be4ae6d55748.png">

### ◆ターミナルから直接開く場合

次のコマンドをたたけばOKです。

```
vim ~/.vscode/extensions/mosapride.zenkaku-0.0.3/extension.js
```

## 上から5行目のvar enabledをtrueにする。

<img width="363" alt="enablezenkaku2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421175/97c32a9e-43c3-2971-0598-bb4d16f6ef08.png">

デフォルトでは5行目のvar enabledがfalseになっているのでtrueに変更すれば完了です。


## 参考URL

windows版の方法です。

https://blgid1974.blog.fc2.com/blog-entry-1154.html
https://www.off-soft.net/ja/software/develop2/japanese-problem-with-visual-studio-code.html
docker-compose.ymlのcommandフィールドにserviceコマンドは使えない

# exit code 0...
毎度毎度あーでもないこーでもないと書いてみて、オラッとupした時にこれが出ると本当に頭が飛び散っていきそうな気持ちになります。これはそんな最近ハマったexit code 0の状態をどう突破したかの話です。

## commandのフィールドの特性
commandフィールドは、文字通り、コマンドを設定してあげると、docker-compose upした際にコンテナをイメージから立ち上げてくれる時に記述されたコマンドを自動的に実行してくれるものですが、コマンドを指定する、とだけで覚えてしまうと、どんなコマンドでも自動的に実行してくれそうな気がしてしまいます。
確かに記述したコマンドは全て実行してくれるのですが、コマンドを実行し終わった後、コンテナを終了させてしまうという隠れ機能があります。故に、dockerが実行処理のプロセスをhookできるようなコマンドを指定してあげないと、コマンドの実行終了時に同時にコンテナまで終了してしまうので、いつまでたってもupできない状態が続きます。

## 具体的にdockerはコマンドのどの部分を使って処理しているのか
　簡単にいうと、docker は実行したコマンドのプロセスidを見ています。そして、コマンドを使うのと、バイナリファイル（bin等）を直接打つのとでは生み出されるプロセスidが異なるのです。
　つまり、

```
$ sudo service httpd start
```

とした場合httpdのプロセスは一切見ておらず、`service`のプロセスを見ています。
　何故このような事が起こるのかというと、serviceコマンドを打った時と打たない時の違いは、コマンドの定義として、コマンドサーチパスを使用しているかしていないかの違いが存在します。今回のserviceコマンドを含め、多くのコマンドは実行ファイルに紐づいたパスを叩きに行くものが存在します。（他にもシェルに内包されたビルトイン型のコマンドやエイリアスで設定されたコマンドなどもありますが今回は関係ないのでこの２つの説明は省略します。）
　コマンドサーチパスを使用するserviceコマンドを未使用の場合、`/usr/sbin/httpd`の実行ファイルのあるパスを直に叩きますが、

```
$ sudo service httpd start
```

を実行すると一旦、serviceコマンドのバイナリファイルに渡される形になっています。dockerは、serviceで叩かれたコマンドのプロセスid(以下pid)を検知するので、バックグラウンドの場合実処理のpidはserviceのパスを叩いた処理であるため、docker側で実際のバイナリファイルを実行したpidを検知できないということになります。

例えば、下記のようなcommandフィールドは一見、httpdを起動させたコンテナを立ててくれそうですが、exit code 0を出してしまいます。serviceコマンド自体のプロセスidをhookしてしまうからです。

```docker-compose.yml
web:
  build: .
    command: service httpd restart
    environment:
      BUNDLE_APP_CONFIG: /web/.bundle
    volumes:
      - .:/app-space/
    ports:
      - "3000:3000"
    depends_on:
      - db
```

正解は下記の第一のプロセスでバイナリファイルが実行されると認識できるコマンドを使う必要があります。

```docker-compose.yml
web:
  build: .
    command: ["/bin/sh", "-c", "yarn install && cd product_name && bundle exec rails s -p 3000 -b '0.0.0.0'"]
    environment:
      BUNDLE_APP_CONFIG: /web/.bundle
    volumes:
      - .:/app-space/
    ports:
      - "3000:3000"
    depends_on:
      - db
```
[Next 2019聴講メモ] GKEによるコンテナセキュリティの道

※※2019 / 08 / 14 追記 YouTubeに投稿されたセッションのリンクを追加しました。※※

# GKEによるコンテナセキュリティの道
- Ian Lewis
  - Google
  - Developer advocate
- [YouTube](https://www.youtube.com/watch?v=4nex4BS313M)

-----
## アプリ運用今昔

### コンテナを導入する前
- 特定のサーバーにデプロイ
- 言語別のパッケージング
- ファイルコピーしてアプリを再起動
- ほとんどが手動
- セキュリティ
  - ファイアウォールで守っていたとしても、超えられたら基本的には丸見え状態

### コンテナの構成
- どのサーバーにどのコンテナをデプロイするかk8sに任せる感じ
  - 仮に1コンテナを攻撃されても他のコンテナに移られにくい

### コンテナ導入のメリット
- コンテナの中身関係なくリリース方法が一緒
- ステップが少ないので自動運用しやすい

### コンテナ導入によるセキュリティの課題
- k8sへのアクセス権限の管理
- ファイアウォール
- セキュリティの新しい可能性
  - 統一したモニタリング
  - イメージスキャン
  - イメージ署名
  - サービスメッシュ

### Googleのインフラセキュリティ
- 責任共有モデルに示されるように、各サービスに責任分界点がある
  - サーバー自体は物理的に防いだり、一部の社員しかデータセンターに入れないようになっている
  - ユーザーのアカウントは、原則Google社員でもさわれないようになっている(ユーザー側の許可が必要)

## アプリのライフサイクルをセキュアに
- コンテナイメージの変更
- 脆弱性の有無
- 運用中のアプリが不正侵入されていないか
- 正しい権限のユーザー、不正アクセスの有無
​

### CI/CD・ビルド
#### Google Container Registry
- Dockerコンテナイメージを保存・管理・保護する
- 安全なプライベートリポジトリである

### デプロイ
#### Binary Authorization
- 信頼できるコンテナのみをGKEにデプロイ
  - コンテナのリリース業務標準化
  - 予防的なセキュリティ対策
  - 脆弱性があるものについてはそもそもデプロイできないようにする
  - Docker Hubのイメージも使えないようにすることができる

### アプリ運用
#### [GKE Sandbox](https://cloud.google.com/kubernetes-engine/sandbox/?hl=ja)
- GKEコンテナのセキュリティをさらに強化
  - 徹底した防御をPodに追加
  - 徹底した防御を簡単に導入
  - 潜在的な攻撃を限定する
- [gVisor](https://gvisor.dev/)
  - OSSツール

#### [Anthos](https://cloud.google.com/anthos/?hl=ja)
- アプリの最新化(モダナイゼーション)
- ポリシーとセキュリティを大規模に自動化する
- 一貫性のある体験
  - オンプレでもクラウドでも環境に整合性を持たせることができる
- サービスメッシュ
  - アプリとアプリの間にプロキシを立てて、どこからのアクセスなのかをはっきりさせる
  - [Istio](https://istio.io/)
         - サービス認証・ポリシー
         - モニタリング
         - トラフィックの制御
         - プロキシとプロキシの間のネットワークは暗号化されて、アプリ間の通信が安全になる

#### Event Threat Detection
- GCP環境に存在するセキュリティの脅威を検出
  - クラウドベースの脅威を迅速に検出
  - 業界トップの脅威インテリジェンスを搭載
​

### ユーザー・アクセス管理

#### Cloud IAM
- ユーザーが何をできるかを細かく指定できる
  - 企業のID管理を簡素化
  - 適切な役割
  - きめ細かいリソース制御

#### Cloud Security Command Center
- GCP用の包括的なセキュリティ管理とデータリスクプラットフォーム
  - クラウドデータやサービスの可視化と制御により脅威を防止

## 個人的ToDo
- Envoy
- gVisor
- Istio
Highchartsのグラフで透過をさせる話

# Highcharts でグラフの透過をしたい。
日本語の記事が全然見つからなかったのでここに書いておきます。
highchartsで複数のグラフを重ねた場合に見づらくなり、透過したくなる時があります。

この時は

```javascript:test.js
  series:[{
    name :'hoge',
    color:'rgba(34,37,132,0.3)',
    data :[1,2,3,4]
    yAxis: 1,
    type :'column'
  }, {
    name :'fuga',
    color:'rgba(34,37,132,1.0)',
    data :[2,3,4,5]
  }]
```

このようにすると、
右軸にhogeという棒グラフ、右軸にfugaという線グラフが描画され、
hogeが前、fugaが後ろに配置され
hogeが透過された形になります。

ポイントは
・seriesに配置したい順序で配列を登録する(先に書いたのが前に表示される)
・色をrgbaで設定する(最後の数字が透過率)
というところ。

ちなみに、RGBAは「Red/Green/Blue/Alpha」だそうです。知りませんでした。
JSON

JSONとは、データを表現する形式の一つ。（≒単に保存をしておく形式）
テキスト形式（.txt）やxml形式（.xml）、csv形式（.csv）など色々な形式があり、その1つにjson形式（.json）がある。
jsonでは値に型を持たせる事ができ、数値、文字列、真偽値、配列、オブジェクト、nullといった型もデータとしてやり取り、保存出来る。
記述する文字数が少ない（データが軽量）為、Ajax通信でやり取りするデータ形式として普及している。



色々なデータ形式があるが、

テキスト形式だと、人によって入力の仕方が違ったり（規則性が無いと機械は読み取れない。）
ex)  takashi  nanba  33

CSV形式だと、カンマで区切られているので機械が判別できるが、それが名前なのか、年齢なのかといった「情報の意味」までは判別出来ない。
ex)  takashi nanba,33

xml形式は、情報の意味を伝える事ができるが、データ自体が数値なのか数字なのかといった「型」までは判別出来ない。しかも文字数が多いのでデータ量が大きくなってしまう。
ex)  <name>takashi nanba</name>
     <age>33</age>  

そこで今主流になっているのが、
json形式。jsと同じ書き方で配列や連想配列（オブジェクト）形式と同じ。
書き方のルールとして
・オブジェクトのキーは必ず””（ダブルクォーテーション）で囲い、キーと値の間には：（コロン）をつけ、キーと値を複数書くなら、（カンマ）をつける
・数値や真偽値、nullは””で囲わずそのまま書く
・配列は[]で囲い値の間にはカンマをつける

ex){
     "name":"takashi  nanba",
     "age":30
    }

まとめると
jsonはデータ形式の一つで、データが軽量で型という情報まで持てる為、
Ajaxで通信のやり取りをするときは主にjsonが使われている。

データの形式は機械が読み取りやすいようになっているが、人でも同じ事になるので、
誰かがデータをファイルに保存したりデータを相手に送った際に読む人が意味や内容を理解できるようにしている。
Ajax通信　非同期処理

Ajax（Asynchronous JavaScript + XML）は、
JavaScriptから非同期でサーバーへ通信を行い、データを取得出来る技術。
動的にWebページの内容を書き換える事が出来る。

ページ（html）の一部しか変わらないのに、全部のhtmlデータを取ってきては画面に表示しているので、
とても効率が悪く処理に時間が掛かる。

流れとしては、
ボタンが押されたらJavaScriptでAjax通信を行う
↓
Ajax用処理ファイル.phpをHTTPリクエスト
↓
サーバー側で、Ajax用処理ファイル.phpを取得し、ブラウザへHTTPレスポンス
↓
JavaScriptでデータを取得し、そのデータを元にhtmlを書き換える。


要約すると、
ページ全部（HTML）ではなく、一部のHTMLだけを取得し、
それを元にJavaScriptでページ（html）を一部書き換えるだけの処理で良くなる為、
処理が高速で効率がいい。これがAjax通信を活用するメリット。


「同期処理」「非同期処理」の違いとして、
「同期処理」はその処理が終わるまで次の処理は進まない。
「非同期処理」はその処理の終了を待たずに次の処理へ進んでいく処理方法のことをいう。

JavaScriptでは、非同期で処理される関数の主なものには、Ajax通信の関数の他、setTimeout関数などがある。

非同期な処理が完了された時に何らかの処理をしたい場合には「コールバック」を使う。
コールバックには引数として関数を渡せる。渡す関数のことをコールバック関数という。
google API で迷惑メール対策 recaptcha v3

# recaptcha v3 って何？

メールや会員登録のいたずらを防ぐ。
今までの recaptcha と違って 画像やチェックボックスが出ずにユーザーの行動で判断する。

# 登録
https://www.google.com/recaptcha/admin

から以下を取得

サイトキー:hogehoge
シークレットキー:secsec

# 使い方

・リキャプチャが読み込まれたら　`recaptchaResponse` をセット

```index.html

//1
<script src="https://www.google.com/recaptcha/api.js?render=hogehoge"></script>
<script>
    grecaptcha.ready(function() {
        grecaptcha.execute('hogehoge').then(function(token) {
            var recaptchaResponse = document.getElementById('recaptchaResponse');
            recaptchaResponse.value = token;
        });
    });
</script>


//2
<form>
<input type="hidden" name="recaptchaResponse" id="recaptchaResponse" />

ここに送信ボタンとか。色々。。。

</form>


```


# php側

・送信されてきた　`recaptchaResponse` とリキャプチャデータをチェック
・OKなら送信

```send.php

if (!empty($_POST['recaptchaResponse'])) {
    $secret = 'secsec';
    $verifyResponse = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secret.'&response='.$_POST['recaptchaResponse']);
    $reCAPTCHA = json_decode($verifyResponse);
    if ($reCAPTCHA->success) {

        // たぶん人間なので送信
        echo $_POST['recaptchaResponse']." トークン 送信しました";
        die;

    } else {
        // ボットかも

        echo "Error: BOT送信の可能性があります。再度入力してください";
        die;
    }
}


```
JavaSctipt ES6 forEach

ES6のコードは、まだ対応していないブラウザがある為、
Babelというツールを使ってトランスパイル（変換）してES5のコードに変える必要がある。


配列の便利メソッドとして、
forEach,map,filter,find,every,some,reduceがある。（７つ）
これらのメソッドは大体同じ動きをする。今回はforEachについて書く。


###foreachが使えると、従来のES5までのforループが使わなくなる。

下にforループ文とforEach文を比較として記載する。

```js:

//forループ
var colors = ['red','blue','green'];

for(var i =0; i <colors.length; i++){
  console.log(colors[i]);
}

//forEach
colors.forEach(function(color){
  console.log(color);
});
//(function(color){
// console.log(color);はコールバック関数
//コールバック関数とは、他の関数に引数として渡す関数の事


```

慣れの問題もあるが、
forEach文の方が可読性に長ける為、今後はforEach文での記述が望ましい。
平均気温の取得

我が家ではスマートメーターのモニターして[日々の電気の使用量が確認](https://qiita.com/yamori813/items/13dd74d8867523a3103e)できるようにしています。

![filename-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/3ba3ee3e-14f6-f260-8dae-fe5ddc0bc8d8.png)

7/28前後が極端に高いのは、FreeBSD/armv5tのbuildworld/kernelを試していたためです。FreeBSD/armはclangになってから一度のビルドが8時間くらいかかり、大変苦痛です。

今年は7月は涼しい日が多かったのですが、気象庁のページから平均気温のデータをダウンロードして見てみました。

```
年月日,平均気温(℃),平均気温(℃),平均気温(℃)
,,品質情報,均質番号
2019/7/19,26.7,8,1
2019/7/20,26.7,8,1
2019/7/21,25.3,8,1
2019/7/22,22.6,8,1
2019/7/23,25.0,8,1
2019/7/24,27.4,8,1
2019/7/25,28.5,8,1
2019/7/26,29.1,8,1
2019/7/27,28.9,8,1
2019/7/28,28.7,8,1
2019/7/29,29.9,8,1
2019/7/30,30.2,8,1
2019/7/31,30.7,8,1
2019/8/1,30.8,8,1
```

今年は7/24日くらいから徐々に気温が上がったので、平均気温の上昇が電気の使用量への影響があるように見えます。

気温が上がると、我が家では古い冷蔵庫を使っているので、これが一番インパクトがあるようです。クーラーは使いませんせんが扇風機は使うのでそれも影響があると思います。PC系も冷却のためにファーンがいつもより多く回るので、これも影響あると思います。

そのまま一日の平均気温の数字を乗せるだけだと、ちょっとわかりにくいので少し工夫が必要な気もします。

逆に下がるものとしては、ざっくり見た目での判断ですが、炊飯器は寒い時期に比べると、一回の炊飯に使う電気代は小さくなっているようです。

節電には日々の利用状況を確認するのが良いと思っています、気温も要素として確認できた方が良いと思います。

気象庁のデータなのですが、とりあえずページからはcsvはダウンロードできますが、スクリプトなどで取得できるAPIがあるのかよくわかりません。またcsvのデータ形式も不思議な形式です。またもしAPIがあるとしても無くなる可能性もあり、大変使いづらいです。

気象庁のシステムはぐしゃぐしゃなんで、もうどうしようもないというような開き直りが見えます。

と言って自分で計測するのも面倒なので、気象庁さんどうにかしてください。
[ 最短? ] Paraphrase でスターリンソート [ 結構短い ]

流行っているので参戦してみました。

# コード
プログラム本体は以下のものとなります：

```
@car swap { 2dup <= if swap drop true else drop false then } filter .
```

結構短いのでは？と思っておりますが、どうでしょうか？
他の言語での短い実装例も見てみたいです。

最後のドットはスタックに積まれている値（この場合はリスト）を出力するものです。
filter というワードは、スタックトップにあるラムダ（無名ワード）をスタックの 2 番目に積まれているリストに適用し、リスト内の各要素に対し、ラムダを適用し true のものだけをリスト化するワードです。

# 使用例

```
> ( 1 2 1 1 4 3 9 ) @car swap { 2dup <= if swap drop true else drop false then } filter .
 ( 1 2 4 9 ) ok.
```

実に簡単ですね。

# 解説
スタック上に現在の最大値を保存しておき、それを使っています。スタックを活用する Forth 系ならではのプログラムになっているかと思いますがいかがでしょうか？

並列処理向け Forth 系言語 Paraphrase にご興味を持たれた方は、twitter で paraphrase_lang ( https://twitter.com/paraphrase_lang )をフォローしていただけると嬉しいです。

ちなみに、今回使用した Paraphrase は ver.0.93.0 開発版（現在開発中のためまだ公開できてません）です。

# 追記
2019.08.02 11:15 追記：
最短なのでは、と思っていたらシェル使うともっと短く書けるようです。
シェル恐るべし。

「bashでスターリンソートをやってみた」
https://qiita.com/hasegit/items/e4fbccda94db5e954668
scoopを使ったwindows環境構築の実例

# scoopをインストール

```shell:PowerShell(管理者)
# 実行ポリシーを変更する
Set-ExecutionPolicy RemoteSigned -scope CurrentUser

# ロングパスを有効化
Set-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem' -Name 'LongPathsEnabled' -Value 1

# scoopをインストール
iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
```

～以降はPowerShellでもcmdでもOK～

# bucket拡張

```shell:cmd
# gitがないとbucket追加やupdateができないので、先行してインストールする
scoop install git

# main bucketだけだとパッケージが足りないので、extras bucketを追加する
scoop bucket add extras
```

# インストール

```shell:cmd
scoop install dark innounp ccleaner filezilla firefox googlechrome sublime-text teraterm vim tortoisesvn winmerge

# インストールに使用したファイルがキャッシュとして残るため、不要であれば消しておく
scoop cache rm *

```
- gitを入れると7zipも入る
- darkとinnounpは`scoop checkup`でインストールするように指摘されるので、予め入れておく

# 確認
```shell:cmd
# インストールしたパッケージを確認する
C:\>scoop list
Installed apps:

  7zip 19.00
  ccleaner 5.60.7307 [extras]
  filezilla 3.43.0 [extras]
  firefox 68.0.1 [extras]
  git 2.22.0.windows.1
  googlechrome 76.0.3809.87 [extras]
  sublime-text 3207 [extras]
  teraterm 4.103 [extras]
  tortoisesvn 1.12.1.28628 [extras]
  vim 8.1.1773
  vscode 1.36.1 [extras]
  winmerge 2.16.4 [extras]


C:\>
```

# アップデート

```shell:cmd
# scoopを更新
scoop update

# 全てのアプリを更新
scoop update *

# アプリを更新した場合、古いバージョンファイルは残ったままなので、不要であれば消す
scoop cleanup *
```



# アンインストール

```shell:cmd
scoop uninstall <パッケージ名> --purge

# 注意！！
scoop uninstall scoop
# scoopと共に、scoopを使ってインストールしたアプリも全てアンインストールされる
```

# パッケージがないもの
- emeditor
- office365

# その他

```shell:cmd
# アプリをリセット
scoop reset *

```
今回は触れませんが、このような機能もあります。

- アプリ単位でバージョンアップを行わない設定(hold)
- 最新でないバージョンを使う(bucketを追加することで対応)

# リンク
- [Scoop](https://scoop.sh/)
- [GitHub - lukesampson/scoop: A command-line installer for Windows.](https://github.com/lukesampson/scoop)
AWS Solution Architect Associate(SAA)を取得した時のメモ

先週SAAの資格取得をしてきたので、2年後の自分のためにも残す(SAAの有効期限は2年間なので)

#勉強期間
2019/07/07-24

#教材
徹底攻略 AWS認定 ソリューションアーキテクト – アソシエイト教科書
https://www.amazon.co.jp/dp/4295005495/ref=cm_sw_r_cp_apa_i_r73qDb7F9H7BQ

BlackBelt

##合格のコツ
1. 教本をざっと読んで分からないところを紙に書き出す
2. 書き出したところは出社前と寝る前に見直す
3. 使ったことないサービスはBlackBeltを読む(なるべく新しいもの)
4. 試験1週間前にAWS公式模試をやる。やる時は全部スクショ撮り、わからん問題をBlackBeltでやる
5. 当日試験

※コンソール弄っても覚えないです

#試験を受けてみて
今回の試験ではDynamoDB辺りが多かった。使ったことないサービスだったので結構重点的にやったおかげで無事合格。
API Gatewayあたりも出ると思って結構やったが1問も出なかったので、今度会社で使って覚えていきたいと思う。

##ここまで読んでくれた方へ
私自身仕事でのAWS歴は1年です。EC2やRDSあたりを使ってる方は2週間くらいやれば取れる資格になってると思います。
個人的にはVPCやルートテーブルなどの普段いじらないところがしっかり学べたので、理解が深まって良かったです。

この記事がSAA取得希望者の参考になればと思います。
ERROR: cannot launch node of type [hoge_pkg/huga.py]... に出会ったら疑うこと

# 要約
ROSでpythonスクリプト書いてlaunchファイルのノードに追加して`roslaunch`で実行してみたら

```
ERROR: cannot launch node of type [hoge_pkg/huga.py]: can't locate node [huga.py] in package [hoge_pkg]
```
とか急に言われて「？」となったら`chmod +x huga.py`したかどうか思い出した方がいい。
pythonスクリプトとlaunchファイルを一気に作るとやりがちなミス。

`rosrun`または`roslaunch`でpythonスクリプトを実行するときはシバンと実行権限を忘れないように。

# 具体的に
例えばhoge_pkgというパッケージにhuga.pyを作成して

```xml:huga.launch

<launch>
    <!-- このへんにrosparamとかargとかいろいろタグつける -->
    <node pkg="hoge_pkg" name="huga" type="huga.py" output="screen" />
</launch>
```
上のようなhuga.launchを作成した上でそのままターミナルで

```
$ roslaunch hoge_pkg huga.launch
```
を実行するとタイトルのようなエラーが出る。
この状態で

```
$ rosrun hoge_pkg huga.py
```
を実行すると今度は

```
[rosrun] Couldn't find executable named huga.py below /home/user1/catkin_ws/src/hoge_pkg
[rosrun] Found the following, but they're either not files,
[rosrun] or not executable:
[rosrun]   /home/user1/catkin_ws/src/hoge_pkg/src/huga.py
```
のようなエラーが現れて、２つのエラーはファイルの実行権限を与えれば解消することがわかる。つまり

```
$ chmod +x huga.py
```
でOK.

ROSじゃなかったらpythonスクリプトはふつう`python`コマンドで実行するからシバン（`#!/usr/bin/env python`←こんなん）なくても実行権限与えなくても動作する。
ROSだと`python`コマンドで実行しないからシバンも実行権限も必要。
AndroidStudio のエミュレータが [OFFLINE] のままフリーズしてしまった時の対処備忘録

# やったこと（結論）
Android Virtual Device Manager から対象のデバイスを `Actions > Cold Boot Now` で起動した。

# 起きたこと
Android Studio 側からエミュレータを起動しつつアプリのデバッグをしようとしたら、エミュレータにアプリをインストールできなかった。

adb で調べたら、

```
$ adb devices
List of devices attached
emulator-5554	offline
```

offline になっていた。
普通に起動してもエミュレータが反応しない状態で起動してしまって対処に困った。

エミュレータ上でアプリを大量に起動していたのが問題だったのか..？
VBScriptで別VBScriptをインポートする

### 説明
- VBScriptで別VBScriptをインポートする

### サンプルコード
```vb
'同じフォルダにある別VBScriptをインポートする
Public Sub LoadScript(aScriptName)
    Set fso = CreateObject("Scripting.FileSystemObject")
    scriptFolder = fso.GetParentFolderName(WScript.ScriptFullName)
    Set ts = fso.OpenTextFile(scriptFolder & "\" & aScriptName, 1) '1:読み取り専用
    ExecuteGlobal ts.readall
    ts.Close
End Sub

LoadScript "another.vbs"

```
yukicoder No.840 ほむほむほむら

# yukicoder No.840 ほむほむほむら

https://yukicoder.me/problems/no/840


ほむらの数、ほむの数、ほの数の3つが重要。
ほの数がkの倍数である文字列の個数。
仮にk =3とする。
仮に、ほの数がmod k = 1で、ほむの数がmod k = 3、ほむらの数がmod k = 2であるような文字列がm個あるとしたら、
これにらを足したら、ほの数は変わらず、ほむの数も変わらず、ほむらの数は、mod k = 0となる。
ほ、ほむ、ほむらのそれぞれについてのmod kが$(i, j, l)$であるほむら文字列の数を計算する。それぞれのほむら文字列の数を$k^3$個の要素を持つリストの$k^2*i+k^1*j+l$番目に格納する。
1文字増やした時のこれらのそれぞれの遷移を考えたら、一辺の長さk**3の行列を累乗することで解ける。


ほむらの数、ほむの数、ほの数のMOD kがそれぞれ$(i, j, l)$のほむら文字列がx通りあったとする。この時、リストの$k^2*i+k^1*j+l$番目の要素がxとなっている状態である。

この文字列に「ほ」「む」「ら」が加えられた場合の遷移を考えてみる。

1.「ほ」が加えられた場合
ほの数が1個増える。したがって、ほの数のmod kは(i+1)%kになる。他は変わらない。
2. 「む」が加えられた場合
もともとのほの数(mod k: i)だけほむの数が増える。したがって、ほむの数のmod kは(i+j)%kになる。他は変わらず。
3. 「ら」が加えられた場合
もともとのほむの数の(mod k: j)だけほむらの数が増える。したがって、ほむらのmod kは(j+l)%kになる。他は変わらず。

全ての$(i, j, k)$の組み合わせに関して（つまり、リストの全ての要素に対して）こうした遷移を実現するには、一辺(k**3)の正方行列をBとすると、B[遷移の前の(i, j, k)][遷移の後の(i, j, k)]に1を足していけばいい。



```python

import numpy as np
N, k = list(map(int, input().split()))
mod = 998244353
mat_len = k ** 3


def mul(A, B) :
    C = [[0 for _ in range(mat_len)] for _ in range(mat_len)]
    for i in range (mat_len):
        for j in range(mat_len):
            for k in range(mat_len):
                C[i][j]+=A[i][k]*B[k][j]%mod
            C[i][j]%=mod
    return C



B = np.zeros((mat_len, mat_len))
for i in range(k):
    for j in range(k):
        for l in range(k):
            cur = i*k*k+j*k+l
            B[i*k*k+j*k+(l+1)%k][cur] += 1
            B[i*k*k+(j+l)%k*k+l][cur] += 1
            B[(i+j)%k*k*k+j*k+l][cur] += 1



ans = np.identity(mat_len)


while N:
    if N & 1:
        ans = mul(ans, B)
    B=mul(B, B)
    N>>=1




ret = 0
for i in range(k**2):
    ret = (ret + ans[i][0])%mod



print(int(ret))

```
ちなみに、yukicoderでpypyを選ぶとnumpyがなぜか使えない?のか上のコードだとエラーになった。
しかし、pythonだと遅すぎて通らない。
行列の部分をリストにしたら通った。
Webサービスの被リンク集めにProductHuntが超有能な話（英語圏限定）

先日リリースした自作Webアプリを何となくProductHuntにアップロードしたのですが、それだけで急激に被リンクが増えて驚いたので、自分がやったことと成果をシェアします。

## ProductHuntとは

ProductHuntというのは、イケてるアプリをシェアできるプラットフォームで、誰でもユーザー登録をすれば自分が作ったアプリや見つけてきたWebサービスをアップロードすることができます。月間1000万近くのアクセスを稼ぐ巨大サイトなので、それだけ多くの人の目に触れるチャンスがあります。
他にも[Alternativeto.net](https://alternativeto.net)というサイトも集客目的で使っているのですが、アップロード時のレスポンスは明らかにProductHuntの方が上だったので、初期の集客という点ではProductHuntが有効だと思います。

https://www.producthunt.com/
![Screen Shot 2019-08-02 at 6.30.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59201/2936dba1-cdcf-9007-261a-839e6c294022.png)

## ProductHuntに投稿した結果

ちなみに私がアップロードしたのは[Pomofocus.io](https://pomofocus.io)というアプリです。ProductHuntのページはこちら。
https://www.producthunt.com/posts/pomofocus-io

弊アプリのProductHuntのページを見ていただけるとわかるのですが、投稿した直後に他ユーザーからのコメントが立て続けに入りました。色々細かなアドバイスもくれたりして、コミュニティが活発なことが伺えます。（しかもみんなめっちゃいい人です）

![Screen Shot 2019-08-02 at 6.42.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59201/ee1a0b6b-d2d6-2fd2-bf41-c948c124f71e.png)

そして肝心の被リンクですが、活動といえばほとんどProductHunt投稿しただけにも関わらず、計21件のドメインから被リンクをいただきました。何と（恐らく）台湾のブロガーにも取り上げて頂いています。ProductHunt効果は計り知れません。
![Screen Shot 2019-08-02 at 6.53.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59201/fdc47ce7-fbaa-c15f-d491-e4f031f760a3.png)

ちなみに言っておくと、上記のように初期の被リンクを増やすことには成功しましたが、まだSEO的には成功している訳ではないです。（狙っているキーワードでトップ50にも入れていない）
そこについてはすぐに効果が出るものでもないので、サイトを改善しつつ今後の動向を見守っていきたいと思います。
以上、「ProductHuntを利用した被リンク集め」の成果報告でした。

## まとめ

今はSEOに置ける被リンクの重要性が疑問視されていますが、小手先のテクニックで増やすブラックハット的なものではなく、こういった自然発生的に増える被リンクはいい面しかないと思います。結果、 Webサービスで初期の集客を狙う方にはProductHuntは超おすすめですという話でした。

...
これを書いた後で他のQiitaの投稿を色々調べたのですが、下記のポストの「プロダクトリリース系」にもProductHuntやその他類似サイトがリストされています。自分の知らないサイトが結構あって勉強になりました。
[これで英語圏も射程内！海外で戦う個人開発者のためのツールキット（16選）](https://qiita.com/taishikato/items/c42fce9e00fc055d5956)
【Eclipse】WildFlyを設定しJava EE開発環境を構築する

#EclipseにWildFlyを設定する
WildFlyを使ったアプリケーションサーバでJava EEアプリケーションを開発したかったので、
EclipseにWildFlyを設定しました。

##動作環境
**OS**：Windows 10 Professional 1809
**Eclipse**：pleiades 2019-06 ultimate (windows 64bit)
**WildFly**：17.0.1.Final 
##JBossツールのインストール
`ヘルプ`➡`Eclipseマーケットプレース`➡`JBoss`で検索し、`JBossツール`をインストールする。
※はじめにPleiades PhotonでJBossツールのインストールを試みたが、インストールがうまくいかなかった。Pleiades 2019-06 ultimateではすんなりインストールできた。なんで？
##WildFlyをサーバーに追加する
`ウィンドウ`➡`設定`➡`サーバー`➡`ランタイム環境`➡`追加`➡`WildFly17`
➡WildFly17をインストールしたディレクトリを指定
##プロジェクトフォルダをインポートする
`パッケージエクスプローラ`➡右クリック➡`インポート`
➡`既存プロジェクトをワークスペースヘ`
➡ルート･ディレクトリーにプロジェクトフォルダを選択する➡`完了`
##DBViewerプラグインをインストールする
`Eclipseマーケットプレース`で`DBViewer`を検索してインストールしようとしたが、検索しても出てこない。そこで、`eclipse\plugins\`へ`.jar`ファイルを直接コピーする方法でインストールした。
https://ja.osdn.net/projects/dbviewer/releases/
☝から最新版`zigen.plugin.db_1.2.2.v20101009.jar`をダウンロード
➡ダウンロードしたファイルを`eclipse\plugins\`へ移動する
➡Eclipseを再起動すると新規ビュースペクティブ一覧に`DBViewer`が追加されている
php-master-changes 2019-08-01

今日は mysqlnd のバグ修正、ZEND_SEND_UNPACK の RW 化 のリバートとテストの追加、upgrade-pcre.php を削除する修正があった！

# 2019-08-01
## cmb69: Fix [78213](https://bugs.php.net/bug.php?id=78213): Empty row pocket
- https://github.com/php/php-src/commit/8af14024c2134da5042fbafa01e70b6e0b338cd7
- [7.3~]
- ext/mysqlnd で、Windows でのテストこけの修正
- ヘッダのおさまらないサイズの arena を作ろうとするバグがあった、かな

## nikic: Revert "Use RW fetch for argument unpacking"
- https://github.com/php/php-src/commit/afd96392a344f1b2a8aac2be375293b47f633ca4
- [7.4~]
- [先日](https://qiita.com/sj-i/items/1f217215f9d12ad4aad7#nikic-use-rw-fetch-for-argument-unpacking)の修正のリバート
- [#78356](https://bugs.php.net/bug.php?id=78356) が解消できないからとのこと

## nikic: Add test for bug [#78356](https://bugs.php.net/bug.php?id=78213)
- https://github.com/php/php-src/commit/bab8b3a8bef4b5fd5c3fe75ebb1c231614ef3cfa
- [7.4~]
- #78356 のテストを追加

## cmb69: Remove upgrade-pcre.php script
- https://github.com/php/php-src/commit/b419b24ead933491453ecc5f45e38a20418c530e
- [7.3~]
- ext/pcre で、PCRE2 に対応していないスクリプト upgrade-pcre.php の削除
ITSM ツール の GLPI をコンテナ化してみた

こういった素晴らしいツールがあります。
https://glpi-project.org/

自社で使っており、オリジナルConfig満載のコンテナを育ててしまっていたのですが、
これじゃいかんということで、汎化しなおしたコンテナを作り直してみました。
GLPIがどのようなツールなのか、簡単に試せると思いますのでご興味がある方は ``Quick Start`` お試しください。

https://github.com/coleyon/glpi-docker
client -> AWS NLB -> kubernetes ingress-nginx -> podsでclientのIPをログで確認できるか


##本日の課題
ingress-nginxのログではClient IPが確認できるけどバックエンドアプリの走ってるpodのログではこれがingress-nginxのIPになってる件。
ingress-nginxを見ればいい話だけど、"Nice to have" featureなので調べてと頼まれた。


**Spec**
AWS NLB
Kubernetes - ingress-nginx


**Diagram**
簡略化したもの
![Screenshot 2019-08-01 at 22.57.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/467658/0e0e16a8-dbd4-2e93-7c60-2a50bb02c406.png)


**設定**
この設定がされている上で調べることに。

```
spec:
# this setting is to make sure the source IP address is preserved.
externalTrafficPolicy: Local
type: LoadBalancer
```

**結局**
「今現在では」できない

issues/3857で確認できます。
```Proxy protocol is not available in NLBs. Please check kubernetes/kubernetes#57250```


**workaround**
フロントエンドアプリのログでは確認できてるのでログフォーマットで見ることができる。

- https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/log-format.md



##Resources
**Kubernetes Official Document**

- https://kubernetes.github.io/ingress-nginx/user-guide/miscellaneous/
- https://kubernetes.io/docs/concepts/services-networking/#proxy-protocol-support-on-aws

**AWS Official Document**

- https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-target-groups.html#proxy-protocol
- https://docs.aws.amazon.com/elasticloadbalancing/latest/network/elb-ng.pdf
- https://docs.aws.amazon.com/elasticloadbalancing/latest/network/target-group-register-targets.html#register-deregister-targets

**github**

- https://github.com/kubernetes/ingress-nginx/issues/3857
- https://github.com/kubernetes/kubernetes/issues/57250
- https://github.com/kubernetes/enhancements/issues/423
typeORM + mySQL で絵文字 🚀😀🇹🇭 が入らない問題 🤔

`mySQL`データベースは`utf8mb4`で作っているのにTypeORMを使うと絵文字が入らない。という問題。


`typeorm`の`createConnection`をすると`charset`に関係なく`charset=UTF8_GENERAL_CI`になってしまうため、どこかで設定する必要があります。

## 解決策1
`ormconfig.json`で`charset`を指定する。

```ormconfig,json
...
"username": "root",
"extra": {
 "charset": "utf8mb4"
},
...
```

## 解決策2
`createConnection`でオプションを指定する。

```index.ts
...

import { createConnection, getConnectionOptions } from 'typeorm';

...

const connectionOptions = await getConnectionOptions();
Object.assign(connectionOptions, { charset: 'utf8mb4' });

const connection = await createConnection(connectionOptions);

...
```

## メモ

答え: https://github.com/typeorm/typeorm/issues/390

`ormconfig.json`で設定するほうが好みだったので解決策1を選択しました。上記のgithub issueには、

>Just wanted to point out that setting `charset` inside the `extra` options is obsolete since commit `6aeda88` (July 2017).
Just add the `charset` option directly to `ConnectionOptions`.

とありましたが今でも`extra`できます。
[メモ] (ラズパイ) microSDにラベルを貼ってみる

# 動機
最近のラズパイは、microSDのスプリングがなくなって、まちがってどこかへ飛んでってしまうことはなくなったけど、取りにくい <font color='blue'>=> 引っ張るとこがほしい。</font>

# TL;DR
- 使用例 (microSDが簡単に抜ける)<br>![使用例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75594/38f08d0b-36fd-cbb2-0f4b-1e13d62ac9c4.jpeg)


# 概要

- ↓こんな感じで9mmのラベルに印刷<br>![ラベル例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75594/e8d65345-0a48-399c-fda6-6833bea37133.jpeg)

- ↓こんな感じで、折って貼る。<br>![microSDに貼った例](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75594/e9187fdb-be79-672a-0411-ca22325f7fab.jpeg)

- ブラザーのラベルプリンタのソフトウェア(P-Touch Editor)<br>![ブラザーの印刷ソフト](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75594/f358f22f-7d6d-a8ad-cc11-cb778c0c3c93.png)

# その他
- 以前は、
    - 引っ張るところが欲しい。(=>セロテープでベロをつくってた)
    - どのカードだっけ? (=>microSDに直接マジックで番号を書いたり、セロテープにメモを書いた紙を張り付けてた)
- このラベルの方法を使い始めたばかりなので、問題・不満などは、これから出てくるｶﾓ
- ほかによさそうな方法・工夫してることがあれば、教えてください。
- 大丈夫か!? < ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75594/e21d23d0-bf06-9bf1-3680-d796f40946f2.png)


---
- (2019-11-19追記) いつもよりココのページビューが多いと思ったら、[からあげさんのツイート](https://twitter.com/karaage0703/status/1196577273064742912) だったのね.
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75594/c29bfa12-3b3c-607c-e75a-39d4ef136820.png)
クラスを触る

そろそろ文法の勉強が必要と感じたので備忘録的に書く.

# クラスとは
>オブジェクト指向プログラミング (object-oriented programming) の特徴の一つであるクラス (class) は、オブジェクト (object) を生成するための設計図にあたるものです。 まず、クラスとは何か、オブジェクトとは何かについて説明します。(chainerチュートリアル)

個人的な解釈としては,構造体を作るための設計図.

```Python3
class house:
    def __init__(self,name,size,price,zei):
        self.name_plate = name
        self.size = size
        self.price = price
        self.zei = zei
        
    def whose(self):
        name = self.name_plate
        print("{}の家です".format(name))
        
    def mate(self,mate):
        name = self.name_plate
        print("{}と{}の家です".format(name,mate))

    def price(self):
        print("お値段は{0}".format(self.price))

    def cost(self):
        total = self.price * self.zei
        print("お値段は{0}".format(total))
```
こんなのを考える.

### 質問タイム
#### 1.なんで全て引数にselfをとるのか.
->前提として,クラスではなく作成されたインスタンスがこの関数を実行する.そのとき,__関数に必要なデータはインスタンス自身が持っており,これを参照するから.__
->具体的な例として,self構造体のなかのname_plate構造にnameが入っているから.
->__classのなかで変数は共有されるわけではない.あくまで共有されるのはselfによって定義された自分自身(構造体)だけ.__(共有という言葉も違うけれど)


#### 2.引数はselfだけなのか.
->そんなことはない.mateを追加したぞ.
->だけれども,その引数のある関数でしか使えない.同じクラスだから~なんて融通はきかない.

#### 3.毎回.()を書くのがだるい.
initしたものに限っては()なしでコールできるぞ.
() を付けないとオブジェクト(値)となる.メソッドならメソッドオブジェクト.()をつけるのは関数呼び出してあって,値の呼び出しではない.
(8/2細く,shiracamusさん)

#### 4.これ何->{}
->フォーマット出力っていうらしい.
->""でくくっても''でくくっても問題ない便利な代物.ちなみに{0}で順番を指定して出せるっぽい.

## みてみよう

```Python3
my_house = house("joil",12,323432123)

my_house.mate("shin")
->joilとshinの家です

my_house.whose()
->joilの家です

my_house.sise()
->323432135
```

ほら動いた.

# 継承
まんま.
>あるクラスを定義したら、その一部の機能を変更したり、新しい機能を付け足したりしたくなることがあります。 これを実現する機能が継承 (inheritance) です。(chainerチュートリアル)

```python3
class Link:

    def __init__(self):
        self.a = 1
        self.b = 2


class Chain(Link):
    
    def __init__(self):

        super().__init__()

        self.d = 114514

    def sum_before(self):
        return self.a + self.b  
    
    def sum(self):
        self.a = 3
        return self.a + self.b
    
    def sum_after(self):
        return self.a + self.b   

     
class rope(Chain):

    def __init__(self):

        super().__init__()

        self.c = 1919810
```

悩みながらやった結果を残すのもあほらしいから最初から結果を出す.

まず,継承の雰囲気だけれども__丸呑み__である.だからinitしなければ,呑んだものをそのまま参照することができる.しかし,initすると呑んだものが完全に消化されてしまう.つまり構造体に何かをくっつけることはできないのだ.ただ,それでは不便すぎるのでinitしたくなる.その時のためにあるのが__super.__

すごい強そう.何ができるかというと,まず普通にinitする.そのときにこれを呼び出すと,丸呑みにしたクラスのinitを参照して回ってくれる.みたほうが早い.

```
c = rope

c.a
->1

c.c
->1919810

```
すっげ.ちなみにこれ__initしたところでsuper()すればいい__から,Chainのsuperはなくても良い.(もしChainでのsuperをなくして self.d = 114514　するとエラーが出る)

### 質問タイム
#### 1.名前被ったらアウトだよね
上流まで遡るから多分アウト.下流の値で上書きされるはず.



# To Do
結果を新しく保存(定義することはできるの?)
~~->できないくさい.
->結局,クラスは__何らかの初期値をとって,そのデータに対して".関数名"でいじれるようにするだけ.__~~
メンバやメソッドなら増やしたり消したりできる.(8/2訂正,shiracamusさん)
また,事前に宣言しておけば後から追加(定義)して取り込む(登録)することができる.
【中級編】micro:bitで戦車を操縦する

## はじめに
この記事はmicro:bitで戦車を操縦するための開発手順を初級・中級・上級に分けて紹介しています．使用機材や開発ステップは[まとめ]()で紹介しています．

＊まとめの記事を読んではじめられた方は，戦車の車体を制作してから，この記事を読むと良いでしょう！

#### 前回まで
- [序章](https://qiita.com/kikpond15/items/d6ca1e1372ba787ab08b)
- [初級編はこちら](https://qiita.com/kikpond15/items/b938f3165208aa3444b0)

## 中級編
中級編では，2台のmicro:bitを使って無線通信を行います．1台をコントローラーとして操作し，もう一台は戦車のモーターを制御します．[初級編]()では，micro:bitのボタンを押した時にモーターに繋がっている端子に電気を流すことでモーターの制御を行いましたが，2台のmicro:bitで通信してモーターを制御するにはどのようなプログラムを作れば良いでしょうか？

考え方としては，送信側(コントローラー)のmicro:bitが「前に進め」という言葉を書いた手紙送ります．受信側(戦車)のmicro:bitは手紙を受け取ったら，その言葉を読み，前に進む動作をするという手順を行います，

### 送信側プログラム
それでは，まず送信側のプログラムを作って行きます．
![スクリーンショット 2019-08-02 2.40.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/429d1463-9c47-9f4e-3b89-4924cace01ef.png)
こんな感じでAボタンが押されているときに"forward"(前進)というメッセージを送り，Bボタンが押されているときは"back”(後退)を送ります．なにも押されていないときは"stop"(停止)を送ります．無線のグループを送信側と受信側で同じに設定することで，決められら相手だけにメッセージを送る事が出来ます．

### 受信側プログラム
次に受信側，モーターを制御する側のプログラムを作っていきます．受信側のプログラムは[初級編](https://qiita.com/kikpond15/items/b938f3165208aa3444b0)で作ったプログラムを少し改良して作っていきます．
![スクリーンショット 2019-08-02 2.54.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/39c3aefe-19e1-5db6-042d-27f2ac253cdc.png)
まずは，このように無線のグループを送信側と同じにしてあげます．そして送信側かわ送られてくるメッセージを受け取るために，「無線で受信したとき」ブロックを使用します．ここで重要なのが"receivedString"の方を選ぶことです．同じようなブロックで"receivedNumber"のブロックがありますが，送られてくるメッセージが**文字**か**数字**によってこのブロックを使い分けます．今回は送られてくるのが文字なので，"receivedString"を使用します．

そして，ここで**変数**というものが出てきますが，今回は細かい説明は省きます．
メッセージを入れておく箱だと思っていて下さい．この箱には名前をつける事ができ，今回は"message"という名前をつけておきます．

次にこの3つのブロックを用意します．上から「論理」「変数」「文字列」のメニューにあるので，出してみましょう．
![スクリーンショット 2019-08-02 3.07.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/86671bec-be96-8318-3485-cd8e3c465c87.png)

それらを合体させ，初級編で作ったプログラムをさらに合体させます．
![スクリーンショット 2019-08-02 3.12.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/191122/742cd706-d32b-df92-5fb6-33e0c39b7047.png)
初級編では，「Aボタンが押されているなら」という条件でしたが，今回は"messeage"が"forward"，"back"，"stop"ならに変更します．変数"message"に送られてくる文字を入れ，"message"の中身が"forward"，"back"，"stop"のいずれかなら，それに応じてモーターを制御するといった処理になります．送信側と受信側の送る文字が違っていたり，無線のグループが違っているとうまくメッセージを受け渡すことが出来ないので注意しましょう．

## チャレンジ
前進・後退を無線で操作することが出来たら，次は，**左右の旋回**もやってみましょう！「前進」「後退」「右旋回」「左旋回」「停止」の5つのパターンを同時に操作することが出来ると良いでしょう．

でも，ボタンは2つしかありませんよね？そんなときは，他の入力機能を使ってみましょう！micro:bit には様々なセンサーが搭載され，そのセンサーを使ってプログラムを制御することが出来ます．まずは入力機能から**「端子P0がタッチされている」**を使ってみてはどうでしょうか．


## 参考・関連
[序章](https://qiita.com/kikpond15/items/d6ca1e1372ba787ab08b)
[回路図](https://qiita.com/kikpond15/items/f4d37de5061c0b8a9e21)
[初級編はこちら](https://qiita.com/kikpond15/items/b938f3165208aa3444b0)
[上級編はこちら](https://qiita.com/kikpond15/items/9a65b3a4e51faeb40e2f)
vim での置換で正規表現を使う

# やりたいこと
vimでの置換で苦しむ
　[ や" や (space)をうまく認識できない。\でエスケープしてもできなかったりする。
　また、任意の文字が入った外側の文字を置換したい場合に対応できない。

##　解決法
`\v`　をつけて一般の（？）正規表現を使えるようにする


例
`:%s/\v([.])//gc`
で`[1]`、`[2]`などの`[]`で囲まれ、中身が一文字の場所を全て置換できます。

　ちなみにg（global?)は一括置換を意味するコマンドですが、よほど自身がない限り、c(check?)をつけることを勧めます。
　
　y or n を押すと置換するかどうかを1つずつ選択できます。

## 問題点
今までできた単純な置換が\vだと弾かれたりしたので（どんなケースはダメかわかればあとで書きます）、単純な置換は\vをつけずにやった方がいいかもです。

⬆️
@slin さんからコメントをいただきました。
vim　上で `:h magic`を押すと、split viewでもう１つ別の画面が現れて、help画面が現れます。そこでそれぞれのモードで何の文字がescapeが必要かを示してくれるようです。便利！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253261/1e371b32-e6c2-b763-aab5-dda8eccb9271.png)