OmniAICreator/Qiita-1.07M huggingface dataset:
【Azure AD B2C カスタムポリシー】Null値を許容する方法

# シチュエーション
・新規登録画面で、電話番号等の必須でない属性値を空（Null）で登録したいとき
・プロフィール編集画面などで、設定されている属性値を空(Null)に変更し、登録したいとき
・IDP(LINEやGoogle等)やid_token_hint等から渡ってきた属性値を空(Null)に変更し、登録したいとき

# 必要なメタデータ
```xml
<Item Key="AllowGenerationOfClaimsWithNullValues">true</Item>
```

上記一行を対象のTechinicalProfileの＜metadata＞タグ内に追加するだけで、各属性に対するNull設定が可能となります！

# 挙動確認
試しに、動かしてみましょう！今回はプロフィール編集画面で、携帯電話番号（カスタムポリシー上の属性名：mobilephone_number）をnullで登録するシチュエーションになります。

## 改修前

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670585/fbf0c932-a21d-d0e4-5398-77ccb30895d8.png)

実際に、「080-1111-1111」と記載された電話番号を

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670585/80164e5b-5afa-7f35-35bb-29ce8b4bc819.png)

完全に消して、登録してみます。すると↓↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670585/c8adeee2-3e6f-0c72-6de9-9a7d79acfdec.png)

jwt.ms画面上で、さきほど消したはずの携帯電話番号が表示され、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670585/9f948db9-a236-e0c4-3dd4-2f7a54b36e2b.png)
プロフィール編集画面上でも携帯電話番号「080-1111-1111」が残ってしまっています。

## 改修後
上記でご説明したMetadataタグ内にAllowGenerationOfClaimsWithNullValuesの属性を追加し、trueにした状態で、カスタムポリシーをアップロードします。アップロード後は先ほどと同じようにプロフィール編集を行ってみましょう。

すると↓↓



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670585/6478814c-da7c-d16d-808d-c81485111afb.png)

jwt.ms画面では、「"mobilephone_number": "080-1111-1111"」の記載が消え、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670585/fc2d20f6-17d2-baae-7517-9d9a3d92c752.png)
プロフィール編集画面をもう一度開いてみても、無事に携帯電話番号における初期値設定はない状態になっていました！


# 参考にしたサイト
https://learn.microsoft.com/ja-jp/azure/active-directory-b2c/self-asserted-technical-profile

↑他にも続行ボタン、キャンセルボタンの出力方法等必要なメタデータの一覧が上記Microsoft公式ドキュメントに記載されているので、ご参考までに！
Elixirの対話モードで再帰の動作を確認してみた

# 概要
Elixirの対話モードで再帰の動作を確認してみました。以下のページを参考にしました。

https://dev.to/gumi/elixir-09--1a0p

# 対話モードで実行
以下のコマンドを実行しました。
```
$ iex
Erlang/OTP 24 [erts-12.2.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit]

Interactive Elixir (1.12.2) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> defmodule Length do
...(1)> def of([]), do: 0
...(1)> def of([_ | tail]), do: 1 + of(tail)
...(1)> end
{:module, Length,
 <<70, 79, 82, 49, 0, 0, 4, 252, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 137,
   0, 0, 0, 15, 13, 69, 108, 105, 120, 105, 114, 46, 76, 101, 110, 103, 116,
   104, 8, 95, 95, 105, 110, 102, 111, 95, 95, ...>>, {:of, 1}}
iex(2)> Length.of []
0
iex(3)> Length.of [1,2,3]
3
iex(4)> _x = 0
0
iex(5)> _x
warning: the underscored variable "_x" is used after being set. A leading underscore indicates that the value of the variable should be ignored. If this is intended please rename the variable to remove the underscore
  iex:5

0
iex(6)> _ = 1
1
iex(7)> _
** (CompileError) iex:7: invalid use of _. "_" represents a value to be ignored in a pattern and cannot be used in expressions

iex(7)> defmodule Sum do
...(7)> def up(list, accumulator \\ 0)
...(7)> def up([], accumulator), do: accumulator
...(7)> def up([head | tail], accumulator),
...(7)> do: up(tail, head + accumulator)
...(7)> end
{:module, Sum,
 <<70, 79, 82, 49, 0, 0, 5, 212, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 134,
   0, 0, 0, 15, 10, 69, 108, 105, 120, 105, 114, 46, 83, 117, 109, 8, 95, 95,
   105, 110, 102, 111, 95, 95, 10, 97, 116, ...>>, {:up, 2}}
iex(8)> Sum.up([1, 2, 3])
6
iex(9)> Sum.up([4, 5], 6)
15
iex(10)> defmodule Sum do
...(10)> def square([]), do: []
...(10)> def square([head | tail]), do:
...(10)> [head * head | square(tail)]
...(10)> end
warning: redefining module Sum (current version defined in memory)
  iex:10

{:module, Sum,
 <<70, 79, 82, 49, 0, 0, 5, 40, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 138,
   0, 0, 0, 15, 10, 69, 108, 105, 120, 105, 114, 46, 83, 117, 109, 8, 95, 95,
   105, 110, 102, 111, 95, 95, 10, 97, 116, ...>>, {:square, 1}}
iex(11)> Sum.square([1, 2, 3])
[1, 4, 9]
iex(12)> Enum.reduce([1, 2, 3], 0, fn(x, acc) -> x + acc end)
6
iex(13)> Enum.map([1, 2, 3], fn(x) -> x * x end)
[1, 4, 9]
iex(14)> Enum.reduce([1, 2, 3], 0, &+/2)
6
iex(15)> Enum.map([1, 2, 3], &(&1 * &1))
[1, 4, 9]
iex(16)> 
```

# まとめ
何かの役に立てばと。
2023.6.20 プログラミングメモ Flutter

Flutter アプリ編
画面遷移（途中）

ソースコード
●first_page

import 'package:a/second_page.dart';
import 'package:flutter/material.dart';

class FirstPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          backgroundColor: Colors.pink,
          title: const Text('ファースト'),
        ),

      body: Center(
        child: Column(
          children: <Widget>[
            const Text(
            'Hello World'
          ),
            ElevatedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(builder: (context) => SecondPage()),
                );
              },
              child: const Text("画面遷移"),
            )
            ]
          )
      )
    );
  }
}

●second_page

import 'package:flutter/material.dart';

class SecondPage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          backgroundColor: Colors.orange,
          title: const Text('セカンド'),
        ),

        body: Center(
            child: Column(
                children: <Widget>[
                  const Text(
                      'ようこそ！'
                  ),
                  ElevatedButton(
                    onPressed: () {
                      Navigator.pop(context);
                    },
                    child: const Text("戻る"),
                  )
                ]
            )
        )
    );
  }
}

![画面遷移1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3388746/10f66c08-7c22-024f-6e5a-a2bb51af1288.png)
![画面遷移2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3388746/0e3a739f-5d98-9b6b-73c3-8ca07cb96aee.png)


●背景色の変更

色の指定
①Colors.fromRGB0(RGB透明度)
②Color(16進数カラーコード)
③Colors.色の名前,

②を使用してみたがコードによっては認識しなかったので？
③を使用した。

 return Scaffoldに追加

   return Scaffold(
      backgroundColor: Color.fromRGBO(168, 236, 255, 1),
        appBar: AppBar(
          backgroundColor: Colors.orange,
          title: const Text('セカンド'),
        ),

https://www.choge-blog.com/programming/fluttercolorrgb/

●エラーが出たところ
エラー内容
No Directionality widget found.

方向性ウィジェットが見つかりません。
ウィジェットの方向がわかりません。

MaterialAppで囲うと起動した。

ソースコード

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    (F)return MaterialApp(
        home: Scaffold(
          appBar: AppBar(
            backgroundColor: Colors.pink,
            title: const Text('ファースト'),
          ),

          body: Center(
              child: Column(
                  children: <Widget>[
                    const Text(
                        'Hello World'
                    ),
                    ElevatedButton(
                      onPressed: (){},

                      child: const Text("画面遷移"),
                    )
                    ]
                )
            )
          )
      );
    }
  }

https://qiita.com/nichiyoshi/items/f63fff2a051f87bd58ad
「Easy Cipher」ksnctf Writeup 

# 問題文
>EBG KVVV vf n fvzcyr yrggre fhofgvghgvba pvcure gung ercynprf n yrggre jvgu gur yrggre KVVV yrggref nsgre vg va gur nycunorg. EBG KVVV vf na rknzcyr bs gur Pnrfne pvcure, qrirybcrq va napvrag Ebzr. Synt vf SYNTFjmtkOWFNZdjkkNH. Vafreg na haqrefpber vzzrqvngryl nsgre SYNT.

# 解法
シーザー暗号です。
シーザー暗号は決まった文字数分アルファベットをずらして暗号化を行います。
下記ページのシーザー暗号解読機を利用します。

