OmniAICreator/Qiita-1.07M huggingface dataset:
【Java】ArrayListの基礎

#ArrayListとは
Javaの通常の配列では、最初から配列の数を決める必要がありました。

```java
a=new int[10]
```

これでは、後から配列の数を変更できなかったり、最初から配列の数が決まっていないときなどに不便ですね。
ArrayListは、このような不便を解決してくれる**予め用意されたJavaのクラス**です。

#ArrayListの特徴
下記のような特徴があります。
１. **オブジェクトであればどんな型でも扱える**
２. **配列に値を後から追加することができる**
３. **追加した順に並ぶ**
４. **nullも値として追加できる**
５. **重複した値も追加できる**
６. **スレッドセーフではない**

通常の配列に比べて、各段に使いやすいですよね。
実際の開発では、配列よりもArrayListを使うことが多いようです。

#ArrayListの書き方
ArrayListは、次のように書きます。

```java
ArrayList<型> リスト名 = new ArrayList<型>();
```
「型」には、クラス名を指定します。
指定したクラスのオブジェクトを、リストに要素として格納することができます。

実際に書いてみます。

```java:Stringの場合
ArrayList<String> strList = new ArrayList<String>();
```
```java:Integerの場合
ArrayList<Integer> intList = new ArrayList<Integer>();
```

ここで１つ注意。リストの要素は参照型である必要があります。
例えばintのように基本データ型を要素に持つリストは作成できません。
intのような基本データ型をリストに入れたい場合は、上記の「Integerの場合」のようにラッパークラスを用いて定義します。
（基本データ型とは：参照型とは異なり、直接値を格納する型のことです。）

#ArrayListの主なメソッド
AllayListにはあらかじめ便利なメソッドが用意されています。
よく使われるメソッドを下記にまとめました。

|  メソッド名  |  機能  |
| ---- | ---- |
|  void **add**(int index, Object element)  |  リストの指定した位置に、指定した要素を追加する。  |
|  boolean **add**(Object element)  |  リストの末尾に要素を追加する。  |
|  void **clear**()  |  リストからすべての要素を削除する。  |
|  Object **get**(int idex)  |  リストの指定した位置の要素を取得する。|
|  int **indexOf**(Object element)  |  引数と同じ要素を先頭から検索する。  |
|  boolean **isEmpty**()  |  リストが空かどうか調べる。空の場合、trueを返す。  |
|  Object **remove**(int index)  |  リストの指定した位置から要素を削除する。  |
|  Object **set**(int index, Object element)  |  リストの指定した位置の要素を、指定した新しい要素に置き換える。  |
|  int **size**()  |  リストに入っている要素の数を取得する。  |

#実際に書いてみる

ではArrayListを使って実際にコードを書いてみます。
###例１

```java:ソースコード
//ArrayListクラスのインポート
import java.util.ArrayList;

public class Main{
    public static void main(String[] args){
        //型を指定しなくてもよい
        ArrayList list = new ArrayList<>;
        //要素を追加していく
        list.add("みかん");
        list.add(5);
        list.add('A');
        //リストの中身を出力する
        for (Object obj : list){
            System.out.print(obj);
     }
  }
}
```

```java:実行結果
みかん5A
```

このように型が異なる要素を、一つのリストに追加することができます。

###例２

```java:ソースコード
//ArrayListクラスのインポート
import java.util.ArrayList;

public class Main{
    public static void main(String[] args){
        //変数strに、文字列abcdefgを代入
        String str = "abcdefg";
        //indexOfメソッドを使用して引数aを変数strから検索
        System.out.print(str.indexOf("a"));
    }
}
```

```java:実行結果
0
```

今回はindexOfメソッドを使った例です。
変数strに代入した文字列「abcdefg」から、indexOfメソッドの引数に設定した「a」を検索してみました。
実行結果の「0」は、文字列「abcdefg」における「a」の位置を表しています。
「a（0） b（1） c（2） d（3） e（4） f（5） g（6）」　　※（）内の数字は位置を表しています。
なので、例えばindexOfメソッドの引数がdなら３、gなら６になります。
WPF-MVVM開発手法

誰かにMVVMを説明するとき用のメモです。MVVMを採用するメリットに関してはかなり局所的な内容になっているかもしれません。詳しくは下記の説明等を参照ください。
参考：https://qiita.com/yuutetu/items/ea175b73e1dbbfd355db

# MVVM概要
Model(データ入出力管理)、View(UI処理)、ViewModel(ModelデータをUIデータに変換、及び、操作コマンドより対応したModel処理を呼び出す)で構成する開発手法です。<br>
MVVM開発手法を採用するメリットとしては、下記が挙げられます。

1. UIとビジネスロジック(データ・処理)が分離される<br>
具体的には、Formアプリケーションの一般的な構成では、UIロジックがModelのプロパティを直接参照しますが、この手法の場合、UI処理開発時にModelが必要となるか、UI処理の中に直接ビジネスロジックが存在することとなります。<br>
一方、MVVM開発手法では、例えばデータバインドを用いると、UIからは直接Modelのインスタンスを参照せず、対応するプロパティの名前でバインド定義する為、View開発時にModelのインスタンスは不要です。<br><br>
1. UIロジックとビジネスロジックを分離することで、コードの可読性が向上する。

# データバインドの例

1. <実行イメージ>
ボタンを押下するとテキスト内の数値がカウントアップ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624778/a058eb58-147e-22ce-07e7-7164e6286448.png)

2. View処理：MainWindow.xaml

```xml
<Window ～省略～ />
    <Grid>
        <TextBox Text="{Binding Path=propString.Value}" />
        <Button Content="Button" Command="{Binding ShowMessageButtonCommand}"/>
    </Grid>
</Window>
```
<br>
3. ViewModel処理：MainWindowViewModel.cs

```csharp
using Prism.Mvvm;
using Reactive.Bindings;

namespace prism_test.ViewModels
{
    public class MainWindowViewModel : BindableBase
    {
        /* テキストボックスに表示する文字列 */
        public ReactiveProperty<string> propString { get; set; } = new ReactiveProperty<string>();
        /* ボタン押下時のコマンドプロパティ */
        public ReactiveCommand ShowMessageButtonCommand { get; }

        /* コンストラクタ */
        public MainWindowViewModel()
        {
            propString.Value = "0";
            this.ShowMessageButtonCommand = new ReactiveCommand().WithSubscribe(this.buttonpush);
        }

        /* ボタン押下時のコマンド実体 */
        public void buttonpush()
        {
            propString.Value = (int.Parse(propString.Value) + 1).ToString(); ;
        }
    }
}
```
【Flutter】サイズに応じてテキストを縮小する

# 通常対応
FittedBoxを使用して対応する。

```dart
FittedBox(
  fit: BoxFit.scaleDown,
  child: Text('長い文章')
)

```

# 拡張して対応

全てのTextにFittedBoxを書くのは流石にめんどくさいので
FittedBox+Textのclassを作成してそれを呼び出すようにする

###実装
```dart:auto_fit_text.dart
import 'package:flutter/material.dart';

class AutoFitText extends StatelessWidget {
  final String? data;
  final double? width;
  final AlignmentGeometry? alignment;
  final TextAlign? textAlign;
  final TextStyle? style;

  const AutoFitText(
    this.data, {
    Key? key,
    this.width,
    this.alignment,
    this.textAlign,
    this.style,
  })  : assert(
          data != null,
          'A non-null String',
        ),
        super(key: key);

  @override
  Widget build(Object context) {
    return Container(
      width: width,
      alignment: alignment,
      child: FittedBox(
        fit: BoxFit.scaleDown,
        child: Text('$data', textAlign: textAlign, style: style),
      ),
    );
  }
}

```
pybind11 アプリを Windows 向けに cross-compile するメモ

python.org では .h/.lib だけのパッケージは配布されていないので, Wine で (Windows の) Python をインストールしているものとします.

Wine での Python のありかのメモ(Python 使う app の cross-compile 用)
https://qiita.com/syoyo/items/2c537d8b0f81be1ce4e1

ホストは Linux(WSL 含む)とします.

## llvm-mingw

https://github.com/mstorsjo/llvm-mingw

msvcrt と ucrt 版があります. ucrt 版のほうがいいのかしら?
(cross-compile とかで VC 依存性減らしたい場合だと ucrt が推奨という理解でいいのかしら...?)

