OmniAICreator/Qiita-1.07M huggingface dataset:
MySQL よく使うけどよく忘れるコマンド

##指定テーブルの全列を確認

```sql
SHOW FULL COLUMNS FROM テーブル名;
```

##上位 数件を抽出

```sql
--上位5件
SELECT * FROM テーブル名 LIMIT 5; 
```

```sql
--上位6～10件
SELECT * FROM テーブル名 LIMIT 6,10; 
```

```sql
--[昇順｜降順]上位10件
SELECT * FROM テーブル名 ORDER BY カラム名 [ASC|DESC] LIMIT 10;  
```
##特定のレコードだけ先頭、または最後に並べる
```sql
--9と8：を最後に並べる例
SELECT * FROM テーブル名
ORDER BY category_id = 9 ASC,category_id = 8 ASC,category_id  ASC;
```
https://www.whizz-tech.co.jp/2273/

##データの追加
```sql
insert into テーブル名(列名,,,,,)
values(値,,,,,)
```
###うまくいかない時
```sql
mysql> insert into colour(name,example)values('青','水、空);
    '>
    '>
```
|症状|原因|
|----|----|----|
|実行されない|「水、空」の「'」がキチンと閉じられていない。||

##データ削除
###名前がnullのデータを削除
```sql
delete from shoppingTable where item_name is null
```
|ポイント|説明|
|----|----|----|
|delete from|「delete <b>*</b>  from」としないように||
|where カラム is null|nullを指定する場合は「=null」としないこと。||

|コマンド|ロールバック|説明|
|----|----|----|
|DELETE FROM テーブル名;|可能|テーブル内のデータを全削除または条件に一致したデータを削除|
|TRUNCATE TABLE テーブル名;|不可能|テーブル内のデータを全削除する。条件指定不可。|
|DROP TABLE テーブル名;|不可能|テーブルごと削除する。|

https://qiita.com/masapiko/items/cd4aef791608ea919485

##テーブル定義変更
###【例】デフォルトに現在の年月日時刻を挿入
```sql
ALTER TABLE テーブル名 ALTER カラム名 SET DEFAULT (NOW());
```
「NOW()」の両サイドを「()」で囲っていないと、構文エラーになるので注意。
【参考】テーブル定義のサンプル　https://qiita.com/YuichiTanaka007/items/affb74f92a848ad84ab0#source%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB-%E4%B8%AD%E8%BA%AB%E3%81%AE%E4%BE%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%81%A8%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E5%AE%9A%E7%BE%A9

###【例】カラム(列)の追加
```sql
【構文】 
ALTER TABLE テーブル名 ADD `列名1` テーブル定義　[FIRST | AFTER col_name]

【記述例】
ALTER TABLE shopping ADD `remark` VARCHAR(50) NOT NULL AFTER purchase_date;
```
|ポイント|説明|備考|
|----|----|----|
|挿入位置|・「AFTER col_name」：指定したカラムの後ろ<br>・「FIRST」：先頭<br>・未記入：末尾||

###【例】NOT NULL制約を解除する
```sql
【構文】 
ALTER TABLE テーブル名 MODIFY COLUMN `列名1` TEXT NULL;

【記述例】
 ALTER TABLE shopping MODIFY COLUMN `remark` TEXT NULL;
```
【docker-composeのタイポ】/usr/sbin/mysqld: Shutdown complete (mysqld 8.0.26)

## 状況
こちらの記事の手順でgo + mysqlの環境をdocker-composeで構築していました。

```yml:docker-compose.yml
version: '3'
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: go_database
      MYSQL_USER: go_test
      MYSQL_PASSWORD: password
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - db-data:/var/lib/mysql
      - ./db/my.cnf:/etc/mysql/conf.d/my.cnf
    ports:
      - 3306:3306

volumes:
  db-data:
    driver: local
```

```sh:zsh
$ docker-compose up -d
$ docker-compose ps
```
コンテナを立ち上げて、コンテナの状態を確認したところ、dbコンテナがexit状態になっていたので、docker-compose upで要因を確認したところ、

```sh:zsh
$ docker-compose up
db_1  | 2021-08-07T13:42:48.431537+09:00 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.26)  MySQL Community Server - GPL.
db_1 exited with code 1
```
のように、エラーでシャットダウンしていました。

## 解決策
こちらのサイトで、コピペして記事との差分を見たら、docker-compose.ymlの内容にタイポがありました。
https://www.diffchecker.com/diff

タイポを修正後に、再度docker-compose upをしました。すると、

```sh:zsh
$ docker-compose up
db_1  | 2021-08-07T13:42:48.431537+09:00 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.26)  MySQL Community Server - GPL.
db_1 exited with code 1
```
同様にエラーで閉じてしまいました。

そこで、プロセス、イメージ、ボリューム全て削除して、再度docker-compose upしたところ、無事にdbコンテナが立ち上がりました。（ボリュームに大事なデータが残っている場合は、docker-compose.ymlファイルに別にボリューム名を定義してください。）

```sh:zsh
$ docker-compose down
$ docker ps -a
$ docker rm [dbコンテナのid]
$ docker images
$ docker rmi [dbイメージのid]
$ docker volume ls
$ docker volume rm [dbボリュームの名前]
```
改めて、

```sh:zsh
$ docker-compose up
```
無事に立ち上がりました。
【競プロ典型90問】003の解説（python）