http://www.net.c.dendai.ac.jp/crypto/caesar2.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576161/87afcb1c-3830-1963-ec2e-c4fdbb18b12c.png)
`key=13`のときに意味の有りそうな文字列が復号されました。
テキストエディタに貼り付けて確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576161/f65397b1-fbb7-644c-6359-d6b2e79a0aa5.png)
フラグがありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/576161/321f6a9c-5cb7-31c2-17dd-d383016f4975.png)
やったね

# 参考
https://ja.wikipedia.org/wiki/ROT13
【Rails】プレビュー機能の実装

投稿する前に画像を表示できるようにしたいので、プレビュー機能を追加実装する。
プレビュー機能は見た目に動きをつける機能であるため、JavaScriptを使用して実装していく！


# 完成画面
[![Image from Gyazo](https://i.gyazo.com/7623fcb7e72f9e75362ad9d963211a63.png)](https://gyazo.com/7623fcb7e72f9e75362ad9d963211a63)


# 下準備
- app/javascriptの中に、preview.jsというファイルを新規作成する。
- application.jsでpreview.jsを読み込む記述する。
- プレビュー画像を表示したい場所をビューファイルに指定する。

```javascript:preview.js

// 新規投稿・編集ページでのみ、preview.jsが動作するように設定する

document.addEventListener('DOMContentLoaded', function(){
  // 新規投稿・編集ページのフォームを取得
  const postForm = document.getElementById('new_post'); //form_withのid
  // プレビューを表示するためのスペースを取得
  const previewList = document.getElementById('previews'); //プレビュー画像を表示する場所を追加したid
  // 新規投稿・編集ページのフォームがないならここで終了。「!」は論理否定演算子。
  if (!postForm) return null;
  console.log("preview.jsが読み込まれました");
});


```

```Ruby:_form.html.erb
#プレビュー画像を表示させる設定→<div id="previews"></div>で指定

<%= form_with model: @post, id: 'new_post', local: true do |f| %>
<%= render 'shared/error_messages', model: f.object %>
  <div class="message-field">
    <%= f.text_field :text, placeholder: 'type a message' %>
  </div>
  <div class="image-field">
    <div id="previews"></div>
    <div class="click-upload">
      <%= f.file_field :image %>
    </div>
  </div>
  <div class="submit-btn">
    <%= f.submit '送信' %>
  </div>
<% end %>


```

# プレビュー機能実装
- input要素（「ファイルを選択」ボタン）の値に変更があった場合、関数を発火させる
- 値の変更があった要素から、画像の情報を取得する
- 取得した画像情報のURLを生成する
- 取得した画像情報をブラウザへ表示するために、「HTMLの要素」をJavaScript側で生成する

```javascript:preview.js
document.addEventListener('DOMContentLoaded', function(){
  // 新規投稿・編集ページのフォームを取得
  const postForm = document.getElementById('new_post');
  // プレビューを表示するためのスペースを取得
  const previewList = document.getElementById('previews');
  // 新規投稿・編集ページのフォームがないならここで終了。「!」は論理否定演算子。
  if (!postForm) return null;

  // input要素を取得。name情報は検証ツールから確認すること！！
  const fileField = document.querySelector('input[type="file"][name="post[image]"]');
  // input要素で値の変化が起きた際に呼び出される関数
  fileField.addEventListener('change', function(e){
  // 古いプレビューが存在する場合は削除(最後に記述する)
  const alreadyPreview = document.querySelector('.preview');
  if (alreadyPreview) {
    alreadyPreview.remove();
  };
  // 取得した画像ファイルの情報は、変数fileに格納する
  const file = e.target.files[0];
  // 取得した画像情報のURLを生成(生成されたURLはblobという変数に代入)
  const blob = window.URL.createObjectURL(file);
  // 画像を表示するためのdiv要素を生成
  const previewWrapper = document.createElement('div');
  previewWrapper.setAttribute('class', 'preview');
  // 表示する画像を生成
  const previewImage = document.createElement('img');
  previewImage.setAttribute('class', 'preview-image');
  // setAttributeメソッドを用いて生成したimg要素のsrc属性へ変数blobを設定する
  previewImage.setAttribute('src', blob);
　// 生成したHTMLの要素をブラウザに表示させる
  previewWrapper.appendChild(previewImage);
  previewList.appendChild(previewWrapper);
  });
});

```


# プレビュー画像のサイズをCSSで調整する
最後に画像サイズを指定したサイズ内に収まるように調整して完成！！


max-width: 100px;
max-height: 100px;

max-を使用すると、画像が100ピクセルを超える場合でも、指定したサイズの枠内に画像が表示されるようになるよ。
RailsのproductionモードでAWSのヘルスチェックがUnhealthyになる

## エラー内容

Railsで開発したAPIをproductionモードでEC2に配置し、ELBで冗長化して動作確認をしていたのですが、ヘルスチェックの結果がUnhealthyになってしまいます。
![スクリーンショット 2023-06-24 165731.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3340928/38910a25-76a3-fefd-f253-32221e5c80e7.png)


サーバーのログを確認すると、下記のログがたくさん吐かれていました。
```bash
... "GET / HTTP/1.1" 404 0 "-" "ELB-HealthChecker/2.0" "-"
```


## 原因
Railsはdevelopmentモードだとルートパスが定義されていなくてもウェルカムページが表示されますが、productionモードだと明示的にルートパスを指定しないと404エラーになります。

そして、ヘルスチェックの対象のパスがデフォルトの`/`のままだったので、ヘルスチェックに対して404エラーが返されてUnhealthyになってしまうといった具合のようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3340928/d2120795-f929-1d3c-1545-93f597565ece.png)


## 対策

ヘルスチェックのHTTPリクエストに対して、ステータスコード200（成功）を返すエンドポイントを定義しました。

ヘルスチェックの設定でカスタムパスを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3340928/70c3c3f8-1dad-7629-ebbb-bb059e5a9433.png)

`routes.rb`に上記のヘルスチェックに対応するルートを追加します。
`/healthcheck`へのGETリクエストに対して常にステータスコード200（成功）と空のヘッダー、空のボディを返します。
```ruby:config/routes.rb
Rails.application.routes.draw do
  get '/healthcheck', to: proc { [200, {}, ['']] }
end
```

これでヘルスチェックに対してアプリケーションが稼働していることを示す応答を返せます。
```bash
... "GET /healthcheck HTTP/1.1" 200 5 "-" "ELB-HealthChecker/2.0" "-"
```

無事にHealthyになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3340928/b502a9ce-253f-7472-7cdc-6712c5b978b7.png)

## あとがき
今回の事象は運用上そのままでも問題ないかもしれませんが、実際にサーバーに異常があった際にエラーの切り分けをするためにもなるべくHealthyの状態にしておいた方がいいと思ったので対策しました。
他にいいアプローチがあればぜひご教授いただきたいです。
僕の考えた最強の例示用電話番号

## 結論
0184-18-4184

## 理由
例示用の要件として以下を想定し、これらを満たす番号を考えました。
* 何を表しているかわかる
* 例示であるとわかる
* 誤って使っても第三者に悪影響がない

詳しく見ていきましょう。

### 何を表しているかわかる
例示用としてはそれが何を表しているかわかる必要があります。
0184-18-4184　は一見して(国内の)固定電話番号のように見えたと思います。
それは固定電話の電話番号の仕様に沿っているからです。存在しないことを確実にするために英字を含めると電話番号らしさがなくなってしまいますよね。

ちなみに市外局番の0184は実在します、秋田県にかほ市、由利本荘市らしいです。市外局番でバリデーションしていても通りますね。

### 例示であるとわかる
この番号をハイフン抜きにしてみると0184184184と、0のあとは184が連続しています。恣意的で実在し無さそうな感じがありませんか？

### 誤って使っても第三者に悪影響がない
ここが大事なところです。もし実在すると第三者に悪影響が出てしまいます。
なので実在せず、今後も使われることがなく、市外局番を抜いてもかかることはない(はず)の番号にしました。その理由は以下の通りです。

1から始まる3桁の番号(以下1XY番号)は特別な用途で使われています。なので市内局番が1で始まることはあり得ません。
じゃあ1で始まれば何でもいいかというとそんなことはありません。市外局番を外して緊急通報につながってしまっては大問題です。
また、使われていない1XY番号は今後も使われない保証はないので避けた方がいいでしょう。現存していて使っても特に問題ないがいいですね。

184は発信者番号通知拒否というものです。電話をかけると相手先に電話番号が表示されますが、それを拒否するものです。電話番号の前に184を付けると通知しなくなります。
184に続けて実在する電話番号をダイヤルするとそこに非通知でかけてしまいますが、184を続けているのでどこにもかからないはずです。(試してないです)

## 参考
https://www.soumu.go.jp/main_sosiki/joho_tsusin/top/tel_number/q_and_a.html#q2

