OmniAICreator/Qiita-1.07M huggingface dataset:
MSTest v2でテストを並列に実行する

MSTest v2ではデフォルトで直列にテストが実行されるようです。

テストを並列に実行したい場合は、`Properties\AssemblyInfo.cs`に、以下の通り修正します。

```c#:AssemblyInfo.cs
using Microsoft.VisualStudio.TestTools.UnitTesting;
using ExecutionScope = Microsoft.VisualStudio.TestTools.UnitTesting.ExecutionScope;

[assembly: Parallelize(Workers = 4, Scope = ExecutionScope.ClassLevel)]
```

上記の`Wrokers`は並列するテストの個数を指定し、`Scope`は並列化する単位(クラス毎かメソッド毎か)を指定します。
また、この単位だけは直列にしたいという場合は、クラスもしくはメソッドに以下の通り`DoNotParallelize`属性を付加します。

```c#
    [TestClass]
    [DoNotParallelize()]
    public class TestClass
    {
    }
```

```c#
    [TestMethod()]
    [DoNotParallelize()]
    public void TestMethod()
    {
    }
```
【超初級編】Java Scriptの書き方・表示方法

## 📗 Java Scriptとは【基礎知識】
プログラミングにはフロントエンドとサーバーサイドが存在します。

**サーバーサイド**=PHP,Ruby,Mysql,python等
ユーザーからは見えない、サーバー側で働くプログラムのことです。

**クライアントサイド**＝JavaScript,HTML,CSS
これはユーザーがグーグルクロームなどのブラウザを通して動く仕組みになります。

今回はクライアントサイドのJavaScriptについて基礎的なことを記入していきます。

## 📗 環境
Mac OS
VSCode
Google Chrome

## 📗 簡単なコードを書いてみよう！【準備】
1. デスクトップ上に適当なフォルダを作って見ましょう♪
2. そのフォルダをVSCodeで開いて、〇〇.htmlという形でファイルを作成してください。
3. 〇〇.htmlというファイルに下記を記載しましょう。（EmmetというVSCodeの仕様で、!と記載してtabキーを押すと出てきます）


```html:〇〇.html
<!DOCTYPE html>
<head>　//headはHPの情報などを書いていく場所です。
  <meta charset="UTF-8">　　//文字コードをutf-8に設定します。国際基準の規格で主流となっています。
</head>
<body></body> //bodyの中が実際にHPに表示されるものになります。
</html>
```
## 📗 主にJSを記入する場所【３箇所】

- JSは主に１〜３のどこかに記載します。

```html:〇〇.html
<!DOCTYPE html>
<head>　//headはHPの情報などを書いていく場所です。
  <meta charset="UTF-8">　　
 1 ←　ここ 
//以前はこの部分に記載するのが主流でしたが、JSを読み込んでから表示という流れになるので表示に時間がかかるため現在はあまりここには書きません。
</head>
<body>
 2←　ここ　//表示の前に書くパターンもあります。
　表示
 3　<script>この中にJSを書いていく。</script>
// 現在はこの３番の部分への記載が主流となっています。なのでここに基本的に記載していきましょう
</body> 
</html>
```
ただしJSのコードが非常に長くなる場合は.js形式でファイルを別に作り、そちらに記載してscriptの中で呼び出します。
呼び出す場合は下記を参考にしてください。


```html:〇〇.html
<script src="〇〇.js"></script> //srcはsourceの略です。元になるファイル名を記載します。
```
## 📗 JSのコードを書いてブラウザで確認する。

1.では、hello.jsというファイルをVSCodeで作ってください。

２.上記を参考にscript src="hello.js"と記載してみましょう。

３.下記コードを記載してみましょう。

```html:〇〇.html
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>hello!!</title>
</head>
<body>
  ここが表示されます。
  <script src="hello.js"></script>
</body>
</html>
```

```javascript:hello.js
console.log('Hello World! from hello.js');
```
４.ページを更新し、ここが表示されます。と表示され。デベロッパーツールのconsoleにて"Hello World! from hello.js"と表示されていれば成功です！

## 📗 補足　ファイルをブラウザに表示させるには・・・
<img width="779" alt="スクリーンショット 2020-05-08 16.54.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545998/99373ae6-be17-2707-04b5-0597889024ec.png">
画像の部分の　ファイル→ファイルを開く→作ったフォルダをクリック→開きたいhtmlファイルを選択
でブラウザに表示できます。

## 📗 次回予告
今回はコンソールに表示させるまでを分かりやすく解説しました。
次回は、初歩的なJSの記入例を紹介したいと思いますので是非初学者の方は一緒に勉強しましょう♪
JavaScript　から　javaを呼び出せた　最初のソース



MainActivity.java

```
package pro.test.localweb;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.webkit.WebView;
import android.webkit.WebViewClient;


public class MainActivity extends AppCompatActivity {

    private  WebView myWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // webView に関する試行錯誤
        myWebView = (WebView) findViewById(R.id.localWeb);
        myWebView.loadUrl("file:///android_asset/index.html"); // ローカルのhtmlファイルを指定
        myWebView.setWebViewClient(new WebViewClient());
        // WebView内のJavaScriptの実行を許可
        myWebView.getSettings().setJavaScriptEnabled(true);
        // WebChromeClientを設定する
        // ※コレを設定しないとJSのalertは表示されない
        myWebView.addJavascriptInterface(new JavaScript(this), "android");

    }

}
```


app\src\main\assets\index.html

```
<html>
<head>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
test3
<div class="a"></div>
<br>
<button class="check" >Toastを表示</button>
</body>
<script>

$('.a').html("a")

$('.check').on('click',function(){
     android.hogeMethod('ほげほげ')
     //$('.a').html("testb")
});

</script>
</html>
```




pro/test/localweb/JavaScript.java

```java

package pro.test.localweb;

import android.content.Context;
import android.webkit.JavascriptInterface;
import android.widget.Toast;

public class JavaScript {
    private Context c;

    private String IdString = "shop_admin1";

    public JavaScript(Context c) {
        this.c = c;
    }

    @JavascriptInterface
    public void hogeMethod(String s) {
        Toast toast = Toast.makeText(c, s, Toast.LENGTH_LONG);
        toast.show();
    }

    @JavascriptInterface
    public String GetLoginId(){
        return IdString;
    }

}
```
privateメソッドとは

#privateメソッドとは
オブジェクトの内側からは利用できるが、外側からは利用できないようにしたメソッド。
メソッドを定義する前にprivateを宣言すれば使える。

```Person.rb
class Person
  def initialize(age)
   @age = age
  end

  def over30th?
   age > 30
  end

　private #有無の違いで後の出力結果が変わる

  def age
   @age 
  end

person = Person.new(35)

=======================================

#private無しの場合
> person.over30th?
=> true
> person.age
=> 35

#private有りの場合
> person.over30th?
=> true
> person.age
=> NoMethodEroor
```
Vue.js　条件付きレンダリング

#Vue.js　条件付きレンダリング

