OmniAICreator/Qiita-1.07M huggingface dataset:
Oracle LiveLabsの本編に入る前につまずくポイントについて

<img width="700" src="https://i.ytimg.com/vi/IpUuoOcpgho/maxresdefault.jpg">



# はじめに

https://apexapps.oracle.com/pls/apex/r/dbpm/livelabs/run-workshop?p210_wid=3005&p210_wec=&session=105141420992423

DBA Essentials - Backup and recovery operations for Oracle Database 21c

以上のLiveLabsでDBA GOLDの内容(バックアップ・リカバリ)を実際に実行して学習しました。
が、本編に入る前に設定でつまづいた点がいくつかあり、他にもここでつまづく人が多いのではないかと思い、記事を書くことにしました。

# 設定のポイント

自分なりのポイントを４点にまとめました。

## ポイント①
"backup-and-recovery-operations-prerequisities.zip" 
以上のzipファイルをダウンロードをする時に「Permission denied」という権限に関するエラーが出たので、一時的に以下の様に対処しました。

「Permission denied」というエラーは権限不足によるエラーなので、権限を与えます

```
chmod 777 /opt/oracle/product/21c/dbhome_1/bin

chmod 777 /opt/oracle/product/21c/dbhome_1/bin/backup-and-recovery-operations-prerequisities
```



## ポイント②

pdb1への接続があるのかどうか確認するのと、tnsnames.oraファイルがどこにあるのか調べるために以下を実行しました。

```
[CDB1:oracle@dbhol:/opt/oracle/product/21c/dbhome_1/bin]$ tnsping pdb1
 
TNS Ping Utility for Linux: Version 21.0.0.0.0 - Production on 07-AUG-2023 16:04:12
 
Copyright (c) 1997, 2021, Oracle.  All rights reserved.
 
Used parameter files:
/opt/oracle/homes/OraDB21Home1/network/admin/sqlnet.ora
 
 
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = dbhol.livelabs.oraclevcn.com)(PORT=1521))(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = PDB1)))
OK (10 msec)
```
pdb1へネットワークがつながっていることが確認出来ました。

tnsanames.oraファイルは以下のディレクトリに存在することもわかりました。
```
/opt/oracle/product/21c/dbhome_1/network/admin/samples
```

```
[oracle@dbhol:~]$ cd /opt/oracle/product/21c/dbhome_1/network/admin/samples
[oracle@dbhol:/opt/oracle/product/21c/dbhome_1/network/admin/samples]$ ls
listener.ora  sqlnet.ora  tnsnames.ora
```





## ポイント③

メッセージやテキストファイルを表示する「less」コマンド。
今回は "backup-and-recovery-operations-prerequisities.sql" というテキストファイルの中身を見る場面でこのコマンドを活用しました。

```
less /opt/oracle/product/21c/dbhome_1/bin/backup-and-recovery-operations-prerequisities//backup-and-recovery-operations-prerequisities.sql 
```

```SQL
alter session set container = pdb1;
CREATE user appuser IDENTIFIED BY mypassword container=current;
grant all privileges to appuser;
connect appuser/<password>@//<hostname>:<port>/<pdbname>
create tablespace oc datafile 'octs.dbf' size 32m;
create table regions (id number(2), name varchar2(20)) tablespace oc;
insert into regions values (1,'America');
insert into regions values (2,'Europe');
insert into regions values (3,'Asia');
commit;
!
mkdir /opt/oracle/oradata/CDB1
exit;
```
"connect appuser/< password >@//< hostname >:< port >/< pdbname >"
の<>の部分を書き換える必要があることが分かりました。

## ポイント➃
viエディタを使ったファイル内容の修正
"backup-and-recovery-operations-prerequisities.sql"　テキストファイルの内容を一部修正します

```
 vi backup-and-recovery-operations-prerequisities.sql
```
ポイント③の
"connect appuser/< password >@//< hostname >:< port >/< pdbname >"
の文を以下の様に修正します

```
connect appuser/mypassword@//dbhol.livelabs.oraclevcn.com:1521/pdb1
```



# まとめ
以上のことを行うと本編に入れました！
LiveLabsの本編に入りたいのに設定に時間がかかってはうんざりですよね。。
自分の備忘録の為にも記事を書いてみました。
今後LiveLabsを活用する人のお役に立てれば幸いです。
Daprをローカル環境下で実行失敗

# Daprが以下のエラーで起動しなくなった
```
WARN[0000] Error processing component, daprd process will exit gracefully  app_id=api instance=TEST scope=dapr.runtime type=log ver=1.11.1
FATA[0000] process component pubsub error: [INIT_COMPONENT_FAILURE]: initialization error occurred for pubsub (pubsub.redis/v1): redis streams: error connecting to redis at localhost:6379: dial tcp 127.0.0.1:6379: connect: connection refused  app_id=api instance=TEST scope=dapr.runtime type=log ver=1.11.1
```


## 起動できなくなった理由
daprは状態をredisにて管理するためredisが必要なのですが、起動していませんでした。
つまりdapr initが上手くいっていなかったようです。


## dapr init し直す
```
dapr unistall 
dapr install
```

一度 uninstallしないとinitできないのでuninstallしてからinstallしなおしてください。
【ChatGPT無】が詳しく説明できるツールを聞いた

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　どうも、カーブミラーです。

　まずは、
　　お気付きかもしれませんけど、
　　　Web版ChatGPTの
　　　　ログイン画面が
　　　　　変わりました。

　アプリ版に
　　似たデザインですね。

　最初、見たときに、
　　間違えて、
　　　アプリを起動したのか
　　　　と思いましたw

　それと
　　中身の使用方法も
　　　変わったのか？
　　　　と戦々恐々に。

　でも、実際には
　　その後は、
　　　まったく変わりなし。
　　　　（ホッ）良かった。

　とりあえずの報告を
　　終わります。
***

　今回は、
　　ChatGPTさんが、
　　　詳しく説明できるツールを
　　　　出してもらいました。

　ChatGPTさんに尋ねれば、
　　ワードやエクセルなどの
　　　使い方を教えてくれることから
　　　　いろんなツールを
　　　　　知っていることが
　　　　　　わかります。

　もちろん、
　　ChatGPTさんの知識は、
　　　2021/9までのものですから
　　　　その内容が古い場合も
　　　　　あります。

　それでも
　　全然、知らないわけでは
　　　ないのですから、
　　　　助言は得られるはずです。

　そんな助言を得るにしても
　　ChatGPTさんが知っている
　　　ツールをこちらが知らなければ
　　　　いい助言は得られない
　　　　　可能性がありますね。

　さて、
　　尋ねてみましょうか。　　　　　

```Text:詳しく説明できるツールについて
User
あなたはワードやエクセルなどのツールをご存知ですよね


ChatGPT
はい、ワードやエクセルなどのツールについて知識を持っています。それらのツールは、文書作成や表計算などのさまざまな作業に役立ちます。何か具体的な質問やお手伝いがあればお知らせください。



User
ほかにあなたが詳しく説明できるツールを教えてください。
箇条書き（説明不要）でお願いします。


ChatGPT
Sure, 以下に詳しく説明できるツールを箇条書きで示します:

- PowerPoint: プレゼンテーション作成ツール。
- Photoshop: デジタル画像編集ツール。
- Illustrator: ベクターグラフィックス作成ツール。
- Visual Studio: ソフトウェア開発環境。
- Unity: ゲーム開発エンジン。
- Blender: 3Dコンテンツ作成ツール。
- Adobe Premiere Pro: 動画編集ツール。
- Sketch: UI/UXデザインツール。
- AutoCAD: コンピュータ支援設計ツール。
- Google Analytics: ウェブサイトのトラフィック解析ツール。
```
　「ほかにもありますか？」と
　　問うと、次から次に、
　　　ツール名を出してくれます。

　でも、ちょっと嘘臭いので、
　　リライトして、
　　　次のように尋ねました。
```Text:ほかにも？
User
ほかにもありますか？
知らなければ、知らないと答えてください。


ChatGPT
申し訳ありませんが、私の知識範囲では上記のツールに関して述べられたものが限界です。他のツールについての情報が必要な場合は、具体的な質問をいただければお答えできるかもしれません。
```
　リライトして良かった。

　とはいえ、
　　これまでのやり取りで、
　　　ほかにも説明をできるツールは
　　　　ある気がします。

　ただ、詳しくはないだけで。

　それも尋ねてみました。
```Text:簡単な説明ができるツールについて
User
詳しくはないけれど、あなたが簡単な説明ができるツールは、どうですか？
知らなければ、知らないと答えてください。


ChatGPT
もちろん、私が簡単な説明ができるツールを以下に示します:

1. WhatsApp: テキストメッセージ、音声通話、ビデオ通話などを送受信できるモバイルアプリ。
2. Google Chrome: Googleのウェブブラウザで、インターネット上のウェブページを閲覧できます。
3. Spotify: 音楽ストリーミングサービスで、幅広い音楽を聴くことができます。
4. Evernote: ノートやリストを作成・整理できるデジタルノートアプリ。
5. Slack: チームコミュニケーションのためのチャットプラットフォーム。
6. Trello: タスクやプロジェクトの管理に使われるオンラインツール。
7. Zoom: オンライン会議やウェビナーを実施できるビデオコミュニケーションツール。

これらのツールに関する基本的な情報はお伝えできます。もし詳細な説明や使い方について知りたい場合は、お気軽にお尋ねください。
```
　このあと、
　　Regenerate responseボタンで、
　　　３回、書き直させましたが、
　　　　基本、同じ内容で、
　　　　　あとは、Windowsの
　　　　　　ツールが
　　　　　　　出てくるだけでした。
***
　私は、
　　これらのツールを
　　　使う機会がないので、
　　　　本当に詳しいのかを
　　　　　検証できません。