https://www.soumu.go.jp/main_sosiki/joho_tsusin/policyreports/japanese/misc/bangou3.html

https://www.soumu.go.jp/main_content/000697543.xls

## おわりに
example.com ってありますよね。[ドメイン名の例示のために予約されている](https://ja.wikipedia.org/wiki/Example.com)アレです。

それの電話番号版を探してみたんですが見当たりませんでした。そこでいい感じのものを考えてみた結果がこれです。
もっといいのがあればコメントお願いします。
[Power Automate]　タイムゾーンの扱い、タイムゾーンの変換

[基本]フォーマット
yyyy-MM-ddTHH:mm:ssZ
　末尾にZが付いているのは標準時の証。MMやHHは大文字だよ注意して。

Zが無ければローカル時間だが、どのタイムゾーンかは情報がない（別の場所で設定する）。

[実例]
延期期限を設定し、6/29に動作するタイマーを組み込んだ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3476406/516751a3-ac5e-95f7-c757-e87a5c3cb096.png)

遅延期限は標準時（UTC）でしか受け付けてくれない。そこでタイムゾーンの変換を利用する。
2023-06-29T09:00:00　から（Zがない、これはローカル時間だ）
yyyy-MM-ddTHH:mm:ssZ　出力書式を指定（標準的なやつ）
2023-06-29T00:00:00Z　に変換。（Z付き標準時、日本だと9:00）

うまく動作しました。
有名企業のエンジニアの平均年収をランキングにしてみた

![engineer-banner.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3456084/70cfd6f0-616d-f8d4-69f0-ba189dde29dc.jpeg)

有名企業のエンジニアの平均年収とかってどのくらいだろう？と気になったのでまとめてみました
## 企業のエンジニアの平均年収・中央値年収
全87社の大ボリュームなので、ぜひ参考にしてください！
<br>
<script defer class="speakerdeck-embed" data-id="476ac7a2fd6b47099f114633beee5c25" data-ratio="0.666666666666667" src="//speakerdeck.com/assets/embed.js"></script>

<br>


▼Twitterでも発信しています
https://twitter.com/issueissue4
▼エンジニア向け案件獲得プラットフォーム
https://i-ssue.com/users/signup

■参考元
https://project-comp.com/
https://www.vorkers.com/company_answer.php?m_id=a0910000000Fr7M&q_no=2
https://www.jobdirect.jp/entry/2016/10/29/184100
https://opensalary.jp/roles/software-engineer
ABC302 - A - Attack 自己解法

# 問題
https://atcoder.jp/contests/abc302/tasks/abc302_a

# 考察
何回攻撃すれば敵を倒せるか求めてくださいという問題です。
単純に相手の体力$A$を、1回の攻撃で減らせる体力の値$B$で割れば答えが求めれそうな気がします。
$A ÷ B$をするだけでは、体力が余ってしまうことがあるので、小数点を繰り上げるようにしましょう。
今回の問題をC++で解く場合、下記の書き方をすれば小数点を繰り上げた結果を求めることができます。
```.cpp
(A + B - 1) / B
```

1点注意があります。$A$も$B$も$10^{18}$まで値をとります。C++の場合、変数にintをもちいると入力の時点でオーバーフローを起こしWAとなります。`long long`型などで格納するなどの対応を取りましょう。この件についてはサンプルケースで気がつけるようになっていました。提出前にはサンプルケースが通っているか事前に確認するのもWAを起こさないコツの1つです。


# 提出コード(コンテスト後)

https://atcoder.jp/contests/abc302/submissions/41617894

ご不明点などがあれば教えていただけると幸いです。

# 参考

https://qiita.com/hryshtk/items/b848ed3bd78f940ac5af
【Python】指定されたディレクトリ内のすべてのシェルスクリプトファイルに特定の行を追加する方法

# 概要
- 指定されたディレクトリにある全てのスクリプトファイルの〇〇行目に特定の行を追加するコードを紹介します。

# サンプルコード解説
- 以下、指定されたディレクトリにある全てのスクリプトファイル(.sh)の14行目に`"request_id": "${RANDOM_NO}",`を追加するPythonコードです。

```py
import os

def add_line_to_scripts(script_directory):
    script_files = sorted([f for f in os.listdir(script_directory) if f.endswith('.sh')])

    for script_file in script_files:
        script_path = os.path.join(script_directory, script_file)
        lines = []

        with open(script_path, 'r') as f:
            lines = f.readlines()

        lines.insert(13, '\t"request_id": "${RANDOM_NO}",\n')

        with open(script_path, 'w') as f:
            f.writelines(lines)

# スクリプトファイルが格納されているディレクトリを指定
script_directory = 'response_json_files'

add_line_to_scripts(script_directory)
```

### `add_line_to_scripts`関数について
- `sorted()`関数は、リスト内の要素を昇順にソートする（スクリプトファイルを順番に処理するため）
- `os.listdir`関数を使用して、指定されたディレクトリ内のファイルのリストを取得する
    - `endswith('.sh')`により、`.sh`で終わるファイルのみを処理対象とする
- `for`ループでスクリプトファイル1つずつ、以下を処理
    - `os.path.join`関数を使用して、ディレクトリパスとファイル名を結合し、スクリプトファイルのフルパスを作成
    - スクリプトファイルを読み込み専用モードで開き、`readlines`メソッドを使用して各行をリストとして取得（`readlines`メソッドは、テキストファイルからすべての行を読み込んでリストとして返す）
    - 取得した行のリストの指定された位置（13番目=14行目）に、特定の行を挿入
    - 書き込みモードでファイルを開き、`writelines`メソッドを使用して行のリストをファイルに書き込む（`writelines`メソッドは、リスト内の各要素をファイルに直接書き込む）
Dr.Sum/Datalizerを使用して予実管理レポートを作成する方法

## はじめに
本記事では、ウイングアーク社のBIツールであるDatalizerを使用して、予実管理レポートを作成する際のやり方を紹介します。やり方の案を概要として紹介するところまでの記事なので、具体的な実装方法は公式マニュアルを参照いただければと思います。予算データと実績データの２つのデータセットを組み合わせたレポート作成には、以下の２つの方法があります。それぞれの方法の特徴や選択肢についても比較します。

## Datalizerとは
[Dr.Sum]とはウイングアーク社のBIツール・データベースであり、DatalizerはDr.SumのデータをブラウザやExcel上でレポートとして表示することができるツールです。レポートは明細表や集計表などの表形式で構造化されたデータを表示することが可能です。

## 予算データと実績データの掛け合わせたレポートの作成案
Datalizerでは基本の定義ファイル（レポート）で指定可能なデータソースは１つだけなので、予算データと実績データの２つの異なるデータセットを組み合わせた予実管理レポートを作成するには工夫が必要です。
作成方法としては以下の２つの案があります。

### 1. 予算データと実績データを1つのテーブルに集める方法
この方法では、Dr.Sumにデータを取り込む際に、予算データと実績データを1つのテーブルにまとめます。
予算データと実績データを別のテーブルに取り込むのではなく、１つのテーブルに取込してレポートで集計をかけます。

:::note info
補足
- テーブルに登録するデータは、データセットごとにレコードを分けて作成します。
- データが取得できないカラムは空や0にしておきます。
- データセットの種類を識別できる区分やコードなどを付加すると、後でデータを操作する際に便利です。
:::

- Dr.Sumテーブルのイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/f55ccf7b-4e4f-e1b1-425c-3dbe532764d1.png)

- Datalizerレポートのイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/12bc1110-a949-c2a2-fb8a-6b17978a54f2.png)

### 2. マルチビュー（結合表）を使用してレポートをまとめる方法
この方法では、Datalizerのマルチビュー（結合表）機能を使用して、2つのレポートを1つのレポートにまとめます。

:::note info
補足
- 予算データと実績データをそれぞれ別のテーブルに分けて作成します。
- レポート（集計定義ファイル）も予算データと実績データそれぞれで作成し、更にそれらを1つにまとめるマルチ集計定義ファイルを作成します。
- Datalizerのマルチビュー（結合表）は、[マニュアル](https://cs.wingarc.com/manual/drsum/5.6/ja/UUID-2b4ff349-60c7-c8a9-0f63-666e7631ec3f.html)（リンク先はver5.6）を参照して作成方法を確認してください。
:::

- Dr.Sumテーブルのイメージ
＜予算データテーブル＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/5dcf128d-2eff-5596-91e7-e9f36852a52c.png)
＜実績データテーブル＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/8ecfa95c-0451-2e01-4cdf-3b91a6bad3f5.png)

- Datalizerレポートのイメージ
＜予算レポート（クロス集計表）＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/9a6eeb37-0c4a-3dc1-ce88-a782e04808f2.png)
＜実績レポート（クロス集計表）＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/c3255142-c9a5-4717-94ef-80ee0d7ebb7e.png)
＜予実管理レポート（マルチ集計表・結合表）＞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780637/22628d8e-6bb5-40d0-9d44-895851d6d1e4.png)

