OmniAICreator/Qiita-1.07M huggingface dataset:
basic認証に対応していないアプリ内ブラウザでどうしてもbasic認証ページにアクセスしたいときの最終手段

## はじめに
アプリ内ブラウザというものをご存じでしょうか？一般的なChromeやEdgeと違い、スマートフォンで特定のアプリを使用していて、かつそのアプリ内でURLを踏むとアプリの中でWebページを閲覧することができ、これがアプリ内ブラウザです。
外部アプリに遷移しないので、ぱっと中身を確認するだけの場合など便利なこともある半面、basic認証のポップアップに対応していない場合があったりと、開発者には不便なことがあります。
普通使いする分には、基本認証ページをもし開く必要があったとしても、Safariで開くボタンなど外部で開くためのボタンが用意されているので、そちらをおねばOK！！
ただし開発者の場合は、アプリ内ブラウザでのみ再現するバグの確認などでどうしても基本認証付きのページを開きたい瞬間があります、今回はそういう場合の最終手段を綴ります。

## 方法
<font color="Red">※注意：あくまで最終手段のためこの方法にはセキュリティリスクがあります、使用する際は注意してください。</font>
結論から書くと、URLにbasic認証情報を埋め込む方法です。
basic認証情報をURLに組み込む方法に対応しているブラウザにて、
```
https://userId:password@本来のドメイン.~~~
```
このように/とドメインの間にbasic認証情報をコロンを挟んで記述すると、basic認証ポップアップを挟まずにアクセスできる機能があり、これを使用することで突破できます。
あくまでアプリ内ブラウザは基本認証のポップアップを表示することに対応していないだけで、逆に言うとポップアップが出ない状態にすればアクセスできるということです。

## 実際にやってみた
今回はさくらのレンタルサーバー様が公開されているBasic認証のテスト用ページを使用させていただきます。
https://leggiero.sakura.ne.jp/xxxxbasic_auth_testxxxx/
https://leggiero.sakura.ne.jp/xxxxbasic_auth_testxxxx/secret/kaiin_page_top.htm
下のリンクにアクセスすると基本認証が求められます。テストページのためIDとパスワードは上のリンクにて普通に公開されています。

そこで、通常パターン(上)と、IDとパスを埋め込んだパターン(下)の2通りをInstagramのアプリ内ブラウザで開いてみました。
https://leggiero.sakura.ne.jp/xxxxbasic_auth_testxxxx/secret/kaiin_page_top.htm
https://kaiin:naisho@leggiero.sakura.ne.jp/xxxxbasic_auth_testxxxx/secret/kaiin_page_top.htm

このように2つ送信し(OGPは両方とも401となっている)
![IMG_0279.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865325/6c1651e0-f88f-dab9-bb3f-a98c2525c804.png)

上のリンクをタップしたところ、このようにbasic認証のポップアップが表示されないまま認証エラーとなってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865325/8f5ab852-43b1-a56e-0bbb-2750c73a6f2a.png)

しかし下のリンクをタップすると、無事にアクセスすることができました！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3865325/e6c8c047-4956-460f-67ab-5a3dc090050b.png)

## さいごに
今回は最終手段としてこのような方法を紹介しました、しかし上でも注意書きしている通りあくまでデベロッパー向けの内容であり、ネットワークに関するリテラシーをある程度持っている人向けに書いている内容となります。
極端な例でいうと、外部に漏らしてはいけないお客様の基本認証情報を埋め込んだURLに、フリーWi-fiに接続している状態でアクセスしたりなんかすると簡単に流出してしまうので、テスト環境を用いたうえでネットワークやSSLなど最新の注意を払って行ってください！
NLBとALBを統合したソリューション

## はじめに

今回はSAPの問題を解く中で解説の薄い問題があったので解説を作ってまとめてみようと思います。

## 記事の対象者

- AWS初学者
- SAA、SAPを取ろうと思っている方

## 問題文
ある通信会社がAWS上でアプリケーションを運用しています。同社はオンプレミスのデータセンタとAWSの間にAWS Direct Connect接続を設定している。
同社はALBの背後にあるマルチAZのEC2インスタンスにアプリケーションをデプロイしました。クライアントはHTTPSを使用してオンプレミスから接続します。TLSはALBで終端します。
同社には複数のターゲットグループがあり、URLパスに基づいてリクエストを転送するパスベースのルーティングを使用しています。
同社はIPアドレスに基づいたファイアウォールアプライアンスを導入予定です。クライアントがアプリケーションへのアクセスを継続できるように
オンプレミスのネットワークからAWS環境へのトラフィックフローを許可するソリューションを開発したい

## 要件
まずこの問題の要件をまとめます。
①オンプレミスのファイアウォールアプライアンスはIPアドレスに基づく許可リストを利用するため、AWSへの接続が固定のIPアドレスからなされること
②既存のパスベースのルーティング設定やTLSの終端処理など、ALBでの設定を引き続き利用できること

## 解答
NLBを作成します。NLBを複数のAZで１つの静的IPアドレスに関連付けます。NLBようにALBタイプのターゲットグループを作成して、既存のALBを追加します。
ファイアウォールアプライアンスにNLBのIPアドレスを追加します。NLBに接続するようにクライアントを更新します。


## 解説
まずALBとNLB違いで出題される点についてまとめてみます
|機能 |ALB |NLB |
|---|---|---|
|ロードバランサの種類  |レイヤー7（アプリケーション層）  |レイヤー4（トランスポート層) |
|プロトコル  |HTTP、HTTP、gRPC  |TCP、UDP、TLS  |
|トラフィック管理  |URLパス、ホスト名、HTTPヘッダなどの内容に基づいたルーティング  |TCP、UDP、TLSを使用してトラフィック接続レベルでのトラフィック分散  |

構成図
![ALB.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812406/f3ac238c-a209-146c-ed9a-e909f823b383.png)



AWSマネジメントコンソールからElastic IPを割り当てることで固定のIPアドレスを設定することができ
設定したNLBのターゲットをALBに指定することで、ALBへの接続が固定のIPアドレスからなされて既存のパスベースルーティング設定やTLSの終端処理を利用できます。
ちなみにターゲットとしてALBを指定できるようになったのは2021年9月からです。

