OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonで通貨換算（為替レート取得）してみました

## 概要

USD から JPY へ為替変換する Pythonプログラムを作成しました。 AWSの CostExplorer を利用して取得した請求金額をJPYで表示することに利用しようと思います。

- 以下の２パターンで実施
  - CurrencyConverter を利用
  - pandas-datareader を利用

### 実行環境

macOS Monterey 12.3.1 
python 3.8.12

### 実行プログラム

```python:GetCurrentRaye.py
from currency_converter import CurrencyConverter
import pandas_datareader.data as pdr
import pandas as pd

# CurrencyConverter を利用した USD-JPY 為替
def get_currencyconverter_rate() :
    res0 = CurrencyConverter()
    crate = res0.convert(1, 'USD', 'JPY')
    print("CurrencyConverter を利用した USD-JPY 為替 ---> ", round(crate, 2), "\n")


# pandas-datareader を利用した USD-JPY 為替
def get_datareader_rate() :
    res1 = pdr.get_quote_yahoo('USDJPY=X')
    res2 = res1["price"].values 
    crate = res2[0]
    print("pandas-datareader を利用した USD-JPY 為替 ---> ", round(crate, 2), "\n")


# pandas-datareader を利用した USD-JPY 日毎為替情報
def get_datareader_rate_list() :
    df:pd.DataFrame = pdr.DataReader("USDJPY=X", "yahoo", start="2022/08/22", end="2022/08/26")
    print("pandas-datareader を利用した USD-JPY 対象期間の為替 ---> ")
    print(df.head(), "\n")


# メイン
if __name__ == '__main__':
    print("")
    get_currencyconverter_rate()
    get_datareader_rate()
    get_datareader_rate_list()
```

### プログラムの実行

```
## 為替レートの取得
(base) 22-08-30 8:39 ituru $ python GetCurrentRate.py

CurrencyConverter を利用した USD-JPY 為替 --->  138.35 

pandas-datareader を利用した USD-JPY 為替 --->  138.66 

pandas-datareader を利用した USD-JPY 対象期間の為替 ---> 
                  High         Low        Open       Close  Volume   Adj Close
Date                                                                          
2022-08-21  137.647003  136.737000  137.041000  137.041000       0  137.041000
2022-08-22  137.692993  135.882004  137.546005  137.546005       0  137.546005
2022-08-23  137.225006  136.192993  136.733002  136.733002       0  136.733002
2022-08-24  137.179993  136.326004  137.080994  137.080994       0  137.080994
2022-08-25  137.432999  136.360001  136.563004  136.563004       0  136.563004 
```

### まとめ

今後、pandas-datareader を利用していきたいと思います（為替情報が正確のようなので）。

### 参考記事

