OmniAICreator/Qiita-1.07M huggingface dataset:
LangChainでOpenAIのGPT-4oモデルを使って画像を読み込ませる

# 概要

OpenAIの最新モデルであるGPT-4oはすごいですね、速くて頭が良くなってます。
画像を読み込ませてLLMに評価させるアレ、LangChainでどうするの？が分からなかったので試してみました。

# コード

```python:
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.prompts.chat import HumanMessagePromptTemplate
import base64
import os

os.environ["OPENAI_API_KEY"] = "<ここにAPIキーを入れる>"

#プロキシを使う場合
#os.environ['http_proxy'] = 'http://127.0.0.1:8080'
#os.environ['https_proxy'] = 'http://127.0.0.1:8080'

#画像ファイルをbase64エンコードする
def encode_image(image_path):
  with open(image_path, "rb") as image_file:
    return base64.b64encode(image_file.read()).decode('utf-8')


image_path = "<読み込ませるファイルをここで指定する>"
base64_image = encode_image(image_path)

#本当はImagePromptTemplateを使いたいが
image_template = {"image_url": {"url": f"data:image/png;base64,{base64_image}"}}

chat = ChatOpenAI(temperature=0, model_name="gpt-4o-2024-05-13")

system = (
    "あなたは有能なアシスタントです。ユーザーの問いに回答してください"
)

human_prompt = "{question}"
human_message_template = HumanMessagePromptTemplate.from_template([human_prompt, image_template])

prompt = ChatPromptTemplate.from_messages([("system", system), human_message_template])

chain = prompt | chat
result = chain.invoke({"question": "この画像は何の絵ですか？"})
print(result)

```

# 結果

画像を読み込んで、質問に回答してくれました。画像の解析は数秒かかります。

```text:
content='この画像は、かわいらしいキャラクターのイラストです。キャラクターは犬のように見え、白いシャツに青いサスペンダー 付きのズボンを着ており、ピンクの蝶ネクタイをしています。耳にはハートのマークが描かれています。' response_metadata={'token_usage': {'completion_tokens': 73, 'prompt_tokens': 294, 'total_tokens': 367}, 'model_name': 'gpt-4o-2024-05-13', 'system_fingerprint': 'fp_c45f7d0b45', 'finish_reason': 'stop', 'logprobs': None} id='run-187bd6c9-cdfc-4c02-a1ed-71fb82b8b3a1-0'
```
【AWS】ELBで「Access Denied for bucket: xxx. Please check S3bucket permission」エラーが出た場合

# 概要
ELBとS3ログの作成をCFで実施したら以下エラー。

> Resource handler returned message: "Access Denied for bucket: xxx. Please check S3bucket permission

原因はバケットポリシーやIAMロール権限などではなく、意外なところでしたので紹介します。

# 原因
エラーメッセージは「ELBがS3バケットにアクセスできません」と言っています。
`xxx`という名前のS3バケットに対するアクセスが拒否されています。

原因としてよくあるのは以下だと思います。

・ELBがS3バケットにアクセスするためのIAMロールが適切な権限を持っていない
・S3バケットのポリシーがELBからのアクセスを拒否している

しかし、今回はどちらも問題ありませんでした。

原因は、CloudFormationでの実施順序にありました。
イベントの履歴を確認すると、`BucketPolicyLog`がまだ完全に適用されていない状態で`PublicLoadBalancer`が更新されており、そのせいでアクセス権限が不足してしまっていたのです。

# 解決策
`BucketPolicyLog`が適用されるのを待ってから`PublicLoadBalancer`を更新するように、依存関係を明示的に定義してあげればOKです。

以下のように`DependsOn`属性を追加します。

```yaml
PublicLoadBalancer:
  Type: AWS::ElasticLoadBalancingV2::LoadBalancer
  DependsOn: BucketPolicyLog # 追加
  Properties:
    # ...
```

これにより、CloudFormationは`BucketPolicyLog`が完全に作成または更新されるのを待ってから`PublicLoadBalancer`を更新してくれるようになり、エラーがなくなりました。

実施順序（依存関係）によるエラーは、それが「実施順序の問題だよ」と教えてくれないので、ハマると大変です。なるべくエラーイベントにある箇所から「どうしてここでエラーが起きているのか？」を考えるのがベストかなと思います。

以前にも似たことがあったのでご参考までに。

https://qiita.com/Ryo-0131/items/5cf8e34e6c52840e4345
StackServer入門

皆さん、こんにちは！
今回はStackProgrammingCommunityの初投稿記事です。
今話題のディストリビューションStackServerを解説します。
# StackServerとは？
Stackプログラミング言語のWebサーバーサイド開発向けディストリビューションです。扱いやすくエレガントなStackを強みを生かしてWebサーバーを構築する事が出来ます。

 https://github.com/stack-community/stack-server

# インストール
早速インストールしていきましょう
以下のコマンドをターミナルに打ち込みます。
```bash
git clone https://github.com/stack-community/stack-server.git
cargo install --path ./stack-server
```
確認のため以下のコマンドを叩きます。
```
stack-server
```
これで以下のようなStackServerの対話環境が開いたらインストール成功です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952107/91a70e89-a09b-4dcc-9153-82dc02b8aba7.png)


# Hello, world!

リポジトリの`example`フォルダ内に公式がサンプルコードを用意してくれてますが初心者には難しいので、自力で「Hello, world」を表示するサーバーを立てます。

```stack:hello.stk
(127.0.0.1:8000) [
    [[(GET /)] (
        (text/html)
        (Hello, world!)
    )]
] start-server
```

このコードを以下のコマンドで実行してみましょう。
```bash
stack-server ./hello.stk
```
すると以下のように表示されます。そのURLにアクセスしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952107/7732fb5c-6be9-ba05-a2a4-2148e58f022c.png)

FOOOOOOOOOOOOOOOOO↑↑↑

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2952107/afed04dc-44a6-af77-dd1e-8db545779b3d.png)

成功です！おめでとうございます。

# まとめ
ここまで読んでくれてありがとうございました。しかし、これはStackServerのほんの序章にすぎません。さらなるステップアップには、公式のサンプルコードと睨めっこしたり動かしたりしてみてください。
専任開発者を雇う：スマートなビジネス成長の鍵

専任の開発者を雇うことは、多くの企業にとって効果的な戦略です。特に、ニーズに合わせたカスタムソリューションを求める場合には、専門知識と経験豊富な開発者の存在が重要です。この記事では、専任の開発者を雇うメリット、選び方、成功事例について探ってみましょう。
専任開発者のメリット
カスタムソリューションの提供:
専任の開発者は、企業のニーズに合わせたカスタムソリューションを提供します。これにより、ビジネスプロセスの効率化や競争力の向上が可能になります。
リアルタイムのサポートとメンテナンス:
専任の開発者は、常にシステムの運用状況を監視し、問題が発生した場合には迅速に対応します。これにより、システムの安定性と信頼性が向上します。
コスト効率の向上:
[専任の開発者を雇う](https://newwave-solutions.co.jp/hire-a-dedicated-developer/)ことで、外部の委託先に比べてコストを削減できる場合があります。また、専任の開発者は企業のビジョンや文化に深く関わることができるため、組織の成長にも貢献します。
専任開発者の選び方
専門知識と経験:
開発者の専門知識と経験が重要です。過去のプロジェクトや実績を確認し、企業のニーズに適した開発者を選びましょう。
コミュニケーションスキル:
開発者とのコミュニケーションは円滑であるべきです。適切なコミュニケーションスキルを持つ開発者を選びましょう。
価値観の一致:
開発者の価値観が企業と一致していることが重要です。文化の適合性を確認し、共通の目標を持つ開発者を選びましょう。
成功事例
小売業の成功事例:
小売業では、専任の開発者を雇うことで、顧客体験を向上させるためのカスタムアプリケーションを開発し、売上を増加させることができました。
テクノロジー企業の成功事例:
テクノロジー企業では、専任の開発者を雇うことで、新しいプロダクトの開発サイクルを短縮し、市場投入を早めることができました。
結論
専任の開発者を雇うことは、ビジネス成長にとって重要な戦略です。そして、信頼できるパートナーであるNewwave Solutionsの存在は、その戦略を実現するための鍵となります。Newwave Solutionsは、高度な技術力と経験豊富なチームを持ち、企業の成長をサポートします。彼らとのパートナーシップは、ビジネスの未来を明るくするでしょう。
[ODC]再帰的なデータ構造を作れない問題

OutSystemsのStructureは再起的なデータ構造にできない。
つまり、要素として自分自身を持つことができない。
この点について確認し、対策を検討する。

# 環境情報
ODC Studio(Version 1.4.7 on Mac)

# Structureの要素として自分自身を持つとエラーになりPublishできない
ODC Studio上で試しに再帰的なStructureを作ってみたところ、エラーになりPublishできない。
（ChildというAttributeが、自分自身のStructure RecursiveStructureをData Typeとしている）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/3251bc91-389e-8105-f55f-ef68d57bd8a9.png)

表示されるエラーメッセージは以下の通り「Attributeが入れ子となる再帰的StructureをData Typeとして設定している」というものなので、やはり再帰的なStructureは定義できない。
> Structure名.Attribute名 defines a nested recursive Structure data type definition.

# 回避策1: ツリー構造を平らにする
本来はツリー構造として表現したいデータのセットを、平たいデータ構造に展開して保持する。
具体的には、Attributeとして親ノードへのポインタや自分のノードの深さを持つようにする。

