OmniAICreator/Qiita-1.07M huggingface dataset:
Javaを用いたページング機能

# JavaとSpringBootを用いたページングの実装

## 前提条件

###### 使用言語
* Java11
* Spring Boot
* Thymeleaf
* HTML
* CSS

###### 作成中のサイト
おもちゃのECサイト

## 完成イメージ

![スクリーンショット 2022-06-10 9.47.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321592/4b16ac07-74ed-c49b-e3a9-16f724419dcf.png)

### 大まかな機能
1 現在のページが色が変わるようにする
2 真ん中には3つのページ変遷が表示されている
3 間が開く場合は「...」が表示される
4 最初のページでは「前へ」、最後のページでは「次へ」が押せなくなる

## 実装手順
### 1 ページネーションドメインの作成
#### フィールド変数を用意する
![スクリーンショット 2022-06-10 10.11.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321592/c2273b54-f5dd-0987-5cb7-22e4fe3a5dfa.png)
必要なのは以下の6つ
1 どこから表示をするか指定する変数
2 どこまで表示すべきか指定する変数
3 現在のページ数を格納する変数
4 1ページに表示する件数を指定する変数
5 表示する商品の総数を格納する変数(全件表示 / 検索機能などによって変動するため)
6 ページの総数(表示する商品の総数 ÷ 1ページに表示する件数)

#### コンストラクターの作成
![スクリーンショット 2022-06-10 10.26.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321592/71fd7d00-3662-9235-64ba-9169919e2d4b.png)
ページネーションのメソッドが呼び出される際に、
フィールド変数の「1ページに表示する件数を指定する変数」と「表示する商品の総数を格納する変数」に値が格納される。

#### 実際にページングをして、表示ページを切り替えるメソッドを作成
![スクリーンショット 2022-06-10 10.59.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321592/063b7d94-89c5-bba8-32f8-dbc1a95e5fb2.png)
これで「変数 page」→次に表示するページを渡せば、ページングができる！！

#### 忘れずに「getter/setterを作成すること」

### 2 商品数を検索するリポジトリの追加
![スクリーンショット 2022-06-10 11.08.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321592/78e7fb13-343c-273a-8707-7847a73db931.png)
今回はサービスも作成し、使用した。

### 3 コントローラのメソッドの変更および追加
![スクリーンショット 2022-06-10 11.14.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321592/71fa98a9-3dbb-ba2b-7309-7cd1313e24bd.png)

#### コントローラにフィールド変数の追加
###### 1ページに何件のデータを表示するか指定
今回は定数で指定しているが、仕様によっては変数を使用
###### 表示する商品の件数を指定
表示する商品の件数は検索の場合、毎度変わるので変数で指定
###### ページネーションオブジェクトの作成
毎度作成し直すのも面倒なので、先に作っておく

#### 商品一覧を表示するコントローラの修正
![スクリーンショット 2022-06-10 11.24.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321592/5e15b74a-d68e-687a-85c0-afdf2ca51cf6.png)

#### ページングを行うメソッドの追加
![スクリーンショット 2022-06-10 11.35.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321592/a9d965bc-16ee-34e2-afde-495248b91f43.png)

### 4 ページネーションを行うためのタグをHTMLに作成
![スクリーンショット 2022-06-10 11.38.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321592/2ef49022-eb1c-6fe7-221b-38403ebae7df.png)

#### コードの補足説明
クラス「dissapear」と「active」と「disabled」はCSSでコーディング

###### 「th:classappend="${pagenation.totalPageCount == 1} ? dissapear : ''"」
「totalPageCount」が「1」ならば「dissapear」クラスを追加する

###### 「th:each="index : ${#numbers.sequence(pagenation.pageFrom, pagenation.pageTo)}"」
「pageFromに格納された数字〜pageToに格納された数字」まで繰り返し処理を行い、indexに格納する

#### CSSのコーディング
![スクリーンショット 2022-06-10 11.47.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2321592/37be9a05-5da9-fe07-31f2-36ed412f6f8f.png)
図解 io.Pipe(Golang)

# はじめに

Goのioパッケージにはio.Readerやio.Writerのインターフェイスを有効活用するための便利なメソッドがいくつか用意されています。
自分はその中の一つである`io.Pipe`の挙動を理解するのに手こずったので、備忘録として挙動や使い方を残しておこうと思います。

# [io.Pipe](https://pkg.go.dev/io#Pipe)とは

io.Pipeメソッドは、io.PipeReaderとio.PipeWriterを返します。io.PipeWriterに書き込んだ内容が、io.PipeReaderから読み出せるようになります。
io.Pipeの特徴は、内部バッファを持たない点にあります。そのため、Writerに書き込んだ内容がすぐにReaderから読み出せるようになります。