## 注意点と特徴

- 予算データと実績データを1つのテーブルに集める方法
データ連携元で処理を作成したり手作業などでデータをまとめる対応が必要ですが、予めデータをまとめておくことでレポート表示時のパフォーマンス向上が期待できます。

- マルチビュー（結合表）を使用してレポートをまとめる方法
Datalizer側でデータの結合やまとめる処理を行うため、データ連携元のシステム側で処理を作成したり手作業でまとめるといった手間は省けます。一方で、レポート表示時の処理は少しパフォーマンスが落ちる懸念はあります（データ量にもよるため一概に落ちるとは言えない）。

## まとめ
本記事では、Datalizerを使用して予算データと実績データを組み合わせた予実管理レポートを作成する方法について解説しました。これらの方法は、予実管理だけでなく異なる複数のデータソースを組み合わせて集計したい場合に応用できます。データ量やサーバスペックなどの環境面やデータ連携元での対応可否などの要件を考慮し、最適な方法を検討してみてください。
GCCのテストスイートであるDejaGnuを実行する。

GCCのテストスイートにDejaGnuというものがあります。コミット戦略としては、コードを改変して、DejaGnuのテストコードを追加するという方法を使っているようです。

では、DejaGnuの実行方法を書いていきます。

まず、GCCのクローンをします。

```
$ git clone --depth=1  https://github.com/gcc-mirror/gcc.git`
```

--depth=1 により、最新のコードのみをクローンします。

テストスイートのフォルダまで移動します

```
cd gcc/gcc/testsuite
```

以下のコマンドで実行します

```
runtest --tool gcc
```

以下のように実行できました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53172/65280a5b-7a31-d24a-d9ba-ae195098bf96.png)


同じディレクトリで新たにターミナルを開いて、以下のコマンドでログが見れます。

```
tail -f gcc.log
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/53172/fbded1c9-aaa0-1247-353c-3dc69ea68864.png)

以下のサイトを参考にさせていただきました。

https://gcc.gnu.org/legacy-ml/gcc-patches/2006-11/msg01241.html

special thanks
Takahashi Akari
OBSがクラッシュしてmp4ファイルが破損したときに復旧できるかもしれない方法

# はじめに
OBS等のソフトでmp4録画をしていたときにソフトがクラッシュしてファイルが破損した場合の復旧方法を紹介します。
VLCで開けない場合でもこの方法で復旧できることが多いです。

使用するソフトはuntruncです。
今回はWindows環境で簡単に復旧することが目的なため、本家のuntruncではなくWindows版ビルドの存在するforkの方を使用します。

https://github.com/anthwlock/untrunc

# 方法
1. 最新のuntruncをダウンロード
[こちら](https://github.com/anthwlock/untrunc/releases/tag/latest)から最新のuntruncをダウンロードしてください。
基本的に`untrunc_x64.zip`をダウンロードすれば大丈夫です。
場合によってはffmpegのインストールが必要になるそうです（[Readme](https://github.com/anthwlock/untrunc#building)参照）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320192/404fb9ad-1642-4fb7-d3f1-55e827163288.png)

1. ダウンロードしたファイルを展開
適当なディレクトリに`untrunc_x64`のフォルダを展開してください。
今回はデスクトップに展開しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320192/dd4811bc-0f28-69bf-c5b0-ea1a2098c06d.png)

1. untrunc-guiを開く
`untrunc-gui.exe`を開いてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320192/aa83d63a-5795-1f61-dbb8-79bfdb293da3.png)

1. 動画を選ぶ
`reference file` : **正常に再生できる**動画
録画が失敗したときの録画の設定のまま数秒録画したものを用意すれば大丈夫です。
`truncated file` : **破損した**動画
破損した修復したい動画を設定してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320192/01ce3c40-e4f3-e07b-c5bb-7823487811be.png)


1. 修復する
右下の`Repair`ボタンを押してください。
動画の長さにもよりますが、数秒から数分で動画の修復が完了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320192/87dbf1b1-dcc1-f576-6974-823c7ab3579d.png)

1. 修復されたファイルを開く
破損したファイルのあったフォルダに`{破損したファイル名}_fixed.mp4`というファイルが作成されます。
このファイルが正常に再生できれば成功です
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320192/3cddf599-4a66-c257-39d4-0315cb69afde.png)
【kintone】レコード番号を他項目で使用する方法

## はじめに
kintoneでレコード番号を他の項目で使用する方法を紹介します。
計算式を使えば使用できるのではと考えたのですが、kintoneの仕様上、使用ができないようです:disappointed_relieved:
レコード番号はデータを新規登録する際に発行され、変更されることはないため、新規作成の場合にのみ取得ができれば問題ないです。

この対応をしたかった背景として、ルックアップを使用する際に一意となるようにデータを作りたかっため、「レコード番号 + 他の項目」 という構造となるように検討しました。

## 処理の概要
1. 新規登録した際に作成されたレコード番号を取得する。
2. データを「レコード番号 + 他の項目」となるように加工する。
3. 取得したレコード番号を基にデータを更新するAPIを呼び出す。

## コード
```javascript
  // 新規保存成功イベント
  kintone.events.on(['app.record.create.submit.success'], function (event) {
    const record = event.record;
    const recordId = record.$id.value;
    const productName = record['product_name'].value;
    const productNumber = recordId + productName;

    const param = {
      app: 更新するアプリのID,
      id: recordId,
      record: {
        product_name: {
          value: productNumber
        },
      }
    };

    // kintoneAPIの呼び出し
    return kintone.api(kintone.api.url('/k/v1/record', true), 'PUT', param);
  });
```

## さいごに
レコード番号を再利用したい場合に参考になれば幸いです:information_desk_person_tone1:
【iOS版】ONLYOFFICE Documents v7.4：ドキュメントの保護、アカウントメニューの再設計、テキストの垂直配置

iOS用の無料ONLYOFFICE文書管理・編集アプリの新バージョンが登場しました。アップデートの詳細とアプリのダウンロードは以下の記事をご覧ください。

## ONLYOFFICE Documentsについて

[ONLYOFFICE Documents](http://www.onlyoffice.com/ja/office-for-ios.aspx?utm_source=qiita&utm_medium=article&utm_campaign=ios_74)は、モバイルデバイスからオフィスドキュメントの管理、作成、編集、コラボレーションを可能にする、携帯電話やタブレットに適したモバイルアプリです。デバイスのファイルを使ってローカルで作業することも、ONLYOFFICEのクラウドソリューション（ONLYOFFICE Personal、ONLYOFFICE Workspace、ONLYOFFICE DocSpace）やNextcloud、ownCloudなどの共有サービスに接続して作業することもできます。

## 新機能

バージョン7.4では、作業をより簡単に、より安全にする新しい改良が加えられました。アプリで利用可能な新機能を見てみましょう。

### ドキュメントの保護

新しいドキュメント保護メニューを使用して、編集からドキュメントを保護し、ファイルのコンテンツに対して特定のアクションを許可します。保護モードで許可されるアクションには、閲覧のみ、変更の追跡、フォームへの入力、コメントが含まれます。オプションでパスワードを追加して、信頼できるユーザーだけが文書の保護を解除し、完全なアクセスを取得できるようにすることもできます。

文書の保護機能は、ファイルメニュー >> 「保護」 >> 「文書の保護」で検索します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655664/1a3c39ee-f0bf-92d5-b17a-dc2f7f2abf91.png)


### アカウントメニューのデザイン変更

今後、ホーム画面から利用できるアカウントメニューで、接続アカウント間のナビゲーションがより簡単になりました。

アカウントアイコンをタップすると、アカウントリストが開きます。表示されるポップアップメニューでは、利用可能なすべてのアカウントを確認したり、アカウントを切り替えたり、アカウントの追加や削除を簡単に行うことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655664/31db2135-639b-432e-5405-bbdee40108d5.png)


### テキストの垂直配置

これからは、オートシェイプやテーブルの中でテキストを垂直に揃えることができます。

整列設定にアクセスするには、テキストを選択し、上部パネルの鉛筆アイコンの後ろにあるテキストメニューを開くか、コンテキストメニューを呼び出し、「段落」 >> 「テキスト」をタップします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2655664/72c033a4-da17-73ec-f851-558ae0fc2506.png)


### ONLYOFFICE DocSpaceへのドキュメント連携

