OmniAICreator/Qiita-1.07M huggingface dataset:
初心者サービス作成 #1 課題定義と作りたいモノ

<br>

 [「初心者サービス作成 #0」](https://qiita.com/ttttc/items/d666d42847840628ecc3) の続き
<h2>最初にやること</h2>

まず、<b>①解決したい課題</b> と <b>②作るモノ・サービス</b> を決めます。

※ここでは私の解決したい課題を記述します。
<h3>①解決したい課題</h3>

<b>「バイト先の業務改善をしたい」</b>が課題になります。


詳しく言えば…

:::note info
<b>「プロジェクト表・対戦表のヒューマンエラーをなくす」</b>
:::

という課題です。

`※ヒューマンエラー＝人間が意図せずに起きる間違え・ミス`

詳しく説明します。

現在、私はサッカー・フットサル施設のアルバイトスタッフして働いています。

主な業務内容は、大会運営や清掃などです。
大会運営では、プロジェクト表や対戦表を作成・印刷したり、審判として試合を進めたりしています。

プロジェクト表は、Word手打ちで作成をしているため、どうしても記述ミスが発生してしまいます。
その結果、大会の進行が遅れ、業務に影響が出てしまいます。

個人的には、そのあとに生じる「プロジェクト作ったの誰だよ！」的な雰囲気が大嫌いです。

以上が、私が解決したい課題になります。

<h3>②作るモノ・サービス</h3>

解決したい課題をご覧いただければ、大体わかると思いますが…

<b>「プロジェクト表自動作成サービス」</b>が作るモノになります。

「手打ちなら自動でつくれちゃうサービス作ればよくね？」という思い付きからサービスを考えました。

<h2>課題設定</h2>

<b>①解決したい課題</b> と <b>②作るモノ・サービス</b> が決まりました。

これをもう少し細かく、形式的に記述していきます。


<b>◆背景・目的</b>
<ul>
	<li>解決したい課題</li>
	<li>なんのために？</li>
	<li>システム化する必要があるか？</li>
</ul>

<b>◆ゴール</b>
<ul>
	<li>目標</li>
	<li>達成したときの状態は？</li>
</ul>

これに当てはめて考えていきます。

<h3>◆背景・目的</h3>

<b>解決したい課題</b>
<ul>
<li>手打ちで作成しているプロジェクト表・対戦表のヒューマンエラーをなくす</li>
</ul>

<b>なのために？</b>
<ul>
	<li>大会進行が遅れないため、お客様を待たせないため</li>
	<li>「プロジェクト作ったの誰だよ！雰囲気」を消す</li>
</ul>

<b>システム化する必要ある？</b>
<ul>
<li>間違えない仕組みを作ってしまえば問題が解決する、かも…</li>
</ul>

<h3>◆ゴール</h3>

<b>目標</b>
<ul>
<li>誰が使用してもプロジェクト表がミスなしで作成できる</li>
</ul>

<b>達成したときの状態は？</b>
<ul>
	<li>ヒューマンエラーによる大会進行の遅れが消える</li>
	<li>「プロジェクト作ったの誰だよ！雰囲気」が消える</li>
</ul>

以上が課題定義になります。

次回は、要件定義について記述します。

<h3>参考</h3>

[・独学エンジニア](https://dokugaku-engineer.com/)
[・NRI SECURE](https://www.nri-secure.co.jp/blog/web-service-overview-1)
salesforce笔记

1.trigger里面不能使用父子关系，需要重新用soql检索

2.guest user不能加到public group或者queue里面
https://help.salesforce.com/s/articleView?id=sf.networks_guest_policies_timelines.htm&type=5

3.更改user的email时，无论使用dataloader还是api，或者是apex，都无法直接把新的email覆盖到旧的email上。必须去邮箱里点击确认url才能改变。
  也可以联系sf的support去把整个组织的email alert功能关掉。

4.生成user时不发送PW确认email。使用下面的代码
      Database.DMLOptions dlo=new Database.DMLOptions();
      dlo.EmailHeader.triggerUserEmail =false;
      dlo.EmailHeader.triggerAutoResponseEmail=false;
      newUser.setOptions(dlo);
nRF9160 が boot しない I: Jumping to the first image slot 

ncs v2.0.2, v2.1.1 で確認した内容。

nRF9160を起動時、ブートローダーの下記メッセージにて動作がとまる（アプリケーションが起動しない）症状について、調査したメモ。

I: Jumping to the first image slot 

# 対策１　デバッグを無効にすると起動するようになる。
```prj.conf にて、
CONFIG_DEBUG=n
````

# 対策２　デバッガーを使用したい場合は、上記の代わりに下記の設定を行うと起動するようになる
```mcuboot の　prj.conf にて、
CONFIG_FPROTECT=n
```
mcuboot の prj.confは、
child_image/mcuboot/prj.conf
のような構成でファイルを作成しておくと設定が上書きされる。

# 以上
関数の型定義を正しく指定していない場合の挙動で少しハマったお話


例として下記のような関数を作ったとします。

```php

function say_hoge():bool
{
  return 'hoge';
}

```

この関数をよんでいる場所で、この関数の結果を見ると、なぜか「1」で返っている。

原因としては、 **関数の返り値の定義を「bool」に指定している** から。
関数内のコードが少し複雑なこともあり（上の見本はシンプルですが）
どっかで真偽値に変わってるのか？としばらく調査してしまっていました。。。
ちなみに、定義をarrayにすると Fatal error: Uncaught TypeErrorエラーになります。こっちはすぐ分かるのですが、
上記の例の場合だと原因が分かりづらいので、型定義はちゃんとしようというお話でした。

__実行例__(outputのところに出力)

型定義をboolにしちゃったケース
![bool.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287983/2e8b39dd-2eb8-3ca8-9191-894f7792977d.png)

ちゃんとstringにしたケース
![string.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/287983/ce621010-c624-a379-7294-d63f7bd28bf8.png)
ゲーム作品ユーザーコンテスト開催に懸ける想い

# 最初に結論
* 公式コンテストはnot for meだった
* 技術向上の為には競争が必要
* コミュニティ全体の技術向上

## 公式コンテスト
　ゲーム発売から3か月位経った頃の事です。
　youtubeを「よゐこのはじめてのプログラミング生活 あそぶ編」で検索すると4本の動画が出てきます。プレイヤーの作品をよゐこのお二人が遊ぶ事で、このゲームでどんな事が出来るかを紹介する動画です。

　この時既にtwitterやredditには良く作りこまれた作品が多数投稿されていました。そのレベルの作品群の中でより優れたものを選出するんだろうと期待していましたが、実際は商品と番組の宣伝に向く作品が選ばれていた印象です。

　コンテストと言うより作品募集。結局は私が勝手に誤解してただけですが、とても残念に思いました。


## 優れたものを讃えたい
　競争こそ技術向上の原動力だと考えているので、シンプルに競う事自体が好きです。
　自分自身がコンテストに参加する事も、また参加していなくとも優れたものを讃える事が好きです。

　何故讃えるかというと**優れたものを優れていると評価しなければ技術向上が止まる**からです。
勝者はその時点で最強、素直におめでとう。敗者も敗れた理由を分析する強い動機と超えるべき到達点の指標が得られます。
　長期的な視点で技術的成長を目的に定めると、敗者の方がメリットが大きいです。毎日何かと競ってたら疲れちゃいますが、年に2,3回位なら本気で競ってもいいんじゃない？


## 無ければ作る
　モノ作りする人なら誰もが納得する原則、無ければ作れば良いのです。プログラムもアウトプットならイベントもアウトプットです。設計して実装して運用すればよいのです。



## 要件の分析
　私が求めるイベントは作品の優劣を競うコンテストである事、またその先にはコンテストを通して参加者同士が切磋琢磨するコミュニティの形成でした。
　ハードルの高い事をやろうとしてるのは分かっていて開催にこぎつけるまで7か月近く検討していました。
　ここらへんの話を始めると長くなるのでかいつまむと

* 参加者を集める為に賞金で釣る事はしない
* 最終的にコミュニティの称賛のみが報酬
* 参加者の動機付け
* 序列付けされる事に対する心理的ハードルの軽減

　といった課題を少しずつクリアしながら今の形になっています。


## ユーザーコンテストの現状
　おかげさまでユーザーコンテストも無事3回目を迎える事が出来ました。
主催が毎回同じだと評価基準が偏るので、有志の協力を得ながら持ちまわりで運営しています。イベント開催のフォーマットも固まったので、同じようなスタイルなら問題なく開催出来る事でしょう。
　私自身はずっと運営側として関わっていますが、本音を言うと私も参加したいです。なので私抜きで勝敗を決めるコンテストを誰か開催してください。

## 私の望む世界
　今まで体験した事のないゲームに出会いたいというのが本音ですが、コミュニティ全体の技術的向上がなされれば、そのうち叶う事でしょう。
　新しい遊び方は若い人のほうが柔軟な発想で考案してくれると期待しています。私は長い事ゲームをやりすぎて固定観念から抜けるのが難しいと自己評価しています。新しいゲームシステムの考案よりレトロゲーム再現の方が楽しいのは、きっとその為でしょう。
　開発のハードルが低いからこそ、新しいアイデアを形にしやすい環境がはじプロにあります。

　コミュニティ全体の技術的向上に話を戻すと老兵に出来る事は後進の育成位でしょうか。自分自身の楽しみも兼ねた趣味の開発をしながら、場の提供であったり再利用可能なテクニック等を記録し広める事でコミュニティと関わっていこうと思っています。

　というわけで若い皆さん、面白いゲーム作ってくださいね。


## 突然の自己紹介
　はじめてゲームプログラミングでゲームを作ったり他の方の作品で遊んだりしています。
　好きが嵩じてユーザーコンテストを開催したり、twitterを利用したハイスコア集計botを作ったり、はじプロの技術系同人誌を作ったりしています。
　この記事を読んではじプロに興味を持たれた方が居ましたら、目次だけでも一読頂けると幸いです。
<img width="200" alt="gbg960" src="https://pbs.twimg.com/media/FiQPY1iVsAAzqEo?format=jpg&name=large">

https://techbookfest.org/product/nimfLz5xVJMYFfs30SG2HA?productVariantID=chnrKgywFGZPrkBTCs1ySa&utm_campaign=share&utm_medium=social&utm_source=twitter
postgreSqlインストール


下記サイトからダウンロード
https://www.postgresql.org/
https://www.postgresql.org/download/
https://www.postgresql.org/download/windows/


```
ダウンロードしたexe実行する
```

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531298/ce8b3d26-3253-4497-dfad-db4404ed860b.jpeg)

![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531298/09c7dc8b-a171-c1d9-4c55-6635896b0c08.jpeg)

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531298/080d43ed-5175-b015-1aa1-415cbdb3e091.png)

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531298/84e909e3-d345-1403-d1b5-0c15b903fbfe.png)

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531298/f09f881c-6a74-a1d2-a1e9-0424b596a284.png)

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531298/f4297031-d2f8-f10a-cb13-1fca27889b4b.png)

```
パスワード入力  test
```

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531298/c8bd57eb-9517-9871-1569-626936bc524e.png)

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531298/72b4a549-9b82-7ee8-5772-95bb91538ecd.png)

```
Japanese Japan 選択
```

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531298/6cc004c1-48bd-e407-3ab6-1971e66df864.png)

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531298/cae59c68-69a9-b688-3d4a-ff445ab2dc3e.png)

![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531298/168cb115-0fc2-05fd-d4bf-2e812c8fe88d.png)

```
チェック外す！！！
```
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531298/7a3bb3f8-fed1-2021-1fcd-56b640af3bea.png)


```
日本語化する
```

![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531298/86a75f37-dda7-2216-b407-e15550bb72f3.png)

![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531298/a819c1e3-3b98-e33f-8c44-dcea47351aa3.png)

![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531298/fc1d0355-8065-9afb-4ecb-9689564887d6.png)

![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531298/e2c83a59-a5fe-7275-bb30-5d78ccd5fc67.png)
リーダブルコードまとめ

自分メモ用
使えそうな部分を抽出しました。

## 名前に情報を詰め込む（２章）

・ループ変数は配列名の最初の文字と同じにするとわかりやすい
```java:
member[mi] employee[ei]
for(mi = 1; mi <= 100; mi++) 
```
・単位があれば変数に加えるとよい
例：ミリ秒→ms　キロバイト→KBなど

・変数を定義した行と使う行が近ければ短い変数名で構わない。
使うのが遠い時は長い変数名でもしっかり書く。

・最大値、最小値を表す定数の頭にはmax,minをつける
```javascript:
max_count;
min_password_char;
```
・真偽値を表す変数には頭に is.has,can,shouldをつけることが多い

## 美しさ（４章）

・似ているコードは似ているように見せる
例：似たようなメソッド（変数を変えただけみたいな）を複数使う時は、
イコールの後に必ず改行する。みたいに一貫性？を持たせる。

・改行や空白を駆使して、縦を揃えるように意識する

・変数の羅列などではブロックごとにコメントを入れるなど、まとまりを意識する

`・いろいろ工夫はあるが、一番重要なのはプロジェクトで一貫性を持たせること`

## コメントすべきことを知る(５章)
・コメントはひどい名前の埋め合わせに使うものでは無い

・いい変数名　＞　ひどい変数名　＋　いいコメント

・定数には何故そうしたかの考えを入れる
```java:
const int max_temp = 45;  //45℃以上だと熱すぎて火傷してしまう
```
・コードを理解するためならwhet でも how でも why でもなんでも書こう

・なぜこうなっているかを書くよに意識する

## コメントは正確で簡潔に（６章）
・代名詞は避ける
例：それ、あれ

・条件分岐では具体的に書く
例：取得した値によって優先度を決める　→　取得した値が正なら優先度を高くする

・コメントに実例を入れてしまう

```java:例
//性、名を逆転させて、間に空白を入れる
//fullName(String “田中”,String ”太郎”)は ”太郎　田中”になる
String fullName(String lastName,String firstName){
}
```

・情報密度の高い言葉を使う
例：//所在地を正規化する(例：”Avenue” → “Ave.”)。


## 制御フローを読みやすくする（７章）
・条件文は左が変数で、右が比べられる数（定数？）
例：if( length > 10){}
「もし、あなたの年齢が１８歳以上なら」
→「もし18年があなたの年齢以下ならば」だと気持ち悪い

・条件文は肯定が策にくるようにする、単純な条件を先に書く、関心を引く条件や目立つ条件を先に書く

・do-whileはあまり使わない方が良い

## 巨大な指揮を分割する（８章）


・ドモルガンの法則を使って条件式を単純化した方が良い

・説明変数を使う。
→if line.split(':'[0].strip() == "root";

username = line.split(':'[0].strip();
if username == "root"



## 変数と読みやすさ（９章）
・変数のスコープはなるべく短くする
→変数はなるべくpublicを使う。

前章と違って逆に変数を減らすという話だったが、少し難しかった。
<br>

## 無関係の下位問題を抽出する（１０章）
理想系としては
```java:
function(){
 functionA();
 functionB();
 functionC();

}

```
という形にすることである？
<br>


## 一度に一つのことを（１１章）
・ややこしい変数は最初に定義すると楽

```javascript:
var place = location_info["LocalityName"];
if(!place){
 place = location_info["SubAdministrativeAreaNaem"];
}
if(!place){
 place = location_info["AdministrativeAreaName"];
}
.
.
.

```
毎回出てくる place = location_info["~"]
の部分を、最初に変数として定義する



```javascript:
var town      = lovation_info["LocalityName"];
var city      = lovation_info["SubAdministrativeAreaName"];
var state     = lovation_info["AdministrativeAreaName"];
var country   = lovation_info["CountryName"];

```
「一度に一つのことを」の部分では無いが、こうするだけでだいぶスッキリする。

これがリファクタリング？
要するにひとつのメソッドに一機能？

<br>


## コードに想いを込める（１２章）

複雑なプログラムの時は、一旦動きを日本語で説明してみる。
困ったらラバーダッキング。
でも人に見られないように気をつけよう。
<br>


## 短いコードで書く（１３章）
・コードを書いたら削除したく無いものだ。書いたコードこそ実際の仕事の証で、それを消してしまったら時間が無駄になる。
→めっちゃわかる。自分もつい先日もチーム開発で同じことをしてしまった。ちっぽけなプライドなんて捨ててプロジェクトのことを第一に考えよう。

・ライブラリを使う
平均的なエンジニアが１日にかけるコードの量は１０行らしい。
本当かよって思ったけど、デバックやらテストやらを乗り越えられるコードたちが最終的にそのくらいになるらしい。

ライブラリとは正しく使えればそれだけで何行も稼げるので、どんどん使っていこうということ。
<br>
GitHub Actions で Skip になって PullRequest を Close/Reopen した話

# 前提条件

- PullReqeuest で，CI が動くようになっている

# 状況

- CI (GitHub Action) で Skip 状態になってどうにも re-run しても進まないような状態になってしまった
    - Skip になるような条件はあまり無さそうだった

# 対応

- Close → Reopen したらRun 状態になった
    - とりあえず動いた

## Refs

- [ワークフロー実行をスキップする - GitHub Docs](https://docs.github.com/ja/actions/managing-workflow-runs/skipping-workflow-runs)
【SwiftUI】Combineでテキストフィールドの文字数制限を実装してみた

# はじめに
「[比較して学ぶRxSwift入門](https://www.amazon.co.jp/%E6%AF%94%E8%BC%83%E3%81%97%E3%81%A6%E5%AD%A6%E3%81%B6RxSwift%E5%85%A5%E9%96%80-%E6%8A%80%E8%A1%93%E3%81%AE%E6%B3%89%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA%EF%BC%88NextPublishing%EF%BC%89-%E9%AB%99%E6%A9%8B-%E5%87%8C-ebook/dp/B07LGMNXS3/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=XXQFBR71LQ04&keywords=%E6%AF%94%E8%BC%83%E3%81%97%E3%81%A6%E5%AD%A6%E3%81%B6RxSwift%E5%85%A5%E9%96%80&qid=1667274135&qu=eyJxc2MiOiIwLjgxIiwicXNhIjoiMC4wMCIsInFzcCI6IjAuMDAifQ%3D%3D&sprefix=%E6%AF%94%E8%BC%83%E3%81%97%E3%81%A6%E5%AD%A6%E3%81%B6rxswift%E5%85%A5%E9%96%80%2Caps%2C165&sr=8-1)」という書籍にあったテキストフィールドの文字数制限をCombineで実装してみました

# 完成形
![Simulator Screen Recording - iPhone 14 Pro - 2022-11-01 at 12.38.24.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/a8309643-2561-f273-d0ea-52c28a1b39c8.gif)

# 実装
```ContentView.swift
import SwiftUI

struct ContentView: View {
    @StateObject var viewModel = ViewModel()
    var body: some View {
        VStack {
            TextField("名前", text: $viewModel.name)
                .textFieldStyle(.roundedBorder)
            Text(viewModel.nameLimitText)
                .foregroundColor(viewModel.nameLimitTextColor)
                .frame(maxWidth: .infinity, alignment: .trailing)
            TextField("住所", text: $viewModel.address)
                .textFieldStyle(.roundedBorder)
            Text(viewModel.addressLimitText)
                .foregroundColor(viewModel.addressLimitTextColor)
                .frame(maxWidth: .infinity, alignment: .trailing)
        }
        .padding()
    }
}
```

```ViewModel.swift
import SwiftUI
import Combine

final class ViewModel: ObservableObject {
    @Published var name: String = ""
    @Published var address: String = ""
    @Published var nameLimitText: String = ""
    @Published var addressLimitText: String = ""

    @Published var nameLimitTextColor: Color = .primary
    @Published var addressLimitTextColor: Color = .primary

    private let maxNameLength = 10
    private let maxAddressLength = 20

    private var cancellables = Set<AnyCancellable>()

    init() {
        $name
            .map { $0.count }
            .sink { [weak self] count in
                guard let self else { return }
                let length = self.maxNameLength - count
                self.nameLimitText = length >= 0 ? "あと\(length)文字です" : "名前は\(self.maxNameLength)文字以内で設定してください"
                self.nameLimitTextColor = length >= 0 ? Color.primary : Color.red
            }
            .store(in: &cancellables)

        $address
            .map { $0.count }
            .sink { [weak self] count in
                guard let self else { return }
                let length = self.maxAddressLength - count
                self.addressLimitText = length >= 0 ? "あと\(length)文字です" : "住所は\(self.maxAddressLength)文字以内で設定してください"
                self.addressLimitTextColor = length >= 0 ? Color.primary : Color.red
            }
            .store(in: &cancellables)
    }
}
```

# おわり
View側がスッキリしていてコードが見やすくなりました
Salesforce認定上級アドミニストレーター試験勉強徹底解説

こんにちは。本橋孝昭です

今回はSalesforce認定上級アドミニストレーター試験の勉強方法を解説します

今回の内容は動画でも公開しています

https://www.youtube.com/watch?v=ilqr-bQYyvc

<iframe width="560" height="315" src="https://www.youtube.com/embed/ilqr-bQYyvc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


## 資格の前提条件

Salesforce認定上級アドミニストレーター試験の前提条件として、Salesforce認定アドミニストレーター試験に合格しないといけません

認定上級アドミニストレーター試験に合格するためにまずは認定アドミニストレーター試験に合格しましょう

まだ認定アドミニストレーター試験を合格していないかたのために勉強方法の記事も作成しあｍしたのでこちらをご確認ください

https://qiita.com/Takaa/items/485dc2dd1e61f31f2ff9


## Salesforce認定上級アドミニストレーター試験　とは？


まず立ち位置としてはSalesforce認定アドミニストレーター試験の上位資格という位置づけです

詳細はこちらをご確認ください

https://tandc.salesforce.com/credentials

![資格一覧.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/6a589832-a99d-7a77-740e-5a70254e7084.png)

## Salesforce認定上級アドミニストレーター試験　試験詳細を確認しよう

受験ガイドには試験詳細がございます
ぜひご確認してください

https://salesforce.quip.com/dyBMAO1z6pJ9

 Salesforce 認定上級アドミニストレーター試験の詳細は次のとおりです。



* 内容: 多肢選択/複数選択方式の 60 問
* 試験の所要時間: 105 分
* 合格点: 65%
* 受験料: 20,000 円（税抜）
* 受験方法: テストセンターにおける監督下の試験、またはオンライン環境における監督下の試験。受験方法の詳細については、こちら (http://tandc.salesforce.com/howto-take)をクリックしてください。
* 参考資料: 試験中は、印刷物やオンライン資料は参照できません。 
* 前提条件: Salesforce 認定アドミニストレーター資格 

推奨コンテンツはこちらのようです

この試験に対応する自己学習教材はとして以下を推奨しています（英語コンテンツを含む）： 

* Trailmix: Prepare for Your Salesforce Advanced Administrator Credential (https://trailhead.salesforce.com/ja/users/strailhead/trailmixes/prepare-for-your-salesforce-advanced-administrator-credential)
* Superbadge: Process Automation Specialist (https://trailhead.salesforce.com/ja/content/learn/superbadges/superbadge_process_automation)
* Superbadge: Lightning Experience Reports & Dashboards Specialist (https://trailhead.salesforce.com/ja/superbadges/superbadge-lex-rd)
* Superbadge: Business Administration Specialist (https://trailhead.salesforce.com/superbadges/superbadge_business_specialist)
* Superbadge: Security Specialist (https://trailhead.salesforce.com/ja/superbadges/superbadge_security)



## 試験のサンプル問題を解いてみよう


受験ガイドにあるサンプル問題を確認しましょう

サンプル問題解説動画も作成したのでこちらをご確認ください

https://www.youtube.com/playlist?list=PLz8HSF-SrLeHbsfOqVlrWxJDRvM7ohJ-o
【jQuery】もし$(selector).load(ファイル名)が動かなくなったときの修正方法

## 外部ファイルが読み込まれない!?と思ったら

これまではload関数を使って以下のような記述で外部のHTMLやPHPを読み込み、特定のタグやIDに反映する方法がありました。

```
$("#include").load("include.html")
```

ところが2022年になって外部HTML（またはPHP）の中身が読み込まれないケースを確認。

全く読み込まないわけではなく、スーパーリロード（[SHIFT]+[CTRL]+[R]）した直後だと読み込まれる。

（ブラウザやサーバの）キャッシュに関連した問題なのだろうか？

### 改善策：$.ajaxを使う

```
$.ajax("include.html").done(function(data) {
	$('#include').html(data);
});
```
:::note info
コードは増えるが、普通のリロードでも都度読み込まれるようになる
:::

### 注意：キャッシュ回避だけでは解決しない？

```
$("#include").load("include.html?d="
    + Math.random().toString(36).substring(2, 12));
```
:::note alert
パラメータ付与はimgタグの都度読込に使える手法だが、load()だと意図どおりにならない
:::

根本的な原因は特定できていませんが、すぐ使える手法だと感じたので情報共有します。
フレンドリーフォアーディング機能に挑戦してみた。

#### フレンドリーフォアーディング機能とは

ログインしないままサイトを閲覧していて、気になる投稿があったから
ふとコメントしようとしたら、ログインが必要でログインページに遷移される、
なんてことはままあったりします。
さて、そんな時、ログインした後にまたTOPページに戻るとしたらめんどくさくないですか？
いやー、最後にいたページに戻してよー、ってなると思います。

その願いを叶えてくれるのがこのフレンドリーフォアーディング機能です。
簡単に言うと、ログイン前にいたページに戻してくれる機能といったところでしょうか。

ちなみにDeviseを使用していることが条件のようです。

#### 実装してみた

今回のフレンドリーフォアーディング機能の実装にはほぼこちらの記事にお世話になってます。
この記事をベースに実装しましたのでよければご参照を！

>https://techtechmedia.com/friendly-forwarding-devise/

##### ・ApplicationControllerの編集

```ruby:app/controller/appliation_controller.rb
class ApplicationController < ActionController::Base

    before_action :store_user_location!, if: :storable_location?　①
    
    private
    
    def storable_location?　①
     request.get? && is_navigational_format? && !devise_controller? && !request.xhr?
    end
    
    def store_user_location!
     store_location_for(:user, request.fullpath)　②
    end
    :
```

「現在のページ」にリダイレクトするには、現在のURLをセッションに保存し、
ユーザーが認証した後にセッションからURLを取得する流れが含まれます。
これはGETリクエストに対してのみ行われるようです。
①この"storable_location"でGET/Devise/Ajaxじゃないなどを判定をします。

以下の条件が当てはまらない場合のみ、sessionに現在のfullpathを保存します。
・getメソッドではない
・Deveiseコントローラーで表示される画面
・Ajaxでの遷移

②"request.fullpath"で好きなものに置き換えることができるようです。
"request.fullpath"はRailsドキュメントの公式によると、
最後にリクエストされたURLのパラメターを含むフルパスだそう。
これでユーザーは最後に閲覧したページにリダイレクトされるんですね。

##### ・session controllerの編集</h6>

```ruby:app/controller/session_controller/rb
class Public::SessionsController < Devise::SessionsController

  def after_sign_in_path_for(resource_or_scope)
      stored_location_for(resource_or_scope) || super
  end
:
```

ログイン後のpathを、先ほどsessionに保存したpathにsuperを使用してオーバーライドします。
superってなんだろう？ってなった方は以下記事参照ください。
>https://techtechmedia.com/super-overwrite-ruby/

これで完成！かと思いきや。サーバー起動したらまさかのAugument errorが...
エラー文によるとsession controllerにて引数が足りないと物申されています。

```ruby:app/controller/session_controller/rb
:
private

    def configure_permitted_parameters
      devise_parameter_sanitizer.permit(:sign_in)　←
    end
:
```
configure_permitted_parametersは、devise利用の機能
（新規登録やログイン認証など）が使われる場合に実行されます。

この引数の(:sign_in)を私が記述するのを忘れてまして、引数がないために
「いや一体なにに対して許可すればいいのよ」って怒られてました。
こちらを追加で記述したところ、無事エラー解消し機能実装することができました！

以下参考にさせていただいた記事です。
>https://zenn.dev/akhmgc/articles/d99bd7438c3f38
>https://github.com/heartcombo/devise/wiki/How-To:-Redirect-back-to-current-page-after-sign-in,-sign-out,-sign-up,-update
heic/heifの判定をしてみたのでJSでの実装を公開する

## はじめに
先日、私の所属するチームでheic/heif画像をjpegに変換する処理を実装したのですが、その際に、処理に渡されたファイルが本当にheic/heif形式であるかを判定する必要がありました。  
この記事では、heic/heif判定を実装する場合に必要な情報と、参考実装を記載します。

## ファイルタイプの判定に必要な情報
画像に限らずですが、たいていのバイナリファイルはファイルの先頭部分にファイルタイプを含むさまざまな情報を入れています。  
この情報を参照することで、そのバイナリファイルはどんな形式のファイルなのか？ を判別できます。  
身近なところですと、[fileコマンド](https://github.com/file/file)はこの情報を使ってファイルタイプやメタデータの表示をしているようです。

今回のように自前で判定を実装する場合には、

- ファイルのどこに必要な情報が入っているのか？
- ファイル形式を示す情報はどんな形で入っているのか？

の2点を事前に知っておく必要があります。

[nokiatech/heif](https://github.com/nokiatech/heif)によれば、heifはISO Base Media File Formatに基づいたコンテナフォーマットであるそうです。

>HEIF is a visual media container format standardized by the Moving Picture Experts Group (MPEG) for storage and sharing of images and image sequences. It is based on the well-known ISO Base Media File Format (ISOBMFF) standard.

つまり、MP4と似たような、`先頭部にファイルサイズやファイルタイプを保持し、その後ろに実際のデータを持つ`構造であることが予測できます。  
[公式ドキュメント](https://nokiatech.github.io/heif/technical.html)を参照すると、実際にそのような構造になっているようです。

## 実際にファイルを確認する
先頭部にファイルタイプ情報が格納されていることがわかりました。  
ここでは実際にファイルを確認し、ファイルタイプを保持しているのかを確認してみましょう。

```sh
% od -xc IMG.HEIC | head -n 2
0000000      0000    1800    7466    7079    6568    6369    0000    0000
          \0  \0  \0 030   f   t   y   p   h   e   i   c  \0  \0  \0  \0
```

ファイル先頭部に`ftypeheic`とファイルタイプを示すデータが格納されていることがわかります。  
この部分を読み取って、heic/heifファイルが持ちうるファイルタイプと比較してあげることで判定できそうです。

## 参考実装
ここまでで得た情報から判定処理を実装すると、下記のようになります。

```javascript
/* 
 * NOTE: heicを示すヘッダーは複数ある
 * https://nokiatech.github.io/heif/technical.html
 */
const HEIC_MAGIC_HEADERS = ["ftypmif1", "ftypmsf1", "ftypheic", "ftypheix", "ftyphevc", "ftyphevx"];

/*
 * 画像のバッファを読み込んで、heic/heifであることを確認する
 * @param {Uint8Array} ImageBuffer
 * @returns {boolean}
 */
function isHeic(ImageBuffer) {
    const heicRange = ImageBuffer.slice(4, 12); // heicファイルの場合はこの範囲にftyp～が入っている

    const heicRangeHeader = heicRange.reduce(
        (heicRangeHeader, uint8) => heicRangeHeader += String.fromCharCode(uint8),
        ""
    );

    return HEIC_MAGIC_HEADERS.includes(heicRangeHeader);
}
```

## 終わりに
業務上画像を扱う機会は多いのですが、heic/heifファイルと向きあったのは初めてでした。  
今回実装するに際してあらためてドキュメントに目を通したのですが、比較的取り扱いやすい印象です。  
みなさんもファイルタイプの判定のようなところから、気軽にバイナリファイルに触れてみてはいかがでしょうか。

## 補足
公式にheic/heifとして取り扱うファイルヘッダは参考実装に含めた6つのみですが、[fileの実装](https://github.com/file/file/blob/84eeb6f7ad24017f4248836defc08133fa86e8c7/magic/Magdir/animation#L191-L219)を読むと、それ以外にも公式ドキュメントには記載されていないものが複数存在しているようです。  
これらも判定に使ってあげることで、より確実にheic/heifの判別ができるかもしれません。
netomikoを利用したNW機器の自動コンフィグバックアップの仕組みづくり

## 背景
当社の商用機では各NW機器について自動で設定内容がバックアップされる仕組みがあるが、
検証環境では各担当者が検証時に適宜検証ファイルにバックアップを保存して設定内容を管理しており、
以下理由からコストをかけずに検証環境でもコンフィグ自動バックアップシステムを作成したいと考えた。
- 各機器のコンフィグの一元的に管理したい
- 都度、手動でコンフィグのバックアップをとる必要性をなくしたい



## 利用したもの
- Python3
  - ライブラリ：netmiko
  - ライブラリ：pandas

## 仕組み
- 既存の検証環境のサーバにてPythonを利用して実装
- コンフィグバックアッププログラムをcronにより定期実行
- NetmikoというNW機器へのログイン操作を補助してくれるPythonライブラリを利用
- コンフィグ取得対象リストのcsvファイルを参照し、対象機器のコンフィグの取得を実施

### コンフィグバックアップの仕組みのイメージ
![コンフィグバックアップシステム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2917475/f5966569-8ef7-cb19-57d1-65e1beac2d73.png)

### プログラム
```py
#!/usr/bin/env python3
from netmiko import Netmiko
from netmiko import NetMikoTimeoutException

#コンフィグ取得対象リストファイル読み出し
import pandas as pd
csv_input = pd.read_csv(filepath_or_buffer="/opt/config_backup/device_list.csv", encoding="ms932", sep=",")

#リストファイルに対して一行ずつ処理を行うためにforループ
for count in range(csv_input.shape[0]):
  #取得コンフィグ出力先を設定
  file = open("/home/share/_config_auto_get/"+csv_input.values[count, 0]+"/"+csv_input.values[count, 2]+"_"+ csv_input.values[count, 6]+".conf", 'w')

  #devive情報設定(コンフィグ取得対象リストから情報取得)
  device = {
    'device_type': csv_input.values[count, 1],
    'ip':          csv_input.values[count, 2],
    'username':    csv_input.values[count, 3],
    'password':    csv_input.values[count, 4],
    'secret':      csv_input.values[count, 5],
  }

  #コンフィグ取得先に接続する旨、標準出力に表示
  print("Connecting to " + csv_input.values[count, 2])

  #Netmikoを用いてコンフィグ取得先への接続(try/exceptで例外処理)
  try:
    connection = Netmiko(**device)
  except:
    print ("  --> [Error] unable to access " + csv_input.values[count, 2])
    continue

  #コンフィグ取得にenableモードに遷移する必要がある機器はenableモードに遷移
  if csv_input.values[count, 7] == 1 :
    #enableでモード遷移
    connection.enable()

  #コンフィグを取得
  output = connection.send_command(csv_input.values[count, 8])

  #ファイル書き出し
  file.write(output)
  file.close()
  print("  --> " + csv_input.values[count, 2] + " config get complet")

  #コンフィグ取得先への接続終了処理
  connection.disconnect()
```

### コンフィグ取得対象リストの項目
|  列番号  |  パラメータ  |  入力内容  |
| ---- | ---- | ---- |
|  0   | NW |機器が所属するNWセグメント<br>※コンフィグ保存ディレクトリ名に使用  |
|  1   | device_type |機器のタイプ指定  |
|  2   | ip |機器の管理IPアドレス  |
|  3   | username |ユーザ名  |
|  4   | password |パスワード  |
|  5   | secret |enable利用時のパスワード |
|  6   | hostname |ホスト名<br>※コンフィグ保存時のファイル名に利用 |
|  7   | enable_use |コンフィグ取得にenableモードに遷移が必要か？[必要:1/不要:0] |
|  8   | show_run_command |コンフィグ取得コマンド  |

## 工夫点
:::note info
ログイン操作補助PythonライブラリNetmikoを利用することで機器ごとのログイン操作の作り分けが不要に
:::

:::note info
コンフィグバックアップ対象の情報をリストとから読み込み処理する仕様としたことで、バックアップ対象機器の追加/削除が容易に
:::


## 終わりに
本プログラムを作成するにあたり、バックアップ対象機種ごとにログイン部分の処理を作成する点をネックに感じていたが、
情報収集を行ったところnetmikoによって対応機種であれば容易にログイン処理を任せることができることを知り、
簡易的なプログラミングで多くの機器に対して利用できるプログラムを作成することができた。
Pythonには便利なライブラリが数多くあるので、情報を仕入れて活用していきたい。
Macでtarファイルを展開する方法

# 概要

- Macにてtarファイルを展開する方法をまとめる。

# 方法

1. 展開にはtarコマンドを使う。`tar -h`の実行結果を下記に記載する。

    ```shell
    $ tar -h
    tar(bsdtar): manipulate archive files
    First option must be a mode specifier:
      -c Create  -r Add/Replace  -t List  -u Update  -x Extract
    Common Options:
      -b #  Use # 512-byte records per I/O block
      -f <filename>  Location of archive
      -v    Verbose
      -w    Interactive
    Create: tar -c [options] [<file> | <dir> | @<archive> | -C <dir> ]
      <file>, <dir>  add these items to archive
      -z, -j, -J, --lzma  Compress archive with gzip/bzip2/xz/lzma
      --format {ustar|pax|cpio|shar}  Select archive format
      --exclude <pattern>  Skip files that match pattern
      -C <dir>  Change to <dir> before processing remaining files
      @<archive>  Add entries from <archive> to output
    List: tar -t [options] [<patterns>]
      <patterns>  If specified, list only entries that match
    Extract: tar -x [options] [<patterns>]
      <patterns>  If specified, extract only entries that match
      -k    Keep (don't overwrite) existing files
      -m    Don't restore modification times
      -O    Write entries to stdout, don't restore to disk
      -p    Restore permissions (including ACLs, owner, file flags)
    bsdtar 3.5.1 - libarchive 3.5.1 zlib/1.2.11 liblzma/5.0.5 bz2lib/1.0.8
    ```

1. 公式ドキュメントによると`tar -xvf 当該のtarファイルパス`とすることで展開できる。（`-x`オプションは展開の指示、`-v`オプションは細かく状況を出力する指示、`-f`オプションはファイルを指定する指示）

    ```shell
    tar -xvf 当該のtarファイルパス
    ```

# オチ

- 実は今回、筆者が展開しようとしていたtarファイルはDockerイメージのtarファイルでした。Dockerイメージのtarファイルは展開せず、dockerにimportする必要があります。

# 参考文献

https://support.apple.com/ja-jp/guide/terminal/apdc52250ee-4659-4751-9a3a-8b7988150530/mac
Gitの基本設定について

【[自分とこの環境下におけるGit & GitLabレクチャー](https://qiita.com/drafts/dee76f411cf2488b6873/edit)】

# 概要

gitの設定は以下の二種類がある．

- コンピュータ全体に対する共通設定
- プロジェクト固有
    - 各プロジェクト以下のディレクトリに対してのみ有効

設定の保存場所は，それぞれ以下のようになる．

- ホームディレクトリ以下の.gitディレクトリ(各個人の全体設定)
    - ~/.git/
- 各プロジェクトのトップディレクトリの.gitディレクトリ(プロジェクト毎の設定)

優先順位は，プロジェクト毎の設定 > 各個人の全体設定である．

# 設定方法

設定は以下のコマンドで行う．各個人の全体設定の場合，引数`--global`を付け，プロジェクト毎の設定の場合はプロジェクトのトップディレクトリで`--global`を付けずに入力する．
`[設定項目]`で設定できる内容は[設定項目](#設定項目)で説明する．

## 各個人の全体設定

```shell
$ git config --global [設定項目]
```

## プロジェクト毎の設定

```shell
$ cd プロジェクトのトップディレクトリ
$ git config [設定項目]
```

## 設定項目
プロジェクト固有・共通設定ともに同じ内容．

### 現在の設定値を確認

```shell
$ git config --global --list
```

### ユーザの名前の設定

```shell
$ git config --global user.name "*** ***"
```

ldapなどでの認証では，snなどの値が用いられる．GitLabなどのprofileと合わせておく．ユーザ識別するための情報として用いるため重要．
例えばプロジェクトによって異なるGitLabサーバで異なる名前・メアドを使用している場合にはプロジェクトごとに設定することになる．

### ユーザのメアドの設定

```shell
$ git config --global user.email ***@***
```

ldapなどでの認証では，emailなどの値が用いられる．GitLabなどのprofileと合わせておく．ユーザ識別するための情報として用いるため重要．
例えばプロジェクトによって異なるGitLabサーバで異なる名前・メアドを使用している場合にはプロジェクトごとに設定することになる．

### テキストエディタの指定

```shell
$ git config --global core.editor ***
```

コメントなどを入力するときのテキストエディタを指定する．

- 設定値
    - vi
        -推奨値

### pushの挙動の設定

```shell
$ git config --global push.default ***
```

- 設定値
    - nothing
        - 推奨値
    - matching
    - upstream
    - simple
    - current

### 改行コードの設定

```shell
$ git config --global core.autocrlf ***
```

- 設定値
    - true
        - windowsでwindows用プログラムしか作らない場合の推奨値
    - input
        - windowsでlinux用のプログラム・モジュールをクロスコンパイルする場合の推奨値
    - false
        - linux用の推奨値
【Docker】Cannot remove Docker Compose application. Reason: Error invoking remote method 'compose-action'の対処法

<h2>症状</h2>
コンテナを削除しようとしたところ、下記のエラーが発生しました。
翻訳してみると「Docker Compose アプリケーションを削除できません。理由: リモート メソッド 'compose-action' の呼び出しエラー:」となりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927880/38ae6225-2dca-beda-8ccd-5aa0bb7133db.png)


```
Cannot remove Docker Compose application. Reason: Error invoking remote method 'compose-action': Error: spawn C:\WINDOWS\system32\cmd.exe ENOENT
```
<h2>解決策</h2>
docker-compose downを実行することで、削除できるようになりました。

```terminal:solution
docker-compose down
Stopping neareats-db-1 ... done
WARNING: Found orphan containers (app-front-1) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.
Removing アプリ名-app-1      ... done
Removing アプリ名-frontend-1 ... done
Removing アプリ名-db-1       ... done
Removing network アプリ名_default
```

<h2>参考</h2>

https://blog.supersonico.info/archives/4754/
ARフィルタってなに？

# はじめに
　業務で機械の音とかを取っているんだけど反響音って取り除けないか気になった。
　センパイに相談したらARフィルタがいいよって勧めらえられたから調べてみた
　<!--業務の具体性をもう少し示せるといい-->

# AR(Autoregressive)フィルタとは
　反響ノイズを取り除くフィルタで、
　簡単に例えるとやまびこを取り除くフィルタでヤッホーの音波形の反射音ヤッホーを打ち消す感じです
　※Snowみたいな画像に犬耳を付けるAR(Augmented Reality)フィルタではない！！
![やまびこ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698491/7ebdfe7c-ff92-30ff-3ecd-dc64ca6dc670.png)

ARフィルタは音の中に同じ波形がどんな間隔で何個出ているかつまりやまびこ「ヤッホー」がどの位遅れで何回繰り返されるか。
つまりのつまり「どの辺に何個」音を跳ね返す物体があるのかをを学習している
![やまびこ_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698491/a9cc2cc4-cfe4-9ba6-b18a-0b1d4e8f7ca0.png)
　<!--画像が著作権的に問題ないかを確認する-->

# 使い方のイメージ
- 学習データの準備
次数をカバーするだけの長さの音が必要
つまり「ヤッホー ヤッホー ヤッホー」が途中で切れていないデータを準備

- 学習音からARフィルタを生成
 
- 確からしさの検証
AICやBICで適合度が最も高い次数を使う。
つまりAICやBICが元の「ヤッホー」の塊とやまびこと思われる「ヤッホー」が最も一致する値（の適合度）を出力してくれる。

- 同じ学習音をARフィルタで補正

# まとめ
ARフィルタを調べてみて、反響音の除去にはとても有効なフィルタであることが分かった。
実際に使う際も、Pythonで実装すればそれなりに簡単にフィルタを作ることができるため、
今後活用したい。
派生コード変換(Deriv)

[Teradata Vantage - Vantage Analytics Library](https://docs.teradata.com/r/Vantage-Analytics-Library-User-Guide/January-2022)[2022/9/22時点]の翻訳です。
(リリース番号 : 2.1.1 | リリース日 : January 2022)
> この記事はVantageアナリティクスライブラリ シリーズのコンテンツです。

# 概要
導出変換を使用して、列に基づく数式の結果を表に入力します。たとえば、入力テーブルの列のすべての値が非負であることがわかっている場合、導出を使って列の各値に 1 を加え、結果の値の自然対数をとり、最終結果を出力テーブルの列に入力することができます。

この関数はテーブルに含まれる項目を使い新たな項目を導出します。
四則演算(+-*/)、べき乗(**)、余り(%)、abs、exp、ln、log、sqrtを使って数式を作成できます。
引数は、式の中でx y z として使用できます。

# 前提条件
・Teradata Vantageインスタンスにアクセスできること。
・Vantage アナリティクス・ライブラリがインストールされていること。

::: note info
Vantage アナリティクス・ライブラリのインストールについて、既にVantageを導入頂いているお客様はTeradataサポートサービスにお問い合わせください。
Vantage Express (評価版)やクラウドサービスのDIYでご利用頂く場合は[Teradata Dounload](https://downloads.teradata.com/download)からダウンロードし利用可能です。
Vantage アナリティクス・ライブラリのインストール手順は「[Vantageアナリティクス・ライブラリのインストール](https://qiita.com/ykswi/items/12d0da2ac69b4b161881#vantage%E3%82%A2%E3%83%8A%E3%83%AA%E3%83%86%E3%82%A3%E3%82%AF%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)」の記事に従い行います。
:::

# データの準備
## サンプルデータの入手とデータベースへの格納方法
こちらの「[チュートリアル用のサンプルデータを用意する](https://qiita.com/tmsky/items/4d86ca35aef753290020)」を参照ください。


# 実行方法
この例は、➀売上金額と数量から単価、➁利益と売上金額から利益率を導出しています。

## SQLから実行する場合の例
```SQL
CALL td_analyze (
  'vartran',                          /* 分析手法　*/
  '
  database        = QID;              /* データベース名 */
  tablename       = Superstore;       /* テーブル名 */
  derive =
     {formula (''x/y''),     arguments (sales,quantity), outputname (tanka)}
     {formula (''x/y*100''), arguments (profit,sales),   outputname (profrate)}
  ;                                   /* 導出項目の定義 */
  '
);
```
:::note information
出力結果をテーブルに書き込む場合は以下オプションを指定可能です。
outputdatabase = 出力データベース名;
outputtablename = 出力テーブル名; 
overwrite = {true | false}; --- 未指定の場合はtrueで上書きします
:::

## 出力結果
|tanka|profrate|
|:-|:-|
|12.194|-254.99999999999997|
|5.184|34.99999999999999|
|6.3|46.00000000000001|
|192.296|-21.250000000000004|
|5.184|35|
|39.48|28|
|199.99|43|
|9.656|16.25|
|104.896|12.5|
|1.6079999999999999|-175|

# おわりに
:::note information
サンプルコードはSQL関数から掲載し順次Pythonコードも掲載していく予定です。
:::

:::note warn
警告
この本書は[Teradata Vantageドキュメンテーション](https://docs.teradata.com/)よりトピックに必要な情報を抜粋したものです。掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。正確な内容については、原本をご参照下さい。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
【React】クラスコンポーネント

## クラスコンポーネントとは？？
* 以前主流だったコンポーネントの作り方
（現在の主流は2019年で追加された関数コンポーネント+Hooks）

## クラスコンポーネントの問題点
1\. Class構文が必要で複雑になりがちなため、面倒かつコードを追いにくい
2\. ステートの管理が複雑なため、保守性が低い

## 書き方
まずは関数コンポーネント
```typescript
const Example = () => {
  return <h3>関数コンポーネントだよ！！</h3>;
};

export default Example;
```

次にクラスコンポーネント
```typescript
import { Component } from "react";

//Componentクラスを継承する
class Example extends Component{
  //jsxはrenderメソッドの中のreturnに記載する
  render(){
    return (
      <h3>クラスコンポーネントだよ！！</h3>
    )
  }
}
```

クラスコンポーネントはimport文で`{Component}`を呼び出し、クラスに継承しなければならない
JSXの記載もメソッド`render`メソッド内のreturnの中に記載する

この一文を出力するだけならまだ見やすいですが、さらにコードが増えると複雑になるようです。
私が関数コンポーネント＋Hooksが主流になっていて良かったと思うポイントは`this`を使う必要がなくなるというところです。(thisが使われているコードを見ると頭がこんがらがります)上記の例では出てきていませんが、state参照をするときに`this`を用いなければならないようです。

他にも様々な理由はあるようですが、基本的には関数コンポーネントを使いましょうとのことでした！
Windows10で日本語キーボードで英語キーボード設定使うときのメモ

なんかググっても
キーボード設定を日本語キーボードに戻し方がわからないので
諦めて英語キーボードを使用しているのですが
[https://www.nagasaki-gaigo.ac.jp/toguchi/pc/multilingual/keyboard_us_jis.htm](https://www.nagasaki-gaigo.ac.jp/toguchi/pc/multilingual/keyboard_us_jis.htm)
だけでは分からないことを表記します。

なんか左側のコントロールやらシフトやらが変なので基本的には右コントロール、右シフトを使う。
んで左側が微妙にずれているので
Shift＋CAPSではなくて
左Ctrl＋CAPSで大文字小文字切り替え・・

とメモ失礼いたします。
pcDuinoでNetBSD

FreeBSD/amd64を母艦にして、pcDuinoにNetBSDをインストールしてみました。

https://wiki.netbsd.org/ports/evbarm/allwinner/

まずu-bootをportsでビルドします。

https://qiita.com/yamori813/items/771c4dd289c2241540d0

micro sdをUSB変換で母艦にさします。

armv7.imgをNetBSDのサイトからダウンロードして、ビルドしたu-bootと書き込みます。

```
% fetch http://cdn.netbsd.org/pub/NetBSD/NetBSD-9.3/evbarm-earmv7hfeb/binary/gzimg/armv7.img.gz
% gzip -d armv7.img.gz
% sudo dd if=armv7.img of=/dev/da0 bs=1m conv=sync
% sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/da0 bs=1k seek=8 conv=sync
```

armv7.imgはu-boot用に先頭に空きスペースがあって、そこにu-bootを書き込む事でブートできるようになるようです。

![netbsd-a10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/28249651-49f8-37cf-89d1-973f6adb97e3.png)

出来上がったmicro sdをpcDuinoにさして電源を入れるとブートします。

armv7.imgは初回起動時に/ファイルシステムをメディアのサイズにリサイズするようです。

初回起動時にはいろいろ設定をするので、時間がかかります。

https://dmesgd.nycbug.org/index.cgi?do=view&id=6756

```
armv7# df
Filesystem    1K-blocks       Used      Avail %Cap Mounted on
/dev/ld0a       7549880    1029408    6142984  14% /
/dev/ld0e         81820      33456      48364  40% /boot
kernfs                1          1          0 100% /kern
ptyfs                 1          1          0 100% /dev/pts
procfs                8          8          0 100% /proc
tmpfs            131072          8     131064   0% /var/shm
```

母艦で見るとこうです。

```
% sudo gpart show da0
=>      63  15572929  da0  MBR  (7.4G)
        63     32705       - free -  (16M)
     32768    163840    1  fat32lba  [active]  (80M)
    196608  15376384    2  !169  (7.3G)
```

armv7.imgはFATとffsで出来ていて、FAT部分はこんなファイルが入っています。

```
=> fatls mmc 0
            dtb/
  8887704   netbsd-GENERIC.ub
  8887696   kernel7.img
    21522   bcm2836-rpi-2-b.dtb
    21713   bcm2837-rpi-3-a-plus.dtb
    22194   bcm2837-rpi-3-b.dtb
    22630   bcm2837-rpi-3-b-plus.dtb
    21655   bcm2837-rpi-cm3-io3.dtb
    80682   exynos5422-odroidhc1.dtb
    86448   exynos5422-odroidxu3-lite.dtb
    86743   exynos5422-odroidxu3.dtb
    85647   exynos5422-odroidxu4.dtb
    28381   socfpga_cyclone5_de0_nano_soc.dtb
    11684   zynq-cc108.dtb
    12083   zynq-microzed.dtb
    11867   zynq-parallella.dtb
    17306   zynq-zc702.dtb
    16059   zynq-zc706.dtb
    12037   zynq-zc770-xm010.dtb
    11518   zynq-zc770-xm011.dtb
    11527   zynq-zc770-xm012.dtb
    11988   zynq-zc770-xm013.dtb
    11571   zynq-zed.dtb
    12048   zynq-zturn.dtb
    11595   zynq-zybo.dtb
    11694   zynq-zybo-z7.dtb
      227   boot.ini
      115   cmdline.txt
      234   config.txt
     1494   LICENCE.broadcom
    52116   bootcode.bin
     6660   fixup.dat
     2618   fixup_cd.dat
  2846852   start.elf
   677732   start_cd.elf
            EFI/
      129   boot.cmd
      201   boot.scr

36 file(s), 2 dir(s)

```

NetBSDではAllwinnerやラズパイはGENERICカーネルでサポートしているようです。

GENERICカーネルはFTDでコンフィグレーションをしていて、DTB(DTSをコンパイルしたもの)はu-bootから拾っているようです。

ruby31とbisonをpkg_addしてgem31でrakeをinstallしてmruby 3.1をビルドしてみました。fib(32)が6秒でした。

micro sdにrwなファイルシステムを作っているので、ハードに使うとmicro sdがじきに壊れます。

10.0も同じ手順でインストールできましたが、イーサーネットが使えません。(2024/04/01)
Expressのアプリケーション作成のメモ

# 環境
+ macOS Monterey
+ noed v18.4.0
+ npm 8.12.1
+ express 4.16.1

# 前提
Node.jsがインストールされている。

# Express Generatorのインストール
```
npm install -g express-generator
```

# Express Generatorでアプリケーション作成
```
express --view=ejs アプリケーション名
```

# npmのインストール
```
npm install
```

# アプリケーションの実行(Windows)
```
node vin/www
```

# アプリケーションの実行(macOS)
```
node bin/www
```

# npmで実行（コレが楽）
```
npm start
```

# Webブラウザで確認
http://localhost:3000/にアクセス。
paiza.ioでelixir その33

# 概要
paiza.ioでelixirやってみた。
型が分からないので、調べてみた。

# サンプルコード

```
defmodule TypeBy do
  @spec get(any) :: String.t()
  def get(x) do
    dict = %{
      &is_atom/1      => "Atom",
      &is_binary/1    => "Binary",
      &is_bitstring/1 => "BitString",
      &is_boolean/1   => "Boolean",
      &is_float/1     => "Float",
      &is_function/1  => "Function",
      &is_integer/1   => "Integer",
      &is_list/1      => "List",
      &is_map/1       => "Map",
      &is_number/1    => "Number",
      &is_pid/1       => "Pid",
      &is_reference/1 => "Reference",
      &is_tuple/1     => "Tuple",
    }
    typename_list = Enum.filter_map(dict, fn {pred, _} -> 
        pred.(x) 
    end, fn {_, name} -> 
        name 
    end)
    if Enum.empty?(typename_list) do
      "unknown type"
    else
      Enum.join(typename_list, " & ")
    end
  end
end

x = "hello"
IO.puts "type: #{TypeBy.get(x)}"
x = 13
IO.puts "type: #{TypeBy.get(x)}"
x = 'hello'
IO.puts "type: #{TypeBy.get(x)}"
x = 3.14
IO.puts "type: #{TypeBy.get(x)}"
x = true
IO.puts "type: #{TypeBy.get(x)}"
x = :hoge
IO.puts "type: #{TypeBy.get(x)}"
x = {6}
IO.puts "type: #{TypeBy.get(x)}"
x = [7]
IO.puts "type: #{TypeBy.get(x)}"



```

# 実行結果

```
type: Binary & BitString
type: Integer & Number
type: List
type: Float & Number
type: Atom & Boolean
type: Atom
type: Tuple
type: List
```

# 成果物

https://paiza.io/projects/bTLkvldYt7VZ7PxksFT6MQ


以上。
今日は何日？（Googleスプレッドシート）

# 当日段階での日割り計算を毎日確認したいので、今日の日にちを計算式に入れたい

探してもなかなか見つからなかったので備忘録

```
=DAY(TODAY())
```

これで、今日の日付から日にちだけを取り出せるっぽい
セルに書式設定する必要はない。
（日付の書式設定が残ってたら、変に結果が表示されてた）

# その他の要素をTODAY（）からの取り出す方法

#### TODAY()で今日の年の数字だけを表示する場合
=YEAR(TODAY())

#### TODAY()で今日の月の数字だけを表示する場合
=MONTH(TODAY())

#### TODAY()で今日の日にちの数字だけを表示する場合
=DAY(TODAY())

#### TODAY()で今月の月末の日にちの数字だけを取得する場合
=EOMONTH(TODAY(),0)

---

参考:[TODAY（トゥデイ） - Googleスプレッドシート関数](https://google.dw230.com/today/)
【データ基盤構築/BigQuery】UNNESTを使用して、コンテンツ公開日にPVが無かったコンテンツのデータを用意する方法

# 今回の課題
以前投稿した下記の記事にて、WINDOW関数を使用してコンテンツ公開日から7日間のpv数を抽出した。
しかし、**コンテンツ公開日にPVが無かったコンテンツ**が存在していたようで、
正しく数値を取得できていなかったため改善をした。

**コンテンツ公開日のPV数が0**という行を用意すれば改善できるので、その方法を書き残す。


## 以前実装した内容
下記記事にて、WINDOW関数を使用して、
コンテンツ公開日から7日の間で、
コンテンツ毎にどれくらいPV数があったかを算出した。

https://qiita.com/Ayumu-y/items/86baa56006b403a0c569



## 課題を解決した方法
まず、以前は下記のクエリで、コンテンツ公開日から7日間のPV数を抽出しようとした。
しかし、これだけではコンテンツ公開日にPVが無かった場合正しく数値を出せないので、
コンテンツ公開日にPV数が0という行を追加していく。


#### 問題のあるクエリ
```SQL
select
    date            -- ページビューが発生した日
    , release_date  -- 公開日
    , page_title    -- コンテンツ名
    , sum_pageviews -- PV数
    , sum(sum_pageviews) over (partition by page_title order by unix_date(date) range between current row and 6 following) as sum_pageviews_7days -- 公開後7日間のPV数
from
    `テーブル名'
where
    date = release_date
```

### 改良後のクエリ

```SQL
-- 全てのコンテンツ(page_title)に対して, user_type毎にコンテンツ公開日のPVが０のデータを用意してUNION ALLで結合する
with master as (
    select
        date            -- ページビューが発生した日
        , user_type     -- '新規ユーザー' or '再訪ユーザー'
        , release_date  -- 公開日
        , page_title    -- コンテンツ名
        , sum_pageviews -- PV数
    from
        `ログ系テーブル名`
    union all
    select
        release_date as date -- 公開日(release_date)をdateカラムとして持ち、コンテンツ公開日のデータを用意する。
        , user_type
        , release_date
        , page_title
        , cast(0 as int64) as sum_pageview -- sum_pageviewsカラムに「0」を持たせておく。
    from
        `マスタ系テーブル名`
        , unnest(['新規ユーザー', '再訪ユーザー']) as user_type -- 全てのdate, release_date, page_title毎に、user_typeが「新規ユーザー」「再訪ユーザー」のデータを用意する。
)
-- PV数を合算する。
, master2 as (
    select
        date
        , user_type
        , release_date
        , page_title
        , sum(sum_pageviews) as sum_pageviews
    from
        master
    group by
        date
        , user_type
        , release_date
        , page_title
)
-- 公開後7日間のPV数を付けたす。
select
    date
    , user_type
    , release_date
    , page_title
    , sum(sum_pageviews) over (partition by page_title, user_type order by unix_date(release_date) range between current row and 6 following) as sum_pageviews_7days -- 公開後7日間のPV数
from
    master2
;
```
#### 改良後のクエリの解説
下記のように、**公開日のPV数が０**の場合のデータを用意することで、
**コンテンツ公開日にPVが無かったコンテンツ**の公開後7日間のPV数を正しく算出できるようになった。
* マスタ系のテーブルにPVが０のカラムを用意して、ログテーブルと結合する。
└マスタ系のテーブルの`release_date`カラムは発売日なので、発売日のPV数が0だった場合のデータを用意するという意図がある。
* マスタ系テーブルにて、`unnest`を使用して、ログ系テーブルに存在する`user_type`カラムを用意する。
└マスタ系テーブルにも`user_type`カラムを用意したうえでログテーブルとUNION結合することで、
`release_date`, `user_type`, `page_title`の粒度でGROUP BYすれば、
公開日7日間のPV数を集計できるようになる。

以上で、**コンテンツ公開日から7日間のPV数**を正しく算出できるようになった。
Azure Fundamentals(AZ-900)：Azure の基礎: Azureの管理とガバナンスについて説明する「Azure のコストに影響する可能性がある要因」

Microsoft Learnを用いたMicrosoft Azure Fundamentals(AZ-900)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始める方の参考になれば幸いです。

## 今回の学習内容
**◆「Azure のコストに影響する可能性がある要因」**
◇対応するMicrosoft Learn ラーニングパス
[Azure の基礎: Azureの管理とガバナンスについて説明する](https://learn.microsoft.com/ja-jp/training/paths/describe-azure-management-governance/)
◇対応するモジュール
[Azure のコストに影響する可能性がある要因について説明する](https://learn.microsoft.com/ja-jp/training/modules/describe-cost-management-azure/2-describe-factors-affect-costs-azure)

※前回の投稿は下記から確認できます。
[Azure Fundamentals(AZ-900)：Azure の基礎: Azure のアーキテクチャとサービスについて説明する「Microsoft Defender for Cloud」](https://qiita.com/fsd-jume/items/c5d2d1e60912b0c698d8)

## Azure のコストに影響する可能性がある要因
**Azureでは開発コストをCAPEXからOPEXに移行**
⇒OPEXは多くの要因の影響を受ける可能性がある

### リソースの種類
・リソースコストはリソースの種類や設定、リージョンなどに影響される
・リソース作成時に、そのリソースの従量制課金インスタンスが作成される
・使用量メーターはリソースの使用量を追跡し、請求の計算に使用される使用量レコードを作成

### 従量課金
・使用するリソースに対してのみ支払う
・リソースを特定期間中(1年または3年)に一定量利用する場合は、予約することで割引が可能(最大72%の割引)
⇒予約した分以上のリソースが必要になったときは、その分のみ支払うことで追加可能

### メンテナンス
・リソース追加時に併せて追加されたリソースが、元のリソース削除時に同時に削除されない可能性がある
⇒リソースを整理し、不要なリソースを削除することで無駄なコストを削減可能

### 地理
・選択するリージョンによりデプロイコストが異なる
・ネットワークトラフィックも地域(距離)に基づいてコストが異なる
例)ヨーロッパ→アジアよりもヨーロッパ内の方がコストが低い

### ネットワークトラフィック
・一部の受信 (Azureデータセンターに入ってくるデータ)は無料
・送信(Azureデータセンターから出ていくデータ)のコストはゾーンに基づく

### サブスクリプションの種類
・一部のサブスクリプションには使用量の許容値も含まれ、コストに影響を与える
例)Azureの無料試用版サブスクリプション
　①30日間は一定の金額まで無料で使用可能
　②12か月間無料で一部Azureサービスを利用可能(各サービスの無料利用分まで)
　③常に40種類以上のAzureサービスを利用可能(各サービスの無料利用分まで)
　※②③は30日または一定の金額を使った後は、従量課金制に移行した場合に引き続き適用

### Azure Marketplace
・サードパーティベンダからAzureベースのソリューションとサービスを購入可能
・コストはAzureサービス分だけでなく、ベンダ分も含まれる可能性がある
・すべてのソリューションは、Azureのポリシーと標準に準拠

## 次の学習内容
**◆料金計算ツールと総保有コスト計算ツール**

https://qiita.com/fsd-jume/items/870261357f72b799b8e2

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8
【AWS】エラー：The action failed because no branch named main was found in the selected AWS CodeCommit repository XXX. Make sure you are using the correct branch name, and then try again. Error: null

こんにちは。

今回AWS CodeCommitを初めて使い始めました。いつもGithubを使っているため、最初CodeCommitの設定周りで少し迷ったところがあったのでシェアします。もし同じエラーで困っている方の役に立てれば幸いです。


# エラー内容
**The action failed because no branch named main was found in the selected AWS CodeCommit repository XXX（レポジトリ名）. Make sure you are using the correct branch name, and then try again. Error: null**

→ 多くの方がGitでデフォルトブランチ（ルートブランチ）として使っているのは「main」もしくは「master」かと思います。私は後者です。笑
今回私がこのエラーになった理由は、**mainブランチがAWS CodeCommitのデフォルトブランチに指定されているリポジトリ**をクローンしてきて、mainブランチは使わないから削除してmasterブランチで作業したのが原因でした。
別にmainにするかmasterにするかについて制限はないので、このような場合は**AWS CodeCommit側でデフォルトブランチを変更する**必要があります。

# 解決


### ① AWS CLI
``` bash
aws codecommit update-default-branch --repository-name リポジトリ名 --default-branch-name ブランチ名
```


### ② コンソール操作
一番わかりやすいコンソール操作です。以下は設定画面です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2203079/76f8fe88-cea9-8370-f163-898907c9e564.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2203079/5c4c8bed-cdd2-983c-161a-8dbb56bcbb85.png)
デフォルトブランチを変更したいリポジトリ設定を開き、スクロールすると上記のようにデフォルトブランチ設定画面が表示されますのでこちらで変更します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2203079/7c27116d-7b0c-7773-d7e7-0496ff4ac2ce.png)
変更を保存すると上記のようにデフォルトブランチが変更されますので解決です！



より詳しい情報は、以下のAWSドキュメントをご参照ください。⇣
https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-change-branch.html


投稿をご覧いただきありがとうございます。
Wordpressの管理画面からアップロードできるファイルサイズ上限の変更

## はじめに
##### info.php・・・サーバーの情報をFTPから知れる（見るだけ、ファイルの中身は以下のみ、ルート直下に配置し、そのURLにアクセスすれば見れる）
```php:php.info
<?php
phpinfo();
?>
```


##### php.ini・・・サーバーの情報を司るマスターファイル
##### .user.ini・・・php.iniの設定を上書きできるファイル（ディレクトリごとに設定可能、ルート直下に置けばその下層のファイルに全て適応される）


##  .user.iniファイルの書き換え

以下のコードを書いたファイルをルート直下に設置（ディレクトリ単位に入れれば個別に設定変更も可）
```php:.user.ini
upload_max_filesize = 200M
post_max_size = 200M
```
AWS re:Invent 2022 で予定されているVMware Cloud on AWS関連セッション一覧

2022年11月28日-12月2日にラスベガスで開催される[AWS re:Invent 2022](https://reinvent.awsevents.com/)ではどんなVMware Cloud on AWS関連セッションが予定されているのだろう、とふと気になったので一覧にしてみます。

# 1. そもそもAWS re:Inventって？
AWSの年次カンファレンスです。2021年も同時期にラスベガスで開催されています。
現地での参加は有料ですが、オンライン参加であれば無料です！

https://reinvent.awsevents.com/


# 2. VMC関連セッションを検索してみる

本ブログ執筆時点では1,912セッションが予定されています。

https://portal.awsevents.com/events/reInvent2022/sessions

Area of Interestで"VMware"でフィルターかけてみると15セッションが検索ヒットし、
"VMware Cloud on AWS"でキーワード検索すると10セッションがヒットしました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/0dcb9b7f-33cb-4745-e384-53b728978b7a.png)

ちなみに、Session LevelですがAWS Japanのサイトに参考となる指標があります。
全体的にはLevel 200~300での中〜上級者向けのコンテンツの数が多い印象です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/74bd4fe1-f758-4970-ae57-4d92e477c3c1.png)


# 3. VMC関連セッションの一覧

VMC関連セッションの一覧をまとめてみます、セッション視聴登録の際にご参考ください。
順番はタイトルのアルファベット順になっています。

#### Level 200 (Intermediate - 中級者向け)

> Session ID: PRT230
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/1510f328-c909-9bc1-6c7a-98bd6c5a1a27.png)

> Session ID: PRT252
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/7f85e4a1-49af-4d1a-95c2-6f0fb9e777f1.png)

> Session ID: ENT233-R / ENT233-R1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/956f1cea-ae04-0233-2e34-22f96772c92e.png)

> Session ID: ENT223
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/9daad543-ca2e-a14b-c36d-d9155542e6ad.png)

> Session ID: ENT224
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/48436359-d7d7-da11-5067-e9b22bac35b0.png)

#### Level 300 (Advanced - 上級者向け)

> Session ID: ENT309
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/b4b674c9-f2ce-976f-7c49-b017b4120eab.png)

> Session ID: PRT331
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/5ca4cc78-1308-2ab3-5e01-d8ad8557d9fd.png)

> Session ID: ENT320
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/c237d00a-110c-fdb0-ba56-dcde50df9167.png)

> Session ID: ENT308
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/864151/9c1de008-3114-9138-bb83-e2b33c0ffcf7.png)


# 4. 関連記事

https://qiita.com/sanjushi003/items/2696271334893b12a494