雑多なブログ

音楽や語学、プログラム関連の話題について書いています

2022年上半期・基本情報技術者試験(CBT)の申込・試験実施期間

2022年上半期の試験の申し込みと試験日程は下記の通り。
CBT方式の試験は4月ではなかった。

令和4年度上期基本情報技術者試験(CBT方式)
1. 試験実施期間
  午前試験:令和4年4月1日(金)~5月24日(火)
  午後試験:令和4年4月1日(金)~5月29日(日)
  免除試験:令和4年4月1日(金)~5月24日(火)

2. 申込受付期間
  午前試験:令和4年3月1日(火)~5月19日(木)
  午後試験:令和4年3月1日(火)~5月24日(火)
  免除試験:令和4年3月1日(火)~5月19日(木)

3. 受験手数料
  7,500円(消費税込み)

4. その他
(1) 免除試験とは、基本情報技術者試験の一部(午前試験)を免除し、午後試験のみ受験する試験です。免除試験を予約するには、認定講座開設者が発行した修了認定者管理番号が必要となります。基本情報技術者試験の一部(午前試験)を免除される制度についてはこちらをご参照ください。
(2) 試験の実施概要や応募者への注意事項等を記載した試験実施概要は後日公開します。

出典: https://www.jitec.ipa.go.jp/1_00topic/topic_20211220.html

とりあえず、まだ申し込み期間ではなかったので、3月になったら申し込みをする予定。

twitterの 「#駆け出しエンジニアと繋がりたい」ってハッシュタグがヤヴァイ件

普段からtwitterは利用していて、プログラミング・IT関連のユーザーの投稿を見て新しい情報を得る事が多い。自分が知らない特殊な事から、最近のトレンドまで他者の投稿から得られて良いなーと思っている。

最近、「#駆け出しエンジニアと繋がりたい」ってハッシュタグの投稿がレコメンドされてきて、そのハッシュタグ関連のツイートも見ているのだけど、そこに投稿しているユーザーに業者が多くて辟易する。ざっと見てみると、次の系統の業者の営業アカウントが多数このハッシュタグでツイートしている。

  • 転職関連
  • 人材派遣
  • プログラミングスクール
  • 怪しいプログラミング関連の情報商材

別にtwitterマーケティングに使うのは否定しないけど、営業臭100%のアカウントって、萎えるよね。というか、経験や知識の浅い人を鴨にしようという魂胆が見え見え。

特にプロフィール欄に

未経験からエンジニアに転職して年収1000万になれる!

みたいな記述があるアカウントはスパム認定しても良いと考えている。

そもそも

プログラミング関連のテーマが情報商材屋に汚染されていて、ノイズがめちゃくちゃ増えた!

python3.10でmatch式が導入された

なんかpython3.10にmatch式が導入されていた。
条件を case 値 で記述する。例文では数値しか使っていないが、タプルや配列を条件に指定することもできる。

match value:
    case 100 | 200 | 300:
        print("100 or 200 or 300のどれかだよ!")
    case 900:
        print("900だよ!")
    case _:
        print("その他だよ!")

a, b, cのいずれかに該当する場合にまとめてマッチさせたい場合は、 case a | b | c と記述できる。 case _ と記述すると、その他に該当する全てにマッチする(switchのdefaultみたいな感じ)。

ちなみに、phpもv8以降でmatchが導入されているし、割と最近の言語はmatchに対応している言語が増えているような気がする。

参考サイト docs.python.org

Laravel Fortify/Jetstream でマルチログインの実装(調査)

Laravel8 Fortify/Jetstream で、マルチログイン(ユーザーサイトと管理サイト別々に認証)を実現する方法について調べている。

結論から言うと、Laravel Fortify/Jetstreamは非対応。 なので、マルチログイン実現するためには、実装のカスタマイズが必要な事が分かった。

実装の方針としてはざっくり次の通り。

  • マルチログイン用のガードの設定を追加する
  • Fortify/Jestreamの認証基盤をまるごと複製
  • 細かい実装を調整する

マルチログイン用のガードの設定を追加する

例えば、user、ownerの2系統でログインできるようにしたい場合は、guard(config/auth.php?)に設定を追加する。 ここはLaravelの標準的な設定の範囲。

Fortify/Jestreamの認証基盤をまるごと複製

既存の実装がマルチログインに適した実装になっていないので、 必要な箇所だけ抽出して差し替える、という方法よりも丸ごと複製して、マルチログイン用にカスタマイズするのが良いと思う。