　その点は、
　　謝ります。
　　　ごめんなさい。

　みなさんの
　　仕事が捗りますように。
【PlayCanvas】Tween.jsを利用時に「Uncaught TypeError: application.addTweenManager is not a function」が出た場合の対象方法

![1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257048/97d7d446-1327-82a6-dbe3-a2cc497d2aee.png)

PlayCanvasのTween.jsを利用しているプロジェクトで、「Uncaught TypeError: application.addTweenManager is not a function」のエラーが出た場合にはTween.jsを新しいバージョンにアップデートする必要があります。

これは、PlayCanvasエディターとPlayCanvas Engineのバージョンアップにより、過去の[playcanvas-tween](https://github.com/playcanvas/playcanvas-tween)との互換性がなくなった事により発生しています。

リポジトリから新しいTween.jsをコピーする方法か、またはアセットストアからインポートをする方法があります。



#### PlayCanvas Asset Storeを開く
「Tween Animation Library」を選択

![2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257048/eeb0c117-4de6-dacc-1e0d-d1c334fd2060.png)

#### IMPORTをクリック

![3](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257048/361c8a15-f26c-77d2-8246-a1fd02d74b7e.png)


これで、過去のプロジェクトが動くようになるはずです。

詳細と対応はこちらのフォーラムをご覧ください。

- [Editor v1.30.8 and Tween library](https://forum.playcanvas.com/t/editor-v1-30-8-and-tween-library/31357/1)
- [[SOLVED] Tween Manager Error](https://forum.playcanvas.com/t/solved-tween-manager-error/31349)
GitHub Pagesの使い方

## 1. はじめに
今までGitHubは使っていましたが、今回初めてGitHub Pagesを使用しました！
まだ使ったことがない人向けに使用方法をまとめますので、誰かのご参考になればいいなと思います。

## 2. GitHub Pagesとは
自分のPCで作成したWebページをどのようにインターネットで公開していますか？
いくつか公開方法はありますが、その１つとして無料で使える**GitHub Pages**があります。
今から公開方法を説明していきます。

## 3. 公開までの流れ
GitHub Pagesで実際に作業をする前に流れを確認します。
- 準備物
- [ ] HTMLファイル
- [ ] CSSファイル
- [ ] (必要であれば）画像
- [ ] GitHubアカウント

- 流れ
1. Webページを作成する(今回は割愛します)
1. 作成したWebページを「GitHub」にアップロードする
1. GitHub上でPagesの設定を行い公開する

## 4.GitHubのアカウントを作成する
今回は既にアカウントを作成したところから進めます。

## 5. リポジトリの作成
**リポジトリ**とは1つのWebページやアプリケーションなどをGitHub上で管理するためのプロジェクトのようなものです。
リポジトリの作成方法は以下の順です。

### 1) Newボタンを押す
新規リポジトリの作成は緑のボタンから作成！
![スクリーンショット 2023-08-08 8.03.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3474588/6c20c2b5-144c-94ea-0801-508aa484e974.png)


### 2) リポジトリの設定を実施
以下の画像の赤枠の部分を設定していきます。
![スクリーンショット 2023-08-06 22.06.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3474588/7b62633a-fa5a-a565-e334-bd8c5b06af28.png)

1. 任意のRepository nameの入力
※下にavailableと表示されればOK！
リポジトリ名は基本的に何でも大丈夫ですが、ここで設定したリポジトリ名によってこの後公開するWebページのURLが変わってくるため要注意！！
**「アカウント名.github.io」とした場合**
公開URLは `https://アカウント名.github.io` となります。
**上記以外の場合**
公開URLは `https://アカウント名.github.io/リポジトリ名` となります。
今回はリポジトリ名を「GitHub_pages」としたため、`https://tsmog52.github.io/GitHub_pages`となります。


1. **Public**の選択
※PrivateではGitHub pagesの使用ができないため注意
1. 緑の**Create repository**ボタンを選択


## 6. GitHubへHTMLファイルをアップロードする
以下のコマンドから手元のファイルとディレクトリをアップします
```
git init
git add <ファイル名>
git commit -m <コミットメッセージ>
git remote add origin <path>
git push origin main
```


## 7. GitHub Pagesの設定
GitHubにアップロードできたら、pagesを設定していきます。
![スクリーンショット 2023-08-07 7.19.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3474588/c628b3b3-6bb9-227f-3e6d-72a706397b5e.png)
### 手順
1. `setting`を押す
1. `Pages`を押す　　　
※写真のような画面になります
1. Branchの編集
`None`から`main`に変更して`Save`ボタンを押す

ここまでできたらGitHub PagesのURLが発行されます。
`Visit site`ボタンを押す

::: note warn
URL発行に10分程度時間がかかることがあります。
:::

自分の作成したHTMLファイルとCSSが反映されていればOKです！
![スクリーンショット 2023-08-08 6.23.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3474588/38e3cca7-5bdb-210d-f4b0-f6c836278bdd.png)
作成したtest用のページがネット上に公開できました〜〜！

GitHub Pagesの使い方に関する説明は以上です。

## 注意点
### Q.Pagesが表示されない
こんな時はURLを確認してみましょう！！
公開URLは`https://アカウント名.github.io/リポジトリ名`です。

ディレクトリでGitHubにアップロードしているときはディレクトリ名の記載も必要です。
`https://アカウント名.github.io/リポジトリ名/ディレクトリ名/`となります。

### Q.画像が表示されない
GitHubに画像をアップするとこの部分のパスが変わるので、変更する必要があるようです。
詳細は以下の記事をご参照ください。
https://promateblog.com/github-pages-images-display/


## おわりに
今回はGitHub Pagesの使い方について解説してきました。
簡単ではありますが、最後まで読んでいただきありがとうございました。
ブックマーク機能の実装

ブックマーク機能を作る時はマイグレーションファイルを作ります。
以下のコードを使ってファイルを作成する。

```
rails generate migration CreateBookmarks

```

生成されたマイグレーションファイルを以下のような構成にします。

```
class CreateBookmarks < ActiveRecord::Migration[6.1]
  def change
    create_table :bookmarks do |t|
      t.references :user, null: false, foreign_key: true
      t.references :shop, null: false, foreign_key: true
      t.timestamps
    end
  end
end

```

次にブックマーク用のモデルを作成し、ユーザーモデルとショップモデルに関連付けます。

```

class Bookmark < ApplicationRecord
  belongs_to :user
  belongs_to :shop
end

```
```
class User < ApplicationRecord
  has_many :bookmarks
  has_many :shops, through: :bookmarks
end
```

```
class Shop < ApplicationRecord
  has_many :bookmarks
  has_many :users, through: :bookmarks
end
```

そして、次に対象となるpost的位置のコントローラーファイルにbookmarkアクションを作成する。

```
class ShopsController < ApplicationController
  def bookmark
    @shop = Shop.find(params[:id])
    current_user.bookmarks.create(shop: @shop)
    redirect_to @shop
  end
end
```
次に対象のモデルにルーティングを設定します。

```
resources :shops do
  member do
    post 'bookmark'
  end
end
```

次にviewファイルにブックマークボタンを追加します。

```
  <div class="bookmark_btn">
    <%= button_to 'ブックマークする', bookmark_shop_path(@shop), method: :post %>
  </div>
```
applicationコントローラーに current_user メソッドを定義します。これにより、現在ログインしているユーザーを取得できます。

```
  def current_user
    if session[:user_id]
      current_user ||= User.find(session[:user_id])
    end
  end
```

またブックマークボタンを星マークにする方法を記載します。
その場合はGem 'font-awesome-sass'をインストールする必要があります。
以下のコードをGemfileに書いた後、ターミナル上で`bundle install`を実行します。

```
gem 'font-awesome-sass'

```

app/assets/stylesheets/application.cssにimport文を加えます。

```
@import "font-awesome";

```

ブックマーボタンに関するコードを以下のものにすることで、ブックマーボタンを星マークに変えることができます。

```
<div class="bookmark_btn">
  <% if current_user.bookmarks.exists?(shop_id: @shop.id) %>
    <%= link_to bookmark_shop_path(@shop), method: :delete, class: "bookmark-btn" do %>
      <i class="fas fa-star bookmarked"></i>
    <% end %>
  <% else %>
    <%= button_to bookmark_shop_path(@shop), method: :post, class: "bookmark-btn" do %>
      <i class="far fa-star"></i>
    <% end %>
  <% end %>
</div>
```

次は星マークボタンのスタイルを構成するコードを書きます。

```
.bookmark-btn {
  background: none;
  border: none;
  cursor: pointer;
}

.bookmark-btn i {
  color: #ccc ;
}

.bookmark-btn i.bookmarked {
  color: gold;
}
```
これによりviewファイル上で星マークを表示させることができます。
Pyenvでpythonをインストールできたが、is not installedエラーが出た場合の対処

# Pyenvでpythonをインストール失敗した件
## 実行したコマンド
```
$ pyenv install 3.9.12
$ pyenv versions
$ pyenv local 3.9.12
```

ここで、pyenvでpython 3.9.12がインストールされて、切り替えたことを確認できましたが

```
$ pip install black flake8
```
すると、以下のエラーが出ました。
```
pyenv: version `3.9.12' is not installed (set by /Users/xxxx/.python-version)
```

### 対処
pyenvを再インストールします。

1. **pyenvのアンインストール：** まず、現在のpyenvをアンインストールします。ターミナルで以下のコマンドを実行します。
```
$ rm -rf ~/.pyenv
```

2. **pyenvの再インストール：** pyenvを再インストールします。GitHubからpyenvのリポジトリをクローンしてインストールします。以下のコマンドを順番に実行してください。

```
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```

$ リポジトリをクローンしたら、次に以下のコマンドを実行して必要な設定を行います。

```
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc  # .bashrcを使用する場合
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init --path)"' >> ~/.bashrc
$ source ~/.bashrc
```

$ （もしご利用のシェルがbash以外の場合、適切な設定ファイルを編集してください。）

３. **ターミナルの再起動：** ターミナルを再起動して、変更が正しく反映されるようにします。

これらの手順に従ってpyenvを再インストールすることで、環境が整備されるはずです。その後、仮想環境の作成やPythonのインストールを行い、必要なパッケージをインストールしてみてください。
主要スクレイピングサービスのメリット、デメリットについて

それぞれのスクレイピングサービスにはメリットとデメリットがあります。以下にいくつかの主な点を挙げてみます。ただし、これらは一般的な傾向であり、実際の使用ケースによって異なる場合がありますご注意ください。

[**octoparse:**](https://www.octoparse.jp/ "‌")

- メリット:
  - ユーザーフレンドリーなインターフェース:
      - Octoparseは、直感的なドラッグアンドドロップ型のインターフェースを提供しています。コーディングの知識がないユーザーでも、スクレイピングタスクを簡単に設定できます。
  - 多様なウェブサイトに対応:
      - Octoparseはさまざまなウェブサイトのスクレイピングに対応しており、ページネーションやログインなどの一般的なスクレイピングタスクをサポートしています。
  - 自動化とスケジューリング:
      - タスクの実行を自動化し、定期的なスケジュールに基づいてタスクを実行できます。これにより、データの定期的な収集が可能です。
  - データの抽出と整形:
      - Octoparseは抽出したデータを自動的に整形し、CSVやExcelなどの形式で出力できます。データのクリーニングや変換も簡単に行えます。
  - プリビュー機能:
      - タスクを設定する際に、実際のデータをプレビューできる機能があります。これにより、データの取得状況を確認しながらタスクを調整できます。

- デメリット:
  - 制限がある無料プラン:
      - Octoparseには無料プランがありますが、機能や制限があります。より高度な機能を使用したい場合は有料プランが必要です。
  - 高度なスクレイピングには限界:
      - 複雑なスクレイピングタスクや大量のデータを処理する際には、よりプログラミング志向のツールやカスタマイズが必要な場合があります。
  - 一般的なスクレイピングタスクに特化:
      - Octoparseは一般的なスクレイピングタスクに向いていますが、特定のドメインや業界に特化したスクレイピングが必要な場合には、カスタマイズが必要かもしれません。

[**Apify:**](https://apify.com/ "‌")

- メリット:
  - JavaScriptを使用してタスクを定義し、スケジュールや監視が可能。
  - ウェブスクレイピングとデータ処理を統合して実行できる。
- デメリット:
  - 複雑なタスクにはプログラミングスキルが必要かもしれない。


[**Import.io**](http://Import.io "‌")**:**

- メリット:
  - 非プログラマーにも使いやすいインターフェース。
  - ウェブページからデータを抽出してAPIとして利用可能。
- デメリット:
  - 比較的単純なスクレイピングタスクに特化しており、複雑なタスクには向かないかもしれません。

[**WebHarvy**](https://brightdata.com/products/scraping-browser "‌")**:**

- メリット:
  - ページネーションやログインなどの一般的なウェブスクレイピングタスクをサポート。
  - データをCSVやExcelなどの形式で出力可能。
- デメリット:
  - 複雑なタスクには対応しきれない場合がある。
  - データの整形や変換に限界があるかもしれない。

[**Zyte(formerly Scrapinghub):**](https://www.zyte.com/ "‌")

- メリット:
  - 大規模なデータのスクレイピングに適している。
  - Scrapyフレームワークを基にしており、柔軟なカスタマイズが可能。
- デメリット:
  - 利用料金が他のツールよりも高くなることがある。


[**Apify:**](https://apify.com/ "‌")

- メリット:
  - JavaScriptを使用してタスクを定義し、スケジュールや監視が可能。
  - ウェブスクレイピングとデータ処理を統合して実行できる。
- デメリット:
  - 複雑なタスクにはプログラミングスキルが必要かもしれない。

各サービスの詳細な特徴や制約を理解し、プロジェクトのニーズに合ったものを選択することが重要です。
laravelでcsvファイルを中身の値ごとに分割した後、zipにまとめてダウンロードさせたい

# はじめに
csvファイルをカラムの値ごとに分けたい時ってありますよね。
csvを分割した後、zipにまとめて、ダウンロードまでさせる処理を書いてみました。
- zipを生成するのに使ったライブラリ
    - laravel-zipstream
      - github: https://github.com/stechstudio/laravel-zipstream


## 今回やること
- id(id),name(名前),age(年齢),address(都道府県)の4つのカラムでできたcsvファイルをaddress(都道府県
名)ごとに分けてそれぞれcsvファイルを生成したのち、zipファイルにまとめてダウンロードさせる
- 画面、ルーティングなどは省略しますm(__)m
- バリデーションもしてません

#### 用意したcsvファイル
- id,name,age,addressの4つのカラムでできたcsvファイル(25行くらい)
↓↓ こんな感じ
![Screen Shot 2023-08-08 at 9.56.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3300489/980aab29-faa8-fc11-7df6-0f741db76f59.png)

#### laravel-zipstreamの準備
- laravel-zipstreamのインストール
```
composer require stechstudio/laravel-zipstream
```

#### 今回実装した処理(コントローラ)
```
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use STS\ZipStream\ZipStreamFacade as Zip;

class ZipController extends Controller
{
    public function __invoke(Request $request)
    {
        $csvFile = $request['csvfile'];

        if ($csvFile->getClientOriginalExtension() !== "csv") {
            throw new \Exception('csvファイルを入れてくれ');
        }

        if ($csvFile->isValid()) {
            $csvData = file_get_contents($csvFile->getPathname());

            $rows = explode("\n", $csvData);

            // カラムを取得する
            $header = str_getcsv(array_shift($rows));

            $columnToFetch = 'address';

            $filePaths = [];

            foreach ($rows as $row) {
                $data = str_getcsv($row);

                $filePath = 'public/csv/' . $data[array_search($columnToFetch, $header)] . '.csv';

                if (!Storage::exists($filePath)) {
                    $newHeader = implode(",", $header);
                    Storage::put($filePath, $newHeader);
                }

                Storage::append($filePath, $row);
                $filePaths[] = storage_path('app/' . $filePath);
            }

            $uniqueFilePaths = array_unique($filePaths);

            $zipFile = 'download.zip';
            $destinationDirectory = storage_path('app/public/zip');
            // ここでzipファイル生成して指定した場所に保存してます
            Zip::create($zipFile, $uniqueFilePaths)->saveTo($destinationDirectory);

            return Storage::download('public/zip/download.zip', 'download.zip', []);
        }

        return 'エラーがおきた';
    }
}

```

これでダウンロードされたら成功づえす。

:::note info
注意したいところ
ファイル名が日本語の時envに設定しないと狙った挙動にならないことがあったので、ファイル名が日本語の時は下記の値をenvに設定しましょう
:::
```
ZIPSTREAM_FILE_SANITIZE=false
```

### おわりに
- 他にもっといい方法があれば教えてください!
- laravel-zipstream は結構簡単に使えて便利なのでzip生成したい時はおすすめです。
[SwiftUI] [any Protocol] な配列の List を表示する方法

## 概要 

どういうことかというと、以下のような配列を `List` で表示させる方法を本記事では紹介したいと思います。 

```swift 
protocol Animal: Identifiable where ID == UUID {
    var id: Self.ID { get }
    var name: String { get } 
}


struct Human: Animal {
    let id: UUID = .init()
    let name: String
}

struct Dog: Animal {
    let id: UUID = .init()
    let name: String
}

struct Cat: Animal {
    let id: UUID = .init()
    let name: String
}

// これ↓
let animals: [any Animal] = [
    Human(name: "タロウ"),
    Human(name: "ジロウ"),
    Dog(name: "ハチ"),
    Dog(name: "ポチ"),
    Cat(name: "ふてニャン"),
    Cat(name: "クロ")
]
```


## やり方 

- [`case let ... as SomeType`](https://qiita.com/toya108/items/f33d9939fc2a6e0d1d4d) 構文を使って条件分岐させます。

https://qiita.com/toya108/items/f33d9939fc2a6e0d1d4d


- Swift の `case ...` 系の書き方は `if` / `guard` でも使用可能です。

```swift

// MARK: - case let ... as SomeType
// switch 文だとこう
switch hoge {
case let fuga as SomeType:
    return
default:
    break
}

// guard 文だとこんな感じ 
guard case let fuga as SomeType = hoge else { return }


// MARK: - case let .some(...)
// switch 文だとこう
switch hoge {
case .some(let fuga):
    return
default:
    break
}

// guard 文だとこんな感じ
guard case let .some(fuga) = hoge else { return }
// もしくは 
guard case .some(let fuga) = hoge else { return }
```


- 以下、実際のコードです。

```swift 
import SwiftUI
import PlaygroundSupport

(中略)

let animals: [any Animal] = [
    Human(name: "タロウ"),
    Human(name: "ジロウ"),
    Dog(name: "ハチ"),
    Dog(name: "ポチ"),
    Cat(name: "ふてニャン"),
    Cat(name: "クロ")
]

struct ContentView: View {
    var body: some View {
        List(animals, id: \.id) { animal in
            if case let human as Human = animal {
                HStack {
                    Text("🧍")

                    Text(human.name)
                }
            }

            if case let dog as Dog = animal {
                HStack {
                    Text("🐶")

                    Text(dog.name)
                }
            }

            if case let cat as Cat = animal {
                HStack {
                    Text("🐱")

                    Text(cat.name)
                }
            }
        }
    }
}

PlaygroundPage.current.setLiveView(ContentView())
```

## 実際のスクショ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224212/f6e1e1d1-9505-b361-c9ea-4e66746eab5b.png)


## 最後に 

間違い、ご指摘事項等あればお気軽に編集リクエスト/コメントいただければ幸いです☺️
FortiGateのアップデート方法

業務でFortiGateのアップデートの手順書を作成しました。
あまり需要はないですが、備忘録としてまとめておきます。

# 手順
1. [アップデートの推奨パス](https://docs.fortinet.com/upgrade-tool) にアクセスする。
1. 下記の項目を入力し、「GO」をクリックする。

   - Current Product:アップデートする FortiGate の製品。今回は FortiGate-60F をアップデートする。
   - Current FortiOS Version:現在のバージョン。今回は 6.0.17 とする。
   - Upgrade to FortiOS Version:アップグレードするバージョン。今回は 7.0.12 とする。
   
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/b1c3e7b8-0941-c88e-14f9-ef5c49b3e5b8.png)

1. アップグレードの推奨パスが表示される。このバージョンの順番にアップグレードする。
   ※6.0.17 から 7.0.12 にいきなりアップグレードすると、動作不良などを起こす可能性があるため、必ずこの順番でアップグレードすること。
![image-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/b3d1d15a-b66a-d11b-520d-d787925e108a.png)

1. FortiGate にログインする。
1. 画面左のメニューから「システム」→「ファームウェア」をクリックする。
    ![image-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/339b691d-c4dd-97e7-eb1b-3551bd91c93e.png)
1. 手順 3 で確認したバージョンを選択し、「設定のバックアップとアップグレード」をクリックする。(今回は 6.2.15)
![image-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/7fc83f1b-c70d-37be-22f9-e337111f2dc3.png)

1. 「続ける」をクリックする。
   ※config ファイルがダウンロードされるが、アップグレードした後にバージョンを戻す際に使用する。
    ![image-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/6141c052-4fb0-3b48-8f88-b8bb7f2d1d58.png)

1. アップグレードが完了するまで待つ。
   ※アップグレードに失敗する。そもそもアップグレード出来ない場合は、ライセンス管理サーバに通信できていない可能性があるため、しばらく時間を空けて再度試すこと。

1. 再度、FortiGate にログインする。

1. セットアップ画面が表示された場合は、「開始」をクリックする。
   ![image-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/c056a6e5-5584-9bad-a830-2ceba994f9da.png)

1. 「デフォルトのホスト名を使用」をクリックし、「OK」をクリックする。
   ![image-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/9db1b6b6-fcb8-448f-bbbf-1ffdeaa6f990.png)

1. 画面右上のユーザをクリックし、バージョンを確認する。(6.2.15 になっているため OK)
![image-7 - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3314839/782179b0-db47-346b-31a4-ead7e2e993d5.png)

# まとめ
FortiGateのアップデート手順をまとめました。
今回は6.0.17から7.0.12に上げることを想定し、6.0.17→6.2.15→6.4.14→7.0.12の順番にアップデートする必要がありますが、同じことを３回繰り返すだけなので、6.0.17→6.2.15の手順だけを記載しました、
Flaskを使って簡単なtodolist appを作る

app.py

```python
from flask import Flask, render_template, request, redirect
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///todo.db'
db = SQLAlchemy(app)

class Todo(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    task = db.Column(db.String(255))
    done = db.Column(db.Boolean, default=False)

@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        task = request.form['task']
        new_todo = Todo(task=task)
        db.session.add(new_todo)
        db.session.commit()

    todos = Todo.query.all()
    return render_template('index.html', todos=todos)

@app.route('/delete/<id>')
def delete(id):
    todo = Todo.query.get(id)
    db.session.delete(todo)
    db.session.commit()
    return redirect('/')

if __name__ == '__main__':
    app.run(debug=True)
```

index.html
```html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>To-Do List</title>
</head>
<body>
    <h1>To-Do List</h1>
    <form action="/" method="post">
        <input type="text" name="task" placeholder="Add a new task">
        <input type="submit" value="Add">
    </form>
    <ul>
        {% for todo in todos %}
            <li>
                {{ todo.task }}
                <a href="/delete/{{ todo.id }}">Delete</a>
            </li>
        {% endfor %}
    </ul>
</body>
</html>
```
【Windows11起動エラー】blinitializelibrary failed 0xc00000bb

![hqdefault.jpg](https://www.pc-fixs.com/report/wp-content/uploads/2019/07/DSC_0018.jpg)

## 状況 
Windows11を起動したところ、ブランドロゴ表示後に画面左上に「blinitializelibrary failed 0xc00000bb」という文字が表示されてOSが起動しない。 

 - PC起動後、DELを押してBIOSに入ることはできる。
 - PC起動後、F11を押してブートメニューに入ることはできる。
※ motherboard : MSI MPG Z590 GAMING EDGE WIFI

~~~:エラー文
blinitializelibrary failed 0xc00000bb
~~~

## 解決策
グラフィックボードを取り外し、画面出力をオンボードに変更する。

## 経緯
blinitializelibrary failed 0xc00000bbのエラーについてググってもあまり情報がありません。
出てくる情報はBIOSの初期化不良等のため、OSの修復かクリーンインストールの必要があるなどという深刻なエラーであるというものばかりでした。
結局、原因がGPUにあったということ以外は分かりませんが一旦オンボードで画面出力して通常どおりOSが起動しました。もう一度グラフィックボードへケーブルを差し替えて再起動するとグラフィックボードから出力が可能となりました。
（BIOSのgraphicsの部分が自動的に変更されている可能性があるので、再起動時に念のためBIOSを確認してください）

最初に1度だけ「GPU---」という文字が出てきましたが一瞬だったため読み取ることができませんでした。

## 試してダメだったこと
 - 強制終了して再起動（無限ループ）
 - ケーブル類をすべて抜いて1分間放置
 - グラフィックボードの差し直し
CircleCIでのパイプライン構築ではまったところと原因を共有

## 背景

現在開発にかかわっているプロダクトの機能開発において、マイグレーション処理が必要なPRのマージをするときにステージング環境へのマイグレーション作業を自動でおこないたかった

## アサインされた当時の計画

1. 指定フォルダにマイグレーション用のファイルが追加されたことを検知する
2. gcloudコマンドでsecret Managerからデータベースにパスワードを取得
3. ステージング環境のCloudSQLに接続するためにcloudsql-proxyを起動（このときはdocker runで最新のコンテナイメージを取得し、軌道までを行っていた）
4. sql-proxyのコンテナを通じてcloud sqlに接続を試みるが失敗

## 詰まったところ1：CircleCI上でcloudsql-proxyの起動がうまく行かなった。
[公式ドキュメント](https://cloud.google.com/sql/docs/sqlserver/connect-docker?hl=ja)を参考に以下のコマンドを実行するJobを作成しても `Unable to load config file: error="read /config/config.json: is a directory"`みたいなエラーでCIが落ちていた

```
docker run -d \
  -v <PATH_TO_KEY_FILE>:/path/to/service-account-key.json \
  -p 127.0.0.1:1433:1433 \
  gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.6.0 \
  --credentials-file /path/to/service-account-key.json <INSTANCE_CONNECTION_NAME>
```

### 原因と解決策
service-account-key.jsonで指定していたものが間違っていたのかと試行錯誤するもエラーは変わらず。

たどり着いたのが[CircleCIのドキュメント](https://circleci.com/docs/ja/building-docker-images/#mounting-folders)で、どうやらフォルダーのマウントに問題があったらしい。

以下のように変更することで起動に成功した。
```
- run: |
    # 設定ファイルとボリュームを保持するダミー コンテナを作成します。
    docker create -v /cfg --name configs alpine:3.4 /bin/true
    # このボリュームに設定ファイルをコピーします。
    docker cp /path/to/service-account-key.json configs:/cfg
    docker run -d \
      --volumes-from configs \
      -p 127.0.0.1:1433:1433 \
      gcr.io/cloud-sql-connectors/cloud-sql-proxy:2.6.0 \
      --credentials-file /cfg/service-account-key.json <INSTANCE_CONNECTION_NAME>
```

## 詰まったところ2：cloudsqlに接続できない
1つ目の問題が解決したところで次に行うのはデータベースへの接続だ。
参考にしたのは以下の記事。
[CircleCIでCloud SQLに接続した時の問題と解決策 - Qiita](https://qiita.com/kouares/items/666c4b2161ebfa4c8321)

自分がまだCircleCIになれていないのもあって、とりあえずコピペでやってみたものの、connection refusedがつづいた


### 原因調査（まだ解決まで至っていないので参考になりそうなものをリストアップしていく）
- https://circleci.com/docs/ja/building-docker-images/#separation-of-environments
    - dockerizeで指定するホストがあやしいかも
    - CircleCI上でのdockerの扱いを理解する必要がある
- https://circleci.com/docs/ja/using-docker/#using-multiple-docker-images
  - 複数のコンテナイメージを並べた場合、最初のモノをプライマリコンテナとする
  - ふたつめにDBなどを指定しているとMYSQLの場合は localhost:3306へのバインドを試みる
  - 同じイメージをリストアップするときはそれぞれのimageになまえをつけることで競合を回避できる

## 参考
- [Cloud SQL Auth Proxy Docker イメージを使用した SQL サーバー クライアントの接続  |  Cloud SQL for SQL Server  |  Google Cloud](https://cloud.google.com/sql/docs/sqlserver/connect-docker?hl=ja)
- [Docker コマンドの実行手順 - CircleCI](https://circleci.com/docs/ja/building-docker-images/)
- [CircleCIでCloud SQLに接続した時の問題と解決策 - Qiita](https://qiita.com/kouares/items/666c4b2161ebfa4c8321)
MacBook Pro に Homebrew をインストールする

# はじめに
２０２３年８月時点、クラウドエンジニアを目指しAWSの学習を進めています。
今まではCloud9を使って学習を進めていたのですが、毎回 ブラウザからCloud9を開きEC2が起動するのを待つのが少し面倒になってきたので（パッと浮かんだ案をパッと試したい）、ローカルに開発環境を構築することにしました。
手始めに、**Homebrew**をインストールしましたので、その手順をまとめます。

# 私の環境
| 項目 | 環境 |
|:-:|:-:|
| PC | MacBook Pro |
| チップ | Apple M1 Pro |
| メモリ | 16 GB |
| macOS | Ventura 13.4.1 (c) |

# Homebrewとは
**Homebrew**はmacOS用パッケージマネージャーです。
パッケージマネージャーを使わなくてもパッケージをインストールすることは可能ですが、最近はパッケージマネージャーを使うのが主流のようです。
開発する場合、いろいろとパッケージをインストールしますが、それらを一つ一つ自分で管理するのは地味に大変なのでパッケージマネージャーにまるっと任せちゃいましょう。

https://brew.sh/index_ja

# Homebrewのインストール
Homebrewのサイトに記載されている以下コマンドをターミナルに貼り付けて実行してください。
`$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"`

インストールは正常に終了しましたが、１つだけ`Warning`が出ていました。
![スクリーンショット 2023-08-08 9.33.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455793/2687db05-3582-818c-75e9-e472d8fd3c0b.png)
>警告: /opt/homebrew/bin が PATH にありません。
>   Homebrew 用にシェルを設定する方法についての説明
>   詳細については、以下の「次のステップ」セクションをご覧ください。

翻訳したところ、「PATHに`/opt/homebrew/bin`の指定がなく、'Next Steps'セクションを見てね」とのことなので、ログに出力されていた'Next Steps'セクションを確認。

![スクリーンショット 2023-08-08 9.48.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455793/3815dbca-1d3d-4b95-4273-2cb52c625d00.png)

> ==> 次のステップ:
> - ターミナルで次の 2 つのコマンドを実行して、Homebrew を PATH に追加します。
>      (echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/taka/.zprofile
>      eval "$(/opt/homebrew/bin/brew shellenv)"
> - 始めるには brew help を実行してください
> - その他のドキュメント:
>      https://docs.brew.sh

「ターミナルで２つのコマンドを実行して、HomebrewをPATHに追加してね」とのことなので、コマンドを実行
`$ (echo; echo 'eval "$(/opt/homebrew/bin/brew shellenv)"') >> /Users/taka/.zprofile`
`$ eval "$(/opt/homebrew/bin/brew shellenv)"`

最後に動作を確認するためにヘルプを開いてみます。
![スクリーンショット 2023-08-08 9.50.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3455793/1905a20b-56d0-c736-4c8f-1b99914b0203.png)

ヘルプを開くことができました。

# まとめ
Homebrewのインストール手順は以上になります。

Homebrewのサイトにインストールのためのコマンドは記載されていますが、'Next Steps'セクションのコマンド実行までは記載されていないので忘れずに実行しましょう。

少しでもみなさんの参考になれば幸いです。
Oracle Analytics Cloud：駅別乗車人員数を地図で可視化する

# はじめに
データ分析をするにあたり、データを地図に配置することで理解が深まることがあります。
地図上のデータの発生箇所にポイントするか、データの発生エリアを塗りつぶすか、どちらかの手法を取ることが多いと思われます。
今回は、Oracle Analytics Cloud（**OAC**）と容易に入手できるデータを使用して、データの発生箇所にポイントする方法を試してみます。

# 使用するデータ
JR東日本が公開している、駅別の乗車人員数データを使用します。

https://www.jreast.co.jp/passenger/index.html

2022年度のトップ10駅のデータを加工して、Excelデータ化しました。
駅の住所は、Wikipediaを参照しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/b8a5a58f-8823-6926-f295-042c93e21f0f.png)
出典：JR東日本 各駅の乗車人員 2022年度 から上位10駅

# 住所から緯度・経度を求める
データを地図上にポイントするので、各駅の緯度と経度の情報が必要です。
ところが、JR東日本の公開データにはそれがありません。
住所を調べるのに Wikipedia を利用させていただきましたが、緯度・経度の情報もそこに記載されているので、それを使わせてもらっても良いのですが、無料で使用できるジオコーディング・サービスを利用しても良いかも知れません。

:::note
住所から緯度・経度へ変換することをジオコーディングといいますが、これを無料で実施してくれるサービスが世の中にはあります。
興味があれば調べてみてください。
:::

緯度・経度付きのデータができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/ae3f2ec6-fc1a-a99d-bb25-3f1d6385da1f.png)

# ワークブックの作成
では、早速作成したデータ（Excelファイル）を使ってワークブックを作っていきます。

## データセットの作成
OACにログインし、ExcelファイルをOACのホームを表示しているブラウザに直接ドラッグ＆ドロップします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/b8b1f82b-cf08-d753-4fe8-7c7ef283daf8.png)
ファイルを読み込んで内容が表示されるので、「ビジュアル化」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/67d79142-2d1a-aec6-d926-8586101df984.png)

## マップビューの作成
新規にワークブックが作成されます。
緯度と経度にあたる列をコントロールキーを押しながら同時に選択して、右クリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/cc763ad0-234b-963e-f6f2-01c6053dcf36.png)
「ビジュアライゼーションの選択」をクリックして、「マップ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/a9ecd00c-a2b9-d2f8-4c50-7ea6fa9a91d1.png)
「カテゴリ (場所)」に緯度と経度を配置します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/72d73021-8b3b-d331-599f-806c4a74feac.png)
「合計」（乗車人員数）を「サイズ」にドラッグ＆ドロップして、円のサイズに反映させてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/d9ac35db-e67a-2284-916a-e034a95b95b2.png)
マップ・ビューのプロパティを表示します。
背景マップを「OpenStreetMap」にして、デフォルト・マップ・タイプを「陽電子」にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/e77d5af6-c5ee-24cd-392c-034bf968ab8b.png)
円の最小サイズと最大サイズを調整して、違いが際立つようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/adf3ea05-4fa5-ff73-33ba-84ce02fa97ac.png)
新宿駅付近にズームしてみました。
ツールチップに「駅名」が表示されるようにしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342206/1e99a23d-37c9-7c55-8a14-c943471c4728.png)

