OmniAICreator/Qiita-1.07M huggingface dataset:
#PowerApps のデータから作るアプリに選択したレコードの内容をコピーする機能を実装する方法

Power Apps には、一から作成するだけでなく、データから作成する方法もあります。
いろんなデータソースを元に、自動的にいい感じのアプリを作ってくれる素晴らしい機能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/7d95c1be-4bea-635a-8184-a6ce645e1727.png)


下手すれば、たった数オペレーションでできてしまうという優れもの。
この「データから開始」という機能、Power Apps を使っている皆さんなら、一度は使ったことがある機能じゃないかと思います。

ですが、生成されたアプリの機能は

* 新規作成
* 編集
* 削除

この3つだけです。

でも、特定のレコードを「コピー」して「新規作成」したいという要望は非常に多いと思います。

そこで、本投稿では、新規作成時に、内容をコピーする機能を実装する方法を記載したいと思います。

# まずはアプリを作成します

とりあえず SharePoint のデータを作ってアプリを作成します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/1dd99cca-168a-f06b-c9af-ab80a5ecf3f9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/d5c0d627-0069-5f02-bea0-cdc71ac50c77.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/f7d69a87-ea73-2f9f-15ec-c1acc2b8c062.png)

# コピーアイコンの実装

DetailScreen1を選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/e6a67dd1-ae63-0c23-51ef-a7865cdea23d.png)


アイコンからコピーを選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/3fe0a82a-b3bd-b955-ae9a-c3e0820baf01.png)


ヘッダーに配置し、他のアイコンと色などを合わせます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/db2bc993-3563-f704-730a-94dfdf66d45f.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/a3f65b82-1590-7946-5986-2c69f13cfffd.png)


コピーアイコンの OnSelect プロパティに以下の内容を入力します

```
NewForm(EditForm1);
Navigate(EditScreen1, ScreenTransition.None);
Set(NewFormMode,"copy");
```

# 新規作成・編集アイコンの修正

編集アイコンを選択し、OnSelectプロパティを以下のように変更します

```
EditForm(EditForm1);
Navigate(EditScreen1, ScreenTransition.None);
Set(NewFormMode,"Edit");
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/e3c53df7-270a-c5ce-5e48-b1e19638a6cd.png)


BrowseScreen1 を選択します

新規作成アイコンを選択し、OnSelectプロパティを以下のように変更します

```
EditForm(EditForm1);
Navigate(EditScreen1, ScreenTransition.None);
Set(NewFormMode,"New");
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/834eb72c-f419-4ea0-825e-e0476a75c120.png)



# フォームの修正

EditScreen1を選択します

コピー対象のフォームの入力プロパティのロックを解除します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/f2f811cf-35b3-c42b-54a9-510ef345defd.png)


各フォームの入力項目にある Default に以下の内容を指定します

```
Switch(NewFormMode,
    "New","",
    "Edit",Parent.Default,
    "copy",BrowseGallery1.Selected.<列名>
    ,""
)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269159/510946e1-951a-60c1-e9b9-96096f7317d2.png)



# 送信アイコンの修正

送信アイコンの OnSelect プロパティを以下のように変更します

```
SubmitForm(EditForm1);
ResetForm(EditForm1);
Set(NewFormMode,"None");
```

# BrowseScreen1 の設定

BrowseScreen1 を選択します

OnVisible プロパティに以下を設定します

```
Set(NewFormMode,"None");
```

# まとめ

内容をコピーしてデータを新規登録したいっていう要望は結構多いかと思います。
ただ、それを実装するには関数などをいろいろと使わないといけなくなり、そこで挫折する場合も多いんじゃないでしょうか。

この記事が少しでも多くの方のためになれば幸いです！
Laravelでphp artisan serveしたらYour Composer dependencies require a PHP versionがでた

こんにちは、JeffTechです。


# 説明
今回、MAMPのhtdocs内にLaravelプロジェクトをインストールして、`php artisan serve`をしたら、エラーに悩まされたので解決方法を解説します。

また、その後解決したかと思ったら、MacのターミナルでPHPのバージョンを確認するとPHP８なのに、VSCodeのターミナルだとPHP７.3になるという現象が。。。

なんとか解決したのでとりあえずやり方を！

```
Fatal error: Composer detected issues in your platform: Your Composer dependencies require a PHP version ">= 8.0.2". You are running 7.3.29-to-be-removed-in-future-macOS. in /Applications/MAMP/htdocs/firstapp/vendor/composer/platform_check.php on line 24
```

# 開発環境
- MAMP
- PHP 7.3
- Laravel 6

# エラー文
Fatal error: Composer detected issues in your platform: Your Composer dependencies require a PHP version ">= 8.0.2". You are running 7.3.29-to-be-removed-in-future-macOS. in /Applications/MAMP/htdocs/firstapp/vendor/composer/platform_check.php on line 24

# エラー解決法
エラーの内容は簡単です。
PHPのバージョンを8.0.2以上にしてくださいというものです。

幸い私はMAMPを使用していたので、MAMPの設定からPHPを簡単に変えることができました。
`PHP version:`を8.0.2以上の8.0.8にしてください。
![スクリーンショット 2021-12-15 18.24.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/658326/9be830e4-a3fc-861c-4061-329f895ead32.png)
これで一旦MAMPを再起動して、改めて`php artisan serve`をすると、無事にLaravelのWelcomeページが表示されました！

# 問題発生
Macのターミナルでは`php artisan serve`できるのに、VSCodeのターミナルでは`php artisan serve`できないという問題が起こりました。

とりあえず、`which php`コマンドをどちらのターミナルでも実行してみます。

```bash:Macのターミナル
$ which php
/opt/homebrew/bin/php
```

```bash:VSCodeのターミナル
$ which php
/usr/bin/php
```
これが原因そう。。。

VSCodeの設定をいじるので、`Ctrl` + `,(カンマ)`で設定を開いて、`terminal.integrated.shell.os`と入力すると、MaｃOSで使用される規定のプロファイル設定ができるので、zshを選択して、ターミナルを再起動してください。

そうすると、、、

```bash:ターミナル
$ php -v
PHP 8.0.13 (cli) (built: Nov 28 2021 13:12:46) ( NTS )
```

8.0.13になった！

とりあえず治ったのですが、これでいいのだろうか。。。



# 最後に
少しでも役に立った！という時は、いいねをポチッとして
フォローしてくださると嬉しいです、、、笑

役に立たなかった時は、怒らないでコメント頂けますと幸いです笑

Twitterもやってますので、よかったら見てみてくださいね！
https://twitter.com/jefftechsaku
csvのヘッダー比較でつまづいた 

csvの内容を登録する機能を実装していた時に詰まった話です。

## 結論
BOMに気をつけましょう

https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E9%A0%86%E3%83%9E%E3%83%BC%E3%82%AF

## 何が起きたか
### 実装内容

csvのヘッダーを比較して項目に過不足がないか確認する為に下記のような実装を行なった。

```php
<?php
class test{
    private const CSV_HEADERS = [
        'No.',
        '姓',
        '名',
    ]

    public function handle(){
        // csvのヘッダー項目を要素にもつ配列 $firstLine が存在する想定
        // 例: $firstLine = ['No.','姓', '名'];
        if(!empty($missingHeader = array_diff(self::CSV_HEADER, $firltLine))){
            // $missingHeader に存在しないヘッダー項目があるので出力する
        }
        // 以下 array_diff() の引数の順序を変更して余計な項目が存在しないかチェック
    }
}
```

ローカルでも動作確認が取れていたのですが、実際にテストを行なってもらうとエラーとなる場合があるようでした。
### エラー内容
エラー内容は `No. が存在しません` という内容の出力でした。
該当のテストで使用されたcsvはexcelで文字コードUTF-8を指定して出力したものでした。

### 原因特定の為に何をしたか
① 文字コードのチェック

```shell
file --mime sample.csv
# => sample.csv: application/csv; charset=utf-8
```
UTF-8でした

② 文字列比較時の文字コードチェック
ヘッダー項目１つずつに対して、 `mb_etect_encoding()` を使用して、文字コードを確認しました。

```php
$defEnc = mb_detect_encoding($def); // php内定義のヘッダー項目
$actualEnc = mb_detect_encoding($actual); // csvの項目のヘッダー項目