## 概要
[競プロ典型90問](https://atcoder.jp/contests/typical90)の解説記事です。
解説の画像を見ても分からない（~~理解力が足りない~~）ことが多々あったので、後で解き直した際に確認できるようまとめました。

※順次、全ての問題の解説記事を挙げていく予定です。
※★５以上の問題は難易度的に後回しにしているため、投稿時期が遅くなる可能性があります。（~~代わりに丁寧に解説してくれる方いたらぜひお願いします~~）

## [問題003-Longest Circular Road](https://atcoder.jp/contests/typical90/tasks/typical90_c)

### 問題概要
グラフの中で最も経路が長くなる都市の組み合わせを探し、＋１して出力する。

### 制約

```math

3 <= N <= 100000 \\
1 <= Ai < Bi <= N \\
(1 <= i <= N-1) \\

```
・どの都市間も移動ができ、入力は全て整数。


### 解き方
まず初めに、
> グラフの中で最も経路が長くなる都市の組み合わせを探し、
どうして上記のように定められるかというと、例えば以下の画像を例に見てみると直感的に８と９を線で繋ぐのが良いと分かるかと思います。
![問題のイメージ 2021-08-07 13.33.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425582/85458c70-2a05-9bfb-b03c-414553abe721.png)

ここで、１からの距離が最も遠いもの同士を繋ぐという考え方も出来ますが、
この考えでは、9と10のように近いものも候補に上がり、最悪の場合、N通りもあり得るため、全て調べるのは現実的ではありません。

また、(~~沼にハマっている方は~~)経路を足すことによって、最大の経路が変わるのでは？と考えられているかもしれませんが、これは
- 道路がN-1本
- どの都市間も移動可能
という条件があるため、今回の場合は無視できます。

では、最大の経路となる組み合わせの求め方ですが、これはある１点から、最も距離のある点を導き、その点からさらに最も距離のある点を調べることで求められます。
（上記の画像では、１から最も深い点８を求め、８から再度探索をすることで求められます。）
探索の方法は、道路に重みなどもないため、**幅優先探索**で良いかと思います。
（幅優先探索については、[こちら](https://qiita.com/wihan23/items/1c1c5773ca94128c45b2)をご参考ください。）

実装の流れは以下になります。
1. 都市１から幅優先探索を用いて、最も離れている都市を見つける。
2. １で求めた都市から幅優先探索を用いて、最長となる経路を求める。

幅優先探索の計算量は、頂点数＋辺の数なので、今回の場合は、$N+N-1$、
これを２回行うため、合計で$4N$、すなわち$O(N)$。これは、10^5のオーダーになるので、十分に間に合います。

![参考画像](https://raw.githubusercontent.com/E869120/kyopro_educational_90/main/editorial/003.jpg "公式解説画像")

引用元：[競プロ典型90問 Github](https://github.com/E869120/kyopro_educational_90)

### 実装

```python:answer.py

# キューのインポート
from collections import deque

# 入力の受け取り、道路情報はリストで格納
N = int(input())
G = [[] for _ in range(N)]

for _ in range(N-1):
  A, B = map(int, input().split())
  G[A-1].append(B-1)
  G[B-1].append(A-1)

# 幅優先探索をする関数。今回は１回目の探索で都市が、２回目の探索で長さが必要なため、arrで値を管理した。
def bfs(n):
  Q = deque()
  dist = [-1]*N
  dist[n] = 0
  Q.append(n)

  arr = [0, 0]

  while Q:
    i = Q.popleft()
    for j in G[i]:
      if dist[j] == -1:
        a = dist[i]+1
        dist[j] = a
        Q.append(j)
        if a > arr[1]:
          arr = [j, a]

  return arr

# １回目は０から呼び出し、２回目はbfsからの返り値で呼び出す。
p, dep = bfs(0)
p2, dep2 = bfs(p)

print(dep2+1)

```

## 最後に
今回の問題は、
- 木の中で最長となる経路は２回の探索で求められる
- 幅優先探索の実装方法
の２点が大きなポイントでした。

問題の解説を読んでも他の人のコードを見てもさっぱり分からないという方の
力に少しでもなれれば幸いです。
コードの改善点やその他、ご意見などあれば、気軽にコメントください。
また、この記事を読んで理解できた方はぜひLGTMを押していただけると嬉しいです。
（~~記事投稿のモチベになります。~~）

ここまでお読みいただきありがとうございました。
新規登録画面実装③エラー解消：デバイスのエラーメッセージが出ない

<h2>はじめに</h2>

新規登録画面に、別モデルのdepartmentの選択を追加したところ、
deviseのエラーメッセージが出なくなってしまいました:frowning2:
その実装は②でやっています。

https://qiita.com/ki_87/items/d62fe7dd0c94b491a2fd


パスワードを空で送ると、、
NoMethodErrorが出てくる。あーーーーーー！

![スクリーンショット 2021-08-07 11.05.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/a1ecb86d-1604-4287-673f-ccc12e2de240.png)
![スクリーンショット 2021-08-07 11.05.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/ba8a4249-7374-e2cf-8a77-267a78d194b6.png)

<h2>required: true 入れれば問題解決じゃないの！？</h2>

<h6>required: trueとは、、、</h6>


![スクリーンショット 2021-08-07 11.12.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/b4056eda-7c7a-f236-19ff-3fc511cd45ee.png)

```erb
<div class="form-group">
    <%= f.label :name,"お名前" %><br />
    <%= f.text_field :name, autofocus: true,required: true,class:"form-control" %>
  </div>
```
<h4>あのエラーは出なくなった！</h4>
そもそも、未入力のものは受け付けないので、エラーメッセージすら出ません。
未入力ならあらかじめ「このフィールドを入力してください」と出ます。

<h3>クサイものに蓋をしている　ような違和感</h3>
確かにエラーは出ないし、使う分には何の問題もなさそうなんだけど、、、
これで良いのか....??

<h4>結論</h4>
良くない！:fist:
以下のページで同じような質問がされています。

https://teratail.com/questions/48856

そもそも、required: trueは入力必須なので、「一文字」でも進んでしまいます。
パスワードを６文字以上というバリデーションかけてた場合には
ちゃんとエラーメッセージ出るようにしてあげないと、いけません。

<h2>エラー解消</h2>

以下のように修正したところエラーは解消されました。

```erb
<div class="form-group">
    <%= f.label:"所属先" %><br />
    <%= f.collection_select(:department_id, Department.all, :id, :name, class: "form-control") %>
  </div>
```
tailscaleにWSL2からつないでみた

# 環境

+ WSL2
+ Ubuntu 20


# インストール

```shell
curl -fsSL https://tailscale.com/install.sh | sh
```


# 起動

## daemon起動

```shell
sudo tailscaled
```

## tailscaleに接続

```shell
sudo tailscale up
```

## 動作確認

```
$ ping 100.101.102.103
PING 100.101.102.103 (100.101.102.103) 56(84) bytes of data.
64 bytes from 100.101.102.103: icmp_seq=1 ttl=64 time=1811 ms
64 bytes from 100.101.102.103: icmp_seq=2 ttl=64 time=764 ms
64 bytes from 100.101.102.103: icmp_seq=3 ttl=64 time=327 ms
64 bytes from 100.101.102.103: icmp_seq=4 ttl=64 time=340 ms
64 bytes from 100.101.102.103: icmp_seq=5 ttl=64 time=365 ms
64 bytes from 100.101.102.103: icmp_seq=6 ttl=64 time=387 ms
64 bytes from 100.101.102.103: icmp_seq=7 ttl=64 time=334 ms
64 bytes from 100.101.102.103: icmp_seq=8 ttl=64 time=535 ms
64 bytes from 100.101.102.103: icmp_seq=9 ttl=64 time=356 ms
64 bytes from 100.101.102.103: icmp_seq=10 ttl=64 time=378 ms
```

# トラブルシューティング

WSLから100.101.102.103にはpingが飛ぶのだがプロジェクトのサーバにはpingが飛ばない。
一方で、Windowsの方にtailscaleを入れたらプロジェクトのサーバにpingは飛び、WSLからも接続できた。しかし今度は100.101.102.103にはpingが飛ばなくなった。

# 参考

+ [WSL2のUbuntuにTailscaleを使ってSSH接続する - Qiita](https://qiita.com/slin/items/7f8dc8dcc8adf8f1ccb5)
setup nuxt

```
$ cd ~/github
$ npm -v
7.19.1
$ npm init nuxt-app myproject

create-nuxt-app v3.7.1
✨  Generating Nuxt.js project in myproject
? Project name: myproject
? Programming language: JavaScript
? Package manager: Npm
? UI framework: Vuetify.js
? Nuxt.js modules: Axios - Promise based HTTP client, Progressive Web App (PWA),
 Content - Git-based headless CMS
? Linting tools: ESLint, Prettier, Lint staged files, StyleLint
? Testing framework: Jest
? Rendering mode: Single Page App
? Deployment target: Server (Node.js hosting)
? Development tools: jsconfig.json (Recommended for VS Code if you're not using
typescript)
? Continuous integration: None
? Version control system: Git
```

```
$ cd myproject
$ npm install --save-dev eslint-plugin-vue
$ npm audit
$ npm audit fix
$ npm audit fix --force
```

```
$ cat package.json
...
  "scripts": {
...
    "lint:pr": "prettier -c .",
    "lint:pr:fix": "prettier -c . --write",
    "lint:js": "eslint --ext \".js,.vue\" --ignore-path .gitignore .",
    "lint:js:fix": "eslint --ext \".js,.vue\" --ignore-path .gitignore . --fix",
    "lint:style": "stylelint \"**/*.{vue,css}\" --ignore-path .gitignore",
    "lint:style:fix": "stylelint \"**/*.{vue,css}\" --ignore-path .gitignore --fix",
    "prepare": "husky install",
    "lint": "npm run lint:pr && npm run lint:js && npm run lint:style",
    "lint:fix": "npm run lint:pr:fix && npm run lint:js:fix && npm run lint:style:fix",
    "test": "jest"
  },
...
```

```
$ cat .eslintrc.js
module.exports = {
  ...
  extends: [
    '@nuxtjs',
    'prettier',
    'plugin:nuxt/recommended',
    'plugin:vue/essential',
  ],
  plugins: [],
  // add your custom rules here
  rules: {},
}
```


```
$ npm run lint:pr
$ npm run lint:pr:fix
$ npm run lint
$ npm run lint:fix
```

```
$ cat nuxt.config.js
build: {
    babel: {
      babelrc: true,
    },
  },
...
```

```
$ npm run test
$ npm run dev
$ npm run build
$ npm run start
```
Digital Leader 合格体験記

# 初めに
最近、Google Cloudの資格に追加された Digital Leaderを受けて合格したので、これから受験する人に向けて体験記を残します。
https://cloud.google.com/certification/cloud-digital-leader

# Background
- Google Cloud専門のSIerに2020年の新卒で入社したエンジニア2年目
- Google Cloudの保有資格: ACE, PCA, PDE, PNE, PCD
- 大学は情報系じゃなかったので、Computer Scienceはそんなに詳しくない

# どんな問題が出る？
Google Cloudの資格を受験する際は、試験ガイドを見るのを強くお勧めします。この範囲さえ完璧にしていれば合格するからです。
https://cloud.google.com/certification/guides/cloud-digital-leader

ざっとどんな問題が出るかに関してです。NDAがあるので具体的な問題に関しては言えないのですが、だいたいこんな感じです。Digital Leaderは問題の形式としては、ACE（Associate Cloud Engineer）に似ていて、Google Cloudのプロダクトを広く浅く知ってれば解ける問題でした。（ここに書いてある内容は本当に一部分だけです）

### オンプレミスからGoogle Cloudに移行する際にどのコンピューティング環境に移行すべきか
- コンテナはどのプロダクトに移行すればいいか
- オンプレで動作するVMwareはどのプロダクトに移行すればいいか
- オンプレで動作するVMwareをGKEもしくはAnthosに移行するときにどのサービスを使って移行すればいいか

### オンプレミスからGoogle Cloudに移行する際にどのストレージを使用するべきか
- 動画ファイルや音声ファイルは？
- 基本的なSQLを用いて、過去のデータ分析したいけど、どうすれば？
- グローバルでスケーラブルなRDBを使用したいけど、何が適切か。
- 柔軟なスキーマが必要な半構造化データを保管するには？
- 時系列データを保管するには？

### CI/CD
- コンテナイメージはどう保管すればいい？
- CI/CD組む時のベストプラクティスは？

### 組織の階層構造管理
- 組織、フォルダ、プロジェクトを実際の組織とどうマッピングするか
- IAMで権限管理する際のベストプラクティスは？

### Security
- VMの脆弱性を検知させるには？
- トラフィックがインターネットを通過しないようにオンプレとVPCを接続するには？
- VMにプライベートIPを持たせない時のベストプラクティスは？
- コンテナイメージの脆弱性を検知するには？


書き出すとキリがないのですが、問題の詳細度としてはこんな感じで、使ったことないプロダクトでもどんなプロダクトかを知っていれば解ける問題です。

# 受けてみた感想
55問くらい問題があって、1時間半しかなかったので時間に余裕はなかったです。一通り解き終わるのに70分くらいかかって、最後にちょっと見直しして提出しました。どのGoogle Cloudの試験も同じなのですが、受けた直後に合格・不合格が分かります。受けてから1週間位は受験者が規約違反をしていないかなどの調査が行われて最終的な合格通知が届きます。公式の資料には7~10日くらいで来るとあるのですが、10日過ぎても来なかったので問い合わせたことがあります。その時は「現在解決しようと奮闘しているバグによって通知が遅れています」とメールが届きました。そういうこともあるらしいので気長に待ちましょう。

次は、8/22にProfessional Security Engineerを受験する予定なのでがんばります！！！

# 最後に
試験は英語版での提供しかないので、英語がさっぱりの人はきついと思いますが、ある程度読めてGoogle Cloudのプロダクトある程度知ってるよって人は一度受けてみるのはありだと思います。$99だし。

Googleが提供している模擬試験を受けてみて自分のレベルがどんなもんかを見てみるといいかもしれません。CouseraでもDigital Leader用のコースがあったと思うので、そちらも活用してみるのもいいと思います。
JavaScript便利関数表（随時更新）

まだ数は少ないですが、便利だと思うJavaScriptの関数をまとめていきます。
時々、汎用性の高い良い書き方を見つけたら追加していく予定です。

### Sleep関数

```Javascript
const sleep = function (msec) {
  return new Promise(function(resolve) {
    setTimeout(function() { resolve() }, msec);
  });
}
export default sleep

// 以下のように呼び出す
async function() {
 // something
 await sleep(1000);
 // something
}
```

### オブジェクトの中から特定のキーを検索

```Javascript
// jsonが検索したいオブジェクト
// wantが検索キー
Object.entries(json).find(([key, _]) => {
  return key === want;
})
```
勉強メモ23_何かでphpMyadminを触ってた時のメモ

####★0　はじめに
前にphpMyadmin を触ってた時のメモ


####★1 データベースの文字コードはこれがBEST
https://www.pletk.com/dbutf.html

utf8_general_ci

####★2　パスワード変更
https://www.dbonline.jp/phpmyadmin/user/index3.html

####★3　PHPデータ取得で文字化け対策
https://satox.hatenadiary.jp/entry/20120929/1348872362

####★4　PHPアドミンでrootのパスワード変更して、ＸＡＭＰＣＯＮＴＲＯＬのexe起動して、MYSQLの構成ボタンでアクセスエラーが出たら下記を見る
https://www.adminweb.jp/xampp/mysql/index3.html

####★5　PHPサーバー公開について
https://qiita.com/am10/items/a3b6a5239905da3ec18f
上記記事のＦＴＰでのファイルアップロード画面で
右上にドメインが記載されているので、これをＵＲＬでアクセスする
https://php1st.com/574
bashのサブシェルをgdbでデバッグするときの疑問

この記事では疑問を書いています。
問題解決はしません。


以下のような問題がある。


**親プロセスが、子プロセスの終了を待っているときに、子プロセスを追跡し、
親プロセスもデバッグしながら正常に動作させるにはどうすればいいのか？**


以下のような単純なコマンドをbashに実行させたときのbashの挙動をgdbでデバッグしている。

```shell 
$ (echo hello)
```

このコマンドはbashにサブシェルをsyncronus（同期的）で立ち上げるように指示し、その中でビルトインコマンドのechoを実行させる。
syncronusとは親プロセスが、子プロセスの終了を待つことを意味する。

このコマンドが処理されるのはexecute_cmd.cのexecute_command_internal()という関数の中だ。

かなり端折っているが、関数は以下のようになっている。


```c
int execute_command_internal(...)
{
    if (command->type == cm_subshell || /*いろいろ評価*/) {
        pid_t paren_pid;

        /*forkしてサブシェルを生成*/
        paren_pid = make_child();

        /*ここは子プロセスに実行される*/
        if (paren_pid == 0) {
            last_command_execute_value = execute_in_subshell()   
            /*後始末をして、親プロセスに値を返す*/         
            subshell_exit();            
       }

        /*ここは親プロセスに実行される*/ 
        else {
            /*assyncronus == 0 は syncronusを意味する。*/
            if (assyncronus == 0)
                /*子プロセスを待つ*/
                wait_for(paren_pid)
            else
                return EXECUTION_SUCCESS;
        }
    }
}

```

上のコードはだいたい以下のような処理をしている。

bashがコマンドをsyncronusで実行するように認識すると、
まずbashはforkしてサブシェルを作る。

bash(親プロセス）はwait_for(parent_pid)を実行し、
サブシェル（子プロセス）の終了を待つ。

サブシェルは内部でコマンドを実行し、
結果を親プロセスに返す。

サブシェルの終了がわかると、親プロセスであるbashは処理を続ける。

gdbでは以下のような設定を入力している。



```shell
#forkした子プロセスを追跡するようにgdbに指示する
(gdb) set follow-fork-mode child

#forkしたとき、通常はどちらかのプロセスの制御を手放すが、この入力をすることで両方のプロセスの制御を続ける。
(gdb) set detach-on-fork off
```

~~しかし、このようにすると、サブシェルはgdbの子プロセスになってしまい
サブシェルの実行が終了すると、gdbに返り値を返す（と思う）。~~


***
[追記]
gdbでサブシェルにアタッチしている間に、psコマンドで親子関係を確認しましたが、
サブシェルはbashの子プロセスのままでした。@angel_p_57さん、ありがとう。
(たぶん、gdbのinferiorコマンドについてもっと調べる必要がある。)
***


よって、もともとのbashはwait_for(child)をしているが、子プロセスは
すでにgdbに値を返しているので、wait_for()が完了することは永遠にない。

上記のｃのコードにコメントをつけ直すと以下のようになる。



```c

int execute_command_internal(...)
{
    if (command->type == cm_subshell || /*いろいろ評価*/) {
        pid_t paren_pid;

        paren_pid = make_child();

        /*ここはサブシェルに実行される。*/
        if (paren_pid == 0) {
            last_command_execute_value = execute_in_subshell()   
            /*サブシェルはgdbの子プロセスになっているので、サブシェルはgdbに値を返す。*/         
            subshell_exit();            
       }

        /*ここは親プロセスに実行される*/ 
        else {
            /*assyncronus == 0 は syncronusを意味する。*/
            if (assyncronus == 0)
                /*プロセスを待つがフォークしたサブシェルはもはやbashの子プロセスではなくなっている。
　　　　　　　　　　　よって値が返されることはなく、bashはここで永遠に待ち続ける。*/
                wait_for(paren_pid)
            else
                return EXECUTION_SUCCESS;
        }
    }
}

```

このような状況ではどのようにデバッグするべきなのか。


自分の考えは完全に間違っている可能性があるので、わかる方いればコメントいただけると
幸いです。
Kotlin > java.lang.ExceptionInInitializerError と表示されたとき



```
Build file '/Users/atsu/Downloads/container--ktor-test-master/build.gradle' line: 13

A problem occurred evaluating root project 'ktor-test'.
> java.lang.ExceptionInInitializerError (no error message)

* Try:
Run with --info or --debug option to get more log output. Run with --scan to get full insights.
```

IDEが示す対象箇所は以下

```
kotlin_version = '1.2.61'

apply plugin: 'kotlin' ←ココ
```


stackoverflowで解決策が明示されてました。

[javascript \- Kotlin gradle Could not initialize class class org\.jetbrains\.kotlin\.gradle\.internal\.KotlinSourceSetProviderImplKt \- Stack Overflow](https://stackoverflow.com/questions/60833542/kotlin-gradle-could-not-initialize-class-class-org-jetbrains-kotlin-gradle-inter)

>Solved this issue by setting the latest Kotlin version (1.3.72) in build.gradle file.



ということで、Kotlinのバージョンを上げたら解決しました。

```
kotlin_version = '1.2.61'
　↓
kotlin_version = '1.5.20'
```

バージョンは時々見直しておく必要がありますね。
Node.jsでバイナリファイルをhex化して改行入れて見やすくするコード


```js
const fs = require("fs")

const filePath = process.argv[2]
const CUT_LEN = 56

const ttt = fs.readFileSync(filePath)
const list = Array.from(Uint8Array.from(ttt))
  .map(v => {
    const v2 = v.toString(16).toUpperCase()
    return (v2.length === 1) ? '0' + v2 : v2
  })
const num = Math.floor(list.length / CUT_LEN)

for (let i = 0; i < num; i++) {
  const start = i * CUT_LEN
  const end = start + CUT_LEN
  console.log(list.slice(start, end).join(' '))
}

// 割り切れない場合、端数処理
if ((list.length % CUT_LEN) !== 0) {
  const start = num * CUT_LEN
  const end = list.length
  console.log(list.slice(start, end).join(' '))
}

// 上記コードのファイル名がmmm.jsだったとしたら、下記となる。
// $ node mmm.js 'r:file-name.DAT'

```

結構適当に書いたので、変数名とかリーダブルの逆を行っている気がする。。

今回のサンプルは、56byteずつ切って表示している。

ファイル名は自分の環境に合わせて変えてほしい。
2021-08-07 Godot Engine > AudioServer.get_bus_effect_instance(0,0)がnullを返す


### 動作環境

```
Windows 10 Pro v21H1
Godot Engine v3.3.2.stable.official
```

### 実装

```python
func _ready():
	spectrum = AudioServer.get_bus_effect_instance(0,0)
```

spectrumの戻り値がnullになる。

### 対処

default_bus_layout.tresを以下の形で用意する。

```
[gd_resource type="AudioBusLayout" load_steps=2 format=2]

[sub_resource type="AudioEffectSpectrumAnalyzer" id=1]
resource_name = "SpectrumAnalyzer"

[resource]
bus/0/effect/0/effect = SubResource( 1 )
bus/0/effect/0/enabled = true
```

### IDEの用意するdefault_bus_layout.tres

IDEで生成したファイルは以下となり、この場合はget_bus_effect_instance()はやはりnullになる。

```
[gd_resource type="AudioBusLayout" format=2]

[resource]
```
BERTによる自然言語処理についてモデルを組んで確認してみた

# はじめに
　　システム会社所属のシステムエンジニアが独学に限界を感じて
　オンライン受講した結果を記録する記事です。
　これまでの自己学習での各種技術の習得を行ってきましたが、
　日々複雑になる技術説明の信憑性を担保することに限界を感じ受講
　することにしました。


　　本記事は、技術系のオンライン学習を活用し機械学習等、
　説明に苦慮する技術をシステムの開発に、取り入れられる
　ようにするための学習結果の公開です。
　学習するオンライン講座についてはAidemy様の
　「自然言語処理講座」を活用させていただきました。

　　Googleの検索エンジンも採用しているTransformerを活用した
　BERTモデルについて学習した知識で理解しようとしています。

#### 　　【著者の略歴】
　　　8年位様々な業種のシステム開発／運用に携わるSEをさせて頂いてます。
　　直近2年間でAIにかかわる技術の必要性を感じ、機械学習モデルに興味
　　を持ち始めました。

　　年代、性別：30代、男
　　すきなもの：コーヒー、ダーツ、ウィスキー

# 本記事の概要
1. 対象読者
 - Transformerモデルについてを勉強中の方
 - オンライン受講できる学習内容について興味がある方

1. 記載内容について
 - 制作物のコーディング方法
 - 制作物に対する著者の見解

1. 今回対象外とする内容
 - 作成するモデルの学習に必要な性能や時間等の測定
 - 環境構築等の手法

# 目的
### 　BERTモデルの事前学習の効果について検証する

# 背景
　　GoogleよりBERTモデルの日本語事前学習済みモデルが公開されている
　実際に自作でBERTモデルの日本語について学習したモデルとの性能の差
　を検証してみたいと考えた。

# 目次
####[1.BERTモデルをpytorchのnnクラスから記述する](#1-BERTモデルをpytorchのnnクラスから記述する)
####[2.日本語事前学習済みモデル（Google提供）と比較する準備](#2-日本語事前学習済みモデル（Google提供）と比較する準備)
####[3.結果比較](#3-結果比較)
####[4.まとめ](#4-まとめ)
####[5.参考リンク](#5-参考リンク)


#1. BERTモデルをpytorchのnnクラスから記述する
　BERTモデルの作成については株式会社サイシードより提供されている
　以下のサイトを参考に構築する。
　[汎用言語表現モデルBERTを日本語で動かす(PyTorch)](https://sciseed.jp/technology/bert-jp/)
　※株式会社サイシード

　学習用データの準備に[text_preprocess](https://github.com/koeimiwa/BERT_Training/blob/main/text_preprocess.ipynb)を実行して学習用データ、検証用データ
　を準備する。
　BERTモデルの構築を行い学習させる。（コードは[こちら](https://github.com/koeimiwa/BERT_Training/blob/main/BERT_Demo_A.ipynb)）
　実際のモデルの学習については相当な時間が必要となります。（著者作成時、約30時間）
 
#2. 日本語事前学習済みモデル（Google提供）と比較する準備
　以下のサイト記載の手法を参考にGoogle提供の日本語事前学習済みモデル
　と比較するために準備をする。(コードは[こちら](https://github.com/koeimiwa/BERT_Training/blob/main/Google_BERT_Exsample.ipynb))
　[BERTの日本語事前学習済みモデルをGoogle Colaboratoryで手軽に試す方法](https://qiita.com/karaage0703/items/30485c2ba1c396760982)

#3. 結果比較
### 　自作モデルの学習結果
　100MBのデータをベースで学習させた場合の学習結果は以下の通りでした。
　（学習パラメータ等はリンクの[コード](https://github.com/koeimiwa/BERT_Training/blob/main/BERT_Demo.ipynb)）の通りです。
　EP_test:2:  98%|| 801/820 [1:54:36<02:34,  8.11s/it]
　　{'epoch': 2, 'iter': 800, 'avg_loss': 1.1997434179136965, 'avg_acc': 69.03675093632958, 'loss': 1.2028791904449463}
　EP_test:2: 100%|| 820/820 [1:57:33<00:00,  8.60s/it]
　EP2_test, avg_loss= 1.2002710063283037 total_acc= 68.97655803316181

　使用したデータ量と、学習に使える時間が少なかったため今回はtotal_accが
　68.976とあまり期待ができない値になりました。
　実際に学習したモデルに以下の通り穴抜けの文字を予測させると
　以下のように結果はでたらめに近い結果となってしまいました。

| No. | 予測単語 |
|:-----------|:------------:|
| 0 | 組織 |
| 1 | ラルト |
| 2 | 乱射 |
| 3 | 都庁 |
| 4 | 邂逅 |

---

### 　Google提供の事前学習モデル
　一方Google提供の事前学習済みモデルの場合です。
　「父の父は、祖父。」というテキストに対して２つめの「父」をマスクし、
　文字が予測できるか確認しました。
　結果は以下の通りです。

| No. | 予測単語 |
|:-----------|:------------:|
| 0 | の |
| 1 | 、 |
| 2 | と |
| 3 | 父 |
| 4 | 母 |

　4つ目「３」の出力予測に「父」が入っていることが確認できました。
　こちらのモデルではしっかりと穴抜けテキストの予測はできています。


#4. まとめ
　BERTモデルはすでに数年前に発表されたモデルのため、Transformerの構造
　理解や作成のためにコーディングすることは有意義でしたが、学習したモデル
　をそのまま活用するには多くの課題が残りそうでした。
　
　今後の学習については転移学習を活用して、大規模な学習時間が必要な
　モデルを作成する際にいかに効率よくモデルに学習させるかを理解できると
　今回のようなGoogle提供モデルより、追加で学習させたモデルの作成
　といった活用ができそうでした。

#5. 参考リンク
　[汎用言語表現モデルBERTを日本語で動かす(PyTorch)](https://sciseed.jp/technology/bert-jp/)
　[BERTの日本語事前学習済みモデルをGoogle Colaboratoryで手軽に試す方法](https://qiita.com/karaage0703/items/30485c2ba1c396760982)
【Unity】FolderをScriptableObjectに登録する。

# はじめに

エディター拡張をしているときに、ScriptableObjectにFolderパスを登録してしまうと移動したときの取得できなくなるので、フォルダー(GUID)を登録する形にしたいというお話が出てFolderは登録できないのでstringでGUIDにしましたと言われ、そんなことないと思いやってみました。

先に結論を書くと`UnityEngine.Object`を継承しているものは登録できるのでFolderも登録できます。

・`Properties...`でクラスがわかることを追記：2021/08/30,


```ScriptableObjectData.cs

using UnityEngine;

public class ScriptableObjectData : ScriptableObject
{
    public UnityEngine.Object asset;
}

```

ですが、一覧にはすべて出てきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175167/ebb08ca6-9e50-8dfc-cff7-ce5ace5182a8.png)


# ある程度登録できるものを制限したい

とは言え`UnityEngine.Object`にしてしまうとすべてのものが登録出来てしまうのである程度制限をかけたいです。
なのでFolderとはどのクラスなのかを調べないといけませんので軽く調べてみましょう。

unityのC#部分はオープンソースになっているので探せば見つかるかもしれませんが、正直探しづらいです。
簡単に調べてみました。

```CheckClassType.cs
using UnityEditor;
using UnityEngine;

public class CheckClassType : Editor
{
    [MenuItem("Assets/Qiita/Check Select Object")]
    private static void CheckSelectObject()
    {
        Debug.Log(Selection.activeObject.GetType());
    }
}

```

調べたいファイルから右クリックで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175167/f91a92d5-ced9-424c-2c1a-9e476ca650c1.png)


ログに`UnityEditor.DefaultAsset`と出ました。
早速修正してみます。

```CheckClassType.cs
using UnityEngine;

public class ScriptableObjectData : ScriptableObject
{
    public UnityEngine.Object asset;
    public UnityEditor.DefaultAsset folder;
}

```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175167/8395d3ce-dae3-e55b-90af-bc0c0ac2e0aa.png)

一応、制限されましたがアセットバンドルやシーンは一覧にでます。
シーンは`UnityEditor.SceneAsset`なので`UnityEditor.FolderAsset`があるのかなと思いましたがありませんでした、これ以上は面倒なので調べませんがもしかしたらFolderのみを表示するようにクラスがあるかもしれません。

unity2020.3ぐらいから`Properties...`が追加されてあるクラスもわかるみたいでした。(追記：2021/08/30)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175167/3fdf74a0-65cd-96a7-3ed3-79f244790cbe.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/175167/70ddc6d8-d420-ca62-110e-e5f4ad5ecbb7.png)


# おわりに

unityの記事は多いので大抵のものは探せば見つかりますが、最近見つからなかったら出来ないとなるunityプログラマーは多いのではと思いました。自分自身知らないことは多いですが、いろいろ考えたり自分で検証したりすれば記事が見つからなくても実装できるのでぜひ記事を見て終わりではなく検証していただければと思います。
正直ネットで記事を探すよりも検証する方が楽しいです。

# 参考

http://docs.unity3d.com/ja/current/ScriptReference/DefaultAsset.html
git checkout ブランチをした際の Your branch is ahead ofの意味







git checkout task2-1をしたところ、次の様に表示されました。

Your branch is ahead of 'origin/task2-1' by 1 commit.
(use "git push" to publish your local commits)

意味としては、
リモートの task2-1 ブランチに対して、ローカルのtask2-1ブランチが1コミット進んでます。
"git push" 使って、あなたのローカルのコミットを公開してください。

と言われています。

初学者向けに「コミットが進んでいる」ということがどういうことかといいますと、コミットが1つ多い、と言う意味です。
（当てはまる言葉が見つからないので見つかりましたが追記します。）

したがって、指示にしたがっても良いのであれば従いましょう。




ローカルリポジトリの task2-1 ブランチのコミットを
リモートリポジトリの master ブランチに push すればOKです。

git push origin [ローカルブランチ]:[リモートブランチ]

の書き方になります。

この書き方で、

[ローカルブランチ]を[リモートブランチ]に pushできます。
【初心者向け】GASで超簡易メルマガ配信システムを作成した

いつも隣にITのお仕事の記事をを参考にさせていただきました。

##簡易メルマガ配信システムのコード
```
function sendMail(){

  const sheet = SpreadsheetApp.getActiveSheet();
  const lastRow = sheet.getLastRow();
  
  const DOC_URL = '*****ドキュメントのURL*****'; 
  const doc = DocumentApp.openByUrl(DOC_URL);
  const docText = doc.getBody().getText();

  const subject = 'メルマガ送信テスト';
  const options = {name: 'いつも隣にITのお仕事'};
   
  for(let i = 2; i <= lastRow; i++){

    const company = sheet.getRange(i, 1).getValue();
    const lastName = sheet.getRange(i, 2).getValue();　//姓
    const firstName = sheet.getRange(i, 3).getValue();　//名
    const recipient = sheet.getRange(i, 4).getValue();
    
    const body = docText
      .replace('{社名}',company)
      .replace('{姓}',lastName)
      .replace('{名}',firstName);
    
    GmailApp.sendEmail(recipient, subject, body, options);
  }
}
```
GAS_スプレッドシートにて毎月情報をデフォルトにリセットさせるように

表題のままなのですが、個人的に毎月の細々としたものをデフォルトでできるようにしました。

より良い書き方、関数の分け方あれば教えてください。

```
/** @OnlyCurrentDoc */
const CHECK_SHEET = 'check_sheet';
const FORMAT_SHEET = 'format';
const JST_DIFF = 9;
const DATE_FORMAT = 'YYYY年MM月';

const getMonthDate = (diff = 0) => {
    const now = dayjs.dayjs();
    return now.add(JST_DIFF, 'hour').add(diff, 'month');  
};

const backUp = () => {

  const spreadsheet = SpreadsheetApp.getActive();
  
  const lastMonth = getMonthDate(-1).format(DATE_FORMAT);

  spreadsheet.setActiveSheet(spreadsheet.getSheetByName(CHECK_SHEET), true);
  const sheet = spreadsheet.getSheetByName(lastMonth);

  if (sheet !== null){
      return
  }

  spreadsheet.duplicateActiveSheet();
  spreadsheet.moveActiveSheet(3);
  spreadsheet.getActiveSheet().setName(lastMonth);
};

// delete sheet
const deleteSheet = (spreadsheet) => {
  const sheet = spreadsheet.getSheetByName(CHECK_SHEET);

  if (sheet !== null){
    spreadsheet.deleteSheet(sheet);
  }
};


// make new
const makeNew = (spreadsheet) => {
  spreadsheet.setActiveSheet(spreadsheet.getSheetByName(FORMAT_SHEET), true);
  spreadsheet.duplicateActiveSheet();
  spreadsheet.moveActiveSheet(1);
  spreadsheet.getActiveSheet().setName(CHECK_SHEET);
};

const updateDate = (spreadsheet) => {
  const sheet = spreadsheet.getSheetByName(CHECK_SHEET);
  const month = getMonthDate().format(DATE_FORMAT);
 
  sheet.getRange("B2").setValue(month);
}


// update sheet
const updateSheet = () => {
  const spreadsheet = SpreadsheetApp.getActive();
  backUp()
  deleteSheet(spreadsheet);
  makeNew(spreadsheet);
  updateDate(spreadsheet);
};```
【AWS】ネットワークにおける高可用性の実現

# ネットワークにおける高可用性の実現

## ネットワークサービス

### ◉Amazon Virtual Private Cloud（VPC）

#### ◎設計時の検討事項
- **複数のアベイラビリティゾーン（AZ）**でサブネットを構成する
- サブネットは**パブリックサブネットとプライベートサブネット**を構成する
- 将来利用するIPアドレス数を見越して、**CIDR**で設計する

#### ◎サブネット構成図

[![Image from Gyazo](https://i.gyazo.com/86dc34b18685d30461be920aab35c741.png)](https://gyazo.com/86dc34b18685d30461be920aab35c741)

### ◉NATゲートウェイ
- AZ内では冗長化されているが、**AZ間の冗長化はされていない**
- 別AZのNATゲートウェイを共有している場合、別AZに障害が発生してしまったらNATゲートウェイができなくなり、**インターネット接続できなくなる**

### ◉AWS Direct Connect
- ユーザーがキャリアから調達する専用線の片端とAWS Cloudを**Direct Connectロケーションで接続するサービス**
- **オンプレミス環境と接続ポイント間**の可用性はユーザーの責任範囲
- **接続ポイントとAWS間**の可用性はAWSが提供

[![Image from Gyazo](https://i.gyazo.com/e9690aa70bad8a5e15590325c1358727.png)](https://gyazo.com/e9690aa70bad8a5e15590325c1358727)

### ◉Amazon Route 53
- DNS（Domain Name Service）のマネージドサービス
- ELBやCloudFrontのエンドポイントをCNAMEレコード（ドメイン名）ではなく**Aレコード（IPアドレス）として指定できる**


#### ◎Route 53のルーティングポリシー

| ルーティングポリシー | 説明 |
|:-:|:-:|
| レイテンシーベースルーティング  | 最もレイテンシーが低いリソースへルーティング  |
| 加重ルーティング  | 複数のリソースに対して、加重度を設定しその比率に応じて分散するようにルーティング  |
| 位置情報ルーティング  | リージョンに関係なく、地理的に近い場所へルーティング  |
| フェイルオーバールーティング  | リソースのヘルスチェックを行い、利用できるリソースへルーティング  |
| シンプルルーティング  | 設定されたレコードの情報に従って、ルーティング  |
| 地理的近接性ルーティング  | ユーザーとリソースの地理的場所に基づいてトラフィックをルーティング  |
| 複数値回答ルーティング  | 最大8つからランダムに選ばれた正常なレコードを使用し、Route 53がDNSクエリに反応する  |

## 高可用ネットワークの構築
### ◉オンプレミス環境とAWS間の接続
#### ◎Direct Connect冗長化
[![Image from Gyazo](https://i.gyazo.com/e7f315a7df422d2ff2a6d0b09a5f0d2f.png)](https://gyazo.com/e7f315a7df422d2ff2a6d0b09a5f0d2f)

:::note info
・Direct Connectを2回線用意して冗長化することで、ネットワークの高可用性が実現できる
・Direct Connectロケーションも別拠点にすることで、ロケーションにおける障害にも対応することができる
:::

#### ◎Direct ConnectとSite to Site VPNの併用
[![Image from Gyazo](https://i.gyazo.com/5e5815a3762df6934f3177d26647dfdf.png)](https://gyazo.com/5e5815a3762df6934f3177d26647dfdf)

:::note info
Site to Site VPCへフェイルオーバーすることで、通信品質や帯域が異なる回線へ切り替わるためパフォーマンスに影響が出る可能性がある
:::

### ◉Disaster Recovery（DR）サイトの構築
[![Image from Gyazo](https://i.gyazo.com/975fa512c16f6b2c289779b6dbd8f253.png)](https://gyazo.com/975fa512c16f6b2c289779b6dbd8f253)

:::note info
・リージョンをまたぐDRサイトを構築する場合、それぞれのリージョンでVPCを作成する
・VPC間の接続をプライベートに行うため、VPCピアリングを利用する
:::

#### 参考
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-nat-gateway.html

https://aws.amazon.com/jp/route53/

https://aws.amazon.com/jp/route53/faqs/

https://aws.amazon.com/jp/directconnect/?nc=sn&loc=1

https://aws.amazon.com/jp/directconnect/faqs/?nc=sn&loc=6
【Heroku】 デプロイによるエラー ログの詳細の見方

# 2021/8/8追記 この記事の対応方法がよくないことがわかりました。

コメント記載してある@jnchito様の対応をしていただければと思います。



### なにやったか

RailsアプリをHerokuにデプロイ。
Herokuにデプロイ後、毎度おなじみのエラー

We're sorry, but something went wrong.
If you are the application owner check the logs for more information.

がでた。

これにたいしてどうやって解決したか、備忘録として残す。


## この記事でわかること 
ログの詳細をみるやり方がわかります。 

## 解決までの道

```
$ heroku logs -t
```

ログコマンドをうって、どこがエラーか探る。

```log
 heroku[router]: at=info method=GET path="/" 
```

いや・・これだけじゃわかりません。
とりあえず status=500はわかりました。

## もっと詳細のログを出すために

https://qiita.com/hrtkmztn/items/209ab6dc646bfc7f9432

いい記事を見つけて、これ通りやってみる。

gemに追加

```ruby:Gemfile
gem 'rails_12factor', group: :production
```

bundle installして、herokuにプッシュする！！

```ruby:Gemfileに追加してherokuにデプロイする
$ bundle install
$ commit -am"Add gem"
$ git push heroku main
```

```
$ heroku logs -t
```


```
RuntimeError at / Refile.secret_key was not set.

Please add the following to your Refile configuration and restart your application:

Refile.secret_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
```

どうやらリファイルのセレクトキーの問題でした。
んでこの問題にたいしての解決策の記事がありました。

https://qiita.com/ruby_math/items/5741cd3fdf778bcef181

### 解消方法

secret_keyを書き込めば良いとのことなので
/config/initializers/application_controller_renderer.rb
に追記


```ruby:/config/initializers/application_controller_renderer.rb
# Be sure to restart your server when you modify this file.

# ActiveSupport::Reloader.to_prepare do
#   ApplicationController.renderer.defaults.merge!(
#     http_host: 'example.org',
#     https: false
#   )
# end

#以下を追記
Refile.secret_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
```

追記を終えたら以下のコマンドうって終了。

```
$ git add.
$ commit -am"Add Refile_secret_key"
$ git push heroku main
$ git push origin main
$ heroku open
```

無事エラー解決し、デプロイできました。
【Kotlin】Jacksonでdata classへデシリアライズの際にInvalidDefinitionExceptionが発生した時の対応

## 概要
Jsonのシリアライズ、デシリアライズを行う際に、JavaだとJacksonのライブラリを使う時があると思います。JacksonはKotlinでも普通に使用できるのですが、Javaのコードをそのままコピーすると、`data class`へデシリアライズ時に`InvalidDefinitionException`が発生します。
JavaだとこのExceptionが発生したときは[JacksonでInvalidDefinitionExceptionが起きたときの対処法](https://reasonable-code.com/invaliddefinitionexception/)にある通りデフォルトコンストラクタを定義すれば回避できますが、data classだとこの方法では回避できないようです。もちろんdata classの使用をやめるということもできるのですが、data classでExceptionを回避するのはどうすれば良いのか、メモ書きとして残しておきます。

## 対応方法
[Parsing with Jackson and Kotlin](https://proandroiddev.com/parsing-optional-values-with-jackson-and-kotlin-36f6f63868ef)の記事で、2通りの対応が紹介されています。
一つ目は[こちら](https://gist.github.com/Pavneet-Sing/fab90a0590b1a78c0faf4db4f2238a76)のソースの通り、デシアライズ対象のdata classのプロパティに`@JsonProperty`のアノテーションを付与する方法。ただ、これだと一つ一つアノテーション付与するのがちょっと面倒な感じがします。
二つ目は[こちら](https://gist.github.com/Pavneet-Sing/4a2a8d0721188327c20e3ef949315314)のソースにある通り、`ObjectMapper`に`KotlinModule`を登録する方法。このKotlinModuleは[jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)というライブラリをインポートすることで、使用できます。ObjectMapperの作成時に`registerKotlinModule()`を呼び出せば良いだけなので、実装としては二つ目の方法が楽なのではないかなと思います。
59日後にITパスポートを受けるFラン私大文系既卒(9日目)

# サービスマネジメント
* サービスマネジメントとは?
 * 利用者に対するサービスの向上と維持する活動
 * プロジェクトマネジメントとは異なり、定期的な活動

# サービスレベル
* サービスレベルとは
 * ユーザに対するサービスの品質

# ITIL(Information Technology Infrastructure Library)
* ITILとは
 * ITサービスマネジメントのベストプラクティス(最良の事例)が書かれている
 * 実際に使われた事例が書いてある
 * 効果のあった事例が書いてある

# SLM(Service Level Management)
* SLMとは?
 * サービスレベルを維持・改善するための活動
 * PDCAの手法を使う
* PDCAとは?
 * Plan
 * Do
 * Check
 * Act

# SLA(Service Level Agreement)
* SLAとは
 * サービスレベルを明文化した書類
 * 範囲と品質を明確にする

# 可用性管理
* 可用性管理とは
 * 可用性を確保するための活動
 * 可用性とは、サービスを使いたい時に使えること
 * 可用性とは、使用することが可能であること
 * 可用性の具体例としては、提供時間や稼働率

# サービスサポート
* サービスサポートとは?
 * 日々のITサービスの運用
* サービスサポートを構成するプロセスや機能(6つ)
 * インシデント管理
 * 問題管理
 * 構成管理
 * 変更管理
 * リリース管理
 * サービスデスク

# インシデント管理
* インシデント管理とは?
 * サービスを迅速に復旧させる活動
 * 問題の根本の問題解決はしない

# 問題管理
* 問題管理
 * インシデントの根本原因の究明と、再発防止をする活動

# 構成管理
* 構成管理とは?
 * IT資産を正確に把握して、不正使用を防止する活動
 * ソフトウェアライセンスの管理も行う

# 変更管理
* 変更管理とは?
 * システムの変更を承認し、その計画を立てる活動

# リリース管理
* リリース管理とは?
 * 変更管理で承認された変更を、本番環境に実装する活動

# サービスデスク(ヘルプデスク)
* サービスデスクとは?
 * トラブルなどの問い合わせに対応する単一の窓口
 * インシデント管理に基づいた迅速な復旧を優先して行う
* 目的
 * サービスレベルを低下させないこと

# エスカレーション
* エスカレーションとは?
 * ヘルプデスクで対応できない技術的に高度な問い合わせを、上位管理者や技術部門などに引き継ぐこと

# FAQ(Frequently Asked Question)
* FAQとは?
 * 良くある質問とその答えをまとめたもの

# チャットボット
* チャットボットとは?
 * 会話形式で自動的に問い合わせに応じる仕組み

# BCM(Business Continuity Management：事業活動管理)
* BCMとは?
 * 災害や事故などがあっても、企業活動を継続するための経営手法
 * ポイントは事前に計画し、準備しておくこと

# BCP(Business Continuity Plan：事業継続計画)
* BCPとは?
 * 災害や事後があっても、事業をいかに継続するかをまとめた計画

# ファシリティマネージメント
* ファシリティマネージメントとは?
 * 建物や設備の保有や運用、維持などを最適化する手法
* ファシリティマネジメントの目的(4つ)
 * 安全性
 * コスト削減
 * 快適性
 * 機密性

# UPS(Uninterruptible Power Supply)
* UPSとは?
 * 停電時にコンピューターに一時的に電力を供給する装置
* メリット
 * すぐに電力を供給できる
* デメリット
 * 一時的にしか電力を供給できない

# 自家発電装置
* 自家発電装置とは？
 * 長時間の停電が発生した際に、システムに電力を送る装置
 * UPSとの併用が必須
* メリット
 * 長時間電力を供給することができる
* デメリット
 * 供給までに時間がかかる  

# セキュリティワイヤ
* セキュリティワイヤとは?
 * 盗難防止用のワイヤー

# サージ防護(surge：急上昇)
* サージ防護とは?
 * 瞬間的に発生する高い電圧からシステムを守ること

# 監査
* 監査とは
　* 企業活動が正しく行われているかを調査すること

# システム監査
* システム監査とは
 * 情報システムに対するコントロールが適切に設備・運用されているのかを、第三者が評価すること
* ポイント
 * リスクに対するコントロールが適切か評価する
 * 監査人は主体的には解決しない(犯人を逮捕しない)
 * 監査人は独立した第三者であること
* リスクコントロールとは
 * リスクのコントロールが適切にされているかを評価すること
* システム監査のための2つの基準
 * システム管理基準
 * システム監査基準
* システム監査の３つのポイント
 * 信頼性
 * 安全性
 * 効率性

# 情報セキュリティ監査
* 情報セキュリティ監査とは
 * 情報資産を対象とする監査
* 情報セキュリティ監査の3つのポイント
 * 機密性
 * 安全性
 * 可用性

# 監査の流れ
* 監査の流れ(5つ)
 * 依頼
 * 調査
 * 報告
 * 改善命令
 * 改善
* 調査方法
 * ヒアリング
 * 現地調査
 * レビュー
* 調査で大事なこと
 * 聞いたことの裏付け(監査証拠)をとること
* 報告
 * 監査報告書を提出する
* 改善命令
 * 被監査部門に改善命令を出す
* 改善
 * 監査人は主体的に改善活動をすることはない

# コーポレートガバナンス(企業統制)
* コーポレートガバナンスとは?
 * 株主を中心としたステークホルダが、経営者の経営を監視すること
 * ITを使ったコーポレートガバナンスをITガバナンスという

# 内部統制
* 内部統制とは?
 * 社内の全ての人が会社を健全化すること
 * 内部統制の整備と運用の責任は経営者
 * ITを使った内部統制をIT内部統制という

# 職務分掌
* 職務分掌とは?
 * 担当者の役割や仕事の権限を明確にすること

# モニタリング
* モニタリングとは?
 * 内部統制の一部
 * 内部統制が有効に機能していることを継続的に評価すること

# レピュテーションリスク
* レピュテーションリスクとは?
 * 会社の評判を悪くするリスク
jUnitの実行は成功するのにgradleのタスクが失敗する

jUnit5で`@Nested`を使って階層でテストを書いていたらテスト自体は成功したのですが、ネストの深いところで以下エラーが出ました。

```
> A build operation failed.
      Could not write XML test results for (クラス名)
```

### 解決法

名前を短くした。(根本解決ではない感じがしますが・・・)
どうやらCucumberのプラグインをいれていると起こっている人が多そうです。
DockerでApache、nginx、MySQLを構築するシンプルな方法

# 実行環境
・自宅PC
・OS:Windows10
・インストール：Docker Hubより
⇒ https://hub.docker.com/editions/community/docker-ce-desktop-windows/

インストールはご自身の環境に合わせてインストールしてください。


# DockerでApache、nginx、MySQLをインストールする

DockerでApache、nginx、MySQLを実行していきます。
単体起動なので相互接続はしておりません。
MySQLを実行するには様々なオプション設定が必要なので、本記事では割愛します。


## コンソールの起動
Windowsの場合、コマンドプロンプトまたはPowerShellを起動してください。（Windowsの場合）
Macの場合、ターミナルを起動してください。
Linuxの場合は、Teraterm等でSSHログインしてください。


## ①Apacheを8080ポート指定で実行する
```
docker run --name apache01 -d -p 8080:80 httpd
```

><オプション説明>
--name <任意> コンテナ名設定
-d バックグラウンド実行
-p ポート指定（左側のローカル指定は、ほかのコンテナの指定とは被ってはいけない）
httpd は apacheのパッケージを指定 ※パッケージ一覧は後述


ブラウザで「http://localhost:8080/」と入力しましょう。
⇒『IT works!』と表示されていればOKです。（デフォルトではこの文字列らしい）


## ②nginxを8081ポート指定で実行する
```
docker run --name nginx01 -d -p 8081:80 nginx
```

><オプション説明>
--name <任意> コンテナ名設定
-d バックグラウンド実行
-p ポート指定　（左側のローカル指定は、ほかのコンテナの指定とは被ってはいけない）
nginx   nginxパッケージを指定


ブラウザで「http://localhost:8081/」と入力しましょう。
⇒『Welcome to nginx!』と表示されていればOKです。（デフォルトではこの文字列らしい）



## ③MySQLをパスワード指定して実行する
```
docker run --name mysql01 -dit -e MYSQL_ROOT_PASSWORD=password mysql
```
実際に使えるようにするには細かなオプションが必要だが、本記事では割愛する。


><オプション説明>
--name <任意> コンテナ名設定
-dit バックグラウンド実行
-e MYSQL_ROOT_PASSWORD=<任意の文字列> DBのrootユーザパスワードを指定
mysql mysqlパッケージを指定　※ポートは勝手にMySQLデフォルトのポート（3306）になる


## ④コンテナ稼働状況を確認
```
docker ps -a
```



出力例

```
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS                    PORTS                                   NAMES
ec7eb43c02dd   mysql        "docker-entrypoint.s…"   4 seconds ago    Up 3 seconds              3306/tcp, 33060/tcp                     mysql01
9ac0d977a264   nginx        "/docker-entrypoint.…"   12 seconds ago   Up 11 seconds             0.0.0.0:8081->80/tcp, :::8081->80/tcp   nginx01
8a3917dcda2c   httpd        "httpd-foreground"       17 seconds ago   Up 16 seconds             0.0.0.0:8080->80/tcp, :::8080->80/tcp   apache01
```

## ⑤コンテナを停止したいなら
docker stop [コンテナ名] or [CONTAINER ID]

```
docker stop mysql01
```

## ⑥コンテナ削除
docker rm [コンテナ名] or [CONTAINER ID]




## ⑦他のコンテナパッケージ名
<イメージ名> <コンテナの中身>
・httpd Apache
・nginx Nginx
・mysql Mysql
・postgres PostgreSQL
・mariadb MariaDB
・openjdk JAVA実行環境
・python Python実行環境
・php PHP実行環境
・ruby　Ruby実行環境
・perl　Perl実行環境
・gcc　C/C++ コンパイラ
・node　Node.js
・registory Dockerレジストリ
・wordpress　WordPress
・nextcloud Nextcloud
・redmine Redmine


## ⑧その他のLinuxイメージが入ったコンテナイメージ名
・ubunt
・centos
・debian
・fedora
・busybox
・alpine



# 最後に
今回はDockerインストール後の基本的な実行方法を投稿致しました。
Windows環境でもDockerの検証ができるので、Dockerって何？という人はぜひトライしてみましょう。

次のステップに進みたい方、ご活用ください。
『[DockerでWordPress環境を構築する方法](https://qiita.com/kazuh1Lo/items/506e3f4642d717d7863d)』
VBAだからこそスコープを意識しておかないとだめだという話

#概要
　仕事で、VBAのプログラムを引き継ぐということがあったのですが、そのプログラムが関数のスコープを意識せずに設計されていたらしく、脆弱性があることが分かりました。
　正直、私も、変数はともかく関数のスコープまでちゃんと意識していない人間だったので、今後、同じことを私が行わないように、ちゃんとアウトプットしておくことにしました。

#どんなプログラムだったの？
　どのようなプログラムだったかというと、以下の画像のシートとコードがあるExcelファイルであり、「admin」ボタンを押すとパスワードの入力を求められ、パスワードがあっていると「見られちゃいけないシート」が見れるようになるというプログラムだった。
　パスワードを直接書いているとか、いろいろ突っ込みどころはあるのですが、おそらく初心者の人に予想外の操作をされたくないための設定なので、とりあえず無視しておきます、今回はそのことではなくスコープについてです。
　
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033231/1db04d6b-0be4-f5bc-99ea-a8f27539b2bb.png)

```vb
Option Explicit

Sub admin()
    Dim ans As String
    ans = InputBox("パスワード", "パスワード", "")
    If ans = "12345" Then
        Call Visible
    Else
        MsgBox "パスワードが違います。"
    End If
End Sub

Sub Visible()
    Sheet2.Visible = xlSheetVisible
End Sub

Sub VeryHidden()
    Sheet2.Visible = xlSheetVeryHidden
End Sub
```

#スコープをちゃんとしないと起こること
　VBAには関数や変数を宣言する前にprivateとpublicを宣言することができます。
　privateと宣言された場合は宣言したモジュールの中でのみで使用できるようになり、publicと設定された場合はプロジェクト全体の中で見ることができます。
　そして何も宣言しないと変数や関数はpublicに設定されるようになっているため、たとえば、ボタンにマクロの登録をしようとすると、シートを見せる関数「VeryHidden」が設定可能になっていることが分かります。
　このままでは、「見られちゃいけないシート」が簡単にみられてしまいますし、標準モジュールにパスワードをかけたとしても、だれでもボタンに登録するマクロを別のものに変えることができ、初心者の方に予想外の操作を行われる危険性があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033231/029887a9-3cae-0009-e5e2-da9bfd0952a3.png)

　Functionというパラメータを設定した場合にも、セルに関数名を入力すると、以下のように実行できてしまう。
　この場合、マクロが行うワークブックに対しての処理（ThisWorkbook.Closeなど）は無視されるようですが、こんなに簡単に実行できてしまうと、初心者の人がやらかしかねないので、実行できないようにしておくのが望ましいでしょう。

```vb
Function MoveMe(num As Long)
    If num = 0 Then
        MsgBox "表示されました"
    End If
End Function

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033231/579e4ba5-023b-0a58-8b75-041b54df7f63.png)


#解決策
　先ほど出てきましたが、privateを設定するだけで、簡単には見れなくなります。
　以下のコードのように、見せていい関数はPublic、見せたくない関数はPrivateを設定することで、先ほどのように簡単に実行できてしまうということは起こりません。

```vb
Public Sub admin()
    Dim ans As String
    ans = InputBox("パスワード", "パスワード", "")
    If ans = "12345" Then
        Call Visible
    Else
        MsgBox "パスワードが違います。"
    
    End If

End Sub

Private Sub Visible()
    Sheet2.Visible = xlSheetVisible
End Sub

Private Sub VeryHidden()
    Sheet2.Visible = xlSheetVeryHidden
End Sub

Private Function MoveMe(num As Long)
    If num = 0 Then
        MsgBox "表示されました"
    End If
End Function
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033231/32c32767-026a-5dc8-b905-c51a5cf11298.png)


　ただし見れなくなっただけで、「マクロ名」に実行したい関数名を入力すると、実行自体はできてしまうようです、あくまで簡単に見れなくなるだけです。（Privateとは一体…）
　関数名がばれてしまったら、もうあきらめましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033231/51c05f97-43cf-7149-1bb1-bf52b913f2e8.png)


#まとめ
　VBAでもスコープをちゃんと設定しないと、予想外の操作が行えてしまうことの説明と解決策についてまとめました。
　ただし、Excel自体、セキュリティ関連が弱いので、詳しい人ならばパスワードをかけようが簡単に解読できてしまいます、VBAは個人で使うだけにするのがいいのかもしれません。
Windows 11 非対応PCにインストールする方法

#1. OSをダウンロードしてISOファイルを作る。
2021/08/07 現在ではWindows 11のイメージファイルは公式サイトに載っておらず、Windows Update から直接ダウンロードして作成する必要があるため、[UUP dump](https://uupdump.net/) からツールをダウンロードして作成します。
Build の列に書いてある、Windows 11 Insider Preview ～～～ をクリックして画面通りに進めます。



ダウンロードができたら解凍し、```.cmd``` 拡張子のファイルを実行します。
作成が完了するまで時間がかかるので気長に待ちましょう。

```Press 0 to exit.``` と出てくれば完了なので ```0``` を押して終了します。
同ディレクトリ内に ```.ISO``` ファイルが作成されているはずです。

#2. インストールディスクを作成する。
isoが作成できたら、既存の方法でインストールメディアを作成します。
### 光学ディスクの場合
iso ファイルを右クリックし、```ディスクイメージの書き込み``` をクリックして書き込みます。
### USB の場合
[Rufus](https://rufus.ie/) を使用して書き込みます。

#3. ディスクから起動する。
BIOS または ブートマネージャーからUSBを選択して起動します。
#4. レジストリを弄る
Windowsのインストール画面を進めていき、Windows11が実行できないという主のメッセージが表示されるところまで行きます。

この画面で ```Shift + F10``` を押して、コマンドプロンプトを開きます。

コマンドプロンプトを使用して、レジストリエディタを起動してレジストリを変更します。

エディターを起動するには、コマンドプロンプトで ```regedit.exe``` と入力します。

```HKEY_LOCAL_MACHINE \ SYSTEM \ Setup``` の下に新しいキー ```LabConfig``` を作成します。

セットアップキーを右クリックし、  [新規]> [キー]を選択します。

```LabConfig``` と入力し、Enterキーを押します。

```LabConfig``` キーを右クリックし、```[新規] > [DWORD（32ビット）値]``` を選択します。

```BypassTPMCheck``` と ```BypassSecureBootCheck``` の2つの値を作成します。```DWORD32``` の値を ```1``` に設定します。

Enterキーを押して保存します。

レジストリエディタを閉じます。

コマンドプロンプトでexitと入力するか、ウィンドウを閉じます。

それでも ```このPCはWindows11を実行できません``` と表示されている場合は、Windowsインストールセットアップの戻るボタンを押します。

#5. インストールする。
ここまで行けばインストールできます。

# 参考

https://www.windowslatest.com/2021/06/28/youll-be-able-to-bypass-windows-11-tpm-2-0-requirement/
[04] C言語でコンソールから関数を呼び出す機構の振り返り ... readelf -s の実行


|本シリーズのトップページ|
|:--|
|https://qiita.com/robozushi10/items/fc185b5da0509b9a631f|


# はじめに

本記事の趣旨は「[01 概要](https://qiita.com/robozushi10/items/40b3fc1791a1bab51e4a)」に記しているが、
13年前(=2008年) に職場のプログラムの挙動をマネて実装した
「コンソールから関数を呼び出す機構」の振り返りである.

本項では次の (3)(4) について記す.

>(3) `*.o` に対して `readelf -s` を実行して公開関数名を抽出する
　⬇️ 
(4) (3) で抽出した公開関数名をヘッダファイルに書き出す
　⬇️ 



# 詳細

## (3) について

下記については次の通りである.

>(3) `*.o` に対して `readelf -s` を実行して公開関数名を抽出する

`readelf -s` の実行は、mk_sym_tbl.rb で行っている.
わざわざ Ruby を採用した理由は、2008年 当時 Ruby が流行っていたので使ってみたということである.
(当時は職場のビルドシステムの補助ツールは、Perl から Ruby に置き換えられていた)

### mk_sym_tbl.rb

```ruby
#!/usr/bin/ruby
#------------------------------------------
# readelf -s *.o から関数シンボルを抜き出す
#------------------------------------------
def help
    printf("%s [input_file]\n", $0)
end

Fn_tbl_file  = "cfn.tbl.h"
Ext_dec_file = "cfn.extern.h"

# 引数チェック
if ARGV.length() != 1
    help()
end

if File.exists?(Fn_tbl_file) == true then
    File.unlink(Fn_tbl_file)
end

if File.exists?(Ext_dec_file) == true then
    File.unlink(Ext_dec_file)
end


while filename = ARGV.shift
    cmd = sprintf("| readelf -s %s", filename)
    f   = open(cmd)
    while line = f.gets
        if((line =~ /\sFUNC\s/) && (line =~ /\sGLOBAL\s/))
            if(line =~ /\s*(\w*):(\w*)\s*(\w*)\s(\w*)\s*(\w*)\s*(\w*)\s*(\w*)\s*(\w*)\s*(\w*)\s*(\w*)/)
                if($10 != "main")
                    buf  = sprintf("{\"%s\", &%s},\n", $10, $10)
                    buf2 = sprintf("extern %s;\n", $10)
                    File.open(Fn_tbl_file, 'a+').write(buf)
                    File.open(Ext_dec_file, 'a+').write(buf2)
                end
            end
        end
    end
end

```


## (4) について

下記については次の通りである.

>(4) (3) で抽出した公開関数名をヘッダファイルに書き出す

上記 (3) の mk_sym_tbl.rb を次のように実行する

```bash
$ ./mk_sym_tbl.rb test_driver.o
```

すると、次の 2つのヘッダファイルが生成される

```
|-- cfn.extern.h .. 上記 mk_sym_tbl.rb から生成された関数の extern宣言. 
|                   コンパイル&リンクエラー回避のために用いる.
`-- cfn.tbl.h .... 上記 mk_sym_tbl.rb から生成された関数名と関数アドレスを定義したヘッダ.
```
htmlでjavascriptファイルが読み込めない（初歩的なミス）

# 発生内容

```html:index.js
<!DOCTYPE html>
<html lang="ja">
<body>
～中略～
  <script src="main.js" type="text/javascript"></script>
</body>
```

と記述していたところ、開発者ツール上でmain.jsがソースに表示されず読み込まれていない。

# 原因
type="text/javascript"の記述が不要のようだった。

# 修正点

```html:index.js
<!DOCTYPE html>
<html lang="ja">
<body>
～中略～
  <script src="main.js"></script>
</body>
```

修正後、読み込まれることを確認した。
[03] C言語でコンソールから関数を呼び出す機構の振り返り ...デバッグ対象のプログラム


|本シリーズのトップページ|
|:--|
|https://qiita.com/robozushi10/items/fc185b5da0509b9a631f|


# はじめに

本記事の趣旨は「[01 概要](https://qiita.com/robozushi10/items/40b3fc1791a1bab51e4a)」に記しているが、
13年前(=2008年) に職場のプログラムの挙動をマネて実装した
「コンソールから関数を呼び出す機構」の振り返りである.

本項では次の (1)(2) について記す.

>(1) デバッグ対象のプログラムコード `*.c` が存在する.
　⬇️ 
(2) `*.c` をコンパイルして `*.o` を作成する
　⬇️ 



# 詳細

## (1) について

下記については次の意味である.

>(1) デバッグ対象のプログラムコード `*.c` が存在する.

デバッグ対象は test_driver.c である.

今回、関数呼び出しの際にサポートしている引数の型は int と文字列のみなので、
`int` と `char *` のみを引数に持つ関数を定義している.

また、static 関数はコンソールから呼び出せない[^1] ことを証明するために、
static 関数も定義している.

```c
#include <stdio.h>

void
hoge(int i)
{
    printf("i = %d at hoge()\n", i);
}

void
piyo(char * mesg, char * mesg2)
{
    printf("(%s , %s) at piyo()\n", mesg, mesg2);
}

int
foo(void)
{
    printf("I am foo\n");
    return 99;
}

static void
internal_func(int i, char * mesg)
{
    printf
    (
        "[%s:%d] i = %d, mesg = %s at internal_func[%p]\n",
        __FILE__,
        __LINE__,
        i,
        mesg,
        internal_func
    );
}

void
Ext_func(int i, char * mesg)
{
    printf("call internal_func\n");
    internal_func(i, mesg);
}

int
main()
{
    Invoke_from_stdin();
    /* not reached */
    return 0;
}
```

## (2) について

以下を実行して test_driver.o を生成する

```
$ gcc -c test_driver.c
```

　
以上.

[^1]: リンクのときにエラーになるため. また職場の実行プログラムは静的リンクであった.
Seriesの参照

#概要
Seriesの要素を参照する時、番号を指定する方法やインデックス値を指定する方法がある。

インデックス値で参照する場合は、欲しいインデックス値をひとつのリストにまとめてから参照する事ができ、リストではなくひとつの整数値を指定した場合は、その位置に該当するデータのみを取り出す事ができる。





##まずはSeriesを生成する
```python
import pandas as pd

fruits = {"banana": 3, "orange": 4, "grape": 1, "peach": 5}
series = pd.Series(fruits)

#いろんなパターンで出力してみる
print(series)

print(series[1])

print(series[[1]])

print(series[0:2])

print(series[:3])

print(series["orange"])

print(series[["orange", "peach"]])
```

##print(series)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736279/7ff68fce-be21-a970-e12b-8d592afecb54.png)

##print(series[[1]])
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736279/53dd6666-a9f2-a7be-8e28-dd8ebe8918c9.png)

##print(series[0:2])
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736279/74cb684a-2e34-9634-887d-be92bf6a2efc.png)

##print(series[:3])
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736279/a16322b4-7dfd-c9b8-65a2-3eaf2b78765f.png)

##print(series["orange"])
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736279/8fb3e308-94c2-fb5f-72bb-ad0ac3d4f14d.png)

##print(series[["orange", "peach"]])
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736279/5bca1048-8621-14b7-b194-f85db67062f3.png)