# おわりに
自治体が公開しているオープンデータの中にも座標付きのものがありますので、色々と試してみてください。
userconf.txtによる4GPi OSの初期ログインユーザー作成方法

メカトラックスの[maeda01](https://qiita.com/maeda01)です。

Raspberry Piのデフォルトのpiユーザーが廃止されたことに伴う4GPi初期ログインユーザー作成方法についてご紹介します。
ユーザー作成方法はいくつかあり、弊社のブログでもいくつか紹介してきました。Raspbrry Piをモニターと接続して設定する方法とRaspberry Pi Imagerから設定する方法は以下の記事をご参照ください。

https://qiita.com/kakuuta/items/335688ca531ead03de69

本記事は、userconf.txtを使用したログインユーザー作成方法の紹介となります。

# 作業環境
* PC (Windows10)
* Raspberry Pi 3 Model B
    * OS は 4GPi OS (4gpi-bullseye-lite-armhf-20221122.img.xz) を使用
* openssl コマンドが実行可能な Linux 環境
    * openssl コマンドがインストールされていない場合は、ご利用の Linux 環境に合わせて openssl コマンドをインストールしてください。
    * 今回は Ubuntu を使用します。



# OSイメージをSDカードに書き込む
以下を参考に、4GPiのOSイメージをSDカードに書き込みます。

https://qiita.com/kiyonaga/items/73fa842ddcde0e028294

# SDカードにファイルを追加する
ここからユーザーの作成を行っていきます。
今回はユーザー名 "mechatrax"、パスワード "pass" のユーザーを作成します。
SDカードのbootの直下にuserconf.txtを追加します。エクスプローラー上で右クリック → 新規作成 (W) → テキストドキュメント でテキストファイルの作成ができます。

![userconf.txtを入れました.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104552/835e54c8-212d-e322-864b-ad2c74d27cbf.png)


userconf.txtの中に
`「ユーザー名」:「パスワード」`
の一行を加えれば完了です。

ただし、パスワードに関してはあらかじめハッシュ化しておく必要があります。
Ubuntuのターミナルを使用する場合は

```
$ echo '「パスワード」' | openssl passwd -6 -stdin
```
と入力するとハッシュ化されたパスワードが返ってきます。
今回はパスワードが "pass"なので、

```
$ echo 'pass' | openssl passwd -6 -stdin
```
と入力して実行します。

![ハッシュ化しました_mask.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104552/b3f69849-77b5-af01-4719-f2378a6bab94.png)


上の画像のような文字列が出力されるので、これをコピーしてテキストファイルを編集していきます。

```userconf.txt
mechatrax:$6$enko(略)fuF9/
```

これを保存すれば準備完了です。
なお、userconf.txtをあらかじめローカルで作成しておいてSDカードのboot直下にファイルごとコピーしても大丈夫です。

userconf.txtを追加したSDカードをRaspberry Piに挿入して、Raspberry Piに電源を投入します。

# ラズパイにログインする

ここからRaspberry Piにログインしていきます。
今回はUARTでPCに接続してログインできるか確認します。

UART通信を行う方法とUART通信を使用するメリットについては以下のブログにまとめてあります。ぜひご参照ください。

https://qiita.com/hayat00/items/0d586f5500e998ab4d2e



![ユーザー名とパスワード入力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104552/b51cf1b4-aecc-ea18-d86c-c36ed5a2f935.png)

設定したユーザー名とパスワードを入力して、

![teratermでログインできた.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3104552/da253366-d144-a67a-3da7-65bc3eef1adc.png)

無事ログインできました。


# 最後に
初回起動時の設定 (ユーザー作成～ログイン)をまとめました。
[Raspberry Pi Imagerを使う方法](https://qiita.com/kakuuta/items/335688ca531ead03de69#%E6%96%B9%E6%B3%95-2-raspberry-pi-imager-%E3%81%8B%E3%82%89%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B)と今回のuserconf.txtから設定する方法のどちらを選ぶかは人それぞれなので、お好みの方法で設定を行ってください。個人的にはRaspberry Pi Imagerを使うほうが楽な印象ですね。
AccessのVBAでエクセルファイルにフィルター追加

# 概要

これを…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/3a8343da-d4bd-5805-516e-81f4be56c020.png)
こうしたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/fa61cdba-151e-e00a-1934-9b1aa4afbee2.png)

