OmniAICreator/Qiita-1.07M huggingface dataset:
SwiftUIスタディーアプリFabulaに関するお話

###Fabulaとは
[Fabula](https://apps.apple.com/app/id1591155142)アプリは、SwiftUIを学習して作成した小さな単位プロジェクトを集めて共有するサービスです。 学習を通じて作られた結果物をgithubにオープンソースとして共有しています。

また、[FabulaItemsProvider](https://github.com/jasudev/FabulaItemsProvider)というプロジェクトを通じて、複数の開発者が参加して、自分のコードをFabulaサービスを通じて配布することができます。 SwiftUIを学ぶ多くの開発者に情報を提供し、多数の開発者が参加することで、自分の開発スキルも向上させるための良い方法です。

[FabulaItemsProvider](https://github.com/jasudev/FabulaItemsProvider)はオープンソースです。 自分が開発したコードをPR（Pull Request）を通じて提供し、オペレータは最小限のエラーのみを除去してApp Storeに配布します。

###[Fabula](https://apps.apple.com/app/id1591155142)プロジェクトのワークフローは次のとおりです。
![fabulaWorkflow.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2533289/93cb2034-4997-fc52-a03d-fe8caafc6b90.png)

簡単に説明すると、[FabulaItemsProvider](https://github.com/jasudev/FabulaItemsProvider) プロジェクトを fork し、item になるコードを作成およびテストした後、PR (Pull Request) 要求します。 これでFabulaアプリに自分のアイテムが配布されるプロセスは終わりです。 その後、オペレータはPRされたプロジェクトでエラーを確認し、展開のためにmergeを実行します。

その後、App Storeで[Fabula](https://apps.apple.com/app/id1591155142)アプリが更新されたら、自分のコードが配布されていることを確認できます。 単純なコードも良いです。 あなたが開発した簡単なコードは、多くのジュニア開発者に役立ちます。

###[Fabula](https://apps.apple.com/app/id1591155142)プロジェクトを通じてオープンソースで配布されたライブラリは以下のようなものがあります。

- UnsplashのAPIを活用したSwiftUI用のライブラリです。
Sortの基準に基づいてページングと写真検索機能を提供します。
https://github.com/jasudev/UnsplashProvider

- iOS / macOSでサポートされているライブラリが見つからなかったので作成しました。
特定のビューを Zoomable コンテナで包んだ形で実装します。 SDWebimageSwiftUIを利用したurlのイメージを zoom in/out する機能も提供します。
https://github.com/jasudev/Zoomable

- スクロールに応じて各ビュー内でタイムライン形式の値を自動的に処理するライブラリです。 スクロール位置に応じて、各ビューの値が0.0から1.0の間の値を渡すことによってアニメーションを処理できます。
https://github.com/jasudev/Scroller

- Textにアニメーションを処理できるライブラリです。 Generic Effectオブジェクトを渡すことで、さまざまなアニメーションを処理できます。 もちろんカスタムアニメーション効果も簡単に作れます。
https://github.com/jasudev/AnimateText

- OS/macOS で使用できる Lottie ライブラリです。
https://github.com/jasudev/LottieUI

- Bottom Sheetは下部のみをサポートしますが、このライブラリは左、右、上、下をすべてサポートするUIライブラリです。 iOS/macOSの両方をサポートします。
https://github.com/jasudev/AxisSheet

- スターポイントを処理できるライブラリです。 水平/垂直方向をサポートし、Viewプロトコルに準拠したすべてのビューをデザインに適用できます。
https://github.com/jasudev/AxisRatingBar


[Fabula](https://apps.apple.com/app/id1591155142)プロジェクトは、iOS / macOSを一緒にサポートできるSwiftUIコードを目指しています。

一緒に参加してみませんか？
ヤマハのNW機器のL2MSが「いい感じ」なのに監視用に構造化されてないのでAnsibleで「正規化する話」 

# この記事は

SNMPだとLAN外から利用できないので、[L2MS](http://www.rtpro.yamaha.co.jp/RT/docs/swctl/index.html)を利用してヤマハ製ネットワーク機器を監視しようと思うが、テーブル形式(show arpとか)のは別に取れなくてもいいんだよって人向けの記事。

# やりたかったこと
トラフィックを定期的にデータベースに入れたいので構造化（パース）された情報が欲しくて

# 前提
ネットワーク機器のssh、L2MS設定、Ansible、[ansible-collection-rtx](https://github.com/yamaha-network/ansible-collection-rtx/)、[ansible-collection-swx](https://github.com/yamaha-network/ansible-collection-swx) 及びPythonのインストールの用意ができている。

# やり方

## 結果に含まれるセミコロンとカンマを正規表現で置換し、iniフォーマットととして保存する。

playbook.yml

```yaml
---
- hosts: RTX830
  connection: network_cli

  tasks:
    - name: get lan map
      yamaha_network.rtx.rtx_command:
        commands:
        - show lan-map lan1
      register: result

    - name: show result
      debug:
        msg: "{{ result.stdout_lines[0] }}"

    - local_action:
        module: copy
        content: "{{ result.stdout[0] | regex_replace('\\n\\s+','\\n') | regex_replace(': ','= ') }}"
        dest: lan_map.ini
 
  vars:
    ansible_network_os: yamaha_network.rtx.rtx
    ansible_user: user_name
    ansible_ssh_pass: password
    ansible_become: true
    ansible_become_password: password
    ansible_port: 22
```
```bash
ansible-playbook -i inventory/host playbook.yml

cat lan_map.ini
```

```ini
[Master]
LinkUp          = lan1:2 
Terminal num    = 2

[Slave]
[ac:44:f2:be:a0:58]
Model name      = WLX212
System name     = WLX212_Z6C02576BO
Route           = lan1:2
LinkUp          = 1 
     UpLink     = 1
     DownLink   = none
State           = Idle
Appear          = 2022/02/20 20:20:05
Search Time     = 0 sec (2 msec)
Terminal num    = 2
```

## iniファイルをパースする
```python
import configparser
config = configparser.ConfigParser(allow_no_value=True)
config.read('lan_map.ini')
# ['lan_map.ini']

config.sections()
# ['Master', 'Slave', 'ac:44:f2:be:a0:58']

for key in config['Master']:  
     print(key)

# linkup
# terminal num

config['Master']['linkup']
# 'lan1:2'
```

最後までお読みいただきありがとうございます。
もし、気に入っていただける内容ありましたら、「いいね」や「シェア」していただけるととても嬉しいです。
今後の活動の大きな励みになります！

# 参考になった記事様

https://qiita.com/kitara/items/ae5f8d3d7aa890e6bb57
Docker + Rails7

Docker で Rails7 の環境を作ったときのメモ。

（2024/10/09 追記）
Rails のバージョンを 7.2 に更新

# 環境

+ WSL2
+ Ruby 3.4.4
+ Ruby on Rails 7.2.1
+ PostgreSQL 16.2
+ Docker 27.2.0

# 用意するファイル

Gemfile.lock は空のファイルを用意する。

Rails 7.2 からは Dockerfile が production 用のものに上書きされてしまうので注意。
再度自分で作ったものを上書きしなおすか、Rails の出力したものを使うかする。

自分の開発環境用の Docker なので compose.yaml に `RAILS_ENV: development` を入れているが、普通は不要。

```Dockerfile:Dockerfile
FROM ruby:3.3.4

RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -\
    && echo 'deb http://dl.yarnpkg.com/debian/ stable main' > /etc/apt/sources.list.d/yarn.list

RUN curl -sL https://deb.nodesource.com/setup_20.x | bash -
RUN apt update -qq && apt install -y nodejs build-essential postgresql-client yarn \
    curl dirmngr apt-transport-https lsb-release ca-certificates

ENV APP_ROOT /app
RUN mkdir ${APP_ROOT}
WORKDIR ${APP_ROOT}
ADD ./Gemfile ${APP_ROOT}/Gemfile
ADD ./Gemfile.lock ${APP_ROOT}/Gemfile.lock

RUN bundle install

ADD . ${APP_ROOT}
```

```text:Gemfile
source 'https://rubygems.org'
gem 'rails'
```

```text:Gemfile.lock
```

```yaml:compose.yaml
services:
  db:
    image: postgres:16.2
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_USER=postgres
  web:
    build: .
    environment:
      RAILS_ENV: development
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/app
    ports:
      - '3000:3000'
    depends_on:
      - db
```

# Rails アプリ作成

```shell
docker compose build
docker compose run --rm --no-deps web rails new . --force -d=postgresql
```
# database.yml 編集

host, username, password の 3 行を追加する。

```yaml:config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db           # 追加
  username: postgres # 追加(docker-compose.ymlに設定したのと同じ値にする)
  password: postgres # 追加(docker-compose.ymlに設定したのと同じ値にする)
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
```

# bundle install

DB を作成しようとしたら ``Run `bundle install` to install missing gems.`` というエラーが出るので、もう一度 build する。
このとき Dockerfile が Rails によって上書きされてしまっているので、再度自分で「用意するファイル」のところにある内容で上書きしなおしたあとに build する。

```shell
docker compose build
```

# DB 作成

bin/rails としないと rails コマンドが見つからないというエラーが出ます。

```shell
docker compose run --rm web bin/rails db:prepare
```

# 起動

```shell
docker compose up -d
```
ansible-playbookで複数行をファイルに書き込む


## 書き方
- blockinfileというモジュールを使う

```yaml
- name: Insert VirtualHost Settings
  blockinfile:
    dest: /etc/httpd/conf.d/{{ service_name }}.conf
    content: |
      <VirtualHost {{ service_name }}>
        DocumentRoot /var/www/html/{{ service_name }}/index.html
        ServerName {{ service_name }}-app.vamdemic.jp
      </VirtualHost>
```

## 結果

```conf
# BEGIN ANSIBLE MANAGED BLOCK
<VirtualHost user01>
  DocumentRoot /var/www/html/user01/index.html
  ServerName user01-app.vamdemic.jp
</VirtualHost>
# END ANSIBLE MANAGED BLOCK
```

## 指定した箇所に書き込む場合

```yaml
- name: Insert VirtualHost Settings
  blockinfile:
    dest: /etc/httpd/conf.d/{{ service_name }}.conf
　　insertafter: '^# xxx'
    content: |
      <VirtualHost {{ service_name }}>
        DocumentRoot /var/www/html/{{ service_name }}/index.html
        ServerName {{ service_name }}-app.vamdemic.jp
      </VirtualHost>
```

次のようにできる

```conf
# xxx
# BEGIN ANSIBLE MANAGED BLOCK
<VirtualHost user01>
  DocumentRoot /var/www/html/user01/index.html
  ServerName user01-app.vamdemic.jp
</VirtualHost>
# END ANSIBLE MANAGED BLOCK
```

## 参考
https://blog.enjoyxstudy.com/entry/2016/02/24/000000
RPLiDAR使い方

# RPLiDAR使い方
＊推奨OS：ubuntu 18.04.5
＊推奨環境：anaconda（自分の環境を作成：conda create -n 仮想環境名）
http://wiki.ros.org/melodic/Installation/Ubuntu 
これを上から順に実行（＊うまく動かないものがあっても構わず実行）

```java
//Desktop上にworkspaceを作成（例：mkdir catkin_ws）
sudo mkdir catkin_ws
//gitからパクってくる
git clone https://github.com/Slamtec/rplidar_ros.git
//階層を一個上に上がり
cd ..
//catkin_makeコマンドを実行
catkin_make
//よくわからないコマンド実行
source devel/setup.bash
//LiDARを接続しpermissionの設定を行う
sudo chmod 666(or 777) /dev/ttyUSB0
```
ここまで出来たらターミナルをもう一個立ち上げ

```java
//サーバの起動的なことを行う
roslaunch rplidar_ros view_rplidar.launch
```
こうすると点群データが可視化できる

```java
//bagファイルに記録するには
rosbag record -a
```
元々取得できる点群データは，laserPointCloud型ではないためpythonで変換を行う
＊以下がそのpythonのコード

```main.py
import rospy
from sensor_msgs.msg import PointCloud2 as pc2
from sensor_msgs.msg import LaserScan
from laser_geometry import LaserProjection

class Laser2PC():
    def __init__(self):
        self.laserProj = LaserProjection()
        self.pcPub = rospy.Publisher("/laserPointCloud", pc2, queue_size=1)
        self.laserSub = rospy.Subscriber("/scan", LaserScan, self.laserCallback)

    def laserCallback(self, data):

        cloud_out = self.laserProj.projectLaser(data)

        self.pcPub.publish(cloud_out)

if __name__ == '__main__':
    rospy.init_node("laser2PointCloud")
    l2pc = Laser2PC()
    rospy.spin()
```

```
python3 main.py
```

```
rostoplic list -v
```
とコマンドを打つとtopicの内容が見れる
＊環境によってlaserPointCloudだったりpointsだったり異なる

```
rosbag record -a
```
によって保存・作成されたbagファイルをpcdファイルに変換する

```
rosrun pcl_ros bag_to_pcd <bagfile> ./<topic> <savedirectory>
```
これはbagファイルからpcdファイルへの変換を行う
pcdファイルが大量に作成されるため，pcdファイル専用のフォルダの作成をした方がいいかも！
javaScript93_webページのロードと基本のDOM操作

ブラウザが一つのHTMLファイルをロードする時に、上から下の順序で読み込みます。JSコードをHeadなど頁の上部に書くと、下部の頁がまだロードされていない、DOMオブジェクトはないため、イベントは実行されません。

そのため、JSコードはタグbodyの下の部分で書いてください。どうしてもhead部分で書きたい場合は、window.onloadイベントを使用することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/9a827e7f-d75e-93d5-1cb9-01a572ffb269.png)

HTMLの要素を取得するには、下記の３つの方法があります。
document.getElementsById('id名');
- 値取得のスピードが速い
document.querySelector(); 
document.querySelectorAll();
- 万能
MDN内でdocument.querySelectorAll(）についてこのように説明しています。
- Document の querySelectorAll() メソッドは、与えられた CSS セレクターに一致する文書中の要素のリストを示す静的な (ライブではない) NodeList を返します。

例：
```ruby
<body>
    <div id="test" class="test_list">
        <ul>
            <li>テスト1</li>
            <li>テスト2</li>
            <li>テスト3</li>
        </ul>
    </div>

<script>
    const test = document.getElementById("test");

    // idで取得する場合は＃を書く
    const test1 = document.querySelector('#test');
    // classで取得する場合は.を書く
    const test2 = document.querySelector('.test_list');
    console.log(test1);
    console.log(test2);
</script>
</body>
```
同じclassが複数がある場合は、最初の値だけを返す。
```ruby
<body>
    <div id="test" class="test_list">
        <ul>
            <li class="test_list1">テスト1</li>
            <li class="test_list1">テスト2</li>
            <li class="test_list1">テスト3</li>
        </ul>
    </div>

<script>
    const test2 = document.querySelector('.test_list1');
// 同じclassが複数がある場合は、最初の値だけを返す
    console.log(test2);
</script>
</body>
```
document.querySelectorAll();
```ruby
<body>
    <div id="test" class="test_list">
        <ul>
            <li class="test_list1">テスト1</li>
            <li class="test_list1">テスト2</li>
            <li class="test_list1">テスト3</li>
        </ul>
    </div>

<script>
    const test2 = document.querySelectorAll('.test_list1');
    console.log(test2);
    
</script>
</body>
```


DOM基本操作であるgetElementById(),getElementsByTagName(),getElementsByNameの使い方について紹介します。

getElementById()：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/c039ab60-8833-5a8d-e7fc-5120fe067a64.png)
getElementsByTagName()：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/5741298a-ed1d-dc14-3edc-8f16079df440.png)
getElementsByNameの：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/5040da11-f9bd-1d22-ddbf-e2d7581ce49a.png)
参考（HTML文）：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/47ed9b27-1fad-d9d0-2d66-6f775ac46db6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/c01405f9-8294-ef78-7928-be1ce8d4beb9.png)
crontabでphpが動かない時の対応

AWSのLightsailで構築したサーバ上でExmentを入れています。
特定の時間になったら通知メールを送りたかったのでExmentのマニュアルをもとにcrontabへの設定をしました。

[Exmentマニュアル：タスクスケジュール](https://exment.net/docs/#/ja/additional_task_schedule)

# 問題点
しかし時間になっても通知が来ない。。。
コマンドラインで実行する際によく使う以下の処理でもファイルにエラー内容が残っていません。
他のコマンドだと記録が残るのに。。。

https://webkaru.net/linux/redirect-output-to-file/

# 解決策
ということで結構手間取ってしまいましたが、最終的にphpへのパスの問題でした。

https://kanikuriimkorokke.com/archives/382

上記の記事をもとにprintenvした結果、phpへのパスは通っているのですが、crontab利用時はこのパスは利用しない模様。
でも対応方法はこの記事と同じでcrontab -eで以下の記述をすればOKでした。

```
PATH=/opt/bitnami/php/bin/:/usr/bin:/bin
```

# 注意点
crontab -eコマンドはsudoで実行するとルート権限で自動実行するコマンドの一覧を編集するので別ファイルが開きます。ご注意を。
Swift: 標準入力のリダイレクトで受け取った複数行ファイルの中身を1つのString型変数に

* main.swift

```swift
var str: String = ""
var line: String? = nil

repeat {
    line = readLine(strippingNewline: false)
    if let l = line {
        str += l
    }
} while line != nil

print(str)
```


* sample.txt

```
aaa
bbb

ccc
```

* 実行

```bash
$ swift main.swift < sample.txt
aaa
bbb

ccc
```
Cloud Functionsのリトライ制限

# 節操のないリトライ
Cloud Functionsには失敗時に再試行する機能があるんです。
ただ、この連コインが節度なく、秒間数回の割合で送られてくるのです。
そのため、例えば、Cloud Functionsからアクセスされるサーバでシステム障害でエラーが出ていた場合、
その様相たるや、永パが際限なく続くようなものであります。

# リトライ制限
そのような状況を防ぐには、こうします。
一定時間経ったらリクエストを拒否するようにします。

```
// 受信メイン処理
func main(ctx context.Context, e GCSEvent) error {
	meta, err := metadata.FromContext(ctx)
	if err != nil {
		return fmt.Errorf("metadata.FromContext: %v", err)
	}

	// メッセージ発行時と現在時を比較して古すぎた場合は処理を終了
	expiration := meta.Timestamp.Add(10 * time.Second)
	if time.Now().After(expiration) {
		log.Printf("event timeout: halting retries for expired event '%q'", meta.EventID)
		return nil
	}

	// メインロジック
	return logic(ctx, e)
}
```

現場からは以上です。
Magento2 The configuration file has changed. Run the "app:config:import" or the "setup:upgrade" command to synchronize the configuration.

## 環境

- PHP 7.4
- Magento 2.4

## エラー

```
1 exception(s):
Exception #0 (Magento\Framework\Exception\LocalizedException): The configuration file has changed. Run the "app:config:import" or the "setup:upgrade" command to synchronize the configuration.

Exception #0 (Magento\Framework\Exception\LocalizedException): The configuration file has changed. Run the "app:config:import" or the "setup:upgrade" command to synchronize the configuration.
<pre>#1 Magento\Framework\App\FrontController\Interceptor->Magento\Framework\Interception\{closure}() called at [vendor/fastly/magento2/Model/FrontControllerPlugin.php:131]
#2 Fastly\Cdn\Model\FrontControllerPlugin->aroundDispatch() called at [vendor/magento/framework/Interception/Interceptor.php:135]
#3 Magento\Framework\App\FrontController\Interceptor->Magento\Framework\Interception\{closure}() called at [vendor/magento/module-page-cache/Model/App/FrontController/BuiltinPlugin.php:75]
#4 Magento\PageCache\Model\App\FrontController\BuiltinPlugin->aroundDispatch() called at [vendor/magento/framework/Interception/Interceptor.php:135]
#5 Magento\Framework\App\FrontController\Interceptor->Magento\Framework\Interception\{closure}() called at [vendor/magento/framework/Interception/Interceptor.php:153]
#6 Magento\Framework\App\FrontController\Interceptor->___callPlugins() called at [generated/code/Magento/Framework/App/FrontController/Interceptor.php:23]
#7 Magento\Framework\App\FrontController\Interceptor->dispatch() called at [vendor/magento/framework/App/Http.php:116]
#8 Magento\Framework\App\Http->launch() called at [generated/code/Magento/Framework/App/Http/Interceptor.php:23]
#9 Magento\Framework\App\Http\Interceptor->launch() called at [vendor/magento/framework/App/Bootstrap.php:263]
#10 Magento\Framework\App\Bootstrap->run() called at [pub/index.php:29]
</pre>
```

## 原因

`app/etc/config.php` ファイルを更新したときに発生するエラーです。
設定内容をデータベースに反映する必要があります。

## 対策

```shell-session
$ bin/magento app:config:import
```

## 参考

- https://magento.stackexchange.com/questions/208860/unable-to-synchronized-app-import-configuration-failed
VMware Cloud on AWS環境でContent Libraryを利用してみた (#2 後編 - 別のVMware Cloud on AWS環境から利用)

# 1. はじめに
「[VMware Cloud on AWS](https://www.vmware.com/jp/products/vmc-on-aws.html)」でコンテンツライラブリを利用した際の備忘録をまとめます。記事は前編後編に分けています。後編となる今回は、前編で作成したコンテンツライラブリを別のVMware Cloud on AWS環境(別SDDC)でサブスクライブする方法についてご紹介します。

前編ではコンテンツライラブリの概要説明および初期作成についてご紹介しています。

https://qiita.com/sanjushi003/items/2870c8feced5fd367604

# 2. 別のVMware Cloud on AWSからコンテンツライラブリのサブスクライブ
前編では東京リージョンのVMware Cloud on AWS環境(以降、「既存環境」)でコンテンツライラブリを作成しました。今回の後編では米国東部リージョンのVMware Cloud on AWS環境（以降、「新環境」）から、既存環境のコンテンツライラブリをサブスクライブします。なお、既存環境および新環境のvCenter Server間は通信が出来るようにFirewall設定を事前に完了させています。

## 既存環境のコンテンツライラブリを公開
「公開の有効化」をチェックします。今回私はパスワード認証(任意)も設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/7a453b31-f9fe-f898-413b-aa63cbb4109b.png)

発行された「サブスクリプションURL」のリンクをコピーしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/39d84732-d011-5e3a-af81-258cbf2c4f4c.png)

## 新環境でコンテンツライラブリを作成
新環境でコンテンツライラブリを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/b927ffe1-817f-f47e-6663-ee2fdc5fc37b.png)
既存環境の「サブスクリプションURL」および設定したパスワードを入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/db207a1d-1bec-2f8b-b4b5-225ac685c099.png)
設定を確認し、新環境でのコンテンツライラブリ作成を完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/950a544f-03b6-a53e-43f7-12da8c87f05e.png)

## コンテンツライラブリの同期を確認
新環境で、既存環境のコンテンツライラブリをサブスクライブが成功したことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/d7bacf50-654e-c8f8-a162-9548ebab6f6c.png)

# 3. さいごに
VMware Cloud on AWS環境でもコンテンツライラブリが活用できるということを前編と後編に分けてご紹介させていただきました。
もうすでにオンプレミスVMware仮想環境でコンテンツライラブリを利用されていれば、VMware Cloud on AWS環境でもサブスクライブするだけですぐに同じ仮想マシンのイメージを利用することも可能になります。便利な機能なので、ぜひご活用いただければと思います。

# 4. 関連記事

https://qiita.com/sanjushi003/items/2870c8feced5fd367604

https://qiita.com/sanjushi003/items/3fed25f688c6e0b20a80

https://qiita.com/sanjushi003/items/2dd1ccdafdb93795561b
【メモ】8888ポートが知らないサービスに利用されていたので調査してみた

8888ポートを利用して開発サーバを使用しているのですが、利用されているとエラーが表示されてしまったので調査した結果をメモしております。

# 開発環境

GCEを利用してJupyterNoteを立ち上げています。
JupyterNoteでは8888ポートを利用しています。
JupyterNoteはPodmanのコンテナ環境を使用しています。


# 事象

podmanでコンテナを立ち上げた際に以下のエラーが表示されてました。

```
Error: unable to start container "xxxx": rootlessport listen tcp 0.0.0.0:8888: bind: address already in use
```

# 調査

lsofコマンドにて利用状況を確認しました。

```
sudo lsof -i -P -n | grep 8888
otelopsco 56845     root   10u  IPv6 114460      0t0  TCP *:8888 (LISTEN)
otelopsco 56845     root   13u  IPv4 114677      0t0  TCP 127.0.0.1:43612->127.0.0.1:8888 (ESTABLISHED)
otelopsco 56845     root   14u  IPv6 114678      0t0  TCP 127.0.0.1:8888->127.0.0.1:43612 (ESTABLISHED)
```

ここで**otelopsco**が利用していることがわかったのですが、この単語ググってもでてこないのですよ。。。。
一瞬すごく焦りましたが、この単語を元にプロセスを調べてみたら

```
root       56845  0.1  1.0 1322292 83232 ?       Ssl  02:45   0:01 /opt/google-cloud-ops-agent/subagents/opentelemetry-collector/otelopscol --config=/run/google-cloud-ops-agent-opentelemetry-collector/otel.yaml
```

どうもGCPのエージェントが関与していることがわかりました！

# 結果

GCPのOpenTelemetoryエージェントで動いているPrometheusが利用していることがわかりました。
変なプログラムじゃなくてよかったです！

詳細は以下のページより確認することができます。

https://github.com/GoogleCloudPlatform/opentelemetry-operations-collector

```
The agent reports additional Prometheus style self observability metrics that can be accessed locally via the endpoint http://0.0.0.0:8888/metrics as documented here.
```

# 最後に

**otelopsco**とググってもわからないプロセスが出てきませんでしたが、有害なものではなさそうでよかったです。
誰かの役に立つことができれば幸いです！
Magento2 メンテナンスモードのオン/オフ

```shell-session
# メンテナンスモードオン
$ bin/magento maintenance:enable

# メンテナンスモードオフ
$ bin/magento maintenance:disable
```

`var/.maintenance.flag` ファイルの有無でメンテナンスモードを判定します。
メンテナンスモードオンの時にアクセスすると下記の例外が発生する。

```
1 exception(s):
Exception #0 (Exception): Unable to proceed: the maintenance mode is enabled. 

Exception #0 (Exception): Unable to proceed: the maintenance mode is enabled. 
<pre>#1 Magento\Framework\App\Bootstrap->run() called at [pub/index.php:29]
</pre>
```

- https://devdocs.magento.com/guides/v2.4/install-gde/install/cli/install-cli-subcommands-maint.html
正規表現でカンマ区切りの数字を判定する

IDを引数にする処理の入力チェックなど、以下のような要件を満たす正規表現を書く機会があったのでメモ

- 1以上の任意の整数
- カンマ区切り
- 個数は任意
- それぞれの値がゼロ始まりでない

```
^[1-9][0-9]*(,[1-9][0-9]*)*$
```

`1`や`1,2,3`は許可（マッチ）
`0`, `01`, `1.2.3`, `1,2,3,`などは拒否（アンマッチ）
Python 3 エンジニア認定基礎試験を受けて合格しました

現職はPHPを書いていますが、前職でPythonを書いていたことや、この試験がベータ版の時から興味を持っていたので、タイミングを見て今回受けました。

[Python 3 エンジニア認定基礎試験](https://www.pythonic-exam.com/exam/basic)

## 結果

CBTで受験し、会場ですぐ結果を受け取りました。
合格点700点に対し950点で合格できました。

余談ですがCBTでの受験自体が数年ぶりで、予約や受験するまで慣れず大変でした。

## 試験自体の勉強方法

主教材である [O'Reilly Japan - Pythonチュートリアル 第4版](https://www.oreilly.co.jp/books/9784873119359/) をざっと読み直しました。

そのうえでDIVE INTO CODE、プライム・ストラテジーで公開されている模擬問題を3回ほど解きました。

勉強日数は2, 3日です。前職で数年間Pythonを書いていることもあり、文法や挙動的なところはあまり苦労しませんでしたが、環境構築や標準ライブラリについては知らない部分もあり、学び直しになりました。

総勉強時間は7時間くらいです。書籍が3時間、模擬試験とその復習が4時間くらいの割合です。
その多くの時間はテスト当日の受験時間までの勉強がメインです。

## 試験勉強をして学びになったこと　

元々そこそこの量を書いているので、学んだことは少ないのですが

* 特殊引数
    * [4. その他の制御フローツール — Python 3.9.4 ドキュメント](https://docs.python.org/ja/3.9/tutorial/controlflow.html#special-parameters)
    * 位置引数のみ許容、キーワード引数のみ許容、などなどの指定を便利に記載できる
    * ざっくり知っていたが、あまり活用できてなかったので再発見
* try-except-else-finally
    * 自分でざっくり書くと except あたりを上に投げて終わってしまうことが多かった
    * else, finallyの動きを学びなおせたのでよかった
* 例外の連鎖
    * [8. エラーと例外 — Python 3.9.4 ドキュメント](https://docs.python.org/ja/3.9/tutorial/errors.html#exception-chaining)
    * この機能は単純に知らなかったです
* nonlocal文
    * [9. クラス — Python 3.9.4 ドキュメント](https://docs.python.org/ja/3.9/tutorial/classes.html#scopes-and-namespaces-example)
    * これも使ったことがなかったので知らなかったシリーズ
* 標準ライブラリ
    * この辺りは知らなかったので勉強になりました
        * [struct --- バイト列をパックされたバイナリデータとして解釈する — Python 3.9.4 ドキュメント](https://docs.python.org/ja/3.9/library/struct.html)
        * [reprlib --- もう一つの repr() の実装 — Python 3.9.4 ドキュメント](https://docs.python.org/ja/3.9/library/reprlib.html)
        * [statistics --- 数理統計関数 — Python 3.9.4 ドキュメント](https://docs.python.org/ja/3.9/library/statistics.html)
        * 他もいくつかありますが、本に出てきた範囲だとこれくらいですかね

## 試験に関する感想

* 業務で1か月くらいオブジェクト指向っぽく設計・構築しているサービスの開発者だったら、それほど勉強しなくても受かるんじゃないかなーと思いました
    * 基礎、と銘打たれている通り
* とはいえ、自分が抑えられていなかった機能に気づき学ぶ良い機会になりました
* 受験前に模擬問題は解くのをおすすめします
    * なんといっても無料なので
    * 個人的にDIVE INTO CODEよりプライム・ストラテジーのほうが難しかったように思います
* [Python 3 エンジニア認定実践試験](https://www.pythonic-exam.com/archives/news/python_jissen) もそのうち来るみたいなので、公開されたら受けようかなと思いました
    * ベータ試験の募集に気づくのが遅すぎたので受けれなかった :cry:
    * 実践試験を見据えて今回基礎試験を受けてきたこともあるので、今回試験慣れできたのはプラスだと考えています
* データ試験の方は今のところ受けるモチベーションが産まれていないです
    * 自分の技術的興味分野としてはWebサービス開発やインフラ・クラウドなどの環境の構築に向いていて、データ分析はツールやサービス等で利用者としてうまくやりたい気持ちだからです
    * 自分で手を動かしてデータ分析したくなってきたら視野に入れてみようかと思います
* 現在はPHPエンジニアなので、PHPの試験とかも眺めてみようかな、とは思っています
    * [試験概要 – PHP技術者認定機構](https://www.phpexam.jp/summary/)
    * PHP8の上級試験の模擬問題も公開されているので興味があります
        * [PHP8上級模擬試験が無料で公開されました。 – PHP技術者認定機構](https://www.phpexam.jp/2022/02/09/php8%e4%b8%8a%e7%b4%9a%e6%a8%a1%e6%93%ac%e8%a9%a6%e9%a8%93%e3%81%8c%e7%84%a1%e6%96%99%e3%81%a7%e5%85%ac%e9%96%8b%e3%81%95%e3%82%8c%e3%81%be%e3%81%97%e3%81%9f%e3%80%82/)
    * セキュリティ周りも気になります
        * [WS001 ： ウェブ・セキュリティ基礎（徳丸基礎試験認定）｜CTC教育サービス 研修/トレーニング](https://www.school.ctc-g.co.jp/course/WS001.html)

## まとめ

言語に対する勉強やその価値を示すのは毎回難しいなと思います。この認定基礎試験はプログラミングに多くの時間をかけている人からすると簡単すぎるのではと個人的には感じますが、このような試験があることで知識証明として出せる、というのは一つメリットなのかなと思います。

また自分自身がある程度業務でも書いてきたPythonであっても機能上知らないものがまだまだあり、試験をきっかけに知識に深みが出たように思います。
ただ知らなければ勉強しなければ！という意識を強く持ちすぎないよう、楽しんでプログラミングをしながら自身の成長にもつなげていけるといいなと思っています。
JavaScript、find、Filter

# JavaScriptのfindとFilterメソッド

## findメソッドについて
find()メソッドは、提供されたテスト関数を満たす配列内の最初の要素の値を返します。

```js
const foods = [1, 2, 3, 4, 5, 6,7,8,9,10];
    const foodNumber = foods.find((food) => {
     return food > 9;
    });

    console.log(foodNumber);

//=> 10
```
このように10が出力されます。
配列から条件に一致した最初の値を返します。

少し複雑なfind文

```js
const teams = [
    { name : 'バルセロナ' },
    { name : 'レアル', id : 1},
    { name : 'パリ' },
    { name : 'マンU', id : 10}
 ];

const result = teams.find(function(team){
  return team.name === "マンU"
});

console.log(result);
```


```js
配列.find((引数)　=>{
return 条件;
)};
```
findメソッドは、配列のそれぞれの添字に対して一度ずつ、callback関数(他の関数に引数として渡される関数で、外側の関数で何らかの処理やアクションを実行すること)を実行し、callback関数がtrueな値を返すまで繰り返します。その場合、findは直ちにその要素の値を返します。そうでなければ、findはundefinedを返します。

## Filterメソッドについて
filter()メソッドは、与えられた関数によって実装されたテストに合格した全ての配列からなる新しい配列を生成します。

```js
    const foods = [1, 2, 3, 4, 5, 6,7,8,9,10];
    const foodNumber = foods.filter((food) => {
     return food > 5;
    });

    console.log(foodNumber);

//=> 6,7,8,9,10
```

このように配列から条件に一致した値をすべて返します。

```js
配列.filter((引数)=>{
return 条件;
});
```
###文字列の中から条件に合った文字列を抽出する
```js
const teams = ["team1", "team2", "team3"];
const superTeams = teams.filter(function(value) {
  return value === "team1";
});
console.log(superTeams);

//=> team1
```
###引数
配列の各要素に対して実行するテスト関数です。この関数がtrueを返した要素は残され、falseを返した要素は取り除かれます。

###返り値
テストに合格した要素からなる新しい配列です。テストに合格した要素がなかった場合は、空の配列が返されます

## まとめ
findメソッドのところは少し複雑なと表現しましたが、自分としては読むのに時間が
かかってしまいました。もう少し、時間を短縮できるようにしていくことが課題になります。フィードバックやご指摘があれば言っていただけると幸いです。よろしくお願い致します。
ITパスポートしか持っていない意識低い文系インフラエンジニアがAWSクラウドプラクティショナーを取得した

# 懺悔
6年もIT業界にいて、明らかにのんびりしすぎました。

気づいたらITパスポートしか持っていないアラサーSEのできあがりです。

もちろん資格が全てでは無いとは思いますが、流石に強みが無さ過ぎて不安がはんぱないです。

キラキラしていた新卒の頃の自分、ごめんなさい。

これから頑張ります。

そしてタイトルが長すぎてわかりづらくすみません。

# 資格取れました
今回はITパスポートしか持ってない意識低めエンジニアが、
必要に駆られてAWSクラウドプラクティショナーに合格しました。

ちなみに受験日・スコアは以下の通りです。ギリギリ。

>受験日: 2022-02-dd
>受験者スコア: 787 

もっといけると思ったんですけどね！！！
浅はかでした！(白目)

# 自己紹介

Qiita初投稿ですので、簡単に自己プロフィールから。

・文系大学卒

・新卒でIT業界へ入社(2016年)

・OS領域の運用保守(3年)
WindowsServerやUNIX系サーバを多数管理しておりました。
得られた経験は物理・仮想サーバ周りの運用技術でした。
IT業界の基礎や、ITILについてもたくさん学ばせて頂きました。

・現在はSAP絡みの運用保守
SAP製品の扱いに特化した運用をしています。
OS領域からの異動、加えて独特なチーム内慣習もあり、やっと慣れてきました。

・QiitaはROM専だったのですがアウトプットも大事だよね、って事に気づかされ勢いのままに筆をとりました。

・Qiitaには意識が本当に高い人たちが多くいるなあと感じていましたので、
　本当に意識の低い当方がその平均値を下げる事で、たくさんの人がQiitaに参加できたらと考えた次第です。
　(偉そうな事言ってすみません！1人ぐらい意識低いやつがいてもおもしろいのかなと思った次第です！)

# 取得経緯
業界がどんどんクラウド移行されており、契約を切られないためにも
まずはクラウドプラクティショナーを取得しようと思い、学習を始めました。

ちなみに2年ぐらい前にAWS SAAを受験した事もありますが余裕の不合格でした。

500点ちょいぐらいだった記憶です。

適当に書籍を流し見して、いけっしょ！と思い受験したこのザマです。
(Qiitaの天才達は余裕で合格していたので、いけっしょ！と感じてしまいました)
(なぜかこの頃は過度に自信がありました)



# やったこと
とりあえずは書籍を何週か読みました。

読んだ書籍はこちら。Qiita内でも散見する有名書籍です。

https://www.amazon.co.jp/模擬問題付き-AWS認定-ソリューションアーキテクト-アソシエイト教科書-SAA-C02/dp/4295010650/ref=sr_1_13?__mk_ja_JP=カタカナ&crid=19O48GHDOHZ3F&keywords=AWS&qid=1645409930&sprefix=aws%2Caps%2C357&sr=8-13


なんとなくインプットもできたかな？ぐらいでここからひたすらUdemyを使い倒しました。
https://www.udemy.com/course/aws-4260

後はこの問題をひたすら解き続けます。

1試験に対して連続2回で100点を取れるまでは辞めない、という脳筋スタイルで学習をしていました。
（アソシエイト試験レベルのやつはやる気が全く出ずやってません）

大体2回やったら理解していない問題が全て露呈するので、
3.4回目ぐらいで100点を取れるようになっている事が多かったです。

何回も解いていると出題⇔答えを覚えてしまう事もありますが、
試験対策としては良しとしました。
ただし使える知識になっているかは微妙。実際に使う時はそのサービスを学習しなおすと思うのでいいかなと。

学習期間は大体1か月ぐらいでした。ぎゅっとしたら半月も無いぐらい・・・？

# 気を付けたほうがいいこと
Qiitaにはスーパーエンジニアや天才がたくさんいます。
以下の方々はその最たる例です。

https://qiita.com/suzuki-navi/items/59866e4ad113172a7de5


https://qiita.com/mani___524/items/7585331df069266cf69f

この人達の〇ヶ月で取得しました！には騙されない事です。

学習におけるポテンシャルやキャリアも全く違うし、
鵜呑みにすると痛い目に遭います。(まさに私がそうです)

とはいえ学習方法や参考文系はとても参考になるので、ありがたく拝見いたしました。

# 最後に

次はAWS SAAにリベンジしようと学習を続けています。

新卒の頃の自分に恥ずかしくないように頑張ります。
【build.gradle.kts】共通プロジェクトをローカルのMavenリポジトリに置いて手っ取り早く扱う

# 同じ共通部品を何度も書いてるような気がする
　この前もCSVとかXMLの読み込み作ったような気がするけどなんでまた作ってやがるんだこの俺は。ソースの資産化をちゃんとやってないのが悪い！

　という事でちゃんと共通プロジェクトを作って、それを世界を汚さずローカルで完結させて再利用性を持たせたい！

　それも手っ取り早く！

　GitHubで公開してそれを取り込むというのをやっていたが、その前段階として公開するかしないか決めあぐねるような試験的なライブラリはローカルで完結させてしまえ、と。

　ローカルにMVNリポジトリフォルダを作って、そこにpublishで突っ込めばよくね？　という事でやってみた。

# サブプロジェクト（取り込まれる側）

今回は```E:/mvnrepo```にMVNのローカルリポジトリを作成する。
色々試したが絶対パスで作るほうが良さそう。環境変数を使って共通化させるのも良さそうだが、今回は仕組みの話なので直打ちのサンプルを乗っける。

```build.gradle.kts
plugins {
    kotlin("jvm") version "1.6.10"
    `java-library`
    `maven-publish`
}

val artifact = "prunes"
group = "org.$artifact"
version = "1.0-SNAPSHOT"

publishing {
    publications {
        create<MavenPublication>("maven") {
            from(components["kotlin"])
            groupId = group as String
            artifactId = artifact
            version = version
        }
    }
    repositories {
        maven(url = "E:/mvnrepo")
    }
}
```

これで```./gradlew publish```とすれば、```e:/mvnrepo/org/prunes/```に入っている。

# クライアント（取り込む側）

```build.gradle.kts
plugins {
    kotlin("jvm") version "1.6.10"
    application
}

repositories {
    maven(url = "E:/mvnrepo")
    mavenCentral()
}

dependencies {
    implementation("org.prunes:prunes:1.0-SNAPSHOT")
}
```

これでOKである。
intelliJの ```[File] -> [New] -> [Module from Existing Sources...]```でサブプロジェクトをモジュールとしてロードしてやると、同時に編集できて中々便利だ。

ローカルでお手軽に完結させて色々と拡張していって、ある程度形ができたら、じゃあ世界公開しようかなとかプライベート公開しようかなとか、ボツにしようかなとか、方向性を調整できる。

何度も何度も似たような形の車輪を発明し続けるのも疲れますよネ、というお話でございましたとさ。
GCPでオーナー権限を付ける際にメールで承諾が必要な場合と不要な場合の違い

#背景
雇用や役割の違いによりGoogle Workspaceで複数の組織を併用していると、
メンバーへGCPプロジェクトのオーナー権限を付ける際、メールでの承諾が必要な場合と不要な場合があった。
今まで違いを特に意識していなかったので、確認してみた。

#結論
組織内のアカウントで同一組織内のGCPプロジェクトならメール認証が不要。
それ以外はメール認証が必要。

何らかの理由により別組織のGCPプロジェクトのオーナーになる必要があり、
そのアカウントがメールを受け取れない（Cloud Identityかつ自前メールサーバとの接続無し等）場合は注意。

#公式ドキュメント
（見つけたら追記します）

#整理表

|ユーザー＼GCPプロジェクト|組織A|組織B|組織なし|
|:-|:-:|:-:|:-:|
|**組織A**|**不要**|必要|必要|
|**組織B**|必要|**不要**|必要|
|**組織なし**|必要|必要|必要|


#（参考）メールでの承諾のイメージ

![スクリーンショット 2022-02-21 10.12.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175280/5eda86cf-fcdf-0f17-1140-7e0eb48d3a1f.png)
CURLコマンドをSalesforceで活用する

[まとめページに戻る](https://qiita.com/Keiji_otsubo/items/60afc2a8d211b6f7d89f)
[まとめA～M](https://qiita.com/Keiji_otsubo/items/f3ddedee6793bf1576f8)


# 私が作成したもの

+ [Salesforce Reports and Dashboards REST API](https://qiita.com/Keiji_otsubo/items/d6ceda32fdd8fe132b60)
+ [Bulk APIを使ったデータ連携(準備編)](https://qiita.com/Keiji_otsubo/items/ea283163ab9940d3672a)


# 質問/回答例
+ [Error: Invalid URI "http:///services/data/v53.0/limits](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000GeKYu)
+ [BoxにAPI接続がしたい](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HDHwcSAH)

# 参考資料

+ [cURLコマンドとシェルスクリプトでSalesforce Chatter REST APIを実行してChatterメッセージを投稿する](https://qiita.com/na0AaooQ/items/037434830b69e9b45ffd)
+ [Is it possible to send an email via the REST API?](https://salesforce.stackexchange.com/questions/17345/is-it-possible-to-send-an-email-via-the-rest-api)
+ [REST APIを介してLOGINを行った時のAPIコール制限について](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000G5jkQSAR)
+ [アプリケーションのAPIバージョンリスト](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000H07m5)
+ [データストレージ、filestrogae、メタデータタイプusgaeをどのようにカスタマイズできますか](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000GhDza)
+ [Trouble setting a "body" value for a PUT using Asana api](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000GzlBw)

# SOAP API

+ [Session Id invalid when tried to insert listviews using SOAP](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HD9IKSA1)
+ [Mismatched character '<EOF>' expecting '''" in Request Body - Salesforce](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000HEpaS)

# Bulk API 2.0

[ClientInputError : LineEnding is invalid on user data. Current LineEnding setting is CRLF](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000IQADFSA5)

# 関連するかな？

+ [showing error as bad request](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000HlfQY)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/8dcd6091-7b53-8484-361f-5b792d470ace.png)

# {"error":"invalid_grant","error_description":"authentication failure"}

+ [curlでのREST API要求でエラーが発生する](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000JgC4A)

:::note
結論、usernameとして入力しているメールアドレスの中に特殊文字を含んでいたため、正しく読み込まれていないことが原因でした。
特殊文字をエンコードすることでエラーを回避することができました。
https://www.w3schools.com/tags/ref_urlencode.asp
:::

ログイン履歴でエラーメッセージを確かめてくださいとありますね。
確認するのが早いと思います。

Resolution:
To find the exact root cause, please check the login history. It will give the exact error message.

https://www.infallibletechie.com/2022/12/invalidgrant-authentication-failure-salesforce-exception.html
Btreeの実装例(golang)

#何が書いてあるか
BtreeのGoでの実装例。備忘録。

##

```go
// 節・葉に持たせる機能のインターフェース
type Item interface {
    Eq(Item)   bool
    Less(Item) bool
}
// インターフェースの実装
type Int int
func (n Int) Eq(m Item) bool {
    return n == m.(Int)
}
func (n Int) Less(m Item) bool {
    return n < m.(Int)
}
// 節・葉の構造
type Node struct {
    item Item
    left, right *Node
}
// 節・葉の作成
func newNode(x Item) *Node {
    p := new(Node)
    p.item = x
    return p
}
// 二分木
type Tree struct {
    root *Node
}
// 二分木の生成
func newTree() *Tree {
    return new(Tree)
}
// データの探索
func (t *Tree) searchTree(x Item) bool {
    return searchNode(t.root, x)
}
// 木への挿入
func (t *Tree) insertTree(x Item) {
    t.root = insertNode(t.root, x)
}
// 節・葉の挿入
func insertNode(node *Node, x Item) *Node {
    switch {
    case node == nil: return newNode(x)
    case x.Eq(node.item): return node
    case x.Less(node.item):
        node.left = insertNode(node.left, x)
    default:
        node.right = insertNode(node.right, x)
    }
    return node
}
// 節・葉の探索
func searchNode(node *Node, x Item) bool {
    for node != nil {
        switch {
        case x.Eq(node.item): return true
        case x.Less(node.item): node = node.left
        default: node = node.right
        }
    }
    return false
}
// 木のダンプ
func (t *Tree) printTree() {
    t.foreachTree(func(x Item) { fmt.Print(x, " ") })
    fmt.Println("")
}
// 木からの削除
func (t *Tree) deleteTree(x Item) {
    t.root = deleteNode(t.root, x)
}
// 節・葉の削除
func deleteNode(node *Node, x Item) *Node {
    if node != nil {
        if x.Eq(node.item) {
            if node.left == nil {
                return node.right
            } else if node.right == nil {
                return node.left
            } else {
                node.item = searchMin(node.right)
                node.right = deleteMin(node.right)
            }
        } else if x.Less(node.item) {
            node.left = deleteNode(node.left, x)
        } else {
            node.right = deleteNode(node.right, x)
        }
    }
    return node
}
// 最小値を求める
func searchMin(node *Node) Item {
    if node.left == nil {
        return node.item
    }
    return searchMin(node.left)
}
// 最小値を削除する
func deleteMin(node *Node) *Node {
    if node.left == nil {
        return node.right
    }
    node.left = deleteMin(node.left)
    return node
}
// 巡回
func foreachNode(f func(Item), node *Node) {
    if node != nil {
        foreachNode(f, node.left)
        f(node.item)
        foreachNode(f, node.right)
    }
}
func (t *Tree) foreachTree(f func(Item)) {
    foreachNode(f, t.root)
}

func main(){
    a := newTree()
    for _, v := range []int{5,6,4,7,3,8,2,9,1,0} {
        a.insertTree(Int(v))
    }
    a.printTree()
    for i := 0; i < 10; i++ {
        fmt.Println(a.searchTree(Int(i)))
    }
    for i := 0; i < 10; i++ {
        a.deleteTree(Int(i))
        a.printTree()
    }
```
2022.2.22技術トレンド

#感想：
FE（React * TypeScript）に触れて
FEは「compomentだけなんじゃな」って思った🐶
BEで「.ts」もあるから
カバー範囲も広いし、両刀でよさそう（主観）

なんかBEもTypeScriptって企業も多いらしいし
TypeScript中心に触れていきたいね～




#１．転職市場
最近はバックエンドもTypescriptを採用する企業も多くなっているような印象


Typescriptはかなり広い守備範囲を持っていていま学ぶべき言語って感じ


Goも市場観点でいうと
Java等の成熟した言語よりも

・比較的人口が少なく
・需要が高く
・供給が（比較的）低い

印象です。あと開発がしやすい。



# 2.言わずと知れたビジネス特化型SNS, LinkedIn内で受験できるスキルテストがしゅごいって話らしい
https://zenn.dev/nyancat/articles/20220219-linkedin-skill-test
服をセグメンテーションする　cloth segmentation

#画像の中の服の領域だけを検出・分離する方法です
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/cedb7045-08ce-acdf-bb40-a612a7c04580.jpeg", width=400> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/5804b975-5124-e0d9-f821-1074541c27b8.png", width=400>

#衣服用のアプリケーションが作りたい
ファッションEC、試着アプリなど、服のセグメンテーションを行うことで、さまざまなアプリケーションが作れます。

#機械学習で服の領域を検出

セマンティック・セグメンテーションを用いれば、自動で服の領域を検出できます。

以下のモデルを用いて、Pythonで手軽に実行できます。

https://github.com/ternaus/cloths_segmentation

また、CoreML形式に変換したモデルを使うことで、iOS、MacOSデバイス上でも実行でき、iOSアプリに適用できます。

#方法

###Python

インストールから実行まで、Colabが用意されています。

https://colab.research.google.com/drive/18RenTYhuPVip9SHdMLn-vnK0K57B--um#scrollTo=bdS-B03Az-r-

推論ファイルから実行する場合。

```shell
python -m torch.distributed.launch --nproc_per_node=<num_gpu> cloths_segmentation/inference.py \
                                   -i <path to images> \
                                   -c <path to config> \
                                   -w <path to weights> \
                                   -o <output-path> \
                                   --fp16
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/a9a5bc68-055b-b663-40c2-4c65e993a442.jpeg", width=400><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/6679a448-98a7-3037-a956-2550133195b2.png", width=400>

試すだけなら、Webアプリも用意されています。

https://clothssegmentation.herokuapp.com/

###Swift

iOSで実行するには、CoreML-ModelsからCoreMLモデルをダウンロードしてプロジェクトにバンドルします。

https://github.com/john-rocky/CoreML-Models

```swift
let model = try! VNCoreMLModel(for: clothSegmentation(configuration: MLModelConfiguration()).model)
let coreMLRequest:VNCoreMLRequest = VNCoreMLRequest(model: model)

let handler = VNImageRequestHandler(ciImage: ciimage,options: [:])
try! handler.perform([coreMLRequest])
let result = request.results?.first as! VNPixelBufferObservation
let pixelBuffer = result.pixelBuffer
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/cedb7045-08ce-acdf-bb40-a612a7c04580.jpeg", width=400> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/d8b38926-351b-f771-f41e-21264ce63bee.jpeg", width=400>

#精度も良い
なかなか精度も良いので、便利なアプリケーションが作れそうです。

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
40 代おっさん Spreadsheetクラスについて学ぶ

## 本記事ついて

本記事は プログラミング初学者の私が学習していく中でわからない単語や概要をなるべくわかりやすい様にまとめたものです。
もし誤りなどありましたらコメントにてお知らせいただけるとありがたいです。

## Spreadsheetクラス

Spreadsheetクラスとは
Spreadsheetを操作する機能を提供するクラス

|メンバー|戻り値|説明|
|--------|------|----|
|copy(name)|Spreadsheet|スプレッドシート名をnameとしてコピーする|
|deleteActiveSheel()|Sheet|アクティブなシートを削除する|
|deleteSheel(sheet)|void|シートsheetを削除する|
|duplicateActiveSheel()|Sheet|アクティブなシートを複製する|
|getActiveRange()|Range|アクティブなセル範囲を収得する|
|getActiveSheet()|Sheet|アクティブなシートを収得する|
|getCurrentCell()|Range|現在のセルを収得する|
|getId()|String|スプレッドシートのIDを収得する|
|getName()|String|スプレッドシート名を収得する|
|getNumSheets()|Integer|スプレッドシートのシート数を収得する|
|getSheetByName(name)|Sheet|シートnameを収得する|
|getSheets()|sheet[]|スプレッドシートのすべてのシートを収得する|
|getUrl()|String|スプレッドシートのURLを収得する|
|insertSheet([sheetName, index])|Sheet|指定のindexに新しいシートsheetNameを挿入する|
|rename(newName)|void|スプレッドシート名をnewNameに変更する|
|setActiveSheet(sheet)|Sheet|シートsheetをアクティブにする|
|setCurrentCell(cell)|Range|セルcellを現在のセルにする|

```javascript
function toshiki4() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();
  console.log(ss.getId());
  console.log(ss.getName());
  console.log(ss.getNumSheets());
  console.log(ss.getUrl());
}
```

### シート収得する

シートの収得方法

・アクティブなシートを収得する
コンテナバインドスクリプトに限り、Spreadsheetクラスから直接収得できる。

・シート名でシートを収得する
シート名でシートを収得する方法
getSheetByNameメソッドを使う
＊シート名に変更があると収得できなくなる。

構文

```javascript
SpreadSheetオブジェクト.getSheetByName(シート名）
```

・シートの配列を収得する
getSheetsメソッドでシートを配列として収得した上で、インデックスでシート特定する方法

構文

```javascript
SpreadSheetオブジェクト.getSheets(）
```

スプレッドシートのもっとも左のシートからインデックス0の要素として配列へと格納、戻り値が配列になる。
インデックスは並び順に依存するので、特定のシートを指定したい時は並び順が変更されないように注意する。

＊シートにもIDがあり、ブラウザのURLの末尾のgid=から続く部分がシートIDである。
シートIDを収得するメソッドは用意されていない

お試し

```javascript
function toshiki4() {
  const ss = SpreadsheetApp.getActiveSpreadsheet();

  const sheet = ss.getSheetByName('シート1');
  console.log(sheet.getName());
　
　const sheets = ss.getSheets();

  console.log(sheets[0].getName());
  console.log(sheets[1].getName());
}
```

## 参考資料

<https://www.amazon.co.jp/s?k=google+apps+script+%E5%AE%8C%E5%85%A8%E5%85%A5%E9%96%80&adgrpid=110264232688&gclid=CjwKCAiA9aKQBhBREiwAyGP5lSl7AJJLCvOEHb4wQgMlyqW1fll5X8GDTT_Rkd1_soUAyIPMXQr26hoClHEQAvD_BwE&hvadid=553833563682&hvdev=c&hvlocphy=1009076&hvnetw=g&hvqmt=b&hvrand=4378489642044417389&hvtargid=kwd-594191211348&hydadcr=4106_13159878&jp-ad-ap=0&tag=googhydr-22&ref=pd_sl_2x1owglv0s_b_p52>
漸化式アルゴリズムサンプル(golang)

#何が書いてあるか
漸化式のアルゴリズムのGo版。備忘録用。

## 適用ケース
N段の階段をA段飛ばし、B段飛ばしで登ったときの、各段ごとにとれる登るパターン数を計算する。　など
上記ケースでのコード例）

```go
package main
import "fmt"
func main(){
    dp:=make([]int,N+1)
    dp[0]=1

    for i:=1;i<=N;i++ {
        dp[i]=0
        if i>=A {
            dp[i]=dp[i]+dp[i-A]
        }
        if i>=B {
            dp[i]=dp[i]+dp[i-B]
        }
    }
    // ここから続く5行は、頂上手前で飛ばす段数よりも残り段数が少ない場合には、頂上に到達させるとする場合のルート数の計算。
    end:=0
    for i:=N-1;i>=N-A+1;i-- {
        end+=dp[i]
    }
    dp[N]+=end
    
    // 段ごとの階段の選び方の総数の全段分を表示。
    fmt.Println(dp)
}
```
[Stripe Updates] Stripe Dashboardでのログインユーザー権限がより詳細に設定できるようになりました

Stripeを利用してオンラインビジネスを行う場合、さまざまなケースでStripe Dashboardへのログインが必要になります。

- 新しい開発者のために、制限付きAPIキーを追加する
- 新商品・料金を登録する
- ユーザーからの返金リクエストに対応する
- 不審請求の申請に対応する
- ビジネスの状況を分析する
- etc...

しかし、Dashboardでは自社のビジネスの詳細だけでなく、顧客の個人情報についても簡単にアクセスができます。

# ユーザーアカウントの個別作成で、Dashboardをよりセキュアに

意図せぬ情報へのアクセスや不正利用を未然に防ぐため、Stripeではユーザーごとにログインアカウントを作成することを推奨しています。

![スクリーンショット 0004-02-07 10.28.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/461c2cde-4316-94dd-ccb7-f24fdbed1dbb.png)

また、ログイン時の二段階認証を必須にすることで、アカウントそれぞれの安全性を高めることもできます。

# これまでの権限設定: ５つのプリセット役割をユーザーに割り当てする

新しいユーザーを招待する場合、「そのユーザーがDashboardでどんな操作ができるか」を指定することができます。

これまでは、以下の画像のように５種類から１つを選ぶ方式でした。

![スクリーンショット-2020-12-17-22.24.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/b6501ca5-e518-3364-21da-ef9988c892e7.png)

そのため、「チームメンバーの追加・削除だけでも、管理者役割が必要」など、一部のケースで必要以上の権限を持つ役割を設定する必要が発生していました。

# これからの権限設定: 必要に応じて、複数の役割をユーザーに割り当て可能に

今回のアップデートから、１つのユーザーに複数の役割を設定できるようになりました。

![スクリーンショット 0004-02-07 10.48.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/616dfb4f-ba1c-24ed-7731-639cbcc46f5b.png)

これにより、必要な権限のみをユーザーに割り当てする運用が可能になります。

## 役割ごとの権限詳細は、ドキュメントから確認可能

新しく「IAM管理者」や「不審請求の申請のアナリスト」などの役割が追加されています。

これらの権限でできること・できないことについては、ドキュメントで詳細を確認することができます。

https://stripe.com/docs/dashboard/teams/roles

![スクリーンショット 0004-02-07 10.49.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/a493f3f3-2960-2912-93d8-5588d3b67785.png)

# 組み合わせの例（一部）

## 開発チームマネージャー向けの権限設定

### 想定される操作の例

- 新しいメンバーやアプリケーション用に、制限付きAPIキーを発行する
- 新しい開発メンバーの追加や、移動に伴う権限の変更を行う
- APIやイベントのログを確認する

###　対応する役割の組み合わせ例

- 開発者
- IAM管理者

## Connectの連結アカウントに関する操作も行うユーザーサポート担当者向けの権限設定

### 想定される操作の例

- 不審請求の申請を解決する
- 連結アカウントの情報を確認する
- 連結アカウントの編集やユーザーの追加を行う
- 返金操作を行う

### 対応する役割の組み合わせ例

- Connectアカウント登録のアナリスト
- サポートスペシャリスト

# おわりに

顧客データやビジネスの詳細などをより安全に運用するために、このアップデートを活用することができます。
すでに運用中のアカウントでもすぐに利用できますので、ぜひお試しください。

# [PR] Stripe開発者向け情報をQiitaにて配信中！
2021年12月よりQiitaにて、Stripe開発者のためのブログ記事更新を開始しました。

- [Stripe Updates]：開発者向けStripeアップデート紹介・解説
- ユースケース別のStripe製品や実装サンプルの紹介
- Stripeと外部サービス・OSSとの連携方法やTipsの紹介
- 初心者向けのチュートリアル(予定)

など、Stripeを利用してオンラインビジネスを始める方法について随時更新してまいります。

-> [Stripe Organizationsをフォローして最新情報をQiitaで受け取る](https://qiita.com/organizations/stripe)
【公式資料】GitLab社で学んだ最高の働き方

# はじめに

https://event.shoeisha.jp/devsumi/20220217/session/3711/

Developers Summit 2022で「GitLab社で学んだ最高の働き方」というセッションがありました。
そのセッションで使用された資料をみつけましたので、こちらを共有致します。

# GitLab社で学んだ最高の働き方

https://learn.gitlab.com/c/gitlab-presentation-developers-summit?x=JBqxmQ

## 目次

- GitLab: 会社とコミュニティ
- GitLab社に参画した理由の一つ
- 目的
- 今日のメインテーマ
- All-remoteとは
- 無駄なく効率よくコラボレーション
    - 同期と非同期コミュニケーション
        - 同期コミュニケーションと非同期コミュニケーション
        - 同期で非同期を加速させる
        - オンボーディング
        - Coffee Chat
    - コミュニケーション手段の使い分け
        - GitLabでのコミュニケーション手段の使い分け（1/2)
        - GitLabでのコミュニケーション手段の使い分け（2/2）
        - 手段の使い分けから伝えたいこと
    - ミーティングの進め方
        - ミーティングを進めないために：そもそもミーティングが必要か
        - ワークフローのポイント
        - Meetings 1.0
        - Live Doc Meetings: 複数人同時協力プレイでノートを取るミーティング
        - 実際のアジェンダ例：マネージャーとの1 on 1
        - 実際のアジェンダ例：ソリューションアーキテクトチーム
- Webミーティングの注意点
    - カメラはデフォルトでオン
    - どうすればカメラをオンにするカルチャーになるか
    - Hybrid calls are annoying: ハイブリッド通話は迷惑
    - ハイブリッド通話によって快適性の格差が発生する構図音質最高、遅延なし
- 気持ち良くメンバーとコラボレーション
    - Job Descriptionを超えた動き
        - 自分の担当範囲を超えて助け合う
        - Job Descriptionに関する誤解
        - 助け合いを阻害する仕組み
    - Manager as a Scrum Master
        - プロセスの整流化
        - Solutions Architect
        - エイドリアンの場合
    - 公開称賛をする制度
        - 公開称賛の制度により公開称賛の文化が生まれる
        - マネージャーによるメンバーへの公開称賛
        - Discretionary Bonus: 推薦制一時ボーナス
        - #thanks チャンネル
        - 実際に今まで紹介したことが全部GitLabでは完璧にできているのか
        - まとめ
javaScript91_DOMとイベント

DOMはDocument Object Modelの略称です。
JSはDOMを通してHTMLファイルを操作します。DOMを理解すればWebページを自由に操作することができます。
Document：　一つのHTMLファイル
Object：　HTMLファイルの全ての箇所をObjectに変換したという意味です。
Model：　モデルでオブジェクト間の関係性を表す。ノードが分かればobjectを取得することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/c9c6038d-53d2-db3d-d96f-e862f5e1392a.png)

Node(ノード）：webページを構成する最も基本的な部分。HTMLタグ、属性、テキストなどは全てノードと言えます。
ノードは下記の４種類に分類されます。
1 documentノード：HTMLファイル
2 要素ノード：HTMLタグ
3 属性ノード：要素の属性（例：id)
4 テキストノード：HTMLタグ内のテキスト
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/4c77030b-0ce6-e4e9-19aa-b71529bc6eec.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/6c67b1d1-4274-a57d-a32b-7f929088cacb.png)

例：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/7c09ea6e-3f63-89e6-b2e9-778497b2e7fe.png)


イベント：
イベントとはユーザとブラウザの間の相互行為をイベントと言います。
例えば、ボタンをクリック、ボタンを移動、Window画面を閉じる等。。。
イベント属性の中に対応するjsコードを書けば、イベントが発生する際に、
これらのJsコードが実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/385d6fc6-313b-15b4-c838-c7d6b3facb06.png)
しかし、HTMLファイルの中にイベントなどを書くと、コードの保守がしづらくなります。お勧めしません。scriptの中に書いてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/5f40d17e-66c7-e2de-7b56-bd0959f68236.png)