ONLYOFFICE Documentsアプリは、新しいクラウド共有・コラボレーションシステム[ONLYOFFICE DocSpace](http://www.onlyoffice.com/ja/docspace.aspx?utm_source=qiita&utm_medium=social&utm_campaign=ios_74)に接続できます。ルーム内のドキュメントにアクセスし、チームや外部ユーザーと編集やコラボレーションを行うことができます。

ONLYOFFICE DocSpaceは無料のスタートアッププランで小規模チームや個人ユーザーに最適で、スケーラブルでカスタマイズ可能なビジネスバージョンでどんなビジネスにもフィットします。

## アプリを入手する

ONLYOFFICE Documentsを初めてご利用になる方は、この機会にモバイルドキュメントでの作業をより簡単にしましょう。Documentsを使えば、クラウドとローカルのすべてのファイルが手元にあり、編集、共同編集、変換、共有が簡単にできます。

[**APP STOREで見る**](https://apps.apple.com/us/app/onlyoffice-documents/id944896972)

皆様のご意見は私たちにとって貴重なものです。ご質問やご意見がございましたら、App Storeでご意見をお寄せいただくか、下記のコメント欄にご記入ください。

## お役立ちリンク
* [ONLYOFFICE DocumentsのApp Storeページ](https://apps.apple.com/us/app/onlyoffice-documents/id944896972)
* [ONLYOFFICE Documents 5.7 for Android：新機能](https://www.onlyoffice.com/blog/ja/2023/06/android-onlyoffice-documents-5-7-docspace-ux?utm_source=qiita&utm_medium=article&utm_campaign=ios_74)
* [ONLYOFFICE Docs 7.4：新機能](https://www.onlyoffice.com/blog/ja/2023/06/onlyoffice-docs-7-4?utm_source=qiita&utm_medium=article&utm_campaign=ios_74)
超初心者OK！WordPressブログの始め方と初期設定の手順

この記事では、WordPressブログの始め方について、ブログ超・初心者でも理解できるように優しく開設しています。ブログで稼ぎたいけど、どうやて初めて良いかわからないという方は、ぜひチェックしてみてください。

https://tomiyoshi-blog.com/wordpress-start/
JavaScriptを使用して画面遷移を行う方法

忘れた時用に
JavaScriptを使ってWebページの画面遷移を実現する方法について記載します。

1. `location.href`を使用する方法

```javascript
// 現在のページを別のURLに遷移する
window.location.href = "https://example.com/new-page";
```

上記の例では、`window.location.href`に遷移先のURLを設定することで、現在のページを別のURLに遷移します。この方法はシンプルで使いやすいです。

2. `window.location.replace()`を使用する方法

```javascript
// 現在のページを別のURLに置き換える
window.location.replace("https://example.com/new-page");
```

上記の例では、`window.location.replace()`を使用して現在のページを別のURLに置き換えます。この方法では、ブラウザの履歴に遷移前のページが残らないため、遷移後に「戻る」ボタンを押しても元のページに戻ることはありません。

3. `window.location.assign()`を使用する方法

```javascript
// 現在のページを別のURLに割り当てる
window.location.assign("https://example.com/new-page");
```

上記の例では、`window.location.assign()`を使用して現在のページを別のURLに割り当てます。この方法では、ブラウザの履歴に遷移前のページが残るため、「戻る」ボタンを押すと元のページに戻ることができます。

以上
Node.jsで複数回の非同期処理をするときはPromise.allを使うと早く終わる

# はじめに
非同期処理を複数回実行する時は、直列で実行するより並列で実行する方が早く終わるよ、という話
処理によっては直列で実行しないといけない場合はあると思うけど、その必要性が無い場合は並列実行する方が処理速度の恩恵を受けれる。

# プログラム
```js:index.mjs
const sleep = s => new Promise(res => setTimeout(res, s * 1000));

const log = (message) => { console.log(`[${new Date()}] ${message}`); }

const seconds = [3, 4, 5];

const nonUsePromiseAll = async () => {
  log(`nonUsePromiseAll start`);
  for (const second of seconds) {
    await sleep(second);
    log(`nonUsePromiseAll, second: ${second}`);
  }
  log(`nonUsePromiseAll end`);
}

await nonUsePromiseAll();

console.log('------------------');

const usePromiseAll = async () => {
  log(`usePromiseAll start`);
  const promises = seconds.map(async second => {
    await sleep(second);
    log(`usePromiseAll, second: ${second}`);
  })
  await Promise.all(promises)
  log(`usePromiseAll end`);
}

await usePromiseAll();
```

# 実行結果
```
$ node index.mjs
[Thu Jun 29 2023 16:29:48 GMT+0900 (Japan Standard Time)] nonUsePromiseAll start
[Thu Jun 29 2023 16:29:51 GMT+0900 (Japan Standard Time)] nonUsePromiseAll, second: 3
[Thu Jun 29 2023 16:29:55 GMT+0900 (Japan Standard Time)] nonUsePromiseAll, second: 4
[Thu Jun 29 2023 16:30:00 GMT+0900 (Japan Standard Time)] nonUsePromiseAll, second: 5
[Thu Jun 29 2023 16:30:00 GMT+0900 (Japan Standard Time)] nonUsePromiseAll end
------------------
[Thu Jun 29 2023 16:30:00 GMT+0900 (Japan Standard Time)] usePromiseAll start
[Thu Jun 29 2023 16:30:03 GMT+0900 (Japan Standard Time)] usePromiseAll, second: 3
[Thu Jun 29 2023 16:30:04 GMT+0900 (Japan Standard Time)] usePromiseAll, second: 4
[Thu Jun 29 2023 16:30:05 GMT+0900 (Japan Standard Time)] usePromiseAll, second: 5
[Thu Jun 29 2023 16:30:05 GMT+0900 (Japan Standard Time)] usePromiseAll end
```

直列実行は12秒かかるけど、``Promise.all``を使うと並列実行になって5秒で終わる

実行イメージはこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/4113c712-7b40-dc29-9fd6-40bd3bc2e23f.png)


# 結論
非同期処理において直列実行の必要性が無い場合は``Promise.all``を積極的に使うといいかも
Rubyで`0 0`を数値として出力する

## アジェンダ
基本的なRubyの記法を思い出すためにキャッチをしており、その内容の一部として、特定の数値（この場合は`0 0`のゼロ、半角スペース、ゼロ）を出力する2つの出力方法を備忘録的に記述致します。

## 数値を同じ行に出力する
数値を同じ行に出力するためには、`print`メソッドや文字列内挿入（interpolation）を使う選択肢があります。

例えば、以下の`print`メソッドを使ったコードでは、`0`と`0`をスペースで区切って同じ行に出力します。

```ruby
print 0, " ", 0
```

また、Rubyでは`#{}`を使った文字列内挿入が可能なため、以下のような方法でも同じ結果を得られます。

```ruby
puts "#{0} #{0}"
```

ここで使用している`#{}`内には任意のRubyの式を記述することができ、その評価結果が文字列に変換されて挿入されます。

## 余談:数値を別々の行に出力する
余談にはなりますが、当然Rubyで数値を別々の行に出力するためには、`puts`メソッドを使います。例えば、以下のコードでは`0`と`0`を別々の行に出力します。

```ruby
puts 0, 0
```
ざっくりインボイス制度

# はじめに
会社勤めのエンジニアには直接関係ない話かもしれませんが、ざっくりと知っておいても損はないだろうということでインボイス制度に関して調べていたのですが、事情により日の目を見ることなく埋もれていきそうだったので、ここで公開させていただきます。

# まず「インボイス」とは？
- インボイス（適格請求書）
    - 売手が買手に対して、正確な適用税率や消費税額等を伝えるもの
    - 現行の「区分記載請求書」に「登録番号」「適用税率」及び「消費税額等」の記載が追加された書類やデータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/2fe3e695-adaa-5d88-9a08-7a9de5a73a45.png)
https://www.freee.co.jp/kb/static/92fd5651721a86558f86a507b6b743b3/ed5f3/invoice-96-1.png

# では「インボイス制度」とは？
- インボイス制度（適格請求書保存方式等）
    - 複数税率の導入後、消費税の仕入税額控除の金額を正しく計算するために導入される制度
    - 2023年10月1日スタート
    - 売り手側、買い手側双方に適用

- 単に請求書の様式が変更となるだけではなく、これまで免税事業者であった事業者も含め、大きな影響がある

# インボイス制度導入後の主な変更点は何？
- 仕入税額控除の適用要件が変わる
    - 仕入税額控除：売上時に受け取った消費税額から仕入時に支払った消費税額を差し引いて納税する仕組みのこと
- 区分請求書から適格請求書へ書式が変わる
    - こちらは前述の通り
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/a7b40788-a47c-94b9-3e5b-feb2b38a1d3c.png)
https://www.freee.co.jp/kb/static/32df5b07edbaa791588f60f74a25cc29/2b228/cur-36.png

# インボイス制度導入後の納税する消費税額はどうなるの？
- 適格請求書が発行された場合に納付する消費税額：
```
納付する消費税額 =（売上時に受け取った消費税額）-（仕入や経費にかかった消費税額）
```

- 適格請求書以外の請求書が発行された場合に納付する消費税額：
```
納付する消費税額 = 売上時に受け取った消費税額(*)
```
(*)インボイス制度導入後の一定期間は納税額の軽減措置が適用される

- 以下の組み合わせのパターンがある
    - 売り手
        - 課税事業者（消費税を納税している）
        - 免税事業者（消費税を納税していない）
    - 買い手
        - 課税事業者（消費税を納税している）
        - 免税事業者（消費税を納税していない）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130771/76b5980e-25c4-12aa-16ae-63c0aa133fc3.png)

## 【売り手】課税事業者
- 事前に適格請求書発行事業者への登録が必要
- 適格請求書の発行、保存を行う
- インボイス制度に対応した帳簿の作成や保存を行う

## 【売り手】免税事業者
- 消費税分の価格改定の有無を検討する
    - 買い手（課税事業者）から、消費税分の値引き交渉がある

## 【買い手】課税事業者
- 売り手が課税事業者の場合
    - 受け取った適格請求書を適切に保存する
    - 適格請求書とそれ以外の請求書の管理方法を検討する
- 売り手が免税事業者の場合
    - 簡易課税制度の導入を検討する
    - 必要に応じて取引額の相談を行う
    - 消費税分の値引き交渉

## 【買い手】免税事業者
- 特になし

# ＜参考＞簡易課税制度
- 課税額＝売上にかかる消費税額 － 売上にかかる消費税額 × みなし仕入率

| 事業区分 | みなし仕入率 | 該当する事業 |
|:---:|:---:|:---:|
| 第1種事業 | 90% | 卸売業（他の者から購入した商品をその性質、形状を変更しないで他の事業者に対して販売する事業） |
| 第2種事業 | 80% | 小売業（他の者から購入した商品をその性質、形状を変更しないで他の事業者に対して販売する事業）<br/>農業、林業、漁業（飲食料品の譲渡に係る事業） |
| 第3種事業 | 70% | 農業、林業、漁業（他の者から購入した商品をその性質、形状を変更しないで他の事業者に対して販売する事業）<br/>鉱業、建設業、製造業（製造小売業を含む）<br/>電気業、ガス業、熱供給業および水道業<br/>※第1種事業、第2種事業に該当するものおよび加工賃その他これに類する料金を対価とする役務の提供を除く |
| 第4種事業 | 60% | 第1種事業、第2種事業、第3種事業、第5種事業、第6種事業以外の事業（例：飲食店業など）<br/>※第3種事業から除かれる加工賃その他これに類する料金を対価とする役務の提供を行う事業も第4種事業に該当する |
| 第5種事業 | 50% | 運輸通信業、金融業、保険業、サービス業<br/>※飲食店業に該当する事業を除く<br/>※第1種事業から第3種事業までの事業に該当する事業を除く |
| 第6種事業 | 40% | 不動産業 |

## ただし！
- インボイス制度を機に免税事業者からインボイス発行事業者として課税事業者になった場合に税負担を「売上税額×20％」に軽減できる
    - 対象期間：2023年10月1日（日）～2026年9月30日（水）を含む課税期間

# まとめ
- 正しい請求書（インボイス）でやり取りしましょう
- みんな課税事業者になってね（＝消費税を納めてね）

ということかと（意訳）
Googleスプレッドシートに特殊文字があるとPDFをエクスポートできない

# 結論
Googleスプレッドシートに特殊文字（環境依存文字）があると、PDFをエクスポートできないことがあります。このとき、エラーメッセージも特に表示されないため、原因を特定するのに時間がかかってしまいました。解決の参考にしていただければと思います。

# 内容
「☑︎」という文字が入っているシートを用意してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852882/887d9219-0403-60be-9ea9-4b42453496fe.png)

