OmniAICreator/Qiita-1.07M huggingface dataset:
javascript関数ドリル　初級編tail関数の実相のアウトプット

##tail関数の課題内容
　　　↓
https://js-drills.com/blog/tail/

##tail関数の取り組む前の状態
大体どういう風に組み立てればいいのかわかっていた

##tail関数に取り組んだ後の状態
自力でできた

##tail関数の実装コード（答えを見る前）

```js
function tail(array) {
  const tailArray = [];
  for(let i = 1; i < array.length; i++) {
    tailArray.push( array[i] );
  }

  return tailArray;
}

```

##tail関数の実装コード（答えを見た後）

```js
function tail(array) {
  const tailArray = [];
  for(let i = 1; i < array.length; i++) {
    tailArray.push( array[i] );
  }

  return tailArray;
}

console.log( tail([1, 2, 3]) );
// => [2, 3]
```
javascript関数ドリル　初級編slice関数の実相のアウトプット

##slice関数の課題内容
　　　↓
https://js-drills.com/blog/slice/

##slice関数の取り組む前の状態
大体どういう風に組み立てればいいのかわかっていた

##slice関数に取り組んだ後の状態
自力でできた

##slice関数の実装コード（答えを見る前）

```js
function slice(array, start = 0, end = array.length) {
  const slicedArray = [];
  for(let i = start; i < end; i++) {
    slicedArray.push( array[i] );
  }

  return slicedArray;
}

```

##slice関数の実装コード（答えを見た後）

```js
function slice(array, start = 0, end = array.length) {
  const slicedArray = [];
  for(let i = start; i < end; i++) {
    slicedArray.push( array[i] );
  }

  return slicedArray;
}

const numbers = [10, 20, 30, 40, 50];
const slicedNumbers = slice(numbers, 1, 4);

console.log( slicedNumbers );
// => [20, 30, 40]

console.log( numbers );
// => [10, 20, 30, 40, 50]
```
JNIのライブラリ導入時にハマった事象

# はじめに
現在参画している案件でJNIの外部ライブラリを導入する際にClassLoader問題にハマったため、備忘録として解決方法を残したいと思います。

# 環境
Java8
wildfly-8.1.0.Final

# JNIとは
Java Native Interface (JNI) は、Javaプラットフォームにおいて、Javaで記述されたプログラムと、他のプログラミング言語（たとえばCやC++など）で書かれた、実際のCPU上で動作するコード（ネイティブコード）とを連携するためのインタフェース仕様である。
（Wikipedia：https://ja.wikipedia.org/wiki/Java_Native_Interface より引用）

# 導入ライブラリについて
メイン処理がC++で実装された外部ライブラリで、JNIを利用してJavaに組み込もうとしていました。

# ハマった点
ビルド資材を作成した際に以下のような構成にしていました。

```terminal
service.ear
　├ lib
　│　└ jni.jar　← ここにJNIのjarを配置
　├ META-INF
　├ app1.jar
　├ app2.jar
　└ webapp.war
```

この資材をWildFlyにデプロイして起動すると1回目は正常に動作します。
問題は2回目以降にHotDeployすると以下のエラーが発生。

```terminal
java.lang.UnsatisfiedLinkError: Native Library xxxx.dll already loaded in another classloader
```

「すでに別のクラスローダーにロードされています」だと...なぜや...
WildFlyを再起動するとこの事象は解消されますが、再度HotDeployすると再発します。

# 調査結果
ネイティブライブラリは1つのクラスローダーにしかロードできないという制限があるようです。
1回目も2回目も同じJVM上で実行されていますが、ロードするごとに異なるクラスローダーが使用されるため結果的に同じJVMで２回のロードが行われているためこの現象が発生するようです。
（と解釈しましたが、間違っていたらご指摘下さい）

# 対応その①
ビルド資材の中からJNIのjarファイルを除去しました。

```terminal
service.ear
　├ lib　← ここにJNIのjarを配置しない
　├ META-INF
　├ app1.jar
　├ app2.jar
　└ webapp.war
```

# 対応その②
WidlFlyに静的モジュールとしてjarを配置します。

wildfly-8.1.0.Final/modules/system/layers/base配下にフォルダを作成します。
（例）wildfly-8.1.0.Final/modules/system/layers/base/xxx/yyy/main

作ったフォルダにjarファイルとmodule.xmlを配置します。

```terminal
base/xxx/yyy/main
　├ jni.jar
　└ module.xml　←　新規でファイルを作成
```

module.xmlの中身です。
maduleタグのnameに上で作成したディレクトリ構成と合わせます。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<module name="xxx.yyy" xmlns="urn:jboss:module:1.1">
    <resources>
        <resource-root path="jni.jar"/>
    </resources>
</module>
```

# 対応③
jboss-deployment-structure.xmlに依存関係を追加する。

```xml
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
    <deployment>
        <dependencies>
            <module name="xxx.yyy" export="true" />
        </dependencies>
    </deployment>
</jboss-deployment-structure>
```
# 最後に
以上の対応でHotDeploy後もClassLoaderのエラーは出なくなりました。
他にミドルウェア周りに詳しいメンバーがいなかったため必死になって調べたので備忘として残しておこうと思いました。
本当にこの対応が正しいのかは不明ですが、ひとまず事象が解決したので良しとします。

# 参考
WildFlyのクラスローディング
https://qiita.com/tama1/items/f1556886149722b87f78
Android 11のPackage visibilityへの対応

Android11からはPackageManagerを使ってqueryIntentActivitiesなどで他のアプリがインストールされているか調べるのに制限がかかります。
targetSdkVersionを30にすると、デフォルトでは一部のシステムアプリしか結果が返ってきません、どのようなアプリを調べるのかの宣言が必要になります。

要するに以下の内容です。
https://developer.android.com/preview/privacy/package-visibility?hl=ja

宣言方法は2種類あります。
以下のように、調べたいパッケージ名を指定するか、

```xml:AndroidManifest.xml
<manifest package="com.example.game">
    <queries>
        <package android:name="com.example.store" />
        <package android:name="com.example.services" />
    </queries>
    ...
</manifest>
```

以下のようにIntentFilterで指定する方法です。

```xml:AndroidManifest.xml
<manifest package="com.example.game">
    <queries>
        <intent>
            <action android:name="android.intent.action.SEND" />
            <data android:mimeType="image/jpeg" />
        </intent>
    </queries>
    ...
</manifest>
```

ここで指定するのは、アプリの中でどのようなクエリで調べるかではありません。
ここで指定した条件に合致するアプリが、アプリからのクエリで調べられるようになる、というだけです。

例えば、マニフェストの条件に該当するアプリが A,B で、アプリ内のクエリに合致する端末内アプリが A,C だったとすると、アプリへはAだけが結果として返るようになる。という動作になります。

## CustomTabsを使う場合の指定

（Chrome限定ではなく）CustomTabsを使う場合、`android.support.customtabs.action.CustomTabsService`というActionに反応するサービスを持つアプリ、かつ、ブラウザであるパッケージを調べます。
なので、安直に設定するなら以下のようになるでしょう。

```xml:AndroidManifest.xml
<queries>
    <intent>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <data android:scheme="http"/>
    </intent>
    <intent>
        <action android:name="android.support.customtabs.action.CustomTabsService"/>
    </intent>
</queries>
```

しかし、`android.support.customtabs.action.CustomTabsService`というActionのクエリだけ書いておけば、ブラウザを調べたときに`android.support.customtabs.action.CustomTabsService`に反応し、かつ、ブラウザのアプリだけが返却されるようになるので以下の条件だけ書けばよいことになります。

```xml:AndroidManifest.xml
<queries>
    <intent>
        <action android:name="android.support.customtabs.action.CustomTabsService"/>
    </intent>
</queries>
```

## ランチャーから起動可能なアプリの指定

以下のように書けば、ランチャーから起動可能なアプリすべてを調べられるようになります。
特殊なアプリを除けば、ランチャーから起動可能ですので以下の記述でAndroid11未満と同様にほぼすべてのアプリを調べられることになります。

```xml:AndroidManifest.xml
<queries>
    <intent>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent>
</queries>
```

## SpeechRecognizerを使う

どうやら、SpeechRecognizerもPackage Visivilityの影響を受けるようです。

```xml:AndroidManifest.xml
<queries>
    <intent>
        <action android:name="android.speech.action.RECOGNIZE_SPEECH"/>
    </intent>
</queries>
```

パッケージを調べるという操作は、そんなにやることはなかろうと思いつつも、CustomTabsぐらいは使っているでしょうし、SDK内部でパッケージを調べている場合も影響を受けるため、targetSdkVersionを30にして動作がおかしい場合はこいつをチェックするようにしましょう。
Python フォルダ内の全Zipを解凍処理（再帰的）文字化け対応　（Qiita初投稿）

初Qiita投稿
普段はRとかPythonとデータ可視化をTableauでやっています。

#ZipをPythonで解凍したいけど文字化けするしてしまうとき


#import
```
from zipfile import ZipFile
```
#文字化けしないで解凍
```
for file in zip_files:
    with ZipFile(file) as zip:
       for info in zip.infolist():
           info.filename = info.filename.encode('cp437').decode('cp932')
           zip.extract(info)  
```
人によってはunicodeとかでもできるらしい。
これで解凍できます。




##Qiita初投稿
何年も私、助けられすぎているので少しずつノウハウを更新できれば。
がんばります
javascript関数ドリル　初級編nth関数の実相のアウトプット

##nth関数の課題内容
　　　↓
https://js-drills.com/blog/nth/

##nth関数の取り組む前の状態
参考演算子が使えるんじゃないかと考えていた

##nth関数に取り組んだ後の状態
どちらのやり方でもできるように理解できた

##nth関数の実装コード（答えを見る前）

```js
function nth(array, n = 0) {
  return n >= 0 ? array[n] : array[array.length + n];
}

