OmniAICreator/Qiita-1.07M huggingface dataset:
PowerAutomate カスタムコード開発用のヘルパーライブラリを放流してみた

# はじめに

[一つ前の記事](https://qiita.com/karuakun/private/a37af4bb98792ab57c6e)で PowerAutomate 用の MD5 計算用カスタムコネクターを C# のカスタムコードを使って実装したのですが、Web のインターフェイスからだとエラーも見づらいし、そもそも動作確認も行えないとなると更新もままならないのでこれをどうにかしていきます。

# 方針

下のブログでは [MS のドキュメント](https://docs.microsoft.com/en-us/connectors/custom-connectors/write-code) で定義されたクラス群をローカルの C# プロジェクトに追加し、実行時にデバック用のテストコンテキストを作ることで Visual Studio からカスタムコードをデバックする方法が紹介されています。

https://rambosan.hatenablog.com/entry/2021/08/17/235149

基本的には上記のブログのデバック方針を採用し、デバックに必要なクラス群とヘルパークラスを NuGet に登録することでより簡単にデバックできるようにしたライブラリをNuGetに放流してみました。

https://www.nuget.org/packages/PowerAutomateCustomCodeHelper/

# カスタムコードの制限

ローカルで開発できるとしても実行するのは PowerAutomate のカスタムコード基盤上なので当然ながら下記の制限に注意は必要です。前回の記事の制限を再掲します。

スクリプトの内容や実行に関しては次のような制限があります。

- スクリプトは [ScriptBase](https://docs.microsoft.com/en-us/connectors/custom-connectors/write-code#definition-of-supporting-classes-and-interfaces) クラスを継承した Script クラス内に全て記載する必要がある
- [インポート済みの名前空間](https://docs.microsoft.com/en-us/connectors/custom-connectors/write-code#supported-namespaces)のみ利用可能（外部ライブラリの参照は行えない）
- スクリプトの実行は 5 秒以内に完了する
- スクリプトのサイズは 1MB までにする
- 外部に通信する場合は、コンテキスト内の SendAsync メソッドを利用する

# 使い方

コンソールプロジェクトを作成し、必要な NuGet パッケージを追加します。

```
❯ mkdir sample
❯ cd sample
❯ dotnet new console
❯ dotnet add package PowerAutomateCustomCodeHelper
```

カスタムコードを実装するため、Script.cs ファイルを追加します。
コード自体は実行中の OperationId を出力するだけの単純な例になっています。

```cs:Script.cs
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using PowerAutomateCustomCodeHelper;

public class Script : ScriptBase
{
    public override async Task<HttpResponseMessage> ExecuteAsync()
    {
        await Task.CompletedTask;
        return new HttpResponseMessage
        {
            StatusCode = HttpStatusCode.OK,
            Content = CreateJsonContent((new JObject
            {
                ["OperationId"] = Context.OperationId,
                ["value"] = Context.Request.RequestUri.ToString(),
                ["Result"] = "Hello World"
            }).ToString())
        };
    }
}
```

続いて、Program.cs を次のように書き換え必要なデバック用コンテキストを作成して Script.cs の ExecuteAsync を呼び出すようにします。

```cs:Program.cs
using System;
using System.Threading.Tasks;
using PowerAutomateCustomCodeHelper;

namespace sample
{
    class Program
    {
        static async Task Main(string[] args)
        {
            var script = TestScriptHelper.CreateGetRequest<Script>("https://api.contoso.com/Sample?value=hoge", "Sample");
            var response = await script.ExecuteAsync();
            Console.WriteLine(await response.Content.ReadAsStringAsync());
        }
    }
}
```

プログラムを実行すると、次のような結果が得られます。

```
❯ dotnet run
{
  "OperationId": "Sample",
  "value": "https://api.contoso.com/Sample?value=hoge",
  "Result": "Hello World"
}
```

ローカルのコンソールアプリとして実装されているので、Visual Studio でも、Visual Studio Code でも好きな IDE を使ってローカルでテスト実行できますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36535/8262b1fa-3d1c-3d5a-e1bc-0a288d9741f5.png)

# おわりに

そういえば、Get 以外のメソッドも追加しなきゃダメですね。
あと、テストに必要そうな機能はなんだろう、、、
Couchbase Mobile アプリケーション開発：DockerによるSync Gateway環境構築


## はじめに

Sync Gatewayのテスト・検証環境を構築するため、以下のソフトウェア/バージョンをDockerを使って構築する手順を紹介します。

- Couchbase Server Enterprise v6.5.x
- Sync Gateway Enterprise v2.8.x

## Dockerネットワーク作成確認

Dockerコンテナーで環境を構築している場合は、Couchbase Serverも同じDockerネットワークで実行されている必要があります。


まだDockerネットワークが作成されていない場合は、作成します。ここでは、「workshop」という名前を用います。

```BASH
$ docker network create -d bridge  workshop
```

利用するローカルDockerネットワークが存在していることを確認する場合は、次のコマンドを実行します。

```BASH
$ docker network ls
```

## Couchbase Server

### Dockerイメージ取得

最初にDockerHubからDockerイメージを取得します。ターミナルから、以下を実行します。

```BASH
$ docker pull couchbase/server-sandbox:6.5.0
```

### Dockerコンテナ起動

次の方法でDockerコンテナを起動します。

```BASH
$ docker run -d --name cb-server --network workshop -p 8091-8094:8091-8094 -p 11210:11210 couchbase/server-sandbox:6.5.0
```



### Docker実行確認

次のコマンドを使用して、Dockerイメージが実行されていることを確認します。

```BASH
$ docker ps
```
Dockerプロセスが開始されていても、サーバーが起動するまでに数秒かかる場合があります。



### 起動ログ確認

次のコマンドを実行すると、Couchbase Serverの起動ログを表示できます。

```BASH
$ docker logs cb-server
```

### 実行確認：Web管理コンソールアクセス

- Couchbase　ServerのWeb管理コンソールを開きます。URLは、次の通りです：　　http://localhost:8091
- ユーザー名を「Administrator」、パスワードを「password」としてコンソールにログインします

## Sync Gateway

### Dockerイメージ取得

Docker　CloudからDockerイメージを取得します。

```BASH
$ docker pull couchbase/sync-gateway:2.8.0-enterprise
```

### Sync Gateway構成ファイルの編集


Sync Gatewayから、Couchbase　Serverに接続するために、サーバーのアドレスを指定する必要があります。

Couchbase Server Dockerコンテナを起動したときに設定した名前（例えば「cb-server」）により、既存の設定ファイルの値（例：「localhost」）を置き換えて構成ファイルを保存します。


```JSON
"server": "couchbase://cb-server"
```



### Dockerコンテナの起動

Sync Gateway構成ファイルを指定してSync Gatewayを起動します。

Sync Gateway構成ファイルを指定して、以下のようにコマンドを実行します。

ここでは、Sync Gateway構成ファイル（例：sync_gateway.json）が直下に含まれているフォルダ/ディレクトリからの実行例を示します。

#### Windowsでの実行方法

```BASH
docker run -p 4984-4985:4984-4985 --network workshop --name sync-gateway -d -v %cd%/sync_gateway.json:/etc/sync_gateway/sync_gateway.json couchbase/sync-gateway:2.8.0-enterprise -adminInterface :4985 /etc/sync_gateway/sync_gateway.json
```

#### Windows以外のプラットフォームでの実行方法

```BASH
$ cd c:\path\to\mobile-travel-sample\
$ docker run -p 4984-4985:4984-4985 --network workshop --name sync-gateway -d -v `pwd`/sync_gateway.json:/etc/sync_gateway/sync_gateway.json couchbase/sync-gateway:2.8.0-enterprise -adminInterface :4985 /etc/sync_gateway/sync_gateway.json
```

### Dockerプロセス確認

ターミナルウィンドウで次のコマンドを使用して、「sync-gateway」という名前のDockerコンテナが実行されていることを確認します。

```BASH
$ docker ps
```
 
### 起動ログ確認

次のコマンドを実行すると、いつでもログを表示できます。

```BASH
$ docker logs sync-gateway
```

#### 起動確認
ブラウザで下記のURLにアクセスします

http://127.0.0.1:4984

以下のようなJSON応答が返されることを確認します

```JSON
{"couchdb":"Welcome","vendor":{"name":"Couchbase Sync Gateway","version":"2.8"},"version":"Couchbase Sync Gateway/2.8.0(271;bf3ddf6) EE"}
```

## 参考情報

https://docs.couchbase.com/tutorials/mobile-travel-sample/swift/installation/docker.html
MySQLで使う基本的なコマンドまとめ

卒業研究のためにMysqlを使い始めたので、思い出せなくなった時のためにメモ。
実行環境：
 
* MacOs BigSur 11.6
* Python 3.9.7
* mysql  Ver 8.0.27 for macos11.6 on x86_64 (Homebrew)

##Mysqlモニタの起動##
```
mysql -u UserName -pPasswd
```
-u: ユーザーオプション
-p: パスワードオプション
パスワードオプションの後は、空白スペースを入れずにパスワードを打ち込む。打ち込まなくても-pで入力を終了すると次の行にパスワード入力のための文字が表示される。

###Mysqlモニタの終了###
```
exit(or quit)
```
Byeと表示されて終了

###データベースの作成###
```
CREATE DATABASE databaseName;
```
SQL文のコマンドは、大文字小文字の区別をしないのでこれでもできる。
「;」は絶対につける。付けないと命令が実行されない。

```
create database databaseName;
```

###データベースの一覧を表示###
```
SHOW DATABASES;
```

もちろん、これでもOK（これ以降は省略）

```
show databases;
```

database's'と複数形になっているので注意すること。

###データベースの指定###
```
use DatabaseName
```
useはSQL文ではないので、；をつける必要なない。
最初から使いたいデータベースがあれば、

```
mysql databaseName -u UserNam -pPasswd
```
と書くこともできる。

###今使っているデータベースの表示###
```
SELECT DATABASE();
```
###テーブルの作成###
```
CREATE TABLE tableName (ColumnName1 Type, ColumnName2,Type, ...)
```
みたいに何個も作れる。
でもなんかもっといい方法ありそう。

###全てのテーブルを表示###
```
SHOW TABLES;
```
これも複数形になっているので注意。

###テーブルのカラム情報を表示###
```
DESC tableName;
```
DESCはdiscribeの略。
どのカラムにどんな変数名があって、どんなタイプのデータが入っているのかがわかる。

###テーブルにデータを挿入###
```
INSERT INTO tableName VALUE(data1,data2,...)
```
dataの順番はカラムの一番上から順番に格納される。
バラバラに入れたいなら、

```
INSERT INTO tableName (columnName1,columnName2,...) VALUES(data1,data2,...)
```
みたいに順番を指定して、データを挿入する。

###カラムのデータを表示する###
```
SELECT columnName1,columnnName2,... FROM tabelName;
```
全部を表示したければ

```
SELECT * FROM tableName;
```
でOK

今のところ使いそうなものはこのくらいなので、多分大丈夫かな
[Bash] Visual Studio Codeにインストールしている全拡張機能をMarkdown出力するシェルスクリプト

# 動機

vscodeの機能拡張は`--list-extensions`オプションで一覧出力できます。

```console
% code --list-extensions
AzureADB2CTools.aadb2c
bencoleman.armview
bmewburn.vscode-intelephense-client
esbenp.prettier-vscode
formulahendry.dotnet-test-explorer
GitHub.remotehub
k--kato.docomment
```

機械的には十分なのですが、人間的にはどれがなんだかわからないので、Visual Studio Marketplaceに問い合わせて、見やすい名前を出力するようにしました。

# 完成品の結果

こんな感じに出力されます。

```console
% ./list-code-extensions.sh                                                                                                                                   
# Azure AD B2C
https://marketplace.visualstudio.com/items?itemName=AzureADB2CTools.aadb2c

Azure AD B2C custom policy extension


# ARM Template Viewer
https://marketplace.visualstudio.com/items?itemName=bencoleman.armview

Graphically display ARM templates in an interactive map view

                                                                                              
```

[Qiitaへ貼るとこんな](https://qiita.com/sengoku/items/1c190793626f639b4822)んです。

\# ヘッダのあとに改行入れずにURL書くと、OGPが展開されるんですね。便利。



# 作ったもの

curlとjq呼んでいるだけなのです。

```bash
#!/bin/bash

set -eu

generate_request()
{
    cat << EOT
{"assetTypes":null,"filters":[{"criteria":[{"filterType":7,"value":"${1}"}],"direction":2,"pageSize":100,"pageNumber":1,"sortBy":0,"sortOrder":0,"pagingToken":null}],"flags":103}
EOT
}

query_market()
{
    curl -s \
        -H "Content-Type: application/json" \
        -H "Accept: application/json;api-version=6.1-preview.1;excludeUrls=true" \
        -X POST \
        --data "$(generate_request $1)" \
        "https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery"
}

make_pretty()
{
    query_market "$1" \
    | jq -r '.results[0] | .extensions[0] | .displayName,.shortDescription'
}

main()
{
    local IFS=$'\n' GLOBIGNORE=\*

    env code --list-extensions | while read id
    do
        desc=($(make_pretty "${id}"))

        echo \# ${desc[0]//#/\\# }
        echo "https://marketplace.visualstudio.com/items?itemName=${id}"
        echo
        echo ${desc[1]}
        echo
        echo
    done
}

main
```

# 使い方

適当な名前（例えば、`list-code-extensions.sh`）で保存し、実行属性をつけて実行してください。

```console
./list-code-extensions.sh
```
React環境設定メモ

#環境
Windows 10

#前提
以下がインストール済みであること。
・VisualStudioCode
・node.js
・npm
※npmはNode.jsをインストールすると同時にインストールされる。

#手順

####1.ターミナルを開く
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2240956/b1fde9ac-5d2b-a56b-0537-62442de7f2c5.png"/>
####2.nodeとnpmのバージョン確認
```java:コマンド
node -v 
npm -v 
```

####3.Reactアプリケーションジェネレータcreate-react-appのインストール
```java:コマンド
npm install -g create-react-app
```

####4.Reactアプリケーション用のフォルダを作成
例：デスクトップにreactフォルダを作成する場合

```java:コマンド
mkdire C:\Users\username\Desktop\react
```

####5.作成したフォルダに移動
```java:コマンド
cd C:\Users\username\Desktop\react
```

####6.アプリケーション作成
例：アプリケーション名「reactTest」を作成する場合

```java:コマンド
create-react-app reactTest
```

####7.実行
```java:コマンド
cd reactTest
npm start
```
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2240956/782fee18-c866-c62f-0279-e8a001e57995.png"/>
GitHubで空のブランチと比較するPRを作りたい！

GitHubで空の状態と比較(マージ)するPRを作りたくなった場合。
そして最初のコミットですでに何らかのファイルがコミットされてしまっている場合。
そんな状態でも空のブランチへのPRを作れます！

# 方針

1. historyを切り離したまっさら(Orphan)なブランチを2つ(A、Bとする)作成
1. Aブランチに比較元のブランチ（Cとする）をマージ
1. まっさらなBブランチと比較元のコミットが入ったAブランチでPRを作成

# やり方

## historyを切り離したまっさら(Orphan)なブランチを2つ(AとBとする)作成

```bash
git checkout --orphan A
git rm -r --cached .
git clean -fxd
git commit --allow-empty -m "init"
git branch B
```

## Aブランチに比較元のブランチ(Cとする)をマージ

```bash
git merge --allow-unrelated-histories C
```

## まっさらなBブランチと比較元のコミットが入ったAブランチでPRを作成

```
# baseとなる比較先ブランチ (中身は空)
git push origin A
# compareとなる比較元ブランチ (中身はCブランチ)
git push origin B
```
あとはGitHubのPRをAとBで作ればOK！
【Swift】EurekaのImageRowにURLから画像を表示させる

EurekaのImageRowにURLから画像を表示させる方法。

Eurekaの入力フォームを用いて既存のデータを編集したりする際に、ImageRowにURLから画像を表示させたい。

## 使用ライブラリ

Eureka
入力フォーム用のライブラリ
https://github.com/xmartlabs/Eureka

ImageRow
Eurekaに画像用のフォームを追加したい時に使用するライブラリ
https://github.com/EurekaCommunity/ImageRow

SDWebImage
URLから画像を取得できるライブラリ
https://github.com/SDWebImage/SDWebImage

ライブラリのインストールについては以下の記事を参考にしてください。

https://qiita.com/ShinokiRyosei/items/3090290cb72434852460

https://qiita.com/tsuzuki817/items/8f6e2e0c2b3f9d197097

## 実装コード

まずEurekaとImageRowで画像用の入力フォームを作る。

```swift
import Eureka
import ImageRow

class InputForm: FormViewController {
    
    //ImageRowの画像を入れるための変数
    var selectedImage : UIImage? = UIImage(named: "dummy")

    override func viewDidLoad() {
        super.viewDidLoad()
        
        form
        +++ Section("画像を選択")
        <<< ImageRow() {
            //セルのタイトル
            $0.title = "画像"
            //セルに付与するタグ(後で使う)
            $0.tag = "image"
            //どこから画像を取得するか
            $0.sourceTypes = [.PhotoLibrary, .SavedPhotosAlbum, .Camera]
            //セル内の画像の削除を認めるか認めないか
            $0.clearAction = .yes(style: .destructive)
            //最初に表示されている画像
            $0.placeholderImage = UIImage(named: "dummy")
            $0.onChange { [unowned self] row in
                //フォームに変化があった時の処理
                print("changed!")
                // ?? を使ってrow.valueが削除されてnilになった時にダミー画像を入れるようにしないとクラッシュします
                self.selectedImage = row.value ?? UIImage(named: "dummy")
            }
        }
    }
}
```

次にSDWebImageを用いて、画像URLからImageRowの中身の画像を設定します。

```swift
import SDWebImage

if let imageRow = self.form.rowBy(tag: "image") as? ImageRow {
    if  let imageUrl = "画像URLをここに書く",
        let url = URL(string:imageUrl) {
        
        imageRow.placeholderImage = UIImage(named: "dummy")
        
        SDWebImageDownloader.shared.downloadImage(with: url, completed: { image, _, _, _ in

            //セル内のvalueにSDWebImageで取得した画像を設定
            imageRow.value = image
            //imageRowをリロードして新しい画像を表示させる
            imageRow.reload()
            
        })
    }
}
```
`rowBy(tag: "image")`で、最初のフォーム実装コードで設定したタグを呼び出すことで、操作するセルを指定します。

SDWebImageで画像を設定するコードは、入力フォームが表示され終わってから実行しないとタイミングがずれることがあります。

自分は`viewDidAppear`内に書いています。

https://qiita.com/euJcIKfcqwnzDui/items/d50dc4ec1ccc798fc03e

## Swiftのお役立ち情報

https://wagtechblog.com/programing/swift-iphone-application-school

https://wagtechblog.com/programing/swift-textbook.html
【RSpec】名前空間のあるモデルのFactory生成

##環境
Ruby 3.0.2
Rails 6.1.4.1


##名前空間のあるモデル

```model.rb
module Slack
  class Channel < ApplicationRecord
    ...
  end
end
```

##それに対するFactory生成

classで指定する

```spec/factories/slack/channels.rb
FactoryBot.define do
  factory :channel, class: Slack::Channel do
    ...
  end
end
```

↑がうまく行ってないと下記のエラーが出る

```
NameError: uninitialized constant
```

##参考

今回は使わなかったがlintを使うのも良さそう

https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#linting-factories
jps を associative array に格納する

## 取得
```bash:jps.sh
JPS=<PATH_TO_JPS>/jps

# 宣言
declare -A JPS_ASSOCIATE_ARRAY=(); 

# jps からの読み込み
while read -r a b; 
do
  JPS_ASSOCIATE_ARRAY["$a"]="$b"; 
done < <($JPS)

#結果

$ declare -p JPS_ASSOCIATE_ARRAY
declare -A JPS_ASSOCIATE_ARRAY ='([22870]="Jps" [2727]="CassandraDaemon" ...

```
## 使用方法
```bash
# zsh の場合

% echo ${(k) JPS_ASSOCIATE_ARRAY}          
"85853" "75014" "85855"

% echo ${(v) JPS_ASSOCIATE_ARRAY}
Jps org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar Jps

% echo ${(kv) JPS_ASSOCIATE_ARRAY}
"85853" Jps "75014" org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar 

# bash の場合

$ echo ${JPS_ASSOCIATE_ARRAY[@]}
3420 5749 6984 5516 6494 7649 10606 2727 9507 6507 9530

$ echo ${! JPS_ASSOCIATE_ARRAY[@]}
Bootstrap Jps .....
```

注1) Bash での Associate Array は Version 4 からになります。
注2) java 以外も ps -e -o pid,comm で代替可能
AndroidでFirebaseAuthを使用する際の証明書SHA-1（Debug, Release, PlayStore）

# 概要

Android で Firebase SDK の Authentication を使って Twitter の OAuth 認可機能を実装する場合、[コチラの手順](https://firebase.google.com/docs/auth/android/twitter-login?hl=ja)を見れば特に問題なく実装できると思いますが、以下 3 種類の SHA 証明書フィンガープリントを登録する必要がある点が、公式ドキュメントだと分かり難いかもしれないので解説します。

1. デバッグビルド時の証明書フィンガープリント（SHA-1）
1. リリースビルド時の証明書フィンガープリント（SHA-1）
1. PlayStore公開時の証明書フィンガープリント（SHA-1）

> Firebase の「プロジェクトの設定」-「マイアプリ」-「(対象のAndroidアプリ)」で「フィンガープリントの追加」で上記 3 つを次のように登録します。
> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2161417/b6bbf171-a13d-45a1-0efa-980859d86484.png)

## (1) デバッグビルド時の証明書フィンガープリント

以下のコマンドで確認できます。

```bash
keytool -list -v -keystore ~/.android/debug.keystore
```

- パスワードは何も入力せず Enter で OK
- 複数の担当者が居る場合、各担当者の SHA-1 も登録する必要があるかも（ワンオペ開発なので未確認）

> Android Studio で 1 回以上デバッグビルドを通しておく必要があります。

## (2) リリースビルド時の証明書フィンガープリント

以下のコマンドで確認できます。

```bash
keytool -list -v -keystore /path/to/app.keystore
```

> または、以下の手順でも確認できます。
> 1. PlayConsole https://play.google.com/console を開く
> 2. 対象アプリを選択
> 3. `設定` → `アプリの完全性` → `アップロード鍵の証明書` の SHA-1

## (3) PlayConsoleの証明書フィンガープリント

Googleのサーバに保管されているので、PlayConsole上で確認する必要があります。

1. PlayConsole https://play.google.com/console を開く
1. 対象アプリを選択
1. `設定` → `アプリの完全性` → `アプリ署名鍵の証明書` の SHA-1 からコピー

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2161417/c55e0b72-df11-9045-c445-05cd822e35e0.png)
【Cloud9】一つ前にcommitしたcommitメッセージを修正したい！

#間違ってcommitしてしまった

今回の記事では、git add の後に間違って
git commit -m "コミットメッセージ"してしまった時の
修正方法について解説をしていきます。

備忘録として残していますが、
すごく簡単なので参考にしてください！

##コマンド

まだリモートリポジトリにpushをしていなければ
一つ前のコミットメッセージの内容を修正できます。

ターミナル上でこのコマンドを入力してください。
ちなみにamendというのは英語で修正という意味になります。

```php

ec2-user:~/environment/... (main) $ git commit --amend

```

すると、こんな画面がでてきます。

```php

  GNU nano 2.9.8               /home/ec2-user/environment/workout/.git/COMMIT_EDITMSG                         

Merge pull request #41 from ***

[add] validation query color added to raty

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Author:    ***
# Date:      Tue Nov 2 11:59:25 2021 +0900
#
# On branch main
# Changes to be committed:
#       modified:   app/views/posts/edit.html.erb
#       modified:   app/views/posts/new.html.erb
#


```

[add] validation query color added to raty

今回の場合は↑がコミットメッセージになります。
これをカーソルを合わせて文字入力をすると修正できます。

入力が終わったら ctrl+xのexitを押します。
(windowsの場合のキーボード配列になります)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1810522/ed703775-d42c-a442-4db6-cbdf0acd40e1.png)

