OmniAICreator/Qiita-1.07M huggingface dataset:
Pythonで「マッチオブジェクトからマッチした文字列の情報を取得する(Match)」の動作を確認してみた

# 概要

Pythonで「マッチオブジェクトからマッチした文字列の情報を取得する(Match)」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/python/regex/index4.html

# 実装

以下のファイルを作成しました。
```sample.py
import re

msg = 'My birthday is 1998/09/25'
pattern = re.compile(r'\d{4}/\d{2}/\d{2}')

result = pattern.search(msg)
if result :
    print('Match:' + result.group(0))

import re

msg = 'My birthday is 1998/09/25'
pattern = re.compile(r'(\d{4})/(\d{2})/(\d{2})')

result = pattern.search(msg)
if result :
    print('Match:' + result.group(0))
    print('Group1:' + result.group(1))
    print('Group2:' + result.group(2))
    print('Group3:' + result.group(3))

import re

msg = 'My birthday is 1998/09/25'
pattern = re.compile(r'(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d{2})')

result = pattern.search(msg)
if result :
    print('Match:' + result.group(0))
    print('Group[year]:' + result.group('year'))
    print('Group[month]:' + result.group('month'))
    print('Group[day]:' + result.group('day'))

import re

msg = 'My birthday is 1998/09/25'
pattern = re.compile(r'(\d{4})/(\d{2})/(\d{2})')

result = pattern.search(msg)
if result :
    print(result.group(1, 2, 3))

import re

msg = 'My birthday is 1998/09/25'
pattern = re.compile(r'\d{4}/\d{2}/\d{2}')

result = pattern.search(msg)
if result :
    print('Match:' + result.group(0))
    print('StartIndex:' + str(result.start(0)))
    print('EndIndex:' + str(result.end(0)))

import re

msg = 'My birthday is 1998/09/25'
pattern = re.compile(r'(\d{4})/(\d{2})/(\d{2})')

result = pattern.search(msg)
if result :
    print('Group1:' + result.group(1))
    print('StartIndex:' + str(result.start(1)))
    print('EndIndex:' + str(result.end(1)))

import re

msg = 'My birthday is 1998/09/25'
pattern = re.compile(r'(\d{4})/(\d{2})/(\d{2})')

result = pattern.search(msg)
if result :
    for i in range(result.lastindex):
      print('Group:' + str(i + 1) + ' ' + result.group(i + 1))
```

以下のコマンドを実行しました。
```
$ python3 sample.py 
Match:1998/09/25
Match:1998/09/25
Group1:1998
Group2:09
Group3:25
Match:1998/09/25
Group[year]:1998
Group[month]:09
Group[day]:25
('1998', '09', '25')
Match:1998/09/25
StartIndex:15
EndIndex:25
Group1:1998
StartIndex:15
EndIndex:19
Group:1 1998
Group:2 09
Group:3 25
```

# まとめ

何かの役に立てばと。
How to Choose the Best Mobile App Development Company in the UK?

In the bustling tech landscape of the UK, selecting the ideal mobile app development company is a pivotal decision. Here’s a guide to ensure you make an informed choice and elevate your app development journey.

Points to look for for choosing mobile app development company

Begin with clarity - 
Define your app's goals, understand your audience, and set realistic budgets. This sets the foundation for finding the best <a href="https://www.mobileappexperts.co.uk/mobile-app-development-company">mobile app development company in UK</a> aligned with your vision.

Research is key - 
Explore portfolios, read client testimonials, and check for industry accolades. A company's past projects and client experiences speak volumes about their capabilities and reliability.

Technical prowess matters - 
Assess the company's expertise in programming languages, their track record in handling complex projects, and their adaptation to emerging technologies.

Industry experience adds value -
Opt for a company familiar with your industry's nuances. Success stories and an understanding of industry-specific regulations ensure a smoother development process.

Evaluate project management -
Effective communication, transparent reporting, and adaptive project management methodologies are non-negotiables for a successful collaboration.

Consider team composition -
A skilled team with diverse talents, including developers, designers, project managers, and QA experts, ensures comprehensive support throughout your project.

Conclusion: Elevate Your App Dreams with Mobile App Experts

In the vibrant landscape of mobile app development, your journey deserves a trusted partner. At <a href="https://www.mobileappexperts.co.uk/">Mobile App Experts</a>, we go beyond conventional development – we craft experiences. Our seasoned team brings technical prowess, industry insights, and a commitment to excellence. Elevate your app dreams with us – where innovation meets expertise. Trust Mobile App Experts to turn your vision into a reality.
Bootstrap 5に関するメモ


### 開発環境
- Windows 10 Pro(64bit)
- Bootstrap 5.3.0
- Bootstrap bundle.s 5.3.0
- jQuery 3.7.1

:::note info
随時、追加予定
:::


### 現在表示しているオフキャンバスをメソッドから閉じたい場合
```javascript
// 現在開いているオフキャンバスのインスタンスを取得して、メソッドを呼び出している。
const $myOffCanvas = $('#myOffCanvas');
const offcanvas = bootstrap.Offcanvas.getInstance($myOffCanvas);
offcanvas.hide();
```
仮説検定の流れ

仮説検定の流れを説明します。
※間違っているかもしれませんが、大目に見てください。なんなら、間違ってる箇所があれば教えて頂けると嬉しいです。

１　例えばA群とB群との間の関係性、差がないかどうかを考える（対立仮説）
２　でも証明方法がないから、逆の発想でまず最初から２群間に差がないと仮定する（帰無仮説）
３　そうすると、矛盾点がたくさん出てくる
４　となると、この帰無仮説は否定される
５　つまり、２群間に差があると分かる

帰無仮説で、重要な指標になってくるのが、P値です。これは何を表しているかというと、確率を表しています。
つまり、帰無仮説が肯定される確率、否定される確率がこのP値で分かる、ということです。
このP値が0.05未満（P<0.05）である場合、帰無仮説が否定されます。つまり、対立仮説が肯定されるわけです。
これをよく言われる言葉で言うと、「有意差がある」という。

以上が大まかな仮説検定の流れです。

またいろいろ勉強したことを書いていこうと思います。
Taza Stories Review: Discover Inspiring Stories and Entertainment at TazaStories.com

Welcome to TaazaStories.com! Your go-to place for everything new and thrilling. Explore the latest news, Bollywood gossip, exclusive celebrity interviews, and entertainment buzz. But wait, there's more! We also share inspiring true stories and much more. Keep coming back for fresh content and stay updated on all the latest events. Welcome aboard!
More Info-	
https://tazastories.com/
Mongo リストの合計数、条件付き範囲のクエリー

```javascript:user.js

$project: {
            _id: 1,
            
            totalQuestClearCount: {
                $reduce: {
                    input: { $ifNull: ["$quests", []] },
                    initialValue: 0,
                    in: {
                        $cond: [{ $eq: ["$$this.storyId", 0], $eq: ["$$this.totalClearCount", 1] },
                        { $add: ["$$value", 1] },
                            "$$value"
                        ]
                    }
                }
            },
        }

```
外部との日程調整を楽にしたいんじゃ！

# やりたいこと
社内外部のお客さんと MTG することって多いですよね。そんな時には、自分のカレンダーから空き時間を抽出して、候補をリストアップしてメールに書いてお客さんに送って、返信待っている間に候補が他の MTG で埋まっちゃって、その旨メールで連絡して、入れ違いでお客さんからその時間にお願いしますと返信が来てバッティングしたので調整し直して、、みたいなことがありますよね。
上記はだいぶ大げさに書きましたが、日程調整って割と面倒な作業なので少しでも楽にしたいなと思って、各カレンダーの機能で効率化してみます。ユーザが多いであろう、Google カレンダーと Outlook が対象です。