const array = ['a', 'b', 'c', 'd'];
```

##nth関数の実装コード（答えを見た後）

```js
function nth(array, n = 0) {
  return n >= 0 ? array[n] : array[array.length + n];
}

const array = ['a', 'b', 'c', 'd'];

console.log( nth(array, 1) );
// => 'b'

console.log( nth(array, -2) );
// => 'c';
```
【AWS SAA】プライベートサブネットとパブリックサブネットの使い分け　

#はじめに

下記URLのようなプライベートサブネットとパブリックサブネットの使い分けに関する問題が、AWS SAAでよく出題されます。
https://awsjp.com/exam/saa-sap/c/exam95.html

しかし初心者だとサーバーの違いや構成を知らないため、そもそもの問題文の意味の理解もできないのではないかと思います。今回はWebの２層構造を通じて、プライベートサブネットとパブリックサブネットの使い分けを説明したいと思います。　

#イメージ
[[AWS]WordPressの構築方法](https://qiita.com/kono-hiroki/items/e8ec3efe76bea53402a8)や[【AWS】WordPressを作った時の備忘録](https://qiita.com/blackpeach7/items/be28e2249f308bac7592)のようにWordPressを作成すると、パブリックサブネット内にあるWEBサーバーとプライベートサブネット内のDBサーバーの流れや構成がわかって良いのではないかと思います。
もし時間があれば、実際に作ってみると、問題の理解度も違ってくるかと思います。

![スクリーンショット 2020-09-11 18.22.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449478/87cdc7b0-c524-1cbd-12e2-b2f9996e33ec.png)

#説明
現在の主流としてはWEBサーバー、APサーバー、DBサーバーの三層構造がWebシステムの典型的な構成となっていますが、システムによってはWebサーバとAPサーバを1台に統合したり、Webサーバがなかったりなどします。
SAAでは三層構造で出てくることはないと思われるため、WEBサーバーとDBサーバーの二層構造を中心に考えたいと思います。

|サーバー |説明  |
|---|---|
|Webサーバー  |主に静的コンテンツを提供する役割のサーバー。  |
|DBサーバー  |データを提供するサーバー。  |
|APサーバー（おまけ） |主に動的コンテンツや業務処理を提供するサーバー。  |

HTMLファイルや画像などのコンテンツを配置しているWEBサーバーがあり、データが必要な場合WEBサーバーからDBサーバーにデータを要求する仕組みとなっています。

パブリックサブネットのWEBサーバーはアウトバウンドトラフィックを直接インターネットに送信できます。WEBサーバーはプライベートサブネットと同じVPC内でホストされるため、DBインスタンスに接続できます。
その一方プライベートサブネットのDBサーバーはインターネットにアクセスできないため、その分セキュリティがより強固になります。

このようにサブネットを分けることで、適切にセキュリティに強い設計が作ることができます。そのためプライベートサブネットとパブリックサブネットの使い分けが非常に重要なってきます。　


参考
https://thinkit.co.jp/article/11526?fbclid=IwAR1xhqnZ4CYQllY6dTS3htOVump-I14LJFh2HAWPac-OnZSSmNmu9N0Iiks
https://www.b-architects.com/blog/wiki/web-server
https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/CHAP_Tutorials.WebServerDB.CreateVPC.html
RxJava2CallAdapterFactoryをaddしたRetrofit Clientで返り値Call型が指定されたAPI定義を実行するとどうなるか？

こんな感じでRetorfit Clientを作成しているコードがあるとする。

```kotlin
val retrofitClient = Retrofit.Builder()
    .baseUrl(url)
    .client(okHttpClient)
    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
    .build()
```
	

`addCallAdapterFactory`で`RxJava2CallAdapter`を追加しているため、このクラインとでは次のようなObservable型を返すようなAPI定義を実行した際にレスポンスをObservableとして扱える。

```kotlin
 interface SmapleAPI {
     @GET("foo/bar")
     fun getSampleResponse(): Observable<Hoge>
 }
```

この時、次のCall型を返すようにAPI定義し`RxJava2CallAdapter`を追加したクライアントでAPIリクエストするとどうなるか？

```kotlin
 interface SmapleAPI {
     @GET("foo/bar")
     fun getSampleResponse(): Call<Hoge>
 }
```

この場合、APIリクエストするとCall型としてレスポンスを受け取れます。

## RetrofitがCallAdapterをレスポンスに適用する流れ

addCallAdapterFactoryで渡されたクラス(CallAdapter.Factoryを継承したクラス)はRetrofitクラスの`List<CallAdapter.Factory> callAdapterFactories`変数に追加される。(callAdapterFactoriesにはデフォルトでDefaultCallAdapterFactoryが追加されている。)

そして、Retrofitクラスの[nextCallAdapterメソッド]( https://github.com/square/retrofit/blob/63cf3e66c4b661170a34a396e9be8a2a01c0e57f/retrofit/src/main/java/retrofit2/Retrofit.java#L246)でCallAdapter.FactoryからCallAdapterを得てそれがレスポンスに適用される。([HttpServiceMethodクラスのadaptとそれをoverrideした各クラスを参照](https://github.com/square/retrofit/blob/108fe23964b986107aed352ba467cd2007d15208/retrofit/src/main/java/retrofit2/HttpServiceMethod.java#L149))

この処理は次のnextCallAdapterコードで行っている。

```java
int start = callAdapterFactories.indexOf(skipPast) + 1;
for (int i = start, count = callAdapterFactories.size(); i < count; i++) {
    CallAdapter<?, ?> adapter = callAdapterFactories.get(i).get(returnType, annotations, this);
    if (adapter != null) {
        return adapter;
    }
}
```

ここで、CallAdapter.Factoryのgetメソッドの戻り値が`null`となる場合、nextCallAdapterメソッドはadapterを返さないのでレスポンスに適用されない。

そして、[RxJava2CallAdapterFactoryのgetメソッド](https://github.com/square/retrofit/blob/master/retrofit-adapters/rxjava2/src/main/java/retrofit2/adapter/rxjava2/RxJava2CallAdapterFactory.java#L94)では次のような判定を行い、`rawType`が`Observable`、`Flowable`、`Single`、`Maybe`型でなければ`null`を返している。

そのため、nextCallAdapterメソッドでもRxJavaCallAddapterを返さず、レスポンスにRxJavaCallAddapterが適用されることは無い。

```java
boolean isFlowable = rawType == Flowable.class;
boolean isSingle = rawType == Single.class;
boolean isMaybe = rawType == Maybe.class;
if (rawType != Observable.class && !isFlowable && !isSingle && !isMaybe) {
    return null;
}
```
javascript関数ドリル　初級編lastOf関数の実相のアウトプット

##lastOf関数の課題内容
　　　↓
https://js-drills.com/blog/lastindexof/

##lastOf関数の取り組む前の状態
for分をどうすればいいのか悩んだ

##lastOf関数に取り組んだ後の状態
let i = fromIndex; 0 <= i; i--
このように±を逆にできることを知れた。

##lastOf関数の実装コード（答えを見る前）
実行できませんでした
##last関数の実装コード（答えを見た後）

```js

function lastIndexOf(array, value, fromIndex = array.length - 1) {
  for(let i = fromIndex; 0 <= i; i--) {
    if(array[i] === value) {
      return i;
    }
  }

  return -1;
}

console.log( lastIndexOf([1, 2, 1, 2], 2) );
// => 3

// Search from the `fromIndex`.
console.log( lastIndexOf([1, 2, 1, 2], 2, 2) );
// => 1
```
Python3 multiprocessing starmap で大きい配列データを扱うとエラーが出る

Python3 multiprocessing.Pool で starmap で大きめな画像データ(配列データ)を複数処理すると以下のようなエラーがでます.

```
Reason: 'error("'i' format requires -2147483648 <= number <= 2147483647")
```

メモリが足りたとしても, なにかしらの原因で内部でのインデクシングの範囲が int32 を超えてしまったようです.

Process など別の方法で処理が必要そうですが, プロセスで共有したい変数は multiprocessing.Array などで定義しないとならずめんどいですね...
Vue.jsでHeadタグ内のタイトルとメタタグを設定する

# 課題

SPAでもページごとにタイトルやメタタグを設定したい。
SPAだし、メタタグはいらないけど、ページタイトルは変更したいかなぁって感じ。

Nuxt.jsは、title設定があるけど、同じような感じでVueでも設定したい。

# TL;DR

## vue-head

Headプロパティでタイトルを含めて、Headに設定できることを操作できる感じ。
934スターあるし、プロジェクトにスポンサーもついているし鉄板ぽい

https://github.com/ktquez/vue-head


## vue-page-title

タイトル変更に特化した感じ。
Nuxt.jsのように、titleプロパティを設定して使えたり、Vue-routerのメタタグにTitleを設定することで反映される。
107スターなので、少しマニアックっぽい。

https://github.com/vinicius73/vue-page-title


# 追記

githubで検索していたら、<code>vue-headful</code>というのもあった。

https://github.com/troxler/vue-headful

<code>vue-head</code>と機能は同じだけど、記述の仕方がコンポーネントとして記述するので、少し違和感が。。。。

ただし、219スターなので、それなりに人気があるのかな？

# 参考文献

* [vue.jsでheadの要素を設定する時はvue-headが便利！](https://ti-tomo-knowledge.hatenablog.com/entry/2018/06/21/104519)
    * Vue-headの紹介記事
* [【Vue.js】titleタグやmetaタグ(description)を書き換える方法【vue-rouetr】](https://www.sky-limit-future.com/entry/vue_title_desc_tag)
    * 手法をまとめてくださっている。
* [vue.js router を 使い 動的に title や meta タグを変更](https://qiita.com/ma7ma7pipipi/items/f47dfc9910e168f9f1b7)
    * vue-page-titleで実装されている方法と似ている。アイデア元が一緒かも？
* [Vue + vue-router で動的にページタイトルを変更する方法](https://qiita.com/livejam_db/items/a9d8a8cbead668bad18e)
    * vue-page-titleで実装されている方法と似ている。アイデア元が一緒かも？
* [Updating Page Title & Metadata with Vue.js & vue-router](https://www.digitalocean.com/community/tutorials/vuejs-vue-router-modify-head)
    * Vue-routerのナビゲーションのフックを使って操作する方法
javascript関数ドリル　初級編last関数の実相のアウトプット

##last関数の課題内容
　　　↓
https://js-drills.com/blog/last/

##last関数の取り組む前の状態
なんとなく行けそうだった

##last関数に取り組んだ後の状態
index番号を忘れていて-1をつけ忘れていた

##last関数の実装コード（答えを見る前）

```js
function last(array) {
  return array[array.length - 1];
}