### Cmake 設定

```
SET(CMAKE_SYSTEM_NAME Windows)

IF (DEFINED ENV{LLVM_MINGW_DIR})
  SET(LLVM_MINGW_ROOT "$ENV{LLVM_MINGW_DIR}")
ELSE ()
  SET(LLVM_MINGW_ROOT "C:/ProgramData/llvm-mingw")
ENDIF()

SET(CMAKE_C_COMPILER ${LLVM_MINGW_ROOT}/bin/x86_64-w64-mingw32-clang)
SET(CMAKE_CXX_COMPILER ${LLVM_MINGW_ROOT}/bin/x86_64-w64-mingw32-clang++)
SET(CMAKE_RC_COMPILER ${LLVM_MINGW_ROOT}/bin/x86_64-w64-mingw32-windres)

#SET(CMAKE_C_LINK_EXECUTABLE x86_64-w64-mingw32-gcc)
#SET(CMAKE_CXX_LINK_EXECUTABLE x86_64-w64-mingw32-g++)

SET(CMAKE_FIND_ROOT_PATH ${LLVM_MINGW_ROOT}/x86_64-w64-mingw32)

# We need some advanced thread APIs, so use 0x601(Win7)
# Python 3.9 だと Windows 7 対応は打ち切られたようなので, WINNT のバージョン上げたほうがいいかもです!
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_WIN32_WINNT=0x601")

SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
```



こんな感じの toolchain ファイルを用意して,

Python 関連の設定を cmake bootstrap で明示的に指定します.

`PYTHONLIBS_FOUND=On` `PYTHON_MODULE_EXTENSION` を設定にすると, `find_package(Python)` 相当の処理では Python が見つかったとして find 処理をスキップしてくれます.
(pybind11 の `tools/FindPythonLibsNew.cmake` 参照)

```
curdir=`pwd`

# Set path to llvm-mingw in env var.
export LLVM_MINGW_DIR=$HOME/local/llvm-mingw-20210423-ucrt-ubuntu-18.04-x86_64/

builddir=${curdir}/build-llvm-mingw

rm -rf ${builddir}
mkdir ${builddir}

# Manually set python include dir path and lib path.
cd ${builddir} && cmake \
  -DCMAKE_TOOLCHAIN_FILE=${curdir}/cmake/llvm-mingw-cross.cmake \
  -DPYTHONLIBS_FOUND=On \
  -DPYTHON_MODULE_EXTENSION=pyd \
  -DPYBIND11_PYTHON_VERSION=3.9 \
  -DPYTHON_INCLUDE_DIRS="$HOME/.wine/drive_c/users/$USER/Local Settings/Application Data/Programs/Python/Python39/include" \
  -DPYTHON_LIBRARIES="$HOME/.wine/drive_c/users/$USER/Local Settings/Application Data/Programs/Python/Python39/libs/python39.lib" \
  -G "Ninja" \
  -DCMAKE_VERBOSE_MAKEFILE=1 \
  ..
```

これでいけるはずです!

## clang-cl or MSVC(cl.exe)

T.B.W.
Git 超基本の4つのコマンド操作

#【Git 超基本の4つのコマンド操作】

ポートフォリオ作成中に毎日のように使っていたらいつのまにか覚えていました。
今後のことも考えて、自分の備忘録として残しておきます。

##4つの流れと意味を抑える。

###1、現在のブランチを確認する。

```:Git
git branch
```

複数ブランチを用いて、開発しているとブランチの切り替えが誤っているかもしれない。
何事も念の為に確認は大事。

###2、新規ファイルの追加、既存ファイルの変更をステージングする。

```:Git
git add .
```

git add の後に . を付けて、
カレントディレクトリ以下を再帰的にaddする。
addするときは、pwdでカレンとディレクトリの確認をすると尚良しかも。

###3、変更内容をローカルリポジトリにコミットする。

```:Git
git commit -m 'メッセージ'
```

コミットメッセージはコミット内容を簡潔にわかりやすく書くようにする。
特にチーム開発をしている時は、より意識する必要がある。
同じチームメンバーの方への気遣いは大事。

###4、GitHubのリモートリポジトリにプッシュ（反映）する。

```:Git
git push origin < ブランチ名 >
```

##おわりに。

自分が過去にGit, GitHubの学習をまとめたQiitaの記事。

