OmniAICreator/Qiita-1.07M huggingface dataset:
Fetchオブジェクトでの複数カラムの並び替え指定方法

SAS ViyaはAIプラットフォームです。PythonやJava、Rなどの言語を通して利用できます。そのSAS Viyaの中で使われているのがCASTableというテーブルオブジェクトです（CASはCloud Analytic Servicesの略です）。CASTableからデータを取得する方法は幾つかありますが、今回はFetchオブジェクトを使ったデータのソートについて、複数の方法を紹介します。

## SAS Viyaに接続する

まずはSAS Viyaに接続します。

```python
from swat import *

cashost='localhost'
casport=5570
useremail='dev@sas.com'
userpassword='password'
casauth='~/.authinfo'
conn = CAS(cashost, casport, useremail, userpassword, caslib="casuser")
```

## データをアップロードする

CSVファイルのデータをアップロードします。今回は有名なIRISのデータです。

```python
out = conn.upload('./iris.csv')
```

## Fetchオブジェクトを取得する

Fetchオブジェクトをconnから取得します。

```python
fa = conn.Fetch()
```

## ソートの基本形

まずは実行時に指定する方法です。sortbyを指定します。

```python
fa(table=dict(name='IRIS', caslib='casuser'), to=5, sortby=['SepalLength', 'SepalWidth'])
```

## set_paramsを利用

繰り返し使えるようにset_paramsで指定する方法です。複数カラムあるので、添字を使って指定します。

```python
fa.set_params('sortby.0.name', 'SepalLength',
              'sortby.0.formatted', 'raw',
              'sortby.1.name', 'PetalWidth',
              'sortby.1.formatted', 'raw')
```

## paramsプロパティを利用

paramsを指定して行うこともできます。こちらの方が直感的かも知れません。

```python
fa.params.sortby[0].name = 'PetalWidth'
fa.params.sortby[0].formatted = 'raw'
fa.params.sortby[1].name = 'PetalLength'
fa.params.sortby[1].formatted = 'raw'
```

## まとめ

いずれの方法でも並び替えが可能です。好みの方法をご利用ください。ぜひ、みなさんのSAS ViyaとPythonを使ったデータ分析に役立ててください。
axiosでクエリパラメータのシリアライズのフォーマットをカスタマイズする

axiosではparamsSerializerオプションを設定することで
クエリパラメータのシリアライズのフォーマットをカスタマイズすることができます。

デフォルト設定では配列のクエリパラメータは下記のようになります。

```javascript
//array=[1,2]

array[]=1&array[]=2
```
このクエリパラメータのシリアライズ処理を以下のようにカスタマイズしてみます。

```javascript
//array=[1,2]

array=1&array=2
```


## カスタマイズ
クエリパラメータの変換に使用させていただくライブラリはこちらです。
https://github.com/ljharb/qs

``` javascript
import qs from "qs";

//クエリパラメータのパーサ
const paramsSerializer = params =>
  qs.stringify(params, { arrayFormat: "repeat" });

//カスタマイズしたaxiosのインスタンスを生成します
const config = {
    paramsSerializer
}
const _axios = axios.create(config);
```

カスタマイズしたaxiosのインスタンスを使用すると
配列が**array=1&array=2**のようにシリアライズされます。
他にも色々なパターンにカスタマイズできるみたいですね。
kelpnetの作法 その8

# 概要

kelpnetの作法を調べてみた。
ライントレースやってみる。
運転してみた。

# 結果

何回やっても、2コーナークリアして、コースアウト。魔物が、住んでる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/6361e154-c99b-b5fc-7212-84681e99b2fa.png)

# サンプルコード

```
using UnityEngine;
using KelpNet;
using System;

public class pc3 : MonoBehaviour
{
    [SerializeField]
    private Camera dispCamera;
    [SerializeField]
    private SpriteRenderer bod;
    [SerializeField]
    public float val;
    private Texture2D tex0;
    Function testnn;
    void Start()
    {
        var tex = dispCamera.targetTexture;
        tex0 = new Texture2D(tex.width, tex.height, TextureFormat.ARGB32, false);
        testnn = ModelIO.Load(Application.dataPath + "/test.nn");
    }
    void Update()
    {    
        var tex = dispCamera.targetTexture;
        Texture2D tex1 = new Texture2D(40, 40, TextureFormat.ARGB32, false);
        Texture2D tex2 = new Texture2D(40, 40, TextureFormat.ARGB32, false);
        Texture2D tex3 = new Texture2D(40, 40, TextureFormat.ARGB32, false);
        Texture2D tex4 = new Texture2D(40, 40, TextureFormat.ARGB32, false);
        Texture2D tex5 = new Texture2D(40, 40, TextureFormat.ARGB32, false);
        float v1;
        float v2;
        float v3;
        float v4;
        float v5;
        RenderTexture.active = dispCamera.targetTexture;
        tex0.ReadPixels(new Rect(0, 0, tex.width, tex.height), 0, 0);
        tex0.Apply();
        tex1.ReadPixels(new Rect(10, 200, 40, 40), 0, 0);
        tex1.Apply();
        tex2.ReadPixels(new Rect(60, 200, 40, 40), 0, 0);
        tex2.Apply();
        tex3.ReadPixels(new Rect(110, 200, 40, 40), 0, 0);
        tex3.Apply();
        tex4.ReadPixels(new Rect(160, 200, 40, 40), 0, 0);
        tex4.Apply();
        tex5.ReadPixels(new Rect(210, 200, 40, 40), 0, 0);
        tex5.Apply();
        val = Sense(tex0);
        v1 = Sense(tex1);
        v2 = Sense(tex2);
        v3 = Sense(tex3);
        v4 = Sense(tex4);
        v5 = Sense(tex5);
        Real[] s = new Real[] {
            v1,
            v2,
            v3,
            v4,
            v5
        };        
        NdArray res = testnn.Predict(s)[0];
        float x = 0;
        float y = 0;
        if (res.Data[0] > res.Data[1] && res.Data[0] > res.Data[2])
        {
            y = Time.deltaTime * 0.5f;
        }
        if (res.Data[1] > res.Data[0] && res.Data[1] > res.Data[2])
        {
            x = Time.deltaTime * -50.0f;
        }
        if (res.Data[2] > res.Data[0] && res.Data[2] > res.Data[0])
        {
            x = Time.deltaTime * 50.0f;
        }
        transform.Rotate(0, 0, x);
        transform.Translate(0, y, 0);
        Sprite spr = Sprite.Create(tex0, new Rect(0.0f, 0.0f, tex.width, tex.height), new Vector2(0.5f, 0.5f));
        bod.sprite = spr;
    }
    private float Sense(Texture2D tex)
    {
        var cols = tex.GetPixels();
        var avg = new Color(0, 0, 0);
        foreach (var col in cols)
        {
            avg += col;
        }
        avg /= cols.Length;
        return avg.grayscale;
    }
}

```

以上。
Re:ゼロから始めて rust を完全に理解する　その１　

## ここを見て0からrustを勉強し始めた
https://doc.rust-jp.rs/the-rust-programming-language-ja/1.6/book/README.html
予備知識として、ワイC言語10年くらいやってて、ここ5年くらいはphp、pythonあたりをメインに触っとる程度を前提に書くンゴ。


## インストールまで完全に理解した
割愛。
アホでもできる。

## 3.1. 数当てゲーム 完全に理解した
https://doc.rust-jp.rs/the-rust-programming-language-ja/1.6/book/guessing-game.html
↑こいつを見ていく

### まずはプロジェクト作成、余裕、完全に理解した。

```
$ cargo new guessing_game --bin
$ cd guessing_game
```

### 外部クレート（パッケージ）を使用するのでCargo.tomlに追記
dependencies に randを追記、バージョンを現時点最新のを指定してみた。

```
[dependencies]

rand="0.4.6"
```

### まずはソースの完成形、完全に理解したわ

``` rust
extern crate rand;

use std::io;
use std::cmp::Ordering;
use rand::Rng;

fn main() {
    println!("Guess the number!");

    let secret_number = rand::thread_rng().gen_range(1, 101);

    loop {
        println!("Please input your guess.");

        let mut guess = String::new();

        io::stdin().read_line(&mut guess)
            .expect("Failed to read line");

        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };

        println!("You guessed: {}", guess);

        match guess.cmp(&secret_number) {
            Ordering::Less    => println!("Too small!"),
            Ordering::Greater => println!("Too big!"),
            Ordering::Equal   => {
                println!("You win!");
                break;
            }
        }
    }
}
```

### ソース、ちょい掘り下げて
#### ①
外部クレートのrandを使えるようにする明示的宣言、Cの外部関数extern宣言と同じような意味合い。
externしなくても use rand::Rng があればコンパイル通る

```rust
extern crate rand;
```

