OmniAICreator/Qiita-1.07M huggingface dataset:
【Vue3】render関数で、アプリケーションインスタンス内部のdataを出力しよう

# 環境
vue 3.1.5

# 実装したい内容
render関数で、アプリケーションインスタンス内部のdataを出力したい。

# 具体的な状況
appという名前のアプリケーションインスタンスを用意する。中にdataとrenderを宣言して、下のように書けば、htmlに表示される。
```js
const app = Vue.createApp({
  data: () => ({
    message: 'welcome'
  }),
  render: (el) => Vue.h('h2', 'bonjour ' + el.message)

}).mount('#app')
```
```html
<body>
  <div id="app">
  </div>
  <script src="https://unpkg.com/vue@3.1.5/dist/vue.global.js"></script>
  <script src="main.js"></script>
</body>
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538308/ba6ccf36-2d3b-599c-e864-a850e0a7954e.png)


# 教訓
render関数はデフォルトの引数をとり、それがアプリケーションインスタンスの中身になってるっぽい。（上のコードでelと命名した部分）
Vue.hでdomを生成して、renderしたい際は、Vue.hの引数の中にelを渡してあげれば上手くいく。
実務未経験の自分がPHPerKaigiのLTをした件

皆さん、PHPerKaigi2023に参加しましたか？今年はコロナの規制緩和によって最終日に懇親会があるなどコロナ以前のような雰囲気でイベントができていたんじゃないかなと思います。
この記事では自分がPHPerKaigi2023のLTに登壇するまでにしたことや感じたことについてお伝えします。この記事を機にPHPerKaigiのLTに前向きな人が増えれば幸いです

https://phperkaigi.jp/2023/

# 筆者について
<dl>
<dt>属性</dt>
<dd>東京の某大学に所属する文系学生、Qiitaへの投稿とクソアプリを作るのが趣味</dd>
<dt>プログラミング歴</dt>
<dd>PHPは３年ほど触ってきたが、サマーインターン以外の実務経験なし</dd>
<dt>LT歴</dt>
<dd>10人規模のオンラインLTをやったことがある</dd>
</dl>

# 自分のLTのテーマ
<dl>
<dt>タイトル</dt>
<dd>PHP8.xの新機能を使ってより良いコードを書こう！</dd>
<dt>概要</dt>
<dd>PHP8.0の新機能を7.4のコードと比較しながら紹介</dd>
<dt>テーマ選定の理由</dt>
<dd>PHPのサポートバージョンが昨年末から7から8になったことからPHP8の新機能の紹介はLTの題材に良いのではないかと思ったから</dd>
<dt>発表資料など</dt>
</dl>

https://fortee.jp/phperkaigi-2023/proposal/56e27797-b4fa-49d2-9352-0f2660451dc3

https://qiita.com/SanQ/items/f8453d6a7cbac6852312

# 本番当日までのスケジュール
## LTの応募から採択まで（12月）
PHPerKaigi2023のLTの応募は**fortee**というサイトから行われました。**12月の第一週**にforteeの応募ページからトークタイトルやトーク概要などを送信し、翌週の火曜日にはメールからトーク採択のお知らせが届きました。そしてその後に発表や資料に対する注意事項、チケットの発見の手続き、当日の流れなどがメールで届きました。今年に関してはスピーカーに採択された方にはチケットやノベルティが贈呈されました。つまり**スピーカーの出費は交通費のみ！** やったね！！（来年はどうなるかは分かりません）

https://fortee.jp/

## LTの採択後から本番まで（1月～3月）
他のスピーカー枠と違ってLTのスピーカーは事前にやらなくてはいけないことはないので、この期間では資料の注意書きをもとに資料を作成＆発表練習を行っていました。発表練習ではconnpassで見つけたオンラインLTイベントにスピーカーとして登壇して本番さながらの状況でLTを行ってきました。
僕が参加したイベントはこちら

https://gaji-lt.connpass.com/

こちらのイベントはプログラミングに関係していればどのようなLTでもOKという趣旨でYoutubeLiveで行われています。当日のアーカイブは主催者のチャンネルに残っているため、自分の発表の様子を見返すことができます。以下が主催者のチャンネルです。過去のイベントの様子が見られるようになっているので、ぜひ見てみてください！

https://www.youtube.com/@gaji-labo2710

## LT当日
PHPerKaigi前日にメールで運営から渡された資料を基に本番までの手順や発表の最終調整を行っていました。
LTではオフラインでの視聴者によるペンライトの応援などがあり、非常に盛り上がっていました。登壇する側としても一体感があって楽しかったです！

https://twitter.com/TAKA_0411/status/1639424257133535234

また個人的に山村 光平さんの「不幸を呼び寄せる命名の数々　 ～君はそもそも何をされてる方なの？～」のLTが面白かったです

https://fortee.jp/phperkaigi-2023/proposal/b84ab856-7c83-46a8-829e-84adbc1e7921

# LTを終えて
今までにない規模のイベントでのLTということもあり、発表が近づくにつれて不安が大きくなるなど大変なこともありましたがPHPerKaigi2023でLTをできて良かったと思っています。PHPerKaigiの初参加から3年経ちますが、PHPerKaigiの中で他の参加者との交流に対して自分の中に壁を感じていました。（これはPHPerKaigiによるものではなく、自分の特性によるものです）しかし今回スピーカーとして参加し、自分の発表に対するSNSやリアルの反応をいただいたことでPHPerKaigiをより楽しむことができました。今後も（採択していただければ）スピーカーとしてPHPerKaigiに参加していきたいです！！
RubyのTime



# 症状

CentOSなんですが，Rubyで出力している時間がUTSっぽいので，JSTへの変更をどうやるかがわからなくて，その探索の結果です．


## 環境

```bash
> ruby -v  
ruby 3.2.1 (2023-02-08 revision 31819e82c8) [x86_64-linux]
> head -1 /etc/*elease  
==> /etc/system-release <==
CentOS Linux release 7.9.2009 (Core)
```


## 解決策

    shell でTZをAsia/Tokyoとする．


# Time

irbで

```ruby
irb(main):005:0> require 'time'
=> true
irb(main):006:0> p Time.now
2023-03-30 03:11:20.468759837 +0000
=> 2023-03-30 03:11:20.468759837 +0000                                                           
irb(main):007:0> printenv TZ
(irb):7:in `<main>': uninitialized constant TZ (NameError)
        from /home/linuxbrew/.linuxbrew/Cellar/ruby/3.2.1/lib/ruby/gems/3.2.0/gems/irb-1.6.2/exe/irb:11:in `<top (required)>'
        from /home/linuxbrew/.linuxbrew/bin/irb:25:in `load'                                     
        from /home/linuxbrew/.linuxbrew/bin/irb:25:in `<main>'                                   
irb(main):008:0> p ENV['TZ']
nil
=> nil                                                                                           
irb(main):009:0> Time.now.zone
=> "UTC"
```

一方で，fish上だと，

```bash
> date
2023年  3月 30日 木曜日 12:16:54 JST
```

なんで，どっかで設定？


# fishでset

    echo $TZ

でnilなんで，

    set -Ux TZ JST

とするとirbで

```ruby
irb(main):004:0> p ENV['TZ']
"JST"
=> "JST"                                                              
irb(main):005:0> Time.now.zone
=> "JST"
irb(main):006:0> Time.now
=> 2023-03-30 03:32:14.575439993 +0000
```

なんですが，Ruby3.2リファレンスでは，

> 現在時刻の Time オブジェクトを生成して返します。タイムゾーンは地方時となります。

と明示されていますが．．．さて．


# timedatectlが怪しげ

```bash
bob@asura0 ~> timedatectl
Warning: Ignoring the TZ variable. Reading the system's time zone setting only.
      Local time: 木 2023-03-30 12:48:06 JST
  Universal time: 木 2023-03-30 03:48:06 UTC
        RTC time: 木 2023-03-30 12:48:10
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: no
 RTC in local TZ: yes
      DST active: n/a
```

としてみて，なんかJSTと打ってもダメなような気がしてきて．．．

```ruby
irb(main):001:0> require 'time'
=> true
irb(main):002:0> Time.now
=> 2023-03-30 03:58:11.813969695 +0000
irb(main):003:0> p ENV['TZ']
"JST"
=> "JST"                                                              
irb(main):004:0> p ENV['TZ'] = "Asia/Tokyo"
"Asia/Tokyo"
=> "Asia/Tokyo"                                                       
irb(main):005:0> Time.now
=> 2023-03-30 12:58:33.612487483 +0900
```

として無事行けました．


# 最終

なんで，fishの設定(~/.config/fish/config.fish内)を

    set -Ux TZ Asia/Tokyo

として

```ruby
irb(main):001:0> require 'time'
=> true
irb(main):002:0> Time.now
=> 2023-03-30 12:59:49.726413086 +0900
```

となります．やれやれ．

queueシステムの方は，もうすでに動いているRubyコードなんで変わりませんが，次回起動する計算から正常に出力されるはず．Rubyのversionをあげるまでは普通に動いていたので，多分，CentOSとの相性だと思いますが，Ruby3.2のバグなら影響大きいかも．


# 追記メモ

いくつかのサイトでTime.currentを使えというのがありますが，あれは，RailsのTimeWithZoneかなんかのoverwriteみたい(？)で，私の環境では使えませんでした．



------
 - **source** ~/git_hub/grad_research_23/qiita_items/ruby_time.org
次世代プロジェクト管理ツールの構想を練る（２）

https://qiita.com/EasyCording/items/369abc38000edc17fb5a

# 目指している方向性

* ツールを使いたいと思ってもらうこと
* ツールを使うことがＵＸとして刺激的であること
* 機能はRedmine以上でもなく、以下でもない

# アイデア

* 事前にBingチャットで構想はしてもらったので、今後は実際のコーディングに入る
* UX体験としては、VR-3Dまでの拡張は考えていない。VRコーグルなど使わない
* ただしタスクやプロジェクトが、等角投影図的な表示は採用する

# 使えそうなライブラリ

https://aframe.io/examples/showcase/sky/

https://github.com/axaq/traviso.js

https://elchininet.github.io/isometric/

https://github.com/jdhoek/inkscape-isometric-projection

# やや脱線話

　このツールは中学受験の子供たちにも使ってもらえるものを想定している。最近はマイクラなどが流行っているから、一瞬ゲーム？的なUXで導入し、最終的にはRedmineのようなプロジェクトツールに移行していく

　奥行き方向に情報を配置するような３Ｄ表示もある。
今回は目指しているのはあくまでも二次元に高さ情報を付け加えるだけ。

https://japan.cnet.com/article/20086353/

# 今後の進め方

* Redmineでの基本的な操作系を3Dオブジェクトの直感的操作で変更できるようにする
* 基本的にはAPI操作なので、REACTをベースにFRONTENDで解決していく
* 要件定義はCHATGPTを使い最短で構築する
初学者の時に躓いたこと -連想配列の中に入れた連想配列の値を取り出す(PHP)-

# 初めに

初投稿。

私は
・PHP使用歴 4年
・Python使用歴 約10ヶ月
の主にWEBアプリのバックエンド側の開発に携わっているエンジニアです。

今回は初学者だった頃の躓きから学んだことを記事にしてみました。
なお、この記事で使っているコードは初学者だった当時の記憶をベースに、この記事のために作成したPHPのコードとなります。
おきづきの点などありましたら、ご指摘いただけると助かります。


# 読者対象

プログラミングの学習を始めたばかりの初学者の方


# 躓いたシチュレーション
	
```php
$array_hoge = [
    'last_name' => '山田',
    'first_name' => '太郎'
];

$array_fuga = [
    'last_name' => '佐藤',
    'first_name' => '花子'
];

$array_piyo['teacher'] = $array_hoge;
$array_piyo['student'] = $array_fuga;
```
この状態から`$array_hoge`を使わず`$array_piyo`をつかって`山田`の値を取得したい

# `$array_piyo['teacher']['last_name']`で取得できるが・・・

当時の私は配列そのものをよく理解できていないところがあり、多次元配列など検索に必要なキーワードを思い浮かべることができていませんでした。
そのため、Google検索などを使って取得方法を調べたものの、一次元配列での値の取得方法までしか辿り着くことができませんでした。
（配列の種類のことはよく分からず、単に`$array_hoge`なら`$array_hoge['last_name']`で山田を取得できるぐらいの認識）

すでに知っていた知識だけで乗り切ろうと
```php
foreach($array_piyo as $key => $val){
    if($key == 'teacher'){
        print($val['last_name']) # ここで値を取得
    }
}
```
などで強引に取得したこともありましたが、コードが複雑になっていくとこのような強引な値の取り方では対処できない場面が出てきました。

# 考えられる方法を試してみた

###### `$array_hoge`なら`$array_hoge['last_name']`で山田が取得できる

この情報を頼りになんとか`$array_piyo`から直接値を取得できないか考えいろいろな方法を試してみました。

具体的には
 - `$array_piyo['teacher']$array_hoga['last_name']`

 - `$array_piyo['teacher'][$array_hoga['last_name']]`

とか試してたと思います。

上記はエラーになりましたが、何度か繰り返していく中で無事`$array_piyo['teacher']['last_name']`で値を取得できることに辿り着くことができました。

# 最後に
この経験を通して**考えられる方法を試してみる**ことの大切さに気づきました。
実際に試していく過程でエラーに何度も当たったことで、単に多次元配列の値の取り出し方を知るだけでなく、**配列とは何か**やそもそも配列を入れている**変数とはなにか**などの理解が深まっていったように思います。
全てを理解した上でコードが書けることが理想であるとは思いますが、理解してから書こうとすると全く手が動かせなくなってしまうということもあると思います。
そんな時はまず**考えられる方法を試してみる**を試してみていただきたいと思います。

### 補足
- 初学者の方の中には、エラーそのものが怖いと感じていらっしゃる方もいるのではないかと思います。
プログラミングの中では一度エラーが出ても、動く状態まで戻せることが大半です。
元に戻せない致命的なエラーがあるのは事実ですが、アプリのDB操作が絡まない部分を一部修正する程度では動く状態にできなくなることはそうそうないので、そういう部分から試していただければと思います。
（繰り返すうちに危険な操作がわかるようになってくると思います）


- この記事はなんとなく動けば良いを推奨しているものではありません。
動いた後は**なぜ動くようになったのか**考えていただければと思います。
[MySQL]GROUP BYを使ったレコードで値が特定の文字列を含むどうかを確認する

## やりたいこと
表題の通りですが、MySQLでGROUP BYを使ったレコードの中に値が特定の文字列を含むどうかを知りたいケースがあったので考えてみました。

## 方法
以下のようにMAX関数とCASE式を使います。
CASE式では特定の文字列（ここではstring）があれば1をなければ0を返します。
MAX関数では値の最大値を返すので、集計されるレコードの中にcolumn2の値がstringとなるレコードがあれば1。なければ0が返されることになります。
あとはWHERE等を使えば簡単に絞り込むことが可能です。

```
SELECT
  column1,
  MAX(CASE WHEN column2 = 'string' THEN 1 ELSE 0 END) AS has_string
FROM
  table_name
GROUP BY
  column1;
```
LaravelのLotteryヘルパで抽選しましょう！

# 概念

抽選・a/bテストなどの場合、パーセンテージで実行したいコードやユーザーフローが代わります。そのため、9.xで`Lottery`のヘルパが追加され、簡単にこのような機能を実装やテストができるようになりました。

# シナリオ

サービスで新しいキャンペーンがあり、抽選で5人の内一人にスーパー割引クーポンが当たるというシナリオを使います！

## シナリオを普通のphpで実装した場合

下記の`普通のphp`でシナリオを実装できる。結構シンプルで実装できますね！

```php
if (rand(1, 5) === 1) { // 当選する率（５人の内の一人）
    dd('おめでとう'); // 当選する処理
} else {
    dd('残念');　// 外れる処理
}
```

# Lotteryヘルパの使い方

Lotteryの`odds()`関数で当選する率を設定し、`winner()`「当選する」と`loser()`「外れる」のそれぞれの関数に実行したいコードをクロージャとして渡します。全体を実行するときには`choose()`「選択」の関数を実行する

```php
use Illuminate\Support\Lottery;

Lottery::odds(1, 5) // 当選する率（５人の内の一人）
    ->winner(function () {
        dd('おめでとう!'); // 当選する処理
    })
    ->loser(function () {
        dd('残念！'); // 外れる処理
    })
    ->choose(); // 抽選実行
```

上記の例はintegerで率(1/5)を渡していますが、float(.2)でも渡す可能です。

# 抽選のテスト

ここまで読んだ方の中に「この抽選機能は普通のphpで簡単に実装でき、本当にこのヘルパは必要ある」という疑問を持っている方はいると思います。その意見はわかります。しかし、テストで上記のシナリオを普通のphpで当たる・外れるのそれぞれのテストを実装するのは非常に難しいです。 Lotteryヘルパはテスト専用の関数もあり、抽選のそれぞれのパターンを簡単にテスできるようになり、それはLotteryヘルパの一番魅力的の点です。

## Lotteryヘルパのテスト仕方

Lotteryヘルパは`alwaysWin()`「常に当選する」と`alwaysLose()`「常に外れる」の関数もあり、テスト内でそれぞれのパターンを簡単に実装できます。

```php
//テスト内で
Lottery::alwaysWin(); // 常に当選する

// 実装
Lottery::odds(0) // 当選する率を０％にしても。。。
    ->winner(function () {
        dd('おめでとう!');
    })
    ->loser(function () {
        dd('残念！');
    })
    ->choose();

// おめでとう!
```

# まとめ

Lotteryヘルパで抽選のような機能の実装やテストが簡単にできるようになれ、これから使ってみましょう！

# 参考

[laravelのドックス](https://laravel.com/docs/9.x/helpers#lottery)
PythonでDIを実現する方法

```python
# pythonのinjectorを使用して、環境変数でインメモリデータベースへのアクセスとDynamoDBへのアクセスを切り替える
import abc
import os

import boto3
from injector import inject, Injector, Module, singleton


class Database(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def get(self, key):
        pass

    @abc.abstractmethod
    def set(self, key, value):
        pass


# テスト時のデータベース
class InMemoryDatabase(Database):
    def __init__(self):
        self.data = {}

    def get(self, key):
        return self.data.get(key)

    def set(self, key, value):
        self.data[key] = value


# 本番時のデータベース
class DynamoDB(Database):
    def __init__(self):
        session = boto3.Session(profile_name="")
        self.client = session.client("dynamodb")

    def get(self, key):
        response = self.client.get_item(
            TableName="dicontainer_test", Key={"pk": {"S": key}}
        )
        item = response.get("Item")
        return item

    def set(self, key, value):
        self.client.put_item(
            TableName="dicontainer_test",
            Item={"key": {"S": key}, "value": {"S": value}},
        )


# 依存の解決
class DataAccessModule(Module):
    def configure(self, binder):
        if os.environ.get("PRD"):
            binder.bind(Database, to=DynamoDB, scope=singleton)
        else:
            binder.bind(Database, to=InMemoryDatabase, scope=singleton)


# DBを使ったビジネスロジックを記載するクラス
# DataAccessModule.configureで取得した環境変数によってコンストラクタに渡されるdatabaseインスタンスが変わる
class Service:
    @inject
    def __init__(self, database: Database):
        self.database = database

    def get_item(self):
        return self.database.get("key1")


if __name__ == '__main__':
    # 依存関係の登録
    injector = Injector(modules=[DataAccessModule()])
    # injector.getの引数に依存注入が必要なクラスを指定
    service = injector.get(Service)
    items = service.get_item()
    print(items)
```
Rloginの設定めも

## 前提

- 外部へのssh接続を行う目的ではなく、Vagrantによる仮想環境で筆者がvimでの開発を行うための備忘録としての設定Tipsめも

## あいまい幅

- スクリーン > 制御コード > [x] `Aタイプ`を半角で表示

neovimなどでの、float windowのボーダーなど表示崩れの対策として設定

## 太字の表示

- スクリーン > 制御コード > [x] `太字でボールドを表示`

## クリップボード

- [x] クリップボード > `左クリックの範囲指定だけでクリップボードにコピーする`
- [x] クリップボード > `コピー時に範囲指定を解除しない`
- [x] クリップボード > `右クリックで貼り付け`
- [x] クリップボード > `複数行などで確認`

個人的に作業しやすい設定

## フォント

- フォント > HackGenNerd を使用

## SSHの接続高速化

https://ja.linux-console.net/?p=461#gsc.tab=0

- [x] サーバー > 通信共通 > TCP/IP > `IPv4のみ`

=> wsl2だとIPv6orIPv4にしておかないとlocalhostでのフォワーディングにてsshできなくなったので注意

そのほかにもLinux側にて下記も作業

- `/etc/ssh/sshd_config` の `UseDNS no`を適用

## SSHの転送高速化

https://developers.cyberagent.co.jp/blog/archives/37352/
https://kmiya-culti.github.io/RLogin/#SSHPROTOCOL

を参考に

- サーバー > プロトコル > 暗号方式 > arcfour 系を「出」「入」ともに上に移動

## 終わりに

少しでも作業を高速化・効率化できればと模索してます。

そのほか案・意見なども募集してます
WSLのcrash修復方法(2023/3/30)

## 事象
2023年3月30日にWSLが起動時にcrashするようになった。
```
Error: 0x80040326
Error code: Wsl/Service/0x80040326

[プロセスはコード 4294967295 (0xffffffff) で終了しました]
```

## 解決策
WindowsのコマンドプロンプトでWSLをupdateすると直るようです。

```
> wsl --update
```
なお、WSLは2023年3月23日にv1.1.6.0がリリースされています。

## 参照

https://stackoverflow.com/questions/75883240/ubuntu-crashes-on-windows-0x80040326-wsl-error

## 環境

- Windows 10 Enterprise

```
>wsl --list --verbose
  NAME            STATE           VERSION
  Ubuntu          Running         2
```
【要注意】出先での作業内容が完全消去されて復帰不能に陥るケース

## 発生した問題

1. 自宅で作業データをSSDに保存
2. VSCodeを開いた状態でPCをスリープ状態にしてSSDを抜く
3. 出先で続きの作業を行い、```git commit```に保存
4. 帰宅後に続きをしようとSSDを繋いでみるとデータが消失

## 原因
自宅でVSCodeを開いたままSSDを抜いたのが問題でした。
帰宅後にSSDを繋ぐと、VSCode上で作業状態が自動的に上書きされてしまった模様。
昔は「ハードウェアの安全な取り外し」が必須だったので、こういう事は起きなかったんですけどね、油断しました。

## 復旧を試したこと
### git reflog
→
.gitディレクトリ自体が上書きされているので、コミットログが残っていません。
またobjectsディレクトリも上書きされています。
ここからの復旧は不可能でした。

### 復旧ソフトを使う
→
データが残っていませんでした。
何らかの理由により削除されてしまったデータは、復旧が可能な場合があります。
しかし上書きであれば復旧はほぼ不可能だと思います。

## 対策
### SSDを外す際はVSCodeを落とす
SSDを抜く時は気をつけましょう。
### リモートにpushしておく
今回の件は、出先でpushしておけばおそあらく復旧できていたと思います。
### クラウドに保存する
SSDを使うと通信しなくても良いのが便利だったんですけどね。。。
### 外で作業しない（本質的ではないが）
そもそも外で仕事はしませんが、個人的な作業までNGとすると流石に不便です。
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

こんなんでた。
グーグル先生だといろいろ面倒なこと書いてる方々がいたけど、簡単に治ったのでメモ

docker compose start で起動すると

```
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```

Docker Desktopから起動しようとすると
```
Cannot start Docker Compose application. Reason: exit status 1
```

さて困った、グーグル先生に聞くと、なんとかのログ見ろだと、Demon起動し直せだの、Docker Desktop起動し直せだの。いろいろやってみたがダメで。結局のところ、以下の方法で簡単になおった

DockerDesktopの設定
```Enable integration with my default WSL distro にチェックを入れる```
```Ubuntu-20.04を ONにする```
それだけ。

![スクリーンショット 2023-03-30 105231.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378284/c003ec8b-cbcc-29ad-42c8-4589ae46aa28.jpeg)


何も設定を変更した覚え無いのになぜか設定が変わってた。
送信変更セット


同じ送信変更セットを続けてアップロードしたらエラーになった。

:::note alert
An internal server error has occurred
An error has occurred while processing your request. The salesforce.com support team has been notified of the problem. If you believe you have additional information that may be of help in reproducing or correcting the error, please contact Salesforce Support. Please indicate the URL of the page you were requesting, any error id shown on this page as well as any other related information. We apologize for the inconvenience.

Thank you again for your patience and assistance. And thanks for using salesforce.com!

Error ID: 1212068288-293 (741229260)
:::


# レポートのフォルダー

+ [レポートを追加したいのですが、変更コンポーネントに表示するものとしないものがあります。どちらも公開フォルダにあるのですが、なぜ一部のレポートが表示されないのか原因不明です。](https://trailhead.salesforce.com/trailblazer-community/feed/0D53A00004eyqBN)

:::note
変更送信セットのレポート追加は

フォルダ「非公開レポート」「未整理公開レポート」の他に「公開レポート」フォルダに格納されているレポートも送信変更セットのレポートには表示されないようです。

→対策：カスタムフォルダに移動すると表示されます。
:::
IntelliJ系のIDEでRustをちゃんと使えるようにする方法

Rustプログラミング言語を使用する際に、IntelliJ IDEA、PyCharm、WebStormなどのIntelliJ系のIDEを使用することができます。しかし、Rustプラグインを単にインストールするだけでは、VS Codeのrust-analyzerプラグインなどと比べてマクロの補完が機能しないなどの問題があります。この記事では、IntelliJ系のIDEでRustを効果的に使う方法について説明します。

## Rustプラグインをインストールする

まず、Rustプラグインをインストールします。IntelliJ IDEA、PyCharm、WebStormなどのIDEで簡単に行うことができます。IDEを開いて、メニューバーから「Preferences」を選択し、「Plugins」をクリックします。検索ボックスに「Rust」と入力し、プラグインを見つけてインストールします。プラグインをインストールした後は、IDEを再起動する必要があります。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/bec1d74e-9d5c-1073-85f2-67b9f70dee9f.png)

## Rustプラグインの全機能を開放する

次に、Experimental featureでorg.rustで始まるもの全てにチェックを入れる必要があります。これは、IntelliJ系のIDEでRustを完全に使うために必要な設定です。IntelliJ IDEAの場合、メニューバーから「Help」をクリックし、「Find Action」を選択して、ポップアップウィンドウに「Experimental Features」と入力します。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/49d5abf0-eb70-6817-6794-da6cf7f82635.png)

そして、org.rustで始まる項目にチェックを入れて、変更を保存します。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/ef91cb86-f759-d871-e11d-d4fa3cfa28cc.png)

以上が、IntelliJ系のIDEでRustを効果的に使う方法です。これにより、IDEでRustを使う際の問題が解決され、マクロの補完などの機能が完全に機能するようになります。是非、試してみてください。

## 謝辞

@reoringさんの貴重なアドバイスと指導のおかげで、IntelliJ系のIDEでRustを効果的に使用する方法を学ぶことができました。この記事を書くことができたのも、@reoringさんのサポートがあったからです。このような情報を提供してくださった@reoringさんに、心から感謝いたします。
エンジニアのためのマネジメント入門

# はじめに
エンジニアのためのマネジメント入門という書籍を読んだので
学んだことをまとめてみました。

今後も、適宜更新していきます。

# リーダーとマネージャーの違い
リーダーとマネージャーは役割が異なる。
以下に表形式でまとめる。

|観点|リーダー|マネージャー|
|------|------|------|
|役割|目標達成のため人を先導する|組織に関わる物事をマネジメントする|
|主な対象|チーム|組織全体|
|人を|統率する|配置する|
|経営・現場|現場|経営|
|管理人数|少人数|多人数|

この他にチームや組織を構成する経営陣やメンバー、社内外の人物とのコミュニケーションスキルや
専門的な知識に関するスキル、判断力などは共通して必要とされる。

エンジニアリングマネージャー職では、以下のように管理対象が分かれたりする。

|名称|役割|
|------|------|
|ピープルマネジメント|教育、採用、モチベーション管理などの人材に関連する管理を行う|
|プロジェクトマネジメント|プロジェクト達成のためにスケジュールやコスト、リソースなどを統合的に管理する|
|プロダクトマネジメント|開発からマーケティング、サポートといったプロダクトのライフサイクル全般を管理する|
|テクノロジーマネジメント|技術的な設計や最適化などテクノロジーに関連する事象を管理する|

# コミュニケーション技法
## 言語/非言語コミュニケーション
* 種類
    * バーバル(言語)コミュニケーション
    会話で行うコミュニケーションやメールなどの文章で行う
    * ノンバーバル(非言語)コミュニケーション
    言語以外（表情・声・仕草など）を通じて行う

* 優先度
【**ノンバーバル(非言語)＞バーバル(言語)**】となる
（例：不満そうな顔で感謝を伝えても、不満そうな印象を抱きやすい）

## ティーチング/コーチング
* 種類
    * ティーチング
    教えたり、指示したりすることで、相手のできなかったことをできるようにする
    * コーチング
    適切に問いかけを行うことで自分自身での気づきを促す

## 傾聴
カウンセリングなどの場面において、傾聴技法が複数存在する。

|技法|概要|効果|
|---|---|---|
|開かれた質問|5W1Hを問う質問や、深掘りを行う|クライアントが自分から話すことを促し、自己探究を助ける|
|閉ざされた質問|Yes/Noの質問|事実を明確にする|
|クライアント観察技法|クライアントの言語以外（表情、仕草など）の情報を観察する|クライアントの感情や本心を分析する|
|はげまし技法|「うん」「それで？」等の会話を進めるもの、頷きなどの非言語によるものがある|自分の気持ちや考えを出すことに対して励まされる|
|言い換え技法|話の本質をフィードバックする|クライアントの状況・気持ち・考えを明らかにする|
|要約|対話の最初に前回の内容を振り返り、最後に今回の内容を振り返る|クライアントの状況・気持ち・考えを明らかにする|
|感情の反映|言語化されない感情を観察し、フィードバックする|クライアント本人が気づかない感情に気づいてもらう|

# チーム

## フェーズ
チームにはフェーズがあり、時間と共に変化する（タックマンモデル）

1. 形成期
メンバーを知らず、目的もわからない手探りの時期
2. 混乱期
目的や役割などの意見を発して対立が起こる
3. 統一期
規範が確立し、個々の考え方を受け入れ始め、チームの関係が安定する
4. 機能期
結束力と一体感が生まれ、チームの力がより高まる
5. 散会期
チームメンバーの離脱などによってチーム活動が終了する

## リーダシップスタイル
リーダシップスタイルにも種類があり、状況に応じて使い分けられると良い

1. 強圧型
    * 明確に指示してチームをコントロールする。
    * 緊急時や組織の再編時などの状況を一刻も早く変えたい時や、古い習慣を変えたい時、早急に決めたい時に適している。
    * 常に使うとチームが指示待ちとなったり、責任感がなくなったりする影響がある。

2. 権威主義型
    * 理想となる姿を描き、方向性を明確にして、信念と熱意で周囲を動かす。
    * 様々なシーンで有用であるが、チームが目標を失った際に特に有効。
    * チームメンバーがリーダーより経験が豊かな場合は、理想の押し付けになる可能性がある。

3. 親和型
    * メンバーと同じ目線から信頼関係を構築する。
    * チームに着任時や意思疎通の改善、信頼関係の構築時に有効となる。
    * 多用しすぎるとリーダーではなく、ただの良い人となる。

4. 民主主義型
    * チームの意思決定にチームメンバーの意見を反映する。
    * チームメンバーの意見を重視して決定するため、自分の意見を発したメンバーに責任感が増し、目標に対してコミットメントできるようになる。
    * 意見交換が長引くと意思決定のスピードが落ちるため、急ぎの場面には適さない。リーダーの意思決定力が低下する。

5. 先導型
    * リーダー自身がレベルの高い手本を示し、チームに同様の成果を期待する。
    * 成果を満たさないメンバーには改善を促したり、メンバー交代、あるいは業務を引き取るなどを行う。業務の達成に有効となる。
    * 多用するとリーダーがいないと何もできないチームとなる。

6. コーチ型
    * コーチの役割を担い、成長を促しながら中長期の視点で成功を目指す。
    * チームメンバーが失敗しそうでも見守り、対話やフィードバックを行いながら自身での気づかせる。
    * 短期的に結果が求められる場面には適さず、コーチを求めないチームメンバーには効果が低い。また、リーダーの高いコーチングスキルが必要。

# 最後に
「エンジニアのためのマネジメント入門」を読んで気になった内容をまとめてみました。
読みやすかったので気軽に読み進められました。
今後のキャリア等を考える際に参考になりそうです。


# 告知
最後にお知らせとなりますが、イーディーエーでは一緒に働くエンジニアを募集しております。
詳しくは採用情報ページをご確認ください。
https://eda-inc.jp/recruit/
みなさまからのご応募をお待ちしております。
【独学メモ】-Laravelのインストール 初期設定-

# 前書き
この記事は自分のための学習アウトプットメモです。
職場でphpを利用してシステムを運用しているので、ある程度の知識を得ておきたいと思い学習を開始しているだけなので、どうぞ暖かく見守ってくれたら嬉しいです。

# laravelの導入
前々からやろうと思っていたphpのフレームワーク、laravelの導入と学習をしていきたいと思ってます。
今回は、laravelのインストール〜初期設定までをまとめる自分用のメモでございまする。

## laravelってなんぞ
phpのフレームワーク。
rubyにとっての ruby on Rails。
javaにとっての　Spring Framework。
そんな感じのMVCモデルに基づいたフレームワーク。

## laravel使うには？
phpとcomposerをインストールしている前提でないとダメ。

## インストール方法
MANP配下にあるhtdocsの中にlaravelのディレクトリを作成。
その中で、laravelをインストールすると管理しやすそう。
ターミナルを起動して、まずはhtdocsへ移動後、laravelディレクトリを作成。の中に移動する。
```
cd Applications/MAMP/htdocs
mkdir laravel
cd laravel
```

次はlaravelのインストール

```
## laravelのインストール
$composer create-project laravel/laravel --prefer-dist {プロジェクト名（指定した文字列がそのままディレクトリ名になる)}
```
:::note info
オプショの`--perfer-dist`について
この正体ってなんぞ？と思って調べてみた。
どうやら、圧縮したファイルを最初に落としてきて、落とした後解凍→実行。とするコマンドらしい。

他にも`--prefer-souce` というオプションがあるようで、これはオプションを指定せずに実行した時のデフォルト設定とのこと。
で、こっちは何をしてるのか。というと、git cloneでソースをそのままダウンロードしているとのこと。

なので、圧縮ファイルを落としてきてから実行する`--perfer-dist`の方が幾分処理は早いらしい。
:::

## インストール後の初期設定
インストールした後は使い勝手がいいように設定をする。
例えば
* タイムゾーンの変更
* 日本語化

### タイムゾーンの変更
国際基準になっているタイムゾーンを日本基準に変更する。
laravelインストール時に作成したプロジェクトのディレクトリに移動して`.config/app.php`を開く（VisualStudioCodeとかのエディタで開くの推奨）

```
# ターミナルから開くなら・・・多分これでいける
open {プロジェクト名}/config/app.php
```

→の記述があるので、`'timezone' => 'UTC',`
→こうする。`'timezone' => 'Asia/Tokyo'`,

### 日本語化
同じく`config/app.php`の中に↓の記述があるので
`'locale' => 'en',`
→にする`'locale' => 'en',`

## さぁ、laravelを起動じゃ。
サーバーを起動する+止める作業。
これができなきゃ始まらないぜ。

手順
1.ターミナルで、プロジェクトのディレクトリ配下に移動する
2.サーバー起動のコマンドを実行する
3.ブラウザで確認してみる
4.サーバーを止める


### 1\.ターミナルでプロジェクト配下に移動する
1.ターミナル起動（command + space　で検索フォームを表示。そこに「ターミナル」と打てばターミナルをすぐ起動できる）
2.cd　コマンドでプロジェクトのディレクトリまで移動する
```
cd Applications/MANP/htdocs/{作ったプロジェクト名}
```
3.最後に意図してないディレクトリに移動していないか`pwd`コマンドを打って現在地を確認。問題なければNEXT STEP。

### 2\.サーバー起動のコマンドを実行する
ターミナル上で、以下を実行
```
php artisan serve
```
そうすると、`Server running on {http://~~~~}`って表示が出る。
この{http://~~~~}をコピーしましょう。

### 3\.ブラウザで確認してみる。
なんでもいいからブラウザを起動して、URLバーにコピーした{http://~~~~}を貼り付けましょう。
下みたいな画面が表示されれば、サーバーが動いている証拠。
![スクリーンショット 2023-03-30 9.29.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593458/1a2b0f01-414f-06f1-01a6-9e68ad6f9225.png)

:::note info
この画面の右下にLaravelのバージョンとPHPのバージョンが表示されているので、そこで意図したバージョンで利用できているか確認しておくといいかも
:::

### 4\.サーバーを止める
#### case1.ターミナルを開きっぱなしだった場合
ターミナルをアクティブ状態（選択している状態）で`control + C`。それだけじゃ。

#### case2.やべ、ターミナル閉じちゃった。終了できねぇ。
1.新たにターミナルを開く。
2.`ps`コマンドを実行して、現在実行中のプロセスを確認する。
3.一覧の中に`php artisan serve`がいるはず（いなければおそらくもうサーバー止まっている）なので、その行の一番左に表示された数字（PID列）をコピーする
（下の画像でいうと、`57085`が該当）
![スクリーンショット 2023-03-30 9.32.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593458/b3b209db-8b17-9ba0-6d26-0dbb849e979d.png)

:::note info
現時点で動作（起動）中のプロセスの一覧を表示するコマンド。
プロセスは、OSからメモリ領域などの割り当てを受けて処理を実行しているプログラムのこと。
テーブル（メモリ)のこのエリアを使ってこの作業（プログラムの処理）をしてね。といったイメージ。
なので、psで表示されるプロセスは、PCというテーブルの上で今作業中の出来事が一覧で表示される。って感じ。
:::

4.ﾌﾞｯｺﾛ！キルコマンドでプロセスを終了する
以下のコマンドを実行する
```
kill {コピーしたPIDの数字}
```
実行後に、もう一度psコマンドを実行して、現在動いているプロセスを確認して、一覧に`php artisan serve`がいなければ無事に成功しているはず。
-3- Unityroomに初めてゲームを投稿した。

# 　Unityroomへの投稿

遂に自分の1作目のゲームが完成し、皆にお披露目をしたかったので、**Unityroom**というUnityで作ったゲームを簡単に投稿して遊べるサイトに自分も投稿させていただきました。

将来的に*1* *week* *game* *jam*への参加も考えているので、その予行練習といった感じでチャレンジしてみました。
チャレンジというほど難しいことではなかったですが、そういう行動が大切だと思い実行しました。

## 　初めてコメントを頂いた。

Twitterでも投稿報告させて頂いたのですが、そのツイートに感想コメントをリプライしてくれた方がいて。
**コメントを頂くことが初めて**だったので**とても嬉しかった**です。

これが**ゲーム開発を行う一番の喜び**なんだと思いました。もっともっとゲームを作っていきたいという**モチベーションが高まり**、さらにたくさんのコメントを頂けるように**頑張ろう**！と思いました。

#### 下記に私の投稿したゲームのリンクを載せましたので、是非皆さんもプレイしてみてください！！

https://unityroom.com/games/hirogames66
Maltego Transform 開発メモ addOverlay OverlayType.IMAGE編

アイコンの画像をOverlayに表示させることができる。
アイコン一覧は`Entity`タブの`Manage Icons`から参照できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325297/9fc4fa4b-957e-d12a-00f3-0f15f3182ef4.png)

```python
output_entity.addOverlay("Alarm", OverlayPosition.NORTH_WEST, OverlayType.IMAGE)
output_entity.addOverlay("Clock", OverlayPosition.NORTH, OverlayType.IMAGE)
output_entity.addOverlay("GangBoss", OverlayPosition.WEST, OverlayType.IMAGE)
output_entity.addOverlay("JP", OverlayPosition.SOUTH_WEST, OverlayType.IMAGE)
output_entity.addOverlay("Explosion", OverlayPosition.SOUTH, OverlayType.IMAGE)
```
# 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325297/11cad46a-893a-d86b-1bdf-6751c30104c2.png)
* オーバーレイのサイズは小さいの視認性があまりよくない
* アイコンの名前はAlias（短縮名）でも指定することができる。`Japan`⇒`JP`
Maltego Transform 開発メモ addOverlay OverlayType.TEXT編

```python
output_entity.addOverlay("NORTH_WEST", OverlayPosition.NORTH_WEST, OverlayType.TEXT)
output_entity.addOverlay("NORTH", OverlayPosition.NORTH, OverlayType.TEXT)
output_entity.addOverlay("WEST", OverlayPosition.WEST, OverlayType.TEXT)
output_entity.addOverlay("SOUTH_WEST", OverlayPosition.SOUTH_WEST, OverlayType.TEXT)
output_entity.addOverlay("SOUTH", OverlayPosition.SOUTH, OverlayType.TEXT)
```
# 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325297/71f90c08-bcc9-a9a5-6c6c-4e6adfa401ef.png)
* SOUTHは表示されない！
Maltego Transform 開発メモ addOverlay OverlayType.COLOUR編

```python
output_entity.addOverlay("#ff0000", OverlayPosition.NORTH_WEST, OverlayType.COLOUR)
output_entity.addOverlay("#00ff00", OverlayPosition.NORTH, OverlayType.COLOUR)
output_entity.addOverlay("#00ffff", OverlayPosition.WEST, OverlayType.COLOUR)
output_entity.addOverlay("#ff00ff", OverlayPosition.SOUTH_WEST, OverlayType.COLOUR)
output_entity.addOverlay("#ffff00", OverlayPosition.SOUTH, OverlayType.COLOUR)
```
# 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325297/13fadbb0-c401-7dba-7b3c-6e2c8bb5f506.png)

* EAST (右側）は一切指定できない
Tableau CRM　での数式のサンプル


# 結果をリストで返す

+ [Suggestion required in case statement in dataflow...](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Jgg1gSAB)

```
case when 'MonthName__c' == "February" then "January"  when 'MonthName__c' == "March" then ["February","January"]  end
```

+ [Limitations of Multivalue Fields in CRM Analytics](https://help.salesforce.com/s/articleView?id=000383895&type=1)
+ [Data Manipulation Functions](https://developer.salesforce.com/docs/analytics/bi-dev-guide-bindings/guide/bi-dashboard-bindings-functions-wave-designer-data-manipulation.html#toarray-function)
おすすめのツール chatgptを含む


特定のWebページを学習してチャットボット作れる『ChatShape』が便利

https://chrome.google.com/webstore/detail/chatshape/opajaegbijgkjbfjcfoccdnlmijmfgoi


言語と画像を使用して、動画から新しい動画を生成できるAIモデル「Gen-1」が誰でも利用可能に
runwayml.com

youtube summary with chat gpt

https://chrome.google.com/webstore/detail/youtube-summary-with-chat/nmmicjeknamkfloonkhhcjmomieiodli
RubyでAtCoder ABC294(A, B, C, D)を解いてみた

# はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC294のA, B, C, Dを解きました。備忘録として解き方をまとめていきたいと思います。

# A - Filter
https://atcoder.jp/contests/abc294/tasks/abc294_a
```diff_ruby:a-294.rb
- n = gets.to_i
+ n = gets
a = gets.split.map(&:to_i)
ans = a.select{ |i| i.even?}
puts ans.join(" ")
```
## 解説
selectメソッドを使って偶数である要素を取得することができます。

メモ
・[Array#select](https://docs.ruby-lang.org/ja/latest/method/Array/i/filter.html)：Array.select{|要素| 条件}の形で使い、条件が真である要素をすべて含む配列を返す。

# B - ASCII Art
https://atcoder.jp/contests/abc294/tasks/abc294_b
```ruby:b-294.rb
# 修正前
h, w = gets.split.map(&:to_i)
arr = ("A".."Z").to_a
h.times do
    a = gets.split.map(&:to_i)
    s = ""
    a.each do|i|
        if i == 0
            s += "."
        else
            s += arr[i - 1]
        end
    end
    puts s
end
```
```ruby:b-294.rb
# 修正後
h, w = gets.split.map(&:to_i)
arr = [".", *"A".."Z"]
h.times do
    a = gets.split.map(&:to_i)
    s = a.map{ |i| arr[i]}
    puts s.join
end
```
<追記>
コメントでいただいた別解になります。こちらは、ASCIIコードにおいて、Aが65に、Bが66に、（以下同様）対応していることを利用しています。
```ruby:別解
h, _ = gets.split.map(&:to_i)
as = Array.new(h) { gets.split.map(&:to_i) }

puts as.map {|row|
  row.map { |n| n.zero? ? "." : (n + 64).chr }.join
}
```
## 解説
まず、ピリオドとアルファベットをarr配列にもたせます。そして、インデックスがaの要素と等しいarrの要素を保持した配列を空白区切りで出力すればOKです。

メモ
・なぜ[*"A".."Z"]でアルファベットの配列を作れるのか
Splat展開：to_aを経由して展開されるため配列で返ってくる。（C言語のポインターみたいにアドレスを保持してそこから参照している？）

・文字列連結で次々に結合させていくのが良くない理由
`str = str + char`のように文字列を結合していくと、新たなStringオブジェクトが生成され元のStringオブジェクトは残ってしまうらしい（ガーベジ）。このガーベジはRubyの処理系が自動で消去してくれる（ガーベジコレクション、GC）がその処理がプログラムのノイズになり得るため。

# C - Merge Sequences
https://atcoder.jp/contests/abc294/tasks/abc294_c
```ruby:c-294.rb
n, m = gets.split(" ")
a = gets.split.map(&:to_i)
b = gets.split.map(&:to_i)
c = (a + b).sort

hash = {}
c.each_with_index do|i, j|
    hash[i] = j + 1
end

aa = a.map{|i| hash[i]}
puts aa.join(" ")

bb = b.map{|i| hash[i]}
puts bb.join(" ")
```
## 解説
方針として、N, MがN, M <= 10^5と大きく愚直に何番目かを求めようとするとTLEするので一重ループで実装していくことを考えます。
まず、問題文通りにcを作り、連想配列hashにその要素がcでは何番目かをもたせます。そして、a, bそれぞれの要素に対して対応するvalueを返せば答えが求まります。

# D - Bank
https://atcoder.jp/contests/abc294/tasks/abc294_d
```ruby:d-294.rb
n, q = gets.split.map(&:to_i)
hash = {}
call = 1
q.times do
    t, x = gets.split.map(&:to_i)
    case t
    when 1
        hash[call] = true
        call += 1
    when 2
        hash.delete(x)
    when 3
        puts hash.key(true)
    end
end
```
## 解説
C問題と同様、QがQ <= 5×10^5と大きいため一重ループで実装していくことを考えます。
初期設定として何番の人が呼ばれたかを記録する連想配列hashと次に呼ばれる人の変数callを用意しておきます。なお、最初に呼ばれるのは１番の人なのでcallの初期値は１としています。
1. t=1の場合
番号がcallの人が呼ばれるのでhash[call]=trueとします。また、次に呼ばれるのは番号が１つ大きい人なのでcallの値をインクリメントしておきます。
2. t=2の場合
呼ばれた人をhashから削除します。
3. t=3の場合
最も番号が小さい人が呼ばれるのでtrueをvalueにもつkeyを出力します（左から探してくれるのでこのままいけます）。

# 終わりに
今回の問題は、D問題が比較的簡単でした。たまにこういうことがあるのでD問題だからと捨てずに少し挑戦してみるのもレーティングを上げる戦略としてはありだと思います！

https://qiita.com/shoya15/items/50fd17e37d7c64f2b166

# 参考
・[メソッド呼び出し(super・ブロック付き・yield)](https://docs.ruby-lang.org/ja/latest/doc/spec=2fcall.html)
・[Rubyのsplat展開について](https://qiita.com/wasu/items/7aeb6d32fcf51cf04a57)
・[【Ruby のまずいコード】文字列連結](https://qiita.com/scivola/items/8d6ab12eab7f55140579)
event.targetを使った簡単な例


# ファイルツリー全体にonclick属性を付加する。ツリーの中のどの要素がクリックをされたのかを特定する方法の下調べ

# 結論
event.targetを使えば簡単に書ける。
ファイルツリーにはフォルダとファイルがある。
それぞれに、クラス名（class="folder"、class="file"）を付加する。
onclickが発生すると、要素を特定する。
要素のクラスを見て、処理を変える。
ファイル（class="file"）の場合は、テキストを取り出してmainに表示する。
フォルダ（class="folder"）の場合は、表示をtoggleする。

displayのプロパティnoneと、blockをtoggleする。

# targetの使い方の例

```HTML
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Simple Block Element with OnClick</title>
  <script>
    function handleDivClick(event) {
      const target = event.target;

      if (target.tagName === 'BUTTON') {
        alert(`You clicked on: ${target.textContent}`);
      }
    }
  </script>
</head>
<body>
  <div id="container" onclick="handleDivClick(event)" style="border: 1px solid black; padding: 20px;">
    <button id="button1">Button 1</button>
    <button id="button2">Button 2</button>
  </div>
</body>
</html>
```
AndroidStudioでFloatingActionButtonを使う

# はじめに

今回はAndroidアプリでFloatingActionButtonを使う方法をまとめます。
(アプリでよくある丸いボタン)
自分でやった際に少しめんどくさかったので、次使うときのために残しておきます。

### 実行環境
- AndroidStudio ver2022-1

### 対象の人
- AndroidStudioインストール済
- AndroidStudio少しだけは触ったことあるよって人

# アプリ作成
プロジェクトの作成は割愛します。

右クリックからNew→VictorAssetsを選択
AssetStudioのウィンドウが出るので、ClipArtをクリックします。
![スクリーンショット 2023-03-25 13.08.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725079/b06ee3b1-fffa-f157-26bb-c4e5afd950aa.png)

SelectIconのウィンドウが出るので、検索欄にaddと入力します。
一番左上にプラスマークが出てくるので、そちらを選択します。
![スクリーンショット 2023-03-25 13.07.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725079/9628d78d-071b-99c3-abad-23daecc3dd9b.png)

レイアウトファイルを開いて、検索欄に`fab`と入力するとFloatingActionButtonが出てくるのでそちらを画面のほうにドラッグ&ドロップします。
![スクリーンショット 2023-03-25 13.10.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725079/a74bbe4e-b470-bd19-8364-a139971cf55c.png)

先ほど作成したボタンを選択します。
![スクリーンショット 2023-03-25 13.11.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725079/f48e4a99-958c-17e8-5581-21467db5e1e0.png)

今回は右下に設置したいので、画面右下に合わせ、marginEndとmarginBottomを24dpで設定します。
![スクリーンショット 2023-03-29 20.32.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725079/aff4fca0-58df-5930-5330-a8f2f61fce4a.png)

これでとりあえず設置は完了しました。
あとは`ClickListener`とかを設定すれば使えますね！
参考コードはこんな感じです。

```java:MainActivity.java
    
    FloatingActionButton fab;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        fab = findViewById(R.id.floatingActionButton);

        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "fabが押されました", Toast.LENGTH_SHORT).show();
            }
        });
    }
```

これでボタンクリックするとトースト表示されるはずです！


今回はconstraintlayoutでやったのですが、LinearLayoutとかで他の要素と重ねたりするともう少しめんどくさかったので、今度また記事にしていこうと思います。
セールスフォースアンケートの配信数

[Salesforceのアンケートに戻る](https://qiita.com/Keiji_otsubo/items/ce153ec9d338d7af0d81)


+ [セールスフォースアンケートの配信数](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000OrhFI)

ライセンスが無料の範囲では300までしか扱えないようです。回答を受けることに制限がありみたいですね。

Each Salesforce organization includes platform or basic Salesforce Survey features with a maximum of 300 free responses.

[Salesforce Survey Considerations](https://help.salesforce.com/s/articleView?id=000391879&type=1)

有償のライセンスだと以下のようになっています。

+ Survey Response Pack　1 パックにつき 1,000 件
+ Feedback Management - Starter　100,000 件の応答。応答パックを追加すると、より多くの回答を取得できます。
+ Feedback Management - Growth　制限なし

[各ライセンスのサポートされている機能の比較](https://help.salesforce.com/s/articleView?id=sf.concept_add_on_license.htm&type=5)


------

以下を読むと組織ごとに300回とあって、期間でリセットのような概念はないみたいですね。

https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000A996GSAR

https://trailhead.salesforce.com/ja/trailblazer-community/topics/freesurveyresponse?sort=LAST_MODIFIED_DATE_DESC


ただ、この回答を読むと消せばまた300回まで使えるようなことが言われていますが、他には記載はないですね。

Is it possible to receive more survey responses without purchasing.
 means Can we delete this received 300 survey and again we can start receiving. 

https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000A95BbSAJ

# appexchangeでもこの制限は引き継がれる

+ [Is Employee Pulse App subject to "Maximum survey responses allowed for an org" limits](https://trailhead.salesforce.com/trailblazer-community/feed/0D54V00007ajaAW)

:::note
Yes as this uses Salesforce Surveys those limits would still apply 
:::
【数式】military format (0 to 23) for the hours


+ [Sorting CreatedDate field by hour](https://trailhead.salesforce.com/trailblazer-community/feed/0D54S00000Jgfw9)

以下は夏時間を考慮している

```
IF( OR(
CREATED_DATE<= DATETIMEVALUE(DATE(YEAR(DATEVALUE(CREATED_DATE)),3,14)
-(WEEKDAY(DATE(YEAR(DATEVALUE(CREATED_DATE)),3,14))-1))+7/24, /*If the date/time is before the second Sunday in March (end of wintertime)*/
CREATED_DATE>= DATETIMEVALUE(DATE(YEAR(DATEVALUE(CREATED_DATE)),11,7)
-(WEEKDAY(DATE(YEAR(DATEVALUE(CREATED_DATE)),11,7))-1))+7/24 /*Or if the date/time is after the first Sunday in November (start of wintertime)*/
),