var_dump($defEnc);
// => string(5) "ASCII"
var_dump($actualEnc);
// => string(5) "UTF-8"
```
ここで1つ目の項目 No. の文字コードが違うことに気づきます。
ここで文字コードに関して知識があれば理由がわかったと思いますが、
自分は文字コード何もわからん状態だったので無理矢理 UTF-8 の No. をASCIIに変更する実装をしました。

### どうなった
次の日に他の人がエラーに関するやりとりを見ており、バイナリから BOM が原因だということを知りました。

## BOMとは？
BOM は　バイト順マークのことです。
>プログラムがテキストデータを読み込む時、その先頭の数バイトからそのデータがUnicodeで表現されていること、また符号化形式（エンコーディング）としてどれを使用しているかを判別できるようにしたものである。

https://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E9%A0%86%E3%83%9E%E3%83%BC%E3%82%AF

BOMがファイルの頭についていたのが原因でした。

### なぜ気づかなかったか
エディタやPHP DEBUG などで処理を止めて確認しても目視できない為

### どうやって確認すれば良いか
ファイルのバイナリを見て確認ができます。

```shell
hexdump sample.csv
# => 0000000 ef bb bf ・・・
```
hexdump した 最初の3バイトが ef bb bf となっています。
これは UTF-8 のBOMです。
文字コードによってBOMは変わります。

## 結果
BOM削除処理を挟んだら正しく処理が通るようになりました。

```php 

<?php
class test{
    private const CSV_HEADERS = [
        'No.',
        '姓',
        '名',
    ]