# やり方

参照設定に『Microsoft Excel 16.0 Object Library』追加。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/754ab4db-cbd7-b247-a007-3c12c419ac00.png)

```vb:サンプル
'Accessと同じフォルダーにある『tes.xlsx』が対象。
Dim file_path_ As String: file_path_ = CurrentProject.Path & "\tes.xlsx"

Dim excel_ As New Excel.Application
Dim excel_sheet_ As Excel.Worksheet

'バックグラウンドで起動。
excel_.Visible = False
excel_.UserControl = False
excel_.Workbooks.Open FileName:=file_path_

'一番左のシートのみを選択状態に。
Set excel_sheet_ = excel_.Worksheets(1)
excel_sheet_.Select Replace:=True

'1行目にフィルター追加。
'既にフィルターが付いていた場合はフィルターが外される。
'AutoFilterはトグル動作。
excel_sheet_.Rows(1).AutoFilter

'変更保存してエクセルファイル閉じてエクセル終了。
excel_.Workbooks(1).Close SaveChanges:=True
excel_.Quit
```

# AutoFilterはトグル動作

前述のサンプルについて、既にフィルターが付いている状態のxlsxに対して行うと、フィルターが無しになります。

# 途中に空の列がある場合

前述のサンプルについて、下記のような空の列がある場合…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/993a2674-7646-e4b2-c2a6-653aa4339107.png)