例：Forgeにある、ツリービューを実現するGtreeはこの方式をとっている。Node Structureがツリービューの各ノードを表しているが、各Nodeが自分と親NodeのIdを持つ構造。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/2a4bc923-091b-ca49-61d6-79e4e9809bcf.png)

　["nested recursive Structure data type definition"](https://www.outsystems.com/forums/discussion/7807/nested-recursive-structure-data-type-definition/)で紹介されている方法。
　
# 回避策2: (深さが有限の場合) レベル別にStructureを定義する
深さが有限の場合は、深さごとに別のStructureとして定義する方法もある。
三階層程度であればこの方法が楽そう。

例：最大三階層の場合。以下の様に、ルートレベルのStructure「RecursiveLevel1」のChildren Attributeに第二階層用のStructure「RecursiveLevel2」のListを持たせる。
更に第二階層StructureのChildren Attributeには第三階層用のStructure「RecursiveLevel3]
のListを持たせる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/e68031b8-9daf-ee50-757b-f7c9c083b85e.png)

# 回避策3: (JavaScriptだけに閉じる場合) Javascript要素で対応
階層データがJavaScript内に閉じるのであれば、JavaScriptのコードで作成してしまえば良い。また、サーバサイドで必要であったとしても、階層構造のJSONで十分なら、JavaScriptでJSON化し、結果のText型変数を引き渡せば良い。

# 関連する話題
Entityは再帰的な構造にできる。
自分自身のIdentifierをData TypeとするAttributeを持てるということ。
AR開発：未来の技術とその可能性