console.log( last([1, 2, 3]) );

```
##last関数の実装コード（答えを見た後）

```js
function last(array) {
  return array[array.length - 1];
}

console.log( last([1, 2, 3]) );
// => 3
```
C#学習時のメモ　(随時修正)

## 標準入力
```c#
//ここでは入力値をそのまま変数に代入しているので=の右側だけでOK
//文字列
var date = Console.ReadLine();
//int型
var num = int.Parse(Console.ReadLine()); //int.Parseでint型に変換している
```
## 出力
```c#
//改行なし
Console.Write(/*出力値*/);
//改行あり
Console.WriteLine(/*出力値*/);
```
## Console.ReadKey
自動でプログラムが閉じるのを任意の場所で入力待ちの状態にできる

```c#
Console.WriteLine("HELLO");
//通常ならここでHELLOを出力してプログラムが閉じるが以下の記述があると入力待ちの状態になる
Console.ReadKey();
```
## if文
```c#
if (/*条件式*/) {
  /*処理*/
} else if (/*条件式*/) {
  /*処理*/
} else {
  /*処理*/
}
```
## while文
```c#

//以下はじめに無限ループにならないようカウンタ変数の宣言
var i = 0;
while (/*カウンタ変数の条件式*/) {
  /*ループ処理*/
  //以下カウンタ変数の更新
  i+=1
}
```
## for文
```c#
//forの後に(カウンタ変数の宣言; 条件式; カウンタ変数を更新)
for (var i = 0; i<10; i+=1) {
  /*繰り返し処理*/
}
```
## 配列
```c#
//配列の宣言
int ary[5]; //要素の型 配列名[要素の数]
//要素を指定して配列を作成
string[] words = {"C#","Go","Ruby"};
int[] nums = {2,4,6,8};

//はじめに配列に入れる要素数がわからない時はListクラスを使用
using System.Collections.Generic;
var ary = new List<string>();
ary.Add("C#"); //Listで作成した配列に要素を追加
ary.Insert(0,"Go"); //Listで作成した配列に挿入　一つ目の引数にindexを指定

//多次元配列の扱い
string[] ary1 = {"山田", "佐藤", "小林"};
string[] ary2 = {"遠藤", "松田", "若林"};
string[][] names = {ary1,ary2}; //宣言の際[]を一つ増やして配列を配列に入れる
names[1][1] //松田
```
## Splitメソッド
文字列の分割

```c#
var name = "山田 太郎";
string[] names = name.Split(' '); //この場合はスペースで分割しnames配列に入れている
//分割の際の引数は削除される
```
## string.Joinメソッド
配列の要素を連結する

```c#
//配列の中身を一度に出力できる
string[] names = {"山田","山本"};
Console.WriteLine(string.Join(",",names)); //一つ目の引数に要素同士の間に区切り文字を指定
//山田,山本と出力
```
## foreach
配列の中身や文字列を一つずつ処理

```c#
int[] nums = {1,2,3,4,5};
//配列の中の値をそれぞれ２倍にして出力
foreach (int num in nums) { //foreach(foreachメソッド内で使う変数を型 その名前 in 処理する対象の配列や文字列)
  Console.Write(num*2);
}
//246810
var word = "あいうえお";
foreach (char s in word) {
  Console.WriteLine(s);
}
//一文字はstring型ではなくchar型になる。
//それぞれ改行されてあいうえおが出力
```
## Lengthメソッド
配列や文字列の長さを取得

```c#
var word = "hello"
var snum = "1234567"
var num = 1234567
string[] ary = {"A","B","C"}
word.Length // 5
snum.Length // 7
num.Length // 変数numの値が文字列では無いのでエラー
ary.Length // 3
```
## Substringメソッド
文字列から指定の文字列を取得

```c#
var word = "ABCDEFGH";
Console.WriteLine(word.Substring(3,2)); //一つ目の引数に取得開始位置のindex　二つ目に取得する文字数
// DEと出力
```
## IndexOfメソッド
文字列や配列から文字を探して位置やindexを返す

```c#
var word = "あいうえおあいうえお";
Console.WriteLine(word.IndexOf("え")); //引数に探したい文字を入れる
// 一つ目の”え”のindexである3が出力される
Console.WriteLine(word.IndexOf("か"));
// 文字列に含まれない場合は0を出力