HOUR(TIMEVALUE(CREATED_DATE-5/24))
-IF(HOUR(TIMEVALUE(CREATED_DATE-5/24))>23,24,0) /*return the hour in military format and offset it by 5 hours for wintertime*/
,
HOUR(TIMEVALUE(CREATED_DATE-4/24))
-IF(HOUR(TIMEVALUE(CREATED_DATE-4/24))>23,24,0)) /*return the hour in military format and offset it by 4 hours for summertime*/
```
Unity Riderを使って過去commit箇所に戻す Checkout Revisionを使う

# 概要
今回はRiderを使って過去のcommit時に戻る方法を投稿します。
具体的に行うこととしては、以下画像のようなことを行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/fb8c0395-41b6-fa1a-44be-92505d6e417d.png)

１．過去のcommit分に移動する
２．最新のコミット分に移動する


試した感想としては容易にできました。
JetBrain社のIDEはgitの機能がGUI化されており、とても使い勝手が良いです。
デフォルトIDEのVisualStudioでこの操作を使う場合　別のGitクライアントソフト(例えばSourceTree)が必要であり、IDE一つで済むRiderは良いです。

欠点としてはRiderは有料のIDEで月額2000円ほどかかることです。


# 開発環境

IDE:Rider
Unity:2020.3.42(LTS)
OS:Windows10

# 手順

## １．過去のcommit分に移動する
### Riderで過去のcommitに移動する
戻りたいコミット箇所を右クリックして「Checkout Revision」を左クリックする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/7c10a071-d64f-01e4-8e6b-e5d917aac415.png)


過去のコミット分にHEADが移動していることを確認します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/42f52fb5-f349-5c97-d102-ea395c78ab45.png)




### UnityEdtiorで再表示
Unity Editorのウィンドウに切り替えると、ダイアログが現れ再ロードを選択します。
選択後、読み込み時間が発生しUnityEditorに反映されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/b4a95be1-200e-86b6-b4fa-3e04bfcc7354.png)


完了



## ２．最新のコミット分に移動する
１．の操作から過去のcommit分になっているので、元に戻します。
### 最新のコミット分に戻す
最新のコミット分を右クリックしてCheckout→ブランチを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/af0fc2ec-20d8-e8a9-1dba-de653a767662.png)

最新のcommit分に戻っていることを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/d2117055-96ba-11b5-628c-421d8c4214aa.png)



### UnityEdtiorで再表示
Unity Editorのウィンドウに切り替えると、ダイアログが現れ再ロードを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/65066cc1-50e8-3347-8487-09fcec3e583d.png)

これで元の状態に戻りました。


# 参考

gitのHEADについて


https://qiita.com/ymzkjpx/items/00ff664da60c37458aaa
Googleデジタルマーケティング＆Eコマース：顧客ロイヤリティを構築する

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/05f6fefc-adb6-1242-4eb1-528a10511727.png" width="800">

# 信頼を築く方法

ロイヤルティはマーケティングファネルの最終段階です。ロイヤルティは、顧客がリピーターとなり、ブランドの支持者となるところです。ロイヤルティは、顧客が企業に寄せる信頼に基づいています。そのビジネスにコミュニティやつながりを感じることができれば、ロイヤリティはさらに強くなります。

- ***<font color="MediumBlue">顧客のニーズを満たす高品質の製品</font>***
- ***<font color="MediumBlue">手厚い返品保証</font>***
- ***<font color="MediumBlue">送料無料・返品手数料無料</font>***
- ***<font color="MediumBlue">質の高いカスタマーサービス</font>***
- ***<font color="MediumBlue">お客様の個人情報や金銭的な情報を保護</font>***
    - お客様は、貴社がお客様の情報を機密扱いし、安全に保管することを知る必要があります。これは、チェックアウトページにトラストバッジやシールを追加したり、電子メールアドレスが他の企業と共有されないことをお客様に保証したりすることを意味します。

なぜこれが重要なのでしょうか？

お客様がビジネスを信頼すると、ロイヤルカスタマーになる可能性が高くなります。忠実な顧客は、強力なブランドの基礎となるのです。

# 一体感を構築する方法

- ***<font color="MediumBlue">ソーシャルメディア上で顧客と関わる。</font>***
- ***<font color="MediumBlue">ユーザー生成コンテンツを通じて、お客様が自分の経験を他のお客様と共有する。</font>***
    - 例えば、お客様が商品レビューを書いたり、写真やビデオをアップロードしたり、商品ページの質問コーナーに参加したり、フォーラムに参加したりすることが考えられます。
- ***<font color="MediumBlue">ブランドの背景にあるストーリーを共有し、自社の価値観と顧客の価値観がどのように一致しているかを示すことで、コミュニティ意識を醸成することもできます。</font>*** 調査によると、77％の消費者が、自分と同じ価値観を持つブランドから購入しています。お客さまは、気持ちよく買い物をしたいのです。
    - 例えば、アウトドアへの情熱や環境への配慮、美に対する社会の認識を変えるための提唱など、お客さまの価値観とつながることができます。
- ***<font color="MediumBlue">売上の一部を困っている地域社会に寄付することもできます。</font>***
    - 例えば、衣料品を販売する企業が、自社サイトで商品を購入するたびに、ホームレス支援施設に靴下1足を寄付するような場合です。このようなプログラムは、企業の価値観を示すだけでなく、顧客も善行に参加することができるのです。

# 顧客とのつながりを維持しやすくする方法

- ***<font color="MediumBlue">サブスクリプション</font>***
    - 例えば、カミソリやビタミン剤、プリンターのインクなど、お客様が定期的に購入する可能性のある商品の定期購入を提供するのも一つの方法です。定期購入は解約しやすくすることで、固定観念にとらわれないようにします。
- ***<font color="MediumBlue">ダイナミック・リマーケティング</font>***
    - 過去にあなたのサイトを訪れたユーザーが閲覧した製品やサービスを含む広告を表示することができます。この広告では、顧客が興味を示した製品やサービスに焦点を当てたパーソナライズされた体験を提供することができます。
- ***<font color="MediumBlue">メールマーケティング</font>***
    - お客様の関心に基づいた価値あるコンテンツを配信する機会を提供します。
    - カートを捨ててしまったお客様にリマインドメールを送ったり、お客様がすでに購入した商品に関連する商品を提案するなど、データを使ってメールキャンペーンをパーソナライズすることができます。
    - コンタクトの再注文時期や、新しく購入したマットレスの反転時期を知らせるなど、リマインダーとして活用することも可能です。
- ***<font color="MediumBlue">リワードプログラム</font>***
    - お客様に再来店のインセンティブを与えることも、つながりを保つための一般的な方法です。


:::note info
ロイヤリティの構築は、企業が顧客を大切にしていることを示すことで、時間をかけて行われます。そのためには、信頼関係を築き、コミュニティ意識を醸成し、顧客とのつながりを維持しやすくする必要があります。ロイヤルティはマーケティングファネルの最終段階ですが、企業が成長するための最も貴重な機会の1つです。満足した顧客は再来店する可能性が高く、あなたのビジネスを他の人に伝える可能性も高くなるのです。
:::
【Xcode】SPMで追加したライブラリ関連で突然コンパイルエラーが出たときの対処法

FirebaseのライブラリをSwiftPackageManagerで追加して利用していたが、ある日突然今まで正常に動いていたFirebase関連のコードがコンパイルエラーを出すようになり困ったため、そのときの対処法を紹介する。
# Packageのキャッシュをリセット
Xcodeのメニューバーから
`File > Packages > Reset Package Caches`
を実行することで解決する。

完了後に`PackageIndex.findPackages failed`というwarningが出る場合があるが、
`Product > Clean Build Folder`を実行することで解決する。
[GIMP]よく使う機能まとめ（予定）

# 概要
GIMPでよく使う機能をまてめていく「予定」です(気長に追加していきます)
# 本文
## 画像を切り抜いて全体のサイズを小さくする
この画像から女性の部分だけが欲しいとしたら
![スクリーンショット 2023-03-30 7.12.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/604dc957-520c-a6c3-80ce-85cf527dd004.png)
欲しい部分だけ選択した後、メニューから「画像」 > 「選択範囲で切り抜き」
![スクリーンショット 2023-03-30 7.12.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/577516e8-3c89-99d6-d460-3e8ad346a846.png)
![スクリーンショット 2023-03-30 7.12.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617265/5a92b53e-1ff9-6de0-ab21-921a82659c82.png)
ソースコードの編集内容を自動保存しながら、Webブラウザに自動で更新・表示する方法

<h2>はじめに</h2>
<p>※ここで紹介しているVSCodeのバージョンは、2020年8月9日時点 のものです。バージョンがそれより古いものだと、正しく動作しない可能性があります。</p>

<h2>手順</h2>
<p>（1）VSCodeエディタの「自動保存」をオンにする。</p>

<p>（2）VSCodeエディタの拡張機能「Live Server」をインストールする。<br>（それによって、VSCodeエディタの下部に「Go Live」という表示が出現する）</p>

<p>（3）VSCodeエディタ内で、HTMLファイルを選択する。</p>

<p>（4）「Go Live」の表示をクリックする。</p>

<p>（5）Webブラウザが自動で開かれて、そのHTMLファイルの内容が表示される。</p>

<p>その後、HTMLやそれに紐づいたCSS・JavaScriptなどを編集していくと<br>Webブラウザに自動で更新・反映されるようになります。</p>

<h2>参考元</h2>
<p>記事を書く上で、情報の確認や文章構成の参考にさせていただきました。ありがとうございました。</p>

<label for="1">「VSCodeエディタのプラグイン「Live Server」でブラウザを自動更新」</label>
<a href="" id="1">https://blanche-toile.com/tools/vscode-live-server</a>
オブジェクト指向・UMLのクラス図とは

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！

今回は具体的なオブジェクト指向・UMLのクラス図について更に詳しく調べてみましょう！
![インスタスライド_2023031702.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/0ef3a451-c730-fffa-57cb-897d03948ed8.gif)

# クラス図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/951b534c-1337-71e2-877e-934492a0cae5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/69c1fde2-f9ac-f961-c1b4-ebc4e4f3f47f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/1aaef19f-1a14-3db4-6eae-5f98408e2017.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/9063688c-eeb5-6178-6f28-df6aa2704ab1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/14591470-6c1f-a3b3-d0d5-678f2f638bda.png)
# まとめ
ーUMLのクラス図を知ろう

ークラス名、属性、操作を定義

ー汎化や特化も表す

ー関連、多重度、集約も表す


# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。
GitHub Copilot

# GitHub Copilotについて

GitHub Copilotは、GitHubとOpenAIが共同で開発したAI駆動のコーディングアシスタント
GPT-4を使用しており、開発者がコードを効率的に書くのを支援する

## 目次

1. [主な機能](#主な機能)
2. [導入するメリットデメリット](#導入するメリットデメリット)
3. [その他](#その他)
4. [詳細情報](#詳細情報)


## 主な機能

### コード補完

開発者が入力したコードに基づき、次に書くべきコードの提案を行う

```javascript
// コード補完の例
// 入力
function add(a, b) {

// Copilotが提案するコード
function add(a, b) {
    return a + b;
}
```

### 自動化されたコード生成
開発者がコメントや機能の説明を入力すると、GitHub Copilotはその説明に基づき適切なコードを生成

```javascript
// 自動化されたコード生成の例
// 入力
// 文字列を逆にする関数
function reverseString(s) {

// Copilotが提案するコード
function reverseString(s) {
    return s.split('').reverse().join('');
}
```

### 複数言語とフレームワークのサポート
GitHub Copilotは、Python、JavaScript、TypeScript、Ruby、Java、C#など、多くのプログラミング言語とフレームワークに対応

### カスタムスニペット
GitHub Copilotは、一般的なコーディングパターンやベストプラクティスに基づくスニペットを提供

```javascript
// カスタムスニペットの例
// 入力
// クリックイベントリスナーを追加
addEventListener

// Copilotが提案するコード
element.addEventListener('click', function(event) {
    // ここにクリック時の処理を記述
});
```

### 学習能力
GitHub Copilotは、ユーザーのフィードバックやコード入力を通じて継続的に学習し、今後さらに正確で適切なコード提案を行うようなるはず

## 導入するメリットデメリット

### メリット

1. **効率的なコーディング**: GitHub Copilotは、開発者がコードを素早く書くのを助け、コーディングプロセスを効率化する
2. **コード品質の向上**: 一般的なコーディングパターンやベストプラクティスに基づくスニペットを提供し、コード品質の向上
3. **学習リソース**: 新しい言語やフレームワークを学ぶ際に、GitHub Copilotは有用なリソースとして機能
4. **複数言語のサポート**: GitHub Copilotは、多くのプログラミング言語とフレームワークに対応

### デメリット

1. **提案されたコードの正確さ**: GitHub Copilotが提案するコードは必ずしも正確でなく、開発者が提案を検証し、適切な修正を行う必要がある
2. **著作権とライセンスの問題**: GitHub Copilotが生成するコードは、他のプロジェクトから取得されたものである可能性があり、著作権やライセンスに関する問題に注意する必要がある
3. **過度の依存**: GitHub Copilotに過度に依存することで、開発者が独自の問題解決能力を磨く機会を失う可能性がある


## その他

### 注意点
提案されたコードは必ずしも正確でないため、開発者は提案されたコードを検証し、適切な修正を行う必要がある
著作権やライセンスに関する問題にも注意。

## 詳細情報

詳細な情報についてはGitHub Copilotの公式サイトを確認
[GitHub Copilot 公式サイト](https://copilot.github.com/)
MSXの強引なる超高速漢字ドライバーを作った時の考察

# 漢字ドライバーの仕様は？
8×12 dot とりあえず見れればよく、漢字が鮮明に見える必要はない

インタレスさせるとチカチカするので目に悪いが、チカチカしないので目にもよくなる

本来のMSXなら 16×12 dot もしくは 16×16 dotなはず
CPUで演算して縦に潰します

:::note info
CPUで演算したほうのが、VRAMに書き込むより速い
:::

# CPUで描画するよりVRAMコピーしたほうが速い
そのために、漢字ドライバー起動時にASCII文字とひらがな、カタカナ文字を裏VRAMに描画をする

VRAMの容量が非常に巨大だったら第1水準ぐらいは全部書き込みたかったが、さすがの無理です

# よって、こんな仕様のドライバーができました
- 8 × 12dot
- ASCII文字、ひらがな、カタカナは最初にVRAMに記述し、描画時はVRAMコピーして描画する
- それ以外の漢字は縦に半分に潰して、OUT文を半分に削減して描画する

# そのおかげで、速さは力！と称していたPC-9801より高速に漢字表示ができました。

あくまで、MS-DOS上のtypeコマンドと比較しての話です。
VZエディタとか比較されたら、さすがに負けます。

ですが、Z80がPC-9801VXに漢字表示速度が明らかに勝っていた、その事実でした

# ちなみに、PC-9801はどう漢字書いてるの？

テキストVRAMに値を書くのみです。

それよりも高速化していたのです。

# ところで、この漢字ドライバ、何に使ったの？

パソコン通信BBSホストでした。

# ソースコード
わかる人には某漢字ドライバの改変であることがばればれです。
https://www.vector.co.jp/soft/other/msx/se045200.html
LinuC　第二回　仮想マシンとその使い方

###### 仮想マシンとは　
実際のPC上に構築された仮想的なコンピューター

メリット　　何台もPC/サーバを用意する必要ない。
　　　　　　複数のサーバを一台で操作できる
　　　　　　様々な環境を手軽に導入できる
デメリット　本来の性能を活かせない
　　　　　　物理環境の不具合の影響が大きくなる
###### 種類
ホストOS　WindowsやMacに手軽に導入できるが、コンピューターの性能を生かしきれない。

ハイパーバイザー　Linuxで用いられる仮想化手段で、CPUに仮想化支援機能が必要、段階が少なく、効率的に仮想マシンを稼働できる。
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/774a923b-90af-5d92-edb0-24673dbb9845.png)
一例↓　Windows上にLinux
Oracle VM VirtualBox（ホストOS型）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/c6703746-d135-3637-faa3-27718e377f69.png)


###### KVM仮想マシンの確認

KVM　（Kernel-based Virtual Machine）
Linuxカーネルに標準で組み組まれている仮想化システム
ハイパーバイザー型、CPU対応必要。

CPUがKVMに対応しているかしらべるコマンド：
iscpu | grep Virtualization

教科書では、VT-XかAMD-Vどちらかが表示されていればOK。

ですが、今回は「Virtualization type: Full」という結果が表示された。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/31be5de9-7f8a-cb04-9104-33f69070a46e.png)
この場合、コンピュータはフルバーチャライゼーション（完全仮想化）をサポートしていることを示しているようです。

##### virsh 仮想マシンを操作するコマンド　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/40eb671c-bef5-292d-9aad-8bccd1b1e151.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/bc72f501-c1c2-db5d-c76a-f2efacc81a59.png)
しかし、自分のPCでvirshコマンドを入力したらcommand not foundと表示された。調べたところで、システムにlibvirtまたはvirshツールパッケージがインストールされていないことを意味します。
libvirt（仮想マシンの管理を便利にするソフトウェアの集まり）
次のコマンドを使用してlibvirtとvirshツールパッケージをインストールできます。
sudo yum install libvirt libvirt-client

インストール完了し、virshコマンドが正常に機能するようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3293109/b2e28343-3ff1-b1d4-aa08-1e0babb9a061.png)

どうやらlinuc１では仮想マシンをクリエイトすることがないようですが、次回に作ってみます。
踏み台サーバ、ProxyCommand ありの scp コマンド with nohup の操作で詰まった件

## 経緯

　研究で作成したデータ（大学のスパコン、リモートサーバ上）を研究室内のサーバに移行しようとして、苦戦した。

## 問題点
　研究データが膨大なので、`nohup &` コマンドでバックグラウンド実行にしてリモート接続が切れていても `scp`コマンドが実行され続けるようにしようとした。しかし、初っ端からこれを実行するとなぜかコピーが実行されていないことがわかった。

## 解決案
　`nohup`した後に一旦 `ctrl + z`で操作を中断して、`bg`でバックグラウンド操作を再開させる

## 具体例（スパコンのサーバ上で）
```terminal
nohup scp -r -o ProxyCommand='ssh -W %h:%p [公開鍵の絶対（相対）パス] -p 22 [踏み台のサーバのIPアドレス]' -p 22 [送信したいファイル・フォルダの絶対（相対）パス] [送信先のIPアドレス]:[送信先に指定したいディレクトリの絶対パス] > out.log（nohup のログの出力ファイル名）2 > err.log（nohup のエラーログのファイル名）

#  ctrl + z を押して一旦操作を中断
Stop Command scp -r -o ProxyCommand='ssh -W %h:%p [公開鍵の絶対（相対）パス] -p 22 [踏み台のサーバのIPアドレス]' -p 22 [送信したいファイル・フォルダの絶対（相対）パス] [送信先のIPアドレス]:[送信先に指定したいディレクトリの絶対パス] > out.log（nohup のログの出力ファイル名）2 > err.log（nohup のエラーログのファイル名）

bg

```

## 考えられる原因？（予想）
　元々、認証の必要なssh 接続だったので `nohup &` で初めからバックグラウンド実行しようとすると、認証ができずに実行できなかったのではないか？これはあくまで予想なので、間違っているかもしてないです。何か正しい答えをご存知の方がいらっしゃったら教えていただきたいです。。。
スプレッドシートで空(から)・ブランクの作り方

# 思い込み

* GASから`getLastRow`すると、数式の出す`""`の空白まで数えられてました。
* まあそんなもんかと諦めてました。確かにセルには数式が入っているので。

# しかし違いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1204406/074247db-9824-a0af-34f7-019b9b099470.png)

* `=if(1,)`とすることでブランクが出力出来ました。
* `getLastRow`、`getLastColumn`、`getDataRange`などで無視してくれます。
* しかし、`ctrl + arrow`のカーソル移動には引っかかりました。

# でも、あれ？ 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1204406/277d7dfb-6a4e-548c-8385-9d7b8637008a.png)

* `=B3=""` はfalseになって欲しかった。
* 混乱は続く・・・