「ログインなんて1箇所だけでしょ、userもadminも一緒のログインページからログインして、ロールとか権限で分けるでしょ? マルチログインなんて知らんよ」

みたいな実装になっているので、部分的に抜き出して修正する形だと不便になるケースが多いと思う。

細かい実装を調整する

全段で書いたように、マルチログインに適した実装になっていない。 例えば、URLや認証で使用するセッション名など細かな部分が固定値になっており、userとadminを別々に管理したい、と思ってもそのままで使えないのだ。

まとめ

Fortify/Jetstreamとか使わず、MPAとして実装するのであれば、 もっとシンプルになる気もするけど、今後はどうなんだろう。

やってみると、フレームワーク側でなんでもできるのは一見すると便利そうだけど、フレームワークのレールに沿わない事をやりたい場合に、急激に難易度が上がる気がすると感じる。

python基礎文法

pythonを使う必要性が出てきたので、改めて学び直している。 そんでもって、学んだことをこの記事にまとめている。

TOC

変数

変数の定義は次の構文で定義する。

編数名 = 値

num = 9
value = "hogehoge"

文字列

文字列の記述の仕方には複数ある。

シングルクオーテーション('...')

value = 'aiueo`

ダブルクオーテーション("...")

value = "aiueo"

ヒアドキュメント

value = '''
    あいうえお
    かきくけこ
'''
value = """
    あいうえお
    かきくけこ
"""

ソースはインデントしたいが、文字列自体にインデントを含めたくない場合は textwrap.dedent() を使う。

import textwrap

value = textwrap.dedent('''
    あいうえお
    かきくけこ
    さしすせそ
''')

制御構文

if文

pythonのif文は次のキーワードを使用する。
elif は慣れるまでは間違えやすいと思う。

if
elif
else

value = int(input("数値を入力してけれ"))

if value > 1000:
    print("めちゃくちゃ大きい")
elif value > 10:
    print("ちょっと大きい")
else:
    print(”小さい")

for

for 変数 in オブジェクト:
    実行する処理
    ....

for n in [1, 2, 3, 4, 5]:
    print(n)

実行結果

1
2
3
4
5

rangeオブジェクト

構文

range(開始, 終了[, ステップ数)

例1

for n in range(1, 4):
    print(n)

実行結果

1
2
3

例2

for n in range(1, 10, 3):
    print(n)

実行結果

1
4
7

while

while 条件:
    実行する処理
    ....

n = 0

while n < 10:
    print(n)
    n = n + 1

実行結果

0
1
2
3

ループ処理の応用

continue

ループをスキップする。

for n in range(5):
    if n % 5 == 1:
       continue
    print(n)

break

ループを中断する。

for n in range(5):
    if n  == 3:
        break
    print(n)

実行結果

0
1
2

rust: Option型

Rust には値が存在しない可能性がある場合に使用する、Option 型が用意されている。 Option型は、値が存在する場合と、空の場合がある時に値を操作するのに便利。

Option型の定義は次の通り。

enum Option<T> {
    None,
    Some(T)
}

使用例

let values = vec!["hoge", "fuga", "moge", "gegege"];

println!("{:?}", values.get(0));
println!("{:?}", values.get(2));
println!("{:?}", values.get(100));

出力は次の通り。

Some("hoge")
Some("moge")
None

1〜2回目は配列内のインデックスにアクセスしているため、 結果は Some("hoge")Some("moge") となっている。 100番目の要素を取得しようとすると、パニックにならず None が返された。

パターンマッチ

Some() の中身にアクセスするには、パターンマッチングが利用できる。

let values = vec!["hoge", "fuga", "moge", "gegege"];

for &idx in [0, 1, 3, 5, 100].iter() {
    match values.get(idx) {
        Some(text) => println!("{}", text),
        None => println!("値はありません"),
    }
}

この例を実行すると、出力は次のようになる。

hoge
fuga
gegege
値はありません
値はありません

if let式

if let式を使って、こういった書き方もできる。

let values = vec!["hoge", "fuga", "moge", "gegege"];
if let Some(value) = values.get(100) {
    println!("{}", value);
} else {
    println!("値はありません:");
}   

if let Some(value) = values.get(1) {
    println!("{}", value);
}   

rust: 現在日時を取得する

現在日時を取得するサンプルを作って遊んだ。
時刻の取得にはchronoというcrateが使用できる。

Cargo.toml

chrono = "0.4"

main.rs

use chrono::Local;

fn main() {
    println!("{}", Local::now().format("%Y年%m月%d日 %H:%M:%S"));
}