string[] names = {"内山","神谷","尾崎"};
Console.WriteLine(Array.IndexOf(names,"神谷")); //配列はArray.IndexOf(配列名,探したい要素)と記述する
// 1が出力
```
## Selectメソッド
Linqを用いてforeachの様に要素それぞれに処理を行う、多言語のmapに近い

```c#
using System.Linq; //これでLinqが使える
int[] nums = {1,2,3,4,5};
var ary = nums.Select(x => x*2); //numsの要素を左辺でxに代入し右辺で処理を行いaryに格納する
Console.WriteLine(string.Join(",",ary)); //aryを連結して出力
// numsの要素それぞれを２倍にした2,4,6,8,10が出力される
```
## Whereメソッド
Linqを用いてforeachの様に要素それぞれに処理を行う、条件に合うものを返す

```c#
using System.Linq; //これでLinqが使える
int[] nums = {1,2,3,4,5};
var ary = nums.Where(x => x>2); //numsの要素を左辺でxに代入し右辺で条件に合うか照合し合うものだけaryに格納する
Console.WriteLine(string.Join(",",ary)); //aryを連結して出力
// numsの要素の中で２より大きい値の3,4,5が出力される
```
Webアプリ開発の記事まとめ

#はじめに
DreamHanksの松下です。新規でWebアプリの開発を行いました。
こちらの記事は、その記事のまとめです。


#連載記事まとめ
[【第一回】Spring-MVCフレームワークのプロジェクトの作り方](https://qiita.com/DreamHanks/items/a148d9b96343f7a535d1)
[【第二回】SpringとMySqlとMyBatisの連動方法](https://qiita.com/DreamHanks/items/f80d27d42c3b9f895e61)
[【第三回】MyBatis Generatorのインストール方法と事前準備](https://qiita.com/DreamHanks/items/5fb51404e7afb852dbf1)
[【第四回】MyBatis Generatorの実行方法と流れ](https://qiita.com/DreamHanks/items/8d0aa5eb28ad34ec0554)


#補足記事
[Mavenの解説](https://qiita.com/DreamHanks/items/96c73244e8f37db3e318)
[root-context.xmlの解説](https://qiita.com/DreamHanks/items/8fae408cb887aa6b47e7)
[servlet-context.xmlの解説](https://qiita.com/DreamHanks/items/95d66272275a0d1984a1)


#おわりに
上記以降の連載記事や解説記事は[こちら](http://blog.dreamhanks.com/java%e3%82%a6%e3%82%a7%e3%83%96%e3%82%a2%e3%83%97%e3%83%aa%e9%96%8b%e7%99%ba/)（DreamHanksのブログ）で閲覧することができます。
PowerAutomateでTeamsに通知する簡単なリマインダーを作成した

## 背景

* 会社でOffice365を導入したことでslackからTeamsにチャットツールが変わった
* 今までslackのリマインダーを常用していたけどTeamsにはそんな便利な機能は無い
* Teamsは使いづらい(愚痴)
* PowerAutomateっていうちょっと面白そうなものがあるので試しに作ってみた


## 概要

* SharePointに通知したい内容、日時を記録したExcelを配置
* 5分間隔で起動し、日時が一致している場合はTeamsに通知
* 日付指定がない場合は毎日通知


## 内容

### SharePoint上にExcelファイルを作成

こんな感じに簡単な一覧を作成。

![](2020-09-10-19-30-39.png)![2020-09-10-19-30-39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488411/38aeaa9a-d598-5bc2-377c-4b7a439bbbf6.png)


Excelからデータを取得するには、取得したいデータがテーブルである必要があるので注意。

![2020-09-10-19-31-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488411/eb00c78e-68f6-5a6a-577b-1bd10c2d7a68.png)


### PowerAutomateでフローを作成

PowerAutomateの作成画面から、今回はスケジュール実行なので予定フローを作成を選択

![2020-09-10-19-33-35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488411/e217d670-6cf9-60b1-f881-d2fc8b5668db.png)


フロー名と繰り返し間隔を指定して、作成する。
ここだけ後で画像を取ったので、名前が違うのは許してください…

![2020-09-10-19-35-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488411/0bad3bf8-0939-f20d-a6f9-30cb03a79819.png)

### フローの中身

#### Recurrence

予定フローを作成画面で指定した通り、5分間隔で実行するように初期状態で設定されている。
メッセージをフローボットとして投稿を使うので多分@メンショントークンを取得は無くても良い。

![2020-09-10-19-21-27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488411/0c222a06-21bc-45e5-46fa-8f474b60b27c.png)

#### 表内に存在する行を一覧表示

SharePoint上に作成したExcelファイルを指定する。

![2020-09-10-19-23-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488411/da333cd5-8a76-6300-d287-762e072c538c.png)

#### Apply to each

Excelから取得した行数分繰り返す。

ループ内のアクションで条件分岐を作成し、通知を送る条件に一致しているかを判定する。

* 日付が一致しているか（またはブランクか）
* 時刻が一致しているか

![2020-09-10-19-25-28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488411/b8ec7296-0b96-dac7-a8e3-db060cb7e5cb.png)

![2020-09-10-19-25-59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488411/940f8342-ff96-80b0-186b-e45d1a20ad05.png)


FormatDateTime関数の引数は以下の通りに指定する。

##### 現在の日付を取得

```
formatDateTime(convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time'), 'yyyy/MM/dd')
```

##### 現在の日時から時間を取得

```
formatDateTime(convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time'), 'HH')
```

##### 現在の日時から分を取得

```
formatDateTime(convertTimeZone(utcNow(), 'UTC', 'Tokyo Standard Time'), 'mm')
```

#### メッセージをフローボットとして投稿

メッセージの送信先、メッセージの内容を指定する

![2020-09-10-19-27-25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488411/fc89b2ec-78e7-85bf-713b-1d0740135ef8.png)


## 結果

こんな感じにFlowからメッセージが届く

![2020-09-10-19-41-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488411/599081dd-9a2e-c549-9105-ce8413d2ebe5.png)



## 感想

* アクションや関数の設定内容が分かりづらい
* 最初はとっつきづらいけれど慣れればなんとなくで作れそう
* Teamsは使いづらい(愚痴)
テストでMarkdown記法を書いてみた。

test

```python:test.rb
line1 test programing code
line2 test method 'aaaaa', 'bbbbb'
```

_イタリック_ *イタリック*
__強調__ **強調**
~~打消し線~~


# 1
aaaaa
## 1.1
bbbbb
### 1.1.1
ccccc



ruby rails
Railsコンソールを使用してレコードを追加する

#動機
Railsでアプリケーション開発を行っている際DBへレコードの追加をどう行うか忘れてしまうため記録

##前提：コンソールの立ち上げ

 ```
$ rails c
```

##レコードの追加
レコードの追加は createメソッドを使用

```
[1] pry(main)> モデル名.create(カラム名: '追加したいvalue')
```

例)

```
[1] pry(main)> Todo.create(title: 'Rails',content: 'Rails Practice' )
```


##他にも
・create!
　　何かが足りない時にエラーを返してくれる、絶対に不足しては困るものがある場合使用

・save
　　インスタンスを作成しsaveを使用することでcreateと同じ
　　こちらもsave!がある

```
インスタンス名 = モデル名.new({ カラム名: ‘文言’, カラム名: ‘文言’ })
インスタンス名.save
```

・update
　　データの更新を行いたい時に使用
　　update!もある

```
モデル名.update({ カラム名: ‘文言’ })
```

・assign_attributes
　　下記の使用でupdateと同じ

```
変数名 定義
変数名.assign_attributes({ カラム名: ‘文言’ })
変数名.save
```
【2020対応版】MacでWindowsインストールUSBを作成する方法

# はじめに
こんにちは。
MacでWindowsのインストールUSBを作成したい！
そんな時があるかと思います。

普通だったらどうするか。
公式ページからISOファイルをダウンロードして、[Etcher](https://www.balena.io/etcher/)を使用したり、ddコマンドで書き込んだり・・・いろんな方法があるかと思います。
**Windows10ではその方法が通用しません。**
書き込みには成功しても、起動ができない問題が発生します。

#なぜ？
Windows10のインストールメディアはFAT32でフォーマットされています。
FAT32の特性として、4GB以上のファイルは扱えません。
しかし、sourcesフォルダの中にあるinstall.wimファイルは**4GBを超えています**。
これが原因で、インストールメディアが起動できない状態に陥ります。

#対処法
Windows10のISOファイルは[公式ページ](https://www.microsoft.com/ja-jp/software-download/windows10ISO)からダウンロードしてあるものとします。

① ディスクをFAT32形式でフォーマットする (Disk Utilityでも実行可能です)

```sh

# USB等のディスクを探す
diskutil list

# ディスクをフォーマット (diskNを正しいディスクに置き換えてください)
diskutil eraseDisk MS-DOS "WINDOWS10" MBR diskN
```

② Finder等でISOファイルをマウント

③ WindowsのISOファイルの中身をUSBにコピー **(install.wimファイル以外)**

```sh

# ISOファイルのマウント先を確認
ls /Volumes

# ここではCCCOMA_X64FRE_JA-JP_DV9と仮定
# ファイルの中身をUSBにコピー
rsync -avh --progress --exclude=sources/install.wim /Volumes/CCCOMA_X64FRE_JA-JP_DV9/ /Volumes/WINDOWS10/
```

④ homebrewで`wimlib`をインストールし、install.wimファイルを分割

```sh
# homebrewのインストール
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"

# wimlibのインストール
brew install wimlib

# install.wimの分割
wimlib-imagex split /Volumes/CCCOMA_X64FRE_JA-JP_DV9/sources/install.wim /Volumes/WINDOWS10/sources/install.swm 3800
```

### Reference
Lubbock, A. (n.d.). Make a bootable Windows 10 USB drive from a Mac: Alex Lubbock. Retrieved September 11, 2020, from https://alexlubbock.com/bootable-windows-usb-on-mac
【第一回】Spring-MVCフレームワークのプロジェクトの作り方

#はじめに
DreamHanksの松下です。今回はSpring-MVCフレームワークのプロジェクト作成の手順を解説していきます。

今回のWebアプリ開発ではDBアクセスのフレームワークはMyBatisを使用します。


[連載記事まとめ](https://qiita.com/DreamHanks/items/7df703a509ef22f64d2c)

#インストールするもの解説
###ツール・環境関係
　下記のものを用意する。
　・eclipse2020
　・jdk：1.8
　・tomcat：8.5
　・mysql：8.
　・A5SQL


###eclipseでダウンロードするもの
　下記のものはeclipse→ヘルプ→マーケットプレイスからダウンロード
　・Spring4
　・Spring Tools 3 Add-On for Spring Tools 4

#新規プロジェクトの作り方
①新規プロジェクトを選択

②Springと検索→「Springレガシー・プロジェクト」を選択→次へ
　
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/13cb8ea3-7835-44ac-6705-dbc436ecdb40.png)

>なぜ「Springレガシー・プロジェクト」を選択したのか？

>>レガシープロジェクトはBootに比べて自分で設定しなくてはいけないことがあります。
　自分で設定することで、Springフレームワークをより深く学習できます。

>>特に下記の点がSpring Bootと大きく変わります。
　　・pom.xml, root-context.xml, servlet-context.xmlの設定をしなくてはいけない
　　・tomcatを自分で用意しなくてはいけない。






③プロジェクト名を設定
④テンプレートは「Spring MVC Project」を設定→次へ

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/fbc450e5-f91a-4a44-3d94-7fb293a91578.png)

>なぜテンプレートは「Spring MVC Project」を選択したのか？

>>まずテンプレートとは下記の画像のような、プロジェクトのファイル構成です。
　「pring MVC Project」を選択することで、ある程度SpringMVCモデルに特化したファイル構成を
　　eclipseが開発がしやすいように用意してくます。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/c327ccfd-4975-ce36-ce7d-79901b933cf7.png)





⑤packageのトップレベルのディレクトリを設定
　　例「com.dreamhanks.workmanager]
　　　　com.dreamhanks　→　トップレベルのディレクトリ名を設定すること
　　　　workmanager　→　作成したいアプリ名を設定すること

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/c420cfbf-dd54-bb44-f41d-8747d92bc368.png)




#おわりに
次回はSpringとMySqlとMyBatisの連動方法について解説していきます。
[【第二回】SpringとMySqlとMyBatisの連動方法](https://qiita.com/DreamHanks/items/f80d27d42c3b9f895e61)

最新内容については下記のリンク（DreamHanksのブログ）で確認することができます。
[DreamHanksブログ（Javaウェブアプリ開発）](http://blog.dreamhanks.com/java%e3%82%a6%e3%82%a7%e3%83%96%e3%82%a2%e3%83%97%e3%83%aa%e9%96%8b%e7%99%ba/)

お読みくださいまして、ありがとうございました。
errors.full_messagesの配列を文字に変えて出力する


## 起こった問題とやりたいこと
errors.full_messagesが配列なので、flashメッセージが、["hoge hoge"]が出力される
→ 文字に変えて、hogehogeと出力したい


## やったこと
errors.full_messagesにto_sentenceメソッドをつけるだけ


```user_contorller.rb
class Users::UserController < Users::ApplicationController
#中略

def update
 @user = user.Users
flash[:alert] = @user.errors.full_messages.to_sentence
 end

#中略
end

```

今日もお疲れ様でした。
JavascriptでEnumをシンプルに作成

# 仕様

- 以下のようなオブジェクトリテラルを定義してEnumを作成する。
- このオブジェクトリテラルにIDをラベルに変換するメソッドを設定するcreate関数を作成。

```js:def.js
const def = {
  OPTION_A: [1, "オプションA"],
  OPTION_B: [2, "オプションB"]
};
```

# 利用方法

- create関数（後段で定義）により仕様を満たすオブジェクトリテラルを作成。
- 利用は以下のようになる。

```js:use.js

//create関数により仕様を満たすオブジェクトリテラルを作成
const enum = create(def);

console.dir(enum.label(1));
//「オプションA」と表示。

console.dir(enum.OPTION_A)
//「1」と表示
```
# オブジェクトリテラルにIDをラベルに変換するメソッドを設定するcreate関数

- 定義は以下の通り。

```js:creator.js
const create =  (resource) => {
  //オプションキー、ID、ラベルを格納したオブジェクトリテラルを作成
  const optionSet = {};
  const labels = {};
  for (const [option, idLabel] of Object.entries(resource)) {
    const id = idLabel[0];
    const label = idLabel[1];
    optionSet[option] = id;
    labels[id] = label;
  }
  //IDからラベルを取得する関数を作成
  const getLabel = (labels, id) => {
    return labels[id];
  };
  //オブジェクトリテラルに、IDをラベルに変換する関数を設定
  //bindで冒頭で作ったラベルオブジェクトを設定
  optionSet.label = getLabel.bind(null, labels);
  return optionSet;
}
```

# bindを使って、オブジェクトリテラルに値を保持したメソッドを設定

- bindを使うことで、「this」を使うようなオブジェクトリテラルを作ることができる。
【VBA】時間を指定してPCのシャットダウンを実行する

:cracker:【タイマー時間を指定してマクロを実行する】
今回はA1セルに時間を入力して
シャットダウンタイマーボタンでマクロを発動します。
![imagｔe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700414/12553d3a-dd2e-4158-08cc-e681f0444a9b.png)

ボタンを押したら"タイマーをセットしました"とメッセージが出て
指定した時刻が来たら`"pc_shutdown" `が実行されます。

```VB
Sub btnTimer()
    MsgBox "タイマーをセットしました"
    Dim ShutDownTime As String 'タイマー時刻格納用変数
    'A1に入力された時間を変数に格納
    ShutDownTime = Format(TimerSheet.Range("A1").Value, "hh:mm:ss") 
    'シャットダウン処理を呼び出し
    Application.OnTime TimeValue(ShutDownTime), "pc_shutdown" 
End Sub

Sub pc_shutdown()
    ThisWorkbook.Save
    Dim objsystem As Object'オブジェクト格納用変数
    Set objsystem = CreateObject("WScript.Shell")
    'ログオフするの場合は以下にする
    'objsystem.Run "logoff", 0, False
    'シャットダウンの場合は以下にする
    objsystem.Run "shutdown -s", 0, False
    ThisWorkbook.Close
    Application.Quit
End Sub
```
:cracker:【実行結果】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700414/facb1d02-d987-9a03-8952-d2a2f9ef8716.png)
時間がきたらシャットダウンされます。


:cracker:【シャットダウンか、サインアウトか？】
シャットダウン
`objsystem.Run "shutdown -s", 0, False`
サインアウト
`objsystem.Run "logoff", 0, False`

電源を落としたい時はシャットダウンです。
最近ワタシはフルリモート勤務のためPCはシャットダウンではなくサインアウトにしないといけないので業務で使用するPCの場合はサインアウトの方を使用します。

:cracker:【ちょい足しアレンジが必要】
今回のマクロはあまり通常業務で必要のないマクロかもしれませんが
以下の場合はアレンジが必要だと思います。
・他のアプリケーションが開いていた場合
・実行5分前に通知を出したい
・場合によって実行をキャンセルしたい
など

今回は時間指定で実行するようなコードですが
ワタシは時間がかかるマクロが終了したらシャットダウンも実行されるようにするのもいいかな～と思います。
タイマー機能はシャットダウンでなくても色々使ってみたいです。
ハイパバイザ(Hypervisor)ーハードウェア上で直接稼働し仮想マシンの土台となるミドルウェア

応用情報技術者平成29年秋期 午前12


1台のコンピュータで複数の仮想マシン環境を実現するための制御機能はどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/7c9caef6-ff95-c753-d34a-78fc18a387d2.png)



１、仮想マシン環境を実現する方式には「ハイパバイザ型」と「ホストOS型」があります。

・ホストOS型はハードウェアの上層にホストOSが稼働し、その上に仮想化レイヤが位置しますが、
・ハイパバイザ型はホストOSを必要とせずハードウェアの上層に仮想化レイヤが位置するという違いがあります。
　ハイパバイザでは仮想化機能の実現に特化したカーネルが稼働しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/b747315d-3064-57de-0d16-4701ecd8de12.png)


２、シストリックアレイは、　Systoric Array
多数のプロセッサとバッファの組をマトリクス上に結合して構築される並列計算機のアーキテクチャです。
個々のプロセッサの演算結果をレジスタに書き戻さず、次の演算の入力として隣のプロセッサへそのまま渡すことで、シンプルな回路設計、高い電力効率、高い演算性能を実現します。


３、デスクトップグリッドは、
家庭内のPCやオフィスのコンピュータなどのようなインターネットに接続された計算機を一つの仮想的なコンピュータシステムとして結びつけ、それらの余剰計算能力や情報格納領域を活用して大規模な計算を行うことです。
グリッドコンピューティングと同義です。


４、モノリシックカーネルは、
カーネル自体に多機能を持たせるアーキテクチャです。(カーネルとはOSプログラムの中核を担う部分のことです)

「モノリシックカーネル」の「Monolithic」とは、「一枚岩である」という意味です。カーネルの設計において、OSのほとんどの機能をカーネルに盛り込み、一体化させたもの、ということができます。たとえば入出力の機能やネットワーク機能、デバイスのサポートなどの全てをカーネルが一手に引き受けます。この方法のメリットとしては、OS全体が一体化しているため、実行速度が速いという点が挙げられています。以前のUNIX系OSでは、このモノリシック方式のカーネルが採用されていました。



参照：
モノリシックカーネルとマイクロカーネル
https://linuc.org/study/knowledge/460/


https://www.ap-siken.com/kakomon/29_aki/q12.html
【Java開発】JAVA開発のための環境構築 - 2

#はじめに

皆さん。こんにちは！

DreamHanksの254cmです。


今回は前回の続きとして環境変数の設定について説明していきます。

Java記事のまとめは[こちら](https://qiita.com/DreamHanks/items/6b1996e1f8ed66bbd456)です。

前回の記事は[【Java開発】JAVA開発のための環境構築 - 1](https://qiita.com/DreamHanks/items/72cd731dcf0251f73dc1)です。

##環境構築の設定


Javaの開発を行うためにはJavaの環境変数の設定が必要になります。

※環境変数はOSが提供するデータ共有機能の一つです。(出典 : ウィキペディア)



今から環境変数の設定方法について説明します。

まずはPC画面の左下にある「**ここに入力して検索**」検索バーに「**環境変数**」と入力します。


![添付1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/bb3eed57-49d7-ccb7-58fd-5ca657efff02.png)


検索結果で「**システム環境変数の編集**」が出てきます。それを左クリックします。

![添付2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/08160280-f4a4-15f1-1012-7c601d75e3f8.png)


上のダイアログで「**環境変数**」を左クリックします。

![添付8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/4f1c1cda-7bd4-10a0-ac94-885e05001e94.png)


すると、環境変数設定画面が出てきます。「**新規**」をクリックして環境変数を追加します。

![添付4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/54d50326-2abc-8a58-9e97-d90a65cd9cdb.png)

表示された画面に環境変数追加に必要な情報を入力します。

変数名にはJAVA_HOME、変数値にはJDKがインストールされているパースを入力してください。

JDKをインストールする際に別途のパースを設定しなかった場合、デフォルトパースでインストールされます。

※デフォルトパース : **C:\Program Files\Java\jdk-(JDKバージョン)** 

![添付5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/5fc7c96e-d027-b748-ffac-46fc04e5533f.png)

次は先ほど追加した環境変数を使ってPath変数を設定しましょう。

上の画像に表示されている手順でクリックします。

![添付7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/ac6ef96b-6c83-ec7a-b4e7-1790a9228e97.png)

表示された画面で「**新規**」をクリックして「**%JAVA_HOME%\bin**」を入力します。

ここまでがJava開発に必要な環境変数の設定です。

最後に、確実に設定されたかを確認してみましょう。

「**Windowsキー＋R**」を押して、
![添付9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/0dba2d3d-f6cb-af71-2eca-49852909e570.png)

「**ファイル名を指定して実行**」画面を呼び出します。

この画面の入力バーにcmdを入力して「**OK**」ボタンを押します。

![添付10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/a7b2f8e2-b1c4-c691-d036-93fa034243f9.png)

すると、「**コマンドプロンプト**」というプログラムが表示されます。

ここで「**java -version**」を入力して

![添付11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/708649/9221461e-3139-7ebd-225e-34df10933f80.png)

上記のような結果が出力されると環境変数の設定は成功です！

#終わりに
今回の記事は以上になります。

次回は[eclipseのインストール](https://qiita.com/DreamHanks/items/09044abec21c16762f9e)について学びましょう。

私たちの最新の記事は[こちら](http://blog.dreamhanks.com/java%e5%85%a5%e9%96%80%e8%ac%9b%e5%ba%a7/)で確認することができます。

ご覧いただきありがとうございます。
LaravelでSwift_TransportExceptionが発生した時の対処法(Gmail編)

## 問題

- `Laravel`でメール送信しようとしたら**`Swift_TransportException`**というエラーが発生した。
- **`Authenticator LOGIN returned Expected response code 235 but got code "534"`**が発生した。

自分は上記の両方を認証機能のパスワード再発行の際に発生した。
それらを解決できたので、その方法を記載する。

## 解決策

今回は`Gmail`を利用した解決策を書いていく。

### .env

まずは`env`ファイルの設定を確かめる。

```.env
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465
MAIL_ENCRYPTION=ssl
MAIL_FROM_ADDRESS=laravel@admin.com(適当なメールアドレス)
MAIL_FROM_NAME=Admin(適当な名前)
MAIL_USERNAME=(自分が利用しているGmailアドレス)
MAIL_PASSWORD=
MAIL_PRETEND=false
```

`MAIL_PASSWORD`の所に何も記入されていないが後で記入する。

### config/mail.php

`config/mail.php`を次のように書き換える。
既に記入されていたコードはコメントアウトなどで保存。

```config/mail.php
// Mail Driver
'driver' => env('MAIL_DRIVER', 'smtp'),

// SMTP Host Address
'host' => env('MAIL_HOST', 'smtp.mailgun.org'),

// SMTP Host Port
'port' => env('MAIL_PORT', 587),

// Global "From" Address
'from' => [
    'address' => env('MAIL_FROM_ADDRESS', null),
    'name' => env('MAIL_FROM_NAME', null)
],

// E-Mail Encryption Protocol
'encryption' => env('MAIL_ENCRYPTION', null),

// SMTP Server Username
'username' => env('MAIL_USERNAME', null),

// SMTP Server Password
'password' => env('MAIL_PASSWORD', null),

// Sendmail System Path
'sendmail' => '/usr/sbin/sendmail -bs',

// Mail "Pretend"
'pretend' => env('MAIL_PRETEND', false),

```

### Googleのセキュリティ設定
下記のサイトを参考に`Google`アカウントの2段階認証、またはアプリパスワードの設定を行う。
[【laravel】メール(gmail)がエラーで送信出来ない問題 | 旅行好き・WEBエンジニアのブログ](https://i-purple-u.com/2019/12/25/laravel-gmail/)

自分は2段階認証ではエラーが解消しなかったが、アプリパスワードの設定によって解消できた。

アプリパスワードが発行されたら、`.env`の`MAIL_PASSWORD=`に入力する。

### キャッシュの削除
今のままだと`Laravel`の変更前の設定ファイルの記録などが残っているため、**`$  php artisan config:cache`**をターミナルで実行しそれらを削除する。

以上の作業が終わったら、自分が操作したいメール送信機能を試してみる。

## 参考資料

- [メール環境設定でつまずいた - プログラミングMEMO](http://nanaco-programming.hatenablog.com/entry/2016/04/07/231533)
- [【laravel】メール(gmail)がエラーで送信出来ない問題 | 旅行好き・WEBエンジニアのブログ](https://i-purple-u.com/2019/12/25/laravel-gmail/)
Dartのリスト（配列）型へのアクション

# はじめに
今、新アプリを制作している過程でリストをいじることが多いです。
これからもリストとは長いお付き合いになるので、価値がありそうなアクションを溜めておこうと思います。

#アクションたち
##要素挿入
```dart
List<int> nums = [0, 1, 2, 3, 4];
nums.add(0);
// nums = [0, 1, 2, 3, 4, 0];

int index=1;
nums.insert(index, 7);
// nums = [0, 7, 1, 2, 3, 4, 0];
// indexで指定する要素になるイメージ
// insert後 => nums[index] = 7;
```

##部分配列取り出し
```dart:dart
int start = 1;
List<int> nums = [0, 1, 2, 3, 4];
List<int> part1 = nums.sublist(start);
// part1 = [1, 2, 3, 4];

int end = 3;
List<int> part2 = nums.sublist(start,end);
// part2 = [1, 2];
```

```python:python
nums = [0, 1, 2, 3, 4]
part = nums[1:]
# part = [1, 2, 3, 4]
```

##インデックス指定要素取り出し
```dart:dart
int index = 1;
List<int> nums = [0, 1, 2, 3, 4];
int n = nums.removeAt(index);
// n = 1;
// nums = [0, 2, 3, 4];
```

##リスト全要素関数実行
```dart
List<int> nums = [0, 1, 2, 3, 4];
List<int> newNums = nums.map((n)=>n+1).toList();
//newNums = [1, 2, 3, 4, 5];
//nums = [0, 1, 2, 3, 4]; 変化なし
```

##判定
```dart
List<int> nums = [0, 1, 2, 3, 4];
nums.contains(0); // true
nums.contains(5); // false

nums.isEmpty(); // false
nums.isNotEmpty(); // true

nums.remove(0); // true
// nums = [1, 2, 3, 4];
nums.remove(5); // false
// nums = [1, 2, 3, 4];
```

##配列の長さ
```dart
List<int> nums = [0, 1, 2, 3, 4];
int length = nums.length();
// length = 5;
```

##配列のソート
```dart
List<int> nums = [0, 1, 2, 3, 4];
nums.sort((a,b)=>b-a);
// nums = [4, 3, 2, 1, 0];

nums.sort(); //sort((a,b)=>a-b);
// nums = [0, 1, 2, 3, 4];
```

##配列の逆転
```dart
List<int> nums = [0, 1, 2, 3, 4];
List<int> reverse = nums.reversed.toList();
//reverse = [4, 3, 2, 1, 0];
```

#おわりに
大抵のアクションはVSCodeなどエディタ予測機能で出てきます。
便利にエディタを使っていきましょう。
様々な日本語文章を、目線移動無く早く読めるオープンソースツール(Svelte Shield)を公開しました


## TL;DR

* [Web版](https://ampcpmgp.github.io/svelte-shield/)
* [Chrome 拡張機能版](https://chrome.google.com/webstore/detail/svelte-shield-%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD/ogdlcilfgiojgaoglhhilbhnghchnceo?hl=ja&authuser=0)


![11213.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85111/009598e5-035b-9318-c1f7-88e50231d221.gif)


## 概要

[tdual さんのツイート](https://twitter.com/tdualdir/status/1302802673222127622)を見て、目線移動無く文を読むと早く読めるということを知り、開発に至りました。
日々読んでいる記事や論文など、今より早く読めると QoL が上がるため、ワクワク感を持って取り組みました。


## 利用モジュール

### 形態素解析

形態素解析には [kuromoji.js](https://github.com/takuyaa/kuromoji.js/) を使いました。多くの文章でより良い結果が得られて使いやすかったです。（結構前に作られたツールなのに凄い・・）
区切りの良いところで表示するために [if 文を多用して力業で解決](https://github.com/ampcpmgp/svelte-shield/blob/cce2c7759eed3a6326f0544456680251636a9224/src/states/morpheme.js#L190-L275)しています。感じ良く表示されるという曖昧な答えの中で、コーディングするのはだいぶ苦労しました。

### ビューライブラリ

ビューライブラリには Svelte を採用しました。非常にサクサク開発出来て、書いていてとても楽しかったです。コーディングにおいて楽しさは正義。本当に素晴らしいライブラリだと思います。

### UIデザイン

UIデザインにはニューモーフィズムを採用しました。 [Nuemorphism UI](https://github.com/themesberg/neumorphism-ui-bootstrap) をベースに利用し、不足分は [Neumorphism.io](https://neumorphism.io/#e6e7ee) で補いました。最初に出会ったときにコレだ！っと思っていて、何かで形にしたいと考えていました。出来上がってからも見栄えには非常に満足です。
ただ、 Nuemorphism UI 自体の css が 500kb 近くあってそれなりに重いこと、モーダルを実装するためだけに bootstrap, jquery, popper.js の依存が必要になったことで、もう少し軽量なライブラリがあったら良かったなと思いました。余裕が出来たら実装してみたいです。

### その他ツール

他には自作のモック作成ツール [am-mocktimes](https://github.com/ampcpmgp/am-mocktimes/) を利用したり、ユニットテストには [ava](https://github.com/avajs/ava) を利用したりしています。利用モジュールの一覧は [package.json](https://github.com/ampcpmgp/svelte-shield/blob/master/package.json) よりご覧ください。自分はどれも便利だと感じています。

## 使ってみて
文章によっては一部表示が長くなったり、逆に短すぎたりすることもありますが、１０記事ほど試し読みした感じでは、恩恵を十分に受けれているように感じました。これからも色々記事を読んでみて、気になったところは微調整していこうと思います。

何か要望などありましたら [issue](https://github.com/ampcpmgp/svelte-shield/issues/new) から連絡貰えると出来る限り対応しようと思います。

ブラウザ上で同じことができるツールがあったらコメントで教えていただけると幸いです。（自分のググり力では見つけることが出来ませんでした）

## ソースコード
https://github.com/ampcpmgp/svelte-shield
rustでvectorの値をiteratorで変更するときは、iter_mut()を使う

# 背景
rustでvectorに入ってるstructをiter().find()で取得して、その値を変更しようとしたんだけど
取り出した値にmutとかつけてもコンパイルエラーで動かなかった。

ネットであまり見つからないのでメモ代わりに残す。

# 正解
以下のようにすればよかった。

```rust
// 正解
if let Some(data) = list.iter_mut().find(|data| data.id == id) {
  // この中で変更処理
}

// 間違い
if let Some(data) = list.iter().find(|data| data.id == id) {
  let data_mut = mut data;
  // こうしても後続の処理でコンパイルエラー
}
```
coc.nvimのプラグインをvimrc(init.vim)からインストールする設定

以下のように書けばいい

```vimscript
" vimであれば、.vimrc
" neovimであればinit.vim
" これは自分の使っているプラグイン

let g:coc_global_extensions = [
      \  'coc-yank'
      \, 'coc-tsserver'
      \, 'coc-snippets'
      \, 'coc-prettier'
      \, 'coc-pairs'
      \, 'coc-fzf-preview'
      \, 'coc-explorer'
      \, 'coc-rust-analyzer'
      \, ]
```

Wikiにも書かれているけど、見つけ辛い
https://github.com/neoclide/coc.nvim/wiki/Using-coc-extensions
LPWA(LowPower，WideArea)の特徴

応用情報技術者平成29年秋期 午前10

IoTでの活用が検討されているLPWA(LowPower，WideArea)の特徴として，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/e0dfad37-4fec-3ae9-a6a6-2633e1629c2c.png)


１、LPWAは、
LowPower=省電力、WideArea=広範囲の名称の通り、省電力・広範囲を特徴とする無線通信規格の総称です。伝送速度は遅いものの、Wi-fiやBluetoothが届かない数キロメートル間の通信をカバーします。PWA規格には、SIGFOX、LoRaWAN、Wi-SUN、NB-IoT、Cat-M1などがあります。

IoT(Internet of Things)では、
制御や情報取得のために各所に散りばめられたデバイス同士が通信を行うことになります。
この個々の通信はそれほど大きいデータ量ではないので、LPWAの低い伝送速度が問題になることは余りありません。
それよりも小型化が進むデバイスのバッテリー消費を抑えられることがIoTにおける強みとなります。
このような理由から、LPWAは小型デバイスを多数配置した広範囲のIoTネットワークの運用を実現する手段として期待されています。


２、基盤内のように近距離で直結したデバイス間で100～400kbpsのシリアル通信を行うI2C(Inter-Integrated Circuit)の説明
2線だけで接続されるシリアル有線通信であり，同じ基板上の回路及びLSIの間の通信に適している。

※Circuit：回路
※I2C（アイ・スクエアド・シー、アイ・アイ・シー）はフィリップス社で開発されたシリアルバスである。低速な周辺機器をマザーボードへ接続したり、組み込みシステム、携帯電話などで使われている。

３、10mの通信範囲で最大7Gbpsの通信を行う「WiGig」の説明
60GHz帯を使う近距離無線通信であり，4K，8Kの映像などの大容量のデータを高速伝送することに適している。


４、PLC(Power Line Communication，電力線搬送通信)の説明
電力線を通信に使う通信技術であり，スマートメータの自動検針などに適している。


参照：

https://www.ap-siken.com/kakomon/29_aki/q10.html
ネットで情報を調べる際、どういうところに気をつけ、何をすると良いかまとめてみた

# 背景

何かわからないことを調べることはエンジニアにとって日常茶飯事ですが、ネットにはそれこそ情報が山とあります。
あまりに情報量が多すぎて、「どの情報が正しいんだ？」と混乱することもしばしばです。
特に新人やプログラミングを勉強されて間もない方はそうなんじゃないかと思います。
ネットで情報検索する時にどういうところに気をつけているか、何をしているか、自分なりの手法をまとめてみました。

# 誰が書いたかを見る

その情報を誰が発信しているのかは、情報の信頼性を見る上での指標になります。
一番信頼性が高いのは公式のリファレンスですね。
その作者が公開している記事ですから、間違った情報が書かれていることは基本ないはずです。
私は基本的にはまずリファレンスの情報から目を通すようにしていて、もしなければ別途別の記事を探すようにしています。
（ただ文章がわかりにくかったり全部英語だったりで読みづらいと感じることはありますが。。）

# いつ書かれたかを見る

当然ですがIT業界は日々新しい技術や言語などが誕生したり、既存のものがどんどんアップデートされていっています。
それゆえに情報が古くなって使えなくなるのもわりと早いです。
例えばQiitaや個人ブログなんかでは更新日付が表示されているので、記事を読む前に見ておくと良いでしょう。
あくまで個人的な感覚ではありますが、更新日付が2、3年以上前の情報はだいぶ古いので、あまり参考にならない可能性が高いです。

# （超重要）自分の手元で検証してみる

「情報が見つかったからこれで大丈夫！あとはそのままソースコードをコピペして終わり！」
ではあまりよろしくありません。
なぜかというと、基本的に各々で開発環境や何を作るのかといった「状況」が違うので、そのソースコードがそっくりそのまま使えると思わない方がいいです。（もしかしたらエラーが埋め込まれているなんていうことも。。）
「じゃあなんでそのソースコードが動くのか？本当にこのソースコードで問題ないか？」など、必ず自分の手元で検証しましょう。

# 可能であれば、調べた情報や検証結果をまとめてアウトプットする

調べた情報や手元で検証した結果は、可能であればQiitaで記事化するなどしてアウトプットするのがおすすめです。
同じようなことでまた引っかかる可能性もあり、都度調べ直すのは効率悪いですし、あわよくば似たようなことで悩んでいる人の助けになるからです。
さらにはアウトプットすることでより理解が深まります。

# まとめ

ネットで情報を調べる際、どういうところに気をつけ、何をすると良いかについて自分なりの手法をまとめました。

- 誰が書いたかを見る
- いつ書かれたかを見る
- 自分の手元で検証してみる
- 可能であれば、調べた情報や検証結果をまとめてアウトプットする

を紹介しました。
これをめげずに日々積み上げていくことで、どんどん技術力が磨かれていくはずです。
【JavaScript関数ドリル】 初級編join関数の実装

##join関数の課題内容
「課題内容」「解説動画」「解答例」を確認したい場合は、以下リンク先のページを参照。　　　　　↓
https://js-drills.com/blog/initial/

##join関数 に取り組む前の状態
joinメソット自体はどのようなもの知っていた

##join関数に取り組んだ後の状態
swiftメソットが配列のはじめを消すことが分かった
##join関数の実装コード(答えを見る前)
自力で実装できませんでした。
##join関数の実装コード(答えを見た後)

```js
function join(array, separator = ',') {
  const copiedArray = [...array];

  let joinedString = copiedArray.shift();
  for(let i = 0; i < copiedArray.length; i++) {
    joinedString += separator + copiedArray[i];
  }

  return joinedString;
}

console.log( join(['a', 'b', 'c'], '---') );
// => 'a~b~c'
```
ElastickBeanstalkにSSHしてLaravelのコマンドを動かそうと思ったらなぜかsegment faultになるので

# これはなに
ElastickbeanstalkにSSHしてPHPのコードを動かそうと思ったら
なぜかsegment faultになったけど
ルーティングファイルに直接処理を書いたら落ちずに実行できたよという話です。

# 背景

ElastickBeanstalkのインスンタンスにSSHでログインして
Laravelのコマンドを実行したいのですが、実行後1,2秒するとsegment faultが発生してしまう状況にハマってました。
local環境だと動くし、メモリも不足してなさそうな感じで、原因はまったく不明です。
`tinker`から処理を呼び出してもダメでした。
不思議な力によってプロセスがキルされてるのかもしれません。AWSのセキュリティ機構みたいななにかが。


# 対処方法

SSHしてコマンド実行するのは諦めました。

そこでひらめいたのが、Webからアクセスしたら処理が呼び出されるようにする方法です。

Laravelのルーティングが記載されたファイルを編集します。
私は、SSHしたまま`vim`で直接コードを変えました。 一時的なコマンド実行なので大目に見て欲しい。

```php:routes/web.php
Route::get('foo', function () {
    return 'Hello World';
});
```

こんな感じで書けばブラウザから `/foo` にアクセスすると処理が実行されて`Hello World`と表示されるはずです。
ここで
`resolve()`などのヘルパーを使って使いたいクラスをインスタンス化して、必要な処理を呼び出すことができます。

また、このケースでは文字列をreturnしてますが、標準出力した文字もブラウザ上に表示されるます。

以上、参考になりましたら幸いです。
パイプライン制御

応用情報技術者平成29年秋期 午前8

パイプライン制御を適切に表しているものはどれか。ここで，図中の記号Dは解読，Eは実行，Fは命令フェッチとする。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/37814ea8-5b73-db5e-54e1-d06efc6b8352.png)


１、パイプライン制御は、CPUで処理される1命令を、
　・命令読出し(フェッチ)、
　・解読(デコード)、
　・アドレス計算、
　・オペランド呼出し、
　・実行
というような複数のステージに分け、各ステージを少しずつずらしながら独立した処理機構で並列に実行することで、処理時間全体を短縮させる技法です。

通常(非パイプライン)の流れでは、読出し→解読→実行という一連の処理が終了してから次の命令処理に移るというサイクルを繰り返しますが、パイプライン制御では命令処理の完了を待つことなく次の命令の処理に移れるためスループットが向上します。

※オペランドとは、
コンピュータの演算における値や変数のことである。 オぺランドは演算の種類や内容を表す演算子（オペレータ）によって演算対象となるもので、例えば「7×3」という計算式があれば、「7」と「3」がオペランドとなる。

※スループットとは、
機器や通信路などの性能を表す特性の一つで、単位時間あたりに処理できる量のこと。 ITの分野では、コンピュータシステムが単位時間に実行できる処理の件数や、通信回線の単位時間あたりの実効伝送量などを意味することが多い。


ーーーーーーーーーーーーーーーーーーーーーーーーーー
補足

すべての命令が5サイクルで完了するように設計された，パイプライン制御のコンピュータがある。20命令を実行するのには何サイクル必要となるか。ここで，すべての命令は途中で停止することなく実行でき，パイプラインの各ステージは1サイクルで動作を完了するものとする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/3fa60b0c-f7d9-9af9-dbfb-5587f8bdfa34.png)

１、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/3054a1b7-30db-cc4a-35e0-9dedebc12457.png)

簡単にいうと、
１命令　　５サイクル
２命令　　６サイクル
３命令　　７サイクル
。。。　　。。。
２０命令　２０＋４サイクル

ですね。


ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
補足

CPUのパイプライン処理を有効に機能させるプログラミング方法はどれか。ここで，CPUは命令の読込みとデータのアクセスを分離したアーキテクチヤとする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/792d9806-59b7-0bb4-b646-81888e8d3aaa.png)

１、パイプライン制御は、
CPUで処理される1命令を、命令読出し(フェッチ)、解読(デコード)、アドレス計算、オペランド呼出し、実行 というような複数のステージに分け、各ステージを少しずつずらしながら独立した処理機構で並列に実行することで、処理時間全体を短縮させる技法です。

２、分岐ハザード
パイプライン処理では、処理命令を先読みするためプログラム中に分岐命令などがあると、
結果によって次に実行するべき命令がわからないため、パイプラインを止めて次に実行すべき命令が判明するのを待たなければなりません。これを分岐ハザードと呼びます。分岐ハザードを発生させないためには、分岐命令を少なくすることが有効な方法です。



参照：

https://www.ap-siken.com/kakomon/27_aki/q8.html


https://www.ap-siken.com/kakomon/29_aki/q8.html
basic認証をif文で分岐する

# htaccess の記述
結構使えそうなのでここでメモしておきます。

今回、AuthUserFileのパスを分岐する方法を載せます。
相対パスが使えないので分岐出来ないと思ったら.htaccessで分岐できることが発覚！
<font color="Salmon">**Apache2.4からはIfディレクティブが使えるようになりました。**</font>

**普通の場合**

```Apache:.htaccess
# basic認証
AuthUserFile /path/to/your/.htpasswd
AuthType Basic
AuthName "Web access"
Require valid-user
```

**分岐する場合**

```Apache:.htaccess
<If "req('Host') = 'www.example.com'">
    AuthUserFile /path/to/your/.htpasswd
    Authtype Basic
    AuthName "Web access"
    Require valid-user
</If>
```

# おまけ
こういうことも出来るようです！

**IPアドレスで分岐**

```Apache:.htaccess
<If "%{REMOTE_ADDR} != '127.0.0.1'">
    AuthUserFile /path/to/your/.htpasswd
    Authtype Basic
    AuthName "Web access"
    Require valid-user
</If>
```

**REQUEST_URIで分岐**

ここで注意！
/（スラッシュ）が `\x2F` になります。 
`/admin/.* → \x2Fadmin\x2F.*`

```Apache
<If "%{REQUEST_URI} =~ /\x2Fadmin\x2F.*/">
    AuthUserFile /path/to/your/.htpasswd
    Authtype Basic
    AuthName "Web access"
    Require valid-user
</If>
```

**合わせ技**

```Apache
<If "req('Host') = 'www.example.com' && %{REQUEST_URI} =~ /\x2Fadmin\x2F.*/" >
    AuthUserFile /path/to/your/.htpasswd
    Authtype Basic
    AuthName "Web access"
    Require valid-user
</If>
```
グラフを隣接行列で表す

応用情報技術者平成29年秋期 午前6

ノード1～5をもつグラフを隣接行列で表したもののうち，木となるものはどれか。ここで，隣接行列のi行j列目の成分は，ノードiとノードjを結ぶエッジがある場合は1，ない場合は0とする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/c671a024-28e0-1b63-c542-fb69ede83c41.png)

ア、ノード間のエッジは"1－2","1－5","2－3","3－4","4－5"の5つです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/e8295378-2ed1-f1c0-7cf1-e8ace08896d9.png)

イ、ノード間のエッジは"1－2","1－5","2－3","2－4"の4つです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/f25b4147-4714-8890-ab4b-8769fc88d05e.png)


・木構造とは
1つの根と複数の節点および節点(根を含む)同士を結ぶ辺で構成され、ループをもたないデータ構造です。


参照：
https://www.ap-siken.com/kakomon/29_aki/q6.html
No route matches [GET] "/logout"の解決

##はじめに
プログラミング初学者です。
No route matches [GET] "/logout"となりログアウトリンクがうまく動かなかった時の対処法を記載します。

##環境
Rails 6.0.3.2
ruby 2.7.1
ubuntu 18.04 LTS

##問題点
ログアウトのリンクを押すとNo route matches [GET] "/logout"とでてログアウトできない。

##確認事項
・ルーティングのリクエストがdeleteとなっているか
・リンクをmethod: :deleteとしているか
・htmlソースコードがrel="nofollow" data-method="delete"となっているか

##解決方法
調べてみるとJQueryがないと動かないらしい

app/javascript/pasks/application.jsに 

```
//= require jquery　
//= require jquery_ujs
```
と記入



```　
gem 'jquery-rails'　
```

gemfileからjquery-railsをインストール

解決できました。
set型で利用できるメソッド

#set型で利用できるメソッド

以下の例では数上記のを使用しましたが、文字列でも同様に動作します。

* union()メソッド

重複のない和集合を返すメソッドです、演算子「　|　」と同じように使えます。

>a1 = {1, 2, 3}
>a2 = {2, 3, 4}
>a3 = {aa, bb, cc}
>a3 = {bb, cc, dd}

>union_a = a1.union(a2)
>print(union_a)
>＃ {0, 1, 2, 3}

上記のような結果となります。union()メソッドは重複しない和集合を返すので「２,３」が重複して返って来ることはないです。

* intersection()メソッド

重複している集合体を返します。演算子「　＆　」と同じように使えます。

>a1 = {1, 2, 3}
>a2 = {2, 3, 4}

>intersection_a = a1.intersection(a2)
>print(intersection_a)
>＃ {2, 3}

上記のような結果となります。intersection()メソッドは重複している集合を返すので「２,３」が返って来ます。


* difference()メソッド

差集合を返します。演算子「　-　」と同じように使えます。
以下の例では「a1」に存在して「a2」存在しないものを返します。

>a1 = {1, 2, 3}
>a2 = {2, 3, 4}

>difference_a = a1.difference(a2)
>print(difference_a)
>＃ {1}

「４」は「a2」のみに存在しているもののため返ってきません。


* symmetric difference()

対比差を返します。演算子「　^　」と同じように使えます。

>a1 = {1, 2, 3}
>a2 = {2, 3, 4}

>symmetric_difference_a = s1.symmetric_difference(s2)
>print(symmetric_difference_a )
＃ {1, 4}

「a1」と「a2」で重複しない箇所が返ってきます。


* add()

setの値に引数が追加されます。

>a= {1, 2, 3}
>a.add(4)
>print(a)
>＃ {1, 2, 3, 4}

>s = set()   
>s.add(aa)   
>s.add(bb)   
>s.add(cc)
>print(s)
>＃ {aa, bb, cc}


* remove()

引数を削除します。削除する要素として渡された引数が登録されていない場合「KeyError」が発生します。

>a= {1, 2, 3}

>a.remove(3)
>print(a)
>＃ {1, 2}
ネットワークのセキュリティ対策、暗号化技術とディジタル署名

#ネットワークセキュリティ対策
　ネットワークのセキュリティ対策は壁を設けて通信を遮断するところから始まる

#ファイアウォール
　ファイアウォールは機能的な役割のことなので、特に定まった形はない
　主な実現方法としては**パケットフィルタリング**や**アプリケーションゲートウェイ**などが挙がる

#パケットフィルタリング
　パケットを無条件に追加させるのではなく、あらかじめ指定されたルールにのっとって通過させるか否か
　制御する機能
　この機能ではパケットのヘッダ情報を見て通貨の可否を判定している
#アプリケーションゲートウェイ
　主にLANの中と外の間に位置して外部とのやり取りを代行して行う機能
　**プロシキサーバ**とも呼ばれる

#暗号化技術とディジタル署名

#盗聴・改ざん・なりすましの危険
　ネットワークの通信経路上に潜む危険といえば代表的なのが以次の３つ
　
　**・盗聴**
　　データのやり取り自体は正常に行えるが、途中で内容を第３社に盗み読み取られるという危険性

　**・改ざん**
　データのやり取りは正常に行えているように見えながら、実際は途中で第３社に内容を書き換えられて
　しまっている危険性

　**・なりすまし**
　　第３者が別人なりすましデータを総地震できてします危険性

#暗号化と複合

　データの中身を第三者にはわからない形へと変換してしまうことを**暗号化**
　暗号化したデータは元の形に戻さないと解読できないので元の形に戻すことを**復号**という

#盗聴を防ぐ暗号化(共通鍵暗号方式)

　暗号化や複合を行うために使うデータを**鍵**と呼ぶ
　送りて(暗号化する側)と受け手(複合する側)が同じ鍵を用いる暗号化方式を**共通鍵暗号方式**と呼ぶ

#盗聴を防ぐ暗号化(公開鍵暗号方式)
 一般に広くばらまいてしまうための公開鍵という航海用の鍵があるこの方式は暗号化に使う鍵と符合に使う鍵が別物


#改ざんを防ぐディジタル署名
　公開鍵暗号方式の技術を応用することで途中で買い残されていないか、誰が送信したものか等を確認できるようにしたのが**ディジタル署名**

#なりすましを防ぐ認証局(CA)

　他人になりすまして通信を行うなりすまし行為が回避できるとは言い切れないので、信用できる第３者が「この公開鍵は確かに本人のものですよ」と証明する機構が考えられた。それが**認証局(CA)**

#以上