現代の技術の進歩により、現実とデジタルの世界が融合する新たなエクスペリエンスが可能になりました。その中でも特に注目されているのが、拡張現実（AR）です。ARは、現実世界にデジタル情報を重ねることで、ユーザーに新しい体験を提供します。今回は、AR開発の基礎、ARアプリの例、そしてARの作り方について詳しく解説します。
AR開発の基礎
[AR開発](https://newwave-solutions.co.jp/ar-development/)は、従来のアプリ開発と異なり、現実世界とのインタラクションを考慮する必要があります。以下に、AR開発の基本要素を紹介します。
センサーとカメラ：
ARデバイスは、環境を認識するためにカメラやセンサーを使用します。これにより、デバイスは現実世界のオブジェクトを検出し、デジタル情報を適切に配置することができます。
ARプラットフォーム：
AR開発には、ARKit（Apple）やARCore（Google）などのプラットフォームが使用されます。これらのプラットフォームは、開発者がAR体験を簡単に作成できるように多くのツールとリソースを提供します。
3Dモデリングとアニメーション：
ARは現実世界に3Dオブジェクトを重ねるため、3Dモデリングとアニメーションのスキルが重要です。BlenderやMayaなどのソフトウェアを使用して、高品質な3Dモデルを作成することが求められます。
[ARアプリ](https://newwave-solutions.co.jp/argumentative-reality-apps/)の実例
AR技術を活用したアプリはさまざまな分野で利用されています。ここでは、いくつかの代表的なARアプリを紹介します。
Pokémon GO：
Pokémon GOは、AR技術を使用したモバイルゲームで、プレイヤーは現実世界を歩き回りながらポケモンを捕まえることができます。このアプリは、AR技術の普及に大きく貢献しました。
IKEA Place：
IKEAのARアプリでは、ユーザーが自宅の部屋に家具を仮想的に配置してみることができます。これにより、購入前に家具がどのように見えるかを確認することができます。
Google Translate：
Google TranslateのAR機能では、カメラを使用してリアルタイムでテキストを翻訳することができます。例えば、外国語の看板をカメラで撮影すると、その場で翻訳結果が表示されます。
[ARの作り方](https://newwave-solutions.co.jp/how-to-create-ar/)
ARアプリの開発は、複雑なプロセスですが、以下のステップに従うことで、初心者でも基本的なARアプリを作成することができます。
アイデアの発案：
まず、どのようなARアプリを作りたいかを考えます。ターゲットユーザーやアプリの目的を明確にすることが重要です。
必要なツールの準備：
AR開発には、適切なツールとプラットフォームが必要です。UnityやUnreal Engineは、初心者にも使いやすいAR開発環境を提供しています。ARKitやARCoreのSDKをインストールすることも忘れずに。
基本的な設定：
開発環境を整えたら、新しいプロジェクトを作成し、AR機能を有効にします。例えば、UnityではAR Foundationパッケージを使用して、ARKitやARCoreと連携させることができます。
3Dオブジェクトの作成と配置：
BlenderやMayaなどのツールを使って、アプリで使用する3Dモデルを作成します。その後、これらのモデルをプロジェクトにインポートし、適切な位置に配置します。
インタラクションの追加：
ユーザーがどのようにアプリとインタラクトするかを考えます。タップやスワイプなどのジェスチャーを使用して、ARオブジェクトとインタラクトできるようにプログラムします。
テストとデバッグ：
開発が進む中で、定期的にテストを行い、バグを修正します。異なる環境やデバイスでの動作を確認し、アプリの安定性を確保します。
リリースとフィードバック：
完成したアプリをApp StoreやGoogle Playなどのプラットフォームでリリースします。ユーザーからのフィードバックを収集し、必要に応じてアップデートを行います。
まとめ
AR開発は、現実とデジタルを融合させる革新的な技術であり、多くの分野で利用されています。技術の進歩とともに、ARはますます日常生活に浸透していくでしょう。ARアプリ開発において、Newwave Solutionsは信頼できるパートナーです。彼らは高度な技術力と豊富な経験を持ち、クライアントのニーズに合わせたカスタマイズソリューションを提供します。AR開発を成功させるためには、Newwave Solutionsのような専門家と協力することが重要です。
インストールしたはずのSlack appがワークスペースに表示されなくて困った

多分Slackのバグ。

### 困ったこと
Slack appを作成してワークスペースにインストールした。
使いたいチャネルからappを追加しようとしたのだが、さっきインストールしたはずのアプリがいつまで経ってもアプリ一覧に表示されない。

### 解決方法
Slack画面左下のApp˅ 下にある　「+アプリを追加する」をクリック 
⇨ 右上の「Appディレクトリ」をクリックすると、ブラウザでSlack app directryというページが開く。
⇨ 右上の 「管理」をクリックすると、ワークスペースにインストールされたアプリの一覧が表示される。ここには先ほどインストールしたアプリが表示されているので、該当のアプリをクリック。 
⇨ 「アプリの詳細」をクリック
⇨ 「Slackで開く」をクリック
⇨　Slackにて、アプリとのDM画面が開く。
⇨　画面上方のアプリ名右横の　˅　をクリック　
⇨ 「チャンネルにこのアプリを追加する」から、任意のチャネルに追加する。
モバイルアプリデザイン会社とReact Native開発会社：デジタル時代のビジネスパートナー

現代のビジネス環境では、モバイルアプリの存在は欠かせないものとなっています。モバイルアプリは企業と顧客を繋ぐ重要なツールであり、そのデザインと開発はビジネスの成功に直結します。この記事では、モバイルアプリデザイン会社とReact Native開発会社について詳しく解説し、これらの企業がどのようにして優れたモバイルアプリを生み出しているのかを探ります。
モバイルアプリデザイン会社の役割
[モバイルアプリデザイン会社](https://newwave-solutions.co.jp/mobile-app-design-company/)は、ユーザーエクスペリエンス（UX）とユーザーインターフェース（UI）のデザインに特化した企業です。彼らの主な役割は、ユーザーが使いやすく、視覚的に魅力的なアプリを作成することです。
ユーザー中心のデザイン：
モバイルアプリデザイン会社は、ユーザーのニーズと期待を理解し、それに基づいたデザインを作成します。ユーザー中心のデザインアプローチは、アプリが直感的で使いやすいことを保証します。
プロトタイピングとワイヤーフレーミング：
デザインプロセスの初期段階では、プロトタイプとワイヤーフレームを作成します。これにより、アプリの基本的な構造とナビゲーションを視覚化し、開発前にフィードバックを収集することができます。
ビジュアルデザイン：
カラー、タイポグラフィ、アイコン、画像などのビジュアル要素を使って、アプリの外観を決定します。ビジュアルデザインは、ブランドの一貫性を保ちつつ、ユーザーにとって魅力的なインターフェースを提供します。
ユーザビリティテスト：
デザインが完成したら、ユーザビリティテストを実施して、実際のユーザーがどのようにアプリを使用するかを評価します。これにより、デザインの改善点を見つけ、最終的な品質を高めることができます。
React Native開発会社の役割
React Native開発会社は、React Nativeフレームワークを使用してクロスプラットフォームのモバイルアプリを開発する専門企業です。React Nativeは、Facebookが開発したオープンソースのフレームワークで、一度のコード記述でiOSとAndroidの両方に対応するアプリを作成できます。
クロスプラットフォーム開発：
React Native開発会社は、単一のコードベースを使用してiOSとAndroidの両方に対応するアプリを開発します。これにより、開発時間とコストを削減し、迅速な市場投入が可能になります。
パフォーマンスの最適化：
React Nativeは、ネイティブコードと同等のパフォーマンスを提供するため、開発会社はアプリのパフォーマンスを最適化する技術を持っています。これにより、スムーズで高速なユーザーエクスペリエンスを実現します。
再利用可能なコンポーネント：
React Nativeの強力な特徴の一つは、再利用可能なコンポーネントを使用できることです。これにより、開発者は同じコンポーネントを異なるアプリで再利用し、開発プロセスを効率化します。
ホットリロード：
[React Native開発会社](https://newwave-solutions.co.jp/react-native-development-company/)は、ホットリロード機能を活用して、コードの変更をリアルタイムで確認しながら開発を進めます。これにより、開発速度が向上し、バグの発見と修正が迅速に行えます。
モバイルアプリデザイン会社とReact Native開発会社の協力
モバイルアプリデザイン会社とReact Native開発会社が協力することで、ユーザーにとって優れたエクスペリエンスを提供する高品質なアプリが生まれます。この協力関係は、以下のようなプロセスを通じて実現されます。
要件定義と計画：
クライアントと共に要件を定義し、プロジェクトの計画を立てます。この段階では、デザインと開発の両方の観点からプロジェクトのスコープを明確にします。
デザインとプロトタイピング：
モバイルアプリデザイン会社がUX/UIデザインを作成し、プロトタイプを開発します。このプロトタイプは、React Native開発会社が実際のアプリに統合するための基盤となります。
開発と統合：
React Native開発会社がデザインを元にコードを記述し、アプリを開発します。開発中には、デザイン会社との緊密なコミュニケーションを保ち、デザインと機能の整合性を確保します。
テストと品質保証：
両社が協力してアプリのテストを実施し、バグや問題点を修正します。ユーザビリティテストやパフォーマンステストを通じて、アプリの品質を最適化します。
リリースとメンテナンス：
完成したアプリをApp StoreやGoogle Playにリリースします。リリース後も、両社が協力してメンテナンスやアップデートを行い、ユーザーのフィードバックを基に改善を続けます。
まとめ
モバイルアプリデザイン会社とReact Native開発会社は、現代のデジタルビジネスにおいて不可欠なパートナーです。デザインと開発の専門知識を結集することで、ユーザーに優れたエクスペリエンスを提供する高品質なモバイルアプリを実現できます。これからモバイルアプリの開発を考えている企業は、これらの専門家と協力することで、成功への道を確実にすることができるでしょう。
ECサイト開発会社：オンラインビジネスの成功を牽引するエキスパート

現代のデジタル時代において、EC（電子商取引）サイトは、企業がオンライン上でビジネスを展開し、顧客との関係を築く上で極めて重要な役割を果たしています。ECサイトの開発や管理は、専門的な知識や技術が必要な分野であり、ここでECサイト開発会社が重要な役割を果たします。この記事では、ECサイト開発会社の重要性、彼らの役割、利点、成功事例などについて詳しく説明します。
ECサイト開発会社の役割
[ECサイト開発会社](https://newwave-solutions.co.jp/ecommerce-development-company/)は、企業がオンラインで製品やサービスを販売するためのプラットフォームを提供する専門家です。彼らの役割は多岐にわたりますが、主なものは以下の通りです：
専門知識と技術の提供：
ECサイト開発は、専門的な知識や技術が必要です。開発会社は、最新のテクノロジーとベストプラクティスに精通し、高品質のECサイトを提供します。
デザインとユーザーエクスペリエンス（UX）の最適化：
魅力的なデザインと使いやすいUXは、ECサイトの成功に不可欠です。開発会社は、ユーザーが直感的に操作できるサイトを設計し、顧客の満足度を高めます。
セキュリティの確保：
オンライン取引にはセキュリティ上のリスクが伴いますが、開発会社はデータの保護やセキュリティ対策を強化し、顧客の信頼を獲得します。
ECサイト開発会社の利点
ECサイト開発会社を利用することには、以下のような多くの利点があります：
時間とコストの節約：
専門家に開発を依頼することで、時間とコストを節約できます。内部で開発する場合に比べて、効率的にプロジェクトを進めることが可能です。
スケーラビリティ：
企業の成長に応じてECサイトを拡張することができます。開発会社は、ビジネスの変化に対応できる柔軟なソリューションを提供します。
最新の技術と機能：
開発会社は常に最新の技術と機能を取り入れています。これにより、企業は競争力を維持し、顧客に最新のエクスペリエンスを提供できます。
継続的なサポートとメンテナンス：
ECサイトの運営には継続的なサポートとメンテナンスが必要です。開発会社は、サイトのパフォーマンスを最適化し、問題が発生した場合には迅速に対応します。
成功事例
成功したECサイトの事例を見てみましょう。
ファッション業界の事例：
あるファッションブランドは、ECサイト開発会社と協力して、オンラインストアを立ち上げました。魅力的なデザインとスムーズなユーザーエクスペリエンスにより、顧客の購買意欲が高まり、売上が増加しました。
飲食業界の事例：
あるレストランチェーンは、ECサイトを通じてテイクアウトやデリバリーサービスを提供しました。開発会社のサポートにより、顧客は簡単に注文を行い、レストランは新たな収益源を確立しました。
結論
ECサイト開発は重要な一歩ですが、信頼できるパートナーが必要です。Newwave Solutionsはそのような信頼できる企業の一つです。彼らは豊富な経験と専門知識を持ち、ビジネスの成長を支援します。彼らとの協力は、成功への鍵となります。
カスタムCRM：ビジネスのためのカスタマイズされた顧客管理システム

現代のビジネス環境で、顧客関係管理（CRM）システムは重要なツールです。特にカスタムCRMは、企業の特定のニーズに合わせて設計されるため、効率的な顧客管理を実現します。ここでは、カスタムCRMの重要性、利点、導入方法について説明します。
カスタムCRMの重要性
業務プロセスの最適化：
カスタムCRMは企業の業務プロセスに合わせて設計されるため、効率を最大化します。
顧客体験の向上：
顧客データを効果的に管理し、個別のニーズに応じたサービスを提供することで、顧客満足度が向上します。
スケーラビリティと柔軟性：
企業の成長に応じてCRMシステムも拡張可能です。
[カスタムCRM](https://newwave-solutions.co.jp/create-custom-crm/)の利点
データの一元管理：
顧客データを一元管理し、情報の一貫性と正確性を確保します。
プロセスの自動化：
リードのフォローアップやメールキャンペーンなどの反復タスクを自動化します。
カスタマイズ可能なレポート：
ビジネスニーズに合わせたレポートを作成し、パフォーマンスをリアルタイムで監視します。
統合性の向上：
他のビジネスシステムとシームレスに統合でき、運用効率が向上します。
カスタムCRMの導入方法
要件定義：
企業のニーズと要件を明確にします。
ベンダー選定：
適切なCRMソリューションを提供するベンダーを選定します。
設計と開発：
ベンダーと協力してカスタムCRMを設計・開発します。
テストと導入：
システムのテストを行い、導入します。
トレーニングとサポート：
従業員へのトレーニングとサポート体制を整えます。
カスタムCRMの成功事例
小売業の事例：
大手小売企業がカスタムCRMを導入し、顧客の購買履歴や行動データを分析してパーソナライズされたマーケティングキャンペーンを実施しました。これにより、顧客満足度と売上が向上しました。
まとめ
カスタムCRMは、企業の特定のニーズに対応し、効率的な顧客管理を実現します。データの一元管理、自動化、カスタマイズ可能なレポートなど、多くの利点があります。
カスタムCRMの導入において、Newwave Solutionsは信頼できるパートナーです。豊富な経験と高い技術力で、企業の成長と競争力を高めるサポートを提供します。
【Rails】updateメソッドとupdateアクションの違い

## update メソッド
**1. 定義と用途**
- モデルのインスタンスを更新する
- データベースに変更を保存する

<br>

**2. 動作**
- 属性のセットを引数として受け取り、バリデーションを実行した上で、バリデーションが成功した場合にはデータベースを更新します。更新が成功すると`true`を、失敗すると`false`を返します。

<br>

**3. コード例**
コード例は `name` 属性を `新しい名前` に更新しようと試みています。
```ruby:Ruby
@user.update(name: "新しい名前")
```

<br>
<br>

## update アクション
**1. 定義と用途**
- フォームのデータを受け取り、それを使って特定のモデルのレコードを更新する処理を行います。  ※MVCのC

<br>

**2. 動作**
- HTTPリクエストを受け取り、対応するモデルのインスタンスを特定し、そのデータを更新するためのビジネスロジックを含みます。
- 成功または失敗に基づいて適切なビューをレンダリングするか、別のアクションにリダイレクトします。

<br>

**3. コード例**
※`user_params`は「ストロングパラメータ」として定義された「privateメソッド」
```ruby:Ruby
def update
  if @user.update(user_params)
    redirect_to @user, notice: 'ユーザーが更新されました。'
  else
    render :edit
  end
end
```
C# ネットワークアダプタのプロパティの取得や設定

C# でネットワークアダプタ関連の情報を取得したり、設定する方法について説明します。

Win32_NetworkAdapterConfiguration に関する情報は多いのですが、MSFT_NetAdapter, MSFT_NetIPInterface などの MSFT_XXXX の情報が少ないので説明しますね。


WMI(Windows Management Instruction) を使うと、ネットワークアダプタの情報取得や値の設定が可能です。

### プロパティの取得

下記は、ネットワークアダプタのインタフェースメトリックを取得する例です。

```CSharp
public uint GetNetworkInterfaceMetric(int ifIndex)
        {
            SelectQuery query = new SelectQuery("MSFT_NetIPInterface", $"InterfaceIndex={ifIndex}");
            ManagementScope scope = new ManagementScope("\\root\\StandardCimv2");
            ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);

            foreach (ManagementObject m in searcher.Get())
            {
                return (uint)m["InterfaceMetric"];
            }
            return uint.MinValue;
        }
```

### プロパティの設定

例は、ネットワークアダプタのインターフェースメトリックを設定する方法です。

プロパティは、リードオンリーなプロパティと、リードライト可能なプロパティがあります。

InterfaceMetric プロパティは、リードライト可能なプロパティですので、ManagementObject の Put メソッドを利用することで値を変更することができます。


```CSharp
public bool SetNetworkInterfaceMetric(int ifIndex, uint metric)
       {
           SelectQuery query = new SelectQuery("MSFT_NetIPInterface", $"InterfaceIndex = {ifIndex}");
           ManagementScope scope = new ManagementScope("\\root\\StandardCimv2");
           ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query);

           foreach (ManagementObject m in searcher.Get())
           {
               m["InterfaceMetric"] = metric;
               m.Put();    // オブジェクトへの変更をコミットする
               return true;
           }
           return false;
       }
```

       
https://learn.microsoft.com/ja-jp/windows/win32/fwp/wmi/nettcpipprov/msft-netipinterface
動的バインディング（Dynamic Binding）をTypeScriptで理解する

## はじめに
動的バインディング（Dynamic Binding）、またはレイトバインディング（Late Binding）とは、プログラムの実行時にどのメソッドや関数を呼び出すかを決定する技術です。これは、特にオブジェクト指向プログラミングにおいて重要な概念であり、ポリモーフィズムを実現するための基盤となります。

## 動的バインディングの概念

動的バインディングでは、メソッドの呼び出しが実行時に解決されます。これは、コンパイル時にメソッドの呼び出しを決定する静的バインディング（Static Binding）とは対照的です。動的バインディングにより、サブクラスのオーバーライドされたメソッドが適切に呼び出されることが保証されます。

## 動的バインディングのルール

動的バインディングのルールは次の通りです：

#### 1. **基底クラスの参照**: 
メソッド呼び出しは基底クラスの型に基づいて行われます。
#### 2. **実際のオブジェクトのメソッド**: 
実際に呼び出されるメソッドは、実行時にオブジェクトの実際の型に基づいて決定されます。
#### 3. **オーバーライドの優先**: 
サブクラスでオーバーライドされたメソッドが存在する場合、そのメソッドが呼び出されます。

## TypeScriptでの動的バインディング

TypeScriptでも動的バインディングはサポートされており、オブジェクト指向プログラミングの一部として利用できます。以下に、動的バインディングを示すTypeScriptの例を示します。

## 基底クラスと派生クラスの定義

```typescript
class Animal {
    speak(): void {
        console.log("Animal makes a sound");
    }
}

class Dog extends Animal {
    speak(): void {
        console.log("Dog barks");
    }
}

class Cat extends Animal {
    speak(): void {
        console.log("Cat meows");
    }
}
```

### 動的バインディングの例

```typescript
function makeAnimalSpeak(animal: Animal): void {
    animal.speak(); // このメソッド呼び出しは動的にバインドされる
}

const myDog: Animal = new Dog();
const myCat: Animal = new Cat();

makeAnimalSpeak(myDog); // 出力: Dog barks
makeAnimalSpeak(myCat); // 出力: Cat meows
```

### 詳細な説明

#### 1. **基底クラスの参照**:
   ```typescript
   const myDog: Animal = new Dog();
   const myCat: Animal = new Cat();
   ```
   ここでは、`myDog` と `myCat` の型が `Animal` であり、基底クラスの型に基づいて参照されています。

#### 2. **実際のオブジェクトのメソッド**:
   ```typescript
   makeAnimalSpeak(myDog); // 出力: Dog barks
   makeAnimalSpeak(myCat); // 出力: Cat meows
   ```
   実際のオブジェクトの型（`Dog` や `Cat`）に基づいて、適切な `speak` メソッドが実行されます。これが動的バインディングの核です。

#### 3. **オーバーライドの優先**:
   ```typescript
   class Dog extends Animal {
       speak(): void {
           console.log("Dog barks");
       }
   }
   ```
   サブクラスで `speak` メソッドがオーバーライドされているため、`Dog` や `Cat` のインスタンスが渡された場合、それぞれの `speak` メソッドが呼び出されます。

## まとめ

動的バインディングは、実行時にメソッド呼び出しを解決する技術であり、ポリモーフィズムを実現するための重要な仕組みです。TypeScriptでは、クラスの継承とメソッドのオーバーライドを利用して、動的バインディングを簡単に実現できます。
neovim で venv 環境の pyright LSP を使う

## 概要

venv 環境 (pipenv や Rye で作成した環境など) にインストールした pyright の language server を使って支援を受ける方法を探していたので書き残します。

## 環境

- neovim v0.10.0 (Release)
- nvim-cmp, lspconfig

## 設定

`bash -c` で `.venv/bin/activate` を呼び出して仮想環境に入り、`.venv/bin/pyright-langserver` のバイナリを呼び出します。

```lua
require("lspconfig").pyright.setup {
    on_attach = on_attach,
    capabilities = capabilities,
    filetypes = { "python" },
    root_dir = util.root_pattern(".venv"),
    cmd = { "bash", "-c", "source .venv/bin/activate && .venv/bin/pyright-langserver --stdio" },
}
```

## うまくいかなかった方法

- `.venv/bin/pyright-langserver` を直接呼び出す
    - 仮想環境が有効になっていないのでグローバルのモジュールを参照してしまう
- `.venv/bin/python -m pyright` のような方法で呼び出す
    - この方法で LSP を呼び出す方法が不明
GitHubからDiscordへ通知する方法

## Discordで

- 通知を送信したいチャンネルの設定を開く（サーバー設定でも構わない）
- 「連携サービス」から「ウェブフックを作成」をクリック
![チャンネル設定の画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799108/5181962d-878d-c5bd-5679-cdb314d97d68.png)
- 自動的にウェブフックが作成されるので、それを選択
![ウェブフックの画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799108/4759e78a-5520-a7d9-3442-cae6df7d1ef8.png)
- 「ウェブフックURLをコピー」をクリック
![ウェブフックbotの画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799108/643d7298-a08f-401e-386b-97c67d41c00b.png)

## GitHubで

- 通知を送りたいRepositoryかOrganizationの「Setting」を開く
- 「Webhooks」を開く
- 右上の「Add webhook」をクリック
![Webhooksの画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799108/b42cee99-4db6-1219-e89c-0aa2676150db.png)
- Payload URLにコピーしたURLを貼り付け、**末尾に**`/github`**をつける**
- Content typeを「application/json」にする
- Secretは何も書かない
- ウェブフックの通知設定はおまかせでどうぞ
- Activeに✓が入っていることを確認して「Add webhook」
![Add webhookの画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799108/132307db-3696-28cc-8234-ce312d371010.png)

:::note warn
GitHubでウェブフックURLを張り付けるとき、末尾に`/github`を付け忘れると通信が失敗するので注意
:::

- 画像のように表示されれば完了
![Webhooksで通信が成功している画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3799108/9022668d-d2d5-8e1e-a2ec-ebf4b0723129.png)

---

日本語で末尾に`/github`を付けないといけないという記事を見つけられなかったので、備忘録ついでに日本語化


## Reference
[Github to Discord Webhook tutorial.md](https://gist.github.com/SGTGunner/50d6a3cc0d489cf779f77695ba3e22ea)
Gemini Advanced課金版でExcelやスプレッドシートの分析がついに可能に！今のところ直接Excelなどの分析ができる最安値のAI！

# Gemini AdvancedでExcelやGoogleスプレッドシートの分析が可能になりました。

ChatGPTより安く最安値なのに、大きな容量で分析できます。競争力があるAIを使いたいので安い、大容量というのはありがたいです

![スクリーンショット (1356).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3291948/edecac72-dce3-6168-4ec6-151fd5670018.png)


# Microsoft Excelを分析したいとき

upload fileを選択してください。

# Google スプレッドシートの分析をしたいとき

Add from Driveで選択してください。



# 後は「これを分析して」と頼むだけ！
TypeScriptで学ぶポリモーフィズム

## はじめに
ポリモーフィズム（多態性）は、オブジェクト指向プログラミングの主要な概念の一つです。これは、異なるクラスが共通のインターフェースや基本クラスを介して同じメソッドを提供できることを意味します。TypeScriptでは、インターフェースや抽象クラスを使ってポリモーフィズムを実現できます。

## ポリモーフィズムの基本

ポリモーフィズムには二つの主要な形式があります：

1. **コンパイル時ポリモーフィズム**（オーバーロード）
2. **ランタイムポリモーフィズム**（オーバーライド）

この記事では、ランタイムポリモーフィズムに焦点を当てます。

## インターフェースによるポリモーフィズム

インターフェースは、クラスが実装するべきメソッドやプロパティを定義します。

### 例：インターフェースの定義と実装

```typescript
interface Animal {
    makeSound(): void;
}

class Dog implements Animal {
    makeSound(): void {
        console.log("Woof! Woof!");
    }
}

class Cat implements Animal {
    makeSound(): void {
        console.log("Meow! Meow!");
    }
}

function animalSound(animal: Animal) {
    animal.makeSound();
}

const myDog = new Dog();
const myCat = new Cat();

animalSound(myDog); // 出力: Woof! Woof!
animalSound(myCat); // 出力: Meow! Meow!
```

この例では、`Animal` インターフェースを定義し、`Dog` と `Cat` クラスがそれを実装しています。`animalSound` 関数は、`Animal` 型の引数を受け取り、その `makeSound` メソッドを呼び出します。これは、どのような `Animal` であっても適切に動作するため、ポリモーフィズムの例となります。

## 抽象クラスによるポリモーフィズム

次に、抽象クラスを使用してポリモーフィズムを実現する方法を見てみます。抽象クラスは、一部のメソッドが実装されておらず、サブクラスで具体的に実装される必要があります。

### 例：抽象クラスの定義と実装

```typescript
abstract class Shape {
    abstract area(): number;
}

class Circle extends Shape {
    radius: number;

    constructor(radius: number) {
        super();
        this.radius = radius;
    }

    area(): number {
        return Math.PI * this.radius * this.radius;
    }
}

class Rectangle extends Shape {
    width: number;
    height: number;

    constructor(width: number, height: number) {
        super();
        this.width = width;
        this.height = height;
    }

    area(): number {
        return this.width * this.height;
    }
}

function printArea(shape: Shape) {
    console.log(`Area: ${shape.area()}`);
}

const myCircle = new Circle(5);
const myRectangle = new Rectangle(10, 20);

printArea(myCircle); // 出力: Area: 78.53981633974483
printArea(myRectangle); // 出力: Area: 200
```

この例では、`Shape` という抽象クラスを定義し、`Circle` と `Rectangle` クラスがそれを継承しています。各クラスは `area` メソッドを具体的に実装し、`printArea` 関数は `Shape` 型の引数を受け取ってその `area` メソッドを呼び出します。

## ポリモーフィズムの利点

ポリモーフィズムを使用することで、コードの再利用性と柔軟性が向上します。共通のインターフェースや抽象クラスを使用することで、異なるクラス間での一貫性を保ちつつ、具体的な実装をクラスごとにカスタマイズできます。

## まとめ

TypeScriptでのポリモーフィズムは、インターフェースや抽象クラスを使って実現できます。これにより、異なるクラスが共通のメソッドを持ち、一貫した方法で操作できるようになります。
【UE】VRテンプレートでSun and Skyアクターを使うと空が真っ暗になる

## 初めに
地理的に正確な太陽の位置を指定できるようになるSunPositionCalculatorプラグインというものがあります。こちらを使用することで緯度経度と時間に応じた太陽の動きをUnrealEngine上で表現することが可能になるので、陽光のシミュレーションとして使用することができます。このプラグインを有効にするとSun and Skyアクターエンジンに追加されます。具体的なSun and Skyアクターの使い方は[公式ドキュメント](https://dev.epicgames.com/documentation/ja-jp/unreal-engine/sun-and-sky-actor-in-unreal-engine?application_version=5.3)に記載されていますので、こちらでの説明は割愛させていただきます。
さて、こちらのSun and Skyなのですが、Third Personテンプレートで使用する場合には問題ないのですが、VRテンプレートで使用すると空が真っ暗になってしまう現象が発生します。今回はこの問題の修正方法を説明したいと思います。

## 環境情報
Windows 11
UE 5.3.2

## 問題の事象
VRテンプレートでプロジェクトを作成し、SunPositionCalculatorプラグインを有効化します。
Sun and Skyアクターを追加してみても空が真っ暗になってしまいます（ExponentialHeightFogとVolumetricCloudも追加しています）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/30e5c9be-0de9-b5f9-8cde-98ad4f4e9553.png)

## 修正方法①
Project SettingsのEngine→Rendering設定内のForward Shadingがデフォルトでチェック状態になっているので、ここのチェックを外します。
エンジンの再起動を求められるので再起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/13ec2446-43be-f80a-b028-8bc64789bfe6.png)

プロジェクトが開くと無事に空が表現されるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/58c3137d-4587-150d-690e-ac91edb646d2.png)

## 修正方法②
Forward Shadingを有効なまま修正にする方法です。

①Simulation Blankプロジェクトを作成します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/d9b40e85-5ca1-cd4a-eed7-1ac85ede32bb.png)

②SkySphere_Equirectangular関連のものをMigrateする
Simulation Blankプロジェクトを開くとレベル上にいくつかオブジェクトが配置されています。
Outliner上にあるStarSkySphereに割り当てられているSkySphere_EquirectangularをVRテンプレートのContentフォルダにMigrateします（関連するもの全てMigrateします）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/3283c321-695c-3e1b-349f-0214ed523237.png)

③VRテンプレートのレベル上にStatic Mesh Actorを追加する
今回はSphereを追加しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/e398d99b-3d83-e16e-3102-ffeace190644.png)

④Static Mesh Actorにメッシュなどの設定を行う
・Scale：4000000などの大きな値
・Static Mesh：SkySphere_Equirectangular
・Materials：MI_StarSkySphere

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/a94a28fe-7b80-c227-a7fa-d3032d21bca5.png)

こちらの設定で空が表現されるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/219c1e3f-7676-905d-3829-bfbddbe7dddc.png)

ちなみにProject Settings→Engine→Rendering→Support Sky Atmosphere Affecting Height Fogにチェックを入れることで地表部分が真っ暗になってしまっている部分を青色にすることができます。
こちらもチェックを入れた後にプロジェクトを再起動する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/8fddc32a-cd45-f3de-8366-df582af87d8f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498810/810a30b5-e9ac-0b2c-0ac9-bddcadc0e9a5.png)
Xcodeのシュミレーターを削除する