以下の記事を参考にさせていただきました。感謝申し上げます。
[Currency Converter](https://pypi.org/project/CurrencyConverter/)
[【Python】pandas-datareaderによる為替レートの取得](https://self-development.info/%E3%80%90python%E3%80%91pandas-datareader%E3%81%AB%E3%82%88%E3%82%8B%E7%82%BA%E6%9B%BF%E3%83%AC%E3%83%BC%E3%83%88%E3%81%AE%E5%8F%96%E5%BE%97/)
istioctlインストール

```
  935  free -m
  936  grep physical.id /proc/cpuinfo | sort -u | wc -l
  937  grep cpu.cores /proc/cpuinfo | sort -u
  938  grep processor /proc/cpuinfo | wc -l

  168  which istioctl
  240  helm repo add istio https://istio-release.storage.googleapis.com/charts
  242  wget https://github.com/istio/istio/releases/download/1.14.3/istio-1.14.3-linux-amd64.tar.gz
  244  tar xvf istio-1.14.3-linux-amd64.tar.gz
  245  ls -l istio-1.14.3/bin
  246  sudo cp ./istio-1.14.3/bin/istioctl  /usr/local/bin/
  247  istioctl version
```
【最新版】個人開発者におすすめの無料Slackコミュニティ5選

個人開発者におすすめのコミュニティサイト、5つをまとめてみました。（全て無料）

活発ですし、タメになる情報が多いのでおすすめです。

最新記事はこちら👇
https://kaedeee.com/recommended-slack-communities-for-creators

以下のURLから登録できます。


# クリコミュ
https://www.akali.co.jp/crecommu

# 運営者ギルド
https://www.notion.so/adminguild/05239b17becd4657a1506d7e2ea7016c

# Unity ゲーム開発者ギルド
https://scrapbox.io/unity-game-dev-guild-pr/Unity%E3%82%B2%E3%83%BC%E3%83%A0%E9%96%8B%E7%99%BA%E8%80%85%E3%82%AE%E3%83%AB%E3%83%89

# 個人開発者コミュニティ
https://join.slack.com/t/w1610969635-gbk526705/shared_invite/zt-1eta2qqy9-PCp8YjKoFoWJFDk_RRot6A

# Flutter Japan
https://www.flutterjp.com

最新記事はこちら👇
https://kaedeee.com/recommended-slack-communities-for-creators
【スプレッドシート】チートシート

覚書。

# 時給換算したいよ

`報酬セル/VALUE(稼働時間セル*24)`
![chrome_screenshot_docs.google.com.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498057/ac8bffea-a3f5-62df-9304-8d9bae783279.png)

https://u-note.me/note/69351

# 条件に合った行の色を変えたいよ

https://oshin.tokyo/entry/2019-spreadsheet-conditional-formatting
[TypeScript] readonly Array<T>は書けません

# 導入

今日もTypeScriptのお勉強を続けています。その中で気になったところがあり、調べてみることにしました。

# とりあえず結論
- `readonly Array<T>`が
```
error TS1354: 'readonly' type modifier is only permitted on array and tuple literal types.
```
と言われてダメになる理由がわからない。`Array<T>`は配列だしいいんじゃないの？と考えてしまう。

# 何が気になったの

```typescript
function getLargest(numArray: readonly number[]): number {
  return Math.max(...numArray);
}
```
こんな感じのものがあったときに、仮引数の型について
```typescript
numArray: readonly Array<number>
```
に変えてみたところ怒られました。
そこで、ReadonlyなArray(配列の中身をいじることができない型)であることを表現する方法について、調べることにしました。

# ReadonlyなArray

## `readonly T[]`

```typescript
const numArray: readonly number[] = [1, 2, 3];
```

## `ReadonlyArray<T>`
```typescript
const numArray: ReadonlyArray<number> = [1, 2, 3];
```

## `as const`
```typescript
const numArray = [1, 2, 3] as const;
```

# まとめ
上記3つが読み取り専用の配列を表現する方法のようです。
ただ、なぜ`readonly Array<T>`がダメなのかがずっと引っかかり続けています。
画像のようなエラーが出るということについて、コンパイラはこの文脈において`Array<T>`は「配列およびタプル リテラル型」でないと解釈しているように感じられるからです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306146/621eaca3-7453-400b-fc1e-f6fc42e8be29.png)
`Array<T>`の定義(`interface ArrayConstructor`)を見に行くと`Creates an array from an array-like object.`とあります。このあたりがミソなのでしょうか。
すっきりしないままですが、そういうものだと思ってとりあえず学習を続けることにします。

# その他
 8/30: 改題しました。
java.sql.Dateをシリアル値に、シリアル値をjava.sql.Dateに変換してみた

タイトルの通り、java.sql.Dateをシリアル値に、シリアル値をjava.sql.Dateに変換してみようと思います。

## まずはjava.sql.Date -> シリアル値

日付のシリアル値は
・1900年1月1日を 1
・1900年1月2日を 2
・1900年1月3日を 3
と、毎日1づつ増加していくので、```1899-12-30```からシリアル値にしたい日付までの日数を求めれば、シリアル値を求めることができます。

↓java.sql.Date -> シリアル値に変換するコード

``` q
/**
 * 引数の日付をシリアル値に変換
 *
 * @param date 日付
 * @return シリアル値取得
 */
public static Double convertToSerialNumber(Date date) {
    if (date == null) {
        return null;
    }

    final var requestLocalDate = date.toLocalDate();
    final var baseLocalDate = Date.valueOf("1899-12-30").toLocalDate();

    return (double) ChronoUnit.DAYS.between(baseLocalDate, requestLocalDate);
}
```

出力結果：
``` q 
log.debug(convertToSerialNumber(Date.valueOf("2022-08-30"))  // 44803
 ```

## 次にシリアル値→java.sql.Date
これはコード内で説明していこうと思います。

``` q
/**
 * シリアル値を日付に変換する。
 *
 * @param serialNumber シリアル値
 * @return 日付
 */
public static String parseExcelSerialNumber(String serialNumber) {
    if (serialNumber == null) {
        return null;
    }

    // 1900/1/1のシリアル値が1なので、加算する値は日付にしたいシリアル値-1になる
    int serial = new BigDecimal(serialNumber).intValue() - 1;
    // 1900/2/29は存在しないがエクセル内では存在しているらしいのでその日付以降であればさらに-1をする
    serial -= (serial > 60 ? 1 : 0);
    // Windowsでのデフォルトでは1900/1/1 12:00:00AMからなので,その時刻を表すCalendarクラスのインスタンス
    Calendar cal = Calendar.getInstance();
    cal.set(1900, 0, 1, 12, 0, 0);
    // 基準日に加算
    cal.add(Calendar.DATE, serial);

    return new Date(cal.getTime().getTime());
}
```

出力結果：
``` q 
log.debug(parseExcelSerialNumber(Date.valueOf("44803"))  // 2022-08-30
 ```

# 最後に
コード上に何か疑問点があればご指摘いただけると幸いです。
Javascriptで最大公約数を求める式をモダンな記法で書きたい

## 最大公約数の求め方

> ユークリッド互除法 大きい方の整数Aを小さい方の整数Bで割った余りをR とするとき，A, Bの組の替わりにB, Rの組に順次置き換えて，R=0となったときのBを最大公約数とする


## レガシーな書き方

```javascript
function gcd (x, y){
  if(x % y){
    return gcd(y, x % y)
  }else{
    return y
  }
}
console.log(gcd(480,1024)) // 32
```


## モダンなコード

```javascript
const gcd = (x, y) => x % y ? gcd(y, x % y) : y
console.log(gcd(480,1024)) // 32
```

or

```javascript
const gcd = (a, b) => !b ? a : gcd(b, a % b)
console.log(gcd(480,1024)) // 32
```

もっと面白い（変態的な）書き方あるよってあったら教えて下さい。
信頼できる唯一の情報源(single source of truth)の構築は何を意味するのか？

[What does it mean to build a single source of truth? \| Databricks on AWS](https://docs.databricks.com/lakehouse/ssot.html) [2022/8/25時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

Databricksのレイクハウスは、単一のシステムでデータアクセスとストレージを統合することで、複数のシステムにまたがってデータのコピーを作成、同期する必要性を排除し、信頼できる唯一の情報源(single source of truth: SSOT)を確立します。データの重複は多くの場合、データのサイロを生み出し、企業内の別々のチームが品質や鮮度が異なる同じデータの異なるバージョンで作業することになります。

# レイクハウスはどのようにトランザクションとデータアクセスをコントロールするのか？

Delta Lakeのトランザクションは、テーブルレベルでのACID保証を提供するために、データファイルと共に格納されるログファイルを使用します。Delta Lakeテーブルの背後にあるデータとログのファイルは共にクラウドオブジェクトストレージに存在するので、ビジネスクリティカルなワークロードにおいて、大量のクエリーがパフォーマンス劣化やデッドロックを引き起こすリスクなしに、同時にデータの読み書きを行います。これは、企業の環境においてユーザーとアプリケーションは、様々なワークロードを推進するために単一で同一のデータコピーに接続し、すべての参照者は、それぞれのクエリーが実行された際の最新の断面を受け取ることを保証することを意味します。

# プロダクションデータに対するアクセスの管理

Unity Catalogは、ユーザー、グループ、サービスプリンシパルに対して、きめ細かいアクセスコントロールをデータスチュワードに提供する集中管理されたデータガバナンスソリューションを提供します。Unity Catalogは、リソースを設定する際に柔軟性と特定性の両方を提供するアクセスコントロールリスト(ACL)を用いたアクセス権管理を行います。設定可能なアクセス権には以下のようなものがあります。

- 大量テーブルに対する読み取り専用アクセス
- データベースに対するテーブル作成、変更権限
- 特定のクラウドストレージの格納場所におけるデータの読み取り、変更権限
- Unity Catalog管理のストレージ資格情報を通じた大量リソースへのアクセス

詳細に関しては、[What is Unity Catalog?](https://docs.databricks.com/data-governance/unity-catalog/index.html)をご覧ください。

# レイクハウスにおけるビューの活用

Databricksにおけるビューは、レイクハウスのテーブルに格納されるデータに対する保存済みクエリーを表現します。テーブルに対するクエリーは書き込み時に実行されますが、ビューに対してクエリーが実行される都度、ビューは定義されたロジックを実行します。これは、様々なソースからのデータに対する最新のデータアクセスを提供することを意味し、計算処理は、必要に応じて結果を更新するためにのみ行われます。

ビューと他のデータオブジェクトをセキュアにし、共有するためにUnity Catalogを使用することができ、個人やチームは企業内でキーとなるビジネス場の意思決定をドライブするロジックを共有することが可能となります。

詳細に関しては、[Databricksレイクハウスにおけるデータオブジェクト](https://qiita.com/taka_yayoi/items/e90be9beeb1a744cee0d)をご覧ください。

# コラボレーターとデータを共有する

Unity CatalogにおけるACLはエンタープライズ組織における様々なデータ共有のユースケースをカバーしますがDelta Sharingは、あらゆるところにいるコラボレーター(協力者)と共有可能なデータに対する読み取り専用のアクセスを管理することで、さらにこれを拡張します。Unity Catalogでサポートされるユースケースには以下のようなものがあります。

- 多国籍企業で分離されたリージョンに対して、それぞれのリージョンの分析に対してリアルタイムのアクセスを提供します。
- 同じ企業の傘のもとで、分離されたビジネス部門に対してデータセットを共有します。
- サードパーティに対して顧客が整理したデータセットに対してセキュアなアクセス手段を提供します。

Databricksにおいては、Delta SharingはUnity Catalogにビルトインされる形で提供されますが、[オープンソースのDelta Lake](https://delta.io/sharing/)の一部でもあります。詳細に関しては、[Delta Sharingによるデータ共有](https://qiita.com/taka_yayoi/items/3a53516c4434c0ee76f0)をご覧ください。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
【Node.js / ブラウザ】JavaScriptでUTF-8のエンコード・デコード

UTF-8のバイト列とJavaScriptの文字列型との間の変換方法。ブラウザでもNode.jsでも共通のコードで動く。

ググっても古いやり方が出てくることが多いので書く。

# エンコード

```js
function encodeUTF8(str) {
  const encoder = new TextEncoder();
  return encoder.encode(str);
}

// 使い方例
const bytes = encodeUTF8('アイウ');
// Uint8Array(9) [227, 130, 162, 227, 130, 164, 227, 130, 166]
```

戻り値は[`Uint8Array`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array)。

# デコード
```js
function decodeUTF8(buffer) {
  const decoder = new TextDecoder();
  return decoder.decode(buffer);
}

// 使い方例
const str = decodeUTF8(Uint8Array.from([227, 130, 162, 227, 130, 164, 227, 130, 166]));
// "アイウ"
```

引数は`Uint8Array`を含めた[`TypedArray`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/TypedArray)や[`ArrayBuffer`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer)など。

# UTF-8以外のエンコーディング
デコードの場合は`new TextDecoder()`の引数にエンコーディングの名前を入れれば別のエンコーディングもデコードできる。使えるエンコーディングは規格で定められており、UTF-16BE、UTF-16LE、ISO-2022-JP、Shift_JISなどは使えることになっている（UTF-32は書いてないので使えないらしい？）。

エンコードの場合はUTF-8しか扱えない。どうやらこれからの文字データ交換に使うエンコーディングは全てUTF-8であるべきという思想があるようだ。なのでUTF-8以外で表現された文字列はこれ以上生成できないようにしようということだろう。

```js
const decoder = new TextDecoder('Shift_JIS');

// ↓これは働かない！
// const encoder = new TextEncoder('Shift_JIS');
```

# `Uint8Array` や `ArrayBuffer` って何？
これらはバイナリ列を表現するためのJavaScript標準の型である。`Uint8Array`は連続するメモリ領域を1バイトずつに区切り、区切った各要素内の1バイトを0から255までの符号なし整数として解釈した配列である（Pythonで言う`bytes`型と同じ）。 同様な型は他にも複数あり、まとめて`TypedArray`と呼称される。例えば`Int16Array`は連続するメモリ領域を2バイトずつに区切り、区切った各要素内の2バイトを-32768から32767までの符号付き整数として解釈した配列である。

一方の`ArrayBuffer`はというと、単なる連続したメモリ領域を表す型と説明できる。そのデータ列の解釈については何も仮定しないのでArrayBufferはそのままでは内容を取得したり変更したりの操作はできない。読み書きをしたい場合はTypeArrayの各型等に通すことで、その型を通じて操作できる。

```js
const buffer = new ArrayBuffer(12);   // 12バイトの連続するメモリ領域を確保
const bytes = new Uint8Array(buffer); // メモリ領域を1バイト符号なし整数を要素とする配列として解釈
bytes[3] = 193;                       // bufferの4バイト目を193にセット
console.log(bytes[3]);
// 193

const int32Array = new Int32Array(buffer); // 同じメモリ領域を4バイト符号付き整数を要素とする配列として解釈
console.log(int32Array[0]); // bufferの1から4バイト目を符号付き整数として解釈した場合の値を読む
// -1056964608
```
EC-CUBE4で未入金のまま出荷してしまった場合の対処法

# 入金日を入れないまま出荷してしまった！
こうなると管理画面からは入金しているのに未入金と表示されたままになってしまいます。
しかも[公式ドキュメントでは管理画面ではこれを修正する事はできないと書かれています](https://www.ec-cube.net/manual/ec-cube4/setting/system_masterdata.php])。

# 入金フラグはどこで見る？
ユーザーステータスのマスターはmtb_customer_order_statusテーブルに格納されており、そのIDがdtb_orderテーブルのorder_status_idフィールドに格納されています。
じゃあ、order_status_idを書き換えれば入金フラグが立つのでは？と思い見てみると、値は5、mtb_customer_order_statusでは発送済みのステータスで、そもそも入金済みというフラグは存在しないことがわかります。

# じゃあどこで入金フラグがあるの！？
もう一度dtb_orderテーブルを見てみるとpayment_dateというフィールドが空になっているのがわかります。
これが入金の有無、空なら未入金、日付が入っていれば入金フラグという仕組みになっています。
つまり、payment_dateフィールドに日付を入れてしまえば未入金という表示は消えます。
取り急ぎ、order_dateフィールドの日付と同じ日を入れてしまえば問題ないでしょう。

# まとめ
入金日を入れないまま出荷してしまったら、その注文IDでdtb_orderテーブルを検索、そこのpayment_dateフィールドに日付を入れれば入金フラグが立ち未入金でなくなる。

これくらいは公式ドキュメントに書いてくれてもいい気はするんですが。
部分テンプレート

繰り返し使用するコードを切り出し、ひとつのファイルで管理するもの。


# _ 〇〇.html.erb
部分テンプレートとして切り出すファイル名は、命名規則として先頭に＿(アンダーバー)をつける

    _sample.html.erb

# render , partial , locals

```ruby:test.erb
# _sample.html.erbというファイルを表示させ、hello!が代入された変数postが使えるようになる
<%= render partial: "ディレクトリ名/sample", locals: { post: "hello!" } %>
```

render...部分テンプレートを呼び出すメソッド
partial...部分テンプレートのファイル名を指定し、表示させる
locals...記入した変数を、部分テンプレート内で使用できる
順列「高知女子大学2009年前期生活デザイン学科第２」をsympyでやってみた。

同じものを含む順列[2,2,4,4,4,3,3]

オリジナル

https://mathmathmass.exblog.jp/32201987/

上と同じです。大学入試数学問題集成＞

https://mathexamtest.web.fc2.com/2009/200911821/2009118210200mj.html#q-0204


# wolframAlphaで

https://www.wolframalpha.com/input?i=7%21+%2F+%282%21+*+3%21+*+2%21%29&lang=ja

https://www.wolframalpha.com/input?i=%282%2B3%2B2%29%21+%2F+%282%21+*+3%21+*+2%21%29&lang=ja


組合せ論＞階乗と組合せ＞階乗の計算を行う：

https://www.wolframalpha.com/input?i=%E9%A0%86%E5%88%97&lang=ja


# sympyで
オリジナルのように、実際に書き並べてみました。
```python
from sympy import *
def permutations(L):
    if L == []:
        return [[]]
    else:
        ret = []
        S = sorted(set(L))
        for i in S:
            data = L[:]
            data.remove(i)
            for j in permutations(data):
                ret.append([i] + j)
        return ret
print("#",factorial(7)/(factorial(2)*factorial(3)*factorial(2)))
junretsus = permutations([2,2,4,4,4,3,3])
print("#",len(junretsus))
i=0
for junretsu in junretsus:
    i=i+1
    print("#",'{:3d}.'.format(i)," ".join(map(str, junretsu)))
# 210
# 210
#   1. 2 2 3 3 4 4 4
#      (途中省略)
#  68. 3 2 3 4 4 4 2
#  69. 3 2 4 2 3 4 4
#  70. 3 2 4 2 4 3 4
#  71. 3 2 4 2 4 4 3　　　<---------- 
#  72. 3 2 4 3 2 4 4
#      (途中省略)
# 141. 4 2 4 2 4 3 3
#      (途中省略)
# 210. 4 4 4 3 3 2 2
```

# 感想
＞どうも同じものを含む順列はプログラムは、しにくい…。(オリジナルより)
私も、
①7!(=5040)個並べる。
②小さい順に並べる。
③小さいものから順に調べて、同じものをはじく。
以上で,できるような気がしましたが、あきらめて参考です。
(sympy標準で「同じものを含む順列」見当たりませんでした。?）


# 参考
class sympy.functions.combinatorial.factorials.factorial(n)＜

https://docs.sympy.org/latest/modules/functions/combinatorial.html#factorial

https://qiita.com/Kodaira_/items/98d3d0d2f3792926e7b3
Accessのレポートでトレースに必要なファイルパスやレポート名を動的に印字

# 概要

Accessのレポートに **『Access自身のファイルパス』** や **『レポート名』** などを印字したい。
ただ印字するのではなく、Accessのファイル名やレポート名を変更してもメンテ不要にしたい。
（動的に値を印字）

# 何でこんなことをするのか？

トレースしやすくするため。

トレースとは **どこに置いてあるAccessファイル** の **どのレポート** から出力した印刷物かを調べる作業のこと。

Accessファイルはコピペやファイルの移動が、 **ユーザー側で簡単にできてしまいがち** 。
また、『リファクタリングによるレポート名変更』や『コピペで別名レポート作成』も考えられる。
なので、動的に値を印字した方がいい。

# やり方（VBA不使用）

テキストボックスのコントロールソースに記述するだけで実装できる。

```vb:Access自身のファイルパスを印字する時にコントロールソースに設定する値
=[Application].[CurrentProject].[FullName]
```

テキストボックスのコントロールソースに ```Me``` は使えないので、 ```Report``` を使う。

```vb:レポート名を印字する時にコントロールソースに設定する値
=[Report].[Name]
```

```vb:現在時刻を印字する時にコントロールソースに設定する値
=Now()
```

## 実装例

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/c895f79f-5986-ae05-a0be-ac844eea4105.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/6fdb8ed3-9337-6b50-8268-abfaa035e701.png)

# やり方（VBA使用）

VBA不使用の場合の応用なので詳細は割愛。

```vb:サンプルコード
Private Sub ページヘッダーセクション_Format(Cancel As Integer, FormatCount As Integer)
    
    Me.テキスト359.Value = Application.CurrentProject.FullName
    Me.テキスト358.Value = Report.Name
    Me.テキスト360.Value = Now()
    
End Sub
```

VBAの場合は実装が少し面倒だけど、 **なぜこの値を印字しているのか** というコメントを残せるメリットがある。

# 参考サイトさん

https://officevba.info/accessfilepath/#toc3

# バージョン

Windows 10 Pro 21H2 OSビルド 19044.1889
Microsoft Access for Microsoft 365 MSO (バージョン 2207 ビルド 16.0.15427.20166) 32 ビット
nuxt3のServerRouteのあれこれ（備忘）

## はじめに
いろいろ試してわかったことを備忘的に残します

まだまだわからないことがたくさんあるので耳寄り情報などコメントで教えてくれると助かります。。。

### GET
クエリパラメーターの使い方とパスパラメーターの使い方
クエリパラメータはメソッド用意されてるけど、パスパラメータは用意されていないっぽい
（知らないだけかも）

- リクエスト
```vue
<script setup>
    // const {data, pending, error, refresh} = await useFetch("/api/test/{id}")
    const {data, pending, error, refresh} = await useFetch("/api/test/0", {
        method: "GET",
        params: { month: 8 }
    })
</script>
```

- API
```ts: server/api/test/[id].get.ts
export default defineEventHandler(async (e) => {

    // パスパラメータの取得
    const id = e.context.params.id
    console.log(id)
    // → ｏｕｔｐｕｔ: 0

    // クエリパラメータの取得
    const query = useQuery(e)
    console.log(query)
    // → output: { month: 8 }

    return {
        message: `GET request`
    }
})
```

### POST
bodyはクエリパラメーター同様メソッドが用意されてます
注意点としては```useBody()```を使うときは```await```修飾子を付ける必要があります
→ Promiseが返るため

- リクエスト
```vue
<script setup>
    // const {data, pending, error, refresh} = await useFetch("/api/test/{id}")
    const {data, pending, error, refresh} = await useFetch("/api/test/0", {
        method: 'POST',
        body: { country: "Japan", isJapanese: true }
    })
</script>
```

- API
```ts: server/api/test/[id].post.ts
export default defineEventHandler(async (e) => {

    // パスパラメータの取得
    const id = e.context.params.id
    console.log(id)
    // → ｏｕｔｐｕｔ: 0

    // クエリパラメータの取得
    const body = await useBody(e)
    console.log(body)
    // → ｏｕｔｐｕｔ: { country: "Japan", isJapanese: true }

    return {
        message: `POST request`
    }
})
```

### ファイル名のあれこれ
```server/api/hello.ts```というファイルがあったとしたら、```/api/hello```に対してどんなHTTPメソッドでリクエストしても引っかかってくれる
明示的にHTTPメソッドを指定したい場合はファイル名に```.get```などメソッド名をつければOK
- GET
```server/api/hello.get.ts```
- POST
```server/api/hello.post.ts```

試してないけどDELETEやPUT、PATCHでも大丈夫

パスパラメータを使いたい場合は下記のように角括弧（[]）で囲ってあげればいい
- GET
```server/api/[id].get.ts```
- POST
```server/api/[id].post.ts```

API側での取得方法は上のほうのサンプルで書いてあるので、そちら参照
GASでSlack AppのEvent Subscriptionsしようと思ってるのに、認証がうまくいかない件

こんにちは、ユーゴです。
今回は備忘録的に、GASでSlack AppのEvent Subscriptionsを何回も認証しようとしてるのにうまくいかない件について紹介します。3分もあれば読み終わる短い記事です。

# 問題
Event SubscriptionsでRequest URLを登録したいのに、「Your URL didn't respond with the value of the challenge parameter.」と返される。
![スクリーンショット 2022-08-30 13.45.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/b2a6c3e4-1843-56e7-b5fa-1cbadc5e8795.png)

しかしプログラムは書いている。

```javascript
function doPost(e){
    initServer(e);
    return;
}

function initServer(e){
    var params = JSON.parse(e.postData.getDataAsString());
    return ContentService.createTextOutput(params.challenge);
}
```

# 原因
初歩的なミス。doPostの返り値がただのreturnになっている。doPostの返り値にchallengeを指定する。

```javascript
function doPost(e){
    var params = JSON.parse(e.postData.getDataAsString());
    return ContentService.createTextOutput(params.challenge);
}
```

# 他に考えられること
・そもそも認証プログラム入れてない
・URLが違う。ライブラリのURLにしている。
![スクリーンショット 2022-08-30 13.59.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2607452/f843a054-3339-3acd-6099-e7f68bb11d0b.png)

# まとめ
いかがだったでしょうか。今回はとても短いケアレスミスの紹介でした。
このように、初歩的な内容から上級者向けのテクニックまで幅広く紹介していきます。また、普段はUnityとアプリ開発関連の紹介が多いです。
気に入っていただけましたら、LGTM&フォローよろしくお願いいたします。
自分の持っている機材振り返り(2022年夏)

# 前置き

そろそろ機材の更新をしたいと感じたので、まずは自分の持っている機材について振り返ることにしました。あくまでメモかも。

# 今の機材リスト

## メイン機

### パーツリスト

- Corei7 11700K
- Z590 AORUS PRO AX
- DDR4-3200 8GB \* 4
- Geforce RTX 3070
- ジャンク屋で拾ってきた NIC(2 ポート)
- HDD: 4TB, 6TB
- SSD(SATA): 1TB, 1TB
- SSD(M.2): 500GB, 1TB, 128GB

### 用途

- 開発とか
- ゲーム
- VRChat

### 今抱えている問題

- イース 6,F,O の終了後にまれに PC が落ちる(RTA でフルゲーム通した後が特に顕著)
- マザーボード、懸賞の景品で来たんだけど開封した時からピン曲がってる等で品質に不安がある
- 前項に関連して NIC もいつからか壊れているし、仕方ないので NIC 拾ってきて LAG 組んでるところがある
- Unity してるときに、CPU 使ったベイクでもっと速度が欲しいタイミングがある
- VRChat(だけに限らないけど)VRAM が少なくてつらい、vket などカクカクの極み
- WSL が無限にメモリ持っていく

## サーバ兼録画兼ストレージ

### パーツリスト

- Corei3 10100T
- B460-I
- DDR4-2666 16GB \* 2
- HDD 8TB
- SSD 256GB 500GB
- DD Max M4

### 用途

- Spinel とか EDCB とかのテレビ関連
- Hyper-V ホスト
- Docker の母艦

### 今抱えている問題

- 用途に対して CPU, RAM が心許なすぎる
- mini-ITX で組んでしまっているので、拡張性が無(PCIe スロットはすでにチューナで埋まってるので)
- 仮想化やっていきをしたい、ESXi とか手を出せたら楽しそう
- コンテナやVMのホストをやる役割を別の機材に切り出したい。

## ノート PC(メイン)

### 構成

- Corei7 1165G7
- LPDDR4 16GB
- SSD 1TB, 512GB

### 用途

- 外出先でのメイン開発機

### 今抱えている問題

- 構成的には Windows が主、Ubuntu が副なのに、使ってる時間的には逆転してるのでどこかで再セットアップなりやっていきたい
- 仮想環境ゴリゴリするにあたってメモリがつらい

## MacBook Pro 2018

### 用途

- MacOS

## その他

- 機材置くための場所がない！！！！！！！！

# 終わりに

この後でまず私が必要としてる役割の洗い出しと、それに必要になる機材なり割り振りを考えて足りなければ買ってくるなどします。まずは機材の収納棚が欲しいかも？
listen tcp :443: bind: permission denied エラー

VirtualBox + Vagrantで開発していたところ以下のようなエラーに遭遇した

```
$ ./binaryExecutable
listen tcp :443: bind: permission denied
```

結論からいうと解決方法は

```
$ sudo ./binaryExecutable
```

とすればよい。以下のstackOverflowで書かれている

https://stackoverflow.com/questions/54690289/gcp-listen-tcp-443-bind-permission-denied

```
If you want to bind to a privileged port (ports less than 1024).
You either need to be root or have the CAP_NET_BIND_SERVICE capability.
```

これでほぼ１時間半溶かしてしまった。
Amazon Forecast とは

## 勉強前イメージ

forcastって予測的なやつ？

## 調査

### Amazon Forecast とは

AWSのマネージドサービスで、機械学習予測技術に基づいて時系列データ予測を提供するサービスになります。
時系列データ予測とは時間的な連続性のある過去実績から未来の数値や傾向を予測することです。
forcastでは事前に用意されたアルゴリズムを使うことで未来の予測ができます。
機械学習の経験の必要はなく、簡単に実装できます。

また、費用も前払いなど必要なく使用した分だけの支払いになります。

### Amazon Forcastの機能

機能としては以下になります。

- 学習済みモデルを用いた予測の作成
- AutoMLを使用した自動機械学習
	- 5種類のアルゴリズムを使用します。
- アルゴリズムも一般的に使用される統計手法から複雑なものまで提供
- 欠落した値の補完
- 予測結果はCSVにしてs3にエクスポートが可能です。

## 勉強後イメージ

端的に言うとデータから未来の予測値を出すサービスってこと？
アルゴリズムもいくつかあって、季節や時差、トレンドとかに関連したりするようなものもありました。

## 参考

- [【Amazon Forecastで時系列予測】Amazon Forecastとは](https://www.system-exe.co.jp/kotohajime06/)
Eclipse  IntelliJ IDEA ショートカット対応表(ショートカット比較)

## EclipseユーザーがIntellJでコーディングする際のチートシート

| Eclipse<br>アクション | Eclipse<br>ショートカット | IntelliJ IDEA<br>アクション | IntelliJ IDEA<br>ショートカット |
| ---- | ---- | ---- | ---- |
| コード補完 | Ctrl+Space | 基本補完 | Ctrl+Space |
| - | - | 型一致補完 | Ctrl+Shift+Space |
| - | - | ステートメント補完 | Ctrl+Shift+Enter |
| クイックアクセス  | Ctrl+3 | どこでも検索 | ダブル Shift |
| アクティブビューまたはエディターの最大化 | Ctrl+M | すべてのツールウィンドウを閉じる | Ctrl+Shift+F12 |
| 型を開く | Ctrl+Shift+T | クラスに移動する | Ctrl+N |
| リソースを開く | Ctrl+Shift+R | ファイルに移動する | Ctrl+Shift+N |
| - | - | シンボルに移動する | Ctrl+Alt+Shift+N |
| 次のビュー | Ctrl+F7 | - | - |
| - | - | 最近使用したファイル | Ctrl+E |
| クイックアウトライン | Ctrl+O | ファイル構造 | Ctrl+F12 |
| 行を移動する | Alt+Up/Down | 行を移動する | Alt+Shift+Up / Alt+Shift+Down |
| 行削除 | Ctrl+D | 行削除 | Ctrl+Y |
| クイックフィックス | Ctrl+1 | インテンションアクションを表示 | Alt+Enter |
| エディターのクイック切り替え | Ctrl+E | スイッチャー | Ctrl+Shift+Tab |
| - | - | 最近使用したファイル | Ctrl+E |
| クイック階層 | Ctrl+T | 型階層にナビゲートする | Ctrl+H |
| - | - | メソッド階層に移動する | Ctrl+Shift+H |
| - | - | UML ポップアップの表示 | Ctrl+Alt+U |
| 最後の編集位置 | Ctrl+Q | 最後の編集位置 | Ctrl+Shift+Backspace |
| 次のエディター | Ctrl+F6 | 次のタブを選択 | Alt+Right |
| 実行 | Ctrl+Shift+F11 | 実行 | Shift+F10 |
| デバッグ | Ctrl+F11 | デバッグ | Shift+F9 |
| インデントの訂正 | Ctrl+I | 行の自動インデント | Ctrl+Alt+I |
| フォーマット | Ctrl+Shift+F | コードの整形 | Ctrl+Alt+L |
| 囲む | Ctrl+Alt+Z | 囲む | Ctrl+Alt+T |
| - | - | ライブテンプレートで囲む | Ctrl+Alt+J |
| 宣言を開く | F3 | 宣言に移動する | Ctrl+B |
| - | - | クイック定義 | Ctrl+Shift+I |
| 型階層を開く | F4 | 型階層にナビゲートする | Ctrl+H |
| - | - | UML ポップアップの表示 | Ctrl+Alt+U |
| ワークスペース内の参照 | Ctrl+Shift+G | 使用箇所の検索 | Alt+F7 |
| - | - | 使用箇所の表示 | Ctrl+Alt+F7 |
| - | - | 使用箇所の検索設定 | Ctrl+Alt+Shift+F7 |
| 検索ダイアログを開く | Ctrl+H | 複数ファイル内検索 | Ctrl+Shift+F |
| ファイル内での出現箇所 | Alt+Ctrl+U | ファイル内の使用箇所をハイライト | Ctrl+Shift+F7 |
| 行をコピー | Ctrl+Alt+Down | 行を複写 | Ctrl+D |
| ローカル変数の抽出 | Ctrl+Alt+L | 変数の抽出 | Ctrl+Alt+V |
| フィールドへの代入 | Ctrl+2 / Ctrl+F | フィールドの導入 | Ctrl+Alt+F |
| リファクタリングクイックメニューの表示 | Ctrl+Alt+T | リファクタリング | Ctrl+Alt+Shift+T |
| 名前変更 | Ctrl+Alt+R | 名前変更 | Shift+F6 |
| 指定行へジャンプ | Ctrl+L | 行に移動する | Ctrl+G |
| 構造化された選択 | Alt+Shift+Up / Alt+Shift+Down | キャレットで単語を選択 | Ctrl+W / Ctrl+Shift+W |
| 次を検索 | Ctrl+J | 次を検索 | F3 |
| 表示 | Ctrl+Alt+W | 移動先の選択 | Alt+F1 |
| 戻る | Ctrl+[ | 戻る | Ctrl+Alt+Left |
| 進む | Ctrl+] | 進む | Ctrl+Alt+Right |
| フォーカス | F2 | フォーカス<br>(javadocホバー表示) | Ctrl+Q |
| 行のコメントアウト | Ctrl+/ | 行のコメントアウト | Ctrl+/ |

出典：Eclipseキー操作(hishidama)
https://www.ne.jp/asahi/hishidama/home/tech/eclipse/key.html
出典：Eclipse から IntelliJ IDEA に移行する / ショートカット (IntelliJ IDEA リファレンス)
https://pleiades.io/help/idea/migrating-from-eclipse-to-intellij-idea.html#Shortcuts
Apple SiliconのMac上でバージョン1.19未満のMinecraftを実行しようとするとエラーになる問題について

# はじめに
こんにちは。Takuです。
最近Apple Silicon上でMinecraftを古いバージョンを実行するとエラーが出る問題について質問される方が多くなってきました。
これを機会に、一度記事にまとめようと思い執筆しています。
## 検証環境
この記事では、M1 Proを搭載したMacBook Proを使用しています。
なお、下記の方法でM1 MacBook Air等のApple Siliconデバイスでも問題が解決することは確認済みです。
# 1.18で検証
まず、問題が発生すると思われる1.18.1で、何も設定をいじらずに実行してみようと思います。
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/997280/d0c4fd39-d6d8-c083-0d95-ab5971e78c61.png">
案の定エラーとなりました。
エラーでは、```ファイルのダウンロードに失敗しました。
エラーの詳細：Couldn't select a valid version of the Java runtime to download.```とあります。
直訳では「ダウンロードするJavaランタイムの有効なバージョンを選択できませんでした。」となりますね。
# 1.19で検証
それでは最新の1.19で検証してみたいと思います。同じく設定をいじらずに実行してみます。
都合により画像は割愛となりますが、1.19では正常に動作しました。
どうやら、この問題は1.19より前のバージョンで発生するようです。
# 解決策
さてさて、肝心の解決策ですが、Minecraft Launcherから設定をクリックして、`Use Arm64 Java Runtime for Minecraft: Java Edition`のチェックボックスを外します。
<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/997280/7c3e0fb3-344e-4d6b-5d68-a73321d47317.png">
↓
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/997280/e6e7278f-2b4e-1e52-91e1-31e115a46acc.png">
その後1.18等のバージョンを起動してもエラーが出ずにきちんと動作するようになりました！

<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/997280/fce26cc6-2119-3ab7-d23f-021b5b426599.png">


# おわりに
最後まで記事を見てくださりありがとうございました！
同じようなエラーが出ている方に、この記事を紹介していただければ大変光栄です。
他にも解決策等ございましたら、ぜひお教えください！
それではまた会う日まで〜
【Web3】DAO(分散型自律組織)とは一体何なのか？

# はじめに

前回の[NFT](https://qiita.com/harrier_/items/ea485b27f9923687a192)に続いてweb3編第二弾として今回は「DAO」について書いていきたいと思います！
今年になって「DAO」という言葉を色々な場面で目にすることが増えましたね。
「DAOが人々の働き方を変える！」なんて言われてたりしますが内容をあまり理解していなかったので今回調べながらまとめていきます！

# 記事の流れ

- DAOとは
    - 分散型(Decentralized)とは？
    - 自律(Autonomous)とは？
- どのように運用されているのか
- 最後に


# DAOとは

DAOとは「Decentralized Autonomous Organization」の略で日本語では「分散型自律組織」と言われています。
とりあえずここでは「新しい組織の形」とだけ覚えておいてください。
組織というのは「株式会社」とか「サークル」とかそういったものですね。


組織というのはわかったと思いますが「分散型」「自律」とは何なのでしょうか？

### 分散型(Decentralized)とは？

一言でいうと「中央管理者がいない」いう意味です。
株式会社だと「株主」「役員」と言った中央管理者に権力が集中していますがDAOはそうではないということです。
株式会社の場合、重要な意思決定は取締役会で決められますが、DAOの場合は組織メンバーの投票によって意思決定がされます。

![dao.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/310614/b2dfa3fb-304a-ae81-bfce-994667df5be4.jpeg)
(出典：https://tabiryman.com/decentralized-autonomous-organization/)


### 自律(Autonomous)とは？

これも一言でいうと「自分で自由にできる」いう意味です。
DAOに所属するのも辞めるのも自由、組織の中でどのような行動をするのかも個人の自由というわけです。
このような意味でDAOは人々の働き方はより自由なものへ変えると期待されています。

##### このように分散型で自律的な組織のことをDAOと呼んでいるわけです！

## DAOはどのように運用されているのか?


### DAOの運営

まずDAOにはそれぞれに独自の「ガバナンストークン」(仮想通貨)というものが存在します。これがDAOの運営に不可欠になってきます。

##### ガバナンストークンを手に入れるには
- DAOに貢献するともらえる
    - 例えばwebサービスを作っているDAOであれば機能開発を手伝うことでガバナンストークンが貰えたりします。
    - OSSにコントリビュートするついでにトークンが貰えるようなイメージです。
- お金を出して購入することもできる

##### ガバナンストークンの使い道
- 組織の意思決定にはそのガバナンストークンを持ったメンバーの投票(多数決)で決定します。
- トップダウンによる意思決定ではなくDAOで何かをしたい場合は必ず投票で決定します。

##### DAOでお金を稼げるのか？
- ガバナンストークンは取引所で売買できるので `DAOに貢献する → ガバナンストークンが配布される → それを売る事でお金を得る` というような稼ぎ方ができます。
    - もちろんDAOに価値がないとガバナンストークンに価格がつかないため大した金額にはなりません。
- それ以外にもDAOで利益が出た場合はガバナンストークンを持っている人に分配すると言ったルールを設定してる所もあります。


### 実際の運用例
Qiitaで「個人開発でDAOをやってみる」を書いた人のDAOを見るとより具体的にどのような運営がされているのか見えてくると思います！
ドキュメントは公開されてるので是非読んでみて下さい！よりDAOの理解が深まると思います。

https://www.notion.so/Englister-DAO-6626d4cc036c42a08a6bbeb58edb4cf1

https://qiita.com/yuno_miyako/items/27404de78662b4b4c2a8

# 最後に

起業家は株式会社の代わりにDAOを設立し、労働者は自分の「好きな時に、好きな場所で、好きなDAOで働く」そんな未来があるかもしれませんね！
つよつよエンジニアの皆さんは是非DAOにコントリビュートしてみてはどうでしょうか！もしかしたら稼げるかも？！？！




# 参考

https://dev.classmethod.jp/articles/developersio-2022-7-27-02/

https://www.youtube.com/watch?v=7eUoSzEq6lM&ab_channel=%E5%A4%A7%E4%BA%BA%E3%81%AE%E5%AD%A6%E3%81%B3%E7%9B%B4%E3%81%97TV
nuxt3のServerRoutesでエラーを返す方法（備忘録）

## nuxt3のServerRoutesでエラーを返す方法（備忘録）
ｎｕｘｔ３について調べてもAPI側のエラーについて細かく書いてる記事がなかったので試してみた。
nuxt3の持ってる```createError()```を使えば任意のステータスでレスポンスが返せる

成功時のステータスについては調査中。。。
誰か知ってたら教えてください

### サンプル
- 公式のサンプル
``` ts
export default defineEventHandler((event) => {
  return {
    api: 'works'
  }
})
```
こんな感じでレスポンスでJSONを返すだけで使える。便利

- try/catchを使った例
```ts
export default defineEventHandler((event) => {
  
  try {
    // なんか適当な処理
    return {
      status: "success"
    }   
  } catch(error) {
    return {
      status: "error"
    }
  }

})

```
これだとｂｏｄｙの中身が違うだけでどちらも同じステータスで返る

なので、```createError()```でエラーを作ってステータスコードを指定する
```ts
export default defineEventHandler((event) => {
  
  try {
    // なんか適当な処理
    return {
      status: "success"
    }   
  } catch(error) {
    return createError({
      statusCode: 404,
      message: "Not Found."
    })
  }

})

```
marpで特定のページの表のサイズを変更する

styleタグにscopedという指定を入れる事で、そのページ限定のstyleを指定する事が可能

```
<style scoped>
  table { table-layout: fixed; width: 60%; display:table; font-size: 24px; }
</style>

| 額(円) | 平均(個)| 最大値(個) | 最小値(個) |
| --- | --- | --- | --- |
| 10,000 | 12.949 | 179 | 5 | 
| 5,000  | 6.814 | 180 | 5 |
| 1,000  | 8.589 | 181 | 5 |
| 500    | 7.023 | 180 | 5 |
| 100    | 7.618 | 181 | 5 |
| 50     | 6.932 | 182 | 5 |
| 10     | 7.876 | 181 | 5 |
| 5      | 6.985 | 181 | 5 |
| 1      | 8.164 | 182 | 5 |
| 全額    | 8.105 | 180  | 5 |
```

![Screen Shot 2022-08-30 at 13.02.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482077/6ff13bf0-256a-768a-d488-c8debf34b2bf.png)

### 参考
- [scoped-style, marpit](https://marpit.marp.app/theme-css?id=scoped-style)
base64について


### 暗号化
　<font color="lightblue">しばしば文字サイズを気にすることがあるのでメモ</font>

- 文字サイズについて

  <font color="green">**変換後のバイト数 = ( 文字 * バイト数 + ・・・ ) + Block数 - mod ( ( 文字 * バイト数 + ・・・) , Block数)**</font>
  - 文字数：入力文字列のバイト数（合計）
 
  - バイト数：文字のバイト数

     | UTF-8 | バイト数 ||
     | ----   | ---- |----|
     | 英文字 | 2 Bytes ||
    | ひらがな / カタカナ |3 Bytes ||
    | 漢字 | 3 or 4 Bytes |JIS X 0213の第3・4水準漢字の一部が4Bytes |

  - Block数：文字数により値が決定される
    | 文字数 | Block数|
    |---- | ----|
    |1から7|16|
    |8から15|32|
    | etc.|etc.|
テックキャンプを受講した感想

## はじめに
私は去年12月にテックキャンプに受講し、今年6月まで約半年間プログラミングスクールのテックキャンプでプログラミングの学習をしました。受講するきっかけは、未経験からITエンジニアに転職したいと思ったからであり、最終的に3社の内定をいただきました。今回、テックキャンプを受講した感想を書きたいと思います。

## テックキャンプの学習について
テックキャンプでは、週23時間以上の学習を約半年間継続します。覚悟がないと大変なカリキュラムですが、乗り越えるための工夫がされていました。ここでは特に印象的だったことを3点書きたいと思います。

### オンラインで自宅でも学習できる
私が受講した夜間・休日スタイルはオンラインだったため、自宅のパソコンでも学習が可能でした。平日は仕事前の5:45〜6:45、仕事後の20:30〜22:00で学習を行い、1日2時間30分の学習時間を確保しました。土日はどちらかを9:00〜19:00で学習を行い、10時間の学習の学習時間を確保しました。平日は若干寝不足にはなりましたが、このようなスケジュールで週23時間の学習時間を確保しまた。教室へ通う方法であれば通学時間が嵩張ったため、学習時間は確保できなかったと思います。また、自宅は誘惑に負けてしまうと思われがちですが、学習する習慣をつけることで定時になれば自然とパソコンに向き合うことができました。

### ライフコーチからの手厚いサポート
テックキャンプでは生徒1人1人にライフコーチが配属され、2週間に1回の頻度で約30分オンライン面談を行いました。面談では、学習面やメンタル面の相談を行い、効率よく学習をするめるためのアプションプランを一緒に考えていきました。具体的には、ダラダラ学習しないために今日終わらせる学習内容を他人に共有するといったことや、同居人と拗れている時は図書館や喫茶店で学習するといったルールを決めました。その結果、実際に高い集中力で学習を進めることができ、このようなルールを定めることで気合や決意などの精神面ではなく行動面を変えることの重要性を感じました。

### わからないことはメンターへの質問し放題
カリキュラム内でわからないことがあれば、メンターに技術的な内容の質問ができました。初期の頃は、わからないことがあっても下手な質問できないなと思い躊躇してしまいました。しかし、勇気を出して質問するとわかりやすく丁寧に説明していただき、質問へのハードルが一気に下がりました。また、質問するために記述する質問フォーマットが設けられており、どのようなエラーが生じているか、エラーを解決するために行ったこと、自分が調べたことなどを記述します。そうすることにより、他者にわかりやすく状況を説明できるように工夫されていました。このような質問フォーマットは働き始めてからも活用できると考えています。

## テックキャンプの転職サポートについて
学習の終盤から転職活動が始まり、履歴書・職務経歴書の作成や企業応募を行いました。学習同様に転職活動でも手厚いサポートがあったため、特に助かったと感じた2点を書きます。

### 履歴書・職務経歴書の添削
履歴書・職務経歴書はテックキャンプのフォーマットがあり、必要な項目を記述しました。また、ライフコーチ同様に専属のキャリアアドバイザーが配属され、書類選考を通過するためのポイントを踏まえ添削していただけました。私の場合は書類選考の通過率は3割程度であり、平均より高い水準で通過できたと思います。これは、フォーマットや添削していただいたおかげだと思っています。

### 面接対策
面接対策では予想される質問をまとめたシートに回答を記載して対策しました。その質問項目はかなり的を得ており、実際の面接では8割程度その質問フォーマットに記載されている質問を受けた印象です。そのため、面接は自分としてはかなり落ち着いて行えたと思います。

## おわりに
冒頭でも記載しましたが、私は最終的に3社の内定を獲得することができました。元々1社獲得できれば上出来と思っていたため、今回の結果にかなり嬉しく思っています。しかし、テックキャンプを受講して一番良かったと思っている点は、習慣の力や学習効率化の方法、質問するためのコツなどが学べた点です。これらの内容はITエンジニアとして働き始めても重要であると思っているため、テックキャンプでの経験を活かしたいと思っています。
npmのセマンティックバージョニングで調べたこと

たまに調べる必要がある。
その時に全部忘れて調べ直している気がするのでまとめる。

- ^(キャレット)や~の表す範囲は https://semver.npmjs.com/ でぱっと調べられる。
- `npm install <package>`により、<package>を `^x_current.y_max.z_max`に更新する。(要確認)
    - 多分dependencyにbreaking changeが混じることはありうる。つまりconservativeではない。(要確認)
【Laravel】Controllerのコンストラクタではuserが取れない

# ユーザーが取れない！


```php:HogeController.php
public function __construct()
{
    $user = Auth::user(); // $userがnull
}
```

コントローラのコンストラクタでユーザーを取ってこようとするとnullが帰ってきます。これはmiddlewareをまだ通っていないからだそうです。

これを回避するには[コントローラミドルウェア](https://readouble.com/laravel/8.x/ja/controllers.html#:~:text=%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82-,%E3%82%B3%E3%83%B3%E3%83%88%E3%83%AD%E3%83%BC%E3%83%A9%E3%83%9F%E3%83%89%E3%83%AB%E3%82%A6%E3%82%A7%E3%82%A2,-%E3%83%9F%E3%83%89%E3%83%AB%E3%82%A6%E3%82%A7%E3%82%A2)を使うと回避可能です。

```php:NewHogeController.php
public function __construct()
{
    $this->middleware(function ($request, $next) {
        $user = Auth::user();
        // ここに$userに関する処理を書く
        return $next($request);
    });
}
```


参考

https://stackoverflow.com/questions/35160144/authuser-returns-null
【Linux】chmodコマンドについて(ファイル/ディレクトリの権限変更)

# 権限不足でファイルの書き込み等が行えない

権限回りの問題で、スクリプトの実行が行えない/ファイルの移動が行えない等の問題が発生する事があります。
そんな時にパーミッションの変更を行う事で、事象の解決に繋がる事がございます。

以下のようなファイルが存在して、 test_01 以外のユーザーは読み込みだけが許可されているような状況があるとします。所有者は test_01ユーザー となり、現在は test_02ユーザー でログインしています。

```
[test_02@localhost tmp]$ ll
合計 0
-rw-r--r--. 1 test_01 test_01  0  8月 13 19:35 memo.txt
-rw-r--r--. 1 test_01 test_01  4  8月 30 07:04 test.sh
```

現在の状況では、test_02ユーザーはファイルの書き込みは行えないです。
試しにコマンドの実行結果を書き込みしてみましたが、許可がないとエラーが発生しました。
また、スクリプトファイルについても実行権が付与されていないので、動かせません。
※権限的な説明がしたいので、フルパスで動かしました。(bashコマンド使えば、権限関係なく動かせます。)

```
[test_02@localhost tmp]$ ll > memo.txt
-bash: memo.txt: 許可がありません
[test_02@localhost tmp]$ /tmp/test.sh
-bash: /tmp/test.sh: 許可がありません
```

## chmodについて

パーミッションの変更を、chmodコマンドで行います。
構文は、chmod 数値 ファイル名 となっております。
数値は、それぞれ所有者/グループ/その他のユーザー　で指定します。

744で指定した場合は、所有者は読み取り/書き込み/実行権が付与され、グループ/その他のユーザーには読み取り権のみが付与されます。

所有者のみに読み取り/書き込み/実行権を付与したい場合は　chmod 700 ファイル名 を実行する事で可能です。


下記表を参照下さい。
読み取りのみを行いたい場合は、4を指定。読み取り + 書き込み　を行いたい場合は、4 + 2　で6を指定します。数字を加算すれば、複数の権限付与を行えます。

|  数字  |  内容  |
| ---- | ---- |
|  4　 |  読み取り(r)  |
|  2　 |  書き込み (w) |
|  1　 |  実行(x)  |


# 実際にやってみた

実際にパーミッションの変更を行います。
所有者じゃないユーザでchmodコマンドを実行をすると、エラーになります。
なので、所有者ユーザにスイッチします。


```:ユーザーをスイッチ
[test_02@localhost tmp]$ ll
合計 0
-rw-r--r--. 1 test_01 test_01  0  8月 13 19:35 memo.txt
-rw-r--r--. 1 test_01 test_01  4  8月 30 07:04 test.sh
[test_02@localhost tmp]$ chmod 746 memo.txt
chmod: `memo.txt' のパーミッションを変更しています: 許可されていない操作です
[test_02@localhost tmp]$ su - test_01
[test_01@localhost ~]$
```

chmodコマンドで、パーミッションの変更を行います。
memo.txt のその他ユーザに読み込み(4) + 書き込み (2)　を指定。
test.sh のその他ユーザに読み込み(4) + 実行 (1)　を指定。
llコマンドで権限が付与されたか、確認します。

```:権限の付与
[test_01@localhost ~]$ chmod 746 ../../tmp/memo.txt
[test_01@localhost ~]$ chmod 745 ../../tmp/test.sh
[test_01@localhost ~]$ ll /tmp
合計 4
-rwxr--rw-. 1 test_01 test_01  0  8月 13 19:35 memo.txt
-rwxr--r-x. 1 test_01 test_01  4  8月 30 07:04 test.sh
```


test_02ユーザーにスイッチして、書き込みと実行がそれぞれ行えるかを確認します。

```:実践
[test_02@localhost tmp]$ ll > memo.txt
[test_02@localhost tmp]$ cat memo.txt
合計 4
-rwxr--rw-. 1 test_01 test_01  0  8月 30 07:37 memo.txt
-rwxr--r-x. 1 test_01 test_01  4  8月 30 07:04 test.sh
[test_02@localhost tmp]$ /tmp/test.sh
/tmp
```

無事両方行える事を確認しました。

## 終わりに
chmodコマンドは結構使います。
覚えておいて損はないとか思います
（備忘録）M1 MacにJuliaをインストールし、Jupyterで起動する方法

# はじめに
本稿では、表題の通りに、M1 MacにJuliaをインストール、パスを通し、Jupyterで起動する方法について解説する。
筆者が用いたPCのスペックは下記のようである。
* MacBook Pro (14インチ、2021)
* チップ Apple M1 Pro
* メモリ 32 GB
* OS macOS Monterey

# ワークフロー
1. Homebrewを利用してJuliaをインストール
2. ターミナルでJuliaを起動して、IJuliaパッケージをインストール

## 1. Homebrewを利用してJuliaをインストール
(Homebrewをお持ちでない方は、筆者の過去記事を参考にして、Homebrewを導入すること
https://qiita.com/shyu_manabe/items/682e6c73b368b0fe02ba)


公式サイト (https://julialang.org/downloads/ 2022年8月30日アクセス) から直接ディスクイメージファイル (.dmg) を取ってきてもいいのだが (下図)、今回はHomebrewのcaskを利用してみる。
caskを利用することで、Homebrewを用いて、CUIアプリのみならず、GUIアプリも管理することが可能なようである 。
(参考 https://eng.shibuya24.info/entry/homebrew-cask 2022年8月30日アクセス)
![スクリーンショット 2022-08-30 12.04.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2643047/964c6022-262b-e7f3-7b55-99acbb73279a.png)

:::note warn
公式サイトからもってくる際は、自分のPCに適合したバージョンをダウンロードすること。
M1 Mac使用者であれば、赤で囲ったARM用をもってくること。
:::

```get_julia.sh
brew install --cask julia
```
するとダウンロードが開始し、自動でアプリケーションフォルダにJuliaのGUIアプリもインストールされていることが確認できる。この際なぜか自動で自分のPCにあったバージョンのものも持ってきてくれた上、すでにパスが通っていた。
下記コマンドを実行し、Juliaが無事インストールされていて、パスが通っていることを確認する。
```julia.sh
julia
```
すると下図のようなおしゃれなアスキーアートが表示されるはずである。
```result.sh
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.8.0 (2022-08-17)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |
```

## 2. ターミナルでJuliaを起動して、IJuliaパッケージをインストール
Juliaの実行画面のまま、`]`をタイプすると、プロンプトが下記のように変わるので、
```pkg.jl
(@v1.8) pkg> 
```
IJuliaパッケージをインストールする。
```pkg.jl
(@v1.8) pkg> add IJulia
```
するとすでにJupyter NotebookにJuliaが追加されているはずなので、起動して、確認してみると、
```jn.sh
jupytper notebook
```
![スクリーンショット 2022-08-30 12.19.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2643047/bb2ee2a4-a4e6-7dc2-8b5c-e5ffc82f40b3.png)
Julia 1.8.0を選択できるようになっていた。成功である。

# おわりに
本稿では、MacにJuliaをインストールし、Jupyterで起動する方法を解説した。本稿を作成するにあたり、Homebrewを用いて、GUIアプリも管理することができるということを知れたのが、新たな収穫であった。
【備忘録】システム開発で非機能要件整理・定義をするために必要な情報

# はじめに
現在、受託開発企業でシステムエンジニアをしている@fusassyといいます。

最近、インフラ（クラウド）の非機能要件定義を担当しました。その際、参考にした情報を備忘録として残します。以下で挙げた資料を利用すれば、非機能要件定義書の作成は可能ですが、最後は利害関係者の方々（受託開発であればお客様）との合意が必要となります。

# 非機能要件の6つのカテゴリ
そもそも要件定義とは、ソフトウェアやサービスを実装する前に、「どのような機能を持つか」を定める工程となります。要件定義のうち「実装する機能」の要件を「機能要件」といい、「実装する機能以外」の要件を「非機能要件」といいます。非機能要件は、[情報処理推進機構（IPA）][link-1]によって、6つのカテゴリに分類されています。

### 可用性
システム稼働・停止の運用スケジュールや、障害発生時の復旧に関する水準を要求を定めたもの。継続性、耐障害性や回復性を含んでおり、通常時のみならず災害発生時の対応も定めておくと良いです。

### 性能・拡張性
通常時とピーク時のシステム負荷の許容量と、業務量増加の対応に関する要求を定めたもの。アプリ側の処理効率化は前提で、インフラ（CPU・メモリ・ディスク等）の利用率を概算し、スケールアップ・スケールアウトによる拡張性を検討します。ただしオンプレミスとは異なり、クラウド利用の場合はインフラ性能の拡張は容易なので、厳密に定義する必要はないかもしれません。

### 運用・保守性
システム運用時の監視方法・方針、稼働率や障害・問題発生時の対応に関する要求を定めたもの。正常稼働のためのサービスマニュアル（サービスデスクも検討）や、インシデントマニュアルが必要となります。各種運用管理（インシデント管理・問題管理等）の方針についても定めておきます。自動化・簡素化も可能な範囲で実現できると良いと思います。

### 移行性
新システムの移行時期、方針と対象の要求を定めたもの。リハーサルの実行計画も定めておきましょう。

### セキュリティ
情報セキュリティ・コンプライアンスの方針や適用範囲、システム関係者の認証・認可に関すること、また不正監視や各種マルウェア対策に関する方針を要求を定めたものです。

### システム環境・エコロジー
システムの設置環境や消費エネルギー量などに関する要求を定めたもの。システムの利用（利用者）範囲、対応言語の幅、利用端末等、システム環境に関する全般的な要件を定めます。エコロジー観点として消費エネルギー量も算出できれば良いですが、現実的には困難なので割愛して良いと思います。


上記のほか、新システムの開発で利用する技術や導入する製品について、導入方針、開発・検証手法、ドキュメントの種類・整備方法・標準化も定めておくと良いです。

# 参考にした資料
### 非機能要求に関する分類・項目
##### [非機能要求グレード（IPA）][link-2]
情報処理推進機構（IPA）が提供している、ユーザと開発者の両者間で非機能要件の確認をするためのツール群。非機能要件定義のためのバイブル的な存在です。非機能要求グレードの項目一覧における事項を網羅するように、まずは非機能要件を整理すれば良いです。そして、どのレベルまで要求を満たすべきか、システムの特徴や予算との兼ね合いで決めていきましょう。

### セキュリティに関する文書
##### [脆弱性診断士スキルマッププロジェクト][link-10]
「特定非営利活動法人日本ネットワークセキュリティ協会」の日本セキュリティオペレーション事業者協議会のセキュリティオペレーションガイドラインWG（WG1）と、「OWASP Japan」主催の共同ワーキンググループである 「脆弱性診断士スキルマッププロジェクト 」が提供する資料群です。Webシステム・アプリを安全に構築するために必要な要件定義書等が整備されています。文書「Webシステム／Webアプリケーションセキュリティ要件書」の様に、開発言語やフレームワークに依らない、セキュアコーディングに関する要件も整理されています。

##### [セキュリティ関連NIST文章][link-11]
米国国立標準技術研究所（NIST）のセキュリティ関連の和訳資料。セキュリティ界隈では影響力が非常に大きいみたいです。文書によっては非常にボリューミーなので、必要なものを選択して確認すれば良いと思っています。

##### [クラウドサービス情報セキュリティ提供における対策][link-12]
クラウドサービス利用時における、総務省が提供するセキュリティガイドライン。2021年9月に第3版が発行されています。地方公共団体や民間事業者が利用するクラウドサービスで求められる情報セキュリティ対策（ベストプラクティス）が記載されています。クラウドサービスの提供主体としてはSaaS・PaaS・IaaSの全ての事業者を想定しています。

### ログに関する文書
##### [企業における情報システムのログ管理に関する実態調査][link-20]
非機能要件定義では、ログの保存期間も定めておく必要があります。特に、監査ログは1年の保管が必要なため、場合によっては別ストレージへの保存処理が必要な場合があります。

# 参考にした記事（Qiita）
##### [非機能要件のときに参考にしたもの][link-30]
##### [非機能要件と、性能チェックポイント][link-31]

<!-- 以下、リンク設定用 -->
[link-1]:https://www.ipa.go.jp/ 
[link-2]:https://www.ipa.go.jp/sec/softwareengineering/std/ent03-b.html

[link-10]:https://github.com/OWASP/www-chapter-japan/tree/master/skillmap_project
[link-11]:https://www.ipa.go.jp/security/publications/nist/
[link-12]:https://www.soumu.go.jp/main_content/000771515.pdf

[link-20]:https://www.ipa.go.jp/files/000052999.pdf

[link-30]:https://qiita.com/gosutesu/items/bb8d262fb35595901d27
[link-31]:https://qiita.com/e99h2121/items/941bc0d7f09fee3384a7

<!-- コメントアウトしたい内容 -->
<!-- 
複数行は
こっちのほうが
断然、楽
-->
【Google Sheets API v4】 appendの仕様

[公式ドキュメント - append](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/append)

書き込みを行うメソッドにappendとupdateがあって、appendでもOVERRIDEが使えるので、どっちでも更新できそうな感じだったので、使い分けを調べていたらapeendの仕様にハマったので整理した。
具体的には、appendに渡すrangeと書き込まれる位置の仕様について整理した。

## やること
書き込みたいシートの初期状態は以下の通り。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705031/096d62d9-c59b-de76-8ef1-37f2b22b07e9.png" width="500">

公式ドキュメント上のテストを利用してappendを実行します。(spreadsheetIdの記載は省略)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705031/bf22f335-3c38-3719-248e-3ca9a79ae69b.png" width="300">
range: 対象範囲の取得（rangeに指定した範囲 ≠ 対象範囲(※)。後述します。）
InsertDataOption: 上書き or 挿入
valueInputOption: そのまま値を入れる or 普通にスプレッドシートに手で入力した時のように日付などをフォーマットするか

今回は1マスにfugaを書き込みます。

## 結果
仕様はこんな感じになっている。
1. range(D27:D28)の範囲から表を抽出(D27) → 検査元（と名付けます。）
1. 検査元から上方向に伸ばして値が途切れるところまで検査を行う → 第１検査範囲
1. 第１検査範囲から左右方向に伸ばして値が途切れるところまで検査を行う → 第２検査範囲
1. 第２検査範囲から下方向に伸ばして値が途切れるところまで検査を行う → 第３検査範囲
1. 検査元〜第３検査範囲 → **※対象範囲**
1. 対象範囲の下行の左端 → **appendの起点**

上記やることを実施した結果は以下の通り。（図１）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705031/2239d7b9-23de-4c61-b4bd-5edab425bca6.png" width="">

図１からC28のhogeを消した状態でappendした場合（図２）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705031/ec51f446-8d97-8b23-9764-c43a686eba46.png" width="">

図2からD25のhogeを消した状態でappendした場合（図3）
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705031/d9902c08-20f3-07c6-f818-3a60955e6ffe.png" width="">

## まとめ
総括してappendは表の下に挿入するためのメソッドということ。rangeで指定した範囲から表全体を把握して、その表の下に挿入しようとしている。表全体を把握する仕様が上記のようになっているという解釈。

upadteとの使い分けとしては、
シートの一番下の行に挿入する時はappend
途中のセルを更新したり、空白に挿入する時はupdateを使う。

途中の空白のセルにもupdate使った方が良さそう。
あと、今回は値がバラバラに入力された状態でテストしていて、それがハマりのポイントになっているので、シートに表を書く時はA1から埋めて、シンプルな構成にしておくのがよい。
メモ等を書く場合は表から離して書く。
iPhoneでwebpが表示されない 

備忘録 兼 戒め
## 問題

```html:index_before.html
<h1 class="p-index__head">
  <picture>
    <source srcset="./assets/pc.webp" media="(min-width: 767px)">
    <source srcset="./assets/sp.webp" media="(max-width: 766px)">
    <img src="./assets/sp.png">
  </picture>
</h1>
```
PC上のコンソール(Chrome)では表示されるのにiPhone実機では表示されなかった。
iPhoneだけじゃないかもしれない(自分で確認できたのはiPhoneだけだった)。

<b>前提</b>
・画像のパスは間違ってない
・iPhoneはwebp対応しているバージョンのOS

## 解決
source要素にtype="image/webp"を追加する。

```html:index_after.html
<h1 class="p-index__head">
  <picture>
    <source type="image/webp" srcset="./assets/pc.webp" media="(min-width: 767px)">
    <source type="image/webp" srcset="./assets/sp.webp" media="(max-width: 766px)">
    <img src="./assets/sp.png">
  </picture>
</h1>
```
何故かtypeの記述がなくても動く場合があって、その時のコードをコピペしていたせいで今回のエラーに気づいた。
エラーが起きるときと起きないときがあるのが一番困るけど前提としてリファレンス通りに書こうねってことで…
依存パッケージが古いけど最新の依存パッケージに依存しているパッケージをcomposerで管理したい

（タイトルがややこしくてすみません）

Packagistに公開されているライブラリ（以下somepackage）をインストールしようとしたところ、既存のライブラリ（以下requiredpackage）に依存しており、そのバージョンが古いためにsomepackageの最新バージョンを入れることができないということがありました。
requiredpackageは既に複数のファイルで使用しており、バージョンアップがすぐにはできない状況でした。

そこでsomepackageをサブモジュール化して、別の`composer.json`で管理するという戦略を取ったのでその内容を紹介します。

#### 環境
```
# composer -V
Composer version 1.10.22 2021-04-27 13:10:45

# php -v
PHP 7.4.7 (cli) (built: Jun 11 2020 18:41:17) ( NTS )

# php artisan --version
Laravel Framework 6.18.35
```

#### 状況の整理
somepackageには下記の要件がありました。
```json:src/composer.json
    "require": {
        "requiredpackage": "^1.8.4||^2.2.1"
    }
```

リポジトリは要件を満たしていません。
```shell
src# composer show | grep requiredpackage
requiredpackage                    1.6.1
```

#### やったこと
サブモジュールとして`src/lib/somepackage`ディレクトリを切り、`composer.json`を置きます

```json:src/lib/somepackage/composer.json
{
  "require": {
    "somepackage": "2.12.x"
  },
}
```

`src/lib/somepackage`で`composer install --dump-autoload`するとそれぞれ異なるバージョンがインストールされた状態になります

```shell
src/lib/somepackage# composer show | grep requiredpackage
requiredpackage                  2.4.0     

src# composer show | grep requiredpackage
requiredpackage                  1.6.1    
```

この時点でsomepackageはサブモジュールのautoloadを利用してインポートができる状態になりました。

しかし、`src/lib/somepackage/vendor`の一部パッケージが`src/vendor`と重複していると、ファイルのインポート時に名前空間で競合が発生する可能性があります（つまり意図通りのバージョンのパッケージを参照できない可能性がある）。

今回はsomepackageをインポートするファイルが限られていたので、使用するファイルで直接requireする方針を採用しました。
```php
require base_path('lib/somepackage/vendor/autoload.php');
```

somepackageの依存パッケージが`src/vendor`にも存在している場合は依然として名前空間の競合が発生する可能性はありますが、影響範囲は限定されます。
本来であればバージョンアップすべきですが、一時的な対応としてはアリかなと思います。
【クエリビルダ：拡張表現】RowSkipWhereSubTotalsOverOneRow文を使ってみる

この記事では、小計行を出力するクエリに関する拡張表現関数を使用してみます。
この関数を利用すると、小計行に対する詳細行が1つしかない場合、その小計行をスキップすることができます。 
小計行を出すようクエリを設計した場合、小計行は、それに対する詳細行が1つしかない場合でも作成されます。 そのような場合、レポートは非常に見づらくなってしまいます。 この関数を使用することで、詳細行を1つしかもたない小計行を抑制することができます。

では元となるクエリを準備します。SAP Business Oneを利用してこのようなクエリを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c2e48649-fd6b-12c4-b6d3-d3f45ad75f90.png)
実行結果はこうなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/2a3bc9c8-f2e9-a88b-07c3-fdcb688b1a6a.png)
**伝票集計年**に対して、**グループ**オプションを使用してクエリ結果に小計行を追加します。
出力領域の右クリックメニューからオプションを選択します。
`並び替えとグループ化`タブに移動します。
**伝票集計年**を`並び替えなし`領域から`並び替えあり`領域へ移動させます。そして`グループ化オプション`で**基本**を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0091c406-0c8f-dc6d-bcb7-19494d429e69.png)
ではプレビューしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/a7e15cd6-e956-dd1b-0787-d0c290c1072f.png)
小計行に対してその詳細行が複数存在する場合は、見た目も良いですが、このように詳細行が一つしか存在しない場合は小計する必要もなく、またそういった行が連続すると見づらくなってしまうケースもあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/c31daf71-11f3-f0f3-4416-8ed377ecb6f6.png)
そこで今回ご紹介する関数でこの問題を解決します。
出力領域の右クリックから**拡張表現を追加**を選択します。出力オプションダイアログが開いたら、関数一覧より**RowSkipWhereSubTotalsOverOneRow**文を探し、ダブルクリックで上部エディタ領域にテンプレートを転送します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/fa879904-2066-9b52-cb85-2038e040080a.png)
一般タブに移動して以下のように編集を行います。説明はあくまでも参考です。ここで大事なのは、この関数はそれ自体が出力結果にはなんら関係がないので**非表示**にすることです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/0aab4ec2-501a-99d9-369b-bb505433e17c.png)
クエリ結果はこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2530698/467b76dc-70f2-405c-96f6-70088a514d76.png)
場合によっては、詳細行が一行のみでも小計を出したい場合もあるでしょうから、ここではこのような動作をする関数もありますよということだけご理解頂ければ幸いです。

では、失礼します。