    public function handle(){
        // csvのヘッダー項目を要素にもつ配列 $firstLine が存在する想定
        // BOM削除処理
        $bom = hex2bin('EFBBBF');
        $firstLine[0] = preg_replace("/\A{$bom}/", '', $firstLine[0]);
        if(!empty($missingHeader = array_diff(self::CSV_HEADER, $firltLine))){
            // $missingHeader に存在しないヘッダー項目があるので出力する
        }
    }
}
```

## まとめ

これを機に少しだけ文字コードに関して調べて、UTF-8 と ASCII の関係など文字コードに関して少しだけ理解が深まった気がします。
ありがとうBOM(嘘)

~~そもそも UTF-8 は ASCII と同じ部分は1バイトで扱うので本当に同じ文字なら比較で false になることはないということをあらかじめ知っていればこんなことにはならなかった。~~

https://ja.wikipedia.org/wiki/UTF-8

https://ja.wikipedia.org/wiki/ASCII
AuroraPostgreSQL 拡張モニタリングによるプロセス監視について

#はじめに
本記事に記載している情報は2021/12/15時点での情報になります。

#概要
Auroraの拡張モニタリングによってCloudWatch Logsに保存されるようになったOSメトリクスの情報(主にプロセスの情報)をダッシュボードに表示したくて試行錯誤した備忘録

#欲しい情報
特定プロセスのメモリ使用状況を取得したい
「RDSOSMetrics」というロググループ内にログストリームが保存されている
ストリームのメッセージはJSON形式になっている
肝心のプロセス情報は「$.processList[]」でアクセス出来る
例:
 
```
{
    "engine": "aurora-postgresql",
    ...
    "processList": [
        {
            "vss": 12345,
            "name": "OS processes",
            "tgid": 0,
            "parentID": 0,
            "memoryUsedPc": 0.02,
            "cpuUsedPc": 0.05,
            "id": 0,
            "rss": 12345,
            "vmlimit": 0
        },
        {...}
}
```

#メトリクスフィルタを利用
利用したかったが、配列の子要素全体にアクセスする術が見つけられず断念

#Log Insightsを利用
こちらも配列の子要素全体にアクセスして特定プロセスのメモリ使用率を取得することは難しかったが、以下のコードで無理やり実現した

```
fields @logStream
| sort @timestamp desc
| limit 20
| filter @logStream="db-XXXXXXXXXXXXXXXXXXXXXXXXXX"
| parse @message "\"name\":\"[プロセス名]\",\"tgid\":*,\"parentID\":*,\"memoryUsedPc\":*," as tgid,parentID,mem_used
  |stats avg( mem_used ) by bin(1m) 
```

これをダッシュボードに登録すれば問題ないと思っていたのだが、料金体系の問題が発生した。

まず、Insightsの料金体系の前提として[Insightsは読み込んだデータ量によって課金が発生する。](https://aws.amazon.com/jp/cloudwatch/pricing/ )
そのため、クエリ実行時に読み込むデータの期間は必要最低限にとどめる必要がある。
続いてダッシュボードに持っていったInsightsの仕様だが、
>"ダッシュボードに追加したクエリは、ダッシュボードをロードおよび更新するたびに再実行されます。"
> https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/CWL_ExportQueryResults.html

上記のとおり、ダッシュボードを表示する度にクエリが実行される仕様らしいので、データ量次第では大変な事になる可能性がある。
また、ダッシュボード上でのInsightsのデータ読み込み期間だが、 **ダッシュボード上で指定した期間と同じ期間指定となる。**
なので間違って1年とか指定した日にゃたまったもんじゃない…かもしれない。
ダッシュボードはポチポチ気軽に弄りたいので断念。

#今後
メトリクスフィルタでもう少し頑張ってみる。
それでも無理ならLambda辺りでデータ加工を実施する?正直未定。
[py2rb] wraps

# はじめに
移植やってます。
# wraps (Python)
```python
from functools import wraps
def my_decorator(f):
    @wraps(f)
    def wrapper(*args, **kwds):
        print('Calling decorated function')
        return f(*args, **kwds)
    return wrapper

@my_decorator
def example():
    print('Called example function')

if __name__=="__main__":
  example()
  print("example関数名",example.__name__)
  print("example関数doc",example.__doc__)

# Calling decorated function
# Called example function
# example
# Docstring
```
https://docs.python.org/ja/3/library/functools.html

公式ドキュメントの`wraps`の使用例です。
`f`が定義されていないように見えるのですが、ここでは、~~`f=example()`~~`f=example`として処理されています。
# どうする？ (Ruby)
```ruby
def my_decorator(f)
  wraper = proc {
    puts "Calling decorated function"
    puts "Name: #{__method__}"
    f.call()
    puts "After decorated function"
  }
  wraper.call
end

def example()
  puts "Called example function"
end

my_decorator(method(:example))

# Calling decorated function
# Name: my_decorator      
# Called example function 
# After decorated function
```
引数が無いのならいけそう？
しかし、これだけだったら関数を渡すだけでもできてしまう。

```ruby
def my_decorator(f)
  def wraper(f)
    puts "Calling decorated function"
    puts "Name: #{__method__}"
    f.call()
    puts "After decorated function"
  end
  wraper(f)
end

def example()
  puts "Called example function"
end

my_decorator(method(:example))

# Calling decorated function
# Name: wraper
# Called example function 
# After decorated function
```
これで、`f`は`wraper`メソッドの中に入りました。
ここで、スコープやメモ化等の差異を出せれば意味があるものになるかも。
# メモ
+ Python の wraps を学習した
+ 道のりは遠そう
もう怖くないSpring × Junit5 ~前編~

# はじめに
テスト？なにそれ、美味しいの？
テスト？俺の実装完璧だし。テストなんていらん。
テスト？Junit？なんかコワイ。。。((((;ﾟДﾟ))))ｶﾞｸｶﾞｸﾌﾞﾙﾌﾞﾙ

っていう人もそうでない人もJunitと触れ合いましょう。

## テストクラスの作り方
eclipseの例
### 1.作りたいテストを選ぶ
![20190725もう怖くないspring×Junit5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263851/95e73472-c4f3-d348-f9b9-4d6ae8835f2c.png)

### 2.テスト作るウィザード立ち上げる
![もう怖くないspring×Junit5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263851/03fc3588-24e5-6a16-a2b1-524cb4c3a223.png)

### 3.テストフォルダを選択する
![もう怖くないspring×Junit5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263851/9f92d88e-a1dc-5ac3-13dc-0b5dc34c8819.png)

### 4.できた!
![もう怖くないspring×Junit5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263851/3ac6b48b-2573-0edb-631e-c6172527f6e9.png)

## 単純なテスト
### 1.普通のテストを作る
![もう怖くないspring×Junit5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263851/3d40dc2e-a267-9662-c77d-e76d91d20fae.png)

### 2.わざとエラーになるように作る
![もう怖くないspring×Junit5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263851/07a3ae05-7e8b-3938-8f10-26d095205f9f.png)

### 3.実行！の前にいくつかポイント
![もう怖くないspring×Junit5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263851/32fac25c-5b00-d8c8-b551-43a67a3e4650.png)
hamcrest Matcherについては[こちら](https://qiita.com/opengl-8080/items/e57dab6e1fa5940850a3)ご参照ください。

### 4.実行！
![5もう怖くないspring×Junit5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263851/df3cb584-e366-e4c6-9c96-89166cb6772a.png)

### 5.結果（エラー）
![もう怖くないspring×Junit5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263851/8405a3ba-7803-96e9-8c39-81b517e72647.png)

### 6.通るように直す
![もう怖くないspring×Junit5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263851/1a4cdd2f-dc93-040f-dce7-36d07f93d476.png)

### 7.実行結果（成功）
![もう怖くないspring×Junit5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263851/34df971f-5cab-9207-7338-c1cb1ef3d458.png)

## 最後に
[もう怖くないSpring × Junit5 ~中編~](https://qiita.com/sho-yamashita/items/ec763cbb1924552ad112)につづく
VRChatプレイヤーによるParticle System解説 ～Emission Module編～

:::note warn
この記事はUnity 2019.4.29f1の記事です
:::
[Main Module編](https://qiita.com/abcde_kind/items/82cddca8be2917c0bded) <<  ここ  >> [Shape Module編](https://qiita.com/abcde_kind/items/e47a8f0c0f1077b314e6)
# はじめに
この記事は**ちょっとParticle System触れるようになったけどまだまだ知らないパラメーターだらけで抵抗感がある人向け**にじゃあ全項目解説しようという記事です。

**パーティクル？シェーダー？憧れるけどよくわかんない…**という人は最近は[VRCUnity勉強会][link-1]などで初歩の初歩から解説してくれる講座などが解説されているのでそこに参加してみたりするといいでしょう。
[link-1]:https://discord.gg/mtvTTyM
その他にこの記事はアドベントカレンダーにしてParticle Systemの記事を増やしてパーティクルへの抵抗感を減らしてやろうという企みもあります。

##Emission Moduleってどこ？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2386883/bab02c92-3d21-0fe1-3328-06c6606ad492.png)
ここのEmissionって書いてあるやつ

##本題
####Rate over Time
デフォルト 10 (0~1e+07)
単位 個/秒
**1秒間に放出されるパーティクル数を決めるパラメーター**
説明不要
####Rate over Distance
デフォルト 0 (0~1e+07)
**このオブジェクトが移動した時に比例してどれだけの数パーティクルが出てくるか決めるパラメーター**
どういう時に使うかと言うとParticle Systemのオブジェクトが動いたときのみにパーティクルを出したい場合に使ったり
移動量(速度)に比例して放出量が増える仕様を利用して移動量に関わらず一定の間隔でパーティクルを出したい場合に使う(下図)
![RateoverTime.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2386883/0ccbd304-9c5b-f9af-82cf-3ac3631124c5.gif)
<details><summary>仕様を調査するための実験結果</summary><div>
アニメーションでn秒間にnメートル移動した際秒間何個パーティクルが出ているか調査した
Rate over Distanceは10にした
設定内容
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2386883/93f160c1-697a-9a82-c38c-023eead1f8bb.png)

<table><tr><th>秒数(s)</th><th>移動距離(m)</th><th>秒間放出量(個/s)</th></tr><tr><td>10</td><td>10</td><td>10</td></tr><tr><td>10</td><td>100</td><td>100</td></tr><tr><td>1</td><td>10</td><td>100</td></tr><tr><td>0.5</td><td>10</td><td>200</td></tr></table>
結論: 秒速(m/s)*Rate over Distance = 秒間放出量(個/s)っぽい
今回の方法ではEmitter VelocityがRigidbodyとTransformで差が出ないがRigidbodyを親及び本オブジェクトに適用してる際はその限りでない
</div></details>
####Bursts
**決まった周期で決まった数のパーティクルを決まった回数放出させるための項目**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2386883/a20deb54-7bdb-8c24-c0c8-ff62bf10aa48.png)
*決まった周期で(Interval)
決まった数(Counts)のパーティクルを
決まった回数(Cycles)放出させるための項目
決まった確率(Probability)で出たり出なかったりする
決まった秒数(Time)出るのを遅れさせたりもする*
これの特徴はTimeが0の時<font color="Red">オブジェクトが出た瞬間</font>にパーティクルを出せること(Rate over Time等だと出た瞬間ではない)と
パーティクルの放出するタイミングを細かく指定できること
他にも例だと2つ並んでいるが右下の+を押して追加することで最大で8つまで項目を追加できる
Particle Systemで何か決まった動きをさせたい時に重宝する
#おわり
というわけでEmission Moduleの解説でした
次はShape Moduleの解説をしたいと思います
****
[Main Module編](https://qiita.com/abcde_kind/items/82cddca8be2917c0bded) <<  ここ  >> [Shape Module編](https://qiita.com/abcde_kind/items/e47a8f0c0f1077b314e6)
応用情報技術者試験に向けて失敗から学ぶ対策法

[CYBIRD Advent Calendar 2021](https://qiita.com/advent-calendar/2021/cybird) 23日目担当 今年新卒入社した@gumitaです。
22日目は@cy-naullさんの「Unity初心者がImageを発光させる」でした。
実装順序を分かりやすく解説されており、ぜひ発光させる際の参考にしたいです！

##はじめに
令和3年度秋期の応用情報技術者試験を実際に受けてこうしておけばよかった...と後悔したことから、次回に向けて対策を練りたい、そして他の方がこの記事を読んで少しでも参考になればと思い、このテーマで書かせていただきます！

##今回実施した勉強法
・勉強時間
　　勉強期間：5月〜10月
　　一日平均：1時間半〜2時間

・実施した勉強法
　　5月〜8月は午前問題をひたすら解き、
　　9月から午後問題に取り掛かり午前問題も交互に解いていました。

　　主に以下のサイトや本で勉強していました。
　　・[応用情報技術者試験過去問道場](https://www.ap-siken.com/apkakomon.php)
　　・応用情報技術者　午後問題の重点対策

##反省点
今回受験した時に反省したこと、成績照会を見た際に反省したことを合わせて3点挙げます。

##### １、 午前問題は解けると余裕になっていた
応用情報技術者試験過去問道場にて模擬試験形式で解いた際に、大体合格点に到達していたので大丈夫だろうと思っていました。
しかし、本番で問題を見ると最初から知らない問題で焦り、それ以降も分からない問題が続出し、結局ボーダーラインの60％を達成できない結果となってしまいました。
自信を持つことは大事ですが試験においては何重にも対策を練るべきでした。

##### ２、 午後問題の勉強に取り掛かるのが遅かった
想定していたより難しく、何問か解いても正答率が上がることはありませんでした。基本的に2、3問しか解けませんでした。
そして選択分野が多いため幅広く勉強する時間が取れず得意な分野を見つけることが出来ていません。
本番でも問題を見て柔軟に、解く分野を選びたかったです。

##### ３、 運動不足
これは私の努力不足と生活習慣の悪さが招いた結果でした。
試験当日、朝早く起きる自信がなかった私は徹夜をしました。そして約1時間の電車時間に午前問題を解いていたのですが電車酔いしました。その後酔いが残りつつ20分程歩き4階の試験会場まで行ったところで体力の限界を迎えました。
ここまで自分の体が貧弱になっていると思わず...そこも鑑みて調整するべきでした。

これらの反省点から、私は全力で挑んでいなかったのだと気づきました。


##具体的な対策
次に受ける際に参考になるように具体的な対策を簡潔に6点上げていきます。

####１、 午前問題を過去問道場で解く際はユーザー登録をする
これは大事です！！！とても便利です！！！
ユーザー登録をすると自分の解いた問題が記録され後で見返すことができ、苦手分野の分析も出来ます！

####２、 苦手分野は徹底的に克服する
午前問題も午後問題も言えると思います。
苦手ならば絞って勉強するより、しっかり全体的に対策を練るべきです。

####３、 午後問題はある程度の知識と読解力を身につける
知識がないと解けない問題と読めば解ける問題があり、読みながら大事そうなところに線を引くとかメモを残すと良いと思いました。
あとはマインド的な話にはなるのですが、「絶対解ける！」と思っていれば前向きに勉強できます。
絶望しないことが大事です。

####４、 モチベーションを維持する工夫をする
5月から約5ヶ月勉強期間がありましたが、モチベを維持するのが難しかったです。
私の場合は毎日は維持できなかったのでやる気が出ない時は40問は必ず解くとか、一日の目標を立てて出来たらカレンダーにシールを貼るなどしていました。

目標以上出来た日＝大きいシール
目標達成出来た日＝小さいシール
![IMG_2415.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2295658/168ae018-0b64-1f9d-e3c3-06faa84fc2f1.jpeg)

####５、 午前問題に自信がないなら午後問題は答えをメモした方が良い
午前が落ちていたら午後は採点されません。そのため成績照会を見ても何も分かりません。
しかも午後問題の回答例が出るのも試験日から2ヶ月後のため、答えを忘れている可能性が高いです。
午後問題はとにかく時間が足りません！途中でメモしながら解くのは難しいと思います。そのため終了後などに書いた答えを覚えている範囲で書いておくべきです。
次に活かすためにもメモした方が良いです。

####６、 運動を適度にする
運動不足が原因で最悪のコンディションで試験を受けるのは良くないです。
しっかり適度な運動を心がけましょう。

##最後に
応用情報技術者試験は難しいことが実感できたことは良い学びでした。今回は不合格でしたが、この失敗から学びを得て次回は合格に持っていけるように今後も勉強を続けていきます！
この失敗談から何かしら参考になれば幸いです。

明日の[CYBIRD Advent Calendar 2021](https://qiita.com/advent-calendar/2021/cybird) 24日目は@S_onizawaさんの「新卒のコードリーディング」です。
コードリーディングは苦手なため、コツなどあればぜひ教えていただきたいです！
Linuxのコマンドラインから画像の拡張子やグレースケールに変更する


Linuxのコマンドラインから，画像の拡張子を変更するコマンドです．
使うコマンドは imagemagick です．

# 必要になった経緯
発表資料を作成する際に，原稿に載せる写真は白黒で掲載して下さい．
との注意書きがあって，急遽調べて，使えるものをメモ代わりに載せておきます．
選んだ理由は使いやすそうだったから，インストールして使いました．ってだけです．

# まずはインストール

```
$ sudo apt-get update
$ aptitude search imagemagick
まずはサーチして，パッケージが存在することを確認します．

$ aptitude search ^imagemagick

i A imagemagick  ←こいつ         - 画像編集プログラム -- バイナリ                                                                   
i A imagemagick-6-common  - image manipulation programs -- infrastructure                                                    
p   imagemagick-6-doc     - document files of ImageMagick                                                                    
v   imagemagick-6.defaultquantum  -                                                                                                  
i A imagemagick-6.q16     - 画像編集プログラム -- 量子化深さ Q16                                                             
p   imagemagick-6.q16hdri - image manipulation programs -- quantum depth Q16HDRIZ
p   imagemagick-common    - image manipulation programs -- infrastructure dummy package                                      
p   imagemagick-doc

存在を確認したところで，インストールします．
$ sudo apt-get install imagemagick -y

```
インストールしたバージョン
version: ImageMagick 6.9.11-60 Q16
6.9.11なんですかね？

# コマンド例

##jpg,png → epsに変換

```
convert test.png eps2:test2.eps
```

これでepsに変換できます．
pngの部分はjpgでもOKです．

## カラーから白黒へ変換

```
convert test.png -type GrayScale test_g.png
```

これでグレースケールに変換できます．

## 拡張子を変換し，同時にグレースケールに変換する

```
convert test.png -type GrayScale eps2:test-gray.eps
```

これらを適宜使い分けることで，写真の作成がはかどります．

# おまけ

私のPCでは test.epsをグレースケールに変更できたのですが，
研究室の同期のPCのでは，なぜかエラーを吐いて変換できませんでした．
原因不明．

また，私はimagemagickをインストールした覚えがありませんが，インストールされていました．
もしかしたら，なにか他のPKGと一緒にインストールされるものなのかもしれません．

拡張子変えるのであれば，mvコマンドでいいじゃん．と思う方もいるかもしれませんが，mvコマンドで変更してはいけません．

拡張子を変更する場合は必ず，他の変換パッケージなどを使って変換しましょう．
拡張子ごとに持っている情報が異なります．
それゆえ，mvコマンドで変更した際には，内部の情報は書き換わっていないので，ファイルを開けなくなります．
気をつけましょう．
（特にリモート下での）コミュニケーションで私が意識していること

#経緯
日常のコミュニケーションで私が意識していることがある
↓
他の人も同じように意識することで
今以上にコミュニケーションが円滑になるのでは？
↓
いくつかポイントを話したい

## お断り
意識はしているが、できてないときもそこそこあるよ

全員にハマるとはおもってないよ
（まったくハマらないとも思ってないけど）

# （特にリモート下での）コミュニケーションで意識していること
## 1.こそあど言葉を使わない
こそあど言葉＝これ・それ・あれ・どれ

**あなたの「これ」は私の「これ」とは限らない**

↓

こそあど言葉は具体名に置き換え、
齟齬を産まないようなコミュニケーションを心がける

## 2.結論・質問は先に書く
パッとみて伝えたいことがわかるように、
簡潔に書いてあると返事の割合も高い（感覚的に）

↓

すぐ理解できる文章を書くことで、
人の時間を極力とらないように意識する


## 3.書いた文章は推敲する

[推敲](https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11178550491)=詩や文章をよくしようと何度も考え、作り直して、苦心すること。

プレビューはチェック、書いたあとももう一回読む、そして書き直す（推敲する）
・自己中心的な文章になってないか
・客観的視点で読めるか（相手のレベルに合わせた文章になっているか）

↓

すぐ理解できる文章を書くことで、
人の時間を極力とらないように意識する

## 4.反応だけはすぐにする（特に対顧客）
(特に客からの）backlog、メール等にはすぐ反応する。

できるだけslackにも反応する（メンションだけでも）

↓

相手の不安を低減する

## 5.相手のレベルを意識する
相手によって言葉・単語を選択する。

わからない人に難しい言葉（専門用語等）つかっても進まない。

わかる人にわかりやすく説明しすぎても時間が無駄。

↓

自分も相手も往復に時間がかからないようにする

## 6.遠慮しすぎない（答えが欲しいものはpushし続ける）
書きっぱなし（依頼しっぱなし）にしない。

反応がないものは再度メンションをつける、電話する等アクションする。

↓

遠慮せず相手の時間を使うのは悪ではなく、
遠慮して物事を予定通り進めれないことが悪

# まとめ
- 自分以外の人がみてもわかりやすく書く
- 相互にコミュニケーションをして物事をすすめる
- コミュニケーションは少ない回数を目指す
OpenCVで画像に文字を描画してみた

# はじめに
こんにちは！
[MYJLab Advent Calendar 2021](https://qiita.com/advent-calendar/2021/myjlab)の17日目は私が担当します。宜しくお願いします！
昨日は、@chiba___さんの[Google Colab と Turtle で描くアルファベット一覧（小文字編）](https://qiita.com/chiba___/items/671de84c1ce47965effd)でした。Google Colaboratoryを用いた、タートルグラフィックスでのアルファベット（小文字）の描き方をわかりやすくまとめてくださっています。
とっても楽しい内容なので、是非[大文字編](https://qiita.com/chiba___/items/fae8271cad6b9d2604fd)と合わせてご覧ください！

# OpenCVとは
Intelによって開発された、オープンソースのコンピュータビジョンライブラリです。
画像や動画の読み込み・画像処理・物体認識・機械学習など、コンピュータで画像や動画を処理するために必要な機能が多く実装されています。
今回は、このOpenCVを用いて画像に文字を描画してみます。

# 早速やってみる
では、早速OpenCVを用いて画像に文字を描画してみましょう！
## 環境
今回、私は"Google Colaboratory"を使用しました。
## 準備
画像に文字を描画する際にGoogleDrive内の画像を使用したいので、
以下のような方法でGoogle ColaboratoryからGoogleDriveへアクセスできるようにします。

```
from google.colab import drive
drive.mount('/content/drive')
```
## 本題
ここからが本題です。

まずは、Google ColaboratoryでOpneCVとMatplotlibを使用できるようにします。
Matplotlibは、画像に文字を描画したものを表示するために使用します。

```
import cv2
from matplotlib import pyplot as plt
```

次に、文字を描画する画像を指定します。

DIRNAMEには、画像を置いているディレクトリのパスを入力してください。
例えば、私の場合は、GoogleDriveのマイドライブの下にあるprodataというディレクトリの中に画像を置いているため、'/content/drive/My Drive/prodata/'と記述しました。

FILENAMEには、画像のファイル名を指定してください。
私の場合は、'rabbit.jpeg'と記述しました。

```
DIRNAME = 'ディレクトリのパスを入力'
FILENAME = "画像のファイル名を入力"
SRC_IMG_FILE = DIRNAME + FILENAME
```

そして、画像を読み込みます。
OpenCVの場合、色の並びは（B,G,R）ですが、Matplotlibでは（R,G,B）なので、
ここでcvtColorを用いて（B,G,R）から（R,G,B）に変換します。


```
im = cv2.imread(SRC_IMG_FILE, cv2.IMREAD_UNCHANGED)
im_rgb = cv2.cvtColor(im, cv2.COLOR_BGR2RGB)
```

続いて、描画したい文字のフォント、サイズ、太さ、色、
描画する位置や描画する文字の内容などを指定していきます。
描画する文字の内容と文字色については、ユーザから取得しています。

これらの値を元に、cv2.putTextで画像に文字を描画します。
※cv2.putText()では、日本語は描画できないのでご注意ください。


```
font = cv2.FONT_HERSHEY_SIMPLEX
fontScale = 10.0
thickness = 5
input_color = int(input("文字の色を選択してください(1:赤,2:青,3:緑):"))
org = (500, 700)
moji = input("描画したい文字列(日本語は不可)を入力:")

if input_color == 1:
    color = (255,0,0)
elif input_color == 2:
    color = (0,0,255)
elif input_color == 3:
    color = (0,255,0)

cv2.putText(im_rgb, moji, org, font, fontScale, color, thickness, cv2.LINE_AA)
```

最後に、Matplotlibで画像を表示します。

```
plt.axis('off')
plt.imshow(im_rgb)
```

## 実行結果
結果はこのようになります！もふもふで可愛いですね。
![rabbit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2287469/1b9a8e1a-e7f3-f6d6-c3b1-3fa9e4460f58.png)



# おわりに
今回は、OpenCVで画像に文字を描画してみました。
何か問題などがございましたら、ご指摘いただけますと幸いです。宜しくお願い致します！

最後までお読みいただき、ありがとうございました。
[MYJLab Advent Calendar 2021](https://qiita.com/advent-calendar/2021/myjlab)には面白い記事がたくさんあるので、是非ご覧ください！

# 参考
+ [【OpenCV】できることや特徴をわかりやすく解説](https://www.sejuku.net/blog/113292)
+ [PythonでOpenCVの画像データをMatplotlibで表示する](https://water2litter.net/rum/post/python_cv2_bgr2rgb/)
Github Actionsでeb cliを使いたい

ElasticBeanstalkへのデプロイをGithub Actionsで行おうとした際のメモ。


[マーケットプレイス](https://github.com/marketplace?type=actions&query=elastic+beanstalk+)にBeanstalk関連のactionsで自由度高く使えそうなものがなかった。

この辺はある程度星の数がついているが、`eb deploy`くらいはできるけどクローンしたりスワップしたりといったことがしづらそう。

* [Beanstalk Deploy](https://github.com/marketplace/actions/beanstalk-deploy)
* [AWS Elastic Beanstalk cli](https://github.com/marketplace/actions/aws-elastic-beanstalk-cli)


そこで、ワークフローの中で直接eb cliをインストールすることにした。

## Github Actionsにeb コマンドをインストール
eb cliは[AWS公式](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-install.html)にある通り[セットアップスクリプト](https://github.com/aws/aws-elastic-beanstalk-cli-setup)を利用する方法とpipで手動インストールする方法がある。
セットアップスクリプトをActionsのホスト上に落としてきて実行することもできるのだが、この方法だとActionsのキャッシュを使えず毎回一からインストールすることになるため、eb cliのインストールだけで3分くらいかかってしまう。

パッケージマネージャーを使ったライブラリインストールならActionsのキャッシュを使えるため、pipでインストールする方がいい。（[Caching dependencies to speed up workflows](https://docs.github.com/ja/actions/advanced-guides/caching-dependencies-to-speed-up-workflows)）
pipでのパッケージインストールは[setup-python](https://github.com/actions/setup-python)を利用。

```.github/workflows/deploy.yml
jobs:
  build:

    runs-on: ubuntu-latest
    env:
      AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
      AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

    steps:
      - uses: actions/checkout@v2

      - uses: actions/setup-python@v2
        with:
          python-version: '3.x'
          cache: 'pip'

      - name: Install awsebcli
        run: |
          pip install -r requirements.txt
          echo "~/.local/bin" >> $GITHUB_PATH

      - name: eb version
        run: eb --version
```

eb cliは環境変数の`AWS_ACCESS_KEY_ID`と`AWS_SECRET_ACCESS_KEY`を勝手に見にいく（[こちら参照](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3-configuration.html#eb-cli3-credentials)）ので、`env`で設定しておけばOK。

setup-pythonはインストールするライブラリを`requirements.txt`から読み取るので、こちらもアプリケーションのルートに追加。今回はeb cliさえ入ればいいのでそれだけ追加。

```requirements.txt
awsebcli
```

これで上記yamlでactionsを実行し、最後にcliバージョンが表示されればeb cli自体のインストールは成功。


## eb cliのセットアップ

ここまででeb cli自体はインストールできるが、`eb init`を実行しない限り環境設定がされていないため、エラーが出てまだebコマンドは使えない。

```
You must first run "eb init"
```

`eb init`コマンドはインタラクティブな設定方法であるため、CI上での実行には向かない。

`eb init`実行時には、裏側ではコマンドを実行したディレクトリで`.elasticbeanstalk/config.yml`が作られる。これをあらかじめ用意しておくことで、`eb init`を実行しなくてもeb cliをセットアップできた。（[環境を作成する前に設定オプションを設定する
 / EB CLI 設定](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/environment-configuration-methods-before.html#configuration-options-before-configyml)）

アプリケーションのルートディレクトリに`.elasticbeanstalk/config.yml`を追加。（通常は.elasticbeanstalkディレクトリはgitignoreされてることが多いかも）

```.elasticbeanstalk/config.yml
branch-defaults:
  default:
    environment: my-environment
environment-defaults:
  my-environment:
    branch: null
    repository: null
global:
  application_name: my-application
  default_ec2_keyname: my-ec2-key
  default_platform: xxxxxxxxxxxxxxxx
  default_region: ap-northeast-1
  profile: null
  sc: null
```

これでebコマンドが実行できるようになる。

あとは`eb deploy` `eb clone` `eb swap`等実行したいことをactionsで書けはOK。
IBM Watson Discovery にて Credential ファイルをダウンロードする

# 前提

Watson Discovery のサービスを利用している人
Webアプリ画面だけではなくて APIを利用したい人

# Credentialファイルとは

Credentialファイルというのは、API経由でクラウドサービスを利用するために必要なアクセス情報が書かれたファイルです。キーとなる文字列をコピペしても利用できるのですが、ファイルとしてダウンロードしておくと扱いが楽になります。（ファイルへのアクセス権限や共有設定にはご注意ください。）

# リソースリスト

IBMクラウドのリソースリストを開きます。

https://cloud.ibm.com/resources

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/1366e2d1-2048-e0d2-e432-966ce84d5b25.png)

その中にWatson Discoveryサービスも入っているので選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/1358dbdc-ac16-4608-eebf-70fefae27daf.png)

「資格情報」に「ダウンロード」のリンクがありますので保存します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/110265/83254ec5-42f5-d116-9b1e-935ba6d357bd.png)

ダウンロードされたファイルは以下のような内容になっています。
取り扱いにはご注意ください。

```text:ibm-credentials.env
DISCOVERY_APIKEY=xxx
DISCOVERY_IAM_APIKEY=xxx
DISCOVERY_URL=https://api.eu-gb.discovery.watson.cloud.ibm.com/instances/xxx
DISCOVERY_AUTH_TYPE=iam
```

次以降の記事ではこのファイルを使ってAPIコールを試します。


以上
QGIS独自のCursorの使用方法

## はじめに
QgsMapToolのCursorを情報参照表示などで使われているカーソルに変更したかったための備忘録

## カーソル定義

カーソルは**QgsApplicationクラスのCursorで7個定義されています。**

| ZoomIn       | Zoom in.                                       | ![](https://paper-attachments.dropbox.com/s_7CE929848D3F9269E052F3428480BE867F4B1F5769D4FE3D7AB4DAA0D119A3AF_1639554839555_mZoomIn.svg)       |
| ------------ | ---------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| ZoomOut      | Zoom out.                                      | ![](https://paper-attachments.dropbox.com/s_7CE929848D3F9269E052F3428480BE867F4B1F5769D4FE3D7AB4DAA0D119A3AF_1639554826292_mZoomOut.svg)      |
| Identify     | Identify: obtain information about the object. | ![](https://raw.githubusercontent.com/qgis/QGIS/618d575704073727def70cb671a6cad28b1dfeda/images/themes/default/cursors/mIdentify.svg)         |
| CrossHair    | Precisely identify a point on the canvas.      | ![](https://paper-attachments.dropbox.com/s_7CE929848D3F9269E052F3428480BE867F4B1F5769D4FE3D7AB4DAA0D119A3AF_1639554856524_mCrossHair.svg)    |
| CapturePoint | Select and capture a point or a feature.       | ![](https://paper-attachments.dropbox.com/s_7CE929848D3F9269E052F3428480BE867F4B1F5769D4FE3D7AB4DAA0D119A3AF_1639554869182_mCapturePoint.svg) |
| Select       | Select a rectangle.                            | ![](https://paper-attachments.dropbox.com/s_7CE929848D3F9269E052F3428480BE867F4B1F5769D4FE3D7AB4DAA0D119A3AF_1639554884452_mSelect.svg)       |
| Sampler      | Color/Value picker.                            | ![](https://paper-attachments.dropbox.com/s_7CE929848D3F9269E052F3428480BE867F4B1F5769D4FE3D7AB4DAA0D119A3AF_1639554905527_mSampler.svg)      |

## 取得方法

カーソルの定義からのQCursorの取得もQgsApplicationクラスの`getThemeCursor`を使うことで取得できます。

    cursor = QgsApplication.getThemeCursor(QgsApplication.Identify)



## 例: MapToolのCursorを変更する
    tool = QgsMapToolIdentifyFeature(iface.mapCanvas())
    cursor = QgsApplication.getThemeCursor(QgsApplication.Identify)
    tool.setCursor(cursor)


## 参考

[QgsApplicatoin::Cursor](https://www.qgis.org/api/classQgsApplication.html#ab2c4dc69531d9217af73d45b53c56da2)
[QgsApplication::getThemeCursor](https://www.qgis.org/api/classQgsApplication.html#a44d8d039414b12118fe70f1be070ffef)
[](https://www.qgis.org/api/classQgsApplication.html#ab2c4dc69531d9217af73d45b53c56da2https://www.qgis.org/api/classQgsApplication.html#a44d8d039414b12118fe70f1be070ffef)
古いlogを削除する方法

##背景
開発するときにdevelopment.logやproduction.log等の中身を容量が大きくならないように消そうと思った。

#１.普通にファイルを消す方法

```
rm log/production.log 
```
で消してwebサーバを再起動させる。

#2.自動で定期的に消させる方法
次はlogrotateでログローテーションを行う方法です。
まずファイルを以下のパスで作成します。

```
sudo touch /etc/logrotate.d/rails
```

作成したファイルにlogrotateの設定を記述します。

```
/var/www/autovice/current/log/*log {
  daily
  missingok
  rotate 30
  dateext
  dateformat _%Y%m%d
  compress
  copytruncate
  ifempty
  su user user
}
```

次にちゃんと設定したものが実行されるのかテストします。

```
sudo /usr/sbin/logrotate -d /etc/logrotate.d/rails
```

logrotateの詳しい記述方法は以下のURLから見れます。
https://milestone-of-se.nesuke.com/sv-basic/linux-basic/logrotate/
OutSystemsを学ぶ前に用語と画面の位置を知っておこう

#はじめに

OutSystemsではコードを書かずに設計できるので誰でも簡単にアプリケーションを作ることができます。

ただ自分が作りたい！というアプリケーションを作成するにはOutSystemsでの開発方法を学ぶ必要があるかもしれません。

アプリケーション開発未経験者が、OutSystemsの勉強前に知っておくといいことを書きます。

#用語の確認

Entity、AggrigateなどOutSystemsは独自の用語を使用することが多いです。
「OutSystemsでいう〇〇とは、他の開発で言うと△△でのようなものです。」と説明されることもあるので
他の開発でいうと△△とは？というところがわからなかったら事前に調べておくことをお勧めします。

よく使う用語

|名前 |説明 |
|:------------------|:------------------|
|Data Type| データ型|
|Entity| データベース上のテーブル|
|Attribute| データの列|
|Aggrigate|Entityのデータを取得するためのツール|
|Action|ロジックを定義するところ|
|Widget|ボタンやテキストなど画面の部品|

#ServiceStudioの画面の位置の把握

～をクリックして、と文章で説明されることが多いので何がどこにあるか確認しましょう。


![画面配置.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361433/d3b45d47-806e-3fad-a792-c81719073e09.png)

| 番号      |名前 |説明 |
|:-----------------|:------------------|:------------------|
| 1            |  Undo,Redo            | ひとつ前の作業に戻る、戻した操作の取り消し| 
| 2            |  1-ClickPubkishボタン            | 作成したものをアップロードする　*パブリッシュするといったら大体このボタンを押すこと| 
| 3            |   タブ           | 表示、編集する設計対象の切り替えをする　詳しくは下画像で　| 
| 4            |   ツールバー           | 画面を作成する場合は画面のWidget、Actionを作成する場合は一部処理がアイコン化して並んでいる　| 
| 5            |   メインエディタ           | 設計している画面やActionが表示される　| 
| 6            |   エレメントツリー           | 設計した画面やActionが一覧で表示される、メインエディタにクリックした画面やActionが表示される　| 
| 7           |   プロパティ           | 選択したもののプロパティが表示される　| 

![タブ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2361433/f8abfaad-9116-0170-8be8-94e3f1bf065b.png)


|名前 |説明 |
|:------------------|:------------------|
|Processes |ビジネスプロセスの設計|
|Interface |画面の設計|
|Logic |データベースのアクセスや計算処理の設計|
|Data |データテーブルの設計|


#結局勉強って何から始めたらいいの？

1.ServiceStudioのインストール

2.アプリケーションを作成してみる
カレンダーで公開されている他の記事などを参考にしてみてください。
[なんと5分もかからずスマホアプリが作れる最近のノーコード開発](https://blogs.itmedia.co.jp/osonoi/2021/12/5.html)
[OutSystemsなら10分でアプリが作れる！](https://qiita.com/RyogaTakao/items/1d9e663a7218fca7e5ca)

3.オンライントレーニングを受けてみる
OutSystemsのサイトから受けることができます。
[リアクティブWeb開発者への道](https://www.outsystems.com/ja-jp/training/paths/18/becoming-a-reactive-web-developer/)

4.わからないことがあったら操作ガイドを見る
これもOutSystemsのサイトから見れます。
[OutSystemsオンラインヘルプ操作ガイド](https://success.outsystems.com/ja-jp/Documentation/How-to_Guides)
fnmに切り替えたらVSCodeのF5実行できなくなった

# 背景
こちらの記事を読ませていただいて、Windowsにてfnmを導入しました。
すると、VSCodeでF5によるJSファイル実行ができなくなってしまいました。
今後も毎回必要になりそうなので、解決策を自分の備忘録のために書いておこう、という記事です。

https://qiita.com/heppokofrontend/items/fe1c3bc41a0ae943c2ca?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items#3-%E5%90%84%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%ABnode-version%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E8%A8%AD%E7%BD%AE%E3%81%99%E3%82%8B


# 解決策
`launch.json`の設定を下記のようにする

```launch.json
{
  // Use IntelliSense to learn about possible attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    {
      "type": "node",
      "request": "launch",
      "name": "Node: Current File (with FNM)",
      "skipFiles": [
        "<node_internals>/**"
      ],
      "console": "integratedTerminal",
      "internalConsoleOptions": "neverOpen",
      "program": "${file}",
      "runtimeExecutable": "fnm",
      "runtimeArgs": [
        "exec",
        "--using-file",
        "--",
        "node"
      ],
      "restart": true
    }
  ]
}
```


# 参考リンク
https://github.com/microsoft/vscode-js-debug/issues/847

参考というか、上記のissueに答えてくださっている方がいてそのままやりました。
※`name`だけ自分が分かりやすいように変更してます。

fnmに変えたことが原因では？という発想に至るまでに無駄に時間がかかってしまい、fnmを検索キーワードに含めたらすぐ答えが見つかりました。。。
[Python] ラムダ式の使い方


#ラムダ式の使い方
**ラムダ式**とは、無名関数を記述するための方法。Pythonでの**ラムダ式**の書き方は以下のようになる。

```python
lambda <引数>: <処理>
```
通常の関数定義とラムダ式を比較してみる。

```python
# 通常の関数
def function(x, y):
    return x * y

# ラムダ式
lambda x, y: x * y
```

# 実装例
**ラムダ式**は、関数を別の関数の引数として渡すとき、特に高階関数の引数として関数を渡すときに**ラムダ式**が使われることがある。
例えば、```sorted()```を使ってオブジェクトのプロパティでソートしたい場合以下のように**ラムダ式**を使って書くことができる。

```python
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __repr__(self):
        return "%s:%d" % (self.name, self.age)

student = [Person("Yamada", 16), Person("Sato", 13), Person("Ito", 15)]

# 名前でソート
result_name = sorted(student, key=lambda h: h.name)
print(result_name)    # [Ito:15, Sato:13, Yamada:16]
# 年齢でソート
result_age = sorted(student, key=lambda h: h.age)
print(result_age)    # [Sato:13, Ito:15, Yamada:16]
```
WardenでCLI機能のデバッグをする

[Warden](https://warden.dev/)はMagentoやSymfony系の開発をする際、必要になるコンテナ一式や開発用の証明書などをセットで用意してくれる便利なツールです。
もちろんXdebugを使ってリモートデバッグもできるわけですが、CLI機能のデバッグは標準では用意されていません。

# Gistで書いてくれてる人がいる
軽く調べてみると、Gistがヒットしました。

https://gist.github.com/molotovbliss/3eb18a2b0366d9b9e15647322641816d

そのものズバリなものがあります（アリガタヤ）。
というわけでこの例に沿ってやってみましょう。

# clixdebug.cmd を所定のパスに作成する
手順に沿って、

```
/usr/local/Cellar/warden/[x.x.x]/commands/clixdebug.cmd
```

にファイルを作成し、Gistに書かれているスクリプトを貼り付けます。
バージョン番号は使っているWardenのバージョン番号に読み替えましょう。

基本、WardenはMac用なので、WindowsやLinuxで使っている人も自分の環境に合わせて適当に読み替えてください。

# 動かしてみる
ファイルの作成ができたら、

```
warden clixdebug 実行ファイル名 [パラメータ]
```

を試します。
今回試したのはMagentoコマンドなので、

```
warden clixdebug bin/magento mycmd:exec
```

というようになります。もちろん他のサブコマンドでも可ですね。
なお、動作検証する際はIDE側でブレークポイントを張っておきましょう。
私の場合は既にブラウザでのデバッグ用にPHPStormで設定ができているので、単にブレークポイントを設定するだけでした。

# おや？動かない・・・

clixdebugを動かしてみると、ターミナル上に

```
This script is not intended to be run directly!
```

というメッセージが出ます。
調べてみたところ、私が使っているWarden-0.9.1では、clixdeug.cmdの内容は、

```
[[ ! ${WARDEN_COMMAND} ]] && >&2 echo -e "\033[31mThis script is not intended to be run directly!" && exit 1
```

ではなく

```
[[ ! ${WARDEN_DIR} ]] && >&2 echo -e "\033[31mThis script is not intended to be run directly!" && exit 1
```

と書かないといけないようです。
よくあるアップデートに伴う仕様変更か、あるいは元ファイルの作者のミスかもしれません。
いずれにしても、スクリプトを修正することで無事動作するようになりました。

これでCLIツール実装時のデバッグもはかどりますね。
[py2rb] デコレーター

# はじめに
移植やってます。
# デコレーター (Python)
```python
# ----------
# Name: hoge
# Args: (15, 37)
# Kwargs: {'m': 'ほげ', 'n': 'ぴよ'}
# ----------
# hoge: 15-37/ほげ-ぴよ
```

https://www.shoeisha.co.jp/book/detail/9784798163642

独習Pythonの`デコレーターを利用しない例`を写経してみます。
# どうする？ (Ruby)
```ruby
def log_func(func)
  def inner(*args, **kwargs)
    puts "----------"
    puts "Name: #{__method__}"
    puts "Args: #{args}" if args.nil?.!
    puts "Kwargs: #{kwargs}" if kwargs.nil?.!
    puts "----------"
    func.call(args, kwargs)
  end
  inner
end

def hoge(x, y, m: 'bar', n: 'piyo')
  puts "hoge: #{x}-#{y}/#{m}-#{n}"
end

log_hoge = log_func(method(:hoge))
log_hoge(15, 37, m: 'ほげ', n: 'ぴよ')

# ----------
# Name: inner
# Args: []
# Kwargs: {}
# ----------
#in `inner': undefined local variable or method `func' for main:Object (NameError)
```
本の内容に近いコード。
エラーが出ています。

```ruby
def log_func(func, *args, **kwargs)
  def inner(func, *args, **kwargs)
    puts "----------"
    puts "Name: #{__method__}"
    puts "Args: #{args}" if args.nil?.!
    puts "Kwargs: #{kwargs}" if kwargs.nil?.!
    puts "----------"
    func.call(args, kwargs)
  end
  inner(func, args, kwargs)
end

def hoge(x, y, m: 'bar', n: 'piyo')
  puts "hoge: #{x}-#{y}/#{m}-#{n}"
end

log_hoge = log_func(method(:hoge), 15, 37, m: 'ほげ', n: 'ぴよ')

# ----------
# Name: inner
# Args: [[15, 37]]
# Kwargs: {:m=>"ほげ", :n=>"ぴよ"}
# ----------
# hoge: [[15, 37]]-{:m=>"ほげ", :n=>"ぴよ"}/bar-piyo
```
引数の受け渡しが不味そう。
`hoge`の出力が正しくない。

```ruby
def log_func(func, *args, **kwargs)
  inner = proc {
    puts "----------"
    puts "Name: #{__method__}"
    puts "Args: #{args}" if args.nil?.!
    puts "Kwargs: #{kwargs}" if kwargs.nil?.!
    puts "----------"
    func.call(*args, **kwargs)
  }
  inner.call
end

def hoge(x, y, m: 'bar', n: 'piyo')
  puts "hoge: #{x}-#{y}/#{m}-#{n}"
end

log_hoge = log_func(method(:hoge), 15, 37, m: 'ほげ', n: 'ぴよ')

# ----------
# Name: log_func
# Args: [15, 37]
# Kwargs: {:m=>"ほげ", :n=>"ぴよ"}
# ----------
# hoge: 15-37/ほげ-ぴよ
```
`proc`でやってみた。
出力はよさそう。
メソッド名はもちろん異なっています。
# メモ
+ Python の デコレーター を学習した
+ 道のりは遠そう
Ruby on Railsで新規にアプリを作る方法

Ruby on Railsにて新しいアプリケーションを作るには、
まずアプリを作成したいディレクトリを作り、
ターミナルにてそのディレクトリ内でRailsコマンドの一つであるrails new コマンドを使用する。

```
rails new
```

rails newを行う際、newの前にバージョンを入力する事で、使用するRailsのバージョンを指定する事ができる。
rails _6.0.0_ newならバージョン6.0.0を使用するという事。

```
rails _6.0.0_ new
```

newの後にはアプリ名を書くのだが、その時にdオプション（アプリ名の後に -d）をつけることによって使用するデータベースを指定する事ができる。
MySQLのDBを使いたいなら　-d mysqlと記述。

以上のことを踏まえて、仮に[ test_app ]という名前のアプリでRailsバージョンが6.0.0、データベースがMySQLなら

```
rails _6.0.0_ new test_app -d mysql
```


というコマンドを入力することで新規アプリを作成する事ができる。

データベースはまだないのでこの後に作成する必要がある。

データベースを作成するには作成したアプリのディレクトリに移動したのち、

```
rails db:create
```

このコマンドを行うとデータベースが作成される。
データベースがないと入力したデータを保存する場所がないので何かしらのデータを保存するアプリを作成するなら必ず必要。
flutter x firebaseのinitializeで困ったのでメモ


https://www.flutter-study.dev/firebase/authentication

ここの記事に沿って、チュートリアル進めていたところ、Firebase周りでつまづいたので備忘録です。

## 準備したこと
- firebaseコンソールからproject作成
- pubspec.yamlに下記記載して、pub get
- firebaseコンソールからメールアドレスでのauthを有効化(メールでauthを使う場合）

```yaml
flutter:
    sdk: flutter


  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^1.0.2
  firebase_core: ^1.10.5
  firebase_auth: ^3.0.3
```

## Firebase authを使おうとしたら、、、initializeが必要とのこと
```dart
ElevatedButton(
                  onPressed: () async {
                    try {
                     
                      final FirebaseAuth auth = FirebaseAuth.instance;
                    

                      developer.log("email=$_email, password=$_password");
                      final UserCredential result =
                      await auth.createUserWithEmailAndPassword(
                          email: _email, password: _password);
                      final user = result.user;
                      setState(() {
                        _infoText = "登録OK: ${user?.email}";
                      });
                    } catch (e) {
                      developer.log(e.toString());
                      setState(() {
                        _infoText = "登録NG: ${e.toString()}";
                      });
                    }

                  },
                  child: Text("登録"))
```

以下のエラーが出てくる。どうやら、initializationが必要らしい。

```
Firebase has not been corre…ase.flutter.dev/docs/overview#initialization
```

## Firebase をinitialize するもエラー

こちらの記事に沿って、initializeを試すことに。

https://qiita.com/edasan/items/f32bc58a4afd0ca92432



```dart

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}
```

次は別のエラーが出現！！！！

```
MissingPluginException(No implementation found for method Firebase#initializeCore on channel plugins.flutter.io/firebase_core)
```

# FlutterFireのドキュメントに沿って解決

ドキュメントを読み直す

https://firebase.flutter.dev/docs/overview


CLIツールがインストールされていないことに気付いたので、公式サイトよりインストール

https://firebase.google.com/docs/cli#install-cli-mac-linux

```
$ curl -sL https://firebase.tools | bash
```

FIrebaseにログイン

```
$ firebase login
```

cliをactivate して、flutterfireで設定を行う。自動で、指定したアプリをfirebase project上に登録してくれる。（android, ios, web app など）

```
# Install the CLI if not already done so
dart pub global activate flutterfire_cli

# Run the `configure` command, select a Firebase project and platforms
flutterfire configure
```

改めて、main.dartにて、initialization

```dart
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart';
```

```dart
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );
  runApp(MyApp());
}
```

＝＞Androidで、すでにインストールされていたアプリをアンインストールして、インストールし直し
＝＞無事、Firebase authが使えました〜〜〜！！
ソースファイルからビルド＆インストール

## はじめに
アプリをインストールする場合、**apt-get install**コマンドで、リモートリポジトリからアプリをダウンロードしてインストールすることになるが、それ以外にも、ソースファイルをダウンロードして、自分の環境でコンパイルしてインストールする方法もあります。ただし、この場合は、自己責任で行って下さいという話になります。
ソースコードからコンパイルする方法について、rsyncというアプリを手本に、実際に試してみることにする。

rsyncの公式サイトはこちらです。
https://rsync.samba.org/

## 環境
focal (Ubuntu 20.04)

## やったこと
ダウンロード先ディレクトリをtmpにするために、tmpにカーソルを移動します。

```
cd /tmp
```

**wget**コマンドを使ってソースファイルをダウンロードします。拡張子は**tar.gz**となっています。拡張子のtarは複数ファイルを１つのファイルにまとめたファイルで、tarファイルだけであれば、圧縮は行われていません。圧縮するとgzの拡張子がつきます。.tar.gzと拡張子が２つあるということは、複数のファイルを１つのファイルにまとめた後、そのファイル対して圧縮をかけたということになります。

```
wget https://download.samba.org/pub/rsync/src/rsync-3.2.3.tar.gz
```

tarコマンドでアーカイブを解凍して展開します。
オプションの意味は次のとおりです。
>
xは、アーカイブを展開する
vは、展開した後の個々のファイルを表示する
fは、ファイル名を指定します

```
tar -xvf rsync-3.2.3.tar.gz
```

ls -lすると、rsync-3.2.3というディレクトリが作成されていることが確認できます。rsync-3.2.3ディレクトリに移動します。

```
cd rsync-3.2.3
```

**ls -l | grep configure**すると、**configure.sh**というスクリプトファイルがあります。このスクリプトファイルを実行します。

```
./configure
```

スクリプトファイルの実行が失敗しました。エラーが表示されています。

```
Configure found the following issues:

- Failed to find xxhash.h for xxhash checksum support.
- Failed to find zstd.h for zstd compression support.
- Failed to find lz4.h for lz4 compression support.

See the INSTALL file for hints on how to install the missing libraries and/or
how to generate (or fetch) man pages:
    https://github.com/WayneD/rsync/blob/master/INSTALL.md

To disable one or more features, the relevant configure options are:
    --disable-xxhash
    --disable-zstd
    --disable-lz4

configure.sh: error: Aborting configure run
```

**xxhash**、**zstd**、**lz4**の３つのライブラリが存在していないことが原因です。ライブラリを別途インストールしてもいいが、**--disable-xxhash**、**--disable-zstd**、**--disable-lz4**の３つのオプションをつけることで、ライブラリの機能を無効化して実行することができるようです。

無効化して実行します。

```
./configure --disable-xxhash --disable-zstd --disable-lz4
```

スクリプトファイルの実行が成功しました。

```
rsync 3.2.3 configuration successful
```

configureは、Makefileを生成するためのスクリプトファイルです。Makefileが作成されていることが確認できます。（grep makefileでは検索されないので注意）

```
ls -l | grep Makefile
```

makeコマンドで生成されたMakefileを実行します。

```
make
```

これでコンパイル（ビルド）が完了しました。バージョンを表示して、正しく表示されればＯＫです。

```
./rsync --version
```

コンパイルされたアプリをインストールをします。make installは、makeファイルで作成された実行ファイルをインストールするコマンドです。**n**オプションをつけると、確認のために疑似的にインストールコマンドが実行されるだけで、実際にインストールは行われません。

```
make -n install
```

やりたいことが終わったので、ダウンロードしたファイルを削除します。

```
cd ..
rm -rf rsync-3.2.3
rm rsync-3.2.3.*
```
PackerでAMI作成時にuser_dataを実行する

# これはなに
AWSのAMIをPackerで作成する中で、Ansibleではなくuser_dataの実行方法についてのメモです。
Jsonでの記述方法がWeb上には多数ありますが、今回はHLC2で記述します。

## ファイル構成

```
root@user2:~/example-packer# tree .
.
├── build.pkr.hcl
├── scripts
│   └── user_data.txt
├── sources.pkr.hcl
└── variables.pkr.hcl

```
## バージョン
・Packer v1.7.7

## ファイル内容

**variables.pkr.hcl**

```variables.pkr.hcl
variable "region" {
  default = "ap-northeast-1"
}

variable "ami_name" {
  default = "作成されるAMIの名前"
}

variable "owners_id" {
  default = "AWSアカウントID"
}

variable "source_ami_name" {
  default = "作成する元となるAMIの名前"
}

```
**sources.pkr.hcl**

```sources.pkr.hcl
source "amazon-ebs" "server" {
  region        = "${var.region}"
  ami_name      = "${var.ami_name}"
  instance_type = "t2.micro"
  ssh_username  = "ec2-user"
  tags = {
    Name = "${var.ami_name}"
  }

  source_ami_filter {
    owners      = ["${var.owners_id}"]
    most_recent = true

    filters = {
      virtualization-type = "hvm"
      name                = "${var.source_ami_name}"
      root-device-type    = "ebs"
    }
  }
}

```

**build.pkr.hcl**
user_dateを記述するファイルはこちらになります。
<font color="Red">inline = []</font>の中に実行したいスクリプトを記述していきます。
今回は試しにhttpdのインストールを行います。

```build.pkr.hcl
build {
  name = "build_ami"
  sources = [
    "source.amazon-ebs.server"
  ]
    provisioner "shell" {
    inline = [
      "sudo yum update -y",
      "sudo yum install -y httpd",
      "sudo systemctl start httpd",
      "sudo systemctl enable httpd"
    ]
  }
}

```

## 実行

```
root@user2:~/example-packer# packer build .
```
・最後に、AMIからEC2を起動して期待通りのスクリプトが実行されていれば完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435702/9c4fb61a-cb1a-a2fa-b14c-83ab72d4ec7e.png)

## 追記

上記、方法とは別に**sources.pkr.hcl**の<font color="Red">user_data_file</font>を使用することでuser_dataを実行することもできます。

```sources.pkr.hcl
source "amazon-ebs" "server" {
  region        = "${var.region}"
  ami_name      = "${var.ami_name}"
  instance_type = "t2.micro"
  ssh_username  = "ec2-user"
  user_data_file= "./scripts/user_data.txt"
  tags = {
    Name = "${var.ami_name}"
  }

  source_ami_filter {
    owners      = ["${var.owners_id}"]
    most_recent = true

    filters = {
      virtualization-type = "hvm"
      name                = "${var.source_ami_name}"
      root-device-type    = "ebs"
    }
  }
}
```