OmniAICreator/Qiita-1.07M huggingface dataset:
Hyper-Vを一時的に無効にする方法

#概要
Hyper-V を有効化すると、VirtualBox / vmware / BlueStacks / NoxPlayer などの仮想化ソフトウェアが使用できなくなる場合があります。"Windowsの機能の有効化または無効化" から Hyper-V を無効化すれば解決するのですが、有効と無効を切り替える度にインストールとアンインストールが行われるため現実的ではありません。
そこで、今回は Hyper-V をアンインストールせず、一時的に無効化するための手順を紹介します。

#環境
ここで紹介する手順は、以下の環境で動作検証を行いました。

|OS|Version|OS Build|
|:--|:--|:--|
|Windows 10 Pro 64bit|1903|18362.329|

#Hyper-V の有効/無効を切り替えるコマンド
Windows にはブート構成データを管理するためのコマンドラインツール (BCDEdit) があり、これを使用して OS 起動時に Hyper-V の有効/無効を切り替えることができます。ただし、このコマンドの実行には管理者権限が必要となります。

```shell
# Hyper-V の有効化
bcdedit /set hypervisorlaunchtype auto
# Hyper-V の無効化
bcdedit /set hypervisorlaunchtype off
```

#無効化 BAT ファイルの作成
まず、以下のコードをテキストエディタにコピー＆ペーストして保存します。拡張子が bat であれば、ファイル名は好きに付けていただいて大丈夫です。
ここでは [Hyper-V無効化.bat] としておきます。

```shell:Hyper-V無効化.bat
@ECHO OFF

bcdedit /set hypervisorlaunchtype off

echo Hyper-Vを無効に設定しました。設定は再起動後に反映されます。
echo 今すぐ再起動しますか？ ( Y / N )
set INPUT_STR=
set /P INPUT_YES_OR_NO=

:CONFIRM
if "%INPUT_YES_OR_NO%"=="" goto :CONFIRM

if "%INPUT_YES_OR_NO%"=="Y" (
    shutdown /r /t 0
) else if "%INPUT_YES_OR_NO%"=="y" (
    shutdown /r /t 0
) else if "%INPUT_YES_OR_NO%"=="N" (
    echo 処理を終了します。
) else if "%INPUT_YES_OR_NO%"=="n" (
    echo 処理を終了します。
) else (
    echo Y または N を入力してください。
    goto :CONFIRM
)

PAUSE
EXIT
```

#無効化 BAT ファイルのショートカットを作成
作成した BAT ファイルをダブルクリックして実行した場合、以下の様な表示がされて正しく実行できません。

```
ブート構成のデータ ストアを開けませんでした。
アクセスが拒否されました。
```

これは bcdedit の実行に管理者権限が必要なためです。BAT ファイルを右クリックして [管理者として実行(A)] を選択すれば良いだけの話ですが、できればダブルクリックだけで実行したい。ということで、よく知られているショートカットを作成して実行する方法を採ります。

まず、作成した BAT ファイルのショートカットアイコンを作成します。続けて、ショートカットアイコンのプロパティを開き、[ショートカット] タブの [詳細設定] を開きます。
![2019-09-08_051748.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65765/fb294f0c-dca8-0835-5355-0cdc203307a8.png)
詳細プロパティが開いたら [管理者として実行(R)] にチェックをつけて `OK` をクリックします。
![2019-09-08_052010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65765/29a7732b-7cd2-078e-6971-338b093fda9c.png)

#無効化 BAT の実行
作成したショートカットアイコンをダブルクリックすると、UAC の確認の後に cmd が管理者として実行されて以下の様な表示がでます。
ここで `Y` または `y` を入力すると Windows が再起動されて Hyper-V が無効になります。

```
この操作を正しく終了しました。
Hyper-Vを無効に設定しました。設定は再起動後に反映されます。
今すぐ再起動しますか？ ( Y / N )
```

#最後に
上記と同様の手順で [Hyper-V有効化.bat] のショートカットアイコンも作成しておくと良いでしょう。
WebpackDevServerを使わずに、Webpackで監視しているファイルが変更された時にブラウザを自動リロードする方法

最近私はPHPでサーバー側を作成し、htmlで、webpackでバンドルしたjsを読み込む、という感じのことをやっていたのですが、WebpackDevServerで起動した時のように、
jsファイルを保存 -> ブラウザ自動リロード ができないかと思い、ググってみるとwebpackのプラグインがあったので紹介ですm(_ _)m