前回の記事はこちら
[Vue.js クラスとスタイルのバインディング](https://qiita.com/fumiya0414/items/af316f14d290e18fa3ba)

今回は条件付きレンダリングで以下を説明します。
・v-if と　ｖ−else
・v-else-if

##v-ifとv-else
[jsfiddle](https://jsfiddle.net/)で実際に記述しながら読むことをおすすめします。

v-ifを使うことで真偽値によって要素の表示非表示を切り替えることができます。
真偽値がtrueの場合はyes、falseの場合はNoと表示してみます。

```html:index/html
<div id="app">
  <p v-if="toggle">
    Yes
  </p>
  
  <p v-else>
    No
  </p>

</div>

<script src ="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
```

```javascript:index.js
var app = new Vue({
	el:'#app',
  data:{
   toggle:true
  }
})
```
実行結果
[![Image from Gyazo](https://i.gyazo.com/b18852cd12fe1077595816a145b1bb1b.gif)](https://gyazo.com/b18852cd12fe1077595816a145b1bb1b)

データオプションtoggleの真偽値によって表示要素を切り替えています。
v-elseディレクティブはv-if(もしくはv-else-if)ディレクティブの
直後に記載する点に注意してください。

##v-else-if

信号機の色を示すプログラムを作ります。

red:stop/yellow:caution/blue:go/それ以外:not red/yellow/blueと出力してみます。

```html:index/html
<div id="app">
  <p v-if="color==='red'">
    stop
  </p>
  <p v-else-if="color==='yellow'">
    caution
  </p>
  <p v-else-if="color==='blue'">
    go
  </p>
  <p v-else>
    not red/yellow/blue
  </p>
</div>

<script src ="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
```

```javascript:index.js
var app = new Vue({
  el:'#app',
  data:{
    color: 'brawn'
  }
})
```

実行結果
[![Image from Gyazo](https://i.gyazo.com/af58e307781d2ab0e1f3f7cee3fcc751.gif)](https://gyazo.com/af58e307781d2ab0e1f3f7cee3fcc751)

初期値redをyellowにすると表示される文字列がcautionに変わりました。

次回はイベントハンドリングです。
[Vue.js イベントハンドリング](https://qiita.com/fumiya0414/items/dac76797939d0a3409bc)
【Slack】SlackでBotを開発する【GAS】

Slackのアプリ「Incoming Webhook」を使用したBot開発の手順を紹介します

# Incoming Webhookの準備
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/9d196b96-cc2d-59cc-1308-201d212c452c.png" width="300px">

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/1ff8a4ec-8d3f-0708-cf22-3df2cb0041c2.png" width="500px">

SlackのサイドバーのAppから「Incoming Webhook」を検索、クリックします

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/43a0c397-0328-de6c-9055-26845c1791f4.png)
「Slackに追加」をクリックします

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/d6dd8ee3-6092-0e20-5d0a-fe1a20d1a549.png)
Botで送信したいチャンネルを選択します
Incoming Webhookインテグレーションの追加をクリックします

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/f071a9e3-5412-0f9b-846e-206a397434a2.png)

Bot名、アイコン等を設定できます
基本的にはデフォルトのままで問題ないです！
「Webhook URL」のみ控えておく必要があるため、urlをコピーします

---

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/5514f604-fce7-2853-b920-015fb165b9ef.png)
一番下へスクロールし、「設定を保存」ボタンをクリックします

---

# GASの実装
GoogleAppScriptの実装へ入ります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411120/a8fbde23-bbf3-9d89-939a-06d842bbaa41.png)
GoogleドライブからGoogleAppScriptの新規作成をします

```js:slack.gs
// ワークスペースのURL
var postUrl = 'ここにWebhook URLを入力する';

/*
*　slackへメッセージを送信する
*　参考
*　https://qiita.com/chihiro/items/c7b11abc78f5d806c3a8
*　
*　@param {string} username - 通知時に表示されるユーザー名
*　@param {string} icon - 通知時に表示されるアイコン
*　@param {string} message - 投稿メッセージ
*/
function sendSlack(username,icon,message,channel) {
  var jsonData =
      {
        "username" : username,
        "icon_emoji": icon,
        "text" : message,
        "channel": channel,
      };
  var payload = JSON.stringify(jsonData);
  
  var options =
      {
        "method" : "post",
        "contentType" : "application/json",
        "payload" : payload
      };
  
  UrlFetchApp.fetch(postUrl, options);
}  
```
↑のコードをコピペします
postUrlの部分のみ自身の環境に合わせてください

# 動作確認
```js:slack.gs
function testSend() {
  sendSlack('テストBot名',':man-gesturing-ok:','テストメッセージを送信しています','#general');
}
```
↑のメソッドを実行するとSlackへテストメッセージが送信されます

## 「承認が必要」と出たら…
【GAS】GASのスクリプトの初めての実行【初心者】
https://qiita.com/SyogoSuganoya/items/397a8bbb1636c3f43524

こちらの記事を参考に承認操作を行います
Javaの特徴

###対象読者
Javaを勉強したいと思っている人、勉強しはじめの方へ。
私はJavaを学習中です。学んだことを自分の知識とするためアウトプットとしてqiitaに記事を投稿します。

###Javaでできること
スマホアプリや各種Webサービス、ゲーム、カーナビなど。
Javaが使われている代表的なサービスは、

・Twitter
・Evernote
・楽天
・みずほ銀行のシステム
・マインクラフト

等がある。

###大規模開発に適している
Javaはオブジェクト指向が確立されている言語。オブジェクト指向とは、部品（オブジェクト）を分割して組み立てていくというプログラミングの志向である。
Javaを使えば、機能ごとにパーツ分けし、それを組み合わせて複数人で大規模のシステムを作ることができる。

###処理速度が速い
####インタプリタ
コンピュータでプログラムを実行する方法として、インタプリタとコンパイラがある。
コンピュータは「1」と「0」による二進数の計算しかできない。コンピュータが解釈できるように二進数で書かれた命令を「機械語」という。
インタプリタはソースコードを読み込んで、それを機械語に変換してコンピュータに命令する。実行時に都度を変換するため処理に時間がかかる。また実行時にコンパイラ（変換する仕組み）が必要になる。
インタプリタ言語として、Javascript、PHP、Ruby等が挙げられる。

####コンパイラ
コンパイラはソースコードを事前に機械語へ一括変換してコンピュータに命令する。実行時に改めて変換する必要がないため、プログラムを高速で処理できる。また、コンパイラも不要のため単独でプログラムを実行できる。コンパイラ言語として、Java、C、C++、Objective-C、C#等が挙げられる。

####インタプリタとコンパイラのいいとこどりのJava
Javaはコンパイラ言語だが、インタプリタのメリットも持つ言語である。Javaはソースコードを事前に中間的なコードであるバイトコードに変換する。このバイトコードをJVM（Java Virtual Machine）という仮想マシンで動かすと、仮想マシンがバイトコードを機械語に変換してコンピュータに命令することができる。このJVMはいわばコンピュータとJavaとを取り持つ通訳者のようなもので、JVMがあればJavaはどんなコンピュータ上でも動く。
インタプリタは「プログラム実行時にソースコードを機械語に変換する仕組み」があればどのプラットフォームでも動くが、実行速度が遅い。コンパイラは異なるプラットフォームで動かす場合には、ソースコードをプラットフォームに合わせて変更して再度コンパイルしなおす作業が必要になる。これらのデメリットをなくすためにJavaは仮想マシンでバイトコードを動かすという方法をとっている。


###どんな環境でも使える
Javaは先述した仮想マシンであるJVMや、様々な実行・開発委に必要なライブラリを持つ「Javaプラットフォーム」上で動作するため、OSやハードウェアに依存することがない。MacでもWindowsでもLinuxでも使用できる。


###ガベージコレクションを備えている
プログラムが実行される際は下記のプロセスを踏む。
1. プログラム処理に必要な情報をメモリ上に読みこむ
2. 読みこんだ情報をもとに、処理を実行する

読み込まれた情報は処理をした後は不要になる。不要になった情報をそのままにしておくとメモリに溜まっていき、プログラムの処理速度が遅くなる。
ガベージコレクションは使用後不要になった情報をメモリ上から捨ててくれる機能である。
ガベージコレクションはプログラマがメモリ管理のためにコードを書かなくても自動で情報の要不要を判断し、処理してくれる。
Javaはデフォルトでこのガベージコレクションを備えている。
ESLint の設定の落とし穴 naming-convention編


eslintの設定で詰まったところがあったのでメモ。

```
const isHoge = "fuga"
```

`isHoge` という変数に対して eslintのルールで　`naming-convention` の設定を

```
      {
            selector: "variable",
            types: ["boolean"],
            format: ["strictCascalCase"],
            prefix: ["is", "should", "has", "can", "did", "will"]
          },
```

としようとするとエラーが出る。　`ishoge` とすれば通る。
ええ・・・何故なのか全然わからず考えること一日、　どうもセレクターの変数名の対象に `prefix` は含まれないみたいだという結論に。

```
      {
            selector: "variable",
            types: ["boolean"],
            format: ["StrictPascalCase"],
            prefix: ["is", "should", "has", "can", "did", "will"]
          },
```

`format`を`PascalCase`したら通りました。

うむ分かりづらい…。
【Gradle】Javaプロジェクトでよく行うビルド操作

# プロパティファイルのエスケープ
リソースのうち、日本語などのマルチバイト文字を含むプロパティファイルは
native2asciiコマンドによってエスケープするのが一般的である。
Gradleでプロパティファイルのエスケープを行うには、
プロパティファイルのエンコーディングがプロジェクトのデフォルト設定と同じかによって
２通りの設定方法がある。

## 事前知識
GradleのJavaプラグインにおいて、リソースに関係する要素は以下のものがある。

- 規約  
リソースはsrc/main/resources、srt/test/resourcesディレクトリ以下に配置する
- タスク  
processResources、processTestResourcesタスクは上記の規約で設定されたディレクトリに  
配置されたリソースファイルをそれぞれ、build/resources/main、build/resources/test  
ディレクトリにコピーする。

## プロジェクトのデフォルトエンコーディングと同じ場合
processResourcesタスクなどのCopy型タスクにエスケープを行うフィルターを指定する。
=processResourcesタスクがリソースのコピーを行う際にエスケープを行う

```gradle
import org.apache.tools.ant.filters.EscapeUnicode

processResources {
    filter(EscapeUnicode)
}
```

## プロジェクトのデフォルトエンコーディングと異なる場合
EscapeUnicodeによるフィルタはデフォルトエンコーディングを設定するため、
エンコーディング指定ができない。
この場合は、Antのnative2asciiタスクを利用し、実行ごとにエンコーディングを指定する。

```
task native2ascii {
  doLast {
    ant.native2ascii(src: 'src/main/resources',
        dest: processResources.destinationDir,
        encoding: '<任意のエンコーディング>')
  }
}
```

# JARファイルの各種設定

## JARファイル名の指定
JARファイル名はデフォルトで```<プロジェクトのルートフォルダ名>.java```となる。
ファイル名の指定方法は以下の２通りがある。

```gradle
jar {
    archiveName = 'sample.jar'
}

// archiveNameが設定されている場合はそちらが優先される。
// 以下の設定で生成されるJARファイル名は「sample-bin-1.0-jdk17.jar」となる。
jar {
    baseName = 'sample'
    appendix = 'bin'
    version = '1.0'
    classifier = 'jdk17'
}
```

## Javadocの出力内容の指定
Javadocの出力内容は、デフォルトの場合はbuild/docs/javadocディレクトリに
<プロジェクトのルートディレクトリ名>(-\<versionプロパティの設定値\>)というタイトルの
Javadocが生成される。
Javadocの出力先やタイトルは以下のように変更できる。

```gradle
javadoc {
    destinationDir = "example/dist/javadoc"
    title = 'example docs V1.0'
}
```

### Javadocの外部参照
Java標準APIなど、すでに存在するJavadocを参照したい場合は、
Javadocへのリンクを生成することができる。

```gradle
javadoc {
    options.links << 'http://docs.oracle.com/javase/jp/7/api/'
}
```

# 参照

この記事は以下の書籍を参考に執筆しています。

参考書籍：[Gradle徹底入門 次世代ビルドツールによる自動化基盤の構築](https://www.shoeisha.co.jp/book/detail/9784798136431)
XCTestでタイマーの実行を待ちたい


<b>XCTestの実行時間が伸びてもいいから</b>、とにかく`Timer`処理の実行を待ちたい！という時に


#例
例えば、タイマー処理を実行するメソッド`myFunc`があったとして


```swift

class hoge
{
    var timer : Timer?
    
    public func myFunc(interval:TimeInterval)
    {
        print("myFunc start")
        timer = Timer.scheduledTimer(timeInterval: interval, target: self, selector: #selector(timerExecute), userInfo: nil, repeats: false)
        print("myFunc end")
    }
    
    @objc func timerExecute()
    {
        print("timer実行")
        timer?.invalidate()
    }
}
```

myFuncを呼び出した時の実行結果

```
myFunc start
myFunc end
timer実行 (←TimeInterval経過後に出力される)
```

テストメソッドは以下とすれば、タイマー実行を待つことができます。
1.`asyncAfter`内部で`expectation.fulfill`を呼び出す
2.`asyncAfter`が実行された後で`wait`が実行されるようにする
　(つまり、`wait`の待機時間＞`asyncAfter`が実行されるまでの待機時間となるようにする)

```swift


class hogeTests: XCTestCase {

    func test_myFunc() {
        
        let instance = hoge()
        let exp = expectation(description: "testExample")
        instance.myFunc(interval: 2)
        
        let queue = DispatchQueue(label: "timerWait",attributes: .concurrent)
        queue.asyncAfter(deadline: .now() + 2.5)
        {
            exp.fulfill()
        }
        
        print("wait start")
        wait(for: [exp], timeout: 3)
        print("wait end")
    }
}

```

test_myFuncの実行結果

```
myFunc start
myFunc end
wait start
timer実行 (←TimeInterval経過後に出力される)
wait end
```
懺悔：Railsカラム追加時に過去データのnullを見落とし、過去データ全てが見れなくなりました。

# 過去データがnullなので全部見れなくなりました
要望：testというカラムを作り、それがfalseの時は表示しない

```rb:testというカラム増やしました
class AddColumnPrograms < ActiveRecord::Migration[5.2]
  def change
    add_column :program, :test, :boolean, after: :id, comment: 'テストかどうか'
  end
end
```

```rb:Controller
@programs = Program.where.not(test: false)
```

## 動作確認
* 新規に `Program.new(test: false)` を行い一覧に表示されてないこと
* 新規に `Program.new(test: true)` を行い一覧に表示されていること

無事両方とも動作しましたが、過去データのテストが抜けておりました。

## カラム追加時は default 値も考えよう。
default false をカラム追加時に忘れないようにしましょうという教訓でした。
何よりテストコードが大切ですね。
Javaテクノロジとは

5/11修正
Javaの機能についてと開発環境構築を分けて記事にします。

##はじめに
この記事はJavaってどんな言語か、言語選びで迷っている方に向けた、自分の理解を記載している備忘録です。

#Javaテクノロジ

https://docs.oracle.com/cd/E26537_01/tutorial/getStarted/intro/definition.html

上記のリンクでまとめていただいているのがわかりやすそうなのでそちらを参考にしつつ、私の理解を記載します。

Javaテクノロジとは、Javaというプログラミング言語がどんな物か、Javaを使うことでどうなるのかをまとめた物と思っています。上記リンクの全ては記載せず、私が特に重要だと思っている箇所をこちらに記載します。

#Javaの特徴
オブジェクト指向言語であること

今時点でも主流になっているオブジェクト指向
共通処理でのプログラムの書き換えが楽である
(例 1、２、３で共通の処理を書き換えたいときに、１、２、３の親に記載し、親を書き換えれば共通処理のコード記載の手間を省ける)

移植性の高さ
JavaはインストールさえしてしまえばどんなOSでもほぼ使えるので、環境を写したりするときにすぐに使えること
(例 Linuxで作成し、コンパイルしたが、Windowsで作業したくなったときに、どちらにもJavaがインストールされているのであれば、写すだけで実行ができる。C言語やVisual BasicではそのOS用にコンパイルされるため、別のOSで使えない)

大事そうな所でいうとこの2点あたりだと思っています。

上でも少し記載されていますが、Javaはコンパイラ(コンパイル)言語という特徴もあります。コンパイルとはざっくりいうと、コードをコンピューターが読める文章にすることです。

#環境について
環境についてもテクノロジでまとめていたのでこちらに記載します。

Javaの動作環境は括りでいうと2つあります。
JVM(Java仮想マシン この中でJavaが動いている。ここが共通だからこそ別OSでも使える)
API(色々な機能をまとめたもの(昔学校の先生が弁当箱って例えていました))

テクノロジについてはこんな感じで認識しています。
Javaとは何か と 開発環境(MAC)

この記事は、他の言語でプログラミングしていた人が、Javaでプログラムを組んでみると言う人に向けて書いた記事です。
この記事では環境構築までです。プログラムについての説明や、プログラムの作成は行いません。

# 注意事項
この記事はWikiの内容をもとに書かれています。
wikiのリンク
https://ja.wikipedia.org/wiki/Java

この記事の環境は Macです。なので、Macだとどうするかを説明します。

## Javaとは
Javaとは、プログラミング言語の一種です。
時には実行環境や開発環境も含めていうこともあります。
1995年からあるプログラミング言語であり、多くの人が資料を残しています。また、大体のPCにはJavaが入っていることもあり、初心者が触れやすい言語であるとも言えるでしょう。

## 開発環境
Javaは上に書いた通り大体のPCに入っていますが、バージョンが古かったりすることもあると思います。そういう時は、下のリンク先でJavaのダウンロードができます。
Java ダウンロードサイト：
https://www.oracle.com/java/technologies/javase-downloads.html

もし、自分のPCにどのバージョンがあるのか知りたい時はmacならターミナルで
/usr/libexec/java_home -V
を入力してください。そうすると、自分のPCにあるバージョンとパスが表示されます。
java --version
と入力すると、現在選択されているバージョンが分かります。
バージョンの切り替えは、
export JAVA_HOME=\`バージョンのパス\`
で行えます。自分の場合はJavaSE11で開発を行うので
export JAVA_HOME=\`/usr/libexec/java_home -v 11.0.6\`
と入力しました。

windowsならコンソールで行いますが、コマンドが違います。
今は試せないので、詳細な説明は記載しません。

今回は JavaSE11で開発を行うので、 Java SE 11(LTS)の Oracle JDK
のJDK Downloadをクリックします。
<img width="671" alt="スクリーンショット_2020-05-11_14_21_33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634014/99f5cafa-339c-0964-5133-3be437ce2233.png">

クリックした後、MacOS Installerをクリックしてください。
<img width="1054" alt="スクリーンショット_2020-05-11_14_22_01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634014/4cb094e7-1da7-1e3c-bc91-1fd11b6b89ca.png">

 その後、ダウンロードしたファイルをクリックし、指示に従っていけばインストールできます。

---
開発環境は様々ありますが、私はVisual Studio Code（以下VSCode）を使用します。
VSCode ダウンロードサイト：
https://azure.microsoft.com/ja-jp/products/visual-studio-code/

ダウンロードして、VSCodeを開き、デスクトップにpractice.javaを作成してください。そうすると、
'Language Support for Java(TM) by Red Hat' 拡張機能のインストールをお勧めします。
と表示されるので、言われる通りにインストールしましょう。
<img width="1033" alt="スクリーンショット_2020-05-11_9_45_47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634014/5f80e06b-5304-cd98-32e5-ee958f3ba1c6.png">

インストールが終われば、環境構築は完了です。
インストール後、プログラムを試す場合は
[VSCodeでHello World!](https://qiita.com/u-devi/items/74caeaeec3a00cb5e557) を参照してください。

 --fin--
プログラミング学習法検討

# 概要
仕事としてのプログラミングは好き、でも趣味ではやらない。
プログラミング上達したいけど、方法がよくわからない。
やってみたことと、その所感をメモします。
※やったことが増えたら追記します。

# 前提
・大学でC言語基礎勉強済み
・組み込みCの会社で、4年ほどコーディング経験あり（ただし上達しない）

# プログラミング学習法検討
1. プログラミングスクール
2. 書籍
3. サイト学習

# プログラミングスクール
上達所感：★☆☆☆☆
金額：8万円/5日（AM・PMフル換算）
コース：組み込みC
（あくまで通ったところの所感）
課題となるプログラミングの仕様書（詳細設計相当）が与えられ、コーディングする形式。
同じ場所に新卒の社会人が研修に来ていたことからもうすうす想像ができたが、組み込みが初めてならためになった。IOピンの制御など。
ただし、課題の本質が状態管理にあったので、アクティビティ図を考えられれば、コーディングの内容はほぼif文の制御となった。

# 書籍
- 書籍名：[C言語ポインタ完全制覇] 
(https://www.amazon.co.jp/%E6%96%B0%E3%83%BB%E6%A8%99%E6%BA%96%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%82%BA%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA-C%E8%A8%80%E8%AA%9E-%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E5%AE%8C%E5%85%A8%E5%88%B6%E8%A6%87-%E5%89%8D%E6%A9%8B-%E5%92%8C%E5%BC%A5-ebook/dp/B077ZTQY62/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=C%E8%A8%80%E8%AA%9E%E3%83%9D%E3%82%A4%E3%83%B3%E3%82%BF%E5%AE%8C%E5%85%A8%E5%88%B6%E8%A6%87&qid=1588920371&sr=8-1)  
上達所感：★★★★★  
ポインタが分からないという自覚がなくて、でも上達しなくて、とりあえず読んでみたらようやく自分がポインタを理解していなかったことに気づけた一冊。

# サイト学習
- サイト名：[paiza プログラミングスキルチェック](https://paiza.jp/challenges/info)
上達所感：★★★☆☆
アカウント登録：要
課題となる仕様書（基本設計、詳細設計（一部）相当）が与えられて、コードを考えながら作成する。
課題の主題は、方法の検討。数学で言うなら、公式を使ってどうやって問題を解くか。
コーディングの上達というよりは、頭の体操の所感。

- サイト名：[shakyo.io](https://shakyo.io/)
上達所感：★☆☆☆☆
アカウント登録：要
コードが与えられて、タイピングをするようなサイト。本当に写経。
開始するとストップウォッチが動き出すし、コード内のコメントもタイピングする必要があるので、タイピング練習感が強い。
フロントエンドエンジニアがDockerを独習する入口

# 不要不急だけどDockerを学習する動機
現在、フロントエンドを中心に開発業務を行っている。今のチームでDockerは用いられていないし、私自身はDockerを仕事で使ったことは無いが今後必要となる機会が出てくることを予想する。

これは私の気質の問題かもしれないが、「未経験からゼロから」ならDockerを使いこなすまで一気に学習しようという気持ちになるのかもしれないが、現時点フロントエンドでの開発を担当しており、バックエンドの環境構築やデプロイなどを他のメンバーに半分以上任せている状況では体系的に一から学習するモチベーションを保ちにくい。
そこで、「とりあえずDockerを使う環境構築とはどういうものか」というのを経験するまでを目標とした学習ロードマップを書き記す。

# 前提
## Windowsでの作業はやめとけ（WSL含む）
私はMacを触ったことないし、普段はWindowsを使っているが、開発はLinuxサーバーにSSHで接続して行っている。
はっきり言ってDockerに限らずWindowsで環境構築して開発作業するのはマゾです。やめておきましょう。
手間が膨大な上に書籍通りに操作しても詰まったりもするので非常に効率が悪い。
私の場合、PCを買い替えたときに前のPCにUbuntuをインストールしてSSH接続している。


## Dockerを触る前に最低限のLinuxコマンドは身に着けておくべき
Dockerを操作するコマンドも、docker-composeを書く時もLinuxで用いるコマンドを知っておかないと正直何もできない。シェル芸のように巧みに使いこなすまでは必要ないが「lsって何ですか？」「絶対パスと相対パスの指定の仕方って？」という状態では全く話にならないと思った方がいい。
Dockerを触りながらLinuxコマンドも一緒に覚えようとする根性のある人もいるかもしれないが、少なくとも私にはそれは無理。


# 学習のロードマップ
## ウェブや本での学習
### Docker/Kubernetes実践コンテナ開発入門
Dockerを一から始めるのにオススメなテキストと巷で言われているが、この本を端から呼んで手を動かしてみたところでそれだけで環境構築は出来るようにならない。ただ、確かに雰囲気は味わえるし、入り口で雰囲気を味わうことは重要なので途中までこの本を通して手を動かしてみるといい。
なお、書籍については何を選んでもあまり変わらないと思うのであまり何冊も手を伸ばす必要はない。

### 学習用ページ
ここを参考に。これも目を通しておくといい。
[【初心者向け】Dockerを勉強するための学習リソースをまとめてみた](https://kirohi.com/docker_study_resources)


## とりあえずWordPressを構築してみる
開発の現場では「Dockerfile」と「docker-compose.yml」を用いてコンテナを構築している。
一番最初に「使える」コンテナとしてはWordpressを構築することを非常にお勧めする。これなら特に引っかかったりはまることは無いため達成感を味わえるはず。
WordPressでWebやブログを構築したことある人は多いと思う。今はエックスサーバーをレンタルすればボタン一つでセットアップできるが折角ならばコンテナを用いてみよう。


[【個人メモ】DockerでWordPress使う](https://qiita.com/junara/items/795c5cc73ba9d33fd493)



## 他の開発環境を構築してみる
Wordpressで構築出来たら今度はRailsやReactなどの環境も構築してみる。Dockerfileなどの書き方は色々なところで転がっているが、今度はサイトに書いてある通りのことをやってみてもエラーが出てしまうことも多くなる。エラーが出たら一つ一つエラー内容を調べて解決していってみる。



以上のようなことを何度か行った後、書籍や入門ページを振り返ってみることを繰り返すと少しは慣れてくる。

以下、気付いたことが有ったら今後更新する。
ある自然数を外輪で一番近い２のべき乗に変換するプログラム（unsigned限定）

# ある自然数を外輪で一番近い２のべき乗に変換するプログラム（unsigned限定）
unsigned限定で外輪で一番近い２のべき乗を求めます、２のべき乗が入力された場合は倍にした数を返します、３なら４、４なら８へ変換します。
ある値の最上位ビットの位置を検索しその位置より一つ大きい方向へずらしたビット位置を１に設定することで求めます。
メモリプールを自作しべき乗でサイズを増やしていくパターンで使用しました。

# ソースコード

```c
typedef unsigned long typeSIZE;
typeSIZE NearPowerOf2(typeSIZE n) {
    static int bitlength = sizeof(typeSIZE) * 8;
    static typeSIZE hbit = (typeSIZE)1 << (bitlength - 1);
    for(int i = 0; i < bitlength * 8; i++) {
        if((hbit & (n << i)) != 0) {
            return (typeSIZE)1 << (bitlength - i);
        }
    }
    return 1;
}
```

# 以上です
EC2・nginxのエラー No space left on deviceの解決法

capistranoでデプロイを自動化させようと試していた際に、EC2を再起動したところエラーが表示されました。

```
cat log/nginx.error.log
```

```
2020/05/07 14:00:08 [crit] 3629#0: *2 pwritev() "/var/lib/nginx/tmp/proxy/1/00/0000000001" failed (28: No space left on device) while reading upstream, client: 121.3.47.42, server: 13.115.179.212, request: "GET /assets/application-147cfe69dba92e16c1d4275578eb1221ba9e6dd28140f02fd5d759e2e49bc49a.js HTTP/1.1", upstream: "http://unix:/var/www/rails/Portfolio/tmp/sockets/unicorn.sock:/assets/application-147cfe69dba92e16c1d4275578eb1221ba9e6dd28140f02fd5d759e2e49bc49a.js", host: "13.115.179.212", referrer: "http://13.115.179.212/"
```

EC2にログインした際も

```
ヒアドキュメント用一時ファイルを作成できません: No space left on device
```

と表示された。


```unicorn_rails -c /var/www/rails/Portfolio/config/unicorn.conf.rb -D -E```を入力する際にも同じようなエラーがでます。

##原因
capistranoのを使ったデプロイの自動化を試していて、失敗を繰り返しEC2内の容量が限界になってしまった可能性。



コマンドを調べつつ、下記のように表示された。

```
[shogo@ip-10-0-0-193 Portfolio]$ df -h

ファイルシス  サイズ 使用 残り 使用% マウント位置
devtmpfs     475M   0 475M  0% /dev
tmpfs      492M 4.0K 492M  1% /dev/shm
tmpfs      492M  19M 473M  4% /run
tmpfs      492M   0 492M  0% /sys/fs/cgroup
/dev/xvda1    8.0G 8.0G  20K 100% /
tmpfs       99M   0  99M  0% /run/user/1001
```

```
[shogo@ip-10-0-0-193 Portfolio]$ df -i
ファイルシス  Iノード I使用 I残り I使用% マウント位置
devtmpfs    121367  281 121086   1% /dev
tmpfs      125870   3 125867   1% /dev/shm
tmpfs      125870  356 125514   1% /run
tmpfs      125870   16 125854   1% /sys/fs/cgroup
/dev/xvda1   247976 247907   69  100% /
tmpfs      125870   1 125869   1% /run/user/1001
```



```
[shogo@ip-10-0-0-193 Portfolio]$ sudo find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
      1 .browserslistrc
      1 .env
      1 .gitignore
      1 .rspec
      1 Dockerfile
      1 Gemfile
      1 Gemfile.lock
      1 Guardfile
      1 Procfile
      1 README.md
      1 Rakefile
      1 babel.config.js
      1 config.ru
      1 docker-compose.yml
      1 entrypoint.sh
      1 package.json
      1 postcss.config.js
      1 storage
      1 yarn.lock
      2 lib
      6 log
      7 bin
      8 .idea
     24 .git
     27 db
     36 test
     40 spec
     47 config
    130 mysql-datavolume
    136 app
    186 repo
    952 pgsql-data
   1979 public
   4933 tmp
  13042 vendor
  43275 releases

```



releasesはcapistranoでデプロイする際に作成されるファイルなので、消して良い。

```
[shogo@ip-10-0-0-193 Portfolio]$ rm -rf releases
```

で、一度EC2をログアウトしてもう一度EC2にログイン。
エラーは出ない。

そして本番環境にデプロイできました。


その後capistranoを使ったデプロイを試していたのですがec2内にsettings.ymlがないと言われたので下記記事を参考にして修正しました。
https://qiita.com/hibriiiiidge/items/9ab230b69454f0c662bb

したがってその後同じ状況になり、releasesを削除したら動きました。releaseだけ削除で良さそう。
webpack-dev-serverを使って、スクリプト変更時に自動ビルド

## 目的
スクリプト（とりあえずJavaScript）変更時、自動的にビルドを行いたい

## 前提

以下の環境で確認

    "webpack": "^4.43.0",
    "webpack-cli": "^3.3.11",
    "webpack-dev-server": "^3.10.3"

## 実現方法

### ファイル配置 

```
C:.
|   package-lock.json
|   package.json
|   webpack.config.js
|   
+---dist
|       index.html
|       
+---node_modules
|   (省略)
|               
\---src
        index.js
        myutil.js
```

### 配置したファイル
src/index.jsでsrc/myutil.jsをimport

```index.js
import * as util from "./myutil";
console.log(util.Msg);
```

```myutil.js
export const Msg = "Hello World"
```
dist/index.htmlでは、出力予定のmain.jsをscriptタグに記載

```index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>sample</title>
</head>
<body>
    <script src="./main.js"></script>
</body>
</html>
```

例ではcontentBaseのみ指定（localhost:8080にアクセスした際、参照するフォルダ）

- src/index.jsがエントリポイントの為、entryを省略
- webpack-dev-server で動作させるだけであれば、メモリ上で処理されファイル出力をしないため、outputを省略
 
``` webpack.confing.js
module.exports ={
    devServer:{
        contentBase:"./dist"
    }
};
```

### 実行、確認

webpack-dev-server起動

```
.\node_modules\.bin\webpack-dev-server 
```

localhost:8080にアクセス後src/index.js若しくはsrc/myutil.jsを修正、保存する

- 自動的にビルド（bundle）される事を確認
- localhost:8080で修正内容が反映されている事を確認

## 参考
速習WebPack
https://www.amazon.co.jp/dp/B07CQLGGP9

devServerパラメーター
https://webpack.js.org/configuration/dev-server/
カスタムデコレータでもバリデーションする

validateCustomDecorators: true にするだけ
さらにtransformもtrueにすればclassTransformer.plainToClass()
した後のオブジェクトが使えるようになる。

```typescript

import { ValidationPipe } from '@nestjs/common';
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.useGlobalPipes(
    new ValidationPipe({ 
        validateCustomDecorators: true ,
        transform: true}));

  await app.listen(3000);
  console.log(`Application is running on: ${await app.getUrl()}/graphql`);
}
bootstrap();
```

https://github.com/nestjs/nest/pull/2304
Mockeryで警告出まくり！PHPStormで特定のブロックの特定の警告を無視する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103853/01393444-e371-9d6c-c62a-6343e4951e74.png)

ぎゃー！

###環境
- PHPStorm 2020.1.1
- mockery/mockery 1.3.1

###概要
先日PHPStormを最新版にアップグレードしたところ、
Mockeryを使ってmockを作っている箇所が画像のように警告出まくり！まっ黄っ黄になっています！
原因はmockery内のアノテーション。

```php
     /**
      * Expected argument setter for the expectation
      * 
      * @param mixed|mixed[] ...$args
      * @return self
      */
```
特に規則はないものの、可変引数の形式に配列を含めると、IDE側は引数に配列を期待してしまうようです。

###解決策
プルリクしましょう。
４日前にすでにプルリクエストが出ていますので、そのうち改善するかと思います。

https://github.com/mockery/mockery/pull/1054/files

###回避策
取り急ぎすぐにこの警告を無視したい場合、以下のように特定のブロックで警告を無視しておきましょうか。
（無関係の箇所で警告をオフにしたくないため）

```php
    public function test()
    {
        /**
         * @noinspection PhpParamsInspection
         * Mockeryが改善されるまで警告を無視
         */
        {
            $model = Mockery::mock(ExampleModel::class);
            $model->shouldReceive('a')->once()->with('a')->andReturn($model);
            $model->shouldReceive('b')->once()->withNoArgs()->andReturn($model);
            $model->shouldReceive('c')->once()->with(Mockery::on(function ($arg) {
                if ($arg instanceof Closure) {
                    $arg();
                    return true;
                }
                return false;
            }))->andReturn($model);
        }
    }
```
【LPIC 101】間違えやすいコマンドオプションまとめてみた

#はじめに
LPIC 101を受けるにあたって、コマンドやそのオプション・サブコマンドなどを覚えなければいけない。大体のオプション・サブコマンドは英語に乗っ取っているので、コツを覚えれば難しくはない。

例:-i→informationの略。情報を表示する。
-l→listの略。リスト表示。
etc

ただそういった通常の英語の法則性では考えづらいオプション・サブコマンドもあり、LPICでも問題として問われやすいと思われる。今回は私が特に間違えやすい・覚えづらいと思われるコマンドをピックアップして載せたいと思う。

（あくまで私個人が間違えやすい・覚えづらいと思ったもです。人によっては間違えやすいと思わない、掲載しているものより別のコマンドオプションの方が間違えやすいということがあるかもしれません。その点はご了承ください。）

#cp
|option |content|
---|---
|-i |コピー先に同名のファイルがあれば上書きするか確認|
|-d |シンボリックリンクをコピーする時は実体をコピー|
|-a |可能な限り元ファイルの属性とディレクトリの構成を保持してコピー|

#cut
|option |content|
---|---
|-c |抽出する文字位置を指定|
|-d |区切り文字を指定|


#egrep
|option |content|
---|---
|-v |マッチしなかった行を表示|

#fdisk
|subcommand |content|
---|---
|m |利用可能なコマンドを一覧|
|n |パーティションの作成|
|p |パーティションテーブルの表示|

#find
|option|content|
---|---
|type -l  |シンボリックリンクを検索|

※シンボリックリンクなのでsオプションかと思いきや、lなので注意。

#fsck
|option|content|
---|---
|-N  |実際には実行せず、実行する内容だけ表示|

#grep
|option|content|
---|---
|-c  |マッチした行の行数のみ表示|
|-v  |マッチしなかった行を表示|
|-i  |大文字と小文字を区別せず検索|

#mkdir
|option |content|
---|---
|-m |パーミッションを指定してディレクトリを作成|
|-p(--parents) |エラーを表示せず記述したディレクトリが存在しなければ作成|

#rpm
|option (suboption)|content|
---|---
|-e(--erase)|パッケージをアンインストール|
|-c(--configfiles)|設定ファイルのみを表示|

※アンインストールは通常removeが多いが、rpmはeraseなので注意。


#最後に
LPIC勉強中のため、必要に応じて追記します。

# 参考
https://eng-entrance.com/linux-command-mkdir
https://eng-entrance.com/linux-command-cut
https://eng-entrance.com/linux-command-grep
https://xtech.nikkei.com/it/article/COLUMN/20060227/230775/
https://qiita.com/kyohmizu/items/923844999018fd456d44
retina端末で画像アップロードする時のリサイズで注意するところ


iOS端末で、よく写真ををリサイズして、アップロードしたいことがある。

ただ、ちょっと注意しないと、Retina対応で画像が設定されたサイズで生成されないことがある。
これはUIGraphicsBeginImageContextWithOptions()メソットでscaleパラメーターで、期待されるサイズにならない場合があるほで、気をつけないといけない。
ここでは、scale 1.0を設定した実装で、実際リサイズしたいサイズでファイルが生成されるが確認される。

```swift:UIImage+extension.swift

   func resizeWithStorage(toWidth: CGFloat) -> UIImage {
        let scale = toWidth / self.size.width
        let toHeight = self.size.height * scale
        let newSize = CGSize(width: toWidth, height: toHeight)
        let rect = CGRect(origin: CGPoint(x: 0, y: 0), size: newSize)
        UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0) // <-- ここ
        self.draw(in: rect)
        let image: UIImage! = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }

``` 

>iOS、Androidアプリの制作なら、https://origon.co.jp にお任せください
>信頼且つ満足できる製品を納品いたします
QiitaでLaTeXマクロを使う


```math
\newcommand{\red}[1]{\color{red}{#1}} % 文字色の変更（赤）
\newcommand{\ueq}[1]{_{#1}} % 数式内の下付き記号用
\newcommand{\oeq}[1]{^{#1}} % 数式内の上付き記号用
\newcommand{\inv}[1]{\left(#1\right)^{-1}} % 数式内の逆行列用
```

私は, 普段LaTeXでマクロを使用しているのでQiitaでも数式を書く際もマクロを利用したかったのですが, 既存の記事が見当たらなかったので備忘録です.

基本的には, 記事の冒頭に~~記事中に~~`\newcommand`などのマクロコマンドを別行立てで書いておけばOKです
(注)記事の末尾に追加するとプレビュー時はマクロが有効になるが, 実際の記事上では有効にならなかった

## 例
**入力例**

>\`\`\`math
>\newcommand{\red}[1]{\color{red}{#1}} % 文字色の変更（赤）
>\newcommand{\ueq}[1]{_{#1}} % 数式内の下付き記号用
>\newcommand{\oeq}[1]{^{#1}} % 数式内の上付き記号用
>\newcommand{\inv}[1]{\left(#1\right)^{-1}} % 数式内の逆行列用
>\`\`\`
>マクロを利用して, 数式を
>\$\red{\dot{x}=Ax+Bu}\$
>\$G\ueq{a}=0\$
>\$G\oeq{+}=0\$
>\$\inv{\lambda I-A}=0\$
>のようにかけます

**出力**
マクロを利用して, 数式を
$\red{\dot{x}=Ax+Bu}$
$G\ueq{a}=0$
$G\oeq{+}=0$
$\inv{\lambda I-A}=0$
のようにかけます

## 参考サイト
- [Defining TeX macros](http://docs.mathjax.org/en/latest/input/tex/macros.html)
- [完全攻略！ LaTeXのマクロ定義](https://qiita.com/zr_tex8r/items/5067307890d36c0e4882)
AWS CLIでプロファイルを管理するコマンドあれこれ

業務で複数のAWSアカウントを管理する必要が出てきたので、関連するコマンドを纏めてみた。

### プロファイルを追加する
produserはプロファイル名。好きな名前を指定して良い。

```
aws configure --profile produser
```
### プロファイルの一覧を確認する
これはAWS CLIコマンドではないが、コマンドによって作られた設定ファイルを直接確認する。

```
cat ~/.aws/credentials
```

### コマンド単位でプロファイルを指定する
```
aws s3 ls --profile produser
```

### プロファイルを切り替える
```
export AWS_PROFILE=user1
```

### 現在のプロファイルを確認する
```
echo $AWS_PROFILE
```

### 現在の接続先を確認する
```
aws configure list [--profile profile-name]
```
クラスとインスタンス

# クラスとインスタンスの関係
クラスとインスタンスの関係は現実世界でもプログラム世界でも同じ。

（現実世界での例）
・私たちは「人間クラス」の「インスタンス」である。
・猫のタマは「猫クラス」の「インスタンス」である。

（プログラム世界の例）
・”名前”は「Stringクラス」の「インスタンス」である。
・１００は「Integerクラス」の「インスタンス」である。
Debianでhomebrewを使う方法

Docker初心者の覚え書き。間違っているところ、こうしたほうがいいなどあったら教えいただけますと幸いです。

#公式ドキュメントの方法そのままじゃ入らなかった

公式ドキュメントの代替えインストール(Alternative Installation)を使ったらできた。
aptitudeをインストールしたら、aptitudeに対してもaptitude updateを実行しないと最新のパッケージがインストールされないので注意。

```
apt-get update && apt-get install -y aptitude
aptitude update && aptitude install -y build-essential curl file git
git clone https://github.com/Homebrew/brew ~/.linuxbrew/Homebrew
mkdir ~/.linuxbrew/bin
ln -s ~/.linuxbrew/Homebrew/bin/brew ~/.linuxbrew/bin
eval $(~/.linuxbrew/bin/brew shellenv)
aptitude update
brew update
```

以下の言語のwarningが出るときは

```
line 4: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8): No such file or directory
```

localesをインストールして、言語設定をする

```
aptitude update && aptitude install -y locales
localedef -f UTF-8 -i en_US en_US

# 日本語を使っている人は下記
# localedef -f UTF-8 -i ja_JP ja_JP
```


#Dockerfileにしてみた
```Dockerfile
FROM debian:buster

RUN apt-get update && apt-get install -y aptitude
RUN apt-get update
RUN aptitude update && aptitude install -y build-essential curl file git
RUN aptitude update


# brewをinstall
RUN git clone https://github.com/Homebrew/brew ~/.linuxbrew/Homebrew
RUN mkdir ~/.linuxbrew/bin
RUN ln -s ~/.linuxbrew/Homebrew/bin/brew ~/.linuxbrew/bin
RUN eval $(~/.linuxbrew/bin/brew shellenv)

# 言語対応
RUN aptitude update && aptitude install -y locales
RUN localedef -f UTF-8 -i en_US en_US
```




#参考
[Homebrew on Linux — Homebrew Documentation](https://docs.brew.sh/Homebrew-on-Linux)

[cannot change locale をやっつける - ARCHIVESDRIVE HB](https://donbulinux.hatenablog.jp/entry/2018/08/06/143722)
Pythonと機械学習の環境構築（macOS）

##背景
　Pythonで機械学習の勉強を始めるにあたって環境構築の手順をメモの代わりに記事にすることにした。インストールしたソフトウェアは以下の５つである。また、私がMacを使っているのでmacOSを想定して記載する。

##インストールするソフトウェア
- Anaconda（Pythonの実行環境）
- OpenCV（画像・動画処理のライブラリ）
- MeCab（日本語形態素解析のライブラリ）
- Gensim(自然言語処理のライブラリ)
- TensorFlow/Keras（ディープラーニングのライブラリ）

##Homebrewの導入
　macOS用のパッケージマネージャーの「Homebrew」を利用して各ソフトウェアをインストールを行う。元々インストールしてあれば飛ばして構わない。以下をターミナルに貼って実行する。（参考： https://brew.sh/index_ja）

```
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```

##Anacondaのインストール
　はじめにpyenvをインストールする。以下のコマンドを順番にターミナルに打つ。

```
$ brew update
$ brew install pyenv
$ brew install pyenv-virtualenv
```

　続いて、pyenvをシステムに登録する。

```
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile
$ source ~/.bash_profile
```

　続いて、Anacondaをインストールする。私はAnaconda3-5.0.0をインストールしたが、バージョンは任意で変更可能である。また、インストールしたらシステムで有効にしておく。

```
$ pyenv install Anaconda3-5.0.0
$ pyenv global Anaconda3-5.0.0
```

##OpenCVのインストール
　次にOpenCVのインストールをする。以下のコマンドを実行する。

```
$ pip install opencv-python
```

##MeCabのインストール
 次にMeCabのインストールをする。以下のコマンドを実行する。

```
$ brew install mecab
$ brew install mecab-ipadic
$ brew install mecab-python3
```

##TensorFlowとKerasのインストール
　最後にTensorFlowとKerasのインストールを行う。以下のコマンドを実行する。KerasはTensorFlowにも同梱されているが、利便性向上のために個別でもインストールを行っておく。

```
$ pip install --upgrade tensorflow==1.5.0
$ pip install --upgrade keras==2.1.4
```

##まとめ
　以上のインストールがすべて終わるとPythonにおける機械学習で使う基本的なライブラリが揃う。これからPythonを使って機械学習をやってみたい方はぜひ参考にしてみてください。
　また、私自身初めての記事なのでわかりにくい場所があると思いますがご了承ください。

##参考文献
PythonによるAI・機械学習・深層学習アプリの作り方　出版：ソシム株式会社
著者：クジラ飛行机、杉山陽一、遠藤俊輔
【Angular】プロジェクト作成後、起動できない【エラー】

初投稿、、言葉足らずだったら申し訳ないです。

#環境
![angular_version.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633968/5da14469-eb41-ef59-7c1b-f4108b6b9dd7.png)

なんかいつもより、パッケージが増えてる気が、、、？


#エラー内容

```
ng new プロジェクト名
```
で新規プロジェクトを作成後、
ローカルサーバで立ち上げようとしたところエラーが発生しました。

![error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/633968/5dd2c246-a530-301e-6426-c1bf454b288e.png)

>TypeError: Cannot read property 'flags' of undefined

というエラー。。。。。

#解決策

下記コマンドで解決。

```
npm install @angular/core@9.1.4 @angular/animations@9.1.4 @angular/common@9.1.4 @angular/forms@9.1.4 @angular/platform-browser@9.1.4 @angular/router@9.1.4 @angular/platform-browser-dynamic@9.1.4 @angular/compiler@9.1.4 @angular/compiler-cli@9.1.4 @angular/language-service@9.1.4

ng build
```

数時間ほど試行錯誤しているなかで、あるサイトを見つけ解決しました。
[ERROR in TypeError: Cannot read property 'flags' of undefined](https://stackoverflow.com/questions/61670882/error-in-typeerror-cannot-read-property-flags-of-undefined)

ありがたい、、、
ubuntu18.04.4LTSのリポジトリ

```ruby:ubuntu18.04.4LTS
# deb-src http://jp.archive.ubuntu.com/ubuntu bionic multiverse
deb http://jp.archive.ubuntu.com/ubuntu bionic-updates multiverse
# deb-src http://jp.archive.ubuntu.com/ubuntu bionic-updates multiverse

## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
deb http://jp.archive.ubuntu.com/ubuntu bionic-backports main restricted universe multiverse
# deb-src http://jp.archive.ubuntu.com/ubuntu bionic-backports main restricted universe multiverse

## Uncomment the following two lines to add software from Canonical's
## 'partner' repository.
## This software is not part of Ubuntu, but is offered by Canonical and the
## respective vendors as a service to Ubuntu users.
# deb http://archive.canonical.com/ubuntu bionic partner
# deb-src http://archive.canonical.com/ubuntu bionic partner

deb http://jp.archive.ubuntu.com/ubuntu bionic-security main restricted
# deb-src http://jp.archive.ubuntu.com/ubuntu bionic-security main restricted
deb http://jp.archive.ubuntu.com/ubuntu bionic-security universe
# deb-src http://jp.archive.ubuntu.com/ubuntu bionic-security universe
deb http://jp.archive.ubuntu.com/ubuntu bionic-security multiverse
# deb-src http://jp.archive.ubuntu.com/ubuntu bionic-security multiverse


```
vimに入れてるpluginを晒す

git clone https://github.com/tpope/vim-endwise.git
git clone https://github.com/tpope/vim-rails.git
git clone https://github.com/tpope/vim-fugitive.git
git clone https://github.com/slim-template/vim-slim.git
git clone https://github.com/othree/yajs.vim.git
IQ Bot 意外と知られていない便利機能：グループへのコメント追加

IQ Bot のグループには自動で連番がふられます。

１インスタンスの中にグループが増えてくると、「グループ16ってどのフォーマットだっけ？」とわからなくなる場合がままあると思います。

そんなときに便利なのが、グループへのコメント追加機能です。

#グループへのコメント追加のやりかた

コメント追加のやりかたは簡単、該当のグループの「説明」のところにカーソルを合わせて編集するだけです。

![01_Botへの説明追加.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/b6d297b4-80f2-8ee1-6cbe-0941958f688a.jpeg)

![02_コメントの編集.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/5b98d91a-edef-3638-9494-37a7fa66b1c9.jpeg)

![03_追加できた.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/bcfd6b41-7620-c5fe-3603-f1ac42f3e908.jpeg)

#補足①：コメントは検索が可能

上記の要領でコメントを入れておくと、BOTタブからコメントの文字列で検索をかけることができます。

![04_コメント検索ができる.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/2f7f32ca-6118-9168-871b-d9a98683368b.jpeg)

ちなみにBOTタブでの検索はインスタンス名でもヒットします。以下は「注文書」で検索した例。

![05_インスタンス名でも検索OK.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/0c733140-e9be-872b-19bf-3ffcc82e8b29.jpeg)

#補足②：コメントが編集できるのは、「Botを編集」が生きている状態のとき

コメントが編集できるのは、ステージング状態でかつ、「Botを編集」のリンクが生きている状態のときだけのようです。

ステージングというのはプロダクション化されていない状態のことで、プロダクション化については[こちら](https://qiita.com/IQ_Bocchi/items/770dfcd569bcd5e4cad3)の記事をご参照ください。

「Botを編集」に関しては、[こちら](https://qiita.com/IQ_Bocchi/items/8abe2b9328847b88d7e0)の記事をご参照ください。

以上です！
BootstrapをYouTubeで復習

# わかりやすいｙｏｕｔｕｂｅを見つけた


たにぐち まことのともすたチャンネルが
わかりやすくて、`声も素敵`でイヤホンしながら聞くと
耳元で囁かれてる感じがして
やる気がみなぎると思う。

→[たにぐちまことのともすたチャンネル](https://www.youtube.com/playlist?list=PLh6V6_7fbbo9sHm8E3F7lZuDDxDJkheKD)

・・・簡単そうにヒョイヒョイやるし
あ、そういうことか〜って思うけど
自分でやってみると全然うまくいかなくて
今日もやけ食い！
Swagger-UI で TypeError: Failed to fetch が出て死ぬ

apiの開発を行うため、swagger-uiを利用していたが、ローカル上のapiに通信を行っても、*TypeError: Failed to fetch* となり結果が表示できなかった。

# 原因
CORSの設定が必要な構成になっていたこと。

## 構成
api → localhost:80
swagger-ui → localhost:8001

#修正内容
同じドメイン、ポート上で動くようにした(しろと公式に書いてあった)。
https://swagger.io/docs/open-source-tools/swagger-ui/usage/cors/

## 構成
nginx → localhost:80
nginxから振り分けでapi or swagger-ui

<hr>

# 調査してわかったこと
別コンテナで動かしている際、下記で解決したと思っていたが、これでは**getしか動かなかった**。

*Access-Control-Allow-Origin* を設定する

自分の場合は phpでslimを利用しているため

```php

/** @var Psr\Http\Message\ResponseInterface $response */
$response->withHeader('Access-Control-Allow-Origin', '*');
```

とすることで解決した。（*は後で変えようとは思う。）
TextField外をタップしたときにキーボードを閉じる

入力項目がある画面はだいたいタップでキーボードを閉じたい時の対応
※これもよくあるTipsなのでメモ程度として


## 画面をタップされた時に処理を行う
なにはともあれ、画面をタップされた時に閉じる処理を呼びたいということで、
ViewControllerを拡張しておきます。
以下コード

```swift
extension UIViewController {
    func setHideKeyboardTapped() {
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIViewController.hideKeyboard))
        tap.cancelsTouchesInView = false
        view.addGestureRecognizer(tap)
    }

    @objc func hideKeyboard() {
        view.endEditing(true)
    }
}
```

上記で拡張できたので、対象のViewControllerで setHideKeyboardTappedをviewDidLoadあたりで呼び出しておけばOK。

## 参考
[【iOS】UITextField のキーボードを閉じる処理について](https://qiita.com/takehito-koshimizu/items/d4bff11017c8f387486d)
IQ Bot：「Botを編集」と「Botを作成」は何が違う？

IQ Botのインスタンスの画面からマッピング設定の画面に以降するリンクで、文言が「Botを編集」になっている場合と「Botを作成」になっている場合があります。

この違いは何ですか？　という質問を受けましたのでお答えします。

![作成と編集の違い.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/587845/63d118e9-a3b2-788d-d903-efb06416ee29.jpeg)

#回答

ずばり、違いは以下のとおりです。

- **Botを編集**：当該グループのマッピング設定画面を**一度でも開いたことがある場合**
- **Botを作成**：当該グループのマッピング設定画面を**一度も開いたことがない場合**

#補足

このステータスが「Botを作成」の状態（＝つまりグループのマッピング設定を一度も開いたことがない状態）だと、「Bot」のタブにグループが表示される対象とならないようです。

以上です！
pythonで組み合わせの総数を計算

#はじめに
組み合わせのリストはitertoolを用いるが，総数の計算を求める方法については，検索の上位に出てこず時間がかかったのでここでメモ書きする

#Scipyの関数を使う(おすすめ)
scipy.special.combを用いる．詳細は[こちら](https://docs.scipy.org/doc/scipy/reference/generated/scipy.special.comb.html)

```python

from scipy.special import comb
```

【実行例】

```python
print(comb(4, 2))           #4C2の計算
print(comb([4 ,3], [2, 1])) #リスト形式でも渡せる、この場合、4C2と3C1の計算ができる
```
<br>

【実行結果】

```python
6.0
[6. 3.]
```



#関数を自作する場合

```math
_nC_r = \frac{n!}{r!(n-r)!}
```
を用いて，関数を自作する

```python
import math
def combination(n,r):
    return math.factorial(n)/math.factorial(r)/math.factorial(n-r)
```
<br>

【実行例】

```python
print(combination(4,2))  #4C2の計算
```

【実行結果】

```shell
6.0
```
playdate開発記録_000

初回なので自己紹介かねてメモ程度に投稿。

## ■私のスペック
1983年生まれの現在37歳です。
MTGとdiablo2とぷよぷよが好きです。


## ■普段なにしてる人？
建築系の営業職です٩( 'ω' )و


## ■Qiitaでなにするの？
playdate開発の記録を残します。

自分も備忘録としても、これからやる人のためにも。
私自身プログラム経験0なので超初心者向けの内容になりそうですが、
これを見て1人でもplaydateのゲーム開発する人が増えたらいいなと思ってます。


## ■playdateについて
https://play.date/

https://www.twitch.tv/videos/608233898

https://twitter.com/playdate

https://www.famitsu.com/news/201905/23176436.html
POSITION - CONTENT MARKETING EXECUTIVE

22-25 years old, bachelor’s Degree or equivalent work experience in Business or Commerce .

Have at least 3-month-experience in Marketing or related fields

Passionate for e-commerce industry and technology.

An ambitious and driven people who interested in fast moving environments.

A critical thinking and continuous learning person.

Exceptional writing in English and editing skills, as well as the ability to adopt the style, tone, and voice of our business' various types of content.

Ability to quickly learn new technologies, systems, and processes.

Own or potentially develop BSS core values: Passion, Responsibility, Integrity, Can-do attitude, Joy, Respect.

BECOME ONE OF US, YOU WILL

Together with the product team researching and building product marketing plan.

Create product content (includes blog posts, social media posts, website content, case studies, product videos, Quora/forum responses etc.) to articulate the benefits of products.

Optimizing content for search engines and lead generation.

Establish closed-loop analytics with sales to understand how content marketing activity turns into customers, and continually refine process to convert customers.

WHAT YOU HAVE AT LAC GIA INTERIOR

Salary: 300-500$/month (Review every 6 months).

Office with great view from 18th floor and creative workplace design.

At BSS, tea & coffee is free. Beside, we have a bookshelf with many interested book for our members borrow and of course, they are free too.

Working hours are 5 days/week.

English working environment with 100% foreign customers.

Working in an youthful and professional environment. 90% of members are 9x, we always support each other.

The State statutory holidays and collective activities organized by the Company (travel. team building, health care, volunteer…)

Other benefits according to the provisions of the Company and the Labor Code.

Website: https://noithatlacgia.com or https://noithatlacgia.com/sp/ban-ghe-sofa-go-oc-cho/
ARFoundationサンプルプログラム作成手順

- Package ManagerでAR Foundationパッケージを導入
- Unity projectを新規作成
    - こちらを参照: https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.0/manual/index.html#raycasting
- Build Settings
    - PlatformをiOSに設定
- Project Settings > Player Settings > iOS > Other Settings
    - Bundle Idenitierを設定
    - Camera Usage Descriptionを "Camera required for AR" に
    - Target minimum iOS Version を "11.0"に
    - Architecture を ARM64に
- Project Settings > XR Plug-in Management
    - iOSタブの "Plug-in Providers" で "ARKit"にチェック
- Build実行
    - "iOS"などの名前のフォルダを作って出力
- 出力されたUnity-iPhone.xcodeprojをXcodeで開く

- iOSのブラウザの「このiPad内」に、保存ファイルを見られるようにするために、info.plistについて以下の設定を行う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406597/f23b19c1-a26d-ad13-9034-d79ad158f19a.png)
Struts における役割整理メモ

#Struts で提供される代表的なコンポーネント紹介

## Controller

### ActionServlt
> javax.servlet.http.HttpServlet を拡張したクラスです。純粋にコントローラとして働き、クライアントからの要求を一元的に受け取り、処理を適切なアクション・クラスに委譲し、結果をビューの役割を果たす JSP などに渡す。

### ActionMapping
> アクション・マッピングは要求された URL パターンに対して、アクション・クラスの完全限定名をマッピングしており、ビジネスロジックをカプセル化したアクション・クラスへのマッピングと、応答先であるJSP へのマッピングを行う。アクション・マッピングを介して、ビューとコントローラは独立性を保つことができる。

### Action
> Action クラスは、要求に対して、対応するビーンなどで実装されたビジネス・ロジックの処理をハンドリングされる。アクション・サーブレットによって、アクション・クラスの execute() メソッドが呼び出され、この中で、認証、バリデーションなどの処理を実行して、適切なビジネスロジックを呼び出す。

### ActionForward
> アクション・クラスの execute() メソッドの戻り値型は ActionForward クラスです。このクラスは、アクション・サーブレットに対して、次に制御をどこに渡すのかを指示するものです。このフォワード先も、マッピングと同様に構成ファイル struts-config.xml に記述して使います。

## Model
> アクション・クラスから呼び出されるビジネス・ロジックがどのように実装されるかについて、Struts は規定しない。

## View

### ActionForm
> クライアント要求のフォーム情報を保持して、アクション、ビジネスロジック、ビュー間でやり取りするのに使われるものです。

### DynaActionForm
> ActionForm クラスの簡易クラスです。struts-config.xml の form-bean 要素によって生成され, 
 特別な処理が必要ない場合は、 ActionForm クラスを継承したサブクラスを実装するよりも、こちらの方が簡単で良いです。

### MessageResources
> Struts ではメッセージのローカライズの思想に基づく。また、フィールドのラベルやメッセージを MessageRecourcesから取得するもので、メッセージやラベルを一元管理する仕組みを提供。