#### ②
！が付いてるのは関数じゃなくマクロ

```rust
println!("Please input your guess.");
```

#### ③
let 変数束縛を作る。他言語と一番の違うのがこの辺、ここさえ乗り切ればrust完全に理解できると思う。
変数束縛とか言って、変数名に対して値を束縛する、とか言って所有権という概念が生まれる。
rustの言語の仕様として「Rustは与えられたリソースに対する束縛が 1つだけ あるということを保証する」

んで、変数束縛定義にmutを付けない場合、イミュータブルとか言って書き換え不可の定数になる。
gen_range(1, 101);は数値型を返され、secret_numberという変数に1～100の乱数が入る、
secret_numberがある数値を束縛する、secret_numberがこの乱数のリソースの所有権を持つ。

```rust
let secret_number = rand::thread_rng().gen_range(1, 101);
```

#### ④
書き換え可能な変数作成は明示的にmutを付ける必要がある、ミュータブルとか言うやつ。
let mut guess = String::new();　の場合、guessという名前の変数にはString型のデータが入る。
String型にはポインタが含まれる、ので、この guess を別の変数に代入した場合、
guessとその別の変数はそれぞれ、同じアドレスを参照するポインタを持つことになるので、
同じリソースに対する束縛が同時に二つ存在することになる。
「Rustは与えられたリソースに対する束縛が 1つだけ あるということを保証する」ので、guess所有権が別の変数に渡され、
guess に対するアクセスができなくなる。
　let aaa = guess;
  println!("{}", guess); <= ここでコンパイルエラーになる。

```rust
let mut guess = String::new();
```

#### ⑤
stdinのread_lineで入力された文字列をguessに入れる。この辺は直感的に理解できるが、
read_line(&mut guess) 見慣れない。read_lineの引数が&mut参照型なのでこうやって渡す必要がある。
ミュータブルの参照型で、参照先で変数を書き換え可能になる。
かつ、&を付けて参照で渡していると、所有権を渡すのではなく、借用することになる、スコープから外れると所有権が自動で元の束縛に戻る。
なので、read_line(&mut guess) でguessが束縛しているリソースをread_lineに借用、read_lineから抜けると自動的にguessに所有権が戻る。
上記④のようなコンパイルエラーが起きなくなる。

```rust
io::stdin().read_line(&mut guess)
            .expect("Failed to read line");
```

長くなったので一旦区切り

続く。
axiosでファイルダウンロード処理を実装(IEにも対応)

ダウンロードの仕組みはブラウザにて実装状況が異なるようです。

File APIを使ったダウンロードの仕組みが有名ですが、
IEではwindow.URL.createObjectURL()を使用するとおかしくなるみたいです。

File APIのブラウザによる差を吸収してくれるfileSaverというライブラリがあるため、
そちらを使用するとIEでも問題なくダウンロードできるようになります。