## Xcodeのシュミレーターを削除する

<br>

ターミナルコマンドで削除するのがベストだと思いますが、それぞれの方法を調べてみたのでまとめて書いてます。

<br>


### 1.ディスクユーリティから確認する
Xcodeのシュミレーターを削除する時にいくつか方法があってMacのディスクユーリティでも表示・削除できるのではと思ったので確認してみました。

![DiskUtilisationP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/aec9a5ba-d17b-fd71-da7b-1d237f2fcdfd.png)
左側に各iOSバージョンが表示されてます。

<br>

![diskUtilisationP2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/690ce73e-4700-6d1f-7636-067472381fdf.png)
よく詳しくみてみるとiOS 17.0.1 21A342 Simulatorだけで『17.12GB』もあります。
でかすぎる…。

<br>





そこでディスクユーリティで削除したらどうなるかをWrth.(リートン)を使って聞いてみました。
![simulator1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/23aa5220-2ffa-a79b-37ee-2205562b1cad.png)


![simulator2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/a4262908-6f6d-31ed-335b-c9320e5bd314.png)
まとめるとXcode上から削除することができるのでそこで消した方が良さそうですね。


<br>


### 2.Xcodeからシュミレーターの削除を行う

Xcodeを開きます。

![xcode1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/f935b83c-4a3a-ca09-0333-12407f0a8f6d.png)
Xcodeの上部メニューからWindowを選択→『Devices and Simulators』を選択して下さい。