モデル図はこんな感じです(2のブログから引用)。
![モデル図](https://cdn-ak.f.st-hatena.com/images/fotolife/q/quoll00/20200603/20200603003431.png)

自分なりの理解を図にまとめると以下のようになります。

![スクリーンショット 2022-06-10 11.44.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455240/f26cc289-94a4-2426-b3c4-060b0740e37a.png)


## サンプルコード

```go
package main

import (
	"fmt"
	"io"
	"log"
	"os"
)

func main() {
	r, w := io.Pipe()

	go func() {
        defer w.Close()
		fmt.Fprint(w, "some io.Reader stream to be read\n")
	}()

	if _, err := io.Copy(os.Stdout, r); err != nil {
		log.Fatal(err)
	}

}
```

実行結果
```sh
$ go run main.go
some io.Reader stream to be read
```

## 注意点など
- io.PipeWriterにデータが書き込まれると、そのデータがio.PipeReaderからすべて読みだされるまでブロックします([参考](https://pkg.go.dev/io#:~:text=that%20is%2C%20each%20write%20to%20the%20pipewriter%20blocks%20until%20it%20has%20satisfied%20one%20or%20more%20reads%20from%20the%20pipereader%20that%20fully%20consume%20the%20written%20data.))。そのため、書き込みを並列化するには別のgoroutineを使って並行処理する必要があります。
    - これは、自分の予想ではio.Pipeが内部でバッファなしチャネルを使用しているからだと思いました。
    - ただ、『[Goならわかるシステムプログラミング 4刷](https://www.lambdanote.com/products/go)』の4.2.1章には以下のような記述があるため、実は似ているだけで違うのかもしれません(現状わかっていません)。

#### [io/pipe.goのコード](https://cs.opensource.google/go/go/+/refs/tags/go1.18.3:src/io/pipe.go;l=199-206)
```go
func Pipe() (*PipeReader, *PipeWriter) {
	p := &pipe{
		wrCh: make(chan []byte),
		rdCh: make(chan int),
		done: make(chan struct{}),
	}
	return &PipeReader{p}, &PipeWriter{p}
}
```

#### 『[Goならわかるシステムプログラミング 4刷]の4.2.1章の記述
> バッファなしのチャネルでは、受け取り側が受信をしないと送信側もブロックされ ます。3.7「io.Reader ／ io.Writer でストリームを自由に操る」で紹介した io.Pipeと似た動作です。バッファ付きであれば、バッファがある限りすぐに完了して次の行 が実行されます。

- 書き込みも読み込みもgoroutine safeです(1)。

# おわりに
io.Pipeについてまとめました。

# 参考
1. [Godoc](https://pkg.go.dev/io#Pipe)
1. [Goのioパッケージのメソッドを図示](https://christina04.hatenablog.com/entry/golang-io-package-diagrams)
2. [Goならわかるシステムプログラミング 4刷](https://www.lambdanote.com/products/go)
Webページを手軽に一時的な編集ができるようにするブックマークレット

:::note warn
※あくまでクライアント側での一時的な編集なので更新すると元の内容に戻ります
:::

モードON
```
javascript:!function(){document.designMode='on'}();
```


モードOFF
```
javascript:!function(){document.designMode='off'}();
```
CORSにハマった...(Laravel, JavaScript)

CORSにハマったので、備忘録として記載します。。

## CORSとは、
> オリジン間リソース共有 (Cross-Origin Resource Sharing, CORS) は、追加の HTTP ヘッダーを使用して、あるオリジンで動作しているウェブアプリケーションに、異なるオリジンにある選択されたリソースへのアクセス権を与えるようブラウザーに指示するための仕組みです。


引用元: https://developer.mozilla.org/ja/docs/Web/HTTP/CORS


ハマった原因としては、GETリクエスト用のAPIだけ用意してCORS対策のレスポンスヘッダーを設定していたのですが、プリフライトリクエストを考慮しておらず、JavaScriptでCORSのエラーが発生していました。

## プリフライト(preflight)リクエストとは
> 単純リクエストとは異なり、「プリフライト」リクエストは始めに OPTIONS メソッドによる HTTP リクエストを他のドメインにあるリソースに向けて送り、実際のリクエストを送信しても安全かどうかを確かめます。サイト間リクエストがユーザーデータに影響を与える可能性があるような場合に、このようにプリフライトを行います。

Laravel側でOptionsメソッドのリクエストも考慮した形に変更したところ無事解決しました。
SPSS Modelerで正規表現を使う（Python拡張ノード版）

以前SPSS ModelerでR拡張ノードやRDBの関数をつかって正規表現を使うという記事を書きました。

SPSS Modelerで正規表現を使う - Qiita 

https://qiita.com/kawada2017/items/0ef1c4d0a009a46db24a

今回は同様のことをPython拡張ノードで行います。



以下のようにNAMEという列の文字列から前株の「株式会社」という文字列を「（株）」に置き換えるNAME＿REという列を追加したいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/5a488744-b704-ece9-885c-ccdadb5a6737.png)


サンプルストリームは以下です。

https://github.com/hkwd/spsssample/raw/master/20210419%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE/220601%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BEpython.str

テスト環境
- Modeler 18.3
- Windows10 64bit
- Python 3.8.10

#1. Rの拡張ノードを使う

python拡張ノードでstr.replaceのregex=Trueで正規表現を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/523a4e37-f826-afef-5110-f98cb3388823.png)


```python:正規表現
#ライブラリのインポート
import spss.pyspark.runtime
from pyspark.sql.types import *
import pandas as pd

#コンテキストオブジェクト定義
asContext = spss.pyspark.runtime.getContext()
sqlContext = asContext.getSparkSQLContext()

target_col_name='NAME'
res_col_name=target_col_name+'_RE'
old='^株式会社'
new=r'(株)'

if asContext.isComputeDataModelOnly():
    #スキーマ設定
    inputSchema = asContext.getSparkInputSchema()
    outputSchema = inputSchema
    outputSchema.fields.append(StructField(res_col_name, StringType(), nullable=True))
    asContext.setSparkOutputSchema(outputSchema)

else:
    #データ読込
    indf  = asContext.getSparkInputData()
    df = indf.toPandas()

    #正規表現加工
    df[res_col_name]=df[target_col_name].str.replace(old, new, regex=True)

    #データ書出し
    outdf = sqlContext.createDataFrame(df)
    asContext.setSparkOutputData(outdf)
```

少し解説します。
以下は定型的な文です。SPSSとpySparkのライブラリを読み込み、コンテキストオブジェクトを取得しています。

```python:インポートとコンテキストオブジェクト取得
#ライブラリのインポート
import spss.pyspark.runtime
from pyspark.sql.types import *


#コンテキストオブジェクト定義
asContext = spss.pyspark.runtime.getContext()
sqlContext = asContext.getSparkSQLContext()
```

以下は出力データのスキーマを定義しています。
まず、入力データのスキーマをasContext.getSparkInputSchema()で取得し、
fields.append(StructField(res_col_name, StringType(), nullable=True))
で新たな列を追加しています。

```python:スキーマ設定

if asContext.isComputeDataModelOnly():
    #スキーマ設定
    inputSchema = asContext.getSparkInputSchema()
    outputSchema = inputSchema
    outputSchema.fields.append(StructField(res_col_name, StringType(), nullable=True))
    asContext.setSparkOutputSchema(outputSchema)
```

次にデータの処理をします。
入力データをasContext.getSparkInputData()を取得します。
SparkDataFrameとして取得されるので、toPandas()でSparkDataFrameをPandasのDataFrameに変換します。
正規表現による列追加は以下で行っています。
df[res_col_name]=df[target_col_name].str.replace(old, new, regex=True)
そして、sqlContext.createDataFrame(df)でpandasのDataFrameをSparkDataFrameに変換しなおして、asContext.setSparkOutputData(outdf)で出力データとして設定しています。

```python:データ処理
else:
    #データ読込
    indf  = asContext.getSparkInputData()
    df = indf.toPandas()

    #正規表現加工
    df[res_col_name]=df[target_col_name].str.replace(old, new, regex=True)

    #データ書出し
    outdf = sqlContext.createDataFrame(df)
    asContext.setSparkOutputData(outdf)
```
Python初心者がAWS LambdaのPython3.6→3.9へランタイム変更対応を行ってみた。

## 1．はじめに
2022年8月17日に[LambdaのPython3.6ランタイムが非推奨になるとのアナウンス](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html#runtime-support-policy)がありました。
| 名前|識別子|オペレーティングシステム|非推奨化フェーズ 1|非推奨化フェーズ 2|
|:-----------|------------:|:------------:|:------------:|:------------:|
| Python 3.6|python3.6|Amazon Linux|2022 年 7 月 18 日|2022 年 8 月 17 日|

現在のプロジェクトではPython3.6ランタイムを使用しているLambdaが開発環境2つ、本番環境2つの合計4つありました。
今回はバージョンアップで追加された新機能等は使用せず、バージョンアップのみの対応を行う事となります。
私はAWS実務1か月、Python実務1か月の初心者で、初めて行ったLambdaのPythonランタイムのバージョンアップのため手順を備忘録として残したいと思います。

## 2．環境
- AWS Lambda
- Python3.6

## 3．手順
### 3.1 バージョンアップ手順
1. [Python公式ページ](https://docs.python.org/ja/3.9/)からリリースノートを確認
1. 現在動作しているLambdaをコピー
1. コピーしたLambda（Python3.6）を検証実行
1. コピーしたLambdaのランタイムを3.9に変更して検証実行
1. 発生した不具合を1番のリリースノートを確認しながら修正  
1. テスト仕様書作成
1. テスト実行
1. 不具合修正

この記事では2番から5番までの情報をまとめていきます。

### 3.2 Lambdaコピー手順・Pythonランタイム変更について
1. 現状確認
Pythonランタイム確認
![コメント 2022-05-30 133819.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259227/e41c3b53-ee2b-8cb6-5724-92476f7e1ff9.png)
Lambdaレイヤー確認
![コメント 2022-05-30 133833_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259227/c6f20319-11e2-1ab8-672c-2ed1abfd914b.png)
各種設定確認（例として、メモリ、タイムアウト、実行ロールの設定）
![コメント 2022-05-30 133939.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259227/df9679a8-dc72-5104-0988-b1b98b3c4780.png)
![コメント 2022-05-30 133914.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259227/92356071-506b-0e6e-6cf5-4f6071b5f34e.png)
Lambdaに設定しているソースをエクスポート
![コメント 2022-05-30 134222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259227/3a3d867c-c181-a78d-8f2d-ad1bd5f5e585.png)
![コメント 2022-05-30 134206.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259227/1b33f116-b71a-1a01-d6c7-2d3ce6d2557b.png)

1. Lambda新規作成(ランタイム Python3.6)
Lambda関数を新規作成し、1番で確認した設定を反映する。
![コメント 2022-05-30 135725.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259227/c2f14595-89a5-3d7a-3487-94bd5e5ddf8e.png)

1. 2番で作成したLambda関数をテスト実行
注意点：CSVファイル連携等の外部連携を行っている場合は事前にソース修正して既存ファイルを更新しないように注意が必要。

1. 2番で作成したPythonのランタイムを3.9に変更
![コメント 2022-05-30 133819_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259227/fd37fe8a-50ec-c2b6-9a49-c8314424a292.png)
![コメント 2022-05-30 141022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259227/b21a44ec-5e29-b855-1843-1e3211ed2f23.png)

1. 4番でバージョン変更後のLambda関数をテスト実行

## おわりに
チーム異動前はPHPを使用しておりましたが、言語が変わってもログを確認して対応する事が大事と再認識しました。
まだ単体テスト実行前のため本格的な検証が出来ておりませんが、手早く最低限の検証は出来たと考えております。
何かご参考になりましたら幸いです。

## 参考資料
貴重な情報を頂きありがとうございました！
- [Python 3.9.12 ドキュメント](https://docs.python.org/ja/3.9/)
- [centos7 python3.9をインストールする](https://mebee.info/2021/02/24/post-29350/#outline__3)
- [図解！Pandas DataFrameの結合(UNION: concat, append)](https://ai-inter1.com/pandas-dataframe_union/#st-toc-h-3)
- [Pandas公式GitリポジトリのIssue](https://github.com/pandas-dev/pandas/issues/35407)
Merryの外部ツール機能に関して

テキストエディタ「Merry」の外部ツールに関して。

標準では、Internet Explorerなので、Microsoft Edgeにできないかと画策中。

ツール→外部ツール→外部ツールの設定で、追加でタイトルとコマンドは入れられたが、引数は分からない。

引数を設定してやれば、現在編集しているファイルを起動できると思う。
"Geogebra" スライダーで画面切り替える方法(スライドの作成)

ICT教材である**Geogebra**を用いて，スライドのように画面を切り替える方法を紹介します:sunny:
皆様の参考になれば幸いです:tulip:
# 手順
##### 1. `スライダー`を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682570/881bd8f7-ae4d-b88c-9695-e1b4b1c113e7.png)


##### 2. スライダーの詳細を入力
- 型，名前，区間を入力する
 (以下の例では，0～7枚のスライドを表示させている)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682570/c7bc344d-497b-b1e8-23a7-f692b21aad6b.png)
すると，以下のようにスライダーが表示される！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682570/420198ed-b384-18cc-05be-0bd6f4688a3f.png)

##### 3. テキスト(図)の挿入 
 - テキスト(図)の挿入を選択する
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682570/6d6d9bdc-00eb-c756-1c28-9f7067184da3.png)
すると，以下のようにテキストが表示される！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682570/7e3d58f6-0219-0b29-dd3a-447422a65f5e.png)

##### 4. テキスト(図)とスライダーの連携
 - 表示したいテキスト(図)を選択し，右Click ⇒ `オブジェクトのプロパティ`を選択
 - `上級`⇒`オブジェクトの表示条件`を選択して，テキスト(図)を表示したいスライドの範囲を記述する
  (以下の例では，スライド1～3枚の間で表示させている)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2682570/cd54ec2b-22a0-baa7-2774-01b200fd7e30.png)


これで，スライダーを用いて画面を切り替えることが出来るようになりました:star:
# 参考
実際に，私が作成したものを載せておきます...:point_down:

https://www.geogebra.org/m/fzyfhswd
https://www.geogebra.org/m/npgjfh2s
PowerPointのデザインテーマを保存し次にも使う

## やりたいこと

- PowerPointのカスタマイズしたスライドマスターを保存する
- デザインテーマの以下のユーザー定義に表示されるようにしてすぐ利用できるようにしたい

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89911/99f9697d-e8ed-6f21-3745-2726db0b8f53.png)

## 実現

カスタマイズしたスライドマスターのPowerPointファイルを"thmx"形式で保存します。

![Screenshot 2025-01-27 at 15.39.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89911/79eeb182-939d-42d4-98fb-487e7405854c.png)

この時の保存場所が大事です。Macの場合、上記から保存してそのままで問題ないです。
Windowsの場合、以下のファイルパスに保存します。

```
C:\Users\{ユーザー名}\AppData\Roaming\Microsoft\Templates\Document Themes
```

これだけで、冒頭の画像のようにユーザー定義のところに自分のデザインが表示されます。

## 経緯

PowerPointで気分転換がてらスライドマスターをいじって新たなデザインテーマを作って、
これを次のスライドにも使おう！ってなった時にいつもやり方をググってました。
ですが、ググって上に出てくる公式の情報は自分のやりたいことではないんです。

https://support.microsoft.com/ja-jp/office/%E3%82%B9%E3%83%A9%E3%82%A4%E3%83%89-%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3-%E3%83%86%E3%83%BC%E3%83%9E-%E3%82%92%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%81%A8%E3%81%97%E3%81%A6%E4%BF%9D%E5%AD%98%E3%81%99%E3%82%8B-a67d2a4e-7bd7-4c5f-8ab4-7845f9e7e610

この方法だと以下のステップを踏まなくてはいけないんですね。

1. デザインタブを開く
1. デザイン一覧を開く
1. テーマの参照を開く
1. Officeのカスタムテンプレートを開く
1. ファイル名から開きたいテーマを推測し開く

5ステップ、かつ、最後のステップは数が少なければいいですが、増えてきたら難儀です。
これがユーザー定義に表示されれば：

1. デザインタブを開く
1. デザイン一覧を開く
1. テーマを見た目から選ぶ

認知負荷も下がっていいですね。
逆にファイル名はマウスオーバーしなきゃ出てきませんが、
デザインテーマを選ぶ基準はビジュアルなのでまずそこが重要です。

この公式の方法は`potx`という「テンプレート」でスライドのコンテンツも含めたテンプレートです。
なので自己紹介や自社紹介のスライドとかそういうものを含めて保存したい時はこちらがお勧めです。
`thmx`はあくまでもスライドマスターのデザインだけ保存して使いまわす、という違いでした。
Vivaldi のクラッシュ対策としての fcitx5 改善

　Ubuntu 22.04 で Wayland に対応した Fcitx5 移行が推奨されたのだが、そのタイミングで、Vivaldi に異常が起こるようになった。正直、私は Fcitx5 の問題だとは思っておらず、試行錯誤していたのだが、Vivaldi コミュニティと fcitx5 開発者の皆さんの努力で、原因が fcitx5-gtk にあることが突き止められ、対策も行われた。<br>
　只、主に CJK 語圏のみの問題であるため、対策がメインストリームに取り込まれるのは、早くて 20.04LTS から 22.04LTS へのアップグレードのタイミング、遅ければ 22.10 のリリースまで待たされるのではないだろうか。<br>
　と言うことで、情報を集めるのに苦労したので、日本での Vivaldi ユーザーの一助になればと、対策の導入法を記載しておきます。

---

## 1. 症状と原因・対策
1. 症状
    - 複数のウインドウを開いている時、一つのウインドウを閉じると、全てのウインドウが閉じてしまう。発現確率は私の場合７０％位で有った。
    - 私の環境は Ubuntu 22.04 + Wayland + fictx5 + Vivaldi 5.2
    - [こちらで議論されています(1)](https://forum.vivaldi.net/topic/74150/%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97%E7%89%88-%E5%85%A8%E3%81%A6%E3%81%AE%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%81%8C%E9%96%89%E3%81%98%E3%82%8B/8)
    - [こちらで議論されています(2)](https://forum.vivaldi.net/topic/75398/when-closing-one-window-all-other-windows-are-also-closed)

1. 暫定対策
Vivaldi 5.1 に戻す。但し、5.2 の機能が使えなくなったりして結構面倒でした。<br>

1. 恒久対策
    - fcitx5 の DBus の問題だったらしく、２項目の対策が行われています。
    - [対策(1)](https://github.com/fcitx/fcitx5-gtk/commit/1bac6591e967339bc4170cabc5706fdd79521982)
    - [対策(2)](https://github.com/fcitx/fcitx5-gtk/commit/6b03b9f7fed340f056cda5da042824fb4d667a53)

---

## 2. 対策の導入

　ソースを git clone して build & install するだけです。
~~~shell:コマンド
git clone https://github.com/fcitx/fcitx5-gtk.git
cd fcitx5-gtk
sudo apt install extra-cmake-modules libgirepository1.0-dev libxkbcommon-dev libxkbcommon-x11-dev libgtk2.0-dev libgtk-3-dev libgtk-4-dev
mkdir build && cd $_ && cmake -Wno-dev .. && make -j`nproc`
sudo make install
sudo apt purge libgirepository1.0-dev libxkbcommon-dev libxkbcommon-x11-dev libgtk2.0-dev libgtk-3-dev libgtk-4-dev
sudo auto remove
~~~
　あとはリブートすれば大丈夫です。


## 3. あとがき
初めての記事ですが、何方かのお役に立てば幸いです。
keychain

ssh鍵のパスワードを1度入力するだけで後はぶける

```sh:インストール
sudo apt install -y keychain
```

```sh:~/.bashrc
SSH_KEY_1="$HOME/.ssh/id_rsa"

if [ -e /usr/bin/keychain ]; then
    eval $(keychain --eval --agents ssh)
    if [ $(ssh-add -l | grep $SSH_KEY_1 | wc -l) -eq 0 ]; then
        ssh-add $SSH_KEY_1
    fi
fi
```
【APNs】プッシュ通知の証明書を更新する。

iOSアプリでプッシュ通知を飛ばすにはAppleDeveloperにて色々設定をしてp12ファイルやらpemファイルやらを用意しないといけないのですが、1年に1回の作業なんて覚えている訳も無く、折角なので備忘録として残す事にしました。

[キーチェーンからcerファイルの作成(Mac)]
Finder→アプリケーション→ユーティリティ→キーチェーンアクセスでキーチェーンアクセスを立ち上げる。
メニューのキーチェーンアクセス→証明書アシスタント→認証局に証明書を要求を選択
ユーザのメールアドレスにAppleDeveloperで使用しているメアドを入れ、要求の処理をディスクに保存、鍵ペア情報を指定にし、続けるボタンを押す。
後は最後までボタン押していけば良い。
これでcerファイルは完成。


[AppleDeveloperでの更新処理(Web)]
Certificates,Identifiers＆Profiles→Identifiers→NAME一覧からpush通知で使っているNAMEのものを選択→pushNotificationsの横にあるEditを選択

Production SSL Certicateと書かれた部分に現在設定されている証明書が確認出来る。

:::note alert
※設定出来るのは2個までなので、2個ある場合は片側は不要の為、削除を行う。
:::

現在設定されている証明書の下部にCreate Certificateを選択し、次画面のChooseFileで作成したcerファイルのアップを行いContinueを押す。
その後、ダウンロード画面に遷移する為、ダウンロードを行う。

:::note alert
※デフォルトのファイル名はaps.cer
:::

[p12ファイルの作成(Mac)]
先程ダウンロードしたaps.cerをダブルクリックし、キーチェーンへ追加する。
その際、信頼されていないとなる場合があるが、右クリックメニューの情報を見るを選び、最上部にある閉じらている信頼を開き、常に信頼をするを選ぶ事により、信頼された証明書となる。
キーチェーンへ登録されたものを内容が閉じた状態で書き出す必要がある為、閉じた状態を確認し、右クリックメニューから書き出しを選びp12ファイルとして書き出す。
その際、パスワードを求められるが任意で設定。空でも良い。

[p12→pemに変換(Mac)]
先程出来上がったp12ファイルをpemに変換したい為、ターミナルを開き下記コマンドを打ち込む。
openssl pkcs12 -in 変換するファイル名.p12 -out 変換後のファイル名.pem -nodes
そうすると、パスワード入力を求められるので先程設定したものを入力。空ならEnterで良い。
これでpemファイルが出来上がる。

あとはこれをサーバーにアップして動作確認して終了。
UnrealEngineでアセットのパス文字列で指定したBlueprintClassのインスタンスを作成する

アセットのパス文字列で指定したBlueprintClassからインスタンスを作成するやり方をメモしておきます。
iniでSpawnするアクタを指定して切り替えるようなことができます。
以下の例はActorですがWidgetなどでも応用可能です。

UE4.27.2で動作確認しています。
もっと良い実装方法があったら教えてください。


## 例

以下のようなC++を用意

```cpp:MyBlueprintFunctionLibrary.h
UFUNCTION(BlueprintCallable)
static UClass* StaticLoadClassFromSring(FString Path);
```

```cpp:MyMyBlueprintFunctionLibrary.cpp
UClass* UMyBlueprintFunctionLibrary::StaticLoadClassFromSring(FString Path)
{
	UClass* Class = StaticLoadClass(UObject::StaticClass(), nullptr, *Path);
	if (!Class)
	{
		UE_LOG(LogTemp, Error, TEXT("Failed o load class at path:%s"), *Path);
	}
	return Class;
}

```

以下のように用意したノードを利用

![loadclass.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/16768/0099cd9b-c130-f5fb-6c4a-7caa8454769b.png)

## パッケージング時の設定

ちゃんと検証していませんが、場合によっては以下の設定に読み込みたいアセットが入ったディレクトリを指定しておく必要があるかもしれません。
[Project Settings] > [Packaging] > [Additional Asset Directories to Cook]
【JavaScript関数ドリル】中級編のunion関数の実装アウトプット

## union関数の課題内容

_.union関数を自分で実装する課題。
https://lodash.com/docs/4.17.15#union

「課題内容」/「解説動画」/「解答例」を確認したい場合は、以下リンク先のページを参照。
https://js-drills.com/blog/union/


## 課題に取り組む前の状態

- 解答例を見なくてもできそうと思った。


## 課題に取り組んだ後の状態

- 解答例では引数を受け取る際に、...で展開されているのが、参考になった。


## union関数の実装コード（答えを見る前）
```javascript
function union(arrays) {
    const unionArray = [];

    for (let i = 0; i < arguments.length; i++) {
        for (let j = 0; j < arguments[i].length; j++) {
            if (!unionArray.includes(arguments[i][j])) {
                unionArray.push(arguments[i][j]);
            }
        }
    }

    return unionArray;
}
```

## union関数の実装コード（答えを見た後）
```javascript
// 同じ
```
ServiceNow - PowerShellから日本語を含むデータをPOSTする

PowerShellからServiceNow APIに日本語を含むデータをPOSTしても正しく処理されない場合がある。ServiceNow APIはデータがUTF-8でエンコーディングされていることを前提としているため他エンコーディングされていると正しく処理しない。
Linux上でPowerShellを利用している場合はデフォルトでUTF-8になりますが、WindowsでPowerShellを利用するとUTF-8ではない。
その場合は次のようにPOSTする文字列をバイナリで送信する。

```
$user = "<ServiceNowログインユーザ名>"
$pass = "<ServiceNowログインパスワード>"
$instanceName = "<ServiceNowインスタンス名>"
$tableName = "<データを挿入するテーブル名>"

# 投稿先URL
$uri = " https://" + $instanceName + ".service-now.com/api/now/table/" + $tableName + "?sysparm_display_value=true"
$method = "post"

# 挿入するデータ
$body = "{`"u_user_id`":`"イベント２`"}"
$bytes = [System.Text.Encoding]::UTF8.GetBytes($body)

# 認証情報の設定
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user, $pass)))

# ヘッダの設定
$headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$headers.Add('Authorization',('Basic {0}' -f $base64AuthInfo))
$headers.Add('Accept','application/json')
$headers.Add('Content-Type','application/json')

# 投稿
$response = Invoke-RestMethod -Headers $headers -Method $method -Uri $uri -Body $bytes
```

以上
【Flutter】Dialogの幅の変え方【Dialog】

# 問題点

FlutterのDialogは、幅の変更方法がちょっと特殊。
Dialogにwidthの設定はできないし、childの幅を指定してもその通りにならない。

# 解決策

Dialog.insetPaddingで調整する。

```dart
Dialog(
    insetPadding: EdgeInsets.symmetric(horizontal: 16),
    child: Container()
)
```

こうすれば、画面幅から16マージン取った分の幅が確保される。

画面幅からのマージンでサイズを決定するのではなく、直接Dialogの幅を指定したい場合は、insetPadingにはEdgeInset.zeroを入れて、childの幅を指定する。

```dart
Dialog(
    insetPadding: EdgeInsets.zero,
    child: Container(
        width: 396,
        child: ...,
    )
)
```

# まとめ

- Dialogの幅を変更する場合は、insetPaddingを使おう。
Gnu global(gtags) を使ってソース一式を連続Grepする


組込みソフト等，中規模／大規模ソフトを作成ていると他者が作ったソースに自分が変更しようとする RAM が使われており，その下流影響確認を入念に行うことが求められる。

秀丸等で 1 つづず手動で Grep 検索を行うと時間がかかってしまうため，一括で検索する Bat ファイルを書いてみました。

### 前提

- Gnu global がインストールされていること
  [GnuGlobak](https://www.gnu.org/software/global/)をダウンロードしローカルドライブに展開ください。

- GTAGS,GRTAGS ファイル等を作成する
  検索したいソース一式が入っているフォルダで DOS コマンドラインを開き，gtags.exe を実行する。

- LISTFILE.txt を作成する
  検索したい RAM 名を 1 行 1 つで記載してください

```LISTFILE.txt
ram1
ram2
ram3
ram4
```

### 実行方法

- 手段１ LISTFILE.txt を作成手ある場合は， bat ファイルをダブルクリックで実行

- 手段２ listfile を bat ファイルにドラック＆ドロップし実行

## Bat ファイル

```Bat:gtagsgrepbytext.bat
@echo off
@REM file指定の連続Grep検索 2022/01/01 sby

@REM - Gnu HPからソフトをダウンロード
@REM   Gnu Global https://www.gnu.org/software/global/
@REM   Gnu Global(gtags.exe/htags.exe)を展開したフォルダをPathに追加する。
set path=C:\TOOLS\gtags\bin;%PATH%

setlocal enabledelayedexpansion
REM パラメータを設定する
if "%1"=="" (
    @REM 引数を持たず実行された場合は初期設定で処理を続ける
    SET LISTFILE=LISTFILE.txt
    set OUTFOLDER=output_LISTFILE
) else (
    SET LISTFILE=%1
    set OUTFOLDER=output_%~n1
)

REM 出力フォルダを作成する
if not exist %OUTFOLDER% mkdir %OUTFOLDER%

REM ファイルのLine数をカウント
set linecnt=0
for /F "tokens=1" %%A in ( %LISTFILE% ) do (
    set /a linecnt=linecnt+1
)

REM 1 RAMごとに１ファイルで出力
set num=0
for /F "tokens=1" %%A in ( %LISTFILE% ) do (
    set /a num=num+1
    if not exist %OUTFOLDER%/%%A.txt (
        ECHO Global::[ !num! / !linecnt! ] %%A を処理中です
        global --grep %%A --result=grep > %OUTFOLDER%\%%A.txt
    ) else (
        ECHO Global::[ !num! / !linecnt! ] %%A は処理済み。処理をPassします。
    )
)
endlocal
```
Pythonの点群・3Dメッシュ可視化ライブラリが多すぎてカオスなので整理してみる

最近Pythonで2次元/3次元問わずデータ処理を行うことが多いんですが、特に3次元データの方のライブラリが色々ありすぎて頭の処理が追いつかないのでちょっとだけ整理していこうと思います。
（随時更新予定…）

## PyVista

- https://github.com/pyvista/pyvista
- [Visualization Toolkit](https://vtk.org/) (VTK)をnumpyでラップした高レベルのAPI
- VTK・SLT・OBJ・PLYなど一通りメッシュが読める
- 結構GUIツールが揃っている感じ？
- 点群とメッシュの変換はできるらしい
- シミュレーション・レイトレーシング・GISで使えるとかなんとか

## Leafmap

- https://github.com/giswqs/leafmap
- lasを読み込める
    - plyもいける？
- lasを読み込んだ時はlaspyのインスタンスが出来上がる
- 2次元データ処理寄り

## Open3D

- https://github.com/isl-org/Open3D
- 3Dデータなら大体ビジュアライズできそう
- 機械学習もサポート
- 3Dデータ処理もいける

## Trimesh

- https://github.com/mikedh/trimesh
- 点群とメッシュは大体読めそう？
- ベースの部分に可視化機能はついていないらしい
- pygletと合わせて可視化するっぽい？
- 統計分析・機械学習の前処理によく利用されるっぽい
- kaolinとかpyrenderとかいろんなライブラリの基盤として利用されている

## pyntcloud

- https://github.com/daavoo/pyntcloud
- 名前からしてめっちゃ点群をどうこうできそうなライブラリ
- なんだかんだで色んな3D形式を操作できそう
- 分析と前処理がメインっぽい
- 可視化バックエンドとしてthree.jsが選べる
- Open3DやPyVistaと統合が簡単そう
- ボクセル化・特徴点抽出・間引き・外れ値の検出・サブサンプリングなど簡単にできる

## 結論

- （大体内部ではnumpyが使われている）
- 可視化・ファイル形式変換くらいならとりあえずLeafmap + open3D使っとけばなんとかなりそう
- 点群の大規模な分析になるならpyntcloud + open3Dかな？
- Pythonで3Dデータを利用したシミュレーションなどやるならPyVista
- 3Dデータを綺麗に表示させたいならpyrenderかな？Trimeshを生で使う必要はなさそう

これ以上ライブラリ覚えれないので、完結としたい。
Linux学習 システムアーキテクチャ 101-2 システムの起動

カーネルは起動されると、高度にハードウェアを認識・制御し、ルートファイルシステムのマウントなど様々な初期化処理を行います。
ブートローダはカーネルと初期RAMディスク（initramfs）の内容をメモリ上に展開し、カーネルはメモリ上に展開された初期RAMディスク内の、ファイルシステムへアクセスするために必要なドライバやスクリプトを使用してルートファイルシステムをマウントします。その後、initという特別な最初のプロセスをルートファイルシステムから起動します。
「SysVinit」と呼ばれる従来のinitプログラムを採用しているシステムでは、initプロセスとして「/sbin/init」が起動されます。なお、カーネルはブートローダの次に起動されます。

カーネルのログが記録されるなど、Linuxでメインで使用されるログファイルは「/var/log/messages」です。

システム起動時には様々なメッセージが出力されます。起動時に出力されたメッセージは後からdmesgコマンドで確認できます。
以下はdmesgコマンドの出力例です。

![](https://paper-attachments.dropbox.com/s_EAB9421F2980520784F38B8A425A4F19203DBA505ECEF799BDFAC8338713EFAD_1654702369936_k33718.jpg)


dmesgコマンドはカーネルが出力するメッセージが格納されるリングバッファの内容を出力します。
リングバッファはマシンの再起動やシャットダウンによってリセットされますが、運用中に一杯になると古い情報から上書きされていきます。手動でリングバッファの内容をクリアするには、rootユーザで「dmesg --clear」を実行します。


UpstartはSysVinitを改善した新しい仕組みです。Red Hat Enterprise Linux(RHEL)やUbuntuに採用されていましたが、現在はsystemdへの置き換えが進められています。
Upstartではバックグラウンドで動作するデーモンプロセス（サービス）や、一度だけ実行させたい処理（タスク）を「ジョブ」と呼び、ジョブ単位で起動処理の管理を行います。
Upstartは各ジョブの実行に必要な前提条件を「イベント」で管理し、前提条件がすべて成立した時点でジョブを実行します。SysVinitのように順次起動していくのと異なり、サービスの起動に必要な条件が成立した時点で起動処理が行われるため不要な待機時間がなくなります。また、各ジョブの実行がパラレル（並列）に行われるため、関連のない独立したサービスは同時に起動させることができます。
イベントはシステム上の変化を検知するだけではなく、initctlコマンドで発行することもできます。

systemdの管理にはsystemctlコマンドを使用します。systemctlコマンドの書式は以下のとおりです。
systemctl サブコマンド [ Unit名 ]
主なサブコマンドの一覧

![](https://paper-attachments.dropbox.com/s_EAB9421F2980520784F38B8A425A4F19203DBA505ECEF799BDFAC8338713EFAD_1654702552977_kkkkk34236.jpg)


Linuxが何らかの原因で正常に起動できない場合、CD-ROM/DVDやUSBなどのインストールブートメディアからレスキューモードでシステムを起動することができます。
レスキューモードで起動できた場合は、CPU/メモリといったハードディスク以外の装置には問題がないと考えられますので、レスキューモードで起動したシステムから起動に失敗するハードディスクのファイルシステムをマウントできるかを確認します。
レスキューモードでファイルシステムを正常にマウントできた場合は、「/var/log」配下のログでエラーを確認したり、重要なファイルを取り出せる可能性があります。

一般的なLinuxシステムでは、BIOS/UEFI、ブートローダ、カーネル、initの順にブートプロセスが進行します。　
BIOS/UEFI → ブートローダ → カーネル → init

「SysVinit」と呼ばれる従来のinitプログラムを採用しているシステムでは、カーネルから起動されるinitプロセスとして「/sbin/init」を起動します。initは起動されると、設定ファイル「/etc/inittab」の記述に基づいて、自動起動するべきプロセスを立ちあげるなど、アプリケーションレベルの初期化を行います。

systemdで扱う処理はUnitという単位で管理します。Unitには各機能ごとに拡張子が割り当てられており、拡張子を見ることでどういった機能のためのUnitかが判別できるようになっています。

![](https://paper-attachments.dropbox.com/s_EAB9421F2980520784F38B8A425A4F19203DBA505ECEF799BDFAC8338713EFAD_1654705218339_kk34236.jpg)


各サービスの稼働状況や起動設定を管理するにはsystemctlコマンドを使用します。systemctlコマンドの書式は以下のとおりです。
systemctl サブコマンド [ Unit名 ]
※Unit名に拡張子がない場合、.serviceの拡張子を持つUnitが指定されたものとみなされます
主なサブコマンドの一覧

![](https://paper-attachments.dropbox.com/s_EAB9421F2980520784F38B8A425A4F19203DBA505ECEF799BDFAC8338713EFAD_1654705504825_kkkkk34236.jpg)
画像を赤くダミー化するドロップレットの作り方（Photoshop）

ゲーム等の開発していると、本素材ができるまでダミー画像を使うことがよくあります。
そういった時にドロップ&ドロップで画像を簡単に赤いダミー画像化できるドロップレットがあると結構便利です。
（本素材に差し替え漏れを防ぐためにも、また、他の人が見てもこれはまだダミーなんだとわかりやすいように赤くするのは結構大事！）

## 1. アクションを作成

#### 1-1.新規アクションを作成
Photoshopを開いてアクションのウィンドウから新規アクションを作成
（アクションウィンドウが表示されてない場合は、メニュー > ウィンドウ > アクション から表示可能）
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/4ab6e60b-85c4-00ca-bde8-ddf380792f2f.png)
アクション名を入力して記録ボタンをクリックすると、次から行った操作が記録されます
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/b2f6dff5-2d87-6617-0666-18859771a08e.png)

#### 1-2.画像を開く
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/3ea06ca9-fd2d-b3c1-98b2-698c15692d81.png)
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/63e43205-2ebd-5c78-55d2-94aeefb81358.png)

#### 1-3.新規レイヤーを作成
「command + shift + N」
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/b410f763-54db-ddcd-3cc6-751195741aeb.png)
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/fadfd176-6086-aeb1-110a-2a4c018e5f0d.png)

#### 1-4.赤マスクを作成
新規作成したレイヤーが選択された状態で、開いた画像レイヤーの赤枠部分を、「command」を押しながらクリック
 ![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/cb4fed6d-3444-9377-0d47-2b82e4521c8b.png)
すると下記のように画像の領域が選択されます
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/98860c18-f426-969b-df38-4cccb5826d34.png)
「option + delete」で塗りつぶします
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/b9ec431f-b993-afa3-b42e-9836bf9a6c2f.png)
不透明度を50%にします
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/f4dd4637-6392-26f2-4305-0ddc33f004f2.png)
![11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/15f319f0-aa50-bfb7-69f3-b891b548f752.png)

#### 1-5.レイヤーを結合
2個のレイヤーを選択して、右クリックから「レイヤーを結合」をします
![12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/cecb369f-078e-000d-d7f0-2bd6d3bb5e39.png)
![13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/05a31c83-081d-5ddb-efff-2f8d2fc4fe06.png)

#### 1-6.保存する
保存します（command + S でも可能）
　![14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/138c4189-bd53-99d4-a270-20f79e2cfa2c.png)

#### 1-7.アクションの記録を停止する
アクションウィンドウを再度開き、停止のアイコンを選択して、アクションの作成は完了
![15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/1864dc9b-d339-ab40-0f4c-7fa2898a5b61.png)


## 2. ドロップレットを作成

#### 2-1.ドロップレットを作成

「メニュー　> ファイル > 自動処理 > ドロップレットを作成...」
![16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/537b0110-d0f6-392a-e302-d27a725c1c73.png)

下記の部分を設定してOK
・保存先を設定
・アクションに先程作成したアクションを選択
・「"開く"コマンドを無視」にチェック
・「カラープロファイル警告を非表示」にチェック
![17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/7b73b6a8-e3d5-9808-ac38-e5cca3abd836.png)



## 3. 画像をダミー化する

生成されたドロップレットに、画像をドラッグ&ドロップすると、その画像に赤マスクがかかります

![output.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88968/73e5b54d-8480-f8df-10c3-e543247a94ea.gif)
【JavaScript関数ドリル】初級編のcompact関数の実装アウトプット


## compact関数の課題内容

_.compact関数を自分で実装する課題。
https://lodash.com/docs/4.17.15#compact

「課題内容」/「解説動画」/「解答例」を確認したい場合は、以下リンク先のページを参照。
https://js-drills.com/blog/compact/


## 課題に取り組む前の状態

- 解答例を見なくてもできそうと思った。
- 前回まで、変数名をわかりやすいものにしていなかったので、今回は気をつけようと思った。

## 課題に取り組んだ後の状態

- 解答例とまったく同じ（変数名も含めて！）にできたので、嬉しかった。


## compact関数の実装コード（答えを見る前）
```javascript
function compact(array) {
    const compactedArray = [];

    for (let i = 0; i < array.length; i++) {
        if (array[i]) {
            compactedArray.push(array[i]);
        }
    }

    return compactedArray;
}

console.log(compact([0, 1, false, 2, '', 3]));
// => [1, 2, 3]
```

## compact関数の実装コード（答えを見た後）
```javascript
// 同じ
```
100日後くらいに個人開発するぞ！day043

## 今日はハッシュとシンボルを学んでみた！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2632394/9a79e3a3-9fee-e7d4-d7db-c39b5c7a38d8.png)


## 今日の学び

### ハッシュ
* ハッシュは複数の値をまとめて管理する方法の一つで、それぞれの値にキーと呼ばれる名前をつけて管理する
* ハッシュの作り方
    * `{キー1 => 値1,キー2 => 値2,キー3 => 値3}`
* ハッシュは変数に代入することができる
    * 変数 = `{キー1 => 値1,キー2 => 値2,キー3 => 値3}`
* ハッシュの各要素の値は、対応するキーを使って、`ハッシュ[キー]`とすることで用いることができる
* `ハッシュ[キー] = 値`と書くことで、キーと対応している値を更新することができる
* ハッシュ[新しいキー] = 値と書くことで、ハッシュに新しい要素を追加することができる
    * ハッシュにすでにあるキーを指定すると、要素の追加ではなく更新になってしまうので注意
* ハッシュはキーの部分を文字列ではなく、先頭にコロン「:」を付けた書き方をすることもできる
* ハッシュのキーにシンボルを用いる際、`:key =>`を`key:`というように省略することができる
    * 省略した書き方の場合でも要素を取得する場合にはにシンボルを用いる必要がある

### シンボル
* シンボルとは文字を「"」や「'」で囲む代わりに、先頭に「:」をつけた書き方
    * 例：テキストを出力したい場合
        * `puts "テキスト"`
        * `puts :テキスト`
【JavaScript関数ドリル】初級編のdrop関数の実装アウトプット

## drop関数の課題内容

_.drop関数を自分で実装する課題。
https://lodash.com/docs/4.17.15#drop

「課題内容」/「解説動画」/「解答例」を確認したい場合は、以下リンク先のページを参照。
https://js-drills.com/blog/drop/


## 課題に取り組む前の状態

- 解答例を見なくてもできそうと思った。


## 課題に取り組んだ後の状態

- 解答例では、第２引数が０の場合や配列の長さより長い場合をあえて分けて処理するなど、自分のコードと違う部分があるが、自分の実装コードのforループで、第２引数が０の場合は処理されないように記述し、第２引数が配列の長さより長い場合も含め、サンプルの処理結果が同じように出ているため、このままで良いかと判断。
- もし、極端に大きすぎる第２引数が渡された場合に備える場合は、むだにforループを続けてしまうので、やはり解答例と同じようにif文を使いたいと思う。


## drop関数の実装コード（答えを見る前）
```javascript

function drop(array, n = 1) {
    const newArray = [...array];
    for (let i = 0; i < n; i++) {
        newArray.shift();
    }
    return newArray;
}
```

## drop関数の実装コード（答えを見た後）
```javascript
function drop(array, n = 1) {
    const newArray = [...array];
    for (let i = 0; i < n; i++) {
        newArray.shift();
        if (newArray.length === 0) {
            return [];
        }
    }
    return newArray;
}
```
jQuery propの解説 checkedやselectedの状態を取得・設定

## prop

### 状態を取得
```html:例として使うhtml
<input type="checkbox" id="hoge">
```
```js:選択値の取得
$("#hoge").prop("checked");
// チェックされていた場合は「true」が返される
// チェックされていなかった場合は「false」が返される
```
**解説**
`prop()`
セレクタの後に `.prop` を書く
引数には `checked` や `selected` などを指定する。

### 状態の設定
```html:例として使うhtml
<input type="checkbox" id="hoge">
```
```js:チェックボックスがチェックされた状態にする
$("#hoge").prop("checked", true);
```
**解説**
`prop()`
セレクタの後に `.prop` を書く
第1引数には `checked` や `selected` などを指定する。
第2引数には `true(選択された状態)` や `false（未選択の状態）` を指定する。
daisyUI のモーダルが一番前に来てくれない時


![スクリーンショット 2022-06-10 7.41.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/957847/11570493-6fd6-54d9-46e7-092c6b9b3785.png)

## 解決
react の[ポータル](https://ja.reactjs.org/docs/portals.html)を利用し、ルートDOM階層の外部にモーダルの表示を行うことで解決できる
下記サンプルは、 nextJs 利用時の方法となります。

```tsx:pages/_document.tsx
class MyDocument extends Document {
  render() {
    return (
      <Html lang={AppConfig.locale}>
        <Head />
        <body>
          <Main />
          <div id="modal" />  {/* <- 追加する */} 
          <NextScript />
        </body>
      </Html>
    );
  }
}
```

ModalBodyに当たる部分を portal で囲えばOK
```tsx:components/Modal.tsx
import { createPortal } from 'react-dom';

const ModalBody = ({ children }: any) => {
  const modalDom = document.getElementById('modal');
  return createPortal(children, modalDom!);
};

const Modal = () => {
  return (
    <>
      <label htmlFor="my-modal" className="modal-button btn">
        open modal
      </label>

      <ModalBody>
        <input type="checkbox" id="my-modal" className="modal-toggle" />
        <div className="modal">
          <div className="modal-box">
            <h3 className="text-lg font-bold">
              Congratulations random Interner user!
            </h3>
            <p className="py-4">
              You've been selected for a chance to get one year of subscription
              to use Wikipedia for free!
            </p>
            <div className="modal-action">
              <label htmlFor="my-modal" className="btn">
                Yay!
              </label>
            </div>
          </div>
        </div>
      </ModalBody>
    </>
  );
};
```

#### 変更後
![スクリーンショット 2022-06-10 8.10.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/957847/c5e68ea3-9606-652f-f21d-b3ae76df423f.png)


### 参考
https://ja.reactjs.org/docs/portals.html
https://github.com/saadeghi/daisyui/issues/533
【JavaScript関数ドリル】初級編のdropRight関数の実装アウトプット

## dropRight関数の課題内容

_.dropRight関数を自分で実装する課題。
https://lodash.com/docs/4.17.15#dropRight

「課題内容」/「解説動画」/「解答例」を確認したい場合は、以下リンク先のページを参照。
https://js-drills.com/blog/dropRight/


## 課題に取り組む前の状態

- 解答例を見なくてもできそうだと思った。


## 課題に取り組んだ後の状態

- 解答例では、第２引数が０の場合をあえて分けて処理するなど、自分のコードと違う部分があるが、自分の実装コードのforループで、第２引数が０の場合は処理されないように記述し、サンプルの処理結果が同じように出ているため、このままで良いかと判断。


## dropRight関数の実装コード（答えを見る前）
```javascript
function dropRight(array, n = 1) {
    const newArray = [...array];

    for (let i = 0; i < n; i++) {
        newArray.pop();
    }
    return newArray;
}
```

## dropRight関数の実装コード（答えを見た後）
```javascript
// 同じ
```
【UiPath】モダンデザインでのExcel操作系のアクティビティを使ってみた③


# はじめに

:::note info


この投稿はモダンデザインで使用可能なパッケージExcel ModernのアクティビティをStudioで使用してみた第3弾となります。
今回は「名前を付けて Excel ファイルを保存」アクティビティを使用してみたいと思います

実行環境は以下の環境で行っております
UiPath Studio 2021.10.4 (Community License、UIAモード：モダンデザイン）
:::

# ■名前を付けて Excel ファイルを保存
<font color=blue>(UiPath.Excel.Activities.Business.SaveExcelFileAsX)</font>
このアクティビティは保存するファイル名やExcelファイルの種類などを指定して別名でファイル保存ができるアクティビティです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/4c651fba-9bb6-5ad7-883f-39f15d7066fd.png)



今回は一覧.xlsxというファイルの追加シートに実行日を記載し実行後一覧.xlsxという形式で別名保存を行いたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/adef56cb-7706-26a8-8424-ddec86fdb9c3.png)


①一覧.xlsxというファイルに実行日を記載する処理を設定します。
※今回はこの部分の設定方法については省略します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/2d91aa50-ba8b-3487-7c4a-212dcd48af36.png)


②実行日を書き込みの下に「<b><font color="blue">名前を付けて Excel ファイルを保存</b></font>」アクティビティを設置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/c2dc20aa-0c7f-00a4-7149-65e7b07c2033.png)


③ブックの設定
ブックの右端の＋マーク⇒Excelの順に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/e5285f23-8729-a30d-dac7-5179c6996e8f.png)

:::note warn
既存のファイル置き換えがデフォルトで設定されているため、
設定したくない場合はチェックを外してください。
:::

④ファイルの種類を選択
保存するファイルの種類をプルダウンで選択します。
※2022/3/31時点では４種類
|ファイルの種類|拡張子|
|:---|:---|
|Excelブック|.xlsx|
|バイナリブック|.xlsb|
|マクロブック|.xlsm|
|97-2003ブック|.xls|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/56e09f9d-983c-c5f9-f6e7-57f7fa4e0f1b.png)

⑤次は別名保存時のファイルパスを指定します
今回はロボットフォルダ直下にファイルを出力する為ファイル名だけ記載していますが、実際使用される場合は
保存後のフルパスを設定する事になるかと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/0c0c5af9-54e2-c448-0587-a29bec83886d.png)
アクティビティの設定はここまでで完了です。

⑥最後に実行して確認してみましょう。
実行後一覧.xlsxとして別名で保存されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/afdb8362-cf2b-8353-2e69-f019ae9449d0.png)


#おわりに
今回は「名前を付けて Excel ファイルを保存」について触れましたがいかがでしたでしょうか。
他のアクティビティにも順次触れていこうと思います。
閲覧いただき有難うございました。
PHP 今月の末日を取得 date() strtotime() まとめ

## date() と strtotime() を組み合わせて月末の日付を取得します。
```php:今月の末尾を取得
  var_dump(date('Y-m-d',strtotime('last day of this month')));
```
**解説**
`date()関数`
```php:例　2022/1/10の午前5時に実行したとします
date("Y/m/d H:i:s"); // 2022/10/01 05:00:00
date("Y/m/10"); // 2022/10/10 10日を指定することもできる
```
第1引数　→　フォーマット
第2引数　→　タイムスタンプ（省略可）
※第2引数を指定しなかった場合は「現在の日時」が第1引数のフォーマットで取得されます。

**フォーマットの一部を紹介**
|フォーマット|結果| 
|:---:|:---:|
| Y       | 年4桁        |
| y     | 年2桁      |
| L       | 閏年かどうか(1が閏年で0が閏年ではない)        |
| m         | 月（一桁の場合は先頭に0をつける）        |
| n       | 月（一桁の場合でも先頭に0をつけない）     |
| d    | 日（一桁の場合は先頭に0をつける）    |
| j      | 日（一桁の場合でも先頭に0をつける）    |
| H      |時間（24時間単位で一桁の場合は先頭をつける）         |
| i    | 分    （一桁の場合は先頭に0をつける）    |
| s    | 秒 （一桁の場合は先頭に0をつける）    |




`strtotime()関数`
```php:例　2022/1/10の午前5時に実行したとします
date("Y/m/d H:i:s", strtotime('+1 day')); // 2022/01/11
date("Y/m/d", strtotime('first day of this month')); // 2022/01/01
```
第1引数　→　日時
第2引数　→　タイムスタンプ（省略可）
※第2引数を指定しなかった場合は「現在」を基準に、第1引数で指定した日時のタイムスタンプが取得されます。

**日時指定の一部を紹介**
|日時指定|取得できる日時| 
|:---:|:---:|
| tommorw       | 明日        |
| yesterday     | 昨日      |
| +1 day       | 1日後        |
| -1 day         | 1日前          |
| +1 week       | 1週間後       |
| -1 week    | 1週間前     |
| +1 month      | 1カ月後       |
| -1 month       |1カ月前          |
| +1 year    | 1年後       |
| -1 year    | 1年前    |
| Monday      | 次の月曜日       |
| last Monday      |前の月曜日          |
| first day of this month   | 月の最初の日      |
| last day of this month    | 月の最後の日  |
Fortranの累乗計算で虚数が結果として得られるような場合に注意すること

## 結論
虚数が出てくるような累乗の計算の場合、計算前の値がたとえ実数であるとしても
計算前の値を虚数(e.g. $ a+0i $)のように書き換えてから累乗の計算を行わないと、
結果として$ NaN+0i $という**通常欲しくないような値**が得られる

## 例

- $ \sqrt{-100} $ の計算
  → このとき $ \sqrt{-100} = 0+10i $ という結果が[(数学的には)得られるはず](https://www.google.com/search?q=sqrt(-100)&oq=sqr)  
  しかしFortranでは-100を例えばreal(8)の変数$x$として格納している状態で  
  ```Fortran
  print *, x ** 0.5
  ```
  を計算すると$ NaN+0i $ が結果として得られてしまう

  つまりキャストしてから演算しないと計算前の変数の型の下で計算してしまう

  解決策としては[型変換関数](https://docs.oracle.com/cd/E19205-01/820-1201/6ncsv9o38/index.html)を用いるか別の型の変数に代入して計算をするかのどちらかをすればよい

## 検証

- コンパイラ
  - ifort (IFORT) 19.0.5.281 20190815
  - GNU Fortran (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36)
- プログラム  

```Fortran:main.f90
program main
    implicit none
    real(8):: minus
    complex*16:: minus_cmp, ans
    ans = 0; minus = -100; minus_cmp = -100  ! Initialization
    ans = minus_cmp**5.0d-1  ! √-100
    print *, "complex", ans  ! Complex*16を使って計算
    ans = minus**5.0d-1      ! √-100
    print *, "real   ", ans  ! Real*8を使って計算
end program main
```

- 結果(ifort)

```sh
ifort main.f90 && ./a.out
 complex (0.000000000000000E+000,10.0000000000000)
 real    (NaN,0.000000000000000E+000)
```

- 結果(gfortran)

```sh
gfortran main.f90 && ./a.out 
 complex (  6.1232339957367673E-016,  10.000000000000002     )
 real    (                      NaN,  0.0000000000000000     )
```

一度complex\*16にしてから $ \sqrt{-100} $を計算するのとreal\*8で計算するのでは結果が異なり、  
数学的にはcomplex\*16で計算したほうが正しい結果を与えることが確認できた!

## 感想

虚数が出てくる計算には気を付けよう!!
【JavaScript関数ドリル】初級編のfill関数の実装アウトプット

## fill関数の課題内容

_.fill関数を自分で実装する課題。
https://lodash.com/docs/4.17.15#fill

「課題内容」/「解説動画」/「解答例」を確認したい場合は、以下リンク先のページを参照。
https://js-drills.com/blog/fill/


## 課題に取り組む前の状態

- 解答例を見なくてもできるか自信がなかった。


## 課題に取り組んだ後の状態

- 解答例とは違う部分があるが、このままで良いかと判断。

## fill関数の実装コード（答えを見る前）
```javascript
function fill(array, value, start = 0, end = array.length) {
    for (let i = start; i < end; i++) {
        array[i] = value;
    }
    return array;
}
```

## fill関数の実装コード（答えを見た後）
```javascript
// 同じ
```
【JavaScript関数ドリル】初級編のflatten関数の実装アウトプット

## flatten関数の課題内容

_.flatten関数を自分で実装する課題。
https://lodash.com/docs/4.17.15#flatten

「課題内容」/「解説動画」/「解答例」を確認したい場合は、以下リンク先のページを参照。
https://js-drills.com/blog/flatten/


## 課題に取り組む前の状態

- 解答例を見なくてもできるか自信がなかった。


## 課題に取り組んだ後の状態

- なんとか処理結果がサンプル処理結果と同じにはなるように実装したものの自分のコードが腑に落ちない状態だった。
- Array.isArray()という便利なものがあることを改めて認識した。

## flatten関数の実装コード（答えを見る前）
```javascript
function flatten(array) {
    const newArray = [];
    for (let i = 0; i < array.length; i++) {
        if (typeof (array[i]) === "object") {
            newArray.push(...array[i]);
            } else {
            newArray.push(array[i]);
        }
    }
    return newArray;
}
```

## flatten関数の実装コード（答えを見た後）
```javascript
function flatten(array) {
    const newArray = [];

    for (let i = 0; i < array.length; i++) {
        if (Array.isArray(array[i])) {
            newArray.push(...array[i]);
        } else {
            newArray.push(array[i]);
        }
    }
    return newArray;
}
```
ReactのビルドがWeb Server for Chromeで動かない場合

# 困ったこと

Reactで書いたコードを諸事情でWeb Server for Chromeで動かそうとしていた時のこと。
```npm run build```でビルドしたものを配置すると、トップページは開けるが画面遷移ができなかった。
正確にはLinkタグでの遷移はできるがReact-BootstrapのNavDropdown.Itemのhrefでは404になった。
要はAタグやURLの直リンクでNot Foundになってしまう。

# 対処方法
「Show Advanced Options」を開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966654/4009a6d7-81fd-b0d3-d33c-e1dd14c6828a.png)

「Enable mod-rewrite（for SPA）」を選択状態にする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/966654/22c89e45-2904-27be-def3-6784f36638f9.png)

この2ステップになかなか気づかずハマった。。。
Reactに限らずAngularとかSPAなら同じなんじゃないかと思う。

# 参考
[Reactで直接URLをたたくと404になる時の対応](https://qiita.com/yakipudding/items/78e68ef31e55f559c0dc)
access2000の作法 その38

# 概要
access2000の作法、調べてみた。
http get、やってみた。

# http_getボタンを作る手順。
- menuフォームを右クリック。
- デザインビューを開く
- ボタンを設置
- ウィザードが開く	キャンセル
- プロパティシートを開く
- イベントを開く
- クリック時、コードビルダーを開く
```
Private Sub コマンド68_Click()
    MsgBox http_get("https://qiita.com/api/v2/users/ohisama@github/items?page=1&per_page=5")
End Sub

Function http_get(URL As String)
    Dim obj As Object
    Set obj = CreateObject("MSXML2.XMLHTTP")
    obj.Open "GET", URL, False
    obj.Send
    Debug.Print obj.responseText
    http_get = obj.responseText
End Function
```
- フォームを閉じる
- 保存する


以上。
【UiPath】モダンデザインでのExcel操作系のアクティビティを使ってみた②


# はじめに

:::note info


この投稿はモダンデザインで使用可能なパッケージExcel ModernのアクティビティをStudioで使用してみた第2弾となります。
今回は「最初/最後のデータ行を検索」アクティビティを使用してみたいと思います

実行環境は以下の環境で行っております
UiPath Studio 2021.10.4 (Community License、UIAモード：モダンデザイン）
:::

# ■最初/最後のデータ行を検索
<font color=blue>(UiPath.Excel.Activities.Business.FindFirstLastDataRowX)</font>
このアクティビティは指定したシートや範囲のデータ開始行やデータ最終行or最初の空白行を取得してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/b38c4ef0-4c4c-b0c3-512f-6adfa72e3cdf.png)

今回は一覧.xlsxというファイルの３月シートのデータ開始行・データ最終行を取得していきたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/7cc12aff-ed5b-becc-9ee1-8ee08de1e2e6.png)

①「<b><font color="blue">Excelプロセススコープ</b></font>」もしくは、「<b><font color="blue">単一の Excel プロセス スコープ</b></font>」内に「<b><font color="blue">Excelファイルを使用</b></font>」アクティビティを設置します。

②「<b><font color="blue">Excelファイルを使用</b></font>」アクティビティに読み込みを行うExcelファイルのパスを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/7a516f47-7aee-d925-3418-84cf4edd42ac.png)
③「<b><font color="blue">Excelファイルを使用</b></font>」アクティビティ内の実行へ「<b><font color="blue">最初/最後のデータ行を検索</b></font>」を設置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/c615f951-a252-c566-d073-c15aed92b95a.png)

④ソース(参照先範囲)の設定を行います。
ソースの右端の＋マークを押してExcel⇒シート名の順番に選択します。
※今回はシート名指定を行いましたが、範囲指定など細かく指定も出来ますので試してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/8619c760-1072-310e-02c8-a1ef8c4e0ba5.png)

:::note info
先頭行をヘッダとするがデフォルトで設定されているため、
先頭行をヘッダーとして設定したくない場合はチェックを外してください。
:::

⑤次は列名を指定します。
ここには開始行・最終行を取得したい列名を設定します。
今回は参照先の列名として表の注文日を設定しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/2daba35f-dff4-a6f6-ebe2-40159e95b99d.png)
⑥次に最後の行として設定項目を指定します。
　データ最終行か最初の空白行か、取得したい内容によって指定内容を設定します。
　<font color="red">※デフォルトは「入力されている最後の行」となっています</font>
　・データの最終行を取得したい⇒「<b><font color="blue">入力されている最後の行</font></b>」
　・最初の空白行を取得したい　⇒「<b><font color="blue">最初の空の行</font></b>」
　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/404d1106-0d8a-158c-40da-4c6e95720b37.png)
⑦次に取得した結果を格納する変数を設定します。
　今回は両方取得したいので両方に変数を設定しています。
・開始行を取得したい場合は「<b><font color="blue">最初の行の番号を保存</font></b>」に変数を設定
・最終行を取得したい場合は「<b><font color="blue">最後の行の番号を保存</font></b>」に変数を設定
ここまでで最初/最後のデータ行を検索アクティビティの設定は完了です。

⑧最後に取得した結果を確認してみましょう。
今回は出力結果を確認するためにメッセージボックスに結果を出力しています。
それでは実行してみましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/d26d2ac0-9803-aac6-ea95-39db399c7f93.png)
正しくデータの開始行・最終行が取得出来ています。
因みに設定を「最初の空の行」に変更して実行すると以下の様な結果となりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482005/c9d4cc70-be83-31eb-b742-713e114d6c48.png)


#おわりに
今回は「最初/最後のデータ行を検索」」について記載いたしましたがいかがでしたでしょうか。
他のアクティビティにも順次触れていこうと思います。
閲覧いただき有難うございました。
【JavaScript関数ドリル】初級編のhead関数の実装アウトプット

## head関数の課題内容

_.head関数を自分で実装する課題。
https://lodash.com/docs/4.17.15#head

「課題内容」/「解説動画」/「解答例」を確認したい場合は、以下リンク先のページを参照。
https://js-drills.com/blog/head/


## 課題に取り組む前の状態

- 解答例を見なくてもできそうだと思った。


## 課題に取り組んだ後の状態

- シンプルすぎて、関数を書くほどの処理でもないので、何かしら見逃しているのかと気になったが、解答例と同じなので安心した。

## head関数の実装コード（答えを見る前）
```javascript
function head(array) {
    return array[0];
}
```

## head関数の実装コード（答えを見た後）
```javascript
// 同じ
```
【JavaScript関数ドリル】初級編のindexOf関数の実装アウトプット

## indexOf関数の課題内容

_.indexOf関数を自分で実装する課題。
https://lodash.com/docs/4.17.15#indexOf

「課題内容」/「解説動画」/「解答例」を確認したい場合は、以下リンク先のページを参照。
https://js-drills.com/blog/indexOf/


## 課題に取り組む前の状態

- 解答例を見なくてもできそうだと思った。


## 課題に取り組んだ後の状態

- 解答例はfromIndexが負の数の場合の処理を別途書いていないようなので、その辺り、自分の書いたコードでよいのか判断に悩みました。(※Lodashのページには、”If fromIndex is negative, it's used as the offset from the end of array.”とあったため)

## indexOf関数の実装コード（答えを見る前）
```javascript
function indexOf(array, value, fromIndex = 0) {
    if (fromIndex < 0) {
        for (let i = array.length + fromIndex; 0 <= i; i--) {
            if (array[i] === value) {
                return i;
            }
        }
        return -1;
    }

    for (let i = fromIndex; i < array.length; i++) {
        if (array[i] === value) {
            return i;
        }
    }
    return -1;
}
```

## indexOf関数の実装コード（答えを見た後）
```javascript
// 同じ
```
【JavaScript関数ドリル】初級編のinitial関数の実装アウトプット

## initial関数の課題内容

_.initial関数を自分で実装する課題。
https://lodash.com/docs/4.17.15#initial

「課題内容」/「解説動画」/「解答例」を確認したい場合は、以下リンク先のページを参照。
https://js-drills.com/blog/initial/


## 課題に取り組む前の状態

- 解答例を見なくてもできそうだと思った。


## 課題に取り組んだ後の状態

- 解答例は引数の配列を一旦新しい配列にコピーし、その新しい配列からpop関数で最後の値を取り除いている点が、自分の解答と主に異なる点で、その方が早く処理できそうなので参考になった。

## initial関数の実装コード（答えを見る前）
```javascript
function initial(array) {
    const newArray = [];
    for (let i = 0; i < array.length - 1; i++) {
        newArray.push(array[i]);
    }
    return newArray;
}
```

## initial関数の実装コード（答えを見た後）
```javascript
function initial(array) {
    const newArray = [...array];
    newArray.pop();
    return newArray;
}
```