[webpack-livereload-plugin](https://www.npmjs.com/package/webpack-livereload-plugin) を使うとうまくできました

# Install

```bash
npm i -D webpack-livereload-plugin
# または
yarn add -D webpack-livereload-plugin
```

# webpack.config.js

設定に追加

```webpack.config.js
const LiveReloadPlugin = require("webpack-livereload-plugin");

module.exports = {

    // ...

    plugins: [
        new LiveReloadPlugin()
    ],
};
```

htmlで以下のように読み込みます

```html
<script src="http://localhost:35729/livereload.js"></script>
```

webpackでビルド、`-w` または `--watch`オプションをつけてビルドする

```bash
yarn webpack -w
```

これでWebpackで監視しているファイルが変更された時に自動でブラウザがリロードされます

# Reactで試してみる

Reactで試してみた時の自分の設定です:smiley:

githubにも同じのを置いてあります https://github.com/okumurakengo/webpack-livereload

```bash
yarn add react react-dom
yarn add -D webpack webpack-cli webpack-livereload-plugin babel-loader @babel/core @babel/preset-env @babel/preset-react
```

```webpack.config.js
const LiveReloadPlugin = require("webpack-livereload-plugin");

module.exports = {
    mode: process.env.NODE_ENV || "development",
    module: {
        rules: [
            {
                test: /\.jsx?$/,
                use: {
                    loader: "babel-loader",
                    options: {
                        presets: ["@babel/preset-env", "@babel/preset-react"]
                    }
                }
            }
        ]
    },
    resolve: {
        extensions: [".jsx", ".js"]
    },
    plugins: [
        new LiveReloadPlugin()
    ],
};
```

```src/index.js
import React from "react";
import { render } from "react-dom";
import App from "./App";

render(<App />, document.getElementById("root"));
```

```src/App.jsx
import React from "react";

const App = () => (
    <>Hello</>
);

export default App;
```

```index.html
<!DOCTYPE html>
<meta charset="UTF-8">
<title>Document</title>
<script src="dist/main.js" defer></script>
<script src="http://localhost:35729/livereload.js"></script>
<div id="root"></div>
```

```bash
yarn webpack -w #./dist/main.js が出力
```

この状態で `file:///<ディレクトリへのpath>/index.html` などでindex.htmlをブラウザで表示する

私の場合はPHPの簡易サーバーを起動してindex.htmlを表示して試してみました `php -S 0.0.0.0:8080`

![w1BUXZoP1i.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142910/63c68e0d-e436-014c-5794-11d12a1b3f3f.gif)

ファイルを保存するたびにブラウザが自動でリロードできました。
最後まで読んでいただいてありがとうございました。m(_ _)m
Embulkでログレベルを指定して実行する


Embulkは非常に便利なのですがログの出力量が多過ぎてスケジュール実行する際はログ量が気になります。
実は `embulk run` のオプションでログレベルを指定できることに気付いたので後世のためにここに記します。

### ログレベルの指定方法
```bash
--log-level [LOG_LEVEL]
```

`LOG_LEVEL` には以下の5つがあるようで指定しない場合は `info` で動作するようです。

* error
* warn
* info
* debug
* trace

### コマンド例
スケジュール実行するなら `warn` を指定するのがベターかと。

```bash
embulk run config.yml --log-level warn
```

## 参考サイト
* [Embulkのコマンドヘルプまとめ](https://qiita.com/hiroysato/items/86ad1cdfb1754440eed5#%E3%83%AD%E3%82%B0%E9%96%A2%E9%80%A3%E3%81%AE%E3%82%AA%E3%83%97%E3%82%B7%E3%83%A7%E3%83%B3)
Swift：文字列を特定の文字列の前後で分割する

文字列を特定の文字列で分割して配列にする場合は，

```swift
let str: String = "abc,def,ghi"
let array = str.components(separatedBy: ",")
// => ["abc", "def", "ghi"]
```

という風にすればできるが，例えば"aaaxxxbbbxxxccc"のような文字列で，先頭からみて最初に現れるxxxの前後で文字列を分割したいというような場合は余計に分割されてしまう．

こういう時は`Range<String.Index>`をうまく扱う．

```swift
let str: String = "aaaxxxbbbxxxccc"
let range = str.range(of:"xxx")!
let former: String = str[str.startIndex ..< range.lowerBound].description
let latter: String = str[range.upperBound ..< str.endIndex].description
// former: "aaa", latter: "bbbxxxccc"
```

こんな感じ．
MayaでWindow生成する時に少しMelで楽する方法

##概要
MayaでWindowを生成する時に毎回同じ様な文書を書くのは
少し面倒だなーって思ったので、
ファンクション化してみました。
Pythonにしたら楽では？等ございますが、
MayaLTで使う場合だとMelの必要があるので、
今回はMelで作成しています。


##Melコード
```WindowControl.mel
//---------------------------------------------------------------------------
//機能呼び出し用
//---------------------------------------------------------------------------
global proc string WindowControl()
{
    return "WindowControl";
}

//---------------------------------------------------------------------------
//ベースWindow作成
//---------------------------------------------------------------------------
global proc string WindowControl.Create(string $InputWindowName,int $WindowWidth,int $WindowHeight)
{
    if ( (`window -ex $InputWindowName`) == true )
    {
        deleteUI $InputWindowName;
    }
    if( (`windowPref -ex $InputWindowName`) == true )
    {
        windowPref -remove $InputWindowName;
    }
	string $windowName = `window -title $InputWindowName
                           -minimizeButton off  //最小化無効
                           -maximizeButton off  //最大化無効
                           -widthHeight $WindowWidth $WindowHeight  //サイズ指定
                           $InputWindowName`;
	return $windowName;
}
```

##使い方
下記の様な感じで使用を想定。
追加処理部分に自分が入れたいButton等を追加するイメージです。


```
WindowControl();
$WindowName = WindowControl.Create("何らかのUI",300,300);
//追加処理
//追加処理
showWindow $WindowName;
```


##解説
・WindowControlを空読み込みする。
 これは特にやらなくても良い部分ではありますが、
 個人的に他で使用する時に下記の様にできた方が直感的にわかりやすそうだと感じたので、この様に呼び出してます。
イメージとしてはメソッドっぽい感じです。

```

global proc 何かしらのUIを生成する機能()
{
    WindowControl();//機能読み込み
    $WindowName = WindowControl.Create("何らかのUI",300,300);//ウィンドウ生成
    showWindow $WindowName;//ウィンドウ表示
}

```
・WindowControl.Create部分

```
    if ( (`window -ex $InputWindowName`) == true )
    {
        deleteUI $InputWindowName;
    }
```
window -exであるかどうか確認して、ある場合は削除します。
これがないと生成するたびに新しいWindowが生成されてしまうので、
Window生成する時は必須ですね。

```
if( (`windowPref -ex $InputWindowName`) == true )
    {
        windowPref -remove $InputWindowName;
    }
```
Mayaに保存されているWindowの情報にこのWindowがあれば削除する処理を入れてます。
ちょっとこの辺りは他に詳しい方に伺いたいのですが、
size等の設定をしても一度生成したサイズの保存状態が優先され、
意図した挙動にならない為、追加してます。

##おわりに
正直毎回書いても良いのでは？っと思う部分もありますが、
共通化した事で、一括で設定を変更したり、
共通でワークスペースにくっつける様にしたりとメリットはあると思います。

もしよろしければお使いください！
[Android] package名とUID(linux User ID) の対応の調べ方

# やりたいこと

Androidで、UID(LinuxのUser ID)がどのpackageに割り当てられているかを調べたい。

Androidではpackageをインストールするごとに、Linuxユーザが割り当てられUIDが付与される。
結果、`/proc/uid_io`や`/proc/uid_cputime/show_uid_stat`など、
UID単位での情報を見る機会が多いので、お手軽に対応付ける方法がほしい。


# 方法1. `cmd`コマンド

```
$ adb shell cmd package list packages -U
package:com.android.cts.priv.ctsshim uid:10008
package:com.google.android.youtube uid:10078
package:com.google.android.ext.services uid:10014
package:com.android.providers.telephony uid:1001
package:com.google.android.googlequicksearchbox uid:10032
```

確認したAndroid 8.1では、`pm list packages -U`でも同じ結果が得られた。
ただし、`pm help`によれば、`pm list`はもう使わない方が良いらしい。

> NOTE: 'pm list' commands have moved!
> Run 'adb shell cmd package' to display the new commands.



# 方法2. `dumpsys`コマンド

```
$ adb shell dumpsys package --checkin packages |
    awk 'BEGIN {FS=",";OFS=","} $1=="pkg" {print $2, $3}'
com.android.cts.priv.ctsshim,10008
com.google.android.youtube,10078
com.google.android.ext.services,10014
com.android.providers.telephony,1001
com.google.android.googlequicksearchbox,10032
...
```

`dumpsys package packages`コマンドですべてのpackageの情報が取得できるので、
そこからpackage名とUIDを切り出している。
パースしやすいよう`--checkin`オプションをつけているが、その位置に注意。
今回は除去しているが、versionやインストール時刻も一緒に取得できるので、それらが必要な場合は`dumpsys`を使えば良い。


# おわりに

Androidシステム上で動作するServiceと動的にやりとりをするコマンドとして、
`dumpsys`と`cmd`が用意されている。

ざっくりいえば、

- `dumpsys`
    - `Service`に対して状態の出力を要求する。
    - `IBinder#dump`経由で、`Service#dump`を呼び出す。
    - `package`Serviceの実装は[ここ](https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-8.1.0_r68/services/core/java/com/android/server/pm/PackageManagerService.java#22613)。
- `cmd`
    - `Service`に対して任意のコマンド要求ができる。
    - `IBinder#shellCommaand`->`Service#onShellCommand`->`ShellCommand#exec` -> `ShellCommand#onCommand`を呼び出す。
    - `package`Serviceの実装は[ここ](https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-8.1.0_r68/services/core/java/com/android/server/pm/PackageManagerShellCommand.java#100)。

ただし、実際どちらにどのような機能をもたせるかは`Service`に依存する。
例えば`usb`は`dumpsys`コマンドでroll switchができたり、
`package`はどちらのコマンドでも状態の出力ができたりする。

`cmd`コマンドは`dumpsys`コマンドに輪をかけて情報が少ない。
(というか検索しずらい、、、)

`dumpsys`でほしい情報が取れない場合は、`cmd`コマンドもチェックしたほうがよい。

# おまけ

## UID -> package名

```shell-session
$ adb shell cmd package list packages -U --uid 10078
package:com.google.android.youtube uid:10078
```

```shell-session
$ adb shell dumpsys package --checkin packages |
    awk 'BEGIN {FS=","} $1=="pkg" && $3==10078 {print $2}'
com.google.android.youtube
```

## package名 -> UID

```shell-session
$ adb shell cmd package list packages -U com.google.android.youtube
package:com.google.android.youtube uid:10078
```

```shell-session
$ adb shell dumpsys package --checkin com.google.android.youtube |
    awk 'BEGIN {FS=","} $1=="pkg" {print $3}'
10078
```

# 参考
[UID stats - Android Developers](https://developer.android.com/studio/command-line/dumpsys#uid_stats)
[awkでカンマ区切りのデータを指定した列だけカンマ区切りで出力する](https://qiita.com/saicologic/items/65e06c796fd60179b22a)
【超簡単】WindowsにVirtualBoxをインストールする方法


## 1.VirtualBoxとは

- `Virtualbox` とは `仮想マシン` の1つで、複数のOSを仮想環境上で動かすことができる。
- `Virtualbox` の特徴は下記の通りである。

| 特徴　　　|内容|
|:------------------------|:------------------------------------------|
| スナップショット　　　　　　| 仮想環境の状態を保存しておく機能。仮想環境の復元が可能。                 |
| シームレス・モード　　　　　　　　　　　　　　　　　　　　| ホストOS（使っているOS）とゲストOS（仮想マシンのOS）間で同時並行で、作業を行うことができる。|
| 共有フォルダ　　　　　　　　　　　　　　　　　　| ホストOS（使っているOS）とゲストOS（仮想マシンのOS）間でファイルのやり取りができる。|
| クリップボード共有　　　　　　　　　　　　　　　　　　　　| ホストOS（使っているOS）とゲストOS（仮想マシンのOS）間でコピーした内容を共有できる。　　　　　　　　  |

## 2.VirtualBoxのダウンロード方法

![VirtualBox.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/b8c1839c-b1ab-1ff3-4b2e-1e5dfae3f1e0.png)

![VirtualBox-6.0.12-133076-Win.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/9227f318-dc38-8343-5006-77f015aed661.png)



1. [VirtualBoxのサイトにアクセスする。(https://www.virtualbox.org/wiki/Downloads)](https://www.virtualbox.org/wiki/Downloads)
2. 「`Windows hosts`」を選択する。
3. `.exe` ファイルの `ダウンロード` が開始される。
4. ダウンロードが終了したらダウンロード先のフォルダを確認する。


## 3.VirtualBoxのインストール方法

![VB01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/e6618268-b08f-e260-3ab6-d55a32f8a022.png)

![VB02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/635051b6-40ef-9ec0-b6f6-b8629252df4a.png)

![VB03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/0f32dfdd-816c-77c6-d01a-dd76d282cd33.png)

![VB04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/e69fec7c-cc5b-6c84-4014-f04c19c15254.png)

![VB05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/ca6e13e7-ec67-5ae8-1845-f1d002b7e965.png)

![VB06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/80eb49ce-3ac3-dfbb-c2bb-bde2d00171d9.png)

1. ダウンロードした `.exe` ファイルを起動する。
2.  `Setup` メニューが開いたら `Next` をクリックする。
3.  `Location(保存先)` を確認したら、 `Next` をクリックする。
4.  `Custom Setup` のチェックボックスに全てチェックを付け、 `Next` をクリックする。
5.  `Warking:Network Interfaces` は、 `Yes` をクリックする。
6.  `Ready to Install` は、 `Install` をクリックする。
7.  インストールが完了したら、チェックボックスにチェックを付け、 `Finish` をクリックする。

1~7の項目が終了するとデスクトップに `アイコン` が生成され、起動すると下記のようになります↓↓

![VB07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449867/1b085c41-4a08-7e99-4df4-6f5d319f0979.png)

画像のように起動すれば成功です。

## 4.関連
- [【2019年最新】VirtualBoxでUbuntuの仮想環境を作る方法](https://qiita.com/ryome/items/56e8ee3d5e27bf514e60)
Heroku Schedulerは --type=web のDockerコンテナしか実行しない

Herokuのアドオンの [Heroku Scheduler](https://elements.heroku.com/addons/scheduler) は非常に便利なのですが、Dockerで構築した [Container Registry](https://devcenter.heroku.com/articles/container-registry-and-runtime) で利用するには注意があります。

**--type=web のコンテナしか実行されません**

`Heroku Scheduler` でのジョブの登録時に `type` の指定がないから変だと思ったのですよね・・・。

以下のコマンドでデプロイしたコンテナを `Heroku Scheduler` は参照します。

```bash
heroku container:push web --app [APP_NAME]
heroku container:release web --app [APP_NAME]
```

以下のように `worker` を指定したものは無視されます。
ログには指定したコマンドの実行が1行出力されるだけでエラーも出力されません。

```bash
heroku container:push worker --app [APP_NAME]
heroku container:release worker --app [APP_NAME]
```

### おまけ
以下は、Herokuの公式ドキュメントの引用です。
2019年9月8日時点のものです。

><h2>Heroku Scheduler and Container Registry</h2>
>If you are using Heroku Scheduler and Container Registry as your deployment method, your task must be accessible from the web image. There is no way to specify a non-web image for task execution.

https://devcenter.heroku.com/articles/scheduler#heroku-scheduler-and-container-registry
Windows10でhiberfil.sysを削除する

## hiberfil.sysとは
Windowsが休止状態（メモリ内容を内部ストレージに保存する）に移行する際に、状態を書き込んでおくためのファイル。
休止状態を使わなかったり、容量に困っていたら消してあげたい。
コマンドプロンプトを管理者権限で開いて実行。

## 削除
```
Powercfg -h off
```

## 作成
```
Powercfg -h off
```
GrafanaでZabbix API error が出るときの、ZabbixのPHPのメモリ制限設定とVer2系へのTrends APIパッチ導入

# やりたいこと
GrafanaでZabbixをデータソースにしてダッシュボードで可視化しているが、
30日以上などの長期間表示で非常に表示が遅かったり、
**"Zabbix API error"**というのが表示されたりする場合の対処のまとめ

# ZabbixのTrendsとHistoryについて
Zabbixは指定の期間に対して、
Historyという期間内のすべての値を返すAPIと、Trendsという期間内の値を丸めたものを返すAPIがある。

Grafanaで長期間の表示をさせるときは、
Trendsが機能しないと、Historyでは応答する値が多すぎて、表示が遅くなったり、エラーになったりする。
ただし、TrendsがAPIとして提供されるのはZabbixのVer3以降で、Ver2系はZBXNEXT-1193のパッチ適用が必要となる。

[Zabbixプラグインの公式ページから](https://alexanderzobnin.github.io/grafana-zabbix/configuration/)
Trends APIを推奨する旨の記載
> Trends: enable if you use Zabbix 3.x or patch for trends support in Zabbix 2.x (ZBXNEXT-1193). **This option strictly recommended for displaying long time periods (more than few days, depending of your item's updating interval in Zabbix) because few days of item history contains tons of points. Using trends will increase Grafana performance.**

# Grafana上のZabbixデータソースのTrends API設定
ちゃんとenableにチェックが入っていることを確認する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161521/0a7468f5-b225-236d-5506-5f8383dc2384.png)

# ZabbixのPHPのメモリ制限
Zabbixの
/var/log/httpd/error_logを見るとPHP Fatal errorが出ている。
Zabbixコミュニティにあるこんな感じのエラー。
http://www.zabbix.jp/node/1544
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted

解決策も上記のコミュニティ回答から
/etc/httpd/conf.d/zabbix.confのPHPのメモリ制限の値を変える。
メモリには余裕があったので128M→1024Mにする

```/etc/httpd/conf.d/zabbix.conf
php_value memory_limit 1024M
```

上記を反映するためにZabbixのApacheを再起動

```
# service httpd restart
```

# ZabbixのVer2系へのTrends APIのパッチ適用
[Zabbixプラグインの公式ページから](https://alexanderzobnin.github.io/grafana-zabbix/configuration/)
ZabbixのVer2系はZBXNEXT-1193のパッチ適用でTrendsのAPI追加が必要。

> Trends: **enable if you use Zabbix 3.x or patch for trends support in Zabbix 2.x (ZBXNEXT-1193).** This option strictly recommended for displaying long time periods (more than few days, depending of your item's updating interval in Zabbix) because few days of item history contains tons of points. Using trends will increase Grafana performance.

パッチ(CTrend_for_Zabbix_2_4_4.zip)を下記からダウンロード。
https://support.zabbix.com/browse/ZBXNEXT-1193

DBやフロントエンドの変更なく、API追加だけなことを確認
https://zabbix.org/wiki/Docs/specs/ZBXNEXT-1193

パッチ適用手順は下記を参考にした。
https://fabianlee.org/2017/01/08/zabbix-enabling-api-fetch-of-trend-data-in-zabbix2/

①tmpに配置し解凍

```
cd /tmp
unzip CTrend_for_Zabbix_2_4_4.zip
```

②バックアップ取得

```
cd /usr/share/zabbix/include
tar cvfz classes.tar.gz classes/
```

③パッチファイルの適用

```
cp -r -v /tmp/frontend/include/ /usr/share/zabbix
```

④再起動

```
service httpd restart
```

これで完了
一問一答　[参考]プログラムはなぜ動くのか

■問題、banayad回答
①プログラムとは？
コンピュータに与える処理の流れを書いたもの

②プログラムの中には、何が含まれている？
機械語？

③マシン語とは何？
コンピュータが直接実行できる単位。バイナリコードで拡張子は.exeとか。

④実行時のプログラムはどこに格納されているか？
ヒープ領域？一時メモリー？

⑤メモリーのアドレスとは？
データが格納されている領域の番地

⑥コンピュータの構成要素の中でプログラムを解釈・実行する装置は？
CPU

⑦32ビットは何バイト？
4バイト

⑧01011100という2進数は10進数でいくつ？
92

⑨00001111という2進数を2桁左シフトすると元の数を何倍したことになるか？
4倍

⑩補数表現で表された8桁の2進数11111111は10進数ではいくつか
-128

⑪補数表現で表された8桁の2進数10101010を16桁の2進数で表すと？
1111111101010110

⑫グラフィックスパターンを部分的に反転させるためには、何という論理演算を使うか？
XOR

---
■模範解答、補足
①OK

②命令とデータ。
プログラムは命令とデータの集合体。C言語の「printf("こんちわ")」というプログラムなら、
printfが命令で"こんちわ"がデータ。

③CPUが直接解釈できる言語。コンピュータとCPUの違いは明確にしておくべき。
マシン語命令の主な種類と機能は下記。
データ転送命令
演算命令
ジャンプ命令
コール・リターン命令

④メモリー（メインメモリー）。
ハードディスクなどのディスク媒体に保存されたプログラムは、
メモリーにコピーされてから実行される。
メインメモリーは通常、DRAMと呼ばれる読み書き可能なチップが使われる。電源をきると内容が失われる。

⑤OK。正確にはメモリー上で命令やデータが格納されている場所を示す値。

⑥OK

⑦OK

⑧OK

⑨OK

⑩-1。補数とはプラスの値でマイナスの値を表す。
補数は反転して+1。
+1→00000001
-1→11111111
これらを足すと0になることがわかる。100000000（9桁目は桁あふれ）

⑪1111111110101010。

⑫OK
[Unity] 指定した範囲を切り抜いたスクショを保存する

## 目的
スクショを撮ったときに指定した範囲だけ切り出してから保存したい。

例えば次の画面があるとときに、
![ss_1136_640.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110527/64cad9e4-1f29-e248-5523-89a8f051ba0d.png)


画面全体では1136 * 640だが、画面中央付近の500*500の画像を撮りたい場合がある。

## 方法
Texture2Dの機能を使うとできた。

```csharp
        protected virtual IEnumerator CaptureCoroutine(int width, int height)
        {
            // カメラのレンダリング待ち
            yield return new WaitForEndOfFrame();
            Texture2D tex = ScreenCapture.CaptureScreenshotAsTexture();
            // 切り取る画像の左下位置を求める
            int x = (tex.width - width) / 2;
            int y = (tex.height - height) / 2;
            Color[] colors = tex.GetPixels(x, y, width, height);
            Texture2D saveTex = new Texture2D(width, height, TextureFormat.ARGB32, false);
            saveTex.SetPixels(colors);
            File.WriteAllBytes("ss.png", saveTex.EncodeToPNG());
        }
```

上のCoroutineに500,500を引数に渡して呼び出すと、Unity Projectのrootディレクトリ直下に"ss.png"という名前で次の画像が作られる。

![ss.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110527/cd611b0c-1bdb-daec-dfb2-912b90b75508.png)

## やっていること
- ScreenCapture.CaptureScreenshotAsTextureでスクショをTexture2Dで扱う
- Texture2DのGetPixelsメソッドを使い指定した範囲を切り抜いた部分をColorの配列にする
- 保存用Texture2Dに作ったColorの配列を入れ、EncodeToPNGメソッドを使ってPNGとして保存させる。

Coroutine化してWaitForEndOfFrameまで待つのは、今回使った[ScreenCapture.CaptureScreenshotAsTexture](https://docs.unity3d.com/ja/current/ScriptReference/ScreenCapture.CaptureScreenshotAsTexture.html)で得られる画像がおかしくなるため。ドキュメントにも注意が書かれている。多分カメラのレンダリング以降に呼び出さないとだめなのかな。

試しにWaitForEndOfFrameせずに撮影した場合は次の画像になり期待したものにはならなかった。
![ss_bug.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110527/d8eeeca3-31c6-38e4-f3d7-367fe1e17956.png)

スクショを保存する機能の[ScreenCapture.CaptureScreenshot](https://docs.unity3d.com/jp/current/ScriptReference/ScreenCapture.CaptureScreenshot.html)はいつ呼び出しても使えそうだが、CaptureScreenshotAsTextureはそうではないので気をつけたい。

## まとめ
- ScreenCapture.CaptureScreenshotAsTextureとTexture2Dの機能を使えば画面の指定した範囲を切り抜いたスクショをつくることができる。
- ScreenCapture.CaptureScreenshotAsTextureは呼び出すタイミングに気をつける。
Automation Anywhereで、現在実行中のTaskのあるフォルダのパスを取得する方法


# はじめに
現在実行中のTaskのあるフォルダのパスを取得したくなる時があるのですが、元々用意されている変数`$AATaskName$`ですと、
ファイル名を含むフルパスを取得してきてしまいます。
そこで、現在実行中のTaskが置かれたフォルダのパスだけ取得する方法をいくつか試して、一番シンプルな方法を思いつきましたので、メモ代わりに記載しておきます。

他に良い方法や、そもそも普通に出来る。等、ありましたら教えて頂けると嬉しいです。

## 試した環境
Automation Anywhere Enterprise 11.3.2 日本語版
# やり方
Strint Operationで以下の正規表現を使って、変数`$AATaskName$`からTaskのファイル名を削除するだけ。
`[^\\]*atmx$`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/48e3a981-865d-1c73-3b57-6530a2dc22bf.png)

保存して実行し、出力をMessage Boxで表示すると、C:\Test\というフォルダに置いたTaskであれば以下のような感じに。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490870/b306503f-bd66-f470-6391-0b45bcbb1ef8.png)
pythonで平行処理入門 (threading.Thread)

pythonでthreadingを使って平行処理する方法についてのメモです。

公式ドキュメント
https://docs.python.org/ja/3/library/threading.html


# 平行処理と並列処理


<b>平行処理: 同じCPUコアの同じpythonプロセスで複数の処理を同時にやる
並列処理: 別のCPUコアの別のpythonプロセスで複数の処理を同時にやる</b>

待機が多いような楽な処理は平行処理で、負荷が重い処理は並列処理でやるのが良いでしょう。今回は平行処理の入門記事です。

並列処理については先日書いたのでそちらを見てください
https://qiita.com/studio_haneya/items/1cf192a0185e12c7559b


# 試行環境


Windows10
python 3.6


# 平行処理の例
threading.Threadを定義してstart()で開始、join()すると終了するまで待機します。待機するのでなくis_alive()でチェックしながら別の作業をやることも出来ます。

threading.Threadは返り値を受け取れないようなので参照渡しの引数に仕込みます。ただし、受け取り用の引数を result = x * x のようにすると別の変数になってしまって返ってこないのでlistやdictで渡して書き加えて戻すようにします。

```python:python
import time
import threading


def nijou(x, result):
    print('input: %d' % x)
    time.sleep(3)
    result[threading.current_thread().name] = x * x
    print('double:', result)


if __name__ == "__main__":
    result = dict()
    thread = threading.Thread(target=nijou, args=[4, result], name='thread1')

    thread.start()
    for k in range(6):
        time.sleep(1)
        print(thread.is_alive())
    thread.join()
    print(result)
```

```python:結果
input: 4
True
True
double: {'thread1': 16}
False
False
False
False
{'thread1': 16}
```
ちなみに、引数も返り値も必要ない時はargsは省略可能です。
レッツトライ！
【Swift4】AVPlayerのseek()で時間がずれる件

swiftの動画再生での話。

```swift
AVPlayer().seek(to time: CMTime)
```

でシークした後に動画再生を行うと、指定した時刻よりも最大0.5秒程度ずれた位置から再生が始まってしまい、なぜかと悩んでいた。

ドキュメント
https://developer.apple.com/documentation/avfoundation/avplayer/1385953-seek）
を見たらすぐに解決しました。

> Discussion
The time to which the player is seeked may differ from the specified time for efficiency. For sample accurate seeking see seek(to:toleranceBefore:toleranceAfter:).

なるほど、正確な時刻にシークするためには、

```swift
AVPlayer().seek(to time: CMTime, 
toleranceBefore: CMTime, 
toleranceAfter: CMTime)
```

を使って、前後の誤差を小さく設定する必要があるとな。

ドキュメント読むのは大事ですね。

つまりデフォルトでは、-1〜1秒程度の誤差が許される設定になっているらしい。

おしまい。
vue & auth0

###vue.jsでのデータの受け渡し
https://teratail.com/questions/201657

###外部APIを使ったWebアプリの実例
https://www.webprofessional.jp/fetching-data-third-party-api-vue-axios/

###Auth0 QuickStarts の Ruby API Authorization
https://inokara.hateblo.jp/entry/2018/03/26/000717

###Auth0 vuejs
https://www.google.com/search?q=auth0+vuejs&oq=auth0+vuejs&aqs=chrome..69i57j0l5.4655j0j7&sourceid=chrome&ie=UTF-8

###Auth0 Vuejs 2 認証チュートリアル
https://auth0.com/blog/jp-vuejs2-authentication-tutorial/

###Vue.js で簡単なログイン画面 (トークン認証) 
https://qiita.com/sunadorinekop/items/f3486da415d3024c7ed4

###RubyとVue.jsでECサイトをゼロから作る
https://paper.dropbox.com/doc/RubyVue.jsEC-1--AkM0CQsvuphERzgjnFmiLFfAAg-ntEsbfPjxdf5Nos2Xwyto

###Laravel Shoppingcart + Vue でショッピングカートを作る
https://blog.capilano-fw.com/?p=1682#i-5
業務システム開発のための開発言語／フレームワーク情報収集(2019年版)【更新途中】

## 目的
業務システム開発における開発言語／フレームワーク選定の自組織内での基準を情報収集～整理をするための個人的な調査結果まとめ資料です。
自分の担当はDA/DBAであるため、データベースを起点としたシステム開発推進を基本に考えており、アプリケーション開発手法においてデータベースとの親和性が高いものはどのようなものがあるのか、または相性が悪いものはどういった点が問題になるのか、といった観点が判断の中心となります。

## 開発言語／フレームワーク候補リスト

![FW候補一覧.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23140/948e11b5-f75f-49c2-a491-066a3f11072d.png)

## 求められる条件
- 構築されたシステムは今後10年を目途に長期的な保守が可能であることを重視します。
    - フレームワーク自体の生い立ちや普及状況などから予想される将来性の不安が少ないこと
    - 外部パートナーの充実度(エンジニア／開発会社の選択肢の多さや実績の多さ。世間的な人気や構築実績など)
    - 自社での内製開発／保守の可能性(社内SEが独自で開発保守できることが望ましい。学習コスト、情報収集の容易さなど)

## 想定されるシステム化対象業務と規模
- 顧客管理、受注管理、契約管理、その他多数の業務領域を包含する基幹業務システム
- 2000人以上の利用ユーザ数
- 365日／24時間稼働のサービスレベル
- 個人情報を含む機密データ保持のためのセキュリティレベル
GrafanaでZabbixをデータソースにするプラグインをオフライン環境で導入する

# やりたいこと
GrafanaのデータソースとしてZabbixを設定するためのプラグイン導入手順。
インターネットに接続していないオフライン環境で、grafana-cliコマンドを使わずにインストールする。

# GrafanaのZabbix用のプラグイン
Zabbixプラグインは公式ではなく、コミュニティのプラグインである。

Grafanaの公式ページのZabbixプラグインの紹介
https://grafana.com/grafana/plugins/alexanderzobnin-zabbix-app
Zabbixプラグインの公式ページ
https://alexanderzobnin.github.io/grafana-zabbix/

[Grafanaの公式ページのZabbixプラグインの紹介](https://grafana.com/grafana/plugins/alexanderzobnin-zabbix-app)のInstallationタブの
>Alternatively, you can manually **download the .zip file** and unpack it into your grafana plugins directory.

のdownload the .zip fileからZIPファイルで入手できる。

# オフライン環境でのインストール手順
[Grafanaの公式ページのZabbixプラグインの紹介](https://grafana.com/grafana/plugins/alexanderzobnin-zabbix-app)で、
grafana-cliコマンドを使わない方法として
> **Alternatively,** you can manually download the .zip file and **unpack it into your grafana plugins directory.**

とあるので、
ダウンロードしたZIPファイルを解凍して、プラグイン用のディレクトリに置けばインストールできることが分かる

※[Zabbixプラグインの公式ページ](https://alexanderzobnin.github.io/grafana-zabbix/)のインストールの説明では下記のようにあるが、自分の環境では手動インストールで問題なく動いています。
>WARNING! The only reliable installation method is grafana-cli. Any other ways should be treated as a workaround an don't provide any backward-compatibulity guaranties.

## 解凍とプラグイン用のディレクトリへのコピー
Grafanaのプラグインは、/var/lib/grafana/plugins/下におけばよいので、
解凍して配置する。

```
# unzip alexanderzobnin-grafana-zabbix-v3.10.4-1-g29a98f5.zip
# cp alexanderzobnin-grafana-zabbix-29a98f5 /var/lib/grafana/plugins/
```
## 再起動
Grafanaを再起動する

```
# service grafana-server restart
```

## GrafanaのWEB画面での有効化
このプラグインは、GrafanaのWEB画面でEnableにする操作が必要。
これはOrganizationを分けている場合は、各Organizationごとに実施する。

下記のような説明だが、プラグインの管理画面はGrafanaのバージョンによって違う。
自分の環境のGrafanaはVer4で、
メイン画面の左上のGrafanaアイコン→Plugins→Appsタブ→Zabbixを選択→Enableをクリックだった

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161521/71c8801b-3e73-62a2-a7f4-3ea07b84d246.png)


[Grafanaの公式ページのZabbixプラグインの紹介](https://grafana.com/grafana/plugins/alexanderzobnin-zabbix-app)の説明

> Next, log into your Grafana instance. Navigate to the Plugins section, found in your Grafana main menu.
**Click the Apps tabs in the Plugins section and select the newly installed app.** 
> **To enable the app, click the Config tab. Follow the instructions provided with the application and click Enable. The app and any new UI pages are now accessible from within the main menu, as designed by the app creator.**

> If dashboards have been included with the application, they will attempt to be automatically installed. To view the dashboards, re-import or delete individual dashboards, click the Dashboards tab within the app page.

# 他のプラグイン
公式ページで、公式/コミュニティのプラグインが紹介されている。
https://grafana.com/grafana/plugins

自分は、円グラフやパーセンテージ出すためにパイチャートを入れた
https://grafana.com/grafana/plugins/grafana-piechart-panel
[Rails]マイグレーションファイルの削除方法

#はじめに
今回、マイグレーションファイルの削除手順を間違ったせいで過去に大変な思いをしたので、復習を兼ねて正しい手順の削除方法などを書いていきたいと思います

#マイグレーションファイルについて
まずはマイグレーションファイルの確認方法

```
$ bundle exec rake db:migrate:status

database: pictweet_exam2_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20141014132556  Create tweets
   up     20141018070558  Devise create users
   up     20141018072348  Add nickname to users
   up     20141018084902  Add user id to tweets
   up     20141112144522  Remove name from tweets
   up     20160606020309  Create comments
```
マイグレーションファイルの一個前の削除

```
$ bundle exec rake db:rollback
== 20160606020309 CreateComments: reverting ===================================
-- drop_table(:comments)
   -> 0.0078s
== 20160606020309 CreateComments: reverted (0.0117s) ==========================
```
down状態になったか確認し、マイグレーションファイルを削除する。念の為`schema.rb`にデータがないか確認をするのもいいと思います。

```
$ bundle exec rake db:migrate:status

database: pictweet_exam2_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20141014132556  Create tweets
   up     20141018070558  Devise create users
   up     20141018072348  Add nickname to users
   up     20141018084902  Add user id to tweets
   up     20141112144522  Remove name from tweets
  down    20160606020309  Create comments
```

複数前のマイグレーションファイルの削除の場合はVERSIONに「Migration ID」を指定し`rake db:migrate:down `を使用します。
今回は20141018084902のtweetsモデルのuser idカラムのマイグレーションファイルを消して見たいと思います。

```
$ bundle exec rake db:migrate:down  VERSION=20141018084902
== 20141018084902 AddUserIdToTweets: reverting ================================
-- remove_column(:tweets, :user_id, :integer)
   -> 0.0251s
== 20141018084902 AddUserIdToTweets: reverted (0.0270s) =======================
```
マイグレーションのファイルがdownになっているのを確認後、マイグレーションファイルを削除する。

```
$ bundle exec rake db:migrate:status
database: pictweet_exam2_development

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20141014132556  Create tweets
   up     20141018070558  Devise create users
   up     20141018072348  Add nickname to users
  down    20141018084902  Add user id to tweets
   up     20141112144522  Remove name from tweets
```

#まとめ
マイグレーションファイルの操作は本当慎重に行わないと色々不具合が出て大変ですよね。
削除に関しては必ずマイグレーションファイルがdownになっているのを確認するようにすれば大きなトラブルは起こらないかと思います。
間違えてマイグレーションファイルを作成しても焦らず、正しい手順で削除するようにしていこうと思います。
vue & bulma

### bulma Extention
https://bulma.io/extensions/
https://bulma.io/alternative-to-bootstrap/

### owlcarosel Demo
https://owlcarousel2.github.io/OwlCarousel2/demos/demos.html

### material Icon
https://cdn.materialdesignicons.com/4.2.95/
https://materialdesignicons.com/tag/community

### awesome Vue
https://awesome-vue.js.org/

### Vue Tab
https://qiita.com/mimoe/items/86d5312b3741320b717b

### Vue Accordion
http://lab.astamuse.co.jp/entry/2018/10/15/154737
https://vuejsexamples.com/simple-and-smooth-vue-accordion/

### Vue Fetch
https://vuejsexamples.com/tag/fetchapi/

### Vue API POST
https://note.mu/tis_engineer/n/na403e160e18c#EsT2w

### Vue Pagination
https://qiita.com/macotok/items/29442785543f8d838d20
https://vuetifyjs.com/en/components/data-tables#api
Windows10の任意の場所でminikubeを始める

# はじめに
個人でCaaS環境を作るためには、 [minikube](https://minikube.sigs.k8s.io/) がかなり役に立ちます。
なので、minikubeを使って環境を作っていきます。

## 作成環境

|項目名|内容|
|---|---|
|OS|Windows 10|
|OSバージョン|1903|
|仮想環境|VirtualBox 6.0.6|
|パッケージマネージャー|Chocolatey|
|minikubeバージョン|1.3.1|
|minikubeの保存場所|E:\Minikube|

# minikubeを始める

## 1.仮想環境をインストールする
[VirtualBox 6.0.6](https://download.virtualbox.org/virtualbox/6.0.6/VirtualBox-6.0.6-130049-Win.exe) をインストールします。

## 2.パッケージマネージャーをインストールする
Windowsのためのパッケージマネージャーとして、 [Chocolatey](https://chocolatey.org/) をインストールします。
[こちらのインストールページ](https://chocolatey.org/install) を順に進めていきます。

以下のスクリプトを管理者モードのPowershellで実行します。

```.ps1
# インストール
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

# インストールできたことを確認する
choco -?
```

## 3.minikubeをインストールする
Chocolateyを使って、 [minikube](https://minikube.sigs.k8s.io/) をインストールします。
minikube上でkubernetesのインターフェースを使用するため、 `kubernetes-cli` もインストールします。

```.ps1
choco install minikube kubernetes-cli
```

## 4.minikubeを起動する
minikubeの起動コマンドは、 `minikube start` です。
その後 `minikube status` で起動していることを確認します。

しかし、このときのminikubeの保存場所は `$env:USERPROFILE` （ユーザーフォルダー）です。
これだと他の実行プログラムの保存領域を圧迫する可能性があるので、別のフォルダーに移しましょう。

## 5.minikubeの保存場所を変更して起動する
保存場所は、環境変数 `MINIKUBE_HOME` で指定することができます。
Windowsのタスクバーの左側にある検索窓に `環境変数を編集` と入力し、 `ユーザー環境変数` に `MINIKUBE_HOME` を追加します。
フォルダー構成としては、 `$env:MINIKUBE_HOME\.minikube` の下に諸々のファイルが配置されます。

環境変数に設定が完了すれば、PowerShellを再起動して、以下のスクリプトを実行します。

```.ps1
# minikubeのクラスタを削除する
minikube delete

# カレントディレクトリを変更する
cd $env:MINIKUBE_HOME

# minikubeを起動する
minikube start

# kubectlでクラスター情報を表示する
kubectl cluster-info
```

最後に、指定したフォルダー内にちゃんとファイルが配置されていることをエクスプローラーなどで確認します。

## 6.実際にデプロイして確認する
以下のコードを保存します。

```deploy.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: busybox
spec:
  template:
    spec:
      containers:
      - name: busybox
        image: busybox
      restartPolicy: Never
  backoffLimit: 1
```

そのコードを以下のスクリプトでデプロイします。[
その後、ジョブが実行されていることを確認します。

```.ps1
# minikubeにデプロイする
kubectl create -f "$env:USERPROFILE\deploy.yaml"

# 実行されていることを確認する
kubectl get jobs
```

以上で、環境作成から実行の確認までできました。

# おわりに
個人の開発環境がWindowsなので、この記事はWindowsで書いています。
しかし、エンジニアではMacを使っている人が多いことでしょう。その場合はパッケージマネージャーを `brew` に変えたり、環境変数周りを置き換えたりすれば、同じように環境を作れるはずです。
minikubeを使って、ローカルでもkubernetesを使った開発を行っていきましょう。
Automation Anywhereで正規表現を使いこなす

Automation Anywhere では、ファイル名、フォルダー名、ウィンドウタイトルの検索、またはString Operationコマンドでの検索文字列に、特定のパターンを指定したい場合、正規表現 (Regular Expression) を使えます。変数内、または引数内で正規表現を使う場合は、正規表現フラグがある場合は付けておきます。

# 利用対象コマンド

* App Integration
* Delay/Wait
* File/Folder
* Image Recognition
* Insert Keystrokes
* Insert Mouse Click
* Manage Window Controls
* OCR
* Screen Capture
* String Operation (Find/Replace)
* Window Actions

# 正規表現が使える場所の例
ウィンドウタイトルの指定があるドロップダウンボックスでは、正規表現によるマッチが可能である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/91775df0-0a53-3cfb-be06-2422fac2b01c.png)

ファイル/フォルダーパス指定テキストボックスでは、正規表現によるマッチが可能である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/90319edc-0d85-f793-2385-431b889ff380.png)

変数作成時に正規表現チェックボックスがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/9351c8bb-983d-1176-391c-2183e9661aa3.png)


String OperationコマンドのFind/Replaceでは、正規表現を使うかどうかのフラグがある。ONにすると、正規表現が有効となる。OFFだと文字列がそのまま解釈される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/67b03537-61e1-4b21-5f97-888b51bffc13.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490819/bbe384e9-ae82-dcb3-9840-2d25fd88c55b.png)



# 正規表現関係の記事

* [正規表現言語 - クイックリファレンス](https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/regular-expression-language-quick-reference)
* [よく使う正規表現について整理](https://qiita.com/ktr1211/items/132e7216709c912917c6)
Vue cli3.0を利用してVue + Electron + Typescript 設定 

### 簡単

```
$ vue create my-app
$ vue add electron-builder
$ yarn serve:electron
```
<img width="803" alt="스크린샷 2019-09-08 오전 1.19.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428595/c08d0a3e-2bed-f69d-735a-f022b87ac6fc.png">
mysql8で導入されたcloneプラグインについて


# cloneプラグインとは
ローカルまたはリモートサーバーから無停止で物理バックアップするツール。このプラグインが導入する前は無停止で物理バックアップする場合は「MySQL Enterprise Backup」などを使用する必要がありました。バックアップするのはinnodbのみが対象になります。

リモートのMySQLサーバーからcloneする手順について記載しています。MySQLのバージョンは8.0.17です。

- clone先のサーバーのホスト名は`mysql_target`
- clone元のサーバーのホスト名は`mysql_source`

とします

# インストール
1. clone先・元のMySQLサーバー双方にcloneプラグインをインストールします

```
mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so';
Query OK, 0 rows affected (0.02 sec)
```

INFORMATION_SCHEMA.PLUGINSをSELECTして以下のように表示されていればOKです

```
mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME = 'clone';
+-------------+---------------+
| PLUGIN_NAME | PLUGIN_STATUS |
+-------------+---------------+
| clone       | ACTIVE        |
+-------------+---------------+
```

# ユーザ作成
- clone元でBACKUP_ADMINを持ったユーザを作成します

```
mysql> CREATE USER 'source_user'@'mysql_source' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.02 sec)
mysql> GRANT BACKUP_ADMIN on *.* to 'source_user'@'mysql_source';
Query OK, 0 rows affected (0.01 sec)
```

- clone先でCLONE_ADMINを持ったユーザを作成します

```
mysql> CREATE USER 'target_user'@'localhost' IDENTIFIED BY 'password';
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT CLONE_ADMIN on *.* to 'target_user'@'localhost';
Query OK, 0 rows affected (0.01 sec)
```

- clone先でclone_valid_donor_listにclone元の「ホスト:ポート名」を設定します

```
mysql> SET GLOBAL clone_valid_donor_list = 'mysql_source:3306';
Query OK, 0 rows affected (0.00 sec)
```

# cloneの実行

```
mysql> CLONE INSTANCE FROM 'source_user'@'mysql_source':3306 IDENTIFIED BY 'password';
ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor process).
```
エラーが表示されていますが、cloneが実行されると再起動が走ります。今回実行した環境がmysqlを直接起動したので再起動が失敗しましたがsystemd経由で起動させると再起動は成功します

再起動させたくない場合は、DATA DIRECTORYで出力先ディレクトリーを指定します

```
mysql> CLONE INSTANCE FROM 'source_user'@'mysql_source':3306 IDENTIFIED BY 'password' DATA DIRECTORY = '/tmp/mysql_clone';
Query OK, 0 rows affected (1.08 sec)
```

# まとめ
リモートにあるMySQLサーバーをcloneする例を書きましたが、今後のMySQLサーバーのバックアップのデフォルトスタンダードのソリューションになるかもしれないですね。内部的にどうゆう仕組みで動いているのかちょっと興味が湧いてきたのでその辺りも調べて分かったら記事にしたいと思っています。
Visual Studio Code で AnacondaのPATHを通す。

# VS CODEのPATH繋げた。
今日はVS CODE で、Pythonの開発環境を整えた。
Windows 10 で、AnacondaのPATHを繋ぐのに苦労した。
これを参考にさせてもらった。
https://www.google.co.jp/amp/s/sukitokuportfolio.wordpress.com/2018/11/20/anaconda%25E3%2581%25AEpath%25E3%2582%2592windows%25E3%2581%25A7%25E9%2580%259A%25E3%2581%2599%25E8%25A9%25B1/amp/

いつかは、PyCharmも試してみたい。

#Twitter or Qiita
Twitterに書き流すのもありかもしれないけど、MarkDownを うまく使えるように、Qiitaに投稿し続けよう、と今 決めた。
景気ウォッチャー調査の景気判断理由集をエクセルで綺麗にする

##このマクロを実行するとこうなります
実行前
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478420/273a474e-6ed6-652c-7a91-85a94f920753.png)
実行後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478420/4740d5a5-2674-6804-1186-30c313b3b96f.png)

##コード
vba初心者の方は
https://www.officepro.jp/excelvba/ini/
こちらで「プラグラムの記述と実行」まで学んでください（五分で出来るので安心してね）
後は下のコードをコピーしてコードウインドウに張り付け、
macroというマクロを実行してください。

```
Function location(vaf As Range) As String
    Dim name As String
    Dim n As Long
    name = vaf.Value
    n = InStr(name, "(")
    name = Mid(name, n + 1)
    n = InStr(name, ")")
    location = Left(name, n - 1)
End Function

Sub macro()
    Dim i, j As Long
    Dim location_name, kind_name As String
    j = 0
    Columns(1).Insert
    For i = 1 To 10000
        If j > 10 Then
            Exit For
        End If
        If Cells(i, 5) = "" Or Cells(i, 5) = "業種・職種" Then
            Rows(i).Delete
            i = i - 1
            j = j + 1
        Else
            j = 0
            If Cells(i, 2) <> "" Then
                location_name = location(Cells(i, 2))
                kind_name = Left(Cells(i, 2), 2)
            End If
            Cells(i, 1) = location_name
            Cells(i, 2) = kind_name
        End If
    Next i
End Sub

```

###解説は後日書きます・・・
qiita初投稿なんです。許して下さい・・・
MacOS X クライアントから CentOS 7 サーバーに SSH 接続する場合の設定

CentOS 7 では、SELinux が有効、`yum update` 済みとする。

## 公開鍵認証の設定
クライアント側で、公開鍵認証を使用して接続するように[設定](https://qiita.com/ousaan/items/4f3c2ee6569489ae5fe2)し、サーバーに接続する。

## サーバー側の設定
まず `sudo -i` で管理者になると便利。

### sshd の設定

`/etc/ssh/sshd_config` で以下のように設定する。

```
# ポートを変更
Port <ポート番号>

# ルートログインを禁止
PermitRootLogin no

# パスワード認証を無効化
PasswordAuthentication no
```

ポートを変更する目的は、既知のポートに対する攻撃をファイアウォールで遮断するためなので、ポート番号を推測されにくいものにしないと意味がない。他のアプリケーションとの衝突を避けるため、49152 〜 65535 の範囲で設定する。

設定に問題がないかどうか確認する。

```
# sshd -t
```

エラーがなければ、設定を有効化する。

```
# systemctl reload sshd
```

### ファイアウォールの設定
SSH で使用するポート番号を変更する。

```
# firewall-cmd --permanent --service=ssh --add-port=<ポート番号>/tcp
# firewall-cmd --permanent --service=ssh --remove-port=22/tcp
# firewall-cmd --reload
```

設定できたことを確認するには、以下のコマンドを実行する。

```
# firewall-cmd --permanent --service=ssh --get-ports
```

### SELinux の設定
semanage がインストールされていない場合はインストールする。

```
# yum install policycoreutils-python
```

SSH で使用するポートを登録する。

```
# semanage port -a -t ssh_port_t -p tcp <ポート番号>
```

設定できたことを確認するには、以下のコマンドを実行する。

```
# semanage port -l | grep ssh_port_t
```

### 接続の確認

接続を切る前に、ターミナルで新規ウィンドウを開き、`ssh -p <ポート番号> <ユーザー名>@<サーバー名>` で接続できることを確認する。接続できない場合、すでに接続しているウィンドウを使って設定を見直す。

## クライアント側の設定
いちいち `ssh -p <ポート番号> <ユーザー名>@<サーバー名>` と入力するのが面倒なら、`~/.ssh/config` ファイルに、以下のように記述する。

```
Host <接続名>
  HostName <サーバー名>
  User <ユーザー名>
  Port <ポート番号>
```

すると、`ssh <接続名>` だけで接続できる。
paiza勉強中に調べたRuby

# はじめに

paizaスキルチェックを使って勉強している時に調べたRubyの構文を忘れないうちにまとめておこうと思いました


# 配列


## 中身をStringからIntegerに変更する

```
array = array.map(&:to_i)
```
to_iをto_sに変えればStringクラスに変更する

## 中身をならべかえる

```
# arrayがIntegerクラスの場合
array = [3, 5, 23, 15, 1]
list = array.sort
p list #=> [1, 3, 5, 15, 23]

# arrayがStringクラスの場合
array = array.map(&:to_s)

list = array.sort
p list #=> ["1", "15", "23", "3", "5"]
```

配列の中身のクラスによって結果が変わるので配列の中身を意識する

## 順番を入れ替える

```
array = [3, 5, 23, 15, 1]
list = array.reverse
p list #=> [1, 15, 23, 5, 3]
```

## 配列、文字列に特定の文字が含まれているか調べる

```
array = [3, 5, 23, 15, 1]
p array.include?(1) #=> true
p array.include?(4) #=> false

str = "apple"
p str.include?("ppl") #=> true
```

## n番目を消す

```
# ２番目の要素を消す
array = [3, 5, 23, 15, 1]
array.delete_at(1)
p array #=> [3, 23, 15, 1]

# array.delete(1)とすると1があったら消す。似ているので注意
array = [3, 5, 23, 15, 1]
array.delete(1)
p array #=> [3, 5, 23, 15]
```

## 最後の要素を消す

```
array = [3, 5, 23, 15, 1]
array.pop
# array.delete_at(-1) でも可
p array #=> [3, 5, 23, 15]
```


## 要素を追加する

```
# 最後に追加
array = [3, 5, 23, 15, 1]
array.push(8)
# array << 8 でも可
p array #=> [3, 5, 23, 15, 1, 8]

# 最初に追加
array = [3, 5, 23, 15, 1]
array.unshift(8)
p array #=> [8, 3, 5, 23, 15, 1]
```

## 中身を合体する

```
array = [3, 5, 23, 15, 1]
p array.join #=> "3523151"

# joinに引数を渡すと間に入れてくれる
p array.join(" ") #=> "3 5 23 15 1"
p array.join("a") #=> "3a5a23a15a1"
```

## 最大のものを調べる

```
array = [3, 5, 23, 15, 1]
p array.max #=> 23
```

## 最も多いものを調べる

```
array = [1, 2, 3, 3, 4]
p array.max_by { |a| array.count(a) } #=> 3

# 同じ数のものが複数あった場合最初にある要素が出力される
array = [1, 2, 3, 3, 1, 4]
p array.max_by { |a| array.count(a) } #=> 1
```

## 文字数が多いものを調べる

```
array = ["apple", "orange", "lemon"]
p array.max_by { |a| a.size } #=> "orange"
```
## ネストした配列の作り方

```
p array = Array.new(3).map { Array.new(2, 0) }
#=> [[0, 0], [0, 0], [0, 0]]
```

# 文字

## 切り捨て、切り上げ、四捨五入

```
f = 3.5
p f.floor #=> 3 切り捨て
p f.ceil #=> 4 切り上げ
p f.round #=> 4 四捨五入
```
## 絶対値

```
i = -1
p i.abs #=> 1
```
## 0010と表示したい

```
p format('%04d', 10) #=> "0010"
p ('%04d' % 10) #=> "0010"
```

## 文字と文字コード

```
str = "a"
p code = str.ord #=> 97
p code.chr #=> "a"
```

## 日付、時間
```
p Time.now #=> 今の時間
p Time.local(2000) #=> 2000-01-01 00:00:00 +0000
p t = Time.local(2000, 1, 2, 3, 45) #=> 2000-01-02 03:45:00 +0000
# フォーマットで表示を指定
p t.strftime("%H:%M") #=> "03:45"
```

# 最後に
自分用にまとめただけですが、これが誰かの役に立てれば幸いです。

# 参考

- 指定フォーマットで文字列に変換する      
https://www.javadrive.jp/ruby/date_class/index5.html
- Rubyの文字列に対応する文字コードを返す方法【初心者向け】      
https://techacademy.jp/magazine/19641
- Ruby 配列が初心者でもわかる！７個の重要なメソッドも紹介      
https://udemy.benesse.co.jp/development/web/ruby-array.html
- 【Ruby入門】配列の基礎から応用的な使い方まとめ      
https://www.sejuku.net/blog/11504
- Rubyの配列で使えるメソッド、二次元配列の使い方      
https://qiita.com/dddisk/items/8ad2d5570edf3c577eea
- 言語別 0埋め数字を作成する方法      
https://qiita.com/tksmaru/items/0f9283d0c5f0ee716f2f
iptablesで外部への接続を遮断する

#1.はじめに

ipv6も使える環境だとだめだ。
知識が正しくないかも。

外部へのアクセス制限の方法を頑張って考えた。

##2.新規接続のDROP
自ホストからのコネクション開始を禁止します[^1]

###2.1.TCP

```bash
 iptables -t filter -I OUTPUT 1 -m state --state NEW -j DROP -p tcp
```

###2.2.UDP

```bash
 iptables -t filter -I OUTPUT 1 -m state --state NEW -j DROP -p udp
```

##3.1.特定のポートが宛先になっている通信を禁止する
dportで宛先をアクセス禁止にします。

###3.1.1.TCP only

```bash
iptables -A OUTPUT -p tcp --dport 80 -j REJECT --reject-with tcp-reset
iptables -A OUTPUT -p tcp --dport 443 -j REJECT --reject-with tcp-reset
```

##3.2宛先のポートを範囲指定してdrop
単純にdropします。well-knownポートの例。　[^4]
###3.2.1.TCP

```bash
iptables -A OUTPUT -p tcp --dport 1:1023 -j DROP
```

###3.2.2.UDP

```bash
iptables -A OUTPUT -p udp --dport 1:1023 -j DROP
```

##4.HTTPの内容を吟味して落とす
httpのみ、HTTPリクエストを盗み見てアクセス禁止できます[^2] [^5] [^6]

```bash
iptables -I OUTPUT -p tcp --dport 80 -m string --string "example.com" --algo kmp -j REJECT --reject-with tcp-reset
```

##5.Docker内でも
Docker内でiptablesを使う。[^3]

```
docker run -it --cap-add=NET_ADMIN ubuntu
```

#6. まとめ
外部に勝手にアクセスされることがなくなります。
Webホスティングで使えそう。

#おすすめ文献
https://unix.stackexchange.com/questions/203791/how-to-redirect-all-http-request-to-a-local-web-server
https://superuser.com/questions/505622/iptables-block-everything-except-http




[^1]: https://superuser.com/questions/923512/how-can-i-block-all-outbound-connections
[^2]: http://www.webhostingtalk.com/showthread.php?t=1623196
[^3]: https://reasonable-code.com/docker-iptables/
[^4]: https://qiita.com/dz_/items/bfc0d40ecac56b87294e
[^5]: https://superuser.com/questions/575912/redirect-block-outgoing-http-traffic-for-a-specific-url-in-ubuntu
[^6]: https://linuxsecurity101.com/2018/12/01/tips-and-tricks-blocking-http-requests-via-iptables-for-a-specific-domain/
Cloudwatch「StatusCheckFailed」系の監視メトリクスで障害発生テスト

## StatusCheckFailed_Instance
インスタンス毎のソフトウェアとネットワーク監視
サーバ停止してもデータなし扱いとなるので、障害テストできない

### 疑似障害発生方法

```
systemctl stop network
```

15:20前に、ネットワーク停止させた

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293481/62328eb9-ed7b-f82e-846b-76b20aea919f.png)

コンソール上から直接再起動してあげると復活

## StatusCheckFailed_System
インスタンスを使用するためのAWSインフラ全体の監視
疑似的な障害テストはできない

## StatusCheckFailed
`StatusCheckFailed_Instance`と`StatusCheckFailed_System`のどちらかが異常な場合、異常と判定する。
最低これだけチェックしておけばいい感じ？
Windows10でレガシーローカルアプリを設定するときの備忘録

#この記事の発端
 勤務先ではVB6ベースのローカルパッケージアプリがあり、顧客のサポートで現地対応して気付いたことの備忘録です。

#Windows7からの差異として意識すべきこと。
 * Windows7からフォルダごとデータ移行する際には、移行元のフォルダ等の属性が移行先のWindows10で邪魔をすることがある可能性がある。<Br>
 ⇒この場合、管理者権限でフォルダの所有権やアクセス権を編集するか、移行先に新しいフォルダを切ってファイルのみをコピーしたほうがいい。<Br>
 ⇒Robocopyでそのあたりを上手くコントロールしたほうが結果として良いのだろうと思います。

 * アプリ間連携時のファイルのIN/OUTがWindows7の時よりも注意が必要で、他のアプリから自アプリに書き出してもらう際のフォルダはインストール時のデフォルトが機能しない場合があるので、その場合は実行ユーザで新しいフォルダを作ったほうが良い場合もありそうです。

 * アプリの実行はProgramsFileでデータはProgramsDataに格納した方が良いでしょう。勤務先のソリューションではトラブルシュートの容易性からCドライブ直下をデフォルトにしていますが、このことがWindows10では実行環境としてのハンドリングを悪くしているようなので、それぞれ書き出せるなら然るべきディレクトリに移したほうがトラブルが減ります。
PowerShellの文字コードを変更する

Pythonでプログラムを作成したところ、日本語出力が文字化けをするので調べてみたら、PowerShellの文字コードが標準では「Shift-JIS」になっていることが原因でした。

次のように文字コードを調べられます。

```
chcp
```

これで「932」と表示されると、Shift-JISです。そこで、UTF-8に変更します。コードは「65001」です。

```
chcp 65001
```

これで、文字化けが直りました。
Laravelをhomestead環境で２つ以上管理する

#はじめに
プログラミング学習を始め半年強のため、知識がかなり不足しています。
間違っていることや理解が足りてない部分も多々あると思います。

Laravelで１つ目のプロジェクトとは異なるコンセプトで学習をするために新たなLaravelが構築できたので手順のメモです。


１つ目の構築は主に以下のサイトを参照しました。
https://qiita.com/7968/items/97dd634608f37892b18a

##手順
まずmacと仮想環境（vagrant）のフォルダを同期させます。
homesteadフォルダのhomestead.yamlを編集します。

```homestead.yaml
folders:
    - map: ~/code
      to: /home/vagrant/code

    - map: ~/laravel2
      to: /home/vagrant/laravel2

sites:
    - map: homestead.test
      to: /home/vagrant/code/public
      
    - map: homestead2.test
      to: /home/vagrant/laravel2/public
```
foldersはmac(map)とvagrant（to）の同期するフォルダの指定を
sitesはブラウザでアクセスした時の参照先を指定します。

##ブラウザの表示分け

homestead.yamlの冒頭にあるipアドレスにアクセスすると、１つ目のプロジェクトが出ると思います。
では２つ目を表示させるにはというと、先ほどのsitesです。

macのコンソールで

```
cd　homestead
```
homesteadに移動し、hostファイルを編集します。
macの場合は以下を入力します。


```
sudo vi /etc/hosts
```

以下を追加します
```１９２.000.00.00（先ほどのipアドレス）　homestead.test　homestead２.test
```
homestead.testはsitesのmapのことです。プロジェクト名にした方が分かりやすいかもしれません。
プロジェクトの数だけ、半角スペースを開けて追記します。
これで、ブラウザでhomestead.testと入力すれば、１つ目のプロジェクトが表示されるはずです。

**homestead.yamlを編集した後には必ず```vagrant reload --provision```を実行してください**

##２つ目のLaravelのインストール
私の環境下では、```vagrant ssh```でvagrantに入った後
```composer create-project laravel/laravel （新しいプロジェクト名） --prefer-dist
```
で２つ目のプロジェクトを構築します。

ブラウザでhomestead2.test（mapを参照)と入力した時に、Laravelの画面が出れば成功です。

###参考
https://www.hypertextcandy.com/multiple-projects-in-laravel-homestead
https://qiita.com/miutex/items/ebc13fc78da4a19a3da4
https://qiita.com/Yorinton/items/08ec8fefcbec71513399
Node.jsで地球時間をエオルゼア時間に変換する

ライブラリ見つけたのと、ちょっと使ってみたい場所を思いついたので覚書。

## npm i -D eorzea-time
エオルゼア時間を出してくれるライブラリ
https://github.com/flowercartelet/eorzea-time

## 使い方
現在時刻をエオルゼア時間へ変換します。

```javascript
const EorzeaTime = require('eorzea-time');

const eorzeaTime = new EorzeaTime();
console.log(eorzeaTime.toString());
02:47:22
```

## 指定した地球時間を変換する

コンストラクタにDateオブジェクトを投げれるので、指定日時をエオルゼア換算できます。

```javascript
const eorzeaTime = new EorzeaTime(new Date('2019/09/01 11:11:00'));
console.log(eorzeaTime.toString());
14:03:25
```

## その後
Alexaで教えてくれたら楽だなと思ったのでスキルにしました。
https://www.amazon.co.jp/dp/B07YMMQCMQ/

## そして
先客がいた模様。こっちの方が高機能な気がするのでアプデ頑張ろう。
https://www.amazon.co.jp/dyamada-エオルゼア時計-非公式/dp/B07BPJ7VCT
docker-composeとは

#docker-compose
複数のコンテナを使うDockerアプリケーションを定義・実行するツール。compo-seはアプリケーションのサービス設定に、composeファイルを使います。

#使用方法
composeを使うには、基本的に3つのステップを行います。
1. アプリケーションの環境をDockerfileファイルで定義します。
2. アプリケーションを構成するサービスをdocker-compose.ymlファイルで定義します。
3. 最後に、docker-compose up を実行したら、composeはアプリケーション全体を起動・実行します。