<br>


![SimulatorsP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/6a62a347-b930-d6bf-5642-649e698609e4.png)
画面が開いたら『Simulators』を選択して下さい。
左画面を見るとiPhone15だけでも4つのSimulatorが表示されています。
Mac内にあるiOS17.2〜iOS17.5までの各iPhoneSimulatorです。
ここでも右クリックから『Delete』で削除できるのですが、それぞれのiPhoneを一つひとつ消さなければならないのがめんどくさいです。

<br>



![Simulator3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/b07ca5c7-2f3a-f0e7-517f-cdb92e3b62c6.png)

さらに削除したらかといっても、Xcodeのメニュー→『Settings...』→『Platforms』を見ると全て削除できているわけではありません。

<br>


### 3.ターミナルコマンドから確認と削除を行う

ターミナルでMac内にどのシュミレーターがあるのか確認します。

```shell.command
xcrun simctl list
```

<br>



![commandP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/4ed3c9aa-f809-7ba8-a6f6-86dd06dfbc80.png)
コマンドでもどのようなiOSやデバイスがあるか表示されてわかります。

ここで**unavailable**と表示されているのは使用不可となっているので使用できないシュミレーターのデータがある場合は削除した方が良いそうです。
自分の場合は細かくコマンド削除していてその表記はありませんでした。

<br>

削除したい場合はこのコマンド入力をして下さい。
```shell.command
xcrun simctl delete unavailable
```
これで削除できます。
削除するのがない場合は特に変わりないです。

調べてみると使用不可のシュミレーターがあれば削除しても良いけど、そうでない場合は残しておいた方が良いですね。
それにしてもシュミレーターの使用ストレージがデカすぎると思います。

<br>




### 参考

https://qiita.com/suga_slj/items/a26bc53785f1a8881431


https://qiita.com/MTattin/items/9d9ae9bce05e7bec1b61


https://stackoverflow.com/questions/10834817/xcode-simulator-how-to-remove-older-unneeded-devices
Ruby(Rails)で使える省略記法

# Ruby on Railsで使える省略記法

RubyやRailsのコーディングをする際、省略記法を使うとコードが簡潔になり、読みやすさが向上します。特にリファクタリング時やシンプルな処理を記述する際に役立ちます。

### if/unless文を1行で書く方法（後置if）