処理結果は下記。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/265f29a4-9d57-6794-18bf-047751e9cb5a.png)



# 参考サイトさん

http://officetanaka.net/excel/vba/tips/tips155.htm

# バージョン

Microsoft Windows [Version 10.0.19045.3271]
Microsoft Access for Microsoft 365 MSO (バージョン 2307 ビルド 16.0.16626.20110) 32 ビット
あなたのサイトを次のレベルへ！CSSメディアクエリでランドスケープ・ポートレート対応をマスターしよう

### 目次
1. [はじめに](#introduction)
2. [ランドスケープモードの対応](#landscape)
3. [ポートレートモードの対応](#portrait)
4. [組み合わせて使う](#combine)
5. [まとめ](#conclusion)

## <a name="introduction"></a>1. はじめに
レスポンシブデザインは今やWeb開発の必須スキルです。この記事では、CSSのメディアクエリを使用して、デバイスのランドスケープモードとポートレートモードに対応する方法を解説します。

## <a name="landscape"></a>2. ランドスケープモードの対応
ランドスケープモード（横向き）に対応するデザインは以下のように実装できます。

### サンプルコード
```css
/* ランドスケープモードのスタイル */
@media only screen and (orientation: landscape) {
  body {
    background-color: lightblue;
  }
  /* 他のランドスケープモード用のスタイルをここに追加 */
}
```

## <a name="portrait"></a>3. ポートレートモードの対応
ポートレートモード（縦向き）の場合は、以下のように実装します。

### サンプルコード
```css
/* ポートレートモードのスタイル */
@media only screen and (orientation: portrait) {
  body {
    background-color: lightpink;
  }
  /* 他のポートレートモード用のスタイルをここに追加 */
}
```

## <a name="combine"></a>4. 組み合わせて使う
ランドスケープとポートレートを組み合わせ、特定のデバイスサイズに対応することも可能です。

### サンプルコード
```css
@media only screen and (orientation: portrait) and (min-width: 400px) {
  /* 400px 以上の幅のポートレートモード用のスタイル */
}
```

## <a name="conclusion"></a>5. まとめ
CSSのメディアクエリを使ったランドスケープ・ポートレート対応は、レスポンシブデザインの強力なツールです。これを使えば、さまざまなデバイスや画面サイズに対応した美しいデザインを実装できます。

いいねとフォローをお忘れなく！
野球部にクラスとインスタンスとコンストラクタを説明したい

おはようございます！
今日も昨日に引き続いてオブジェクト指向プログラミングについての記事です。

https://qiita.com/yangyooji1946/items/1d981c61b986fe474bc3

こちらのオブジェクトシリーズ第1回の記事も良かったら読んでみてください！

軽く昨日の復習をすると、オブジェクト指向プログラミングの”オブジェクト”とは？という話でした。
そして、オブジェクトは”プロパティ”と”メソッド”から構成されるものでしたね。
>-　オブジェクト:　その「もの」の特性（プロパティ）と振る舞い（メソッド）を一つにまとめたものです。
-　プロパティ: オブジェクトの特性や属性を表します。
-　メソッド: オブジェクトの動作を表します。

今日は、”クラス”、”インスタンス”、”コンストラクタ”という３つの言葉について説明していきたいと思います！

### パワプロで考える”クラス”、”インスタンス”、”コンストラクタ”

まずはこの３つの言葉の意味を説明します。

- クラス　：　オブジェクト指向プログラミングにおける設計図のようなもの
- インスタンス　：　クラスから生成される具体的なオブジェクト
- コンストラクタ　：　メソッドの一種で、インスタンス生成時にプロパティの初期化を行うもの

これらをパワプロ的に考えていきましょう。

昨日はイチローオブジェクトを例にして考えましたが、パワプロには１２球団の選手＋OB選手のデータがあるので、全ての選手のコードを書くのはかなり大変です。そこで役に立つのが今日のテーマです。まずコードにするとどんな感じなのかをみていただいた後に、それぞれの言葉について順番に説明します。
```JavaScript
// 選手クラスを定義
クラス 選手クラス = {
    // コンストラクタを使って、プロパティを初期化
    コンストラクタ (名前,ポジション,ミート,パワー,走力,肩力,守備力) {
    this.名前;,
    this.ポジション;,
    this.ミート;,
    this.パワー;,
    this.走力;,
    this.肩力;,
    this.守備力;,
    // 以下が選手クラスのメソッド
    バッティング : function() {
        return `ミートカーソルの大きさが${this.ミート}で、打球の強さは${this.パワー}に比例する。`;
    },
    守備 : function() {
        return `${走力}の速さで操作できて、投げる強さは${肩力}に比例して、エラーするかどうかは${守備力}に比例する`;
    },
};

// イチローオブジェクトを選手クラスのインスタンスとして生成
const イチローオブジェクト = new 選手クラス("イチロー", 外野手, A, B, A, A, A);
const 松井稼頭央オブジェクト = new 選手クラス("松井稼頭央", ショート, B, A, A, A, B);
```

#### クラス
”クラス”は共通の特性（プロパティ）や振る舞い（メソッド）を１つにまとめた設計図のようなものです。

例えば昨日のイチローオブジェクトでいくと、
「プロパティ」は"選手名、ミート、パワー、走力、肩力、守備力"にあたり、
「メソッド」は実際にゲームで使った時の能力にあたります。

このイチローオブジェクトの上位概念としての「選手クラス」というものを作ることで、他の選手も同じプロパティとメソッドを持って生成することが出来ます。

#### インスタンス

クラスという設計図をもとにして生成されたオブジェクトのことを”インスタンス”と言います。
上記のコードでいうと、イチローオブジェクトや松井稼頭央オブジェクトは選手クラスのインスタンスです。昨日のコードに比べてかなりスッキリしていますね！

インスタンスの生成方法は、
```javascript
const オブジェクト名 = new クラス名(パラメータ)
```
となり、上記のコードでは一番下の行で書かれています。
新しいオブジェクト名を宣言し、new + クラス名 + パラメータで簡単に生成できます。
そこのようにコードを短縮できるのは、次に説明するコンストラクタという機能でプロパティを初期化してくれているからです。

#### コンストラクタ
コンストラクタは上記のコードでは4行目からスタートしています。
役割は、クラスからインスタンスを生成する際に、そのインスタンスのプロパティを初期化する役割を果たします。具体的には、コンストラクタ内で定義されたパラメータ（引数）を使って、インスタンスのプロパティに初期値を設定します。

例えば、パワプロの選手クラスで考えると、選手ごとに名前やポジション、ミート、パワーなどの能力値が異なります。これらの値をインスタンス生成時に設定するために、コンストラクタを使用します。

```javascript
コンストラクタ (名前, ポジション, ミート, パワー, 走力, 肩力, 守備力) {
    this.名前 = 名前;
    this.ポジション = ポジション;
    this.ミート = ミート;
    this.パワー = パワー;
    this.走力 = 走力;
    this.肩力 = 肩力;
    this.守備力 = 守備力;
}
```

このコンストラクタは、新しい選手インスタンスを生成する際に、各プロパティに引数として渡された値を設定します。このようにして、同じ選手クラスから異なるプロパティ値を持つインスタンスを効率的に生成することができます。

### まとめ

1. **クラス**: オブジェクトの設計図で、共通のプロパティとメソッドを定義します。パワプロでいうと、選手の共通の特性と能力をまとめたものです。
2. **インスタンス**: クラスから生成される具体的なオブジェクト。各選手がインスタンスになります。
3. **コンストラクタ**: インスタンス生成時にプロパティを初期化するメソッド。選手の名前や能力値などを設定します。

これらの概念を理解することで、オブジェクト指向プログラミングの基本的な部分のイメージが掴めると嬉しいです。パワプロの例を通して、プログラミングの抽象的な概念を具体的にイメージすることができたのではないでしょうか。

最後に、この記事が役立ったと感じた方は、いいねやフォローをお願いします！

それでは今日も学習をスタートします！
【自分メモ】Udemy「【入門】システム要件定義と基本設計」のアウトプット2

## 背景

昨年から会社でWeb開発の手法を学んできましたが、開発技術面がある程度理解できてきたので、設計面での勉強を開始しました（開始させられました）。
Udemy「【入門】システム要件定義と基本設計」を視聴して、理解したことをアウトプットしていこうと思います。

Udemyの講義はこちら
https://www.udemy.com/course/digisaku_requirements_definition_and_system_design/

## 要件定義・基本設計の必要性

- 上流工程の目的
システム開発の上流工程である要件定義や基本設計は、ユーザー・PM・SE・PGが目的を共通認識とすることが目的です。
- 要件定義のゴール
要件定義は、ビジネス側がエンジニア側に「どんなシステムを作りたいか」を伝えることで、何を解決したいのか、だれがいつ何のためにシステムを使うのかを明確にすることが重要です。
要件定義はビジネス側が何をしたいかを伝えるものなのでエンジニア側への丸投げはＮＧです。
また、要望をすべてそのまま伝えるのではなく本当に必要な要望をまとめたり矛盾を解消してから伝えるのもPMの役割になります。
- 基本設計のゴール
一方基本設計では要件定義とは反対に、「どんなシステムを作るか」をエンジニア側がビジネス側に伝えます。
画面遷移図などが含まれます。

## 失敗

要件定義や基本設計の失敗は関係者同士の目的意識のずれが原因であることが多く、エンジニア側とビジネス側で「良いシステム」の基準が違うことが原因です。
エンジニア側「メンテナンス性」や「バグの少なさ」を求めるのに対し、ビジネス側は「ちゃんと使えること」「使いやすさ」を求めてきます。
お互いが求めることが違うと理解して設計を行いましょう。
失敗を避けるためにビジネス側は要件もれが無いように基本設計を確認し、エンジニア側は要件以外にも目を向け、画面や機能をビジネス側に確認してもらうことが重要です。
この時点でずれに気づくことができなかった場合、後半の工程に膨大なコストをかけることになります。
そのため、要件定義や基本設計段階でのミスを防ぐことが大切です。

## 上流工程に必要なこと

上流工程に必要なのは、ビズネス側とエンジニア側の共通目的を形成することです。
共通目的は、Why、What、Howの2W1Hで表すことができます。
ビジネス側が洗い出す困っている点、目指すゴール、現状とゴールのギャップがWhyに、
業務フロー、機能、システムの使用感がWhatに、
画面設計、機能設計、データ設計がHowになります。

## さいごに

要件定義や基本設計を良いものにするには結局関係者同士のコミュニケーションが最重要です。
関係者同士が共通認識を持ち共通目的を形成することで、システム開発を成功に導けます。
Aiven for Apache Kafka®クラスタ構成のバックアップを発表

<font color="Grey">*[Announcing Aiven for Apache Kafka® cluster configuration backup](https://aiven.io/blog/announcing-aiven-for-apache-kafka-cluster-configuration-backup)の翻訳です。*</font>

2023年7月25日

# Aiven for Apache Kafka® クラスタ構成のバックアップを発表

Aiven for Apache Kafkaでクラスタ構成のバックアップが利用可能になりました！Aiven for Apache Kafkaでクラスタ構成のバックアップが可能になりました。

停電や計画的なシャットダウンにより、Apache Kafkaクラスタの状態がリセットされる可能性があります：トピックの定義と設定、ユーザー定義とACL、そしてサーバーの設定をゼロから行う必要があります。[Aiven for Apache Kafka](https://aiven.io/kafka)®で利用可能な新しいクラスタ構成のバックアップ機能により、上記のすべての設定をワンクリックでリストアできるようになり、予期せぬシャットダウンや計画的なシャットダウンからの復旧をより迅速かつ安全に行えるようになりました。


## Apache Kafkaの設定バックアップとは？


Apache Kafka®は非常に回復力が高く、クラスタ内の複数のノードにデータや設定を分散、複製、コピーする柔軟な方法を提供しています。Aiven for Apache Kafkaのすべてのプラン（スタートアッププランも含む）は、3ノード分散アーキテクチャを採用しています。データと設定は自動的に3つの異なるブローカーに分散され、高可用性を実現します。1つのブローカーでエラーが発生した場合、データと設定のコピーはすでに別のブローカーに存在しています。


偶発的または計画的にクラスタが再起動した場合、Apache Kafkaクラスタを復元するには、データと構成パラメータの2つの要素を復元する必要があります。Apache Kafkaデータのバックアップとリストアはまだコミュニティで未解決のトピックですが、メタデータを迅速にリストアするオプションがあることは、クラスタのセットアップが失われることを心配する必要がなくなることを意味します。


Kafkaクラスタの設定を失うと、自動的にクラスタ自体を再設定し、トピック、設定、パーミッションをゼロから作り直すことになる。構成の詳細が外部スクリプトに保存されている場合、このプロセスはよくても時間がかかる。最悪のシナリオでは、関係者全員がプラットフォームで手作業をやり直す必要があり、コンフィギュレーションの悪夢となる。いずれにせよ、Kafkaクラスターを再び稼働させるためのターンアラウンドタイムは、当初の予定よりも長くなる。そしてもちろん、手作業はエラーや設定ミスを引き起こす可能性がある。


そこで、Apache Kafkaクラスタの設定をバックアップしてリストアできる機能がとても便利です。


そしてなんと、これが私たちのすべてのApache Kafkaクラスタに追加された機能なのです。


## Aiven for Apache Kafkaの設定バックアップはどのように機能しますか？


AivenのフルマネージドApache KafkaサービスのKafkaクラスタ設定バックアップは、電源オフ/オンサイクル後、または万が一クラスタに障害が発生した場合、お客様のApache Kafkaクラスタの設定を自動的に以前の状態に復元します。Aiven for Apache Kafkaには99,99%のアップタイムSLAが付属しているため、Kafkaサービスは当社のサポートおよびSREチームによって24時間体制でケアされています。しかし、クラウドリージョン全体のクラッシュや不慮のクラスターシャットダウンなど、より悲惨なシナリオの場合、Aiven for Apache kafkaに追加された設定のバックアップとリストア機能は、以前のステータスを迅速に復元するのに役立ちます。


より詳細には、設定バックアップはKafkaエコシステムの以下のコンポーネントをカバーしています：


* Apache Kafkaトピックと関連する設定パラメータ（保持時間やパーティション数など）。
* Apache KafkaユーザーとACL
* スキーマレジストリのすべて：
	+ スキーマ定義
	+ スキーマID
	+ 構成（互換性レベルなど）
	+ サブジェクトとサブジェクトのバージョン
* Apache Kafka Connectの設定


## クラスタ構成のバックアップを始める


Kafkaクラスタ構成のバックアップは、新しいサービスではすでに利用可能であり、既存のサービスでは定期的なメンテナンスサイクルの後に自動的に有効になります。設定バックアップの内容については、関連する[ドキュメント](https://docs.aiven.io/docs/products/kafka/concepts/configuration-backup)を参照してください。


## 今日から始めよう


クラスタ障害後、Apache Kafkaの設定バックアップ機能により、Kafkaクラスタをオンラインに戻すのに必要な時間はほんのわずかです。その結果、Kafkaユーザーは幸せになり、Kafkaメンテナンススタッフも幸せになります！


まだAivenのサービスをお使いではありませんか？今すぐ[無料トライアル](https://console.aiven.io/signup)にご登録いただくか、Aivenチームに[お問い合わせ](https://aiven.io/contact)ください！


また、[changelog](https://aiven.io/changelog)や[LinkedIn](https://www.linkedin.com/company/aiven/)、[Twitter](https://twitter.com/aiven_io)のアカウントをフォローし、製品や機能関連の最新情報をご確認ください。
完全未経験が入茶しました！

# タッチタイピングすらできない人間が入茶しました！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3528447/3c75d52d-c8dc-1870-8f81-4ae04bec7c08.png)


未経験でもなんとかなるよってことを伝えてます。

## 自己紹介
・プログラミングは未経験
・大学は地方国立数学科、普通の学生でした。院は行ってないです。
・現職は営業職。そろそろ辞めたい。

普段はパソコンを多少触りますが、Excelをいじる程度で、どちらかというとPC苦手人間です。

## 入茶までにしたこと
・pythonのお勉強(未だにwhileがよくわかってないからforだけで頑張ってる)
・解説ブログをずっとサーフィン(やりたいことを理解するように心がける)
・AtCoder典型90問(まだ20問くらいしか解けていない)
・蟻本を買って、本棚の一番目立つところに置いた(まだ読めてない)(pythonじゃないから読めない)

僕の場合は数学力が人よりもあったのでごり押しで入茶したと思います(ずいぶん前の話だけどセンター数学だけは満点だった)

## なんでAtCoder始めたのか
営業職なんですが、Excelファイルの中にある、とある業種の会社をすべてまとめないといけないくなり、chatGPTに「これやりたいんだけど作ってくれない?」と聞いたら5秒で作ってくれて感動しました。(pythonの実行方法もchatGPTに聞いた)

その一件で、ちょっとpythonに興味が出てきて、軽く勉強。youtubeサーフィンしてたら「目的ない人はAtCoderおすすめだよ」と言われ、その日のうちに登録し、たまたま大会が開催される前日だったので、多少の準備をして(過去問のA,B問題を眺め)次の日、初参戦しました。

## なんではまったのか
とりあえず参戦した。(しかも初戦はABCじゃなくてARCだった)
google頼りで半分以上検索(forの書き方とかリストの作り方とか)に時間を使いながら、それでも時間いっぱいがんばったらA,B問を解くことができ、パフォーマンスが770と出て、770の分布をみると全体の半分くらいの場所に鎮座していた。それで「勉強すれば上を目指せるのでは...?」と調子に乗ってしまい、結果はまりました。

## 今後やりたいこと
基本的なアルゴリズムを理解したいです。ビットは数学チックで個人的には理解しやすい反面, DPなどは理解っぽいことはできてるけど、絶対本番で思いつけない程度の理解です。
上を目指すには「覚える」よりも「使える」が大事だと思うので、しっかりとした理解をしないとですね。
まずは典型90問と蟻本を一周します。
あとwhileを使えるようになります。
タッチタイピングも出来るようになりたいな。

## この記事の目的
色変記事はみな真面目だなあと思い、不真面目人間目線の記事を追加したくなり投稿しました。
「勉強ちょっとで未経験でも茶色になれるよ！！」って反感を買いやすいのは理解しています。
でも、この世には不真面目な人間も一定数存在するわけです。そんな人間は努力前提の色変記事を読んでげんなりします。
「こんなことをやらなあかんのか」と。
楽しくなるまでの参入障壁が高いとそもそも始めないんですよ。
楽しく感じるようになれば、不真面目人間でも多少の努力はしますのに。

ですので一部の人から見ると煽り、自慢と捉えられるかもしれませんが、このような記事を投稿しました。

数学得意だった人、気軽にやってみませんか???????

めっちゃ楽しいし、ゆるく続けても多分茶色にはなれますよ！！！
アルゴリズムについて

#### 自分用にアルゴリズムについて簡単にまとめました。

#### アルゴリズムとは？
- アルゴリズムとは、簡単に言えば「作業手順」。 特定の課題を解決したり、特定の目的を達成したりするための計算手順や処理手順がアルゴリズムである。 その手順に沿っていれば、誰がやっても同じ答え（結果）を出せるのがアルゴリズムの特徴。

- 代表的なアルゴリズムに「ソート」がある。また、ソートとはバラバラに並んだ整数などを昇順や降順に並べ直す処理のこと。

下記は、「ソートアルゴリズムで代表的なもの」

```
 1 バブルソート
 2 クイックソート
 3 マージソート
 4 選択ソート
 5 挿入ソート
 6 ヒープソート
```

#### 1. バブルソートとは？

→ バブルソートは、データ列の隣り合う要素を比較し交換することを繰り返すことによりデータ列をソートする手法。 バブルとは「泡」の意味で、ソートの過程でデータが移動する様子が、水中で泡が浮かんでいくように見えることからこの名前がついている。

#### 2. クイックソートとは？

→ 大半の状況下で最速となるソートアルゴリズム。 「不安定」な「内部」ソート。 いわゆる、分割統治法的な考え方に基づいて、 大まかにソート → 配列を2つに分割という処理を再帰的に繰り返しする。

#### 3. マージソートとは？

→ マージソートとは、整列対象のデータを2分割していく操作を繰り返し、要素数が1になるまで細分化、そして細分化した要素同士を整列しながら戻していく手法。

#### 4. 選択ソートとは？

→ 選択ソートとは対象となるデータの中から最小値（もしくは最大値）を探し先頭の値と交換、この作業を繰り返すことで全体を整列させていく手法。

#### 5. 挿入ソートとは？

→ 挿入ソートは、データ列を「整列済み」と「未整列」の2つに分け、 「未整列な配列」からデータを1つ取り出し、「整列済み配列」の適切な位置に挿入する ことを繰り返す手法。

#### 6. ヒープソートとは？

→ ヒープソートとは未整列のデータを「ヒープ」の性質を持つ木構造の構成にして、そこから最大値または最小値を取り出して整列、これを繰り返すことで全体を整列させる手法。
NetBSDのsysinst

c1kでsysinstでインストールするとenable_rc_confがNOのままなので、調べてみました。

sysinstが入っているINSTALLのfsはreleaseのビルドで作られます。

まずソースはusr.sbin/sysinstにあります。

スクリプトではなくてcソースです。

util.cのenable_rc_conf()で書き換えてます。

enable_rc_confをgrepで探すとarch/evbarm/md.cのmd_cleanup_install()で呼んでます。なぜかアーキテクチャ毎なんですね。

ここでifndef DEBUGで囲まれていますが、何のためなんでしょうか？

md_cleanup_install()はinstall.cから呼び出されてます。

install.cには順次処理が書いてあって、通らないはずないんですけどね。。。

```c
        root_pw_setup();
#if CHECK_ENTROPY
        do_add_entropy();
#endif
        do_configmenu(&install);

        sanity_check();

        md_cleanup_install(&install);

        hit_enter_to_continue(MSG_instcomplete, NULL);
```

sanity_check()でエラーが出ていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/68b99854-1da5-3492-fca7-6f385e450b0a.png)

以前はちゃんとインストールできていたのですが。

無理やりenable_rc_conf=YESにして起動すると、今度はloginできない。pam関係の問題と思われます。

```
Login incorrect or refused on this terminal.
```

同じfsでc2kでは問題なくインストールできるのでarmv6固有の問題なのかな。

ユーザーランドをarmv6で作っていたのですが、VFP無しの1136なc1kで正常に動かなくなったのが原因のようです。しかたがないのでarmv5でユーザーランドを作り直したら、問題が解消しました。

fsの方のバイナリではなくsetsのbaseに含まれるファイルが原因かもしれません。

c2kでearmv7hfで作ったreleaseを使ったINSTALLを実行するとなぜか落ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/1a30c35f-6ba7-a587-f518-bbde5f6a0158.png)