[Gitの基本](https://qiita.com/uejima_haruki/items/04808b421388d0053084)
[GitHub チーム開発の流れ](https://qiita.com/uejima_haruki/items/5d8e1bf2a80c4720d85c)
[GitHub リモートリポジトリ【基礎】](https://qiita.com/uejima_haruki/items/8cdc84d6437d3775807c)
[GitHub ブランチとマージについて](https://qiita.com/uejima_haruki/items/a0de7da67de2c1ca473f)
[GitHub リベース スタッシュ タグ](https://qiita.com/uejima_haruki/items/f509d303060b3aefbc60)
GitLab-CIでCIをスキップする

READMEの更新に長いCI回したくない！というとき
pushオプションでスキップを指定できる

```bash
$ git push -o ci.skip
```
ver. 11.7以降

リファレンスはこちら
[Push options for GitLab CI/CD](https://gitlab-docs.creationline.com/ee/user/project/push_options.html#push-options-for-gitlab-cicd)
PHPオリジナル問題作成１

前回、Javaでオリジナル問題を作成してきました。

[Javaオリジナル問題作成1（Java入門編：スッキリわかるJava](https://qiita.com/freelanceradiation/items/2e24cd4f00de7796d807)

[Javaオリジナル問題作成2（Java入門編：スッキリわかるJava](https://qiita.com/freelanceradiation/items/60fe227910532bb9db79)

[Javaオリジナル問題作成3（Java入門編：スッキリわかるJava](https://qiita.com/freelanceradiation/items/1df4fdca6fc12fa8eeb6)

[Javaオリジナル問題作成4（Java入門編：スッキリわかるJava](https://qiita.com/freelanceradiation/items/a48febf59c95ec186ca3)


今回はPHP版のオリジナル問題を作成していこうと思います。

内容は上記のJavaオリジナル問題とほぼ同じです。

■開発環境
・VScode
・XAMPP

###対象
・PHPの基礎がわかる人
・PHPを復習したい人
・PHPの問題を解きたい人

<br>
■階層
![ev092.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700700/3855ab99-81b1-d3df-6b8b-348b8d6367d5.jpeg)

![ev093.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700700/79af699a-cd0c-5305-07ed-3f479e7b3026.jpeg)

■実行
![ev094.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/700700/7b56ec04-c47c-c181-ecec-61e03802b049.jpeg)

URLはmain部分を変更して実行していってください。

#変数
■問題１
int型の変数宣言し、11の値を挿入して下さい。
作成した変数の中身を表示して下さい。	


解答

```php:main.php
//問題１
<?php
$i = 11;

echo $i;

//実行結果
11

```

#条件分岐と繰り返し、配列
■問題１
for文を使って１から１０を表示して下さい。
ただし、3は表示させないで下さい。

■問題２
配列の要素5つ(1,2,3,4,5)作成して下さい。
拡張for文を使って配列の各要素の値を順番に取り出して下さい。

■問題３
変数に「晴れ」を代入してください。
晴れだった場合は〇を表示、それ以外は✖を表示になるようにしてください。
実行し、今回は「〇」が表示されればOKです。

解答

```php:main2.php
//問題１
<?php
for ($i = 0; $i < 10; $i++) {
    if ($i === (3 - 1)) {
        continue;
    }
    echo $i + 1;
    echo '<br>';
}


//実行結果
1
2
4
5
6
7
8
9
10

```

```php:main3.php
//問題2
<?php
$array = [1, 2, 3, 4, 5];

foreach ($array as $a) {
    echo $a;
    echo "<br>";
}



//実行結果
1
2
3
4
5

```

```php:main4.php
//問題3
<?php
$h = "晴れ";

if ($h == "晴れ") {
    echo "〇";
} else {
    echo "✖";
}




//実行結果
〇

```

#メソッド、複数クラスを用いた開発
■問題１
メソッド名：total
戻り値：int
引数リスト：$i ,$j
処理内容：iとjを足した結果を戻す

メソッドを呼び出し、処理内容の結果を表示して下さい。
※メソッドを呼び出す際の引数(実引数)は10と20

■問題２
配列の要素5つ(172,149,152,191,155)作成して下さい。
sortメソッドを用いて並び替えをして下さい。
配列の要素を表示してください。

■問題３
otherフォルダにTest.php作成（メソッドを作成し、helloを表示）
otherフォルダにTest1.php作成（メソッドを作成し、hello1を表示）
main7.phpでTest.phpとTest1.phpのメソッドを呼び出す。
解答

```php:main5.php
//問題１
<?php
function total($i, $j)
{
    $total = $i + $j;
    return $total;
}

$to = total(10, 20);
echo $to;


//実行結果
30

```

```php:main6.php
//問題2
<?php

$array = [172, 149, 152, 191, 155];

sort($array);

foreach ($array as $a) {
    echo $a;
    echo "<br>";
}




//実行結果
149
152
155
172
191

```

```php:main7.php
//問題3
<?php
namespace mondai\main;
use mondai\other\test;
use mondai\other\test1;

  require 'other/Test.php';
  require 'other/Test1.php';

test\h();
test1\h();





//実行結果
hello
hello1

```

```php:Test.php
<?php

 namespace mondai\other\test;

function h()
{
    echo "hello";
    echo "<br>";
}

```

```php:Test1.php
<?php

 namespace mondai\other\test1;

function h()
{
    echo "hello1";
}


```
[備忘録]MacのVSCodeでtabを可視化する

# 設定画面を開く
```
# ショートカット
⌘ + ,
```

# "User">"Commonly Used">"Editor:Render Whitespace">"boundary"を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649233/6cc81028-6419-222e-9b25-f48a19e4cb30.png)

# tabが可視化される
## before
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649233/0b7c375b-f1f4-99d3-b548-f7e298460301.png)
##after
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649233/0a1c68f6-5563-0f38-f7a1-7d6873330161.png)
An error has occurred, all later migrations canceled: Mysql2::Error: Table 'users' already exists というエラーの対処法

#問題

Rails s　を実行するとマイグレーションをしろというエラーが出た後に、マイグレーションを実行した後
以下のエラーが発生しました。

```
An error has occurred, all later migrations canceled:
Mysql2::Error: Table 'users' already exists
```


エラー内容は「usersテーブルはすでにある」ということみたいです。
つまりusersテーブルが邪魔でエラーが発生しているということでしょうか。

そこで、usersテーブルを削除すればこのエラーは消えるのではと考えました。


#解決策


Mysql を起動して以下のコマンドでusersテーブルを削除します。

```
drop table users;
```


予想通りusers テーブルを削除したら解決しました。
解決できて良かったです。
git pushの際に起きたエラー

git push origin main　のコマンドを叩いた際に以下のようなエラーが、

fatal: 'origin' does not appear to be a git repository
fatal: Could not read from remote repository.

これは"origin"とはなんぞ？
と言われている状態。
登録しているリモートリポジトリの名前を確認してみます。

git remote -v

"zipcloud-rails"

つまり全然origin とは違います。

git push zipcloud-rails main こちらを試しました。
すると今度は

error: failed to push some refs to 'https://github.com/**********/zipcloud-rails.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

の表示が。
しかしここまで来ればそんなに焦る必要はありません。
あくまでも個人開発ですから、無敵です。

git push --force zipcloud-rails main

これで解決しました。
PowerVS IBM i 日記(36): 大阪 DC(OSA21) で Megaport 接続をサポート。オンプレと PowerVS の直接接続が可能

# 大阪 DC(OSA21) で Megaport 接続をサポート

大阪 DC(OSA21) で Megaport 接続の利用がサポートされるようになりました。

「[Configuring connectivity to Power Systems Virtual Server](https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-configuring-power)」のここに記載されています。

* [Connecting directly to the Power Systems Virtual Server environment by using Megaport connectivity services](https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-configuring-power&locale=en#connecting-megaport)

> Megaport connectivity services are available in WDC04, DAL13, DAL12, LON06, TOR01, FRA05, SYD05, and ***OSA21*** data centers.

まだ、日本語ページは更新されていませんが…

* [Megaport 接続サービスを使用した Power Systems Virtual Server 環境への直接接続](https://cloud.ibm.com/docs/power-iaas?topic=power-iaas-configuring-power&locale=ja#connecting-megaport)

# オンプレと PowerVS の直接接続が可能

Megaport 接続で何ができるかというと、オンプレ環境と PowerVS の直接接続です。

「[技術よりな人が最初に読む IBM Cloud 柔らか層本](https://ibm.box.com/v/ibmcloud-yawaraka)」の「ネットワーク接続パターン」のこれですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/68527fd8-631d-5e74-4354-9590b0584b8b.png)

これまで、東京 DC や大阪 DC でのオンプレ環境と PowerVS の接続は、この図の 4 のように、x86 のIaaS 環境を経由し、IBM Cloud 内の Direct Link Connect を使ってアクセスする必要がありました。

---

【追記】

「[技術よりな人が最初に読む IBM Cloud 柔らか層本](https://ibm.box.com/v/ibmcloud-yawaraka)」にも   OSA21 で利用可能であることが記載されました。
安心して利用できますね。

TOK04 にも来てほしいですね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/184930/6bcb04b4-7cd3-6dc9-ed13-ffc8275bdbb2.png)


---
当日記のIndexは[こちら](https://qiita.com/6onoda/items/f146c78c0c1bbe905a42)です。

---
許可の無い転載を禁じます。
この記事は筆者の個人的な責任で無保証で提供しています。
当記事に関してIBMやビジネスパートナーに問い合わせることは、固くお断りします。
Railsで全ユーザーにメールを送信する

# はじめに
メールの送信機能を初めて実装したので、躓いたところや実装方法をメモとして残しておきます。
質問回答アプリで新規質問が投稿された際に、全員に対して質問があった旨をメールで通知する。

# Action Mailer
Action Mailerを使うと、アプリケーションのメイラークラスやビューでメールを送信することができる。メイラーの動作はコントローラときわめて似通っている。メイラーはActionMailer::Baseを継承し、app/mailersに配置され、app/viewsにあるビューと結び付けられる。
### Mailer作成手順
1. メイラーを作成

```
rails g mailer QuestionMailer
```
```rb:app/mailers/application_mailer.rb
class ApplicationMailer < ActionMailer::Base
  default from: "from@example.com"
  layout 'mailer'
end
```

# 開発環境でメール送信を確認する方法
## mailcatcher
シンプルなsmtpサーバを立てて、送信されたメールをブラウザ上で確認できるようにしてくれる。
(cloud9でmailcatcherを実行しようとしたら、うまく実行出来ず原因はcloud9ではないかと考えられる。なので、メール確認のために代わりにletter_opener_webを使用しました。)
## letter_opener_web
ローカル開発環境で送信したメールをブラウザ上で確認することができる<br>
`http://localhost:3000/letter_opener`にアクセスすることで送信されたメールを確認できる<br>

### cloud9で使う方法
1. gemを追加


```rb:Gemfile
group :development do
  gem 'letter_opener_web'
end
```
2. ルーティング


```rb:config/routes.rb
mount LetterOpenerWeb::Engine, at: '/letter_opener' if Rails.env.development?
```
3. config デフォルトURLを指定(cloud9バージョン)


```rb:config/environments/development.rb
config.action_mailer.default_url_options = { host: 'myapp.c9users.io/', port: $PORT, protocol: 'https'  }
config.action_mailer.delivery_method = :letter_opener_web
```

# 質問があった際に全員に対して質問があった旨をメールで通知する
```rb:app/mailers/question_mailer.rb
class QuestionMailer < ApplicationMailer
  default from: 'qanda@example.com'    
  def creation_email(user)
    @user = user
    mail(subject: '新規質問です',to: user.email, from: "qanda@example.com")
  end 
  def self.creation_email_questions
    @users = User.all
    @users.each do |user|
      QuestionMailer.creation_email(user).deliver_now
    end 
  end
end
```
```rb:app/controllers/questions_controller.rb
  def create
    @question = current_user.questions.new(question_params)
    if @question.save
      QuestionMailer.creation_email_questions
      redirect_to questions_url, notice: "質問を「#{@question.title}」投稿しました。"
    else
      render :new
    end
  end
```
### 躓いたところ
これでも、全ユーザーにメールを送信することは可能だが、考え方が少し複雑な上にメイラーのビューで質問のタイトルや内容を表示するために@question使えない。あと、メーラにクラスメソッドを定義するやり方はあまりやらない。

### 改善するには
メーラのクラスメソッドで定義されている全ユーザーを取り出す処理をquestions_controllerで定義すれば、メーラにクラスメソッドを定義しなくても良くなる！

```rb:app/controllers/questions_controller.rb
  def create
    @question = current_user.questions.new(question_params)
    if @question.save
      User.all.each do |user|
        QuestionMailer.with(user: user, question: @question).creation_email.deliver_now
      end
      redirect_to questions_url, notice: "質問を「#{@question.title}」投稿しました。"
    else
```
```rb:app/mailers/question_mailer.rb
  def creation_email
    @user = params[:user]
    @question = params[:question]
    mail(subject: '新規質問',to: @user.email, from: "qanda@example.com")
  end
```
このように`with(question: @question)`と書くことでメイラーのアクションで`params[:question]`が使えるようになり、ビューでも@questionが使えるのでメールの内容を表示することができるようになる。あとはビューを編集して完成。
MacCatalystを使っているアプリを紹介！あなたも使っているかも

#Twitter
![Twitter social icons - rounded square - blue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1456321/917a0a31-7911-643a-b517-b4fc4f16f34d.png)
言わずと知れた大手SNSアプリ。
一時期Mac版のアプリが廃止されていましたが、
MacCatalystアプリとして復活しました。
「MacもTwitterも使ってる！」という人は一度使ってみては？

[Twitter](https://apps.apple.com/jp/app/twitter-for-mac/id1482454543?mt=12)

#Apple Developper
![apple_dev_logo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1456321/a6861793-1e5b-0548-3742-7fcd9b55a441.jpeg)
Apple関連の記事や動画を見ることができるアプリです。
同じ画面でアプリ開発をしながら情報収集もできるので、
Mac開発者からするとありがたいアプリです。

[Apple Developer](https://apps.apple.com/jp/app/apple-developer/id640199958)


#その他MacCatalystアプリ
・[GoodNotes 5](https://apps.apple.com/jp/app/goodnotes-5/id1444383602)  メモ・PDF管理
・[Rosetta Stone](https://apps.apple.com/jp/app/rosetta-stone-learn-languages/id1476088902?mt=12)  言語学習
・[LookUp](https://apps.apple.com/jp/app/lookup-english-dictionary/id1476163639?mt=12)  英語辞典
・[Jira Cloud](https://apps.apple.com/jp/app/jira-cloud-by-atlassian/id1475897096?mt=12)  プロジェクト管理
・[Dice by PCalc](https://apps.apple.com/jp/app/dice-by-pcalc/id1479250666?mt=12)  ダイスゲーム
・[HabitMinder](https://apps.apple.com/jp/app/habitminder/id1415257374?mt=12)  健康習慣の管理
・[Firey Feeds](https://apps.apple.com/jp/app/fiery-feeds-rss-reader/id1477373845?mt=12)  フィードリーダー
・[Zoho Sign](https://apps.apple.com/jp/app/e-signature-app-zoho-sign/id1476226908?mt=12)  電子署名
・[Zoho Books](https://apps.apple.com/jp/app/accounting-app-zoho-books/id1476500403?mt=12)  会計
・[Post-it](https://apps.apple.com/jp/app/post-it/id1475777828?mt=12)  付箋アプリ
・[King’s Corner](https://apps.apple.com/jp/app/kings-corner/id1482307225?mt=12)  トランプゲーム
・[Triplt](https://apps.apple.com/jp/app/tripit-travel-planner/id1475712010?mt=12)  旅行計画管理

参考： https://apps.apple.com/jp/story/id1479230371
　
MacCatalystアプリを紹介しました。
ほかにもMacCatalystを使ったアプリはまだまだあります。
あなたが何気なく使っているアプリも実はMacCatalystアプリだったり...?

次回はMacCatalystの注意点を解説します。
Intel NUC10i7 にeGPU環境設定

NUCでeGPU使いたいので環境構築メモ
Unity起動がオンボードGPUより体感的に遅くなった気がするけど、ケーブルの品質によったりするのでろうか。。？

![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/0a0df701-8845-0db0-87a1-fc03476cb7ae.png)

## ハードウェア

### NUC10i7FNK

https://shop.tsukumo.co.jp/goods/0735858429481/

windws Pro OSインストールで環境構築済み

### Razer Core X

https://www2.razer.com/jp-jp/gaming-systems/razer-core-x

Thunderboltケーブルは付属のものを利用

## インストール

### Thunderboltドライバー

https://downloadcenter.intel.com/ja/download/28735/Thunderbolt-3-NUC-Windows-10-DCH-?wapkw=Thunderbolt

### GEFORCE® EXPERIENCE™

ThunderboltでGPUをつなげた状態だとインストールできた、接続しないとGPUないじゃんってエラーでた

https://www.nvidia.com/ja-jp/geforce/geforce-experience/

NvidiaにログインしてGforce Game Readyをインストール
ついでにStudioも入れてみる、こっちのほうがいいのかな？

### BIOS更新

https://downloadcenter.intel.com/ja/download/30404/BIOS-FNCML357-

更新したら、電源OFFなど再起動しても、eGPU起動するようになりやした

## 確認

NvidiaのコントロールパネルでGPUの認識を確認

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/a5c38c1d-12bd-1000-f2ed-71ba2a71224d.png)




## 参考サイト

https://www.intel.co.jp/content/www/jp/ja/support/articles/000056230/intel-nuc.html


## 更新情報

### 2023/08/28

久しぶりに起動してNUC環境更新したら、認識しなくなった。。
GPUドライバ更新もダウンロードしたら、また、ダウンロードと表示される。。。
NvidiaのGEFORCE® EXPERIENCE™を入れなおしたら、エクスプレスインストールできるようになった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/670fdbc2-d5fc-c023-e67f-4081c7fdc127.png)

インストール終わたら消えた。。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/f657fcfe-95bb-01b6-e02c-df8e8e9c31a4.png)

再起動したら出てくるようになった
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48015/8594f553-5874-3e8b-d4ab-1a9c0e598add.png)
Django アプリを AWS EC2 にデプロイ

# はじめに

フロントエンド React + バックエンド Django REST Framework でアプリを作成したが、ローカル環境でしか動かすことができないので、AWS EC2 インスタンス上にデプロイして外部からもアクセスができるようにする。[React アプリを AWS EC2 にデプロイ](https://qiita.com/honda28/items/a9c3f6174620b22e1b9b)にて、フロントエンド側をデプロイしたので、今回はバックエンドである DRF API をデプロイすることとし、Web サーバーソフトウェアには、nginx を用いる。なお DRF API はすでに作成されていることを前提とする。[【丁寧解説】秒速でもDjango 3アプリをAWS EC2で公開【Nginx, gunicorn, postgresqlデプロイ】](https://qiita.com/Bashi50/items/d5bc47eeb9668304aaa2)を参考にした。

# GitHub への push

デプロイ前にコードを GitHub へ push する。DB との接続情報など機密情報があるので、（レポジトリ自体を private にしているが念のため）あらかじめ別ファイルとして GitHub 上へはあげないようにする。まず環境変数の管理を行う django-environ パッケージをインストールする。

```
$ pip install django-environ
```

[[Django] django-environで環境変数を管理してみる django](https://e-tec-memo.herokuapp.com/article/172/)を参考に .env ファイルを作成する。ここでは SECRET_KEY, DEBUG, DATABASE_URL の3項目を記述している。.env ファイルは GitHub 上にあげないように、以下のような .gitignore ファイルも合わせて作成する。

```python:.gitignore
.env
```

次に .env ファイルに分けた情報を settings.py にて読み込むために以下のようにコードを修正する。

```python:settings.py
import environ
import os

env = environ.Env()
env.read_env(os.path.join(BASE_DIR, '.env'))
SECRET_KEY = env('SECRET_KEY')
DEBUG = env('DEBUG')

DATABASES = {
    'default': env.db(),
}
```

以下コマンドで、必要なライブラリを requirements.txt に書き出す。

```
$ pip freeze > requirements.txt
```

```
$ sudo apt update
$ sudo apt install python3-pip
$ pip install --upgrade pip
$ pip install -r requirements.txt
```

上記までを実行したら、GitHub のリモートレポジトリに push する。

# EC2 インスタンスの作成、nginx のインストールおよびセットアップ

基本的には [React アプリを AWS EC2 にデプロイ](https://qiita.com/honda28/items/a9c3f6174620b22e1b9b)と同様に実行するだけなので、ここでは割愛。

# DRF API の起動

GitHub に push されているアプリをクローンして起動する。まず git をインストールして、レポジトリをクローンする。

```
$ sudo yum -y install git
$ git clone https://github.com/<your repository>
```

Django アプリが動作する環境を作成するため、Python3 およびパッケージ管理ツールである pip をインストールする。

```
$ sudo apt update
$ sudo apt install python3 python3-pip
```

アプリに必要なライブラリをインストールして、起動する。

```
$ cd <your repository>
$ pip install -r requirements.txt
$ python3 manage.py runserver
```

以上で、Django アプリが起動できる。

# おわりに

1つのサーバーに1つのアプリをデプロイすることができた。nginx について理解を深め、より複雑な設定等も扱えるようにしたい。
配列の中身をいじって遊んでみた！【備忘録】

こんにちは！
本日2本目の投稿です！
今朝、<a href="https://qiita.com/azunas/items/fc17c5785ddacefec55b">こちら</a>の投稿にて、配列の要素の追加と削除を行いましたが、今回は、配列の中身をいじってみました！
すでに作ってある配列の要素を全て、連結したり、逆の順番にしてみたりと、思ったより、色々なことができました！

# 要素を連結してみよう！
まず、配列の要素を全て連結し、文字列に変えてみましょう！join()メソッドを使います。
カンマ、または指定した文字列で、区切ることができます。引数に何も指定しないと、カンマで区切られることになります。
join()メソッドの使い方は以下です。

```JavaScript
配列.join();
```

``` JavaScript
let array1 = ["あ", "い", "う", "え", "お"];
let array1_2 = array1.join(); // 引数に何も指定していないので、カンマで区切られる。
let array1_3 = array1.join("-");
console.log(array1);
// ["あ", "い", "う", "え", "お"]
console.log(array1_2);
// あ,い,う,え,お
console.log(array1_3);
// あ-い-う-え-お
```

# 要素を指定した要素で、置き換える(埋める)！
指定した範囲のインデックスの要素を指定した要素で置き換えてみます！fill()メソッドを使います。
引数にインデックス番号を指定しなければ、最初から最後まで全ての要素を置き換える。
置き換えられて、変更された配列そのものが返されます。
fill()メソッドの使い方は以下です。

```JavaScript
配列.fill(置き換えたい要素, 開始インデックス, 終了インデックス);
```

```JavaScript
let array2 = ["A", "B", "C", "D", "E", "F", "G"];
let array2_2 = array2.fill("X"); // 引数にインデックス番号が指定されていないので、全てが置き換わる。
let array2_3 = array2.fill("O", 2, 6);
// インデックス番号2〜5の要素を、"O"で置き換える。
console.log(array2_2);
// ["X", "X", "X", "X", "X", "X", "X"]
console.log(array2_3);
// ["X", "X", "O", "O", "O", "O", "X"]
```

# 要素の順番を逆にしてみる！
最後に、配列の要素を逆の順番にしてみましょう！
いちいち取り出す必要はないですよ、reverse()メソッドを使うんです！
reverse()メソッドの使い方は以下です。

```JavaScript
配列.reverse();
```

```JavaScript
let array3 = ["い", "ろ", "は", "に", "ほ", "へ", "と"];
let array3_2 = array3.reverse();
console.log(array3_2);
// ["と", "へ", "ほ", "に", "は", "ろ", "い"]
```

# おわりに
配列自体を操作するメソッドについて、学ぶことができました！
お読みいただきありがとうございました！

私自身、まだまだ初心者なので、もし、間違いや補足などございましたら、コメントや編集リクエストなど、お願い致します！

# 参考資料
柳井政和著 『JavaScript[完全]入門』(2021)

<a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/join">MDN join()</a>

<a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/fill">MDN fill()</a>

<a href="https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Array/reverse">MDN reverse()</a>
MinecraftでMODを開発したい#2

*MinecraftでMODの開発をします*
*試行錯誤を書いていくだけのものになります*

##概要
特殊な機能を持たないアイテムの追加

##動作環境 2021/05/12
||Version|
|:-:|:-:|
|Mac OS Big Sur|11.1|
|IntelliJ IDEA|2021.1.1|
|AdoptOpenJDK (HotSpot)|1.8.0_282|
|Minecraft|1.16.5|
|Forge|36.1.0|

##目次
- プログラムの記述
- アイテムモデルの記述
- テクスチャの配置
- 翻訳設定
- 確認


##プログラムの記述
```src/main/java/com/ドメイン名/examplemod/ExampleMod.java
package com.ドメイン名.examplemod;

import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.fml.RegistryObject;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.ForgeRegistries;

@Mod(ExampleMod.MOD_ID)
public class ExampleMod {
    public static final String MOD_ID = "examplemod";

    public ExampleMod() {
        IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus();
        Items.register(modEventBus);
    }

    public static class Items {
        private static final DeferredRegister<Item> ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MOD_ID);
        public static final RegistryObject<Item> TITANIUM_INGOT = ITEMS.register("example_item", () -> new Item(new Item.Properties()
                .tab(ItemGroup.TAB_MATERIALS)));

        public static void register(IEventBus eventBus) {
            ITEMS.register(eventBus);
        }
    }
}
```
 
MOD_IDはmods.tomlに記載したものと一致する必要があり、すべて小文字の必要がある

`ITEMS.register("example_item", …)`でアイテムの登録名を指定
アイテムIDは`examplemod:example_item`となる

ItemクラスのインスタンスはMinecraftのアイテムの種類を表す。耐久上限や最大スタック数など、アイテムの種類によって変わる性質を保持している

`tab(ItemGroup.TAB_MATERIALS)`でクリエイティブタブ「その他」に表示されるよう指定
この指定を行わなかった場合、クリエイティブタブからは取得できなくなる

##アイテムモデルの作成
```src/main/resources/assets/examplemod/models/item/example_item.json
{
  "parent": "minecraft:item/generated",
  "textures": {
    "layer0": "examplemod:item/example_item"
  }
}
```


##テクスチャの配置
`src/main/resources/assets/examplemod/textures/item`のファイル構造を構築
そこにアイテムのアイコンになる16×16ピクセルのpng画像ファイル`example_item.png`を配置する


##翻訳設定

####英語翻訳
```src/main/resources/assets/examplemod/lang/en_us.json
{
  "item.examplemod.example_item": "Example Item"
}
```

翻訳が設定されていない言語の代わりとしても表示される

####日本語翻訳
```src/main/resources/assets/examplemod/lang/ja_jp.json
{
  "item.examplemod.example_item": "お試しアイテム"
}
```

文字コードはUTF-8で保存

##確認
![example.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482491/3778e4e3-2b10-63e6-36da-78dfed9075e2.png)
![example2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482491/5fb7ce6a-73bd-178c-bae5-c9533afc86bf.png)

######参考文献
https://www.tntmodders.com/tutorial/item-1165/
(vue3でのつまずき) v-modelが動かず、change は2回発火される場合の対処

vue3 を触っていて、2つのつまずきがあったので解決方をまとめました。

## ■つまずき1：v-modelが動かない

```components/AInput.vue

<template>
    <input
        @input="$emit('input', $event.target.value)"
        @change="$emit('change', $event.target.value)"
    />
</template>

<script>
export default {
  name: "AInput",
};
</script>
```
このコンポーネントにv-modelでバインドする際にvue3だとうまく動かないようでした。

```App.vue
<template>
  <div class="container">
    コードを入力してください。
    <AInput 
      v-model="code"
      @change="onChange"
      type="tel"
    />
    <p>コード： {{ code }}</p>
  </div>
</template>

<script>
import AInput from "./components/AInput.vue";

export default {
  name: "App",
  components: {
    AInput,
  },
  data() {
    return {
      code: '',
    };
  },
  methods: {
    onChange(v) {
      console.log('changed')
      console.log(v)
    }
  }
};
</script>
```

![ph1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342307/4490ce98-f822-db4b-a27e-e025080e9c01.png)


## ■原因  v-modelの仕様が変わった
vue3 の v-modelの仕様が、v2から変わっていました。
https://v3.ja.vuejs.org/guide/migration/v-model.html

> 破壊的変更: カスタムコンポーネントで使用する場合に、v-model のプロパティとイベントのデフォルト名が変更されます。
プロパティ: value -> modelValue
イベント: input -> update:modelValue
破壊的変更: v-bind の .sync 修飾子とコンポーネントの model オプションは削除され、v-model の引数に置き換えられます。
新規: 同じコンポーネントに複数の v-model バインディングが可能になりました。
新規: カスタムの v-model 修飾子を作成する機能が追加されました。


こちらの記事に詳しく記載を頂いていました。

https://qiita.com/ryo-gk/items/48346f3d9eb2b8169f48


## ■解決法  $emit するイベントを **update:modelValue** に変更
記載の通り、AInput.vue の @input の $emit するイベントを **update:modelValue** に変更するとv-modelが動きました。

```components/AInput.vue

<template>
    <input
        @input="$emit('update:modelValue', $event.target.value)"
        @change="$emit('change', $event.target.value)"
    />
</template>

<script>
export default {
  name: "AInput",
};
</script>
```

![ph2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342307/cd88c089-6219-615f-43cc-4d1314c70069.png)

## ■つまずき2：changeイベントが2回発火される

また同時に、changeが2回$emitされる現象が起こりました。
![ph3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342307/0e2316ba-a926-4c65-1fe1-f97f43d56752.png)


## ■原因  vue3から $emit の仕様が変わった
下記のページとRFCを見ると、コーディングの意図を明示的にするために、$emitするイベントをwhite list化することを求める変更が行われたようでした。

https://v3.vuejs.org/guide/migration/emits-option.html#overview

https://github.com/vuejs/rfcs/blob/master/active-rfcs/0030-emits-option.md


## ■解決法 $emit するイベントをemitsに記述

https://github.com/vuejs/vue-next/issues/2993

こちらのissueの回答の通り、AInput.vue の $emit するイベントを 事前に把握して

```js
export default {
  emits: ["update:modelValue","change"],
} 
```

と記述することでchangeが2回発火されなくなりました。

```components/AInput.vue

<template>
    <input
        @input="$emit('update:modelValue', $event.target.value)"
        @change="$emit('change', $event.target.value)"
    />
</template>

<script>
export default {
  name: "AInput",
  emits: ["update:modelValue", "change"],
};
</script>
```
![ph4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342307/1d12f211-672a-0498-dc67-4c6eaf94812b.png)


以上2つのつまずきについて解決方法をまとめました。
2つ目の方は、2回イベントが$emitされるのは結構危ないので気を付けたいと思いました。

以上です。
Install-Moduleで「Authenticode 署名 が無効」エラーが出るのを無理矢理突破する方法

PowerShellでInstall-Moduleでモジュールをインストールしているとき、依存パッケージの証明書エラーでインストールできないことがある。

```
PackageManagement\Install-Package : ファイル 'Microsoft.Xrm.Tooling.CrmConnector.PowerShell.psd1' の Authenticode 署名
が無効なため、モジュール 'Microsoft.Xrm.Tooling.CrmConnector.PowerShell' をインストールまたは更新できません。
発生場所 C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:1809 文字:21
+ ...          $null = PackageManagement\Install-Package @PSBoundParameters
+                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (Microsoft.Power....InstallPackage:InstallPackage) [Install-Package]、E
    xception
    + FullyQualifiedErrorId : InvalidAuthenticodeSignature,ValidateAndGet-AuthenticodeSignature,Microsoft.PowerShell.P
   ackageManagement.Cmdlets.InstallPackage
```

`Install-Module`コマンドに`-SkipPublisherCheck`オプションをつけることで、証明書チェックをスキップしてインストールすることができる。

```powershell
Install-Module -Name Microsoft.Xrm.Tooling.CrmConnector.PowerShell -SkipPublisherCheck
```

証明書チェックをしないことで、悪意があるモジュールもインストールされてしまいかねないので、インストールされる依存モジュールに十分注意し、自己責任でお使いください。

（参考にした記事）http://techu1999.sakura.ne.jp/python/category/その他tips/
PHPバージョン8→7.4

プロジェクトの都合でダウングレードしました。

## 現在のバージョンを調べる

```console:コンソール
php -v
```

バージョンが8になってました。

## インストール済みの PHP バージョンを確認

```console:コンソール
brew search php
```

## HomebrewでインストールできるPHP7系を検索

```console:コンソール
brew search php@7
```

7.4がインストールされてなかったのでインストールしました。

```console:コンソール
brew install php@7.4
```

## PHPのPATHを通す

```console:コンソール
echo 'export PATH="/usr/local/opt/php@7.4/bin:$PATH"'>>~/.zshrc
```

MacOSによってbashかzshか違うみたいなので、Bashの人は .bashrcとか触ってください。


## phpを起動

```console:コンソール
brew services start php
```

ここで一回ターミナルを閉じて、再度起動

```console:コンソール
php -v
```

PHP7.4になった！


***
参考にしました

https://mykii.blog/what-is-shell-bash-and-zsh/
https://qiita.com/takutoki/items/021b804b9957fe65e093
Selenium Python クロームドライバー（chromedriver.exe）の自動インストール

環境：WIndows10
pythonバージョン：3.8.32

#chromedriver.exeの自動インストール(更新も自動)



以下の本にchromedriver.exeの自動インストールの方法があったので自分の環境に合わせてメモします。↓
chromedriver.exeにパスが通ってなくても、プログラムをexeファイル化しても、自動でインストールされました。

[スクレイピング・ハッキングラボ：アマゾンのページ](https://www.amazon.co.jp/dp/B08H1KBYG2/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

#webdriver_manager
[webdriver_manager](https://github.com/SergeyPirogov/webdriver_manager)

webdriver_managerを使うとchromedriver.exeを自動でインストールしてくれます。

<b>chromedriver.exeを自動でインストールしてヤフーに接続するサンプル</b>

```:python
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
import time

options = Options()
    
options.add_argument('--hide-scrollbars')
options.add_argument('--incognito')　　#シークレットモードのオプション

#旧　pythonの実行ファイルと同じ場所に   chromedriver.exeを設置してた。
#file_path = os.path.join(os.path.dirname(sys.argv[0]), "chromedriver.exe")　
#driver = webdriver.Chrome(options=options, executable_path=file_path)

#新　 わざわざchromedriver.exeを設置しなくても自動でインストール更新されます。
driver=webdriver.Chrome(ChromeDriverManager().install(),options=options)
driver.get("http://yahoo.co.jp")   

time.sleep(5)
driver.quit()


```

上のソースを実行するにはwebdriver_managerのインストールが必要です。
自分のWindwos10環境の場合
#py -m pip で　webdriver_managerをインストール

```:pip
py -m pip install webdriver_manager

```

Selenium+クロームドライバーで作業していて必ず必要なのがchromedriver.exeの変更やインストール。
3か月に1回程度は更新が必要なようで、スクレイピングをタイマー起動しても、エラーで止まってしまうことしばしば。コピーして別のPCで使うにもchromedriver.exeがなくて、とまったりということがなくなる予定です。
dockerでsymfony & mysql & phpmyAdminのローカル開発環境を作る。②

#前のページの続きになります。
 前回の記事はこちら。

https://qiita.com/k-tabuchi/items/60aac47df044fbe2df6c

#migrateできるようにする。
前回までで、ルーティングとtwigテンプレートの導入までは正常に動いていましたが、
教科書(Symfony4入門 掌田 津耶乃著)を読み進めていたところ、DBにマイグレーションするところでエラーになりました。

![スクリーンショット 2021-05-13 13.04.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201982/bca8aad4-7736-cbf3-9e69-e322fa58a129.png)

なぜか、postgresに接続しようとしている。
そんなことをdocker-composeに書いた覚えはないのに・・

そこで、以下のファイルを修正
/app/my_app/.env (symfonyのプロジェクトルートにある方の.env 前回のdocker用.envとは違う)
DATABASE_URL= の後に、docker-compose.yamlのDATABASE_URLの値をコピペする。
mysql以外のドライバはコメントアウトする。

```/app/my_app/.env
# DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"
#DATABASE_URL="postgresql://db_user:db_password@127.0.0.1:5432/db_name?serverVersion=13&charset=utf8"
#DATABASE_URL="mysql://db_user:db_password@127.0.0.1:3306/?serverVersion=5.7"
DATABASE_URL="mysql://root:root@mysql/app_db"
```

ここまででもう一度マイグレーションしてみると今度は以下のエラーが出ました。

![スクリーンショット 2021-05-13 13.12.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201982/5d969471-ce3f-75d9-623b-140ff221f9ba.png)

docker-syncしてるからローカルホストから起動すると思っていたのですが、
php bin/console make:migrationはコンテナの中で実行しないとこういうエラーになるそうです。

なのでコンテナに入ります。

```bash
docker-compose exec app bash 
```

入ったら、

```
cd my_app
docker-compose exec app bash 
```

これで動きました。
![スクリーンショット 2021-05-13 13.20.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201982/0b8bb83e-d067-51b4-f5d0-98271ad07e00.png)


#以上
お疲れ様でした。

#参考
Laravel+dockerの記事を参考にしましたが、symfonyでも同じように解決できました。

https://hara-chan.com/it/infrastructure/php-migration-error-php-network-getaddresses/
DatabricksでRのProphetをインストールする際のエラーと対策

最近遭遇したので解決策をメモします。

# 現象
Databricksのクラスターライブラリとして[prophet](https://facebook.github.io/prophet/)をインストールしようとすると、以下のエラーでインストールできません。

```
java.lang.RuntimeException: Installation failed with message: 
Error installing R package: Could not install package with error:   installation of package 'V8' had non-zero exit status
  installation of package 'rstan' had non-zero exit status
  installation of package 'prophet' had non-zero exit status
Full error log available at /databricks/driver/library-install-logs/r-package-installation-2021-05-12T09:28:44Z-ue08v7_4.log
```

# 解決策

クラスターのinit scriptでV8をインストールします。その後、クラスターライブラリとしてProphetをインストールします。

**Python**

RのノートブックでPythonを実行しているので、`%python`マジックコマンドを指定しています。

```python
%python
dbutils.fs.put("/databricks/scripts/v8-install.sh","""
sudo apt-get install -y libv8-dev""", True)
```

init scriptをクラスターに設定します。
![](https://sajpstorage.blob.core.windows.net/qiita-images/init_script.png)

クラスターライブラリとしてProphetをインストールします。
![](https://sajpstorage.blob.core.windows.net/qiita-images/cluster_library.png)

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
git pullして「error: You have not concluded your merge (MERGE_HEAD exists).」と返ってきた場合

## 課題
```
git pull
```
をしたら

```
error: You have not concluded your merge (MERGE_HEAD exists).
hint: Please, commit your changes before merging.
fatal: Exiting because of unfinished merge.
```
と返ってきた

## 解決方法
```
git reset --merge
```
【シェル】ディレクトリを再帰的にリストし、コマンドサーチパス型式に整形して出力する

ネットで落としてきたフリーのツール類、アーカイブを解凍してみたら、実行ファイルが１つだけと思いきや、実行ファイルや DLL ファイル、そのほか設定ファイルと思わしきものなどが解凍されたディレクトリ以下に複数ディレクトリ／ファイルとして格納されていて、どれがラインタイムで必要なものか判らない。 そんなことがたまにある（bind9 とか nmap とか）。
こんなとき、メンドくさいから、解凍してできたトップディレクトリを丸ごと /usr/local/bin なんかにストアするのだけど、こんなのが複数ある場合に、それぞれに PATH を通すのは面倒だし、その後も同種のツールが増える都度、PATH に追加するのはさらに面倒。

例えば /usr/local/bin の下に、

/usr/local/bin/tool_1/
/usr/local/bin/tool_2/
/usr/local/bin/tool_3/
/usr/local/bin/tool_3/subDir

のようにディレクトリがある場合には、それらのサブディレクトも含めて、

PATH=$PATH：/usr/local/bin/*

のようなイメージで記述すれば、一発で、

PATH=$PATH:/usr/local/bin:/usr/local/bin/tool_1:/usr/local/bin/tool_2:/usr/local/bin/tool_3:/usr/local/bin/tool_3/subDir

のように展開されれば楽なのに。

そこで、あるディレクトリ以下のサブディレクトリを再帰的にリストして、それらを':'で区切られた１行のテキスト（「コマンドサーチパス型式」と表現してみる）に整形できれば、と考えた。

先哲の知恵を求めて色々ネットをググったのだが見つからない。
そこで、ここ（ https://hacolab.hatenablog.com/entry/2019/07/29/235312 ）なども参考にして、こんなコマンドラインを発案。

\\$ find /usr/local/bin -type d -print | sed -e ':loop' -e 'N; $!b loop' -e 's/\n/:/g'

結果は良好。
これをバッククオートで挟んで、.bash_profile なんかに

PATH=\\$PATH:\`find /usr/local/bin -type d -print | sed -e ':loop' -e 'N; \\$!b loop' -e 's/\n/:/g'\`
と書いとけば、期待通りのコマンドサーチパスが $PATH にセットされる。
勉強会:Db2問題判別 ロック タイムアウトと長時間SQL

# 要旨
db2pdとイベントモニターを使ってDb2の問題判別を行います。ロックタイムアウトの原因、実行時間の長いSQLの見つけ方をGoogle Slidesで説明します。

# 勉強会資料
<iframe src="https://docs.google.com/presentation/d/e/2PACX-1vT-MO9CU9U3TGPXaPf95F2E3T-zBkR6cmX7JBdvsI7KMS4mcxPZelT2SYeeBANnLHR-kTqna6Lthow9/embed?start=false&loop=false&delayms=3000" frameborder="0" width="960" height="569" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>

# システム環境
Windows Server 2012, 2016
Db2 V11.1, 11.5 Windows
<iframe src="https://docs.google.com/presentation/d/e/2PACX-1vRCKsBKRrtCU9HwPn_7AA1T7dJhuDFDhEsKGuG9iFdiU9U58d3PQq3rcQFYDCinaamDPiZu5_B5yNOV/embed?start=false&loop=false&delayms=3000" frameborder="0" width="960" height="569" allowfullscreen="true" mozallowfullscreen="true" webkitallowfullscreen="true"></iframe>
JavaScript ２つの時間の差異を求めて、時差を表示する

# やりたかったこと
　現在時刻とユーザーが任意に入力した時刻の間の差異を求めて、`00日00時間00分00秒（遅れ/早い）`といった具合に時差を分かりやすく表示させたい

**主に使ったメソッド**

- [.getTime](https://www.sejuku.net/blog/22925)
 - 1970年1月1日00時00分から現在までの時間をミリ秒（1/1000秒）で表した数字を返すメソッド 
- [Math.floor](https://techacademy.jp/magazine/27120) 
 - 小数点以下を切り捨ててくれるメソッド
- [.toString](https://techacademy.jp/magazine/34742)
 - 数値を文字列に変換してくれるメソッド
- [.padStart](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/padStart)
 - 数値を固定長文字列に変換するためのメソッド

# 記載したコード

```javascript
    const NowTime = new Date();
    const ChangeTime = new Date(timeInput.value);
    / ここの「timeInput.value」にはユーザーが入力した任意の時刻が挿入される仕様です
    let TimeDefference;
    function leftFillNum(num, targetLength) {
      return num.toString().padStart(targetLength, 0);
    } 
    function timeJudge(days, hour, minute, second) {
      return (leftFillNum(days, 2) + '日'
            + leftFillNum(hour, 2) + '時間' 
            + leftFillNum(minute, 2) + '分' 
            + leftFillNum(second, 2) + '秒');
    }
    if (NowTime.getTime() > ChangeTime.getTime()){
      TimeDefference = NowTime.getTime() - ChangeTime.getTime()
      let diffDays =  Math.floor(TimeDefference/1000/60/60/24);
      let diffHour =  Math.floor(TimeDefference/1000/60/60)%24;
      let diffMinute =  Math.floor(TimeDefference/1000/60)%60;
      let diffSecond =  Math.floor(TimeDefference/1000)%60;
      TimeDefference = timeJudge(diffDays, diffHour, diffMinute, diffSecond) + "遅れ";
    } else if (NowTime.getTime() < ChangeTime.getTime()){
      TimeDefference = ChangeTime.getTime() - NowTime.getTime()
      diffDays =  Math.floor(TimeDefference/1000/60/60/24);
      diffHour =  Math.floor(TimeDefference/1000/60/60)%24;
      diffMinute =  Math.floor(TimeDefference/1000/60)%60;
      diffSecond =  Math.floor(TimeDefference/1000)%60;
      TimeDefference = timeJudge(diffDays, diffHour, diffMinute, diffSecond) + "早い";
    }
```

冗長的なコードで、もっとDRYに記述できると思うのですが、とりあえずこれで確認したい時刻の表示を現在時刻を起点にして早い/遅いに条件分岐して表示させることができました。
[以前書いた記事](https://qiita.com/hirokun0204/items/c24b76025cb62210ed2f)で、`.padStart`についてご教示いただき、とても参考になりました。
もっと改良して、より見やすいコードにしていこうと思います。
【EC-CUBE4】自作プラグイン作成時、コードミスったままプラグイン登録後500エラーになり動かない

# 経緯
テスト的に上げてみようとアップロードしたら、コードにミスがあったらしく。エラーをはく。
その後管理画面にも移れず、コードを変えても変わらず詰んだ。

# 開発環境
- MAMP v6.3
- EC-CUBE4 v4.0.5-p1

# 作成したPluginファイル
- composer.json
- Controller
- Entity
- Repository

# 結論
結論から言うと、
**Plugin配下のディレクトリ消して、自分のローカルサイトにアクセスする**
と直る。

## 注意点
コードでPluginを消したため、管理画面には残っています。
管理画面から消そうとしても中身はないため、システムエラーが発生しましたのエラーが吐かれます。

今回私はお試しでプラグイン作成したので、名前を変えてアップロードしました。
名前変えたくない場合は、、作り直ししか私の知見ではわかりません、、

<br>

# 発見過程
ここから下は自分の試したことを置いておきます。

## 模索①
とりあえずキャッシュに違いない。
管理画面に入れないので、ファイルを消そう。
/var/cache/prod/以下全て

**結果**
えーん；；変わらず。

## 模索②
キャッシュに違いないんだ。。。多分。。
コマンドラインからcache消そう

**結果**
えーん；；
コマンドラインから削除しようとするとエラー、、
namespace大丈夫なはずだぞ、、

```
Expected to find class "Plugin\samplePlugin001\Controller\PlgSampleController" in file "/Applications/MAMP/htdocs/eccube-  
  4.0.5-p1/app/Plugin/samplePlugin001/Controller/PlgSampleController.php" while importing services from resource "../../../  
  app/Plugin/*", but it was not found! Check the namespace prefix used with the resource in /Applications/MAMP/htdocs/eccub  
  e-4.0.5-p1/app/config/eccube/services.yaml (which is loaded in resource "/Applications/MAMP/htdocs/eccube-4.0.5-p1/app/co  
  nfig/eccube/services.yaml")
```

## 模索③：結果としてこれで解決
ん、待てよ。
Plugin配下が悪さしてるんだから、Plugin配下のディレクトリ消してみよう

結果
消した後、自分のローカルサイトにアクセスできた！！！

# 余談
Pluginのコードちょっとミスってただけで、こんなリスキーなことあるか、、、
他の皆さんはどうやって解決しているんだろうか、、(このエラー起こしてる人ネットで見つけられなかった)

#追記 (2021/05/13)
DBから直接エラーを起こしていたファイルを削除することで、
注意点の名前問題は解決しました。

また、`.env`内が
`APP_ENV=dev`
`APP_DEBUG=1`
になっているかも確認が必要でした。
[Unity] Google Maps Static APIで得た画像をTexture2Dに変換する

Google Maps Static API を使うと、

```
https://maps.googleapis.com/maps/api/staticmap?center=新宿&zoom=14&size=400x400&key=YOUR_API_KEY
```

のようにURLを指定するだけで、下のようなpng画像がかえってきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/374bf247-ae4f-983c-21eb-eebd698f6f55.png)

つまり、これをUnityの UnityWebRequest に渡せばテクスチャを得ることができます。

・・・と思ったのですが、公式サンプル通り

```
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
 
public class MyBehaviour : MonoBehaviour {
    void Start() {
        StartCoroutine(GetTexture());
    }
 
    IEnumerator GetTexture() {
        UnityWebRequest www = UnityWebRequestTexture.GetTexture("https://maps.googleapis.com/maps/api/staticmap?center=新宿&zoom=14&size=400x400&key=YOUR_API_KEY");
        yield return www.SendWebRequest();

        if (www.result != UnityWebRequest.Result.Success) {
            Debug.Log(www.error);
        }
        else {
            Texture myTexture = ((DownloadHandlerTexture)www.downloadHandler).texture;
        }
    }
}
```
とすると

```
InvalidCastException: Specified cast is not valid.
```
というエラーが出てTextureに変換してくれません・・・。
(Unity2020.3,7f1)

```www.downloadHandler.data``` にはちゃんとデータが入っているようなのですが、何のデータかわからずキャストできないようです。もしかしてURLの最後が.pngじゃないからとか？
自前でデータコンバーター書かなきゃダメなのか・・・と一瞬半泣きになったのですが、そういえばpngファイルからTexture2Dにする方法があったような、と調べたところ、

```
Texture2D texture = new Texture2D(400,400);
texture.LoadImage(webRequest.downloadHandler.data);
```

という方法が見つかりました。
400,400のところはgoogleMapsに渡したsize=400x400の値ですが、2,2など適当な値でもLoadImageが調整してくれるようです。
ということで、

```
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
 
public class MyBehaviour : MonoBehaviour {
    void Start() {
        StartCoroutine(GetTexture());
    }
 
    IEnumerator GetTexture() {
        UnityWebRequest www = UnityWebRequestTexture.GetTexture("https://maps.googleapis.com/maps/api/staticmap?center=新宿&zoom=14&size=400x400&key=YOUR_API_KEY");
        yield return www.SendWebRequest();

        if (www.result != UnityWebRequest.Result.Success) {
            Debug.Log(www.error);
        }
        else {
            Texture2D texture = new Texture2D(2,2);
            texture.LoadImage(webRequest.downloadHandler.data);
        }
    }
}
```

で、無事テクスチャを取得することができました！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/5199d82c-c737-0405-256e-9a7be0707df3.png)
M1 mac book airを購入後インストールしたもの

M1 Mac book airを購入したので、購入後すぐにやったこと。ハマったことも一緒に掲載


## GUI系ソフトウェアをインストール    
GUI系は何の問題もなくインストール完了
公式ページ、App storeからからダウンロードするだけ。
- sequel pro
- google chrome
- VS code
- atom
- sourse tree
- fork
- docker for mac
- adobe(Ai, Ps など)
- Jetbrains(RubyMine)
- slack
- evernote
- monosnap
- goodnote
- xcode
- Dispaly Menu
- Magnet


## CUI系ソフトウェア

#### homebrew  
ターミナルの設定を 「Rossetaを使用して開く」 に変更して、インストール、、はNG

```sh  
NG な方法
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

homebrew公式通りに行う
[homebrew公式](https://docs.brew.sh/Installation)

```sh
mkdir homebrew && curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
```

```sh:~/.zshrc
export PATH=$HOME/.nodebrew/current/bin:$PATH
```

動作確認
```sh
$ brew help
```

パスを通す
#### homebrew系のインストール
- rbenv  

```sh
$ brew install rbenv
```
- mysql@5.7

```
$ brew install mysql@5.7
$ brew services start mysql@5.7
```

- redis

```
$ brew install redis
$ brew services start redis
```

- imagemagick

```
$ brew install imagemagick
```

- yarn


```
$ brew install yarn
```


- nodebrew


```
$ brew install nodebrew
```

#### rbenv, Ruby3.0
```
$ ruby upgrade ruby-build
$ rbenv install 3.0.0
```

パスを通す

```sh:~/.zshrc
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init - zsh)"
```

#### AWS CLI 2
```
$ curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
$ sudo installer -pkg AWSCLIV2.pkg -target /
```

#### Jupyter Lab
```
$ pip3 install jupyterlab
```
※pip3とpython3は標準でインストール済み


#### yarn
brewでいれると安定版をいれるのがすこしめんどくさいので、npmでインストール

```sh
$ node -v
v14.17.0
$ npm install -g yarn
```