通常のif文やunless文は複数行にわたることが多いですが、簡単な条件、処理であれば1行で書くことができます。

**通常のif文:**
```ruby
point = 7
day = 2
if day == 2
  point += 10
end
point # => 17
```
**1行のif文:**
```ruby
point = 7
day = 2
point += 10 if day == 2
point # => 17
```
### 三項演算子（条件演算子）

三項演算子を使うと、シンプルな条件分岐を1行で書くことができます。基本的な構文は次の通りです。

```ruby
result = condition ? true_value : false_value
```
**例:**
```ruby
n = 11
message = n > 10 ? ? '10より大きい' : '10以下'
message # => "10より大きい"
```

### エンドレスメソッド定義

Ruby 3.0から導入されたエンドレスメソッド定義を使うと、シンプルなメソッドを1行で定義することができます。

**通常のメソッド定義:**

```ruby
def greeting(name)
  puts "こんにちは、#{name} さん！"
end
greeting('太郎') # => "こんにちは、太郎さん！" 
```

**エンドレスメソッド定義:**

```ruby
def greeting(name) = puts "こんにちは、#{name} さん！"
greeting('太郎') # => "こんにちは、太郎さん！" 
```

このように、エンドレスメソッド定義を使うことで、メソッドの定義がより簡潔になります。ただし、Rubyのバージョンによってはこの機能がサポートされていない場合がありますので、使用する際には注意が必要です。

## 
現在学習中なので随時、新しい省略記法やテクニックを学んで追加していきます！
Dockerで構築したGitLabのアップグレード方法

# はじめに

Dockerコンテナで構築したGitLabのアップグレードを行う機会があり、実施したことをまとめます。

15.6.2から17.0.1にアップグレードします。

# 念のためバックアップ取得

`gitlab` という名前のコンテナが稼働しているとします。

```sh
docker exec -t gitlab gitlab-backup create
```

```
2024-04-04 01:17:08 +0000 -- Dumping main_database ... 
Dumping PostgreSQL database gitlabhq_production ... [DONE]
2024-04-04 01:17:18 +0000 -- Dumping main_database ... done
2024-04-04 01:17:18 +0000 -- Dumping ci_database ... [DISABLED]
2024-04-04 01:17:18 +0000 -- Dumping repositories ... 
・・・・
2024-04-04 01:17:22 +0000 -- Backup 1712193428_2024_04_04_15.6.2-ee is done.
2024-04-04 01:17:22 +0000 -- Deleting backup and restore lock file
```

コンテナ内の`/var/opt/gitlab/backups/1712193428_2024_04_04_15.6.2-ee_gitlab_backup.tar`にファイルが作成される。

# アップグレードパスを確認

以下のサイトで、アップグレードパスを確認します。

https://gitlab-com.gitlab.io/support/toolbox/upgrade-path/

今回は以下の順で更新を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2518403/3e24f9eb-0d40-21d6-14ea-9bc364dcb097.png)

# アップグレード手順

アップグレードパスに表示されているバージョンのイメージをダウンロードしておきます。

```
docker pull gitlab/gitlab-ee:15.11.13-ee.0
docker pull gitlab/gitlab-ee:16.1.6-ee.0
docker pull gitlab/gitlab-ee:16.3.7-ee.0
docker pull gitlab/gitlab-ee:16.7.7-ee.0
docker pull gitlab/gitlab-ee:16.11.3-ee.0
docker pull gitlab/gitlab-ee:17.0.1-ee.0
```

次に、稼働中のGitLabコンテナをダウンさせ、`compose.yaml` のイメージタグ名を`15.11.13-ee.0`に書き換えて、コンテナをupする。

処理が走るので、ログを確認しながら落ち着くのを待つ。

これを、`15.11.13-ee.0` --> `16.1.6-ee.0` --> `16.3.7-ee.0` --> `16.7.7-ee.0` --> `16.11.3-ee.0` --> `17.0.1-ee.0` の順に繰り返す。

問題なくアップグレードされれば完了。
初心者にオススメのSQL学習法「SQL Bolt」＆おすすめ書籍

最近、SQLを使う仕事を行う機会がありました。しかし今までRailsやLaravelといったフレームワークを主に使っていたため、SQLはたまに触るくらいでほとんど経験がありませんでした。**フレームワークを使えばSQLの知識がなくても、ある程度は開発できていたのですが勉強不足**でとても困りました。

同じようにプログラミング初心者で、SQL学習を後回しにしてしまっている方も結構多いのではないでしょうか？ウェブ開発のような派手さはないので、学習を後回しにしてしまいがちですよね。

しかしウェブ開発とデータベースは切っても切れない関係なので、**遅かれ早かれSQLを学ぶことが必要**になってくると思います。今回はプログラミング初心者におすすめのSQL学習法についてご紹介したいと思います！