[fileSaver - GitHub](https://github.com/eligrey/FileSaver.js)

## ダウンロード処理の例

```javascript
import { saveAs } from "file-saver";
import axios from "axios";

function download(params = {}){
	axios.get(apiUrl, {
	          params,
	          responseType: "blob"
	        })
	        .then(response => {
	          const blob = new Blob([response.data], {
	            type: response.data.type
	          });

	          //レスポンスヘッダからファイル名を取得します
	          const contentDisposition = response.headers["content-disposition"];
              const fileName = getFileName(contentDisposition)

              //ダウンロードします
	          saveAs(blob, fileName);
	})
}

function getFileName(contentDisposition){
    let fileName = contentDisposition.substring(contentDisposition.indexOf("''") + 2,
                                                contentDisposition.length
                                                );
    //デコードするとスペースが"+"になるのでスペースへ置換します
    fileName = decodeURI(fileName).replace(/\+/g, " ");

    return fileName;
}
```
axiosでエラーのレスポンスをinterceptorsでハンドルする

エラーのレスポンスを共通処理としてハンドルするために
axiosのinterceptorsを使用する時の手法のメモです。


axiosでAPIをリクエストした際、エラーの場合はこんなJSONが返ってくるとします。

```エラーのレスポンス例.json

{
  "errors": [
    {
      "code": "XXXXX"
      "message": "画像が削除されています。"
    }
  ]
}
```




##通常のエラーパターン
responseTypeがjsonの場合など、通常は**error.response.data**を使用します。

```javascript

axios.interceptors.response.use(
  function(error) {
    const errors = error.response.data.errors;
    if(errors){
      for (const item of errors) {
        console.log(item.message);
      }
    }
  }
);
```

##レスポンスタイプがBlobのパターン
レスポンスのタイプがBlobの場合はerror.response.dataには**Blob形式でエラーレスポンスのJSONが設定されています。**
そのため、error.response.dataをBlobからJSONに変換します。

```javascript

axios.interceptors.response.use(
  async function(error) {
    //Blobの場合でJSONを読み込むためのハンドリングを追加します。
    await onBlobHandler(error);

    const errors = error.response.data.errors;
    if(errors){
      for (const item of errors) {
        console.log(item.message);
      }
    }
  }
);

//BlobをJSONに変換します。
async function onBlobHandler(error) {
  if (error.request.responseType === "blob") {
    const text = await fileReader(error.response.data);
    return JSON.parse(text);
  }
}
```
※fileReaderはBlobを読み込む自作ヘルパー関数です
下記記事参照
[【JavaScript】Blobの中身をJSONに変換する](https://qiita.com/koushisa/items/4a3e98358a7ce110aeec)
Unity C# シングルトンを継承した抽象クラスの実装

シングルトンを継承しようと思うと、意外とどう書いたら良いか分からなかったりするのでメモします。
用途としてはプロジェクトごとに使うライブラリとして用意する場合などです。

Monobehaviourのシングルトン（存在しない場合に生成しても良い）

```csharp
    public abstract class SingletonObject<T> : MonoBehaviour where T : SingletonObject<T>
    {
        static protected T _instance = null;
        static public T instance => _instance ?? (_instance = FindObjectOfType<T>());
    }
```

シングルトンを継承した抽象クラス

```csharp
    public abstract class ManagerBase<T> : SingletonObject<T> where T : ManagerBase<T>
    {
    }
```

シングルトンを継承した抽象クラスを継承したクラス

```csharp
    public class Manager : ManagerBase<Manager>
    {
    }
```
[UE4] 関数を文字列で呼び出して実行する

UE4 は様々なリフレクション的コードを自動生成し、それを利用して Blueprint の実行やオブジェクトのロードなどが行われています。

今回はこの仕組を利用して、C++コードで関数を文字列で呼び出してみます。

## リフレクションコードの生成

リフレクションコードを生成させるには、 `UCLASS(...)` と `UFUNCTION(...)` マクロを利用します。

```c++
UCLASS()
class FunctionTest: public UObject
{
    GENERATED_BODY()

protected:
    UFUNCTION()
    void CallableFunction(const FString& arg0)
    {
        UE_LOG(LogTemp, Log, TEXT("CallableFunction: %s"), *arg0);
    }
};
```

## リフレクションを使って呼び出し

```c++
auto Obj = NewObject<FunctionTest>();
FName FuncName = TEXT("CallableFunction");
check(Obj);
auto FuncDelegate = TBaseDelegate<void, const FString>::CreateFunction(Obj, FuncName);
FuncDelegate.ExecuteIfBound(TEXT("hogehoge"));
```

デバッグ用機能などで便利かもしれない。
[UE4] コマンドレットを使って、コマンドラインに任意の処理を実装する


# コマンドレットとは
コマンドラインから実行可能な、UE4エンジンに組み込まれたコマンドラインアプレットです。
開発中の様々な処理を、UE4エディタのパワフルな機能を用いて自動化することが可能になります。
デフォルトで多くのコマンドレットが提供されています。
UCommandlet | Unreal Engine http://api.unrealengine.com/INT/API/Runtime/Engine/Commandlets/UCommandlet/index.html
Commandlets | Unreal Engine http://api.unrealengine.com/INT/API/Editor/UnrealEd/Commandlets/index.html

# コマンドレットを実装
コマンドレット名は `TestCmdFunction` とします。
`UCommandlet` を継承して、 `int32 Main(const FString&)` をオーバーライドします。

```c++:TestCmdFunctionCommandlet.h
#pragma once
#include "CoreMinimal.h"
#include "Commandlets/Commandlet.h"
#include "TestCmdFunctionCommandlet.generated.h"

UCLASS()
class UTestCmdFunctionCommandlet : public UCommandlet
{
	GENERATED_UCLASS_BODY()
	
public:
	virtual int32 Main(const FString& CmdLineParams) override;
};
```

`Constructor` と `int32 Main(const FString&)` を実装します。

```c++:TestCmdFunctionCommandlet.cpp
#include "TestCmdFunctionCommandlet.h"

DEFINE_LOG_CATEGORY_STATIC(LogTestCmdFunctionCommandlet, Log, All);

UTestCmdFunctionCommandlet::UTestCmdFunctionCommandlet(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
{
	LogToConsole = false;
}

int32 UTestCmdFunctionCommandlet::Main(const FString& CmdLineParams)
{
	FString Value;
	if (FParse::Value(*CmdLineParams, TEXT("param0="), Value))
	{
		UE_LOG(LogTestCmdFunctionCommandlet, Display, TEXT("param0=%s"), *Value);
		return 0;
	}
	return 1;
}
```

# コマンドレットを呼び出す

```shell
/PATH/TO/ENGINEROOT/Engine/Binaries/Win64/UE4Editor-Cmd.exe /PATH/TO/PROJECTROOT/MyGame.uproject -run=TestCmdFunction -param0=hogehoge -stdout -UTF8Output
```
Linuxのプロキシ設定

#OS全体にプロキシ設定

*設定ファイル更新*

```ruby:/etc/profile
最下行に以下を追記

PROXY='プロキシサーバURL:80' # proxyサーバのドメインとポートを指定
export http_proxy=$PROXY
export HTTP_PROXY=$PROXY
export https_proxy=$PROXY
export HTTPS_PROXY=$PROXY
```

*設定反映*
`source /etc/profile`
AWS Educate①：AWS Educateへの登録

# はじめに
アルバイトでAWSを使用しているのですが，知識がまだまだ不十分で，勉強するためにAWS Educateに登録してみたいと思います．
AWS Educateというのは．．．
>AWS Educate は Amazon のグローバルイニシアティブとして、クラウド技術のスキルを身に付けるための総合的なリソースを学生に提供します。AWS Educate は実世界の応用学習経験に焦点を置いた学習コンテンツで、若い学習者が自分のペースでクラウドコンピューティング技術を学ぶことができます。これらのクラウドコンピューティングは、人工知能、音声認識、顔認識、ゲーム、医療の進歩などの分野でイノベーションの推進力となります。

>14 才以上の方は無料で AWS Educate に参加し、クラウドの学習を始められます。また最高 75 USD の AWS プロモーションクレジットも受け取ることができます。

[AWS Educate参加方法 - Amazon Web Services](https://aws.amazon.com/jp/education/awseducate/14-and-older/)


簡単にいうと，AWS Educateに登録することにより

- クラウド関連の学習ができる
- 一定額のAWSクレジットが毎年もらえる

ということです．

早速登録したいと思います！


# AWS Educateへの登録
[AWS Educate](https://aws.amazon.com/jp/education/awseducate/)にアクセスして，
「AWS Educateに参加」
をクリックします．その後は

1. Student を選択
2. 学校情報や氏名を入力します．
3. 利用規約に同意し，Submit
4. メールが送られてきます．
5. メール内のリンクを開くとメール認証が完了します．
6. 半日〜1日待つと「AWS Educate Application Approved」という件名のメールが届きます．（私は8時間後に届きました）
7. メール内のリンクをクリックしてパスワードを設定します．
8. Preffered LanguageをJapaneseにします．

これで完了です．

# おわりに
今回はここまでです．
次回はAWSのアカウントで，AWSのサービスにアクセスしてみたいと思います！

以上Qiita初記事でした！
間違っている点があれば，教えていただけると嬉しいです．
CentOS7.6 IPアドレス恒久設定

必要な情報は適宜書き換えて使用してください。
★=書き換え箇所

`vi /etc/sysconfig/network-scripts/インターフェイス名`


```ruby:vi&nbsp;/etc/sysconfig/network-scripts/ifcfg-ens192
HWADDR="★MACアドレス"
TYPE="Ethernet"
BOOTPROTO="none"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
NAME="★ens192"
UUID="★"
ONBOOT="yes"

# IP Address
IPADDR="★設定したいIPアドレス
# Subnet Mask
NETMASK="★サブネットマスク"
# Default Gateway
GATEWAY="★デフォルトゲートウェイ"
# DNS Server
DNS1="★DNSサーバ"
ZONE=public
```
Twitterのシェアボタンの「ツイートが投稿されました」を自動で閉じるChrome拡張機能

# タブが「ツイートが投稿されました」で埋め尽くされる現象
ありませんか？
YouTubeでボーカロイド曲(公式でアップロードされた奴)とかをTwitterでシェアしまくって、タイムラインを荒らすと、私自身のタブも荒らされますよね。サイトによっては新しいウィンドウで表示されて自動で閉じてくれるのもありますが、閉じてくれないのもあります。
そんなときに思ったのが、自動で閉じてくれたら便利じゃね？ということで作ってみました。

# 成果物
chrome ウェブストアで公開していますのでよろしくお願いします。

- [chrome ウェブストア - Twitter共有後自動でタブ閉じるやぁーつ](https://chrome.google.com/webstore/detail/twitter%E5%85%B1%E6%9C%89%E5%BE%8C%E8%87%AA%E5%8B%95%E3%81%A7%E3%82%BF%E3%83%96%E9%96%89%E3%81%98%E3%82%8B%E3%82%84%E3%81%81%E3%83%BC%E3%81%A4/ldojddehglihokneoidheogolgnllnpm)

# ソースコードなどの軽い説明
ファイル構成はこんな感じです。

- manifest.json
- background.js
- icon.png

とてもシンプルです。

## manifest.json

```javascript:manifest.json
{
    "manifest_version": 2,
    "name": "Twitter共有後自動でタブ閉じるやぁーつ",
    "short_name": "TweetAutoClose",
    "description": "ブログやサイトなどに置かれているTwitterの共有ボタンから記事などを共有後の「ツイートが投稿されました」のページを自動で閉じる拡張機能です。",
    "version": "1.0.2",
    "icons": {
        "128": "icon.png"
    },
    "background": {
        "scripts": [
            "background.js"
        ],
        "persistent": false
    },
    "permissions": [
        "tabs"
    ]
}
```
常に実行するJSを登録してます。
これですが、TwitterのURLのみ実行するJSを登録してそっちでタブを閉じる処理にしても良い気がしてきました。
というかむしろその方が良いでしょう。


## background.js
```javascript:background.js
chrome.tabs.onUpdated.addListener(function (tabId, changeinfo, tab) {
    if (~tab.url.indexOf("https://twitter.com/intent/tweet/complete")) {
        if (changeinfo.status === "complete") {
            chrome.tabs.remove(tabId);
        }
    }
});
```
毎回タブの更新を受け取るListenerです。このListenerで読み込み終了したタブが`https://twitter.com/intent/tweet/complete`だった場合タブを閉じるという感じです。

シンプルですが、まだ改善の余地がありそうです。

#さいごに
ひとまずこれでTwitterでシェアをするのが楽になったので良かったと思います。
まだまだ、改善の余地がありますが良い機会でした。
こちらもよろしくです。

- [YouTubeやdアニメなどの動画を操作できるショートカットを追加するChrome拡張を作った。](https://qiita.com/noriokun4649/items/9ebdcc4775c3a8c396ad)

#2020/06/01　追記
Twitterの仕様が変わったので上記の方法では、うまく動かなくなりました。

```javascript:background.js
let urlhistory;
chrome.tabs.onUpdated.addListener(function (tabId, changeinfo, tab) {
    if (changeinfo.status === "complete") {
        if (~tab.url.indexOf("https://twitter.com/")) {
            if (urlhistory.indexOf("https://twitter.com/intent/tweet") === 0) {
                chrome.tabs.remove(tabId);
            }
        }
        urlhistory = tab.url;
    }
});
```
なかなか良い方法が思いつかなかったため、とりあえず変数に投稿画面移行前のURLを記憶させておき、`https://twitter.com/intent/tweet`からツイート後に`https://twitter.com/`へリダイレクトされたら、タブを閉じるようにしてみました。リファラーから判断するのも考えましたが、なかなかうまくいかなかったため、このような強引な形になってしまいました。
※この方法、投稿画面開いてすぐ投稿しないと機能しないことに気づいた。気が向いたら治します。
FT（フォールトトレラント）サーバ概要とセットアップ

#FT（フォールトトレラント）サーバとは

・NEC製(中身はスパルタス社製)
・CPUやメモリなどが2個ずつ搭載されており、常に同調処理が走っているため片方が壊れても即時復旧可能
・オンライン保守が可能
・基本的にOSはプリインストール済み

##■セットアップ方法
・UPSにネットワークアダプタ取り付け

・UPS初期セットアップ後、電源ケーブルを差し込みFTサーバの電源をON

・F2押して監視無効設定、PowerConfiguretionを設定（時間はデフォルトのまま：50秒）

・escにてOS再起動後、Windows初期セットアップ

・CDよりExpressBuilderを起動し、ESMPROServerManagerをインストール
　（基本デフォルトでOK、インストール後CDは必ず抜く）

・ネットワークポートの判別（ケーブルを差し込み、リンクアップしたアダプタの名称変更
*（例）10Gb_#0_Port1）*

※構築環境によって古いハブを使用している場合、10GBを認識しない可能性がある。
その為、要望がない限りは基本的には1GBアダプタを使用することが多い

・コマンドプロンプトで`ipconfig /all`を実行し、MACアドレスを取得しておく
※後ほどのNICチーミングによってMACアドレスが隠れてしまう

・サーバマネージャよりNICチーミングを有効にする。（チーム名：Team_10Gb_Port1）

・RDRユーティリティよりVD作成、及び二重化（Duplex）ディスクを追加

・ディスクの拡張（拡張は足し算）、追加

・サービスよりSNMPトラップをローカル（127.0.0.1）に送付
→ESMPROServerManager起動確認、及びSNMP受信確認

・付属CDよりAC Enterprise、AutomaticRunningContorollerのインストール

・OS再起動→監視有効化

・ホスト名設定

・Cドライブの仮想メモリ（33168MB：32GB*1024+400MB）の設定

・指定がなければメモリダンプの種類はカーネルダンプ

・「Windowsスタートメニュー」-「BMC Configuretion」より固有情報のバックアップ

・スタートアップより表示されているチェックリストを閉じる。

・UPSのメニューより「設定」「ステータスカスタム」「EMCアドバンスド」「IP設定」

・スイッチ経由でケーブリングし、疎通確認AC Management Consoleより電源制御グループに「冗長化電源」
→電源装置を右クリックしてUPSの情報登録
→IEよりUPSのIPを指定しアクセス
→「Configuretion」「Network」「SNMPv1」「 AccessType」を「Write+」へ

・AC Management Consoleより制御端末を右クリックし自身のIP登録

・WindowsUpdateの実施

・OS再起動後、FTランプが点灯したら「Windowsスタートメニュー」-「FTサーバユーティリティ」より縮退テストを実施

・UPS電源テスト
→電源は2本同時に抜く


##セットアップ時間
おおよそ5時間程
ローカルgitリポジトリのサイズをできるだけ小さくして開発する

１万コミット超えてて、依存モジュール入れると1GB超えるリポジトリとかでの対応

- 15,000コミット越えすると、Sourcetreeがよく固まる


## TL;DR

- `--depth 1`指定して一番上のコミットだけ取ってくる
- `FETCH_HEAD` 使って、ブランチ追加にも対応

## 割り切り

- ソースの履歴の検索はgitub上で

## 最新コミットだけ取ってくる

開発環境セットアップとか、最初のPR投げるとことか

```sh
# HEADだけ取ってくる
git clone --depth 1 git@github.com:hoge-dev/hoge-accounts.git develop
```

## 「このチケット対応は、xxxブランチからブランチ切って」系

```sh
git fetch origin PIV-123_version_up
git checkout -b PIV-123_version_up FETCH_HEAD
```

## TODO

- fetch origin hogeも`--depth 1`でとりたい
IntelliJ で利用しているプラグイン

# 概要

今回は自分が IntelliJ で利用して便利だと思ったプラグインの紹介です。タイトル通りなので早速ですが紹介に。

※ 言語系のサポートプラグインは原則除いてます。

# IntelliJ プラグイン

* [Markdown Navigator](https://plugins.jetbrains.com/plugin/7896-markdown-navigator)
    * Markdown サポート用プラグイン
    * GFM 対応
    * 今の所一番使いやすい
* [PlantUML integration](https://plugins.jetbrains.com/plugin/7017-plantuml-integration)
    * PlantUML サポート用プラグイン
    * [PlantUML](http://plantuml.com/ja/)とは
        * UML(シーケンス図・クラス図など)をテキスト表現出来るツール・言語
    * Markdown Navigator 同様ドキュメントを書くときに便利
* [Save actions](https://plugins.jetbrains.com/plugin/7642-save-actions)
    * ファイル保存時に自動でコードフォーマットなどをしてくれる
    * 編集した範囲のみ変更などにも対応
    * コード整形に意識が薄くフォーマッターの実行を忘れやすい人に特におすすめ

# 気になってるプラグイン

* [IDEA Mind Map](https://plugins.jetbrains.com/plugin/8045-idea-mind-map)
    * マインドマップ用プラグイン
    * この手の思考整理含むドキュメントを管理できるプラグインはいろいろ気になる
* [Key Promoter X](https://plugins.jetbrains.com/plugin/9792-key-promoter-x)
    * 繰り返し行っている作業のショートカットを教えてくれるらしい
    * 邪魔な可能性もあるけど一度使って見ようと思う
* [CodeStream](https://plugins.jetbrains.com/plugin/12206-codestream)
    * github で十分な気もしつつタイミングみて利用して見る予定
#Rails + #MySQL で where と or 条件を連結させるのが冗長なので何もしないダミーの where 句を作ってみる

`where('false')` を最初に書く。

```rb
User
  .where('false')
  .or(User.where(id: 1))
  .or(User.where(id: 2))
  .or(User.where(id: 3))
```

上のクエリ自体は特に意味のない例。

生成されるクエリはこんな感じ。

```rb
SELECT `users`.* FROM `users` WHERE ((((false) OR `users`.`id` = 1) OR `users`.`id` = 2) OR `users`.`id` = 3)
```

なんかネストが微妙な気がするけどOR条件だし構わないでしょ。多分。



# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2239








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
esxcli 各種確認コマンド

##インターフェイスの確認
`esxcli network ip interface list`

```
[root@vmware:~] esxcli network ip interface list
vmk0
   Name: vmk0
   MAC Address: 00:xx:xx:xx:xx:xx
   Enabled: true
   Portset: vSwitch0
   Portgroup: Management Network
   Netstack Instance: defaultTcpipStack
   VDS Name: N/A
   VDS UUID: N/A
   VDS Port: N/A
   VDS Connection: -1
   Opaque Network ID: N/A
   Opaque Network Type: N/A
   External ID: N/A
   MTU: 1500
   TSO MSS: 65535
   Port ID: 33554440
```

##IPアドレス情報(IPv4)
`esxcli network ip interface ipv4 get -i インターフェイス名`

```
[root@vmware:~] esxcli network ip interface ipv4 get -i vmk0
Name  IPv4 Address  IPv4 Netmask   IPv4 Broadcast  Address Type  DHCP DNS
----  ------------  -------------  --------------  ------------  --------
vmk0  192.168.1.1  255.255.255.0  192.168.1.255  STATIC           false
1
2
3
4
[root@vmware:~] esxcli network ip interface ipv4 get -i vmk0
Name  IPv4 Address  IPv4 Netmask   IPv4 Broadcast  Address Type  DHCP DNS
----  ------------  -------------  --------------  ------------  --------
vmk0  192.168.1.1  255.255.255.0  192.168.1.255  STATIC           false

```
##IPアドレス情報(IPv6)

`esxcli network ip interface ipv6 get -n インターフェイス名`

```
[root@vmware:~] esxcli network ip interface ipv6 get -n vmk0
Name  DHCPv6 Enabled  Router Adv Enabled  DHCP DNS
----  --------------  ------------------  --------
vmk0           false               false     false
1
2
3
4
[root@vmware:~] esxcli network ip interface ipv6 get -n vmk0
Name  DHCPv6 Enabled  Router Adv Enabled  DHCP DNS
----  --------------  ------------------  --------
vmk0           false               false     false
```

##DNS情報
`esxcli network ip dns server list`

```
[root@vmware:~] esxcli network ip dns server list
   DNSServers: 192.168.1.2, 192.168.1.3

[root@vmware:~] esxcli network ip dns search list
   DNSSearch Domains: rootlinks.net
1
2
3
4
5
[root@vmware:~] esxcli network ip dns server list
   DNSServers: 192.168.1.2, 192.168.1.3
 
[root@vmware:~] esxcli network ip dns search list
   DNSSearch Domains: rootlinks.net

```

##経路情報(IPv4)
`esxcli network ip route ipv4 list`

```
[root@vmware:~] esxcli network ip route ipv4 list
Network       Netmask        Gateway       Interface  Source
------------  -------------  ------------  ---------  ------
default       0.0.0.0        192.168.1.4  vmk0       MANUAL
192.168.1.0  255.255.255.0  0.0.0.0       vmk0       MANUAL
1
2
3
4
5
[root@vmware:~] esxcli network ip route ipv4 list
Network       Netmask        Gateway       Interface  Source
------------  -------------  ------------  ---------  ------
default       0.0.0.0        192.168.1.4  vmk0       MANUAL
192.168.1.0  255.255.255.0  0.0.0.0       vmk0       MANUAL
esxcli network
```
.NetCoreなプロジェクトをCircle CIと連携させる話

# .NetCoreなプロジェクトをCircle CIと連携させる話

## 経緯
会社に所属してCIの良さがジワジワと伝わり、自分のプロジェクトにも導入したくなり居ても立っても居られなくなったため、勉強も兼ねて試すことになりました。
今回やりたいことは以下の通りです。

+ リモートへプッシュする度にビルドとテストを走らせる
+ GitHub上でマージした後にビルドとテストを走らせる
+ 時々見るカッコいいマークを出したい　→![2019y07m03d_040904676.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135859/9215ecb5-a935-b5df-351b-c0c1e60a1cc5.png)（これ）

## 手順

### 用意するもの
+ GitHubアカウント
+ .NetCoreなプロジェクト（**.NetFrameworkはダメ**）


### 1.リポジトリを用意
まずはCircle CIに認識してもらうためのリポジトリを用意します。
テスト用のプロジェクトでも既存のプロジェクトでも構わないのでGitHub上に作成し、コミットしておきましょう。

## 2.Circle CIアカウント準備 
[公式サイト](https://circleci.com)に飛び、**SignUp** -> **SignUp with GitHub**で
GitHubのアカウントを利用してアカウントを作成します。
この際、GitHubのアカウントにOrganizationsの関連付けが行われていると、権限等の関係で全ての機能が扱えない事があるため、
Organizations先に導入しない場合は左上のアイコンから自分のものを選択してアカウントを切り替えておく必要があります。
![2019y07m03d_042810256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135859/bb6bf782-2be2-a7e7-eb1e-c711598e942e.png)

## 3.Circle CIにリポジトリ関連付け
Add Projectsタブへ移動し、認識させたいプロジェクトのSetUp Projectを押します。
すると、以下のようなページが表示されます。
![2019y07m03d_050521331.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135859/404003c7-6306-cb08-599a-16bdaa7a037b.png)

この段階では1は無視して構いません...が、初回のテストが必ず失敗してしまうので、
それが嫌な人は先に[設定ファイルを作成](#4-設定ファイルを作成)を済ませてmasterへ反映しておきましょう。

2のStartBuildingを押すと、晴れてmasterブランチを対象にCIが回り始めます。
ビルドの状況は左のJobsタブにて確認できます。

![2019y07m03d_051910140.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135859/7142c81b-6d78-2ff2-def1-fa648a6aa146.png)

まだ**何を持って「成功」なのかが定義されていない**ので、このように表示されていればOKです。
ビルドの失敗を見届けたら、設定ファイルを作成する準備を行います。

左のタブからSettings -> Projects -> 対象プロジェクトの右上にある歯車 -> Environment Variables　と進みます。
ここで設定ファイルで使用する環境変数を定義します。

Add Variableを押し、Nameを`SolutionName`に、Valueに**プロジェクトのslnファイルへのパスを記述**します。
`SolutionName`は後述する設定ファイルの変数と名前があっていればOKです。
次はいよいよ設定ファイルを作成します。

## 4 設定ファイルを作成

Circle CIの設定ファイルは、
`リポジトリのルート/.circleci/config.yml` に配置します。
地味に詰まるポイントとして、Windowsで`.`から始まるフォルダやファイルを作成する際は、末尾にも`.`を入れることで正しく作成することができます。

コンフィグファイルの記法に関しては[ここ](https://circleci.com/docs/ja/2.0/sample-config/#section=configuration)にまとまっています。
CircleCIは比較的しっかりしたドキュメントが多いので、詰まった際に改めて読んでみると幸せになる事があります。

以下は今回使用するYAMLです

```yaml:config.yml
version: 2.1
jobs:
  build:
    docker:
      - image: microsoft/dotnet:2.2-sdk
    steps:
      - checkout
      - run: dotnet restore
      - run: dotnet build $SolutionName
workflows:
  version: 2.1
  buildAll:
    jobs:
      - build
```

```yaml
    docker:
      - image: microsoft/dotnet:2.2-sdk
```
人によってはここでウッっとなったかもしれません。
私自身、設定ファイルを書いて初めて気づいたのですが、**CircleCIのジョブはDockerのコンテナ上で実行**されます。
これがCircleCIを使う一番のメリットなように感じました。

記述が終わったら、どこかのブランチにコミットしてリモートへプッシュして下さい。ただし、**手順3を飛ばしている場合はmasterブランチへ反映**する必要があります。

# 5. CIが回っているか確認

CircleCIへの関連付けが成功していれば、リモートへプッシュした段階でCircleCIが回り始めるはずです。
![2019y07m03d_053331132.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135859/fd2e5d70-cee7-4a94-c8ea-bb305133db85.png)

これで導入は完了です。
ここからは自分のプロジェクトに合うように設定ファイルをカスタマイズしていくことになります。
はじめまして

# 乾伸一郎すき
……大変失礼いたしました。
この記事はQiitaの練習を兼ねた自己紹介になります。
次節からちゃんと説明していきますのでご安心を。
それはそれとして忍者系VTuber[乾伸一郎](https://www.youtube.com/channel/UC8QEgcJgjrJWy4B43aXxsAQ)もすこれ:heart:

# 誰？
主にニコニコ動画にて、年1,2本程度のまったりペースで活動しているおじさんです。
「[バーチャルデビルマン](https://www.nicovideo.jp/watch/sm33109604)の中の人です」って言った方が通じるでしょうか？
動画をご覧の方はご存じかと思いますが、生粋のショタコンです。真白友也をすこれ。

# 何しにきたの？
これまでもROM専としてQiitaには大変お世話になっていましたが、
自分からの発信はニコニコでの動画投稿にこだわっていました。
しかしながら動画を制作する場合、

1. 内容考える
2. 台本におこす
3. [水奈瀬コウ](https://www.ah-soft.com/voiceroid/kou/)くん(VOICELOID)に喋ってもらう
4. 動画編集
5. 完成

と、けっこうな手順を踏みます。
結果、技術的なアレコレの説明も動画の中でやろうとすると
己の不治の病(めんどくさい病)の発症によって死ぬわけです。
結局自分のこだわりが仇となってモチベが下がるんじゃ意味ないやん！というわけで、
「成果物のお披露目は動画で、技術的な部分のお話はQiitaで」という方針に切り替えました。

# おわりに
以上、簡単な自己紹介でした。
いかがでしたか？

とりあえずは練習がてらガシガシと雑に書いていきましたが、
ゆくゆくは「初めての方はココ見とけばOKです」と投げられる状態にしておきたいな……
三日坊主のスペシャリストなので本当に活動するのか全くもって不明ですが、
まったりのんびりとやっていきたいと思います。どうぞよろしくお願いいたします。
SELinux Enforcing 環境下でnginxをリバースプロキシとして使う

#背景

今まで普通に動いていたリバースプロキシがVPSの再起動後500エラーを返すようになった。
`# setenforce 0`すると動くからSELinuxの設定ミスに違いない。
ということでググったら、ドンピシャな記事がなかった→よし、書こう。

#要点

`httpd_can_network_connect`
`httpd_can_network_relay`
を`on`にするだけ。

#方法

`# setsebool -P httpd_can_network_connect=1`または`# setsebool -P httpd_can_network_connect on`
同様に`# setsebool -P httpd_can_network_relay on`

#解説[^1]

> ブール値の状態を変更するには、setsebool コマンドを使用します。たとえば、httpd_anon_write ブール値をオンにするには、以下のコマンドを root ユーザーで実行します。
> `~]# setsebool -P httpd_anon_write on`
> 同じ例でブール値を無効にするには、下記の様にコマンドの on を off にします。
> `~]# setsebool -P httpd_anon_write off`
> 
> 注記
> 再起動後に setsebool による変更を維持したくない場合は、-P オプションを使用しないでください。

> `httpd_can_network_connect`
> このブール値を無効にすると、HTTP スクリプトやモジュールがネットワークやリモートポートに接続開始することができなくなります。接続の開始を許可する場合はブール値を有効にします。

> `httpd_can_network_relay`
 >httpd をフォワードプロキシまたはリバースプロキシとして使用する場合、このブール値を有効にします。

[^1]: [RedHat公式ドキュメント](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/selinux_users_and_administrators_guide/sect-managing_confined_services-the_apache_http_server-booleans)から引用
VueCLI3で共通のSassファイルを各コンポーネントから読み込む

コンポーネント開発において、Sassなどのプリプロセッサ特有の定数やMixinを
各コンポーネントでimportするのは手間なので、プロジェクトで一括してロードしたい場合があります😔


## `sass-loader`の場合
`sass-loader`には`data`オプションというものがあり、
Sass変数など、複数のsassファイルから参照する内容を追加することができます。

```javascript:webpack.confg.js
{
    loader: "sass-loader",
    options: {
        data: "$env: " + process.env.NODE_ENV + ";"
    }
}

```

しかし、VueCLI3では、webpackの設定が隠されているため、
`webpack.config.js`などに書いていた設定は`vue.config.js`に書きます🙃


## `css.loaderOptions`を使う

`vue.config.js` に以下のような設定を追加します。（参考例）

```javascript:vue.config.js

const path = require('path');
const SRC_DIR = path.resolve(__dirname, 'src');
const SASS_DIR = path.join(SRC_DIR, 'assets', 'sass');
const SASS_AUTO_IMPORTS = `
@import "${path.join(SASS_DIR, '_variables.sass')}";
`;

module.exports = {
  css: {
    loaderOptions: {
      sass: {
        data: SASS_AUTO_IMPORTS
      }
    }
  }
}
```



`loaderOptions`を介することで各ローダーの設定ができます。
つまり、`css.loaderOptions.sass`に渡せば`sass-loader`にoptionを渡すことが可能になります✌️

サポートしているローダーはこちら

- css-loader
- postcss-loader
- sass-loader
- less-loader
- stylus-loader

## 注意点

この設定は、各コンポーネントの`<style>`部分に挿入されるだけなので、コンポーネントが複数あればその数だけ同じスタイルの記述が増えます。
なので、このオプションに指定するファイルには、コンパイル後にCSSのコードとして出力されない設定要素（`mixin`、`function`、`variables`など）を指定するべきです。
つまり、**CSSとして出力されてしまうスタイルを含まないようにすべき**ということです。

## 参考
https://ashesrl.hatenablog.com/entry/2018/10/17/180946#f-3040dcdc
Vagrant+VirtualBoxを使ってMac上に仮想マシンを作成してみた

#１.はじめに#
こんにちはokak108です。
こちらの記事がQiita初投稿となります。

今回は仮想マシン作成ということで、VagrantとVirtualBoxを使ってやっていきたいと思います。

Qiita上には似たような記事がたくさんありますが、自分が作成した環境を備忘録として投稿します。誤った情報やアドバイスなどありましたらコメントいただけると幸いですm(_ _)m
#２.VagrantとVirtualBoxのインストール#
まずはVagrantとVirtualBoxのインストールを行います。
下記のURLからそれぞれの環境にあったものをインストールしてください。

[Vagrantのホームページ](https://www.vagrantup.com/)
[VirtualBoxのホームページ](https://www.virtualbox.org/wiki/Downloads)

ちなみに今回私が使うバージョンは

- Vagrant(2.2.5)
- VirtualBox(6.0.8)

となっています。

次にインストールができたらVagrantのパスが通っているかターミナルで確認してください。

```console:コマンド
$ vagrant -v
Vagrant 2.2.5
```

上記のようにVagrantのバージョンが表示されたらパスが通っているのでインストール完了です:ok_hand:

#3.Vagrant Boxの作成#
次に仮想マシンのテンプレートとなるBoxの追加を行います。

下記のURLから必要なBoxを選んで追加します。
今回はCentOS7を追加します。

[Vagrant Cloud](https://app.vagrantup.com/boxes/search)

```console:コマンド
$ vagrant box add centos/7
==> box: Loading metadata for box 'centos/7'
    box: URL: https://vagrantcloud.com/centos/7
This box can work with multiple providers! The providers that it
can work with are listed below. Please review the list and choose
the provider you will be working with.

1) hyperv
2) libvirt
3) virtualbox
4) vmware_desktop
```

今回はVirtualBoxを使うので`3`を入力して`Enter`

ダウンロードが完了したらBoxがちゃんと追加されているか確認しておきます。

```console:コマンド
$ vagrant box list
centos/7 (virtualbox, 1902.01)
```

Boxのダウンロードが完了したらいよいよ仮想マシンを作成します:fist:

#4.仮想マシンの作成#
まずVagrantの初期化を行う前に作業用のディレクトリを作成&移動しておきます。

```console:コマンド
$ mkdir CentOS7 & cd CentOS7
```

次に先ほど追加したBoxを指定してVagrantの初期化を行います。

```console:コマンド
$ vagrant init centos/7
```

そして初期化が完了したら仮想マシンを立ち上げます。

```console:コマンド
$ vagrant up
```

立ち上がったらSSHで仮想マシンに接続します。

```console:コマンド
$ vagrant ssh
```
接続できたらユーザー名とサーバー名が以下のようになったと思います。

```console:コマンド
[vagrant@localhost vagrant]$ 
```

ついでに仮想マシン上に載せたOSのバージョンを確認しておきます。

```console:コマンド
[vagrant@localhost vagrant]$ cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core)
```

ひとまずこれで仮想マシンの作成は完了です。

##仮想マシンからログアウトする##
接続した仮想マシンからログアウトする方法は`exit`と打てばログアウトできます。

```console:コマンド
[vagrant@localhost ~]$ exit
```

##仮想マシンのシャットダウン##
仮想マシンのシャットダウンは仮想マシンからログアウトし、Vagrantを初期化したディレクトリで以下のコマンドを打てばできます。

```console:コマンド
$ vagrant halt
```

#5.おまけ#
##IPアドレスの設定##
仮想マシンの作成は完了しましたが、このままではNiginxやApacheを入れてサーバーを立てた時にホストマシン（Mac）から仮想マシンへアクセスできません。
そこでVagrantfileをいじります。

VagrantfileはVagrantの初期化を行った時にいたディレクトリに作成されているはずです。
このファイルには仮想マシンを立ち上げた時に行う設定などを記述します。

それではVagrantfileでIPアドレスの設定を行います。
```vim```を使って編集を行っても良いですが、使い慣れていない方はテキストエディタで編集することをお勧めします。

Vgrantfileを開いたら以下に記述と同じ行を探してください。

```console
config.vm.network "private_network", ip: "192.168.33.10"
```

この行の先頭に```#```が挿入されていてコメントアウトされているので、これを削除してから保存してください。

そして再び仮想マシンを立ち上げるとIPアドレスが設定されます。

他にも色々な設定があるので興味があったら下記の記事を参考に色々設定してみてください。

[Vagrant入門③〜Vagrantfile設定編](https://qiita.com/akippa_app/items/d6aef518bff20dc39530)

#6.おわりに#
今回はVagrantとVirtualBoxを使って仮想マシンの作成を行いました。

次回は今回作成した仮想マシンにwebサーバーソフトウェアやサーバーサイド言語など入れてWebアプリを開発できる環境を構築したいと思います。
Windows ActiveDirectory ドメインコントローラ 作成

#■概要
ADサーバ（ドメインコントローラ）を作成後、ドメインユーザを作成、ログイン。
その後、クライアントサーバを作成後、ドメインに参加、ドメインユーザにてログインできることを確認する。



#■前提知識
・DNSサーバを冗長化していた場合、プライマリ→セカンダリへ一方方向のゾーン転送が行われる。
・ADサーバの保有するオブジェクト情報はドメイン内の全てのADサーバへ複製される。


#■手順
① ドメインコントローラに設定したサーバの
  「サーバーマネージャー」-「管理」-「役割と機能の追加」より
「ADドメインサービス」をインストール



② ActiveDirectory ユーザとコンピュータより
　新規OU、及び新規ユーザを作成



③ このままだとRDPによるログインが行えない為、
　作成したユーザの所属するグループに「Remote Desktop Users」の権限を付与



④ クライアントサーバ作成
適当なクライアントサーバを作成
※今回はWindowsServer2016で作成


⑤ DNSサーバの作成
クライアントサーバへドメイン情報を通知する場合、DNSサーバへのレコード登録が必要となるが
今回私の使用している検証環境では迂闊にDNSレコードの変更が行えない環境だったので
ドメコンにてDNS機能を使用する。

⑤-2 ドメコン内DNSに「g-test.com」のレコードを登録する。
※ADをインストールした際、基本的には同時にDNS機能、及びドメインも登録されているはず。
　インストーつされていなかった場合、下記のURLを参照し、DNS機能のインストール、及びドメイン登録を実施する。

DNS情報参照：https://www.atmarkit.co.jp/ait/articles/0807/31/news130_2.html


DNS参照サーバ設定変更
ドメコン、及びクライアントサーバにて、それぞれDNS参照先を以下の通りに設定変更する。

ドメコン：127.0.0.1（ローカル）
クライアント：172.19.115.201（ドメコン）



⑥ クライアンサーバのドメイン参加
クライアントサーバの「システム」「設定変更」「変更」より、
所属するグループでドメインにチェックし「g-test.com」を設定
資格情報を問われるので「hirose」ADアカウントを入力

⑦ ユーザ登録
クライアントサーバの「ユーザ管理」より、ドメインユーザを追加し
ADアカウントにてログインが行えることを確認する。

⑧ 配信テスト
下記サイトを参照し、ADによるグループポリシー配信が行えるか確認する。

参考サイト：https://ittrip.xyz/soft/windows/how-to-use-gpo
Chromeブラウザでスマホ画面のレビュー、フルスクリーンショットを撮る

# はじめに
スマートフォン画面のサイズは機種により様々であるが、Chromeには各種サイズをシミュレートする機能があるので使い方をメモ

# 1. Developer Toolを開く

![スクリーンショット 2019-07-02 午後8.28.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329289/aa1a9788-1347-b636-3b9b-de15eb768835.png)

# 2. Toggle Devise Toolbarを開く

![スクリーンショット 2019-07-02 午後8.29.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329289/64223196-2a23-79ad-7a61-c4a0d7d97324.png)

# 3. テストしたい機種を選ぶ

![スクリーンショット 2019-07-02 午後8.31.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329289/4b9d738e-99cb-498e-cf7b-3714dfc0deb6.png)

# 4. Full Screen Shotを撮る

縦に長い画面であっても、1枚のPNG画像ファイルとして保存できる。

![スクリーンショット 2019-07-02 午後8.33.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329289/f95122a1-f806-ced5-2ea6-f112b7d1702c.png)
kelpnetの作法 その7

# 概要

kelpnetの作法を調べてみた。
ライントレースやってみる。
学習してみた。

# 結果

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/3e5c12fa-600a-3238-7bb3-cf724cef3e29.png)

# サンプルコード

```
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using KelpNet;
using System.IO;

namespace ConsoleApp4
{
    class Program
    {
        const int EPOCH = 3001;       
        static void Main(string[] args)
        {
            int N = 2000;
            Real[][] trainData = new Real[N][];
            Real[][] trainLabel = new Real[N][];
            int[] Label = new int[N];
            int i = 0;
            Console.WriteLine("Read Start...");
            using (StreamReader sr = new StreamReader(@"test.csv"))
            {
                while (!sr.EndOfStream)
                {
                    string line = sr.ReadLine();
                    string[] items = line.Split(',');
                    trainData[i] = new Real[] {
                        double.Parse(items[0]),
                        double.Parse(items[1]),
                        double.Parse(items[2]),
                        double.Parse(items[3]),
                        double.Parse(items[4])
                    };
                    trainLabel[i] = new Real[] {
                        int.Parse(items[5])
                    };
                    Label[i] = int.Parse(items[5]);
                    i++;
                }
            }
            N = i;
            FunctionStack nn = new FunctionStack(new Linear(5, 20, name: "in"), new Sigmoid(name: "act"), new Linear(20, 3, name: "out"));
            nn.SetOptimizer(new SGD());
            Console.WriteLine("Train Start...");
            for (i = 0; i < EPOCH; i++)
            {
                Real loss = 0;
                for (int j = 0; j < N; j++)
                {
                    loss += Trainer.Train(nn, trainData[j], trainLabel[j], new SoftmaxCrossEntropy());
                }
                if (i % 100 == 0)
                {
                    Console.WriteLine("loss:" + loss / N);
                }
            }
            Console.WriteLine("Save Start...");
            ModelIO.Save(nn, "test.nn");
            Console.WriteLine("Load Start...");
            Function testnn = ModelIO.Load("test.nn");
            Console.WriteLine("Test Start...");
            float ac = 0;
            for (int j = 0; j < N; j++)
            {
                NdArray result = testnn.Predict(trainData[j])[0];
                int resultIndex = Array.IndexOf(result.Data, result.Data.Max());
                if (resultIndex == Label[j]) ac++;
            }
            Console.Write("正解率 ");
            Console.WriteLine(ac / N * 100);
            Console.WriteLine("Press any key to exit.");
            Console.ReadKey();
        }
    }
}

```

以上。
octokitを使ってみた

mruby on YABMのrelease作業を自動化するためにoctokitを使ってみました。

```ruby:release.rb
require 'octokit'
require 'digest'

dig1 = Digest::SHA256.hexdigest( File.read("main.rtl.gz") );
dig2 = Digest::SHA256.hexdigest( File.read("main_e.rtl.gz") );
dig3 = Digest::SHA256.hexdigest( File.read("main_8198.rtl.gz") );

cont = {content_type: 'application/gzip'}
name = {name: '20190703', body: 'SHA256 (main.rtl.gz) = ' + dig1 + '<br>' + 'SHA256 (main_e.rtl.gz) = ' + dig2 + '<br>' + 'SHA256 (main_8198.rtl.gz) = ' + dig3 + '<br>'}

client = Octokit::Client.new login: "yamori813", password: ""
rel =  client.create_release('yamori813/rtlbm-mruby', 'v2.2', name)
client.upload_asset(rel.url, "main.rtl.gz", cont)
client.upload_asset(rel.url, "main_e.rtl.gz", cont)
client.upload_asset(rel.url, "main_8198.rtl.gz", cont)
```

とりあえず決めうちで書いてみました。bodyの改行にはまりました。

できたリリースはこれです。

https://github.com/yamori813/rtlbm-mruby/releases/tag/v2.2
実機デバッグのとき「codesignは、キーチェーンに含まれる….を使用して署名しようとしています」のパスワードがわからない

実機デバッグのとき焦ったメモです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/333454/6eab53ee-6268-d9d9-6ef5-6af7bf4a819e.png)
「codesignは、キーチェーンに含まれる….を使用して署名しようとしています」というメッセージが出て、
自分がMacbookで設定しているパスワードを入れても、Enterを押しても、何度も出てきて、正解のパスワードがわかりませんでした。

Apple Developer Programの証明書の鍵を入れるのか？　とか一瞬考えてしまったのですが、そんなわけはなく、
**Macbookでログインしている自分のユーザーIDのパスワードが正解でした。**
何度も入力を求められたのは、一度の入力に対して一度の許可しか与えなかったためで、
「常に許可」してやると、パスワードが要求されなくなります。

# 参考リンク
[codesignは、キーチェーンに含まれる….を使用して署名しようとしています。](https://www.eidesign.info/iphone/keychain/)
Scratch3.0 拡張機能を作って GitHub Pagesで公開する手順メモ

# 拡張機能を作る
## 1. 元プロジェクトをフォークする
以下２つを自分のGitHubリポジトリにフォークする

* https://github.com/LLK/scratch-gui
* https://github.com/LLK/scratch-vm

## 2. フォークしたプロジェクトをローカルにクローンする

```bash
$ git clone https://github.com/[自分のリポジトリ名]/scratch-gui
$ git clone https://github.com/[自分のリポジトリ名]/scratch-vm
```

## 3. 拡張機能を作る

とりあえずは以下の記事を参考にして拡張機能を作る。
[Scratch 3\.0でオリジナルブロックをつくろう \- Qiita](https://qiita.com/Hiroyuki_OSAKI/items/a46e1c881d3aed4661f7)

記事の「[2) ブロックを実装します](https://qiita.com/Hiroyuki_OSAKI/items/a46e1c881d3aed4661f7#2-%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%BE%E3%81%99)」と「[3) GUIを更新します](https://qiita.com/Hiroyuki_OSAKI/items/a46e1c881d3aed4661f7#3-gui%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%97%E3%81%BE%E3%81%99)」のターミナルコマンドを除いた部分だけでOKです。

# 作った拡張機能をローカルで動作確認する
## 1. 環境の準備
Node.js, npm, yarn を使いたいので、準備する。

* 参考になりそうな記事
  * [Node\.js / npm をインストール \(Mac環境\) \- Qiita](https://qiita.com/PolarBear/items/62c0416492810b7ecf7c)
  * [インストール \| Yarn](https://yarnpkg.com/lang/ja/docs/install/#mac-stable)

## 2. 依存パッケージのインストールとプロジェクトのリンク

```bash
$ cd scratch-vm 
$ yarn install && yarn link
$ cd ..
$ cd scratch-gui
$ yarn link scratch-vm && yarn install
```

## 3. ローカルでプロジェクトをビルドする

```bash
$ cd scratch-gui
$ yarn start
```

下記のリンク先を開く。

http://0.0.0.0:8601/

### 3.1. 修正が発生した場合の再ビルド

プロジェクトの該当箇所を修正後、以下コマンドを実行すると反映する。（たまに上手く反映しないときがあるかも？？）

```bash
$ cd ..
$ cd scratch-vm 
$ yarn link
$ cd ..
$ cd scratch-gui
$ yarn link scratch-vm
$ yarn start
```

# 作ったプロジェクトを GitHub 上に push する

更新した scratch-gui と scratch-vm を GitHub上にpushする。

# 作ったプロジェクトを github.io で公開する（手動）

本家Wikiを読んで自動もTryしたけど、エラーが出てしまい、自分には難しくて挫折しました。自動は諦めて手動で実行することに。

* 参考にした記事
  * [Publishing to GitHub Pages · LLK/scratch\-gui Wiki](https://github.com/LLK/scratch-gui/wiki/Publishing-to-GitHub-Pages)（本家Wiki）
  * [Scratch 3\.0 github\.io pages へのセットアップメモ \| UBUNIFU INCORPORATED](https://jp.ubunifu.co/education/scratch-3-0-github-io-pages-%E3%81%B8%E3%81%AE%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97%E3%83%A1%E3%83%A2) 

```bash
$ cd scratch-gui
$ yarn install
$ yarn run build
$ yarn run deploy
# または、指定ブランチがある場合は
$ yarn run deploy -- -e branchName
```

* build と deploy は最初は GitHub のIDとPWを聞かれるかも

# 公開したプロジェクトを確認する

下記のリンク先を開く。

`https://<your username>.github.io/scratch-gui/`
または、指定ブランチがある場合は
`https://<your username>.github.io/scratch-gui/<branchName>
`

## 自作NCMB連携プロジェクト 

https://natsumo.github.io/scratch-gui/develop/

参考まで、[ニフクラ mobile backend](https://mbaas.nifcloud.com/)との連携ブロックを作りました。データストアに値を保存することができます。（今後随時機能を追加予定）

<img width="297" alt="スクリーンショット 2019-07-03 8.41.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112032/e044a40d-a8fc-5b0d-ed3d-bc60661a3806.png">
Node.js から Bot API で LINE WORKS にメッセージ送信

#Node.js で LINE WORKS にメッセージ送信

Node.js の request で LINE WORKS のトーク BOT API を実行し、任意のメンバーやトークルームにメッセージを送る方法です。

API のバージョンアップに伴い、記事を修正しました。
https://qiita.com/iwaohig/items/4b0717f2c66b74b74d0c

##事前作業

LINE WORKS でトークボット API を利用するため、LINE WORKS の Developer Console で、以下の事前作業を行います。


## API 認証の準備
- API ID 発行
- サーバー API のコンシューマーキー発行
- サーバー API の Server Token

手順はこちらのページの情報を参照します。
https://developers.worksmobile.com/jp/document/1002002?lang=ja

## Bot 登録
Bot メニューで [登録] ボタンをクリックし、以下の項目を入力し、保存をクリック
- Bot名 -> 任意の名前
- 「説明」-> 任意の説明文
- Callback URL -> 今回は Off
- Botポリシー -> 用途に応じて設定
- 管理者 -> 任意のメンバーを指定

登録すると Bot No. が生成されるので、確認しておきます。

##トーク Bot API によるメッセージ送信

LINE WORKS の トーク Bot API の解説はこちらのページです。
https://developers.worksmobile.com/jp/document/100500801?lang=ja


```
var request = require('request');
var options = {
  uri: 'https://apis.worksmobile.com/r/<API ID>/message/v1/bot/<bot No.>/message/push',
  headers: {
    'Content-Type': 'application/json; charset=UTF-8',
    'consumerKey': '<Server API Consumer Key>',
    'Authorization': 'Bearer <Server Token>'
  },
  json: {
    'accountId': '<user id>',
    'content': {
        'type': 'text',
        'text': '<メッセージ本文>'
  }
 }
};
request.post(options, function(error, response, body){});
```

上記により、LINE WORKS へトーク メッセージの送信が可能です。
SONY製AutoMLのPredictionOneでkaggleのTitanicをやってみた

PredictionOne公式サイト
https://predictionone.sony.biz/

kaggleのTitanicチュートリアル
https://www.kaggle.com/c/titanic/

# 1. kaggleからデータをダウンロード

https://www.kaggle.com/c/titanic/data

の「DownloadAll」からダウンロードできます。

# 2. データの読み込み

PredictionOneを起動したあと、左上の「新規モデル作成」をクリックします。

![p0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449916/ab46f1c2-19e6-a73b-08ba-8f7067b4fe19.png)


ダウンロードしたデータのフォルダからtrain.csvを選択します。

# 3. モデル設定

予測ターゲットに「Survived」を選択します。

![p1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449916/42319194-e3f8-6849-f6d1-e4c61626b600.png)


また「必ず交差検証を行う」にチェックを入れます。

「学習と評価を実行」をクリックします。

# 4. 学習

![p2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449916/6643e020-5234-8646-4e1b-58225ed74713.png)


今回は1分ほど待ちます。

# 5. 予測

![p3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449916/2f903d97-7d8b-20c0-ab54-b12c6624226e.png)

学習が終了したら予測タブの「新規予測」ボタンをクリックします。
ダウンロードしたデータの「test.csv」を選択します。


「IDとして使用する項目」には「PassengerID」を指定します。

「予測結果を保存」をクリックします。

# 6. サブミット

出力ファイルを整形して

https://www.kaggle.com/c/titanic/submit

でサブミットします。

![p05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449916/2af31bdf-c208-38c1-4a2f-898e367d476a.png)


Scoreは0.75598でした。

変数やパラメタの調整を手動で行ったこちらのkernelではスコアが0.77511でした。
https://www.kaggle.com/lystahi/titanic-data-lightgbm

若干PredictionOneを上回ることができたものの、操作性や解釈性の観点から、PredictionOneの方が向いているケースもあるかと思われます。
Python から Bot API で LINE WORKS にメッセージ送信

#Python で LINE WORKS にメッセージ送信

Python の requests で LINE WORKS のトーク BOT API を実行し、任意のメンバーやトークルームにメッセージを送る方法です。

API のバージョンアップに伴い、記事を修正しました。
https://qiita.com/iwaohig/items/4b0717f2c66b74b74d0c

##事前作業

LINE WORKS でトークボット API を利用するため、LINE WORKS の Developer Console で、以下の事前作業を行います。


## API 認証の準備
- API ID 発行
- サーバー API のコンシューマーキー発行
- サーバー API の Server Token

手順はこちらのページの情報を参照します。
https://developers.worksmobile.com/jp/document/1002002?lang=ja

## Bot 登録
Bot メニューで [登録] ボタンをクリックし、以下の項目を入力し、保存をクリック
- Bot名 -> 任意の名前
- 「説明」-> 任意の説明文
- Callback URL -> 今回は Off
- Botポリシー -> 用途に応じて設定
- 管理者 -> 任意のメンバーを指定

登録すると Bot No. が生成されるので、確認しておきます。

##トーク Bot API によるメッセージ送信

LINE WORKS の トーク Bot API の解説はこちらのページです。
https://developers.worksmobile.com/jp/document/100500801?lang=ja


```
import json, requests
url = 'https://apis.worksmobile.com/r/<API ID>/message/v1/bot/<bot No.>/message/push'
headers = {
    'Content-Type': 'application/json; charset=UTF-8',
    'consumerKey': '<Server API Consumer Key>',
    'Authorization': 'Bearer <Server Token>'
}
payload = {
    'botNo': <bot No.>,
    'accountId': '<user id>',
    'content': {
        'type': 'text',
        'text': '<メッセージ本文>'
     }
}
r = requests.post(url, data=json.dumps(payload), headers=headers)
```

上記により、LINE WORKS へトーク メッセージの送信が可能です。
#Ruby on #Rails で has_one belongs_to has_many などの association を持ったテーブルを対象に OR 検索がしたい

単一条件の場合であれば、単に joins してあげれば、結合できないレコードは除かれるので、それで済むはず。

```rb
User.joins(:books)
User.joins(:lovers)
```

でも ORの複合的な条件だと、いちど LEFT OUTER JOIN をしてからじゃないt、うまくいかない気がした。

なのでまずは複数のテーブルを LEFT JOIN してから、親テーブルとの関連レコードが存在して「結合できた」ものだけを絞り込んで見た。

```rb
User
  .left_joins(:books)
  .left_joins(:lovers)
  .where.not(books: {user_id: nil}).or(
	User
	  .left_joins(:books)
	  .left_joins(:lovers)
	  .where.not(lovers: {user_id: nil})
  )
  .distinct
```

SQLはこんな感じ。


```
=> "SELECT DISTINCT `users`.* FROM `users` LEFT OUTER JOIN `books` ON `books`.`user_id` = `users`.`id` LEFT OUTER JOIN `lovers` ON `lovers`.`user_id` = `users`.`id` WHERE (`books`.`user_id` IS NOT NULL OR `lovers`.`user_id` IS NOT NULL)"
```

最後に distinct しているのは、has_many のテーブルを left join した時に、結果が元の user 数よりも増えるので、ユニークにしている。


# Original by Github issue

https://github.com/YumaInaura/YumaInaura/issues/2237








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->