通常の手順でPDFをエクスポートしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852882/5716ee08-408f-150d-65f0-9e15f77fd840.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852882/1b8b79b3-7146-a10a-72f7-b3103feaad1a.png)

すると、確かに「 **PDFをダウンロードしています** 」と表示されるのですが…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852882/17209b3c-d1b8-2630-c2cb-a498f37a7c14.png)

その後、特に新しいファイルが作成された様子がみられません。（もちろん、実際にエクスポートも成功していない）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852882/80bd5a6b-e262-0bb1-0525-f3dffa1e96b9.png)

そこで、「☑︎」を削除した状態で、再度エクスポートをしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852882/9ad86602-9399-0525-1018-21d10f05bc11.png)

待つこと数秒…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852882/17209b3c-d1b8-2630-c2cb-a498f37a7c14.png)

今度は成功しました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/852882/ece5239b-c317-666f-2bb4-244ba4a29a2c.png)

# まとめ
以上です！今回は「☑︎」を例に挙げましたが、他にも同様の現象が発生する文字は存在すると思います。  
もしPDFをエクスポートできないことがあったとき、シートの中身を確認してみてください！
AWS認定とちょっとモチベの話

# はじめに
最近DOPに合格しました。
経験としてはAWSを実務で触り始めて1年がたったくらいです。
[SAP](https://qiita.com/ogw_t/items/d8ff3ec64deaef1627b6)は半年前に取りました。
日々勉強のクソザコエンジニアです。こんにちわ。

# なんで受けようと思ったの？
半年前にSAP取ったものの、AWSに触れれば触れるほど「なんにもわかってないな」って思うことが増えてました。
もっと勉強しなきゃなーと思いつつも、何か明確な目標を立てないと頑張れないたちでして、その目標にDOPを置いた感じです。
報奨金がもらえるのも大きかったですね。

# 資格ってなんでとるんだっけ？
AIに聞けば綺麗なコードも書いてくれるし、AWSのことは大概教えてくれるし、そんな時代に資格取って意味あるの？
と思って取るのやめようとしたこともありました。

わりとなんでも答えてくれる優秀な相棒だけど、困っている僕を見かねて手を差し伸べてくれるなんてことはないんですよね。
聞かないと答えてくれない。

いかに問いを投げかけるか。
課題を短時間で効率的に解決するには、問いの質が重要なんだと思いました。
問いの抽象度が高いとラリーが多くなって、欲しい答えにたどり着くまでに時間がかかってしまいますよね。
忙しいサラリーマンにとって、1分1秒のロスは致命傷になり得ます。

扱う側のインプットも大切だな、と腹落ちさせて勉強頑張りました。

# どうやって勉強した？
模試解いて、自信のないサービスのBlackBelt見て、TechStockやって、という感じです。
ひたすら問題を解きまくる、間違えた問題や根拠が曖昧な問題は理解するまで何回も解く。
2択まで絞った問題を山勘で正解した後、正解したからとほったらかしにしている人は落ちます。

# どれくらい勉強した？
全体で1か月くらいです。
前準備としてSOAとDVAをそれぞれ1週間くらい勉強して受験、その後2週間の勉強期間を経てDOPを受験しました。
最初の1週間ちょっとはのらりくらりと、最後の5日間くらいはみっちりやりました。

# 受けてみてどうだった？
SAPよりはわかる問題多かったけど、手ごたえとしてはうーんって感じでした。
見直しフラグは今回75問中38問でした。2択までは絞れるけど、、、みたいな問題が多かったです。
SAPの時（75問中52問）と比べると絶望感は薄めでした。（ちゃんと絶望はしています。）

CodeシリーズとConfig、organizationsがかなり出ました。
ハンズオンで学ぶのが一番理解しやすいですが、個人だと限界があるので、徹底的に頭で理解するorもっと問題解きまくるが必要だったかなと思います。
それをやってれば、フラグ20問くらいには抑えられたかもしれませんね。

# 受験後は？
今までの感じ（全て土曜日に受験）だと、当日の18時にはバッジの発行通知が来ていたのでそれくらいにくるかなーと待っていました。
ちなみに14~17時の受験枠でした。
通知翌日の夕方になっても通知が来ないので落ちたーと思ってましたが、18時に認定のマイページ見ると結果が反映されてました。
852点でした。小躍りしました。

18時に結果が出るようになっていて、今回は17時終わりの試験だったので、翌日に回されたのかなーと思います。
すぐ結果が確認できていた時間が懐かしいです。
結果待ちの時間はそわそわしてしまうので勘弁してほしいです。


# これからどうする？
AWS資格だとDatabaseやSecurityのspecialityは取りたいなと思ってます。

日々の業務に慣れてくると、現状維持でもいいかと思ったりもしてしまいます。
AWSのことをもっと知りたい、と思うのと同時に、資格の勉強をすることによって新しいことに触れることがモチベーションにつながったりもします。
合格すると一定の達成感は得られますが、資格を取ることがゴールにならないように、スキルアップの手段として考えていきたいものです。

技術系のかっこいい記事もそろそろ書きたいですね。

おわり。
デジタル庁が公開したイラスト・アイコン素材を VSCode の Draw.io プラグインで使えるようにしたメモ

日頃から構成図や資料中で使用する図などはエクセルやパワポではなく VSCode ＋ [Draw.io](https://marketplace.visualstudio.com/items?itemName=hediet.vscode-drawio) で作成しています。このたびデジタル庁が[イラスト・アイコン素材を公開した](https://www.digital.go.jp/policies/servicedesign/designsystem/Illustration_Icons/)とのことで、早速これをカスタムライブラリとして使用できるようにしました。その時の手順をメモとして残しておきます。

## アイコン素材のダウンロード

[公開ページ](https://www.digital.go.jp/policies/servicedesign/designsystem/Illustration_Icons/) から zip ファイルをダウンロードして展開。`designsystem-assets/icon/png` フォルダにアイコンの png 画像一式、`designsystem-assets/illustration/png` フォルダにイラストの png 画像一式が入っているのでこれを使用。

![スクリーンショット 2023-06-29 16.28.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251261/50f8bf9c-d4cc-89f7-dfd9-0ed099c91d11.png)


##  カスタムライブラリの作成

Draw.io Integration プラグインだけではカスタムライブラリの作成ができないようなので、Web の https://app.diagrams.net/ で作成することに。

今回はローカルデバイス上で、白紙のファイルを新規作成。

![スクリーンショット 2023-06-29 16.31.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251261/109055d7-2895-e31a-eca1-3b8e949197b3.png)

「ファイル」メニューから「新規ライブラリ」→「デバイス」を選択。

![スクリーンショット 2023-06-29 16.30.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251261/5682981e-a0b8-ef99-f863-9634f1ca39b3.png)

ライブラリ作成画面が出てくるので、ファイル名を `designsystem-assets.xml`として、先ほどダウンロードした zip に含まれていたアイコンの png ファイル（designsystem-assets/icon/png/&#042;）およびイラストの S サイズの png ファイル（designsystem-assets/illustration/png/s_&#042;）をすべてドラッグ＆ドロップ。「**Do you want to resize large images to make the application run faster?**」と聞かれたら「サイズ変更」を選択。すべてアップロードできたのち「保存」ボタンを押すと xml ファイルが自動でダウンロードされる。

![スクリーンショット 2023-06-29 16.37.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251261/adcda7f8-4ff9-d4a6-588c-f38220e4253d.png)

適当なフォルダを作って ~/Downloads から移動。

```
% mkdir /Users/xsgk/Documents/vscode-custom-libraries
% mv /Users/xsgk/Downloads/designsystem-assets.xml /Users/xsgk/Documents/vscode-custom-libraries
```

## VSCode の設定

[settings.json を開き](https://qiita.com/y-w/items/614843b259c04bb91495)、以下の設定を新規追加。`file` には保存したパス、`libName` と `entryId` はとりあえず `designsystem-assets` で。他の設定との前後に記述する際にはカンマを忘れないよう。

```
    "hediet.vscode-drawio.customLibraries": [
        {"file": "/Users/xsgk/Documents/vscode-custom-libraries/designsystem-assets.xml",
         "libName": "designsystem-assets",
         "entryId": "designsystem-assets.xml"
        }
    ],
```

## 反映の確認

VSCode 上で適当な .drawio ファイルを作成し、エディタを開くと他のライブラリと並んで `designsystem-assets` が存在。これを展開すると追加したイラストとアイコンが無事表示。

![スクリーンショット 2023-06-29 17.16.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251261/4c26f72e-6d4c-1d93-8878-e3a035f41107.png)


以上、どなたかの参考になれば幸いです。
初めてのIBM i Merlin【IBM i CI/CD編：ビルドタスクを作成してみよう】

# IBM i CI/CD編：この記事でやること
本記事からIBM i MerlinのCI/CDツールで行うことについて書いていきます。

全3章でラインナップはこちら
- ビルドタスクを作成してみよう
- デプロイを作成してみよう
- GitHubと連携させてみよう

今回はビルドタスクの作成方法について記述していきます。

参考
[IBM i Merlin公式マニュアル](https://www.ibm.com/docs/en/merlin/1.0?topic=overview)
[IBM i Merlin Git](https://ibm.github.io/merlin-docs/#/./README)

# IBM i CI/CD セットアップと初期設定
:::note info
ビルド管理者アカウントにログインして行います
:::
Jenkinサーバーの初期化が終わっていることが前提です
[Jenkinsサーバー初期化の手順](https://qiita.com/meo_kawa/private/0c8e376912b7920f48b8)
## タスクの作成
左メニューバーにてタスク管理 -> 新規タスクの作成にて自動化タスクを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/3899a3f7-2217-e238-ab7d-53a7493939f5.png)
参照するGitリポジトリーのURLを入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/88c095b5-466d-ea01-7918-1a946dd0ec28.png)
ビルド・デプロイアクションは用途に合わせて追加します。
ビルド部分はCLコマンドでの実行が可能です。
(今回はテストのCLコマンドを入れています)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/6b71419f-d054-c7a7-7c79-207823728d3e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/622cb4bf-99f2-20e4-3925-f71513093b90.png)

タスク・ダッシュボードにタスクが作成されました。
![スクリーンショット 2023-05-26 18.29.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3212743/8ae6306b-cc00-e4d2-5901-3f0f035cd208.png)
Salesforceでフローを作成しよう～リードの項目更新を起点に自動で「取引開始済み」する～

こんにちは
本橋孝昭です

今回は
・リードの項目を更新したら自動で取引開始済みになり取引先、取引先責任者作成

のフローを作成します
(今回は例としてリード標準項目「評価」が「Hot」になった場合自動で取引開始済みになり取引先、取引先責任者作成をします)


今回の内容はこちらの記事を参考にしました
https://blog.cloudanalogy.com/salesforce-lead-conversion-using-flow/


設定は大きく2つです
1 Apexを作成しよう
2 フローを作成しよう

では、1 Apexを作成しよう　から説明します

## 1 Apexを作成しよう

Apex作成方法は以下の通りです

### ・ステップ１　歯車マーク設定から「開発者コンソール」クリック
### ・ステップ２　File→New→Apex Class　をクリック　名前を付けてOKをクリック

### ・ステップ３　以下のコードを記載し「Save」

```
public class AutoConvertLeads1 {

    @InvocableMethod(label = 'Auto Convert Leads')

    public static void LeadAssign(List<Requests> requestList) {

        LeadStatus CLeadStatus = [SELECT Id, MasterLabel FROM LeadStatus WHERE IsConverted = true LIMIT 1];

        List<Database.LeadConvert> MassLeadconvert = new List<Database.LeadConvert>();

        for (Requests req : requestList) {

            Database.LeadConvert Leadconvert = new Database.LeadConvert();

            Leadconvert.setLeadId(req.LeadId);

            String accountId = req.AccountId; // Assuming you have a field called "Account_ID__c" in the Requests class

            if (accountId != null) {

                Leadconvert.setAccountId(accountId);

            }

            Leadconvert.setConvertedStatus(CLeadStatus.MasterLabel);

            Leadconvert.setDoNotCreateOpportunity(true);

            MassLeadconvert.add(Leadconvert);

        }

        if (!MassLeadconvert.isEmpty()) {

            List<Database.LeadConvertResult> lcr = Database.convertLead(MassLeadconvert);

        }

    }

    public class Requests {

        @InvocableVariable(label = 'LeadId' required = true)

        public Id LeadId;

        @InvocableVariable(label = 'AccountID')

        public String AccountId;

    }

}
```



以上でApexの設定は完了です



## 2 フローを作成しよう

フロー作成全体図はこちら
![フロー１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/e2552950-9ea2-0f80-d800-45a25f62d92b.png)


開始条件は今回「評価」が「Hot」に設定

![hot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/6f757e7d-571e-ea84-abb2-eaee3d6db063.png)


アクションでAutoConvertLeads を選択
*LeadId　は
{!$Record.Id}
に設定

![アクション01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/b9964a53-5187-3e08-f4ef-682d06b72dd4.png)


最後にフロー保存とフロー有効化も忘れずに
以上で完了です
Pythonのlist、setにおける time complexity について

[217. Contains Duplicate](https://leetcode.com/problems/contains-duplicate/description/)を解いていた際に、time exeedエラーになってしまったので、少し詳しく調べてみました。

```python
class Solution:
    def containsDuplicate(self, nums: List[int]) -> bool:
        hash_map = set()
        for n in nums:
            if n in hash_map:
                return True
            hash_map.add(n)
        return False
```

上記は submit （hash_map.add は hash_map.append に変更した上）できるが、
```python
hash_map = [] 
```
として、（hash_map.add は hash_map.append に変更した上）submit したところ、
time exeedエラーになってしまった。


## エラーが発生したと考えられる原因
- 追加における time complexty の差
- 検索における time complexity の差

### list set の追加について

[Time complexity for adding elements to list vs set in python](https://stackoverflow.com/questions/58792963/time-complexity-for-adding-elements-to-list-vs-set-in-python)の回答によると、
list と set の追加は、
O(1) amortized time-complexity

ただし、setへの追加は、hash関数を使ったり、hash collisions をチェック、処理が必要となる。


**なぜ、hash関数を使う必要があるか？**
Python の set は hashtable を使って実装されているため。

[How is set() implemented?](https://stackoverflow.com/questions/3949310/how-is-set-implemented)


### list と set の検索について

[Python wiki](https://wiki.python.org/moin/TimeComplexity)によると、setのほうが早いことがわかる。

|| Average | Worst |
| :-- | :-: | :-: |
| list |  O(n) ||
| set |  O(1) | O(n) |

## まとめ
追加は list の方が少しだけ早く、
検索についてsetの方が早いということを確認すると、
list の検索が遅いのが原因で、
timeexeedエラーになったように見受けられる。
VSCode でPythonのマルチスレッドプログラムのデバッグ

pythonでQThreadを使用したマルチスレッドプログラムを書いていたところ、ブレークポイントで停止しませんでした。
調べてみると以下のコード追加する必要があるとのこと。

```python:main.py
import debugpy
debugpy.debug_this_thread()
```

VSCode公式に書かれてました。

https://code.visualstudio.com/docs/python/debugging#_troubleshooting
横スクロールのChatGPTが分析に最高だった件

ChatGPTの用途のうち、会話だとか1問1答みたいなスタイルであれば特段気にならなかったのですが、何かを深堀して分析させるとか、何かを作り上げていく場合に、いつもいつもなんかやり辛いなぁと思っていまして、横向きにしたらどうだろう、とやってみたら用途次第ですが個人的に最高だったので、その簡単な紹介になります。

ChatGPTどうしても縦のイメージが強いと思いますので、ああそんなのもありかなと思ってもらえたらのショート記事です。UIは意外に影響してるかもですよ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/efb7d83e-db30-d52a-a5be-1f2c2eef733f.png)

実装技術的には特段詰まるところもないと思いますので、コードなどの紹介は割愛します。

# 横型ChatGPT の特徴

過去の会話履歴は全部捨てます。すべて使い切りのシステム＆ユーザプロンプトのみで構成しました。以下の画面のようにシステムプロンプトとユーザプロンプトを入れて実行すると、結果が2個目のユーザプロンプトエリアに出力されるようになってます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/1968694c-83f0-aa8d-30ef-df6cc0523d35.png)

これによって、回答結果を見た上で、システムプロンプトを追加して会話を重ていけるようにしています。3～4個くらいの連携であれば縦型でも横型でも別段大して変わらない（むしろ縦の方がわかりやすいかも）のですが、10個を超えて結果をつなげていく場合、横型がとても把握しやすいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/977156/634f6fde-63d1-b0cb-92de-12a7ace4d484.png)

# 横型ChatGPT の良いところ、まとめ

例えば文章を練り上げて作り上げていく場合、例えば練り上げていった文章からさらにコードなどを生成する場合など、何かを作り上げる系においては横型が全体把握の上でもとてもとてもやりやすかったです。
これは縦よりも横の方に把握能力が高い傾向にあるためかなと思います（少なくとも私は）

- 会話履歴が欲しいわけではなくて、都度人間判断で過去の結果を再利用したい
- 特に会話履歴が長くなると何が利用されて何が利用されなかったがわかりづらくて困る
- 途中で方針を変えた場合、過去履歴はむしろ使ってほしくない。ピンポイントで再利用したい。
- 過去のやりとりの経緯を簡単に把握したい
- やりとりを踏まえて深堀や違うフォーマット出力など様々な視点での分析を重ねていきたい

といったポイントがあれば、横。いいですよ。なんだか当然のように縦のUIになっているなぁと思った方、用途によってはアリかな？と思った方は是非試してみて下さい。
子育て中の非IT会社員が1か月で基本情報技術者試験と情報セキュリティマネジメント試験を受かった話

# 目的
+ 子育てに忙しい会社員が備忘録兼、自分の満足感のために、資格受験のtipsを書きます。
+ 1か月と書きましたが、日々のマインドは1年ほど前から変えています。

# 書き手の状況
+ 製造業に勤める非IT部門の会社員
+ 二人子育て中
+ 保育園に8時半に預けて、17時に回収している。子供の食事、お風呂、寝かしつけ、風邪の時の看護など一通り面倒は見ている。

# 会社のITのレベル
+ ようやく、有線LAN→wifiに変更するプロジェクトが進んでいる(半分程度導入)
+ 事業部門が、情報システム部門やAIベンチャーと話すと、共通用語がほぼ無く話がまとまらない

# 資格を取得しようと思った背景
弊社は、ITとは全く関係ない会社なので、ITに関する業務は事業所のIT担当者を介して、情報システム部に任せることとなっている。
ただ、その対応は対症療法的で保守的なことが多い。例えば、 
+ ネットが繋がらない→何度か再起動するように指示
+ wifiを使いたい→wifiはセキュリティに問題ないことを証明してください
+ 3年前のメモリ4GBのPCだと、zoomとパワポが開けない→半年後のPC更新を待ってください

また、ソフトウェア開発やITに対して齟齬や不満が多い。例えば、
+ 外注でオンプレソフトを開発してもらっているのに、Chromeを使えと言われた。ネットに繋げない要件はどうなった(怒)
+ AIのシステムを開発するのに数百万円は高すぎる。自社で無料でできないか
+ システムを導入しようと思ったが、関係者の意見を聞いているうちに何故かとても使いづらいものに仕上がってしまった

世間では、日々ITの技術は発展していくのに、wifi一つ導入できない。また、新しいシステムを導入したいのに、情報システム部にセキュリティのことを言われると、何も言い返せない。これらは、事業部側がITの基礎知識がないため、議論の俎上に上れないためだと考え、基本的な情報処理の資格を取ることにした。
目標として、ITパスポート→情報セキュリティマネジメント試験→基本情報技術者試験の順番で取得する。

# 勉強のtips
結論としては、下記二点に集約される。
1. 会社で勉強する
2. 隙間時間を利用する

会社での勉強について
会社で勉強というのは、会社にいるときに資格試験のテキストを開くことではない。1年ほど前から、日々の業務においてIT関係で気になったことを調べることにした。例えば、
+ IPアドレスを設定するようにと言われたが、なぜ自宅での作業だと変更するのか。
+ DHCPにチェックを入れるように言われたが、そもそもDHCPとは何なのか。
+ DNSサーバーの数字は、一見ランダムに見えるが、よく見ると255.255ばかりでその理由はなぜか。
+ セキュリティ上禁止と言われたが、セキュリティとはそもそもどんな要素を考える必要があるか。

それぞれ、調べるのは10分くらいだが、毎回調べて人に説明していると人に聞かれる事が増えて、ますます調べることが増えた。
そのような日々を過ごしていると、自然とITパスポートは8割程度得点できるくらいまで知識が増えた。過去問を2,3回解いて、特に問題なく合格した。

隙間時間の利用について
基本情報技術者試験と情報セキュリティマネジメント試験は、過去問道場を解いた感じ6割程度だったので、勉強することとした。

子育て中の人には分かり味があると思うが、1日のスケジュールは下記の通りである。
| 時刻 | タスク |
|:-:|:-:|
| 7時   | 起床、こどもの準備  |
| 8時   | 保育園送迎  |
| 17時  | 保育園回収  |
| 18-21時  | 食事を上げる、お風呂、翌日の準備、その他家事 |
| 21-22時  | 寝かしつけ |

自宅にいる間、起床から寝かしつけまでは、5分以上の時間が取れないので、隙間時間を利用した。
過去問道場をスマホで解いたり、部屋ごとに読みかけの教科書を開いておいたりした。

睡眠時間が7-9時間とかなり長かったり、手軽に見られるtwitterを見る時間の方が試験勉強の時間より長い、など詰め詰めでないのは否めないが、休息も大事。
子供に連れられて部屋を巡回するごとに開きっぱなしのテキストを読んで2周し、過去問を2、3年分解いて、試験に臨んだ。

はずだったが、1回目の試験は、子供が風邪だったため看護のために断念。試験二つ分の1万5千円が無駄な出費となった。
気を取り直して2週間後に試験を設定し、無事合格点を取れた(合格発表待ち)。

有給を取って受験したので、保育園回収までの空いた時間でこの記事を書くに至った。

# 結論というか感想
+ IT関係者からしたら簡単な資格だが、非ITの人はこの知識すらないので勉強するメリットが非常に大きい。
+ 現代社会の基礎知識として、応用情報も取りたいところ。応用情報レベルの知見を日々の業務に取り入れ、業務中に勉強したいところ。
+ 子育て中の資格試験は大変なので、皆さん頑張りましょう。