## 初心者におすすめのSQL学習法
初心者さんにおすすめするSQL学習法は[『SQL Bolt』](https://sqlbolt.com/lesson/select_queries_introduction)というサイトで、**ひたすらSQL文を打ちまくる**という方法です。これを**何周もうんざりするほど周回**することで、いつの間にかSQLがすらすらと入力できるようになっていきます。

### 「SQL Bolt」ってどんなサイト？
SQL Boltは**完全無料かつ登録不要**で、SQL文を打ち込みながら学べる海外の学習サイトです。問題形式で事前にデータが挿入されており、入力したSQL文は即実行されて結果が確認できます。そのためサイトにアクセスすれば、すぐに学習を始めることができます。

### 学習の注意点
SQL Boltは海外サイトのため、**全文英語**となっています。そこまで複雑な英語ではありませんが、英語に自信がないという方もいると思います。そこで、以下に日本語訳をまとめます。英語に自信のない方は、参考にしてください。

[>> SQL Boltの日本語訳はコチラ！](https://taishi-official.com/2022/04/19/863/#toc4)

## SQL学習におすすめの書籍
![3-recommended-books-for-learning-SQL.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3784196/0ad63c27-772f-a276-5565-9f018980043f.jpeg)

SQLは良書も多く、書籍で学習するのもおすすめです。以下に、初級者・中級者におすすめの書籍をご紹介していきたいと思います。

### 初級者におすすめの書籍
上記で紹介したSQL Boltでも難しいという方におすすめの書籍が、<strong>「スッキリわかるSQL入門」</strong>という書籍です。こちらは全くSQLがわかりませんという方が、初歩的なことからわかりやすく解説されています。こちらで基礎部分を固めてから、SQL Boltを周回するのが良いかと思います。

[>> SQL初級者おすすめ書籍「スッキリわかるSQL入門」](https://taishi-official.com/2022/04/19/863/#toc24)

### 中級者におすすめの書籍
次はSQL Boltがすらすら入力できるようになって、もうワンランク上を目指している方におすすめなのが**達人に学ぶシリーズの2冊**です。<strong>「達人に学ぶSQL徹底指南書」</strong>は実際の開発で使われるようなより良いSQLの書き方が多数紹介されていて、脱初級者を目指す方にはうってつけの書籍です。<strong>「達人に学ぶDB設計徹底指南書」</strong>はDBの設計段階からの考え方が解説されており、設計・開発をより深く知りたい方におすすめです。

[>> SQL中級者おすすめ書籍「達人に学ぶSQL徹底指南書」＆「達人に学ぶDB設計徹底指南書」](https://taishi-official.com/2022/04/19/863/#toc25)

## まとめ
SQLのおすすめ学習方法と書籍についてまとめました。データベースはどんなアプリケーションでも使われているため、いつかは必ず必要になってくる技術です。学習した内容を身に着けるのに、今回ご紹介したような<strong>[『SQL Bolt』](https://sqlbolt.com/lesson/select_queries_introduction)でひたすらSQLを打ちまくること</strong>がおすすめなのでぜひ試してみてください:bangbang:


<br>

＼本記事の内容をより詳しく知りたい方はこちらもチェック！／

https://taishi-official.com/2022/04/19/863/

### おまけ

https://qiita.com/taishi_will_be/items/70a8ce8938944286b487

[>> プログラミング未経験からエンジニアになるための3STEP学習法](https://taishi-official.com/learning-programming/)

<br>

<strong>＼Follow me／</strong>

- X（旧Twitter）：https://x.com/taishi_it_blog
- Instagram：https://www.instagram.com/taishi_will_be/
- YouTube：https://www.youtube.com/@Engineer_ILLBE
- TikTok：https://www.tiktok.com/@taishi_will_be
- note：https://note.com/taishi_wii_be/

<br>

最後に良かったら「いいね」お願いします:thumbsup:
python埋め込み版でMINGWを使ってCythonを使いたい

埋め込み版ではpython.hとdistutils.cfg書き込む場所が見つからない
# 動機
[埋め込み版python3.10.8](https://www.python.org/ftp/python/3.10.8/python-3.10.8-embed-amd64.zip "python3.10.8 Windows embedding package (64-bit)")でcythonを使うのに手間取ったのでメモ書き程度に記す。~~埋め込み版を使わなきゃいい話である~~
# 環境
MinGWのpathの設定は終わっている
ディレクトリ構造は以下のとうり
 current/
　└ python/
　 　├ Lib/
　 　├ Scripts/
　 　│  └ site-packages/
　 　│     └ setuptools/
　 　│        └ _distutils/
　 　└ get-pip.py

currentを作業ディレクトリとする
# 困ったこと

## 1\. includeファイルがない

#### 解決法

同バージョンの普通の [python](https://www.python.org/ftp/python/3.10.8/python-3.10.8-amd64.exe "python3.10.8 Windows installer (64-bit)") をダウンロードしてから include ディレクトリをcurrent\\python\\下にコピペする

~~ここで埋め込み版を使うのをあきらめればすべて解決する~~

:::note alert
異なるバージョンからコピペしてはいけない
 cythonize した関数の実行時に不自然なエラーが出続けたりする
:::

## 2\. ディレクトリがない

https://wiki.python.org/moin/WindowsCompilers#GCC_-_MinGW-w64_.28x86.2C_x64.29

上記のリンクを見たがdistutilsディレクトリは埋め込み版にはないのだ

### 解決法

current\\python\\Lib\\distutils ではなく current\\python\\Lib\\site-packages\\setuptools\\_distutils\\ のディレクトリ下にdistutils.cfgを作成して以下のように書き込む : 
 ```distutils.cfg
[build]
compiler=mingw32

[build_ext]
compiler=mingw32
```
<!-- 
# 埋め込み版を使うメリット
一応フォローする
pyhonのディレクトリを移動した後にget-pip.pyを実行し複雑なパスを設定しなおせば問題なく使えるため移植しやすい。以下は移植後の設定用バッチファイルであるcurrent//下において権限付きで実行する:
 ```bat:transplantation.bat
cd %~dp0
@echo "%cd% is equivalent to your curreent directory? If not,terminate it immediately"
@pause
SETX /M PATH "%PATH%;%cd%\mingw64\bin;%cd%\python\Scripts;%cd%\python"
.\python\python.exe .\python\get-pip.py
```

:::note warn
PATHが登録されてない!
cmdのPATHはcmdを開く前に決まってる。
だから新しく開きなおしたcmdではちゃんと変更されているはずである。
:::

:::note alert
%PATH%;を絶対に忘れるな!
setxは上書きするコマンドなので使い方によってはパスがすべて消えたりするので扱いには注意。
:::
-->
FreeBSD14.0 セットアップ

だいぶほったらかしてしまったVPSのサーバのOSを入れ直したのでメモ。

# 前提
* 使用VPS： さくらのVPS
* 前に使用していたOS： FreeBSD11
* 動かす予定のソフトウェア等（最低限はこれら）
    * sshd
    * bind9
    * postfix
    * procmail
    * dovecot
    * emacs
    * mew

# OSクリーンインストール

諸事情でバックアップは未取得。
（というかバックアップ先のサーバが壊れて撤去されていた涙）

さくらVPSではFreeBSDのISOは用意されなくなってた（たしか以前はされてたはず）ので、
公式からISOをダウンロードしてきてセットアップする。
手順は [ISOイメージインストール概要](https://manual.sakura.ad.jp/vps/os-reinstall/iso-install.html?_gl=1*9an1r2*_gcl_au*MTE1MTc1MTQ4NC4xNzE1OTI3MjAy)


## ファイルシステム

FreeBSD14 は zfs が標準になったようだ。（安定度は不明）
さほどクリティカルな用途で使っていないので、デフォルトのまま使用する。

## パーティション

*Auto (ZFS)* で今回は設定

## ネットワーク設定

今回はVPSのIPv4アドレス（1個）で設定。（IPv6未使用）

## Timezone

*Asia* >> *Japan* で設定

## System Configuration

最低限 *sshd* さえ動けば、後でどうにでもなるのでデフォルトのままで進む。

## System Hardining

あとでも変更可能なのでデフォルトのまま進む。

## Final Configuration

*Exit* で終わる。

# 続きはあとの記事で
Javaの主要な繰り返し文

# Javaの繰り返し文まとめ

Javaには、繰り返し処理を行うための構文がいくつかあります。この記事では、主要な繰り返し文である`for`文、拡張`for`文（`foreach`文）、`while`文、および`do-while`文について
個人的なメモとして残します。

## 1. `for`文
`for`文は、初期化、条件判定、更新処理を1行で書ける繰り返し文です。最も一般的に使用されます。

### 基本構文
```java
for (初期化; 条件; 更新) {
    // 繰り返し処理
}
```

### 使用例
以下の例では、1から5までの数字を出力します。
```java
for (int i = 1; i <= 5; i++) {
    System.out.println(i);  
}
```

## 2. 拡張`for`文（`foreach`文）
拡張`for`文は、配列やコレクションの要素を簡単に繰り返し処理するために使用されます。

### 基本構文
```java
for (型 変数名 : 配列やコレクション) {
    // 繰り返し処理
}
```

### 使用例
以下の例では、配列の要素を出力します。
```java
int[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
    System.out.println(number);  
}
```

## 3. `while`文
`while`文は、条件が真である間、繰り返し処理を実行します。

### 基本構文
```java
while (条件) {
    // 繰り返し処理
}
```

### 使用例
以下の例では、1から5までの数字を出力します。
```java
int i = 1;  
while (i <= 5) {
    System.out.println(i);  
    i++;  
}
```

## 4. `do-while`文
`do-while`文は、少なくとも一度は繰り返し処理を実行し、その後に条件を判定します。

### 基本構文
```java
do {
    // 繰り返し処理
} while (条件);
```

### 使用例
以下の例では、1から5までの数字を出力します。
```java
int i = 1;  
do {
    System.out.println(i);  
    i++;  
} while (i <= 5);
```
【会社チーム内もくもく会】基礎に立ちかえる！BEM編

デザイン、コンテンツ、ライティング、コーディングがほぼ同時並行で走るという案件にて、
htmlやscssが頻繁に書き換わるという事案が発生していました。

そんな中、そもそものclass名の名付け方これであってるんだろうか。という疑問が湧き上がり、基礎の基礎に立ちかえることとしました。
個人開発で勉強していたので、「誰が見てもわかりやすい・理解しやすい」というコードをもっとめざして行きたいです。

# そもそもBEMとは
**Block Element Modifierの略。**

・`Block` ：大枠となる独立した要素
・`Element`：`Block`の中の要素
・`Modifier`：`Block`や`Element`スタイル

このような構成で、わかりやすくcssを設計するために作られた命名規則。
一番ポピュラーな命名規則だと思われます。


# 書き方
```
class="block__element–-modifier"
```
このように、アンダースコア・ハイフンを**2文字**ずつ使う。
複数単語が発生する場合は、ハイフン**１つで区切る。**

どんな単語を使っていいかわからない場合は、[こんなサイト](https://codic.jp/engine)もあるので日本語で調べてみるのもよし。

[こちらの記事](https://qiita.com/takahirocook/items/01fd723b934e3b38cbbc#%E3%82%AF%E3%83%A9%E3%82%B9%E5%91%BD%E5%90%8D%E3%81%A7%E3%82%88%E3%81%8F%E4%BD%BF%E3%82%8F%E3%82%8C%E3%82%8B%E5%8D%98%E8%AA%9E)を参考に書いていますので、頻出の単語はここで調べる方が良さそう！
とてもよくまとまっており、私の記事を見るより全然オススメします。

個人的には、`inner`,`outer`,`wrapper`,`container`の扱いが微妙なところがあり、意識できていません...
あまり階層を深くしすぎないhtmlを書けるといいなと感じました！
html設計も勉強したい。
globalThis【JavaScript】

# はじめに

https://qiita.com/kohki_takatama/items/5f1c6f75e6bbf6553682

前回の記事では、ホスト環境によってglobal objectの名称と挙動が違うことを書きました。
- Node.js：`global`
- ブラウザ：`window`

（この他にもホスト環境は存在します）

この記事にコメントを頂いたのですが、どうやら`globalThis`という共通の名称が使用できるようです。

名称は同じ。では挙動はどうでしょうか。検証してみます。

# ブラウザ：`window`

前回の記事で確認した、いずれの点も`window`と同じ挙動でした。

- `const`を使用した変数宣言は、`window.name`ではアクセスできない
→`globalThis.name`も同様
- `var`を使用した変数宣言は、`window.name`でアクセスできる
→`globalThis.name`も同様
- `console.log`と`window.console.log`は完全に等しい
→`globalThis.console.log`も同様
- 関数宣言`function`を使用した場合、`window.name()`でアクセスできる
→`globalThis.name()`も同様
- 関数式の場合は、変数と同じく`const`ではアクセスできず、`var`ならアクセスできる
→`globalThis`も同様

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="rNgegLZ" data-pen-title="Qiita_global_window" data-user="Kohki-Takatama" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/Kohki-Takatama/pen/rNgegLZ">
  Qiita_global_window</a> by Kohki_Takatama (<a href="https://codepen.io/Kohki-Takatama">@Kohki-Takatama</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

`globalThis === window`が`true`なので当然ですね。
![スクリーンショット 2024-05-22 13.55.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457770/c0fe4595-eb00-8c0e-623e-8db1fef71989.png)

# Node.js：`global`

```js
console.log(global === globalThis) //true
```
なので検証の必要はないと思いますが、念の為

```js
var hoge = "hoge"
console.log(globalThis.hoge) //undefined
const fuga = "fuga"
console.log(globalThis.fuga) //undefined
```

```js
// 先程の続き
globalThis.hoge = hoge
global.fuga = fuga
console.log(global.hoge) // "hoge"
console.log(globalThis.fuga) // "fuga"
```

`global`と全く同じですね。
# 結論

- `globalThis`は各ホスト環境のglobal objectと等しい
- ブラウザの`globalThis`（`window`）とNode.jsの`globalThis`（`global`）は、同じ名称だけど挙動は違う
【Python】Herokuでseleniumを動かしてスクレイピングをする

## はじめに
Herokuでスクレイピングを行う際、これまでは2つのビルドパックが必要とされていました。

https://codelabsjp.net/heroku-selenium/

https://zenn.dev/eito_blog/articles/7b9c489ebe75c8#%E3%82%B9%E3%82%AF%E3%83%AC%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0%EF%BC%88selenium%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B%EF%BC%89%E7%94%A8%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4

しかし、この方法は現在非推奨となっており、警告が表示されるようになっています。

この変更の背景については、Herokuの公式ブログで詳しく説明されています。

https://blog.heroku.com/improved-browser-testing-on-heroku-with-chrome

そこで今回は、最新のスクレイピング手法について紹介します。

## 最新のスクレイピング手法

新しいスクレイピング方法では、必要なビルドパックは1つだけです。

https://github.com/heroku/heroku-buildpack-chrome-for-testing

このビルドパックを使用することで、より簡潔にスクレイピングを実装できます。ビルドパックの追加は、以下のコマンドで行えます。

```
heroku create --buildpack https://github.com/heroku/heroku-buildpack-google-chrome.git
```

ビルドパックが1つになったことで、ChromeとChromeDriverのバージョン不一致によるエラーを防ぐことができるようになりました。

バージョン不一致の問題は、スクレイピングの実装において頻繁に発生する課題の1つなので、この問題が解消されたことで、より安定したスクレイピングが可能になりました。


## 最後に
Herokuでよりシンプルにスクレイピングをすることが可能になりました。
興味がある人は是非試してみてください。
Next.js 14 App Router テンプレート 手順書

Next.jsでプロジェクト開始時によく行うセットアップを手順書兼備忘録としてまとめます

### プロジェクト作成
`bunx create-next-app@latest`

```zsh:zsh
bunx create-next-app@latest {プロジェクト名}
✔ Would you like to use TypeScript? … Yes
✔ Would you like to use ESLint? … No
✔ Would you like to use Tailwind CSS? … Yes
✔ Would you like to use `src/` directory? … Yes
✔ Would you like to use App Router? (recommended) … Yes
✔ Would you like to customize the default import alias (@/*)? … Yes
✔ What import alias would you like configured? … @/*
```

### Biomeセットアップ

インストール
```zsh:zsh
bun add --dev --exact @biomejs/biome
```
初期化
```zsh:zsh
bunx @biomejs/biome init
```
`biome.json`書き換え
```json:biome.json
{
  "$schema": "https://biomejs.dev/schemas/1.8.3/schema.json",
  "files": {
    "ignore": ["node_modules", "public", ".next"]
  },
  "organizeImports": {
    "enabled": true
  },
  "linter": {
    "enabled": true,
    "rules": {
      "recommended": true,
      "correctness": {
        "useHookAtTopLevel": "error"
      }
    }
  },
  "formatter": {
    "enabled": true,
    "formatWithErrors": false,
    "indentStyle": "space",
    "indentWidth": 2,
    "lineWidth": 80,
    "lineEnding": "lf",
    "ignore": []
  }
}
```

### フォーマッター設定

```zsh:zsh
mkdir .vscode && touch .vscode/settings.json
```

```json:settings.json
{
  "[javascript]": {
    "editor.defaultFormatter": "biomejs.biome",
    "editor.formatOnSave": true,
    "editor.codeActionsOnSave": {
      "source.organizeImports.biome": "always"
    }
  },
  "[typescript]": {
    "editor.defaultFormatter": "biomejs.biome",
    "editor.formatOnSave": true,
    "editor.codeActionsOnSave": {
      "source.organizeImports.biome": "always"
    }
  },
  "[typescriptreact]": {
    "editor.defaultFormatter": "biomejs.biome",
    "editor.formatOnSave": true,
    "editor.codeActionsOnSave": {
      "source.organizeImports.biome": "always"
    }
  },
  "typescript.preferences.importModuleSpecifier": "non-relative",
  "editor.tabSize": 2
}
```

### `npm scripts`修正(scriptsのみ抜粋)
```json:packeage.json
"scripts": {
  "dev": "next dev --turbo",
  "build": "next build",
  "start": "next start",
  "check": "biome check ./src/",
  "check:fix": "biome check --write ./src/"
}
```

### `tsconfig.json`編集して絶対パス設定
```zsh:tsconfig.json
{
  "compilerOptions": {
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": true,
    "skipLibCheck": true,
    "strict": true,
    "noEmit": true,
    "esModuleInterop": true,
    "module": "esnext",
    "moduleResolution": "bundler",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "preserve",
    "incremental": true,
    "plugins": [
      {
        "name": "next",
        "@/*": ["./src/*"]
      }
    ],
    "paths": {
      "@/*": ["./src/*"]
    }
  },
  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
  "exclude": ["node_modules"]
}

```

### shadcn/uiセットアップ

```zsh:zsh
bunx --bun shadcn-ui@latest init
Which style would you like to use? › Default
Which color would you like to use as base color? › Zinc
Do you want to use CSS variables for colors? › yes
```

### 終わり
簡単に管理できる方法や他に取り入れてるものがあればぜひご教授ください！
主要Gitコマンド まとめ


# Git コマンド解説

## 初期設定

1. **git config**
   - Gitの設定を行う。ユーザー名やメールアドレスを設定する。
   ```bash
   git config --global user.name "Your Name"
   git config --global user.email "youremail@example.com"
   ```

## リポジトリ操作

2. **git init**
   - 新しいGitリポジトリを初期化する。これにより、指定されたディレクトリがGitリポジトリになる。
   ```bash
   git init
   ```

3. **git clone**
   - 既存のリポジトリをクローン（コピー）する。通常はリモートリポジトリからローカルマシンにコピーする際に使用する。
   ```bash
   git clone https://github.com/user/repository.git
   ```

## ファイル操作

4. **git add**
   - ファイルをステージングエリアに追加する。次のコミットに含める変更を指定する。
   ```bash
   git add <file>       # 特定のファイルを追加
   git add .            # 全ての変更を追加
   ```

5. **git commit**
   - ステージングエリアの変更をリポジトリにコミット（保存）する。メッセージを付けて変更内容を記録する。
   ```bash
   git commit -m "Commit message"
   ```

## ブランチ操作

6. **git branch**
   - ブランチを管理する。新しいブランチの作成や、現在のブランチの確認ができる。
   ```bash
   git branch          # 現在のブランチ一覧を表示
   git branch <branch> # 新しいブランチを作成
   ```

7. **git checkout**
   - ブランチを切り替える。また、新しいブランチを作成して切り替えることもできる。
   ```bash
   git checkout <branch>         # 既存のブランチに切り替え
   git checkout -b <new-branch>  # 新しいブランチを作成して切り替え
   ```

8. **git merge**
   - ブランチをマージ（統合）する。現在のブランチに、指定したブランチの変更を統合する。
   ```bash
   git merge <branch>
   ```

## リモートリポジトリ操作

9. **git remote**
   - リモートリポジトリの管理を行う。リポジトリの追加や削除、一覧表示ができる。
   ```bash
   git remote add origin https://github.com/user/repository.git
   git remote -v    # リモートリポジトリの一覧を表示
   ```

10. **git fetch**
    - リモートリポジトリから最新のコミットを取得するが、ローカルのブランチには反映しない。
    ```bash
    git fetch origin
    ```

11. **git pull**
    - リモートリポジトリから最新のコミットを取得し、ローカルブランチにマージする。
    ```bash
    git pull origin <branch>
    ```

12. **git push**
    - ローカルのコミットをリモートリポジトリにプッシュ（送信）する。
    ```bash
    git push origin <branch>
    ```

## 状態確認

13. **git status**
    - 作業ディレクトリの状態を表示する。ステージングされているファイルや、変更されたファイル、追跡されていないファイルを確認できる。
    ```bash
    git status
    ```

14. **git log**
    - リポジトリのコミット履歴を表示する。詳細なオプションで特定の情報を取得することも可能である。
    ```bash
    git log
    git log --oneline   # 一行で簡潔に表示
    ```

## その他の便利なコマンド

15. **git diff**
    - 変更点を表示する。ステージングエリアと作業ディレクトリの差分や、特定のコミット間の差分を確認できる。
    ```bash
    git diff
    git diff <commit1> <commit2>   # 二つのコミット間の差分を表示
    ```

16. **git reset**
    - コミットやステージングエリアの変更を取り消す。慎重に使用する必要がある。
    ```bash
    git reset <commit>   # 指定したコミットにリセット
    git reset --hard     # 変更を完全に取り消す
    ```
Django Sumの集計結果がNoneだった場合に0にする

# DjangoでSumの集計結果がNoneだった場合に0にするやり方

以下のコードを書いてたときにpointがNoneになるとその後の計算が出来なくなる

```
point = ThanksCard.objects.filter(f_delete=False, thankseval_id=thankseval_id,from_staff_id=select_user_id).aggregate(Sum('point'))
```

なのでCoalesceを使えとのこと

```
point = ThanksCard.objects.filter(f_delete=False, thankseval_id=thankseval_id,from_staff_id=select_user_id).aggregate(Coalesce(Sum('point'),0))
```

無事0になりました。