## 参考資料
[【初学者向け】ロードバランサーの基本機能とAWS ALBとNLBを機能比較してみた](https://zenn.dev/aws_gissan/articles/2f6da88e0bc9b8)
[Network Load BalancerのターゲットグループにApplication Load Balancerを設定する](https://aws.amazon.com/jp/blogs/news/application-load-balancer-aws-privatelink-static-ip-addresses-network-load-balancer/)

## まとめ
SAPは範囲も広く、SAAよりも複数のサービスの組み合わせを問われる問題が多いという感想です。
構成図を頭に浮かべながら問題を解くことが一番の合格の近道ではないかと思いました。
ABC366参加記録　by Python

# リアルタイムに解けた問題

## [A - Election2](https://atcoder.jp/contests/abc366/tasks/abc366_a)

### 問題文
AtCoder市では市長選挙が行われています。候補者は高橋氏と青木氏です。
2人のどちらかに投じられた有効票は$N$票あり、現在開票が行われています。なお、$N$は奇数です。
現在の開票作業の途中経過は高橋氏に$T$票、青木氏に$A$票です。
現時点で勝敗が確定しているかを判定してください、

### 制約
- $1 \leq N \leq 99$
- $N$は奇数
- $0 \leq T,A \leq N$
- $T+A \leq N$
- 入力はすべて整数

### アルゴリズム
$T$または$A$が全投票数の半数以上か判断。

### ソースコード
``` python
N, T, A = map(int, input().split())

if T > N/2 or A > N/2:
  print('Yes')
else:
  print('No')
```

## [B - Vertical Writing](https://atcoder.jp/contests/abc366/tasks/abc366_b)

### 問題文
> 横書きの文章が与えられます。縦書きに出力してください。空白を<font color="Red">`＊`</font>で埋めてください。

$N$個の、英小文字からなる文字列$S_{1}, S_{2},...,S_{N}$が与えられます。これらの文字列の長さの最大値を$M$とします。
以下の条件を満たす$M$個の文字列$T_{1}, T_{2},...,T_{M}$を出力してください。
- 各$T_{i}$は英小文字および<font color="Red">`＊`</font>からなる
- 各$T_{i}$の末尾は<font color="Red">`＊`</font>でない
- 各$1 \leq i \leq N$について、次が成り立つ。

  - 各$1 \leq j \leq |S_{i}|$について、$T_{j}$の$N - i + 1$文字目が存在し、$T_{1}, T_{2},...,T_{|S_{i}|}$それぞれの$N - i + 1$文字目をこの順に連結したものは$S_{i}$と一致する。
  
  - 各$|S_{i}|+1 \leq j \leq M$について、$T_{j}$の$N - i + 1$文字目は存在しないか、<font color="Red">`＊`</font>である。
  
ただし、$|S_{i}|$で文字列S_{i}の長さを表します。

### 制約
- $N$は1以上100以下の整数
- $S_{i}$は長さ1以上100以下の英小文字からなる文字列

### アルゴリズム
各文字列のうち、最大の長さを求めて、その数値でfor文を動かす。
各文字列の先頭の要素を$S_{N}$から順に取り出しつなげる。要素がなければ、<font color="Red">`＊`</font>をつなげる。出力の際は条件を満たすように出力する。

### ソースコード
``` python
N = int(input())

S = [list(input()) for _ in range(N)]

S_output = []

max_len = -1

for s in S:
  if len(s) > max_len:
    max_len = len(s)


for i in range(max_len):
  info = ''
  for j in range(N):
    if len(S[N-1-j]) != 0:
      chr = S[N-1-j].pop(0)
    else:
      chr = '*'
    info += chr

  S_output.append(info)

for s in S_output:
  if '*' not in s:
    print(s)
  else:
    if s[-1] != '*':
      print(s)
    else:
      while True:
        if s[-1] == '*':
          s = s[:-1]
        else:
          print(s)
          break
```
ABC368振り返り

[前回の振り返り](https://qiita.com/comet725/items/de5b3ba579c827c17125)

今日はABC開催日だったので参加結果を振り返る

https://atcoder.jp/contests/abc368

今日はABC3完(1ペナ)
- い　つ　も　の

# A

微妙に実装手間取った。

## ソースコード

```python:main.py
import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

def main():
    N, K = rLI()
    A = rLI()
    B = A[-K:]+A[:N-K]
    print(*B)
    
if __name__ == '__main__':
    main()
```

# B

言われている操作を毎回行って、
条件のチェックにはCounterを使う

## ソースコード

```python:main.py
import sys
from itertools import count
from collections import Counter
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

def main():
    N = rI()
    A = rLI()
    B = A[:]
    for ans in count(start=1):
        B = list(reversed(sorted(B)))
        B[0] -= 1
        B[1] -= 1
        if sum(v for k,v in Counter(B).items() if k > 0) <= 1:
            print(ans)
            break
if __name__ == '__main__':
    main()
```

# C

3回やれば5減るから
そこまではざっくり減らして
細かい微調整をする
- 最初にも微調整しようとしたらペナった😢

## ソースコード

```python:main.py
import sys
def rI(): return int(sys.stdin.readline().rstrip())
def rLI(): return list(map(int,sys.stdin.readline().rstrip().split()))
def rS(): return sys.stdin.readline().rstrip()
def rLS(): return list(sys.stdin.readline().rstrip().split())
def err(*args): print(*args, file=sys.stderr)

def main():
    N = rI()
    H = rLI()
    
    T = 0
    for h in H:
        k = h//5
        T += 3*k
        h -= 5*k
        while h > 0:
            T += 1
            h -= 3 if T % 3 == 0 else 1
    print(T)
    
    
if __name__ == '__main__':
    main()

```

# D

BFSとかDFSとか色々実装しようとしたけど
やっぱり、グラフの問題はできませんorz

# E

Dがグラフだったから飛ばして見ようとしたけど
極端に正解数少なかったからちょっと諦めた


# F

ゲーム理論はグラフよりきつい

# G

クエリと聞いてセグ木、最大値と聞いてDPと反射的に構えて
じゃあセグ木にDP乗せるの！？とか思ってしまった。

# まとめ
Cまで解けたのはいいけど
Dがグラフ問題、Eがなんか正解数少ない
そしてそもそもFGは地力不足な話

いい加減グラフと向きあう必要があるのかもしれない…
- そもそも特定の問題を捨てるなって話←
git pullをしたら`fatal: bad object refs/remotes/origin/main 2`と言われてしまった時の対処法

## 事象
普段ObsidianとGitHubを使って複数端末でドキュメント管理をしているのですが、ある日突然`git pull`をするとタイトルのようなエラーが表示されていました。

```bash:terminal
MacBook-Air-3:$ git pull origin main
remote: Enumerating objects: 169, done.
remote: Counting objects: 100% (169/169), done.
remote: Compressing objects: 100% (73/73), done.
remote: Total 169 (delta 127), reused 138 (delta 96), pack-reused 0 (from 0)
Receiving objects: 100% (169/169), 19.68 KiB | 4.92 MiB/s, done.
Resolving deltas: 100% (127/127), completed with 8 local objects.
fatal: bad object refs/remotes/origin/main 2
error: https://github.com/***/***.git did not send all necessary objects
```

## 原因
`ref/remotes/origin/main 2`というファイルが生成されているため

## 解決策 
問題となってるファイルを削除することで解決することができました。
```bash
$ rm .git/refs/remotes/origin/main\ 2
# パスにスペースが入っていたら`\`でエスケープする必要があるので注意
```
ABC368をPythonで（A～D,F）

日立ヴァンタラプログラミングコンテスト2024（AtCoder Beginner Contest 368）の解答等の速報的まとめ

https://atcoder.jp/contests/abc368

# A問題
https://atcoder.jp/contests/abc368/tasks/abc368_a

後ろから$K$枚を前にする
```python:A
n, k = map(int, input().split())
a = list(map(int, input().split()))

b = a[n - k:] + a[:n - k]
print(*b)
```
# B問題
https://atcoder.jp/contests/abc368/tasks/abc368_b

実際にシミュレーションをする。
操作回数は$N=100,A$全部100の時の5000回が最大のため間に合う
```python:B
n = int(input())
a = list(map(int, input().split()))

cnt = 0
while a.count(0) < n - 1:
    a.sort(reverse=True)
    a[0] -= 1
    a[1] -= 1
    cnt += 1

print(cnt)
```
# C問題
https://atcoder.jp/contests/abc368/tasks/abc368_c

基本３回で５減らすループなのでその計算をして$H$を大きく減らす
端数部分は実際にシミュレーションをする
```python:C
n = int(input())
h = list(map(int, input().split()))

t = 0
for h_i in h:
    while t % 3 != 0 and h_i > 0:
        t += 1
        if t % 3 == 0:
            h_i -= 3
        else:
            h_i -= 1

    if h_i > 0:
        x = h_i // 5
        t += x * 3
        h_i %= 5

    while h_i > 0:
        t += 1
        if t % 3 == 0:
            h_i -= 3
        else:
            h_i -= 1

print(t)
```
# D問題
https://atcoder.jp/contests/abc368/tasks/abc368_d

葉から$V$の対象外かを確認していく
```python:D
n, k = map(int, input().split())
edge = [set() for _ in range(n)]
for _ in range(n - 1):
    a, b = map(lambda x:int(x) - 1, input().split())
    edge[a].add(b)
    edge[b].add(a)

v = set(map(lambda x:int(x) - 1, input().split()))

mono = list()
for i in range(n):
    if len(edge[i]) == 1:
        mono.append(i)

ans = n
for now in mono:
    if now not in v:
        to = edge[now].pop()
        edge[to].discard(now)
        if len(edge[to]) == 1:
            mono.append(to)
        ans -= 1

print(ans)
```
# F問題
https://atcoder.jp/contests/abc368/tasks/abc368_f

Grundy数
約数関係はエラトステネスの篩の要領で値を渡して、そのあとmexを求めた
```python:F
n = int(input())
a = list(map(int, input().split()))

p = [0, 0]
s = [{0} for _ in range(10 ** 5 + 10)]
for i in range(2, 10 ** 5 + 1):
    t = 1
    while t in s[i]:
        t += 1
    p.append(t)
    for j in range(i + i, len(s), i):
        s[j].add(t)

grundy = 0
for a_i in a:
    grundy ^= p[a_i]

print("Anna" if grundy else "Bruno")
```
ラズパイPico Wで音楽

ラズパイPico のPWMを使って、音階を奏でましょう。

## 準備：スピーカーをGNDとGPIO15に接続

![play-sound2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665435/744f6a41-1e0c-65f9-1f3b-868ccd55e22e.png)

## プログラム

```Python
from machine import Pin, PWM
import time

sp1 = PWM(Pin(15, Pin.OUT)) # スピーカーをGPIO15に接続

# ラの音を出す(440Hz)
sp1.duty_u16(0x8000)# PWMのDutyを50％にして音を出す。Dutyは0～0xFFFFつまり65535までの間の値で設定
sp1.freq(440)       # 440Hz
time.sleep(1)       # 0.5秒待つ
sp1.duty_u16(0)     # 音を消す
time.sleep(1)       # 0.5秒待つ

# ２オクターブ（220Hz～880Hz）の音を出す
for i in range(25):
    f = 220*2**(i/12) # 440Hzの１オクターブ下は220Hz
    print(f)
    sp1.duty_u16(0x8000)# PWMのDutyを50％にして音を出す。Dutyは0～0xFFFFつまり65535までの間の値で設定
    sp1.freq(int(f))    # 整数が必要
    time.sleep(0.1)     # 0.1秒待つ
    sp1.duty_u16(0)     # 音を消す
```

## 準備：スイッチをGNDとGPIO12に接続

![画像11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3665435/77b4c203-c5b7-821d-8810-b0ff90fbe51f.png)

## プログラム

```Python
from machine import Pin, PWM
import time

sp1 = PWM(Pin(15, Pin.OUT))			# GPIO15をスピーカー出力
sw1 = Pin(12, Pin.IN, Pin.PULL_UP)	# GPIO12をスイッチ入力（プルアップ）

# スイッチが押されたら音を出す。スイッチをはなしたら音を止める。
def irq01( pin ):
    if pin.value()==0:	# スイッチが押されたら
        print("SW:ON")
        sp1.freq(440)			# 440Hz
        sp1.duty_u16(0x8000)	# 音を出す
    else:
        print("SW:OFF")
        sp1.duty_u16(0)			# 音を止める

sw1.irq(irq01)	# スイッチに割り込みがあったら、irq01 を呼び出す

sp1.freq(440)			# 440Hz
sp1.duty_u16(0x8000)	# 音を出す
time.sleep(0.5)			# 0.5秒待つ
sp1.duty_u16(0)			# 音を止める
```
検索アルゴリズムについて

# 検索アルゴリズムについて
データ等の検索情報について一般的に線形検索、二分検索があります。
* 線形検索とは
配列から１つずつ順番に合致するデータを検索します。配列がソートされている必要はありません。
例えば配列の要素が２，０００個ある場合、最大で２，０００回の検索が必要になります。
時間計算量は以下ようになります。
```math
時間計算量=O(n)
```

* 二分検索とは
ソート済の配列で有効な検索方法となります。配列を半分にして、検索する要素を含む半分を保持し、その配列をさらに半分にして、検査する要素をさらに半分するという流れで合致する要素が見つかるまで配列を半分にしていきます。つまり検索範囲が半分ずつになっていきます。
時間計算量は以下ようになります
```math
時間計算量＝O(\log n)
```

※時間計算量についてはビッグオー記法という記載で表現されます。
線形検索の場合、配列の要素が大きくなると検索時間も比例して大きくなります。
二分検索の場合、配列の要素が大きくなっても対数で増加するため、要素が倍になっても検索時間は倍にはなりません。

# 線形検索と二分検索の処理時間について
２億のデータを配列として準備し、１億と合致したら処理を終了としてます。線形検索と二分検索の処理時間を測ります。サンプルコードを記載します。

```python
numbers = list(range(1,200000000))

def binary_search(value:int, numbers:list) -> int:
    low: int = 0
    high: int = len(numbers) - 1 
    middle:int = 0

    while( low <= high):
        middle = (low + high) // 2
        if numbers[middle] == value:
            return middle
        elif numbers[middle] < value:
            low = middle + 1
        else:
            high = middle - 1

def main(argv):
    start_time = datetime.now()
    # 線形検索
    for i in numbers:
        if 100000000 == i:
            break
    end_time = datetime.now()
    print(f"処理時間: { int((end_time - start_time).total_seconds() * 1000):,}ミリ秒")


    start_time = datetime.now()
    # 二分探索
    ret = binary_search( 100000000, numbers )
    print(f"{ret=}")
    end_time = datetime.now()
    print(f"処理時間: { int((end_time - start_time).total_seconds() * 1000)}ミリ秒")
```
二分検索のほうが圧倒的に早いですね。
```
処理時間: 11,969ミリ秒
ret=99999999
処理時間: 0ミリ秒
```


# まとめ
線形検索と二分検索について紹介しました。
例えば、以下のようなテーブルがあり、開始値以上、終了値以下のidを取得したい場合、件数によってはDBインデックスでも検索速度には限度があるため、二分検索用のメソッドを準備する必要があります。
|id|開始値|終了値|
|---|---|---|
|1|1|1000|
|2|1001|2000|
|・・・|||
|1000|1000000|10000001|

二分検索については業務プログラムを作成していると必ず必要となるケースが発生すると思いますので、参考にしてみてください。
【AWS - EC2】マネジメントコンソールが少しだけ優しくなった

## はじめに

AWSのマネジメントコンソールでEC2インスタンスを停止する時、

インスタンスの状態　＞　インスタンスを停止
を選択する必要があります。

しかし、下の方に　**インスタンスを終了** という項目もあり、こちらを押すと、該当インスタンスは<font color="red">**削除**</font>されます

今までこちらの記事の方のように間違えて押してしまった人も多いのではないでしょうか

https://react.hateblo.jp/entry/ec2-instance-terminate

## ある日気がついた

マネジメントコンソールをいじっていると、、、


<br><br><br><br><br><br><br><br><br>

ん、、、？

<img width="600px"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2907902/818df8df-1cdf-b4ae-7288-7ca9b97c7bcf.png">

<br><br>

<img width="300px"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2907902/f1463259-d9ab-9941-6577-92a15fb4270e.png">

<br><br>

<img width="300px"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2907902/0940698a-a0bf-4c2d-aab1-7a1f6a7e21f5.png">


### Terminate<font color="red">**(delete)**</font> instance に変わっている!?

<br><br>

<img width="200px"  src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2907902/389fd0bb-6c34-7509-b8ef-118deeb4363c.png">


設定を他の言語（日本語、イタリア語、中国語）に変えてみましたが、まだ英語表記のままでした。
なので、割と最近変わったのかなと思います。
というかここら辺って自動翻訳していると思っていたのですが、違うっていうのは意外。

## 終わりに

~~なぜ今更？？感がありますが、~~ これからは間違えてインスタンスを削除してしまうような悲しい事故がなくなりそうでよかったですね！！
なぜあなたの職場は地獄のような場所なのか？

## はじめに

この記事は私が調べている古代の知識をもとに書かれています。

なので詳しいことはこの記事で扱われているトピックを参考に自分で調べてみてください。

## 職場とは

私は某超有名なビルに本社を構える大企業に勤務しています。

超大企業なので、私の業務は何も利益を生まないにも関わらず一般的な水準からするとそこそこの給料をもらっています。

ここまで聞いてあなたは私のことをどう思ったでしょうか？

そう、マウントしてくる嫌な奴だと思ったかもしれません。

そこまでは思わないかもしれませんが、実は[私たち日本人は頭が良すぎるせいで](https://www.chosunonline.com/m/svc/article.html?contid=2024062780051#:~:text=%E6%97%A5%E6%9C%AC%E3%81%8CIQ%E3%81%A7%E4%B8%96%E7%95%8C,%E3%81%AB%E4%BD%BF%E3%81%86%E6%8C%87%E6%A8%99%E3%81%A0%E3%81%A8%E3%81%84%E3%81%86%E3%80%82)、他人の意図みたいなものを感じ取ってしまうんです。

## 私の人生で居心地のいい職場がなかった理由

私はITの仕事をして10年めになるんですが、確かにその中ではマシだった時期はありますが、基本的に職場には居心地の悪さしか感じません。

特に人間関係が難しいと感じます。

新しい社員が増えるたびに新しいトラブル、悩みの種が生まれる、そんなイメージです。

## 私がなぜいつも居心地悪く感じていたのか

私がなぜ職場に対して居心地の悪い思いをしていたかというと

まず、私が管理職をやったことがなくメンバーとして参画しているからです。

ということは、他のメンバーもそうですが、やっていることは基本的に他のメンバーとの競争になります。

## より自己中心的な人間が勝つ世界

そんな世界で頭角を表すのは図々しい人間です。

管理職レベルでは自分勝手な管理職は部下からのクレームが来ると思いますが、メンバー間は誰も彼もがそうであるため、クレームは表面に出てきません。

メンバー間のドロドロとした自分の給料をあげたい、地位を上げたい、より重要な人間と思われたいという思いが強い人間が勝ちます。

## 地獄の世界になる仕組み

なぜ私も含め他のメンバーのみんな自己中心的になるのでしょう？

それはまず上司がバランスを考えてくれないと他責にしたいところですが、そもそもサラリーマンという仕組みがその地獄絵図の原因になっているんです。

## 私たちは3大欲求を叶えるように仕組まれている。

サラリーマンにとって大事なのは昇給です。

昇給するためにどうするかというと組織の中で実績を残すことが求められます。

高い実績を残せる仕事はメンバーの間でなんとなくわかります。

しかしその仕事を任されるのは大体決まったメンバーです。

そういったメンバーはさらにいい仕事を任されます。

詳しくは「勝者の思考回路」という本を見てほしいですが、そういった現象はどこの企業でも見られると思います。

私たちはしょぼい富としょぼい名声としょぼい権力の獲得のために働かされているといってもいいでしょう。

## サラリーマンの仕組みから逃れるために

サラリーマン、つまり組織に所属している以上、いつかクビになるかもしれない不安、昇給したいという野心、同僚に対する嫉妬心や嫌悪感、そういったものがあなたのサラリーマン生活を支配するようになるんです。

## サラリーマン状態からの脱却

サラリーマンマインドでいるということは心の砂漠を歩き続けるということです。

そこから逃れるためにしてほしいことを説明します。

## ズバリ！答えはあなた自身の中にある！

実は私たちの苦しみは私たちが人間というお金のかかる存在であることが原因なんです。

解決方法としては、自分の中の内なる声に耳を澄ますことです。

## あなたは生まれ変わる

たとえば芋虫は自分が蝶々になることを知りません。蝉の幼虫は生まれてから5年後に自分がセミになることを知りません。

実は私たちもそのように自分の将来の姿を完全に予想できているとは言えないんです。

うまく言えないですが、私たちには見えない何かがあると思ってます。

## あなたには量子が見えますが？原子が見えますか？

実は私たちは普段の生活で見えない力に頼って生きています。ガスは無色透明ですし、世の中の一切は原子でできていますが、原子が小さすぎて顕微鏡でもみることはできない。

しかし、それらは確実に存在していて、私たちの生活を支えるような大きな力になっているんです。

## オカルトと思わずにまずは瞑想から

まずは瞑想から始めてみましょう。そしてストレスの一切をどうでもいいと思うことにしましょう。

一種の訓練だと思って取り組みましょう。あなたの意識の力はあなたが思っているより偉大です。

なぜならあなたの人生の意味はあなたにはわからないんですから。

芋虫が蝶になることがわかっていないように
PkCrack は -d を付けないと処理が終わらない

CTF で使うことのあるパスワードクラッキングツール PkCrack[^1]では、以下のコマンドで既知平文攻撃による zip ファイルの解析が可能です。[^2]

```
pkcrack \
  -C [暗号化された zip ファイル] \
  -c [暗号化された zip ファイルの中で平文がわかるファイルのファイル名] \
　-P [平文のファイルが入っている暗号化されていない zip ファイル] \
　-p [平文のファイル] \
　-d [出力ファイル名]
```

 このとき、**`-d` の出力ファイル名は必ず指定する必要があるようです**。
 
指定したら 10 秒程度で解析処理が終わるのに対し、指定しない場合に数分経っても終わらないことを、ある zip ファイル[^3]で確認しました。
`-d` を指定しなくてもエラーが出ないため、何らかのデフォルトの名前で出力してくれる (例えば C++ のコンパイルのように) と考えがちですが、そうではないため注意が必要です。

### 実行環境

- Windows 10 Home (64 bit) にインストールした Oracle VM VirtualBox 内で実行した Kali Linux 2024.3 (ただし 2024 年 8 月頃までのローリングリリースのアップデートを適用済)
- 公式サイト[^1]からダウンロードした `pkcrack-1.2.2.tar.gz`, `pkcrack-1.2.3.tar.gz` それぞれを解凍してインストール (両方のバージョンで同じ挙動を確認)

[^1]: https://www.unix-ag.uni-kl.de/~conrad/krypto/pkcrack/
[^2]: 参考: https://kaworu.jpn.org/kaworu/2012-12-07-1.php
[^3]: [リンク先が CTF の問題です、ネタバレ注意](https://ksnctf.sweetduet.info/problem/19)
ModuleNotFoundError: No module named 'torch'


# Python環境での「No module named 'torch'」エラーの解決法

## 1. 問題の概要
`pip show torch`でtorchがインストールされていることが確認できるにもかかわらず、torchのimport時にエラーが発生する。

```bash
Traceback (most recent call last):
  File "/path/to/script", line X, in <module>
    import torch
ModuleNotFoundError: No module named 'torch'
```

## 2. 問題解決の手順

### 2.1 Python環境の確認
まず、現在使用しているPythonとpipのパスを確認します。

```bash
which python3
```

出力されたパスが、正しい環境を指しているか確認します。

### 2.2 スクリプトが使用するPython環境の確認
スクリプトが実行される際に使用されているPython環境が、確認した環境と一致しているかを確認します。スクリプトの先頭行に記載されているシバン（`#!/usr/bin/python3`など）が、`which python3`で出力されるパスと一致しているかを確認します。

### 2.3 環境の再設定
もし異なる環境が使用されている場合、以下の手順で環境を再設定することを検討します。

- スクリプトのシバンを、正しいPython環境を指すように修正する。
- `pyenv`や`virtualenv`を使用して、適切なPython環境をアクティブにする。
AAAJIｓじゃおあｓ

```
function manageMeetingRoomsEfficiently() {
  // 3週間後の日時を取得
  const now = new Date();
  const threeWeeksLater = new Date(now.getTime() + 3 * 7 * 24 * 60 * 60 * 1000);

  // 会議室のメールアドレスリスト
  const rooms = ['room1@example.com', 'room2@example.com', 'room3@example.com'];

  for (let i = 0; i < rooms.length; i++) {
    const room = rooms[i];

    // 3週間分の予定をroomごとに取得
    const events = CalendarApp.getDefaultCalendar().getEvents(now, threeWeeksLater);

    // まず、該当する会議室が既に追加されているイベントをフィルタリング
    let eventsToProcess = events.filter(function(event) {
      const attendees = event.getGuests();
      let isRoomAdded = false;

      attendees.forEach(function(guest) {
        if (guest.getEmail() === room && guest.getStatus() === "ACCEPTED") {
          isRoomAdded = true;
        }
      });

      return !isRoomAdded;
    });

    // Declineされている会議室を削除
    eventsToProcess.forEach(function(event) {
      const attendees = event.getGuests();
      attendees.forEach(function(guest) {
        if (guest.getEmail() === room && guest.getStatus() === "DECLINED") {
          event.removeGuest(room);
        }
      });
    });

    // まだ会議室が追加されていないイベントに対して、現在のroomを追加
    eventsToProcess.forEach(function(event) {
      event.addGuest(room);
    });

    // 10秒待機
    Utilities.sleep(10000);
  }
}

```
【課題】No.10 ユーザーフォームを用いたデータ入力アプリケーションの作成【Excel VBA】

## はじめに
この課題は全10問中10問目の課題です。  
着任時に取り組むことができるExcel VBA初学者向けの課題を作成しました。
今回の課題では、ユーザーフォームを用いたデータ入力アプリケーションを作成していただきます。ユーザーフォームの基本を学び、データ入力アプリケーションの作成をしてみましょう。

## 目次
- [目的](#目的)
- [前提](#前提)
- [課題内容](#課題内容)
- [実装手順](#実装手順)
  - [1. ユーザーフォームの作成](#1-ユーザーフォームの作成)
  - [2. バリデーションとデータの送信処理](#2-バリデーションとデータの送信処理)
- [まとめ](#まとめ)
- [参考記事](#参考記事)

## 目的
ユーザーフォームの基本を学び、データ入力アプリケーションの作成を通じて、VBAの応用力を高めることを目的としています。

## 前提
この記事の内容を理解するためには、以下の参考記事を先に読むことをおすすめします。  
VBAの基礎を理解して課題に取り組んでください。
- [初心者でも図解で分かる！ VBEの基本的な使い方とVBAプログラムの基礎文法](https://atmarkit.itmedia.co.jp/ait/articles/1402/13/news040_3.html)

## 課題内容
**ユーザーフォームを作成し、ユーザーが「名前」「年齢」「メールアドレス」を入力できるようにしてください。「送信」ボタンを押すと、入力されたデータが指定されたシートに自動的に追加されるようにしてください。**

**入力データのバリデーションを行い、必須フィールドが未入力の場合やメールアドレスの形式が正しくない場合はエラーメッセージを表示してください。**

## 実装手順

### 1. ユーザーフォームの作成
1. ExcelのVBAエディタを開いてください (`Alt + F11`)
2. 「挿入」→「ユーザーフォーム」を選択し、ユーザーフォームを作成します
3. テキストボックスを3つ配置し、それぞれ「名前」「年齢」「メールアドレス」の入力フィールドとします
4. 「送信」ボタンを配置し、データを送信するためのボタンを作成します

### 2. バリデーションとデータの送信処理
以下のコードをユーザーフォームに追加し、入力データのバリデーションとデータ送信処理を実装します。
```vb
Private Sub btnSubmit_Click()

    Dim nextRow As Long
    
    ' 名前が入力されているか確認
    If Me.txtName.Text = "" Then
    
        MsgBox "名前を入力してください。", vbExclamation
        Exit Sub
        
    End If
    
    ' 年齢が入力されているか確認
    If Me.txtAge.Text = "" Or Not IsNumeric(Me.txtAge.Text) Then
    
        MsgBox "有効な年齢を入力してください。", vbExclamation
        Exit Sub
        
    End If
    
    ' メールアドレスが有効な形式か確認
    If Me.txtEmail.Text = "" Or Not Me.txtEmail.Text Like "*@*.*" Then
    
        MsgBox "有効なメールアドレスを入力してください。", vbExclamation
        Exit Sub
        
    End If
    
    ' データをシートに追加
    nextRow = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row + 1
    With Sheets("Sheet1")
    
        .Cells(nextRow, 1).Value = Me.txtName.Text
        .Cells(nextRow, 2).Value = Me.txtAge.Text
        .Cells(nextRow, 3).Value = Me.txtEmail.Text
        
    End With
    
    ' フォームをリセット
    Me.txtName.Text = ""
    Me.txtAge.Text = ""
    Me.txtEmail.Text = ""
    MsgBox "データが正常に送信されました。", vbInformation
    
End Sub
```
### +α
ユーザーフォームのレイアウトとデザインを使いやすく直感的なものにするため、フォームのサイズ、ラベルの配置、ボタンの色などを工夫しましょう。また、コードはメンテナンスしやすいようにコメントを入れ、必要に応じてモジュール分割することを心がけてください。

## まとめ
今回の課題では、ユーザーフォームを用いたデータ入力アプリケーションを実装しました。ユーザーフォームを活用することで、ユーザーからのデータ入力を効率的に管理できるようになります。今後は、フォームのデザインや機能を拡張し、より高度なアプリケーションの作成に挑戦してみてください。

## さいごに
全10回の課題の実施、また記事を閲覧くださりありがとうございます。この課題をきっかけにExcel VBAのプログラマーとして業務改善をしていただければと思います。あくまで引き出しを増やしただけなので、実際にExcel関連の業務で面倒なものを効率化するところから始めていただければと思います。私もVBAのすべてを理解できているわけではないので、ともに精進していきましょう！

## 参考記事
1. [【VBA入門】ユーザーフォームの使い方(テキスト表示、カレンダー)](https://www.sejuku.net/blog/37407)
2. [VBAのユーザーフォームの作り方・マスターするコツを徹底解説](https://www.sejuku.net/blog/94367)
3. [Excelユーザーフォーム入門](https://excel-ubara.com/excelvba3/)
4. [上級者を目指すExcelVBA #4 『モジュールは適切に分割する』](https://qiita.com/H_Tsukamoto/items/232ab7d327eff8d48abe)
5. [【VBA入門】Withの使い方、入れ子(ネスト)で使う方法](https://www.sejuku.net/blog/33153)
【課題】No.9 新しいブックを開いて名前を付けて保存するマクロの作成【Excel VBA】

## はじめに
この課題は全10問中9問目の課題です。  
着任時に取り組むことができるExcel VBA初学者向けの課題を作成しました。
今回の課題では、新しいブックを開き、そのブックを指定された名前で保存するマクロを作成していただきます。新しいブックを操作し、ファイル保存処理の基本を理解していただければと思います。

## 目次
- [目的](#目的)
- [前提](#前提)
- [課題内容](#課題内容)
- [実装手順](#実装手順)
  - [1. 標準モジュールを追加する](#1-標準モジュールを追加する)
  - [2. マクロのコードを記述する](#2-マクロのコードを記述する)
- [まとめ](#まとめ)
- [参考記事](#参考記事)

## 目的
新しいブックを操作し、ファイル保存処理の基本を理解することを目的としています。この課題を通じて、Excelブックの新規作成と保存のプロセスを実践的に学びます。

## 前提
①この記事の内容を理解するためには、以下の参考記事を先に読むことをおすすめします。  
VBAの基礎を理解して課題に取り組んでください。
- [初心者でも図解で分かる！ VBEの基本的な使い方とVBAプログラムの基礎文法](https://atmarkit.itmedia.co.jp/ait/articles/1402/13/news040_3.html)

②今回は例として保存先ファイルパスを「C:\sample\newWorkbook.xlsx」とします。

## 課題内容
**新しいブックを開き、そのブックを指定された名前で保存するマクロを作成してください。**

## 実装手順

### 1. 標準モジュールを追加する
標準モジュールは、複数のシートやブック全体で使用できるマクロを格納するための場所です。VBAエディタで新しい標準モジュールを追加します。

### 2. マクロのコードを記述する
1. ExcelのVBAエディタを開いてください (`Alt + F11`)
2. 「挿入」→「標準モジュール」を選択し、以下のコードを入力します  
**※課題内容に取り組み、プログラムを開発した後に確認してください** 
```vb
Sub SaveNewWorkbook()

    Dim wb As Workbook
    Dim filePath As String
    
    ' 新しいブックを作成
    Set wb = Workbooks.Add
    
    ' 保存先のファイルパスを指定
    filePath = "C:\sample\newWorkbook.xlsx"
    
    ' ブックを指定された名前で保存
    wb.SaveAs filePath

End Sub
```
このコードは、新しいブックを開き、そのブックを指定された名前で保存するマクロです。コードを入力した後、F5キーを押すか、VBAエディタの「実行」ボタンをクリックしてマクロを実行します。

### +α
保存先のフォルダ（sample）が存在しない場合、エラーメッセージを表示し、処理を中断するように修正します。以下のコードはその対応策の一例です。
```vb
Sub SaveNewWorkbook()

    Dim wb As Workbook
    Dim filePath As String
    Dim fso As Object
    
    ' 保存先のファイルパスを指定
    filePath = "C:\sample\newWorkbook.xlsx"
    
    ' FileSystemObjectを使用して保存先フォルダの存在を確認
    Set fso = CreateObject("Scripting.FileSystemObject")
    
    If Not fso.FolderExists(fso.GetParentFolderName(filePath)) Then
    
        ' フォルダが存在しない場合はエラーメッセージを表示して終了
        MsgBox "指定されたフォルダが存在しません。", vbExclamation
        Exit Sub
        
    End If
    
    ' 新しいブックを作成
    Set wb = Workbooks.Add
    
    ' フォルダが存在する場合のみ保存を実行
    wb.SaveAs filePath
    
End Sub
```
このコードでは、保存先フォルダが存在しない場合に、エラーメッセージを表示し、処理を中断することで安全にブックの保存を行います。

## まとめ
今回の課題では、新しいブックを開いて指定された名前で保存するマクロを実装しました。さらに、保存先フォルダが存在しない場合のエラーハンドリングも学びました。今後は、この基本を応用して、より複雑なファイル操作やエラーハンドリングに挑戦してみてください。

## 参考記事
1. [ブックを閉じる・保存（Close,Save,SaveAs）](https://excel-ubara.com/excelvba1/EXCELVBA364.html)
2. [VBAでフォルダ存在チェック](https://vbabeginner.net/folder-existence-check/)
3. [DirとFSO.FileExistsの違い](https://www.limecode.jp/entry/difference/dir-fileexists)
【課題】No.7 For Each文を使用して複数のシートを操作するマクロの作成【Excel VBA】

## はじめに
この課題は全10問中7問目の課題です。  
着任時に取り組むことができるExcel VBA初学者向けの課題を作成しました。
今回の課題では、For Each文を使用して複数のシートに対して一括操作を行うマクロを作成していただきます。For Each文の基本を学び、ブック内のすべてのシートを対象に操作を行う方法を習得していただければと思います。

## 目次
- [目的](#目的)
- [前提](#前提)
- [課題内容](#課題内容)
- [実装手順](#実装手順)
  - [1. 標準モジュールを追加する](#1-標準モジュールを追加する)
  - [2. マクロのコードを記述する](#2-マクロのコードを記述する)
- [まとめ](#まとめ)
- [参考記事](#参考記事)

## 目的
For Each文の基本を学び、複数のシートに対して一括操作を行う方法を習得することを目的としています。この課題を通じて、ブック内のすべてのシートに対して同じ操作を実行する方法を実践的に学びます。

## 前提
この記事の内容を理解するためには、以下の参考記事を先に読むことをおすすめします。  
VBAの基礎を理解して課題に取り組んでください。
- [初心者でも図解で分かる！ VBEの基本的な使い方とVBAプログラムの基礎文法](https://atmarkit.itmedia.co.jp/ait/articles/1402/13/news040_3.html)

## 課題内容
**ブック内のすべてのシートを対象に、それぞれのシートのA1セルに「SheetName: ○○」という形式でシート名を入力するマクロを作成してください。**

## 実装手順

### 1. 標準モジュールを追加する
標準モジュールは、複数のシートやブック全体で使用できるマクロを格納するための場所です。VBAエディタで新しい標準モジュールを追加します。

### 2. マクロのコードを記述する
1. ExcelのVBAエディタを開いてください (`Alt + F11`)
2. 「挿入」→「標準モジュール」を選択し、以下のコードを入力します  
**※課題内容に取り組み、プログラムを開発した後に確認してください** 
```vb
Sub InsertSheetNames()

    Dim ws As Worksheet
    
    ' すべてのシートに対して処理を実行
    For Each ws In ThisWorkbook.Worksheets
    
        ws.Range("A1").Value = "SheetName: " & ws.Name
        
    Next ws
    
End Sub
```
このコードは、ブック内のすべてのシートを対象に、それぞれのシートのA1セルに「SheetName: ○○」という形式でシート名を入力するマクロです。コードを入力した後、F5キーを押すか、VBAエディタの「実行」ボタンをクリックしてマクロを実行します。

### +α
非表示のシートがある場合、上記のコードはエラーになります。シートが非表示の場合でもエラーが発生しないように修正してください。
以下のコードは対応策の一例です。
```vb
Sub InsertSheetNames()

    Dim ws As Worksheet
    
    ' すべてのシートに対して処理を実行
    For Each ws In ThisWorkbook.Worksheets
    
        ' シートが非表示でもエラーが発生しないようにする
        On Error Resume Next
        ws.Visible = xlSheetVisible
        ws.Range("A1").Value = "SheetName: " & ws.Name
        On Error GoTo 0
        
    Next ws
    
End Sub
```
このコードでは、非表示のシートに対してもエラーが発生しないように処理を行っています。必要とする機能以外の要件は必ず整理するようにしましょう。

## まとめ
今回の課題では、For Each文を使用して複数のシートに対して操作を行うマクロを実装しました。これにより、ブック内のすべてのシートに対して一括操作を行う方法を学ぶことができます。今後は、この基本を応用して、さらに複雑なシート操作に挑戦してみてください。

## 参考記事
1. [For Each...Next ステートメントを使用する](https://learn.microsoft.com/ja-jp/office/vba/language/concepts/getting-started/using-for-eachnext-statements)
2. [コレクション処理（For Each）](https://excel-ubara.com/excelvba1/EXCELVBA359.html)
3. [【VBA入門】危険!For Each～Nextステートメントによる全シート操作に潜むリスクを解説](https://www.cellnets.co.jp/dev_column/9243)
4. [【VBA入門】エラーを処理する方法(On Error、Resume、GoTo)](https://www.sejuku.net/blog/35484)
5. [非機能要件とは？](https://products.sint.co.jp/ober/blog/nonfunctionalrequirements)
【課題】No.6 特定の条件に基づいてセルの色を変更するマクロの作成【Excel VBA】

## はじめに
この課題は全10問中6問目の課題です。  
着任時に取り組むことができるExcel VBA初学者向けの課題を作成しました。
今回の課題では、If文とセルのフォーマット変更を組み合わせて、条件に応じた動的な処理を行うマクロを作成していただきます。条件に基づいてセルの背景色を変更することで、動的なデータ表示の基礎を学びます。

## 目次
- [目的](#目的)
- [前提](#前提)
- [課題内容](#課題内容)
- [実装手順](#実装手順)
  - [1. 標準モジュールを追加する](#1-標準モジュールを追加する)
  - [2. マクロのコードを記述する](#2-マクロのコードを記述する)
- [まとめ](#まとめ)
- [参考記事](#参考記事)

## 目的
If文とセルのフォーマット変更を組み合わせて、条件に応じた動的な処理を行う方法を学ぶことを目的としています。この課題を通じて、条件に基づいてセルの背景色を動的に変更する方法を実践的に学びます。

## 前提
この記事の内容を理解するためには、以下の参考記事を先に読むことをおすすめします。  
VBAの基礎を理解して課題に取り組んでください。
- [初心者でも図解で分かる！ VBEの基本的な使い方とVBAプログラムの基礎文法](https://atmarkit.itmedia.co.jp/ait/articles/1402/13/news040_3.html)

## 課題内容
**シートのA1からA10までのセルをチェックし、各セルの値が5以上の場合は背景色を緑色に、5未満の場合は赤色に変更するマクロを作成してください。**

## 実装手順

### 1. 標準モジュールを追加する
標準モジュールは、複数のシートやブック全体で使用できるマクロを格納するための場所です。VBAエディタで新しい標準モジュールを追加します。

### 2. マクロのコードを記述する
1. ExcelのVBAエディタを開いてください (`Alt + F11`)
2. 「挿入」→「標準モジュール」を選択し、以下のコードを入力します  
**※課題内容に取り組み、プログラムを開発した後に確認してください** 
```vb
Sub ChangeCellColor()

    Dim count As Long

    ' A1からA10までのセルをチェックし、条件に応じて背景色を変更する
    For count = 1 To 10
    
        If Range("A" & count).Value >= 5 Then
        
            Range("A" & count).Interior.Color = RGB(144, 238, 144) ' 緑色
            
        Else
        
            Range("A" & count).Interior.Color = RGB(255, 182, 193) ' 赤色
            
        End If
        
    Next count
    
End Sub
```

このコードは、シートのA1からA10までのセルをチェックし、各セルの値が5以上の場合は背景色を緑色に、5未満の場合は赤色に変更するマクロです。コードを入力した後、`F5`キーを押すか、VBAエディタの「実行」ボタンをクリックしてマクロを実行します。

## まとめ
今回の課題では、If文とセルのフォーマット変更を組み合わせたマクロを実装しました。これにより、条件に応じてセルの背景色を動的に変更する方法を学ぶことができます。今後は、この基本を応用して、さらに複雑な条件付き書式設定に挑戦してみてください。

## 参考記事
1. [【ExcelVBA入門】VBAで条件付き書式を追加する方法を徹底解説](https://www.sejuku.net/blog/68303)
2. [条件付き書式（FormatCondition）](https://excel-ubara.com/excelvba1/EXCELVBA391.html)
3. [VBA セルに条件付き書式を設定する](https://www.tipsfound.com/vba/07020-vba)
【課題】No.5 範囲内のセルに連番を入力するマクロの作成【Excel VBA】

## はじめに
この課題は全10問中5問目の課題です。  
着任時に取り組むことができるExcel VBA初学者向けの課題を作成しました。
今回の課題では、ループ処理を使用して複数のセルに連番を入力するマクロを作成していただきます。ループ処理の基本を学び、複数のセルに対して操作を行う方法を学んでいただければと思います。

## 目次
- [目的](#目的)
- [前提](#前提)
- [課題内容](#課題内容)
- [実装手順](#実装手順)
  - [1. 標準モジュールを追加する](#1-標準モジュールを追加する)
  - [2. マクロのコードを記述する](#2-マクロのコードを記述する)
- [まとめ](#まとめ)
- [参考記事](#参考記事)

## 目的
ループ処理の基本を学び、複数のセルに対して操作を行う方法を習得することを目的としています。この課題を通じて、範囲内の複数のセルに連番を入力する方法を実践的に学びます。

## 前提
この記事の内容を理解するためには、以下の参考記事を先に読むことをおすすめします。  
VBAの基礎を理解して課題に取り組んでください。
- [初心者でも図解で分かる！ VBEの基本的な使い方とVBAプログラムの基礎文法](https://atmarkit.itmedia.co.jp/ait/articles/1402/13/news040_3.html)

## 課題内容
**シートのA1からA10までのセルに1から10までの数字を順番に入力するマクロを作成してください。**

## 実装手順

### 1. 標準モジュールを追加する
標準モジュールは、複数のシートやブック全体で使用できるマクロを格納するための場所です。VBAエディタで新しい標準モジュールを追加します。

### 2. マクロのコードを記述する
1. ExcelのVBAエディタを開いてください (`Alt + F11`)
2. 「挿入」→「標準モジュール」を選択し、以下のコードを入力します  
**※課題内容に取り組み、プログラムを開発した後に確認してください** 
```vb
Sub FillNumbers()

    Dim count As Long

    ' A1からA10までのセルに1から10までの数字を入力する
    For count = 1 To 10
    
        Range("A" & count).Value = i
        
    Next count
    
End Sub
```

このコードは、ループ処理を使ってシートのA1からA10までのセルに1から10までの連番を順番に入力するマクロです。コードを入力した後、`F5`キーを押すか、VBAエディタの「実行」ボタンをクリックしてマクロを実行します。

## まとめ
今回の課題では、ループ処理を使用して範囲内のセルに連番を入力する基本的なマクロを実装しました。これにより、複数のセルに対して繰り返し操作を行う方法を学ぶことができます。今後は、この基本を応用して、さらに複雑な範囲操作に挑戦してみてください。

## 参考記事
1. [For...Next ステートメント](https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/fornext-statement)
2. [【Excel VBA入門】For文の使い方](https://valmore.work/excel-vba-for/)
3. [【VBA For Next】ループ処理の基本を5つのステップで完全理解](https://www.sejuku.net/blog/30720)
4. [【Excel VBA】繰り返し処理を解説！For Next文とDo Loop文の使い方教えます](https://youseful.jp/microsoft/excel/vba-for-loop/)
[Swift] [UIKit]コードベースでCustomCellを作成する時の注意点

アプリを作成する上でほぼ100%登場するであろうUITableView。カスタムセルで実装する事も多いかと思います。
 カスタムセルを作成する場合、
1. Xibを使用したインターフェースビルダーでUIを構築
2. コードベースで作成

の2パターンあるかと思います。
xibを使用する場合にはほとんど意識していなかったのですが、コードベースで作成する場合、思わぬところに落とし穴があったので、皆さんに共有したいと思います😄
## addSubview(〇〇Label)
コードベースでパーツをsubviewに配置します。
一見、何の問題もないかのように見えます。
実際、この後にレイアウトの設定を行うことで、問題なく表示することが出来ます😆

しかし、僕が実際に経験したことなのですが、
1. 下方向にスクロール
2. 上方向スクロールして同じ場所に戻ってくる(セルの再利用が行われる)
3. セルをタップする

すると、didSelectRowAtが機能しなくなるというバグが起きました😱
何が原因なのかも特定できずに、多くの時間を費やしてしまいました。

## [結論] tableViewCellにはcontentViewが存在するため、contentView.addSubview(〇〇Label)とする

https://developer.apple.com/documentation/uikit/uitableviewcell/1623229-contentview

>The content view of a UITableViewCell object is the default superview for content that the cell displays. If you want to customize cells by simply adding additional views, you should add them to the content view so they position appropriately as the cell transitions in to and out of editing mode.

説明がわかりづらいですが😅追加するだけでセルをカスタムしたい場合はContentViewに追加してね、という事のようです。
セルには編集モードも存在するため、contentViewに追加しないと編集モードの挙動なども意図しない挙動になりそうです。

実際にcontentViewにaddSubviewする事で上記のバグは改善されました。

![スクリーンショット 2024-08-20 14.10.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2428088/9eed11a5-a8f8-6862-6166-70245b84a673.png)

https://developer.apple.com/documentation/uikit/uitableviewcell

https://developer.apple.com/documentation/uikit/uicollectionviewcell

ちなみにCollectionViewCellのドキュメントにはしっかり

**Don’t directly add subviews to the cell itself.**

と強調してselfに追加しないでね!!と書いてました。(tableViewCellにも書いておいて欲しかった🥲)
【課題】No.4 If文を使用した条件付きメッセージボックス表示【Excel VBA】

## はじめに
この課題は全10問中4問目の課題です。  
着任時に取り組むことができるExcel VBA初学者向けの課題を作成しました。
今回の課題では、If文を使用して条件付きのメッセージボックスを表示するマクロを作成していただきます。条件分岐の基礎を学び、実際の業務での応用を目指します。

## 目次
- [目的](#目的)
- [前提](#前提)
- [課題内容](#課題内容)
- [実装手順](#実装手順)
  - [1. 標準モジュールを追加する](#1-標準モジュールを追加する)
  - [2. マクロのコードを記述する](#2-マクロのコードを記述する)
- [まとめ](#まとめ)
- [参考記事](#参考記事)

## 目的
If文の基本的な使用法を理解し、条件分岐の基礎を学ぶことを目的としています。この課題を通じて、ユーザーが入力した数値に応じてメッセージを表示する方法を実践的に学びます。

## 前提
この記事の内容を理解するためには、以下の参考記事を先に読むことをおすすめします。  
VBAの基礎を理解して課題に取り組んでください。
- [初心者でも図解で分かる！ VBEの基本的な使い方とVBAプログラムの基礎文法](https://atmarkit.itmedia.co.jp/ait/articles/1402/13/news040_3.html)

## 課題内容
**ユーザーに数値を入力させ、その値が10以上の場合は「10以上です」と表示し、10未満の場合は「10未満です」と表示するマクロを作成してください。**

## 実装手順

### 1. 標準モジュールを追加する
標準モジュールは、複数のシートやブック全体で使用できるマクロを格納するための場所です。VBAエディタで新しい標準モジュールを追加します。

### 2. マクロのコードを記述する
1. ExcelのVBAエディタを開いてください (`Alt + F11`)
2. 「挿入」→「標準モジュール」を選択し、以下のコードを入力します
**※課題内容に取り組み、プログラムを開発した後に確認してください** 
```vb
Sub CheckValue()

    ' ユーザーに数値を入力させる
    Dim userValue As Long
    userValue = InputBox("数値を入力してください。")

    ' 入力された値に基づいてメッセージを表示する
    If userValue >= 10 Then
    
        MsgBox "10以上です。"
        
    Else
    
        MsgBox "10未満です。"
        
    End If
    
End Sub
```
このコードは、ユーザーに数値を入力させ、その値が10以上か10未満かによって異なるメッセージを表示するマクロです。コードを入力した後、`F5`キーを押すか、VBAエディタの「実行」ボタンをクリックしてマクロを実行します。

## まとめ
今回の課題では、If文を使用して条件付きメッセージボックスを表示する基本的なマクロを実装しました。これにより、条件分岐の基礎を学ぶことができます。今後はこの基本を応用して、さらに複雑な条件分岐に挑戦してみてください。

## 参考記事
1. [If...Then...Else ステートメントを使用する](https://learn.microsoft.com/ja-jp/office/vba/language/concepts/getting-started/using-ifthenelse-statements)
2. [【VBA入門】条件分岐 |Ifステートメントを完全解説](https://youseful.jp/microsoft/excel/vba-ifstatement/)
3. [条件分岐（IF）](https://excel-ubara.com/excelvba1/EXCELVBA320.html)
4. [InputBox 関数](https://learn.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/inputbox-function)
5. [インプットボックス(InputBox関数)](https://excel-ubara.com/excelvba1/EXCELVBA324.html)
【課題】No.3 セルに固定の値を入力するマクロの作成【Excel VBA】

## はじめに
この課題は全10問中3問目の課題です。  
着任時に取り組むことができるExcel VBA初学者向けの課題を作成しました。
今回の課題では、シートの特定のセルに固定の値を入力するマクロを作成していただきます。VBAの基本的な操作を理解し、コード実行の流れを学んでいただければと思います。

## 目次
- [目的](#目的)
- [前提](#前提)
- [課題内容](#課題内容)
- [実装手順](#実装手順)
  - [1. 標準モジュールを追加する](#1-標準モジュールを追加する)
  - [2. マクロのコードを記述する](#2-マクロのコードを記述する)
- [まとめ](#まとめ)
- [参考記事](#参考記事)

## 目的
VBAの基本的な操作とコード実行の流れを理解することを目的としています。この課題を通じて、Excelシートの特定のセルに固定の値を入力する方法を実践的に学びます。

## 前提
この記事の内容を理解するためには、以下の参考記事を先に読むことをおすすめします。  
VBAの基礎を理解して課題に取り組んでください。
- [初心者でも図解で分かる！ VBEの基本的な使い方とVBAプログラムの基礎文法](https://atmarkit.itmedia.co.jp/ait/articles/1402/13/news040_3.html)

## 課題内容
**シートのA1セルに「Hello, World!」という文字列を入力するマクロを作成してください。**

## 実装手順

### 1. 標準モジュールを追加する
標準モジュールは、複数のシートやブック全体で使用できるマクロを格納するための場所です。VBAエディタで新しい標準モジュールを追加します。

### 2. マクロのコードを記述する
1. ExcelのVBAエディタを開いてください (`Alt + F11`)
2. 「挿入」→「標準モジュール」を選択し、以下のコードを入力します
**※課題内容に取り組み、プログラムを開発した後に確認してください** 
```vb
Sub HelloWorld()

    ' A1セルに文字列を入力する
    Range("A1").Value = "Hello, World!"
    
End Sub
```
このコードは、ExcelシートのA1セルに「Hello, World!」という文字列を入力するシンプルなマクロです。コードを入力した後、F5キーを押すか、VBAエディタの「実行」ボタンをクリックしてマクロを実行します。

## まとめ
今回の課題では、Excelシートの特定のセルに固定の値を入力する基本的なマクロを実装しました。これにより、VBAの基本的な操作方法とコードの実行フローを理解することができます。今後の課題でもこの基本を活かして、さらに複雑な操作に取り組んでいきましょう。

## 参考記事
1. [Excel VBAの標準モジュールとシートモジュールの違い](https://excel-ubara.com/excelvba4/EXCEL251.html)
2. [Office VBAの基礎知識](https://learn.microsoft.com/ja-jp/office/vba/library-reference/concepts/getting-started-with-vba-in-office) 
3. [セルに数字や文字を入れる](https://excel-ubara.com/excelvba1r/EXCELVBA503.html)
【課題】No.2 終了時に実行されるマクロの作成【Excel VBA】

## はじめに
この課題は全10問中2問目の課題です。  
着任時に取り組むことができるExcel VBA初学者向けの課題を作成しました。
今回の課題では、終了時に自動的に実行されるマクロを作成していただきます。
アプリケーションの終了処理を制御する方法を学び、業務効率化やUXの向上に役立てていただければと思います。

## 目次
- [目的](#目的)
- [前提](#前提)
- [課題内容](#課題内容)
- [実装手順](#実装手順)
  - [1. [Workbook_BeforeClose]イベントを利用する](#1-workbook_beforeclose-イベントを利用する)
  - [2. マクロのコードを記述する](#2-マクロのコードを記述する)
- [まとめ](#まとめ)
- [参考記事](#参考記事)

## 目的
終了時に実行されるマクロの作成方法を学び、アプリケーションの終了処理を制御する方法を理解することを目的とします。この課題を通じて、ユーザーがExcelファイルを閉じる際に確認メッセージを表示し、意図的な操作でのみ終了させる方法を実践的に学びます。

## 前提
この記事の内容を理解するためには、以下の参考記事を先に読むことをおすすめします。  
VBAの基礎を理解して課題に取り組んでください。
- [初心者でも図解で分かる！ VBEの基本的な使い方とVBAプログラムの基礎文法](https://atmarkit.itmedia.co.jp/ait/articles/1402/13/news040_3.html)

## 課題内容
**Excelファイルを閉じる際に、自動的に「終了します。」のメッセージボックスを表示して閉じるマクロを作成してください。**

## 実装手順

### 1. `Workbook_BeforeClose` イベントを利用する
`Workbook_BeforeClose` イベントは、Excelブックが閉じられる直前に実行されるイベントです。このイベントにVBAコードを記述することで、ファイルが閉じられる前に特定のアクションを実行することができます。たとえば、ユーザーに確認を求めたり、保存を促すメッセージを表示することが可能です。

### 2. マクロのコードを記述する
1. ExcelのVBAエディタを開いてください (`Alt + F11`)
2. 「ThisWorkbook」をダブルクリックし、以下のコードを入力します
**※課題内容に取り組み、プログラムを開発した後に確認してください**
```vb
Private Sub Workbook_BeforeClose(Cancel As Boolean)

    ' 終了メッセージを表示する
    MsgBox "終了します。", vbInformation
    
End Sub
```
このコードは、Excelファイルを閉じるときに「終了します。」というメッセージボックスを表示し、その後ファイルが閉じられます。コードを入力した後、F5キーを押すか、VBAエディタの「実行」ボタンをクリックしてマクロを実行します。

## まとめ
今回の課題では、Excelファイルを閉じる際にユーザーへ確認を求めるマクロを実装しました。これにより、意図しないファイルの終了を防ぎ、ユーザーにとってより安全な操作を実現できます。実際の業務に応じて、他の確認メッセージや処理を追加することで、さらにカスタマイズ性を高めることが可能です。

## 参考記事
1. [ブックを閉じるときにマクロを自動的に実行する](https://learn.microsoft.com/ja-jp/office/vba/api/excel.workbook.beforeclose)
2. [ブックが閉じる時に自動実行（Workbook_BeforeCloseとAuto_Close）](https://excel-ubara.com/excelvba4/EXCEL240.html)
【課題】No.1 起動時に自動実行されるマクロの作成【Excel VBA】

## はじめに
この課題は全10問中1問目の課題です。  
着任時に取り組むことができるExcel VBA初学者向けの課題を作成しようと思い、この記事を作成しました。
今回の課題では、起動時に自動的に実行されるマクロを作成していただきます。Excelのカスタマイズを学ぶことで、業務効率化やUXの向上に役立てていただければと思います。

## 目次
- [目的](#目的)
- [前提](#前提)
- [課題内容](#課題内容)
- [実装手順](#実装手順)
  - [1. [Workbook_Open]イベントを利用する](#1-workbook_open-イベントを利用する)
  - [2. マクロのコードを記述する](#2-マクロのコードを記述する)
- [まとめ](#まとめ)
- [参考記事](#参考記事)

## 目的
起動時に自動実行されるマクロの作成方法を学び、Excelのカスタマイズ性を理解することを目的とします。
このマクロを作成することで、Excelファイルを開くたびに特定のシートを表示し、ユーザーにウェルカムメッセージを提供する機能を実現します。

## 前提
この記事の内容を理解するためには、以下の参考記事を先に読むことをおすすめします。
VBAの基礎を理解して課題に取り組んでください。
- [初心者でも図解で分かる！ VBEの基本的な使い方とVBAプログラムの基礎文法](https://atmarkit.itmedia.co.jp/ait/articles/1402/13/news040_3.html)

## 課題内容
**Excelファイルを開いた際に、自動的に特定のシートをアクティブにし、メッセージボックスで「Welcome!」というメッセージを表示するマクロを作成してください。**

## 実装手順
### 1. `Workbook_Open` イベントを利用する
Excelブックが開かれたときに自動的に実行されるイベントです。このイベントにVBAコードを記述することで、ファイルを開いた瞬間に特定のアクションを実行することができます。たとえば、特定のシートをアクティブにしたり、メッセージを表示させたりすることが可能です。

### 2. マクロのコードを記述する
1. ExcelのVBAエディタを開いてください (`Alt + F11`)
2. 「ThisWorkbook」をダブルクリックし、以下のコードを入力します
**※課題内容に取り組み、プログラムを開発した後に確認してください** 
```vb
Private Sub Workbook_Open()

    ' 特定のシートをアクティブにする
    Sheets("Sheet1").Activate
    
    ' メッセージボックスでメッセージを表示する
    MsgBox "Welcome!"
    
End Sub
```
このコードは、Excelファイルを開くと自動的にシート「Sheet1」をアクティブにし、メッセージボックスで「Welcome!」というメッセージを表示します。コードを入力した後、F5キーを押すか、VBAエディタの「実行」ボタンをクリックしてマクロを実行します。

## まとめ
今回のマクロは、Excelファイルを開いた際に自動で実行される基本的な起動時処理を紹介しました。これにより、Excelをユーザーにとってさらに使いやすくカスタマイズできるようになります。実際の業務に応じて、表示メッセージやアクティブにするシートを変更することで、さらに便利に活用できます。

## 参考記事
1. [ブックを開いたときにマクロを自動的に実行する](https://support.microsoft.com/ja-jp/office/%E3%83%96%E3%83%83%E3%82%AF%E3%82%92%E9%96%8B%E3%81%84%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AB%E3%83%9E%E3%82%AF%E3%83%AD%E3%82%92%E8%87%AA%E5%8B%95%E7%9A%84%E3%81%AB%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B-1e55959b-e077-4c88-a696-c3017600db44)
2. [ブックが開いた時に自動実行（Workbook_OpenとAuto_Open）](https://excel-ubara.com/excelvba4/EXCEL239.html)
3. [VBA MsgBox関数について　～関数の解説と使用例～](https://www.bold.ne.jp/engineer-club/vba-msgbox)
gpt-4o-miniとCursorで楽々爆安AIコーディング

翻訳するときにも生成AIは役に立ちます。でも、翻訳してくださいとか、英訳してくださいとか入れるの面倒くさいですよね。できればDeepLみたいなアプリ使いたいですよね。

ということで、趣味エンジニアもグッと利用しやすくなったgpt-4o-miniをモデルエンジンとして動作する翻訳アプリをCursor(model:gpt-4o-mini)で開発というか修正する過程をシェアします。アプリ自体はGithubから入手したものを利用させていただいています。

# OpenAI APIを利用可能にする
- OpenAIアカウントを作成
- クレジットを登録
- 10ドルを追加
- OpenAIのAPI Keyを発行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161223/4638896e-8aca-3e8c-7e83-11b4f19aa4ab.png)

# Cursorを利用可能にする
- Cursorを[ダウンロード](https://www.cursor.com/)、起動する
- 上記で発行したOpenAIのAPIキーを登録する
- gpt-4o-miniはマニュアルで追加
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161223/df26c952-d331-b7a7-1e2c-4231ca7b584f.png)


# 開発開始
今回は以下のアプリケーションを利用させていただく。
https://github.com/simpleapples/chatgpt-translator

アプリケーションのビルドまではREADMEを見て対応してほしい。

ビルドされたものを起動すると以下のアプリが表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161223/3a7e552f-f293-0474-8957-548907d26643.png)

settingsを見ると選択できるモデルが少ないので最近でたgpt-4o-miniを追加する修正をCursorで行なう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161223/296c2275-f58b-7684-378e-c401bccb5b0a.png)

Cursorで以下のように質問して、with codebaseをクリックする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161223/7ce40bd0-4dc5-6ad2-6de1-8c09a9ee48ab.png)

こんな感じで修正箇所を出してくれる。gpt-4o-miniを使用したので少し心配していたが正しく、修正対象ソースと変更内容を返してくれる。あとは、Applyすれば変わる。
すごいね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161223/6aeb7718-d412-069a-9661-ffb2c5a3eceb.png)


OpenAIのUsageを見てみると、Cursorからの利用はgpt-4o-miniモデルで動いているのがわかる。コスト面も安心だ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/161223/cb24f929-afce-7cfe-7c49-294a8d97963d.png)

ビルド後に再起動した手元の翻訳アプリも当然gpt-4o-miniを指定することで正しく動作した。翻訳品質的には全く問題は感じない。

# 楽々爆安AIコーディングの感想
gpt-4o-miniは以下の圧倒的な高コストとクイックレスポンスが売りでもありますのでこれを使わない手はないですね。

```
gpt-4o-mini料金
入力トークン：100万トークンあたり15セント
出力トークン：100万トークンあたり60セント
```

既存のアプリケーションの修正を行なうときは全体を調べてアップデートすることは結構大変なので、AIからの支援が得られるのは馴染みのない言語やフレームワークの時だととても助かります。
ただ、大きなモノリシックアプリだと修正箇所の全てを教えてくれるかというとそうでもないと思うので、ユニットテスト、CI/CD的なものはお作法としては必要です。
次はオンプレのモデルに投げるように更新したいと思います。

AIコーディングを楽しみましょう。
Next.jsをFirebaseにデプロイすると<Image>が使えない

# はじめに

Next.jsのアプリケーションのデプロイで動作が予想通りに行かなかったのでまとめます

# 問題

以下のようなコードを書いてでデプロイをしたところ画像が表示されませんでした

```tsx
 <article className="flex items-center w-[300px] cursor-pointer group">
            <div className="relative">
              <div className="w-24 h-24 rounded-full overflow-hidden">
                <Image
                  src="/sample-article.jpg"
                  alt="sample article"
                  width={100}
                  height={100}
                  className="object-cover object-center w-full h-full group-hover:scale-110 transition-transform duration-300"
                />
              </div>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/7b12c751-4c46-9d9d-bdfa-78fa02d147e1.png)

# 解決方法

Firebaseとの相性が悪く画像最適化する`Image`タグが使えないようです。

HTMLの`<img>`タグに変えることで表示するようにしました

ちなみに`svg`はうまく読み込める。`png`や`webp`、`jpg`などはできなさそうでした

# おわりに

FirebaseでNext.jsをやるなら新しいFirebase Appを使うほうが良さそうです

# 参考

https://stackoverflow.com/questions/68890916/firebase-storage-image-not-displaying-in-nextjs-application
foobar2000でグルーピングの仕切り線やカラムを特定プレイリストのみ表示させる設定

# 前提

下記のColumns UI導入が済んでいる前提です。

https://qiita.com/waokitsune/items/df0a4158fe418b6e39c7

# 概要

『アルバムを区切るグルーピングの仕切り線』や『トラック番号』は **たくさんのアルバムを集めたプレイリストの時は便利** です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/f7b30f17-2cde-dca9-51dd-380f96269c21.png)

ですが、★5の曲だけ集めたプレイリストの場合は邪魔になってしまいます。

プレイリストごとにカラムやグルーピングの仕切り線の表示or非表示の設定をしたい！

# やり方

グルーピングの仕切り線については…
『Display』
『Columns UI』
『Playlist view』
『Grouping』
下記をダブルクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ca3a6923-1883-cb7b-fad1-5edd7c76f652.png)

こんなふうに『Playlist filters』で **指定プレイリストのみ表示** の設定できます。
指定したいプレイリストが複数ある時は ```;``` で区切ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/27435b7a-b937-69b0-0e30-c7cfc61aa806.png)

カラムは『Columns』の『Playlist filters』で。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ba3b871c-34c5-fa52-41b5-8b24f24cd4f0.png)

# バージョン

Microsoft Windows [Version 10.0.22631.4037]
foobar2000 v2.1.5 [×64]
習慣化が得意だと思っていた私がハマった罠

## はじめに

この記事は、「習慣化の解像度が上がった」というポエムです。

## 習慣化が得意だと思っていた

私はQiitaへの毎日投稿/毎週投稿や毎日学習などを達成できています。
周りからも「習慣化がすごい」などとフィードバックをいただくことが多いです。

**習慣化は得意な方だと思っていました。**

## 習慣には「やる習慣」と「やめる習慣」がある

[「努力は仕組み化できる」](https://amzn.asia/d/89nZoVl)という本を読んで、習慣には「やる習慣」と「やめる習慣」があると知りました。

「やる習慣」は、例えば、毎日記事を書くようにするといった習慣化です。
「やめる習慣」は、例えば、お酒をやめるといった習慣化です。

習慣化は得意なはずなのに、ダイエットがうまくできない原因がよくわかりました。
実は、私は「やる習慣」が得意で、「やめる習慣」が苦手でした。

私にとっては目からウロコでした。

習慣化が得意だと思っていた私にとっては罠のようなものです。得意領域で、できると思い込んでいたことが実際には苦手なことでした。抜け出すのに時間を要しました。

## やめる習慣

次にやめる習慣について学ぶべく、[「「やめる」習慣」](https://amzn.asia/d/ewLmRkF)という本を読みました。学びを共有します。

悪い習慣がやめられない理由は以下の三つです。
* 習慣に引っ張られるから
* 無意識に変化を拒否するから
* 欲望と理性の戦い

悪い習慣をやめるために、心理メリットを言語化して行動をスイッチングする。そしてスイッチングを検証するのが有効です。

例えば、
心理メリット＝疲労を忘れるためにお酒を飲む
スイッチング＝お酒を炭酸飲料にする
です。

このスイッチングがうまくいくかを検証します。

そして、「行動の直後に味わう感情」が習慣づくりに有効です。私は感情をアウトプットするために、日記を書くようにしました。

## 得意だと思っていることに罠がある

得意だと思っていた領域の中に、実は苦手なものがありました。

私は習慣化の中で見つけましたが、きっと他にもあると思います。

自分が得意だと思っている領域を疑い、そして慢心することなく、解像度を上げるようにしていきたいと思います。

それでは。