そうするとこの画面になるのでyを押します。
保存されてないように思いますがyを押した時点で上書きされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1810522/e3b5ddec-75e3-a562-25d0-efa5d63d6dbc.png)

またこの画面に戻ることになるので、enterを
クリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1810522/ed703775-d42c-a442-4db6-cbdf0acd40e1.png)

すると、ターミナルの画面に戻ってコミットメッセージの修正は
完了となりますよ！

修正が終わったら、適宜リモートリポジトリーにpushしてください♪

##まとめ

以上、commitメッセージを修正するときの解説をしました！

・git commit --amendで一つ前のcommitの修正可能
・修正したいコミットメッセージを修正
・保存したらターミナルに戻りリモートへpushする。

もし参考になったらLGMTをぽちっと押してくれてら
励みになります！

それでは！チャオ！
Kubernetesの便利コマンド

#基本コマンド
K・8・Sのプレイを確認するための比較的よく使うコマンドを紹介しよう。
#Podに接続
開幕、クラスタに接続

```
gcloud container clusters get-credentials --zone=[ゾーン名] [CLUSTER名] --project [PROJECT名]
```

稼働中のPodを表示して、様子をうかがいつつ

```
kubectl get pod
```

ヒット確認後、Pod名を指定して実行

```
kubectl exec -it [PodのNAME] /bin/ash
```
※「/bin/ash」の部分は「/bin/bash」になったりもする。