# 結論
* Google カレンダーなら [予約スケジュール](https://support.google.com/google-workspace-individual/answer/11608416?hl=ja) を使う
* Outlook なら [スケジュールポーリング](https://support.microsoft.com/ja-jp/office/%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E8%A8%AD%E5%AE%9A%E3%81%AE%E3%83%9D%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B-34176e59-c87a-4a19-85a4-bb35050ace02) を使う

# 詳細
## 予約スケジュール (Google カレンダー)
Google カレンダー上で、スケジュールの空き時間を設定することでその空き時間を予約できるようにする機能。自分のカレンダーはもちろん、複数人のカレンダーから空き時間を設定することもできる。
予約スケジュールを作成すると共有リンクが作成されるので、そのリンクをお客さんに送って好きな時間帯を予約してもらえば日程調整完了！予約時に自動で Google Meet のリンクを発行することもできる。
お客さんが Google Workspace を使っていなくても利用できる。

詳しくは公式ドキュメントで。
https://support.google.com/google-workspace-individual/answer/11608416?hl=ja

## スケジュールポーリング (Outlook)
Outlook 上で空き時間を設定して日程調整する機能。基本的には Google カレンダーと似ているが、違うのは設定された各空き時間に投票するという点。全参加者からの投票が終わって主催者側で確定できる。
投票待ちの時点では、設定した空き時間は仮予約の形でカレンダーには表示される。Teams 会議で設定すれば自動で発行もしてくれる。個人的に UI がやや分かりにくい印象。
こちらもお客さんが Office365 を使っていなくても利用できる。

詳しくは公式ドキュメントで。
https://support.microsoft.com/ja-jp/office/%E3%83%9D%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%AE%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E8%A8%98%E4%BA%8B-7b5ff6c7-4f65-48e6-89b8-3f053c40e382

# ということで
Google カレンダーと Outlook それぞれで外部との日程調整を楽にする方法をまとめてみました。
弊社は Google Workspace を使っているので、Google カレンダーの予約スケジュールを使うことになりますが、Outlook のスケジュール設定も覚えておきたいですね！ (個人的には Google カレンダーの機能の方が好みです🥰)

以上です。
NetBSD/evbarmでffmpeg

armv6(non-hf)のpkgは無くて、armv6でも使えるarmv4のpkgの中にはffmpegが無いので、armv6のc1kでffmpegをセルフビルドしてみます。pkg_addでgmakeをインストールしておきます。

基本機能だけをためしてみたいので、外部のライブラリは一切使いません。

configureしてgmakeします。

12時間以上たって最後の所で

```
LD      ffmpeg_g
gcc: fatal error: Killed signal terminated program ld
compilation terminated.
gmake: *** [Makefile:136: ffmpeg_g] Error 1
c1k$ 
```

残念無念。

仕方がないのでクロスビルドを試して見ます。

non-hfなターゲットでビルドエラーがでるので、configureにpatchをあてます。

```
    elif enabled arm || enabled aarch64; then
#        enable fast_float16
    fi
```

configureを実行します。

```
./configure --enable-cross-compile\
 --cross-prefix=armv6--netbsdelf-eabi-\
 --sysroot=../netbsd-10/obj/destdir.evbarm/\
 --arch=armel\
 --target-os=netbsd\
 --extra-libs=../netbsd-10/obj/destdir.evbarm/usr/lib/crti.o\
 --enable-openssl\
 --disable-doc
```

netbsdのtoolsにパスを通してgmakeします。

Ryzenでビルドは10分くらいでできます。

crti.oをつけないとELFにnoteが付かず実行できません。ファイルの指定ではなくて、ldのオプションなどでも出来そうですが、分かりません。

ffmpegを実機にscpして試して見ます。

```
c1k$ ./ffmpeg
ffmpeg version N-114212-gf5441e441f Copyright (c) 2000-2024 the FFmpeg developers
  built with gcc 10.5.0 (NetBSD nb3 20231008)
  configuration: --enable-cross-compile --cross-prefix=armv6--netbsdelf-eabi- --sysroot=../netbsd-10/obj/destdir.evbarm/ --arch=armel --target-os=netbsd --extra-libs=../netbsd-10/obj/destdir.evbarm/usr/lib/crti.o --enable-openssl --disable-doc
  libavutil      59.  1.100 / 59.  1.100
  libavcodec     61.  1.101 / 61.  1.101
  libavformat    61.  0.100 / 61.  0.100
  libavdevice    61.  0.100 / 61.  0.100
  libavfilter    10.  0.100 / 10.  0.100
  libswscale      8.  0.100 /  8.  0.100
  libswresample   5.  0.100 /  5.  0.100
Universal media converter
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...

Use -h to get full help or, even better, run 'man ffmpeg'
```

なんで、突然ffmpegなのかは分かりますよね。

ffmpegはmp3のエンコーダーも外部ライブラリが必要でした。

残念ながらarmv6でffmpegを動かすとかなり不安定です。
Rust

# Rustをインストールする
## Rustupをインストールする（インストーラ）
```
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```
select install type
1) Proceed with standard installation (default - just press enter)

vscode拡張機能
+ Remote Development
+ rust-analyzer
+ CodeLLDB

## rustをバージョンアップ
```
rustup toolchain add stable # stable版を追加(2204/5/1時点で1.77.2)
rustup toolchain add nightly # nightlyを追加
rustup toolchain add 1.77 # Rust 1.77を追加
```
## プロジェクト作成
```
cargo new hoge
```
## ライブラリ追加
```
cargo add nix
```

## ツールチェインのバージョンを確認
```
rustup show
```
## ツールチェインのバージョンを固定
```toml:rust-toolchain.toml
[toolchain]
channel = "1.66.0"
components = ["rustc", "cargo"]
profile = "minimal"
targets = []
```
文系出身エンジニアコミュニティ運営人事が競プロ歴半年で入茶しました

# 自己紹介
株式会社サイバーエージェント 技術人事本部の宝田と申します。
普段はエンジニア新卒採用や技術者のためのコミュニティスペース「CA Tech Lounge」の運営をしています。
現在のミッションとしてはエンジニアの採用がメインなのですが、元々アドテクプロダクトの営業職などを担当しており、プログラム自体はほぼ未経験でした。
自分が競プロを始めたきっかけなどについては前回の記事にて記載しましたので、今回は割愛致します。

https://qiita.com/takarada/items/57acd67cc95cb4bce9ac

# 入茶しました
掲題の通り、11月にAtCoderを始めてから5ヶ月でRating 414となり、
ABC345にて無事茶色になることができました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468362/6b0e0c5a-a215-78ce-8773-51b88d0e3d18.png)

11月当初ほど毎週必ず、というわけには行きませんでしたがコンスタントにABCに出場し、
半年後までモチベーションを継続することができたのは良かったと思います。
この記事では入茶した喜びを記録するとともに、競プロプレーヤー・人事・コミュニティ運営者としての学びを言語化できればと思います。

# 入茶するまでにやったこと
いわゆる灰埋めBC埋め・・・はせず、
毎回のABC振り返り + CA Tech Loungeでの[AtCoder Problems](https://kenkoooo.com/atcoder/)を用いたバーチャルコンテストに振り切って学習しました。

https://x.com/y_takarada/status/1750432582775517645?s=20

CA Tech Loungeでは競プロ部として毎週1回程度バーチャルコンテストが開催されており、
自分も運営でありながら定時後ということもあってほぼ毎回参加しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3468362/84d25e13-0dfc-2e17-9633-d7a05e1e6e7f.png)

# 感想(競プロ編)
## よかったこと
特にコミュニティの中で競プロで取り組んだことの良さとして下記を感じました。
- わからないことや役立ちポイントを優秀エンジニアたちが教えてくれる
- オフラインのコンテストで大変さを共有しながら解き進めることができる
- 1人でやるときと比べて圧倒的にモチベーションが長続きする

## 今ひとつだったこと
一方で教材やカリキュラムベースの学習でないことの欠点として下記を感じました。
- 体系的な理解には乏しい
- 知識の穴がいびつになっている
- 取り組みの参加者が少ないと自分のモチベーションにもダメージを受ける

## 今後やっていきたいこと
引き続きAtCoderについては不定期に参加を継続するつもりです。
前述の通り体系的な理解・知識に弱みがあると感じているため、今後はアルゴ式・鹿本などに並行して取り組みたいです。

# 感想(人事編)
## よかったこと
- 今まで感覚的にしか理解していなかったAtCoderの成績を自分の感覚で理解することができた
    - プログラミング力はもちろんのこと、「継続性」についても一定の評価ができる指標であると感じました。
- プログラミング・アルゴリズムの基礎的な部分を学ぶことができた
- 非エンジニア出身人事として、プログラミングに対しての理解を示すプロフィールやエンジニアとの「共通言語」が作れた

## 今ひとつだったこと
- アルゴリズム・プログラミング以外の部分にはまだ触れられていない
- 「実務でどう活きるのか」という部分についてはまだ理解しきれていない

## 今後やっていきたいこと
競プロ以外のwebアプリ開発やデータ分析などにも少しずつ取り組み、理解を深めていきたいと思っています。
また、今回の経験を活かし競プロが活きる部分と難しい部分、自社での業務をどう区別して考えていくか検討してみたいと思いました。

# 感想(コミュニティ運営編)
## よかったこと
- コミュニティ内にグループ活動のきっかけをつくることができた
- 社員とコミュニティメンバーが触れ合うタイミングをつくることができた
- 会員が競プロに取り組み始めるなど、会員にも影響を与えることができた
    - 会員には自分を超えるレーティングを持つ人も現れました。

## 今ひとつだったこと
- 競プロの性質上、全てのメンバーが取り組む必要があるアクティビティではない
- バーチャルコンテストなどの活動は日によって参加者がまちまちだった

## 今後やっていきたいこと
競プロ以外にも会員が積極的に参加できる取り組みをコミュニティに増やしたいと考えています。
また、エンジニアが学ぶ場所として最適な制度・コミュティ設計を引き続き考え続けていきます。

# 告知
CA Tech Loungeでは会員を現在募集しています。
オフラインの場所を持っていること、定期的なメンターからのフィードバックをもらえることが魅力であるコミュニティのため、
渋谷への週2回来社が必須となっていますが、学生・社会人問わず技術を学ぶモチベーションが高い方にオススメの取り組みになっています。

https://www.cyberagent.co.jp/careers/special/students/tech_lounge/

この記事を見て技術を学ぶ仲間が欲しいと思った方、ご応募お待ちしております！
電子工作メモ - SDカード

# SDカード

## ハードウェア

- [KKHMF マイクロSDストレージボード](https://www.amazon.co.jp/KKHMF-%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%ADSD%E3%82%B9%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B8%E3%83%9C%E3%83%BC%E3%83%89-TF%E3%82%AB%E3%83%BC%E3%83%89%E3%82%B7%E3%83%BC%E3%83%AB%E3%83%89%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB-SPI%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9-Mega-Due/dp/B01G5AZ882)
    SPI で制御できるSDカードボード

## 参照

- [SDカードを接続してファイルを保存する！](https://moyoi-memo.hatenablog.com/entry/2022/03/10/165826)
- [sdcard.py](https://github.com/micropython/micropython-lib/blob/master/micropython/drivers/storage/sdcard/sdcard.py)

## コード

- pico がマスターで、SDカードボードがスレーブ

    |端子|GPIO|Pin|
    |:--:|:--:|:--:|
    |VCC|VSS|39|
    |GND|GND|38|
    |MISO|GP4|6|
    |MOSI|GP3|5|
    |SCK |GP2|4|
    |CS  |GP5|7|

    ```python
    from machine import Pin, SPI
    import os, sdcard

    spi = SPI(0, sck=Pin(2), mosi=Pin(3), miso=Pin(4))
    sd  = sdcard.SDCard(spi, Pin(5))

    os.mount(sd, "/sd")

    # ファイル作成
    fp = open("/sd/test.txt", "w")
    fp.write("test")
    fp.close()

    # フォルダ作成
    os.mkdir("/sd/hoge")
    fp = open("/sd/hoge/test.txt", "w")
    fp.write("hogehoge")
    fp.close()
    ```
＜備忘録＞llama_cppを利用してCPUでチャットボットを作成してみる

# 概要
ノートパソコンしかないけれど、ローカルな環境でチャットボットを作成してみたのでまとめます。
また、私は素人かつ初投稿なので説明やコードに至らない点もあるかと思いますがご了承ください。


# 目次


-llama_cppとは？
-前準備
-コード
-感想



# llama_cppとは？



llama_cppはpythonのライブラリ。

名前にcppとあるように、このライブラリはC言語で記述されている。
モデルを読み込む際に量子化を用い、少ないbit数で読み込むことできる。

llama_cppはMeta社のllamaモデルに向けたライブラリであり、拡張子が.ggufのものであればllama_cppで読み込めた。

llama_cppについて調べると、llama_cppの主目的は「MacBook上で動作…」とでてくるが、私のwindows11環境でも動作できました。





# 前準備
私はデバイスはwindows、開発環境はVScodeを使用しました。

llama_cppをインストールする過程で、C言語のコンパイラやCmakeが必要になるので環境変数の調整やインストールを行う。

その後```pip install llama-cpp-python```を実行してllama_cppをインストールする。



# コード
```

from llama_cpp import Llama

class LlamaAdapter():
    def __init__(self,user_content):
        model_path = "モデルのパスjapanese-stablelm-3b-4e1t-instruct-q2_K.gguf"
        self.llm = Llama(model_path, chat_format="chatml-function-calling")
        self.output = self.llm.create_chat_completion(
        messages=[
            {
                "role": "system",
                "content": """あなたは学校の先生です。

                """,
            },
            {"role": "user", "content": user_content},
        ],
        response_format={
            "type": "text",
            
            "schema": {
                "type": "text",
            },
        },
        max_tokens=100,
        temperature=0.7,
        top_p=0.3,
        top_k=40,
        stream=False,

    )


        
   
    def get_response(self):
        return self.output['choices'][0]['message']['content']
        


def ask(user_content):
    adapter = LlamaAdapter(user_content)
    response = adapter.get_response()
    return response

if __name__ == '__main__':
    user_content = "ごきげんよう"
    model_output1 = ask(user_content)
    print(model_output1)
```
モデルの応答
```
入力：ごきげんよう
出力：元気でしょうか？
```

モデルへの入力はuser_content、プロンプトはcontentという変数で
渡しているので、適宜変更してください。




# 感想
ファインチューニングやプロンプト制御をしておらず、そもそものモデル自体コンパクトなので回答が淡泊。

日本語用に事前学習されているので日本語用にファインチューニングする必要が無く、私のように手っ取り早く日本語でAIと会話してみたい人にはちょうど良いのではと考える。

今後はGPUが十分にあるPCを用意して、より精度の良いモデルでファインチューニングやRAG、感情分析とそれに付随したlive2dモデルの挙動変化といったことに挑戦したい。

大学入学時から使用している生協パソコンでもLLMって動くんだなぁ

ここまでお読みいただきありがとうございました。
AWSのSAP取得までの道のり

# はじめに

初めまして。新米エンジニアのkakutjunです！初めて記事を書かせていただきます！

今回は自分がSAPを取得した際の学習方法と試験内容について話していこうと思います！

## SAPを受けた理由
自分がSAPを受けた理由として一番大きかったのは
自分が入社した会社の配属先でAWSを使っていたということです！
部署のみなさんがAWSをつかっていて入社したての当時AWSの事をあまり知らなかった自分は一日でも早く一人前になろうとAWS試験で一番難しいといわれるSAPを1年目で取ろうと思い立ちました！

### SAP合格までの道のり
自分がSAPを取るまでに取得した資格は
クラウドプラクティショナー→SAA→SOA→SAPの順番になります
SAP自体の学習期間は約1.5か月でした！（そのほかの資格についてはまた別の記事で説明したいと思います）

#### SAP学習方法
SAPの学習方法としてはとてもシンプルに
クラウドライセンス（以下URL）の問題集を3周するという物でした。
問題数は約580問あり、この中ととても類似した問題が本番でも出たので
これから受験する皆さんもこの580問をしっかり理解できていれば合格できると思います！
https://cloud-license.com/exam/sap/

#### 最大の難点
SAP試験を受けて大変だと感じたことは「問題の文章の長さ」と「受験時間の長さ」です。ですが、自分のブログを見ていただいた皆さんはそれに関して心配することはありません。SAP学習方法で説明した問題集を3周やれば問題の「これ見たことある」という感じですいすいといていけるはずです。3時間という長さについては途中でトイレ休憩に行く時間をあらかじめ決めておけば集中力をそこでリセットできるのでこちらも心配ありません（ここでの注意点として自宅受験をする方はトイレに行けないという話があります。）何より大事なことは最後まであきらめずに解くことです。実際テスト本番の手ごたえが無くても意外と合格していることがあります。

#### まとめ
始めてのブログ執筆でつたない点もあったと思いますがここまで読んでくれた方々、ありがとうございます。皆さんがSAPに合格すること、心から願っています
アーカイブログ領域が枯渇

1）アーカイブログ領域の使用率

　　V$RECOVERY_AREA_USAGE　を確認する。

2）アーカイブログ領域の拡張（一時しのぎ）

　　DB_RECOVERY_FILE_DEST_SIZE　を拡張する。

3）RMANバックアップスクリプトを実行

　　たいてい、フルバックアップでも差分バックアップでも、アーカイブログのバックアップ作業は組み込まれていて、バックアップが終了したアーカイブログは削除するようになっているので、その機能を使ってアーカイブログを削除し、領域を空けることが多い。
C++の基本的なコンパイルコマンド

# はじめに
　流体シミュレーションである**数値流体力学（CFD:Computational Fuid Dynamics）** をC++で自作した。CFDを作成するために初めてC++やコンパイルというものに触れたので、初心者の立場から、**コンパイル**および**実行**する際のコマンドプロンプトを、メモがてら記録しておく。
　以下の環境で数値計算を行った。
<table>
  <thead>
    <tr>
      <th>名前</th> <th>説明</th>
    </tr>
  </thead>
  <tr>
    <td> OS </td> <td>macOS Ventura 13.5</td>
  </tr>
  <tr>
    <td> 使用言語 </td> <td>C++ ver.13.0</td>
  </tr>
  <tr>
    <td> 統合開発環境 </td> <td>VSCode ver. 1.81.1</td>
  </tr>
</table>

## 計算結果の出力のコマンド
　C++のコードがあるディレクトリをカレントディレクトリとして、以下のコマンドプロンプトを実行する。
```
g++ [ファイル名].cpp -o [実行ファイル名]
```
　これによってカレントディレクトリに**実行ファイル**が作成される。これを Finder から実行することもできる。しかしリダイレクトすることを考えると、以下のコマンドで実行する方が良い。
``` 
./[実行ファイル名]
```
　これによって大量の数値（計算結果）が出力される。これを出力ファイルとして保存するには、実行の際に上記のコマンドではなく、以下のコマンドを用いて**リダイレクト**する。
```
./[実行ファイル名]　> output.dat
```
　これによって**標準出力**が output.dat ファイルに出力される。標準出力はC++のコードにおいて、以下のコードで出力する。
```cpp:標準出力
std::cout << [出力内容] << std::endl;
```
　他のファイルと同様に、output.dat も作業ディレクトリに出力される。output.dat はテキストエディタで開くことも可能である。
　**標準エラー出力**についても触れておく。標準出力と標準エラー出力を個別のファイルにリダイレクトするには、以下のコマンドで行う。
 ```
 ./[実行ファイル名] > output.dat 2> error.dat
```
　標準エラー出力はC++のコードにおいて、以下のコードで出力する。
```cpp:標準エラー出力
std::cerr << [出力内容] << std::endl;
```
## デバックや性能解析のコマンド
　数値計算においては、計算速度が非常に重要となってくる。コンパイルした実行ファイルの計算・実行時間の測定のために、**time コマンド**が用意されている。これは以下のコマンドで行う。
```
time ./[実行ファイル名] > output.dat
```
　また、コード内に
```cpp:デバッグ用のコード
#ifdef Debug

//デバッグ用のコード

#endif
```
のようにデバック用のコードを記入した際には、コンパイルの際に **-D** というオプションを用いてマクロの設定を行う。
```
g++ [ファイル名].cpp -DDebug=1 -o [実行ファイル名]
```
　コンパイルの際に上記のコマンドでDebugのマクロを 1 に設定することで、#ifdef と #endif で囲まれた部分のコードがアクティベートされる。

 ## そのほかのコマンド
 　**最適化レベル**を指定することも可能である。最適化レベルには 0 から 3 まであり、以下のコマンドで最適化オプションを指定する。
  ```
 g++ [ファイル名].cpp -03 -o [実行ファイル名]
```
　このコマンドでは -03 によって最も高いレベルである最適化レベル 3 が適応される。

 ## 結び
 　新たに使って便利だったコマンド等があれば順次追加していきます。
  
 　これまで Python しか使ってこず、コンパイルなどが新鮮だったためこのような記事を書いてみました。自分と同じように C 言語やコンパイルに初めて触れたという人の助けに少しでもなれれば嬉しいです。
LaravelのEloquent ORMを使用して、自分が持っているレッスン以外のレッスンを表示する方法

レッスンテーブルと登録レッスンテーブルがあります。
ユーザーが持っているレッスン以外のレッスンを表示する方法を下記に記します。
それぞれのテーブルの内容は下記の通りです
- lessonテーブル：
```
| id | name  |
|----|-------|
| 1  | test1 |
| 2  | test2 |
| 3  | test3 |
| 4  | test4 |
| 5  | test5 |
| 6  | test6 |
```
- haslessonテーブル：
```
| id | user_id | lesson_id |
|----|---------|-----------|
| 1  | 1       | 1         |
| 2  | 1       | 2         |
| 3  | 2       | 3         |
| 4  | 2       | 4         |
```
## ユーザーが持っているレッスン以外のレッスンを表示する方法
Eloquent ORMを使用して、user_idが1の場合に登録していないlesson_idのデータを
取得するには、以下のようなクエリを使用します。
```php
$user_id = 1;

$lessons = Lesson::whereNotIn('id', function($query) use ($user_id) {
                                    $query->select('lesson_id')
                                          ->from('haslesson')
                                          ->where('user_id', $user_id);
                   })->get();
```
コードは注意してご使用ください。
- このコードは以下の処理を行います。

1. `Lesson`モデルの`whereNotIn`メソッドを使用して、`haslessons`テーブルの`lesson_id`列に存在しない`lesson`テーブルのレコードを取得します。
2. `whereNotIn`メソッドのクロージャ内で、`haslessons`テーブルから`user_id`が1のレコードの`lesson_id`を取得します。
3. 取得した`lesson_id`を使用して、`lesson`テーブルからidのみを取得します。
4. このコードを実行すると、ユーザーIDが1のユーザーが保持していないレッスンIDの配列が`$lessons`変数に格納されます。
### 別の方法
上記のコードは、`whereNotIn`メソッドとクロージャを使用して、`haslessons`テーブルと`lessons`テーブルを結合しています。

別の方法としては、`whereDoesntHave`メソッドを使用して、`haslessons`テーブルに関連していない`lessons`テーブルのレコードを取得することもできます。
```PHP
$user_id = 1;

$lessons = Lesson::whereDoesntHave('haslessons', function($query) use ($user_id) {
                          $query->where('user_id', 1);
                   })->get();
```
コードは注意してご使用ください。
「んなままい いㇺぬ みーらいびゃーㇺ」はUniversal Dependenciesで書けるのか

下地理則『南琉球宮古語伊良部島方言』(くろしお出版, 2018年3月)を横目に、「んなままい いㇺぬ みーらいびゃーㇺ」をUniversal Dependenciesで書いてみることにした。

```
# text = んなままい いㇺぬ みーらいびゃーㇺ
1	んなま	_	NOUN	名詞-普通名詞-副詞可能	_	5	obl	_	SpaceAfter=No|Translit=nnama
2	まい	_	ADP	助詞-係助詞	_	1	case	_	Translit=mai
3	いㇺ	_	NOUN	名詞-普通名詞-一般	_	5	nsubj	_	SpaceAfter=No|Translit=im
4	ぬ	_	ADP	助詞-格助詞	_	3	case	_	Translit=nu
5	みーらい	_	VERB	動詞-一般	_	0	root	_	SpaceAfter=No|Translit=miːrai
6	びゃーㇺ	_	PART	助詞-終助詞	_	5	mark	_	Translit=bjaːm
```

![iravci.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428317/9f2b0d2e-f692-7ab8-0c61-dcb6bbbe92b4.png)

XPOSをUniDic品詞に合わせた上で、単語長を国語研短単位に近づける、という無茶をやってみたところ、「びゃーㇺ」を除いて、何とか私(安岡孝一)なりに納得の行く形となった。でも、このやり方だと、LEMMAを決めることができない。富浜定吉『宮古伊良部方言辞典』(沖縄タイムス社, 2013年12月)に接地することも考えたが、[bjaːm]と[bjaː]の混同に関する問題が残っている(cf. 金田章宏・下地賀代子[『南琉球方言におけるベシ由来形の使用実態』](http://hdl.handle.net/10114/11802)(琉球の方言, Vol.39 (2015年3月), pp.141-164))らしく、なかなか難しい。このあたりのLEMMAに関する問題は、宮川創・金山博・田口智大・當山奈那[『沖縄語のUniversal Dependenciesツリーバンクコーパスの構築』](https://www.anlp.jp/proceedings/annual_meeting/2023/pdf_dir/P3-8.pdf)(言語処理学会第29回年次大会発表論文集(2023年3月), P3-8)にも方針が示されていないので、なかなか作業工程を決めることができない。さて、困ったなあ。
SPSS Modeler スクリプトでテーブルのデータを読み取る

SPSS Modelerのスクリプトでテーブル出力した結果を読み取ることができます。ストリームの出力結果をつかって、処理を分岐したい場合に利用ができます。

* テスト環境
    * SPSS Modeler 18.5
    * Windows 11 64bit
* サンプルストリーム

https://github.com/hkwd/spssmodelerscript/raw/master/240318ReadTableData/240318readTableData.str

以下のようなテーブルのデータを読み出してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/a76e5be2-5df7-dcc8-0239-b62b669e04b9.png)


まず、テーブルノードのIDを「注釈」タブからコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/6abda38e-83d8-872e-cd9a-e870b7364630.png)



以下のスクリプトを「ストリームのプロパティ」の「実行」タブに入力します。
tablenode=stream.findByID("id6BKWQAAPFUY")
は、先ほど取得したIDに書き換えます。


```python
import modeler.api
stream = modeler.script.stream()

# テーブルノードを実行
tablenode=stream.findByID("id6BKWQAAPFUY")

# 実行結果を取得
results = []
tablenode.run(results)
tableoutput = results[0]

# テーブル出力の内容を読み出し
tablecontent = tableoutput.getContentModel("table")
# テーブル内の値を読み出し
print("r0C0:"+str(tablecontent.getValueAt(0, 0)))
print("r0C0:"+tablecontent.getValueAt(0, 1))
```

実行して、「デバッグ」タブで確認してください。
「1」と「Hello World」がテーブルから抜き出せていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/3463be8a-b582-e279-d959-df815ef03fc6.png)

tablecontent.getValueAt(0, 0)で、テーブル出力結果の0行目0列目のデータを取り出しています。

#### 参考：テーブル コンテンツ モデル - IBM Documentation 
https://www.ibm.com/docs/ja/spss-modeler/18.4.0?topic=results-table-content-model
dockerでvueの環境構築するときにnode_modulesディレクトリで躓いた話

# 諸注意
まだまだ勉強不足､理解不足故保証はできません｡
直接関係なさそうな部分は省略しています｡

# 結論とか学んだこととか
`node_modules`ディレクトリはホストからコンテナにコピーするのは難しい場合がある｡
そういうときは`node_modules`ディレクトリを`volumes`機能を使って別の場所に置いとく｡

## 筆者のスペック
数年間色々やってるけど､まだエンジニアとして就職できてない｡
#### docker
2024年の3月にやっと勉強し始めた人間｡公式チュートリアルを1通りやった程度｡

# ことの始まり
https://reisuta.com/vue3-init/

上記の記事を参考にdockerでvueの開発環境を構築していたら､参考サイトではエラーがでてないのに自分の場合は途中でエラーが出てきてしまった｡

### エラーが出たときのディレクトリ構造
docker-compose.yml
front(vueのプロジェクト名がついたフォルダ)/
├ vueプロジェクトを生成時に作られたディレクトリ達､ファイル達
└ dockerfile

### エラーが出た当初のファイル達
#### docker-compose.yml
```docker-compose.yml
services:
  front:
    build: ./front
    container_name: front
    ports:
      - 5173:5173
    working_dir: /app
    volumes:
      - ./front:/app
```

#### dockerfile
```dockerfile
FROM node:18-slim
WORKDIR /app
COPY . /app
run apt-get update
CMD ["yarn", "dev", "--host"]
```

## エラーがでた箇所

vueのプロジェクトを作成した後に､
`docker compose run --rm front yarn install`
でホスト側に`node_modules`ディレクトリ生成後､`docker compose build`を実行すると`CANCELED [front internal] load build context  `と出てきた｡

## 原因
ネットで色々調べたり､chatgptと問答していたら

**大きなファイルやディレクトリがあると､dockerはビルドをキャンセルしてしまう**

という答えらしきものにたどり着いた｡
要するに`node_modules`ディレクトリが大き過ぎてキャンセルされてしまったと思われる｡

## 対処
ホストにある`node_modules`をコンテナにコピーしようとするとキャンセルされてしまう｡
↓
ならば､コンテナで`node_modules`ディレクトリを生成して､それをホスト側にコピーすればよいのでは?

と思い､ビルド時に`yarn install`するように`dockerfile`を編集

##### dockerfile
```diff_docker
FROM node:18-slim
WORKDIR /app
COPY . /app
run apt-get update
+ run yarn install
CMD ["yarn", "dev", "--host"]
```
## 結果
ビルドは問題なくできた｡しかし

# 第2の問題発生
ビルドはできたが､`docker compose up `をしたら
`/bin/sh: 1: vite: not found`
というエラーが出てきた｡
`vite`が無いらしい｡
しかし､yarn installはしたはず…｡

## 原因
ネット上を調べた回ったところ以下のサイトいわく

https://zenn.dev/usma11dia0/articles/dockerfile_run_npm_not_working

dockerfileで`yarn install`して`node_modules`ディレクトリを生成しても､`docker-compose.yml`の`volume`で全部上書きされて消えてしまうようだ｡

詳しい仕組みや原因などは､参考サイトに詳しく書いてあるため直接見たほうが早いと思われる｡

## 対処
上記のサイトを参考に､`docker-compose.yml`を編集し`node_modules`を名前付きボリュームで別管理した｡
##### docker-compose.yml
```diff_docker
services:
  front:
    build: ./front
    container_name: front
    ports:
      - 5173:5173
    working_dir: /app
    volumes:
      - ./front:/app
+      - node_modules:/app/node_modules


+ volumes:
+   node_modules:
```


## 結果
問題なくビルドもできコンテナも問題なく建てられ､vueも問題なく動いた｡

# 駄文
`node_module`ディレクトリが生成された後に必ずエラーが起きるので`node_module`ディレクトリあたりが怪しいと薄々気づいてはいた｡

dockerfileでディレクトリごと丸ごとコピーするしたとしても､どうせ`volumes`機能で上書きされるのなら､package.jsonだけコピーしてnode_modulesディレクトリを生成すればよいのでは?

### なぜ参考サイトではできたのに､私はできなかったのか考察
私の場合は､`vue router`,`pinia`,`eslint`,`prettier`など色々追加してしまった故に`node_modules`ディレクトリが肥大化してしまってキャンセルされてしまったと予想｡
sshとsudoと「>（ファイルリダイレクト）」の組み合わせ

ssh remote_host sudo whoami > /tmp/whoami.txt

👆コレ、何を期待しているか分かりますでしょうか？

「whoami > /tmp/whoami.txt」を「remote_host」にて「root」権限で実行したい。
実際には動きませんが、カッコで優先順位を付けるなら…

[ssh remote_host {sudo (whoami > /tmp/whoami.txt)}]

ところが、実際に実行してみると…

/tmp/whoami.txtがローカルに出来上がるわ、/tmp/whoami.txtのファイルオーナーが（rootじゃなく）平ユーザーになってるわ、「'（シングルクォート）」「"（ダブルクォート）」「\（バックスラッシュ）」を駆使して試しましたが、どうにも上手く行かずじまい…

てなわけで、然るべき方法も思いつかず下記にて回避しました。
ssh remote_host "echo 'whoami > /tmp/whoami.txt'| sudo sh"
AtCoderで水色になりました

AtCoderを始めてから2年弱が経ちましたが、ようやく水色になれました。緑色になってからは8ヶ月くらいかかってしまいましたが、そこから取り組んだことなどを話していこうと思います。

![Screenshot 2024-03-18 at 15.36.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693920/66af4763-6020-a2fa-5abb-7c4ef30a001a.png)


# 経歴など？
京都大学理学部数理科学系4回生で、卒業した後は業プロerとして働きます。（3月で卒業なんですが、なんとか目標の卒業までに水色を達成できました。）

# 学んだアルゴリズム

A: アルゴリズムを証明ありで使え、ある程度の応用ができる。
B: アルゴリズムを知っているが、応用は正しくこなすことができない。
C: アルゴリズムの名前は知っている。
D: 存在を知らなかった。

緑の欄がAであるとは、緑の間にその状態へと持っていったことを示します。

- 探索系

|アルゴリズム名  |茶  |緑  |
|---|---|---|
|全探索  |A  |A  |
|bit全探索  |B  |A  |
|順列全探索  |D  |A  |
|半分全列挙  |C  |C |
|DFS  |B  |A  |
|BFS  |A  |A  |
|再帰による探索  |D  |A  |
|二分探索|B  |A  |
|三分探索|D  |C  |
|尺取り法|B  |A  | 

- グラフ系

|アルゴリズム名  |茶  |緑  |
|---|---|---|
|Dijkstra法  |B  |A  |
|Floyd-Warshall法  |B  |A |
|Bellman-Ford法  |C  |B  |
|最長パスを求める  |D  |A  |
|サイクル判定  |D  |A  |
|強連結成分分解|D  |C  |
|DAG上のトポロジカルソート  |C  |A  |
|DAG上の二点間の最長距離|D  |B  |
|プリム法  |D  |C  |
|クラスカル法  |D  |C  |
|木の直径  |B  |A  |
|最短共通祖先問題 |D  |A  |
|フロー|D  | C  |


- 文字列アルゴリズム

|アルゴリズム名  |茶  |緑  |
|---|---|---|
|ランレングス分解  |C  |A  |
|z-algorithm  |D  |C  |
|ローリングハッシュ|D  |C  |
|suffix-array|D  |C  |


- 数学

|アルゴリズム名  |茶  |緑  |
|---|---|---|
|modint|C  |A  |
|ユークリッドの互除法  |A  |A  |
|素数判定  |A　|A  |
|約数列挙 |A  |A  |
|素因数分解 | B |A |
|エラトステネスの篩 |C  |A  |
|その他の篩|D  |C  |
|高速ゼータ変換|D  |C  |
|高速フーリエ変換|D  |B |
|高速メビウス変換|D  |C  |
|Mo's algorithm|D  | C  |
|Grundy数|C  | B  |


- データ構造

|アルゴリズム名  |茶  |緑  |
|---|---|---|
|union-find木  |B  |A  |
|BIT  |C  |B  |
|segment木|C  |A  |
|lazy-segment木|D  | B |
|静的wavelet-matrix|D  |B  |
|ポテンシャル付きunion-find木|D  | B  |
|slope-trick| D  | B  |


- DP

|アルゴリズム名 |茶 |緑 |
|---|---|---|
|普通のDP|A|A|
|bitDP|B|A|
|木DP|C|B|
|区間DP|C|A|
|2乗の木DP|D|C|
|全方位木DP|D|C|
|桁DP|C|B|


ばーっと書きました。知識が徐々についてきているのがわかりますね。最近は、アルゴリズムの難易度に対するdiffが低くなってきているので、どんどんアップデートしないといけないなと思っています。


# 意識してたこと
`一応`数学科出身で、数式にした方が理解しやすいので、求めたいものや最大化したいものを数式で書き表すようにしていました。DPの際も漸化式を書いたりしていたので、漸化式を解くことで解けるような問題（ARC174C）にはある程度強かったかなと思います。

また、問題を解いた後は自分でまとめを作っていました。こんな感じ。
https://scrapbox.io/atcoder-BlueS/

個人的には最も大きな変化だったんですが、PythonからRustへ転向しました。（このせいで緑の期間が長かったのかも？）最初は戸惑ってばっかでしたが、現在はPythonと同じくらいスムーズにコード書けるし、計算量が少し大きくても通るのでとても助かっています。

逆に、練習量などに関しては特段気にしていませんでした。やりたい時にやってるって感じです。

![Screenshot 2024-03-18 at 15.34.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693920/f2f18718-b92c-1c4d-a030-dd698044f1e8.png)
![Screenshot 2024-03-18 at 15.33.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693920/f6343eb2-72d9-bd31-94a4-cec3a206077f.png)
![Screenshot 2024-03-18 at 15.33.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3693920/87dfefe4-a7dd-37f8-615d-8e4a683725e0.png)

コンテストごとに解くのが、好きです。なんか、似たような難易度の問題を解いていると疲れちゃいます。


# 最後に
twitter(新X)で、いろんな人に教えてもらったりしました。みんな優しいし、強いし、すごい。ありがとうございました。
とりあえずの目標として、2024年の間に青色なりたいなって思っています。みんな仲良くしてね。

# 趣味
なんか趣味について書いておきます。「なきごと」っていうバンドが好きで、ライブも何回かいってます。あんまりメジャーではないんですけど、ぜひ聴いてみてください。
spark

# javaをインストール（インストーラ使用）
## JAVA_HOMEを設定（binをpathに追加）
# scalaをインストール（インストーラ使用）
# pythonをインストール（インストーラ使用）
# sparkをインストール（アーカイブを解凍）
# hadoop winutils をインストール（アーカイブを解凍）
## HADOOP_HOMEを設定（binをpathに追加）

# trouble shooting
## pysparkで"Python worker failed to connect back"
→環境変数を設定する：PYSPARK_PYTHON=python
RSpecで日時を指定してテストを実行する

コード内で、下記のように現在の時間を指定して実行しているコードがあった。

``` ruby
# 現在の日時は営業日かの判定
isWorkDayToday = Time.current.to_date.workday?
```

この「現在の時間」が例えば⚪︎月⚪︎日というように自身が設定した日時でテストをしたい。

## TimeHelpersを使う
今回はRubyのTimeHelpersを使うことにした。

メソッドがいろいろありますが、今回はtravel_toを使うことに。

## rails_helper.rbの設定
``` Ruby
# 下記の設定を追加
require "active_support/testing/time_helpers"
RSpec.configure do |config|
  config.include ActiveSupport::Testing::TimeHelpers
end
```

## テストを書く
``` Ruby
require 'active_support/testing/time_helpers'

RSpec.describe "ExampleNameService" do

    describe '#get_example_function' do
        # 2024年3月18日13時00分を設定
        travel_to Time.new(2024, 3, 18, 13, 0) do
            # この中にテストを記述
        end
    end

end
```

これでテストを実行したら期待通りの結果になりました。
Ubersichtを複数ディスプレイに振り分けるAppleScript

デスクトップに好きなWidgetを貼り付けられるユーティリティー「Übersicht」は、起動時のモニタ認識順で配置を割り振ってしまうようで、複数ディスプレイ環境では起動時に設定しなおす手間があります（2024/03/18現在のバージョン1.6（82））
結構な手間なので、AppleScriptでなんとかします。デフォルトで置いときたいディスプレイと、例外処理として他のディスプレイを指定できます。

※Bartenderを使っていない場合は該当コメント部分を削除してください。

<del>MenuExtraクリックで最初のメニューを表示してから1.5秒のラグがあるのを解決できていません。なんだろう？</del>
Clickでなく、Selectにすると一瞬で終わります。

```AppleScript
use Uber : application id "tracesOf.Uebersicht"
set ubername to name of Uber

--「Show on」に続くディスプレイ名称。1番目がデフォルトディスプレイ
set myDisp to {"ASM-133UCJ", "Studio Display", "CS2731"}

-- 例外処理したいWidget名をメニュー表示内容通りに記載し、myDispリストの番号とセットのリストにする
set myWgDisp to {{"workingfolders-widget-workingfolders-coffee", 2}}

--Bartender等で隠している場合は表示させる。二回実行でメニューを展開したものを戻し、アイコンのみ表示させる
try
	tell application "Bartender" to activate "tracesOf.Uebersicht-Item-0"
	tell application "Bartender" to activate "tracesOf.Uebersicht-Item-0"
end try

--全Widgetを一度メインスクリーンのみ表示モードにしてから切り替える
tell Uber
	set myWidgets to id of every widget
	repeat with i in myWidgets
		set showOnMainScreen of widget id i to true
	end repeat
end tell


tell application "System Events"
	tell process ubername
		repeat with i in myWidgets
			
			--Menu Extraをクリックしてメニュー表示
			set myExtra to menu bar 2's menu bar item 1
			click myExtra
			
			--メニュー内のWidgetサブメニューを表示
			set myWidgetMenu to myExtra's menu 1's menu item i
			select myWidgetMenu
			
			--例外処理リストになければデフォルトディスプレイ名を設定
			set xCount to 1
			set myDispName to item 1 of myDisp
			repeat with x in myWgDisp
				if item 1 of x contains i then
					set myDispName to item (item 2 of x) of myDisp
					exit repeat
				end if
				set xCount to xCount + 1
			end repeat
			
			--ディスプレイ名称のあるメニューをクリック
			set myDispSel to myWidgetMenu's menu 1's menu item ("Show on " & myDispName)
			click myDispSel
		end repeat
	end tell
end tell
```
AWS Solution Architect - Professional (SAP-C02) 受験体験記

## はじめに

先日、AWS Solution Architect - Professional (SAP-C02)を取得してきましたので、学習に利用した教材や所感をまとめました。
これから学習される方の参考になれば幸いです。

## AWS Solution Architect - Professional とは

以下公式のリンク先の説明となります。

> この資格は、認定を受けた個人が、複雑な問題に対する複雑なソリューションの提供、セキュリティ、コスト、パフォーマンスの最適化、および手動プロセスの自動化における高度な知識とスキルを証明するために役立ちます。この認定は、組織がクラウドイニシアティブを実施するための重要なスキルを備えた人材を特定して育成するための手段です。

https://aws.amazon.com/jp/certification/certified-solutions-architect-professional/

## 事前知識
- AWS SAPは3年前に一度取得しています。
    - 今回は、資格更新のための受験ですが、更新用試験ではないため、学習内容も大きく変わらないと思います。
- 資格を取得してからの3年間はAWSの各種サービスをがっつり触っていたわけではないです
    - Cloud9やAmplify、ECSなどを検証目的(軽く立ち上げて動きを見たら消す)で触っている程度となります。

## 勉強開始〜合格までの期間
- 大体1ヶ月半程学習していました。
    - 平日は30分~1時間程度、休日は平均して3~5時間程度学習に割り当ててました。

## 勉強資料
- 参考書
    - 「AWS認定資格試験テキスト＆問題集　AWS認定ソリューションアーキテクト - プロフェッショナル　改訂第2版 (ＡＷＳ認定資格試験テキスト)」
        - 参考書はいくつかありそうだったのですが、その中でもSAP-C02に対応していると記述のあったこちらの問題集を利用しました。
    - AWS Skill Builderにあったレクチャー動画
    - AWS Well-Architected Framework
- 問題集
    - 上記参考書に付属していた問題集
    - AWS Skill Builderにある模擬試験
        - たまたま途中で試験問題が更新されていたので2種類解きました。


## 勉強の流れ
1. AWS Skill Builderにあったレクチャー動画を(ゆったりめだったので1.5倍速で)視聴しました。
2. AWS Skill Builderにあった模擬試験を解いてみました。
    - 不明点はAWSのドキュメントなど調べました。
3. 参考書(テキスト)を1周読み切りました。
4. 参考書(テキスト)の模擬試験を解きました。
    - 不明点はAWSのドキュメントなど調べました。
5. AWS Well-Architected Frameworkを流し読みしました。
    - 分量的に読みきれなかったので、概要だけさらいました。
6. 模擬試験群(AWS Skill Builderとテキスト)の2周目を解きました。
    - 1周目は雰囲気で正解していた問題などもあったので、こちらで再度どれくらい内容を理解しているか確認する目的で解いていました。

## 所感
- 参考書(テキスト)を一通り読んだことと、問題集を繰り返し解いたことが一番役に立ったと感じています。
    - 不明点はAWSのドキュメントなどを納得できるまで調べるといいと思いました。
- 試験結果は受験後すぐわからなかった(私の場合はその日の20時ごろに資格ダッシュボードに反映された)ので、結果がわかるまではかなり不安でした。
GASからLINEに通知を送る方法

# 概要
今回はGASからLINEのAPIを叩き、通知を送信します。GASとはJavaScriptをベースにGoogleが開発、提供しているプログラミング言語です。今回のようなAPIを呼び出すことに加え、Googleスプレッドシートなどの各種サービスと容易に連携させることもできるため、使い道は多そうな印象です。
# LINE Notify
LINEのAPIを利用するため、事前にトークンを取得しておく必要があります。手順などは以前の記事にも載せたので割愛します。

https://qiita.com/ricelectric/items/c57e4746df305d13dbf1
# Google Apps Script
テストも兼ねて試してみた程度なのでプログラムはシンプルです。Googleドライブの適当な場所にGASのファイルを作成し、以下のプログラムを貼り付け、実行するとLINEに通知が送信されるはずです。
```javascript:main.gs
function main() {    
  sendMessage("LINE Notify");
}

function sendMessage(message) {
  var token = "{token}";
  var options = {
    "method": "post",
    "payload": {"message": message},
    "headers": {"Authorization": "Bearer " + token}
  };

  UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}
```
# 感想
GASは日頃から利用する場面が多いGoogleの各種サービスとも相性が良く、開発はブラウザのみで完結するため、とても便利に感じました。
PowerShellモジュールのimportExcelで利用されるEPPlusのバージョンについて

PowerShellでExcelを便利に利用できるモジュールとして、importExcelがあります。
こちらのモジュールを利用すると、OpenXML形式のExcel(xlsx)をPowerShellで取り扱う事でき、とても便利です。

importExcelではOpemXML形式のExcelを取り扱うために内部的には.NETのEPPlusライブラリを利用しているようです。

EPPlusライブラリについては、2020年頃にv4からv5の間でライセンス変更がされており。
importExcelで利用しているEPPlusライブラリがどうなっているのか確認してみます。

## EPPlusのライセンスについて。

- [LGPL からポリフォームへ](https://epplussoftware.com/ja/Home/LgplToPolyform)
- [当社のライセンスタイプ](https://epplussoftware.com/ja/licenseoverview/)

上記に記載がありますが、2020年頃にEPPlusではv5の提供がはじまっており。

- v4まではLGPLライセンス
- v5からは商用ライセンス　または　ポリフォーム非商用ライセンス（Polyform Noncommercial）

とライセンスが変更されている事がわかりました。（なお2024年現在、EPPlus 7が最新バージョンとなっていました）

EPPlus v5からLGPLから変更されていますが、EPPlus v4については引き続きLGPLで利用できるようです。

[github - JanKallman/EPPlus](https://github.com/JanKallman/EPPlus)

## importExcelで利用しているEPPlusのバージョンについて

2024年3月現在。

importExcelの最新バージョンは7.8.6となっており。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/e8b72b80-0eda-9ba0-3a79-77c8b4d4ddb8.png)

7.8.6に含まれる、EPPlus.dllを確認した所4.5.3.2となっていました。
（LGPLで提供されている EPPPlus v4）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/cd3829ec-9ba6-f06a-d845-b922b23421f2.png)

このことからimportExcelについては、LGPLで提供されているv4を引き続き利用している事がわかります。
また下記のようなissueが起票されていました。

- [EPPlus Replacement #979](https://github.com/dfinke/ImportExcel/issues/979)
- [EPPlus License compliance - grey area #859](https://github.com/dfinke/ImportExcel/issues/859)
- [EPPlus Version #1195](https://github.com/dfinke/ImportExcel/issues/1195)

なおimportExcel自体のライセンスはApache-2.0となっていました。

## 総評

PowerShellでExcelを利用する場合に便利なimportExcel。

内部でEPPlusが利用されており、v4が使われている事はなんとなく理解していましたが。
今回、状況について一度まとめてみました。
ARC174回答メモ

# 0.はじめに
　最近レートが急落しているので、ちょっと参加をためらいましたが
 まぁ一回逃げると逃げ続けることになるなと思い参戦。
 ABともに300点配点と簡単ですんなり解けて久しぶりのARCで2問ACでした。
 いったん風呂に入ってからDに取り組みましたが時間切れ。
 そのまま続けたら、23:15にはACになったので、まじめにやってれば
 行けたな・・・と後悔しました。
 レートは+21と大躍進し、901と900台に戻れました。


# 1.A - A Multiply
　300点問題らしく、そこまでの難易度ではない問題。
 場合分けとその後の判断さえ間違えなければ行けそう。
 と、取り掛かりましたが、最大区間和と最小区間和の
 求め方が分からずググる。
 カダンのアルゴリズムとして有名らしく拝借して使いました。
 Cが0の時の挙動を適当にしてしまったために、1回目はWAが
 出てしまいましたが、すぐに気づき修正してAC。

 【考え方】
 　(コンテスト時はもう少し分かれてましたが不要部分を削りました)
   1.N、C、リストAを入力
   2.Cが0より大きい時
　　-1.Aの最大部分配列の総和が0より小さい場合
  　　-1.操作は不要なので、Aの総和を出力して終了
　　-2.Aの最大部分配列の総和が0以上の場合
  　　-1.最大部分配列をC倍すれば総和が最大になるため
    　　 Aの総和に最大部分配列の総和×（C-1）を足した値を出力して終了
   3.Cが0以下の時
　　-1.Aの最小部分配列の総和が0より小さい場合
  　　-1.マイナスになる最小部分配列を0にすれば総和は大きくなるため
    　　 Aの総和から最小部分配列の総和をマイナスした値を出力して終了
　　-2.Aの最小部分配列の総和が0以上の場合
  　　-1.操作は不要なので、Aの総和を出力して終了
 　
　https://atcoder.jp/contests/arc174/submissions/51408271


# 2.B - Bought Review
　こちらも場合分け問題。
 簡単すぎる気もしましたが素直に実装したらACとなりました。
 【考え方】
　　・算出に必要なのは、1245の星の数と45の星のコスト
　　・平均3にするためには、星1の人数に-2、星2の人数に-1
  　　星4の人数に1、星5の人数に2をそれぞれ掛けて
    　集計した値（以下C）が0になればよい。
    ・ケースごとにCを求め、0以上なら操作不要
    ・負の時は星4か星5を手に入れないといけない。
    　→Cが偶数の時
     　-”星5の価値×(C//2)”と”星4の価値×C”のうち小さい方が答え
      →Cが奇数の時
     　-”星5の価値×(C//2+1)”と”星4の価値×C”と
      　 星5の価値×(C//2)+星4の価値の3つのうち一番小さい数が答え
      
　https://atcoder.jp/contests/arc174/submissions/51394723

# 3.C - Catastrophic Roulette
　DPぽい上に確率の問題である苦手意識から完全するーしました・・・。
 Dのほうが断然解きやすい気がしました。


# 4.D - Digit vs Square Root
　ぱっと見、ちょっと途方もない気がしつつ取り掛かりました。
 まずは、条件を満たす数にどんなものがあるかをExcelで試算。
 1000までだと、1、80、90～109の22個
 10000までだと、9800、9900～10099の201個
 とまぁここまでみて以下の感じとあたりをつけました。
 1
 80、90～109
 9800、9900～10099
 998000、999000～1000999
 ・・・
 と、１０の２N乗付近で対象数がでてくることになります。
 あとは、上記対象数のリストを最初に作り
 ケース後に、リスト内で何番目にあたるかを算出する形でACとなりました。

　【実装】
 　 ～対象リスト作成～
   　対象リストL：(対象の開始,対象の終了)　1の場合は(1,1)を
    　　　　　　　降順ソートした状態で保持
   　1.初期化したLに(1,1)を追加
   　2.以下、i=1～10まで回す(以下()内はi=2の例)
    　-1.xに10のi×2乗をセット(10000)
    　-2.Lに(x-(10のi乗)×2,x-(10のi乗)×2)を追加((9800,9800))
    　-3.Lに(x-10のi乗,x+(10のi乗)-1)を追加(9900,10099)
     3.Lを降順ソート
     4.LLにLの長さをセット(19)
 　 ～メイン処理(T回繰り返し)～
     1.Nをインプット
     2.ansに0をセット
     3.以下LL回繰り返し(i＝0～18)
      -1.L[i][0]がN以下の時
      　-1.L[i][1]がN以下の時(そのリスト行分すべてがカウント対象)
      　　→ansにL[i][1]-L[i][0]+1を加算
        -2.L[i][1]がNより大きい時(そのリスト行の範囲内にNが存在)
        　→ansにN-L[i][0]+1を加算
     4.ansを出力して終了

　https://atcoder.jp/contests/arc174/submissions/51399678


以上
CPUの情報を調べる

## 環境
Ubuntu20.4 + Vagrant（Windows10）

## はじめに
自分が普段利用しているマシンのスペックについて気になったため、CPUの環境についての記事を書いてみました。

自分の環境は、VirtualBoxを使って仮想的にUbuntuを動かしており、ホストマシンはWindows10です。Windowsであれば、タスクマネージャーからCPUの情報を確認することができます。タスクマネージャーから調べた情報と、Ubuntuで調べた情報が同じであるかといえば、同じではありません。VirtualBoxで仮想マシンに割り当てたCPUの数に制限を儲けているためです。ホストマシンのCPUを全て仮想マシンに割り当ててしまうと、ホストマシン側でスペックが下がってしまうため、塩梅よく資源を振り分けて利用しています。

## CPUの情報を調べる

CPUの情報は **/proc/cpuinfo**に格納されています。つぎのコマンドを実行すると、タイムスタンプが、OSを起動した時間になっています。OSを起動する度に新規に作成されるファイルとなっています。そもそも、/procはメモリ上に展開されるディレクトリであり、/proc上に作成されるファイルは普通のファイルとは異なり、仮想ファイルと呼ばれます。

```
$ls -l /proc/cpuinfo
```

### ・物理的に搭載されているCPUの数を調べる（ソケットの数）

物理的なCPUの数を調べます。Windowsのタスクマネージャーを見ると、ソケットという数で表されます。マザーボード上にあるソケットの数と物理的なCPUの数は１対１のはずです。どちらで表現しても同じ意味になります。

CPUの物理的な数を調べるには、/proc/cpuinfoのphysical.idで調べることができます。つぎのコマンドを実行すると、0の表示が３つ出てきます。0はCPUの数が0個という意味ではなく、CPUが１個存在するという意味になります。物理的なCPUが２つある場合は、ここが1になります。

```
$grep physical.id /proc/cpuinfo
physical id     : 0
physical id     : 0
physical id     : 0
```

純粋にCPUの数だけを表示させたい場合は、つぎのコマンドを実行すると、スマートにCPUの数だけが表示されます。

```
$grep physical.id /proc/cpuinfo | sort -u | wc -l
1
```

### ・１つのCPUのコア数を調べる

物理的なCPUの数ではなく、コア数（論理的なCPUの数）を調べたい場合はつぎのコマンドで調べます。ここで注意なのは、表示されるのは、１つの物理的なCPUに搭載されているコアの数です。physical.idでCPUの番号が1であった場合、つまり、物理的にCPUが２個装着されている場合は、ここで表示されたコア数×2が搭載されている全コアの総数ということになります。

```
$ grep cpu.cores /proc/cpuinfo
cpu cores       : 3
cpu cores       : 3
cpu cores       : 3
```

CPUごとのコア数だけをシンプルに表示したい場合は、つぎのコマンドで表示させることができます。

```
$grep cpu.cores /proc/cpuinfo | sort -u
cpu cores       : 3
```

### ・（論理的な）CPUの総数を調べる

上記で調べた情報は、どちらかと言えばあまりどうでもいい情報です。一番知りたいことは、実際に搭載されているCPU（論理的な）の総数です。つぎのコマンドで調べることができます。コマンドを実行すると、論理的なCPUの数は３個だということが分かりました。
自分の環境では、１つのCPUに搭載されているコア数とCPUの（論理的）総数が同じ３個どうしでした。つまり、シングルコアだということです。

```
$grep processor /proc/cpuinfo
processor       : 0
processor       : 1
processor       : 2
```

論理的なCPUの数をシンプルに表示したい場合は、つぎのコマンドで表示させることができます。

```
$grep processor /proc/cpuinfo | wc -l
3
```
変数の値を動的にセットしたい


if関数を使って動的に値をセットしたいけど、変数の結果は使えないですね。
Salesforceなら数式リソースとして機能しますが、どうもMSさんでは機能しません。
ここでエラーくらい出してくれれば諦めがつくのですが、使う時にエラーになるなんて最悪です。
ますますこのツールは嫌になります。できれば使いたくない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/eb75bee1-059c-00f8-6e01-d756a6cb5043.png)

結局は分岐を使って... めんどくさい


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/7af2ab35-d508-c595-282b-c527dfb4e58d.png)
Pythonで簡単な企業の株価分析

こんにちは。
分析で、株価についてやってみたいなという方、いらっしゃるのではないでしょうか。

そこで今回は株価の比較方法をまとめました。

## 使えるデータ元サイト

Yahoo Finance 
stooq

がメジャーのようです。（自分調べ）

## 具体的な分析ステップ（案）


1:　証券取引所ならびに銘柄コードの把握

2:　コードに起こしてみる

3:　異常検知をしてみる

4:　その他気になる分析方法を行う

です。

## 1: 銘柄コード

<!--
銘柄のコードを使ってPython上で情報を引き出すのですが、このコードは証券取引所毎に異なります。世界共通ではないので２か国以上の株価を比較する際はそれぞれ設定する必要があることにお気をつけて。
参考までに個人的に興味ある＆よく使いそうなコードは下記の通り。

銘柄コードメモ
#### JP

日本の場合、JPXが銘柄コードを持っています。
https://www.jpx.co.jp/sicc/securities-code/01.html


#### EU
#### USA
#### 

##### yahoo finance上での見方
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334349/b080d792-7fe7-dc6a-5cf5-6120b21b897e.png)

上から順に
１）証券番号（企業に割り振られている番号）
２）

-->

ちなみにグローバルサイトでは下記のように出ます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3334349/35fb3dd9-f97f-90cd-fc67-f803064e0896.png)

<!--
[](
１-証券コード
どこの市場かは、Webページ上で見つけられなかったのでいちいち１社ずつ打って確かめました。-ここにあるよとか、ほかにいい方法があれば教えてくださると嬉しいです-

### 具体的なコード
コードといっても様々な方法で分析できるのですが、今回はその中でも下記をご紹介します。

~~~
df_sp.columns = ["ticker"]

~~~
※上記の[]部分はカラムが一つしかない場合にのみ限る。（SP500等）
２つ以上の場合はしっかりまずはPrintして、何のカラムがあるか確認して整えます。
-->

## 2: 分析をコードに起こしてみる

分析は様々な方法がありますが
時系列分析、リターンとボラティリティ、移動平均、自己相関関数、スプラインなどがありますね。

ここでは時系列でまず分析してみます

#### 時系列


### 3: 異常検知をしてみる

### 4: その他気になる分析方法を行う



### 参考になりそうな本・参考サイト
読んでないので何とも言えないですが、今回の記事を書くにあたり下記を発見したので、より体系的にやってみたい人は下記を見てみてもいいかもしれない。

https://www.morikita.co.jp/books/mid/085711


https://00dx.wordpress.com/2018/04/07/%E9%80%B1%E6%9C%ABpython%E3%80%80%EF%BD%9E%E3%83%86%E3%82%A3%E3%83%83%E3%82%AB%E3%83%BC-ticker-%E3%81%A8%E3%81%AF%EF%BD%9E/

https://myfrankblog.com/stock_price_with_yahoo_finance_api2/#%E6%9C%97%E5%A0%B1%E3%80%91%E6%97%A5%E6%9C%AC%E6%A0%AA%E3%82%82%E5%8F%96%E5%BE%97%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99

https://note.com/kiyo_ai_note/n/nb48f8673e819
ChromeでGoogleカレンダーやGmailをデスクトップアプリのように使う方法

Google Chromeには、特定のWebサイトをデスクトップアプリのように扱うことができる「ウィンドウ化」機能があります。この機能を利用することで、Gmail、Google Calendar、ChatGPT、または他のお気に入りのWebサービスをより迅速にアクセスできるようにし、デスクトップ環境をさらに効率化させることができます。以下のステップに従って設定してみましょう。

## ステップ1: ショートカットの作成

1. Chromeブラウザで、アプリ化したいWebサービス（例：GmailやChat GPT）にアクセスします
2. ブラウザの右上にある「︙」（その他の操作）メニューをクリックします
3. 「保存と共有」にカーソルを合わせ、「ショートカットを作成...」を選択します

## ステップ2: ウィンドウ化オプションの選択

1. 「ショートカットを作成」ダイアログが表示されます。「名前」フィールドには、Webサービスの名前が既に入力されていますが、必要に応じて変更できます
2. 「ウィンドウとして開く」オプションをチェックします。これにより、アプリのような独立したウィンドウでWebサービスが開かれるようになります
3. 「作成」ボタンをクリックします

## ステップ3: ショートカットの使用

作成したショートカットは、通常のアプリケーションと同様にデスクトップやスタートメニューからアクセスできます。これをクリックすると、選択したWebサービスが新しいウィンドウで開き、まるでデスクトップアプリのように利用できます。Gmailは公式のMacアプリなどはないので、この方法を利用することで、MacのCommand+TabやWindowsのAlt+Tabで切り替えられるようになり、探したいページにアクセスしやすくなります。

## まとめ

Chromeのウィンドウ化機能を使うと、重要なWebサービスへのアクセスが格段に便利になります。これにより、作業効率が向上し、お気に入りのサービスをより活用できるようになります。ぜひこの機能を試してみてください。
bokeh: 特定のGlyphRendererにカーソルを当てたときのみツールチップを表示させる

# 環境
* Python 3.12.1
* bokeh 3.4.0


# 背景
以下のコードで散布図をプロットしました。


```python:sample.py
from bokeh.io import output_file, save
from bokeh.plotting import figure, ColumnDataSource

data = {"a": [1, 2, 3], "b": [3, 1, 2], "name":["aaaaaaaaaaaa", "bbbbbbbbbbbb", "cccccccccccc"]}
source = ColumnDataSource(data)
TOOLTIPS = [
    ("a", "@a"),
    ("b", "@b"),
    ("name", "@name"),
]
fig = figure(width=300, height=300, tooltips=TOOLTIPS)

fig.scatter(
    source=source,
    x="a",
    y="b",
)
fig.text(
    source=source,
    x="a",
    y="b",
    text="name"
)
output_file("output.html")
save(fig)
```

プロットした円形にカーソルを当てたときに、ツールチップを表示させています。
テキストにカーソルを当てたときにもツールチップが表示されます。今回の例だとnameが長いので、ツールチップの表示領域が広くなり、ツールチップの表示が鬱陶しく感じました。




![散布図1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37903/f40ce2fe-9d4b-eac6-7131-d99d42cf0d4d.gif)

したがって、テキストにカーソルを当てたときはツールチップを表示させないようにしたいです。


# 解決策

`HoverTool`インスタンスの`renderers`プロパティに対して、`scatter()`の戻り値を設定することで、円形にカーソルを当てたときのみツールチップが表示されるようになりました。

```python
fig = figure(width=300, height=300)

scatter_renderer = fig.scatter(
    source=source,
    x="a",
    y="b",
)
text_renderer = fig.text(source=source, x="a", y="b", text="name")

hover_tool = HoverTool(tooltips=TOOLTIPS)
hover_tool.renderers = [scatter_renderer]
fig.add_tools(hover_tool)
```

上記のコードは以下を参考にしました。

https://discourse.bokeh.org/t/deactivate-hovertool-for-specific-glyphs/9931/2
Mac OS Useful Shortcuts

This is a memo about various shortcuts for MacOS. 
My macOS is Ventura 14.4. 
Some shortcuts are also available in Windows.

Command key ⌘ is the substitute for Control key in Windows. 
Usually, shortcuts are consists of "⌘ + A~Z." (The alphabet is the first letter of the function name.) 
But when two function names conflict, one shortcut requires Shift key (⌘ + shift + A~Z).

For example, shortcut to open a "N"ew window is "⌘ + N", but to create a "N"ew folder in Finder, "⌘ + shift + N." 
We should know the no-need-shift shortcuts for a better understanding of the shift-added shortcuts. 
That's why I introduce both types even if one is not so useful.

# Safari
## Tabs
|Fuctions|Shortcuts|
|:-:|:-:|
|Create a tab|⌘ + T|
|Create a new window|⌘ + N|
|Shift tabs (->)|ctrl + tab|
|Shift tabs (<-)|ctrl + tab + shift|
|Shift tabs (arbitrary)|⌘ + 1~9|
|Exit a tab|⌘ + W|
|Add to Bookmark|⌘ + D|

## Exploring
|Fuctions|Shortcuts|
|:-:|:-:|
|Proceed|⌘ + [|
|Go back|⌘ + ]|
|Reload|⌘ + R|
|Scroll down (shortly)|↓|
|Scroll down (widely)|⌥ + ↓|
|Scroll to the bottom|⌘ + ↓|

# Text Inputting
Command key ⌘ for Mac is the same as Control key for Windows. 

## Special Characters
### Modidier Key Expressions for Mac (⌘, ⌥, …)
We can't type these characters straightforwardly. 
So, we firstly open "Character Viewer", then search the character in need.
|Fuctions|Shortcuts|
|:-:|:-:|
|Open Character Viewer|⌘ + ctrl + space|

### Arrows
Arrows will be typed easily if you can input full-width characters.
|Fuctions|Shortcuts|
|:-:|:-:|
|←|zh|
|↓|zj|
|↑|zk|
|→|zl|

### Others
|Fuctions|Shortcuts|
|:-:|:-:|
|…|⌥ + ;|

# File Operations
|Fuctions|Shortcuts|
|:-:|:-:|
|Change file name|return|
|Go up directory|⌘ + ↑|
|Go down directory|⌘ + ↓|
|Create a folder|⌘ + shift + N|
|delete a folder|⌘ + delete|

# Window Operations
|Fuctions|Shortcuts|
|:-:|:-:|
|Maximize window|⌘ + ctrl + F|
|Minimize window|⌘ + M|
|Exit window|⌘ + W|

# Application Operations
|Fuctions|Shortcuts|
|:-:|:-:|
|Switch apps|⌘ + tab|
|Quit app|⌘ + Q|