この基本コンボでPod内に入ることができる。

#再起動
一旦、距離をとって、Deployment等指定して再起動

```
kubectl rollout restart deploy [リソース名]
```

#おまけ
パナシにはなるが、curlだけを使用できるリソース作成

```
kubectl run -it --rm=true busybox --image=yauritux/busybox-curl --restart=Never
```
現場からは以上です。
【Swift資格】App Development with Swiftの科目がいつの間にか2つに分かれていた！

## はじめに
### なぜ投稿したか
Swiftの資格というのは数が少なく、現状（2021年11月2日時点）株式会社オデッセイコミュニケーションズが運営する「<b>App Development with Swift</b>」がSwiftの資格としては一番メジャーな資格ではないかと思います。

そんなApp Development with Swiftですが、これまで受験科目が「App Development with Swift Level 1」の1科目だけでしたが、最近？（いつかは不明）「App Development with Swift Certified User」と「App Development with Swift Associate」の2科目に分かれていました。
これに関する日本語の記事があまり出ていなかったので、本記事ではその科目の違いについて記載しています。

あとは、実際に受験してみての感想や皆さんが気になっている英語力なんかも記載しています。笑

### 注意点
- 科目の違いは[公式サイト](https://www.odyssey-com.co.jp/app-dev-with-swift/)の出題範囲から筆者の印象をもとに記載しています。
- 筆者は「App Development with Swift Certified User」の資格しか持っていないので、「App Development with Swift Associate」の学習教材は見ていません。
- 2021年11月2日時点の情報です。

## 試験について
### 出題範囲
それぞれの科目の出題範囲について記載します。
大項目のみ記載していますので、もっと詳しく見たい方は[公式サイト](https://www.odyssey-com.co.jp/app-dev-with-swift/)をご確認ください。

#### 「App Development with Swift Certified User」
- Xcodeの使い方
- Swift言語仕様
- iOS UIKit周りの知識

#### 「App Development with Swift Associate」
- アプリの計画・設計・理論に関わる知識
- InterfaceBuilderについての一般的な知識
- Swift言語仕様
- Xcodeのデバッグについて

### 内容の深さ、広さの違い
個人的に「Certified User」は開発者向き、「Associate」は管理者向きという印象を受けます。
（まあ英語のまんまですね。笑）

Swiftの言語仕様部分が被っていますが、小項目を見たところ多少必要な知識が異なる印象です。
Certified Userは「静的型付けや、論理演算子等の制御フロー、オプショナル型」など開発する上で必要になってくる知識、
Associateは「関数の記載方、配列操作、ループ構造の理解、命名規則」など、ソースを書くというよりかは見る上で必要になってくる知識が項目としてある印象です。

また他の項目についても同様で、Certified Userは開発におけるXcodeの使い方、UIKitでの画面遷移についてなど開発に必要な知識を深く知っておく必要があります。
一方AssociateはSwiftの言語だけでなく、アプリの計画やInterfaceBuilderの一般的な知識など、深さではなく基本的な内容を広く知っておく必要があるように感じます。

受験する科目は、今の自分の役割に応じて検討すべきですね！

## 最後に
### 難易度について（CertifiedUser）
基本的には学習教材の内容が出題されるので、それを読んで理解できる程度なら問題ないと思います。
あとは、StoryboardやSegue等UIKitを使用してアプリを作っている人ならそこまで難しくはないと思います。

### 英語力について
筆者は職場で英語に触れる機会が全くなく、海外旅行も韓国くらいしか行ったことがありません。
学習教材も英語部分は全く読まずSwiftで書かれていることだけを読み、内容を大体理解しました。笑

それでも合格できました。笑

一個の目安としては学習教材の章の最後にあるクイズで、問題文が何を言っているか分かれば本番もいけると思います。笑

## 以上
今後もSwiftの資格がたくさんできるといいですね。
爆速でNode.js開発環境構築する

# やりたいこと
複数のバージョンが混在可能なNodejs開発環境を構築したい。

# 解決策
Node Version Manager、通称nvmをインストールする。
Windowsの場合、まずはWSL2をセットアップしましょう。

# nvmセットアップ手順

[公式ドキュメント](https://github.com/nvm-sh/nvm#usage)に書いてあるとおり、インストールスクリプトを実行して、プロファイルに設定を追記します。

```shell:ターミナル
# インストール
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash

# プロファイルに設定を追記
echo "
export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm
" >> ~/.bash_profile
```

Macの場合、homebrewを利用するのが早いです。

```shell:ターミナル
brew install nvm
# 実行完了後に流れてくるメッセージの通りに対応する
```

以下でバージョンが表示されればOKです

```shell:ターミナル
nvm -v
```

# nodeLTS版のセットアップ

nvmのコマンドでノードのLTS版をセットアップします。

```shell:ターミナル
nvm install --lts --latest-npm
nvm alias default 'lts/*'
```

# 環境を削除する場合

```shell:ターミナル
rm -rf $NVM_DIR
```

以上です。
【Ruby】%wで配列を作る

##環境
Ruby 3.0.2

##配列の書き方

%記法は、要素が文字列リテラルかシンボルリテラルの場合に限り配列表現ができる。

array1、array2ともに同じ結果になる

```ruby
array1 = ['apple', 'grape', 'peach']
array2 = %w(apple grape peach)

#=> ["apple", "grape", "peach"]
```

丸カッコ以外でもいける

```
%w{...}
%w[...]
%w|...|
```

######小ネタ
wはwordから来ているらしい


##参考

https://docs.ruby-lang.org/ja/latest/doc/spec=2fliteral.html

https://qiita.com/mogulla3/items/46bb876391be07921743#3-w
golangのTimeについて

これ「なんでそんなこと思ったの？」って言われそう。

も大したことはないですが、
「現在時刻を変数に入れたら、数秒たった後って時間って進むの？」
結論から言えば、`now := time.Now()`をした場合、
その時刻が変数nowに格納されて時間経過で変化がないです。

以下、検証コード。

```golang
package main

import (
	"fmt"
	"time"
)

func main() {
	now := time.Now()
	// 変数
	fmt.Println("before    :", now.Format("2006-01-02T15:04:05Z07:00"))
	// Timeオブジェクト
	fmt.Println("beforeNow :", time.Now().Format("2006-01-02T15:04:05Z07:00"))
	fmt.Println("2秒待ちます")
	time.Sleep(time.Second * 2)
	// 変数
	fmt.Println("after    :", now.Format("2006-01-02T15:04:05Z07:00"))
	// Timeオブジェクト
	fmt.Println("afterNow :", time.Now().Format("2006-01-02T15:04:05Z07:00"))

}
```


```
$ go run main.go
before    : 2021-11-02T12:14:00+09:00
beforeNow : 2021-11-02T12:14:00+09:00
2秒待ちます
after    : 2021-11-02T12:14:00+09:00
afterNow : 2021-11-02T12:14:02+09:00
```

オブジェクトを表示してるafterNowだけが進んでます。
定期的に画像をwebpに変換するシェルを作ってみる

#画像をwebp(ウェッピー)に変換するシェルを作ってみる
##Googleが開発した○○.webpっていう規格がある。
軽量化されてページリロードが速くなる。
サイトスピードテストでもwebpを使用していると点数が上がるとか上がらないとか言われてますね

普段当たり前に使っていたけど、便利だなと思ったので普段自分が使っているものを紹介
このシェルはいろんなところで紹介されている?かもしれないが、環境によって若干書き方変わったりするかも。
自分が普段使ってるコードは下記

```
#!/bin/bash
#webp.sh
DIR="public/images"
JPEG_CWEBP_OPTS="-q 75 -m 4"
PNG_CWEBP_OPTS="-lossless"
CWEBP="/usr/bin/cwebp"

cd $(dirname $0)
shopt -s nocasematch

find $DIR -type f -regextype posix-extended -iregex ".*\.(jpe?g|png)$" -print0 | \

while IFS= read -r -d '' SRC; do
  WEBP="$SRC.webp"
  if [[ ! -e $WEBP || $SRC -nt $WEBP ]]; then
    if [[ $SRC =~ \.jpe?g$ ]]; then
      echo "Convert to lossy WebP: $SRC"
      "$CWEBP" $JPEG_CWEBP_OPTS "$SRC" -o "$WEBP"
    elif [[ $SRC =~ \.png$ ]]; then
      echo "Convert to lossless WebP: $SRC"
      "$CWEBP" $PNG_CWEBP_OPTS "$SRC" -o "$WEBP"
    fi
  fi
done
```

```
DIR="public/images"
```
対象ディレクトリを指定する。
public/imagesの画像をwebpに変換する

```
CWEBP="/usr/bin/cwebp"
```

って書いてあるからわかると思うけど、cwebpってやつがないと動かないので入れる。

```
yum install libwebp-tools
```

```
 $ which cwebp
/usr/bin/cwebp
```

うん、入った。

これで対象ディレクトリにpngとかjpgの画像配置して、このシェルを動かすと画像を変換して元画像と同階層に保存される。


これをwebサーバーに設置してクーロンで1日置きに変換するとか自動化したらまぁ便利。
でも、エラー検知のhooksはつけるべきだと思います。
ログが溜まってサーバー圧迫しないようにだけ注意してればとてもうれしくなれます。

以上です。
Dockerの備忘録 #2

# パワーシェル
WindowsにインストールされているコマンドラインでOSに指示を出すためのツール。
Windows版 Docker Desktopのユーザーは主にパワーシェルを使用してdockerコマンドを実行することでdockerを操作します（パワーシェル以外にも選択肢はありますが、本コースではパワーシェルを使用しています）。

# ファイルシステム
コンピューター上でファイルを管理するための機能のことをファイルシステムといいます。
通常ファイルシステムの機能はOSに備わっています。

# ストレージドライバ
ハードディスクなどのストレージにデータを書き込むための機能を持ったソフトウェアのこと。
ストレージドライバによってデータの書き込み形式や管理方法が異なります。

# AUFS
Dockerで使用できるストレージドライバの一種です。
Dockerの説明においてはファイルシステムの一種として解説されているものもあります。
Dockerイメージをどのようにストレージに保持するのかを司るソフトウェアとしてAUFSという選択肢があるという風に理解していただければと思います。
【RSpec】ハッシュの検証

##環境
Ruby 3.0.2
Rails 6.1.4.1

##ハッシュの検証

今まではハッシュのkeysとvaluesがそれぞれ期待する値で返っているかどうか一つ一つ検証していた。

```model.rb
User.published_articles
# => { user.id => [article1, article2], user2.id => [article3] }
```

```spec.rb
expect(User.published_articles.class).to eq Hash
expect(User.published_articles.keys[0]).to eq user.id
expect(User.published_articles.values[0][0]).to eq article1
expect(User.published_articles.values[0][1]).to eq article2
expect(User.published_articles.keys[1]).to eq user2.id
expect(User.published_articles.values[1][0]).to eq article3
```


ハッシュの形のままeqで比較すれば良い

```spec.rb
expect(User.published_articles).to eq(
   { user.id => [article1, article2], user2.id => [article3] }
)
```

ハッシュはハッシュは```==```で比較するときに要素の順序は考慮しないため
順番が入れ替わってもテストは成功する。

```spec.rb
expect(User.published_articles).to eq(
   { user2.id => [article3], user.id => [article1, article2] }
)
```

##参考

https://qiita.com/HMMNRST/items/fe13a50116c64229968c
chromeでjqueryを使ってWebフォームの入力項目を埋める

### 前提条件
Chorome バージョン: 95.0.4638.54（Official Build）

### 入力したい値を検索
F12→select an element in the page to inspect it
Elementsで該当箇所をコピー
IDやnameで該当するValueを確認

例）yahoo 天気で地名を入力場合
https://weather.yahoo.co.jp/weather/
ターゲットとなるセレクトボックス

`<input type="text" value="" id="searchText" name="p" size="35" data-rapid_p="1" style="color: rgb(153, 153, 153);">`

### consoleで入力項目を入力
#### inputの場合
`$('input[id="searchText"]').val('東京');`
Laravelでオブザーバーを通したくない時

# Observerを多用してると起きるかもしれないエラー
例えば削除した人を登録するようなロジックを組む場合、
オブザーバーの `deleteing()` イベントに `update()` を入れたいところ。
でもこれをすると `updating()` や `updated()` イベントが動くことに。
ここに削除したモデルを取得してごにょごにょする処理をいれているとエラーになることがありました。
そんなときは　`saveQuietly()` を使うとイベントが動かないようです。
Observer内でupdateやsaveを書くときはこのメソッドの存在を覚えておくとよさそうです。
名前にハイフンが含まれるファイルをインポートする方法

Pythonでファイル名に```-```(ハイフン)が含まれるファイルをモジュールとして「***import***」を使って読み込もうとしたらエラーが発生し、正常にインポートできなかったので解決した方法をまとめておく。

#importの使い方
import文は、次のように使用したいモジュールを指定する。

```python
import <モジュール名>
```
#問題
このimportを使用してファイル名に```-```(ハイフン)が含まれるファイルをモジュールとしてインポートしようとすると以下のようになる。

```python
// importの部分
import test-file

// エラー
import test-file
           ^
SyntaxError: invalid syntax
```
このように、SyntaxErrorが発生してしまい正常にインポートすることができない。

#解決策

***import_module()***を使用してモジュールをインポートすることで解決した。これを使用する場合は、***importlib***をインポートする必要がある。

```python
import importlib
           
module = importlib.import_module("test-file")
```
私的WSH/JScript総括①～なぜ今更しつこくWSH/JScriptなのか？

・バッチファイル感覚で書ける。
・実行する上で特段の準備（インストール等）が必要ない。

☆なんでバッチファイルじゃないのか？
・さすがに機能や仕様が貧弱すぎる。
・でもバッチファイルで済むことはバッチファイルで済ませる。

☆なんでPowerScriptじゃないのか？
・スクリプトファイルを実行出来るようにするために前準備（実行ポリシーの変更）が必要。
・ActiveXオブジェクトを直接扱えない。

☆なんでWSH/VBScriptじゃないのか？
・嫌い^H^H言語仕様が貧弱。Classはあるけれども。
・これから習得するとしてVB系orJavaScriptの二択ならJavaScriptでしょう。

★WSH/JScriptはここがいい。
・JScriptはES3レベルとはいえJavaScript。基本的な考え方は以降のバージョンにつながるものも多い。
・perl5レベルの正規表現が使えるので文字列処理も捗る。
・ファイルシステムは FileSystemObject というライブラリがあって一通りのことはできる。
・ActiveXオブジェクトを扱えるので、WordやExcelを嬲ることもできる。
・ActiveXオブジェクトを扱えるので、XMLやIEやHTTP RequestやADO等を嬲ることもできる。

なのでしつこく今でもWSH/JScriptを使い続けています。
Docker備忘録 #1

# Dockerデーモン
Dockerの常駐型プログラムで、Dockerコンテナの作成やDockerイメージの作成などDockerに対する操作はこのDockerデーモンが受け取り、実際の処理を行います。
Docker DesktopやDocker ToolboxといったソフトをインストールすることでDockerデーモンが起動します。
Dockerデーモンが起動していないとDockerに対する操作を受け取れないためエラーになります。
そのため、もし停止している場合には事前に起動しておく必要があります。

# Dockerクライアント
Dockerの利用者がDockerに指示を出すためのクライアントソフトのことを言います。
一般的にはdockerコマンドを用いてDockerに指示を出します。

# バインドマウント
DockerにおいてホストOS（Dockerデーモンが動作しているOS）上のファイルをコンテナに共有する機能をバインドマウントと言います。
ソフトウェアの開発時など、PCでソースコードを変更してDockerコンテナ上で実行したい場合などに、ソースコードのあるフォルダをコンテナにバインドマウントしてプログラムを実行するといった使い方がよくされます。

# Kubernetes
コンテナのオーケストレーションツールです。
オーケストレーションツールとは、主に複数のコンテナを効率良く管理するための機能が備わったツールのことです。
様々なコンテナが多数動作する環境において、使用するイメージ、コンテナへのCPUやメモリの割り当て、コンテナ停止時の復旧処理、パスワードなどの秘匿情報の管理、ストレージの割り当て、コンテナの稼働状況の監視等々様々なことを考慮する必要が出てくるため、管理するのは難しくなります。
Kuberntesはこういったコンテナ管理の機能を持ったソフトウェアであり、コンテナを管理するための設定ファイルを書くことで、様々なコンテナ管理の機能を利用することができます。
laravelでstorage配下の画像をシンボリックリンクを張らずに表示する方法


###/storage/app/images/の画像を表示してみる

フロント側(bladeファイル)

```
<img src="/get_request_image?name=test.png">
```
こんな感じで。
ディレクトリまで動的にする場合は、ディレクトリ名も渡してあげます。

```
//bladeファイル
<img src="/get_request_image?filename=dir_name01&name=test.png">
```
とりあえずルーティング書きます。

```
//web.php
Route::get('/get_request_image', 'TestController@get_request_image');
```

```
//TestController.php
public function get_request_image(Request $request){
        $data = $request->all();
        $path = storage_path("app/images/" . $data["file_name"]);
        return Response()->file($path);
    }
```

画像名を渡したらpathを返します。

images/配下も動的にしたい場合はディレクトリ名も受け取ります。

```
public function get_request_image(Request $request){
        $data = $request->all();
        $path = storage_path("app/images/" . $data["dir_name"] . $data["file_name"]);
        return Response()->file($path);
    }
```

こんな感じでどうでしょう。
【JavaScript】関数とオブジェクト⑱　ビルトインオブジェクトとラッパーオブジェクト



#はじめに

Udemyの[【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)の講座の振り返りです。

前回の記事

https://qiita.com/nao0725/items/22855dcefd673e4b447e

#目的

* 関数とオブジェクトについての理解を深める

#本題
###1.ビルトインオブジェクト

ビルトインオブジェクトとは、コード実行前にJSエンジン側で**自動的に**生成されるオブジェクト

````具体例.
String, Object, Number, Function, 
Math, Boolean, Date, Symbol, etc....
`````

####例1

windowオブジェクトにビルトインオブジェクトが格納されているか

````Console.
window
Window {window: Window, self: Window, document: document, name: '', location: Location, …}
alert: ƒ alert()
    :
    :
AbortController: ƒ AbortController()
AbortSignal: ƒ AbortSignal()
AbsoluteOrientationSensor: ƒ AbsoluteOrientationSensor()
AbstractRange: ƒ AbstractRange()
Accelerometer: ƒ Accelerometer()
AggregateError: ƒ AggregateError()
AnalyserNode: ƒ AnalyserNode()
Animation: ƒ Animation()
AnimationEffect: ƒ AnimationEffect()
AnimationEvent: ƒ AnimationEvent()
AnimationPlaybackEvent: ƒ AnimationPlaybackEvent()
AnimationTimeline: ƒ AnimationTimeline()
Array: ƒ Array()
     :
     :
`````

大文字から始まるものはすべてビルトインオブジェクト
殆どがインスタンス化をするためのコンストラクター関数になる

```Console.
window.Array
ƒ Array() { [native code] }
````

例えば、配列を定義するArrayを実行するとnative codeと出力される。JSエンジン側で用意されたものなので、中身を確認できない。

配列を使ってビルトインオブジェクトを定義する

```js
// コンストラクター関数を定義
// new演算子で初期化 window.Array(windowは省略できる)
const array = new Array(1,2,3,4);
// (4) [1, 2, 3, 4]配列として出力される
console.log(array);
````

###2.ラッパーオブジェクト

ラッパーオブジェクトとはプリミティブ値を内包するオブジェクト

####例1

文字列を定義するラッパーオブジェクト

```js
// コンストラクター関数を定義
// new演算子でStringを初期化
const a = new String("Hello");
console.log(a);
`````

この実行結果を見てみると下記の通りとなっている

````Console.
String {'Hello'}
0: "H"
1: "e"
2: "l"
3: "l"
4: "o"
length: 5
[[Prototype]]: String
anchor: ƒ anchor()
at: ƒ at()
big: ƒ big()
blink: ƒ blink()
   :
   :
toLocaleLowerCase: ƒ toLocaleLowerCase()
toLocaleUpperCase: ƒ toLocaleUpperCase()
   :
   :
````

Helloが一文字ずつ入っている
また、使用できるメソッドが並んでいる

試しにメソッドの１つを使用する

````js
const a = new String("Hello");
// HELLOと大文字で出力される（大文字にするメソッド）
console.log(a.toLocaleUpperCase());
`````

####例2

試しに数値を入れて、やってみる

````js
// 数値を引数に設定
const b = new Number(100);
// Number {100}という数値をもったオブジェクトが出力される
console.log(b);
// 試しにtoExponentialというメソッドを使用すると
console.log(b.toExponential());
// 1e+2と出力される（10の二乗を意味する）
`````

####例3

上記のように、明示的にインスタンス化は基本的に行わず、
下記のように表現する

`````js
// new Stringを省略
const a2 = "hello";
// この場合でもString型であると認識し、toLocaleUpperCaseを使用できる
console.log(a2.toLocaleUpperCase());
// 下記のように書くことも可能
const a3 = "hello".toLocaleUpperCase();
// 同様にHELLOとシュル力される
console.log(a3);
// 数値も同様
`````

今日はここまで！

#参考にさせて頂いた記事

* [【JS】ガチで学びたい人のためのJavaScriptメカニズム](https://www.udemy.com/course/javascript-essence/)
[oracle]APEX_JSONで文字化けせず日本語表示する

# APEX
いにしえの11g向け
12C以降はjson_objectのほうが幸せになれる希ガス

## 文字化け

```sql
APEX_JSON.write('name', 'ああああ');
```

```
"name":"\u3042\u3042\u3042\u3042"
```


##　対応策

```sql
APEX_JSON.write_raw('name', 'ああああ');
```

```
"name":ああああ
```

```sql
APEX_JSON.write_raw('name','"' || 'ああああ' || '"');
```

```
"name":"ああああ"
```

以上
ポンチ絵のすゝめ

リモートワークにより、オンライン会議もすっかり定着しました。
まだ一度も対面でお会いしたことの無い方との会議も珍しくない今日この頃です。

今回は、**オンライン会議で役に立つポンチ絵** について書いてみました。

# ポンチ絵とは？
概略図をイメージしていただければいいかと思います。
特に決まった書き方があるわけではないため、ラフに書くことが可能です。
[wikipedia参照](https://ja.wikipedia.org/wiki/%E3%83%9D%E3%83%B3%E3%83%81%E7%B5%B5#%E5%B7%A5%E6%A5%AD%E8%A3%BD%E5%93%81%E3%81%AE%E8%A8%AD%E8%A8%88%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%9D%E3%83%B3%E3%83%81%E7%B5%B5)

# なにがいいのか
以下２つの点に良さを感じています。

**１．共通認識を取ることが容易になる**
話す内容のドメイン知識が、会議の参加者で様々なケースは良くあるかと思います。
この場合にポンチ絵は、**参加者の共通認識を助けるとともに、議論を深めるのに役立つ** と考えています。

皆さんも一度は経験したことがあるかと思うのですが、議論が横道にそれて、気づいたら空中戦の様な状態になり、会議で何も決まらずに終わってしまう残念な状態は避けたいところです。
この状態になると、また別途会議が必要になり、結果的に業務時間のほとんどが会議で埋まるということになりかねません。

ポンチ絵があると、共通認識が簡単に取れるため、空中戦にならず、会議進行もスムーズになり、**結果的に重要な論点に対する議論する時間を確保できる** ため、何も決まらない残念な状態にはなりづらいと考えています。

**２．頭の整理ができる**
議題に対して自分の考えが纏まっていないと意見が言えず無駄に時間を使ってしまいます。
またファシリテーションする場合、整理ができていないと会議が露頭に迷うケースも有るかと思います。
そのため、他者に共有するためだけでなく、自分用にポンチ絵を書くのもオススメです。
**思考の整理に役立つ** かと思います。

# 描く時に意識していること
ポンチ絵を書くのにルールは無いと考えていますが、それでもいくつか気をつけていることがあります。

**１．細部にこだわりすぎない**
UMLやサーバ構成図といった正式なドキュメントとして残る類ではないケースが多いため、そこに時間を費やす意味はないと思います。
ざっくり全体像を把握することで、共通認識や思考の整理に役立てればそれで良いと思います。

**２．登場人物とINPUT/OUTPUTを明確にする**
ITの分野だと、ある情報のINPUTを受けたシステムがOUTPUTして、それが別のシステムのINPUTになるといったケースは多いかと思います。
そのため、**情報のIN/OUTの流れはちゃんと分かるよう** に意識します。
またこの時、情報の流れは同じ方向にします（左から右の場合なら、基本は全て同じ方向に矢印をつなげていきます）。

**３．色を多用しすぎない**
ポンチ絵に限らずですが、色を使いすぎると、色に何か意味があると捉えられ、逆に混乱するケースがあります。
そのため、基本は黒白で書いてしまうことが多いです。
色を使って分類した方がわかりやすい場合は、色分けして、凡例をのせることを意識しています。


# サンプル
このケースでは、ざっくりの概要と議論のテーマになりそうな点を余白にまとめるように工夫しました。
![ponchie.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1780140/eecb5871-92ba-b339-e2f2-79eb2fdeef89.png)


# さいごに
今後もリモートワークを続けていく企業は多いかと思います。
オンライン会議を効率良く進めることに悩んでいる方のヒントになれば幸いです。
Raspberry PiとJuliusでとにかく励ますロボット作ってみた


# 開発経緯
今回製作した励ますロボット「ぽじてぃぶだいあろーぐ」は、2021年9月18,19,25,26日の計4日にかけて行われた株式会社サポーターズ主催の「技育展」に向けた開発です。その中でも私は9月25日に行われた「はじめてのアウトプット３」に登壇させていただきました。

https://talent.supporterz.jp/geekten/2021/

登壇させていただくにあたって、どういったものを作ろうかと考えていた時、日々を生きていく上で、落ち込むことは誰しもあるものです。なので、落ち込んだ人を励ますロボットを作ろうと思いました！

![ぽじてぃぶだいあろーぐ.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1426467/fed4446e-aa57-bc77-aa2d-e439a7e49a26.jpeg "ぽじてぃぶだいあろーぐ")

# メカニズム＆使用技術
###使用したもの
- 使用マイコンボード：Raspberry Pi 3 Model B
- 使用言語：Python
- 使用音声認識システム：Julius

まとめると以下のようになります。
![技育展本番用スライド.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1426467/81e246b8-e6ab-068c-016c-51707e273532.jpeg "メカニズム&使用技術")

# 反省点

###1. 製作期間が1ヶ月と短かったこと

###2. 事前準備＆事前チェックを怠ったこと

###3. 安物買いしたこと


#今後取り組むべきこと

###1. 使用しなかった技術・機能を導入する

###2. 可動箇所を増やす

###3. 小型化する

###4. 認識できる文字列を増やす


#初めてアウトプットした感想

今回初めて、電子工作やプログラミングを用いたアウトプットをしました。慣れないことばかりで苦戦もしましたが、同時に作る喜びを感じることもできました。非常に貴重な経験が出来た上に、今後のアウトプットのきっかけにもなりました！

#参考サイト
以下は自分が参考にさせていただいたサイトです。
###Julius

https://www.pc-koubou.jp/magazine/20637

###PCA9685

https://rb-station.com/blogs/article/pca9685-raspbery-pi-python
Django modelformsetにはまった人

# 初めに
複数の同じformを入力する際にformsetを使用し実装を行うときにいくつかハマったので
メモを残す。

# 例:
以下のコードが今回formsetを使用するmodel, form, viewです。
内容は適当なので気にしないでください。

```python

# model
class User(models.Model):
   id = models.BigAutoField(primary_key=True)
   name = models.CharField(null=False, max_length=100)
   ...
   created_at = models.DateTimeField(auto_now_add=True)
   updated_at = models.DateTimeField(auto_now=True)

# form 
class UserForm(forms.ModelForm):
   use_required_attribute = False

   name = forms.CharField(...)
   ...
   class Meta:
      model = User
      fields = [ 'name', ...]

# view
class UserView(UpdateView):
  template_name = 'user_setting.html'
  model = User
  form_class = UserForm
  FormSet = modelformset_factory(User, form=UserForm, extra=0)

  def get_context_data(self, **kwargs):
     context = super().get_context_data(**kwargs)
     context['formset'] = self.FormSet(queryset=User.objects.filter(...).all())
     return context

  def form_valide(self, f):
     formset = self.FormSet(self.request.POST)
     if formset.is_valid():
       ....
     return redirect(self.get_cuccess_url())
```
HTMLはこんな感じ

```html
...
<!-- 入力欄 --->
{% csrf_token %}
{% for field in formset %}
  {{ field.name }}
  <!-- 他の項目 -->
{% endfor %}
...
```

# 事象1: ManagementFormデータが見つからないか、改竄されています
ManagementFormデータってなんぞやという感じで色々探したら、以下のように``formset.management_form``を挿入すれば良いとの事
## 改善策:

```html
<!-- 入力欄 --->
{% csrf_token %}
{{ formset.management_form }}
{% for field in formset %}
  {{ field.name }}
  <!-- 他の項目 -->
{% endfor %}
```

# 事象2:'id':['このフィールドは必須です。']
idってなにformの何処にも定義してないんだけどーって思いながらハマっていました。
よく見たらformsetに格納されているformにinstance設定されていないし。。。

## 改善策1：
```html
{% csrf_token %}
{{ formset.management_form }}
{% for field in formset %}
  <!-- instance情報が隠れているので追加する必要がある -->
  {% for hidden in field.hidden_fields %}
    {{ hidden }}
  {% endfor %}
  <!-- ここまで -->
  {{ field.name }}
  <!-- 他の項目 -->
{% endfor %}
```
## 改善策2:
```html
{% csrf_token %}
{{ formset.management_form }}
{% for field in formset %}
  <!-- instance情報が隠れているので追加する必要がある -->
  {{ field.id }}
  <!-- ここまで -->
  {{ field.name }}
  <!-- 他の項目 -->
{% endfor %}
```
できないエンジニアの特徴

## エンジニア単価表の記事はこちら！
https://i-ssue.com/topics/de478ab0-b0d1-4449-a8ff-0d4c8f403896

## はじめに

社会人になってから数年。数々の失敗を目撃 & 体験をしてきました。
その教訓で、改善すればより仕事も人間関係も円滑に進み、エンジニアとしても成長できるだろうなというネガティブな点をまとめてみました。
僕も過去できていなかったり、今もできていないところはありますが、反面教師として伝えられたらと思います。

## 特徴

### 1.納期に間に合わない時、自分から報告してこない

明確に期日が共有できているのにも関わらず、直前もしくは遅れる旨を報告してこないパターンです。
責任感がない人に多い気がします。実力不足であったり、実装していくうちにタスクの見積もりがずれることもあるので勇気を持って報告しましょう！

### 2.タスク分解しないで、仕事し始める

機能実装のような中規模以上のタスクは、DB変更など下のレイヤーが間違っているとその上位の実装も全て修正しなくてはいけなくなります。まずは、タスクをいくつかに分割しレビューなどをもらってから進めると戻りが少ないと思います。

### 3.進捗の見える化をしない

タスク分解と似ていますが、PRを全て出来上がった状態でやっとオープンにするなどが挙げられます。
一気に全て実装してしまうと方向性が間違っているときに、切り戻しが大変です。

見えるかの一例としては

- タスク分解したチェックボックスを作っておく
- 最初にPRは[WIP]で作成して、適度にpushする
- issueやPRに作業コメントを残しておく

### 4.Noと言えない

Noと言えず開発の質を下げてしまうパターンがあります。
例えば、Biz側の要望に全て応えようとした結果PRのスコープが広がりすぎるなどです。
この辺りは、慣れだと思いますがスコープの違う開発は別タスクとして切り出すようにBiz側に提案しましょう。

### 5.仕様でわからないところを適度に質問できない

仕様はわからないが「できない」というレッテルを貼られたくないために質問できない場合です。
その時点でわからないのには自分の実力不足か、システムの説明資料が足りない・わからないなどの原因が必ずあります。

寧ろ次に触るエンジニアがすぐ理解できるように、あなたがドキュメントを新しく作成する気概でいきましょう。

ただ、あなたがコード上や指定されているドキュメントを探し切れていない場合もあります。
どこまで調べてから聞けばいいかわからない方は質問前に下記資料は見ておくといいと思います。

- 関連issue
- 関連PR
- ドキュメント管理ツールのキーワード検索結果(confluenceやNotion, GitHub, Slack...)

### 6.工数に休日や残業を含めている人

創業初期のスタートアップなど例外はありますが、基本的に残業や休日を実装工数として計算することはやめましょう。
業務時間内でいかに、タスクを遂行するかが重要だと思います。時間外を工数に当ててしまうのが当たり前になると役職が上がった際も、部下に長時間労働を強いてしまう負の文化ができてしまいます。


### 7.客観的に自分の位置付けができない

例えば、自分の実力を適当に判断できない方です。実力差を認めてその人たちと自分とでは具体的に何が足りないのかを判断できず、成長の機会を逃してしまいます。あくまでその時点での判断です。プログラミングの世界では年下でも自分よりスキルを持っていることはありますし、リスペクトする気持ちを忘れないように私も心がけています。

### 8.仕組み化して効率化を図らない

繰り返し業務の効率化のためのドキュメントの作成やワークフローによる自動化です。例えば新規で参加したエンジニアから毎回同じ質問がくるというような場合ドキュメント作成、またドキュメントを探す手間を省くためにそのドキュメントの所在を統一しておくなどがあげられます。


### 9.反論=ケンカだと思っている人
物事を深掘りして改善ができなくなってしまいます。日々の業務で問題は必ず起きます。その際はメンバーと意見を交換しあい改善できるようにしなければなりません。
事業アイデアの壁打ちのように、話し合っていくうちに無駄な要素が削ぎ落とされて研磨されたアイデアができる要領です。



## まとめ
ここに書いたものは意識すれば全て改善できるものだと思います。僕は気づくまでに時間がかかってしまいましたが、これからエンジニアとして社会人として活躍されていく皆さんの助けになればと思います。
私自身も肝に銘じてこれから頑張ります。

以上です！読んでいただきありがとうございました！


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1658704/99588134-fda6-8a69-b5d8-849af2958710.png)
https://i-ssue.com/

エンジニアの副業やフリーランス、スキルアップについての情報発信してるのでフォローしていただけると励みになります！
[@twinsdevelopper](https://twitter.com/twinsdevelopper)
AWS LambdaにPythonサードパーティ製ライブラリを入れる

# はじめに

AWS Lambda はサーバレスでイベント駆動型のコンピューティングサービスであり、非常に手軽に使えるサービスとなっている。Amazon S3 のような AWS の他サービスから Lambda をトリガーすることもでき、使い勝手が良いのだがサードパーティ製ライブラリを扱う際にはひと手間かかってしまう。そこで本記事では、Python のサードパーティ製ライブラリを Lambda で扱うための方法を紹介する。[How to use external libraries in Lambda Function](https://wakeupcoders.medium.com/how-to-use-external-libraries-in-lambda-function-df1cee4a7c3a)、[Managing external libraries in AWS lambda functions](https://dev.to/alim1496/managing-external-libraries-in-aws-lambda-functions-1g0m) を参考にした。公式ドキュメントは[こちら](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-python.html)。

# 準備

まず Lambda を準備する。はじめにで述べた S3 にファイルが置かれるとそれをトリガーに Lambda が実行されるようなものは[チュートリアル: Amazon S3 トリガーを使用して Lambda 関数を呼び出す](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/with-s3-example.html)を参考にすれば作成可能。ランタイムは Python3.7 とした。

次に扱いたいライブラリの zip ファイルを作成する。以降、このファイルを読み込んでレイヤーを作成し、Lambda に追加することでライブラリを扱えるようになる。具体的な手順は以下。仮想環境など、仮に環境が変わっても問題ない状況で行うのが望ましい。今回はライブラリとして FastAPI をインストールする。

```bash
$ mkdir -p build/python/lib/python3.7/site-packages
$ pip install fastapi -t build/python/lib/python3.7/site-packages
```

上記の `python` フォルダを zip ファイルにしておく。

# レイヤー作成・追加

AWS マネジメントコンソール上で操作をしていく。まずレイヤーの作成を行う。左側のナビゲーションメニューから「レイヤー」を選択し、画面右上「レイヤーの作成」をクリック。以下画像のように、名前・ランタイムの設定、さらに「.zip ファイルをアップロード」を選択して先程作成した zip ファイルをアップロードし、「作成」をクリック。

![create_layer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769545/3ed97db8-4de5-c4cc-3dac-78b9c41441be.png)

作成後に以下のような画面が出るので、**バージョン ARN** をコピーしておく。

![version.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769545/2c4805f2-f3a4-2547-405a-5fbaf87b4f67.png)

次にレイヤーの追加を行う。左側のナビゲーションメニューから「関数」を選択し、レイヤーを追加したい Lambda 関数を選択。画面下へスクロールし、「レイヤーの追加」を選択。以下画像のように、「ARN を指定」を選択し、先ほどコピーしたバージョン ARN を入力して「追加」をクリック。

以上で、サードパーティ製ライブラリを扱えるようになる。

# おわりに

AWS Lambda にて、サードパーティ製ライブラリを扱えるよう関数にレイヤーを追加した。もっと Lambda を活用していきたい。
【React Native/Expo】Expoアプリを再起動する方法

任意のタイミングでアプリを再起動したいことがあります。[expo-updates](https://docs.expo.dev/versions/latest/sdk/updates/)を使うと再起動できます。

# インストール

```shell
expo install expo-updates
```

# 使い方

## 事前準備

`restart.js`を下記の内容で作成します。

```javascript
import * as Updates from 'expo-updates'

const Restart = () => {
  Updates.reloadAsync()
}

export { Restart }
```

## 再起動方法

```javascript
import { Restart } from './restart'

const ourFunction = () => {
  Restart()
}
```
not微分積分勉強者の統計検定3級合格記

##この記事について
ちょっとした備忘録。
統計検定3級を受ける人に少しでもハードルを下げるために書きます。

##私のスペック
統計検定4級持ちの専門卒。社会人2年目。高校は商業高校で数学ⅠAまで勉強しており、専門学校ではwebデザインを学ぶところに行ったので数学と無縁の2年間を過ごす。
（統計検定4級以外にも高校の頃に基本情報技術者試験は合格しているが、今回は全く役に立たず）
会社から取得するように言われ勉強を始める。

##勉強内容・時間
- 2015~2021の過去問を3通り解く
- 高校数学の問題、解説サイトを読む（https://yorikuwa.com/m4100/）
- データの分析公式まとめサイトを読む（https://univ-juken.com/data-bunseki-matome）

これらを合わせて50時間くらいしました。
CBT方式で受けるので、慣れのために紙に回答を書くのではなくスプレッドシートに回答を書いてました。
また、解説がない状態でやっていたので間違った問題はネット上で公式を探してもう一回自分で解いてみる、
それでもわからなければ潔く諦めるを繰り返しています。

##実際受験してみて
試験時間1時間をフル活用して合格しました。
内訳としては、以下の通りです。

- 評価得点**69点**（合格評価得点は65）
- セクション分析
    - データの種類・標本調査・実験・統計グラフ **92%**
    - データの代表値・散らばり・回帰 **69%**
    - 確率・確率分布・統計的な推測 **37%**
  
どんどん%が下がっていますが、一応これでも合格です。
極論65点で受かろうと100点で受かろうと統計検定3級取得しているという事実は同じなので、受かったし良かったぐらいの気持ちです。
過去問と違い注意することとしては、過去問が一通りの流れ（例：問5~8の使用データが同じ）で出題されるのに対し、
CBTは1問1問データが違うので毎回ちゃんと考えないといけないところです。
これで結構時間を食いました。受験される方は過去問を45分以下で解ききれるようになってから挑戦したほうがいいかもしれません。

##終わりに
はっきり言って個人的には未だ「は？」ってなっている部分もあります。
（ギリギリで受かったマン＆わからない問題を諦めた人間なので残当）
そう簡単に数学が得意になれるわけでもないですが、受からんこともないので、少しでも力になれれば幸いです。
Databricks Community EditionはDatabricksと何が違うのか？

Databricksでは、皆様が無料でDatabricksの機能を体感いただける環境として、無料のCommunity Editionをご利用いただけます。

Community Editionの使い方に関しては、[IBJP: Community Editionで始めるDatabricks \- Databricks](https://databricks.com/jp/international-blogs/get-started-with-databricks-community-edition-jp)をご覧ください。

上の記事にもあります様に、完全版のDatabricksとは機能レベルでは以下の違いがあります。

# クラスター

- 作成できるクラスターは15GB RAM、2 Core CPUのシングルノードのみです。
- 停止したクラスターを再度起動することができないので、削除した後で改めてクラスターを作成する必要があります。
- クラスターのリージョンはus-westのみとなります。
- [Databricksクラスターの設定](https://qiita.com/taka_yayoi/items/8d951b660cd87c6c5f18)に記載されている設定に関して、Community Editionで設定できるのは、インスタンスを起動するアベイラビリティゾーンと、Spark Config、環境変数のみとなります。

# ユーザー

- ワークスペースに追加できるユーザー数は最大3名までとなります。

# ファイルシステム

完全版のDatabricksでは、ドライバーノードのローカルファイルシステムにDBFS(Databricks File System)が`/dbfs/`にマウントされていますが、Community Editionではマウントされていません。このため、以下のPythonスクリプトは完全版のDatabricksでは動作しますが、Community Editionではエラーとなります。

```py:Python
import pandas as pd
df = pd.read_json('/dbfs/Users/takaaki.yayoi@databricks.com/Pete2.txt', lines=True)
```

ワークアラウンドとしては、以下の様に一度ローカルファイルシステムにファイルをコピーすることになります。

```py:Python
import pandas as pd
dbutils.fs.cp('/Users/takaaki.yayoi@databricks.com/Pete2.txt', 'file:/tmp/Pete2.txt')
df = pd.read_json("/tmp/Pete2.txt", lines=True)
```

## 使用できない機能

- ジョブのスケジュール機能
- クラスターのオートスケーリング機能
- Git連携(Repos)
- MLflowの一部モデル管理機能(モデルレジストリ、RESTサービング)
- 特徴量ストア
- REST APIによるワークスペースの制御
- セキュリティ、ロールベースのアクセス制御、監査、シングルサインオン
- Databricks SQL


### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
GradleのVersion catalogでcompileSdk等も管理する方法

他のことは全部下記に書いてあります。

https://star-zero.medium.com/gradle%E3%81%AEversion-catalog%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E7%AE%A1%E7%90%86-eb81f8e88444


# 環境

Android Studio Bumblebee | 2021.1.1 Beta 2

Bumblebeeでは`enableFeaturePreview('VERSION_CATALOGS')`の追加が必要でした。

```groovy:settings.gradle
pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
    }
}

enableFeaturePreview('VERSION_CATALOGS') // <- 追加
```

# コード

```toml:gradle/libs.versions.toml
[versions]
compileSdk = "31"
minSdk = "23"
targetSdk = "31"
```

```groovy:app/build.gradle
android {
    compileSdk libs.versions.compileSdk.get() as Integer // or get().toInteger()
...
...
...
}
```

# ダメだった例

下記だと怒られる。

```toml:gradle/libs.versions.toml
[versions]
compileSdk = 31
minSdk = 23
targetSdk = 31
```

# 参考

https://stackoverflow.com/a/1716699
Nuxt.jsでdataプロパティの書き換えを変数で指定する

#やりたいこと
例えば下記のようなdataオブジェクトがあったとき

```js
data: () => ({
    form: {
      name: '',
      email: '',
      birthday: ''
    },
  }),
```

`name`を更新するときはこのように書くと思います。

```js
this.form.name = 'xxxxx'
```

この`name`の部分と変更する値を変数で渡してやりたいということがあり、フロント初心者の私はハマったので備忘録としてメモしておきます。

`$set`を使い、このように書ける。

```js
this.$set(this.form, name, 'xxxxx')
```

これをmethodsで引数として受け取って処理しようとするとこんな感じで動いた。

```js
updateItem (key, value) {
    this.$set(this.form, key, value)
},
```
leafletを鍛える。その35

#概要

leafletを鍛えてみた。
gpx、表示してみた。

#写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d8d3dd46-1672-981c-1aa5-c29d5041e83c.png)

#サンプルコード

```
var map = L.map('map').setView([39.5, 139.5], 6);
var mapLink = '<a href="http://openstreetmap.org">OpenStreetMap</a>';
L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
  attribution: '&copy; ' + mapLink + ' Contributors',
  maxZoom: 18,
}).addTo(map);
var gpx = 'track_20211030-1.gpx';
new L.GPX(gpx, {
	async: true
}).on('loaded', function(e) {
	map.fitBounds(e.target.getBounds());
}).addTo(map);


```

#成果物

https://embed.plnkr.co/plunk/ewH8H0utY3DivFdN


以上。
raspberry pi 1 model bで、navit その14

#概要

raspberry pi 1 model bで、navitやってみる。
軽トラに、積んでみた。

#写真

![DSCN0552.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/cdacfe99-0efe-5a2a-8519-35a25d8c8cbf.jpeg)



以上。
地元のITエンジニア養成スクールに参加した

#ITエンジニア養成スクールとは
ITエンジニア養成スクールとは、僕の地元の福井県の産業センターとテックアカデミーが福井県にIT人材を増やす一環として行っているものです。
今年から始まりました。

内容を具体的に言うと、期間は4ヶ月間で、テックアカデミーが用意した３つの教材（初めてのプログラミングコース、Webアプリケーションコース、フロントエンドコース）を
期間内に個別につくメンターさんと行います。

基本はオンラインですが、オリジナルのポートフォリオを産業支援センターとタイアップしている企業さんにプレゼンする機会があったりなど、オフラインで交流する機会もあったします。

いい所は、コスパがいい所です。
値段は4ヶ月で五万円です。テックアカデミーを4ヶ月受講しようと思ったら、５０万近くはかかると思います。それで、同じサービスを提供していて、かつオフラインで交流する機会も設けてくれているので、結構いいサービスだと思います。



#なぜ参加したのか

参加した理由に関しては、プログラミングにある程度の時間費やしたと証明するためと、ある程度の技術を身につけた事を証明するためです。

もちろん、この２つを証明する手段は他に沢山あると思いますが、５万円でそれがある程度達成できるので、結構いい手段かなと思い参加を決意しました。

あと、IT企業がタイアップしている所も参加をするきっかけになりました。


#現在の状況
現在は、開始から２週間目で、初めてのプログラミングコースを終え、Webアプリケーションコースに取り組んでいます。